pax_global_header00006660000000000000000000000064134325775200014522gustar00rootroot0000000000000052 comment=07f9b8188e09ba38359068ec29610bbae05ecade python-nbxmpp-nbxmpp-0.6.10/000077500000000000000000000000001343257752000157335ustar00rootroot00000000000000python-nbxmpp-nbxmpp-0.6.10/.gitignore000066400000000000000000000000521343257752000177200ustar00rootroot00000000000000build/ __pycache__/ dist/ nbxmpp.egg-info/python-nbxmpp-nbxmpp-0.6.10/.gitlab-ci.yml000066400000000000000000000010061343257752000203640ustar00rootroot00000000000000before_script: - sudo apt-get update -qq && sudo apt-get build-dep -y -qq python3-nbxmpp-nightly stages: - test - build run-test: stage: test script: - ./test/runtests.py run-build: stage: build script: - rm -rf dist - export FN="nbxmpp-"$(date +%F) - python3 setup.py sdist - scp dist/nbxmpp-*.tar.gz panoramix:/var/www/gajim/downloads/snap/ci/$FN-$CI_COMMIT_SHA.tar.gz artifacts: name: "nbxmpp-$CI_COMMIT_SHA" expire_in: 1 week paths: - dist/nbxmpp-*.tar.gz python-nbxmpp-nbxmpp-0.6.10/.pylintrc000066400000000000000000000312071343257752000176030ustar00rootroot00000000000000[MASTER] # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code extension-pkg-whitelist=pycurl # Add files or directories to the blacklist. They should be base names, not # paths. ignore=CVS # Add files or directories matching the regex patterns to the blacklist. The # regex matches against base names, not paths. ignore-patterns= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Use multiple processes to speed up Pylint. jobs=2 # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= # Pickle collected data for later comparisons. persistent=yes # Specify a configuration file. #rcfile= # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED confidence= # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once).You can also use "--disable=all" to # disable everything first and then reenable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" disable=C0111,C0301,R1710,R0912,R0914,R0915,W0511,W0231,W0233 # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time (only on the command line, not in the configuration file where # it should appear only once). See also the "--disable" option for examples. enable= [REPORTS] # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (RP0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details #msg-template= # Set the output format. Available formats are text, parseable, colorized, json # and msvs (visual studio).You can also give a reporter class, eg # mypackage.mymodule.MyReporterClass. output-format=text # Tells whether to display a full report or only the messages reports=no # Activate the evaluation score. score=yes [REFACTORING] # Maximum number of nested blocks for function / method body max-nested-blocks=5 [VARIABLES] # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins=_ # Tells whether unused global variables should be treated as a violation. allow-global-unused-variables=yes # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_,_cb # A regular expression matching the name of dummy variables (i.e. expectedly # not used). dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy # Argument names that match this expression will be ignored. Default to name # with leading underscore ignored-argument-names=(_.*|kwargs|args) # Tells whether we should check for unused import in __init__ files. init-import=no # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six.moves,future.builtins [TYPECHECK] # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. contextmanager-decorators=contextlib.contextmanager # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. ignored-classes=optparse.Values,thread._local,_thread._local # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. ignored-modules= # Show a hint with possible names when a member name was not found. The aspect # of finding the hint is based on edit distance. missing-member-hint=yes # The minimum edit distance a name should have in order to be considered a # similar match for a missing member name. missing-member-hint-distance=1 # The total number of similar names that should be taken in consideration when # showing a hint for a missing member. missing-member-max-choices=1 [SPELLING] # Spelling dictionary name. Available dictionaries: none. To make it working # install python-enchant package. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to indicated private dictionary in # --spelling-private-dict-file option instead of raising a message. spelling-store-unknown-words=no [SIMILARITIES] # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no # Minimum lines number of a similarity. min-similarity-lines=4 [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME,XXX,TODO [LOGGING] # Logging modules to check that the string format arguments are in logging # function parameter format logging-modules=logging [FORMAT] # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # Maximum number of characters on a single line. max-line-length=100 # Maximum number of lines in a module max-module-lines=1000 # List of optional constructs for which whitespace checking is disabled. `dict- # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. # `trailing-comma` allows a space between comma and closing bracket: (a, ). # `empty-line` allows space-only lines. no-space-check=trailing-comma,dict-separator # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=no [BASIC] # Naming hint for argument names argument-name-hint=(([a-z][a-z0-9_]{1,30})|(_[a-z0-9_]*))$ # Regular expression matching correct argument names argument-rgx=(([a-z][a-z0-9_]{1,30})|(_[a-z0-9_]*))$ # Naming hint for attribute names attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Regular expression matching correct attribute names attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata # Naming hint for class attribute names class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Regular expression matching correct class attribute names class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Naming hint for class names class-name-hint=[A-Z_][a-zA-Z0-9]+$ # Regular expression matching correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ # Naming hint for constant names const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Regular expression matching correct constant names const-rgx= # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=-1 # Naming hint for function names function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Regular expression matching correct function names function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Good variable names which should always be accepted, separated by a comma good-names=i,j,k,ex,Run,_,iq # Include a hint for the correct naming format with invalid-name include-naming-hint=no # Naming hint for inline iteration names inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ # Regular expression matching correct inline iteration names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Naming hint for method names method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Regular expression matching correct method names method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Naming hint for module names module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression matching correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=^_ # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. property-classes=abc.abstractproperty # Naming hint for variable names variable-name-hint=(([a-z][a-z0-9_]{1,30})|(_[a-z0-9_]*))$ # Regular expression matching correct variable names variable-rgx=(([a-z][a-z0-9_]{1,30})|(_[a-z0-9_]*))$ [IMPORTS] # Analyse import fallback blocks. This can be used to support both Python 2 and # 3 compatible code, which means that the block might have code that exists # only in one or another interpreter, leading to false positives when analysed. analyse-fallback-blocks=no # Deprecated modules which should not be used, separated by a comma deprecated-modules=optparse,tkinter.tix # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled) ext-import-graph= # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled) import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled) int-import-graph= # Force import order to recognize a module as part of the standard # compatibility libraries. known-standard-library= # Force import order to recognize a module as part of a third party library. known-third-party=enchant [DESIGN] # Maximum number of arguments for function / method max-args=10 # Maximum number of attributes for a class (see R0902). max-attributes=9999 # Maximum number of boolean expressions in a if statement max-bool-expr=5 # Maximum number of branch for function / method body max-branches=12 # Maximum number of locals for function / method body max-locals=15 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # Maximum number of return / yield for function / method body max-returns=100 # Maximum number of statements in function / method body max-statements=50 # Minimum number of public methods for a class (see R0903). min-public-methods=0 [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict,_fields,_replace,_source,_make # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to # "Exception" overgeneral-exceptions= python-nbxmpp-nbxmpp-0.6.10/COPYING000066400000000000000000001045131343257752000167720ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . python-nbxmpp-nbxmpp-0.6.10/ChangeLog000066400000000000000000000057361343257752000175200ustar00rootroot00000000000000python-nbxmpp 0.6.10 (19 February 2019) * Add support for domain based name in features for GSSAPI * Fix usage of BOSH * Fix Jingle hash namespace python-nbxmpp 0.6.9 (10 January 2019) * Always bind after SM failed Fixes #64 * Dont try and guess system language python-nbxmpp 0.6.8 (07 October 2018) * Reset SM counter after receiving * Issue event when SM resume fails python-nbxmpp 0.6.7 (19 August 2018) * Raise default TLS version to 1.2 * Remove DIGEST-MD5 from the default auth mechs * Add STANZA RECEIVED Event (Some servers send more than one stanza in one packet) * Add alternative locations to load TLS certs from python-nbxmpp 0.6.6 (20 May 2018) * Record all SSL errors instead of only the first * Pass arguments to plugin/plugout methods * Allow the Roster to be initalized without requesting it from the server python-nbxmpp 0.6.5 (30 April 2018) * Fix BOSH usage (don't set ALPN) * Better handling of certificate files python-nbxmpp 0.6.4 (17 March 2018) * Fix SOCKS5 usage python-nbxmpp 0.6.3 (26 January 2018) * Add ALPN and SNI support for when using DirectTLS * Bugfixes python-nbxmpp 0.6.2 (27 December 2017) * Correctly load client certs * Warn on any error in the certificate chain * Fixed a traceback loop python-nbxmpp 0.6.1 (29 November 2017) * Add new getStanzaIDAttrs method * Fix BOSH connexion * stop using PyOpenSSL for random generator python-nbxmpp 0.6.0 (25 September 2017) * Add new getOriginID/SetOriginID method for Messages * Add new getJid() method for Protocol * getTagAttr() accepts now a namespace argument * Add new `protocol` argument for getTag() * Add new XEP Namespaces python-nbxmpp 0.5.6 (03 June 2017) * Support XEP-0198 Version 1.5.2 * Add new XEP Namespaces python-nbxmpp 0.5.5 (30 January 2017) * Some cleanup * Add some namespaces python-nbxmpp 0.5.4 (04 September 2016) * Fix SCRAM authentication * Fix BOSH connection with UTF-8 messages * Fix smacks implementation * Use uuid in stanza ids python-nbxmpp 0.5.3 (13 July 2015) * Fix receiving long utf8 strings under py3 * Fix issue with pyopenssl 0.15.1 * Fix decoding issues python-nbxmpp 0.5.2 (27 December 2014) * Fix BOSH HTTP requests * Fix handling of binary SASL data for mechanism GSSAPI * Update MAM namespace python-nbxmpp 0.5.1 (04 October 2014) * Fix printing network errors in a non-utf-8 console python-nbxmpp 0.5 (02 July 2014) * support both python2 and python3 * Fix storing server certificate when there is no error python-nbxmpp 0.4 (15 March 2014) * Ability to configure TLS protocol version * Add support for SCRAM-SHA-1-PLUS * Security improvements python-nbxmpp 0.3 (23 December 2013) * Improve security level * Ability to configure cipher list * Store only depth 0 SSL certificate python-nbxmpp 0.2 (26 July 2013) * Add some namespace * do TLS handshake without blocking * store all SSL errors instead of only last one python-nbxmpp 0.1 (05 August 2012) * Initial release python-nbxmpp-nbxmpp-0.6.10/MANIFEST.in000066400000000000000000000001271343257752000174710ustar00rootroot00000000000000include ChangeLog COPYING README recursive-include doc * recursive-include nbxmpp *.py python-nbxmpp-nbxmpp-0.6.10/README000066400000000000000000000007711343257752000166200ustar00rootroot00000000000000 python-nbxmpp http://dev.gajim.org/gajim/python-nbxmpp The goal of this python library is to provide a way for python applications to use Jabber/XMPP networks in a non-blocking way. This library is initialy a fork of xmpppy one, but using non-blocking sockets. Installation Simply run 'python setup.py install' as root Usage You have to 'import nbxmpp' in your program. Then look at examples in the doc folder. 2012-05-08 Yann Leboulanger python-nbxmpp-nbxmpp-0.6.10/README.md000066400000000000000000000015311343257752000172120ustar00rootroot00000000000000## Welcome to python-nbxmpp website python-nbxmpp is a Python library that provides a way for Python applications to use Jabber/XMPP networks in a non-blocking way. This library is initialy a fork of xmpppy one, but using non-blocking sockets. ## Features * Asynchronous * Supports ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1, DIGEST-MD5, PLAIN, and X-MESSENGER-OAUTH2 authentication mechanisms. * Supports connection via proxies * Suppors TLS * Supports [BOSH (XEP-0124)](https://xmpp.org/extensions/xep-0124.html) * Support [Stream Management (XEP-0198)](https://xmpp.org/extensions/xep-0198.html) ## Starting Points * [Downloads](http://dev.gajim.org/gajim/python-nbxmpp/tags) * You can also clone the git repository at http://dev.gajim.org/gajim/python-nbxmpp.git * [Example](http://dev.gajim.org/gajim/python-nbxmpp/tree/master/doc/examples)python-nbxmpp-nbxmpp-0.6.10/doc/000077500000000000000000000000001343257752000165005ustar00rootroot00000000000000python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/000077500000000000000000000000001343257752000201225ustar00rootroot00000000000000python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/api-objects.txt000066400000000000000000003761301343257752000230750ustar00rootroot00000000000000nbxmpp nbxmpp-module.html nbxmpp.isResultNode nbxmpp.protocol-module.html#isResultNode nbxmpp.isErrorNode nbxmpp.protocol-module.html#isErrorNode nbxmpp.ascii_upper nbxmpp.protocol-module.html#ascii_upper nbxmpp.__package__ nbxmpp-module.html#__package__ nbxmpp.auth_nb nbxmpp.auth_nb-module.html nbxmpp.auth_nb.challenge_splitter nbxmpp.auth_nb-module.html#challenge_splitter nbxmpp.auth_nb.HH nbxmpp.auth_nb-module.html#HH nbxmpp.auth_nb.SASL_IN_PROCESS nbxmpp.auth_nb-module.html#SASL_IN_PROCESS nbxmpp.auth_nb.GSS_STATE_WRAP nbxmpp.auth_nb-module.html#GSS_STATE_WRAP nbxmpp.auth_nb.have_kerberos nbxmpp.auth_nb-module.html#have_kerberos nbxmpp.auth_nb.scram_parse nbxmpp.auth_nb-module.html#scram_parse nbxmpp.auth_nb.SASL_FAILURE nbxmpp.auth_nb-module.html#SASL_FAILURE nbxmpp.auth_nb.log nbxmpp.auth_nb-module.html#log nbxmpp.auth_nb.__package__ nbxmpp.auth_nb-module.html#__package__ nbxmpp.auth_nb.C nbxmpp.auth_nb-module.html#C nbxmpp.auth_nb.H nbxmpp.auth_nb-module.html#H nbxmpp.auth_nb.kerberos nbxmpp.auth_nb-module.html#kerberos nbxmpp.auth_nb.SASL_SUCCESS nbxmpp.auth_nb-module.html#SASL_SUCCESS nbxmpp.auth_nb.isResultNode nbxmpp.protocol-module.html#isResultNode nbxmpp.auth_nb.GSS_STATE_STEP nbxmpp.auth_nb-module.html#GSS_STATE_STEP nbxmpp.auth_nb.SASL_UNSUPPORTED nbxmpp.auth_nb-module.html#SASL_UNSUPPORTED nbxmpp.auth_nb.SASL_FAILURE_IN_PROGRESS nbxmpp.auth_nb-module.html#SASL_FAILURE_IN_PROGRESS nbxmpp.bosh nbxmpp.bosh-module.html nbxmpp.bosh.FAKE_DESCRIPTOR nbxmpp.bosh-module.html#FAKE_DESCRIPTOR nbxmpp.bosh.KEY_COUNT nbxmpp.bosh-module.html#KEY_COUNT nbxmpp.bosh.get_rand_number nbxmpp.bosh-module.html#get_rand_number nbxmpp.bosh.bosh_errors nbxmpp.bosh-module.html#bosh_errors nbxmpp.bosh.__package__ nbxmpp.bosh-module.html#__package__ nbxmpp.bosh.log nbxmpp.bosh-module.html#log nbxmpp.bosh.urisplit nbxmpp.transports_nb-module.html#urisplit nbxmpp.c14n nbxmpp.c14n-module.html nbxmpp.c14n.ustr nbxmpp.simplexml-module.html#ustr nbxmpp.c14n.normalise_attr nbxmpp.c14n-module.html#normalise_attr nbxmpp.c14n.normalise_text nbxmpp.c14n-module.html#normalise_text nbxmpp.c14n.c14n nbxmpp.c14n-module.html#c14n nbxmpp.c14n.__package__ nbxmpp.c14n-module.html#__package__ nbxmpp.client_nb nbxmpp.client_nb-module.html nbxmpp.client_nb.log nbxmpp.client_nb-module.html#log nbxmpp.client_nb.__package__ nbxmpp.client_nb-module.html#__package__ nbxmpp.dispatcher_nb nbxmpp.dispatcher_nb-module.html nbxmpp.dispatcher_nb.XML_DECLARATION nbxmpp.dispatcher_nb-module.html#XML_DECLARATION nbxmpp.dispatcher_nb.DEFAULT_TIMEOUT_SECONDS nbxmpp.dispatcher_nb-module.html#DEFAULT_TIMEOUT_SECONDS nbxmpp.dispatcher_nb.log nbxmpp.dispatcher_nb-module.html#log nbxmpp.dispatcher_nb.__package__ nbxmpp.dispatcher_nb-module.html#__package__ nbxmpp.dispatcher_nb.outgoingID nbxmpp.dispatcher_nb-module.html#outgoingID nbxmpp.features_nb nbxmpp.features_nb-module.html nbxmpp.features_nb.getPrivacyList nbxmpp.features_nb-module.html#getPrivacyList nbxmpp.features_nb.register nbxmpp.features_nb-module.html#register nbxmpp.features_nb._ReceivedRegInfo nbxmpp.features_nb-module.html#_ReceivedRegInfo nbxmpp.features_nb.setDefaultPrivacyList nbxmpp.features_nb-module.html#setDefaultPrivacyList nbxmpp.features_nb.isResultNode nbxmpp.protocol-module.html#isResultNode nbxmpp.features_nb.setActivePrivacyList nbxmpp.features_nb-module.html#setActivePrivacyList nbxmpp.features_nb.getActiveAndDefaultPrivacyLists nbxmpp.features_nb-module.html#getActiveAndDefaultPrivacyLists nbxmpp.features_nb.PL_ACT_DENY nbxmpp.features_nb-module.html#PL_ACT_DENY nbxmpp.features_nb.__package__ nbxmpp.features_nb-module.html#__package__ nbxmpp.features_nb.delPrivacyList nbxmpp.features_nb-module.html#delPrivacyList nbxmpp.features_nb.setPrivacyList nbxmpp.features_nb-module.html#setPrivacyList nbxmpp.features_nb.REGISTER_DATA_RECEIVED nbxmpp.features_nb-module.html#REGISTER_DATA_RECEIVED nbxmpp.features_nb.PRIVACY_LISTS_RECEIVED nbxmpp.features_nb-module.html#PRIVACY_LISTS_RECEIVED nbxmpp.features_nb.PL_ACT_ALLOW nbxmpp.features_nb-module.html#PL_ACT_ALLOW nbxmpp.features_nb.getPrivacyLists nbxmpp.features_nb-module.html#getPrivacyLists nbxmpp.features_nb.PL_TYPE_JID nbxmpp.features_nb-module.html#PL_TYPE_JID nbxmpp.features_nb.PRIVACY_LISTS_ACTIVE_DEFAULT nbxmpp.features_nb-module.html#PRIVACY_LISTS_ACTIVE_DEFAULT nbxmpp.features_nb.getRegInfo nbxmpp.features_nb-module.html#getRegInfo nbxmpp.features_nb._on_default_response nbxmpp.features_nb-module.html#_on_default_response nbxmpp.features_nb.PL_TYPE_GROUP nbxmpp.features_nb-module.html#PL_TYPE_GROUP nbxmpp.features_nb.changePasswordTo nbxmpp.features_nb-module.html#changePasswordTo nbxmpp.features_nb.unregister nbxmpp.features_nb-module.html#unregister nbxmpp.features_nb.PRIVACY_LIST_RECEIVED nbxmpp.features_nb-module.html#PRIVACY_LIST_RECEIVED nbxmpp.features_nb.PL_TYPE_SUBC nbxmpp.features_nb-module.html#PL_TYPE_SUBC nbxmpp.idlequeue nbxmpp.idlequeue-module.html nbxmpp.idlequeue.PENDING_WRITE nbxmpp.idlequeue-module.html#PENDING_WRITE nbxmpp.idlequeue.FLAG_READ_WRITE nbxmpp.idlequeue-module.html#FLAG_READ_WRITE nbxmpp.idlequeue.PENDING_READ nbxmpp.idlequeue-module.html#PENDING_READ nbxmpp.idlequeue.FLAG_READ nbxmpp.idlequeue-module.html#FLAG_READ nbxmpp.idlequeue.FLAG_CLOSE nbxmpp.idlequeue-module.html#FLAG_CLOSE nbxmpp.idlequeue.__package__ nbxmpp.idlequeue-module.html#__package__ nbxmpp.idlequeue.HAVE_GOBJECT nbxmpp.idlequeue-module.html#HAVE_GOBJECT nbxmpp.idlequeue.IS_CLOSED nbxmpp.idlequeue-module.html#IS_CLOSED nbxmpp.idlequeue.log nbxmpp.idlequeue-module.html#log nbxmpp.idlequeue.FLAG_WRITE nbxmpp.idlequeue-module.html#FLAG_WRITE nbxmpp.idlequeue.get_idlequeue nbxmpp.idlequeue-module.html#get_idlequeue nbxmpp.plugin nbxmpp.plugin-module.html nbxmpp.plugin.__package__ nbxmpp.plugin-module.html#__package__ nbxmpp.plugin.log nbxmpp.plugin-module.html#log nbxmpp.protocol nbxmpp.protocol-module.html nbxmpp.protocol.NS_MUC_ADMIN nbxmpp.protocol-module.html#NS_MUC_ADMIN nbxmpp.protocol.STREAM_NOT_AUTHORIZED nbxmpp.protocol-module.html#STREAM_NOT_AUTHORIZED nbxmpp.protocol.NS_FILE nbxmpp.protocol-module.html#NS_FILE nbxmpp.protocol.NS_VCARD_UPDATE nbxmpp.protocol-module.html#NS_VCARD_UPDATE nbxmpp.protocol.NS_PUBSUB_EVENT nbxmpp.protocol-module.html#NS_PUBSUB_EVENT nbxmpp.protocol.isResultNode nbxmpp.protocol-module.html#isResultNode nbxmpp.protocol.NS_RECEIPTS nbxmpp.protocol-module.html#NS_RECEIPTS nbxmpp.protocol.STREAM_CONNECTION_TIMEOUT nbxmpp.protocol-module.html#STREAM_CONNECTION_TIMEOUT nbxmpp.protocol.STREAM_IMPROPER_ADDRESSING nbxmpp.protocol-module.html#STREAM_IMPROPER_ADDRESSING nbxmpp.protocol.STREAM_UNSUPPORTED_STANZA_TYPE nbxmpp.protocol-module.html#STREAM_UNSUPPORTED_STANZA_TYPE nbxmpp.protocol.NS_PING nbxmpp.protocol-module.html#NS_PING nbxmpp.protocol.ERR_GONE nbxmpp.protocol-module.html#ERR_GONE nbxmpp.protocol.NS_PHYSLOC nbxmpp.protocol-module.html#NS_PHYSLOC nbxmpp.protocol.NS_CHATTING nbxmpp.protocol-module.html#NS_CHATTING nbxmpp.protocol.ERR_CONFLICT nbxmpp.protocol-module.html#ERR_CONFLICT nbxmpp.protocol.NS_COMPRESS nbxmpp.protocol-module.html#NS_COMPRESS nbxmpp.protocol.NS_HASHES_SHA1 nbxmpp.protocol-module.html#NS_HASHES_SHA1 nbxmpp.protocol.NS_AGENTS nbxmpp.protocol-module.html#NS_AGENTS nbxmpp.protocol.NS_CAPTCHA nbxmpp.protocol-module.html#NS_CAPTCHA nbxmpp.protocol.NS_MOOD nbxmpp.protocol-module.html#NS_MOOD nbxmpp.protocol.ERR_NOT_AUTHORIZED nbxmpp.protocol-module.html#ERR_NOT_AUTHORIZED nbxmpp.protocol.ERR_REGISTRATION_REQUIRED nbxmpp.protocol-module.html#ERR_REGISTRATION_REQUIRED nbxmpp.protocol.ERR_INTERNAL_SERVER_ERROR nbxmpp.protocol-module.html#ERR_INTERNAL_SERVER_ERROR nbxmpp.protocol.SASL_INCORRECT_ENCODING nbxmpp.protocol-module.html#SASL_INCORRECT_ENCODING nbxmpp.protocol.NS_MUC_OWNER nbxmpp.protocol-module.html#NS_MUC_OWNER nbxmpp.protocol.NS_ACTIVITY nbxmpp.protocol-module.html#NS_ACTIVITY nbxmpp.protocol.NS_ARCHIVE_MANUAL nbxmpp.protocol-module.html#NS_ARCHIVE_MANUAL nbxmpp.protocol.NS_JINGLE_RTP_AUDIO nbxmpp.protocol-module.html#NS_JINGLE_RTP_AUDIO nbxmpp.protocol.NS_PRESENCE nbxmpp.protocol-module.html#NS_PRESENCE nbxmpp.protocol.STREAM_INTERNAL_SERVER_ERROR nbxmpp.protocol-module.html#STREAM_INTERNAL_SERVER_ERROR nbxmpp.protocol.NS_CHATSTATES nbxmpp.protocol-module.html#NS_CHATSTATES nbxmpp.protocol.ERR_REDIRECT nbxmpp.protocol-module.html#ERR_REDIRECT nbxmpp.protocol.isErrorNode nbxmpp.protocol-module.html#isErrorNode nbxmpp.protocol.NS_GROUPCHAT nbxmpp.protocol-module.html#NS_GROUPCHAT nbxmpp.protocol.ERR_FEATURE_NOT_IMPLEMENTED nbxmpp.protocol-module.html#ERR_FEATURE_NOT_IMPLEMENTED nbxmpp.protocol.NS_GATEWAY nbxmpp.protocol-module.html#NS_GATEWAY nbxmpp.protocol.NS_DISCO_ITEMS nbxmpp.protocol-module.html#NS_DISCO_ITEMS nbxmpp.protocol.NS_MUC_CONFIG nbxmpp.protocol-module.html#NS_MUC_CONFIG nbxmpp.protocol.NS_BIND nbxmpp.protocol-module.html#NS_BIND nbxmpp.protocol.NS_JINGLE_ERRORS nbxmpp.protocol-module.html#NS_JINGLE_ERRORS nbxmpp.protocol.NS_XMPP_STREAMS nbxmpp.protocol-module.html#NS_XMPP_STREAMS nbxmpp.protocol.NS_IQ nbxmpp.protocol-module.html#NS_IQ nbxmpp.protocol.ERR_RESOURCE_CONSTRAINT nbxmpp.protocol-module.html#ERR_RESOURCE_CONSTRAINT nbxmpp.protocol.NS_CLIENT nbxmpp.protocol-module.html#NS_CLIENT nbxmpp.protocol.NS_FORWARD nbxmpp.protocol-module.html#NS_FORWARD nbxmpp.protocol.SASL_INVALID_AUTHZID nbxmpp.protocol-module.html#SASL_INVALID_AUTHZID nbxmpp.protocol.NS_EVENT nbxmpp.protocol-module.html#NS_EVENT nbxmpp.protocol.NS_AVATAR nbxmpp.protocol-module.html#NS_AVATAR nbxmpp.protocol.NS_JINGLE_IBB nbxmpp.protocol-module.html#NS_JINGLE_IBB nbxmpp.protocol.NS_DATA_LAYOUT nbxmpp.protocol-module.html#NS_DATA_LAYOUT nbxmpp.protocol.NS_TUNE nbxmpp.protocol-module.html#NS_TUNE nbxmpp.protocol.stream_exceptions nbxmpp.protocol-module.html#stream_exceptions nbxmpp.protocol.NS_HASHES_SHA256 nbxmpp.protocol-module.html#NS_HASHES_SHA256 nbxmpp.protocol.NS_CARBONS nbxmpp.protocol-module.html#NS_CARBONS nbxmpp.protocol.NS_ROSTER nbxmpp.protocol-module.html#NS_ROSTER nbxmpp.protocol.NS_STANZAS nbxmpp.protocol-module.html#NS_STANZAS nbxmpp.protocol.ERR_JID_MALFORMED nbxmpp.protocol-module.html#ERR_JID_MALFORMED nbxmpp.protocol.NS_ROSTER_VER nbxmpp.protocol-module.html#NS_ROSTER_VER nbxmpp.protocol.NS_TIME_REVISED nbxmpp.protocol-module.html#NS_TIME_REVISED nbxmpp.protocol.NS_MUC_UNIQUE nbxmpp.protocol-module.html#NS_MUC_UNIQUE nbxmpp.protocol.ERR_SERVICE_UNAVAILABLE nbxmpp.protocol-module.html#ERR_SERVICE_UNAVAILABLE nbxmpp.protocol.NS_PUBKEY_PUBKEY nbxmpp.protocol-module.html#NS_PUBKEY_PUBKEY nbxmpp.protocol.NS_AMP nbxmpp.protocol-module.html#NS_AMP nbxmpp.protocol.STREAM_UNDEFINED_CONDITION nbxmpp.protocol-module.html#STREAM_UNDEFINED_CONDITION nbxmpp.protocol.NS_CONFERENCE nbxmpp.protocol-module.html#NS_CONFERENCE nbxmpp.protocol.NS_MAM nbxmpp.protocol-module.html#NS_MAM nbxmpp.protocol.NS_DISCO nbxmpp.protocol-module.html#NS_DISCO nbxmpp.protocol.NS_RSM nbxmpp.protocol-module.html#NS_RSM nbxmpp.protocol.NS_BLOCKING nbxmpp.protocol-module.html#NS_BLOCKING nbxmpp.protocol.ERRORS nbxmpp.protocol-module.html#ERRORS nbxmpp.protocol.NS_STREAM nbxmpp.protocol-module.html#NS_STREAM nbxmpp.protocol.NS_ESESSION nbxmpp.protocol-module.html#NS_ESESSION nbxmpp.protocol.STREAM_BAD_FORMAT nbxmpp.protocol-module.html#STREAM_BAD_FORMAT nbxmpp.protocol.NS_JINGLE_FILE_TRANSFER nbxmpp.protocol-module.html#NS_JINGLE_FILE_TRANSFER nbxmpp.protocol.NS_LOCATION nbxmpp.protocol-module.html#NS_LOCATION nbxmpp.protocol.NS_ARCHIVE_AUTO nbxmpp.protocol-module.html#NS_ARCHIVE_AUTO nbxmpp.protocol.NS_DIALBACK nbxmpp.protocol-module.html#NS_DIALBACK nbxmpp.protocol.SASL_ABORTED nbxmpp.protocol-module.html#SASL_ABORTED nbxmpp.protocol.NS_AUTH nbxmpp.protocol-module.html#NS_AUTH nbxmpp.protocol.NS_BOOKMARKS nbxmpp.protocol-module.html#NS_BOOKMARKS nbxmpp.protocol.NS_VCARD nbxmpp.protocol-module.html#NS_VCARD nbxmpp.protocol.STREAM_HOST_GONE nbxmpp.protocol-module.html#STREAM_HOST_GONE nbxmpp.protocol.NS_XHTML nbxmpp.protocol-module.html#NS_XHTML nbxmpp.protocol.NS_JINGLE_RTP nbxmpp.protocol-module.html#NS_JINGLE_RTP nbxmpp.protocol.NS_SI nbxmpp.protocol-module.html#NS_SI nbxmpp.protocol.NS_SASL nbxmpp.protocol-module.html#NS_SASL nbxmpp.protocol.ERR_UNDEFINED_CONDITION nbxmpp.protocol-module.html#ERR_UNDEFINED_CONDITION nbxmpp.protocol.STREAM_INVALID_FROM nbxmpp.protocol-module.html#STREAM_INVALID_FROM nbxmpp.protocol.NS_CAPS nbxmpp.protocol-module.html#NS_CAPS nbxmpp.protocol.NS_PUBSUB_OWNER nbxmpp.protocol-module.html#NS_PUBSUB_OWNER nbxmpp.protocol.NS_AMP_ERRORS nbxmpp.protocol-module.html#NS_AMP_ERRORS nbxmpp.protocol.NS_BROWSE nbxmpp.protocol-module.html#NS_BROWSE nbxmpp.protocol.NS_CORRECT nbxmpp.protocol-module.html#NS_CORRECT nbxmpp.protocol.NS_ROSTERX nbxmpp.protocol-module.html#NS_ROSTERX nbxmpp.protocol.NS_JINGLE_RAW_UDP nbxmpp.protocol-module.html#NS_JINGLE_RAW_UDP nbxmpp.protocol.NS_TLS nbxmpp.protocol-module.html#NS_TLS nbxmpp.protocol.NS_ATTENTION nbxmpp.protocol-module.html#NS_ATTENTION nbxmpp.protocol.NS_DATA nbxmpp.protocol-module.html#NS_DATA nbxmpp.protocol.NS_SERVER nbxmpp.protocol-module.html#NS_SERVER nbxmpp.protocol.NS_SESSION nbxmpp.protocol-module.html#NS_SESSION nbxmpp.protocol.ERR_REMOTE_SERVER_TIMEOUT nbxmpp.protocol-module.html#ERR_REMOTE_SERVER_TIMEOUT nbxmpp.protocol.NS_JINGLE_ICE_UDP nbxmpp.protocol-module.html#NS_JINGLE_ICE_UDP nbxmpp.protocol.NS_IBB nbxmpp.protocol-module.html#NS_IBB nbxmpp.protocol.NS_TIME nbxmpp.protocol-module.html#NS_TIME nbxmpp.protocol.NS_PROFILE nbxmpp.protocol-module.html#NS_PROFILE nbxmpp.protocol.NS_SECLABEL nbxmpp.protocol-module.html#NS_SECLABEL nbxmpp.protocol.NS_PRIVACY nbxmpp.protocol-module.html#NS_PRIVACY nbxmpp.protocol.NS_GMAILNOTIFY nbxmpp.protocol-module.html#NS_GMAILNOTIFY nbxmpp.protocol.STREAM_INVALID_NAMESPACE nbxmpp.protocol-module.html#STREAM_INVALID_NAMESPACE nbxmpp.protocol.NS_CONDITIONS nbxmpp.protocol-module.html#NS_CONDITIONS nbxmpp.protocol.NS_MESSAGE nbxmpp.protocol-module.html#NS_MESSAGE nbxmpp.protocol.NS_FEATURE nbxmpp.protocol-module.html#NS_FEATURE nbxmpp.protocol.STREAM_UNSUPPORTED_VERSION nbxmpp.protocol-module.html#STREAM_UNSUPPORTED_VERSION nbxmpp.protocol.SASL_NOT_AUTHORIZED nbxmpp.protocol-module.html#SASL_NOT_AUTHORIZED nbxmpp.protocol.ERR_REMOTE_SERVER_NOT_FOUND nbxmpp.protocol-module.html#ERR_REMOTE_SERVER_NOT_FOUND nbxmpp.protocol.NS_DELAY2 nbxmpp.protocol-module.html#NS_DELAY2 nbxmpp.protocol.NS_WAITINGLIST nbxmpp.protocol-module.html#NS_WAITINGLIST nbxmpp.protocol.NS_ARCHIVE_MANAGE nbxmpp.protocol-module.html#NS_ARCHIVE_MANAGE nbxmpp.protocol.NS_VERSION nbxmpp.protocol-module.html#NS_VERSION nbxmpp.protocol.NS_SSN nbxmpp.protocol-module.html#NS_SSN nbxmpp.protocol.ERR_SUBSCRIPTION_REQUIRED nbxmpp.protocol-module.html#ERR_SUBSCRIPTION_REQUIRED nbxmpp.protocol.SASL_MECHANISM_TOO_WEAK nbxmpp.protocol-module.html#SASL_MECHANISM_TOO_WEAK nbxmpp.protocol.NS_COMPONENT_1 nbxmpp.protocol-module.html#NS_COMPONENT_1 nbxmpp.protocol.NS_ARCHIVE_PREF nbxmpp.protocol-module.html#NS_ARCHIVE_PREF nbxmpp.protocol.STREAM_SYSTEM_SHUTDOWN nbxmpp.protocol-module.html#STREAM_SYSTEM_SHUTDOWN nbxmpp.protocol.NS_HTTP_BIND nbxmpp.protocol-module.html#NS_HTTP_BIND nbxmpp.protocol.STREAM_INVALID_XML nbxmpp.protocol-module.html#STREAM_INVALID_XML nbxmpp.protocol.NS_INVISIBLE nbxmpp.protocol-module.html#NS_INVISIBLE nbxmpp.protocol.NS_JINGLE_RTP_VIDEO nbxmpp.protocol-module.html#NS_JINGLE_RTP_VIDEO nbxmpp.protocol.NS_HASHES nbxmpp.protocol-module.html#NS_HASHES nbxmpp.protocol.STREAM_UNSUPPORTED_ENCODING nbxmpp.protocol-module.html#STREAM_UNSUPPORTED_ENCODING nbxmpp.protocol.ERR_NOT_ALLOWED nbxmpp.protocol-module.html#ERR_NOT_ALLOWED nbxmpp.protocol.STREAM_SEE_OTHER_HOST nbxmpp.protocol-module.html#STREAM_SEE_OTHER_HOST nbxmpp.protocol.NS_BROWSING nbxmpp.protocol-module.html#NS_BROWSING nbxmpp.protocol.NS_GAMING nbxmpp.protocol-module.html#NS_GAMING nbxmpp.protocol.NS_OFFLINE nbxmpp.protocol-module.html#NS_OFFLINE nbxmpp.protocol.NS_PUBSUB nbxmpp.protocol-module.html#NS_PUBSUB nbxmpp.protocol.NS_MUC_USER nbxmpp.protocol-module.html#NS_MUC_USER nbxmpp.protocol.NS_ATOM nbxmpp.protocol-module.html#NS_ATOM nbxmpp.protocol.ascii_upper nbxmpp.protocol-module.html#ascii_upper nbxmpp.protocol.NS_STREAMS nbxmpp.protocol-module.html#NS_STREAMS nbxmpp.protocol.STREAM_HOST_UNKNOWN nbxmpp.protocol-module.html#STREAM_HOST_UNKNOWN nbxmpp.protocol.ERR_BAD_REQUEST nbxmpp.protocol-module.html#ERR_BAD_REQUEST nbxmpp.protocol.NS_GTALKSETTING nbxmpp.protocol-module.html#NS_GTALKSETTING nbxmpp.protocol.NS_DELAY nbxmpp.protocol-module.html#NS_DELAY nbxmpp.protocol.NS_ENCRYPTED nbxmpp.protocol-module.html#NS_ENCRYPTED nbxmpp.protocol.NS_RPC nbxmpp.protocol-module.html#NS_RPC nbxmpp.protocol.NS_SECLABEL_CATALOG nbxmpp.protocol-module.html#NS_SECLABEL_CATALOG nbxmpp.protocol.NS_SIGNED nbxmpp.protocol-module.html#NS_SIGNED nbxmpp.protocol.NS_NICK nbxmpp.protocol-module.html#NS_NICK nbxmpp.protocol._errorcodes nbxmpp.protocol-module.html#_errorcodes nbxmpp.protocol.NS_PUBKEY_REVOKE nbxmpp.protocol-module.html#NS_PUBKEY_REVOKE nbxmpp.protocol.NS_JINGLE_XTLS nbxmpp.protocol-module.html#NS_JINGLE_XTLS nbxmpp.protocol.NS_DATA_MEDIA nbxmpp.protocol-module.html#NS_DATA_MEDIA nbxmpp.protocol.STREAM_XML_NOT_WELL_FORMED nbxmpp.protocol-module.html#STREAM_XML_NOT_WELL_FORMED nbxmpp.protocol.STREAM_POLICY_VIOLATION nbxmpp.protocol-module.html#STREAM_POLICY_VIOLATION nbxmpp.protocol.NS_REGISTER nbxmpp.protocol-module.html#NS_REGISTER nbxmpp.protocol.NS_BYTESTREAM nbxmpp.protocol-module.html#NS_BYTESTREAM nbxmpp.protocol.NS_VACATION nbxmpp.protocol-module.html#NS_VACATION nbxmpp.protocol.NS_PUBSUB_PUBLISH_OPTIONS nbxmpp.protocol-module.html#NS_PUBSUB_PUBLISH_OPTIONS nbxmpp.protocol.NS_XHTML_IM nbxmpp.protocol-module.html#NS_XHTML_IM nbxmpp.protocol.__package__ nbxmpp.protocol-module.html#__package__ nbxmpp.protocol.NS_GEOLOC nbxmpp.protocol-module.html#NS_GEOLOC nbxmpp.protocol.NS_ARCHIVE nbxmpp.protocol-module.html#NS_ARCHIVE nbxmpp.protocol.NS_ROSTERNOTES nbxmpp.protocol-module.html#NS_ROSTERNOTES nbxmpp.protocol.ERR_UNEXPECTED_REQUEST nbxmpp.protocol-module.html#ERR_UNEXPECTED_REQUEST nbxmpp.protocol.NS_DATA_VALIDATE nbxmpp.protocol-module.html#NS_DATA_VALIDATE nbxmpp.protocol.ERR_RECIPIENT_UNAVAILABLE nbxmpp.protocol-module.html#ERR_RECIPIENT_UNAVAILABLE nbxmpp.protocol.NS_ESESSION_INIT nbxmpp.protocol-module.html#NS_ESESSION_INIT nbxmpp.protocol.SASL_TEMPORARY_AUTH_FAILURE nbxmpp.protocol-module.html#SASL_TEMPORARY_AUTH_FAILURE nbxmpp.protocol.NS_PRIVATE nbxmpp.protocol-module.html#NS_PRIVATE nbxmpp.protocol.NS_JINGLE_BYTESTREAM nbxmpp.protocol-module.html#NS_JINGLE_BYTESTREAM nbxmpp.protocol.SASL_INVALID_MECHANISM nbxmpp.protocol-module.html#SASL_INVALID_MECHANISM nbxmpp.protocol.NS_VIEWING nbxmpp.protocol-module.html#NS_VIEWING nbxmpp.protocol.NS_COMMANDS nbxmpp.protocol-module.html#NS_COMMANDS nbxmpp.protocol.ERR_PAYMENT_REQUIRED nbxmpp.protocol-module.html#ERR_PAYMENT_REQUIRED nbxmpp.protocol.STREAM_CONFLICT nbxmpp.protocol-module.html#STREAM_CONFLICT nbxmpp.protocol.STREAM_RESOURCE_CONSTRAINT nbxmpp.protocol-module.html#STREAM_RESOURCE_CONSTRAINT nbxmpp.protocol.NS_STREAM_MGMT nbxmpp.protocol-module.html#NS_STREAM_MGMT nbxmpp.protocol.NS_SI_PUB nbxmpp.protocol-module.html#NS_SI_PUB nbxmpp.protocol.NS_MUC nbxmpp.protocol-module.html#NS_MUC nbxmpp.protocol.NS_X_OOB nbxmpp.protocol-module.html#NS_X_OOB nbxmpp.protocol.ERR_ITEM_NOT_FOUND nbxmpp.protocol-module.html#ERR_ITEM_NOT_FOUND nbxmpp.protocol.STREAM_BAD_NAMESPACE_PREFIX nbxmpp.protocol-module.html#STREAM_BAD_NAMESPACE_PREFIX nbxmpp.protocol.NS_SEARCH nbxmpp.protocol-module.html#NS_SEARCH nbxmpp.protocol.STREAM_REMOTE_CONNECTION_FAILED nbxmpp.protocol-module.html#STREAM_REMOTE_CONNECTION_FAILED nbxmpp.protocol.NS_ADDRESS nbxmpp.protocol-module.html#NS_ADDRESS nbxmpp.protocol.NS_COMPONENT_ACCEPT nbxmpp.protocol-module.html#NS_COMPONENT_ACCEPT nbxmpp.protocol.STREAM_INVALID_ID nbxmpp.protocol-module.html#STREAM_INVALID_ID nbxmpp.protocol.STREAM_RESTRICTED_XML nbxmpp.protocol-module.html#STREAM_RESTRICTED_XML nbxmpp.protocol.NS_DISCO_INFO nbxmpp.protocol-module.html#NS_DISCO_INFO nbxmpp.protocol.NS_STANZA_CRYPTO nbxmpp.protocol-module.html#NS_STANZA_CRYPTO nbxmpp.protocol.NS_LAST nbxmpp.protocol-module.html#NS_LAST nbxmpp.protocol.NS_PUBKEY_ATTEST nbxmpp.protocol-module.html#NS_PUBKEY_ATTEST nbxmpp.protocol.NS_HASHES_SHA512 nbxmpp.protocol-module.html#NS_HASHES_SHA512 nbxmpp.protocol.ERR_NOT_ACCEPTABLE nbxmpp.protocol-module.html#ERR_NOT_ACCEPTABLE nbxmpp.protocol.NS_JINGLE nbxmpp.protocol-module.html#NS_JINGLE nbxmpp.protocol.NS_BOB nbxmpp.protocol-module.html#NS_BOB nbxmpp.protocol.NS_HASHES_MD5 nbxmpp.protocol-module.html#NS_HASHES_MD5 nbxmpp.protocol.NS_HTTP_AUTH nbxmpp.protocol-module.html#NS_HTTP_AUTH nbxmpp.protocol.ERR_FORBIDDEN nbxmpp.protocol-module.html#ERR_FORBIDDEN nbxmpp.proxy_connectors nbxmpp.proxy_connectors-module.html nbxmpp.proxy_connectors.log nbxmpp.proxy_connectors-module.html#log nbxmpp.proxy_connectors.__package__ nbxmpp.proxy_connectors-module.html#__package__ nbxmpp.roster_nb nbxmpp.roster_nb-module.html nbxmpp.roster_nb.log nbxmpp.roster_nb-module.html#log nbxmpp.roster_nb.__package__ nbxmpp.roster_nb-module.html#__package__ nbxmpp.simplexml nbxmpp.simplexml-module.html nbxmpp.simplexml.BadXML2Node nbxmpp.simplexml-module.html#BadXML2Node nbxmpp.simplexml.ustr nbxmpp.simplexml-module.html#ustr nbxmpp.simplexml.ENCODING nbxmpp.simplexml-module.html#ENCODING nbxmpp.simplexml.__package__ nbxmpp.simplexml-module.html#__package__ nbxmpp.simplexml.XMLescape nbxmpp.simplexml-module.html#XMLescape nbxmpp.simplexml.XML2Node nbxmpp.simplexml-module.html#XML2Node nbxmpp.simplexml.log nbxmpp.simplexml-module.html#log nbxmpp.smacks nbxmpp.smacks-module.html nbxmpp.smacks.log nbxmpp.smacks-module.html#log nbxmpp.smacks.__package__ nbxmpp.smacks-module.html#__package__ nbxmpp.stringprepare nbxmpp.stringprepare-module.html nbxmpp.stringprepare.nodeprep nbxmpp.stringprepare-module.html#nodeprep nbxmpp.stringprepare.C_21 nbxmpp.stringprepare-module.html#C_21 nbxmpp.stringprepare.C_22 nbxmpp.stringprepare-module.html#C_22 nbxmpp.stringprepare.C_5 nbxmpp.stringprepare-module.html#C_5 nbxmpp.stringprepare.__package__ nbxmpp.stringprepare-module.html#__package__ nbxmpp.stringprepare.resourceprep nbxmpp.stringprepare-module.html#resourceprep nbxmpp.stringprepare.C_3 nbxmpp.stringprepare-module.html#C_3 nbxmpp.stringprepare.C_4 nbxmpp.stringprepare-module.html#C_4 nbxmpp.stringprepare.C_7 nbxmpp.stringprepare-module.html#C_7 nbxmpp.stringprepare.C_6 nbxmpp.stringprepare-module.html#C_6 nbxmpp.stringprepare.C_9 nbxmpp.stringprepare-module.html#C_9 nbxmpp.stringprepare.C_8 nbxmpp.stringprepare-module.html#C_8 nbxmpp.stringprepare.B_2 nbxmpp.stringprepare-module.html#B_2 nbxmpp.stringprepare.B_1 nbxmpp.stringprepare-module.html#B_1 nbxmpp.stringprepare.C_11 nbxmpp.stringprepare-module.html#C_11 nbxmpp.stringprepare.C_12 nbxmpp.stringprepare-module.html#C_12 nbxmpp.stringprepare.nameprep nbxmpp.stringprepare-module.html#nameprep nbxmpp.tls_nb nbxmpp.tls_nb-module.html nbxmpp.tls_nb.log nbxmpp.tls_nb-module.html#log nbxmpp.tls_nb.PYOPENSSL nbxmpp.tls_nb-module.html#PYOPENSSL nbxmpp.tls_nb.USE_PYOPENSSL nbxmpp.tls_nb-module.html#USE_PYOPENSSL nbxmpp.tls_nb.PYSTDLIB nbxmpp.tls_nb-module.html#PYSTDLIB nbxmpp.tls_nb.gattr nbxmpp.tls_nb-module.html#gattr nbxmpp.tls_nb.__package__ nbxmpp.tls_nb-module.html#__package__ nbxmpp.transports_nb nbxmpp.transports_nb-module.html nbxmpp.transports_nb.DATA_SENT nbxmpp.transports_nb-module.html#DATA_SENT nbxmpp.transports_nb.STATES nbxmpp.transports_nb-module.html#STATES nbxmpp.transports_nb.DISCONNECT_TIMEOUT_SECONDS nbxmpp.transports_nb-module.html#DISCONNECT_TIMEOUT_SECONDS nbxmpp.transports_nb.get_proxy_data_from_dict nbxmpp.transports_nb-module.html#get_proxy_data_from_dict nbxmpp.transports_nb.DISCONNECTING nbxmpp.transports_nb-module.html#DISCONNECTING nbxmpp.transports_nb.DISCONNECTED nbxmpp.transports_nb-module.html#DISCONNECTED nbxmpp.transports_nb.__package__ nbxmpp.transports_nb-module.html#__package__ nbxmpp.transports_nb.DATA_ERROR nbxmpp.transports_nb-module.html#DATA_ERROR nbxmpp.transports_nb.CONNECT_TIMEOUT_SECONDS nbxmpp.transports_nb-module.html#CONNECT_TIMEOUT_SECONDS nbxmpp.transports_nb.CONNECTING nbxmpp.transports_nb-module.html#CONNECTING nbxmpp.transports_nb.ustr nbxmpp.simplexml-module.html#ustr nbxmpp.transports_nb.RECV_BUFSIZE nbxmpp.transports_nb-module.html#RECV_BUFSIZE nbxmpp.transports_nb.log nbxmpp.transports_nb-module.html#log nbxmpp.transports_nb.PROXY_CONNECTING nbxmpp.transports_nb-module.html#PROXY_CONNECTING nbxmpp.transports_nb.urisplit nbxmpp.transports_nb-module.html#urisplit nbxmpp.transports_nb.DATA_RECEIVED nbxmpp.transports_nb-module.html#DATA_RECEIVED nbxmpp.transports_nb.CONNECTED nbxmpp.transports_nb-module.html#CONNECTED nbxmpp.auth_nb.NonBlockingBind nbxmpp.auth_nb.NonBlockingBind-class.html nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.auth_nb.NonBlockingBind.plugin nbxmpp.auth_nb.NonBlockingBind-class.html#plugin nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.auth_nb.NonBlockingBind.plugout nbxmpp.auth_nb.NonBlockingBind-class.html#plugout nbxmpp.auth_nb.NonBlockingBind._on_bound nbxmpp.auth_nb.NonBlockingBind-class.html#_on_bound nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.auth_nb.NonBlockingBind.FeaturesHandler nbxmpp.auth_nb.NonBlockingBind-class.html#FeaturesHandler nbxmpp.auth_nb.NonBlockingBind.__init__ nbxmpp.auth_nb.NonBlockingBind-class.html#__init__ nbxmpp.auth_nb.NonBlockingBind._on_session nbxmpp.auth_nb.NonBlockingBind-class.html#_on_session nbxmpp.auth_nb.NonBlockingBind.NonBlockingBind nbxmpp.auth_nb.NonBlockingBind-class.html#NonBlockingBind nbxmpp.auth_nb.NonBlockingNonSASL nbxmpp.auth_nb.NonBlockingNonSASL-class.html nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.auth_nb.NonBlockingNonSASL.plugin nbxmpp.auth_nb.NonBlockingNonSASL-class.html#plugin nbxmpp.auth_nb.NonBlockingNonSASL._on_username nbxmpp.auth_nb.NonBlockingNonSASL-class.html#_on_username nbxmpp.auth_nb.NonBlockingNonSASL._on_password nbxmpp.auth_nb.NonBlockingNonSASL-class.html#_on_password nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.auth_nb.NonBlockingNonSASL._on_auth nbxmpp.auth_nb.NonBlockingNonSASL-class.html#_on_auth nbxmpp.auth_nb.NonBlockingNonSASL.__init__ nbxmpp.auth_nb.NonBlockingNonSASL-class.html#__init__ nbxmpp.auth_nb.SASL nbxmpp.auth_nb.SASL-class.html nbxmpp.auth_nb.SASL.SASLHandler nbxmpp.auth_nb.SASL-class.html#SASLHandler nbxmpp.auth_nb.SASL.MechanismHandler nbxmpp.auth_nb.SASL-class.html#MechanismHandler nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.auth_nb.SASL._convert_to_iso88591 nbxmpp.auth_nb.SASL-class.html#_convert_to_iso88591 nbxmpp.auth_nb.SASL.plugin nbxmpp.auth_nb.SASL-class.html#plugin nbxmpp.auth_nb.SASL.auth nbxmpp.auth_nb.SASL-class.html#auth nbxmpp.auth_nb.SASL.FeaturesHandler nbxmpp.auth_nb.SASL-class.html#FeaturesHandler nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.auth_nb.SASL.plugout nbxmpp.auth_nb.SASL-class.html#plugout nbxmpp.auth_nb.SASL.set_password nbxmpp.auth_nb.SASL-class.html#set_password nbxmpp.auth_nb.SASL.__init__ nbxmpp.auth_nb.SASL-class.html#__init__ nbxmpp.bosh.AckChecker nbxmpp.bosh.AckChecker-class.html nbxmpp.bosh.AckChecker.get_not_acked_rids nbxmpp.bosh.AckChecker-class.html#get_not_acked_rids nbxmpp.bosh.AckChecker.process_incoming_ack nbxmpp.bosh.AckChecker-class.html#process_incoming_ack nbxmpp.bosh.AckChecker.get_rid nbxmpp.bosh.AckChecker-class.html#get_rid nbxmpp.bosh.AckChecker.__init__ nbxmpp.bosh.AckChecker-class.html#__init__ nbxmpp.bosh.AckChecker.backup_stanza nbxmpp.bosh.AckChecker-class.html#backup_stanza nbxmpp.bosh.KeyStack nbxmpp.bosh.KeyStack-class.html nbxmpp.bosh.KeyStack.reset nbxmpp.bosh.KeyStack-class.html#reset nbxmpp.bosh.KeyStack.__init__ nbxmpp.bosh.KeyStack-class.html#__init__ nbxmpp.bosh.KeyStack.get nbxmpp.bosh.KeyStack-class.html#get nbxmpp.bosh.NonBlockingBOSH nbxmpp.bosh.NonBlockingBOSH-class.html nbxmpp.transports_nb.NonBlockingTransport._tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport-class.html#_tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport.set_state nbxmpp.transports_nb.NonBlockingTransport-class.html#set_state nbxmpp.bosh.NonBlockingBOSH.get_free_socket nbxmpp.bosh.NonBlockingBOSH-class.html#get_free_socket nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport.plugout nbxmpp.transports_nb.NonBlockingTransport-class.html#plugout nbxmpp.bosh.NonBlockingBOSH._on_connect nbxmpp.bosh.NonBlockingBOSH-class.html#_on_connect nbxmpp.transports_nb.NonBlockingTransport.get_state nbxmpp.transports_nb.NonBlockingTransport-class.html#get_state nbxmpp.bosh.NonBlockingBOSH.on_persistent_fallback nbxmpp.bosh.NonBlockingBOSH-class.html#on_persistent_fallback nbxmpp.transports_nb.NonBlockingTransport.read_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout2 nbxmpp.bosh.NonBlockingBOSH.renew_bosh_wait_timeout nbxmpp.bosh.NonBlockingBOSH-class.html#renew_bosh_wait_timeout nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout nbxmpp.transports_nb.NonBlockingTransport.read_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout nbxmpp.bosh.NonBlockingBOSH.send_BOSH nbxmpp.bosh.NonBlockingBOSH-class.html#send_BOSH nbxmpp.bosh.NonBlockingBOSH.start_disconnect nbxmpp.bosh.NonBlockingBOSH-class.html#start_disconnect nbxmpp.bosh.NonBlockingBOSH.get_new_http_socket nbxmpp.bosh.NonBlockingBOSH-class.html#get_new_http_socket nbxmpp.bosh.NonBlockingBOSH.on_http_request_possible nbxmpp.bosh.NonBlockingBOSH-class.html#on_http_request_possible nbxmpp.bosh.NonBlockingBOSH.plug_socket nbxmpp.bosh.NonBlockingBOSH-class.html#plug_socket nbxmpp.bosh.NonBlockingBOSH.disconnect nbxmpp.bosh.NonBlockingBOSH-class.html#disconnect nbxmpp.bosh.NonBlockingBOSH.remove_bosh_wait_timeout nbxmpp.bosh.NonBlockingBOSH-class.html#remove_bosh_wait_timeout nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.bosh.NonBlockingBOSH.send nbxmpp.bosh.NonBlockingBOSH-class.html#send nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout2 nbxmpp.bosh.NonBlockingBOSH.build_stanza nbxmpp.bosh.NonBlockingBOSH-class.html#build_stanza nbxmpp.bosh.NonBlockingBOSH.__init__ nbxmpp.bosh.NonBlockingBOSH-class.html#__init__ nbxmpp.bosh.NonBlockingBOSH.connect_and_flush nbxmpp.bosh.NonBlockingBOSH-class.html#connect_and_flush nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.bosh.NonBlockingBOSH.onreceive nbxmpp.bosh.NonBlockingBOSH-class.html#onreceive nbxmpp.bosh.NonBlockingBOSH.send_init nbxmpp.bosh.NonBlockingBOSH-class.html#send_init nbxmpp.bosh.NonBlockingBOSH.get_socket_in nbxmpp.bosh.NonBlockingBOSH-class.html#get_socket_in nbxmpp.bosh.NonBlockingBOSH.boshify_stanzas nbxmpp.bosh.NonBlockingBOSH-class.html#boshify_stanzas nbxmpp.bosh.NonBlockingBOSH.on_bosh_wait_timeout nbxmpp.bosh.NonBlockingBOSH-class.html#on_bosh_wait_timeout nbxmpp.bosh.NonBlockingBOSH.append_stanza nbxmpp.bosh.NonBlockingBOSH-class.html#append_stanza nbxmpp.transports_nb.NonBlockingTransport._on_connect_failure nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect_failure nbxmpp.transports_nb.NonBlockingTransport.plugin nbxmpp.transports_nb.NonBlockingTransport-class.html#plugin nbxmpp.transports_nb.NonBlockingTransport.set_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout2 nbxmpp.transports_nb.NonBlockingTransport.get_fd nbxmpp.transports_nb.NonBlockingTransport-class.html#get_fd nbxmpp.bosh.NonBlockingBOSH.get_current_state nbxmpp.bosh.NonBlockingBOSH-class.html#get_current_state nbxmpp.transports_nb.NonBlockingTransport.remove_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#remove_timeout nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout2 nbxmpp.bosh.NonBlockingBOSH.set_timeout nbxmpp.bosh.NonBlockingBOSH-class.html#set_timeout nbxmpp.bosh.NonBlockingBOSH.handle_body_attrs nbxmpp.bosh.NonBlockingBOSH-class.html#handle_body_attrs nbxmpp.bosh.NonBlockingBOSH.on_received_http nbxmpp.bosh.NonBlockingBOSH-class.html#on_received_http nbxmpp.bosh.NonBlockingBOSH.connect nbxmpp.bosh.NonBlockingBOSH-class.html#connect nbxmpp.client_nb.NonBlockingClient nbxmpp.client_nb.NonBlockingClient-class.html nbxmpp.client_nb.NonBlockingClient._on_start_sasl nbxmpp.client_nb.NonBlockingClient-class.html#_on_start_sasl nbxmpp.client_nb.NonBlockingClient._on_connect nbxmpp.client_nb.NonBlockingClient-class.html#_on_connect nbxmpp.client_nb.NonBlockingClient._on_old_auth nbxmpp.client_nb.NonBlockingClient-class.html#_on_old_auth nbxmpp.client_nb.NonBlockingClient.sendPresence nbxmpp.client_nb.NonBlockingClient-class.html#sendPresence nbxmpp.client_nb.NonBlockingClient.connect nbxmpp.client_nb.NonBlockingClient-class.html#connect nbxmpp.client_nb.NonBlockingClient._on_stream_start nbxmpp.client_nb.NonBlockingClient-class.html#_on_stream_start nbxmpp.client_nb.NonBlockingClient.incoming_stream_version nbxmpp.client_nb.NonBlockingClient-class.html#incoming_stream_version nbxmpp.client_nb.NonBlockingClient.__init__ nbxmpp.client_nb.NonBlockingClient-class.html#__init__ nbxmpp.client_nb.NonBlockingClient.get_peerhost nbxmpp.client_nb.NonBlockingClient-class.html#get_peerhost nbxmpp.client_nb.NonBlockingClient.disconnect nbxmpp.client_nb.NonBlockingClient-class.html#disconnect nbxmpp.client_nb.NonBlockingClient.raise_event nbxmpp.client_nb.NonBlockingClient-class.html#raise_event nbxmpp.client_nb.NonBlockingClient.RegisterDisconnectHandler nbxmpp.client_nb.NonBlockingClient-class.html#RegisterDisconnectHandler nbxmpp.client_nb.NonBlockingClient._on_sasl_auth nbxmpp.client_nb.NonBlockingClient-class.html#_on_sasl_auth nbxmpp.client_nb.NonBlockingClient.initRoster nbxmpp.client_nb.NonBlockingClient-class.html#initRoster nbxmpp.client_nb.NonBlockingClient._xmpp_connect_machine nbxmpp.client_nb.NonBlockingClient-class.html#_xmpp_connect_machine nbxmpp.client_nb.NonBlockingClient.auth nbxmpp.client_nb.NonBlockingClient-class.html#auth nbxmpp.client_nb.NonBlockingClient.getRoster nbxmpp.client_nb.NonBlockingClient-class.html#getRoster nbxmpp.client_nb.NonBlockingClient._on_auth_bind nbxmpp.client_nb.NonBlockingClient-class.html#_on_auth_bind nbxmpp.client_nb.NonBlockingClient.get_connect_type nbxmpp.client_nb.NonBlockingClient-class.html#get_connect_type nbxmpp.client_nb.NonBlockingClient._on_doc_attrs nbxmpp.client_nb.NonBlockingClient-class.html#_on_doc_attrs nbxmpp.client_nb.NonBlockingClient.UnregisterDisconnectHandler nbxmpp.client_nb.NonBlockingClient-class.html#UnregisterDisconnectHandler nbxmpp.client_nb.NonBlockingClient._tls_negotiation_handler nbxmpp.client_nb.NonBlockingClient-class.html#_tls_negotiation_handler nbxmpp.client_nb.NonBlockingClient._try_next_ip nbxmpp.client_nb.NonBlockingClient-class.html#_try_next_ip nbxmpp.client_nb.NonBlockingClient.DisconnectHandler nbxmpp.client_nb.NonBlockingClient-class.html#DisconnectHandler nbxmpp.client_nb.NonBlockingClient._xmpp_connect nbxmpp.client_nb.NonBlockingClient-class.html#_xmpp_connect nbxmpp.client_nb.NonBlockingClient._resolve_hostname nbxmpp.client_nb.NonBlockingClient-class.html#_resolve_hostname nbxmpp.dispatcher_nb.BOSHDispatcher nbxmpp.dispatcher_nb.BOSHDispatcher-class.html nbxmpp.dispatcher_nb.XMPPDispatcher.restoreHandlers nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#restoreHandlers nbxmpp.dispatcher_nb.XMPPDispatcher.plugout nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#plugout nbxmpp.dispatcher_nb.XMPPDispatcher._WaitForData nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_WaitForData nbxmpp.dispatcher_nb.BOSHDispatcher.StreamTerminate nbxmpp.dispatcher_nb.BOSHDispatcher-class.html#StreamTerminate nbxmpp.dispatcher_nb.XMPPDispatcher._init nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_init nbxmpp.dispatcher_nb.BOSHDispatcher.dispatch nbxmpp.dispatcher_nb.BOSHDispatcher-class.html#dispatch nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterHandlerOnce nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterHandlerOnce nbxmpp.dispatcher_nb.XMPPDispatcher.__init__ nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#__init__ nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterDefaultHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterDefaultHandler nbxmpp.dispatcher_nb.XMPPDispatcher.SendAndCallForResponse nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#SendAndCallForResponse nbxmpp.dispatcher_nb.XMPPDispatcher.UnregisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#UnregisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterNamespace nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterNamespace nbxmpp.dispatcher_nb.BOSHDispatcher.PlugIn nbxmpp.dispatcher_nb.BOSHDispatcher-class.html#PlugIn nbxmpp.dispatcher_nb.XMPPDispatcher.dumpHandlers nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#dumpHandlers nbxmpp.dispatcher_nb.XMPPDispatcher.UnregisterCycleHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#UnregisterCycleHandler nbxmpp.dispatcher_nb.XMPPDispatcher.SendAndWaitForResponse nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#SendAndWaitForResponse nbxmpp.dispatcher_nb.XMPPDispatcher.send nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#send nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterEventHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterEventHandler nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.dispatcher_nb.BOSHDispatcher.StreamInit nbxmpp.dispatcher_nb.BOSHDispatcher-class.html#StreamInit nbxmpp.dispatcher_nb.XMPPDispatcher.replace_non_character nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#replace_non_character nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterCycleHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterCycleHandler nbxmpp.dispatcher_nb.BOSHDispatcher.ProcessNonBlocking nbxmpp.dispatcher_nb.BOSHDispatcher-class.html#ProcessNonBlocking nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterNamespaceHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterNamespaceHandler nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterProtocol nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterProtocol nbxmpp.dispatcher_nb.XMPPDispatcher._check_stream_start nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_check_stream_start nbxmpp.dispatcher_nb.XMPPDispatcher.plugin nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#plugin nbxmpp.dispatcher_nb.XMPPDispatcher.returnStanzaHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#returnStanzaHandler nbxmpp.dispatcher_nb.XMPPDispatcher.getAnID nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#getAnID nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher.Event nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#Event nbxmpp.dispatcher_nb.Dispatcher nbxmpp.dispatcher_nb.Dispatcher-class.html nbxmpp.dispatcher_nb.Dispatcher.get_instance nbxmpp.dispatcher_nb.Dispatcher-class.html#get_instance nbxmpp.dispatcher_nb.Dispatcher.PlugIn nbxmpp.dispatcher_nb.Dispatcher-class.html#PlugIn nbxmpp.dispatcher_nb.XMPPDispatcher nbxmpp.dispatcher_nb.XMPPDispatcher-class.html nbxmpp.dispatcher_nb.XMPPDispatcher.restoreHandlers nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#restoreHandlers nbxmpp.dispatcher_nb.XMPPDispatcher.plugout nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#plugout nbxmpp.dispatcher_nb.XMPPDispatcher._WaitForData nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_WaitForData nbxmpp.dispatcher_nb.XMPPDispatcher._init nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_init nbxmpp.dispatcher_nb.XMPPDispatcher.dispatch nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#dispatch nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterHandlerOnce nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterHandlerOnce nbxmpp.dispatcher_nb.XMPPDispatcher.__init__ nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#__init__ nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterDefaultHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterDefaultHandler nbxmpp.dispatcher_nb.XMPPDispatcher.SendAndCallForResponse nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#SendAndCallForResponse nbxmpp.dispatcher_nb.XMPPDispatcher.UnregisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#UnregisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterNamespace nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterNamespace nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.dispatcher_nb.XMPPDispatcher.dumpHandlers nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#dumpHandlers nbxmpp.dispatcher_nb.XMPPDispatcher.UnregisterCycleHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#UnregisterCycleHandler nbxmpp.dispatcher_nb.XMPPDispatcher.SendAndWaitForResponse nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#SendAndWaitForResponse nbxmpp.dispatcher_nb.XMPPDispatcher.send nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#send nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterEventHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterEventHandler nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.dispatcher_nb.XMPPDispatcher.StreamInit nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#StreamInit nbxmpp.dispatcher_nb.XMPPDispatcher.replace_non_character nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#replace_non_character nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterCycleHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterCycleHandler nbxmpp.dispatcher_nb.XMPPDispatcher.ProcessNonBlocking nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#ProcessNonBlocking nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterNamespaceHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterNamespaceHandler nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterProtocol nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterProtocol nbxmpp.dispatcher_nb.XMPPDispatcher._check_stream_start nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#_check_stream_start nbxmpp.dispatcher_nb.XMPPDispatcher.plugin nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#plugin nbxmpp.dispatcher_nb.XMPPDispatcher.returnStanzaHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#returnStanzaHandler nbxmpp.dispatcher_nb.XMPPDispatcher.getAnID nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#getAnID nbxmpp.dispatcher_nb.XMPPDispatcher.RegisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#RegisterHandler nbxmpp.dispatcher_nb.XMPPDispatcher.Event nbxmpp.dispatcher_nb.XMPPDispatcher-class.html#Event nbxmpp.idlequeue.GlibIdleQueue nbxmpp.idlequeue.GlibIdleQueue-class.html nbxmpp.idlequeue.IdleQueue.current_time nbxmpp.idlequeue.IdleQueue-class.html#current_time nbxmpp.idlequeue.IdleQueue.remove_alarm nbxmpp.idlequeue.IdleQueue-class.html#remove_alarm nbxmpp.idlequeue.GlibIdleQueue.PROCESS_TIMEOUT nbxmpp.idlequeue.GlibIdleQueue-class.html#PROCESS_TIMEOUT nbxmpp.idlequeue.IdleQueue._check_time_events nbxmpp.idlequeue.IdleQueue-class.html#_check_time_events nbxmpp.idlequeue.GlibIdleQueue._init_idle nbxmpp.idlequeue.GlibIdleQueue-class.html#_init_idle nbxmpp.idlequeue.GlibIdleQueue._process_events nbxmpp.idlequeue.GlibIdleQueue-class.html#_process_events nbxmpp.idlequeue.GlibIdleQueue._add_idle nbxmpp.idlequeue.GlibIdleQueue-class.html#_add_idle nbxmpp.idlequeue.GlibIdleQueue.process nbxmpp.idlequeue.GlibIdleQueue-class.html#process nbxmpp.idlequeue.GlibIdleQueue._remove_idle nbxmpp.idlequeue.GlibIdleQueue-class.html#_remove_idle nbxmpp.idlequeue.IdleQueue.remove_timeout nbxmpp.idlequeue.IdleQueue-class.html#remove_timeout nbxmpp.idlequeue.IdleQueue.unplug_idle nbxmpp.idlequeue.IdleQueue-class.html#unplug_idle nbxmpp.idlequeue.IdleQueue.set_read_timeout nbxmpp.idlequeue.IdleQueue-class.html#set_read_timeout nbxmpp.idlequeue.IdleQueue.plug_idle nbxmpp.idlequeue.IdleQueue-class.html#plug_idle nbxmpp.idlequeue.IdleQueue.__init__ nbxmpp.idlequeue.IdleQueue-class.html#__init__ nbxmpp.idlequeue.IdleQueue.set_alarm nbxmpp.idlequeue.IdleQueue-class.html#set_alarm nbxmpp.idlequeue.IdleCommand nbxmpp.idlequeue.IdleCommand-class.html nbxmpp.idlequeue.IdleCommand._compose_command_args nbxmpp.idlequeue.IdleCommand-class.html#_compose_command_args nbxmpp.idlequeue.IdleCommand.set_idlequeue nbxmpp.idlequeue.IdleCommand-class.html#set_idlequeue nbxmpp.idlequeue.IdleCommand.end nbxmpp.idlequeue.IdleCommand-class.html#end nbxmpp.idlequeue.IdleCommand.start nbxmpp.idlequeue.IdleCommand-class.html#start nbxmpp.idlequeue.IdleCommand._compose_command_line nbxmpp.idlequeue.IdleCommand-class.html#_compose_command_line nbxmpp.idlequeue.IdleCommand.pollend nbxmpp.idlequeue.IdleCommand-class.html#pollend nbxmpp.idlequeue.IdleCommand.pollin nbxmpp.idlequeue.IdleCommand-class.html#pollin nbxmpp.idlequeue.IdleCommand._start_posix nbxmpp.idlequeue.IdleCommand-class.html#_start_posix nbxmpp.idlequeue.IdleCommand.read_timeout nbxmpp.idlequeue.IdleCommand-class.html#read_timeout nbxmpp.idlequeue.IdleObject.fd nbxmpp.idlequeue.IdleObject-class.html#fd nbxmpp.idlequeue.IdleCommand.wait_child nbxmpp.idlequeue.IdleCommand-class.html#wait_child nbxmpp.idlequeue.IdleCommand._start_nt nbxmpp.idlequeue.IdleCommand-class.html#_start_nt nbxmpp.idlequeue.IdleObject.pollout nbxmpp.idlequeue.IdleObject-class.html#pollout nbxmpp.idlequeue.IdleCommand.__init__ nbxmpp.idlequeue.IdleCommand-class.html#__init__ nbxmpp.idlequeue.IdleCommand._return_result nbxmpp.idlequeue.IdleCommand-class.html#_return_result nbxmpp.idlequeue.IdleObject nbxmpp.idlequeue.IdleObject-class.html nbxmpp.idlequeue.IdleObject.pollend nbxmpp.idlequeue.IdleObject-class.html#pollend nbxmpp.idlequeue.IdleObject.fd nbxmpp.idlequeue.IdleObject-class.html#fd nbxmpp.idlequeue.IdleObject.read_timeout nbxmpp.idlequeue.IdleObject-class.html#read_timeout nbxmpp.idlequeue.IdleObject.pollin nbxmpp.idlequeue.IdleObject-class.html#pollin nbxmpp.idlequeue.IdleObject.pollout nbxmpp.idlequeue.IdleObject-class.html#pollout nbxmpp.idlequeue.IdleObject.__init__ nbxmpp.idlequeue.IdleObject-class.html#__init__ nbxmpp.idlequeue.IdleQueue nbxmpp.idlequeue.IdleQueue-class.html nbxmpp.idlequeue.IdleQueue.current_time nbxmpp.idlequeue.IdleQueue-class.html#current_time nbxmpp.idlequeue.IdleQueue.remove_alarm nbxmpp.idlequeue.IdleQueue-class.html#remove_alarm nbxmpp.idlequeue.IdleQueue.PROCESS_TIMEOUT nbxmpp.idlequeue.IdleQueue-class.html#PROCESS_TIMEOUT nbxmpp.idlequeue.IdleQueue.set_alarm nbxmpp.idlequeue.IdleQueue-class.html#set_alarm nbxmpp.idlequeue.IdleQueue._init_idle nbxmpp.idlequeue.IdleQueue-class.html#_init_idle nbxmpp.idlequeue.IdleQueue.unplug_idle nbxmpp.idlequeue.IdleQueue-class.html#unplug_idle nbxmpp.idlequeue.IdleQueue._add_idle nbxmpp.idlequeue.IdleQueue-class.html#_add_idle nbxmpp.idlequeue.IdleQueue.process nbxmpp.idlequeue.IdleQueue-class.html#process nbxmpp.idlequeue.IdleQueue._remove_idle nbxmpp.idlequeue.IdleQueue-class.html#_remove_idle nbxmpp.idlequeue.IdleQueue.remove_timeout nbxmpp.idlequeue.IdleQueue-class.html#remove_timeout nbxmpp.idlequeue.IdleQueue._process_events nbxmpp.idlequeue.IdleQueue-class.html#_process_events nbxmpp.idlequeue.IdleQueue.set_read_timeout nbxmpp.idlequeue.IdleQueue-class.html#set_read_timeout nbxmpp.idlequeue.IdleQueue.plug_idle nbxmpp.idlequeue.IdleQueue-class.html#plug_idle nbxmpp.idlequeue.IdleQueue.__init__ nbxmpp.idlequeue.IdleQueue-class.html#__init__ nbxmpp.idlequeue.IdleQueue._check_time_events nbxmpp.idlequeue.IdleQueue-class.html#_check_time_events nbxmpp.idlequeue.SelectIdleQueue nbxmpp.idlequeue.SelectIdleQueue-class.html nbxmpp.idlequeue.IdleQueue.current_time nbxmpp.idlequeue.IdleQueue-class.html#current_time nbxmpp.idlequeue.IdleQueue.remove_alarm nbxmpp.idlequeue.IdleQueue-class.html#remove_alarm nbxmpp.idlequeue.IdleQueue.PROCESS_TIMEOUT nbxmpp.idlequeue.IdleQueue-class.html#PROCESS_TIMEOUT nbxmpp.idlequeue.IdleQueue._check_time_events nbxmpp.idlequeue.IdleQueue-class.html#_check_time_events nbxmpp.idlequeue.SelectIdleQueue._init_idle nbxmpp.idlequeue.SelectIdleQueue-class.html#_init_idle nbxmpp.idlequeue.IdleQueue.unplug_idle nbxmpp.idlequeue.IdleQueue-class.html#unplug_idle nbxmpp.idlequeue.SelectIdleQueue._add_idle nbxmpp.idlequeue.SelectIdleQueue-class.html#_add_idle nbxmpp.idlequeue.SelectIdleQueue.process nbxmpp.idlequeue.SelectIdleQueue-class.html#process nbxmpp.idlequeue.SelectIdleQueue._remove_idle nbxmpp.idlequeue.SelectIdleQueue-class.html#_remove_idle nbxmpp.idlequeue.IdleQueue.remove_timeout nbxmpp.idlequeue.IdleQueue-class.html#remove_timeout nbxmpp.idlequeue.IdleQueue._process_events nbxmpp.idlequeue.IdleQueue-class.html#_process_events nbxmpp.idlequeue.IdleQueue.set_read_timeout nbxmpp.idlequeue.IdleQueue-class.html#set_read_timeout nbxmpp.idlequeue.IdleQueue.plug_idle nbxmpp.idlequeue.IdleQueue-class.html#plug_idle nbxmpp.idlequeue.IdleQueue.__init__ nbxmpp.idlequeue.IdleQueue-class.html#__init__ nbxmpp.idlequeue.IdleQueue.set_alarm nbxmpp.idlequeue.IdleQueue-class.html#set_alarm nbxmpp.plugin.PlugIn nbxmpp.plugin.PlugIn-class.html nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.plugin.PlugIn.__init__ nbxmpp.plugin.PlugIn-class.html#__init__ nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.protocol.Acks nbxmpp.protocol.Acks-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.protocol.Acks.buildEnable nbxmpp.protocol.Acks-class.html#buildEnable nbxmpp.protocol.Acks.buildAnswer nbxmpp.protocol.Acks-class.html#buildAnswer nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.protocol.Acks.__init__ nbxmpp.protocol.Acks-class.html#__init__ nbxmpp.protocol.Acks.buildRequest nbxmpp.protocol.Acks-class.html#buildRequest nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__ nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__ nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.protocol.Acks.buildResume nbxmpp.protocol.Acks-class.html#buildResume nbxmpp.protocol.BOSHBody nbxmpp.protocol.BOSHBody-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.protocol.BOSHBody.__init__ nbxmpp.protocol.BOSHBody-class.html#__init__ nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__ nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__ nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.protocol.BadFormat nbxmpp.protocol.BadFormat-class.html nbxmpp.protocol.BadNamespacePrefix nbxmpp.protocol.BadNamespacePrefix-class.html nbxmpp.protocol.Conflict nbxmpp.protocol.Conflict-class.html nbxmpp.protocol.ConnectionTimeout nbxmpp.protocol.ConnectionTimeout-class.html nbxmpp.protocol.DataField nbxmpp.protocol.DataField-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.protocol.DataField.addOption nbxmpp.protocol.DataField-class.html#addOption nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.protocol.DataField.getValues nbxmpp.protocol.DataField-class.html#getValues nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.protocol.DataField.getOptions nbxmpp.protocol.DataField-class.html#getOptions nbxmpp.protocol.DataField.setVar nbxmpp.protocol.DataField-class.html#setVar nbxmpp.protocol.DataField.__init__ nbxmpp.protocol.DataField-class.html#__init__ nbxmpp.protocol.DataField.setType nbxmpp.protocol.DataField-class.html#setType nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.protocol.DataField.getDesc nbxmpp.protocol.DataField-class.html#getDesc nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.protocol.DataField.getVar nbxmpp.protocol.DataField-class.html#getVar nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.protocol.DataField.setDesc nbxmpp.protocol.DataField-class.html#setDesc nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.protocol.DataField.setValue nbxmpp.protocol.DataField-class.html#setValue nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__ nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.protocol.DataField.setRequired nbxmpp.protocol.DataField-class.html#setRequired nbxmpp.protocol.DataField.getType nbxmpp.protocol.DataField-class.html#getType nbxmpp.protocol.DataField.setOptions nbxmpp.protocol.DataField-class.html#setOptions nbxmpp.protocol.DataField.isRequired nbxmpp.protocol.DataField-class.html#isRequired nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__ nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.protocol.DataField.setValues nbxmpp.protocol.DataField-class.html#setValues nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.protocol.DataField.getValue nbxmpp.protocol.DataField-class.html#getValue nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.protocol.DataField.addValue nbxmpp.protocol.DataField-class.html#addValue nbxmpp.protocol.DataForm nbxmpp.protocol.DataForm-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.protocol.DataForm.setTitle nbxmpp.protocol.DataForm-class.html#setTitle nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.protocol.DataForm.setField nbxmpp.protocol.DataForm-class.html#setField nbxmpp.protocol.DataForm.__init__ nbxmpp.protocol.DataForm-class.html#__init__ nbxmpp.protocol.DataForm.setType nbxmpp.protocol.DataForm-class.html#setType nbxmpp.protocol.DataForm.__getitem__ nbxmpp.protocol.DataForm-class.html#__getitem__ nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.protocol.DataForm.setInstructions nbxmpp.protocol.DataForm-class.html#setInstructions nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.protocol.DataForm.asDict nbxmpp.protocol.DataForm-class.html#asDict nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.protocol.DataForm.getType nbxmpp.protocol.DataForm-class.html#getType nbxmpp.protocol.DataForm.__setitem__ nbxmpp.protocol.DataForm-class.html#__setitem__ nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.protocol.DataForm.getTitle nbxmpp.protocol.DataForm-class.html#getTitle nbxmpp.protocol.DataForm.getInstructions nbxmpp.protocol.DataForm-class.html#getInstructions nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.protocol.DataForm.getField nbxmpp.protocol.DataForm-class.html#getField nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.protocol.DataForm.addInstructions nbxmpp.protocol.DataForm-class.html#addInstructions nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.protocol.Error nbxmpp.protocol.Error-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.protocol.Protocol.setFrom nbxmpp.protocol.Protocol-class.html#setFrom nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.protocol.Protocol.getID nbxmpp.protocol.Protocol-class.html#getID nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.protocol.Protocol.setTo nbxmpp.protocol.Protocol-class.html#setTo nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.protocol.Protocol.setError nbxmpp.protocol.Protocol-class.html#setError nbxmpp.protocol.Error.__init__ nbxmpp.protocol.Error-class.html#__init__ nbxmpp.protocol.Protocol.setType nbxmpp.protocol.Protocol-class.html#setType nbxmpp.protocol.Protocol.getTo nbxmpp.protocol.Protocol-class.html#getTo nbxmpp.protocol.Protocol.getTimestamp2 nbxmpp.protocol.Protocol-class.html#getTimestamp2 nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.protocol.Protocol.getError nbxmpp.protocol.Protocol-class.html#getError nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.protocol.Protocol.getFrom nbxmpp.protocol.Protocol-class.html#getFrom nbxmpp.protocol.Protocol.setTimestamp nbxmpp.protocol.Protocol-class.html#setTimestamp nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.protocol.Protocol.getTimestamp nbxmpp.protocol.Protocol-class.html#getTimestamp nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.protocol.Protocol.getErrorCode nbxmpp.protocol.Protocol-class.html#getErrorCode nbxmpp.protocol.Error.__dupstr__ nbxmpp.protocol.Error-class.html#__dupstr__ nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__ nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.protocol.Protocol.getType nbxmpp.protocol.Protocol-class.html#getType nbxmpp.protocol.Protocol.__setitem__ nbxmpp.protocol.Protocol-class.html#__setitem__ nbxmpp.protocol.Protocol.getStatusConditions nbxmpp.protocol.Protocol-class.html#getStatusConditions nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.protocol.Protocol.setID nbxmpp.protocol.Protocol-class.html#setID nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.protocol.Protocol.getErrorMsg nbxmpp.protocol.Protocol-class.html#getErrorMsg nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.protocol.Protocol.getProperties nbxmpp.protocol.Protocol-class.html#getProperties nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.protocol.ErrorNode nbxmpp.protocol.ErrorNode-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.protocol.ErrorNode.__init__ nbxmpp.protocol.ErrorNode-class.html#__init__ nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__ nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__ nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.protocol.Hashes nbxmpp.protocol.Hashes-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.protocol.Hashes.supported nbxmpp.protocol.Hashes-class.html#supported nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.protocol.Hashes.__init__ nbxmpp.protocol.Hashes-class.html#__init__ nbxmpp.protocol.Hashes.addHash nbxmpp.protocol.Hashes-class.html#addHash nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__ nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.protocol.Hashes.calculateHash nbxmpp.protocol.Hashes-class.html#calculateHash nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__ nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.protocol.HostGone nbxmpp.protocol.HostGone-class.html nbxmpp.protocol.HostUnknown nbxmpp.protocol.HostUnknown-class.html nbxmpp.protocol.ImproperAddressing nbxmpp.protocol.ImproperAddressing-class.html nbxmpp.protocol.InternalServerError nbxmpp.protocol.InternalServerError-class.html nbxmpp.protocol.InvalidFrom nbxmpp.protocol.InvalidFrom-class.html nbxmpp.protocol.InvalidID nbxmpp.protocol.InvalidID-class.html nbxmpp.protocol.InvalidNamespace nbxmpp.protocol.InvalidNamespace-class.html nbxmpp.protocol.InvalidXML nbxmpp.protocol.InvalidXML-class.html nbxmpp.protocol.Iq nbxmpp.protocol.Iq-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.protocol.Protocol.setFrom nbxmpp.protocol.Protocol-class.html#setFrom nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.protocol.Protocol.getID nbxmpp.protocol.Protocol-class.html#getID nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.protocol.Protocol.setTo nbxmpp.protocol.Protocol-class.html#setTo nbxmpp.protocol.Iq.getQueryNS nbxmpp.protocol.Iq-class.html#getQueryNS nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.protocol.Protocol.setError nbxmpp.protocol.Protocol-class.html#setError nbxmpp.protocol.Iq.__init__ nbxmpp.protocol.Iq-class.html#__init__ nbxmpp.protocol.Protocol.setType nbxmpp.protocol.Protocol-class.html#setType nbxmpp.protocol.Protocol.getTo nbxmpp.protocol.Protocol-class.html#getTo nbxmpp.protocol.Protocol.getTimestamp2 nbxmpp.protocol.Protocol-class.html#getTimestamp2 nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__ nbxmpp.protocol.Protocol.getError nbxmpp.protocol.Protocol-class.html#getError nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.protocol.Protocol.getFrom nbxmpp.protocol.Protocol-class.html#getFrom nbxmpp.protocol.Protocol.setTimestamp nbxmpp.protocol.Protocol-class.html#setTimestamp nbxmpp.protocol.Iq.getQueryPayload nbxmpp.protocol.Iq-class.html#getQueryPayload nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.protocol.Protocol.getTimestamp nbxmpp.protocol.Protocol-class.html#getTimestamp nbxmpp.protocol.Iq.setQueryPayload nbxmpp.protocol.Iq-class.html#setQueryPayload nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.protocol.Iq.getQuery nbxmpp.protocol.Iq-class.html#getQuery nbxmpp.protocol.Protocol.getErrorCode nbxmpp.protocol.Protocol-class.html#getErrorCode nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.protocol.Iq.buildReply nbxmpp.protocol.Iq-class.html#buildReply nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.protocol.Protocol.getType nbxmpp.protocol.Protocol-class.html#getType nbxmpp.protocol.Iq.getQueryChildren nbxmpp.protocol.Iq-class.html#getQueryChildren nbxmpp.protocol.Protocol.__setitem__ nbxmpp.protocol.Protocol-class.html#__setitem__ nbxmpp.protocol.Protocol.getStatusConditions nbxmpp.protocol.Protocol-class.html#getStatusConditions nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.protocol.Protocol.setID nbxmpp.protocol.Protocol-class.html#setID nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.protocol.Protocol.getErrorMsg nbxmpp.protocol.Protocol-class.html#getErrorMsg nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.protocol.Iq.getQuerynode nbxmpp.protocol.Iq-class.html#getQuerynode nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.protocol.Iq.setQuery nbxmpp.protocol.Iq-class.html#setQuery nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.protocol.Protocol.getProperties nbxmpp.protocol.Protocol-class.html#getProperties nbxmpp.protocol.Iq.setQueryNS nbxmpp.protocol.Iq-class.html#setQueryNS nbxmpp.protocol.Iq.setQuerynode nbxmpp.protocol.Iq-class.html#setQuerynode nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.protocol.JID nbxmpp.protocol.JID-class.html nbxmpp.protocol.JID.getDomain nbxmpp.protocol.JID-class.html#getDomain nbxmpp.protocol.JID.bareMatch nbxmpp.protocol.JID-class.html#bareMatch nbxmpp.protocol.JID.setNode nbxmpp.protocol.JID-class.html#setNode nbxmpp.protocol.JID.getStripped nbxmpp.protocol.JID-class.html#getStripped nbxmpp.protocol.JID.setResource nbxmpp.protocol.JID-class.html#setResource nbxmpp.protocol.JID.__str__ nbxmpp.protocol.JID-class.html#__str__ nbxmpp.protocol.JID.getResource nbxmpp.protocol.JID-class.html#getResource nbxmpp.protocol.JID.setDomain nbxmpp.protocol.JID-class.html#setDomain nbxmpp.protocol.JID.__hash__ nbxmpp.protocol.JID-class.html#__hash__ nbxmpp.protocol.JID.__ne__ nbxmpp.protocol.JID-class.html#__ne__ nbxmpp.protocol.JID.__eq__ nbxmpp.protocol.JID-class.html#__eq__ nbxmpp.protocol.JID.__init__ nbxmpp.protocol.JID-class.html#__init__ nbxmpp.protocol.JID.getNode nbxmpp.protocol.JID-class.html#getNode nbxmpp.protocol.Message nbxmpp.protocol.Message-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.protocol.Message.getStatusCode nbxmpp.protocol.Message-class.html#getStatusCode nbxmpp.protocol.Protocol.setTo nbxmpp.protocol.Protocol-class.html#setTo nbxmpp.protocol.Protocol.setFrom nbxmpp.protocol.Protocol-class.html#setFrom nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.protocol.Protocol.getID nbxmpp.protocol.Protocol-class.html#getID nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.protocol.Message.getSubject nbxmpp.protocol.Message-class.html#getSubject nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.protocol.Protocol.setError nbxmpp.protocol.Protocol-class.html#setError nbxmpp.protocol.Message.__init__ nbxmpp.protocol.Message-class.html#__init__ nbxmpp.protocol.Protocol.setType nbxmpp.protocol.Protocol-class.html#setType nbxmpp.protocol.Protocol.getTo nbxmpp.protocol.Protocol-class.html#getTo nbxmpp.protocol.Message.setBody nbxmpp.protocol.Message-class.html#setBody nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__ nbxmpp.protocol.Protocol.getError nbxmpp.protocol.Protocol-class.html#getError nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.protocol.Protocol.getFrom nbxmpp.protocol.Protocol-class.html#getFrom nbxmpp.protocol.Protocol.setTimestamp nbxmpp.protocol.Protocol-class.html#setTimestamp nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.protocol.Protocol.getTimestamp nbxmpp.protocol.Protocol-class.html#getTimestamp nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.protocol.Protocol.getErrorCode nbxmpp.protocol.Protocol-class.html#getErrorCode nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.protocol.Message.buildReply nbxmpp.protocol.Message-class.html#buildReply nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.protocol.Message.setThread nbxmpp.protocol.Message-class.html#setThread nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.protocol.Protocol.getType nbxmpp.protocol.Protocol-class.html#getType nbxmpp.protocol.Protocol.__setitem__ nbxmpp.protocol.Protocol-class.html#__setitem__ nbxmpp.protocol.Protocol.getTimestamp2 nbxmpp.protocol.Protocol-class.html#getTimestamp2 nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.protocol.Message.setXHTML nbxmpp.protocol.Message-class.html#setXHTML nbxmpp.protocol.Protocol.setID nbxmpp.protocol.Protocol-class.html#setID nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.protocol.Protocol.getErrorMsg nbxmpp.protocol.Protocol-class.html#getErrorMsg nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.protocol.Message.getThread nbxmpp.protocol.Message-class.html#getThread nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.protocol.Message.setSubject nbxmpp.protocol.Message-class.html#setSubject nbxmpp.protocol.Protocol.getStatusConditions nbxmpp.protocol.Protocol-class.html#getStatusConditions nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.protocol.Protocol.getProperties nbxmpp.protocol.Protocol-class.html#getProperties nbxmpp.protocol.Message.getXHTML nbxmpp.protocol.Message-class.html#getXHTML nbxmpp.protocol.Message.getBody nbxmpp.protocol.Message-class.html#getBody nbxmpp.protocol.NodeProcessed nbxmpp.protocol.NodeProcessed-class.html nbxmpp.protocol.NotAuthorized nbxmpp.protocol.NotAuthorized-class.html nbxmpp.protocol.PolicyViolation nbxmpp.protocol.PolicyViolation-class.html nbxmpp.protocol.Presence nbxmpp.protocol.Presence-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.protocol.Protocol.getFrom nbxmpp.protocol.Protocol-class.html#getFrom nbxmpp.protocol.Presence.getStatusCode nbxmpp.protocol.Presence-class.html#getStatusCode nbxmpp.protocol.Presence.getPriority nbxmpp.protocol.Presence-class.html#getPriority nbxmpp.protocol.Presence.getAffiliation nbxmpp.protocol.Presence-class.html#getAffiliation nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.protocol.Protocol.getID nbxmpp.protocol.Protocol-class.html#getID nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.protocol.Presence.setPriority nbxmpp.protocol.Presence-class.html#setPriority nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.protocol.Protocol.setTo nbxmpp.protocol.Protocol-class.html#setTo nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.protocol.Presence.setStatus nbxmpp.protocol.Presence-class.html#setStatus nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.protocol.Protocol.setError nbxmpp.protocol.Protocol-class.html#setError nbxmpp.protocol.Presence.__init__ nbxmpp.protocol.Presence-class.html#__init__ nbxmpp.protocol.Protocol.setType nbxmpp.protocol.Protocol-class.html#setType nbxmpp.protocol.Presence.getShow nbxmpp.protocol.Presence-class.html#getShow nbxmpp.protocol.Protocol.getTo nbxmpp.protocol.Protocol-class.html#getTo nbxmpp.protocol.Protocol.getTimestamp2 nbxmpp.protocol.Protocol-class.html#getTimestamp2 nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.protocol.Protocol.getError nbxmpp.protocol.Protocol-class.html#getError nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.protocol.Presence.getStatus nbxmpp.protocol.Presence-class.html#getStatus nbxmpp.protocol.Protocol.setTimestamp nbxmpp.protocol.Protocol-class.html#setTimestamp nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.protocol.Presence.getActor nbxmpp.protocol.Presence-class.html#getActor nbxmpp.protocol.Protocol.getTimestamp nbxmpp.protocol.Protocol-class.html#getTimestamp nbxmpp.protocol.Presence.getRole nbxmpp.protocol.Presence-class.html#getRole nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.protocol.Protocol.getErrorCode nbxmpp.protocol.Protocol-class.html#getErrorCode nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__ nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.protocol.Protocol.getType nbxmpp.protocol.Protocol-class.html#getType nbxmpp.protocol.Protocol.__setitem__ nbxmpp.protocol.Protocol-class.html#__setitem__ nbxmpp.protocol.Presence.getJid nbxmpp.protocol.Presence-class.html#getJid nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.protocol.Protocol.setID nbxmpp.protocol.Protocol-class.html#setID nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.protocol.Protocol.getErrorMsg nbxmpp.protocol.Protocol-class.html#getErrorMsg nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.protocol.Presence.setShow nbxmpp.protocol.Presence-class.html#setShow nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.protocol.Presence._muc_getSubTagDataAttr nbxmpp.protocol.Presence-class.html#_muc_getSubTagDataAttr nbxmpp.protocol.Presence.getReason nbxmpp.protocol.Presence-class.html#getReason nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.protocol.Protocol.getStatusConditions nbxmpp.protocol.Protocol-class.html#getStatusConditions nbxmpp.protocol.Presence.getNewNick nbxmpp.protocol.Presence-class.html#getNewNick nbxmpp.protocol.Protocol.getProperties nbxmpp.protocol.Protocol-class.html#getProperties nbxmpp.protocol.Protocol.setFrom nbxmpp.protocol.Protocol-class.html#setFrom nbxmpp.protocol.Presence._muc_getItemAttr nbxmpp.protocol.Presence-class.html#_muc_getItemAttr nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.protocol.Protocol nbxmpp.protocol.Protocol-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.protocol.Protocol.setFrom nbxmpp.protocol.Protocol-class.html#setFrom nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.protocol.Protocol.getID nbxmpp.protocol.Protocol-class.html#getID nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.protocol.Protocol.setTo nbxmpp.protocol.Protocol-class.html#setTo nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.protocol.Protocol.setError nbxmpp.protocol.Protocol-class.html#setError nbxmpp.protocol.Protocol.__init__ nbxmpp.protocol.Protocol-class.html#__init__ nbxmpp.protocol.Protocol.setType nbxmpp.protocol.Protocol-class.html#setType nbxmpp.protocol.Protocol.getTo nbxmpp.protocol.Protocol-class.html#getTo nbxmpp.protocol.Protocol.getTimestamp2 nbxmpp.protocol.Protocol-class.html#getTimestamp2 nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.protocol.Protocol.getError nbxmpp.protocol.Protocol-class.html#getError nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.protocol.Protocol.getFrom nbxmpp.protocol.Protocol-class.html#getFrom nbxmpp.protocol.Protocol.setTimestamp nbxmpp.protocol.Protocol-class.html#setTimestamp nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.protocol.Protocol.getTimestamp nbxmpp.protocol.Protocol-class.html#getTimestamp nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.protocol.Protocol.getErrorCode nbxmpp.protocol.Protocol-class.html#getErrorCode nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__ nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.protocol.Protocol.getType nbxmpp.protocol.Protocol-class.html#getType nbxmpp.protocol.Protocol.__setitem__ nbxmpp.protocol.Protocol-class.html#__setitem__ nbxmpp.protocol.Protocol.getStatusConditions nbxmpp.protocol.Protocol-class.html#getStatusConditions nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.protocol.Protocol.setID nbxmpp.protocol.Protocol-class.html#setID nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.protocol.Protocol.getErrorMsg nbxmpp.protocol.Protocol-class.html#getErrorMsg nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.protocol.Protocol.getProperties nbxmpp.protocol.Protocol-class.html#getProperties nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.protocol.RemoteConnectionFailed nbxmpp.protocol.RemoteConnectionFailed-class.html nbxmpp.protocol.ResourceConstraint nbxmpp.protocol.ResourceConstraint-class.html nbxmpp.protocol.RestrictedXML nbxmpp.protocol.RestrictedXML-class.html nbxmpp.protocol.SeeOtherHost nbxmpp.protocol.SeeOtherHost-class.html nbxmpp.protocol.StreamError nbxmpp.protocol.StreamError-class.html nbxmpp.protocol.SystemShutdown nbxmpp.protocol.SystemShutdown-class.html nbxmpp.protocol.UndefinedCondition nbxmpp.protocol.UndefinedCondition-class.html nbxmpp.protocol.UnsupportedEncoding nbxmpp.protocol.UnsupportedEncoding-class.html nbxmpp.protocol.UnsupportedStanzaType nbxmpp.protocol.UnsupportedStanzaType-class.html nbxmpp.protocol.UnsupportedVersion nbxmpp.protocol.UnsupportedVersion-class.html nbxmpp.protocol.XMLNotWellFormed nbxmpp.protocol.XMLNotWellFormed-class.html nbxmpp.proxy_connectors.HTTPCONNECTConnector nbxmpp.proxy_connectors.HTTPCONNECTConnector-class.html nbxmpp.proxy_connectors.HTTPCONNECTConnector._on_headers_sent nbxmpp.proxy_connectors.HTTPCONNECTConnector-class.html#_on_headers_sent nbxmpp.proxy_connectors.HTTPCONNECTConnector.start_connecting nbxmpp.proxy_connectors.HTTPCONNECTConnector-class.html#start_connecting nbxmpp.proxy_connectors.ProxyConnector.connecting_over nbxmpp.proxy_connectors.ProxyConnector-class.html#connecting_over nbxmpp.proxy_connectors.ProxyConnector.__init__ nbxmpp.proxy_connectors.ProxyConnector-class.html#__init__ nbxmpp.proxy_connectors.ProxyConnector.get_instance nbxmpp.proxy_connectors.ProxyConnector-class.html#get_instance nbxmpp.proxy_connectors.ProxyConnector nbxmpp.proxy_connectors.ProxyConnector-class.html nbxmpp.proxy_connectors.ProxyConnector.connecting_over nbxmpp.proxy_connectors.ProxyConnector-class.html#connecting_over nbxmpp.proxy_connectors.ProxyConnector.start_connecting nbxmpp.proxy_connectors.ProxyConnector-class.html#start_connecting nbxmpp.proxy_connectors.ProxyConnector.get_instance nbxmpp.proxy_connectors.ProxyConnector-class.html#get_instance nbxmpp.proxy_connectors.ProxyConnector.__init__ nbxmpp.proxy_connectors.ProxyConnector-class.html#__init__ nbxmpp.proxy_connectors.SOCKS5Connector nbxmpp.proxy_connectors.SOCKS5Connector-class.html nbxmpp.proxy_connectors.ProxyConnector.connecting_over nbxmpp.proxy_connectors.ProxyConnector-class.html#connecting_over nbxmpp.proxy_connectors.SOCKS5Connector._on_proxy_auth nbxmpp.proxy_connectors.SOCKS5Connector-class.html#_on_proxy_auth nbxmpp.proxy_connectors.SOCKS5Connector.start_connecting nbxmpp.proxy_connectors.SOCKS5Connector-class.html#start_connecting nbxmpp.proxy_connectors.SOCKS5Connector._on_req_sent nbxmpp.proxy_connectors.SOCKS5Connector-class.html#_on_req_sent nbxmpp.proxy_connectors.SOCKS5Connector._on_greeting_sent nbxmpp.proxy_connectors.SOCKS5Connector-class.html#_on_greeting_sent nbxmpp.proxy_connectors.ProxyConnector.__init__ nbxmpp.proxy_connectors.ProxyConnector-class.html#__init__ nbxmpp.proxy_connectors.ProxyConnector.get_instance nbxmpp.proxy_connectors.ProxyConnector-class.html#get_instance nbxmpp.roster_nb.NonBlockingRoster nbxmpp.roster_nb.NonBlockingRoster-class.html nbxmpp.roster_nb.NonBlockingRoster.getRaw nbxmpp.roster_nb.NonBlockingRoster-class.html#getRaw nbxmpp.roster_nb.NonBlockingRoster._getResourceData nbxmpp.roster_nb.NonBlockingRoster-class.html#_getResourceData nbxmpp.roster_nb.NonBlockingRoster.getGroups nbxmpp.roster_nb.NonBlockingRoster-class.html#getGroups nbxmpp.roster_nb.NonBlockingRoster.getPriority nbxmpp.roster_nb.NonBlockingRoster-class.html#getPriority nbxmpp.roster_nb.NonBlockingRoster._on_roster_set nbxmpp.roster_nb.NonBlockingRoster-class.html#_on_roster_set nbxmpp.roster_nb.NonBlockingRoster.getRawRoster nbxmpp.roster_nb.NonBlockingRoster-class.html#getRawRoster nbxmpp.roster_nb.NonBlockingRoster.PresenceHandler nbxmpp.roster_nb.NonBlockingRoster-class.html#PresenceHandler nbxmpp.roster_nb.NonBlockingRoster._getItemData nbxmpp.roster_nb.NonBlockingRoster-class.html#_getItemData nbxmpp.roster_nb.NonBlockingRoster.__init__ nbxmpp.roster_nb.NonBlockingRoster-class.html#__init__ nbxmpp.roster_nb.NonBlockingRoster.getShow nbxmpp.roster_nb.NonBlockingRoster-class.html#getShow nbxmpp.roster_nb.NonBlockingRoster.getRoster nbxmpp.roster_nb.NonBlockingRoster-class.html#getRoster nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.roster_nb.NonBlockingRoster.getName nbxmpp.roster_nb.NonBlockingRoster-class.html#getName nbxmpp.roster_nb.NonBlockingRoster.getStatus nbxmpp.roster_nb.NonBlockingRoster-class.html#getStatus nbxmpp.roster_nb.NonBlockingRoster.Unauthorize nbxmpp.roster_nb.NonBlockingRoster-class.html#Unauthorize nbxmpp.roster_nb.NonBlockingRoster.Unsubscribe nbxmpp.roster_nb.NonBlockingRoster-class.html#Unsubscribe nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.roster_nb.NonBlockingRoster.RosterIqHandler nbxmpp.roster_nb.NonBlockingRoster-class.html#RosterIqHandler nbxmpp.roster_nb.NonBlockingRoster.getRawItem nbxmpp.roster_nb.NonBlockingRoster-class.html#getRawItem nbxmpp.roster_nb.NonBlockingRoster.getItems nbxmpp.roster_nb.NonBlockingRoster-class.html#getItems nbxmpp.roster_nb.NonBlockingRoster.__getitem__ nbxmpp.roster_nb.NonBlockingRoster-class.html#__getitem__ nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.roster_nb.NonBlockingRoster.keys nbxmpp.roster_nb.NonBlockingRoster-class.html#keys nbxmpp.roster_nb.NonBlockingRoster.Request nbxmpp.roster_nb.NonBlockingRoster-class.html#Request nbxmpp.roster_nb.NonBlockingRoster.getAsk nbxmpp.roster_nb.NonBlockingRoster-class.html#getAsk nbxmpp.roster_nb.NonBlockingRoster.setItem nbxmpp.roster_nb.NonBlockingRoster-class.html#setItem nbxmpp.roster_nb.NonBlockingRoster.setItemMulti nbxmpp.roster_nb.NonBlockingRoster-class.html#setItemMulti nbxmpp.roster_nb.NonBlockingRoster.getItem nbxmpp.roster_nb.NonBlockingRoster-class.html#getItem nbxmpp.roster_nb.NonBlockingRoster.Authorize nbxmpp.roster_nb.NonBlockingRoster-class.html#Authorize nbxmpp.roster_nb.NonBlockingRoster.plugin nbxmpp.roster_nb.NonBlockingRoster-class.html#plugin nbxmpp.roster_nb.NonBlockingRoster.Subscribe nbxmpp.roster_nb.NonBlockingRoster-class.html#Subscribe nbxmpp.roster_nb.NonBlockingRoster.setRaw nbxmpp.roster_nb.NonBlockingRoster-class.html#setRaw nbxmpp.roster_nb.NonBlockingRoster.delItem nbxmpp.roster_nb.NonBlockingRoster-class.html#delItem nbxmpp.roster_nb.NonBlockingRoster.getSubscription nbxmpp.roster_nb.NonBlockingRoster-class.html#getSubscription nbxmpp.roster_nb.NonBlockingRoster.getResources nbxmpp.roster_nb.NonBlockingRoster-class.html#getResources nbxmpp.simplexml.NT nbxmpp.simplexml.NT-class.html nbxmpp.simplexml.T.__delattr__ nbxmpp.simplexml.T-class.html#__delattr__ nbxmpp.simplexml.NT.__setattr__ nbxmpp.simplexml.NT-class.html#__setattr__ nbxmpp.simplexml.T.__init__ nbxmpp.simplexml.T-class.html#__init__ nbxmpp.simplexml.NT.__getattr__ nbxmpp.simplexml.NT-class.html#__getattr__ nbxmpp.simplexml.Node nbxmpp.simplexml.Node-class.html nbxmpp.simplexml.Node.addChild nbxmpp.simplexml.Node-class.html#addChild nbxmpp.simplexml.Node.getAttrs nbxmpp.simplexml.Node-class.html#getAttrs nbxmpp.simplexml.Node.delAttr nbxmpp.simplexml.Node-class.html#delAttr nbxmpp.simplexml.Node.setNamespace nbxmpp.simplexml.Node-class.html#setNamespace nbxmpp.simplexml.Node.__str__ nbxmpp.simplexml.Node-class.html#__str__ nbxmpp.simplexml.Node.getNamespace nbxmpp.simplexml.Node-class.html#getNamespace nbxmpp.simplexml.Node.getChildren nbxmpp.simplexml.Node-class.html#getChildren nbxmpp.simplexml.Node.has_attr nbxmpp.simplexml.Node-class.html#has_attr nbxmpp.simplexml.Node.__init__ nbxmpp.simplexml.Node-class.html#__init__ nbxmpp.simplexml.Node.__getitem__ nbxmpp.simplexml.Node-class.html#__getitem__ nbxmpp.simplexml.Node.clearData nbxmpp.simplexml.Node-class.html#clearData nbxmpp.simplexml.Node.__contains__ nbxmpp.simplexml.Node-class.html#__contains__ nbxmpp.simplexml.Node.setParent nbxmpp.simplexml.Node-class.html#setParent nbxmpp.simplexml.Node.getName nbxmpp.simplexml.Node-class.html#getName nbxmpp.simplexml.Node.__getattr__ nbxmpp.simplexml.Node-class.html#__getattr__ nbxmpp.simplexml.Node.getData nbxmpp.simplexml.Node-class.html#getData nbxmpp.simplexml.Node.lookup_nsp nbxmpp.simplexml.Node-class.html#lookup_nsp nbxmpp.simplexml.Node.setData nbxmpp.simplexml.Node-class.html#setData nbxmpp.simplexml.Node.setTagData nbxmpp.simplexml.Node-class.html#setTagData nbxmpp.simplexml.Node.setName nbxmpp.simplexml.Node-class.html#setName nbxmpp.simplexml.Node.getTagAttr nbxmpp.simplexml.Node-class.html#getTagAttr nbxmpp.simplexml.Node.__setitem__ nbxmpp.simplexml.Node-class.html#__setitem__ nbxmpp.simplexml.Node.getPayload nbxmpp.simplexml.Node-class.html#getPayload nbxmpp.simplexml.Node.iterTags nbxmpp.simplexml.Node-class.html#iterTags nbxmpp.simplexml.Node.getTag nbxmpp.simplexml.Node-class.html#getTag nbxmpp.simplexml.Node.setTagAttr nbxmpp.simplexml.Node-class.html#setTagAttr nbxmpp.simplexml.Node.getTags nbxmpp.simplexml.Node-class.html#getTags nbxmpp.simplexml.Node.__delitem__ nbxmpp.simplexml.Node-class.html#__delitem__ nbxmpp.simplexml.Node.getTagData nbxmpp.simplexml.Node-class.html#getTagData nbxmpp.simplexml.Node.getParent nbxmpp.simplexml.Node-class.html#getParent nbxmpp.simplexml.Node.delChild nbxmpp.simplexml.Node-class.html#delChild nbxmpp.simplexml.Node.setAttr nbxmpp.simplexml.Node-class.html#setAttr nbxmpp.simplexml.Node.getAttr nbxmpp.simplexml.Node-class.html#getAttr nbxmpp.simplexml.Node.addData nbxmpp.simplexml.Node-class.html#addData nbxmpp.simplexml.Node.setPayload nbxmpp.simplexml.Node-class.html#setPayload nbxmpp.simplexml.Node.FORCE_NODE_RECREATION nbxmpp.simplexml.Node-class.html#FORCE_NODE_RECREATION nbxmpp.simplexml.Node.setTag nbxmpp.simplexml.Node-class.html#setTag nbxmpp.simplexml.NodeBuilder nbxmpp.simplexml.NodeBuilder-class.html nbxmpp.simplexml.NodeBuilder.stream_header_received nbxmpp.simplexml.NodeBuilder-class.html#stream_header_received nbxmpp.simplexml.NodeBuilder._dec_depth nbxmpp.simplexml.NodeBuilder-class.html#_dec_depth nbxmpp.simplexml.NodeBuilder.starttag nbxmpp.simplexml.NodeBuilder-class.html#starttag nbxmpp.simplexml.NodeBuilder.endtag nbxmpp.simplexml.NodeBuilder-class.html#endtag nbxmpp.simplexml.NodeBuilder.check_data_buffer nbxmpp.simplexml.NodeBuilder-class.html#check_data_buffer nbxmpp.simplexml.NodeBuilder.handle_cdata nbxmpp.simplexml.NodeBuilder-class.html#handle_cdata nbxmpp.simplexml.NodeBuilder.getDom nbxmpp.simplexml.NodeBuilder-class.html#getDom nbxmpp.simplexml.NodeBuilder.dispatch nbxmpp.simplexml.NodeBuilder-class.html#dispatch nbxmpp.simplexml.NodeBuilder.stream_footer_received nbxmpp.simplexml.NodeBuilder-class.html#stream_footer_received nbxmpp.simplexml.NodeBuilder.has_received_endtag nbxmpp.simplexml.NodeBuilder-class.html#has_received_endtag nbxmpp.simplexml.NodeBuilder.destroy nbxmpp.simplexml.NodeBuilder-class.html#destroy nbxmpp.simplexml.NodeBuilder._inc_depth nbxmpp.simplexml.NodeBuilder-class.html#_inc_depth nbxmpp.simplexml.NodeBuilder.__init__ nbxmpp.simplexml.NodeBuilder-class.html#__init__ nbxmpp.simplexml.NodeBuilder.handle_namespace_start nbxmpp.simplexml.NodeBuilder-class.html#handle_namespace_start nbxmpp.simplexml.T nbxmpp.simplexml.T-class.html nbxmpp.simplexml.T.__delattr__ nbxmpp.simplexml.T-class.html#__delattr__ nbxmpp.simplexml.T.__setattr__ nbxmpp.simplexml.T-class.html#__setattr__ nbxmpp.simplexml.T.__init__ nbxmpp.simplexml.T-class.html#__init__ nbxmpp.simplexml.T.__getattr__ nbxmpp.simplexml.T-class.html#__getattr__ nbxmpp.smacks.Smacks nbxmpp.smacks.Smacks-class.html nbxmpp.smacks.Smacks.resume_request nbxmpp.smacks.Smacks-class.html#resume_request nbxmpp.smacks.Smacks.send_ack nbxmpp.smacks.Smacks-class.html#send_ack nbxmpp.smacks.Smacks.check_ack nbxmpp.smacks.Smacks-class.html#check_ack nbxmpp.smacks.Smacks.negociate nbxmpp.smacks.Smacks-class.html#negociate nbxmpp.smacks.Smacks.request_ack nbxmpp.smacks.Smacks-class.html#request_ack nbxmpp.smacks.Smacks._neg_response nbxmpp.smacks.Smacks-class.html#_neg_response nbxmpp.smacks.Smacks.error_handling nbxmpp.smacks.Smacks-class.html#error_handling nbxmpp.smacks.Smacks.set_owner nbxmpp.smacks.Smacks-class.html#set_owner nbxmpp.smacks.Smacks.__init__ nbxmpp.smacks.Smacks-class.html#__init__ nbxmpp.stringprepare.EmptyMappingTable nbxmpp.stringprepare.EmptyMappingTable-class.html nbxmpp.stringprepare.EmptyMappingTable.__implements__ nbxmpp.stringprepare.IMappingTable-class.html nbxmpp.stringprepare.EmptyMappingTable.map nbxmpp.stringprepare.EmptyMappingTable-class.html#map nbxmpp.stringprepare.EmptyMappingTable.__init__ nbxmpp.stringprepare.EmptyMappingTable-class.html#__init__ nbxmpp.stringprepare.ILookupTable nbxmpp.stringprepare.ILookupTable-class.html nbxmpp.stringprepare.ILookupTable.lookup nbxmpp.stringprepare.ILookupTable-class.html#lookup nbxmpp.stringprepare.IMappingTable nbxmpp.stringprepare.IMappingTable-class.html nbxmpp.stringprepare.IMappingTable.map nbxmpp.stringprepare.IMappingTable-class.html#map nbxmpp.stringprepare.LookupTable nbxmpp.stringprepare.LookupTable-class.html nbxmpp.stringprepare.LookupTable.__implements__ nbxmpp.stringprepare.ILookupTable-class.html nbxmpp.stringprepare.LookupTable.lookup nbxmpp.stringprepare.LookupTable-class.html#lookup nbxmpp.stringprepare.LookupTable.__init__ nbxmpp.stringprepare.LookupTable-class.html#__init__ nbxmpp.stringprepare.LookupTableFromFunction nbxmpp.stringprepare.LookupTableFromFunction-class.html nbxmpp.stringprepare.LookupTableFromFunction.__implements__ nbxmpp.stringprepare.ILookupTable-class.html nbxmpp.stringprepare.LookupTableFromFunction.__init__ nbxmpp.stringprepare.LookupTableFromFunction-class.html#__init__ nbxmpp.stringprepare.MappingTableFromFunction nbxmpp.stringprepare.MappingTableFromFunction-class.html nbxmpp.stringprepare.MappingTableFromFunction.__implements__ nbxmpp.stringprepare.IMappingTable-class.html nbxmpp.stringprepare.MappingTableFromFunction.__init__ nbxmpp.stringprepare.MappingTableFromFunction-class.html#__init__ nbxmpp.stringprepare.NamePrep nbxmpp.stringprepare.NamePrep-class.html nbxmpp.stringprepare.NamePrep.prohibiteds nbxmpp.stringprepare.NamePrep-class.html#prohibiteds nbxmpp.stringprepare.NamePrep.nameprep nbxmpp.stringprepare.NamePrep-class.html#nameprep nbxmpp.stringprepare.NamePrep.check_prohibiteds nbxmpp.stringprepare.NamePrep-class.html#check_prohibiteds nbxmpp.stringprepare.NamePrep.prepare nbxmpp.stringprepare.NamePrep-class.html#prepare nbxmpp.stringprepare.NamePrep.n nbxmpp.stringprepare.NamePrep-class.html#n nbxmpp.stringprepare.Profile nbxmpp.stringprepare.Profile-class.html nbxmpp.stringprepare.Profile.check_unassigneds nbxmpp.stringprepare.Profile-class.html#check_unassigneds nbxmpp.stringprepare.Profile.map nbxmpp.stringprepare.Profile-class.html#map nbxmpp.stringprepare.Profile.check_prohibiteds nbxmpp.stringprepare.Profile-class.html#check_prohibiteds nbxmpp.stringprepare.Profile.prepare nbxmpp.stringprepare.Profile-class.html#prepare nbxmpp.stringprepare.Profile.check_bidirectionals nbxmpp.stringprepare.Profile-class.html#check_bidirectionals nbxmpp.stringprepare.Profile.__init__ nbxmpp.stringprepare.Profile-class.html#__init__ nbxmpp.tls_nb.NonBlockingTLS nbxmpp.tls_nb.NonBlockingTLS-class.html nbxmpp.tls_nb.NonBlockingTLS._dumpX509 nbxmpp.tls_nb.NonBlockingTLS-class.html#_dumpX509 nbxmpp.tls_nb.NonBlockingTLS.ssl_h_bits nbxmpp.tls_nb.NonBlockingTLS-class.html#ssl_h_bits nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.tls_nb.NonBlockingTLS._startSSL_pyOpenSSL nbxmpp.tls_nb.NonBlockingTLS-class.html#_startSSL_pyOpenSSL nbxmpp.tls_nb.NonBlockingTLS.plugin nbxmpp.tls_nb.NonBlockingTLS-class.html#plugin nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.tls_nb.NonBlockingTLS._dumpX509Name nbxmpp.tls_nb.NonBlockingTLS-class.html#_dumpX509Name nbxmpp.tls_nb.NonBlockingTLS._load_cert_file nbxmpp.tls_nb.NonBlockingTLS-class.html#_load_cert_file nbxmpp.tls_nb.NonBlockingTLS._dumpPKey nbxmpp.tls_nb.NonBlockingTLS-class.html#_dumpPKey nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.tls_nb.NonBlockingTLS._startSSL nbxmpp.tls_nb.NonBlockingTLS-class.html#_startSSL nbxmpp.tls_nb.NonBlockingTLS._startSSL_stdlib nbxmpp.tls_nb.NonBlockingTLS-class.html#_startSSL_stdlib nbxmpp.tls_nb.NonBlockingTLS._ssl_verify_callback nbxmpp.tls_nb.NonBlockingTLS-class.html#_ssl_verify_callback nbxmpp.tls_nb.NonBlockingTLS.__init__ nbxmpp.tls_nb.NonBlockingTLS-class.html#__init__ nbxmpp.tls_nb.PyOpenSSLWrapper nbxmpp.tls_nb.PyOpenSSLWrapper-class.html nbxmpp.tls_nb.PyOpenSSLWrapper.recv nbxmpp.tls_nb.PyOpenSSLWrapper-class.html#recv nbxmpp.tls_nb.PyOpenSSLWrapper.is_numtoolarge nbxmpp.tls_nb.PyOpenSSLWrapper-class.html#is_numtoolarge nbxmpp.tls_nb.PyOpenSSLWrapper.__init__ nbxmpp.tls_nb.PyOpenSSLWrapper-class.html#__init__ nbxmpp.tls_nb.PyOpenSSLWrapper.send nbxmpp.tls_nb.PyOpenSSLWrapper-class.html#send nbxmpp.tls_nb.SSLWrapper.Error nbxmpp.tls_nb.SSLWrapper.Error-class.html nbxmpp.tls_nb.SSLWrapper nbxmpp.tls_nb.SSLWrapper-class.html nbxmpp.tls_nb.SSLWrapper.recv nbxmpp.tls_nb.SSLWrapper-class.html#recv nbxmpp.tls_nb.SSLWrapper.__init__ nbxmpp.tls_nb.SSLWrapper-class.html#__init__ nbxmpp.tls_nb.SSLWrapper.send nbxmpp.tls_nb.SSLWrapper-class.html#send nbxmpp.tls_nb.SSLWrapper.Error nbxmpp.tls_nb.SSLWrapper.Error-class.html nbxmpp.tls_nb.SSLWrapper.Error nbxmpp.tls_nb.SSLWrapper.Error-class.html nbxmpp.tls_nb.SSLWrapper.Error.__str__ nbxmpp.tls_nb.SSLWrapper.Error-class.html#__str__ nbxmpp.tls_nb.SSLWrapper.Error.__init__ nbxmpp.tls_nb.SSLWrapper.Error-class.html#__init__ nbxmpp.tls_nb.StdlibSSLWrapper nbxmpp.tls_nb.StdlibSSLWrapper-class.html nbxmpp.tls_nb.StdlibSSLWrapper.recv nbxmpp.tls_nb.StdlibSSLWrapper-class.html#recv nbxmpp.tls_nb.StdlibSSLWrapper.__init__ nbxmpp.tls_nb.StdlibSSLWrapper-class.html#__init__ nbxmpp.tls_nb.StdlibSSLWrapper.send nbxmpp.tls_nb.StdlibSSLWrapper-class.html#send nbxmpp.tls_nb.SSLWrapper.Error nbxmpp.tls_nb.SSLWrapper.Error-class.html nbxmpp.transports_nb.NonBlockingHTTP nbxmpp.transports_nb.NonBlockingHTTP-class.html nbxmpp.transports_nb.NonBlockingTransport._tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport-class.html#_tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport.set_state nbxmpp.transports_nb.NonBlockingTransport-class.html#set_state nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport.plugout nbxmpp.transports_nb.NonBlockingTransport-class.html#plugout nbxmpp.transports_nb.NonBlockingTCP._on_connect nbxmpp.transports_nb.NonBlockingTCP-class.html#_on_connect nbxmpp.transports_nb.NonBlockingTransport.read_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout2 nbxmpp.transports_nb.NonBlockingTCP.connect nbxmpp.transports_nb.NonBlockingTCP-class.html#connect nbxmpp.transports_nb.NonBlockingHTTP.parse_http_message nbxmpp.transports_nb.NonBlockingHTTP-class.html#parse_http_message nbxmpp.transports_nb.NonBlockingTCP.read_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#read_timeout nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout nbxmpp.transports_nb.NonBlockingTCP.encode_stanza nbxmpp.transports_nb.NonBlockingTCP-class.html#encode_stanza nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout2 nbxmpp.transports_nb.NonBlockingHTTP.__init__ nbxmpp.transports_nb.NonBlockingHTTP-class.html#__init__ nbxmpp.transports_nb.NonBlockingTCP._do_receive nbxmpp.transports_nb.NonBlockingTCP-class.html#_do_receive nbxmpp.transports_nb.NonBlockingTCP.disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#disconnect nbxmpp.transports_nb.NonBlockingHTTP.build_http_message nbxmpp.transports_nb.NonBlockingHTTP-class.html#build_http_message nbxmpp.transports_nb.NonBlockingTCP._do_send nbxmpp.transports_nb.NonBlockingTCP-class.html#_do_send nbxmpp.transports_nb.NonBlockingTCP.send nbxmpp.transports_nb.NonBlockingTCP-class.html#send nbxmpp.transports_nb.NonBlockingTCP.tls_init nbxmpp.transports_nb.NonBlockingTCP-class.html#tls_init nbxmpp.transports_nb.NonBlockingTCP._connect_to_proxy nbxmpp.transports_nb.NonBlockingTCP-class.html#_connect_to_proxy nbxmpp.transports_nb.NonBlockingTCP.pollin nbxmpp.transports_nb.NonBlockingTCP-class.html#pollin nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.transports_nb.NonBlockingHTTP._on_receive nbxmpp.transports_nb.NonBlockingHTTP-class.html#_on_receive nbxmpp.transports_nb.NonBlockingHTTP.http_send nbxmpp.transports_nb.NonBlockingHTTP-class.html#http_send nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.transports_nb.NonBlockingTCP._plug_idle nbxmpp.transports_nb.NonBlockingTCP-class.html#_plug_idle nbxmpp.transports_nb.NonBlockingTransport.onreceive nbxmpp.transports_nb.NonBlockingTransport-class.html#onreceive nbxmpp.idlequeue.IdleObject.fd nbxmpp.idlequeue.IdleObject-class.html#fd nbxmpp.transports_nb.NonBlockingTransport.get_state nbxmpp.transports_nb.NonBlockingTransport-class.html#get_state nbxmpp.transports_nb.NonBlockingTCP.pollout nbxmpp.transports_nb.NonBlockingTCP-class.html#pollout nbxmpp.transports_nb.NonBlockingTransport._on_connect_failure nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect_failure nbxmpp.transports_nb.NonBlockingTransport.plugin nbxmpp.transports_nb.NonBlockingTransport-class.html#plugin nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.transports_nb.NonBlockingTransport.set_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout2 nbxmpp.transports_nb.NonBlockingTCP.pollend nbxmpp.transports_nb.NonBlockingTCP-class.html#pollend nbxmpp.transports_nb.NonBlockingTransport.get_fd nbxmpp.transports_nb.NonBlockingTransport-class.html#get_fd nbxmpp.transports_nb.NonBlockingTCP.remove_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#remove_timeout nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout2 nbxmpp.transports_nb.NonBlockingTCP.set_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#set_timeout nbxmpp.transports_nb.NonBlockingTCP.start_disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#start_disconnect nbxmpp.transports_nb.NonBlockingHTTPBOSH nbxmpp.transports_nb.NonBlockingHTTPBOSH-class.html nbxmpp.transports_nb.NonBlockingTransport._tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport-class.html#_tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport.set_state nbxmpp.transports_nb.NonBlockingTransport-class.html#set_state nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport.plugout nbxmpp.transports_nb.NonBlockingTransport-class.html#plugout nbxmpp.transports_nb.NonBlockingTCP._on_connect nbxmpp.transports_nb.NonBlockingTCP-class.html#_on_connect nbxmpp.transports_nb.NonBlockingTransport.read_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout2 nbxmpp.transports_nb.NonBlockingTCP.connect nbxmpp.transports_nb.NonBlockingTCP-class.html#connect nbxmpp.transports_nb.NonBlockingHTTP.parse_http_message nbxmpp.transports_nb.NonBlockingHTTP-class.html#parse_http_message nbxmpp.transports_nb.NonBlockingTCP.read_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#read_timeout nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout nbxmpp.transports_nb.NonBlockingTCP.encode_stanza nbxmpp.transports_nb.NonBlockingTCP-class.html#encode_stanza nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout2 nbxmpp.transports_nb.NonBlockingHTTP.__init__ nbxmpp.transports_nb.NonBlockingHTTP-class.html#__init__ nbxmpp.transports_nb.NonBlockingHTTPBOSH.set_stanza_build_cb nbxmpp.transports_nb.NonBlockingHTTPBOSH-class.html#set_stanza_build_cb nbxmpp.transports_nb.NonBlockingTCP._do_receive nbxmpp.transports_nb.NonBlockingTCP-class.html#_do_receive nbxmpp.transports_nb.NonBlockingTCP.disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#disconnect nbxmpp.transports_nb.NonBlockingHTTP.build_http_message nbxmpp.transports_nb.NonBlockingHTTP-class.html#build_http_message nbxmpp.transports_nb.NonBlockingHTTPBOSH._do_send nbxmpp.transports_nb.NonBlockingHTTPBOSH-class.html#_do_send nbxmpp.transports_nb.NonBlockingTCP.send nbxmpp.transports_nb.NonBlockingTCP-class.html#send nbxmpp.transports_nb.NonBlockingTCP.tls_init nbxmpp.transports_nb.NonBlockingTCP-class.html#tls_init nbxmpp.transports_nb.NonBlockingTCP._connect_to_proxy nbxmpp.transports_nb.NonBlockingTCP-class.html#_connect_to_proxy nbxmpp.transports_nb.NonBlockingTCP.pollin nbxmpp.transports_nb.NonBlockingTCP-class.html#pollin nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.transports_nb.NonBlockingHTTP._on_receive nbxmpp.transports_nb.NonBlockingHTTP-class.html#_on_receive nbxmpp.transports_nb.NonBlockingHTTP.http_send nbxmpp.transports_nb.NonBlockingHTTP-class.html#http_send nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.transports_nb.NonBlockingTCP._plug_idle nbxmpp.transports_nb.NonBlockingTCP-class.html#_plug_idle nbxmpp.transports_nb.NonBlockingTransport.onreceive nbxmpp.transports_nb.NonBlockingTransport-class.html#onreceive nbxmpp.idlequeue.IdleObject.fd nbxmpp.idlequeue.IdleObject-class.html#fd nbxmpp.transports_nb.NonBlockingTransport.get_state nbxmpp.transports_nb.NonBlockingTransport-class.html#get_state nbxmpp.transports_nb.NonBlockingTCP.pollout nbxmpp.transports_nb.NonBlockingTCP-class.html#pollout nbxmpp.transports_nb.NonBlockingTransport._on_connect_failure nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect_failure nbxmpp.transports_nb.NonBlockingTransport.plugin nbxmpp.transports_nb.NonBlockingTransport-class.html#plugin nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.transports_nb.NonBlockingTransport.set_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout2 nbxmpp.transports_nb.NonBlockingTCP.pollend nbxmpp.transports_nb.NonBlockingTCP-class.html#pollend nbxmpp.transports_nb.NonBlockingTransport.get_fd nbxmpp.transports_nb.NonBlockingTransport-class.html#get_fd nbxmpp.transports_nb.NonBlockingTCP.remove_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#remove_timeout nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout2 nbxmpp.transports_nb.NonBlockingTCP.set_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#set_timeout nbxmpp.transports_nb.NonBlockingTCP.start_disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#start_disconnect nbxmpp.transports_nb.NonBlockingTCP nbxmpp.transports_nb.NonBlockingTCP-class.html nbxmpp.transports_nb.NonBlockingTransport._tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport-class.html#_tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport.set_state nbxmpp.transports_nb.NonBlockingTransport-class.html#set_state nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport.plugout nbxmpp.transports_nb.NonBlockingTransport-class.html#plugout nbxmpp.transports_nb.NonBlockingTCP._on_connect nbxmpp.transports_nb.NonBlockingTCP-class.html#_on_connect nbxmpp.transports_nb.NonBlockingTransport.read_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout2 nbxmpp.transports_nb.NonBlockingTCP.connect nbxmpp.transports_nb.NonBlockingTCP-class.html#connect nbxmpp.transports_nb.NonBlockingTCP.read_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#read_timeout nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout nbxmpp.transports_nb.NonBlockingTCP.encode_stanza nbxmpp.transports_nb.NonBlockingTCP-class.html#encode_stanza nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTCP.__init__ nbxmpp.transports_nb.NonBlockingTCP-class.html#__init__ nbxmpp.transports_nb.NonBlockingTCP._do_receive nbxmpp.transports_nb.NonBlockingTCP-class.html#_do_receive nbxmpp.transports_nb.NonBlockingTCP.disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#disconnect nbxmpp.transports_nb.NonBlockingTCP.pollend nbxmpp.transports_nb.NonBlockingTCP-class.html#pollend nbxmpp.transports_nb.NonBlockingTCP.send nbxmpp.transports_nb.NonBlockingTCP-class.html#send nbxmpp.transports_nb.NonBlockingTCP.tls_init nbxmpp.transports_nb.NonBlockingTCP-class.html#tls_init nbxmpp.transports_nb.NonBlockingTCP._connect_to_proxy nbxmpp.transports_nb.NonBlockingTCP-class.html#_connect_to_proxy nbxmpp.transports_nb.NonBlockingTCP.pollin nbxmpp.transports_nb.NonBlockingTCP-class.html#pollin nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.transports_nb.NonBlockingTCP._on_receive nbxmpp.transports_nb.NonBlockingTCP-class.html#_on_receive nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.transports_nb.NonBlockingTCP._plug_idle nbxmpp.transports_nb.NonBlockingTCP-class.html#_plug_idle nbxmpp.transports_nb.NonBlockingTransport.onreceive nbxmpp.transports_nb.NonBlockingTransport-class.html#onreceive nbxmpp.idlequeue.IdleObject.fd nbxmpp.idlequeue.IdleObject-class.html#fd nbxmpp.transports_nb.NonBlockingTransport.get_state nbxmpp.transports_nb.NonBlockingTransport-class.html#get_state nbxmpp.transports_nb.NonBlockingTCP.pollout nbxmpp.transports_nb.NonBlockingTCP-class.html#pollout nbxmpp.transports_nb.NonBlockingTransport._on_connect_failure nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect_failure nbxmpp.transports_nb.NonBlockingTransport.plugin nbxmpp.transports_nb.NonBlockingTransport-class.html#plugin nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.transports_nb.NonBlockingTransport.set_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout2 nbxmpp.transports_nb.NonBlockingTCP._do_send nbxmpp.transports_nb.NonBlockingTCP-class.html#_do_send nbxmpp.transports_nb.NonBlockingTransport.get_fd nbxmpp.transports_nb.NonBlockingTransport-class.html#get_fd nbxmpp.transports_nb.NonBlockingTCP.remove_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#remove_timeout nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout2 nbxmpp.transports_nb.NonBlockingTCP.set_timeout nbxmpp.transports_nb.NonBlockingTCP-class.html#set_timeout nbxmpp.transports_nb.NonBlockingTCP.start_disconnect nbxmpp.transports_nb.NonBlockingTCP-class.html#start_disconnect nbxmpp.transports_nb.NonBlockingTransport nbxmpp.transports_nb.NonBlockingTransport-class.html nbxmpp.transports_nb.NonBlockingTransport._tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport-class.html#_tcp_connecting_started nbxmpp.transports_nb.NonBlockingTransport.set_state nbxmpp.transports_nb.NonBlockingTransport-class.html#set_state nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout nbxmpp.transports_nb.NonBlockingTransport.plugout nbxmpp.transports_nb.NonBlockingTransport-class.html#plugout nbxmpp.transports_nb.NonBlockingTransport._on_connect nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect nbxmpp.transports_nb.NonBlockingTransport.read_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout2 nbxmpp.transports_nb.NonBlockingTransport.connect nbxmpp.transports_nb.NonBlockingTransport-class.html#connect nbxmpp.transports_nb.NonBlockingTransport.read_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#read_timeout nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout nbxmpp.transports_nb.NonBlockingTransport.renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#renew_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport.__init__ nbxmpp.transports_nb.NonBlockingTransport-class.html#__init__ nbxmpp.transports_nb.NonBlockingTransport.disconnect nbxmpp.transports_nb.NonBlockingTransport-class.html#disconnect nbxmpp.plugin.PlugIn.PlugIn nbxmpp.plugin.PlugIn-class.html#PlugIn nbxmpp.transports_nb.NonBlockingTransport.send nbxmpp.transports_nb.NonBlockingTransport-class.html#send nbxmpp.plugin.PlugIn.get_instance nbxmpp.plugin.PlugIn-class.html#get_instance nbxmpp.plugin.PlugIn.PlugOut nbxmpp.plugin.PlugIn-class.html#PlugOut nbxmpp.transports_nb.NonBlockingTransport.onreceive nbxmpp.transports_nb.NonBlockingTransport-class.html#onreceive nbxmpp.transports_nb.NonBlockingTransport.get_state nbxmpp.transports_nb.NonBlockingTransport-class.html#get_state nbxmpp.transports_nb.NonBlockingTransport._on_connect_failure nbxmpp.transports_nb.NonBlockingTransport-class.html#_on_connect_failure nbxmpp.transports_nb.NonBlockingTransport.plugin nbxmpp.transports_nb.NonBlockingTransport-class.html#plugin nbxmpp.transports_nb.NonBlockingTransport.set_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout2 nbxmpp.transports_nb.NonBlockingTransport.get_fd nbxmpp.transports_nb.NonBlockingTransport-class.html#get_fd nbxmpp.transports_nb.NonBlockingTransport.remove_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#remove_timeout nbxmpp.transports_nb.NonBlockingTransport.set_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport-class.html#set_send_timeout2 nbxmpp.transports_nb.NonBlockingTransport.set_timeout nbxmpp.transports_nb.NonBlockingTransport-class.html#set_timeout nbxmpp.transports_nb.NonBlockingTransport.start_disconnect nbxmpp.transports_nb.NonBlockingTransport-class.html#start_disconnect python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/class-tree.html000066400000000000000000000556261343257752000230700ustar00rootroot00000000000000 Class Hierarchy
 
[hide private]
[frames] | no frames]
[ Module Hierarchy | Class Hierarchy ]

Class Hierarchy

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/crarr.png000066400000000000000000000005241343257752000217420ustar00rootroot00000000000000‰PNG  IHDR e¢E,tEXtCreation TimeTue 22 Aug 2006 00:43:10 -0500` XtIMEÖ)Ó}Ö pHYsÂÂnÐu>gAMA± üaEPLTEÿÿÿÍð×ÏÀ€f4sW áÛЊrD`@bCÜÕÈéäÜ–X{`,¯Ÿ€lN‡o@õóðª™xdEðí螊dÐÆ´”~TÖwÅvtRNS@æØfMIDATxÚc`@¼ì¼0&+š—Šˆ°»(’ˆ€ ;; /ðEXùØ‘?Ð n ƒª†— b;'ª+˜˜YÐ#œ(r<£"IEND®B`‚python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/epydoc.css000066400000000000000000000372271343257752000221320ustar00rootroot00000000000000 /* Epydoc CSS Stylesheet * * This stylesheet can be used to customize the appearance of epydoc's * HTML output. * */ /* Default Colors & Styles * - Set the default foreground & background color with 'body'; and * link colors with 'a:link' and 'a:visited'. * - Use bold for decision list terms. * - The heading styles defined here are used for headings *within* * docstring descriptions. All headings used by epydoc itself use * either class='epydoc' or class='toc' (CSS styles for both * defined below). */ body { background: #ffffff; color: #000000; } p { margin-top: 0.5em; margin-bottom: 0.5em; } a:link { color: #0000ff; } a:visited { color: #204080; } dt { font-weight: bold; } h1 { font-size: +140%; font-style: italic; font-weight: bold; } h2 { font-size: +125%; font-style: italic; font-weight: bold; } h3 { font-size: +110%; font-style: italic; font-weight: normal; } code { font-size: 100%; } /* N.B.: class, not pseudoclass */ a.link { font-family: monospace; } /* Page Header & Footer * - The standard page header consists of a navigation bar (with * pointers to standard pages such as 'home' and 'trees'); a * breadcrumbs list, which can be used to navigate to containing * classes or modules; options links, to show/hide private * variables and to show/hide frames; and a page title (using *

). The page title may be followed by a link to the * corresponding source code (using 'span.codelink'). * - The footer consists of a navigation bar, a timestamp, and a * pointer to epydoc's homepage. */ h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } h2.epydoc { font-size: +130%; font-weight: bold; } h3.epydoc { font-size: +115%; font-weight: bold; margin-top: 0.2em; } td h3.epydoc { font-size: +115%; font-weight: bold; margin-bottom: 0; } table.navbar { background: #a0c0ff; color: #000000; border: 2px groove #c0d0d0; } table.navbar table { color: #000000; } th.navbar-select { background: #70b0ff; color: #000000; } table.navbar a { text-decoration: none; } table.navbar a:link { color: #0000ff; } table.navbar a:visited { color: #204080; } span.breadcrumbs { font-size: 85%; font-weight: bold; } span.options { font-size: 70%; } span.codelink { font-size: 85%; } td.footer { font-size: 85%; } /* Table Headers * - Each summary table and details section begins with a 'header' * row. This row contains a section title (marked by * 'span.table-header') as well as a show/hide private link * (marked by 'span.options', defined above). * - Summary tables that contain user-defined groups mark those * groups using 'group header' rows. */ td.table-header { background: #70b0ff; color: #000000; border: 1px solid #608090; } td.table-header table { color: #000000; } td.table-header table a:link { color: #0000ff; } td.table-header table a:visited { color: #204080; } span.table-header { font-size: 120%; font-weight: bold; } th.group-header { background: #c0e0f8; color: #000000; text-align: left; font-style: italic; font-size: 115%; border: 1px solid #608090; } /* Summary Tables (functions, variables, etc) * - Each object is described by a single row of the table with * two cells. The left cell gives the object's type, and is * marked with 'code.summary-type'. The right cell gives the * object's name and a summary description. * - CSS styles for the table's header and group headers are * defined above, under 'Table Headers' */ table.summary { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin-bottom: 0.5em; } td.summary { border: 1px solid #608090; } code.summary-type { font-size: 85%; } table.summary a:link { color: #0000ff; } table.summary a:visited { color: #204080; } /* Details Tables (functions, variables, etc) * - Each object is described in its own div. * - A single-row summary table w/ table-header is used as * a header for each details section (CSS style for table-header * is defined above, under 'Table Headers'). */ table.details { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } table.details table { color: #000000; } table.details a:link { color: #0000ff; } table.details a:visited { color: #204080; } /* Fields */ dl.fields { margin-left: 2em; margin-top: 1em; margin-bottom: 1em; } dl.fields dd ul { margin-left: 0em; padding-left: 0em; } dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; } div.fields { margin-left: 2em; } div.fields p { margin-bottom: 0.5em; } /* Index tables (identifier index, term index, etc) * - link-index is used for indices containing lists of links * (namely, the identifier index & term index). * - index-where is used in link indices for the text indicating * the container/source for each link. * - metadata-index is used for indices containing metadata * extracted from fields (namely, the bug index & todo index). */ table.link-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; } td.link-index { border-width: 0px; } table.link-index a:link { color: #0000ff; } table.link-index a:visited { color: #204080; } span.index-where { font-size: 70%; } table.metadata-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } td.metadata-index { border-width: 1px; border-style: solid; } table.metadata-index a:link { color: #0000ff; } table.metadata-index a:visited { color: #204080; } /* Function signatures * - sig* is used for the signature in the details section. * - .summary-sig* is used for the signature in the summary * table, and when listing property accessor functions. * */ .sig-name { color: #006080; } .sig-arg { color: #008060; } .sig-default { color: #602000; } .summary-sig { font-family: monospace; } .summary-sig-name { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:link { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:visited { color: #006080; font-weight: bold; } .summary-sig-arg { color: #006040; } .summary-sig-default { color: #501800; } /* Subclass list */ ul.subclass-list { display: inline; } ul.subclass-list li { display: inline; } /* To render variables, classes etc. like functions */ table.summary .summary-name { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:link { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:visited { color: #006080; font-weight: bold; font-family: monospace; } /* Variable values * - In the 'variable details' sections, each varaible's value is * listed in a 'pre.variable' box. The width of this box is * restricted to 80 chars; if the value's repr is longer than * this it will be wrapped, using a backslash marked with * class 'variable-linewrap'. If the value's repr is longer * than 3 lines, the rest will be ellided; and an ellipsis * marker ('...' marked with 'variable-ellipsis') will be used. * - If the value is a string, its quote marks will be marked * with 'variable-quote'. * - If the variable is a regexp, it is syntax-highlighted using * the re* CSS classes. */ pre.variable { padding: .5em; margin: 0; background: #dce4ec; color: #000000; border: 1px solid #708890; } .variable-linewrap { color: #604000; font-weight: bold; } .variable-ellipsis { color: #604000; font-weight: bold; } .variable-quote { color: #604000; font-weight: bold; } .variable-group { color: #008000; font-weight: bold; } .variable-op { color: #604000; font-weight: bold; } .variable-string { color: #006030; } .variable-unknown { color: #a00000; font-weight: bold; } .re { color: #000000; } .re-char { color: #006030; } .re-op { color: #600000; } .re-group { color: #003060; } .re-ref { color: #404040; } /* Base tree * - Used by class pages to display the base class hierarchy. */ pre.base-tree { font-size: 80%; margin: 0; } /* Frames-based table of contents headers * - Consists of two frames: one for selecting modules; and * the other listing the contents of the selected module. * - h1.toc is used for each frame's heading * - h2.toc is used for subheadings within each frame. */ h1.toc { text-align: center; font-size: 105%; margin: 0; font-weight: bold; padding: 0; } h2.toc { font-size: 100%; font-weight: bold; margin: 0.5em 0 0 -0.3em; } /* Syntax Highlighting for Source Code * - doctest examples are displayed in a 'pre.py-doctest' block. * If the example is in a details table entry, then it will use * the colors specified by the 'table pre.py-doctest' line. * - Source code listings are displayed in a 'pre.py-src' block. * Each line is marked with 'span.py-line' (used to draw a line * down the left margin, separating the code from the line * numbers). Line numbers are displayed with 'span.py-lineno'. * The expand/collapse block toggle button is displayed with * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not * modify the font size of the text.) * - If a source code page is opened with an anchor, then the * corresponding code block will be highlighted. The code * block's header is highlighted with 'py-highlight-hdr'; and * the code block's body is highlighted with 'py-highlight'. * - The remaining py-* classes are used to perform syntax * highlighting (py-string for string literals, py-name for names, * etc.) */ pre.py-doctest { padding: .5em; margin: 1em; background: #e8f0f8; color: #000000; border: 1px solid #708890; } table pre.py-doctest { background: #dce4ec; color: #000000; } pre.py-src { border: 2px solid #000000; background: #f0f0f0; color: #000000; } .py-line { border-left: 2px solid #000000; margin-left: .2em; padding-left: .4em; } .py-lineno { font-style: italic; font-size: 90%; padding-left: .5em; } a.py-toggle { text-decoration: none; } div.py-highlight-hdr { border-top: 2px solid #000000; border-bottom: 2px solid #000000; background: #d8e8e8; } div.py-highlight { border-bottom: 2px solid #000000; background: #d0e0e0; } .py-prompt { color: #005050; font-weight: bold;} .py-more { color: #005050; font-weight: bold;} .py-string { color: #006030; } .py-comment { color: #003060; } .py-keyword { color: #600000; } .py-output { color: #404040; } .py-name { color: #000050; } .py-name:link { color: #000050 !important; } .py-name:visited { color: #000050 !important; } .py-number { color: #005000; } .py-defname { color: #000060; font-weight: bold; } .py-def-name { color: #000060; font-weight: bold; } .py-base-class { color: #000060; } .py-param { color: #000060; } .py-docstring { color: #006030; } .py-decorator { color: #804020; } /* Use this if you don't want links to names underlined: */ /*a.py-name { text-decoration: none; }*/ /* Graphs & Diagrams * - These CSS styles are used for graphs & diagrams generated using * Graphviz dot. 'img.graph-without-title' is used for bare * diagrams (to remove the border created by making the image * clickable). */ img.graph-without-title { border: none; } img.graph-with-title { border: 1px solid #000000; } span.graph-title { font-weight: bold; } span.graph-caption { } /* General-purpose classes * - 'p.indent-wrapped-lines' defines a paragraph whose first line * is not indented, but whose subsequent lines are. * - The 'nomargin-top' class is used to remove the top margin (e.g. * from lists). The 'nomargin' class is used to remove both the * top and bottom margin (but not the left or right margin -- * for lists, that would cause the bullets to disappear.) */ p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; margin: 0; } .nomargin-top { margin-top: 0; } .nomargin { margin-top: 0; margin-bottom: 0; } /* HTML Log */ div.log-block { padding: 0; margin: .5em 0 .5em 0; background: #e8f0f8; color: #000000; border: 1px solid #000000; } div.log-error { padding: .1em .3em .1em .3em; margin: 4px; background: #ffb0b0; color: #000000; border: 1px solid #000000; } div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; background: #ffffb0; color: #000000; border: 1px solid #000000; } div.log-info { padding: .1em .3em .1em .3em; margin: 4px; background: #b0ffb0; color: #000000; border: 1px solid #000000; } h2.log-hdr { background: #70b0ff; color: #000000; margin: 0; padding: 0em 0.5em 0em 0.5em; border-bottom: 1px solid #000000; font-size: 110%; } p.log { font-weight: bold; margin: .5em 0 .5em 0; } tr.opt-changed { color: #000000; font-weight: bold; } tr.opt-default { color: #606060; } pre.log { margin: 0; padding: 0; padding-left: 1em; } python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/epydoc.js000066400000000000000000000245251343257752000217530ustar00rootroot00000000000000function toggle_private() { // Search for any private/public links on this page. Store // their old text in "cmd," so we will know what action to // take; and change their text to the opposite action. var cmd = "?"; var elts = document.getElementsByTagName("a"); for(var i=0; i...
"; elt.innerHTML = s; } } function toggle(id) { elt = document.getElementById(id+"-toggle"); if (elt.innerHTML == "-") collapse(id); else expand(id); return false; } function highlight(id) { var elt = document.getElementById(id+"-def"); if (elt) elt.className = "py-highlight-hdr"; var elt = document.getElementById(id+"-expanded"); if (elt) elt.className = "py-highlight"; var elt = document.getElementById(id+"-collapsed"); if (elt) elt.className = "py-highlight"; } function num_lines(s) { var n = 1; var pos = s.indexOf("\n"); while ( pos > 0) { n += 1; pos = s.indexOf("\n", pos+1); } return n; } // Collapse all blocks that mave more than `min_lines` lines. function collapse_all(min_lines) { var elts = document.getElementsByTagName("div"); for (var i=0; i 0) if (elt.id.substring(split, elt.id.length) == "-expanded") if (num_lines(elt.innerHTML) > min_lines) collapse(elt.id.substring(0, split)); } } function expandto(href) { var start = href.indexOf("#")+1; if (start != 0 && start != href.length) { if (href.substring(start, href.length) != "-") { collapse_all(4); pos = href.indexOf(".", start); while (pos != -1) { var id = href.substring(start, pos); expand(id); pos = href.indexOf(".", pos+1); } var id = href.substring(start, href.length); expand(id); highlight(id); } } } function kill_doclink(id) { var parent = document.getElementById(id); parent.removeChild(parent.childNodes.item(0)); } function auto_kill_doclink(ev) { if (!ev) var ev = window.event; if (!this.contains(ev.toElement)) { var parent = document.getElementById(this.parentID); parent.removeChild(parent.childNodes.item(0)); } } function doclink(id, name, targets_id) { var elt = document.getElementById(id); // If we already opened the box, then destroy it. // (This case should never occur, but leave it in just in case.) if (elt.childNodes.length > 1) { elt.removeChild(elt.childNodes.item(0)); } else { // The outer box: relative + inline positioning. var box1 = document.createElement("div"); box1.style.position = "relative"; box1.style.display = "inline"; box1.style.top = 0; box1.style.left = 0; // A shadow for fun var shadow = document.createElement("div"); shadow.style.position = "absolute"; shadow.style.left = "-1.3em"; shadow.style.top = "-1.3em"; shadow.style.background = "#404040"; // The inner box: absolute positioning. var box2 = document.createElement("div"); box2.style.position = "relative"; box2.style.border = "1px solid #a0a0a0"; box2.style.left = "-.2em"; box2.style.top = "-.2em"; box2.style.background = "white"; box2.style.padding = ".3em .4em .3em .4em"; box2.style.fontStyle = "normal"; box2.onmouseout=auto_kill_doclink; box2.parentID = id; // Get the targets var targets_elt = document.getElementById(targets_id); var targets = targets_elt.getAttribute("targets"); var links = ""; target_list = targets.split(","); for (var i=0; i" + target[0] + ""; } // Put it all together. elt.insertBefore(box1, elt.childNodes.item(0)); //box1.appendChild(box2); box1.appendChild(shadow); shadow.appendChild(box2); box2.innerHTML = "Which "+name+" do you want to see documentation for?" + ""; } return false; } function get_anchor() { var href = location.href; var start = href.indexOf("#")+1; if ((start != 0) && (start != href.length)) return href.substring(start, href.length); } function redirect_url(dottedName) { // Scan through each element of the "pages" list, and check // if "name" matches with any of them. for (var i=0; i-m" or "-c"; // extract the portion & compare it to dottedName. var pagename = pages[i].substring(0, pages[i].length-2); if (pagename == dottedName.substring(0,pagename.length)) { // We've found a page that matches `dottedName`; // construct its URL, using leftover `dottedName` // content to form an anchor. var pagetype = pages[i].charAt(pages[i].length-1); var url = pagename + ((pagetype=="m")?"-module.html": "-class.html"); if (dottedName.length > pagename.length) url += "#" + dottedName.substring(pagename.length+1, dottedName.length); return url; } } } python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/frames.html000066400000000000000000000011101343257752000222560ustar00rootroot00000000000000 python-nbxmpp python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/help.html000066400000000000000000000260061343257752000217440ustar00rootroot00000000000000 Help
 
[hide private]
[frames] | no frames]

API Documentation

This document contains the API (Application Programming Interface) documentation for python-nbxmpp. 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.

Label Highlighted when... Links to...
[Parent] (never highlighted) the parent of the current package
[Package] viewing a package the package containing the current object
[Module] viewing a module the 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.

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/identifier-index.html000066400000000000000000006462551343257752000242610ustar00rootroot00000000000000 Identifier Index
 
[hide private]
[frames] | no frames]

Identifier Index

[ 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 _ ]

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

R

S

T

U

W

X

_



python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/index.html000066400000000000000000000011101343257752000221100ustar00rootroot00000000000000 python-nbxmpp python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/module-tree.html000066400000000000000000000172351343257752000232420ustar00rootroot00000000000000 Module Hierarchy
 
[hide private]
[frames] | no frames]
[ Module Hierarchy | Class Hierarchy ]

Module Hierarchy

  • nbxmpp: This is a fork of the xmpppy jabber python library. Most of the code is inherited but has been extended by implementation of non-blocking transports and new features like BOSH.
    • nbxmpp.auth_nb: Provides plugs for SASL and NON-SASL authentication mechanisms. Can be used both for client and transport authentication
    • nbxmpp.bosh
    • nbxmpp.c14n: XML canonicalisation methods (for XEP-0116)
    • nbxmpp.client_nb: Client class establishs connection to XMPP Server and handles authentication
    • nbxmpp.dispatcher_nb: Main xmpp decision making logic. Provides library with methods to assign different handlers to different XMPP stanzas and namespaces
    • nbxmpp.features_nb: Different stuff that wasn't worth separating it into modules (Registration, Privacy Lists, ...)
    • nbxmpp.idlequeue: Idlequeues are Gajim's network heartbeat. Transports can be plugged as idle objects and be informed about possible IO
    • nbxmpp.plugin: Provides PlugIn class functionality to develop extentions for xmpppy
    • nbxmpp.protocol: Protocol module contains tools that are needed for processing of xmpp-related data structures, including jabber-objects like JID or different stanzas and sub- stanzas) handling routines
    • nbxmpp.proxy_connectors: Module containing classes for proxy connecting. So far its HTTP CONNECT and SOCKS5 proxy
    • nbxmpp.roster_nb: Simple roster implementation. Can be used though for different tasks like mass-renaming of contacts.
    • nbxmpp.simplexml: Simplexml module provides xmpppy library with all needed tools to handle XML nodes and XML streams. I'm personally using it in many other separate projects. It is designed to be as standalone as possible
    • nbxmpp.smacks
    • nbxmpp.stringprepare
    • nbxmpp.tls_nb
    • nbxmpp.transports_nb: Transports are objects responsible for connecting to XMPP server and putting data to wrapped sockets in in desired form (SSL, TLS, TCP, for HTTP proxy, for SOCKS5 proxy...)
python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp-module.html000066400000000000000000000746661343257752000236220ustar00rootroot00000000000000 nbxmpp
Package nbxmpp
[hide private]
[frames] | no frames]

Package nbxmpp

source code

This is a fork of the xmpppy jabber python library. Most of the code is inherited but has been extended by implementation of non-blocking transports and new features like BOSH.

Most of the xmpp classes are ancestors of PlugIn class to share a single set of methods in order to compile a featured and extensible XMPP client.

Thanks and credits to the xmpppy developers. See: http://xmpppy.sourceforge.net/

Submodules [hide private]
  • nbxmpp.auth_nb: Provides plugs for SASL and NON-SASL authentication mechanisms. Can be used both for client and transport authentication
  • nbxmpp.bosh
  • nbxmpp.c14n: XML canonicalisation methods (for XEP-0116)
  • nbxmpp.client_nb: Client class establishs connection to XMPP Server and handles authentication
  • nbxmpp.dispatcher_nb: Main xmpp decision making logic. Provides library with methods to assign different handlers to different XMPP stanzas and namespaces
  • nbxmpp.features_nb: Different stuff that wasn't worth separating it into modules (Registration, Privacy Lists, ...)
  • nbxmpp.idlequeue: Idlequeues are Gajim's network heartbeat. Transports can be plugged as idle objects and be informed about possible IO
  • nbxmpp.plugin: Provides PlugIn class functionality to develop extentions for xmpppy
  • nbxmpp.protocol: Protocol module contains tools that are needed for processing of xmpp-related data structures, including jabber-objects like JID or different stanzas and sub- stanzas) handling routines
  • nbxmpp.proxy_connectors: Module containing classes for proxy connecting. So far its HTTP CONNECT and SOCKS5 proxy
  • nbxmpp.roster_nb: Simple roster implementation. Can be used though for different tasks like mass-renaming of contacts.
  • nbxmpp.simplexml: Simplexml module provides xmpppy library with all needed tools to handle XML nodes and XML streams. I'm personally using it in many other separate projects. It is designed to be as standalone as possible
  • nbxmpp.smacks
  • nbxmpp.stringprepare
  • nbxmpp.tls_nb
  • nbxmpp.transports_nb: Transports are objects responsible for connecting to XMPP server and putting data to wrapped sockets in in desired form (SSL, TLS, TCP, for HTTP proxy, for SOCKS5 proxy...)

Variables [hide private]
  __package__ = 'nbxmpp'

Imports: NS_MUC_ADMIN, STREAM_NOT_AUTHORIZED, NS_FILE, Error, NS_PUBSUB_EVENT, NS_RECEIPTS, STREAM_CONNECTION_TIMEOUT, STREAM_IMPROPER_ADDRESSING, NS_PING, ERR_GONE, Conflict, NS_PHYSLOC, NS_CHATTING, ERR_CONFLICT, NS_COMPRESS, NS_HASHES_SHA1, NS_AGENTS, NS_CAPTCHA, NS_MOOD, ERR_NOT_AUTHORIZED, UnsupportedVersion, NS_BROWSING, ERR_INTERNAL_SERVER_ERROR, HostUnknown, SASL_INCORRECT_ENCODING, NS_MUC_OWNER, NS_ACTIVITY, NS_ARCHIVE_MANUAL, NS_JINGLE_RTP_AUDIO, string, NS_PRESENCE, STREAM_INTERNAL_SERVER_ERROR, NS_CHATSTATES, NS_LAST, ERR_REDIRECT, isErrorNode, Acks, NS_GROUPCHAT, Protocol, ERR_FEATURE_NOT_IMPLEMENTED, NS_GATEWAY, NS_DISCO_ITEMS, NS_MUC_CONFIG, ConnectionTimeout, NS_BIND, NS_JINGLE_ERRORS, NS_XMPP_STREAMS, NS_IQ, ERR_RESOURCE_CONSTRAINT, NS_CLIENT, NS_FORWARD, SASL_INVALID_AUTHZID, NS_EVENT, STREAM_POLICY_VIOLATION, NS_JINGLE_IBB, NS_DATA_LAYOUT, NS_TUNE, InvalidID, stream_exceptions, NS_HASHES_SHA256, NS_CARBONS, NS_ROSTER, NS_STANZAS, NS_HTTP_BIND, isResultNode, NS_TIME_REVISED, UnsupportedStanzaType, NS_MUC_UNIQUE, ERR_SERVICE_UNAVAILABLE, NS_PUBKEY_PUBKEY, NS_AMP, STREAM_UNDEFINED_CONDITION, NS_CONFERENCE, NS_MAM, NS_DISCO, NS_RSM, NS_BLOCKING, ERRORS, NS_STREAM, NS_HASHES, HostGone, RemoteConnectionFailed, NS_ESESSION, NotAuthorized, STREAM_BAD_FORMAT, NS_JINGLE_FILE_TRANSFER, NS_LOCATION, NS_ARCHIVE_AUTO, NS_DIALBACK, SASL_ABORTED, NS_AUTH, BadFormat, NS_BOOKMARKS, NS_VCARD, STREAM_HOST_GONE, DataForm, ERR_REMOTE_SERVER_NOT_FOUND, NS_XHTML, JID, InvalidXML, NS_SI, PolicyViolation, NS_SASL, NS_JINGLE_RAW_UDP, NS_SESSION, STREAM_INVALID_FROM, StreamError, NS_CAPS, NS_PUBSUB_OWNER, NS_HASHES_SHA512, NS_AMP_ERRORS, NS_BROWSE, NS_CORRECT, NS_ROSTERX, ERR_UNDEFINED_CONDITION, NS_TLS, NS_ATTENTION, NS_DATA, NS_SERVER, ImproperAddressing, ERR_REMOTE_SERVER_TIMEOUT, NS_JINGLE_ICE_UDP, NS_IBB, DataField, ERR_REGISTRATION_REQUIRED, NS_TIME, NS_PROFILE, Message, NS_SECLABEL, NS_XHTML_IM, NS_PRIVACY, NS_GMAILNOTIFY, BadNamespacePrefix, NS_CONDITIONS, UnsupportedEncoding, NS_FEATURE, STREAM_UNSUPPORTED_VERSION, SASL_NOT_AUTHORIZED, SeeOtherHost, Node, NS_JINGLE_RTP, SystemShutdown, NS_WAITINGLIST, NS_ARCHIVE_MANAGE, NS_SSN, NS_DELAY2, SASL_MECHANISM_TOO_WEAK, InvalidNamespace, NS_COMPONENT_1, Iq, NS_ARCHIVE_PREF, Hashes, ERR_JID_MALFORMED, STREAM_INVALID_XML, NS_INVISIBLE, NS_JINGLE_RTP_VIDEO, NS_PRIVATE, NS_VERSION, STREAM_UNSUPPORTED_ENCODING, ERR_NOT_ALLOWED, NS_GAMING, NS_OFFLINE, STREAM_SYSTEM_SHUTDOWN, NS_MUC_USER, NS_VCARD_UPDATE, NS_ATOM, ascii_upper, NS_STREAMS, STREAM_HOST_UNKNOWN, ERR_BAD_REQUEST, hashlib, NS_GTALKSETTING, InvalidFrom, NS_ENCRYPTED, UndefinedCondition, NS_RPC, NS_STANZA_CRYPTO, NS_SIGNED, NS_NICK, ERR_PAYMENT_REQUIRED, NS_PUBSUB, NS_MESSAGE, NS_JINGLE_XTLS, NS_DATA_MEDIA, STREAM_XML_NOT_WELL_FORMED, XMLNotWellFormed, NS_REGISTER, STREAM_SEE_OTHER_HOST, NS_BYTESTREAM, NS_DELAY, NS_VACATION, NS_PUBSUB_PUBLISH_OPTIONS, STREAM_BAD_NAMESPACE_PREFIX, NS_GEOLOC, NS_ARCHIVE, NS_ROSTERNOTES, NS_SI_PUB, NS_DATA_VALIDATE, ERR_RECIPIENT_UNAVAILABLE, NS_ESESSION_INIT, SASL_TEMPORARY_AUTH_FAILURE, NS_PUBKEY_REVOKE, NS_JINGLE_BYTESTREAM, NodeBuilder, SASL_INVALID_MECHANISM, NS_ROSTER_VER, NS_VIEWING, NS_COMMANDS, NS_AVATAR, NodeProcessed, Presence, STREAM_CONFLICT, ResourceConstraint, STREAM_RESOURCE_CONSTRAINT, NS_STREAM_MGMT, ERR_UNEXPECTED_REQUEST, time, NS_X_OOB, ERR_SUBSCRIPTION_REQUIRED, ERR_ITEM_NOT_FOUND, STREAM_INVALID_NAMESPACE, NS_SEARCH, STREAM_REMOTE_CONNECTION_FAILED, BOSHBody, NS_ADDRESS, NS_COMPONENT_ACCEPT, STREAM_INVALID_ID, RestrictedXML, NS_SECLABEL_CATALOG, STREAM_RESTRICTED_XML, NS_DISCO_INFO, STREAM_UNSUPPORTED_STANZA_TYPE, InternalServerError, NS_PUBKEY_ATTEST, NS_MUC, ERR_NOT_ACCEPTABLE, NS_JINGLE, NS_BOB, NS_HASHES_MD5, NS_HTTP_AUTH, ERR_FORBIDDEN, ErrorNode, simplexml, protocol, auth_nb, transports_nb, roster_nb, dispatcher_nb, features_nb, idlequeue, bosh, tls_nb, proxy_connectors, NonBlockingClient, PlugIn, Smacks, client_nb, plugin, smacks


Variables Details [hide private]

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp-pysrc.html000066400000000000000000000300331343257752000234510ustar00rootroot00000000000000 nbxmpp
Package nbxmpp
[hide private]
[frames] | no frames]

Source Code for Package nbxmpp

 1  # $Id: __init__.py,v 1.9 2005/03/07 09:34:51 snakeru Exp $ 
 2   
 3  """ 
 4  This is a fork of the xmpppy jabber python library. Most of the code is 
 5  inherited but has been extended by implementation of non-blocking transports 
 6  and new features like BOSH. 
 7   
 8  Most of the xmpp classes are ancestors of PlugIn class to share a single set of methods in order to compile a featured and extensible XMPP client. 
 9   
10  Thanks and credits to the xmpppy developers. See: http://xmpppy.sourceforge.net/ 
11  """ 
12   
13  from protocol import * 
14  import simplexml, protocol, auth_nb, transports_nb, roster_nb 
15  import dispatcher_nb, features_nb, idlequeue, bosh, tls_nb, proxy_connectors 
16  from client_nb import NonBlockingClient 
17  from plugin import PlugIn 
18  from smacks import Smacks 
19   

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.auth_nb-module.html000066400000000000000000000631761343257752000252330ustar00rootroot00000000000000 nbxmpp.auth_nb
Package nbxmpp :: Module auth_nb
[hide private]
[frames] | no frames]

Module auth_nb

source code

Provides plugs for SASL and NON-SASL authentication mechanisms. Can be used both for client and transport authentication

See client_nb.py

Classes [hide private]
  SASL
Implements SASL authentication. Can be plugged into NonBlockingClient to start authentication
  NonBlockingNonSASL
Implements old Non-SASL (JEP-0078) authentication used in jabberd1.4 and transport authentication
  NonBlockingBind
Bind some JID to the current connection to allow router know of our location. Must be plugged after successful SASL auth
Functions [hide private]
 
HH(some) source code
 
H(some) source code
 
C(some) source code
 
challenge_splitter(data)
Helper function that creates a dict from challenge string
source code
 
scram_parse(chatter) source code
Variables [hide private]
  log = logging.getLogger('nbxmpp.auth_nb')
  kerberos = __import__('kerberos')
  have_kerberos = False
  GSS_STATE_STEP = 0
  GSS_STATE_WRAP = 1
  SASL_FAILURE_IN_PROGRESS = 'failure-in-process'
  SASL_FAILURE = 'failure'
  SASL_SUCCESS = 'success'
  SASL_UNSUPPORTED = 'not-supported'
  SASL_IN_PROCESS = 'in-process'
  __package__ = 'nbxmpp'

Imports: NS_SASL, NS_SESSION, NS_STREAMS, NS_BIND, NS_AUTH, NS_STREAM_MGMT, Node, NodeProcessed, isResultNode, Iq, Protocol, JID, PlugIn, Smacks, base64, random, itertools, dispatcher_nb, hmac, hashlib, logging


Function Details [hide private]

HH(some)

source code 

H(some)

source code 

C(some)

source code 

challenge_splitter(data)

source code 

Helper function that creates a dict from challenge string

Sample challenge string:
  • username="example.org",realm="somerealm", nonce="OA6MG9tEQGm2hh",cnonce="OA6MHXh6VqTrRk", nc=00000001,qop="auth,auth-int,auth-conf",charset=utf-8
Expected result for challan:
  • dict['qop'] = ('auth','auth-int','auth-conf')
  • dict['realm'] = 'somerealm'

scram_parse(chatter)

source code 

Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.auth_nb')

kerberos

Value:
__import__('kerberos')

have_kerberos

Value:
False

GSS_STATE_STEP

Value:
0

GSS_STATE_WRAP

Value:
1

SASL_FAILURE_IN_PROGRESS

Value:
'failure-in-process'

SASL_FAILURE

Value:
'failure'

SASL_SUCCESS

Value:
'success'

SASL_UNSUPPORTED

Value:
'not-supported'

SASL_IN_PROCESS

Value:
'in-process'

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.auth_nb-pysrc.html000066400000000000000000010376731343257752000251120ustar00rootroot00000000000000 nbxmpp.auth_nb
Package nbxmpp :: Module auth_nb
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.auth_nb

  1  ##   auth_nb.py 
  2  ##       based on auth.py, changes backported up to revision 1.41 
  3  ## 
  4  ##   Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 
  5  ##       modified by Dimitur Kirov <dkirov@gmail.com> 
  6  ## 
  7  ##   This program is free software; you can redistribute it and/or modify 
  8  ##   it under the terms of the GNU General Public License as published by 
  9  ##   the Free Software Foundation; either version 2, or (at your option) 
 10  ##   any later version. 
 11  ## 
 12  ##   This program is distributed in the hope that it will be useful, 
 13  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
 14  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 15  ##   GNU General Public License for more details. 
 16   
 17  """ 
 18  Provides plugs for SASL and NON-SASL authentication mechanisms. 
 19  Can be used both for client and transport authentication 
 20   
 21  See client_nb.py 
 22  """ 
 23   
 24  from protocol import NS_SASL, NS_SESSION, NS_STREAMS, NS_BIND, NS_AUTH 
 25  from protocol import NS_STREAM_MGMT 
 26  from protocol import Node, NodeProcessed, isResultNode, Iq, Protocol, JID 
 27  from plugin import PlugIn 
 28  from smacks import Smacks 
 29  import base64 
 30  import random 
 31  import itertools 
 32  import dispatcher_nb 
 33  import hashlib 
 34  import hmac 
 35  import hashlib 
 36   
 37  import logging 
 38  log = logging.getLogger('nbxmpp.auth_nb') 
39 40 -def HH(some): return hashlib.md5(some).hexdigest()
41 -def H(some): return hashlib.md5(some).digest()
42 -def C(some): return ':'.join(some)
43 44 try: 45 kerberos = __import__('kerberos') 46 have_kerberos = True 47 except ImportError: 48 have_kerberos = False 49 50 GSS_STATE_STEP = 0 51 GSS_STATE_WRAP = 1 52 SASL_FAILURE_IN_PROGRESS = 'failure-in-process' 53 SASL_FAILURE = 'failure' 54 SASL_SUCCESS = 'success' 55 SASL_UNSUPPORTED = 'not-supported' 56 SASL_IN_PROCESS = 'in-process'
57 58 -def challenge_splitter(data):
59 """ 60 Helper function that creates a dict from challenge string 61 62 Sample challenge string: 63 - username="example.org",realm="somerealm", 64 nonce="OA6MG9tEQGm2hh",cnonce="OA6MHXh6VqTrRk", 65 nc=00000001,qop="auth,auth-int,auth-conf",charset=utf-8 66 67 Expected result for challan: 68 - dict['qop'] = ('auth','auth-int','auth-conf') 69 - dict['realm'] = 'somerealm' 70 """ 71 X_KEYWORD, X_VALUE, X_END = 0, 1, 2 72 quotes_open = False 73 keyword, value = '', '' 74 dict_ = {} 75 arr = None 76 77 expecting = X_KEYWORD 78 for iter_ in range(len(data) + 1): 79 end = False 80 if iter_ == len(data): 81 expecting = X_END 82 end = True 83 else: 84 char = data[iter_] 85 if expecting == X_KEYWORD: 86 if char == '=': 87 expecting = X_VALUE 88 elif char in (',', ' ', '\t'): 89 pass 90 else: 91 keyword = '%s%c' % (keyword, char) 92 elif expecting == X_VALUE: 93 if char == '"': 94 if quotes_open: 95 end = True 96 else: 97 quotes_open = True 98 elif char in (',', ' ', '\t'): 99 if quotes_open: 100 if not arr: 101 arr = [value] 102 else: 103 arr.append(value) 104 value = "" 105 else: 106 end = True 107 else: 108 value = '%s%c' % (value, char) 109 if end: 110 if arr: 111 arr.append(value) 112 dict_[keyword] = arr 113 arr = None 114 else: 115 dict_[keyword] = value 116 value, keyword = '', '' 117 expecting = X_KEYWORD 118 quotes_open = False 119 return dict_
120
121 -def scram_parse(chatter):
122 return dict(s.split('=', 1) for s in chatter.split(','))
123
124 -class SASL(PlugIn):
125 """ 126 Implements SASL authentication. Can be plugged into NonBlockingClient 127 to start authentication 128 """ 129
130 - def __init__(self, username, password, on_sasl):
131 """ 132 :param username: XMPP username 133 :param password: XMPP password 134 :param on_sasl: Callback, will be called after each SASL auth-step. 135 """ 136 PlugIn.__init__(self) 137 self.username = username 138 self.password = password 139 self.on_sasl = on_sasl 140 self.realm = None
141
142 - def plugin(self, owner):
143 if 'version' not in self._owner.Dispatcher.Stream._document_attrs: 144 self.startsasl = SASL_UNSUPPORTED 145 elif self._owner.Dispatcher.Stream.features: 146 try: 147 self.FeaturesHandler(self._owner.Dispatcher, 148 self._owner.Dispatcher.Stream.features) 149 except NodeProcessed: 150 pass 151 else: 152 self.startsasl = None
153
154 - def plugout(self):
155 """ 156 Remove SASL handlers from owner's dispatcher. Used internally 157 """ 158 if 'features' in self._owner.__dict__: 159 self._owner.UnregisterHandler('features', self.FeaturesHandler, 160 xmlns=NS_STREAMS) 161 if 'challenge' in self._owner.__dict__: 162 self._owner.UnregisterHandler('challenge', self.SASLHandler, 163 xmlns=NS_SASL) 164 if 'failure' in self._owner.__dict__: 165 self._owner.UnregisterHandler('failure', self.SASLHandler, 166 xmlns=NS_SASL) 167 if 'success' in self._owner.__dict__: 168 self._owner.UnregisterHandler('success', self.SASLHandler, 169 xmlns=NS_SASL)
170
171 - def auth(self):
172 """ 173 Start authentication. Result can be obtained via "SASL.startsasl" 174 attribute and will be either SASL_SUCCESS or SASL_FAILURE 175 176 Note that successfull auth will take at least two Dispatcher.Process() 177 calls. 178 """ 179 if self.startsasl: 180 pass 181 elif self._owner.Dispatcher.Stream.features: 182 try: 183 self.FeaturesHandler(self._owner.Dispatcher, 184 self._owner.Dispatcher.Stream.features) 185 except NodeProcessed: 186 pass 187 else: 188 self._owner.RegisterHandler('features', 189 self.FeaturesHandler, xmlns=NS_STREAMS)
190
191 - def FeaturesHandler(self, conn, feats):
192 """ 193 Used to determine if server supports SASL auth. Used internally 194 """ 195 if not feats.getTag('mechanisms', namespace=NS_SASL): 196 self.startsasl='not-supported' 197 log.info('SASL not supported by server') 198 return 199 self.mecs = [] 200 for mec in feats.getTag('mechanisms', namespace=NS_SASL).getTags( 201 'mechanism'): 202 self.mecs.append(mec.getData()) 203 204 self._owner.RegisterHandler('challenge', self.SASLHandler, 205 xmlns=NS_SASL) 206 self._owner.RegisterHandler('failure', self.SASLHandler, xmlns=NS_SASL) 207 self._owner.RegisterHandler('success', self.SASLHandler, xmlns=NS_SASL) 208 self.MechanismHandler()
209
210 - def MechanismHandler(self):
211 if 'ANONYMOUS' in self.mecs and self.username is None: 212 self.mecs.remove('ANONYMOUS') 213 node = Node('auth', attrs={'xmlns': NS_SASL, 214 'mechanism': 'ANONYMOUS'}) 215 self.mechanism = 'ANONYMOUS' 216 self.startsasl = SASL_IN_PROCESS 217 self._owner.send(str(node)) 218 raise NodeProcessed 219 if "EXTERNAL" in self.mecs: 220 self.mecs.remove('EXTERNAL') 221 sasl_data = u'%s@%s' % (self.username, self._owner.Server) 222 sasl_data = sasl_data.encode('utf-8').encode('base64').replace( 223 '\n', '') 224 node = Node('auth', attrs={'xmlns': NS_SASL, 225 'mechanism': 'EXTERNAL'}, payload=[sasl_data]) 226 self.mechanism = 'EXTERNAL' 227 self.startsasl = SASL_IN_PROCESS 228 self._owner.send(str(node)) 229 raise NodeProcessed 230 if 'GSSAPI' in self.mecs and have_kerberos: 231 self.mecs.remove('GSSAPI') 232 try: 233 self.gss_vc = kerberos.authGSSClientInit('xmpp@' + \ 234 self._owner.xmpp_hostname)[1] 235 kerberos.authGSSClientStep(self.gss_vc, '') 236 response = kerberos.authGSSClientResponse(self.gss_vc) 237 node=Node('auth', attrs={'xmlns': NS_SASL, 238 'mechanism': 'GSSAPI'}, payload=(response or '')) 239 self.mechanism = 'GSSAPI' 240 self.gss_step = GSS_STATE_STEP 241 self.startsasl = SASL_IN_PROCESS 242 self._owner.send(str(node)) 243 raise NodeProcessed 244 except kerberos.GSSError, e: 245 log.info('GSSAPI authentication failed: %s' % str(e)) 246 if 'SCRAM-SHA-1' in self.mecs: 247 self.mecs.remove('SCRAM-SHA-1') 248 self.mechanism = 'SCRAM-SHA-1' 249 self._owner._caller.get_password(self.set_password, self.mechanism) 250 self.scram_step = 0 251 self.startsasl = SASL_IN_PROCESS 252 raise NodeProcessed 253 if 'DIGEST-MD5' in self.mecs: 254 self.mecs.remove('DIGEST-MD5') 255 node = Node('auth', attrs={'xmlns': NS_SASL, 256 'mechanism': 'DIGEST-MD5'}) 257 self.mechanism = 'DIGEST-MD5' 258 self.startsasl = SASL_IN_PROCESS 259 self._owner.send(str(node)) 260 raise NodeProcessed 261 if 'PLAIN' in self.mecs: 262 self.mecs.remove('PLAIN') 263 self.mechanism = 'PLAIN' 264 self._owner._caller.get_password(self.set_password, self.mechanism) 265 self.startsasl = SASL_IN_PROCESS 266 raise NodeProcessed 267 if 'X-MESSENGER-OAUTH2' in self.mecs: 268 self.mecs.remove('X-MESSENGER-OAUTH2') 269 self.mechanism = 'X-MESSENGER-OAUTH2' 270 self._owner._caller.get_password(self.set_password, self.mechanism) 271 self.startsasl = SASL_IN_PROCESS 272 raise NodeProcessed 273 self.startsasl = SASL_FAILURE 274 log.info('I can only use EXTERNAL, SCRAM-SHA-1, DIGEST-MD5, GSSAPI and ' 275 'PLAIN mecanisms.') 276 if self.on_sasl: 277 self.on_sasl() 278 return
279
280 - def SASLHandler(self, conn, challenge):
281 """ 282 Perform next SASL auth step. Used internally 283 """ 284 if challenge.getNamespace() != NS_SASL: 285 return 286 287 def scram_base64(s): 288 return ''.join(s.encode('base64').split('\n'))
289 290 incoming_data = challenge.getData() 291 data=base64.decodestring(incoming_data) 292 ### Handle Auth result 293 def on_auth_fail(reason): 294 log.info('Failed SASL authentification: %s' % reason) 295 self._owner.send(str(Node('abort', attrs={'xmlns': NS_SASL}))) 296 if len(self.mecs) > 0: 297 # There are other mechanisms to test, but wait for <failure> 298 # answer from server 299 self.startsasl = SASL_FAILURE_IN_PROGRESS 300 raise NodeProcessed 301 if self.on_sasl: 302 self.on_sasl() 303 raise NodeProcessed
304 305 if challenge.getName() == 'failure': 306 if self.startsasl == SASL_FAILURE_IN_PROGRESS: 307 self.MechanismHandler() 308 raise NodeProcessed 309 self.startsasl = SASL_FAILURE 310 try: 311 reason = challenge.getChildren()[0] 312 except Exception: 313 reason = challenge 314 on_auth_fail(reason) 315 elif challenge.getName() == 'success': 316 if self.mechanism == 'SCRAM-SHA-1': 317 # check data-with-success 318 data = scram_parse(data) 319 if data['v'] != scram_base64(self.scram_ServerSignature): 320 on_auth_fail('ServerSignature is wrong') 321 322 self.startsasl = SASL_SUCCESS 323 log.info('Successfully authenticated with remote server.') 324 handlers = self._owner.Dispatcher.dumpHandlers() 325 326 # Bosh specific dispatcher replugging 327 # save old features. They will be used in case we won't get response 328 # on stream restart after SASL auth (happens with XMPP over BOSH 329 # with Openfire) 330 old_features = self._owner.Dispatcher.Stream.features 331 self._owner.Dispatcher.PlugOut() 332 dispatcher_nb.Dispatcher.get_instance().PlugIn(self._owner, 333 after_SASL=True, old_features=old_features) 334 self._owner.Dispatcher.restoreHandlers(handlers) 335 self._owner.User = self.username 336 337 if self.on_sasl: 338 self.on_sasl() 339 raise NodeProcessed 340 341 ### Perform auth step 342 log.info('Got challenge:' + data) 343 344 if self.mechanism == 'GSSAPI': 345 if self.gss_step == GSS_STATE_STEP: 346 rc = kerberos.authGSSClientStep(self.gss_vc, incoming_data) 347 if rc != kerberos.AUTH_GSS_CONTINUE: 348 self.gss_step = GSS_STATE_WRAP 349 elif self.gss_step == GSS_STATE_WRAP: 350 rc = kerberos.authGSSClientUnwrap(self.gss_vc, incoming_data) 351 response = kerberos.authGSSClientResponse(self.gss_vc) 352 rc = kerberos.authGSSClientWrap(self.gss_vc, response, 353 kerberos.authGSSClientUserName(self.gss_vc)) 354 response = kerberos.authGSSClientResponse(self.gss_vc) 355 if not response: 356 response = '' 357 self._owner.send(Node('response', attrs={'xmlns': NS_SASL}, 358 payload=response).__str__()) 359 raise NodeProcessed 360 if self.mechanism == 'SCRAM-SHA-1': 361 hashfn = hashlib.sha1 362 363 def HMAC(k, s): 364 return hmac.HMAC(key=k, msg=s, digestmod=hashfn).digest() 365 366 def XOR(x, y): 367 r = (chr(ord(px) ^ ord(py)) for px, py in zip(x, y)) 368 return ''.join(r) 369 370 def Hi(s, salt, iters): 371 ii = 1 372 try: 373 s = s.encode('utf-8') 374 except: 375 pass 376 ui_1 = HMAC(s, salt + '\0\0\0\01') 377 ui = ui_1 378 for i in range(iters - 1): 379 ii += 1 380 ui_1 = HMAC(s, ui_1) 381 ui = XOR(ui, ui_1) 382 return ui 383 384 def scram_H(s): 385 return hashfn(s).digest() 386 387 if self.scram_step == 0: 388 self.scram_step = 1 389 self.scram_soup += ',' + data + ',' 390 data = scram_parse(data) 391 # TODO: Should check cnonce here. 392 # TODO: Channel binding data goes in here too. 393 r = 'c=' + scram_base64(self.scram_gs2) 394 r += ',r=' + data['r'] 395 self.scram_soup += r 396 salt = data['s'].decode('base64') 397 iter = int(data['i']) 398 SaltedPassword = Hi(self.password, salt, iter) 399 # TODO: Could cache this, along with salt+iter. 400 ClientKey = HMAC(SaltedPassword, 'Client Key') 401 StoredKey = scram_H(ClientKey) 402 ClientSignature = HMAC(StoredKey, self.scram_soup) 403 ClientProof = XOR(ClientKey, ClientSignature) 404 r += ',p=' + scram_base64(ClientProof) 405 ServerKey = HMAC(SaltedPassword, 'Server Key') 406 self.scram_ServerSignature = HMAC(ServerKey, self.scram_soup) 407 sasl_data = scram_base64(r) 408 node = Node('response', attrs={'xmlns': NS_SASL}, 409 payload=[sasl_data]) 410 self._owner.send(str(node)) 411 raise NodeProcessed 412 413 if self.scram_step == 1: 414 data = scram_parse(data) 415 if data['v'].decode('base64') != self.scram_ServerSignature: 416 # TODO: Not clear what to do here - need to abort. 417 raise Exception 418 node = Node('response', attrs={'xmlns': NS_SASL}); 419 self._owner.send(str(node)) 420 raise NodeProcessed 421 422 # magic foo... 423 chal = challenge_splitter(data) 424 if not self.realm and 'realm' in chal: 425 self.realm = chal['realm'] 426 if 'qop' in chal and ((isinstance(chal['qop'], str) and \ 427 chal['qop'] =='auth') or (isinstance(chal['qop'], list) and 'auth' in \ 428 chal['qop'])): 429 self.resp = {} 430 self.resp['username'] = self.username 431 if self.realm: 432 self.resp['realm'] = self.realm 433 else: 434 self.resp['realm'] = self._owner.Server 435 self.resp['nonce'] = chal['nonce'] 436 self.resp['cnonce'] = ''.join("%x" % randint(0, 2**28) for randint \ 437 in itertools.repeat(random.randint, 7)) 438 self.resp['nc'] = ('00000001') 439 self.resp['qop'] = 'auth' 440 self.resp['digest-uri'] = 'xmpp/' + self._owner.Server 441 self.resp['charset'] = 'utf-8' 442 # Password is now required 443 self._owner._caller.get_password(self.set_password, self.mechanism) 444 elif 'rspauth' in chal: 445 # Check rspauth value 446 if chal['rspauth'] != self.digest_rspauth: 447 on_auth_fail('rspauth is wrong') 448 self._owner.send(str(Node('response', attrs={'xmlns':NS_SASL}))) 449 else: 450 self.startsasl = SASL_FAILURE 451 log.info('Failed SASL authentification: unknown challenge') 452 if self.on_sasl: 453 self.on_sasl() 454 raise NodeProcessed 455 456 @staticmethod
457 - def _convert_to_iso88591(string):
458 try: 459 string = string.decode('utf-8').encode('iso-8859-1') 460 except UnicodeEncodeError: 461 pass 462 return string
463
464 - def set_password(self, password):
465 self.password = '' if password is None else password 466 if self.mechanism == 'SCRAM-SHA-1': 467 nonce = ''.join('%x' % randint(0, 2 ** 28) for randint in \ 468 itertools.repeat(random.randint, 7)) 469 self.scram_soup = 'n=' + self.username + ',r=' + nonce 470 self.scram_gs2 = 'n,,' # No CB yet. 471 sasl_data = (self.scram_gs2 + self.scram_soup).encode('base64').\ 472 replace('\n', '') 473 node = Node('auth', attrs={'xmlns': NS_SASL, 474 'mechanism': self.mechanism}, payload=[sasl_data]) 475 elif self.mechanism == 'DIGEST-MD5': 476 hash_username = self._convert_to_iso88591(self.resp['username']) 477 hash_realm = self._convert_to_iso88591(self.resp['realm']) 478 hash_password = self._convert_to_iso88591(self.password) 479 A1 = C([H(C([hash_username, hash_realm, hash_password])), 480 self.resp['nonce'], self.resp['cnonce']]) 481 A2 = C(['AUTHENTICATE', self.resp['digest-uri']]) 482 response = HH(C([HH(A1), self.resp['nonce'], self.resp['nc'], 483 self.resp['cnonce'], self.resp['qop'], HH(A2)])) 484 A2 = C(['', self.resp['digest-uri']]) 485 self.digest_rspauth = HH(C([HH(A1), self.resp['nonce'], 486 self.resp['nc'], self.resp['cnonce'], self.resp['qop'], 487 HH(A2)])) 488 self.resp['response'] = response 489 sasl_data = u'' 490 for key in ('charset', 'username', 'realm', 'nonce', 'nc', 'cnonce', 491 'digest-uri', 'response', 'qop'): 492 if key in ('nc', 'qop', 'response', 'charset'): 493 sasl_data += u"%s=%s," % (key, self.resp[key]) 494 else: 495 sasl_data += u'%s="%s",' % (key, self.resp[key]) 496 sasl_data = sasl_data[:-1].encode('utf-8').encode('base64').replace( 497 '\r', '').replace('\n', '') 498 node = Node('response', attrs={'xmlns': NS_SASL}, 499 payload=[sasl_data]) 500 elif self.mechanism == 'PLAIN': 501 sasl_data = u'\x00%s\x00%s' % (self.username, self.password) 502 sasl_data = sasl_data.encode('utf-8').encode('base64').replace( 503 '\n', '') 504 node = Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'PLAIN'}, 505 payload=[sasl_data]) 506 elif self.mechanism == 'X-MESSENGER-OAUTH2': 507 node = Node('auth', attrs={'xmlns': NS_SASL, 508 'mechanism': 'X-MESSENGER-OAUTH2'}) 509 node.addData(password) 510 self._owner.send(str(node))
511
512 513 -class NonBlockingNonSASL(PlugIn):
514 """ 515 Implements old Non-SASL (JEP-0078) authentication used in jabberd1.4 and 516 transport authentication 517 """ 518
519 - def __init__(self, user, password, resource, on_auth):
520 """ 521 Caches username, password and resource for auth 522 """ 523 PlugIn.__init__(self) 524 self.user = user 525 if password is None: 526 self.password = '' 527 else: 528 self.password = password 529 self.resource = resource 530 self.on_auth = on_auth
531
532 - def plugin(self, owner):
533 """ 534 Determine the best auth method (digest/0k/plain) and use it for auth. 535 Returns used method name on success. Used internally 536 """ 537 log.info('Querying server about possible auth methods') 538 self.owner = owner 539 540 owner.Dispatcher.SendAndWaitForResponse( 541 Iq('get', NS_AUTH, payload=[Node('username', payload=[self.user])]), 542 func=self._on_username)
543
544 - def _on_username(self, resp):
545 if not isResultNode(resp): 546 log.info('No result node arrived! Aborting...') 547 return self.on_auth(None) 548 549 iq=Iq(typ='set', node=resp) 550 query = iq.getTag('query') 551 query.setTagData('username', self.user) 552 query.setTagData('resource', self.resource) 553 554 if query.getTag('digest'): 555 log.info("Performing digest authentication") 556 query.setTagData('digest', 557 hashlib.sha1(self.owner.Dispatcher.Stream._document_attrs['id'] 558 + self.password).hexdigest()) 559 if query.getTag('password'): 560 query.delChild('password') 561 self._method = 'digest' 562 elif query.getTag('token'): 563 token = query.getTagData('token') 564 seq = query.getTagData('sequence') 565 log.info("Performing zero-k authentication") 566 567 def hasher(s): 568 return hashlib.sha1(s).hexdigest()
569 570 def hash_n_times(s, count): 571 return count and hasher(hash_n_times(s, count-1)) or s
572 573 hash_ = hash_n_times(hasher(hasher(self.password) + token), 574 int(seq)) 575 query.setTagData('hash', hash_) 576 self._method='0k' 577 else: 578 log.warn("Secure methods unsupported, performing plain text \ 579 authentication") 580 self._method = 'plain' 581 self._owner._caller.get_password(self._on_password, self._method) 582 return 583 resp = self.owner.Dispatcher.SendAndWaitForResponse(iq, 584 func=self._on_auth) 585
586 - def _on_password(self, password):
587 self.password = '' if password is None else password 588 iq=Iq('set', NS_AUTH) 589 query = iq.getTag('query') 590 query.setTagData('username', self.user) 591 query.setTagData('resource', self.resource) 592 query.setTagData('password', self.password) 593 resp = self.owner.Dispatcher.SendAndWaitForResponse(iq, 594 func=self._on_auth)
595
596 - def _on_auth(self, resp):
597 if isResultNode(resp): 598 log.info('Sucessfully authenticated with remote host.') 599 self.owner.User = self.user 600 self.owner.Resource = self.resource 601 self.owner._registered_name = self.owner.User + '@' + \ 602 self.owner.Server+ '/' + self.owner.Resource 603 return self.on_auth(self._method) 604 log.info('Authentication failed!') 605 return self.on_auth(None)
606
607 608 -class NonBlockingBind(PlugIn):
609 """ 610 Bind some JID to the current connection to allow router know of our 611 location. Must be plugged after successful SASL auth 612 """ 613
614 - def __init__(self):
615 PlugIn.__init__(self) 616 self.bound = None 617 self.supports_sm = False 618 self.resuming = False
619
620 - def plugin(self, owner):
621 ''' Start resource binding, if allowed at this time. Used internally. ''' 622 if self._owner.Dispatcher.Stream.features: 623 try: 624 self.FeaturesHandler(self._owner.Dispatcher, 625 self._owner.Dispatcher.Stream.features) 626 except NodeProcessed: 627 pass 628 else: 629 self._owner.RegisterHandler('features', self.FeaturesHandler, 630 xmlns=NS_STREAMS)
631
632 - def FeaturesHandler(self, conn, feats):
633 """ 634 Determine if server supports resource binding and set some internal 635 attributes accordingly. 636 637 It also checks if server supports stream management 638 """ 639 640 if feats.getTag('sm', namespace=NS_STREAM_MGMT): 641 self.supports_sm = True # server supports stream management 642 if self.resuming: 643 self._owner._caller.sm.resume_request() 644 645 if not feats.getTag('bind', namespace=NS_BIND): 646 log.info('Server does not requested binding.') 647 # we try to bind resource anyway 648 #self.bound='failure' 649 self.bound = [] 650 return 651 if feats.getTag('session', namespace=NS_SESSION): 652 self.session = 1 653 else: 654 self.session = -1 655 self.bound = []
656
657 - def plugout(self):
658 """ 659 Remove Bind handler from owner's dispatcher. Used internally 660 """ 661 self._owner.UnregisterHandler('features', self.FeaturesHandler, 662 xmlns=NS_STREAMS)
663
664 - def NonBlockingBind(self, resource=None, on_bound=None):
665 """ 666 Perform binding. Use provided resource name or random (if not provided). 667 """ 668 if self.resuming: # We don't bind if we resume the stream 669 return 670 self.on_bound = on_bound 671 self._resource = resource 672 if self._resource: 673 self._resource = [Node('resource', payload=[self._resource])] 674 else: 675 self._resource = [] 676 677 self._owner.onreceive(None) 678 self._owner.Dispatcher.SendAndWaitForResponse( 679 Protocol('iq', typ='set', payload=[Node('bind', 680 attrs={'xmlns': NS_BIND}, payload=self._resource)]), 681 func=self._on_bound)
682
683 - def _on_bound(self, resp):
684 if isResultNode(resp): 685 if resp.getTag('bind') and resp.getTag('bind').getTagData('jid'): 686 self.bound.append(resp.getTag('bind').getTagData('jid')) 687 log.info('Successfully bound %s.' % self.bound[-1]) 688 jid = JID(resp.getTag('bind').getTagData('jid')) 689 self._owner.User = jid.getNode() 690 self._owner.Resource = jid.getResource() 691 # Only negociate stream management after bounded 692 sm = self._owner._caller.sm 693 if self.supports_sm: 694 # starts negociation 695 sm.supports_sm = True 696 sm.set_owner(self._owner) 697 sm.negociate() 698 self._owner.Dispatcher.sm = sm 699 700 if hasattr(self, 'session') and self.session == -1: 701 # Server don't want us to initialize a session 702 log.info('No session required.') 703 self.on_bound('ok') 704 else: 705 self._owner.SendAndWaitForResponse(Protocol('iq', typ='set', 706 payload=[Node('session', attrs={'xmlns':NS_SESSION})]), 707 func=self._on_session) 708 return 709 if resp: 710 log.info('Binding failed: %s.' % resp.getTag('error')) 711 self.on_bound(None) 712 else: 713 log.info('Binding failed: timeout expired.') 714 self.on_bound(None)
715
716 - def _on_session(self, resp):
717 self._owner.onreceive(None) 718 if isResultNode(resp): 719 log.info('Successfully opened session.') 720 self.session = 1 721 self.on_bound('ok') 722 else: 723 log.error('Session open failed.') 724 self.session = 0 725 self.on_bound(None)
726

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.auth_nb.NonBlockingBind-class.html000066400000000000000000000500261343257752000300400ustar00rootroot00000000000000 nbxmpp.auth_nb.NonBlockingBind
Package nbxmpp :: Module auth_nb :: Class NonBlockingBind
[hide private]
[frames] | no frames]

Class NonBlockingBind

source code


Bind some JID to the current connection to allow router know of our location. Must be plugged after successful SASL auth
Instance Methods [hide private]
 
__init__(self) source code
 
plugin(self, owner)
Start resource binding, if allowed at this time. Used internally.
source code
 
FeaturesHandler(self, conn, feats)
Determine if server supports resource binding and set some internal attributes accordingly.
source code
 
plugout(self)
Remove Bind handler from owner's dispatcher. Used internally
source code
 
NonBlockingBind(self, resource=None, on_bound=None)
Perform binding. Use provided resource name or random (if not provided).
source code
 
_on_bound(self, resp) source code
 
_on_session(self, resp) source code

Inherited from plugin.PlugIn: PlugIn, PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Method Details [hide private]

__init__(self)
(Constructor)

source code 
Overrides: plugin.PlugIn.__init__

plugin(self, owner)

source code 
Start resource binding, if allowed at this time. Used internally.

FeaturesHandler(self, conn, feats)

source code 

Determine if server supports resource binding and set some internal attributes accordingly.

It also checks if server supports stream management

plugout(self)

source code 
Remove Bind handler from owner's dispatcher. Used internally

NonBlockingBind(self, resource=None, on_bound=None)

source code 
Perform binding. Use provided resource name or random (if not provided).

_on_bound(self, resp)

source code 

_on_session(self, resp)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.auth_nb.NonBlockingNonSASL-class.html000066400000000000000000000412021343257752000303750ustar00rootroot00000000000000 nbxmpp.auth_nb.NonBlockingNonSASL
Package nbxmpp :: Module auth_nb :: Class NonBlockingNonSASL
[hide private]
[frames] | no frames]

Class NonBlockingNonSASL

source code


Implements old Non-SASL (JEP-0078) authentication used in jabberd1.4 and transport authentication
Instance Methods [hide private]
 
__init__(self, user, password, resource, on_auth)
Caches username, password and resource for auth
source code
 
plugin(self, owner)
Determine the best auth method (digest/0k/plain) and use it for auth. Returns used method name on success. Used internally
source code
 
_on_username(self, resp) source code
 
_on_password(self, password) source code
 
_on_auth(self, resp) source code

Inherited from plugin.PlugIn: PlugIn, PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Method Details [hide private]

__init__(self, user, password, resource, on_auth)
(Constructor)

source code 
Caches username, password and resource for auth
Overrides: plugin.PlugIn.__init__

plugin(self, owner)

source code 
Determine the best auth method (digest/0k/plain) and use it for auth. Returns used method name on success. Used internally

_on_username(self, resp)

source code 

_on_password(self, password)

source code 

_on_auth(self, resp)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.auth_nb.SASL-class.html000066400000000000000000000573521343257752000256130ustar00rootroot00000000000000 nbxmpp.auth_nb.SASL
Package nbxmpp :: Module auth_nb :: Class SASL
[hide private]
[frames] | no frames]

Class SASL

source code


Implements SASL authentication. Can be plugged into NonBlockingClient to start authentication
Instance Methods [hide private]
 
__init__(self, username, password, on_sasl) source code
 
plugin(self, owner) source code
 
plugout(self)
Remove SASL handlers from owner's dispatcher. Used internally
source code
 
auth(self)
Start authentication. Result can be obtained via "SASL.startsasl" attribute and will be either SASL_SUCCESS or SASL_FAILURE
source code
 
FeaturesHandler(self, conn, feats)
Used to determine if server supports SASL auth. Used internally
source code
 
MechanismHandler(self) source code
 
SASLHandler(self, conn, challenge)
Perform next SASL auth step. Used internally
source code
 
set_password(self, password) source code

Inherited from plugin.PlugIn: PlugIn, PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Static Methods [hide private]
 
_convert_to_iso88591(string) source code
Method Details [hide private]

__init__(self, username, password, on_sasl)
(Constructor)

source code 
Parameters:
  • username - XMPP username
  • password - XMPP password
  • on_sasl - Callback, will be called after each SASL auth-step.
Overrides: plugin.PlugIn.__init__

plugin(self, owner)

source code 

plugout(self)

source code 
Remove SASL handlers from owner's dispatcher. Used internally

auth(self)

source code 

Start authentication. Result can be obtained via "SASL.startsasl" attribute and will be either SASL_SUCCESS or SASL_FAILURE

Note that successfull auth will take at least two Dispatcher.Process() calls.

FeaturesHandler(self, conn, feats)

source code 
Used to determine if server supports SASL auth. Used internally

MechanismHandler(self)

source code 

SASLHandler(self, conn, challenge)

source code 
Perform next SASL auth step. Used internally

_convert_to_iso88591(string)
Static Method

source code 

set_password(self, password)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.bosh-module.html000066400000000000000000000422461343257752000245410ustar00rootroot00000000000000 nbxmpp.bosh
Package nbxmpp :: Module bosh
[hide private]
[frames] | no frames]

Module bosh

source code

Classes [hide private]
  NonBlockingBOSH
  AckChecker
Class for generating rids and generating and checking acknowledgements in BOSH messages
  KeyStack
Class implementing key sequences for BOSH messages
Functions [hide private]
 
get_rand_number() source code
Variables [hide private]
  log = logging.getLogger('nbxmpp.bosh')
  KEY_COUNT = 10
  FAKE_DESCRIPTOR = -1337
  bosh_errors = {'bad-request': 'The format of an HTTP header or...
  __package__ = 'nbxmpp'

Imports: locale, random, sha1, NonBlockingTransport, NonBlockingHTTPBOSH, CONNECTED, CONNECTING, DISCONNECTED, DISCONNECTING, urisplit, DISCONNECT_TIMEOUT_SECONDS, BOSHBody, Protocol, NS_CLIENT, Node, logging


Function Details [hide private]

get_rand_number()

source code 

Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.bosh')

KEY_COUNT

Value:
10

FAKE_DESCRIPTOR

Value:
-1337

bosh_errors

Value:
{'bad-request': 'The format of an HTTP header or binding element recei\
ved from the client is unacceptable (e.g., syntax error), or Script Sy\
ntax is not supported.',
 'host-gone': 'The target domain specified in the "to" attribute or th\
e target host or port specified in the "route" attribute is no longer \
serviced by the connection manager.',
 'host-unknown': 'The target domain specified in the "to" attribute or\
 the target host or port specified in the "route" attribute is unknown\
...

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.bosh-pysrc.html000066400000000000000000006033451343257752000244170ustar00rootroot00000000000000 nbxmpp.bosh
Package nbxmpp :: Module bosh
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.bosh

  1  ## bosh.py 
  2  ## 
  3  ## 
  4  ## Copyright (C) 2008 Tomas Karasek <tom.to.the.k@gmail.com> 
  5  ## 
  6  ## This file is part of Gajim. 
  7  ## 
  8  ## Gajim is free software; you can redistribute it and/or modify 
  9  ## it under the terms of the GNU General Public License as published 
 10  ## by the Free Software Foundation; version 3 only. 
 11  ## 
 12  ## Gajim is distributed in the hope that it will be useful, 
 13  ## but WITHOUT ANY WARRANTY; without even the implied warranty of 
 14  ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 15  ## GNU General Public License for more details. 
 16  ## 
 17  ## You should have received a copy of the GNU General Public License 
 18  ## along with Gajim.  If not, see <http://www.gnu.org/licenses/>. 
 19   
 20   
 21  import locale, random 
 22  from hashlib import sha1 
 23  from transports_nb import NonBlockingTransport, NonBlockingHTTPBOSH,\ 
 24          CONNECTED, CONNECTING, DISCONNECTED, DISCONNECTING,\ 
 25          urisplit, DISCONNECT_TIMEOUT_SECONDS 
 26  from protocol import BOSHBody, Protocol, NS_CLIENT 
 27  from simplexml import Node 
 28   
 29  import logging 
 30  log = logging.getLogger('nbxmpp.bosh') 
 31   
 32  KEY_COUNT = 10 
 33   
 34  # Fake file descriptor - it's used for setting read_timeout in idlequeue for 
 35  # BOSH Transport. In TCP-derived transports this is file descriptor of socket. 
 36  FAKE_DESCRIPTOR = -1337 
 37   
 38   
39 -class NonBlockingBOSH(NonBlockingTransport):
40 - def __init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, 41 xmpp_server, domain, bosh_dict, proxy_creds):
42 NonBlockingTransport.__init__(self, raise_event, on_disconnect, idlequeue, 43 estabilish_tls, certs) 44 45 self.bosh_sid = None 46 if locale.getdefaultlocale()[0]: 47 self.bosh_xml_lang = locale.getdefaultlocale()[0].split('_')[0] 48 else: 49 self.bosh_xml_lang = 'en' 50 51 self.http_version = 'HTTP/1.1' 52 self.http_persistent = True 53 self.http_pipelining = bosh_dict['bosh_http_pipelining'] 54 self.bosh_to = domain 55 56 self.route_host, self.route_port = xmpp_server 57 58 self.bosh_wait = bosh_dict['bosh_wait'] 59 if not self.http_pipelining: 60 self.bosh_hold = 1 61 else: 62 self.bosh_hold = bosh_dict['bosh_hold'] 63 self.bosh_requests = self.bosh_hold 64 self.bosh_uri = bosh_dict['bosh_uri'] 65 self.bosh_content = bosh_dict['bosh_content'] 66 self.over_proxy = bosh_dict['bosh_useproxy'] 67 if estabilish_tls: 68 self.bosh_secure = 'true' 69 else: 70 self.bosh_secure = 'false' 71 self.use_proxy_auth = bosh_dict['useauth'] 72 self.proxy_creds = proxy_creds 73 self.wait_cb_time = None 74 self.http_socks = [] 75 self.stanza_buffer = [] 76 self.prio_bosh_stanzas = [] 77 self.current_recv_handler = None 78 self.current_recv_socket = None 79 self.key_stack = None 80 self.ack_checker = None 81 self.after_init = False 82 self.proxy_dict = {} 83 if self.over_proxy and self.estabilish_tls: 84 self.proxy_dict['type'] = 'http' 85 # with SSL over proxy, we do HTTP CONNECT to proxy to open a channel to 86 # BOSH Connection Manager 87 host, port = urisplit(self.bosh_uri)[1:3] 88 self.proxy_dict['xmpp_server'] = (host, port) 89 self.proxy_dict['credentials'] = self.proxy_creds 90 91 # ssl variables 92 self.ssl_fingerprint_sha1 = [] 93 self.ssl_certificate = [] 94 self.ssl_errnum = [] 95 self.ssl_cert_pem = []
96 97
98 - def connect(self, conn_5tuple, on_connect, on_connect_failure):
99 NonBlockingTransport.connect(self, conn_5tuple, on_connect, on_connect_failure) 100 101 global FAKE_DESCRIPTOR 102 FAKE_DESCRIPTOR = FAKE_DESCRIPTOR - 1 103 self.fd = FAKE_DESCRIPTOR 104 105 self.stanza_buffer = [] 106 self.prio_bosh_stanzas = [] 107 108 self.key_stack = KeyStack(KEY_COUNT) 109 self.ack_checker = AckChecker() 110 self.after_init = True 111 112 self.http_socks.append(self.get_new_http_socket()) 113 self._tcp_connecting_started() 114 115 self.http_socks[0].connect( 116 conn_5tuple = conn_5tuple, 117 on_connect = self._on_connect, 118 on_connect_failure = self._on_connect_failure)
119
120 - def _on_connect(self):
121 self.peerhost = self.http_socks[0].peerhost 122 self.ssl_lib = self.http_socks[0].ssl_lib 123 NonBlockingTransport._on_connect(self)
124 125 126
127 - def set_timeout(self, timeout):
128 if self.get_state() != DISCONNECTED and self.fd != -1: 129 NonBlockingTransport.set_timeout(self, timeout) 130 else: 131 log.warn('set_timeout: TIMEOUT NOT SET: state is %s, fd is %s' % (self.get_state(), self.fd))
132
133 - def on_http_request_possible(self):
134 """ 135 Called when HTTP request it's possible to send a HTTP request. It can be when 136 socket is connected or when HTTP response arrived 137 138 There should be always one pending request to BOSH CM. 139 """ 140 log.debug('on_http_req possible, state:\n%s' % self.get_current_state()) 141 if self.get_state()==DISCONNECTED: return 142 143 #Hack for making the non-secure warning dialog work 144 if self._owner.got_features: 145 if (hasattr(self._owner, 'NonBlockingNonSASL') or hasattr(self._owner, 'SASL')): 146 self.send_BOSH(None) 147 else: 148 # If we already got features and no auth module was plugged yet, we are 149 # probably waiting for confirmation of the "not-secure-connection" dialog. 150 # We don't send HTTP request in that case. 151 # see http://lists.jabber.ru/pipermail/ejabberd/2008-August/004027.html 152 return 153 else: 154 self.send_BOSH(None)
155 156 157
158 - def get_socket_in(self, state):
159 """ 160 Get sockets in desired state 161 """ 162 for s in self.http_socks: 163 if s.get_state()==state: return s 164 return None
165 166
167 - def get_free_socket(self):
168 """ 169 Select and returns socket eligible for sending a data to 170 """ 171 if self.http_pipelining: 172 return self.get_socket_in(CONNECTED) 173 else: 174 last_recv_time, tmpsock = 0, None 175 for s in self.http_socks: 176 # we're interested only in CONNECTED socket with no requests pending 177 if s.get_state()==CONNECTED and s.pending_requests==0: 178 # if there's more of them, we want the one with the least recent data receive 179 # (lowest last_recv_time) 180 if (last_recv_time==0) or (s.last_recv_time < last_recv_time): 181 last_recv_time = s.last_recv_time 182 tmpsock = s 183 if tmpsock: 184 return tmpsock 185 else: 186 return None
187 188
189 - def send_BOSH(self, payload):
190 """ 191 Tries to send a stanza in payload by appeding it to a buffer and plugging a 192 free socket for writing. 193 """ 194 total_pending_reqs = sum([s.pending_requests for s in self.http_socks]) 195 196 # when called after HTTP response (Payload=None) and when there are already 197 # some pending requests and no data to send, or when the socket is 198 # disconnected, we do nothing 199 if payload is None and \ 200 total_pending_reqs > 0 and \ 201 self.stanza_buffer == [] and \ 202 self.prio_bosh_stanzas == [] or \ 203 self.get_state()==DISCONNECTED: 204 return 205 206 # Add xmlns to stanza to help ejabberd server 207 if payload and isinstance(payload, Protocol): 208 if not payload.getNamespace(): 209 payload.setNamespace(NS_CLIENT) 210 211 # now the payload is put to buffer and will be sent at some point 212 self.append_stanza(payload) 213 214 # if we're about to make more requests than allowed, we don't send - stanzas will be 215 # sent after HTTP response from CM, exception is when we're disconnecting - then we 216 # send anyway 217 if total_pending_reqs >= self.bosh_requests and self.get_state()!=DISCONNECTING: 218 log.warn('attemp to make more requests than allowed by Connection Manager:\n%s' % 219 self.get_current_state()) 220 return 221 222 # when there's free CONNECTED socket, we plug it for write and the data will 223 # be sent when write is possible 224 if self.get_free_socket(): 225 self.plug_socket() 226 return 227 228 # if there is a connecting socket, we just wait for when it connects, 229 # payload will be sent in a sec when the socket connects 230 if self.get_socket_in(CONNECTING): return 231 232 # being here means there are either DISCONNECTED sockets or all sockets are 233 # CONNECTED with too many pending requests 234 s = self.get_socket_in(DISCONNECTED) 235 236 # if we have DISCONNECTED socket, lets connect it and plug for send 237 if s: 238 self.connect_and_flush(s) 239 else: 240 # otherwise create and connect a new one 241 ss = self.get_new_http_socket() 242 self.http_socks.append(ss) 243 self.connect_and_flush(ss) 244 return
245
246 - def plug_socket(self):
247 stanza = None 248 s = self.get_free_socket() 249 if s: 250 s._plug_idle(writable=True, readable=True) 251 else: 252 log.error('=====!!!!!!!!====> Couldn\'t get free socket in plug_socket())')
253
254 - def build_stanza(self, socket):
255 """ 256 Build a BOSH body tag from data in buffers and adds key, rid and ack 257 attributes to it 258 259 This method is called from _do_send() of underlying transport. This is to 260 ensure rid and keys will be processed in correct order. If I generate 261 them before plugging a socket for write (and did it for two sockets/HTTP 262 connections) in parallel, they might be sent in wrong order, which 263 results in violating the BOSH session and server-side disconnect. 264 """ 265 if self.prio_bosh_stanzas: 266 stanza, add_payload = self.prio_bosh_stanzas.pop(0) 267 if add_payload: 268 stanza.setPayload(self.stanza_buffer) 269 self.stanza_buffer = [] 270 else: 271 stanza = self.boshify_stanzas(self.stanza_buffer) 272 self.stanza_buffer = [] 273 274 stanza = self.ack_checker.backup_stanza(stanza, socket) 275 276 key, newkey = self.key_stack.get() 277 if key: 278 stanza.setAttr('key', key) 279 if newkey: 280 stanza.setAttr('newkey', newkey) 281 282 283 log.info('sending msg with rid=%s to sock %s' % (stanza.getAttr('rid'), id(socket))) 284 self.renew_bosh_wait_timeout(self.bosh_wait + 3) 285 return stanza
286 287
288 - def on_bosh_wait_timeout(self):
289 log.error('Connection Manager didn\'t respond within %s + 3 seconds --> forcing disconnect' % self.bosh_wait) 290 self.disconnect()
291 292
293 - def renew_bosh_wait_timeout(self, timeout):
294 if self.wait_cb_time is not None: 295 self.remove_bosh_wait_timeout() 296 sched_time = self.idlequeue.set_alarm(self.on_bosh_wait_timeout, timeout) 297 self.wait_cb_time = sched_time
298
299 - def remove_bosh_wait_timeout(self):
300 self.idlequeue.remove_alarm( 301 self.on_bosh_wait_timeout, 302 self.wait_cb_time)
303
304 - def on_persistent_fallback(self, socket):
305 """ 306 Called from underlying transport when server closes TCP connection 307 308 :param socket: disconnected transport object 309 """ 310 if socket.http_persistent: 311 log.warn('Fallback to nonpersistent HTTP (no pipelining as well)') 312 socket.http_persistent = False 313 self.http_persistent = False 314 self.http_pipelining = False 315 socket.disconnect(do_callback=False) 316 self.connect_and_flush(socket) 317 else: 318 socket.disconnect()
319 320 321
322 - def handle_body_attrs(self, stanza_attrs):
323 """ 324 Called for each incoming body stanza from dispatcher. Checks body 325 attributes. 326 """ 327 self.remove_bosh_wait_timeout() 328 329 if self.after_init: 330 if stanza_attrs.has_key('sid'): 331 # session ID should be only in init response 332 self.bosh_sid = stanza_attrs['sid'] 333 334 if stanza_attrs.has_key('requests'): 335 self.bosh_requests = int(stanza_attrs['requests']) 336 337 if stanza_attrs.has_key('wait'): 338 self.bosh_wait = int(stanza_attrs['wait']) 339 self.after_init = False 340 341 ack = None 342 if stanza_attrs.has_key('ack'): 343 ack = stanza_attrs['ack'] 344 self.ack_checker.process_incoming_ack(ack=ack, 345 socket=self.current_recv_socket) 346 347 if stanza_attrs.has_key('type'): 348 if stanza_attrs['type'] in ['terminate', 'terminal']: 349 condition = 'n/a' 350 if stanza_attrs.has_key('condition'): 351 condition = stanza_attrs['condition'] 352 if condition == 'n/a': 353 log.info('Received sesion-ending terminating stanza') 354 else: 355 log.error('Received terminating stanza: %s - %s' % (condition, 356 bosh_errors[condition])) 357 self.disconnect() 358 return 359 360 if stanza_attrs['type'] == 'error': 361 # recoverable error 362 pass 363 return
364 365
366 - def append_stanza(self, stanza):
367 """ 368 Append stanza to a buffer to send 369 """ 370 if stanza: 371 if isinstance(stanza, tuple): 372 # stanza is tuple of BOSH stanza and bool value for whether to add payload 373 self.prio_bosh_stanzas.append(stanza) 374 else: 375 # stanza is XMPP stanza. Will be boshified before send. 376 self.stanza_buffer.append(stanza)
377 378
379 - def send(self, stanza, now=False):
380 self.send_BOSH(stanza)
381 382 383
384 - def get_current_state(self):
385 t = '------ SOCKET_ID\tSOCKET_STATE\tPENDING_REQS\n' 386 for s in self.http_socks: 387 t = '%s------ %s\t%s\t%s\n' % (t, id(s), s.get_state(), s.pending_requests) 388 t = '%s------ prio stanzas: %s, queued XMPP stanzas: %s, not_acked stanzas: %s' \ 389 % (t, self.prio_bosh_stanzas, self.stanza_buffer, 390 self.ack_checker.get_not_acked_rids()) 391 return t
392 393
394 - def connect_and_flush(self, socket):
395 socket.connect( 396 conn_5tuple = self.conn_5tuple, 397 on_connect = self.on_http_request_possible, 398 on_connect_failure = self.disconnect)
399 400
401 - def boshify_stanzas(self, stanzas=[], body_attrs=None):
402 """ 403 Wraps zero to many stanzas by body tag with xmlns and sid 404 """ 405 log.debug('boshify_staza - type is: %s, stanza is %s' % (type(stanzas), stanzas)) 406 tag = BOSHBody(attrs={'sid': self.bosh_sid}) 407 tag.setPayload(stanzas) 408 return tag
409 410
411 - def send_init(self, after_SASL=False):
412 if after_SASL: 413 t = BOSHBody( 414 attrs={ 'to': self.bosh_to, 415 'sid': self.bosh_sid, 416 'xml:lang': self.bosh_xml_lang, 417 'xmpp:restart': 'true', 418 'secure': self.bosh_secure, 419 'xmlns:xmpp': 'urn:xmpp:xbosh'}) 420 else: 421 t = BOSHBody( 422 attrs={ 'content': self.bosh_content, 423 'hold': str(self.bosh_hold), 424 'route': 'xmpp:%s:%s' % (self.route_host, self.route_port), 425 'to': self.bosh_to, 426 'wait': str(self.bosh_wait), 427 'xml:lang': self.bosh_xml_lang, 428 'xmpp:version': '1.0', 429 'ver': '1.6', 430 'xmlns:xmpp': 'urn:xmpp:xbosh'}) 431 self.send_BOSH((t, True))
432
433 - def start_disconnect(self):
434 NonBlockingTransport.start_disconnect(self) 435 self.renew_bosh_wait_timeout(DISCONNECT_TIMEOUT_SECONDS) 436 self.send_BOSH( 437 (BOSHBody(attrs={'sid': self.bosh_sid, 'type': 'terminate'}), True))
438 439
440 - def get_new_http_socket(self):
441 http_dict = {'http_uri': self.bosh_uri, 442 'http_version': self.http_version, 443 'http_persistent': self.http_persistent, 444 'add_proxy_headers': self.over_proxy and not self.estabilish_tls} 445 if self.use_proxy_auth: 446 http_dict['proxy_user'], http_dict['proxy_pass'] = self.proxy_creds 447 448 s = NonBlockingHTTPBOSH( 449 raise_event=self.raise_event, 450 on_disconnect=self.disconnect, 451 idlequeue = self.idlequeue, 452 estabilish_tls = self.estabilish_tls, 453 certs = self.certs, 454 on_http_request_possible = self.on_http_request_possible, 455 http_dict = http_dict, 456 proxy_dict = self.proxy_dict, 457 on_persistent_fallback = self.on_persistent_fallback) 458 459 s.onreceive(self.on_received_http) 460 s.set_stanza_build_cb(self.build_stanza) 461 return s
462 463
464 - def onreceive(self, recv_handler):
465 if recv_handler is None: 466 recv_handler = self._owner.Dispatcher.ProcessNonBlocking 467 self.current_recv_handler = recv_handler
468 469
470 - def on_received_http(self, data, socket):
471 self.current_recv_socket = socket 472 self.current_recv_handler(data)
473 474
475 - def disconnect(self, do_callback=True):
476 self.remove_bosh_wait_timeout() 477 if self.get_state() == DISCONNECTED: return 478 self.fd = -1 479 for s in self.http_socks: 480 s.disconnect(do_callback=False) 481 NonBlockingTransport.disconnect(self, do_callback)
482 483
484 -def get_rand_number():
485 # with 50-bit random initial rid, session would have to go up 486 # to 7881299347898368 messages to raise rid over 2**53 487 # (see http://www.xmpp.org/extensions/xep-0124.html#rids) 488 # it's also used for sequence key initialization 489 r = random.Random() 490 r.seed() 491 return r.getrandbits(50)
492 493 494
495 -class AckChecker():
496 """ 497 Class for generating rids and generating and checking acknowledgements in 498 BOSH messages 499 """
500 - def __init__(self):
501 self.rid = get_rand_number() 502 self.ack = 1 503 self.last_rids = {} 504 self.not_acked = []
505 506
507 - def get_not_acked_rids(self): return [rid for rid, st in self.not_acked]
508
509 - def backup_stanza(self, stanza, socket):
510 socket.pending_requests += 1 511 rid = self.get_rid() 512 self.not_acked.append((rid, stanza)) 513 stanza.setAttr('rid', str(rid)) 514 self.last_rids[socket]=rid 515 516 if self.rid != self.ack + 1: 517 stanza.setAttr('ack', str(self.ack)) 518 return stanza
519
520 - def process_incoming_ack(self, socket, ack=None):
521 socket.pending_requests -= 1 522 if ack: 523 ack = int(ack) 524 else: 525 ack = self.last_rids[socket] 526 527 i = len([rid for rid, st in self.not_acked if ack >= rid]) 528 self.not_acked = self.not_acked[i:] 529 530 self.ack = ack
531 532
533 - def get_rid(self):
534 self.rid = self.rid + 1 535 return self.rid
536 537 538 539 540
541 -class KeyStack():
542 """ 543 Class implementing key sequences for BOSH messages 544 """
545 - def __init__(self, count):
546 self.count = count 547 self.keys = [] 548 self.reset() 549 self.first_call = True
550
551 - def reset(self):
552 seed = str(get_rand_number()) 553 self.keys = [sha1(seed).hexdigest()] 554 for i in range(self.count-1): 555 curr_seed = self.keys[i] 556 self.keys.append(sha1(curr_seed).hexdigest())
557
558 - def get(self):
559 if self.first_call: 560 self.first_call = False 561 return (None, self.keys.pop()) 562 563 if len(self.keys)>1: 564 return (self.keys.pop(), None) 565 else: 566 last_key = self.keys.pop() 567 self.reset() 568 new_key = self.keys.pop() 569 return (last_key, new_key)
570 571 # http://www.xmpp.org/extensions/xep-0124.html#errorstatus-terminal 572 bosh_errors = { 573 'n/a': 'none or unknown condition in terminating body stanza', 574 'bad-request': 'The format of an HTTP header or binding element received from the client is unacceptable (e.g., syntax error), or Script Syntax is not supported.', 575 'host-gone': 'The target domain specified in the "to" attribute or the target host or port specified in the "route" attribute is no longer serviced by the connection manager.', 576 'host-unknown': 'The target domain specified in the "to" attribute or the target host or port specified in the "route" attribute is unknown to the connection manager.', 577 'improper-addressing': 'The initialization element lacks a "to" or "route" attribute (or the attribute has no value) but the connection manager requires one.', 578 'internal-server-error': 'The connection manager has experienced an internal error that prevents it from servicing the request.', 579 'item-not-found': '(1) "sid" is not valid, (2) "stream" is not valid, (3) "rid" is larger than the upper limit of the expected window, (4) connection manager is unable to resend response, (5) "key" sequence is invalid', 580 'other-request': 'Another request being processed at the same time as this request caused the session to terminate.', 581 'policy-violation': 'The client has broken the session rules (polling too frequently, requesting too frequently, too many simultaneous requests).', 582 'remote-connection-failed': 'The connection manager was unable to connect to, or unable to connect securely to, or has lost its connection to, the server.', 583 'remote-stream-error': 'Encapsulates an error in the protocol being transported.', 584 'see-other-uri': 'The connection manager does not operate at this URI (e.g., the connection manager accepts only SSL or TLS connections at some https: URI rather than the http: URI requested by the client). The client may try POSTing to the URI in the content of the <uri/> child element.', 585 'system-shutdown': 'The connection manager is being shut down. All active HTTP sessions are being terminated. No new sessions can be created.', 586 'undefined-condition': 'The error is not one of those defined herein; the connection manager SHOULD include application-specific information in the content of the <body/> wrapper.' 587 } 588

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.bosh.AckChecker-class.html000066400000000000000000000307041343257752000263370ustar00rootroot00000000000000 nbxmpp.bosh.AckChecker
Package nbxmpp :: Module bosh :: Class AckChecker
[hide private]
[frames] | no frames]

Class AckChecker

source code

Class for generating rids and generating and checking acknowledgements in BOSH messages
Instance Methods [hide private]
 
__init__(self) source code
 
get_not_acked_rids(self) source code
 
backup_stanza(self, stanza, socket) source code
 
process_incoming_ack(self, socket, ack=None) source code
 
get_rid(self) source code
Method Details [hide private]

__init__(self)
(Constructor)

source code 

get_not_acked_rids(self)

source code 

backup_stanza(self, stanza, socket)

source code 

process_incoming_ack(self, socket, ack=None)

source code 

get_rid(self)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.bosh.KeyStack-class.html000066400000000000000000000225571343257752000261010ustar00rootroot00000000000000 nbxmpp.bosh.KeyStack
Package nbxmpp :: Module bosh :: Class KeyStack
[hide private]
[frames] | no frames]

Class KeyStack

source code

Class implementing key sequences for BOSH messages
Instance Methods [hide private]
 
__init__(self, count) source code
 
reset(self) source code
 
get(self) source code
Method Details [hide private]

__init__(self, count)
(Constructor)

source code 

reset(self)

source code 

get(self)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.bosh.NonBlockingBOSH-class.html000066400000000000000000001644241343257752000272420ustar00rootroot00000000000000 nbxmpp.bosh.NonBlockingBOSH
Package nbxmpp :: Module bosh :: Class NonBlockingBOSH
[hide private]
[frames] | no frames]

Class NonBlockingBOSH

source code


Instance Methods [hide private]
 
__init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, xmpp_server, domain, bosh_dict, proxy_creds)
Each trasport class can have different constructor but it has to have at least all the arguments of NonBlockingTransport constructor
source code
 
connect(self, conn_5tuple, on_connect, on_connect_failure)
Creates and connects transport to server and port defined in conn_5tuple which should be item from list returned from getaddrinfo
source code
 
_on_connect(self)
Preceeds call of on_connect callback
source code
 
set_timeout(self, timeout) source code
 
on_http_request_possible(self)
Called when HTTP request it's possible to send a HTTP request. It can be when socket is connected or when HTTP response arrived
source code
 
get_socket_in(self, state)
Get sockets in desired state
source code
 
get_free_socket(self)
Select and returns socket eligible for sending a data to
source code
 
send_BOSH(self, payload)
Tries to send a stanza in payload by appeding it to a buffer and plugging a free socket for writing.
source code
 
plug_socket(self) source code
 
build_stanza(self, socket)
Build a BOSH body tag from data in buffers and adds key, rid and ack attributes to it
source code
 
on_bosh_wait_timeout(self) source code
 
renew_bosh_wait_timeout(self, timeout) source code
 
remove_bosh_wait_timeout(self) source code
 
on_persistent_fallback(self, socket)
Called from underlying transport when server closes TCP connection
source code
 
handle_body_attrs(self, stanza_attrs)
Called for each incoming body stanza from dispatcher. Checks body attributes.
source code
 
append_stanza(self, stanza)
Append stanza to a buffer to send
source code
 
send(self, stanza, now=False) source code
 
get_current_state(self) source code
 
connect_and_flush(self, socket) source code
 
boshify_stanzas(self, stanzas=[], body_attrs=None)
Wraps zero to many stanzas by body tag with xmlns and sid
source code
 
send_init(self, after_SASL=False) source code
 
start_disconnect(self) source code
 
get_new_http_socket(self) source code
 
onreceive(self, recv_handler)
Set the on_receive callback.
source code
 
on_received_http(self, data, socket) source code
 
disconnect(self, do_callback=True) source code

Inherited from transports_nb.NonBlockingTransport: get_fd, get_state, plugin, plugout, read_timeout, read_timeout2, remove_timeout, renew_send_timeout, renew_send_timeout2, set_send_timeout, set_send_timeout2, set_state, set_timeout2

Inherited from plugin.PlugIn: PlugIn, PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Method Details [hide private]

__init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, xmpp_server, domain, bosh_dict, proxy_creds)
(Constructor)

source code 
Each trasport class can have different constructor but it has to have at least all the arguments of NonBlockingTransport constructor
Parameters:
  • raise_event - callback for monitoring of sent and received data
  • on_disconnect - callback called on disconnection during runtime
  • idlequeue - processing idlequeue
  • estabilish_tls - boolean whether to estabilish TLS connection after TCP connection is done
  • certs - tuple of (cacerts, mycerts) see constructor of tls_nb.NonBlockingTLS for more details
Overrides: plugin.PlugIn.__init__

connect(self, conn_5tuple, on_connect, on_connect_failure)

source code 
Creates and connects transport to server and port defined in conn_5tuple which should be item from list returned from getaddrinfo
Parameters:
  • conn_5tuple - 5-tuple returned from getaddrinfo
  • on_connect - callback called on successful connect to the server
  • on_connect_failure - callback called on failure when connecting
Overrides: transports_nb.NonBlockingTransport.connect
(inherited documentation)

_on_connect(self)

source code 
Preceeds call of on_connect callback
Overrides: transports_nb.NonBlockingTransport._on_connect
(inherited documentation)

set_timeout(self, timeout)

source code 
Overrides: transports_nb.NonBlockingTransport.set_timeout

on_http_request_possible(self)

source code 

Called when HTTP request it's possible to send a HTTP request. It can be when socket is connected or when HTTP response arrived

There should be always one pending request to BOSH CM.

get_socket_in(self, state)

source code 
Get sockets in desired state

get_free_socket(self)

source code 
Select and returns socket eligible for sending a data to

send_BOSH(self, payload)

source code 
Tries to send a stanza in payload by appeding it to a buffer and plugging a free socket for writing.

plug_socket(self)

source code 

build_stanza(self, socket)

source code 

Build a BOSH body tag from data in buffers and adds key, rid and ack attributes to it

This method is called from _do_send() of underlying transport. This is to ensure rid and keys will be processed in correct order. If I generate them before plugging a socket for write (and did it for two sockets/HTTP connections) in parallel, they might be sent in wrong order, which results in violating the BOSH session and server-side disconnect.

on_bosh_wait_timeout(self)

source code 

renew_bosh_wait_timeout(self, timeout)

source code 

remove_bosh_wait_timeout(self)

source code 

on_persistent_fallback(self, socket)

source code 
Called from underlying transport when server closes TCP connection
Parameters:
  • socket - disconnected transport object

handle_body_attrs(self, stanza_attrs)

source code 
Called for each incoming body stanza from dispatcher. Checks body attributes.

append_stanza(self, stanza)

source code 
Append stanza to a buffer to send

send(self, stanza, now=False)

source code 
Overrides: transports_nb.NonBlockingTransport.send

get_current_state(self)

source code 

connect_and_flush(self, socket)

source code 

boshify_stanzas(self, stanzas=[], body_attrs=None)

source code 
Wraps zero to many stanzas by body tag with xmlns and sid

send_init(self, after_SASL=False)

source code 

get_new_http_socket(self)

source code 

onreceive(self, recv_handler)

source code 

Set the on_receive callback.

onreceive(None) sets callback to Dispatcher.ProcessNonBlocking which is the default one that will decide what to do with received stanza based on its tag name and namespace.

Do not confuse it with on_receive() method, which is the callback itself.

Overrides: transports_nb.NonBlockingTransport.onreceive
(inherited documentation)

on_received_http(self, data, socket)

source code 

disconnect(self, do_callback=True)

source code 
Overrides: transports_nb.NonBlockingTransport.disconnect

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.c14n-module.html000066400000000000000000000271671343257752000243600ustar00rootroot00000000000000 nbxmpp.c14n
Package nbxmpp :: Module c14n
[hide private]
[frames] | no frames]

Module c14n

source code

XML canonicalisation methods (for XEP-0116)
Functions [hide private]
 
c14n(node, is_buggy) source code
 
normalise_attr(val) source code
 
normalise_text(val) source code
Variables [hide private]
  __package__ = 'nbxmpp'

Imports: ustr


Function Details [hide private]

c14n(node, is_buggy)

source code 

normalise_attr(val)

source code 

normalise_text(val)

source code 

Variables Details [hide private]

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.c14n-pysrc.html000066400000000000000000000524441343257752000242270ustar00rootroot00000000000000 nbxmpp.c14n
Package nbxmpp :: Module c14n
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.c14n

 1  # -*- coding:utf-8 -*- 
 2  ## c14n.py 
 3  ## 
 4  ## Copyright (C) 2007-2008 Brendan Taylor <whateley AT gmail.com> 
 5  ## 
 6  ## This file is part of Gajim. 
 7  ## 
 8  ## Gajim is free software; you can redistribute it and/or modify 
 9  ## it under the terms of the GNU General Public License as published 
10  ## by the Free Software Foundation; version 3 only. 
11  ## 
12  ## Gajim is distributed in the hope that it will be useful, 
13  ## but WITHOUT ANY WARRANTY; without even the implied warranty of 
14  ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
15  ## GNU General Public License for more details. 
16  ## 
17  ## You should have received a copy of the GNU General Public License 
18  ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. 
19  ## 
20   
21  """ 
22  XML canonicalisation methods (for XEP-0116) 
23  """ 
24   
25  from simplexml import ustr 
26   
27 -def c14n(node, is_buggy):
28 s = "<" + node.name 29 if node.namespace: 30 if not node.parent or node.parent.namespace != node.namespace: 31 s = s + ' xmlns="%s"' % node.namespace 32 33 sorted_attrs = sorted(node.attrs.keys()) 34 for key in sorted_attrs: 35 if not is_buggy and key == 'xmlns': 36 continue 37 val = ustr(node.attrs[key]) 38 # like XMLescape() but with whitespace and without &gt; 39 s = s + ' %s="%s"' % ( key, normalise_attr(val) ) 40 s = s + ">" 41 cnt = 0 42 if node.kids: 43 for a in node.kids: 44 if (len(node.data)-1) >= cnt: 45 s = s + normalise_text(node.data[cnt]) 46 s = s + c14n(a, is_buggy) 47 cnt=cnt+1 48 if (len(node.data)-1) >= cnt: s = s + normalise_text(node.data[cnt]) 49 if not node.kids and s.endswith('>'): 50 s=s[:-1]+' />' 51 else: 52 s = s + "</" + node.name + ">" 53 return s.encode('utf-8')
54
55 -def normalise_attr(val):
56 return val.replace('&', '&amp;').replace('<', '&lt;').replace('"', '&quot;').replace('\t', '&#x9;').replace('\n', '&#xA;').replace('\r', '&#xD;')
57
58 -def normalise_text(val):
59 return val.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('\r', '&#xD;')
60

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.client_nb-module.html000066400000000000000000000220441343257752000255350ustar00rootroot00000000000000 nbxmpp.client_nb
Package nbxmpp :: Module client_nb
[hide private]
[frames] | no frames]

Module client_nb

source code

Client class establishs connection to XMPP Server and handles authentication
Classes [hide private]
  NonBlockingClient
Client class is XMPP connection mountpoint. Objects for authentication, network communication, roster, xml parsing ... are plugged to client object. Client implements the abstract behavior - mostly negotioation and callbacks handling, whereas underlying modules take care of feature-specific logic
Variables [hide private]
  log = logging.getLogger('nbxmpp.client_nb')
  __package__ = 'nbxmpp'

Imports: socket, transports_nb, dispatcher_nb, auth_nb, roster_nb, protocol, bosh, NS_TLS, logging


Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.client_nb')

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.client_nb-pysrc.html000066400000000000000000006115211343257752000254140ustar00rootroot00000000000000 nbxmpp.client_nb
Package nbxmpp :: Module client_nb
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.client_nb

  1  ##   client_nb.py 
  2  ##         based on client.py, changes backported up to revision 1.60 
  3  ## 
  4  ##   Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 
  5  ##         modified by Dimitur Kirov <dkirov@gmail.com> 
  6  ## 
  7  ##   This program is free software; you can redistribute it and/or modify 
  8  ##   it under the terms of the GNU General Public License as published by 
  9  ##   the Free Software Foundation; either version 2, or (at your option) 
 10  ##   any later version. 
 11  ## 
 12  ##   This program is distributed in the hope that it will be useful, 
 13  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
 14  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 15  ##   GNU General Public License for more details. 
 16   
 17  # $Id: client.py,v 1.52 2006/01/02 19:40:55 normanr Exp $ 
 18   
 19  """ 
 20  Client class establishs connection to XMPP Server and handles authentication 
 21  """ 
 22   
 23  import socket 
 24  import transports_nb, dispatcher_nb, auth_nb, roster_nb, protocol, bosh 
 25  from protocol import NS_TLS 
 26   
 27  import logging 
 28  log = logging.getLogger('nbxmpp.client_nb') 
 29   
 30   
31 -class NonBlockingClient:
32 """ 33 Client class is XMPP connection mountpoint. Objects for authentication, 34 network communication, roster, xml parsing ... are plugged to client object. 35 Client implements the abstract behavior - mostly negotioation and callbacks 36 handling, whereas underlying modules take care of feature-specific logic 37 """ 38
39 - def __init__(self, domain, idlequeue, caller=None):
40 """ 41 Caches connection data 42 43 :param domain: domain - for to: attribute (from account info) 44 :param idlequeue: processing idlequeue 45 :param caller: calling object - it has to implement methods 46 _event_dispatcher which is called from dispatcher instance 47 """ 48 self.Namespace = protocol.NS_CLIENT 49 self.defaultNamespace = self.Namespace 50 51 self.idlequeue = idlequeue 52 self.disconnect_handlers = [] 53 54 self.Server = domain 55 self.xmpp_hostname = None # FQDN hostname to connect to 56 57 # caller is who initiated this client, it is in needed to register 58 # the EventDispatcher 59 self._caller = caller 60 self._owner = self 61 self._registered_name = None # our full jid, set after successful auth 62 self.connected = '' 63 self.ip_addresses = [] 64 self.socket = None 65 self.on_connect = None 66 self.on_proxy_failure = None 67 self.on_connect_failure = None 68 self.proxy = None 69 self.got_features = False 70 self.got_see_other_host = None 71 self.stream_started = False 72 self.disconnecting = False 73 self.protocol_type = 'XMPP'
74
75 - def disconnect(self, message=''):
76 """ 77 Called on disconnection - disconnect callback is picked based on state of 78 the client. 79 """ 80 # to avoid recursive calls 81 if self.ip_addresses: 82 self._try_next_ip() 83 return 84 if self.disconnecting: return 85 86 log.info('Disconnecting NBClient: %s' % message) 87 88 sasl_failed = False 89 if 'NonBlockingRoster' in self.__dict__: 90 self.NonBlockingRoster.PlugOut() 91 if 'NonBlockingBind' in self.__dict__: 92 self.NonBlockingBind.PlugOut() 93 if 'NonBlockingNonSASL' in self.__dict__: 94 self.NonBlockingNonSASL.PlugOut() 95 if 'SASL' in self.__dict__: 96 if 'startsasl' in self.SASL.__dict__ and \ 97 self.SASL.startsasl == 'failure-in-process': 98 sasl_failed = True 99 self.SASL.startsasl = 'failure' 100 self._on_start_sasl() 101 else: 102 self.SASL.PlugOut() 103 if 'NonBlockingTCP' in self.__dict__: 104 self.NonBlockingTCP.PlugOut() 105 if 'NonBlockingHTTP' in self.__dict__: 106 self.NonBlockingHTTP.PlugOut() 107 if 'NonBlockingBOSH' in self.__dict__: 108 self.NonBlockingBOSH.PlugOut() 109 # FIXME: we never unplug dispatcher, only on next connect 110 # See _xmpp_connect_machine and SASLHandler 111 112 connected = self.connected 113 stream_started = self.stream_started 114 115 self.connected = '' 116 self.stream_started = False 117 118 self.disconnecting = True 119 120 log.debug('Client disconnected..') 121 # Don't call any callback when it's a SASL failure. 122 # SASL handler is already called 123 if connected == '' and not sasl_failed: 124 # if we're disconnecting before connection to XMPP sever is opened, 125 # we don't call disconnect handlers but on_connect_failure callback 126 if self.proxy: 127 # with proxy, we have different failure callback 128 log.debug('calling on_proxy_failure cb') 129 self.on_proxy_failure(reason=message) 130 else: 131 log.debug('calling on_connect_failure cb') 132 self.on_connect_failure() 133 elif not sasl_failed: 134 # we are connected to XMPP server 135 if not stream_started: 136 # if error occur before XML stream was opened, e.g. no response on 137 # init request, we call the on_connect_failure callback because 138 # proper connection is not established yet and it's not a proxy 139 # issue 140 log.debug('calling on_connect_failure cb') 141 self._caller.streamError = message 142 self.on_connect_failure() 143 else: 144 # with open connection, we are calling the disconnect handlers 145 for i in reversed(self.disconnect_handlers): 146 log.debug('Calling disconnect handler %s' % i) 147 i() 148 self.disconnecting = False
149
150 - def connect(self, on_connect, on_connect_failure, hostname=None, port=5222, 151 on_proxy_failure=None, on_stream_error_cb=None, proxy=None, 152 secure_tuple=('plain', None, None)):
153 """ 154 Open XMPP connection (open XML streams in both directions) 155 156 :param on_connect: called after stream is successfully opened 157 :param on_connect_failure: called when error occures during connection 158 :param hostname: hostname of XMPP server from SRV request 159 :param port: port number of XMPP server 160 :param on_proxy_failure: called if error occurres during TCP connection to 161 proxy server or during proxy connecting process 162 :param proxy: dictionary with proxy data. It should contain at least 163 values for keys 'host' and 'port' - connection details for proxy serve 164 and optionally keys 'user' and 'pass' as proxy credentials 165 :param secure_tuple: tuple of (desired connection type, cacerts, mycerts) 166 connection type can be 'ssl' - TLS established after TCP connection, 167 'tls' - TLS established after negotiation with starttls, or 'plain'. 168 cacerts, mycerts - see tls_nb.NonBlockingTLS constructor for more 169 details 170 """ 171 self.on_connect = on_connect 172 self.on_connect_failure=on_connect_failure 173 self.on_proxy_failure = on_proxy_failure 174 self.on_stream_error_cb = on_stream_error_cb 175 self.desired_security, self.cacerts, self.mycerts = secure_tuple 176 self.Connection = None 177 self.Port = port 178 self.proxy = proxy 179 180 if hostname: 181 self.xmpp_hostname = hostname 182 else: 183 self.xmpp_hostname = self.Server 184 185 # We only check for SSL here as for TLS we will first have to start a 186 # PLAIN connection and negotiate TLS afterwards. 187 # establish_tls will instruct transport to start secure connection 188 # directly 189 establish_tls = self.desired_security == 'ssl' 190 certs = (self.cacerts, self.mycerts) 191 192 proxy_dict = {} 193 tcp_host = self.xmpp_hostname 194 tcp_port = self.Port 195 196 if proxy: 197 # with proxies, client connects to proxy instead of directly to 198 # XMPP server ((hostname, port)) 199 # tcp_host is hostname of machine used for socket connection 200 # (DNS request will be done for proxy or BOSH CM hostname) 201 tcp_host, tcp_port, proxy_user, proxy_pass = \ 202 transports_nb.get_proxy_data_from_dict(proxy) 203 204 if proxy['type'] == 'bosh': 205 # Setup BOSH transport 206 self.socket = bosh.NonBlockingBOSH.get_instance( 207 on_disconnect=self.disconnect, 208 raise_event=self.raise_event, 209 idlequeue=self.idlequeue, 210 estabilish_tls=establish_tls, 211 certs=certs, 212 proxy_creds=(proxy_user, proxy_pass), 213 xmpp_server=(self.xmpp_hostname, self.Port), 214 domain=self.Server, 215 bosh_dict=proxy) 216 self.protocol_type = 'BOSH' 217 self.wait_for_restart_response = \ 218 proxy['bosh_wait_for_restart_response'] 219 else: 220 # http proxy 221 proxy_dict['type'] = proxy['type'] 222 proxy_dict['xmpp_server'] = (self.xmpp_hostname, self.Port) 223 proxy_dict['credentials'] = (proxy_user, proxy_pass) 224 225 if not proxy or proxy['type'] != 'bosh': 226 # Setup ordinary TCP transport 227 self.socket = transports_nb.NonBlockingTCP.get_instance( 228 on_disconnect=self.disconnect, 229 raise_event=self.raise_event, 230 idlequeue=self.idlequeue, 231 estabilish_tls=establish_tls, 232 certs=certs, 233 proxy_dict=proxy_dict) 234 235 # plug transport into client as self.Connection 236 self.socket.PlugIn(self) 237 238 self._resolve_hostname( 239 hostname=tcp_host, 240 port=tcp_port, 241 on_success=self._try_next_ip)
242
243 - def _resolve_hostname(self, hostname, port, on_success):
244 """ 245 Wrapper for getaddinfo call 246 247 FIXME: getaddinfo blocks 248 """ 249 try: 250 self.ip_addresses = socket.getaddrinfo(hostname, port, 251 socket.AF_UNSPEC, socket.SOCK_STREAM) 252 except socket.gaierror, (errnum, errstr): 253 self.disconnect(message='Lookup failure for %s:%s, hostname: %s - %s' % 254 (self.Server, self.Port, hostname, errstr)) 255 except socket.error , (errnum, errstr): 256 # Catches an unexpected error with the socket 257 self.disconnect(message='General socket error for %s:%s, hostname: %s - %s' % 258 (self.Server, self.Port, hostname, errstr)) 259 else: 260 on_success()
261
262 - def _try_next_ip(self, err_message=None):
263 """ 264 Iterate over IP addresses tries to connect to it 265 """ 266 if err_message: 267 log.debug('While looping over DNS A records: %s' % err_message) 268 if self.ip_addresses == []: 269 msg = 'Run out of hosts for name %s:%s.' % (self.Server, self.Port) 270 msg = msg + ' Error for last IP: %s' % err_message 271 self.disconnect(msg) 272 else: 273 self.current_ip = self.ip_addresses.pop(0) 274 self.socket.connect( 275 conn_5tuple=self.current_ip, 276 on_connect=lambda: self._xmpp_connect(), 277 on_connect_failure=self._try_next_ip)
278
279 - def incoming_stream_version(self):
280 """ 281 Get version of xml stream 282 """ 283 if 'version' in self.Dispatcher.Stream._document_attrs: 284 return self.Dispatcher.Stream._document_attrs['version'] 285 else: 286 return None
287
288 - def _xmpp_connect(self, socket_type=None):
289 """ 290 Start XMPP connecting process - open the XML stream. Is called after TCP 291 connection is established or after switch to TLS when successfully 292 negotiated with <starttls>. 293 """ 294 # socket_type contains info which transport connection was established 295 if not socket_type: 296 if self.Connection.ssl_lib: 297 # When ssl_lib is set we connected via SSL 298 socket_type = 'ssl' 299 else: 300 # PLAIN is default 301 socket_type = 'plain' 302 self.connected = socket_type 303 self._xmpp_connect_machine()
304
305 - def _xmpp_connect_machine(self, mode=None, data=None):
306 """ 307 Finite automaton taking care of stream opening and features tag handling. 308 Calls _on_stream_start when stream is started, and disconnect() on 309 failure. 310 """ 311 log.info('-------------xmpp_connect_machine() >> mode: %s, data: %s...' % 312 (mode, str(data)[:20])) 313 314 def on_next_receive(mode): 315 """ 316 Set desired on_receive callback on transport based on the state of 317 connect_machine. 318 """ 319 log.info('setting %s on next receive' % mode) 320 if mode is None: 321 self.onreceive(None) # switch to Dispatcher.ProcessNonBlocking 322 else: 323 self.onreceive(lambda _data:self._xmpp_connect_machine(mode, _data))
324 325 if not mode: 326 # starting state 327 if self.__dict__.has_key('Dispatcher'): 328 self.Dispatcher.PlugOut() 329 self.got_features = False 330 dispatcher_nb.Dispatcher.get_instance().PlugIn(self) 331 on_next_receive('RECEIVE_DOCUMENT_ATTRIBUTES') 332 333 elif mode == 'FAILURE': 334 self.disconnect('During XMPP connect: %s' % data) 335 336 elif mode == 'RECEIVE_DOCUMENT_ATTRIBUTES': 337 if data: 338 self.Dispatcher.ProcessNonBlocking(data) 339 self.ip_addresses = [] 340 if not hasattr(self, 'Dispatcher') or \ 341 self.Dispatcher.Stream._document_attrs is None: 342 self._xmpp_connect_machine( 343 mode='FAILURE', 344 data='Error on stream open') 345 return 346 347 # if terminating stanza was received after init request then client gets 348 # disconnected from bosh transport plugin and we have to end the stream 349 # negotiating process straight away. 350 # fixes #4657 351 if not self.connected: return 352 353 if self.incoming_stream_version() == '1.0': 354 if not self.got_features: 355 on_next_receive('RECEIVE_STREAM_FEATURES') 356 else: 357 log.info('got STREAM FEATURES in first recv') 358 self._xmpp_connect_machine(mode='STREAM_STARTED') 359 else: 360 log.info('incoming stream version less than 1.0') 361 self._xmpp_connect_machine(mode='STREAM_STARTED') 362 363 elif mode == 'RECEIVE_STREAM_FEATURES': 364 if data: 365 # sometimes <features> are received together with document 366 # attributes and sometimes on next receive... 367 self.Dispatcher.ProcessNonBlocking(data) 368 if self.got_see_other_host: 369 log.info('got see-other-host') 370 self.onreceive(None) 371 self.on_stream_error_cb(self, self.got_see_other_host) 372 elif not self.got_features: 373 self._xmpp_connect_machine(mode='FAILURE', 374 data='Missing <features> in 1.0 stream') 375 else: 376 log.info('got STREAM FEATURES in second recv') 377 self._xmpp_connect_machine(mode='STREAM_STARTED') 378 379 elif mode == 'STREAM_STARTED': 380 self._on_stream_start()
381
382 - def _on_stream_start(self):
383 """ 384 Called after XMPP stream is opened. TLS negotiation may follow if 385 supported and desired. 386 """ 387 self.stream_started = True 388 if not hasattr(self, 'onreceive'): 389 # we may already have been disconnected 390 return 391 self.onreceive(None) 392 393 if self.connected == 'plain': 394 if self.desired_security == 'plain': 395 # if we want and have plain connection, we're done now 396 self._on_connect() 397 else: 398 # try to negotiate TLS 399 if self.incoming_stream_version() != '1.0': 400 # if stream version is less than 1.0, we can't do more 401 log.info('While connecting with type = "tls": stream version ' + 402 'is less than 1.0') 403 self._on_connect() 404 return 405 if self.Dispatcher.Stream.features.getTag('starttls'): 406 # Server advertises TLS support, start negotiation 407 self.stream_started = False 408 log.info('TLS supported by remote server. Requesting TLS start.') 409 self._tls_negotiation_handler() 410 else: 411 log.info('While connecting with type = "tls": TLS unsupported ' + 412 'by remote server') 413 self._on_connect() 414 415 elif self.connected in ['ssl', 'tls']: 416 self._on_connect() 417 else: 418 assert False, 'Stream opened for unsupported connection'
419
420 - def _tls_negotiation_handler(self, con=None, tag=None):
421 """ 422 Take care of TLS negotioation with <starttls> 423 """ 424 log.info('-------------tls_negotiaton_handler() >> tag: %s' % tag) 425 if not con and not tag: 426 # starting state when we send the <starttls> 427 self.RegisterHandlerOnce('proceed', self._tls_negotiation_handler, 428 xmlns=NS_TLS) 429 self.RegisterHandlerOnce('failure', self._tls_negotiation_handler, 430 xmlns=NS_TLS) 431 self.send('<starttls xmlns="%s"/>' % NS_TLS) 432 else: 433 # we got <proceed> or <failure> 434 if tag.getNamespace() != NS_TLS: 435 self.disconnect('Unknown namespace: %s' % tag.getNamespace()) 436 return 437 tagname = tag.getName() 438 if tagname == 'failure': 439 self.disconnect('TLS <failure> received: %s' % tag) 440 return 441 log.info('Got starttls proceed response. Switching to TLS/SSL...') 442 # following call wouldn't work for BOSH transport but it doesn't matter 443 # because <starttls> negotiation with BOSH is forbidden 444 self.Connection.tls_init( 445 on_succ = lambda: self._xmpp_connect(socket_type='tls'), 446 on_fail = lambda: self.disconnect('error while etabilishing TLS'))
447
448 - def _on_connect(self):
449 """ 450 Preceed call of on_connect callback 451 """ 452 self.onreceive(None) 453 self.on_connect(self, self.connected)
454
455 - def raise_event(self, event_type, data):
456 """ 457 Raise event to connection instance. DATA_SENT and DATA_RECIVED events 458 are used in XML console to show XMPP traffic 459 """ 460 log.info('raising event from transport: :::::%s::::\n_____________\n%s\n_____________\n' % (event_type, data)) 461 if hasattr(self, 'Dispatcher'): 462 self.Dispatcher.Event('', event_type, data)
463 464 ############################################################################### 465 ### follows code for authentication, resource bind, session and roster download 466 ############################################################################### 467
468 - def auth(self, user, password, resource='', sasl=True, on_auth=None):
469 """ 470 Authenticate connnection and bind resource. If resource is not provided 471 random one or library name used 472 473 :param user: XMPP username 474 :param password: XMPP password 475 :param resource: resource that shall be used for auth/connecting 476 :param sasl: Boolean indicating if SASL shall be used. (default: True) 477 :param on_auth: Callback, called after auth. On auth failure, argument 478 is None. 479 """ 480 self._User, self._Password = user, password 481 self._Resource, self._sasl = resource, sasl 482 self.on_auth = on_auth 483 self._on_doc_attrs() 484 return
485
486 - def _on_old_auth(self, res):
487 """ 488 Callback used by NON-SASL auth. On auth failure, res is None 489 """ 490 if res: 491 self.connected += '+old_auth' 492 self.on_auth(self, 'old_auth') 493 else: 494 self.on_auth(self, None)
495
496 - def _on_sasl_auth(self, res):
497 """ 498 Used internally. On auth failure, res is None 499 """ 500 self.onreceive(None) 501 if res: 502 self.connected += '+sasl' 503 self.on_auth(self, 'sasl') 504 else: 505 self.on_auth(self, None)
506
507 - def _on_doc_attrs(self):
508 """ 509 Plug authentication objects and start auth 510 """ 511 if self._sasl: 512 auth_nb.SASL.get_instance(self._User, self._Password, 513 self._on_start_sasl).PlugIn(self) 514 if not hasattr(self, 'SASL'): 515 return 516 if not self._sasl or self.SASL.startsasl == 'not-supported': 517 if not self._Resource: 518 self._Resource = 'xmpppy' 519 auth_nb.NonBlockingNonSASL.get_instance(self._User, self._Password, 520 self._Resource, self._on_old_auth).PlugIn(self) 521 return 522 self.SASL.auth() 523 return True
524
525 - def _on_start_sasl(self, data=None):
526 """ 527 Callback used by SASL, called on each auth step 528 """ 529 if data: 530 self.Dispatcher.ProcessNonBlocking(data) 531 if not 'SASL' in self.__dict__: 532 # SASL is pluged out, possible disconnect 533 return 534 if self.SASL.startsasl == 'in-process': 535 return 536 self.onreceive(None) 537 if self.SASL.startsasl == 'failure': 538 # wrong user/pass, stop auth 539 if 'SASL' in self.__dict__: 540 self.SASL.PlugOut() 541 self.connected = None # FIXME: is this intended? We use ''elsewhere 542 self._on_sasl_auth(None) 543 elif self.SASL.startsasl == 'success': 544 nb_bind = auth_nb.NonBlockingBind.get_instance() 545 sm = self._caller.sm 546 if sm._owner and sm.resumption: 547 nb_bind.resuming = True 548 sm.set_owner(self) 549 self.Dispatcher.sm = sm 550 nb_bind.PlugIn(self) 551 self.on_auth(self, 'sasl') 552 return 553 554 nb_bind.PlugIn(self) 555 self.onreceive(self._on_auth_bind) 556 return True
557
558 - def _on_auth_bind(self, data):
559 # FIXME: Why use this callback and not bind directly? 560 if data: 561 self.Dispatcher.ProcessNonBlocking(data) 562 if self.NonBlockingBind.bound is None: 563 return 564 self.NonBlockingBind.NonBlockingBind(self._Resource, self._on_sasl_auth) 565 return True
566
567 - def initRoster(self, version=''):
568 """ 569 Plug in the roster 570 """ 571 if not self.__dict__.has_key('NonBlockingRoster'): 572 return roster_nb.NonBlockingRoster.get_instance(version=version).PlugIn(self)
573
574 - def getRoster(self, on_ready=None, force=False):
575 """ 576 Return the Roster instance, previously plugging it in and requesting 577 roster from server if needed 578 """ 579 if self.__dict__.has_key('NonBlockingRoster'): 580 return self.NonBlockingRoster.getRoster(on_ready, force) 581 return None
582
583 - def sendPresence(self, jid=None, typ=None, requestRoster=0):
584 """ 585 Send some specific presence state. Can also request roster from server if 586 according agrument is set 587 """ 588 if requestRoster: 589 # FIXME: used somewhere? 590 roster_nb.NonBlockingRoster.get_instance().PlugIn(self) 591 self.send(dispatcher_nb.Presence(to=jid, typ=typ))
592 593 ############################################################################### 594 ### following methods are moved from blocking client class of xmpppy 595 ############################################################################### 596
597 - def RegisterDisconnectHandler(self, handler):
598 """ 599 Register handler that will be called on disconnect 600 """ 601 self.disconnect_handlers.append(handler)
602
603 - def UnregisterDisconnectHandler(self, handler):
604 """ 605 Unregister handler that is called on disconnect 606 """ 607 self.disconnect_handlers.remove(handler)
608
609 - def DisconnectHandler(self):
610 """ 611 Default disconnect handler. Just raises an IOError. If you choosed to use 612 this class in your production client, override this method or at least 613 unregister it. 614 """ 615 raise IOError('Disconnected from server.')
616
617 - def get_connect_type(self):
618 """ 619 Return connection state. F.e.: None / 'tls' / 'plain+non_sasl' 620 """ 621 return self.connected
622
623 - def get_peerhost(self):
624 """ 625 Gets the ip address of the account, from which is made connection to the 626 server (e.g. IP and port of socket) 627 628 We will create listening socket on the same ip 629 """ 630 # FIXME: tuple (ip, port) is expected (and checked for) but port num is 631 # useless 632 return self.socket.peerhost
633

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.client_nb.NonBlockingClient-class.html000066400000000000000000001533561343257752000307310ustar00rootroot00000000000000 nbxmpp.client_nb.NonBlockingClient
Package nbxmpp :: Module client_nb :: Class NonBlockingClient
[hide private]
[frames] | no frames]

Class NonBlockingClient

source code

Client class is XMPP connection mountpoint. Objects for authentication, network communication, roster, xml parsing ... are plugged to client object. Client implements the abstract behavior - mostly negotioation and callbacks handling, whereas underlying modules take care of feature-specific logic
Instance Methods [hide private]
 
__init__(self, domain, idlequeue, caller=None)
Caches connection data
source code
 
disconnect(self, message='')
Called on disconnection - disconnect callback is picked based on state of the client.
source code
 
connect(self, on_connect, on_connect_failure, hostname=None, port=5222, on_proxy_failure=None, on_stream_error_cb=None, proxy=None, secure_tuple=('plain', None, None))
Open XMPP connection (open XML streams in both directions)
source code
 
_resolve_hostname(self, hostname, port, on_success)
Wrapper for getaddinfo call
source code
 
_try_next_ip(self, err_message=None)
Iterate over IP addresses tries to connect to it
source code
 
incoming_stream_version(self)
Get version of xml stream
source code
 
_xmpp_connect(self, socket_type=None)
Start XMPP connecting process - open the XML stream. Is called after TCP connection is established or after switch to TLS when successfully negotiated with <starttls>.
source code
 
_xmpp_connect_machine(self, mode=None, data=None)
Finite automaton taking care of stream opening and features tag handling. Calls _on_stream_start when stream is started, and disconnect() on failure.
source code
 
_on_stream_start(self)
Called after XMPP stream is opened. TLS negotiation may follow if supported and desired.
source code
 
_tls_negotiation_handler(self, con=None, tag=None)
Take care of TLS negotioation with <starttls>
source code
 
_on_connect(self)
Preceed call of on_connect callback
source code
 
raise_event(self, event_type, data)
Raise event to connection instance. DATA_SENT and DATA_RECIVED events are used in XML console to show XMPP traffic
source code
 
auth(self, user, password, resource='', sasl=True, on_auth=None)
Authenticate connnection and bind resource. If resource is not provided random one or library name used
source code
 
_on_old_auth(self, res)
Callback used by NON-SASL auth. On auth failure, res is None
source code
 
_on_sasl_auth(self, res)
Used internally. On auth failure, res is None
source code
 
_on_doc_attrs(self)
Plug authentication objects and start auth
source code
 
_on_start_sasl(self, data=None)
Callback used by SASL, called on each auth step
source code
 
_on_auth_bind(self, data) source code
 
initRoster(self, version='')
Plug in the roster
source code
 
getRoster(self, on_ready=None, force=False)
Return the Roster instance, previously plugging it in and requesting roster from server if needed
source code
 
sendPresence(self, jid=None, typ=None, requestRoster=0)
Send some specific presence state. Can also request roster from server if according agrument is set
source code
 
RegisterDisconnectHandler(self, handler)
Register handler that will be called on disconnect
source code
 
UnregisterDisconnectHandler(self, handler)
Unregister handler that is called on disconnect
source code
 
DisconnectHandler(self)
Default disconnect handler. Just raises an IOError. If you choosed to use this class in your production client, override this method or at least unregister it.
source code
 
get_connect_type(self)
Return connection state. F.e.: None / 'tls' / 'plain+non_sasl'
source code
 
get_peerhost(self)
Gets the ip address of the account, from which is made connection to the server (e.g. IP and port of socket)
source code
Method Details [hide private]

__init__(self, domain, idlequeue, caller=None)
(Constructor)

source code 
Caches connection data
Parameters:
  • domain - domain - for to: attribute (from account info)
  • idlequeue - processing idlequeue
  • caller - calling object - it has to implement methods _event_dispatcher which is called from dispatcher instance

disconnect(self, message='')

source code 
Called on disconnection - disconnect callback is picked based on state of the client.

connect(self, on_connect, on_connect_failure, hostname=None, port=5222, on_proxy_failure=None, on_stream_error_cb=None, proxy=None, secure_tuple=('plain', None, None))

source code 
Open XMPP connection (open XML streams in both directions)
Parameters:
  • on_connect - called after stream is successfully opened
  • on_connect_failure - called when error occures during connection
  • hostname - hostname of XMPP server from SRV request
  • port - port number of XMPP server
  • on_proxy_failure - called if error occurres during TCP connection to proxy server or during proxy connecting process
  • proxy - dictionary with proxy data. It should contain at least values for keys 'host' and 'port' - connection details for proxy serve and optionally keys 'user' and 'pass' as proxy credentials
  • secure_tuple - tuple of (desired connection type, cacerts, mycerts) connection type can be 'ssl' - TLS established after TCP connection, 'tls' - TLS established after negotiation with starttls, or 'plain'. cacerts, mycerts - see tls_nb.NonBlockingTLS constructor for more details

_resolve_hostname(self, hostname, port, on_success)

source code 

Wrapper for getaddinfo call

FIXME: getaddinfo blocks

_try_next_ip(self, err_message=None)

source code 
Iterate over IP addresses tries to connect to it

incoming_stream_version(self)

source code 
Get version of xml stream

_xmpp_connect(self, socket_type=None)

source code 
Start XMPP connecting process - open the XML stream. Is called after TCP connection is established or after switch to TLS when successfully negotiated with <starttls>.

_xmpp_connect_machine(self, mode=None, data=None)

source code 
Finite automaton taking care of stream opening and features tag handling. Calls _on_stream_start when stream is started, and disconnect() on failure.

_on_stream_start(self)

source code 
Called after XMPP stream is opened. TLS negotiation may follow if supported and desired.

_tls_negotiation_handler(self, con=None, tag=None)

source code 
Take care of TLS negotioation with <starttls>

_on_connect(self)

source code 
Preceed call of on_connect callback

raise_event(self, event_type, data)

source code 
Raise event to connection instance. DATA_SENT and DATA_RECIVED events are used in XML console to show XMPP traffic

auth(self, user, password, resource='', sasl=True, on_auth=None)

source code 
Authenticate connnection and bind resource. If resource is not provided random one or library name used
Parameters:
  • user - XMPP username
  • password - XMPP password
  • resource - resource that shall be used for auth/connecting
  • sasl - Boolean indicating if SASL shall be used. (default: True)
  • on_auth - Callback, called after auth. On auth failure, argument is None.

_on_old_auth(self, res)

source code 
Callback used by NON-SASL auth. On auth failure, res is None

_on_sasl_auth(self, res)

source code 
Used internally. On auth failure, res is None

_on_doc_attrs(self)

source code 
Plug authentication objects and start auth

_on_start_sasl(self, data=None)

source code 
Callback used by SASL, called on each auth step

_on_auth_bind(self, data)

source code 

initRoster(self, version='')

source code 
Plug in the roster

getRoster(self, on_ready=None, force=False)

source code 
Return the Roster instance, previously plugging it in and requesting roster from server if needed

sendPresence(self, jid=None, typ=None, requestRoster=0)

source code 
Send some specific presence state. Can also request roster from server if according agrument is set

RegisterDisconnectHandler(self, handler)

source code 
Register handler that will be called on disconnect

UnregisterDisconnectHandler(self, handler)

source code 
Unregister handler that is called on disconnect

DisconnectHandler(self)

source code 
Default disconnect handler. Just raises an IOError. If you choosed to use this class in your production client, override this method or at least unregister it.

get_connect_type(self)

source code 
Return connection state. F.e.: None / 'tls' / 'plain+non_sasl'

get_peerhost(self)

source code 

Gets the ip address of the account, from which is made connection to the server (e.g. IP and port of socket)

We will create listening socket on the same ip


python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.dispatcher_nb-module.html000066400000000000000000000315001343257752000264020ustar00rootroot00000000000000 nbxmpp.dispatcher_nb
Package nbxmpp :: Module dispatcher_nb
[hide private]
[frames] | no frames]

Module dispatcher_nb

source code

Main xmpp decision making logic. Provides library with methods to assign different handlers to different XMPP stanzas and namespaces
Classes [hide private]
  Dispatcher
Why is this here - I needed to redefine Dispatcher for BOSH and easiest way was to inherit original Dispatcher (now renamed to XMPPDispatcher). Trouble is that reference used to access dispatcher instance is in Client attribute named by __class__.__name__ of the dispatcher instance .. long story short:
  XMPPDispatcher
Handles XMPP stream and is the first who takes control over a fresh stanza
  BOSHDispatcher
Variables [hide private]
  log = logging.getLogger('nbxmpp.dispatcher_nb')
  DEFAULT_TIMEOUT_SECONDS = 25
default timeout to wait for response for our id
  outgoingID = 0
  XML_DECLARATION = '<?xml version=\'1.0\'?>'
  __package__ = 'nbxmpp'

Imports: simplexml, sys, locale, re, ExpatError, PlugIn, NS_STREAMS, NS_XMPP_STREAMS, NS_HTTP_BIND, Iq, Presence, Message, Protocol, Node, Error, ERR_FEATURE_NOT_IMPLEMENTED, StreamError, logging


Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.dispatcher_nb')

DEFAULT_TIMEOUT_SECONDS

default timeout to wait for response for our id
Value:
25

outgoingID

Value:
0

XML_DECLARATION

Value:
'<?xml version=\'1.0\'?>'

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.dispatcher_nb-pysrc.html000066400000000000000000006703041343257752000262700ustar00rootroot00000000000000 nbxmpp.dispatcher_nb
Package nbxmpp :: Module dispatcher_nb
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.dispatcher_nb

  1  ##   dispatcher_nb.py 
  2  ##       based on dispatcher.py 
  3  ## 
  4  ##   Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 
  5  ##       modified by Dimitur Kirov <dkirov@gmail.com> 
  6  ## 
  7  ##   This program is free software; you can redistribute it and/or modify 
  8  ##   it under the terms of the GNU General Public License as published by 
  9  ##   the Free Software Foundation; either version 2, or (at your option) 
 10  ##   any later version. 
 11  ## 
 12  ##   This program is distributed in the hope that it will be useful, 
 13  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
 14  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 15  ##   GNU General Public License for more details. 
 16   
 17   
 18  """ 
 19  Main xmpp decision making logic. Provides library with methods to assign 
 20  different handlers to different XMPP stanzas and namespaces 
 21  """ 
 22   
 23  import simplexml, sys, locale 
 24  import re 
 25  from xml.parsers.expat import ExpatError 
 26  from plugin import PlugIn 
 27  from protocol import (NS_STREAMS, NS_XMPP_STREAMS, NS_HTTP_BIND, Iq, Presence, 
 28          Message, Protocol, Node, Error, ERR_FEATURE_NOT_IMPLEMENTED, StreamError) 
 29  import logging 
 30  log = logging.getLogger('nbxmpp.dispatcher_nb') 
 31   
 32  #: default timeout to wait for response for our id 
 33  DEFAULT_TIMEOUT_SECONDS = 25 
 34  outgoingID = 0 
 35   
 36  XML_DECLARATION = '<?xml version=\'1.0\'?>' 
37 38 # FIXME: ugly 39 -class Dispatcher():
40 """ 41 Why is this here - I needed to redefine Dispatcher for BOSH and easiest way 42 was to inherit original Dispatcher (now renamed to XMPPDispatcher). Trouble 43 is that reference used to access dispatcher instance is in Client attribute 44 named by __class__.__name__ of the dispatcher instance .. long story short: 45 46 I wrote following to avoid changing each client.Dispatcher.whatever() in xmpp 47 48 If having two kinds of dispatcher will go well, I will rewrite the dispatcher 49 references in other scripts 50 """ 51
52 - def PlugIn(self, client_obj, after_SASL=False, old_features=None):
53 if client_obj.protocol_type == 'XMPP': 54 XMPPDispatcher().PlugIn(client_obj) 55 elif client_obj.protocol_type == 'BOSH': 56 BOSHDispatcher().PlugIn(client_obj, after_SASL, old_features) 57 else: 58 assert False # should never be reached
59 60 @classmethod
61 - def get_instance(cls, *args, **kwargs):
62 """ 63 Factory Method for object creation 64 65 Use this instead of directly initializing the class in order to make 66 unit testing much easier. 67 """ 68 return cls(*args, **kwargs)
69
70 71 -class XMPPDispatcher(PlugIn):
72 """ 73 Handles XMPP stream and is the first who takes control over a fresh stanza 74 75 Is plugged into NonBlockingClient but can be replugged to restart handled 76 stream headers (used by SASL f.e.). 77 """ 78
79 - def __init__(self):
80 PlugIn.__init__(self) 81 self.handlers = {} 82 self._expected = {} 83 self._defaultHandler = None 84 self._pendingExceptions = [] 85 self._eventHandler = None 86 self._cycleHandlers = [] 87 self._exported_methods=[self.RegisterHandler, self.RegisterDefaultHandler, 88 self.RegisterEventHandler, self.UnregisterCycleHandler, 89 self.RegisterCycleHandler, self.RegisterHandlerOnce, 90 self.UnregisterHandler, self.RegisterProtocol, 91 self.SendAndWaitForResponse, self.SendAndCallForResponse, 92 self.getAnID, self.Event, self.send] 93 94 # Let the dispatcher know if there is support for stream management 95 self.sm = None 96 97 # \ufddo -> \ufdef range 98 c = u'\ufdd0' 99 r = c.encode('utf8') 100 while (c < u'\ufdef'): 101 c = unichr(ord(c) + 1) 102 r += '|' + c.encode('utf8') 103 104 # \ufffe-\uffff, \u1fffe-\u1ffff, ..., \u10fffe-\u10ffff 105 c = u'\ufffe' 106 r += '|' + c.encode('utf8') 107 r += '|' + unichr(ord(c) + 1).encode('utf8') 108 while (c < u'\U0010fffe'): 109 c = unichr(ord(c) + 0x10000) 110 r += '|' + c.encode('utf8') 111 r += '|' + unichr(ord(c) + 1).encode('utf8') 112 113 self.invalid_chars_re = re.compile(r)
114
115 - def getAnID(self):
116 global outgoingID 117 outgoingID += 1 118 return repr(outgoingID)
119
120 - def dumpHandlers(self):
121 """ 122 Return set of user-registered callbacks in it's internal format. Used 123 within the library to carry user handlers set over Dispatcher replugins 124 """ 125 return self.handlers
126
127 - def restoreHandlers(self, handlers):
128 """ 129 Restore user-registered callbacks structure from dump previously obtained 130 via dumpHandlers. Used within the library to carry user handlers set over 131 Dispatcher replugins. 132 """ 133 self.handlers = handlers
134
135 - def _init(self):
136 """ 137 Register default namespaces/protocols/handlers. Used internally 138 """ 139 # FIXME: inject dependencies, do not rely that they are defined by our 140 # owner 141 self.RegisterNamespace('unknown') 142 self.RegisterNamespace(NS_STREAMS) 143 self.RegisterNamespace(self._owner.defaultNamespace) 144 self.RegisterProtocol('iq', Iq) 145 self.RegisterProtocol('presence', Presence) 146 self.RegisterProtocol('message', Message) 147 self.RegisterDefaultHandler(self.returnStanzaHandler) 148 self.RegisterEventHandler(self._owner._caller._event_dispatcher) 149 self.on_responses = {}
150
151 - def plugin(self, owner):
152 """ 153 Plug the Dispatcher instance into Client class instance and send initial 154 stream header. Used internally 155 """ 156 self._init() 157 self._owner.lastErrNode = None 158 self._owner.lastErr = None 159 self._owner.lastErrCode = None 160 if hasattr(self._owner, 'StreamInit'): 161 self._owner.StreamInit() 162 else: 163 self.StreamInit()
164
165 - def plugout(self):
166 """ 167 Prepare instance to be destructed 168 """ 169 self.Stream.dispatch = None 170 self.Stream.features = None 171 self.Stream.destroy() 172 self._owner = None 173 self.Stream = None
174
175 - def StreamInit(self):
176 """ 177 Send an initial stream header 178 """ 179 self._owner.Connection.sendqueue = [] 180 self.Stream = simplexml.NodeBuilder() 181 self.Stream.dispatch = self.dispatch 182 self.Stream._dispatch_depth = 2 183 self.Stream.stream_header_received = self._check_stream_start 184 self.Stream.features = None 185 self._metastream = Node('stream:stream') 186 self._metastream.setNamespace(self._owner.Namespace) 187 self._metastream.setAttr('version', '1.0') 188 self._metastream.setAttr('xmlns:stream', NS_STREAMS) 189 self._metastream.setAttr('to', self._owner.Server) 190 if locale.getdefaultlocale()[0]: 191 self._metastream.setAttr('xml:lang', 192 locale.getdefaultlocale()[0].split('_')[0]) 193 self._owner.send("%s%s>" % (XML_DECLARATION, str(self._metastream)[:-2]))
194
195 - def _check_stream_start(self, ns, tag, attrs):
196 if ns != NS_STREAMS or tag!='stream': 197 raise ValueError('Incorrect stream start: (%s,%s). Terminating.' 198 % (tag, ns))
199
200 - def replace_non_character(self, data):
201 return re.sub(self.invalid_chars_re, u'\ufffd'.encode('utf-8'), data)
202
203 - def ProcessNonBlocking(self, data):
204 """ 205 Check incoming stream for data waiting 206 207 :param data: data received from transports/IO sockets 208 :return: 209 1) length of processed data if some data were processed; 210 2) '0' string if no data were processed but link is alive; 211 3) 0 (zero) if underlying connection is closed. 212 """ 213 # FIXME: 214 # When an error occurs we disconnect the transport directly. Client's 215 # disconnect method will never be called. 216 # Is this intended? 217 # also look at transports start_disconnect() 218 data = self.replace_non_character(data) 219 for handler in self._cycleHandlers: 220 handler(self) 221 if len(self._pendingExceptions) > 0: 222 _pendingException = self._pendingExceptions.pop() 223 raise _pendingException[0], _pendingException[1], _pendingException[2] 224 try: 225 self.Stream.Parse(data) 226 # end stream:stream tag received 227 if self.Stream and self.Stream.has_received_endtag(): 228 self._owner.disconnect(self.Stream.streamError) 229 return 0 230 except ExpatError: 231 log.error('Invalid XML received from server. Forcing disconnect.') 232 self._owner.Connection.disconnect() 233 return 0 234 except ValueError, e: 235 log.debug('ValueError: %s' % str(e)) 236 self._owner.Connection.pollend() 237 return 0 238 if len(self._pendingExceptions) > 0: 239 _pendingException = self._pendingExceptions.pop() 240 raise _pendingException[0], _pendingException[1], _pendingException[2] 241 if len(data) == 0: 242 return '0' 243 return len(data)
244
245 - def RegisterNamespace(self, xmlns, order='info'):
246 """ 247 Create internal structures for newly registered namespace 248 249 You can register handlers for this namespace afterwards. By default 250 one namespace is already registered 251 (jabber:client or jabber:component:accept depending on context. 252 """ 253 log.debug('Registering namespace "%s"' % xmlns) 254 self.handlers[xmlns] = {} 255 self.RegisterProtocol('unknown', Protocol, xmlns=xmlns) 256 self.RegisterProtocol('default', Protocol, xmlns=xmlns)
257
258 - def RegisterProtocol(self, tag_name, Proto, xmlns=None, order='info'):
259 """ 260 Used to declare some top-level stanza name to dispatcher 261 262 Needed to start registering handlers for such stanzas. Iq, message and 263 presence protocols are registered by default. 264 """ 265 if not xmlns: 266 xmlns=self._owner.defaultNamespace 267 log.debug('Registering protocol "%s" as %s(%s)' %(tag_name, Proto, xmlns)) 268 self.handlers[xmlns][tag_name] = {type:Proto, 'default':[]}
269
270 - def RegisterNamespaceHandler(self, xmlns, handler, typ='', ns='', 271 makefirst=0, system=0):
272 """ 273 Register handler for processing all stanzas for specified namespace 274 """ 275 self.RegisterHandler('default', handler, typ, ns, xmlns, makefirst, 276 system)
277
278 - def RegisterHandler(self, name, handler, typ='', ns='', xmlns=None, 279 makefirst=False, system=False):
280 """ 281 Register user callback as stanzas handler of declared type 282 283 Callback arguments: 284 dispatcher instance (for replying), incoming return of previous handlers. 285 The callback must raise xmpp.NodeProcessed just before return if it wants 286 to prevent other callbacks to be called with the same stanza as argument 287 _and_, more importantly library from returning stanza to sender with error set. 288 289 :param name: name of stanza. F.e. "iq". 290 :param handler: user callback. 291 :param typ: value of stanza's "type" attribute. If not specified any 292 value will match 293 :param ns: namespace of child that stanza must contain. 294 :param makefirst: insert handler in the beginning of handlers list instead 295 of adding it to the end. Note that more common handlers i.e. w/o "typ" 296 and " will be called first nevertheless. 297 :param system: call handler even if NodeProcessed Exception were raised 298 already. 299 """ 300 if not xmlns: 301 xmlns=self._owner.defaultNamespace 302 log.debug('Registering handler %s for "%s" type->%s ns->%s(%s)' % 303 (handler, name, typ, ns, xmlns)) 304 if not typ and not ns: 305 typ='default' 306 if xmlns not in self.handlers: 307 self.RegisterNamespace(xmlns, 'warn') 308 if name not in self.handlers[xmlns]: 309 self.RegisterProtocol(name, Protocol, xmlns, 'warn') 310 if typ+ns not in self.handlers[xmlns][name]: 311 self.handlers[xmlns][name][typ+ns]=[] 312 if makefirst: 313 self.handlers[xmlns][name][typ+ns].insert(0, {'func':handler, 314 'system':system}) 315 else: 316 self.handlers[xmlns][name][typ+ns].append({'func':handler, 317 'system':system})
318
319 - def RegisterHandlerOnce(self, name, handler, typ='', ns='', xmlns=None, 320 makefirst=0, system=0):
321 """ 322 Unregister handler after first call (not implemented yet) 323 """ 324 # FIXME Drop or implement 325 if not xmlns: 326 xmlns = self._owner.defaultNamespace 327 self.RegisterHandler(name, handler, typ, ns, xmlns, makefirst, system)
328
329 - def UnregisterHandler(self, name, handler, typ='', ns='', xmlns=None):
330 """ 331 Unregister handler. "typ" and "ns" must be specified exactly the same as 332 with registering. 333 """ 334 if not xmlns: 335 xmlns = self._owner.defaultNamespace 336 if not typ and not ns: 337 typ='default' 338 if xmlns not in self.handlers: 339 return 340 if name not in self.handlers[xmlns]: 341 return 342 if typ+ns not in self.handlers[xmlns][name]: 343 return 344 for pack in self.handlers[xmlns][name][typ+ns]: 345 if pack['func'] == handler: 346 try: 347 self.handlers[xmlns][name][typ+ns].remove(pack) 348 except ValueError: 349 pass
350
351 - def RegisterDefaultHandler(self, handler):
352 """ 353 Specify the handler that will be used if no NodeProcessed exception were 354 raised. This is returnStanzaHandler by default. 355 """ 356 self._defaultHandler = handler
357
358 - def RegisterEventHandler(self, handler):
359 """ 360 Register handler that will process events. F.e. "FILERECEIVED" event. See 361 common/connection: _event_dispatcher() 362 """ 363 self._eventHandler = handler
364
365 - def returnStanzaHandler(self, conn, stanza):
366 """ 367 Return stanza back to the sender with <feature-not-implemented/> error 368 set 369 """ 370 if stanza.getType() in ('get', 'set'): 371 conn._owner.send(Error(stanza, ERR_FEATURE_NOT_IMPLEMENTED))
372
373 - def RegisterCycleHandler(self, handler):
374 """ 375 Register handler that will be called on every Dispatcher.Process() call 376 """ 377 if handler not in self._cycleHandlers: 378 self._cycleHandlers.append(handler)
379
380 - def UnregisterCycleHandler(self, handler):
381 """ 382 Unregister handler that will is called on every Dispatcher.Process() call 383 """ 384 if handler in self._cycleHandlers: 385 self._cycleHandlers.remove(handler)
386
387 - def Event(self, realm, event, data):
388 """ 389 Raise some event 390 391 :param realm: scope of event. Usually a namespace. 392 :param event: the event itself. F.e. "SUCCESSFUL SEND". 393 :param data: data that comes along with event. Depends on event. 394 """ 395 if self._eventHandler: 396 self._eventHandler(realm, event, data) 397 else: 398 log.warning('Received unhandled event: %s' % event)
399
400 - def dispatch(self, stanza, session=None, direct=0):
401 """ 402 Main procedure that performs XMPP stanza recognition and calling 403 apppropriate handlers for it. Called by simplexml 404 """ 405 # FIXME: Where do we set session and direct. Why? What are those intended 406 # to do? 407 408 #log.info('dispatch called: stanza = %s, session = %s, direct= %s' 409 # % (stanza, session, direct)) 410 if not session: 411 session = self 412 session.Stream._mini_dom = None 413 name = stanza.getName() 414 415 if name == 'features': 416 self._owner.got_features = True 417 session.Stream.features = stanza 418 elif name == 'error': 419 if stanza.getTag('see-other-host'): 420 self._owner.got_see_other_host = stanza 421 422 xmlns = stanza.getNamespace() 423 424 # log.info('in dispatch, getting ns for %s, and the ns is %s' 425 # % (stanza, xmlns)) 426 if xmlns not in self.handlers: 427 log.warn("Unknown namespace: " + xmlns) 428 xmlns = 'unknown' 429 # features stanza has been handled before 430 if name not in self.handlers[xmlns]: 431 if name != 'features': 432 log.warn("Unknown stanza: " + name) 433 else: 434 log.debug("Got %s/%s stanza" % (xmlns, name)) 435 name='unknown' 436 else: 437 log.debug("Got %s/%s stanza" % (xmlns, name)) 438 439 if stanza.__class__.__name__ == 'Node': 440 # FIXME: this cannot work 441 stanza=self.handlers[xmlns][name][type](node=stanza) 442 443 typ = stanza.getType() 444 if not typ: 445 typ = '' 446 stanza.props = stanza.getProperties() 447 ID = stanza.getID() 448 449 # If server supports stream management 450 if self.sm and self.sm.enabled and (stanza.getName() != 'r' and 451 stanza.getName() != 'a' and stanza.getName() != 'enabled' and 452 stanza.getName() != 'resumed'): 453 # increments the number of stanzas that has been handled 454 self.sm.in_h = self.sm.in_h + 1 455 list_ = ['default'] # we will use all handlers: 456 if typ in self.handlers[xmlns][name]: 457 list_.append(typ) # from very common... 458 for prop in stanza.props: 459 if prop in self.handlers[xmlns][name]: 460 list_.append(prop) 461 if typ and typ+prop in self.handlers[xmlns][name]: 462 list_.append(typ+prop) # ...to very particular 463 464 chain = self.handlers[xmlns]['default']['default'] 465 for key in list_: 466 if key: 467 chain = chain + self.handlers[xmlns][name][key] 468 469 if ID in session._expected: 470 user = 0 471 if isinstance(session._expected[ID], tuple): 472 cb, args = session._expected[ID] 473 log.debug("Expected stanza arrived. Callback %s(%s) found!" % 474 (cb, args)) 475 try: 476 cb(session,stanza,**args) 477 except Exception, typ: 478 if typ.__class__.__name__ != 'NodeProcessed': 479 raise 480 else: 481 log.debug("Expected stanza arrived!") 482 session._expected[ID] = stanza 483 else: 484 user = 1 485 for handler in chain: 486 if user or handler['system']: 487 try: 488 handler['func'](session, stanza) 489 except Exception, typ: 490 if typ.__class__.__name__ != 'NodeProcessed': 491 self._pendingExceptions.insert(0, sys.exc_info()) 492 return 493 user=0 494 if user and self._defaultHandler: 495 self._defaultHandler(session, stanza)
496
497 - def _WaitForData(self, data):
498 """ 499 Internal wrapper around ProcessNonBlocking. Will check for 500 """ 501 if data is None: 502 return 503 res = self.ProcessNonBlocking(data) 504 # 0 result indicates that we have closed the connection, e.g. 505 # we have released dispatcher, so self._owner has no methods 506 if not res: 507 return 508 for (_id, _iq) in self._expected.items(): 509 if _iq is None: 510 # If the expected Stanza would have arrived, ProcessNonBlocking 511 # would have placed the reply stanza in there 512 continue 513 if _id in self.on_responses: 514 if len(self._expected) == 1: 515 self._owner.onreceive(None) 516 resp, args = self.on_responses[_id] 517 del self.on_responses[_id] 518 if args is None: 519 resp(_iq) 520 else: 521 resp(self._owner, _iq, **args) 522 del self._expected[_id]
523
524 - def SendAndWaitForResponse(self, stanza, timeout=None, func=None, args=None):
525 """ 526 Send stanza and wait for recipient's response to it. Will call transports 527 on_timeout callback if response is not retrieved in time 528 529 Be aware: Only timeout of latest call of SendAndWait is active. 530 """ 531 if timeout is None: 532 timeout = DEFAULT_TIMEOUT_SECONDS 533 _waitid = self.send(stanza) 534 if func: 535 self.on_responses[_waitid] = (func, args) 536 if timeout: 537 self._owner.set_timeout(timeout) 538 self._owner.onreceive(self._WaitForData) 539 self._expected[_waitid] = None 540 return _waitid
541
542 - def SendAndCallForResponse(self, stanza, func=None, args=None):
543 """ 544 Put stanza on the wire and call back when recipient replies. Additional 545 callback arguments can be specified in args 546 """ 547 self.SendAndWaitForResponse(stanza, 0, func, args)
548
549 - def send(self, stanza, now=False):
550 """ 551 Wrap transports send method when plugged into NonBlockingClient. Makes 552 sure stanzas get ID and from tag. 553 """ 554 ID = None 555 if type(stanza) not in [type(''), type(u'')]: 556 if isinstance(stanza, Protocol): 557 ID = stanza.getID() 558 if ID is None: 559 stanza.setID(self.getAnID()) 560 ID = stanza.getID() 561 if self._owner._registered_name and not stanza.getAttr('from'): 562 stanza.setAttr('from', self._owner._registered_name) 563 564 # If no ID then it is a whitespace 565 if self.sm and self.sm.enabled and ID: 566 self.sm.uqueue.append(stanza) 567 self.sm.out_h = self.sm.out_h + 1 568 if len(self.sm.uqueue) > self.sm.max_queue: 569 self.sm.request_ack() 570 571 self._owner.Connection.send(stanza, now) 572 return ID
573
574 575 -class BOSHDispatcher(XMPPDispatcher):
576
577 - def PlugIn(self, owner, after_SASL=False, old_features=None):
578 self.old_features = old_features 579 self.after_SASL = after_SASL 580 XMPPDispatcher.PlugIn(self, owner)
581
582 - def StreamInit(self):
583 """ 584 Send an initial stream header 585 """ 586 self.Stream = simplexml.NodeBuilder() 587 self.Stream.dispatch = self.dispatch 588 self.Stream._dispatch_depth = 2 589 self.Stream.stream_header_received = self._check_stream_start 590 self.Stream.features = self.old_features 591 592 self._metastream = Node('stream:stream') 593 self._metastream.setNamespace(self._owner.Namespace) 594 self._metastream.setAttr('version', '1.0') 595 self._metastream.setAttr('xmlns:stream', NS_STREAMS) 596 self._metastream.setAttr('to', self._owner.Server) 597 if locale.getdefaultlocale()[0]: 598 self._metastream.setAttr('xml:lang', 599 locale.getdefaultlocale()[0].split('_')[0]) 600 601 self.restart = True 602 self._owner.Connection.send_init(after_SASL=self.after_SASL)
603
604 - def StreamTerminate(self):
605 """ 606 Send a stream terminator 607 """ 608 self._owner.Connection.send_terminator()
609
610 - def ProcessNonBlocking(self, data=None):
611 if self.restart: 612 fromstream = self._metastream 613 fromstream.setAttr('from', fromstream.getAttr('to')) 614 fromstream.delAttr('to') 615 data = '%s%s>%s' % (XML_DECLARATION, str(fromstream)[:-2], data) 616 self.restart = False 617 return XMPPDispatcher.ProcessNonBlocking(self, data)
618
619 - def dispatch(self, stanza, session=None, direct=0):
620 if stanza.getName() == 'body' and stanza.getNamespace() == NS_HTTP_BIND: 621 622 stanza_attrs = stanza.getAttrs() 623 if 'authid' in stanza_attrs: 624 # should be only in init response 625 # auth module expects id of stream in document attributes 626 self.Stream._document_attrs['id'] = stanza_attrs['authid'] 627 self._owner.Connection.handle_body_attrs(stanza_attrs) 628 629 children = stanza.getChildren() 630 if children: 631 for child in children: 632 # if child doesn't have any ns specified, simplexml (or expat) 633 # thinks it's of parent's (BOSH body) namespace, so we have to 634 # rewrite it to jabber:client 635 if child.getNamespace() == NS_HTTP_BIND: 636 child.setNamespace(self._owner.defaultNamespace) 637 XMPPDispatcher.dispatch(self, child, session, direct) 638 else: 639 XMPPDispatcher.dispatch(self, stanza, session, direct)
640

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.dispatcher_nb.BOSHDispatcher-class.html000066400000000000000000000614371343257752000307770ustar00rootroot00000000000000 nbxmpp.dispatcher_nb.BOSHDispatcher
Package nbxmpp :: Module dispatcher_nb :: Class BOSHDispatcher
[hide private]
[frames] | no frames]

Class BOSHDispatcher

source code


Instance Methods [hide private]
 
PlugIn(self, owner, after_SASL=False, old_features=None)
Attach to owner and register ourself and our _exported_methods in it. If defined by a subclass, call self.plugin(owner) to execute hook code after plugging
source code
 
StreamInit(self)
Send an initial stream header
source code
 
StreamTerminate(self)
Send a stream terminator
source code
 
ProcessNonBlocking(self, data=None)
Check incoming stream for data waiting
source code
 
dispatch(self, stanza, session=None, direct=0)
Main procedure that performs XMPP stanza recognition and calling apppropriate handlers for it. Called by simplexml
source code

Inherited from XMPPDispatcher: Event, RegisterCycleHandler, RegisterDefaultHandler, RegisterEventHandler, RegisterHandler, RegisterHandlerOnce, RegisterNamespace, RegisterNamespaceHandler, RegisterProtocol, SendAndCallForResponse, SendAndWaitForResponse, UnregisterCycleHandler, UnregisterHandler, __init__, dumpHandlers, getAnID, plugin, plugout, replace_non_character, restoreHandlers, returnStanzaHandler, send

Inherited from plugin.PlugIn: PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Method Details [hide private]

PlugIn(self, owner, after_SASL=False, old_features=None)

source code 
Attach to owner and register ourself and our _exported_methods in it. If defined by a subclass, call self.plugin(owner) to execute hook code after plugging
Overrides: plugin.PlugIn.PlugIn
(inherited documentation)

StreamInit(self)

source code 
Send an initial stream header
Overrides: XMPPDispatcher.StreamInit

StreamTerminate(self)

source code 
Send a stream terminator

ProcessNonBlocking(self, data=None)

source code 
Check incoming stream for data waiting
Parameters:
  • data - data received from transports/IO sockets
Returns:
  1. length of processed data if some data were processed;
  2. '0' string if no data were processed but link is alive;
  3. 0 (zero) if underlying connection is closed.
Overrides: XMPPDispatcher.ProcessNonBlocking
(inherited documentation)

dispatch(self, stanza, session=None, direct=0)

source code 
Main procedure that performs XMPP stanza recognition and calling apppropriate handlers for it. Called by simplexml
Overrides: XMPPDispatcher.dispatch
(inherited documentation)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.dispatcher_nb.Dispatcher-class.html000066400000000000000000000243331343257752000303150ustar00rootroot00000000000000 nbxmpp.dispatcher_nb.Dispatcher
Package nbxmpp :: Module dispatcher_nb :: Class Dispatcher
[hide private]
[frames] | no frames]

Class Dispatcher

source code

Why is this here - I needed to redefine Dispatcher for BOSH and easiest way was to inherit original Dispatcher (now renamed to XMPPDispatcher). Trouble is that reference used to access dispatcher instance is in Client attribute named by __class__.__name__ of the dispatcher instance .. long story short:

I wrote following to avoid changing each client.Dispatcher.whatever() in xmpp

If having two kinds of dispatcher will go well, I will rewrite the dispatcher references in other scripts

Instance Methods [hide private]
 
PlugIn(self, client_obj, after_SASL=False, old_features=None) source code
Class Methods [hide private]
 
get_instance(cls, *args, **kwargs)
Factory Method for object creation
source code
Method Details [hide private]

PlugIn(self, client_obj, after_SASL=False, old_features=None)

source code 

get_instance(cls, *args, **kwargs)
Class Method

source code 

Factory Method for object creation

Use this instead of directly initializing the class in order to make unit testing much easier.


python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.dispatcher_nb.XMPPDispatcher-class.html000066400000000000000000002023641343257752000310240ustar00rootroot00000000000000 nbxmpp.dispatcher_nb.XMPPDispatcher
Package nbxmpp :: Module dispatcher_nb :: Class XMPPDispatcher
[hide private]
[frames] | no frames]

Class XMPPDispatcher

source code


Handles XMPP stream and is the first who takes control over a fresh stanza

Is plugged into NonBlockingClient but can be replugged to restart handled stream headers (used by SASL f.e.).

Instance Methods [hide private]
 
__init__(self) source code
 
getAnID(self) source code
 
dumpHandlers(self)
Return set of user-registered callbacks in it's internal format. Used within the library to carry user handlers set over Dispatcher replugins
source code
 
restoreHandlers(self, handlers)
Restore user-registered callbacks structure from dump previously obtained via dumpHandlers. Used within the library to carry user handlers set over Dispatcher replugins.
source code
 
_init(self)
Register default namespaces/protocols/handlers. Used internally
source code
 
plugin(self, owner)
Plug the Dispatcher instance into Client class instance and send initial stream header. Used internally
source code
 
plugout(self)
Prepare instance to be destructed
source code
 
StreamInit(self)
Send an initial stream header
source code
 
_check_stream_start(self, ns, tag, attrs) source code
 
replace_non_character(self, data) source code
 
ProcessNonBlocking(self, data)
Check incoming stream for data waiting
source code
 
RegisterNamespace(self, xmlns, order='info')
Create internal structures for newly registered namespace
source code
 
RegisterProtocol(self, tag_name, Proto, xmlns=None, order='info')
Used to declare some top-level stanza name to dispatcher
source code
 
RegisterNamespaceHandler(self, xmlns, handler, typ='', ns='', makefirst=0, system=0)
Register handler for processing all stanzas for specified namespace
source code
 
RegisterHandler(self, name, handler, typ='', ns='', xmlns=None, makefirst=False, system=False)
Register user callback as stanzas handler of declared type
source code
 
RegisterHandlerOnce(self, name, handler, typ='', ns='', xmlns=None, makefirst=0, system=0)
Unregister handler after first call (not implemented yet)
source code
 
UnregisterHandler(self, name, handler, typ='', ns='', xmlns=None)
Unregister handler. "typ" and "ns" must be specified exactly the same as with registering.
source code
 
RegisterDefaultHandler(self, handler)
Specify the handler that will be used if no NodeProcessed exception were raised. This is returnStanzaHandler by default.
source code
 
RegisterEventHandler(self, handler)
Register handler that will process events. F.e. "FILERECEIVED" event. See common/connection: _event_dispatcher()
source code
 
returnStanzaHandler(self, conn, stanza)
Return stanza back to the sender with <feature-not-implemented/> error set
source code
 
RegisterCycleHandler(self, handler)
Register handler that will be called on every Dispatcher.Process() call
source code
 
UnregisterCycleHandler(self, handler)
Unregister handler that will is called on every Dispatcher.Process() call
source code
 
Event(self, realm, event, data)
Raise some event
source code
 
dispatch(self, stanza, session=None, direct=0)
Main procedure that performs XMPP stanza recognition and calling apppropriate handlers for it. Called by simplexml
source code
 
_WaitForData(self, data)
Internal wrapper around ProcessNonBlocking. Will check for
source code
 
SendAndWaitForResponse(self, stanza, timeout=None, func=None, args=None)
Send stanza and wait for recipient's response to it. Will call transports on_timeout callback if response is not retrieved in time
source code
 
SendAndCallForResponse(self, stanza, func=None, args=None)
Put stanza on the wire and call back when recipient replies. Additional callback arguments can be specified in args
source code
 
send(self, stanza, now=False)
Wrap transports send method when plugged into NonBlockingClient. Makes sure stanzas get ID and from tag.
source code

Inherited from plugin.PlugIn: PlugIn, PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Method Details [hide private]

__init__(self)
(Constructor)

source code 
Overrides: plugin.PlugIn.__init__

getAnID(self)

source code 

dumpHandlers(self)

source code 
Return set of user-registered callbacks in it's internal format. Used within the library to carry user handlers set over Dispatcher replugins

restoreHandlers(self, handlers)

source code 
Restore user-registered callbacks structure from dump previously obtained via dumpHandlers. Used within the library to carry user handlers set over Dispatcher replugins.

_init(self)

source code 
Register default namespaces/protocols/handlers. Used internally

plugin(self, owner)

source code 
Plug the Dispatcher instance into Client class instance and send initial stream header. Used internally

plugout(self)

source code 
Prepare instance to be destructed

StreamInit(self)

source code 
Send an initial stream header

_check_stream_start(self, ns, tag, attrs)

source code 

replace_non_character(self, data)

source code 

ProcessNonBlocking(self, data)

source code 
Check incoming stream for data waiting
Parameters:
  • data - data received from transports/IO sockets
Returns:
  1. length of processed data if some data were processed;

  2. '0' string if no data were processed but link is alive;

  3. 0 (zero) if underlying connection is closed.

RegisterNamespace(self, xmlns, order='info')

source code 

Create internal structures for newly registered namespace

You can register handlers for this namespace afterwards. By default one namespace is already registered (jabber:client or jabber:component:accept depending on context.

RegisterProtocol(self, tag_name, Proto, xmlns=None, order='info')

source code 

Used to declare some top-level stanza name to dispatcher

Needed to start registering handlers for such stanzas. Iq, message and presence protocols are registered by default.

RegisterNamespaceHandler(self, xmlns, handler, typ='', ns='', makefirst=0, system=0)

source code 
Register handler for processing all stanzas for specified namespace

RegisterHandler(self, name, handler, typ='', ns='', xmlns=None, makefirst=False, system=False)

source code 

Register user callback as stanzas handler of declared type

Callback arguments: dispatcher instance (for replying), incoming return of previous handlers. The callback must raise xmpp.NodeProcessed just before return if it wants to prevent other callbacks to be called with the same stanza as argument _and_, more importantly library from returning stanza to sender with error set.

Parameters:
  • name - name of stanza. F.e. "iq".
  • handler - user callback.
  • typ - value of stanza's "type" attribute. If not specified any value will match
  • ns - namespace of child that stanza must contain.
  • makefirst - insert handler in the beginning of handlers list instead of adding it to the end. Note that more common handlers i.e. w/o "typ" and " will be called first nevertheless.
  • system - call handler even if NodeProcessed Exception were raised already.

RegisterHandlerOnce(self, name, handler, typ='', ns='', xmlns=None, makefirst=0, system=0)

source code 
Unregister handler after first call (not implemented yet)

UnregisterHandler(self, name, handler, typ='', ns='', xmlns=None)

source code 
Unregister handler. "typ" and "ns" must be specified exactly the same as with registering.

RegisterDefaultHandler(self, handler)

source code 
Specify the handler that will be used if no NodeProcessed exception were raised. This is returnStanzaHandler by default.

RegisterEventHandler(self, handler)

source code 
Register handler that will process events. F.e. "FILERECEIVED" event. See common/connection: _event_dispatcher()

returnStanzaHandler(self, conn, stanza)

source code 
Return stanza back to the sender with <feature-not-implemented/> error set

RegisterCycleHandler(self, handler)

source code 
Register handler that will be called on every Dispatcher.Process() call

UnregisterCycleHandler(self, handler)

source code 
Unregister handler that will is called on every Dispatcher.Process() call

Event(self, realm, event, data)

source code 
Raise some event
Parameters:
  • realm - scope of event. Usually a namespace.
  • event - the event itself. F.e. "SUCCESSFUL SEND".
  • data - data that comes along with event. Depends on event.

dispatch(self, stanza, session=None, direct=0)

source code 
Main procedure that performs XMPP stanza recognition and calling apppropriate handlers for it. Called by simplexml

_WaitForData(self, data)

source code 
Internal wrapper around ProcessNonBlocking. Will check for

SendAndWaitForResponse(self, stanza, timeout=None, func=None, args=None)

source code 

Send stanza and wait for recipient's response to it. Will call transports on_timeout callback if response is not retrieved in time

Be aware: Only timeout of latest call of SendAndWait is active.

SendAndCallForResponse(self, stanza, func=None, args=None)

source code 
Put stanza on the wire and call back when recipient replies. Additional callback arguments can be specified in args

send(self, stanza, now=False)

source code 
Wrap transports send method when plugged into NonBlockingClient. Makes sure stanzas get ID and from tag.

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.features_nb-module.html000066400000000000000000001154361343257752000261050ustar00rootroot00000000000000 nbxmpp.features_nb
Package nbxmpp :: Module features_nb
[hide private]
[frames] | no frames]

Module features_nb

source code

Different stuff that wasn't worth separating it into modules (Registration, Privacy Lists, ...)
Functions [hide private]
 
_on_default_response(disp, iq, cb) source code
 
getRegInfo(disp, host, info={}, sync=True)
Get registration form from remote host. Info dict can be prefilled :param disp: plugged dispatcher instance :param info: dict, like {'username':'joey'}.
source code
 
_ReceivedRegInfo(con, resp, agent) source code
 
register(disp, host, info, cb, args=None)
Perform registration on remote server with provided info
source code
 
unregister(disp, host, cb)
Unregisters with host (permanently removes account). Returns true on success
source code
 
changePasswordTo(disp, newpassword, host=None, cb=None)
Changes password on specified or current (if not specified) server. Returns true on success.
source code
 
getPrivacyLists(disp)
Request privacy lists from connected server. Returns dictionary of existing lists on success.
source code
 
getActiveAndDefaultPrivacyLists(disp) source code
 
getPrivacyList(disp, listname)
Request specific privacy list listname. Returns list of XML nodes (rules) taken from the server responce.
source code
 
setActivePrivacyList(disp, listname=None, typ='active', cb=None)
Switch privacy list 'listname' to specified type. By default the type is 'active'. Returns true on success.
source code
 
setDefaultPrivacyList(disp, listname=None)
Set the default privacy list as 'listname'. Returns true on success
source code
 
setPrivacyList(disp, listname, tags)
Set the ruleset
source code
 
delPrivacyList(disp, listname, cb=None)
Deletes privacy list 'listname'. Returns true on success.
source code
Variables [hide private]
  REGISTER_DATA_RECEIVED = 'REGISTER DATA RECEIVED'
  PL_TYPE_JID = 'jid'
  PL_TYPE_GROUP = 'group'
  PL_TYPE_SUBC = 'subscription'
  PL_ACT_ALLOW = 'allow'
  PL_ACT_DENY = 'deny'
  PRIVACY_LISTS_RECEIVED = 'PRIVACY LISTS RECEIVED'
  PRIVACY_LIST_RECEIVED = 'PRIVACY LIST RECEIVED'
  PRIVACY_LISTS_ACTIVE_DEFAULT = 'PRIVACY LISTS ACTIVE DEFAULT'
  __package__ = 'nbxmpp'

Imports: NS_REGISTER, NS_PRIVACY, NS_DATA, Iq, isResultNode, Node


Function Details [hide private]

_on_default_response(disp, iq, cb)

source code 

getRegInfo(disp, host, info={}, sync=True)

source code 

Get registration form from remote host. Info dict can be prefilled :param disp: plugged dispatcher instance :param info: dict, like {'username':'joey'}.

See JEP-0077 for details.

_ReceivedRegInfo(con, resp, agent)

source code 

register(disp, host, info, cb, args=None)

source code 

Perform registration on remote server with provided info

If registration fails you can get additional info from the dispatcher's owner attributes lastErrNode, lastErr and lastErrCode.

unregister(disp, host, cb)

source code 
Unregisters with host (permanently removes account). Returns true on success

changePasswordTo(disp, newpassword, host=None, cb=None)

source code 
Changes password on specified or current (if not specified) server. Returns true on success.

getPrivacyLists(disp)

source code 
Request privacy lists from connected server. Returns dictionary of existing lists on success.

getActiveAndDefaultPrivacyLists(disp)

source code 

getPrivacyList(disp, listname)

source code 
Request specific privacy list listname. Returns list of XML nodes (rules) taken from the server responce.

setActivePrivacyList(disp, listname=None, typ='active', cb=None)

source code 
Switch privacy list 'listname' to specified type. By default the type is 'active'. Returns true on success.

setDefaultPrivacyList(disp, listname=None)

source code 
Set the default privacy list as 'listname'. Returns true on success

setPrivacyList(disp, listname, tags)

source code 

Set the ruleset

'list' should be the simpleXML node formatted according to RFC 3921 (XMPP-IM) I.e. Node('list',{'name':listname},payload=[...]).

Returns true on success.

delPrivacyList(disp, listname, cb=None)

source code 
Deletes privacy list 'listname'. Returns true on success.

Variables Details [hide private]

REGISTER_DATA_RECEIVED

Value:
'REGISTER DATA RECEIVED'

PL_TYPE_JID

Value:
'jid'

PL_TYPE_GROUP

Value:
'group'

PL_TYPE_SUBC

Value:
'subscription'

PL_ACT_ALLOW

Value:
'allow'

PL_ACT_DENY

Value:
'deny'

PRIVACY_LISTS_RECEIVED

Value:
'PRIVACY LISTS RECEIVED'

PRIVACY_LIST_RECEIVED

Value:
'PRIVACY LIST RECEIVED'

PRIVACY_LISTS_ACTIVE_DEFAULT

Value:
'PRIVACY LISTS ACTIVE DEFAULT'

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.features_nb-pysrc.html000066400000000000000000002472151343257752000257610ustar00rootroot00000000000000 nbxmpp.features_nb
Package nbxmpp :: Module features_nb
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.features_nb

  1  ##   features.py 
  2  ## 
  3  ##   Copyright (C) 2003-2004 Alexey "Snake" Nezhdanov 
  4  ##   Copyright (C) 2007 Julien Pivotto <roidelapluie@gmail.com> 
  5  ## 
  6  ##   This program is free software; you can redistribute it and/or modify 
  7  ##   it under the terms of the GNU General Public License as published by 
  8  ##   the Free Software Foundation; either version 2, or (at your option) 
  9  ##   any later version. 
 10  ## 
 11  ##   This program is distributed in the hope that it will be useful, 
 12  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
 13  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 14  ##   GNU General Public License for more details. 
 15   
 16  # $Id: features.py,v 1.22 2005/09/30 20:13:04 mikealbon Exp $ 
 17   
 18  """ 
 19  Different stuff that wasn't worth separating it into modules 
 20  (Registration, Privacy Lists, ...) 
 21  """ 
 22   
 23  from protocol import NS_REGISTER, NS_PRIVACY, NS_DATA, Iq, isResultNode, Node 
 24   
25 -def _on_default_response(disp, iq, cb):
26 def _on_response(resp): 27 if isResultNode(resp): 28 if cb: 29 cb(True) 30 elif cb: 31 cb(False)
32 disp.SendAndCallForResponse(iq, _on_response) 33 34 ############################################################################### 35 ### Registration 36 ############################################################################### 37 38 REGISTER_DATA_RECEIVED = 'REGISTER DATA RECEIVED' 39
40 -def getRegInfo(disp, host, info={}, sync=True):
41 """ 42 Get registration form from remote host. Info dict can be prefilled 43 :param disp: plugged dispatcher instance 44 :param info: dict, like {'username':'joey'}. 45 46 See JEP-0077 for details. 47 """ 48 iq=Iq('get', NS_REGISTER, to=host) 49 for i in info.keys(): 50 iq.setTagData(i, info[i]) 51 if sync: 52 disp.SendAndCallForResponse(iq, lambda resp: 53 _ReceivedRegInfo(disp.Dispatcher, resp, host)) 54 else: 55 disp.SendAndCallForResponse(iq, _ReceivedRegInfo, {'agent': host })
56
57 -def _ReceivedRegInfo(con, resp, agent):
58 Iq('get', NS_REGISTER, to=agent) 59 if not isResultNode(resp): 60 error_msg = resp.getErrorMsg() 61 con.Event(NS_REGISTER, REGISTER_DATA_RECEIVED, (agent, None, False, error_msg, '')) 62 return 63 tag=resp.getTag('query', namespace=NS_REGISTER) 64 if not tag: 65 error_msg = resp.getErrorMsg() 66 con.Event(NS_REGISTER, REGISTER_DATA_RECEIVED, (agent, None, False, error_msg, '')) 67 return 68 df=tag.getTag('x', namespace=NS_DATA) 69 if df: 70 con.Event(NS_REGISTER, REGISTER_DATA_RECEIVED, (agent, df, True, '', 71 tag)) 72 return 73 df={} 74 for i in resp.getQueryPayload(): 75 if not isinstance(i, Node): 76 continue 77 df[i.getName()] = i.getData() 78 con.Event(NS_REGISTER, REGISTER_DATA_RECEIVED, (agent, df, False, '', ''))
79
80 -def register(disp, host, info, cb, args=None):
81 """ 82 Perform registration on remote server with provided info 83 84 If registration fails you can get additional info from the dispatcher's 85 owner attributes lastErrNode, lastErr and lastErrCode. 86 """ 87 iq=Iq('set', NS_REGISTER, to=host) 88 if not isinstance(info, dict): 89 info=info.asDict() 90 for i in info.keys(): 91 iq.setTag('query').setTagData(i, info[i]) 92 disp.SendAndCallForResponse(iq, cb, args)
93
94 -def unregister(disp, host, cb):
95 """ 96 Unregisters with host (permanently removes account). Returns true on success 97 """ 98 iq = Iq('set', NS_REGISTER, to=host, payload=[Node('remove')]) 99 _on_default_response(disp, iq, cb)
100
101 -def changePasswordTo(disp, newpassword, host=None, cb = None):
102 """ 103 Changes password on specified or current (if not specified) server. Returns 104 true on success. 105 """ 106 if not host: 107 host = disp._owner.Server 108 iq = Iq('set', NS_REGISTER, to=host, payload=[Node('username', 109 payload=[disp._owner.Server]), Node('password', payload=[newpassword])]) 110 _on_default_response(disp, iq, cb)
111 112 ############################################################################### 113 ### Privacy List 114 ############################################################################### 115 116 PL_TYPE_JID = 'jid' 117 PL_TYPE_GROUP = 'group' 118 PL_TYPE_SUBC = 'subscription' 119 PL_ACT_ALLOW = 'allow' 120 PL_ACT_DENY = 'deny' 121 122 PRIVACY_LISTS_RECEIVED = 'PRIVACY LISTS RECEIVED' 123 PRIVACY_LIST_RECEIVED = 'PRIVACY LIST RECEIVED' 124 PRIVACY_LISTS_ACTIVE_DEFAULT = 'PRIVACY LISTS ACTIVE DEFAULT' 125
126 -def getPrivacyLists(disp):
127 """ 128 Request privacy lists from connected server. Returns dictionary of existing 129 lists on success. 130 """ 131 iq = Iq('get', NS_PRIVACY) 132 def _on_response(resp): 133 dict_ = {'lists': []} 134 if not isResultNode(resp): 135 disp.Event(NS_PRIVACY, PRIVACY_LISTS_RECEIVED, (False)) 136 return 137 for list_ in resp.getQueryPayload(): 138 if list_.getName()=='list': 139 dict_['lists'].append(list_.getAttr('name')) 140 else: 141 dict_[list_.getName()]=list_.getAttr('name') 142 disp.Event(NS_PRIVACY, PRIVACY_LISTS_RECEIVED, (dict_))
143 disp.SendAndCallForResponse(iq, _on_response) 144
146 iq = Iq('get', NS_PRIVACY) 147 def _on_response(resp): 148 dict_ = {'active': '', 'default': ''} 149 if not isResultNode(resp): 150 disp.Event(NS_PRIVACY, PRIVACY_LISTS_ACTIVE_DEFAULT, (False)) 151 return 152 for list_ in resp.getQueryPayload(): 153 if list_.getName() == 'active': 154 dict_['active'] = list_.getAttr('name') 155 elif list_.getName() == 'default': 156 dict_['default'] = list_.getAttr('name') 157 disp.Event(NS_PRIVACY, PRIVACY_LISTS_ACTIVE_DEFAULT, (dict_))
158 disp.SendAndCallForResponse(iq, _on_response) 159
160 -def getPrivacyList(disp, listname):
161 """ 162 Request specific privacy list listname. Returns list of XML nodes (rules) 163 taken from the server responce. 164 """ 165 def _on_response(resp): 166 if not isResultNode(resp): 167 disp.Event(NS_PRIVACY, PRIVACY_LIST_RECEIVED, (False)) 168 return 169 disp.Event(NS_PRIVACY, PRIVACY_LIST_RECEIVED, (resp))
170 iq = Iq('get', NS_PRIVACY, payload=[Node('list', {'name': listname})]) 171 disp.SendAndCallForResponse(iq, _on_response) 172
173 -def setActivePrivacyList(disp, listname=None, typ='active', cb=None):
174 """ 175 Switch privacy list 'listname' to specified type. By default the type is 176 'active'. Returns true on success. 177 """ 178 if listname: 179 attrs={'name':listname} 180 else: 181 attrs={} 182 iq = Iq('set', NS_PRIVACY, payload=[Node(typ, attrs)]) 183 _on_default_response(disp, iq, cb)
184
185 -def setDefaultPrivacyList(disp, listname=None):
186 """ 187 Set the default privacy list as 'listname'. Returns true on success 188 """ 189 return setActivePrivacyList(disp, listname, 'default')
190
191 -def setPrivacyList(disp, listname, tags):
192 """ 193 Set the ruleset 194 195 'list' should be the simpleXML node formatted according to RFC 3921 196 (XMPP-IM) I.e. Node('list',{'name':listname},payload=[...]). 197 198 Returns true on success. 199 """ 200 iq = Iq('set', NS_PRIVACY, xmlns = '') 201 list_query = iq.getTag('query').setTag('list', {'name': listname}) 202 for item in tags: 203 if 'type' in item and 'value' in item: 204 item_tag = list_query.setTag('item', {'action': item['action'], 205 'order': item['order'], 'type': item['type'], 206 'value': item['value']}) 207 else: 208 item_tag = list_query.setTag('item', {'action': item['action'], 209 'order': item['order']}) 210 if 'child' in item: 211 for child_tag in item['child']: 212 item_tag.setTag(child_tag) 213 _on_default_response(disp, iq, None)
214
215 -def delPrivacyList(disp, listname, cb=None):
216 ''' Deletes privacy list 'listname'. Returns true on success. ''' 217 iq = Iq('set', NS_PRIVACY, payload=[Node('list', {'name':listname})]) 218 _on_default_response(disp, iq, cb)
219

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.idlequeue-module.html000066400000000000000000000440531343257752000255660ustar00rootroot00000000000000 nbxmpp.idlequeue
Package nbxmpp :: Module idlequeue
[hide private]
[frames] | no frames]

Module idlequeue

source code

Idlequeues are Gajim's network heartbeat. Transports can be plugged as idle objects and be informed about possible IO
Classes [hide private]
  IdleObject
Idle listener interface. Listed methods are called by IdleQueue.
  IdleCommand
Can be subclassed to execute commands asynchronously by the idlequeue. Result will be optained via file descriptor of created pipe
  IdleQueue
IdleQueue provide three distinct time based features. Uses select.poll()
  SelectIdleQueue
Extends IdleQueue to use select.select() for polling
  GlibIdleQueue
Extends IdleQueue to use glib io_add_wath, instead of select/poll In another 'non gui' implementation of Gajim IdleQueue can be used safetly
Functions [hide private]
 
get_idlequeue()
Get an appropriate idlequeue
source code
Variables [hide private]
  log = logging.getLogger('nbxmpp.idlequeue')
  HAVE_GOBJECT = True
  FLAG_WRITE = 20
  FLAG_READ = 19
  FLAG_READ_WRITE = 23
  FLAG_CLOSE = 16
  PENDING_READ = 3
  PENDING_WRITE = 4
  IS_CLOSED = 16
  __package__ = 'nbxmpp'

Imports: os, select, logging, gobject, STDOUT, PIPE, call, CalledProcessError, Popen, check_call, check_output, fcntl


Function Details [hide private]

get_idlequeue()

source code 
Get an appropriate idlequeue

Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.idlequeue')

HAVE_GOBJECT

Value:
True

FLAG_WRITE

Value:
20

FLAG_READ

Value:
19

FLAG_READ_WRITE

Value:
23

FLAG_CLOSE

Value:
16

PENDING_READ

Value:
3

PENDING_WRITE

Value:
4

IS_CLOSED

Value:
16

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.idlequeue-pysrc.html000066400000000000000000005107171343257752000254460ustar00rootroot00000000000000 nbxmpp.idlequeue
Package nbxmpp :: Module idlequeue
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.idlequeue

  1  ##   idlequeue.py 
  2  ## 
  3  ##   Copyright (C) 2006 Dimitur Kirov <dkirov@gmail.com> 
  4  ## 
  5  ##   This program is free software; you can redistribute it and/or modify 
  6  ##   it under the terms of the GNU General Public License as published by 
  7  ##   the Free Software Foundation; either version 2, or (at your option) 
  8  ##   any later version. 
  9  ## 
 10  ##   This program is distributed in the hope that it will be useful, 
 11  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
 12  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 13  ##   GNU General Public License for more details. 
 14   
 15   
 16  """ 
 17  Idlequeues are Gajim's network heartbeat. Transports can be plugged as idle 
 18  objects and be informed about possible IO 
 19  """ 
 20   
 21  import os 
 22  import select 
 23  import logging 
 24  log = logging.getLogger('nbxmpp.idlequeue') 
 25   
 26  # needed for get_idleqeue 
 27  try: 
 28      import gobject 
 29      HAVE_GOBJECT = True 
 30  except ImportError: 
 31      HAVE_GOBJECT = False 
 32   
 33  # needed for idlecommand 
 34  if os.name == 'nt': 
 35      from subprocess import * # python24 only. we ask this for Windows 
 36  elif os.name == 'posix': 
 37      import fcntl 
 38   
 39  FLAG_WRITE                      = 20 # write only 
 40  FLAG_READ                       = 19 # read only 
 41  FLAG_READ_WRITE = 23 # read and write 
 42  FLAG_CLOSE                      = 16 # wait for close 
 43   
 44  PENDING_READ            = 3 # waiting read event 
 45  PENDING_WRITE           = 4 # waiting write event 
 46  IS_CLOSED                       = 16 # channel closed 
 47   
 48   
49 -def get_idlequeue():
50 """ 51 Get an appropriate idlequeue 52 """ 53 if os.name == 'nt': 54 # gobject.io_add_watch does not work on windows 55 return SelectIdleQueue() 56 else: 57 if HAVE_GOBJECT: 58 # Gajim's default Idlequeue 59 return GlibIdleQueue() 60 else: 61 # GUI less implementation 62 return SelectIdleQueue()
63 64
65 -class IdleObject:
66 """ 67 Idle listener interface. Listed methods are called by IdleQueue. 68 """ 69
70 - def __init__(self):
71 self.fd = -1 #: filedescriptor, must be unique for each IdleObject
72
73 - def pollend(self):
74 """ 75 Called on stream failure 76 """ 77 pass
78
79 - def pollin(self):
80 """ 81 Called on new read event 82 """ 83 pass
84
85 - def pollout(self):
86 """ 87 Called on new write event (connect in sockets is a pollout) 88 """ 89 pass
90
91 - def read_timeout(self):
92 """ 93 Called when timeout happened 94 """ 95 pass
96 97
98 -class IdleCommand(IdleObject):
99 """ 100 Can be subclassed to execute commands asynchronously by the idlequeue. 101 Result will be optained via file descriptor of created pipe 102 """ 103
104 - def __init__(self, on_result):
105 IdleObject.__init__(self) 106 # how long (sec.) to wait for result ( 0 - forever ) 107 # it is a class var, instead of a constant and we can override it. 108 self.commandtimeout = 0 109 # when we have some kind of result (valid, ot not) we call this handler 110 self.result_handler = on_result 111 # if it is True, we can safetely execute the command 112 self.canexecute = True 113 self.idlequeue = None 114 self.result =''
115
116 - def set_idlequeue(self, idlequeue):
117 self.idlequeue = idlequeue
118
119 - def _return_result(self):
120 if self.result_handler: 121 self.result_handler(self.result) 122 self.result_handler = None
123
124 - def _compose_command_args(self):
125 return ['echo', 'da']
126
127 - def _compose_command_line(self):
128 """ 129 Return one line representation of command and its arguments 130 """ 131 return reduce(lambda left, right: left + ' ' + right, 132 self._compose_command_args())
133
134 - def wait_child(self):
135 if self.pipe.poll() is None: 136 # result timeout 137 if self.endtime < self.idlequeue.current_time(): 138 self._return_result() 139 self.pipe.stdout.close() 140 self.pipe.stdin.close() 141 else: 142 # child is still active, continue to wait 143 self.idlequeue.set_alarm(self.wait_child, 0.1) 144 else: 145 # child has quit 146 self.result = self.pipe.stdout.read() 147 self._return_result() 148 self.pipe.stdout.close() 149 self.pipe.stdin.close()
150
151 - def start(self):
152 if not self.canexecute: 153 self.result = '' 154 self._return_result() 155 return 156 if os.name == 'nt': 157 self._start_nt() 158 elif os.name == 'posix': 159 self._start_posix()
160
161 - def _start_nt(self):
162 # if program is started from noninteraactive shells stdin is closed and 163 # cannot be forwarded, so we have to keep it open 164 self.pipe = Popen(self._compose_command_args(), stdout=PIPE, 165 bufsize = 1024, shell = True, stderr = STDOUT, stdin = PIPE) 166 if self.commandtimeout >= 0: 167 self.endtime = self.idlequeue.current_time() + self.commandtimeout 168 self.idlequeue.set_alarm(self.wait_child, 0.1)
169
170 - def _start_posix(self):
171 self.pipe = os.popen(self._compose_command_line()) 172 self.fd = self.pipe.fileno() 173 fcntl.fcntl(self.pipe, fcntl.F_SETFL, os.O_NONBLOCK) 174 self.idlequeue.plug_idle(self, False, True) 175 if self.commandtimeout >= 0: 176 self.idlequeue.set_read_timeout(self.fd, self.commandtimeout)
177
178 - def end(self):
179 self.idlequeue.unplug_idle(self.fd) 180 try: 181 self.pipe.close() 182 except: 183 pass
184
185 - def pollend(self):
186 self.idlequeue.remove_timeout(self.fd) 187 self.end() 188 self._return_result()
189
190 - def pollin(self):
191 try: 192 res = self.pipe.read() 193 except Exception, e: 194 res = '' 195 if res == '': 196 return self.pollend() 197 else: 198 self.result += res
199
200 - def read_timeout(self):
201 self.end() 202 self._return_result()
203 204
205 -class IdleQueue:
206 """ 207 IdleQueue provide three distinct time based features. Uses select.poll() 208 209 1. Alarm timeout: Execute a callback after foo seconds 210 2. Timeout event: Call read_timeout() of an plugged object if a timeout 211 has been set, but not removed in time. 212 3. Check file descriptor of plugged objects for read, write and error 213 events 214 215 """ 216 217 # (timeout, boolean) 218 # Boolean is True if timeout is specified in seconds, False means miliseconds 219 PROCESS_TIMEOUT = (100, False) 220
221 - def __init__(self):
222 self.queue = {} 223 224 # when there is a timeout it executes obj.read_timeout() 225 # timeout is not removed automatically! 226 # {fd1: {timeout1: func1, timeout2: func2}} 227 # timout are unique (timeout1 must be != timeout2) 228 # If func1 is None, read_time function is called 229 self.read_timeouts = {} 230 231 # cb, which are executed after XX sec., alarms are removed automatically 232 self.alarms = {} 233 self._init_idle()
234
235 - def _init_idle(self):
236 """ 237 Hook method for subclassed. Will be called by __init__ 238 """ 239 self.selector = select.poll()
240
241 - def set_alarm(self, alarm_cb, seconds):
242 """ 243 Set up a new alarm. alarm_cb will be called after specified seconds. 244 """ 245 alarm_time = self.current_time() + seconds 246 # almost impossible, but in case we have another alarm_cb at this time 247 if alarm_time in self.alarms: 248 self.alarms[alarm_time].append(alarm_cb) 249 else: 250 self.alarms[alarm_time] = [alarm_cb] 251 return alarm_time
252
253 - def remove_alarm(self, alarm_cb, alarm_time):
254 """ 255 Remove alarm callback alarm_cb scheduled on alarm_time. Returns True if 256 it was removed sucessfully, otherwise False 257 """ 258 if not alarm_time in self.alarms: 259 return False 260 i = -1 261 for i in range(len(self.alarms[alarm_time])): 262 # let's not modify the list inside the loop 263 if self.alarms[alarm_time][i] is alarm_cb: 264 break 265 if i != -1: 266 del self.alarms[alarm_time][i] 267 if self.alarms[alarm_time] == []: 268 del self.alarms[alarm_time] 269 return True 270 else: 271 return False
272
273 - def remove_timeout(self, fd, timeout=None):
274 """ 275 Remove the read timeout 276 """ 277 log.info('read timeout removed for fd %s' % fd) 278 if fd in self.read_timeouts: 279 if timeout: 280 if timeout in self.read_timeouts[fd]: 281 del(self.read_timeouts[fd][timeout]) 282 if len(self.read_timeouts[fd]) == 0: 283 del(self.read_timeouts[fd]) 284 else: 285 del(self.read_timeouts[fd])
286
287 - def set_read_timeout(self, fd, seconds, func=None):
288 """ 289 Seta a new timeout. If it is not removed after specified seconds, 290 func or obj.read_timeout() will be called 291 292 A filedescriptor fd can have several timeouts. 293 """ 294 log_txt = 'read timeout set for fd %s on %s seconds' % (fd, seconds) 295 if func: 296 log_txt += ' with function ' + str(func) 297 log.info(log_txt) 298 timeout = self.current_time() + seconds 299 if fd in self.read_timeouts: 300 self.read_timeouts[fd][timeout] = func 301 else: 302 self.read_timeouts[fd] = {timeout: func}
303
304 - def _check_time_events(self):
305 """ 306 Execute and remove alarm callbacks and execute func() or read_timeout() 307 for plugged objects if specified time has ellapsed 308 """ 309 current_time = self.current_time() 310 311 for fd, timeouts in self.read_timeouts.items(): 312 if fd not in self.queue: 313 self.remove_timeout(fd) 314 continue 315 for timeout, func in timeouts.items(): 316 if timeout > current_time: 317 continue 318 if func: 319 log.debug('Calling %s for fd %s' % (func, fd)) 320 func() 321 else: 322 log.debug('Calling read_timeout for fd %s' % fd) 323 self.queue[fd].read_timeout() 324 self.remove_timeout(fd, timeout) 325 326 times = self.alarms.keys() 327 for alarm_time in times: 328 if alarm_time > current_time: 329 continue 330 if alarm_time in self.alarms: 331 for callback in self.alarms[alarm_time]: 332 callback() 333 if alarm_time in self.alarms: 334 del(self.alarms[alarm_time])
335
336 - def plug_idle(self, obj, writable=True, readable=True):
337 """ 338 Plug an IdleObject into idlequeue. Filedescriptor fd must be set 339 340 :param obj: the IdleObject 341 :param writable: True if obj has data to sent 342 :param readable: True if obj expects data to be reiceived 343 """ 344 if obj.fd == -1: 345 return 346 if obj.fd in self.queue: 347 self.unplug_idle(obj.fd) 348 self.queue[obj.fd] = obj 349 if writable: 350 if not readable: 351 flags = FLAG_WRITE 352 else: 353 flags = FLAG_READ_WRITE 354 else: 355 if readable: 356 flags = FLAG_READ 357 else: 358 # when we paused a FT, we expect only a close event 359 flags = FLAG_CLOSE 360 self._add_idle(obj.fd, flags)
361
362 - def _add_idle(self, fd, flags):
363 """ 364 Hook method for subclasses, called by plug_idle 365 """ 366 self.selector.register(fd, flags)
367
368 - def unplug_idle(self, fd):
369 """ 370 Remove plugged IdleObject, specified by filedescriptor fd 371 """ 372 if fd in self.queue: 373 del(self.queue[fd]) 374 self._remove_idle(fd)
375
376 - def current_time(self):
377 from time import time 378 return time()
379
380 - def _remove_idle(self, fd):
381 """ 382 Hook method for subclassed, called by unplug_idle 383 """ 384 self.selector.unregister(fd)
385
386 - def _process_events(self, fd, flags):
387 obj = self.queue.get(fd) 388 if obj is None: 389 self.unplug_idle(fd) 390 return False 391 392 read_write = False 393 if flags & PENDING_READ: 394 #print 'waiting read on %d, flags are %d' % (fd, flags) 395 obj.pollin() 396 read_write = True 397 398 elif flags & PENDING_WRITE and not flags & IS_CLOSED: 399 obj.pollout() 400 read_write = True 401 402 if flags & IS_CLOSED: 403 # io error, don't expect more events 404 self.remove_timeout(obj.fd) 405 self.unplug_idle(obj.fd) 406 obj.pollend() 407 return False 408 409 if read_write: 410 return True 411 return False
412
413 - def process(self):
414 """ 415 Process idlequeue. Check for any pending timeout or alarm events. Call 416 IdleObjects on possible and requested read, write and error events on 417 their file descriptors 418 419 Call this in regular intervals. 420 """ 421 if not self.queue: 422 # check for timeouts/alert also when there are no active fds 423 self._check_time_events() 424 return True 425 try: 426 waiting_descriptors = self.selector.poll(0) 427 except select.error, e: 428 waiting_descriptors = [] 429 if e[0] != 4: # interrupt 430 raise 431 for fd, flags in waiting_descriptors: 432 self._process_events(fd, flags) 433 self._check_time_events() 434 return True
435 436
437 -class SelectIdleQueue(IdleQueue):
438 """ 439 Extends IdleQueue to use select.select() for polling 440 441 This class exisists for the sake of gtk2.8 on windows, which doesn't seem to 442 support io_add_watch properly (yet) 443 """ 444
445 - def _init_idle(self):
446 """ 447 Create a dict, which maps file/pipe/sock descriptor to glib event id 448 """ 449 self.read_fds = {} 450 self.write_fds = {} 451 self.error_fds = {}
452
453 - def _add_idle(self, fd, flags):
454 """ 455 This method is called when we plug a new idle object. Remove descriptor 456 to read/write/error lists, according flags 457 """ 458 if flags & 3: 459 self.read_fds[fd] = fd 460 if flags & 4: 461 self.write_fds[fd] = fd 462 self.error_fds[fd] = fd
463
464 - def _remove_idle(self, fd):
465 """ 466 This method is called when we unplug a new idle object. Remove descriptor 467 from read/write/error lists 468 """ 469 if fd in self.read_fds: 470 del(self.read_fds[fd]) 471 if fd in self.write_fds: 472 del(self.write_fds[fd]) 473 if fd in self.error_fds: 474 del(self.error_fds[fd])
475
476 - def process(self):
477 if not self.write_fds and not self.read_fds: 478 self._check_time_events() 479 return True 480 try: 481 waiting_descriptors = select.select(self.read_fds.keys(), 482 self.write_fds.keys(), self.error_fds.keys(), 0) 483 except select.error, e: 484 waiting_descriptors = ((), (), ()) 485 if e[0] != 4: # interrupt 486 raise 487 for fd in waiting_descriptors[0]: 488 q = self.queue.get(fd) 489 if q: 490 q.pollin() 491 for fd in waiting_descriptors[1]: 492 q = self.queue.get(fd) 493 if q: 494 q.pollout() 495 for fd in waiting_descriptors[2]: 496 q = self.queue.get(fd) 497 if q: 498 q.pollend() 499 self._check_time_events() 500 return True
501 502
503 -class GlibIdleQueue(IdleQueue):
504 """ 505 Extends IdleQueue to use glib io_add_wath, instead of select/poll In another 506 'non gui' implementation of Gajim IdleQueue can be used safetly 507 """ 508 509 # (timeout, boolean) 510 # Boolean is True if timeout is specified in seconds, False means miliseconds 511 PROCESS_TIMEOUT = (2, True) 512
513 - def _init_idle(self):
514 """ 515 Creates a dict, which maps file/pipe/sock descriptor to glib event id 516 """ 517 self.events = {} 518 # time() is already called in glib, we just get the last value 519 # overrides IdleQueue.current_time() 520 self.current_time = gobject.get_current_time
521
522 - def _add_idle(self, fd, flags):
523 """ 524 This method is called when we plug a new idle object. Start listening for 525 events from fd 526 """ 527 res = gobject.io_add_watch(fd, flags, self._process_events, 528 priority=gobject.PRIORITY_LOW) 529 # store the id of the watch, so that we can remove it on unplug 530 self.events[fd] = res
531
532 - def _process_events(self, fd, flags):
533 try: 534 return IdleQueue._process_events(self, fd, flags) 535 except Exception: 536 self._remove_idle(fd) 537 self._add_idle(fd, flags) 538 raise
539
540 - def _remove_idle(self, fd):
541 """ 542 This method is called when we unplug a new idle object. Stop listening 543 for events from fd 544 """ 545 if not fd in self.events: 546 return 547 gobject.source_remove(self.events[fd]) 548 del(self.events[fd])
549
550 - def process(self):
551 self._check_time_events()
552

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.idlequeue.GlibIdleQueue-class.html000066400000000000000000000513131343257752000300620ustar00rootroot00000000000000 nbxmpp.idlequeue.GlibIdleQueue
Package nbxmpp :: Module idlequeue :: Class GlibIdleQueue
[hide private]
[frames] | no frames]

Class GlibIdleQueue

source code


Extends IdleQueue to use glib io_add_wath, instead of select/poll In another 'non gui' implementation of Gajim IdleQueue can be used safetly
Instance Methods [hide private]
 
_init_idle(self)
Creates a dict, which maps file/pipe/sock descriptor to glib event id
source code
 
_add_idle(self, fd, flags)
This method is called when we plug a new idle object. Start listening for events from fd
source code
 
_process_events(self, fd, flags) source code
 
_remove_idle(self, fd)
This method is called when we unplug a new idle object. Stop listening for events from fd
source code
 
process(self)
Process idlequeue. Check for any pending timeout or alarm events. Call IdleObjects on possible and requested read, write and error events on their file descriptors
source code

Inherited from IdleQueue: __init__, current_time, plug_idle, remove_alarm, remove_timeout, set_alarm, set_read_timeout, unplug_idle

Inherited from IdleQueue (private): _check_time_events

Class Variables [hide private]
  PROCESS_TIMEOUT = (2, True)
Method Details [hide private]

_init_idle(self)

source code 
Creates a dict, which maps file/pipe/sock descriptor to glib event id
Overrides: IdleQueue._init_idle

_add_idle(self, fd, flags)

source code 
This method is called when we plug a new idle object. Start listening for events from fd
Overrides: IdleQueue._add_idle

_process_events(self, fd, flags)

source code 
Overrides: IdleQueue._process_events

_remove_idle(self, fd)

source code 
This method is called when we unplug a new idle object. Stop listening for events from fd
Overrides: IdleQueue._remove_idle

process(self)

source code 

Process idlequeue. Check for any pending timeout or alarm events. Call IdleObjects on possible and requested read, write and error events on their file descriptors

Call this in regular intervals.

Overrides: IdleQueue.process
(inherited documentation)

Class Variable Details [hide private]

PROCESS_TIMEOUT

Value:
(2, True)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.idlequeue.IdleCommand-class.html000066400000000000000000000663211343257752000275630ustar00rootroot00000000000000 nbxmpp.idlequeue.IdleCommand
Package nbxmpp :: Module idlequeue :: Class IdleCommand
[hide private]
[frames] | no frames]

Class IdleCommand

source code


Can be subclassed to execute commands asynchronously by the idlequeue. Result will be optained via file descriptor of created pipe
Instance Methods [hide private]
 
__init__(self, on_result) source code
 
set_idlequeue(self, idlequeue) source code
 
_return_result(self) source code
 
_compose_command_args(self) source code
 
_compose_command_line(self)
Return one line representation of command and its arguments
source code
 
wait_child(self) source code
 
start(self) source code
 
_start_nt(self) source code
 
_start_posix(self) source code
 
end(self) source code
 
pollend(self)
Called on stream failure
source code
 
pollin(self)
Called on new read event
source code
 
read_timeout(self)
Called when timeout happened
source code

Inherited from IdleObject: pollout

Instance Variables [hide private]

Inherited from IdleObject: fd

Method Details [hide private]

__init__(self, on_result)
(Constructor)

source code 
Overrides: IdleObject.__init__

set_idlequeue(self, idlequeue)

source code 

_return_result(self)

source code 

_compose_command_args(self)

source code 

_compose_command_line(self)

source code 
Return one line representation of command and its arguments

wait_child(self)

source code 

start(self)

source code 

_start_nt(self)

source code 

_start_posix(self)

source code 

end(self)

source code 

pollend(self)

source code 
Called on stream failure
Overrides: IdleObject.pollend
(inherited documentation)

pollin(self)

source code 
Called on new read event
Overrides: IdleObject.pollin
(inherited documentation)

read_timeout(self)

source code 
Called when timeout happened
Overrides: IdleObject.read_timeout
(inherited documentation)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.idlequeue.IdleObject-class.html000066400000000000000000000410671343257752000274130ustar00rootroot00000000000000 nbxmpp.idlequeue.IdleObject
Package nbxmpp :: Module idlequeue :: Class IdleObject
[hide private]
[frames] | no frames]

Class IdleObject

source code


Idle listener interface. Listed methods are called by IdleQueue.
Instance Methods [hide private]
 
__init__(self) source code
 
pollend(self)
Called on stream failure
source code
 
pollin(self)
Called on new read event
source code
 
pollout(self)
Called on new write event (connect in sockets is a pollout)
source code
 
read_timeout(self)
Called when timeout happened
source code
Instance Variables [hide private]
  fd
filedescriptor, must be unique for each IdleObject
Method Details [hide private]

__init__(self)
(Constructor)

source code 

pollend(self)

source code 
Called on stream failure

pollin(self)

source code 
Called on new read event

pollout(self)

source code 
Called on new write event (connect in sockets is a pollout)

read_timeout(self)

source code 
Called when timeout happened

Instance Variable Details [hide private]

fd

filedescriptor, must be unique for each IdleObject

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.idlequeue.IdleQueue-class.html000066400000000000000000001027351343257752000272710ustar00rootroot00000000000000 nbxmpp.idlequeue.IdleQueue
Package nbxmpp :: Module idlequeue :: Class IdleQueue
[hide private]
[frames] | no frames]

Class IdleQueue

source code


IdleQueue provide three distinct time based features. Uses select.poll()

  1. Alarm timeout: Execute a callback after foo seconds
  2. Timeout event: Call read_timeout() of an plugged object if a timeout has been set, but not removed in time.
  3. Check file descriptor of plugged objects for read, write and error events
Instance Methods [hide private]
 
__init__(self) source code
 
_init_idle(self)
Hook method for subclassed. Will be called by __init__
source code
 
set_alarm(self, alarm_cb, seconds)
Set up a new alarm. alarm_cb will be called after specified seconds.
source code
 
remove_alarm(self, alarm_cb, alarm_time)
Remove alarm callback alarm_cb scheduled on alarm_time. Returns True if it was removed sucessfully, otherwise False
source code
 
remove_timeout(self, fd, timeout=None)
Remove the read timeout
source code
 
set_read_timeout(self, fd, seconds, func=None)
Seta a new timeout. If it is not removed after specified seconds, func or obj.read_timeout() will be called
source code
 
_check_time_events(self)
Execute and remove alarm callbacks and execute func() or read_timeout() for plugged objects if specified time has ellapsed
source code
 
plug_idle(self, obj, writable=True, readable=True)
Plug an IdleObject into idlequeue. Filedescriptor fd must be set
source code
 
_add_idle(self, fd, flags)
Hook method for subclasses, called by plug_idle
source code
 
unplug_idle(self, fd)
Remove plugged IdleObject, specified by filedescriptor fd
source code
 
current_time(self) source code
 
_remove_idle(self, fd)
Hook method for subclassed, called by unplug_idle
source code
 
_process_events(self, fd, flags) source code
 
process(self)
Process idlequeue. Check for any pending timeout or alarm events. Call IdleObjects on possible and requested read, write and error events on their file descriptors
source code
Class Variables [hide private]
  PROCESS_TIMEOUT = (100, False)
Method Details [hide private]

__init__(self)
(Constructor)

source code 

_init_idle(self)

source code 
Hook method for subclassed. Will be called by __init__

set_alarm(self, alarm_cb, seconds)

source code 
Set up a new alarm. alarm_cb will be called after specified seconds.

remove_alarm(self, alarm_cb, alarm_time)

source code 
Remove alarm callback alarm_cb scheduled on alarm_time. Returns True if it was removed sucessfully, otherwise False

remove_timeout(self, fd, timeout=None)

source code 
Remove the read timeout

set_read_timeout(self, fd, seconds, func=None)

source code 

Seta a new timeout. If it is not removed after specified seconds, func or obj.read_timeout() will be called

A filedescriptor fd can have several timeouts.

_check_time_events(self)

source code 
Execute and remove alarm callbacks and execute func() or read_timeout() for plugged objects if specified time has ellapsed

plug_idle(self, obj, writable=True, readable=True)

source code 
Plug an IdleObject into idlequeue. Filedescriptor fd must be set
Parameters:
  • obj - the IdleObject
  • writable - True if obj has data to sent
  • readable - True if obj expects data to be reiceived

_add_idle(self, fd, flags)

source code 
Hook method for subclasses, called by plug_idle

unplug_idle(self, fd)

source code 
Remove plugged IdleObject, specified by filedescriptor fd

current_time(self)

source code 

_remove_idle(self, fd)

source code 
Hook method for subclassed, called by unplug_idle

_process_events(self, fd, flags)

source code 

process(self)

source code 

Process idlequeue. Check for any pending timeout or alarm events. Call IdleObjects on possible and requested read, write and error events on their file descriptors

Call this in regular intervals.


Class Variable Details [hide private]

PROCESS_TIMEOUT

Value:
(100, False)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.idlequeue.SelectIdleQueue-class.html000066400000000000000000000435671343257752000304400ustar00rootroot00000000000000 nbxmpp.idlequeue.SelectIdleQueue
Package nbxmpp :: Module idlequeue :: Class SelectIdleQueue
[hide private]
[frames] | no frames]

Class SelectIdleQueue

source code


Extends IdleQueue to use select.select() for polling

This class exisists for the sake of gtk2.8 on windows, which doesn't seem to support io_add_watch properly (yet)

Instance Methods [hide private]
 
_init_idle(self)
Create a dict, which maps file/pipe/sock descriptor to glib event id
source code
 
_add_idle(self, fd, flags)
This method is called when we plug a new idle object. Remove descriptor to read/write/error lists, according flags
source code
 
_remove_idle(self, fd)
This method is called when we unplug a new idle object. Remove descriptor from read/write/error lists
source code
 
process(self)
Process idlequeue. Check for any pending timeout or alarm events. Call IdleObjects on possible and requested read, write and error events on their file descriptors
source code

Inherited from IdleQueue: __init__, current_time, plug_idle, remove_alarm, remove_timeout, set_alarm, set_read_timeout, unplug_idle

Inherited from IdleQueue (private): _check_time_events, _process_events

Class Variables [hide private]

Inherited from IdleQueue: PROCESS_TIMEOUT

Method Details [hide private]

_init_idle(self)

source code 
Create a dict, which maps file/pipe/sock descriptor to glib event id
Overrides: IdleQueue._init_idle

_add_idle(self, fd, flags)

source code 
This method is called when we plug a new idle object. Remove descriptor to read/write/error lists, according flags
Overrides: IdleQueue._add_idle

_remove_idle(self, fd)

source code 
This method is called when we unplug a new idle object. Remove descriptor from read/write/error lists
Overrides: IdleQueue._remove_idle

process(self)

source code 

Process idlequeue. Check for any pending timeout or alarm events. Call IdleObjects on possible and requested read, write and error events on their file descriptors

Call this in regular intervals.

Overrides: IdleQueue.process
(inherited documentation)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.plugin-module.html000066400000000000000000000203331343257752000250750ustar00rootroot00000000000000 nbxmpp.plugin
Package nbxmpp :: Module plugin
[hide private]
[frames] | no frames]

Module plugin

source code

Provides PlugIn class functionality to develop extentions for xmpppy
Classes [hide private]
  PlugIn
Abstract xmpppy plugin infrastructure code, providing plugging in/out and debugging functionality
Variables [hide private]
  log = logging.getLogger('nbxmpp.plugin')
  __package__ = 'nbxmpp'

Imports: logging


Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.plugin')

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.plugin-pysrc.html000066400000000000000000000713561343257752000247630ustar00rootroot00000000000000 nbxmpp.plugin
Package nbxmpp :: Module plugin
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.plugin

 1  ##   plugin.py 
 2  ## 
 3  ##   Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 
 4  ## 
 5  ##   This program is free software; you can redistribute it and/or modify 
 6  ##   it under the terms of the GNU General Public License as published by 
 7  ##   the Free Software Foundation; either version 2, or (at your option) 
 8  ##   any later version. 
 9  ## 
10  ##   This program is distributed in the hope that it will be useful, 
11  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
12  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
13  ##   GNU General Public License for more details. 
14   
15  # $Id: client.py,v 1.52 2006/01/02 19:40:55 normanr Exp $ 
16   
17  """ 
18  Provides PlugIn class functionality to develop extentions for xmpppy 
19  """ 
20   
21  import logging 
22  log = logging.getLogger('nbxmpp.plugin') 
23 24 -class PlugIn:
25 """ 26 Abstract xmpppy plugin infrastructure code, providing plugging in/out and 27 debugging functionality 28 29 Inherit to develop pluggable objects. No code change on the owner class 30 required (the object where we plug into) 31 32 For every instance of PlugIn class the 'owner' is the class in what the plug 33 was plugged. 34 """ 35
36 - def __init__(self):
37 self._exported_methods=[]
38
39 - def PlugIn(self, owner):
40 """ 41 Attach to owner and register ourself and our _exported_methods in it. 42 If defined by a subclass, call self.plugin(owner) to execute hook 43 code after plugging 44 """ 45 self._owner=owner 46 log.info('Plugging %s __INTO__ %s' % (self, self._owner)) 47 if self.__class__.__name__ in owner.__dict__: 48 log.debug('Plugging ignored: another instance already plugged.') 49 return 50 self._old_owners_methods=[] 51 for method in self._exported_methods: 52 if method.__name__ in owner.__dict__: 53 self._old_owners_methods.append(owner.__dict__[method.__name__]) 54 owner.__dict__[method.__name__]=method 55 if self.__class__.__name__.endswith('Dispatcher'): 56 # FIXME: I need BOSHDispatcher or XMPPDispatcher on .Dispatcher 57 # there must be a better way.. 58 owner.__dict__['Dispatcher']=self 59 else: 60 owner.__dict__[self.__class__.__name__]=self 61 62 # Execute hook 63 if hasattr(self, 'plugin'): 64 return self.plugin(owner)
65
66 - def PlugOut(self):
67 """ 68 Unregister our _exported_methods from owner and detach from it. 69 If defined by a subclass, call self.plugout() after unplugging to execute 70 hook code 71 """ 72 log.info('Plugging %s __OUT__ of %s.' % (self, self._owner)) 73 for method in self._exported_methods: 74 del self._owner.__dict__[method.__name__] 75 for method in self._old_owners_methods: 76 self._owner.__dict__[method.__name__]=method 77 # FIXME: Dispatcher workaround 78 if self.__class__.__name__.endswith('Dispatcher'): 79 del self._owner.__dict__['Dispatcher'] 80 else: 81 del self._owner.__dict__[self.__class__.__name__] 82 # Execute hook 83 if hasattr(self, 'plugout'): 84 return self.plugout() 85 del self._owner
86 87 @classmethod
88 - def get_instance(cls, *args, **kwargs):
89 """ 90 Factory Method for object creation 91 92 Use this instead of directly initializing the class in order to make 93 unit testing easier. For testing, this method can be patched to inject 94 mock objects. 95 """ 96 return cls(*args, **kwargs)
97

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.plugin.PlugIn-class.html000066400000000000000000000406421343257752000261170ustar00rootroot00000000000000 nbxmpp.plugin.PlugIn
Package nbxmpp :: Module plugin :: Class PlugIn
[hide private]
[frames] | no frames]

Class PlugIn

source code


Abstract xmpppy plugin infrastructure code, providing plugging in/out and debugging functionality

Inherit to develop pluggable objects. No code change on the owner class required (the object where we plug into)

For every instance of PlugIn class the 'owner' is the class in what the plug was plugged.

Instance Methods [hide private]
 
__init__(self) source code
 
PlugIn(self, owner)
Attach to owner and register ourself and our _exported_methods in it. If defined by a subclass, call self.plugin(owner) to execute hook code after plugging
source code
 
PlugOut(self)
Unregister our _exported_methods from owner and detach from it. If defined by a subclass, call self.plugout() after unplugging to execute hook code
source code
Class Methods [hide private]
 
get_instance(cls, *args, **kwargs)
Factory Method for object creation
Method Details [hide private]

__init__(self)
(Constructor)

source code 

PlugIn(self, owner)

source code 
Attach to owner and register ourself and our _exported_methods in it. If defined by a subclass, call self.plugin(owner) to execute hook code after plugging

PlugOut(self)

source code 
Unregister our _exported_methods from owner and detach from it. If defined by a subclass, call self.plugout() after unplugging to execute hook code

get_instance(cls, *args, **kwargs)
Class Method

 

Factory Method for object creation

Use this instead of directly initializing the class in order to make unit testing easier. For testing, this method can be patched to inject mock objects.


python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol-module.html000066400000000000000000006742151343257752000254560ustar00rootroot00000000000000 nbxmpp.protocol
Package nbxmpp :: Module protocol
[hide private]
[frames] | no frames]

Module protocol

source code

Protocol module contains tools that are needed for processing of xmpp-related data structures, including jabber-objects like JID or different stanzas and sub- stanzas) handling routines
Classes [hide private]
  NodeProcessed
Exception that should be raised by handler when the handling should be stopped
  StreamError
Base exception class for stream errors
  BadFormat
  BadNamespacePrefix
  Conflict
  ConnectionTimeout
  HostGone
  HostUnknown
  ImproperAddressing
  InternalServerError
  InvalidFrom
  InvalidID
  InvalidNamespace
  InvalidXML
  NotAuthorized
  PolicyViolation
  RemoteConnectionFailed
  ResourceConstraint
  RestrictedXML
  SeeOtherHost
  SystemShutdown
  UndefinedCondition
  UnsupportedEncoding
  UnsupportedStanzaType
  UnsupportedVersion
  XMLNotWellFormed
  JID
JID can be built from string, modified, compared, serialised into string
  BOSHBody
<body> tag that wraps usual XMPP stanzas in XMPP over BOSH
  Protocol
A "stanza" object class. Contains methods that are common for presences, iqs and messages
  Message
XMPP Message stanza - "push" mechanism
  Presence
  Iq
XMPP Iq object - get/set dialog mechanism
  Hashes
Hash elements for various XEPs as defined in XEP-300
  Acks
Acknowledgement elements for Stream Management
  ErrorNode
XMPP-style error element
  Error
Used to quickly transform received stanza into error reply
  DataField
This class is used in the DataForm class to describe the single data item
  DataForm
Used for manipulating dataforms in XMPP
Functions [hide private]
 
ascii_upper(s) source code
 
isResultNode(node)
Return true if the node is a positive reply
source code
 
isErrorNode(node)
Return true if the node is a negative reply
source code
Variables [hide private]
  NS_ACTIVITY = 'http://jabber.org/protocol/activity'
  NS_ADDRESS = 'http://jabber.org/protocol/address'
  NS_AGENTS = 'jabber:iq:agents'
  NS_AMP = 'http://jabber.org/protocol/amp'
  NS_AMP_ERRORS = 'http://jabber.org/protocol/amp#errors'
  NS_ARCHIVE = 'urn:xmpp:archive'
  NS_ARCHIVE_AUTO = 'urn:xmpp:archive:auto'
  NS_ARCHIVE_MANAGE = 'urn:xmpp:archive:manage'
  NS_ARCHIVE_MANUAL = 'urn:xmpp:archive:manual'
  NS_ARCHIVE_PREF = 'urn:xmpp:archive:pref'
  NS_ATOM = 'http://www.w3.org/2005/Atom'
  NS_ATTENTION = 'urn:xmpp:attention:0'
  NS_AUTH = 'jabber:iq:auth'
  NS_AVATAR = 'http://www.xmpp.org/extensions/xep-0084.html#ns-m...
  NS_BIND = 'urn:ietf:params:xml:ns:xmpp-bind'
  NS_BLOCKING = 'urn:xmpp:blocking'
  NS_BOB = 'urn:xmpp:bob'
  NS_BOOKMARKS = 'storage:bookmarks'
  NS_BROWSE = 'jabber:iq:browse'
  NS_BROWSING = 'http://jabber.org/protocol/browsing'
  NS_BYTESTREAM = 'http://jabber.org/protocol/bytestreams'
  NS_CAPS = 'http://jabber.org/protocol/caps'
  NS_CAPTCHA = 'urn:xmpp:captcha'
  NS_CARBONS = 'urn:xmpp:carbons:2'
  NS_CHATSTATES = 'http://jabber.org/protocol/chatstates'
  NS_CHATTING = 'http://jabber.org/protocol/chatting'
  NS_CLIENT = 'jabber:client'
  NS_CONDITIONS = 'urn:xmpp:muc:conditions:0'
  NS_COMMANDS = 'http://jabber.org/protocol/commands'
  NS_COMPONENT_ACCEPT = 'jabber:component:accept'
  NS_COMPONENT_1 = 'http://jabberd.jabberstudio.org/ns/component...
  NS_COMPRESS = 'http://jabber.org/protocol/compress'
  NS_CONFERENCE = 'jabber:x:conference'
  NS_CORRECT = 'urn:xmpp:message-correct:0'
  NS_DATA = 'jabber:x:data'
  NS_DATA_MEDIA = 'urn:xmpp:media-element'
  NS_DELAY = 'jabber:x:delay'
  NS_DELAY2 = 'urn:xmpp:delay'
  NS_DIALBACK = 'jabber:server:dialback'
  NS_DISCO = 'http://jabber.org/protocol/disco'
  NS_DISCO_INFO = 'http://jabber.org/protocol/disco#info'
  NS_DISCO_ITEMS = 'http://jabber.org/protocol/disco#items'
  NS_ENCRYPTED = 'jabber:x:encrypted'
  NS_ESESSION = 'http://www.xmpp.org/extensions/xep-0116.html#ns'
  NS_ESESSION_INIT = 'http://www.xmpp.org/extensions/xep-0116.ht...
  NS_EVENT = 'jabber:x:event'
  NS_FEATURE = 'http://jabber.org/protocol/feature-neg'
  NS_FILE = 'http://jabber.org/protocol/si/profile/file-transfer'
  NS_FORWARD = 'urn:xmpp:forward:0'
  NS_GAMING = 'http://jabber.org/protocol/gaming'
  NS_GATEWAY = 'jabber:iq:gateway'
  NS_GEOLOC = 'http://jabber.org/protocol/geoloc'
  NS_GROUPCHAT = 'gc-1.0'
  NS_HTTP_AUTH = 'http://jabber.org/protocol/http-auth'
  NS_HTTP_BIND = 'http://jabber.org/protocol/httpbind'
  NS_IBB = 'http://jabber.org/protocol/ibb'
  NS_INVISIBLE = 'presence-invisible'
  NS_IQ = 'iq'
  NS_JINGLE = 'urn:xmpp:jingle:1'
  NS_JINGLE_ERRORS = 'urn:xmpp:jingle:errors:1'
  NS_JINGLE_RTP = 'urn:xmpp:jingle:apps:rtp:1'
  NS_JINGLE_RTP_AUDIO = 'urn:xmpp:jingle:apps:rtp:audio'
  NS_JINGLE_RTP_VIDEO = 'urn:xmpp:jingle:apps:rtp:video'
  NS_JINGLE_FILE_TRANSFER = 'urn:xmpp:jingle:apps:file-transfer:3'
  NS_JINGLE_XTLS = 'urn:xmpp:jingle:security:xtls:0'
  NS_JINGLE_RAW_UDP = 'urn:xmpp:jingle:transports:raw-udp:1'
  NS_JINGLE_ICE_UDP = 'urn:xmpp:jingle:transports:ice-udp:1'
  NS_JINGLE_BYTESTREAM = 'urn:xmpp:jingle:transports:s5b:1'
  NS_JINGLE_IBB = 'urn:xmpp:jingle:transports:ibb:1'
  NS_LAST = 'jabber:iq:last'
  NS_LOCATION = 'http://jabber.org/protocol/geoloc'
  NS_MAM = 'urn:xmpp:mam:tmp'
  NS_MESSAGE = 'message'
  NS_MOOD = 'http://jabber.org/protocol/mood'
  NS_MUC = 'http://jabber.org/protocol/muc'
  NS_MUC_USER = 'http://jabber.org/protocol/muc#user'
  NS_MUC_ADMIN = 'http://jabber.org/protocol/muc#admin'
  NS_MUC_OWNER = 'http://jabber.org/protocol/muc#owner'
  NS_MUC_UNIQUE = 'http://jabber.org/protocol/muc#unique'
  NS_MUC_CONFIG = 'http://jabber.org/protocol/muc#roomconfig'
  NS_NICK = 'http://jabber.org/protocol/nick'
  NS_OFFLINE = 'http://www.jabber.org/jeps/jep-0030.html'
  NS_PHYSLOC = 'http://jabber.org/protocol/physloc'
  NS_PING = 'urn:xmpp:ping'
  NS_PRESENCE = 'presence'
  NS_PRIVACY = 'jabber:iq:privacy'
  NS_PRIVATE = 'jabber:iq:private'
  NS_PROFILE = 'http://jabber.org/protocol/profile'
  NS_PUBSUB = 'http://jabber.org/protocol/pubsub'
  NS_PUBSUB_EVENT = 'http://jabber.org/protocol/pubsub#event'
  NS_PUBSUB_PUBLISH_OPTIONS = 'http://jabber.org/protocol/pubsub...
  NS_PUBSUB_OWNER = 'http://jabber.org/protocol/pubsub#owner'
  NS_REGISTER = 'jabber:iq:register'
  NS_ROSTER = 'jabber:iq:roster'
  NS_ROSTERNOTES = 'storage:rosternotes'
  NS_ROSTERX = 'http://jabber.org/protocol/rosterx'
  NS_ROSTER_VER = 'urn:xmpp:features:rosterver'
  NS_RPC = 'jabber:iq:rpc'
  NS_RSM = 'http://jabber.org/protocol/rsm'
  NS_SASL = 'urn:ietf:params:xml:ns:xmpp-sasl'
  NS_SECLABEL = 'urn:xmpp:sec-label:0'
  NS_SECLABEL_CATALOG = 'urn:xmpp:sec-label:catalog:2'
  NS_SEARCH = 'jabber:iq:search'
  NS_SERVER = 'jabber:server'
  NS_SESSION = 'urn:ietf:params:xml:ns:xmpp-session'
  NS_SI = 'http://jabber.org/protocol/si'
  NS_SI_PUB = 'http://jabber.org/protocol/sipub'
  NS_SIGNED = 'jabber:x:signed'
  NS_SSN = 'urn:xmpp:ssn'
  NS_STANZA_CRYPTO = 'http://www.xmpp.org/extensions/xep-0200.ht...
  NS_STANZAS = 'urn:ietf:params:xml:ns:xmpp-stanzas'
  NS_STREAM = 'http://affinix.com/jabber/stream'
  NS_STREAMS = 'http://etherx.jabber.org/streams'
  NS_TIME = 'jabber:iq:time'
  NS_TIME_REVISED = 'urn:xmpp:time'
  NS_TLS = 'urn:ietf:params:xml:ns:xmpp-tls'
  NS_TUNE = 'http://jabber.org/protocol/tune'
  NS_VACATION = 'http://jabber.org/protocol/vacation'
  NS_VCARD = 'vcard-temp'
  NS_GMAILNOTIFY = 'google:mail:notify'
  NS_GTALKSETTING = 'google:setting'
  NS_VCARD_UPDATE = 'vcard-temp:x:update'
  NS_VERSION = 'jabber:iq:version'
  NS_VIEWING = 'http://jabber.org/protocol/viewing'
  NS_WAITINGLIST = 'http://jabber.org/protocol/waitinglist'
  NS_XHTML_IM = 'http://jabber.org/protocol/xhtml-im'
  NS_XHTML = 'http://www.w3.org/1999/xhtml'
  NS_X_OOB = 'jabber:x:oob'
  NS_DATA_LAYOUT = 'http://jabber.org/protocol/xdata-layout'
  NS_DATA_VALIDATE = 'http://jabber.org/protocol/xdata-validate'
  NS_XMPP_STREAMS = 'urn:ietf:params:xml:ns:xmpp-streams'
  NS_RECEIPTS = 'urn:xmpp:receipts'
  NS_PUBKEY_PUBKEY = 'urn:xmpp:pubkey:2'
  NS_PUBKEY_REVOKE = 'urn:xmpp:revoke:2'
  NS_PUBKEY_ATTEST = 'urn:xmpp:attest:2'
  NS_STREAM_MGMT = 'urn:xmpp:sm:2'
  NS_HASHES = 'urn:xmpp:hashes:1'
  NS_HASHES_MD5 = 'urn:xmpp:hash-function-textual-names:md5'
  NS_HASHES_SHA1 = 'urn:xmpp:hash-function-textual-names:sha-1'
  NS_HASHES_SHA256 = 'urn:xmpp:hash-function-textual-names:sha-256'
  NS_HASHES_SHA512 = 'urn:xmpp:hash-function-textual-names:sha-512'
  ERRORS = {'urn:ietf:params:xml:ns:xmpp-sasl aborted': ['', '',...
  _errorcodes = {'302': 'redirect', '400': 'unexpected-request',...
  STREAM_NOT_AUTHORIZED = 'urn:ietf:params:xml:ns:xmpp-streams n...
  STREAM_REMOTE_CONNECTION_FAILED = 'urn:ietf:params:xml:ns:xmpp...
  SASL_MECHANISM_TOO_WEAK = 'urn:ietf:params:xml:ns:xmpp-sasl me...
  STREAM_XML_NOT_WELL_FORMED = 'urn:ietf:params:xml:ns:xmpp-stre...
  ERR_JID_MALFORMED = 'urn:ietf:params:xml:ns:xmpp-stanzas jid-m...
  STREAM_SEE_OTHER_HOST = 'urn:ietf:params:xml:ns:xmpp-streams s...
  STREAM_BAD_NAMESPACE_PREFIX = 'urn:ietf:params:xml:ns:xmpp-str...
  ERR_SERVICE_UNAVAILABLE = 'urn:ietf:params:xml:ns:xmpp-stanzas...
  STREAM_CONNECTION_TIMEOUT = 'urn:ietf:params:xml:ns:xmpp-strea...
  STREAM_UNSUPPORTED_VERSION = 'urn:ietf:params:xml:ns:xmpp-stre...
  STREAM_IMPROPER_ADDRESSING = 'urn:ietf:params:xml:ns:xmpp-stre...
  STREAM_UNDEFINED_CONDITION = 'urn:ietf:params:xml:ns:xmpp-stre...
  SASL_NOT_AUTHORIZED = 'urn:ietf:params:xml:ns:xmpp-sasl not-au...
  ERR_GONE = 'urn:ietf:params:xml:ns:xmpp-stanzas gone'
  SASL_TEMPORARY_AUTH_FAILURE = 'urn:ietf:params:xml:ns:xmpp-sas...
  ERR_REMOTE_SERVER_NOT_FOUND = 'urn:ietf:params:xml:ns:xmpp-sta...
  ERR_UNEXPECTED_REQUEST = 'urn:ietf:params:xml:ns:xmpp-stanzas ...
  ERR_RECIPIENT_UNAVAILABLE = 'urn:ietf:params:xml:ns:xmpp-stanz...
  ERR_CONFLICT = 'urn:ietf:params:xml:ns:xmpp-stanzas conflict'
  STREAM_SYSTEM_SHUTDOWN = 'urn:ietf:params:xml:ns:xmpp-streams ...
  STREAM_BAD_FORMAT = 'urn:ietf:params:xml:ns:xmpp-streams bad-f...
  ERR_SUBSCRIPTION_REQUIRED = 'urn:ietf:params:xml:ns:xmpp-stanz...
  STREAM_INTERNAL_SERVER_ERROR = 'urn:ietf:params:xml:ns:xmpp-st...
  ERR_NOT_AUTHORIZED = 'urn:ietf:params:xml:ns:xmpp-stanzas not-...
  SASL_ABORTED = 'urn:ietf:params:xml:ns:xmpp-sasl aborted'
  ERR_REGISTRATION_REQUIRED = 'urn:ietf:params:xml:ns:xmpp-stanz...
  ERR_INTERNAL_SERVER_ERROR = 'urn:ietf:params:xml:ns:xmpp-stanz...
  SASL_INCORRECT_ENCODING = 'urn:ietf:params:xml:ns:xmpp-sasl in...
  STREAM_HOST_GONE = 'urn:ietf:params:xml:ns:xmpp-streams host-g...
  STREAM_POLICY_VIOLATION = 'urn:ietf:params:xml:ns:xmpp-streams...
  STREAM_INVALID_XML = 'urn:ietf:params:xml:ns:xmpp-streams inva...
  STREAM_CONFLICT = 'urn:ietf:params:xml:ns:xmpp-streams conflict'
  STREAM_RESOURCE_CONSTRAINT = 'urn:ietf:params:xml:ns:xmpp-stre...
  STREAM_UNSUPPORTED_ENCODING = 'urn:ietf:params:xml:ns:xmpp-str...
  ERR_NOT_ALLOWED = 'urn:ietf:params:xml:ns:xmpp-stanzas not-all...
  ERR_ITEM_NOT_FOUND = 'urn:ietf:params:xml:ns:xmpp-stanzas item...
  ERR_NOT_ACCEPTABLE = 'urn:ietf:params:xml:ns:xmpp-stanzas not-...
  STREAM_INVALID_FROM = 'urn:ietf:params:xml:ns:xmpp-streams inv...
  ERR_FEATURE_NOT_IMPLEMENTED = 'urn:ietf:params:xml:ns:xmpp-sta...
  ERR_BAD_REQUEST = 'urn:ietf:params:xml:ns:xmpp-stanzas bad-req...
  STREAM_INVALID_ID = 'urn:ietf:params:xml:ns:xmpp-streams inval...
  STREAM_HOST_UNKNOWN = 'urn:ietf:params:xml:ns:xmpp-streams hos...
  ERR_UNDEFINED_CONDITION = 'urn:ietf:params:xml:ns:xmpp-stanzas...
  SASL_INVALID_MECHANISM = 'urn:ietf:params:xml:ns:xmpp-sasl inv...
  STREAM_RESTRICTED_XML = 'urn:ietf:params:xml:ns:xmpp-streams r...
  ERR_RESOURCE_CONSTRAINT = 'urn:ietf:params:xml:ns:xmpp-stanzas...
  ERR_REMOTE_SERVER_TIMEOUT = 'urn:ietf:params:xml:ns:xmpp-stanz...
  SASL_INVALID_AUTHZID = 'urn:ietf:params:xml:ns:xmpp-sasl inval...
  ERR_PAYMENT_REQUIRED = 'urn:ietf:params:xml:ns:xmpp-stanzas pa...
  STREAM_INVALID_NAMESPACE = 'urn:ietf:params:xml:ns:xmpp-stream...
  ERR_REDIRECT = 'urn:ietf:params:xml:ns:xmpp-stanzas redirect'
  STREAM_UNSUPPORTED_STANZA_TYPE = 'urn:ietf:params:xml:ns:xmpp-...
  ERR_FORBIDDEN = 'urn:ietf:params:xml:ns:xmpp-stanzas forbidden'
  stream_exceptions = {'bad-format': <class 'nbxmpp.protocol.Bad...
  __package__ = 'nbxmpp'

Imports: Node, NodeBuilder, time, string, hashlib


Function Details [hide private]

ascii_upper(s)

source code 

isResultNode(node)

source code 
Return true if the node is a positive reply

isErrorNode(node)

source code 
Return true if the node is a negative reply

Variables Details [hide private]

NS_ACTIVITY

Value:
'http://jabber.org/protocol/activity'

NS_ADDRESS

Value:
'http://jabber.org/protocol/address'

NS_AGENTS

Value:
'jabber:iq:agents'

NS_AMP

Value:
'http://jabber.org/protocol/amp'

NS_AMP_ERRORS

Value:
'http://jabber.org/protocol/amp#errors'

NS_ARCHIVE

Value:
'urn:xmpp:archive'

NS_ARCHIVE_AUTO

Value:
'urn:xmpp:archive:auto'

NS_ARCHIVE_MANAGE

Value:
'urn:xmpp:archive:manage'

NS_ARCHIVE_MANUAL

Value:
'urn:xmpp:archive:manual'

NS_ARCHIVE_PREF

Value:
'urn:xmpp:archive:pref'

NS_ATOM

Value:
'http://www.w3.org/2005/Atom'

NS_ATTENTION

Value:
'urn:xmpp:attention:0'

NS_AUTH

Value:
'jabber:iq:auth'

NS_AVATAR

Value:
'http://www.xmpp.org/extensions/xep-0084.html#ns-metadata'

NS_BIND

Value:
'urn:ietf:params:xml:ns:xmpp-bind'

NS_BLOCKING

Value:
'urn:xmpp:blocking'

NS_BOB

Value:
'urn:xmpp:bob'

NS_BOOKMARKS

Value:
'storage:bookmarks'

NS_BROWSE

Value:
'jabber:iq:browse'

NS_BROWSING

Value:
'http://jabber.org/protocol/browsing'

NS_BYTESTREAM

Value:
'http://jabber.org/protocol/bytestreams'

NS_CAPS

Value:
'http://jabber.org/protocol/caps'

NS_CAPTCHA

Value:
'urn:xmpp:captcha'

NS_CARBONS

Value:
'urn:xmpp:carbons:2'

NS_CHATSTATES

Value:
'http://jabber.org/protocol/chatstates'

NS_CHATTING

Value:
'http://jabber.org/protocol/chatting'

NS_CLIENT

Value:
'jabber:client'

NS_CONDITIONS

Value:
'urn:xmpp:muc:conditions:0'

NS_COMMANDS

Value:
'http://jabber.org/protocol/commands'

NS_COMPONENT_ACCEPT

Value:
'jabber:component:accept'

NS_COMPONENT_1

Value:
'http://jabberd.jabberstudio.org/ns/component/1.0'

NS_COMPRESS

Value:
'http://jabber.org/protocol/compress'

NS_CONFERENCE

Value:
'jabber:x:conference'

NS_CORRECT

Value:
'urn:xmpp:message-correct:0'

NS_DATA

Value:
'jabber:x:data'

NS_DATA_MEDIA

Value:
'urn:xmpp:media-element'

NS_DELAY

Value:
'jabber:x:delay'

NS_DELAY2

Value:
'urn:xmpp:delay'

NS_DIALBACK

Value:
'jabber:server:dialback'

NS_DISCO

Value:
'http://jabber.org/protocol/disco'

NS_DISCO_INFO

Value:
'http://jabber.org/protocol/disco#info'

NS_DISCO_ITEMS

Value:
'http://jabber.org/protocol/disco#items'

NS_ENCRYPTED

Value:
'jabber:x:encrypted'

NS_ESESSION

Value:
'http://www.xmpp.org/extensions/xep-0116.html#ns'

NS_ESESSION_INIT

Value:
'http://www.xmpp.org/extensions/xep-0116.html#ns-init'

NS_EVENT

Value:
'jabber:x:event'

NS_FEATURE

Value:
'http://jabber.org/protocol/feature-neg'

NS_FILE

Value:
'http://jabber.org/protocol/si/profile/file-transfer'

NS_FORWARD

Value:
'urn:xmpp:forward:0'

NS_GAMING

Value:
'http://jabber.org/protocol/gaming'

NS_GATEWAY

Value:
'jabber:iq:gateway'

NS_GEOLOC

Value:
'http://jabber.org/protocol/geoloc'

NS_GROUPCHAT

Value:
'gc-1.0'

NS_HTTP_AUTH

Value:
'http://jabber.org/protocol/http-auth'

NS_HTTP_BIND

Value:
'http://jabber.org/protocol/httpbind'

NS_IBB

Value:
'http://jabber.org/protocol/ibb'

NS_INVISIBLE

Value:
'presence-invisible'

NS_IQ

Value:
'iq'

NS_JINGLE

Value:
'urn:xmpp:jingle:1'

NS_JINGLE_ERRORS

Value:
'urn:xmpp:jingle:errors:1'

NS_JINGLE_RTP

Value:
'urn:xmpp:jingle:apps:rtp:1'

NS_JINGLE_RTP_AUDIO

Value:
'urn:xmpp:jingle:apps:rtp:audio'

NS_JINGLE_RTP_VIDEO

Value:
'urn:xmpp:jingle:apps:rtp:video'

NS_JINGLE_FILE_TRANSFER

Value:
'urn:xmpp:jingle:apps:file-transfer:3'

NS_JINGLE_XTLS

Value:
'urn:xmpp:jingle:security:xtls:0'

NS_JINGLE_RAW_UDP

Value:
'urn:xmpp:jingle:transports:raw-udp:1'

NS_JINGLE_ICE_UDP

Value:
'urn:xmpp:jingle:transports:ice-udp:1'

NS_JINGLE_BYTESTREAM

Value:
'urn:xmpp:jingle:transports:s5b:1'

NS_JINGLE_IBB

Value:
'urn:xmpp:jingle:transports:ibb:1'

NS_LAST

Value:
'jabber:iq:last'

NS_LOCATION

Value:
'http://jabber.org/protocol/geoloc'

NS_MAM

Value:
'urn:xmpp:mam:tmp'

NS_MESSAGE

Value:
'message'

NS_MOOD

Value:
'http://jabber.org/protocol/mood'

NS_MUC

Value:
'http://jabber.org/protocol/muc'

NS_MUC_USER

Value:
'http://jabber.org/protocol/muc#user'

NS_MUC_ADMIN

Value:
'http://jabber.org/protocol/muc#admin'

NS_MUC_OWNER

Value:
'http://jabber.org/protocol/muc#owner'

NS_MUC_UNIQUE

Value:
'http://jabber.org/protocol/muc#unique'

NS_MUC_CONFIG

Value:
'http://jabber.org/protocol/muc#roomconfig'

NS_NICK

Value:
'http://jabber.org/protocol/nick'

NS_OFFLINE

Value:
'http://www.jabber.org/jeps/jep-0030.html'

NS_PHYSLOC

Value:
'http://jabber.org/protocol/physloc'

NS_PING

Value:
'urn:xmpp:ping'

NS_PRESENCE

Value:
'presence'

NS_PRIVACY

Value:
'jabber:iq:privacy'

NS_PRIVATE

Value:
'jabber:iq:private'

NS_PROFILE

Value:
'http://jabber.org/protocol/profile'

NS_PUBSUB

Value:
'http://jabber.org/protocol/pubsub'

NS_PUBSUB_EVENT

Value:
'http://jabber.org/protocol/pubsub#event'

NS_PUBSUB_PUBLISH_OPTIONS

Value:
'http://jabber.org/protocol/pubsub#publish-options'

NS_PUBSUB_OWNER

Value:
'http://jabber.org/protocol/pubsub#owner'

NS_REGISTER

Value:
'jabber:iq:register'

NS_ROSTER

Value:
'jabber:iq:roster'

NS_ROSTERNOTES

Value:
'storage:rosternotes'

NS_ROSTERX

Value:
'http://jabber.org/protocol/rosterx'

NS_ROSTER_VER

Value:
'urn:xmpp:features:rosterver'

NS_RPC

Value:
'jabber:iq:rpc'

NS_RSM

Value:
'http://jabber.org/protocol/rsm'

NS_SASL

Value:
'urn:ietf:params:xml:ns:xmpp-sasl'

NS_SECLABEL

Value:
'urn:xmpp:sec-label:0'

NS_SECLABEL_CATALOG

Value:
'urn:xmpp:sec-label:catalog:2'

NS_SEARCH

Value:
'jabber:iq:search'

NS_SERVER

Value:
'jabber:server'

NS_SESSION

Value:
'urn:ietf:params:xml:ns:xmpp-session'

NS_SI

Value:
'http://jabber.org/protocol/si'

NS_SI_PUB

Value:
'http://jabber.org/protocol/sipub'

NS_SIGNED

Value:
'jabber:x:signed'

NS_SSN

Value:
'urn:xmpp:ssn'

NS_STANZA_CRYPTO

Value:
'http://www.xmpp.org/extensions/xep-0200.html#ns'

NS_STANZAS

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas'

NS_STREAM

Value:
'http://affinix.com/jabber/stream'

NS_STREAMS

Value:
'http://etherx.jabber.org/streams'

NS_TIME

Value:
'jabber:iq:time'

NS_TIME_REVISED

Value:
'urn:xmpp:time'

NS_TLS

Value:
'urn:ietf:params:xml:ns:xmpp-tls'

NS_TUNE

Value:
'http://jabber.org/protocol/tune'

NS_VACATION

Value:
'http://jabber.org/protocol/vacation'

NS_VCARD

Value:
'vcard-temp'

NS_GMAILNOTIFY

Value:
'google:mail:notify'

NS_GTALKSETTING

Value:
'google:setting'

NS_VCARD_UPDATE

Value:
'vcard-temp:x:update'

NS_VERSION

Value:
'jabber:iq:version'

NS_VIEWING

Value:
'http://jabber.org/protocol/viewing'

NS_WAITINGLIST

Value:
'http://jabber.org/protocol/waitinglist'

NS_XHTML_IM

Value:
'http://jabber.org/protocol/xhtml-im'

NS_XHTML

Value:
'http://www.w3.org/1999/xhtml'

NS_X_OOB

Value:
'jabber:x:oob'

NS_DATA_LAYOUT

Value:
'http://jabber.org/protocol/xdata-layout'

NS_DATA_VALIDATE

Value:
'http://jabber.org/protocol/xdata-validate'

NS_XMPP_STREAMS

Value:
'urn:ietf:params:xml:ns:xmpp-streams'

NS_RECEIPTS

Value:
'urn:xmpp:receipts'

NS_PUBKEY_PUBKEY

Value:
'urn:xmpp:pubkey:2'

NS_PUBKEY_REVOKE

Value:
'urn:xmpp:revoke:2'

NS_PUBKEY_ATTEST

Value:
'urn:xmpp:attest:2'

NS_STREAM_MGMT

Value:
'urn:xmpp:sm:2'

NS_HASHES

Value:
'urn:xmpp:hashes:1'

NS_HASHES_MD5

Value:
'urn:xmpp:hash-function-textual-names:md5'

NS_HASHES_SHA1

Value:
'urn:xmpp:hash-function-textual-names:sha-1'

NS_HASHES_SHA256

Value:
'urn:xmpp:hash-function-textual-names:sha-256'

NS_HASHES_SHA512

Value:
'urn:xmpp:hash-function-textual-names:sha-512'

ERRORS

Value:
{'urn:ietf:params:xml:ns:xmpp-sasl aborted': ['',
                                              '',
                                              'The receiving entity ac\
knowledges an <abort/> element sent by the initiating entity; sent in \
reply to the <abort/> element.'],
 'urn:ietf:params:xml:ns:xmpp-sasl incorrect-encoding': ['',
                                                         '',
                                                         'The data pro\
...

_errorcodes

Value:
{'302': 'redirect',
 '400': 'unexpected-request',
 '401': 'not-authorized',
 '402': 'payment-required',
 '403': 'forbidden',
 '404': 'remote-server-not-found',
 '405': 'not-allowed',
 '406': 'not-acceptable',
...

STREAM_NOT_AUTHORIZED

Value:
'urn:ietf:params:xml:ns:xmpp-streams not-authorized'

STREAM_REMOTE_CONNECTION_FAILED

Value:
'urn:ietf:params:xml:ns:xmpp-streams remote-connection-failed'

SASL_MECHANISM_TOO_WEAK

Value:
'urn:ietf:params:xml:ns:xmpp-sasl mechanism-too-weak'

STREAM_XML_NOT_WELL_FORMED

Value:
'urn:ietf:params:xml:ns:xmpp-streams xml-not-well-formed'

ERR_JID_MALFORMED

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas jid-malformed'

STREAM_SEE_OTHER_HOST

Value:
'urn:ietf:params:xml:ns:xmpp-streams see-other-host'

STREAM_BAD_NAMESPACE_PREFIX

Value:
'urn:ietf:params:xml:ns:xmpp-streams bad-namespace-prefix'

ERR_SERVICE_UNAVAILABLE

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas service-unavailable'

STREAM_CONNECTION_TIMEOUT

Value:
'urn:ietf:params:xml:ns:xmpp-streams connection-timeout'

STREAM_UNSUPPORTED_VERSION

Value:
'urn:ietf:params:xml:ns:xmpp-streams unsupported-version'

STREAM_IMPROPER_ADDRESSING

Value:
'urn:ietf:params:xml:ns:xmpp-streams improper-addressing'

STREAM_UNDEFINED_CONDITION

Value:
'urn:ietf:params:xml:ns:xmpp-streams undefined-condition'

SASL_NOT_AUTHORIZED

Value:
'urn:ietf:params:xml:ns:xmpp-sasl not-authorized'

ERR_GONE

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas gone'

SASL_TEMPORARY_AUTH_FAILURE

Value:
'urn:ietf:params:xml:ns:xmpp-sasl temporary-auth-failure'

ERR_REMOTE_SERVER_NOT_FOUND

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-not-found'

ERR_UNEXPECTED_REQUEST

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas unexpected-request'

ERR_RECIPIENT_UNAVAILABLE

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas recipient-unavailable'

ERR_CONFLICT

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas conflict'

STREAM_SYSTEM_SHUTDOWN

Value:
'urn:ietf:params:xml:ns:xmpp-streams system-shutdown'

STREAM_BAD_FORMAT

Value:
'urn:ietf:params:xml:ns:xmpp-streams bad-format'

ERR_SUBSCRIPTION_REQUIRED

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas subscription-required'

STREAM_INTERNAL_SERVER_ERROR

Value:
'urn:ietf:params:xml:ns:xmpp-streams internal-server-error'

ERR_NOT_AUTHORIZED

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas not-authorized'

SASL_ABORTED

Value:
'urn:ietf:params:xml:ns:xmpp-sasl aborted'

ERR_REGISTRATION_REQUIRED

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas registration-required'

ERR_INTERNAL_SERVER_ERROR

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas internal-server-error'

SASL_INCORRECT_ENCODING

Value:
'urn:ietf:params:xml:ns:xmpp-sasl incorrect-encoding'

STREAM_HOST_GONE

Value:
'urn:ietf:params:xml:ns:xmpp-streams host-gone'

STREAM_POLICY_VIOLATION

Value:
'urn:ietf:params:xml:ns:xmpp-streams policy-violation'

STREAM_INVALID_XML

Value:
'urn:ietf:params:xml:ns:xmpp-streams invalid-xml'

STREAM_CONFLICT

Value:
'urn:ietf:params:xml:ns:xmpp-streams conflict'

STREAM_RESOURCE_CONSTRAINT

Value:
'urn:ietf:params:xml:ns:xmpp-streams resource-constraint'

STREAM_UNSUPPORTED_ENCODING

Value:
'urn:ietf:params:xml:ns:xmpp-streams unsupported-encoding'

ERR_NOT_ALLOWED

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas not-allowed'

ERR_ITEM_NOT_FOUND

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas item-not-found'

ERR_NOT_ACCEPTABLE

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas not-acceptable'

STREAM_INVALID_FROM

Value:
'urn:ietf:params:xml:ns:xmpp-streams invalid-from'

ERR_FEATURE_NOT_IMPLEMENTED

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas feature-not-implemented'

ERR_BAD_REQUEST

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas bad-request'

STREAM_INVALID_ID

Value:
'urn:ietf:params:xml:ns:xmpp-streams invalid-id'

STREAM_HOST_UNKNOWN

Value:
'urn:ietf:params:xml:ns:xmpp-streams host-unknown'

ERR_UNDEFINED_CONDITION

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas undefined-condition'

SASL_INVALID_MECHANISM

Value:
'urn:ietf:params:xml:ns:xmpp-sasl invalid-mechanism'

STREAM_RESTRICTED_XML

Value:
'urn:ietf:params:xml:ns:xmpp-streams restricted-xml'

ERR_RESOURCE_CONSTRAINT

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas resource-constraint'

ERR_REMOTE_SERVER_TIMEOUT

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-timeout'

SASL_INVALID_AUTHZID

Value:
'urn:ietf:params:xml:ns:xmpp-sasl invalid-authzid'

ERR_PAYMENT_REQUIRED

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas payment-required'

STREAM_INVALID_NAMESPACE

Value:
'urn:ietf:params:xml:ns:xmpp-streams invalid-namespace'

ERR_REDIRECT

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas redirect'

STREAM_UNSUPPORTED_STANZA_TYPE

Value:
'urn:ietf:params:xml:ns:xmpp-streams unsupported-stanza-type'

ERR_FORBIDDEN

Value:
'urn:ietf:params:xml:ns:xmpp-stanzas forbidden'

stream_exceptions

Value:
{'bad-format': <class 'nbxmpp.protocol.BadFormat'>,
 'bad-namespace-prefix': <class 'nbxmpp.protocol.BadNamespacePrefix'>,
 'conflict': <class 'nbxmpp.protocol.Conflict'>,
 'connection-timeout': <class 'nbxmpp.protocol.ConnectionTimeout'>,
 'host-gone': <class 'nbxmpp.protocol.HostGone'>,
 'host-unknown': <class 'nbxmpp.protocol.HostUnknown'>,
 'improper-addressing': <class 'nbxmpp.protocol.ImproperAddressing'>,
 'internal-server-error': <class 'nbxmpp.protocol.InternalServerError'\
...

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol-pysrc.html000066400000000000000000021122511343257752000253160ustar00rootroot00000000000000 nbxmpp.protocol
Package nbxmpp :: Module protocol
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.protocol

   1  ##   protocol.py 
   2  ## 
   3  ##   Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 
   4  ## 
   5  ##   This program is free software; you can redistribute it and/or modify 
   6  ##   it under the terms of the GNU General Public License as published by 
   7  ##   the Free Software Foundation; either version 2, or (at your option) 
   8  ##   any later version. 
   9  ## 
  10  ##   This program is distributed in the hope that it will be useful, 
  11  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
  12  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  13  ##   GNU General Public License for more details. 
  14   
  15  # $Id: protocol.py,v 1.52 2006/01/09 22:08:57 normanr Exp $ 
  16   
  17  """ 
  18  Protocol module contains tools that are needed for processing of xmpp-related 
  19  data structures, including jabber-objects like JID or different stanzas and 
  20  sub- stanzas) handling routines 
  21  """ 
  22   
  23  from simplexml import Node, NodeBuilder 
  24  import time 
  25  import string 
  26  import hashlib 
  27   
28 -def ascii_upper(s):
29 trans_table = string.maketrans(string.ascii_lowercase, 30 string.ascii_uppercase) 31 return s.translate(trans_table)
32 33 NS_ACTIVITY = 'http://jabber.org/protocol/activity' # XEP-0108 34 NS_ADDRESS = 'http://jabber.org/protocol/address' # XEP-0033 35 NS_AGENTS = 'jabber:iq:agents' 36 NS_AMP = 'http://jabber.org/protocol/amp' 37 NS_AMP_ERRORS = NS_AMP + '#errors' 38 NS_ARCHIVE = 'urn:xmpp:archive' # XEP-0136 39 NS_ARCHIVE_AUTO = NS_ARCHIVE + ':auto' # XEP-0136 40 NS_ARCHIVE_MANAGE = NS_ARCHIVE + ':manage' # XEP-0136 41 NS_ARCHIVE_MANUAL = NS_ARCHIVE + ':manual' # XEP-0136 42 NS_ARCHIVE_PREF = NS_ARCHIVE + ':pref' 43 NS_ATOM = 'http://www.w3.org/2005/Atom' 44 NS_ATTENTION = 'urn:xmpp:attention:0' # XEP-0224 45 NS_AUTH = 'jabber:iq:auth' 46 NS_AVATAR = 'http://www.xmpp.org/extensions/xep-0084.html#ns-metadata' 47 NS_BIND = 'urn:ietf:params:xml:ns:xmpp-bind' 48 NS_BLOCKING = 'urn:xmpp:blocking' # XEP-0191 49 NS_BOB = 'urn:xmpp:bob' # XEP-0231 50 NS_BOOKMARKS = 'storage:bookmarks' # XEP-0048 51 NS_BROWSE = 'jabber:iq:browse' 52 NS_BROWSING = 'http://jabber.org/protocol/browsing' # XEP-0195 53 NS_BYTESTREAM = 'http://jabber.org/protocol/bytestreams' # XEP-0065 54 NS_CAPS = 'http://jabber.org/protocol/caps' # XEP-0115 55 NS_CAPTCHA = 'urn:xmpp:captcha' # XEP-0158 56 NS_CARBONS = 'urn:xmpp:carbons:2' # XEP-0280 57 NS_CHATSTATES = 'http://jabber.org/protocol/chatstates' # XEP-0085 58 NS_CHATTING = 'http://jabber.org/protocol/chatting' # XEP-0194 59 NS_CLIENT = 'jabber:client' 60 NS_CONDITIONS = 'urn:xmpp:muc:conditions:0' # XEP-0306 61 NS_COMMANDS = 'http://jabber.org/protocol/commands' 62 NS_COMPONENT_ACCEPT = 'jabber:component:accept' 63 NS_COMPONENT_1 = 'http://jabberd.jabberstudio.org/ns/component/1.0' 64 NS_COMPRESS = 'http://jabber.org/protocol/compress' # XEP-0138 65 NS_CONFERENCE = 'jabber:x:conference' 66 NS_CORRECT = 'urn:xmpp:message-correct:0' # XEP-0308 67 NS_DATA = 'jabber:x:data' # XEP-0004 68 NS_DATA_MEDIA = 'urn:xmpp:media-element' # XEP-0221 69 NS_DELAY = 'jabber:x:delay' 70 NS_DELAY2 = 'urn:xmpp:delay' 71 NS_DIALBACK = 'jabber:server:dialback' 72 NS_DISCO = 'http://jabber.org/protocol/disco' 73 NS_DISCO_INFO = NS_DISCO + '#info' 74 NS_DISCO_ITEMS = NS_DISCO + '#items' 75 NS_ENCRYPTED = 'jabber:x:encrypted' # XEP-0027 76 NS_ESESSION = 'http://www.xmpp.org/extensions/xep-0116.html#ns' 77 NS_ESESSION_INIT = 'http://www.xmpp.org/extensions/xep-0116.html#ns-init' # XEP-0116 78 NS_EVENT = 'jabber:x:event' # XEP-0022 79 NS_FEATURE = 'http://jabber.org/protocol/feature-neg' 80 NS_FILE = 'http://jabber.org/protocol/si/profile/file-transfer' # XEP-0096 81 NS_FORWARD = 'urn:xmpp:forward:0' # XEP-0297 82 NS_GAMING = 'http://jabber.org/protocol/gaming' # XEP-0196 83 NS_GATEWAY = 'jabber:iq:gateway' # XEP-0100 84 NS_GEOLOC = 'http://jabber.org/protocol/geoloc' # XEP-0080 85 NS_GROUPCHAT = 'gc-1.0' 86 NS_HTTP_AUTH = 'http://jabber.org/protocol/http-auth' # XEP-0070 87 NS_HTTP_BIND = 'http://jabber.org/protocol/httpbind' # XEP-0124 88 NS_IBB = 'http://jabber.org/protocol/ibb' 89 NS_INVISIBLE = 'presence-invisible' # Jabberd2 90 NS_IQ = 'iq' # Jabberd2 91 NS_JINGLE ='urn:xmpp:jingle:1' # XEP-0166 92 NS_JINGLE_ERRORS = 'urn:xmpp:jingle:errors:1' # XEP-0166 93 NS_JINGLE_RTP = 'urn:xmpp:jingle:apps:rtp:1' # XEP-0167 94 NS_JINGLE_RTP_AUDIO = 'urn:xmpp:jingle:apps:rtp:audio' # XEP-0167 95 NS_JINGLE_RTP_VIDEO = 'urn:xmpp:jingle:apps:rtp:video' # XEP-0167 96 NS_JINGLE_FILE_TRANSFER ='urn:xmpp:jingle:apps:file-transfer:3' # XEP-0234 97 NS_JINGLE_XTLS='urn:xmpp:jingle:security:xtls:0' # XTLS: EXPERIMENTAL security layer of jingle 98 NS_JINGLE_RAW_UDP = 'urn:xmpp:jingle:transports:raw-udp:1' # XEP-0177 99 NS_JINGLE_ICE_UDP = 'urn:xmpp:jingle:transports:ice-udp:1' # XEP-0176 100 NS_JINGLE_BYTESTREAM ='urn:xmpp:jingle:transports:s5b:1' # XEP-0260 101 NS_JINGLE_IBB = 'urn:xmpp:jingle:transports:ibb:1' # XEP-0261 102 NS_LAST = 'jabber:iq:last' 103 NS_LOCATION = 'http://jabber.org/protocol/geoloc' # XEP-0080 104 NS_MAM = 'urn:xmpp:mam:tmp' # XEP-0313 105 NS_MESSAGE = 'message' # Jabberd2 106 NS_MOOD = 'http://jabber.org/protocol/mood' # XEP-0107 107 NS_MUC = 'http://jabber.org/protocol/muc' 108 NS_MUC_USER = NS_MUC + '#user' 109 NS_MUC_ADMIN = NS_MUC + '#admin' 110 NS_MUC_OWNER = NS_MUC + '#owner' 111 NS_MUC_UNIQUE = NS_MUC + '#unique' 112 NS_MUC_CONFIG = NS_MUC + '#roomconfig' 113 NS_NICK = 'http://jabber.org/protocol/nick' # XEP-0172 114 NS_OFFLINE = 'http://www.jabber.org/jeps/jep-0030.html' # XEP-0013 115 NS_PHYSLOC = 'http://jabber.org/protocol/physloc' # XEP-0112 116 NS_PING = 'urn:xmpp:ping' # XEP-0199 117 NS_PRESENCE = 'presence' # Jabberd2 118 NS_PRIVACY = 'jabber:iq:privacy' 119 NS_PRIVATE = 'jabber:iq:private' 120 NS_PROFILE = 'http://jabber.org/protocol/profile' # XEP-0154 121 NS_PUBSUB = 'http://jabber.org/protocol/pubsub' # XEP-0060 122 NS_PUBSUB_EVENT = 'http://jabber.org/protocol/pubsub#event' 123 NS_PUBSUB_PUBLISH_OPTIONS = NS_PUBSUB + '#publish-options' # XEP-0060 124 NS_PUBSUB_OWNER = 'http://jabber.org/protocol/pubsub#owner' # XEP-0060 125 NS_REGISTER = 'jabber:iq:register' 126 NS_ROSTER = 'jabber:iq:roster' 127 NS_ROSTERNOTES = 'storage:rosternotes' 128 NS_ROSTERX = 'http://jabber.org/protocol/rosterx' # XEP-0144 129 NS_ROSTER_VER = 'urn:xmpp:features:rosterver' # XEP-0273 130 NS_RPC = 'jabber:iq:rpc' # XEP-0009 131 NS_RSM = 'http://jabber.org/protocol/rsm' 132 NS_SASL = 'urn:ietf:params:xml:ns:xmpp-sasl' 133 NS_SECLABEL = 'urn:xmpp:sec-label:0' 134 NS_SECLABEL_CATALOG = 'urn:xmpp:sec-label:catalog:2' 135 NS_SEARCH = 'jabber:iq:search' 136 NS_SERVER = 'jabber:server' 137 NS_SESSION = 'urn:ietf:params:xml:ns:xmpp-session' 138 NS_SI = 'http://jabber.org/protocol/si' # XEP-0096 139 NS_SI_PUB = 'http://jabber.org/protocol/sipub' # XEP-0137 140 NS_SIGNED = 'jabber:x:signed' # XEP-0027 141 NS_SSN = 'urn:xmpp:ssn' # XEP-0155 142 NS_STANZA_CRYPTO = 'http://www.xmpp.org/extensions/xep-0200.html#ns' # XEP-0200 143 NS_STANZAS = 'urn:ietf:params:xml:ns:xmpp-stanzas' 144 NS_STREAM = 'http://affinix.com/jabber/stream' 145 NS_STREAMS = 'http://etherx.jabber.org/streams' 146 NS_TIME = 'jabber:iq:time' # XEP-0900 147 NS_TIME_REVISED = 'urn:xmpp:time' # XEP-0202 148 NS_TLS = 'urn:ietf:params:xml:ns:xmpp-tls' 149 NS_TUNE = 'http://jabber.org/protocol/tune' # XEP-0118 150 NS_VACATION = 'http://jabber.org/protocol/vacation' 151 NS_VCARD = 'vcard-temp' 152 NS_GMAILNOTIFY = 'google:mail:notify' 153 NS_GTALKSETTING = 'google:setting' 154 NS_VCARD_UPDATE = NS_VCARD + ':x:update' 155 NS_VERSION = 'jabber:iq:version' 156 NS_VIEWING = 'http://jabber.org/protocol/viewing' # XEP--197 157 NS_WAITINGLIST = 'http://jabber.org/protocol/waitinglist' # XEP-0130 158 NS_XHTML_IM = 'http://jabber.org/protocol/xhtml-im' # XEP-0071 159 NS_XHTML = 'http://www.w3.org/1999/xhtml' # " 160 NS_X_OOB = 'jabber:x:oob' # XEP-0066 161 NS_DATA_LAYOUT = 'http://jabber.org/protocol/xdata-layout' # XEP-0141 162 NS_DATA_VALIDATE = 'http://jabber.org/protocol/xdata-validate' # XEP-0122 163 NS_XMPP_STREAMS = 'urn:ietf:params:xml:ns:xmpp-streams' 164 NS_RECEIPTS = 'urn:xmpp:receipts' 165 NS_PUBKEY_PUBKEY = 'urn:xmpp:pubkey:2' # XEP-0189 166 NS_PUBKEY_REVOKE = 'urn:xmpp:revoke:2' 167 NS_PUBKEY_ATTEST = 'urn:xmpp:attest:2' 168 NS_STREAM_MGMT = 'urn:xmpp:sm:2' # XEP-198 169 NS_HASHES = 'urn:xmpp:hashes:1' # XEP-300 170 NS_HASHES_MD5 = 'urn:xmpp:hash-function-textual-names:md5' 171 NS_HASHES_SHA1 = 'urn:xmpp:hash-function-textual-names:sha-1' 172 NS_HASHES_SHA256 = 'urn:xmpp:hash-function-textual-names:sha-256' 173 NS_HASHES_SHA512 = 'urn:xmpp:hash-function-textual-names:sha-512' 174 175 #xmpp_stream_error_conditions = ''' 176 #bad-format -- -- -- The entity has sent XML that cannot be processed. 177 #bad-namespace-prefix -- -- -- The entity has sent a namespace prefix that is unsupported, or has sent no namespace prefix on an element that requires such a prefix. 178 #conflict -- -- -- The server is closing the active stream for this entity because a new stream has been initiated that conflicts with the existing stream. 179 #connection-timeout -- -- -- The entity has not generated any traffic over the stream for some period of time. 180 #host-gone -- -- -- The value of the 'to' attribute provided by the initiating entity in the stream header corresponds to a hostname that is no longer hosted by the server. 181 #host-unknown -- -- -- The value of the 'to' attribute provided by the initiating entity in the stream header does not correspond to a hostname that is hosted by the server. 182 #improper-addressing -- -- -- A stanza sent between two servers lacks a 'to' or 'from' attribute (or the attribute has no value). 183 #internal-server-error -- -- -- The server has experienced a misconfiguration or an otherwise-undefined internal error that prevents it from servicing the stream. 184 #invalid-from -- cancel -- -- The JID or hostname provided in a 'from' address does not match an authorized JID or validated domain negotiated between servers via SASL or dialback, or between a client and a server via authentication and resource authorization. 185 #invalid-id -- -- -- The stream ID or dialback ID is invalid or does not match an ID previously provided. 186 #invalid-namespace -- -- -- The streams namespace name is something other than "http://etherx.jabber.org/streams" or the dialback namespace name is something other than "jabber:server:dialback". 187 #invalid-xml -- -- -- The entity has sent invalid XML over the stream to a server that performs validation. 188 #not-authorized -- -- -- The entity has attempted to send data before the stream has been authenticated, or otherwise is not authorized to perform an action related to stream negotiation. 189 #policy-violation -- -- -- The entity has violated some local service policy. 190 #remote-connection-failed -- -- -- The server is unable to properly connect to a remote resource that is required for authentication or authorization. 191 #resource-constraint -- -- -- The server lacks the system resources necessary to service the stream. 192 #restricted-xml -- -- -- The entity has attempted to send restricted XML features such as a comment, processing instruction, DTD, entity reference, or unescaped character. 193 #see-other-host -- -- -- The server will not provide service to the initiating entity but is redirecting traffic to another host. 194 #system-shutdown -- -- -- The server is being shut down and all active streams are being closed. 195 #undefined-condition -- -- -- The error condition is not one of those defined by the other conditions in this list. 196 #unsupported-encoding -- -- -- The initiating entity has encoded the stream in an encoding that is not supported by the server. 197 #unsupported-stanza-type -- -- -- The initiating entity has sent a first-level child of the stream that is not supported by the server. 198 #unsupported-version -- -- -- The value of the 'version' attribute provided by the initiating entity in the stream header specifies a version of XMPP that is not supported by the server. 199 #xml-not-well-formed -- -- -- The initiating entity has sent XML that is not well-formed.''' 200 201 #xmpp_stanza_error_conditions = ''' 202 #bad-request -- 400 -- modify -- The sender has sent XML that is malformed or that cannot be processed. 203 #conflict -- 409 -- cancel -- Access cannot be granted because an existing resource or session exists with the same name or address. 204 #feature-not-implemented -- 501 -- cancel -- The feature requested is not implemented by the recipient or server and therefore cannot be processed. 205 #forbidden -- 403 -- auth -- The requesting entity does not possess the required permissions to perform the action. 206 #gone -- 302 -- modify -- The recipient or server can no longer be contacted at this address. 207 #internal-server-error -- 500 -- wait -- The server could not process the stanza because of a misconfiguration or an otherwise-undefined internal server error. 208 #item-not-found -- 404 -- cancel -- The addressed JID or item requested cannot be found. 209 #jid-malformed -- 400 -- modify -- The value of the 'to' attribute in the sender's stanza does not adhere to the syntax defined in Addressing Scheme. 210 #not-acceptable -- 406 -- cancel -- The recipient or server understands the request but is refusing to process it because it does not meet criteria defined by the recipient or server. 211 #not-allowed -- 405 -- cancel -- The recipient or server does not allow any entity to perform the action. 212 #not-authorized -- 401 -- auth -- The sender must provide proper credentials before being allowed to perform the action, or has provided improper credentials. 213 #payment-required -- 402 -- auth -- The requesting entity is not authorized to access the requested service because payment is required. 214 #recipient-unavailable -- 404 -- wait -- The intended recipient is temporarily unavailable. 215 #redirect -- 302 -- modify -- The recipient or server is redirecting requests for this information to another entity. 216 #registration-required -- 407 -- auth -- The requesting entity is not authorized to access the requested service because registration is required. 217 #remote-server-not-found -- 404 -- cancel -- A remote server or service specified as part or all of the JID of the intended recipient does not exist. 218 #remote-server-timeout -- 504 -- wait -- A remote server or service specified as part or all of the JID of the intended recipient could not be contacted within a reasonable amount of time. 219 #resource-constraint -- 500 -- wait -- The server or recipient lacks the system resources necessary to service the request. 220 #service-unavailable -- 503 -- cancel -- The server or recipient does not currently provide the requested service. 221 #subscription-required -- 407 -- auth -- The requesting entity is not authorized to access the requested service because a subscription is required. 222 #undefined-condition -- 500 -- -- Undefined Condition 223 #unexpected-request -- 400 -- wait -- The recipient or server understood the request but was not expecting it at this time (e.g., the request was out of order).''' 224 225 #sasl_error_conditions = ''' 226 #aborted -- -- -- The receiving entity acknowledges an <abort/> element sent by the initiating entity; sent in reply to the <abort/> element. 227 #incorrect-encoding -- -- -- The data provided by the initiating entity could not be processed because the [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003. encoding is incorrect (e.g., because the encoding does not adhere to the definition in Section 3 of [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003.); sent in reply to a <response/> element or an <auth/> element with initial response data. 228 #invalid-authzid -- -- -- The authzid provided by the initiating entity is invalid, either because it is incorrectly formatted or because the initiating entity does not have permissions to authorize that ID; sent in reply to a <response/> element or an <auth/> element with initial response data. 229 #invalid-mechanism -- -- -- The initiating entity did not provide a mechanism or requested a mechanism that is not supported by the receiving entity; sent in reply to an <auth/> element. 230 #mechanism-too-weak -- -- -- The mechanism requested by the initiating entity is weaker than server policy permits for that initiating entity; sent in reply to a <response/> element or an <auth/> element with initial response data. 231 #not-authorized -- -- -- The authentication failed because the initiating entity did not provide valid credentials (this includes but is not limited to the case of an unknown username); sent in reply to a <response/> element or an <auth/> element with initial response data. 232 #temporary-auth-failure -- -- -- The authentication failed because of a temporary error condition within the receiving entity; sent in reply to an <auth/> element or <response/> element.''' 233 234 #ERRORS, _errorcodes, loc = {}, {}, {} 235 #for ns, errname, errpool in ((NS_XMPP_STREAMS, 'STREAM', 236 #xmpp_stream_error_conditions), (NS_STANZAS, 'ERR', xmpp_stanza_error_conditions), 237 #(NS_SASL, 'SASL', sasl_error_conditions)): 238 #for err in errpool.split('\n')[1:]: 239 #cond, code, typ, text = err.split(' -- ') 240 #name = errname + '_' + ascii_upper(cond).replace('-', '_') 241 #locals()[name] = ns + ' ' + cond 242 #loc[name] = ns + ' ' + cond 243 #ERRORS[ns + ' ' + cond] = [code, typ, text] 244 #if code: 245 #_errorcodes[code] = cond 246 #del ns, errname, errpool, err, cond, code, typ, text 247 #import pprint 248 #pprint.pprint(ERRORS) 249 #pprint.pprint(_errorcodes) 250 #for (k, v) in loc.items(): 251 #print('%s = \'%s\'' % (k, v)) 252 253 ERRORS = { 254 'urn:ietf:params:xml:ns:xmpp-sasl aborted': ['', 255 '', 256 'The receiving entity acknowledges an <abort/> element sent by the initiating entity; sent in reply to the <abort/> element.'], 257 'urn:ietf:params:xml:ns:xmpp-sasl incorrect-encoding': ['', 258 '', 259 'The data provided by the initiating entity could not be processed because the [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003. encoding is incorrect (e.g., because the encoding does not adhere to the definition in Section 3 of [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003.); sent in reply to a <response/> element or an <auth/> element with initial response data.'], 260 'urn:ietf:params:xml:ns:xmpp-sasl invalid-authzid': ['', 261 '', 262 'The authzid provided by the initiating entity is invalid, either because it is incorrectly formatted or because the initiating entity does not have permissions to authorize that ID; sent in reply to a <response/> element or an <auth/> element with initial response data.'], 263 'urn:ietf:params:xml:ns:xmpp-sasl invalid-mechanism': ['', 264 '', 265 'The initiating entity did not provide a mechanism or requested a mechanism that is not supported by the receiving entity; sent in reply to an <auth/> element.'], 266 'urn:ietf:params:xml:ns:xmpp-sasl mechanism-too-weak': ['', 267 '', 268 'The mechanism requested by the initiating entity is weaker than server policy permits for that initiating entity; sent in reply to a <response/> element or an <auth/> element with initial response data.'], 269 'urn:ietf:params:xml:ns:xmpp-sasl not-authorized': ['', 270 '', 271 'The authentication failed because the initiating entity did not provide valid credentials (this includes but is not limited to the case of an unknown username); sent in reply to a <response/> element or an <auth/> element with initial response data.'], 272 'urn:ietf:params:xml:ns:xmpp-sasl temporary-auth-failure': ['', 273 '', 274 'The authentication failed because of a temporary error condition within the receiving entity; sent in reply to an <auth/> element or <response/> element.'], 275 'urn:ietf:params:xml:ns:xmpp-stanzas bad-request': ['400', 276 'modify', 277 'The sender has sent XML that is malformed or that cannot be processed.'], 278 'urn:ietf:params:xml:ns:xmpp-stanzas conflict': ['409', 279 'cancel', 280 'Access cannot be granted because an existing resource or session exists with the same name or address.'], 281 'urn:ietf:params:xml:ns:xmpp-stanzas feature-not-implemented': ['501', 282 'cancel', 283 'The feature requested is not implemented by the recipient or server and therefore cannot be processed.'], 284 'urn:ietf:params:xml:ns:xmpp-stanzas forbidden': ['403', 285 'auth', 286 'The requesting entity does not possess the required permissions to perform the action.'], 287 'urn:ietf:params:xml:ns:xmpp-stanzas gone': ['302', 288 'modify', 289 'The recipient or server can no longer be contacted at this address.'], 290 'urn:ietf:params:xml:ns:xmpp-stanzas internal-server-error': ['500', 291 'wait', 292 'The server could not process the stanza because of a misconfiguration or an otherwise-undefined internal server error.'], 293 'urn:ietf:params:xml:ns:xmpp-stanzas item-not-found': ['404', 294 'cancel', 295 'The addressed JID or item requested cannot be found.'], 296 'urn:ietf:params:xml:ns:xmpp-stanzas jid-malformed': ['400', 297 'modify', 298 "The value of the 'to' attribute in the sender's stanza does not adhere to the syntax defined in Addressing Scheme."], 299 'urn:ietf:params:xml:ns:xmpp-stanzas not-acceptable': ['406', 300 'cancel', 301 'The recipient or server understands the request but is refusing to process it because it does not meet criteria defined by the recipient or server.'], 302 'urn:ietf:params:xml:ns:xmpp-stanzas not-allowed': ['405', 303 'cancel', 304 'The recipient or server does not allow any entity to perform the action.'], 305 'urn:ietf:params:xml:ns:xmpp-stanzas not-authorized': ['401', 306 'auth', 307 'The sender must provide proper credentials before being allowed to perform the action, or has provided improper credentials.'], 308 'urn:ietf:params:xml:ns:xmpp-stanzas payment-required': ['402', 309 'auth', 310 'The requesting entity is not authorized to access the requested service because payment is required.'], 311 'urn:ietf:params:xml:ns:xmpp-stanzas recipient-unavailable': ['404', 312 'wait', 313 'The intended recipient is temporarily unavailable.'], 314 'urn:ietf:params:xml:ns:xmpp-stanzas redirect': ['302', 315 'modify', 316 'The recipient or server is redirecting requests for this information to another entity.'], 317 'urn:ietf:params:xml:ns:xmpp-stanzas registration-required': ['407', 318 'auth', 319 'The requesting entity is not authorized to access the requested service because registration is required.'], 320 'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-not-found': ['404', 321 'cancel', 322 'A remote server or service specified as part or all of the JID of the intended recipient does not exist.'], 323 'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-timeout': ['504', 324 'wait', 325 'A remote server or service specified as part or all of the JID of the intended recipient could not be contacted within a reasonable amount of time.'], 326 'urn:ietf:params:xml:ns:xmpp-stanzas resource-constraint': ['500', 327 'wait', 328 'The server or recipient lacks the system resources necessary to service the request.'], 329 'urn:ietf:params:xml:ns:xmpp-stanzas service-unavailable': ['503', 330 'cancel', 331 'The server or recipient does not currently provide the requested service.'], 332 'urn:ietf:params:xml:ns:xmpp-stanzas subscription-required': ['407', 333 'auth', 334 'The requesting entity is not authorized to access the requested service because a subscription is required.'], 335 'urn:ietf:params:xml:ns:xmpp-stanzas undefined-condition': ['500', 336 '', 337 'Undefined Condition'], 338 'urn:ietf:params:xml:ns:xmpp-stanzas unexpected-request': ['400', 339 'wait', 340 'The recipient or server understood the request but was not expecting it at this time (e.g., the request was out of order).'], 341 'urn:ietf:params:xml:ns:xmpp-streams bad-format': ['', 342 '', 343 'The entity has sent XML that cannot be processed.'], 344 'urn:ietf:params:xml:ns:xmpp-streams bad-namespace-prefix': ['', 345 '', 346 'The entity has sent a namespace prefix that is unsupported, or has sent no namespace prefix on an element that requires such a prefix.'], 347 'urn:ietf:params:xml:ns:xmpp-streams conflict': ['', 348 '', 349 'The server is closing the active stream for this entity because a new stream has been initiated that conflicts with the existing stream.'], 350 'urn:ietf:params:xml:ns:xmpp-streams connection-timeout': ['', 351 '', 352 'The entity has not generated any traffic over the stream for some period of time.'], 353 'urn:ietf:params:xml:ns:xmpp-streams host-gone': ['', 354 '', 355 "The value of the 'to' attribute provided by the initiating entity in the stream header corresponds to a hostname that is no longer hosted by the server."], 356 'urn:ietf:params:xml:ns:xmpp-streams host-unknown': ['', 357 '', 358 "The value of the 'to' attribute provided by the initiating entity in the stream header does not correspond to a hostname that is hosted by the server."], 359 'urn:ietf:params:xml:ns:xmpp-streams improper-addressing': ['', 360 '', 361 "A stanza sent between two servers lacks a 'to' or 'from' attribute (or the attribute has no value)."], 362 'urn:ietf:params:xml:ns:xmpp-streams internal-server-error': ['', 363 '', 364 'The server has experienced a misconfiguration or an otherwise-undefined internal error that prevents it from servicing the stream.'], 365 'urn:ietf:params:xml:ns:xmpp-streams invalid-from': ['cancel', 366 '', 367 "The JID or hostname provided in a 'from' address does not match an authorized JID or validated domain negotiated between servers via SASL or dialback, or between a client and a server via authentication and resource authorization."], 368 'urn:ietf:params:xml:ns:xmpp-streams invalid-id': ['', 369 '', 370 'The stream ID or dialback ID is invalid or does not match an ID previously provided.'], 371 'urn:ietf:params:xml:ns:xmpp-streams invalid-namespace': ['', 372 '', 373 'The streams namespace name is something other than "http://etherx.jabber.org/streams" or the dialback namespace name is something other than "jabber:server:dialback".'], 374 'urn:ietf:params:xml:ns:xmpp-streams invalid-xml': ['', 375 '', 376 'The entity has sent invalid XML over the stream to a server that performs validation.'], 377 'urn:ietf:params:xml:ns:xmpp-streams not-authorized': ['', 378 '', 379 'The entity has attempted to send data before the stream has been authenticated, or otherwise is not authorized to perform an action related to stream negotiation.'], 380 'urn:ietf:params:xml:ns:xmpp-streams policy-violation': ['', 381 '', 382 'The entity has violated some local service policy.'], 383 'urn:ietf:params:xml:ns:xmpp-streams remote-connection-failed': ['', 384 '', 385 'The server is unable to properly connect to a remote resource that is required for authentication or authorization.'], 386 'urn:ietf:params:xml:ns:xmpp-streams resource-constraint': ['', 387 '', 388 'The server lacks the system resources necessary to service the stream.'], 389 'urn:ietf:params:xml:ns:xmpp-streams restricted-xml': ['', 390 '', 391 'The entity has attempted to send restricted XML features such as a comment, processing instruction, DTD, entity reference, or unescaped character.'], 392 'urn:ietf:params:xml:ns:xmpp-streams see-other-host': ['', 393 '', 394 'The server will not provide service to the initiating entity but is redirecting traffic to another host.'], 395 'urn:ietf:params:xml:ns:xmpp-streams system-shutdown': ['', 396 '', 397 'The server is being shut down and all active streams are being closed.'], 398 'urn:ietf:params:xml:ns:xmpp-streams undefined-condition': ['', 399 '', 400 'The error condition is not one of those defined by the other conditions in this list.'], 401 'urn:ietf:params:xml:ns:xmpp-streams unsupported-encoding': ['', 402 '', 403 'The initiating entity has encoded the stream in an encoding that is not supported by the server.'], 404 'urn:ietf:params:xml:ns:xmpp-streams unsupported-stanza-type': ['', 405 '', 406 'The initiating entity has sent a first-level child of the stream that is not supported by the server.'], 407 'urn:ietf:params:xml:ns:xmpp-streams unsupported-version': ['', 408 '', 409 "The value of the 'version' attribute provided by the initiating entity in the stream header specifies a version of XMPP that is not supported by the server."], 410 'urn:ietf:params:xml:ns:xmpp-streams xml-not-well-formed': ['', 411 '', 412 'The initiating entity has sent XML that is not well-formed.'] 413 } 414 415 _errorcodes = { 416 '302': 'redirect', 417 '400': 'unexpected-request', 418 '401': 'not-authorized', 419 '402': 'payment-required', 420 '403': 'forbidden', 421 '404': 'remote-server-not-found', 422 '405': 'not-allowed', 423 '406': 'not-acceptable', 424 '407': 'subscription-required', 425 '409': 'conflict', 426 '500': 'undefined-condition', 427 '501': 'feature-not-implemented', 428 '503': 'service-unavailable', 429 '504': 'remote-server-timeout', 430 'cancel': 'invalid-from' 431 } 432 433 STREAM_NOT_AUTHORIZED = 'urn:ietf:params:xml:ns:xmpp-streams not-authorized' 434 STREAM_REMOTE_CONNECTION_FAILED = 'urn:ietf:params:xml:ns:xmpp-streams remote-connection-failed' 435 SASL_MECHANISM_TOO_WEAK = 'urn:ietf:params:xml:ns:xmpp-sasl mechanism-too-weak' 436 STREAM_XML_NOT_WELL_FORMED = 'urn:ietf:params:xml:ns:xmpp-streams xml-not-well-formed' 437 ERR_JID_MALFORMED = 'urn:ietf:params:xml:ns:xmpp-stanzas jid-malformed' 438 STREAM_SEE_OTHER_HOST = 'urn:ietf:params:xml:ns:xmpp-streams see-other-host' 439 STREAM_BAD_NAMESPACE_PREFIX = 'urn:ietf:params:xml:ns:xmpp-streams bad-namespace-prefix' 440 ERR_SERVICE_UNAVAILABLE = 'urn:ietf:params:xml:ns:xmpp-stanzas service-unavailable' 441 STREAM_CONNECTION_TIMEOUT = 'urn:ietf:params:xml:ns:xmpp-streams connection-timeout' 442 STREAM_UNSUPPORTED_VERSION = 'urn:ietf:params:xml:ns:xmpp-streams unsupported-version' 443 STREAM_IMPROPER_ADDRESSING = 'urn:ietf:params:xml:ns:xmpp-streams improper-addressing' 444 STREAM_UNDEFINED_CONDITION = 'urn:ietf:params:xml:ns:xmpp-streams undefined-condition' 445 SASL_NOT_AUTHORIZED = 'urn:ietf:params:xml:ns:xmpp-sasl not-authorized' 446 ERR_GONE = 'urn:ietf:params:xml:ns:xmpp-stanzas gone' 447 SASL_TEMPORARY_AUTH_FAILURE = 'urn:ietf:params:xml:ns:xmpp-sasl temporary-auth-failure' 448 ERR_REMOTE_SERVER_NOT_FOUND = 'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-not-found' 449 ERR_UNEXPECTED_REQUEST = 'urn:ietf:params:xml:ns:xmpp-stanzas unexpected-request' 450 ERR_RECIPIENT_UNAVAILABLE = 'urn:ietf:params:xml:ns:xmpp-stanzas recipient-unavailable' 451 ERR_CONFLICT = 'urn:ietf:params:xml:ns:xmpp-stanzas conflict' 452 STREAM_SYSTEM_SHUTDOWN = 'urn:ietf:params:xml:ns:xmpp-streams system-shutdown' 453 STREAM_BAD_FORMAT = 'urn:ietf:params:xml:ns:xmpp-streams bad-format' 454 ERR_SUBSCRIPTION_REQUIRED = 'urn:ietf:params:xml:ns:xmpp-stanzas subscription-required' 455 STREAM_INTERNAL_SERVER_ERROR = 'urn:ietf:params:xml:ns:xmpp-streams internal-server-error' 456 ERR_NOT_AUTHORIZED = 'urn:ietf:params:xml:ns:xmpp-stanzas not-authorized' 457 SASL_ABORTED = 'urn:ietf:params:xml:ns:xmpp-sasl aborted' 458 ERR_REGISTRATION_REQUIRED = 'urn:ietf:params:xml:ns:xmpp-stanzas registration-required' 459 ERR_INTERNAL_SERVER_ERROR = 'urn:ietf:params:xml:ns:xmpp-stanzas internal-server-error' 460 SASL_INCORRECT_ENCODING = 'urn:ietf:params:xml:ns:xmpp-sasl incorrect-encoding' 461 STREAM_HOST_GONE = 'urn:ietf:params:xml:ns:xmpp-streams host-gone' 462 STREAM_POLICY_VIOLATION = 'urn:ietf:params:xml:ns:xmpp-streams policy-violation' 463 STREAM_INVALID_XML = 'urn:ietf:params:xml:ns:xmpp-streams invalid-xml' 464 STREAM_CONFLICT = 'urn:ietf:params:xml:ns:xmpp-streams conflict' 465 STREAM_RESOURCE_CONSTRAINT = 'urn:ietf:params:xml:ns:xmpp-streams resource-constraint' 466 STREAM_UNSUPPORTED_ENCODING = 'urn:ietf:params:xml:ns:xmpp-streams unsupported-encoding' 467 ERR_NOT_ALLOWED = 'urn:ietf:params:xml:ns:xmpp-stanzas not-allowed' 468 ERR_ITEM_NOT_FOUND = 'urn:ietf:params:xml:ns:xmpp-stanzas item-not-found' 469 ERR_NOT_ACCEPTABLE = 'urn:ietf:params:xml:ns:xmpp-stanzas not-acceptable' 470 STREAM_INVALID_FROM = 'urn:ietf:params:xml:ns:xmpp-streams invalid-from' 471 ERR_FEATURE_NOT_IMPLEMENTED = 'urn:ietf:params:xml:ns:xmpp-stanzas feature-not-implemented' 472 ERR_BAD_REQUEST = 'urn:ietf:params:xml:ns:xmpp-stanzas bad-request' 473 STREAM_INVALID_ID = 'urn:ietf:params:xml:ns:xmpp-streams invalid-id' 474 STREAM_HOST_UNKNOWN = 'urn:ietf:params:xml:ns:xmpp-streams host-unknown' 475 ERR_UNDEFINED_CONDITION = 'urn:ietf:params:xml:ns:xmpp-stanzas undefined-condition' 476 SASL_INVALID_MECHANISM = 'urn:ietf:params:xml:ns:xmpp-sasl invalid-mechanism' 477 STREAM_RESTRICTED_XML = 'urn:ietf:params:xml:ns:xmpp-streams restricted-xml' 478 ERR_RESOURCE_CONSTRAINT = 'urn:ietf:params:xml:ns:xmpp-stanzas resource-constraint' 479 ERR_REMOTE_SERVER_TIMEOUT = 'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-timeout' 480 SASL_INVALID_AUTHZID = 'urn:ietf:params:xml:ns:xmpp-sasl invalid-authzid' 481 ERR_PAYMENT_REQUIRED = 'urn:ietf:params:xml:ns:xmpp-stanzas payment-required' 482 STREAM_INVALID_NAMESPACE = 'urn:ietf:params:xml:ns:xmpp-streams invalid-namespace' 483 ERR_REDIRECT = 'urn:ietf:params:xml:ns:xmpp-stanzas redirect' 484 STREAM_UNSUPPORTED_STANZA_TYPE = 'urn:ietf:params:xml:ns:xmpp-streams unsupported-stanza-type' 485 ERR_FORBIDDEN = 'urn:ietf:params:xml:ns:xmpp-stanzas forbidden' 486
487 -def isResultNode(node):
488 """ 489 Return true if the node is a positive reply 490 """ 491 return node and node.getType() == 'result'
492
493 -def isErrorNode(node):
494 """ 495 Return true if the node is a negative reply 496 """ 497 return node and node.getType() == 'error'
498
499 -class NodeProcessed(Exception):
500 """ 501 Exception that should be raised by handler when the handling should be 502 stopped 503 """ 504 pass
505
506 -class StreamError(Exception):
507 """ 508 Base exception class for stream errors 509 """ 510 pass
511
512 -class BadFormat(StreamError):
513 pass
514
515 -class BadNamespacePrefix(StreamError):
516 pass
517
518 -class Conflict(StreamError):
519 pass
520
521 -class ConnectionTimeout(StreamError):
522 pass
523
524 -class HostGone(StreamError):
525 pass
526
527 -class HostUnknown(StreamError):
528 pass
529
530 -class ImproperAddressing(StreamError):
531 pass
532
533 -class InternalServerError(StreamError):
534 pass
535
536 -class InvalidFrom(StreamError):
537 pass
538
539 -class InvalidID(StreamError):
540 pass
541
542 -class InvalidNamespace(StreamError):
543 pass
544
545 -class InvalidXML(StreamError):
546 pass
547
548 -class NotAuthorized(StreamError):
549 pass
550
551 -class PolicyViolation(StreamError):
552 pass
553
554 -class RemoteConnectionFailed(StreamError):
555 pass
556
557 -class ResourceConstraint(StreamError):
558 pass
559
560 -class RestrictedXML(StreamError):
561 pass
562
563 -class SeeOtherHost(StreamError):
564 pass
565
566 -class SystemShutdown(StreamError):
567 pass
568
569 -class UndefinedCondition(StreamError):
570 pass
571
572 -class UnsupportedEncoding(StreamError):
573 pass
574
575 -class UnsupportedStanzaType(StreamError):
576 pass
577
578 -class UnsupportedVersion(StreamError):
579 pass
580
581 -class XMLNotWellFormed(StreamError):
582 pass
583 584 stream_exceptions = {'bad-format': BadFormat, 585 'bad-namespace-prefix': BadNamespacePrefix, 586 'conflict': Conflict, 587 'connection-timeout': ConnectionTimeout, 588 'host-gone': HostGone, 589 'host-unknown': HostUnknown, 590 'improper-addressing': ImproperAddressing, 591 'internal-server-error': InternalServerError, 592 'invalid-from': InvalidFrom, 593 'invalid-id': InvalidID, 594 'invalid-namespace': InvalidNamespace, 595 'invalid-xml': InvalidXML, 596 'not-authorized': NotAuthorized, 597 'policy-violation': PolicyViolation, 598 'remote-connection-failed': RemoteConnectionFailed, 599 'resource-constraint': ResourceConstraint, 600 'restricted-xml': RestrictedXML, 601 'see-other-host': SeeOtherHost, 602 'system-shutdown': SystemShutdown, 603 'undefined-condition': UndefinedCondition, 604 'unsupported-encoding': UnsupportedEncoding, 605 'unsupported-stanza-type': UnsupportedStanzaType, 606 'unsupported-version': UnsupportedVersion, 607 'xml-not-well-formed': XMLNotWellFormed} 608
609 -class JID:
610 """ 611 JID can be built from string, modified, compared, serialised into string 612 """ 613
614 - def __init__(self, jid=None, node='', domain='', resource=''):
615 """ 616 JID can be specified as string (jid argument) or as separate parts 617 618 Examples: 619 JID('node@domain/resource') 620 JID(node='node',domain='domain.org') 621 """ 622 if not jid and not domain: 623 raise ValueError('JID must contain at least domain name') 624 elif type(jid) == type(self): 625 self.node, self.domain = jid.node, jid.domain 626 self.resource = jid.resource 627 elif domain: 628 self.node, self.domain, self.resource = node, domain, resource 629 else: 630 if jid.find('@') + 1: 631 self.node, jid = jid.split('@', 1) 632 else: 633 self.node = '' 634 if jid.find('/')+1: 635 self.domain, self.resource = jid.split('/', 1) 636 else: 637 self.domain, self.resource = jid, ''
638
639 - def getNode(self):
640 """ 641 Return the node part of the JID 642 """ 643 return self.node
644
645 - def setNode(self, node):
646 """ 647 Set the node part of the JID to new value. Specify None to remove 648 the node part 649 """ 650 self.node = node.lower()
651
652 - def getDomain(self):
653 """ 654 Return the domain part of the JID 655 """ 656 return self.domain
657
658 - def setDomain(self, domain):
659 """ 660 Set the domain part of the JID to new value 661 """ 662 self.domain = domain.lower()
663
664 - def getResource(self):
665 """ 666 Return the resource part of the JID 667 """ 668 return self.resource
669
670 - def setResource(self, resource):
671 """ 672 Set the resource part of the JID to new value. Specify None to remove the 673 resource part 674 """ 675 self.resource = resource
676
677 - def getStripped(self):
678 """ 679 Return the bare representation of JID. I.e. string value w/o resource 680 """ 681 return self.__str__(0)
682
683 - def __eq__(self, other):
684 """ 685 Compare the JID to another instance or to string for equality 686 """ 687 try: 688 other = JID(other) 689 except ValueError: 690 return 0 691 return self.resource == other.resource and \ 692 self.__str__(0) == other.__str__(0)
693
694 - def __ne__(self, other):
695 """ 696 Compare the JID to another instance or to string for non-equality 697 """ 698 return not self.__eq__(other)
699
700 - def bareMatch(self, other):
701 """ 702 Compare the node and domain parts of the JID's for equality 703 """ 704 return self.__str__(0) == JID(other).__str__(0)
705
706 - def __str__(self, wresource=1):
707 """ 708 Serialise JID into string 709 """ 710 if self.node: 711 jid = self.node + '@' + self.domain 712 else: 713 jid = self.domain 714 if wresource and self.resource: 715 return jid + '/' + self.resource 716 return jid
717
718 - def __hash__(self):
719 """ 720 Produce hash of the JID, Allows to use JID objects as keys of the 721 dictionary 722 """ 723 return hash(str(self))
724
725 -class BOSHBody(Node):
726 """ 727 <body> tag that wraps usual XMPP stanzas in XMPP over BOSH 728 """ 729
730 - def __init__(self, attrs={}, payload=[], node=None):
731 Node.__init__(self, tag='body', attrs=attrs, payload=payload, node=node) 732 self.setNamespace(NS_HTTP_BIND)
733 734
735 -class Protocol(Node):
736 """ 737 A "stanza" object class. Contains methods that are common for presences, iqs 738 and messages 739 """ 740
741 - def __init__(self, name=None, to=None, typ=None, frm=None, attrs={}, 742 payload=[], timestamp=None, xmlns=None, node=None):
743 """ 744 Constructor, name is the name of the stanza 745 i.e. 'message' or 'presence'or 'iq' 746 747 to is the value of 'to' attribure, 'typ' - 'type' attribute 748 frn - from attribure, attrs - other attributes mapping, 749 payload - same meaning as for simplexml payload definition 750 timestamp - the time value that needs to be stamped over stanza 751 xmlns - namespace of top stanza node 752 node - parsed or unparsed stana to be taken as prototype. 753 """ 754 if not attrs: 755 attrs = {} 756 if to: 757 attrs['to'] = to 758 if frm: 759 attrs['from'] = frm 760 if typ: 761 attrs['type'] = typ 762 Node.__init__(self, tag=name, attrs=attrs, payload=payload, node=node) 763 if not node and xmlns: 764 self.setNamespace(xmlns) 765 if self['to']: 766 self.setTo(self['to']) 767 if self['from']: 768 self.setFrom(self['from']) 769 if node and type(self) == type(node) and \ 770 self.__class__ == node.__class__ and self.attrs.has_key('id'): 771 del self.attrs['id'] 772 self.timestamp = None 773 for d in self.getTags('delay', namespace=NS_DELAY2): 774 try: 775 if d.getAttr('stamp') < self.getTimestamp2(): 776 self.setTimestamp(d.getAttr('stamp')) 777 except Exception: 778 pass 779 if not self.timestamp: 780 for x in self.getTags('x', namespace=NS_DELAY): 781 try: 782 if x.getAttr('stamp') < self.getTimestamp(): 783 self.setTimestamp(x.getAttr('stamp')) 784 except Exception: 785 pass 786 if timestamp is not None: 787 self.setTimestamp(timestamp) # To auto-timestamp stanza just pass timestamp=''
788
789 - def getTo(self):
790 """ 791 Return value of the 'to' attribute 792 """ 793 try: 794 return self['to'] 795 except: 796 return None
797
798 - def getFrom(self):
799 """ 800 Return value of the 'from' attribute 801 """ 802 try: 803 return self['from'] 804 except: 805 return None
806
807 - def getTimestamp(self):
808 """ 809 Return the timestamp in the 'yyyymmddThhmmss' format 810 """ 811 if self.timestamp: 812 return self.timestamp 813 return time.strftime('%Y%m%dT%H:%M:%S', time.gmtime())
814
815 - def getTimestamp2(self):
816 """ 817 Return the timestamp in the 'yyyymmddThhmmss' format 818 """ 819 if self.timestamp: 820 return self.timestamp 821 return time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())
822
823 - def getID(self):
824 """ 825 Return the value of the 'id' attribute 826 """ 827 return self.getAttr('id')
828
829 - def setTo(self, val):
830 """ 831 Set the value of the 'to' attribute 832 """ 833 self.setAttr('to', JID(val))
834
835 - def getType(self):
836 """ 837 Return the value of the 'type' attribute 838 """ 839 return self.getAttr('type')
840
841 - def setFrom(self, val):
842 """ 843 Set the value of the 'from' attribute 844 """ 845 self.setAttr('from', JID(val))
846
847 - def setType(self, val):
848 """ 849 Set the value of the 'type' attribute 850 """ 851 self.setAttr('type', val)
852
853 - def setID(self, val):
854 """ 855 Set the value of the 'id' attribute 856 """ 857 self.setAttr('id', val)
858
859 - def getError(self):
860 """ 861 Return the error-condition (if present) or the textual description 862 of the error (otherwise) 863 """ 864 errtag = self.getTag('error') 865 if errtag: 866 for tag in errtag.getChildren(): 867 if tag.getName() != 'text': 868 return tag.getName() 869 return errtag.getData()
870
871 - def getErrorMsg(self):
872 """ 873 Return the textual description of the error (if present) 874 or the error condition 875 """ 876 errtag = self.getTag('error') 877 if errtag: 878 for tag in errtag.getChildren(): 879 if tag.getName() == 'text': 880 return tag.getData() 881 return self.getError()
882
883 - def getErrorCode(self):
884 """ 885 Return the error code. Obsolete. 886 """ 887 return self.getTagAttr('error', 'code')
888
889 - def getStatusConditions(self):
890 """ 891 Return the status conditions list as defined in XEP-0306. 892 """ 893 conds = [] 894 condtag = self.getTag('conditions', namespace=NS_CONDITIONS) 895 if condtag: 896 for tag in condtag.getChildren(): 897 conds.append(tag.getName()) 898 return conds
899
900 - def setError(self, error, code=None):
901 """ 902 Set the error code. Obsolete. Use error-conditions instead 903 """ 904 if code: 905 if str(code) in _errorcodes.keys(): 906 error = ErrorNode(_errorcodes[str(code)], text=error) 907 else: 908 error = ErrorNode(ERR_UNDEFINED_CONDITION, code=code, 909 typ='cancel', text=error) 910 elif type(error) in [type(''), type(u'')]: 911 error=ErrorNode(error) 912 self.setType('error') 913 self.addChild(node=error)
914
915 - def setTimestamp(self, val=None):
916 """ 917 Set the timestamp. timestamp should be the yyyymmddThhmmss string 918 """ 919 if not val: 920 val = time.strftime('%Y%m%dT%H:%M:%S', time.gmtime()) 921 self.timestamp=val 922 self.setTag('x', {'stamp': self.timestamp}, namespace=NS_DELAY)
923
924 - def getProperties(self):
925 """ 926 Return the list of namespaces to which belongs the direct childs of element 927 """ 928 props = [] 929 for child in self.getChildren(): 930 prop = child.getNamespace() 931 if prop not in props: 932 props.append(prop) 933 return props
934
935 - def __setitem__(self, item, val):
936 """ 937 Set the item 'item' to the value 'val' 938 """ 939 if item in ['to', 'from']: 940 val = JID(val) 941 return self.setAttr(item, val)
942 943
944 -class Message(Protocol):
945 """ 946 XMPP Message stanza - "push" mechanism 947 """ 948
949 - def __init__(self, to=None, body=None, xhtml=None, typ=None, subject=None, 950 attrs={}, frm=None, payload=[], timestamp=None, xmlns=NS_CLIENT, 951 node=None):
952 """ 953 You can specify recipient, text of message, type of message any 954 additional attributes, sender of the message, any additional payload 955 (f.e. jabber:x:delay element) and namespace in one go. 956 957 Alternatively you can pass in the other XML object as the 'node' 958 parameted to replicate it as message 959 """ 960 Protocol.__init__(self, 'message', to=to, typ=typ, attrs=attrs, frm=frm, 961 payload=payload, timestamp=timestamp, xmlns=xmlns, node=node) 962 if body: 963 self.setBody(body) 964 if xhtml: 965 self.setXHTML(xhtml) 966 if subject is not None: 967 self.setSubject(subject)
968
969 - def getBody(self):
970 """ 971 Return text of the message 972 """ 973 return self.getTagData('body')
974
975 - def getXHTML(self, xmllang=None):
976 """ 977 Return serialized xhtml-im element text of the message 978 979 TODO: Returning a DOM could make rendering faster. 980 """ 981 xhtml = self.getTag('html') 982 if xhtml: 983 if xmllang: 984 body = xhtml.getTag('body', attrs={'xml:lang': xmllang}) 985 else: 986 body = xhtml.getTag('body') 987 return str(body) 988 return None
989
990 - def getSubject(self):
991 """ 992 Return subject of the message 993 """ 994 return self.getTagData('subject')
995
996 - def getThread(self):
997 """ 998 Return thread of the message 999 """ 1000 return self.getTagData('thread')
1001
1002 - def setBody(self, val):
1003 """ 1004 Set the text of the message""" 1005 self.setTagData('body', val)
1006
1007 - def setXHTML(self, val, xmllang=None):
1008 """ 1009 Sets the xhtml text of the message (XEP-0071). The parameter is the 1010 "inner html" to the body. 1011 """ 1012 try: 1013 if xmllang: 1014 dom = NodeBuilder('<body xmlns="%s" xml:lang="%s">%s</body>' \ 1015 % (NS_XHTML, xmllang, val)).getDom() 1016 else: 1017 dom = NodeBuilder('<body xmlns="%s">%s</body>' % (NS_XHTML, 1018 val), 0).getDom() 1019 if self.getTag('html'): 1020 self.getTag('html').addChild(node=dom) 1021 else: 1022 self.setTag('html', namespace=NS_XHTML_IM).addChild(node=dom) 1023 except Exception, e: 1024 print "Error", e
1025 # FIXME: log. we could not set xhtml (parse error, whatever) 1026
1027 - def setSubject(self, val):
1028 """ 1029 Set the subject of the message 1030 """ 1031 self.setTagData('subject', val)
1032
1033 - def setThread(self, val):
1034 """ 1035 Set the thread of the message 1036 """ 1037 self.setTagData('thread', val)
1038
1039 - def buildReply(self, text=None):
1040 """ 1041 Builds and returns another message object with specified text. The to, 1042 from, thread and type properties of new message are pre-set as reply to 1043 this message 1044 """ 1045 m = Message(to=self.getFrom(), frm=self.getTo(), body=text, 1046 typ=self.getType()) 1047 th = self.getThread() 1048 if th: 1049 m.setThread(th) 1050 return m
1051
1052 - def getStatusCode(self):
1053 """ 1054 Return the status code of the message (for groupchat config change) 1055 """ 1056 attrs = [] 1057 for xtag in self.getTags('x'): 1058 for child in xtag.getTags('status'): 1059 attrs.append(child.getAttr('code')) 1060 return attrs
1061
1062 -class Presence(Protocol):
1063
1064 - def __init__(self, to=None, typ=None, priority=None, show=None, status=None, 1065 attrs={}, frm=None, timestamp=None, payload=[], xmlns=NS_CLIENT, 1066 node=None):
1067 """ 1068 You can specify recipient, type of message, priority, show and status 1069 values any additional attributes, sender of the presence, timestamp, any 1070 additional payload (f.e. jabber:x:delay element) and namespace in one go. 1071 Alternatively you can pass in the other XML object as the 'node' 1072 parameted to replicate it as presence 1073 """ 1074 Protocol.__init__(self, 'presence', to=to, typ=typ, attrs=attrs, frm=frm, 1075 payload=payload, timestamp=timestamp, xmlns=xmlns, node=node) 1076 if priority: 1077 self.setPriority(priority) 1078 if show: 1079 self.setShow(show) 1080 if status: 1081 self.setStatus(status)
1082
1083 - def getPriority(self):
1084 """ 1085 Return the priority of the message 1086 """ 1087 return self.getTagData('priority')
1088
1089 - def getShow(self):
1090 """ 1091 Return the show value of the message 1092 """ 1093 return self.getTagData('show')
1094
1095 - def getStatus(self):
1096 """ 1097 Return the status string of the message 1098 """ 1099 return self.getTagData('status')
1100
1101 - def setPriority(self, val):
1102 """ 1103 Set the priority of the message 1104 """ 1105 self.setTagData('priority', val)
1106
1107 - def setShow(self, val):
1108 """ 1109 Set the show value of the message 1110 """ 1111 self.setTagData('show', val)
1112
1113 - def setStatus(self, val):
1114 """ 1115 Set the status string of the message 1116 """ 1117 self.setTagData('status', val)
1118
1119 - def _muc_getItemAttr(self, tag, attr):
1120 for xtag in self.getTags('x'): 1121 if xtag.getNamespace() not in (NS_MUC_USER, NS_MUC_ADMIN): 1122 continue 1123 for child in xtag.getTags(tag): 1124 return child.getAttr(attr)
1125
1126 - def _muc_getSubTagDataAttr(self, tag, attr):
1127 for xtag in self.getTags('x'): 1128 if xtag.getNamespace() not in (NS_MUC_USER, NS_MUC_ADMIN): 1129 continue 1130 for child in xtag.getTags('item'): 1131 for cchild in child.getTags(tag): 1132 return cchild.getData(), cchild.getAttr(attr) 1133 return None, None
1134
1135 - def getRole(self):
1136 """ 1137 Return the presence role (for groupchat) 1138 """ 1139 return self._muc_getItemAttr('item', 'role')
1140
1141 - def getAffiliation(self):
1142 """ 1143 Return the presence affiliation (for groupchat) 1144 """ 1145 return self._muc_getItemAttr('item', 'affiliation')
1146
1147 - def getNewNick(self):
1148 """ 1149 Return the status code of the presence (for groupchat) 1150 """ 1151 return self._muc_getItemAttr('item', 'nick')
1152
1153 - def getJid(self):
1154 """ 1155 Return the presence jid (for groupchat) 1156 """ 1157 return self._muc_getItemAttr('item', 'jid')
1158
1159 - def getReason(self):
1160 """ 1161 Returns the reason of the presence (for groupchat) 1162 """ 1163 return self._muc_getSubTagDataAttr('reason', '')[0]
1164
1165 - def getActor(self):
1166 """ 1167 Return the reason of the presence (for groupchat) 1168 """ 1169 return self._muc_getSubTagDataAttr('actor', 'jid')[1]
1170
1171 - def getStatusCode(self):
1172 """ 1173 Return the status code of the presence (for groupchat) 1174 """ 1175 attrs = [] 1176 for xtag in self.getTags('x'): 1177 for child in xtag.getTags('status'): 1178 attrs.append(child.getAttr('code')) 1179 return attrs
1180
1181 -class Iq(Protocol):
1182 """ 1183 XMPP Iq object - get/set dialog mechanism 1184 """ 1185
1186 - def __init__(self, typ=None, queryNS=None, attrs={}, to=None, frm=None, 1187 payload=[], xmlns=NS_CLIENT, node=None):
1188 """ 1189 You can specify type, query namespace any additional attributes, 1190 recipient of the iq, sender of the iq, any additional payload (f.e. 1191 jabber:x:data node) and namespace in one go. 1192 1193 Alternatively you can pass in the other XML object as the 'node' 1194 parameted to replicate it as an iq 1195 """ 1196 Protocol.__init__(self, 'iq', to=to, typ=typ, attrs=attrs, frm=frm, 1197 xmlns=xmlns, node=node) 1198 if payload: 1199 self.setQueryPayload(payload) 1200 if queryNS: 1201 self.setQueryNS(queryNS)
1202
1203 - def getQuery(self):
1204 """ 1205 Return the IQ's child element if it exists, None otherwise. 1206 """ 1207 children = self.getChildren() 1208 if children and self.getType() != 'error' and \ 1209 children[0].getName() != 'error': 1210 return children[0]
1211
1212 - def getQueryNS(self):
1213 """ 1214 Return the namespace of the 'query' child element 1215 """ 1216 tag = self.getQuery() 1217 if tag: 1218 return tag.getNamespace()
1219
1220 - def getQuerynode(self):
1221 """ 1222 Return the 'node' attribute value of the 'query' child element 1223 """ 1224 tag = self.getQuery() 1225 if tag: 1226 return tag.getAttr('node')
1227
1228 - def getQueryPayload(self):
1229 """ 1230 Return the 'query' child element payload 1231 """ 1232 tag = self.getQuery() 1233 if tag: 1234 return tag.getPayload()
1235
1236 - def getQueryChildren(self):
1237 """ 1238 Return the 'query' child element child nodes 1239 """ 1240 tag = self.getQuery() 1241 if tag: 1242 return tag.getChildren()
1243
1244 - def setQuery(self, name=None):
1245 """ 1246 Change the name of the query node, creating it if needed. Keep the 1247 existing name if none is given (use 'query' if it's a creation). 1248 Return the query node. 1249 """ 1250 query = self.getQuery() 1251 if query is None: 1252 query = self.addChild('query') 1253 if name is not None: 1254 query.setName(name) 1255 return query
1256
1257 - def setQueryNS(self, namespace):
1258 """ 1259 Set the namespace of the 'query' child element 1260 """ 1261 self.setQuery().setNamespace(namespace)
1262
1263 - def setQueryPayload(self, payload):
1264 """ 1265 Set the 'query' child element payload 1266 """ 1267 self.setQuery().setPayload(payload)
1268
1269 - def setQuerynode(self, node):
1270 """ 1271 Set the 'node' attribute value of the 'query' child element 1272 """ 1273 self.setQuery().setAttr('node', node)
1274
1275 - def buildReply(self, typ):
1276 """ 1277 Build and return another Iq object of specified type. The to, from and 1278 query child node of new Iq are pre-set as reply to this Iq. 1279 """ 1280 iq = Iq(typ, to=self.getFrom(), frm=self.getTo(), 1281 attrs={'id': self.getID()}) 1282 iq.setQuery(self.getQuery().getName()).setNamespace(self.getQueryNS()) 1283 return iq
1284
1285 -class Hashes(Node):
1286 """ 1287 Hash elements for various XEPs as defined in XEP-300 1288 """ 1289 1290 """ 1291 RECOMENDED HASH USE: 1292 Algorithm Support 1293 MD2 MUST NOT 1294 MD4 MUST NOT 1295 MD5 MAY 1296 SHA-1 MUST 1297 SHA-256 MUST 1298 SHA-512 SHOULD 1299 """ 1300 1301 supported = ('md5', 'sha-1', 'sha-256', 'sha-512') 1302
1303 - def __init__(self, nsp=NS_HASHES):
1304 Node.__init__(self, None, {}, [], None, None, False, None) 1305 self.setNamespace(nsp) 1306 self.setName('hash')
1307
1308 - def calculateHash(self, algo, file_string):
1309 """ 1310 Calculate the hash and add it. It is preferable doing it here 1311 instead of doing it all over the place in Gajim. 1312 """ 1313 hl = None 1314 hash_ = None 1315 # file_string can be a string or a file 1316 if type(file_string) == str: # if it is a string 1317 if algo == 'sha-1': 1318 hl = hashlib.sha1() 1319 elif algo == 'md5': 1320 hl = hashlib.md5() 1321 elif algo == 'sha-256': 1322 hl = hashlib.sha256() 1323 elif algo == 'sha-512': 1324 hl = hashlib.sha512() 1325 if hl: 1326 hl.update(file_string) 1327 hash_ = hl.hexdigest() 1328 else: # if it is a file 1329 if algo == 'sha-1': 1330 hl = hashlib.sha1() 1331 elif algo == 'md5': 1332 hl = hashlib.md5() 1333 elif algo == 'sha-256': 1334 hl = hashlib.sha256() 1335 elif algo == 'sha-512': 1336 hl = hashlib.sha512() 1337 if hl: 1338 for line in file_string: 1339 hl.update(line) 1340 hash_ = hl.hexdigest() 1341 return hash_
1342
1343 - def addHash(self, hash_, algo):
1344 self.setAttr('algo', algo) 1345 self.setData(hash_)
1346
1347 -class Acks(Node):
1348 """ 1349 Acknowledgement elements for Stream Management 1350 """
1351 - def __init__(self, nsp=NS_STREAM_MGMT):
1352 Node.__init__(self, None, {}, [], None, None, False, None) 1353 self.setNamespace(nsp)
1354
1355 - def buildAnswer(self, handled):
1356 """ 1357 handled is the number of stanzas handled 1358 """ 1359 self.setName('a') 1360 self.setAttr('h', handled)
1361
1362 - def buildRequest(self):
1363 self.setName('r')
1364
1365 - def buildEnable(self, resume=False):
1366 self.setName('enable') 1367 if resume: 1368 self.setAttr('resume', 'true')
1369
1370 - def buildResume(self, handled, previd):
1371 self.setName('resume') 1372 self.setAttr('h', handled) 1373 self.setAttr('previd', previd)
1374
1375 -class ErrorNode(Node):
1376 """ 1377 XMPP-style error element 1378 1379 In the case of stanza error should be attached to XMPP stanza. 1380 In the case of stream-level errors should be used separately. 1381 """ 1382
1383 - def __init__(self, name, code=None, typ=None, text=None):
1384 """ 1385 Mandatory parameter: name - name of error condition. 1386 Optional parameters: code, typ, text. 1387 Used for backwards compartibility with older jabber protocol. 1388 """ 1389 if name in ERRORS: 1390 cod, type_, txt = ERRORS[name] 1391 ns = name.split()[0] 1392 else: 1393 cod, ns, type_, txt = '500', NS_STANZAS, 'cancel', '' 1394 if typ: 1395 type_ = typ 1396 if code: 1397 cod = code 1398 if text: 1399 txt = text 1400 Node.__init__(self, 'error', {}, [Node(name)]) 1401 if type_: 1402 self.setAttr('type', type_) 1403 if not cod: 1404 self.setName('stream:error') 1405 if txt: 1406 self.addChild(node=Node(ns + ' text', {}, [txt])) 1407 if cod: 1408 self.setAttr('code', cod)
1409
1410 -class Error(Protocol):
1411 """ 1412 Used to quickly transform received stanza into error reply 1413 """ 1414
1415 - def __init__(self, node, error, reply=1):
1416 """ 1417 Create error reply basing on the received 'node' stanza and the 'error' 1418 error condition 1419 1420 If the 'node' is not the received stanza but locally created ('to' and 1421 'from' fields needs not swapping) specify the 'reply' argument as false. 1422 """ 1423 if reply: 1424 Protocol.__init__(self, to=node.getFrom(), frm=node.getTo(), node=node) 1425 else: 1426 Protocol.__init__(self, node=node) 1427 self.setError(error) 1428 if node.getType() == 'error': 1429 self.__str__ = self.__dupstr__
1430
1431 - def __dupstr__(self, dup1=None, dup2=None):
1432 """ 1433 Dummy function used as preventor of creating error node in reply to error 1434 node. I.e. you will not be able to serialise "double" error into string. 1435 """ 1436 return ''
1437
1438 -class DataField(Node):
1439 """ 1440 This class is used in the DataForm class to describe the single data item 1441 1442 If you are working with jabber:x:data (XEP-0004, XEP-0068, XEP-0122) then 1443 you will need to work with instances of this class. 1444 """ 1445
1446 - def __init__(self, name=None, value=None, typ=None, required=0, desc=None, 1447 options=[], node=None):
1448 """ 1449 Create new data field of specified name,value and type 1450 1451 Also 'required','desc' and 'options' fields can be set. Alternatively 1452 other XML object can be passed in as the 'node' parameted 1453 to replicate it as a new datafiled. 1454 """ 1455 Node.__init__(self, 'field', node=node) 1456 if name: 1457 self.setVar(name) 1458 if isinstance(value, (list, tuple)): 1459 self.setValues(value) 1460 elif value: 1461 self.setValue(value) 1462 if typ: 1463 self.setType(typ) 1464 elif not typ and not node: 1465 self.setType('text-single') 1466 if required: 1467 self.setRequired(required) 1468 if desc: 1469 self.setDesc(desc) 1470 if options: 1471 self.setOptions(options)
1472
1473 - def setRequired(self, req=1):
1474 """ 1475 Change the state of the 'required' flag 1476 """ 1477 if req: 1478 self.setTag('required') 1479 else: 1480 try: 1481 self.delChild('required') 1482 except ValueError: 1483 return
1484
1485 - def isRequired(self):
1486 """ 1487 Return in this field a required one 1488 """ 1489 return self.getTag('required')
1490
1491 - def setDesc(self, desc):
1492 """ 1493 Set the description of this field 1494 """ 1495 self.setTagData('desc', desc)
1496
1497 - def getDesc(self):
1498 """ 1499 Return the description of this field 1500 """ 1501 return self.getTagData('desc')
1502
1503 - def setValue(self, val):
1504 """ 1505 Set the value of this field 1506 """ 1507 self.setTagData('value', val)
1508
1509 - def getValue(self):
1510 return self.getTagData('value')
1511
1512 - def setValues(self, lst):
1513 """ 1514 Set the values of this field as values-list. Replaces all previous filed 1515 values! If you need to just add a value - use addValue method 1516 """ 1517 while self.getTag('value'): 1518 self.delChild('value') 1519 for val in lst: 1520 self.addValue(val)
1521
1522 - def addValue(self, val):
1523 """ 1524 Add one more value to this field. Used in 'get' iq's or such 1525 """ 1526 self.addChild('value', {}, [val])
1527
1528 - def getValues(self):
1529 """ 1530 Return the list of values associated with this field 1531 """ 1532 ret = [] 1533 for tag in self.getTags('value'): 1534 ret.append(tag.getData()) 1535 return ret
1536
1537 - def getOptions(self):
1538 """ 1539 Return label-option pairs list associated with this field 1540 """ 1541 ret = [] 1542 for tag in self.getTags('option'): 1543 ret.append([tag.getAttr('label'), tag.getTagData('value')]) 1544 return ret
1545
1546 - def setOptions(self, lst):
1547 """ 1548 Set label-option pairs list associated with this field 1549 """ 1550 while self.getTag('option'): 1551 self.delChild('option') 1552 for opt in lst: 1553 self.addOption(opt)
1554
1555 - def addOption(self, opt):
1556 """ 1557 Add one more label-option pair to this field 1558 """ 1559 if isinstance(opt, basestring): 1560 self.addChild('option').setTagData('value', opt) 1561 else: 1562 self.addChild('option', {'label': opt[0]}).setTagData('value', 1563 opt[1])
1564
1565 - def getType(self):
1566 """ 1567 Get type of this field 1568 """ 1569 return self.getAttr('type')
1570
1571 - def setType(self, val):
1572 """ 1573 Set type of this field 1574 """ 1575 return self.setAttr('type', val)
1576
1577 - def getVar(self):
1578 """ 1579 Get 'var' attribute value of this field 1580 """ 1581 return self.getAttr('var')
1582
1583 - def setVar(self, val):
1584 """ 1585 Set 'var' attribute value of this field 1586 """ 1587 return self.setAttr('var', val)
1588
1589 -class DataForm(Node):
1590 """ 1591 Used for manipulating dataforms in XMPP 1592 1593 Relevant XEPs: 0004, 0068, 0122. Can be used in disco, pub-sub and many 1594 other applications. 1595 """
1596 - def __init__(self, typ=None, data=[], title=None, node=None):
1597 """ 1598 Create new dataform of type 'typ'. 'data' is the list of DataField 1599 instances that this dataform contains, 'title' - the title string. You 1600 can specify the 'node' argument as the other node to be used as base for 1601 constructing this dataform 1602 1603 title and instructions is optional and SHOULD NOT contain newlines. 1604 Several instructions MAY be present. 1605 'typ' can be one of ('form' | 'submit' | 'cancel' | 'result' ) 1606 'typ' of reply iq can be ( 'result' | 'set' | 'set' | 'result' ) respectively. 1607 'cancel' form can not contain any fields. All other forms contains AT LEAST one field. 1608 'title' MAY be included in forms of type "form" and "result" 1609 """ 1610 Node.__init__(self, 'x', node=node) 1611 if node: 1612 newkids = [] 1613 for n in self.getChildren(): 1614 if n.getName() == 'field': 1615 newkids.append(DataField(node=n)) 1616 else: 1617 newkids.append(n) 1618 self.kids = newkids 1619 if typ: 1620 self.setType(typ) 1621 self.setNamespace(NS_DATA) 1622 if title: 1623 self.setTitle(title) 1624 if isinstance(data, dict): 1625 newdata = [] 1626 for name in data.keys(): 1627 newdata.append(DataField(name, data[name])) 1628 data = newdata 1629 for child in data: 1630 if isinstance(child, basestring): 1631 self.addInstructions(child) 1632 elif child.__class__.__name__ == 'DataField': 1633 self.kids.append(child) 1634 else: 1635 self.kids.append(DataField(node=child))
1636
1637 - def getType(self):
1638 """ 1639 Return the type of dataform 1640 """ 1641 return self.getAttr('type')
1642
1643 - def setType(self, typ):
1644 """ 1645 Set the type of dataform 1646 """ 1647 self.setAttr('type', typ)
1648
1649 - def getTitle(self):
1650 """ 1651 Return the title of dataform 1652 """ 1653 return self.getTagData('title')
1654
1655 - def setTitle(self, text):
1656 """ 1657 Set the title of dataform 1658 """ 1659 self.setTagData('title', text)
1660
1661 - def getInstructions(self):
1662 """ 1663 Return the instructions of dataform 1664 """ 1665 return self.getTagData('instructions')
1666
1667 - def setInstructions(self, text):
1668 """ 1669 Set the instructions of dataform 1670 """ 1671 self.setTagData('instructions', text)
1672
1673 - def addInstructions(self, text):
1674 """ 1675 Add one more instruction to the dataform 1676 """ 1677 self.addChild('instructions', {}, [text])
1678
1679 - def getField(self, name):
1680 """ 1681 Return the datafield object with name 'name' (if exists) 1682 """ 1683 return self.getTag('field', attrs={'var': name})
1684
1685 - def setField(self, name):
1686 """ 1687 Create if nessessary or get the existing datafield object with name 1688 'name' and return it 1689 """ 1690 f = self.getField(name) 1691 if f: 1692 return f 1693 return self.addChild(node=DataField(name))
1694
1695 - def asDict(self):
1696 """ 1697 Represent dataform as simple dictionary mapping of datafield names to 1698 their values 1699 """ 1700 ret = {} 1701 for field in self.getTags('field'): 1702 name = field.getAttr('var') 1703 typ = field.getType() 1704 if isinstance(typ, basestring) and typ.endswith('-multi'): 1705 val = [] 1706 for i in field.getTags('value'): 1707 val.append(i.getData()) 1708 else: 1709 val = field.getTagData('value') 1710 ret[name] = val 1711 if self.getTag('instructions'): 1712 ret['instructions'] = self.getInstructions() 1713 return ret
1714
1715 - def __getitem__(self, name):
1716 """ 1717 Simple dictionary interface for getting datafields values by their names 1718 """ 1719 item = self.getField(name) 1720 if item: 1721 return item.getValue() 1722 raise IndexError('No such field')
1723
1724 - def __setitem__(self, name, val):
1725 """ 1726 Simple dictionary interface for setting datafields values by their names 1727 """ 1728 return self.setField(name).setValue(val)
1729

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.Acks-class.html000066400000000000000000000620011343257752000261360ustar00rootroot00000000000000 nbxmpp.protocol.Acks
Package nbxmpp :: Module protocol :: Class Acks
[hide private]
[frames] | no frames]

Class Acks

source code


Acknowledgement elements for Stream Management
Instance Methods [hide private]
 
__init__(self, nsp='urn:xmpp:sm:2')
Takes "tag" argument as the name of node (prepended by namespace, if needed and separated from it by a space), attrs dictionary as the set of arguments, payload list as the set of textual strings and child nodes that this node carries within itself and "parent" argument that is another node that this one will be the child of. Also the __init__ can be provided with "node" argument that is either a text string containing exactly one node or another Node instance to begin with. If both "node" and other arguments is provided then the node initially created as replica of "node" provided and then modified to be compliant with other arguments.
source code
 
buildAnswer(self, handled)
handled is the number of stanzas handled
source code
 
buildRequest(self) source code
 
buildEnable(self, resume=False) source code
 
buildResume(self, handled, previd) source code

Inherited from simplexml.Node: __contains__, __delitem__, __getattr__, __getitem__, __setitem__, __str__, addChild, addData, clearData, delAttr, delChild, getAttr, getAttrs, getChildren, getData, getName, getNamespace, getParent, getPayload, getTag, getTagAttr, getTagData, getTags, has_attr, iterTags, lookup_nsp, setAttr, setData, setName, setNamespace, setParent, setPayload, setTag, setTagAttr, setTagData

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]

Inherited from simplexml.Node: FORCE_NODE_RECREATION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, nsp='urn:xmpp:sm:2')
(Constructor)

source code 
Takes "tag" argument as the name of node (prepended by namespace, if needed and separated from it by a space), attrs dictionary as the set of arguments, payload list as the set of textual strings and child nodes that this node carries within itself and "parent" argument that is another node that this one will be the child of. Also the __init__ can be provided with "node" argument that is either a text string containing exactly one node or another Node instance to begin with. If both "node" and other arguments is provided then the node initially created as replica of "node" provided and then modified to be compliant with other arguments.
Overrides: object.__init__
(inherited documentation)

buildAnswer(self, handled)

source code 
handled is the number of stanzas handled

buildRequest(self)

source code 

buildEnable(self, resume=False)

source code 

buildResume(self, handled, previd)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.BOSHBody-class.html000066400000000000000000000465141343257752000266410ustar00rootroot00000000000000 nbxmpp.protocol.BOSHBody
Package nbxmpp :: Module protocol :: Class BOSHBody
[hide private]
[frames] | no frames]

Class BOSHBody

source code


<body> tag that wraps usual XMPP stanzas in XMPP over BOSH
Instance Methods [hide private]
 
__init__(self, attrs={}, payload=[], node=None)
Takes "tag" argument as the name of node (prepended by namespace, if needed and separated from it by a space), attrs dictionary as the set of arguments, payload list as the set of textual strings and child nodes that this node carries within itself and "parent" argument that is another node that this one will be the child of. Also the __init__ can be provided with "node" argument that is either a text string containing exactly one node or another Node instance to begin with. If both "node" and other arguments is provided then the node initially created as replica of "node" provided and then modified to be compliant with other arguments.
source code

Inherited from simplexml.Node: __contains__, __delitem__, __getattr__, __getitem__, __setitem__, __str__, addChild, addData, clearData, delAttr, delChild, getAttr, getAttrs, getChildren, getData, getName, getNamespace, getParent, getPayload, getTag, getTagAttr, getTagData, getTags, has_attr, iterTags, lookup_nsp, setAttr, setData, setName, setNamespace, setParent, setPayload, setTag, setTagAttr, setTagData

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]

Inherited from simplexml.Node: FORCE_NODE_RECREATION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, attrs={}, payload=[], node=None)
(Constructor)

source code 
Takes "tag" argument as the name of node (prepended by namespace, if needed and separated from it by a space), attrs dictionary as the set of arguments, payload list as the set of textual strings and child nodes that this node carries within itself and "parent" argument that is another node that this one will be the child of. Also the __init__ can be provided with "node" argument that is either a text string containing exactly one node or another Node instance to begin with. If both "node" and other arguments is provided then the node initially created as replica of "node" provided and then modified to be compliant with other arguments.
Overrides: object.__init__
(inherited documentation)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.BadFormat-class.html000066400000000000000000000226111343257752000271170ustar00rootroot00000000000000 nbxmpp.protocol.BadFormat
Package nbxmpp :: Module protocol :: Class BadFormat
[hide private]
[frames] | no frames]

Class BadFormat

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.BadNamespacePrefix-class.html000066400000000000000000000227101343257752000307410ustar00rootroot00000000000000 nbxmpp.protocol.BadNamespacePrefix
Package nbxmpp :: Module protocol :: Class BadNamespacePrefix
[hide private]
[frames] | no frames]

Class BadNamespacePrefix

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.Conflict-class.html000066400000000000000000000226021343257752000270210ustar00rootroot00000000000000 nbxmpp.protocol.Conflict
Package nbxmpp :: Module protocol :: Class Conflict
[hide private]
[frames] | no frames]

Class Conflict

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.ConnectionTimeout-class.html000066400000000000000000000227011343257752000307260ustar00rootroot00000000000000 nbxmpp.protocol.ConnectionTimeout
Package nbxmpp :: Module protocol :: Class ConnectionTimeout
[hide private]
[frames] | no frames]

Class ConnectionTimeout

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.DataField-class.html000066400000000000000000001254621343257752000271050ustar00rootroot00000000000000 nbxmpp.protocol.DataField
Package nbxmpp :: Module protocol :: Class DataField
[hide private]
[frames] | no frames]

Class DataField

source code


This class is used in the DataForm class to describe the single data item

If you are working with jabber:x:data (XEP-0004, XEP-0068, XEP-0122) then you will need to work with instances of this class.

Instance Methods [hide private]
 
__init__(self, name=None, value=None, typ=None, required=0, desc=None, options=[], node=None)
Create new data field of specified name,value and type
source code
 
setRequired(self, req=1)
Change the state of the 'required' flag
source code
 
isRequired(self)
Return in this field a required one
source code
 
setDesc(self, desc)
Set the description of this field
source code
 
getDesc(self)
Return the description of this field
source code
 
setValue(self, val)
Set the value of this field
source code
 
getValue(self) source code
 
setValues(self, lst)
Set the values of this field as values-list. Replaces all previous filed values! If you need to just add a value - use addValue method
source code
 
addValue(self, val)
Add one more value to this field. Used in 'get' iq's or such
source code
 
getValues(self)
Return the list of values associated with this field
source code
 
getOptions(self)
Return label-option pairs list associated with this field
source code
 
setOptions(self, lst)
Set label-option pairs list associated with this field
source code
 
addOption(self, opt)
Add one more label-option pair to this field
source code
 
getType(self)
Get type of this field
source code
 
setType(self, val)
Set type of this field
source code
 
getVar(self)
Get 'var' attribute value of this field
source code
 
setVar(self, val)
Set 'var' attribute value of this field
source code

Inherited from simplexml.Node: __contains__, __delitem__, __getattr__, __getitem__, __setitem__, __str__, addChild, addData, clearData, delAttr, delChild, getAttr, getAttrs, getChildren, getData, getName, getNamespace, getParent, getPayload, getTag, getTagAttr, getTagData, getTags, has_attr, iterTags, lookup_nsp, setAttr, setData, setName, setNamespace, setParent, setPayload, setTag, setTagAttr, setTagData

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]

Inherited from simplexml.Node: FORCE_NODE_RECREATION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, name=None, value=None, typ=None, required=0, desc=None, options=[], node=None)
(Constructor)

source code 

Create new data field of specified name,value and type

Also 'required','desc' and 'options' fields can be set. Alternatively other XML object can be passed in as the 'node' parameted to replicate it as a new datafiled.

Overrides: object.__init__

setRequired(self, req=1)

source code 
Change the state of the 'required' flag

isRequired(self)

source code 
Return in this field a required one

setDesc(self, desc)

source code 
Set the description of this field

getDesc(self)

source code 
Return the description of this field

setValue(self, val)

source code 
Set the value of this field

getValue(self)

source code 

setValues(self, lst)

source code 
Set the values of this field as values-list. Replaces all previous filed values! If you need to just add a value - use addValue method

addValue(self, val)

source code 
Add one more value to this field. Used in 'get' iq's or such

getValues(self)

source code 
Return the list of values associated with this field

getOptions(self)

source code 
Return label-option pairs list associated with this field

setOptions(self, lst)

source code 
Set label-option pairs list associated with this field

addOption(self, opt)

source code 
Add one more label-option pair to this field

getType(self)

source code 
Get type of this field

setType(self, val)

source code 
Set type of this field

getVar(self)

source code 
Get 'var' attribute value of this field

setVar(self, val)

source code 
Set 'var' attribute value of this field

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.DataForm-class.html000066400000000000000000001134051343257752000267570ustar00rootroot00000000000000 nbxmpp.protocol.DataForm
Package nbxmpp :: Module protocol :: Class DataForm
[hide private]
[frames] | no frames]

Class DataForm

source code


Used for manipulating dataforms in XMPP

Relevant XEPs: 0004, 0068, 0122. Can be used in disco, pub-sub and many other applications.

Instance Methods [hide private]
 
__init__(self, typ=None, data=[], title=None, node=None)
Create new dataform of type 'typ'. 'data' is the list of DataField instances that this dataform contains, 'title' - the title string. You can specify the 'node' argument as the other node to be used as base for constructing this dataform
source code
 
getType(self)
Return the type of dataform
source code
 
setType(self, typ)
Set the type of dataform
source code
 
getTitle(self)
Return the title of dataform
source code
 
setTitle(self, text)
Set the title of dataform
source code
 
getInstructions(self)
Return the instructions of dataform
source code
 
setInstructions(self, text)
Set the instructions of dataform
source code
 
addInstructions(self, text)
Add one more instruction to the dataform
source code
 
getField(self, name)
Return the datafield object with name 'name' (if exists)
source code
 
setField(self, name)
Create if nessessary or get the existing datafield object with name 'name' and return it
source code
 
asDict(self)
Represent dataform as simple dictionary mapping of datafield names to their values
source code
 
__getitem__(self, name)
Simple dictionary interface for getting datafields values by their names
source code
 
__setitem__(self, name, val)
Simple dictionary interface for setting datafields values by their names
source code

Inherited from simplexml.Node: __contains__, __delitem__, __getattr__, __str__, addChild, addData, clearData, delAttr, delChild, getAttr, getAttrs, getChildren, getData, getName, getNamespace, getParent, getPayload, getTag, getTagAttr, getTagData, getTags, has_attr, iterTags, lookup_nsp, setAttr, setData, setName, setNamespace, setParent, setPayload, setTag, setTagAttr, setTagData

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]

Inherited from simplexml.Node: FORCE_NODE_RECREATION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, typ=None, data=[], title=None, node=None)
(Constructor)

source code 

Create new dataform of type 'typ'. 'data' is the list of DataField instances that this dataform contains, 'title' - the title string. You can specify the 'node' argument as the other node to be used as base for constructing this dataform

title and instructions is optional and SHOULD NOT contain newlines. Several instructions MAY be present. 'typ' can be one of ('form' | 'submit' | 'cancel' | 'result' ) 'typ' of reply iq can be ( 'result' | 'set' | 'set' | 'result' ) respectively. 'cancel' form can not contain any fields. All other forms contains AT LEAST one field. 'title' MAY be included in forms of type "form" and "result"

Overrides: object.__init__

getType(self)

source code 
Return the type of dataform

setType(self, typ)

source code 
Set the type of dataform

getTitle(self)

source code 
Return the title of dataform

setTitle(self, text)

source code 
Set the title of dataform

getInstructions(self)

source code 
Return the instructions of dataform

setInstructions(self, text)

source code 
Set the instructions of dataform

addInstructions(self, text)

source code 
Add one more instruction to the dataform

getField(self, name)

source code 
Return the datafield object with name 'name' (if exists)

setField(self, name)

source code 
Create if nessessary or get the existing datafield object with name 'name' and return it

asDict(self)

source code 
Represent dataform as simple dictionary mapping of datafield names to their values

__getitem__(self, name)
(Indexing operator)

source code 
Simple dictionary interface for getting datafields values by their names
Overrides: simplexml.Node.__getitem__

__setitem__(self, name, val)
(Index assignment operator)

source code 
Simple dictionary interface for setting datafields values by their names
Overrides: simplexml.Node.__setitem__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.Error-class.html000066400000000000000000000572161343257752000263620ustar00rootroot00000000000000 nbxmpp.protocol.Error
Package nbxmpp :: Module protocol :: Class Error
[hide private]
[frames] | no frames]

Class Error

source code


Used to quickly transform received stanza into error reply
Instance Methods [hide private]
 
__init__(self, node, error, reply=1)
Create error reply basing on the received 'node' stanza and the 'error' error condition
source code
 
__dupstr__(self, dup1=None, dup2=None)
Dummy function used as preventor of creating error node in reply to error node. I.e. you will not be able to serialise "double" error into string.
source code

Inherited from Protocol: __setitem__, getError, getErrorCode, getErrorMsg, getFrom, getID, getProperties, getStatusConditions, getTimestamp, getTimestamp2, getTo, getType, setError, setFrom, setID, setTimestamp, setTo, setType

Inherited from simplexml.Node: __contains__, __delitem__, __getattr__, __getitem__, __str__, addChild, addData, clearData, delAttr, delChild, getAttr, getAttrs, getChildren, getData, getName, getNamespace, getParent, getPayload, getTag, getTagAttr, getTagData, getTags, has_attr, iterTags, lookup_nsp, setAttr, setData, setName, setNamespace, setParent, setPayload, setTag, setTagAttr, setTagData

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]

Inherited from simplexml.Node: FORCE_NODE_RECREATION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, node, error, reply=1)
(Constructor)

source code 

Create error reply basing on the received 'node' stanza and the 'error' error condition

If the 'node' is not the received stanza but locally created ('to' and 'from' fields needs not swapping) specify the 'reply' argument as false.

Overrides: object.__init__

__dupstr__(self, dup1=None, dup2=None)

source code 
Dummy function used as preventor of creating error node in reply to error node. I.e. you will not be able to serialise "double" error into string.

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.ErrorNode-class.html000066400000000000000000000430751343257752000271660ustar00rootroot00000000000000 nbxmpp.protocol.ErrorNode
Package nbxmpp :: Module protocol :: Class ErrorNode
[hide private]
[frames] | no frames]

Class ErrorNode

source code


XMPP-style error element

In the case of stanza error should be attached to XMPP stanza. In the case of stream-level errors should be used separately.

Instance Methods [hide private]
 
__init__(self, name, code=None, typ=None, text=None)
Mandatory parameter: name - name of error condition. Optional parameters: code, typ, text. Used for backwards compartibility with older jabber protocol.
source code

Inherited from simplexml.Node: __contains__, __delitem__, __getattr__, __getitem__, __setitem__, __str__, addChild, addData, clearData, delAttr, delChild, getAttr, getAttrs, getChildren, getData, getName, getNamespace, getParent, getPayload, getTag, getTagAttr, getTagData, getTags, has_attr, iterTags, lookup_nsp, setAttr, setData, setName, setNamespace, setParent, setPayload, setTag, setTagAttr, setTagData

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]

Inherited from simplexml.Node: FORCE_NODE_RECREATION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, name, code=None, typ=None, text=None)
(Constructor)

source code 
Mandatory parameter: name - name of error condition. Optional parameters: code, typ, text. Used for backwards compartibility with older jabber protocol.
Overrides: object.__init__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.Hashes-class.html000066400000000000000000000623041343257752000264760ustar00rootroot00000000000000 nbxmpp.protocol.Hashes
Package nbxmpp :: Module protocol :: Class Hashes
[hide private]
[frames] | no frames]

Class Hashes

source code


Hash elements for various XEPs as defined in XEP-300
Instance Methods [hide private]
 
__init__(self, nsp='urn:xmpp:hashes:1')
Takes "tag" argument as the name of node (prepended by namespace, if needed and separated from it by a space), attrs dictionary as the set of arguments, payload list as the set of textual strings and child nodes that this node carries within itself and "parent" argument that is another node that this one will be the child of. Also the __init__ can be provided with "node" argument that is either a text string containing exactly one node or another Node instance to begin with. If both "node" and other arguments is provided then the node initially created as replica of "node" provided and then modified to be compliant with other arguments.
source code
 
calculateHash(self, algo, file_string)
Calculate the hash and add it. It is preferable doing it here instead of doing it all over the place in Gajim.
source code
 
addHash(self, hash_, algo) source code

Inherited from simplexml.Node: __contains__, __delitem__, __getattr__, __getitem__, __setitem__, __str__, addChild, addData, clearData, delAttr, delChild, getAttr, getAttrs, getChildren, getData, getName, getNamespace, getParent, getPayload, getTag, getTagAttr, getTagData, getTags, has_attr, iterTags, lookup_nsp, setAttr, setData, setName, setNamespace, setParent, setPayload, setTag, setTagAttr, setTagData

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]
  supported = ('md5', 'sha-1', 'sha-256', 'sha-512')

Inherited from simplexml.Node: FORCE_NODE_RECREATION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, nsp='urn:xmpp:hashes:1')
(Constructor)

source code 
Takes "tag" argument as the name of node (prepended by namespace, if needed and separated from it by a space), attrs dictionary as the set of arguments, payload list as the set of textual strings and child nodes that this node carries within itself and "parent" argument that is another node that this one will be the child of. Also the __init__ can be provided with "node" argument that is either a text string containing exactly one node or another Node instance to begin with. If both "node" and other arguments is provided then the node initially created as replica of "node" provided and then modified to be compliant with other arguments.
Overrides: object.__init__
(inherited documentation)

calculateHash(self, algo, file_string)

source code 
Calculate the hash and add it. It is preferable doing it here instead of doing it all over the place in Gajim.

addHash(self, hash_, algo)

source code 

Class Variable Details [hide private]

supported

Value:
('md5', 'sha-1', 'sha-256', 'sha-512')

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.HostGone-class.html000066400000000000000000000226061343257752000270120ustar00rootroot00000000000000 nbxmpp.protocol.HostGone
Package nbxmpp :: Module protocol :: Class HostGone
[hide private]
[frames] | no frames]

Class HostGone

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.HostUnknown-class.html000066400000000000000000000226331343257752000275610ustar00rootroot00000000000000 nbxmpp.protocol.HostUnknown
Package nbxmpp :: Module protocol :: Class HostUnknown
[hide private]
[frames] | no frames]

Class HostUnknown

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.ImproperAddressing-class.html000066400000000000000000000227141343257752000310650ustar00rootroot00000000000000 nbxmpp.protocol.ImproperAddressing
Package nbxmpp :: Module protocol :: Class ImproperAddressing
[hide private]
[frames] | no frames]

Class ImproperAddressing

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.InternalServerError-class.html000066400000000000000000000227231343257752000312410ustar00rootroot00000000000000 nbxmpp.protocol.InternalServerError
Package nbxmpp :: Module protocol :: Class InternalServerError
[hide private]
[frames] | no frames]

Class InternalServerError

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.InvalidFrom-class.html000066400000000000000000000226331343257752000274760ustar00rootroot00000000000000 nbxmpp.protocol.InvalidFrom
Package nbxmpp :: Module protocol :: Class InvalidFrom
[hide private]
[frames] | no frames]

Class InvalidFrom

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.InvalidID-class.html000066400000000000000000000226151343257752000270670ustar00rootroot00000000000000 nbxmpp.protocol.InvalidID
Package nbxmpp :: Module protocol :: Class InvalidID
[hide private]
[frames] | no frames]

Class InvalidID

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.InvalidNamespace-class.html000066400000000000000000000227121343257752000304650ustar00rootroot00000000000000 nbxmpp.protocol.InvalidNamespace
Package nbxmpp :: Module protocol :: Class InvalidNamespace
[hide private]
[frames] | no frames]

Class InvalidNamespace

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.InvalidXML-class.html000066400000000000000000000226421343257752000272330ustar00rootroot00000000000000 nbxmpp.protocol.InvalidXML
Package nbxmpp :: Module protocol :: Class InvalidXML
[hide private]
[frames] | no frames]

Class InvalidXML

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.Iq-class.html000066400000000000000000001170541343257752000256370ustar00rootroot00000000000000 nbxmpp.protocol.Iq
Package nbxmpp :: Module protocol :: Class Iq
[hide private]
[frames] | no frames]

Class Iq

source code


XMPP Iq object - get/set dialog mechanism
Instance Methods [hide private]
 
__init__(self, typ=None, queryNS=None, attrs={}, to=None, frm=None, payload=[], xmlns='jabber:client', node=None)
You can specify type, query namespace any additional attributes, recipient of the iq, sender of the iq, any additional payload (f.e. jabber:x:data node) and namespace in one go.
source code
 
getQuery(self)
Return the IQ's child element if it exists, None otherwise.
source code
 
getQueryNS(self)
Return the namespace of the 'query' child element
source code
 
getQuerynode(self)
Return the 'node' attribute value of the 'query' child element
source code
 
getQueryPayload(self)
Return the 'query' child element payload
source code
 
getQueryChildren(self)
Return the 'query' child element child nodes
source code
 
setQuery(self, name=None)
Change the name of the query node, creating it if needed. Keep the existing name if none is given (use 'query' if it's a creation). Return the query node.
source code
 
setQueryNS(self, namespace)
Set the namespace of the 'query' child element
source code
 
setQueryPayload(self, payload)
Set the 'query' child element payload
source code
 
setQuerynode(self, node)
Set the 'node' attribute value of the 'query' child element
source code
 
buildReply(self, typ)
Build and return another Iq object of specified type. The to, from and query child node of new Iq are pre-set as reply to this Iq.
source code

Inherited from Protocol: __setitem__, getError, getErrorCode, getErrorMsg, getFrom, getID, getProperties, getStatusConditions, getTimestamp, getTimestamp2, getTo, getType, setError, setFrom, setID, setTimestamp, setTo, setType

Inherited from simplexml.Node: __contains__, __delitem__, __getattr__, __getitem__, __str__, addChild, addData, clearData, delAttr, delChild, getAttr, getAttrs, getChildren, getData, getName, getNamespace, getParent, getPayload, getTag, getTagAttr, getTagData, getTags, has_attr, iterTags, lookup_nsp, setAttr, setData, setName, setNamespace, setParent, setPayload, setTag, setTagAttr, setTagData

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]

Inherited from simplexml.Node: FORCE_NODE_RECREATION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, typ=None, queryNS=None, attrs={}, to=None, frm=None, payload=[], xmlns='jabber:client', node=None)
(Constructor)

source code 

You can specify type, query namespace any additional attributes, recipient of the iq, sender of the iq, any additional payload (f.e. jabber:x:data node) and namespace in one go.

Alternatively you can pass in the other XML object as the 'node' parameted to replicate it as an iq

Overrides: object.__init__

getQuery(self)

source code 
Return the IQ's child element if it exists, None otherwise.

getQueryNS(self)

source code 
Return the namespace of the 'query' child element

getQuerynode(self)

source code 
Return the 'node' attribute value of the 'query' child element

getQueryPayload(self)

source code 
Return the 'query' child element payload

getQueryChildren(self)

source code 
Return the 'query' child element child nodes

setQuery(self, name=None)

source code 
Change the name of the query node, creating it if needed. Keep the existing name if none is given (use 'query' if it's a creation). Return the query node.

setQueryNS(self, namespace)

source code 
Set the namespace of the 'query' child element

setQueryPayload(self, payload)

source code 
Set the 'query' child element payload

setQuerynode(self, node)

source code 
Set the 'node' attribute value of the 'query' child element

buildReply(self, typ)

source code 
Build and return another Iq object of specified type. The to, from and query child node of new Iq are pre-set as reply to this Iq.

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.JID-class.html000066400000000000000000000630661343257752000256770ustar00rootroot00000000000000 nbxmpp.protocol.JID
Package nbxmpp :: Module protocol :: Class JID
[hide private]
[frames] | no frames]

Class JID

source code

JID can be built from string, modified, compared, serialised into string
Instance Methods [hide private]
 
__init__(self, jid=None, node='', domain='', resource='')
JID can be specified as string (jid argument) or as separate parts
source code
 
getNode(self)
Return the node part of the JID
source code
 
setNode(self, node)
Set the node part of the JID to new value. Specify None to remove the node part
source code
 
getDomain(self)
Return the domain part of the JID
source code
 
setDomain(self, domain)
Set the domain part of the JID to new value
source code
 
getResource(self)
Return the resource part of the JID
source code
 
setResource(self, resource)
Set the resource part of the JID to new value. Specify None to remove the resource part
source code
 
getStripped(self)
Return the bare representation of JID. I.e. string value w/o resource
source code
 
__eq__(self, other)
Compare the JID to another instance or to string for equality
source code
 
__ne__(self, other)
Compare the JID to another instance or to string for non-equality
source code
 
bareMatch(self, other)
Compare the node and domain parts of the JID's for equality
source code
 
__str__(self, wresource=1)
Serialise JID into string
source code
 
__hash__(self)
Produce hash of the JID, Allows to use JID objects as keys of the dictionary
source code
Method Details [hide private]

__init__(self, jid=None, node='', domain='', resource='')
(Constructor)

source code 

JID can be specified as string (jid argument) or as separate parts

Examples: JID('node@domain/resource') JID(node='node',domain='domain.org')

getNode(self)

source code 
Return the node part of the JID

setNode(self, node)

source code 
Set the node part of the JID to new value. Specify None to remove the node part

getDomain(self)

source code 
Return the domain part of the JID

setDomain(self, domain)

source code 
Set the domain part of the JID to new value

getResource(self)

source code 
Return the resource part of the JID

setResource(self, resource)

source code 
Set the resource part of the JID to new value. Specify None to remove the resource part

getStripped(self)

source code 
Return the bare representation of JID. I.e. string value w/o resource

__eq__(self, other)
(Equality operator)

source code 
Compare the JID to another instance or to string for equality

__ne__(self, other)

source code 
Compare the JID to another instance or to string for non-equality

bareMatch(self, other)

source code 
Compare the node and domain parts of the JID's for equality

__str__(self, wresource=1)
(Informal representation operator)

source code 
Serialise JID into string

__hash__(self)
(Hashing function)

source code 
Produce hash of the JID, Allows to use JID objects as keys of the dictionary

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.Message-class.html000066400000000000000000001202221343257752000266410ustar00rootroot00000000000000 nbxmpp.protocol.Message
Package nbxmpp :: Module protocol :: Class Message
[hide private]
[frames] | no frames]

Class Message

source code


XMPP Message stanza - "push" mechanism
Instance Methods [hide private]
 
__init__(self, to=None, body=None, xhtml=None, typ=None, subject=None, attrs={}, frm=None, payload=[], timestamp=None, xmlns='jabber:client', node=None)
You can specify recipient, text of message, type of message any additional attributes, sender of the message, any additional payload (f.e. jabber:x:delay element) and namespace in one go.
source code
 
getBody(self)
Return text of the message
source code
 
getXHTML(self, xmllang=None)
Return serialized xhtml-im element text of the message
source code
 
getSubject(self)
Return subject of the message
source code
 
getThread(self)
Return thread of the message
source code
 
setBody(self, val)
Set the text of the message
source code
 
setXHTML(self, val, xmllang=None)
Sets the xhtml text of the message (XEP-0071). The parameter is the "inner html" to the body.
source code
 
setSubject(self, val)
Set the subject of the message
source code
 
setThread(self, val)
Set the thread of the message
source code
 
buildReply(self, text=None)
Builds and returns another message object with specified text. The to, from, thread and type properties of new message are pre-set as reply to this message
source code
 
getStatusCode(self)
Return the status code of the message (for groupchat config change)
source code

Inherited from Protocol: __setitem__, getError, getErrorCode, getErrorMsg, getFrom, getID, getProperties, getStatusConditions, getTimestamp, getTimestamp2, getTo, getType, setError, setFrom, setID, setTimestamp, setTo, setType

Inherited from simplexml.Node: __contains__, __delitem__, __getattr__, __getitem__, __str__, addChild, addData, clearData, delAttr, delChild, getAttr, getAttrs, getChildren, getData, getName, getNamespace, getParent, getPayload, getTag, getTagAttr, getTagData, getTags, has_attr, iterTags, lookup_nsp, setAttr, setData, setName, setNamespace, setParent, setPayload, setTag, setTagAttr, setTagData

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]

Inherited from simplexml.Node: FORCE_NODE_RECREATION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, to=None, body=None, xhtml=None, typ=None, subject=None, attrs={}, frm=None, payload=[], timestamp=None, xmlns='jabber:client', node=None)
(Constructor)

source code 

You can specify recipient, text of message, type of message any additional attributes, sender of the message, any additional payload (f.e. jabber:x:delay element) and namespace in one go.

Alternatively you can pass in the other XML object as the 'node' parameted to replicate it as message

Overrides: object.__init__

getBody(self)

source code 
Return text of the message

getXHTML(self, xmllang=None)

source code 

Return serialized xhtml-im element text of the message

TODO: Returning a DOM could make rendering faster.

getSubject(self)

source code 
Return subject of the message

getThread(self)

source code 
Return thread of the message

setBody(self, val)

source code 
Set the text of the message

setXHTML(self, val, xmllang=None)

source code 
Sets the xhtml text of the message (XEP-0071). The parameter is the "inner html" to the body.

setSubject(self, val)

source code 
Set the subject of the message

setThread(self, val)

source code 
Set the thread of the message

buildReply(self, text=None)

source code 
Builds and returns another message object with specified text. The to, from, thread and type properties of new message are pre-set as reply to this message

getStatusCode(self)

source code 
Return the status code of the message (for groupchat config change)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.NodeProcessed-class.html000066400000000000000000000226341343257752000300220ustar00rootroot00000000000000 nbxmpp.protocol.NodeProcessed
Package nbxmpp :: Module protocol :: Class NodeProcessed
[hide private]
[frames] | no frames]

Class NodeProcessed

source code


Exception that should be raised by handler when the handling should be stopped
Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.NotAuthorized-class.html000066400000000000000000000226671343257752000300720ustar00rootroot00000000000000 nbxmpp.protocol.NotAuthorized
Package nbxmpp :: Module protocol :: Class NotAuthorized
[hide private]
[frames] | no frames]

Class NotAuthorized

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.PolicyViolation-class.html000066400000000000000000000227051343257752000304100ustar00rootroot00000000000000 nbxmpp.protocol.PolicyViolation
Package nbxmpp :: Module protocol :: Class PolicyViolation
[hide private]
[frames] | no frames]

Class PolicyViolation

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.Presence-class.html000066400000000000000000001356421343257752000270350ustar00rootroot00000000000000 nbxmpp.protocol.Presence
Package nbxmpp :: Module protocol :: Class Presence
[hide private]
[frames] | no frames]

Class Presence

source code


Instance Methods [hide private]
 
__init__(self, to=None, typ=None, priority=None, show=None, status=None, attrs={}, frm=None, timestamp=None, payload=[], xmlns='jabber:client', node=None)
You can specify recipient, type of message, priority, show and status values any additional attributes, sender of the presence, timestamp, any additional payload (f.e. jabber:x:delay element) and namespace in one go. Alternatively you can pass in the other XML object as the 'node' parameted to replicate it as presence
source code
 
getPriority(self)
Return the priority of the message
source code
 
getShow(self)
Return the show value of the message
source code
 
getStatus(self)
Return the status string of the message
source code
 
setPriority(self, val)
Set the priority of the message
source code
 
setShow(self, val)
Set the show value of the message
source code
 
setStatus(self, val)
Set the status string of the message
source code
 
_muc_getItemAttr(self, tag, attr) source code
 
_muc_getSubTagDataAttr(self, tag, attr) source code
 
getRole(self)
Return the presence role (for groupchat)
source code
 
getAffiliation(self)
Return the presence affiliation (for groupchat)
source code
 
getNewNick(self)
Return the status code of the presence (for groupchat)
source code
 
getJid(self)
Return the presence jid (for groupchat)
source code
 
getReason(self)
Returns the reason of the presence (for groupchat)
source code
 
getActor(self)
Return the reason of the presence (for groupchat)
source code
 
getStatusCode(self)
Return the status code of the presence (for groupchat)
source code

Inherited from Protocol: __setitem__, getError, getErrorCode, getErrorMsg, getFrom, getID, getProperties, getStatusConditions, getTimestamp, getTimestamp2, getTo, getType, setError, setFrom, setID, setTimestamp, setTo, setType

Inherited from simplexml.Node: __contains__, __delitem__, __getattr__, __getitem__, __str__, addChild, addData, clearData, delAttr, delChild, getAttr, getAttrs, getChildren, getData, getName, getNamespace, getParent, getPayload, getTag, getTagAttr, getTagData, getTags, has_attr, iterTags, lookup_nsp, setAttr, setData, setName, setNamespace, setParent, setPayload, setTag, setTagAttr, setTagData

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]

Inherited from simplexml.Node: FORCE_NODE_RECREATION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, to=None, typ=None, priority=None, show=None, status=None, attrs={}, frm=None, timestamp=None, payload=[], xmlns='jabber:client', node=None)
(Constructor)

source code 
You can specify recipient, type of message, priority, show and status values any additional attributes, sender of the presence, timestamp, any additional payload (f.e. jabber:x:delay element) and namespace in one go. Alternatively you can pass in the other XML object as the 'node' parameted to replicate it as presence
Overrides: object.__init__

getPriority(self)

source code 
Return the priority of the message

getShow(self)

source code 
Return the show value of the message

getStatus(self)

source code 
Return the status string of the message

setPriority(self, val)

source code 
Set the priority of the message

setShow(self, val)

source code 
Set the show value of the message

setStatus(self, val)

source code 
Set the status string of the message

_muc_getItemAttr(self, tag, attr)

source code 

_muc_getSubTagDataAttr(self, tag, attr)

source code 

getRole(self)

source code 
Return the presence role (for groupchat)

getAffiliation(self)

source code 
Return the presence affiliation (for groupchat)

getNewNick(self)

source code 
Return the status code of the presence (for groupchat)

getJid(self)

source code 
Return the presence jid (for groupchat)

getReason(self)

source code 
Returns the reason of the presence (for groupchat)

getActor(self)

source code 
Return the reason of the presence (for groupchat)

getStatusCode(self)

source code 
Return the status code of the presence (for groupchat)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.Protocol-class.html000066400000000000000000001364011343257752000270640ustar00rootroot00000000000000 nbxmpp.protocol.Protocol
Package nbxmpp :: Module protocol :: Class Protocol
[hide private]
[frames] | no frames]

Class Protocol

source code


A "stanza" object class. Contains methods that are common for presences, iqs and messages
Instance Methods [hide private]
 
__init__(self, name=None, to=None, typ=None, frm=None, attrs={}, payload=[], timestamp=None, xmlns=None, node=None)
Constructor, name is the name of the stanza i.e. 'message' or 'presence'or 'iq'
source code
 
getTo(self)
Return value of the 'to' attribute
source code
 
getFrom(self)
Return value of the 'from' attribute
source code
 
getTimestamp(self)
Return the timestamp in the 'yyyymmddThhmmss' format
source code
 
getTimestamp2(self)
Return the timestamp in the 'yyyymmddThhmmss' format
source code
 
getID(self)
Return the value of the 'id' attribute
source code
 
setTo(self, val)
Set the value of the 'to' attribute
source code
 
getType(self)
Return the value of the 'type' attribute
source code
 
setFrom(self, val)
Set the value of the 'from' attribute
source code
 
setType(self, val)
Set the value of the 'type' attribute
source code
 
setID(self, val)
Set the value of the 'id' attribute
source code
 
getError(self)
Return the error-condition (if present) or the textual description of the error (otherwise)
source code
 
getErrorMsg(self)
Return the textual description of the error (if present) or the error condition
source code
 
getErrorCode(self)
Return the error code. Obsolete.
source code
 
getStatusConditions(self)
Return the status conditions list as defined in XEP-0306.
source code
 
setError(self, error, code=None)
Set the error code. Obsolete. Use error-conditions instead
source code
 
setTimestamp(self, val=None)
Set the timestamp. timestamp should be the yyyymmddThhmmss string
source code
 
getProperties(self)
Return the list of namespaces to which belongs the direct childs of element
source code
 
__setitem__(self, item, val)
Set the item 'item' to the value 'val'
source code

Inherited from simplexml.Node: __contains__, __delitem__, __getattr__, __getitem__, __str__, addChild, addData, clearData, delAttr, delChild, getAttr, getAttrs, getChildren, getData, getName, getNamespace, getParent, getPayload, getTag, getTagAttr, getTagData, getTags, has_attr, iterTags, lookup_nsp, setAttr, setData, setName, setNamespace, setParent, setPayload, setTag, setTagAttr, setTagData

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]

Inherited from simplexml.Node: FORCE_NODE_RECREATION

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, name=None, to=None, typ=None, frm=None, attrs={}, payload=[], timestamp=None, xmlns=None, node=None)
(Constructor)

source code 

Constructor, name is the name of the stanza i.e. 'message' or 'presence'or 'iq'

to is the value of 'to' attribure, 'typ' - 'type' attribute frn - from attribure, attrs - other attributes mapping, payload - same meaning as for simplexml payload definition timestamp - the time value that needs to be stamped over stanza xmlns - namespace of top stanza node node - parsed or unparsed stana to be taken as prototype.

Overrides: object.__init__

getTo(self)

source code 
Return value of the 'to' attribute

getFrom(self)

source code 
Return value of the 'from' attribute

getTimestamp(self)

source code 
Return the timestamp in the 'yyyymmddThhmmss' format

getTimestamp2(self)

source code 
Return the timestamp in the 'yyyymmddThhmmss' format

getID(self)

source code 
Return the value of the 'id' attribute

setTo(self, val)

source code 
Set the value of the 'to' attribute

getType(self)

source code 
Return the value of the 'type' attribute

setFrom(self, val)

source code 
Set the value of the 'from' attribute

setType(self, val)

source code 
Set the value of the 'type' attribute

setID(self, val)

source code 
Set the value of the 'id' attribute

getError(self)

source code 
Return the error-condition (if present) or the textual description of the error (otherwise)

getErrorMsg(self)

source code 
Return the textual description of the error (if present) or the error condition

getErrorCode(self)

source code 
Return the error code. Obsolete.

getStatusConditions(self)

source code 
Return the status conditions list as defined in XEP-0306.

setError(self, error, code=None)

source code 
Set the error code. Obsolete. Use error-conditions instead

setTimestamp(self, val=None)

source code 
Set the timestamp. timestamp should be the yyyymmddThhmmss string

getProperties(self)

source code 
Return the list of namespaces to which belongs the direct childs of element

__setitem__(self, item, val)
(Index assignment operator)

source code 
Set the item 'item' to the value 'val'
Overrides: simplexml.Node.__setitem__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.RemoteConnectionFailed-class.html000066400000000000000000000227651343257752000316520ustar00rootroot00000000000000 nbxmpp.protocol.RemoteConnectionFailed
Package nbxmpp :: Module protocol :: Class RemoteConnectionFailed
[hide private]
[frames] | no frames]

Class RemoteConnectionFailed

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.ResourceConstraint-class.html000066400000000000000000000227321343257752000311200ustar00rootroot00000000000000 nbxmpp.protocol.ResourceConstraint
Package nbxmpp :: Module protocol :: Class ResourceConstraint
[hide private]
[frames] | no frames]

Class ResourceConstraint

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.RestrictedXML-class.html000066400000000000000000000226671343257752000277640ustar00rootroot00000000000000 nbxmpp.protocol.RestrictedXML
Package nbxmpp :: Module protocol :: Class RestrictedXML
[hide private]
[frames] | no frames]

Class RestrictedXML

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.SeeOtherHost-class.html000066400000000000000000000226601343257752000276400ustar00rootroot00000000000000 nbxmpp.protocol.SeeOtherHost
Package nbxmpp :: Module protocol :: Class SeeOtherHost
[hide private]
[frames] | no frames]

Class SeeOtherHost

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.StreamError-class.html000066400000000000000000000320111343257752000275200ustar00rootroot00000000000000 nbxmpp.protocol.StreamError
Package nbxmpp :: Module protocol :: Class StreamError
[hide private]
[frames] | no frames]

Class StreamError

source code


Base exception class for stream errors
Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.SystemShutdown-class.html000066400000000000000000000226761343257752000303130ustar00rootroot00000000000000 nbxmpp.protocol.SystemShutdown
Package nbxmpp :: Module protocol :: Class SystemShutdown
[hide private]
[frames] | no frames]

Class SystemShutdown

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.UndefinedCondition-class.html000066400000000000000000000227321343257752000310340ustar00rootroot00000000000000 nbxmpp.protocol.UndefinedCondition
Package nbxmpp :: Module protocol :: Class UndefinedCondition
[hide private]
[frames] | no frames]

Class UndefinedCondition

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.UnsupportedEncoding-class.html000066400000000000000000000227411343257752000312630ustar00rootroot00000000000000 nbxmpp.protocol.UnsupportedEncoding
Package nbxmpp :: Module protocol :: Class UnsupportedEncoding
[hide private]
[frames] | no frames]

Class UnsupportedEncoding

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.UnsupportedStanzaType-class.html000066400000000000000000000227571343257752000316460ustar00rootroot00000000000000 nbxmpp.protocol.UnsupportedStanzaType
Package nbxmpp :: Module protocol :: Class UnsupportedStanzaType
[hide private]
[frames] | no frames]

Class UnsupportedStanzaType

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.UnsupportedVersion-class.html000066400000000000000000000227321343257752000311620ustar00rootroot00000000000000 nbxmpp.protocol.UnsupportedVersion
Package nbxmpp :: Module protocol :: Class UnsupportedVersion
[hide private]
[frames] | no frames]

Class UnsupportedVersion

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.protocol.XMLNotWellFormed-class.html000066400000000000000000000227141343257752000303660ustar00rootroot00000000000000 nbxmpp.protocol.XMLNotWellFormed
Package nbxmpp :: Module protocol :: Class XMLNotWellFormed
[hide private]
[frames] | no frames]

Class XMLNotWellFormed

source code


Instance Methods [hide private]

Inherited from exceptions.Exception: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.proxy_connectors-module.html000066400000000000000000000225441343257752000272230ustar00rootroot00000000000000 nbxmpp.proxy_connectors
Package nbxmpp :: Module proxy_connectors
[hide private]
[frames] | no frames]

Module proxy_connectors

source code

Module containing classes for proxy connecting. So far its HTTP CONNECT and SOCKS5 proxy

Authentication to NTLM (Microsoft implementation) proxies can be next.

Classes [hide private]
  ProxyConnector
Interface for proxy-connecting object - when tunnneling XMPP over proxies, some connecting process usually has to be done before opening stream. Proxy connectors are used right after TCP connection is estabilished
  HTTPCONNECTConnector
  SOCKS5Connector
SOCKS5 proxy connection class. Allows to use SOCKS5 proxies with (optionally) simple authentication (only USERNAME/PASSWORD auth)
Variables [hide private]
  log = logging.getLogger('nbxmpp.proxy_connectors')
  __package__ = 'nbxmpp'

Imports: struct, socket, base64, logging


Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.proxy_connectors')

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.proxy_connectors-pysrc.html000066400000000000000000002240711343257752000270750ustar00rootroot00000000000000 nbxmpp.proxy_connectors
Package nbxmpp :: Module proxy_connectors
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.proxy_connectors

  1  ##   proxy_connectors.py 
  2  ##       based on transports_nb.py 
  3  ## 
  4  ##   Copyright (C) 2003-2004 Alexey "Snake" Nezhdanov 
  5  ##       modified by Dimitur Kirov <dkirov@gmail.com> 
  6  ##       modified by Tomas Karasek <tom.to.the.k@gmail.com> 
  7  ## 
  8  ##   This program is free software; you can redistribute it and/or modify 
  9  ##   it under the terms of the GNU General Public License as published by 
 10  ##   the Free Software Foundation; either version 2, or (at your option) 
 11  ##   any later version. 
 12  ## 
 13  ##   This program is distributed in the hope that it will be useful, 
 14  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
 15  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 16  ##   GNU General Public License for more details. 
 17   
 18  """ 
 19  Module containing classes for proxy connecting. So far its HTTP CONNECT and 
 20  SOCKS5 proxy 
 21   
 22  Authentication to NTLM (Microsoft implementation) proxies can be next. 
 23  """ 
 24   
 25  import struct, socket, base64 
 26  import logging 
 27  log = logging.getLogger('nbxmpp.proxy_connectors') 
28 29 -class ProxyConnector:
30 """ 31 Interface for proxy-connecting object - when tunnneling XMPP over proxies, 32 some connecting process usually has to be done before opening stream. Proxy 33 connectors are used right after TCP connection is estabilished 34 """ 35
36 - def __init__(self, send_method, onreceive, old_on_receive, on_success, 37 on_failure, xmpp_server, proxy_creds=(None, None)):
38 """ 39 Creates proxy connector, starts connecting immediately and gives control 40 back to transport afterwards 41 42 :param send_method: transport send method 43 :param onreceive: method to set on_receive callbacks 44 :param old_on_receive: on_receive callback that should be set when 45 proxy connection was successful 46 :param on_success: called after proxy connection was successfully opened 47 :param on_failure: called when errors occured while connecting 48 :param xmpp_server: tuple of (hostname, port) 49 :param proxy_creds: tuple of (proxy_user, proxy_credentials) 50 """ 51 self.send = send_method 52 self.onreceive = onreceive 53 self.old_on_receive = old_on_receive 54 self.on_success = on_success 55 self.on_failure = on_failure 56 self.xmpp_server = xmpp_server 57 self.proxy_user, self.proxy_pass = proxy_creds 58 self.old_on_receive = old_on_receive 59 60 self.start_connecting()
61 62 @classmethod
63 - def get_instance(cls, *args, **kwargs):
64 """ 65 Factory Method for object creation 66 67 Use this instead of directly initializing the class in order to make unit 68 testing much easier. 69 """ 70 return cls(*args, **kwargs)
71
72 - def start_connecting(self):
73 raise NotImplementedError
74
75 - def connecting_over(self):
76 self.onreceive(self.old_on_receive) 77 self.on_success()
78
79 -class HTTPCONNECTConnector(ProxyConnector):
80 - def start_connecting(self):
81 """ 82 Connect to a proxy, supply login and password to it (if were specified 83 while creating instance). Instruct proxy to make connection to the target 84 server. 85 """ 86 log.info('Proxy server contacted, performing authentification') 87 connector = ['CONNECT %s:%s HTTP/1.1' % self.xmpp_server, 88 'Proxy-Connection: Keep-Alive', 89 'Pragma: no-cache', 90 'Host: %s:%s' % self.xmpp_server, 91 'User-Agent: Gajim'] 92 if self.proxy_user and self.proxy_pass: 93 credentials = '%s:%s' % (self.proxy_user, self.proxy_pass) 94 credentials = base64.encodestring(credentials).strip() 95 connector.append('Proxy-Authorization: Basic '+credentials) 96 connector.append('\r\n') 97 self.onreceive(self._on_headers_sent) 98 self.send('\r\n'.join(connector))
99
100 - def _on_headers_sent(self, reply):
101 if reply is None: 102 return 103 self.reply = reply.replace('\r', '') 104 try: 105 proto, code, desc = reply.split('\n')[0].split(' ', 2) 106 except: 107 log.error("_on_headers_sent:", exc_info=True) 108 #traceback.print_exc() 109 self.on_failure('Invalid proxy reply') 110 return 111 if code <> '200': 112 log.error('Invalid proxy reply: %s %s %s' % (proto, code, desc)) 113 self.on_failure('Invalid proxy reply') 114 return 115 if len(reply) != 2: 116 pass 117 self.connecting_over()
118
119 120 -class SOCKS5Connector(ProxyConnector):
121 """ 122 SOCKS5 proxy connection class. Allows to use SOCKS5 proxies with 123 (optionally) simple authentication (only USERNAME/PASSWORD auth) 124 """ 125
126 - def start_connecting(self):
127 log.info('Proxy server contacted, performing authentification') 128 if self.proxy_user and self.proxy_pass: 129 to_send = '\x05\x02\x00\x02' 130 else: 131 to_send = '\x05\x01\x00' 132 self.onreceive(self._on_greeting_sent) 133 self.send(to_send)
134
135 - def _on_greeting_sent(self, reply):
136 if reply is None: 137 return 138 if len(reply) != 2: 139 self.on_failure('Invalid proxy reply') 140 return 141 if reply[0] != '\x05': 142 log.info('Invalid proxy reply') 143 self.on_failure('Invalid proxy reply') 144 return 145 if reply[1] == '\x00': 146 return self._on_proxy_auth('\x01\x00') 147 elif reply[1] == '\x02': 148 to_send = '\x01' + chr(len(self.proxy_user)) + self.proxy_user +\ 149 chr(len(self.proxy_pass)) + self.proxy_pass 150 self.onreceive(self._on_proxy_auth) 151 self.send(to_send) 152 else: 153 if reply[1] == '\xff': 154 log.error('Authentification to proxy impossible: no acceptable ' 155 'auth method') 156 self.on_failure('Authentification to proxy impossible: no ' 157 'acceptable authentification method') 158 return 159 log.error('Invalid proxy reply') 160 self.on_failure('Invalid proxy reply') 161 return
162
163 - def _on_proxy_auth(self, reply):
164 if reply is None: 165 return 166 if len(reply) != 2: 167 log.error('Invalid proxy reply') 168 self.on_failure('Invalid proxy reply') 169 return 170 if reply[0] != '\x01': 171 log.error('Invalid proxy reply') 172 self.on_failure('Invalid proxy reply') 173 return 174 if reply[1] != '\x00': 175 log.error('Authentification to proxy failed') 176 self.on_failure('Authentification to proxy failed') 177 return 178 log.info('Authentification successfull. Jabber server contacted.') 179 # Request connection 180 req = "\x05\x01\x00" 181 # If the given destination address is an IP address, we'll 182 # use the IPv4 address request even if remote resolving was specified. 183 try: 184 self.ipaddr = socket.inet_aton(self.xmpp_server[0]) 185 req = req + "\x01" + self.ipaddr 186 except socket.error: 187 # Well it's not an IP number, so it's probably a DNS name. 188 # if self.__proxy[3]==True: 189 # Resolve remotely 190 self.ipaddr = None 191 req = req + "\x03" + chr(len(self.xmpp_server[0])) + self.xmpp_server[0] 192 # else: 193 # # Resolve locally 194 # self.ipaddr = socket.inet_aton(socket.gethostbyname(self.xmpp_server[0])) 195 # req = req + "\x01" + ipaddr 196 req = req + struct.pack(">H", self.xmpp_server[1]) 197 self.onreceive(self._on_req_sent) 198 self.send(req)
199
200 - def _on_req_sent(self, reply):
201 if reply is None: 202 return 203 if len(reply) < 10: 204 log.error('Invalid proxy reply') 205 self.on_failure('Invalid proxy reply') 206 return 207 if reply[0] != '\x05': 208 log.error('Invalid proxy reply') 209 self.on_failure('Invalid proxy reply') 210 return 211 if reply[1] != "\x00": 212 # Connection failed 213 if ord(reply[1])<9: 214 errors = ['general SOCKS server failure', 215 'connection not allowed by ruleset', 216 'Network unreachable', 217 'Host unreachable', 218 'Connection refused', 219 'TTL expired', 220 'Command not supported', 221 'Address type not supported' 222 ] 223 txt = errors[ord(reply[1])-1] 224 else: 225 txt = 'Invalid proxy reply' 226 log.error(txt) 227 self.on_failure(txt) 228 return 229 # Get the bound address/port 230 elif reply[3] == "\x01": 231 begin, end = 3, 7 232 elif reply[3] == "\x03": 233 begin, end = 4, 4 + reply[4] 234 else: 235 log.error('Invalid proxy reply') 236 self.on_failure('Invalid proxy reply') 237 return 238 self.connecting_over()
239

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.proxy_connectors.HTTPCONNECTConnector-class.html000066400000000000000000000301351343257752000325010ustar00rootroot00000000000000 nbxmpp.proxy_connectors.HTTPCONNECTConnector
Package nbxmpp :: Module proxy_connectors :: Class HTTPCONNECTConnector
[hide private]
[frames] | no frames]

Class HTTPCONNECTConnector

source code


Instance Methods [hide private]
 
start_connecting(self)
Connect to a proxy, supply login and password to it (if were specified while creating instance). Instruct proxy to make connection to the target server.
source code
 
_on_headers_sent(self, reply) source code

Inherited from ProxyConnector: __init__, connecting_over

Class Methods [hide private]

Inherited from ProxyConnector: get_instance

Method Details [hide private]

start_connecting(self)

source code 
Connect to a proxy, supply login and password to it (if were specified while creating instance). Instruct proxy to make connection to the target server.
Overrides: ProxyConnector.start_connecting

_on_headers_sent(self, reply)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.proxy_connectors.ProxyConnector-class.html000066400000000000000000000402741343257752000320360ustar00rootroot00000000000000 nbxmpp.proxy_connectors.ProxyConnector
Package nbxmpp :: Module proxy_connectors :: Class ProxyConnector
[hide private]
[frames] | no frames]

Class ProxyConnector

source code


Interface for proxy-connecting object - when tunnneling XMPP over proxies, some connecting process usually has to be done before opening stream. Proxy connectors are used right after TCP connection is estabilished
Instance Methods [hide private]
 
__init__(self, send_method, onreceive, old_on_receive, on_success, on_failure, xmpp_server, proxy_creds=(None, None))
Creates proxy connector, starts connecting immediately and gives control back to transport afterwards
source code
 
start_connecting(self) source code
 
connecting_over(self) source code
Class Methods [hide private]
 
get_instance(cls, *args, **kwargs)
Factory Method for object creation
source code
Method Details [hide private]

__init__(self, send_method, onreceive, old_on_receive, on_success, on_failure, xmpp_server, proxy_creds=(None, None))
(Constructor)

source code 
Creates proxy connector, starts connecting immediately and gives control back to transport afterwards
Parameters:
  • send_method - transport send method
  • onreceive - method to set on_receive callbacks
  • old_on_receive - on_receive callback that should be set when proxy connection was successful
  • on_success - called after proxy connection was successfully opened
  • on_failure - called when errors occured while connecting
  • xmpp_server - tuple of (hostname, port)
  • proxy_creds - tuple of (proxy_user, proxy_credentials)

get_instance(cls, *args, **kwargs)
Class Method

source code 

Factory Method for object creation

Use this instead of directly initializing the class in order to make unit testing much easier.

start_connecting(self)

source code 

connecting_over(self)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.proxy_connectors.SOCKS5Connector-class.html000066400000000000000000000354051343257752000316640ustar00rootroot00000000000000 nbxmpp.proxy_connectors.SOCKS5Connector
Package nbxmpp :: Module proxy_connectors :: Class SOCKS5Connector
[hide private]
[frames] | no frames]

Class SOCKS5Connector

source code


SOCKS5 proxy connection class. Allows to use SOCKS5 proxies with (optionally) simple authentication (only USERNAME/PASSWORD auth)
Instance Methods [hide private]
 
start_connecting(self) source code
 
_on_greeting_sent(self, reply) source code
 
_on_proxy_auth(self, reply) source code
 
_on_req_sent(self, reply) source code

Inherited from ProxyConnector: __init__, connecting_over

Class Methods [hide private]

Inherited from ProxyConnector: get_instance

Method Details [hide private]

start_connecting(self)

source code 
Overrides: ProxyConnector.start_connecting

_on_greeting_sent(self, reply)

source code 

_on_proxy_auth(self, reply)

source code 

_on_req_sent(self, reply)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.roster_nb-module.html000066400000000000000000000222601343257752000255750ustar00rootroot00000000000000 nbxmpp.roster_nb
Package nbxmpp :: Module roster_nb
[hide private]
[frames] | no frames]

Module roster_nb

source code

Simple roster implementation. Can be used though for different tasks like mass-renaming of contacts.
Classes [hide private]
  NonBlockingRoster
Defines a plenty of methods that will allow you to manage roster. Also automatically track presences from remote JIDs taking into account that every JID can have multiple resources connected. Does not currently support 'error' presences. You can also use mapping interface for access to the internal representation of contacts in roster
Variables [hide private]
  log = logging.getLogger('nbxmpp.roster_nb')
  __package__ = 'nbxmpp'

Imports: JID, Iq, Presence, Node, NodeProcessed, NS_MUC_USER, NS_ROSTER, PlugIn, logging


Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.roster_nb')

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.roster_nb-pysrc.html000066400000000000000000004264471343257752000254670ustar00rootroot00000000000000 nbxmpp.roster_nb
Package nbxmpp :: Module roster_nb
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.roster_nb

  1  ##   roster_nb.py 
  2  ##         based on roster.py 
  3  ## 
  4  ##   Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 
  5  ##         modified by Dimitur Kirov <dkirov@gmail.com> 
  6  ## 
  7  ##   This program is free software; you can redistribute it and/or modify 
  8  ##   it under the terms of the GNU General Public License as published by 
  9  ##   the Free Software Foundation; either version 2, or (at your option) 
 10  ##   any later version. 
 11  ## 
 12  ##   This program is distributed in the hope that it will be useful, 
 13  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
 14  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 15  ##   GNU General Public License for more details. 
 16   
 17  # $Id: roster.py,v 1.17 2005/05/02 08:38:49 snakeru Exp $ 
 18   
 19   
 20  """ 
 21  Simple roster implementation. Can be used though for different tasks like 
 22  mass-renaming of contacts. 
 23  """ 
 24   
 25  from protocol import JID, Iq, Presence, Node, NodeProcessed, NS_MUC_USER, NS_ROSTER 
 26  from plugin import PlugIn 
 27   
 28  import logging 
 29  log = logging.getLogger('nbxmpp.roster_nb') 
 30   
 31   
32 -class NonBlockingRoster(PlugIn):
33 """ 34 Defines a plenty of methods that will allow you to manage roster. Also 35 automatically track presences from remote JIDs taking into account that 36 every JID can have multiple resources connected. Does not currently support 37 'error' presences. You can also use mapping interface for access to the 38 internal representation of contacts in roster 39 """ 40
41 - def __init__(self, version=None):
42 """ 43 Init internal variables 44 """ 45 PlugIn.__init__(self) 46 self.version = version 47 self._data = {} 48 self._set=None 49 self._exported_methods=[self.getRoster] 50 self.received_from_server = False
51
52 - def Request(self, force=0):
53 """ 54 Request roster from server if it were not yet requested (or if the 55 'force' argument is set) 56 """ 57 if self._set is None: 58 self._set = 0 59 elif not force: 60 return 61 62 iq = Iq('get', NS_ROSTER) 63 if self.version is not None: 64 iq.setTagAttr('query', 'ver', self.version) 65 id_ = self._owner.getAnID() 66 iq.setID(id_) 67 self._owner.send(iq) 68 log.info('Roster requested from server') 69 return id_
70
71 - def RosterIqHandler(self, dis, stanza):
72 """ 73 Subscription tracker. Used internally for setting items state in internal 74 roster representation 75 """ 76 sender = stanza.getAttr('from') 77 if not sender is None and not sender.bareMatch( 78 self._owner.User + '@' + self._owner.Server): 79 return 80 query = stanza.getTag('query') 81 if query: 82 self.received_from_server = True 83 self.version = stanza.getTagAttr('query', 'ver') 84 if self.version is None: 85 self.version = '' 86 for item in query.getTags('item'): 87 jid=item.getAttr('jid') 88 if item.getAttr('subscription')=='remove': 89 if self._data.has_key(jid): del self._data[jid] 90 # Looks like we have a workaround 91 # raise NodeProcessed # a MUST 92 log.info('Setting roster item %s...' % jid) 93 if not self._data.has_key(jid): self._data[jid]={} 94 self._data[jid]['name']=item.getAttr('name') 95 self._data[jid]['ask']=item.getAttr('ask') 96 self._data[jid]['subscription']=item.getAttr('subscription') 97 self._data[jid]['groups']=[] 98 if not self._data[jid].has_key('resources'): self._data[jid]['resources']={} 99 for group in item.getTags('group'): 100 if group.getData() not in self._data[jid]['groups']: 101 self._data[jid]['groups'].append(group.getData()) 102 self._data[self._owner.User+'@'+self._owner.Server]={'resources': {}, 'name': None, 'ask': None, 'subscription': None, 'groups': None,} 103 self._set=1
104 # Looks like we have a workaround 105 # raise NodeProcessed # a MUST. Otherwise you'll get back an <iq type='error'/> 106
107 - def PresenceHandler(self, dis, pres):
108 """ 109 Presence tracker. Used internally for setting items' resources state in 110 internal roster representation 111 """ 112 if pres.getTag('x', namespace=NS_MUC_USER): 113 return 114 jid=pres.getFrom() 115 if not jid: 116 # If no from attribue, it's from server 117 jid=self._owner.Server 118 jid=JID(jid) 119 if not self._data.has_key(jid.getStripped()): self._data[jid.getStripped()]={'name':None,'ask':None,'subscription':'none','groups':['Not in roster'],'resources':{}} 120 if type(self._data[jid.getStripped()]['resources'])!=type(dict()): 121 self._data[jid.getStripped()]['resources']={} 122 item=self._data[jid.getStripped()] 123 typ=pres.getType() 124 125 if not typ: 126 log.info('Setting roster item %s for resource %s...'%(jid.getStripped(), jid.getResource())) 127 item['resources'][jid.getResource()]=res={'show':None,'status':None,'priority':'0','timestamp':None} 128 if pres.getTag('show'): res['show']=pres.getShow() 129 if pres.getTag('status'): res['status']=pres.getStatus() 130 if pres.getTag('priority'): res['priority']=pres.getPriority() 131 if not pres.getTimestamp(): pres.setTimestamp() 132 res['timestamp']=pres.getTimestamp() 133 elif typ=='unavailable' and item['resources'].has_key(jid.getResource()): del item['resources'][jid.getResource()]
134 # Need to handle type='error' also 135
136 - def _getItemData(self, jid, dataname):
137 """ 138 Return specific jid's representation in internal format. Used internally 139 """ 140 jid = jid[:(jid+'/').find('/')] 141 return self._data[jid][dataname]
142
143 - def _getResourceData(self, jid, dataname):
144 """ 145 Return specific jid's resource representation in internal format. Used 146 internally 147 """ 148 if jid.find('/') + 1: 149 jid, resource = jid.split('/', 1) 150 if self._data[jid]['resources'].has_key(resource): 151 return self._data[jid]['resources'][resource][dataname] 152 elif self._data[jid]['resources'].keys(): 153 lastpri = -129 154 for r in self._data[jid]['resources'].keys(): 155 if int(self._data[jid]['resources'][r]['priority']) > lastpri: 156 resource, lastpri=r, int(self._data[jid]['resources'][r]['priority']) 157 return self._data[jid]['resources'][resource][dataname]
158
159 - def delItem(self, jid):
160 """ 161 Delete contact 'jid' from roster 162 """ 163 self._owner.send(Iq('set', NS_ROSTER, payload=[Node('item', {'jid': jid, 'subscription': 'remove'})]))
164
165 - def getAsk(self, jid):
166 """ 167 Return 'ask' value of contact 'jid' 168 """ 169 return self._getItemData(jid, 'ask')
170
171 - def getGroups(self, jid):
172 """ 173 Return groups list that contact 'jid' belongs to 174 """ 175 return self._getItemData(jid, 'groups')
176
177 - def getName(self, jid):
178 """ 179 Return name of contact 'jid' 180 """ 181 return self._getItemData(jid, 'name')
182
183 - def getPriority(self, jid):
184 """ 185 Return priority of contact 'jid'. 'jid' should be a full (not bare) JID 186 """ 187 return self._getResourceData(jid, 'priority')
188
189 - def getRawRoster(self):
190 """ 191 Return roster representation in internal format 192 """ 193 return self._data
194
195 - def getRawItem(self, jid):
196 """ 197 Return roster item 'jid' representation in internal format 198 """ 199 return self._data[jid[:(jid+'/').find('/')]]
200
201 - def getShow(self, jid):
202 """ 203 Return 'show' value of contact 'jid'. 'jid' should be a full (not bare) 204 JID 205 """ 206 return self._getResourceData(jid, 'show')
207
208 - def getStatus(self, jid):
209 """ 210 Return 'status' value of contact 'jid'. 'jid' should be a full (not bare) 211 JID 212 """ 213 return self._getResourceData(jid, 'status')
214
215 - def getSubscription(self, jid):
216 """ 217 Return 'subscription' value of contact 'jid' 218 """ 219 return self._getItemData(jid, 'subscription')
220
221 - def getResources(self, jid):
222 """ 223 Return list of connected resources of contact 'jid' 224 """ 225 return self._data[jid[:(jid+'/').find('/')]]['resources'].keys()
226
227 - def setItem(self, jid, name=None, groups=[]):
228 """ 229 Rename contact 'jid' and sets the groups list that it now belongs to 230 """ 231 iq = Iq('set', NS_ROSTER) 232 query = iq.getTag('query') 233 attrs = {'jid': jid} 234 if name: 235 attrs['name'] = name 236 item = query.setTag('item', attrs) 237 for group in groups: 238 item.addChild(node=Node('group', payload=[group])) 239 self._owner.send(iq)
240
241 - def setItemMulti(self, items):
242 """ 243 Rename multiple contacts and sets their group lists 244 """ 245 iq = Iq('set', NS_ROSTER) 246 query = iq.getTag('query') 247 for i in items: 248 attrs = {'jid': i['jid']} 249 if i['name']: 250 attrs['name'] = i['name'] 251 item = query.setTag('item', attrs) 252 for group in i['groups']: 253 item.addChild(node=Node('group', payload=[group])) 254 self._owner.send(iq)
255
256 - def getItems(self):
257 """ 258 Return list of all [bare] JIDs that the roster is currently tracks 259 """ 260 return self._data.keys()
261
262 - def keys(self):
263 """ 264 Same as getItems. Provided for the sake of dictionary interface 265 """ 266 return self._data.keys()
267
268 - def __getitem__(self, item):
269 """ 270 Get the contact in the internal format. Raises KeyError if JID 'item' is 271 not in roster 272 """ 273 return self._data[item]
274
275 - def getItem(self, item):
276 """ 277 Get the contact in the internal format (or None if JID 'item' is not in 278 roster) 279 """ 280 if self._data.has_key(item): 281 return self._data[item]
282
283 - def Subscribe(self, jid):
284 """ 285 Send subscription request to JID 'jid' 286 """ 287 self._owner.send(Presence(jid, 'subscribe'))
288
289 - def Unsubscribe(self, jid):
290 """ 291 Ask for removing our subscription for JID 'jid' 292 """ 293 self._owner.send(Presence(jid, 'unsubscribe'))
294
295 - def Authorize(self, jid):
296 """ 297 Authorize JID 'jid'. Works only if these JID requested auth previously 298 """ 299 self._owner.send(Presence(jid, 'subscribed'))
300
301 - def Unauthorize(self, jid):
302 """ 303 Unauthorise JID 'jid'. Use for declining authorisation request or for 304 removing existing authorization 305 """ 306 self._owner.send(Presence(jid, 'unsubscribed'))
307
308 - def getRaw(self):
309 """ 310 Return the internal data representation of the roster 311 """ 312 return self._data
313
314 - def setRaw(self, data):
315 """ 316 Return the internal data representation of the roster 317 """ 318 self._data = data 319 self._data[self._owner.User + '@' + self._owner.Server] = { 320 'resources': {}, 321 'name': None, 322 'ask': None, 323 'subscription': None, 324 'groups': None 325 } 326 self._set = 1
327
328 - def plugin(self, owner, request=1):
329 """ 330 Register presence and subscription trackers in the owner's dispatcher. 331 Also request roster from server if the 'request' argument is set. Used 332 internally 333 """ 334 self._owner.RegisterHandler('iq', self.RosterIqHandler, 'result', NS_ROSTER, makefirst = 1) 335 self._owner.RegisterHandler('iq', self.RosterIqHandler, 'set', NS_ROSTER) 336 self._owner.RegisterHandler('presence', self.PresenceHandler) 337 if request: 338 return self.Request()
339
340 - def _on_roster_set(self, data):
341 if data: 342 self._owner.Dispatcher.ProcessNonBlocking(data) 343 if not self._set: 344 return 345 if not hasattr(self, '_owner') or not self._owner: 346 # Connection has been closed by receiving a <stream:error> for ex, 347 return 348 self._owner.onreceive(None) 349 if self.on_ready: 350 self.on_ready(self) 351 self.on_ready = None 352 return True
353
354 - def getRoster(self, on_ready=None, force=False):
355 """ 356 Request roster from server if neccessary and returns self 357 """ 358 return_self = True 359 if not self._set: 360 self.on_ready = on_ready 361 self._owner.onreceive(self._on_roster_set) 362 return_self = False 363 elif on_ready: 364 on_ready(self) 365 return_self = False 366 if return_self or force: 367 return self 368 return None
369

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.roster_nb.NonBlockingRoster-class.html000066400000000000000000001722301343257752000310210ustar00rootroot00000000000000 nbxmpp.roster_nb.NonBlockingRoster
Package nbxmpp :: Module roster_nb :: Class NonBlockingRoster
[hide private]
[frames] | no frames]

Class NonBlockingRoster

source code


Defines a plenty of methods that will allow you to manage roster. Also automatically track presences from remote JIDs taking into account that every JID can have multiple resources connected. Does not currently support 'error' presences. You can also use mapping interface for access to the internal representation of contacts in roster
Instance Methods [hide private]
 
__init__(self, version=None)
Init internal variables
source code
 
Request(self, force=0)
Request roster from server if it were not yet requested (or if the 'force' argument is set)
source code
 
RosterIqHandler(self, dis, stanza)
Subscription tracker. Used internally for setting items state in internal roster representation
source code
 
PresenceHandler(self, dis, pres)
Presence tracker. Used internally for setting items' resources state in internal roster representation
source code
 
_getItemData(self, jid, dataname)
Return specific jid's representation in internal format. Used internally
source code
 
_getResourceData(self, jid, dataname)
Return specific jid's resource representation in internal format. Used internally
source code
 
delItem(self, jid)
Delete contact 'jid' from roster
source code
 
getAsk(self, jid)
Return 'ask' value of contact 'jid'
source code
 
getGroups(self, jid)
Return groups list that contact 'jid' belongs to
source code
 
getName(self, jid)
Return name of contact 'jid'
source code
 
getPriority(self, jid)
Return priority of contact 'jid'. 'jid' should be a full (not bare) JID
source code
 
getRawRoster(self)
Return roster representation in internal format
source code
 
getRawItem(self, jid)
Return roster item 'jid' representation in internal format
source code
 
getShow(self, jid)
Return 'show' value of contact 'jid'. 'jid' should be a full (not bare) JID
source code
 
getStatus(self, jid)
Return 'status' value of contact 'jid'. 'jid' should be a full (not bare) JID
source code
 
getSubscription(self, jid)
Return 'subscription' value of contact 'jid'
source code
 
getResources(self, jid)
Return list of connected resources of contact 'jid'
source code
 
setItem(self, jid, name=None, groups=[])
Rename contact 'jid' and sets the groups list that it now belongs to
source code
 
setItemMulti(self, items)
Rename multiple contacts and sets their group lists
source code
 
getItems(self)
Return list of all [bare] JIDs that the roster is currently tracks
source code
 
keys(self)
Same as getItems. Provided for the sake of dictionary interface
source code
 
__getitem__(self, item)
Get the contact in the internal format. Raises KeyError if JID 'item' is not in roster
source code
 
getItem(self, item)
Get the contact in the internal format (or None if JID 'item' is not in roster)
source code
 
Subscribe(self, jid)
Send subscription request to JID 'jid'
source code
 
Unsubscribe(self, jid)
Ask for removing our subscription for JID 'jid'
source code
 
Authorize(self, jid)
Authorize JID 'jid'. Works only if these JID requested auth previously
source code
 
Unauthorize(self, jid)
Unauthorise JID 'jid'. Use for declining authorisation request or for removing existing authorization
source code
 
getRaw(self)
Return the internal data representation of the roster
source code
 
setRaw(self, data)
Return the internal data representation of the roster
source code
 
plugin(self, owner, request=1)
Register presence and subscription trackers in the owner's dispatcher. Also request roster from server if the 'request' argument is set. Used internally
source code
 
_on_roster_set(self, data) source code
 
getRoster(self, on_ready=None, force=False)
Request roster from server if neccessary and returns self
source code

Inherited from plugin.PlugIn: PlugIn, PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Method Details [hide private]

__init__(self, version=None)
(Constructor)

source code 
Init internal variables
Overrides: plugin.PlugIn.__init__

Request(self, force=0)

source code 
Request roster from server if it were not yet requested (or if the 'force' argument is set)

RosterIqHandler(self, dis, stanza)

source code 
Subscription tracker. Used internally for setting items state in internal roster representation

PresenceHandler(self, dis, pres)

source code 
Presence tracker. Used internally for setting items' resources state in internal roster representation

_getItemData(self, jid, dataname)

source code 
Return specific jid's representation in internal format. Used internally

_getResourceData(self, jid, dataname)

source code 
Return specific jid's resource representation in internal format. Used internally

delItem(self, jid)

source code 
Delete contact 'jid' from roster

getAsk(self, jid)

source code 
Return 'ask' value of contact 'jid'

getGroups(self, jid)

source code 
Return groups list that contact 'jid' belongs to

getName(self, jid)

source code 
Return name of contact 'jid'

getPriority(self, jid)

source code 
Return priority of contact 'jid'. 'jid' should be a full (not bare) JID

getRawRoster(self)

source code 
Return roster representation in internal format

getRawItem(self, jid)

source code 
Return roster item 'jid' representation in internal format

getShow(self, jid)

source code 
Return 'show' value of contact 'jid'. 'jid' should be a full (not bare) JID

getStatus(self, jid)

source code 
Return 'status' value of contact 'jid'. 'jid' should be a full (not bare) JID

getSubscription(self, jid)

source code 
Return 'subscription' value of contact 'jid'

getResources(self, jid)

source code 
Return list of connected resources of contact 'jid'

setItem(self, jid, name=None, groups=[])

source code 
Rename contact 'jid' and sets the groups list that it now belongs to

setItemMulti(self, items)

source code 
Rename multiple contacts and sets their group lists

getItems(self)

source code 
Return list of all [bare] JIDs that the roster is currently tracks

keys(self)

source code 
Same as getItems. Provided for the sake of dictionary interface

__getitem__(self, item)
(Indexing operator)

source code 
Get the contact in the internal format. Raises KeyError if JID 'item' is not in roster

getItem(self, item)

source code 
Get the contact in the internal format (or None if JID 'item' is not in roster)

Subscribe(self, jid)

source code 
Send subscription request to JID 'jid'

Unsubscribe(self, jid)

source code 
Ask for removing our subscription for JID 'jid'

Authorize(self, jid)

source code 
Authorize JID 'jid'. Works only if these JID requested auth previously

Unauthorize(self, jid)

source code 
Unauthorise JID 'jid'. Use for declining authorisation request or for removing existing authorization

getRaw(self)

source code 
Return the internal data representation of the roster

setRaw(self, data)

source code 
Return the internal data representation of the roster

plugin(self, owner, request=1)

source code 
Register presence and subscription trackers in the owner's dispatcher. Also request roster from server if the 'request' argument is set. Used internally

_on_roster_set(self, data)

source code 

getRoster(self, on_ready=None, force=False)

source code 
Request roster from server if neccessary and returns self

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.simplexml-module.html000066400000000000000000000445771343257752000256310ustar00rootroot00000000000000 nbxmpp.simplexml
Package nbxmpp :: Module simplexml
[hide private]
[frames] | no frames]

Module simplexml

source code

Simplexml module provides xmpppy library with all needed tools to handle XML nodes and XML streams. I'm personally using it in many other separate projects. It is designed to be as standalone as possible
Classes [hide private]
  Node
Node class describes syntax of separate XML Node. It have a constructor that permits node creation from set of "namespace name", attributes and payload of text strings and other nodes. It does not natively support building node from text string and uses NodeBuilder class for that purpose. After creation node can be mangled in many ways so it can be completely changed. Also node can be serialised into string in one of two modes: default (where the textual representation of node describes it exactly) and "fancy" - with whitespace added to make indentation and thus make result more readable by human.
  T
Auxiliary class used to quick access to node's child nodes
  NT
Auxiliary class used to quick create node's child nodes
  NodeBuilder
Builds a Node class minidom from data parsed to it. This class used for two purposes:
Functions [hide private]
 
XMLescape(txt)
Return provided string with symbols & < > " replaced by their respective XML entities
source code
 
ustr(what)
Converts object "what" to unicode string using it's own __str__ method if accessible or unicode method otherwise
source code
 
XML2Node(xml)
Convert supplied textual string into XML node. Handy f.e. for reading configuration file. Raises xml.parser.expat.parsererror if provided string is not well-formed XML
source code
 
BadXML2Node(xml)
Convert supplied textual string into XML node. Survives if xml data is cutted half way round. I.e. "<html>some text <br>some more text". Will raise xml.parser.expat.parsererror on misplaced tags though. F.e. "<b>some text <br>some more text</b>" will not work
source code
Variables [hide private]
  log = logging.getLogger('nbxmpp.simplexml')
  ENCODING = 'utf-8'
  __package__ = 'nbxmpp'

Imports: xml, logging


Function Details [hide private]

XMLescape(txt)

source code 
Return provided string with symbols & < > " replaced by their respective XML entities

ustr(what)

source code 
Converts object "what" to unicode string using it's own __str__ method if accessible or unicode method otherwise

XML2Node(xml)

source code 
Convert supplied textual string into XML node. Handy f.e. for reading configuration file. Raises xml.parser.expat.parsererror if provided string is not well-formed XML

BadXML2Node(xml)

source code 
Convert supplied textual string into XML node. Survives if xml data is cutted half way round. I.e. "<html>some text <br>some more text". Will raise xml.parser.expat.parsererror on misplaced tags though. F.e. "<b>some text <br>some more text</b>" will not work

Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.simplexml')

ENCODING

Value:
'utf-8'

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.simplexml-pysrc.html000066400000000000000000006472241343257752000255020ustar00rootroot00000000000000 nbxmpp.simplexml
Package nbxmpp :: Module simplexml
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.simplexml

  1  ##   simplexml.py based on Mattew Allum's xmlstream.py 
  2  ## 
  3  ##   Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov 
  4  ## 
  5  ##   This program is free software; you can redistribute it and/or modify 
  6  ##   it under the terms of the GNU General Public License as published by 
  7  ##   the Free Software Foundation; either version 2, or (at your option) 
  8  ##   any later version. 
  9  ## 
 10  ##   This program is distributed in the hope that it will be useful, 
 11  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
 12  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 13  ##   GNU General Public License for more details. 
 14   
 15  # $Id: simplexml.py,v 1.27 2005/04/30 07:20:27 snakeru Exp $ 
 16   
 17  """ 
 18  Simplexml module provides xmpppy library with all needed tools to handle XML 
 19  nodes and XML streams. I'm personally using it in many other separate 
 20  projects. It is designed to be as standalone as possible 
 21  """ 
 22   
 23  import xml.parsers.expat 
 24  import logging 
 25  log = logging.getLogger('nbxmpp.simplexml') 
 26   
27 -def XMLescape(txt):
28 """ 29 Return provided string with symbols & < > " replaced by their respective XML 30 entities 31 """ 32 # replace also FORM FEED and ESC, because they are not valid XML chars 33 return txt.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace('"', "&quot;").replace(u'\x0C', "").replace(u'\x1B', "")
34 35 ENCODING='utf-8' 36
37 -def ustr(what):
38 """ 39 Converts object "what" to unicode string using it's own __str__ method if 40 accessible or unicode method otherwise 41 """ 42 if isinstance(what, unicode): 43 return what 44 try: 45 r = what.__str__() 46 except AttributeError: 47 r = str(what) 48 if not isinstance(r, unicode): 49 return unicode(r, ENCODING) 50 return r
51
52 -class Node(object):
53 """ 54 Node class describes syntax of separate XML Node. It have a constructor that 55 permits node creation from set of "namespace name", attributes and payload 56 of text strings and other nodes. It does not natively support building node 57 from text string and uses NodeBuilder class for that purpose. After 58 creation node can be mangled in many ways so it can be completely changed. 59 Also node can be serialised into string in one of two modes: default (where 60 the textual representation of node describes it exactly) and "fancy" - with 61 whitespace added to make indentation and thus make result more readable by 62 human. 63 64 Node class have attribute FORCE_NODE_RECREATION that is defaults to False 65 thus enabling fast node replication from the some other node. The drawback 66 of the fast way is that new node shares some info with the "original" node 67 that is changing the one node may influence the other. Though it is rarely 68 needed (in xmpppy it is never needed at all since I'm usually never using 69 original node after replication (and using replication only to move upwards 70 on the classes tree). 71 """ 72 73 FORCE_NODE_RECREATION = 0 74
75 - def __init__(self, tag=None, attrs={}, payload=[], parent=None, nsp=None, 76 node_built=False, node=None):
77 """ 78 Takes "tag" argument as the name of node (prepended by namespace, if 79 needed and separated from it by a space), attrs dictionary as the set of 80 arguments, payload list as the set of textual strings and child nodes 81 that this node carries within itself and "parent" argument that is 82 another node that this one will be the child of. Also the __init__ can be 83 provided with "node" argument that is either a text string containing 84 exactly one node or another Node instance to begin with. If both "node" 85 and other arguments is provided then the node initially created as 86 replica of "node" provided and then modified to be compliant with other 87 arguments. 88 """ 89 if node: 90 if self.FORCE_NODE_RECREATION and isinstance(node, Node): 91 node = str(node) 92 if not isinstance(node, Node): 93 node = NodeBuilder(node, self) 94 node_built = True 95 else: 96 self.name, self.namespace, self.attrs, self.data, self.kids, self.parent, self.nsd = node.name, node.namespace, {}, [], [], node.parent, {} 97 for key in node.attrs.keys(): 98 self.attrs[key] = node.attrs[key] 99 for data in node.data: 100 self.data.append(data) 101 for kid in node.kids: 102 self.kids.append(kid) 103 for k, v in node.nsd.items(): 104 self.nsd[k] = v 105 else: 106 self.name, self.namespace, self.attrs, self.data, self.kids, self.parent, self.nsd = 'tag', '', {}, [], [], None, {} 107 if parent: 108 self.parent = parent 109 self.nsp_cache = {} 110 if nsp: 111 for k, v in nsp.items(): self.nsp_cache[k] = v 112 for attr, val in attrs.items(): 113 if attr == 'xmlns': 114 self.nsd[u''] = val 115 elif attr.startswith('xmlns:'): 116 self.nsd[attr[6:]] = val 117 self.attrs[attr]=attrs[attr] 118 if tag: 119 if node_built: 120 pfx, self.name = (['']+tag.split(':'))[-2:] 121 self.namespace = self.lookup_nsp(pfx) 122 else: 123 if ' ' in tag: 124 self.namespace, self.name = tag.split() 125 else: 126 self.name = tag 127 if isinstance(payload, basestring): payload=[payload] 128 for i in payload: 129 if isinstance(i, Node): 130 self.addChild(node=i) 131 else: 132 self.data.append(ustr(i))
133
134 - def lookup_nsp(self, pfx=''):
135 ns = self.nsd.get(pfx, None) 136 if ns is None: 137 ns = self.nsp_cache.get(pfx, None) 138 if ns is None: 139 if self.parent: 140 ns = self.parent.lookup_nsp(pfx) 141 self.nsp_cache[pfx] = ns 142 else: 143 return 'http://www.gajim.org/xmlns/undeclared' 144 return ns
145
146 - def __str__(self, fancy=0):
147 """ 148 Method used to dump node into textual representation. If "fancy" argument 149 is set to True produces indented output for readability 150 """ 151 s = (fancy-1) * 2 * ' ' + "<" + self.name 152 if self.namespace: 153 if not self.parent or self.parent.namespace!=self.namespace: 154 if 'xmlns' not in self.attrs: 155 s = s + ' xmlns="%s"'%self.namespace 156 for key in self.attrs.keys(): 157 val = ustr(self.attrs[key]) 158 s = s + ' %s="%s"' % ( key, XMLescape(val) ) 159 s = s + ">" 160 cnt = 0 161 if self.kids: 162 if fancy: s = s + "\n" 163 for a in self.kids: 164 if not fancy and (len(self.data)-1)>=cnt: s=s+XMLescape(self.data[cnt]) 165 elif (len(self.data)-1)>=cnt: s=s+XMLescape(self.data[cnt].strip()) 166 if isinstance(a, str) or isinstance(a, unicode): 167 s = s + a.__str__() 168 else: 169 s = s + a.__str__(fancy and fancy+1) 170 cnt=cnt+1 171 if not fancy and (len(self.data)-1) >= cnt: s = s + XMLescape(self.data[cnt]) 172 elif (len(self.data)-1) >= cnt: s = s + XMLescape(self.data[cnt].strip()) 173 if not self.kids and s.endswith('>'): 174 s=s[:-1]+' />' 175 if fancy: s = s + "\n" 176 else: 177 if fancy and not self.data: s = s + (fancy-1) * 2 * ' ' 178 s = s + "</" + self.name + ">" 179 if fancy: s = s + "\n" 180 return s
181
182 - def addChild(self, name=None, attrs={}, payload=[], namespace=None, node=None):
183 """ 184 If "node" argument is provided, adds it as child node. Else creates new 185 node from the other arguments' values and adds it as well 186 """ 187 if 'xmlns' in attrs: 188 raise AttributeError("Use namespace=x instead of attrs={'xmlns':x}") 189 if node: 190 newnode=node 191 node.parent = self 192 else: newnode=Node(tag=name, parent=self, attrs=attrs, payload=payload) 193 if namespace: 194 newnode.setNamespace(namespace) 195 self.kids.append(newnode) 196 return newnode
197
198 - def addData(self, data):
199 """ 200 Add some CDATA to node 201 """ 202 self.data.append(ustr(data))
203
204 - def clearData(self):
205 """ 206 Remove all CDATA from the node 207 """ 208 self.data = []
209
210 - def delAttr(self, key):
211 """ 212 Delete an attribute "key" 213 """ 214 del self.attrs[key]
215
216 - def delChild(self, node, attrs={}):
217 """ 218 Delete the "node" from the node's childs list, if "node" is an instance. 219 Else delete the first node that have specified name and (optionally) 220 attributes 221 """ 222 if not isinstance(node, Node): 223 node = self.getTag(node, attrs) 224 self.kids.remove(node) 225 return node
226
227 - def getAttrs(self):
228 """ 229 Return all node's attributes as dictionary 230 """ 231 return self.attrs
232
233 - def getAttr(self, key):
234 """ 235 Return value of specified attribute 236 """ 237 return self.attrs.get(key)
238
239 - def getChildren(self):
240 """ 241 Return all node's child nodes as list 242 """ 243 return self.kids
244
245 - def getData(self):
246 """ 247 Return all node CDATA as string (concatenated) 248 """ 249 return ''.join(self.data)
250
251 - def getName(self):
252 """ 253 Return the name of node 254 """ 255 return self.name
256
257 - def getNamespace(self):
258 """ 259 Return the namespace of node 260 """ 261 return self.namespace
262
263 - def getParent(self):
264 """ 265 Returns the parent of node (if present) 266 """ 267 return self.parent
268
269 - def getPayload(self):
270 """ 271 Return the payload of node i.e. list of child nodes and CDATA entries. 272 F.e. for "<node>text1<nodea/><nodeb/> text2</node>" will be returned 273 list: ['text1', <nodea instance>, <nodeb instance>, ' text2'] 274 """ 275 ret = [] 276 for i in range(len(self.kids)+len(self.data)+1): 277 try: 278 if self.data[i]: 279 ret.append(self.data[i]) 280 except IndexError: 281 pass 282 try: 283 ret.append(self.kids[i]) 284 except IndexError: 285 pass 286 return ret
287
288 - def getTag(self, name, attrs={}, namespace=None):
289 """ 290 Filter all child nodes using specified arguments as filter. Return the 291 first found or None if not found 292 """ 293 return self.getTags(name, attrs, namespace, one=1)
294
295 - def getTagAttr(self, tag, attr):
296 """ 297 Return attribute value of the child with specified name (or None if no 298 such attribute) 299 """ 300 try: 301 return self.getTag(tag).attrs[attr] 302 except: 303 return None
304
305 - def getTagData(self, tag):
306 """ 307 Return cocatenated CDATA of the child with specified name 308 """ 309 try: 310 return self.getTag(tag).getData() 311 except Exception: 312 return None
313
314 - def getTags(self, name, attrs={}, namespace=None, one=0):
315 """ 316 Filter all child nodes using specified arguments as filter. Returns the 317 list of nodes found 318 """ 319 nodes = [] 320 for node in self.kids: 321 if namespace and namespace != node.getNamespace(): 322 continue 323 if node.getName() == name: 324 for key in attrs.keys(): 325 if key not in node.attrs or node.attrs[key]!=attrs[key]: 326 break 327 else: 328 nodes.append(node) 329 if one and nodes: 330 return nodes[0] 331 if not one: 332 return nodes
333
334 - def iterTags(self, name, attrs={}, namespace=None):
335 """ 336 Iterate over all children using specified arguments as filter 337 """ 338 for node in self.kids: 339 if namespace is not None and namespace != node.getNamespace(): 340 continue 341 if node.getName() == name: 342 for key in attrs.keys(): 343 if key not in node.attrs or \ 344 node.attrs[key]!=attrs[key]: 345 break 346 else: 347 yield node
348
349 - def setAttr(self, key, val):
350 """ 351 Set attribute "key" with the value "val" 352 """ 353 self.attrs[key] = val
354
355 - def setData(self, data):
356 """ 357 Set node's CDATA to provided string. Resets all previous CDATA! 358 """ 359 self.data = [ustr(data)]
360
361 - def setName(self, val):
362 """ 363 Change the node name 364 """ 365 self.name = val
366
367 - def setNamespace(self, namespace):
368 """ 369 Changes the node namespace 370 """ 371 self.namespace = namespace
372
373 - def setParent(self, node):
374 """ 375 Set node's parent to "node". WARNING: do not checks if the parent already 376 present and not removes the node from the list of childs of previous 377 parent 378 """ 379 self.parent = node
380
381 - def setPayload(self, payload, add=0):
382 """ 383 Set node payload according to the list specified. WARNING: completely 384 replaces all node's previous content. If you wish just to add child or 385 CDATA - use addData or addChild methods 386 """ 387 if isinstance(payload, basestring): 388 payload = [payload] 389 if add: 390 self.kids += payload 391 else: 392 self.kids = payload
393
394 - def setTag(self, name, attrs={}, namespace=None):
395 """ 396 Same as getTag but if the node with specified namespace/attributes not 397 found, creates such node and returns it 398 """ 399 node = self.getTags(name, attrs, namespace=namespace, one=1) 400 if node: 401 return node 402 else: 403 return self.addChild(name, attrs, namespace=namespace)
404
405 - def setTagAttr(self, tag, attr, val):
406 """ 407 Create new node (if not already present) with name "tag" and set it's 408 attribute "attr" to value "val" 409 """ 410 try: 411 self.getTag(tag).attrs[attr] = val 412 except Exception: 413 self.addChild(tag, attrs={attr: val})
414
415 - def setTagData(self, tag, val, attrs={}):
416 """ 417 Creates new node (if not already present) with name "tag" and 418 (optionally) attributes "attrs" and sets it's CDATA to string "val" 419 """ 420 try: 421 self.getTag(tag, attrs).setData(ustr(val)) 422 except Exception: 423 self.addChild(tag, attrs, payload = [ustr(val)])
424
425 - def has_attr(self, key):
426 """ 427 Check if node have attribute "key" 428 """ 429 return key in self.attrs
430
431 - def __getitem__(self, item):
432 """ 433 Return node's attribute "item" value 434 """ 435 return self.getAttr(item)
436
437 - def __setitem__(self, item, val):
438 """ 439 Set node's attribute "item" value 440 """ 441 return self.setAttr(item, val)
442
443 - def __delitem__(self, item):
444 """ 445 Delete node's attribute "item" 446 """ 447 return self.delAttr(item)
448
449 - def __contains__(self, item):
450 """ 451 Check if node has attribute "item" 452 """ 453 return self.has_attr(item)
454
455 - def __getattr__(self, attr):
456 """ 457 Reduce memory usage caused by T/NT classes - use memory only when needed 458 """ 459 if attr == 'T': 460 self.T = T(self) 461 return self.T 462 if attr == 'NT': 463 self.NT = NT(self) 464 return self.NT 465 raise AttributeError
466
467 -class T:
468 """ 469 Auxiliary class used to quick access to node's child nodes 470 """ 471
472 - def __init__(self, node):
473 self.__dict__['node'] = node
474
475 - def __getattr__(self, attr):
476 return self.node.setTag(attr)
477
478 - def __setattr__(self, attr, val):
479 if isinstance(val, Node): 480 Node.__init__(self.node.setTag(attr), node=val) 481 else: 482 return self.node.setTagData(attr, val)
483
484 - def __delattr__(self, attr):
485 return self.node.delChild(attr)
486
487 -class NT(T):
488 """ 489 Auxiliary class used to quick create node's child nodes 490 """ 491
492 - def __getattr__(self, attr):
493 return self.node.addChild(attr)
494
495 - def __setattr__(self, attr, val):
496 if isinstance(val, Node): 497 self.node.addChild(attr, node=val) 498 else: 499 return self.node.addChild(attr, payload=[val])
500
501 -class NodeBuilder:
502 """ 503 Builds a Node class minidom from data parsed to it. This class used for two 504 purposes: 505 506 1. Creation an XML Node from a textual representation. F.e. reading a 507 config file. See an XML2Node method. 508 2. Handling an incoming XML stream. This is done by mangling the 509 __dispatch_depth parameter and redefining the dispatch method. 510 511 You do not need to use this class directly if you do not designing your own 512 XML handler 513 """ 514
515 - def __init__(self, data=None, initial_node=None):
516 """ 517 Take two optional parameters: "data" and "initial_node" 518 519 By default class initialised with empty Node class instance. Though, if 520 "initial_node" is provided it used as "starting point". You can think 521 about it as of "node upgrade". "data" (if provided) feeded to parser 522 immidiatedly after instance init. 523 """ 524 log.debug("Preparing to handle incoming XML stream.") 525 self._parser = xml.parsers.expat.ParserCreate() 526 self._parser.StartElementHandler = self.starttag 527 self._parser.EndElementHandler = self.endtag 528 self._parser.StartNamespaceDeclHandler = self.handle_namespace_start 529 self._parser.CharacterDataHandler = self.handle_cdata 530 self._parser.buffer_text = True 531 self.Parse = self._parser.Parse 532 533 self.__depth = 0 534 self.__last_depth = 0 535 self.__max_depth = 0 536 self._dispatch_depth = 1 537 self._document_attrs = None 538 self._document_nsp = None 539 self._mini_dom=initial_node 540 self.last_is_data = 1 541 self._ptr=None 542 self.data_buffer = None 543 self.streamError = '' 544 if data: 545 self._parser.Parse(data, 1)
546
547 - def check_data_buffer(self):
548 if self.data_buffer: 549 self._ptr.data.append(''.join(self.data_buffer)) 550 del self.data_buffer[:] 551 self.data_buffer = None
552
553 - def destroy(self):
554 """ 555 Method used to allow class instance to be garbage-collected 556 """ 557 self.check_data_buffer() 558 self._parser.StartElementHandler = None 559 self._parser.EndElementHandler = None 560 self._parser.CharacterDataHandler = None 561 self._parser.StartNamespaceDeclHandler = None
562
563 - def starttag(self, tag, attrs):
564 """ 565 XML Parser callback. Used internally 566 """ 567 self.check_data_buffer() 568 self._inc_depth() 569 log.info("STARTTAG.. DEPTH -> %i , tag -> %s, attrs -> %s" % (self.__depth, tag, `attrs`)) 570 if self.__depth == self._dispatch_depth: 571 if not self._mini_dom : 572 self._mini_dom = Node(tag=tag, attrs=attrs, nsp = self._document_nsp, node_built=True) 573 else: 574 Node.__init__(self._mini_dom, tag=tag, attrs=attrs, nsp = self._document_nsp, node_built=True) 575 self._ptr = self._mini_dom 576 elif self.__depth > self._dispatch_depth: 577 self._ptr.kids.append(Node(tag=tag, parent=self._ptr, attrs=attrs, node_built=True)) 578 self._ptr = self._ptr.kids[-1] 579 if self.__depth == 1: 580 self._document_attrs = {} 581 self._document_nsp = {} 582 nsp, name = (['']+tag.split(':'))[-2:] 583 for attr, val in attrs.items(): 584 if attr == 'xmlns': 585 self._document_nsp[u''] = val 586 elif attr.startswith('xmlns:'): 587 self._document_nsp[attr[6:]] = val 588 else: 589 self._document_attrs[attr] = val 590 ns = self._document_nsp.get(nsp, 'http://www.gajim.org/xmlns/undeclared-root') 591 try: 592 self.stream_header_received(ns, name, attrs) 593 except ValueError, e: 594 self._document_attrs = None 595 raise ValueError(str(e)) 596 if not self.last_is_data and self._ptr.parent: 597 self._ptr.parent.data.append('') 598 self.last_is_data = 0
599
600 - def endtag(self, tag ):
601 """ 602 XML Parser callback. Used internally 603 """ 604 log.info("DEPTH -> %i , tag -> %s" % (self.__depth, tag)) 605 self.check_data_buffer() 606 if self.__depth == self._dispatch_depth: 607 if self._mini_dom.getName() == 'error': 608 children = self._mini_dom.getChildren() 609 if children: 610 self.streamError = children[0].getName() 611 else: 612 self.streamError = self._mini_dom.getData() 613 self.dispatch(self._mini_dom) 614 elif self.__depth > self._dispatch_depth: 615 self._ptr = self._ptr.parent 616 else: 617 log.info("Got higher than dispatch level. Stream terminated?") 618 self._dec_depth() 619 self.last_is_data = 0 620 if self.__depth == 0: self.stream_footer_received()
621
622 - def handle_cdata(self, data):
623 if self.last_is_data: 624 if self.data_buffer: 625 self.data_buffer.append(data) 626 elif self._ptr: 627 self.data_buffer = [data] 628 self.last_is_data = 1
629
630 - def handle_namespace_start(self, prefix, uri):
631 """ 632 XML Parser callback. Used internally 633 """ 634 self.check_data_buffer()
635
636 - def getDom(self):
637 """ 638 Return just built Node 639 """ 640 self.check_data_buffer() 641 return self._mini_dom
642
643 - def dispatch(self, stanza):
644 """ 645 Get called when the NodeBuilder reaches some level of depth on it's way 646 up with the built node as argument. Can be redefined to convert incoming 647 XML stanzas to program events 648 """ 649 pass
650
651 - def stream_header_received(self, ns, tag, attrs):
652 """ 653 Method called when stream just opened 654 """ 655 self.check_data_buffer()
656 662
663 - def has_received_endtag(self, level=0):
664 """ 665 Return True if at least one end tag was seen (at level) 666 """ 667 return self.__depth <= level and self.__max_depth > level
668
669 - def _inc_depth(self):
670 self.__last_depth = self.__depth 671 self.__depth += 1 672 self.__max_depth = max(self.__depth, self.__max_depth)
673
674 - def _dec_depth(self):
675 self.__last_depth = self.__depth 676 self.__depth -= 1
677
678 -def XML2Node(xml):
679 """ 680 Convert supplied textual string into XML node. Handy f.e. for reading 681 configuration file. Raises xml.parser.expat.parsererror if provided string 682 is not well-formed XML 683 """ 684 return NodeBuilder(xml).getDom()
685
686 -def BadXML2Node(xml):
687 """ 688 Convert supplied textual string into XML node. Survives if xml data is 689 cutted half way round. I.e. "<html>some text <br>some more text". Will raise 690 xml.parser.expat.parsererror on misplaced tags though. F.e. "<b>some text 691 <br>some more text</b>" will not work 692 """ 693 return NodeBuilder(xml).getDom()
694

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.simplexml.NT-class.html000066400000000000000000000242331343257752000257540ustar00rootroot00000000000000 nbxmpp.simplexml.NT
Package nbxmpp :: Module simplexml :: Class NT
[hide private]
[frames] | no frames]

Class NT

source code


Auxiliary class used to quick create node's child nodes
Instance Methods [hide private]
 
__getattr__(self, attr) source code
 
__setattr__(self, attr, val) source code

Inherited from T: __delattr__, __init__

Method Details [hide private]

__getattr__(self, attr)
(Qualification operator)

source code 
Overrides: T.__getattr__

__setattr__(self, attr, val)

source code 
Overrides: T.__setattr__

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.simplexml.Node-class.html000066400000000000000000002316221343257752000263220ustar00rootroot00000000000000 nbxmpp.simplexml.Node
Package nbxmpp :: Module simplexml :: Class Node
[hide private]
[frames] | no frames]

Class Node

source code


Node class describes syntax of separate XML Node. It have a constructor that permits node creation from set of "namespace name", attributes and payload of text strings and other nodes. It does not natively support building node from text string and uses NodeBuilder class for that purpose. After creation node can be mangled in many ways so it can be completely changed. Also node can be serialised into string in one of two modes: default (where the textual representation of node describes it exactly) and "fancy" - with whitespace added to make indentation and thus make result more readable by human.

Node class have attribute FORCE_NODE_RECREATION that is defaults to False thus enabling fast node replication from the some other node. The drawback of the fast way is that new node shares some info with the "original" node that is changing the one node may influence the other. Though it is rarely needed (in xmpppy it is never needed at all since I'm usually never using original node after replication (and using replication only to move upwards on the classes tree).

Instance Methods [hide private]
 
__init__(self, tag=None, attrs={}, payload=[], parent=None, nsp=None, node_built=False, node=None)
Takes "tag" argument as the name of node (prepended by namespace, if needed and separated from it by a space), attrs dictionary as the set of arguments, payload list as the set of textual strings and child nodes that this node carries within itself and "parent" argument that is another node that this one will be the child of. Also the __init__ can be provided with "node" argument that is either a text string containing exactly one node or another Node instance to begin with. If both "node" and other arguments is provided then the node initially created as replica of "node" provided and then modified to be compliant with other arguments.
source code
 
lookup_nsp(self, pfx='') source code
 
__str__(self, fancy=0)
Method used to dump node into textual representation. If "fancy" argument is set to True produces indented output for readability
source code
 
addChild(self, name=None, attrs={}, payload=[], namespace=None, node=None)
If "node" argument is provided, adds it as child node. Else creates new node from the other arguments' values and adds it as well
source code
 
addData(self, data)
Add some CDATA to node
source code
 
clearData(self)
Remove all CDATA from the node
source code
 
delAttr(self, key)
Delete an attribute "key"
source code
 
delChild(self, node, attrs={})
Delete the "node" from the node's childs list, if "node" is an instance. Else delete the first node that have specified name and (optionally) attributes
source code
 
getAttrs(self)
Return all node's attributes as dictionary
source code
 
getAttr(self, key)
Return value of specified attribute
source code
 
getChildren(self)
Return all node's child nodes as list
source code
 
getData(self)
Return all node CDATA as string (concatenated)
source code
 
getName(self)
Return the name of node
source code
 
getNamespace(self)
Return the namespace of node
source code
 
getParent(self)
Returns the parent of node (if present)
source code
 
getPayload(self)
Return the payload of node i.e. list of child nodes and CDATA entries. F.e. for "<node>text1<nodea/><nodeb/> text2</node>" will be returned list: ['text1', <nodea instance>, <nodeb instance>, ' text2']
source code
 
getTag(self, name, attrs={}, namespace=None)
Filter all child nodes using specified arguments as filter. Return the first found or None if not found
source code
 
getTagAttr(self, tag, attr)
Return attribute value of the child with specified name (or None if no such attribute)
source code
 
getTagData(self, tag)
Return cocatenated CDATA of the child with specified name
source code
 
getTags(self, name, attrs={}, namespace=None, one=0)
Filter all child nodes using specified arguments as filter. Returns the list of nodes found
source code
 
iterTags(self, name, attrs={}, namespace=None)
Iterate over all children using specified arguments as filter
source code
 
setAttr(self, key, val)
Set attribute "key" with the value "val"
source code
 
setData(self, data)
Set node's CDATA to provided string. Resets all previous CDATA!
source code
 
setName(self, val)
Change the node name
source code
 
setNamespace(self, namespace)
Changes the node namespace
source code
 
setParent(self, node)
Set node's parent to "node". WARNING: do not checks if the parent already present and not removes the node from the list of childs of previous parent
source code
 
setPayload(self, payload, add=0)
Set node payload according to the list specified. WARNING: completely replaces all node's previous content. If you wish just to add child or CDATA - use addData or addChild methods
source code
 
setTag(self, name, attrs={}, namespace=None)
Same as getTag but if the node with specified namespace/attributes not found, creates such node and returns it
source code
 
setTagAttr(self, tag, attr, val)
Create new node (if not already present) with name "tag" and set it's attribute "attr" to value "val"
source code
 
setTagData(self, tag, val, attrs={})
Creates new node (if not already present) with name "tag" and (optionally) attributes "attrs" and sets it's CDATA to string "val"
source code
 
has_attr(self, key)
Check if node have attribute "key"
source code
 
__getitem__(self, item)
Return node's attribute "item" value
source code
 
__setitem__(self, item, val)
Set node's attribute "item" value
source code
 
__delitem__(self, item)
Delete node's attribute "item"
source code
 
__contains__(self, item)
Check if node has attribute "item"
source code
 
__getattr__(self, attr)
Reduce memory usage caused by T/NT classes - use memory only when needed
source code

Inherited from object: __delattr__, __format__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __subclasshook__

Class Variables [hide private]
  FORCE_NODE_RECREATION = 0
Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, tag=None, attrs={}, payload=[], parent=None, nsp=None, node_built=False, node=None)
(Constructor)

source code 
Takes "tag" argument as the name of node (prepended by namespace, if needed and separated from it by a space), attrs dictionary as the set of arguments, payload list as the set of textual strings and child nodes that this node carries within itself and "parent" argument that is another node that this one will be the child of. Also the __init__ can be provided with "node" argument that is either a text string containing exactly one node or another Node instance to begin with. If both "node" and other arguments is provided then the node initially created as replica of "node" provided and then modified to be compliant with other arguments.
Overrides: object.__init__

lookup_nsp(self, pfx='')

source code 

__str__(self, fancy=0)
(Informal representation operator)

source code 
Method used to dump node into textual representation. If "fancy" argument is set to True produces indented output for readability
Overrides: object.__str__

addChild(self, name=None, attrs={}, payload=[], namespace=None, node=None)

source code 
If "node" argument is provided, adds it as child node. Else creates new node from the other arguments' values and adds it as well

addData(self, data)

source code 
Add some CDATA to node

clearData(self)

source code 
Remove all CDATA from the node

delAttr(self, key)

source code 
Delete an attribute "key"

delChild(self, node, attrs={})

source code 
Delete the "node" from the node's childs list, if "node" is an instance. Else delete the first node that have specified name and (optionally) attributes

getAttrs(self)

source code 
Return all node's attributes as dictionary

getAttr(self, key)

source code 
Return value of specified attribute

getChildren(self)

source code 
Return all node's child nodes as list

getData(self)

source code 
Return all node CDATA as string (concatenated)

getName(self)

source code 
Return the name of node

getNamespace(self)

source code 
Return the namespace of node

getParent(self)

source code 
Returns the parent of node (if present)

getPayload(self)

source code 
Return the payload of node i.e. list of child nodes and CDATA entries. F.e. for "<node>text1<nodea/><nodeb/> text2</node>" will be returned list: ['text1', <nodea instance>, <nodeb instance>, ' text2']

getTag(self, name, attrs={}, namespace=None)

source code 
Filter all child nodes using specified arguments as filter. Return the first found or None if not found

getTagAttr(self, tag, attr)

source code 
Return attribute value of the child with specified name (or None if no such attribute)

getTagData(self, tag)

source code 
Return cocatenated CDATA of the child with specified name

getTags(self, name, attrs={}, namespace=None, one=0)

source code 
Filter all child nodes using specified arguments as filter. Returns the list of nodes found

iterTags(self, name, attrs={}, namespace=None)

source code 
Iterate over all children using specified arguments as filter

setAttr(self, key, val)

source code 
Set attribute "key" with the value "val"

setData(self, data)

source code 
Set node's CDATA to provided string. Resets all previous CDATA!

setName(self, val)

source code 
Change the node name

setNamespace(self, namespace)

source code 
Changes the node namespace

setParent(self, node)

source code 
Set node's parent to "node". WARNING: do not checks if the parent already present and not removes the node from the list of childs of previous parent

setPayload(self, payload, add=0)

source code 
Set node payload according to the list specified. WARNING: completely replaces all node's previous content. If you wish just to add child or CDATA - use addData or addChild methods

setTag(self, name, attrs={}, namespace=None)

source code 
Same as getTag but if the node with specified namespace/attributes not found, creates such node and returns it

setTagAttr(self, tag, attr, val)

source code 
Create new node (if not already present) with name "tag" and set it's attribute "attr" to value "val"

setTagData(self, tag, val, attrs={})

source code 
Creates new node (if not already present) with name "tag" and (optionally) attributes "attrs" and sets it's CDATA to string "val"

has_attr(self, key)

source code 
Check if node have attribute "key"

__getitem__(self, item)
(Indexing operator)

source code 
Return node's attribute "item" value

__setitem__(self, item, val)
(Index assignment operator)

source code 
Set node's attribute "item" value

__delitem__(self, item)
(Index deletion operator)

source code 
Delete node's attribute "item"

__contains__(self, item)
(In operator)

source code 
Check if node has attribute "item"

__getattr__(self, attr)
(Qualification operator)

source code 
Reduce memory usage caused by T/NT classes - use memory only when needed

Class Variable Details [hide private]

FORCE_NODE_RECREATION

Value:
0

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.simplexml.NodeBuilder-class.html000066400000000000000000000660331343257752000276330ustar00rootroot00000000000000 nbxmpp.simplexml.NodeBuilder
Package nbxmpp :: Module simplexml :: Class NodeBuilder
[hide private]
[frames] | no frames]

Class NodeBuilder

source code

Builds a Node class minidom from data parsed to it. This class used for two purposes:

  1. Creation an XML Node from a textual representation. F.e. reading a config file. See an XML2Node method.
  2. Handling an incoming XML stream. This is done by mangling the __dispatch_depth parameter and redefining the dispatch method.

You do not need to use this class directly if you do not designing your own XML handler

Instance Methods [hide private]
 
__init__(self, data=None, initial_node=None)
Take two optional parameters: "data" and "initial_node"
source code
 
check_data_buffer(self) source code
 
destroy(self)
Method used to allow class instance to be garbage-collected
source code
 
starttag(self, tag, attrs)
XML Parser callback. Used internally
source code
 
endtag(self, tag)
XML Parser callback. Used internally
source code
 
handle_cdata(self, data) source code
 
handle_namespace_start(self, prefix, uri)
XML Parser callback. Used internally
source code
 
getDom(self)
Return just built Node
source code
 
dispatch(self, stanza)
Get called when the NodeBuilder reaches some level of depth on it's way up with the built node as argument. Can be redefined to convert incoming XML stanzas to program events
source code
 
stream_header_received(self, ns, tag, attrs)
Method called when stream just opened
source code
 
stream_footer_received(self)
Method called when stream just closed
source code
 
has_received_endtag(self, level=0)
Return True if at least one end tag was seen (at level)
source code
 
_inc_depth(self) source code
 
_dec_depth(self) source code
Method Details [hide private]

__init__(self, data=None, initial_node=None)
(Constructor)

source code 

Take two optional parameters: "data" and "initial_node"

By default class initialised with empty Node class instance. Though, if "initial_node" is provided it used as "starting point". You can think about it as of "node upgrade". "data" (if provided) feeded to parser immidiatedly after instance init.

check_data_buffer(self)

source code 

destroy(self)

source code 
Method used to allow class instance to be garbage-collected

starttag(self, tag, attrs)

source code 
XML Parser callback. Used internally

endtag(self, tag)

source code 
XML Parser callback. Used internally

handle_cdata(self, data)

source code 

handle_namespace_start(self, prefix, uri)

source code 
XML Parser callback. Used internally

getDom(self)

source code 
Return just built Node

dispatch(self, stanza)

source code 
Get called when the NodeBuilder reaches some level of depth on it's way up with the built node as argument. Can be redefined to convert incoming XML stanzas to program events

stream_header_received(self, ns, tag, attrs)

source code 
Method called when stream just opened

stream_footer_received(self)

source code 
Method called when stream just closed

has_received_endtag(self, level=0)

source code 
Return True if at least one end tag was seen (at level)

_inc_depth(self)

source code 

_dec_depth(self)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.simplexml.T-class.html000066400000000000000000000304161343257752000256360ustar00rootroot00000000000000 nbxmpp.simplexml.T
Package nbxmpp :: Module simplexml :: Class T
[hide private]
[frames] | no frames]

Class T

source code


Auxiliary class used to quick access to node's child nodes
Instance Methods [hide private]
 
__init__(self, node) source code
 
__getattr__(self, attr) source code
 
__setattr__(self, attr, val) source code
 
__delattr__(self, attr) source code
Method Details [hide private]

__init__(self, node)
(Constructor)

source code 

__getattr__(self, attr)
(Qualification operator)

source code 

__setattr__(self, attr, val)

source code 

__delattr__(self, attr)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.smacks-module.html000066400000000000000000000205411343257752000250610ustar00rootroot00000000000000 nbxmpp.smacks
Package nbxmpp :: Module smacks
[hide private]
[frames] | no frames]

Module smacks

source code

Classes [hide private]
  Smacks
This is Smacks is the Stream Management class. It takes care of requesting and sending acks. Also, it keeps track of the unhandled outgoing stanzas.
Variables [hide private]
  log = logging.getLogger('nbxmpp.smacks')
  __package__ = 'nbxmpp'

Imports: Acks, NS_STREAM_MGMT, logging


Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.smacks')

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.smacks-pysrc.html000066400000000000000000001522361343257752000247430ustar00rootroot00000000000000 nbxmpp.smacks
Package nbxmpp :: Module smacks
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.smacks

  1  from protocol import Acks 
  2  from protocol import NS_STREAM_MGMT 
  3  import logging 
  4  log = logging.getLogger('nbxmpp.smacks') 
  5   
6 -class Smacks():
7 ''' 8 This is Smacks is the Stream Management class. It takes care of requesting 9 and sending acks. Also, it keeps track of the unhandled outgoing stanzas. 10 11 The dispatcher has to be able to access this class to increment the 12 number of handled stanzas 13 ''' 14
15 - def __init__(self, con):
16 self.con = con # Connection object 17 self.out_h = 0 # Outgoing stanzas handled 18 self.in_h = 0 # Incoming stanzas handled 19 self.uqueue = [] # Unhandled stanzas queue 20 self.session_id = None 21 self.resumption = False # If server supports resume 22 # Max number of stanzas in queue before making a request 23 self.max_queue = 5 24 self._owner = None 25 self.resuming = False 26 self.enabled = False # If SM is enabled 27 self.location = None 28 self.failed_resume = False # If last resuming attempt failed 29 self.supports_sm = False # If server supports sm
30
31 - def set_owner(self, owner):
32 self._owner = owner 33 # Register handlers 34 owner.Dispatcher.RegisterNamespace(NS_STREAM_MGMT) 35 owner.Dispatcher.RegisterHandler('enabled', self._neg_response, 36 xmlns=NS_STREAM_MGMT) 37 owner.Dispatcher.RegisterHandler('r', self.send_ack, 38 xmlns=NS_STREAM_MGMT) 39 owner.Dispatcher.RegisterHandler('a', self.check_ack, 40 xmlns=NS_STREAM_MGMT) 41 owner.Dispatcher.RegisterHandler('resumed', self.check_ack, 42 xmlns=NS_STREAM_MGMT) 43 owner.Dispatcher.RegisterHandler('failed', self.error_handling, 44 xmlns=NS_STREAM_MGMT)
45
46 - def _neg_response(self, disp, stanza):
47 r = stanza.getAttr('resume') 48 if r == 'true' or r == 'True' or r == '1': 49 self.resumption = True 50 self.session_id = stanza.getAttr('id') 51 if r == 'false' or r == 'False' or r == '0': 52 self.negociate(False) 53 l = stanza.getAttr('location') 54 if l: 55 self.location = l 56 if self.failed_resume: 57 self.con._discover_server_at_connection(self.con.connection) 58 self.failed_resume = False
59
60 - def negociate(self, resume=True):
61 # Every time we attempt to negociate, we must erase all previous info 62 # about any previous session 63 self.uqueue = [] 64 self.in_h = 0 65 self.out_h = 0 66 self.session_id = None 67 self.enabled = True 68 69 stanza = Acks() 70 stanza.buildEnable(resume) 71 self._owner.Connection.send(stanza, now=True)
72
73 - def resume_request(self):
74 if not self.session_id: 75 self.resuming = False 76 log.error('Attempted to resume without a valid session id ') 77 return 78 resume = Acks() 79 resume.buildResume(self.in_h, self.session_id) 80 self._owner.Connection.send(resume, False)
81
82 - def send_ack(self, disp, stanza):
83 ack = Acks() 84 ack.buildAnswer(self.in_h) 85 self._owner.Connection.send(ack, False)
86
87 - def request_ack(self):
88 r = Acks() 89 r.buildRequest() 90 self._owner.Connection.send(r, False)
91
92 - def check_ack(self, disp, stanza):
93 ''' 94 Checks if the number of stanzas sent are the same as the 95 number of stanzas received by the server. Pops stanzas that were 96 handled by the server from the queue. 97 ''' 98 h = int(stanza.getAttr('h')) 99 diff = self.out_h - h 100 101 if len(self.uqueue) < diff or diff < 0: 102 log.error('Server and client number of stanzas handled mismatch ') 103 else: 104 while (len(self.uqueue) > diff): 105 self.uqueue.pop(0) 106 107 if stanza.getName() == 'resumed': 108 self.enabled = True 109 self.resuming = True 110 self.con.set_oldst() 111 if self.uqueue != []: 112 for i in self.uqueue: 113 self._owner.Connection.send(i, False)
114
115 - def error_handling(self, disp, stanza):
116 # If the server doesn't recognize previd, forget about resuming 117 # Ask for service discovery, etc.. 118 if stanza.getTag('item-not-found'): 119 self.resuming = False 120 self.enabled = False 121 # we need to bind a resource 122 self._owner.NonBlockingBind.resuming = False 123 self._owner._on_auth_bind(None) 124 self.failed_resume = True 125 return 126 127 # Doesn't support resumption 128 if stanza.getTag('feature-not-implemented'): 129 self.negociate(False) 130 return 131 132 if stanza.getTag('unexpected-request'): 133 self.enabled = False 134 log.error('Gajim failed to negociate Stream Management') 135 return
136

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.smacks.Smacks-class.html000066400000000000000000000447401343257752000261300ustar00rootroot00000000000000 nbxmpp.smacks.Smacks
Package nbxmpp :: Module smacks :: Class Smacks
[hide private]
[frames] | no frames]

Class Smacks

source code

This is Smacks is the Stream Management class. It takes care of requesting and sending acks. Also, it keeps track of the unhandled outgoing stanzas.

The dispatcher has to be able to access this class to increment the number of handled stanzas

Instance Methods [hide private]
 
__init__(self, con) source code
 
set_owner(self, owner) source code
 
_neg_response(self, disp, stanza) source code
 
negociate(self, resume=True) source code
 
resume_request(self) source code
 
send_ack(self, disp, stanza) source code
 
request_ack(self) source code
 
check_ack(self, disp, stanza)
Checks if the number of stanzas sent are the same as the number of stanzas received by the server. Pops stanzas that were handled by the server from the queue.
source code
 
error_handling(self, disp, stanza) source code
Method Details [hide private]

__init__(self, con)
(Constructor)

source code 

set_owner(self, owner)

source code 

_neg_response(self, disp, stanza)

source code 

negociate(self, resume=True)

source code 

resume_request(self)

source code 

send_ack(self, disp, stanza)

source code 

request_ack(self)

source code 

check_ack(self, disp, stanza)

source code 
Checks if the number of stanzas sent are the same as the number of stanzas received by the server. Pops stanzas that were handled by the server from the queue.

error_handling(self, disp, stanza)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.stringprepare-module.html000066400000000000000000000542771343257752000265020ustar00rootroot00000000000000 nbxmpp.stringprepare
Package nbxmpp :: Module stringprepare
[hide private]
[frames] | no frames]

Module stringprepare

source code

Classes [hide private]
  ILookupTable
Interface for character lookup classes
  IMappingTable
Interface for character mapping classes
  LookupTableFromFunction
  LookupTable
  MappingTableFromFunction
  EmptyMappingTable
  Profile
  NamePrep
Implements preparation of internationalized domain names
Variables [hide private]
  C_11 = LookupTableFromFunction(stringprep.in_table_c11)
  C_12 = LookupTableFromFunction(stringprep.in_table_c12)
  C_21 = LookupTableFromFunction(stringprep.in_table_c21)
  C_22 = LookupTableFromFunction(stringprep.in_table_c22)
  C_3 = LookupTableFromFunction(stringprep.in_table_c3)
  C_4 = LookupTableFromFunction(stringprep.in_table_c4)
  C_5 = LookupTableFromFunction(stringprep.in_table_c5)
  C_6 = LookupTableFromFunction(stringprep.in_table_c6)
  C_7 = LookupTableFromFunction(stringprep.in_table_c7)
  C_8 = LookupTableFromFunction(stringprep.in_table_c8)
  C_9 = LookupTableFromFunction(stringprep.in_table_c9)
  B_1 = EmptyMappingTable(stringprep.in_table_b1)
  B_2 = MappingTableFromFunction(stringprep.map_table_b2)
  nodeprep = Profile(mappings= [B_1, B_2], prohibiteds= [C_11, C...
  resourceprep = Profile(mappings= [B_1,], prohibiteds= [C_12, C...
  nameprep = NamePrep()
  __package__ = 'nbxmpp'

Imports: stringprep, unicodedata, idna


Variables Details [hide private]

C_11

Value:
LookupTableFromFunction(stringprep.in_table_c11)

C_12

Value:
LookupTableFromFunction(stringprep.in_table_c12)

C_21

Value:
LookupTableFromFunction(stringprep.in_table_c21)

C_22

Value:
LookupTableFromFunction(stringprep.in_table_c22)

C_3

Value:
LookupTableFromFunction(stringprep.in_table_c3)

C_4

Value:
LookupTableFromFunction(stringprep.in_table_c4)

C_5

Value:
LookupTableFromFunction(stringprep.in_table_c5)

C_6

Value:
LookupTableFromFunction(stringprep.in_table_c6)

C_7

Value:
LookupTableFromFunction(stringprep.in_table_c7)

C_8

Value:
LookupTableFromFunction(stringprep.in_table_c8)

C_9

Value:
LookupTableFromFunction(stringprep.in_table_c9)

B_1

Value:
EmptyMappingTable(stringprep.in_table_b1)

B_2

Value:
MappingTableFromFunction(stringprep.map_table_b2)

nodeprep

Value:
Profile(mappings= [B_1, B_2], prohibiteds= [C_11, C_12, C_21, C_22, C_\
3, C_4, C_5, C_6, C_7, C_8, C_9, LookupTable([u'"', u'&', u"'", u'/', \
u':', u'<', u'>', u'@'])])

resourceprep

Value:
Profile(mappings= [B_1,], prohibiteds= [C_12, C_21, C_22, C_3, C_4, C_\
5, C_6, C_7, C_8, C_9])

nameprep

Value:
NamePrep()

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.stringprepare-pysrc.html000066400000000000000000002341501343257752000263430ustar00rootroot00000000000000 nbxmpp.stringprepare
Package nbxmpp :: Module stringprepare
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.stringprepare

  1  # -*- coding:utf-8 -*- 
  2  ## src/common/xmpp/stringprepare.py 
  3  ## 
  4  ## Copyright (C) 2001-2005 Twisted Matrix Laboratories 
  5  ## Copyright (C) 2005-2012 Yann Leboulanger <asterix AT lagaule.org> 
  6  ## Copyright (C) 2006 Stefan Bethge <stefan AT lanpartei.de> 
  7  ## Copyright (C) 2007 Jean-Marie Traissard <jim AT lapin.org> 
  8  ## 
  9  ## This file is part of Gajim. 
 10  ## 
 11  ## Gajim is free software; you can redistribute it and/or modify 
 12  ## it under the terms of the GNU General Public License as published 
 13  ## by the Free Software Foundation; version 3 only. 
 14  ## 
 15  ## Gajim is distributed in the hope that it will be useful, 
 16  ## but WITHOUT ANY WARRANTY; without even the implied warranty of 
 17  ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
 18  ## GNU General Public License for more details. 
 19  ## 
 20  ## You should have received a copy of the GNU General Public License 
 21  ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. 
 22  ## 
 23   
 24  import stringprep 
 25  import unicodedata 
 26  from encodings import idna 
 27   
28 -class ILookupTable:
29 """ 30 Interface for character lookup classes 31 """ 32
33 - def lookup(self, c):
34 """ 35 Return whether character is in this table 36 """ 37 pass
38
39 -class IMappingTable:
40 """ 41 Interface for character mapping classes 42 """ 43
44 - def map(self, c):
45 """ 46 Return mapping for character 47 """ 48 pass
49
51 52 __implements__ = ILookupTable 53
54 - def __init__(self, in_table_function):
55 self.lookup = in_table_function
56
57 -class LookupTable:
58 59 __implements__ = ILookupTable 60
61 - def __init__(self, table):
62 self._table = table
63
64 - def lookup(self, c):
65 return c in self._table
66
68 69 __implements__ = IMappingTable 70
71 - def __init__(self, map_table_function):
72 self.map = map_table_function
73
74 -class EmptyMappingTable:
75 76 __implements__ = IMappingTable 77
78 - def __init__(self, in_table_function):
79 self._in_table_function = in_table_function
80
81 - def map(self, c):
82 if self._in_table_function(c): 83 return None 84 else: 85 return c
86
87 -class Profile:
88 - def __init__(self, mappings=[], normalize=True, prohibiteds=[], 89 check_unassigneds=True, check_bidi=True):
90 self.mappings = mappings 91 self.normalize = normalize 92 self.prohibiteds = prohibiteds 93 self.do_check_unassigneds = check_unassigneds 94 self.do_check_bidi = check_bidi
95
96 - def prepare(self, string):
97 result = self.map(string) 98 if self.normalize: 99 result = unicodedata.normalize("NFKC", result) 100 self.check_prohibiteds(result) 101 if self.do_check_unassigneds: 102 self.check_unassigneds(result) 103 if self.do_check_bidi: 104 self.check_bidirectionals(result) 105 return result
106
107 - def map(self, string):
108 result = [] 109 110 for c in string: 111 result_c = c 112 113 for mapping in self.mappings: 114 result_c = mapping.map(c) 115 if result_c != c: 116 break 117 118 if result_c is not None: 119 result.append(result_c) 120 121 return u"".join(result)
122
123 - def check_prohibiteds(self, string):
124 for c in string: 125 for table in self.prohibiteds: 126 if table.lookup(c): 127 raise UnicodeError, "Invalid character %s" % repr(c)
128
129 - def check_unassigneds(self, string):
130 for c in string: 131 if stringprep.in_table_a1(c): 132 raise UnicodeError, "Unassigned code point %s" % repr(c)
133
134 - def check_bidirectionals(self, string):
135 found_LCat = False 136 found_RandALCat = False 137 138 for c in string: 139 if stringprep.in_table_d1(c): 140 found_RandALCat = True 141 if stringprep.in_table_d2(c): 142 found_LCat = True 143 144 if found_LCat and found_RandALCat: 145 raise UnicodeError, "Violation of BIDI Requirement 2" 146 147 if found_RandALCat and not (stringprep.in_table_d1(string[0]) and 148 stringprep.in_table_d1(string[-1])): 149 raise UnicodeError, "Violation of BIDI Requirement 3"
150 151
152 -class NamePrep:
153 """ 154 Implements preparation of internationalized domain names 155 156 This class implements preparing internationalized domain names using the 157 rules defined in RFC 3491, section 4 (Conversion operations). 158 159 We do not perform step 4 since we deal with unicode representations of 160 domain names and do not convert from or to ASCII representations using 161 punycode encoding. When such a conversion is needed, the L{idna} standard 162 library provides the C{ToUnicode()} and C{ToASCII()} functions. Note that 163 L{idna} itself assumes UseSTD3ASCIIRules to be false. 164 165 The following steps are performed by C{prepare()}: 166 167 * Split the domain name in labels at the dots (RFC 3490, 3.1) 168 * Apply nameprep proper on each label (RFC 3491) 169 * Enforce the restrictions on ASCII characters in host names by 170 assuming STD3ASCIIRules to be true. (STD 3) 171 * Rejoin the labels using the label separator U+002E (full stop). 172 """ 173 174 # Prohibited characters. 175 prohibiteds = [unichr(n) for n in range(0x00, 0x2c + 1) + 176 range(0x2e, 0x2f + 1) + 177 range(0x3a, 0x40 + 1) + 178 range(0x5b, 0x60 + 1) + 179 range(0x7b, 0x7f + 1) ] 180
181 - def prepare(self, string):
182 result = [] 183 184 labels = idna.dots.split(string) 185 186 if labels and len(labels[-1]) == 0: 187 trailing_dot = '.' 188 del labels[-1] 189 else: 190 trailing_dot = '' 191 192 for label in labels: 193 result.append(self.nameprep(label)) 194 195 return ".".join(result)+trailing_dot
196
197 - def check_prohibiteds(self, string):
198 for c in string: 199 if c in self.prohibiteds: 200 raise UnicodeError, "Invalid character %s" % repr(c)
201
202 - def nameprep(self, label):
203 label = idna.nameprep(label) 204 self.check_prohibiteds(label) 205 if len(label) == 0: 206 raise UnicodeError, "Invalid empty name" 207 if label[0] == '-': 208 raise UnicodeError, "Invalid leading hyphen-minus" 209 if label[-1] == '-': 210 raise UnicodeError, "Invalid trailing hyphen-minus" 211 return label
212 213 C_11 = LookupTableFromFunction(stringprep.in_table_c11) 214 C_12 = LookupTableFromFunction(stringprep.in_table_c12) 215 C_21 = LookupTableFromFunction(stringprep.in_table_c21) 216 C_22 = LookupTableFromFunction(stringprep.in_table_c22) 217 C_3 = LookupTableFromFunction(stringprep.in_table_c3) 218 C_4 = LookupTableFromFunction(stringprep.in_table_c4) 219 C_5 = LookupTableFromFunction(stringprep.in_table_c5) 220 C_6 = LookupTableFromFunction(stringprep.in_table_c6) 221 C_7 = LookupTableFromFunction(stringprep.in_table_c7) 222 C_8 = LookupTableFromFunction(stringprep.in_table_c8) 223 C_9 = LookupTableFromFunction(stringprep.in_table_c9) 224 225 B_1 = EmptyMappingTable(stringprep.in_table_b1) 226 B_2 = MappingTableFromFunction(stringprep.map_table_b2) 227 228 nodeprep = Profile(mappings=[B_1, B_2], 229 prohibiteds=[C_11, C_12, C_21, C_22, 230 C_3, C_4, C_5, C_6, C_7, C_8, C_9, 231 LookupTable([u'"', u'&', u"'", u'/', 232 u':', u'<', u'>', u'@'])]) 233 234 resourceprep = Profile(mappings=[B_1,], 235 prohibiteds=[C_12, C_21, C_22, 236 C_3, C_4, C_5, C_6, C_7, C_8, C_9]) 237 238 nameprep = NamePrep() 239

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.stringprepare.EmptyMappingTable-class.html000066400000000000000000000226471343257752000316770ustar00rootroot00000000000000 nbxmpp.stringprepare.EmptyMappingTable
Package nbxmpp :: Module stringprepare :: Class EmptyMappingTable
[hide private]
[frames] | no frames]

Class EmptyMappingTable

source code

Nested Classes [hide private]
  __implements__
Interface for character mapping classes
Instance Methods [hide private]
 
__init__(self, in_table_function) source code
 
map(self, c) source code
Method Details [hide private]

__init__(self, in_table_function)
(Constructor)

source code 

map(self, c)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.stringprepare.ILookupTable-class.html000066400000000000000000000161211343257752000306350ustar00rootroot00000000000000 nbxmpp.stringprepare.ILookupTable
Package nbxmpp :: Module stringprepare :: Class ILookupTable
[hide private]
[frames] | no frames]

Class ILookupTable

source code

Interface for character lookup classes
Instance Methods [hide private]
 
lookup(self, c)
Return whether character is in this table
source code
Method Details [hide private]

lookup(self, c)

source code 
Return whether character is in this table

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.stringprepare.IMappingTable-class.html000066400000000000000000000160561343257752000307660ustar00rootroot00000000000000 nbxmpp.stringprepare.IMappingTable
Package nbxmpp :: Module stringprepare :: Class IMappingTable
[hide private]
[frames] | no frames]

Class IMappingTable

source code

Interface for character mapping classes
Instance Methods [hide private]
 
map(self, c)
Return mapping for character
source code
Method Details [hide private]

map(self, c)

source code 
Return mapping for character

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.stringprepare.LookupTable-class.html000066400000000000000000000225351343257752000305320ustar00rootroot00000000000000 nbxmpp.stringprepare.LookupTable
Package nbxmpp :: Module stringprepare :: Class LookupTable
[hide private]
[frames] | no frames]

Class LookupTable

source code

Nested Classes [hide private]
  __implements__
Interface for character lookup classes
Instance Methods [hide private]
 
__init__(self, table) source code
 
lookup(self, c) source code
Method Details [hide private]

__init__(self, table)
(Constructor)

source code 

lookup(self, c)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.stringprepare.LookupTableFromFunction-class.html000066400000000000000000000202021343257752000330510ustar00rootroot00000000000000 nbxmpp.stringprepare.LookupTableFromFunction
Package nbxmpp :: Module stringprepare :: Class LookupTableFromFunction
[hide private]
[frames] | no frames]

Class LookupTableFromFunction

source code

Nested Classes [hide private]
  __implements__
Interface for character lookup classes
Instance Methods [hide private]
 
__init__(self, in_table_function) source code
Method Details [hide private]

__init__(self, in_table_function)
(Constructor)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.stringprepare.MappingTableFromFunction-class.html000066400000000000000000000202161343257752000332000ustar00rootroot00000000000000 nbxmpp.stringprepare.MappingTableFromFunction
Package nbxmpp :: Module stringprepare :: Class MappingTableFromFunction
[hide private]
[frames] | no frames]

Class MappingTableFromFunction

source code

Nested Classes [hide private]
  __implements__
Interface for character mapping classes
Instance Methods [hide private]
 
__init__(self, map_table_function) source code
Method Details [hide private]

__init__(self, map_table_function)
(Constructor)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.stringprepare.NamePrep-class.html000066400000000000000000000400241343257752000300110ustar00rootroot00000000000000 nbxmpp.stringprepare.NamePrep
Package nbxmpp :: Module stringprepare :: Class NamePrep
[hide private]
[frames] | no frames]

Class NamePrep

source code

Implements preparation of internationalized domain names

This class implements preparing internationalized domain names using the rules defined in RFC 3491, section 4 (Conversion operations).

We do not perform step 4 since we deal with unicode representations of domain names and do not convert from or to ASCII representations using punycode encoding. When such a conversion is needed, the L{idna} standard library provides the C{ToUnicode()} and C{ToASCII()} functions. Note that L{idna} itself assumes UseSTD3ASCIIRules to be false.

The following steps are performed by C{prepare()}:

  • Split the domain name in labels at the dots (RFC 3490, 3.1)

  • Apply nameprep proper on each label (RFC 3491)

  • Enforce the restrictions on ASCII characters in host names by

    assuming STD3ASCIIRules to be true. (STD 3)

  • Rejoin the labels using the label separator U+002E (full stop).

Instance Methods [hide private]
 
prepare(self, string) source code
 
check_prohibiteds(self, string) source code
 
nameprep(self, label) source code
Class Variables [hide private]
  prohibiteds = [u'', u'', u'', u'', u'', u'', u'', u'',...
  n = 127
Method Details [hide private]

prepare(self, string)

source code 

check_prohibiteds(self, string)

source code 

nameprep(self, label)

source code 

Class Variable Details [hide private]

prohibiteds

Value:
[u'',
 u'',
 u'',
 u'',
 u'',
 u'',
 u'',
 u'',
...

n

Value:
127

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.stringprepare.Profile-class.html000066400000000000000000000356761343257752000277230ustar00rootroot00000000000000 nbxmpp.stringprepare.Profile
Package nbxmpp :: Module stringprepare :: Class Profile
[hide private]
[frames] | no frames]

Class Profile

source code

Instance Methods [hide private]
 
__init__(self, mappings=[], normalize=True, prohibiteds=[], check_unassigneds=True, check_bidi=True) source code
 
prepare(self, string) source code
 
map(self, string) source code
 
check_prohibiteds(self, string) source code
 
check_unassigneds(self, string) source code
 
check_bidirectionals(self, string) source code
Method Details [hide private]

__init__(self, mappings=[], normalize=True, prohibiteds=[], check_unassigneds=True, check_bidi=True)
(Constructor)

source code 

prepare(self, string)

source code 

map(self, string)

source code 

check_prohibiteds(self, string)

source code 

check_unassigneds(self, string)

source code 

check_bidirectionals(self, string)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.tls_nb-module.html000066400000000000000000000351731343257752000250700ustar00rootroot00000000000000 nbxmpp.tls_nb
Package nbxmpp :: Module tls_nb
[hide private]
[frames] | no frames]

Module tls_nb

source code

Classes [hide private]
  SSLWrapper
Abstract SSLWrapper base class
  PyOpenSSLWrapper
Wrapper class for PyOpenSSL's recv() and send() methods
  StdlibSSLWrapper
Wrapper class for Python socket.ssl read() and write() methods
  NonBlockingTLS
TLS connection used to encrypts already estabilished tcp connection
Functions [hide private]
 
gattr(obj, attr, default=None) source code
Variables [hide private]
  log = logging.getLogger('nbxmpp.tls_nb')
  PYOPENSSL = 'PYOPENSSL'
  PYSTDLIB = 'PYSTDLIB'
  USE_PYOPENSSL = True
  __package__ = 'nbxmpp'

Imports: socket, PlugIn, sys, os, time, traceback, logging, OpenSSL


Function Details [hide private]

gattr(obj, attr, default=None)

source code 

Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.tls_nb')

PYOPENSSL

Value:
'PYOPENSSL'

PYSTDLIB

Value:
'PYSTDLIB'

USE_PYOPENSSL

Value:
True

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.tls_nb-pysrc.html000066400000000000000000005142311343257752000247400ustar00rootroot00000000000000 nbxmpp.tls_nb
Package nbxmpp :: Module tls_nb
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.tls_nb

  1  ##   tls_nb.py 
  2  ##       based on transports_nb.py 
  3  ## 
  4  ##   Copyright (C) 2003-2004 Alexey "Snake" Nezhdanov 
  5  ##       modified by Dimitur Kirov <dkirov@gmail.com> 
  6  ##       modified by Tomas Karasek <tom.to.the.k@gmail.com> 
  7  ## 
  8  ##   This program is free software; you can redistribute it and/or modify 
  9  ##   it under the terms of the GNU General Public License as published by 
 10  ##   the Free Software Foundation; either version 2, or (at your option) 
 11  ##   any later version. 
 12  ## 
 13  ##   This program is distributed in the hope that it will be useful, 
 14  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
 15  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 16  ##   GNU General Public License for more details. 
 17   
 18  import socket 
 19  from plugin import PlugIn 
 20   
 21  import sys 
 22  import os 
 23  import time 
 24   
 25  import traceback 
 26   
 27  import logging 
 28  log = logging.getLogger('nbxmpp.tls_nb') 
 29   
 30  USE_PYOPENSSL = False 
 31   
 32  PYOPENSSL = 'PYOPENSSL' 
 33  PYSTDLIB  = 'PYSTDLIB' 
 34   
 35  try: 
 36      #raise ImportError("Manually disabled PyOpenSSL") 
 37      import OpenSSL.SSL 
 38      import OpenSSL.crypto 
 39      USE_PYOPENSSL = True 
 40      log.info("PyOpenSSL loaded") 
 41  except ImportError: 
 42      log.debug("Import of PyOpenSSL failed:", exc_info=True) 
 43   
 44      # FIXME: Remove these prints before release, replace with a warning dialog. 
 45      print >> sys.stderr, "=" * 79 
 46      print >> sys.stderr, "PyOpenSSL not found, falling back to Python builtin SSL objects (insecure)." 
 47      print >> sys.stderr, "=" * 79 
 48   
49 -def gattr(obj, attr, default=None):
50 try: 51 return getattr(obj, attr) 52 except AttributeError: 53 return default
54 55
56 -class SSLWrapper:
57 """ 58 Abstract SSLWrapper base class 59 """ 60
61 - class Error(IOError):
62 """ 63 Generic SSL Error Wrapper 64 """ 65
66 - def __init__(self, sock=None, exc=None, errno=None, strerror=None, 67 peer=None):
68 self.parent = IOError 69 70 errno = errno or gattr(exc, 'errno') or exc[0] 71 strerror = strerror or gattr(exc, 'strerror') or gattr(exc, 'args') 72 if not isinstance(strerror, basestring): 73 strerror = repr(strerror) 74 75 self.sock = sock 76 self.exc = exc 77 self.peer = peer 78 self.exc_name = None 79 self.exc_args = None 80 self.exc_str = None 81 self.exc_repr = None 82 83 if self.exc is not None: 84 self.exc_name = str(self.exc.__class__) 85 self.exc_args = gattr(self.exc, 'args') 86 self.exc_str = str(self.exc) 87 self.exc_repr = repr(self.exc) 88 if not errno: 89 try: 90 if isinstance(exc, OpenSSL.SSL.SysCallError): 91 if self.exc_args[0] > 0: 92 errno = self.exc_args[0] 93 strerror = self.exc_args[1] 94 except: pass 95 96 self.parent.__init__(self, errno, strerror) 97 98 if self.peer is None and sock is not None: 99 try: 100 ppeer = self.sock.getpeername() 101 if len(ppeer) == 2 and isinstance(ppeer[0], basestring) \ 102 and isinstance(ppeer[1], int): 103 self.peer = ppeer 104 except: 105 pass
106
107 - def __str__(self):
108 s = str(self.__class__) 109 if self.peer: 110 s += " for %s:%d" % self.peer 111 if self.errno is not None: 112 s += ": [Errno: %d]" % self.errno 113 if self.strerror: 114 s += " (%s)" % self.strerror 115 if self.exc_name: 116 s += ", Caused by %s" % self.exc_name 117 if self.exc_str: 118 if self.strerror: 119 s += "(%s)" % self.exc_str 120 else: s += "(%s)" % str(self.exc_args) 121 return s
122
123 - def __init__(self, sslobj, sock=None):
124 self.sslobj = sslobj 125 self.sock = sock 126 log.debug("%s.__init__ called with %s", self.__class__, sslobj)
127
128 - def recv(self, data, flags=None):
129 """ 130 Receive wrapper for SSL object 131 132 We can return None out of this function to signal that no data is 133 available right now. Better than an exception, which differs 134 depending on which SSL lib we're using. Unfortunately returning '' 135 can indicate that the socket has been closed, so to be sure, we avoid 136 this by returning None. 137 """ 138 raise NotImplementedError
139
140 - def send(self, data, flags=None, now=False):
141 """ 142 Send wrapper for SSL object 143 """ 144 raise NotImplementedError
145 146
147 -class PyOpenSSLWrapper(SSLWrapper):
148 """ 149 Wrapper class for PyOpenSSL's recv() and send() methods 150 """ 151
152 - def __init__(self, *args):
153 self.parent = SSLWrapper 154 self.parent.__init__(self, *args)
155
156 - def is_numtoolarge(self, e):
157 ''' Magic methods don't need documentation ''' 158 t = ('asn1 encoding routines', 'a2d_ASN1_OBJECT', 'first num too large') 159 return (isinstance(e.args, (list, tuple)) and len(e.args) == 1 and 160 isinstance(e.args[0], (list, tuple)) and len(e.args[0]) == 2 and 161 e.args[0][0] == e.args[0][1] == t)
162
163 - def recv(self, bufsize, flags=None):
164 retval = None 165 try: 166 if flags is None: 167 retval = self.sslobj.recv(bufsize) 168 else: 169 retval = self.sslobj.recv(bufsize, flags) 170 except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError), e: 171 log.debug("Recv: Want-error: " + repr(e)) 172 except OpenSSL.SSL.SysCallError, e: 173 log.debug("Recv: Got OpenSSL.SSL.SysCallError: " + repr(e), 174 exc_info=True) 175 raise SSLWrapper.Error(self.sock or self.sslobj, e) 176 except OpenSSL.SSL.ZeroReturnError, e: 177 # end-of-connection raises ZeroReturnError instead of having the 178 # connection's .recv() method return a zero-sized result. 179 raise SSLWrapper.Error(self.sock or self.sslobj, e, -1) 180 except OpenSSL.SSL.Error, e: 181 if self.is_numtoolarge(e): 182 # warn, but ignore this exception 183 log.warning("Recv: OpenSSL: asn1enc: first num too large (ignored)") 184 else: 185 log.debug("Recv: Caught OpenSSL.SSL.Error:", exc_info=True) 186 raise SSLWrapper.Error(self.sock or self.sslobj, e) 187 return retval
188
189 - def send(self, data, flags=None, now=False):
190 try: 191 if flags is None: 192 return self.sslobj.send(data) 193 else: 194 return self.sslobj.send(data, flags) 195 except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError), e: 196 #log.debug("Send: " + repr(e)) 197 time.sleep(0.1) # prevent 100% CPU usage 198 except OpenSSL.SSL.SysCallError, e: 199 log.error("Send: Got OpenSSL.SSL.SysCallError: " + repr(e), 200 exc_info=True) 201 raise SSLWrapper.Error(self.sock or self.sslobj, e) 202 except OpenSSL.SSL.Error, e: 203 if self.is_numtoolarge(e): 204 # warn, but ignore this exception 205 log.warning("Send: OpenSSL: asn1enc: first num too large (ignored)") 206 else: 207 log.error("Send: Caught OpenSSL.SSL.Error:", exc_info=True) 208 raise SSLWrapper.Error(self.sock or self.sslobj, e) 209 return 0
210 211
212 -class StdlibSSLWrapper(SSLWrapper):
213 """ 214 Wrapper class for Python socket.ssl read() and write() methods 215 """ 216
217 - def __init__(self, *args):
218 self.parent = SSLWrapper 219 self.parent.__init__(self, *args)
220
221 - def recv(self, bufsize, flags=None):
222 # we simply ignore flags since ssl object doesn't support it 223 try: 224 return self.sslobj.read(bufsize) 225 except socket.sslerror, e: 226 log.debug("Recv: Caught socket.sslerror: " + repr(e), exc_info=True) 227 if e.args[0] not in (socket.SSL_ERROR_WANT_READ, socket.SSL_ERROR_WANT_WRITE): 228 raise SSLWrapper.Error(self.sock or self.sslobj, e) 229 return None
230
231 - def send(self, data, flags=None, now=False):
232 # we simply ignore flags since ssl object doesn't support it 233 try: 234 return self.sslobj.write(data) 235 except socket.sslerror, e: 236 log.debug("Send: Caught socket.sslerror:", exc_info=True) 237 if e.args[0] not in (socket.SSL_ERROR_WANT_READ, socket.SSL_ERROR_WANT_WRITE): 238 raise SSLWrapper.Error(self.sock or self.sslobj, e) 239 return 0
240 241
242 -class NonBlockingTLS(PlugIn):
243 """ 244 TLS connection used to encrypts already estabilished tcp connection 245 246 Can be plugged into NonBlockingTCP and will make use of StdlibSSLWrapper or 247 PyOpenSSLWrapper. 248 """ 249
250 - def __init__(self, cacerts, mycerts):
251 """ 252 :param cacerts: path to pem file with certificates of known XMPP servers 253 :param mycerts: path to pem file with certificates of user trusted servers 254 """ 255 PlugIn.__init__(self) 256 self.cacerts = cacerts 257 self.mycerts = mycerts
258 259 # from ssl.h (partial extract) 260 ssl_h_bits = { "SSL_ST_CONNECT": 0x1000, "SSL_ST_ACCEPT": 0x2000, 261 "SSL_CB_LOOP": 0x01, "SSL_CB_EXIT": 0x02, 262 "SSL_CB_READ": 0x04, "SSL_CB_WRITE": 0x08, 263 "SSL_CB_ALERT": 0x4000, 264 "SSL_CB_HANDSHAKE_START": 0x10, "SSL_CB_HANDSHAKE_DONE": 0x20} 265
266 - def plugin(self, owner):
267 """ 268 Use to PlugIn TLS into transport and start establishing immediately. 269 Returns True if TLS/SSL was established correctly, otherwise False 270 """ 271 log.info('Starting TLS estabilishing') 272 try: 273 res = self._startSSL() 274 except Exception, e: 275 log.error("PlugIn: while trying _startSSL():", exc_info=True) 276 return False 277 return res
278
279 - def _dumpX509(self, cert, stream=sys.stderr):
280 print >> stream, "Digest (SHA-1):", cert.digest("sha1") 281 print >> stream, "Digest (MD5):", cert.digest("md5") 282 print >> stream, "Serial #:", cert.get_serial_number() 283 print >> stream, "Version:", cert.get_version() 284 print >> stream, "Expired:", ("Yes" if cert.has_expired() else "No") 285 print >> stream, "Subject:" 286 self._dumpX509Name(cert.get_subject(), stream) 287 print >> stream, "Issuer:" 288 self._dumpX509Name(cert.get_issuer(), stream) 289 self._dumpPKey(cert.get_pubkey(), stream)
290
291 - def _dumpX509Name(self, name, stream=sys.stderr):
292 print >> stream, "X509Name:", str(name)
293
294 - def _dumpPKey(self, pkey, stream=sys.stderr):
295 typedict = {OpenSSL.crypto.TYPE_RSA: "RSA", 296 OpenSSL.crypto.TYPE_DSA: "DSA"} 297 print >> stream, "PKey bits:", pkey.bits() 298 print >> stream, "PKey type: %s (%d)" % (typedict.get(pkey.type(), 299 "Unknown"), pkey.type())
300
301 - def _startSSL(self):
302 """ 303 Immediatedly switch socket to TLS mode. Used internally 304 """ 305 log.debug("_startSSL called") 306 307 if USE_PYOPENSSL: 308 result = self._startSSL_pyOpenSSL() 309 else: 310 result = self._startSSL_stdlib() 311 312 if result: 313 log.debug('Synchronous handshake completed') 314 return True 315 else: 316 return False
317
318 - def _load_cert_file(self, cert_path, cert_store, logg=True):
319 if not os.path.isfile(cert_path): 320 return 321 try: 322 f = open(cert_path) 323 except IOError, e: 324 log.warning('Unable to open certificate file %s: %s' % \ 325 (cert_path, str(e))) 326 return 327 lines = f.readlines() 328 i = 0 329 begin = -1 330 for line in lines: 331 if 'BEGIN CERTIFICATE' in line: 332 begin = i 333 elif 'END CERTIFICATE' in line and begin > -1: 334 cert = ''.join(lines[begin:i+2]) 335 try: 336 x509cert = OpenSSL.crypto.load_certificate( 337 OpenSSL.crypto.FILETYPE_PEM, cert) 338 cert_store.add_cert(x509cert) 339 except OpenSSL.crypto.Error, exception_obj: 340 if logg: 341 log.warning('Unable to load a certificate from file %s: %s' %\ 342 (cert_path, exception_obj.args[0][0][2])) 343 except: 344 log.warning('Unknown error while loading certificate from file ' 345 '%s' % cert_path) 346 begin = -1 347 i += 1
348
349 - def _startSSL_pyOpenSSL(self):
350 log.debug("_startSSL_pyOpenSSL called") 351 tcpsock = self._owner 352 # NonBlockingHTTPBOSH instance has no attribute _owner 353 if hasattr(tcpsock, '_owner') and tcpsock._owner._caller.client_cert \ 354 and os.path.exists(tcpsock._owner._caller.client_cert): 355 conn = tcpsock._owner._caller 356 # FIXME make a checkbox for Client Cert / SSLv23 / TLSv1 357 # If we are going to use a client cert/key pair for authentication, 358 # we choose TLSv1 method. 359 tcpsock._sslContext = OpenSSL.SSL.Context(OpenSSL.SSL.TLSv1_METHOD) 360 log.debug('Using client cert and key from %s' % conn.client_cert) 361 try: 362 p12 = OpenSSL.crypto.load_pkcs12(open(conn.client_cert).read(), 363 conn.client_cert_passphrase) 364 except OpenSSL.crypto.Error, exception_obj: 365 log.warning('Unable to load client pkcs12 certificate from ' 366 'file %s: %s ... Is it a valid PKCS12 cert?' % \ 367 (conn.client_cert, exception_obj.args)) 368 except: 369 log.warning('Unknown error while loading certificate from file ' 370 '%s' % conn.client_cert) 371 else: 372 log.info('PKCS12 Client cert loaded OK') 373 try: 374 tcpsock._sslContext.use_certificate(p12.get_certificate()) 375 tcpsock._sslContext.use_privatekey(p12.get_privatekey()) 376 log.info('p12 cert and key loaded') 377 except OpenSSL.crypto.Error, exception_obj: 378 log.warning('Unable to extract client certificate from ' 379 'file %s' % conn.client_cert) 380 except Exception, msg: 381 log.warning('Unknown error extracting client certificate ' 382 'from file %s: %s' % (conn.client_cert, msg)) 383 else: 384 log.info('client cert and key loaded OK') 385 else: 386 # See http://docs.python.org/dev/library/ssl.html 387 tcpsock._sslContext = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD) 388 flags = OpenSSL.SSL.OP_NO_SSLv2 389 try: 390 flags |= OpenSSL.SSL.OP_NO_TICKET 391 except AttributeError, e: 392 # py-OpenSSL < 0.9 or old OpenSSL 393 flags |= 16384 394 tcpsock._sslContext.set_options(flags) 395 396 tcpsock.ssl_errnum = [] 397 tcpsock._sslContext.set_verify(OpenSSL.SSL.VERIFY_PEER, 398 self._ssl_verify_callback) 399 store = tcpsock._sslContext.get_cert_store() 400 self._load_cert_file(self.cacerts, store) 401 self._load_cert_file(self.mycerts, store) 402 if os.path.isdir('/etc/ssl/certs'): 403 for f in os.listdir('/etc/ssl/certs'): 404 # We don't logg because there is a lot a duplicated certs in this 405 # folder 406 self._load_cert_file(os.path.join('/etc/ssl/certs', f), store, 407 logg=False) 408 409 tcpsock._sslObj = OpenSSL.SSL.Connection(tcpsock._sslContext, 410 tcpsock._sock) 411 tcpsock._sslObj.set_connect_state() # set to client mode 412 wrapper = PyOpenSSLWrapper(tcpsock._sslObj) 413 tcpsock._recv = wrapper.recv 414 tcpsock._send = wrapper.send 415 416 log.debug("Initiating handshake...") 417 try: 418 tcpsock._sslObj.do_handshake() 419 except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError), e: 420 pass 421 except: 422 log.error('Error while TLS handshake: ', exc_info=True) 423 return False 424 self._owner.ssl_lib = PYOPENSSL 425 return True
426
427 - def _startSSL_stdlib(self):
428 log.debug("_startSSL_stdlib called") 429 tcpsock=self._owner 430 try: 431 tcpsock._sock.setblocking(True) 432 tcpsock._sslObj = socket.ssl(tcpsock._sock, None, None) 433 tcpsock._sock.setblocking(False) 434 tcpsock._sslIssuer = tcpsock._sslObj.issuer() 435 tcpsock._sslServer = tcpsock._sslObj.server() 436 wrapper = StdlibSSLWrapper(tcpsock._sslObj, tcpsock._sock) 437 tcpsock._recv = wrapper.recv 438 tcpsock._send = wrapper.send 439 except: 440 log.error("Exception caught in _startSSL_stdlib:", exc_info=True) 441 return False 442 self._owner.ssl_lib = PYSTDLIB 443 return True
444
445 - def _ssl_verify_callback(self, sslconn, cert, errnum, depth, ok):
446 # Exceptions can't propagate up through this callback, so print them here. 447 try: 448 self._owner.ssl_fingerprint_sha1.append(cert.digest('sha1')) 449 self._owner.ssl_certificate.append(cert) 450 self._owner.ssl_errnum.append(errnum) 451 self._owner.ssl_cert_pem.append(OpenSSL.crypto.dump_certificate( 452 OpenSSL.crypto.FILETYPE_PEM, cert)) 453 return True 454 except: 455 log.error("Exception caught in _ssl_info_callback:", exc_info=True) 456 # Make sure something is printed, even if log is disabled. 457 traceback.print_exc()
458

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.tls_nb.NonBlockingTLS-class.html000066400000000000000000000727261343257752000275020ustar00rootroot00000000000000 nbxmpp.tls_nb.NonBlockingTLS
Package nbxmpp :: Module tls_nb :: Class NonBlockingTLS
[hide private]
[frames] | no frames]

Class NonBlockingTLS

source code


TLS connection used to encrypts already estabilished tcp connection

Can be plugged into NonBlockingTCP and will make use of StdlibSSLWrapper or PyOpenSSLWrapper.

Instance Methods [hide private]
 
__init__(self, cacerts, mycerts) source code
 
plugin(self, owner)
Use to PlugIn TLS into transport and start establishing immediately. Returns True if TLS/SSL was established correctly, otherwise False
source code
 
_dumpX509(self, cert, stream=sys.stderr) source code
 
_dumpX509Name(self, name, stream=sys.stderr) source code
 
_dumpPKey(self, pkey, stream=sys.stderr) source code
 
_startSSL(self)
Immediatedly switch socket to TLS mode. Used internally
source code
 
_load_cert_file(self, cert_path, cert_store, logg=True) source code
 
_startSSL_pyOpenSSL(self) source code
 
_startSSL_stdlib(self) source code
 
_ssl_verify_callback(self, sslconn, cert, errnum, depth, ok) source code

Inherited from plugin.PlugIn: PlugIn, PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Class Variables [hide private]
  ssl_h_bits = {'SSL_CB_ALERT': 16384, 'SSL_CB_EXIT': 2, 'SSL_CB...
Method Details [hide private]

__init__(self, cacerts, mycerts)
(Constructor)

source code 
Parameters:
  • cacerts - path to pem file with certificates of known XMPP servers
  • mycerts - path to pem file with certificates of user trusted servers
Overrides: plugin.PlugIn.__init__

plugin(self, owner)

source code 
Use to PlugIn TLS into transport and start establishing immediately. Returns True if TLS/SSL was established correctly, otherwise False

_dumpX509(self, cert, stream=sys.stderr)

source code 

_dumpX509Name(self, name, stream=sys.stderr)

source code 

_dumpPKey(self, pkey, stream=sys.stderr)

source code 

_startSSL(self)

source code 
Immediatedly switch socket to TLS mode. Used internally

_load_cert_file(self, cert_path, cert_store, logg=True)

source code 

_startSSL_pyOpenSSL(self)

source code 

_startSSL_stdlib(self)

source code 

_ssl_verify_callback(self, sslconn, cert, errnum, depth, ok)

source code 

Class Variable Details [hide private]

ssl_h_bits

Value:
{'SSL_CB_ALERT': 16384,
 'SSL_CB_EXIT': 2,
 'SSL_CB_HANDSHAKE_DONE': 32,
 'SSL_CB_HANDSHAKE_START': 16,
 'SSL_CB_LOOP': 1,
 'SSL_CB_READ': 4,
 'SSL_CB_WRITE': 8,
 'SSL_ST_ACCEPT': 8192,
...

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.tls_nb.PyOpenSSLWrapper-class.html000066400000000000000000000356451343257752000300500ustar00rootroot00000000000000 nbxmpp.tls_nb.PyOpenSSLWrapper
Package nbxmpp :: Module tls_nb :: Class PyOpenSSLWrapper
[hide private]
[frames] | no frames]

Class PyOpenSSLWrapper

source code


Wrapper class for PyOpenSSL's recv() and send() methods
Nested Classes [hide private]

Inherited from SSLWrapper: Error

Instance Methods [hide private]
 
__init__(self, *args) source code
 
is_numtoolarge(self, e)
Magic methods don't need documentation
source code
 
recv(self, bufsize, flags=None)
Receive wrapper for SSL object
source code
 
send(self, data, flags=None, now=False)
Send wrapper for SSL object
source code
Method Details [hide private]

__init__(self, *args)
(Constructor)

source code 
Overrides: SSLWrapper.__init__

is_numtoolarge(self, e)

source code 
Magic methods don't need documentation

recv(self, bufsize, flags=None)

source code 

Receive wrapper for SSL object

We can return None out of this function to signal that no data is available right now. Better than an exception, which differs depending on which SSL lib we're using. Unfortunately returning '' can indicate that the socket has been closed, so to be sure, we avoid this by returning None.

Overrides: SSLWrapper.recv
(inherited documentation)

send(self, data, flags=None, now=False)

source code 
Send wrapper for SSL object
Overrides: SSLWrapper.send
(inherited documentation)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.tls_nb.SSLWrapper-class.html000066400000000000000000000320601343257752000267010ustar00rootroot00000000000000 nbxmpp.tls_nb.SSLWrapper
Package nbxmpp :: Module tls_nb :: Class SSLWrapper
[hide private]
[frames] | no frames]

Class SSLWrapper

source code


Abstract SSLWrapper base class
Nested Classes [hide private]
  Error
Generic SSL Error Wrapper
Instance Methods [hide private]
 
__init__(self, sslobj, sock=None) source code
 
recv(self, data, flags=None)
Receive wrapper for SSL object
source code
 
send(self, data, flags=None, now=False)
Send wrapper for SSL object
source code
Method Details [hide private]

__init__(self, sslobj, sock=None)
(Constructor)

source code 

recv(self, data, flags=None)

source code 

Receive wrapper for SSL object

We can return None out of this function to signal that no data is available right now. Better than an exception, which differs depending on which SSL lib we're using. Unfortunately returning '' can indicate that the socket has been closed, so to be sure, we avoid this by returning None.

send(self, data, flags=None, now=False)

source code 
Send wrapper for SSL object

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.tls_nb.SSLWrapper.Error-class.html000066400000000000000000000360331343257752000277750ustar00rootroot00000000000000 nbxmpp.tls_nb.SSLWrapper.Error
Package nbxmpp :: Module tls_nb :: Class SSLWrapper :: Class Error
[hide private]
[frames] | no frames]

Class Error

source code


Generic SSL Error Wrapper
Instance Methods [hide private]
 
__init__(self, sock=None, exc=None, errno=None, strerror=None, peer=None)
x.__init__(...) initializes x; see help(type(x)) for signature
source code
 
__str__(self)
str(x)
source code

Inherited from exceptions.IOError: __new__

Inherited from exceptions.EnvironmentError: __reduce__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __repr__, __setattr__, __setstate__, __unicode__

Inherited from object: __format__, __hash__, __reduce_ex__, __sizeof__, __subclasshook__

Properties [hide private]

Inherited from exceptions.EnvironmentError: errno, filename, strerror

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

Method Details [hide private]

__init__(self, sock=None, exc=None, errno=None, strerror=None, peer=None)
(Constructor)

source code 
x.__init__(...) initializes x; see help(type(x)) for signature
Overrides: object.__init__
(inherited documentation)

__str__(self)
(Informal representation operator)

source code 
str(x)
Overrides: object.__str__
(inherited documentation)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.tls_nb.StdlibSSLWrapper-class.html000066400000000000000000000324451343257752000300520ustar00rootroot00000000000000 nbxmpp.tls_nb.StdlibSSLWrapper
Package nbxmpp :: Module tls_nb :: Class StdlibSSLWrapper
[hide private]
[frames] | no frames]

Class StdlibSSLWrapper

source code


Wrapper class for Python socket.ssl read() and write() methods
Nested Classes [hide private]

Inherited from SSLWrapper: Error

Instance Methods [hide private]
 
__init__(self, *args) source code
 
recv(self, bufsize, flags=None)
Receive wrapper for SSL object
source code
 
send(self, data, flags=None, now=False)
Send wrapper for SSL object
source code
Method Details [hide private]

__init__(self, *args)
(Constructor)

source code 
Overrides: SSLWrapper.__init__

recv(self, bufsize, flags=None)

source code 

Receive wrapper for SSL object

We can return None out of this function to signal that no data is available right now. Better than an exception, which differs depending on which SSL lib we're using. Unfortunately returning '' can indicate that the socket has been closed, so to be sure, we avoid this by returning None.

Overrides: SSLWrapper.recv
(inherited documentation)

send(self, data, flags=None, now=False)

source code 
Send wrapper for SSL object
Overrides: SSLWrapper.send
(inherited documentation)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.transports_nb-module.html000066400000000000000000000651601343257752000265040ustar00rootroot00000000000000 nbxmpp.transports_nb
Package nbxmpp :: Module transports_nb
[hide private]
[frames] | no frames]

Module transports_nb

source code

Transports are objects responsible for connecting to XMPP server and putting data to wrapped sockets in in desired form (SSL, TLS, TCP, for HTTP proxy, for SOCKS5 proxy...)

Transports are not aware of XMPP stanzas and only responsible for low-level connection handling.

Classes [hide private]
  NonBlockingTransport
Abstract class representing a transport
  NonBlockingTCP
Non-blocking TCP socket wrapper
  NonBlockingHTTP
Socket wrapper that creates HTTP message out of sent data and peels-off HTTP headers from incoming messages
  NonBlockingHTTPBOSH
Class for BOSH HTTP connections. Slightly redefines HTTP transport by calling bosh bodytag generating callback before putting data on wire
Functions [hide private]
 
urisplit(uri)
Function for splitting URI string to tuple (protocol, host, port, path). e.g. urisplit('http://httpcm.jabber.org:123/webclient') returns ('http', 'httpcm.jabber.org', 123, '/webclient') return 443 as default port if proto is https else 80
source code
 
get_proxy_data_from_dict(proxy) source code
Variables [hide private]
  log = logging.getLogger('nbxmpp.transports_nb')
  CONNECT_TIMEOUT_SECONDS = 30
timeout to connect to the server socket, it doesn't include auth
  DISCONNECT_TIMEOUT_SECONDS = 5
how long to wait for a disconnect to complete
  RECV_BUFSIZE = 32768
size of the buffer which reads data from server
  DATA_RECEIVED = 'DATA RECEIVED'
  DATA_SENT = 'DATA SENT'
  DATA_ERROR = 'DATA ERROR'
  DISCONNECTED = 'DISCONNECTED'
  DISCONNECTING = 'DISCONNECTING'
  CONNECTING = 'CONNECTING'
  PROXY_CONNECTING = 'PROXY_CONNECTING'
  CONNECTED = 'CONNECTED'
  STATES = ('DISCONNECTED', 'CONNECTING', 'PROXY_CONNECTING', 'C...
  __package__ = 'nbxmpp'

Imports: ustr, PlugIn, IdleObject, proxy_connectors, tls_nb, socket, errno, time, traceback, base64, urlparse, logging


Function Details [hide private]

urisplit(uri)

source code 
Function for splitting URI string to tuple (protocol, host, port, path). e.g. urisplit('http://httpcm.jabber.org:123/webclient') returns ('http', 'httpcm.jabber.org', 123, '/webclient') return 443 as default port if proto is https else 80

get_proxy_data_from_dict(proxy)

source code 

Variables Details [hide private]

log

Value:
logging.getLogger('nbxmpp.transports_nb')

CONNECT_TIMEOUT_SECONDS

timeout to connect to the server socket, it doesn't include auth
Value:
30

DISCONNECT_TIMEOUT_SECONDS

how long to wait for a disconnect to complete
Value:
5

RECV_BUFSIZE

size of the buffer which reads data from server
Value:
32768

DATA_RECEIVED

Value:
'DATA RECEIVED'

DATA_SENT

Value:
'DATA SENT'

DATA_ERROR

Value:
'DATA ERROR'

DISCONNECTED

Value:
'DISCONNECTED'

DISCONNECTING

Value:
'DISCONNECTING'

CONNECTING

Value:
'CONNECTING'

PROXY_CONNECTING

Value:
'PROXY_CONNECTING'

CONNECTED

Value:
'CONNECTED'

STATES

Value:
('DISCONNECTED',
 'CONNECTING',
 'PROXY_CONNECTING',
 'CONNECTED',
 'DISCONNECTING')

__package__

Value:
'nbxmpp'

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.transports_nb-pysrc.html000066400000000000000000010411611343257752000263530ustar00rootroot00000000000000 nbxmpp.transports_nb
Package nbxmpp :: Module transports_nb
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.transports_nb

  1  ##   transports_nb.py 
  2  ##       based on transports.py 
  3  ## 
  4  ##   Copyright (C) 2003-2004 Alexey "Snake" Nezhdanov 
  5  ##       modified by Dimitur Kirov <dkirov@gmail.com> 
  6  ##       modified by Tomas Karasek <tom.to.the.k@gmail.com> 
  7  ## 
  8  ##   This program is free software; you can redistribute it and/or modify 
  9  ##   it under the terms of the GNU General Public License as published by 
 10  ##   the Free Software Foundation; either version 2, or (at your option) 
 11  ##   any later version. 
 12  ## 
 13  ##   This program is distributed in the hope that it will be useful, 
 14  ##   but WITHOUT ANY WARRANTY; without even the implied warranty of 
 15  ##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 16  ##   GNU General Public License for more details. 
 17   
 18  """ 
 19  Transports are objects responsible for connecting to XMPP server and putting 
 20  data to wrapped sockets in in desired form (SSL, TLS, TCP, for HTTP proxy, 
 21  for SOCKS5 proxy...) 
 22   
 23  Transports are not aware of XMPP stanzas and only responsible for low-level 
 24  connection handling. 
 25  """ 
 26   
 27  from simplexml import ustr 
 28  from plugin import PlugIn 
 29  from idlequeue import IdleObject 
 30  import proxy_connectors 
 31  import tls_nb 
 32   
 33  import socket 
 34  import errno 
 35  import time 
 36  import traceback 
 37  import base64 
 38  import urlparse 
 39   
 40  import logging 
 41  log = logging.getLogger('nbxmpp.transports_nb') 
 42   
43 -def urisplit(uri):
44 """ 45 Function for splitting URI string to tuple (protocol, host, port, path). 46 e.g. urisplit('http://httpcm.jabber.org:123/webclient') returns ('http', 47 'httpcm.jabber.org', 123, '/webclient') return 443 as default port if proto 48 is https else 80 49 """ 50 splitted = urlparse.urlsplit(uri) 51 proto, host, path = splitted.scheme, splitted.hostname, splitted.path 52 try: 53 port = splitted.port 54 except ValueError: 55 log.warn('port cannot be extracted from BOSH URL %s, using default port' \ 56 % uri) 57 port = '' 58 if not port: 59 if proto == 'https': 60 port = 443 61 else: 62 port = 80 63 return proto, host, port, path
64
65 -def get_proxy_data_from_dict(proxy):
66 tcp_host, tcp_port, proxy_user, proxy_pass = None, None, None, None 67 proxy_type = proxy['type'] 68 if proxy_type == 'bosh' and not proxy['bosh_useproxy']: 69 # with BOSH not over proxy we have to parse the hostname from BOSH URI 70 proto, tcp_host, tcp_port, path = urisplit(proxy['bosh_uri']) 71 else: 72 # with proxy!=bosh or with bosh over HTTP proxy we're connecting to proxy 73 # machine 74 tcp_host, tcp_port = proxy['host'], proxy['port'] 75 if proxy.get('useauth', False): 76 proxy_user, proxy_pass = proxy['user'], proxy['pass'] 77 return tcp_host, tcp_port, proxy_user, proxy_pass
78 79 #: timeout to connect to the server socket, it doesn't include auth 80 CONNECT_TIMEOUT_SECONDS = 30 81 82 #: how long to wait for a disconnect to complete 83 DISCONNECT_TIMEOUT_SECONDS = 5 84 85 #: size of the buffer which reads data from server 86 # if lower, more stanzas will be fragmented and processed twice 87 RECV_BUFSIZE = 32768 # 2x maximum size of ssl packet, should be plenty 88 # it's inefficient but should work. Problem is that connect machine makes wrong 89 # assumptions and that we only check for pending data in sockets but not in SSL 90 # buffer... 91 92 DATA_RECEIVED = 'DATA RECEIVED' 93 DATA_SENT = 'DATA SENT' 94 DATA_ERROR = 'DATA ERROR' 95 96 DISCONNECTED = 'DISCONNECTED' 97 DISCONNECTING = 'DISCONNECTING' 98 CONNECTING = 'CONNECTING' 99 PROXY_CONNECTING = 'PROXY_CONNECTING' 100 CONNECTED = 'CONNECTED' 101 STATES = (DISCONNECTED, CONNECTING, PROXY_CONNECTING, CONNECTED, DISCONNECTING) 102
103 -class NonBlockingTransport(PlugIn):
104 """ 105 Abstract class representing a transport 106 107 Subclasses CAN have different constructor signature but connect method SHOULD 108 be the same. 109 """ 110
111 - def __init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, 112 certs):
113 """ 114 Each trasport class can have different constructor but it has to have at 115 least all the arguments of NonBlockingTransport constructor 116 117 :param raise_event: callback for monitoring of sent and received data 118 :param on_disconnect: callback called on disconnection during runtime 119 :param idlequeue: processing idlequeue 120 :param estabilish_tls: boolean whether to estabilish TLS connection after 121 TCP connection is done 122 :param certs: tuple of (cacerts, mycerts) see constructor of 123 tls_nb.NonBlockingTLS for more details 124 """ 125 PlugIn.__init__(self) 126 self.raise_event = raise_event 127 self.on_disconnect = on_disconnect 128 self.on_connect = None 129 self.on_connect_failure = None 130 self.idlequeue = idlequeue 131 self.on_receive = None 132 self.server = None 133 self.port = None 134 self.conn_5tuple = None 135 self.set_state(DISCONNECTED) 136 self.estabilish_tls = estabilish_tls 137 self.certs = certs 138 # type of used ssl lib (if any) will be assigned to this member var 139 self.ssl_lib = None 140 self._exported_methods=[self.onreceive, self.set_send_timeout, 141 self.set_send_timeout2, self.set_timeout, self.remove_timeout, 142 self.start_disconnect] 143 144 # time to wait for SOME stanza to come and then send keepalive 145 self.sendtimeout = 0 146 147 # in case we want to something different than sending keepalives 148 self.on_timeout = None 149 self.on_timeout2 = None
150
151 - def plugin(self, owner):
152 owner.Connection = self
153
154 - def plugout(self):
155 self._owner.Connection = None 156 self._owner = None 157 self.disconnect(do_callback=False)
158
159 - def connect(self, conn_5tuple, on_connect, on_connect_failure):
160 """ 161 Creates and connects transport to server and port defined in conn_5tuple 162 which should be item from list returned from getaddrinfo 163 164 :param conn_5tuple: 5-tuple returned from getaddrinfo 165 :param on_connect: callback called on successful connect to the server 166 :param on_connect_failure: callback called on failure when connecting 167 """ 168 self.on_connect = on_connect 169 self.on_connect_failure = on_connect_failure 170 self.server, self.port = conn_5tuple[4][:2] 171 self.conn_5tuple = conn_5tuple
172
173 - def set_state(self, newstate):
174 assert(newstate in STATES) 175 self.state = newstate
176
177 - def get_state(self):
178 return self.state
179
180 - def _on_connect(self):
181 """ 182 Preceeds call of on_connect callback 183 """ 184 # data is reference to socket wrapper instance. We don't need it in client 185 # because 186 self.set_state(CONNECTED) 187 self.on_connect()
188
189 - def _on_connect_failure(self, err_message):
190 """ 191 Preceeds call of on_connect_failure callback 192 """ 193 # In case of error while connecting we need to disconnect transport 194 # but we don't want to call DisconnectHandlers from client, 195 # thus the do_callback=False 196 self.disconnect(do_callback=False) 197 self.on_connect_failure(err_message=err_message)
198
199 - def send(self, raw_data, now=False):
200 if self.get_state() == DISCONNECTED: 201 log.error('Unable to send %s \n because state is %s.' % 202 (raw_data, self.get_state()))
203
204 - def disconnect(self, do_callback=True):
205 self.set_state(DISCONNECTED) 206 if do_callback: 207 # invoke callback given in __init__ 208 self.on_disconnect()
209
210 - def onreceive(self, recv_handler):
211 """ 212 Set the on_receive callback. 213 214 onreceive(None) sets callback to Dispatcher.ProcessNonBlocking which is 215 the default one that will decide what to do with received stanza based on 216 its tag name and namespace. 217 218 Do not confuse it with on_receive() method, which is the callback 219 itself. 220 """ 221 if not recv_handler: 222 if hasattr(self, '_owner') and hasattr(self._owner, 'Dispatcher'): 223 self.on_receive = self._owner.Dispatcher.ProcessNonBlocking 224 else: 225 log.warn('No Dispatcher plugged. Received data will not be processed') 226 self.on_receive = None 227 return 228 self.on_receive = recv_handler
229
230 - def _tcp_connecting_started(self):
232
233 - def read_timeout(self):
234 """ 235 Called when there's no response from server in defined timeout 236 """ 237 if self.on_timeout: 238 self.on_timeout() 239 self.renew_send_timeout()
240
241 - def read_timeout2(self):
242 """ 243 called when there's no response from server in defined timeout 244 """ 245 if self.on_timeout2: 246 self.on_timeout2() 247 self.renew_send_timeout2()
248
249 - def renew_send_timeout(self):
250 if self.on_timeout and self.sendtimeout > 0: 251 self.set_timeout(self.sendtimeout)
252
253 - def renew_send_timeout2(self):
254 if self.on_timeout2 and self.sendtimeout2 > 0: 255 self.set_timeout2(self.sendtimeout2)
256
257 - def set_timeout(self, timeout):
258 self.idlequeue.set_read_timeout(self.fd, timeout)
259
260 - def set_timeout2(self, timeout2):
261 self.idlequeue.set_read_timeout(self.fd, timeout2, self.read_timeout2)
262
263 - def get_fd(self):
264 pass
265
266 - def remove_timeout(self):
267 self.idlequeue.remove_timeout(self.fd)
268
269 - def set_send_timeout(self, timeout, on_timeout):
270 self.sendtimeout = timeout 271 if self.sendtimeout > 0: 272 self.on_timeout = on_timeout 273 else: 274 self.on_timeout = None
275
276 - def set_send_timeout2(self, timeout2, on_timeout2):
277 self.sendtimeout2 = timeout2 278 if self.sendtimeout2 > 0: 279 self.on_timeout2 = on_timeout2 280 else: 281 self.on_timeout2 = None
282 283 # FIXME: where and why does this need to be called
284 - def start_disconnect(self):
286 287
288 -class NonBlockingTCP(NonBlockingTransport, IdleObject):
289 """ 290 Non-blocking TCP socket wrapper 291 292 It is used for simple XMPP connection. Can be connected via proxy and can 293 estabilish TLS connection. 294 """
295 - def __init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, 296 certs, proxy_dict=None):
297 """ 298 :param proxy_dict: dictionary with proxy data as loaded from config file 299 """ 300 NonBlockingTransport.__init__(self, raise_event, on_disconnect, idlequeue, 301 estabilish_tls, certs) 302 IdleObject.__init__(self) 303 304 # queue with messages to be send 305 self.sendqueue = [] 306 307 # bytes remained from the last send message 308 self.sendbuff = '' 309 310 self.proxy_dict = proxy_dict 311 self.on_remote_disconnect = self.disconnect 312 313 # ssl variables 314 self.ssl_fingerprint_sha1 = [] 315 self.ssl_certificate = [] 316 self.ssl_errnum = [] 317 self.ssl_cert_pem = []
318 319 # FIXME: transport should not be aware xmpp
320 - def start_disconnect(self):
321 NonBlockingTransport.start_disconnect(self) 322 self.send('</stream:stream>', now=True) 323 self.disconnect()
324
325 - def connect(self, conn_5tuple, on_connect, on_connect_failure):
326 NonBlockingTransport.connect(self, conn_5tuple, on_connect, 327 on_connect_failure) 328 log.info('NonBlockingTCP Connect :: About to connect to %s:%s' % 329 (self.server, self.port)) 330 331 try: 332 self._sock = socket.socket(*conn_5tuple[:3]) 333 except socket.error, (errnum, errstr): 334 self._on_connect_failure('NonBlockingTCP Connect: Error while creating\ 335 socket: %s %s' % (errnum, errstr)) 336 return 337 338 self._send = self._sock.send 339 self._recv = self._sock.recv 340 self.fd = self._sock.fileno() 341 342 # we want to be notified when send is possible to connected socket because 343 # it means the TCP connection is estabilished 344 self._plug_idle(writable=True, readable=False) 345 self.peerhost = None 346 347 # variable for errno symbol that will be found from exception raised 348 # from connect() 349 errnum = 0 350 errstr = str() 351 352 # set timeout for TCP connecting - if nonblocking connect() fails, pollend 353 # is called. If if succeeds pollout is called. 354 self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT_SECONDS) 355 356 try: 357 self._sock.setblocking(False) 358 self._sock.connect((self.server, self.port)) 359 except Exception, exc: 360 if type(exc.args) == tuple: 361 errnum, errstr = exc.args 362 else: 363 errnum = 'unknown' 364 errstr = exc.args 365 366 if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): 367 # connecting in progress 368 log.info('After NB connect() of %s. "%s" raised => CONNECTING' % 369 (id(self), errstr)) 370 self._tcp_connecting_started() 371 return 372 373 # if there was some other exception, call failure callback and unplug 374 # transport which will also remove read_timeouts for descriptor 375 self._on_connect_failure('Exception while connecting to %s:%s - %s %s' % 376 (self.server, self.port, errnum, errstr))
377
378 - def _connect_to_proxy(self):
379 self.set_state(PROXY_CONNECTING) 380 if self.proxy_dict['type'] == 'socks5': 381 proxyclass = proxy_connectors.SOCKS5Connector 382 elif self.proxy_dict['type'] == 'http' : 383 proxyclass = proxy_connectors.HTTPCONNECTConnector 384 proxyclass.get_instance( 385 send_method=self.send, 386 onreceive=self.onreceive, 387 old_on_receive=self.on_receive, 388 on_success=self._on_connect, 389 on_failure=self._on_connect_failure, 390 xmpp_server=self.proxy_dict['xmpp_server'], 391 proxy_creds=self.proxy_dict['credentials'])
392
393 - def _on_connect(self):
394 """ 395 Preceed invoking of on_connect callback. TCP connection is already 396 estabilished by this time 397 """ 398 if self.estabilish_tls: 399 self.tls_init( 400 on_succ = lambda: NonBlockingTransport._on_connect(self), 401 on_fail = lambda: self._on_connect_failure( 402 'error while estabilishing TLS')) 403 else: 404 NonBlockingTransport._on_connect(self)
405
406 - def tls_init(self, on_succ, on_fail):
407 """ 408 Estabilishes TLS/SSL using this TCP connection by plugging a 409 NonBlockingTLS module 410 """ 411 cacerts, mycerts = self.certs 412 result = tls_nb.NonBlockingTLS.get_instance(cacerts, mycerts).PlugIn(self) 413 if result: 414 on_succ() 415 else: 416 on_fail()
417
418 - def pollin(self):
419 """ 420 Called by idlequeu when receive on plugged socket is possible 421 """ 422 log.info('pollin called, state == %s' % self.get_state()) 423 self._do_receive()
424
425 - def pollout(self):
426 """ 427 Called by idlequeu when send to plugged socket is possible 428 """ 429 log.info('pollout called, state == %s' % self.get_state()) 430 431 if self.get_state() == CONNECTING: 432 log.info('%s socket wrapper connected' % id(self)) 433 self.idlequeue.remove_timeout(self.fd) 434 self._plug_idle(writable=False, readable=False) 435 self.peerhost = self._sock.getsockname() 436 if self.proxy_dict: 437 self._connect_to_proxy() 438 else: 439 self._on_connect() 440 else: 441 self._do_send()
442
443 - def pollend(self):
444 """ 445 Called by idlequeue on TCP connection errors 446 """ 447 log.info('pollend called, state == %s' % self.get_state()) 448 449 if self.get_state() == CONNECTING: 450 self._on_connect_failure('Error during connect to %s:%s' % 451 (self.server, self.port)) 452 else: 453 self.disconnect()
454
455 - def disconnect(self, do_callback=True):
456 if self.get_state() == DISCONNECTED: 457 return 458 self.set_state(DISCONNECTED) 459 self.idlequeue.unplug_idle(self.fd) 460 if 'NonBlockingTLS' in self.__dict__: 461 self.NonBlockingTLS.PlugOut() 462 try: 463 self._sock.shutdown(socket.SHUT_RDWR) 464 self._sock.close() 465 except socket.error, (errnum, errstr): 466 log.info('Error while disconnecting socket: %s' % errstr) 467 self.fd = -1 468 NonBlockingTransport.disconnect(self, do_callback)
469
470 - def read_timeout(self):
471 log.info('read_timeout called, state == %s' % self.get_state()) 472 if self.get_state() == CONNECTING: 473 # if read_timeout is called during connecting, connect() didn't end yet 474 # thus we have to call the tcp failure callback 475 self._on_connect_failure('Error during connect to %s:%s' % 476 (self.server, self.port)) 477 else: 478 NonBlockingTransport.read_timeout(self)
479
480 - def set_timeout(self, timeout):
481 if self.get_state() != DISCONNECTED and self.fd != -1: 482 NonBlockingTransport.set_timeout(self, timeout) 483 else: 484 log.warn('set_timeout: TIMEOUT NOT SET: state is %s, fd is %s' % 485 (self.get_state(), self.fd))
486
487 - def remove_timeout(self):
488 if self.fd: 489 NonBlockingTransport.remove_timeout(self) 490 else: 491 log.warn('remove_timeout: no self.fd state is %s' % self.get_state())
492
493 - def send(self, raw_data, now=False):
494 """ 495 Append raw_data to the queue of messages to be send. If supplied data is 496 unicode string, encode it to utf-8. 497 """ 498 NonBlockingTransport.send(self, raw_data, now) 499 500 r = self.encode_stanza(raw_data) 501 502 if now: 503 self.sendqueue.insert(0, r) 504 self._do_send() 505 else: 506 self.sendqueue.append(r) 507 508 self._plug_idle(writable=True, readable=True)
509
510 - def encode_stanza(self, stanza):
511 """ 512 Encode str or unicode to utf-8 513 """ 514 if isinstance(stanza, unicode): 515 stanza = stanza.encode('utf-8') 516 elif not isinstance(stanza, str): 517 stanza = ustr(stanza).encode('utf-8') 518 return stanza
519
520 - def _plug_idle(self, writable, readable):
521 """ 522 Plug file descriptor of socket to Idlequeue 523 524 Plugged socket will be watched for "send possible" or/and "recv possible" 525 events. pollin() callback is invoked on "recv possible", pollout() on 526 "send_possible". 527 528 Plugged socket will always be watched for "error" event - in that case, 529 pollend() is called. 530 """ 531 log.info('Plugging fd %d, W:%s, R:%s' % (self.fd, writable, readable)) 532 self.idlequeue.plug_idle(self, writable, readable)
533
534 - def _do_send(self):
535 """ 536 Called when send() to connected socket is possible. First message from 537 sendqueue will be sent 538 """ 539 if not self.sendbuff: 540 if not self.sendqueue: 541 log.warn('calling send on empty buffer and queue') 542 self._plug_idle(writable=False, readable=True) 543 return None 544 self.sendbuff = self.sendqueue.pop(0) 545 try: 546 send_count = self._send(self.sendbuff) 547 if send_count: 548 sent_data = self.sendbuff[:send_count] 549 self.sendbuff = self.sendbuff[send_count:] 550 self._plug_idle( 551 writable=((self.sendqueue!=[]) or (self.sendbuff!='')), 552 readable=True) 553 self.raise_event(DATA_SENT, sent_data) 554 555 except Exception: 556 log.error('_do_send:', exc_info=True) 557 traceback.print_exc() 558 self.disconnect()
559
560 - def _do_receive(self):
561 """ 562 Reads all pending incoming data. Will call owner's disconnected() method 563 if appropriate 564 """ 565 received = None 566 errnum = 0 567 errstr = 'No Error Set' 568 569 try: 570 # get as many bites, as possible, but not more than RECV_BUFSIZE 571 received = self._recv(RECV_BUFSIZE) 572 except socket.error, (errnum, errstr): 573 log.info("_do_receive: got %s:" % received, exc_info=True) 574 except tls_nb.SSLWrapper.Error, e: 575 log.info("_do_receive, caught SSL error, got %s:" % received, 576 exc_info=True) 577 errnum, errstr = e.errno, e.strerror 578 579 if received == '': 580 errstr = 'zero bytes on recv' 581 582 if (self.ssl_lib is None and received == '') or \ 583 (self.ssl_lib == tls_nb.PYSTDLIB and errnum == 8 ) or \ 584 (self.ssl_lib == tls_nb.PYOPENSSL and errnum == -1 ): 585 # 8 in stdlib: errstr == EOF occured in violation of protocol 586 # -1 in pyopenssl: errstr == Unexpected EOF 587 log.info("Disconnected by remote server: #%s, %s" % (errnum, errstr)) 588 self.on_remote_disconnect() 589 return 590 591 if errnum: 592 log.info("Connection to %s:%s lost: %s %s" % (self.server, self.port, 593 errnum, errstr), exc_info=True) 594 self.disconnect() 595 return 596 597 # this branch is for case of non-fatal SSL errors - None is returned from 598 # recv() but no errnum is set 599 if received is None: 600 return 601 602 # we have received some bytes, stop the timeout! 603 self.remove_timeout() 604 self.renew_send_timeout() 605 self.renew_send_timeout2() 606 # pass received data to owner 607 if self.on_receive: 608 self.raise_event(DATA_RECEIVED, received) 609 self._on_receive(received) 610 else: 611 # This should never happen, so we need the debug. 612 # (If there is no handler on receive specified, data is passed to 613 # Dispatcher.ProcessNonBlocking) 614 log.error('SOCKET %s Unhandled data received: %s' % (id(self), 615 received)) 616 self.disconnect()
617
618 - def _on_receive(self, data):
619 """ 620 Preceeds on_receive callback. It peels off and checks HTTP headers in 621 HTTP classes, in here it just calls the callback 622 """ 623 self.on_receive(data)
624 625
626 -class NonBlockingHTTP(NonBlockingTCP):
627 """ 628 Socket wrapper that creates HTTP message out of sent data and peels-off HTTP 629 headers from incoming messages 630 """ 631
632 - def __init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, 633 certs, on_http_request_possible, on_persistent_fallback, http_dict, 634 proxy_dict=None):
635 """ 636 :param on_http_request_possible: method to call when HTTP request to 637 socket owned by transport is possible. 638 :param on_persistent_fallback: callback called when server ends TCP 639 connection. It doesn't have to be fatal for HTTP session. 640 :param http_dict: dictionary with data for HTTP request and headers 641 """ 642 NonBlockingTCP.__init__(self, raise_event, on_disconnect, idlequeue, 643 estabilish_tls, certs, proxy_dict) 644 645 self.http_protocol, self.http_host, self.http_port, self.http_path = \ 646 urisplit(http_dict['http_uri']) 647 self.http_protocol = self.http_protocol or 'http' 648 self.http_path = self.http_path or '/' 649 self.http_version = http_dict['http_version'] 650 self.http_persistent = http_dict['http_persistent'] 651 self.add_proxy_headers = http_dict['add_proxy_headers'] 652 653 if 'proxy_user' in http_dict and 'proxy_pass' in http_dict: 654 self.proxy_user, self.proxy_pass = http_dict['proxy_user'], http_dict[ 655 'proxy_pass'] 656 else: 657 self.proxy_user, self.proxy_pass = None, None 658 659 # buffer for partial responses 660 self.recvbuff = '' 661 self.expected_length = 0 662 self.pending_requests = 0 663 self.on_http_request_possible = on_http_request_possible 664 self.last_recv_time = 0 665 self.close_current_connection = False 666 self.on_remote_disconnect = lambda: on_persistent_fallback(self)
667
668 - def http_send(self, raw_data, now=False):
669 self.send(self.build_http_message(raw_data), now)
670
671 - def _on_receive(self, data):
672 """ 673 Preceeds passing received data to owner class. Gets rid of HTTP headers 674 and checks them. 675 """ 676 if self.get_state() == PROXY_CONNECTING: 677 NonBlockingTCP._on_receive(self, data) 678 return 679 680 # append currently received data to HTTP msg in buffer 681 self.recvbuff = '%s%s' % (self.recvbuff or '', data) 682 statusline, headers, httpbody, buffer_rest = self.parse_http_message( 683 self.recvbuff) 684 685 if not (statusline and headers and httpbody): 686 log.debug('Received incomplete HTTP response') 687 return 688 689 if statusline[1] != '200': 690 log.error('HTTP Error: %s %s' % (statusline[1], statusline[2])) 691 self.disconnect() 692 return 693 self.expected_length = int(headers['Content-Length']) 694 if 'Connection' in headers and headers['Connection'].strip()=='close': 695 self.close_current_connection = True 696 697 if self.expected_length > len(httpbody): 698 # If we haven't received the whole HTTP mess yet, let's end the thread. 699 # It will be finnished from one of following recvs on plugged socket. 700 log.info('not enough bytes in HTTP response - %d expected, got %d' % 701 (self.expected_length, len(httpbody))) 702 else: 703 # First part of buffer has been extraced and is going to be handled, 704 # remove it from buffer 705 self.recvbuff = buffer_rest 706 707 # everything was received 708 self.expected_length = 0 709 710 if not self.http_persistent or self.close_current_connection: 711 # not-persistent connections disconnect after response 712 self.disconnect(do_callback=False) 713 self.close_current_connection = False 714 self.last_recv_time = time.time() 715 self.on_receive(data=httpbody, socket=self) 716 self.on_http_request_possible()
717
718 - def build_http_message(self, httpbody, method='POST'):
719 """ 720 Builds http message with given body. Values for headers and status line 721 fields are taken from class variables 722 """ 723 absolute_uri = '%s://%s:%s%s' % (self.http_protocol, self.http_host, 724 self.http_port, self.http_path) 725 headers = ['%s %s %s' % (method, absolute_uri, self.http_version), 726 'Host: %s:%s' % (self.http_host, self.http_port), 727 'User-Agent: Gajim', 728 'Content-Type: text/xml; charset=utf-8', 729 'Content-Length: %s' % len(str(httpbody))] 730 if self.add_proxy_headers: 731 headers.append('Proxy-Connection: keep-alive') 732 headers.append('Pragma: no-cache') 733 if self.proxy_user and self.proxy_pass: 734 credentials = '%s:%s' % (self.proxy_user, self.proxy_pass) 735 credentials = base64.encodestring(credentials).strip() 736 headers.append('Proxy-Authorization: Basic %s' % credentials) 737 else: 738 headers.append('Connection: Keep-Alive') 739 headers.append('\r\n') 740 headers = '\r\n'.join(headers) 741 return('%s%s' % (headers, httpbody))
742
743 - def parse_http_message(self, message):
744 """ 745 Split http message into a tuple: 746 - (statusline - list of e.g. ['HTTP/1.1', '200', 'OK'], 747 - headers - dictionary of headers e.g. {'Content-Length': '604', 748 'Content-Type': 'text/xml; charset=utf-8'}, 749 - httpbody - string with http body) 750 - http_rest - what is left in the message after a full HTTP header + body 751 """ 752 splitted = message.split('\r\n\r\n') 753 if len(splitted) < 2: 754 # no complete http message. Keep filling the buffer until we find one 755 buffer_rest = message 756 return ('', '', '', buffer_rest) 757 else: 758 (header, httpbody) = splitted[:2] 759 header = header.replace('\r', '') 760 header = header.lstrip('\n') 761 header = header.split('\n') 762 statusline = header[0].split(' ', 2) 763 header = header[1:] 764 headers = {} 765 for dummy in header: 766 row = dummy.split(' ', 1) 767 headers[row[0][:-1]] = row[1] 768 body_size = headers['Content-Length'] 769 rest_splitted = splitted[2:] 770 while (len(httpbody) < body_size) and rest_splitted: 771 # Complete httpbody until it has the announced size 772 httpbody = '\n\n'.join([httpbody, rest_splitted.pop(0)]) 773 buffer_rest = "\n\n".join(rest_splitted) 774 return (statusline, headers, httpbody, buffer_rest)
775 776
777 -class NonBlockingHTTPBOSH(NonBlockingHTTP):
778 """ 779 Class for BOSH HTTP connections. Slightly redefines HTTP transport by 780 calling bosh bodytag generating callback before putting data on wire 781 """ 782
783 - def set_stanza_build_cb(self, build_cb):
784 self.build_cb = build_cb
785
786 - def _do_send(self):
787 if self.state == PROXY_CONNECTING: 788 NonBlockingTCP._do_send(self) 789 return 790 if not self.sendbuff: 791 stanza = self.build_cb(socket=self) 792 stanza = self.encode_stanza(stanza) 793 stanza = self.build_http_message(httpbody=stanza) 794 self.sendbuff = stanza 795 NonBlockingTCP._do_send(self)
796

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.transports_nb.NonBlockingHTTP-class.html000066400000000000000000000760111343257752000312230ustar00rootroot00000000000000 nbxmpp.transports_nb.NonBlockingHTTP
Package nbxmpp :: Module transports_nb :: Class NonBlockingHTTP
[hide private]
[frames] | no frames]

Class NonBlockingHTTP

source code


Socket wrapper that creates HTTP message out of sent data and peels-off HTTP headers from incoming messages
Instance Methods [hide private]
 
__init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, on_http_request_possible, on_persistent_fallback, http_dict, proxy_dict=None)
Each trasport class can have different constructor but it has to have at least all the arguments of NonBlockingTransport constructor
source code
 
http_send(self, raw_data, now=False) source code
 
_on_receive(self, data)
Preceeds passing received data to owner class. Gets rid of HTTP headers and checks them.
source code
 
build_http_message(self, httpbody, method='POST')
Builds http message with given body. Values for headers and status line fields are taken from class variables
source code
 
parse_http_message(self, message)
(statusline - list of e.g. ['HTTP/1.1', '200', 'OK'],
source code

Inherited from NonBlockingTCP: connect, disconnect, encode_stanza, pollend, pollin, pollout, read_timeout, remove_timeout, send, set_timeout, start_disconnect, tls_init

Inherited from NonBlockingTransport: get_fd, get_state, onreceive, plugin, plugout, read_timeout2, renew_send_timeout, renew_send_timeout2, set_send_timeout, set_send_timeout2, set_state, set_timeout2

Inherited from plugin.PlugIn: PlugIn, PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Instance Variables [hide private]

Inherited from idlequeue.IdleObject: fd

Method Details [hide private]

__init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, on_http_request_possible, on_persistent_fallback, http_dict, proxy_dict=None)
(Constructor)

source code 
Each trasport class can have different constructor but it has to have at least all the arguments of NonBlockingTransport constructor
Parameters:
  • on_http_request_possible - method to call when HTTP request to socket owned by transport is possible.
  • on_persistent_fallback - callback called when server ends TCP connection. It doesn't have to be fatal for HTTP session.
  • http_dict - dictionary with data for HTTP request and headers
Overrides: idlequeue.IdleObject.__init__

http_send(self, raw_data, now=False)

source code 

_on_receive(self, data)

source code 
Preceeds passing received data to owner class. Gets rid of HTTP headers and checks them.
Overrides: NonBlockingTCP._on_receive

build_http_message(self, httpbody, method='POST')

source code 
Builds http message with given body. Values for headers and status line fields are taken from class variables

parse_http_message(self, message)

source code 
Split http message into a tuple:
  • (statusline - list of e.g. ['HTTP/1.1', '200', 'OK'],

  • headers - dictionary of headers e.g. {'Content-Length': '604',

    'Content-Type': 'text/xml; charset=utf-8'},

  • httpbody - string with http body)

  • http_rest - what is left in the message after a full HTTP header + body


python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.transports_nb.NonBlockingHTTPBOSH-class.html000066400000000000000000000607771343257752000317130ustar00rootroot00000000000000 nbxmpp.transports_nb.NonBlockingHTTPBOSH
Package nbxmpp :: Module transports_nb :: Class NonBlockingHTTPBOSH
[hide private]
[frames] | no frames]

Class NonBlockingHTTPBOSH

source code


Class for BOSH HTTP connections. Slightly redefines HTTP transport by calling bosh bodytag generating callback before putting data on wire
Instance Methods [hide private]
 
set_stanza_build_cb(self, build_cb) source code
 
_do_send(self)
Called when send() to connected socket is possible. First message from sendqueue will be sent
source code

Inherited from NonBlockingHTTP: __init__, build_http_message, http_send, parse_http_message

Inherited from NonBlockingHTTP (private): _on_receive

Inherited from NonBlockingTCP: connect, disconnect, encode_stanza, pollend, pollin, pollout, read_timeout, remove_timeout, send, set_timeout, start_disconnect, tls_init

Inherited from NonBlockingTransport: get_fd, get_state, onreceive, plugin, plugout, read_timeout2, renew_send_timeout, renew_send_timeout2, set_send_timeout, set_send_timeout2, set_state, set_timeout2

Inherited from plugin.PlugIn: PlugIn, PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Instance Variables [hide private]

Inherited from idlequeue.IdleObject: fd

Method Details [hide private]

set_stanza_build_cb(self, build_cb)

source code 

_do_send(self)

source code 
Called when send() to connected socket is possible. First message from sendqueue will be sent
Overrides: NonBlockingTCP._do_send
(inherited documentation)

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.transports_nb.NonBlockingTCP-class.html000066400000000000000000001426331343257752000310760ustar00rootroot00000000000000 nbxmpp.transports_nb.NonBlockingTCP
Package nbxmpp :: Module transports_nb :: Class NonBlockingTCP
[hide private]
[frames] | no frames]

Class NonBlockingTCP

source code


Non-blocking TCP socket wrapper

It is used for simple XMPP connection. Can be connected via proxy and can estabilish TLS connection.

Instance Methods [hide private]
 
__init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, proxy_dict=None)
Each trasport class can have different constructor but it has to have at least all the arguments of NonBlockingTransport constructor
source code
 
start_disconnect(self) source code
 
connect(self, conn_5tuple, on_connect, on_connect_failure)
Creates and connects transport to server and port defined in conn_5tuple which should be item from list returned from getaddrinfo
source code
 
_connect_to_proxy(self) source code
 
_on_connect(self)
Preceed invoking of on_connect callback. TCP connection is already estabilished by this time
source code
 
tls_init(self, on_succ, on_fail)
Estabilishes TLS/SSL using this TCP connection by plugging a NonBlockingTLS module
source code
 
pollin(self)
Called by idlequeu when receive on plugged socket is possible
source code
 
pollout(self)
Called by idlequeu when send to plugged socket is possible
source code
 
pollend(self)
Called by idlequeue on TCP connection errors
source code
 
disconnect(self, do_callback=True) source code
 
read_timeout(self)
Called when there's no response from server in defined timeout
source code
 
set_timeout(self, timeout) source code
 
remove_timeout(self) source code
 
send(self, raw_data, now=False)
Append raw_data to the queue of messages to be send. If supplied data is unicode string, encode it to utf-8.
source code
 
encode_stanza(self, stanza)
Encode str or unicode to utf-8
source code
 
_plug_idle(self, writable, readable)
Plug file descriptor of socket to Idlequeue
source code
 
_do_send(self)
Called when send() to connected socket is possible. First message from sendqueue will be sent
source code
 
_do_receive(self)
Reads all pending incoming data. Will call owner's disconnected() method if appropriate
source code
 
_on_receive(self, data)
Preceeds on_receive callback. It peels off and checks HTTP headers in HTTP classes, in here it just calls the callback
source code

Inherited from NonBlockingTransport: get_fd, get_state, onreceive, plugin, plugout, read_timeout2, renew_send_timeout, renew_send_timeout2, set_send_timeout, set_send_timeout2, set_state, set_timeout2

Inherited from plugin.PlugIn: PlugIn, PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Instance Variables [hide private]

Inherited from idlequeue.IdleObject: fd

Method Details [hide private]

__init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, proxy_dict=None)
(Constructor)

source code 
Each trasport class can have different constructor but it has to have at least all the arguments of NonBlockingTransport constructor
Parameters:
  • proxy_dict - dictionary with proxy data as loaded from config file
Overrides: idlequeue.IdleObject.__init__

start_disconnect(self)

source code 
Overrides: NonBlockingTransport.start_disconnect

connect(self, conn_5tuple, on_connect, on_connect_failure)

source code 
Creates and connects transport to server and port defined in conn_5tuple which should be item from list returned from getaddrinfo
Parameters:
  • conn_5tuple - 5-tuple returned from getaddrinfo
  • on_connect - callback called on successful connect to the server
  • on_connect_failure - callback called on failure when connecting
Overrides: NonBlockingTransport.connect
(inherited documentation)

_connect_to_proxy(self)

source code 

_on_connect(self)

source code 
Preceed invoking of on_connect callback. TCP connection is already estabilished by this time
Overrides: NonBlockingTransport._on_connect

tls_init(self, on_succ, on_fail)

source code 
Estabilishes TLS/SSL using this TCP connection by plugging a NonBlockingTLS module

pollin(self)

source code 
Called by idlequeu when receive on plugged socket is possible
Overrides: idlequeue.IdleObject.pollin

pollout(self)

source code 
Called by idlequeu when send to plugged socket is possible
Overrides: idlequeue.IdleObject.pollout

pollend(self)

source code 
Called by idlequeue on TCP connection errors
Overrides: idlequeue.IdleObject.pollend

disconnect(self, do_callback=True)

source code 
Overrides: NonBlockingTransport.disconnect

read_timeout(self)

source code 
Called when there's no response from server in defined timeout
Overrides: idlequeue.IdleObject.read_timeout
(inherited documentation)

set_timeout(self, timeout)

source code 
Overrides: NonBlockingTransport.set_timeout

remove_timeout(self)

source code 
Overrides: NonBlockingTransport.remove_timeout

send(self, raw_data, now=False)

source code 
Append raw_data to the queue of messages to be send. If supplied data is unicode string, encode it to utf-8.
Overrides: NonBlockingTransport.send

encode_stanza(self, stanza)

source code 
Encode str or unicode to utf-8

_plug_idle(self, writable, readable)

source code 

Plug file descriptor of socket to Idlequeue

Plugged socket will be watched for "send possible" or/and "recv possible" events. pollin() callback is invoked on "recv possible", pollout() on "send_possible".

Plugged socket will always be watched for "error" event - in that case, pollend() is called.

_do_send(self)

source code 
Called when send() to connected socket is possible. First message from sendqueue will be sent

_do_receive(self)

source code 
Reads all pending incoming data. Will call owner's disconnected() method if appropriate

_on_receive(self, data)

source code 
Preceeds on_receive callback. It peels off and checks HTTP headers in HTTP classes, in here it just calls the callback

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/nbxmpp.transports_nb.NonBlockingTransport-class.html000066400000000000000000001364231343257752000324440ustar00rootroot00000000000000 nbxmpp.transports_nb.NonBlockingTransport
Package nbxmpp :: Module transports_nb :: Class NonBlockingTransport
[hide private]
[frames] | no frames]

Class NonBlockingTransport

source code


Abstract class representing a transport

Subclasses CAN have different constructor signature but connect method SHOULD be the same.

Instance Methods [hide private]
 
__init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs)
Each trasport class can have different constructor but it has to have at least all the arguments of NonBlockingTransport constructor
source code
 
plugin(self, owner) source code
 
plugout(self) source code
 
connect(self, conn_5tuple, on_connect, on_connect_failure)
Creates and connects transport to server and port defined in conn_5tuple which should be item from list returned from getaddrinfo
source code
 
set_state(self, newstate) source code
 
get_state(self) source code
 
_on_connect(self)
Preceeds call of on_connect callback
source code
 
_on_connect_failure(self, err_message)
Preceeds call of on_connect_failure callback
source code
 
send(self, raw_data, now=False) source code
 
disconnect(self, do_callback=True) source code
 
onreceive(self, recv_handler)
Set the on_receive callback.
source code
 
_tcp_connecting_started(self) source code
 
read_timeout(self)
Called when there's no response from server in defined timeout
source code
 
read_timeout2(self)
called when there's no response from server in defined timeout
source code
 
renew_send_timeout(self) source code
 
renew_send_timeout2(self) source code
 
set_timeout(self, timeout) source code
 
set_timeout2(self, timeout2) source code
 
get_fd(self) source code
 
remove_timeout(self) source code
 
set_send_timeout(self, timeout, on_timeout) source code
 
set_send_timeout2(self, timeout2, on_timeout2) source code
 
start_disconnect(self) source code

Inherited from plugin.PlugIn: PlugIn, PlugOut

Class Methods [hide private]

Inherited from plugin.PlugIn: get_instance

Method Details [hide private]

__init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs)
(Constructor)

source code 
Each trasport class can have different constructor but it has to have at least all the arguments of NonBlockingTransport constructor
Parameters:
  • raise_event - callback for monitoring of sent and received data
  • on_disconnect - callback called on disconnection during runtime
  • idlequeue - processing idlequeue
  • estabilish_tls - boolean whether to estabilish TLS connection after TCP connection is done
  • certs - tuple of (cacerts, mycerts) see constructor of tls_nb.NonBlockingTLS for more details
Overrides: plugin.PlugIn.__init__

plugin(self, owner)

source code 

plugout(self)

source code 

connect(self, conn_5tuple, on_connect, on_connect_failure)

source code 
Creates and connects transport to server and port defined in conn_5tuple which should be item from list returned from getaddrinfo
Parameters:
  • conn_5tuple - 5-tuple returned from getaddrinfo
  • on_connect - callback called on successful connect to the server
  • on_connect_failure - callback called on failure when connecting

set_state(self, newstate)

source code 

get_state(self)

source code 

_on_connect(self)

source code 
Preceeds call of on_connect callback

_on_connect_failure(self, err_message)

source code 
Preceeds call of on_connect_failure callback

send(self, raw_data, now=False)

source code 

disconnect(self, do_callback=True)

source code 

onreceive(self, recv_handler)

source code 

Set the on_receive callback.

onreceive(None) sets callback to Dispatcher.ProcessNonBlocking which is the default one that will decide what to do with received stanza based on its tag name and namespace.

Do not confuse it with on_receive() method, which is the callback itself.

_tcp_connecting_started(self)

source code 

read_timeout(self)

source code 
Called when there's no response from server in defined timeout

read_timeout2(self)

source code 
called when there's no response from server in defined timeout

renew_send_timeout(self)

source code 

renew_send_timeout2(self)

source code 

set_timeout(self, timeout)

source code 

set_timeout2(self, timeout2)

source code 

get_fd(self)

source code 

remove_timeout(self)

source code 

set_send_timeout(self, timeout, on_timeout)

source code 

set_send_timeout2(self, timeout2, on_timeout2)

source code 

start_disconnect(self)

source code 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/redirect.html000066400000000000000000000101221343257752000226050ustar00rootroot00000000000000Epydoc Redirect Page

Epydoc Auto-redirect page

When javascript is enabled, this page will redirect URLs of the form redirect.html#dotted.name to the documentation for the object with the given fully-qualified dotted name.

 

python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-everything.html000066400000000000000000001411561343257752000237670ustar00rootroot00000000000000 Everything

Everything


All Classes

nbxmpp.auth_nb.NonBlockingBind
nbxmpp.auth_nb.NonBlockingNonSASL
nbxmpp.auth_nb.SASL
nbxmpp.bosh.AckChecker
nbxmpp.bosh.KeyStack
nbxmpp.bosh.NonBlockingBOSH
nbxmpp.client_nb.NonBlockingClient
nbxmpp.dispatcher_nb.BOSHDispatcher
nbxmpp.dispatcher_nb.Dispatcher
nbxmpp.dispatcher_nb.XMPPDispatcher
nbxmpp.idlequeue.GlibIdleQueue
nbxmpp.idlequeue.IdleCommand
nbxmpp.idlequeue.IdleObject
nbxmpp.idlequeue.IdleQueue
nbxmpp.idlequeue.SelectIdleQueue
nbxmpp.plugin.PlugIn
nbxmpp.protocol.Acks
nbxmpp.protocol.BOSHBody
nbxmpp.protocol.BadFormat
nbxmpp.protocol.BadNamespacePrefix
nbxmpp.protocol.Conflict
nbxmpp.protocol.ConnectionTimeout
nbxmpp.protocol.DataField
nbxmpp.protocol.DataForm
nbxmpp.protocol.Error
nbxmpp.protocol.ErrorNode
nbxmpp.protocol.Hashes
nbxmpp.protocol.HostGone
nbxmpp.protocol.HostUnknown
nbxmpp.protocol.ImproperAddressing
nbxmpp.protocol.InternalServerError
nbxmpp.protocol.InvalidFrom
nbxmpp.protocol.InvalidID
nbxmpp.protocol.InvalidNamespace
nbxmpp.protocol.InvalidXML
nbxmpp.protocol.Iq
nbxmpp.protocol.JID
nbxmpp.protocol.Message
nbxmpp.protocol.NodeProcessed
nbxmpp.protocol.NotAuthorized
nbxmpp.protocol.PolicyViolation
nbxmpp.protocol.Presence
nbxmpp.protocol.Protocol
nbxmpp.protocol.RemoteConnectionFailed
nbxmpp.protocol.ResourceConstraint
nbxmpp.protocol.RestrictedXML
nbxmpp.protocol.SeeOtherHost
nbxmpp.protocol.StreamError
nbxmpp.protocol.SystemShutdown
nbxmpp.protocol.UndefinedCondition
nbxmpp.protocol.UnsupportedEncoding
nbxmpp.protocol.UnsupportedStanzaType
nbxmpp.protocol.UnsupportedVersion
nbxmpp.protocol.XMLNotWellFormed
nbxmpp.proxy_connectors.HTTPCONNECTConnector
nbxmpp.proxy_connectors.ProxyConnector
nbxmpp.proxy_connectors.SOCKS5Connector
nbxmpp.roster_nb.NonBlockingRoster
nbxmpp.simplexml.NT
nbxmpp.simplexml.Node
nbxmpp.simplexml.NodeBuilder
nbxmpp.simplexml.T
nbxmpp.smacks.Smacks
nbxmpp.stringprepare.EmptyMappingTable
nbxmpp.stringprepare.ILookupTable
nbxmpp.stringprepare.IMappingTable
nbxmpp.stringprepare.LookupTable
nbxmpp.stringprepare.LookupTableFromFunction
nbxmpp.stringprepare.MappingTableFromFunction
nbxmpp.stringprepare.NamePrep
nbxmpp.stringprepare.Profile
nbxmpp.tls_nb.NonBlockingTLS
nbxmpp.tls_nb.PyOpenSSLWrapper
nbxmpp.tls_nb.SSLWrapper
nbxmpp.tls_nb.SSLWrapper.Error
nbxmpp.tls_nb.StdlibSSLWrapper
nbxmpp.transports_nb.NonBlockingHTTP
nbxmpp.transports_nb.NonBlockingHTTPBOSH
nbxmpp.transports_nb.NonBlockingTCP
nbxmpp.transports_nb.NonBlockingTransport

All Functions

nbxmpp.auth_nb.C
nbxmpp.auth_nb.H
nbxmpp.auth_nb.HH
nbxmpp.auth_nb.challenge_splitter
nbxmpp.auth_nb.scram_parse
nbxmpp.bosh.get_rand_number
nbxmpp.c14n.c14n
nbxmpp.c14n.normalise_attr
nbxmpp.c14n.normalise_text
nbxmpp.features_nb.changePasswordTo
nbxmpp.features_nb.delPrivacyList
nbxmpp.features_nb.getActiveAndDefaultPrivacyLists
nbxmpp.features_nb.getPrivacyList
nbxmpp.features_nb.getPrivacyLists
nbxmpp.features_nb.getRegInfo
nbxmpp.features_nb.register
nbxmpp.features_nb.setActivePrivacyList
nbxmpp.features_nb.setDefaultPrivacyList
nbxmpp.features_nb.setPrivacyList
nbxmpp.features_nb.unregister
nbxmpp.idlequeue.get_idlequeue
nbxmpp.protocol.ascii_upper
nbxmpp.protocol.isErrorNode
nbxmpp.protocol.isResultNode
nbxmpp.simplexml.BadXML2Node
nbxmpp.simplexml.XML2Node
nbxmpp.simplexml.XMLescape
nbxmpp.simplexml.ustr
nbxmpp.tls_nb.gattr
nbxmpp.transports_nb.get_proxy_data_from_dict
nbxmpp.transports_nb.urisplit

All Variables

nbxmpp.__package__
nbxmpp.auth_nb.GSS_STATE_STEP
nbxmpp.auth_nb.GSS_STATE_WRAP
nbxmpp.auth_nb.SASL_FAILURE
nbxmpp.auth_nb.SASL_FAILURE_IN_PROGRESS
nbxmpp.auth_nb.SASL_IN_PROCESS
nbxmpp.auth_nb.SASL_SUCCESS
nbxmpp.auth_nb.SASL_UNSUPPORTED
nbxmpp.auth_nb.__package__
nbxmpp.auth_nb.have_kerberos
nbxmpp.auth_nb.kerberos
nbxmpp.auth_nb.log
nbxmpp.bosh.FAKE_DESCRIPTOR
nbxmpp.bosh.KEY_COUNT
nbxmpp.bosh.__package__
nbxmpp.bosh.bosh_errors
nbxmpp.bosh.log
nbxmpp.c14n.__package__
nbxmpp.client_nb.__package__
nbxmpp.client_nb.log
nbxmpp.dispatcher_nb.DEFAULT_TIMEOUT_SECONDS
nbxmpp.dispatcher_nb.XML_DECLARATION
nbxmpp.dispatcher_nb.__package__
nbxmpp.dispatcher_nb.log
nbxmpp.dispatcher_nb.outgoingID
nbxmpp.features_nb.PL_ACT_ALLOW
nbxmpp.features_nb.PL_ACT_DENY
nbxmpp.features_nb.PL_TYPE_GROUP
nbxmpp.features_nb.PL_TYPE_JID
nbxmpp.features_nb.PL_TYPE_SUBC
nbxmpp.features_nb.PRIVACY_LISTS_ACTIVE_DEFAULT
nbxmpp.features_nb.PRIVACY_LISTS_RECEIVED
nbxmpp.features_nb.PRIVACY_LIST_RECEIVED
nbxmpp.features_nb.REGISTER_DATA_RECEIVED
nbxmpp.features_nb.__package__
nbxmpp.idlequeue.FLAG_CLOSE
nbxmpp.idlequeue.FLAG_READ
nbxmpp.idlequeue.FLAG_READ_WRITE
nbxmpp.idlequeue.FLAG_WRITE
nbxmpp.idlequeue.HAVE_GOBJECT
nbxmpp.idlequeue.IS_CLOSED
nbxmpp.idlequeue.PENDING_READ
nbxmpp.idlequeue.PENDING_WRITE
nbxmpp.idlequeue.__package__
nbxmpp.idlequeue.log
nbxmpp.plugin.__package__
nbxmpp.plugin.log
nbxmpp.protocol.ERRORS
nbxmpp.protocol.ERR_BAD_REQUEST
nbxmpp.protocol.ERR_CONFLICT
nbxmpp.protocol.ERR_FEATURE_NOT_IMPLEMENTED
nbxmpp.protocol.ERR_FORBIDDEN
nbxmpp.protocol.ERR_GONE
nbxmpp.protocol.ERR_INTERNAL_SERVER_ERROR
nbxmpp.protocol.ERR_ITEM_NOT_FOUND
nbxmpp.protocol.ERR_JID_MALFORMED
nbxmpp.protocol.ERR_NOT_ACCEPTABLE
nbxmpp.protocol.ERR_NOT_ALLOWED
nbxmpp.protocol.ERR_NOT_AUTHORIZED
nbxmpp.protocol.ERR_PAYMENT_REQUIRED
nbxmpp.protocol.ERR_RECIPIENT_UNAVAILABLE
nbxmpp.protocol.ERR_REDIRECT
nbxmpp.protocol.ERR_REGISTRATION_REQUIRED
nbxmpp.protocol.ERR_REMOTE_SERVER_NOT_FOUND
nbxmpp.protocol.ERR_REMOTE_SERVER_TIMEOUT
nbxmpp.protocol.ERR_RESOURCE_CONSTRAINT
nbxmpp.protocol.ERR_SERVICE_UNAVAILABLE
nbxmpp.protocol.ERR_SUBSCRIPTION_REQUIRED
nbxmpp.protocol.ERR_UNDEFINED_CONDITION
nbxmpp.protocol.ERR_UNEXPECTED_REQUEST
nbxmpp.protocol.NS_ACTIVITY
nbxmpp.protocol.NS_ADDRESS
nbxmpp.protocol.NS_AGENTS
nbxmpp.protocol.NS_AMP
nbxmpp.protocol.NS_AMP_ERRORS
nbxmpp.protocol.NS_ARCHIVE
nbxmpp.protocol.NS_ARCHIVE_AUTO
nbxmpp.protocol.NS_ARCHIVE_MANAGE
nbxmpp.protocol.NS_ARCHIVE_MANUAL
nbxmpp.protocol.NS_ARCHIVE_PREF
nbxmpp.protocol.NS_ATOM
nbxmpp.protocol.NS_ATTENTION
nbxmpp.protocol.NS_AUTH
nbxmpp.protocol.NS_AVATAR
nbxmpp.protocol.NS_BIND
nbxmpp.protocol.NS_BLOCKING
nbxmpp.protocol.NS_BOB
nbxmpp.protocol.NS_BOOKMARKS
nbxmpp.protocol.NS_BROWSE
nbxmpp.protocol.NS_BROWSING
nbxmpp.protocol.NS_BYTESTREAM
nbxmpp.protocol.NS_CAPS
nbxmpp.protocol.NS_CAPTCHA
nbxmpp.protocol.NS_CARBONS
nbxmpp.protocol.NS_CHATSTATES
nbxmpp.protocol.NS_CHATTING
nbxmpp.protocol.NS_CLIENT
nbxmpp.protocol.NS_COMMANDS
nbxmpp.protocol.NS_COMPONENT_1
nbxmpp.protocol.NS_COMPONENT_ACCEPT
nbxmpp.protocol.NS_COMPRESS
nbxmpp.protocol.NS_CONDITIONS
nbxmpp.protocol.NS_CONFERENCE
nbxmpp.protocol.NS_CORRECT
nbxmpp.protocol.NS_DATA
nbxmpp.protocol.NS_DATA_LAYOUT
nbxmpp.protocol.NS_DATA_MEDIA
nbxmpp.protocol.NS_DATA_VALIDATE
nbxmpp.protocol.NS_DELAY
nbxmpp.protocol.NS_DELAY2
nbxmpp.protocol.NS_DIALBACK
nbxmpp.protocol.NS_DISCO
nbxmpp.protocol.NS_DISCO_INFO
nbxmpp.protocol.NS_DISCO_ITEMS
nbxmpp.protocol.NS_ENCRYPTED
nbxmpp.protocol.NS_ESESSION
nbxmpp.protocol.NS_ESESSION_INIT
nbxmpp.protocol.NS_EVENT
nbxmpp.protocol.NS_FEATURE
nbxmpp.protocol.NS_FILE
nbxmpp.protocol.NS_FORWARD
nbxmpp.protocol.NS_GAMING
nbxmpp.protocol.NS_GATEWAY
nbxmpp.protocol.NS_GEOLOC
nbxmpp.protocol.NS_GMAILNOTIFY
nbxmpp.protocol.NS_GROUPCHAT
nbxmpp.protocol.NS_GTALKSETTING
nbxmpp.protocol.NS_HASHES
nbxmpp.protocol.NS_HASHES_MD5
nbxmpp.protocol.NS_HASHES_SHA1
nbxmpp.protocol.NS_HASHES_SHA256
nbxmpp.protocol.NS_HASHES_SHA512
nbxmpp.protocol.NS_HTTP_AUTH
nbxmpp.protocol.NS_HTTP_BIND
nbxmpp.protocol.NS_IBB
nbxmpp.protocol.NS_INVISIBLE
nbxmpp.protocol.NS_IQ
nbxmpp.protocol.NS_JINGLE
nbxmpp.protocol.NS_JINGLE_BYTESTREAM
nbxmpp.protocol.NS_JINGLE_ERRORS
nbxmpp.protocol.NS_JINGLE_FILE_TRANSFER
nbxmpp.protocol.NS_JINGLE_IBB
nbxmpp.protocol.NS_JINGLE_ICE_UDP
nbxmpp.protocol.NS_JINGLE_RAW_UDP
nbxmpp.protocol.NS_JINGLE_RTP
nbxmpp.protocol.NS_JINGLE_RTP_AUDIO
nbxmpp.protocol.NS_JINGLE_RTP_VIDEO
nbxmpp.protocol.NS_JINGLE_XTLS
nbxmpp.protocol.NS_LAST
nbxmpp.protocol.NS_LOCATION
nbxmpp.protocol.NS_MAM
nbxmpp.protocol.NS_MESSAGE
nbxmpp.protocol.NS_MOOD
nbxmpp.protocol.NS_MUC
nbxmpp.protocol.NS_MUC_ADMIN
nbxmpp.protocol.NS_MUC_CONFIG
nbxmpp.protocol.NS_MUC_OWNER
nbxmpp.protocol.NS_MUC_UNIQUE
nbxmpp.protocol.NS_MUC_USER
nbxmpp.protocol.NS_NICK
nbxmpp.protocol.NS_OFFLINE
nbxmpp.protocol.NS_PHYSLOC
nbxmpp.protocol.NS_PING
nbxmpp.protocol.NS_PRESENCE
nbxmpp.protocol.NS_PRIVACY
nbxmpp.protocol.NS_PRIVATE
nbxmpp.protocol.NS_PROFILE
nbxmpp.protocol.NS_PUBKEY_ATTEST
nbxmpp.protocol.NS_PUBKEY_PUBKEY
nbxmpp.protocol.NS_PUBKEY_REVOKE
nbxmpp.protocol.NS_PUBSUB
nbxmpp.protocol.NS_PUBSUB_EVENT
nbxmpp.protocol.NS_PUBSUB_OWNER
nbxmpp.protocol.NS_PUBSUB_PUBLISH_OPTIONS
nbxmpp.protocol.NS_RECEIPTS
nbxmpp.protocol.NS_REGISTER
nbxmpp.protocol.NS_ROSTER
nbxmpp.protocol.NS_ROSTERNOTES
nbxmpp.protocol.NS_ROSTERX
nbxmpp.protocol.NS_ROSTER_VER
nbxmpp.protocol.NS_RPC
nbxmpp.protocol.NS_RSM
nbxmpp.protocol.NS_SASL
nbxmpp.protocol.NS_SEARCH
nbxmpp.protocol.NS_SECLABEL
nbxmpp.protocol.NS_SECLABEL_CATALOG
nbxmpp.protocol.NS_SERVER
nbxmpp.protocol.NS_SESSION
nbxmpp.protocol.NS_SI
nbxmpp.protocol.NS_SIGNED
nbxmpp.protocol.NS_SI_PUB
nbxmpp.protocol.NS_SSN
nbxmpp.protocol.NS_STANZAS
nbxmpp.protocol.NS_STANZA_CRYPTO
nbxmpp.protocol.NS_STREAM
nbxmpp.protocol.NS_STREAMS
nbxmpp.protocol.NS_STREAM_MGMT
nbxmpp.protocol.NS_TIME
nbxmpp.protocol.NS_TIME_REVISED
nbxmpp.protocol.NS_TLS
nbxmpp.protocol.NS_TUNE
nbxmpp.protocol.NS_VACATION
nbxmpp.protocol.NS_VCARD
nbxmpp.protocol.NS_VCARD_UPDATE
nbxmpp.protocol.NS_VERSION
nbxmpp.protocol.NS_VIEWING
nbxmpp.protocol.NS_WAITINGLIST
nbxmpp.protocol.NS_XHTML
nbxmpp.protocol.NS_XHTML_IM
nbxmpp.protocol.NS_XMPP_STREAMS
nbxmpp.protocol.NS_X_OOB
nbxmpp.protocol.SASL_ABORTED
nbxmpp.protocol.SASL_INCORRECT_ENCODING
nbxmpp.protocol.SASL_INVALID_AUTHZID
nbxmpp.protocol.SASL_INVALID_MECHANISM
nbxmpp.protocol.SASL_MECHANISM_TOO_WEAK
nbxmpp.protocol.SASL_NOT_AUTHORIZED
nbxmpp.protocol.SASL_TEMPORARY_AUTH_FAILURE
nbxmpp.protocol.STREAM_BAD_FORMAT
nbxmpp.protocol.STREAM_BAD_NAMESPACE_PREFIX
nbxmpp.protocol.STREAM_CONFLICT
nbxmpp.protocol.STREAM_CONNECTION_TIMEOUT
nbxmpp.protocol.STREAM_HOST_GONE
nbxmpp.protocol.STREAM_HOST_UNKNOWN
nbxmpp.protocol.STREAM_IMPROPER_ADDRESSING
nbxmpp.protocol.STREAM_INTERNAL_SERVER_ERROR
nbxmpp.protocol.STREAM_INVALID_FROM
nbxmpp.protocol.STREAM_INVALID_ID
nbxmpp.protocol.STREAM_INVALID_NAMESPACE
nbxmpp.protocol.STREAM_INVALID_XML
nbxmpp.protocol.STREAM_NOT_AUTHORIZED
nbxmpp.protocol.STREAM_POLICY_VIOLATION
nbxmpp.protocol.STREAM_REMOTE_CONNECTION_FAILED
nbxmpp.protocol.STREAM_RESOURCE_CONSTRAINT
nbxmpp.protocol.STREAM_RESTRICTED_XML
nbxmpp.protocol.STREAM_SEE_OTHER_HOST
nbxmpp.protocol.STREAM_SYSTEM_SHUTDOWN
nbxmpp.protocol.STREAM_UNDEFINED_CONDITION
nbxmpp.protocol.STREAM_UNSUPPORTED_ENCODING
nbxmpp.protocol.STREAM_UNSUPPORTED_STANZA_TYPE
nbxmpp.protocol.STREAM_UNSUPPORTED_VERSION
nbxmpp.protocol.STREAM_XML_NOT_WELL_FORMED
nbxmpp.protocol.__package__
nbxmpp.protocol.stream_exceptions
nbxmpp.proxy_connectors.__package__
nbxmpp.proxy_connectors.log
nbxmpp.roster_nb.__package__
nbxmpp.roster_nb.log
nbxmpp.simplexml.ENCODING
nbxmpp.simplexml.__package__
nbxmpp.simplexml.log
nbxmpp.smacks.__package__
nbxmpp.smacks.log
nbxmpp.stringprepare.B_1
nbxmpp.stringprepare.B_2
nbxmpp.stringprepare.C_11
nbxmpp.stringprepare.C_12
nbxmpp.stringprepare.C_21
nbxmpp.stringprepare.C_22
nbxmpp.stringprepare.C_3
nbxmpp.stringprepare.C_4
nbxmpp.stringprepare.C_5
nbxmpp.stringprepare.C_6
nbxmpp.stringprepare.C_7
nbxmpp.stringprepare.C_8
nbxmpp.stringprepare.C_9
nbxmpp.stringprepare.__package__
nbxmpp.stringprepare.nameprep
nbxmpp.stringprepare.nodeprep
nbxmpp.stringprepare.resourceprep
nbxmpp.tls_nb.PYOPENSSL
nbxmpp.tls_nb.PYSTDLIB
nbxmpp.tls_nb.USE_PYOPENSSL
nbxmpp.tls_nb.__package__
nbxmpp.tls_nb.log
nbxmpp.transports_nb.CONNECTED
nbxmpp.transports_nb.CONNECTING
nbxmpp.transports_nb.CONNECT_TIMEOUT_SECONDS
nbxmpp.transports_nb.DATA_ERROR
nbxmpp.transports_nb.DATA_RECEIVED
nbxmpp.transports_nb.DATA_SENT
nbxmpp.transports_nb.DISCONNECTED
nbxmpp.transports_nb.DISCONNECTING
nbxmpp.transports_nb.DISCONNECT_TIMEOUT_SECONDS
nbxmpp.transports_nb.PROXY_CONNECTING
nbxmpp.transports_nb.RECV_BUFSIZE
nbxmpp.transports_nb.STATES
nbxmpp.transports_nb.__package__
nbxmpp.transports_nb.log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp-module.html000066400000000000000000000021011343257752000243540ustar00rootroot00000000000000 nbxmpp

Module nbxmpp


Variables

__package__

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.auth_nb-module.html000066400000000000000000000056041343257752000260060ustar00rootroot00000000000000 auth_nb

Module auth_nb


Classes

NonBlockingBind
NonBlockingNonSASL
SASL

Functions

C
H
HH
challenge_splitter
scram_parse

Variables

GSS_STATE_STEP
GSS_STATE_WRAP
SASL_FAILURE
SASL_FAILURE_IN_PROGRESS
SASL_IN_PROCESS
SASL_SUCCESS
SASL_UNSUPPORTED
__package__
have_kerberos
kerberos
log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.bosh-module.html000066400000000000000000000035731343257752000253240ustar00rootroot00000000000000 bosh

Module bosh


Classes

AckChecker
KeyStack
NonBlockingBOSH

Functions

get_rand_number

Variables

FAKE_DESCRIPTOR
KEY_COUNT
__package__
bosh_errors
log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.c14n-module.html000066400000000000000000000026011343257752000251250ustar00rootroot00000000000000 c14n

Module c14n


Functions

c14n
normalise_attr
normalise_text

Variables

__package__

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.client_nb-module.html000066400000000000000000000024651343257752000263250ustar00rootroot00000000000000 client_nb

Module client_nb


Classes

NonBlockingClient

Variables

__package__
log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.dispatcher_nb-module.html000066400000000000000000000035601343257752000271720ustar00rootroot00000000000000 dispatcher_nb

Module dispatcher_nb


Classes

BOSHDispatcher
Dispatcher
XMPPDispatcher

Variables

DEFAULT_TIMEOUT_SECONDS
XML_DECLARATION
__package__
log
outgoingID

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.features_nb-module.html000066400000000000000000000072021343257752000266570ustar00rootroot00000000000000 features_nb

Module features_nb


Functions

changePasswordTo
delPrivacyList
getActiveAndDefaultPrivacyLists
getPrivacyList
getPrivacyLists
getRegInfo
register
setActivePrivacyList
setDefaultPrivacyList
setPrivacyList
unregister

Variables

PL_ACT_ALLOW
PL_ACT_DENY
PL_TYPE_GROUP
PL_TYPE_JID
PL_TYPE_SUBC
PRIVACY_LISTS_ACTIVE_DEFAULT
PRIVACY_LISTS_RECEIVED
PRIVACY_LIST_RECEIVED
REGISTER_DATA_RECEIVED
__package__

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.idlequeue-module.html000066400000000000000000000051651343257752000263520ustar00rootroot00000000000000 idlequeue

Module idlequeue


Classes

GlibIdleQueue
IdleCommand
IdleObject
IdleQueue
SelectIdleQueue

Functions

get_idlequeue

Variables

FLAG_CLOSE
FLAG_READ
FLAG_READ_WRITE
FLAG_WRITE
HAVE_GOBJECT
IS_CLOSED
PENDING_READ
PENDING_WRITE
__package__
log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.plugin-module.html000066400000000000000000000024201343257752000256550ustar00rootroot00000000000000 plugin

Module plugin


Classes

PlugIn

Variables

__package__
log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.protocol-module.html000066400000000000000000000631771343257752000262400ustar00rootroot00000000000000 protocol

Module protocol


Classes

Acks
BOSHBody
BadFormat
BadNamespacePrefix
Conflict
ConnectionTimeout
DataField
DataForm
Error
ErrorNode
Hashes
HostGone
HostUnknown
ImproperAddressing
InternalServerError
InvalidFrom
InvalidID
InvalidNamespace
InvalidXML
Iq
JID
Message
NodeProcessed
NotAuthorized
PolicyViolation
Presence
Protocol
RemoteConnectionFailed
ResourceConstraint
RestrictedXML
SeeOtherHost
StreamError
SystemShutdown
UndefinedCondition
UnsupportedEncoding
UnsupportedStanzaType
UnsupportedVersion
XMLNotWellFormed

Functions

ascii_upper
isErrorNode
isResultNode

Variables

ERRORS
ERR_BAD_REQUEST
ERR_CONFLICT
ERR_FEATURE_NOT_IMPLEMENTED
ERR_FORBIDDEN
ERR_GONE
ERR_INTERNAL_SERVER_ERROR
ERR_ITEM_NOT_FOUND
ERR_JID_MALFORMED
ERR_NOT_ACCEPTABLE
ERR_NOT_ALLOWED
ERR_NOT_AUTHORIZED
ERR_PAYMENT_REQUIRED
ERR_RECIPIENT_UNAVAILABLE
ERR_REDIRECT
ERR_REGISTRATION_REQUIRED
ERR_REMOTE_SERVER_NOT_FOUND
ERR_REMOTE_SERVER_TIMEOUT
ERR_RESOURCE_CONSTRAINT
ERR_SERVICE_UNAVAILABLE
ERR_SUBSCRIPTION_REQUIRED
ERR_UNDEFINED_CONDITION
ERR_UNEXPECTED_REQUEST
NS_ACTIVITY
NS_ADDRESS
NS_AGENTS
NS_AMP
NS_AMP_ERRORS
NS_ARCHIVE
NS_ARCHIVE_AUTO
NS_ARCHIVE_MANAGE
NS_ARCHIVE_MANUAL
NS_ARCHIVE_PREF
NS_ATOM
NS_ATTENTION
NS_AUTH
NS_AVATAR
NS_BIND
NS_BLOCKING
NS_BOB
NS_BOOKMARKS
NS_BROWSE
NS_BROWSING
NS_BYTESTREAM
NS_CAPS
NS_CAPTCHA
NS_CARBONS
NS_CHATSTATES
NS_CHATTING
NS_CLIENT
NS_COMMANDS
NS_COMPONENT_1
NS_COMPONENT_ACCEPT
NS_COMPRESS
NS_CONDITIONS
NS_CONFERENCE
NS_CORRECT
NS_DATA
NS_DATA_LAYOUT
NS_DATA_MEDIA
NS_DATA_VALIDATE
NS_DELAY
NS_DELAY2
NS_DIALBACK
NS_DISCO
NS_DISCO_INFO
NS_DISCO_ITEMS
NS_ENCRYPTED
NS_ESESSION
NS_ESESSION_INIT
NS_EVENT
NS_FEATURE
NS_FILE
NS_FORWARD
NS_GAMING
NS_GATEWAY
NS_GEOLOC
NS_GMAILNOTIFY
NS_GROUPCHAT
NS_GTALKSETTING
NS_HASHES
NS_HASHES_MD5
NS_HASHES_SHA1
NS_HASHES_SHA256
NS_HASHES_SHA512
NS_HTTP_AUTH
NS_HTTP_BIND
NS_IBB
NS_INVISIBLE
NS_IQ
NS_JINGLE
NS_JINGLE_BYTESTREAM
NS_JINGLE_ERRORS
NS_JINGLE_FILE_TRANSFER
NS_JINGLE_IBB
NS_JINGLE_ICE_UDP
NS_JINGLE_RAW_UDP
NS_JINGLE_RTP
NS_JINGLE_RTP_AUDIO
NS_JINGLE_RTP_VIDEO
NS_JINGLE_XTLS
NS_LAST
NS_LOCATION
NS_MAM
NS_MESSAGE
NS_MOOD
NS_MUC
NS_MUC_ADMIN
NS_MUC_CONFIG
NS_MUC_OWNER
NS_MUC_UNIQUE
NS_MUC_USER
NS_NICK
NS_OFFLINE
NS_PHYSLOC
NS_PING
NS_PRESENCE
NS_PRIVACY
NS_PRIVATE
NS_PROFILE
NS_PUBKEY_ATTEST
NS_PUBKEY_PUBKEY
NS_PUBKEY_REVOKE
NS_PUBSUB
NS_PUBSUB_EVENT
NS_PUBSUB_OWNER
NS_PUBSUB_PUBLISH_OPTIONS
NS_RECEIPTS
NS_REGISTER
NS_ROSTER
NS_ROSTERNOTES
NS_ROSTERX
NS_ROSTER_VER
NS_RPC
NS_RSM
NS_SASL
NS_SEARCH
NS_SECLABEL
NS_SECLABEL_CATALOG
NS_SERVER
NS_SESSION
NS_SI
NS_SIGNED
NS_SI_PUB
NS_SSN
NS_STANZAS
NS_STANZA_CRYPTO
NS_STREAM
NS_STREAMS
NS_STREAM_MGMT
NS_TIME
NS_TIME_REVISED
NS_TLS
NS_TUNE
NS_VACATION
NS_VCARD
NS_VCARD_UPDATE
NS_VERSION
NS_VIEWING
NS_WAITINGLIST
NS_XHTML
NS_XHTML_IM
NS_XMPP_STREAMS
NS_X_OOB
SASL_ABORTED
SASL_INCORRECT_ENCODING
SASL_INVALID_AUTHZID
SASL_INVALID_MECHANISM
SASL_MECHANISM_TOO_WEAK
SASL_NOT_AUTHORIZED
SASL_TEMPORARY_AUTH_FAILURE
STREAM_BAD_FORMAT
STREAM_BAD_NAMESPACE_PREFIX
STREAM_CONFLICT
STREAM_CONNECTION_TIMEOUT
STREAM_HOST_GONE
STREAM_HOST_UNKNOWN
STREAM_IMPROPER_ADDRESSING
STREAM_INTERNAL_SERVER_ERROR
STREAM_INVALID_FROM
STREAM_INVALID_ID
STREAM_INVALID_NAMESPACE
STREAM_INVALID_XML
STREAM_NOT_AUTHORIZED
STREAM_POLICY_VIOLATION
STREAM_REMOTE_CONNECTION_FAILED
STREAM_RESOURCE_CONSTRAINT
STREAM_RESTRICTED_XML
STREAM_SEE_OTHER_HOST
STREAM_SYSTEM_SHUTDOWN
STREAM_UNDEFINED_CONDITION
STREAM_UNSUPPORTED_ENCODING
STREAM_UNSUPPORTED_STANZA_TYPE
STREAM_UNSUPPORTED_VERSION
STREAM_XML_NOT_WELL_FORMED
__package__
stream_exceptions

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.proxy_connectors-module.html000066400000000000000000000031021343257752000277730ustar00rootroot00000000000000 proxy_connectors

Module proxy_connectors


Classes

HTTPCONNECTConnector
ProxyConnector
SOCKS5Connector

Variables

__package__
log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.roster_nb-module.html000066400000000000000000000024651343257752000263650ustar00rootroot00000000000000 roster_nb

Module roster_nb


Classes

NonBlockingRoster

Variables

__package__
log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.simplexml-module.html000066400000000000000000000040351343257752000263750ustar00rootroot00000000000000 simplexml

Module simplexml


Classes

NT
Node
NodeBuilder
T

Functions

BadXML2Node
XML2Node
XMLescape
ustr

Variables

ENCODING
__package__
log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.smacks-module.html000066400000000000000000000024201343257752000256400ustar00rootroot00000000000000 smacks

Module smacks


Classes

Smacks

Variables

__package__
log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.stringprepare-module.html000066400000000000000000000066601343257752000272560ustar00rootroot00000000000000 stringprepare

Module stringprepare


Classes

EmptyMappingTable
ILookupTable
IMappingTable
LookupTable
LookupTableFromFunction
MappingTableFromFunction
NamePrep
Profile

Variables

B_1
B_2
C_11
C_12
C_21
C_22
C_3
C_4
C_5
C_6
C_7
C_8
C_9
__package__
nameprep
nodeprep
resourceprep

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.tls_nb-module.html000066400000000000000000000037541343257752000256530ustar00rootroot00000000000000 tls_nb

Module tls_nb


Classes

NonBlockingTLS
PyOpenSSLWrapper
SSLWrapper
StdlibSSLWrapper

Functions

gattr

Variables

PYOPENSSL
PYSTDLIB
USE_PYOPENSSL
__package__
log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc-nbxmpp.transports_nb-module.html000066400000000000000000000063161343257752000272650ustar00rootroot00000000000000 transports_nb

Module transports_nb


Classes

NonBlockingHTTP
NonBlockingHTTPBOSH
NonBlockingTCP
NonBlockingTransport

Functions

get_proxy_data_from_dict
urisplit

Variables

CONNECTED
CONNECTING
CONNECT_TIMEOUT_SECONDS
DATA_ERROR
DATA_RECEIVED
DATA_SENT
DISCONNECTED
DISCONNECTING
DISCONNECT_TIMEOUT_SECONDS
PROXY_CONNECTING
RECV_BUFSIZE
STATES
__package__
log

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/toc.html000066400000000000000000000103171343257752000215770ustar00rootroot00000000000000 Table of Contents

Table of Contents


Everything

Modules

nbxmpp
nbxmpp.auth_nb
nbxmpp.bosh
nbxmpp.c14n
nbxmpp.client_nb
nbxmpp.dispatcher_nb
nbxmpp.features_nb
nbxmpp.idlequeue
nbxmpp.plugin
nbxmpp.protocol
nbxmpp.proxy_connectors
nbxmpp.roster_nb
nbxmpp.simplexml
nbxmpp.smacks
nbxmpp.stringprepare
nbxmpp.tls_nb
nbxmpp.transports_nb

[hide private] python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_a.gif000066400000000000000000000206461343257752000270210ustar00rootroot00000000000000GIF89a•猂„„äÂÄlVL4.,Ä‚„tbd´bdLB<Ä¢¤<Œrd¬†|ܲ´ôâäT2,\NL¤BD¼–„”"$„f\,&$,\F<Ô¦””rlìÖÔÄ–Œ<64´Ž|  ,ÄšŒôÆÄ|^Tܺ¼üòô„nlÔªœ”z|Œt^T¤~tTJL¬RTœ24œ‚„|jlTB<$"$L:4¼’„ÌžŒ | tZTD2,|b\$¼žœŒjd4&$dJDD6,¬ŽŒÜªœœzl¤ŠŒäÊÌ<.,̪¬„zt´Š|䲤ôêìdND¤JL´–””*,„jl\JL üÎÌì¾¼üúü¼vt¤‚tTF<|f\D:<œ~| lZ\´jlÌ¢”Œrt¬ŠŒ„j\\JDÔ¢¤”vlìÞÜÌ’”´’„,"ÄžœüÊÌ亼ŒndÔª¬¬^\œ>4Ìžœ„ $4*$D:4œ~t<2,dRT ¼~|¤‚„d"üÒÔÄŠŒ´’”¼šœä¶´Ì¦¤Ä~tìÂÄT64,*,ôÊÌŒ„¬Š|ܶ´ôæä¤FD”&$ÄžŒüöô¬VTœ64Ü®œäÎÌôîì¤NL”.,üþü´nlŒvtÌ–”ä¾¼Ô®¬„ ¤†„lVTLBD¼–Œ\FDÔ¦œ´Ž„t^\TBDÌž” tZ\|bd$D64œztdNLTFD|fd„jd”vt,"$ŒnlL><4*,<24ÿÿþ!ùÁ,•þ; H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¦IˆK¶¬Ù³hÓª]˶­Û·pãÊKWn’¯P”¡Á·¯ß¿€ L¸°áÈ+^̸±cÅeà}š€Æ’Ë˜3kÞ̹³çÏ Cc ºtiÒ¦S«^Í:5 É“›VnM»öjÔ©q³Öm»·ï߯c˶ü»xqÞÆ(ï##Ìeä¡¡ŸÎ:¸ð¥³©kß½} j4zþ=¿Ý½¼kØ×“f7ω)SÌ`ï=3ê!f¦ô!º?PüPÃf¸…1}ºÝ—ß~ý=÷_€²'áÖ¥‡ÔznÀ6ØpDÚw:¼òÊ zG‹(䀘âh#–xbЬØâ‹šW¡…FaØãtDX3Ò —Õ€ã+—¡àŒK¼BIÖ·Ä’M>å”Cv÷#D æo qÙd‰Z#j.1Ž"j¦Sh᜖ ^çštÒx¦vc’)”™ƒÚVd“HjÙ —½‚—K8é&•vú i•“2Yi ô%j\¡†…¨¨­°G‡{@þ9  -¨‘h"Š—f)(¬²ÒZã­ j‰*pè•z(qÃ*úfĉZ ?4 ÷©Â9‹[Š™Ví´Õ^›m®ÉöFª±=Z®iÒ•V(=¾»®Å¢û“ºóFÇZ¯ˆpDòë/Àùnw®½:á[°gí~¶CSd°©yG<ñ£֋0O cìñǃ¼ñMðÐÄÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8ç\3Œü(w-ôÐDmôÑH'­ôÒL7íôÓPG-5(>ûÔ1ÈXg]žÈUÏtµÖ`‡m®Æ]ÛôµØh§]×eÃt¶ÚpÇÛm»ô¶Üx§MwþÝ,Ý÷ßZïÍ·J%ëløáˆ'®øâŒ7Þσß´Ô”Wnùå˜g®ùæÊQyM~.ºÇ‚nR裧>o馓Ôqí­„j¨=Âììé°‚êÔ±ÞºH¯O‡Â©Ð~D KÁqòNìï2ax's{âŽ)g ÐBÞ°4/ª8_œïÐ$ýeà‰',»ŸÑÐÀöÖK‡úâ]¾ÛÈ +#Ÿuâ§z€. ` l–.ƒ‰€2Øi‚æ™!4¡}h‚š!80Ê;ŒPÁç< 5©hTýlC¾ûqä|—Ù·´d«!HG.ºŒ& 4 AþY¸ÌŽ  hÁºÚ Ž@ JÁUf Ã(‹U,ÁfP‹r¸„!ñˆÏ¡”¾´Bû¹°%0´–ø'(JYŠOc”’¦0 P"3w(ÞÂ/6zFB°´‚),µðNÁ”ÇöÄŒËX›ž1#ÒSNžª*GÅiN¹E0à ZL,СВ¨™?É©M(€Wôð"P@ªOKðÂ*½3̤¢”l%/yvëQ‘êT—rEfzèÃefÉ:Á\ÂÐp%\€Gè$j¨y½%ÀaÁ¬ÙˆéºüA5¼šU­l„+?j){˜þ¡C   !˜¨Ágˆœ%6ñ‰—YA,°„-”âô'@ÚÉ%!|éT';UbÌ:AKZÔZ“µ°¥­(ï2˜E#Ø€ZàAòüèef@À âÄ 8' XCD—€‰—Æt¦ºIó2ªÑ¢uœ‘—hV ƒÞ¡¥gÒS›êÔÓå¯5û×VǺ¶uvÕ|_eMÅ$FÖ¶¶Ï¬gíTÝJײƵ$s­«^=3Ì»:$¯{ ìÜàêWL¦U°ˆUM_ »À&v¯‹elB‚7$Ùo ¶#V;¡ÈJö ”ÍÐðôȾ% ï2ËógÅDØÏR$“ þ^EÝ¥XÀBbXfðyÙîa|«eg]K¦o¶¡éÀv`¢La”ºÅŒûà—™ù—^Ä•«;ct {*è¨Ñˆ0C-D”‚[ª&È@BP‚Þ¹ÓeRxÝ­µ6»1¦ ‡ZÃzö¡šK4×7Ãb¦‡? b‰hD$Ús’õ%Ô}ñû×íVéJ¡ôÔÓtS‚v™´#õÈÇ,A8ÂÓ.~a»É\¹”K˜€÷º«hŒf_ᑎxU)þð‰Ÿiô0…äEqŠU¼bO÷0Bžžƒ÷áÛÉÈp‡KCnDM#÷øHÐôg‘!¾£ 6£2<÷KàAn/3û;ybÂïVuÿ[3½N5cŸ{Ð8ÿà×G¸€þ¡„Ë r …‡ðcÙUzñ™‘™‘8ù‘ ’¹aQ(™’*‰’‰ €°’0þ“2iwQ’¦sP6¹“EQs FÀ“Bù ™0 ž0”J¹`àŒ°”RiV Ð  %0•\ i /€]Y–-!—0‚@ •`–ny•@ j0 £ð–x9q ‘@s` y˜± P¡`& ˜Š™šàuPy‹9™Q%™šÉ N@™ž’ ¢9š£éLð™¨Éš°ššà¢Éšš`©9› a ¢I›¸Ù¶)¹Ù› ±›¾œœÂYœÄYœÁyœÈٛʹœ¸ÙœÎ9›Ð¨9Ôé™Öy“þ™Ú©˜ÜÙùà‰—âéœ-À9虞깞—ƒ °ìŸò9Ÿô ÑG0ú¹ŸüÙŸþùŸ : Z z š  Ê  ú ê :¡Z¡:¡±`ŸÑ·ú¡ ¢":¢$Z¢&z¢(š¢*º¢,Ú¢+ - £!*£.:¢4Š¢7Z£:º£<Ú£>:Êê£DZ¤Fz¤ \@ š£)4À oà¡Nz¢Uê¢P*¥XФ\Ú¥^z¢@zŸú¥dZ¦\ RMº¥@oÐ ¿@¥1J¤2ê¦pʦfš§zª£aº¡cº§€¨VŠþ30 Iê¡nðÀ _àTš¨àG`¨p£#àr‰º¨ê¡T€ ¨0b©† ºP©©“Ѝ¦0À 2j©˜Šª• ©’J©nЪ¯z¥‚Ú«€Ú§Bú§¾:¬ £=à LJ«¸@ oð´€ Tê 0Q§´J¢pÖ*£ËÚ¬Ïê¡'@ €± §ƒ ƒ© ­Ôj­¸Ð Íʱê©Ùº­Ñ:­Õê¡1À¬ÎÊ«Äú¯] ¬1¤[°e*£­ ™z”: w@¥¢à¡‹0«B3”*£ ë¡ë¡Û¤) †p¨•±0±Û°±4«®$kþ²Ð±£à¯;³<*°A°4›³E*£nà m@«^°K±kJ«PËš©A;´º´Mz +²7*£^à¨%;¯Š´´ ®Eë´‹ ³:¶)j³³b{¶sª±»0Û°k´´*« ë¶';£op£Êµ" ³Xë¡—ª·s«±`‹¶„ ¢d‹f[¸ŠK¢7ª À­üú­pÛ·ˆ€ G©Ýê¬Ðá ä*§o0'¸Ê ¯o ¯™•{¹q[´¸ÀÞ:¸‹‹¶‡{‰;»¸ ·T€º%«¨Œ*´“K¥w2§ð™º¾ûÀû© 0Ÿ©¢° Qк"»|þàªQЫIÅKº<««°š»â롵k·;¾è;¾q0 éÛ¾5¤+¬î;¿h ¢P´Ð ô»¿*Z¾q¾üÀÿª   |¼œÀ† ¿7+¿ üÀÁ¾ê¿À|ÁœÁDJÁ¡° Â"<Â$\Â&|Â(œÂ*¼Â,ÜÂ.üÂ0Ã2<Ã4\Ã6|Ã8,ÃSÀÀáÁ9üÃ@ÄB<ÄD\ÄF|ÄHÃ;,¦ÜÄNüÄ-ÊÁaÁP\ÅVœÁRT|Å\ÜŜűÅ^<Æd,¾`üb\Æj¼Æb{Æ‘ÆlÇrL¬nÜ>œÄxœÇz¼Ç|ÜÇ~œÄþKÜwüÇ„\Ȇ|ȈœÈ8ÈÁ:ÇŽüÈ[Ç Ç\É–l¤’¼”œ§'Ð i«w£½0º—\ʹ›É ±É©k£;:À`¼,*£¿  lʸL»<Œ¸¼³.Z §À¦°`µÐ EËÈ|¶¨œªü¢.z ¥À¦7 RÌÖœ³ËŒÍ«¶ºª¨4,: °„à ^€ ]à©Q0 S` # §àð¶×\ÏÿšÍ±Í÷Ú®¤«¢N  nð|à¡b@ ž+úK½~;«öüнŠÏ¡Ï#Ë´ ½¢ÿŒ º0¥º °\¨@º Ñ$ý«»l»½lþ¥«Œµ² ¢âü¡†à SpOдBCºó\Ò:§]=µýœ¢·ð!Jƒ : ¢}Ô¼ÓPý¥=M?]´2 ”º¢¥àÉ*£àGí¡º@ _cÚÔ½ÍQ½ÖG:ÕQÕRkÐ;Ì¢‹ðÊZ3à¾@žª »Ð® ý¶ÌÖ†½Á'm¾)í«ì££|Øý¾LÙ”íÅn-8»45ªÙ•ÝÙØÿ»Øž=Ú|ÙÐ̤ÚèkÚ¨­Ú®=»¬-Ú¯=Û« Ú,Ûp[¤Ë Ê-í¥MÛrÛ8Ч#êÊ㬢²LËÿ: …-ÜlLÜ*þ}¤À,ÌÄL¬Æ ÝÑmÛ!Æ¿-ÔjÍÛ¹=¬O­Ýj,ÝT*À0¦`µMý½®¾qÛÍ”úÒZÎçœÎmºÎíüÎß|'%º©Œê¨KÔ°±@ßêÌÎîL¥Ÿ4šÓæ]Æè]©‘;½Í­¦Ë»±Ê®ùÿÐ]ÐpÐ ½ÐM=¢™û­¦ ¦o P©n­&Ž M¥§ÀÑ0Ò>Æt›áu{à,ݲ³šÑ ¢µ!}Ñ# ³;Ê À简äÚäGûäP êã?ÞÅA¼.ûÞMkµ_ë½jßÓ3]Ó ~ÓP.¢^‹©#Òþ}¹¨ðÎ@]çñ Éáô\æ\äCNµÀ+ m+¸nC]ÔaJÍÔ«åCN cPPƒ°µÁkéK=£!ZÞˆžèÜ=Ū¤ñº¹²# § áñÊÒE»ÕêÕ`Ô0Öe}Ö+-¢+¾¹¼`ª¿ yèÀîféiêf¾êZÜêêÍÞî­±GpÎ) £Ö‹½ÚKä%k×€×zÍ×mê×€-Ø}«Ö ¢ÈË©À‹PG q0ìéþ׽ʄ}ËÒÅAΣ뫢»Í£´€î‚ÜoÅï¢ö‹¿ Ýð_£ߢlÀ_ñ¢Þñ ¯§ò$/þÕÔƸ]ò*/Ù~ºò.Ï¥#ÿò2ϧ'Æ)/À)~¢¯Ü½ÊëÛHÊðÚóœó%ŠÜi;Ë«ôHêÜ?ÛAÏÎÜ¥Núݘ>Þ%ZÝi;ÌËõik¢ÙmÞoÜGZõ=jô$ ÍÒl°Võ§^Íb_óoÜêEÍß .Ï· r®€• ࣣT`÷þßèœé´úy {Ÿª·ÊªñµƒÏàþ ø熯ߓßßðì÷#ú©¡š·Þ©µªª«àŒ à›÷Н÷|Ï™ÿ¡>ôrßf›£7žãp„°#ð$èêºãÐ8¾Ð"NЈ/£¼ïûÀþ¿Ï¾¯±›©¹âÄâœü$^ýA¢á:®åÅýÛZã&J£Ü¿û½ÿûÁ¢Úÿ¡d.ÜQà^Ò":¾.üq+æ]þÑO®Ññ&ÐÀ@ 4HàPˆ¸ÈËÀ;£Žàp஫ rXˆ —EQéH£G5*„¨"Ì™FÝq1Äœ'Æ$˜qcÇ@c2|9ðdÊ…?>…UêTªU­^Åš5м~VìX¯-n):¡PC´¦Lê2¨C*j4äjÊ'q_¶}›PîK’… õ²–.ÁYDåÝÛ7Pâ»rÓ>-¬03ÏÁ–ÑFþMKîc·£/CæKðN­­]¿†6W²µm5ûYá H1ïüADÑaÍ%‰"N÷S*ƒv~ù;øð¸Bkb|¹æå[`6®]÷e 5 ^g}9¹ßíÊ{Ó.|=AðaH‘_ÿ~þYißP¬ÜæRHZFq#޳E7 ¹E(`,è—(F€ä”ù DPÁ¤@Ð9ö„jðÁ«.Þxƒ–ä8LpÁËJé… Ý1=ôŒ@…N DbI‘iÁÅÎÒ"o°,B ) äÆ饔þ¶ä²Kýþ 0ÌNô‹ ]viä‚Azb†FNJŒ·.:þ TR˜ÏL4Õ¨ˆ¼ð…ÙtN%Ý0e `ÄHNÏ4×ìl`ˆòPAq”ÏQà—˜¨À”)>‰è `€ùÂ8õ”ì4¦´2…´Í7u‰sÎ@* t €1ÎK_*0ÅÌ`íï„a£åR_› ¶—¥¶Ú-‡%Ö6c­å¶[o¿7Ün±Í–¬mÅE7]u×e]rËpÁv祷^{ïõ¯+xµ•_ÿ8`pßÝ·~F8a…~à‚Ç<˜a‰'¦˜a‡ >·b7æ˜Ý‹÷͸½c•ÅJ(îÈHÚŽWfùÛá Y7`G˜´ä …¸ˆ×–wæØ—ËþÙÇ-g<%+¡`qƒ ^Šè¹i§÷û9Û ÙÛ;-mîì¾§·æZ«¨‰51€™Â”¤7• QEÈ SQ={ÕÊ#ˆ_ììb *¢˜e [FШ²Õº&¼ð¨¾3l#[Œâ¥UÁ¥¹ —Å‘Tò²Ìtð >#HD¤hÅq…FpÊpÕ G<̰)¼Ét¯³öôÆ+Î$”Z©¨–æC}uá o=À°ãl>ÄÎ^1äzü2ºñÒ+µÉC{ðá·ºøbûÀvÂŒCŽ"Øk¿ˆµÌÊכּïrÀË´æ¾~ž½¿-ìßà"I¹,ĆR$9þUîrþ`†þ¦DÙ(DÏy’ì’%ûUeøãZÆV¶¸ÑÉNxŠ…F”êT©òàj%IQêO¹ÂÔ™%Á]õÊ‚7¤k¶×Äa±!lT†C"NL‡æŸVb!ŠBТtE„b¥rıð0+º0ø`C)v±‹TŒ—Å8Æü€1,S#cÕ3‚k„cÛh°8ÖÑŽ™cY"Ö¥&I¥ÖJK­b2”Ýq¿ú㱆“Að~Ÿ‚žžì$uÛé.…—Taθ7›ÙÝ®\4ü¢w¦.Aà‰]7ø¢ rÙŒDåGþ*Xn|%ÞœCîbË.Ï0I©1-z<ÍE£¨‘Œh3’SÉl©^’Ÿ—¹Tæøz#MÛ\ ã)oøÊ¬JŒ•DÒ.‹ÙË+²‚aºåÇZXIOöj2­ËL™b#@ŸMn7ã¦4XÏæ ÊîpÐ!Ëä|qù§òèëMï(¤>ˆŸeIº›÷|*G^ßz éJå¸>²3žé»çìt:*#6gP2ÜÝL+ÉÃÇEîEîœçØy9Òq§ŠÃ*V+D@ksÏLDàâË -iEG$—¼aÓB[åH¹¤ûØÑNÑþ\4~è¾>PŒ ýËVéÛÀv8 þ ‰Ùåöc€ [ÌyÞMbn½GÒýõÞ¼•¤¢# SÞÁÖ·nàMÁQΙŽB£µwPU¾§ )®·Pê%¢ØE㽃„ïÀ0^è‡Vµ…}zá¥`%ÁV‰Lo2Ô®.µˆÛ¤N*L ¨DEªî Rñ¦Äy~Šhæœâ&A–Žª¦‹SldsêÄ™žBz¹åOºÆ·îå§×PÎwäÆ|¸%AºZ|»Y]´¿Ñ_Kl¢t;¹w.­¸bXÔ"ùÌÕ²n×Ë´ûà¯:¿/Þñlüã%¿½ÈOÞò†Gû˜@q ÎwÞóŸ}èE?zÒ—¡Þô§G}êU¿zÖ·Þõ¯‡}ìe?{Ú»þ‡/eZ°{Þ÷Þ÷¿~ð…?|âßøÇG~ò•¿|æ7ßùχ~ô¥?}ègÞú×Ç~öµ¿}îwßûßøÅ?~ò—ßüçGúÕ¿~ö·ßýï‡üå?ú×ßþ÷Çþõ¿þ÷ßÿÿÀÀ$À4ÀDÀTÀdÀtÀ„À”À ¤À Ô¾€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_a_2.gif000066400000000000000000000156231343257752000272410ustar00rootroot00000000000000GIF89a[Ë猂„LB<äÂÄŒjd„Ä‚„$"$tbdÄ¢¤lVLŒnd¬†|<2,ôæäܲ´´nl \NLd&$¼–„ìÒÔ”z|\F<„ztÄ–Œ|jlÔ¦”D:4”"$4&$´Ž|$ôÆÄ |^TŒvtܺ¼ÄšŒTJLt^TÔ®¬œ24œ‚„TB<Œ„f\D2,üöô¤~t¼’„äÊ̬VT,*,|b\tZT”rl¼z|dVT¼žœìÚÜœzldJD„j\Ôª¬L:44.,¬ŽŒÌžŒ¤ŠŒ ,"̪¬Œrt´Š|䲤dNDT6,´–”\JLܪœ,üÎÌ ì¾¼œ:<¤‚tTF<´bd|f\œ~|„jlìÂÄt ÄŠŒÌ¢”lZ\Œrd¬ŠŒ<64ôîì¼vtüÒÔ\JDÔ’„Ôªœ”.,4*$´’„$üÊÌ  ”vl亼ĞœŒD6,üþüœ~tL>4,&$dRTT><¤‚„LBD„ ¬^\Ü®œ¼rtÌ’”´’”¼šœüòôä¶´T:<̦¤<.,ôÊÌüúüäÆÄĆ„¬Š|ܶ´ìÖÔ”&$ÄžŒœ64äÎ̼~|ìÞÜ œ><´fd„nlä¾¼Œ¤†„lVTŒnl<24¼–Œ\FDÔ¦œD:<´Ž„$ t^\TBD|bdtZ\œzt„jdÌž”,"$dNLTFD|fd4*,”vtD64L><ÿÿþ!ù¼,[ËþïH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«01ØÊµ«×¯`ÊK¶¬Ù³hÓª]˶íZ X; h"¤®Ý»xóêÝË·¯ß¿€ L¸°áÛˆËQ€&#KžL¹²å˘3kŽ `³gÏ?‹Mº´h!‹ktlºµkÒ¡EÇ.=ûµíÛ¸Q«^ý·oßµEÈÁ5'ÿͼ´îÝY7ŸN›:“ÐE„ìBÛº÷Ó©¡þ[”þ½<€Uª¤ÄýºäÐRÒT‰0"´} šüx˜A9v˜*íÍŸ|ôÙ‡~úñWÞ‚L<'^Eä1H‹QÄ"8ød ¼0Ë, x.&¬CýEöŸ†œqè!ˆ"@¢‰(JøƒN¡Ì à 1°Øž&@6CŒ³@¶F&)21KyéD‰¤’LòhŽ9F´£–¸ dRø!eh~ŒÉ„1n8ÙpTÁÇqS Yšd¶Ù"˜ÓqÙåC_òùšF9¥k@6KhU2qä™M¾yg¢N2Z¤£z¶'èo~þÙP ›š@6 @{mà°† º„Öá‡þ!B*åž©®Úª‹°f:e¨¹…ç) ½ñ:(zq¤¡fh3xà‡&@ÀgJUà kl"JꨲÌ: ­´² k[§¿*ª·Ÿ-çÙ šØˆ.¹7ú.C㲫\iNÌbÂ"N,Xï½ùÊK¸ï¯¿—™‹Ù MTq¥ß!¬0ÃsênÀ ñÅó 0Å•‚ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,³Ë ”Á1CšÀ©óÎ<÷ìóÏ@-ôÐDmôÑH'­ôҚܼÅG-µw; õÔXgýíÄNtµÖ`‡íYÕ7-öÙhKF6Çf§ívØkSÜöÛtOwÀϬ÷þÞ|÷í÷߀îDÍ]'”óÒˆ'®øâŒ7îøãÃ5]¸ÀÁÖm¹Ûw¿;÷åœË›y¸l vŒ$ ˆ^Þ (tÞÜ翆ÎÜU”b:dmøÀ+U¨éz¯“SþqÆiZ.fcèÒ«ø¾é 9üîìžFˆvƃ†™c,¯:ƒ l'ýmÔÿi½ŠÖéf|óÕ ‚ûA¦‰ ‘aIJ@&šÄÁ¥ÑÙe¤à„DÀ cŠ‚P¨ëÀOAûëßÿƒ°Ð”ÂPã{Mùºt>ȬH}{zŒ4£A& #…¤`‚,@æ‹0ÁøP‹YQF‹ %qª4 þ”XÅ)˜à‚4Œ¨D&d eHCäè"IXÊàÖ‚g>)J Ò¥U'(.iR‘Ñ„ (!™7ØŽ aHW-£‰ÉQBAò'„X\Ç‹Y2£ÕúEæ‹RtÍsd½áȉNÕ:”šØ$+Md 2©ÐE@ ƒî̆“ÁӚ̴†tM(ÒD¢ìÄ„L\ò:ì‰L)ÔHÓ òA´¢e)+ÉJ ”Œ ðȨÂn]È„EÈALЃa¼Ðü2RY[é®M.–nª«\õ¢X­14É‹Lf°KR¼pÄ °˜ÈààP‡<„ šà&l¡ #þhæ9Ó¹ÎìÙ!zÔ¬& ‚Í=%kYÍ"Ó³¢5-%Õ29P…€ý¹à ~˜‚î²È€IF ?0àÔ” ' pƒ>™ ˆ‹ft£³)Eï*Ðds–Y×fPðÛ,¢¢`bMkjÓ;àT2ûÂ×P—:6kqØÂ˜JÕí9µkP­ªV7óJñdu«`µLW¡óÕ°š52cÝMYÏjÖ´ªf­l«[#;‘îvL@]g„W Í5.u•íÎx<&ä2¼s^_©vU«UNÅAdifð‚U¬â *˜dÂ‰×æEz‹]Ð_±ÒÁìˆï{“É@nð¡TᑚEþk÷ð:›ð…¶<£½J,?ØN2È}LàC†"£>èS€T¦ýð§?þù€×d.xÛvU »M_o™ BoF˜L0A/wµFFF…,t¡c8îÕýWcËöXEA©‘[´óIÞDÎR~c,ãÓ(%øÆ÷uóeÛc 9'Yi’¿U¯xW:GBR’”´$r¹ÊË÷ºF­o“þ»(ùå2».‡ŒË'—“ÙåxŸi­ÚNÓÃqAQ¥ªmâj„L)kgáÚ3jóVL¨Â¥˜ÀY&Œ³œûT';÷O#XÇ"¶ÖA³¥ÐmÅf  R#a+¡J\Eþh Q‰RÔ¢Õ¨dªX+OñºpÕ©mxj¾Úyz –[åL“Ô~ýÙu¹µÊW¥ ±C_.ÑU«£¥iªHzÒˆtÀ.iÎUz*œî´å>-•PGì®–AmÔTý?«MÓš4päÅæTÓÕ¾I,eHœâz^Þire~M^‡”Zídx _÷èF³µõgòàA ¥7¦µ­ím_ÛQ"öml»lXƒ®rì+Ps%8JéJ„Ìr5‘?ä–BUXo–*@«¸ÁºŸ+?` âßoϼógA!D {îï}S° I7p~‡C\â•Äþ§”Š&Ü@Ñl ÅõÈ ®é·¡áøt1ˆVsÇ®rÝ ÍÛ›½&ɉ5Bo GQ)l p"Ð!ƒöökçM,%Ú.Ã~…Fèê­Œ dqY°§èGOúˆ ˜sÈ`½ã\•×·ÞuötUÐ(D"ìHw"Ù»yõ=ŠåƲdÅE=¢‘™±LÆ=QfM@Î♂ÌBÆðn1Ã*o-16þ2ÞÆöd `žQÆLèÁ½úp»€K€ ™ G:ÚQ2¤¿ŽéOL¥Ôÿ1K¯|dSn8ñ+ä$+IÞ,"î&¥&#c|w[øNŠ ò3þŒüÈ8úÃAN*[¼Híc˜ù˜9ö{4q*%y”TJÔ÷£?~âCfûèïpàñ\¹Óû¼=Wcn¢?¼d<1° °]œ'4¦6¹Dy–G^26˜€ h<þ8(”ùÆ„LÊÄLLp ˜HH€ãÅÒ´k6W=8ÇwQÖOI¶döRO†ætƒ‘>ÀBB°](àt5ˆEMV„U×;؃Åf@(„‰TvNFN<èx·3 ªÐ:´GOö„O…&0„ÆC…MU¶E!R°PÜÂR.%gif.ÛQT7 fªb´]×q ppgUkþ8ˆía‡oƵ|è‡.Hmèemv‡ñˆÕá$o!%uR)µ‡}ø‡ÆS‰ u‰Hg0(|”¡gtÃg¤ñSÍና!‹ìB‹’áj5ÇŠQh¢F¾5Á¼¨D 3U›Ñ3¡ÅhRÃŒ£ÁlOaj¿ˆ91h>²6[N!Øx6ÚØÜØ9j€cßÈs蘎꘎_ðëøŽðx¡ ¦nqø˜÷˜0úø_ 6P`P•P é4*À€ ‘áR0Ÿ`™‘]¢pƒ0 ’ÐÑgp4P– ’*yŽP “0þ+9“Sl0—P4¹“OQ0=P‘<9”IQI*À D¹”E¡WP`ÐÀ”Tù0„PPP•^¹P’`dY–•_™–7QЖné–€j9—21%p—›Ð–wy—‡@—~)lY9˜3˜„y˜/a˜ˆ¹˜*¡˜Œù˜%á˜9™ !™”y™a™˜¹™¡™œù™á™ 9š !š¤yšaš¨¹š¡š¬‰š®ù𤛲 š´Y›q³›¼Ù›¼yGà›Â9œÄI4'Ð'°d°œÌÙœÎùœÐÒ9ÔYÖyØÉœþd°Üùàžâ9žäYžÐ¹ÇÉ'` hОîùžðŸò9ŸôYŸöyŸø™Ÿúéž°ŸhПð  þ9 Z z Š ¶ž±ž ú ŠŸ€ T𞪟:C Q0íy¡ú Z¡ü9 !ð o Uð†ðžJJðž%z¢)º¢ÿ¡6z£ô¹ ÈÉž8Ú£ Q`: JsÀ £Ð¡þé¡ ¤B:¢þ‰ {ðp`d¤íIª o ¢h ¥Tj¥Xʤ>Z¦ª£êÉ£fº¦KêP b@ ¤ pСà ™°pZ£î™ ¤h §þtj§Yz ®P/ê§Š  ¹à§§{Ú§p U@ -Ú¡nÚ§~J¨uz§ÿ)©|Úž™óY¸€¸îYªòI¦l«ø‰¦ ª¦²z«óÙŸ<€ "  ·  s0ºp Ú ‘]0¦Yê  ¬hð«Á:¬íÙ ºð^ JZ¤P‚ ÆŠ¬Xz »¬¨ ºÊ«‚ ­ÂJ¬ÿù­ÉÚž»` Àñ¹ +€+° î¯ó ¸ú¯÷I«á [°‚Ê ¯ ¨oЧ)ðê íÉúŸ:S}   Ûž Ûžk¡  Š¥±h ±˰æÚž«° ëþ°ÿI²&‹!p z oÀ ¦Š‘@ ôʤ í9³5{³9 «û¯›{´ÿ  p€ tà§™@¯%;±š²íi¿*¨S±Ûµú +²CŠ™ªŒ€µOµ ¶1{µðI) úЬ°3¬·s[·FË´²š´±´~+«š´Û²‚Ú­0jµ'«±.Û±ü9o°¨Z¶›X‹†‹¸Ë¹. ·ñé«P²?ëž;KµïIº‹;¸ ¸!¸®»¦š à«Àº®­»¹^p ‹®¹+­h@­‘p­J:Ð Œ ¥âJ®›‹¶‹»ÑÊ®¢; dþ`T ; ¯ù Ÿ»Ðh`½Ø«½|;» »!»æë£Jå±sZ§T+ºû ¨Œ¿b@µTp šP$ ¨ž@ ]p¹PÊ{p©]à­ë¾š¿…:¿ek­P™  ¡àªÊªï‰ªh@ÁŒÁL±:³¾lо¡¾&¼Â³ªÀÂ0ü· :°¶Ã6ü¯°à ˆ  y{Ã>|£(L*üÃDŒ£¹  ¤°ª[ÄLL A<CÜÄR<ÅTŒ«O,Q\ÅZ¼Å\¬ 3œ6° š0Æd\Æf|ÆhœÆj¼ÆlÜÆnüÆpÇr<Çt\Çv|ÇxœÇo¼ 6Ða¬Çþ€È‚<È„\Ȇ|ȈLÇ|¼£]ÜÈŽüÈûyÅ‘Å\É–¬Å’ ”|ÉœÜÉ>œÉ±Éž<ʤ<» ì¢\ʪ¼ÊVüÅ[ì˲|«§ÜœÈ¸œËº¼Ë¼Ü˾lƋ̷üËÄ\ÌÆ|ÌȼËÁ\«³ÜÌ즵Ì©üÌÔ\Íëʱ ËLÛ u‹¡í™oз³,ÎÖœ«ò¹ ÊŸÑ¼Ó ¥æ\ !@ ÷»Ÿ: DPÎe‹ÏÞŸ)À³êŒÍé«Í :  ðDÚž«ªúLÎø,ºõjÿÌÈ=ÊÐði  pÐ~ªÏ­Ñ¯šÏð¹QÑiŠÑ‘ª§£Z£%¬þŸª0ÏŒ ™à \¥]  UP EKÂF+º†àÒ0-Ó4mÓJ9CŸ.J U  ú¶o­0Â;ýÒ1ÝÒP ¾ ;¨ú ª ÔýY©—š©DÍÕT0Ó5³OÝÓX]¨Z]¶[=Ôý›¨‹:Ö?³ó驆ª&Í©ñ©ÔL=Âp›Ò%=©îù.ûžë¬íÜ­îê¬ýž`‹š@p0{ОJ  Å=ü¼ ¥‘=Ù•—Ù›ýJÔÁ[Àh †À! ¡ýٔݞ²]Ù¡ ¤s° ¦j¡ð¬ÁK½¦Ýž¼} Á=Ú^ Ù´-Ù³íÛÓ»»ÜÃþ[­Æ+Ú˜Ü=<Ÿê*¼Þz¬ï:Ÿ¬íÚ° ÝÝÝàú§kØÂ]Ÿæ ³Ž»ÑùùØ® §Ýž´0ÏVà ËKÔe[ß÷ùµüýŸˆ`Ÿ ¸ðšÐžþžÞž…Àž¢@ 1m Üš¹¡{àŸ«¹îÍáŽûíàöýžNÞÀáT­×®ß>Ÿ'þ²^‹Ÿ Žâ ßè-Ò̼¤6.ßø¹Òî©ü\}ÃÑßï,¨B^DNª;Ó¡^š«T³Š IpÒžKÞähå¬ü­…ð»®`ªnkµ^ê¶Å-¢F \NªSßÝzæKl¶ONŸeNÞòYåUpåþåçMØ:NÃ$ÍÖ­›Ÿ¶`ÕîI…Ðàhp@ë¯>Ÿ`ë í»èíéèñIÎ ¹Û^@^P錞¥–Žº@C€CPºÐá¡kâ(ëÞî‰éò©èŒã“þ¼’{é~Ÿ1îÐñùžêmKµ”îç Ò®´ííß}Àâ÷ Ý)¥ž ºpíAÀ£Ïˤ£Ð!  ÖŽíŒ®íÜîín¡¨@®ìúÙ‘` æ~í¥~î¥. Ž ½š°¨ÛM½ïy ï.¬ʤªîpÐíí‰ïŒþïíîã^î­K¼Õð _èέ»Ï.ŸòNï/îä Ñîνþ ]Ñë-ÄÍþÎôkÙ{¾Ÿ>;ÏFp™€ 4J¹@ ~æýXúž)°/m:ó5ó9¿óܺÑ>ŸéJ`ÔHÝžPp~PßEOó6ßžFŸõh`"A¿ܺ^©ÚôíŽó:Ïóh°õ4 Áò«±Bï DßÀþ ÀYšôn¯öï)÷ûëçð9õUŸ ôC JðòÏþþŒò=»Üœ º@£>Zù™~ØïÛÃè,Ÿ‡‰ÍÑOúœú±´DC «¿Åmú Ê3´œòP¼ò°û±Œú1ú¸ßû–¬ûÁû¾?ü ü!üÄŸüUlü±É¯þŸŸ“OÏßÎ~ûùÊßÉÌ?ÎÑóÏ,Ÿõ|Ï~ÛÏs~ýœý¹iûÏ?íÍãhЮ» mþ¿OûX¬þ@|òÒé«ìô_ÉaëÄ‚ D˜ðÎ [h¢ „T•Pp¸ø¢C8¡ªR‚q#D ®2-JáPÕƒ‡†perÅÅ!•.ªªÔ ‘ÀN‘ÂCŠ”‹oR¢éã0Å’&Qάy3'DšD>`êSëV®]½~VìX²eÍž+PáZ¶j kÎ]]2޼{k×\T"ý¶Š¢Ë(‡™=ÔDΜ=•èŠä% «»=¹Þ’K÷šPÐÌþY•ÓB(ˆ€Fó8ò䋿< ‘ ílÚµm߯›«Ú¶½¾}àèÒÊpUê÷¢'‡Œd£1üÐU®×i±DcÅUq¯ÈÑ/ÔP)™¶ AdŽÆ¹Ãëµ_D¤1¶núõíßÇ–·oþÀ/Vï9å‚+Ì"õ´L¤•R¤•*Þ€¢0žv⮫èD#„íô(d4\É)A '¼ˆ °Ê/EWd‘¬ýøëÍ?ˆ†ËJ¤ =É»4 [’ÒˆŠB4qè€H´°+³Ò…Œ!Т]îºËH$}Z!Š·ä²Ëü^„‘-@…¯ÍF¥‹"ùC$½øâ‘@4@Ùþå¡(R€cH‡rÑÏ IDŸ0›K—3EÑ$4rÑD *GâÓO@-CcP¼Ä4SMÍ3L…Æ”ˆ"EJa˜,‰‘=>ê Gb„ìŒ8 \ ™)Züà°ÂPÓˆ‘ †0 ¬È€ ‰ ]y=/4 ÀM¯Å6ÛN=EhLÚ‚PE¬Nê¬M\½Ü¥“l×eÓm¹5È[³`ñ](k7_}÷å·«wáu ÐGÇb””=¬í7a…vw €?˜a‰'¦˜ß–±b7æxË‹á͸c‘G&¹¶¹ ¹d•WfY«“==A[f¦¹f›oÆ9gwæ¹gŸˆ:h¡‡&ºh£F:éŸ5qøa„8!j©§¦ºj«¯Æ:k­·æºk¯¿;l±Ç&»l³Ïþ:§×f»m·ß†;n¹ç¦»n»ïÆ;o½÷æ»o¿ÿ4,&$T:4dRT”z|Ì¢”¤‚„¬RTôêì䲤´’”¼šœŒrtä¾¼<.,ÄŠŒ´jlܺ¼ôÊÌ̪¬¼z|Ä¢¤¬Z\亼T><äÆÄ„¬Š|ìÖÔÄšŒ”&$Ü®œŒœ64üöôäÎÌ”.,Œœ><üþü„nl„ ¤†„LBD|bdÔ¦œlVT<24¼–Œ\FDD:<´Ž„$œzt t^\TBDtZ\„jd,"$|fddNL”vtÌž”TFDŒnl4*,D64L><ÿÿþ!ùÂ,=;þE H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JÊRƒ€«X³jÝʵ«×¯`ÊK¶¬Ù³hÓžÕ@u €&AâÊK·®Ý»xóêÝË·¯ß¿€ ü·‰€¶ĸ±ãÇ#KžL¹²åÆ.kÖœy³çÏ C{r±bѨSƒîì™uhתcËžM±¨Ó³s熭€o.ü0æm™¸îã¡k›^Œ¼ùkç‚:k løjèØG—n‹;»w'¶þla“ÉztÇ7°ÙáDç÷CUí»•‘KMl¢Ùá«/¿ôBú-álðÁÑÆë <áðÃG,ñÄWlñÅg¬ñÆwìñÇ s ¶yRæÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8{bÛ¼÷ì3 7ÅóÏD[ÐL môÒL†ôRJ7-õÔ‘=­TÔTg=µÕIa­õ×FsÃ!—möÙh§­öÚl?1rÉ8Ç-÷Üt×m÷Ýx—©óþr`÷ ¶ØGyí÷àn”ÒöжBã2V ‰{à „#gxQˆGƬ4.H$¼ZÁ_Vëγ– \š‘ À\'ˆ,¥?¦=°¤©36]u®nfo0ÈÞ:eŸ»´»SÛ;c#ª9¦zì¹§_€ô1æÉ%u‘„¯ 0–IžÈᢙ<ÙO@ÁXÎ0`yF‡ý€ã—þpøvÆŠžËSÍåˆ"£ûäGzpŠô³¢1& üZ6p /0‡¸D"¡ SAf‡(A ¡)6 A%*Á6l¨C5ÈÁáHO óP7&#! þ:ZÔ Ô„C!ª1žàA ó†Î ÂÚ¢dª‘JŠ]cò`R®â‚‡¨@&lðCdB!¡¦±‚&ð@Jh l MiRŽ‚¨îzéKÂ)Y¼ò°²$,b}R›þs"`!‰$tA|¤£'‡S»9Ž|B¢™èD(&iºÔ=Nno2W7–*ÞÝÂp‹[Q×ÔñŽyÜcUkMI¦·º½¦y›¨N6‰1Á(-…P+s2x¡| )‹Ëd¹f—ÿµœu“Ì1 SU‚Pà19 Y^HÖ‰îÌ%À ‚™Î,ç4« GufX½†Z‡áOfÑÓY¬±L`P´GËš§ eÑ™´ bŸýDéEJÐqÔ­7`ޝV0Ôˆ46$X³|:¦æ¥î"3þáÖk“«^0_9Uóš·Üµ.˹©l®‰›ïÀ<ÓdÏ|Οgè@WnÐ2)´Ï¼*™ãõÌѺ³eéŒE'ËZNÎä× ›¶BÑ1Y*§‹“kZv.âÍ"£DØÇ€&¢>ΨV¼Ên&<È.ÊKèàZ×¼þõ®y€¤YËF³®¦tàfE=ÿ¼VФm£$Ÿì ¢µžŸjY„-È‚¬»Ÿøà Y àÙ±Õ^*3Ans›Ûá“L&†! ¡<Üö6¸ùׄÌ4Ûz×þ^¶'3ïzß»à–º·’^ÑÈ1¢¼‘ òýmÖõLý8¼# @ª*ûp³qgþf]ƪ²-ZnáèÏ $€ °! [ԃ纋ä5d$¿j®AwuFåÍL&nQï[”§å/ù†p(rÆàD·”ч^ôòd&[ Q¨Bºé0·!Óùó ®<‡Ép †Æ'ޱ^Ãù¢öÆûÎÇ$  qG;úʘ¶›·ÁüÚ{²’¸DÊ›×vÇ{tR¹v@Ñ}2‡'vä‹ÍƒU,1Wä¦ ÔEÇÜ}8Œßî’öI¾i$áþ]AàQ| Þ!i/2Q½´ïË&·væõúe=cf_{ß ’ –ãïó{ʨ=žØ&> yÈ%õ‰ø¶G>êþüæû7íf^’è+<&[¯Ú¢¥„ã Ê€L$À·‚¼cÈOUQÆŸïÁ›ðgÖßþ÷ññ£”~ª%ãįK³TK‚ÀîgMØúq½J‡9!Gv2vN‚°bÎWQ0ÏÔ,$@AA+`søC.¶‚=g!8‚&ˆ‚ÖÔt/ÖL"Xw× °@9ÜäMà$NŒqƒ—‚p¤ƒ3Ø6~-ÕPOÏbQUeKF.ðeþtALÆq DðÇnM çf…TVPNf†hh\ˆRua8†<`MSdŒ‡Œ1‡ÏQ$o!Q†bH†þp”‡ö´‡üÔ…×QP(+’ñe_f qRÈA‰‰Ý¢‰Ž!i`‚€f†ö¤Ø3§¨¢ˆSã|)óV¬è3±è4H@vVŠ;õj/ai¸ø5ºè¼Ø‹Yó‹-ŒË3ÿEŒ,ñ„ÑŒÎøŒÎ¨LÔXÖH†aV¡ÜØÞÈ{P ðäXŽæ¸laê˜vPT°Žð, ›P ø˜!€ ú‰i€ ¢Ð 0 ¹v PÀY‘Q` ñ ‰`‘É€ašðy’úø#€! (þ“ñXÁw “:i ¤À ;9”QAx°” DÙ”M10 R0•T¹ 9à”X™€P\Ù•]‰4•bIÐ fI\i–f)”cÙ–C‘\é–rYpYsy—AQ—x¹—=¡—|ù—8á—€9˜3!˜„y˜.a˜ˆ¹˜)¡˜Œù˜$á˜9™!™”y™a™˜¹™¡™œù™á™ 9š !š¤yšaš¨©)7®ùš°)3G!›¶y›¸é)pgЛ¾ù›ÀœÂ9œÄYœÆyœÈ™œÊ¹œÌÙœÎùœÐÒ)œ¶ºÙ jÚþ¹ÜÙÞùàžâ9žäYžæyžè™žê¹žìÙžîég`‘ØùžöyŸøÙž"p o[` „À……°ûÙŸÿ jùÙ ú âŸ× ¡Z¡÷é |PpÀg  Ûy°° opÚ‰¡Ê¡º º¢,Êž:ŸõÙ¢2:£Ý"žƒð jð Q 6ê J£B:¤Ùù¢AŸDš¤+ ½à‹àÁÐjÐÁ Lê¤Ü¤Jº¥j¤¤\¦ø)¹ að³p£Ù)«ð¤‹° dj¦hª¦Z*¦xjŸ^ª`š§~ÊžW P¥þÙ9 (3 ܨƒšwú§Žzž{š}ú¨”Zžb Ùù¦qº¦mڗʨ•ªã©1©¢zªªp,pà„J¥Ü  ©ºª­J¨zªºª¤z¦º«”J´°a © Ùɣܙ£j ¬Äj¬Èº (¬¢Ú«ñ«Ôš­Úº­*ŸG£Ü®â®ÖZØ:®èš®”Z®q®êú®ðº¥ì:î¯öz¯,:¯±²à þú¯°;°[°{°›° »° Û°û°±;±»ÞºüJ±»±Û±û± ² k±Н&{²+ª¯Q¯(Ûþ².›ž* ,û²4[³ß³1³6»³6‹³¡³<´-ë³ ´B{´÷J´ ‘±"Û´Nû´PµRû±$ÛL;µX›µZ»µ\»±Uû­H¶={±| ®b{¶&«´ a´,: „jžAêo«hK¡tË¥A £ÐjËšfKžw ªë)«P褪@u+£«¤Aªº}›l{žû¥` 餲‹Û¢—K¤Z FÀ“‹• ·éÙ ¥°¹‚û¹+ºCª¥-0¦K¶’ú·ã¤Ðµ‡  z2ç †›„ð aP YW°°º`§Òêàþy§Aš¼ËÛ¼jð¼Ñ;½ŒJ&³ ¾ ¼Â«UÐ ÞF ÑÚ»ü„ 7Ðý¼Î ½Ò«¦ßI «°©à¹è«¾²À¾È«¼Ì;ÀÛ«op¾³ª*ðjf° «`þ âË p [° ž,Ą́åK¿ß©½ü¿ë­&̽ZZ,¹¸[ªº+ž¼K  `¢¼›žað¤Ùé DÀÙYÀ b0ˆª¢L|½Û¤@,ÄD¬FŒÄJ̨¦ ŒjÃ8œ¢z@‹ f0Å U £ ¦pã¢UœÄKœ¿À `_ÆcüÃA<Ä|,Åþj }  7Ú© ¹0Çuœ X¬ÅjàŒ *á¹Èt ޼ \œÃàÅ~¬y,ÆSìÉd¬"·[²–˨†©¨ÌIJË=¬µ° œ¸p¼,P ‚{¹Ø›µ|ËjËٹˌêÚ ­¬‹ðÊê ¬œ©Êìʸ¬Ë¼|½çÛÀÝ)ЬÁ¼ßœƒ€¾° ÍÛ ƒ€ÀÙü€ÌÙ™ÀÙ© Ï ÌÎËÜÌàÎÛÜÍúÜħœÊ0êºM ˯kžÆ«/0¬oУj {ÖKÐáùËjÐ[°ÐÙéмK¢¤/Ge²ÑO|ÑÓz½>ŒÏíÑMþÑ=Ñ Ý£"ÀËz0‡àÍ7:ËÌüÊ Ñ ]ÒkÓ&-ÑÞ©Ò ÝÑ›Ò-ýº. Ð`{¸ ÑçÙ ¬W0Ý|›Òí6mw:ÕU}ÕɌՂû W ;ÖjmÕå ëüÎe}Ö]MÕJ×j g j ƒ ïüÖMÏòž‚ÍÎbý^ ×fÖuÝÍ´k»0¬Êª;Ði½ çkž¥ð¶S p`×» œ=õ™Öª" ¦¤›ÝÙÝüÙ¡=Ú‡ ÅA,½@Ú”° ¢­ÖOì tì ™ŶÍÚœm×­m×¾à » »à ªÈ“þœÉwš À]ÇZš«–ÜÈMíÉÝÍÄ}ÛÙùݯ ­ÙÍÔ¹ÍÄ…`±çù¦Çk¿  W° ¸ 1ÝËÚé)º*pËÛA*ßômßø­ßé¼Þ‚ µŒÛ}ßù½ßjàßÝ©¿üë¿á»Pàó]ßÙià"®Œ, ,s©<Á>|§¼Á|áÿ­‹ðâfã‡Í$® á#â ¤U¹Úyº‘ºê¶ï Ê­Pžá¡:å~ª·|þ:𻥱Üåè½ÔÕë2ê3`îÛöª2]ªå×Êågþ桪äÁäp^çI*çAçv¾çþ3Šç¡ç|èêç1³_nžN¾Ê>·[Šå‚.¦„.†.ÐßI¸Ç;ى˥ëÃ.¯ln®n^ÚݹaJºÎ¥‘. “žŸ¬+Ї^¡µ›êž.ÙÞ¿ü­Ö3ÎÁiÝ»¿KÂmÀ'ì½÷;¼ý<ÁžKÏ ¬Í¾n¾õû½vzÁÙ™Ô´~çŸÞ®àª"—|ÇNÍĹ ÁÝ뛜¢6­¤\ÄG ǹžÛÉ<È…|ȉ å®îV¼ÄŦìÌ×.¤«>©nφ½Þ‚Ýë÷üÊçÞÏĬâ׌ÛÞYØj0ÎjPÎçœÎÓ|ÓÕ\ÌïÎrêïÿÞçÙN¯Û^þÒ8ÝÔaà¿‹ÐëXì,]Ñ Ñíþ>Ê/ Ê2MÓë-ó ªÓèûÂ!O£¿í€¤[¤?óA Õ‰j×l¥¢Î×y½×}ÝÔOßã³ôB?ò!ð×-Ü‚{Ú©½ÚÙîã®ôÙ™ÙÚIÞÎ Ú¼-Û ®ïžÉËÝÜÏÝ½Û½ÕæÍõ]oë…°¿¸ÎÄ>àAº|°Á` jÏÌ…;äî¼ ná¤áÜ™ã ìÃ'žâ+ÞâëMá ^ÐGÎ速¯^¿²ÛÞžs å™èíiåBêè§ß¢Cßãåi †àÀǵÏõ·ææùÜ«À¦ÿû!üÈ¿üí©üÌþÿüèéüÐ?ý£šú2êÔŸý¼jý9‹ýÚ?ýÒ¤3 ûmrË ´ÿý§þTÞ¢–®Þ™ÎÀH®þqÎý?‹ý±®Þk¯¹êmêÙ‰ê¡Fà@‚ D˜PáB† >„QâD…gˆÂ˜QãFŽ1¦èÅE‡#ö*%ѤI-¦„SæLš5m´èQçÎŒ (´jK*8Wþ'Õ–U…LÂ1³j•™¢jXZµ @«@XUú¦VWÀÀÚ¢K„Ѭ[ÕTysSî\ºuí2ÌÉS/GŸƒ ¶Xý Ì,°+“¹ ÎU¸ðÕ0‹z"…€Iþ3eÖd‚"ÂÜEZõjˆy÷¾Õר *â¾jò m5*tó¶-7ÁÊkí‚D—W5,j‘hšõtêÕﺆ­W¶UËj~XM˜ª‹L÷>·ð®_ÐÚò&ŠÀ0ZíC×ú~þý'bÏn§íî¶óº3ä·Úìí6ô®—? ºbO:@ƒŽÈ%ÿ>1Ä Ð£]Y,2ÃTC LiL1HCì1`TdÑEZ…75J f )T€ÃBv†È9B O `R1J)§#±D¾˜4*¨¡ª2I…CÄêäEø` IZ$ª©ºóL“ ÙBÌU˜3þâ€0~!¤¬]p‘DAð«b•î¦$´Ð¹ª´R£aš™F 2¦`F1´RKgB4Ѱ4,"[ q˜Ñ.%µTSG¼HS9½ê¡]T,X3a±‹R„ûÞÿ¯Ã|ý†Ô¾Ì¼'”õ -4¯KöŽãT®hAüB ¿ œñØ¿¶j®;K4`#;£;êÊ4£°#J!>s¤“飃ø£@¤~+$.I@=ë@…¸@:S´BC#< üÀ~k´ºs¤·(ªØ<‚†^p! †À›ÁD9\¥¡i%a“%b³¬Âˆ&«H¶z» fë%«Á%öS5¤3-dB-Yûþ5+Tˆ(d5,Tƒ` #l5gš,¡gsÂkú½û3èÈ=ƒ7˜…+’€|É®²6|Ã8$)v—‡:·œª¹xû'£ ·´¹75È7¸3ˆnSƒw3v ·h#(³‚Äpj,m“·H<¹ÞÀÄA¹™’Í»˜€H™Ã*"ÅHq¾Â€8P’¸•ò)°8˜Z8™šEö+¸”R‹Ú)›Êž€yÅð 8X,S7޳¿D1ïX¸šC!sÆ´(•“¬@4 ž»Šœ+ ÎáFöcDGd»çS«4 l„ŽpL9®"«ƒ¨¿!2U8¸ ð iÔK˜ ¡G{þÄGV\?Zƒ,Áœ©+Bð:Í’1­Sƒ… ­pñ¥Òr *,GÉ—£c5‹Šºð€H‹JŒÅ0‰…Ô4dF˜0€…T(,ˆþ£”\É’I·“á)¹‹®¤.äò»È.:Ù;=±®ï /*:;óòôºHÃ`/ 9Ê´{®µ;Až¥1)“3q/ë¼PTCàÁ¼b)¼‰0ÔË(i”íëJï=Rù”PIÅZ!½¶Œ’W‰!#°üj1º”¶“ä˛˿:¿LÍ[ËmÚ–Ë… —Õ;“€=† LúÄÛk¿zѽÇļԗÉHR1 é33ê+–ȾñLþt4“x?Üó²ëŸÓ"“ÀT· Ñ¢ÈD£I>›¤šÑ@©0$«xÀ|©¯°4=j@¬¸M³Êͪ(ÁDóÍålDÞÎà€ âä’ãÔI¢ê"«50dL!Œ.Bjª5kJ…>PH…µèƒT˜BÈ0Š$$B`¨×j6òœ?³2OiJÏ£YO&Tƒö|ÏøTƒù¬ÏdBB¶ÉO–ÅÙõS@½Nmô¹ð¬PÜâ,Ú›…|€©,WP‘ŽtH‡ôOØ…‡ô„ ¬Hû¼„ÔOÀ:‡üȆó‹Q-Õ‚d:OíÔÙÊQUeUW=-áUÓÜ õK·ËJå!  ÝTœT®èi» TFh˜ƒó"Îô"ä„F ´Öfm’¦ü‰èt®ß¢/leVmåVðVp]á ×­TV½ßüJ33”ÅŒˆ²4ljL8ÝÔº‰×\……¼Ô”vâR*ÌÈ;X›XÃ$̋ݷŠÝKµ‡õØåXOè…’5Ù“EÙ”UÙ•eÙ–uÙ—…Ù˜•Ù™¥ÙšµÙ›ÅÙœÕY•=„Š €Ú Ú¡%Ú¢5Ú£EÚ¤UÚ¥eÚ¦uÚ§…Ú¨•Ú©¥ÚªEÚÃÚ¬ÕÚ­åÚ®õÚ¯Û°Û±%Û²5Û³EÛ´UÛµeÛ¶uÛ·…Û¸•Û¹¥ÛºµÛ»ÅÛ¼ÕÛ½åÛ¾õÛ¿ÜÀÜÁ%ÜÂ5ÜÃEÜÄUÜÅeÜÆ]Û€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_b.gif000066400000000000000000000634771343257752000270330ustar00rootroot00000000000000GIF89a#ë猂„LB<äÂĤFD|Ä‚„t^T$"$Ä¢¤Œjd¬†|dJDd&$´fdĺ´4ôæä<2, „nl´–”Œvt|^TìÒÔÄ–ŒTJLldVT„&$Ô¦”ܲ´D:4´Ž||f\ÄšŒ”ŽŒôÆÄ4&$œzlܺ¼ \F<œ24œ‚„t Œrd¼vt¼–„Ô®¬„f\ÔžŒTB<¬VTdRLüöôtZTL:4¼’„ÌžŒäÊÌlfdD2,ìÚÜŒ”*,Ôª¬¬ŽŒ4.,$¤~tì¾¼¤ŠŒ¼žœ ÄŠŒ,"̪¬”nd´Š|T:4´nl”vl\JDlVLܪœä²¤üÎÌœ~|亼 ¤‚t„ ¼–”„jlTF4ŒìÂĬRT„tbdÌ¢”Œnd¬ŠŒdND,üòô|bdüÒÔÌ’””"$Ôªœ´’„|jlÄžœüÊÌ4*$œ~t  œ><”rl¼~|„j\¬^\lRLT2,L¤–”|vt¬žœÌŽ|üþüÜ®œtjl´’”¼rt´bd”†„| Ìšœ”z|lZ\ä¶´¤‚„̦¤Œrt<.,¤JL´jlľ¼ôêì|b\ôÊ̼z|üúüD6,$,&$T><\NL¼šœäÆÄ¬Š|ìÖÔܶ´ÄžŒÜ¾¼œ64äÎÌìÞÜŒ”., ÄŽŒä¾¼„ Œ„Ì–””&$¤†„LBDt^\<24Ô¦œD:<´Ž„|fdœzt \FD¼–ŒTBDdRTtZ\L:<Ìž”$,"$”vt\JLlVTTFDL><ŒnldNL4*,„jdD64ÿÿþ!ùØ,#ëþ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°a¥+^̸±ãÇ#KžL¹²å˘3kÞ¬ùÁáÏ Co`B‡éÓ¨S«^ͺµë×°cËžM»¶íÛ¸i$º·ïß PÁB¼¸ñãÈ“+_μ¹óâžK—}ºõëØ³[ß ¼»wßµþ‹½úöñæÉ«_Ï ÷ïðãß¾þúôöèŸP qüÏh߀åñ&ßêE žÇ`u<è Íå5háv&¨á†p-xá…\ÀUB¡{ÆUwE\LpAu0ö! )&쀜yhpqbz*²è"ŒÿÉH£é^†&©¤YI •ðÀC%9ì˜"qVü°Ì2éÞ5#È‘Ã7—£•Ða©%—^¦˜d: "’KÖi'WMÊYDîpš'Êq;´¹ qrÀR&ˈ! (b!(¡†"ª¨ž ¾w禜V•'¦÷]Aܤ@Z)¢bqE›W§þ\„â_¤<‡ê¨¬¦ ê“tvêë¯I}º+z}þ))r·Lu“bQ¨©‹ºjk²Œ2;¨³¹ž8ìž½ëí·? »mvH ¥VœxGrŒpMuYnÙ%´êºn»ïª)o¶‘ŽËž¦à,pNâú»ˆyT‘ju;˜@Š,}¨XL\äÀ¯y^Jë¬ÃKL±Åô¬À—lòK‹àx;È"gË*ÏyòÌ4«”rÌÌ èÜËŒPÉEòì3Ð8?ØmÍH'­ÑÍE'§ssšLÁÅ Ô^õÔU7Í­Ò\wÓZ‡-6¦${möÙ ðÃl·íöÛpÇ-÷Üt×m÷Ýxç­÷þÞ|÷í·Þ0‚öà„ôêáˆ'®øâŒ7îøãG.ùä”Wnùå˜àCáœöØ ‡nt礛ý¹è¨§ŽÞÑ¥·^òéªÇ.»se»n»À°Ï®ûîÿ±~ûï¾æÎûðª×üñœ Oüò üóKªý÷ôÔWoýõØg¯ýCïý¦™‡/þøä—oþùãoþýúJ*ÏüûM;ÏþüÞ¹ÿý"ËOÿþ½Ýü´xðÄuªc #ü¯H?8þ¤?þ9ð0þ³¸`Œç(ðW ¸ªþËw !a<ô*þÌê€NcÎ ®Q!,£ƒÛúÁ<ØžŠð†~!!q"4¡~Mçþ:xA Qh¤4ô†#!—¸çL´jÕŠZô¢ ©FđŊӅ&A 6dК ˆ“q®À€62 UÀ€Ѐ9° ‡Xlc›cp®u½«jÓb¿ãÀì9øþz*‘XP%µ©]­nÉÒZ,íg¸ .uŠºÛâz*©Ú¹Õ„ËÜœ׸ЅJo›KÝæp4ºØ]Êt«ËÝ=7»à=Êv»KÞ#…÷¼Roy¹{]ôº×'ê]/uÛûÞú ¹)ÔS-ˆ…Fç¶òu}íK`šDPNœæ/øØ Â0Àp'Œ²¤–°?p•Î~@ bü€HËIÏTùûÂâÈÂE’0…Wl3 ïPBvN¸ ‰-i‚ ü ±q‚8DãÅR1‹‡\’C&ò³SüqBQ¥âX!lM£¤^ÚÅ/†qŒe<£{^Eœ?YfDsMŒ¬£¨:u_Ä™ÀþK±0–úP‘’,%-‰IZn²“ŸŒê:¿<:1û9&N¦>¯…LÀ0Ÿo¶§H³øÌhN ç´çžùÌÀïþùÒ!ácúÕ(É뉽¬,º:Òh2– ŒZ+ò¤ÇQ©›}ª±ôµÕ¼‚µ²M"ëHÝ«©új$L[ãeÜxšÏθp-,Œ U½j[¹êU{ÊÙ•^¶ºEÒl†q¬¯ªú+È%¨@ž%Ô»«£ bT'Á„5,bËXÇÊ´Fw/×ÍðŽŒ÷µê‰­z¬ðZºáOHoK´Š/PÈyoþ•›5Ãä!Çx|Mþñ‹§üå+gùýPþòuÇ\æï£yÍ—}sœ/Oç;‡uÏ‹¶_å±y¶U Ó\ô†ßüèN¸Ñ‰õú8xéMÏ:B”Wõ•YèÛù寀ÚõöœØ»ZO;A¸žŸ ñXÇÓà €Ð •Ar§»Ýó^÷<ªììù1ÚÕ®v%¹Š Åò¥œ_;΋X¨²,À(ecè€ ÄÁ ïF+È‚š¸²©¥ÅâÂó ?‘äÁ¨œCô¡K胉,yÍóq †öâW¿×Ã^ö¾/—ì#Œ)h"Ž@)í3Â>ªJ÷Õá}—™"¦þÕb$Tkþ‰çÃô‘qšó%í‰Ø+x  +À¥,㔃;û·”hÕÚÏI¢UGüuNÎ!¬{k˜¨üç—~_r(Úw•4~­Çåâû×&xÀ„JªÄJ®Kˆ~¸¤KHø§N—â*Öw}—æ!ÇTåDMÞ§+0NŒMº‚0ÿá‚X` F)iÌD8¨1΃ËÁwvw3øét‚/ØDèwMøw3Ð P@Û„ÝôMádGè/¥„’ÒhÆ1iÐ1‚$ègâiÕ1Qªf]ŸåO%P>•\–h½ö`jX‡¥f+VnˆjlXrH‡úñ…†þÄñ‡p˜3d' é‚( ÕP’’,ƒX‡uWˆˆŠxQU}e˜u&xk-µf+2 µRötià‡à_åƒ9ˆĶc(uƒ±˜ÂvªÈŠ®¨-^F¨(H©`kES6…S:E»ØŠŠô‹§èfXplƒ÷‰;—}OÅoZEnÄÁmŒh‡á†XµmÝ6(`I:ðŠVè~ãöVÞÆBd¥Ž‘òá¨TÊAŽæ˜1nVŽ1hAËÀ JWVg•VÅh#pŽö”òXç6ÔsIuòV¡UpÕoOƒŽ…uXµ…‘ÄÌÎ„Ž§7yz %Z‡RW’'y"9þpXYÏ’"9#‘S1Y[4I.Êò U’Y›ÕY’#iO: XÇ‘]vZù"‡_„Ò‰Ä#qØA[öqÈ¡•1ÕÇAq"(•5×$çsÇq– £–D†dIaMBrÔ‘8&— c—mù–)7th¹;@§—ïÅ—}9; ˜è%˜ƒ;…i˜á…˜ïSȶ˜Œ™]¤‘–y™˜i™€à™Ù™žù™ª!™“]œQš¦yš§Ù¨Ùš®ùšá£9›Qñ f`´™›„s fð ¯ ›Ài6œP `¬œÈ™4µ †0œÐy2¥`œ†µØ)0Rþ€ Á f0Ùž¿Ò ®€›!— žê¹))`@0à °žô©$‹ÀÑ f€ õÙŸ ‚´ ± ~àŸ2`Ppà8p  6ð ­P¡ZœC¡màfð¡ ¢e°¡$jmÀ (êf@)Š%ú¢‡ñ¡6£4£f0£5š£‚!£:Ú£Á£>¤z¤BZ¤uA¤Fš¤p¤JÚ¤kÁ¤N¥f¥RZ¥aA¥Vš¥\¥ZÚ¥WÁ¥^¦R¦bZ¦MA¦fš¦H¦jªl‚€>p§r*§0§xš§zJ9mŠoJ€¨‚:¨þ„Z¨†z¨ˆš¨Šº¨ŒÚ¨ƒ*ީР©J©’z©˜š©šº©TÀ=}zoš˜€WCb×Gð©vª 2ª™ò/Ö%UŠFWBbƒ]çªÐA—㢫몪Z¬J68㫦z#ÒpVÇJ;a´ Ô'¹Jªù3.À¬s1¬r¢jη|¶çœy^4yÿ!"$bQkÔFot{%}Nó­!2"%r#À ݦ"läF ã®Zx)öŠ®©rzŸ‡’~h|´ò­‡Q°­—Ç|AòxD"}ïZ®£r¯éê}Äx˜R­ÖØš­)’KÄ‘è&ëçXgP"%T‚%£TþJè&º”htà÷Q2%º–& /-;V±''rËðÕp"aå²ÄA`X¤¥~B‹ùèHº$²R;K3›²8˲bõ² Kz¢±û;vÐAŠÄ±…-¸K_(„î‘M’"·èÔAh]6È'3¥17ð²YD·y{8y@$Ì"·?˜"Q8…;bƒÎ#j‹l˸`ør+SÎb,uK«B¶eÛgk$<2«•Xˆv¸‰îO¥r‡£’º—hO¦v´‚º‹rͰ÷´º£f&¢4k²«º)âˆ0Rø„°¢;‡–Ø*¦kh¸ë»¤bˆË*'œÛ¹kñ¹)Ö*Êþ¸ŠÌøYÀèfz{¹»·•RÁ»0"·Ö»Ÿà … ¾Á[¾À¯ßë½¶è*ÃXŒffk%łƱŒ½h‡ÛK¹{k¹~¢½»½Ò›Ôû!ÜhO‰Þ¸áX.çòˆI ´é±Àú(nSÇ‚æÂ袿Å!5à³_›»Od&€´?ûˆÑñJ‡ŽUU ŒŽ éüÁT»Âö„Á bÀ| l5þfO6™”vØ“ãÊ ƒO•5—eO‰J¼Á;‚0 ÂaU”eY S¯Â`r"] Åÿj&)°AY%踔ó)GŒ“ŸUÅïÚÄ£òÄQìCSüéÄl1Äþ²c¬”– 4;@ìÇdÈŠ™˜ÈÁ–bÈ}ŒÈ,È1Cɮ«¸…—,;‡,Éa¡ÈŒÊ8ÓÉžü ,ʨì/¤\Ê]10°˲<Ë´\˶|˸œËº¼Ë¼Ü˾üËÀÌÂ<ÌÄ\ÌÆ Ì\ɬL®|ÌÎüÌÐÍÒ<ÍÔ\ÍÖ\ÌɼÌfqÊ©ÜÍ|¬ÍeÁÍÞ<ÎF²ÊàŒâLÎêÜ æ|ÎV‘ÎëÏõÑÎîLð,ÏøLô\ÏRqÏùüÏØ±Ïü Í|Í}ÐÐ ½Ð }ËÙ<Ð^QÐ =Ñ]Ñ}Ñ ýÐÍþ Ðý½ÑLÑÑ]ÒÊÒ"­þŠlÉÅQt Ö_4.biÒ*ƒÒ)+ÝBÊ!u/A•4]ÓÊ|ÓïŒB,ÝŽ-TbþrvA-26MÔE‘ÓõñvrÔâ!xMm0O ÕC­¯÷û|TÔ&ßZzÄ!}y”e‚±Çq®øŠÈ3åxC"zjm±¸7}YíÔCÍÕýÌ#7»²a0R³ò'g'›U¶”gŠ”|J©´J­ôJA;KðÇØaË’!¸×Û²Õ~ ^M·Ÿå…0bƒ‹ö¶ŽfNeü'Ux…XNâä¶;xNk&†œýÍŸmÏ<һ蘉踇šxjp˜‡¤ÛØÈái ‰Q­bÜ02«Óþf•¹±}½ÛNÚìÛkÔRk’"Ša lâ;lj‹ÜÇÑÚÆxS9µSv8‹¦*Õ]À×Ý#Í#9ì·Xmg&mèøm7¬InUnþëdOåä,åSUnåÞŒåYþ[Îå©ìå_ÞRm$.MÄá_XãbÎÉ.^æ mÔQ7XâÓXpuo¾;þd.ç*qæOb`§æ.ÔAL½çpîçGè…\TýÒÆvDˆ;}®è'1áðÚ³H}ë¯Q¦‡T®¬—Ö{„"•G}“ž:•né%áÕÝd2|^«´v˜qf²t¦ØÝ§g›ê¨³ê¬>Ú-¿Á Þè]ëÆqÚw[µ )¸íë ìÁ^íÛŸ•‰ÊmÂY”cÃý†©v¼>ÄjЮêq>í81ì|,ÝMRØ¿éîkö$Þ¦Œî )ð=î¡#íæî^}ßêÂTÚ–}A_ìß¼ŽžŽïÑ^îûîäTüéün‹÷]ßû$­Ë®ƒiÌþb ¹4èCÍÎÝÍ4¹X°þæ"6Øì¯íM±Næ¯3l›Ú*¸ý–ßýaHà@‚ D˜PáB† >„QâDŠ-^ĘQãFŽ= ËH,À®q1rd$,-[ŽIR&I“(Ub‰92D¥<.aÊdé2¦¬ 4O¦\)4æÒ™MsâL*‹YXØà¹ƒE–œ’Go>ÝÙó%T’A}Ž4VµéZ¶mݾ…Wî\ºuíb¡àã^¾}ýþXð`Â… ‡lzÏ„‘ÌF8«˜1Ù‘'Òx8ä)IÇMu¤þ™)¹ñã™›Û>Ùyf%* °€BQI¦hÊX,cÖü“3é™iÄÜ\øpâÅeæ5œ\ùræÍ?‡Ý b’bv(î5RS¥‡vüÆÂ%†[ëØGŠ'9Å•:b¢×ÎÝ;øת_Ç“Ëöîßu£†Œ¤˜ø›o¤¦˜ ¦¸`¤òò;o¼‘ÔcϽI"п‘<ÙÃ8?1D»“®DOD1EW䈺‘ö`†”&ºé>!… ´#æ©™`”‘Æýz fe†‰ÄÂFuI.Œy1Æk¼1ÇÉÊi¬J“)&'µ ÐÀ æ¨2Hc2I%ßÄþòÉ-áâ ÷ä³ÏId1PA%´PC?rÑOø¸J„TÔ¸ˆ´RK/ ÐC7å´SO?51QLG%µTSOEµ)MAeµUW_…U"QíRj¬ToÅ5W]]5V_6ØBgݵXcE6Ò^…e¶YgŸŒØd§¥¶ZkßZZm·å¶[‡¤½6\qÇÕ5[oÏE7ÝfÁ%·]wßõÓ\u祷^NÙ…7_}÷Q/{ÿ8à@ñ5öOêŠÉ#Dš”_‡õ•W`‰'¦0‚w•’JºbºcËò|8äv#®¸d“O¦èâµ|Œ‹åݪ֑ˆÑs¤:9çkIF¹gŸþHå—çrÌ·txAæÚÒFg§©åh©§–8Ñ+ªàb‚ ÄÌA–Ñ µŠ&)ÉTÂd˃)8~$áG"uãej>Íá9víS-ÿR»¿ÿ7Ý]ïRÃEf1œ»MfþLƒÕÈä3¡9  ø™øF¼ÿþ·AªHqŒsäúø°åAú)!…Úó íG>Š™ƒð£Ÿ gÂ`ye»öЇƒ²Z1òÀ…ˆ)KPñ€t¥$éHIZ’í¥)µ‰‰cB¢iðT3v1DüaÅ­¢í@-ÅbqæE6þ‰‡c„c•#ª5,c•XCõ¸G¶€QŽdED¥‰)pa¨{K­ÒÇGFæË„d$"´FV2‡”d&5iJZÒ“ÛÃä&E ÈN~Ò”‚ å(U9ÆRžÒ•"Kå*eÙÃV&’ZCØHÆ0J½rv±œe0ýþWK·,²€¤ÊX.±Ð±‘|Œ‹¾t0…9ÍÜó4×$ÕSb¸±™qñfÐDå©9Î8Z“-Ä3æžž‚4¥=…ià|š4É9O % „‰Ü¼Ö7,¬­mo«Ö´V4±-¥² Å'#ÂÒ'ÝFr…5L`k¨€Ä&‹»•íl5â[ÝDò·ÀÁSgò¤gJOfÏk,ƒu“sç@':,ä *¢ÝìAzw± ݘX¡º×%žvÝ­µ·Ýã-ïy/¤ÞÍD½3doð ß±cªìgGqN,÷/n½oƶRÌ/‚Ì`ËÂtJ›P¸‚g ãþ7‹–Ãpá òÄ·¾#\q£DÜKÕgõ®Ç=F`_{+>÷#‡½"yocßÿþß»~“‹oüj#?ùE^>óWíüç÷8úÒ¿4õ«_ãëc?ÐÚßþŠ»ïý8ƒßRv..Ѭf6~üä³ù+Ufô{Ï^¦Ç@Vû÷Ã_Ëò”§»m²e¢™HÃÕë?ÿ“2T4ÅéP,Æ*(žº,ª° ¬Ð D’‰š@ Ðj¬šÃ,É¢D\„¹[”9šË«§è¬ù©ÅŸ»‚»tÀ. 1áh¿dÜÜt½ ¿­RF¡¬/¾YÊ¢t¤ DJÄ#J§§£ŒÊåšJªô%«¼JÔÊJ­t%®ìÊÃúJ°4%±K¯*K©?\Q?üc?Ú›4´LË”ZË¡?]¹?¹àý{¦6£Ëºœ§»ôœ?™8´D[4…,@4;@›HÀ„JÁô7Â4à @Nó4Pµ D³R“¶À¤LjÚÀ 6AþôÀl캻BÁfB~€A[#¨œM„²A_ËÁÓ¤(‹êA\<6’H¶e# ¼ Âô›" ÍÉÍé[Â;Ã)Œu³B,ÔB.ôµÃtsÂé,CpÛÆž"*s*t£Âu#ÈN\‹x-:\ït<$EÉ|NæóC,x¸KŒ+Ž+D,8ÄD\ĵEýDþ¬lœ­•©-KŒDÕÄo¤:öœ‰Š»8éÑ8GE|ËCû¼Ïß+9UœAËj,W¼Š¬Ø ¶ Å›0Æc’¹ñ¼¼“‹‰_¤P’À9Ë-ž[Qu¯ ë3ÑüPYjFt|FoŒÆ×p϶8Ç¡a:§ÛÅMº™˜þ:× G«³9*Ð:®ƒ ¯#Ò¥QÇuÎ 4wÌGîHyTi‹õjH É«}„»ìj¡— È|´»8Ä;„Ü»ýè;™XHiSâÂS1Å=ŠDI^¼È3I“5i šLÔŒ¼œ‰’„ºKTÍ[IÎ{° =—=™„Ô)*®Ô›Ë05ÔøkËëÉàøI/ÒTÝ$Ë4KFŠUYÍ$¥¤1¦ÜÕZ—[ÅÕH¢U_Õ#` Ö@Vbe#c=Ö?JVeí"fmÖrZUhõ1iVVªVk%>TÍÖ {Ö>yK¾Ô¥…!—Wå>oýÖ£¾m ‘½l™‘гxÍ>32l]Wj¥Eþr×à04DS4Fs4rłǷBCL€]LÈT>uÍWÛW[Ú4’è´O µ‘µÏ”ØQyŠŠåL’x§{u؇í°DANôÀá ܬÁ^ÃAgã§ß$6< dS6»9΄Y‘úÔsbYÝtÙ_‹Íº‘ÙàÔ¨š%Λí'#¼Ö‘%Ù¤|ŠîLÏwcR˜PCólCùTÏ» F¶pϨš·:¬·êtB¬«Zò,76DO²u;¯®mOjÄD‘}Z蔉ÝÏåm8ÝÐ)•8Ê¢8‹ƒ õ«P$+›;[þDPÄ+NäE—±Ð¬ªÏn­[UK”µÅU,¦‰;&ܦ¸Ñþó¬b¼EÅ5“dE_̬½¹œ“ µ>§½ÜÔš•%]݃¥Ónl À-Ü‘GÁÒ­#‰r¬‘áêR~õ\w“:ÈÇ+ÍÒ úÒÚ½]KK6U»òÇ9åF<·•׃Իðh!MèÓôjLíÈÞÝÓÞ_ ß<-ßBß" BµÞëÓ§Õü²Tʰï5½SI–´+—ôÔZ Õ ³’ ‹TËñ’¦°Tø-à”ܼ–ìTÐcà~ºÉ¦åßþÍŸVŽG te1| áÄâÖˆ\á03§¦lahRáFœpaP²]¦'ÎaÚ©a¦þáÁ b!–".âxÚa$&þÍ~]b£lb'&ØS³ÕWzË(™)¦âY‚½yå)x­3yõK.þU/þâUª¥E2XžXz5XICãQã5¥6Ö[žÊXüÍ:¶c<×§¸äš`SYñ‰Z3d㉓ÝÙå Àä@dv}ŠÅiœÇ¹Ãý¶3”·‘Z¶ÅJ¶–#¾dFr\³]]QÃݸ¥OS®TNe°zŠåQª]]^Ö ]ŸÍÅÍÙEF[6\Îe  IŒRžZ+XÆØ®3Gå wª^d.e^f€ù MŽ_Âß—ÓpûSjßALmÞnîf{ ¢!*¢ †Ií¯‘þ”0+‚`RÕ¢fçv¾ãw&¥2:f!á»@áž6†Ú™¨£;Ê#…–b†nh™ $C’ÅÓèU‰¾¤€¦h8RbŽNãf®épqg’>“>éSöh•þ!–ni¨yi˜¦%(ž,.ã43ׄ¶Ö”¶ém‘iœ¶ 2–X=³×%ê ¶/¢æ§¦³FkLü›ãužá¥fjg!b¨Æ?ŒõL?®@.Æê¬f–ÒÚäµÚ¢ý.ð€‚skåÄ5ËkYµîÍgckš ŽÊYØ”k"œd¦ýá±&ë`a)&$e´]ÃsÛÚ8¬Ú;€<šZ{·òT[7œ_¸ åÔÛN®ÍaþÂ.ì_ÉÏýäÛ¹Þ…Å:¾~8ÊÞÛ…{ЇÞÑ%‰OÌÐVæÐʽêšíï Ñ^†RÑý*˜IS -ض`bV¹×µí=]MÝckßþmþÜgÎí.0,0ã%.å&`íÞDpŒ^ÎAÞ&±f£Áæê¾nr"S‡„f²˜_ýœ¹U»îÜí<ù…Â$ß„”êû`Hµ{HøŽï'®ïšôo–;`.R€Æ`Ë«oÌC"MEàÛ`˜$½¦ç~þËжî?™>•ƒ¶ Ÿ†VÑFqVQñ™FñO±L¦ñi±ñß1®Þqýéq r&r!5þò#âOrŸ™q&÷3'r”‰r)§4*¯r“ñá%_”3ƒKsm3¿‹!ßrAér‚£îÜüëê‡ñr·Hj1ó3g‘ˆ=̃@?j‚}ã¡Ùó>‰sB[3«Ž:·sjËAÏîÝ t¯n§=Ž@A/ Y7Jô\} H>ëDîëäÔÁÜt¨Úlä¹þºæÍHÞAà,¶úÁOGÙÓìÛÌ5ÔLëT?ëUŸYáDÚ¦Èk[wASçTÙ\ÿõ£µJDÏôI”Q¾*_– h¿·'ü)2¬)3ìÇŽÚËÖÚäÚæ}ϰϩUÝ ·ZËfìoÏlqg‹ÌOÞM÷´þ]÷©m÷þ¦Ü#kvaÆÜöÛÄ} ¼=ЕfyDÙî[Ú†\Í®R¾:Ü¿ipÆm@¬m†gÄ…Pò>x·ªø½xwmâ`ö}ß²§ÐÜm‹”Ÿn%EwæžQçføaì9Ôå\æÅw^Œ9šw÷µ]ÛÚÝåîù‰Fw§Ý'Ór“ÿ—ÜmïúVÒ§ð‚çx(}^ô¶Rõ¦æäåÒkÖÛå¾ú mxß:÷»]x¨y«÷ÆÚNïw;:_z¦¯—ì½Çíç™`ß2å©rŽ;ïH²¨»ß¼#ðsþoAýû÷-ïÀ_Oú%pª½wWVü¿çÆpÂßÓ÷2tá(yþ¹wŽDù_$ à¦}ä)‘”<’`ʧgçTÏóÔwäg þ‹^}(e<××`ؽ ž ÞO|ÜÇðßýïý—´TS…{Ï—£+ϯ 6ê2ïç§V,‡§Î×þ9rW¿Ì®>ñ7­¸ÿþ•ftî?ÿô#ègsÿ0‚ÿø';ôŸ¡^û/1üÏÿ¦,,hð „ 2lèð!Ĉ'R¬hñ"F‰Têèñ#È"G’,iò$Ê”*W²léò%̘2gÒ¬ió&Μ+ÈèaÏŸBð1¨)#A‡2mêÔé7ê¬jõ*Ö¬Z·ríþêõ+XžO}.]Xv¬C9\ŒxÅóhç2”K7a .W Rë÷/àÀ‚.l¤X‰v.ÆÒmÙ#•Hõ ƒFà‹kŠÛ›ðñØÈ“+_f|× hÊ–þØÃ—ãáØ²gÓ®mûöÍÄmï6ý´¬„#rÐ3ŠENj͎͞.\8qãM}›|xñi¤½Æíý;øðâÇ[Õ¥KR²<”CVžr¨Ÿ½zöXÜ×/@²bÂíUÁÅ,VŸ}Ë9 )Ÿ,†ÆÐÞ{ñ͇ÅkL0Áž•Õƒrù¢‚@²Œ0~ëaØß†$2ÔŒ( „þZø¢†uøaˆÿ$cƒ¨Ð Š!46ÔNX¡ î—¡z¨¤i"ŠsBwä™y&šiªI›y½PqÅa¤I%#x 5]&ä&œrbA§xþwÍräp‡@9TÂC*•ô6äžz1„Êq@5sÖygžXXQI*Z¡§¡P‰@°lˆŸqjh§P2çe¤“V:i¦n*¨§ ŠJª¬ªÐ§¡V2ªc–ú¤ŽIzé­—æ (§û«ƒ].6¬@rÀRæšáŠ;.¹å¾dž,3¤BÐ'la†,¤”+¼ÿ-Óí·XœP ;üñËß’ybìàz/šÆpÈícÁ…•b?üéþÃ$À8*!tØè´¿þYËWÇrKä0‚kås’E1£ ùÓÕ6‚xðvÍ’ +h,dÝ!ƒì`5BÔäZôÞAZˆ5ÜÁ‚½š!5ÈA´P‡!ˆ'\S¤Í¯ŠV¼"ü̳f¢ ]hÏ >A 6ÀåOÄhÌ»øÅý„qŒeÄݪ.((!š8#ø¼wˆ6’ÑG ø<³¨§A¹#”®6µ¸þ+^£û² ª ˆÌ#îöÉ2^á$Ë) CÎ ô)Ñ|(iNRD³¤)‡Ø,MºÑ­ e!KEbÁzqƒ)Ìa†«tÍ9&2ðŒTbȤH3Ÿ)ͨLÅsļ&6³ycJ³›Þü&8Ãù*j³œæó©ÏšpSžþü'@:—{î³ =(Iú)Ð…2´¡UA*щêS¡½èEh€Ñþ$¢ý(H¯É*´¤&=)JSªÒ•²´¥.})Lc*Ó™žô  )NsªÓò´§-]ƒ5C*Ô¡b‘þ'ô<*R“ªÔ¥2µ©N}*T£zT` R½*V³ªÕ­rõjDý*XÃúQ=˜áb=+ZÓªÖ¯FÀ ®ÐÃZã*×¹ÒõšLÂÌЊºòµ¯~ý+¹X°ˆN €=,b«XÜ )0„^±ØÉR¶²–µ ÆÐU˜—ý,hC+ZCÄA 'F«ÚÕ²–®=0C)<¢ˆ8´¶¶¶½mH‹¼6¶¸ý-pƒ«MÔ‚¦.r“«ÜÑqö áƒ+:±ÜéR·ºkŠlHûXër·»Þ am„ñ’7fpÀwÓ«Þõz%Žx¯#jQ KÀwì½/~ó›3˜Áþúý/€ÜþúWÀ>0‚ Aà3¸Á÷]°ƒ#,áêBx¾ðo+Œá sX´î0ˆC¬Ø‹¸Ä&¦+‰O¬â‡5Å,~1Œ'êâÓ¸Æèœ±s¬caâxÇ>þñûz ä!YiB.2k %3¹ÉN~2”£,å)S¹ÊV¾2–³¬å-s¹Ë^þ2˜Ã,æ1“ùÉhÄʬæ5³¹Ín~3œã,ç9{9Ñ€,¢¡ç=ó¹Ï~þ3 -èAºÐ†>4¢­èE3ºÑŽ~4¤#-éISºÒ–¾4¦3­éMsºÓž¦4qçh¼¡Ô¦>5ªS­êU³ºÕ®~5¬c-ëYÓºÖ¶þ¾5®s­ë]óº×®­íëa»ØÆ>6²“­ìe3[Ù¡u³£-íiS»ÚÖ¾v±…-km›šÛØþ6¸Ã-îq“;ÙÏÆ‰H]îu³»Ýî7~‘…S{Ö%êÅ3¶Pêzÿš×÷Îw©e bCC0u Üð XpA£Øwªùýî‰S¼âÇõ¹o’î‹s¼ãÿø¾Ÿñz×ZØYØÂ.xñYK<Ø¥>yÊßð^Pb³°@/>Pê_ ãv@‚Tþ†z·äF?:Ò§q›l<éN:Ô 2 @Ý.µ Ñ‹^@Âû~„0`Q «ýÔ%€Åʳ¾õ®¿<Âàþ%V> Y8£ìC»ØÉnhpæÂæöÙßð :œ:Ï(5,J j¢G½ñŽ|ÉEnuC¾ò–·<°•PyÛ=ר®Œ}%ƒÐM>‹3¤¾Ôž½èKMk|€ É€x"z‘ˆ• ô§z0¤ú_üýå«WyÎOýY”ZÑHÀ&PÍøËS¿úP_zMšnýísŸãÂÞ…Vþ ²ËàûžE©7ö¡—ˆ döønþ7ÄŸÞÅ$®>tô¿Aý¥®¿ ü]ûYDŸ©m‚°•@0€,|Â.(û±S÷M ¾öÑ„öU nൠ›TCØ, ÿþÙï™xÞÊ`ú­ ÒÛ'„Ÿþq›°Á‚×õ_ñ•Z ^Ã$Ÿ©-ªe ˆ‚4¬Éq &a´]àLd >!öš¶É@3”ü‘ßüÑ ¾AàÙÎ_ýuÛ|BÜ þ`–Zà ^á^ª‘1l¡F!Öa°IžÆQžî!²·9ƒ(Ûë…Þè™ ÝiC%¬Ü ÆÞÌ*ØÄmP€2¢ðmña".âÌY€ÍáœÎ½/¨d*p@âö¡+ö!Ê„¾"-Ö!·eÁ&öŸÖqja@â°mÂ.B‚fA0ÈXÀÊÍBþ3€Á!á& Cß)ìƒc© 2Ü/\©Â1p,04Á]-®#ÆbLÌ";Æ£<®Û0Ã<Þ#>Æš;Â<æ£?þã±%Ã,DÂ5ì@¤?îãKô#B6¤CΚ3ÈB/ ƒ>¤Eº¢BºC^$Gv¤G~äfdKüÂ'$ƒIž$J¦¤J®$K¶¤K¾$LƤLÎ$MÖ¤MÞ$Næ¤Nî$Oö¤Oþ$P¥P%Q¥Q%R&¥R%@NCWE¥TN%UV¥U^%Vf¥Vn%Wv¥W~%X†¥XŽ%Y:"@H¦¥Z®%[rŸH²ÄF¶¥\Î%]Ö庽þåJÄ¥]î%_ö¥_^ª„^þ%a¦aæ¾á!Óé!b6¦c>f]fJ &dV¦e^&>J&JäRv¦g~&h†¦hŽ&i–¦iž&j¦¦j®fO6åS–%lƦlÎ&mÖ¦mÞ&næ¦nî&ofÕYNf§p§^^^Ña'v.Þa~'³‰çª‘çv_ËIƒ%FœbfcÚ[«™'ª•€R')®É§v¶bÅñÛvbxFcyÚš~¦e¾š~(ö+r'«É@/Td·µ'¾§ÖZ.èBÉ•1Ü`ã)(þZà­ý'Èyg|"¨>ž§¹§¸hšè‡¶š4${¢e¶ÕZ4ä†6èÓ莶ےèÇÁè€2(ŠêŸ³±h¸¹hˆéõµZ ¸!½QhZ(ƒÞĕȬ1Ã(¾Á(T,ƒ¼0P—–§È°}@4p1:Ú]˜Ži™¾AœišB ªõ)šª)ô¾A¡’ þé×…–¶éª©×Ý –:*Ù©ÚÞõ%ä`ž’iÛ½]J*ÛÝ¥6jÞ™é B 2‚ê/žèdªß­Ü¢ª)Öñ]¬¢Éù)­â*ª2*«Í*vj™¶©œÒ©î%ôþ@¥š¡°šª–.ƒ¬Ü³þªÛÁ]¯î*¼éÕ„£˜zêªAC ˜Z @ÃÝqQ3ÔA ,\´@².+¥¾+³²Zµë¾q«¡šZ¢ÚëÐq+«Áê¦b]1Rê# «º²+ÙkÞéßeé¥.ž¼Þ ¨Þ`µVê©Fª­¬Ý­*¶B*Ä*ë¼ö+œ¾êÀŠ+¹B/Ðh©m,ê©qlnëÈò+À [µÊÜüM©Úgï™ê]¢¬½àÈØÁ C©QÂ5Dâ3¤€ú¡.èÛ€Â(lB @ÒÚÑmÖ*-Ó:­ªy-4í@Ã4˜ܞؒíÐùÞÏò(ª5b!öþìï±|^èåàÖ­ìÑž$¾Ü’žÏ¦žÛ ÝÚ:íìÕÞíÁíÞ-ìåàá–šãæí [äòê\îª]îÞf-·Q­Õbí¾áí5@£€ [ç nÝéÊ¥.«%îß^.Díº.¦–âݼ€4|@ P1è‚éQ@ê‘®é€ñ²šëÊ.íš-ÚªíÒŽ­ÓήԮÚärë‘îÜöîïïð è^­çªîÛ–gò®ö–šëÒmù¦Úõæ ì.®wž/õf/ìƒà®î~A3p2œ­ªÅï¾ÑnæF/Û¾¯ú-ߪáúé,pºÜþµ ÐÆšÐ ƒ3Tï4Ã("0þLpÄE‚ª•óÙc°ë`¯Ú ¿¿ üe3èÛ ·p÷ßúa瞟¯®\ ŸZþò0q Öp 1ãž!ùå qÀm§°E1æZ± op 1’Îç@Ÿn©q17pÄ!³[1€ð¦ñª!3¸3 ÿ• Ëß¾…±ª¥1»ñ Çð g°ï›«ñK± gaãq›Ý—q|†ñ¿ACòûð"{áÃ6qóñÐ%òË1ÛñTƒŽ.Ÿ„ ñ'·±©Yñcòϧ'æÎ¦(æ ©«y©©MÂ8~B ^·>mþyrÞL‚ÔL«Ý331{,ªN}4Ÿ¼A¸!5Sñ‚šÚ 걊N3 æ 3Có-â‘`¡/ns:Kß‘~sºó9såF33·s1¯=—ó0¢2sA>«³ ›?ß3ë6s0ÿ3?·2=2sÛA·Z0¸kûböpFo²ªMôC#³4\s6ãs527túÕ Ac®Ü-sIs³®ô7¯ßDû¢ªÉó ¶²w®4D{óJWt¾A" @0Ë!´°õÂ'¿Z.Lç3È€ìµ3\{ºÁ´Šn-*DC®w{ð{Ç·•¾AÛ|Çò#ð`©ø€c®yëvà²tªÃ/<îÊé÷^Câß68Fþ!‚«›…/î‚w1#F8åÚ݆»žˆc/)‚A  ‚.[‰§øŠ·øÃ·€S^½½8…ð‡mÑÞ÷߉ø/Ì­æ8i§ÚŽ ‘Ïa‡Ï¸oáŽ'9+–(„`"TCôÝõßÜy!ªZ’¿¸·5C›˜7·‰K8úÞo‘£nã÷pƒøÐq¹ýb©%yrÞ‰ÃoôzøÃœ¢ÜJ9•[y©©ìéª-¹!¾8„£9”KƒŽJ•Êâû!y'­@ÏÚ&ø` ,TÃÃñ©34)€Âî=mŠV‚ç`§z¨gÁ¨—ú©j­›º©i|©Ñ:©ë:þæRB¦¿Aª§1®]/ê¶©ÕìÊÅ:¨·22£.*û¥ë°Ûº´/#¦ ۱ϵ³ol®Ÿz¸Ë@%Œé#˜Ü¸ܹ Cº¿Üº»ªÿz¼C{¨»°±º«;ÃßElA—š½9ªáû³{z´Ëûd'#·‹z°Ÿ:·<6|¨»©‰¢[58x¿ƒl¼r<«<Ãk;+òº¯Ã{Ão!Å7{Æc1.»o¿¾¿ú›#¼ôù{µó"ÀK¼ÀŸZ¸›œÂS;ħ<²z¼!&;/Z¼©a|¡ÂI'ü´oa¶ {¸ƒü̵òÐMú;V:µIç®]C¨;ž×+aØK]²½õ™½²¡}®ùþ纩}¸¹}ʽž¤c›z.Öó£Ö3g<νr²=ßÛ§®e€BÓ·hÞ/¤32~ÇÑÅA¾ú}ÔI>€z5½I HZ>±ù=0Cþu›æW›s–t>ê§¾êO\é“Äé¯>ìǾìS[ëÄëÏ>îç¾îû[âkäÞï>ð¿ðo[ï·Äí?ò'¿î×¾Hÿ²qýxûuV>î['‘ÞÚÝ+¿öKºT‡}~©.ó~Rÿì‹¿«ú(„Zýö#?ó‡„ówþ©eèŽv(¸ísnå³›:Òÿ‘æÚŒ®?@¼8`Aƒ&T¸aC‡!F”8‘ B†0fÔ¸þ‘cGŒ¢Q™Áh¹$–|£rdK,+R„é’fM„3m扳 σ>!¶x¦“hQ£G‘&Uº”iS‡=F•š$Á,Á„q¡$Ф^½ ÙyùH¬J2Æ–=+0 f\¨•`‹UëJw2û0pT5X´°u WîJ»x^ͺõMׯaÓšE»’¬d’ï"†©¥^\ ‰5ü¦íÛ¸ ƒ  òÚÄt§†LYídÖµ›.¬¸nf ½ªŽìú ïØÁgß¶L{yiÂsöéû͇h\ˆ#ó’ûèî,È*éü´ÀŸœ¦W¿ž}{÷ïB:ŸcÕ®} “L`þ°k[¶¸&˜—ŽA¥0x!Ð@¢äTÈxfðÓ?ïÞ€e“d!ÂŽ-iðÁ'í·7*ܯ¿ÿp¥LðÅeü©b@q&‹îx4‘ÅkÀèÎA%TÈ?T0Æ„R¼ðÈ•dpÆ%ß’D óSC„žLrJ)jrE$]F)ͤQD"KsKÌe”MJ€$D{äL—-Ö¼R `OÐA -ÔÐC‹’¾E ±O O&Rd@o¥YÚ$ÐK3Ý´™½Þ@B˜G#íQÄq†Ï>HÔïš” Y+} Ó74µµÓ…옄— 7‹i¥Éj­ÕPGþMˆVK¸5W„d•”XfÝ´Ù]ß8öÕ7¢íÚiuÅuÓƒºå\NÅ ÷Ym“-÷DžJV 9‹„UP·}PDùí×ß^OQFçs4à :5]zóßTRx ˜ôh’c¸ø¤‡!ž7!‰FøÙ`fh .žø%‘­å˜ºYNù Æ–d’~™æk^˜ä™HᑅŹãžUVˆ¥I®á"³yoÞÑå§Í³4૱ÎZë­{ºˆ`ú .wÙ”IFƒÜ5I’‚²HDÞ7̆óÍ‚Ä>÷faÚ¢Sž…3»Š»¡±K&·Ts)e¶haŸõpž ÿíÃþ#_<鯥íi!–>‘„Œ,Èà¬;…ýîó„âZõÕYo]`¯¿žÊ`ü tòÇ2-ïΙkd°cˆPñÂ^"ÍEšžéÝmvïýwߤ]Ë.qOZò‚’·C†k ˆøx£Ttá쩾yß“z™ ’Þv2Évý烯ÝûRqz¿ðø…7&(•Œd÷žüö§4yÑÝhÂ7¾òõÈ€‘J\—A nƒXì0Œ†¬N/‚ÖAMn’“­û ëÓ>CQàx-¹†³Æ3ƒœ’“¬ì${¤AWÎ’–µDÔ'A©ƒÙò_ªäå/Lasu¸ÌåGDIÌ–@ 12I3}0hjšÊ´æ5± cs—Ùôæ7ÁNq޳_ÛÌe7É™Nu®“ítçO`wÌ óõ´ç=ñ™Ï š”ôÔç?P”)ü¡?3HJñÑ„¥þ, Q‰N4›BkâМ”‡ }/ˆðÚD˜¤èIQšÒWZôk½ÉæØ“\è"%!†h^*°‚H# *õéOº5–Ì¥?©Nr’š:1Ï,Hê‚U©NUPCe”Áúò—Àf0§yf¨Æ™G0ƒͨC >Ñœ®F6`TÙË*&¬&7Ï1ÌW{Ö±Õ¬hU«n¸‚·rç«ç¡êa›X¤XuQëЇîd¥"1•lÒø@ (@ ]ˆ2’l‰ü§Â-²}š,%súËbV³œõìˆ&Ú&êk\еímq+ÒxÊ“*¢LÕªÂ.oÉí;κÖÂþ„‹8,*Îz Úo ’\ÔÕzÆ­VpñÕ.À5— ûÊíwÁÞ•ì–·åÅ2¶± í]M4šÎb6ÈÄõ èÕØÔ43\Íq7e9£ÚÐZÆßª‰—À>,cÁ–LÒ,ngÛ¯"áÈ8;.q£}Cé0µY…Á§"„?\2ŽtÓ…ªQœb”"¸`¢Ìƒ+ø†ï%dÆ!. ïØ'@/E|*©±ñ§¼·Åµ8©q‘í‡cüùÇ”q©.¨b)Oy ,–(uÈCTrŒ5J"mLH vyK¤”…ÁÅ]q}C–{XÉ.S23’W8f!–ùŒgžäšUþò“R™Ð…®§•¥RÔÕ)Ô”¨Á †½èQXnïõÔëôtO!Z&˜ÆiòKhŽG²(þ¥­$‰J”2p¾o"ˆÁòq¶à#ùæºH†û8ìm± ¢Ø3?mÉ=!‚©I"$QýÓõ³@g‰?Ñ DQ> ‘ @QÔ tB5 A2 sB•`"ϭᆂBAt»³Å(î}qÑ+âiÀC–×£^É> Uâ^CÖKG¶×#@ÏÍ?¥a)eÝZVO_–Wô.zá€Kþ¤ˆA†€ÜÜ ­¸@P 'TâAÏmA]q™ú-g+ug‘o¿²` vAFfa,ÀÍ~>À@ dÄi‚CŸÂ)©Öf‚U­–B…ðç¨Q9\ƒAļëè@é>¾qSGƒ¾ð6FK¢'fµ1;¶ƒüí ¶@J@%ˆñq¹±1L”%(µn…T³”I¿DF°I€"Žfá dÄÍÌãm¤!ÀÙví<Äë–ÔO¼²"Юë$D¾ ¤¦a4üÇwÿñ N7@X‚KAD…PòÆô¸že)oÂ7¸À62)%ÿ$@>a š"æ¹.2"ï4Ä~âþøþämª%>@6D%§»ÞÆzCòyC7c= •&“fhRw À?¼Çܪ£úØBD¡”j÷QaÏPÕ3âë'©& žAG£õ,1x >W' ©)‘~ÃÔo7p÷ È€†K%´ò)SU/7'ñÄ2tØvÜŠ!wX…3õ è–„ÙSýÒ-IFþPÂÈ *Áº~à™kðÀíX×yœ]ÛàÅáå¶¡=Ö{»””!þò$þ›¢½j°i*qJB7Þ÷:Þ™>~À£ÐŸ—ª­O¾÷v‘F™ƒ80c‰ñçþôöâž|ÃjEsyqƒ1¯‚’5øê¬ÒÊ5¨‘ƒeG£±Ã+ZècÐc¾èÊñWm¼é::@¦Îöñér‰A.Þ`Ç'xÞ8cµ2k³0ëµH÷ü ‡¥K«Èß^æ =rðn}?=û8òï "Bbz!0¢AˆÈíú´ºJï’«rŒN1’Ëõ~ï-O[ïz*ÂϱδF†¦XäâÎ52…¡®Q;¿‰ò<Ð{„ê5ÿß0Uøþ§'DµX4=÷ âÔ Þ áeˆWŸí[_S3÷=Ãh½ÑÏækßê î-p®0Y= ¦¡Ä£“1b½þ;p• ŽlùãïWU]°ß€°íƘ¸GнúÙMÁµSwï_]Ÿ½û ’7H yó¦Rœ@øð %.ZD81¢Æ‹ßDÌâ¬)P‰n‚Ô«¤MeT‚%ìQÄŒ&{}@˜¬j£‚I¢P„z±¼ˆ4©Ò¥L›:} 5ªÔ©T«Z½Š5«Ö­\»zý 6¬Ø±dËB$d(­ÚµlÛºM«!šÙ¹të"¤ m«4 vûúý 8°àÁ„ >Œx)´o;†+7±äÉ”+[¾Œ9³æÍœ;G]ü8´Û¸V˜>ÝÑ+êÓ\W›ö ;¶ìÙ´kÛ¾´èþÝqûþ <¸ðáÄ‹ÇÖÍ[4iãÌ›;=ºôßÈ“?^>=»öíÜ»{ÿî´ºõÆØÁ›?>½úõ¹w\ž½üùôëÛ¿öýõÈ„SSõ?^ÿ!”À'&¶~ .È eâéÇV|ø™X6uaY%Ø4à¼!U†dÉ`Tƒ&žˆb]B¨–„€‰ˆaYÂháE¹èRUDÄØã‹HI“DŠBIdV+²hˆ‹Ѩ˜ŒáMxQ4¹ä8SL‚•Z ÏÉe—^&u$‹å`,e3\PSDK%2ø”æšm~2ç’´ô‰b”ôÂ4<¾aJ* :J50iá&þœr.…'B{¾!CŸDÃ1Ç!jŠ±æ‘›ÌÒL-|gžhªÉ&B…¦É =äéÌÜ„P¢‹ÒÉj›¡Ö &¨=2j©§¦Ê«®k•¿‚úÆ}~Imµ)† ᘺlÑ5¨ñÌ.ƒJ `ðÒí·á¾Í#olAL›@£Ø5[lq c/¾Á $ vl̸垻T»ïÆûƼo€2Ê&%@Rp¨[ÉDÒ|PÄèR.èJä-¸â¾Áï½×ü{±ÅÁrÔ\1%%¯ëò“i´qLJ<²Íêžœ²¿ÎntQ °XËtÓøa«ß˜‘XÔ ®HþÑ,&-ýFÕ]ýF"rMÓ £Ñ”¤yVŠP¤”NÛ·;kýÆ&\'%öd›¶E%È2ÔŒ{D÷&ε×aý†Ûl·Œ4B0[÷EŠƒs~øÖ]θãÓÎêìJ;zêêAýÞ˜YXËjGK.{ X“TÉÂø æQvKî;דÃÅ'Ì®”í'’ûîoLr E¯eŽñÎÈ{­“×Í5é-ßjÑðÅÿFö–æàÞc/{ùÁ#Ÿš´ªÏO?w¬7æE ’¾õo쟔k¨¡o(B"®a¥µMKtÉB"9¦€D`ã$A†,i‚óßú,þ@¤0Ð}™EäÞIYÄ ¡út¸Á Å…áöLX:-Õo‡ÿ ЀΟ¼ñçX\s¥¹¦5 ¨C ѧt7¨E/ŠÑõLT9üɨG? Òîl44 ©IOŠRÛŒt?)m©K_ÊNwF¨£û4’wä"È’|©Oj¤vº³¤…I(RŒ ¤"•+ÂUN="J¡¨T­jx„êI¢öǦdéà’l„£íÈ"@²ªYÏʬ"I«ƒY*ú¾âU¿tDJTj™ъת®>%“™Þ°*ey„X¤2ªE(fÙ ½àB›Á:þµÊO€Ô²`…(E ƒQƒuT%/â¶I±íR™ÚT§ uÔó ¶X†E`%ë«Wjvµ_®4ËÙÀN–V ’_^ëÓ½’§¯ÛJ—É4Æ1¬c#«#»¦a $ƒdC³Ò#õ…²G²lf3˜¹²‰…ÁK^ô‚˜Ä(C͹¬gÊšqqæÜ[¾,fÜ­ÙÍNvÂÓw¿-î[¤F5«1®su#ðï§@J ãuY`·@—@>µ-Áºs†Ü²æ9¥ämo(ìBþ–ÞêmÎ$Nœ€',aù^d{¾p×NlHýòwÆ!õïhúú:ÚÕêƒÙÞ¥¡†7$aKåk_ÚÞGBî!þD|ÆcÒnÇ<ݵ zÒã 98óMÏÇÝ{¡Elû<â5¹È;v–oiŒæŒÚ¸- üÿŽ ÇˆŒð ¹«„Bÿ Å{^áo©” ð€mà­¬^b.ÏNñ O˜B¤°Ïoö2BîšæLGtÍ3…#!‘gGªŒe]{„£ÈÈB¦ÍŠ[À¢¨ö†.ÚáÏDŠ£8E€1CI¤R©hÿ}úÕ¼c÷ˆH6þÑ"²þó° yIMKû¡œþd_èMnš$™Ñ¾°ÂlSö•Û–%Nt2M@'%—«ä¥Bâ¡S)ÛTw7«Yîp¶dœÍ”ˆ97Á!!£Ûþ–¦7ß¹ÏΞž}èD©Ê³…óèˆBˆ¾ €"žTºU½R™xѯ¡KfêWùPNXפü©^¯QUH”p¬«½8ZßÌR34Öê½C`­kÜÃB£Ô”uí|'NÛ5óö+§-Ä¥I ];Äuª‹øÒDî»ã9)Sk_D¶Íê¬kÓæJ˾¶W)ÓCtµÙ¡€žQµÒ­¯ð&d+µ¯!­¦ËÁÌÊõ¦l0„Á…2FdþO´•SGŸ¬ÝzµH~b1ë“Ûç~(¼‡¢é‡?½hMëñÔWéÑ£ÖÑø€\ßµ®Ê°+´ãz¤¸f¤ÙPêë¬ðãlû™WÍ;±Šqðº?zß@k|€ Ó U"z6,†~Ô%~s‡_ù·ý÷ÿ‡6ê‡_H!cÕG1y×h}Vbzö8æSƒ•ã?"è,¸‡Ô?ADaIAn³3 “;1C‚/ö5öVqƒ#ƒn2ƒ–ƒ¥3h„nw}­ÓQ\æddZ¦9fãÃ|bF>/Ó>ÞãUT¦Zd\¸eiŸàfLF>PHxþJ†À“a,d¸bYˆgv„wˆm7BµÆÆhþ1i-ˆñ‡–Ö$…–A”^j“bŸ`hŠ˜;³ŸPF(¤B>ñg…ˆ‚Jˆ>øY0‰•¨‰ixhŠ’„ø“}ÚÕ„;Ãj®†jKjÌ&HCÑl”HÏæ=¾–‚3ƒFˆ¯¸]»ù÷- ø.ÐSËH³6H©6‹|x‹ÄÆ2ÆÈB±ʈÏækÑvŠß¸u©DN+ÑŠ!{ÔtJ-#M¶íèL÷¶ŽÞ3o)øn¿´ˆéØKðöÁ \`C1 Í /M§ŽwMàunµ”oæh{ÿ3þúRphNŽyÇU uVAO…aui’/"Žý”ttw’-I™T •x*Rr.i“›–’µ’7É“& “= ”>™“µ“Ai”Gø“G©”H9”µ”OyŠI •SÉwRI•WYtV‰•[ésZÉ•_Is^ –c‰rbI–g™qf‰–k9mjÉ–o‰fn —s \rI—ÃQyy—Þa—{ z¹ƒ~ù})˜…éR„i˜‰iRˆ©˜©fMIRE阓¹˜ÉR”‰™Áe™|•™y˜›9\ž)š'•”3i!©3KW!fg€Oå%9š¦Xš‰MÕ!eu¬I›hþ›à8›–Ñ7bwƒ’›x·†,)Q5YuAò›Q šÿ…s¦yPQ‚ISÑš‡ˆœ†vع¥øœLyhÐÀ½@ Hc|Y |eDy²’zˆ…zž|¾Âž¸GEµõ{¸UŸ§}IQžç™ž—5[KqŸË-˜òzùXY³§ µw º·d½—›~E+ƒó|D1}á)žãYtðHH3€ xÙ5jÞ…0Á}) w¡%:_1€-ÊI¢*ñ¥$Úö'C1ñç¢ (gã'7ôx_~s7j„z¸6HÓƒŸµ‡ˆƒaJ†ƒ‹Ãgþã†!ha–cÙÉgþ2 g-˜?¨‚‹¨¦ö‚Ÿ(ƒ4øT‚·ä¦¥Rú’Ñyc+æ;HÓ†IVƒ¦…YÖ>pø=N5¨jX£Hác=†dJ¡¨`Œ_= ¢¨cX†ÞéRè=Ž*}|Ú¡XŽsBˆ¥v¨þÃhl:W—X™XioÔ¨z¦*BXúˆÀHaŽ˜ˆizT¡¸3JjˆFiJž¤úxm ¬v H3øW2ý§}†Ïfý—HÌkµ‹„eHñ¬8JL±­ºf¿¸ˆÂ¨®ìJ­ÇˆÚ¸šal“´ÐHV×ɬÔ×vŠžH y­:™|ÐÔé¦þ°ÔƒMjžk°LÁž »ø˜9 ÷o;‘Q‘õzËDN ‰6Ù¯ÕǘˆšT1’ ›-[•~Êf’i³;K-/ ÆÊ³A«8ÛiBk´Nã³G«´4|f\dRTœ~|„jlŒt^TìÂĄ̢”lVLŒrd<64¬ŠŒôîì¼vtüÒÔÔ’„”"$\JDÔªœ4*$´’„Äžœ  üÊÌ”vlD6,4„ T><¬^\´jlÜ®œ¼rtÌ’”´’”¼šœÌšœT:<ä¶´¤‚„̦¤”jd<.,ôÊÌ$Ôª¬dRLœ~t,&$äÆÄ|Ć„¬Š|ôæäܶ´ìÖÔÄžŒÜ¾¼œ64üöôäÎ̼~|ìÞÜ”.,Œ´fd ÄŽŒä¾¼œ><üþü„nlŒ”&$¤†„LBDŒnl<24¼–Œ\FDÔ¦œD:<´Ž„ TBD”rl$L:<Ìž”|bddNLœzt„jdtZ\,"$TFDL><|fdt^\lVT4*,”vtD64ÿÿþ!ùÑ,“Cþ] H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóNÝ  ¯ß¿€ L¸°áÈ+^̸±ãÇ7èL™§,82kÞ̹³çÏ C‹Mº´éÓ¨S«^}‹€Ê°cÏ€ãŠíÛ¸sëÞÍ»·ïßÀoNœøðâÈ“+_ŽÇkÙУ§¤Í¼ºuåÇ‘g_¾ýº÷ïàþKO>$uðèÑwO =…ml¯>?½ýåâËëßñüýÿØxÅq:à Œ| ¨`qùñçàƒ ù·à‚ìÀw‚à€¸·Å\P°Ãq$"±Ê% ä [vmp±áv‚("‰ò™ˆ¢ŠæxEƒöèã@êøè $L¼Ø¡mnÈ Œ0 Ð8 4"àÁD+ÞÖ¢’Â1é$”R@¥•X ¹ ?¦é`f²‡c5p¹á*Ø–C˜Â؆G*Y^! dÈÉátÚ‰§ž|¶) šj6J›Š~À¶mq‰ Ç]Bé[„¹dníÀ… ñ £mšVêi—‘þǨ£þ°Êi«Öðfœƒ^‚‡mÂWèwbÚ'¨¨îꧯu»ê†´¦÷j¬ÐN6k³Ü5`dnl˜xˆÍqM>¥°‚²ºm·ßz)RÞsÑÆKÙ´îjg!wlz\ \² âÂL°›”ÄÛï¿\0¹õz÷¬¼ËEoÄÁÕG\«˜É1ÆgÂ[ñÈs] ²oû&„0"@"DŽ+·üòÉNLòÍi™Lón)÷\h`ì‚?=ôÎΊŒóÒjéŒôÓP+j3ÓTƒÇ Bd­õÖ\wíõ×`‡-öØd—möÙh§­öÚgÏGÕp›µJ¨t×m÷Ýxç­÷þÞ|÷í÷߀.øà„¾J܈‹åtÔŒ7^³Ò‰GžÕâŽWn¹uSK®ùS”_îùçÀe¾ùèJuúé¨Û&:é¬ezê°_¾zë´õzì¸3>{í¼ït5ÛÀ/üðÄoüñB¸ÝûòFÍ]øóÐG/ýôÔWo}{‡3¯}P·çîýλo/¾KÝo~Äá¯þtµýÖójü‘Üq›Ì0œ jœoyúë÷O’Éﳸp‹ùÙ&C°¸°)ýérþ‹ K$ª÷”*€ºÉ xÁ à¨7Ûy4Ä‹ÊÀlÿ$ÈÂPÐ6:P»Šƒ.áI@àP†¼!AþÛY€ Sµ¶ðˆy¡m¶dªO}(D#² ’t7‚Y¢›mV!‚Û„A þ*€m Á„UðáÆŽ¯p \ñiFD¢#¢Ä+0aƒ ˜lC.ÞFÀ"S14[øa "ƒm€ p@ÄÔžÞXDÎñ’.l߆þ¨&²êWÁP9…G<êê6«€Á'p#‰Ú±cžD%áhILÚ2‰šP{FuAA¢jS² üh@úr†«Ø¡mv .ÌÀ¶IEÝu XÎ’fq¼¥6 RÇOòX[LV(•AE&]ñ ßìq°€Ü¢¼Â/ˆÉª vòš'þËæ6·ÙMsqË[àúÒ¸ØhCð€ÿL׸¬+ˆð6dÈÁ;m±HHX 9è$ÿ€B|æ³–û éBú¹!~ù `•Á²“ƒŒ` ÐÃmLʰEòâ8t¥/~q )„aŒ0Ä%ÆÀXÞ‚ý¨H— ‘òåæcßQƒ ¼ƒ¿¤*•©Xi.™3—Yõ«ÄÑgV‘èÔ+Mh`M«oÄ:Ö–U­pý [Û*Á·Æõ®º™+]ýgW¼úuG ÝkHûú×»êU°ê#laázXÄŠO±P‹q‡AûT5¯uì-!‹Åzåt²±«lz8JÕeV³˜¼h3¶ ‡‚Ö€mZþÏ©"uBÌ¢6«ªµÏj•ãC‡ 0( ƒ{ ¸Â%. ‚;ÜâÎÐLB´ím™*¡'ÎhŒe<ã®Öȳ(E¶ùbuÙÛÜ\àE.h#ð^¡nX/€€]3¢q‹Ä„¯|é;(ñ®BŒ¼)¢Ô$hè¼é]¯|~6ëFñ þðnL`SÖÐqv ÔGíVœ¬Þ 2˜S2zp„oÓFéNW¤Òã@éHHv¶ObªÒ•lcHD*r†>Ýî ùŒiÇW`B#903?2’W äm”ìÈ™§Ç‰ìM!ŒA`ch(ÈC.ò”òt_ùY0þ—1ìå-wYÃW¨x$\á¼ÈÅ`p‡+€™ÈF&³™yŒæ_a’¹iì‹k'!P§•K„eÏHDfD§r•¬Ò ° ŸJ'j´ ¤_Y¬Û€:a—þ r›kÜ+lZ>ÄtôU©jæ*wÕÊ laÛ !Pjà‚qPŒÜ¼z@±§¯hD÷ð´‹vk.SEÊhNó¹8þ3 ͆|Õ1©}i®1™·!÷†¶ýLúàæÛá.ï€4ôKU-³™ívß°´Šlé©cc¨–V±+x‹{Þ鿆ñÝm6Zó6ŠŽ6ë­lÛÌsßÝávÞÏíÔ`(þJi›Sãæâ‰ñLžé÷Â39ùȱ(ëÛpÜ;øÄ vpHøÁW°Ä a›˜‹5ãËm³€VVâûŒ±@ÃÈ‹fT˜ Íøl#:Q¬ß†C@$H~5,¹ÉÅh'][ö³oˆë• èwv±ãqÐW€»Ü±m?ý"eÇ ®P,ðü uÁرˆw½ß†£.†º-««Ò‡½7¨C-*n ÚÙî´§?5+çãü ¤’ìðÅøK\¡UO}¯TÏßã|Þ§¶y@™~S‰ÒŸ‹[¨¼íyŠû+èž9dž$’´ ħ )éM<ßaýy‘þšhhK¾³‚jH„>=â×ùO–þÜ\¶ûßßìV»:³ÅZ‡þÃr"ÿÈé¬Gƒ2vc‹4hÅ8È[Þ×µUø€kµ€ ¨=œøÄ7è@-`Ï–r$ à$X‚&x‚(˜‚*¸‚,Ø‚.ø‚0¨‚ð1Xƒ6xƒ8˜ƒ(‚¼#ׄBH8P@€0„H˜„zÓƒ>Ø„6¡ lðN8…Ìó°À@…ZØ:EÀQ°…b¸9p `€ ¦0†j˜8F@®0là k8‡Lsl€  ¤@‡|H2s`a€Ø‡„/°þ1 lÐ…ØˆŽ‚ lp †àˆ–ø#„†A ip‰žè `p šP] ŸxŠäqlP ¨€Š°NÀ´X‹µh†±˜‹”qŠÐ‹¡@‹½Ø‹r ‹ÄH+@‹Å˜Œ•qŒl ŒÎ˜ÌøŒÒXÑ8ÖÕxÚ¸Ù¸ÞhÝøâá8ŽæÈåxŽêx鸎î(íøŽòØñ8öˆõxú8ù¸þèýø%ÁQy™ ¹ Ù™ ™ðY‘y‘™‘¹’Á—Á ’"9’$Y’&y’(™’*¹’,Ù’.ù’0þ“2ÙL¨è8ùU»•“üFZsô)i¸!HµÃ¶ˆ¦¢èY¶ê‰¶‘ÖÃ?<Åçó¡ÔLy»¡¸A uC Ǥ¢ ºEÊtìÖmævp{ûpT¼Æ°Ä—£Ã‚ÄÄdÄZOÕ¢ªC¸.g¸:ŠEMÇÆþ€ÜÆý $¹Ô•ÛIVz 0B¸!í东¤~$¹L*w[j¹ÕQ¼É;ÈAyØT®§yœg gÅtL^ñ+–¡K|£‹y¥‹0GUZœ|ËQs¨í×&­kÛ‹ËÀŒ4>ªÁ\Ì°é£ hÌÊŒ˜Î»ÌÎÜ£žì áûÌÔ|Ñ<ÍÕœÍDÔÌÚÜÍje©“*$‚ Ö[¿«½ëÍÁ ÎŽ3ξ1¾õû±Wp¾ê¼Î×ü¿áœqŸRîÜôËZökBš\Ï·ÌÎ÷![×ÑÏ›J³k³ ÌZ)6·6" °3€"%Ú™rcÇšìõ]8"ÑP$%$|´pþb›)´áE´vÒiD^íF½Éªd:ð 0·P%jÀ c¢Î Er$T„Ð~BhS¶Ó:-%.hU›f8¬Ã”‹µR\Ó6}ϸña†òÅ•ž&2Š7í©Ä‰Öʲ!C k¨t¶è44O<ŸiKÄ3´µ\ÍÆV¬p_¼Ï¦"¡mJvW,%gl¡UYÆb|ŒÅhŒE|»×ü¡lJéDv/rÖ}B£dwÙRr¸+ºÇyìNK'Ú‚òÇ” È,ü¤;Pè¢Ù¦ò¤QŠmÇ‘x‹‡£nàÚR}ÈX4¹”Üu”ku…E™»Úk,Áw00FS(…£/r/ùþ2ØÓ÷{8ú!ÌmÒ²\TÛ!º°§S°,Ê|jº¶ŒÜ*ÌÍÇ8½\¿lÞçíÕ’Ïî=ß ‚Þ Cßø}U›ßü½ÍðÝß^ÅÿàŽ;ö]àÞ*žà .$ ^/ Íå ÐçlÀƒº£íÝàª;àÞáºÏ-Ïžô¬á„ª¼áŒÔüܧ‘ËÈ{¿#.).ù‹âªâyßÈWãrÅÐä;iìáã¿áÀ8žãžÒªù^Ùu´+¶F[ @B / ÓÔ Ò¥é^$}]ƒ‚å¢Ò._C;^LnÁÂ]+âÁl„^%¶å#=ÑæJ>›ÉF4}ä^ú¡þbBfSÃ…Æxð :ío}žÕ×q=ì¸^㼾꺮ÖE÷&R‚ë±&×ÊÎê{žäU™Øšo*ØÙÚ'…=n~=(Ø.‹Íp}·ùVσî8zØÂîªî 7ÙÔ.»I~r÷Y¸µn'¸’¨­è3 rGwL¾>(¿0ÊN¦ÍÇÙæ[âÙïì²ðº£ŠìtùŽŸ|Ž—ÜI“›Èe6þè…Î,!OݸMv»}œ½MÜ¿]ɶÜM:Ü\z¹,>(+L-$/óÛ1¹˜;пŸosÛmÞ-zrS~ú‚ô£LÝtjݳ…Ý\ð`œô3´ô¯¬}—7õ±t|<~U_}Ç„õZ/Þ³ŒK_ËE_©^XëÍëÇ8÷Ç<÷zß÷!ãê~ø9òà‚_øO‡†ŸøöAøŠß÷ŒßøqÿøßñØ*߸1á\á´’÷“¯¸•¯¨{ä+â´r⺟Ÿÿ À2Þ,7~úš›úè±À 1Fû±ŸäMod7Á/Âæ, ac~æ%ü³ò¶Q>åU>£ ðþÂæt~bxŽû¨ŸäEœ8¯.{d*¢~é·Õ“^ãn`ò-uvgy¶g}ÖéHvêd6íÔïùIÎÙ8Zs”&ŸN,×ÇÎw¸± ìùkqE —Wp»@Ø•+xR1”t‹a›U ˆ`ÈÐaFŽ=~RäH’%MžD™RåJ–-]¾„SæLš5mÞ<‰C€+ž=}þÔ•la¸å’E¦0¼„ôÊ–§ ›6]…!ã.h\fØ`˜ ÀرM«†Œšt)žŠc*å¹² U§aÉ–MXˆã­Š8ýþXð`Â… Fœ¸¤N¡ó$j4Ã5š^š{EXÕU(Wþm”!Ž U¢ÀðÆŽ¡E®š|¥2CH~,]±4ÒUº«=že¸€ŒbâÅGž\ùræ‹w>†þ3²Ó:t4pÓ4<" Uu#C˜°®W}-#™§m1ÉB¡Ãéž÷èÒ§O² Ć+ÊÀbÞªŠo¾úx»â_šƒ0B '¤°B c,: ‡*Ê©¸à㩪ʄKVA¢ª-pრ&Ì­!.$ºÂ—_.‘" † A’KƬŒ€«£-Ž €‚#¤Ú€6®h=ܱǃ¤‹¡[¸êB/¿3L1ÇL,à ¡›ŽÁ”rè‹$5d€ “þA 2ïÄ3O=÷ÔÓÌ3K3K”„FH„à3QEe´QGË|îO@;T³$ °àBƒÌå´SO?ÕQ?% *ÐPOE5UUWÍsTR¥£”UYg¥µV[sõÕžL½µW_6Ø\uå0XcE6YO‡Õ•×ß S㔪Úd†§êT6[m·e•ÙWm0á(¢‰úrMì³'|p¡7¬X*¥Â¦+­©ªr|qAK+†¸ò ¬+ÄÊ™r¾ =ôˆ×°bº/Ël³”=“³Ó¯À[3ÊI3 5ÕV.8áDç½÷vI®âê®û¯ªíºûÎiñÈo¿þþ;Þ»ª¸`ý {bϽ­´r}?|dGsíC4Y6QT‘EUDRI©J<1Eøx©j\mÄqN}RضÔ%ñЀ³"ßcþ*æ6ÁäM0ÁÖ%8AT%pRóT¡EAvðllÌUr©Lmʃ'D!À@(‚¥Ð…/4\¤Ò¶«XÁІ7,Û Õ†Cö°g:J }8D" ˆ°*b•˜¬#úDˆ%˜¢xœh•ë Õš"H²ˆ’.Ñ‹j" c²E ‘11ú³â¹NbÆ’¤‹€_„£r™²„ºãKòÈ‘ë¡_o‰ó¸¯8RŽ2œa±`²G1ÒŽ)A˜ÂEA–„a†Ä¤qæ¨H‹\ê)2£™Í,r±Œ5å8à/:𤘹a¼ÂŽfV3¶ «¸b³…‘Q d¹e.cþó‘B¸–ÀÄ¥.µ„JU²žÔ3W¹#cÆ2g ¤e'±ð•e¤e/“e(o–²„¤YUN™ÊiælÍÌÈÎ29OH%Ò‰kƒÆB®Ÿ®}Í"EÓÁÑš’£-pà`¸ÆDís¡þÔ"4D€&éiϳˆD)Z¤(´k €F+Ê‚¡ É'IÃPЃ&t¡ å?½6”ê“j±Ö´æÐ~Ò”r-ZªRÒ– Ѝ'mÈØè¹T\!r†[™ß ¸×M‘X`È † Q$$ \\ªªÏ€D«­!«R3rU‹àn­X½ÂY1(U¯&de±‹ËÞúÖþUÀUŠ#5h›UáºE¶†•©‡ýË&+¦±ÍÝ4Š[ ]B >”voäœe?b·ÈEÖnq\Áš2ÙÊâŒ%­eC˛̚–±YÙJW¾b—Îù5#‘«JjMËÝžåsˆîM»6Žø¦5UeH ÀBp *r͈qGb7ØP¦nìt¥¦\æ:—7Ümîs·*(éŠÖ ¥áÈiRs…ò2î#€•ÛÀë]AÍ÷,» n~g2\ &ˆ>ÝvšB!` UQÃK·÷߯Æè¢Q›\HüQ©ØÀ”³°Ì 3”!Ôˈ$¨>f¯ïq(÷7E7 UÉð†¯bþ†Äø,ßÓoŽ_Â_óþïJ£‘ˆšR‰_@oU)&ø˘Y)€ZäXü–$5bºAÉL¶‘ ÊiùÈÔ¼òýìd,5ºQŽªÀ2_…HéX‹BÆ/sYÌt.ò—u¦.÷y%<^cÙø9¦‹~F´ImG&ÚÑ}^4éåØFo–ÒÆ4á"iNwš$›öt¨E=§¦í‰£FµŸAjV'zÕ­†uŽ_í°*ú‘!X¬I¥ÇX\äбv׬­Ø«3ú jÌ5btH‘ {$n¶¿M.üF»öc;I/õÑØù²É²õ(“<‚»Á !d´ƒ]jbþ‰° nÁL eȼ_ФÅÍìÃì»Pæ÷.©îß±»YÄeH.‚MQNs¦Ë7WQkβáÏÜfB8ð‹ê©SšÎ ¦$°€ä’u ÏŒÄaf1.`Lcïœf+_Éd”§le*g6­’3ܽ¿CBB>ò’ƒ€u  ¦2Y沉‹„—$4Ïù1ˆ×”=Ý—éÓϾ®i3„n¸L!º4æ5%§YãÚ}šR«<ÀêJMj‘?LT ¼Ð¨œ±µž2äí;@z…£º”ÂWÿæ^PD«p&Y§?6Ф5eÈMUW_ãwŸ¯Ë·uBÜŸ¥êÊFìá½ÞÓ–²+P£Ö‚Åq Ì™­©q,‹`,$C†,ʲ¬Ï¢ ¼ÙÒœ£P †è-¨À¬¬œØÊÚº@ÛÊ7x&ó²Ê© Ôè,¼-DA×Ò·9‹ìˆßÀ4¸oA¸+ È…öŠ ÖÉÊQ/ÞPÂÏÊIÈ…ª°þ/*ë ·Êˆ'Lˆ×¹Â¸/%¤ô²öÒBÌë=À‚!ÀËÁ@é±2‰þsà ¿&¼gqŠÚÓÃÌ›ìËü Âl)»ŒÀ$1û`»¦¡ C1K1‹°Œ(ƒ€±Ó0Œ‘DÄžö81‹°ÿ°1S°H±óDãÄ·a< ,)@Š7\±NÔ5Ñ=Ai1£AùÄJÓÄ,ÉEŽÀ±AT–Bdˆ–ñ±'[‘y‘¦à5Û'üY³›ÄaÄ: ƦXF,‰Æ9a9ôÁ³-C2+[²j|²3ûFtl³,y3Žxc±¸Æ·±›u¼‚wäˆ#I’)”8þオ#38?L ){£2FBÂx©£5i“<ñ74—(4ĸHEùµ…4a B1”†Ò“‰äÈ’, Ò>!I“tÉÃ@É—”É ŠÉ™´Iñ©É›ÔIÞÉÉôIMkÈyÈY9‹Z3¶^–,#^³’ØHDëÉ€“H —üs¶¤¥TÁ« hô߀j»¶Eš–± €`%I#7†ð6Fcs82!‹³Lˬ# ­mû7âhÉr¤yI·G+Äw‹·µÌ?À†qKÃÌ·üc#­LŒª@LŤ¤ÂÀËzÛKÅèKµ<7£LGCF…‹‹ËŒŽ¡:×À¹þŠ'm™Œh.`Í©è¥_ʯû%™;&Ù„:¬¸9¦ƒ«ÃÍj Ë‚9V2Ítúª­[&v9\9’3¹œk¸¸|MÖ´ÍY´¬ë Ÿ Ä €¡ƒN£ÓºdŠ œ£¤ë¸¤˜ÍQÎÑ\ÍÐΫ˸©CN÷Ô9Œ»#óPή[Ï«§¯ JŠA¸³K»‡¢©EtÔ¹Ë(}:‹êœ½+ÈEàÈEò0 u«Š›2<ÊÛ)eŸd<½+*ý*ÜQ–:)Ðó;Àó»ÒQê„ÍÙ›PŽF(Íã<ÏKˆÐ½5 UÐÚ³½|¼»¦˜PÑHR}r=س¼¹sþP>Lšš¨‘Æ u>ÃÍšµ>ỿ%Œ/΀?A©¾‹(a ƒîY:¼®?´®¬/8E¼9Ó4%H‚«âÃC-Ú?í,õÛ¿ê86uÓ¹™SA±Ó0?ô³B «ö +ð3¶æÃб +CýˆFUÓä ,ñ›*ü3¶õ»ŠFåˆt5/Eâ*À$AÜj d-<­= KAp&ÆòAàðÁÕº¬¤ ØÚÀl¬Úâ¶pɈ ÖÇéÌ ,­mÌ@Ô¢±à]µÁf•_…¬‘`A&«G8œUTËB˜ÀÆéÖIÔ@´H×[Á¤ØP[Ý6µ4Hm¬½ˆÈUµ'1þ­#LB-ôS',CàˆÂ½OåˆFå>„=¯ÚY¯‚MV ú€}V+\®ðªPB-†UTÿ 5dC7Ä q.$RÑšÂ*üØ:Œ‘íTäʈ;ÔØ34 *åÁœmÙÿ ûLV-"4DôÅ3ÑFLÅ«žUÄ@óÊEHÌÅk¨µõ°ÅO4ÅîÁB¥ÍˆQ”ÐåaÄÍŠ¯¥Å¬½·d=‹§­žaŒ"W„EY ×Z¼Gä̱D§ÑR©YEn£Z§q±^T±ˆå·z½Q†(Æ.ÝW: eÈ©pŸg¤ |jl26ÛZÞàGù¹³©@H0;GÎíÇôQÇ4óŸþÆ } 1ÊÕÆ¤x\2ʲ<³³¸­\kDÝJ9‹ÌõÇÉ…ŸÐeˆÚÇy”Ý`ÄG»ÄÆÝÕÜIìÆÞ娌À]°s893ËÜs«×æýA>ûÙÄå$–h G©È–ÈHîÍWÃ_À(_N9_=yJUÚàJ’É ú™øÉŸ4ƨ„LYÉŸQɹÀYû6üà†&à–¶ö-f` ÔÞSkà^·~_ ¶à~1`ÞAC “–üCJÃ7y#ÈvÙ£È8mY_0R`ªàa#› þˆb[L®Ä¶6LÈ´•=ʃ̯ô°KζmÃá»ÔÖ€ahKµ„K!¶þaló7N⾉=â…y­L“(à>P,®a¿Øâ.þâŒÌ LxsbFÃ̳½)Šâ6Ä„ÙÁp c²œÞº¥bÀ˜âGÒã? $)€™d A&dCÄÏ´Ð\8ÒLЇCMß$'¼Nhô,˜âD¦Kx΢;9I^:pJRz¹£¦™“ÎqRVO:òÜJæFRÆÏ¸èMSÎKÞ"î ïOQOaJFKNNYŽ&æüd¥£OˆC2[ƺß(§<à#´çBez ¤ö4O»¤`ŽÎd†'ºØ,ˆ¥š»4ù|ŠÔÎͱåõœ£æŒkþfgL¶epO’xg†ˆçxâÙ€Yá *Råašõи3Ðe »Ã;•RQ¾kQÒ‹=ˆRÅCšÝ»+°Ð†Q8¦è¶Òr©×{±¦iºãÐ+PБVÁݼÎû<uQÑ+=ÐÒ†>Ñ+-’ÆC) Ni(íÅ‹и´IÐ1°“Ä3šŽNYò3ŠžÖ)ÚKçý œÆh.ª§¨.À™R}Ò›Íj^`¥6à‘H½¥nj;9ë{è½h åežSë‰hk.}ä‚!0‹à³¿ñ#Óú3ÓðCÓ1ýTºÀTnƒ>IM*Q­+KžET:íˆ4ý_³Ô°¢Ùþ¦HÓ»Ú˦ì¾ÊãGM?0ÕûØ?Óþª@}«HíP¥‹Ñ&^Üx[ÀÿD=zí3#ÉVÕ+€>°+È=5‹7=SFr×B0#ض„Ýîmë›+Æ&nµú*‘nän‚¦`ÑxÕ YWY%gruÀΉÀ9×ܲÀÝrÁŒAõöÀ©ˆ,fÖu%é+`VÎÂÁieï¼±œ+ ÕcMÁ<–ÐÌX¹=p…ïh•ôŽ×—Ê!ø…Bhãû–œ0®ocõðùïUøú¾ Ð`¬g¤½†’¾‰Çp ·7çþ.Ù’`q¶Ž§ñ¥dôW%¤Ø“Øâ²Y•¥B‹í.i­þY@Y/¼Xúâ>ˆ‘/´›ÐÎÂ#nX2|Ø"g#‘mÃQààBO®'F+_re•ÊBJX¼«ªÎÎbÞ@Y9Ïí*7s‹ø„0ä)ªv?xöõHÚO§ëÀ-Û‘(wFþ6Üj¶ôñ6/Æ•Þf|h$ÝÍMÞz,„l„]%gG†ÀÇp²+XÝV ³Ù}²þnx»Hg>xAÝþ¹øÓ•çß…z,[áý÷|”çIœx޹èåFÓåˆÚƳðƒˆÀóYø”pù{y›/ù²=yͤ ø"É¥ÜC§^à…2&yÞ˜g,¢^kŒw‘(„£Oú—ÃÞ{O\‰îÉFù^–H_Á{â(ûŒ€{ŸÈ³§ ¶×·gˆ´‡–¦_–ÀB0†1 bÒ{¾î_¼ï=# 5‡!Ã/àKß¡ v|‡ÉàÇ—üZ‰üÉ·üU©üË×üPÉüþÍ÷|Né| écŽ0ÊÅü`äÀK9æ–"}“0aÖ_LVi´ }؇â“aµ¤áãH}_Ûæae#Ê”ðaRÃw¬bŽ}7vÌ“Xâ,nâäèý8Fdà×ê;Ö#½tþâ°b0–Êéâ9,ï·À Vò/‰36Æ"„#Ì5þcëg¤Æ,ÕF¢‰ÑÿÛçcÕÏ?rkcþˆ+,hð B‚\Èð Ã‡#2¤(ñ"Æ3rÜ‘£ÀÊ âàê$Ê”*W²t%‡Â¹R])ÄdŸxn¹Ã…‡ÃH¹´ªÀJÚÄ©s", 7:¼…ƒ ¯m&"Yþu D…|*öfÎI£.\%b Q£Hk¢}š4éÒ„º~ {Å*V­\½Jz°`ÆW gªE¸×+X€³nMÊ7rM²A'.N Uªã¼y| a‹€\¸Ü)tѬÞË~ã}ÍáܱLØ0bŠïúî+ö܇8üN|‹ „llœ.ãŠ| N,ù*åÛ»°ÁîyiÞµ ‘ãUj›àdÁÄÙ›·‹ýèÒ§Ù£ïl÷ñ%Üç\EÅWÙPEÕV_c·Ô@’I-I8¡K0i$nXrˆÀ Ää† ÂÓl¶ø±…bÜ&P‡†84¼xáþR„±wh@£x0‘‡@L@¢Ã'À#ˆ"&U£@©4¦"‹.rèa“·y¤4A)Ž<ú8ÑAªÁK—x¨á ŒXΨWš_æ¸c?>é%‘W‰¤’·1ù&Pê5 ’¸v…j$u¤01zé·%BæIe‹Fl’‡Wø‘‡k”©&šf²9iœ—®˜i{‘^ø€%‡:ä$Ÿ$éF¥rþé¤c§ž™æš`Ò9æ]•p1D›2:É)6^©•mêÞsŠi§CÔ6›eBÞzh¢Ó¾Z-A¿’ifªj®z-´…YçmÞ^éì@xÐDPIú»ÒK -eËþ[’Ü"P«´Êp9À¶ ŸÄ4Á+œÔ[šÊZXL$­¾Õà—÷U|EÂe|Å%A,1Å£|q§Ž¼/A,Ü,ÐÉ)ëõ3Ç'EôÈ•L\Ð4¯ìA–v ;@òƒ Íó¾/kýP ¬‚ È>s­%Ñ^cä%¼· Ö;_òMWT6Ñ9 ¶X³Å/ µ²ÚÙVÔŸÞ·^·ÌB#´¸ÔU}ÅâÙ}4ÏfÏóá’b¸÷Âtùæþ{úI_Xˆy0›ÊÆ—TwŰí 3Øp#ìˆp(q‡ éY+ì<ÁÖ»ñÀ¯‚þÁ@·ç¾ûÌc[óG8_üõßf=¥Á·½ñ'Oûòÿ®ACüRˆ20L4û—| 5ŽÒë~?BnPÞŽ7©‰ézì« 2@œóÕ/€QÚþxò]on{ ïp´>Ðpƒ"m‡»ýU‚éàÜ?ù]…Ÿ=h‹„P<#¤ %s±ô uÿRÝ‹D@\üâi kXÍ Q ܨˆ3ôŽj°5LÚ–æ'6„_º!ˆ™x.N,|âsˆ©hÅ3NŒŒ¼M«X34’ 6n”! 1J¬ÂVq‹â2"@±,QcĈ°0,@þŒaM HIE$’È…C঴¬ ð޼âå8‘OÌ`ñd¼6Æ^ G‰ã)²Ê1ñ!³Ô#I1R•PJ+³Ë$JÒ“WXLçCQ|8@B‡,Pˆ$ó $2ŠnC†(Ñá‚s¢9ÍjG‹p0Ç5@Z$¤IͽÙf7Û$OrBR‚çLç:q$ÎyN€ÿ:%è†v¾ÓOñg¶6N‚ø_L CpAPebø¬„7¿f<ŒAÅBuÊ ~4¤o¼B^p«\íJ‚­¦ø éƒ&ô.Âø…¢®´OÁݨþ¥ß$PÂSØU¨5\SEeÑ{r¤GÈMuúž,U›U iVòÒð+BËœP3)B”BÀ@—³h‡ >p °ñÅ/.¡#ñ‚)m}k\Ëy›Jü hOèºâ°Õ­p½¸ 3¼ê5 bùëc(äé—!¬aaÐÛ4°›í¬+‰ÚÃJ0±\X¬_X‚pÖ @èë@ü0ॆ |¸Ãì@RÛ.∲{ÕÚpòc`õŽÔ’kY‰È2›´;‚tŽ0;–6³ÉM­W+ÚÛCêîl¡;éòÕŒÙï]óz\ôžÖ ìˆnwßÛÆÖ´þÏÍi?[XÖç¾ôý ‚+žUBÍüZvÈ¿ SX"jA…!1Ý ƒDÃþð@<üh1ˆ‚ⳘÅ+n1Œc,‘'„Ä2¾ñEdÔ²6­Òš„!HÇF>2’“ŒãBc ºt¯’£,å)S¹Êa²“­,e÷`?IT¸ Æh¹Ìf>3… ⢹Ín~3œ_³Š5Ç9Æ\îrJ\ç=ó¹Ï~þ3 -èAäÎxNÝ— ­èE3ºÑŽ~4¤÷lèCë9Ò–¾4¦3­éMCzÒx®4§C-êQ“ºÔ¦®°§» jLcÊjøG²‰@9ʵþ^›‰OÍâ[[ºÖ®)¬cþ¥ºÇ«Ö¯¥Üj)GVf‚ˆëàœìN;Ø" v­ó@½j[û HðýŠÝà´*… pv…“ÝÑ /;!9/x!¿T¸žÈ/Œfnãß¹¾6€[Ünv§ x²´1 ]nU"…P/ø †ØßyxÄ'>”$â>kZæ€XÝO$xÀ‚.ÁD@àB#)Œƒ7Ü;åe¶8q-Žó“ïœÚ/xü ¸o\Ç#H‚D …äÜÈGOúÒw3’¯}|™!ÈLÄÍÀ†?éiŠgÔ3•“È:˜ËO`ëµü4‚xþÔ@Ü ³û¥nX/v»¸. šËÞÙ«Ø@Æ/e/Ž€¼£uÂ_çð:;×I[¶³%4îÉ@LƒÕ°†âÙ ßãgó÷÷P*7»é €/-Éæ8£§.sœãèH‡:t_»v~ÓÕÿ<òqÈxÊøI~f!^ÇÖC@@= Ö ø)±æÏ”É[GõHEˆòÂü8(Üf=4J®ž¡ ©Ëš%:QŠÎu£òJZëž²…§")IðÄד¤E§ ±Wy2Ò‡Ù½€‹” „½°_®ÉŸ¥˶¬ ª˪”Ÿc´ ÒË, žÔ_Ÿû J‹@” 0Š£þ%™˜ʉ½ÀË#!ħ„ʨ”а´K±°Êü™K•˜ ò-­ØÊˆÐ$¸M æ‰BÄ B`Æß(K\! –Ê Ì¦ /TFðCˆ‹¡„ ¢D!V¹É³¡ªè`DT!Â`áÙPÝ÷_…H! ãå ‘âˆNj]¬ ÜÐ iÐ4ŽÓh„‚ÕNîË Ð[ ÊaË ÄâàaæÍ@è æÌæÐ é@„$~Î!ŠL™Œ ªÌKEÕXÍqØ%v‚XØŒM¦"Ú¤áâPÛ(ÎÁbÎÌÝdÎ&^%òߎ.Ïà8â*ÚÜ J!„äLÍþäTÎè„b%öL/B„2FÝhMÕùPȱN´å‰ÐôðŽúðÖÉÕ#…ã÷”ã@pÿñ’ùè[=OôÜ•2::ªÔ="_öÜÆ>Æ£ò¬£ïx©PÐ%ýØOÅ=‚˜ÿЭ”CŽ#u‰E-ÐBJP˜í£D¥ð¸PF˜!Ê !B B²IÄHz–D ärŸ„qÄ6¢ÎÕ]Q-1ŒÒ<žR- q Ó}"qøÒ@(ÜÈÜ9R"„'áÀE’1¥ RN¤@Ó?e(ÅÒÄü¡åE.õÑDÜb0=[jÍÒfD"-R#ñþ£f݈\¾e%]R&ÝbÕ’G–åX )™ÒW¢¥z‘$YË[fßlŸ-IÒZê’\SJÐ\B¦dNyÜ‚ßN^Á3…Õ5¡ŸWåÓL”>=•Qî:!T@-”;m C„EÜ˹œdI`‰†•½ DSáf?9RWy¥S€Tlö”ÑfCqàC”EHTÔEœ;iÔý¬[jZÀåKI]ÁI¥”LTT%•@ÄÔLéJÚTuâx"çsšÅO•q.æ4kJÄÓ)]rlDTi'U©æîçqD€FXuN†&¥}™ZIÁmÁ\ÕU|UV{]–l§CþÀWkÝbÁÆYD4ÀŒ@èx‰…`èfÅU³ „Õèb~—‰¨r:’ k©]Mè¨ø)åÖni„jü–¾aD Ð} Wó-Ws)g@U){Ö„umvQ€vI6Ÿr©@”×y!i*Ä~á–ÃQB¼iÜi•æ×zÉ×t-é‘~¨rÚ’œòêf”bDNžÎ±]D„uÿ\X†m˜’ÑX™IjAØXjÝ¥¶X¦jÚ¦FZ§„¥¾Ù°yæY¢eD ™2*«þ–!\«Æª«6™A6Ú¡þЩbD˜™¬öjœ©›ùª°¶°fÚ­2S®«þ².+³6k¯+…$ª³N+µV«µ2´úصn+·v«·ÆY¶:X²~+¹–«¹ž«ÌIè§+º¶«»¾k»†kKH«® ÜA¼ZÑÍZÏ5]Éý›·î+Ž*¼Úªºª»ÊÀþ\>Äv´Å•›¬½’kÂÊØ·êÀš¼²Ähú+¿Â¥ÐÕÜ­ §Ã^A¾%\¿.ìK5¤Ê¦™Ç–lÅ\ÈòÇe,¶¬±QèÉ%™É+ÀÝÚ̉ì¯ò«Î)lÅòœÂV\B¾¬Dˆ„Í.ÚÆzYÈ Eë‰ÝâõDÚuÝè!ÎðYíº9^Õ¢]YH^vXmß¹ž\àÞ]RCT-ØêÞ€¨­c¸þ­ï!HØFcQŸÕB„h@ßiôVç‘^î]}øn\o p(ÕÚ.ˆrÄŽÐÞtlWØêí_dÍÓZÔªDÇÚ ¶ß·¼ÉiZW·¨Ÿøt ûüq f ŸÜ¸ˆnõL ê:áV¾në:à°Œá¾ÉÞàî^ œì‰ý9þÑîn!¢(ÊÖ&ÜÍ¥½¡@¬ _âÑ Š ©$…ºËÞ õN!gôàmà | áëJ`6n®Æâì¸élÎM £Ðe=Ì1ZŽ4Î/Ä/"R:®L#†Ì,â0N,.&Î4âb&ÎP/þoš%(Ê!ÿ~Òâä\Í&þ•\Ú#‡µ"Ùðb ÅpZÖâÛÜ"ÑÎú²ïŸu®©*D!Ô•â¨#q¼d? …9W@âˆ;ÄH:OÌ¡PLæãG>r¤ íìø0q÷1ý¤OA¾TKÎO0$*V$ }XD¾h  P!d¤C0C PGÞÂMÂpŸÉpø}™$üÍ@lÍ”fþ$ŠÏe%¯[Wre'&[eAÌ’V¾¦VÑÑÁ‘#;/¥bvie¶eO’?6œ,5æ["’"1Ò#Ö.õï‹X&- `âˆ1!·o©Î1AÀ@Iq<€$ ¦Q„ižŸéçW]UkZçþÔ DrF'CÙf1óÓ@lqÎ'Ö'lÔ#‡UsNL2OŒt2ór:ó¥®fvNÕDdÔFÁ¬¯':ÏMyž§–J:˜{þàùÊçP=h,š#-€%Ä›%l§«%’b(]ÙÕm¼ieÖk Xh!‰¾–‰²)Ãöæ䨟vÊ”N šŠq™²C‘F´‘ž(m™)ŸŠJ“NÄ“××ltqééK_)sÁˆsáå–ÊtZŠÅ—†é˜:Òj>ǰû‚ÜÁ¦Ø¢jš£RاÂXSGÙ§†jË2ÄS?ê© ìPóÙ>·!Ž¥*‘e5§½êÌ‚5Yßì,ó3Ží*™•u¤k8³þ5\ ÚVÓk\×µ]ß5ŒÍõQã5_÷µ_GèYsõ_6a6Cèµa'¶b6b/¶c?v]76dO6eDzdW6fgö»^¶fw¶gw+g¶h6³†6iŸ6j³ªi§6k·ö¨­¶kǶlGl϶mß¶\µÕí5n÷¶o·Ymÿ6µÆËT ÷²·q7+qmr“r77tG·é67ò¶t_7vuë¤ug·w÷C<7x7yóØYÓuy§÷w‹·z·÷u³·{ÇwrÃ7ÌâkÉêkµ&VË7#}ÃeÃÂe´å7H\løAü7Ñ‘,\žì:CÚ5CÔ,‚Wø‚m7¢þvwÉmÑMsk”M›ÓZx…_6}tmè‰Þžíœ¸ÞN…ç„ô}G`Ø­ã‡ãaåÚ}Qh.÷^߆‹—mæ’x‰c8®Ä‚¡ÿÑ_ìF‰íæàï>K®yaºî „1Ø“¶X`ðb ùÖÔ Á|/äÂÀê]¯¼ ·TïíBy*y_ö#î/%ò¸Ì1Bb>BãAHpéø›óáÖº&eу A2© u±í/p4Êá¡ã9_6«@¢ÏÂñC&±ñðIñhåÀ ¬ :&Ël$(ÌT‘¬ÂZ‡åªs8’P¿±þ§«wh+ò%¥R"2cf¥bBÙ‹Ì$ Pü‚½Ò$Ëz£¹@@‚lˆ% $ rN ò²²AÀò°Ë÷eGó=+sm:4ó7O³Aø§sl3Ž€ÀU^Arf3Ž”y|^`ü” æÊâ;»?ÕŒUº«;“#«›ê´IO.I;DÃb´i´™*tH—#mŒÂôm€ivÍÎ.ÀV´¸èNü†Î’ õû·‚ƒÄROXUߨÎïÙ~×|yß<Ðý` =Ñ=^=Ò/=\+=Ó?}V;=ÔO= K=Õ·Y\=mG|´b|=؇½Ø=Ù—½ÙŸ=Ú§½Ú¯þ=Û·½Û¿=ÜǽÜÏ=Ý×½Úû@ؽÞï=ß÷½ßÿ=à¾à·=pý„l€$¾â/>ã7¾ã?>äG¾äO>åW¾å_>æg¾æo>çw¾ç>å/0è—¾éŸ>ê§¾ê¯>ë·>æo@`ǾìÏ>í×¾íß>îç~KD„‚îÿ>ð¿ð?ñ¿ñ?ò'¿ò/ƒ¡€)°A)0¿ôO?õW¿õ_?ög¿öo¿] ,÷?ù—¿ùŸ?ú§¿úØ+B,¬¿üÏ?ý׿ýß?þ¿Ì+ôŒ@¸8`Aƒ&T¸aC‡!F”8‘bE‹1fÔ¸þ‘cGA†9Ò"&6Æ2D’eK—/aÆ”9“fM›7qæ<(ÁÔ@Rit:”hQ£G‘&UJ2¦EØ X:•jU«W±fÕZô›RQ Ú:–lY³gѦêäKÁ(IÀ¨•;—n]»wËŠ t¨ '6ð<˜paÃ#°ñ$‡qãPƒG–<™re³+ØdÖ¬9(ËŸA‡=ºå€§[e>}šiׯaÇ–m3›Ù·qçÖ]¸önß¿·Ú[xqãÇ‘¿$žœysçÏ.‡>zuãÒ­g×¾Ý5vîßÁ‡ì]|yóçÇ’G¿ž}{¢êÝÇ—?¿%|ú÷ñç¯h_þÿÿ âÀ ”OÀLP¼l07ˆP )¬Ð 1ÌPà 9ìÐÃA 1Dp@ÄQLQÅYlñBtMHâ¨ÑÆqÌQÇyìÑÇ RÈ!‰,ÒÈ#É%™lÒÉ'ƒ„ÆGS!:°ÌRË-¹ìÒË/Á SÌ1É,ÓÌ3Ñ€4Ñ\“Í7áŒSÎ9ÓLfJ*C³’Î=ùì“Î mÑ‹,SP†^”™$K†‘$.fIK7µtSB^@@ ‰>)õ²S?A UÔ9íÄS4=GMUU?Ýì fjÁ2[¨`…l‰K]̈ &∕ŽO‡K¦þ(a•Nø$vKgWVÚQK54T§ÍVÛ0;%!,µð@Ëe´À2º$ÖÒ-É5–ŽDœI˜3&¥Â.šéCÖd¸à¥—5†•Ë.–† *&­˜T Ia`4~á‚t‡5ah·Í8Ûj­µ [AÖ¶UV6W-#XKe’I ’g¹\WK/T.–ŽU–èà 3&…Æ / AKK‰„„x¶ËW ‰`c&í¥Ð– h:YC f&eÐÁÞøÎŽ)û8ì³E¥ ‡‡}9ËHÜ$aKR‘„Š/t7Ë..q˜g¾ž”í$á’„š;•„í,`ËH¾¥]þéh˜IA[óT9&{2³7]NJ›X,OÎ2å-»Haeôf±´¥IÑd"ÓôŠ ^K NÑæS r¨irÆ„úNe¼"‡©¬éVnÚ'¤Ž§t¨ÅnxUSµMéú’Vß™[/K4}ªQ>&![Là‰\¥c–d1‹®Ò_`]ßj&F9 R[Ä€°E5êQ‘Ê«§&ô%·šé¨_Âë™;'è¢yÈ›“2žÀ%³ž•(iÅ’’Á½Åú1²˜kdAF)Ôj‰W¾–°èÐ…_”À¶(¾æG‡F`‰pÃânñ‰MÊb‹¿ü°¼‘W¿x믗Îå%D8ƒÎع(†?2}ê¿ýú—»Â;¯üšLëmï{Ýe]ì±éíBy÷K‡ ½ñ ßO\à$ÆKý]Ãç&»÷‹Û]~ ÌaY©o¹Nm®Už[9醺ËPFµ+5ª ËxY*áÎþŠ5­qÉ`2ÝÏ 1Âf× ¼@Wš1,)W-ËYÛZ××%¢ izëÔÕÜÌexíK,s—”þá:¸`§~&+-dÙ¡íhIsÓ•“†ç-{Ùg@¡ÍwI›ÓY:÷³õ8êVPÜ’û÷³û=a,1cø°ŒìƒãZ³FÞõTÒ¡@m Ú6KÅá6]ä}7K·Ë݃•—ow©ÊÇþ .'þG]rṠÛz xÂK¯Ò:ô£ }L­{ÝÄ)Äå½¹n‚nýTуþ;ÜéÎ\ËûRÍ‘ýóÞ¼ëùÆúÒ>Û*ÝM.çúo«ëŒ=˜¼w‘óyÙ‡§b"—ÕãWJ’©[sV¸‰à*wW2æ«%óÕÌ~´á–¤­>hÄA tP"N÷B,5^Â^bŸûàWî,q>íbò^¼ïG‡wš§Gt…½¾ö½ÏÅ‹ß|êÃy‹Ó—ìt }–>OûØ ÞÅ¿W¼[œo¥¥$ üÅïî{Üg)¹÷{V¼Z ˜¬Ÿì]h—º²Øé;X³ΰ†.&V¬ÃŒ%þZ¬âtxÆ*ýõ÷†³#V O(~T(Kö¯ÿOKè"vmK”a¾‚$èÞ:QHƒ8ù °ÞOÓ. Ö@hzoI(gugûºïûb‡éý[´ä&ÖE ÉÈ]žP‹f ÍÐpK"A KÀmt캲K±ö«PÙð¯Îˆ†þ°kϱ¤ý oüÇ!‘ºÈ ˆõ|ðg⥺d~LtJN a§%eÊKx±Íd©š ‘¬›ØäX Aꀱ‘^‘aB plÁ XïW  ¶¡¢Q]‚ŸqÉK¾YBËqñÑq$Ô‘åQ¥ÜñC"ç1ªíñ#ðdnQ¸ñ§t©ôñ å„û±#þQUœeª„H⬠«8Þò"ë¤ïò&>f¯ k‹|K e®ä ²°ä±t0³0r%ËD!7R#>·^‹%KM–‹²Sª%y2L\ò%1âcìY‚ÆþPŒbVìÂìë.öÀÈ,徨fMòåfL¼6,Ŭrx"`ïz2,u (‡âc MÂJ­Í& ԭΆE"€^faj^AX,eÍðrøŽ'ÕlMË>ÍżE, s,É2(:rnêí¼§á6nKömÛŽM2ÃnR2Îîø2K"KS0s­0Åò'“"¨Ç骮RÖÎëÎÎýHMØ\ +éÀí`Îë\ì+A³0Es4%¢‡\/únK‚/ô4yX³äuÏøJn'o3,sS7!âc"pQPÑ\ЋSå¢/…Çü²ÕO†ø¯ýbg›345:ñ›æ°ŸÈþ ËÁHŒq8µ³5mm#Á ±ÈcK>ãgV²ñ<ò9Õ³!2cN„‘@{Ò@t!ÔA)4 4BbB+tCEçB1ô 4”CEôl<ôC "DG4E?)=M$PTEatZJ´EâEcôF‰FcÂFq´GýdFi”G+iA%2©ÔG H[TH5&$½"Mr"éË"‘ô”ÔD;’°úŠ&㤥§âj®P³ªT‘®ôCc²Wrk/¿4µÄ¤´NKK˜³LÿèL1T(#ŒqŠòb‚,Å’²­*€)*»K’¿.f»õ)£²*æÇØæO[l+)63l¼bþLȺòèl“NÉN#Ô,[æÐ|ŽÏþ2ÏÎ .å’.í Ë0õŒÏ€Uç².å’M@/SUÔˆçÖ’ÍÊrËNu-=ÓS?•Eu”#“Ýìí…óá q2Ž2?ÓM:SÜ(ÓZ+è2§5v³æè`3ÎÙ YõIY—&q`¨®RÓì‚'ë-úØŽy„í>‘g5‡Ïë`S6ñ툧SÕՎص]ƒò]è{ìSú€sö„Ó7‡S9U+íÈy‚³ø¦oo’³c]lNö†@õ@¥Ó$p‚°ÅÓ±s_‡Ó/ö^ÏõÑLðé eíïekÈ;Á%þÓýÎÕ#Ç™ØÒmØèK}âËà¤u\GKÈÕM(n÷8Q}¸5ùÖ†Žë +¥VÁˆÓ[ù8ÄN3ߘ͵交ð SáºdßFrŽmF÷0þŽÛ8³Ñ5ŒÅ7„Ex7{Mä´€ä˜.Xm‰·$_csëL`m¦äŽî,y8IÇtÜì"G\'E*Ž8åÜ$`Uy`3öëÆîwê•`Ùè€JÇ^¹Ky8QY;9:IØt)y³Kld™›ïùÒk9n’/N›‡Å $A°˜P~ˆÍ?v`BÖñ‰‘76vî9ùòŽR˜ÏùÜyœ+¶cÍyŘš«Ù!‚Pix˜…~¸g‰ö…6hÓ¯k†oP–¨€´ø¢Ú…ÖÄ À ‹ÓˆÅÏM€¢'Ú¡Çóf¹dBpÓJЄt–gcVxí¯¢é`‹©+6yþ ú "¡)¥?ÌmFØè?»l逩;¥ LñØPÑ5%$ˆÜ…¨·Ú]X„¦8# mA ‡?¡0l­VoQK ø€µ6?Ýä­Gr`¢«Qت¶ É–'ÇGw“h1K4M~‘’>· ÚEv‘Q™Qr6±ýq±Ÿñþ®Ñu![úZÿ:³Gt³‰±³=›CAE{´+´´ð´QÛAUûúzèz«ŠK›R¶o·Ô Íô§%!b»wÙä!Q·sU÷”tlf.[Z7I}û· "¸÷$‘œåw2xWŸ&kè’Û¶»´Lº¸€ †Á¶È´þ·¡›Y)[·©;‡²W"G‹‹ë{Cåz‹ê œ¡:ÁÆk ;½7âcÚZfâ—‹î%_öÅÂlxü·}í R±$µ²ƒÅ·$~+x‚“/ÁYìK 8YÜ]µä‰EÐ]`XÓ„†-U5v|Ø£y•”oF‰Õ20w †µ¤Š‰ éà &Ë¿Ä/]XÊ£\gÍ¢ÁìŸ|ÀŠE†7ú̳|Ê{Kˆ¦ÃÇTµÉÛhyá‰L8“ÿ;ÈVKÙMâøâŸÇ2cY\ɵ3w+ŽŸþ”ZcyÆb]kÆK½ÉÒÙŽ9’wYœëXÑŸù1=ïÃ'Z‹j”»€RÒÕJŸÐ…²˜m†• î’Ù^Mc#\ˆX•—{Kp]KüÕ> §áŽè‚¹xT³Ù‹”+SzÏ•çΙ§½–ÿælÝRæuxpù»dÏ¡kɤ½ý">fÐ}:Ÿ'чó8Û}›ñ3Lº9q$¶8›à@Ð÷]LºY9åùÒc ùD}·óŠ %œÿyÔšLØx”“Õ+ewÕ^©Å–©ú‹æ‡woêzª©V>ï¾€GléóZ«Í®›ŽÆ*k¯eÝãÓ–²³;TjÛL d:ÿ>ßy»Ng=È©±»[û<±þãN?õévõwµ]ÿ6aÿÈdöq³ôüöq=-¿"x¿÷§ù÷Is’áø‘?ù•ù™¿ùÿù¡?ú¥ú©¿ú­ÿú±?ûµû¹¿û½ÿûÁt?´½@ÌÿüÑ?ýÕýÙ¿ýÝÿýá?þåþé¿þíÿþñ?ÿõÿù¿ÿýÿÿB…Š® <ˆ0¡Â… :|1¢Ä‰+Z¼ˆ1£Æ;zü2¤È‘$Kš<‰2¥Ê•,[º| 3¦Ì™4kÚ¼‰3§Î<{úü 4¨Ð¡D‹=Š4©Ò¥L›:} 5ªÔ©T«Z½Š5«Ö­\»zý 6¬Ø±dËš=‹6­ÚµlÛº} 7®Ü¹tëÚí;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_d_2.gif000066400000000000000000000431221343257752000272370ustar00rootroot00000000000000GIF89a“øçœ‚„täÂÄlRL4.,Ä¢¤tbdÄ‚„´bdTF4ôÆÄlZ\¤~t,Ôªœ”z|\NLüòôœ24¬RTÌžŒ„nlܺ¼t \F<Ì’”¬ŽŒT><|jl$"$|^T ¤ŠŒäÊÌD2,|b\ÄŠŒ$Ä–Œ¬žœ¤JLÄšŒüÒÔŒjd4&$D6,tZT¼rtܪœœzl¤‚t„<.,̪¬´jl„ztôêì¼–””*,´’„äÚÜ„jlÔ¢¤œvt´Š| 䲤LBDüÎÌüúüœ:<ì¾¼\JL|f\D:<¼~|Œvt¤FDÔ®¬„ ä¾¼¤†„´–”TFDdRTÔ¦œL><Ìž”\FD |bd$D64tZ\œzt|fdt^\lVT¼–Œ„jd”vtdNL,"$Œnl´Ž„TBD4*,<24ÿÿþ!ùÙ,“øþi H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóN•’§¯ß¿€ L¸°áÈ+^̸±ãÇ¥èL™go2kÞ̹³çÏ C‹Mº´éÓ¨S«^}GžÊ°cÏÌó¦‹íÛ¸sëÞÍ»·ïßÀoNœøðâÈ“+_ŽüÍkÙУ§¤Í¼ºuåÇ‘g_¾ýº÷ïàþKO>$uðèÑwO }¦Ill¯>?½ýåâËëßñüýÿØØÅq.¼!Œ| ¨`qùñçàƒ ù·à‚äÀ’¸‚à€¸·„$\d’Ãq$Ί&GD [vlp±áv‚("‰ò™ˆ¢ŠæØEƒöèã@êøO¸àÂI¼Ø¡mkô0Ì0˜Ð8 2D D%+ÞÖ¢’Â1é$”R@¥•X ¹ ?¦é`f²‡c p¹!*pØA˜Ã؆BYv1Ì#ÈÉatÚ‰§ž|¶) šj6J›Š~À¶-¡‰ ÇiBiK„¹dníÀE ñ £mšVêi—‘þǨ£þ°Êi«Öðfœƒj‚‚mÃWhwbÚ'¨¨îꧯu»ê†´¦÷j¬ÐN6k³Üab$&klXI(ÌqM>¥°‚²ºm·ßz)RÞsÑÆKÙ´îjg¡’lz\Gh‚ÊãI°›”ÄÛï¿\0¹õz÷¬¼ËEoÄÁÕG\¨˜É1ÆgÂ[ñÈs] ²oûvÇ0D{í¼ït5ÛÀ/üðÄoüñw¸ÝûòFÍ]øóÐG/ýôÔWo}{‡3¯}P·çîýλo/¾KÝo~Äá¯þtµýÖórf ‘Üq¡ñþ‚=˜qþ}é¯ï?I&»rPÀgÌÏ6•`‚»àÀ…Míï]ÿ‹ L$ª÷”J€ŸâM‘ b8°Y=àÀÑÓ? šp#´MÔ®â¤ì HôŽPb;¡Ø>fmÉTþŸúPˆFô"¥È6¨ Âmš°Á6®H*<0 c ‡n½YÂ2‘‰;PŠ8úƒâ#â(ŠS¬¢|~vgàê†×)áç(‘Úæ‡T¸Àô¢1]É6i6ê°"(À6>x6Pƒh”K7kx+Xñ„lIb]`E1‚Ñ HbJUúc¹ÈFÊyBqHÇVŠÄŽ Yõ«`™*•{*ÖmPVà†ì:6ËÞ âV]`B ÌÀ…'¾AÂe¢€yGb@‰·Éå*1—CWz³?=P{FuAfåjS"*‚pj ƒ @0 ëöÈܤŠS—þBAÇNp ,¡bW§êBè9 ÝÆÄÜ&säøÍ†ÄŽ Ó¯e(r½AŒ¸qÅ%2a›c`óS=;æmó„:h  `ÂÌyË6¥BñÓM‡ÚÔ!ýÔ¹¼®/«˜ƒÚàmFb‘O€ƒ+" Ë<®'’“¬¤mÌ€ t 8ÈK‘ªT¦š³ HáLizÓ²Ö1œóÙ×ÂV)Ì`z* m8p Mì¡ PÄ%4q³eÂÍ>ÀÅlŠˆ`…­vÁzå«_·ãŒŽ•¬fÍl„ÂyÇ =ðÎð©ü]³šM-BÊg›˜¹ì´°%þCU;GÖŽhB‹­n}3[Úêж» îozë[W¸ÈÕ q‹Áã&÷¹;ª)soê\è"w¹Ó]_u­\ìfw|TTüØ…ú Ç´Ü’w¿»½ðš‰€Át!ýÊÀ¦WAëe/ó(èø|uc=(F1z€£ÞlG¨äõàmBxßåW¿½³ã ÿ œ pÁOòØi`ÜÀP†¸©aƒ'ô`×¢xt¬gd›$é6k¨ÁV±H¨2щP”"­(ÎöØÆ#™‰ÍŠbµ§ë²M&>Ú"p´…y ämYÈCŽR‘Œt$PµäÇ ¹¬°”:“eËI Ö©æ”(þ{ùË`SP\î2ÿ¤ûåòWT¤"×=ÓÙ.0ÙÉŽÝÎ:ÛùÎxΓÆyD¨œ½\g‡æ”UjîÉ|a¼˜I2îB¤óxÑÜhôÉ.MØvbºhWÑ¹ÑÆE+ÏÈ-žª‹]¨,†‡¡á`î4]}NVÜ¢•«Kmª9ÃZê9£º¡Þ¿üÅVN¹õav„t€‰ÆÚi­ÇñA1Žß¹Öõ®yÝk_åTYû›•Çö¦s=ëÐz½ç&á©Óí?ÛºvfñÞ_‰é8Û-·ùÖ÷¼ù ^Î<½û&8ܶ{ðó%\áTcxÿ÷pˆ/MâÏ]Å-~3Œïl¼¼™!ÔþDx{xà°ÁÁCòu;ä¸k¹wê«\”§üÄ+Ϙ}d^^¯:AfZO@ÅàÜlüæ»ÏaŽßv¸8#À€+Y™ (êS¯:Ö©Ž@-Ý:"6ºÍ‘Î: ­˜ˆÕ±iüó2žèˆ]¸1*žHcg¼ ŰÄÍÅ5 ¢>Èq•ÄÛ¸Âï€ßÜŸÈWÌ!J˜˜ƒ†ìŽw½¯Ã9ûqßÇC^òž@ä5tjàÀ`„éH)Ÿ÷ ²‘S2B;çüÆÛìÑ’ÐJÊ,S¤~,• iλ.a’Á)CY¦$`yf½7¥@‡æüEÎì8÷òn\þñ È?CCÆG¾ò§”ÊÝcŸÄo|÷Eÿ}î{Ÿô]¸xÉLn²“Ÿ òOY~Ÿž¿ÊÙ”('‡{õNµtÔ$LÖä>ò!MkæK¬¢€ ¨J]f øfš64˜0¼½±uU—(u€ø$Øu-èu€ [`ÊÔÌäLЄ'8 )Hi+ˆq¦:cG€š#!{v…h e¶áNð$O-DOà¡âX÷tIX…„Âašf_¥WhPˆ2¸!…TècuGØ„`H/¨-z²OýD(»B†ZHuhˆN_ø„•P¶7„D9¢‚]jÄtþC÷XeN ðà €f˜…ÈdªƒQ“˜0P´ˆÈш‰æDˆ›ødµÂ @ U$eR(¥R¶á‰˜G¢¨ˆ¤Hjbˆ‡æl^•kbÈ„½VT—pT¼¨dLPHo ‰fð|º(K¼–ŒÖ·!¾Œè™PŒDpŒæ”‹¿øk¿Ç†Ãp úcƒUuUYEŒÆ˜GÚÂVb5€¶Ø^á´Ïv%n~¥m#‰teW¤…¶q Çà† ‰‡‡xYãÖ/W¹!ûn]XÁ™Gòè0Ç‘¤E‘ÜÁ+”$ˆ¥XŒõÉK9ÞÆ?fYµøŽÚ3þ+ì†;u3™7 29‰&÷‡0“œuo§DÉ8GÙ€”ÇYÿv4(c7 ö”C•Éq{LÙ#W”©ƒ•Yù [É•§ã•_Éa)–ŸC–e©gù=ƒPjj¹–‚¬Q—vy—u€—|Ù—~É®!—­ÃQ˜†y˜…錈٘Žù˜!‚9™N ”™™=" ¥à  ™ ©©à< gš¨)­à ´pš°x` ´pN° ±™›y1ž)² ºœu,0œ ` œÊù` ?0‰à0°œÔ¹£à@aþÕÙgѵP3  ¤à椧PSð ¹pžðÙ|p›‰PŸöY ¦Ÿú™-àþùŸÿ+°ŸJ Š þ‰ Zžú Sa þ ¡Zêš¡Qq¡Ú¡MÁ¡¢H¢"Z¢CA¢&š¢>¢*Ú¢9Á¢.£4£2Z£/A£6š£*£:Ú£%Á£>¤ ¤BZ¤A¤Fš¤¤Jmp=P¥R:¥TZ¥Vz¥wÓ °XÚ¥^ú¥`¦b*8mÐmðv¦jº¦lÚ¦nú¦p§r:§tZ§vz§xš§zº§|Ú§~ú§€ª§¨þ„Z¨†z¨ˆš¨Šº¨rúeÊmà E0©”Z©–z©˜š©šº©œÚ©žú© ª¢:ª¤Zª¦zª¨šª— ªÚ©¬Úª°«²:«´Z«¶z«›ê º‘Š«¾ú«À¬ÂŠ«Ñ@• ÑP _@©_ ¯*Ø j0©ÒJ­ÖÚÅp ²úªš ®Ã:®äZ®æz®¢ª«f*©èÚ®îú®ðú©‘ ¼0©¼ ‘ ¬Ö€”JÖ­“Z¾0Ö°[°E@PP¨0 ±*®˜ ±ñ:±[±{©ê ©ìz±Û±«ª¹€ " "k­vp ”Ц;©bÀþ[-û²“º «¬“ZÖ¿€ÖêØÀÍ “*¾€wÕP­t3©_° ¿Àn`­)ð ið¹ ´Xp \ $`­·07ûµ`¶š±¼º±b{¶hû±÷ªv@©ð”`Eð ”ð+ ³.k³,›·[¨€°¨@zPÀ`­ÈP…€ X0©P‘@%P¸z;©/€ " É`­Õ0 $€([n€ £ cÀ Öê…¶ª»ºK¶Ñ«¬»²{®ÖP•ʪhàEP<»²…05ûª¿¼–úš€°¿ ©ë¶U[¹@ —J;¹E@ Íþë¶»0©‘“* "À²¿`­Š0»ä[¾Á꺻滾ìÛª` ÖP¯«¨À ¨ ´ÑÚØ0Þª¬úË¿2[~‹°‹P \@ ½`­ùZÛ;©‹ðN¡"³i°Àn{»“š…ía­ÍÚ¾ÜÁ¥Š¾¡¾<Â$|©!; $Û¼¯ú0 +±Ô[Á•º * ³_€Ó Íû¼“J ‡ _ w[½×+³¯zk©0\ÂLL |"ÜÄR̾‘ 40©4€¯1üÂÛÅ ¼° ‹°c z€ÃÖZˆ[Ë0©«£à ¯Š ×[¹£›¹ÔûªÐ€ dÌìºÄSüÇþåûÄÅ€\È««¦K©%¬0<Ä2¬ÄÚªÝ*Ã;pi` г?´“Ú 7  ÉûªnÀ¯º´¨À·`ÄJ Ò  À¯[lȲ¼º‚\„<˸œË¤êǺÜ˾\Ëq˾<ÌÄüÈÅ|̸ Ì!ÌÈÜ̲ÌËÎͬÌÁÌÒ|ÍØœÍÚ|±Ôì¤f»ÍàÎâ<οÚÍ Å€ ê¼ÎìÜÎîüÎðÏò<Ïô\Ïö|ÏøœÏú¼ÏüÜÏþüÏÐ=Ð]Ð}ÐÐ }ÐÅ Î Ñ=Ñ]Ñ}ÑѽÑÝÑÝÐëJÎ"=Ò$]Ò¡jÎaþÍ&½Ò,ÝÒҌҡÒ.=Ó4]Ó… Ó !Ó6½Ó<ÝÓ¼«¯ûÍ>=ÔD]Ôh‹Ó ¡ÓF½ÔLÝÔäŠÔ Ñ=ÕT]ÕV}ÕXÕZ½Õ\ÍÐÍRÝÕb=Öd]Öf}ÖhÖ ÒëÔnýÖp-¬P­J×v}×x«@¾B}®/ ¢úª@ ¬* /׈Ø#<× Qׯ¼ª¦JØð½¡úª×pÅ΋ ¬ØœÝÙ¬ËØáØ•=ª¼ »=©Å ´“* ;àÙ®ýÚb Ú!Ú  ͘ê ò;ÚÔ5 Û¾ýÛ+ÛAÛѵS«Âþ›Á z ”]8«³<[_þpµY»µ6›´E Ð ÜÜÝÝç*ÜAܚ˹žËÅ¢:Á”ÚÆ„;©¡;º¥kÞ“JÜëÝô]ßå¼×!Üל­ÙËÀóíÈžŠÞ“š¼ËÛ½”-á«·â*ßöÝà.«àMâ}Çð½ÜÍ]ÀœÀE€Á++®Úýà âŒßP¬ß›:Ä>ª¾pÅkÆE€Ä½Û½-â4^ã™á1á⺲r,ª¼Ø“:Æe<½y¼Ç},³ÂÛ6¾äKŽã¡ã¬·£lÛ• “=©•|É™,ݬìʰ|·" ÙL>æ6îä´@Û·úשjØdÞæ"næhîær>çßM⃼±~³Ë}Cçþ|Þçkç¶lâ~>脬p.腞芫‡¾èŽþèèÁŒè^é–®©^±j®Ûƒ]؇}é ^Ó™>±’ÝÜŸjÙ˜ bê¬ÎÒ£~Ú–êð´û­°­“l¯¦­Û©M©¬ÝêÀ^Ò¯®ÛÎz ÐP·µ®· ˰IŒÛ£:ļìÒNί®ÍÀØ ëV‹µZ›ÜàŠÖPÖ áÊjÜT[áE@³“ÊÜ”úÜ;»íÕ]°ØýáÓ^ïÛüêË i,Ê¢Kº‰ ±ÂE@®¬›Û¹Ÿëȼá¬Þ’ÛÞþ^á nïͯn½“š ¯ê½à+³£ æVžÄÐß ¬þàÅ{¼ O©^©³ >Ä_ñ2̯žª ¯Êá2Ë uóïQ®ðÓËîlÀ|ÁuSáô>óJ?Ì¿ÃGœÄQÎÀØõŸ¯;Žî4<©+ÞâÓ ãJ,³Ñ¾ôb¯Ëø®ï…Px¬ÇzÀÇ“Úã_ð«ÍâWoò_ÌìöZðBîâE¾öGN½I>ö€?˯ À€íX€ò_Ðå¯ÌÞ¤,îä>©àNá ɹ.õ”嘼ʭ¼øtŸÝ«ø ?ÅÃN©|p ~ ÷¥Êæ¡¿úM<ìɰ Š€ ‰Ìú´ÏÙà ¨€ À°Ùµßûw=ú¾ü‰ üÂ_üvMüÆŸüNüÊßüEþÍüÎý<üTî®.ª›^Û“ÚéE úÒÿýc+éËlâÕ߮ת¥ë—ñŸþîÿç!©åOìýììã»®ýEÐë«ÝÚïÿÿQD`_mhD˜PáB†´ÚøQ ‰-^”H1#FŽ5jìˆÑ¯?F 0¦äJ–-]¾„SæLš5mÞÄ™SçNž=}²,ØPèЃ#êiÆ››“?¦8¦Iš¡”Ò<É5Ñ 6.ÍôL4)P„/.Ū©™˜â×Õ¬E*e ¶È,ǸD#1ñ*Ь¥ù…Fà1ý<·îݼE(€¬Q¥Ÿ•-_ÆœYófÎ=þ®”èh…FÚ@V¨²¦rAâE1/£d_›˜z5¹j¨‰D `«ÙÆ‚»jÕ¬åºA6JÍf½ˆŠ†žBÅ‹¤‰4P;wïÐ¥Sw‘DÐíÝ¿‡_þ|úîE“ÆoZ ¥¶¹Z;žh"@À""aϱþ(s,2+"•L?ü“KšÂŠã—‰èh°¼GŒHC:Lo õêƒ1Fg¤±Fwº¿Ñôû.¼ÿÒ7Ç|D°7§Z."3R#”+ ?úb Eªá‚’^Û°ˆ+³Üò»)[‹ÁÏD3M5×dó§uŠG ‹Àþ°Gv òH/d$=)9D/ÔÈsÎ:5ºa”°$ú :„QGJtQ?Sj3SM7å´Óß„³!—)£9®Á‚„Q¼ÈÓµR )c#åo_ò$ÕT¹ A&=ø€ÀÆðuÒ"xfØbåÕW`É,B’<¥¶Zk¯Åö&PC]ˆÇ·–Ò(—'K¡Uaت«¯„²—41Ïoãö h¤ÑDDŒÜá†4¬©`@l6ì÷߀çº7ß}ÏHl|Ì6b‰'¦ØÓm¹MˆGü¬ñ…diæ…ŠG&¹d“é»㢂å‰ã“_†9f™gŽ)e•5ÎÉešwæ¹gŸ)þ¶cœ&ºh£Ž9hn‡Fºi§Ÿ†šM¥Ce:j«¯Æ:ëΦ†³j­¿;l±]âZG¯ÇF;mµµ.;?–©ý&]ÒÈJtž•¦¸] ym¿ÿö¬mÒÎfsï–H˜n®¡#¼c2œ¥\¼rËÝ4HeQ߆¼&—_)ò•xñâ%ŠY÷"ÐMÏ›ï.‡=v›ß‘s˜V/és½[jÚ–Dç½svcÂTvã*sÍ»}€½(¢Ë.¼:,°!H°Á¦„uç+zÆò–Œ,³ÐrL-¶²O \¹ÄŸÞ±ç‹¨>1 ûËzŤoì1&UWVÄb¾³¤e-tKûþè¥øõo~õk˜™7A F„vDá®#óL§:EOwŒ´ Ý CVŽÙ`Ñ3<¹G8Ä1r”ÜÕ4E…Ô ‰Bè'p;", ¡e‡ÉùMp†ã"ÊP 4tް„ˆBþÐ;ExQµHÁ Æ©y ˆŠ8ä¡"ˆˆDF2TŸÀ(F]oL‰Ð„T¡þ4…dˈ¢AÌŒ)ÚPç Ž*…öSÇ zü£z´EJÊ®‹BÉ`•"¥y KZ2Ò“ Mròºó’’N)$Q6Å”ØsŒ&= &.Yé“azeSVç'$iI°äå&‰þäÊ7’Ò–´,S%• »KnNH”R”E…Ȉ¤±7•ÚH6%(B5i‘j 6Ÿ9i Ä‘ŠH9‹ N=íRHÛT¡),væME(Þ2õé·f2$ƒiÖ¯‚E,= m) ›sBôY,V­nåÍ„¾*Šqh°üDPc!KYeV¯ -TÒj;¶Â•E›’Q#qôQÑòÝ>e:¶~2oœö—¾R0€qpIÚ^÷|œ*Œ|q¼ !/6¥¨:O‰ÄAªyêÂZcåŒS#IEçåÔ„AÕOW-‚à 6S¶~­¦¥±]ÏæFdlF}kk^Ù¦þ¼åe,®zl`—ùV¿ Ö°‡­$aB8Ä6Ö±iSìÊ;YÊò“¯}•le5»Ù½b®œmhY‡üuœ7™+Kêv·öàU´¯ ,i ‡»E]q] Ýâמɭ¶¿•©lM«'œŽuE@Ý{„ñ:à6wŸÂ m[2’ãJ×2ùtnv·]§¤Ë+$e\tÀ¶ÜzùKLÁÒI‹h{Þ+œЙ Ê€¼X]LüÀ' j׿ÈãnnšÃ†éiÂPMtiD$Ú);Vä`t<8ÄŠ(t5²jF ŠPˆbä%Íp ƒ•3źh’ÿE±%/‹Ù .¼ñçG ™ þF2ŒŽ¤°D¬‰ˆL‚ñž9ǯ葒Lq’cà!)²ÀQZ^lÞY‚RL¤(ÙCéë eÌK0¯|JY¦µ¿JF³Ú˜  ëIxú&t)¤sJêQõ|òE¬YdØ¡E("AQp‚DàG¸¿žp†Ï{ÛšclÃ%®ä…Ÿ¶2âÎ@ìFsOÜãP«8q-s[Åq¢ÜÇU>Ú‡ßl¸Á³‰ŸŒ[òä d¹+ÇùÑBsÏY0¦¹Þ¡s>tš­Ù»ßkS³·l¤©“T†àþÆ NN†èWßÙšKH`\!V5C…ä§î0ÂçÁ¡‘²ˆu¶¿lÍm–'8ãL_Š’Ý|,ò¡µö¶÷}dk&R‚ò”†(;)ðu•¿då\BËê~‡<ÐZ.´æÁ]˜wÒˆ¡2ßæ7ÿ§Îé4V¡$ôÈ—þžZkv´ØMžªUÝë ¦t OéÖ ä Ét6mj‘>ô?­6}ð«etZ7ýÖ¿(×€v^õ½>:~òƒøÓU­Õ~òµ…¿}NÑ;&ß® ÆaÒqî—_MÞo »Ý oó·?kèg‰½ñí~úcmçõÇ?àîŸþCvòK{¹þ@±Ù¿4@ûû?ª ÀdÀtKÀ®YÀ¿ŽX-Ž™ÄÀšy@³‰À÷Ð’ûÝB¹|ËÀä&#c° .ð‚ƒ±®Ý‰®ˆ˜¹D®Ô¹9ÄÁŽ`²2Ð1°åxÁ™ -?¡®’»•ÈÁ%´&KƒÆðˆSšõJ+BþûŠŠ©¨Šõ9—û¢ºÿ:ôÂ/þY¯ÿy<&DCsÚ@·‰aðð-^Ú  ’°r¡%šØ Ú°Â:¢?ž²ƒ0:D»½;±4\B\ HJ`†þñ=º#A¤B²Q’#MÄ»;£"¨Ä<ã;EÌÁƒû‚\Pá%Yj¼Tú%s¹´ñÅ»¥M*&k;3R,ÁŠSƒb (hªxê¦á³<ñv4Á”‘ ä› 4ȃŒÆÚiȈ¬„”ÈŠ\Š´ÈŒü”‡Ä ÔȤŒÉ‘DŽô"’DÉó3ILòHŒÂùxIËPH—Ô8Öʸ™ ¿”„µXË,\“˜ü T-:™è-\‘$¢6Ê¡l‰tÊš»IÕ)‰DJ´QÊÚR“¦,Ê•8B|AС-Ò»ÊÎâÉÒòˆ)̯þ9:¹‹²( ¹X†_à‚T“ºø!"/t¯îù/”¦¹¬Kâ·<½à‹*„KôùÀLµN¢Âý*‚0DŒ1œ:ÿ¥öR:Ä,̪³Â*K¬\IgrŠ9$±­k!%‚¡þ"xd5H†³›0Õ±Ø[(@l0‹XÍÖ|Ís¢"¸ÃÔ,1ßDMïÈM×4›CB$Ø\¡A‚"øM&Šˆè4±ÏÜIžÌ Jı=¡“>±Ä8ˆP$¢›»>!O=C¨MLD,B$=RG™‘ Å<ê£ùÄùä9ÍûNˆˆ8êÏõ´NÒP´±=úDþ`c‹=ËDÁs.PÚòRûB…Eh§óLÒÃ;PÜÎAJÒ÷äÿÄ"½\–›ÖæØ1€¶XZ\C¢ÐV\¼0y^¹Ðk07CÐ~\ŠåPJ@Ývb¥Â«%$©Å1&žk¥]%+¹ÐÍÅámøë=ÛÑuZF;=jºi Í]4]ZÁƒÝÏõˆB »ô´¹ÓˆÏKÆ;»ß«¦yúÑá™à'…ß«‘_vù[3ýRtÔ4s,GâF¸ÛÚàPƒeø2aÙà7‹B¸ ì:KˆÜ«SN`‰ÈÓ(úSqüS˜ºàAÙžäO˜T¡zZO=U£²*Smþbƒ1’/€½Y¶¡»È`Á ɵ*NbL–]ÞÈ]ã5_«¾`ƒbbcâ­êªðZN­Ç¯rU}L+Z bâ½Õ–|ðKךèUŸøÕ;.yíõ{7Av.Bæù#AD-Evd„äHFÉI¦ä‘´äKþÈLÖäŒädŸÙÕ0eלé te‰Qæˆ@îd‰€dS®–{½É|%eÎpe˜“eŽà×U>Á!&Ѐ.€ œ8W„µ¸‰Ø›œØ›¨å”õIŽHælŠæÒe‘àånKáŽ9º Ùb¶‘•ºeæ¹cU橬X žfj.Þgz*ôZ€ Ç\KœuŒ¡-ÚÛôþÉBª° úY1t C%̸\Ìž¥Ìø‘LýÙZˆf€ÃB©Ðg.|Šª¥¾ˆ£•g¯}Ìù¡@׸¯ÑhvQÑsfåj®Òþ³)JÜ)Ö¸õätØ" [»\Ä&ÒÛ¸½"‹øÛà„\CŒÍà\VX°Þ‰­®N“nB”ŽBÈ@E Å$ÕˆÑõ“ùÔ#Óý^—ñÏL\ݼk#¹n3ß%àðÜNܽÏÝå918c8†äÕëó”1']ôü_Ï%à:¡k$tìØ3$CëŠP·/þ“kE¦ˆÞAôP=™Þêí¥öÝG'y£ÓEÑÅ-‘7QƻťÆSt9ì³Ó¾-›V$Qó¥$dÆå]Ï’îl‚Pkâ*T <ƒëü5!í\àßÌkÒo´ß‹P'6ûß ®_ÐTÐb¯z1õæÕ`¹ ohv#…ÎaØl‡öØçF?_@ƒNk馨½8Åa 55ÞÓ-½Saé´Ý;Ø;¡?åàst–`±a¶SÇ" ¨^D°†ð`ðX–݃(³ˆƨ¯®åN(¼mÃ@ílô£‚ºÕY¾æ´Šã%6«›šbN=q!_´Bþ—â‹ÕW]L%Vc¨"Õ'¶<¶6.HŒ"¸…hˆp×´RÕˆ8bf3ŽÞq…E<çCâˆ(ÈçVÃtž >æpVMu‰?Þ =÷U>ç¬4döÓ;‡óÃÊJFöB/tÁúäEgÂFwth”óHPH§ô]ŒnŸ‰P^Tž E¯P¯O¿?O´VNôþ¬*§¼åO™eV¿ˆ\Ž·5ƒ `Æ­fÎ%Xf†Ác¾Ñgææ3‰Œ-ØþØœ!æ‘ S¦-a'®‹u¸I–kæ’ãØ§Éq&GvwÊÈv}ý‰ZY‘ gÍpvrŽT˜u5ï[çxN ñþ’‹wþŸŽ>Lƒ›•ŸÃÔèNéL·pZa9èô’wËÄ›°-Ìy¿Ú¼´è€¾B¨è-ägy/ç}ÇÙÿŸ‘¶†vhˆ¦x-Üç×M‹Ž: ¤gÕ.xû²h*Ìè–ŸŽNxvYª]‘nù±•7zSi¯^¡ÏR¹™î §"Ú¼°ÂÛâÜM?êòHj¹ÊzÙìÍÊê=äi?ôémGÛ¤gq¥µŒnê§Îi©æÃž>—ÙÄj_~#©i¹Øj·Ÿ¢‹Øê9ìj£ßïÿáG·/k¼‰Q<7[gk·ÞÎë&Ýqºl¹ØÜÎÕ#ûÖì6«_É'l@22ªÿ]øœ§þñt2Ànl'Ï0}ü`?ùïŠ@lÅflLÌlB‚ìÜEöÓM]¸;ÏÑF¸‹üyj|–}ýÊ>3Â϶ÏíÆmñMÐòíP,“¥bGÞâ®O"ëD'kÞëß*Ã¥ÝwõÝPäÔuí/oP¿'¢ãeìR²þè7$ŒXß~íî›_mëPVŠû ½^ã.íñÇPå_æˆ"Š 4ð „ 2lèð!Ĉ'R¬hQ¢¯6´6rìèñ#HZm|0°*7F%¤”K`.“Ed ü‚•@šEV&Ô©s N—0 Î<(´H.¢GMšS ¯CmâÜɡ̟=RþóE̦Z–H©ë׬eÉZ8–fS¢A_"%º*¨DñÄk¼1Ç{ü1È®)¼°l S *ØómÈ-/„²ÊrÖ™Ë5Û|3Î9ë¼ÐÈ$‡dòÎA =4ÑE}4Å=ûüÐH;ý4ÔQK=õÎJ/ÝQÓTk½5×]{ýuEV_M›º`›}6Úi«­³Øcg½6ÜqË=7Ý"›;6Óe×í1ÅK‘LPríi„OdxE}ï]xD† ‚øÞ³}7ÞXëÍøâC*Î „.Ð54h¾ä‡+˜yâ]CÅé™çâmÎm_m²a\S(逗ñ…m8kUzC›/Ä‹©QŒ£«¼[­KÄþüóη&|jÀs‘¼é}q\ûòGnßý÷?î;å•“½–Ë<1=àc¤ÐûÍ¿W/=B¾ùyŽËçÿ¢'$êzÔ‘ñ ‚kŒbÖ°UøŒ´À>4¦Á™ì–F» ‚ÁÂ1¸ ZÒL¬‘†_Øê05¡I8“[Å… iFHÓ 4±ˆG\ã_ÒˆÈ"äþ‚žR¤’E3Q‘,Bß™8òq†5Tˆ ¯q> „1T´"ö°@4Z’.–ô D"‰—œä!³T@ãƒrœ grRGFªP~tÈzA©H1ä•¢õÑÎ0¨`‰4 %†_X&€ÁT>ZË’v&Š` 3Œ¡ T»¸’m¯”ÙÕa´AmID“Ú–ö ¼õ-0g6ÜÚÞ–X™K_ŽÛZ¼6¦Üî@¤{V†ˆáÆ8†rÒÜHäÖ¹of±<ô.W¼º-nL¢+ÚéV—«±FD€ ™ —5þåDz¡‘Úé÷¿™=qшŠEdw¾•ÉJ}Õ»J¬€ï †“0~¿¹ß"HX'ÚIÙ«£ Ó¤ƒá'G6ø„®i0k°GÞ¾,¢\ Ä6uòb?|у5.$“E ÃL4SQ_vlÔøÆ9ž€™\ä%»˜eJ>²gˆld^É·I6krÇ4Ç13þ€3ÅÀ¨ˆWeÞ¦§Ö¢e*«¨ËÄÌ•³âã87øÂz9(Øly3³5ç#SB¶ÉóƒsâcDOø •í­aBi?ZДÖ1šÙ ‘K_V’£©Y}¶AR¦$3¡1mt#Wg )‹þ ZÀRkÈÐz ²@Ïâ]a)éuH…–lA—×W±MT¦âdã/z)’µkYó¹/Ê&¶Šš™g'”ù‚˜q ì{(“¥ò¥óëÀfÙ¹ÎJ!(ñÅc“;Ò.úuIè]„d.ó!²F·ºS)÷è„Ú¢N®Y¾ÍnZðÄ(N´ss£ß´sXBNU$á(Û$’‰€ô³k±H ª-ˆÓ”Ëä;áÏŠ4Fµ([3ªQ_H.Ÿƒ¤g= ùÆ·;¡ ](C2³ `Tôòr«ˆæ>92#túhEä± €˜—ÁGõ~øÔ-ÒlY½(…¸þÁr^ò]$í^wH è@±'$í< »ÑÛræl]Wi.BÞ)èH YūȓÕ(,i‰K^òU¢&¥¨45*ÛÂ’ ¨0Å+8V«Q‡úÕLNyEJYJôzⓟ6oªs³õ¢ÒU&#ùèDÂs½BTMJ¿Ýe ¤V·ÊU¶£¾–Ó'ŠøÙ ýíU”{Òs>:Χӫ¾N O±Š«¯ÈõUÄ|‹„ê¬`v!Šîþ3?öK÷ftïà»>üyºýÀ_óíO>DÌ_ýÀŽf]Üú Æ½ÝÌßÌK½¼ ÀTÌ.ã•[ET ‘h Ôp B\ ÇHNã‰ÓÛþ<ÄÅH Ò4 êÀÍ ì™ ® ¹´à Ê`ÂlVå” CÀÌʤ  þ`NƒÑ a¾â&¡>!FỤÉ4¡^!f¡bĺÍål!†¡f!.ŒŽ!¦¡ÎM¢Ë®!Æ¡RMžË %Ä àÄà‘ø¡¹UbÐãâý¬‰àAÔá’Ü!}L"˜ï P‹q "vfbÎÏê‘pâÐÐë°Œ#2 9†íàŽ¡Å(Úóñ OLj¢¶¡†-*]‘Lb‘Îî¡FÄõð°SªôK.‚’1ª EÃþ( Ä)ÎÆªµÏûø1b`ö0þO2Zc%¢kðb"&£-€ü£ÁO2Oét£+†",QDiäOÎ9a–/uÒôA†4Q5ÍÑ0….‘,µR E‹é^d ÙýcÁ[O@] d]Ó!]’Dþ‡EJRåRA.Ò>žÉB Ó'õÄ’=«™’÷),ÏGSÅ#á’ -m$]dÅL¾’ŽÜP•P³°ÛLvä#i¤-]dH$“ñR>:‘ry’Iô#ͨA4e_%R*„3=c)Y¥Iþ’NÒRÆcVj‘SÒ¤E¥ }Ó©EcÉÜc˜:Ùþy‡;õc„cÍÄV…T]•ÔIUÐAÆ_jUjÙD)SÝ¥KébO¤Ta”DA–\1ÔG5UaZTTÙP¦J¦L$æVu[b DX•uTÄ…fg6æZ½ÛURONíTOýf•£P&c œIìø˜wLÕlþ¥§ô¦dU¦TÝU^ÕTdºß=¥V_…p"Ä`ò¥c”r*b}•j.VwÎÓf”T\ùf[¹ÕAl'dü•ršX#Ö£¥ba|V|˜¸ý–€ÙƇQvN%‚1×{ÛeÈkåD}1¦„(þX{n‰Ø‡yŠˆ¨{™‚Âdh}þu[d˜~ñ—»ù—ˆIØjt×w……Þ™ˆeEŠþgóAly[Iè~:Ø„Øj¨‚ áŽ.(uºÖ@tØó,c‚ÉăòèB`X~m’6‘þ—ŽŠˆ’Ö–ØöVkQH¡Ý†}ªÚ=®X‹Aš‹É`|ÚA i˜)ÈM–±…Íd¸©9dPš›F¨œÉéèÝiÄ"j¶Ô)žÙž*†üY å¡%š.Ù˜™µÆ2¬ÙÊ)ÝQ*œO ÙFª® ©ˆªÈ¢eE£µi¨9ʤqê+þĩҘ«ºØ &Ħ9ª§Í*¨ñ˜ùE"™ê¤:Ù™8Õ'bœ_”Rþ¯õ§¯1ÜA8œšÅ½1[‚:Û1FÛ¹M[¿Ý¢}yÛ´žµ¢%d|¯0+´v«`¤ÛºåDŽ \Æù+DXÛ^d*·Ê[¼hbÜ|ÉÅZôZ©®¹æD¾í[[0ã½Ö„³hÄýÄÀâkU,Cœº*À ŶYvrŰˆ¬ì<+>Þmh\ˇ^zœËƒ^Ò+wâ‡ÊéÊÏ™‡Ö½¬NÝÊ Òl ²Rõ¸²œÎÑ^Ì ­ŠÔlÖÎ"ì@Ü؉Ù™Ý;JËö"…X†hÈÐjêΆˆ§ÄÉ‘GdKá­®´I¼]Üž{ê„Ý1VòþÜÌ~ÏÊ]‹h…ßEm็׹m¯Î-m"í×VÅÙ‚ TŒiÒ%äA‰ð˦Xdô_öýý€žíñJI_õIGï üYîg”[@_ RKç’n_˜n¶l®ìYËA\Ÿæé÷©LF„êN.摟7Ÿ#áJ×Þ«Lä_ØÖİlK¶´_î~Jæö…ú±ßã¾íAPn;"ëê.ð½n£àßîjŸQ/çÎúêù¹ö¢^û )*®~¡D, Ôìáix ¸ÐoÀد@ ."âokð¯ÓøïÚ0â" #B#ûº¡û:Ä fÌR Â`G°B<°×Èel@âAð ËH°Óþ¡¾"‹¡ÿL‡0 §° 'ÍÛá ¯0 ǰ I ƒÏ0ç°;D çÍÿ0ñCôð8 ±q±å 17q +qн°O1‡!'`g±‹á#ë1Gaßp—±ŸÍKñ¯1Wp ?¢·±ÏñÓ¤1ß1Óá£b‡¡{ b¡²þ±;²Ù 2"/2#·Œ"72$G2 +K²%_òj<2&o2'‰&w2(‡òi|²(—²)óðKcŸ2+ƒ2)·2,›ò+·¢üÆcþà"Æ],ï²Rò*gOç°b<^¢ ’¢þò223Ä,'¢,ò-ž.#:2„3&³5+Ä2ã"TìO6b­ÑT¯<^Ð5³˜úòApåI²I"¤&é):“¥IHó@ˆ%Hªe%-’Ya¤G$&e‡TÔù~“Vò#Dî‘Á%9“ó#ËçyÊæQ¦ÍZ—}”'dfþ\§gZ&rF4B ¼À§§Pf„A3ÌO! ¥À µg‚À'ÊYô|†éBóò#7i•ŠX³9( „NØ”Nè•Ó[rPU`èR"Ä4`ƒ­øB£O–öN{)>Ö´5?2Ÿ®j¨zYèéVóꄱé¯nY­%E}Å*ºÊDz þV•¼Ï/µˆî)°nª°Ò*±žVÇò'춆[µbk³Fl`ÞÅJkÇf‹Ü€pì²­u¿ 2ØÁ9" ƒmþ±bGv°h«B„l_Ût*Ïeݱ,ಅÒÊ„ÎAÚ¥v¶n}Ð-¯~®@0wçÎ÷f¯æ]¯ÆRÙõ./¬´J@„—ˆkí¡ßåeoúsrÃr6¯F-[×o M··r—öÿ2~÷÷¿·8¸€8¸'8#¸‚ãÌ¢6xÑ08„׌ <ø„Íþ·§†o8‡w¸‡8ˆ‡¸ˆ8‰—¸‰Ÿ8Ч¸Š‹¸XÀŠ¿8ŒÇ¸ŒÏ8׸ßx[éwH<‚ô¸ÿ8¹9‘¹‘9’'¹’/9“7¹“?9”G¹”O9’kP•g¹–o9—w¹—9˜‡9“?±–¹™Ÿ9š§¹š¯9›·yH$€€¸9×¹ß9žç¹žï9Ÿ÷¹Ÿÿ9 “ )è‚8:¢'º¢/:£7º£?:¤GúÂä‚tB-ô¤gº¦o:§wº§:¨Û¹)Ä-œB ¬@¨§ºª¯:«·º«¿:¯@ ø-LÁ+̬纮ï:¯÷º¯Kz¼Bþ,lĬ¯;²'»²/;³£K±sD°{³O;µW»µ_»¤Û:p„¬Ó:¶;¸‡»¸;ž‚.BGŒ:¹¯;»·»»‹û¥{¥w»׻½ß;¾·z"8Á(x€€*ä»À<Á| «‚ À,<ÃWA<ÄG¼ÄO<¶€\<B \üÅÓ;Å<ȇ¼È{„)8Œ<ʧ¼Ê|ÉŸüÊ¿<ÌǼ¸·¼Ì×¼Íß<²Ó<Îï<Ï÷|¨ë¼Ï½Ð½¢=Ñ=Ò'½›½Ò7½Ó?=Þ0=ÔO=ÕW=É›¼Õg½ÖO½Ôo½×=Ïw=Ø=Ù¯¼Ø—=Ú§ýÄŸþ½Ú·½Ûã;Û¿½ÜÏý¸Ç=Ýß=Þ«ùàxŠ[€Èߣxä=áWýÞ×â'¾â/>ã7¾ã?>äG¾äO>åW~Áà¾æ;ýÞwç>臾è>é—¾éŸ>ê§¾ê¯~¼Aæo>ì}ç³>í×¾íß>î—¾ëÇ>ïýìç>ð¿ð ÿî÷¾ñóüï¿ò/?ó“~ñ?ô×|ò7?õWð?ôgÿÊO¿õw?î€òc¿ö¿Ès¿÷«>øŸúÿë“¿û¼ùwÁad°‚çG@C1ô@|þ@IãY“.]Tˆð ‡Åö`³bE‹^l¨þ‘ãÅ7yh…9’dI“'Q¦T¹’eK—/aÆ”9“fM›7qæÔ¹“gOŸ?KNÈX1£«aÑ*u ÂÅǰa>¸9ˆI†3WlêXÛH1cFÔî`#Ò‘,׎CËvü”m[·oáÆ•;—n]»wu ½ˆvCš.5’,\Sã`š ‰nU8xk“=šPi˜ƒ I®:{Ã¥˜¥‰tµU1 ç Òt$‚è$¨ÕÜœ‰.Úè£gÚ9è¥5ú™i iFZê©©.Zé§±ÎZë.¢®Úë¯Á>÷ê­É.Ûå®ÃN[íµÛì·á¶m¶é®ÛnßÜŽ[o¸ç¾Ûï¿g+ï½ ßºïÀO\q˜/Üq¦_\òÉr)oüñËyŽœòÍ9÷[(A]ôÑI/ÝôÓQOÝô¡;oÝõ»¯˜@öÙi¯ÝöÛqÏ]÷ÝyïÝ÷ßgwàõá‰/Þøã‘O^ùå™oÞùç¡^ú驯Þúë±Ï^ûí¹ïÞûïÁ_üñÉ/ßüóÑO_ýõÙ—) ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_i.gif000066400000000000000000000220421343257752000270210ustar00rootroot00000000000000GIF89a`#猂„LB<äÂÄŒJD\Ä‚„$"$|b\Ä¢¤lVL¬†|Œjd<2,ľ¼´jl\NL ôêì´–”d24ŒvtìÒÔ\F4dRT ìÂĬZ\lZ\¬ŠŒŒnd<64üúüüÒÔ\JDÔªœ$üÊÌÌšœ4*$´’„œ~t„亼  ”*,”rlD6,¼~|dRL„jl,&$Ì¢¤”z|¤‚„”ŽŒLBDäÆÄÄŠŒ|bdlVT¬Š|<24T><œ><¬žœÜ®œ´’”ä¶´|jlÄžœŒrt<.,ôÊÌŒ¼z|¼šœ´nlìÖÔÄšŒÜ¶´äÎÌ„ ¬^\üþü„ä¾¼”.,„nl̦¤¤†„\FDD:<Ô¦œ$´Ž„œzt t^\¼–ŒTBDL:<Œnl4*,D64ÿÿþ!ùµ,`#þ- H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«;3ØÊµ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pã¶ÍàQxóêÝË·¯ß¿€ L¸°áÈ+^̸±cÄHÔ¥ñ¤²å˘3kÞ̹³çÏ C‹  réѨS«^ͺµëÖ4$w@ùµíÛ¸s_>}Z·ïßÀƒÃ–Í‘¶ðãÈ[÷ÞmÚs¤L4¨‘¼ºõë›cOÆÎ½û“å–yþwö Á«W¤˜òξýmí³k»Ÿïûô 1R"ÿdJl¼0Fe€àp™±4^eþ( ‚ 6à€ôU¨|ÅÉgᆬ†C"U´$‰€¬RY\I~WY‰'¦ãi4¢¨"‡<²†áFÆõ($i•Í@Ý5ðGÆzOA‰iL\Æ .Y™“7Vfe“Oé%h?jä—dfvÚQ>1¥‚Yছ+¶h$HdùD›oR)ãy‚WæŸO„™Ñ˜€–yš‘•%©`(r^‹–)ðBewPøÊiŒfVie—V–i¡ Z&(F„†:äi 4PE#*X¢ þƒÔpEe¦”w^zLžÃЂc"°ÊZ™®¼ú:#°±Îjj™£^Tê²<žÆ„lH±_„7qG"Xö)‚†·ÜAIöe»m·H–{nºÚr -™ÍZôì¼øf6Iäë/jõVtï¿þ‚Á'ÜYÀ ¬ðÃ'ÌðDGlñÅ¡N,ÑèàñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4»ÌÁQÒçÎ<÷ìóÏ@-ôÐDmôÑH'­ôÒL7ítŸ”l‡ñÔTƒªqDW­õÖî] QÖ\‡-vr^?öØh§[Ù­öÛpLÆm÷Ýr{ÄqþÍ|÷í÷߀.øà„Ï|sÎO'®øâŒ7îøãGNtÔñámù埱ÝÛ˜w®¶æ qž\ o vš”C ž·nè ‰£™¬¡žéò«‚iºî{j°+$;‘¨Á@Kj§‘Ò{ nüîühÁ'4|h~fò1z‘àóÜ{=BÃóÖ%w|pdiyŽFI£Sa. þ7asé?aÊ ÝçŸÝÜbÖ o´€ÄppUÏ3Y Ð:‘&@ Ǫюô4†,èï‚—ùÞAÂgšWT¦‚Lͦ*C‰´à2[ÂÒž–B bPƒáàžB8CÑP–-¤À TOþo¢!­ºäBýÁ° 2\¸0/`fi€Ñ>ÅœzAYEÌß ’Ä*žF *(Þñ*s…@±Ç –²ôô†æeQ‹ü”ÿ>£'k4¶c’Bq‡"LAê’× -S«Þ½ñy[Èô‚“‚¼fu‡„£Ô"IIS%R cšj4YÉN†æ’–X¤'G‰PŠ’”¨DŽ)ç˜ÊV¶g•®Œ%}`)ËZz‡–ÉaâjH‡»' N—šæo„Ù&Brl¸D1E“Ç^ž]£Yfn¤Ù&îÎ[K&ñzyãaï Êûæu¨É]2™q$+=CÎÙ¹†×ëe;kXyZG—ÚþCç$ŸÐ¾÷ÅÏAªŸfLA)ÛA ŠPÓ èßȰ/p |a|Âú,ÓOJÀ¯?ò{Œš™…4¡§1iC¿óЈ’¢Å(g¡J¦!¤ †At¦£•HijSœªIˆ€Ò‰šAøÑÏi€JHü‰-™ t Ÿ#Ñ33~d‚Äp…u¬eý-<ø70¤àR0‹*0«Œ Ž„¸™³’Õ¬Së_ÕÊV¸u®q}k]7ó¡éÀ4 b¤6ƒ×­vuGÕÀcŸ €D´@D 0\ X™…¨U l`^?hÁ«¦ÓY*þá -“Â.ISuú*nMÓ(°u ¾e-¥([2I…zòÌnu›[ôö·Á}B 5Ã#…çH5°êfŠKÛãv©º˜¡v­Ý" I§á®e¦Ëµdê‡>äSý€ ‚D°!ˆ{ªï}áôŸÚIA7Ìá{øÃ>ñU3úÅïiÌ_ø·†Jä š0€41áy/å‹ß _ÆÃ¶ˆO£áøÚˆí}­½üE)RqA™40 ðGÆ4¶ñ!\8ñ2-öT£` L×øÆ3>òŽ#¼ðîf¼Ÿ ò‡\'[F¼‰"oÏ«(ËHù WÔgå,SÆ3¦1Y•cþg" Ò€?lvs«¨ o’ÑŒi@#W‘%¬AÂø2q†Ä›èAóøÏ_µL L¤YÓ¨ª ­;Ëœç3÷yÑŽ­Lg?›I39U«B-¥õü„6Š9C—ÙcÿØŸ@² wÜLB€ògÖµ¾Áœ}šf>AÕ~d¼ØE¥3¸¶µ‚’­ë%ÓY_ @Œ ²A i2vf€ÍêA¸šAÑžve˜°ƒ¤î€©UœVµ®õk>Û~¼;5Ý ÕÈ×$‚Õ€º÷—ŽéÚ}ÚòßdS±ÀÖI½ùŽgŽ6Îpß,¼áÀFðˆ[QÇ—}3ó »ÞcúùÀ‹Ô~Ú-¥Ö¿ÆõµêÕ«†}kbçºØMƒö b`]eRðØËrƯi= ðEëÁØ#V®tµ«e*ûú º3ÃßSôàú¶Êù‹ÕLf7þ €È&b²š™~e¦_}ãÃûœa²ùgŸü=Kp½­eùêÍÆõFÕ¶ƒ,ok±Œ$ü©€>5uŸ±\~b€rR^ú7\WfBÆu%¶õ|›a€™€á]¿™ae¦e A˜aø'] z^„Âõ(]xÉä`–D ölgbaö1Ð/n°=2ÈD Æ?hþÅd†C•Qbz‰vA˜_ö¥`F„Kø6ØM¸`OØ`QHƒéçE^Èaüub9·OËñbΦQ8ð BF¦c{2‡T"…§ácOEqHahv¨ xh;†øþ¸ƒx(IF‡xøl~Hdaˆ†•fYg†—ñ*hFˆ{b{F[7–¡‰}¦…gm&hw†?7j–¶F…ø§Hh©hhˆh˜iöi¸(‹µˆŠr–†¨f|Åd¤ˆE¦v‰WCÞ6liHnæÖ; øöŒëÂÌvk´¦l3t‹¾Æm–~öÚ†lÝØl{²Ä8…4%mÔfmØVçx츎é¸k±8б¦{‚‚THeØŒhSo®¡o…‚ ³rªço÷Ÿ4móqãdp­ƒp_‚‘³tÙ‘™Á‘’"‘›C‘"ù y’™’*¹q,7"Gþ<%·3 ‰wÃò’buªsÔ“;!s´ó“[ƒs<¢“ìÁ“3÷sÄNœá”‘h‚ÕD ð`S˜IÇ!HéJirO'Oì$•b‰Ò±p6ÉX§•$:\çup'zGzf‡vKåvlWx—Á¤`r9vÇ—g—TK•%õãwüä>õO‚‡>„GaAtùÁn}9ƒŒ7z|ǘ"5˜ig˜™~ µ'œY˜—Y>G—¨×#/X}¾g}ǧXšæY·—{ŠÖ{ŒæUÁäE‡u~²é~{ÅY´ù‰‡¶ ´|ªeY¹é|W9C¦%"º¤~½É~‹õšžèi`þY 0C8›œæi£ul¯É‚¬Ù–±SÝ#\HBPö8€Þõ…D†‚æ©‚õ©†Yf'Ë1Bå€ëÉ%6”OÀeÑy‚ù÷žúÉžüÙþI& 7Ù )ï 78Y![Ù’ W¯Ug‘ö7øº¯ÿÖ¯þZK°±4°ÛJ{°¨”°ÁÑ•À“DY“™!±È•¨A±…2¯”®´®D7tÝá“ +”›A²iÙs£a²¡b”ûãþ ktöù±•Á”D •ša³¿è䄳ÃT•'«Y©øê°c•d™AñtbZ´óANDLgù³©±–B˱1¤!€—$EapRryýU” ™–Éy€Yz‚i—è¶ ‡É>ŠT^K?Ÿ©p"™RõSo«™yFUšLåT©)¶S•· Dê¸àVTÿš£)-j+—Oez t? cµH¤!Ìœ°ÇN®¹œãXhUZ 1»BÓ‰~š»#×Ù£ÊW™ûš5•ωZ”•œÍ'º™Æ©ÄI}DZO0»§‘¹b©~㉻»Ø3 Òß©»âÙ»äé¹)زͨ^ J Íþé\ªB—±\dŠ¢íY‚˜¦¬K…Ä% Z²Ÿ±KgÝ»]æ[½*tˆâû Ú½Ô;¼ šŸ‡H¥ `rÊ Ú‚Ng¹\¤!H(†éz¢Mx£Þ«IØa-š£Wf„OPÀ4Z±3ÄÀ›aÁ'Z…”ÁUÄÀl¿Uª LG ¤B Â0V¤¦€b)ÀŠÄb_ʤßJ‰ƒ¸¾*©U„¦Yj)zÒ¥^VÃTF¨»Y$Ø%LRF‰ð+§[–Ä^*Eb¹¦vrˆÈ !5ð¦qÚŸ‡F§–(½¨Ffº©¡ºÃ‘:‹œõh´›™š†‘ºº‰º+‹šf:FOàŠ{¦FÇh •J»~‚Çþ‘ª‹›ÇŸ¦Æ§Ç_Õžºk‚ü²O@ª¦ê§…ªª•ÁªU»OâØjÐØ­L´åzÏ:¶˜±«{ cå ¬Ù:¬ÛŠ#Çz;í¶jã(HÌj ¡­Íj™\®ï(nj‚­k« µ\™,­XL¬»¶ËFõ­ƒ®×:®‡V®É [Žtø¯×Ü#ñê/+*2ŒI«°ûÍ¡Îf¢¯·¡‘âŒ1ӼΔÔÎî|HðÏY4ÏôìB)ù´š‹¥tû­»Ã “ ÍóšÏ¶Q=,]®sдMRK”Žœ³ÿBÐFÛ,ëÍ.{ÑÓT±4 ²<‹ÂU'Ò]p'º!þÑé‡Î¨´=FÎ`£ÏFìtIKUTÖfÒµ`g?™¶LíÖ …RD]yÿèÔ {ÖόהÀfè}²k çÁÌR ¼©ú~wrW¶›ºû| § Y¡Øœ!=ð-@  ð7 „ÅWÓ؉œWLdåWEåL«ØÑ‡ØOÚ“=Ú°§Î+tÚ0Vž:’fèćF ÕeGܽ§A€J½¸ÐJ^¼­"0+) ðC£þð½%ÈÛ+hÖÕ cÙm&ö·ŸÛ›[:¬—Í…Ýà­Ý|ú¿1l†,Ìd<” ¬¢' £,£\¶ž1¤6n7ÈDcð$MD Õ…5”…,\¤fmàlrÒÁ”Àõ³À¦…ûÅ îàT ƒvâÂ0¬ÛͼMÅõÛJ} P¼'”(Ä BÄaêñ â\¬K‰sðs €*ÁEÒˆ¼ÁÛLJÛz"âtzÄWºã9v('¾ˆ>^Ä¥ÍWB^ÄuºÞÞ‹ºÈšFد`ØGÜÇ$BÉŽjfy¼‰þx¨»Kåâ')€hiH@v2¨h f¾'‘š×—aåa^Š“š§þz ŒÃ˜Æ¡vq>ç¿Òçvnx^ç–,Ô.k«Êï2nžP-8PâÁü°Š¬°¬Éä8˘ÊLåè BÌ s0.…k÷(Ö×¶¶åzè‰ḇÌ.¤îɰ ÊÔ­•Ñꢎé›,ëÚéœñæ×Þ5Ðá·Ñ®¬±Í¢1§íTCíbsÐ0­¤©¡¯ ‰°YÌ~Ϲ§©ñPRpÅÒËB —MîÁaÏð.I9ïÿšíö~¯øžï 'ïüþ;ð,ÓÈ ± ûÏ$—:CÙÍÿ.åaœÎ }ĺ$²"­²˜Añ{’Ñ /ÍûîðÀ±Ð-Ò!m!Ý.þñ—\ï5×ñû•J›ÓÔ&ÏðóÆ§œ¹bÕ<¬&‚kŸvËnöáÔˆ™µNí˜T½‘¹ó´’z1/óý†¼;@ÇÖ}±óƒ]Ø%îÚ¿¢ØÇéº »Ü®ŸKò _œ ãšó¾(%.Üçë ÅݾÇýõ€xâb?öÈ^ö:¾BíÂnŸñ}ßéEÁ¬„KûÁãÖ/Œ÷d?ó ø[ª~!Ä$Dâöéö`êt?6Ä.ÆätÄlo_ÌøÝŒx®~„>,rü©UŸå%Îå©Úç_^iy¾§R!°_ÉnDú¥_öέê÷ë§ñûÒ2éRPéöyéðBŽšþnåþêéκëìͼÏèet«±ì[ÍîšÍ ¡ðK߯óÄíÞîÕo1â¯è®î_áç?/þþþŸ³ñò/Ïô_ÿõ|ÿøÏú¿ÿÿñDà@‚ D˜aŠ7 è‡Ä)^ĘQãFŽ=~Ò –LžD™RåJ“hˆ„™bÈ1RLqœyF„@R˜ÄTèP¢E’d™TéI—F/ÎL5& Zg’ú)0†§]½~+éR²*›†-(õ¡XVJõ í\ºuéŽ-›×ÒYƒP"…à-Á™ hñ ”ؼó¶¥;j<Yí@Í…%Sþ&³À ‡Ê*ú6~ù %H§¹C‰ÁiÇwhj†]Þ½}ÇÄ«—,ß'8AÒ c0ç·´^5Žà¸@«šCƒãÌò¨„ß¾Áž‚­ð³JG^]`ÕO:%aÉÊùéê1s2&Ëoþýý' N8¥ˆãà2ï˜Ã¬µ·$ã¦'Ž ä­çòÛï>…¤*lÂ1а‚P ;Ú£ä†úðÁ-”J¿ÿ^„ñ·d‰¸;²Bp9áŒÇ'²èÌ37Kë@ ·Õ<HZ¤àˆõ‚Ô‘ SVŒ1K-¿š‘F³^¨À‚Fè!¹ EÁ«¼ÐÈ5-Ls$/ þ$гH òâŠ-ÿt¨.½D‰¸¦Sî‰3pZÎÜS:©ÁÏ=-”´„2òÍ™$¥ÔRªº¢†:;¡oÒJÙè ®…5V%´%0ûR 6{¢†bëR¨¹Œ;šØéÒOI!òÉŒI‚0n»ïÆ;o½÷æ;J* „oÁ'¼pà WBH"QC‰Ã‡yå¿ÖC P’D –§¾zëÉr¤ •Úpäzï¿·~T2`ðÏGß÷ÔXd÷ß_DÒ§¿~ÐØ#ÿ-ÔPc‹ü÷xý8ÀÉñ€< `þø8ª „`óÖÀJЂT1¸AzMƒaôA–Є+!á Uh®Ѕlá ehÁÎІ ¬á uh¿îЇçëá…h½ шÉ+╸’ À‰O„b¥8E*VÑŠW¤ÀF@+vÑ‹_£–H=PgDcÕ¸F6¶Ño„cå8G:Ê‚ãòP‹0ôÑd  Hr‚,dyHF6Ò‘„¤ï˜Gåí1’—ìc"5ÉMbÒ“Ÿüä$)‰HAšt‚B!…Ut K0Ä[±„e.3žó¬g?Ÿ†ÒÓž¼äf7m÷ÍOR›ÎÔ$-Ö°ZÈa™†(E;‰ZDB K(E¯ùÇPB ‰ä¨GAzÒ>¦ô£!E(êM>îŠdf–©Iô‘dX&zt’*2‰S?*â, ÃQû˜T¨J5 TéLiÊK‡¾’œLUD–™°v2IšéCûXR¨žU§k²™P­ªŽ¡ž„€8™9þPžú¨ªO;y€HŸú„@ÉÚGL$’°\lÛÇÇj3“2­+íîŠÉBP¢˜Ç$93ù‰‰~¢Ëli5ºLWЂeàAM£YjV@ ýƒ:‰<$²µ¯ms»ÛÞöñ·°­©M1›Y»&W˜X ¤pŠì4“æD§:ÊNw"ž®`Åæ@?òÀ– ….}šˆ, ¢‰txÅK^¢²×½ð•ïxçº\æ¢n³–ð#ËÀŠ.ØÀtíïçþk` r”ˆBƒµ‰àwnÁÆp†'Ìß {îÂqˆ9ÉásîdPEŠU¼b·ØÅ/†qŒe®ü¨Z‘ˆµJ³¶# C4±†2С¦±ôã'°‚2D¡ 裬imk\32–šœ}ÃðƒYÌ’¤¦®&ªa Wf+YÓ“ãôT¥Ðψ5 ‡õã>ï© g2 õ6¸ùëLÞډ肱ýˆí>þj»ÙÌ^6¦Ÿ-¹h_uÚ¡n…ÒJR“†¡…­t c‹0Õ/x/÷ '¡ºC ƒÔ½o?²õÝäg¦çÍ·h¯a  î %~Ó?*B“—%ž;Њ9d ¥8èÊ[þrqw›¯a€BÂð (ðÏ$oêÄ1ŽHo\ocÎL'–ág:!øÅ×ÚïÛ‚’'ƒê£F˜…öê¹ê[DThÄPP+EdÄ>*¨€z&òKµ¿‚Ã$”CB³Œª¨Lʃ5h7Q<­0ÐZ-P…–ꨗê#Jø2X,˜ÅZ¼EÅ28Z´E\ —Z©›ó£j#COüD³¡ú©L*? ,¢ú«hô#«Â*TpSô#lÔF^ÜÆlü#kT*b 4këÄdT›1+kc8?Ь°òÆ?r«DÚ9#ƒV ƒz”‚{ì#Iô#}þäÇ0˜ÇÅ[+Nì²8DGe¤;fü«XŠÆf j¤,€»:Bè7K´È>‚…÷û#'ÈÈ0¨,Úë#7<Æ„D›1S-Ó¨V@ÅËÅW ƒã ®k{­\‚šì7N½›,ƒ”ÉÒc¶XXC$4ɳ¡Ãs²CfS>ôC¦ DJ‚ °Äü¢/!8€,˜…B³J¬,4E@µ­ÌÊ© /ý"ÇhªB+CÈ¢Ì Íë²Ì&#ä¿´TK²`ËÄA¹œK¥¨K»ì@¼ÌK–ÐB¾$Ê¿4„jl¤‚„LBD̆||fdlVTܶ´<244´fdôæädNLÄšŒÔªœ¼~|Œœ><Ü®œ¼šœä¶´Äžœ´’”Œrt<.,”*,œ~tôÊÌÔª¬T><ܾ¼üöô¬VT„ÄŽŒä¾¼üþüäÎ̤NL¬ŽŒìÞÜ̦¤„nl¤†„¼–Œ\JL t^\TBD$tZ\´Ž„Ìž”,"$”vtTFDŒnl4*,D64L><ÿÿþ!ù¯,è#þ- H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£F(]Ê´©Ó§P£JJê¤Xl@µ«×¯`ÊK¶¬Ù¯F`E  ˆ·pãÊ… àmݹxçÞÍË·¯_$j×mëïݽ…å"¦›¸±\À‚»å»Ø®å¾!b€#cÇ”CŽL”ph½—óZX’àÔ©K,¤:ñhÒBMç½;(à ¿dƒÒ˜Þ:²w#» –,É0è2qãȇ/ *à+þϽ¨nÃom$â1"‘p! ù¹à¨Ï[ ~âú¡`w=DÌ}÷V|óÕ—ž|T0[_ä•çÓyµÍà™!¼‡†'oA‰]]ÄÕÅa†0Ãef¸¡2LøYa :È„н%G‡B|x™á÷ÖùÁµ‡ou!Ç9Þ5cŒ¶æâƒ“íö–„oUxÙ(=ÆåJ€o9gWˆ# (•s¥ˆ$‹J.ùb“è ±@<ü÷^| Âoyšk°aø›<4°ÀepÊI§( ¨ K`¤™LöuWŒ±DpÖU†QˆW @B)ÐÝÐÈ›¥˜j*Ä 1†wþð"Þce2šŒ´åš× ³êJ«­gú*l^7œ8l^-[®Çê JÍ"[«²Ë¢íµØ ‘,µ2Cà†+î¸ä–kî¹è¦«î¸2`Á-NEÆ+ï¼ôÖkï½øIÉ»71›í¿¹n˯Kþlð¢ÓtÞ2TÖëÁÙ œðJç¡ê˜C,ñÄ) glðÆŸtÞ¬‹Ü,É%—¤[Ž«ú\Ê*ËrË# —zì¹WóÁ7ã’ÎO†HóϺ-ôGD qdG#M›ÒKwÔ4”F-µcTW½QÓk¶éóÖØvíuFMC*)¥d_köÙÜ6ÀoÃ]‘ÜsG<­þÝ"á·Û{ó ’߯¸à^¸Í‡#Αâ‹ûZ·ãAyÀSŽv¾œwîùçújÞ÷·ë–nú騗ۮèC[{¹Þ¬îzcï ‹Â´ÝÅp]1 €×ä±'dùgZçõÇz:v—Åoa°ÈpüAÃ_Vül0´’ë]Ããe>½DÕ{y½—o!Ãö³YáJøã?Ž&ÑMW]P@A¦^ÖEþûëc`&JTé @%0œâ'9" 'ºéÅo 'ó€²”ˆ´çOæã BÄÔNR€ øP„.ø BB—?H~DÛü¸ôJð†þ>ŒR—L89¨UA\J$ Y/.6Äaã6? IFV ŸvEôѰ‡²y‹)Z±(á-8"à =a¬è‰oŠ 9ÙƒH¡!^†Ž"’OqB$XA.ƒX¾T%âÅÅ ƒªàᨓñÉO"üàÕÔAI  6øƒZq—DÁ%{pyCɇÆiN“|ËÀ÷+FÞm~£*U¼ ?/ðQ´¤€-£´6á. Õ[ާ'3ŒB@xÂpP•©TÚ zé[¤+©7¿¶¡ ÍêÝï¤9Í‚4íu†ëæD¾ NƉ“|³+ç±,˜Ãò©“/ì¼ ;ß¹ÍsFdžºþ¢ÃÖâ?­œåŸg!JP²¤Åž©ŠB*´a¡•ÊUŠømÙ%| d´dCðÀF§ðщ£ŠBIö|ÁÄJù¥‡0D>xÄL©åü` ;€ÀN•Åìa “p†j«2‚ {ðÁ ˜j&¨ )@$¨º$HB IƒTÀU½ —H«Z;à”7Z„æJWºbâ­¤„&öŠSP¯À«‹æºUÁš‰°†=¬ ›X!¶±Ž],d#ËØÉFæ±–½¬d3«ÙÊr)˜ý,h7+ÚÑz¶´D -jSKÚÕ²ö´p,þèfKÛÚ~.yp€mwËÛÞ #%HD†KÜâ÷¸ÈM®r—«\ ׹̮t§KÝäB·ºØÍ.qKñ[Ž”@¯xÇKÞòš÷¼èM/z^öª÷½ð¯|ÏëÞùÚ÷¾âÍBw7ò]üú×¾õ¯{lÞˆb r`EþËàø¸Á¯~ Þ[XÀæpzÀD$ l¨ð…Güà3xÂÞ±‰!ì^2Øa Ö°˜‡Q,¡&ï'8a^2\|¸Úë†c¢Â,@ƒ±"ÉJfrx Š%€B 2)–Üd ¸ƈ(ñŠñ‹bþªxÌÿuïþ Z‘„$p²½áED+î0€O„"¼|¸ƒyëÀf7ס½®`€ 8Š9ÜaÐx´  mhD‡w „`„ ®°…öŠâÐpH´ÖÜæ7£¹ÁeÖH?Í`÷¢¡Ë+1*^¢½Œ0ï©Ã»4´·áep­FHáÖ¹Þu®M^Pؽ&ö¬5jRŸx¿¢>³³çë^)ĺ×2Ncxð¬çòZ{Øpo€eîpo‚ŒÛÖÀ¸ÃûmlOÛ¿¡Î鬧 àð.»Ùêïº=ÞËնη¸1,ðr  q@ZÌôNo¼12ïˆ;8¼uà@§eœŠV¬€ ¨0þ(1o¢Â|îôŸ Îò†¯[”Èî  —c\ãn†¸ÅÍ;ñ‹T|çêmñ‹cn&¤rXÃ!Äk`+8×?òµ_nª ü)Ras/=Ì@oÏ-òó°›ýìhŸïØ+Rö´»ýío_;EÚ÷ºÛ=ârŸÝïÎ÷¾›8ïÙ»ßOx2C;#4%ÏøÆ;þñ¼ä'OùÊ[þò˜Ï¼æ7ÏyÉ/áðI|çGOúÒ›þô¨O=å?Oá»þõ†o=ìgO{ô>"‚¯½î {ˆä~÷À¿{ïòûàßíÃwHñÏü°'¿!¢W½ô§Oýê[ó¬çHô¯þÏýî{ÿûšÏ¾™›O~»?Ÿ!Ë/¿úI}þ…¤ÿÝœpE½5€4èî%vëÞ~…¼ßàåuée|ÀjÔ^x ¯Wb+À×w çsÒfaX^0÷å^ 0d®×pà =ÀHvaH^ªÐ €ƒç,ð "({¨nn°eR–o92_£`€@¬ ¤ áEc6†cp–ƒçåc@&dZÆeë5”À^Dxc9Öƒ?„§aH¨ p(ƒò5`—f™Vu÷Õn0'sIPi gtfgf˜^)çg–†iš–asq6guvgiHk˜…q(^&@l_˜bþ+¨n¼ækƒ(_h¸uz(^«Öj¯&p÷wo'lɶ^… ‰èjቇVˆ1ˆˆó÷r_;(^›p`hpìV$h^íÆˆ-·^L ^ÚáõŠK‹‚h‰äÕ…§8~©Hp«ø^ªäŇpl°oȂ䅉ØaãEæÒØn• cö‚Çm‰¨ŠxÖeòÕ ò§cáÕqrø`sØ +guä`òrö ï(x&ps c| Ž¨‚p× ñÄ8p‡Ÿ7_ŒP€áÕ ¬@CxtI·tIw(^ŒuW0u£XâetH§t¹þ‘Ik‰„n cé^ö€È7‚lW‚fÖ I{úg~>9w@¹~Lél‰ó–/ø%•ø/Mù^Oyy•\ oI©wKÙ•b aYi[9–h©^eYg™–nY^kImyŽu'”3X'(‘yélG —_xaé_%¶ŒaG€„B8c5F…ê–nÚèu`&cSh„¶It¹›EX…/—›UØŠáÕšX蛲‰ƒ´É’_Æ›î%œáÕœ`×›ÐI±©›\è…ùþõ—¸§b1ˆlè†}(šáÆi9nâ ‡›Ögžöréé‡îɇꉆ߈m(ŸðIžgží¹‡oè‡üÙuï9Œ^¦˜šÜé{*&ŠžH‰úijn“¨ ¨÷ÖuZ¡/—¡•øˆ©‰áÅ¡µÈ’*¡ŸX‰%Ú›"ª¢'Jˆ†¸`ŒÂ¨½H˜y‹ÙF‹4zmº6Œ5ê£:Jœ £²H£:j£á†£Iª£JÚ›?ê¤:šž‰ŠãåúÆo¹^ö¡Çã•¢àè^^ʋ׎WZ^ÍøŒð8X:¢û¸¥´&cc §ÌVme*¦mº£áe¦lj^¨)a J|*þd°¦ýH‹ysn‡Šr8çiYçHé^^ì(^„j¨—Ѝ]Gpרשpªç™˜šZ© ª“º©–:"æ ¨`¨‘Y”.’qV‘ô_‡› “»9+P“¤p“ù’"¹¬6ùœÇ*’i€¼:“3V­ƒˆ%nÒi¬ÐJ¬·I“Óú¬ÀÊlÌê¬Û:®\è€SŠŒ~W™÷e— F”ŸF¯óÕ—ú™w§¯ë° ¨Ê˜Ag•&°å§°ÿ¥š–0—o± ±ë–k°›±ýJ¥Û±jI° A±Ë•v:ǘáe¯ˆ‰—¸þ#{^%+˜iV›(k˜ó§˜Ì¯/Ës ‹~»¨ó7¬,‰™ó§™áÕ™;¯æØ`ôz²µIš¦^š´0J¥ËæŒÌfkTfeXv„ËùŒu@ K€Mxƒ2®á%¤ÆùšÕÉ^HhŒT««Tjn I 9æv &i”æ¦ãÅ ­ÀP uH†š&cÊnXŸá‰Ÿx q™=ë~"vൠ| „ª ’„(Hj¡ ©ˆà‘`ú€ ¢-:’ ¹“³­ûjJ—@ 9vnŸç‹¬k‹‰ŽפBJ¤³ˆ„ ·“«°«­9 9p­`o ·pâ¨^Ëþ–¥ ¡q^iZ¥k:§¬;µq›¼«@ ©«”@¶Hs9ºä%¸tf¸½)c¬êiŸêŽ…*ªÚp¸z¼” †5:@¡Ðá…uZÇuè)¬ÝX”°0Œg[¬¹†‘­¾Ê­#¹“þ‹¼•ë?[—íÈ`üz¼ÉÛÁ{ÂL‹°(ܰ2 •4l_6;ƒ8û˜G<°þú¦3è©X´ø!ÅH<Å+9Äãµ3`âËÅj—ÄZ©bk;›º»µW–eê…AʃkŒœºé¶éf¼fl_Éë¸×·þ“Ɔ‡GŸjø¸ÿ¹/ºÇò•¼©ËrãelíÕ‰…Œº:^+Úp®ËÈb‡Æf©bÂËr¸›n°‹¼°X¤OZ¼ÚÉÉð¥ÂVÊr§p —н-ù½yÚpeìÊçÉl9¨™ŽâõìkpŠê©#ªú;ªÆ¿¹êËX Ìr©b¬î…À[×p9YÁØ*“ì®äÆÁÒüÊÔ<™Kl_BŒ_F\ζwΫ™ÎîìÂðü°ò<Ï}Äø<{ú¼Ï¯×Ïþ\xÐôìÅA»ÎA^Eì²ýË=ƒM š‰©€9 ™ ­´òvÏG´3h´Z|Ñͱ3{ËÑŒ˜d ƒ þ³õ\qm[ƒN˜¬î¥¶WÈ¶× œl¬“­œÒU+¯÷™Èê6†e¸ž¨jÈàéŸãɺ›¬Óÿ˱™¼ˆÊÆ¥ ¢É—ÔJ¼«LpÀ˃¡œÕ,§ÇJ½Ô< ¾/—¢¸<„ºÌ’'ÖËÓûkª‘ê^÷«Ì\«˜ÊºýËÖ;½´èЬ/‡¶½fÁ×Ü®é:Î:«×üÐø…ÐöÕÎa=Ј}vÙηÒMÙÓ6Ù˜mqš½ÙôÖÙžÙ–Ú|Ú¡û^õÅØZJöײ¾lÚú‰ÚjÁýć½Ç° ɉÈÑíÑHËȹͰî%ƽ֜œ¼€|°vÀJdˆ›5þ]¶]Ø2íšC8ÝÊÙÆ9ÅÈÍžp€qì™è ¹?m‡áµ¸z^~ÜÓG­É‹ÌÅÈ ptZkqØÔ¥{ºâõÈTÍrV}ÄÈÍ£Äv‹Ä–£Ä«Õ<Ó\ÊÃKÊÖò=ÚâFߢKk™ndMpfµ¹,Îr½ àÞ^8Ç+wäªÎ<Œõ+×Ë<̱ºâx]҆ɽÜÍ uK¨’÷«~Mp€}­1Ù«}-’†mÑÞ=âºmqª-_Žä6NÚ=åRŽv ]åcvåXþwJ¾å’Ýå^^ÙŠæ¢=æB{‚M^› ÒÁMž˜¶äøÜæïÅÛˆéÛ[ÜÐt®^þÄmÒãâóŒÜÊÍÜÎ’ÑMŠ.}ƒ×}œm{ÓSÖÝs®äÞâ­r¤x¸AMÔöY ð Òómáõ}áÙëÔŒ»ß—Ü Z‰~Ñ^º~齉ÊÁ¨ÊGúàè’NáØ˜½ÃxÖ3–ÖTlÜz.é%~âã ë/7×uã¶Úˆy=ì6>è9Þk(ÉãÕ+‘B~Áà\äƒHÎÐα ›^i_OéTNæx'éèÎÙ`¾îŸÝîî^æ"ïï¦åô{óÎb®7îT¼æMiïµ)Û…IÛpNÑP̔ϒ¿sfç`¬xþïð^j« tÖç/ì6,érlÇUèÆ] Óôåà4øþdIöÒÕùÜL˜‹H¸è4ý›^ËÝoã„ìÞê È+Ô­ºðhƒVh‡Æ šV (.Áã¥éˆüÞUß͇ܔ<Õ«ÉÒ˜¢£^`Þôê.^à;ËÔ[ßç»Ã¸÷¦çë±üá_~È=^ªjÌ5Ǩ;_^É̺/§ªE杖ê^“¯ì0þÖ,÷ìڬÀ"^ÝLùçãÖZíæÚ¬î•úÙ>جßí·­øß•ü®^åNö¹ï+–ðÆÂñ.üÀoÎf~üfüÊÒ<”Ýüh6±”  Ô_ýÖýØŸýÚ¿ýÜßýÞÿýàþâ?þä_þÛï%°þìßþîÿþðÿò?ÿô_ÿöÿøŸÿú¿ÿü_ÿ®õÿaIà@‚ D˜PáB† >„QâDŠ-^ĘQãFŽ=~RäH’%MžD™RåJ–-]¾„SæLš5mÞÄ™SçNž=}ú ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_i_3.gif000066400000000000000000000212661343257752000272520ustar00rootroot00000000000000GIF89a¤M猂„LB<äÂÄŒJD\Ä‚„$"$Ä¢¤lZ\Œjd䲤4ôâä´bd\2,¬†| dJD<2,ĺ´Ä–ŒìÒÔ|f\Œvt´–”Ô¦”\F<„D:4¬RT”"$ÄšŒôÆÄÔªœŒ4&$üòô¼rt´Ž|dRLœzlœ24 ¤–”TJL|^T亼„nlÌžŒœ‚„TB<¤BDŒnd„f\L:4¼’„äÊÌÄŠŒtZTD2,ܲ´ìÚܼ–„| $ܪœ¬ŽŒlRL¤ŠŒ ,",ôêì´jl”vlÔ¢¤\JL¬Z\”*,üÎÌŒ<.,üúü¼z|¤~tœ:<ô¾¼Ìšœ¤‚tTF<¤JLL>4t^Tܺ¼ìÂÄ̆|Ì¢””fdì²´DdNDÌ’”üÒÔ|jl\JD ÄžœüÊÌÔª¬4*$´’„œ~|  ì¾¼”rl„jlD6,¼šœ„ $lVL,&$”z|¤‚„tT><¬žœ´’””FDä¶´´Š|Œrț¤LôÊÌœ~t|b\äÆÄĆ„ôæä´fdìÖÔ„¬VT”&$ÄžŒŒüöô¼vtœ64ä¾¼¤FD„j\äÎÌÄŽŒÜ¶´ìÞÜÜ®œ ôîì´nlÔ¦¤¬^\”.,Œüþü¼~|œ><Ìžœ¤NLܾ¼”jdÌ–”Ô®¬„ ¤†„LBD<24|fdÔ¦œ\FDD:<´Ž„dRT Ìž”TBDL:Þ3téè‘R/¯Yòhm¶cW3åα6ÍDH†²†².(œ‚Kм!^}÷å'ÙºøÒÆ!² !{Ïå–Þ…B­G!yk<C ÏÌwÈ3¡ˆ3’GÙ§pæ!ˆwˆ7b‰'J&Ã3?ˆQŒxVv†@þ¤!…íA‹d´Ì‡LxjÔá g‹P¶ÈkGªAËâ-)™“’É\–ýä˜: É^g¤D©Æ”â‘"á›)2)‹PJ¶)m¾9¡i~ &eb’)hMf–Wd•IŠw@(–ñ瀲!Š%y‹Zæe{Nè œÂTèxéÒˇ!Š—Ì3´¼Gdjh‡Awþß1 À¨1ô¢‹©¨ªÊê%î¨.Ufºi§Ä®ôiu½ß!óM‘ 2Žô1Èdpc\/É8`>í´ôérJHvHÍ•7l±ìštl¦=N‘.¼¡­Ûî½!½K/{ˆ<¹olöâ+0Gúþ[]0~ÜZÀ7|QÁ Gü/ÃW,Q/{£ñÆwìñÇ ‡,òÈ$—lòÉïÑ‹Å,g䋞0Ç,óÌ4×lóÍ8ç¬sξ´ìsEK,ôŸÿltAA­4{EíôzìQÛ¼KW›ÓX/´^.E\FµÕ`cÖtÖ>¯Œ–}öÚšZHöÛ¬¬×œÚl¯=6ÜS§§þÊÊW÷ß™ÝwÃrOÖ!©t^µàƒ \x—ˆ&®¸ÒŒ7~ïã|ªÉæäœWn9»˜_š(ç“{þ9±˜‹Š8饻}zÙ¬òØ7³¬+núëƒ&]{Ý·ãN¦î»ÛíºïyÇüñ½$ðÇ[¼ò2ßüÒÏCžôÓ]½õÑaŸ½ÄÛs¯ÛË;—oþùè§¿sÏâ;Œ1ÊðÇ/ÿüôŸ¬rû{ÿ½Âáãߘþ=’Á2bÓ™¨mf2pÞðü‡:ã‘f^’«ŒTÔšÎp I¸PåÈ@NÐ:¶±Å-lÓ™³MfGX;(¨zÍ6ʰ y¤@jƒ,¼œGó?ø‚þU¨ÒföÆšcÈ)Î …/æ° ûàG?Á!â&…Ân‡¿áÌ0B!‚;äB<ÌÜdNQ„7Äæ"‘‰PD؈OÔ[¡—‡E×p†v‚ã|ZÓ'Éø"1 Œ–šä¯=ªá*œc±€gÈù„ш“AÄ0Ú°‡ HÆMD4ä©ÈN1’†Ž„á*3…A´H •òllÈÉN殎Ÿ¥x€[ p?©2¥dN•ªU‘2Ëa]éAXf¦‘2BWkAÁ#€Îȼ%­_Î)ƒ­$æ˜\ÈŽ Ôf ¹?á‰ów±ËÙmÔYÎ s›älg8ßIGyvNŽôþt 7í¹¡þås*ûä'ÓðùO»T ãñgA¡"=C®s2Þ¬ d ¨pÎs¡Ý‹'ɳœÎLPN”Ì­„Ílb45 ¥áCÕ ÂªÁ„’AáEOŠR¾£¾éL ]ºÊV‘¦5ÕŒ€„¶7$¸HÚšåDÉÆ‡@¬Òì:IÉ Q‰L¤OS¡8D8µŠŠ?ª>€=#FjÐ…YoÕÆ4ÒˆØb¿¨†ÃM$£Ѩ†­Ñš’A¤IÅjP²J rHš”’˜Ä%ÙàqMp^'óÇ@Nf5¤`‡IرjFspì㬉I¯Âf²k¢ªœ$IIKò f€ýþêL;+¹V ¢S¬¢å'ñHV2Ê%eJyÊTbª§³¥-XäF+[IF­¤bë|x©+Y¦•V¥bé-Õ…\ž’º¾lë …ÉYåÖ–¬CåÖšŽšT55‹šà:­{àã·55ó™Ñœ&´ª)ÞV•´¼æ].Y­QçXt°æ æ àãeÀ F°ƒcÓOŒ –ÊA-|…fXHæ0¼<üážlXÄ Ãp‰rb“†Ä+.SˆKš‡T =0é`cœ¤´¿—ù(EÚ5’jðž=¦pNUŠ™–ù¥h«h YÇã$jÆÊÁiàÈËC²’Ê*¶²zл­¢²W©Öìáþƒ(™ªªáªKlb‚¸¡=mÌb¶ŠÜÌŠVè‚Hºi–«/™×2žÑ­òf‘œgÕ6±ˆµ’nÅ €ÇŽVŒ~¤ [H.ºuvôgóHhRSÚºnfm%/ [ ßyÇaõPl iÜÞ6”8Õ©p'C\É7ËÈų¬£ÂÜ97­kM³um9™î¾A—j/« ÌÚUyØ-‘[zѶˆ3»WÙYf&“œ MiÒ¾€ÕΑAmÞ@øO6öŽÝîé¼ÛÅ»v½S²`|ïKßû>I‹ýmžX|''¸Ø ~ðœ$\áabxÃoòpˆJâ¿ò’µ|›xgÇR«hþÍ™ñ£ü8Œ¤`—‰ŒÁu7¸äÂrlo,'KÊ'œ2ØóœÜ¥Àåòƒ½sŒ÷ÜSd&ª{μTñ©hÎuU;8gAOŽÁ*á£ódϤês²ÅëçgØ”é£ôz辪±FІcѽ>ëGK:ÒW²fn­ µWvÓ[ê4N?ýrº¬ -5dI›x©ã4Õ“\õk3IÃW'×ð·{Þm]ëùìÓœ0dpI í_ÇöËsÇ<ˆ5Ó\¶–ýì¡{.î ‚PÜ¢3´¬ùv miǶÚaã¹ê–tõvêß&ÏñÛ‹¤*(Ñ9WgÄ-rç÷Üû/ÔþMòáSBó¸mæÝuïÓ¤ßï‘ðÍ?ô§ŸBëgD*þþøËÿ!ôO¿ýïßü[|ÿü§52÷~0dt˜/H€)v€6qP(~Ûuc96r>b€ èHsB#d77R´ð_msç—€ÇT‚J6·r8S:‚"(¸QC;õdDç‚/ˆtš§°XçT?  m à óµ,scZœáÇàÈà4°Q%gYÇ7L'KDäfVG…NÕUvÆuj€98rs –åWp×y°"|eWÙuS`´ ? 2 ·ÀE2@WhÈF¯ÇwiWh{…hp§Yr‡ƒþc˜mdU—Åi–!§ô[2ØF–Vi¦†Yþòyò…S~§ix±Exb˜ˆr3“QZ{‚Ï€.{"Z鲉›˜'D$ZzDc“y­Åj”‡S–\˜ˆÄ~¨Ä[”± S ‡‚$¯h‹Öezœww 'z»¶ ¥GŒh7¨‡ˆÀ¨ æ{kWF¡  ¡‚]é’{@¶‰àø‡j0{µw{),̆KÏö]¹^Ô&taø‹ÝH æ,Ù'pŽðGÉB_´ƒÒ[›ßb'ÞÖ|Ï}Êd_ã†_ææüµGÜWýÈþW7âä·i,$¨€Ws’ü–’Ç3ÿÇþ,‰.©’7“(’ 7Šc¨“Ç“9Z`6Ù#f @ù‚Êp€€êó”P•R)!Hg  8Y'`µÀ„ `–b9–dY–fy–h™–j¹–lÙ–bIP pY ™ ˜P YÀ¢Ð.¢ÀYP ˜ ™P—‘ <—û³@´B;´D[´F[´Np²0!9p´Nû´P;´9³31³Q{µX›µZ»µ\k´I;°MÛµb;¶8;µ K³d›¶j»¶l›µ_»´aÛ¶rë´f+³h;·x›·z«¶oûL»·€ë³u[µw¸†{¸ˆë³}뛸ˆ;¸2aµŽ›¶¸•;´—븋Û ´—›¹“[´ {³’ºb;ºs«º>«º¬+·›Ëû³Ÿ‹ºFûº¥ §{³¯»·½K´¿»0£À»¢û&ð—P³Á›³ÍK»1³Am-hþ‹¼5@;»+1»6˺µÛ³Ó[½}P¸“‹»T¹æË¼ç‹µÁ Ë€Æ ¼5; ÂÐ qÀ¾˜›µ™k Ð!@†¶—;9° Û«´~·ó‹³á»³þ ÀÌÀí«³¹û»Ë¼o¼Ð•k Ô  ½Âë §à& 5ËIà§ Ì mÐlP¼ @h€DÀÁ¬'+ÜÂ/̳`Â(¬ÂÂ+Ã4lü«Çß[³8¬Ã<̼FœÂú[³@ ú;Å;Üà 0 |p ÁÐúû M`ÆŸ{ÅHLlР›¹ËÐ:›¹dÐ ¶w\¿oÇþá; =p tP$P³u¬³^\Å%|Â{70( ÅìÉ“\³ <„#lÅ'ŒÅaüÇr¼³ìœÅÂû ÂP³IÀD l°Ìû !@=¿ € N@!ÐÌ[30U`Ç ÀUp —P|0Ë«,¼7«Ë¼ìË;[Vµ|Ë¿ÌÃì¼ }`×kÌȬ̳\͸|¹ökΠ¿àœÌ˼=P! hÀ¾ŒÐ+ ¿Ôl˸Ì> Â0sl³}\³y¼Çp[Ðï<ɾÏÍP³­³ë,΋µ Á@Ë$éœÑÝÑÒ­üʱ<þÎú\³ ÝФœ¾¦»¾Îü½³ÐÌÛÌ$ÀÅ p 8°¼ß‹Ä:05{ BMÔÂ[Ó3]Ô?ݺ:ÍÓpÔÚ¼*ÐΗkÔ5;Ô9]³;­ÁoBH|ÕR½C€Äß‹¸`Q,¼O]Ô”¬ͼ`ìÀ5+ _ð½À=B¾{` } r­³X½ZÍÖ\ mØ @ŠÍÕ<}³7½ÕÍÓ|Õè{¶ͼLœU@¼Ô3ý «8X0Ø7ì5ë`Lª-¼L º¤Ý¦MÄó ­ýÚó; È3ÍÚRüÚqÇÆ¬¿ÀÚ«=×Ì{ íŒÏó{ÜD× þPÑÎ+!m$œ³Ü«ÞkÜ­¾¨x¹Ô³Ð-Ü <ÓÒ=Óž Ú‚Ê— Ý™m·›-Ú#p0 ðÀ¢= ŒÌ;Ö…}Øé]¿ýmÛkÕYÔ ¬{° bàîÊ»ÕE=ÖeíÀ—00pàó{ o-ÝËóͳÛÝ=Ó—mØá{ Jm³!NØcÞú×õ}ßùá âpýÒš³m@É¢+ÀË90ã5û:À߸À¼ÌÐÎmÕ7ûã6‹äJnàøÜä3ðän³Pß|ÌìŒãÄmê,æ =ÏÎ, Ç âè=¿üìÏÝÀ| ŒÊ$®ÀþŒKÁê¬åUàÐU£ x½wžçÅŒæR¾ÖÎíè3-äDnäÅ èñM¸:ÛÁ ßŒp àÓ”nMØÊ1ÜtÀ­-:,` ºš~¹¢î¤>Í·-ç>×ú= u~ê¬NæoÒ´ÜŽþëaÌM@f<Ó°vLéDÀ tÐ=ÞAÐÁ`½zž×}^Ðn<í£<Ó£€{àJpÏ5{íÙ^¾R\ì­~Þ”®¿þé8ílî—®¾rû¼¶Ûï;«‚͵%Ž'îïk[Ê-qÊdËïïïh !Pl¾µßðd‹ð,¡ðcËð˜½ßµÜpþÈÏçœëç!Ÿñ0­»2½ò0ó{ÎÇ2Ÿ¶¿_ó:óo¿óQ{ó*‘ó@_ôþÞó%ñóF´BŸD¿ôPŸ¸HOJõRÛòüòV¿õ;õ#Qõ\ÿ³MOö@; LlöGëõ"öjÏãòýöG;c ÷kò²«òv/¸XoÊ û÷«Šø„¯¯[øˆ•}ß.ÐøŽÿøù’?ù”_ù–ù˜ŸùµP ™ßùžÿù ú‘ ú¦ú¨ú`=¡£a`¥¯Y©ûŸ“ ziP Újûd”°K@ pàûƒ ›Æÿ6¥þ@ ‡Ê ¯@ ÄÚüXó zŸ' ÑoýNcÌ/üÞ4‘À´@#Š«åÿ3»¯¬™P Úþ>“ªJ©`›ôÏ2 À•ÀÁC ÀJ°B˜PáB† >„QâDŠ-^ĘQãFŽ=~R$ÂW L®*Qb•I¯F¾„SæLš5mÞÄyprþTèP¢EjÜÙóèR¦M>…Ú4©Ï¨U­^ÅšU+©[½~VlÇ®cÍžE›kYµmݾ…;“m\ºuíÞu8ï^¾}ÍêõXð`§€ Fœ¸¦aÅ?ÎÈòdÊ•¹ò¤jYóæÇ’9þ}×shÒo]œFZõjÖ­]¿†[ölÔex–¡[÷nÞ½Q—ö @øpâÅGž\ùræÍG’(’çÕ­_Çž}8ð¾œ,^üxòåÍŸGŸ^ýzöíÝ¿‡_>y'¸óõ>_ÿ~þýýÿP¾úîÛ+¿D0Aôo@ï2A '¤°Â|°®-ä°C? à ãÚDOD±AûF¤«ÄÀÄÝ›ñEôDdÑ-mD°F}\È„LÇÕÚ‘HýS2<&E¼&Ï#.‚/.oÊò´dOÈR¸j £<#D+I‡d2=–ÁAJøfþE˜fâÈò=.ƒ$ÏG/å\`†–1sE4Ûr‘¸,i"Fcrh#˜ÊÒ“S1Að¸H‘SȆ6Ú`#ʈ@#‚Ð bÑF]€SOA5K1ÕtHQI5UJ Ž ÂIðPU•Õ,oÍ4Ïð4 EYbWmuQø8%˜F”ý¥‰kg´õÒdOe£`à¶O@Ïe<2Ú(ôP¿3×Ég„/ .ˆÐ€ ²|&zÀs\œ "„.²¬b†ªè<>ª¸ä’*øà—ÞtÁ¸àƒkí÷߀Hxá†Ç‹‚>Lñáˆ'æ×_€•­Óg”UYbŠ衊4@#OFÚþXAY:~y>|F˜ Ê%]eŸ^·]w‘„·i'C(Oƒ&²´˜„f8,ÌU‡À;¥ì³‡Äúi°Åv³ë¯P;^nž1mðÌæ<¯³$ŽŽ\ó®{!ru\ vH¹Ñv¸=Îé‹Óæ‹/¤ž:ͪѠת c8·güå™6†À"Ëh‰pýªƒ3z–±*å­Á‰‡YÎ’µ°§U­H¢N[~Ìõ°Â5®MzÉBd×厽€@ŒÌa)4°¥%KÉÎTÅ3Ÿ‡f1{þáK_-óÆf0„)Œa;"Þæå¶ŒÑ›c.ûXÈîÝ4“¡ ß+Ó7Àa& ™áàÉÙÎp£ŸÍD ˜•Vm+ª;úðáÀw|Óå›%QâLt¢äÛ?¤Ù¸ì3@C»˜!Ò?c€4Ikcgp2…à8@sS=ò #·#1ÂJ²£4Ò•5j£aY$9\€”3øã–=:A$`KACÚ¼DJ"¸ÁFz¤fa˜$?"¸¤Lb¾µCÒAÉ™€h ƒðà‚ ²Oaƒ¶C4¸Û@ )4&ƒTò0P»³/l3Cõ %[Â% #CtCC>9ÊÃa*¦1ܾ¡š»4äCgzC˜‹Ã>D ùC¹ ÄADÄÉCžÚÃDtD)Dî;ÄG¤Ä[ÄjÄJÔÄ ‰D=ܯÅPÅQ$ÅR4ÅS4°Nä)VtÅW„ÅX”ÅY¤ÅVÄ/íÂÅ\ÔÅ]äÅ^ôÅ_Æ`Æa$Æb4ÆcDÆdTFÔ ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_i_4.gif000066400000000000000000000236021343257752000272470ustar00rootroot00000000000000GIF89a`#猂„LBDäÂÄt”NLÄ‚„$"$Ä¢¤lZ\”fdôâäܲ´¬†|,<2,dNDT>< ´fdìÒÔ|fd¼–„Ä–ŒÔ¦”TJLŒvtD:4ŒôÆÄ4&$ܺ¼Œ"$ÄšŒ¬^\|^Tüòô´Ž|dVTÔªœœzlœ24¤–”\F< œ‚„„ ¤JL¼vtüÒÔ„nl¼žœL:4ÌžŒTB<äÊÌ̪¬tZTD2,lRLäÚÜ„f\´–”4.,ì¾¼$¼’„ܪœ¤ŠŒ„ÄŠŒ,"Ì¢”ôêì䲤dRT\JD”vlŒüÎÌ亼”*,üúü¬ŽŒœ~tœ:<¤‚t¬RTL>4TF<¬VTÌ–”Ô¦¤”&$Ô®¬ìÞÜ̦¤¤†„<24dNL¼–ŒD:<\FD L:<Ìž”TBDtZ\$,"$\JL”vtœ~|L>}Z·ïßÀƒÃ–Í‘¶ðãÈ[÷ÞmÚs*_´hÅj“¼ºõë›cOÆÎ½ûŒå–yþwfðª‘(Q^1ðξýmí³k»ŸïûôaÊ‹Ÿ!eN®@®tPÙ.ˆ\VÁ.Í…WYÿ˜`‚ ( }ê_qòU¨!k§!2ÌS ³_#Ã@òÅ.ÀT¦Þe €òàw•‘h"Š/ž&ã‰)n¨#kndÜŽ@’VY©T–Ê~º¬7ƒ²˜–Èe‰ìQceIVÆä”3T¹d“Av Zýè嘙æÅ“3$²Ÿ´Ù¦ŠJVÖ"–lº¹_‚uºIæž™™‘˜|’y‘Fîw$™h •Y™(§š™£3@Z™¤fj™Ÿªi§U ˆ"&ÈË0©œÑFmäipžþ(ÙÊ@"Ài§¦ºje³Özke¹ªšá§]rz‘§Äêh~úAÈ‹.{ØAˆem@-Ôyˆ²äqšÏF;í ©lÛí·áJ›ì˜ÆZ„ìºðfv†.aÄk/jíVôî½ö®ŠüÜY¾í+ðÁLðD'ìðÚ.,Q,uàbñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,›\G,ÉbçÌ4×lóÍ8ç¬óÎ<÷ìóÏ@-ôÐDmôÑȲÄL7©Ä5ìôÔT»5DRW­õÖÉ]ýPÖ\‡-6n^;¨›¯àñ…imâKœÏEçK¶FÞÈÁÔûÝþÌ•u°F^"€#}ÿøà›Õ ãwºHa™ºðÆ·‘ÐÑ2·‚˜•¦øØc—ÝÐÙ•Mñ ‚‹QÁ!r–÷êŠ3×ÈgÜQx•ÅÒgF+µßžûîž-Ç[0ãÎ`E0w²¨:z¬Ó.<çÐÏà9C [ȃx1`–8 šÑ>ƒbFþhÏ|e‡„‘¼eŠvOºóÌEß9q>fØ›×—^Apb‘‹fð D•I3¾øÐd™.04é€ꀀÔ Rx_-3§ÅÕïEöÛÚôR½)ìb~n…ÀÀ4ñ¦…á™\*`/Ôša oX¾ÄÕ¯4þ½À bÑ‹ÅÑÌIPÒ`úBȵ*älmzÅ.#)0 VØ œXÀðuF ©Àƒ/0F1ï‡38(XŠ3Q3¬ÛbeöàF˨éƒLÔšR½ÌYf  Pü*ã½ì|ôÌh¡™Ežs§¡À ñ r…ÔÅ.ƒ€\à1TÛ#BúˆÇ_±U«SR‹4»UÌN3­ƒ¤ Œq±œe-oÉ™zуÊsó””;¨¡¨ñIP:M”!%æ*C‡`T¦ µˆÎt.“ »áMoGœ#ìæ…\cmâ$§9ÑÙK4&2œ3À¦6é&…à nþ†üè̪AÓ `ë§@ÅöÏ‚t õ'þÂ4,/m.¡}ÏBÿÔЈZT¡K»¨F1Ÿztj%ÈA?JRb…t 2CšJWÊÒ–ºô¥0©Ly¦´ŽP¬e8Í©NwÊÓžúô§@]ÙË2ZÒ¢*l¢ª({hÀKVu(/iÔžT #!?UÓ8:—Y$×+`XUˆ^uYjX!DÔœ†uœ/ŒPVž5­_Í/X‘šä½€tuè]•ÚÞäA^8D‘`d§Ñä"NŽ·ŠÈÿH¨9m]kÑÁöÕ4·€DæÀ»7¢†R3…Î0…&ĨD8ªþäe²ÇYÁ"õX„mçwDQ™DhÏ´£A­,x1…ËhéJÀmk›PϺKüÌc-³ »Õš\ò°Yæ"Թ胮V?ó‹}^F „ ¦ÜY™¿z÷»·uWn}Ìý¼b±¢a/w‘ªô UÂ’mùú^‚W­¾œA#!>Î$‚uF8€‚A8þ¤k\w"Y Âχ©¯™*‡ _}ÍwÄ(¾xy¦§˜Ã~±ŒU\â‚xÆ8¶Pvãûø51þ±É¶c‰àuÈHX‘£ÖcÛ4˜5 ï  údú^§Êóy²ˆ›¸d¬5ù5XFMWãôU,~;anÏþ“S1V.U­ÏÅ [Ï ×3_¹KUž«›;jg)¿‡ÀRNs"ï ªÎ¸W„]þZ†";ÙYÖA™Õ ~Zܧ™t¥/m €BsyÈÅt¡†N±•™ne- ÊFÈAŒÕÓf4miLˉҵîô§¿êQ—úÔøÍŒ* ‹@0ó;xE „WͰÚ՞а‹}ì3$à¯H@pØÄ.ö>ùiÄižÍÁîê1ÑfËjYëZÖFÀÔŒ‘ˆ$ Ý§™w½ïm÷;oë h!ÑÒ ´¨]wk_;£E÷2ú¶7¾+q~Çߦ øÀ .ðÒj†Ã`Àþpaš…hQx»oo‹œä˜4ù0*ZÑ’¶2"ÕiTn™åž›¨Ãý7•”„\A+w€´ëÒ ÞºÐé¾mƒn\¢séášQºVµþ¦›ê€úo5C¨Ý,6æÖ Õ-s\.•Ý2eGû×{ûÛ¸Ÿfí=;G1t™êâºÙÍ,–W1 ¿iq„7³ š¢ÞyÕ÷6óÖ5½f÷Ìw2úwëæfê ‡/Há ûá½ïßøÖ—×öê5 {wßûß¿ùÄo}ñ1óvÓœ=í›Aoò3þSýĽ»é³ûyo?ƒCÿœÏê+;3ë†Ä/öÿù?}ú…Ÿúÿ««WJß2õG«%ɳDñv g"0£2±@sZÅ_gp{ìW 8r„$s˜>¢¢sé7$W€¶wùs6a.Т. Æ`œ°õ0(ƒ¼P€xt¦$'Ha ra6eg58ƒ R„7xž·   ¦‘lËVG0„•у)„üÑ„OØ[×–mh’>àÖ,3€…©³aMd{e­1 Æ'nè%[†ho–dv¸jHð$Pu‡<‚nŸóe~8ˆ›ˆÔ#ˆþ„8ˆy˜ˆŒx‹Øˆøˆ˜ˆ’$FløUTg„Æ!2‡ÜQ‰;r‰ž1fqffœh¤8hÉ±Š˜Áfhˆ¢¨,rÖVRVg©X®¸„¸±‹œ¡gÝ1‹â‹}2‚_åŠÄ¸ɘŒŸÁŒ˜a~Øq`ài¥ñjÂm¢Fj¦æm•amئm_ð ì޾mœAkœ¶8èˆiÔˆ¾¶¨6Gn•Õ ×¸7‡'i¸–Ž™¶ì¸kî¨ÀÆÓflQ¨lÌ6þ˜ ë¨k –¿Æáƒy¦Ñk)‘ÖXnÞ!çn —q pgp¥U8Â@I•A$Çr9"oô&þq Rqø†q q#ÙqR€«µp[É“û6q3@“ýöo7’G’œárø2‡rœa”‹C•БI)’wpºUI8¹•¥å’y·‘†HBúãuYbus÷tt7$×G.²à8R ÅÕv ÁuI·tk©&b·“•wii%WWyY‡t™—hv¯×—»÷~ð–wi˜˜˜M·˜mieFvŒi—}3zÖ!œ—'‡g€f²z¿å õb¤#šO¦y£Y®¹xJ(qRzG‘ˆ±™ »ùœGšœ‘z,t™›Ñ›™wy£ù›9ؕɕ>¬©‘ÁX–O¤?—‘{³ù}Ô„:‡þ —¢|!|Η à}½œÒc^s{Ö”Ü}Ï7|8¨{OÖ}i$ØG}î)žùù¸UÍY?ëY~€ÒÉGÔi8›&I*˜%y0  `í§˜ êAæ™Hêý™Zh‹s¡æI˜¸€ ø€ºW$Ê¢!ŸÓw÷IË9 Z¾`ŒŸY £t ?¸‚V£‰ð… À@½tð8Z¨HHƒ1h„*¤&a>ha@„U˜Mz„Oš„üÉ‹Ãæ„PˆlI…V8[º8iZ¢¹#.øŸ˜£‚âr†dY‡[“‰«‡¢§Šj§“‰Âˆþ}èL…:Š{h/ƒ¨C¶¨ŒúcŽú¨9©’:c”ª5xÚŒOUœ±‰þÉD~Z!—ÚÎÈU^§Š›¡ª¼ÈŠM‹;2ª­èË1gq†‹›«­Zª}<±ÀymªÀ¸!²J¨´êˆ:ª©ÁZyUÆ«¹XX»­ŠÐ(ª<MúCõxY¼‘ðømDzäh䘑ùšÝú޹­°æÙ¶mÌ‘Yó(Y­æhöˆY²V&z2†âÖK¸æê®Ú6%‘VX_pøeáZ‘ˆ%°æ('÷Iùob pJ™“\s Š’*9,ù“ðöK^™±`Ép@¹ !²Ë—þp=¹rïæp„ù 9"ÍúC_É”"›#*;sâCðT5 Œ*'ù¡5Za³c©#Òˆ–œ©˜l)zniŸp)—t˜[œ¼¡™—É™ØÙzË!\ÄUu‚„V&~\»—RËz` ™ †ª• k žp»™jÙ™±z­¥?¡Iyòé—¬‡še¸š“C²pŠ'“C)¬·´I]±w›èŠe½Á¸7K£{z²Æ¸¿å¸tÁ ‹Ã¹tr¸Üµ·DµëižaKÚɸçkû¥±Ë}I)–LÇ7~ÛÇO” wgw¹h›>붸[€Õ©  0(p  ²Û^j­©{7þjž=Û ºð Úœ1£Ã[?7š½¼B+¶rà;jHûg£¾[Õ6»¢î‡¹X2¾GÛ+ç«"ïÇœ¼€FÛ±­w£"ˆºèLrÊ‚æ9¤ßh¤Hª¤Wº ¶æ™ÀãÂÀ`¨-Üâ-nªƒSŠ‚?:§À•¥[ů§A—1Áðë,ŒÁEªÁçÒÁrû8± ƒD†õcÁtê´|kPˆ6™š|*C =¡J!ÅZ©0ÖÃ"õÃÁq¨JL‡Å„˜ÄTÌ\V|Åœ•ÅZ\W\ÜÅUõŽ8&A\X›údž:­ÜAŠi¬)GìˆL<G6«3̦(e¬šy<³¤Š{(þ°ÊŽê¬Ìù©ªx¶z‹Í–ºJ¿îAŠü ¬¼:¬š1ÈtŒ¸(=ÉúH¿«ÉYö¬’­j,ÕŠFy°™£­æÚiÄ,ýz®l‘»XÛ°'¯E¯Ðv¯±–™³¯²\eª±YmºÌmûmżj¾ì¯oAÝ&°Äf͘° ÛË\͸±³'ÈqŒUêö²( o”Û‘K•5[*˜É9«“;›ì¸.Ënç,³ËêAí\e<7Ï rOI¾Hks¥ÕÏ.ŠÏ]AI{sýrl´D´ BÐÐÐKû‘z+Î@W¶l—·” µy;[¤¶ˆÛµ–IþµZ‹\akÏSçÑCw¶ì¹U&­v0½Òn÷~-͘j ˜VA<Ý¿f<tk·V»[_;Ò>wÉãŒVb›š‹®½ô·™Õ›–;»æùœ®§ÒŽûxP­ÕX÷ WÍ_½¸0Dº­7ÖPýÓËWšRº¢ëÖ\]?ZÎÙÑÔÈ¢}Ý骬X¼ûYÓþ £‹S¼·‹&¹»»›ž½»|$ Øš¡×µK}:ý¼˜SÓmeÇ‹%ô™¼–±¼Í[µä~Ы§ ÇD%ê½õë¿ï ¢g@€„Ô€î GÛL»ø+Àúû+«­¾ûÕ¾×£½!¿³M;¨½~­}¢ô¼²X"ܧQÜôÛ¹ŸÈþ­¬ÀÀÉí³ÜÚÌÑl†V*Â*Œ™:Œ¦]º,áödá-ØèÒÂ7 ÃÜ‚̃Tš…|'(ãHæâ6n["ÎÇÊÁÇN_m\Çì!>„¬!Â[ÊÂqÄ’èŒD>³w¬VÜàH>ÔBîÈ÷räVnlÚS Êc¼¬‰¬V‘LÝÀfMÞb(Ê…Ì㉓æ¡aÉ•±äO<³{ufÈxfîå~F‹þk¾Ïd¾§,R˜p:à¿4àß±óÚhìz¬|»mƒ¯Yæ%wÓøØ›†i“!ବ™®99êeâÊ ËËðé‹c®3<ê­ë§‹Ê5Q ¿à òàô…Ћs±÷ì“Ö«ÜPI*Rùd ­S@ ’ÂpqHù"V™ëÁδ›Îʼ•õs±‰£ÎÚÎÎ2—o1iq€í6¢í6ã»ÞŽ9à¾Ôq~ëÖwÔñ騕¼ ™d+t8¶d·”­„@`ð Eô Ó‰YyxIÙœë 9>"-Ó$ ÚGr˜Hñ#-ê¿ïJí™ÒhþšðëutGô5Öf29^¹QMÁžÖÃ9×›ÑM"-¨# "Aö yÈùB—Ùò®[>_ºET-kV½zÇ©x¡×¸’kt²‰ôùZë\^{õÚxbØÎ[(º¥¶‘½‰½ ê½ÆÞүÄ¡b{ãÉ”½º…š<™Ùdî×ð©ñƒ²ŸõÉõƒöyÿ"{ Nïß‘¢,‹Kæ«Û»ÞëO*²½7º¾Îí¾ª-Ø×½Žÿ ´ À 6 Ç–>éK¢¡¿8,ê—Ýü`Zµ7z¡ÌÐ°Ýø½þø¯ïɱù¸¢Ý9Ú'Œßêeš ÃiÒùþ1RB_ˆÂ,¸ƒWXàß­ÀrßžÁd:… Âý3 0BÙ’>ὦ®¾Þ"ëÜd.ï=Þâ¿ã¦ÎþÉÿêK û-ÿ`Æ )¼tí±Ch ƒW‰>œñ+Ã(Š-^Ę‘b†_B2d›\"Mž4IÃJ–‡9jyRÊÇ—1mÞÄ™3gM=}þô鋆H‰­ÈÑcO\¢ TêÔ–«dQÅšUëV®]QE£Ò‡sòõª‰CmÝšõ$­zñ¡Un ¤ 2¶ÇIõ|hØ‚}ˆHZ·ÅËVųV”ü&½TÒÂýÈUH3UÖ €$¤_ôI B@ÞÆeo v$[½òÖ/ÆZ™£H÷µX¼¬àD„fxË.§øò¤*x˜Ìy&•3ÚX••ÚEä{Yd’{Õí!Žû4ËþÆY«‚ûb,•ChþÌ£a )´Ãê~–%èE›øpŽ=4æÐC!O,è „en #ð"˜2!…¦)A2+Hg`HÔœßFl"î@óιŸHòJ6©x‰7¸ÿþig±êké?“šzjMÀgœ(¹çVÍ'ÃEBK-¶Ž¼qÍ |±º7=t»:GŠpÑOG=ðÇ!îóÔ_‡'Ò-s=vÛo—wuֻýwßšÝ(ÓgÕû&Úl›ÁïßEžîÒ2?i9.:H¯[>ôæ3>®ÿ ‰¼þÖȽìµ×}÷î½ú^ç›qwÀóAß>ò‡¤¨@–@91K @þ©ˆEjЃþ"$­}ýhRyÈÅt¡†ÔA7ÊÑg¬ͨF4àŽè@mÍOsõ»ch0 |ý›”LåÎÀNiZœ¥³µQþñ:@ZàI48Û ñª‡ÀINt²á™pØ+Y™°q(lDÔõÃ,¢,^œªf *ÿ(êZòa–̬56JŒd´Ö¨Ju*Oj\U´ââ°˜”ºÅ†¯‘BYɦcý†ý‚“¢å@Î`YÍz!¥5®æp{äÝC¶-7‰ËùŠÚ˜”F²}R_ ™W½V6ƒSŽ"ò³ä%ÓÇ:Jñ…3˜ØÂ„Ʋl5”zÅ£LþÌRêc½|Ù Lö”a•-óe¯lKYî.…uÃ(¡W!MiÒPÕÄöÉF<å13$Ϋ]+k3ØZ×¾ÆÎ±å§mÔü&ÿR;nï'ÊÃgÎô¹¾€;åg`0>ƒ68³„A:Qù@tn¥hF%ƒPv´7õhHER‘–ô@¥OBãϘO 5iêHéÙm:×s[LO7SȈÏnäKÞ{t*S”&H¥yõÀ ˡJªÛ„*t! H xÅ+€!üé( aid£Èh¬.šžY?VmHZ•l*ú¬™Å²ŒéJªá *`þ׈Í`…-¼¥×äÄ9½)N…e¢aŸX').ñŽŠ«\çšI •KB`ÔÔ«$µÉ0Öq ¤šágçX-Q–Ž©²# ñÙÍÍ»Bã Ë«ÄV«Žd–³òHÝnpz¼ä"ÛÒ+¸²öŠO5TT- ÎvmV˜ 4‰½ðu¿U¦"Ò…®(—0ãž¹·ŠjÇbÑW¸ìµO}]!šn Íd6s•îî2Q¦²é²÷—0œfw½;YÊú‡hTg"°ªU7es›7 [;ãé5­qÁî„Ñ‚ç™àzöïžú=.÷É$ǰ´'0Åp>¿û­¨†ØÄqÓ0®N¼â›ð”Å/¶‰‹a<ãþ“ȘÆ7~hŠ÷ØÇ?r…ðBGa°È)ÐMðJczÓyÄ ¢h†W\àê&Å'.Rj‹WZÕù)¾Ýq’o» $.’ë’3Ú×:áê–×¼Ø ˜À.1€Š8Ûæ„6À´)2€KaÿyÒem€?gBâN…Òù܆#XB™8ô³¥¾õSW! }ˆ4 Hp|s¿û& @Љ>¤Øf‡»£Y}2TÁXxÜw‡i”¡ d8¨õ>xB/áÏÐø(>QÂ[³ ‰7ü8ÐîÆW~²€¼å÷ü‡ÀBóŸŸ›:q„P`þôüµD(ŽÐ 9œÞõ~)EàÍðzþš!ðº¦}î3‡À¯@÷“]Aàùð{â §DñwG‰ÀcAù¹OEàcðüÝÅ ðQ§>è«€ŠÀS<ûÜ1ôPñöï7ÞDù!'ˆÀ›Bý7Á$Ž„¿_8€Á&aûëƒþãŽÿ;F@³[€ü‹þ;ÀÏ0(˜?¤kÀ¤c¿#p¿ üŒó;‚ôÃ@›Ó„À3µ¬Œ* ‚ÀÓL PÁdÁtÁ„Á”A,€ÀS€ÄÁtA5ÐÁÂT€À+€ 4Â#ÌA’»³%\¨&$35€Â7þ„9«Â,Ä%„&ðÂ/Ã0Ã1$Ã24Ã3DÃ4ÄA$Ä8¼Ã<,ÄDTD5üC7 ÄE„ÄHÔÃCì8èBIÄDHlDO{ÃLôÄOCJ´8KÅRäÃMì´N4ÅUŒDQ¬8RdÅXdÄ6äÄG”Å[DWd8X„C[ôB_\Ã_ÄE4DENSÅ=FA|ÄdF0ÔE‚ãEFF&`F2\Æf4Ãb´´cÔÃjDÆiÄÆPÄÃJ¼D1´…' 7x€+ÇvüBf¼F3$ x"XEm¬4nüB è!þð7†,ÈF9ôExtG1œÇz¼GS|Æ‹Æ/¼Pp (%¸‚pG„Ãx$à E°[P„@€SÔGGãG/|€€NP(†‚ôC0äHodI’4ÉR|H‹H/ä6°Æi€„@xN˜FNx‚@€ˆGNØPpH/Œ€C6ð…v|Dª´J¬K/Ë«ÌJk¤ÅT¬F/À€1<äÞÜĆ„„nldRLܲ´”vl \F<4&$|^TÄžŒÔªœ¤ŠŒôÆÄ¬RT„ üòô亼œ~tTB<´’„D2,lRLtZTŒjdL:4œzl$ܪœ ,"„jl´–”\JD|f\Ì–”¬†|Œnd䲤 <.,ÌžŒ¬Š|üÎ̬Z\ŒüúüTF4$,&$\NL|jlŒrtÌžœ¬ŠŒ”ŽŒLBDäÆÄ¤FD„´jl¼–ŒÄ¾¼Œvt,<24¬žœüÒÔœ:<”rl¼šœä¶´Ì¦¤Ì’”´’”|b\ôÊ̄̚œÄšŒÜ¶´¬VTüöô侼ܮœ Œrd¬^\üþüôî줆„Ô®¬¬ŽŒÔ¦œD:<ÿÿþ!ù´,`#þ- H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«;ØÊµ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pã¶}àQÀxóêÝË·¯ß¿€ L¸°áÈ+^̸±cÄ?Ô½Q¤²å˘3kÞ̹³çÏ C‹  réѨS«^ͺµëÖ7$w@ùµíÛ¸s_>}Z·ïßÀƒÃ–Í‘¶ðãÈ[÷ÞmÚó™ HD8“¼ºõë›cOÆÎ½{‘å–yþw¾`‘*UˆŒäñξýmí³k»Ÿïût$ F$œ_$RI`ÄBeÔpY³4^eþ( ‚ 6à€ôU¨|ÅÉgᆬVÃH pˆÁ¼R™Œ\ƈ~WY‰'¦ãi4¢¨"‡<²†áFÆõ($i•@]gð·ÆzEH1‰i:\¦ .Y™“7Vfe“Oé%h?jä—dfvšQ1¥‚’ছ+¶h#?dYD›oR)ãy‚WæŸE„™Ñ˜€–yš‘•%© )r^6‹–¥CerP¨ÊiŒfVie—V–i¡ Z&(F„†:äiiD€#*Xbþ‘œ¡Fey”w^zL†QC ŒÄ‚ã°ÊZ™®¼ú:#°±Îjj™£^Tê²<ž¦`±_„ ¬!8Xö(€"ƒ·&È1Iöe»m·H–{nºÚr -™ÍZôì¼øfÉ"äë/jõVtï¿þR!'ÜYÀ ¬ðÃ'ÌðDGlñÅ¡N,9\áñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4»œMÒçÎ<÷ìóÏ@-ôÐDmôÑH'­ôÒL7ítŸ“l‡ñÔTƒªqDW­õÖî] QÖ\‡-vr^?öØh§[Ùú¦1 ü›F Á$’Ð2Ãþ‘•5pƒr°ÑïÜyV† 9HF,ޏâŒoÆóž¬‰eûòÖ§·yï½ f¥M®¶Úl7äveHÜàžR¤aBe䙇žÐ*"Œè€@m~A yD"…°Tö{ðÃßÙr¼±QŠe8°¡§e±ßJ{ŒvŽ>zé ~¥n" V–•=ªYï’` Yû£1ošaXf‚Ó“ ú{2÷¹ö¤#4Ô)€oOHâä"EëÓÌ n0„4Yf‚ ü¾‰$¡CÈA$ò÷ÀFáEØëŸ 86î-Ä{ªPƒ²òä9À‚jâ ó¹"$þæû|˜ NBˆžÙ`i\ ß¹‚r=¼¡”ò·A¢Í… qÝ8 ·ÒD‚a`—LˆÂF3±Š0“Æ5.Ï¥Ñá‡(‘pŒ „ÒýgÅ PL<ã %°‰"¨/Rü›ÅÉ €B3ŽL"+ó,’rš9¤ùø·\& ]Jaµ†Å„xt—¹AŠP+ÙáÊvˆ@îx§Xˆ@ _ Å *cK\2B—’ü\ïHØJë1I|00„5œ€£äZ)rJhn€‰Š ¤3.Ë4@ ÜàvV™ h æÂ͉ÎI¨3˜ ¦izˆ$mrsDþ`(@Á" 2ša›æAÎЂnïƒÒAÚG„ C'š‡¢ÍèÅ,JŒjô£ ãè@< Ò’æK¤!©IWj*”ZBgO‹©LgJÓšÚô¦8ÍéТÖŽÕì§@ ªP‡JÔ¢õ¨3»™ÔXÊTˆ¹T¥Áy‚‰T„$ä 43¸dSMúT…‚¦wÿKM ÔƒšÓ„±oFØáV3ÚUà€µ3”hbY+ Î@k-i[óVÎÜ€©ÑV—Wî5~¦©Â$ä`‚#…îM£™D£®i.0è?jNáX9‚Â~ô°T@,‘‚Ô“¨‘…Šàè€N8þVv¤§ŒÏ³lE(©¼úÞ¨¢2¶gj6U™I(—Ù–P ÜÛâv¢ Õ Hè™IÔ®2­ˆ…r`…Êà ²Ìee(Ÿ»Ðè~uº¢ôÌ üy™HÀÀŸš¤eˆ ,ò–W·Îâm0•X#45qµŒÎà^?+X3Œðjßû.5´òE¸F3V& ÂràAãú£.y1·VjmpCñk/ýzç »tMVEìàø°øÅ:ìÐT3c¿Ø¼6Î1vp¬ã#‡Ç>òo€,ä"¿‡Ä3±‘—<œ§¯ª‘ê\«zÕ)_ÊîyëŠýèdá`™ÂdElÎjeë|™=om@þZ¹ìâÀÒ87žr]ÝŒ3{§¯wes†ÞLç÷vÊv†fu;Vϼ e'aÙþ`öA›ÕLþ t‘V”¶´iñƒÐ)VkrÀØÿA²–Yt£%ô E:3“6B¥/ÍÊLw‘Óž^l¨G]j4¦a @„iN`#árœQõeD¡Hü:Ø•ÑÁ$ +¤ Ÿn,ƒð£ŸÓ(›Vh[ûÚØ!G6Zaf4¬ ¡ b·»áýXüö;h í@1ÚmÊT8À{šÀN ë­k™½s×»QL¯e OøÊPñ@¶ «¨©JQMrèŒãûþ]Ä£ 3§½R¿¦"ŒÞ2yïÖÌë^øšPòE""þŒ@÷¼×çO³^6¾×S·¯f~¿ûÞ+ˆùÁÏÞæ9£öÝ´ý3µG~fªþo¶'Êíþ‹»¢0wüÊÐç ½Ì€ |àdõ×Ô›‘^{þÈŸþ‡æiâ\„õÃÀÀç†,Â^~rŒP b€8}ŠÇO`"%gª‚Àr)äø*îW˜qæ“r+g'©²*3‡–±`è·[—qa¶a‘Ðaì"ao¦ÆÅ4hƒ  ÈuaÆ‚Æ 0xp tZ—‘ƒ7¨ H¸ƒÒÇyl”?ÂöÄ@&C`„–„.8„ý…Rm @m pmþ3-Õr-EÀ…´²fâ†w£d_‚b¯q(vø%[ö†]Æd~è#p(PÅCôdPõ‡þMÖfˆ¸ˆªAdŒøˆšáˆ8‰•!‰”‰–x‰Œ˜‰Ñ’R&fVEh„f£øO²‡ÜÁ‰RŠ›QaSFfbve®ÁŠ«A‹hbdˆX#‡§‚üGUsVfƒ6‹O¦yÖª¸!¶ˆEg¥¸Œ|Ö!؇†Œºø5„kŽÆl‰¥k¢Fj&`jÒFmÖ†F0D>tެ¶Z°fk k³¶i†mÞÈkáX\“eD«öhòXˆ'iî¸'ð¨iß¡ôjߨk›álÀ6…@lƦy)kyyköŸ¶kà SyY¹l™nÞZ¢uo"g·oýöo¨þrGÀr@ UO q+¹ Go§±“-÷[§oço·Z Wpé6u•á“{”)É’Bù’—$grÀqGàqëÆpó¶p Ç“ö•'•œ¡D-9”0€³ev·c×h6Ô(>gZ‡t·å}HÒY 0 — ¨6—ŸquVWu6T—K×tt§%Q÷s¸‡‚™‚™uÀõvε}`÷×阄†Éu•iŠ”ó™]˜ y’oÙ6¤y¥Çƒ Âz¡W3Ð/‚°:­É—ǹiÈ6|Åu]®§]çw x‚’»™xMÈ©i¢±¹ÉYxljyšç›’#_vþr›´"{Ö’—_=¨ x9våô:&Ð Ú÷Ðç|{ÒžT‚Å×^å'žD¸ðù|ÀçžØ)yÜvß×ùùžûéš ÈHŠ)ÉWçg¶8€Ø‰r2iE° p–¡õ• hów€ñ©•Á&€vŸ¢ xºœa…ß1£Ä¢ Š0*yþ%L$Š¢X(è Š¨B//ì‚:0†P†–ap‡Iº.œ±„8XƒIØ?ØéŠkˆaAÈaJJ„Y˜Xª„ZÊ„º¦O…Y…WXeŠgº'uÚŸê¶¡F€þS¥b¨Ù‡aC‡þ®‘‡…b¨ ƒŠn)¨šH‰Éødä´P‡($“zR©i:¼Ø¨‹ø¨šZdœÚ©Aö© Úc¢:¨S%]TöV¡h&¥¨RªÝ«á¥T‹ša«8Z–\£f¸Ø5—Ú=™šewv¿ˆªÁ¸Ç*h¢)‹)«•qŒ1ö«/¬í­}(&fPV}…­Â¸<³ ÊÊÕ8­ªëØiâ8mÕÖnçhæ¸{ü(9Ź‘ yÛX’ã¯Y²Y¨VNúH’­æÞ Y÷‘j¸>ù*’ ¹®j¯Ö°à•D` ð'-{mÙv$ËY=‚’a©–‡oQYq1‚5iþ7i²é† bé’* ³;B¡!È€Ëp•q”6{Ÿ‚s"ò­pt–dù³'‚3‰^„HO¥1lЛ+»´õFZ/‡´§É#()—‹I—“i—Åu}{ٗٵÙ)L¤y[€Yžà¤–˜O×sf«”ý#~D‹¶_»tk›™ü…ª `sÇ·`{¡f›µèz¤™g܉°­´i›…(š y›Õ¸:«sÀùzĉyÙ¬w·*ê?Üi¹}{^ýq C°'¤+ºô{#K­YH–aŸk¸Z€žêY´+³µ»ž:—™ÄÕ)*4Ÿäg{¬š§|d·oä¶vB»lK)–"|Õgþ°›`»yù¼ Ú ‡»gaÅ¡0гT{¡º¡Ø¡˜ñ£¡û9â›´:,»Ò+§Á¾E`¢öí'¡Ò!#È*½á'ö;¹B:€äkÄB¿ï‡ª•1€*J ¸þó¾DÊ`ß›haå§K¤MJ†$¥Tê…š!ƒí‹-cª&N ¥íb.è2#{ê¥l(¦VÊ\sÊGhh-§QÃzÊØ©ÁbèÁ‰â.-|n{ OýÒ’Âfø9>ÌJnxÁ9GQ„Úˆ*U¬=®Z!°:ª0¶Å¹Q©\̇GÆèÅdl_f|ÆÏ•ÆjìYlÜÆyõÆ_L&ŸHU«ºw\®×Šy*YœJþ°kJÖZh Œ´Šª¸Š‰¬¼h†‹ (¼º0LMƒœ«õ¡«±J¬r%fÉšܘ„<Ÿ\ΪǪ!­‘8ÉUÉ LŠ˜Ê•¸­Ö¼Ék!¢˜0®¦œçšÊömëúj £®÷Zk)7 ÛmøÊ¹!Ù®#Ù¯­ö¯;}›•e°ýH8 'ÉܰšÌÅÌÐ6±ä豋¥mýÁmjøm 'Jô± òlSˆ±û9ÒlÎŒ²Å,²~¥Ê¥!>›“ÝZ²9É”B;s¾”cY³9yÀLë]FYs!IÙ¹–qÐ}Ð=rhr]µ¥uZݳMËJär"ÝþÑó©2µR ¿9+ZV{Z9i¸¾|¤‰I¸h×¹\»ÓœY$b÷VJ”¶ŠéÓÑ{¹o»Z9 ˜tÛÌËKm¶ÿyj‚»tOÓg«³ƒ;ÕÁô·äYÕYkšm™ ¥¹‹›D¬ÙCÉù¹¯Ì§Ÿ3ºÏ›¥{j™+œ¤yŒ !lÍfÝCÍI)q½zÏyš›Õs}&½zF‘€ºªØ Èâ%É]–}¼›|ÝžÉ7 OÐA ½Â;½1b¼ RŸ–mÑ@(XFÙ´;ÕG½A›Ýå—ÕÃ˃SÝ3ÿs½Ù¶·»A½ë½7 ¾•q¢ïk¿Œô¾/zrˆÐ™1À0ú¾ÀÆRöþ‹¿ìWÀ Ʀýó¿í'¾”¤Ò0Mµ¤Ý§q¢êÖÐ̓3jrFìÀ¿ HÁEšþ|QÃMLÂY-ÃV§7ì͘¡ßÜÄü¤irBŒ#/üƒ`Ú…'L%: !ÿÃZXøí…Îæ¦?làv2áÞàrZáýƒà,̃†½Õ^H¼á*¼AM ¨ý̨5ŬqÅ aã‚ãøòÇ¢RßÅÊpÌb° ÆÊÁÒA1r|ä,•äJÎU>>R@Þäküä)åRîÆTn ƒxåqœå`®ÿeuŒª}lº{\˺»œY,‰²*Oy}ȦûÈ´¼æfžâh®0jnÉþÖÉÌèå¼æÚ©Åjº£lÄ|…çËJFQuÎçIÔè£Ê•èŠ~ÉyÝŒ€nué~ç«øè­,ê¼LX=þ ylí;- +ÔÛÖêRÌ‹» ÍÙ,ÌRÒ±ÃVlªÎÈqÇ^æ ©Í˜vÌ»‘±Î¨*ìéâû¼>ĬìùêÊlÌñH…¼þÒ!‹çÌ:}ºÏy@v§Ž¸X )<˜3p+~¶#½'9ɳ4WnHI[ùÑWI‚æÎ@°J( …¤@ðp÷é”åî*½Ò‘Ë%»A5½>}ðE`Ð 2´KÉ•wïgðk©Í¬ð7ÁoÓ•þ |kþ'“`jãwFO}€ ·rþÖé gÐ¥MŸFm•tjÖ­]_žñĪaǵm'†,ùôUŒŽ\y\¸N*–‡Gž\ùòã´o?gœÛ jD?Œ”HqÀvî̽ëUåûxòåͳv]½%éçÝ¿‡_þ|Ðé×?oO_ÿ~þýýŸ¶ï>Ûòû¯@DмtŒÀ„0B 1[Áè"®¬äöÊ ÓJ" S qD¬ŠˆmBW,¢B s°5Q›‘C«.ʨ´ƒÂ¨ê*õ¨ÁX$òA_| Cáf\2««(‰å´ƒ@!Ì**hAŠäÒÀ#‘Œ‘5&ƒ³Q§(‘ÒÉ«˜,‹ˆYº„³¿/_ÌþOC‡ª˜DΈÉ#€ˆ$+;Û2B‚†òzˆB=1’&#†ìŠ˜„‚6à¡+@z4ÒIâŽÍî"QÔвò!NUé›ÓÂ:u FR¨¥›Ž@‰#jT·4fPE•Æ<¨\Q8b/DŽ`^H’I‹ðCqb e›}¶×ÉÊ2 dËJA’UÏ…¯U_î&U,2÷&>‹8#Õ¥´Î v æå7«5r”Â89¦e …‚¨`o%èß}É]‹ÉSW@v¾×&äàø 9<î·ˆ‘UÚK’Pšä‚Z‰Åˆ¬ˆveޱ4™d‚ò0îbŸ™þËø¾üHØ^‘'5z Iô¥·d‰£ÎÊKSºˆ”"A‚¬Ö©Ì°#¸M5~F[¹ ×Ë/ŒR`$–£IŠ ×ÒÈÊm¸åè×`‡…¸ˆ4êÖUÙ#ˆäŒ³‹€’ 5ÎàÚmO|ñ¹É"hð\“%-Ó]¸µÕËo«®¾Rs.¨²2Ý/•BY¨†’ZˆÑ¿ÐÂQ#Ž<2+¬‡ÇÒ !·¬ÊÐGmtè¼lLÌÎè9Í^[­´‘Ç>ùÃlPÉQãÍ7à²'¿|¬·çþÂԜϫºë²[y;óçO[yü¼§?ý—³ÿ6æ÷`„¾ôÁD`þ)DÀ&I„`^ú7 FЂ œ`mþ‡®'xHG)ŠdsÁýe°{bßer÷Á"ü¨B2 ËgÂÆl9ìKai÷½"\)KŸ“áüh¨>øà°9h⡆ÜDú q1ù‰D& D¤Ž$Õ)I‘OzâS¨ÖÔ{}q C Bôµ-zÊiW+¦4Å).~J;ò Œ½˜8C60?ÆjÖøð«wÝ$ïÚ–³ eÈYÕJM8»fõPÈ*O€Å丵Hi¤Z×ÊVÙ­{¤\{4Ÿ XÌ«]‚‚#®Æ°Ÿ…<å‰'(\Þ^¡¥ÃLþ†0(Œ Á´¥šr‰Êì©7Þ;Yðî(’PSebÔe)¿+iäšdlÙËb6³šaÓFl©“}í¸n;Õ{.ô¡cùÙ+H$±Vpü „>±î¿ãZð¸^C&¢ÝkÄ+™pyá?xb'=׉ÃÛ!ùÃóœð€ï|ÐëîågçþZ ™hÃ,pýÍí¬›õÖ„å{Îx@Ä׉pùëq}ö\§]óº÷<Ï/úÑg¹ôº†(p}€FðzØÌçuâ?{@Hÿñ.‡þ®g^ó6¬Þòx~ówm{@€ùâw>Ý‹Ïäg÷!fPB#¼ z@x"™ ÃV±nûã_ÿU;­3;Çã¹Tà„¯ ;žë¿üÛ?@0¸=H¸=0ÀëƒXF ƒa[Àÿ„ ¼À ĵ l@â[?){¶A#S(ð8O89`ƒCÈ9”A|¹T˜#ظ3—S9–{—SœÁ\wP7\Ë„#„OøŸ3B|þÂ(œÂŒÁ#œ»œ²ãs¸0C@ ƒSˆƒ1„¶zóBöK74tCh+„I0ƒ7T6õ[C C:ÔÃ=¤7;¼CËC>ÄA6?üC DBTDETÃC2 µH”ÄòG²9RÐÄMäÄNôÄOÅPÅQ$ÅR4ÅM€9°Ä KÄEtÅ=lÄUDÄ6|ÅZ|ÃX”EkE[äE‡ÃÅ\±]ìÅaœ¶_FFbTÆ:<ÆY\Æg|¸fl1HœÄj´F½ªDi\1L<ÅnôÆoÇpDEUÔÆ`¤EhDÇh3Är\°d$Æ ¿bĵX_›…pCcdÇv<Çe\Þþ“ÇÔ'ôÙ C}ÜÇsÇ^Ä:ȶa2ȵYP4DÈ„ü¯…äÅUÀ„‡Üº¸¹1¼HŒì¯ã€7ð#‰$¶=˜_#ƒð?H–T‚‘+9ø˜ÃµA€…(…žüÉOJ@0ÀŸJ9ŽóµPÁµX‹\G’,Itó:°ëm£ƒÀµTÈÊXHÄ:Œ»²›M ƒè\K˵lËÚ“½·dK¸;¹s9\[I J«¤0“t¼L˜Jb#„\³>Ál¼]ã<ÊûOðÊ\kÌÇô>ÈtL][Ìu“¶½ìK¿d0“´¼DàKbS‚\#?МL]¾þBHÁ5ð\SM#`M\;Ê\{ÍØ¬½•ÁL´L1I΄/ÀtÂÁ”¶ÃLë˵ìã5%8µ3½åĵUØ‚]SNæDNê“6ÜLßTHt;Àà„± >°D@𴺦@Ä5TÀ?çõ$öÄ„xtOöDOž“¶YèH‘¬Jí|/“DI•dIiK™¤IË»ÉìÁ—«B\SX(7@hÐÐDའ…P-¼Á܌ʂÌNþô/“LG@€G4¼Ç|ÜO5/Ñ%¶UQòbQMÇÞŒÑñÒHåE½QíÊQ­EíQìúQ uE!Rë*R#eDMÒëbµURÒ)¥Ò*µÒ+ÅÒ,ÕÒ-åÒ.õÒ)EÒ'e.=¨€25Ó3EÓ4UÓ5eÓ6uÓ7…Ó8ES=Ó:µÓ;ÅÓ<ÕÓ=åÓ>õÓ?Ô@ÔA%ÔB5Ôÿ ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p.gif000066400000000000000000000520521343257752000270340ustar00rootroot00000000000000GIF89aìh猂„LB<4.,$lRL¤‚t¤~t dŒJDd*,,"´jl´Š|ôêìŒ63Ô–ŒÜªœä²¤\JG¤–”Ôªœäº¼œ:<Œ „ ¤JL”jd¼z|üúüŒÔ¢¤äžœ<¬žœ¼šœÌ¢”ÌŠ|t䢤”FDŒ"$”RTÌ’”´–”Œ*(d24´^T´’”ìÂÄ¬ŠŒ||jl| |bd„jlœ~|”vtÌšœìÚÜüÊÌ\:<¤‚„ä¶´Ôª¬Ì¦¤\4$lL<.,l„&$ľ¼dNF¤’´’„Œ><  \644*'Œne|b\„j\œ~tTFD”vl”^TL>9œnlt^WD64$lVL,&$\NLäÆÄĆ„l&$´fd¬Š|ôæäŒvtŒVLìÖÔܶ´¬VTÄžŒÜ¾¼ôÆÄ¤FD¼vtüöô„œ†„œ64ì¶´äÎÌÄŽŒ”&$„¬^\”., ŒNDd.,´nlôîìÜ®œä¾¼œ><Œ„ ¤NL¼~|üþüŒÔ¦¤Ì–”|ÌžœìÞÜüÎ̤†„Ô®¬LBD”b\<24Œ24|fdœrtD:<´Ž„„ ÿÿþ!ùÿ,ìhþÕ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“[ ¢¹óçУKŸN½ºõëØ³kßν»÷ïÝþ(O¾¼ùóè׊g«½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿû‰#Bzhà&¨“¶$áàƒF(á„Vhá…fˆ!vèᇠ†(⃶ ¨à‰(¦¨âŠ,"Äàˆ0Æ(c†Îhã8vXb‹<öèã@ööbŽD !HÚL$Öè¡“FF)e;iå•Xf©%fCNé%Œ5Öa‹M‚å—hÊXå–l¶éæ›pÎÕeštÒøàx”™”5râ öLPã ?ÌÐÍ)óÔ©(†kÆéè£F*©Ss.jé‘wæ¹§žzæ“Kuì3h“C,óÌ%÷\ª*„Nêê«þ°Æ*kJ•®ºh˜r¹é®zö’hóŒº'9rÑ­«¶:ë²Ì6ëì³ÕŠ,H`[èɧƒÝpR¬°ÛNk©²Ð–kî¹è^)­¸_ž©g7\8HN¾:¬¶˜²«(¹éöëï¿—·®¾Rº»ë=—<³ =5z ª¨ø>h0ÁRòðÅg¬ñlS\¤Á5ÎsJ73üP#:zI0sê±—o,óÌ4לYÇ/‹ J9Û³Í@-ôÐáÜó¥Tó /»­êÏDG-õÔT—e´ÓŠf"Ž=:Ä‹õ¢PW-öØd—½ÔÕ_§­öˆa›íöÛpÇÓ>½Pa÷Ýxç­÷þÞ|÷í÷߀.øà„nøáˆÞË>r7îøã—4Cµ”Wnùå˜g®ùæœwîùç ‡.ú褗>C䨧®úê ¡½öë°_Ø6ë´×n»Ô®Ç®ûîTšxûïÀ/töìÂ'¯üò³oüóG#ÏüôÔWϦóÐgO±ôÖwïý÷)b¯ýøÓrþù觯݉·ïþûðÇ/ÿüôS±¸úøç¯?y“—îÿÿ  HÀ"étûK ¸ñ‘ï—2'HÁ Þ¬AÌ`ô|gÁzðƒd×rñ¡) ÊÅ4ˆ5 ‚ð…0Œ!^œ71—}èöA t/ØËþ^caÎ\(Ã"ñˆgqà…jX!yÐÃLò‡·” (±gDD¢·ÈE«(ÑBL¤-äE^%¡ºº¢Ç²ØÅ6ºñE¡a“ u¨_qˆr ƒ4ˆX ŠÇ%€‡U<£LxLz¡Æ—±ŽŒ¤$i"Ç=•êT©ÚU'¯‰Ã œ¨ƒ4^,#rhš&!ôŒc5r{œ¤,gIKœTÄJ‚±ZÖ¡N:h™¨„Ò°Ç-Ì€—­|%,kÉÌf:“%·Ì—°ò¸Ç$„bxè#¸U9^.R™{ä3ÇIÎr$š㥆lá‰ÅâpP–!¡iž1àþ,_,ÍÉÏ~úó 茘=~Õ!yÐAr˜'àé LðB¡ À =sAÆ|ŠKœÿ̨FµÐU&axØ$„¸CA!݈Š™‰4ãh€hÑ‹îs£8Íé$¿˜£ÊH…5µ©N‡JTHò4¨H­F‹ÊÔ¦ž¯Kž QT“š½¥:õªX]ÞQ©ÊUY5«` +í¶ÚUª~U¬hMkãÈZV¤žU­p«ØØÚÖš¾U®xÍ+ÐèZ×|ÞU¯€ ìÅŒ&ÒùôI:aa£Ô¾’覂¬d§FØá°šªQm5š:¶w“ ­h£6§j)‰If̬…œXF)"«ŠŸþíhgK[™•ÖAbÒÕbÓ©ÔŠ"6µ—BclÿZÛâ7K·užxÙ§? \tD”ƒôø >þ1ƒ,ä!7•È qbö°Ç¼U¯$´XŒ@t%HB²IÈG¾ùYâ÷¾ømQr“°\vêS¡×%QÅ­ ~2”£ü¨)Q©J{N(¼/ò‘_ü uðÇ!à KšŠÀ >e*›Da:(™õ…l~WÌâ8%·¹b®ƒÊ{/Mær—Iðe€ibS¹Çô/…hÌHH4Hö¤-bŠËb¹òÇü 2>ÁJW:Ö¾-β–ÉSÚ$aKÆ9ž"À•/ê:èšÙÜfþŽ»)dNzm—Ï8&LO±ãC†«l@< Dß+«xË€4‹ö›/_ÎkÆ¿ª±=kÄNw24 ó¬§ %DdñB`H Á —Õ(Ò:“pS,èR›zМôÁ¶°†bB®‘A”Ð…Æ3 …¨D=-!K˜ÂI…82kqL€×¸~('"jCŠ÷Ï§Ž¶´ÇChÞŠŒd&+VÊì±20“t'MéJ“–¾4¦þU@&G ^ñz­ÈÖ d—Û¥0uÙLƒØW,Oûß? Yw¦¡ÃˆãVTcIð†;\8˜#Ü!W¸ƒ ‚p„æ5‡ ¿Ø‚tèÁëà¹Ô§®—0Cðø8Žp…+øS €4žtò­)Θ ÖÑõ.0àå ºÜçpØ¡ LF9€ž‡ ÀKT”ÁU›Å&aáe·Ñ:ÑŽmt¡ë~8Á0œ‘@ƒtϼæÇÂ)€àè‚9â ¶gªÓew˜„Í˳‰—Ñ2Ðõ*DcÇ8H6Ò±ùÞû>*ÒPF 4 fø¼ëÈG¾4  ®3c]¶Ö’T¡yäÂþÈE½Áþ!Ö²ÞµT´bìgd Gpý@ˆ6®‡*@£SÅ5–ÿûúÛÿ&}þ`@#ë—|(€27 À W° é§/6&Ôg!35ä@ÈPR%cTFP2jã#;B5pÐ !˜|wpÌ š9w0ƒ‘× SP èp|'8€ç ‚Ѱòáp) ˜€ (ûÕ_‹æ ~(‚‚P”!ù [˜’Hf–Ö5€DnÙõ^ÜU-ÒgÈ6¾‚"H‚AW Gp;(€æP ZÀïà  ƒz¸‡q 5xƒÐÐw‡è>Ø‚þÊ`tqšð¸ Ê`K¨)M˜`bcxká%:v`¢DJ 6bB†beh††#¨ïÑð0|Å÷†„ˆ|)¸‚-ø‚|¸‹r‹ˆUtµX{v€‹.H¡ç°~v° .’j»cVhFô’hƒÂoc†lžD<6LÅ$e.cЧ"äÎçx X ÐPÃxÚà~ð'•Ç‹öp±¨ éÀŽU€Ã(é‹}€Å  ý ŒyÀ Ì`‡ÂÀ ¦õe±Æ-bV#š¨Hœ(M’…h¦MÜ”HöD†ãø!3\‡‹²h|p8Œ·È‚.xþ2‰_*I|Ì`ýøŽñø~ñGð0Ñç Çà ćØuw †¼j&/Õh/5"Sø U•IphfÔhòN·jù 8’$ móСŽ6È:)ñw õ8“t WÒp `“:8ŒyÐ<)Ç”&! WP€Ñ›€Wàh°gª¦Y¬Æ0r‰°6SÈ0¸G£0’™õ ³†P õh¹¶l»fFÎf– ¢r‡™³8ˆ.yˆ.(˜uY›Eƒ °¯ùŽWЃÌq©ˆ,΀ Zp pË yí‘/P ,#S2'³mÝæ  ÀØþ·Û'ØV# u2n*ÅRø†nÓ´oª¹š7'´9l Œþ‡;9× œ¶™Ÿ‘Ÿ8¸—µè›?„1¡ Zg° yÑPð ˜Û‡Ç332x"‚xë¹N”Âðy8p“~  EèüÙŽïx~iŸÈ¨Ÿ(êA~Ø–í(ŒÃhˆÆ˜ˆ4±   Ð`qè—‘à  Üà ç""qLS¡º£߀àÀ¡(È z€ƒW0—3! ®i|.Jˆ/™‹)º¥è“ºÉ Õ€£ïx]€jR{5‘°Ž7ŸÉ—vsÊÐØpñ~`š@›·5]c¤þ±ßàW°à0 à ›p¢ÑÀ >˜ËÐ8p´8Œæ`ux‡yÈ¥ Z;ù¸í(§q™L—èàqhè ‰á D‚ À¦Ñ"¤„êW¶W€Ÿjuj59‹-Y‹/ù÷ªÎJ6®¹ ¥ú–é“ïy Ðàª;ØÌ  «1„W`j(‰¼Ú«Ê´#ÂÐç°! ÚЮRj!ꎱiŒºø¬þz1lp ózèÀ ÉZ‹~À©|ÐË  'ª}p z°ØÛ°€Ÿ Q 0s骮T%}0yp×@l˜|ÚÐÅðþêñ©Óª¬th‡ ®ÿš³¯r¬Æ×¡ïX²è`ŸÛÒð¦qºƒt sr)d²NÓ(› Úô7 $Ú­-k˜N‘¯ïè¹´:¶X³Gà³Ã؃AœE±ªÌðx;x/÷wzMë´X´O`UP„z êP´S€š|çP¯ p¯NA¥ Œ#*›ý*¶K Á·’þIˆ¾ œzðÐt­‡_®8‹u+. »³[7B¡^uS ˜Åpðª P n;€,ûdK±'Ø~/§¥‘¼Âq—y¹›eêƒ@جJ‘­š£›±2As¨ë%«G!Óþë1×+#õq²uóàªçzÇÑ`¦êṵ'›\[‹õ—ˆ+¼ò›¸¦•‡ª  ¼KQ´p𩍠vP ¿0!>Ù{Sâ}Ö+UŠâ.á¢pâÇ*–8p­¸‚{‚ç`ÑCkÁÇ¢úª¬²ºó›Â–›S°¤÷û¶²)£O)§]p¾ìW§r‹Á5À9’Àëä[²[rðñ g?€OFRÄGIÌÄHL&@ #e¹º ‘u´‹µ¸û»»¯0™»*ƃÁÂý9¸„£_ü°N1¾¬Ê­'«à Æ;1'Oø\Øå^v&† ¼'ëÅG~Ä…þ{¢Ç ` xàC€Zêe(ÒEnù0xpl^ˆÇÓUMñÐȬ'[Ø…Þ… ¢²˜à-ƒ\ȇ _ò•u…ZøÇš,!œÀÉàÉœÐÊüÉ» ÃV^ç5ŒʆŒÈñÅ!§\#™ü "Ù½!1¾å{¾~¾ëíKˆï+j,ÆÔü!*ˆ¼YŘÆV‘­Ûš£ß®G1'” ž£Ø`ça˜ä  ˜`Pò ƒÀϰî<`™´¼‘@¢(bª¤cø¬Ïü¼+í\!²üÊ´ ÏòLÏ$fbåÌΠŠrаLÑ´Ì!`1ea¦aIÀaI ÐóìÎ%6™¯V#}þbVöX(á¿Ì`Æ]×ÁÂ^1ÂŒ›Û¿Õ¼ÓbqÍ0½ƒÚ̯Ӭ»kw¼‹|‹±4MsBc5eÆô€Úrc®ÔO!ÏÀ‰ThÕA¦cåÅ[V­TF¬g™ ¤YÝ$TÆÕÀR#c-Fe]ní×gÍÇâ bdÁ–dT‚n’Ö{²ÖIàÔ¿LX½ÒVÌX\»Û²r d{¥0̯<]ÙO±¢À(Ù§ ÛðÅ<<þ{´½«Ãs sÒ-ßò‘zF•Ø‘j%¡À !…$ȦcªMÛI…¶]ËØä‘é|f²½ÚŽf©mM½­fÜMÒ –ð×r t6‡þÛ³=(ÃÚºT#®MÌŒ!¬yyg¾'¸ÌûÙ=½Ž"ê¾p9«æmÙîð@$¬Ù@ý~9›^±ªèPÂxè ;ìEÐHØFOʽÇLn%½à ‘‘P‰a-OÎ*ç5Øå2`ù! þàî2H&uÐ œ—–i›ÖiƒíànO!®à·vOòÝ áÒ?-Ó ìÏLŸë ¶ïä&|`º¡cÊ›)x8° °œÊ mì¹±*ÎL! )å)0 Ðåï  `¾S@ ÄpXyÒ ¥lÌæ™.iÔ(š¶–‰u`Ë` •ˆÏ§4Ð¥¹æþ¡™x¾ÏzRk#.Rtnç.óÐI è3ž½R °BÁ6lÅÉ…nOˆ®è’𬋭Åd\ü½ƒ;©Ø+äª^˜ÍôÀëm­dÁ¼?ÝvÏ»ÔJÁv;xw›¥0Ü(£2,Cnæ–oR üæI@žãžÂ  ÀT‰•,x€ æynÅbÕ~ízÂ쉵níÒž öìÜ6ìà^xâþ[ä—ð&oôöìÑ>í.ƒî×¹îêéÝíá­ÌéKí!êÆq˜¥1¹ê ¯ùúêÍטfÚñ\ÀXÁ~ „áð°Ò Ú€KþpÐSº‚pDbò¢òìÂò¢ºÆ<©×°Ì@¦¨ã¸ÞÇ@ïZP µž|~P 0 ì ;ßð9‹˜ÃÇZ`Oˆs¸‚ ›êh‹+Ú˜´Îð@„ÜàÂP)DJqª™öNÃög©¹³ËØÉw»Ÿ5©­£~‚; ÀËô\JÆ8ôøã¿lܹ;ÇV.G° á wP ¹W)7¨4b9ŽUùÜK1šÏžKÞôýuaWðvïšû=ŒÑ\Ú~¿‡dœƒ‚Ÿ|±þ“oAëÎ;‹?×~y ¥ï  Z@£k·kôïA±6ósêÁ;î‘þ­Þ_;Ô«¯s,ì¯|pùøm÷  Fí¼l0Œ­ ïàžÅpS°«ÄN6Ž~‚t/ϯ¬¬ÓÓqõk¼ÿhß©:!À¢m]´]A˜a;àþ(ë£NâDŠ-^ĘQãFŽ=ªë‚Y…æÀé©¡.´< *а•DæLš5mÞÄ™SçNž=}þTèP¢@m‰ø˜TéR¦Ù€HÇRaB?覈ØTëV®]µJS›hU¦ž½¢-›5Ø@@ôWî\ºuíÞÅ›Wï^¾}ýþXð`Â… FœX´k 4EcväZ´U m‹¦)¼¬Š={þ|šYÊæÐE{ØùóçÛÎ)«ÎERØ[ì4±c¿t¾Ný"²Q‡u>Æá ƒ)šâœ¢9FØ9èìŽöâ7’²¿ƒåz÷Ñ·'¿|óÏGß0’Ó)¦õja_d<íOï¶9µ>ÂNr1Oa$ØdK_Eüulà ³ñ½þž·? ÂYÀÑ':IxÄH®Ša0À ÓϪ± °C åÂ` U¸BÒ/,‹ÀÁ Ìt¦u”céx‡38ƒ¾nÅ \4ƒ é"4¡„h£BM;Ÿ3®@5n¨dôŠœ:4¡uÙ-›œThe•˵ð"ÒGYΔ‡.`k^DcÕ¸F0iSh_:®# £k³KahîVšyígfcŸü(4ã†9þ(¯)\Áê¨Â6ÚA„XhÕ¡B6¿4êjqÈõ Õ”°ïb¥Å©˜f·ÂÕœv ì9ýg+Ær–UÈÞ8²t?—YÓŒKY7Ñ`·É¡ß[ƒ»–CAœ½bØËƒÁ*|þ5˜Á'Q ¶˜‚²ÛÁE‡a«-Àgh¾­ª3„¨¸º–Â5’MÈ…wˆa@‡è:{ú‚wˆ=1´X‡¼²Âg™QÄEdÄFtÄG„ÄH€8‹I@Q028 ÄPÅQ|D+Pˆ…R8¾À ÅVtÅWüS¼‚°EFôÄøÅ]œ°+àÅ`|‘9ÐÅ!3@Æ[ÌÅÂÅV,03˜„˜„eÄÆlEb4Œ9ˆR„ Æ©m4Çs\ÄfD£D¼…vtÇw„Çx”Çy¤Çz´Ç{ÄÇ|ÔÇ}äÇ~ôÇþÔÇ臸€À0‚{Œu ˆ€„Ȉ”ȉ¤H{ô†ipƒ3¨#XHÄ€U¨ÈÉ‘ÉzhoHH’TÉŽÔETÉ—„ɘ”ÉŠn,ŒôÇdX™äIydIg|HžÜ pƒFèÉ£Dʤ|Çš< vtG#À…3pƒTp$PÊ«ÄJ˜üÉu€8ðʯ˰˱$˲4˳DË´T˵d˶tË·„˸TK&`HÁ&˼Ô˽ä˾%DíÏGíKG-Ò•Ô­øÓ¯´T:…RÉÌÔê L´|ÒOeKTMKU=LV]U¾ÜÔ­xSÖtÕEU,ÎCå‹YuKT­U½ŒÕ¦èÔ^ ÔPMÕQMP]Ý J%V[5V)EV½ÜÓ/ V³AÒ_EÓl5K°€qÕTý È…f Ô[ÕS9Í3­Ö¥Ò)eÕ4åVoõÔ^ ×q-×cNtÝRþƒ0è†Wà…1(Ëu] ^ÅVxmÌ3K‚8€^×8‡^8U¡€! BÅXåXð‡4ƒýP/…U%OvWªí˜ËèeP<‡[îã´ÝäEFZPöJA–á¥ä6~ã8FåZ>\*‡W:ä/¥å*þä,K% %P{ðâÊl߇^¯$äq fkÆæ&náJöå¼Ñ?.hSfâyn怾ælîdifdoÆÒQþZ†.dnVe4.e5>eg†å´ã:ÞèCÎã=æ(]eFä(⇮æˆ&hm®à”%Ke&dÐíÊLNe«Måc¶h°Üe²¬…4ˆƒ_¨…¯,êh5èOœÜ¯Ôi¦SŸ¦h ¦h¡®g2ÅhVŽähæè)]ånå}~æX6i°Fia>Õ®&ë¯ög+nê±<ê¤^j¯œëÖ…Ø›ö $ê­íi}Vk+Æê°Æâ­Þâ.Îhfâ¸6c~R—é~öÊ’žåTNi\~ì{ulŠeëÔ]£þ¿õT^h¯Lƒ1€†…X^@: Ôµ‡[€°B=…&h‚S ¯ô…Sh†f8_ TÒÞÚÙ®íÛ~]׆ííÍíÝîm\}€_×'ýíàîâ~íØ¾Wľná&î8 ‚S@X…r­<àÝYfnîŽ_Àݶ€\níÒŽƒÓNíÕÖîæöJä¶mÜÖmÞömàïâÆoÈ…êØýZWn«}oçðè¦Óé®îÇîñ€ïî&øî{ ïì&oóFoõfoÎæðøžï&¨oÊK,`‚`b³´äŽÑònáNgpè6mÔVmÖžÒò>ïônííFÝY þñ/0ò ÇoGò'p±¼Ý"°L‡00†8x€0‡tö^v¶[wF` €{åqˆ}î)×ï ßZ"/ñ#÷ï8Pòófrí -RãŽoñ4ŸÒ:÷;¿ïÌMqXs ŸW q?×ðC?\oG÷J8oò8Xïö>Õ—oúNgð…_èó ÿoÚpÐtBwòÌåë¾ÀÑ6çožì‡ò9Gô ñŸñ¯ÄYˆYÀ^×u\¥ñƒ¾ !…u!÷c2¥õ=r5Çué¦îF'u9‡oþð´ ññ¶t×ôþ†ïNgqàetm§tkG]—ñ±ìõ_v¯T÷]G`«þmu¾@ÒdìYöZ¿öDÏÔr·îsßðgÇöI¯önŸÙLGñg÷O[ïáŸs×ñÚ4„è0ÎɆMÒéò!€•qZ6tBÐÉŒ'uø*GœÍ88U²t‰R¯‚žz3gœ0Aa±·&Ñ™FÅ)¹þyrgO” …³(Aƒ2$ˆœ8p¦=˜p¡Ï—0çtìë÷oÅ9)õ$)ëá¬4õžÕZó©N‚<}’ŠRæâ¤H—RjYjDU¯úl¼˜«×†š96mt†çÁ'®mû6îܺwÿÌØä¸‡,N½Jš÷0?^xÂiWn0‚ÁžÃ‰Ž2øñäË›ÿF €ºu“Ç¥ypx:ÁêÇ¿>$äë”OôÐ¥?‡).liñqäÃü{ÇÔziÇœséYÇŸu([D´ñ6aE½äŸÊ!Ø]iàEyæÄ`‰¹ßyîW_C÷é‡áŠéÁx\Dã81/þ„IHá„ÜòìÅq wß)H€Æ%£~>u£Ù„-ù•ŠÉ’FF`‡=FØ×WHáñ!ª0f™KÆ‚=>™à|§ä`ò!æ$” ÒŽ<îæã…’8¤†EBô¤fzJ £‘qêbŠGN™×‰ñ©hg‹øµ¦_%ƒB,A0©¡Û‡({êÄ—ŸþøR’N:+M¶VeH6â(”:ÔxcŽjòIQ«ºYR¬Bæw§°ÌR)é£åE'£í½g©¤˜¢ä¢wœR'$¤#ª8ãxÀ>¤C¯¿îÚlh¬‹›o°Î)kµÎÆ(®>…KŸ¤õÆQé´¤j þ·Ëb+—²+0„û.ÄKün¼7ƒ,>ŒãÃS •5–gfÙ:È÷¾X²ÅNôÂ1ÉÍ:˜F5ÅrTS5ÔL7t‹jBùÆÃL+ˆ)£„se&3;ìĵš­‡Ìak87éòÑM—H³Í1œsh<ûlðaA;AnÃùàŽGí !Á–Ú’V‹lYÑ/ š­'…1Õ‹®,3DN؃›]¶ » ý4¾ qœÞKËÜ÷уnoT„Ÿ¡ÜswTwáb[†òÕž‹NyêY#~'×7ËxýPæ®[̘»¦s„þzDœHAMt<:èh­×ÛrÑå\"ÁÍîC}:¯ÑÔI/õqX_b­ÙoŸWíª;vîiãÌ;Jfÿžvð”U¿ŸàŒ\éž÷D÷¥e|m3IóΗ‘ŠE/c~c_õ®»¯Í/1<îÂFÀÝ鬾C[SxœüiðnBÓ‹ù$(Ë‚Áƒã–D ÀLÐ`.œð±6¡ÄMh‚Âòžf4ãa Ä!ªÌ;FD"~Æ!œd‰M|⋬ŸxщÙÅ)PàƒU”¤ aܦã ,ÑCÛaX¢)Ö‚ˆ¸b RF0>$Š0, Õ‘¾Bæþð$|$â…^È,g‹]<Í831’“_<‰!ã€F5²qV³8…l”‹øn—u¤$z!ª8Ü¢`Šd³v:ðc‹ó‰.‹øÌ^òð— æ0EiLd*“™“%FhyœA$œÁÚÑbí+¥=m}6Ž­ÊEµ¬uí‹’‚^î$pðmkÇã‹6¼b>iB/¨€UãÒàx ÂÐ4ËYÏ‚V´¤5-jÓƒ\à>¶‡”¬Oã`ÞÃÈÖ»µý.nÿ·[ãŽ÷kÂ%®OŽ»Úä‚h¹þÍ}nt§›žê^—myƒ ^‘9´å%¡Gá ëÞ@Hí¥-nÞ8hWµ,f•Ë\çÎj@èE0Š0Í~MùÊIU\N›ñÓ&Rü‘1¤‰½ÝŰ‹ Òá«7Äýq‰LŒb«õÁ2ôè`ôû[‚\Ä'QrŠW,¥™móï~É[šûÌS>ò]éjÆîqÆ)ó·ÊE¾ò‰³¬ÖJÖ£Þ¬‡Oâ„$„'Y¯›‰’.Á ƒãð î<$¿ˆƒ£Ü(AÈÉçKïMhqÚÊð[žmÁûâ¼ñ–Îbn ™ó[_4“ø$kþ°\Þ¬ÛVÏF™†t[&Kc:Áš6“’Ú%ÙÊþy»7u©ï|êØ¥:¾^æu˜í+&üÆÕ"N³­Üf]#{¸ež•„)üXDN¶ÝËfñ–ã5yÓ»Þö¾7¾óo'ˆCßõ†·¾=í¼ôú»à?8ÂoÒï„“n²~¾7À.ñ‰S<¥¯·À÷ð‹s¼ãOÜÂ?¾ep”†9Êññ¹<å.¹”ø s†“üÝ3¿9Î_"s¯ÜÝ>7³9ñœá«h N!ã‹ýÞ=ŸXË‹.õz=éK—øÓ'vrz7}ê^çú×ßÙçW…½ì¯ºÒ¥^óÈnÝìÏþzÄ¢îö¹ÇíW§ûªlŽ÷½ÛÛîog÷Ï/Á 3½âœî:ßí=‹6àízÅá1¹/ŠÓ‰¯øâÿø‰Kbm7â)~øËË;ôw8Ù_>zÒK<óŽW{É!œz¦[ï/å ¾zÖ'Üõ›gýÚÙJø„ïž÷÷ýé¯üßøÎ>ÅoߪÜC¿ú³¼ì­¯}ÞK¿UŸß>ø=|x~?üñî>¨oþõ»|ü²l>ûãµåÓßyð—?þŸ~ ©?ÿ{ß?…”Ÿÿ `Â`Ì& ¾¹_G! ÆRdõßN ×Åž ÝZŸÖjf âÜ Hþ„àå n  ®`ù`ß“9 † š š â†Æ  Zàà™žÚž v êÆþ b]\ aÙÝ n¨ N ÞF!øÍ`öáJÍZ¡báú zÝ¡òᦡ¼•á_ä F^j\ ¾a²á_T!JâŸö…æáúíáù ¡ æÜš¡»â!æa"rD 6¢Á=âóÌ¡ ªÊRâFô¡$î!Ê!jbFDb'Vß'–"ʉ¢"Â#ª¢²âE",Ú›,^'Êß8<‚Þ¢Eäb-†Ý)Î 0®Ÿ/*Rcþ cÔ¼¢þ2rÜ1¶b5V£5^#6f£6jFÂ(XÁ˜*Â6–£9rš ‚(˜B @)DÁ9Æ£<Σ5Æ!ËÑ#>æ£>î#?f£=c?¤@ž#)DÀ@$BÖ£Ã%$C6¤C>¤<òàù@$Eòã?B]Ef¤FndEJ¤ýq$H†dE^¤4–dEdÁ¤¤J®$K¶¤K¾$LƤLÎdJ²&è ‚$Â9\OæÁ4\6èM¥Qe\Á9ð€6ø¤R&‚ <&ÀQ^%Vf%L:€d9€V~%X†¥XŽåXr岑%Z¦¥XºÂ|€Z¾%\¥YFV\Ö¥]Þþ%^Âeœe^ö¥ZÎ%)”h8¤CO:%/øŽ/ù–oÉ:ƒoö*©0pïpƒ¤š¯£Š¯üÖ¯ýÞ¯°¢¯ÑÖ<é5­OÂ/þÎ)ý°0Ç)¤¯Sò¯™nÀ6m¸kCiW0g°§èþ-4ô/œ*C;e,BÒnð‹^0 ¯0 ·°zv°S¢Ï)ÜqXJÖb:&5€±ö±òV’k #2"û$>02$Ó±$O²IФ%;ä(LÂÀã%ãã»]rXÁ$ˆB'—r5’ä¥ †)›òŒ'¯r'S²,Ï2£ÂA!lß-€ÞM¼F£Š:ã3:ßþ.Ó22'³»Ùr1»Ý1Óe*6³Ó¡²¥³4“Þ3+³6oó ^süe³+F³7¯!5Wª5óÞ37¯3;¿ 3£³Ô©s"3<Ÿ×¸Òs=›<·3?÷óZb>_Þ>3Ÿ8ôüq+>´× ´?7´CkÄ;+4Ì1tJ4à sŠ&´EE?´G7tDÓ]Aûâ´ÄuôGÎÄå\I;F£(ü™té‰ß Ž4J4N¯sHÏLã[KÇÎÌÝôÜ0[*öôJÛ„5’kLïñÑ4O‹œMórNWµCC™0>õ¢XÀž„žfP@.4ƒSu¾ž0Ã/¼JRPÀôþXDu3¶MQW[ܽ´uX5^ÿ›^‹õM`?øL…ˆAtÃ+ð†-O 2uÄÉ4¼)u_õ^ …`¶a#¶b3v­„ èMÜd'œ\[5jO2VÝHOv.A_cÓ84Á*Ä_ß•O?„PÀ, ¬A ÚìSHœ¶ÄuÁ¹6lãvwÌvmß6tW‘sÛvhÌÂÍhAX $!Üu'µƒ•ó£65ÍTK7mÛ¶ucwh7wÇwƒ·x¶Op“7½ÎÁ•6Âwj8ËS¢ Äâ9ÄYã?˜@š-ˆC0Ä@PÈYBØÀwáþ`¬Âj­‚kxS¸8X8cZüÄä£>S°HÔÅZà…¬çIÌ +³¹ð¤ èÃDÄq4¾è÷‚ãÂÂÀÜÃÄéþjØDå#ŒíßŦ­žlŒƒø½I ¿axN ~ ?A(C4?5mþÛ¯ÿǽƒǼhЛ Ä¥ŒËƒ@ÄüŸú³8ÊÓK‹¸ô @Ä€À‚ ù:eP`08ákøp Aq¾*<Èþ0ŽCˆ ¤€¢â@'ñ|!Trà-ê`Æ”9“fM›7cΙ‘bĉ%ÆáÇ O2‘š8.̓{©q`Â…O=Æñ µ$€‹“Ì ‡*B…ñˆ‚BÉqN†ðJ:W 8ñæÕ»—o_¿Ϋ“åO­e‡=J0ª@§^,kXiån’OW¸2G»V=›¶"[·på>«Z {5úqä̬³v~z³fÎq\ >œxqãÇ‘'W¾œysçÏ¡G—>zuë×±g×¾]9€[…§Vœ!ËÇ8“Y«Õ– Nfç>ü°,Õ³¿þ}û¡ßëå<ùü‹5ô|膣ùÞ30 úLj&Œ* /q”xÏÂ8rÙe¿ßZzi;ÂÀ+À+Êï>ëð ë3ÐB\ÐÄ8ìJB =[ C “ª‘C**òå‹Â|ð‡®êº‹»'¡LŽD–fð=ÛC1ŽñʵWã( µÂälÆˬ1"2I%Yë±È!’²?-¹4=0u;hL–˜¬(¸( -ÔÐCMTÑEmÔÑG!TR¼¼+ “¢ 8P`½ƒrqB½×² ‰&,À(…šiæUAºt PGýmFSQUõ)8â V]…•?ÑbàØWþÚå|X…¡&Âðp×Õ|ÁâT 6T‚‚Yšc &è*lPí¦ì ×T:VUZk!uCôzýõ”V‘=©„Š}JÝd—möÙhå4ÖZT'ÃW %ð˜åÔYd#–[°X²0»&ÍØºr‹Äõ”²Øu÷\U5åÔS´0CYfµ7ŽYNQâ­\Â-S£‘+$6„n‚aLŽxâŠãœ6:øYŵ@µ]ƒpŽ£äNjXå~[¶f™ ¹hAEÔXì±É.Ûì³ÑN[íµÙ&´R–fñ½ZÂð ˆO2"Œ`ÒàðxEŽž* €‚ ()îƒôæÛo3ù\pŠþŒ^ [ˆ ?ô©}ü$ã4ˆa%ñßã@ Pwˆ“w½Zh |`6ûí‡=ôáD!QloёȢ$.‘‰Mtâ¡E'ˆ#ŠGäþvðWE-n‘‹Uœb£H?"Ö/‹O јF52ñŒklâÇG9ΑŽu´ãñØ(#ºP|ôãù¸Š& à-S#7ÖF@.‚$¤!Y1æqlet¢"#™IM*q“¿A$%AJQŽ’”¥4eÛö¸HLF3’éä+93‹6àtpã'©cIX²¤¥-a9ÉS6J—lä%AZ¹ÊcBQ™›Äå0¡MiN“šÕ´fMR¹Lmn“›%y¦tŠÙMq.S˜×ŒR8Ç™Nu.ò›ætç;áOyÎÓQÙ\ç=ñ™ÆvBùôçËIÏDþ“ íâ>šP….”¡ u¨þLìiP‰N4DÜé'E1šÄ€>´9ÍèG׉PŽŽ”¤%5éI…Q®4"íh3YÓ&¡ô¥2µ©?]JSî”§=õévTzS¡v2§ËñèP)ºÑŸþå¨Huª‹ºT©N•ªUµjL‚úTÁrZ}£±S¯T©WÅISÇšV-FÕ¬muë[áúN¬âuµë]ñšW½î•¯}õë_û×3œ!°…5ìa›Ø»®¬×щb!YÉN–²•½k œW¼<Ö²õìgAZÑÚ•±š5íiQ›Úa&“µ­uíka[ÙΖ¶¢mq›[Ýî–·åío\á—¸É̬jþe¢“â.—¹Íuîs¡›LäN—ºÕµîuñÂmhƒ ØõîwÁ^ñŽ—¼å©&òM˜—½íuï{á_ùÎWQå`3ÊA_ýî—¿ýõïü] \󸂜`/˜Á vðƒ¡9…;ô¡wÀ„1œa o˜Ãö0”ŽP ˜0à6ñ‰Qœb¯Âʸ‚3`âŒ+l‚Å5¶ñqœc»5~‰ °c!™ÈE6ò‘O™ ÈÙ@ò“¡e)O™ÊŽºÆ¤ )\áUöò—Áf19/M¦I6¢Af5¯™ÍmvsŠýš¤co¶óñœg=›—W0Gþhs\A{6ô¡hE÷4Ñp43üàf8:)Xô¥1iMozš ¸Â@ÁiQšÔ¥65= êS¯šÕ­võ«Ÿ”êPÚֵ¶õ­qYçš×½öõ¯9½k`›ØÅ6¶˜…}le/›ÙÍfq²miO›Úþ…vµ±mmo»º×æö·ÁnqóÔÛã6÷¹Ñns–[Ýív÷»á-GvÇ›Þõ¶÷½Å6o|ï›ßýö7vôýoœàÿKÀ žp…/üÈpøÃ!q‰Oœâ·øÅ1žq?•¨ 6r‘œä%8ÃQžr•Ç1`ÂËas™Ïœæ5·ùÍqžþsïœç=÷ùÏô™Ç ±+7úÑ‘Nɬª•éú,zÒ¡u©ûpéM·úÙ:u­o늪úÕÁþĬwìe7{u¾vµ'qìgwûÛáNœ´¯îœi{Üñžw½c3wu÷»ï¾wÁÞís©X׈xÄï2ð„wüã¥nø.>Šïã8yÍoåö¤ü?y[Y`3ºY"f(‹fàðC[dRAf‹LP`%ôæÓ9Ÿ{ÝGÝóâ ='• ”éôKiÂ*bÁzÑkñõÄwY˜àµÛïžúÕ‡z6{CYD LÀƒ?LPBÐBÁˆ}Æ÷Ù`‚xCéá° þí"qÛÏ~ú×o+ò›Ÿ>)ăûK/#| R†{äèÏ öïü‚DAž"þæ¯z|Aüa†‚Úu4béä(€ägUƒð@\pÏúTpÿ­÷L‚š@ ú|@hÀ >‡¨ ùâÀnSlÁ NáTNMö… `0)|m%wP‰MÀâ~¡ôä…^`Å yð Æ¡ Ä` Óe^‚E ¨k¢ð‚vE Óe`–§ùLÏeâÀQíð[°ïl†L*ÂÚÀ bðh°…VÏ$nFþÈ$ñˆ éÀï$F.O„åBnä" þ3^¡ÿN„qB ìa *Sœ|’Éù,¤ rAúÀmñéÍ}Ã1 Õ\&6ã3€Â0¶$€ÑVø4Vƒ)œB,@cFDã* q¹"#¾"g*c,Ðãxú%T¢qqÉÑÜt‘5òÄKfÇN1KZoWФ3œÀEB1‡e „äEn„O bG´qAX±åP‚¬(Ë1!’ÙìÉj@bjNÆeBj®EUŽ0VRf"!§B¢yâ% ±pE6Â`ôE ëeeü%$ EZZ§Z®… gÇí!²&mÒ×ì †@‚…\ÈeNh‚&GxœGqä†xþG+D…&y–šgs*ä‚8Â)©ç€°ç)T‡uV¤{`GvH•/ónr,ÉÓ$ùþî¾(’IJ,Ýò-óì,«è÷Ò’3©2©-ár/ù’Ì䒕܈µÀΗj)/i²/31ïì/ëìôR1!32‡Œ1ÓêS2133WŒ2+“é.S3A347Œ3;3­>S4Q35Œ4KÓ«NS5a36é‹5‘J„ 5_S6us7Ë«å„î738}Žˆ@8ó8‘“ ˆŽ7™³9!Ìä 3:¥“äd@¦ó:±3;OÎ9¹³;™m>m¼s<É“{,ÎÊ3=Õs×ÁѪ`þ=á3>5O¸ìÊ M>ñ3?ãº&ºô3@”ëúÀ‚L ÀÇtAÔèRà à&àá ,­A-ôB ŽªA&ª0ôCAߤá.,&°aÂB4EUTÝ ìdâ®`VtFiôÛ˜¡h¢˜¡Fy´G£Mò àaH‰4ò@|4I•tØØáÓœôI¯€–tJ©ÔÖ$à°t >m °ô¬JÁ4L[ áÄ´LÍTÑÈôLÕtMí,MÙôMá4ÌÜ4Né´NŸlNí4Oõ4ÇðtOýôOO¬OuP µP5QÿëPµQ¾õQ%uRÃ+R)õR1þ¹,5S9µSÝjS=5TEõ§@uTMõTKªTQuUY5'¢ëUa¸¢À ¬ bõVqU¶æ Uy539k´€5X…uX‰X`W{5Y­Z³YçY•5Z÷’YµZ›èX¥5[ß’Z­µ[Zµ5\k’[½µ\\Å5]É‘\͵] ]Õ5^ñ] Š.]ï’Ò[åu_çÕ^ Ê_ç_O­ô•_ V³`Ñ`1 HÏùõTOùÖŒú(ö$ƒöÄ/c'ö=°Àü ÄÄ ºáx…–/#àõ`]vóÖ÷À¨a…bÑøbmV`mfùú¼† þ5 a4@ ,€d†n +¶`_vj5²¶og¼üÄÿÄýèÿÞ"0µ¯ ZékÕ/lõ¯üplP°Í6nAQ%ñnP)Ð…"wÅkµâC&a1Lè5„ä ¤pUŽ$º!~VVw¤–j5wðböqkð‘t—‚ †° Š$Ç $N7uÁƒ U7 ûˆ ­ÐuëlWh¿ÐXLRUÊeÎ0 =Ãv]’`¾Òg«âŸ¢ ƒWjøÐ4⠘ສhÎ(s7÷{ñ®s ‚õñ Bå Ñþ ÚQKQ7D4QÙWKVÃmÄ}ÑWöNâóWý‘ L=c¤>\qmã0g±%ã"ÈB |ÀÚV,·µÌ¤eÁ·ƒÍN| "kÃ-$#X+‚b,¤â+„ãQ#˜±2œ+¢1çð,hØsà ²q)«ñ0šW‰:'K‡Ic-ôc)PƒYÖƒøí@$Ò±u–b=êWQFÞÑŠ7Ò3æ)êÑK²X$û°o1QKÒ‡åc ƒ¸g—OHÖ¤H&·$’„‰M‚ƒŸx£.‹²" ²u4Òa+’w/efÅiHå…)2W2>rU†—ŒÍþ"_®ðuQ2kâ`%ÙxUÜPqbGÒò…gŽh Fb( Bùø•.‹t²"x²u~rlƒrz†‡5`è–—+y”‡{žR$¥ò‹9†({´Òe¸ò{ÞØ »â˜ë£|Î'}¾¶ƒÞ'ƒ/·•aù›ûXa‹Ï]›h-eÊ{Á9Ž^‰œ‘è.!‰¥ÐYé¹àØyœÕH0¯Ž0éœ]¹žšßîÙužú ñm  º5 ¡:Þz¡;³¡º¢Õ-¢%º1)Ú¢9zÜ0:£óõŸ;z¤¿í£AÚï6š¤UÛLú¤é.¥W:¦£M¹rµ¦mú¦q:§aZ¦yZÙX²`€:¨…z¨‰º¨ú¨‘:©•z©™º©ú©¡:ª¥zª©z¨³ §±:«µz«¹º«½ú«Á:¬Åz¬Éº¬Íú¬Ñ:­Õz­Ùº­Ýú­á:®åz®éº®©, ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_10.gif000066400000000000000000000517031343257752000273360ustar00rootroot00000000000000GIF89a@ 猂„LB<äÂÄŒF<\Ä‚„$"$lfdÄ¢¤lRLŒjd¬†|ĺ´´bd<2,4ôâä\&$\NL¼–„Œvt ìÒÔ\F<„ztÔ¦”„|b\D:4´Ž|ܲ´|jlôÆÄÄ–Œ4&$lZ\œzlܺ¼ ¤–””"$Ô®¬œ‚„TJLÄžŒTB<Œrd¼rtD2,dVT¼žœÔª¬Œ¼’„|^TäÊÌl,*,$üúüdND´–”ìÚÜdJDܦ”„f\L:4¬ŽŒ„j\tZT¤~tì¾¼œ24¤ŠŒÌžŒ¬VT,"̪¬´Š|”vl\JL|f\䲤üÎÌ<.,œ~|亼 ¤‚tTF<,dRT„jlt^T ìÂÄÌ¢”lVLŒnd¬ŠŒ´jl<64ôîìT64üÒÔ\JDÔªœ„ ´’„üÊÌ4*$œ~t  ”*,”rl¼~|D6,Œl$dRL¼–”L>4Ìžœ¤BDÄŽŒ¬^\T><Ü®œ´’””†„”z|ä¶´¤‚„̦¤dÄžœŒrttôÊÌܪœ,&$¼šœäÆÄ¬Š|´fdôæäìÖÔ„ܶ´ÄšŒÜ¾¼”&$¼vtäÎÌüþüìÞÜœ64ä¾¼„nlŒ¤†„LBD<24¼–Œ\FDÔ¦œ|bdD:<´Ž„œzt TBD$dNL„jdtZ\Ìž”,"$”vt|fdTFDt^\lVTŒnl4*,D64L><ÿÿþ!ùÄ,@ þA H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·p/f@·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KœÁ£€)D2kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¥§°LÄŠïßÀƒ N¼¸ñãÈ“+_μ¹óçУC 8õêÁ¯cßν»÷ïàÃþ'²»£€ÞâÓ«_ϾýsíÓÁÃß>ß½ýûøóc'Ï[¿ÿÿÈ]}ØÕÀ„G u6èàƒáñgzVhá…ë-(à ¡àrb(∠JÈÑy$¦¨â}\<1É( øvFŒ2É ˜ÁÃ$#P #[lÑF‚V\GÈ£Ðá‚V´aÆof´Qd7æ¸c2 €µø˜¥ø`>@â!mlaF"©$“+Æ)g„åHáœxæùÜ*R@²I_€Ç&n„!‹0„†ŒŒX0ÁG|É›h0ˆ-V"‡VH!G‚‚&zh¢‹©¥ DBäue`ÑB þX”áÛÂzݤ•^ªç®¼*gâF(ö*ì°¿2D ™‹on°¬nˆ!ã ¾Ý@×{¨â£l;Š£!ã³Í’+­©ÙùƇ¬èŽB­ÖúFû7\—­·Äæ+쯫ï¿sÂ"Ì< h²š æ$_ŠÀÃÿVüßÅ_&Kˆ.  ;‰Â0lÅǾArÇðÊò›‘¿,Ç<"!sXp°ÅÉ@ïµèÖ²‰ppLQÂ"dŒîÍß°G+×¹[-ÏóV{Ï2W¢ËÁlõÖúqÍ« }4º:ú»·bA!7ø­Çò„™ã|ôŒÀUáþ«®ÂÊn8ŠEÚk·Íõáb}‘Öˆ7îžµLòb× t´¡°‘Cì1‰%XáÂ-¿qàÂØ–Û !\IcrtlÁ智ã¼Û§¸EŒ÷.<„*oüñ¾ý^QðÈ7_ñÎG¸ò1/ýõâAýöS?‘õ܇/þøâ{/Q<ø þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  HÀð€´Òà‘Q¤ìŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ A8Šþï…0Œ¡óÌðÉð†8Ì!±hêð‡þ@ ¢ˆxø ñˆHLâ}ˆè˜=ð77ˆ,dƒwéa[Àƒ¶¬@"la‘àÔSVœ)cQœb-ö0Yamè&¾j´Õ‚Ó ®M-Ó4K\áqö žý$%—¹…?‡Fàe |‰ÓpúFo×QÅr[é\hÅr«§|®ì)]êŽ ºº4ƒ0‚ÓÒÞîr»˜ìîu÷VÜú6î¸I.¼p‚<’m; 0Šñª§ÍTë È_ÿøŽn„#§:RßÁ °vá'FÂ`À‰…Ië¶ßþþW²¬Ã¬}WÌ+üĈ,ޱŒwZ'`ÝiÆ8Î1]˜ŸºÇÇ:òŒ]L ùÈHÞWûuã$;ùÉJæ1”§Lå9y F®²–·ìŸ+ Ä+ ³˜ÇLæ2›ùÌhN³þš×Ìæ1·°#èK œçLç:ÛùÎxγž÷Ìç>ÏyRæ²  /ƒB¿ÇQq{€‡æ\§Çš—±ìF›XÅ £Šn…ýðà{Óœtž <¤o&§\ýiÊ6Íët"`H°DÒ¦%A¿! qD²ð_W‹.¨ˆÅÂtF7SÉAyå(u¾AuV·r0ãbs¾ÁVä‘Ðkª0#WFDUàxsâX‚ä¸m³w¨#nÈqw¿¡w †2]™çX@Y7g÷%P „JÈÁÛò»dxi·¸<¹x›Çv'øy¿Ñþ’V0z9ãoòb@`}×ÁA^ÀÆDHSõо‹Pòz'YiÐ7X[0P”–†Nù5ÑGŒÔW9f%à'DÀ“¾ÒøR0y€(ˆ„øß·”(hÉ!€ûDz`}ÊÁ…V —¨;(‹Ð4µÆ–™RS@ƒ×)<ÀÄA|0Esø^c薇הâÑØ‚ê! ªWH™âg™¼C·àŒ šX¸säh´"‚é¨y’¢›´¹5³Y›¸É2·™›¼™/»Ù›ÀÙb)Y=+œÆ¹2I ¥…Ìñh‘F~[™6âñ™Ï5œßþSœ&‚ÖU“#…— "j»³bF‰cÏ”Ó =1Sfá!†Â‘œ§¥G–VÊéT9žµ6™¢H’Å‚º[ÀgD °RîÙ½# Éæ*(¡Ô©uö9R¼4J¥T]ûi{Hkò™‚ 9¡òá*™‚+š‡ß¡'z¡ÏΤ¢Ïqˆª3œ¸žGh¢&·“)i²&¾5Oäö.57¤HÚnïæ"ñ–)ó'Ô‘‰³¤»Ô‰Ÿ(#T‚#:Â#^r$–øe$PvCmÙæ¥¢ø.dú&Æñ£AÊUtZ$H”¨-š§i1ø¶¥@Ú¥©èQþ¬è:ØfmŸÄ¥Bz¤Ej“8:%m ¨s ©U¦XB¥ejaRšn—$ì–¨*¤¥xŠ•§¨…¦_¢¦ˆŠ<â¦UjKZ &‡ª0NZ¤oz‰‰†ªè¢ª›«·:rWŸ x £sÛnY‡¶£khÛxT+5c‹/¤«}¬»¶nûºUg’á˜Rf‘ ŸggV¿{ŠÅv5¼í†wÉw?•luûSךT¶1s¿þ+2u#‘„+Î Ÿü g”¼ÉA3{0 Kwn×½×Ñ‘ùLÖ xVÀ¾“2‘û¨Í{‘ÏktÊ;‘⫾!ãô;2·¦½‘K½dWwlgÀÌ¿ LÀBÕ¿ÛûvìÀn—½IUxÂ*e4€“:iµUÛºXûY—ö5®+¢g™)¡7“èø­ fµ¼“.Ù3/Ü®G£4Ãe³[74yœ“4¼·ì$“8̶ód¦ZâtAüÁg”Cɸ§×ÄC ¹3«{7)Ä„ù%? zœ7Å3Ü“ùèÂZÂzÂE·>Çv_¬Å<ÌÄ!lÆÙÆP¤Z¦[·ÉÒÆ†¨”¿1v\é•þ¬2| 8‚“]¡4]º·5GÈrTù”XÉ6ÕWÃl÷Ç›ð•5L8’|†óÅ7µÇvÓ·ÉìdɘlQ WR ìŸ1j ËÇ.¤¬e “ž,¯Õ•—È…ÌÉДÅ_Ë™ɆS•ÉW$¯ÌQ¸\Êbù²ÂÌÇÆ‡]´gËuÊÃ|}É´­%Èš\ÍÌ ÍIûÉ{KÍJÙ–P;!À˜‚9®C;¶³ÎµÓ¨V`|¤È©ÊÎEŠ—z™)¹c€‰€Ýyè<˜Á¬ÏXžÌ™bé;Úf7ä[оáÏÁÐê|ruIÑÖ—Ï%n{Š*~ù# ¨0-Ë‹™¦êÒ)Ð`bþÏ÷k7 ½!=Ð Í—y9ÈþwO'=Ñ…y˜ƒÓüì¨ æ:%Ív>½;-Í¿å§Ð%£Ò{ùÓ½`I}~ ý%E-™lÎ$‚™‚[£™ 2 H HP°^ý¨ÂÁ™7Ne %Ú k½2ØÙÇÃÚCÜ š/à@³ +œ`ÆAš¦ÙcÞ;ÁÒÖ+ö›ÀyJ£›ÛCØöeØÇùØW3×ET×]ÙzâØ–ÙÀ&ÙMDÙšýÙšÆÙäÙðÄØÁáœþY…0q Ú·¡’Ûâ‰QäÉÊÐAŸ®s°3môF]÷vÆÑŸ´ýŸ¶ ¡•Ö™¹ m»­:Ìò]/lÖ"¸Ïþ‰¢ ݆èlÉýÚ¢]Mw"§]j¤Dj$Œj—®åÝâ‚Gæ ¥“¸©¥z‰W*°,:ޒڥ譨¿¬Ù-pcW±B{ý Rõ±ÀQ±ØJrÚÚqDk¶Áñß»²Çj4[»ù­ÜÛP2¨·Vl>-µj» z«ŽKÇŽV0º ^¹¥·>á¿6vl¼ &v)X¬¿Þ ì)w|ÂÇ!ã üIqëâ™6vTŒÂ#¬áq<e[Kn4S®Â?ÙÂm|â¿‘áUU¾ÇHþâÞSwÌÀ¥ÍÙ¼ËèK²DKf~ÊÈ Èü9kÄ|•öš•ßZŒŒ±þo>Pfnäæ©6v/ÒïìÎí a¾ý…N—Ó×Ï4½UÝÏmè‰n^ÑšéV-èƒ>ænEÚþ¡ÕÒñÖ#X Ži˜½ê®î­þ겞±>ë¶Nµ~ëº.×Q»ë¾>~¢ÞY¤þëÄŽëÁŽ\Ã^ìÊÎëX½‚‚ÚÃ=…­½ì`÷„¦³}†£†ÛÔ^™Çž_ÅÙž½-aÌIÂ}†m˜¡ÝvÖþ¢l¾UÀ]#:Ýc££ë^íßþbwB£:xm’© :©ƒžPžNé]ß¡ªÞšŠním¥uŠß÷®Ûù^dwB+ÌŒ.Dû±þZK!%à¿Aà#w² n4¹þñÚ-e¡k7©û¹>V?Yz âj+â<,¶%®¹bSò&OáR¶‘ 3GC~F5XC®ã8Þ4È›ÙwF£Á;òÍn)ïÅ/Üåyå[ìÄcSåžwå•åFãzOõvˬ0»Í¯gæuóînžÌ×ç·,çÍGç«,Îbèc/æRÆï…UêÔ D€ÂšUëV®]± R‘Æ „7&îQ…Ì(“7mdÒ–Mm)J¬‹pÒF„£†´¨ˆV-Û„v²* BÁVÖ"ŒdÇŠª)|uRÅœYófÎ=þZ4P«^MŸÎ ¶â¤¸r'Š;¶]>²có1\Xb;"¶…’Œ¶Oæî `T™…°m#,Q‹Ð°! U]ûvîݽ¯´4jò\U/[vb­¼Îmÿ6.Jݹ‰8¬HhŽ„ìy €xÀ¡¿ö"Ä >Fáí!?ƒ0B '¤°B Ç+/CPÎC¨Œ˜`‹‰¢€,Ì aRjÈŠ-(XèÅ»zaE„ü¸A¿UD¢Äí¢¾¶r©'MDÑ )À!<$³0J)§¤²J+}ÂPCò8”« :¶Àa"B†Øc/\*,â*Š%’—dÎÜÜØþ"-+ì¨e’'¸@hÌ2Ïr!äø¡\ö8ÂO3ÑT’‡UëJI'¥´RK1ËRËÓ¸Ô.ŒˆšÂ‚O¥„¡pº4UUWeõÒL5õŠÓV‰"ä/œ5W]wåu»Wa5/¬^…R΃aE6Ye“úX­d]6Zi§¥6ÙfýJØj·å¶[o¯¼[h¿%·\sÏå,\gÇE·]wß…÷'ueWH•‚²×½ä £&ª„‡|›xÒSãE8á¨æ…µÞñÝ·>}­ Ó΢&’ƒQ© ŽÐˆ)PÀ‚ê¢ R…OFÙ(†5uø0’‰Øb’H¤@îÞB­¨©‰dim*Žþ ’ª-h¶`±Ô”—f:¥•µlÙ§‰T±€ƒM ‰BXŽóˆˆt®ªŸ/žxcžÒŒašf›í§5ä’6¶° Ì>…øšh˜#’3b”IF K71ç®{¢QÚãâ‰IFYàî¼÷në9©¼pH|°ÀZ“›n»­ o½ùòI˜e逌„d{}¶„8øØŠÆœV®qU…†¶Oùí ¹< &Z‘G’ÒÍ‚%f7Ž Ôp„Š?>y+4âÈ#”)УŸ¾ú2°hyæ¬Àù ÿ§=!Ñ  r ò"„:ú(¤ØË°S‘QH¡A—^þ&¼òp)=V0 cìôÃõÌ=¡ØN¬g…FÐ {Yˆ_³ÆP@‡Á GQ¸øŽƒ,<Ë Lîi€¯ñä²Ë …ø.nI[l $^Àæ=ï†d B”Ø›ßg8Å±Ü ¥6±(ÊezIâ-ç`°“Xá¬I(~êɆð¨ÑŽÞ*"jCÝl¨²™ø&ÒÁ®5©Oûé£Í~4+¬°,.$d"…B3h€Ð"#óƒÈÿ1'\Cƒî8ÊoåqSGôˆ´w¤é†jhÖ´61¥2DÉÙr4‡½¤GH_Íþy¾ôaa}¶\å/[)1„X !ÂDd„iJ G:ZÄò$Rvs[¦4 — á%0‰‰L‹2 : ™Ñ,âç—FW1„àIO¢R 6h…AÝÌ.Bç‚DrŽ.ŸhêgJæP å !NÍ=÷4\‘Ž>² 75j­«`+VG §œªÏô;£@BÑ0ÀƒmÔ¥õèG_ú™Œd«0äLu:,pÊt§?ª{ÚvÕ¨G…×Pƒ…T¦65©éVŠêTªVuYJ•*H­ºU® «ÏÒjWÅ:ÖU}55aO¿þ…€)¤¥d…«QÍš- Ñ3›VÈBJ–þѸöÕ¥sÝZ‰Å“0hFÌ J.ïʳ…Ä@i~…¬7;U—åÇ/ :ìØ*â5°ILm‘­d¡Õ³Vdœ¢“é(7Æ9<Á ‘˜ƒI`—EÚ)ävë ã‡[Ò©–oÿCHïB;Ü;N•1ÈE.ð¾å!§Eɬ{ôgþ}o{¨«®ÿ`R’}‘¸ßM q #Æp0¹‘\èòD“äð/«AI(Ã`z¼÷mšxÒÅ)n‰ô©mpóÎÝT±TD¯èß,ææ:ø…ðÒôÛòzÐ?„ÏBÒ«IÄê‡?V¸OJ<,É»ÐÇ IŠpŠã5a+”¹Ê}ŸP4Mþ±È!Õ¬&}®ÉKÙÈ ;î%+Q¤EnªØÈD-ikZV|éæüš8 '5¥¤Mo‚¨Ä$**»n¹OçÔç 1zd2£‹Å¹AE#Ò¦¼µÌoÆc’IË)äbXðœõ á3Ón åž Ú3ÚÐà-ô¡Mh9G•²‹†tWiJ‹uÒ•ÆtU/½fݵ­•EŠ›3=êÑl4v%^5æÏ£ì•Ô¯©A½Â– ± Qlª;ë£8Ö¿öŒ¬·hÙ!`–½<áìZomë£|ØÏÎ ‹O›8ɸiíkc \ÚÖnq ¹mîJ7¹ßzÒf°˜Æmm9þ”j«ÐÀd\mz/¬Ñ1å’‹“»\ðqWHÏýM2]îíÏ{Ú…Ÿ¿Ã¦/–¸d»2¡‰MP…ÀzW¼),E…ÍëÂÐ'½xBÚ¾¼w¾çínr³+”0‘™Ler¢A‹×œY÷ö(—ø+F4Ø8æ04 ß$ØŠkrNÏ.‘å4‡‰Ñ™ÎÈ&£f›W48×3®äVذ­éâM~øÂ´Ä×€ {v)ÈØ¢´zÜ…Âb}ØG2¦&yk\‘ᘼS,ïÌîÚK!D2’2“´$CYî›¼…'9Ê"¡²rå)g™>]ÎÓDIf4þ0¡;T¢H¿)8Ê:&ƒ|ì2é4‡†ÍL1iRHÅw@Ê^ög®óóœ¬ZÝÊ÷ÇG6Ö×R?ZYÅB~ôg¯|z Vú×—–°±¿ý^iŸûߟ•÷Á?þT‰¿³ÃäRÔêi1¤÷ä§·ù•­Hm*ÕDÁš\ ÿzË9€™vZº[Ó, È5üCˆ]cˆÇâ¿_ó?‰y¥«Éš䚋롻2±µi@h“6Ä1(ߺ6¿Á!ñ j›ÚY7ÊIÌ)ÁFÒ-Ü©6TË® |6º{1~󥿒çIò¡ñií€éz¸“ž!¼®îéŸ~c-¢8„5ŒÓþ8 B¹ á«„H! H¹“ã8“èB½ˆ/“ÃÂ1ì®)¤BRc±Ã"¥[ d5™8LˆI:Ùa$¢3°ÛC;¬ˆkÃ*¤¾†Ñº+´¶Ë?ª?A|!®“F$0²CN¢D-:±B4D%«Š¨;²¼³Žª‰¥ $°Zú[ÊQ$°ÀÛ¥ S¼úr›‚? 4mÇÐxÀp$GL9D–±¾rTÇ`;G¨IÇu„ÇhkG¸yÇx´G{óÄÒºÇ}ÜŒqìŒõþKµO›F~tÃyžzÌŽûŠüÓ«e$È‚ÌGºJŠ ‰ Yxp‡I,Óµžñµ‡ìĈ|´GÌ XðUp"f‹¼ Lµ ÉÌGqòÀÔ"·k’2„àZÖ¹6ÕÙÖÉÈoCˆp›ÁrC£|ÉQÓÁ}c®øá0°û°ù©Ÿû‘©´ŸŒÀ®ƒƒÂúbä¬Fƒl D”D—;6‹â‰Z8´ü 3¡44¡9¡9¯¬´7 £8äCf{7„(£3ºË…ØK4òC£;0“ËzF¹44+”ÄLd¶2p„ $K¤܈ÌK*$ÃD'ÒDCLH[J»ó%¼s‘¿›70I”l¦þgÚ„h"ÅÔ„&\ò1Á MÂ#2ìÌCÃEÊÓE}ê<Ù‹ÄÈ…X¨†Ê²áô‹Ò¬“z =|Z½}³ÛŒ4gìŽhTŠ„ÎA³Fá»ÎÛäFoÜÎÎôÇïŒÇðÏu$Ïò,ÇóDÏpTÏõÔÆöü €D@+È÷sOü‚ÏÎPÈÁRµ†ÜÂû$® ’À•<Š\ÈôHÛÐáP÷ •|ŠdÃÀŠp¶½¯D­¢´I ¨ÒÔÉŸäÉœ=`3àÁ!¯ä ¡´Ý7, œ7 ý®ÏÅ„‹B}a€Hà‰°Jª<ž0ò ƒ`ØÊ&4¸'ìA§„KÍþP°4¢ñKú"0>X{QKH!/9·$ ’k$4l9,•¸”ÒТK)â¹¾´ BÐп„S D³Cºÿr°Ã\S¸RÌòê:»=h…Aª$Ë<¶õp"K<$³ÓÌÜØÄ@uP*Õ£ãbÊÁk¥«ˆ*p‰p¦×lTNEXĦÙl¥Ú´ÔKÈ%[H˜¼Ê½ËãE‰!4N‡*ÕZÝEc=btN‡lÕ¾’N ¡Î¤°Îb%«ìÄFfeOL=¥”h¾o„V[ÌÏkå¾lÕVìãÖn•¾oWäWK‘Ï¥Ïö[ÖqM˜r¥”ý„˜þ´‚ýcW “ÖpBÈ:$P þ¥åOüÈz ž{õ©óKˆ=,paÉùtIØW•É í­šÌ"ÑÉØÉŒÌ1QUQ}QLØ‚-hÞðI ì“2YàuQ¢œXk›Ñ£¬Q‡mW‚%*MÍ$|§ýQ„R“ R70R$UÒ'å®ì2 ã ‘¿±‚¡eø>Ÿ-8êÒJ¥ÝQ‰éJœ}*ˆKB=Ó,œ-­™.ýÒ2[5”/“`¡›µµäÂC "Ó¶]Û·äZ5õÚ¯É#ÂÃ<%09¥Ó‰°ÓLšÁåS“H¢/²‚ã”ÜÀÜÓ£³KH .@íÛrT ›Ô9ÔD…ÌEÌþsTŸ±„xÛѕ̉˜Û” DH%̼ãÌÍu1ÂóÔ…UQUMÖ4]SÕ¥T€U|€õÕÕœˆ0 Zâř،EèeUÜ]1]ªXÕÝ”29ÁU]e¨ãìUaõ²‘Ý:hƒÖØU1)ƒ) ƒ—õU}Væ´UeüOëå\ìÍ*Ÿ¨=)1P£HÖP³Oü=g¾(ù_¶ªît>ÿU`WýÛnCw•``£à †IOI &WýýDæ¿ á[ô`}áñáþJ°Ua.a‰lám}aXáíKáÆÍÞ`®ºæaAóa•Ë Þ¾!À‡4â~³%fþb2sâ'6²(–â£â*æ3ÎW,æ@-æâßóâ/†¼+žŠsåÏOÃŒucJ!㨀W̫̠×5V•r›§D WLµ X:.¿0ÎŒ;æ×¢ Ð–œÈB~ ä@fᣘ¶¤Ø£ÌXnë¹Ú*Š˜…Q­A4ꉔåÉçè¶©ÛFžù ŦT¸…Ú ›.¢¸Z¦ÕÚúê‰V»WîZSAÎdE$ËeëR±KI ¸[3ýe- Š`άÉe]®ù \?õK3’Cü©(¡ ÜÅ%̾üÈ5]ÞÑ\g¾^&Š­[ÆDÒE\"ž»œJ]tþ™Ê,Ý K‰JçSþ&ç¡Heè­¦å^¿cç\ÙtÅu®–¦¿ëÝmbÐ{–ù“Õ\DFÞôÞõÅ<ÏCŠùèÒ3ŒÓÎðåÕ[íM$V‡žìß ¸¥È=¨Pc“¦ÿ ¾g…é#›0ãÀi4ªVÏÈ霮i;jãŸ^à|êf$jÄ!ÏÉ)pê§†ê¨–ê©¦êª¶ê«Æê¬Öê­æê®öê¯ë°ë®&ë³Fë´Vëµfë¶vkµîé¹¦ëº¶ë»Æë¼Öë½æë¾öë¿ìÀìE(Á6ìÃFìÄVìÅfìÆîë~ÕÈ–ìɦìʶìËΊPØ€ ˆÌöìÏíþÐíÑ&íÒ6íÓFíÔ°@Hí×†íØ–íÙ¦íÚ¶íÛöD%@4PÜöíßîàîá&nàÆ„ €ØL(îævîç†îè–î较À S¸ƒéÖîíæîîöîð¬ðëïóFïôVïõöíØ€OÀŠOØ€`ïú¶ïûÆïü&-¨­¨Ðïð'pöÎÐ ȃgðwðÿmØ€PÐ ÍæÇð ×ð ·l®àð'ñ7ñÓèÖæŠÕîwñ‡qÿ€Í¦ñ߀ˆñ×ñWï ¨‡Í†¯ àñ#Gò$—þîØìPò'‡ò(ÿm&ß'—ò+Çò,'m*·r-÷ò/ó|äò0'ó27ó ó3Wó5?ó4gó7‡s,wó8§ó:çñ9·ó<×óÇó=÷ó?wð>ôA'tüôBGôDïCWôFwtèfôG—ôIŸò&§ôKÇôJ¯òLçô/ÏõPõQ'õR7õSGõTWuU_=Ѓ5XõX—õY§õXo€NÇõЀ) ‚^÷õ_ö`öa'öb7öcGödWöegöf/v@\—vÌÞáoIàï€öi×vÊ®vo¹vïÈöm÷¶Ù°ÈHt}ŠoïŽp÷ww´-Æv„þ`"`dþ\wIqwxç÷ê»” ¤IÁ÷àÏ™4ÚœÎùœ•mYøMxƒOâ Ù÷~§øƒü÷…øÃ bRŸÜàxcºžçm1ôéøe³‰¯ø”Ç׋·‚\ðƒ!ˡՕG‚ z]’yvç”Wùžÿà*‘-mþr\ú0úÈ]Æx áyŸ÷ùno÷ú£ùʪ·yºí‹œ×÷h‡ú¯7a*©À…øøõ©¦²Gç%ˆáC{“¯§ûŠ—ú¯?€¨Öi»·€ZY÷uø€ÚûÖÐùí€û¸ï÷¹‡¬Â7|xG|¿RüÅ÷Æï«Ç‡üm—ü¸¢üÊŸö4àþðüÏýÐýÑ'ýÒ7ýÓGýÔWýÕgýÖw}ÓCÐ|•·)ǶýÛÇýÜÏi˜ý”¿|¸ÊüÞïôß'«àþL'þ±2þã¿ôä«ågþIwþ®‚þèôéçªê·þFçü×÷þïÿðÿñ'ˆýí÷Ú×ýõgÿölÞGË—÷ÐÒþø/tìߪú·ÿAÇŸ0ãxˆJ<X‰Æ „ 2lèð!Ĉ'R|¨Œ7rìèñ#È"G’,iò$Ê”*W²léò%̘2I RñfC7[Tá$hEN „¶@Âiô(Ò¤F/Îlêô)Ô¨R§R­jufM¤>­èþêu«Â–"”Ua ;Jײm{”éÕ¸rçÒ­k÷.^Yß2ËÈ ²\šæö0âÄ áæmìø1äÈ’¡îE©Í 8|:2ŠŽ 7\½*ô ɇ >Ύڔ˓I£ ìü94B‚_ª¢¡ø7p­'/nü8r»•­”‰‘+ן°lÒ0ÈVî¾Ë`iÑK„bD#\%Ò¦.§W¿ž}pB7b‚Ó¯‘qòüú÷óïïqù( tƒO{ðd£¼WB£Ü0 oVLBž£ Ñ‚B"”à{`Égˆ!æ6œ%šx"Šu-7ÉYø$ÆW>ù‹–MÒ þ Á"Ì< !^Œ*¤Š‚"~)*¹$“M¢ €VˆP-®-4£OBˆf,DÈPi%ƒð!d†Gª©X’Nºù&œ).×ÜsÑ­‡„ܦ[D¹ØvÝ}žb%äÇ `®rgž{ ™j­9i[mÆy)¦™N¶$¬Ð±Åœ ±Ç$^e²€eZ©q–NÚQË$OpQÛ¨¥ž*cBªE)°JYª)±ÅkÕr ÝPäaaÄÀ–AÁJû‰ÇZ{-¶1%ëC.›`áôኛ԰ٚ{.º%ËÁ[`@á¸ñÊkQµéÚ{o¶Éλ/¿•‹/À¿©oþ¿÷û¯À +l"Á;/ K<ñq ?|±´S¼1ÇYŒ1ÈkjÜ1É%_õ±´aàÑBmȈl2Í57…2°±²üÓ©Cs¥õÚ<4Ñ7ÛÄ×b»¹eèÎf%”ÐnÍ\4ÕU‡„³¿e&˜``uÐV‹=öIœb¦gž&šÒ~À.A§¥¶ZnFŒ2É ˜ÁÃ$#DÙÚk±ÍV›Ú¸ ¦to`³55Ù=§sÐIGuØ™y9WÂä¨wàå†Ç&n„!‹0¡‡Œxš‡žz¨Rî|Χ¸°B;~ûØPXà^$dj)e„ln…Æ#ô¡„ZˆþaB"X$¯ñÍN»p¸kßøŠ-¾äïW’PV@rcø€V˜#B;öø£0¶½ DbO®íÛë_³îRúT¥vÔ'À =ˆxô[—¼¤0‰É ¼ýÐt¿ìí¯‚Cƒ\&×(>ùi€—ãNç…@õ1Í ˆR£ôħê!$R¤–cH3Ny T¢"•©Ö£*ú]­²À«X&YaVµº•‘«Æ®W¿zaOò'Ã)&¬aËJÙ³Ö3(Þ„qTüâµ¶Õ­oq±Œñ"ÓH¬uµë]f|#DШÆ9Æ kp¼ãb¤HÇ=ËŽx¼£ù(H9í†ô—©H7ùþñe ä"#©ŸFÂQe;sYA"/HJ²“Æ¡dEfÔ/"†!@ÊÇÅIO²22 \PŒºQ.m,MûÔ –ÈVò29¯Ä0C˶pmg^3Œ.{©Ì™-3›!ÜmØFšÊÈnxÓßü͵!6²¡ ∰Yt€ u»[ÞöÖ·([ØBÆW!2yspI,yt3ÍÄ%s™þœd!™9;¹®=–ÃR™:Ñ‘Ît¨+håÊsžôÐÏVÐ@0ð9Ó5Tt˜À,!u YE! ;"ïzâZå?cJ•þMÉ ÒóBÕ§<äí”y7-Òó´¶ L!þ7ÇKÞQg€Þ BJHP£×;êÑyªÜ¥L³ª¢€–ÏE@šu*Ôï)Í}>¢Ÿ°@‡iްC-Bß(Øg³ÂO~l¥Ÿýú©Õ½:†¦ÿ#“Ó×Vø@¤ T UËÚÓªðQ-””f9+\ºÐðS¡ÂO•ªÁÎV}JL.BŒh+údµ€…šÛ!wÒ¡ °ÚIti5Ý$.qW òÕÏ^ŠÕá²W&VdÖ ié,hiR¯í½oTÄè-pqq˜þp„)~üŸ€¢ªðš ß`38#¿t$öÜ`?Š“ð„ñ[a G Ãnï†93x¸!1ÈH\bΞø–ìbË’É`©xÅ|mqÁFÊ3š²g©Ùzm¼â_n%– &Wp€…I¬¢ æ,”-al§¡¸@2–¯FàR†IÁyÜ@V¬L²1&a9©g9¦ÍDÛ6q£4ÒÀšéÌf”lÃM+Ôœû'9Ÿ\gtbs¹q'<å©Vœ AômîÍì .Bkr›ìY‚²'¢À|ìBGW:ÞÉ e]E¹pÑŒn”¡£>]nB:Ò’.¤Xþ0é©SÚé•VÕ¥jbs¦—éW„ü”‡‚=jOgWì ]H¨ !ªQ——ìÜ0ÕÒíÅžÚ fKuCT½œU¯ì`wÏ2d½k—›HͯN“®hU+ºéüV…0`Q€ª\Ý?ð±4¯—7¹ ÝY6ÝtkÁ [ÙË%v±%m‡ª)¬ ™ì^X±&D‚”6À[¹i ö¶µ/-|xZÝ"¤ƒymlµ»Ú2á¶ëxX¢ÌrסVÝ¿ÈCîÉâÚ¹º¢îÉ™kt&J‰ËEˆu±;™Ëˆ»ÞÍMŒDCĦ/ݼfB/Ð1-tö¾÷‘7™¯ëûï± Y¿dìþ/‡ƒÎöE²Ñ]¾ß‘)ö¹oÇ(v˜Üù.H¿ÿ½`ü _x~ñsTüâçÕxǧò‘·/ålù†¼˜Ë˜Üâå'2ùÌSqó Ù±è{ŒÊô†>Ž{'½?‰œÐ®Èâ x2”Cå‚X¹õô‚=…·ÌcŽ»>X…•Š)åcú^"£¾ßüLIs¬~)à ¸oÆ9Ÿ£‘eý¬Ýü†<úûy©=ýØ…l¢ã9éD[·ëƒözü®7ÿ}‡mÓ©|>Ñ6³A±ñŸÏµ”ýýþ‘Wy»ßú)Ä&°V\éœÕ¾YßÀ×–Æë%àÐ \”ÔÔÆõ_Bþ” $e5РÇmà•t Júñ\ɹœºßñYIn%ÊjÖ Ñ ¹à Æ pÝq‘t¡ÊÅíÙîmx!ÑsÏr ²˜ðI‰²Ú)è]!WÀ`’Ûñ—–!Õ¥¡²á^™ÖGùÉ¡ÕÐa"Éâ¡éáþÆúaÑb Sâbç &­…O„! ¢"Ú ¢žó©Þ⬞#Qb%ÎÐÞGÒ€ÏB”—íž°ßPm$„þ0£*Z9—ø±â.öÒr ”ü½ý… ®Y6¦¯SB´A}…¸XFi”™„Û$¶â5ê€pÛz›±e‰Ä5TÙãþác2ŒÂøà<[Q½£¯Yã<²Òrè›]9`u\å[Ö¿ÛBÄ€2¥ÕZI$otáÉcC⎾–V>6È>b\B¨ä ²TCpÁXÁXœ4c±P æ¢Iž¤ã,ÇΩ||£çä^jñànáIÉÉ\ô Á­½lm‚l-H’. åÂ,×!!>úø«|—¬Da×ùÈAC, ‘D]v½‡rþePzeî„bb|aR`\&…$2¤^*’!âateaÌa"fØ,¦ò¥cbd>ždN¦zUæà]&fN‹bjfº4fgRhZæhÆaišf¼4¢-~žÚÞg¦f¾p¦‘`¢(ò 'F^lÊfÑfŽ™R˜âðí^.-Þnòæ±ÈžÁ!Å,óéf^"'/Ôe8SÚLÚœ †W6¢ÅÓ/ÎÓöÙ“ž!#0òF5ŠØqJç|–Ju#ƒ ÁÈSH‰I‘£å¼_®m£© <¢Øz²g¦èß²åT$¨…*LÛìã²`TÝãôø–B§NQ¹™Ï¹‰d™”@-þÂ0 AnÌÛNÓ¶ÏE6`õ€…¿ÁftfèÄèßL!x$µEÖ ÂdmhK²`fÁ¨Œ¾¢{É…– .ˆ€qÍÙ †Ö¢Ð”þàål%‘iá å2)(Z;mAwÅ2ÑZVáý]r)#má!…0XY-"„_"Å`ªgŒÊ©ÀœáQÂ-x¢™ãi:ߟ*À¸á݉Þ(xÀr&ªè-*£Þ‹hRj(Yꥆ¦ojª‘Äi§¨n§Žª¹dj©ÞÇ©¢*¶¨êª" «î%¿°f&ZÁ#¦âŒuX«Îjr~jm‚—”Ò&ZÏðª¯Òªþ``Ý4µ…pÚ"*"Y•!k²æ!°Bb4§-æémZÁרVë~ô"¤ý"X-ܘj ã9]“:i“xvS¹£÷e§32ã½j@4ŽÓ4~]z>L¸Šk~dcüñ'¶fÎñ(¥…ZGÁZü¨NÁƧ…2:&„:Z;²šBR«À>ŽÀùc‚–ÆnTícOM?n›þc…äB dA¤3&äV èÅlÇVL@AdFz(Ebk–Xäû°èÄ2Gz$B€d¼½hŠõjÎÖÑ–ÉdÖå OS - fœ V­F*„Mâ¤NòäÙÉO>mÔ^P@%T*韸B(¬Ö2þ¥ 9¥Z¨(íUºÖUf¥™h)Ú¦-ÿTX¦©r-!Ü&„YÑY(òká–[º%CÀ¥\ÒåÔÙå›b Î ®dÀêDìéQ&}Mçz.d€n¬öÔ¢.“¨îêb¡ëNgìzfëÎ.©Ö.Ý.îžìêîéöî]üní¯ðnÕj–™çÉ$¢Åkrìñ~åµÒ‡mÆ‘&6¯±nîˆñnôò,Ž¢½âijÞj´j…*F÷v/@!³1ç™-ŸÔt.B¯ú2f@ù"½ž' lgBtg™&ZxÊ,þ–g½6ë³á+B<£¾J£ õÊ¿nýj@£Ä~šЧ}⧬ígþû§8Fìü­BT¬ž®£ªµã‚ØlÈoWE=®lȆՂփr„ „‚,ÒäËê¨A²$´m,í°p OÅC®è‰z¨ú€¨ˆ’(W˜hD-m·hD$­|$¼y¨Ó‚kúqq¤$æ˜sᨎÚ0©&чU‚…mN"ÙúäÒ/£ QÚí•¶RnE“>)D)¡%BTiîqæíÞZeÌiå*nïã Xª¥X2YŠ)™ZšJîã¦%›V²×mE[¾e\&æVÏ]šîG²+MoDÜiûB„èé¦Þ­2+?†ßª¡Æ²îæQ.{ªÌDê¤þòþˆ3»²1?&2Ïæ2¯]3¿ª2?síD³3Só‘±5»ñÆ®6o3K0¢ò:"óêjŸ*.ƒó\\¢°r±bï±Ò7«sJ|¯N5áí%ÄøÞfù²oq%=‹=? "—¼/-Æï-vb:4²Üï¼°þÒ$öiŸ¼£DŽçk¾îk Q#C;t{*‡°`±ŸûA,ªU0p:šðª¹cÍ.dIŠ´¦¼p†ìpB}Éÿ9dK'Ì&‘Ì&0ÍZOHÛ4¦1G1 "DâÈ[ S»ìFvd/í³P×´R_Šw-Sô JÖ“þ¨X»qDÀñØ*VO.þÈÙæWÌÚê1!›Ü ŸAÓ-ÛöœTÛ"[Ìa% ®\ϵ“Lò'.Ò1!Ô^>/äR2cûÜ(Wn)CÝuÕ%|¤r<"6œ0b)E-ƒáó6h/I7¯î<§vG¬v¬¶¶kol¯ªl϶ƒM36Ãn«¶nïvõ¶o·ˆÜ6n×v©÷l#·žŽskÊØ9'µp£sW¯Ehb<ÃiCOwK('³nôQì³õN.=2„)·k{7¢ºoפ™qn7w¯„ô]gõÅ[i¤ëÛL#ÝpEº pDã¥íÓË3|Çw=i,Ê-†æäƃË-†cIs£…ª°tþ#x ¨Nƒ¯’ ÉPd…xÊ`Nuým©†oøš›Ñ6xn©<-W(ZŠÎWu¿‘äyøŠ—zm`•ÖÏÅ5§õNw\ÇÿøHÌà]Û (µ•„ƒ…!?¥_¡yg8”ûuÖÐV6YÆÄ-nÛd/6'sµööø—+òxˆÌ2ND·Çùú*·ìqËÌ“ëù€-»ØÝŸ'f  ººüö¡+ª¢#sk*z§v¤S꤃v¥'ê¥#v¦{¡sߪk^X¢?zn¿‘ug nf/ëA0©oŠ+¯ )’K}Æäp+Ýžby«r«‡ñ«û2¹DB,$Dþ D‚­kë­>§ï:qÌ·¹Ú7ºê·ë77.~Kåâd“^´=U'œÅ+Ÿø¤i4øñS²+ûç*8|š´ÕBøñ@„ ÊRº{»T‚0À˜ú¿'Ayp…(Ka8à:©s8Š{¸Œ€¸•yn€¸ÜÂX<À-ÀÇ„VHöt?Âp‡ËŽ®›{++DWuè_×øb̸‰þ, @Â*ØÁ*…Oè[ÈKµŠ6uϺ(¼Çfj¾Hsþdz¾Cƒ¾cŠ~@“¾->„­Þf¨ß¬ä :êߪCœ:ùa÷›KÞëë¹z›9[P€8MB$täð9„x_7yŸ/Àæ~œï~b¨‚pÀ&@Bø¦ûm"ûà+ÿ—3{þžë}C{~ï÷ºöwø[Á0ÐÚBL{mœÍôe4€c´€‹»O{öëýÞÇ-’2øºOø„_ùƒ 6@l²2 •2XZ´ÀRfà,LÈË& ƒl ãþ†à*)6u™XñbF+Ot#¦`K—/aÆ”9“  pæÔ¹“gOŸ?:”hQ£G‘&Uº”iS§O¡F*€HÁQÞ@¹GÕ@2£¢ €,Ù°Ïu#+´a!½\Ûv ¶V´äꬕIÕiQp¯•¯a\I“qcÇ1mJ•<™reË—1gÖ¼Y*Õ‚“âZ„RLY³)k¾@¨&k¿¡!M ëÚŠ´-AŒ=0·hÒ¦QŽA–°-LJ8ÆAŽrhI·YÙrMµDÏKb°';ÀÏ Àp)–çĕռUÜþ +èÇDçi7u‰ÄÇðÇ?Ð0××Ío(—Çt F`…À¢.fÐ!4 HQÓšý •׊t¤$}(D#:A ¤v S&ÕHþ@ç€$"úˆ •&J:Q%‰=ÒÛð@ ”$D¤“øéO•bÉkŒr¤ H(J1M‰á@Mc:)C“¡1 Þ@\ú¨HÉt§%b€ÐyÓA锣‰9êK˜Zaµ¿x©ìn¥]Í™äX%,LUXcuwèUµR‰|§ãYêÖ×Îè 8uÅåöìZW·O•rõëfÚºW™Áõ¯…¥Zý+X–±D lbC¶ØÆN¶kˆ$¶ :ÉR–³:ÀˆZÑŽ–´¥5íiQ›ZÕ®vµka[Ùζ›ílg3 Ýî–·½õío\á—¸Åu„þŠ›\å.—¹ÊmÀm¡›45d"jˆîu±{”?¼á ÈîwÁë@8Á €ïyÃ{‰ |@¸zá{Ý@Ø =°A â›ßΊÂ8q€(ô`ÆaœÀ '6/X®ȃNò`OØ«u€N`P o¸ŸŸØ@t’ƒ |‚Ã%Σ':Á“NxÂÄ-žŸ)îÀ“;˜ÂÅ5nÞ6%ì˜Ç)Ø%ldÒ™ÀEDê ˆ"{ÂBv2éj° ÔàÉU†²”©le-W.ÊSÞò—×å,ƒ™Ìos™Ñܶ3§™ÍZ[s›áœ´7Ç™Î8›sñܲ;ç™ÏÛsŸþ­°?šÐþt¡-¯C'šÑæZt£9›WIOšÒ•¶ô¥1iMcº €@6jQšÔ¥Æ4 í àâ ­võ«akYÏšÖµ¶õ­qk]ïš×½öõ¯la» ¨Nµwp6,›ÙÍvö³¡miO›ÚÕ¶öµ±mmo›ÛÝöö·ÁÍì^ûØÜIv¸Ñnuƒ»®ëv÷»áýîq—»;çŽ÷½ñnä›ßýö7´çMïíØûß78³÷ýlT`û^xÃã@‚U¬‚qXöÃ~pû;àÏÁ7ò{g¼Ù@….~r6ðBZЂ0x‘r”‹œæñî¸Ç¯þòšï<Üífð ³a*X¶ öpñ¡óœéá¾9Î9£ó¦OÛ$Gø®¾l1€—-ŠÞ¨°ó¾pÛT`&îz0 pÚÂÚN¶-ádÁâÞm +£­,œm–€ðÎÐÓPÚìÐðNá «ÐÝ‘ð‘íœm¨€¡0 ‰b /îhA °ÀèäÎ4²­²þpÙ$!Ä€²`Ù® ja l!úNï-#nâ*nÙâà¶`!áJñSqÚvUñçŽ,†‘ b‘âäã±±®Va ~!Ù öpÙ´`‚±Ú¬îâÎ …Bn4!À /Ù`ë˜mŠ ´à –­„AÆ€ |a© ÌÕqåZîåbŽ @` …!áìõqÚ2÷ñçTÎäfðRæÔPåØà!òç ú®t!ì¾~ή֮ÙBàëô®o€ºŽ%ŽÝqÙhafnÙt¡“€øQ e’ ¼nÙþÞŽ Î(1Q®'—í'§Í)Ù*n耎َ2)«²—N*©–2î.ñF¡ ¹ÑÙVÒÅ)`Òï(9‘Ùa¶`~@ë€#(.o²(Ûqò!án‰,¦­0k2ì ìs&Á®1/N0ir٠ᮀ v!ÛºñçÎ%að-Ž/±­ÁÙ® FaÙ@R2 èÂR).áZóÚnÓÙ2Žä²R,Ó’Ùr³äf“ò® |¡’%us±%ñ-5pô8³krÙV±í†pÙ¨@â@5—m„Á;k H“ïbÓ"oå^!ðNþ<ÉÓ< 1<Ç3ʳ IN= ÒêгÙàÓ>åÚS ^a?™í `§³Ù†a:¥P:«Ž:¯¶à —m @ ‚AHqt!O / árð O'¯o1CtD#¡DÙàDŸí D”Dñ³ÙVTò ÑF—“ÙpTFi Q©qÙÎ`“YñÈ-!4%´æ„0Ü„Dû-KùK qÚÜšð §”JwÐö¨ð ² š4Ÿ³Lu‚à.ÛæôLÓ  AßNqâí4P›4KPõPiŽP3ÐPµQNQ%QuRû R0 Ùþ1Þ®tAÐ3µKoLŸÍR Swî ;qB«± ¯íSÏUyn ÑrÙHµÿL5 ¿­ ¿4U• ³U_¡IaU µí„A Fá ÆÀÚTXÕMGµOýôVÙ ÜzÁAô]5€ !Eù_áB d`;ûÑ[ÁÜ1Zýt«ÔÚ\«s4Ÿ1§ÑAQOòW•ñÚæR_CQA›1£m^a”òÖñHóu]Õp ;îgñç\ñIÑqÚ¶^_åP%eY%–bi1ò.2 –Ù¼Ñ]ß5:·í Ý“B=2ð@’ àQé‘a%r'þ­í&y6ç±ï"IÚlöå@6.?2H/N9ån‚A1—M?/îÓi2"£­ig j­„aj}®j¯vð´¶ϱk72i;’ ÖÒÙjµþ0+Ÿ¶&‡3'…¶í–îÚˆp›Í+2.©oÉv8í•Y—Í\aðzóâ†0wÚhýîœ ¶#wr)¯rîrY2s—ín?ofiVÛþ²o'Ó1Ù .ï2/9·M«-tm/õ’ŸÚb—l)Sj3‚(ï/+Ó^%SÚ†—sg—(YrÙf€ör1y—·x¥·÷rÙbo¥N÷v) sòH¡þs‘Ò3Ss5¿7ÛL5Á“ ‚Ó^Ãpsor}/Îq©“j3Nt!Îtcó~5}µN}ÙW+Ùà F!{Õ6|V€ ˜6ÛgxÙÚ•|]×'tl« B@P¡&´@¹Ó;ë÷:7;ѵ;¿~ÿó>7†³v„.L…UØåXbû’Ùvaîmcó†åhwøfKø„SøâV¸ °S{ɳ! Ô^™˜ÙÂÔƒ?˜'ðc BñjÒaåC=TK-4x­-C;Ž?4Fu4‡kE™ ‘Ri/ÎŽEWH_!áz”&/6‡t´ÙðY™ïI'˜,¶±ˆIq‘»Ne.#yFÅ7JɸŒã4^×mX³mS¿ÍK»Í•»TKg™îD5•UùOYYÝhùUåï—5.oÛON-X½­NyN˜ÓŽ™ Ž˜¿OR)ušm®|ËTš©9›Õ šƒ›µù›¿›sÏ›Á¹œÉΚ§° عÝùá9žåyžé¹žíùžñ9ŸõyŸù¹ŸýùŸ: ÛyÐBYà :¡z¡º¡ú¡!:¢%z¢)º¢-ú¢1:£5z£9z¡`—A:¤Ez¤Iº¤Mú¤Q:¥Uz¥Yº¥]ú¥a:¦- ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_11.gif000066400000000000000000000323031343257752000273320ustar00rootroot00000000000000GIF89a@¥çŒ‚„LB<ìÂĤBDÄŽŒ„$"$|b\ÔªœlRL¬†|Œjd<2,L\NL´–”´fd ÄžŒŒvtôâäl&$ܪœ\F<„ztD:4Ô¦”|jl´Ž|lZ\œzlܶ´üÒÔ4&$ TJL¼–„̦¤”*,œ‚„TB<„ ŒrdD2,Äžœüòô¼’„|^TôÊÌŒZTÄ–Œ„f\dNDdJDL:4„j\¬ŽŒtZT$¤~tì¾¼¼žœ¤ŠŒ,"|f\ľ¼´Š|ÌžŒ”vlܲ´\JLÔ¢¤œ~|ä¾¼<., ¼–”œ64¤‚tTF<üúüÌ–”dRT„jlt^T ¤JL„ Ôª¬lVL¬ŠŒŒnd<64T><\JD´’„œ~tä¶´ìÚÜ4*$  Œ”rlD6,üÊÌdRLL>4$,&$Ì¢””z|¤‚„LBDôÆÄ„|bd¬Š|<24,¬žœ¼vtôîìÜ®œ¬Z\œ24œ><䲤Œ´’”Œrt\><Ä¢¤¼šœÌšœäº¼üöôÄšŒÔ¦¤üþü„nl¤NLÔ®¬ìÞÜüÎ̤†„\FDD:<Ô¦œ´Ž„œzt ¼–ŒTBDdNL„jdtZ\$,"$|fdÌž””vtTFDt^\lVTŒnl4*,D64L><ÿÿþ!ù¯,@¥þ! H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·p/f@·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KœÁ£€"82kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¥‹°ŒcïßÀƒ N¼¸ñãÈ“+_μ¹óçУC 8õêÁ¯cßν»÷ïàÃþDZ»£€ÞâÓ«_ϾýsíÓÁÃß>ß½ýûøóc'Ï[¿ÿÿÈ]}ØÕ@G u6èàƒáñgzVhá…ë-(®Ô àrb(∠JÈÑy$¦¨â}Q1‡# øv982‡ xÁÃ#˜ c N8F‚ƒ\÷ÇŽœ¡Bƒ„áÅo^„Qd7æ¸c2 À£ø˜å Ø 6\àÛa8!A F"©$“+Æ)g„åHáœxæù\G\Ј_ F# \ÑI+„^ÁŠŒMaD;|‰@l(ƒüaƃaF‚‚&zh¢‹©å ¼Aäu\41ÁþMpáÛÂzݤ•^ªç®¼*gâF(ö*ì°¿9RÃiŠo °ì `!# ¾ÁðÁ—nxâŽl눎À!ã³Í’+­©ÙùƆ¬è:Bí ÖúöÁ»0\—­·Äæ+쯫ï¿sjÒŠ<ôh²š æ_bÀÃÿÆüßÅ_&û)  ;‡Â0<ÈǾ]pÇðÊò›‘¿,Ç<âcHp°ÅÉ@ïµèŽÒˆpbB4dŒîÍÃàF&×¹[-ÏóV{Ï2W¢ËÁlõÖ¶Í} }4º:Ú»·6aÂ0´­s„™ã|ôŒÀ ¡þ«®ÂÊ. 8ÚDÚk·Íõáb}‘Öˆ7î^£ÌDb× g„¡°‘5¸1‡ ¢B(¿! ÂØ–Û ß \wÁ cÞrg8Á智ã¼Û§¸EŒ÷.<„*oüñ¾ý^QðÈ7_ñÎG¸ò1/ýõâAýöS?‘õ܇/þøâ{/Ñ<Ø þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  HÀð€´¾àG¤ìŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ Aèˆþï…0Œ¡óÌðÉð†8Ì!±hêð‡þ@ ¢ˆxø ñˆHLâ}ˆè˜=ð70hA':Ñ‚wéaNPƒ¶a8aoàÔSVœ)cQœb-ö°NAâ’Ñ­ƒE-Ê‘Œ¾éâÃxÇ,n‚ÀaS îHFí¤‘ŠV4#”ÈÈ2±!N œ€S˜N(ºàÀ… Â@@#.@ôhJÖ$+yÉL~)š°A~66ã\‡“ž¬¥o@)JRšr[4pþ`,Gœu¾Y¥%1©ITzÈnŒ& ÉH ‘’2– i¹"›éJΖºd7l‡ Û¬%:…YÆßt“ƒøæp´óN]úf AþÄưÈë˜S›2â’—ì)Í‚^š ±&p$@Kß4ÂfèÚÞ0†ÎS9ÔIÕª|cÑßamh#¾j´Õ‚s®M-Ó4K\áqö žý$%—é„?9àå|‰ÓpúFo×ñÄr[é\hÅr«§|nì)]êŽ ººôB+‚ÓÒÞîr»˜ìîu÷VÜú6î¸I.¼@4@ ’m5Ð 0Šñª§ÍTë È_ÿøŽn„#§:RßÁ& °vá'¾Á`Àá„Ië¶ßþþW²¬Ã¬}WÌ+üĈ,ޱŒwZ'`ÝiÆ8Î1]˜ŸºÇÇ:òŒ]L ùÈHÞWûuã$;ùÉJæ1”§Lå9y F®²–·ìŸ+ Ä+ ³˜ÇLæ2›ùÌhN³þš×Ìæ1·°#èK œçLç:ÛùÎxγž÷Ìç>ÏyRæ²  /CB¿ÇQq{® †æ\Çš—±ìF›XÅ ã‰n…ýðà{Óœtž`<¤oæ'SýiÊ6Íët x £sÛnY‡¶£khÛxT+5c‹/¤«}¬»¶nûºUg’á˜Rf‘ ŸggV¿{ŠÅv5¼í†wÉw?•luûSךT¶1s¿þ+2u#‘„+Î Ÿü g”¼Éñ3nP Kwn×½×Ñ‘ùLÖ xƒÀ¾“2‘û¨Í{‘ÏktÊ;‘⫾!ãô;2·¦½‘K½dWwlgÀÌ¿ LÀBÕ¿ÛûvìÀn—½IUxÂ*e€“:iµUÛºXûY—ö5®+¢g™)¡7“èø­ fµ¼“.Ù3/Ü®G£4Ã5³[74yœ“4¼·ì$“8̶ód¦ZâtAüÁg”Cɸ§×ÄC ¹3«{7)Ä„ù%? zœ7Å3Ü“ùèÂZÂzÂE·>Çv_¬Å<ÌÄ!lÆÙÆP¤Z¦[·ÉÒÆ†¨”¿1v\é•þ¬2| 8‚“]¡4]º·5GÈrTù”XÉ6ÕWÃl÷Çð•5L8’|†óÅ7µÇvÓ·Éìdɘ<Q WR ìŸ1j ËÇ.¤¬e “ž,¯Õ•—È…ÌÉДÅ_Ë™ɆS•ÉW$¯ÌQ¸\Êbù²ÂÌÇÆ‡]´gËuÊÃ|}É´­%Èš\ÍÌ ÍIûÉ{KÍJÙ–P;!À˜‚Y®C;¶³ÎµÓ¨V`|¤È©ÊÎEŠ—z™)¹c€‰€Ýyè<˜Á¬ÏXžÌ™bé;Úf7ä[оáÏÁÐê|ruIÑÖ—Ï%n{Š*~ù# ¨0-Ë‹™¦êÒ)Ð`bþÏ÷k7 ½!=Ð Í—y9ÈþwO'=Ñ…y˜ƒÓüì¨ æ:%Ív>½;-Í¿å§Ð%£Ò{ùÓ½`I}~ ý%E-™lÎ$‚™‚[£™ â= =P°^ý¨ÂÁ™7Ne %Ú k½2ØÙÇÃÚCÜ š,à@Ó+œ`ÆAš¦ÙcÞ;ÁÒÖ+ö›ÀyJŽ›ÛCØöeØÇùØW3×ET×]ÙzâØ–ÙÀ&ÙMDÙšýÙšÆÙäÙðÄØÁáœþY…0q Ú·¡’Ûâ‰QäÉÊÐAŸ®s°3môF]÷vÆÑŸ´ýŸ¶ ¡•Ö™¹ m»­:Ìò]/lÖ"¸Ïþ‰¢ ݆èlÉýÚ¢]Mw"§]j¤Dj$Œj—®åÝâ‚Gæ ¥“¸©¥z‰W*°,:ޒڥ譨¿¬Ù-pcW±B{ý Rõ±ÀQ±ØJrÚÚqDk¶Áñß»²Çj4[»ù­ÜÛP2¨·V<>-µj» z«ŽKÇŽƒ0º ^¹¥·>á¿6vl¼ &v)X¬¿Þ ì)w|ÂÇ!ã üIqëâ™6vTŒÂ#¬áq<\[Kn4S®Â?ÙÂm|â¿‘áUU¾ÇHþâÞSwÌÀ¥ÍÙ¼ËèK²DKf~ÊÈ Èü9kÄ|•öš•ßZŒŒ±þo>Pf>äæ©6v/ÒïìÎí a¾ý…N—Ó×Ï4½UÝÏmè‰>^ÑšéV-èƒ>ænEÚþ¡ÕÒñÖ#X Ži˜½ê®î­þ겞±>ë¶Nµ~ëº.×Q»ë¾>~¢ÞY¤þëÄŽëÁŽ\Ã^ìÊÎëX½‚‚ÚÃ=…­½ì`÷„¦³}†£†ÛÔ^™Çž_ÅÙž½-aÌIÂ}†m˜¡ÝvÖþ¢l¾UÀ]#:Ýc££ë^íßþbwò£:xm’© :©ƒžPžNé]ß¡ªÞšŠním¥uŠß÷®Ûù^dwB+ÌŒ.Dû±þZK!%à¿Aà#w² n4¹þñÚ-e¡k7©û¹>V?Yz âj+â<,¶%®¹bSò&OáR¶‘ 3GC~F5XC®ã8Þ4È›ÙwF£Á;òÍ>)ïÅ/Üåyå[ìÄcSåžwå•åFãzOõv˼0»Í¯gæuóînžÌ×ç·,çÍGç«,Îbèc/æRÆïG.4’‚P Aƒ'N¬˜Rá' ,x°‡›?¥\A˜KJž=}þTèP¢EEšTéR¦M>…UêÔ 8@šUëV®]± ÀQñ „0&ºñ„Ž#“9¹0è‚“Fm)J¬‹pÎF„ŽjL¨ˆV-Û„v¨Ñ‡BÁƒÖ"|“f§"|uRÅœYófÎ=þZ4P«^MŸÎ ¶âœ¸r'b;¶]6²c³1\Xb;4jjå„GŒ¶Oæî À—…°m#1ê« =]ûvîݽ¯´4jò\U/[v⨼Îmÿ6.Jݹq8¬øgŒ„ìy € xˆ¡¿öúC6áí¡6ƒ0B '¤°B Ç+/CHÎCˆ‹Œ0¢‰‰2á,Ì‹VRjh'LXèÅ»baE„Ú€A¿>Dj¢Äí¢¾¶L'MDq#À!5$³0J)§¤²J+}ÂPCò8”+Œ3œˆa¢?jpc=\*ì â*âä—:ÎÜpþ"­AÒeŽ ¢@hÌ2Ïr¡Ìø!SÜØÁO3ÑT’‡=ëJI'¥´RK1ËRËÓ¸Ôšj‚O¥Z¡pº4UUWeõÒL5õŠÓV‰ú#=œ5W]wåu»Wa5/¬^…R®ƒaE6Ye“úX­d]6Zi§¥6ÙfýJØj·å¶[o¯¼[h¿%·\sÏå,\gÇE·]wß…÷'ueWH•‚²×½äºB£&ƒ‡|›xÒSãE8á¨æ…µÞñÝ·>}¡Ó΢&2ƒQ© Ž0‡"P@‚ê2!R…OFÙ(†5uø0’qpbŽ7Ž@îÞB©©‰:im*Žþ ’*'hðœ`±Ô”—f:¥•µlÙ§‰<‘F. BXŽót®ªŸ/žxcžþÒ Wšf›í§5äò0œ Ì>wpä øšÈ•’ËÁ‘9F K71ç®{"GÚ‹"ˆ9aàî¼÷në9©¼ð l@Z“›n»ùo½ùòɘ;ÑŽ„d{}¶„øxÆœV®qõ䃶Oùí ¹Ü¡ #&‘G’ÒM‚%j¥‘v Ôp„Š?>ùA4âÈ#”)УŸ¾z.š˜yæÁù ÿ§=/Ø r ò"„:ú(¤ØËϰSG¡A—^þ&¼òp)=ƒ0 cìôÃõÌ=¡ØN¬7ˆFp{Yˆ_³ÆP@‡Á Q8øŽƒ,<Ë” îi€¯ñ„²Ë …ø.nI[lÍ^Àæ=ï†d B”Ø›ßg8Å±Ü ¥6±(ÊezIâ-ç“4á °“Xá¬I(~ê‰jð¨ÑŽÞ*"jCÝ̨²™ø&ÒÁ®5©Oûé£Í~´A¬°,.$d"…ò/làÐ"#óƒÈÿ1'\Cƒî8ÊoåqSGôˆ´w¤é†j˜Ö´61¥2DÉÙr4†½¤GH_Íþy¾ô5a}¶\å/[)1„HÁÁDd„iJ G:ZÄò$Rvs[¦4 —.à%0‰‰L‹2Œ 4Ð ™Ñ,âç—FW1„àIO¢R 68ˆAÝÌ.¸AçnDrŽ.ŸhêgJÆ0 åÔ NÍ=÷4\‘Ž>² 75j­«`+VG §œªÏô;ŽèAÑz0ÀƒmÔ¥õèG_ú8d}0äLu:,pÊt§?ª{ÚvÕ¨G…×Pƒ…T¦65©éVŠêTªVuYJ•*H­ºU® «ÏÒjWÅ:ÖU}55aO¿þ…€)¤¥d…«QÍš- Ñ3›ƒÈBJ–þѸöÕ¥sÝZ‰Å“0hFÌ J.ïʳ…´@i~…¬7;U—åÇ/ :ìØ*â5°ILm‘­d¡Õ³Vdœ¢“é(7Æ1aoƒI`—EÚ)ävë ã‡[Ò©–oÿCHïB;Ü;N•-0…)ð¾å!§Eɬ{ô7þ}o{¨«®ÿ`R’}‘¸ßM q #Æp0¹‘\èòD“äð/«AI(Ã`z¼÷mšxÒÅ)n‰ô©mpóÎÝT±TD¯èß,ææ:ø…ðÒôÛòzÐ?„ÏBÒ«IÄê‡?ƒ¸OJ<,É»ÐÇ IŠpŠã5áAp¹Ê}ŸP4Mþ±È!Õ¬&}®ÉKÙh;î%+Q¤EnªØÈD-ikÚK|iæüš '5¥¤Mo‚¨Ä$**»n¹OçÔç 1zd2£‹ÅAE#Ò¦¼µÌoÆc’IË)˜¢M°œõ á3ÓÎ åž Ú3ÚÐà-ô¡Mh9G•²‹†tWiJ‹uÒ•ÆtU/½fݵ­•EŠ›3=êÑl4v%^5æÏ£ì•Ô¯©A½Â– ± Qlª;ë£8Ö¿öŒ¬·hÙ`–½<áìZomë£|ØÏÎ ‹O›8ɸiíkc \ÚÖnq ¹mîJ7¹ßzÒfš(Æmm3þ”ª}ØÀd\mz/¬Ñ1å’‹“»\ðqWHÏýM2]îíÏ{Ú…Ÿ¿Ã¦/–¸d»2¡‰MP…ÀzW¼),vD…ÍëÂÐ'½xBÚ¾¼w¾çínr³˜A”0‘™Ler¢A‹×œY÷ö(—ø+F4Ø8æ0äß$ØŠkrNÏ.‘å4‡‰Ñ™ÎÈ&£f›W48×3®äƒØ°­éâM~øÂ´Ä×€ {v)ÈØ¢´zÜ…Âb}ØG2¦&yk\‘ᘼS,ïÌîÚK!D2’2“´$CYî›ì„'9Ê"¡²rå)g™>]ÎÓDIf4þ0¡;T¢H¿#8Ê:&ƒ|ì2é4‡†ÍL1iRHÅw@Ê^ög®óóœ¬ZÝÊ÷ÇG6Ö×R?ZYÅB~ôg¯|z Vú×—–°±¿ý^iŸûߟ•÷Á?þT‰¿³ÃäRÔêi1¤÷ä§·ù•­Hm*ÕDÁš\ ÿzË9&€™vZº[Ó, È5üCˆ]cˆÇâ¿_ó?‰y¥«Éš䚋롻2±µi@h“6Ä1(ߺ6¿Á!ñ j›ÚY7ÊIÌ)ÁFÒ-Ü©6TË® |6º{1~󥿒çIò¡ñií€éz¸“ž!¼®îéŸ~c-¢8„5ŒÓþ8 B¹ á«„H! H¹“ã8“èB½ˆ/“ÃÂ1ì®)¤BRc±Ã"¥[ d5™8LˆI:Ùa$¢3°ÛC;¬ˆkÃ*¤¾†Ñº+¶Ë?ª?A|!®“F$0²CN¢D-:±B4D%«Š¨;²¼³Žª‰¥ $°Zú[ÊQ$°ÀÛ¥ S¼úr+‚? 4mÇÐxÀp$GL9D–±¾rTÇ`;G¨IÇu„ÇhkG¸yÇx´G{óÄÒºÇ}ÜŒqìŒõþKµO›F~tÃyžzÌŽûŠüÓ«e$È‚ÌGºJŠ ‰Np‡I,Óµžñµ‡ìĈ|´GÌ M°>p"f‹¼ Lµ ÉÌGqòÀÔ"·k.ƒàZÖ¹6ÕqÖÉÈoCˆp›ÁrC£|ÉQÓÁ}c®øá0°û°ù©Ÿû‘©´ŸŒÀ®ƒƒÂúbä¬Fƒl D”D—;6‹â‰Z8´ü 3¡44¡9¡9¯¬´7 £8äCf{7„(£3ºË…ØK4òC£;0“ËzF¹44+”ÄLd6.P„ $K¤܈ÌK*$ÃD'ÒDCLH[J»ó%¼s‘¿›ˆ0I”l¦þgj„h"ÅÔ„&\ò1Á MÂ#2ìÌCÃEÊÓE}ê<Ù‹ÄÈ…X¨†Ê²áô‹Ò¬“z =|Z½}³ÛŒ4gìŽhTŠ„ÎA³Fá»ÎÛäFoÜÎÎôÇïŒÇðÏu$Ïò,ÇóDÏpTÏõÔÆöü €DÀAÈ÷sOü‚ÏÎPÈÁRµ†ÜÂû$® ’À•<Š\ÈôHÛÐáP÷ •|ŠdÃÀŠp¶½¯D­¢´É ÒÔÉŸäÉ7X/àÁ!¯ä ¡´Ý7, œ7 ý®ÏÅ„‹B}Y€7à‰°Jª5ž+èò¹VØÊ&4¸'ìA§„KÍþP°4¢ñKú"06X{QKH!/9·$ ’k$4l9,•¸”ÒТK)â¹¾´‹? …п„S DCºÿr°Ã\S¸RÌòê:ƒ7È„Aª$Ë<¶õp"K<$³ÓÌÜØÄ@uP*Õ£ãbÊÁk¥«!P‰p¦×lTNEXĦÙl¥Ú´ÔKÈ%[ˆ ˜¼Ê½ËãE‰ù4N‡*ÕZÝEc=btN‡lÕ¾’N ¡Î¤°Îb%«ìÄFfeOL=¥”h¾o„V[ÌÏkå¾lÕVìãÖn•¾oWäWK‘Ï¥Ïö[ÖqM˜r¥”ý„˜þ„ýcW “ÖpBÈ:$P þ¥åOüÈz ž{õ©óKˆ=,paÉùtIØW•É í­šÌ"ÑÉØÉŒÌ1QUQ}QLˆp'ÞðI ì.p„N@uQ¢œXk›Ñ£¬Q‡mW‚%*MÍ$|§ýQ„R“ Ò0R$UÒ'å®ì2 ã ‘¿„¡eø>Ÿ-8êÒJ¥ÝQ‰éJœ}*ˆKB=Ó,œ-­™.ýÒ2[5”/“`¡›µäÂC "Ó¶]Û·äZ5õÚ¯É#ÂÃ<%09¥Ó‰°ÓLšÁåS“H¢/„ã”ÜÀÜÓ£³KH .@íÛrT ›Ô9ÔD…ÌEÌþsTŸ±„xÛѕ̉˜Û” DH%̼ãÌÍu1ÂóÔ…UQUMÖ4]SÕ¥T€Ul€õÕÕœˆ+ Zâř،EèeUÜ]1]ªXÕÝ”29ÁU]e¨ãìUaõ²‘u‚3ƒÖØU1á‚"8ƒ—õU}Væ´UeüOëå\ìÍ*Ÿ¨=)1P£HÖP³Oü=g¾(ù_¶ªît>ÿU`WýÛnCw•``£à †IOI &WýýDæ¿ á[ô`}áñáþJ°Ua.a‰lám}aXáíKáÆÍÞ`®ºæaAóa•Ë Þ¾!À‡4â~³%fþb2sâ'6²(–â£â*æ3ÎW,æ@-æâßóâ/†¼+žŠsåÏOÃŒucJ!㨀W̫̠×5V•r›§D WLµ X:.¿0ÎŒ;æ×¢ Ð–œÈB~ ä@fᣘ¶¤Ø£ÌXnë¹Ú*Š˜…Q­A4ꉔåÉçè¶©ÛFžù ŦT¸…Ú ›.¢¸Z¦ÕÚúê‰V»WîZSAÎdE$ËeëR±KI ¸[3ýe- Š`άÉe]®ù \?õK3’Cü©(¡ ÜÅ%̾üÈ5]ÞÑ\g¾^&Š­[ÆDÒE\"ž»œJ]tþ™Ê,Ý K‰JçSþ&ç¡Heè­¦å^¿cç\ÙtÅu®–¦¿ëÝmbÐ{–ù“Õ\DFÞôÞõÅ<ÏCŠùèÒ3ŒÓÎðåÕ[íM$V‡žìß ¸¥È=¨Pc“¦ÿ ¾g…é#›0ãÀi4ªVÏÈ霮i;jãŸ^à|êf$jÄüƒkO#pê§†ê¨–ê©¦êª¶ê«Æê¬Öê­æê®öê¯ë°뮞ë³Fë´Vëµfë¶vkµîé¹¦ëº¶ë»Æë¼Öë½æë¾öë¿ìÀlpÁ6ìÃFìÄVìÅfìÆîë~ÕÈ–ìɦìʶìËΊ)@4˜ÌöìÏíþÐíÑ&íÒ6íÓFíÔ0€Hí×†íØ–íÙ¦íÚ¶íÛöD@AÜöíßîàîá&nà~-P*Ђ(îævîç†îè–îè~;ð?°ƒG˜îíæîîöîï晴IÀŠ, ïðFïôVïõfo߯n톄êöƒö¦ïú¶ïûÆoÒR„`¬`„P„üð'ðooèí¬0ðwð‡ðß®@­@¨€×ð çð·ì „ÎÎlB(7ñGñG@ˆ®ˆ(Pñ—ñ‡ð20Iàƒ×qI0J ñò _o%„"GB (þò@P!wò'‡réÞÖÞ‚(·ò+Çòßžr¨ò,÷ò/sÒÞò.ó27ó3ÏÇ1Gó5gó6Ï5wó8—s7‡ó9·ó;ÿò:Çó=çs!×ó>ô@Gñ?ôB7ô'ôCWôE¿ïDgôG‡ôðvôH§ôJ‡îI·ôL×t-§òM÷ôOçt.õQí0õSGõTWõUgõVwõW‡õX—õY§õZ·õX? °€C¸õ^÷õ_ö`öa7õ õÈ€&@…egöfwög‡öh—öi§öj·ökÇöl×ömçön÷öo÷p÷qÏvG(cUè`÷vw÷w‡÷x—÷yþ§÷z·÷{Ç÷|×÷}ç÷~Ïwð÷€ø'ø‚7xT8wtÏGu7ø†wø‡‡øˆ—xvø‰·ø‹ÇxGx…_øuÏøùŒÇi‚L¨w¯ø{Oùgù–¿øçx%cx—§ùšï÷•/xH‚8@ù·ùŸz‡ù˜ª™ú£Gzœ§x °)`z€_èƒ>ð€5Xz›€˜„v¯ø¨Ÿúªg÷5P'èC¨øJ°‚QpP¨¤‡û£z¢÷(£û»oy¥Ïz:X„½ï{(…VX„Eh…R x¾§xøV8ù¬g÷ÀüÂgw|¯xCh…€$Hþ¼÷ü–Ÿ{ºw»ÿüÒŸø‘Ïz2 xÕgw7èz˜7X}¯g÷T¸ƒÄ×g÷Øoýן„Š'$`wØÓ7~‹}чÒ?þæ'ùx€ÆþvÇ`wÀŠo|Ç5`àþê¿þìñ¨ø@tþõ?ø„WþÑ÷xö—ÿ›‡~Úow݇}Ùç~܇}R¨ƒŠ7“Dˆ˜ä† @‚“<‚ Ĉ'R¬hñ"ÆŒ7rìèQ"ªF’,iò$Ê”*W²léò%̘2gÒ„  ËÇœ:wòìéS"ÉAE QªÕ¢E­J,ZôÔƒ G“.%X Õ §ZMZþ³ÕϰbÇ’ý²&Ú´jײmëVæÍ²rçÒ à.Þ¦‹ÊðЧz÷F¬„)hß¿ ®Q夡 •N‘šó¦PÝÌš7c<ûö3èТG£Ëù4êÔªW³n]×3騲gÓVkÚ5îܺwóîÍvíà‡¿íû8òäÊ—ËNü9ôè¶q2¯ný:vëÎ¥sïîý$W¢Æ“/oþ<úôê׳oïþ=üøòçÓ¯oÿ>þüú÷Çwƒé;€v‡x ‚ *¸ ƒ :ø „J8!…Zx!†jhá&zøaqÔe7"‰%š˜Ùv ª¸"[Æø"Œ1ÊXQŠ,Úx£Mþ"θ#=^W#ŽA i’‹>y$’¬9$“8™$”QJ)Ö’MZ©â“Sj¹%—Uy%˜†Ç™ešy&šiª¹&›mÂç_˜q²¸!uÚy'žyê¹'Ÿ}JØ¡œz˜e—…:å—‚*â¡:*e¢‹J¡«EâŠGA!âFQ/vú(¨¹ "Mz*q•VôiD¬nTGHdJP:ìèj¨¹NÒ‡`EŠ*°m©º®YBÇGAu²Æ­ÄbRI«u«ÏFK×´e»—µ„…å ý,¹¥é8Ö¶ Y’ì`3¦«mq\;×»ï¼rÕÛnF÷ÊëíO)$!®þ©å Ú°B5Ç&X41QDåÅÑ(²”+Xl²A•X1Š Ô¡À°Ã#Š|2À£ÌAŠ )¸‘rLJ<²E•”²‰†0æ`ÌŠÐØc‘å ²È0ÀG|4Ñ}rÃ/½³Éyå.A‹8R†ôá„*FcôtÔÞ®QõÕ(k-‚ÇLó¬íÄuï¬J ¥ JÉýB-uPo+wÖëÝ4AHäkÁKÞâ¹N7õIuX‘Ç`ûŠ€E¯"8¢Ã‹TA!­„0@©t¾6æšs.‰ÈP‡§å uDÒ ™G2{ê«·~Q$­ 1€(V!¥þS"pð|+AϺëHج@;õTÐ_žù樫ŽýEC=AÊ÷U¬BõV4u ÷Þ~UDÅ^¾×orDü—Š5ä']È´œB?½tï{R¡^ô°?âï"¨6¹ ®%a@i "ƒ NÍs ƒÈ&N±ˆˆÂb>ØÄëÒBŒp"upE€ÖP-$È /’ˆ Ñ ØBòC±_IÅSÄÇíP„$\bWV¬ Ž ø¸µ=1ŠS›bixE€Á" }0Š;ŒÂü"£ (E1¦±‡p„5ÈÁAÒă×rJ ;R1ˆœþàNp‚…%R‹Þ:A+œ01Dzk’«È #ÊŽ2(žœ×À Lm”$ää)ï’¾ˆâ•HÂ)šÒ«¦r•­Üå+¯Ëbe˜V)Àœx4_š˜ü2%%7ƈŒ‹Ö4¤·8Ï¡B©D!p(‡(ljn”¢P‰l3_A!§F†4Š ˆï|PhÎI‚lGT¯Oevì ©ÅÕø¨½hA¡''ŠÇ†à"[#,¦Àíµ‹Ÿþ¬§B#ZшLÖi…fUƒß$í#чÍWnú+£Q•J¾ }s¥`º-á Ì•ë‚_¹+ö6ÊÉ…#L"ŒâÔ0Š&Lá“&Ä&>ñ\ª9b`•Å.~ñoD¼âA¶Æ6¾qFT<ãIÕÇ>þ1At¼ãEù©ÈF>2’“¬ä%ûIÆC–Ü¢,å)S¹ÊV¾2–³¬å-s¹Ë^þ2˜Ã,æ1“¹Ìf>3šÓ,æ!<¹Ín~3œã,ç9Ó¹Îv¾3žó¬ç=ó¹Ï~þ3 -èAºÐ†>4¢­èE3ºÑŽ~4¤#-éIÏ8 ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_12.gif000066400000000000000000000347111343257752000273400ustar00rootroot00000000000000GIF89a@Øçœ‚„LB<äÂÄŒJDÄ¢¤\|b\$"$Ä‚„lRLŒjdľ¼´’„<2,´jl \NLl"$Ä–ŒôæäŒvt\F<„zt¬žœìÖÔÔ¦”tjlD:4¤‚tܲ´$lZ\œzlܺ¼ôÆÄ„4&$¼šœ”&$ÄšŒÔ®¬¤ŠŒ TJL¼’„ŒTB<üúü\JDüÒÔÔªœ¤‚„$œ~tüÊÌ„ 4*$”.,Äžœ  ¼–„D6,Ìšœ´Ž|”rldRLL>4,&$”z|¬ŠŒ”ŽŒLBDìÂÄ´bd|bdŒnd<24´nl¼~|Ü®œÌ’”䶴̦¤|jlŒrt\><ìÚÜôÊÌ”*,ܪœÜ¶´Ü¾¼ÄžŒŒœ64äÎÌä¾¼Œ„nl´–”üþü¤†„„ ¬ŽŒ\FDÔ¦œD:<$œzt TBD„jdÌž”dNLtZ\|fd,"$”vtTFDt^\lVT4*,¼–ŒD64´Ž„L><ÿÿþ!ù²,@Øþ/ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·p/^@·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#K|Á£€"=2kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¥‹°Ü#‰ïßÀƒ N¼¸ñãÈ“+_μ¹óçУC 8õêÁ¯cßν»÷ïàÃþï±»£€ÞâÓ«_ϾýsíÓÁÃß>ß½ýûøóc'Ï[¿ÿÿÈ]}ØÕ€G u6èàƒáñgzVhá…ë-(±Ø àrb(∠JÈÑy$¦¨â}a‡$ øv3HbHðñ%°!# P@F‚I\ˆ’¬ñ‚I€ÁÇo|€Qd7æ¸c2 €žø˜e‹è:,â[ `@ F"©$“+Æ)g„åHáœxæùÜF,‚Â_Ð b\Ê+„^ÑŠŒNÔPƒ>|y€(hàE)I‚†IF‚‚&zh¢‹©eHÌAäuZ8áˆ#þNhá›Âzݤ•^ªç®¼*gâF(ö*ì°¿Ibƒ#IŠob°lb`!c ¾µ×d¸â[’l+‰’d!ã³Í’+­©Ùù‡¬èJBmÖúû-\—­·Äæ+쯫ï¿sÂò üh²š ¦_bÀÃÿ¦üßÅ_&*H k‡Â‹0œÄǾ-rÇðÊò›‘¿,Çam( ¾j´Õ‚3 ®M-Ó4K\áqö žý$%— …?§3à¥#|‰ÓpúFo×qÅr[é\hÅr«§|î ì)]êŽ ººäÃ+‚ÓÒÞîr»˜ìîu÷VÜú6î¸I.¼°‚8 ’m9 0Šñª§ÍTë È_ÿøŽn„#§:RßÁl °vá'ÎÁ`Àù„Ië¶ßþþW²¬Ã¬}WÌ+üĈ,ޱŒwZ'`ÝiÆ8Î1]˜ŸºÇÇ:òŒ]L ùÈHÞWûuã$;ùÉJæ1”§Lå9y F®²–·ìŸ+ Ä+ ³˜ÇLæ2›ùÌhN³þš×Ìæ1·°#èK œçLç:ÛùÎxγž÷Ìç>ÏyRæ²  /_B¿ÇQq{®Ð†æ\ç P4¤M˜–И&‘¡­×‰¡¹ŽöMc›3jì°·™NuË–ü²;QšÒêÁÁzCPU9¶ŽÏÑ`UûúA›vµs`žà`ØÕm§®µÃ‡XüúÙ v²Â4¦2•LLdÚœo`Q„ŠYHB:fv¨T‚wµèE1*¸‡äI4ôÜ0:“›–”% ggÝ ‚˜“ $¥DgÌ<ƒ¶Àñ#m»µêU±jmßnª2@±9kÔ£~›D‰Áhð Ÿü¨"IR¾Áœþ’°ñ?ùW–ÂÙýñliSúW§Š7fkà8oOÁ¿ä4xñ¬çñ*’ þpÉÎhge4W»¥ ¤läÆBÖoî•n‰mžN×·ÀGçD+ç`_ÏÎ=2‘‘la2’»Ü‹U´3Èn#ˆZ2‘IB“Iˆ{ÁB>Çš—±ìF›XÅ ãŠn…ýðà{ÓœtžÀ¤oì'RýiÊ6Íëô¸ ñ°çŽâŽð¿-mI …'.ˆ¯˜Qàjp¶Ì£Ëk`“Ñð‹ŸYÿùeì¤ ÷z¿ë²lÄÇýÛâþ6·ç´¡×±¿tf&ØA@v%3?úÑE 2Dª%xÑ f„9Íÿ:“åÔ …Ì)ìÓ[”“ƒ;ž:Hƒwoýgè2:¥[Ì¡]·&~è+¬–5M–=ß± WSÕáû—WàaiX‚Ì1vêAlÆ÷c&Ø‚%r‹“áa &N=æ‚8ø(˜ƒ<˜c;؃@Èb?„DH\CX„H¨SG˜„LMKxŒFk“VSØ $Ø„Aø„VjÃá…rjˆ…-¨…6(ÎGk¹Vkˆ  ° pF¼F†=h†¨UƆl„¥‚Õ1D€(@é–Íf‡þ<ˆ‡Ào1òSP˜ån¿Áˆò–$ôf*ö6aÔá ^ G4b#åv&Z  P1h~4õp%b?€ŸpˆX†0<2h%×qó Ï¢"÷»xr”’rWWa“³ #‡q³RŒ:?@D2¦%A¿ q” ð_W‹.¨ˆÅÂtF7SÉAyå(u¾AuV·rPãbs¾ñVäsÐk®P#WFDUàxsâX‚ä¸m³w¨#nÈqw¿¡w †2]™÷N°Y7g÷!à JÈÁÛò»dxi·¸<¹x›Çv'øy¿Ñþ’I0z9ãoòÂ`}×ÁJÆDHSõо‹Pòz'Y™Ð7XP0P”–†Nù5ÑGŒÔW9!à'=À“¾qÒøF0y€(ˆ„øß·”(hÉ!€ûw `}ÊÁ…I —¨;(‹ÐTžÆ–™¢E°ƒ×)ÀÄq0Esø^c薇הâÑØ‚êñ ªWH™âg™¼£ Œ šX¸säh´"‚ù¨y’¢›´¹5³Y›¸É2·™›¼™/»Ù›ÀÙb)Y=+œÆ¹2I ¥…Ìñh‘F~[™6âñ™Ï5œßþSœ&‚ÖU“#…— "j»³b3‰Ï”Ó =1Sfá!†Â‘œ§¥G–VÊéT9žµ6™¢H’Å‚ºP€gHRîÙ½# Éæ*(¡Ô©uö9R¼4J¥T]û™{Hkò™‚ 9¡òá*™‚+š‡ß¡'z¡ÏΤ¢Ïqˆª3œžGh¢&·“)i²&¾5Oäö.57¤HÚnïæ"ñ–)ó'Ô‘‰³¤»Ô‰Ÿ(#T‚#:Â#^r$–øe$PvCmÙæ¥¢ø.dú&Æñ£AÊUtZ$H”¨-š§i1ø¶¥@Ú¥©èQþ¬è:ØfmŸÄ¥Bz¤Ej“8:%m ¨s ©U¦XB¥ejaRšn—$ì–¨*¤¥xŠ•§¨…¦_¢¦ˆŠ<â¦UjKZ &‡ª0NZ¤oz‰‰†ªè¢ª›«·:rWŸ x £sÛnY‡¶£khÛxT+5c‹/¤«}¬»¶nûºUg’á˜Rf‘ ŸggV¿{ŠÅv5¼í†wÉw?•luûSךT¶1s¿þ+2u#‘„+Î Ÿü g”¼É3d` Kwn×½×Ñ‘ùLÖ xIÀ¾“2‘û¨Í{‘ÏktÊ;‘⫾!ãô;2·¦½‘K½dWwlgÀÌ¿ LÀBÕ¿ÛûvìÀn—½IUxÂ*e1€“:iµUÛºXûY—ö5®+¢g™)¡7“èø­ fµ¼“.Ù3/Ü®G£4Õ³[74yœ“4¼·ì$“8̶ód¦ZâtAüÁg”Cɸ§×ÄC ¹3«{7)Ä„ù%? zœ7Å3Ü“ùèÂZÂzÂE·>Çv_¬Å<ÌÄ!lÆÙÆP¤Z¦[·ÉÒÆ†¨”¿1v\é•þ¬2| 8‚“]¡4]º·5GÈrTù”XÉ6ÕWÃl÷Ç(ð•5L8’|†óÅ7µÇvÓ·ÉìdɘœQ WR ìŸ1j ËÇ.¤¬e “ž,¯Õ•—È…ÌÉДÅ_Ë™ɆS•ÉW$¯ÌQ¸\Êbù²ÂÌÇÆ‡]´gËuÊÃ|}É´­%Èš\ÍÌ ÍIûÉ{KÍJÙ–P;!À˜‚i®C;¶³ÎµÓ¨V`|¤È©ÊÎEŠ—z™)¹c€‰€Ýyè<˜Á¬ÏXžÌ™bé;Úf7ä[оáÏÁÐê|ruIÑÖ—Ï%n{Š*~ù# ¨0-Ë‹™¦êÒ)Ð`bþÏ÷k7 ½!=Ð Í—y9ÈþwO'=Ñ…y˜ƒÓüì¨ æ:%Ív>½;-Í¿å§Ð%£Ò{ùÓ½`I}~ ý%E-™lÎ$‚™‚[£™ " ? ?P°^ý¨ÂÁ™7Ne %Ú k½2ØÙÇÃÚCÜ š8à@ó+œ`ÆAš¦ÙcÞ;ÁÒÖ+ö›ÀyJ’›ÛCØöeØÇùØW3×ET×]ÙzâØ–ÙÀ&ÙMDÙšýÙšÆÙäÙðÄØÁáœþY…0q Ú·¡’Ûâ‰QäÉÊÐAŸ®s°3môF]÷vÆÑŸ´ýŸ¶ ¡•Ö™¹ m»­:Ìò]/lÖ"¸Ïþ‰¢ ݆èlÉýÚ¢]Mw"§]j¤Dj$Œj—®åÝâ‚Gæ ¥“¸©¥z‰W*°,:ޒڥ譨¿¬Ù-pcW±B{ý Rõ±ÀQ±ØJrÚÚqDk¶Áñß»²Çj4[»ù­ÜÛP2¨·Vœ>-µj» z«ŽKÇŽI0º ^¹¥·>á¿6vl¼ &v)X¬¿Þ ì)w|ÂÇ!ã üIqëâ™6vTŒÂ#¬áq<Z[Kn4S®Â?ÙÂm|â¿‘áUU¾ÇHþâÞSwÌÀ¥ÍÙ¼ËèK²DKf~ÊÈ Èü9kÄ|•öš•ßZŒŒ±þo>Pfžäæ©6v/ÒïìÎí a¾ý…N—Ó×Ï4½UÝÏm艞^ÑšéV-èƒ>ænEÚþ¡ÕÒñÖ#X Ži˜½ê®î­þ겞±>ë¶Nµ~ëº.×Q»ë¾>~¢ÞY¤þëÄŽëÁŽ\Ã^ìÊÎëX½‚‚ÚÃ=…­½ì`÷„¦³}†£†ÛÔ^™Çž_ÅÙž½-aÌIÂ}†m˜¡ÝvÖþ¢l¾UÀ]#:Ýc££ë^íßþbw£:xm’© :©ƒžPžNé]ß¡ªÞšŠním¥uŠß÷®Ûù^dwB+ÌŒ.Dû±þZK!%à¿Aà#w² n4¹þñÚ-e¡k7©û¹>V?Yz âj+â<,¶%®¹bSò&OáR¶‘ 3GC~F5XC®ã8Þ4È›ÙwF£Á;òÍž)ïÅ/Üåyå[ìÄcSåžwå•åFãzOõvˬ0»Í¯gæuóînžÌ×ç·,çÍGç«,Îbèc/æRÆï…UêÔ =\šUëV®]± èQ1F „-&’q…0‹$“Q@Y”dm)J¬‹ÐÎF„’l8ªˆV-Û„v°ñçBÁIÖ"œ'‰«"|uRÅœYófÎ=þZ4P«^MŸÎ ¶¢¸r'b;¶Ý8²cÇ1\Xb;ÂzåÃŒ¶Oæî @’–…°m# á)P, ]]ûvîݽ¯´4jò\U/[v¢§¼Îmÿ6.Jݹ{8¬¨ „ìy G> ¡¿ö D‰8$áí!9ƒ0B '¤°B Ç+/ÃKÎCH j¨Á‰‰b#,ŒWRj( (ØXèÅ»ÂaE„ähA¿?Dr¢Äí¢¾¶Hñ'MD1 #À¡6$³0J)§¤²J+}ÂPCò8” Œ5  a¢@l Ã%\*lâ*údŽ—@ÎÜÄ€þ"­$àðÄ":@hÌ2Ïr!$Ðø!RÈðÁO3ÑTòƒ]ëJI'¥´RK1ËRËÓ¸Ôšr‚O¥^!pº4UUWeõÒL5õŠÓV‰ d%œ5W]wåu»Wa5/¬^…RîaE6Ye“úX­d]6Zi§¥6ÙfýJØj·å¶[o¯¼[h¿%·\sÏå,\gÇE·]wß…÷'ueWH•‚²×½äº¢£&zâƒ|›xÒSãE8á¨æ…µÞñÝ·>}“ Ó΢&BƒQ© Žp†"P‚êb#R…OFÙ(†5uø0’{€ÂŽ9Œ@îÞB“¨©‰@im*Žþ ’*(h0$ `±Ô”—f:¥•µlÙ§‰\à¹AXŽó¨t®ªŸ/žxcž’Xšf›í§5ä20 € Ì>}døš(’›A;J K71ç®{"IÚë€;$Yàî¼÷në9©¼ðEt€Z“›n»“o½ùòɘAá ‹„d{}¶„ø8‰ÆœV®qu%†¶Oùí ¹ôÁ‰‘G’Ò ‚%z1| Ôp„Š?>ù$4âÈ#”)УŸ¾z-œpyæ’Àù ÿ§=Ñ r ò"„:ú(¤ØË°SI¡A—^þ&¼òp)=I0 cìôÃõÌ=¡ØN¬—„F0 {Yˆ_³ÆP@‡Á %Q¸øŽƒ,<Ë îi€¯ñ²Ë …ø.nI[lÍ"^Àæ=ï†d B”Ø›ßg8Å±Ü ¥6±(ÊÅzIâ-ç“78a °“Xá¬I(~ê lð¨ÑŽÞ*"jCÝ,¨²™ø&ÒÁ®5©Oûé£Í~´$¬°,.$d"…>h Ð"#óƒÈÿ1'\Cƒî8ÊoåqSGôˆ´w¤é†jpÖ´61¥2DÉÙrT†½¤GH_Íþy¾ô9a}¶\å/[)1„@ éÁDd„iJ G:ZÄò$Rvs[¦4 —á%0‰‰L‹2 8 ™Ñ,âç—FW1„àIO¢R 6˜„AÝÌ.‹ØAçvDrŽ.ŸhêgJÊà åØ NÍ=÷4\‘Ž>² 75j­«`+VG §œªÏô;’øAÑ~0ÀƒmÔ¥õèG_úHd0äLu:,pÊt§?ª{ÚvÕ¨G…×Pƒ…T¦65©éVŠêTªVuYJ•*H­ºU® «ÏÒjWÅ:ÖU}55aO¿þ…€)¤¥d…«QÍš- Ñ3›IÈBJ–þѸöÕ¥sÝZ‰Å“0hFÌ J.ïʳ…À@i~…¬7;U—åÇ/ :ìØ*â5°ILm‘­d¡Õ³Vdœ¢“é(7Æ2! s(ƒI`—EÚ)ävë ã‡[Ò©–oÿCHïB;Ü;N•0 )ð¾å!§Eɬ{ô—þ}o{¨«®ÿ`R’}‘¸ßM q #Æp0¹‘\èòD“äð/«AI(Ã`z¼÷mšxÒÅ)n‰ô©mpóÎÝT±TD¯èß,ææ:ø…ðÒôÛòzÐ?„ÏBÒ«IÄê‡?I¸OJ<,ɻЇIŠpŠã5á$h¹Ê}ŸP4Mþ±È!Õ¬&}®ÉKÙ( ;î%+Q¤EnªØÈD-ikÚM|Éæüš '5¥¤Mo‚¨Ä$**»n¹OçÔç 1zd2£‹ÅiAE#Ò¦¼µÌoÆc’IË)NМõ á3Ó åž Ú3ÚÐà-ô¡Mh9G•²‹†tWiJ‹uÒ•ÆtU/½fݵ­•EŠ›3=êÑl4v%^5æÏ£ì•Ô¯©A½Â– ± Qlª;ë£8Ö¿öŒ¬·hY`–½<áìZomë£|ØÏÎ ‹O›8ɸiíkc \ÚÖnq ¹mîJ7¹ßzÒf°(ÂÆmm4þ” ÐÀd\mz/¬Ñ1å’‹“»\ðqWHÏýM2]îíÏ{Ú…Ÿ¿Ã¦/–¸d»2¡‰MP…ÀzW¼),–D…ÍëÂÐ'½xBÚ¾¼w¾çínr³˜$”0‘™Ler¢A‹×œY÷ö(—ø+F4Ø8æ0$ ß$ØŠkrNÏ.‘å4‡‰Ñ™ÎÈ&£f›W48×3®äIذ­éâM~øÂ´Ä×€ {v)ÈØ¢´zÜ…Âb}ØG2¦&yk\‘ᘼS,ïÌîÚK!D2’2“´$CYî› …'9Ê"¡²rå)g™>]ÎÓDIf4þ0¡;T¢H¿#8Ê:&ƒ|ì2é4‡†ÍL1iRHÅw@Ê^ög®óóœ¬ZÝÊ÷ÇG6Ö×R?ZYÅB~ôg¯|z Vú×—–°±¿ý^iŸûߟ•÷Á?þT‰¿³ÃäRÔêi1¤÷ä§·ù•­Hm*ÕDÁš\ ÿzË9l€™vZº[Ó, È5üCˆ]cˆÇâ¿_ó?‰y¥«Éš䚋롻2±µi@h“6Ä1(ߺ6¿Á!ñ j›ÚY7ÊIÌ)ÁFÒ-Ü©6TË® |6º{1~󥿒çIò¡ñií€éz¸“ž!¼®îéŸ~c-¢8„5ŒÓþ8 B¹ á«„H! H¹“ã8“èB½ˆ/“ÃÂ1ì®)¤BRc±Ã"¥[ d5™8LˆI:Ùa$¢3°ÛC;¬ˆkÃ*¤¾†Ñº+L¶Ë?ª?A|!®“F$0²CN¢D-:±B4D%«Š¨;²¼³Žª‰¥ $°Zú[ÊQ$°ÀÛ¥ S¼úr+‚? 4mÇÐxÀp$GL9D–±¾rTÇ`;G¨IÇu„ÇhkG¸yÇx´G{óÄÒºÇ}ÜŒqìŒõþKµO›F~tÃyžzÌŽûŠüÓ«e$È‚ÌGºJŠ ‰ P p‡I,Óµžñµ‡ìĈ|´GÌ XÐ?p"f‹¼ Lµ ÉÌGqòÀÔ"·k-ð‚àZÖ¹6ÕÖÉÈoCˆp›ÁrC£|ÉQÓÁ}c®øá0°û°ù©Ÿû‘©´ŸŒÀ®ƒƒÂúbä¬Fƒl D”D—;6‹â‰Z8´ü 3¡44¡9¡9¯¬´7 £8äCf{7„(£3ºË…ØK4òC£;0“ËzF¹44+”ÄLd6-x„ $K¤܈ÌK*$ÃD'ÒDCLH[J»ó%¼s‘¿›10I”l¦þgBh"ÅÔ„&\ò1Á MÂ#2ìÌCÃEÊÓE}ê<Ù‹ÄÈ…X¨†Ê²áô‹Ò¬“z =|Z½}³ÛŒ4gìŽhTŠ„ÎA³Fá»ÎÛäFoÜÎÎôÇïŒÇðÏu$Ïò,ÇóDÏpTÏõÔÆöü €DÀ$È÷sOü‚ÏÎPÈÁRµ†ÜÂû$® À•<Š\ÈôHÛÐáP÷ •|ŠdÃÀŠp¶½¯D­¢´I ðÒÔÉŸäÉ2@>ø€Á!¯ä ¡´Ý7, œ7 ý®ÏÅ„‹B}A‚9à‰°Jª€6ž+ò¹‚VØÊ&4¸'ìA§„KÍþP°4¢ñKú"°8X{QKH!/9·$ ’k$4l9,•¸”ÒТK)â¹¾´‹@@$п„S DKCºÿr°Ã\S¸RÌòê:k2à„Aª$Ë<¶õp"K<$³ÓÌÜØÄ@uP*Õ£ãbÊÁk¥«ˆ!x‰p¦×lTNEXĦÙl¥Ú´ÔKÈ%[ˆE˜¼Ê½ËãE‰ 4N‡*ÕZÝEc=btN‡lÕ¾’N ¡Î¤°Îb%«ìÄFfeOL=¥”h¾o„V[ÌÏkå¾lÕVìãÖn•¾oWäWK‘Ï¥Ïö[ÖqM˜r¥”ý„˜þL‚ýcW “ÖpBÈ:$P þ¥åOüÈz ž{õ©óKˆ=,paÉùtIØW•É í­šÌ"ÑÉØÉŒÌ1QUQ}QL€(ÞðI ì-P8uQ¢œXk›Ñ£¬Q‡mW‚%*MÍ$|§ýQ„R“ R10R$UÒ'å®ì2 ã ‘¿I‚¡eø>Ÿ-8êÒJ¥ÝQ‰éJœ}*ˆKB=Ó,œ-­™.ýÒ2[5”/“`¡›Mµü€ÂC "Ó¶]Û·äZ5õÚ¯É#ÂÃ<%09¥Ó‰°ÓLšÁåS“H¢/J‚ã”ÜÀÜÓ£³KH .@íÛrT ›Ô9ÔD…ÌEÌþsTŸ±„xÛѕ̉˜Û” DH%̼ãÌÍu1ÂóÔ…UQUMÖ4]SÕ¥T€Ut€õÕÕœˆ+ Zâř،EèeUÜ]1]ªXÕÝ”29ÁU]e¨ãìUaõ²‘…‚5ƒÖØU1Ñ‚"Xƒ—õU}Væ´UeüOëå\ìÍ*Ÿ¨=)1P£HÖP³Oü=g¾(ù_¶ªît>ÿU`WýÛnCw•``£à †IOI &WýýDæ¿ á[ô`}áñáþJ°Ua.a‰lám}aXáíKáÆÍÞ`®ºæaAóa•Ë Þ¾!À‡4â~³%fþb2sâ'6²(–â£â*æ3ÎW,æ@-æâßóâ/†¼+žŠsåÏOÃŒucJ!㨀W̫̠×5V•r›§D WLµ X:.¿0ÎŒ;æ×¢ Ð–œÈB~ ä@fᣘ¶¤Ø£ÌXnë¹Ú*Š˜…Q­A4ꉔåÉçè¶©ÛFžù ŦT¸…Ú ›.¢¸Z¦ÕÚúê‰V»WîZSAÎdE$ËeëR±KI ¸[3ýe- Š`άÉe]®ù \?õK3’Cü©(¡ ÜÅ%̾üÈ5]ÞÑ\g¾^&Š­[ÆDÒE\"ž»œJ]tþ™Ê,Ý K‰JçSþ&ç¡Heè­¦å^¿cç\ÙtÅu®–¦¿ëÝmbÐ{–ù“Õ\DFÞôÞõÅ<ÏCŠùèÒ3ŒÓÎðåÕ[íM$V‡žìß ¸¥È=¨Pc“¦ÿ ¾g…é#›0ãÀi4ªVÏÈ霮i;jãŸ^à|êf$jÄäÏÉ*#pê§†ê¨–ê©¦êª¶ê«Æê¬Öê­æê®öê¯ë°ë®&ë³Fë´Vëµfë¶vkµ.îé¹¦ëº¶ë»Æë¼Öë½æë¾öë¿ìÀl0Á6ìÃFìÄVìÅfìÆîë~ÕÈ–ìɦìʶìËÎ  ÌöìÏíþÐíÑ&íÒ6íÓFíÔ„LÈAHí×†íØ–íÙ¦íÚ¶íÛöDHÐ=€Üöíßîàîá&nàFh D(îævîç†îè–îèN)À )H€éÖîíæîîöîïŽ*Eè¬ðEïóFïôVïõþíH !À ! H`ïú¶ïûÆïü&­8­8Ðïð'pö¦@Ð @ „gðwðÿí Њ €ð ×ð çpË~€ àŠ4x€'ñ7ñ?/x„*àŠ*x„/@ñ—ñwpF Lp×ñL  ñò Wo!pƒ"€38ƒ(þr7€o!wò'‡òè–Í–(·ò+Çòßžr¨ò,÷ò/sÒÞò.ó27ó3ÏÇ1Gó5gó6Ï5wó8—s7‡ó9·ó;ÿò:Çó=çs!×ó>ô@7ñ?ôB7t'ôCWôEÇïDgôG‡tðvôH§ôJ‡îI·ôL×t-§òM÷ôOçt.õQp`SGõTWõUgõVwõW‡õX—õY§uW? €C¨õ]çõ^÷õ_ßuRgs U0öcGödWöegöfwög‡öh—öi§öj·ökÇöl×öda_sbƒp÷q'÷r7÷sG÷tW÷ug÷vwwu€w—÷yþ§÷z·ww¯ðv4÷{÷÷ø€O÷xø‚7øƒW÷|ß÷3ïw„wø‡?w‚w‰owЇø‹ÇxyWø…/ó†Ïø/x‹‘‡w7ù“/÷çx0÷x”wyyy‚÷UøÉPȃp7VÀQX‚p:,p‚÷& O€‚Rœ×yžù§×x}_y–'y¨·úrùpŸH„+wIÐ3`°ùP`„ ‚>wCxFȃ#X…°û²¿ú»Gw•Ÿú,oy¼÷ûž.÷„p…T`‚‰Ÿ„pO,wTð€pQ |Ã÷ûÊ'w½ßû+ï{Ë·úþ¬BÙwB( Kðù‰÷@ýÒ?}ί|ÌÏü(ß|ØyÏ'ƒ1ȃ&ÈŠo‚-ü‘Wý0@F8÷ß~Û¿zÙŸý'¯}å?yÏ{3`U ø#H3þÔw‚O…WÈ~P…pÇ~íO~èzæo~!~ôÿxÏ·°ƒÂ'x@,hà~îo‚T@™ˆ-a¨@€¥•‰ 2lèð!Ĉ'R¬8°€K7rìèñ#È"G’,iò$Ê”*W²léò%L“X¬ió&Μ:wòìéóçDŒ1‡-jô(Ò¤J—®œ ô)Ô¨R§R­ZQ(Ó¬Z·ríþêõkG§VÇ’-köìT¬`ײmëö-W±hçÒ­k­Z¸z÷òíëWã¦.lø0âÄŠ3nìø1äÈ’'S®lù²áXÿrîìùsÑ F“.mú4êÔªW³níú5ìØ²gÓ®mûvjкwóîÍQîÝà‡·˜×7òäÊ×/îü9ôºÇ—S¯nhóè ijïîçôëâÇ“™ý{îè׳o¾<üø×Ï£U_Ñ~ûüèßËïïŸ7}gá7Ñ€úÿ)¸`_À™Ð ¢,1}Ü`ÈP°b…jÈaf€ðÇ €@’˜6PTxE)# d+PüaHþê8\‚ úø#XÀI¢‰LXAáB¾Â¯PAá’M>Æ)Q¾r …x0¤B†¼ÂHG¬2P!Væ¸#šÒm$›m~œ(©l©P…¦0P d؉§žaqgyR8 ¡âÁ@@ˆ2Пxž™&¤fõè&¥•Â!¡@A†%\r @"%‚…¡†1ê@X˜ŠjzMª+†¡ª¨FzkU“Zº+¯2 ØÄ’¤jê$*hzÇöÙh }Ö©Œ4Äl ¶âz-Tºöº-·¿ÙwD f;PTŒÀvÂd'X¦·.íT%“WzÆ€†‘Ê+áʠʼð¾b-þ¶÷¤m· ó \A%¨Òa¡‡v˜¡Å§ŽX¢©öwM¤‚Šsb7l0Ëà­©0Ì0Q+·|ósǼó3CT3ÎA·§3ÏEÿçóC@ ½´wDý4|H3=ušNC}õ|6S½u~VcýµrRs=6{^ƒ}6€Z“½vtf£ý¶g¢á67ÝuÛ}7Þyë-Ü}f >8á…~8âiæ7ãÕ‰Í6ä9¿Ü8åi;WI,6qWj¯íy’dÅR‰CnW~ºW¿š´N#ühMÜõ¡Iä¾zU)üaêB¦£þ{VªÇ~&xÜÄ( Îu{p̧þi¡‹ îM<öz oûMª`rü½õè¼ó=FGXŸ=û{mo!¢`á 4•V“'°‡ñ`„†Ñâ‹b„¤û%-~óÿ$t±QÄBÒC‘ŠÒc@úŠPHX!AOØj¸ÀŒ]cʃŸü(¨  E’@ÿ`‚€ Œd´?)0|çó@Ÿzw½ö1už³P(1*ôáS7¡Õ@†T¤#…ÁK`“i–Ä%61 R4”ê5¥Ô¼êYÐ…¶ÈÄB™¡uCúà*ÄÂ#¨(ð ÄJtVã˨Æ.ÎÁ‰¨øE*þ`±b˜ÆäE"Ñ‡Ò ÃHÅß±“M9"…&!*M:Ð&P Cœæ4C%jQÏ{åÏDy*M¦2IÊ^ ÊQ6žØƒ'€°ËS@–¬À-“ŧíS“ °P)§$5s•°SÔ@jI³‡dr}žüæVÞw¯Rz. ÉÔ¦:5+Y•ògÒC'§JÅKî•ÑUãtÈ).„;3®Š”ýÜÎ;_²Ñ žê|V¬hPw:ˆÞ'D•"NX¾²QŬhF  5ß%ÿ7.e6‹B¨i‹uOÜ DC’ìÎWÑd"s™ yƇ&äÁ>]iGòSÖ9$þ}(R‹2Q3$_6ÁDæ.qE“_þXECºÒ©Žð’—EÊu®t­ÔS4ÁÔ†-´"T2U»ÜåÕ¸–QzRd„*¸ÃÕh>˪fø—TÃ5Òæ(ßÛ䓪X–,õYMñº4 !,YÉNÖÎt1¤Ü©ìÃJÈ@‹¤ b¢˜XYaI“ø/ (EÍX±Ͷ®¯²ì§ÏIJ±½,ÉLFÙÞ>LµTˆvwÔÅ2÷“—‹êN^Q\ðéGih]éÛÜíŽd{8+]¬[0Nr¢ry NÐKð.¤,#oy¿éÝÚÑw.ðo'ç[ßý’å¾þø%¢~ù+à´h÷¿ø ð€ ÿ8{V0„wÂàÏ»jc/Or„9Í „sþ‰"ÈRá`7*¦0ê,Ìáæ9Äuú»¹h·âžô! YœŠçtÇ»ÅÍU1.‰ºÍ›Îx!Å£nò¨Û((/|é… õLÜc/Èô2CµJ ‡xº Ãð€À‹a ª/[S¦rRÓ„Sˆ † ]C.­¹Íoþí+ãü‡ühž[¸gò†6ˆ9 Ý?¹(‡ŒÞCô<çWÒÈF8šÑÆLô3v2:€:tÈ ÓiÚB‡F™¥ÕãP3£ÙÀÀ©Ä+<S ¤‡þL$—`-kZã™;¶F$#I,Ú׆v)ÉHGΊw‹|ä—"yã‡üׯ…$ PàV·©(嚃?|ˆI¬”ÅßícC†YáZ> Ï?þp¶RÉ´ÀÍì9Ûë—2V°ì ªL›Jü'_ºÈ‚{2‡x¿ŠíµôÌ~õ¯P¹íî=s=XšlOH—NÈ€'D„²Néðà˜EXC˜Â$ Â+ˆÛŽX j T^bR Cþ¤‚$üì˜TœT˜ ª †`šM Ö D€  >ÍÚ fWÎ`áÿý 8í !áÎáò`*¡Ì|˜Gù„†AŒ…‡eÙ“A…甘У22›E\ã¶e›êÍ ëq "/ö }ÝÑ1ÀY\1ÍÓ)YÜĹ5RÓ<=S4¹#ÁáÃÑ›£øcI »é"9–#áÙÏ­œÐݪ£Ì©œÌiJ<Ñœþܧµ!ßÙD”D”–IDB–RÓ“ÉÍÒÓ£A²Õ™ÝÃýcݹ¤ÆÝÙ±HWIÏÚ-ÄPåÝÒiaÙOÕäˆI„Lfݱ´d@þJ¦$ö ‘d^ÀãS£“qÇé…Áì=‹çU…ÞUMÛ!¾RU^åGŽXUv£ºQI8NÏa¤R.¥}_&¦Z\Ö¢Â%AÜ×öaýÅøí¤ûe¤]ÖŸL1Ä_*„]r‡þýAú­‰€€©$ ¾WA¶¥²áT`tM×Y, N4 Dx![RfŠYf2f }í¢húF â„ ¦`jNæjMk–&ªfm*Èmâ&„éænúGoúf‚gpÊÇLÔr.'s6§s>'tF§tN'uV§u^'vf§vn'wv§w6§)ÐæqFáÞ”§yž'z¦§zÂÆx¶§{¾'|Ƨ|Î'}Ö§}Þ'~æ§~î'ö§þ'€¨€(¨h';python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_13.gif000066400000000000000000000204021343257752000273310ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÄ¢¤$"$lfdŒjdÄ‚„lRL´bdĺ´´’„T><<2, ôâä\NL”vlÄ–ŒÔ¦””"$D:4\F<¬RTܲ´Œ24äÚÜ„zt$Œ|b\lZ\¤~tÄšŒÔªœÜº¼¤–”4&$¼rtüòôœ~t„j\ Œnd¼šœŒ><¤‚tTJL¤BD„´Ž|¼’„D2,œvtL:4|^TÌžŒTB<ôÊÌ´jldNDdJD¬Z\üÒÔ„f\tZTܪœì¾¼œnl¤ŠŒ¤JL,"ôêìÔ¢¤”*,\JL䲤œ24ìÞÜ,|f\亼<.,üúü”rl„ ÄŠŒL>4ÌšœTF<üÎÌ¬ŽŒ<24”vtÔ¦œD:<\FD$|bdœ~|„jd´Ž„L:<Ìž”TBDdNLtZ\,"$|fdL>)JSªÔ<F³©´£mž…xeðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àu„ÇLµL=ãG—W#”Õ¥c“lŽÇ¦°HÍ’1kXŪÓz=hi›ÙD)—½ŽR“%Ûhú¼m®–(3 JVA®vr-%+»)¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J—Ãí®¿Þî=|b°ƒ_p l’WŸŽ‘¡úL ‡=õ¥rP–<kMøF¾y‰êa.q Àà` íä/8ýk#¦±†ÙÁ%ó‚`$x›~á„™øþ@ÇA%"všeDóÞÅnô‹1$µ_ ÷åD=ØQaÑÔ¥Ç`1¦vÝ"`Æ Í¾ø*™ïL¥TûÎ*{Gí›kRì—?ô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿x¢`1†/¥œ[À 9©crþÚÚH%³«/; Î_^pØÝ*¸œ ÎKê–…Ë­F€,Óà8èóþ…ÀdÕ×\ì€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥ÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÇà•æÖ4#»–fKiò þem»˜/Dó–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó)ì"ëSë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínSxƒLP‚cÈІ ¹Eê)0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–ËU ÔÓÊsöñ$¯ïyIm SËí©U»]JkOU;ñ¨î kyl“×ÕÖZr4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'r6Æo€~%ð @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V$À­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢~€`ÆàþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋw@ œ E0b6˜0Xuóocu[d'#C0zÁ V žÐetæ…±·øIm—Wsç {x'x¦3<ã3ÊcþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹#CRð]VzÙÖ‚H¸¬ÇC®‡YPYuq ‹h}tØ|~1{®Lœp VP‚¿—A¸W[¼uÔTž`ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†S@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçi8kˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhhlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œ8žè-é~¤h’d©hC«x­˜›ù%ÑÇta‹eOG™¾8Œ¹·{µ¦š­á-pC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3irPi7°yžÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú¡”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-BœöD^Ù•Öj½ PkýÖÙ¥~ €t]×v}×x×z½×|Ý×~×P:ðׄ]؆}Ø{ÝCmPš°Øí'P‹ ZÙ˜ @PÙ M•P i@ t° ¡Ú0¡ 5À¤ ¥P ª=Û+ᘠO n@Û¼m+À§0K ½]Ü"\°™ð ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þ± ¡ðê½ÞiP¥mÞðŒô™ \PßKßü½5PŽÐßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÍ5žã:N׊Ý×@¾* LäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!S¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôBÑ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI!À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%I<á9f6³VH&IÎð TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9I¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?œØƒ¨.*Rƒº*V5uK ǸÉ9.5HBO%W9‰Fkd5YQµ¦ŠÀ¡•PªÕ‰'d Q…Ú ¸p R`BX}2ñ R@ dkΖðURh•«i…YU¯*’©Âf©xêH˜Êþ»žl› I%B†¾z¬ 5xDI@‡Âv¬ ‘¸IN ±ÆNŒ  Df5«‚(¢²cDK…R”¢ £ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN—º“ Dvµ»]îv×»Ýåbð]ò–·»ˆP-NÕ˪¤—D€o|å;_úÖ×¾÷Åo~‰ Œö~ïÕo€<`ýò×½ð}LàÇwÄ Åä  T8¿ö/€ß xÃXÈÅ0Tñƒ˜AÆ/†+û_+¾xÁ+^1þ<ÀÅC.lA„<Á7 µ°/ŒeLc£!cÈ‚*àËŠ8ÐB½D|UÜXóØÅDÆ1°€…c¾žh°†Ç×°o–·Üeó⃈ƒ+à;‡cvæÌÜ¿5zÚÕ¾v  è_gyØ%êu¸W\îò¤{ÝQ|wræ]ïæ{4ýþw>™ƒ'¼ËýKö±«¼°æ…|ä%?yî¢÷º—Ç|æ5¿yÎwÞóŸ}è%;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_14.gif000066400000000000000000000205721343257752000273420ustar00rootroot00000000000000GIF89aËí甆„LB<ôÆÄŒBDlÄ¢¤$"$ŒjdÄ‚„lfd´bdĺ´´’„lRLT><<2, Ä–Œôæä”vldNDÔ¦””"$\F<¬RT„ztD:4Œ24¤–”äÚÜ|b\ܲ´$ÄšŒŒ4&$¤~tÔªœ„j\¤‚tŒnd¼rt¼šœlZ\œ~tܺ¼ üöôŒ><ÌžŒTJL¤BD„´Ž|¼’„D2,œvt¤ŠŒœnlTB<üÎÌ̪¬´jldJD¬Z\L:4ìÞÜ„f\4.,ܪœ”rl|^Tì¾¼¤JLÌ¢”,"ôîìdRTÔ¢¤”*,\JLœ24|f\,„jlŒrttZT亼̚œ„ ÄŠŒTF< üÊÌ´’”lVL<64Ì’””z|dRL\JDìÖÔ䲤$ÄžœŒ4*$Ôª¬¬†|Œrd¼z| üþüœ:<¼–„D6,œzl¬ŠŒ¼jd´^TL>4¬NDÌ¢¤œfd¬žœôâäüòôœ‚„t$¤‚„<.,ôÊÌľ¼ôêìüúüüÒÔ,&$t^TìÚÜĆ„´fd”&$¬VTŒ64ܶ´ÄžŒŒ¼vt¼žœÜ¾¼  ¤FD„´nl¬^\Ü®œ¤NLÔ¦¤”.,œ64„nl侼̞œ„ ÄŽŒ´–”Ì–”Ô®¬œ><¬ŽŒÌ¦¤<24”vtdNLÔ¦œ\FDD:<|bd$„jdŒnlœ~|Ìž”´Ž„TBD,"$|fdtZ\TFDlVT4*,¼–ŒD64œztL><ÿÿþ!ùÍ,ËíþëH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -©A€Ñ£H“*]Ê´©Ó§P£JJµªU@!µ«×¯`ÊK¶¬Ù³hÓª]«@‡¬DÖÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwh¡¦Ê›7c®{YqdŽ“G÷-­ZîcQ¿l½Ý:sãÓS¯µ…T''Ö¤Q1WEšÝdHÁø —·oகС“FԚЮå"©!B$®QþŠT‡ÜO"‘B`·´…0r“¡cƒ“óé×7ïý;øu»ÃW]rËí÷œHGuØý·ÆvÝ}ÞxåÍ…›Fº}€ˆ<`ËnoP°oX·Å†T —†zè"3Ì€ÈÙY(ˆ`‚ "d¸¦Œ'l1Û´P€„`´×Ü/ #×) aAÈUä‘I®Áb‡:H—(!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”±‘Œ\NÂ')rß!˜G—žºf(:ÔX#)‹6zÝ/rߤñYf¡ub(]@!W¦›Ê…è}ºÚc}z_¡þušêu‘:ê ¤r1ê¥kXjgak„±ê\dÀœ\‘€G—°  ,‘ØúX²ÚEëæcÀ(CG&(É'ŽrÝ€H'¢­‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFºí"‚] @‘È+]þ¶Wëµ£.œï—.Dà­\·\ªƒ ˆbAi¢D,W¤ÝðÀ<ÈtàpÊ ç*éî݉eÞ! }ôŠEk,óx hfÍ7ç|1BÐãtÜaãpî¸4Ì}àÐ1-O_æ%ÈAGñXÕW¯ˆˆÍ8ÛZéÎ=ÿt™f£m4HÏ ´\M?µþœ Ç ¬(F° y¬á/s}àrPtr,à‚¤¡ì0<öBt'„²0'±K$Pf½?ÊåÂ.dú˜è¤§Ð\àƒ~ݰ‡'îƒ(d4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…xuðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹à…„ÇLµL=ãG—W#”Õ¥c“lŽÇÖ°HÍ’1kXŪÓz=hi[ÙD)—½ŽR“"Ûhú¼m®–(3 JVA®vr-%+»5¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J·Ãí®¿Þî=|Àƒ_rðl’WŸŽ‘¡úN@‡=õåtP–<kMøF¾y‰êaä  Àä íä/8ýk#¦±†!‚£f$x›~…™øþ@ÇA%"všeDóÞ…nôK2$µ_ ÷åD3ØQaÑÔ¥Ç`1¦vÝ"` ;ø*™ïŒ¥TûÎ*{Gí›kRì—Hô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿¢`I†/¥œ[À 9©crþÚÚH%³«/D Î_TpØÝ*¸œ Î ꆈË­F€,Óà8èóþ…ÀdÕ×\ð€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥|DÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÊà•æÖ4#»–fKiò þem»˜/Dó–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó5ü"ëkë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínkxÃN eÈІ ¹Eê50zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–ËU ÔƒÊsöñ$¯ïyI SËí©U»]JkOU;ñ¨î kyl“×ÕÖZ‚4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'r¶Æo€~"@ @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V&À­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢Ž€`ÉþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋy° ¢À F0b6˜0Xuóocu[d'#C0z! X€¤Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹CR]VzÙÖ‚H¸¬ÇC®‡ˆPYu¡ ‹h}tØ|~1{®L¢À XP‚¿—A¸W[¼uÔT¤pºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†k@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçi¸kˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhxlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œ¸žè-é~¤h’d©hC«x­˜›ù%ÑÇta‹uOG™¾8Œ¹·{µ¦š­(pC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3itPi8°y¤ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú‘”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B¢°öD^Ù•Öj½#PkýÖÙ¥~ Ðt]×v}×x×z½×|Ý×~×`;ðׄ]؆}Ø{íCn` °Øí/`“ ŒÙ˜ `‚`—Ù M1° fPv ¡Ú0ñ 60uà «ª=Û+Q ž ‹ð p@Û¼mƒàª0L½]Ü"1^01ŸÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þ ¦Ðê½Þf`¥mÞð@ôMŸð ^PßLßü½6`•Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÍ5žã:N׊Ý×@¾*#0MäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!k¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB_Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI!À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%IHá9f6³V H&IÊ‚ TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9ë Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?¢àƒ¨.*Rƒº*V5uK ǸÉ9N6èAO%W9‰Fkd6YQµö Ìa1PªÕ*á‰E|Q…Ú ¼ Š:x"X}Ú>…:LÁ dkΘðÕ:h•«i…YU¯*’©Âf®xêH˜:þ»ž ¡ I H`†¾z¬6¸DI`‡Âvì ™¸I^ ±ÆNÌ ”ÐDf5»H¢²›€Dk…U¬Â £ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN—º% Dvµ»]îv×»ßo ¼à„×¼ç=¯"è‡Sö¶7O4X¯1_úÖ×¾÷Åo~õk_ì׿ÿů1à‹<ÈÀF0~û›`ßWÀñï‚ë+áS˜ÂÞï…ÌàØÀÖ°-|ßÓ·Äp‡yW` ów¾bh-hÑþ1Ì—ÈC0|ш<µxÂ>C0€ˆW´X¤¨ƒ<ä"7Æ2¦q#ØÐäCÌ÷lP²‰L_·ŽÅ<&ñ|‰¡ .pAĘ/)b!.HÁÇ`v1…q‰da-Æá9×ùÎs™Ï܈cœ¡\€Áq†cÈ™Îvæò€Wüa?ÍwÊVÆr#‚Q .üØÄaæq*曈0™²0±¨AjK7ùʃ1Ñ ZìØ{€ªY=ß.ŸîË žo1êR7B ZñæHÔ˜¾‰XðˆyÌ]xºÅÂ&v#ŒF8b ˆÐ´¢¥Ýˆ^‡î× ¾t#^MßþŒoÆêk€]¼9Ú\`ƒ>½ït¯[z8B#Ž0eØ;Ò†³§mf47¢ ¯ƒ»çK‹&/ÚmÀ6á}'ÎýåÂPap@“™áóí’Q Rt|Üå¶Ü¹ãœˆÏxØàÁ€ ÌW tXðŒNtU&ù‚S1Œ,x|Á4‡òÍ€%4b €ÉÉ-i/Å_{Øîa±—Ýì †¹â¾|v¶·Ý¾i?ÜÚÝ>÷³Ãpr§{ÞÁn÷À¹×ï8 Æz™Q ÂÞð‡G|â¿xÆ7ÞñgC.®wÊ£˜ï~Ã{å5Ÿb®ûÚ뛽/¿·Ì‡uÞôõ½ÞJúÓ§þn«g}è]o·¿×ž 'ðà¿{Þ÷Þ÷¼üäcûÙÏ öÃ×|ñåv|äS^ùoc~óóþ|·E_ús§þÚ¬ý¶g_m¶¿ç::ô–ßüçGú¡Þë¶ßýï‡üå?ú×ßþ÷wW@;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_15.gif000066400000000000000000000211711343257752000273370ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÌ¢”$"$lfdŒjdÄ‚„lRL´bd´’„ĺ´T>< <2,ôâäŒvtÄ–ŒdND\F<”"$¬RTÔªœ„ztܲ´D:4Œ24¤–”äÚÜ|b\$œvtÄšŒŒlZ\ܺ¼|jl¤‚t4&$¼rtüòô TJLŒnd¼šœŒ><ÌžŒTB<¤BD„Ô¦”´Ž|¼’„D2,œ~t|^T¤ŠŒôÊÌ´jldJD¬Z\ܪœL:4üÒÔtZTì¾¼„j\œnl¤JL,"ôêì”vldRT\JL”*,䲤œ24ìÞÜ„f\,亼<.,üúü”rlÌšœTF<„ Ô¢¤ÄŠŒt^T„jl lVL´’”<64Ì’”dRL\JDÔª¬ìÖÔ|f\$œzlÄžœŒ¬†|4*$¼z| Œrtœ:<¼–„D6,¤~t¬ŠŒüÊ̼jd´^TL>4¬ND,&$œfd¬žœœ‚„ôÆÄ̦¤”z|ä¶´t$¤‚„ľ¼ìÚÜĆ„´fdôæä”&$¬VTܶ´Œ64ÄžŒŒܾ¼¼vtüöô  Œrd¤FD„´nl¬^\Ü®œ¤NLôîì”.,œ64ä¾¼üþüÌžœ„ Ô¦¤ÄŽŒ„nl´–”Ì–”Ô®¬œ><¬ŽŒüÎÌLBD<24dNL\FDD:<$Ìž”TBDÔ¦œ´Ž„œ~|tZ\„jd,"$”vtTFDt^\lVT|fdœzt4*,¼–ŒD64L><ÿÿþ!ùÌ,ËíþM H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -©A€Ñ£H“*]Ê´©Ó§P£JJµªU0µ«×¯`ÊK¶¬Ù³hÓª]«€‡¬C¤ÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwh¡¥Ê›7c®{YqdŽ“G÷-­ZîãO¹jÅÝ:sãÓSKùT$T¦¤ y1÷šÝcBµ!—·oà®yÌ™ƒæ“”Ð®å ©B!®þ„b¤‡ÜK…J`·´ 1r“ ™Ó‚ƒóé×7ïý;øu»ÃW]rËí÷œHGuØý'ÅvÝ}ÞxåÍ…›Fº€Å6Ã'c4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…x•ðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹à%„ÇLµL=ãG—W#”Õ¥c“lŽÇ¤°HÍ’1kXŪÓz=hi“ÙD)—½ŽR“#Ûhú¼m®–(3 JVA®vr-%+;)¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J×Ãí®¿Þî=|`¸ƒ_tl’WŸŽ‘¡ú20‡=õÅsP–<kMøF¾y‰êa4¡ Àè@ íä/8ýk#¦±†‚&ó‚e$x›~ù„™øþ@ÇA%"všeDóÞ%nôK2$µ_ ÷åD2ØQaÑÔ¥Ç`1¦vÝ"`Ä Í¾ø*™ïL¥TûÎ*{Gí›kRìFô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿„¢`I†/¥œ[À 9©crþÚÚH%³«/C Î_^pØÝ*¸œ ÎËꆅË­F€,Óà8èóþ…ÀdÕ×\î€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥ƒÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÊà•æÖ4#»–fKiò þem»˜/D³–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–s)ä"ëRë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínRˆC20eÈІ ¹Ej)0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë• ÔsÊsöñ$¯ïyI SËí©U»]JkOU;ñ¨î kyl“×ÕÖZb4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'r&Æq€~#0 6@Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]VxÀÄ­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢€`ÉÀþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋm€ Ÿ° U0b6˜0Xuóocu[d'#C0zñ Vp¡Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcNþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹CRN]VzÙÖ‚H¸¬ÇC®‡XPYu¡ ‹h}tØ|~1{®LŸ VP‚¿—A¸W[¼uÔT¡pºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†R@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçi(kˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh˜lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œ(žè-é~¤h’d©hC«x­˜›ù%ÑÇta‹uOG™¾8Œ¹·{µ¦š­ÑGpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3isPi8°y¡ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-BŸ°öD^Ù•Öj½$PkýÖÙ¥~àt]×v}×x×z½×|Ý×~×P"ðׄ]؆}Ø{ýCoP°Øí'PŽP YÙ˜ PP’Ù M˜€ f` uà ¡Ú0á 5ð¦Ð ¨€ ª=Û+ › MÀ i@Û¼m,Ч0I€½]Ü"á]ÀᜠÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þñ £°ê½ÞfP¥mÞðPô]œÀ ]PßIßü½5P‘Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÝ5žã:N׊Ý×@¾*$@JäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!R¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB_Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIÁ6üŽÄãîÐâ?)4°Å”tJA)*bƒ+Úˆ Â+ƒ9<#Q 8Ô2(2™ ÛŽLÐÄ’™ƒ°ÿXt1K’`T±ËŽÀ1#,RÐjL/ÒŒ.±ÔRK.Ï„3N9çdþ³M‹c.O=›;sO?Á›3Ð+ͳóN—E4QE=ª³Ðß\4RIû$ÔÑG4P+3¥³RKσ”Sò„ðCÔN?½óOUWeµUWõDäWg¥µV?=E58<àµW_6Xa‡%¶X^'©c—e¶Yf?È5Zi%ÃN‚˜6[m·u4Né‚nÇ%·\É’HBN¼0·]wÝU—]P’x·^{³Ý"\S¼mâ^ÿµ“†HDª¶€Fx8 jpe¤ ^I8b‰»R¥„,FÚ *&æ¸c‘Ha€¤,JøÂc“^¤KJrdŠ“_þW7L²¤5`ÆùÝ(.p¤gŸþ¨Aœ‡&÷‘MŽÞ„NÞ@ú¢Ÿ.·††ºjr¥¦Új­³Åzk¯¥íúk±- {l³µ,ûlµ L{m·ƒkûm¹¿Š{n»Sªûn½IÊ{ï½ûöûnÀŸ{pÂß6üðrwu¶q`¥îÀqÉ{…VñôlÅœ9DQ"óÌqµ¥PM´ÑÐEÇ”tIM?Ý$ËlX 12Q†Ì3ÝNÖ[ßòP„bÈ¡Û'TwÐy'îP¦¶b9˜'xšrˆ9Zà€Çeb„ 8^&;Àç—;_ !*€‚ ¬4úò_ɲÀÓpEe2“‚-·àÈR  ÁȹÃYþÀгd Â+žþ2Sþ ” Æ€œýý†~*y]lfSò‘å=RèÌgÆS09üËf4ӛܭè=8a(€2äœpEÇ£‚¶Ó"g1RPNžr,d¢yÃ+âð"H#„V#ªèÁ¢#ý‰"xÜó¼ÀŸ°RdTÂ)I‡BÉ  vÄCuèC! ÓÆE¶4»@„0‚!¨ñ/jc-ˆA Fñ‡]ô¢”ĤP8i--0$Ahd#Ia¸@(ªÉ0"GOE€Ð> À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%IBá9f6³VH&IÊ‚ TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9M¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?Ÿàƒ¨.*Rƒº*V5uK ǸÉ9.5@BO%W9‰Fkd5YQµæŠÈ˜PªÕ"±‰&p" Q… ºp SlX}š8! Sx¡ dkÎ’ðUSh•«i…YU¯*’©Âf­xêH˜úþ»žìž &J`†¾zŒ 5DIP‡Âvì •¸IN ±ÆNl ¸Df5»‚4¢²{ÄD;T â £ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN÷³Ànvµ»]îv×»ßox»Ð…„×¼çEozq2œ¶×½ïm• Ø›"Ô×¾÷Åo~õ»_þö׿ú€ÿ;`÷wò5è[`7ØÁù 0„Üß7øÀó­o…'¼aÓtெí+bsøÂ ^0‰K¼âûÆÂ`C,ö«bþ³ØÂö˜‚3œáBà‚Ápƒ Ø ,¸"Ãt˜ÅŠ¡‡ O`™z0Á,fa&áÃI^r}c\Ì¡ƒhò2ëKd¬°¯Š1‡Yx¸¾jf³›­ìäo¹Ë_®/ !†^ø"Ï{îóŽ­\ˆ^ÙÈD€s›+|â§8ÃËØÀ VÑYHBҴȰ2®pe„!ò¸Œ¡iN#Ó›ît}é  I Äøt¨ë» AA˰/ H­ŒëÕ¨UÍjWÚ¡€…®ð„ú"[Ù̶r†uaé0`ZÔËØô-ãŽé8ÚV.E}}€pÁbÈð¡]Á† þ¢¾lP7»­ïúcõ5B/Úm_IÌÂæž…$Þ­îû¾®¶»ë}o"仾½†¬ñû»ÜçøÁ·áokØãþ·¹ÑmeA !Ǹ•Q>ò$2'Ã%'1ôdì“‹;Â577°aÞòåÔ—º˜ÐL„Ÿ}èÀ®x}ÅPåqÛ—ÑÝvô·-hÐ[ê'ºÓ}py@àø­°ÎoëÏxÖ‘n_¯ï7dE‹áNõ¤›àNç6Ǽ½ö©wüÙ6µÔGêÀàïW¸Eà…¡ Wè! Øú­ñ»ŒDˆú𼮯1.Ïw",¾ñ¯/?w"ˆþ^¤ç|„mÄoÅtqݯ¬ä*‡=ÊSùì³L„X#Œø¦~fü’ÑkVô›‘/g ÷þ÷Á¯o dÀ úÓ¯>ìíƒ'°9 ŒÀ;Ç\cÿ’߯çgqpþ×7Øü!FüÏÿ‹RBÆ&ÂÓõ¾àñ?øýòÀÿ†P˜…'¹üË»‰ñ¶dÀ”?ýS@þsÀ ¤À ƒ@‰¯ ÔÀ÷êöZ†_ÁÁ$Á4ÁDÁTÁdÁLA6¸ñ«À¤AÿºÀˆYÀÔÁ¬¯L˜äÁ ¬@D Â#d@"<#DÂ&D?%&tÂ),1(üu— ÄÂ,l¦L°tÁ/Ã0Ã1 C”A*DCK@ ”À4tC³B‘Â7¤C[ClÃ:ÔCþŠÃ{™Ã=D<Ã@$DAL0-DÄDt•;L˜ôrÄG„ÄH”ÄIô®õ¢®KÄÄLÔÄMäÄNôÄOÅPÔ–€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_16.gif000066400000000000000000000210261343257752000273370ustar00rootroot00000000000000GIF89aËí甆„LB<ŒBDìÂÄlÄ¢¤$"$lfdŒjdÄ‚„lRL´bdĺ´´’„T>< <2,\NLôâäŒvtÄ–ŒÔ¦”\F<”"$¬RT„ztܲ´D:4Œ24äÚÜ|b\$œvt¤–”ŒlZ\ÄšŒÔªœÜº¼„j\4&$Œnd¼rt¼šœüòô ¤‚tTJL¼’„Œ>4,&$ìÚÜĆ„´fdôæä”&$¬VTܶ´Œ64ŒÄžŒÜ¾¼¼vtüöô  ¤FD„´nl¬^\Ü®œ¤NLôîìÔ¦¤”.,œ64ä¾¼„nlüþü„ ÄŽŒÌžœ´–”Ì–”Ô®¬œ><¬ŽŒüÎÌLBD<24Ô¦œ\FDD:<|bd$„jdŒnlTBD´Ž„œ~|Ìž”dNLtZ\,"$”vt|fdTFDt^\lVTœzt4*,¼–ŒD64L><ÿÿþ!ùÐ,ËíþU H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -©A€Ñ£H“*]Ê´©Ó§P£JJµªÕ@)µ«×¯`ÊK¶¬Ù³hÓª]«Àˆ¬E¬ÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwh¦Ê›7c®{YqdŽ“G÷-­ZîãP†ÍÝ:sãÓS[ …d''¬´Y1wE›ÝiF½ø —·oà®yرÓ&”•Юå&‚$®SþŒz¤B†\OJ`·´…3r›±ó‚šóé×7ïý;øu»ÃW]rËí÷œHGuØýgÅvÝ}ÞxåÍ…›Fº}Ð… <0ÌnsHa…sX‡Ä†!—†zèZ=ôÐÙY(W]`‚Ii¸æŒ ' 1›µH‘„ a´×œ0 0#×0$aAÈUä‘IZÁb‡:HW(!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”½ÑŒ\hŒÂç( ŒrŸ ˜G—žºf¨ 8ÔXã(‹6z0rŸ£ñYf¡qb(]@!W¦›Ê…¨}ºÚc}z_¡þušêu‘:ê ¤r1ê¥VXjgaVœ±ê\iÀœ\€G—°  lØúX²ÚEëæc¿8c{(É'ŽrÝÐ'¢Y‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFºíb‚]@È+]þ¶Wëµ£.œï—;@à­\·\ŠÃ „bAi¡D,W¤ÝðÀ<ÈtàpÊ ç*éî݉e⊠ŒôªÅV,óxf hfÍ7ç|]1FУvàa£pî¸4ÌŒÈÐq-O_†F*ÈGñXÕW¯Ø…Í8ÛZéÎ=ÿt™f£m4H÷ ´\M?µþœ Ç l(G¼ñˆpXA/s}@rPpr,à‚œ´¡ì/<öXCt7„²0/±Ë#Pf½™?ʵÃ.dú˜è¤ÃÐ\àƒ~ݰ‡'NC(i4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…xuðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹à•„ÇLµL=ãG—W#”Õ¥c“lŽÇ¬°HÍ’1kXŪÓz=hi³ÙD)—½ŽR“&Ûhú¼m®–(3 JVA®vr-%+;+¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\JWÃí®¿Þî=|fЃ_r`l’WŸŽ‘¡úN`‡=õvP–<kMøF¾y‰êaèà Àä` íä/8ýk#¦±†)³‚g$x›~ …™øþ@ÇA%"všeDóÞenôK3$µ_ ÷åD=ØQaÑÔ¥Ç`1¦vÝ"`Π;ø*™ï ¥TûÎ*{Gí›kRì—Gô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿Œ¢`i†/¥œ[À 9©crþÚÚH%³«/E Î_VpØÝ*¸œ ÎKêÖ…Ë­F€,Óà8èóþ…ÀdÕ×\ô€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥4CÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÎà•æÖ4#»–fKiò þem»˜/D³–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–s+#ëVë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínV˜N`gÈІ ¹Ej+0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë• Ô“Êsöñ$¯ïyIÝ SËí©U»]JkOU;ñ¨î kyl“×ÕÖZ‚4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rfÆs€~&P @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V{ð­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢€`ÍþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋp° ¡ð G0b6˜0Xuóocu[d'#C0z Zð£Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcRþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹sCRR]VzÙÖ‚H¸¬ÇC®‡]PYuá ‹h}tØ|~1{®L¡À ZP‚¿—A¸W[¼uÔT£pºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†V@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçihkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhxlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œhžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹uOG™¾8Œ¹·{µ¦š­ñ)pC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3ivPi2°y£ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9ÚÑ”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B¡àöD^Ù•Öj½"PkýÖÙ¥~ 0t]×v}×x×z½×|Ý×~×`!ðׄ]؆}Ø{íCq`Ÿ°Øí(`‘p _Ù˜ `•Ù M›° l  y ¡Ú0 6 ªð «° ª=Û+A Qà r@Û¼m. ­0L½]Ü"1bà1ž@ ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þ ¦@ê½Þl`¥mÞð’@ôMžà bPßLßü½6`”Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÝ5žã:N׊Ý×@¾*" MäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!V¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB/Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI(¶xq]üâMÁ¶p!€q†.À¿̩ï,¸° ; ƒ¦À@…Ld#aȸž/d#œáÉùU2“ åeÖbËõ%€™ÃÜä/ Êÿݱ›—éß7¡%¨E-JÐ2?¸ÇCû±-ì‹J‚ 8´}½àŒJ€ ɰ0-¶à_BÑhQ‚2pùÈ0ð»èF?:Ò“VF/ì› bÔŽ†´%Íeü`Ö²ž´ŽáŒ-lÁÇ85Šìã[õÂhm„bl ¾J†… ald+¿„— qŒFœá Éør³ŸmÿNÛ°Æ,Œ0‹]þLZÜF€¶´a¬'y×Ûo¨2,Þ`oÐÅN4—3œD$ûWÝOô!œa‡‚³x°À3êKðåXøàFx}@…‰ÓÛà0Ö/..rûžAÔFH¶ÅïûçœúÁ~ù}P‰ƒÜæoPfA€˜ç—/¨ïÌkn_0tÁ]pBÐi^ëûƹé÷Åw}õ½ì~W8Ñ0¯o-ªlc8}2hu#ŒB}¨2zn >(a•ÐĹîu°‹áÌ.„3ìÛõ¯‡}ÙN·y}wÝë_Så8sùßëë†'ÙÅxD#Ô0ö§Áx0ŒÑóøÂgØ…2Î<‹ÇGþ~òwÀ`_ÒC^ò÷8Ù‘g=ŸœÅ‡‡Y s¼{Þ÷À¸™î}?|âïø'~ñ•¿|ßdÉg~ô¥¯_ç{ úÓǾô«ß1øvßûÎ{ŸA ò—ßüçGúÕ¿~ö·ßýï‡üËÿ†\X=û÷×¾¿[¾`ü÷_ùÛç˜ëó¿ä1ýC<þ#À,@ûSÀ”0œtÀ 0”˜ïÃÀ œ•ðK°ñ“¿ÁÁl?úc@ DÁ 4ÀÜCÀtÁý²Àˆ‘À|ÁL˜¤Á´A„ÁÁ¤À<˜ôAB€ÑÀ#DÂ=YÁ—I¯&tÂ'„Â(”Âõ¢®*´Â+ÄÂ,ÔÂ-äÂ.ôÂ/$—€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_17.gif000066400000000000000000000204251343257752000273420ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÌ¢”$"$ŒjdlfdÄ‚„´bdlRL´’„T><ĺ´ ôâä<2,ŒvtÄ–ŒdND̪¬„zt”"$¤–”\F<äÚܬRT|b\D:4Œ24$œvtÄšŒ¤‚tŒܲ´|jl4&$Œnd¼rtlZ\üòôܺ¼ ¼šœŒ><ÌžŒTB<¤BD„Ô¦”´Ž|¼’„D2,ܪœüÒÔœ~t¤ŠŒœnlôÊÌ´jldJDäÞܬZ\L:4„j\”rl|^T¤JL,"ôêì”vldRTÔªœ”*,\JL„f\œ24,䲤<.,ŒrttZTüúü亼̚œTF<„ Ô¢¤ÄŠŒ¼–”„jl ”ŽŒlVL<64Ì’”dRL\JDìÖÔ|f\$œzlÄžœ¬†|Œ4*$Œrd¼z| œ:<¼–„D6,¤~t¬ŠŒüÊ̼jd´^TL>4¬ND,&$”z|œfd¬žœtjlœ‚„ôÆÄ̦¤´–”Ôª¬ä¶´t$¤‚„ìÞÜt^TìÚÜĆ„´fdôæä”&$¬VTŒ64ÄžŒŒܶ´¼vtüöôܾ¼  ¤FD„Ü®œ´nl¬^\¤NLôîì”.,œ64üþü侼̞œ„ Ô¦¤ÄŽŒ„nlÌ–”œ><¬ŽŒüÎÌÔ®¬LBD<24dNL\FDD:<$ŒnlÌž”TBDÔ¦œ´Ž„œ~|„jd,"$”vttZ\TFDlVT|fdœzt4*,¼–ŒD64L><ÿÿþ!ùÍ,ËíþO H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -yA€Ñ£H“*]Ê´©Ó§P£JJµªÕ,!µ«×¯`ÊK¶¬Ù³hÓª]«@†¬DªÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwh¥Ê›7c®{YqdŽ“G÷-­ZîãO»lÁÝ:sãÓSWù„e'Oª I17šÝdF¹è —·oà®Ì™ƒæS•Юåê¨B®‹þŒz„â†\JB`·t 1r•™ãƒóé×7ïý;øu»ÃW]rËí÷œHGuØýWÅvÝ}ÞxåÍ…›Fºu`…58`Ënp4QEpX‡Å†5T —†zèš1Ä`ÙY(VXb‰d¸¶ŒO`1[´4¡ƒ\´×Ü. $#—$èPÈUä‘IVÁb‡:H×'!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”­¡Œ\ŒÂç( Œr_ ˜G—žºfè 8ÔXã(‹6zÝ.r=_£HñYf¡qb(]5,!W¦›Ê…h}ºÚc}z_¡þušêu‘:ê ¤r1ê¥UXjgaUˆ±ê\dÀœ\€G—°  ¬ØúX²ÚEëæc¾,3w(É'ŽrÙ`'¢U‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFºå"‚] ,ÁÆÈ+]þ¶Wëµ£.œï—<@à­\½\ŠC 5|RCiŸD,W¤ÝðÀ<ÈtàpÊ ç*éî݉eÖñÉ |ôJ…U £x hfÍ7ç|1JÐcsÔacpî¸4Ì|ÜÐ1-O_f(ÈGñXÕW¯h…Í8ÛZéÎ=ÿt™f£m4HÇ ´\M?µþœ Ç ì'R¬ñlT!C0su rKpr,à‚Ýœ ¡l.<ö˜At„²0‘Ë#Pf½Ù?ÊÅC.dú˜è¤“Ð\àƒ~ݰ‡'.Ã'd4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…xõðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹à¥ƒÇLµL=ãG—W#”Õ¥c“lŽÇª°HÍ’1kXŪÓz=hi«ÙD)—½ŽR“"Ûhú¼m®–(3 JVA®vr-%+»*¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J÷Ãí®¿Þî=|°ƒ_rÐl’WŸŽ‘¡úž0‡=õ¥sP–<kMøF¾y‰êaâ° ÀäÀíä/8ýk#¦±†!B“f$x›~ù„™øþ@ÇA%"všeDóÞenô‹2$µ_ ÷åD1ØQaÑÔ¥Ç`1¦vÝ"`Ä Í¾ø*™ï ¥TûÎ*{Gí›kRì—Gô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿Œ¢`Q†/¥œ[À 9©crþÚÚH%³«/D Î_RpØÝ*¸œ Î êf…Ë­F€,Óà8èóþ…ÀdÕ×\ì€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥lDÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºËà•æÖ4#»–fKiò þem»˜/Ds–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó*ì"ëUë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínU€ž ‚eÈІ ¹Eê*0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë ÔSÊsöñ$¯ïyI­ SËí©U»]JkOU;ñ¨î kyl“×ÕÖZZ4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rVÆp€~"@ 5@Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]Vw°Ä­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢~€`ʰþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋl ŸÀ R0b6˜0Xuóocu[d'#C0zñ Tp£Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcMþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹ãCRM]VzÙÖ‚H¸¬ÇC®‡VPYu± ‹h}tØ|~1{®LŸ TP‚¿—A¸W[¼uÔT£`ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†U@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçiXkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhølCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œXžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹eOG™¾8Œ¹·{µ¦š­áEpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3isPi7°y£ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-BŸ öD^Ù•Öj½#PkýÖÙ¥~t]×v}×x×z½×|Ý×~×@!ðׄ]؆}Ø{½Co@ °Øí-@‘p YÙ˜ @@˜Ù Mš  fp t ¡Ú0! 4 §à ª  ª=Û+A Là ‡@Û¼m,Щ0HÀ½]Ü"á]Àáž@ ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þñ ¥°ê½Þf@¥mÞð’Pô]žà ]PßHßü½4@”Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿý5žã:N׊Ý×@¾*#0IäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!U¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB_Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIá–6üŽÄãì0â¿*4°Å”tJÁ**Zã*ØÈ ¨Âë‰9<#± 7Ô2ˆ8™ ÛŽLÐÄ”™ƒ°ÿXt1K’`T±ËŽ1#+HÐjL/Ê¡‘.±ÔRK.Ï„3N9çdþ³M‹c.O=›;sO?Á›3Ð+ͳóN—E4QE=ª³Ðß\4RIû$ÔÑG4P+3¥³RKσ”SòtèCÔN?½óOUWeµUWõT$‘Wg¥µV?=E5¸2àµW_6Xa‡%¶X^+¡c—e¶Yf7È5Zi%ÓDO†˜6[m·utO é‚nÇ%·\É@‚O¼0·]wÝU—]Qx·^{³Ý"ÜS¼eâ^ÿµsJDªÖ€Fx¸he¤!^I8b‰»b¥„,F2F&æ¸c‘LY€¤,JøÂc“v„†MJŠdŠ“_þW7LÚ„†4`Æù](0ˆ¤gŸþ Aœ‡&W’NŽîÄOÞ@¢Ÿ.—†ºjr¥¦Új­³Åzk¯¥íúk±- {l³µ,ûlµ L{m·ƒkûm¹¿Š{n»Sªûn½IÊ{ï½ûöûnÀŸ{pÂß6üðrwu¶q`¥þÀqÉ{…VñôlÅœ9EI"óÌqµ¥PM´ÑÐEÇ”tIM?Ý$Ëj`18Y†Ì3ÝNÖ[ßòP„bÈ¡Û'TwÐy'îP¦¶b¹–'xš’ˆ9\ð€Çezd 7R¦:Àç—;¿ *€‚ ¬4úò_ɲÀÓpÅe2«‚-·àˆH ƒ AȱÃYþá³<¡Â+žþ2Sþ‘Á –°„È€œýý†~*y]lfSò‘å=UèÌgÆS,9ü{f4ӛܭè=8á(€2äœpEÇ£‚¶Ó"g1UPNžb+p¢yÃ+âð"H#äVÒÁ#ªèÁ¢#ý‰"xÜó¤ Ÿ¨RdTÂ)I‡BÉ  vÄCuèC! ÓÆE¶4è»t "¨ñ/jc-ˆA Fñ‡]ôb”ĤQ8i-.0$Ahd#U¹À(¤É0"GOE‚о À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%IFá9f6³V H&IÊ‚ TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9O¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?ŸØƒ¨.*Rƒº*V5uK ǸÉ94ðAO%W9‰Fkd4YQµ& ÈAšPªÕ(Ñ &xâQ… ºŠSt‚X}š«α„y B„¡;0†.äÛ bìÀ/ø!Vàï÷ËЂ–dýÎB ;8œå| 3Äh… fÁåV|YÂVŽ*–ŒŠøþ@ ;Å/b±ƒXäâÎó%Ä(Úß5PÒfNŽÁiOËb fô~€T;ºÊÎr¬EÌ øö ñ-Ä2æêXïW ?h4%<éüºÑ–u²\bŸXÄ"ƒv` pzˆÅ‚¼ßNÇW–u·!}jeøÕ&Þ´~å+Œ?þ,C¾£€E0QŒmÇ÷¸ˆóœŸýì<ç›ÏåV÷¡a-ì`¯!ðˆ_ £Þ;à±¼oYÿÀÈH6ÀŸÍì+xÄ9‰­T,‡Üä'?w³Q¾r“s<ÑgyÌ)ìr’Ã\æ7×ðÈ‹Ê^ž¿Jêe1„>t¢ÝèGGzÒ•¾t¤` °ÆyÔùKóÛ\êW8º±¾õ¬«œë[§ºDKþu©‡]žc';ÎÍNΞ·}U?pЙ>wº×ÝîCw:ÔÓ®v‹Ýê{gùÚ£‰vÀ¾ïgÿ{áO.ød^ñ‹?<Ûÿx3þ—nÇüž"ÍóvÞóŸ½wÓ{]Ò—Þô§G}êU¿zÖ·Þõ ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_18.gif000066400000000000000000000202731343257752000273440ustar00rootroot00000000000000GIF89aËí甆„LB<ŒBDìÂÄlÌ¢”$"$lfdŒjdÄ‚„´bdlRLĺ´´’„T>< <2,ôâä”vl\NLÄ–ŒÌª¬„zt”"$\F<¬RT|b\D:4Œ24äÚÜܲ´$¤–”Œ¤~tÄšŒ|jl4&$Œnd¼rtlZ\üòôœ~tܺ¼ ¤‚t¼šœŒ>4¬ND,&$œfd¬žœôÆÄ̦¤tbd´–”Ôª¬t$¤‚„ľ¼t^TìÚÜĆ„´fdôæä”&$¬VTŒ64ܶ´ŒÄžŒ¼vtüöôܾ¼  ¤FD„Ü®œ´nl¬^\¤NLôîì”.,œ64üþüä¾¼„ Ô¦¤ÄŽŒÌžœ„nlÌ–”œ><¬ŽŒüÎÌÔ®¬<24”vt\FDD:<$Œnlœ~|Ô¦œ´Ž„Ìž”TBDdNL„jd,"$tZ\TFDlVT|fd4*,¼–ŒD64œztL><ÿÿþ!ùÊ,ËíþK H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -yA€Ñ£H“*]Ê´©Ó§P£JJµªÕ8)µ«×¯`ÊK¶¬Ù³hÓª]«€ˆ¬EØÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwh¡¥Ê›7c®{YqdŽ“G÷-­ZîãN¼|½Ý:sãÓS³é”%”¦PؤA1EšÝeB¹Ø —·oஓȑ“¦›Ð®åî‚®þ„jtâ†ÜM…J`·t 2r‘ゃóé×7ïý;øu»ÃW]rËí÷œHGuØýÇÆvÝ}ÞxåÍ…›FºmpE 5<àËnoLÀÆoX—ņ5!—†zèÚ<ðpEÙY(WWXbÉe¸vL Pd1±L°C a´×/ #W/ìPCÈUä‘I²Áb‡:HW'!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”µaŒ\„Âg( „r ˜G—žºfè 8ÔXc(‹6z/rA¡LñYf¡ib(]58!W¦›Ê…(}ºÚc}z_¡þušêu‘:ê ¤r1ê¥lXjgal±ê\eÀœ\€G—°  ìØúX²ÚEëæcº#$(É'ŽrÙp…&¢±‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFºÙR‚]8q‡È+]þ¶Wëµ£.œï—,@à­\¹\Š 5tRCiD,W¤ÝðÀ<ÈtàpÊ ç*éî݉eÖÑÉ }ôjÅl Óx‹ hfÍ7ç|]1FÐ#rÔa#pî¸4Ì}ÜÐq,O_f@'ÈÁGñXÕW¯x…Í8ÛZéÎ=ÿt™f£m4Hó ´\M?µþœ Ç l'S´Ñˆw°ñÃ/smðrNhr,à‚š¤¡ì.<öØCt7„²0#aK#Pf½™?ÊÅ‚-dú˜è¤¿Ð\àƒ~ݰ‡'þC'e4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…xðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àµƒÇLµL=ãG—W#”Õ¥c“lŽÇذHÍ’1kXŪÓz=hicÙD)—½ŽR“%Ûhú¼m®–(3 JVA®vr-%+;6¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J·Ãí®¿Þî=|‹°ƒ_r°l’WŸŽ‘¡ú  ‡=õ¥rP–<kMøF¾y‰êaàp Àä íä/8ýk#¦±†)ƒ‚d$x›~é„™øþ@ÇA%"všeDóÞ%nô‹1$µ_ ÷åD<ØQaÑÔ¥Ç`1¦vÝ"`È Í¾ø*™ï ¥TûÎ*{Gí›kRì—Fô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿„¢`1†/¥œ[À 9©crþÚÚH%³«/E Î_PpØÝ*¸œ ÎKêv…Ë­F€,Óà8èóþ…ÀdÕ×\ì€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥\DÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÇà•æÖ4#»–fKiò þem»˜/D3–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–s6ð"ëlë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínlxC P‚cÈІ ¹Ej60zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–ËÕ ÔsÊsöñ$¯ïyIm SËí©U»]JkOU;ñ¨î kyl“×ÕÖZr4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rÆÆo€~% 5@Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V$ЭVr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢€`ÆàþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋw` S0b6˜0Xuóocu[d'#C0zÑ V°¡Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹3CR]VzÙÖ‚H¸¬ÇC®‡WPYuq ‹h}tØ|~1{®Lð VP‚¿—A¸W[¼uÔT¡`ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†l@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçiÈkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œÈžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹eOG™¾8Œ¹·{µ¦š­áGpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3irPi7°y¡ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú‘”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B öD^Ù•Öj½!PkýÖÙ¥~ t]×v}×x×z½×|Ý×~×@:ðׄ]؆}Ø{íCn@ž°Øí-@P ZÙ˜ @@”Ù M˜p hP tð ¡Ú0 4 ¥À §€ ª=Û+! › OÀ †@Û¼m+Àª0K ½]Ü"Ñ\°Ñœ ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]ÞÑ £ê½Þh@¥mÞð0ô=œÀ \PßKßü½4@’Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÝ5žã:N׊Ý×@¾*!LäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!l¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB/Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIð‚üàÇyÎuîp‰#øå&Ÿ¸½ãýsw·.':½žñ¡'½Ü1ÿ,Ò®oŸOýéK÷8Ík¾Üìš×ë_»×¯;v²—ÝìgG{ÚÕ¾v¶·f;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_19.gif000066400000000000000000000211071343257752000273420ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÌ¢”$"$lfdŒjdÄ‚„lRL´bd´’„ĺ´T>< <2,Ä–ŒôâäŒvt\NL\F<̪¬„zt”"$¬RT|b\D:4Œ24¤–”äÚÜܲ´$ÄšŒœvt|jlŒlZ\¼šœ¤‚t4&$Œnd¼rtüòôܺ¼ TJL¼’„Œ><ÌžŒTB<¤BD„Ô¦”´Ž|D2,ܪœœ~t|^T¤ŠŒœnlôÊÌ´jldNDdJD¬Z\„f\L:4üÒÔ„j\tZT”rlì¾¼¤JL,"ôêì”vl\JLÔªœ”*,|f\œ24ìÞÜ,<.,Œrtüúü亼¼–”ÌšœTF<„ Ô¢¤ÄŠŒdRT„jlt^T lVL´’”<64Ì’”\JDìÖÔ䲤$ÄžœœzlŒ¬†|4*$Œrd¼z| ¼–„œ:4,&$ìÚÜĆ„´fdôæä”&$¬VTŒ64ܶ´ÄžŒŒ¼žœ¼vtüöôܾ¼  ¤FD„Ü®œ´nl¬^\¤NLôîì”.,œ64üþü侼̞œ„ Ô¦¤ÄŽŒ„nl´–”Ì–”œ><¬ŽŒüÎÌÔ®¬LBD<24\FD|bdD:<$ŒnlÌž”TBDÔ¦œ´Ž„œ~|dNL„jdtZ\,"$”vt|fdTFDt^\lVTœzt4*,¼–ŒD64L><ÿÿþ!ùÑ,ËíþQ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -‰A€Ñ£H“*]Ê´©Ó§P£JJµªU<1µ«×¯`ÊK¶¬Ù³hÓª]«€‡¬FÚÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwhѥʛ7c®{YqdŽ“G÷-­ZîcP½†ÍÝ:sãÓS·•„T'SÚ¬Y1wÅšÝgH½Ø —·oà®{ر³T›Ð®åî‚®‘þz¤"†ÜN‘J`·ô 3r±ó‚ƒóé×7ïý;øu»ÃW]rËí÷œHGuØýׯvÝ}ÞxåÍ…›Fºm…7<0ÌnsDÑFsX—Ć7!—†zèZ3ÌEÙY(×Y\rIg¸öŒS$1[¶D±ƒ_´×\/ 4#—)ìpÃÈUä‘I¶Áb‡:H(!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”¹áŒ\Â') r_!˜G—žºfh 9ÔX#)‹6z]/rM_¤ñYf¡ub(]7)JSªÔ<F³©´£mž…x5ðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àµƒÇLµL=ãG—W#”Õ¥c“lŽÇÚ°HÍ’1kXŪÓz=hikÙD)—½ŽR“"Ûhú¼m®–(3 JVA®vr-%+»6¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\JÃí®¿Þî=|eȃ_tPl’WŸŽ‘¡ú¦`‡=õåvP–<kMøF¾y‰êaèð Àè@ íä/8ýk#¦±†1³h$x›~…™øþ@ÇA%"všeDóÞ…nô‹3$µ_ ÷åD3ØQaÑÔ¥Ç`1¦vÝ"`Ì Í¾ø*™ïL¥TûÎ*{Gí›kRì—Gô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿¢`q†/¥œ[À 9©crþÚÚH%³«/F Î_VpØÝ*¸œ ÎËê–…Ë­F€,Óà8èóþ…ÀdÕ×\ò€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥,ƒÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÏà•æÖ4#»–fKiò þem»˜/Ds–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó6ô"ëmë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínm˜C¦ ‚gÈІ ¹Eê60zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë• ÔƒÊsöñ$¯ïyIí SËí©U»]JkOU;ñ¨î kyl“×ÕÖZz4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rÖÆs€~"` 7@Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]Vzàô­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢€`ÎðþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋp°   E0b6˜0Xuóocu[d'#C0z Xà¤Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcQþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹#CRQ]VzÙÖ‚H¸¬ÇC®‡YPYuñ ‹h}tØ|~1{®L @ XP‚¿—A¸W[¼uÔT¤€ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†m@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçiØkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh8lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œØžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹…OG™¾8Œ¹·{µ¦š­ñHpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3ivPi1°y¤ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú±”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B ÐöD^Ù•Öj½%PkýÖÙ¥~àt]×v}×x×z½×|Ý×~×`#ðׄ]؆}Ø{ýCq`¡°Øí.`‘€ [Ù˜ €`–Ù M›° j€ x ¡Ú0A 6 ¨ «° ª=Û+A ž Pð ‡@Û¼m-ª0L ½]Ü"`ПP ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þ ¦àê½Þj`¥mÞð’`ômŸð `PßLßü½6`”Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÝ5žã:N׊Ý×@¾*%PMäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!m¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB/Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIQ T„ dkΘðUTh•«i…YU¯*’©Âf°xêH˜*þ »ž,¢ É&L †¾zì 6°DI€‡ÂvL ˜¸I\ ±ÆNÌ “ÐDf5Ë@¢²“„Dk…U¬"£ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN×¶‹Dvµ»]îv×»ßox¹ 0È@¼çEozÁ»5àÔ½ï…/{“qúÖ×¾÷Åo~ßúî—¿ÿp€<`aoì_ÿÞ·Á †p„%Œß'øžð…Ì`]̾Îpˆ3\a­Á`¾1ŠùË`)âÃ)†ñ„Il5þÓ—Á††²@‹Øbõíñ@ŒëùâÇ(ö/–a[hÁ8-úKß!ùÈ0Ä.aŒ7  :–òfA†]Øa„ / ša†`ÃÆZ°…–Á*ùF¦ï, ;h!Ïd63š ŒàŸ˜Á¾°!Èp‹#,ƒõuE1ŽÐ'ƒ5}<ƒ \xƒ‰fxÅ”¶4¦m Â/¨E¢]Áè#há–€”A_RÈ‚\Èô…= j2ÐÕ—¶+ž‚HºÖ·Îõ®ma§‚¾@0Ãh Ïb\¸/!H±iÿº!Ì´õ”‘‹MþÛWÜ6¶ö€€xc›¾Æ}— úãàîï¹Ý€ßwÁÜ÷Å·¾ù=íB“ûÅG€ÆŽà)зϰs~3áÚéæC3Þ€â‹g|9íV1Š“¨ñ#ÂvpÃ+lìqyg»ågyÇï»ò“3œÆ†F¹»…#dáôuƒ"0‹¤»ÜçN·¶Aˆr+éQO¹` þÎ ã¾°À‘nõ¦#=ÌõÝ:… ýó·Û†xF}{ÍK$ÃéôE†.>j”£þ{ݱþ`ÿã´àÃ!N,ÄÝÆzç‚.Ák_ ž¾ÊƵ³ xÅÓwÆU«1’~aþ  õ}Åáï»AÉLv2Êg¡ ÿ¦~õÇüÃgq c<¢h ¯`†f àÍqž3}mÏú<#ƒv @žyï{àûô'Žqöµïàí[j¡ï~øa âþûØú'L~›ÿiàWüå`÷ þóÇþ½ÿ´`À×ÿÿo¦­Ñ7(†4ÀDÀTÀdÀtÀ„ÀŒ@hX»ëÓ¿ Ä¿úšûÃÀÜ> ÌôÀ,¿ ôÃ?Dw ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_2.gif000066400000000000000000000362301343257752000272550ustar00rootroot00000000000000GIF89a@ð猂„LB<äÂÄŒRLTĆ„|b\$"$Ô¦”lRLŒjd¬†|<2,´fd\NL ܶ´ôêì¼–„Œvt\64\F<ܪœìÒÔÄ–Œ„ztD:4|jl´Ž|$4&$lZ\œzlÄžŒôÆÄÔ®¬ TJL„̦¤œ‚„TB<ŒrdD2,dVT¼žœ”"$¼’„|^TÄžœt¬^\„f\dNDì¾¼üöô´–”dJDL:4„j\¬ŽŒ4.,tZT¤~t¤ŠŒäÊ̤FD|f\,"´Š|¼vtä¾¼”vl\JLܲ´,œ~|ÌžŒüÎÌ Ô¦¤¤‚tTF<œ:4¬RT,&$”z|Ì¢”¤‚„LBDäÆÄÄŠŒ|bdÔ¦œ¬Š|<24”.,üÒÔüòôT><Œ䲤´’”Œrt<.,´jlôÊÌ̪¬Ä¢¤üúü¤JL¼z|Ôª¬äº¼¼šœÜ®œÄšŒ„œ><„nl¤†„¼–Œ\FDD:<´Ž„$œzt TBDdNL„jdtZ\|fd,"$”vtÌž”TFDt^\lVTŒnl4*,D64L><ÿÿþ!ù²,@ðþáH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·p/j@·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#K¬Á£€$<2kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¥“°Ì£ïßÀƒ N¼¸ñãÈ“+_μ¹óçУC 8õêÁ¯cßν»÷ïàÃþç±»£€ÞâÓ«_ϾýsíÓÁÃß>ß½ýûøóc'Ï[¿ÿÿÈ]}ØÕ@“G u6èàƒáñgzVhá…ë-(±Ø àrb(∠JÈÑy$¦¨â}T‡% øv=X‚‡ xáL £ RH!F‚…\7 –¨¡…ˆáÅo^ˆQd7æ¸c2 @Ÿø˜e!Ü7\àÛ$bH F"©$“+Æ)g„åHáœxæùœ&K\@I_Ð%\d ,„fñŠŒˆ@"@|y"”$0)…LrÆ…,qF‚‚&zh¢‹©e! ÐAäu] "‚þˆtáÂzݤ•^ªç®¼*gâF(ö*ì°¿Ybƒ©Šo\°l!\h!c ¾Åà—flâ›–lk‰–Ø!ã³Í’+­©Ùùö†¬èZBm!ÖúæÂ»1\—­·Äæ+쯫ï¿sz‹h²š &_jÀÃÿÖüßÅ_&; *  ‹‡Â0\ÈǾ]pÇðÊò›‘¿,Ç<â$h@p°ÅÉ@ïµè~B‰pe$BdŒîÍÇ`F×¹[-ÏóV{Ï2W¢ËÁlõÖÊÍš }4º:Ú»·"2Á$1È­ƒb„™ã|ôŒÀ¡þ«®ÂÊn 8ŠHÚk·Íõáb}‘Öˆ7îŸàab× jˆ¡°‘6˜‡!¢B)¿ ÂØ–Û ß$ \wÁcî²jHÁ智ã¼Û§¸EŒ÷.<„*oüñ¾ý^QðÈ7_ñÎG¸ò1/ýõâAýöS?‘õ܇/þøâ{/Ü þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  HÀð€´ŸÀàK¤ìŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ Ah‰þï…0Œ¡óÌðÉð†8Ì!±hêð‡þ@ ¢ˆxø ñˆHLâ}ˆè˜=ð71`A(BÁ‚wéaRhƒ¶ 1HtàÔSVœ)cQœb-ö°PAâ’Ñ­ƒE-Ê‘Œ¾éâÃxÇ,n‚Àa“ îHFí¤‘ŠV4#”ÈÈ2±!NN¤pU¨âR(ºìÐ…b8%.pôhJÖ$+yÉL~‰ ž¸&~66ã\‡“ž¬¥o@)JRšr[4p&a,Kœu¾Y¥%1©ITzÈnŒ& ÉHg‘’Ø 2ÖiÅ"›éJΖºd7l§ Û¬%:…YÆßt“…øæp´óN]ú Fþ(аÈë˜S›2â’—ì)Í‚^š ±&p @KßPÂfèJ@èP†ÎS9ÔIÕª|cÑßam(%¾j´Õ‚³®M-Ó4K\áqö žý$%—)…?‡=à¥|‰ÓpúFo×ÙÄr[é\hÅr«§|nì)]êŽ ººô,‚ÓÒÞîr»˜ìîu÷VÜú6î¸I.¼P‚4  ’m7 0Šñª§ÍTë È_ÿøŽn„#§:RßÁ °vá'ÒÁ`À…Ië¶ßþþW²¬Ã¬}WÌ+üĈ,ޱŒwZ'`ÝiÆ8Î1]˜ŸºÇÇ:òŒ]L ùÈHÞWûuã$;ùÉJæ1”§Lå9y F®²–·ìŸ+ Ä+ ³˜ÇLæ2›ùÌhN³þš×Ìæ1·°#èK œçLç:ÛùÎxγž÷Ìç>ÏyRæ²  /ÃA¿ÇQq{²Ð†æ\ÇP4¤M˜–И&‘¡­×q¡¹ŽöMc›3jìL€·™NuË–ü²;QšÒêYÁzC]ˆPU9¶ŽÏÑXÀUûúA›vµs`¬`ØÕm§®µã…XüúÙ v²Â4¦2•LLdÚœo<‘„ŠYHB:fv¨ôwµèE1*¸‡äK4ôÜ0:“›–”% ggÝ ‚˜“ $¥Dgl<ƒ¶Àñ#m»µêU±jmßn*4H±9kÔ£~›Dqgð Ÿü¨"IR¾Ñœþ ±ñ?ùW–ÂÙýñliSúW§Š7fkà8oOÁ¿ä4xñ¬çñ*’ 4qÉÎhge4W»¥ ¤läÆBÖoîUn‰mžN×·ÀGçD+ç`_ÏÎ=2‘‘la2²»Ü‹U´3Èn#ˆZ2‘YB“…ˆ{ÁB>Çš—±ìF›XÅ ³‰n…ýðà{Óœtž@¤oð'UýiÊ6Íët x £sÛnY‡¶£khÛxT+5c‹/¤«}¬»¶nûºUg’á˜Rf‘ ŸggV¿{ŠÅv5¼í†wÉw?•luûSךT¶1s¿þ+2u#‘„+Î Ÿü g”¼É1 3f` Kwn×½×Ñ‘ùLÖ x…À¾“2‘û¨Í{‘ÏktÊ;‘⫾!ãô;2·¦½‘K½dWwlgÀÌ¿ LÀBÕ¿ÛûvìÀn—½IUxÂ*e.€“:iµUÛºXûY—ö5®+¢g™)¡7“èø­ fµ¼“.Ù3/Ü®G£4ÃU³[74yœ“4¼·ì$“8̶ód¦ZâtAüÁg”Cɸ§×ÄC ¹3«{7)Ä„ù%? zœ7Å3Ü“ùèÂZÂzÂE·>Çv_¬Å<ÌÄ!lÆÙÆP¤Z¦[·ÉÒÆ†¨”¿1v\é•þ¬2| 8‚“]¡4]º·5GÈrTù”XÉ6ÕWÃl÷Ç”ð•5L8’|†óÅ7µÇvÓ·Éìdɘ\Q WR ìŸ1j ËÇ.¤¬e “ž,¯Õ•—È…ÌÉДÅ_Ë™ɆS•ÉW$¯ÌQ¸\Êbù²ÂÌÇÆ‡]´gËuÊÃ|}É´­%Èš\ÍÌ ÍIûÉ{KÍJÙ–P;!À˜‚i®C;¶³ÎµÓ¨V`|¤È©ÊÎEŠ—z™)¹c€‰€Ýyè<˜Á¬ÏXžÌ™bé;Úf7ä[оáÏÁÐê|ruIÑÖ—Ï%n{Š*~ù# ¨0-Ë‹™¦êÒ)Ð`bþÏ÷k7 ½!=Ð Í—y9ÈþwO'=Ñ…y˜ƒÓüì¨ æ:%Ív>½;-Í¿å§Ð%£Ò{ùÓ½`I}~ ý%E-™lÎ$‚™‚[£™ b A AP°^ý¨ÂÁ™7Ne %Ú k½2ØÙÇÃÚCÜ š+à@£ +œ`ÆAš¦ÙcÞ;ÁÒÖ+ö›ÀyJ–›ÛCØöeØÇùØW3×ET×]ÙzâØ–ÙÀ&ÙMDÙšýÙšÆÙäÙðÄØÁáœþY…0q Ú·¡’Ûâ‰QäÉÊÐAŸ®s°3môF]÷vÆÑŸ´ýŸ¶ ¡•Ö™¹ m»­:Ìò]/lÖ"¸Ïþ‰¢ ݆èlÉýÚ¢]Mw"§]j¤Dj$Œj—®åÝâ‚Gæ ¥“¸©¥z‰W*°,:ޒڥ譨¿¬Ù-pcW±B{ý Rõ±ÀQ±ØJrÚÚqDk¶Áñß»²Çj4[»ù­ÜÛP2¨·V\>-µj» z«ŽKÇŽ…0º ^¹¥·>á¿6vl¼ &v)X¬¿Þ ì)w|ÂÇ!ã üIqëâ™6vTŒÂ#¬áq<][Kn4S®Â?ÙÂm|â¿‘áUU¾ÇHþâÞSwÌÀ¥ÍÙ¼ËèK²DKf~ÊÈ Èü9kÄ|•öš•ßZŒŒ±þo>Pf^äæ©6v/ÒïìÎí a¾ý…N—Ó×Ï4½UÝÏmè‰^^ÑšéV-èƒ>ænEÚþ¡ÕÒñÖ#X Ži˜½ê®î­þ겞±>ë¶Nµ~ëº.×Q»ë¾>~¢ÞY¤þëÄŽëÁŽ\Ã^ìÊÎëX½‚‚ÚÃ=…­½ì`÷„¦³}†£†ÛÔ^™Çž_ÅÙž½-aÌIÂ}†m˜¡ÝvÖþ¢l¾UÀ]#:Ýc££ë^íßþbw2 £:xm’© :©ƒžPžNé]ß¡ªÞšŠním¥uŠß÷®Ûù^dwB+ÌŒ.Dû±þZK!%à¿Aà#w² n4¹þñÚ-e¡k7©û¹>V?Yz âj+â<,¶%®¹bSò&OáR¶‘ 3GC~F5XC®ã8Þ4È›ÙwF£Á;òÍ^)ïÅ/Üåyå[ìÄcSåžwå•åFãzOõvËœ0»Í¯gæuóînžÌ×ç·,çÍGç«,Îbèc/æRÆï…UêÔ <ÀÁšUëV®]± àQÑE „1&šÙ„ÐŽ%“)I¹Pè‚Jm)J¬‹ÏF„–lˆ¨ˆV-Û„v°¡éBÁ…Ö"¤Ã¦Ð¦$|uRÅœYófÎ=þZ4P«^MŸÎ ¶"ž¸r'j;¶Ý7²c¿1\Xb;z‚%ÅCŒ¶Oæî ÀR—…°m# ñiR, 7]ûvîݽ¯´4jò\U/[vâ§¼Îmÿ6.Jݹy8¬8 „ìy <¡¿öšÄ‰7,áí!9ƒ0B '¤°B Ç+/C8ÎC¨‹ €‘‰š`’,Ì XRj¨)&XèÅ»ZaE„äˆA?MDB¤Äí¢¾¶Tù'MD±%À¡6$³0J)§¤²J+}ÂPCò8”K 5¤a¢Il0'\*Œâ*…Ž—BÎܸþ"­BØø#¨@hÌ2Ïr!Îø!UÌÂO3ÑTÒƒ7ëJI'¥´RK1ËRËÓ¸Ô.‹ˆšB„O¥`!pº4UUWeõÒL5õŠÓV‰š¤'œ5W]wåu»Wa5/¬^…R®ƒaE6Ye“úX­d]6Zi§¥6ÙfýJØj·å¶[o¯¼[h¿%·\sÏå,\gÇE·]wß…÷'ueWH•‚²×½äÊ¢£&òÃ|›xÒSãE8á¨æ…µÞñÝ·>} ¡Ó΢&:ƒQ© ް‡$P‚êš R…OFÙ(†5uø0’y:–@îÞB ©©‰Bim*Žþ ’*)hp¤`±Ô”—f:¥•µlÙ§‰6àJ.8BXŽóˆ‡t®ªŸ/žxcž&Ò‹Xšf›í§5är1¤€ Ì>°D øš( ’ëÁ<> K71ç®{"KÚ£Â<,Yàî¼÷në9©¼ð n€‚Z“›n» ™o½ùòi˜CÙÀŽ„d{}¶„ø¸ÆœV®qÝÄ…¶Oùí ¹(D‘G’Ò ‚%‚….€ Ôp„Š?>ùB4âÈ#”)УŸ¾ú.yæ Áù ÿ§=/H@ r ò"„:ú(¤ØËϰSK,¡A—^þ&¼òp)=…0 cìôÃõÌ=¡ØN¬WˆF°{Yˆ_³ÆP@‡Á -Q¸øŽƒ,<Ë”$îi€¯ñd²Ë …ø.nI[lÍ^Àæ=ï†d B”Ø›ßg8Å±Ü ¥6±(ÊzIâ-ç“ B °“Xá¬I(~ê‰lð¨ÑŽÞ*"jCÝ,¨²™ø&ÒÁ®5©Oûé£Í~´B¬°,.$d"…â/$` Ð"#óƒÈÿ1'\Cƒî8ÊoåqSGôˆ´w¤é†jÖ´61¥2DÉÙr„†½¤GH_Íþy¾ô!b}¶\å/[)1„@ áÁDd„iJ G:ZÄò$Rvs[¦4 —.à%0‰‰L‹2Ì6 ™Ñ,âç—FW1„àIO¢R 6XˆAÝÌ.ØAçvDrŽ.ŸhêgJÐð åØ NÍ=÷4\‘Ž>² 75j­«`+VG §œªÏô;–BÑ‚0ÀƒmÔ¥õèG_ú™Xdš0äLu:,pÊt§?ª{ÚvÕ¨G…×Pƒ…T¦65©éVŠêTªVuYJ•*H­ºU® «ÏÒjWÅ:ÖU}55aO¿þ…€)¤¥d…«QÍš- Ñ3›…ÈBJ–þѸöÕ¥sÝZ‰Å“0hFÌ J.ïʳ…°@i~…¬7;U—åÇ/ :ìØ*â5°ILm‘­d¡Õ³Vdœ¢“é(7F4¡t@ƒI`—EÚ)ävë ã‡[Ò©–oÿCHïB;Ü;N•,P…*ð¾å!§Eɬ{ôWþ}o{¨«®ÿ`R’}‘¸ßM q #Æp0¹‘\èòD“äð/«AI(Ã`z¼÷mšxÒÅ)n‰ô©mpóÎÝT±TD¯èß,ææ:ø…ðÒôÛòzÐ?„ÏBÒ«IÄê‡?…¸OJ<,É»ÐÇ IŠpŠã5áBt¹Ê}ŸP4Mþ±È!Õ¬&}®ÉKÙ¨;î%+Q¤EnªØÈD-ikZN| æüš '5¥¤Mo‚¨Ä$**»n¹OçÔç 1zd2£‹Å‰AE#Ò¦¼µÌoÆc’IË©¨‚ˆ¸œõ á3ÓN åž Ú3ÚÐà-ô¡Mh9G•²‹†tWiJ‹uÒ•ÆtU/½fݵ­•EŠ›3=êÑl4v%^5æÏ£ì•Ô¯©A½Â– ± Qlª;ë£8Ö¿öŒ¬·hY`–½<áìZomë£|ØÏÎ ‹O›8ɸiíkc \ÚÖnq ¹mîJ7¹ßzÒfžHÂÆmí3þ”ŠšHÀd\mz/¬Ñ1å’‹“»\ðqWHÏýM2]îíÏ{Ú…Ÿ¿Ã¦/–¸d»2¡‰MP…ÀzW¼),¶D…ÍëÂÐ'½xBÚ¾¼w¾çínr³˜B”0‘™Ler¢A‹×œY÷ö(—ø+F4Ø8æ0d ß$ØŠkrNÏ.‘å4‡‰Ñ™ÎÈ&£f›W48×3®ä…ذ­éâM~øÂ´Ä×€ {v)ÈØ¢´zÜ…Âb}ØG2¦&yk\‘ᘼS,ïÌîÚK!D2’2“´$CYî›,…'9Ê"¡²rå)g™>]ÎÓDIf4þ0¡;T¢H¿%8Ê:&ƒ|ì2é4‡†ÍL1iRHÅw@Ê^ög®óóœ¬ZÝÊ÷ÇG6Ö×R?ZYÅB~ôg¯|z Vú×—–°±¿ý^iŸûߟ•÷Á?þT‰¿³ÃäRÔêi1¤÷ä§·ù•­Hm*ÕDÁš\ ÿzË9€™vZº[Ó, È5üCˆ]cˆÇâ¿_ó?‰y¥«Éš䚋롻2±µi@h“6Ä1(ߺ6¿Á!ñ j›ÚY7ÊIÌ)ÁFÒ-Ü©6TË® |6º{1~󥿒çIò¡ñií€éz¸“ž!¼®îéŸ~c-¢8„5ŒÓþ8 B¹ á«„H! H¹“ã8“èB½ˆ/“ÃÂ1ì®)¤BRc±Ã"¥[ d5™8LˆI:Ùa$¢3°ÛC;¬ˆkÃ*¤¾†Ñº+,¶Ë?ª?A|!®“F$0²CN¢D-:±B4D%«Š¨;²¼³Žª‰¥ $°Zú[ÊQ$°ÀÛ¥ S¼úrK‚? 4mÇÐxÀp$GL9D–±¾rTÇ`;G¨IÇu„ÇhkG¸yÇx´G{óÄÒºÇ}ÜŒqìŒõþKµO›F~tÃyžzÌŽûŠüÓ«e$È‚ÌGºJŠ ‰P0p‡I,Óµžñµ‡ìĈ|´GÌ O¸Mp"f‹¼ Lµ ÉÌGqòÀÔ"·k’.„àZÖ¹6Õ‘ÖÉÈoCˆp›ÁrC£|ÉQÓÁ}c®øá0°û°ù©Ÿû‘©´ŸŒÀ®ƒƒÂúbä¬Fƒl D”D—;6‹â‰Z8´ü 3¡44¡9¡9¯¬´7 £8äCf{7„(£3ºË…ØK4òC£;0“ËzF¹44+”ÄLd¶.P„ $K¤܈ÌK*$ÃD'ÒDCLH[J»ó%¼s‘¿›.0I”l¦þg¢„h"ÅÔ„&\ò1Á MÂ#2ìÌCÃEÊÓE}ê<Ù‹ÄÈ…X¨†Ê²áô‹Ò¬“z =|Z½}³ÛŒ4gìŽhTŠ„ÎA³Fá»ÎÛäFoÜÎÎôÇïŒÇðÏu$Ïò,ÇóDÏpTÏõÔÆöü €DÀBÈ÷sOü‚ÏÎPÈÁRµ†ÜÂû$® ’À•<Š\ÈôHÛÐáP÷ •|ŠdÃÀŠp¶½¯D­¢´ÉøÒÔÉŸäÉ3`/ð€Á!¯ä ¡´Ý7, œ7 ý®ÏÅ„‹B}a:à‰°Jª€6ž,òÉ‚WØÊ&4¸'ìA§„KÍþP°4¢ñKú"°7X{QKH!/9·$ ’k$4l9,•¸”ÒТK)â¹¾´‹I@п„S D+Cºÿr°Ã\S¸RÌòê:‹3èƒAª$Ë<¶õp"K<$³ÓÌÜØÄ@uP*Õ£ãbÊÁk¥«ˆ"P‰p¦×lTNEXĦÙl¥Ú´ÔKÈ%[ˆ ˜¼Ê½ËãE‰™4N‡*ÕZÝEc=btN‡lÕ¾’N ¡Î¤°Îb%«ìÄFfeOL=¥”h¾o„V[ÌÏkå¾lÕVìãÖn•¾oWäWK‘Ï¥Ïö[ÖqM˜r¥”ý„˜þ,„ýcW “ÖpBÈ:$P þ¥åOüÈz ž{õ©óKˆ=,paÉùtIØW•É í­šÌ"ÑÉØÉŒÌ1QUQ}QL)ÞðI ì“.°„P8uQ¢œXk›Ñ£¬Q‡mW‚%*MÍ$|§ýQ„R“ R.0R$UÒ'å®ì2 ã ‘¿)„¡eø>Ÿ-8êÒJ¥ÝQ‰éJœ}*ˆKB=Ó,œ-­™.ýÒ2[5”/“`¡›-µô€ÂC "Ó¶]Û·äZ5õÚ¯É#ÂÃ<%09¥Ó‰°ÓLšÁåS“H¢/*„ã”ÜÀÜÓ£³KH .@íÛrT ›Ô9ÔD…ÌEÌþsTŸ±„xÛѕ̉˜Û” DH%̼ãÌÍu1ÂóÔ…UQUMÖ4]SÕ¥T€Ul€õÕÕœˆ, Zâř،EèeUÜ]1]ªXÕÝ”29ÁU]e¨ãìUaõ²‘•5ƒÖØU1é‚$Pƒ—õU}Væ´UeüOëå\ìÍ*Ÿ¨=)1P£HÖP³Oü=g¾(ù_¶ªît>ÿU`WýÛnCw•``£à †IOI &WýýDæ¿ á[ô`}áñáþJ°Ua.a‰lám}aXáíKáÆÍÞ`®ºæaAóa•Ë Þ¾!À‡4â~³%fþb2sâ'6²(–â£â*æ3ÎW,æ@-æâßóâ/†¼+žŠsåÏOÃŒucJ!㨀W̫̠×5V•r›§D WLµ X:.¿0ÎŒ;æ×¢ Ð–œÈB~ ä@fᣘ¶¤Ø£ÌXnë¹Ú*Š˜…Q­A4ꉔåÉçè¶©ÛFžù ŦT¸…Ú ›.¢¸Z¦ÕÚúê‰V»WîZSAÎdE$ËeëR±KI ¸[3ýe- Š`άÉe]®ù \?õK3’Cü©(¡ ÜÅ%̾üÈ5]ÞÑ\g¾^&Š­[ÆDÒE\"ž»œJ]tþ™Ê,Ý K‰JçSþ&ç¡Heè­¦å^¿cç\ÙtÅu®–¦¿ëÝmbÐ{–ù“Õ\DFÞôÞõÅ<ÏCŠùèÒ3ŒÓÎðåÕ[íM$V‡žìß ¸¥È=¨Pc“¦ÿ ¾g…é#›0ãÀi4ªVÏÈ霮i;jãŸ^à|êf$jÄœ„kOþ€%pê§†ê¨–ê©¦êª¶ê«Æê¬Öê­æê®öê¯ë°ë®&ë³Fë´Vëµfë¶vkµþîé¹¦ëº¶ë»Æë¼Öë½æë¾öë¿ìÀì(Á6ìÃFìÄVìÅfìÆîë~ÕÈ–ìɦìʶìËÎ AXƒ5ÌöìÏíþÐíÑ&íÒ6íÓFíÔž‚J¨„)Hí×†íØ–íÙ¦íÚ¶íÛöDG˜ƒ9pÜöíßîàîá&nà–€J€H¨ (îævîç†îè–îè&7Èp2˜îíæîîöîï免‚ÀЏ„ðFïôVïõfï߃ˆ¬ˆ€ƒö¶ïûÆïüÖoÒ2Bh¬hB؃ý&ð7ðoo@H­H@@ð‡ð—ð߯€Ð­€À€ çð÷ð·ìG€®€GñGñWqÔ(q®@‚_ñ—ñð!8@ ‚×q@8! ñò _ïp€"w7pG(þrˆo!wò'‡ò膄8Hˆò+Çò,ÿí)¯r-÷ò/óÒær+ó27ó3È1Gó5gó6Ï5wó8—s7‡ó9·ó;ÿò:Çó=çs!×ó>ô@Oñ?ôB7ô'ôCWôEÏïDgôG‡ôðvôH§ôJ‡îI·ôL×ô-§r2ßôOuÜÆôP'u7SGõTWõUgõVwõW‡õX—õY‡õ  ¨Z×õ]çõ^÷uW€RÏt@„U0öcGödWöegöfwög‡öh—öi§öj·ökÇöl·vK€/„p÷q'÷r7÷sG÷tW÷ug÷v_wp÷x—÷yþ§÷z?÷Uàön§ôo·÷~÷÷øp‡÷€'ø‚7øpÇw}ßwp?ø†wxt?8uø‡·ø‹G÷„WxHçwŒ÷ø‚‚OH3ˆ‚t¯øGù‡×øgôŽOù—§wCx…@x÷(8…Q‚‰„GKH…@„WЂQx˜Gzy_y–Wt—Oú§O÷XH@HXwL€…&ØSø@0M0„p·HƒH¸¨GûŒÏw¦oz†Oû·÷ÐEEЄw3 r€:°÷QH…H€ûÂ÷¥gûBwzÃzV0Vw- ûq3àƒqGQ3°yþÆO{ÄOü@_|Ïy»Çû¸Ÿû@Ð{¾3àù›7K }´ýÐïóÑŸý¯zr…;¬€­ïúH@Lw& 4ˆýÜúÚ·ý=Ç}æ¿øš'w™œ·) €®%@,!@-xI~¤wþç¿óè?ÿöwÿ”OõŸsöÿú·ÿƒùsú¿ÿþ÷ÿzˆU&à,hð „ 2lèð!Ĉ'R¬hñ"ÆŒ7Jð%È"G’,iò$Ê”*W²léò%̘2g ähó&Μ:wòìéó'€X¦†-jô(Ò¤J—2mêô)Ô¨R§R­jÕL§ŸZ·ríþêõ+ØÆ’-kö,Ú´jײmëö-ܸrçÒ­k—쨰z÷òíë÷¯C3.lø0âÄŠIÖìø1äÈ’+ ^lù2æÌš57žìù3èÐa+o.mú4êÓE³níú5EÒ©gÓ®m{åjغwóf-û6ðàÂKçîmü8ò½¿‡3oî\fñäÒ§SÇÔ*öìÚ·sïîýûQ¬ÕÇ“/Où.úôê׳oïÞ}^óòçÓ'¸ü9þüúCF¯ïÿ?o÷í7 Àõ ‚ ‚&`m˜Äò 1bF„Z8S,˜”t ‚zøƒ'UhÒˆ0 I‚ô‡º š(ÂØ@Úx£_þ!V"K™äS…¡¤Q/ʤ,ZXrÅ ‹4â8%•^é8S‘*­’ NÚ–¥‘/u¢Ã8´ð` #¦À„”Uºù¦NW’T!uŒ¢"$xY–KŸ¤’$¯h1Ê EÅ'R2žd‰h'žzè …¦yˆ&R´2¤JtŠD'–Œiž!EØJ !¥ÐJšu|‚*3¤`F¤Nbª)§Üº©©€ J¨“®Â*+­¥z9Ò¡Hf´ '´Ñ^$çHtŠÁXüq,˜(i1#H–øF$W€t,lÁ+ܦÀµÙnˆ¸äš›&,‘D N¢ÕkšŸ:™Gþ$iÆ«m¯iüñÑD‘f,MŒ€I(y`‹É¼ä»o¿øêË/Àõ–ëdÄW|ñ¼d,ËŽ Å³Òʬò²"¢+ÀÓi9Ú¤“$¹â¢ßLÒ £ PR³{û={´€?î)ç-­rÇHQb HD0gç%enèïS·½ö¿#þˆ¸ç^$$âZòçñ=«­| n—ä;ðÓ¯.Ò–¼^Òš²Ó¾~•¶÷|s…šHÚR&h i$H*°äÉ*nG<€áOá@'ôÕ‰S¸äXAò ½ãEht˜A ñŠeN ŒÄôÁ«€ûë À1Šù‘$\ ‡Ø'ùOzï Ä!¤à3’(E ´ð I*¨À 18F¤,t*¢‰x©Lñª%$@Ä ê0ÁÕEè– H!¾Àí*We‡¨ºÐÑÉ,Œ Id¤¾ÒQAîËŒƒ  )Æd‡ÏÉ’3“¡ Սކ¤áG„™@6þø‰á!#IÒ¼¥na#1i¼GR’žœÏ)ÊQ°“Ÿ<åxBIÊU*’¨|¥nTÉÊY^È•°¼¥oIË]ò2¶Ä%0=#Ë^³9¿ &2#›L:±™ ²æ$D!%ƆïÉ -tÌdr³/˼ZñÂ9›.š`ÑÒª)NÈuOŽÚf7ã –oªh€çj|Ô¥@)ˆ±¦?%mšRž =]âHC}"fØœi¶´Ï2³SëÜ$HÒ÷΂´£ÊÑåqµFÜ¥¡RÐÄ!F¤Á@¼‚r­º“±(,3HŠwÝsÖ¡µ('…*BxóU¥ …(E½1þB|"©$Õ„UH!¢hÒKkˆ’ž4¥ÇÊ)QABU”Ž(võ(X½ R}¬c™Ã6‹'¥*öƒ¶F¯q¬uD$BÁ¨:° ]êb×Àˆö¼¹Úë\éZW»n(¢ƒÍ‹’PÄ@p/¸Ê $iýîüŠX˪uDzûjXC;ϱnoŒ¸£iÛ*9öpx8;Ô†CК(Ô*”h4 ÍIZc¸·¢-iŠ%×ê’0¹ Am÷p·Û@ô6Ð%g•»xж»Y¦éL{¬ç)¢B¬0Kb3‡ºÅ iID„pÕ¸£¢?5âRˆù:ê¸þ= `¡Ã±¬‘¼¸ã/÷k¹®Z@Üõ.„'²ÌÒ>/zJ»n„Z’Õrp|à ,¾ðƒ@ü€eÁsíøv×»ý o€½™î°…(lÁ†Âð±Z<g”M 0s²Ì2𜌠î*tŠ®5nI,x—9†Ï–Hÿ,qôïÌ]ýBBe.û/ `µnV¯¬ÂÆ Y2fÕe3ÎûzÒ ÌÑ óyZc=c÷°8 -*m«VméÊ^1Æ4Jq‰"1‰ëáŸMi$*Q±L´§Êt€<ÍÍS5)W¯jDNkÕVe–;õÜçYkd˜ûþÉ#aö¨Ÿlþ˜Ö¾–0H‹)l#=ø×³¶õ°“=›b›ÏÈV6´‰³çfSÛ ÏŽ6¶/ÃìjCøÚÙþ6b¶ÍíîzÜæŒ¸ÇÚ„‚ÔÃÁu»'!^ŸÝÓV·±Ù}ÍÜ98ä¬':ÛÜzCçÞøöµ¾W²P²H!b¨)‘>ëÙOlF‰à41øÁ=Ö}¦Ye[8|OS"‰Ö³DµxLÒñƒ.Ðg=–¡¥§7¬îôÔU55Íß(ÓBõ¾;ªN‹š¦þzå0QùÊå¹Lµš~Ǻìõñk°€z“ÇXõÄŠl²"l× û×ôvî³F Ò“ÞÍ /o¤ÇâþqY,1¼éVî7£»q‡Û¹Áê=xœÙÏ®;Œ«=Âà…­xUf`/E¡ èDp…?Fȃd½»¯å÷ë¸ã]ð,I{á‘Éö›$¾¡ÝA KŒ@Ç"áq…+äúP$*ɇ1ûÇÜó¸!|èÉ=V"¯èÈTš³>ò'ÌùÌH~…Áãó¯ÌÎs ä’0ƒûÍÿ² ]èûÁ?ߦ"§®˜Å$·úæ‹Ã+¢°jKÛ<Õ^ÿ¦é¯iêPg> ÄþÉ_¥ušôÄÑÀJ€^ùÝR¹FE±¼aˆ† àï- ›p< >‡Z *5`ahàðþy`Gà\š '¡` žÛ ²`$¹à ‚[ Ê !Ñ` fÛ â éàF[ú  %œE¹–ü—ID ÂI“ZHEÑ›½a·mœ9-T*aÞü_»œ°UTŒ`ÁQ¡wá¾uÜYpÜøDÄ)HL\˜lž®Ä@Æ’áì˜a@9ÝŽÌ¡íåY»=a6áKôÞÅá¡hµú¹ÊÄœ8Õ L)S9TéÊ"ªL΄ÏýŠ¥dbÀ•ñô”'þœi K¬ÌŠTyâ‚ÄR5ÕS )ªbç""†ÕÒ•#VÖ”ÁÄUc=VdMÓËÖ•^¸ÐÕ½£Í ÁàÐþaY]Ø™VÉPŒÅL̼(cZ4“cA–dK4*c -Ö¢Gž÷¼œÊÀÝæÍÍå,וV…ü‚lo/~ÊoÉcß•Ü8—ß—Â"H0×±ô<†£v!9–ãX…:FÞ‚=bäXD2Îæa^~Qå-cµlÎGf:˜î¡áXd‚UHæ}$³4Ø6ä ’VÛÍ#ô°ŸuQ /fNŒÍXqÏ9žcØTHäÞîäê%ò„Oì­QŽ¡˜©4¿õ$ÙQB¥ªøaÜ¡LJË)P‘I’!“í¤š ›yXÊ™õ}÷ÝOþìÏ÷¡ÙêÌ%\þPñMŸ©±¥—bH¬Y›•P\†]  ŽcWÆ“"ŠÔý N:âÐÑ×͈©¥¸\þu¦ýP©Q  «yZ- hê_gJ‘ú9¦SbâüuÚ*e–Ú±`k²b¬Ådb*&®Æ„®¡œ"fn&¡²qåpºIqç°!grRÉr2g19çsâHtJg/QguÚÈubç.içvzHwzç,gxÚÑn’g šçy"ˆRGoÁça䣊6MàI°g{þÇ{¢a~ÚÆ¿¹á9µˆ}:àEŧe,T&` þ'û¨¶4\9¥F¶h-hÇþIHÔ¡Iø§„Ò…Æ'î|\ÈÑÉè‹ýˆ®aj¨‰VÒ‰¾ÒbVQD¶Ÿýe×gUÍ‘âY™"±¤¢¾Ñ&U]£$˜ñ$+Nâ+F•±@f…x"d’ˆËõT“ÕhTB˜þdý½ÚKBhŽ~àX câébgIÝ)PÝ3r2ŽÔ4žŒ5ŠÝfÙ$aŒ3ŽÝãcÄ6£“êÕÅ©Ê(ã..›@3êfµ‚+„&˜‚Êm¦g/ÍçKü&~n¿YFp–ßö­zˆ *†‰&nrŒç⪡8-ä¶ßNîø=îå‡äjn˜pnçHæ‚®à‰îèÆ’)|ë¶®ë¾.ìÆ®ìÎ.íÖ®íÞ.îæ®îî.ïö®ïþ."Xnêrç{¯ñ/ò&¯òŽ…ð¯ó>/ôF¯ôN/õV¯õ^/öf¯ön/÷v¯÷~/ø†¯øŽ/ùZo@;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_20.gif000066400000000000000000000204521343257752000273340ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÄ¢¤$"$lfdÄ‚„ŒjdlRL´bd´’„ĺ´T><<2, ôâä\NLÄ–Œ”vlÔ¦”¤–”\F<„zt”"$äÚܬRT|b\D:4Œ24¤‚t$Œ4&$lZ\¼šœÜ²´ÄšŒ¤~tÔªœ|jlŒnd¼rtüòôœ~t TJL¼’„Œ><¤ŠŒÜº¼TB<¤BD„´Ž|D2,dVTœvtüÒÔ|^TÌžŒœnlôÊÌ´jldNDdJDäÞܬZ\L:44.,tZTܪœ„j\”rl¤JL̪¬,"ôêìÔ¢¤\JL”*,„f\œ24¬†|,Œrtüúü¼–”亼TF<„ ÄŠŒÌšœdRTt^T„jl ”ŽŒÌ¢”lVL´’”<64Ì’””z|\JDìÖÔ|f\¤‚„$Œ4*$䲤Ԫ¬Œrd¼z| ¼–„œ:<¬ŠŒD6,œzlüÊÌœfd¬žœtjl¼jd´^T¬NDœ‚„ôÆÄ̦¤t$ìÞÜ<.,ľ¼dRLL>4,&$ìÚÜĆ„´fdôæä”&$¬VTŒ64Œ¼žœÜ¶´ÄžŒ¼vtüöô  ܾ¼¤FD„´nl¬^\Ü®œ¤NLôîìÔ¦¤”.,œ64üþüä¾¼„ ÄŽŒÌžœ„nl´–”Ì–”¤†„Ô®¬œ><¬ŽŒüÎÌLBD<24”vtÔ¦œ\FDD:<$Œnlœ~|TBD´Ž„Ìž”dNLtZ\„jd,"$TFDt^\lVT|fd4*,¼–ŒD64œztL><ÿÿþ!ùÔ,ËíþY H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -™A€Ñ£H“*]Ê´©Ó§P£JJµªUHAµ«×¯`ÊK¶¬Ù³hÓª]«À…¬HêÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwhá§Ê›7c®{YqdŽ“G÷-­ZîãRÆŽÑÝ:sãÓS×)¥äÔ'*ê¸a1—…›ÝiNÁè —·oà®äÉã¦TЮå.!!‘%®™þœ’DB†\Q$R`·´3r¡!ÉÚóé×7ïý;øu»ÃW]rËí÷œHGuØýWÇvÝ}ÞxåÍ…›FºuÀ )JSªÔ<F³©´£mž…x¥ðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àµ„ÇLµL=ãG—W#”Õ¥c“lŽÇê°HÍ’1kXŪÓz=hi«ÙD)—½ŽR“(Ûhú¼m®–(3 JVA®vr-%+»:¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J—Ãí®¿Þî=|dèƒ_t@l’WŸŽ‘¡úT‡=õEyP–<kMøF¾y‰êaî Àè  íä/8ýk#¦±†AÂÂi$x›~)…™øþ@ÇA%"všeDóÞånô 4$µ_ ÷åD@ØQaÑÔ¥Ç`1¦vÝ"`Ì Í¾ø*™ïÌ¥TûÎ*{Gí›kRìIô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿œ¢`†/¥œ[À 9©crþÚÚH%³«/H Î_XpØÝ*¸œ ÎKêÆˆË­F€,Óà8èóþ…ÀdÕ×\ú€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥$ƒÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÑà•æÖ4#»–fKiò þem»˜/Ds–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó:#ëuë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínu ƒT€‚hÈІ ¹Eê:0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë ÔÃÊsöñ$¯ïyI SËí©U»]JkOU;ñ¨î kyl“×ÕÖZ’4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rVÆt€~(° @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V) ô­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢€`Ð þÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋ~ ¥0 W0b6˜0Xuóocu[d'#C0zQ Zà§Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹“CR]VzÙÖ‚H¸¬ÇC®‡ŒPYu ‹h}tØ|~1{®L¥ ZP‚¿—A¸W[¼uÔT§ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†u@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçiXkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh¨lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œXžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹•OG™¾8Œ¹·{µ¦š­LpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3iyPi2°y§ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Úá”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B¥0öD^Ù•Öj½"PkýÖÙ¥~pt]×v}×x×z½×|Ý×~×€=ðׄ]؆}Ø{½Cs€£°Øí5€” \Ù˜ °€›Ù Mžà lÀ {@ ¡Ú0Q 8P ¬0 ®à ª=Û+q ¡ S v@Û¼m.°0NÀ½]Ü"A`àA¢€ ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þa ª ê½Þl€¥mÞð•0ô=¢ `PßNßü½8€—Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿý5žã:N׊Ý×@¾*" OäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!u¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôBOÑ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI™Í ÛŽLÐĠɃ°ÿXt1K’`T±ËŽÈ1#F@ÐjL/ÒŒ.±ÔRK.Ï„3N9çdþ³M‹c.O=›;sO?Á›3Ð+ͳóN—E4QE=ª³Ðß\4RIû$ÔÑG4P+3¥³RKσ”Sò–(DÔN?½óOUWeµUWõT$‘Wg¥µV?=E58.àµW_6Xa‡%¶X^1Ác—e¶Yf7È5Zi%óÄQŽ˜6[m·u4Q&ÃnÇ%·\ÉœpQ¨0·]wÝU—]Sœx·^{³#\V¼â^ÿµó†KDªv€Fx8 p¨e¤#lI8b‰»ze.F:‡E&æ¸c‘Va€$.FÃc“ŽPJ¢‹“_þ79L‡7`Æù]+4 ¤gŸþÀ!œ‡&·’PŽEQæ@z¢Ÿ.†ºjr¥¦Új­³Åzk¯¥íúk±- {l³µ,ûlµ L{m·ƒkûm¹¿Š{n»Sªûn½IÊ{ï½ûöûnÀŸ{pÂß6üðrwu¶q`¥þÀqÉ{…VñôlÅœ9Ey"óÌqµ¥PM´ÑÐEÇ”tIM?Ý$Ë,X 3>‰†Ì3ÝNÖ[ßòP„bÈ¡Û'TwÐy'îP¦¶b¹¤'xš‰<`ð€Çe’DŽ,X&=Àç—;¿Ž%ˆˆ "¬4úò_ɲÀÓpÅh2«ƒ-·àH@° ¸ÈéÃYþȳ¨€ Â+žþ2Sþ¥œà#Ò€œýý†~*y]lfSò‘å=uèÌgÆS H9üSf4ӛܭè=8á)€2äœpEÇ£‚¶Ó"g1uPNž’F|¢yÃ+âð"H#DVZ‚$ªèÁ¢#ý‰"xÜó°À¥°€RdTÂ)I‡BÉ  vÄCuèC! SÆE¶4H»‰€–€$¨ñ/jc-ˆA Fñ‡]ôb”ĤS8i-00$Ahd#ÕáÀÀ)®É0"GOEϊо"À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%INá9f6³VH&IÖ"TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9Y¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?¥ „¨.*Rƒº*V5uK ǸÉ9n8BO%W9‰Fkd8YQµV àÁžPªÕ.Š)ˆÂQ…š À V„‚X}D VP dkΜðUVh•«i…YU¯*’©Âf³xêH˜Zþ »žÌ¤ ‰'FÀ†¾zl8ØDI°‡Âv, ™¸Ij ±ÆN –èDf5ÛL¢²«D‹W¸b£ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN—º`1B ´»]îv×»ßý.À0ð–×¼ÞmDeSö¶*ê€ä;_úÖ×¾÷ï}å›_ýö׿Ëxoc×ë_ãw¿.p‚ç `øXÁþå¯ÁúŽá>€2p1_\(#¿^p€ ;` ?Â'$h!_Z@B~†æ{‹þg|ø¾ °1܆b˜µÀ.0ß à˸Þ0†\b&ÿ¡yØÅò[‹SœàUÞ/t1_FðAÇõÅñˆu €alâeØr3‚1ßX Ã0Q‚188¿+ˆ†¼ þ¶|˜/p!ø@rÀÅ—éæ¾’øÃ­¯ÌàƒZcø†ê{ˆSØY¾r¨…|kág$¾ñF.|ð a0Äòe´]í`OÐ4¨‚|<0ÇÓ>0Ë} þâÏXñÿp Zœâ®¾±ˆ=æSË· Œð# ðé8  ¶@-ê)ŸbW5“c€5þCÛ¾±†ë¬™Lke´!ó=Å-þ°‰e„Û¿Ð3Ÿ‡­Œ[È÷.žwµâ»›ÖÂ@æ+‹H¢¼·“¡,eL€ô-Á…_íj=ÁZÚ²¹‰U¾rÃ;­$fyÌeí†ÏÜæ3w9Xa~sž«<çXÝyÏ…^àŸGUíEúŸŠQÙ3O‡zÔ¥>uªWÝêWÇ:Ôåð‹šÝëý-ºRƒþu²3<ÇeGû¢Oï”§]èa/êØÝ>t¸KTîsïyÝåyô¤÷9KolÓ³>x¾ð[ï:Þé¾ö—·]ñ8g¼Îÿø˜ëœw§¼Ì-MÌgžå›Ofç=ïóÈ%Ýï§/}T³{^Ö·Þõ¯ïnz¯;{Ú×Þö·Ç}îu¿{Þ÷^b;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_21.gif000066400000000000000000000727321343257752000273450ustar00rootroot00000000000000GIF89a+³çŒ‚„LB<äÂĤBD|Ä‚„$"$lZ\Ä¢¤Œjd¬†|´bdĺ´dJD<2,4\*,ôâä lfdŒvt¼–„ìÒÔÄ–ŒTJLÔ¦”D:4„"4&$´Ž|ܲ´ÔšŒôÆÄldRL|f\œzlܺ¼ ¤–”\F<|^T¼rtÄžŒÔ®¬œ24„nlœ‚„Œrd„f\TB<ôîìüÒÔÔªœ”"$4*$´’„üÊÌdVT|jlœ~t  |bdœ:<”rl„j\lVLD6,¼–”L>4$,&$Ì¢¤Ll¬^\Ü®œ´’””†„”z|ä¶´¤‚„d*$ÄžœŒrt<.,ôÊÌ|b\Ôª¬Ìšœ\NL¼šœäÆÄĆ„¬Š|´fdôæäìÖÔÄšŒÜ¶´ÔžŒÜ¾¼¼vtŒäÎÌüþüìÞÜ”., ÄŽŒ´nlä¾¼¼~|Œ„”&$œ><̦¤¤†„LBD<24¼–ŒÔ¦œD:<´Ž„dRT|fdœzt \FDTBDtZ\$,"$”vt\JLÌž”TFDt^\ŒnldNL4*,„jdlVTD64L><ÿÿþ!ùÍ,+³þC H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°a…+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ˜  ƒ×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μùn)V ÅŠõëØ³kßν»÷ïàÃþ‹O¾¼ùóèÓ£ ~;ûöÙßßO¿¾ýûøós‡.0uý(à€®×ž|ô!8Ÿ‚6èàƒ.]~ýá…f¨á‚÷1Àƒ`Ç`w#nhâ‰(JHa…Õ¥èâ‹0Xbz23ƒˆãÍãŽ<žÈߊ|YØãDØ“œ¢€uï€Ç)“ô±@FLÒL® …T„hÅ{ƒôp 4°AEוAÅ—OF9e•W2©ü‚¥œVTqÆœQ…uƒP¡Å+€)&™l©è¢þ¤^B2*é¤çÉ"Eš|'zhÂF»,ãiÈ0É\0ÒžŽ0¢‰þi3ˆÕIáFˆœŽꨥ~9§ øáå{y0ÒB Œäa]§"û^«¯ÆJé´Ôæ8á£yEZí¶Üž2C 8~9Œul0®lÂ$Öá@ž}Ìb]§XA¯§4Áä¹åò«®¯ñY7‚²ŸÂ®îZGÂÁ8¼ï¼õr+±ÄŽb{—¶g¼¨-ËhaÄ›†»éŸyN‚')¤œ²uyàÈuÆŒg¸ƒ³À“\…ÉVäl]²Ž½cÅ×…±ÑLï8È„ s¸0ü.À¿h’ÝQ˜3,µÈ8ôAË{·{õÂí¾—uÓp+ŠtÒs-÷ÝòÃþÓ²Œ-6À¢úÁÏ2bÁ 8ðÁ7ëÂÄŸ2O-v“Ø•@±Æ"Kp ÊHá‡'Ž÷è(ÎMw\v“®:wü2 ]ø9ZÒAÉ`ÎÐÇ$h˜@C2×9BÃß³KŽà ¼W…|: 3thQ( ºónÂêØGhúéo¥žý÷¥ƒ/þøämÏ}[Þ“¯¾ƒD¯ï>ö柿Vúïן_ûöçßtüò§E¿þ  È¿þ>8ƒÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(´ a@Ô í…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢HÂ匢§˜½:q,P¤¢·ÈEŠ]ëŠókQÇHÆ2RËŠ`KÍÈÆ6ºñAhL£W"õÂëàÀ»Ø…ö¥”iAò²‚„ …Iø¡E0$ˆÈ†G=òQe»`‚ôŤ:îÇ€¬äЮ3ÈBR“ d"¯S¨hr“ò¹c÷³EJî°cåÈ:jZpÄ0†á-€ `MÈC¬0‹ 8BUx‚ÂæØ(\¸Ô%/}‰'6Øâ ²ÐÚßš9/a2Ó:Å™otS=”ç=–0‚•­“ìewÇÏíµ´‹ôk`óDØßqv€Øpßc[çµå7|,PØi››GÕ¶¶N°-ZÉ ÂÞ¶Â.þ*žyHl>¸Ã¹÷ý¢t«'ì&Š„ óPÎà4šY˜Áï†û¨Òÿær‰•·§>é¬â~“-¢àˆÙi‰KìœS›þ:p°#%iI_úx—¬s šš\I€:T™ä„×9©W*;SšÖ”í™Íâjú…üñšð³XÇJË2§t_ÍA כݩRuÐ9‰Š =pƒu,…)M}iꪲ)µõKeÊ:ЂÕ1üæ°ÿL´²‚­pN䃣ë_BÏ;û ^t¥ð3m»àö¥Èâ þ’ÕHä/–KD‹ïÙ­à-p]çaöŠ˜Ý÷yùÜ+_èI—ÞG_ ¢÷]&üôYɬ£ú1é#“tÆ3èŒcc²_ƳSüÒ ¸ÿ˜Ø-¹y÷Ð>l-{zf1Ò;_?¦?=LþùÁ_ -0‚)%þoa4)ò¶?ÔÖ¥6ëMØyÚM߆P¢U­übãš×äçî”ÏÏ?~¢/}—雀r2 ¿ð\nÐl  ËÐ$Ã#p’£7|Ã$ ø€Vðn×!s°Z­:ø8"E‚C8äÂ8Và8ô&z oúׂ*ÒNÁOËÓ<:Ã<à:-4Z£=ú£Dº(Aš¢CZ¤JÚ#Gê¡Iº¤PÚoå¹£)Ñe#â~í&2´X>̦lz ΗŽ¢¡"2¥TzVj{j –ŸzhÆøaxÐ03ôÔ(`]+ÃW‹&¦‚Œsb¦gZþi `$c…y¥Öqœoj0ò!!ç§÷V˜è¡ ÀNƒ°Zgyzšp?®D©CG#¡º]ãáñ!¨ƒ:…ŠPá„LÊ”¨>eŽñ&©2™¢ºŸÚ©èd«ž:©Yš«q3O»ºˆ4‚«¦*ò˜ª«ú›Ø‘Z°”(ƒ2=›%(„B]U3#w0G­ÙÊr.‡$0·Y2Gvìa"ҭठÉ$m"%Tb%w&ù–$‚R’£'|’qlòc¯ˆâÐ*­|•®Šù%üÈ)r9'%*"7×®Ñú®ITIqýJ2û®×Z­øã!ÍÄ®Ää® ¯oB¯9°VÐþ°´³%+W²;­I‘+KÙ¦¯x¯¯{³ø$˳þ ®Ö*°8ÛL: 0D‹;$‹´“÷sÚ¬1)6‰“:iÌÂÎâ“\û9Ö[_“Vxp[ÛµVà’e×uÊ-kG“$B¶Öqµ9É$ò)»ò)½"“o‹”rÒUx‚tš³“žÒ“VÀ·ÞA·Y ec{.0I› (Rp™×q R±¦â9ÿ¤¸BI”Öa”#¸MǹZÛ,`{°x%²q[¸VHº¹‚·WG*m«vk›’àvsÛ7Y·¥û*؉¸¨¹\T¡+€c˺³;“û!·ée¼g{ºÀë·¾¸Å›t„þüÀ{wSKµ/a7c©0 ólƒ0M†æb–R3¾ Ãz[ùx] 1l*"—ß+.är¾Úk˜÷•‡èXhÓyó»¿”Ûõ˸@S\IˆPpÚ!{Êyð‡õ»–Ää–~bI–V ¾!–ñ1¿¬ÁøÛ/è«¿^1 ¬xœÁÖñšØ!À?eþËr\Â0Ìx%l}àÛ6Öqç9ÔWÃùëÃOY¦ÜÛ½%v˜‰¹§­÷M¶X™[RóÄ”÷{‚™¶ÄG©‘£Ä kÀƒ¹¢U37ãÄÇ'{X¬®ØÁÅ{jÀìtÅà1º³}0˜ÛV«gjüŽ ™ôDƼgþyÌz:ÓÁA~€Œ˜]|U_¼§W¼{wÈ=CoBÆ(Æ8SÆ‘3ÉlÈ‘üÇœ'Ad5Zc,ÈžœÉoÅ|Û{Ä,)$š«)¾á»Ãä‹\ÑVÈ'ËrnMú OŠ™ £„à^âæ9âQÚâ¢â¾Éâ.>ãÚãà>ŽNã:¤6~ã÷˜ã;äFÚã>n’@^È^[ú¦¸(×çÁàB®w0¾™­Z¬ðá¦A §í俍QNzSŽ—Un<)Óc”„áÜÁ¨Yî¨Qäܪ_.åD^äTyäŸzpÖ„MÁlåþæÇÀ\𬲠ËçyæS);­Øz´‹^|•èK±Kyãzr@Ks”œ~.éïjVN!Iègè%iµº‹µ^‹¶Ï[|GåºØAºjk[Òn¿×±ê¹»»‹ûê§Î»ù+êAGêöè½ÌÁ]|²ÍÂ*U¿ZY¹îÛÃ'lëÇ®ÌõûëÀÞpÂ.Ž‘ÉTLÅ©µZŒ ˜ÖqÅšœËßAÅãžÆˆüÀªœí£>çtž—%ÆÎ<Ëù¾ËØ¥]øŽ øÞËèôË÷ìžÙaì<Ï›‡ïñ¨›ò¾oÛÞŒ‘bÔÑnmñmš`ÚDñÖáÓa[Õ‹ oȹ7(þÖqmÕõÖïÕVàñ9ÍòV žÏoï‹-݆]Øä­ó|eæ×܇ËÚÇØïñØ®…‘}Þ”}Úy"ÜÑMô­ýôÉýÞ3ñô^ïœiç2¡mø†úåUßk5‹2öfßX¯ŠZölocŸŠeßögÿö¢÷röt¿‰v÷3Ÿ÷”¸÷|/ï~߈€øÀ>ø˜>(nKžå¶ö†ß‚ˆ‡Šÿ"XÃàæå‘Ï¡WŸö QùêI’tæêœæ"ߨhç›ï‚“_† Ÿp¦çÁº´úç2è«/ùïù)ý9‘Êg(÷Êé ¹°Ûôè&é2;éÿ(däþŠrP‹é{*µ¹Ïú»Ïû)ÌÖ¼®»’FuS®~°>y³½aSÄÕŸ­ƒ‘RÏðíô+‰%š RíÛÁìíkyп¬þaEà@‚ D˜PáB† >„QâDŠ-^ĘQãFŽHJäH’%MžD™RåJ–-]¾„SæLš5m² …à¤*$@¨PÑ*À ? j’UôhR+N¥"%j冶–i1rèЬN­Z™uÊãZ¶mݾ…Wî\ºu)‚¼™Wï^¾}ýþl3'A#8| ü¥É ‰2i0Kð¬•<42v Y)AÌ þ)SpМ ˆ®J° »­]¿†[ölÚlñÆ[÷nÞ½g†‘& g6[qÄÈ ¬­L0QE“ÈM²±uFÖièÒ© Ôba`÷éNe,ÈÇè¨È•3w^] ž;µíßÇŸ_ÿ~þ oû0@$Ð%à$(èpä¸Afèc4LhŽ_8eùªj&thb 1ÔP GvqjÄ bC‹Yºã—I˜èA%¤05ÑÒ¢§þ~2H!‡$r¡ÿ D2I%—äëÀ!Ãð#Â(²J+¯Ä2K¸Žd²K/¿3'µ$³L3ÏD3͆¸ ³M7ßÌmL5ç¤þ³N;ï”M8÷ä³Ï˜äÄ3PA%´P#Cò3QE5 PC…4RI±Ô“QK/ÓÑI7å´SO]«SQG%PÓOOE5UU% •TW_S§Ug¥µV[«BV]w LÓÉPÃ( ="rÊ#~µŽ¢)oe¶ÙO[å5Zi_òÕ¿ŒZ|"§ÜÈ!d² GgÇ%×Ph§E7Ý’ªMè¬X!Ùã:UvñÑ[‹|¨¯\ÿ¥ó\už–]}Ìð¦vd¸ !d°·aƒ¾u¨ fÆ8c2&¸c]„ -&xÁN¡ƒ6æƒ +ü˜ƒC¢ÈRÊ‘(~:å4+º`b’Sþ0e•7£ù`[¢hp“S^Ù~­€J´Hиj«‡äØc­Gu²F¸h§’#.cæõ!´2¢dø,–¨•’E é¾0q8 Ì>ŽâÍæÐ"G²÷>ûˆ>þ‚J+Ø åjÇÏ/ë­'gÔI ³§úȶ µtÔDÜ*´PÌmÉtždn­fh Îò¼o#gå‰^·"ö—ë›%й‡6Ò‘¸d$ß$È; "h¸Þ#5ÙH%JÒ“±’†<°IRrÒŸD%’(YJV¶²LLe,õ²JWÖÒ–X;¥,uÉZÞÒ—¿Ä,wþ9L˜ô˜ÇD&¨rILföÅ`1’µØhaK ÆJ`ÍÄÈdv3#Âlf8OòÌi Ð\œ‹¬in­%›´ÁÃÍš2ö $\ùòf>“¸Lqöó7²B§9- -L²ò²Ì“BmÝ ŸyçšÈ-,àzƒX€ Â/}v”UüôgH Ðr²qp„&ªð!¼°¤ÇyXÄ"1Œ˜®#¿Äd,æQž:œ" 'ÈDF2§(Mhss 3à81<œbÀ\uB6²)æl <óШ¸´¡¥¦hiêS1W…3L`gðÑT‰4¦)dÝÅBD³çÙì'XýÙCrúþ‘L΂j=l:Øb’Ôk`¡{Êv6M@g’Y†&ØÐƒ5êÈ)‡ [óTW·»åm±7lWd'[Ù<0¢a#Ÿ0›ØÁñ-!4ª‚¨ ‚º nt³›&ð&3é=P Ÿ+È)¤p=àÖ¸>)a•;’û $VÀîÌòP¥Ämq³ìeðç”Ô $C­»]ç>¾‰Y·¸§Àß_/çÜ͉×!ˆBmOç]Öi 3ˆ ²rÝãöW)É]®r“ç#z¯·},«Ã];e+]ùJXÆò<—–“ÁË›„@”Ç¿æ!FÁʆÜv½íI¸!Uñá=âZ“8[ªÙP+`s‘9¦xÈqyq fÜ#§&¶@Úi…{ŠÜåA²8É fï_½«PvˆœSn| „£/ú~b.suÑ\4 [˜MÓuže§A‡ú}†Ntt]šªEåêʾڲ—ÅŒ®à³ëÎz–W­è ¯Z5j[½J¿FÝí´™:Õ¥åA c óg–6-³MéU¹­8«[¹ dð»m-c7TÜ·7^™r§“N¡èçFw¼Oép^}w'ªó|xawy†1þÞñ§ŸKÜ!¿«/¯ÃHôÈB½¿[{îÞƒoϽ ƒï…îC}ðå÷íÕ;›¤“g/“çÕ¿ü¯öMi¬äD_ùyÖò…¿}w¿ø€¤»Ýñ.h縅-¢}F DÎíwAk…"rßþ7õþ÷™èD^D±š>#£,*.ò" 62:¤S¶UÛ4ÐB¶û“@P=ý#GÁ³‹hÛ›ÀÜ' Ü¥19ƒaÐF0TÁG©@Ä”1±-P,[ÁÄ“tAK19äÁ+ÁÁ\”ìÁ!9 D%!$Â$ì4B?AB%„Â`Ê¿&Œ8’ŠþÂ+4&¤Â=y‰ظó8s’nÃB—ÓÂ-œ$+l ”s4vê–G‹ˆ–+×;C4l£+›S°„й6ì¹vÙ—H›Ã‰«C;Ì5lÃêC:ùB¦ã¸š©ƒxºA ¹B4Ä"©'º:¶š­s˜á­P¬Š°³*8;ND*QD§£Iš¬c§§‰š©¡D‘³ÄKd’ð»»¼#—⻵aD¥p>< ê“2é#2Q3’º¹¬¾𠨲‡4¸ˆ”ÈÁÅñ‹?<3?†ˆR´Dá÷[:#¿ùû•ŸÐ!*³ ¢t£?AdÉ{sÉ— þó?l5`{-üµ,=uB54£©L£Ê 7‚#\ë–:º£ Î?\$¥,NÀ:Näœ%匦öA)•b)è”N‰GÜ9§»˜ìÄMÓäN'ÌÄ¡º5W,¥+§‚ªR«)»J»®€°Êϲ»ª±C;W\»¬h;ö\7÷|O>‰I]X€20‚§R´ ŽZ³CYŒU»Ÿ(šmàMªßYPëX?H:ØÙœ=¬0ØÑ dY×FÃ#Æ"V¼0"Òvþ¤~O/­<µ©H­_qÚ½-æ/è‚Q¨] õb!]¼&vb>‚bîÜZ|<0›`X![ )5[Þ30Ø;¶U=ã#Jcä”âëÛ‰Â> §ÀÛ_Ô‘6USëÓ"SIíëã=úcÝœáA-? &ˆ §\E>\<3TŸDÔøPTžd‡{`îÏ•T©¬TÑ} ™<]P~ÝtÊ×U°œ—RMeJ^eVþ ÛÅÜCtýeUæ;¬ÕÀÄÕdæÁJnÍâuLhVAi>Íöµf†ÃfÐÔæm.¸nÎÌogçÉ$çræËe“tÖr…WôUçN9çÄtgüþx×ïŒßØgH©g¿¼ßªÈßè’þ•¦ÿíçMùg· h8`ò†WNèHYh§´ØùÌØçÁ`MF‹-Ùu*aNY±Ë*¥X-Ð*XY*ʃSØ…Qá®*E”&;NÐ fÙŠfÁ`f罸df”¯Îa+Øa¥ða6b!&bf¬ÃSН¡¥ZjÕÒ›Ú#öY“êª5c ”‹~É@žZé +®°,6/..®•ÚªH/ƒpÚÂ(ˆã¹FZ&&kê¡Î‹5~=±u8–ã©(‹„Ícª°Òª ° ³‚9Ö°‡²ãìȳmìÅfµýë²lþÁŒ·}®¸%dCFäº}²ç{d蛲º¶‚D¶¼&FÖ[G6m†ùÛϳ–È¢FÜõÛäNˆOÞ¼P63ø1{€Ô2ná ®¾\b(øÃdÌEeÞžߦG¨|å[ÖʳZVÝ^cmOíJUSi- *ð‘Z–é±iôUõÞå9’_ÖîÞmѦ b^µ0æˆÐÝý~Ìþöo™ø]Áü‘ý5ðàánk¤f qðœ·Å{¶ðÙEð/¬ —Þ÷ð‘ñûÃðKÔðï¦7ÄWqdbq;tñ¦Gçq_²ñ-ÄñW_qœ(`oI r•èq"oþ¥§Â$Wr>ò‰ò'Ç7&oB'§rM²r#Äò,b#rh5UsCàló0·Ö1—— ¯Ì-Â.÷r4>s4çÖ8‡:7ÏA8·s$ÂsÔó=7¢>Á?te¦s!ôBA·ÀDWô÷atýsôGžHÿ¾I_xþÎ0ôˆ§ôÚ°ôâÃô„ÈgiZ¹µßO—º9?tÞôWó„ƒDžK¶W÷›UõU?tDŸòDœuˆ^:üzDm*s-[Ï\×õ]ï q›`n«éP¬+yrˆœ>Å›Nů2˜ž«¤˜vŸFv)Töe/à½ӰÖÙ.ˆ-ž=îÀs¯¼$Fwdþ$ˆ¬®=w·Úp¿LV§sqC¾/íëƒÈbŽ¼È…ØëqLks|ˆW°ÇÊw}P_=qƒR´%Ê>îLjˆ;6±)¥÷±Ul:nоâcˆ· ‰‡<wÑÖÆ!Ùfíó¼m6dX—gl ’d“x~Gsq3w™¼îÄ5nõóèX¯îÊÅS‘§PÇ54¢²ÌÕùw^*à*ˆÔI½ïÐM]A]v„¨ïaCï°4øÖÊð&ýŽúÇ›zÍìõ¸¼‡»ÔO_ûÔãù07[eð»—·¼ò¡²ÁÆ4Þ-!|óûTAy¹õÅo–ƧºÇ‡ü[‘|¢£| f½|þ™€3‚ÐýÑ'ýÒ7ýÓGýÔWýÕgýÖwýׇýØ—ýÙ§ýÚ‡}pÛ×ýÝçýÞ÷ýßþàïýÎ'¹Ä7þãGþäWþågþæwþç‡þè—þé§þÁW‚€€ê×þíçþî÷þïÿð7~Àoûòÿ‹R ;0ÿõgÿT²V  hÿù§ÿ 28O¨„úçÿþ÷0¡L eð „ 2lèð!Ĉ'R¬hñ"ÆŒ7rìèñ#È"G’,iò$Ê”*WzÂ"%2XÒ¬ió&Μ:wòìéó'РBo‚"³Ã`›-C—2mêô)Ô¨R§R­JÕ«ƒ[TYíþêõ+ذbÇ’-k6”ªT/¡tö-ܸrçÒ­kWè2™Ž2u÷/àÀ‚.ìõÒ‹„•>ý0ìø1äÈ’'SFø#Ç’„Èœ¨ìù3èТGûü@F‚B; H³níú5ìØ‘©mÛvŽÆ²wóîíû÷ØM†Û©=|¸àÊ—3oîüæ˜ÚϧS¯nýzÄèd°sïîý»líàÇ“/o~°øóê׳o_5½ûøòçÓ§ ¿>þüú÷O¼Ïÿ?€Î矀x w"¸ ƒ ò¦ ƒJ8!eRx!†Öe¡†zøaW‚8"‰%þ$¢‰)ª¸âI(²ø"Œ¿ 0#5Úx#Žþ9ê¸#=úA ø8$‘EIdŒI*‰ñ$”QJ9%•UZy%–Yj¹%—]zù¥•°$™e~€V¨¹&›mºù&œqÊ9'uÚ 'wê¹'ŸRŒi& V„&Ÿ…z(¢uæ™(£}þ)(¤‘.Dh£•* ÐЄ‹6ê©¥¡Â駤¥šJ©¨©²¹(B0Ó©¥ ªª*©¦Ú*(ª³¦êiZ¨ €#QPÅLpFV`Š©šÄ‹¬šƒäqÊ.Ž4[ì±É*««®µÞú-™¹rëš½þºÌ0VäÁH -0’ǯl®Ûî»jöÀˆ&œ¡æ¼îÂ»í¸©z .þÁ0Š0£‹Ã¿j¢æ)8¨‰ ñ®ñÄ[a„ÄlblÅ#léÀ›œâÁ#º¬ipªì jN¢m“ˆlÅÌÍÚŒ³¶kælEÍ7«œhÉ' bÊCó)«È‡ 0Ä?Íq›NkÌ´Ò…}4×&õX{Úo½VhaÁšdÿ¾úòË®¿Bƒíh×uwøõÜtнf뀶Žì²hßk+mtX ´ß.wÞwnm7å â9晋:yåx¹æ¡‹®õ£ž›n 裫¾zœœŸþ:~©³>ûì®Ã~{|øpï½ûþ;ðÁ ?<ñÅ<òÉ+¿<óÃûPþ:îÑÏ·,õÕ[=öÙk¿=÷Ý{ÿ=øá‹¾ôåOŸ&íé«ß¦íæ»ïìëËŸwûïÛo]üóë?tý÷ûï\þö'ÀqõïN¨@Aï€ ú(A¥ð|îš§Á r°ƒü ŸwÁ.g|&¶î=³91nzÓ N%:ÙQe¥Ë l@“wl΋¥sEnhŽÕ´ã؆÷Ç­Í•?õ™P¯n4føÚÎÈŒ]ˆTM-èA­°ÏT*”M µ°—óÜŠ™¤]3 ½d5[LeSHGj…’æô(ųž# Çt¨4µ©šp*´±íÔĵØv­ðÓ Zº¨ï\SR!-iIGuªUU+VµªÌÁmšoþ{ˆ5Ú\+”õ¬iuðZe]gUF—Ë=^uuïš×¹íµ¯Äå1²WMXÃ"¶¸`ìr´ Ù(H–²Öž!¶³]×å~;}á÷SÉ]îÚݵU÷ºWwnw³ÞñݼéQ{+ð·z:b­àWy·[ß§å·g·ë°eq«]übèòmpk’»ÒU¨n…îªé»ª“øÄcIÞ@«*áŒ:/pÓ+H|<ä™…ï"IJS’Î";ê<àxæ¦ô$(EißEÍBZØÅ^æ_ ˜ÀÖ&V -PÁÌ :ƒ}á<ѹÂo¹ËKiÛØÃât&ŠUÌbøìhþ&1‰Ì›¡µ  ‚ ~•ö·XÅm#¸ÀFô ÆkšñÜÝ÷,;9š_»xù¼M5±ó›X6©3£ e-;¾òFF§:IÎ& DáWš²ã@N™³Êkòüåÿ¸eÑòu3ÍÄLg¦ñfjžó„ßlЛy€t˜0¡J³¢ÍV~œ_Æßùñ¶O®ä-êgÌšñjf´›}3”AƒÐ€÷5ªúŒy¤"Ý~£Ó›R–_û÷¤å†ezé›j3Ðé´.ퟚŒÚ•ÙôߘÀ1 Áÿ9ÓÞüK¨  © ›š¤šõÕßnµUYU¬mUWuŸïþiÔ ÛVõZÍÚ¢ÌÁ/:5 BIPXY‘š¨à¯`ž…í:•² ’5[¢ Ü¡kMÛa%™œ<Õâжu›ªV! ñÛ½iÎr! yábNŠá‘aÒ¢!ÅÝÖ‚[º¡ÈÁaJÐÒá©á ù›Æ —À=ÛÜä¡þÂÑÐÂÁŠ<—<\äb!ÞOÅYOÉéÊ0Â$ȼLÆ)"Ç œR âFâíÙ¡Þp_%ÎÊ4/‘ Ü¿ÔÊ $’¢ûÀœ|i]ÍMØÍýJÎ5ÏiÓƒýœ,˜ÐuÑ!ÒãþÎ=ݯHÕ™›Ð @LF!cƒãÖ *±’-Ž".FÑØÉ”ÙáÔÕÞ­ßuØÛ}âÕ¨ÔÝÝ岬c߽دÞà^›˜#žšÄ£;.ÞÍÌ^ÖÜâ8JOöY;Å 2™–m^ãQÞ•AŒë•é™ÞD¢Þ¯¬›ØÂ)xÓ”adèYäCú`E²áBîåBí÷É îA ßßñMß§)ŸÎ°ÉœÂ\ŒóA_L"ßÍTŸ(¶ä¸YE]ÔŸæÚ¢E嚈ß‘Ÿù¡_ Úú +I,Ø›šû)øy%›<K2eºÝL‘bÚ6ÚTªþÙ\¦f* &0`W: þ‹#›L P`©Ñ%ãiàRº%ÞSHÕÂ[±`D&^&¯™Õ r­Y Âà Ðd4jA öWõPÒ®é e [–ÁÄQ8Bæ ¡Ia› !¢(ácÚ¦D9aµå¦Ö&p¦ajEÖdeáh)äqvÞ¡=ç¾™¢tÊ–qRçZçuêsjgÝDgwÌw‚'׈çxNSvš§$rg¨ø¡"¢oŽgy²çÉ g"*JÃA×lJg}ÚgÁŒÜQaÊ.0¼Œt¢~nÜ…"}®'€š€Z ØÂÈB'ɢƩ\zªÉFè·þè¢Ì9}õ"OâW¤6*XÐmc‰ÆK×cw~(ˆÚJ9$Ž©_›h‚¢ ÓáÉ]-Ó;ª$B^'Öh©4$JZ^WÊÊ ,JInRFZì©ã¥ç‘"i¤¼$ÐÔ䉪¤h‚6Ÿ@ÝdôYR.ÛŒB¨–ÂŽ’V%*2žºÐ@û!ÚûÁiü­åü=h›’#\æßbòŸZ:™…b¨š &©Ù˜N¥còiŸ‘¾°õ hæØ²èêv¦¯½f[‰Œlv¨q±é£znZ oÊ|®i©þpB¡¨²N–¶j¸$'·-g¬²­Þzæj¨Ìê®&I¯új¥k°Œ{+þýë «² ©2ëш'|.( &Ê¢¬jnI+rL~žâ"n¶òge+·¢L²Î$%¶‰‚‚ë'"ЧxÜjEë¹hºÚ¥è•e¥\¥xŠz)–¹Ö+‰äŠ6ò¢7®™³dËŠbБ(ÍÁ¨/ŽžhÀšhÀÄÝÑ%¨Êè¶ ¬å A*^Žæ0É™Œ)Ž‚i›PÁ³…Á¾Ð#Þ‰L‘:TÀzì‡`Ó”V):rHF)èYYJN¥›XÀ)ÄÌ \]Å–ÔÌìÒ«ÍÚè=¥œ¡iNùó¥™å‰J¡¤É’N"¥*©iÇ>­ý V¦¥8-™YÚ)ZZ¥œºItþ€tYZVž_–±å¼šm{²É^*êjÚš•,¢*¦à2f`®Ó ¤š$àfY£.UÍú-†äŠkN*gŽ ÂÞÚ ’•gî úà¸Á›(üšh¾` ZL¨¬ÓZ.¤P+_% #¨®ª ¢\U®ìNˆ³>k ÅnïÊï/é où¯ñî ï"oƒ(ïòJŽð:ï’@oôÖIóR/‚XïõÎIöj/êÜk÷Ò&øº©øŽLµ‚«|ê.´•ïép¯›|ëœ, #:â·}¯ûÈ$fW¡´ëü¶Qƒ–þæ/Œ\y퉆*"‡Þïô°Šˆè|=¬Ím‹„¢˜¢Ÿ4VÁnR6þ¶èsÝ„yµ °çÇŠ¬8A˜Ù0à ᥬÉþ(É0ã1-g‘p ×Ç›ê,爫ÄÑ,DAͤÎúlÎ^äTâp¹6ðì=…™ÖÆí¢˜À/ 3ÌÀ¯,ß³Y™ÂYO¥RªÚO«Söžö¤Å Œ@Ñ~$û¥ñš´íUÞ©ÚN%ß’qßçŸVZâ ê§ùÉ¡)ËrAê¡®Ñ&f•âþÑäÛwM¤n¦°q®ÈHPcÔ¡¦ zª–mjæò gÆ&¶ï$Í©òÉ28¨n²Iªжg*›q›ÖÊ $P#:ޝ÷:q-{­báþÒœ‚à+0Ó‰³zÀï2³0;3…@s4¯I3SsyXó5ª6 7_s63x„s439ÃÏùªLúþopܸbgMs:[Î:#ŒüÊ ýŠ+¼’+iÑs=oï={Õ#Šÿê3Šw9(vô© ´7J/è+/( ÕbC;´¤¬;ìÏÉäªèWÂjÒÒéœÓõ³hÖyt7´šX,žôÅ.£ÆB:ktu€,Ê¢0Ub׈•쉹;êã dO ©Aþòš°ìš¸¬À¬=z «ONëôtàìIR©´%%YÔÄ1E>™GâLëmµp#¾ñÑFåF.þí•â4@cµþFmÖN-Hoš™Yíâ. ™ºÙ]KŸ¥ÎI×òØŸØRÙzç\ÓußVÚ­{Ê õä¢Ðq´Ø±d3µ‚ѭݪIÞr%ÔäqF;¶™äJàæ%_Ч•X_'²O12"ßå›ôAã® äþ¥ä2ôþ\µi—Ð=òèVj­5‹ç¾¶“‰rè‚2–îé¦îšŒfëÌë*oÿ6Ý3ÂÄr¡Ü®³Í3v—‰9/óu‡woŒ70—·yïz¯z¯wl´w÷¾7|cvwóJÕ7²â76¶~·‡9·3B¿sEø,—ö?ð}3צj#Ƴý‚w‚¯ˆ ѺÊAþÇÉ¢¼ëÊ,4 Ñ÷„‹F…£â¡L4¸¸;_ô‡ûwˆ›G¯47š(™Uðš\p'Oã#mÁ²ô)ð}µ LWìLg¬Ò½ÇÊu‹£+›„¬Rì%©0 »0?ưOû(R×°OÇ-›8µš@µTËl\ÿs’›ˆV-“î, 1+‹+1£uW«5Ñ-Ò¾´ÒRu˜[7‹y9Û5ãubšc±+ ú}ýõó6Õr­×öNÆæb#8Ÿ{Új6‰ »±™}åÓÜ1f;¦ç©œÌmÝÞmhï힊y¥#Í=¥¶#r  2vò!ÿ1l/r¢ª6m»‰m;®ä6þ`BM$#y«ßlp/·æ^rhfò&c ~ò²oUk*;)æÈ8·› ®êJwiºî)ëù±#{ª´rDË wó‰w'!ûŠû¸ßÍ‚‡/û2Š“÷ž¿;þÄûF!³2󷛀8¾‘¾û;´<1ü#Þ»Á?‡|_/À/ü`4|ô><ĆÄ//ÅWü_ §€k¸š\k?Ë3ìj¼„ˆg>{|¸*t#†{Ó’|„Œ¸W¨"h†ãIB'Œ‡÷­Ë?/Dj…^h†îë,r6p©¸Îïü‚¼xÃÆøÁÊiŠ.ì1v4ÓKØKlL[Lc,3nìÈ#}Òß“ßX“îhž,–7¹Êny˾þlØ]ÌÂu×{ý”ùëÅù ^%”žµ™™–¯Éœ;XcýëXž·¼ÜϽŸã¤`=›ˆ©öŸ/¾ÐºIa­š„í—ŽqÙ¾€\úÛÆ©ÐäÆâ göç“zœ˜úgãmùé­È6Í*<çÇ÷«Ë6®×å©ý¼¡&¨"‹šíóº ¾Þm?®_»§»eÉþìÛ7›7¥r"hµwê´“®én;t«‰·çXuS®ò/kp|í"ʺ÷f»¾øÿÇÅoƯÿX´?ð¾?üOÔÀ#¼¡Ðý_Óýã?Ýì?@„8`Aƒ&T¸aC‡!F4@Š‹1fÔ¸þ‘cGA†9’dI“¥¸’eK—/aÆ”9“fM›7qæÔ¹“gOŸ?)ž:”hQ£G‘¦ü¹”iS§O¡F•:•jU«Mƒ"Õº•kW¯•^;–lY³gѦU«6ëW¢aô”`Ñ’‘¹>¸ÕË5ìZ¿<˜pá›m÷–d£e–\‹nLX´ ¥JbËDûÖ¼™sgÏŸAÓDLrîE§Q•±Ìdé]•-ú¸s™¶ÉÌ¡qçÖ½›woª£G–¶(©­‡c,ìvs‘·}G—>zõꈫPÑ2aEéA=NÑ¡ÁÆ êÒÄM;ŠrZýÜ*g&L8@{+§4]ìÂdÒþ)¿ o¼ä̳hœKÐ#è¬kÐÁ!Œp,Äòða˜a(ÍF4Ñ c’3m#–¦¼-ʃ‘Z`$áP´‚ò,’EŠ*4ù¢ ;ü0DâØ EÁ!5bPÂ#‘LRÉ%#Bì ,¡´>³¢‰SBμóò+¯ËûpˆA//š„Æûfh#*-ºòGŒ‚$RN‹ŒdÒÎ;ñÌs:Ä&­ŠÒHÙ2ËòFd8C-êÓ¢*&9ô¢S0¸È–e´0â‹-ÐM ÄrN"ëÔSÔQI-Õ/'¡´BJ‹~ùRÄW3ޏSÂTuLâ„(#£A昀UWß¼¨ >>U%S‘þMVÙe£¢ÐB 5dÄ‚Ap Ö -Rå#Y1R‘E]í">pàU–¥¥ÖÚó0Òc¶b •Ùyé­×^†°ã…-zðn†>&A#2+Ùå8³èŽ_&a¢ ÿ x`v ¤ Þx½Wä‘I¶¸(=U0 ŒÂëcKŽYæ™õíŒa4a䌗yî¬iZè¡©M=-T8Óç¥y–—è§¡Ž:°“™®Úg§¥ÎZë­«Èꯙƚë±É.'ªÁN[N±ÍnÛí·B[í¹cî»ñ¾[nº5‚Ë1+êº+/¾é:ïÃÏ{oÂ-Z¬Êàx2Øþø¶;ñË1zqŽˆÛ½“èQ+éãóÄýûµ‹dcÜòÌaýÞÍGÜ–+üÐå"ü8Ý#ãÓv9× —ÝøãIÆN;î¼O<ò4=½¾õ¦w>ùè³"7.ê %‹öëï?+²Û®;‹ðÓ?ÿt~@B5=xäé¯ßd¯S|6Ct{Q[éQD"YÁ[-zщ€AÁVX€QáHGÔ Î4ÁñÏCþãXã„D¸×Ù„%„ª¢4¥*¹é@—^ø¨ZáàV_šK2Xó€dlêiÂÈ“R˜¨3õPMa“•<õA+ÄI„Å3á¡x$>ù P.´þFè¨Dù©Qå{dqYT¦4“ªÔ¥¬ (ò•R’¢”¥0eEmÍ"etañ˜ÇÏ PU¥i¯+XILƒ*M08âðÊW÷IÕª¬«]õêW€žµ*çD=n’“¸qÖ…öG°tUË"Ø$¬ˆS@pý¯vV —¹òÊҤΕåšÃ¹D9-RnŠ8îš_'Ì=â|úâ—¿&°LKÑäÂö°S†hb»X1÷Õ¯ÆEÌ Õ´Æ’¹±,ÍÂcMæ9ÑIªá ŽicçEVÖ²Á™3õ´'Zl†3©íf9Ûã¼rÇ{” ‡!&Á¢€4¥YíhIhþ@5YP‰NT'´{èE‹"PŠn”£ø:(FAºv”¤%ˆECšÒçDÔ¤-uéD>ªR™žd¤/µé=Q:Sf¤¦7õé9sj5ßÁ3.¤¡‹]¬à2°õô§MådP«6Ô%rrV€ŒdÊi5¦:•«Q„j 5U A “ðCL9çZVuu±y—VYÚU¹¦ó«ãÊ,&àMTá B¨*G€÷7â ïk[ëa‘§<ó5O@ÐK¶ÒC=û¼'>óŽ}˜ÑƒP{ZÞùHç>¥|ë_€žG Çʯ°qEìkõøIhqÐG¬Äbc¤Ê Ð"VŠVd@‹ô€\hQ´þú‡© Þhƒ¢L./áB¸Â–º@%&ûh‘#²°s.„á—hUH2 ‡r?œá˜H0C¶ÉSfz”¸Â$Љӭî}ŸJL5þ)ŽÎœ¦µ˜F.Ø·Ùo÷[EMµÑ"f„£ŒäH:.ÕµøµðñøÉ? ò¿Ü’¡x‰ÃŒyšW¼é ¢6ŒIb„‘•äð`1Y5Ã^˜Æd“m(7¤Kk™rP¨ìVpW)á¼¶€¯~% ˜‡p Œˆ–Ž-BËWÞ]P†îE|ÙÚoÙ~ùÊ&25¶ÌƒùW[М€Ãzl ì¬^33šÉG…}vSæT«äÍkÖ9œÁ²9Ëþ¶ s™ÐzCë;eÏ¢(UË…vtæòéÏNz#3~ô¥cf´„:”Ò.¦A·¯z:¤–õ©ç5jRcÔÔ¨v5²T½ê‡¶úÕµU¬eýK[ïšh¸Îu&ylÍ¡õד¦µ°‘!_[mÇNö³­³lfSÚÕ®—´§m_ko;YØÎ¶ ¹nSyûÛW´¸Ñ}Bb—»ÔçN÷»¯³nv³ÚÝð¶·oÈ=ï9ûÞý>•¼AêaÈî”ßþ6øYòÍ3K5¥?øÃÅ’p}Êá·øT$>ñµÕûâLÆ5>¤Š{œä@xÈíÈñ’¯¼, GyÝTÎr™[Åå/¯ÍÈgžþs™ÔÜæ—Á¹ÎÞž«¬¨U Ü×JÃhŒü<èM‡ÏîÇýíª‰:mJ3¹"ÅÜé]¯èÉ…"=Ú¬U$® tZå$œÖñ”ë^w{M$.öËÖ¨G;‘„CØ¥·ýí}‡IPÃǾÐ6¶<‹¦Pû>àá“èÃÊ`„It [!!­ZѪö4V/|çŸÚò0Þñ—<å9¢-hà"ª×À,Ⱥ‹ 4aœcÚ»ßq°cDƒäQ 9¨ß×zа‹e? È ÉŒ.Ò{Úz°Ç–$Îð=h|ä+ŸùÎçæ†Y¬  ‚ ²Tß‹0=÷o*×$ßþàkk»I pé†Ä½èƒ¯våïÊ<þ0ÿÇ—hÿ2ÂNÁPáò,B¢ ýРدý¼.¨ 2Åð®ˆ8:ôìê¿:‚Á¬`ûËíî1"•h9Â*â˜Ã <€è@ÿ¬,ï0ðâ«Z Å~k‰#Å CbÅ.b‘ÐÏÐî‹0V|:À :À,‚Ê@A>hX¶ÉÐ&‚jÊp)ÇÔ¥”²¥4x,—ÖжªO­XÃ"аÊâð-é Õp—”PàÖdá"&ÀpD>(Ën¯ 1&‚JÏÀ)̆™6¥`ÀìÎþ$¦®›(þæ›HÇÎĉS€{8Ì#©°4Fq#®É æà ‡8ÐÆ°qQèvo(á¿âå©Ò|0Épèzn/.ÐW®-<ç¯.1 Ñs&n™‘ä1ݯ±ã²Q!ªÅQ!¾ù¢ÇÑïÊQN8!׸1:@è±íññ1õqù±ýÑE þq ² ò;áÑí !ò!!2"%r")²"-ò"12 0²#=ò#AÒ#r$«c È H2%ñ¨T 0A%a’„D > J!&qy*á~à^ '2vF BaþÈ ‚2)çÈ€BRA)¥òn¶  ‚Xa*µ²mÚ` È`¶r,·†Èà‚X€,Ù2jLa "À -éRh~à*¡ ‚€ :¡.ý2fN€ DÁ ^àþò0E†È ³1s`x1%s^n,“>á,Ó2Õ`2=s^Æ€ Èà3I“^Bs4K35“å4U³5K…5]36ó6e³6—„6m37%7u³7„7}38¥8…³8wƒ839A9•³97ƒ93::¥³:ý‚:­3;Ï;µs'2`Á3<Ås<ɳ<Íó<Ñ3=Õs=Ù³=Ýóþ=á3>å3=!a>ñ3?õs?ù³?ýó?4@É3j"Á 4AtA´AôA!4B%tB)´B-ôB14C5tC9´C=ôCA4DEtDI´DMôDQ4EUtEYtE@i"ˆa h´FmôFq4GutGy´G}ôG4H…tH‰´HôH‘4I•tI™´IôI¡4J¥tJ©´J­ôJ±ôJ‰FgBF³ôKÁ4LÅtLÉ´LÇÌ4MÕtMÙ´MÝTL·´@gôMé´NíôNñôLótOù´OýôO‰4NctNµP õP5LÑt à@´@aQuR)µR-5P¹þT&¼ôR9µS=•RU–! ²`$õSQ5UUµNµK uUa5Ve5Kµ\€F]àTguWyµW“´U5õU}uX‰µXqtQI¡h´tÕXõYwXcbS¡µZ­5UkõV× W¯µ[½õR¥&¨õ[ɵ\ûtQs¡HÕT͵]ÝõNÃõ%Æõ]éµ^õ”QR›Õ^ùµ_©4^]b^ýu` vJ÷µ`6aƒ`[B`öa!H6b)öa–%¶b5¶b'vc=–_/v%2öcI¶dMöd«5d%bdQ¶e]öea¶RU6"x`Náfq6guvgy¶g}ög6hþ…vh‰¶höh‘6i•vi™¶iöi¡6j¥vj©¶j­öj±6kµvkµvx &j–kÅvlɶlÍölÑ6mÕvmÙ¶mÝömáöj½VNc¶níönñ^3uZ…5oýöo7ptf!‚e÷p7q—pÂp÷q!7rQ–qÂq%÷r17s –rÂr5÷sA7t»•s"lãötQ7uUwuY·u]÷ua7vÛvniÂte÷vq7wuwwy·w}÷wY—v]Ut‰·x7e÷V\ûöx™·y·SIw!<Ka€†tQÀtž÷n³·caÕ{}|iUQsT|‰Ô|ïÕM™þp4zbzk´cÑGC@>àzi4Š`{ï NAR@ ¡Sõ×Xç·|5hTŸô€%–G÷ÕxéT‚­ÔdAYmÔ}~…Ô_ΗFw J ®ÀF-xMSx…ã—FC ú€´$!U˜…É7†ŸT†×à AÂ7I_˜‡§´„£4‰}¸‚‘x‚o´…w”ŠUЧ¸‰ôT­XG[؉)˜I™! n”ƒƒƒÔ‰áFx ¼·‹Uø‰ äX‰ká>À b!±”‹QG¯|­ØŽç8Œ¥ŽË7ùM‹þyI9’« ÙH y“‹T‘•xIc@Ê8yåuy{tQÀpA[ÑÔ<„ôî—F%H°€F¯À ~A Ž!(X–ËWcŒi4 N!`dA ”Á„ÃW @[ݘFádA@šW¹•_™—}˜…yGõQ#5’µ—9˜¸þ÷˜kT™™™š­YËùƒíÙ‡³y›»yYÙ•µ•É™G?€´`zA ÜX‰àMo9—wH¹|…¸˜O›µ™›¥9•÷9ŒûÙ£œzœÝÙ‹:¢ÝØ(!j8œ§¹šù¹£ÿ¹¥MZœÛ9ŸþË×™¡Yš:¡z ä9™—yQG:§‡Z¡_ÑY|›ub•!j4”¡¥_:¦g–KZ m—uYе©‹Ú:š8­¥™ S¢ÿ7Œ¯ pA !Œ×¥Ëù›Áú¡!8 iz©¥ùœõ•§ º¦ï™£ýÙ›û¤{ºF? J™nñ×{aBÀ þøš9[H“µFO¡à nFa6A „¡ð:•kt€†oÁÜxTKÕ øc؆ÑÕ¶—!ø²3{³O;µW›GEu]UY‰[µYÛa! Ö¶e›¶Ñ”·}›F™@ƒãW·)X»Ã8€[þ¸-³5Û´QºyÔ$¡BJ»³í¦›FC{´ëmô ŠrŠ £¯¸FÍ{]ÑÛ¿Ç»·Ëû¼‡[½»½“;“8¿Ý˜> ```³a`³üšÉ›³¼Tœ¸×{ ž»Â½¸q{ à[¾é»ºc›FgÛÄ!\Æã{¾ë{¹KU•ÅÛ¾1ÙFá Ì` üx…@Ã9ÜÃA\Ä#¼¸õ[´I;·=LJuÆ}|aÜË×5Æ[<ºñ›ºÃ–áÄÀZ›Å)œÌU\Ê+™…ãœFO<¸iÈÙÕÍ‘›Ì‡<»\Ç|ÊW|Ìk4Ha²µ–5Ñ9þÛ?›Fq!ÌœF¡–‘@À#ݵkØøNAY@[]@²x Š¡ÂØVqÕýÑ1]Ó9]G]}[›Û‡3F7}áÓC}Ô9{ÕÃ8rÁH¡ŠÁ§-œØ9ûÖO}} Òw} zýGCàÔ™…Ò-ýƒ€qô6ÚÂiÚQÝÓ=[_]Úe} ®=Û½8~¿Ý§YóÒÙÕŸÝÔa}ßg×k½|ž~¹} @} DÔÓýàotÛW¥úÀu ~¡~ àÚcÚ!]•~ *ýÒÓáâKýÝåÖ}=Go]ËÛ9ý㫽ȫxäþÕ}âq}æéý„UÝßÝ}[>Þç½Ö]ч·²;9×g¹–×ÀzA úhÔÛÝ×€à „!Xƒo>Õá³'}ì;ëw4íí·d…˜ë½ì9»ìÏ^W¯À"ÁzÉÞìÑ^ìC^‰Ù^G]R¸“å¾F¥žê­þGáÀ€!GÁ>Z“¯^ð¥ï?Þ×>îÑ„Xñ‰¼Þð‘UóïûêAß‹Uÿðµ€éþëÃ8í!öØí)çm4š™Ž›¾Û£~ê«þƒi÷ÏT_ùãíE?G']æ×Àù•}×^õuú[è9?õ=Ÿð[?²•>þX½úyŸG‰nô !á`üÿÛŠá¼Yåÿ¼F]˜™ç£}õbÍMk z뫱îzìÃ>cXžËÎyd´ãžyƼÿ¾øîÀ_9 7Žxò£Ï|ãW`áGÐý5ÿ¹ª?=õÚo/.,÷âïºõBA/=õWU…ù»¢ºûòÏ?<òÊ®øeg­¿øþVm€_¸B4ô«˜ùÜ#À*p l`ìH“:p‚Ù…!(ˆÁ îS÷Uþ4þŠp„$,¡ OˆÂªpƒÄ©VÃÊp†4¬¡ oˆCÆÙ¯…Çù`Ä qˆD,¢å²C&î…Gl¢ŸÅ(JqŠ K¢‡ãC>®¼êƒC˜a<*ŠqŒd,£hÅ+'‹ A«¸¸†X!ƒ;£ïˆÇ<êQ~iT#Ku0c»¨Å#x÷ X0Ž"»H3’°ÇHJr’”¬$9¨F,2qikÜ"PŠ ¼QvÄèIÂKªr•¬leûxEÖMiÖòÂ/´pŒ¦¬¤ ÂÃArÑ›™Ù—M©JN€X@² Y8E~áª5Hæ‚І™Ëþ™ì²“Tq¥7¿ Îp¢–Jôa.˜¡~-"PbF1 3ÊÀÅÈmìtçG`‘…5ì»…1Öƒ˜( ·xX=ßYµ‚„€âl¨C Q÷‘“‡>l E€á*$Ä(„kÄ$‚„Ñ‚hô#‡02:õSD$ YX> Ò5Œ4¡kXhDoŠÓœê4rm¡IÁ—FP„˜ÁO<;9O²u›!pa£ Ð4ˆ+èÕ <¤¨p \7w Ö°Šõ¦=í`EacÙ¼«—¿ŒÄC¨5‘´–)#éHá¡Äè4¥1H*Ç ØÀ v•e½Ÿ9ѹžHiÊFÐ\@Y-þ¸Š@BP¦ˆÄ.óHrrŠQŸhz»ÁŠv´¤ca•çÃFÜ\^ø¨µPö0‡äƒÀ.Érën5ëÐ Â*W]b€K¨àWÚä*w¹@ðA€Z¡n•þ©9ꬫµÔõ5Õ OêT#d¤I5WpA$2Ôé5\U Y¸Â!Sê}‹|äôë÷òr‚ÖР†Ñþq+@áªZ«®|ÉŠªLr×¼f‡¯»*ˆŸIô 3Ïä‡M§b1ËXƒ8²’-ettD!$KâP)d! d:Õ¹Nv>ëìì }ìdÑ'¥ZÖº¶¸o£í.l‹[©è]µÂ»Ü™½É‹^öÂWÀG9ܺ÷¶«Ç-»á¹³;EºÔµ.vM™9gLj¯¼åW£øƒ˜½ê]{Ý‹9ì¥ïò¤/ý3oüî·Èêû¯é_{‰Ú(޽ío?DÔã~÷þ¼¢î{üàÏð÷Â/¾ñ©=ûXÖþøÌo~‰oCJ5þbýC¿†2‡,•:fü Þ¾†òäBƽ€ô2¹)1“þó5¿ËØJ7Ëï€{>åA~Nø]º7KyiÛÄr8L#j iÊd•†€ ¤ÀQ1Èh·”MkqÓTMHLÚ´>!'€)è]ºwNF·líÔl'kI…µƒ÷”OûÔOÿ½° !à³%@²rð#§k/'PÉVPk`ƒ·ælø¦‚SXZºgQÙn¹ÑQ®õõFR&…R*U¨pІ[‘r^¨„þ- /……"eoø!…TH‡‚¥{×/CÅU2x÷ ‡ W 'UAÂRm‡¨‡Û”q×qµ‡ø‚uH‰ce…)Çsø‘€¹àr,W*÷.zaWÕr†WŠ9‡1;§V=·X‰¯ˆS,èjQ÷7²t¡ÔtqT PwYRGš$CxÿQ´¸uœåuž%)¬(v°èŒ¥{i' ­%xÓvµu[A.æBw¯ew¾…wÕ27ÁÞØ[ÁUgŽdó…÷ŒïøPÛÇxŒS]×:͈;Ó×9×ýN¿·yé9Ÿ÷^Ùã¹c¿§züå>4@ ‘,fIþ‘¸7‘‰‘¯w‘É‘–·‘ ’e÷‘+AçWúh’Õwcü’-iC#©B%©,Þ7cN7GáÇz.©“)“á‘~Q†;*! ‘/T=[§Hïf;É”1Ô“ï‚¢doÆLÄL€„9Ñ5ÙgWÙ”_iBhh´tM¨hh±‰ HeY‚Æ„LÈL΄H D Z° ½/p¹HŽ8w™—EYŽ!øi¡f–&ˆ“–)B²è‚N˜„$ap4˜OØl¹¦ƒ¼ÆƒA—kà’Ð!€µ™kÐkr)¡9š¥YFXŒoµ„p l’Él¬8‡Ž©›t‰Øþ¶jÈmÀÅ…dœâ¶ä–RæÖ—Âà•5#È)†/1bŠòÖ†ô–…4•›»é t‡Aµˆg•iˆ\åTPUˆì² îå Ë*hAˆ7TÔ‚ˆŸóyŸGˆUZ‰'‰¦öZrÉWN“bŠ™è"¾Ôhsr%s¢Xs7xAW{Ñ ‘¡œaŠÄ€W©¸W«HS®ˆ ):>™X½X‹% …‹“µ‹–%$‹¥T7=v‚%ÀÂØ%_"rŒ]#.ÊŒ§¢KÚb JQh·ZÓ¸v°å„²]ØwÛ¸[ÕØ6SŽ5²5Á4|c2k¦þä8–Îx±‚5ëØ¥¬áŽL*§Ú#ÓEŽwJš5ø:(É8”7§J<y^Ù8zðµ8¢'¨ E ©_ I>Ù8”ꨗzDO‰©›š\šÊ©Ÿ:Xž ª£*V¢Jª§šS¦Šª«NêS˧A¤*2¹~J)]d}¬ª«¡ªìÇÓ¬YC“FG7éâ·««ê©N6Hê÷;.@/“€ ö(«¿Š9îÇ•ðW”¬¬º¬}.m6•£ãIYðÕ:W<¥§ú‚JÍÙ­ *–Ic€‰‰€êj‰lùø–”æLÂÀ’ApRŽþêüZLXHþUÑ$‚ F‚ýÊžÁ˜ñ*¯®jV“Ò‚-j›7hT3Hk“©™»†šÿ$ &Z>„'° ?‘k! ….„²¤µ‰™¸ m;ª½)µÁpÉÅ †åVEdØ/Ð'¦Æ œP›Ÿk¸óSE{o? ´ŸžþéqȇJg™‘ˆ?‘ž',ûp¢ˆ4k$Êqj·4•±a‹©BÛºrøŠ#*1‡ÊK[-S›r$á d!¢:W¢eò®~»±¶d;‹Hšt£LG£•eŒ¾å£)Uæê éjiAŒ3!ËX-\ÇKÉè¹a×®˜þۨѥÔ覱…nwÚ8w¼ÅŽäŽR­Ój*i‘°C¥_Ž¯Â¦Ä½íˆ¬º{©uÚxöø9|J?¶º§Œ«½J¨œ7íU£W¾íËokX¤²9É<–ê¾÷Ë›ð‹Z°Š¿ý+F½ê¿ì{úû\ü+Àœ©L^ŒÀ <ÀšËj,ÁI¦À÷%Bâ«f¸ÚD€:Á*ÀÍ3¬Bv“Gt¬ôÛÁÙ§©Ì eëç:ØJ¬ÚJASVe®Ã­'ìÁü`• ®Ÿ”ãZE¹«,´Úqv9‘ƒ¢6<~º7±ˆY‚÷úKúš iÿÎd˜#XK‰9jü# ±v‰—zI°þ¿0 À 1e_,Åri™¶ø/5çÅQ±ÆÜ„Ä)¨{Õ„=;²}˜¶Hx›¸–ƒ(ÛkǦÇ/…µƒ8k0¬IšMÌð!» ?ÃÇûS¿l–B„=øƒ9k³êÕwŒÂ8|a“µo(Sqø[ømpø…ã†+2­ü›^¬Xµ`«Pó„µO[†®J»k0Ñ7Št½®uâ%W’$ù!».Ã$8ò# BŸuc@ ÑÆ§{êÈvV*¼Ù˜[Üh¼oú3á8½6}½¬7Õr¦TÓÓœ¤wÓ7'óq:ÓÎ÷Á䈧߫§,#“CÕÌ7Õú©¾‰j]MÖañÕoæze­ÖqÖkíÖ¿ÓÖo-×®×sm×™S×w­×‹“ׄÕe¢’@ÄÕ{Mv}=?!¬/àD%L؈—Âè׬@);2LW–e[ÖeI™­É"Øòרc÷ØJ®=”DÇ6åãíãA'Ïÿ,s›h¸kÏ&JŠ‹Ðkq8·“K¢ôLå#­‚!ÒˆÑÐÖ’6¾ÐªÐÑа]æÒ&Ѷ Ò#RÑ2Y£Ë‹Îº¿5•rur!ÒÑ v'$ ål#ØÜÎH¾ÍnËžî Ÿ`NŸÜœ‡mWÞŸyØõgüàìÚ]µú)ýQŸÕŸ×?þëŒ};ü)væ•›æö¼æm¾®p^#„¾¡£Xèuÿhè›vk^!tJàM® °áBˆ ]tÑG`Db®ˆyxÅO±_p^œ¸¦âÅŒö)éâášÂ"ΤYÓæMœ9uîäÙÓçO A…%ZÔèQ¤I•.eÚ´)± ¡¤N¥ZÕêÕPˆ-æNAÁ–y}´u¬’k>Ȫ€ U-Æòb¬‡þbÉš})Ð , û jRͦ+“b†$Ë4óL4ÓTsM6…Z²I8Ÿ<Ê•Sê ,ü‘'<õdóË™úܳMB 5ôPDUÔ¹7ádRN!øÅ•Ÿ$¥ôO,]tSN;õôSP mÔQê õTTSUuUV[uuTR±2ÕUZkµõV\sÕµ(XcµjÖ]ƒvXb‹5vÍ^}¥ Øc›uöYh£•v§d•µÎ¬i³Õv[n»mµZk™]P…²ìé¡ú 7¨uÇôö]xã•—Ú¨¬•ÛO× !Ãsç*b©u]åÇy 6ø`mÁUV\›s!½]ji/R›^ŧ‡vi1©uþ×`& „Cydaö•ášúZk·*à7Èu‰®_ü¾)&’sÖygTMŽRI‰±+¼øE‹cB`¦FŽ…r‘©æÆŠ>:i‡*8€X@(‹SBÀ\Ha¤$8T°E )´p £‘Vz_4\#è¡á¾znš¦±Ë>;Bµ`{Ç·?Œk>°ˆgÈ#—¼MŸI…4¶,n!o™MĦ˜Æz¹ñÑRÛ¼óÏ‚%‹5öFÆ[Œa¨—MBðÂDÇ “ì59tÿmE8÷ô5H!sÍ>õš;€vÛqÇmwzßì¡àQ'~H™ü{ðòrG!uþ…€Ñ \Bgˆà5™Äý‡Ôˆ}‡Qá>8…A B ðÞXB‘ÇÐ$õ[_ûŠG°ó-Ä~kÀ_ónÀP'1`Kx?r¯€â#a MèòÅ _®è…úÂoëËèÔR:/Åp†Àžq€+#ô‹áXÄ>D†3HÝÂB°x;QÃrøÀ "1~J¤bãwB0†QŒ>Ia“fEÑ äD\šBr -¢â!j„H_<’™®ƒ$ E昈AãAyEç]qƒ ô !g‚³1FR’“TH…¯Ð€…4c1YТµ´å-þq™K]î’Nž†j~L3½ÉôæzaI¥Y<¯h²4ªäá}Y3X¾&3³Üä^€33J&S™$´du Å!îx<"žy‚õ°Ç=ð‘}¦yŸÁègOz¤‘‚~Ô6IÓ>|4=¢oVq %Z£ wNÄysjØ2ýùÏÈ5³Tø"J”¦D”09Å\[êÒpÜPˆF4dÊ|B';EPåhG=š$ŠÞ«HšúhIMzRå„ô*EiK]úRD©ôW…iMmzÓ4ÉÔI4ÅiO}úSFÕË^3jQzTâètYøêØL¾ÔÔœ¬k¡;A—ºÄD&¤fU«ªþRêT Uyþ’]5Ù—Ý2å/¥ ~[ek[ÕÕk‰5ªNuÓ´À ³Î•&Ø@4fÅŸ|Ì­ƒ%¬¨„:Ô¥Ê'OmŒrÁšÍDf}]%]ÉÂfV³H‚kV˜š¢å‘Agâ^Ò=ÅíÍ! eÑHº¦°…À‰Á.ˆ¶8¾-ío'òÛ^ûµ°¡HE­õâf{Ü uö«¾ó-¸ëI¦—kp,”§=‡0w$®ƒìŒ§änxaµlë^'Ø1D»A-rÝû^ä(—©-yœ§»Aúí ™`@߯ðï† ú®@"˜¾’·ž°ÿ`ö޾¦þpRäë%#о)p#zy…Äâ_Kìíû²X³qˆt³_¨C&>7e I±’aP~±Â;æ1P.,XŽUÄoèbKG/A¸# ‰@IHM"¹?‰TÈ›,> ³=ær—oòc‡°Æ5¥´ ^ª8LéºXØ%_ÄüÅ´R ·tZ.GÓæ°ªæ“´‘ój"3f$Ô˃&ôÀÌÖ¶è=ñ™OK;]ìðܧpC:q*Cr§:© izB¤<1L¢×ÏB§ÚˇnNÇ=Õ p ' ýÒCU}k³š9äÚ¨rzí>\»Ëº^¹Hªœc[ØË®0þ±™ýlh¿ê°ˆk´­}íU9ÛÛæö¡´Ýmp‡ûLÊ=1Ì}nt§[Ýëfw»ÝýnxÇ[Þó¦w½í}o|ç[ßûæw¿ýýo€\à'xÁ ~p„'\á ?Å´©€ D\â§xÅ-~qŒg\ãçxÇ=þq‡\ä#'yÉM~r”§\å+gyË]þr˜Ç\æ3§yÍmjç\ç;çyÏ}þs ]èC'zÑ~t¤']éKgzÓþt¨G]êS§zÕ­~u¬g]ë[çz×½þu°‡]ìc'{ÙÍ~v´§]íkg{ÛÝþv¸Ç]îs§{Ýí~w¼ç]ï{ç{ßýþwÀ^ðƒ'|á* xÄ'^ñ‹g|ãÿxÈG^ò“§|å-yÌg^ó›ç|ç=ÿyЇÞQ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_22.gif000066400000000000000000000757071343257752000273530ustar00rootroot00000000000000GIF89aK³çŒ‚„LB<äÂĤBD|Ä‚„$"$lZ\Ä¢¤Œjd¬†|´bdĺ´dJD<2,4\*,ôâälfd Œvt¼–„ìÒÔÄ–ŒÔ¦”TJLD:4„"4&$´Ž|ܲ´ÔšŒôÆÄl|^TdRL|f\œzlܺ¼ ¤–”\F<¼rtÄžŒÔ®¬œ24„nlœ‚„Œrd„f\TB<ôîìüÒÔÔªœ”"$4*$´’„üÊÌ|bddVT|jlœ~t  œ:<”rl„j\lVLD6,¼–”L>4$Ll¬^\Ü®œ´’””†„Ì¢¤”z|ä¶´¤‚„d*$ÄžœŒrt<.,ôÊÌ|b\Ôª¬,&$Ìšœ\NL¼šœäÆÄĆ„¬Š|´fdôæäìÖÔÄšŒÜ¶´ÔžŒÜ¾¼¼vtŒäÎÌüþüìÞÜ”., ÄŽŒ´nlä¾¼¼~|Œ„”&$œ><̦¤¤†„LBD<24¼–ŒÔ¦œD:<´Ž„dRT|fdœzt \FDTBDtZ\$,"$”vt\JLÌž”TFDt^\ŒnldNL4*,„jdlVTD64L><ÿÿþ!ùÏ,K³þG H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞÌ9¯€Ï C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ëƒ   ‘ãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàÃþ‹O¾üt*†«_o,ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€@`}8_‚ 6èàƒF(á„ö¡ÇÞ…öä…vèᇠx ƒ’Ø ‰!¦¨âŠ,ž˜^†0Æ8Ó†-Öhã8ž!Š<0ˆ|(ÞdŽDi¤‹2&©äJ4éä“Pz8ä€<:3ýMå–\iá’`†R“]–i&ˆ_8QI* À— z¤RÉ œD%Xàæ\pqÅX$8ˆ©ÜAƒWœßWçœuÞ™§›ôA0zRŠ…iP@AVÀ7È\P0‚ „êÆ™¬¶Êá—þbÆ*ëEdºjë­ÒB…œ„¡)|pâÆ½4#ìʸو^4⃦4ÂIk$3ïQÇÀ[ì±ÉZ) Dh‚{4ÒB ìŸ˲›`´ÓV‹ë½øfùâ¬üöëP­ùp*3´€e ÅÀç cá†)næ_&húG-ð=‘ ïÊn6¼°È‹» |$¸kr*cA1|&´œC‚g¼±À8ã «¿<÷LÀ9Í*.ÍpD¿ük¨›V¢©)D5|{ðH|$f­éÁƒ³€É•0m…ÓX„ Ÿ B-µ–B·½åÎ>ÇÝ/Ðn×å vP4þÖ sÅ&ÃÉ|qLqÂlmòÞJçð‡- ²<1à1Oœ àvgÎ*Ürw.&Ýš‡n£9àM ã‹›Ü#³¨ýüg@ŠO‹N4>ƒ X*¥¸%tžõ¼§A¯dNtºÔêd§LÛâNú¬áYñÙöf ˆ9§'Û¥0Å»›ÊG§EêG+Ÿž^ ?EPSK6$;8 ‘°ƒÒLfÔœî4P—ÊÔR_JVÆt¦hEKMçC‰Â‡z3Yö ,´UªB%—¹4u×øÀ• 븰0׺.µ¯A-ìS±E[Mb±X•ë\eÍì M™ÖξÅÒÓÎö&©E4P£R3™Š…”-M>h#þè J+M™V¢Ú­m£vZZJ“\•¸àVï¥6¶&s­`5Ë\žÕ³ÐýÊZåC\ùT ƒà8Ù–R»^3YuýWqâtËÅRv·ûÔîRj½\* ÀH‚–&h¼o-¯¨ÂkÂæú·yÏ®€µ2ÝøDÕ«[ƒ«-œ1¼êœKЩöUíÁ}é5§‚—Ê`oEÃu+pÇw° cA©†ÜWüÀøÅU)0Fã‰R.dS>DÐCF[°ÑÅ>ÀKP-h¼Ð;졽í/‰r¼Ô÷8uLFÑš1ŸÆ–tÆ ­§‘<{™€.†±˜¡"ã‰= )x@þZš¦\n ½üåjŒ]úµòÌi^s4‘©ÌUÖöÇXh³6Ý gk¦NÐÍŒÒäà ÃîÎexVsKç×ß/[:’œ³¦ ¬ÊK{úÓ… ó¦G}P‚úÔ¨p¦IÍꨘúDƒ–R¬SMkP‹ºÕ¸öÉ«kÍë^ßëÖ¹vNvíëb»KÀ¶²iBìc;ûÙDJö²§ý’fCûÚØ.%µ·M>zûÛà·¸ÇMîr›ûÜèN·¸ýÈívÿ‡YŒ·¼çMïzÛûÞøÎ·¾÷ÍoyoÑÝ牵³Mð‚ïhÕO8LÊüà#ÿI&PiøL¼â÷Bƒ Îñ3I[á ×Ãþóƒñ¹ÁƇ{ÿ³rY ¸9—>òšWdäß%’ ¨œr,ô"µüù¹ˆ„<ÈüèO¢¹Í—œ ÉHD€|7u*mí Î@ºÖ½„p¦{ý#kå”§@u¶N}ŠÄXÀÅá=>ù‰¤•zTZ–¦5µ)Pnÿ|RáÖº³IT©:¥þ¼ ¼sKj‰ZT£H¾µZn믑ҿNùƒ¬5]ëjÕ†§yqÙ ôÞ²šÔJË >€|tÅ+_jô΂)Vµú]õ >ô¢V2P‡ ØãTPØÂ‚¶?hª;¬d‘O¾Š&_ùæ d­’sà¢ÿ²@Í€Q¸r þþ&$’í½`@â~Ùh‚,>5ãØÍŒ_!ñ3¨cÐÔOÿ1ßù•_«ÙšŸýÍM© 2ïã&bC6t– Dc4‹¦[üW~÷”vEs4²·Zì‡ ¨8Us5R 7SH!÷‡_}âG}€-€Ý4~ðQ o"~(xS^âGŠ"ƒy˜Tlã7“³5…s8*%Føq~ðHXB]'‚Lø/f2˜G<›—y®ƒÅ >àœÐ or<^Ð:OÇ;¤c:n†bˆ;ehè-Ës„ª³UgÈ:Uè0¶ƒ¸tüÁF—„€ˆ$M8ˆv÷Cþùs6‡˜ˆ&S à9Ðk¢o>â3†š‚=ÚÃ=xÇáÃ4'‡Kš¸=ÿc>èÃ8  z…牗h2êÃ>æCƇX‹´„„˜‹1p !C2u À‰t(!g‹È !¨‹ Ç‹Œç‹,RrÉ8²ŒÌpΘs~Fxϸ|Ôø9b×ènÙŽæèRâ8ŽÜVŽçØŽ¢”ŽêHmìèŽô˜N¸M8õ¸0uø(‚úȹYÿˆù×sw I$Ç8õlÙ¡Øs-W‰#/G‹I9‘¸6pÒ(kØsBw)¹"ƒ°½p;@þRE÷‘î’"Éj$y QWuéU’ ¢NÀ œàw‡XG“íh“79j äwmZ0•ÆwñᔀW(‚'.ÜèMü´K½°Ë'r2w¢²©Ð WHY´ùÑ‹–ªÈO‡”ߨ”K©i Äz·÷>ÍÐ0ü1{ñÁ—®—{ö2‡9·=VW°nrz©÷.Ò’i€Ið€ 6FñÑ Ëô½óg—àˆ—y)f d~‘åVüQ ä§šè‡KÃ{€0!£0%ƒ³‘`tµ0ä'$€2[¢‰|¤9¦yš/J (ïwû‘ øœ‹¦6RC›Aþ…ÐwX6@wÁ0¥ž™1¡‰Q˜œÉ¸œÌ)`¯6ƒÚç68ô‰;Ø7Ýhgƒì— ¼‰Ÿj@#åMµ—ð!—‹"‡îùžþŸ5Jmˆ^\ V%w’Xp¡¸;²#‡úcp¼B#Šc0™• T7¨@)”D~¡Ê9¡ r 4Šœø½Pûq‘Xࣥ@¨8—ædÁ“¢ƒ°Sp(|H ÷1$K19c‰£Ÿ;ÚYÙÀ¨ ÃØ!Ͱ–ò`j‹b:¦hU¦83Ë Xú¦H§r*SM’F‡F— þ §8ʧ}ºNtj¨ŒŠ/ˆš¨§´¨:©®ò¨ÚI’J©šZ&–z©“”©›ªPÒ©žšH *ª¨Êu¥êu–$=¨æ”dq§#â>Ù!n $:ºªËÖªt¬Ú™ Dš%*_—¦R‰5ÀR¯r«65¾m¹Ê!Y)½ê«Â¬?FMqæcK• j¬>÷¥ÑVNà ‚Å¨ \°$5 ÀR­Ýè]`†®V@T‚¯Õ*3¹ Ùª­¹Æ­A•Q%Pàêªð±“=ׯRržé:!ö (bœÕH¯°š¯š³RëŽT±»G °[¡OX ^ –¢B*¦"þ(,ë?PUzX#w-Cu£R*0K•ða•Øx´g [é&4‹Q)–B'v‚'™2(X9œBV¼#vg'´cÙ2L«*ø²\ð• óMài5Ëʳûa± ’§@bxD»µ*«–~Õ–õcvdוj»L7Û²yµ2´r˵T )I;)=Û´;«&׉o—¶|‹]f‰–W‰µµš"µq+–xbµ>[Pz+¹LS·0{µYIrk2šÛ·d¸ŽK—ØZ²!G&ŠÉ˜Ž‰ðâò"™²›<ðá^™ªHu±;»X ˜µ×zZ/»‡˜B¢»ðѺé&Á2,ß2,áb˜ÅË™”rYšþ…ȋҋÊûº«½ C˜ ž¢Bí©@f«,ȃSßk™˜ š …œ§2ñ »ñb»¾5gSè>éJéÊF°PÞ ²J® YÛmºq”Ž«‚né3…éöú ÅÆÇ:Ùr­¡^Nês³è6?QÃgËTëõ1®ª^®¬žÍõñ¯¯®|±.ë³bê{ãPÔ§> ;«!»\&4²Ãž|Ånì±B&Z›¸œë²8[Jµí*+Mâ¾L:h„{wžû³ý›¥/+dEÛî{«²U—Õ¾u׎íaº캴ë»%\%Àò‘¿À‹äëÁÄ›Äñð üÀà[ðýÁQ|ï—ïú¾$tÓÄ‘ É =Q]lMìþšêkÄ’¼È OÕô1òõÑÄoñZ‡ñ?=OÈÍ©œÊæ…^ÜL"ÜL«×IéšÊ=ïÉälÆ(ó?ê5OIÿLÔ%ÝñoaÖÓ$ÒÓ÷‰ƒq•ÔB:T/õì×ÓF)ÜL/s4ÿô02Ö}­Ù¿mÖjÝPH&Q¯ýÙ *ÙÈ=Ñ(òöx¯ÙwoWmÏ 7zöH—öjŸ@Oâ~ÝÖ]Ý{–L¹îø@š ŽÿÝÙCŠámâäMà/ùÝóÂߣá>ŽøG§ø‹Ï’ÎDN YnŒ ®úpîô­ÿG¯oû¼Ïú¹_A´ÎûÂÿ!¾ÿûÁ±ûÃöÅoüœüÉþ/óËÏüšáüÏïÑ/ý_üÕ¿ý‚ˆýdªýÜþ‚ûÞÿA ”ç²é½¾[.þxýåHÚþ’êw»r®îþµÿñ/ç?"@/';ž`A˜P! b‘ÑìáÄ„ ±ô²’HŠ=~RäH’%MžD™RåJ–-]¾„“$£lÞÄ™SçNž=}þTèP¢EEšTéR¦M>…UêTªMPñh¥E7¸ÒÐâÔQ+E"2JZ{Æ™L¶mݾ…Wî\ºuíN¤YUï^¾}ýþXð`Â… _U8hOª^Zä#ÕnÖ"¥׆ƒ Mþi8Ëž5—3o>(P iÍœ¦ ‹ð‹“J© Œ<¹òc†ª/›¸\øpâÅG®2¯aæÍ?‡]útêÌ'ôшS†4¼±<ÒžaM2„N¾XÉpeÅãfż'äD¡üùôë*4^=BS–Ң NÂ@¼íÆón,7LI®A„0B '|¬¦ê.Ä0C 7ä°Cº!$rXÈ¢?jAè‰TÊ`ŠÇb»/1Ѱhñ½…jÄ¢ÿ°He†:1ÅcTA D2I%—dR¡å>„2J)§¤²J+o 1ÇŒœäOµÕ°ð ‘;|chŠâ„„Âó˱Ø$3 Âþ¥.H¢K/T¨–!›4PA%Ô¥'¯D4QEe´Q£²±D„‚1!ÎÈ` ÐâR¡=h@èÒL7µQTM-"⌅±C>,(uˆÓ„Îð£P[oÅ5×Au´W_6Øé²#¼îbÏ‚Ar¨ NY½ëê«ØžÖ".,H[N¤E(¢„üÈU5¿kDYfùLˆŽt…7^yçŽWaïÅ7_}÷-*KŦ¸Ã±™áJÔ8!;‚ Çi{¨ Î°X¸á,z¤‹*v!7¸@‹<‚©Ä<Ü >8a"ª…‹-é…9f™g6É^~oÆ9gÍ2É1€þX ˆ1h&ºh£‰¶yg¥—fºièz>:j©§¦ºÉ¤Æ:k­·¶ «ª¿;l±‡»šk³ÏFm¨Çf»m·ß©ì´ç¦»î›×†;o½÷[n»ÿ0mþºþ(=ÜH†2þÑŠœ€…HØb¡!>ÓØ$d6µ¹ ró@Þì)~¸˜‚cF¸8¼ iÊjœÖІ†ZŸu¸Ãºe);^hA#0Ùª:Ðì·D´‡?;€„®‘geÁ³Tf ñ' ¨_††…ÝÐŒg¬Yy¸F6f-K& r`¢©È;œ`ž¸–±ôF:JH~” aÁŽW¼Þ hBÖqH‘àH-¦àŸ2¢Ñ’—¼žÛ¸INâ,K•Ø’,b /ÉŠ¥$T?Í !uºSž°@J>l|©ØƒBhI¦cΘËþþ„Ibbr€Df2õÆ8ÎqR•âa„GQªn‰©ZU«ž«ý9©HØÞ6W¥ÐoVÍ*f:ÑxLe¶ÓÊÒà/±@éZV³r‰(äˆÛJ@mô=,Ë\÷T—>m4£†#cLV>B¨ª].TgFkÈÎwvÔ£ÃòB¬p…;p"DÂx Y&„‘ÈÆ4f£á!dd%ûÂÉ ¦RD.ÜÄB1þà”îyT@+[&>6}ýhT¥JÎÁåg+iDNQÒ ŒÖΩ_}ª&§:V²6§ªôÄ2ÔÀJ°¶5¬e…k\Ò£5ÌnÅë[åºþW¾òå¬yl`“Õ¾Ö°;ù«`»X»ö°5lb;YʲűŬ\%[YÎv6%—ÍlhÇ ¿ñe%x@ÅëÀ;òmåV^õll³"VÑÖö±¤Emüø—:®€ |Ç“Ik“£ÐT„ÁLÈò˜*[æV„¶¶…._qË?,X 3•ˆ„×ZËÛpõ3nÁHp[Òǘpa¬Ä¸°ó5×½În|oKWê–V†x'¬"ts¨2 ø„ëZ–&3„hü÷Þ÷‚V¾f#xÒB!Î j¬ôŠJt ޲Dh‘ʆ6¶i n,lÂñm¸Ãq´B(@þ4l)ĆŒwCÌ´&5¾©å±ðA‡$Áãcë ÜàçBØÉõa#€hO*vÑ;€&{8áüôŠ? â(¡ ݳŠìº^3¶Üe„ì¡-b.±f*s±ˆÉO}ê$'b!Še¾ ‹EH…a’ ¬¬ä’™ëà'7º}ÌDˆ3±PÈC¢e¹ q$+8FÚ"€|€äH4ã%Ó•LE3iØi9ÒQH!Á‘_HQ^ˆ ¾¤iE7—ÑŽ¶ï>ÊQ–òÊYVåA)R» °Ä“ž2èß=kI¤•@Ȳ±PÍY›"pr“5ÀJh·Ô#ûÃCþ0¥þº×œýu°å]=º²ZÒ°âŸ3ÆX_YYÄÞ¨²hBXå*|wJ¸Nu¤WÝL‹Ü#¦"U²ï7ðÇ”r×ã펰@«wË6Þó9æâ9Ïz1¡Þ©~[°ßþ&[Vò¤'• jP;œ+¢ëBä«íf87BÎ0/9B%z?o =:·lDós…„» qWÇcûñW}qYiI)œR•iÅèvµkpïdݤ½ ÙMMVÔ”¡Ù§¹µˆ0c„’¤g×iÛ±ðö…pìbšéw?µkÕéláX–*uÏRÝê·ÛfårU•dU.–7N*’€Þ$ ¶Œ¯¬ã!?zµÑþ—³2H…V@‹€ƒÞãM&}ì5'y××¾©¢—}î›F{Û÷¾˜¸×}ðuÆ{ß°~ò{hzã7ÿöÈW~ôÏF|çW?}À—~öE}ëw¿yØ×~øÅý¶¨ö»X`->ï}öGüâ‡ÿ•È/“šž¸Õe^ûõ=èÇßÿüâ½Éžp’8 ¨â¯—i¯ýcÀÐé¿ÿƒÀ{ ÀU™Ÿú‘5ÈSˆkÀTŸA¥Á:£0³ “ ² = ²â"²*±!;±ª°"%óÀ¼‹÷ Á¬Žx‚b(†¢3Ó¹#Ú8%ºÀ&Ê´?›¢þH'43+˹DÓþÁ+ ôÁ-\&ºJ¥“4J’± ¦mÛ£$…5©5„ÃR³B,¤CËÒB.ÄÃ)6f“¶pKˆSò’TZBr³“hk%:)DYÚ%?Tì·¬À%]ò¶^ú%ä’!vtN©›ÍèÌCÛ¼DqRMDjòÄ„E#E‡+µñù&äO"'sBT\OÛkO÷äÂÊ”Å`l–Zô.„ø'¥K:«œ¹_´9|ÆÎä ‡‚( E'Šj=b<ÐÚKPõAftFh4*l¤F…°ÆÀ»Æ%ª?md;žš¾ë¡"*pä),@*¥Ê¿u½EÑTGõŒ wD Ì; ®ò§}#þRÐ3Ò#@|ÔG~œ™´Z«)K+S(È)8È„¤ÈT¸+/}Î0eÓQ0J5…S¨Ò6¿7Ó;ŋȤS´S<õSøÚS+íÓ?õÓ9 TéTj{:”ÐI­äɆJB]4==T‡LÔ«$Njû¤tÔûkJIe0C­Ôä+K„°..;Eµ¯“ÈJ9ÝJ Å(PÔQUÐRM¹üb9UÍ­’PËL‹µU÷UZÕ=º±ÀåLeUž*Vnå|eXŽ*Yže¬e[ö(\6‰ÛÞÜeä\&¦]æåwòe’Þ`&ÞK#æbîäc¹R€`«3 é…Þð‚Õg~>iÞBj&kr‰^uÔ_õf2fpN¦õͱö­¥  õÖÓpjþå°?X€3@‚Sº´_¡ü½âßt6¦hfç`³bÞ³ˆ œý°àƒ-ƒ^X×1P|­×Д"®ÂFhKZç…æ$™ C‚í³‰µS{X^£ØCá‰Õà‡™Ã’6i…FiÑ¥«‘ua?ôŽA†ˆ‘FÕEÙgSÙn³Î%ÚažN蟾R ¾· }ø[ð7L9•ÎÄD‡XbPäÙS„bª>>«†À†®Z,¦g…(°ˆ0ë+†ïâÅ2ÞÐ%êZµ>£“fkÛ²½Ñ-¼Ä(W<¾ëÃÞÆ´«[³•[ûdÀ6#Álò[Qä’fËþþÌÎì’dÅíxíÑvŸL6ÓÓ6ÆÔVmöIfצRŸŽmÛšmÚfOÛ¾mÑÊmÝ~7ØîmaÛ^à.Fáî÷)n¢fèM¿Ï6î™Aîä6ßFŽe†ÞfŽnª™nê&j¶frVm>-n®ÞížšîöîÙ[n~gVsÆ]tFï¨Qïõ97&Áw¾Ë ’縖!{î p1}æg&hmÕ.à‚+¨ú½gÅ` è¿Äßmmß‚¾Aªo£¹oüv·V͇ŽhïXàǸh7Èèîh‡vàf)«§ ;ñ93‘n`)tq&éHÞñHÆjW+ádséû‰iŒCþX>¤fUcŽ”QΛ$&·X öqò Çä &¶î£Fj‹PêûôØ”ýN†%l1!mKˆ4?D57D:×a%Ýòxùp/•k~K®öêP눻ÏýYW(7âC·ˆ)Oˆ-ë&Þ­ Lë=Oœ.÷óR`ËTÚp„˜ëºîb£»Ï·.( } ’{9³ëÔºq¾n–1ÎЭ=cM§™>ïô¿)l9>ÛĸÅÞã¿[jÇîFœzŒà‚;¸‚-alÚ€¡ðhìcÈVvdÇâÕuzáõ^_¾‰@d ÁfÛU¢wÜÝn——o÷¹)í#)wu׫vþ?\ú2HM&wy¯jz¯w}OEvçw³±nwdNø^no‚Jƒ?xdNx…¯>€ox7zxˆÿÒ‰g芷xÙdxŒogßøÞ“xgšù¶y’A?ù"íx•ß$“oy§Jy˜Ï™Ÿyu~y›_#œÏyuªyž@–ÿùàÞy¡×l¢/zE z¤ÏŸGåî‰÷8mz§—@¥MÕƒï`­z«¨_úKêz¯ß>¬ûó%{Ü6û³ÇÞ´Ï,°gûË>z·Ÿ¸{{ºwÅ»·¾¼×ûÁY{¾/Ú¿gáÀ|Êò{—?Ã/Žæ>­ô“ è>üz™{ůnÆì>-¥Œ‰þOüI|ËOGÌßzAO ò^^óÞIjóÊÏw@Ñ,Ò×ÔæUñ=çšoòu}Я|Øgï’©ºÄðþÞ_ßËŒw èáL¾|ÿ±Õ@þߨ}–ô}!/ Xu‘‹_Â> ‰`6Í…ð~qÿ®~Ê¿~ézøÛ ✞ˆX7dë+§ò"/ÿù÷`ßTõ,,hð „ 2lèð!Ĉ'R¬hñ"ÆŒ7R bÈ"G’,iò$Ê”*W²léò%̘2gÒ¬ió&Μ:wòìéó&*+Yh€@S–.ˆt ‡Fw˜:%øÔé ˆ©0 ÄþÕŒ ’$I™6Åòô*¨SË¢m›u`­TçÒ­k÷.Þ¼z÷òí;ÐãÏÀ‚.lø0âÄŠ3nTb* s< ÆÉ Zg2 ÊpÖ*èˆDÎd‡‚@˘«*ÔÌÙ3ëØf žñã÷6îܺwóîí;!àÆÂ‡/nü8òäÊ…?ޏH±bž>jdaPÛX¸HHá„NDžrX^¶CÍúÉaš–Àê׳³nkð{øñÏoï>› yü6 x ‚··ƒ :ø „J8aJÍAd…/wpáÃSƒÌðG%jœ_/OÙ ©Ì@]‰$~‘\Ô"PÁTâÄþy¢ˆõ ´˜âŠ.ùŸ@µpQT‚M:ù$”Q¸ …UZy%–Yj¹%HN”ƒ\ŽFäÈcH¹&›mºùæDTr9'uÚy'ž/yùPÅpÒHp :(¡…zhEræ¹(£:ú(r’5é¤ñMÁÅ nìE)§h!ú)¨¡Šª¢šz*ª©ªêÒž£ºú*¬±ÊŠ[©«Úz+®¹ÖÙꬽúú+°ÁT«®Å{,²Åñ*,³¡‚Ð,´¯›,µÕZ{­M¤A·Ýzû-¸áŠ;.¹åš{.ºéª».»íºû.¼ërE¼õÚ{/¾ùê»/¿øN‹-À pþ§|0 +¼0à ;ü0ÄK<ñÄLÅk¼1Ç{ü1È40É%›|2Ê)ßtŠx¨ü2Ì1Ë<3Í5ÓŒ‡+fH`3Ï=ûü3ÐA Ýàf Ê%C+½4ÓM;ý´Òˆ1 *¥@}5ÖYk½5×ÁÂ(–˜qA×e›}6Úi«-˜(fðÒ]¬=7ÝuÛ}7× ¸R¬àý7à >øÀ¬¬ÒfXB8ã;þ8ä\`Æ&"•‚Jä™k¾9ç–É #]Jž›~:ê©§„MŒ$ѪË>;íµ×ýÎ$áÁ€í½ûþ;ðB bñůCéÁ+¿<óÍ_Ûþ $ÑãA|ôѳá<öÙk¿=¤eÏ=øá‹?~•Þ›A>úé«¿>bæ³ÿ>üñËï’ûóÛ?þëן?ÿýû¿üþþ'ÀÐs, ¨À¿p| µÖÀR°‚ìÙ/¨Á rp`ì C(Â[}p„&ü!ƒ(Ä!±ˆF ’ü$(¯TÈ]å \pÊ#¦+¤HCQÈb”V¾’IƒØC*zñˆYº–èùã#C)Ìa2h”Sˆ)ÒŒb`ahA ±Ù8šÒˆÁ‰ ª™ÏŒæ4‘´&O³œæ$Ž1 ô”bøA;¸ R‘ƒÉ˜@6ò¤§@0O‚Ü 9¨§8¥DÎs´ †I'˜Â…5(Ò,o!ŠQ*!ˆbÁ ÅEBQ‹þJ5(HCº„ˆ‘Wéç?í¹Ï”bAŸA)@9養´¦6 IcÒTœûñOO¯‰…1h“þ› j8eÚ$šÞ´©N=IN}³S£8À•`Ò#ZTѪRàª:ÚÃî°Ë­Z•IJMSŸªVµF•lJëZãjÓ¶ºU Á”+^çJɺ† ®yý«9éÊ×NÞ°† ,Ò ØÅ2¶±Ž},d#+ÙÉR¶²–½,f3«ÙÈ¡°‡ýl(C&ÚÑ’¶´-j‡)ØÁ.Õ³©}mWËZù¶¶¢lgk ÚÞ¶·5Ì­n Ä[ß×…À îo†[Üåžð¸Èír™+] ±›½.v³«Ýír—».xkÚñ’·¼ /zQèÜçî&ºé}ï×ËÞܸ¾ö% |2>Dä)þ˜@RÒ4_‚Ô÷¾î_~£Aä)p,°¤ ¤À¾°ýèzND=yJ/˜„ ˆÂÆ0Šß§áÕ „2ø°lÎI»6Å6ÆŸ—¬p.P`òA*î@MÉò/¥¥/ã O,|Á •H…td!kj6E®@|âs9|^zNt¦Ÿ¢®!¿D R“Re,Ђ á Ø·Yf Ä ¦ 0¶Üå=gÏK‘™ÌSþÀà'„ÉH©@*±fµ€ ‚¡é,;ãYÏ|¾ôò¼´Ñ§(¥È†Æ(“8O®Ä+` :M•ÿ %.•®1¦c >?w‡2©þY²‘‡Ï•t4¥9Í­YŒ–Ú¼ZÖÆFß—¡#êX;ÚáOUÒŒ ¤=ïó|Ü)›ûØÞžõ^+š¡ uèC!‚pVíc®z ¦‘p¤#s÷ˆÕp™0¿­oí- LFÜí}<ÓáÆBŸþÔM<ÓÖ¸êö”JL­™á»u8Ä3î¹[/–Ö8ÈÇñŽÛåã!?yÝFNrº˜å.O›ÊWΑ–¿¼æ]‹¹Ì5Bs›ók8¯È~û+ÿXMÍÚyϓ޴ŸOäÝ ȃ"a éJ¿ºÐVü—"c„ÚOÇBˆBâ£cëfßšÖ;zÃXœ2&þûÙã®¶ï¸Ç?òͲjO •«D²YõŠJüag@B%:ÐT,¹ÉOŽ21å¼[yÕX†»Ü3_¶d‡™Ùr6³8ù¾LoZ3©|à„ÆÐ‹f ~ ÊPó@Úüæ8g`Îö®ó™euÍóe´´@…H‡^–ï¢ÍÂLw`ù”Æè¢gÐèŸø/štî…µûÞs`š5§+úa=4ÔµO®·Ò•¯„e,ž–«u_öîÓ¿f¿÷gep-¾$ùèg¯„i ¨†®¹vhßüÕ ç-¶9ÛOåJÛÿý‡×Y›ÀȇÞž@p›ü5 þþLŽ‡Ì ›VñU•Õþ…†ÓÕȜɎœ›¤) ÕËö• ÞJ¿…ÉnÜEÜþ ÆÌž$ äÜ€ô`Fá£HÜ¥dŠ&×J¡ Ó]!E@á†á$yak‰¡^K’aD€á¶¡•¤¡>º!F&HÐ}јÑ]\þ!œFœ•8ÝC8„MÝÌ! 6b¤¢&9¥Ô!V„×¢@„@Œ:¢'N!$6ħÝE%RÛ ÛÍX0â'¶âbÐù˜”á‘­Zlœ…àžá!žâÍ"• „ãA™Þ•E-ôÂ4äbá^þâuŒpÁ¼ã D0BžäÑbU\Y– Wº¢8Úa¸v ™Þ(²Úé¥ÞêµÞë¡ãç „ìqœ‰ŽXA\Á 8E;ªë¥^<@#x4‚À=º™=Òží]Ÿ»e8Ž#EÎÉýÙT_¡±«9_óa_ð Z˜0ZhDLSx¤óåðZ¢Eßô…$¤m¤8=ß*†cEæä#Ħ¹ßÞq$D¢Ÿª•…©µŸ8©ÅOR «™ò‘%ª å‹´šN¤N^%…\dþq$eh A  l¸Fgxe®µ$>aA„X þ ['b%]>ÈŠþ:fÛ–¤Y²†Òh ò~ˆG_²Úä„SºÇF `B¤Þd]Vfƒœ †¤`äÑ þßa–Û Â[ ɨÈg:…4ÞÁ0É Æ› rfâeZ&mîäAø¨pZ„Îfmþæp,¡Ÿ4anVN'rêR©gr>gbÜa2+B'tJçt*DuZgrbgv"Ävr'pzçwDxŠgm’gyØq¢§{VH(ÊQb"ìaoÒW{¾§~’D‚•¢“b$F]„É&~î§ÒDÚq]ø§D$A#T-„AC]b$j∕˜nœçêdÚ)å‚ÞÅþ$#jNc5„-¤ò5žjãäURx#oh¨‹Žã]z^í©#Púcë½£@:$èÕã=¢E>îc?šÅ?‚©ë9EAdBÄ 4‚B²CÞcuÌ#\Ú$‹^©Ÿš„VÊäðÑ$_¦ä¤}dD *ñ‘¤‡ÄI*ó­¤S¸$AàB*0˜¢õŸô9šHJZ¢¶W~þ)w~ŸQ„ßû \ ¥øA¥l %[”äRFA,@*DAÿ9%«¦šøAdüeh¨Šêu†ÛŸá_°¡jWÆ`®åþ¯`flFY"k}PjžÑ.ÄZê°¹¥°„\ú*°~k—”£²áå_>›Ü"´þG¹V›c¦¦~ŒßY&¦,f| ë@4æµååJ&†ö)¸þ)f’› â`jºÊ+kÜ`½Ñ ¼¬‰ ˆi¦ëY¤æjJ"YhJkŽæf†&ê`•þjÀþf6çCìfEÜ'nXéÈÖ¡p*œÉþ ˶¬.§'Š,ÍV¦z®g…éìÎÒeÏúìÌ­íz­Ñn!Ò–§Ò.­6íw>-Ô&aÎg$ÚgÎÕVí2€Š"Ô%">W×zm vèY,E/8Á4Ô´­*Zþ('r-Т­8ª-k¸.¤-ÀÓ)~ŠæÞº'ŒÊbäEé0NeAìÁ4)6>©ŒJéâ&É7šíÝî'f©˜"«§pšÂš‘içî©Db®æ¢g fd§Ê«§ ÂSd*òm*õµ.Dò)ê¦î¨†[Oêê©z*pª_©±_Tî*üUeîên°òS­m¥±Bd3Ñ€@\käe«²zj·²×Ù2oïq.¿&¼ßú-<éëc†¯¶‰Ódroæz¯Ë††d&hlºÕÛº-ÜnìÃ2,„]ÈjÙûÂo͆"nnÊR„Ê"W÷°Ü½,qú¬^4°ŸÍVœßW0ÖþImvn0+O'‡pÏp–° Û «¡ ¯ðËýÖŠm}F<Å¿Ê Ã0Êá\Ø2"fÄS(b¯ì0‡\[mØ$…Ò°…ZÄUÔ­¬ñk\seA.}2¨B\ÅÛñWñ׆[6Nnå+õ“\#0Jnârcå•EAdd€£Öq1c2ÆÆå±_¥—®› “ÉE˜IÀmíçsEk^ “!E4¦…´Ž4Ió™I_!J§t—­´¶´KßLçœLÏtŠÕ´ÌÝ4Nc˜N¯O÷ôð ñÐÙpç¬PÇo!ô× (CKP/µ}%èSD5؉˜!UŸa‡ªh ¨àrëŠzõW­üÖâîèŒÚþâlÀ† ¯gH#5¾…[WÙ*—ñóè”ZÞå*`Zƒµ¸vÞ"¯FüÁ[„š¤A"déŠnì)ò ?¤l¼²R¶Z;/ðò 2D‚€ÔÂ¥jäKjjLz¶õ]öé ¶f‡!©V”©&ehœ@0 ‚3Ì€S0¥ï®š.×2òŠS¯b^lkáê:ó(‚*OjZ:³4c/5ÇX÷qG!ø¶3´!I‘†SЫ½ª¯@¬ó9{ê=Ãvvk·ü¢`ýÖ@Ç Á[˜…ÅÚÒAó¯?,—­z¯7–,E4ÿ2hODRˬG¸.D Â2¨A}ÿrÿ,ƒþ[íÁMÜÍöW*x€±^ø@Lu†ûÖO“‰—ømxÇ¥¸ŠÃ‹[œ‹¿xjÅ8ÃÍ8ƒ–\ŽÓ_ õBø— _st›àx ÿp­KÓ‚'ù±]ñÖÁµEdu“oõ“oâ¿ù”S¹¬Y¹XW„G"Ï‘@|ñ› ¹˜ã•—ðu^Ÿ1ßù]×’S©3ö¢’Eîã™q3Û±@ z )¶”¿ù>‡› ç)!+¬21“®i@¶)"OöìU6—Zø@8ò@@2Hrš^f£¯°Š2jUß®¥%¢ºÁ¬ç(3*'—2Aœr*¯r¡·²©¿öþ¢§:H‡›pÿn@@ùɪ¤?EpóòoûòY3 ³@3ó°û â4s¥ ƺ?Ŭ>Åt r—9“a³6 D7_8¿U˜s;—•s»žwxèUX`¹—·Ü潓·;<Ë3Àëõ¥÷¶Ó»Ùñ³k,|· ª® 6û¤9u?CüÿÆFBÄB7ôC¿ˆD;ÃÇÝc´Eht¹¼—¼ǧˆç…›»|Mí8áÒ¼Ã|Ìkð¼ãüPëüÎ×ÅÌû¼AÙ¼}Ò½Ý"ý ýmyuš³X‚/<Ó»œÔ2yÔc€9”ï`›÷üÕ§™+(Vÿ;}>q#yþy¡ ýØ™7êDœ9 O} › ŠÛ¿½0ŹÏ9"…\]G#’âµâöyÿy_SÞ_Ë1A úgÀ¡ï1’ôñ ì=߃R S6¤[¶®%öb7ö›B6§×飧£®ú#Gòèã$»²°ƒùæ÷ðª¯v«¢hci›vZ¶ú­³ºí–9¯Gž¯cÁ£Ê~Û‹}í3-C»-?³@à¶nó¶Yøvô?û©õ2ã*µ[;`ûåk;í7?È13ucñ0·s¿ZŽ{±Z+x³eúàY]s6oó»ÇF¼“¼ù78@`ˆÅOŽAvh |ÔÈ ~r±0P €Tœþà/ö(dè"Í<˜ˆ+ÆÜHqàŸR8a…‹X~bᓇfQ£G‘&Uº”"ÆQO¡F•:•jU«W±fÕº•kW¯_Á†;–lY³gѦU»–m[·oáÆ•;—n]»w³ B1O°JN¾4ãO%5'ö ô"’AGp¹sÅŠ`†cqÃ¥–À¾c\ø°Ì  àU 4;Á¤šñóg-.•™æÖ½›©S¼¿>œxqãÇ‘'W¾œysçÂõòfÚŒèLÝc€H/Ú¨µv@Æx?>©ïççѧW¿ž}{÷ïáÇ—¯<:yŠƒ–©ylÝ~þÿÿTʼù,ÐÀLPÁl0¹úü‹Íš Р1äm@9ìÐÃA QÄI<  QLQÅÚ°ÄaŒQÆi¬ÑÆ´NdQÇy”ÎÅ RÈ!‰,ÒHærìQÉ%™ÄâÇ#¡ŒRÊ)©¬ÒÈ$›ÌRË Ÿ´ÒË/Á SÌ1ŸÃrË3Ñ$¯K2ÙlÓÍ7áŒó*3-ƒÞ~‰ µû ¼4U\SÎA -ÔÐCe¤ÀÍ:Ûí'82#ï' nEAÍTÓM9íôê‹°èL8#ƒA2¨ûŒ’"ïorÌ^øáµ:Q%„Dz©$‰¬ûIXbÝ]U ãYr‰¤ÁŸÈ&œÒ‰'Ÿ–ªwÉ&ÞüóÑO?ª?Ì2Ò2{D1ÓH5ÕõÌ/÷E»¬4¬‚Õ°f ¯‰Íldb›Wo<¿Sß!ÁiùÊ?رwìó'ÚÇôàAH( n„,ê`Q˜BVi„%t!—Ê·BΆ^já qX¶Ö‡=ô¡n˜C!ªi‡?4â‘È¡ ‘‰>*b¡E)ºg‰M´þbož8E-n‘‹Æ©âÁx”v‘Œe4cX¾¨";áI z²ˆø›1ž‘Žu´#TÒˆ¢ü9J ¥Ç¥ÌñŽ…4¤¿(*Á‘Gz|Ä‚«b5+A2‹‡´ä%ϘHÐYÊœ5ÉÜ“¥4e Od…+p#øÉ è5®r‘*{@yÄHuK‹X!  @p]bÁkïÚV·¾.YÞ«qXH˜(±xJiNŠ'ÚŠQŒüd!ã˜ÓX׌bEœéjD ZЈsœ€+ÙÉ8±–4›+kÝΠIIj54ÚD°ƒŸ(M LóØ"஄$9Hþ”ÏI¡3@ZM¬†=ÍŒ-ŸH!e?AR´¨¸±ÂO‡/pRh?ØJ*+T¢"/ÕßÞ·¹©€ƒ\GòQ‘•¨ûçC²: m’uü!¦CÑÅátÙœ@”ÊÔÅ쨭dQÁÖ³Y›ÚäæH`‚æÕ2(‹ÙÃ9Ó¹ÎÅ4’zÉ»^O…"É®6å«bõë_–J_Ü >x¥ÿâ7¿Y6³­±‚|é€`Rdí Íh0ƒ=î5¨}ìgA‹+3åà§=² yàÈY¾†–µ­ÍUŽÒP N4bfª£P]›[Ý)G·ä JfÛ+âv·Å5nþò(Ü÷¸ÍunÑö¢\ 2÷¹Õµî‚’+]R÷ºÝõn|²«ÝÞq÷»å5ï§¢+È5:ÒXHír={^ùÎw>á…Öuó¨Ì‡ä¥ï|Mnd‘ãÀ^:ˆ?´ )̯@ ù½nп¶ð…Û2àZ8¼È "Áà£t’Ÿ å +Œa¯x,©\e+_Krñ4_ÂÄ¥wÙË_s˜zI@:€cÆK¦/v%»>/dÎK™ö²OŸ‰âø²˜ÊUŽ Y³¹Í”}ó“5.'ʉ…·¢S ³K‘€ ,,À1?§<¯™e”¾Óbñܲ=Ñ…O)[™Ï}Î\z‰þ Pj/£]F¨B?×ЇJõsYJ°ŒƒQ¡‚ŽÚÔ,Zµ‚^íž…¯ŸAêµÔ¤(E(SYZÓÄ 3UuL¬@‹<Т2?é›NaZjvíM ·þ[J‹®ÇõwÊ¢6ö±«rÔ€&õsN­±SUpŽ0[ÌUTÓÑÛYmE¸ºgd›ÜXÁ²YíšÖµ~’?n…k™»l”ŸÔUÌeÕ²IP2=ƒ ožÊÓ¨øÄ]n|‚%¬aß—Ù–(–nu[Ìc#;Y§ZDz2laÇý&áÿ«ÛfNp‘{´¥irÚñ¼—„)ùË‹ [ÙÒvƒ±mmÅ{þ‘bÜçÿíí~ÜÈù¸9_mÏ‘NeûZ.OúÓźt¦[ÊéP·úP¥>õ4Uýê]çgÖµ~&®{ì§{ص4ö²¯Ý’go’ˆ±°Þc¡½,_˜ÚÙžw;ºI"ÆonôûÇJwçz7p§šé¦z-§~íÔ>iØupŸøÙšjâ–e1¢í?É`†&†°«Ð ¨ŠÛR‡ p«x‡l4p±0‚ÎíÞ¬GÝŠÝ‚"ÆÞ#ô¡JïôÄLýÒ¥#¼ ÎÊßð-%ö­zЪ$Zàð/ ù°ífïâ®à'1F%Ñâ(@²žÆ6 /ºQ[í Ëö0ë*k. ±4þkðö°Aqï"o P.ŒTN<ì®é¬/Yñ‡dîæÐÎ…®°i‘r~.èbñÓjq§ˆïr±Gf‘…1h|ñw$‡1jQWQ¡1}бW£ñue©1E¬½±S´qaèÉуÂQ¦ÕñΤ×1'†Ýñåñ1§ë‘|ð±/G÷‘ƒžÑ r‚è1 U± r¬!©n 2"±¥!rë R"1òPRIkÃÂ32$‘‹"›¨#ÁP@R$UF6²"h%aR´HÒ%Óî"cò&¿¤%iR7R'}²Atr'£é'‰rPþ‚R(Ä&‹r)‡ä(‘Ò«˜2*ÙÄ)Ÿ²³¤ò*Ä*3Dî*îö¤wüä+É’JÂñó,äï˜"ðBM&Åu®,åRJøîÙX„òÖÒòò2K‚óh¢'ç20d&½Ã.W„Ä -O’Gš¥õâR0!3H–Èù’ ÷B§ ÷€BR¡þ`Î *¡¾)Š (óö–éÉšIÞrO5Œ3=4E“4â_ü…_f` Æq"j,#38gd‰è¯ûTœ£›Ž(ø€Ü` z¡œs ”a7HfþêLž”“ËZÇ5?i;í©9Ÿ3:§³:âeRnfjæfrFtîïþ1…3>Y’0)‚ÒÍãí“þ/ Ü ?â=—B‰‰ï9Í#5j?9Í?t£Bk¸æ4lĦ(S>5T.–È×`pñBg1€ DEP1w §üæC?îZgD['tŽ¢p°àpBq‡D} C•rCy”=¾¨Ûš0D)ÂÛ¾ÏD°ª# ;'H¯ˆ4?ôubgv° vn'w–%Ü€³G¹”A–ˆÞºpy¾ð'Ö-L‹t7èªÓ ¿O&ÊôÏ´–¶''v¢'êFá³Kõ4A–¨âQáäçcµã2Fó(2‘ãþÔã–E€–ják¡ô`•&V£5 þH6>ä¶tO=µ¾èÓ…NÑ;0EJuåÄ2O?uUáC+«²SY5VÕB®V4Clµá¦.CeµW“-T_µwÔW‰•C5X¹qX‹uY3ìX‘u™5Z‘ÃUuÄ8‹W¥UV ˆ [½õ[Á5\Åu\ɵ\Íõ\ÏUl]Ùµ]Ýõ]ѵ”5[éU,à^ñ5_õu_ùµ_ýõ_6`v @ö`6aaëµa ¥ ÌàvbÏèXÁ 4b5v‹HÁ >@NacE6Š.!‚ ^`dUöˆJA FaÌ`VvfkèÌÀž‚Vfyv…ºà  ‚þ\¡g‰6„Þ   BÌ€жi!ÈÌà¢ÂXÀi­}P¡¤bÄàj½Vx‚ .A*†À >ákÑÖrPÀ Ha*^ Ò6nÕ†Ì@ìönu LVnùvhp@—B!pÙ owhÊÀ Ì q—h·qwr%&r)÷rÆr1ws©Es9÷ssÅsAwt9EtI÷tÅtQwuåDuY÷uÛÄuawvÃDvi÷v«Ävqww¡Dwy÷w‡ÄwwxmDx‰—94 W•wy™·y÷y¡7z¥wz©·z­÷z±7{µw{¹·{½÷{Á7|mÄ÷|Ñ7}Õwþ}Ù·}Ý÷}á7~å—y5@-4 Ð õwù·ý÷8€x€ ¸€ ø€8x¸ø!8‚%x‚)¸‚-ø‚18ƒ5xƒ9¸ƒ=øƒA8„Ex„IØ‚¡~ÓBŒ¡ X¸…]ø…a8†ex†i¸†mø†q8‡ux‡y¸‡}ø‡8ˆ…xˆ‰¸ˆøˆ‘8‰•x‰™¸‰ø‰¡8Š¥xŠ©¸Š­øŠ“ØP-T‹½ø‹Á8ŒÅxŒÉ¸ŒÍ„! Z8 „Ìøá8ŽåxŽé¸Žíø‡µØ~WøŽù¸ýø9›”Zø”Áy‘¹‘ù‘!y‰ó8…÷þ8’-ù’19“5Ù‡ f¡…ñW‘³ ‚ ’!X˜”ÁvA Ry•[™…?ÀæÈ€…倸€A”IÙ”Qy“…y˜‰¹˜y’¹¸’y™™¹™Ù‹ þ Úàþ ™š¡È€Ž…Sáä` rœÅ™œY8(ÁBʹ tÁ¶` n!›·¹›¿ù™õyŸù¹Ÿ‡™Ï¢‹ýy  º  Úµ@Úà\Y‘…áXX v…wa¶À…+ú¢c8R…ÿÀXØ¢Û@¢ ú¤Q:¥‹ ÍB Uú¥a:¦Ùå b!ä  ÙEYþ~ þ@zú§ƒº§ßÆ\XØrº a§éF¦¡:ª¥úYº,\zª±:«µÚ‰XX‘ d8 ¡£×ø¬=:È È@‘?:¤Åš¬·º®íú®‹¸ªÉâªñº¯ýú¯[X‘_X‘‡¡\@ a‰á°Õº [;œå ŒA‘ãyžë™… û°°=û³ïZ¯Ç‚¯A»´M[¥Û…Ey„áñ ¹ –àLA(…c{¶k» „à*¡¢Ùra—Á X8 XÛµO;¹•û¤E[,H{¹¡;ºO‚Aº­ûºŸ¹¹Ãâ¹±»»½[¦A¡òù»Íûþ¼Y»Á‚»Ñ»½Ý»™‡!h!á½íû¾ãX½¿‚½ñ»¿ýû¿<ÀµZ¿½‚¿üÀ<Á|Á1™À»¢z!$|Â)¼Â-üÂ1<Ã5|Ã9¼Ã=üÃA<ÄE|ÄI¼ÄMüÄQ<ÅU|ÅY¼Å]üÅa<Æe|Æi¼ÆmüÆq<Çu|Çy¼Ç_¼z@- Ülj¼ÈüÈ‘<É•|É™¼ÉüÉ¡<Ê¥|Ê©¼ÊKÈõ˜Áµ|˹¼Ë½ÜŒœ+ üËɼÌÍüÌÑ\†Ã|+Æ<ÍÝüÍá<Îñ{͵¢ÍåüÎñ<Ïõܳé<+ì|Ï=Ð}Ð ºÏ±âÏ =Ñ}Ñý‘ ý*†þÜÊ%}Ò)½Ò-ýÒ1=Ó5}Ó9½Ó=½Ê±<-"ýÓI½ÔMýÔQ=ÕU}ÕY½Õ]ýÈC=™}Öi½Öm½Ý*ýÖy½×}ý×ÿy‹Z™¿œa‡9Ì‘S[‡›ýŽŸ½‡£}¹§Ýº•½Ú‡ÛoXۜۑ8Ú½‡ÃÝŠÇ]Šb8׫b×uš†Ëý…C€H:‡yŽà‘ß=°gzˆóݯÁ}«µ hálØÞ÷¹ßU{ÛI%¬‡>«#ÞÝ)†'~†ùâ•Xã“Øh¡¾_XÝ©‚Ý!ž‡cA¡‘…{a©eøâàÔXß—Xáiæ^ŠÿÝÙþ·Ýæe~ã¿çÃŒ9~Ü_>æƒ~ŠS›ã_˜Áè³`hÁ†W>‰‹þæÏ8ˆ½ýÙ±]é1žÜ¾ÝɘëÁ¾†sþˆ#>é©þ‡«¾ç…Ø–†E~*H~ÛyØbAܾëˆÁàÙþÛ9™“ûÞ꡸ìKÞ†ùÞïó>íÍ~ðÿžÜùÞñ Ÿð‰øÙ±ñ7~òǾŒ]žî»âgžÜ9_ì/߈³>†MŸòuþñ#_ð¿óƒ8ˆî…½¥‰ôàvÁ¤Û_t8æ]•YÙ•Û`”Kù”ƒ^øU©Û@€hXÞÝÉà€쥟ú­?¬yß÷_þùÙݸ€–ºû«ýu™—ÝxÞž…· ‚ã³û™ý¿_§Ãÿ÷¢M›,`‚qIB Â…Ìb(ŒÁ¬ €C»L5r!€FƒU¶(Æ‹%.<¹™%M¶‘ƒ€-r8R$) A„(jÜ8k‰Â-©B`D‹ ³š=OªdéS L™4mV¼˜³àÁ„MÛPRfj—Ž)9"UÊ@Ö\³èÚÅ…QÆ]}®l©öeÌ™iob¨•g×ƸôúEf®ÚŸyTH¥ökرufÉë4K]Æ/>ä¤Hœ•%Þª—jß«%unÝ|v©@†· :´hÞþ©|g>œø%3.´aÞŒò¸ÓŸd%‚þrä_ׂ%‹Uì»vðŽÐGÿ=šTvé§x¥î­êœõÚ×M>ŒÈ]´ô’ý–´N¹rãìÀ͆OSÔqåd͹—\.å5 U8qæRS©—ZoÂgÜz‚éwZs¼¡7!i ÎöJÆh0JŠ*®Èb‹.Ž¢1¥%ÇÑ/„Æ,Í)7£)Ž(”Êrl‘‹@Œ4Ó Ä³£~ éÒÌ[4£ GŒ1GÖ Êhæ”RRYã9‰¤’Lv@”S‚!—SVÙFj6£VÂp™ 2ŠAh’–\æå&˜Ùˆ£Žm™ä’]É1 þm 1‹f:f„9óA0ô"Ë0ÚØ•tõ¹esÂ9©˜†"j&rÙ‰§ži~ÉæžX’úg›s¢Jéªe*ÚUCiicsÖš«ÀÂÐÌdÓœ•¢Få§©»†Y(™‰žÙT$”8ÄG®,[$,‘Ò^iÙ»ô´Ë\J蓹aª)§ž‚**fjUÛ嵃ªªm«h+·àŠÛ¬åð—p*.±r~ê´Ñ¢F/jà»i§šúº-ºBªk)Å _šiÈûr„°­£þ[jÄob[©²Ü¢Ä¨£J ²¾#ïØ«ÉîËç~m¨:ãÀ›ÞÓq±Ï^»D»_Ž»æÔ}òÙ—^×á‰oÜúëo/ê“?}^Õ#/z¿?£¤~)A„á7¸ŒÈ%±U÷|b@þ¥¯·Ë_ýÐ÷¼ùðt³ÜB(þïÑîGúߨ:ÊñèNqÕŽ˜7Aßi€îãJ@Ø·¿Å#&t•SØAþÉ}]^ñŽ—ÃÐípAlC h)àèßÿ€žÄ~Mòß ±ØÄJ¨‰ûâêòrÅèaÎ|% bû—F)n!'›[#(BNpb¬K0´×Xü‚ ‚@LÁ®=²ð¶£ «ä ŒE¸¤pêóZɧî52p”ì_'óBˆdÃPãK"9ÉMð’‰ìŠ.Žr?¥­²‹·ƒ¤$óÒIè¡“·ZdB9ÊRJD•ä³e*±gI^:%‚$¤!- bâ2‘”¼_-Q‰KþiòM™} d3¸€%r¥d^Í,äÞäpaôD‡`JÇ$2/qZ³cÆÌ&2åÉÍÍßÄ0IÙœ\ „Ÿà¤Ë'MiC_Ê2™‰,ç3CÐp&´1ļæ-yÏm¶²)¯T%»(O‡&0/¥K4ïIÌ|³'Õì¢JåÙÍî2¥œf&#wÊ‹^R›»lå<¨:Þq¨yÓãB•Óž#'É!Px€NÐ(ŠS½ ûå/…¸@F±êê¬Ç·¨îŠn,£ë‰c#-i‹ÖV»jFÖÉS¬3‚DR¡=˜N”ok%fÞÚÆ¯®’®äËIZ×Êë¶5B€õª\Ã*ÕÁþ9…”TEü®*Â*„‹ÅZì_¹ØÇ¢F³uùC"È25¡9y*ÒzÙ¸:…+8ý(4=«UÐ:¬£ìxÆgZÔªÖ°jMËnëwÚÔ†¶¯I«ªBgéÒ*d² ®r¡{YÁÊ,«Óm\yÛé6Å®GÀ+vii)ênwªÖ®ø®:>銑³J“/_'O³ª0³¾õ n» ×2ε¿!݈:Ô‘øˆ ~pŠƒ¼æ/ùBà-oz¯®a9Dc|Î ¢çD©àBÔÔôÆá3·dÈNrœ D¨Äá’p[ éó©Ær£›úÑf~9Ð;>“óíë6—»Ð2ö²Ÿ}çñÄ;lGv³c7ñx©›ã÷C¼åQ¹ÃÙ®tµ'~ð¾–ˆÏ7ô®Ýòa?ÉÉ’òÎ3óèÞüâÿ.ð~ R"ƒ¨nõ.òÝáþòT»B"/O®ç]*ÏíIÿó­ }ïµÿ-Tr—ÛnçÖ£õK __!ÍPúö¿oý)á¿ùÅoþô«¿)è¯Kùç¹~=¶ßü—‰¿ýÙïýû'p}˜W„À=ó§¸èd]ñ~è\Ía€ ¨~Yç€Ü—˜@õG( ˆè 0 TÒ7}.R}H‚%h‚¡‘ðv'È‚-ØY‚.x}°À=4ˆƒ  »à/©à9¨€ƒ*H‚á´L@ˆ_H¨„ aƒKè„Ox`!H}V†U…_UxSP¨…> °°…_hÐ…2†zÔ ‡P†i¨†þàbè…kè„3‡ñw†sh‡(TR(‚Ùv‡}臈(ˆƒHˆ…hˆ‡ˆˆ€˜‡zÈ"#˜ˆ‰‘(‰“H‰•h‰—ˆ‰˜¸ˆŒ¨"Ž˜‰ŸŠ¡(Š£HŠ¥hЧˆ›È‰E…Š­èŠ¯‹±(‹³H‹š‚«è‰ØMÙ·`$÷jѵ(ŒÃHŒÅhŒÇˆŒ.¨Šœ˜‹ØG!àn½xGÐ9Ï—Œ×ˆÙ¨Ûȳ¸ŒŒØŒ_Æ´@ ï3b' ²`TÑ îä BÑñ(óHõh_øzŽÚÆ [p b§m'a â–„–v © É é¥‘RX}rPþ|  !Ç!7æ¡ć!jA!ðG B Ø1;@õ-é’/ “1 ‹‚Õ§ ÎðbfS2^§ 5`("F6¤æ0m1Õ”.Ä¢3赑2É”Mé”O •©x‹Ì˜mg¥AX”ŒÁ%¡_;²3B;u@æG µ”Q‰–i©–kÉ–H“ÓW}¦ÀÍsH‰$OÀ%UIõK¢PmP’5HæÄJ¹1?Õ–‰©˜‹É˜9n«ØˆU¹_m`_÷³”]yFÄ…Xm°TMua•y阣Iš¥iš ù–åf“8‰i×–kmph AºÐÜcÖÖiùaVaþm–’€§)œÃIœÅéS ŽÙæ¹@`P õ†|j§•² =ÂwxéxYÆsmÀzÇvã|Ðgœåižç‰ž˜š–‹ œmÀ‹àŒéiŸ÷‰Ÿù™†ëIT# ª€Ͱ3 8„+¨ŸŠ  ª pÈŸ Ƈà ´ äI€n¸ Š¡ª¡4Ø w´ ¢!*¢#ª†jGJ¢)ª¢+Ê¢h¢æÆ‡-*£3J£5º}/z7(j£;Ê£=ª¢8:…>*¤CJ¤# ¤/¢£K8Ÿ™¿ ‡õY¤SJ¥+z¤{8‡ÐH‹6aXwjèÖX¥cJ¦z¥þx£\ÚÉ@ ‘ *Ç#‹1-p'Ó% PÚ鸎mÐŽ^z€Oz 2¨~ïX¦…j¨z¦‘y}˜á‘°@± JF†Å¢ ×G  x:{*‡Ù©‹J h×'š‡jª§Zž‰º"Y‘(©’.€W´“WÎE.¢pcu˜^×lAY(î!ᡤ¡4´ÑéAù‘ÑÓ!.ñ!«!"©ˆ‰ªÛÊ­¤©ª˜m7™“Zcf ŽRww Omp‡§Fy2H 7.·=ó(‘Â2ù"2ŸÒELƒ3?Éš1‡Uj“+¶Ög`“”rÔ­ ë°mùþ­)R}VéEDÄ#Ê`Y©1¤êx c¯÷DW‰^=aDÆ#AaTwSDF“YAlt\o4Dôðk³7۔ˊ‡4—6%Q Êð=éºWr ± 5§»*R…ù³IÕQŽæ1ÍQR &—:dJõ¤—ýƒO>Å’8 ¶a«:;±“Y™“ @;ôA«| '.×™–ñ™f¯ A^æ¥z›“\î•_“Y°nå]Y=Qªb‹¸‰;d®ëšU&LæÂ@—©&µ2Å#»yf½‰B¿©®±µkH&©«¤4°fIâÚš¥i"†k+ñ©¸³K»Çȸ ±œÍþùœàis:7 ;ƒpÚ¶ðÇ\jÑnïomÇ»¼-~wz‘zêŠT§x –»´àœ¥vw27|^×|bZ»á+¾µx»=ážZ¸¤Û§&x¾,(¥ã ¿ñ‹Šå«ÿ :ö+ òË¿ý“ô»c:¡ ¡J¡þ‹À L¬À ìÀ ‘È©i ÁlÁ ÌÀ¬Á¿ÌÁ ˆëÁ!LÂ%Ü­#\¡÷—¾¦Ô¤Àè& Ã1(<€+ô©Ô9 •¦,Ã? Ää+ÁIÁ#s0\ 8©Ûwz*}»ðÄUlűHÃÚv ¹ðr ¶Z[ßwþ›*¡‰WŒÆiLŠ ­ÙÙ b ´õh²{®:o*¹«'ù«ì!§t¡­j,ȃl‰¬º1·°Çá Æä SNC®òÙ,Îf)òz4‡R¯f9G„ÌÉ|ˆL±eùAº ¦ðÇ’#?K³ôµÕ4²¬ @šìɵlËR ™«šmW«Dui˜(‘.0 ÚS<¥R-e)L;˜ÏôR‡ùµ· ÍѼ… l¶vÛGdÐ ziY‰¥]y!]®TLE·PeÍs¸ÒŒÎ鬄†ì¸;öm°Ù¢YÐ t }kÖfovlÆæ«ÖlxÖœËjžëί¹P²«Î ­Ð$þÀ×›½Ë‹uA ƒd ÁÀ ÁáL· N{ÆÑw\uW'y×ß¹{´4ž ­Ò+í¢C\“ܾhÛ·ÂÖ÷¾,Ó9­~ ¬¿ø;€M¨ÓA-Ô~ÈÀ<ÀX‡C­ÔK]†YÌÔO ÕŸèÔQMÕU­ž. —ElÕ[ÍÕ…8Õ] Öa½†_½§÷‡5};-Ü7-ÖmÍd-f-E9Ì¥;\>ìÖyMÈpmCisÃ\ Åè&ÅkMÅzmØœÌ×Ó6ªæ—dŒnf|Ø‘½×X­šÙÖÆÆ÷ƽD.öÁžÑÇ‚Á¬¶QqƷǽJ#òÇyÈ’ÍÚVÌÎãŠÉ;§)6Sþ“8 °q2'öd4(“Ès–­-Ü?LÍ^I²˜+D¡EqtBŽÅÛN„@ŠóEJ¹ÉÃmÝ% À¼L—NkRû#ó¢RU»µy¡ÌÎäËO»«}ÝëýÁÅ™”YΓªW ñÍ}»\1·ÓU·SÙìíßüÚ«‹aïœg{««†º3†1!ÐÁ6à½1ýߎÁ”ÍžÊɜػ»'=Òt·GîzŒ­¡SÒÉ«t.K)Má+îÀ#ÓOˆÖPÄÖ,NãòËÓº¿5®ãÖ]ÔŒ×;ämØANä`=äEŽäU}äIÎäL½äMåAýäQNå+=ålX1ŽSjåkýÂþUæ=zåbÜZ*v=~yÑÃaÎæ6:ääòähŽ_†ŽêÅîDæSÜæ{.£o¾wþa,É¥]UçÌç‰.¢ÌÇ™ÝÝq8ÕŠ’m0’¥=vœÚ=A´mÐédÚÛ‘­Ï¬è§~¡|”‘ r=ù“”uR§D©'–ìÛ™ü¥ Á q+ŸÐ’Û˜ܨ.ì À±,Êþõ[³+BáËÑ}Üxº.° š‘Á0çSéÃÎíÄnáý™mMÛÌ£y)–{YSñOÂTÞ„9î1å Ž²)Þ¢ÞÝŽïö™Áêu¶–r™À5™YpXL‘ß­EÎü]þ}P›ðÈ%\²„èù.ñæ À¾j±)³Y›+( ^cYæi ®}f »-§8‡Ð @"$Ä->ñ1šlÒµ'ÉN†g;—}qÛIâÈ›tО²ym Ð âÍ¡â2ïôÃ9ææŸZ>8ë;83þôYߘQÿ}ªõ_o¨\ïÄcöe?¦boöi/¶h¯ömo³lïöqÏ­p/÷u¨to÷yößî sHõ,Äåy¾~Òž†X¯÷‡¯GxO€fŽnhÞ僟ëe¸æˆOù×ççÁ¦n*¼-ä׳>wZw]ƒ-øùƒ¨¬õ}„Zù­Ÿ@—:ŽþÊà—;Û±T© ©šJè¦dèMÌØ§ÿ€¡ªúÛñ®oü˜Ëຎ­« «DK`ܸº´€ÄüÀjÂê²éé£ùÄÚÆÉúLÿ¢"ÁóÒ rÖ:ØJ"Çoÿ]¡êóÊêè çªØðYþ$hsãOmÚ$TØÐ”£†©ŽÈÙ’K!£fÈ;¦!Æ!Û0CÖ°6‘(9 ÀâB‘!åÌBÓͬ, }£—¬N=gy$šreË—~3´.g[¶ÜúÀêU o(Ë ói3©Íty\¢éÅŒ;* a*æ[¸qåÎ¥[×î]¼þyõîåÛ×ï_À&\Øðaĉ/fÜØñcÈ‹iUÙòeÌ™5Ò`,ä®a[B û PÉ®¢!• ‰kkØZdµ¹¥Å+H‡‚Ý´iÔ·åºØ•3K°Þ C¤JýVI°9Á”xT¥Ð€êm¹.r9uëÜÿ¸Pèw\†Çæ_þxíÜ·9­œ{düùõïçßßÿp@ 4ð@‘&ÛlA+ë,$X~áâ!2ŵæÚˆAebiè<¯šKHŽTbIEŽîB ¦4…"œ°Â6.|-E¸œ©i bZl†‹«2ŒIù¶!»ƒeÇCôʵñ-†äþPf‘%uÛND 1Tèƒ÷ôòK0ÃsL2Ë4óL4Ó|KÁÛÄìA‘² „¹6è$&Ü\H¥“R!OI,‹„€’hTȘDâœS!;ñôQ¤>i£‘ú#2² ã#¹ ‘(qµ(†.ÍtÓ@ÛkÃ<\³ªÈU… ¡Ô?]èrÔ:ïŒ)†ÕôõW`ƒvXb‹5ö؆ØtsY8"Æ9mc˜f …ij6hùÓaŽPèˆH ×G9)gz6Z:©µ[sæf"š¨câ=/„H¨$Dq‰$µ(‰äÀ7^¯ ’Šªºpf†tk ±uWŽkrÆCdþ;öøcCyd’ÉTvÙ6›mc‰LQ†…²F˜J"!ä"Û˜d-…HP%É%ÒUíha‘e—anCfšmX¡œI úhHˆ*ÍܨEšÄ6…*øYhsÂZëafÈ‘\¸ ŒJ) †µC€ZÐ W¦k¾¹hÑ­d 7üpÄWÙ“QfPå1aH÷¯f”ö«r! ¦?g`XüsÐC}tÒKï«qÇ7ƒÜt/Q‘fxf}vÚk·ývÜiG=õÌVÏÀaR¡%—Á7þxä“W~ywçý2ß™—~zê«·þzìûsþy±Íþ{ðÃ|ò©ßžûþèËW}öÛwÿ}5Ï>}øë·ÿ~üó×ÿtʸWÝ{Ç< 0’Ë Cðâ…!Û_ø@F.òãýó¤Ö%F+ Bfá-À0Ä‚“` MxB–‚©³ \p‚9üÁ\…å ÜÄb6lC/šô8c )$bxÄÛ­Ðq-¼aCn‘‹ÈA 7‘Kï‚cpLÚ Hx…D0†QŒc™Q¦2J(û[À .$# I’)æè¨"‰\`F“âF8Ê1fºØ„4£5$klããxÇ„ÌH$d BI2|À\èÅ/,".‘Q”þ£$e)ÅdFf°`A‹F8Òg#Å šG&Ö 0#®\ šñ2 DI±E^²Kµ< .$1 JT—¤¦-¦¤f5­yMÇ ÒM*ãÍhXT%…@‘0ÅŽÉ¡ÕêV ™8U« ®›¾ùfpâ9Þ¡H¦‰M€T `ÿü×;ºˆBYšÑ“²à‚ILW°w"£:Ò7‰l‘„#-Ý3&6ZY¯ŽÄ£W²KeiK]jJm¦ €1“V£D’@2ôÂBºQÅGÔY›†äÍA”¢èÔ<Î%R“ªTL¥©x}ñ¥S¥jUSÓ©l]ÒþºXƲõ§6ÐD Yè&7 0„ ²øÈ-6¯t[¾Ôˆ0µÕt© Z\­Æà(‘Ì«^ )ØÁR³1«&V±‹½V@¤½,f3óÎB ™"Ìø¤ ±ÆC|„{ìcQúæ´¥é"\¨€e­ÃÁ•µL²K£,jãÕµ˜PÍj 9ÛÖŠ8Z2V¸Ã%nõ» &.!! ålÈWºÓ¥îïŽû?ÿÀ"8Õånw½KÊëj&¹ŠéÅ!¾{^ô¦…áE¨zÝû^øZ•½oši|í{_üŽr¾Ð«o~ýû_Kp¿–o€ |`ƒoÀÝKpƒüàï-˜3ý þab@ÒÜ+B nCt!üaXÂÎ0b²A•øƒ8, CübÛwÄžKVˆfE¿0D‡zaˆY¬!ÆXÈC>ˆG.þ8‹—¶ÏðÚŸ÷auþ³-JW+FMé¸v›®€tF'ͨuâœbi34I¡ Iq¤#”Æ+ÐÏfw»èjšUW×,j)LAÕR¾>T¢æVÓy'U.K¥¾OU(»[á ‡ «·Ú®¾zõ®×žhHäzhƒåK!ºp+Åt<¹6<\!§Ñ“[LƱ gyËñçêÈ*í´cDÎàYñ†Ìœ·YómÚüæµÁ6æ“mÚßn+µèöj”;û¥\ª¥îÈ´°0—ßc J³¥°XÀ„èaèŠ\( b¸D›@CA¼ œ‰š¸‰œWÉŠ‚àŠ¢˜°€+¥` §Á6ø§¼Áµ3þ¼Ÿb@sQV¡#«Øa“µ…ØA†èÀIˆèÀW oÒµì½\£àxŽè˜ŽÚs!…Pö0ÂZ“"¬AfÃA2 ;ë¨@1—¼¢È‚X1jû4ô B8€, †aP9 7m·&&-yŠ Y¾*R)¡’_‹@‰C\©2|D®ÓA÷Ø)…è©§ñÁx)¿¸·"œD¯È‚H8†`h’¢ú7yÃ#+ Nô”#IAXqY¡OÄN|2HÌÅ­3¼Ž»¸B+µb«§á¸$*- 9èEl4°iƒ¼r–½‚¸wQ& ™¸i‰8Ïà˜¯j<‹ƒ˜þ»¥e,’ë0âÓEu\¸è#­&ñ,Ð*Ct3ìC˜>àŠÚ2ºï£>…@ƒƒhG:Ù’¹|T&Ü ‰šû£‚üš†E³9ã˹ºq„þÓ›@Ñ9ÀyºuÜÈv ¼š‹•3 «ã ¬–ÈãH”d5lŒÊ-ˆÚKI™œIüXIÆH X IžìÉlÒ»½#1ŸJ¢›,J¤LÊ39J¥lJ§D¦|J©œJÿˆJ_±"Æ“›68 „8IªüJv³J5É Ík½Îû<°LËŽÊ·Êæ€!¢!¥Á±Ã{ JP†šÇ¸Ø1ò1 ?µÌUK%y¢(š"§ Ëþ½FØ90C¼ác2%i>ÂÌÌ)sµëË>;[? ¼¨;j$Ñ$Nú³†"’ôsω 9¨È&éÌ?º3=L±ÕüL4ƒ‰)@ÍìM!s5…™ †A܈¥Y’B…°´hb@‚A´— …€k¤¸r@k¥dЧbúÀO[ „±Aß Ïs5LŒ5(|¡q*§sâ"e£¸ÝpÂ=ì’òB(dÂ`6kOñìÏs5&ñ6q«¶·x¨ˆjn#Лë¨Qè|‹5äŽ5¼(-ÙCš¶jÞôO1¶<(•©ONÄ)R’§B•aâ)Ü:!†Ö‰ùÜ·ò`N,þÅœ8T ÌìP0àŒ á9mtP°+²2+"E9ûFJ«µb‘K €LXÀ–鬘§è¸f`’‹Æ›F!­F É-Óür5¶q¸!ºÊzÈËʬÍú¤„Ü9´N›ƒÇ]-…ºòÀK½´ŽŠÔ ÙdSÔ È£HB5:@ÓH3mTø";Í)™¬Ü ¯tTK-²õÈqØ‘KýÔ¦„·àÐUSõIÃ<<2,Ä–Œ\NLŒvt„zt|b\\F<äÚÜÔªœ¬RT$”"$D:4ÄšŒœvt|jl¤–”ŒlZ\ܲ´Œ244&$¼šœüòôܺ¼ ¤‚tÌžŒTB<¤BD„Ô¦”´Ž|Œnd¼’„üÒÔœ~t|^Tœ:<ôÊÌ´jlD2,dND„f\dJDäÞÜܪœL:4„j\tZT¤ŠŒ¤JL,"ôêì”vl|f\\JL¬Z\,䲤œ24<.,üúü쾼̚œTF<„ Ô¢¤ÄŠŒ”rldRT„jlt^T lVL´’”Ì’”\JDìÖÔÔª¬$”*,ÄžœœzlŒ4*$亼 Œrt¼–„¤~tüÊ̼jdD6,dRLL>4¬ŠŒ¬ND,&$”z|”ŽŒLBDôÆÄț¤œfd¬žœtjl¬†|ä¶´$ìÞÜ<64ìÚÜĆ„´fdôæä¬VTÄžŒŒܶ´Œ64¼žœüöôܾ¼  ¤FD„Œrdœ><´nlÜ®œ¤NLôîì¬^\œ64üþüÌžœ„ Ô¦¤ÄŽŒ„nl´–”Ì–”Ô®¬”.,üÎÌ¬ŽŒ|bd\FD$D:<Ìž”TBDÔ¦œ´Ž„œ~|dNL„jdtZ\,"$”vt|fdTFDt^\lVTœzt4*,¼–ŒD64L><ÿÿþ!ùÅ,Ë­þA H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -iA€Ñ£H“*]Ê´©Ó§P£JJµªU(µ«×¯`ÊK¶¬Ù³hÓª]«Àˆ¬C¢ÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwhð N£Ê›7c®{YqdŽ“G÷-­ZîcM±n­Ý:sãÓSGÑT„¥¢Œ¡1—ƘÝ`8±¸ —·oà®s´i3FS”Юå ññà!®‰þpÒƒ¢†ÜIôpR`·´Œ/r… iÃóé×7ïý;øu»ÃW]rËí÷œHGuØýÅvÝ}ÞxåÍ…›Fº]0Å2DpËnk0kXWĆ2ø —†zèÚ.¸0EÙY(S4ÒÈ`¸6Ì1[¬0!ÄW´×\, #W-!ÃÈUä‘IFÁb‡:H—&!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”™!Œ\pÂ'' pr_˜G—žºfh 6ÔX#'‹6z],ri_œüðYf¡Qb(]2(!W¦›Ê…h}ºÚc}z_¡þušêu‘:ê ¤r1ê¥QXjgaQ|±ê\`Àœ\z€G—°  ¬zØúX²ÚEëæc´ Óp(É'ŽrÍ0%¢E‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFº½ò] (‘†È+]þ¶Wëµ£.œï—8<à­\³\j 2h"CišD,W¤ÝðÀ<ÈtàpÊ ç*éî݉e¾¡I uô Å Q“x^ hfÍ7ç|1JÐcm¼acpî¸4ÌuÔÐ1+O_f(Èõ@GñXÕW¯8…Í8ÛZéÎ=ÿt™f£m4H» ´\M?µþœ Ç ¬&?˜¡iDñ.s]ðrJPr,à‚]”Œ¡ì,<ö˜@t„²0oñŠPf½Y?Ê…Ã+dú˜è¤·Ð\àƒ~ݰ‡'þ‚&`4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…x¥ðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹à%„ÇLµL=ãG—W#”Õ¥c“lŽÇ¢°HÍ’1kXŪÓz=hi‹ÙD)—½ŽR“Ûhú¼m®–(3 JVA®vr-%+»(¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\JÃí®¿Þî=|^˜ƒ_zàl’WŸŽ‘¡ú4І=õå mP–<kMøF¾y‰êa.1 Àô` íä/8ýk#¦±†Â%Cb$x›~Ñ„™øþ@ÇA%"všeDóÞ…nô‹0$µ_ ÷åD.ØQaÑÔ¥Ç`1¦vÝ"`¾ ;ø*™ïŒ ¥TûÎ*{Gí›kRì=ô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿p¢`†/¥œ[À 9©crþÚÚH%³«/C Î_hpØÝ*¸œ Î ê6…Ë­F€,Óà8èóþ…ÀdÕ×\æ€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥ôBÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÃà•æÖ4#»–fKiò þem»˜/Ds–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó(Ä"ëQë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínQXC4ðaÈІ ¹Eê(0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë ÔCÊsöñ$¯ïyI- SËí©U»]JkOU;ñ¨î kyl“×ÕÖZR4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rÆk€~À 2@Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]Vp`t­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢x€` þÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋið š@ ?0b6˜0Xuóocu[d'#C0z¡ P@œÐetæ…±·øIm—Wsç {x'x¦3<ã3ÊcLþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹3CRLÀ]VzÙÖ‚H¸¬ÇC®‡SPYu1 ‹h}tØ|~1{®Lš€ PP‚¿—A¸W[¼uÔTœ0ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†Q@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçikˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh¨lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹5OG™¾8Œ¹·{µ¦š­ÁDpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3imPi5°yœÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú1”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-Bš öD^Ù•Öj½"PkýÖÙ¥~0t]×v}×x×z½×|Ý×~× ðׄ]؆}Ø{Cj™°Øí+ŠàTÙ˜  Ù M’ b :à ¡Ú0 1° p ¢ ª=Û+Á• K` e@Û¼m*€¡0G°½]Ü"‘X ‘–Ð ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þ ©`ê½Þb¥mÞð‹@ôM–` XPßGßü½1ŒÐßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿ}5žã:N׊Ý×@¾*" HäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!Q¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôBïÑ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIh(²fà…)dD¸e ‘(XÌŠòcŒÖ/=?í1d¢špE•€«ªS _Æ& Vòd¯bˆ5°ñ@3Âþà%ÍE/mDL«¿d‹Ê“D':M3FœXñ"cÇÉF¦\øHËc•TúÀòåQ4„†‚C-§ÖE9MHªUSsŠ·*,´oäÀ‡Ÿ—\\+x¥¯œÂOi€$*HÐÂc“F$†IJRDŠ“_þ75Lš$2`ÆùÝ3:P¤gŸþˆ!œ‡&w‘JŽ®ÄKÔ@š¢Ÿ.7††ºjr¥¦Új­³Åzk¯¥íúk±- {l³µ,ûlµ L{m·ƒkûm¹¿Š{n»Sªûn½IÊ{ï½ûöûnÀŸ{pÂß6üpTƒ¤qLJèŽuUhƒîþ*À Õͯ~÷[*xQ‹6¸!‚`o‚`|¡¶X=ÂP€Ìßþú—½äÉNu‘Fó¶·:^ ƒ l/VâPvnÆ#à_puÔØ@Ãæpu¥† ‹ÕQˆD\'V6p!‹[ìbƒ8Ä"Þ€‡7 õ¦¼ÞÀ­0¢àwT˜aur\*d§ ±FdƒÌ·=B°t´ã É:>úquµØÅYII®®‘7¨Â9G=ªyktaþ‚†6~a«ÛÁVgJTÊN9yÒÝrXá„*èN†7`å R¹ÊS¶î•ÌYÝdþÑ3˜"˜Ã,æ*õÄËVz’}¬C….ú »CÖñŽœ”!¾èµ®š‰\äê´9;U„­+ç9o0N×USwc#ôvAÙÕ:¼/`FÙíb¨ˆCzaDãµÎž8Ä'…HÅø ]jΈNT è@ó¹O:³…-!,d·úÙ¯—úãŸÿ"¸ ]èaiüZGÒöR‚œhCVÚÒ—®ÎøB0RàS  u§.…é PºB‚}O…jT[·¾JÕªWUŠU®vuvZ…gø¼:V¬‚Õnl$kZ¯jÖ¹ âto…k\Yå·= wÅk^õº¬W¾öÕ¯l` Xb|2¬jE¬TÙ*7´&Ö±Ö[ìÛûXÊþ.²n›le5[»Ë®-³›­ë:«¶Ï†Ö´£=›[åºZÖ¾•®vlle;[ÚÖö®…ÕžiuË:Ôš­´»ÕloÇö[àRV¸b#nq{ܯ%W¹ˆe®×œûÜ´FwkŸkmvµû*¿1ŽsßoxÅ;ÞÎ)μçEozÕ»^ö¶×½ï…o|å;_úÖ÷<;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_24.gif000066400000000000000000000206141343257752000273400ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÄ¢¤$"$lfdŒjdÄ‚„lRL´bd´’„ĺ´T>< <2,ôâäÄ–ŒŒvt\NL\F<”"$¬RTÔ¦”„ztܲ´D:4Œ24äÚÜ|b\$ÄšŒœvtŒlZ\ÔªœÜº¼|jl¤–”4&$¼rt¼šœüòô TJLŒndŒ><ÌžŒ¤‚tTB<¤BD„´Ž|¼’„D2,œ~t|^TôÊÌ´jldJD¬Z\L:4üÒÔ„f\tZTܪœì¾¼œnl¤JL,"ôêì”vldND\JL”*,Ô¢¤ä²¤œ24ìÞÜ|f\,亼„j\<.,üúü”rlÌšœ¬ŠŒTF<„ ÄŠŒt^T lVL´’”<64Ì’”\JDìÖÔ$ÄžœœzlŒÔª¬4*$¼z| Œrtœ:<¬†|¼–„D6,¤~tüÊ̼jd´^TL>4¬ND,&$”z|dRL„jlœfd¬žœÌ¢”œ‚„ôÆÄä¶´t$¤‚„ľ¼ìÚÜĆ„´fdôæä”&$¬VTܶ´Œ64ÄžŒŒܾ¼¼vt¼žœüöô  Œrd¤FD„´nl¬^\Ü®œ¤NLôîì”.,Ô¦¤œ64ä¾¼üþüÌžœ„ ÄŽŒ´–”Ì–”Ô®¬œ><üÎÌLBD<24\FDÔ¦œD:<|bd$Ìž”TBD´Ž„œ~|tZ\,"$”vtdNL|fd„jdTFDt^\lVTœzt4*,¼–ŒD64L><ÿÿþ!ùË,ËíþO H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -©A€Ñ£H“*]Ê´©Ó§P£JJµªU, µ«×¯`ÊK¶¬Ù³hÓª]«@ЬA¤ÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwhAϤʛ7c®{YqdŽ“G÷-­ZîãO¸€¹Ý:sãÓSKùD$T&&¤œ1Æ™ÝcB¹ø —·oà®yÀs擔Юåq‚“"®±þ„Z¤‡ÜJ…J`·t1r‘ゃ óé×7ïý;øu»ÃW]rËí÷œHGuØý'ÅvÝ}ÞxåÍ…›Fº}E<Ìnn4!EnXGĆ8!—†zèZ2ÈÙY(×YL2Ic¸–L&1›±4QD^´×. #—3‘ÁÈUä‘IJÁb‡:H×'!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”¥Œ\‚„Âg( „rŸ ˜G—žºf(9ÔXc(‹6z.r™Ÿ¡ ñYf¡eb(],!W¦›Ê…¨}ºÚc}z_¡þušêu‘:ê ¤r1ê¥RXjgaRˆ±ê\cÀœ\‹€G—°  l‹ØúX²ÚEëæcº$v(É'ŽrÝE&¢I‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFºÝ‚] ,±ÆÈ+]þ¶Wëµ£.œï—;@à­\´\š |’AiŸD,W¤ÝðÀ<ÈtàpÊ ç*éî݉eÒñ zôjÅR£xa hfÍ7ç|]1FУpÐa£pî¸4ÌzàÐq,O_&È*ÈÁGñXÕW¯˜…Í8ÛZéÎ=ÿt™f£m4HË ´\M?µþœ Ç ì'C¤±ˆkHAƒ0s}@rKdr,à‚™œ¡ì.<öX?t÷ƒ²0oqË"Pf½?ʵÃ-dú˜è¤ÏÐ\àƒ~ݰ‡'NÃ'c4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…xeðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àU„ÇLµL=ãG—W#”Õ¥c“lŽÇ¤°HÍ’1kXŪÓz=hi“ÙD)—½ŽR“!Ûhú¼m®–(3 JVA®vr-%+;)¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J÷Ãí®¿Þî=|a¨ƒ_tl’WŸŽ‘¡úL‡=õ…pP–<kMøF¾y‰êa4‘ Àè` íä/8ýk#¦±† ‚&e$x›~ù„™øþ@ÇA%"všeDóÞ%nô 2$µ_ ÷åD2ØQaÑÔ¥Ç`1¦vÝ"`Ä Í¾ø*™ïL¥TûÎ*{Gí›kRì—Eô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿„¢`A†/¥œ[À 9©crþÚÚH%³«/A Î_`pØÝ*¸œ ÎËê–…Ë­F€,Óà8èóþ…ÀdÕ×\ê€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥ ƒÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÉà•æÖ4#»–fKiò þem»˜/D³–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–s)à"ëRë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínRpL‚dÈІ ¹Ej)0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë• ÔƒÊsöñ$¯ïyI SËí©U»]JkOU;ñ¨î kyl“×ÕÖZZ4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'r&Æn€~! @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]Vvä­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢|€`ȰþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋkp Ÿ  C0b6˜0Xuóocu[d'#C0zñ Và¡Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcMþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹3CRM]VzÙÖ‚H¸¬ÇC®‡YPYu‘ ‹h}tØ|~1{®LŸ VP‚¿—A¸W[¼uÔT¡pºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†R@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçi(kˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhhlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œ(žè-é~¤h’d©hC«x­˜›ù%ÑÇta‹uOG™¾8Œ¹·{µ¦š­áXpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3ipPi8°y¡ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Úq”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-BŸ€öD^Ù•Öj½#PkýÖÙ¥~t]×v}×x×z½×|Ý×~×`"ðׄ]؆}Ø{íCl`°Øí'`@ ZÙ˜ `‘Ù M˜ fp rà ¡Ú0Ñ 6à§À ©€ ª=Û+ › LÀ m@Û¼m-ð¨0H€½]Ü"_М ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þá £Àê½Þf`¥mÞðŽ@ôMœÀ _PßHßü½6`Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÝ5žã:N׊Ý×@¾*#0IäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!R¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôBïÑ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIk²Œ #ûØ .È¿„a7ò¸B¯À¯Ô³Š½µ² c»ÝÂXb)ªX‚‡±4If?× :¦ A> a6üŽÄãêØâ?)4°Å”tJA)*Jc+ÖH‘BË8<#QŠ9Ô2h2™í ÛŽLÐă°ÿXt1K’`T±ËŽÂ1£,fÐjL/Ò!Œ.±ÔRK.Ï„3N9çdþ³M‹c.O=›;sO?Á›3Ð+ͳóN—E4QE=ª³Ðß\4RIû$ÔÑG4P+3¥³RKσ”SòŠØCÔN?½óOUWeµUWõ<ÄWg¥µV?=E58RàµW_6Xa‡%¶X^%±c—e¶Yf=È5Zi%Ã$N€˜6[m·u”Nù¢nÇ%·\É@BN¢0·]wÝU—]Px·^{³å"ÜS¼eâ^ÿµ³HDª–€Fx8 lhe$ \I8b‰»R…-FÚÀ*&æ¸c‘Ja€$-HÃc“VĆJJjdŠ“_þW6LªÄ4`Æù](.h¤gŸþ°Aœ‡&בMŽÞ„NØ@Ú¢Ÿ.׆ºjr¥¦Új­³Åzk¯¥íúk±- {l³µ,ûlµ L{m·ƒkûm¹¿Š{n»Sªûn½IÊ{ï½ûöûnÀŸ{pÂß6üðrwu¶q`¥îÀqÉ{…VñôlÅœ¹CI"óÌqµ¥PM´ÑÐEÇ”tIM?Ý$Ë2X12I†Ì3ÝNÖ[ßòP„bÈ¡Û'TwÐy'îP¦¶b¹–'xš28\à€ÇeZ$9`&:Àç—;_Š"œ€'¬4úò_ɲÀÓpÅd2“‚-·àˆfP„ œÁÈ©ÃYþÂ೘ Â+žþ2Sþ! “˜DÆ€œýý†~*y]lfSò‘å=RèÌgÆS ,9ü3f4ӛܭè=8a(€2äœpEÇ£‚¶Ó"g1RPNžrƒ,d¢yÃ+âð"H#dV*Â"ªèÁ¢#ý‰"xÜóÀ ŸÈ€RdTÂ)I‡BÉ  vÄCuèC! ÆE¶4»ÀŠ‚ ¨ñ/jc-ˆA Fñ‡]ô¢”ĤP8i-.0$Ahd#Ia·@(†É0"GOEO~оÀ2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%IBá9f6³VH&IÊ'TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9O¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?ŸÈƒ¨.*Rƒº*V5uK ǸÉ9.68BO%W9‰Fkd6YQµÖ ¼!˜PªÕ ± &p¢ Q…Z ¾€ŠSlX}Z8!ŠSDá dkÎðÕSh•«i…YU¯*’©Âf¬xêH˜êþ»žÌž &H`†¾zŒ 6ˆDI ‡Âv ”¸IN ±ÆNl °Df5»0¢²sÄD;…T¤‚ £ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN—º"ID ´»]îv×»ßox·û…/Ä@¼çEozqºàÔ½ïý{‡!úÖ×¾÷Åo~õ»_ú€¿ÿ0ýKß.@¾Fp‚ï;`÷·Á ®o,Ôâöep~3Lß8 Îð†`XÀ÷}Å-~‘†þ ¿¸¾"&qƒ,a«8@+nLß;” ±(Á(Ìœú’áB8Æ*†<ä<õ·»C„,„"9Éý¥À2K¼d& ḀA"±è°‰'ìßK£ÆF2®p…dÃÁöUÆ „0eLùÏ!ÎE$ñYÐ7Ï{îsaq…?×—…B’‰<ôEžù¼ã[.Å&†-þœ†-·" •B$bÑ!ô ‘€õ€Cl úö@ ôe5}]ÝßBZ,8›…à‹ Ð×»v«I=g"C c­kýë1Ó—zút·Çb !Û½æ6jÜmWþ›¾I,ó¹k=íWº¾ Ä€ƒ-„awÛÖ¸¦¯¬i-oSèºÜ«nõ«Å=`#Àö=Àí»ïVÐÛÔ>¶ï/*€gQGZ±Ø2¡ï« DA D$`1`›ãöóÂé›…’g<­¸CTŒZ@ÚâŠ;µ¸_Q‹÷ÀÈHÖvààß(ß×Éü΂vч+ÝàS6º—µMn2/‡¾¯ø…/Á2´ùÍq&p©®â·Ýío—s½á>wº+˜Ç¯{Þõ®ß»¯}ïÿ{ßtÀ~î‚'Ü.à»øÅŸ®ièEä%?yÊWÞò—Ç|æ5¿yÎO^j<Û ?ú#‡>p„'}êlz¿¡^õ¯0ë÷æzØ×>¿²×ím¿û´O˜÷¿ï}èÏxâ×Ôñï|ò•¿|æwþó¾>ïq7ÝGÿõÓ·[õ­ŸzìÏMûÛ}÷åö}ð^üo#ùzµ·øïwæé²«^ú×ßþ÷·ÿuõ¿þ÷ßÿÿÀÀ$@w ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_25.gif000066400000000000000000000206621343257752000273440ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÌ¢”$"$ŒjdÄ‚„lfd´bdlRL´’„T><ĺ´<2, ôâäŒvtÄ–Œ\NL”"$D:4¤–”\F<äÚܬRTÔªœ„ztŒ24|b\ܲ´$œvt¤‚tŒ¼šœÄšŒ4&$Œnd¼rtlZ\üòô„j\ܺ¼ ¼’„Œ><¤ŠŒTJL¤BD„Ô¦”´Ž|D2,L:4üÒÔœ~tÌžŒœnl|^TTB<ôÊÌ´jldNDdJDäÞܬZ\ܪœ”rltZTì¾¼¤JL,"ôêì”vl”*,\JLœ24„f\,¬†|<.,Œrtüúü„jl亼¼–”„ Ô¢¤ÄŠŒL>4ÌšœTF<¬ŽŒüÎÌ<24D:<\FD$Œnl„jdÔ¦œ´Ž„L:<œ~|Ìž”TBDdNLtZ\,"$”vtL>)JSªÔ<F³©´£mž…xÅðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àu„ÇLµL=ãG—W#”Õ¥c“lŽÇÚ°HÍ’1kXŪÓz=hikÙD)—½ŽR“'Ûhú¼m®–(3 JVA®vr-%+»6¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J÷Ãí®¿Þî=|dȃ_p@l’WŸŽ‘¡ú8P‡=õÅuP–<kMøF¾y‰êaæà Àà íä/8ýk#¦±†ÑÁ“‚c$x›~ …™øþ@ÇA%"všeDóÞenôK3$µ_ ÷åD=ØQaÑÔ¥Ç`1¦vÝ"`Ê Í¾ø*™ïL¥TûÎ*{Gí›kRì—Fô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿Œ¢`i†/¥œ[À 9©crþÚÚH%³«/: Î_RpØÝ*¸œ Î $êv…Ë­F€,Óà8èóþ…ÀdÕ×\ò€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥$ÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÎà•æÖ4#»–fKiò þem»˜/Ds–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó6#ëmë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínmC8pgÈІ ¹Eê60zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë ÔÓÊsöñ$¯ïyIÝ SËí©U»]JkOU;ñ¨î kyl“×ÕÖZr4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rÖÆr€~'` 6@Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]Vzà$­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢‹€`ÍàþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋo ¡p T0b6˜0Xuóocu[d'#C0z UУÐetæ…±·øIm—Wsç {x'x¦3<ã3ÊcPþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹cCRP]VzÙÖ‚H¸¬ÇC®‡WPYuá ‹h}tØ|~1{®L¡° UP‚¿—A¸W[¼uÔT£pºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†m@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçiØkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhÈlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œØžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹uOG™¾8Œ¹·{µ¦š­ñ-pC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3iuPi0°y£ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú‘”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B¡ÀöD^Ù•Öj½#PkýÖÙ¥~€t]×v}×x×z½×|Ý×~×P"ðׄ]؆}Ø{­CqPŸ°Øí.P` YÙ˜ pP•Ù Mš  hp w ¡Ú0 5 §ð ª  ª=Û+1 Oà k@Û¼m,Э0K°½]Ü"á]Àáž@ ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þ! ¥ê½ÞhP¥mÞð‘Pô]žà ]PßKßü½5P“Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿí5žã:N׊Ý×@¾*#0LäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!m¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB?Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIM3FœXñ"cÇÉF¦\øHËc•TZÀòåm8„®ÂCí¨ÖEGQHª5 yŠ·Ú,´oäÀ‡Ÿ—\\+x¥¹¼eQ›Eo®ŒÕ‘"ûX/È¿La7ò¸B¯À¯Ô³Š½µ®°c»ÝÈp‚Š6Øp⇱æpf?× b B96üŽÄãò@â¿64°Å”tJÁ6*r£‘*Þ¨ h˃:<#± +Ô2ˆ„ 8™- ÛŽLÐÄš©ƒ°ÿXt1K’`T±ËŽÈ1£+HÐjL/ÂŒ.±ÔRK.Ï„3N9çdþ³M‹c.O=›;sO?Á›3Ð+ͳóN—E4QE=ª³Ðß\4RIû$ÔÑG4P+3¥³RKσ”SòŽøCÔN?½óOUWeµUWõDäWg¥µV?=E5¸0àµW_6Xa‡%¶X^)©c—e¶Yf5È5Zi%ÓDOŒ˜6[m·utOé‚nÇ%·\É–X‚O¼0·]wÝU—]Q–x·^{³ #ÜS¼}â^ÿµ“†IDªö€Fx8 j€e$#dI8b‰»b¥„,F¡†D&æ¸c‘LY€¤,JøÂc“f¤†MJzdŠ“_þ78LÚ¤5`ÆùÝ(,x¤gŸþ¨!œ‡&7’NŽîÄOâ@Z¢Ÿ.·††ºjr¥¦Új­³Åzk¯¥íúk±- {l³µ,ûlµ L{m·ƒkûm¹¿Š{n»Sªûn½IÊ{ï½ûöûnÀŸ{pÂß6üðrwu¶q`¥öÀqÉ{…VñôlÅœ9Da"óÌqµ¥PM´ÑÐEÇ”tIM?Ý$Ël` „28q†Ì3ÝNÖ[ßòP„bÈ¡Û'TwÐy'îP¦¶b¹œ'xšR‡:^¸€ÇejÄ +R&;Àç—;¿#†ˆ ‚!¬4úò_ɲÀÓpEg2kƒ-·àHHp¤!ÈÉÃYþÈð³p€ Â+žþ2SþAâ ˜ÀÄ œýý†~*y]lfSò‘å=mèÌgÆS89üãf4ӛܭè=8á(€2äœpEÇ£‚¶Ó"g1mPNžrƒ+p¢yÃ+âð"H#¤V:B#ªèÁ¢#ý‰"xÜó¤À¡°RdTÂ)I‡BÉ  vÄCuèC! SÆE¶4»‰ÀŽp¨ñ/jc-ˆA Fñ‡]ôb”ĤQ8i-/0$Ahd#µ¹À(¨É0"GOEψÐ>"À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%IFá9f6³V H&I΂!TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9O¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?¡ðƒ¨.*Rƒº*V5uK ǸÉ9.5ðAO%W9‰Fkd5YQµ‹ÐAšPªÕ&щ'xb Q… ºÐŠStbX}šfq}…\_e8c [p†2˜¼_T8 ƸPŒ-ï` ºØÁ-ð`_8ƒÉ}þs ™¼+¸1˜/íg@ Z¨!´P ;÷8t?Þï¤ã¸¡Î;€…]_[ã—±ØÁ‡C| fØw…`r¯q­kQÛ—£`r²oë §¢¾A(C«-,áåØB J¨oB¼lïzâÆ¯@ )þþW0¢¡ãs»Ü`.„3êÀœhƒÝäÎv³÷{çWç¿Ê¦6˜÷«lûÒbÉÈÅ›w`†_ìÀ® 7™½p8 €08˜5Þï»Úr°æ/¦KmîBWÑöÅ€q_‡Çb÷ݯÊ5 æQÌb•@Æ~mqk0ëÜÔ .ù¶;##yÜyvò(ê0˜k¿±°éÍô1?½¾®8@#|aŒýbaßLæºÓI®íï8ÂÇкÛå>w‚Ÿ<Çs¯/-€±ˆFãÝï ®»â~üwü È&|âÿøÃ ^ñ‡¼O8ÇGÞò–Ÿ|à_λ×¼ˆ1zÒ—­Þô§G}êU¿zÖ·Þõ£wÃ-¶}yÚC>ó~«|íu÷Ûï-÷»¾ŒM.ø»ßø’~ã‹|æß·÷zû}ó¥oßçßmóÇ>A?ߺпÞûßø]ûÙOßüÔO>å—þàWßnÑgÿñÝ?7øÇ¿ýé\ýí¿ûùËMÿû¯½þ{›öʾôüó›ìJ¯dÀtÀ „õº® ¤À ´À ÄÀ ÔÀ äÀt—€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_26.gif000066400000000000000000000763621343257752000273550ustar00rootroot00000000000000GIF89aMë猂„LB<äÂÄŒF<Ä‚„\$"$lfdÄ¢¤lRL¬†|ĺ´Œjd<2,´bd4\NLd"ôâä´–”Œvt Ô¦”„zt\F<ìÒÔ„|b\ܲ´D:4Ä–Œ4&$´Ž||jllZ\œzlÔ®¬Üº¼ ¤–”ôÆÄœ‚„TJL”"$¼–„Ô¦¤Ôž”TB<ŒrdD2,¼rtdVTŒÄžŒ¼’„|^Td,*,̪¬$dNDüöôܦ”dJD„f\L:44.,¬ŽŒ„j\tZT¤~tì¾¼¤ŠŒ¼žœäÊÌ,"Ì¢”´Š|”vl\JLìÞÜ|f\䲤œ~|亼 üÎ̤‚tœ24¼–”TF<ÌžŒ,dRT„jlt^T ¤BDÄŠŒt lVL¬ŠŒŒnd<64´jlT64Ôªœ\JDüÒÔ„ 4*$´’„œ~t  üÊÌ”rlD6,¼~|Œ$dRLüþüL>4,&$¬VT¬žœ”*,T><Ü®œ´’””†„Ì¢¤”z|ä¶´¤‚„ìÂÄdŒrtÄžœl<.,ľ¼ôÊÌÔª¬üúüܪœ¼šœ¬Š|´fdôæäìÖÔܶ´ÄšŒÜ¾¼¼vtäÎÌä¾¼œ64„nlÄŽŒ„ Œ̦¤¤†„LBD<24Ô¦œ„z|\FD|bdD:<´Ž„œzt ¼–ŒTBD$dNL„jdtZ\,"$”vt|fdTFDÌž”t^\lVTŒnl4*,D64L><ÿÿþ!ùÇ,MëþûH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞÌ2 C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·o×: U€”!È“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàÃþ‹O¾¼yêR_Ï©€!VâËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€@÷ˆ } .èàƒF(á„Ú7„zíe¨¡OïUèᇠ†(¢6¡‰¢8âŠ,¶èâ‚n(ãŒ6uøâ8æ¨cŠª€„̧"~Cîhä‘Hˆ!L6¹’IF)å” Y Æ!¤VRéå—FÆèä˜dŽ%˜h¦)âN\Jñ)€¡\²Çjôp -Ä™CY¼¤ rD(uÀà†o¨!ŸoJ§xêÉgœõp.}bjE%>X`•ÄGÈYXC¡‡&º¨šþ°ÆJ¡˜eÖjkFgʪ뮲E%xá)xtâÆ´cìÄÄ É_@r„§@ÒɃäb!rDaErIì²É.Û,¡™Z±Àƒ*ˆ$7Ü ññ¬¼ V{m¶¼öëo´Þ*ðÀåúïÁ‡"Ä [ L|nð°n'ñáPƒ§{Ôß¡|Š¡<çÄ£l1º ÆÇ½,‡‚±ÇWÃÌ8(رÈ÷ÜsÀ-tAûl4¬²“EH Ûð°¥~z‰§d`µÕò¡ò™èµ§ ÂË,_u%S[av|•(XõÕ]-7•@m7ÁEÏ­7þ•„ÐaÓ]7 γŒK'õÍ! R|6Ë€?í((sÆ…ßœ±‚‡ïí¹šuß-z­yn:Ž~àÐ7+‘CÎòÐ:s¾´@~P Ù³8Qê×C.ç|UÀà.¼òÂŒ†ÐBB»í¸Ÿ.ý‘¡n}“¥O¯}ˆwàr‰[´<ÖñFÔ… ±Ç%`` ºÈÇ ®¼‰„8 `%AˆÄÙo¨CVe*õ±Ï}ÛK`‹ªw½n({ Œà‘â&Á Z> t ×Á zpEü ·—Á š3¡ {´ÂJ°„'ŒáeRèÂÚð†7„¡ w(™5ôÀþ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.z‘‰=XǨ™PÀíŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ ñ 2Ò24Ä¡"ÉÈêð,L"IÉJZaŒ¤&3ÉKzò“ ¤Û’6IÊÃt2”¨L¥*W”ÉRºò.g:£|p ZÐB3#”Õ²€Y¡CÈÂ%þà-]ÂH@’\-o™Ë«Ñ 0Yœd™ ]öršÇŒ0…ILlòÒ—hœÏªr€Íc6ˆ–¶Äe×’¼UºÓ“­|¥<åËú| þ08DZì hjat¢P€ëò€,5ìžùÜg?=åYø€ˆ[(‘>ÐÇɇ E¨BPjÔT Å § ˆê“Ÿþl¨–ÚùΚ62žóÌi[êIŸAL+kƒ[+,fŒŸ¶Œ?šâTð|:4u¡NõèFã3T©Z¡¨öiPUOj:8Á  ÃÓXÆT ÆiSâªM×ÚBœêô­háé|,Ñøtâo,»þ`ºfµ?ZW»âãWùÜÕ£‡UëQõÊדv±{µªdà(5È`¬ z¬XvI–­ ¡[áJÚ±Ä2›ˆÛät5ŒJµB¢þæ_­ð2¨Í§m%k³™ÕÖf4œ¯í­Õ\kÌ«Ù5 ¥ªDê:>Øâ–eµUlh§ûÂQ–öºn‘«|–;În«rpŸfiÊPSeÜ5,^QÔ ÖI7p„/‡4^LÅ7¼VåÃù@S¥×®ë5/ÙBHÝKo´ØM°V´¬šrwm…1Æ0Ûýœ“r rp|¢ Uú½l>é„+b)·®@.KlT+pøÂ•3°Œ-ˆ`Û¸* (>_špÎgFé Dú٣Ƨx ªÅŽ%êcŠY”¸6O*d"»nÊ*RC1èCÙë8¢ülò‘7ã2+°Æ7N3þTrL3œà˜MÙôKÐb˜Ån…·¥¿YºÎrÆæ3£Ù5Ù¦K>tÖs ìŒçÇ%Z–hÚ|fÑXàµùÍq¦iþlæNcÒºjuWNééR›šÆ µª±BêS»úÕ§Cóªg=”V/(#Â5¬w kYÓú×R(¯‡MìéùØÈΉ­‹ÍìfƒéØÉŽ6M–íìj[;L©–¶¶k-ìk{ûÛÏÎö¶Çí3òÜèN·º×Íîv»ûÝðŽ·¼Ó]HrÛ;(>ü¢¾÷Íï~ûû߸ÀNð‚ï;Œ÷Nx°ÁÍð†G Ú øGجNh x‚0Ñ‹[ã¿ þ(ìð’§ âO¹F(^^$¹¡Ç~4óµ@Å&Ϲ(UÎs™°|ªGŠÁ–cnZÀ¶?F'ädp;ýáâî¹ÔKòó%i1Ðð´N ­[A ÆxºØ±=õ²«„§ ©ØªQ¡/>²ׯ÷§@­4S“ÁÌØä&8ªî‚ŠO(êÊ÷7™ªUŠÂo3xq]­QŠTÅÁV‹Âýò/B¹Ù7Ÿž¾+^óÚ0òB.:da¾‚{V´ZÌ e¹árˆ¯€%,B©^Zñ!ë¬0û`ÅG_ØÒÖë*~ûŸª[ß WqyëõŠaþù Œ:ç§ž^Žf…»~Íþ%V@¡¿Ã‘T&ø… ‰pñ¹ÄîÆ0ùìÌ k]VÑ9‘Lšr>ô÷"ÍSÿÿ<µ6R“~g“6 0ãe©Å6i³g ’4K#i 8€V þdÈ4¹GM^— ø8ZÃ5R !Ã&X!þ÷Óg}ô§}…7Ðä”~¯ rB8}³^ô7Ž¢ƒ~sTq38â9ŠÃ81¥k÷¡¹s‚P!)¨‚›çy£§çs† Ò=ß>—æ5/çKž>´>í9 { ¢‰o÷>ñó{öJö‡„˜‹þ1…‡(uÔÆ%R$cpY  8V2rº¸Œ‹½Ès¿XÁè"!ÇŒÖè!ÎøŒ)H•)zÖ-R×8ŽR(}ÚxŽÁ与k•è˜pêÈŽò¸JîøŽöó˜ Tö8nø¨YIüØÚöyŠ4m) Gt ‡i$ʈú¨ ‰l ¥Ht5g©#7‡‹y™‘¿â(oHtI‡/Ùþ"„ ´P °RLW’óx’(9k*‰ XÇuÒµ’bNÐ à~÷ua§“ìÈ“=©j§Txp‚Z œ6xˆÖ&†·-ˆ÷*²x±…5µL´àÒ4'u¢w¦‚¡@ \#‚¸Y¬pú’†®8P–ç”ã•Qj§Ô{µç5Å01ý¡{òA˜¿g-Á'‡fàS ð'®{õâ˜>`H°ƒâ¦FòA Òô´ úç—i޹‚ÝÖì‡YuÕê'³é~¾Ã×rôqRp2³2=KññMW R°{D2(º¥š+Ú&隯Y…±É(Bþrwüaò‘ˆZE9! u`\õC€ôA¸@µ¦ù1©$(­YçØj;èeÿáƒô±ŸV0„‚3y6£@p‡ñQœÿ | RåÄ[xzù(OhŸÌ˜ø©`§‡î•ir-iÚ˜u(>‘i$,C  V0œ)Q?¸F‰”J)ˆ¡Ö¨¡Š]§tŠ È´ÐýÑ‘V ¤©x@¬¸—íD¸p€Bࢄ€RP"ø-=ÀøA|`K7IŸ8Ç£ºè£?ZZ ø Æø!Å0—R‘dZ¦Ôy¦Ðx.Dº\:§Ni¦vúVPGþ÷Fjr€!à§< ¨šSiª¨úiª‚©–Ê+Œ:©¯T©—Ú©°’©šZJœê©¤ú% ª›4ª¥ºªP‡ªœ×ICR„¾ù4ù×qºH”frºZ!rúcuêªä«{V¬É2H ŒV’efXÙ50S¢«!„žèYm½J!#Y§*¬‡D¬‘¹M¦X±#ª¬19%?rwÙJtã) Y°+E UR"àˆŒ ´®új$+ɯäU 9‰AÁê­‰§³< uP UdåjAItí:­ïù®,°·VÏù!Ôš¯»=2Õ¯;ò¯»«üvÜZ°ËÝVþ–Yp–Òt*©B@Û‚*ª’a¬'y73['³7+x„Ç•~g(ˆ’xè"–B²³ôi–h©³ur'y²'B´®‚ThK³^K¹ b¹,ƒ¹èó¹¥ûQ}ݺ²ÂPÑ+™[@™ÔK(Ö‹,®Ç,¹/Âǘ¶·¿ÒûÀ¶»™×Ò™æ‹Áñ‹5ÞëYœ…íK¾®¸½ Ì¢z0S¼ì lÂèò½),Ããûz-|¾ÂG1Ñ)±+»2”7Ài38£ šC3r‚‹3œ€ÓÄ9Cƒ¸i~ºÉ3Ï› ä÷›Áé0ÅBïÇ›]–Cb¬e\¿ú‘ÄéÙ5u•›€YW1€Ãów„óÇÈ9PþË38(pLÅÕ™YÕÅ}üÅk¼Æ+ÓÆå×~á‡}õÇ :la.£‡¨Æ]œÉ\,Å|„†LÆ»éÆS…Æ‚çÉ¢ Ê«IÄ*kÄ)Ùmåyž&,€Ï…Ë™¼ è)º,xžÇËã <µl­˜žò;Ub3`êIÀó6ËLÇlÂì +%ÌûAêc{ ù\XÍ Âžî9S ‚ËiCÎÏü\}û±^ÆÎqL5Ô$̈6ñ!Ï(Ò¬ÇÌ|^éüqÜÏ]<êÜÎnchÿìÌj#ÐÑ,[õI°²¬rgRŠ L¼ÄJ¼9 FrFÖ›ÍÑ[£¦„ÊËFŠþÈL|Ñ ÊŸ†ƒÒLci|„À# úaÑÚÒó¬QÚ½ª«¦Ë ô‡Óm* ¡‚LÊ,ÒN\ ²ÀœX 9í¢žbÓ@ȃJ=Õ jœ'íz&Ó«LÓ cÕQ=Ê”l¥ÜÕ Ó³„aa}Ö5ÍË_w¡°<ÑÛØm*Ê¢îB†¼<Í“d5d Ç[ç×Ñ¢ #Z¢æ{¢[ Õž’×Т.ý<·C×gˆd1,¾qL‡•°-ÙV¢Û¢ó¡ØÒˆÈ;e3ŸÝ 3Z£ÇÃÃ}µ¢‘½×í±`ãØ,ÓÚ“m¢M¢ª#‡k;¬MÛ  £!ìÛÑ£ÉòÙ.¦ÂÀÃÙËþÚ 3ÀÊÃ×”=ݳêÜÖíeÒ}¡;*Ñvqg¥Rº?4@è-@|»hwÖM„}¹éM³Hª¤Ûb@«ø¼­¨ÒñaÞ CÕ,Ãͪˆ@ï¼iŽè?±è)Τêâ¤ý¥ÿý{E*áh߀ÅjÛàŒ'Š›ØU>¥2º¥XûˆQãß þ)ó}ÈGµß­ &àé3àñaßäÃá%þá…b¥Xº¤ù]à}ö)$îe žß,žÌ@Žàl“âê"òé 4¢Nꪎ‚±|ê ®=!µª¬ÉÜ"ç«}¦îêëgŽ ÉzÚÌz†²­¹Î»Îë¶âë÷c5ƒ†}žçzÚéúΨ-rpz옗ìÊ^&Ì8uQr ÏD|Ƕj±äB(«íºÞêÝWg¶M[³3[({k¤&ï&“Mú´[Ùwœk´a9Íò1ºI–·dÛïôùºì.vÜþîNB»Á4¬ XxUÀ&RÀÈË{Ê[{6œÒôqñ þÁë;<Æ ¿íîñŽŠ°…¬Ñh-ó(’áñÇEÇ·ɘ|ÊÇ:i½È’Ç*¿òc÷ð.O#g¢ÏgЫ…Xî%Ï&"ÏÞ wJ£Ã,žÒõËV õó!Ï…ÊF_è-Ÿô›ÚmD­ÓiÖ(‚–ö÷°ËçJÖ"ô2/÷®£÷s=öG_öf/ªxmܶ}؆ÝõdÅÛ¡VŒŸØÁ=‡µóÛ~ø·=Ûz¢MX„¯£Ùî÷&‡ô¯!åãIÎÞë­Þ‚Mø÷âþàç 10—¤ÞƒŠ÷-ãúíà(Žú°áÌ;áû:F’ Ïp¢?úí‘êÿ±åçþ‚ëÅïpÇüdçÑý¥øÔIÊý×?ýÛ/ÝïýÅþáBÖOþê_Žçcã¿þFoþíŸïÿ /ÿó?Céoÿü/ øŸÿÑGà@‚ D˜PáB† >„ØPÀ+-^´ãFŽ=~ü8È­`ê¡QÆ’-]¾„SæLš5mÞÄ™SçNž=}þŒ9D@D¢EEšTéR¦M>…UêTªU­.Ò$Pšn²ÔŠiR‰Š-²TâšVíZ¶mݾ…W.O¡WíÞÅ›Wï^¾}ýþÜ7ëÇ­4¦åDÁ­$c“i’ÚŠ2îÌÅœYófÎ=þvY7ðhÒ¥MŸFZõꢃ=žiÒ,¬:&9$F䊅Õ\øpâÅÍZùræÍ?‡nÚµBhBÑâл"¡#¡êÀpS±Ö,´<0ÎÈAŠFØh‰'ožñáÃðËŸ¯êvÅ-N.…j`»î¾ /£Œè¯†ãd°A„£ä¢£°B /Ä0Cæ¦;’N.ðA;+8ðð‚Ar©È‰-*¹à z+-êÄ‚WlñE-R‘E+"£@+X‰¢’N¼¨ˆÄO±07Ȉ0J)§¤²Êž&Ô0K-·ä²K/š®02i°¬x"”.¢·ýv´ˆج`þsFŒê´â!C↋̬(Í&/zÒJCE4Q*±ü²QG…4ÒÀ¦»„2‹L"ƒ¾ú¬’:̈K1ê„•Š:ýtÓÂP5”,’¥˜,z@HMMÂõ¢ZÔT´W_3F%%¶XcELŠ,“ÌŠpyÓ¢Ô¸€ rõ"4`¨hÚj¯µÓ[kMB Œ¡ÃF+ -ÉN5ü6^y祷¦a“Å7_}÷Ípº1J qG[ x­°€#‡ÀVÄÙjÛ/á…MÊ¢‹$î„ኳÈÐ5uDH6xP‹ð¸¬^•Wf™Þ{ù…9f™gþkºê¤¨#» bKÀþ Ë :p€Ï† ±Å,ºh!L–š6º"¯Î¼—KTܮ矃n¸–³Z&»l³«|™fµ×f»í£¦kp pZél»ïÆ›¸´Ýæ»o¿Û†;oÁ'¼ðöþ;qÅ76pÇxáÝʽwãG¾ ß‡g¾yçm*>y駇}ö9/ºž&‘ª¥ìጩîçÇ'_®è©G?}Ë­Ç-§«¹·b¬öe2ËÒòïÇÿ§óÕç¿À7o×k.’ä{ìÇþà7™ùÉÄ2ùƒ`s²?ÿUЂûbŸ·Ã§PˆÊNßÓ oÀÇ‘ï‘ä7Da aBÁ ¶Ð…’²Ù²` È;à™œ`…?С7ÒToÔ£ýX¤?ÿ u„C±#&‘…8À†G)³B©.`…Z(H…_ãFXøB2–qK‚Än ¨•ˆIp’¹Ô0·b/F@‘Œ„$‘- E;*¡è²(ÉD(BÂ<è–X¡Pa„$ÇhFJV2:Ó©Á˜¬€ƒ2IP;êÄØ*‘…ýÆ”oÒ“Eøä'‹ M¼: …À (TÄ•ŸüÃej!…=2’¿”à$-þ9Lbª†R”©¦n%">ÜŠu¼”­à*XÉŠV¶rb,K 4X$SN$.a !XdWÀD'…YLv¶³fÌdE8ù¬hig”o %ZL‰ÀŠ”ë\é¢g €ôÀ€ëª'uÀÀ‡Zä]é„hùÖéNŠVô*ÓAƒ¾ð6&id;˜FÔ™‹ÄÑ ³Jí¤@+x d%YH¡y@`à‚%©E¢s ‹êð&jQ¢µ)Ó©Äê…RÇk@ÓÎju‘YüaDRKVÁ÷>+dmk[èšÏ  H‹,@ÆŽÀ3±Í Qè4Åf¿ ÖÕvC5j^õþ‘å±En8XiRŒŸŠÏ®‡­^÷ºXƤ¯Á"„.À MÄVö®Cilf5˔ǫh!°lh/»YÒ––(mjU»ÅšÖµíDíje;[´öµ·µdli»[Þ®³¸®kuÛ[âWŒ¿ nr5›Á'6FƒÎªÈö`bïù$2¬qµk[åv·Ì%¡s¡{=Ù|~ò³.ƒŒ°žKY œ©ŸvåË]ïÖ—zà  Z@žKü! vÊ/YúÉÐU'×uÉ>{’…H“ ÈF(_ãÒ×¾>~¡[ p •€Â²JHÞ~î~ŽÍù¹“9É #'¤pq-Œaþë.†3l* $"c„FÅ%@ IlB†44IùãÙpÇMÕƒ<äŠT°€(cd›DÇLìÈxî3 ‚ C´Â›ì—„²]Œ±Œ‘[c:Wjìh)" $4#Å脎pV²Z¡CxÆT‹t$úÑd¯´  HÜ`Ý4tרFG{¤G9šéŸe4¤EóñVQ¦Nx…‘PDAš¾Œóng\gZg“šœ§n ËÞ8#£~$¶â¹I“¤2?}ú“'y=Â’JÓĵ‡ë]»O v“*‘M`˜#1Ø”#ŸkYϹÖç¶à1«¬ÌlþV¤ÏáͶ*µîü¼ª"±šÕT¿if¸ØÈ¼DEæm…dbÕa•ªV iâûš-a+Gö ¹®šÜ³5º5î·[ËÓ$ì‚®1 ]“™dÚäêiœŠPŠwG¡ˆv·pýq?sD\à¶U®®S‡Ûjä’zqÚf|ãGgF5ÊÑ6ÆTDæÀ @,bb+£Í3K]J‡á´d…î·‚)miH`úêL‡iNû1ÔbQ)ø¶²ÃÛ§D/º¹‘¾÷ 0©KÍñSÁ_Т¿ÿ͹ÉþÎÔòbMk\sj[mVW9X2•Êø°~­"”ÇÕž–U¨iþµ0^…|‚)KÂÌï×;ßeoczæ¯7 l[rÏ™P ÁÁH°xv_ŸZ£ÏÞøÉnPcŠ­€)~¹?ýØ%?úׇdñ©¿ýGYûßO¡ö¹?þ.yüçÏŸøÉ¿~ ™ýïŸúÙ?ÿ ¹þ÷jìé¿ÿ˜Ùÿÿ-þ@šñ? .ëž”°áÀô ùÀ4Úó ®BÀø šørÀ ì ”À$ ë›:¨Ps ’š®Š` Êø)tAóÑ?”AGÁsá iÒ¹Üð¶ ô àxÁŒ œÁ!Ô ¤:²[¢ðp"¡Ù¡ú¡úÈ&4S³$R²4cþ²$ú²aP3 ô¶B"Ë 4`à´=!“š£lù ;"µ=Â#‹Ð#FÓ³7:XûÂ>ÔŸÃ@´é…·£6e³“|"8R 5x“Uºc›¦m³%D;qóÃLüCAäD-Q7‚c7~³ˆfÒ”gJ¼hª¦|«·T|¸}S8ð9'M”ÅÚÄN´Åå DC¤¹üº'k±•ó§‹@u¹ª»ˆ¡›Åe´—Z¼Ågœ@m9Ã4l:µS©‘’0s‰»¸+Œ¹ÛôF‘qºKDf4Ç™ChTGˆ@ªWXª#ð2Á#=š*‹¨ª«*½£A=Áâª}ì¼±þ ›±9Ç g\ǃ|§ŽÀ‹“‹Û³ $Ȉ<.„¤Èh¼†N€„€‘ÈŽü•t¬È¸Q,È€ óÈ”<É,@•„Iã`É–¤È—ŒÉ›Dƒ¤É„ ›Äɟ䌙äIuôI 4ʹÊ¡|Æ¢<ʦ$Tʨ| œ‹¬»“PÀæš ˆtJìKJ©äD¦” ¼JôÒJúÈ®<¿¯Ë@¬AŒ Á…óˆ»Ê¶lK1|Ë8¹A8d6‹¡s¹˜€1½ü>¾ìË!4Â.s2ZBâ!Bš-T4«Â)ŒL-¼L Š¢)JÂøÁ"-â"/RLþ¯„ÊÆdM„À¨iTÃFcCØpC::Eµ ±ÃR“M=ì7g¤Br#DR¤Š`$«·ÔŒ>ÆlÍÌE«Ä@Y¶ŠPÄ^¼ÍŒ@¥=¡D]³Dm"“Yª%î”ΊÈ%.â%äTNÕlÎõ<-¸‚³W<R¤SFi¢¦{³&}[¦K$!nò¦þ §qz/.bÈô$:ædO|Nb (’³Î,úE¹$L裎•;ÆxÓŠ‚:¨ ÝŽ…j¨ŠPFÅ;]Ðý{M4ŒMq´Æ·ÃÆ’ÒÆ·s;ÁԺẴûº£™¨©›ú¨¯{+žºˆr$Ñ×3Ñ¿v|Çx”<|¤GŒ¸Ç¨ÉþG;éÇÇ,¶ò<°=J«µ’ÇŠ€+¹JË"½¸#EÒõ;…| ‡¬‰Ý› Â*©‘#Ó2]Í3íK¸ÁHäÈx‰¬ÉšÓŬS;K’”“DIÏ ÐúSõÔFí±\ÔH•@uÔ¡„TIÅT3­Ôã»TLTMÝÔÙëTOýSP U¾»Ô³»š°Ê– .äJRå-S=U¤KUx#1› KW­ôÒ@Y­0J­U—¤J^½ˆýÊ‚ÃûMÁdV™ KcµË V9ÖýK.ê° ±eýMóˆÂLAðIÌií-Z­Vt{L$ëÌÏ´‚“2!#2á2uMöÊÂÞ2xÍ7þáL%ª"íp¢.$×rÖs=È¥ÆÞü£Âx·’ˆ´A3™CÛ4ÜTX 4ˆOE£Ã<\X*MÎÍ;ƒmÎ=ÄñÌ9_g3™“˶è|¥ÞPÙ<ÑNVrÙOÚÃYÙ2W‘­³O„Où´“†%¹Bû7z •m·lÉO+p8þLÚÖ;МU­åÙ#Ù]Z‘[Ul1¹™³=ÅaܹEF‡:©…½ªmL„]Q¯;˜¸ƒ:©ÛÖS´º¥Ë³Âp[hªÑ—bѵ"E[-XµµE%ÍxüÇ ‘RÂ3<ÿ‚&lY¼¦* ,HªÒ¯JÜGs½À\ÂmË4ÚaSšˆUþÎE,ªõÜúÂÓŒÜHÓYÔMÝî"TCuÝ…ÝØM®Q­]£¼]Ü.ÝÝÝŸì]ß½-à Þ›^â®b=ÞiM^å--ãm^•|^èÝ,é‰V%‰WU 9Þù\ëAì}‰]ÝÞ^ÍÀ1ýÞ`_‘¼VúPôx®¹DÁ ŒÖ¼\_‚m_b5 Ë¥ Ûh ŽWLFÌ_öÝßšô»#ô²ÑLZ‹pûv³ ž&~½Âu…²MØ&®êMà½bÛ5ôMf­‘ñ)ŒOû‘ŒÝÍ5¤vœõà რB„Nñ|Ùëd½5i“Á¤“ –DHl¥îôئÖ^GŸ þÅW°R9OÅ)N•$³7¦ÝOƒ{E¨Uâ_&¦¿«%[Áln±‚›;5î' -Æ2~4¡;Û/¶a1^Ê2„Íjü:n´šÿ…ÉŠ‘Q¶3‰½½Ñ¾•)ð\:N[;¾ã‹¨w<\&ÍÒÅEšøe¢©'M=G2¯®²ÒÌ»ÍeäFväÂ-V5ÍŒÑÝJï=å© ãT¿ÕÕÓXVN¦ewšÝ“ÄåÔÔå]f'òýå/ fa&&b.f u†háŠM¼ø2 Va<´1 …Hb iݬˆ;ä£îØ­¢a—?˜Žés#c¶YâL›“k¶”EO©æ•"ÞÎj»D>djzè§F'æbÝ^X€I8µÎ ¦,nÚ´ŽãXët6ëŒj°Å6؃V09j—F„cÊqc M¨£Ѽnê½À™Fd¸Ë苨0 B6ìɶCîºMäþÂXdÇF¡²†ìä1\ļJ6=b\QуkyýÒË…<Ê<81eÒ.m§>m]ápe‚eÝV'Þîí ³åÖ%n‰4íãî^>ÔåfÆævîÝgé6Rã®nÙmgìHêÞîêénï6Gðo×¹nò&7ó>oÒIïà çö1çáVo–aïö÷þŒwnŸxöµúV™ûÆoÌÁg}–’~v.€pÐÑî-ƒ.P!^^è^pwðéKW$üW‹ÆèlÙhôi‘’M+D¢ÞÈ,È‚7ð ßëÀ ÞL”.é•N 'ÏðÅ‘l¤®#›ÆiµŒài7ðþi jŽ-jÞ̈4â(³®ˆù€r~rÎ8kŸÿñĉj°V°ªî7¬þ¹˜k#“ n–d3Y¯¦Y®ó¥ó`!ó2ç8÷D¦'†kB`k·¦b(>E¹®ëŒ8+•CÚV¡ë-ŽÏþ<¼îs—ip@_®ÖÅÃþëÀìo‰íÛíX9s6¶‚:·°[U7ÆÅv—9ÞtyùsOw› mÊÌËÎl@n;`Äу GX:À4Ͷ‚ÉòcÿÆŽ±ÑÏÇ£í\÷óNçuÆJmJ+KžÜ×öäS÷ ñÇŒhñ:xÊ€íDZm«þ åtŸ÷R–gmÿHnïv^åÐ}~‰àúÖ÷^Ùõ~W›äÞSâøƒož„Wø™îyxˆÏ¿‰—éñÆx”x‡ýîxÑúxÇ Žùÿ+y“Ï‘OùÊZy–G>”yø‹y™?—¯y»ºyœ/ßù êyŸ‡!šzðz¢‡ ?zˆJz¥§A£oú½äw¨&¦Ÿz`zz«÷¬Ïzz®z®¯f©ÿú {±ßf²/{:E{îFÛækVrÝú¶Ï¯B¸çVY{º×œµoÀ½çû ±{¿ìÀÇ­Á'ü`:{Ã/hµO| |Æ¿$ÇüíZ|Éçį|ü‰|þÌwÍß|‰º|Ï?kÊ}ý%}Ò}—ˆo ª®Ÿ8çÓÏŒÎO}åX}’ào 2KŸøUÙÿ Ú¯ýÕ¸U—»ø‹@ðö±Ë Ì{iõýýàGžáo â'L…6Ö‹ÏÁ3àæïÀç‡~㮤šè{ ØøÀ ŠBör‰_ñ”öÌ%ÜG3C³Óäþß÷þïçá2C%á¤+Vœl©táM*dh@1`'R´BÆ CVQ*uò"¤Nåjø°¢C‚šlù0"C7dPÒ¬ió&Μ:wòìéó'РB‡-jô¨Ñ!ú0mêô)Ô¨R§R­jõ*Ö¬Z·ríþêõ+ذbÇ’-kö,Ú´jË Ò3T 8ZÙSKà“P.^â’®ÂN9å•[~ùY\°Á˜{þ9è¡‹>zÊ›l0ÀlB:ë­»þ:ì±—˜ L’‡ì¹ë¾;ï½ûN Ÿ0õIí¿<òÉ+_x€Âþ(4±<õÕ[=öâÎ ˆS‚Ì=øá‹?>ùïéQ€SèQ>ûí»ÿ>üY™°NîIüùë¿?ÿÔ?0 TFñ€þ°€<àç(ñ8¨4Ž| #(A«u p¼à:0Á r°ƒ—&!Ân"œ„>¨Â²°…lšDà&áÂÒ°†6” 7 Ãò°‡>üáWr¸C ±ˆFü¡¨Ä%2ñƒIl"£(Åý=qŠV¼"¯WÅ,r±‹^”Ý¿(Æ1’±ra,#Ó¨F½qn|#ÖÆ8Ò±ŽvtÖï¨Ç=òqMyì# )Èöüq†<$"×RÈD2þ²‘Ä€")ÉIR²’–¼$&3©ÉMn² xD8)ÊQ’²”¢d€#S©Ê @ Cx%,c)ËYÒ²–¶¼%.s©Ë]ò²—¾üå-€‚U³˜óXÉ(B/3 Ó˜Î|¦¸™Ì¡ª™Ð¼&6g%ÍõÆ0x‚N–ùq’ÉšÙ<':Ù´MÑå C0F8BÎ1™3ö¼'‰ÖÙ!À¸ÍtpCPƒšŠh-8 Ð‚ôHÌ&>3ªQ÷è“CüôçK$b4@â7€\BR“¢T Gɰ5Ò’ž4¥VºèFsªS×ttCt†tD†„þr©KŠzTôÀ¨Qj~zÓ2Õs§V½*ZzŠžÞdaà|ÈqbÜ\Â%cµB%Êj…³2ä¬iµ(U1ŠÕ¹Ò5,Z=Ï2«UHU¯Nå+SJÔ¿öUUU­+b[•»š'¯YiM·Ô#È¶Ô c€©L)kÓy†è°Šý,hûÀØò8–!•BAƒ`*$ ­¨µ€j+…)ÔA¢®M­©8 "φ¶·tí4qêÛá"¸Á-§\‰«\«÷¸Mîr£«Ñæ:—›Ð•.vÓ¹†ø »Þý.xÃ+Þñ’·¼æ=/zÓ«Þõ²·½å€!²+_{†Ânö½/~ó;/Ì·¿þÙ¤nu÷y]ÿX•°O\à'òÀÆ«‚,aA:øÁ¤ð„3¼Ç [x<¼Õ0ˆíÈá‡çÃ!>ñ·ëÞ³¸Å.~1Œcìø¢¸Æv¬¯~s¬ã«¿6þñGLbјÈF梇 š"¹ÉSLrEÆ€žÐ=Xˆ°”ü ;¹ËP„òDõ¨xZA€²B J¥d&{¹ÍF-`äU‘$õ„.´0•d ¦!³ÙÍ~ö!œ•Y“!Ä Î.Q<ùÌå?3š‡sªÄ²`è顨 0’Ð ”¢¦ E¶à„K„¢•²4¦ ³M×Bª$îs£cÝÂ9ÁHF4þ‚’HHr$ºh6:ðÒG¶C’­èf“û†sr«nÖe%º¸U­ÉYNsžu/Ê ÞQv¹ó=ÃgãG?Và 'B—½J5A jЃ^¥ á[ßW!­c4£E G:â’Izm: „IN‚’”„ê’05üá&ßà£í„'=ñÉOgfm•èrZÜ D̉Ԥ€eK¹¿ûñ.ⶦx±/¤˜Ì”¥›ÅC'Ü0Z#þc †¯3²‘Žàz$Æ®·¸IŒø‘ê ¿E›@x[cÄ\B Õµ-ÕCˆ”€^ab(Æ£|^†º^† ßœ›©þ䯼mZÌ \X­U ªU FÈ» s8tX½Š®xŠ ^Íæ]œÀQSRaÛvˆÁ9ƒ8È¿AˆÏ ÃMÌö jŒùMÈYœdE¶_da„œžÇÑÁ“ [ÅM ¸1ÉIáV¡²’[˜–ÊåI¥´¦ [k}I•ÌlåÒÅåá¥ìœžÙ¢]"Ž`RÒ™‡Ò Ó±á"VbÞD]µ\‹à%˜%vbÕl]»¼Ë&nUz¢)ŽKå"••â)¶¢³¤¢*†+º"-L#Æ"ØÕ¢.Ó-â¢GÍâ.£›À"ˆ(êYAãåÙãå¢06cþ4õ¢<¡Ê呙桙š1£3fc³ÈžœÝfœ™©ž@°6j£9j4æ½èÖàmFí-Þí%š€#=ÊJïI¥Zðiñ0ŸóAŸôQŸ>¦š@`_© _vÔÂd-xÀWýcó=_ôM~@dA¼AXYßAŽZBnß>6Ä÷YW=ždœ\á­™aú­ÛüÉýÙþ±¤ÿ °ñŸv¨ÄA$ÄCÄäüÕŸüÕ$@Â|$Aþáäþ ±ÝdÖœþ"JV¥œÜ"´anà•H JåV2†ad`ò…_D`Í…¥ˆá–%·%µu¥vþ UZ¥^ª âFº¡ WF%JñÍ ¼iÇuß RI †rÈ`¼Õ afG½Ý[9î%fÒÇú›¡?þaÂUĺ… H½½à[B`2Äh6¡Â9DÎcfÎf´Üb­a¡†Ü‚&š„h¡ŒarÉÉi¾¤¥Ø”6 f!ÖÛÊ&mV'GÝbÜ ⥼\k}f²\wÞœ¤ "Ì „§ŠúQGFÖÁ˜J –§ÎñÜâ5R§uægl]f‹8EbPL"~ê'²&N·°c·La6¨V€b×%hø£ƒVèU£/ÖƒZ(‡F†f(Jþlh‡Žèl¤#ˆ’‡ˆ’h‡~è‰ …ª(‰²h‹Ç‹Â芚(É#™%£€ŠGŠÚ¨ƒ&™‚’É4ª£@T#ç].éVp£ºhÆö@Â%°‚|8©ˆcží™‡Õ(“6¨ì%fD)O8¸Á¼Â”YÁ;ãÂÉ£‚i˜è=þ^A _é¡DdE¤H¤ ¤©±ZC>dD$EäEfäF® C´Â F¨¤ö÷©šBÒE«)i~jËØ¦Ä­äSêšKFLÚßLeÿ™jN [•ð$Kü¤ª åý)„Q"¥RN @ÂRZÁ«¶êÿ¹^–‚jun¦þ´q¥µ¡*XV ]~Û¶y&CD†Z¶%[º¥.G(ªžì— Á PêõYjžjjI–îðV(Ê +x2D'0áEè_°a/¹N¥…Inõ¶¢²F«]>ìα›¶™%ú>l¹"ù–¯)ª« Ú `¢êDtBÆ ÀF¦ÀÞ+Áö§ün.ýºâù†,¾NÀ€@xìÎlÄ>ll ð)^ïÏ¢!—þˆìnï DÏ>狜vL§cp¦œv"íJmêÀê¶nL8 yz-w&­}vރͯ /âÙ…ÚþÛöðÿ°%Â-Õõm¼1q/rÝÝ2q?±uBn†ú°S!û¢o1v1.~1‡ Ç"—1êå†.ã]ÙPÐEßK«ñøÍèÞ„èòÝæÝçÀÔ±ëcÅÙ“RD–ºñ–ò°OÆìþ±²ßnˆ&Eü®–š)Mî CrèÍ ¡Fï¦H§1”ó~dö‰²÷õ#_dÁT«+3¤CBdKt*'?²'“ßœ«Mšê: „Æu/S~o/ëþT Ä,ã`‹¬ú$`į½tr.KÞ³¹o]Œë/ƒ+\¶ï\^3Y &E´@(!xdµ¦å3‹/¾Hó4Þœ,þì´›c pp– D¤$š½"G3.·3ìIKkNð©Ü+ˆJpÃÖ[ElXp¬Tì¢Tp¾°3AãÝœÄl ËlÆÑTep¾¬ /m· ¯ DqfÉ¢ ðFtGƒÞœ@í×&­ÔšÆV[Ú0¤ÈgN×gKlJE4èÜÔŠz:†Ø G×4ܱq¯ů,]æ:²T+®$S1gDõVÝ«"X‡uÖõ(–µY?Zo¢Z¯þuѵµà½5\Ÿœ\ï]×õÃÝ5Ýåµ^ë·±¿±ã•Œ_ÿu¹AnÛÄ[£"Ï-b#pWW!«ÛOò`'òê m"FvO6%óNX2"/ȶgËÚ/¦Žäž.„x)ÿˆ£r¤*›s(#¯ôŸ- j§v£ip©³ Á„• KQeR‚¯0kS‚o’Ìo÷Ÿ%°6ëˆI-H¦av¯7kà7O÷iÓ´u³õ-¢>7+ à!ƒ(„¾Æk=Cæ=dzWIÁVLu§w›%0Bg3!€Œ³B!BCðA?ô¡‘¬£7€pŸáÅõHKþD0ôCÜlΆôë.‰sž´…?¬LSâ„C±CdçÊ µw.fôÀ bd¸gCbÍ5Nç0Q?ÆSGxŠ«xE<¢OƒÐFéûÄCv»¡û!è@*&£±„79`Gq(z]8…B°¬WOÆ•cybƒv˜»Ý˜“y³ñuÛý·šÛ›››¿9ŠÅù×Í9‡˜Wžç¹†±`36aÇñ8fuªô¹ŸO˜/6î–Ù™µ£c ¢':ƒ òdì©P`¶ k6¡#gWSšSº›Y:™igv•S6ClòªLº¨(C¯nrñZ%_n)ª@Zä)ª¬·¶ ®þ+Ãò+ ÄÄò¡Ò²ƒß¡‡ú«wÙ.Gw1«_H3I¿_­Òä¯òòp«ïD$3C,ó@DO¶4Ÿ‰«?û|Us7‡7‡j3fk¶Zàx‹kyÏš!x9;¡µ¦³¤;»ºÙ;°~¿kq¬ =_ìÀý+<Û78SÄ>÷³@üs-4º üÀ™A;´»‚¹B3üBKlhænMH4E[4F·„FƒúÆ¿ÞG8t^øYV‰Æ--]˜ôÌ·lEìK3ÄKkÉcœø©¤ûËG×M 5¿ø^ìákù4Îçø£ì¸Ó>¡QSR+5ÕÈ7ûÑÛ´™ƒG’÷ÄUK¢¡»ü×SsØŸþyQ}Úמk™Û¿}oŽðÒ}ÜÙ=õâýÝé=íò½G¯=ÛDZƾ„An 7z2Bú’{½áç½ào£gò‘>zPÐéËÜ?~]‘ú¦;Ohz£séåo6²l>çÏ•ç—zOœú¦§ºW²z± ~ê_U¬§ò¬¿v™É6+жFÚö¬ƒk¥â>°wŸ°gÇD{±[òË2¢Ö2³³ í×þNE;1w»K7r+w®6÷´[įI;öCô·+33“û¬ü±L?õ结w]j7w{÷C€÷¸~k¸¾oÄ;„8“³9;@H±bÀ@+nÈT¸aC‡!F„E‹1fÔ¸þ‘cGA†9’dI“'Q¦T¹’eK—/aÆ”9“fM›7qæÔ¹“gOŸ! Q(«X–H’°téÀ‚ Ÿ’ÀEȘ§•Vº””iS+¡>$j©¥]¦…(#Š•;Ɔ€T‡©Z+µBIÔ»—o_ƒ<˜paÇ'V¼˜qcÇ!Ê qubøTáSB`ø„"äÇ@50k^8DÍÂÊ—­dÞl×áV@ÈXCÍBžrVãÇoqãÆGV¾œysçÏ¡G—>zuÇ“ úÁQ™Õ@ZÂAÜJ–P FÐÚ©ƒ/_ ñ^<ùŲo§ÓÝÊþ÷ðãÕ⌠†öƒ, ¡’N†Î <î8N 'ªÈº 1ÌPà 9ìÐÃA¼N(ƒîÀå'¶ˆ!ö¸ ¼£E@΢èa4§rÈ¢Ž7°²bÅ_È,j¨ÄSô‘EaÐI+£¡HÒ :p !¼+‹) 3ÌäB,ÓÌ3ÑLSÍ5Ùl3&ìÄ4¨˜ÿêk „ÄJ e#Î?%$ÓÍA -ÔÐCMTÑ™à“]À¸‘6@)­ÔÒ ]TÓM9íÔÓOA¬Ñ1C ½KQMUÕ‡2 ÕÕWaUÖY_uÕ[qÍ5ÎViíÕ×_ VXælÕÕØc‘þeÕÂa™mÖÙg¡Ö¤b“­ÖÚ\y•VÛm¹íÖ[E©½VÜq)ÍöÛsÑMWÝu —ÜwáEnYvé­×Þ{ñµÉ]@ÇÀï§0éAÀãžê3ÞUÍÍWá…nØÞ}ã²È¾ž’£I Ÿjá˃SMØáAYä_!nhF§–¢Å ž0è¾âž¢LL ’NŽ-õxäyîÙçAKž­N'ÝÅVT"˜' Ô 5àÂ9çy®Ú꫱ְÑ-œ¸$”T<"”:`pƒ ºœA E5+¸ölÅ&ÛìÑbè‚,.0hï j" ZÚB t $hA ² „H¸«ª‰Mt"·u$©hIAêþŒ”²•î D2’‰¦¨$ 5ÉsQšR• ‚%-qI-µØXÇ´Ä'ΑŽu¤UÐÂt§<íé8ƒcíHATxüã!UeBB.’‘ä!IÝ9’’•´ä† )IMŠI‘—ôä'A9˜Ln’”“c(Q™JUæd”¥t%_:¹JYÎ’–@Ñ+qIÀZî’—½I+sÌ͜җÅ4¦*©ª~ýk +ˆ…I1b“šÕ¤d2Q%1fZÁbÑØÌ¢)‘XZ“œådb+gt¿0áb‘YÍnNqNÓœõ´' ÑÙJ)iʃš<÷2Î{” kT%Þ äÀ3u+ÛþÙh2H¡ ˜(*á XÀ=²(E¿ò¶¸}-lc{(ÞІ8€êE uéK}Ö(4ÈÀpÀS¾“¹ÍuÎdņS|j4@â7€„|T³Œ®t¸\ ¡ÓÔUï{+­L±šÕÈ ïžd¨E=*mþØ©Cþø§‡wµgk2zâ–ºÕeÖA_Q‡,Á3Ul°QÃê3+AØh<ªmºŒIú“|è%pF×)Óµî}ñ++já yÉÒ#… IßÎØ7¿60§Få`t°°0k{` OXM£šh20ºã2Âöð‡;„Í ÿ±Ã 6ñ‰§#â'±Ä(vñ‹EuË´Å0¶ñ£âƒ¯Æ8öñy¢cœ-³Vp¦ŒÈ™ÉM–‰¶^X¤›Vø¦&—ìd-o%ùüKY1µIb„;§l…wÄfX&0—ág–x™´˜úÃ, B‚?˜ù!üܦ€þþ)É,˙ЅîÃAºÐ†šÔlì“(H?ŠQrÔ£%H¤4¨g #BÊж‰´k$¥£Ó’7• ú͆võ«3¢ÛšÞôt;-mOšÔŸרH€RÛL@ÉFOiêSg:kÂ2µrN­õTiSU%·ÖÕ6ôg½ Öé‘•}gMëZO㔳ZAøq€.œ$×¶uõ«kÛ„@¼¹nÛ¹Ò>ä ­oV°„-ëa;“ØÅ ֱЭS%XqV`å)“uw¿ÛÉÒ²ÿ¦ f#‰o}oüÄØn·k(Ü[· Ü©ÚÐ:1ð+ì~Êj ÂrÑ’ÐäÉ8µ9žþóËš·<ü­ I{X^wä§R.qwKk+$W?Ëõ-yªÝ›ëœê¯Æ®v¹KÅ1Æ(8ÿa%Ìkô÷TRLR%²»]z‘½HÒ:|ïêÆùÂQãU·û}÷Û_8ò× ÿP’ïó»Þà ^pƒá¨`;xÇ<á!o` KÃß…3ÜøGžó>†²æV÷Îþ¥Ÿ=¼DOzÕßÓô§'WêW{r¶Þõ₽ìqoLÚ×ÞZ·Ïýïw¹ûdñÙuþ*ò‘¯8ߟù«>²ˆ/å€R¹IW&áò›Ÿ}PÒY¼^¡P w‰?´eúAsù׌äxæûÚw%¹O|þãÔÂèD%  ãˆßÏEtÔ¨ýÞo ÑBmÑìF¼‚ÎÒ"-£6ª£œÂÒŒáÂ)MEMÔN-CÊ <­¤8°¢R*qðñðe‰ç”.§P‡ì:Ø‚jè|M©,ൠBâ á Œª·¤*)˜Ít êë-¯J‘ОpÊÑò†ênÀBáö`Ô .‚K/´§ÓJmn´ÕPÊþûf#;·Ó)¼<Å“<ÍÓ!þÆoø&p§pìbÕdS: h*Ó!ŽíÙ†K@XÐÖ:Á Æ€Š!BÇ€úBt "A‡°Ëdh£A§ B%”B-C‚uúvd‡vlÇ{ÊÐñ tF×$“ÔÍ èÊ®ÚG@r”zrÍ àGc4"¼ðF{t ATyŽ” ~4Hñê!®g4!=ý¦{8ÃÞê‹FµôL2)+«zªçK]9¿Bâ‘âúвä/L½Îõ§-Þ".æb¼¢etKñt3ô!dÎGN@áXÀj¹–’š`@6  º¶l iÁ"a̶míhj-"jÝvnÈ6€ ,‚ 6Àè¶oQ(F#F!ü¶p ˆl 0¢l€ ÷q§6@0B6  7syÊ@#Ê47tçâ ¨àtQ7LáD·u«Æ–6vew\Àum—g& lAÁ –Ö twn7xyf–v„÷x‡·x‘wyC†x7Àx™7zÆy¡Wz­÷^¨÷zµ·^²w{½7]º÷{Å·[Âw|Í7ZÊ÷|Õ—þYÒw}Ý÷WÚ÷}åWVâw~í7Tê÷~õ—Sòwý7Qú÷cêµ€ ø€8x¸ø!8‚%x‚)¸‚-ø‚18ƒ5xƒ9¸ƒ€ ˜ÀƒI¸„Mø„Q8…Ux…Y¸…]ø…8`b ! lø†q8‡ux‡y¸‡}ø‡8ˆ…xˆ‰¸ˆøˆ‘8‰•x‰™¸‰ø‰¡8Š¥xŠ©¸Š­øŠ±8‹µx‹¹¸‹½ø‹Á8Œ­dø%Vàà ÕxÙ¸Ýøá8ŽåxŽé¸ŽíøŽñ8õxù¸ýø9y ¹ ù9‘y‘¹‘ù‘!9’%y’)þ9‘Éx†Ñ¸’5y“9¹“=ù“A9”E™)X!A”Q9•Uy•Y¹•]ù•ù’Í8“a¹–mù–q9—uY‘ ±à¦`—…y˜‰¹˜ù˜Y–]⌑¹™ù™¡9šý¸—Ó8 ²  B´@ p! r!ÒØˆ ná Ò¸›¿9œ±n ¡ÒÙn! !½œÅYšù¹ŸýùŸY™[‚™º  ú º“©¬›U à Ša ‚!C¡ì  %š¢-›mR@ V!I¡:`vÁ£'º¢/:¡ez¦iº¦c¹Œ—™–mz§yº§þyšš±` ‚ Ò˜: šo!o¡ Z‘Z©±YÒXÈ ÷@ž×8ªz©}ú«Á:¬ÿY Y‚ Åú¬Ñ:­u™”§ °Y ÒøKÓl! ö€âú~°y©™ $åZ­{° •Éz%̺°{±›‘š¯Õø8áµ B!%»›š³š3»±A;´E{[%{´Q;µU²5[{¡JÀ&!“§ ¶-;_;¶g{¯Õ˜šSš¢[r[¶uzµû¸»´Sâ´‘»¹û¬»·ÕX zįÒX € ˆÁÒ¹º¯›·y[ |!² þ¾Ûºÿ»Ÿ»½Ýû«•%˜û½é»¾íû¾ñ;¿ :¾Ob¾õû¿<À|À ü‘ùÛ$ü»À|Á¼Á<À¼$üÁ)¼Â-üÂ1­#œ$&<Ã=üÃA<ÄE\˜7|$v€B!ÅU|ÅY¼Å]üÅa<Æe|Æi¼ÆmüÆq<Çu|Çy¼Ç}üÇ<È…|ȉ¼ÈüÈ‘<É•|É™¼ÉüÉ¡<Ê¥|Ê©<ÉÀ`âÄ«|˹¼Ë½üËÁ<ÌÅ|ÌɼÌÍüÌÑ<ÍÕ|ÍÙüǯ“G<Îå|Îé¼Î+¹ÄE¢Ãí|Ïù¼ÏýÜÏñ<$ôüÏ ½Ð ýÐ<ÐAbнÑýÑ!þ]µý#=Ò-ýÒ1=ÓwzÒ=¢Ò5ýÓA=ÔE˜9½#´¼ÍQ=ÕU}ÕY½Õ]ýÕa=Öe}Öi=Õßü%N½Öu}×y½×}ý×=Ø…}؉=Ìo=§G=Ù•}Ù™–K#<½Ù¥}Ú©½Ú§§º¸5™Œ©9ÊÌÚ%9ºÅ}ÁÜ˨§Ù“їݸÝ×=•á½’ÞÛËZÛçxÞç]ŽS€’úŽ©yŠ ÃûµI<ÝÓø ¶¹·Yæ˜à‘ùà›âã˜â™›—¢-ÞÛ/þÝ ™š;ÞÀE¹Xá¯ÙøÙ7"ÚíxäÓ8T!©™ìàãûb®þ¥‘]žŽq^çÅû•{ž¯sáyè¾èw>™÷ã•>èÞè™èµÀXaŽi>äŸ^ÝyÞÝǽë‘Þ±ã]ŽÉ}ìáí[»éמÇ~³Cž^êûØ”@³ñ±õ{þRA桾í÷¦â—>îݾð鞕ўð ?ðÁžçÿðÉÞì9~ò!?ò½ž´ÛX ^íÓó7ñ¿~ÜEôK_î}^ðc™óÙ>åIð)¿õÿôY†š¯óÞ´÷ÞæÀáY«{¹+îÈÙœÑÔYŸ÷šøß=ãáÀF€Xaj~ßá´Úë©ßú±¿ß9þžñy÷9ú7~îÞ—C! X! „!ûÍ~û»Ÿš¿ÿú³ÿ÷Ç_«›ŸŽÀ4b•E˜*„";#X±±0¢Cˆx„³JÉ@,¡R<ÉpÑR´ˆ‘!¢[d ±„£E ®,¹L¢h‰™[WdÒ´é²âÅ…{n*XbÏÏ“TÞŒ˜fF3kÞ̹³çTA‡õøN‡_YhÙZ-C‚ËK×jˉJcF슧Nž>§®mû6îG´>„c·(^‚Z$RÕ‚—±ÆÇ\q]âåHů“S®Üûr©QÒ‚ÃF©ë_Ï E³K˜¬Ðþ»±»…;ûsèÑ "TX:¢Þ¹|µ®Œ[ìXã 3úNrdI‰©ý^nGXV,g†=V˜Š*„¯MüfcÀ7#'o,ð;ÃÕ÷ÏOŽá‡“/·dÑsøK±™}Y©6‘xä-8˜t“UusÝm%ak¹å'UôbŠ*®Èb‹+ü’U ÙÂI b¬¢`Œ‘!É@¡aaÔH1œ,2E09ž7/Å`E1¾0Ę\s-A f²9 ¥”3Öx#‘F"©ätuÁ‹–a Ñ“QŠAe•–A„¥–qå”Ñh#Žpyd’™¹Y œ©‚sxzyhþ¢²Y†¦šlÊ™Vu*J¨žðæŸc :ÖA¹'˜~.:¥0ˆÀ-&!â¥sÂqé–™~Ù§˜–9•¨B2'ЖH’¤š‡¬@¾KiKµÞyk©¹zº+^Âk,°²1„¨²@þªX•”qËO·¡åTsv‘1¤@ -ªÔHŠŸ²:›%¦]jÊ©Ÿ€’ɤ‚îÂ+/½þ~Zæ²Ú^[ì±Ç;/¼öjè½Wæk뾸vú/¨êRì° Ã©@kfœgÈØ’*¡5«mÌÙ±Jp¤± f<\°Ä öëí¨qŠ»$ÃÙ¶ÙeÅ S p£{‘RL‹ì²dÇenjþª¶R4¨ Ôr—Y=tl–b ­ÆÒrŒð@)Û‰-ÎMwŠ/긢$ Üâ-ÝÒ‹£ñÒ@I”ûwÀp4U‰  ,ÌAGT í G߇'Ç⎓ŠZ¡ôÀMš—&Qå—«^¢Þ|û¸âŒ« ;C‰ì…ùê쾤@¤›Þãäp¸.[ï±sî9µ‡~»¹…ÓżßÊÃQŒÃ°RÔ/…°N¹åÉçQõŸÛŽá†o{R ¡hM—@êëØºø]_þìçC£ûð<8Ì~(JRQ©ŸÌ)€²ë\›g<äÝ|¤èDg¦¼1¯‚ûÃàe&þÿåÏæ‹ù"h?àƒÎ»`ô`sB·½ÃëÀéÆ9”ˆ°w[S zÆ’\ÀIØßXؘ~~:œaêrhB(>ƒ¿û æòÖAÆ!‘~%ijxŸð½Š,œâíÞ·º©ÑE0–ÔÃÉàtp@…-²° ŽhoT׎ŠA&ÙŽà:ç·dÁ Dóã@ q-L¡ ¤ßŒ7ÈBJäÍS$#ͦ@K2$]›eDH©-HJ’’à›! iJO6ò'vÄ£ÙWJý¥ \($øGf–úÃåA‰’ZæQ[¨(F¬¤Hæ(ó–˜|e.ù¿þOZi*Í|fZ¢yÊL3Fv@/~ DdÄ‘áü8Ìkv2~‹œåƒgÌzÆfœìë&4é© SVS“‹%=µ™@ؘҟiQå$™ÃI¿1Tžq”‘EÇâ ƒìå}”?cäQgB3–¦DhcÒõG‹n’ô¬è=‰‰ÍEr¥È¦5 ZLYš­’+ˆÜÖÔ>ÜÍ}'^~ñÊb†àÄ]ʾÂl[%àE &HFz6¤”ùC0p± NÕ2U½ª )¨U§Þ­¼c+>µàU°–m›dµ*V3»´âM KýþŠ‘"À…(Æ\+UW³>έ²ÙªŽøêD‚þìA‹ÐÂ"úxHQ˜²‡TìzÖ¬îű¥™le/ëNö „³áB¦b©Ì{‚S‘£*h+ZæÖxøTän•Ù˜Ö²m©Xå´Ñ²ÞÕwz]+‡‹ZœÄu+¡Å« )KÜê–àeÈ•™K'ñ£P€n¶½ngÝÆP|¿U­p¯²¤öÒ–‰m}®ê$"ß±D¹ÚÍëhÕzL!AêPñV\Ù°¾ÉI…12…Ø¡¯pèE1$<‰6&˜ nR´x[á¤-eù´0†ÛèÞ$ LDb¥Xè Ľ±@¾Vâ Û!Ã-Œ± ãÿáX‘*‹]Lc{þ-ZŠ4ñŽQ¼µO8¸ú"ñ0BAÉ^„"A­HG̨&ë˜Ç2“2…‹,*NüB"E^…RÀ UHÄÌ3L2˜5EO'“Ù½i^³@Š\dóÐÁ>èFÉÛã zYÉCÎ󘡌’@§V"znã á€f ©yÃúq»â;ÿ¯Ò‰~qŒõÔgËy/8Nõ\ ¨z7Ñ)øC! A Ôš@м4WáàjSYSžÖ©U+¨‰j;6‘ñ@Œa@ºü´Àu;0}çû§gâM¬@bXbµ½àÅ%z¼ø‰ PwçúR<k!þ‘Àÿ§…zßû{pÐ7Jú­ê=’?ÈõÀ ~ð|&ÜÞønø¾ BqêîÅà0)ž"!¾b‰ÿzµç[ƹñ… Äá'yw¼çO’_¤x<@“€I`›å/9ÂÞqšÄæò&’¿)p€Knlþ.$†‚‰0çoù¿®q¤3\éºÔ{Aõ´kkëF)NÌCv`!Ú¨†¾¸ËÁs±ÏüãNçõ®éÍq†³=Ý1ûÔ'íŸþXÜë:Ééó¤ó="!ˆáÑžrT~}ç–úá+4žò }/q€‹+‹|‘žƒÿõåSyÊÿð2Göj}Š,T`Iþ‘gøÉý=¸ç<ãá ý‚ô¾ø¢s>ìÏ+îSr¯ÑÜ€«~rHñ`ë¤\×¾÷µÏýÒ€ÛÐß/ÿ@ÂQóãeüê/?úÛÿø¿?þô¯?æoÝ¢ éÒ¢‡ù'€ç×}X²f€'€ømá–€¥&ø€1Rhx(Æ@ 4nÒÇF(‚#Zp€R H‚îE&ˆ‚+ƒ1(ƒ3h©p s ëAƒ;H‚*؃x‚n÷€Ð”P<(N/d„I¨„â‚åe²bO …5µ„"¸€ é§„>h}W˜…U†a(†cH†eè8[RXh†þ0H «²†oxðM¨"Ô‡wˆ‡y¨‡{ȇ}臈(ˆƒè}rH‡sc‡„¨ˆ‹Èˆèˆ‰‘(‰“H‰÷1‡‡(T(V‰›È‰è‰ŸŠ¡(Š£8ˆ†ˆ‰+’ˆ¤¨Š«ÈŠ­èŠ¯‹±‰¦xŠv£‰kˆ}DÕp{(‹¿ŒÁ(ŒÃHŒÅh´X‹™8*È€)Ðnº¸ EÏgŒÕh׈٨¢ˆŒµ˜Š †¬Àa~P• ªP}A ëd "±ïñ(óH;اø &Xð ¦~Põ økæ!`õh‰ © ɄɈ"æV|²Zbþ2I ±²ñ!ÉáîÈ*%1G@±’Á XÑ=Å-é’/ “1ù‰÷ˆ‰ææ ÆccÓ6ª‡‘Üâ(¢æ4C2ib2lrHÀö-¤B6B h$“O •Q)•S¹†4yˆæöE-„>ù„SàU4FÖ ¤-5tCG¹Df„ONI•mé–o —qIVI‡æF! 4õOá¬0EÔN0ÕIšgÅJ%)üdRøÄSré˜ ™‘)—tÙ„Xy_!_äçWŒÕGpõUT'ÁZ™É>)™§‰š©©šôH™ h“8 dÖæm˜v=¤H¶Ev3-6þaFaΦ-ì·šÅiœÇ‰œ­ØšÒgn’ã!—@{‡r,¨H÷x{Q7£r|óŒp0x½<@Éižç‰žé¹ˆËIn©8 ¸ÀƒÄ)¹X~¾¨ž÷‰Ÿù©ŸaÈžF}» ‰P ¼ƒ.(„û‰  ª  J†ýTÔ§e¬Ðƒ^È Š¡ª¡=x‰Wy‹ ¢!*¢#ˆj`J¢)ª¢+Ê¢*¤CJ¤3 ¤t££åÇ…SAŸô•¼öY¤SJ¥UŠGŠˆ1Ú~KªCßI_Ñ8j¥cJ¦eZŠþZ—Z b) £‘ª€s\z瘎±Žß&’fª§{ʧoˆ¥!Ø… aÐv8Cw1uZšþا ©‘jhZ™š‘¢'"bd[q7Ñ‘˜“Tšƒ˜q’és±’’ʪ­êªËH©®©‰7™“ºÒ4æa ¿Š5Óò5ªÂ*®°"S>’”¶ *}Ä–¯Ê¬Íê¬]«Ì©‰Y©–쓾ðd°Á ]”;ÙÛÓ=߃–Ó3Õª¬—ô¬ëÊ®í}©Œq—GtL{)š%ÙçI¢´KpÐK¿t &QªŠÉRìӘ ûªÊ"– øþ`¥6‹@ › E€%X„eXpšæ¤IŽª°#K²zʰ¨8«°éuÇÖfiZÀ 4 ¯ô„cW–e[&¾)—&œì#Ÿ% ´AK¤'[‡šèœÐ)8|Õi wD¸ Àq×s?tÞénðÖtJÛ|BIžb*´a+¶2J´¶8ï9ƒMê}R:¶më¶)Z¶y‹* ú¶w‹·yk"ð¯Ù  ¶z+¸ƒ´qÛ·„‹¸‰Û¶†›¤Šë¸ë¬Œ«¦K¹•+©’k¹™«¹¬Š¹›ë¹Ÿ[¦‹‹Ùç¤Pʶ ‹º©+Œ¢[†ÎHG¿¦™SžªK»µëЬKhnþÓ¦dð¦q j:B§ºx§˜§¶k¼Ç뉸K_1¨…z¨öò»Š*زÈk½×K‰¬{©’ª›[½Á¿’ùdpPªå›’‘‹½í뾄Ⱥ´›Èz5‘«»š~Fs,‡”BS¬A.K™®ïKÀ܇¬K­.¤-ך­Û* S!Bˆ¶Dåº>èºÀêjÀ¬ÁcȺóê@õúM?¡ø:³â$R!ÜcuGËd¾tD°i°,¹Á3LÓʷ›9ûR'A±Ú’^Ú’Y›Ea;£±ødš5¬ÄK¼‚ñ«²²ùdv5ó²1›}™f›&Åáfp&g; œ3¤³þpÀ³×Æ”?ËÄi¬ÆȺGË Ñ9 Ç´N µÀQ¯×wPqu·u1xì–µ7Çã9»klȇ|£ÑÚž1жK¨¶Úwºˆ,É“ìFŠìŸs JÉ›ÌÉ3iÉz‹:¡LÊ¥<‹Ÿ|¢¦¬Ê«,‰ÊËʯ Ë~èʱL˵\•¨ £¶¬Ë»\†³,†ÜJO*§ôɼlÌzëËñÇŒý㥰+å¦Ç,Í‚›ÌЦâHŽJ:Á›»Ã«ÍÄ;Íá|·ÕÌN²Á"û}9½­4Ì•Äâ ÏB˺èK‘ãk=¹1!~1 *)Ù!$‘ç{ª™úÀT¸¬@Ž ½þú±-ìÏM²¬«0L“¬…ÏÀ.@©Ñ? ,%'s”-Àt' l2ŸT£¿À²¬íÒîʺi©À\镺S_b –Li–=BÁaÁ,¸_·€Z€ ëÓ”TÖÒ/­Ô‘‹Ë9ª‰/l¯×ü—£´EÕød˜1°+|K‹É”?a 6£þ8QÀÑKÖ ÛÔA*šFš ¤H+ÔR]õ™AÄ«åÖGüÕ(Ñ¿ •ÜNî现æŽîëþ¬êÎîïîªîïó©òNï÷n²¨øÎï kïýðEúïèíŽôÞß,þî¯ð±8ð ˜ß¹»üíß Oñ°(àAà¼kàJ~à?ÁÍôåÍ ÎOò¯ï ;¹å\áÏ{à\ªá¹Ëá%ê%OóWzò(KôܽV©°a%úÃÌQ¾+~­ªÛôè -ã ¾‰ñÐ2\óQŸ¼7_´AÒ;‰«?ž¿P¾¿) À¤räþ›ä.Åä)í¯\ÏÒp.õk_‰W^Á3=à[îÀïÁü;ÁeŽåZÉ?{Mj>ÔmŽñoÎöƒÏ‰tèúÕELÂÌdèˆWG‡¿Õ¶èøÖ„ž˜ÿô„¯ù“Èè™®…^±Q…]ÑeAì±wž?×xÁéžþ8£?Øèþ¼ù³¯ˆ¦Æ^fÆ©³«N›ÆšÅ~ÖûÑÅq6g·ë”mü= N¶Žëšüº¾Î´/ýøë‚̵µ7ÇYð´Æ>ìp€ÇÝouX§uÀ޵~Lþ×ßqÑþ´mÛgíÌíÓ/ÿ€Øð Xð1î:’ðóÏÿ~Jõf p$XÐàA„ .dØÐáCˆ%N¤XÑâEŒ5näØÑãG!EŽ$YÒäI”)U®dÙ2$€@}dΤYÓæÍ¿\îäÙÓçO A…%ZÔèQ¤I•.eŠæM¨QiælZÕêU¬YµnåÚÕëW°a¯>•ZÖ&U±iÕ®eÛÖí[¸qåÎJÖìÝ>þhéîåÛ×ï_À&¼Ð.Þ²z /fÜØñcÈ‘%O†sqTÅ$,$e,âf8 öl6FŠòiÔ©U¯fݺ©åË8už0«Ÿ®*"°+I®…'^Üøqä°c×Ìü°ve²Ëð¹ÁTª$‚¦eg 1%ÈÅ'_Þüù°Ê—Ïlîð9èE¾ %¼^ðWªíŸ«˜‚ÞÿpÀŽÔ[/¯Ù²C˜,Xi4-ÄÀ%‹\R€.:ýJ 8ìVFð®2"œ°Bp©Kˆ!ã–+J”B IŒC8:؃@{ôñG “‹é@ÙòÅ,°ˆ´FŠád‘)‚þÉp ø|!_ŠI²_¦lòÉ("#8B)Â,ÂèK(¥$ñM6 rN:ë´óNº \O±=Jð 4^ªKâ–)õ»1NàèÓ·ß T AÅ$Ž[zÁ‚ GáˆôÍçäÄóSPCuÔº†$’¹á cDI@#ãF߃C‹xS•LI8|óUXS\[²Øƒ1aíX‚t$uYf›uöÙ‰ô\ŽO?á(´-HV°%…E­m[m úE‘‚´($²5Ùøƒv^zëµOicSìÈ$—¨—bJ°c’ÙX©N8~¹"Ë-»|` (ÏšBàuÿ xàÙþàÈüîyd’KòÔ³R•$ŒŸ¤Ä^x¹äBÖÌÂc8º F’C$˜g®IpH‰È Ƙe¦yÊÚ:Îdª«¶úêÅò½¬=8&ÁE¥Î0* k²Ë6ûl±´F,³]DI¤7Ñ–{nºëNm¼2ë%V˜ÔnÀ|ð¿ð¾‹kÂW|qÆ¿2Ü,Ä—|rÊ+÷éñÄRµ|sÎ;÷Ü#Ì¥ŠüsÒK7ÝôÐ1ÓütÖ[w}òÔ¡ý"GnÙÌ’P¸%)lˆ@4Ó^~xâÓ3e™f·h•.vkžÓBª¡ÛVto·Þ¬ºxî»÷>©Ø‹ŒÖ !¨ŽþÑß¶¡é!Ê.?8ºû.¼ïë·ÿþ–ÂO™¢ë´À¥—=hJ\Ÿô.røí§?øc`X ã!O1 jЃdt" õJ … ˆA¬ +VSêÀ/²@ [,"„SòˆD¤DÜ‚ ¨–ŠÒ¢ÅhV3B‘n$e=PˆC$"û"ˆ²}!IILrR›¢c¨*¨œj/ÐüÁ’HÁÔ„0Ð0 \Ò-8‘1¬BR1š¾È¦0AOCº*bíHDý¡Š ẖ@2µ©çpbjEÓÖ ˆ³8± Œáã¸D!\­Q •ºÔ@þH(9ƉŽwäd'ë—Ç©¤jUþt•±¢ c¹ÉP›*Šq³pLÔ·l(` „¼úa&sÔ(OS˜Â%{RÅGr½k „ˆ ƒ³J9‚fŠX„3iV«ã"hΕ®ŒÁÁ]Tà0ÍyÎÒ3y©â×5±‚U‹Š1º ‰Å2‰¿Á(F2.ÈÅìNˆqŒ•ß :úPÉ©AYYË^6« = ¸™A8ZñS¢À.Q)&uôMÒðð“ L", xµÆ9éC±¡†fu«7R׊²ÂeMšÍp¦öj!£Cã’ )L"z¸†×tC‘… LI¼þÑb:Ó¥ÑZ£9…¬«­}ííˆY_«ˆP±ÒWŠÛã&·a´½5¦º nåfw» £×½õm§î¦w½ãRY{ç[ßpÁ÷¾ýýo°ôà'¸U^p„'œÇÈ ¥fnþx §¸¿ÚV/´¶ÒÞ¼+þqr_Ü:´míûB+¿•ä+·È¢»— ä¶½‹ž¼X~ókû–AÀ /жü¦ßZ»+Â!xw¨\â¨Ë8g:¡Ý/ú:Q  –ÆèªIµ1M®oª%Üt°{ùÂeÎ0¤6,hF’ýV¡dÍîõM†]î®ë(‰dâ¢}íw÷Õ@°¼KSúrés'u{*~ H¤Â>yHƒHO„û;H†ì©lHˆ´£‡ŒHŠ¢‰¬HŒÄŸ‹ÌHŽôžÜ*ò«ß ¬Ž,ÉPùH‘8ÀTÀj3I— ’¬òñ,÷­ -ðxI„É„ÌþI—ÿ ÿ‹ô«AÛI¤ä¹£cÁ^ ±ú ?£.ëZ¡ÉÁ€ È¡»! ì¹!Â^ÒĤ,KóP¨{/z’¢y#°O{fÔU¨$ C®“:œD³ìKò@Ã>‚ƒ7 ¤Abm¹3„©ÃÊH„þ›”=Ì5Ü˸óKÊ<B$%CŒ%@%Xq)C˜“DȬ®Ä¥J¼Ÿ{²¬LÖl Àd3Íb&p¦å:³Út.„ù&‚hEQl­£lMàtÍžvòÅwR¨F“§„"té´ ƃ™K„yFS;NFÃj Ní\ l|=mœ=©$ˆ26d›=¢9ÇèQG™bGÝÛµó½íŒOÔ¨GŸÀLJÐGùÌOÇðG§ÒOÿ”‚̪ÿP²AI=Ðf1P]PQQP}Ð;qPPžÜʼnº7ÎXΈIü¤PÕŒáT¹H,d,¿bÉxüP刘$ˆ€…= ƒ,P…š"þÑ'zˆîKƒD A ÌÉÒ—QÙYÈ¡ˆXƒ°ƒ$H/´QÅr©i,°ƒC@R’³U3J‚(A" SXJ¡ÂáÂ2¨‘nËL!«ä–¢Ó¡),‚h¡‘Ú˾ˆ8ÕÓ¤ÕSAý #X¯´lÂù…Ø©ç˜Â.ú"˜ ¼l´QĆˆª½¼Œ£»<“+ŒB_âËA-ÕÞ)Ôý¡CµLõ…? ƒ=†°´ EšÔI¢1*ñ8Ål¼7ÔC\åC@аÉ4Ub•TÕ£+ÄKlÁÝ,¨˜çhÄC„E8€DK=ˆÐÌC\Á;¡D]þÊL|ˆ@-Vrí¦cm8U ÅZœÒXZˆžiª¦kŠžV §9=ˆ]U»uÕM?£ÅQÄ0-W‚Ý–sÝ¿@T댧X…4H-à¨Îk£}꧃Y1HNPЀF … ¸RT˜ éô 2Àa¨Až…ƒpD)ó,HxD GöˆÍ‚5Ç–R+S÷t6ÜkZÅ©BOšýZúœ ûtˆýZråOè3[µUMѵ}Û¬9X^„[ºN›ÕÒºÍ[ÆP½íÛµà[¿ Ü€“Û¼…_8\þÄM\Å]\Æm\Ç}\È\É\Ê­\˽\ÌÍ\ÍÝ\Îí\Ïý\Ð ]Ñ]Ò-]Ó=]ÔM]Õ]]Öm]×}]Ø]Ù=]‰ €¸]ÜÍ]ÝÝ]Þí]ßý]à ^á^â-^ã=^äM^å]^æm^ç}^è^é^ê­^ë½^ìÍ^íÝ^îí^ïý^ð _ñÍÞH°Pó=_ôM_õ]_öm_÷}_ø_ù_ú­_û½_üÍ_ýÝ_þí_ÿý_``.`>`N`^`n`~`Ž` ž` ®` ¾` Î` Þ`î`þ`aa.a>aNa^ana~aŽIaža®a¾aÎaÞaîaþa b!b".b#>b$Nb%^b&nb'~b(Žb)žb*®b+¾b,Îb-Þb.îb/þâ ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_27.gif000066400000000000000000000572671343257752000273610ustar00rootroot00000000000000GIF89acå猂„LB<äÂÄ|¤BDÄ‚„lfdÄ¢¤T.,$"$ŒjdlRL䢤¬†|´bdôâä„"4\NLĺ´<2,lŒvt¼–„Ä–Œ ìÒÔ\BD„ztÔ¦”T6,|b\ÄšŒ´Ž|D:4|jlôÆÄlZ\œ24ŒœzlÔªœ ¤–”t ¬RT4&$䲤¼rtüòôÔšŒœ‚„TJLl"ŒrdÌžŒTB<¼’„|^T亼äÊÌ”*,$dNDܲ´D2,l´–”ìÚÜ„f\¬ŽŒL:4„j\tZT¤~tܪœ¤ŠŒd*, „¤JLÄŠŒÌª¬,"”jd´Š|´jlôêìt ”vlÔ¢¤|f\üÎÌœ:<Œœ~| „ ¬Z\<.,¼z|üúü¤‚tÌšœTF<ôº¼,dRTܺ¼„jlt^TìÂÄÌ¢”ŒndlVL¬ŠŒ”"$Ì’”üÒÔ\F<\2,”rlüÊ̼–”´’””†„tbdÄžœÔª¬| ä¶´\:<ì¾¼”z|¤‚„̦¤dJD\.,Œrt´’„ôÊÌœ~t  4*$l&$$dRLD6,L>4,&$t¼šœäÆÄ|¤FDĆ„䦤¬Š|´fdôæäìÖÔÄžŒœ64Œ¬VT¼vtüöôä¾¼äÎÌ”.,ܶ´ìÞÜÜ®œd., „¤NLÄŽŒ´nlôîìÔ¦¤œ><Œ„ ¬^\¼~|üþüÌžœÜ¾¼„nl”&$Ì–”Ô®¬\><¤†„LBD<24¼–ŒÔ¦œT64|bd´Ž„D:<œzt l"$Ìž”TBD\JL$dNL„jdtZ\,"$t”vt|fdTFDt^\ŒnllVT\FD4*,D64L><ÿÿþ!ùì,cåþ‡ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+f+ ±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^Í™Ââ×*¼hB»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУK€ìë&|Á½»÷ïàÃþ‹O¾¼ùóèÓ«_Ͼ½û÷îÀ/þ÷úöóëßÏ¿¿ÿÿâU‡Ý€"ià&¨à‚ñ͇Ÿ~æ!ƒVhá…ZGà†ˆá‡ †(¢„ýM@´x7áx+Žèâ‹0fÈáŒyã8æ˜`‹ï™¸Î*¦Ç£ŽDù¢€4&Y‘F6éä‚mdñ / pWNðò &àAÄ'/``%gœÑCŠ0ÔG˼T’ƒ =àÑ=¤™å–]~¦•àà7bò CEh AQpGKgh„šlº©Â“”Vz ’Jf “–vê){Ï|Eo €&!¨P‡5ê¤ZG:þVªj†´×®éíç·¤ûðǯ^úê+ɾüøSuþü›Oý4º_ÿèŸýð€[û9$@:ð„ H ¡Ì 7ÈÁzðƒ ¡GHšð„(L¡ WȺð…0Œ¡ gHÃÚ„ mµúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXtâv8®Fð‹` £ÿÄÅÅ$yQŒhL£Ñ5Á2¾æŒkŒ£稣6ºQ1p¤£÷ÈGý‘ñŽbR»óƒ#XÃG˜XšlvMø hÂ>Á‰í,j,B‘Ü ‰HEÞÌY`€Á¬4È1Ò‘¤Ä$w"9ÉJ¦²‘ô¡w„Tb?…4쵇6ì<~èêˆnÓ£ö Pw&êNT”>#]X‹(‘p‚/cGÑ4ý)P!5¨NˆÐ„f¡ÞÑ@:¹‚¯1Ìyà „ŠRŒ.«Y‚bjwŠºMªæTY0@ªRC*Õ‹jµ¤08‚œðp„˜Ö§«0°ª|˜å¬ºU‚ô)l©JÄŒiWº:ÓtW•²©ƒ™wš¶MZäU•ôÑk:eÉ×ÄÚl¯—¼QϨ(œa¨Áë+aØ«¾õ³ðë©\Ôî\Ö;j…-B`‰ò¡• ëTþíÐvÚ©5B!Xœgƒ´ÚÖ–ôµ|êmùBš‰f‚ õ©-Qo«¨Ù´ÐhGë—Òrç¤4ZQ¡±Ž:4Õ<¸¤[}°›³šF(ÑÛ­/·Òî~—½²ìPC@Y~^×¢0ixëÝþÆoºÔå‹u§‰Ìž!–Þi‚à™ y‚«Ü!]}œQ`q"˜^æ„ìs¤à2ØÁëð„ð ŽïˆÕ¾'3/áÒù÷Åçp€õ2`ŠU`+¨€$%HŽÀ”´$c¿«ÚëòÆ9Þq*A)ÊžýÂ0èñ1ðã ¿MʃäD˼S­~ÎÆ8Ö1A­÷\›™q1þ1-yæ6»9Œ2Vó]òøæ:ÛYºi–3aè,¡!ïÈÏwô›ã¬gºðYЈN´·]h¹ZÑŽ´‘Ýh¸¥ ´aím‹çÞe¶¸ŸÄég£%Ú±u‘ |mîøv=ï¶ê;îzSÍÙæÆ ºY£”¸Ý0°F_Ñ#ðÁ퀰·ÂqTî|—eß"}QnÀÑU¼G@ÃÃ:Îñf;ü/ %”¡þÅ´BÊxÜ™@<2™iŸ}ºÓ &¥)U)M.?wx1ÔšSIQ‘zŸÛ§œëfqšS¤ 4g”­ãPÿPÃ?.–…BKZÔÊÙ鲞,Jœ¡|Á“­ð{ŸV©à –àN¨FUª4‰½VܱŤÔ.*Rqg[»êãèóv‡ªéW0Öчlqz-,ꈯÐÔ©–…Þbe{|ÅÒ´„glÅc˶óu©ˆlÜùÄÜa .vugcëXáz¸ ¬`î©WâgÏ Å3Þ+ ]šÌB´¤€“ž•zÏoÐ¥le[¶+Ó’Æ gÂàø,‹{)WOâ7Ng(# ¨oÈ4Ú£ÜC„Ûƒrˆ Oð/0%Np%ÃSɳ=B«‘Úïx•j©H©O×”M–Ù©õGq—«(š¥Z@€h2˜«˜[1ƬµÊˆ=‚­Ê*Ç«¾zŸÉ¦‘gÀ‘£´(>ªÅ(Ž2^dg%271‡®íºs='%?§ZA7wòq‘*¯ï´‘ ¯ZÂ%^&²& ˜,rS #r'G°`21 +)äA®æY›& )‰Òz4ª"F°å:°'9U*‰=&GþrÓ$°çÊ®êZ­Å °/{²y'«' »¯Üñ±ÂS&:w³«Z#Y’i±àå°‚±.û‘›´ 6ë´1C¯êZ±SËMLË0V+±!©¯ ÛNG©áŠLr”I¹”0p-8-Où¶­ÃÀ•&My†ç¶p ?Iwl§Ü¢wEÉ"wËj«”V‚*ªb,ª‚,C)¸YÉ'l%(W‡:L™*N K‡Ë¶§ <é·:¹Šò¨É–_0²±Â:Õ¹SY•Üq• S¹\çºm‹-sYˆe"ÜT¸0`»Ä²¸f÷*€›w¢ÛvÐw†ÛH‰¸·«+è¹¹º»™É2¹³þ+—{vg(½â»´ 1z›»ÒKºkU× Ù›¹Ü –xz¶ˆ(¦ÜA—ƒ1õ¡7s%p(/w 6ö›1¡7zmɨ—ƒ œ÷òë.𢿆'Àoyº×YvÓz – Áâ‘ÀŸ;TܨÈú7ਬGÞ‘À|9M1ï7—u ýk@¼»yû‹À-\Á¼0Üy¦7ÿGÃܜޑñ*Á;GÁ,Ä<Ãå7¿{ãÀƒ‡DLzF<ÃH̾=Ó«îKɆ™šé¨º·Y_|Vi‰\`Æ;ç|“É·Ó7§ŸÃÅ›ù¹”I½±%4DS_ì{íò4r n쨟»Oþil´€<á K ºµ{0ÐÇõñ™¡9Pvl}ŒÌ{x…‡ÏJÆ‹œ™olVqì¨i¬|Š<Éùz,Âsì\”¬ÈŸSÊCò9wœÊ›ÅÊxHÇEc}«üWÛg¶YLL’›»Ù›L|¿Áì¿&n²Z”õK¿Ü!›ø'µ9Æ £›¼Iž‚b›NFx„$^ELŸƒÍäáËÕ ›öD›¤»ÀôÁ°}Òzâ ̪%œÄ©Âô×ÎÉÜÄÓ+Â1q‚BÏäÌ7Ь(Îì“ÇÏ0ÄÝÎ÷Œû5ÁÞÜ.­ÏòÜÃ/ÌM¾ÛÌ_RÜРóШ˻,Lžâù,˜»ªÃ:VþM F¬œiq'M+õqÙ©¹Û ;œÏ #Ò!0žý¬/hÉ0 aZ‡¾œé‚Üi­:ÍÓ0@¦UÞ1Óèa¬Öú81IêÉžh¹Kž;MÒ( Ô@ƒÓgåÕJ Ç4ýÓØ™8,8ƒUM·f]æ ½>}Ô±Úb[ÍuŸcÔ6mOŸó½9SÒ®c×Õ*Ôù…½E]ÓË)ŸàúÑ lš Øã=à3Ùß3³Td®ÔÒMKÙêúŸªZãC†ƒk†PV‘­.ÖÌ0ƒ<†„º¦d†„F¨„‚ÒÚº,Ê©­ wÇŸ½½z¡Õ²¸]t[H…0°ÛX-¡[„G˜ÜªÚLþãÙ0ŒU¦}̨ݼ͙µ=ÚÃÚAË…º­ÝjÒ * ¤]­±=(ÎMÛ¬íÝÜqÝœÌÞI8Ý—}<® Ôë=õÍ™¶MÚoèÑŽ¦M"¢}ø‡†C¢. P°ªP€š ~Éâa¢ÚzQ."Ý:">5wzÅnŠðû¤7À ý ìY…ä£3ʈ~lÊïSoXúá5âdÕQý£”áfã2ŽTZã@"<ÞãñãA~ä2äDNFŽäN® J¾äÑäO^妊ÅR~À*áùѦ  §4ËnåˆåYþ[n­û¨6׸¦í1©d>{f~æ ‘æ¦b3L6Jþ(ŸÚæçx×~»:çeŽåv>x^”åtNÿ¬æßqÉê¦}i臞èÐ8®0«(2«&ŸþQ5…±«J¤>Jù³øzsZ˯X;anêþN2‰éWçšži˼k·{¾ÔgUÀë¶Û·0”ÅK”ýù¾¼Íë¹ÆîëÎÛÀ¸uº¾ë$â <Ñ.¬ÌêDÜñ[ÃÜÂk©ÃAüÀêÞ^Âä líמ눮íLºÅšìÅGÉ•¬N¹Å¢ü ¢™)§2ѧƕ¹[fœÉ]¼z¢:®^ÞæÇ8æ¢ïƒ¤Ÿè¦#lއï&ç­‡¯oç±VßdpîçÿFéçXè·ïúŠ¿øbøÙZ|Yþ-’NéréÅoüÈÏL $™}2¶D;°{¨ç5ê³¾™§n¯¹êRëê¦~ëÕß}¹æLr-tÍ0Ò ¼¡ëïFUìÝq죧섚|tƒ@Â… a¨°åPâDŠ-^ĘQãFŽ=~RäH’%MžD™RåJŽX ƒSæLš5mÞÄ™SçNž=}þTèP¢EðE"‘br–ð/ŠÀ0 á°¡CZ[Zeh,ŒO*òZ’J"T©T†u‘å\ºuíÞÅ›Wï^¾}Eº<Xð`Â… Fœ8pR‰Ÿ¢8Mh ÀäÉ E¨©D™!-­C<þ³ŒYó[‡—3W†Á+ƒÃiêΙ2ê†^¹õ›[÷nÞ½}ÿΰbâÅGž\¹NÆ™B†Á-ëDx<ÐòP[¢Wyr$¬~=;\ðÖ±7l‚g"-JJ§¨Ý!žMÁíßÇŸ_ÿ~þ‡/0@$PÀ檃 Š€k hù¡>4H!Šš.¦)â™é(´ÄÎÀÀ!/lèuÚäö@H#„Ë+Mé/Gwä±G5ú¯@!‡$²H#o:Zò£à¢e L>‰#…„(á´2Th2k²`à‡°Ôr‰†@°¦!2·LH…3¢‚n>Éþ¢„¢œ²ÊræŒÇ~4PA%Ô® D4QE=,Ië8¤#ê(´RK/Å4ÓCå´SO?¥ÉÑLG%µTSOÍqSPWeµÕEE5VYg¥µÖ’Tu5W]wmT)[6XagÅ•WcE¶'X‡e¶YgŸÍ¯Ød§¥vÚe¡Å6[m·]IÚj¿·Õk¹%·\sÏÕê¥p×eW\_Ñ…7^yŸõ¶]{ï}õÝøüC©M>j¨"¸Ûn¤IçE8afëÅ·a‡»–à‚MrÎŽ²ÄÊ‹$æ?9dY~¸d“ ‹˜_‡€ˆÎ^®HE²æO‹8æèEæ¹çKIþ>9h¡ƒJyc®Ðâ…3ÒÈ£¨‰ffº"œ7ÂcŸ¯ÆP ‡æºk$õ¥¥‡34`ùÎ'x©$³–¦$ 8¡¤ËÊfc0âe:ÚÈâ^0mµÃ¢û愦ãIZÎNÛ,Kv†á3`p†‡¬/Çœ¿­½æœó$ŸP‡TÔ8SÁƒÈ;B=<"]ºuÔÁ&²µaxæ ßHh ‚N'mê·(9CcÝ B L”~ƒÒ‡"ʼyç}Û¼sé…N’‡¦`øá)8§‚+„£8#+¯Æ×»¬³ÒZk{·¸”z‰g¶pˆ-¸GgÀX[®ç÷ç¯è§àÒ䘄D¡!’)\Cþ21dÂuÛQZjVs8×ÀF6 ŒZ|x‘‰ p4)à-Ö±>á¦'D¡Jþ@Ú«z×ËÞ{ôÖðéÍ{œÓÒ³žöÈp_­“Z*ˆà2®'™HÚ|$”B&6ñ/êja»–¤öq#+”b ­¥¯(ô g(›’¤D%-„±‘H58¦3¥‰iKˆœèd'Eæ©‘äq€%~ˆ L<¡“Œ´#"Ø'›ùÑ•¯T9K‡+/2‰8)u@ƒe0ýþHZÓU¶Œ-¼‡ әÔ¥1¥ .d¢JK"xf6¡9MnRS_Úg8IEÌn–QÕg:Õ©#ršÓCBç:å9Ïà´ó÷4Ð7é¹O~Ö3šø(§Šf8•:0ðÀ"0ß…¤¡<f?%z«Ô¢çÔ'̤–‰±OCoR( 26—‡þÆ wÓŠHèµr¢/õˆ=/:SÄ t£ Á@Îð NøjjMÈcšš‘%ãcÉAZ8à ÑL¥ÓŠÒÔª²é¡„ [hBs81§A ˆ)))ÆzTŠte"U›j\TÕ«ÖU9I ÛØ¹þ8Á­­!ë0e|œÀ‹O¼àzòÉ+Ù’7‡ðÍo€Sã÷–ÂIm°…½^Š  áO‰Ý«dgWgèÔ#Ýh·…8öoqk|šY9¹Ööftµkn‹ó¹Ð®t»Ci40C­¨#*x‚({—Љ.‹0°Åìjw;-wOþ1.r•›5¤bt„As}[]âa¤NQð@üàÆíÀ.!Ó îäÆ@‰Ðâ &<Ë"¨?Ûö—!¸Õm€{%ë%$†0ýjãR†Äny×-0öb¾„ E-ñSßu7æ`ýñ†–ƒA„œ`ü^d,HÕŠÞ,S<"7@̓ýë_þ™ ØÆÌÑa€CèÒW¸ÄeïrÉò'«†5„¤i#Ö±N˜ÈŸHˆŽy¬ä©™f4(ÞÌ‘_Ià©"˜XÂ*K<ã©ÖøÆg®É Üø@gÊ;¨"bôä‘+=Œ=çÅ~<0d3-žó9ƒìqÏ|+Û¦ŽŽ–>dÑr™`ä'_§ÀInW“£ÜåàTùʯÚò—×\˜1—9Minsžo3ç?ŸÉÎ{>t&âè:Ñ•Î?£ŸI¯KB‡ †þÎKÇzšîôwB}.ܾXBF ƒ–fÝì;Ú:×ÍIs‚±Œˆ¡æˆPâ&$ªgÇû~Ò®ön²}=HS–7RÖz®yGü}öÎ÷i&©zu¶hç;&·Ámò«E©k!ËØ„h>p#Ühh›xÒÿþfñŒ7&€ lTà·åbê`°:C+Ľ´³]|eçøÊwx¼ãK?üÜœõ´L/z=â ·î†;Ü¢bô9„©©~BH¬aßû|1þñ9@"ÐÇ^Yàl(xD°5[®ðað~ öƒ­»Í÷õ¯—ð‹_ŠÉ_¾@+·rˆb¿¶Â³ª/ÄTÃ?|ºŒÄDÄ?4Ä  DE„DjD{D‘º¹«:ƒ‰*ŒÄ¬cÄI,™J ° 6‘ÒMüˆ²ëijûDP¬%DT«‰p;¹+źCŸ»UôÄBtžƒEŽú»%H"é››:ßI«Š8<^ĺVüÅ{q<±Q¬ÏœÊj›·‰Õº2ÖJ ½ñ¼Èê«Ð‹±BÅ‘¼Ç)Àg˜œÑsÆ¥ƒÆhl— l½×>œ=Öa¿Û‹.ÞË=ßþ3àÚ³‚á H0äQá{Ç¡‹Gy\\3ík>¯x>d¿ò™ð¶à¾öyŸŽœ·àûÁŸ6až†$º‡„HojŒò» +“ˆô£Œõk²22 ‚?û“ɳrŠ ê !Z)ʉB•t9–lÉj‘H +¢"À„0À&“¼³DkÀ—QF!z»¬¼“#*ÆÙ["¤ä9¥\ÊA’ˆPL}Å´\K$U5·œKNó4 5ù˜5)uˆY 2»T#´5.!ÌU•ªKuU!™Á¼A#´·­6j;Ð\57vËÐ ²ËÜ$ÇÜLò@Bc¥¸d $Ö”× ÷W~BVqŪoêÂ/ Ãt­Ôue×AC0PC6”Wþ¥×z]ŽðÜ׆ìWM€ XgX‚…˜ùŽT\ËSÂeÛÃuÄKTF5ÆÏÓà+C þG¥¿$;?¦É?ÌRÃÕÜcÒå›È<#Ú‰ðŽò.!´ñ€RU’Sý!ÃKÖ ××5™#Í4[ Á6á!Ô A‘™K\K‘†ôãWb"NÜ;Ó‰Éð"˜ã09EÉÊu‹ÉµÓíSAMÞdŸä™EÔ@T.q6ppÒ ]\žÏ5]HåIIµ JåêdþäQŲÀh˜3óàݤÝcü¸ßÅJTmU=fWJfdaÝ@4–1Ȇ ÞÚKÞUV¼ç6jííf>úf߯þ”_á¹·úBRyóå—ÁV÷…"Ìç#ây¦ç/žå|²ˆýÅþÝÄ‘Eh'ªg.`Þœè=¬èfàãÌè:Üè Vá^I…^hi’à”ViÔ4链+#~é Ži™F—æŽE®ihaiÖiýàa•iÙƒþia ê®b@b,æ&V'NjgYjümê+NÚÑâXä⪖«öÞiDѪUÑ+3crþÚ5îZ%,8–c:NÑÎ#[†‚38ƒP5fã;É^°†'1ë ǺlÊJ[°^˜›ÆiãgL~ CFdPd†hdxäHždÀåÞcˆÐÁ¢þÀªìðR0„ì,µdÝãlBö XVlädìÆ&ŽOveå 2eF›SP^\ì»0†ð³‰‹çHŸ3eåßæmËõÒ×VêØ–íÄÔÔ«% ZÐe^ I 2Ï=]†x²Ð s`–¿îæO•ˆÕeî_kã]fm&g†fÜ-4éÛTL4îÝmâvˆQõ]D{J­|Àá]obqîç0¬Õu¦U2gt†Þ\£fì=A§¾¢ ¯tF¨ÒÎKhçTûKx¶‘'>ðXiï×½gñ·Êô Zègöýg(ÁAøÕ·–9ƒJè?ñg¿nÁhmÕ·€Îú=qWp]!þ×T™ ˆÖE‰>rkJð$GwÝÍxÕœ(¦×ÜŽÖ×hÑrXâòÃê0¿_*•27s˜ó¶Uó5Ÿ¨6Ú7‡sKr4_ š®s¥“ó ¥ó=§§>—Ù?tyô“%ôBW§CçØDWtqbt‹uôG‡¹;Çs£˜tJ÷âKÿ^=×ô¤´tNG Oÿô“‹tˆÍôRßòPu¢!õÓ中ÓSWØT÷¾XßPÿ¤u‚µuU÷fVoõŸèu_ï£]÷×a'vŠö`W¶dÇ;c¯Wdwvd^vfß iŸö‚vvÅölgºj·öœèvožm×qÏžîáLd‰ÿ%wÓ÷pÿLþ)j£ñaºpÙwW¼x—÷4{õÎY%–©¶w\œ» õY}—Ä~Ç(C‰Å\׈®îa%<ŠhF…·sOV“{<ªÕc ÛËëF”â<6l=Fìrœ¾îZn¤ o¤œ>ÆxàÐxW59¸eËÕfšÑÞGãÔölWÁŠàù&»½î›yšçw†Ïa]§Lîõ‹ÇÍÈ8îâîí¬ˆk²rí¤×šÇT““²éÖnèeuæ7æô\­ï³ŸÙ2f°÷Ÿ¥gú"vúp¦áou‰^èð¿·ï·2p»{¼Ïû›oðß5Aµöˆÿð7‘ oˆÉOZþyV|ëÌ{#áøÅÄ瀮ÌWßÔWP!ÏÌçLå’Ô¯LOo¤þ|¿{?:‡'÷ˆØD w¿ý¼Èý1m¹wÅèá_tÆgúa ç ãürá€þçW~s)þ"E÷ëG˜ì/Ñíç~yñ~ ÿ¼›ƒÿ€"ø‚öwÿ÷‡ÿø—ÿù§ÿú·ÿûÇÿü×ÿýçÿþ÷ÿÿˆ/,hð „ Fвð!Ĉ'R¬hñ"ÆŒ7rÀbÈ"G’,iò$Ê”*W²léò%̘2gÒ¬is&€œ:wòìéó'РB‡-jô(Ò¤J—2mš”  N§R­jõ*Ö¬Z¯~¼þéõ+ذbÇ’-kö,Ú´jײm+6W2nçÒ­k÷.Þ¼z÷òíë÷/àÀ‚Y’9VÂàÄŠ3nìø1äÈ’'S~©¤ÊœU£*sîìù3èТG“.ÝÒ@™aºb™níú5ìØ²gÓ=$Æ0PU6Ôîíû7ðà‡‡UEÈ=kˆ3oîü9ôèÒɶ:rͯéÚ·sïîý»é_ÂBn¨ <úôê׳oOv@T"céroÿ>þüú¹›:1rÔ*lì7 x gl pÅH`† „J8!…iqIdVA$’I*¹d^F2ù$”QJi““SZy%–WV™%—]zÉã–_Š9&™†Y&šiªéÞ™kºù&œÐµ'uÚÛœwê¹'Ÿ”åÙ'  êןƒz(¢iš(£:*Ó¢J:)¥!EZ)¦!P§zú)¨¡Š:*©¥šz*ª©ªº*«­ºú*¬±Ê:+­µÚZj-×\s+¯½úú+°Á ;,±ÅËiaÕÀ 9Í:û,´ÑJ;-µÕZ{-¶Ùj»-·Ýzû-¸áŠ;.¹åš{.ºéª».»íºû.¼ñÊ;o¶¼Ô ,9}è»/¿ýúû/À <0þÁ|0 +¼0à ;ü0ÄK<1Å÷ €Åk¼1Ç{ü1È!‹ 09÷‚UC¾#«¼2Ë-»ü2Ì1sŒ±Ì5Û|3Î9ëÜpÉøîü3ÐA =tÇ:=3ÓñÒD;ý4ÔQ?ÝóÉ)K}5ÖYk-2ÍA³Ò7½5Ùe›}¶ÁT…2Úm»ý6ÙK/r†¾\À ˜ðÌ3&ÒÇNúêÍ·ßúŽ1Ž6gD"øÞ}ÿ 8Ü‘K>9Ðj{Å6å™k¾ùÈrÓ 83Aô1Ž:A¡Î8uóKºé¨ëkŒ:FØñ¾¬Ÿž:äœë¾;ï[~æ½ ?<ñw½ Ø€'¢/&Éè›þ &ªïÛüóÑ÷A=¿ØC/}ñÝ{ßûï6ÿ=ùåGnô6‹Ô=†¾¶L¢ï$¶p߇ûðËOÿûüÖßGüó›ÿ?ɾšŒ/€< ÓÆÆ=íY¯i džó²Áíå¼àÏH“b°ƒl™+h;×õá]én÷:uÈbvµK! CøÁÒ°cœ k¨ÃJ,„K›DãL¿Hœf@$\þÇ‹3\~AÌŸ y(Å)"ì†2É!³¨Å-r±‹C³bL°èÅ1’±ŒfpS%Þ':Ó©Î<–3%ç\'<ã)O.¶%~<%>ó©Ï}ò³Ÿþü'@*д =è7R¹J`2´¡}(D#*щR´¢½(F‘"̪ͳ£ýèëy’w‚´¤&=éðDj’vÌëHÍ€‰(¢Ôe2¥©1qJ0j“§hóéÈÖaŒ©´þ$,¥)PýU‚g¦újjš3¨ÎÐ xÛžÁˆ¢=Œ§:©[N–ÔŽ5n9KÆ3òǯ¢’„¥aKØ2˜¡0šYãq:5؇ՙu5¯ü*+Â;0¼êÕ«kÆûW•5M°{†! ;C<ƒ«óª¿jYÆúu¯7sì¿ëÙÏ6L´†mØ:¤à/¶ŽÄ­++9–1×ÓÚ ÛØêhÛÕÛ.vc 5osk±ß̶¸¥-_…Ë4¸ƒíêk3+0çN—eÆímm)v]åÆÌ±ÛE®Âh¼µšlmVkÝ¡ [¨!‚ ÜÁ¸ÑT}y"¶Ð† Gnœ¡þ%P|C«^öFÐä8ƒ5²‘4À1‚Ÿ‡!h€ ë—¿þ}­pBš Îqé]o{+Üßÿï«}èpávšá 3ŽpÀ€C܇1ìwÄÅýj3T«¯ ð¢ˆÄ3Îp»NwÅžEñ‹cA[˜Ä¡ýªÝ® cCXÂV±†Ä$ƒxÉ5¾pÀ Œ`Ê&Ž2Æê{ßü¬¹¡-¬ñ€,älj9ÁIËñ¾xìã{¸u&ó‰Ïq†gD³»qXs7åGxÂ2f²û fü–9Ñ^ð¢«ìh÷ÊyÈβôüá+CÌÿ: öEƒs0˜Ê¾2Í`ÜeúÚ—ÒXþfñ‰·<êGÙÉžu®],8Ašf¥öuqj]3ØÇÞ—¬GÞa¶nÙE èÐ é•u}à9è+,´Ã6ÊÁíÁ^;ÛÛî'<1‰˜€Ü€[‡J` k0ÛÆx·¹[˜n°öd¯;H‡^i6BÜ ÝÚ.÷¹^ÜÕÁá>18Â¥·pkcûá}8ºÕ=q} z•ƒ9C:œ'Oø [Çp‡<â"7VCW7|ë›ßþ~÷O^®ñŠsÜÝøÍÿïy×{~Õù·Ã=î–xÆLÐÆ¿´Á8gvåúZ:½É]ò“§\áD‡·¼Ã®/À0Ö7þ¬f= žï»ßú®9ÒõnqÛ»i`oú½ó]÷Ÿ×Íë•v¹êsʼè¹Äÿˆfè¡zhûæ.xŸßÛ4×»ÔûþvÈ)~èÜç?nóé¦~ã}`{ëhy‘=ñÏëÞq¼‡|_%¸ß´9êTÀ½Â~ëN˜·µ!Ñí ó]Ö=Øâóø¾çEݨ? hÿ~Î×ô£Û‡rHCz$¾ñûðý>„䬞øÉoþ 6°ûúZûq¾¯tÈÖ¼xÐ_ü•_îœ÷¥þEŸþ)VißVßÎü¡ªßó)àÀ”öUÀòè‹ò1ŸÒ€lþùË2$šñ`¿h ¾ðŸŸý_ª ¿°àõL¡aWhõÖnŸýY øE_âà nàîàýà>×ø Í`& À,7H7¨ò`úÅZá[É_ N ÞßNWžŸöÐ xaª`ú û)àï­Vy]Îy½UcÂÈ×¾8B6œ&$Aû ^¬)¡ô8‚:Q¢å¡gÙâ)a ¤ƒ!äÎþôObÕI×¾T¢õ\$N"Íp¢Óa¢‰-` ‚ŒÁ6ˆCÝä%B¢$R¢+ao9b&Úúä#Â"(¶Ï,Ž"ý<â¿ ¢"¢.–¢ L 0þ8ü 80‘eÖ/ö1š*ª"+Êbú]c¢Uâ r—.£ôØ¢‰%c Î7#0@5ò"7V #š# Ì8üØ8Ê0¢ã2Âc(Vã< £&–c5‚#)Ö£'Æâ?fa->b´Ñ!µ¡×%J_ÂC#ôË Â*€,h"N1"&4‚Œ°ãDrdfÞÒ$8ìY ‚ao¡¤ø½_PPíUKº¤ÆdGÎäŒqB9p˹¡JîKN¶!Lz–Lª!9NäM®dK"eM6OLHŽdI6¥e$Žž¾¸äÅ [f©àU’¤±¥PJàT2Hš%M&ƒÛÜU—>æãRbþ¤FÎOYfåDrQÊ%NFå[R¥Rö$Á¸ñÂ|í"E2&WR])B¥NºaUú¤TRÐêË]B& Jæe¦ôl¦¾ˆD _µ9¥¾˜\½”¾lC2B^ö8¨ÃkBʘ¤1âÞÉ9àfoÍfmÞ¡)ŠÃ˜Ýé1"p‚m*—jÆœ 1¥¾§q>'rÒ¦rZ5§¾è°àPƒéPî¢l§sÆÐoZçrÎ¥V ápš'ãQgz§rífo¦æ igÓ¸&lnà[á¢ráUxâŽ}. wzçt’PÖxžN8rOvâcÒLr®'Ʀv.h_*ZƒŠ§OJçyþ2Ü|^§p•'Lâ ¤â 12â…ú']F'|æÞˆ®'£ëCƒª…ª§pæà¾€h|¢§gU¨Õ¬C ŸyÍj~\!Ì$0•¾HØB:x‚áˆ8|' ‚"À»±¨¾$|‚òù¦g–r©—BçŒQƒ=0ªé–v©¾€©¿Qœ"‘OŽœ:ŸN$²é†é¾èé¾è&Ö™§¹©Ÿîiß@Qo ªöž脺'Οòœ êš^j¦ò ™š©8ÈÞ“:©IR©•b©Xq›íK©bU§=Ωži¢.ªgѤŽi™êj  Z¡ù¤ôÔj¹­*þšJ¥¶©«^i²ÒL®¦j{έöé§úªÍ騶)²N€w^@7lh‹öÖ³Â*yF* þª¨Ö©·*0jkþ±ëŒu+¶Jê¶¶+¡úYZ•æ’ÖŒKAŒ: ëä¬Ó ìÀ )§¶ŒÂfÍþŒ6‚d%F,xù ÃvŽ&b,ÑP—Äxl䈬ÙQÕ!ðü¨Tá̘'ÀÈ"Ó2°VñBª‘§À´ìË2Ö""dÔÄìÊ> k‰DðÅÂmÐ78€&­û ÖÒJÐ:í mH¸Õf­Ön-ÌX-H`-׆­ØŽmÆxí0€-Ù¦­Ú®mÚ ¬ø¨,ÛÆ­ÜÎþ-Á˜-ÚÒ-Þæ-ÕÚ-ÜZÌÀžæMõÉê-áîñ-È,Õ|I$UÕä¿.äFn!îÑb`òK\1)béKjI®ç~. Q.“6¬¾Ä“6 i‚®ê®®‰î°›ˆ]XÕq³ñ!­­Yì’Ø{™ØC²®ïþn÷¸î8¬CxÊÞêÝ(î·íÝÔ©^ÞQäWv"ðN/õRŽëf&¶_n¦/î ŠáêaÌaõ–¯ù¾ëÚÂãlßAš$A¦ŸíZã¦c0—Iöîùæ¯þfÍõÚ ff€r/9]$¿ŽaŽN:`&ßòñKšd2/³7omú®o(¢@a‰"¹êKüòcûŠï,3<'m3×$Í p9KPR£EâåF°ørr<tMÝòËf—®åæcï ´›äÆ 4EŸ” £ð3¨p _*¢ÞhÓÀp:ó Óð½¶0ôâp!W´JÏÓ1Ìà1ÃìñJÏt<)1;1Mç´S±c±Nÿ4W2Pµ 5Q55R/õù*5S?õô:5TOõêJ5ÜÀ4SêñPQ5Wï_‘3ÌÔrL Ÿæ çpW§5ñXõhy¥vmþL#Ÿæ#w®Z×µð°5{úÖÆ˜îð¡îxÙ5`o(×ë(7Y)ç£*[¯¶¤ÕZ~ÉòÙYz¹šbsš£>N+;vîïJ[`öät.ïón¯Ü³Ý ³ó3óö¿ü]ß¡6á©\ë°þìKk³Äq³ô‚¶o£Í<Ã%øÆa^+š5# 4ï%/·<ª 6‹`öFoÿ¶u»M8ÃÏ8Ûï@~p@Â;sà:V«;Âïâ†7=–+´yöu··Öw=û3ò2⦰|Nl:P[òe}#áZ0?ÿ¯Gnò_»·“ñW‡Qãò§©‹iH;ø¿&†ž†öw‡þâNC·&…o „Kt&¸ˆÍE§ð —t¿vt;Bx³Ni•B+«+ª.«¢]«HÏI·øI£õˆ÷xдtÿÀ`µÂÈ´¹ÎØt?±Y!¹“ïO_qJoÍX?¹•gP‚¯QX_9—k^w9˜#Ó—‡9™ëј—9šÇÑ™§9›£ÑšG‘Ó¥V·9óL–ÓÑ–îÕ”5ãF•ãNyzÀ|ùÒ¸µØlL¨ƒ-ð‚,X\Kä\G² Oú ß¹K¸–iëµÆPC”À"èkòõiú5¥—:ÉXú2W(Ãòìê`ƒ1Zeovcã.d¦Åº¦ÁšÏ 5¨óâº2þ­ï®¥±·©›ºhëòñfº¢Évç­¶Äå6ÂöÎm^jáñË ¨Ã0G]1C;íÍO7;²£:5önswk¡v?arg³8Ò`ö Sо`íF·6Csu“;¹g7ÿl÷™­{µ¦·¾„wÓŒwH—wêËhÓ{Îï2ü¿³¿O:| xÓ®¸]Þ÷Œåwöì7Çš ê/D|éð¾°=s @g¼ '{z°vz<0JøCgh¸ñfÉ×M†—›6œ¾lø„÷g“èO´Ìk¼¹wÓy°‰ot›ªx“r«I“tGOëÏ[ëeCæE)Ž¿8¬êø óxÓ×9·þMRÅ9ÂyÚÓ¹’ã´Ç½ÝkL”ûtÝß=ßoÓÓ›Sž÷½à{Ï›¾ágNá¾âOñß»Sà/>ä#~ã£ÄÝŒÛëßœG¾æ—íäÔã7 Ÿ¿ÕYúæ—~ÕvþJ}~;æ„5¼@!Xa<ú[Eºé׾Т¾Q©~“–˜/ô¤¨K$©Û>ñ+Ì`‹òfs÷ŽCòd6î¶:c;Í`|ñW¥G¤¶n‡{]æÙ.oèm¿øŽ»õ—?ÀÚ!>Óópk¯bä‰ë{óñ»¸÷¶ù×?À³oý|÷ïØ®3Å·3@ôÐG A‚F0T¸aC‡!F”8‘bE‹1fÔ¸þ‘cGA†9’dI“'Q¦T¹’¥Hr5†Å”9“fM›ÃjSˆ)Ádû(Å(A E Ž›@\£…cñ"(”¨Q…4¶µÔº•kW¯_Á†;–lY³gÑr|y“mÛ˜9Ž[$5 âÔ% tHgŸg=­ì3 ‹ ^Cû,[gp›Þ¨ñêåéºei1gÖ¼™sgÏŸA‡­u­[Ó4áœ$çÌ3:ŸŽî§A#9jkœ -RýÌA) l¥ó{víÛ‚‹y6ituë×±g×¾{÷²¥O‡OÍð·‘Æw\gÌ{{÷ïáÇ—?Ÿ>KðáM'øíUþ"uåê PÀ ,ÐÀ¤è>üÚÒ¯qxyFê¬Ð 1ÌPà SZÁ›äPÄI,ÑÄôðÚBDÑÅaŒQÆWRqÅ™Z¤QÇyìÑGm¼ñ­¾~,ÒÈ#‘LÒ½ …ÌQÉ'¡ŒRÊ)k„IH‰L ½‹€B¤4j=*É,ÓÌ33còF'E*8. j†‰€Jf:4ñÌSÏ=KRsE6*ª·A{khf0Êš@è4h)øŒTÒI)eÈÏuLÁ"ç289í¨(¬*-ÕÔS©¼”AýÎMwÝ>"i÷Ýxw{ès 2æ›>8ñd’Lø·¨l×â‹1æ\ñ²ÔFœ ‡ØE´ LW‚xò)¡>ô5Èc ™ ’)ƒ(mÆH–˜ *A*N)ÎX衉NÑÊ+YÌÒ‘lÎÀ$‰| -ød–)œ¤ba‰íc馟f9êš!ZG>¤ÈJkut+´Û•‹nÛí·­Ûø´¡ú™ª…6*å>’Y¹©§ ±©7]H5úP ”±c ;¤&îÉþ)¯-¹ó˲±@l¯¾þÂ;©zƒ¸— ÅsìgÏ'ƒnê…ÀaDƒú•…©-³\÷Ýyo s·ô;.¹å’mÎ6Üt›z’^­úM²‘SŽ9ÚŽw šiÈ 1( >ñ¸`éöíÝüóÑ×è÷³DiËŽÔ!ž£1Ó¯ßþûZŸ­Lñïßÿÿ³£?,€4`uhþ t ïކ4µï´àûA  ƒôàÕ§Á .„%4a˜´®…L!j((–÷U¤K_êýZ˜Cºè…<‹›²F ÈÉ'wÚᑸ¡Ê„„¢ãÍ×6r¨DdQŽ‚þT±˜Å-‘ƒÉÛG<5ÅPIN‹e4£|¸ˆ“,â­‰P”E+[áJmViÆû^”‘xÆÎ¬82‹ Ã2ˆ±`%+96k ÏꃷÎIIr'ú‘ ]ìÂ.wÁËdˆ À‘³>Èa :è Éåk_ýR—*9i=‚m’µ´¥h*™¥½ý„ 2ëÍä%˜t\Ƽ Ó·^ެdTsÙÇBÆL°Íòj·´æ51“K…Ø"X“Š- øÅ> Bc؆8ŒRµ«Ó‘†$ÈÖœ5GJí‘lÃæ=ñ md—@¹Ûë<N”ƒÁB¦Ê¦28ƒüM!uKhþUÆh¶|N”¢ö¡-9—ºÜ%/Ÿ#Hè^§ K ÔÀ$¾ÔÑÖ¡Ž ›ëœJûBÏÜU”¦5%É> ²šÖ¼fzÎARŠ¢LˆR ~¤ ÷œI¥¶?}¤e§ô@XÚd]ýóÛÃéèy:©¡~s„JÔ>þqäOõé`˜:}VGÕd¯fÈöºGï…Oã£7ôá¯þvGÄùgˆ¸1âkõˆ5þý ×ËEß0‚­Üª¿üïS9F$@¯ø !PJæ/)R&°1pO.09ðL6°ApJ>0IPIFp"ðoßÈÍþ>ëÜø¯aðrpn$܆à­Qæ­|b°ÅBá§7¬á‚à .Xî† Î°±f0s¼ˆpf©0ƒ)0MˆOŒ"NÏžð !(°|è䎅än%ðÀd̆¼2î¹‰Ž çåú æ°eæäËæÀ0QBçü%Â:©¸ô(é(­n•lŒ! ®¤êÎÇôðUľÎí€ ÉÀd `cíÚ®|þ©·op†îxìî®MÑ$úŽkžñgOoËìò°lò¤ O17"óìÆôB¥¸”‚)œ¢¡J¢ì/õèÌÎX/Ït±=bö8ÐŒÏ/­`Ã0Cø­ø< ÒBÒ”ù8Åùœ±-Bú†gü¬ï(„8„#§Â/½¯ÕʯÁýdýÜͱ#⿊×4Bÿæçýñ  r!·C!ò! K ™¨!²"e/ ‡"-r#»Ã!9ò#³ #Ù$Iò"%²‹Ð"eoÈ Kr!=ò#nP û`µì„_Òç¯Ä:.Š·”ðQrò!wÒþ. [0¢†’!ÏŠÜŽ6î ·Lº¨K ¦ ¬ëW ê*M®XPι¢’åÔk¾–R'Er²ä’6ʱ!࿌. Ítü f–Œ_–Ž-é‰ÃʲϪŸ(î<)œPÌ( óÌ Ó îr;Q0‘‚/û²ÏŠ›\lÿÐ-µO”–ÌjŒ‚¨^ñò:‰,#Óÿ2™üÉOíú81Ceô’¥)^¯4uñ¬Ô2“¸±u@ ®œl.ÍmïôÈÑ6sñ¬tÊ52ñÓ¾/7Ø1ðL†Ôš§“RÍ8Äoɯ[Þ9OQ¶¶ê+T²"ÐÍ;M±®øÃ?âÅ<Ùs+ê þB$'Ûs>Qñ,ˆ>ñ ORò³?ÝÓ>H#ýs@@Uˆ@´>÷3±´A%"&Ëb<Ý’%ËÓAoBÇb&“Ò&»ÓB)®(³åÂ$”Ø Xp!Ž&N(=Të@ô½(ž£˜ NT!.àhÓ [áš²žáÌã¸ÒH©++±Ë*«ôÀÕ@¤¼² ûÀ)ƒ(Øð+‡4½Ô†4{ÔG T° "7B¿ q5ãfÞd€3M; v`¨€Âú€L/ ÑL®“ óKî4}(ó Ó“ôN, ÌQ¨!V€bS'‘kl/óþPëm2»é›5=)3‘3Bûª”–(¢Œe:µ²¦UC³`ÂK5UÝ•oR“Ì|óu\ÉŒ&TÄlRa³ÍT³“jóVÓ 75J7‹“Aõ2GGÀ¨Õ‰¶Oc8‰/Ze )™ÕÛ”“5˜S&yàP4¯:MÀÔŒ(Vm0È•§ÀOÕ²Ó9é‘;å3\³ <ÍC4ÂS2#*”_û5LÇÐ ÒS­>ca×Ó`3ð=ïj_Ó>ñ b9C1¶,5vc‡²c=ö%A6dIrdIö#Möd72eU¶"Y¶e‰a'f{ôei!möfÍrATgÍ3g}V2þe%ƒ–@–!eZ[ôh2ia4A™¶h¿shùSj–jÔj—2jµV¹¶kÁðkÁö Åvl}°lKBB!ÊKn4,ÄÄ%ÍöˆL¶mCBCÇ­&ãMSÊ¢µ(6nWC ‡n;"E“ràTÐmwËo· k{âŒÁ¸žvrSâ¸wqy#Ú0,£Ë‘Ü0»¶«»¾+¼pO"²”J?—Ký­‘Ô+u@»¸Ë»ÀK¼Bé¾hÎ lõrÿ–q1ÂNùTÂN/x¢À,ÁÌìq"îx›îô&4TˆW ŒÁŒÁ fXñ¨NÀ&Sy÷„À1/• Áî팢ÅãþŘÌ"³R õQÄÐW Ô×›î|A1ÇvL!zì{Ãw‡ÀMV?õôfõZá¬!>“ñÐPrCå€ÛRiel"ïlÒæX‡æYy•ž6/‚)W§ç÷p‘âƒOíáqõðÌõx4ƒA܈óÑz(zÓ[­"´±[!ê†{8‡á Q‹â8a8†}÷"â_Ÿ:еéö:¡GxšÌoj¤8‹AX0¶X!ðQýf­ýj­C“Ø…–ø=ÔV"Ò$ÞX# 61méqªßôXpMbû펵͎Ùÿy㯠ú¹–A ¤ºƒÞª3àþL”È!“5y“9¹“=ù“A9”Ey”I¹”Mù”Q9•Uy•Y¹•]Ù“k!^y–i9••j9—Yù.A—}¹“k¡²á—‰¹˜ù˜‘9™•™˜yj  9š¥yš©¹š­ùš±9›µy›¹¹›½ù›Á9œÅyœÉ¹œ©Y¡ ¦ÀœÙ¹Á¹Àåyœ‘€”ažñyš9€AòùŸ: z  º ÿ9ö3¡z¡º¡ú¡!ú4 ªÐ`":£ñà ª  0Z£ª€ @zƒb¡ n!Jz¥Yº¥]ú¥a:¦ez¦iº¦]ZtáN báþl:¢O   Pá§…„ àøÀ¨ob Žn¡ €©©ºª­úª±:«µz«µšP  Â`„  @«ÅÐ †ª Ìú&ö` àŠ«‹¡ fab¡­ùº¯ýú¯;°;¢eaÐ@\!&Lá›A€¬‡ázA°Ø@H«Ùa\Aª »±I»´Mû´Q;µ[D!´§:&d–Zµkâ€Ab¢ T°]¡ Œ`P vûªqd"P``¶™»¹û¹¡›´e` Ð`æ€&ˆá¢£ö`´O` {ª@bbäþ«‘Ø@& ÀÐ`¶£;¾å{¾é»¾3V^{&T!¢ûÖZ&DÁ§{¬g!&.;³­Z ª`f‚ Z¡ Xá£í»Â-üÂ1<ÃcâN  –[&`²Ÿ» VÁf"¬ °  F¸…«÷¼ib ªÀ4üÆq<Çu¼±eÀ Ðà·›±¡; ~Af¢„ü¯³›&F ”હ ɇaX¡ t¡Åw<˵|˹<¦»`È  :;¶á»¹“!Àg"Ê °Gah"Á¯zÅO!&àVẻ<Ïõ|Ïù\"]Á:š¢uÁ ÐÀÈ[~á6€&zá;Tþ& Â;»ª]ဠ@ V¡ úüÓA=ÔE]&¬ £O@ˆáÐÀ¿Ÿpª`\€½®=ý¯Q|ºàLaPÚ†›ª}AÈ ¬€ª@F}Ù™½Ùo´«àæ|æ<¾aÁnábÐçÚ¯EaNº¢Q`°¼ªG¡ TA .»£ÝÀÙá=Þå¹ù £QàÛ‡áÉç»Ê×ú ¬Øú¯O bÀ‚¡£<«7ÀÖÛÅ«ÀÉç=â%~âÛúÌQ:à-|ª d‚ ν­ }» Þ¯ë]ÝžâU~åY¦A :š0|:·OûݯþK½  å}þçž¡•@ã«@2üä“!µ!Öý:¨Qš¼ƒ>ê¥~êÃãË;šÕ1Ü:šÂM› :ßÍÚâ‡à㩾ìÍþçÿ¼£E!å/6^µ¼ ʼ­)ÚÊÏþîñžåù=BþÂiÞîS{:Úþz~¡£e!ïñÆ£}Ú¾£“^µO»®«  ¸žñ9¿ó¹:ýƵޣi;:úÃýÚ ßó]ÿõq|ÅQ:ñqÜí9ž¶eÿ x{ÜÃö}ÿ÷ç`½ dÇÿÞæU[::Ÿöø¥úOÊ £eÇ‘¾¹U¡¢Ù¾¯  £mœþúÉ¿ü{†àêw¼ô7µ¿¬› ¼ tßüíÿþ5{¨“ýû5Üö{¢Jà <ˆ0¡Â… :d8 X•[Z¼ˆ1£Æ;zü2¤È‘$Kš<‰2¥Ê•,/rxlWË™,7ÔE3§CW·ªÐÙ™À!®€=Š4©Ò¥L›:} R€Ô©T«Z½Š5ëÔ?¡BùÐ –S°dËNf!$³l¥v`Ú«—6ÚŠ]Jl8uÛ²½ 5°àÁ„ >üÀ‹&Œ;~ 9²äÉŒ$ Œ ¦Š1{þ :4d0Æ‚=Y3S(¸Œ´jÄ´kÛ¾;÷`þ_`øþ <¸ðáÄ‹?|¶RÞÈ›;F“ÒK4‰N\yRÖØ»×®;¼øñäË›7ÈÜ»úõÂÁMÏ>þúéc¯Çwo”»|ìøÏûÿ`€¢ß~:ןNÈ qôUg{ æ¤_ƒÈM8`†nÈ!€ Z¢oÎôaˆ >¨”uòØR…&~·Y‡2ÎHc´•øâ,²„cŽ¢˜”Š÷Ũ”‹>þ¶£J.Éd“ õx¤„D&e”óQ—b„ë%©’‘Qréd˜bŽéd•Vv&½É H )åj°)â”dÞ‰gžJšIçsižÄgŸÎ¹yœ[Úy”—Gþ©gþ£Ž>ŠX‰`BËo´`2§ Ù!jŽ|ªAwhz¡FŠdtŒ–¤( Ÿ¾š©ŽœBJk­¶&)'Õü–'±’šÜ¬ ®Ùžo84±°Å™ ª"ª*,…¿&÷⪷^‹m¶#Iú…%¿½ðE¦´<ÁK%9¨à[Y|ÂËé®Û®oÎ4q†5#Œ C=œ¡â’k.º0rFlp±Þq†« €1ç¸åžû.»îÂàpÀ":ÁË'/üà-yðb  ±pÌê䬫ïÛï´ÁÊ™Ýw :s¾Eh AQˆXs{Ñj tÐB{$)-D”ƒDÐ’)j„àÝøöÌQ„ðþÕVcí[mDáA~ø–ÇØ`SAÓOG=õÀKyú®ªƒoNC-µÖWg ÃÝl‹¨N*<á- O¬]„Ýkçm2–Aj™ªájàŠ.#ùóL­^Ýs× Cj¤Ry€ƒîóЪ¯Î:F’Âà:0TàÊ0`âŒowðâ/K¤œïÀç½càÛ™â®;ïn/W0µ0`³É&®†ðó0ìÞûïÀiϽ« «`‹oDpü}îÛ;ÜÉ9¥œ)è+_œµ#mk¦`ýo¼ÌÏñïy­+ Y÷º(<ÏØY¦l‘?ßLCg $HA úFj¨Ä«|óþ‰åë$ R<õ©3ø`T¨”o + Vð‚0€ám÷,„086üÔpÜGøP„Q¸\`ö︰…¿Ùa¾>!"šð€T¬â­^ƒ: 9äÆƒC Jh8a# x€Ð™âò`@?xñB™k Ü œ9§Œ¾Ñ£ôrx¾àø‘8@œ‰Ï8?#ºªŽ,Ù\sØ;BrŠV¬¤%ñ„E<öM  Å¬ƒMü ŒÏð(Ié ¤àjMÈTÙΖ6Åuò“›"XÌ4)KO‚ò””(å&g Ê_eªˆË%-WŸGæ¡8ÀåêÇÈ•8²X“éÔ`:þRò’Üìæž¢7ÉÈÑb ˜øDRà@pã^Kç:Û Jp¾ËTÐQ‰3<<2, ôâäÄ–ŒŒvtdND\F<Ôªœ”"$¬RT„ztD:4Œ24äÚÜ|b\ܲ´$ÄšŒœvt¤–”Œ4&$lZ\|jl¼rt¼šœüòôܺ¼ ¤‚tTJLÔ¦”Œnd¼’„Œ><ÌžŒTB<¤BD„´Ž|D2,œ~t|^TôÊÌ´jldJDܪœ¬Z\L:4üÒÔ4.,tZT„j\ì¾¼¬ŠŒœnl¤JL,"ôêì”vldRT\JL”*,œ24ìÞÜ„f\,üúü亼Ԣ¤”rl¼–”ÌšœTF<„ ÄŠŒt^T„jl Ì¢¤lVL´’”<64Ì’”dRL\JDÔª¬ìÖÔ|f\䲤$ÄžœœzlŒ4*$¼z| ¬†|Œrt¼–„œ:4¬NDœfd¬žœœ‚„ôÆÄ”z|t$¤‚„<.,ľ¼,&$ìÚÜĆ„´fdôæä”&$¬VTŒ64ܶ´ÄžŒŒ¼vtüöôܾ¼  Œrd¤FD„´nlÜ®œ¬^\¬ŽŒ¤NLôîì”.,œ64üþüä¾¼Ô¦¤Ìžœ„ ÄŽŒ„nl̦¤´–”Ì–”Ô®¬œ><üÎÌLBD<24dNL\FDD:<$Ô¦œÌž”TBD´Ž„œ~|tZ\„jd,"$”vtTFDt^\lVT|fdœzt4*,¼–ŒD64L><ÿÿþ!ùÍ,ËíþM H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -©A€Ñ£H“*]Ê´©Ó§P£JJµªU4µ«×¯`ÊK¶¬Ù³hÓª]«‰¬BÚÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwhÁ¥Ê›7c®{YqdŽ“G÷-­ZîcO»lÉÝ:sãÓS·ñTDT¦Ú¤‰17FšÝdDµð —·oà®yС“ÆS›Ð®å©!B ®þˆbdB†\L‰J`·4 1r• ¡Óbƒóé×7ïý;øu»ÃW]rËí÷œHGuØýׯvÝ}ÞxåÍ…›Fºy€H0<`Ënr<ÑÆrXWĆ0T —†zè"4ЀHÙY(ˆPB "d¸¶L1[µ<D]´×Ü. $#.CÈUä‘I¶Áb‡:H—'!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”¹¡Œ\ˆÂ§( ˆr_ ˜G—žºf¨ :ÔX£(‹6zÝ.r]_¢TñYf¡eb(]04!W¦›Ê…h}ºÚc}z_¡þušêu‘:ê ¤r1ê¥mXjgamˆ±ê\dÀœ\Œ€G—°  ,ŒØúX²ÚEëæc½,Cz(É'Žrá€H&¢µ‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFºå‚] 4GÈ+]þ¶Wëµ£.œï—;Dà­\º\ªC 0xCižD,W¤ÝðÀ<ÈtàpÊ ç*éî݉eÞበ~ôjEm Ãx` hfÍ7ç|1BÐctÜacpî¸4Ì~ÈÐq-O_f&ÈG ñXÕW¯ˆˆÍ8ÛZéÎ=ÿt™f£m4HÓ ´\M?µþœ Ç ¬'U¸Áˆp´QC0syPrMdr,à‚™¤¡¬-<ö?t÷ƒ²0k‘ #Pf½?ʵC.dú˜è¤»Ð\àƒ~ݰ‡'^ƒ'd4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…xuðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹à„ÇLµL=ãG—W#”Õ¥c“lŽÇÚ°HÍ’1kXŪÓz=hikÙD)—½ŽR“!Ûhú¼m®–(3 JVA®vr-%+»6¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J×Ãí®¿Þî=|`ȃ_rl’WŸŽ‘¡ú.@‡=õåtP–<kMøF¾y‰êa4± Àä@ íä/8ýk#¦±†‚&f$x›~ñ„™øþ@ÇA%"všeDóÞEnô‹2$µ_ ÷åD4ØQaÑÔ¥Ç`1¦vÝ"`Ä Í¾ø*™ïŒ¥TûÎ*{Gí›kRìFô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿ˆ¢`Q†/¥œ[À 9©crþÚÚH%³«/B Î_bpØÝ*¸œ Î ꆈË­F€,Óà8èóþ…ÀdÕ×\ò€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥CÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºËà•æÖ4#»–fKiò þem»˜/Ds–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó6ì"ëmë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínmC.‚eÈІ ¹Eê60zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë• ÔcÊsöñ$¯ïyI­ SËí©U»]JkOU;ñ¨î kyl“×ÕÖZj4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rÖÆr€~!P 0@Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]VzàÔ­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢Š€`ÊÐþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋp žÀ U0b6˜0Xuóocu[d'#C0zá V€¢Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcOþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹SCRO]VzÙÖ‚H¸¬ÇC®‡ˆPYu± ‹h}tØ|~1{®Lž VP‚¿—A¸W[¼uÔT¢€ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†m@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçiØkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhxlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œØžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹…OG™¾8Œ¹·{µ¦š­ÑFpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3itPi2°y¢ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú‘”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-BžÀöD^Ù•Öj½#PkýÖÙ¥~@t]×v}×x×z½×|Ý×~×p"ðׄ]؆}Ø{ÝCqp°Øí,pŽP WÙ˜ €p“Ù M—  g` xð ¡Ú0 7ð¦ð ªp ª=Û+ › NÀ j@Û¼m+à©0J½]Ü"‘^°‘œ0 ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þ ¤Àê½Þgp¥mÞðPô]œÀ ^PßJßü½7p‘Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÍ5žã:N׊Ý×@¾*#0KäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!m¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB_Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIq„õÄáþç×ÃÒz~Aœß/æoŒûûZØ {ƒŽL`!¸É®qƒŒc_xb‚, :Øbù!rÁa¼An"`‘ß=œ µ8Á@Ìœüj™Ë^ÎoXáß6¿9Î`&„/Ò¼fzÐuÞr—¿œåcø‚v˜órÀÌf7ÃYÎ…´š'½ßãz¼À¦lgE³Ùt(r‡§­oºÇD‚–1‰D¡`ñ XÑ‚YLB×´Èï1–,,ã›Î¯¬imëüÖbþ6± f^ø: ÀqµqídϺַ+–ñÙ;B´‹}ìlþ[Û'V„ z0ˆ@AÔÝ^6¸Q0ìb«úÃyų…Aâ!Á`>E~{€„¡X‚ 7œ{àù58˜{à_‰ç—âW8Äòü^¼à8¡õ»aw|qÃæ<ñw¢¸÷Lžñ”{ÜßTž´,>@ P !‰tF÷¹,†;\äû=º¤‡àlÿ2äIG7Ëóõ¥7}å ÞzÓgŽu ó·Ë ÒËnô]ì?gu•õ‹Q âÏ2Ø¿Þó—Wëwﯞ9>q¿kìù<]¾÷M»æ†?±1Y `í Nü~÷\µëÄøÅ0–‹=¨þAîŒG·º§=u•‹žô¦ÏïDA#·BǪg7äõîúÒëXÜ´67ë÷Ž{¥Ÿ{¢Å&AŒËç—÷°O7.¤ÍyTy~Ã[H†,†! F(¢ Åß{*}‚¦Û!íuÞ~÷¿ïq³ØÅÓu¿wísßûu>†(è@dŸÝâ÷3ùÓ»s…`_†æË²ô»¿!؃SK5[µÎS²%³À ÄÀ °‹; ôÀÁã@ Á4Á°¬¾ DÁtA TÁOñ¼¤ÁÁ D_¨¯äÁÌœiÁ7†!$Â"4Â#DÂ$TÂ%dÂ&tÂ'„Â(”Â#d”µA´Á,ÔB‹AK™Á-Ã0ì¯.t”/Ã3C2,3DÃ6¬A5´6tÃ9DA8l9¤Ã<A;ÔôÁ?Ä@d Â)4ÄCDÄDTÄEdÂ*ü0=„ÄäÃ,ÁÃH´D ›D©ÄKäD ËÄÙÄNÅûD ÅQDÅ ´B/ÄÂTtÅ+Å/A¤ÅZœ¯iÁ®öÒÅ]äÅ^ôÅ_L/êÆa$Æb4ÆcDÆdTÆedÆ6 ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_29.gif000066400000000000000000000211141343257752000273410ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÌ¢”$"$ŒjdlfdÄ‚„´bdlRLĺ´´’„T><<2, ôâäŒvtÄ–ŒdND\F<Ôªœ”"$¬RTܲ´D:4Œ24äÚÜ„zt$œvt¤–”Œ4&$|b\ÄšŒÜº¼¼rtlZ\¼šœüòô„j\ ¤‚tTJLÔ¦”Œnd¼’„Œ>4¬ND,&$”z|œfd¬žœôÆÄä¶´t$¤‚„<.,ľ¼ìÚÜĆ„´fdlVLôæä”&$¬VTܶ´Œ64ŒÄžŒÜ¾¼¼vtüöô  Œrd¤FD„´nlÜ®œ¬^\¤NLôîì”.,œ64ä¾¼üþü„nlÔ¦¤„ ÄŽŒÌžœÌ¦¤´–”Ì–”Ô®¬œ><¬ŽŒüÎÌLBD<24dNL\FDD:<$„jdÔ¦œTBD´Ž„œ~|Ìž”tZ\,"$”vtTFDt^\œzt4*,|fd¼–ŒD64L><ÿÿþ!ùË,ËíþK H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -éA€Ñ£H“*]Ê´©Ó§P£JJµªÕ0µ«×¯`ÊK¶¬Ù³hÓª]«€ˆ¬C¤ÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwh¥Ê›7c®{YqdŽ“G÷-­ZîãN¿j¹Ý:sãÓSKét&¤ ‰17šÝ@µ(!—·oà®yĉƒ¦“”Юå©!B… ®Yþ€RDB†\KB`·4 1r‘ ‰Óbƒóé×7ïý;øu»ÃW]rËí÷œHGuØý'ÅvÝ}ÞxåÍ…›Fº•pˆ 0)JSªÔ<F³©´£mž…xuðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹à„ÇLµL=ãG—W#”Õ¥c“lŽÇ¤°HÍ’1kXŪÓz=hi“ÙD)—½ŽR“&Ûhú¼m®–(3 JVA®vr-%+;)¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J·Ãí®¿Þî=|a°ƒ_pl’WŸŽ‘¡ú.‡=õ…qP–<kMøF¾y‰êa2‘ Àà` íä/8ýk#¦±†B&e$x›~é„™øþ@ÇA%"všeDóÞnô 2$µ_ ÷åD;ØQaÑÔ¥Ç`1¦vÝ"`Ä Í¾ø*™ïL¥TûÎ*{Gí›kRìEô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿€¢`A†/¥œ[À 9©crþÚÚH%³«/C Î_bpØÝ*¸œ ÎK#êvˆË­F€,Óà8èóþ…ÀdÕ×\ì€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥ ÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÉà•æÖ4#»–fKiò þem»˜/D³–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–s)ü"ëRë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínRpÃ.`‚dÈІ ¹Ej)0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë ÔÃÊsöñ$¯ïyI SËí©U»]JkOU;ñ¨î kyl“×ÕÖZb4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'r&Æn€~&@ 0@Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]Vw°Ô­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢~€`ÈÀþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋl€   V0b6˜0Xuóocu[d'#C0zÑ Up Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcNþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹#CRNð]VzÙÖ‚H¸¬ÇC®‡‡PYu‘ ‹h}tØ|~1{®L UP‚¿—A¸W[¼uÔT pºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†R@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçi(kˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhxlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œ(žè-é~¤h’d©hC«x­˜›ù%ÑÇta‹uOG™¾8Œ¹·{µ¦š­Ñ,pC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3iqPi2°y ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B öD^Ù•Öj½!PkýÖÙ¥~ t]×v}×x×z½×|Ý×~×` ðׄ]؆}Ø{ÝCm`œ°Øí'`Œ0 XÙ˜ P`‘Ù M—€ fP uà ¡Ú0á 6à¥Ð ¨p ª=Û+ š M° i@Û¼m+àª0I½]Ü"¡^°¡› ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þñ ¢ê½Þf`¥mÞðŽ0ô=›° ^PßIßü½6`Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÍ5žã:N׊Ý×@¾*!JäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!R¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB_Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%I@á9f6³V H&IÊð TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9K¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?؃¨.*Rƒº*V5uK ǸÉ9n6@BO%W9‰Fkd6YQµæ À—PªÕ ¡‰&l" Q…Ú ¼ ŠRh"X}š6ŠRhÁ dkÎ’ðÕRh•«i…YU¯*’©Âf­xêH˜êþ»žìž É%F`†¾zŒ 6ˆDIP‡Âvì “¸IN ±ÆNl °Df5‹,¢²sÄD;T ¢ £ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØNWµˆDvµ»]îv×»ßoxÁë/Ì@¼çEozÑ›³àÔ½ï…ïŸØ; "Ô×¾÷Åo~õ»_þö׿ÿp€¬_<`¾Fp‚¼à`À>0˜eh€Áî¯+vE®¯ƒAl_ÛÂ8{}%\ßã#†14@‹þ9\!cP1†K<âáÄ0Kqˆí+1!YÀEj!ˆúªÀbè…/ꛇЂ)ȃIâ ,ÓÈÇèEæPß#'yÉõ…‚)ôKe+c9Äè…áŠ&?9Êf—½¬a\oÐ2à,g:çÉÄF±ŠEÜâ"aɈĠ@Œú‚y¸Âê{Œd\á É8†–-‹+Ô×ÉÐÀ€QßGGzÒõ¥E$ôËiOƒ:Ä»ˆ„ ²0‹J_:Ó¢–0©ëëø@)ÐôŠ%Œk]óZÙ‡Žpž@!ë`X˜FèE}{!ŒRÛw t&‚+Öl`Þ·}«]_lþ‡Øúýv}ÅbRÔ×E&¶»MîsçW t½‰po`ûÑ@V´‘50 X!‰y&Â*6¼VÔW ï8¾w\îXØ÷âø}ør`-ëü~<ã䮯Äã@qrw<åɈÄË}ß™ß÷Ç/ ò³¯ A€äùN„x‡{ÜÇ8)j^ߢÛ×çùM3¼Á=ïgW=èCßø}×`ˆÄb5ÏzÕ íûÃÂH†+òCAíBßt§?j"Ì" ‚ˆ„,–N„SGzÕD@»ÚÙ^_ €b6^…Ši=w”Áíy€;h‘î[:‘Øiët=ÑÀæ‚1b!Œ`(þÂd¨o c¨ÀÞU¾2Æ]q(ÿaï±8(â02“Þô¨—÷†;üáÃ>»êYïzGÇج8€"¶­ù-7¿Ä7?YÎc¼}îwß¿Ø7™ö½?~òoüùÕ¿þŸ¿cégüå¿_÷s þóÇÿüë?±^Ä×ÿÿ¯©œ¹…5†4ÀDÀTÀdÀtÀ„À”@T†ƒÃ¹Ë¿ ”¿ý“˜ûÓÀô>ŒÁ„1L4Ád0DdÁ|0 Ì> ”Ál?4™þÀôA[@œÀ!$Â"4Â#”À Œ0dÂ\Â&„ÂïÓAô³Á(´HBürÁƒÁ+lÂ,˜-äBôÂÃ0”Á1ô—öúÁ5dCUÉìR¯8”Ã9¤Ã:´Cí¢®<ÔÃ=äÃ>ôÃ?Ä@ÄA$—€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_3.gif000066400000000000000000000323251343257752000272570ustar00rootroot00000000000000GIF89a@¥çŒ‚„LB<ìÂĤBDÄŽŒ„tbd$"$ÔªœlRL¬†|Œjd<2,L\NL´–”´fd ÄžŒôâäŒvtl&$„ztܪœ\F4Ì–”|f\dRTt^T ¤JL„ Ôª¬lVL¬ŠŒŒnd<64T><\JD´’„ìÚÜœ~tä¶´4*$  Œ”rlD6,üÊÌdRL$,&$Ì¢””z|¤‚„”ŽŒLBDôÆÄ„¬Š|<24,¬žœ¼vt¬Z\ôîìœ24œ><䲤Œ´’”|jlŒrt\><Ä¢¤¼šœÌšœäº¼Ü®œüöôÄšŒÔ¦¤üþü„nl¤NLÔ®¬ìÞÜüÎ̤†„\FDD:<Ô¦œ´Ž„œzt ¼–ŒTBD„jdL:<|bddNLtZ\$,"$Ìž””vtTFDL><|fdt^\lVTŒnl4*,D64ÿÿþ!ùµ,@¥þ' H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·p/^@·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#K|Á£#32kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¥°<ƒïßÀƒ N¼¸ñãÈ“+_μ¹óçУC 8õêÁ¯cßν»÷ïàÃþŸ±»£€ÞâÓ«_ϾýsíÓÁÃß>ß½ýûøóc'Ï[¿ÿÿÈ]}ØÕ@ŽG u6èàƒáñgzVhá…ë-(®° àrb(∠JÈÑy$¦¨â}Q aG$ øv2DbG ˆáƒ#œ c P@QF‚„\çH‘¬¡B„”!Æob”Qd7æ¸c2 ©ø˜%!è :`à›#e@!A F"©$“+Æ)g„åHáœxæùœ&H` _à$ l -„n1‹ŒOqÄ=|™Ãp@Æ)„8¢„ ¡F‚‚&zh¢‹©%! ÈAäu`<1ÁþO€á[Âzݤ•^ªç®¼*gâF(ö*ì°¿E¹Šo °,! p!# ¾Ñ—qˆâÛ‘l‰‘Ì!ã³Í’+­©Ùù‡¬èFB-!Öú»4\—­·Äæ+쯫ï¿szB >üh²š ¦_rÀÃÿ9üßÅ_&ëˆ*  k‡Â0LÈǾapÇðÊò›‘¿,Ç<¢#hHp°ÅÉ@ïµè¦‰pf‚8dŒîÍÓG'×¹[-ÏóV{Ï2W¢ËÁlõÖ^AÍš }4º:Ú»·>q‚#4\mƒ2„™ã|ôŒÀe¡þ«®ÂÊ. 8úDÚk·Íõáb}‘Öˆ7î^©Ø1Db× k”¡°‘,ÄaG!¢)¿å ÂØ–Û Ÿ# \‡Ácîrk@Á智ã¼Û§¸EŒ÷.<„*oüñ¾ý^QðÈ7_ñÎG¸ò1/ýõâAýöS?‘õ܇/þøâ{/Ñ>è þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  HÀð€´ŸÆà‘H¤ìŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ A‰þï…0Œ¡óÌðÉð†8Ì!±hêð‡þ@ ¢ˆxø ñˆHLâ}ˆè˜=ð74pA(Bá‚wéaPpƒ¶q‚@ÁràÔSVœ)cQœb-ö°P Aâ’Ñ­ƒE-Ê‘Œ¾éâÃxÇ,n‚ÀaS îHFí¤‘ŠV4#”ÈÈ2±!N ƒU¬"P(ºæ†BÈ$0PôhJÖ$+yÉL~)žÐ&~66ã\‡“ž¬¥o@)JRšr[4pa¬Hœu¾Y¥%1©ITzÈnŒ& ÉH‡ ‘’2Ö i¹"›éJΖºd7l Û¬%:…YÆßt“„øæp´óN]ú Cþ „аÈë˜S›2â’—ì)Í‚^š ±&p$@Kß@Âfèâä@†ÎS9ÔIÕª|cÑßam($¾j´Õ‚“®M-Ó4K\áqö žý$%— …?g2àå|‰ÓpúFo×År[é\hÅr«§|® ì)]êŽ ºº-‚ÓÒÞîr»˜ìîu÷VÜú6î¸I.¼@4À ’m7 0Šñª§ÍTë È_ÿøŽn„#§:RßÁ' °vá'ÊÁ`À…Ië¶ßþþW²¬Ã¬}WÌ+üĈ,ޱŒwZ'`ÝiÆ8Î1]˜ŸºÇÇ:òŒ]L ùÈHÞWûuã$;ùÉJæ1”§Lå9y F®²–·ìŸ+ Ä+ ³˜ÇLæ2›ùÌhN³þš×Ìæ1·°#èK œçLç:ÛùÎxγž÷Ìç>ÏyRæ²  /OB¿ÇQq{¶à†æ\g>P4¤M˜–И&‘¡­×% ¹ŽöMc›3j윀·™NuË–ü²;QšÒêiÁzCMˆPU9¶ŽÏÑ\ÐUûúA›vµs`ž´`ØÕm§®µ#WüúÙ v²Â4¦2•LLdÚœoÇš—±ìF›XÅ #Šn…ýðà{Óœtž`>¤oì§UýiÊ6Íëô`E¾!½& F0reD$Q5Ž7WŽ%xŽÛ60{‡:â†w÷zb(óˆÉh]ðk`‘È42·©à©„߸-â¸K†‡ ™‹Ë³‹Ç±ylwþ‚Ÿ÷0I£—3þ&/bÀŽÀÖwûŽÐp`L„Ô„‹¾1‹Pòz*Y IÐ7XP0P”–†Rù5ÑgŒÔW9&!à'3𓾱ÔøH3y€(ˆ„øß÷”+hÉ!€û—¡`}ÊÁ…„`—¨;H‹Ð„©ÆB–™F°ƒ×)>ðÄáp0Esø^c(—‡•âÑØ‚êA ¬Wˆ™â§™¼ã¤ÐIšX¸sÜøš "°ùš+b˜Àš*iš¸¹›[£›¼ù›,ã›À9œù"œÄyœ-Æ’Õã’ÈÙœ+£Rzôˆ0QÈi臱þ•iÚ)£ù\Êù=ÌYa"h]89R| "¢¶;+&’h1ðLé¡ÐѱùdÝb(ÐyZz´ai¾•êYk—é Š$Y,¨ Û pFްP!ÕQŸäÙ; šlþ¡‚ºÊQ‡ÁÑŸ#ÅK£TJÕ% „°‡´–Ÿ)8’*åY¡ÂQ)(£yhžê¢ú<ÑáL1ú‡¢á)0# ŸŠg’&kb$Jz;ñDq2BnïRsh¢&NJ‰æ"ñ–)ó'Ô”Z"¥»t¤¢H%8¢#<â%G‚‰YFe7Ô–mQJŠï²¦obF  (.Øóž–¨4šþ«i1ø6¦zФ«èQ®è:Øfmž˜¨qT¥Kz†?:%tЍ{:§U‚¦XÂ¥lš¥èö#AÂn‘º©‰‰Šƒg§™˜hoú%q ©£È#uÚ¥¶$¦`ò¨ C©Nʪmj¯Š.±º9¸ê«¿pü9¤5t'ËØŒÏH´r¶2Ò:825Oј€5­ÓJèq}br„€rº2e”­¾Ñ¬Î(#ƒR(£R(¥B®*7›8£Q_rp~„"ãzŒåJêú¬$V$À®w”÷éH’À HP¨'8Ù°Öˆ¾¡è‚¯ G±ÐZ+Ö:s±i ¶„®„À±¡â®§(Ƙ+*WþŒ;qé̸®[)ÕØ¯,‹°ŽX¯7•±·§¯—€ò:²ûš€Ë.Üú±C ²;›%öê³µ´üº´ÐrÉ£¬=$ƒö(/ôrQ/32†Î’óøµõ2yP—Žð¸Eò¨—Z¢tõxÊÂ,c[µk‹/7ŠV‹wzuKŽñȰƱµ)# uÖ Ç&-дÖátÀ!¸þøIÙ.Žû‚k¶Š£Ù·+·}Û·çò·K÷ŽER¹¾!¸A ¢›·Ú×xøh·„°ºÖ·®K˜{·U¸o§·í–up+»äžR–‘ ×qvf…¼×¡XlWsÊÛnx7‘|g¼Æ{‘1þEÄK½1‰.Y½7º1s¼€×‘Ý"Ùë½ g$½Éá3qÀKwnw¾×’"ùLâ[w¾a¿“2™{©u㿃˽Ôë½ìK¿!Ó¿©½å{†àKvüK¾"uƒ¼fÀÓëÀ99ÁûëvuÁ(™¬R;Ù“^Ûµ\+5ŸuiæYs+ìÂ)º–™z6¹Žæúv_‚Â<é“Û;5:|Á,\{ëslw“ÇáÃ*Ä3ŠÃDì½ã¿šNÇÄ@œ)Di””{zX<Ã`«³Ú!²÷§“?Œ˜_¢Ä Çy^œÂYœº¿¡ÆL;ÆP¤Z½Ë·É"Ç<ÜÅHl»,œÃþZÅФ4ÃEµ[7zìz&ÃÞSžìÐ.ìtíÔ®‡ÍîVÏ^íÚÎìÓ¾íÞnÝ~ÞRÛÔ=…‚ýía÷„³À}†£VÜèž™×ÞYÌIŸÍéÓ)Ý€^ m¢ñžîóŽ\õn£xÞâž<ã] ð‘Þÿ~ÜR様Š_âßô-Š‘ø¥Á1ßdÊUÞnû=ª z§ÿÍäÈÚþð`7v´âÍ©ì¯*g²[K!%á¿Aá#ç²n4Ákò ðùu'pŒ-2.‚ c%”õ1ô-.·/nÈj»A¿Ã9¯óÛÍó/v'gg7$ ågXƒåÀqäÑËißLn}…'õ87v?ß3:¬æyååfÜÄaîÆ×1æk,zCl4ŠŒöëMõEv'ÝÌ7Kͳ¬çuSð}nËŠ>PzþÉZ)}ç<ËÖ÷è|ÿkcñM=ñfíê«Þ[÷þF]·é­¾Ô mÔûgÕw4XùSî#‚ëÑqî¬?ë®?ûÕžì¶ßÚ¸Ÿû©½û¼_Ú¾ÿûŸüÂïœÄ_üÈy„Üä~†·þ}ÝÊëÈ/dÊŸïÑÑî7 †¾ð>ýÔï÷X¶‹Ëÿ‚t½Ã1Ýg؆‹ÍþîýAVý™GL,ÀÅ¢ OÝÒ  ïþ>þ3ᨠ 5"ä¨G¤5* <ˆÍBrÐ@‘PFs9 BBQ†Ø‰Ä¡B†!näHRæKBžŒä`Ùð¡š6$!iâ@Hˆ™EEšTéR¦M>…UêTªU­^ÅšUëV®Jg˜VìX²e͆0Cf'G&<‰˜ã $dNÑ$äB !1.HFÄ»‘Ö*„\"Ô„$*åÒµKðуh „ ô¸îÝq!þ¤²a.]MŸFZõjÖ­]¿†ôëYڵŦ• ‚BãˆB8'MHP0ÂeäF™“,'dç0¡H,&Èü|8sîH°ÐTavBÂÊé)ÊÈaұݿ‡_þ|úõ«Î¶¿,n’vŽ#ˆ Ž:ŠŽ€#0ç>C(Hò„(|ø¡°%S €HÀ IÀ !G\a$Q¶³/EWd±E[ÄO?'á!Ýx‹(èþBN9ŸŒë.ÈÉfØK&GÐ!‹Šh2£˜À‡”Üq¥>àˆ„A¾®x±K/¿3L1‘ŠqÆüj$ŒŽ8.Çž8Á¸dþN ZfÒ‹(N iOIjáN„® áHMÞŒsN ÿlŽURM®Dé$ ŠDÈžÆä´SO?µ«2ͬ M ÊX ƒVb!;úÀŒ99*” 92 %®\K ài#;†ˆ‚UWa]”Ô`¡UâèÁ‘V_µR´ÈP·å¶[oA•Ô³Ð|o ¿¬z¢Ø©hÙ!Dû6^yç¥7¾pÅÝO­z™r„”>´Ü7`&xª{ñ‹Ü‚ÿФƒ…†8b‚F-}%Æ8c7¬ŠÇ½˜c‘G&¹ä÷(®Xa“Wf¹e—ŸBa•_¦¹f›KŽß™ƒl6)'gþú¹»-Ü€*¢=|Úª¤;}÷f§ŸŽ*gqw^šçžìÏ^u*"5ªÝªêeé/ J$ém¡f»í¢¤&•jŸÓž ;ä@"k¬{4ªˆBù+±»n”+(ÐÒ‘ À³]·gn3åö!Q$È ŠÐ·ê #š¡¿õÎjð¦œëêgGœÃÈ_‡Zòш UZH'š\éáI"±c„ݸ‹¨ö‚"‰$“PR ÷–;èCÊ~~x t@þ3þöœ\BJ”ºCÙ`˜4’€Z>%§Và¡`§ßfÙeD“-·ÜÌl®Íh’@• B H$ Ì"Bþô÷–M'1‹iLÿ s—úŒ€D ž0·pˆ äŸf"ƒba€eÈ€‚š3Ä(†19ÐdÉ$HÐR{ê·Ã–ÝO?hº!z3ž_™‡xka¡Ã&ÙhxCŒÎtªs’LjMô™u‰'…A„¢k˜A…Ο’Ñ¥Ybix8Gœyìcù’‰‚]ˆ;|Rá°¨G5èA‰Ð„h塘T°r"$ì€HöQzGéÀÖÐHÔýEK‰¤PS¤£ÄØ#U‰1ž)d`Ì‘#â xímQ%Bˆ4“#%‰KÚ›Ø:þÉEÞx1—¿àQ@ 8‚X<£‘C?’$Ÿ›Î–V¹ÍŒµÒ6hR›B'9Ñ)"—ËÁ6×9AÒ$œmŠHßU(4ª“J–Õ:©A>Áƒï'>õ&,fñB$Bj”‰¦¸9Qˆy³T!;Uª¼7-duçÅÝò&¤EeTUÙB‚5,u’ZÉZÖÕ¸ƒdoÿ1éF«˜Î ©Ð t5ÔÀ¬”XkXB&“-$RÔ©û²(mvs]%]­¹*}"ñƒÄý †M{jX¡jÇ;&,db=M "hSh…+½¢ ²¸ÖÕ®›«Y¦zþW¾ö•dyÅ£_;Ø¿’µ¬#lb+1À’e¯‹…ld·ÕX³JÖ²—íeosÖ ­h9ÚAÀŠYÒ¢U³ˆeQJJˆ¯!DmM-ml·yZqötE1È”eµ¤Èsµ€#‰ '[âÒ‘¶¥ /«“¥ÝšŽ$¡]ZW\ê×°‡5Õ@Ž·’ܹä’©ÈEÎ=N®¯$'qu Ó¾æ}z㵜«;_Ø7d`pÁ*VÑ€¸øo„NÊS_š»B%>ð…„0 I ARšq¤o„ñzݲ¢)|¢oЏÉç8ÉYN'!’FëäQŠ%®â†ó©C ·øiöÍ#N-ÉIþ™h@ "©'!$¡PRç5áñ"ýøà¹ØÈ7ƒ1I.Œ#*] Ä?:Žˆ­ÖK]¾5!ÓDfÏ&#JÙË,K2Bð«_þ"ªœ Ű𴗅.t2 ­'B| g{JêÌŽ$„D¿¼g“…9›HUŠÇÑXå`W³š‰­pEÔ U]ªu´±^êH¦òÙÒ#ó³LhJØTÕ*£½t¨YIá;’K«€Ät jVÏ7ÓB²ÙjZ“6ÓµÆuqok^ÛšÔCn¯…=Ø]ÛØ‰-ö±•Ý×dwšh« í#£êeW»5Ívj ÇZ°Éô)¯µv¸Yƒmi“$·…#œõ[Øþ¢{ÚÃw¼·Bîäi¹Z’òL ûYÞº*Ó•wÀçýë”aT»ÞëîC¾K‹P¾)[òÂ^î>ï%—ì™Mp’pÖ¶ë'A™ŸÀE~?y¿ý`Ö|®P‰ n!ß”r<Ò2˜i0!:àЌFŽ#ºTü¼ä Q;ñpBìîçôçÄT4zy8œî¿€G<„ãyÒ³ŸÝëPñs%-”¾ÇR€–´cEŽÆýf˜ìÇmBáô×õþ6‚Ë,dD‡"0Ñýd„$í2Ù¥4})ø? 3Jºe¼•°¤%.ïÝòdê»Îî›ß“›YQzJóºÝÅf ƒþ~·s¦gÉùùÿì ŠÔê)e©·êùò·n槆Q@CAВ‚èZÝJøŽÙU -¬£&„Ð0E`áž­ç# ×2ÑÚpûboú5ž®JV¥Â.™P{û–Ïô©S½j‚õë_ç‡?âu·³ÂZÖÓÃâ¿zïßÿ›¿É±­ÿ#À…é¿DÀx9ÀdÀÉ ÀÙÀÒ™o“ Ï‚6¤É‹Zj@[Àè &ˆ¢ m»-ns-íÛÀxëÀÝ"„¨‘¢:Þr.¤ð­m.w·´¶ tÒÎyÁϱŠ}[­-s”7?;Û)Ž“ÞñàžEéž&1/÷‚þê‰BõRôj/Žcé 9#·’ã¼2“ ÿ @b’ : E¡&a¡3ü/6D ˜#„›94|0Ã|@üù; #’v-’#,:¦¦‹º+BDJz:ì Ä=ü¹>¬¶°“1·#™PC[ª ˆ»ÐFÚÄ?Y;D 2MÄ¢¥Ê;K¶¡ÄX’)ZÁOt"& ’È˱Ä# *˲$‰ÊsÅKüÃÚ<2ë/Z(tR'Ì1,¨³3Ö+Ôs¨{º³³½a<6$ì½ßs¾B>Àø¨Â›3¢œz0—ê¨NZ>–¾X¦JãFeë¾Vìð£ ó«Ç^K?TþSµ~Húx5#ˆµYÈ„| TȆ< †tÈˆÔ ˆ”ÈŠ¼bt%‹ÔH× ÈôH¦èÈÔ°Àm‹6~üH{ÄÈoŠ@ùA¦ðšX·“ 7†tŽŒ…!Pó™ÀÞ½¬Á¼¸A™6š,œðЄdRA£Âm#B¡ôÃÃr,ƒSŠÓ²“ 0 ËŸòy8ñòÑI‰;/æ±Jð!¯ŽC¨ìÆ”¼¨¬,C”ÓCƒ_*¡J¡ ¹K* r!ó/ã•JdË¡tK© D\̺–[‰Ÿ)£t{Ì(R2kÄ©S>Â,Lv”G¼ Çj•­þ\‘ÿ”ŠUWÉ"ЀŒW ]ÕÍš ûCÈzþåÆå×ÿó×å¿{E-­È€5ØóCØOéP—- „ׄ­™…í”Í„h­ÔO‰E2‚­­©pÝÑ0‘Q‡%„Ÿ¬QŽ 6™]Ê0éQ“ýQ•}1–¥Êírž«ä¤#MR® K¯Ü'…R)*õBŠÛˆ€((K±\ 0ˆ„PÈ,mõÂÒE˯äR›µœ…ËaÅS2S4E5…ˆ6M€7Ó9-Û;üKˆh‹6éBPÛòöË9óK™‹[JÛ›•M|¥M?}ÔN T½‰ÌC]"ÇÕ¡ÅT£¿è¢¢ˆLž{ÔEmÊtT©[1Ì\—ÁÄþKUÅ3ÚÔNˆOÍÔNUTdMÀ©I"ÖŦz]c»Ë]"ÃÇÑ­£Â-XêpÕ^eY¥ÕÝÎÖ+]\ ,€Êý"[Ì ]äÅç]1&@¶ŠY¶DãÿSã”É66c>“ã9þ²:¶ã#Ãã<¾Ñ2æc½Ûã?æS?ä  äBVÕ/þ–†5ч¥á¦ˆXDî”CÎ ‹ÀŒ5˜”äÌ"d¬œ|‹Š’mä“ár«š”ÝdnAØOY˜i£!” P– €KeTä§HBµB0\RøJój ²TÚ*MË¥‰Z¯ü_.¡øÚZö”_¹$S’È[´‹Ã¦°Ó¹ \8®f¦»æHuæIîä£< KÜ£h\¦SJ¤à\êðÜÅ|0¥HçæÚpç1þIÁPì]™°ÝNª¥PÍR=Ýš+Š~ÆUùùÝ{î’,gÛt·ßìÍŽš]%Nî…;åhfeïUh1f1Öb¥Îõ]Ö6ûY¨àßfm_N$éëì““& jíh0IA (àxG‰X`pMÏž¦aÆiGê)™°àœöi™H×™öèqV ¶† ñËŠHVjÑAõ£×ª¾ãŽ¡®Ž ƒÄaÕðêÒê9¢ä²¶a¦Fk\;ëós„^P–$ ëº¶ë»Æë¼Öë½æë¾öë¿ìÀìÁ&ìÂ6ìÃFìÁ¾HìÆvìdžìÈ–ìɦlÈ–ëÌÖìÍæìÎöìÏíþÐíÑ&íÒ6íÓîjpÔfíÖví×†íØ–íÙÎl-áÛÆíÜÖíÝæíÞ‹*`6¨ß&îâ6îãFîäVîåfîævîç0xîê¶îëÆîìÖîíæîî–M@„Aï&ïò6ïóFïôVoóŽ/`,ð‚Xïù¦ïú¶ïûÆïû–=„@ÐIÈïð'ð7𲪄J‹.Pðwð‡ð—pòöoŸ„ý„ ×ð çð÷ðÃb„x„°x„`„GñWñŸpo±`ñ§ñ·ñò¦H‚±H €ò ò!çí(„áþíB(þ"gò&wò'· Aˆ€²ˆ€)€ò+Çò,·ñ30€Jøƒ/óJ0€KÐò27ó3ð%„5OB(„XsAX4§ó:·süþéþ‚;çó>÷óòÎsØó?'ôB7tåôA?ôEgôF/ÜDwôH—ôI—H§ôKÇtJ·ôLçôN/ôM÷ôPu4õQ7õSwòRGõUgõWõV‡õXïðW—õZ·õ§õ[×õ]·ï\çõ_v@×ó`'öbvA7öd_ï0fwög‡öh—öi§öj·ökÇöl×ömçvhO °€Dèöq'÷r7÷sG÷j'e7pˆ„V€÷x—÷yþ§÷z·÷{Ç÷|×÷}ç÷~÷÷ø€ø'ø‚7ø?`÷7V`‚‡‡øˆ—ø‰§øŠ·ø‹ÇøŒ×øçøŽ÷ø×xù‘'ù’7ù“‡ø„_xox”wù—‡ù˜—yù™·ù›Çy&Pù•ð–ÏùŸzŽMP‚F€xKp…PWøˆÏSˆ.€xø$ÐDp'¨MH‚‡ç-H‚7‚0`{Ÿø¬ø´_{®7ûÂ/ü{ü&{Ãg|™¿z&È.xx%8„ˆ%xx.ÈŠ|þ«÷|§—|&xƒÐMø€7xø7ˆ(x{‘çƒ €øFˆ„ÍoüÚyÄO|û^|Ûç}’G{'8€¾§ûˆO‚HxxWhE°‰ï|¿w~Lþ¾Zh„F …WxøC ~ëy)PLxx-…Þ'ßûÜ×}‡/ÿõïøK°úå‡x¨ùU âÅ"ºBIF'üq‹ ˆQÆåÑ[HEñÁCŽMDRšÐáZÉDÅÞ€5¥s…–hÒ\ í¤Èÿ” ± Êg è—&0àÈ&0hBóZ0„¤KŽf£¢äЉûëßÿÈ@BP “©ßýÒHžÅQÅ c)Ld|2@&|‚¤ˆ*℆myˆ„­’ŠÔñŽkÀÛ*’ œþ±2—±ÈòˆL¤( ± ý$È8Rk Œ½R˜K>’”EÉ£Qø¸$ÀÂÈ!%ýʯ•LØ#EÎ45òr5lÌ`ãæ‘ÊQû‰Â"Â`n´€B{9·© ÈüÈè  Œ¨‚MëXWhÉgB“‘fA‹ZÂ6@q’3š[ §'ر§­³0ë, –¹JèÍê 'é©Ïù•­—EÍ/G¿µ¢O1Ä& ‚O#q¨Ã01€8JÓnµ¢;sY1¯‘¡ßE3ºQÍpÆ3¯t$J1ªQKv¤Œ¬(N«6XbÆ2E‘(dˆ K¨âþx=}¤BÔ‹® }jò7`ÆQèûH&¦K¼á£L`-¸ú…üq§|ƒZQ«R„­#ÛjW7¹6’ÉsnÕi'vxÖ´bG;Eì¢^ È×éÜõ:Ô+"N“ÊDëì:QXÅ*ÕÀT„àbw¨ØÈ¾a¬$JäÜÕÑÞ$¡O“"4Cb”\˜Å"4à UØA†ˆ @±ÄŠ@v¨#jƒ;²Ö¾6¶»]í(¢[ÈänwMëíoY!¡©å@Ûë t+ïMï;]n]««¼m×Aß“-mm{XLpB¼×•&&f[ÛÛBägN%-~s¢¶Ð4Œ-ã´0îˆ>!…©aªdÂ)ú‘©gkIp²6Ö1Ñæ·Â{™lÁD“‰?Í-%ð®Gjt£32¤Æ’…SÌ+©*jG‰:1]„$ËÈc*¾ñ~i¬ã£ñÆ>^IŽy,dÛøÇò“L1 9ÅHV2”õUä&“Öóº2–³¬å-s¹Ë‡b2•óK?¹Ìf>3šÓ¬æ5³¹Ín~3œã,ç9Ó¹Îv¾3žó¬ç:{ Ì~þ3 -èAºÐ†>4¢­èE3ºÑŽ~4¤#-éISºÒ–¾4¦3­éMsºÓžþ4¨K;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_30.gif000066400000000000000000000207011343257752000273320ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÄ¢¤$"$lfdŒjdÄ‚„lRL´bd´’„ĺ´T><<2, ôâä\NLÄ–ŒŒvt\F<Ô¦”„zt”"$¤–”äÚܬRT|b\D:4Œ24ܲ´$¤‚tŒ4&$lZ\¼šœÄšŒœvtÔªœ|jlŒnd¼rtüòôܺ¼ TJL¼’„Œ>4,&$ìÚÜĆ„´fdôæä”&$¬VTŒ64ܶ´Œ¼žœÄžŒ¼vtüöôܾ¼  ¤FD„´nl¬^\Ü®œ¤NLôîìÔ¦¤”.,œ64üþü„ ÄŽŒÌžœ„nl´–”Ì–”Ô®¬œ><¬ŽŒüÎÌLBD<24\FDÔ¦œD:<$ŒnlTBD´Ž„Ìž”œ~|dNLtZ\„jd,"$TFDt^\lVT”vt|fd4*,œzt¼–ŒD64L><ÿÿþ!ùÓ,Ëíþ[ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -‰A€Ñ£H“*]Ê´©Ó§P£JJµªU@9µ«×¯`ÊK¶¬Ù³hÓª]«€†¬G®ÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwhR§Ê›7c®{YqdŽ“G÷-­ZîcSÊÉÝ:sãÓS_1•U(*®°a1—›ÝgPÁè —·oà®{àÁÃÆÔ•Ð®å*!Â%®—þ šTB†ÜO&¡J`·ô2r¡ÁÙóé×7ïý;øu»ÃW]rËí÷œHGuØýwÅvÝ}ÞxåÍ…›FºuÐ øÐHÙY(×tÒI#g¸ *$1Ûº¬¡ ]´×Ü0 8#×#(qÈUä‘I^Áb‡:H—)!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”½\f Â'*  rß!˜G—žºf¨ 9ÔX#*‹6zÝ0r©ß¨TñYf¡…b(]@!W¦›Ê…è}ºÚc}z_¡þušêu‘:ê ¤r1ê¥WXjgaW±ê\gÀœ\“€G—°  ¬“ØúX²ÚEëæcÁDƒG}(É'ŽrÝÐH(¢]‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFºù‚‚] @1È+]þ¶Wëµ£.œï—?Dà­\¼\š ˜rAi¦D,W¤ÝðÀ<ÈtàpÊ ç*éî݉eæaŠ ôŠW<óxb hfÍ7ç|1BÐãxäaãpî¸4ÌÈб.O_fÆ%ÈÁGñXÕW¯ØˆÍ8ÛZéÎ=ÿt™f£m4Hû ´\M?µþœ Ç ¬)U¼1 s\AÃ1su@rP„r,à‚¡°¡l0<ö˜DtG„²03áË$Pf½?Êõƒ/dú˜è¤Ð\àƒ~ݰ‡'Nƒ)g4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…x¥ðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹à¥„ÇLµL=ãG—W#”Õ¥c“lŽÇ®°HÍ’1kXŪÓz=hi»ÙD)—½ŽR“(Ûhú¼m®–(3 JVA®vr-%+»+¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J·Ãí®¿Þî=|b؃_p l’WŸŽ‘¡úT€‡=õ%xP–<kMøF¾y‰êaê Àà€ íä/8ýk#¦±†9BÃi$x›~1…™øþ@ÇA%"všeDóÞnô 4$µ_ ÷åD>ØQaÑÔ¥Ç`1¦vÝ"`È Í¾ø*™ïL¥TûÎ*{Gí›kRì—Iô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿ ¢`†/¥œ[À 9©crþÚÚH%³«/G Î_XpØÝ*¸œ ÎËêֈ˭F€,Óà8èóþ…ÀdÕ×\ö€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥ÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÑà•æÖ4#»–fKiò þem»˜/Dó–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó+ #ëWë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínWCT€‚hÈІ ¹Eê+0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–ËU Ô³Êsöñ$¯ïyI SËí©U»]JkOU;ñ¨î kyl“×ÕÖZ‚4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rvÆr€~(  @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V}ðÔ­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢‘€`ÐþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋsà ¦ U0b6˜0Xuóocu[d'#C0za Xð¨Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊckþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹CRk]VzÙÖ‚H¸¬ÇC®‡PYu ‹h}tØ|~1{®L¦p XP‚¿—A¸W[¼uÔT¨pºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†W@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçixkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh¨lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œxžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹uOG™¾8Œ¹·{µ¦š­KpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3ixPi2°y¨ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9ÚÁ”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B¦ðöD^Ù•Öj½"PkýÖÙ¥~ t]×v}×x×z½×|Ý×~×`)ðׄ]؆}Ø{½Cq`¤°Øí/`•° ZÙ˜  `šÙ MŸà jÐ zP ¡Ú0A 6` ­0 ®ð ª=Û+ ¢ Q0 t@Û¼m.à°0MÀ½]Ü"1^à1£ ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]ÞQ «ê½Þj`¥mÞð–@ôM£0 ^PßMßü½6`˜Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿý5žã:N׊Ý×@¾*" NäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!W¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB?Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI"À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%IPá9f6³VH&IÒ‚!TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9[¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?¦„¨.*Rƒº*V5uK ǸÉ9n6BO%W9‰Fkd6YQµF ØÁŸPªÕ0!Š(Œ‚Q…𠼋Vˆ‚X}ÚF‘ŠVLÁ dkΚðÕVh•«i…YU¯*’©Âf³xêH˜jþ »ž¬¥ É'H †¾zŒ6ÐDI ‡Âvì ›¸I^ ±ÆNÌ —ðDf5ÛP¢²³„DkW¸"£ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN—º#)B ´»]îv×»ßoxµë/Ì@¼çE/zÁ»@àÔ½ïÕS Ø €Ô×¾÷Åo~õ»_þöw¿ôõo€ñ› ù¶®½Fð`/Ø¿žo}™ƒi€ÀÁ ^0†Lßbèà¾a(Æ€Œ[Ø÷Ȱ†ë a§¸¾hF#.ì`þ Ï8‘8D}‰ ˆØh°¯-œáâü²øt±} A†úÞb ¾ÀC1 Qß8ƒ  †ˆ™#á ,3É;¸E3„‡,hy9M~r”§¼?,ºÈ€i €€ÎæC.ìÛ>yÀ>2‘aŒ„úf!š€”Q_TØÂwCí \ÜAÒ±ˆ` IúЉ^ôV;Ü! Þq$ø0é[¼Á;àÄnáçû9tHÎ*4Q_dXx[F}…Á KOú¾@„±wðZàý®/°ëËìúÒÃÎ ´±‰‹ô"Ë´¶¯­-‡k0ƒ ¶¨o·¼ƒDþoE§E\bI“¡ÇǾ¯ºÏ¼{×7 .„3œ‘ãû‡@…¾¬âˆ[qä®ïP1åìZ¿·@*äaSßö­x~=níjëÚÎÍþr,ð I3ÜᇃøŠ³ÌŒhÐÂtHF}¥`óŒ×W(ÿò¥?Íéüܾ4·9ÎëÛŒ^”úÔ;2н[ð8èw9 oMk.8ÌÌ@Æ$"äðàdpÆ Z8̨ÀCÖîv°‹ìm~sœw0P××!fxŠõ´b­›á4F|â¿ß—É‹‡|äßøÀ=^ò—Ç|€)ï7ËgÞóŸ'|„A?zÏo¼~o‚€oêÝ+ Þ•Æ€}ìe?{Ú×Þö·Ç}îu¿{Ø¿¡¢'}ð#oz½u^øÇw0ñïf|ä7_ó…øá?ý"CæÒ§~ön}Çc_ûÓW¾ÝP¯zò”õ­s=ïÕ¿~ö·÷¾þ÷å¿ýøÏ_ûáŸóíï|üËMÿûG¾þ{›ÿ@á@·!À$½\›ö*¿ôî œìJ¯ ´À ÄÀ „õº®ôÀÁÁ$Á4Át—€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_31.gif000066400000000000000000000206571343257752000273450ustar00rootroot00000000000000GIF89aËí甆„LB<ŒBDìÂÄlÄ¢¤$"$lfdŒjdÄ‚„lRL´bdĺ´´’„T><<2, ôâä\NLŒvtÄ–ŒÔ¦”„zt”"$D:4\F<¬RTäÚÜ|b\Œ24ܲ´$œvt¤–”ŒlZ\ÄšŒÔªœ|jlܺ¼4&$¼rtüòô ¤‚tŒnd¼šœŒ>4ÌšœdRTt^T Ì¢”lVL´’”<64Ì’”\JDìÖÔ$œzlŒÔª¬4*$¼z| Œrtœ:<¼–„D6,¤~tüÊ̼jddRL´^T¬ŠŒ¬ND,&$”z|œfd¬žœ”ŽŒtjl¬†|ôÆÄ䶴̦¤t$ìÞÜ„jlìÚÜĆ„´fdôæä”&$¬VTŒ64ܶ´ŒÄžŒÜ¾¼¼vtüöô  Œrd¤FD„´nl¬^\Ü®œ¤NLôîìÔ¦¤”.,œ64ä¾¼üþü„ ÄŽŒÌžœ´–”Ì–”Ô®¬œ><üÎÌ¬ŽŒLBD<24Ô¦œD:<\FD|bd$TBD´Ž„L:<œ~|Ìž”dNLtZ\,"$”vt|fd„jdTFDL>ø …ÙY(—ZXb‰f¸ÖŒ '1›´@q„ ]´×Ü/ ,#W.aÈUä‘IZÁb‡:H(!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”±ÁŒ\eˆÂ§( ˆrŸ ˜G—žºf¨ 8ÔX£(‹6zÝ/rŸ¢ñYf¡ib(]8!W¦›Ê…¨}ºÚc}z_¡þušêu‘:ê ¤r1ê¥VXjgaV±ê\fÀœ\€G—°  ìØúX²ÚEëæc»4#w(É'ŽrÕ …&¢Y‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFºåb‚]8цÈ+]þ¶Wëµ£.œï—)JSªÔ<F³©´£mž…xuðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àu„ÇLµL=ãG—W#”Õ¥c“lŽÇ¬°HÍ’1kXŪÓz=hi³ÙD)—½ŽR“&Ûhú¼m®–(3 JVA®vr-%+;+¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\JÃí®¿Þî=|c°ƒ_n0l’WŸŽ‘¡úN ‡=õ¥rP–<kMøF¾y‰êa6Ñ ÀÜ€ íä/8ýk#¦±†ÑÁ&ó‚c$x›~…™øþ@ÇA%"všeDóÞEnô 3$µ_ ÷åD>ØQaÑÔ¥Ç`1¦vÝ"`È Í¾ø*™ï ¥TûÎ*{Gí›kRì—Fô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿ˆ¢`a†/¥œ[À 9©crþÚÚH%³«/: Î_^pØÝ*¸œ ΋ꦅË­F€,Óà8èóþ…ÀdÕ×\ì€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥à ÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÍà•æÖ4#»–fKiò þem»˜/D³–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–s+ü"ëVë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínV€ƒN`‚fÈІ ¹Ej+0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë• ÔƒÊsöñ$¯ïyIÍ SËí©U»]JkOU;ñ¨î kyl“×ÕÖZr4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rfÆp€~&@ @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]VwÀÔ­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢~€`ÌàþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋm  p E0b6˜0Xuóocu[d'#C0z W ¢Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcPþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹CCRP]VzÙÖ‚H¸¬ÇC®‡ZPYuÑ ‹h}tØ|~1{®L P WP‚¿—A¸W[¼uÔT¢Pºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†V@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçihkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhxlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œhžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹UOG™¾8Œ¹·{µ¦š­ÑXpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3irPi6°y¢ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú¡”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B öD^Ù•Öj½"PkýÖÙ¥~ 0t]×v}×x×z½×|Ý×~×@!ðׄ]؆}Ø{ÍCn@ž°Øí)@P [Ù˜ @@”Ù M™ i€ tð ¡Ú0á 4 ¨Ð © ª=Û+! œ OÐ o@Û¼m,à«0K°½]Ü"^À0 ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þñ ¥ê½Þi@¥mÞð@ôMÐ ^PßKßü½4@’Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿí5žã:N׊Ý×@¾*" LäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!V¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôBÑ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI!À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%IDá9f6³VH&IЂ TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9Q¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô? Øƒ¨.*Rƒº*V5uK ǸÉ9.4PBO%W9‰Fkd4YQµæ Ä!™PªÕ$Á‰'tâ Q… ¼° TpbX}Z:1 TDÁ dkΖðUTh•«i…YU¯*’©Âf­xêH˜ þ »žìŸ I&H†¾zL4 DI@‡Âvì •¸IR ±ÆN¬ ‘ÀDf5»8¢²ƒDD[…T¤Â £ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN—º#!B ´»]îv×»ßoxµë/Ä@¼çEozѺ@àÔ½ïõ{°úÖ×¾÷Åo~õ‹ßùî׿ÿ°~ùùØÀîï¼à ¸À;(.Ø@9È Þ+ŽÑ‚ã õMðB¬à‹xÁ#vðéÚK_[ˆáx@fÁàþÐb§8hñú†¸Ä.ñý‹b«¸¿d(D~a±ˆ\ÈIÞÁ’›üdúNö%ÆDÌœÿdЂ+è+e'CX¦‰ïÛ_<”€´(è ƒe¾Øòrê›âЭxÇ0†~pß94ƒ˜2è[èC'š¾;¶ïDÑcû@”(Ä"f¼F#ZÑ"–E(½fú£YÈB3ˆA_QÄYè÷\ä>÷·ÄðØ€ ( ƒÇ;@/èëkú»Çƒ®ïúëãSÐ÷dö¯-bC€ØOôeƒ˜3Ìúòb¢ñ}ùl9?×®˜À1è›D.þï€ÝzÞ¤ë+iY«yÔï^6,ÂMjw#ûÙô=„.äÀVÔ»Á´&÷ Ðú€øu8~­Œe-ÛÛâý8¿ ®ælÓ×Ü6÷&mñƒ?x|@,(‘uï`ÍpÞ` ú¾<æ3§o)€cÿšÚ¾xÍa.sšߦFµª«s‘?è%7òœN†\$ƒc†0á‡3`]ë\¯ïzÁa[|xÑrXv¥½¾õ®]í;ø›áŒì$€ ˸0§Ñ>ëcØï¼Ç­¸rÞð‡ÇðàWxÄ7ÞñûU<áÿxÊS>ò›|å5øËûmð=|['ªÃô§G}êU¿zÖ·Þõ¯‡}ìO „^È›Ç}âk¿øÛçÞ÷îüÞ2ÿ{â8øz~ñ•Ÿßãß-ùˇ>}›o·çGùÓŸÛçC¿}ƒŽ¾ô²øÅ?þØÓ¾ïÖG¿ôw/ùÞ§ŸøØ—[õÝï{ø¿MþóÇ}ýÝvük^ÿkã¿þ³¼õÃ<î3@gjìR¯dÀt@¼®”À ¤À ´À ÄÀ ÔÀ t—€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_32.gif000066400000000000000000001242751343257752000273470ustar00rootroot00000000000000GIF89aàè甂„lŒB>ÜÂÄlfd<.,ÌŽŒl"$œfd<Ä¢¤”BDÄ‚„TF@Ô¦”ôâäŒ"$„f\t䲤œvtŒrdìÒÔd.,Œ2.lRL”RT´’„$¤’ܶ´  D:4dRM„¤‚tôÂÄ,&$„j^Ü®œœ24Ìž´bddJD¼rtŒRL¼šœ„¤BD„l64,”rklZ\¤ŠŒ”ja<&$\NLüòôŒ.,亼üÒÔ¬RTŒJDäÊÌ<64´Š|\F?ܪœT><Œ:4Ä–ŒLB<Ì¢”´jl „"Ț¤$"$œ~täÚܼ’„ôÊÌŒjd¤JL|^Tt |b\$L:4ŒÔ®¬œ:<Ôžœ¼z|„ ””z|tZX¬Š|¬Z\ÄŠŒ\>< œ‚€|ŒF@ìÂÄD2,Ì’”œjl”LLôíì”#$”bXlä¶´œz|„zt”24¬žœ ¬†|ĺ´„.)T*,”^TôÞÜüþü¬bdœ.,ôº¼|L4d\64Ä›ŒÜ¾¼ŒZT„*$Ô¢¤ì®¬4&$¼jdÔ¦¤¬NKÜ®¬äÃÄÔŠŒTJLŒut´””¤…„üÆÄ„mlÌ›œ¼bdŒ”vt”+,ì¾¼ìÎÌ\JLìÝÜüÍ̤><Ä~|Œ ¬‹Œ´^\tÄžœD62œ^\tDœBD,\¤~tì¶´<2,ÔªœœzmŒ64lVL¤–”ܺ¼dVT„dNE,"”vl”ndŒNG´Ž\JDTB<Œ>7„&$¼–ˆ|f_$L>6Ô²´t^T\BD”f\ľ¼4*&¼nlÔª¬Ü²´”†„l&$Ć„ôæäŒ&$ìÖÔôÆÄœ64´fd¼vt„¤FD„¤ŽŒüöôä¾¼¬VTäÎÌ´nläÞÜŒnd¤NLŒœ><¼~|„ ¬^\ÄŽŒ |Ì–”œnlÿÿþ!ùÿ,àèþ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàÃþ‹O¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0ÆèÓKÔhã8æ¨ãŽ<öèã@)äD ˆŒH&©ä’L6éä“PF)efKXáÅ•Xf©å–\véå—`†)æ˜d–if™3åšl¶éæ›pÆ)çœtÖ™Ð^T çž|öé矀*è „j衈&Šhšv6êè£F*餔Vj©sx*ª) lêé§ &Ú©¢Œ^jꩨ¦ªêª¬¶êê«þTeê¡£Îú'¸p4ŽÌšk®¶öY«§¥Âjì±È&«ì²Ì6ë,œ²;è°Òê9j +“¯ÕÞj±Ï†+î¸ä–kî¹è¦û¬)œ!OÌôRÁ2óì9Ï2¤Œ`…žÞƒ¯góoí¯£ o|ÊÊ÷ɾû [?=ÐÕë½µÙ«Àö&;Þð€L ÈÀÆIVû€ßž€é©ãS€ ¡ûÂÓJ²ðCtQ¸àÑMOÊ0@€Uª…Ø ©5Á ^0ƒþ{Ò!®¬åÁK„E !ÈÄ&:ñ‰PŒ¢§hYuA}{ê€|a%è©~|ºâÇôgBô‘ñˆ˜›Â5Z¨§é óx@ 0¬¨ñ‹XÜ_·ØÅä‘côßõÐØ½3ò©VI£¢"ÉÈF:ò‘Œ$hªf€g¤  Ò` þP_CbÔ Ûç*yÉL&Œmãëü¼¸¥nuJ¬€4ª`Ç5Æ­VL% ç ÁyaT³¬¥ž¬fILêQ“œôäBé¹a’Ò˜§Lå*[‰ººÝ-–±“¤6·ÉÍnzó›à g¬ò”¯ D£5ðE˜‚=qù†B`Á˜êþLÁB°Œ rÁ £ÕZð°d6èB7'·„åÊzÓÓºï*¡ -Á¿î™Î÷)Œîd†¾æYOŽæsg~à§?·ô ‡\¢8gJÓšÚô¦8Í©N­jñ°[@ jLšÈõ¨HMªR—ÊTgõTZ?ªT}Ô¢6õªXͪV·ÊÕ®¢è©ÁŠêTÇú­ªЫhM«Z×ÊÖ¶º•=`%«\çJ×@Yõ­xÍ«^÷Ê×¾úõ4DèB1KØÂö°ˆM¬bËØÆ:ö±¬d# oüõ²˜Í¬f7ËÙξEð ­hGKÚÒšö´¨M­jWËÚÖ–¶žþ­lgKÛÚÚö¶/‰k]wËÛ±Þ·À ®p‡KÜâòU·½M®rmõ[ã:÷¹Ð®t§ûHä.÷ºØ]ÔY©ËÝîz÷»à ¯Ò¬›Ýòš÷cÛ¯z×ËÞöº÷½o"ïyç[ÞæÂ÷¾øÍ¯~÷Ë_É—¾V®}ûKàøÀN°vzJ2“¡ÌZ\°B§Ž° ?\C £ÒÇ<àƒjÀ ±ˆGLâ›5=Uã—·#©Uäçáo Ä'αŽwÌãûØ.º5ŸµÔ'VVaTé³±’I•Þ;ùÉP޲”§Ü”žÆp†CLÂ~Ȱ¦p…K3¡pLå2›ùÌhN³þš'ÒS8Ê‘Žû+²ÿêxG1ÛùVM^³ž÷Ìç>û¹Ç=½F/ñËý½8Æz fïÌhkåùÏŽ´¤'Miïöt¢@@ùt#„Àg¸¨BÚèF“¹Ò¨NµªWÍj¶þPU^©g}ÈG·úָε®w=ÓWó©+°›ÙhMëSóúØÈN¶²—];_»Ó ~0̈=kc3ûÚØÎ¶¶·Í*gSû۵涸ÇMîr›ÛNÞ7¸­}îv»ûÝðŽ÷„Ò­nj³[ÞøÎ·¾÷Ío÷лÞŶu¿Nð‚üàÔù7ÀK}o„;üá¸ÄK£ð…3ºáϸÆ7Îñަâ·3Æþ=Nò’›üä(ß ÈCæ‘§üå0¹Ìgn“•³\É.§¹ÎwÎóžû<"=ź?ÌC¡”h%À^¦² 7ehðÉGa cgL¿ù‡þó®{ýë`ÿyÐ]G 'Ýo ³ÜŒ'·v=©¸q«À¡WÀ‹Q¥}ØZ¿1×ÃÎ÷¾ûýïz{€Ásï~²Nòžï'!wÏÈ£B|Þ?•sÀ[þò˜Ïü±ƒ>Ô¸ ÑË7„á—qxeŽ0h£úü䉵wÍ»þõ°=ª9ßи‰ñOÂÜSîÝH'5YB8„DX„Fx„EXY?¸„LØ„NØ( åZR8…TX…Vx…«[O¸…\Ø…^#7ˆƒ»¥ƒ_X†fx†hÈa(†tE†iø†p‡r( 'V§3VÔ †Ô°n08‡€ˆ‚8ˆÕQ‡‚b‡þÕÒ ¬d(Ïà@p„‰’8‰”ˆ) xc‡˜‰µ·) ‡‡6ðmnX‰¤XЦxŠ–aˆv¥‰Ç”(^pˆ2Ù‰¨X‹¶x‹¸¸é–va×â24R÷` ÃA†ˆ|"y4(Ïp=Ä6йÒ8Ô8é66ÁfvW9¢ãv‹wØÔ:d(û „2@öö‡Õ¸ŽìØŽîxéÐy­„?<äx„4d‰Ò æ8(èøŒêøŽ9Y=‘n§w©'A@SzY–Z–(òàE‡ò ²™‘¹‘‰ñ8À7T¼gä׊ƒâõr(²(ŠÙ‘.ù’0þ“ ‘nÀ€Jn³Ø7ÒGh£²ˆzâ“wX(Øyˆ´'²Šé(“J¹”LÙ”‘nöiWW~ø7î§iÃÄRg£•Èè'ŠHME7øˆÕÖ’Ny–h™–¦¸†¼E q°‡}È’j9—tY—¸È–lHVÐh—|Ù—~¹‚Ñ’ZcˆZ.¸—y˜ˆ™˜ˆ—y9U†©˜™’9|ŒÙ˜Bõ˜“™™š¹™`W™–ITfÉ™¢9š¤Ùužù™>š¥¹š¬Ùš%wš¨Vªéš´Y›¶Yp°É\m鉄‡c8›·œÂ9œå–›”g’Rõ•Œèˆu…™ÄùœÐ³w‰Ý‚ŒÉ)´b+Cþù‰H9WÎ)àžâyfxi·Š†Ò•…òб8‹z œãŸò9ŸR•½8•K'0?3Œ)SŒ;tŒ@ƒR=£D?“Ÿý((ʈ(ÍØœðIŸú *b4 ct·iÓ{òv,V’âxK¤ó6±4,w‡(åˆ(ÿ(Wß¡*º¢,jiÔY(rVG¶>õ(kQ…ç êP†ÔPÃ"y‡Â&Ê=ÞÙ -z¤Hš¤Ñ…´Ä'¹i›[ ID~âz‡2‘ z‘(j¤J¦b:¦²•n1:£É³ŒÃ2’RŽ<*H3+Цiº)(Ùž J¦zº§|ê\Šh”““”þ;YhƒJM@IH`“ª¤'Ùp½à²Ð“Ô´|Ðd(Û9=aYG™§}ú© ª•ñje~ùôO£r•v§•ª¢ûÔOþC ƒ­:¨j¢‰Z{£2–ž*ªÀ¬ÂÚV÷7ç–pù›Ãº¬ÌÚ¬MEo hx›¾¦Îz­Øš­ ˜„y6Ð&m¦Ö­5–¢ÚZ®æz®ãõ¢Ô`䊮îú®ðš,ƹ®¬¯öz¯ø*5óJ¯šÒ®ùú¯°ñ¥®üz^þ*°›° +#ûJWy*¾É®Öº°[±Û"°©žÒ¢œ â«v°²";²RžÞ"W™ * (±$Ûþ².û²K°ºÉFcÅž³²’;±0»³<Û³j(³Ru¾ˆuú¹C•eZ4DgtHGM0 >3£'÷(ÙÐŽp uÎ8_ ë³^ûµ` Z¡Ît¡!Ê'#Ú:{SvgG¢0“9^6UÚ'º [æqy¢«³aÛ·~û·Ûa¦¿W@ª¨ÌS£¤=…§=DZ(BJ<ó#('ŠÏ`0£·æÕµ€»¹œÛ¹¿Á¤]¦'Zj¸AÄ©±ÝC‘sãC‚â ]Ò0{b‘,ë¹¶{»¸Ë‚;g!9¥ûs{9zž„r§z¢E\¤º¸W# Uгô¥¹¹½Ò;½ž1¶Öþ¨Ìw¨ ”–jJ§‹(ÛÙ ›ÔIŸÔŠÇ)©'š³ÔÛ¾îû¾½AªŸfªTy~¯ 4÷kO¹Ê¡¨«œ 5Lðô°Ã'Çðº³Ëœì ¿ ¼À ÌÅê¥ô…¬€bì×'ë«'›À ¼ÁÜÁº´­ÓJk)€50·ãÊ·¼Â,ÜÂjÁ­§5Lßz ¾%®¢"Ê fÐëÂ<ÜÃ>\e \°%¨Â?\ÄF|ÄIѰBœžDŒÄNüÄPì‘A¼ÄɵÃQ|ÅXœÅ¡ÄT<-M¬Å`Æb|\ÜÅvõÅcœÆj¼ÆO9Å—9UÛ-Œ]VÌÆv|ÇFÌÅt,›èé±þtŒÆx<È„|Ä&ËŠ@•²Õ²²ÙUÇ…üÈü¾‡ŒžAe³@å¼CÉš¼É„lŸV÷‹9s´¶2&¥úÂ/õŒ4 ( :/é;µØIÉ ÚÈ‚Ìɶ|˸k½:ûÓvª'S6eˡR¢\·aCÉ'+@»\ŽŒËÐÍ/»»2JÎs:Œ÷Ë~d?ˆ¤Ó&?ǃÈl„¹U\ËÒ|Îè ³ ‹z¢kºP:z·ÄeĆ¥=dAÊÌF´KËéÜÏþ¼ÁÔŒ¦À»‰ÿRgR F{2ЈB¼`¼}”ÏÂb/îù‚ÿ\ÑM½º|}Ù ”ÐÏÀLÂŒ½—*”ž(¾ÉT¾A¹þ©µwÁ™|Ñ.ýÒœ+¿òwªU¹•¢–Q=RôDÓçg(þÛN\ÜBCÑQ‡À ÓJ½Ô_ûÀ&ÁBÁ"Õ˜3*sÜÒLÕZ=²Ðš#lqÊÁõeÎ[]Öf¦0lZ2œƒÃÝâ@͵d}Öt]×ZÆfŒgv½×|m®x×Â2×}=Ø„}› Ø2UØŠ½Ø{z؈MŒÙ’¤ŽØÏ<Ù˜ÙgY™¨*qÜ›qI‹š=Ú¤œ=W}ÌŒHÍp‚]Ú®ýÚyÚ(Ë›…ÂÈe Û¸Û¤)ÛdeÉ…‚ɦÖÚº=ÜÄéVA–/ªü/÷I§×b3©Ê[þºŒ‚2Ë·]ÜØÝvyܲ@i‹vãÜÀ,JÃl9ä¸ÊBÎ"'ÜÚÝÞîˆÇ­>@*¼K~M£×l(ëÓÍ|qìýÞàfxÜUª¥ )Þpz¥û3õŒ¼„²Ï×-à>áïxÜa´Œô]Íqª'súET§šÂп=ÑwvÙ~â(®‚îNÏdJ5Ù6Úè¨*©£Ò£$¨˜JÛ›Z+,Ü)þã@~Š+ÎÓù•~0•U@«ò`«ÿ"O;]¿ùäÓ»ª©#³Ú>äXžåƒXÙ³ÕƒrÕW®åb>æhÈåymâdžæjþzi]Z9hÃÚ‡æk>çtÞwfnÆr^çz¾çþ舞èWèK|èŠþ莛nœ\Ÿí'`^Žéš¾éñÆè©Ý'€Ü€™Îé¤^êâÆèŠléÝ)êÿmê®þêÅ9é¼åÛܘÞê°žëºÎlÇ  I«Os0–Üõ µ¯Œ/Z[˜¸¾ëÌÞì¸ÆÝÞÍkã¦Ýí¶ÿ¢9r˸ÊîìÞþíß{R¸gDÝ‚²ßàŒ<ÌÜíàÞîîÎo¾à;t¥T*‘ÈKAøubçËþîþþïS6ä ~H=ºÐéëЪkëüð ßðÜ&ðÝk-ŒÊ:]á;¾Ê¤¾«€£îðÿñü%ðú[Ó(¥þRÈ(?RGM–·ò.ÿò­†(^Þ'—¾ð0Ÿó:i2ÿØö·ó@ôjÖæ¤•žÓçëÚñB¿ôL_[Œ.ÄJßôR?õ™õôõTŸõZWVϯX¿õ`ö]Õõôúõböh¯TdŸôýžönÿöXµö…Ré‚ró%ÞöpŸ÷z¿Srï@©Ú,ïß{?ø„o[liž­(©^÷æ…ÿøY‡?f«(´>( ÷‘¿ùœ¿Wé¦aP—´ûY2S'ʦŸ0Zì ºµ¬Ýù®ÿúj•n¾œ¶Ã¢¡qwº×^Ìèí•ý-ø°ÿûÀUfú=‡{Í7z>ükî²ß…¢ÞëþüÐýF•n6f9äÎ{¥nŠÂ„bÏŒ¸ïš/ýâ?þâôo¹§Ð§Ã¦njùé;âIIþðÿ’”n-Ò¦D¨ƒf¨@9åà«ã¼j”a£Â@‚ D˜PáB† +QâDŠ-^ĘQãFŽ=~RäH’%MžD™RåJ–-]¾„SæLš5mÞÄ™SçNž=}þTèP¢EEšTéR¦M>…UêTªU­^ÅšUëV®]½~VìX²eÍ:]â¥áA]º+10Å„hÝjøÈÅ €Sº7o½ƒ ¼–`/?Ï&†<ð™Ÿ#Š-_ÆÜðáYÎ=þZôhÒ¥MŸFZõjÖ­]¿†[ölÚµm߯[÷nÞ½}ƒN›YøpáÔâ(ŽCøræ 7ÿ†]útêÕ­_Çž]ûvîݽ^üxòåÍŸGŸ^ýÍàÍÝ¿‡_¾sˆëíßÇŸ_ÿ~þýýÿ0@$°@D0A¯½ €0B %œo­ /Œ°B 5|ŽA?1DG$±DOD1EWd±E_„1ƉܰFoŒ¯Cwä±G2H!‡$²H#D2I%—,’FŸ„2J†td²J+¯Ä2K-·ä²K/¿3L1Ç$“6'¥D3Í'©,³M7ß„3N9ç¤þ³N;ïÄ3O=÷¬êL5ÿ4Çúø$´PCE4QEe´QG…4R¯ü ´RK3cSRM7å´SO?5TQG%µTS££ôÒø¨‘9åTµpÐSg¥µV[oÅ5W]wåµW_¹LÖæsl­É*v¡Le¶YgŸ…6Zi§¥¶Zk¯*XæsH³÷.hÕ²8J–>lÏE7]u×e·]wß…7Þµ]Ž[„ì½÷=/.¸liÊ5W^&¸`ƒF8a…fø(z*Á˜näÁB®3ä ™^̰‚ˆ'®˜Â žñÂ'D`‚c-ÆXãËäqä²g Ø!YÆ9gwæ¹gŸþ:è=6èšcŽpļ pä$ŠA¬ £‘VúÁ‚à:âeŒˆš .˜vjËöÙØ²^ö©ùÞ›…f»m·ß†;n¹ç¦»î߈.(°˜ ЦX&äéz ½ Âw ¬¼‚¾úû²nÊVìì´ZÖnË/Çxá‡'¾xã‡4ô‚R˜âšºØ›ðƒ˜wþõ ˜çŒ[è‡óbž~ÿåý1ß‘G?}õ×g¿}÷߇Ÿ?å+¦ ê—~&…*ÈoŒ úï¯@ÿr _ Í ƒ aþ ¿ý]\Ò \bdA®ò=è|ñÃ`5¸AvЃaRæ×–·Ä¥s©Ë]ò²—.+Œ_#Ê….vÁ‹Ù™®«‚ˆ¹`…8D"шGDb77¿Ä8®j¢•8E*VÑŠWÄbµˆ+&Fы©ÜÅ8F2–ÑŒgDc]ä aHXm¼Ð1D5ÖÑŽwÄcõ¸G>Ʀ‹r¤fèØGBÒ‡Dd"¹È•ü1T#%9IJVÒ’—Ä$ IN1“Ÿe(E9JR–h›ì$$ÃhJV¶Ò•¯„e,e)T¾‡U IN*+´ÊYöÒ—¿f0…þ9LÕrX <ˆu)(b6әτf4¥9MñÔ²p .)¸L÷ð’šßg8Å9Nr–S*Ödξâ/nÂÇ›æ„g<å9OzÖÓž™ßÇ(¦²îqÁ ×D̲ ñ dË ÍÚÙÍAÞÓ¡…hD%:ÑIÎojIKd±‚ËM.Ù8FŽ‘ Dr mÎ;)ºR–¶Ô¥/…iç7¸Ç.zŠyAþ¶y¤Ì¤hCé¶S¢Õ¨GEjRƒ6?Ö™.£%}Yî p¡ ÏØ]P‰£R¥vÕ«_kXź«.[UHøÒ+øÂ R­;µºÕ¡ŽÕ®wÅk^õºþW9ÍïÍÈ3óÀ ô¢¨€/Œ¬ Ε®|…ld%;YÊVH#tË ÃBëéÐ1Ì@ט12Ê8v8\µljU»ZÖ¶ÖµÜ1fsž˜\šŒu}mnu»[ÞöÖ·œ‰­mË…Úß׸ÇEnr•[6ÂÑvŠqîs…+â.׺×Ånvµ[ÜàNVÕÝnxÅ;^ò–7©Ýõî¥Àk^ö¶×½ï…ï4Ñ›ÞJ­7¾÷Åo~õ»ßŠª…¾º´/<`ØÀSœïÿà7ØÁ†p„ƒ—ànºç–k©­,awØÃñÂ(ÜYL³X Qf7b·ØÅ/†q¯F¼­þæ9ÛüáŠc¼c÷ØÇ?6ÔŒëÕuZF®*Æ-•¼d&7ÙÉ^šßYƒytƒUèZ €!'XµG(Æ5®Q d¥`~¸†“‚‹e rk¨eföE?ÙÎwÆsžõü¡(CP£ŽèŲѵ3€MlÀ`š# ŒzŠ6 ØžÖÑ77ä¤HÞs¦5½iNwº@}®éƒ8ZX ¦ XΪ« P¨z0‹«@ã,“S³ÓžÆu®u½k^[Ô]“òëº,‚ { GèÆ@ŒýåÁÔ®c·ƒ«±²ÚÄ:÷ÚÚׯv¶µ=•ùÑzÝóóóPMy¨šÕ®~ÞM/£V#þ“ïÖÛ†w¼å=oz‹Ð¿—ÉÆzáY€;Ôƒ¡†¡‚hG(šÑ/V°Dšî^‹­Çà 4VÃI®wÆ5¾qŽwÜ"ó«%&†[.À°B¼|„ˆ¹È:Â2Bà5Û0…9Œœ`#(™Ò^Üã?zÐ…No!j¶ É𻇾t¦7Ýév.º‚ׄñ§WÝêWÇz~›]´F‰ë+³mµ³>v²—Ý쮺Ôo$ö³·Ýío‡{WÓ®ö±=îwÇ{Þõ>ϹÓCTß{à?xÂË÷Þ MA%æj÷Â7Þñ‡¼$—ðuÊWÞò—‡#.€yÎwÞó|äE?zÒ—þ^€FêU¿zÖ·Þõ¯‡}ìe?ûÖ  }îu¿{ÞÞ ¦~ð…?ü—Ž"ð ~ò•¿|æ‹W10G=š?}êWßú¬eA"\ßûßø‘Ê|È¡aȇøÕ¿~ö·?ž`ˆA8 Ñ|°Ãý÷Çþõ?Kw¤#"u@‡mØ¿$À4@Eê2‰È‚ 8À„À”À-’2è‰t¨ƒ äÀôÀÌ œˆ\@4ÁDÁÔÀ‰è?„Á”ÁÔú³¿‰€?ù£ÁäÁôAl±‡R…!$B9ˆóûÁ$TÂ%dÂS ‡/€Â/@t ƒ(Ìþ‚&ÄÂ,ÔÂ-l”ˆwàÂ0Ã1$Ã8ñB0,Ã4TÃ5dC$9Ã6„Ã8”Ã9D‘7¤Ã;ÄÃ<ÔÃþ°Ã=ôÃ?Ä@ÌŽ>ÄB4ÄCDÄ× ÄDdÄFtÄG ‹E„ÄI¤ÄJ´Ä£ÄKÔÄMäÄNl‰LôÄPÅQ$ʼnÅRDÅTTÅF<ÅUtÅW„E:lÅX¤ÅZ´E-œÅ[ÔÅ]äEÌÅ^Æ`ƧC½Þ3ÆcŒ=/ÔddÆfL½ßÆh”Æit°Éû¼kü<\ÀÀÆnä¼Ð£ÆpÇq<®¾S;Æ#ÇtTÇuÄ+s 5@ê:›aÇy¤ÇzD»Ã[»ºSùˆGA²ÇþȀ̫¹ëÇ­ÊG¡È„TÈ…,ªö`³–Ù‚"ˆƒ:¡-ë2–q3ÄÐ?ðƒe()‘ 032›²*»²Ð§Š1|‘HƒòH‹ô²‡ÌÈÙÈŽüÈÙ9¶03d*³²qCG†Ê¡$ÊXj¯išIK)’ª€Bk±AʰA X88ƒŒ¸D[4Ä@´:ŒZÉéaÊ‘b3S ¤°J†ËÊÎ ‚38¯ËAó¤¢Ô˽äKÃX“µê)q3ÀÜ07­¬€rˆUCŒQ;)š¢œ}Ì”9µÂô›ÃLL¹œÍÈ´µ ìËÑ$ÍÒÜ£öp6þ°C¸ª*6bC}˜K6ά€eC6Ål*× ƒ */[6‚HÍî‘MÅ´ÍÙ 6)2ÍäTÎåĤöøƒ`+·’ªË,ˆç$Ï„ ƬǤM¹¬²<ˆè|«  N‚°ÎÇÀÎPÓNî0ˆ4°‡ªæê®ÆC}ø‚‰à†H¯6ë³VÃr`Šø5@ë·†ë,L…xŠ0ˆë¼Öël€Q¨ˆGˆqØëÁ&l,;0‡ÄVlˆ(ìdžì ‡t ìt˜ÂQ¨ì&ˆìÍælüÅÎíþÐö¾ÏíÒ6íä#íÓVíÕ½Ôfí׆íÀsíØ¦íÚn»Ù¶íÜÖíªÃíÝöíßþ¹Þîá&nyîâFîäæµãVîævîLcîç–îéf²è¦îëÆn³îìæîîæ°íöîðoïñ6ïóž,lèƒõfïövï÷†ïøno/üù¶ïû¶ïx@ïýæï¢Ú‰–ðnpéƒþFð§¨Mp pð‡ð—ð §ð ·ð Çð€Wð÷pzbð ñ'ñ—ð ÿðWñq q .ˆ†}ðƒ%€Çq ¸p_ñògjqnPSp^°þq/ñgò ÷ñ —ò)ï¥ßr8ñ±qNT PPè?(,np“a8°q3ȬXhƒ70Xòçr©s/¿1»UØò.×q§ò@tSjqip€¸‚‡pX‚ppN€T ?¸r¸°qiàr'Xu%×q(otOu €Yøh°ñUÿóA·õ[ÿ¤'h8}ˆj s'·ñwðàtð(þ -?u _tw_txx‚}Htj·v÷÷Z7÷ƒGx>Bw‡'Ðwa) O€U€'‡ø×w|×wnwðoïø(Oø’7ù3jq^pSP†v‚kèö{wpR0P…mhp WhyÐø|÷xˆ÷xšguW‡uY7zƒ?ù¦wú,jq`?؇.5Nðƒ OwR˜èï)è ®øk—w‡ø+Èók¸€'z’úº·{ ²‡zXø'÷û¿ïñq·ˆL(…²¾ûÃGüß!/ŒQ8…‹è{À—ü'§{‰8…R`|·NüÍçüþËY|Æ÷B;0|‰ˆüÉ7}§ûTPÐ÷µîüׇý·YüR0>ÖÁ.„Ò?ýÝÏpÇ;`}ÐwýØ'þ⇔: „äWþå'„w €ç‡þçnàI Â!ìp¸‡í¿m`p‡ z ÿ,H(PÿC8„R8l;€ÿQÿQ¨‡ú·ÿzxÃÐÌg};¨† ,hð „ 2ÀS©'JÕ]ŒRù6æcaÞ¹1 F6P£FN¿~¡,áæ²L˜ïf¦ªi3Uœ:wêéó'РB‡-jô(Ò¤J—2mêô)Ô¨R§R­jõ*Ö¬Z·ríþêõ+ذbÇ’-kö,Ú´jײmëö-ܸrçÒ­k÷.Þ¼z÷òíë÷/àÀ‚.lø0âÄŠ3nìø1äª;w†»Ysf¦˜í„¹œ&鳤PúF«aez ¼Ôð̱`‘/lØY²¤ cÛv9¥ìðîmgÔ¨z‡Á‡ òäÈÑ1oNñ9ôèÒ§S¯ný:öìÙK¹àÖ£N¨ˆÏ¡(oþ<úôê׳oïþ=€\n¢Ë•ª'Fíú÷óÞü¿rÈ÷_ 'p¾õVŠ ªPN9·Ù“=ÂæNšÓ„ çxèᬌ6š¡˜h¢%Û¨¸â6¸ø¢‹CÌ4#M–Õ4YNþ=D¶#=úø#A 9$‘Ey$’I*¹$“M:ù$”QJ9%•UZy%–YjiŽ:ÙX4ÒøŒ/‚šý¨Î.¸Ùœ¬¥lô¤#ÃmaäV Ÿ¾•pÄXœq’ñ¢ý)º(£:ú(¤‘JJQ9.D„N÷ôóÅs‰œñ)¨¡Š:*©¥šz*ª©ž‘ß|1ØJ@M:+­µÚz+vˆ 8èp£(È[)yÚfO:Vè²ù˜³,³}øì=&IkR‰'ž( ‹+rS¦‹™ˆ9Ó86†Ó%;[š{.ºéª».»íºû.¼ñÊ;/½õÚ{/¾ùê»/¿k±ƒc6~;þ·Üd+‰#Žγ6‘O†ºs§ Û†n|îö ÷ñqˆ2‡+É%›|2Ê)«¼2}=õ 1´*¨ÒÎ9ë¼3Aš@Ñ|ø„òËE}4ÒIß:hõüÊ›ƒQ‡‘ÕU§“²Y'Û,³ 5|NIÓª¡’µ¡d«"·|‹¸8öû6ÜqË=7ÝuÛ}7Þyë½7ß}ûý7àC~G™e㈙ ·+J"†#‚óø縠š9gÄlUãiÛ!}öh=¶bh~J›~:ê©#-2€†&‡Îr#—®zÒÈè+ƒåP=[…уÐ?°ìÂ3òÉ+/ÐC.ÄüþÜ(™B;õÚÍ\=öÙk:>LñtÔ Nmu±Z#ë×_!¶ú” ¶Ù‚À­Œ4ZÁdå¾?ÿýûÿ?(À°€< ø˜ÉXæp02˜%'š5£š\j6’†¬Ñƒ6UÓ“ ø •¡„Á ]Ž£œDm¯….|áé`—œA òM)qˆ…¡b2¸†2ähN:Gj6„AÖÀ£ Ë‚˜9"F!z¬bÓ oFA ÙAêz0´:ðQ_=ˆjôp‡²@­“ÀoÛòV¸R1®rÕa™àF(î|ÐC£x^uðqŽL4 ø@À–§ÈE2þ}èÉ6Ê1V„B ¨y T`‡zò‹žü$(C)ÊQò‡ LóÃ7>3šOYÍòÚ‡ÖH­²ÅO[eòÖŒâh“qñD¾ü%0ƒ)Ìa³˜Æ<&2“©L´0ð&b"Ó‹À°Š¡ Ç=<¤&rÄAМ=ä9;üé„¡+TìœCÊu²³ûiŽ)k(`ñ‰‡a 1$íM?R¤¢ù½¨~ï`Û.{)”œTÆpï@œÁB 9¨!›H¬²ìtÅÝh±“î,šqȨ‚ÁC<ÇM4Pax ¡9J8ì¸ 9èÑa(Å¥0`" ‘D!6áFµþ¨qäOÆá<è Í(uHÅ;Á IôƒaMH=Âi‡/pQQa£ø$ÎçP´ó¢ e8 18€:PÓ”óѹҵ®´‹gPÙ›ðéÎjgÔú–KN‹l&ªå6ÀP&1é2øSè2#+ÙÉR¶²–½,f3«ÙÍF‰p6¡À ÚmLTr¨àÚ”ÌI6y*‡Æ²øÖ/ ¶™]÷ƒÖÜò†Éi[o(ÖrØ£¸Yˆ+ÍqÓ°â'Z‘b»•K›@Ö+ M…C!ª¢ÐP´¢ŨFÄQy4{Ì9 S»/Œ¢ šZÒˆR6bëï×ÏRÇLÌôþMB¶ª(|Ø! ô`Á9ô! NIaåTÀࡵ‹td*@ s„ÁÏÁVØÓL€ÀU=‡9Ü‘I; £(… ÜÑ„1€£DnäÌ6¸kÁ(~cådW{›²¯ ÷AòÇy×Á)^­ƒWË‚=V!ƒp6ès òév+ä-s™”ÝË«‚Â÷êýYiHß³Âf÷Y+[·“e&ÃÙ9Ó¹Îv¾3žó¬ç=ó9,ÿò’M2“©†"%Ì=GZÃZÞAB{úÜl¿Ð ¦Ë]¾ô¬X'²XÓ’úØ<ëyÏb‘YÇ,Û˜X©­F7ÊQ^r0‡’É`¤þ ÃÍdQÊY$Ðöˆy†UA³-T§Q;1ŽBï-Ö™áÁŠ”¨¾,½¯ë ¿»ÄT;ýXÞ\˜ù8‡$Áw„cÛAC B†,ÄŒ«ùBXð LÂÂþÞ™*DÁˆüŒ"ðèG&bõwHD-"¶ãTiºGzÜtɶ^œŽ|ÀãéÆ8Â1”5ôƒhüûšÚ`Q‹!óôÑÐA Ü•±|gV®6–{Çé£}ý@ ÙúÁ8²õÜ»’cVÖ>(Þ_{®ºÒôÅan=ÔµN@3Dç áu©GJæƒRƒÔWVf­YÑ´ª¥R[tF}þuNÜÝç¹Ó½îv¿;Þó®÷½…~Ç@À K˜X#Ñ#Òy‡'añsÄ™4²ÿÓ[-sÝVÊiZLj Ì‡@*Üzåõƒ|j "1dj¡šªŽn«ßAݸæÏ—‰*ŽC£&Kê:Þ¼ÓÒµhoíÍÜôH–Ál.„3^›ôÀÜ%z­§>bÒIcN÷ÀZ â¦3®±%@ÐRÇÖAGŠÙoÍAq;à£?õ(…=dìñm<" 7b`Sž#=I7¨AïÄ@.è| & ¢G-ðôQ°€Äš•XU¹@>dA€yX)½XŒ5ÇY‚0¼CþÈÝR°T ž4€ °€;@ÙáCQ^­È!½Nèy°Ô\IÝœ‡”›¡Íµ…Ë8ø]À`×LŒ‹¬È‰yÒ!‹mToH; H¯ÜЂxÎ8íF@Z Hy©SèùVr`ç}ÎÓÈVÇd!ÈÈ`BÊ—H*‰Õ””™™Ý‡¬´¨Ù°‹ÐHcí„ ò!""&¢"."#6âOŽáà˜‰œÖ=¤VÂFØ Õ€PãqŒðyÞëH^Ž¢¤€Ù>È*\̘%ÙÕ\mðÎ܉=Øn,N‡q€)RGñ…•ø|Í—ëÅ϶ aMðR!.P”œvåØþDy×jøž;„×x}Á¸Nñ…ÝÔü•|­Q˜–>@û¬É=TâwñZ&WéРÉ`ŸöÝÖ|µI&d‚I8`H‚¸@¤NéâDA¹±ÀÈ%ÔßýeÅ;ôC Œ‚˜ŸOô< C)B4¨ŠFn$Gvä¨@Td)€€PØû©@>È0Ä `ŒÊfA9°ß¢d\9ØA&$°äU<D…L¾‚rTû¥Ž!±—^p‡@æ–)Ñœ l#9‹7¶‘}ÅѸÅàa˜àÞɩȉHKä Ø²$Õ8H6Ý'ÅÓ^E¥ql¼‚\ V¹ jpþÈä,‹¹Æ½ Ò-ã Gq„â.j°1›jÌ{EHqW­B¯Y,‚’¥ÃÅHˆñA•YÙ•¦u̡Ӵå/V ºC³ì¡´°ÙÚݘt¹Nè„#ƦlÎ&mÖ¦mÞ¦[èD8ÌȹÄ6 ‰>DŽ6DÑœdAÅ€ÐÆx" MZÖ5e²£t@z=(Ò•)jcÕ”Ý\êeåe^:khPI-™ ¤"`ž“g2Š×¡’¦ž+]ë=kâÒìñä‘äÄí-á­™¦ØÄ¤Ã£ íè /öÕÝ\‡¬‘JÄO· ¸l×DeS4RcG{ÙA9È@°‹;tœlC&Œƒ}vE8pÃ=ÐÃ(LÄÜCP„Bp …ý‘æ RÃ¥ˆýİAGÁÁƒ$¼Cbäc&€ÁfàL%h\¸8„ A vÅà i郱@dÒ(h©yu* —žè ãQŸËíâSšÕ””|ñáÚňì½&UT½ƒ ƒŠX‚‰ì^®¹À²¸à4ö` è eß(²a-èª ƒŒ„ËcíÄLž¢¦šRhxÎÉ’ÝFư! Ežs¦§­Ìá‚8êýÕÍ™ƒ6ôêX68L›I´ž>ôƒ8šJTþw™„E}×qÕ\Q'þFgÒ*^éUØE%™eMrÁRU â¶#l⦹ž+º¦«º®+”è¦M8ÔC½&0Nã„9 \.F>>Âo6Àe9çÀ_—ª$ÃN’…OrÂèUÜ£T'ÉdhT"ltw6Áj$š †oGÌ lê–^ƒPM¦*×9˜ÄŸŽ` ¾ÔXà,Æ«­í,ÏbT¤R!¥jOžú¢TN¥­}aØ&¡v%â¸5õÜ6\N£q^Llý†p¨ËR°%¬Œ&Ìf¬,U ¶žh€à HÀ4é§„†¥´4+Y>«YJ*Zr¦ZVž­ŠæØaÍÖhêJ‹a±È‹Ä^B•»n0þw°ðœýÙS}V‹Œˆ\<°–þ¥&e‘`ær¬o®TÝZ%ìjŒ[Kl¤ìºÀ=4@8–H@MÓJ€¬HTwYÔ£¶0€n¦ðá®Ñ¬§éõïê©¥ÚF—§ÖÈ8|±¡bFîMâòúž&úµ®ìö\’:Iñ¤í-ÆV/ýÎç¸f¯¹,cÎ~¥‰ð'YòZ:læ œ(ïšT̪ÁÚÍÏø ªR|G*`ÁÌ3¶ ±\Õª 궘ÓèN‡±û´È„‰nI>îc?æ@ÖC)X4Aô7ØcÛ’Å8XÂ9¤ƒ+KÇÈ€ H‚ ŒBODþÃeÁ}LØPù-3àú„$´é=°Ä€ùà=¸ƒxø2ãÊA&Ü2c<܉¦¨½²™Ã=„º-dYô@`À¥ÜÄÙC@6ʰåpîtÎx•ŒêÊ=œJC±–$X¶šXÐjlðýìʨU÷¡ 6ên_ej–J)V«ÝÈ)—…í/™Dè­í3/3ãŠËöŸnˆ‡˜Ùá§’ßGOÅŸUFã˜3>ãòºÃ¾Ö†Å ÄÒ0êb†ƒT‡žÏ²œÝ©æŠ´] >8÷„ëôñÆ«‹ØZOû´Ñ}—4Fê&Š“W^”K$x¬Ëú'ÎV·u]4šyË©qõôâ³]¬+Uï0µkß{Pä»ÎBíEe7i¼ê¸lU&…Ȇ±hâeRmp5ËÈñwSï|UÒRºÂg vD9|¿SÜ¿+ú”ghÈ-É_e¶ VÉl•­W½˜¡ŒzmÈáü–¤‚ƒ@r`vœmÚÆèŒÎz\ŒÃ6äèŽJ„”¾ÃMþs pRâ†w83?3P¤Â1'E8ƒäÞN> ¤J‚½ˆ-вr‘k‡‹¡-:«3»É…ˆ½ƒOœéöG}oŒÊhÈ‚$ïüDY•ï©÷V ûs Ûö%y–%pƒÚàD!2|î]÷Ã[ho“ :h߃£yPy"'µŠþ~йTrÜÈ‹÷Œf›_仯ü?|Fi7Лð—O0FKÍ·à‹…ñVwòj»Xû{5›¦±¬Z!H[†-À%«gô´Ýq1Ò¬\“EµOòŒü¯4åÈ’¬‡˜,¤þ'ËubµÖ@ û2ÐNÁR*T„I·Ð]CæÌÁ;wnŒ‹ýB…Ú¶þ Œ0a™Þ½—*U“…P¦T¹’eK—/aÆ”9“fM›7qæÔ¹“gOŸ?:”hQ£G‘&Uº”iS§O¡F•:•jU«W±fÕj”Ép$Ç…ÌäÄFKCYTnâ9xÍ5tGoaºrKÙ5ê >|db<˜paÇ'V¼˜qcÇc #CßÀQí ,W×]š4áUT£íÆm… 92U8“= š$)VXÙm-Þ;çbÃ…aTäµ3rqãƒÖ+ˆÐ^:z!Nl FNFK=‚Iò5Ñ:_ÃŽå¶MR(9jt¿Í77ð¼|—ŸXàe;>w—/âþ¹{àÆ¸‡•¸G·Ý\x‹w‚ +Œ÷¾ˆo¾ãê»/!çöëïêB‘dn>ÚÎ5v¶*ѨïRygaÆ ¥ôÎi".ºîÒ+ q¬ð ÒiÈœ&üãð:Tã®§À¯<9Ò[÷àÃѱ/.+%?þàÙPAÌd¤pHd'‚w„±DŽàI#FÁGÊ/ì('‹4š¸GI¸ñLù,*‚!¸ ¥&è)gt #ÃŽ0詳02I…Ä>_GxÂø±zè¹g›qlú"Ÿp^ÚÄ PMUUT?1aÕWaUÖYcEDZ ˜2‘$§2 ¥ {ÜD¬wÀþ!J±ªca$ÑÇ…|d(EÓÇð)E†|Αƒ›wH¥´‡?Aˆöž´£Xãà #G!M¶˜Ø '/·‰Ø^¯!º.3¾¾@tñÝ7¶Ì  1̰¿ «»ùÃìVkí$Ÿ™oÞùç¡^ú驯Þúë±Ï^ûí¹ï¾%¯À¢­hò2rýÀØgÿ ¯‚pÏ Þá?~Êð¹;ï¾ÃÈ‚ž ’èp,Rœ)$$Ý‘ú„"³¡Mméi{Üc£Éï11³P~„'-k_2IØ–"›’Ok£˜;²À2;Ô#w\ A2³™¹ãG  FNó‘LìÐ#˜ÃmÎc²¦Ðv|q!a*c¡æá35SCFŽW¤¯y¯y „þ˜$ÎÓ$Bh‚.DÕ0ˆ%ÿ ìx ù§Ò°=¢,joØc»Å/fb¢9JÆ¡(b $=k‰½ Å$xäƒlê"d¾h%zì[ÊÓ8öDEè…㺇9 é/D.ÊY Å·Âe=vdBù(…î SŠ|¨¡ÄI*b² Ì’–³ÔÁ-j‘ Z0¢–½ôå/LaönàsWJ©)͆Cª”C&ü(I¡8 Zj€‡;Â`È|¡é0Ç=B!Œq ±Oõª$ÏAÈp¢2Q‹¢Ç9å° /e“&j7΂,¨=¥0bâÈ È`‘¡y"þÎ2ð“&c+›’Ì£E~4n»~žÃHêHžóÈç˜E·¬,‚=¢`vŸ0jp¤e<£6 aÑ.É„,-b _j˜©]0¤"cžD„ÀæMhªc‹,b2¥…o“`PSª-‘‰¯hB\@‘1€£”Ã8'}ôÃu0r‹9DzdAÎ(ê‘׿L«ò“ e g?”c«ÈBÜñ M§’À¼D¥Jh(*›øÆ×º×Á"²£]íî:ŽöG³ ~¢þ oCòÐñB´åá”¶µµímq›[Ýî–·½õío³¾Ë¦nuäSÛfþÑÇвo |%ís¡+ÇÕo`|Xh:KÃáMG Á!ˆbK’¯Mvz]q˜Šjc4µ5`7pe=~ê\¬ju92D,ælØÝ›Hg¢QíE\|5p¥ìס«£ •¦G ÑMS’$ñT_msÐ{ä›8Í”xê`kØ \¨tå²cQo Û»žt4-/.{i…›«ñ'¬„bGÌ8:m+ƒ$^4†·¸#ð]a†VGXi¢8°éDLd2Ó=š†jiR>õSAšP‘P@J¢!1UØ‘ŠLXBZî°‡L˜Q¨ ,hd¼ÌL½:pãî(bÈþs\“¢EÁFú€pà3 b@‚u šÒ•¶ô¥1iMoºsˆL±È ÌB@t<¢’ >û91£èԧά“:T2—ÌdËyÎtŽ£Ð} qå&¸¹õ0N"Ó‘¨A ×Pêu/,¢g>BÆ(,52a"q¥Nz4 ¬ ¡Ð[†LW9ÆY>¹Ïf.·X(ç¬k®AI½J\´|½Õ§¥§ü¦†ÚEÕö7nuJ›”öÔÀú· ‡ Ò ið¨9>8õ>–²œåEl9Goˆ¼&Œ g´}Mb eœ¡ë—#]e ˆÌš-/RCÔþ„|Pu!2¸Ë]ó!2<<ºkÜd*Øß…rûK,Xï±¹.R/ç^¸-›¢Mf)ßfe-¾#'yÉ‹^ÁÓ"„G3üÌv/Å–§æ|Ôq¬ñžw½ïï}÷ûßøï©Q몳ÍÑlÎÞöºwì+FÈÈq·®´Ožò1à˜r2¼†à÷£‘; èµåiÓ¼)ZQ‘–âªÖ(JÑMN}Sþö‰˜UîÉxwüôþÐÜjâzRÈz b5â*hÎsVƆâ:  »‘d‚¢”½£‹‡ÃîÒÂ)3 Al —_Æ®}-Ï‚ÊwîEž,î« zѾÆbF°þ6˜Kñ`ùµàL ˜I+µ6‚ç‹dª`"¢‘ Na"‰(z@ÍÀ@PÒdËÞ0”CÛ\Æ,¢¾Íüš¢žEÔ“Ø„èZMî©‘ôIRpÊRÎF1¾ àA@å)ØA¢©XêA\ † ‚à fÐDä ,¡„AX@âc²à¸¡*ŒP LIc€ ÇÀ‚P[‚…APX JAòì`[ÐI`‰z~ Zô!ž² ÙE[¸%Ÿ"%„RLÌÜp..²àA†ƒ #¦6#±\  ,5@Ì;" ,¡Ünîã*Æ.Z ¥$¦¾ìrŠùª$`þBúÈ-b`ĽÔ-/êA ç‡ûŒ¯GDæ ‘ù:bøhÊ~+ãÒ«<ÖBõÑ.~’è šƒfXñ‰¶&5b±×¨'ÜF殨÷heà BLñ¥`hÁËfO£¨ÞÈ 'L'|ˆ‹E,A :î´¤ªVÁ=€®/&cè*on$C«kr°+CfÊÄ/©¶‘{º1ß2ëëLè” 8~jøÞq1Š'.H\ ¶rl¶´0"%r")²"-ò"1ò&„ËlþÑ|8˳Ô'´ð I²ò‚û|1å´K:<‡œO;HÂ5Œ‘¶HŒ»ÎÙBeVcZ¯¯^¯ûb¯†²æÆ„Agþøèkfr+üÉÄl‘½š`AF1û‚j¨¨Q(òÃ..'ÄÍÇ€Ì÷ÒÍÈê!Êû>#H0â4@‚;ð/#mBÂøO£ d$w§>NŒ °þP£§aÆ!å€-tÎbÊa=J¡ìÁjð¨"ªgtFôž‚’ðEâ)“Ä20²m‘º%a ©-ÝÒ'Ôl(œàì1È0 :‰Ù@)·ÞáR Ã:¥•¬Âb ôA¾ Ð!˜ÅÐáV"¶ál³¶"Víσ g3/’’DóHÓ1Åœ˜ ¯'Ú©2Ù¤8†Í!;Ça™"Ú”DœäA®íe>JþÛ†3¡“(¢-uâÒÿ Ê¥ä&à´­Éþæó%ð-ý¦M£ÚËŽJäoÛj © É<}klvJ¥Ø¯¥(Qq.!æoŒÂpJ6LÏ#67|/FN(WháÆ~ñ3ò¨1qL§¢ß¡Ú¨ @”†A$ ç=ðj þ¢qJÒ1âQéJáÂ`É:£ÉZ‹Œòу t{„Kæ†FDÕë¸$ìÂbŠl}RTE+Ï´–Ž!2HÎ!î®ôDgô>óMá4NåtNéTMÂaPguŽæuxC {L…´H•$/o9®ë¾j(Mõ«þúËHJC· aô¿˜—a²uÂÖò“.5¬J®¤ÔŒ4˜{’$.i.Øs‚ã[ &\?d\}¦0€ Ï¥PJÓ8êA[àµ>)Rfuƒe‚ =ð› é1tV×VSÄ”óXÐ@V}†ì$!BÁyÒaÒ0%2!„zTMŠÅ©9U‰•Œ#S¡›Ì!ì€nÉ0ÙÎ!ÂX{8ð’˜4µï‹Ê¡Q„XŠ˜*A  Æ@çúР`80àäˬÖOþc8qFkµ-!ȉ0 ªp»l`ìèDÌ*¹3‡"ÜFú÷ˆeÚ$Aß »òHÀ¡1?"íT÷Nï6ü7Fê}u7ëèWÑf$!V³²·<±yÈš5E¨˜{„?‚Qm×r™Ë Di£,¢E &‚^!誥XhHµ·hã!ˆµ®2¶<è·@TæV„•ÉÇæt£OÓ§i 8’¾‚~?kZRüø(…8¡z¡º¡$”1½|ùu¨7äp—äâ÷¹Žî/ü‚2<7£)èHëf¤…¼7¨¦Q†®&H´Füî/#‘µÎã­P¨il¤·OfªÙsþ¥ˆ/%É/¹’“ƒ™'Aþ.ãl·1…µ£‚ÄVd}ïa ,cê§Û53 mŸÈ¸á1§È¡WýÒ‚]ÃxGÔ„·¤†=T›Hõ/¹“lš]‘š`hÈÒ¢ºÆu'‰Öl-œÄò‹Hpñ\W¬#,¶¡Í =c¹ „0 sËRàá‹ÃÕîò˜y$ Ô@%„Îáyz o& cFz"ÀÕŒY@fáT:?°ŽÚòì;·á zÜÉ’âØZLsÎRóË+['S_äÉ °Z¨2“‘¶Dt›¸@«-?«ÐÆ‚ã3ƒ“Âþm÷n+ „ýP²1T†jŒÄõK$r)o4S•'¥` ¸àÍš[Ñ1ë­¸ir)o2-ÐmFìB¿ ¸c6ã9·±^Q—i‹›ë9z£ ˜ç¢®Š¨ù M Œ‚/9d¿\Žm{‹©´Žh~ˆ§<"¨ sm‡ävw«0„Æ‚±:šoÏ—±}üÇ<È­BÅcw<8.Ãed=˜ÆiRôðòÊpöB 'èйèü"rî#o¸ü®ðŠÂ{nì¶³ä÷r±5i3á¾Û7Ž “Ž”Ã¿1ü°‘Þ¤ŒÀ·³V×|}«…ÀÒÉ]0©Ù–ƒUg¤ + [ý¤›[š²m†µþOÍ‘WÍÛHª/üÉS1ó(-é 2q«»ÕóI$˜WýhGê‘q{)‰ó!”»8&Ù<)OPPÈm‚ k-¹÷;28©[öïˆóÒÁØà ·!¶›'Ê!2È \Þò!zÂaìaR¶82ÌA³}æŒé! Ta3Ò)2ø¸X@æx1êx<]ÖÛË+4)3ÖÃÐH™›e{Ð3º«=æ®›eå“Oö÷Ò§:WËa…‰²mN€¤»,¼dkϓǼöÜ4\ÝVUqÌ–I­±¯¿zÀ+²&ɤE‚ˆY%q…~GêG«==m“95´–ÞsËÀþÉ'˜exE;F!Ë¡Ò2—/Ù·PDæˆæoa$p‰ ûX(çc¨2GMãÎC:b^ý °{ëq/ëÂ}¹„ØKŸC®¥Dx¾ZuÎ :-¹FôÐ]×å~îéžï,Jéí7^<®¾ÔáHÒw¶ü.üÆoðço‚#´LZ£×9ŒâG¾ "Ä™GÛ£øàããÆè÷!lˆ4<Äù~zy…š•»òi‰,j¾wf™”ñhCŠÞZqÞ{ô ‚l0%Q?˶,wúšMjX:9ÿàó¡‘Ã2j¨Võ¯V#Œþõ—w\Y‘³Œì£ê2èU‘èk>kÚ· ;hýï…£†„®¼'Ýþ¶p˜ §¥Z}¹ùœ…ˆë¾&ÂafåÀÀɽCQ¶EØëPðv #Ð^¨L= <ˆ0¡Â… :|˜0‹Ñ}iR(Â(;züèqÜw…زC1Æ9 [º|ɰN&9æÂI‰3ºRîîq«3¨Ð¡D‹*Lõ(Ô˜4aFå|J_¹4÷$ej4«V„á†p“s.Ÿ=;7¡BýR*‹¹’„c·5nÐ:©†ÛÖÜ9Aì•…άà§dF•’ÄÜ5¡¸eNîVváÆea)”šsMÒd ó·ìàÑ9¿ØQ‘.M“{ú$9N…U²Gvtß]ÞJŸÞþ&ù‚¤+÷÷ éá‚¿F$Ÿ¹sàúYrü¶ìéÔƒö ‹Á.˜ÌºÏÁcá.‹ Á‰›'\ï4â|M;çö(zìêôeÓN•]7î»Á‹WaÇ(_v^ÙQJé¸ÃBÌÉ  YAõ]XÔu©¤b›~¸i¦— æäÞo H`*®Èbd‡  ÒãŽrðœsrH² 7ÂdòÎ8©„3†F‚D[8©ŒÓ!7ÛHŠjÜã݈îГNä(\‹^¦ôâI¥ÈH£8BÈ#tByd›n¾ gœrÎIgvÞ‰gž.Õ¡$“™xŠfjŒqŽ9æ¸ãÛx¥p)Úþ—ަô…i1Ú“Nî¸cè9ç:§.¸Ðoù¤¥=[~Ñè£æ½hÇi3ÖhÎ èh(ýÜz€à4ÀÙˆôhšª¤7æŒ6æ¸c@® —žÎÊuŸm যæ:žõ¤*lE¦™æ¸à^(Û€äE>K_m™ì§Ùðô–í¶ÝâĪ öX:nŽ¡<ß²kPeïJ"Ç=óþ¬ªÄ†AO>ð܃¦c5KpÆÓQf7S¹0h£pû(:bB\ãÄ:ºöãÅ×W‡e Ü€ |¥`=)>jš 2D<±>æ #Æ/gÎ;Üôs ô”˜Šõ”’N>.´öþÈ8ëÍ5†=Œ#L(÷˜“N)]÷… ô˜£Æ6™¤bt×oÖÁÍ=î”"X=ôœ#É8r3Ô<)æ$1dRJ)wý:ç4€OÂàMÑ(’üÝ;™„Ò„M‚Ùá8 D†yéÕñÎ6jÒhèØ‘Ž9r“Šé-¡¾ô=ùÈP Éf¡¥8–dBºí™W&ÌÇ!ÿõea º3qc-N0Çzœðò#;œ лöØÖq&i™~O9ï• ¸³°Î;ñŽ>>V¼ñuFû'nRz^–‹¢z¯” #=>£‡j˜ÓI€!`uˆ›ý¦S‡pèNʵzó›ÿµ¯[[ \àþ¯s¥K|ÜŠ†ütî ªP$ÊB¹´Aœ¸!€4ô’EĤ¯p1h\ÌQC?̵ aÄGHu a [B bà>¤†6áPîH‡‰`XÃa¥'AéB–“£1]l:¢ψÆ4ªqlLÈ ™˜ÂÜ JD$J‡¢´u¶,Ç"[”‘¿è þGzÄe@ÀýHâ| ó•ÿä»,¨XeвB‘¦e cîòX^8ƒAàØa@zÄÇËÑEL¹à´êÑ„0굑`عLfÅzd‹”5ÄÇI øÅÇ í\‹€gÙºØ7ƒšWêI/ •Éq8 4FþX“]t9˜>ÆÐwd z_èCK  ÆDféz™Ýœ¤òË(ï5ÀÓt1˜ &ºŠæÎ { ËGÙ¶§*“uObgŸËúTdb`1¨ÙT4 µ™ƒbnƒD‘ùµ°­ly >4ª†¶xô£YéA&ô‘RÄ0ø úvF9œ- C8HïêQ»Ò…B' 8H(ê‘’rd¢áà†b*|„Av™p KãÔƒw€AðÈ‚fš’“ºc VÙæ“FÑs¸# ­C› Üq9l㲜eÌ–½|üê«-*ŒÚ$–Ò×`®6CnÆ—ñŒ‚œ_2M9Î þÈACNõøä'E©‘zVÔÜwˆIì{Ê‚ÌUaOíÜò" ÏúJšÐô ’A.¬xZ¢ÐeªÕ •®¥Kòˆ†d àÏ‚yÍá6·ºÅŸ$Çsˆ( ¾¥½ô(@|à#RõˆÔðMìâ䆧A¥¥X°œÅÍA"lÌzÕ$-ézÐMX•ôš¥-}V¼ %Sv&LÎoMÌ-°Œà?$‚¢¯­ÔÀ«)^)¿Xäïï$åGK™iV?d¯0&X*$Z\mk³`*.Y˜UàÒpzÕ°ÞöIÄ ©Œmš>†!”†ZCK»IãÉ`æË«ú†ÏÐFþÌ’{L…¬xb¯¥‡_Àoí SŠÐ„öÀŠM{áŽaD?‡†ÃªPŽ“2ï¯\Ú¶_Ê'r>Èš¡U¶m>HÒpÜY$KóÌÞ“_ËÖÜçB„Tlæ ‡ ö‹6ªå#®mÑZ¢× ,íi°¤G3Šrúp[ý.ýqHépŠYJ‘ÙúˆÜ \ ì°„ƒ =µÝ=Fa´:œC4îê,]*‡|¨`¦;éÉOP}¡T€@]åë`ÄzK ¡®³DkEÓaíѤ zm£k»é1}Ü#œ~AêŠL¦‚,X1 BØÌ51óP¼Ûq‹ÒyGvþ²ÂÀÀ¬5FX0Ьµ¿d·T@‰-Æ\èz(´ƒB9aznŠy),_&ˆ_|N&ØÉí‹ä>SÆL¼¾ã›•YEæD§s*Žh•{DCR¸f.XÅ·”õÀ¡ Ê{$= a(y…" C…¼G¯¬6ÕJ !:e„2Ÿ8d—iJWUJCÐODghLÇ]Nr³iYË}îtOð×¥¥¿fê?*–:N¶;©G´â~â" t¾Nú˜w:+Ü™7Vɦ˜€[öä–ô`‚ØëxEÆX'\üô'S^wûD`ÊØk€3ëVAügìé2Üá‹à73³PþU,‡¶b_ -“\²^®lÎÍÈŽ afêg¿%ÕŒ"Æíæ êS¯•*/Ðþv”Bá÷=5Õwűg|ïî/áCŸîhcÀpò¸_$ò+Â@+†C(s,…§,3æ‹Ba=˜ñIÀ•-XVCÅå*]¤„‡IcÄu¯[xXtˆ~÷â<³µŠÈ@~(ŒEAd€¦c…Hß·di&~ð˜hå' Í— g‰*’OìÈJzf:ïÀ|{ñ4daC˜˜gþ1OL„ààzuei ‡ÈAƒÓˆj¦…¦fñØI–pŸ·’e³šrr&Yš= $ïþ°qýÐLýCw/"ÇŽµ!ò°$$=‡ÀЇ2ŠhgŽÂb>³ ±â 4!ãÐNý(AL$vR2­…%§â™ÁgÔÄD{Všñ)ŸlA¨pr°„vüÅbÔôE«ô‰áñ¡MW)Pf˜WÉ8›Z–G€’°:$uø iGÉ ï@š@Š!(6þbn i0ýoŸLS3Ea-Qìp¢‘~c`ÛÐV¥À – `pY–9Q§M Cp¥@š NÅa £10 lÙzI¨µ¥m%noÅ7I m›÷.D y¤2 a0jàà¸Fɧ‘ýàziÐoHÚ_¡F,0“•5š1·L‡µ0©*뇪Á’€.òG¦ §™Nc¬ŽâK>Ó~cÐYšscÛ§c•º*UÚšdŠÇDð2%›‰3Ú2¥‚á<ö€ˆÌQ}ï)§! vPa½2aÖU¢îC@  ð°B!ÎÚfä#‹Ž·0þÓ}ª)þ£¼è†äJ±[˜µ°Ùã+ëó°w2áòŒ†ædZ§)¢œyO²vÛ/Œ0ãx!É·|ZÚ‘Y à:.pM®±\k›·|N¨0ùhÿJïê=ÙzrõŒw…µŠ3Ú˜‹™Ù¤Àj?K83àî0H ~%o<‹›¦´±„M˜0η "[ â~óаuwWŠY³P#¶f15ðªï—›ªsÞ&”iø9a@n*%¸iKYÚ©’7n:)ª@:ý`ˆ¡¥Àx™h$ ùW  `ì ¡— ˆ`. I+èZk–2”ô¦bY,  þ°—„š<êVpÅ€I8<ú`€Ìs&êð•Ö¹ïä—šáQÈ’_ªÃó£m”™¸ä ¡3ŽâX7™ÛðǸ[è­ ¾ å’Ù{‘Äz4S(œIµÒT›©±¾j¾Œ[®}Beð°±oKsâ:š.ñˆâ Eæwô]zÄb·¤;²ˆ°±¸UŸÃŠŸ T]åZ\ÄeéÔ¬°Ë¿#|`o›ž—{«"”í貫M,) N(µ¾§ÂB(’È©\Œ'Ñ«0*i¸æAÀ4JÂCqšaQŽ¢d=ªf2|iÈ“’êÛ"ø¸Qmhqögc¶V0jð4>þGܤ ”›á4Ôë%yh5“i Dc™ÁØ—¥êz}‘²,²~e5® –6Ÿ2¹ \Pc^<’€„PLÆa¦X»‡ ¼´£Èv[7`Y,è§– åõ }æ€ù0¦Ì¥jç@A˜®ûl‹ÌaÃjžúÍvƒ™\ÂZ¥Mp€Ã2c0¥ÅÄK³hZˆÀ³ˆ §•4ÌW³©ê"v`ià)Õ€ñ¥}ÍWEG«~µY¶|<±Œ[p†Kâ$ÀÄp‰A1–ð«dо *2ë‹fbìÇ‹\Kûœœq~wl¿ë×[pÀ ±Øx¨‰_"ƒ³+¢‹>6£6þªJ2¬¸ä‘ü(SÃÏf ûëÊF.Jft2ùhyå¤yÂÑBÜ®¹Ê¾¤5š“ÊDÚ‘…«~5}òJ¾Ññ¼ígLH´1µ9,–…¿ØÚÃu Œs|Æyk@VB}­¢ùÍ ¶ƒ½[“¼sÐ`ÍIpôÊÒñ¹ÌÃ,Ó-’Çz8YõfÔ.8Ç`À4Ml5¥Î“‘Õä‹ÑÚ»V—Ä1nðPn­Ós‘:¹œ½cÎ*0jr“k±ï —;SR%¨K¨ô @ç Âlô2&÷ÐÕk4–p2@”vjð—»IáˆzmS¥néuM6‰:u°þÃ6s•ÓBF’`OCÛƒôÐÍK‘çÇ&8)Ql:79)a9:'ÉfkO±‚|cË:=1x7BȵÜf2)6iP8 ;ð©»û†2 `a“¸¸–æ <ÅÍ\RÜ…]\啸n1æ¥#«5œ=¶ äšQòv×[¾¨ Œå/ÕÝnújÆŽìÝM±kµ§zPíJTM0™¯Ñëñ(e…%½Õ}«í,pìÜÛ“±ØsŒ úÛ}UÄî m™É‘¥Ï ™ÒœR èz.ðAª†U3ù`þ³× ·÷‹)î ÇÊîfðÒö×ÖÊýŹæóÇGƒ;®Þé¹íü¼Ýå›è’]^ã‚ù<.™Åó Äx­ðƒqfÐó=Yîgå·NåDüW…iï]æÆ{æ+ŽÕü|¯ÑîO:­>Eô1052àïÌðü›UªÓçÄA…À¦?ðf:î„{d2Ày)¼ç;PÅ·ô€è¨¦S)KEwG•Tt/w“Îöga§xú×uð4A©ƒQép–éBÖÈî áõ:{3IÊK/.°VI>^¶­`€74i-M?تì:wY„G˜öRíÒ㶘¯‚’Ö«þåùØGJsäzµó4·õåMáüë(Q+‚UÃûU¿ãÝdð§zîÏlÐÓ¼‰œ'ÂêDQb-²óæa"¯¿%n–·i¼ïçõÒ|½Ï=ð® µ “Æ×?æ4ZBsÑN åàã—¤ðš/ùr"¼Íedb $XÐ ;a‚ÀkŠ[¦Tì M¤XÑâEŒ5näØÑãG!E޼î·P÷ÌÑ cG A˜1cà³c/H“{r¶eÂŽäO A…ýÈnœ°”MXŽz)Sæ—R2Ò¸Pãb¢YµnÝ.“¤,²”Âçf=ôš€“ôh\®qåÎ¥[±ÎÉ”þ+UŒBg6&ºQiÍåÜù¶îa㽂‘ãÂ]¾~ÖœªFˆž‰5oÞ\gˆ%p,dØéë]Í|cúq×ókر‡öx·-´ŒQ’Ž “ï^¨G©d'>’]&9ùJ9Eï7ŸÅ¥‡Üf‡à¨mÓµ­s®t z·Ù¹r§_ÂÀ“4Žü{òw%ÁKWÏ)ºRîž»†?~79àÉ‚4¿ìÈâœP2á¯??ò 4sÒ!P²Qì1G 00¨ÁØê8J5ôÊM· JçÂmÞYCéØ çC5àÉ'RF$q Àû›w¢cñǹ؉`@t!Ÿ,öúîF|J±' x,þÃlE «ÉÃLÀœ#i´ïF‚h²Ç†B™ÒJ4ÃŒ~€Ç{JùòF´è‰r'tqœL¸‘DŽ{dd©F0a"c”RÒÉ'JIxÌ3ÍéÖÜÒX²£¬B›”!Ÿsäc*!uTRAb'•L,ÑÇ…4ìq©ÐU!‹E#“qÂÙ°ÔîÚ&D¿¸1Gz8•£Ñwåµ åwTÀÔ4ʨj˰e³ Õmä8gÆWaETQFŠHÛRMêÚ––Ô-°b;-,TtK)hUV·ÓEGzëE7‚TÁQJÎL$³¡‡"PV`ÙÁ@Ç s×,„ÆdÔ-¬þ Ö–[`'4«_Uôøä¹î}–‘ͲãD5R e4Kn9™š{îQšµÂ@†0Õx¸çºRq‡ tàé˜èÃ̓Ü0.ŸõÚcúcnÀI£©²Ãp@àùê+3YÙº‘ó;G’w†&;±Á‰°åœ-ÔG˜Þ©Ž‰S‹,y˧K@Õ›(,»Ui©¦HlÒžÔV3ùð4ëàVŽ1ÄÚ V2eá7aÆq›òñNí3¥7Û…õ C }iÒKå„PñÆÎƒ@08^-B˜múç‚¡Æ®ý:´µäõØ·2¥@g$ôFÖÝù·í軿º ÀÐz°þRh=GŸË†p˜t£À·Ga¶‚}Ùq¶¹Ç®QHÚs¶¼1“ ä[Á*TÂ@&Âàjf| m®Æù¥IdTèÆFA‘ø*dÉCÚË8åÉC÷Q„J±¯Àµ`*ŽÊ UŽ9I*Í{žiXºÚ„,ƒ2yYÉ>øCšy%cˆ Ò9;éƒ5°C¢vl†žœ9:UôH8òQs‘‹y„ ò9Œñ'ã˜O†8µª¹GäI7îAÁ„jæC&ö÷Ãþ©!ÒòË(N$aˆgŽAiÖ³‚PŠ7å`¸¡H.ªL%â—è D.²+þxYÜæÀ”½;AD”Ó™^^,EBƒœæÛ›à*ãÒÊÅ©{‰:¡£l ‚1Æ1åÈã}J„{X‚{K š„–L‹I‰28,‘ 1þ²³óÛXœ˜6z¸ È›6ÍI—:˜íAÐ×.5}XÂ-µüžÙš@?ÉÔ£ ÑÇNÊÙ³TÌÇßì±Ñ˜|¡ eH+>54a,½o–ÐÑÓ¥¡%`R”¦´ô0‡óô·Sͤúh‚„`ƒ~5!fEê¨ÒéHHæ³iþ¸‡$°YUÍŒ#M(G$¿Žsl“çdÇ=šbw€õ"Û°‘²#׉8M9]«Gv†×ä wD[L¨Ö„P`à—uT ÂØŒBˆÍË,g­3«OTA>Ô vï.Œ; ZÐ|€ kMhø¤*V¦éIŸTÁÂËÞUlj("Ù•ž£-Í-Q†Ä~܃ ¤SZ¤*³â&õ+¡9©d<ùW¢EàERÑ’Ýt. MXëR£<,æËo‘vÌ1XB±Ñ i8@PÒrœ6–šJ™ Ð2<Éý›ÍÃ%Ëúñåy‡%þ@˜ £.CæOfd´‰‹{(æ^Ü‚?2’èƒ ¶õÑ£‰ðسS<k×woßçpcJÓÁžwäûjãPƒ=.†œƒðÁŠ–%-Ô;…ØdŠn¹O‘:#9„tÌ Kw;FXüaà#²Ïo‘ôߌ„ã%Ñ.XÛ´ëø2KÚ¶û«v‚~0®“‰ñë*ª:@ÄÀÿy$Xzx®Â“À‰‡m€‡0@³zpÐ*®T ¤9‡äË:{ 2¸‡i“«€ÁHòº>â@Šˆþ€m8˜­/‚~0À_ ‡KÓ³Ý+xø=,¾” 8aˆA$Ò²c§Ar“¢ Û`êÂ`}x„;š ê,D*ó¡Ç¸»Ôó:Kò¿ûÓ:À˜(…sÈ@òŸhù-;ȇ>Ò„"Âõ“šzp9¸=Œ˜L‡ *üð,a>zpȂ٠Dµ¡Gp8üÁ lD¨£’R÷:pÊ9Rì@nhw€Ã‚8 ÐS&é[±<ÃC˜Ð6kÅm²¸½¿rð¬K’Àq°”°N[›eòÅôSƒ­1‹/°‡&'KôŽQ¿f+Ë«Dl´ ;£§þТk<§:€‡ïp:Œ.n(¬QºYc#sÐÅY,s°šF«y‹¬|„rD¢c434…´cD{y£Ç©É}0HsÒ²­“Õó½´¨e šË8´’¯o´ˆžúT4&w@µŠô8%²»Bz>ÛëÈãh€t ©/pI`CšÁ±±:3̾Ö±x„ÐD~ …’ìȬp°1°¾˜€;xXIs´„|Ø4`½¡và†|ø&Þk>$JŠ0~hœdŽçcEl´¯G™À‘܆µÃ²LPzÐ/$Cl¬;202(s¸› |< D³¼¬FÑÃÆ,´4,ú“þºäʬ B“Å÷r‡1ð*šÜ¹ã€Ë RJIXǪRRGˆ99€¡rØÊ^Ó+…„#öðL“üÀÕ´ƒ&ØÉb#h>=J‡{†[Ä«:x0¢Dì×#­k3Ь4ƒ°3‡3°Iü¬©,ºžƒp[º5+N¿Ü†ØšäA‡0ì£Þ ¾!Ðz ){Pí|»Ì´GIèK¼úË|@)=MÇÔŒpHÎÞ †TèwP€Nâå]bÙøh†'x)NaùŽ:x¨…(ÞâãíbâX‚x_P‡f c¦âØÀaÏEHx 7ÎãØ5cµõ\¸!Ðux=.äÏ…cØ _ÎÍhg A0dIö\DÖŒL€‡Q ˜dß­Þùk‚@ ñåäô­äÍÈ:`„0eÓµá¡ Ô ˜eZ®e[¾e\Îe]Þe^îe_öeXŽãcøeb.fc.æ`žÕa>ffnæY>¸‡å Yvfk¾flÎfmþÎåÖeV/Øfpgqnf/(ߨX‚ogu^g].çOfgxŽçuîæw–g{¾g^¦g‹Mg|îgîådþØeþg‚.èxèÍ@gƒ^hÖçh†Žh‰®e„ÞŒMžhŒÎè^vhµÕhvfŽæçNdi†vg……h”vf•>c~né~.i–i›¶æ—îè›Þéödâ¨fžê|öéáhƒ“j𦿣jvNêÍj¦ÞåŠ ¨Žjužêĸh«Îe¬F ­Fi§ÖŒªÞj²®å°Ö ….k›Îióiµg¶6é·æé³FŒ±žë‚®kÄHk¼né®>Œ¯îkÁhþÌmëÁþh½®‹À>ì­þkÅfiÆŽìÄ.Þ¥Žì¼&jÙXìÁžì¹¸kË&æ¸éÈí×àëÏ.fΖ Í>mŒ&í§®lÖfèÔŽ ÏŽí…žm®¨í‘Æí­ÐmÛ6kÌŽ ß¶jÇöˆáþmZ.î¹Xm²VnÕ†læm­8nä¾íà>g·®n{ví„ÎníÎeîæUØþn|–îÌoòÖfóÎ ÓNo{vî¸`n÷jøÞŠöžïy¾îšÆo®ï­oþ–éõŽeôðkp¡ð·Fð  îêoÍPð²†ð½ön÷fp pg ¯ ßpÖo¥ñ{ÆðŸøp‰6q’@ñÓVþqª.ð²öoŒ`qÖ–ñ¬Ðð ¶q¢Àqƒvq‘ qßf‰ûòkîðº(rþFòΆq#?pí'gæ! %ŸrgÖñ¡àq,7h-Š+ïrÔŽò‡n1?èÂÎl3?sÙ&sñfsc®òàò¨–sãvòôfrº s¡Ös¹óï¶óŽàs8çe?Ïmj’gô–x–ßéš7æ§èßïÓîùÝ–w¹¸w\vr¡p¢ïPçw©¶g‰7úfNúqöøoúc¦úm¶úEù‘Öz\Æy¬Çk°×f® ©Ÿe'ø¤/ûänê¥GôÁ~yI‡ö«~z*ûÞv{mæû_Žzþ¿W{¼¿êŸ?q¡§yŽ|€ö÷·è±ÏñÆ/óuÎ]ü ØxÀçÀjÊ·üt×ûoÇèÍ_è³ ™—g’ßùŽßv)/ôšÏüO|u–øB8ýn{‰†yÈùÏö{Äÿå—ü Ÿëß÷ò°ýü·ý·¿|Æoö?lØ¿{ç/yË{v.~Іzä'Š´Ïú.}Pgæ7fñ' Û·f­ß|ìm·ïùóÿq¾wòίþ,§~ºOøîÿxÁÎÿmz€8 Á‚"L¨paÁ`*@Œ(q"ÅŠVÀ8Q£ÅŽ‚ )’ ÃŽ&O¢L™Q%Ë–GÂŒI’cK•þiBÄYó$€`2A–¬`è5fLLê4ùìÚ‘‰j<à‰t'RŸ?¯2pLèÅš4W,“ ¯)TmZŪö ÖŽÏ¼øévbkM')r¢LZáåÚ¾…‚^ àš4G,oòºQïÙÆT=šÒîN¾~×.ñµ#cÇ++<ØÐe_Y%<ç<uE/K.÷Íl@b‰Œqj %¯mÖ;“º†­ðÆ¡~d=ó­ümܹ¬;{5iY¸LâC.}ú0kì¤MãµÉY9ÅéÔcÊ®È\.]òR«ìž7ç´çc¶jù|èÖ;7ßTŽÅG_J:õtŸLéMÄŒÁLFÑ(VAþ ÑÜtQm‹ È„MA$KDGø!ÙFá(àxå ¤ ~í£Šgù×[F)’Wc^ö¹R~2r8#Ñ&ÚwÛéøX|Ižd^ Y¤g·å´axBb‘“O&ô#ð ˆ#y[ryP”y§UUÄá„qT!åg¿uÕcÁ•é#Œ‹AVw7Ê'ä¯åɃÅp\rɃJ…]˜a“-ª—6rš%£6-bDOEåéDxfŠÐ™sÊùžE”=€{ÒÙ)jdfº*“¦F”Ûn³mÆkJ¸ªk¬+Þ4”Æl`âDÄæiì—²ze°ÂBm™ÒN9Õ£E8þa…•Z;}I»‚Ò Ø’(LD̓®^‹Z‚©vIkµûÒ»‚<Å„õN,ÃÜc ·©¹mH; ñ¨“@VhB#šÏ”w6þåì‚ DVxz¡Œb\Ã0, ßÒâÆ$Žü¯hP« pD¿®ÈoqËÈý 29љ˂Iш‡ r^£ ²T €!'p¡Ù˜_qta\VHFŽx$.Ñpq‚Ž¢šðxŒ9A<þºA‰8Ž…âÓ×ÿÒ¨Dˆ”ÀÝ…Ã"v\"ÝÇœA!`F/ê#GãIã äÛøF?~#M|bϸBöîû£È(™,Ã×ÈMNÐ…E}†9¦¬d7¢ñ‡ytÁ‹B¤"‰G=ò1'Zðƒ–¡Y–‘|N„"ù¹ÈFΩˆà‚ÂËgúq5˘GD汌ŠÐP8j»I!/éÉkú2#Ô|Ê GdJ#û(ÕDÐ ÍiVÓô|€>홓uò Ÿì(%ÕYÍïÉ‘}p%,»ˆÄ;z²S0FN`–ía2#î4âC—ÐdÊŸJå*‘þÊ!Žj”rf:ó¸Ç>V  0üg57ÉÌ•öš‘œdGiyÉ ¸4˜žèƘÌLn4¢Ï!“2OŠL1"V|@PûxN–Þ³¶Ä¥.!òÔ‹l”Uì )IYÓžBŽÜ¬@  QKÂñ“,TÛN)"Ó°¶®ÍÌ©29™Q‡~ñŽo5d§ÈÙÆ­æ’»Ä*GF)Õ6¯K•ÿRŠSl±]=«c3*ÒºNä®zìOEjÓN °j$-iOí³¨T¥Y72ÙB±o)ÏÐmNÆJu %Ïè ÐM‘«/|!RKáD¦Õê-»X¾Ž”¶¤c*ìöþ¿¼¨À„éL32Ìb*F7Ä4fcW+Ыbw¶%exK»Ì(rvµò5«aÃ{„²"è¶…_Œê ǪbÔ¼ëMïyÙ›_Á¾7¤ŒÍî|+ðUÛ구͉'5Œ—¨BdªêEolÓ¹T9JËÀüܧ>5ÌD·ò•Ar1u¹ªØCÁ &qQKyÔÓâœÜ¥¬w}Z…ªÅFgxö Dж–ÕÝì‰Oj‘ KÄ´F‚$# $ü5¬Ïýh ŠàÈFä€9#0šTªa'“MºÕ¯foÜãY¢"j6\9%Ê˶t¼%³…îëÙ Ãya»½Æ¢´â5àQÈ,rêãþòŽØÁ™VŒœSdZ+#‹”Úâ˜zéöB8¬§_QZéÑ&ÚŸK2r)lVÐJ$Ê¥…ñJ†ŠjB޶ÊáKq­+ÌÓ2m°bJ‘‰Vô¢¶Ö$¯‰*RŸzÃ1åµ\›çjë3Épq“«]®/KÚÊ.üõ/_ú×:8<ʰB'ÃJÉ´Bd­mÕv·•Fl¸"MJö1“?“hÝò6#¾­¤˜WÇÕ(b€aG8ÂÌ$DÎpñ£º˜T@ æ¶gÈÅ1®ñð£GxÀ2æUÞ–g|ã…#zq†è-âebspþò \ãGp„¬Åh‹þ]ç<÷y͸ðq$„<ˆ,4^ +õœLýçW²”Çòà…ó2[Ájó™×¼ãXAÆ3ô‡¤"o§¹Í§N 'ø½êWÏzÒ—ÞôŒÌ}èòÞã^²Ÿ½V7;Ö¯$MY¬"“@åçdÍll…fÌÖS5N°÷\ì¬Ú|çwžùŒ„Ýí2ç{xâà…?ˆJóƒ{æ—qrˆP#ä¬Ïºëé‹yÞCäë°=Eölú>sèîy¯øÅs^®8psq“èvžúš)¿øÕBè†/wºÀ¤Ãvõ€qÝSžðJgzò«tLòY7?ÒU8‘ðÇDý‰ÕñU@ãþÙêQþ¤_¬ŠíážDŒœb˜ÒÍßáqÿy_/ü]àAæì}_‚q„Ç¡ËÙ_ -¼8‚DÅ|Óª^¿­ôõŸ×¥ ªž ^üÉÙŸàrŸv`ÏQCr^Ö…ŸÜ†ÐqIe†ûIÞî‰ ‚_®žvE á^¡êñŸþ%XîàD lU¡>ÞÜÕP@aÚØ Õ@{@ tTÀdQ¤=„ô…G’Ï5ÅðÂŒÌ5¤€²¡Dàëmàr vž Æ! "Œ:aZ á‘`â-^Nˆb—E¢µ”!¦Ÿñ¡RŸËmþ&®b&y"0ÄõðB€MÚºaÍ :a)’¢õŒâ+Zßò¡¢Ê"F€ ¬a/NùéÝì9^L DT c.aº­_ò ïEDð 5&àg,#^âg<ã$fa%Â_7~"j#12ž9þ`äñŸ°Ñò`ˆ#ð…\;†G:VKñ…!%&¡7z›E4£Dðÿ}aˆ]Ãöx¢àÿ(ß/êóÙf`LÛM#ÜÍ‹AâÄ)º£–#Iv$«åŒB¡ JäZ¤$æcFD*ž`D0Î.†ò¡¦@¤ibwÉPüã<#Rnc=*ž)r¡øe 2ª¢Ë¤œf`äëqþäg !Ðé™KâËÝ„'¤#¢ÈERåNÞ F%YVå#re[!?úÛ·ùÝ;.$âÙ#ò…ß6feD`_h_D¤IàL‚¢Rž%Ú".&E¢‹]Ž`@V9$:¾%ÇI„1d]å ráV–W'áCL,WR~Ý V‘ V Bcg¶8NæïUæ@â£f$ýÔ€OæPöá:ÜÁ¨«­€4”Œ<ÀѾifÄDœ€â<ƒ4ÒÝED Ax('D0'N<€$Øv²•[eÄëõ‚JÙÖ.ƬU€x2gÐøŸX‰J ¸'y€yªT4, ȃ#mw… DÔgNþàçØ…‡s.Ð^”^± ‘j„Às¢ xV¾±•¥Œ€ÎQÄw(DôÂ}rh~îg¶çÄ','y^‡„"¨Dè'Dðgx'»€ÿµèĉ¨F`n€<8‹D@flØàM(«Ôè‹f„ÿyhœg†J(F´0@©éªÐ3 …ȃaLiN iŠÌèbøß€iú€%ŸÍ…jç‰Z‹#|HLù ašm ©˜~©µä‘”†(DPh¨_CêQ¨Ð–Žh|Ò©ªÐŠF„ *[EÐ霒haÅç¨4é†*©J]Í‚FKR<éE)tJ'uj§(ªy&é’N!”–J©ZªJÄþžbÄ€ú»Pƒô‘DŽªZÄbFh{ªiy~(¥šª "jxþ*®!°*)² j¡"åÜüçl@†–橲vèœ+‹Vë¢RD£«µ‚¨‹Šh±Š•€ëŠ hLêgª«Êá\Õ¡Þå ^H#/À Bš~†³BD1DQ6 ÁÆ£¢¢ˆ'Ñ)’’ê¶ërn—zš R:j‰:á±þêÁÊÉÂr'H¥Ö’«˜ºk&Íé¢ðé»FëâHÄVNP,w’§ÅZ ÆVhL¢*îh(¸JÄ2©D瀪‰²,D*]Îf訕ÞÐDjÍZÊÇb„¾zg“&ì·6ë£.Ư¦þ(DkÐú(¦¥áªÑbiÒ®+F0íÕ©·.ë mSYĦÊC§V€ *jîA÷)ì¶v){Š)|NPxd¦ÄŽƒB¨ºê)Ãr}+œFm¥æìñ|eBÕ¡jtÝÔJ,˜ ¹rÌŽlDü®D½Þ«Ãé*Vp"Ä~+ß&«ÏާÊþ¬¯¶niµ~¬uBvÆ-ÞFê¦é몭Düí¶Hœé2î„î튫ڬñÚháflNô*Úš*Ó+ï~ëÚ†å·-®©ªnwªþª¢ú›6‰¨ÐÇ2-V«î†ªðšª<ˆìcr­Å`o°‚-Ò:ÅØ2oÌj&¥4¬º­gŠþì-Õ&˜¢ë\Cv «JÁª¬ÒªßÞjïn-ŠÍ/ãÖo–Þ/~¬¼öè®HF7€Èt’ðDøB%œ†.@¤pLðg(ƒ„@jÙÈ ›ðK– Fðp +ƒ,øAè‚ÓÁRx q‚íCºþpÉRÄDJD—«ç1qRLü> ·4M WÀ çðjT3‘1ü ã°'ë{RqgD ñ“ñ G„§V›Q…è1㨗M“Gpñ“œÞsÄßD…”—³1¥T3€Ž"ÿ&`n… ” %g# #Wˆç!™BnѤ(KÄþÄÇ`Ê–1Wò•TAøŸ&›±Eü®üK 8B6,—&Ã1C*#¥bà±W¥G1Ë› ³XUˆ#r+²ŸD D2è¬p \N0Ëq"{©+C²$S3\Þò+Ñ ÷BÖÀlŒ<4ÒhZ¯™Nq¤3,#²Ø²ï0>Ësœ¶qŠ0sÇ‘Ÿ/û²……s²´&+ó=§s9Æ>‰û3«J„4C2{Ò9§gø°`ƒ1PÑCÁ5ØS´Á™²EG4«(ƒ1\HÜA(ƒBûÚJƒ2'tG—pÿ†ÿÐm÷A„7“ ?ãóNË EÇQ–×1£3 CþtSÃ¥KSuA5 u‚5"#õK+µµ0uÝÖS6[‹Fð,ûZÉ6_·ö0NÊ<çÊ·ÙH\rɰµ¥œ³&µtQÛ1Q 0;ó7ã3[Cµ&Óõ€yí]ç5`ñFG5Y¤1_t².v¦^³YË5kò›nfE^qxhr(£ÎTÇuWŠÍQ°|1dJ_SDXÿ3lO³(Ãë.÷rävoOC58û´iÄ<ŒtIÇJ«4Qfv×ÎÆV_±j;áWKõd×°i³ÊXk„ ‹—v4v¿´<§Y™Öõsçš`Ÿsi?ë` ôO  =[w‚Éö4Pû)¼¹2\þ_·e7>wD¨²j°òd[5ecwo?³tÛ7|Ë&Û†ŽcÓ^6 ;8qfQ¦ŠX¢6‡·|¦7 ÊÃÆÑ7,¯s´ó;ÇsàŒîU¤˜„c²mK¶G7IsÈI§´ã 犄9+Fk ÔÀ\©ŒÈñ¾fë„ÎäçLïêŽvg5/Š)ùLhs3(¢ðëgÐòð¸‹@’mJÄ—WŽ¥`n5û/ü“;9”oóÎIDƒœC@“?¹`¨|[H–³®”çyœ9„†ù´pÄ¡s Ft€ø‚hσ#Ì!4ÖÚsmÃùž³Î8¥?l < %Üt(:þf‹³ëJùjçv°Ø¹œó+ùJU›v4­Ÿ+ùëÚtAGD©çïæ6Ÿy3¨ M©ûy :ª3ç¬CD­_ ¹úzHƒ™çî’[ ²ky§ º¦w0s“ž5£§“Ï9–g{¯_ú©J§Û7­‹ÎÇŠ©ÃûA“÷þ°6]Q»¹âz{÷9E¬y ù~»r´‹)³Œ·?sÊTE;¦y´O;£Z{·{úDüî¦:FGĶ˹šÛsSy ZD¤5ðÀïá+wÞù«Vü¢@Ó1P”±ë÷¾ |²F»Èã»A³(CÜh§`û0»{ wgÅV|¢‡þ|ñ"ˆtì¯Jï»/t•SD4}½}'}F¬¬”ïüÅ·jñ:»s„Ç ¶®óºžê¹œ7¹§×¯F{sër„ ¨3ܨ»=C}D´:Ùν­ù±'ûö’gà“º¡ûùÏk}·‡ß‹ºÜºàÓ9MhÄÙóK‹ÿά=Ú£;EàºMyâ?ìÿ\ùŸŸ;. ;àÒÑu¨”ãWý™[;¦;¾ªƒtäJÕ5¸’â¿þg<ÎOÄÇš<Æ=ÝgPÃÊÃe®2™+ ×KÄ×OyØ#¼³“ýë2}¿[KÏ«½/¹?(7ca…V±j}ÙõkÙ­1-^säèZQ¡ÔPË,Ub0ËOáâÄ ÌÀiÀ^W –ûA±…IçõŒvÁ˜D…¸uózÍ×G^úQþ-”¹£Ý‘mËžýÝ)€cqm/ϭݹ´*>Z_ˆºØ³#¦8̾]hF.ž¥¨" 6¼À‚Ä“ê™k¸päˆ"¼0¯9î ë7G‚kﺒ&+ÃBj+ "&€¹ª褣n9^VXÁ€°‚†‡LœÎÅü„Ú¯¿ÿR½‡T\çfDÑ7à„«Gÿ´1¨$uÌ/¡^jø£_Œq § ;,p‰˳±ºëœ\R3Â2¬lŽa"GŒˆC¡1ƒª š ‹“?%¹Q¹…îs³…¼XbK»”Š*í;?÷*˜G–’â(.›3zqD–0ÍÜôOî()Ž!9Ïú±E©þ-”ÀûTÈ ÌóIñ:‹Qç*½4S“*¼ðÕ—LpÁ½ìÌ×›ÕQÑì-£d³T UðT]HM6Ý„)@­@ÖŸ’µÌŒªmóMînÅTÓW,•Ö}³b‚  ±b°bÕ‚6ÚïÅ X„= ûu×#“]ÔÝpíUØ!Q‰=7× œqÀ|+;Ã¥}!˜Ãª[ó9!‚{Ó»µ^ª@9/ù%Eöƒ‹“Víàƒÿå¹=ÖÛ K:•ûÂÇû²I„™zÝ¥Æþw2*]ºŽB¿ú5Eg|Ò˜¨—¾MïrPë_©xæ³ hR‹l.躤y AœâÈÆÇAÎG’‹Þæ>ªDðI„H Ž“œ§þ=‰*ŽCÕ&(B}p)ÓRÈÅVB{Éð†dÚÊÖ‡Ä Œì_S3YŸœHÀN1{ Ù/ƒ¨=MEu×s¡ê8¦HIª8N¬b¨Öç8rR ¶ÈE!n0?Ð#Ýíz³F¡ôBÅ0ͽ¸ÄØ}‰X ¼'°tÁ5Gt5à%/z}Q‹,¤‡Y5=öŽHÓ³[´Œ*6Ѻ#fŽÐ‚k\£X K €a…8 )]HAI.ô©•¯ŒeF¦ÐÈc sBX‚ KYvŒ0ƒÛd¥æf³6èB7ŒQ‚8-ó=¸ü 4(äšÏÜT &nÔþÀ‚q‘f!©©gˆÀ Ý8ÁýÒ)°ÞÐÒ–¸ä8ŸµÉ‚¬ õƒ,TRÌc&Ë´P£N!E¦ìÖÙÎwZP›ÜôæC´à‡,K…hzK…°ÓðU`úQ“$„®ŠSZ jP‚$p‰#hMeÀŒs£)BÐ y,ã/õhQÍ‚Œ”¥Sµ`aÚÕ/öSƒ>ôé@€šÅ‹ZÓ•ÎüfBN ‹’ø‚1U „SQ LŽ‚õd]uQ-x‰R4P4è*R‚äðU!!í&:ÓŠM¹ÒÕE-Å%bí‰O}ò³±ê̈bG:Щwú!hOÇzÇ¥6õþ©QÍå.»ÍÅ"i¨Zý¢CNëT¨rç±ò¨ëZ#:ÑŠ2V˜XR˜?t“ÃÑä&ËZÙ|î¸j]XŸ(+YÞ ¯sY÷*Û“dÖ"sÕ­]5O.Ö“*†¥,â‹MÏJ5¦ñ¼çs1\f¤ºµt)l™ Þé2´ÿô®_}+¸±¢¹Ì8’BŠ‘¡=D¯ ¡)F¿k_þ.„ ‰#ˆ _›FM.Ùå.uü×ß’Ö§õLÁ͸#âÝ-IMºc.ã˜ÇþMŠ-ObbÚ2Õ¶ª}o¼0½õ¡á:†. £c,QVy&lÕ¬ŠÕ63ÓÌA9+œ“jÔ˰3¡WjdóY<{ì—wùß«ö+âì¯wâ¿ÎøÍGþ½ãÏË{é žúlýõAÿ|Â1Ÿð¾çþä³_¿èýÃWþÏ?z·§_ñ¸—Ìú-ùô{kí‡áñ3ýï_÷PåÿÚ.P X £i÷íVÛ¬oüúÏbí%Ðb¶°üêG7°ð:°ø,AU‰s°»þ<ÏKZPS îfÐUϼ´/oÐ_Pö 0òÄ×®V@;ŒKO‡ì ð÷ìNPSÐ ¡Žó|pyÀo©°ë¬ð ×N0 ac _çËì¼pK¸PðšP 9è ó ãÐõذC(PÖ®g°þpþ"NñCôÐ!íéÑ ±P<‘ž–ð%±ú Ä÷¯¥/¹dQúæpkÒPåÐØ«OQó>QZÀ𘠑ñÎÁÃgQó,qù(ÕPa°›¯gà ûq‘ ¬ÀŒ äiAïO1÷pí†Ñ26Ñ WÑï´ðuŠÑ­±2°‘Iqk¼QÉ1C1§¿ /gQp=±éPïQ70—±s®´öõÀ‘2ÄÑ Ò- ý~q6Ò²~Ì1!’ /ðýO ëqóÒ-nQ#±/YO?‘$ïð"þ'0#O68²-<’%ùŽ"·ðc²g’p`Ò&åÎ%ŸB"wsðƒ~(íQ‹Rñz2ãr>Ñ>ë3ÏBS?ƒð>»Ñ:ûÓ;—S@÷ÓÖpq=Ó3ϳ@´ýÔóó#›ÓA…BRA?3A ”'¿S3tò6´-==Ÿó?çD¯;Q¥BoE ¥E OD9t8I”@Âó3/t6pTu4S42g”CÝ“GEóEk“FGóDq¦H-“B4I¿îH;$F£t,mô;Øs'ŸA±CÓG-£J›/L)£IÃK­ÔìÊEÕôJ ÔM3 •“;RH}qIiH‡þpJ9dLS¯OJÏÒK¯qO»“H%´?Ùô%•$UOãTN}JKI2Q%5ùS{/OóåL3M7Õí:u*UT·Ni4TOñN»RíÇ6#íSpUOµñ€“ý0[ÕVyÕ"SÕ&}u:ÙÒ,•@þõŒ<Õù õGmUeÕQëóUbVgWëZ?­NûóRmUY¿ƒY75\sfZë³V·UJI5;MU]'Uã4]ÒY RWo°Z—2V;ó\{q^m5_ÓZ…uS öþê5!ïµ ¶ÙU`‹ÕaaÔ]Ó¯\ÅtbûXßÕéøUTv)®õ =ö ¶+þV8¿õT+öb.Vc)†cEõ_[6 Tf›5c4fËÐdORdAˆe÷¯gª_»ô56h‹³W¶M5vg¯¯i×ñió·Žj«Öj¯k³Vk·–k#¶ ¹lÃVl·Ök©tlÏm»*âÒ–mÛÖmßn#,Ò,nëÖnïVl³Õóð–oûÖjõ–{Âo—pñvm q÷jçv ×qWkËÖO!—r+—p%÷F-Ws7í6×s?wë0÷XA—tK7k×tSwl;Wuëu[—r7"a÷mewy—v)—us—wÏÖv Gp{WxOWç†×xµöu…7y×p‹—þy³Vt© ¦—z«×z¯{³W{·—{»×{¿7¨ÔÀ—|Ë×|¿W|õì|×—}©7Ò¤·}ãW~ç—~ë×zçìW÷—Í"-ûW€8{ÿw¬à—€Xù÷}ظ{ñ‚'˜‚½7}K«‚3Xƒø‚ *€7„!x|C˜„KØz;x°LX…W8‚ Y†Ïw„cØ~˜†AØ€Õ÷†ç7‡}êƒw˜‚gˆ‡ø|{x“^˜ˆ“x{mX‰›¸…؉§—‰£x€§˜Šµ…çV‹·˜‹»Ø‹¿ŒÃXŒÇ˜ŒËØŒÏÓX×˜ÛØßŽãXŽç˜ŽëØŽïþóX÷˜ûØÿY™ Ù‘Y‘™‘Ù‘’#Y’'™’+Ù’/“3Y“7™“;Ù“?”CY”G™”KÙ”O•SY•W™•[Ù•_–cY–g™–kÙ–o—sY—w™—{Ù—˜ƒY˜‡™˜‹Ù˜™“Y™—™™›Ù™Ÿš£Yš§™š«Ù𝛳Y›·™›»Ù›¿œÃYœÇ™œËÙœÏÓY×™ÛÙßžãYžç™žëÙžïŸóYŸ÷™ŸûÙŸÿ Z š  Ú ¡Z¡š¡Ú¡¢#Z¢'š¢+Ú¢/£3Z£7š£;Ú£?¤@CZ¤Gš¤KÚ¤O¥SZ¥Wš¥[Ú¥_¦cZ¦gš¦kÚ¦o§sZ§wš§{Ú§¨ƒZ¨‡š¨‹Ú¨©ó9 ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_33.gif000066400000000000000000000211471343257752000273420ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÄ¢¤$"$lfdŒjdÄ‚„lRL´bd´’„ĺ´T><<2, \NLôâäÄ–Œ”vlÔ¦”\F<„zt”"$¤–”¬RT|b\D:4Œ24äÚÜܲ´$ÄšŒ|jl¤‚tŒ4&$lZ\¤~tÔªœŒnd¼rt¼šœüòôœ~tܺ¼ TJL¼’„Œ><ÌžŒ¤ŠŒTB<¤BD„´Ž|D2,dVTœvt|^TœnlôÊÌ´jldNDdJD¬Z\„f\L:4üÒÔ„j\4.,tZTܪœ”rlì¾¼¤JL̪¬,"ôêìÔ¢¤\JL”*,|f\œ24ìÞÜ,¬†|Œrtüúü亼¼–”ÌšœTF<„ ÄŠŒdRT„jlt^T Ì¢”lVL´’”<64Ì’””z|\JDìÖÔ䲤$Äžœ¤‚„Œ4*$Ôª¬Œrd¼z| ¼–„œ:<¬ŠŒD6,œzlœfd¬žœ¼jd´^T¬NDœ‚„ôÆÄüÊÌ̦¤t$<.,ľ¼dRLL>4,&$ìÚÜĆ„´fdôæä”&$¬VTŒ64ܶ´ÄžŒŒ¼vtüöôܾ¼  ¤FD„´nl¬^\Ü®œ¤NLôîìÔ¦¤”.,œ64üþü侼̞œ„ ÄŽŒ„nl´–”Ì–”¤†„Ô®¬œ><¬ŽŒüÎÌLBD<24”vtÔ¦œ\FD|bdD:<$Œnlœ~|Ìž”TBD´Ž„dNL„jdtZ\,"$|fdTFDt^\lVT4*,¼–ŒD64œztL><ÿÿþ!ùÓ,ËíþU H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -‰A€Ñ£H“*]Ê´©Ó§P£JJµªUL9µ«×¯`ÊK¶¬Ù³hÓª]«€†¬GâÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwhÁQ¦Ê›7c®{YqdŽ“G÷-­ZîãQÂŒÙÝ:sãÓSǵ¤”§*â¼Y1wÅ›ÝjJÅà —·oà®èÑófTœÐ®å2!Â&®“þ”Štb†ÜR"•J`·´4rŸÑ£Cšóé×7ïý;øu»ÃW]rËí÷œHGuØýÇvÝ}ÞxåÍ…›Fºq°ˆ<`ÌnvTGvX·Ä† !—†zèÚ"5Ô°ÈÙY(—‹d’É"j¸*,1[¹TÀ„b´×œ0 8#—%0aÁÈUä‘IÆÁb‡:H×(!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”ÉñŒ\i”Âg) ”r_!˜G—žºfè <ÔXc)‹6z0r©_¥ñYf¡yb(]L!W¦›Ê…h}ºÚc}z_¡þušêu‘:ê ¤r1ê¥qXjgaq ±ê\jÀœ\‘€G—°  ,‘ØúX²ÚEëæcÄ@£G)(É'Žré°ˆ'¢Å‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFºý"‚] LñÇÈ+]þ¶Wëµ£.œï—/Dà­\»\Êà ŒbAi£D,W¤ÝðÀ<ÈtàpÊ ç*éî݉eî1Ê ŽôºqD#xg hfÍ7ç|1BÐczìacpî¸4ÌŽÌÐq.O_–†'ÈÁGñXÕW¯¸ˆÍ8ÛZéÎ=ÿt™f£m4H× ´\M?µþœ Ç ì(FÈÉÄqÃ1sqprSxr,à‚ž¼¡,1<öDtG„²07ñK$Pf½™?ÊõÂ/dú˜è¤—Ð\àƒ~ݰ‡'~Ã(j4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…x¥ðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àÅ„ÇLµL=ãG—W#”Õ¥c“lŽÇâ°HÍ’1kXŪÓz=hi‹ÙD)—½ŽR“"Ûhú¼m®–(3 JVA®vr-%+»8¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\JWÃí®¿Þî=|gðƒ_vpl’WŸŽ‘¡úT ‡=õezP–<kMøF¾y‰êað Àì  íä/8ýk#¦±†9³i$x›~…™øþ@ÇA%"všeDóÞ¥nôË3$µ_ ÷åD5ØQaÑÔ¥Ç`1¦vÝ"`Р;ø*™ï ¥TûÎ*{Gí›kRì—Hô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿”¢`y†/¥œ[À 9©crþÚÚH%³«/G Î_VpØÝ*¸œ ΋궈Ë­F€,Óà8èóþ…ÀdÕ×\ü€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥<ÃÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÐà•æÖ4#»–fKiò þem»˜/Ds–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó8#ëqë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínq°ÃT hÈІ ¹Eê80zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–ËÕ Ô“Êsöñ$¯ïyIý SËí©U»]JkOU;ñ¨î kyl“×ÕÖZš4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rÆv€~" @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V) $­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢€`Ï0þÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋð £ F0b6˜0Xuóocu[d'#C0z1 [Ð¥Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹ÃCR]VzÙÖ‚H¸¬ÇC®‡‹PYu ‹h}tØ|~1{®L£p [P‚¿—A¸W[¼uÔT¥ ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†q@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçikˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh¨lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹¥OG™¾8Œ¹·{µ¦š­IpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3izPi3°y¥ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Úñ”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B£ öD^Ù•Öj½$PkýÖÙ¥~ t]×v}×x×z½×|Ý×~×>ðׄ]؆}Ø{ýCu¡°Øí0“  ^Ù˜ À˜Ù MœÐ m  | ¡Ú01 9@ ª ­À ª=Û+a Ÿ T w@Û¼m.0¬0O°½]Ü"QcàQ ` ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]ÞA ¨ê½Þm¥mÞð”`ôm  cPßOßü½9–Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿí5žã:N׊Ý×@¾*$@PäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!q¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB?Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI"À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%IJá9f6³VH&IØ‚!TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9U¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?£„¨.*Rƒº*V5uK ǸÉ9Ž9BO%W9‰Fkd9YQµ6‹ä¡œPªÕ,ñ *€âQ…š ÆÀ U|bX}Z@a UTa dkΞðUUh•«i…YU¯*’©Âf±xêH˜Jþ »žŒ¢ 'LІ¾zL 9ÀDIÀ‡ÂvŒ š¸I` ±ÆN, •ØDf5Ë‚H¢²£DD›…V´¢£ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN÷·Ànvµ»]îv×»ßovÇ0„×¼çEow16œ¶×½5•{û€úÖ×¾÷Åo~õ»_þÞý0}ÿ`/#¾bÀ| ¼`xÀ Æïƒ!œ_Ë—¾†è…Р‡[´€Ážð…3¼á xÁ ¶/ŠCLß #XÁ¾(á„þ>àâÃ+¶/ŒeLc#AÅúý±qŒß-ÁôEƒ!ð‹ Ô÷ ¥0D œ†bÃÇÌ¡¯-Ìð =CÉ>vÃ/"‘Œ9B˘’¿ì_7 h6q}ÿ›'ú¢zÈE|ä"(8äf$о³˜Ý gØÈ –Æ2 û‚!¶ o€„RÔâ_(CœéÛh`bV`†€¥C¼"·ÀD«{éIûw±6C%<` _ø4¬Œ_[Hh†ð…(Ù Íðñ­ ‘ëúÙkGF‚!”ñ4È_v†,‚RPººøBŠí› þÐ× Åð*èÈ A@Ã…·ÝíoÇ{Þù²œE-hBÏbÀƒ>t¢×° $#V^Æ|lo|WÛÑ×Vp}m1 Hƒ¾k8€-¬  ú"bz,žD,|à ÞxÇ_>s—# ”¾÷€oþïlÃûkXŠ¡ä][ÜÂø@ ²üfü"Ð_C)~LDXÝGºÒk®sœ¯‚×öE8 Nß°#š¾Ð胠„5@ƒæH°öÖ°‹>8Á˜èÇéÛX™¾V˜Å!¢Nß\ º€FàïÀð­_îvǻދŽ\˜Á˜¸Å€ __eøØÂ¦/±?솗þ‚äº(EÞw­a»'GÃ/š1€úöA˜¦¯ €gx ]ÐÀm¡‹dDâçoøëõûÙÓ|‹ ² ü=ß9ÏBŸÿŒó(À Hpî°ú‹Ë=ãû•†¸‡¼~ö·¿ÑGׯ-‚ñÜ»ßþ÷_0ë­†m ÿøÀÜ/ý«þÀD@þ"@¨1ÀtÀ\À§y¯ ¤@Ì)ö’dÐÀ äÀôÀÁÁ$Á4A”_€¿dAŒ@¢iÀ”Áû{Á¡‰ÁÄÁõ«Áœ¹ÁôÁ ÛAœéÁ$Â+¿Ö;¿"TB#d¯ tÂ'T• D° <Á*´cÂ+ÄÂ, Á\Á%ôB<ÂýKÂ/$Ãû B˜Â2üÂ3|™4TÃ%dÓqÃ7,Â84™9¤Ã´CÂ>ôCêI¯A$ÄB4ÄC<¯õ¢®EdÄFtÄG„ÄH”ÄI¤ÄJt—€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_34.gif000066400000000000000000000210161343257752000273360ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÄ¢¤$"$ŒjdlfdÄ‚„´bdlRLĺ´´’„T>< <2,ôâäÄ–ŒŒvtdNDÔ¦””"$\F<¬RT„ztD:4Œ24äÚÜ|b\ܲ´$ÄšŒŒlZ\œvtÔªœ|jl¤–”4&$¼rtüòôܺ¼ Œnd¼žœŒ><ÌžŒ¤‚tTJL¤BD„´Ž|¼’„D2,|^TTB<ôÊÌ´jldJD¬Z\L:4üÒÔtZTœ~tܪœ„j\ì¾¼œnl¤JLÌ¢”,"ôêì”vlÔ¢¤”*,\JLœ24ìÞÜ„f\,<.,üúü亼”rlÌšœ¬ŠŒ„ ÄŠŒ¼–”TF4¬NDÌ¢¤,&$”z|œfd¬žœœ‚„ôÆÄt´’”$¤‚„¤~tľ¼ìÚÜĆ„´fdôæä”&$¬VTŒ64ܶ´ÄžŒŒ¼vtüöôܾ¼  Œrd¤FD„´nl¬^\Ü®œ¤NLôîìÔ¦¤”.,œ64üþü侼̞œ„ ÄŽŒ„nlÌ–”Ô®¬œ><üÎÌ̦¤<24dNLÔ¦œ\FDD:<$Ìž”´Ž„TBDtZ\„jd,"$”vtTFDt^\lVT|fdœzt4*,¼–ŒD64L><ÿÿþ!ùÈ,ËíþK H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -©A€Ñ£H“*]Ê´©Ó§P£JJµªÕ0µ«×¯`ÊK¶¬Ù³hÓª]«Ь@ÔÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwhaϤʛ7c®{YqdŽ“G÷-­ZîcO·dÁÝ:sãÓS«ñ$¦&Ôœq1×Å™Ýc@µð —·oà®uÈ‘sÆ“šÐ®å©B"®‹þ€Z”â†\KB`·´1r‹‘Óbƒ’óé×7ïý;øu»ÃW]rËí÷œHGuØý§ÆvÝ}ÞxåÍ…›Fºy`E< Ënp8¡†pX'ĆT —†zèš1Ä`…ÙY(×VL2‰c¸fL&1›°8AD_´×Ü- #×2aÁÈUä‘IªÁb‡:H—'!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”­QŒ\J€Â'( €rŸ ˜G—žºfè 8ÔX#(‹6zÝ-r™Ÿ PñYf¡ab(]0!W¦›Ê…¨}ºÚc}z_¡þušêu‘:ê ¤r1ê¥jXjgajˆ±ê\cÀœ\‹€G—°  ,‹ØúX²ÚEëæc¸#ˆ(É'ŽrÙ`&¢©‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFºÙ‚]0áÈ+]þ¶Wëµ£.œï—C@à­\³\Šƒ xbAižD,W¤ÝðÀ<ÈtàpÊ ç*éî݉eÚáÉ {ôZEj ³x` hfÍ7ç|]1FУrØa£pî¸4Ì{ÜÐ1,O_¦Ä)ÈGñXÕW¯h…Í8ÛZéÎ=ÿt™f£m4HÇ ´\M?µþœ Ç ¬'T¬±Hn¨±/sy°rL`r,à‚˜œ¡¬-<ö>t烲0gaË"Pf½™?Ê5„-dú˜è¤ËÐ\àƒ~ݰ‡'¾ƒ'c4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…xeðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àE„ÇLµL=ãG—W#”Õ¥c“lŽÇÔ°HÍ’1kXŪÓz=hiSÙD)—½ŽR“!Ûhú¼m®–(3 JVA®vr-%+;5¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J·Ãí®¿Þî=|`¸ƒ_rl’WŸŽ‘¡úL ‡=õÅrP–<kMøF¾y‰êa2a Àä íä/8ýk#¦±†B&ã‚c$x›~ñ„™øþ@ÇA%"všeDóÞnôK1$µ_ ÷åD1ØQaÑÔ¥Ç`1¦vÝ"`Ä Í¾ø*™ï ¥TûÎ*{Gí›kRì—Eô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿€¢`)†/¥œ[À 9©crþÚÚH%³«/@ Î_\pØÝ*¸œ ÎËêf…Ë­F€,Óà8èóþ…ÀdÕ×\î€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥CÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÆà•æÖ4#»–fKiò þem»˜/D³–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–s5Ü"ëjë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínj€ƒLcÈІ ¹Ej50zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–ËU ÔSÊsöñ$¯ïyI] SËí©U»]JkOU;ñ¨î kyl“×ÕÖZb4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'r¦Æp€~! @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]Vˆ°ô­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢~€`ÅÀþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋn` žp T0b6˜0Xuóocu[d'#C0zá U` Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcNþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹SCRN]VzÙÖ‚H¸¬ÇC®‡VPYua ‹h}tØ|~1{®LžÀ UP‚¿—A¸W[¼uÔT `ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†j@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçi¨kˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhhlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œ¨žè-é~¤h’d©hC«x­˜›ù%ÑÇta‹eOG™¾8Œ¹·{µ¦š­ÑEpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3irPi7°y ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Úq”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-BžöD^Ù•Öj½"PkýÖÙ¥~ €t]×v}×x×z½×|Ý×~×P%ðׄ]؆}Ø{ÝCmPœ°Øí,P@ WÙ˜ @P’Ù M–€ eP tÐ ¡Ú0Á 5॰ ¨` ª=Û+ š M° o@Û¼m+À§0H½]Ü"ñ\°ñ› ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]ÞÑ £ ê½ÞeP¥mÞðŽ0ô=›° \PßHßü½5PÐßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÍ5žã:N׊Ý×@¾*" IäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!j¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB_Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIÀ2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%I@á9f6³V H&IÈ‚ TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9K¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?žÐƒ¨.*Rƒº*V5uK ǸÉ958BO%W9‰Fkd5YQµÆŠÄ–PªÕ ¡‰&lâ Q…Ú ¸pŠRh"X}Ú6ŠR< dkÎðÕRh•«i…YU¯*’©Âf«xêH˜êþ»ž¬ ‰%FP†¾zl 5DI@‡Âv¬ ”¸IX ±ÆNL ¨Df5«‚0¢²s„D+T ¢ £ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØNWµ‰Dvµ»]îv×»ßoxÁË.À@¼çEozÑ›³àÔ½ï…ïŸØû‹ Ô×¾÷Åo~ï ýÚ— Ëìo€ûË_XÀ6p‚ë»ÌWÁF°~cá…úFøÁû½ð… lá g8 vp8Ìá“Ø¾rÀƒ‡l_VèB‹ ÆTŒaþÏøÃ ÆÙ è+âüšX¿>æ±ñKàÀbXÀCvlc 9Á ÎñŽG\á?äB V`E}ñ 9™À®ƒ-ä ‹AˆXOT¶2–ë f1“YË\ör}£  ýâ°€ R,â*_9ËAØr—ç°a3/§Ã€¾sž÷ €>«ùÆ!ž²ˆu!‰A„!õ=1°€cxÆÄ¢ŒC“®ô¥ƒðéPÓšæ4a! ý ÖÆF…QméWoºÓ‡Ž0míë\KšÒ¼~t”Kmß ›¢¾<C}×ðgV¸¨¯rQêf?;ÚA¸v¶·„i×·Úæ~ËVþ¬¡Âδ¥MmBùÐën÷»½½`ÃLÇõ]ÄžŸ]ïC‹!Ýñ&p™Ãíe'üÌA0øÀë;kýF<Þßv}-΃zgâ—·½ƒ eï¸}¸¯lÑðy››À õ™Íò À<¿ø&ðœÕMmw‹œÀ86ñÝs“üeÿÂüÀ†A â~˜Í…Q _ØÆ`Þ å™û¼¾WÏúÖë;õª×÷  ’_±ãasºØ'{¬ ‹?¹í¸¦¹ÑO†tW‚˜À1ÑõC:ÎAp…/z±?‚á^G¼âïx@ÃyÐ,v1ŒeïD“àà7üåƒ<9Ôþ›ÿ<õn2¤ Ùõ¯‡}ìñ»zµ^ö·Ç}îLûŽÙ^÷¿¾ìyÏ1ßßøÇÏðð'V|ä7ßùúU¾Är_êW¿¦9«Åv±}îwßûßøÅ?~ò—ßüçG?øÑï£/ùùKú??úc~ýõûû',ÿûÀ×ë?„ù¿4@Àƒ)Àd@K@€™>ë“À ´ìÓ¾ôÃÀ ÔÀ ä@ô[¿kÀô°ü—Áœ=öÛ;÷CÁì/ôtÁ„Á{‘Á Á´—ÄAÔÁzi/ Â!T•œÁ.õBÂ$TÂ%dÂ&Ô.ê‚Â(”Â)¤Â*´ Â+ÄÂ,ÔBr ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_35.gif000066400000000000000000000211671343257752000273460ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÄ¢¤$"$lfdŒjdÄ‚„lRL´bdĺ´´’„T>< <2,ôâäÄ–ŒŒvtdNDÔ¦”\F<”"$¬RT„ztܲ´D:4Œ24¤–”äÚÜ|b\$ÄšŒœvtŒlZ\ÔªœÜº¼|jl¤‚t4&$¼rt¼šœüòô TJLŒndŒ><ÌžŒTB<¤BD„´Ž|¼’„D2,œ~t|^T¤ŠŒôÊÌ´jldJD¬Z\L:4üÒÔtZTܪœì¾¼„j\œnl¤JLÌ¢”,"ôêì”vldRTÔ¢¤\JL”*,䲤œ24ìÞÜ„f\,亼<.,üúü”rlÌšœTF<„ ÄŠŒt^T„jl lVL´’”<64Ì’”dRL\JDìÖÔ|f\$ÄžœœzlŒÔª¬¬†|4*$¼z| Œrtœ:<¼–„D6,¤~t¬ŠŒüÊ̼jd´^TL>4¬NDœfd¬žœœ‚„ôÆÄÌ¢¤”z|ä¶´t$¤‚„ľ¼,&$ìÚÜĆ„´fdôæä”&$¬VTܶ´Œ64ÄžŒŒܾ¼¼vt¼žœüöô  Œrd¤FD„´nl¬^\Ü®œ¤NLôîìÔ¦¤”.,œ64ä¾¼üþüÌžœ„ ÄŽŒ„nl´–”Ì–”Ô®¬œ><¬ŽŒüÎÌ̦¤LBD<24dNLÔ¦œ\FDD:<$Ìž”TBD´Ž„œ~|tZ\„jd,"$”vtTFDt^\lVT|fdœzt4*,¼–ŒD64L><ÿÿþ!ùÏ,ËíþS H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -©A€Ñ£H“*]Ê´©Ó§P£JJµªÕ4µ«×¯`ÊK¶¬Ù³hÓª]«€‡¬B¨ÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwhÁO¥Ê›7c®{YqdŽ“G÷-­ZîãP½pÉÝ:sãÓSS EdÔ&'¨¤‰17FšÝdF½!—·oà®yС“&•Юå©B…"®þŒj´‡\LJ`·´…1r™ ¡ó‚Ã’óé×7ïý;øu»ÃW]rËí÷œHGuØýGÅvÝ}ÞxåÍ…›Fº …<€Ënr)JSªÔ<F³©´£mž…xuðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àU„ÇLµL=ãG—W#”Õ¥c“lŽÇ¨°HÍ’1kXŪÓz=hi£ÙD)—½ŽR“"Ûhú¼m®–(3 JVA®vr-%+;*¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J7Ãí®¿Þî=|aÀƒ_tl’WŸŽ‘¡úN@‡=õåtP–<kMøF¾y‰êa8Ñ Àè€ íä/8ýk#¦±†'g$x›~ …™øþ@ÇA%"všeDóÞenô 3$µ_ ÷åD3ØQaÑÔ¥Ç`1¦vÝ"`Æ Í¾ø*™ïL¥TûÎ*{Gí›kRì—Fô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿Œ¢`a†/¥œ[À 9©crþÚÚH%³«/B Î_bpØÝ*¸œ Î ꦅË­F€,Óà8èóþ…ÀdÕ×\ð€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥ ƒÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÍà•æÖ4#»–fKiò þem»˜/D3–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–s*ô"ëTë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínTN ‚fÈІ ¹Ej*0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–ËÕ ÔsÊsöñ$¯ïyIÍ SËí©U»]JkOU;ñ¨î kyl“×ÕÖZj4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rFÆr€~"` @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]VyÀä­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢‹€`ÌÐþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.ƲnÀ ¡à W0b6˜0Xuóocu[d'#C0z X€£Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcOþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹CRO]VzÙÖ‚H¸¬ÇC®‡ZPYuÑ ‹h}tØ|~1{®L¡0 XP‚¿—A¸W[¼uÔT£pºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†T@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçiHkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhxlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œHžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹uOG™¾8Œ¹·{µ¦š­ñGpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3itPi8°y£ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú‘”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B¡ÀöD^Ù•Öj½$PkýÖÙ¥~ àt]×v}×x×z½×|Ý×~×`#ðׄ]؆}Ø{ýCo`Ÿ°Øí(`` [Ù˜ ``“Ù Mš° g v ¡Ú0 6 ©ð «  ª=Û+! Nà p@Û¼m.ðª0I½]Ü"_àž@ ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þ ¦Ðê½Þg`¥mÞðPô]žà _PßIßü½6`’Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÝ5žã:N׊Ý×@¾*$@JäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!T¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB_Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%IFá9f6³VH&IÌ‚ TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9S¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?¡èƒ¨.*Rƒº*V5uK ǸÉ9N6@BO%W9‰Fkd6YQµ ÌašPªÕ$Ñ 'xQ…š ¾ ŠTt"X}ZÀ$ö‹ðˆ»ÁÇ/›Nîš³›ê ‡¶Ž[\ˆE´aƒÈÄ"ðüôEK{ ú}o!†AL¢ÞE³Q½á¼ga{v§÷~a[ÈyÅhÆÛáÐâdô½U:¯_ la›ðŽïº’“Ál¿ë<ÚaÄ26±‰e$þÂê÷íÁưŒ[ G.“ e)Ïçz6Ç/\: xÅ F#QBû¹ÞyŠ< ôâä<2,Ä–ŒŒvt\NLÔ¦”¤–”„zt”"$\F<äÚܬRT|b\D:4Œ24¤‚tܲ´$ÄšŒœvtŒlZ\¼šœÔªœ|jlܺ¼4&$Œnd¼rtüòô ¼’„Œ><¤ŠŒÌžŒTB<¤BD„´Ž|D2,dVTüÒÔœ~t|^TœnlôÊÌ´jldNDdJDäÞܬZ\„f\L:4tZTܪœì¾¼”rl¤JLÌ¢”,"ôêì”vlÔ¢¤”*,\JL|f\œ24¬†|䲤,„j\亼<.,Œrtüúü¼–”ÌšœTF<„ ÄŠŒdRTt^T ”ŽŒlVL´’”<64Ì’”\JDìÖÔ¤‚„$ÄžœœzlŒÔª¬4*$Œrd¼z| ¼–„œ:<¬ŠŒD6,¤~tüÊ̼jdœfd¬žœtjl´^T¬NDœ‚„ôÆÄÌ¢¤”z|ä¶´t$ìÞÜ„jldRLL>4,&$ìÚÜĆ„´fdôæä”&$¬VTŒ64ܶ´ÄžŒŒ¼žœÜ¾¼¼vtüöô  ¤FD„´nl¬^\Ü®œ¤NLôîìÔ¦¤”.,œ64ä¾¼üþüÌžœ„ ÄŽŒ´–”Ì–”¤†„Ô®¬œ><¬ŽŒüÎÌ̦¤LBD<24Ô¦œ\FD|bdD:<$ŒnlÌž”TBD´Ž„œ~|dNLtZ\,"$”vt|fd„jdTFDt^\lVTœzt4*,¼–ŒD64L><ÿÿþ!ùÕ,Ëíþ[ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -‰A€Ñ£H“*]Ê´©Ó§P£JJµªU@9µ«×¯`ÊK¶¬Ù³hÓª]«À…¬G²ÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwhᑦʛ7c®{YqdŽ“G÷-­ZîãRÂŽÕÝ:sãÓSg)…ä¨)²´i1·E›ÝiNÁè —·oà®}àÁÓ¦T–Юå&‚$®·þœ’Ä"†\O$R`·´…3r¥ÁÓóé×7ïý;øu»ÃW]rËí÷œHGuØý—ÅvÝ}ÞxåÍ…›FºuÐÅ)JSªÔ<F³©´£mž…x•ðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹à•„ÇLµL=ãG—W#”Õ¥c“lŽÇ²°HÍ’1kXŪÓz=hiËÙD)—½ŽR“#Ûhú¼m®–(3 JVA®vr-%+»,¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J·Ãí®¿Þî=|fàƒ_t`l’WŸŽ‘¡úR€‡=õ%xP–<kMøF¾y‰êaì0 Àè` íä/8ýk#¦±†9‚Ój$x›~)…™øþ@ÇA%"všeDóÞånô‹4$µ_ ÷åD4ØQaÑÔ¥Ç`1¦vÝ"`Π;ø*™ïL¥TûÎ*{Gí›kRìIô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿œ¢`‘†/¥œ[À 9©crþÚÚH%³«/G Î_ZpØÝ*¸œ ÎKêÖ…Ë­F€,Óà8èóþ…ÀdÕ×\ø€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥4ƒÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÓà•æÖ4#»–fKiò þem»˜/Ds–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó,#ëYë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínY¨R0‚iÈІ ¹Eê,0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë Ô³Êsöñ$¯ïyI- SËí©U»]JkOU;ñ¨î kyl“×ÕÖZ‚4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'r–Æu€~#  @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V}$­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢€`ÒþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋr ¥@ F0b6˜0Xuóocu[d'#C0zQ Zà§Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcRþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹ƒCRR ]VzÙÖ‚H¸¬ÇC®‡]PYu1 ‹h}tØ|~1{®L¥À ZP‚¿—A¸W[¼uÔT§€ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†Y@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçi˜kˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh˜lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œ˜žè-é~¤h’d©hC«x­˜›ù%ÑÇta‹…OG™¾8Œ¹·{µ¦š­[pC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3ixPi1°y§ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9ÚÑ”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B¥ðöD^Ù•Öj½%`kýÖÙ¥~pt]×v}×x×z½×|Ý×~×p$ðׄ]؆}Ø{½Csp£°Øí+p”° _Ù˜  p™Ù MŸð lÐ z@ ¡Ú0A 7P ­ ¯ð ª=Û+q ¡ Q t@Û¼m/0®0LÀ½]Ü"1cð1¢€ ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]ÞQ ªê½Þlp¥mÞð•`ôm¢ cPßLßü½7p—Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿý5žã:N׊Ý×@¾*%PMäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!Y¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB/Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIt‡y°‹è— §0Ä–»üe8Ë™Î>r´’Ìb&#†h„yp [ø eȲ’ËÂ.L£+ž­mßeäºÖËXq.¸k/L#¨‚3ò«_OÃÀÔhF€°äýB@0Ä `½aS£ZÕú55òkmlk»À<C2n‘ß2þcÃ;5Š}ìdç7Ô¹uWÌŠüá ù-†2†-i‚`Ñ´€ÃŠžpÀaá+NÁó›ŒäW ÅȯÃóK‹/g€ƒ3þœcCœbßýþ·~©üçý–üÜ<ˆÆ,}Ši|ã §¸Å1΃{£*É’ s¿™ür\ pˆE¬™ö²zÈj8À-ª Œ§£<¿Y_޽,c'ãû-0”¾ß[¨ÁäRg:+˜üð 3^ã<@øàõ{€Lô÷ñ÷ï`k8¼a·ÀÐ ®„þ`¿ÿ|è_~ H8kf<åûÛóO%ˆƒ! Á HxAòU … Ÿß]4™ȓAë_{ÃËçBóyÝlçsX‹æ2¦|:4ƒ×Ðw6ñ÷ „[dba¿¾~Yí‡L4CôCîÂø»þö£]¿ ÆòŠ¡/ýìoßÝ×; »…BˆP…h?É›8ƒhP1Èë+C&3NÛ° $3 8³4c:ó³ƒ3eHI€5¸³<Û3C£;`x†Hû@‹…„€{?Yk4˜ÁTû³78¸º Ü42»$Aä¹½C²k1cB"ƒÂ £™“¸£þ=KI²(Œµ*ÔÂ.”°[0HB±³B%µ'ü0'ôÂ5Ä1`Àj;°+t”,dÃ:´Ã;ä/9,:ÄÃ>ôÃ(ÔC;„ú"ÄB4DÌÉ4d`ÄFtÄG„ÄH”ÄI¤ÄJ´ÄKÄÄLÔÄM|Dj0C|CÃ?ÅQD°@l>$ÅTTÅ2Ô°UtÅWœ½Oô¹P„ÅZìCSÔT´Å]üC\Ì]äÅ`´C_t‘A<ÄcDÆd\ŽD\DNtÆg„Æh”Æi¤DOlEaÄÆa”ÅÚ£ÅlôÆ #ÆÆo$G#ÛF,ìÆrTÇR<Ç9LÇu„Ç GÇx´GVä;eÔÇ}”¯lÁ®ö È€È$È‚$/êBÈ„TÈ…dȆtȇ„Ȉ”È6 ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_37.gif000066400000000000000000000211741343257752000273460ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDÄ¢¤l$"$Ä‚„lfdŒjdlRL´’„´bdĺ´T><<2, ôâäÄ–ŒŒvtdNDÔ¦”¤–”\F<„zt”"$D:4äÚܬRT|b\ܲ´Œ24¤‚t$ÄšŒœvtŒlZ\¼šœÔªœ|jlܺ¼4&$¼rtüòô TJLŒnd¼’„Œ><¤ŠŒÌžŒTB<¤BD„´Ž|D2,L:4üÒÔœ~t|^TôÊÌ´jldJDäÞܬZ\tZTܪœ„j\ì¾¼œnl¤JLÌ¢”,"ôêì”vldRTÔ¢¤\JL”*,„f\䲤œ24¬†|,亼<.,üúü”rl¼–”ÌšœTF<„ ÄŠŒL>4t^T„jl ”ŽŒlVL´’”<64Ì’”dRL\JDìÖÔ|f\¤‚„$ÄžœœzlŒÔª¬4*$¼z| Œrt¼–„œ:<¬ŠŒD6,¤~tüÊÌœfd¬žœtjl¼jd´^T¬NDœ‚„ôÆÄÌ¢¤”z|ä¶´t$ìÞÜľ¼,&$ìÚÜĆ„´fdôæä”&$¬VTܶ´Œ64ÄžŒŒ¼žœÜ¾¼¼vtüöô  Œrd¤FD„´nl¬^\Ü®œ¤NLôîìÔ¦¤”.,œ64ä¾¼üþüÌžœ„ ÄŽŒ„nl´–”Ì–”¤†„Ô®¬œ><¬ŽŒüÎÌ̦¤LBD<24dNLÔ¦œ\FDD:<$Ìž”TBD´Ž„L:<œ~|tZ\„jd,"$”vtTFDL>Dà­\¾\ºC ”bAi¥D,W¤ÝðÀ<ÈtàpÊ ç*éî݉eêQŠ côšVDÓxd hfÍ7ç|1BУxèa£pî¸4ÌcÈÐ1/O_Æ,ÈÁGòðXÕW¯¸…Í8ÛZéÎ=ÿt™f£m4H× ´\M?µþœ Ç l)UÄIsXaC2sy`rN|r,à‚Ÿ´¡¬/<ö˜Bt'„²0wL$Pf½?ÊåC0dú˜è¤‡Ð\àƒ~ݰ‡'nC)h4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…x•ðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àe„ÇLµL=ãG—W#”Õ¥c“lŽÇ¬°HÍ’1kXŪÓz=hi³ÙD)—½ŽR“#Ûhú¼m®–(3 JVA®vr-%+;+¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J·Ãí®¿Þî=|dèƒ_t@l’WŸŽ‘¡úR€‡=õExP–<kMøF¾y‰êa@A Àè  íä/8ýk#¦±†á(ƒf$x›~)…™øþ@ÇA%"všeDóÞånôË4$µ_ ÷åD5ØQaÑÔ¥Ç`1¦vÝ"`Ì Í¾ø*™ïÌ¥TûÎ*{Gí›kRì—Hô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿œ¢`™†/¥œ[À 9©crþÚÚH%³«/< Î_bpØÝ*¸œ Î ê¶…Ë­F€,Óà8èóþ…ÀdÕ×\ú€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥$ƒÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÔà•æÖ4#»–fKiò þem»˜/D³–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–s+#ëVë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínV°CR0jÈІ ¹Ej+0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë ÔsÊsöñ$¯ïyI= SËí©U»]JkOU;ñ¨î kyl“×ÕÖZr4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rfÆv€~#À @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V~­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢€`ÓàþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋs ¥Ð U0b6˜0Xuóocu[d'#C0zQ YÀ§Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcPþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹ƒCRP ]VzÙÖ‚H¸¬ÇC®‡[PYuA ‹h}tØ|~1{®L¥ YP‚¿—A¸W[¼uÔT§ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†V@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçihkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh˜lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œhžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹•OG™¾8Œ¹·{µ¦š­ñGpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3ixPi2°y§ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9ÚÑ”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B¥0öD^Ù•Öj½%`kýÖÙ¥~pt]×v}×x×z½×|Ý×~×€$ðׄ]؆}Ø{ÍCt€£°Øí+€“  \Ù˜ °€—Ù Mžð kÐ {@ ¡Ú0Q 8@ ­0 ¯à ª=Û+a ¡ O u@Û¼m.®0Jн]Ü"!aà!¢€ ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þa ªðê½Þk€¥mÞð”`ôm¢ aPßJßü½8€–Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿ 5žã:N׊Ý×@¾*%PKäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!V¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB_Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI™­ ÛŽLÐĦÁƒ°ÿXt1K’`T±ËŽÈ1£-BÐjL/ÒŒ.±ÔRK.Ï„3N9çdþ³M‹c.O=›;sO?Á›3Ð+ͳóN—E4QE=ª³Ðß\4RIû$ÔÑG4P+3¥³RKσ”SòŒ(DÔN?½óOUWeµUWõdd‘Wg¥µV?=E58.àµW_6Xa‡%¶X^1Ác—e¶Yf9È5Zi%óäQˆ˜6[m·u4Q$ ÃnÇ%·\É”PQ¤0·]wÝU—]S”x·^{³ý"ÜV¼}â^ÿµóKDªv€Fx8 p¨e$"lI8b‰»‚Å.Fú‡F&æ¸c‘Vi€$.LÃc“†NJšäŠ“_þ:Lâ7`Æù]*4˜¤gŸþÀœ‡&—’PŽEQè@:¢Ÿ.†ºjr¥¦Új­³Åzk¯¥íúk±- {l³µ,ûlµ L{m·ƒkûm¹¿Š{n»Sªûn½IÊ{ï½ûöûnÀŸ{pÂß6üðrwu¶q`¥ÁqÉ{…VñôlÅœ9FY"óÌqµ¥PM´ÑÐEÇ”tIM?Ý$Ë,X@3>¡†Ì3ÝNÖ[ßòP„bÈ¡Û'TwÐy'îP¦¶b9œ'xš’<^Ø€ÇeŠ$,b&=Àç—;ß #*ˆ ‚ ¬4úò_ɲÀÓpEj2³‚-·àHB` ´ÈéÃYþÈ𳤀 Â+žþ2Sþ¡a ™ÈÄЀœýý†~*y]lfSò‘å=VèÌgÆS 89üKf4ӛܭè=8á)€2äœpEÇ£‚¶Ó"g1VPNž’ƒ-|¢yÃ+âð"H#$V2B$ªèÁ¢#ý‰"xÜóÄÀ¥°€RdTÂ)I‡BÉ  vÄCuèC! ÆE¶4H»‰ÀŒ0¨ñ/jc-ˆA Fñ‡]ô¢”ĤS8i-/0$Ahd#YÁÁÀ)ªÉ0"GOE„Ð>!À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%INá9f6³V H&IÔ ‚ TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9[¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?¥ „¨.*Rƒº*V5uK ǸÉ9n8HBO%W9‰Fkd8YQµV ÜážPªÕ,Š'ˆ¢Q…š ÂàŠV„¢X}šDŠVH! dkΔðÕVh•«i…YU¯*’©Âf³xêH˜Jþ »žÌ¤ ‰'L°†¾z¬8¸DI°‡ÂvL š¸IV ±ÆNì •èDf5ÛH¢²£ÄD{…W¼‚£ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN·±CDvµ»]îv×»ßoxň0„aãEozÕ+^Gx,8…o|åë*¸=Ào~õ»_þö׿ÿp€¬ßûØÀî/3êÛ±÷"ØÁ†°€ aÿNÁ ¶/~-¬a w8À–ðN„ýàðð…̱÷Ä NqŠa àþû2#ûEb|` 3¸À/Öp"Ša†-Ô¿(†Šq ç÷Çyàžñ CYÊTîÁNÀ ^œË À@™ƒ_\”!xèÅ!ðû‡gày¸o.​üþá(ó™Ó¬á0ßÉJf²‹×¼å.YÈD62~{Ìâó÷ÇøÄ!ʰ üžâЂŽíd SC Z F:ýéPãž544¬ -4¿y Æ%0gàW¨¦FÁ‡üÂa=€µ¬i½êV÷ÀÒ˜ÖtOMjU»Ò’¦´¢W<±ÙŬÀ/Ì€ßb,£Ø®Þ4]‹8hxÜåîAέaEþp:¿Êø~‘P üª¿µ(ð&¤‘ßGä¢ð–7½]Ünn{›Àõ^÷µ³½mig¸‘Àr¶íî\ q¸Lâh[Ã÷xÌr†€ÎàNâ˜Eò o=ð5ð›òåhøä=¨øÅ3¾é‘/\ãù]4µ ¬ Dè·Áøy~q‘†SÌœã¬øqÂÅ}otÛ»äN:~p þZßùMƒ1z@oÝÑü]zÓ7íut[xÂA—X‹ñ9â›xD’>…ZüéøÝEq ]üŸF³px-$ÞÔ¸V¼~y‘è,ƒ}¯3LÍø\+ý´xD~-yÍoþ¿|÷»Ú• ù¬Ã=b-Æ…!¤ñ‰OHîn2 `i¼üê[Pr"žå)W™øX¡OÀq çÆÅ2”‰G¤aÍm~³…iZ(]úÔ·¾é{ {Þû¾ÀÉçòò[?í¸ÏxÇâÇýûå?ÿ†û˜þû…±ûï¿»>a-æ¿üã¿ì0ÿC$ÀTÀd¿×Ó¿„Àä/<A˜¯ ÄÀù*9@†ÁÁ$Á4ÁDÁTÁdAŒ`p8 ”ÁÜ/ ¤ÁŒ@üÔÁ$@ôÂ"¤?!¼"4Â%Œ1$´%dÂ(Œ0'¬ ÌxÀ+ÄÂfÚÀŽéÀôÂ/Ã0Ã1|Á”Â3¤0*|(DÃ6 05t6tÃ9œÀü¿¤Ã<ì8l9ÔC:äCsñÃ?tÃ@,—÷ÊÂDTÄW±C„Á®õ‚ÄH”ÄI¤ÄJ „ö¢®LÔÄMäÄNôÄOÅPÅQÔ–€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_38.gif000066400000000000000000000211641343257752000273460ustar00rootroot00000000000000GIF89aËí甆„LB<ŒBDìÂÄlÄ¢¤lfd$"$ŒjdÄ‚„lRL´bdĺ´´’„T><<2, ôâä\NLŒvtÄ–Œ„zt|b\\F<Ô¦””"$¤–”¬RTäÚÜܲ´D:4Œ24$œvtÄšŒ|jl¤‚tŒ4&$lZ\ÔªœÜº¼Œnd¼rtüòô TJLŒ><ÌžŒTB<¤BD„´Ž|¼žœD2,dVTüÒÔœ~t¬ŠŒ|^TœnlôÊÌ´jl¼’„dND„f\dJD¬Z\äÞÜL:4„j\4.,tZTܪœì¾¼”rl¤JL,"ôêì”vl|f\\JLÔ¢¤”*,䲤œ24,¬†|亼ŒrtüúüÌšœTF<„ ÄŠŒdRT„jlt^T ”ŽŒÌª¬tjllVL<64Ì’”\JDìÖÔ$œzlÄžœ¤‚„Œ4*$Ôª¬Œrd¼z| œ:4,&$ìÚÜĆ„´fdôæä”&$¬VTܶ´Œ64ÄžŒŒܾ¼¼vtüöô  ¤FD„¬ŽŒ´nl¬^\Ü®œ¤NLôîìÔ¦¤”.,œ64ä¾¼üþüÌžœ„ ÄŽŒ„nlÌ–”¤†„Ô®¬œ><üÎÌLBD<24|bd\FDÔ¦œD:<$ŒnlÌž”TBD´Ž„œ~|dNL„jdtZ\,"$”vt|fdTFDt^\lVTœzt4*,D64¼–ŒL><ÿÿþ!ùÕ,Ëíþ_ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -iA€Ñ£H“*]Ê´©Ó§P£JJµªÕHAµ«×¯`ÊK¶¬Ù³hÓª]«À†¬H²ÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwh!§Ê›7c®{YqdŽ“G÷-­ZîãSÂŽÕÝ:sãÓSg9µ$U¨*²¸a1—…›ÝkR½¸ —·oà®}äÉãæT–Юå2!Â&®“þ¤¢„Bˆ\Q(¥J`·t†3r§!Éó⃠óé×7ïý;øu»ÃW]rËí÷œHGuØý—ÅvÝ}ÞxåÍ…›Fº]àÈÃ)k4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…x¥ðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àÅ„ÇLµL=ãG—W#”Õ¥c“lŽÇ²°HÍ’1kXŪÓz=hiËÙD)—½ŽR“#Ûhú¼m®–(3 JVA®vr-%+»,¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J÷Ãí®¿Þî=|f؃_p`l’WŸŽ‘¡úT‡=õåyP–<kMøF¾y‰êaî ÀàÀ íä/8ýk#¦±†AÂÃj$x›~9…™øþ@ÇA%"všeDóÞ%nôË4$µ_ ÷åD2ØQaÑÔ¥Ç`1¦vÝ"`Π;ø*™ïL¥TûÎ*{Gí›kRìJô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿¤¢`™†/¥œ[À 9©crþÚÚH%³«/H Î_XpØÝ*¸œ ÎËêæˆË­F€,Óà8èóþ…ÀdÕ×\ö€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥4ÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÒà•æÖ4#»–fKiò þem»˜/Ds–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó,#ëYë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínY¨ÃT0iÈІ ¹Eê,0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë Ô“Êsöñ$¯ïyI= SËí©U»]JkOU;ñ¨î kyl“×ÕÖZ’4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'r–Æu€~#° @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V|­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢’€`Ó þÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋq §@ D0b6˜0Xuóocu[d'#C0zq [ ©Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcTþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹ÃCRT]VzÙÖ‚H¸¬ÇC®‡ŽPYu! ‹h}tØ|~1{®L§€ [P‚¿—A¸W[¼uÔT©`ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†Y@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçi˜kˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh¨lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œ˜žè-é~¤h’d©hC«x­˜›ù%ÑÇta‹eOG™¾8Œ¹·{µ¦š­ñIpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3iyPiB°y©ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Úá”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B§àöD^Ù•Öj½%PkýÖÙ¥~ °t]×v}×x×z½×|Ý×~×P"ðׄ]؆}Ø{ÝCtP¥°Øí+P–Ð _Ù˜  PšÙ M  mð z` ¡Ú0a 5p ¯@ ± ª=Û+‘ ¢ S0 v@Û¼m. °0OÀ½]Ü"qbàq£  ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þq ¬ê½ÞmP¥mÞð—pô}£0 bPßOßü½5P™Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿ 5žã:N׊Ý×@¾*%PPäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!Y¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB?Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI²$°La\ÀÁ;¸pi0ß ,03¤Ñ….HƒaNt*rÌ‹_b]H‰½ MÀ ΀4²ï+lb›Â¹è…©áCÌâ¹ÐD¹Ý¼ƒiþWûÚ÷%Á°‹íjœ9¿ÑP„áå_ƒÀÚ³3xf8ŒÚpÐv (°]ÀͳHÁ}•á#ÛîqÁï{p '¢Å®¸/r!ŸAâßA,¾ïÀô†™½wPˆhD£È`îC*j‘ ?üߍކ~~†$—\Ûi@A$±eôi¸o™sñ=ä&'0‹®íK}9Q/ºÈñ»à »<šPó¨< ãâTv¹2 1à–s|ë÷E1Ȱƒcxaé÷E€&üöûÖáw¯pâ/xýÖæ/s0”èÉw¿3æï¾Œ [ÞÞÞÁ.F}_ äþ¡ÈsxÁÂï» iØ¢vhÕõËíbñpÿ9ë]ûmÿ¢Û?™ƒ'€mü¦ Ä.þùžîŽ‹_ “NAѽ‡7áÖ%r|_\,C”D¡¡œâçï9ú\Çý€»ÿýðãYÕ¬¾Éd.fú×ßþô'{™ï¿þ÷Àù5ÿÀä?¬7ä#ÀT@3À˜CÀ„À; Ã5¯ Ä@‚*¢AH†ÁÁ$Á4ÁDÁTÁdA„ƒ_(; ”Ál@È{ÀÄAÿ«Áà»ÁôAûÛAùëÁ$ B™¿"TBü£@\Â'dB¢±À ¤Â*œp• šlÁ-äÂ.ôÂ/\ÁŒA($C;ÂŽIÂ2TÃÿkB\Ã7 °3ä˜4„Ã:¼/9œ:´C8ÄC‰ÑÃ=\Ã>Œ÷²ÂB4Ä=iÓÁ.õbÄFtÄG„ÄHd/ê¢ÄJ´ÄKÄÄLÔÄMäÄNôDr ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_39.gif000066400000000000000000000174021343257752000273470ustar00rootroot00000000000000GIF89a-¸çœ‚„LB<äÆÄ¤FD|Ä¢¤$"$|b\Ć„lRLŒjd<2,ܲ´´fd4d*,\NLôâä¼–„ ´Ž|ŒvtD:4\F<ìÒÔÔ¦”„ztÌžŒl|jl¬†|4&$lZ\ܺ¼œzlôÆÄ”"$¼žœÔªœTJLL64 TB4dRTŒ„jlt^T ¬VT„lVL<64,´’„\JDÜ¢”Ìšœ¬ŠŒ4*$œ~tüÊÌÄžŒÔª¬ D6,Ì’””rldRL$¤‚„Ì¢¤,&$”z|LBDìÂÄ|bdÄŠŒŒnd<24ܶ´´jlT>n©„ñ IÈB’kQU“ÉÈF:ò‘öäC ÉJZò’Œ”¤C(‰ÉNzò“ÔdC8 ÊRšò”Á%CNèÄVºò•°Œ¥,gIËZÚò–¸Ì¥.w©D(zdŠw ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™dÌ#*§IÍjæN• !¥5·ÉÍn~ › Ñf€¸à÷©A€Ÿ~ÔyvžÇZž7݃NxÂsžÝþs9·Ô‚º%¡ŸägBÄy:òܳ<(hƒÅÚ$4”O@•OD‡¡‰šÓ !²èîúÎ|â³<•˜B·46`ª¤Q@BÐõh¹xOVÒÿ„ôqI‹ÏM݅Ѫ‡¦êÙ)5o S 1@zBMŽšÓû´€ÿ„ªJ™®EâG£0ÀL=꟤ö”«A-—<}ªT—’µ£ðÉ*€ÖÔþ€­e«Šô¹Žg¥!¨Òü¨{ÅÈiíÁ„Ȉp„;`b†B”¢…4À–‡°†El­»¨AõÕPdhb NðUàCE»É&ª²Žõ,¡îe)>Õ*³›eþgkßÇ×BejL¦]l£•¾C–±Ð@4ájÀ·º5ÏlõF ØrV¹fº”emkPM!·²µr¤û[0·¸Ã½.c˳\IÕvcãìa»$Jh··ïånrÕ+Yúž§¼ª½¬A'•Q¬hˆ™ÞL&ÜŠ×çg9|Ô“ÄăWƒè5b[¹ÒÞs‡ñbÂkOÅ.¶fóÜ<çàÙyøó”àlm  ô• è…núwî²£+ŒT/ºÌEötŒ%áo:_(Ôc4¹Õ È]?OÖ#gu|©síLWù‰é•ö¯£7 u'»Ù)v±{½Ô*ÕÙÂ3ŠÁ–Õ¬6ÿª±sÿGC`XOC5‡‘Ó/tE€ÿg3øû§N˜53(5• ¸€ ˆ€åQòGìW~ùg€(X‚îÇ‚ç!‚¦óU 3'2s€Že:“>#è=&AX.ø~˜ƒß¡€IÀ€çw„†*Cˆ„ýÇ=È3>WDSSRÈ~ãg‚éñ}RC ±p9AƒMÅÎG†f˜‚UR£†¢ðwsxWT…2VUV8¨~æ”ð|37ˆþ8ˆIPˆ¥7ÁWq$ŒhMµv¨v²gyá1‰ˆ'œ¨7DI¤@ˆ°çs™˜—x©¨~Oò‰v牧$¡8Š¥¸ˆ§ÈŠ 38…G‰(Œ… AÒ{±¸‰¹X+‚¿ˆŠ»h†#ÀÇ¥7x†Áxˆ¸¸jÃ6àƒÞ#{¤WË‹›R‹¤hŠÏø8­h6͸mó6qó„sw›‹«h(É()V~X67 §0|ë(‰Ç˜ŽøÙŒò‹IÀ­Óye9²U{(;D¶EõXp8 ‚¦:¬Ó}„³‘ù‘«Ó:¦ àn˜©s’ß1þ;‘¨q·ã*+©nOB8ª¦‰Ì# Ù:¯3lpö“¸#6 =I”µ“6É’<¨kÎØˆ/’®kC “§c”Hi’TYP4¹hÞ($™™hð(p ¹$AÉpm©i>‰•cY–sW_™|vÙV@dÕøg™–kÙ=SùdS9—“9jâJs“ P:Ž.äQ—WI•d£•I‰•dC8K•nÙ=¤ƒ˜˜£9ÏHoI˜qI•*é”I@™è‘‘…,$L‰:«i˜™´i›P)… nUÃi‡XfV‰ëÓ µPp w m†>ãóP‡ø½ÏþD0âC>ù7d mÀc_%àó¥œØÈ>ÚÃ=U3žå$Ø9í³=ïÓÞYæƒ>û ž§³ÐÿùPõ)÷ Ÿì#ŸæiŸï™ŸyY6éÉŸÙu>½Eú$J µ‚¡š•ò QÛ)ø†åíÚŸªžßQ¢*£ßq á‘ êŠà‘°PA6ð—'š¢Ø8¡j£ß¡<Ìã<Œam dð>æ¤5E¢Ði¢Djⱡ€è¡Ýc¤L*¥Ýƒ£HzfÎCpÑsîÕ¢u¥• AB£éÑœÝC àžî“l r º¦u¢wŠž\Ú_&å9þƒÊrwè5y!\Ðõ!Ê.ŽÚ#‘š5“º%•j#—:cu!™ê•ó±? ²¨Ò©ÿPI˜pi%‰zV¬êI›šQöq@ ôHÙGêÒEð«6²…Ä«.UE>â«Q"¬5òª`¬âU’bAIƒ¬{T«ÑR­:­ÔZ­û­!­Öº­ÜÚ­ê­– ­Þ:®äÚ­à*®åš®êJV纪ëú®ð:­íJ.ûä|Ãê ¦¯ú JóÊÊšrj¯Pò¯îRûz°Ô¯yU"›ç™e ™½H O…°[I {QùA°å¡V‘·X`” 36‘ý²# >ñ"²$+þ/Ûvu±2›I‡ª8M"ž;Ö^9¶ƒée÷b_Žå_m`1sdÙecÆX@¶[Û9>Fc>P§ à¾"´D{c1‚³±õO+”µKEµ_+µT9¤ÐÐv³0V`XŸ9˵…µ^S6³v[H -€ ¨Ð§ùFk8Urˆ&qá!mÔfmGlpÉmï7^ ;7fÀ&Ž® µ®à+†[m×Öp®²·}¹nÖm•»T—{@–ë+1’mP>dàI°+p I` –¹ˆË¹zË·~oÖw·¾û¬5ë;M‚ ¥%|§ÇsžJQŸ—rÄV“yÅø{Èk|óHQÍþ[(Û²âñ¼©7uÅ;|¦‡½,«²Ù«²’b£ßAòÂm€X0  ÛKyÝ[/ß;uáÛ»¿»¿ ”±]h„é‡V¦S„›2ƒ5ø4¦ƒ‚bè†RS„hõlƒXó¿ü±‘ˆ ’‰#iÐ,˜À(ŒÀl3AÁuÈ¿*¬AK¼W‡Žè|Þ¸Œ›ÓØžÕkŒãÑ9WËÈ6L ÔØ=.ìvʘšºAà!NPC[ÄC\PEl¼€ˆÄ¹Â\ŠÃêŸ £3R£œ>oZ¥ê¥åÊ7‡”lÉ«Ì5º§È‰ r€'¤(b0ßË?¦•Ü—£¬L¨SÉÎ?7ðwS"ªïAªô1ÍæÍ¢Í呯ÏÎмõ³H9€ — ±S@çœÎë "í¬Îâ<Ï ÍbÒ0^ã¬asÏù,#þ¬Ïô<Ð÷Í}Ð=2Ð ÝФ²ÐÑ-%=Ñ}Ñ4RÑ[S¯›õôO¨ŠÑ"íI !/[ÛþÑ5=…:Ò.I%M '‹œ@•„RõÒ:íH1Í%â± Õ=1»ÓDM³XVcMkd«5]÷"eH)ì³m·äådÔbßa\Röaõ2Xs+Y[­O# VVÔfíGû¸w™¸‚Ûq¸ÆhV™mÏÆÈ©•ööøæq׸àozÝ=)wÖ‚ÍGKŒÒg}Ëët¨GŒ&xWüv·zgçz¨7{ÀH{á›w€½rƒÝÙ"ä¿5…†Rc:\¨…ú9ÿ›…F“„Ø„©…5 œEÈØ˜Âž}Û,LÎÔ$†=ù‹Œ}ÚÃw¿ºø1\+Šç˜1ÌÃY¬ˆä(Ô&‹ÛÒþ]Ϻ AMÒÆ·é=M%Æm|ÆÚ-5tý”$‡wG™™–²I™bŒ<Ýî-ÉÕÝAM’¦¤Œ£ù÷=JßéãÉ¢<ËȬNöýZZ €Êpš§‡( -ýÞ ž?=ý!ÞÎÇ9#ñüÎÞáìß®Ðbͳ~âÓôà(¾â­â,þâíâ0>ãâ,ã4®5ep㎠³‘>þã@äB>äD^ä0Ð*`äJ¾äLÞäNþäѱ¯QåV~åXžåZ¾å¯\æb>æd^æfކ‘æjþfð°æpçr>çsA“à „@çz¾çþ|ÞçX!_À=ð~^è†~èˆþ…ÐK Œèé’>é&!` "ð™@éœÞéžþé _à¡ ꨞꪞè‘À ¡V°ê²>ë´®æp1_µÞë¾þëvQ _Pa.ìÈžìÊn‡ðᮾìÒ>íÔ^Z ‘_0ÕÞíÞþíDá_± JîèžîêNð&ðîðn’ ë^ïö~ï$a{°ï2@4°ïûžçø>ð_ðá_ð¿ð ßð ð ïð?ñ ññoïŸñßñÕ¾ñò"ïë ?þò&ò ^ò(¿ò,Ÿè*ßò0ótþò2_ó6O4ó:¿óz‘ó<ÿó@>ôD_ôf1ôFŸôJÏH¿ôNÿôRÑôP?õDŸЄFpõhDõ^ßé) g0öd_öföhŸöj¿ölßönÿöp÷r¿ö¯â_÷sž´0|ß÷~ÿ÷€ø‚?ø„_ø†øˆŸøŠ¿ø„v÷¯æzÏ÷ø•ßEƒ0)£yÐ÷Ÿ° ,‚ gàùµ°+P lÐ÷P Uà÷•Ÿù¬ïú”OEžúw ú™_Eƒðù¡?úŒÿûªÏøŽùÄï瓟ù–/ûÿú”Ï÷Sþ@ OÀ÷ 0 ‰0j@{?ÓŸš  0 @ùO`Êã_þ¿ýÖýʯýÔ¿þÙü¿Ïü‰?üÅÿt~üôßüÁ¿üíÑfР'øÄBYOÈsàÓA#N|˜aBƒ),èqš£F…PóÐNª.R0XÙc•-°Ú´*1°Š¬Tm ´âÈ’'Sµ€iè–œ>…UêTªU­^ÅšUëV®]½~VìX²eÍžE›VíZ¶mݾ嚂–F„Cé~Ä;ˆÀA£üˆÕaLOઢ±âáÄ@ïô+’nd²rM™’KÖÃU~JlþéÃÙ3è‰rùÉóÄÖÀN¹äyu×2fÍñL9ÈînÞ½}ÿ\øpâÅGnIîC¡Íëz´ëxД'. ûÁEC‡ÚÒ£x xÅͽoÏN=B9?Éy¨ià¢.ñç×K°ÞTÛoŒî¿AÞ{„tK.Ad°A„0B ÓZNºçòÂP¨Qžb Ê6 l°Â¤SE¤ªÄ½ì/Éìú¡.¶£ï.ñê¼fPFñ ±œ°H#D2I%—d¹ £³º 7 É#…²Î®Ob)áÆ¹ô¡*ÓãH$ ´Å p‘=Œ0<¾4!þ²I;ïÄ3O=÷䳸'¥Ä0J³` 5B™kF±@M,1ÍY"sÒ0"ÔPD§ÌôÐDgËl³4Ãj–\>QƒD[C-¶¾Þµ¶9ëì³V[oÅ5W]•ü³Ç@G•ì“UÚ¸—3bƒ•V(… «(%Lh½Óq a‰5vʇ-öØA)*„í¢#U§Yb¹£Ct’“6,(­¡À5IÜÇhÝ5_}÷å·_½ªP2&¸`ƒF8a…^߆8b‰'N2`†/Æ8c7æØ#‡)9d‘G&Y-‹;F9e•Wføã’_†9f™G>™e›oÆ9e—gæ¹gŸþ޳朇&ºh‚w:i¥—f:¹VÀ$j©§¦ºj«¯Æ:k­·æºk¯¿;ky›&»l³Ï†ëé°×f»m·ß†ûë±Ñ¦»n»ï¶Jh£÷æ{h¤ñyå—wô⟇>z©`—½z£i—>{í1§ÞzïqÆ~{ñǼûï‹î¤…‡2@ŽŠjéãðɧ¿~²Í??a( .!R„‡êì5Šõ4ÌyöC`þë¶¹ý¬{ Â@‡… eGD-f±ù)Ѓ×g½Œ ¨à]`‹u„/„áã5ࢠ© P„2Т +XE’”j‰d'=ù Qêu˜°Ä%*qâLjr“œ âˆ>ÑaP“'ŽämE"†‹ý ¢†7Ì¡§ˆ“Œ8GQrjác8G:RÌb˜Ø¦…»ÔA‹(Aø”Û<Æ#­y«b%*tæ3¡Š#I3Ó F5¬q lÕÈÑ@RµÀL´v„<êq•LÍjÔtà'Žu„e,f±TÌ7¿H Fr#:Hœìþó- ɇ˜ÑÏ@€ÐŸAs“ƬQ3Ý3 ¤–·Dæ~–)Vº²er”e8ÅY+‹…bXrxÁ]B‘ yi(B*á ªyjF“\‚Ê‘ç¹É uá(ÝbÎ6 sGÕ SàøÍq6Ô¡zªY ±KöÌ!UÈC¹æLiZKN÷Ö ØäŽ‚¤g -æ°‰Žh¤¾ŠÎ 9·ÖÔ¦²ØP5Q½©”~ E˜Fñ&‘°J“ƒX$?ñb*T© “­ê)^@úÉPêKÈNGÄÔT%*Lµ@¡ühzS²–59›Áº€ Äk(/8Àj¦DÈK`;q¼¾ú®q]¤U8WºÖeÅv½Ë­ÜÔÈ"²Æ-Üa>‘JëZÛjÅÀª ±‹* Â\hVÎv-øËŸÊØ‹ƒ¤ocðÓØf=»ZÖl†¡5Ú+4ˆ\¨òtªmmnuKÐþÏ<ñDÝ,01Š,dvr¸ÝmrwÛ[Ø6W³cUnt¥ËÛ×:׺:ƒîtµ;]æ^×»’AîvÅûÐHá çEozÕ»^ö¶×½ï…o|å;_úÖ×¾ï}EvÇ»_Ö¦à·ÿp€<`ØÀFp‚,`þ6ØÁ†p„%< ôâä<2,dNDŒvtÄ–Œ\F<„zt”"$äÚܬRTÔªœ|b\ܲ´D:4Œ24$ÄšŒ¤–”ŒlZ\œvtܺ¼4&$¼rtüòô|jl ¤‚tTJLŒndŒ><ÌžŒTB<¤BD„Ô¦”´Ž|¼šœD2,üÒÔ|^TôÊÌ´jl¼’„dJDäÞܬZ\ܪœL:4tZTœ~tì¾¼œnl¤JL,"ôêìdRT”vl\JL”*,„f\䲤œ24,亼<.,üúü„j\¬ŽŒ”rlÌšœTF<„ Ô¢¤ÄŠŒt^T ”ŽŒtjllVL<64dRLÌ’”\JDìÖÔÔª¬|f\$ÄžœŒœzl4*$¼z| ¬†|Œrtœ:4¬ND,&$”z|„nlœfd¬žœœ‚„ôÆÄ̦¤tbd´–”ä¶´t$¤‚„ìÞܤ~tľ¼ìÚÜĆ„´fdôæä”&$¬VTܶ´Œ64ÄžŒŒܾ¼¼vtüöô  Œrd¤FD„´nl¬^\Ü®œ¤NLôîì”.,œ64ä¾¼üþüÌžœ„ Ô¦¤ÄŽŒÌ–”Ô®¬œ><üÎÌLBD<24dNL\FDD:<$Ìž”TBDÔ¦œ´Ž„tZ\,"$”vt„jdTFDt^\lVT|fdœzt4*,D64¼–ŒL><ÿÿþ!ùË,ËíþS H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -yA€Ñ£H“*]Ê´©Ó§P£JJµªÕ,µ«×¯`ÊK¶¬Ù³hÓª]«Àˆ¬C¤ÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwhaϥʛ7c®{YqdŽ“G÷-­ZîcQ¹jÁÝ:sãÓSKE„'¤ y1÷šÝdH±à —·oà®wÈ‘ƒF””Ð®å ™Â!®±þz„‡ÜJ‘J`·t0r“ ‘Ãóé×7ïý;øu»ÃW]rËí÷œHGuØý'ÅvÝ}ÞxåÍ…›Fºq`E5)JSªÔ<F³©´£mž…xµðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹à%„ÇLµL=ãG—W#”Õ¥c“lŽÇ¤°HÍ’1kXŪÓz=hi“ÙD)—½ŽR“!Ûhú¼m®–(3 JVA®vr-%+;)¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J7Ãí®¿Þî=|`°ƒ_rl’WŸŽ‘¡ú6 ‡=õ%rP–<kMøF¾y‰êa: Àä@ íä/8ýk#¦±†B'óe$x›~…™øþ@ÇA%"všeDóÞ…nôK2$µ_ ÷åD1ØQaÑÔ¥Ç`1¦vÝ"` ;ø*™ï ¥TûÎ*{Gí›kRì—Gô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿¢`I†/¥œ[À 9©crþÚÚH%³«/C Î_^pØÝ*¸œ Î êf…Ë­F€,Óà8èóþ…ÀdÕ×\ì€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥CÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÈà•æÖ4#»–fKiò þem»˜/D³–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–s)ä"ëRë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínR€6dÈІ ¹Ej)0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë ÔƒÊsöñ$¯ïyI SËí©U»]JkOU;ñ¨î kyl“×ÕÖZZ4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'r&Æp€~!0 5@Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]VŒÀÄ­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢}€`ɰþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋo€ ¢  Q0b6˜0Xuóocu[d'#C0z! T`¤Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcNþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹3CRN]VzÙÖ‚H¸¬ÇC®‡VPYu ‹h}tØ|~1{®L¢ TP‚¿—A¸W[¼uÔT¤`ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†R@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçi(kˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh¸lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œ(žè-é~¤h’d©hC«x­˜›ù%ÑÇta‹eOG™¾8Œ¹·{µ¦š­ÁXpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3irPi>°y¤ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B¢€öD^Ù•Öj½"PkýÖÙ¥~ 0t]×v}×x×z½×|Ý×~×@&ðׄ]؆}Ø{Cn@ °Øí'@‘€ WÙ˜ P@•Ù M›° g u ¡Ú0ñ 4 ©à «° ª=Û+A ž Lð j@Û¼m*Ъ0H ½]Ü"á] áŸP ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þ ¦°ê½Þg@¥mÞð’@ôMŸð ]PßHßü½4@”Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿý5žã:N׊Ý×@¾*" IäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!R¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB?Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIŠ"BŠ“Œ RpØÔ8ÐŽ—I…0(ðe˜Eob‘@QN¥$#jõ!È•]½~íÚR+AÈBl g +!j<¨% )—Xì’Ö0=?Í1dŽ¢¢‚E•¬ªÓ aÆ& Vòd¯bÈ5°ñ@6Éþ %åÍE0rHbLë#¿d‹Ö £ä)3M3FœXñ"cÇÉF¦\øHËc•TÀòåR6„¦RD-©ÖEIUHªU”vŠ·š,´oäÀ‡Ÿ—\\+x¥¸´â¤”>o¬Œò"ûØ,È¿|a7ò¸B¯À¯Ô³Š½µ¬Èc»ÝÀX" )ÖXb‡±:Af?× :Æ D Á–6üŽÄãìÐâ?)4°Å”tJA)*bã*Þˆ Âk9<#QŠ9Ô2¨8™ ÛŽLÐÄ’‘ƒ°ÿXt1K’`T±ËŽÀ1#+ZÐjL/ÊŒ.±ÔRK.Ï„3N9çdþ³M‹c.O=›;sO?Á›3Ð+ͳóN—E4QE=ª³Ðß\4RIû$ÔÑG4P+3¥³RKσ”Sò„àCÔN?½óOUWeµUWõL‘Wg¥µV?=E5¸FàµW_6Xa‡%¶X^-¡c—e¶Yf3È5Zi%Ûd•O‚˜6[m·u”•O éBnÇ%·\É@¢”O¼0·]wÝU—ÝQx·^{³Ý"ÜT¼eâ^ÿµsJDªÖ€Fx¸hxe¤ `I8b‰»j…„+FꀆE&æ¸c‘Na€¤+HøÂc“v„†LJŠdŠ“_þW7LÊ„†4`Æù](0ˆ¤gŸþ Aœ‡&WOŽöä“OÜ@º¢Ÿ.—†ºjr¥¦Új­³Åzk¯¥íúk±- {l³µ,ûlµ L{m·ƒkûm¹¿Š{n»Sªûn½IÊ{ï½ûöûnÀŸ{pÂß6üðrwu¶q`¥þÀqÉ{…VñôlÅœ¹DI"óÌqµ¥PM´ÑÐEÇ”tIM?Ý$ËjX„08A†Ì3ÝNÖ[ßòP„bÈ¡Û'TwÐy'îP¦¶b9–'xšr9Xð€Çez„9^¦<Àç—;_ !&€‚ ¬4úò_ɲÀÓpEd2“‚-·àˆZ „ ÁȱÃYþÀÀ³l Â+žþ2Sþ‘Á —¸„È€œýý†~*y]lfSò‘å=RèÌgÆS,9üÛf4ӛܭè=8!)€2äœpEÇ£‚¶Ó"g1RPNžb+p¢yÃ+âð"H#äVÂ#ªèÁ¢#ý‰"xÜó¼ ¢¨RdTÂ)I‡BÉ  vÄCuèC! “ÆE¶4È»À„‚!¨ñ/jc-ˆA Fñ‡]ô¢”Ä$R8i-,0$Ahd#I¡¸)¢É0"GOE~оÀ2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%IHá9f6³VH&IÊ‚ TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9S¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?¢Ðƒ¨.*Rƒº*V5uK ǸÉ948BO%W9‰Fkd4YQµö Äa›PªÕ(á &|B Q…š º ŠTxBX}š>QŠTx¡ dkÎðÕTh•«i…YU¯*’©Âf®xêH˜*þ »ž ¡ É&Hp†¾zl4¨DIP‡Âvì ˜¸IN ±ÆNl “ÐDf5›@¢²“ÄD;…U¬Â £ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN—º_iD ´»]îv×»ßoºð–×¼å‚]]€SöÒ*ê†ä;_úÖ×¾óÀ}õ»_þö¿ï…« âëßþæ—ÀFp}à´ X¾yšÅª€`ë)Á~°‚ VëÀÀ±¨Â0hAá cØÄÖ0|K,ßA„A¾Æõt1þùÞr˜*lß;”`³(ÁLúøEÁ†0Xá/Ž1 fìaæüWÅ(ÖA,PQˆë 7àÁ JÐù®U¨2v\ßbœ9ÍÅx°,& et``,*qç.9Ìc^ñƒ7ŒÕëIO®ï H!_6 úΣ͆âÁ¨/€iðÀʼn^4–­àXFh³| 9TYaàA¦×L_XgúÓˆE MåU·z9öð £Zhú¶˜ÑŠ@,`àFË÷ÑÀÖA³uð J‹z××>v²— ì_ÙÔ(†äKŠ,Ü¡Â0p1nf5þC»Í솳µé‹mÛÜè–ï,-ho3G²è€| q€Gô¶1Žu møȱ–7~ç-p‚ÜÀthõ¨<àwÜãúí6©?>r’ûÊ%G9†C¾ñ”·<Á+ç0Ç]>óý«½hoÎ[5»Þ‚ ¾zÐ…>t¢ÝèGGzÒ‹1œœæOO±È¡>uÇœêW·ù°e~ušg]©æúÓ½^T°‡}æc—(Îu¾v?ñ®>WzÜå>wºéN7{ËÑ.ϲç=å{'gßý^rÀGSðƒyá“yxÄ{\ñ¿d|ãOüxX®—í—gް•šÝóvÞóŸ=z¯;zÒ—Þô§G}êU¿zÖ·>a;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_40.gif000066400000000000000000000205221343257752000273340ustar00rootroot00000000000000GIF89a-¸çŒ‚„LB<äÂĤBDTÄ‚„$"$Ä¢¤lZ\”b\¬†|ĺ´T><ôâä´bd$dJD<2,¬šœ ìÒÔ|f\ŒrttÔ¦”Ä–ŒTJLܲ´Œ´Ž|”"$D:4”z|ÄšŒôÆÄŒZT4&$ÔªœÜº¼œ24|^TüòôdRL¼–„ ¤–”\F<¼vt„nlœvlÌžŒœ‚„$üÒÔ„f\”rd„ ¼’„TB<äÊÌ̪¬tZTŒndD2,äÚÜ„¬ŽŒŒ.,L:4¬RT4.,ܪœì¾¼lRL¼žœ¤ŠŒ ”JL,"Ì¢”´Š|ôêì´jl„Ô¢¤\JD䲤üÎÌ亼œ:<üúü¼–”Ìšœ¤‚t,”vtt^T¬Z\ìÂÄlÄŠŒ¬ŠŒdND¬žœ|jlÌ’”´’„œzlÄžœüÊÌ4*$Ôª¬|bd  ¼~|$„jl”vlTFD”jdD6,ìÚÜŒ”*, ¤NL4´–”´’”Ì¢¤ä¶´¤‚„œ~|œbd\|<.,ľ¼ôÊÌ|b\¼z|L>4lVL,&$\NL¼šœäÆÄ¤FD¬Š|ôæä´fdìÖÔŒvtܶ´Œ”&$ÄžŒÜ¾¼œ64üöô„j\„ äÎ̬VTÜ®œ ôîì´nl„Ô¦¤ä¾¼œ><üþüÌžœ¬^\ÄŽŒÌ–”Ô®¬ìÞÜŒ”.,̦¤¤†„LBD<24|fdÔ¦œ´Ž„D:®ÞK+=5·Ä1‡‚ÚVë­°‹>xã´×Nâ)nûî†?^ºÕf¢™0%›׉4ߥqGͯØâ‹Àï¹0é¤o1Æ3–LBH£­Ò‰´€éHð LÏûùµã^‘îè·ï>yÕüþüôs} •MÖ¯?ï[ 2 óû  ó£>аo€Ü’±‹:ðî)àDÁ Zð‚<™%2Œ;4ム¡GHšð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡þ@ ¢‡8ÄjÜo#Êxš—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ&v(ƒpŒ£縥 F„‚tÌ£÷ÈÇÙ"xì£ IÈB¾ç ¤!ÉÈF ‘Q¤#'IÉJ>’ ‘¤%7ÉÉNò“ é GIÊRšò”¨L¥*WÉÊVºò•°Œ%è‘$¶ñ–¸Ì¥.wÉË^úò—À ¦0‡IÌbjñžL¦2—I;P.D“ÌŒ¦4§ù)g*š’A5Ü$ÜÁwc8Ó3NNù®œÔ$7Ñù»t:N>ÚÜR5ðôyÞîˆëþÊŸzÊÉNóàmcO|Q.ý§ŸäAè‚úžs†ˆ¡»#èyòæÎ}ÆçŸÅÒ-~±°J <ÖL6ú^ô¢¡ß1¦Q‹®=-ý‘C+ª•º”¦æ‰)L ¤aP§ë€O™†ŸjÈ©žG OH2Ò ¾GòƒéìÄΗ’Ô\3ÅéDªÕòèª@‚Fˆêˆ•¬ö©½p Öñ,õ #Í›Ÿ•¯=­=Éh%¦¡ eïP‰ZÔ·îZž½öõ¯ˆR£$5×BÕÊ€@Ò8‚dXâp¨Áèj¨Ä –°”%T¾,ŧÇFöå$-¦BËÙLÉmž]þì©Îv±0Ã/PôÝš°Š=j“ÈJÖ<Ãe¬hsª)à Öm´í™sqë[ðøvºÂ%ßjë±ñÖ¯³ Òl%ÝèÚ6¸8ønñÔ›Ý=mw¹ ”Áôc0ƒ·mgÞ4ÛÛš‡Mn²c-‹YͶ–g¿„5V{/Ø<ìí/zÃ4¦ÝZw·Øuíd¬àÕòWµþΛâ4§:‘g¼µÕ°„Ÿ[ÜÓ)ÂèÉ+Ìp)¹¬ul†½JcWJ»ƒjíŽ902ƒ¤øT™>Éù,f9«t-­Ô.CZÔ²¶ Œ*[ËÕºV“£…6ÀJV“­þH côbY2xò´Â¼e¼)ËÉß‘]™ÏLrêw&3Ê…ƒ9k9[Û꘽4k+[Þ2´˜Íóçï˜ùXãüs ŸœÐrIzËÚâÖë>ý-GƒG‘Îò¤Ë£ihqz<^¾²~-jZ+ºÐªÞr¬¿³kJóyt›Î)x&Q G ²Î/õMêòØ Wº’”šÙìf8?|Ƙ²mž^7{Э25¤qMçUµ*§Ü&×¹E÷läjW½úÕ£Çê[ƒ{Ñ“¾4šy]„*'›‰à‘rŒš0š©Õx&7£½Š‚<Ï¿³œs \ wk’½¶äwJ*bV»X~þÛ#eeŒáÜßÉØÆ’†N“£cm[Ç>Ž´Àå듹# ó‹©2oÏ;æ°‘™­œ‚£yÈÁd¯”Ç|æsúÊ—v eøj ÉhÕσnž¤éè]¿ù݆îÕ¦oêÝ…ùÔcTõ«g]í@Ÿyy¼Nvò¸­¥‹ºÍÅsöïÜ<?ÝkžPò ,/ÓÁÓwóø `3ã¹Ä$¿tI‰L—/OàáÎu4½ín{{ã=ï¸Ì“žè"ú¿6°‚ì£ Kûé9v‡ióèøw¢A‡¤ ¾òg8xï{Ó“=øÿNò•ºñÄu|«³æ²{dü]¬èƒ šþëûÚ-Y«¶sa®iÛ~ÒÈ1ò—“ýŠÇZøå5ñ8Mü8¨Æ‹œ@¯ûÓ¿<ðW:îgH: U3þ5R6P$ú‡üÇ€ï‡3"‡wâá}à} Xá‘€A‚Ù‡ xhhµ Ô> È},Ç<ˆ;Ó3êe&5X#h3éÌ󀨃 @ uƒ<p7ƒàñ3A34{E(Tƒ3x}!cucÓP9MC„ã—~ÂY(€\¨4/øDÆ9G–<Í—;Ïg~Ô3Uꡇ [@ˆ‡|3#wux‡yˆ*dvˆw¤“tþ‚8w¦GV›Rˆà¡wŽ˜4_À8À?°7}“^‡z8vE…‡‰ “v‘X:“X‰—ˆ‡™ˆ›hUth‡Qø°ðui‰«}ˆ‹°è‰©7ƒ€x/‡ð[f l±ˆ³8;¥Xi³6mc€Pfz™g¹¨Šz§h‰¢ø‹µˆxyËÈ6†7rË€SЉè6»ØDà!‡Ss Ï@´ø‰Ñ—Œ¡¨/ï½H:ÉØV"¶VH†LWõ†°ã¼°Mß ©³‹§“:«Ã‚ít y‡ ©: B:À0 ˜f~ñ7‘ 9ñ§g™‘pXiJ³)É:Yö:'98ÏÔ+9þ’W:!¹o¬6“Ψ1Ù:·“OÒ’/ù1ù®‚“&»è x@žÐ A“¯#•B‰: ‘Jy‡I¹‹DI’p85Tæ z@Œ8À”N •³3”d39•s9 ãŒyƒ‘\0 £#—ti[)‘VÙ‘d”0¹—©=+wÙN¢Ã––ƒ9jX<åA•í“5ÙgXÉ•çQ€3”ppFi:€iU&™™w,£CVC?àašâñVWñ$>íáõNpª0 •`(ד=Û#}8€¯F›¶‰›º‰=Ú-v\ƒ}Öcœ½ùš{(>ä³0ɉZßœã1>ÒþÓš¸¸›Ç ]Ýó=nã½ù$ˆ_ÍɛלÑ#<Äe\ÖYÚ Ÿ¾ˆVëù³žÅÉž¿sžéٟ߉âQŸåŠãQ›·™›úÂ}â ü žÞ# ½© Ä ÃÉ j>®88ƒp–`rdy ª :;ùÙ›úÄÇ3ƒyÃa&)6ºR º¡:Uªžä9;/ &9:;£Æƒ<î¶<|(¡ÚN-Z)ò$Ê è!›Íˆ‹Ã ÛÉœAú›î¹)[°¥3ñ¥ÃQf¨¦©¹†ëÓ† OôA Vê.tÚ#wš5yº%{j#}:Ye!J”þòš"§ÿ1¨ÿaOõDOm ]©–¨ T¸è?BÈGªYì2Eðá©6p{$ªAµD>BªQ‚ª5B©’bªb©@Â@Lãªq´©ÑT’š«ºº«‡ã¦§¼¬Â:¬‡ä«¬Äš¬Êº¬îf¬«Ì­ÒšN¶:Ð:­Øš­T­q­6‚¨Õ(%°Œª­æêHÜ* Þª‘‚Qì*SâQç:¯‹”®¸:®‚É<õ®\µPáú•bTô:°ƒd¯ÈZ÷¯çVüzbµ<þرó»K¨Âû±yd°áQâ[­ 5¡˜cùÂ^„Åþôe_øÅ]B^çõ\Ô]4[:06q€[: ˆ &.[_÷&6¥ß±³âѳ?´L+TA[:»Ð c2s˜zC ³FûZ$›´|^f˜† ;¶$²:S „éšDZ%lSÖo_ÖNÄflÈ&q¶6jk+eõö:AÒkyâ³P«&s{lÉFhÀ€¶sÙ·p+kÛ´qð´@«&1B¿°=Ö0V\` Œ6¸u«ny†¸dú¶þVqG¶¨kAfˉA2zGyW³yàtxSyz×xR¦w·wrè¡˃c?´K2¬ëw¼»°¿k=´‘¼ÁËX­Ð@–ãÎ𠛣½þYqw8{‚ˆ{Ë—ºÞë@«k3˜R~@HèÕG…³ƒ‚*ˆ¾péw³8…ßW…ìʾæë‚ãK¿}†x½§|£=”¨ Œ‚¿ ¨¿“—¾õ‹†ßûÀ ¾‚XŠç‹ Ó¸)wŒ[0Œñg‹ãÁލ8ÓÈ,Œ{xŽ#,Àw ƒÔI€I@AYÂ|Â7'¦\é±ÜÃõ¾‡›¶UÉ ò i÷‹¤“—Dã1a9–ñç˜1i™ˆæ:I£Ä+M¼‡Aœ¸“y‡lûN\pôä T‹cÐ =“ų³Å£kÅùU>Ç@ ‘…–У…›ÂG:U >þA2¢%:OЦXÊ=OJ¥< ¦ê!È&j¤vü x,œ Úžñ$°ð Úö 0KsðLÈ’|Çy¬¡—œ¦°'Ç®l;ás Z®ì¡¨ô1ËæË¢ËåQ®¯Ìéã¬w”?Í †@ [¶?ÇœÌË "ͬÌÂ<ÍôËgü ÄÐÊ^E«asÍÙ,#Þ¬ÍÔ<ÎÍDÌ€t°äœÎê\GæœHè¼ÎðÏTÒΑôÎò|Ïø "±œÏüÜÏ"²Ï…cËLö›ß”ŽêÏÍHm*-å®RU–¥/lšÐMH ¢ [!°º¯mSHUÑ ýHôœIp Q ˰Êþ°½)<Ò.-Gá˲ô—µE«a„ubæU+@¦\&³+&[æ…*+¥.ö7afW3-¶/ÝÔª;Ò ±2½¶)ž[¸ç†N{šâb·’â¶Í–ÕÑh®ºBü¾Þ¶¶{ؽN½Ö¾²[Ã;{è¤w¿w5°ësO­Iv‚XrÇ+uqçjÍÖ„=@ᛃ›‚ÀyÃ<è´%X’]HXóˈ㷿FP9X†{x†…ÝÙ† ÕϤO 2ÌÁ÷é7µÈ$æ({”­4‚Â깋<;-íÙ¸ý>ákÅF jÜN½mŽé•¾Y:;™’K ÙJÃÆA"Å8`Å>9;†þšÛÔÝ>áûÇ{È$ÉíÒè¤âù¡Ü©4hjÈâéÝÅ->“\ÉV3›ªœ¡h:rG"ÎÕ]ߌsÑ.ãË8 ÐïÌöý߃ß&ÍÏ à^¶ }Mö SÜ,"á|àŽàážÏ^á>ΞáþÊÞá ÞÃâ$žº#~2ü }ëdÐ%Þâ¥rârÒ÷áÐW%QMß.žã?ãe"}UI¥ãD%<Þ2¾*áqÛEþä6¾(Ö38æÓCýÓ3[[BíÓ]ëlÚU]½…a&«bGýµˆå_KÓ²L ålþÏ .RMÖ'h^½¶`M=nËܾ&šþk2o¨¦p“vof½¸øVg³3Ømžè"Á©-w]»WÓxºËˆ|üø0 ‡uZ—×Äû¾›çºí„èŠ>꾎=†« …ï;ÞëgÙMXs>Ø;È<7›Ù;8;œM꺎!ŒŽÚŽþÚIÓÚ‚é¾çèë½x©XÛëxµ³í‡·XÜN¾ëÒîGoÎTqŽÜEÉçaMš¹ßØÜéMÖ\|“ÚŽ1.ù—D<;Î Ýݾ‡Ó=íðî RÞeÚ¥™4åMïÙêV³Þ©Lâý?ªÇ›’ÈïÍ ñ=8óï /ïÕW ~!ú )ÞþÝð G>!žñ6/!®ª_þò¦ò&Ÿòz„ò*ßòµúð«ñ.?ópÄò4¯£aƒó4_¬±aL>ÿó@ôºŠ0BßKŠ G¿ôLßôNOEÑk0õT_õVõXŸõZ¿õ\ßõ^ÿõ`öb?öd_öföhŸöjõDpF°ör?÷sŸW°Pàt¿÷|ß÷~ÿ÷€ø‚ø†Qø[áЮðWp má ` Ÿà ¨0†ù˜Ÿù˜Ï˜p¹ÐT ´ð·p—ÀùW m@ šßú®ÿútA m W€  `à ¸]€ q ›°¦À »ûÆüÈÿÀ ¦°›þàøA ~À q1W Ah W(üàþâß1à Pµ°š ÐA `  WЫ0þøŸÿú¿ÐH`±âS Y D˜PáB† >„±¡+b¹RKâFŽ=~RäH’%MžD™RåJ–-]¾„S¦SeBê°BæN˜e@y98犞EEšTéR¦M>…õ!WU :ØFêÖ„}\1ˆ¢*W²eÍžE›VíZ¶hq}动¬M¹HµuZÅÏÝK;b¹šƒWð`Â… FœØdŸW® ¹Ò†Ó•YŠ‹jÊÊéÓß+®°XþZôhÒ¥Mƒ¼ÔÁq¬Uv\¥øyºeŒOpW q|ÅŽlÞ½}ÿœ§§Ž‘•UåÊ+á&W™úC¥ ­Ü¬š_Çž]ûöÒs\9~€p.÷³¼õý -ääÝ¿‡_>L0¹ Î?)Ê”ã@wñÿ0@ç‹!7­ɇOVÓ A„0ÂÄXqÌ•Ê$üˆ“\KA: ?1Dò‚Çv¸eDŽűpQ1Fg¤ñ!RqÌQj„ˆŠó£‡$²ÈWˆÅ±O|0²¡0q¬ƒKš¤²J+›óѱ\8¹R!/P9….Ç$³LÃÞrLMÌDh“ c3N9çlþª?ëb: *Ð1°ö4PAOJÍ1Lü´Üv´QGm…â®@¥½@±PÏ:H7åTPïÛR&e¯SSO%³>Ç…t€ý®èUYgÒŽÜÚ0õ”¯  AZÃ[rûÓTNî¼Â¦`—e¶!€6Zi§¥¶Zk¯Å6[m·Õ¶€E à6\qǵV€¥ž%7ÝlŸ8ƒ'Ô…7Þt_h¶^ì0!}÷å·_ÿ8`&¸àu(Á`…f`ÌU ߆'&x(Æ8㉠×^à-F&¹d“OF9e•Wf¹e—_†9f™g&ùˆ“ ™fwæ¹gŸKþæøc¡{Ëùg£F:i¥S¶ù\‘—†:j©Gzh«K+zj­·æÚè¦#~ºk±Çf¹ê«Ï-k²×f›ì¯q»m¹»6m»S{n½÷öúf¤òæ;ð£ë¾»pÁ¸AîŒ~öC"Sðg²‘xü™1²je °"É$Ѫe -Ðê¼F(6‘dUTYÑx2%¨Pƒ¨VŠVXÂàí¾T¡uèÁ F– I´Âç3žÚøÆ8RíV0cÍHH=ŽL¸bG¶E*j2xa û´pI”ER k4Ù"á(GÔéñŽs¬ã+µÐÇ?r…Yg³zLã1ÞÕZ™[Õ«NØ”%›^i]–ôžÒ“œ<%„™û†:¼!e$>Y(¸[ þ—LÂîEíÈ.|2 ?±±f0E›_"³d‰>îo=8ÀPу d ÉzL ô ÂU®0É2Øä"sËNž©@)ìÞy¶ÀºBÕ`[2þS¤bþ°$©‹²iäA ©Á1„@(ËpÊ_îrôˆ Œ¬ÎwÎóžµ ¤¢Œˆ Áå§…y© c™Ï<25×3¦€h³¥•Ü»!ÙÔ'9²Où›²€Àñc«\à ¸¡§©@…qÍÍä2ÏÕ°ög«_ýæ}O=qTWòsg[ˆõ‹qŽKœâIç:>r©i|'"'9ä‚ r–;å)‡yßæóÏ­¼å7OÈËi¾sš™\&:çùÜlŽs¢ËèAG:Ë|“£'lC/úÍ›îtªƒnUWÔ£Îò©cÝéK‡I×½.5­oýãb;ÏÁþ´§]ie7ûÄÛîv˜¯Ý%s§»ÑàwSã=ï·{KüþwžíïDF—¼¿xÆ7ÞñðŠëÉ?yÊW~[¥><ÎðÎwÞóŸ}èE?zÒ—MÞô§G}êU¿zÖžKÙ|ëe?{Ú×ÞöŸBæu¿{Þ÷Þ÷¿~ð…?|âßøÇG~ò•¿|æ7ßùχ~ô¥?}êWßú×Ç~öµš€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_41.gif000066400000000000000000000173621343257752000273450ustar00rootroot00000000000000GIF89a-¸çœ‚„LB<äÆÄ¤FD|Ä¢¤$"$|b\Ć„lRLŒjd<2,ܲ´´fd4\NLd*,ôâä ´Ž|¼–„ŒvtD:4\F<ìÒÔÔ¦”„ztl|jlÌžŒ¬†|4&$lZ\ܺ¼œzlôÆÄ”"$ÔªœTJLL64ÄžŒ TB4dRTŒ„jlt^T ¬VT„lVL<64,´’„\JDÜ¢”Ìšœ¬ŠŒ4*$œ~tüÊÌÔª¬ D6,Ì’””rldRL$¤‚„Ì¢¤,&$”z|LBDìÂÄ|bdÄŠŒŒnd<24ܶ´´jlT>Á]GxGà‚ 6èàƒF(á„Vhá…føŸÝièᇠ†¨!$NÀÂúUCwÔñƒˆ(ãŒ4Ö!‡*hãŽ<öè#x1*áA µäGÊ`B„:äPF)e8r”à”Xf©¥“àÑÆw ÐDè0Á:¡D|€ÇGiÀ&¢hP ä•yfš`þpÉ àÐçŸ~G —@ ††qÉ (A"‰ß鉦š’Šùä–œvê)|Unt姤–jªxOz f.¨(Æþ*¨0EJP’Æ‹O¤AÉrPò](1&ä½묫bri$»l³J 0&ÒÊw@L«`†g¬¬´JÊê©ä–Ûi¨jîºìö$*Yd&±J\"¨8ŒðÝ—(p ŠJÔ!')M0J&yö~—/˜­*q‚ ÷ðwr²ï%ß q/á%Œ¯¾’ÒÛîÈ$ˈnFê–¬òÊNÚ à«w`JÄà…&x$ÀBI-7|7,y5Wг¤á¹i^LJ)͘r ^ÑJÜ æÌ,g­µƒ'c”òÖ`‡½ß¦R×{ïÂJÑ M8aèq\2s-ÁŽç1ÚKw+5þ,"ƒ§1ªŸ 2Ùbn8}]_ôõáŒ7ŽáH÷-²'Œñª ©m~w$*,©àäáæ¹ÞÒV@ ò*Ñ…¶Ü*ÑF9à ®ÞŽç®{y‰[´øîÀù“Dôpfj²à x°ðÝB`­D¬Ðâ‹U?ò¸Gn:%7ÈqÇ$4Ú$‘F»BÅ)äÁÇ_xïý.ÿýø“—‹œù÷ï?„ô£ˆýþGÀÜQÂc^È@üp"l µ€KP`‚Ì {(‘jðƒ ¡IÆÁˆˆA:H¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&6±âÈ%œFÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŠ¡÷ÈÇ>n©„ñ IÈB’kQU“ÉÈF:ò‘öäC ÉJZò’Œ”¤C(‰ÉNzò“ÔdC8 ÊRšò”Á%CNèÄVºò•°Œ¥,gIËZÚò–¸Ì¥.w©D(zdŠw ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™dÌ#*§IÍjæN• !¥5·ÉÍn~ › Ñf€ºà÷©B€Ÿ~ÔyvžÇZž7݃NxÂsžÝþs9·Ô‚º)¡ŸägBÄy:òܳ<'hƒÅÚ¤4”O@•OD‡¡‰šÓ !²èîúÎ|â³<•˜B·T6`ª¤Q@BÐõh4¹xOVÒÿ„ôqI‹ÏM݅Ѫ‡¦êÙ)5o S 1@zBMŽšÓû´€ÿ„ªJ™®EâG£1ÈL=꟤ö”«A-—<}ªT—’µ£ðÉ*€ÖÔþ€­e«Šô¹Žg¥!¨Òü¨{ÅÈií¹„ÈŠ€„;\b†B”¢…4À–‡°†El­»¨AõÕPehÃd NðUàƒE»É&ª²Žõ,¡îe)>Õ*³›eþgkßÇ×BejL¦]l£•¾C–±Ð@4ájÀ·º5ÏlõF ØrV¹fº”emkPM!·²µr¤û[0·¸Ã½.c˳\IÕvcãìa»$Jh··ïånrÕ+Yúž§¼ª½¬A'¥R¬hˆ™ÞL&ÜŠ×çg9|Ô“ÄăWƒè5b[¹ÒÞs‡ñ^â*OÅ.¶fóÜ<çàÙ¹øó”àlmØ  ô• è…núwî²£+ŒT/ºÌEötŒ)áo:_(ÔcT¹Õ È]?OÖ#gu|©síLWù‰é•ö¯£W u'»Ù)v±{½Ô*ÕÙÂ3ŠÁ–Õ¬6ÿª±sÿGC`XOC5‡‘Ó/tE€ÿg3øû§N˜53(5• ¸€ ˆ€åQòGìW~ùg€(X‚îÇ‚ç!‚¦óU03'2s€Že:“>#è=&AX.ø~˜ƒß¡€JÀ€çw„†*Cˆ„ýÇ=È3>WDSSRÈ~ãg‚éñ}RC ±p9AƒMÅÎG†f˜‚UR£†¤ðwsxWT…2VUV8¨~æ” ð|37ˆþ8ˆJPˆ¥7ÁWq$ŒhMµv¨v²gyá1‰ˆ'œ¨7EJ£@ˆ°çs™¨—x©¨~Oò‰v牧$¡8Š¥¸ˆ§ÈŠ 38…G‰(Œ… AÒ{±¸‰¹X+‚¿ˆŠ»h†#ÀÇ¥7x†Áxˆ¸¸jÃ6àƒÞ#{¤WË‹›R‹¤hŠÏø8­h6͸mó6qó„sw›‹«h(É()V~X68 §0|ë(‰Ç˜ŽøÙŒò‹JÀ­Óye9²U{(;D¶EõY€( ‚¦:¬Ó}„³‘ù‘«Ó:¦ àn˜©s’ß1þ;‘¨q·ã*+©nOB8ª¦‰Ì3 Ù:¯3lpö“¸#70=I”µ“6É’<¨kÎØˆ/’®kC “§c”Hi’TYP4¹hÞ($©©i'€ ¹$AÉpm©i>‰•cY–sW_™|vÙV@dÕøg™–kÙ=SùdS9—“9jâJs“ P:Ž.äQ—WI•d£•I‰•dC8K•nÙ=¤ƒ˜˜£9ÏHoI˜qI•*é”J@™è‘‘•,$L‰:«i˜©´i›P)… nUÃi‡XfV‰ëÓ µPp w m†>ãóP‡ø½ÏþE0âC>ùGe mÀc_%àó¥œØÈ>ÚÃ=U3žå$Ø9í³=ïÓÞYæƒ>û ž§³ÐÿùPõ)÷ Ÿì#ŸæiŸï™ŸyY6éÉŸÙu>½Eú$J µ‚¡š•ò QÛ)ø†õíÚŸªžßQ¢*£ßq á‘ êŠà¡°PA7ð—'š¢Ø8¡j£ß¡<Ìã<Œam eð>æ¤5E¢Ði¢Djⱡ€è¡Ýc¤L*¥Ýƒ£HzfÎCpÑsîÕ¢u¥• AB£éÑœÝC àžî“l r º¦u¢wŠž\Ú_&å9þƒÊrwè5y!]Ðõ1Ê.ŽÚ#‘š5“º%•j#—:cu!™ê•ó±? ²¨Ò©ÿPI˜pi%‰zV¬êI›šQöq@ ôHÙGêÒEð«6²…Ä«.UE>â«Q"¬5òª`¬âU’bAIƒ¬{T«ÑR­:­ÔZ­û­!­Öº­ÜÚ­ê­– ­Þ:®äÚ­à*®åš®êJV纪ëú®ð:­íJ.ûä|Ãê ¦¯ú JóÊÊšrj¯Pò¯îRûz°Ô¯yU"›ç™e ™½H O…°[I {QùA°å¡V‘·Yp” 37‘ý²# >ñ"²$+þ/Ûvu±2›I‡ª8M"ž;Ö^9¶ƒée÷b_Žå_m`1sdÙecÆX@¶[Û9>Fc?P§ ð¾"´D{c1‚³±õO+”µKEµ_+µT9£ÐÐv³0V`XŸ9˵…µ^S6³v[H-€ ¨Ð§ùFk8Urˆ&qá!mÔfmGlpÉmï7^ ;7fÀ&Ž® µ®à+†[m×Öp®²·}¹nÖm•»T—{@–ë+1¢mP>eðJ +p Jp –¹ˆË¹zË·~oÖw·¾û¬5ë;Mr ¥%|§ÇsžJQŸ—rÄV“yÅø{Èk|óHQÍþ[(Û²âñ¼©7uÅ;|¦‡½,«²Ù«²’r¢ ßAòÒm€X1  ÛKyÝ[/ß;uáÛ»¿»¿ ”±]h„é‡V¦S„›2ƒ5ø4¦ƒ‚bè†RS„hõlƒXó¿ü±‘x ’y3jÐ,—À(ŒÀl3AÁuÈ¿*¬AK¼W‡Žè|Þ¸Œ›ÓØžÕkŒãÑ9WËÈ6L ÔØ=.ìvʘšªB à1OPC[ÄC\PEl¼€ˆÄ¹Â\ŠÃêŸ £3R£œ>oZ¥ê¥åÊ7‡”lÉ«Ì5º§È‰ r€'£(r@ßË?¦•Ü—£¬L¨SÉÎ?8ðwS"ªïAªô1ÍæÍ¢Í呯ÏÎмõ³H:€ ˜0±S@çœÎë "í¬Îâ<Ï ÍbÒ0^ã¬asÏù,#þ¬Ïô<Ð÷Í}Ð=2Ð ÝФ²ÐÑ-%=Ñ}Ñ4RÑ[S¯«õôO¨ŠÑ"íI !/[ÛþÑ5=…:Ò.I%M '‹œ@•„RõÒ:íH1Í%â± Õ=1»ÓDM³XVcMkd«5]÷"eH)ì³m·äådÔbßa\Röaõ2Xs+Y[­OC VVÔfíGû¸w™¸‚Ûq¸ÆhV™mÏÆÈ©•ööøæq׸àozÝ=)wÖ‚ÍGKŒÒg}Ëët¨GŒ&xWüv·zgçz¨7{ÀH{á›w€½rƒÝÙ"ä¿5…†Rc:\¨…ú9ÿ›…F“„Ø„©…5 ¬EÈØ˜Âž}Û,LÎÔ$†=ù‹Œ}ÚÃw¿ºø1\+Šç˜1ÌÃY¬ˆä(Ô&‹ÛÒþ]Ϻ AMÒÆ·é=M%Æm|ÆÚ-5tý”$‡wG™™–²I™bŒ<Ýî-ÉÕÝAM’¦¤Œ£ù÷=JßéãÉ¢<ËȬNöýZZ €Êpš§‡H -ýÞ ž?=ý!ÞÎÇ9#ñüÎÞáìß®Ðbͳ~âÓôà(¾â­â,þâíâ0>ãâ,ã4®5fp㎠³‘>þã@äB>äD^ä1À)`äJ¾äLÞäNþäѱ¯QåV~åXžåZ¾å¯\æb>æd^æfކ‘æjþg°æpçr>çsA“à „@çz¾çþ|ÞçX!`À>ð~^è†~èˆþ…àL Œèé’>é&1` "™@éœÞéžþé `à± ꨞꪞè‘À ±W°ê²>ë´®æp1`µÞë¾þëvQ ``a.ìÈžìÊn‡ðᮾìÒ>íÔ^[ ‘`0ÕÞíÞþíDá`± KîèžîêN&ðîðn’°ë^ïö~ï$q{°ï3P5°ïûžçø>ð_ðñ`¿ð ßð ð ïð?ñ ññoïŸñßñÕ¾ñò"ïë ?þò&ò ^ò(¿ò,Ÿè*ßò0ótþò2_ó6O4ó:¿óz‘ó<ÿó@>ôD_ôf1ôFŸôJÏH¿ôNÿôRÑôP?õPÐFpõ`Dõ^ì(0h0öd_öföhŸöj¿ölßönÿöp÷lÿ þõvOé(@ ƒ°÷|ß÷~ÿ÷€ø‚?ø„_ø†øˆŸø„u÷ŽŸèyø% ràm€<À÷ŸP +°µÀ}ÿ «À"¸€{|Ï— ƒ0ù•ù™?Tú£¥¯ø¸ÿ÷¨ŸûƒÏøÿû¨ù‡_ ZÐkhÐ{ߢ šþ   °üÍOk@z/û{o¢ {OüÆüʯýÏüŠ`ýØÏûê¿ûêø¾üðÏéÂoø^P€Ð÷²{ø`K<ôRâàƒ„ÒéáÁ5!D‰ ±¦¡T^¦|ÚØñãA+\`µi¥pY©Ú(@¦ÃŠ36´pÉáĉhXTèP¢EEšTéR¦M>…UêTªU­^ÅšUëV®]½~Ö+ Z<ÍÖ¢e`ÑCQ 6¸tP”žv¤ Å­Ú‡D­¨3ËŠ\ºeå¢B%—¬†«ü”àÒ§ñãÈåò“Š­ƒr5þÈóª!ÃÉ7ÄCÅ,OŸb]¿†[ölÚµm߯[÷î§dWO,!«Ž9¶TX»p‘Cäuí> >¼¸JŠ¡úˆŽ™ü¡ƒ>Éi¨éà"/áÇ—Ëí  ©rï˾wð1ýîù“÷~þýýÿ0@$Ð6ßð›ÈŠO ¨E®õ‚‹°ºh#ždp"*Úp"/’#o´…˜cÈ!/f’ !íDTñ¼†Cp¡Ö ¤±FoÄ1GwÄñÀÊcˆ: ˆ$šH CÚ0Ĭ 5åHžæûŽÅ˜¬tè€ÂäënD.ªòÊš‘G3ÏD3M5×d³Fì ¬ðþã…i@ 4ÑÄ‚¶ ¼Ä*Ö¥,1i#€ƒâœ³Î;¡ødOr PA 5´4ÅSÄÄœ%—HÙ0Գ̰¥KMOëôÇ2Û„5VYg¥µÖZßćUÚð–[òXˆ VVX¡6úd×;pAƒE6.IW^}v4ê¸CY´K¶e›d‹0JîS½\i–Xɕd¹¤ ,kÃ!qm*wL2õ³µ_ÿ8`]ÃU_ƒF8a…^íÕ†8b‰'¾ÕP†/Æ8cv˜b?9d‘s+xc“OF™áŽGf¹e—_†9©’S¦¹f›ó‹9gwæYâ™oþ:èWî¹h£FÚFV¸¤i§Ÿ†:j©§¦ºj«¯Æ:k­·¶ºÞ¤¿;l±q[šk³ÏF;mµ×–Úë±ß†;n¹§úYh»ï>˜è¹÷æ»ï°ëÆ;pÁÍÒÛoÃG¼eÀg|ð‡ùÞ,^½y [W>zéwOÝyë†~zí·ç¼úë…îäÎ12@jAò¡ì¹g¿}ýÿÞàO,áO}êc0EYq_÷ÿàä7?0tÔ(þðp0‡¬@#© p@ Vo”ßõ8&Z€‚V €‘ÔÇ/ –Є_{pá…TT!&3-Ú°‚UT 9AÑY☠¢&y 8â‘îQ$Ý)ÉIRB’–¼ä…)“‰H‘[´AŠp,¤Bºp%&AÉqžèÔ‡!ë;aÕH±7]bk ‚¬T,¢!cLRc%žx4ØY§àÈH&&„¬Ì .“™Ítæ3¡ÁÒd yYÔ"1¥0‘vÜÇ<.R3œ‰"CJ€ž3’p§DeÈÞ”ŠY¨]À‰‹}^i–ù,„Jõ€xÂ…ž\º(=ëiÏ{ºþɘè2Dƒ R&ÂJWD= f(2Ê ¦Òš×ŒØ›B±+9ÀÀJ¡ÈE½ µŠ'z:wILs!$‡-*Q<[e¢.ç Z\È6ÛÐMw¢ÈSo1£ŒL‰M‚”V³‚!bù)9Ì!VÈùø8‘Z L¸”g;¡%ŠsžÄLæAh1‡‡$4–O«BXMƒ¶Ô¥kz¤Ö P¹ti“~ …D‘ªß˜ ’ƒ$;åªQ• 3?åé?ÑUÉK:â“)MAÔ5J©ôà_ºU®òèM48€paEÖë 08ÀX©SE˜Õ,,‰×¼Â5®ä ]µ‚ºØåê.¸Ê‹^çÒè"´`E.Üa<ö«XÉš×uµëªyꟵÚUÊVuÌ‹ŸàØ‹…„ïbècÍd-;ZÒÞ~™ÍØ+4ˆ\€òfh,mle‹•Óþ(‡PDíT/! -D6e°mp…ë”ÚæÖ¸þnr•{•â7·À]nt•Û\çfºÒÅîlQ04t×»ßoxÅ;^ò–×¼çEozÕ»^ó¾B´Ù…/vQp[úÖ×¾÷Åo~õ»_þö׿ùo€<`ØÀFp‚¼`7ØÁ†p„%< <2,Ä–Œôâä\NLŒvt„zt\F<|b\”"$¬RTÔªœÜ²´D:4Œ24¤–”äÚÜ$ÄšŒœvt|jlŒlZ\¼šœÜº¼¤‚t4&$¼rtüòô TJLŒnd¼’„Œ><ÌžŒTB<¤BD„Ô¦”´Ž|D2,œ~t|^T¤ŠŒôÊÌ´jldNDdJD„f\¬Z\ܪœL:4üÒÔ„j\tZTì¾¼œnl¤JL,"ôêì”vl\JL|f\”*,䲤œ24ìÞÜ,亼<.,üúü”rl¼–”ÌšœTF<„ Ô¢¤ÄŠŒdRT„jlt^T lVL´’”<64Ì’”\JDÔª¬ìÖÔ$ÄžœœzlŒ¬†|4*$¼z| Œrt¼–„œ:4œfd¬žœ¬NDœ‚„ôÆÄ̦¤tbd”z|ä¶´t$¤‚„ľ¼,&$ìÚÜĆ„´fdôæä”&$¬VTܶ´Œ64ÄžŒŒ¼žœÜ¾¼¼vtüöô  Œrd¤FD„´nl¬^\Ü®œ¤NLôîì”.,œ64ä¾¼üþüÌžœ„ Ô¦¤ÄŽŒ„nl´–”Ì–”Ô®¬œ><¬ŽŒüÎÌLBD<24\FD|bdD:<$Ìž”TBDÔ¦œ´Ž„œ~|dNL„jdtZ\,"$”vt|fdTFDt^\lVTœzt4*,¼–ŒD64L><ÿÿþ!ùÑ,ËíþU H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -iA€Ñ£H“*]Ê´©Ó§P£JJµªU8)µ«×¯`ÊK¶¬Ù³hÓª]«À‡¬E¨ÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwháϥʛ7c®{YqdŽ“G÷-­ZîãQ½†ÉÝ:sãÓSS…¤T'¨¨1†šÝfJ¹À —·oà®yС£f•Юå"®þ”z´"†\M•J`·ô2r¡ã¢ƒóé×7ïý;øu»ÃW]rËí÷œHGuØýGÅvÝ}ÞxåÍ…›Fºa…7<0Ìnr@ArX‡Ä†7!—†zèZ3ÌÙY(—Y\rIf¸öŒ 1·@A„^´×\/ 4#W*qƒÈUä‘IRÁb‡:H×(!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”µáŒ\”Âg) ”r!˜G—žºfh 9ÔXc)‹6z]/rm¥ñYf¡ub(]78!W¦›Ê…(}ºÚc}z_¡þušêu‘:ê ¤r1ê¥TXjgaT”±ê\fÀœ\€G—°  ,ØúX²ÚEëæcÀ)JSªÔ<F³©´£mž…xµðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àE„ÇLµL=ãG—W#”Õ¥c“lŽÇ¨°HÍ’1kXŪÓz=hi£ÙD)—½ŽR“"Ûhú¼m®–(3 JVA®vr-%+;*¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\JWÃí®¿Þî=|dÀƒ_t@l’WŸŽ‘¡ú6@‡=õÅtP–<kMøF¾y‰êa<ñ Àè` íä/8ýk#¦±†)‚'h$x›~…™øþ@ÇA%"všeDóÞ¥nô‹3$µ_ ÷åD3ØQaÑÔ¥Ç`1¦vÝ"`Ê Í¾ø*™ïL¥TûÎ*{Gí›kRì—Gô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿”¢`q†/¥œ[À 9©crþÚÚH%³«/E Î_`pØÝ*¸œ ΋ê–…Ë­F€,Óà8èóþ…ÀdÕ×\ð€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥$ƒÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÏà•æÖ4#»–fKiò þem»˜/D3–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–s*ô"ëTë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕínT6 ‚gÈІ ¹Ej*0zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–ËÕ ÔsÊsöñ$¯ïyIí SËí©U»]JkOU;ñ¨î kyl“×ÕÖZr4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rFÆr€~"p 7@Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]VyÐä­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢€`ÎàþÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.ƲoÀ £ B0b6˜0Xuóocu[d'#C0z1 WÐ¥Ðetæ…±·øIm—Wsç {x'x¦3<ã3ÊcPþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹CRP]VzÙÖ‚H¸¬ÇC®‡YPYuñ ‹h}tØ|~1{®L£@ WP‚¿—A¸W[¼uÔT¥€ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†T@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçiHkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh¸lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œHžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹…OG™¾8Œ¹·{µ¦š­áGpC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3itPi1°y¥ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú¡”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B£ÀöD^Ù•Öj½%PkýÖÙ¥~ðt]×v}×x×z½×|Ý×~×`#ðׄ]؆}Ø{ Cp`¡°Øí)`‘€ ZÙ˜ p`•Ù MœÀ i  w ¡Ú0! 6 ª ¬À ª=Û+A Ÿ O k@Û¼m-ð«0K ½]Ü"_Р` ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þ1 §Ðê½Þi`¥mÞð’`ôm  _PßKßü½6`”Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿí5žã:N׊Ý×@¾*%PLäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!T¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôBÑ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIM3FœXñ"cÇÉF¦\øHËc•TZÀòåT6„¾²Cm©ÖEKIHªuT xŠ·ê,´oäÀ‡Ÿ—\\+x¥¼Ì¥•Fo²Œ-#ûØ.È¿„a7ò¸B¯À¯Ô³Š½µ²°c»ÝÈpB*¤p‚‡±àµW_6Xa‡%¶X^-±c—e¶YfAÈ5Zi%ã„P†˜6[m·u´P ù¢nÇ%·\É–XÂPÀ0·]wÝU—]R–x·^{³í"\U¼}â^ÿµ³JDª6€Fx¸ le¤!fI8b‰»rÅ-FâÀ+&æ¸c‘Pa€$-LÃc“vÄMJФГ_þW8LÒÄ6`ÆùÝ)2ˆ¤gŸþ°Aœ‡&W’OŽþPà@ú¢Ÿ.׆ºjr¥¦Új­³Åzk¯¥íúk±- {l³µ,ûlµ L{m·ƒkûm¹¿Š{n»Sªûn½IÊ{ï½ûöûnÀŸ{pÂß6üðrwu¶q`¥öÀqÉ{…VñôlÅœ9Ea"óÌqµ¥PM´ÑÐEÇ”tIM?Ý$ËnX „2:y†Ì3ÝNÖ[ßòP„bÈ¡Û'TwÐy'îP¦¶b9 œ'xš²:\è€Çez¤8`&;Àç—;Ÿ "€€ ¬4úò_ɲÀÓpÅg2£‚-·àHT@„¨áÈÁÃYþÈà³l€ Â+žþ2Sþ™! —¸DÌ€œýý†~*y]lfSò‘å=TèÌgÆS89üÛf4ӛܭè=8a)€2äœpEÇ£‚¶Ó"g1TPNž‚ƒ,t¢yÃ+âð"H#äV"Â#ªèÁ¢#ý‰"xÜóÀࣸRdTÂ)I‡BÉ  vÄCuèC! ÆE¶4(»Àˆ ‚"¨ñ/jc-ˆA Fñ‡]ô"”ĤR8i-.0$Ahd#Qa¼@)„É0"GOE‚о À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%IJá9f6³VH&IÐ TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9U¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?£ðƒ¨.*Rƒº*V5uK ǸÉ9N6PBO%W9‰Fkd6YQµ& ÌœPªÕ(ñ‰'€b Q…Z ¾° U|BX}@a U€á dkΖðUUh•«i…YU¯*’©Âf±xêH˜*þ »žl¢ 'L†¾zÌ 6¨DIp‡Âv, ˜¸IR ±ÆN¬ “ØDf5Ë@¢²“DD[V°£ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN·¯Ànvµ»]îv×»ßoxµû…/È@¼çEozÓˈ„áÔ½ï…oæ^Ð^=Á¾÷Åo~õ{_ì׿ÿp€<`Ø Ëp2æ‹0Ô·Àþíïƒ%/a 7 ¢ eÈ‚˜P‹1ð‚à „}QÐŒ2C®Ã-è°ŒÊVÆr- :ÔÁ¾t¶3žŸlß$ÐÁ¨‚!}ç<ïÉËÄ}± û2`N¾ô£Sa¡(ð!N û’àXÀÂ3Jl„L4Å©v5¬eMëKCƒ„x… lQ d·ºϨĢ  û–‚{À±Ë‚ëgŒÁ¾¯Žõ¬íûŠgp`Űﳣ=íIþ¡Ò—¶Åˆ niSØ©Þ.ê«\üÚÔÿBµžè g(—¾m³,vmeè¢Ý÷%„Á/ ûú7‚¤lcp€ÒÁ°o0Ž!o '¼ úøÁ nߎ|ÒXˆ’€ˆû¶ÜÝ ¿w„“À ]ð" ÷ý·¿~ß$ ãö-Ä3èÀû–Á_øšá`'}éËy¸Š#œD¦¡¾ C`¡á§g|ãVïºÓóËu¬_z9!þ9~m¶/üÞÈ€£¾à&ßÊoÃ"P‹DáöUx»ea B^ð„·û½€Jø·g8L~ðÇ^åù¥¼~•,ùÐçþwÃ^ƒµKáñRóýÔ~·ï‘…j_»Ɉ02vÁíȃ¶öny­Û÷ÏÅÖ ûF!ù˜×ðî±° dÔ^ø¸7´Ïm|ä+Ÿù’øñ“¿üv÷— úšQö ß+àÌ¡ƒ-X ,?ÄB$BA$B4ÄEÄADEdÄH2Gä–,´ÄK¬©-d°.lÃNôÄOÅPÅ7ŒCI4E&,ÅSTÅ£ÄmÄU„ÅkB¡{ÂX´ÅkEmyÅ[äŽKÅ^ÆüÊÅlÁÄb4FÌ™Å{Q¯edÆftÆg„Æïb/ê¢Æj´ÆkÄÆlÔÆmäÆnôÆh ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_6.gif000066400000000000000000000202201343257752000272510ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÄ¢¤,"ŒjdlfdÄ‚„´bdT><ĺ´lRL´’„ ôâä<2,ŒvtÄ–ŒdNDÔ¦””"$äÚܬRT„ztŒ24\F<|b\$D:4ŒÄšŒÔªœ¼rtܲ´üòôœvt„j\ ¤–”ŒndlZ\Œ><ܺ¼¤BD„4*$´Ž|D2,üÒÔÌžŒ¤‚tTB<ôÊÌ´jl¼’„äÞܬZ\dJDܪœœ~tœnl|^T¤JLÌ¢”ôêìÔ¢¤”*,œ24\JL„f\,L:4üúü„jl”rltZT亼„ ÄŠŒÌšœTF< 4&$<64”vlÌ’”dRLìÖÔ\JD|f\$ŒÔª¬¼z|䲤œzl Œrtœ:<<.,D6,¬ŠŒüÊ̼jd¼–„´^T¬NDÌ¢¤L>4t^T”ŽŒôÆÄt,&$œfdtjlĆ„´fdlVL´–”¬žœ¬†|”z|$ìÞܤ~tìÚÜôæä”&$¬VTŒ64ŒÄžŒ¼vtܶ´üöô  Œrdܾ¼¤FD„´nl¬^\Ü®œ¤NLôîìÔ¦¤”.,œ64üþü„nlä¾¼„ ÄŽŒÌžœÌ–”Ô®¬œ><üÎÌ̦¤<24dNLÔ¦œ\FD$„jd4*,´Ž„Ìž”TBDtZ\TFD|fdœztD64¼–ŒL><ÿÿþ!ù¼,Ëíþ= H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -©A€Ñ£H“*]Ê´©Ó§P£JJµªÕqµ«×¯`ÊK¶¬Ù³hÓª]«€Š¬NÊÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwha£Ê›7c®{YqdŽ“G÷-­ZîãK³VÅÝ:sãÓS—¹$%$#Ê|Y1wÅ—Ý~2¥è —·oà®…œ9óåR™Ð®åþ¨B…®Qþdª“e‡ÜêdB`·´,ru99“âC‘óé×7ïý;øu»ÃW]rËí÷œHGuØýWÆvÝ}ÞxåÍ…›Fºu †0°Ên1lQÆ1X'ņT —†zèš6Ø †ÙY(—j0ˆ~¸–‹#H1[©lñƒW´×Ü,À"×7ü`ÁÈUä‘I–Áb‡:H×%!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”…¡‹\EdÂg&dr_˜G—žºfè3ÔXc&‹6zÝ,r_™0ñYf¡Ab(]!W¦›Ê…h}ºÚc}z_¡þušêu‘:ê ¤r1ê¥eXjgae`±ê\~Àœ\u€G—°  ìuØúX²ÚEëæc±är†…(É'ŽrÉ $¢•‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFº¹"‚]a†È+]þ¶Wëµ£.œï—@@à­\¬\:à \bAi—D,W¤ÝðÀ<ÈtàpÊ ç*éî݉e¾qÉsôÚD eàrxt hfÍ7ç|1JÐcg¼acpî¸4ÌsìÐq*O_V„YÈG:ñXÕW¯¨†Í8ÛZéÎ=ÿt™f£m4HÛ ´\M?µþœ Ç ì%L„QGf”Ã+su€rF@r,à‚Ý|¡l)<öØ>t烲0GáJPf½Ù?Ê„+dú˜è¤ßÐ\àƒ~ݰ‡'ŽÃ%~4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…x5ðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àõƒÇLµL=ãG—W#”Õ¥c“lŽÇʰHÍ’1kXŪÓz=hi+ÙD)—½ŽR“"Ûhú¼m®–(3 JVA®vr-%+»2¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J×Ãí®¿Þî=|tXƒ_h@l’WŸŽ‘¡úFp†=õå gP–<kMøF¾y‰êa"‘ ÀÐ íä/8ýk#¦±†qB$³‚]$x›~¹„™øþ@ÇA%"všeDóÞ%nô‹.$µ_ ÷åD6ØQaÑÔ¥Ç`1¦vÝ"`° ;ø*™ïÌ ¥TûÎ*{Gí›kRì—:ô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿d¢`Ñ…/¥œ[À 9©crþÚÚH%³«/N Î_VpØÝ*¸œ ΋ꦆË­F€,Óà8èóþ…ÀdÕ×\Ö€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xÊ¥¤ ÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-º¹à•æÖ4#»–fKiò þem»˜/Ds–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó2Ì"ëeë_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕíneˆF ‚\ÈІ ¹Eê20zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–ËUÔƒÊsöñ$¯ïyI­ SËí©U»]JkOU;ñ¨î kyl“×ÕÖZ24ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'rVÆ1€~" @Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V…t­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢y€`º`þÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋfà —° L0b6˜0Xuóocu[d'#C0zq MЙÐetæ…±·øIm—Wsç {x'x¦3<ã3Êc[þhxèuHošÕx–zÖJ–‰õ‡am¹³"‹CR[à]VzÙÖ‚H¸¬ÇC®‡jPYu‘ ‹h}tØ|~1{®L—ð MP‚¿—A¸W[¼uÔT™ ºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†e@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçiXkˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vh8lCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œXžè-é~¤h’d©hC«x­˜›ù%ÑÇta‹%OG™¾8Œ¹·{µ¦š­‘(pC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3igPi;°y™ÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Úñ”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-B—àöD^Ù•Öj½ PkýÖÙ¥~  t]×v}×x×z½×|Ý×~×'ðׄ]؆}Ø{Cb•°Øí.}°OÙ˜ ŽÙ M \à i` ¡Ú0Q 0pž@ ¡ðª=Û+‘“ G@ c@Û¼m&@£0C½]Ü"T`”  ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þa œ`ê½Þ\¥mÞð‡ô”@ TPßCßü½0‰Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿ½5žã:N׊Ý×@¾* DäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!e¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB_Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔIÀ2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%I2á9f6³V H&I´à TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9=¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?—€ƒ¨.*Rƒº*V5uK ǸÉ9®0BO%W9‰Fkd0YQµV !PªÕ1‰#Pb Q…š ¨0 OL"X}(¡ O dkΆðUOh•«i…YU¯*’©Âf¤xêH˜zþ»žÌ– É#BÀ…¾zŒ0pDI†Âv¬ ‹¸I\ ±ÆNL ˆhDf5Kð¡²;„D«„P„B £ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN—ºDvµ»]îv—»T B ¼;^òòàº"Á©3q^O€ 5€o|å;_úÒ× \N}õ_¬÷¼îÝo€õ«Š?À°|ûË^÷´8C`ñÞÏ÷ m@°€¬`ÿ^·Á%H¦Ð9Ø¢ÂóÝp R¼ß«¸ÃÔmð>Qßþ6° ©`†U,Y`A ¥P1sTœáSÜBg@CókàG·Á©pD}o‘‹)L!·00-q(¨"ÃCó'rQ‚ÔâËLf0…ƒú†È5(E øæ _Þð†ÝŒb7Ù¹OŽ2}±ÀæØùÌyæo†Íg§¾2nó›ã|hq²•id/ÛÙ'>¶‡eýljë7Ú0žvµµÍ_?/·ÁÛ·‹œ^fîÁ»¨EºÕ½nvŠ·ÛÝï†7»`M‡{Û×vr¶íýl|ÿYßû^v¿½ýo€'[àÈývÁ}ðâ&\áÊf¸pÉ]îsÇÛâÇøºç]ï‡C¼Û'xÇñß:\ä &9oM~ò‘¼á!g9}SžÛ•Ǽ¾3·íÄ=çrá’×ç?úÏÍË^¢ÝèGGzÒ•¾t¦7Ýéå ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_7.gif000066400000000000000000000207371343257752000272670ustar00rootroot00000000000000GIF89aËí甆„LB<ìÂÄŒBDlÌ¢”$"$ŒjdlfdÄ‚„´bdlRLT><ĺ´´’„ ôâä<2,ŒvtÄ–ŒdNDÔªœ”"$\F<äÚܬRT„ztŒ24|b\$D:4ÄšŒŒܲ´œvt¤–”4&$¼rtlZ\üòô„j\ܺ¼ Ô¦”ŒndŒ><ÌžŒ¤‚tTB<¤BD„´Ž|D2,üÒÔ|^TôÊÌ´jl¼’„ܪœdJDäÞܬZ\œ~ttZTì¾¼œnl¤JL,"ôêì”vl”*,\JLœ24„f\,L:4<.,üúü„jl亼Ԣ¤”rlÌšœTF<„ ÄŠŒt^T ”ŽŒÌ¢¤<64Ì’”dRLÔª¬\JDìÖÔ|f\$ÄžœŒ䲤œzl4*$¼z| Œrtœ:<¬ŠŒD6,üÊ̼jd¼–„´^T¬ND,&$”z|L>4œ‚„LBDôÆÄtœfd¬žœtjl¬†|´’”$ìÞܤ~tìÚÜĆ„´fdlVLôæä”&$¬VTŒ64ÄžŒŒܶ´¼vtüöôܾ¼  Œrd¤FD„´nlÜ®œ¬^\¤NLôîì”.,œ64üþü„nlä¾¼Ô¦¤Ìžœ„ ÄŽŒÌ¦¤Ì–”Ô®¬œ><üÎÌ<24dNL\FD$„jdÔ¦œÌž”TBD´Ž„tZ\,"$”vtTFDt^\|fdœzt4*,D64¼–ŒL><ÿÿþ!ùÃ,ËíþC H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ -¹A€Ñ£H“*]Ê´©Ó§P£JJµªU µ«×¯`ÊK¶¬Ù³hÓª]«@‰¬PÒÈK·®Ý»xóêÝË·¯ß¿€v W°a¼+^Ì8pbÁ„; ˆÛøïãÊwh!ϣʛ7c®{YqdŽ“G÷-­ZîcM´^­Ý:sãÓS§Ñ$¤S%ÒŒq1×Ř݊:±è —·oà®s´i3FSšÐ®åö¨B…®UþtÒc‚‡ÜGôtB`·t .rƒAiÃâƒóé×7ïý;øu»ÃW]rËí÷œHGuØý—ÆvÝ}ÞxåÍ…›Fºu-4ðÊnk(‘†kX'Ć-T —†zèZ0À…ÙY(—"Q<òHЏ 1[­(ÑX´×- ü"×1ôÐÂÈUä‘I¦Áb‡:H—&!ŽX≪¨%Š.^£Œ4zé Ž:òè#BZø–d”™Œ\tÂg' tr_˜G—žºf(6ÔXc'‹6z-rY_8ñYf¡Ub(]- !W¦›Ê…h}ºÚc}z_¡þušêu‘:ê ¤r1ê¥iXjgaip±ê\ŠÀœ\z€G—°  lzØúX²ÚEëæc¶Ó††(É'ŽrÕE%¢¥‘í¶Ý;¬›t{,µË®ëlµÒ"û¬µ¥]vaFºÅ‚] ¡È+]þ¶Wëµ£.œï—A@à­\³\jƒ -hÒBišD,W¤ÝðÀ<ÈtàpÊ ç*éî݉eÒ¡ yôú„ iørx[ hfÍ7ç|1JÐcmÐacpî¸4ÌyðÐq+O_f€"&ÈGBñXÕW¯…Í8ÛZéÎ=ÿt™f£m4Hà´\M?µþœ Ç ¬&N˜¡Çj¤!ƒ,su rHTr,à‚]•Œ¡l,<öX>t烲0[‹Pf½Y?ÊD,dú˜è¤ÇÐ\àƒ~ݰ‡'.ƒ&Š4þ8í’_']å—g^#瞃βßxÖ¦¶óÐGÿ)JSªÔ<F³©´£mž…xeðôR²ò%ç2T»„ê¹zLPqz˜~"$}0«³Êu.BškéÚc¹àÕƒÇLµL=ãG—W#”Õ¥c“lŽÇÒ°HÍ’1kXŪÓz=hiKÙD)—½ŽR“ Ûhú¼m®–(3 JVA®vr-%+»4¨ÒuÚ¥,_<Û!Ö/N=È?¥×ËÏ2&´mmˆiLdšÖ0¨-þˆj[óÌh¾6§Â¼í/cKÙêö…¼ˆo›Âà $~L®r—ËÜæ:—¹< §KÝêZ÷ºØ¥ ëJ\J7Ãí®¿Þî=|[ˆƒ_n°l’WŸŽ‘¡ú,І=õ…mP–<kMøF¾y‰êa, ÀÜÀ íä/8ýk#¦±†‚%ãa$x›~Ñ„™øþ@ÇA%"všeDóÞ¥nôK0$µ_ ÷åD0ØQaÑÔ¥Ç`1¦vÝ"`¸ ;ø*™ïŒ ¥TûÎ*{Gí›kRì=ô˜/?n1w›ü,¯Ê+\ã*—€ðÇ¿t¢` †/¥œ[À 9©crþÚÚH%³«/P Î_\pØÝ*¸œ ΋"ê…Ë­F€,Óà8èóþ…ÀdÕ×\â€` ßYyÆKc©ÑÝt¶F—e劌§%N›8/ôµ¯—MÑü^xʥܠÖÛÞS—Y¼… ²ªؾÞVÖ°Žõ£ßé\Û×¾6#°ƒ=Åa»‡Æ–â§£—^V×z×ôìuq§§½Pû¿úí ´ý)mÓðEÀ-fý—³/Ù$ü6„m#îÊH˜Â^ºõ‚Qo: ñ}F¬å;(AÓ©N½äÐûÅ€Yñ¹·ýÔnwò‹5M)—luc-ºÀà•æÖ4#»–fKiò þem»˜/Ds–úf¹$yË)ÖÜʲv(#¹/N&ù¥Ô7ï¼pÕÊÍ¢‹VÁºå.kî^Wƒfß||=ÇKÊãW5»‰Í­Ìñ¿–ó4Ð"ëië_âLá:Cá¢u8±·¢áÐ~LÞÞnhÍÕíniXƒ,`ÈІ ¹Eê40zá'ßË+c9ËÙEÎv˜{L¦ ËéÈ{|x–Ë• Ô£Êsöñ$¯ïyI SËí©U»]JkOU;ñ¨î kyl“×ÕÖZB4ŸlGÜõ²U}í7õáûø½¾ñaÿêåãùÂU¾›Íö"ú ïÙþgmÆ`›‡Å_L÷–­šÁW¿Ñ¿Æ>x¥ßî‘ïÝ•©0øÕ?ÚzWºàÁ :Á=Œ ƒ"T¡ 'r–Æk€~ Ð -@Q,ö|‰§]q3vS}óq4æ!eR$%R(%rþ&"B"]V†`„­Vr0~u1u‘´r6—tsÁr>U)7Ø+;‡sÒÔ*‚¢w€`Á€þÁ‚ÀEÂ÷srñU`vL¨uäG_Ö.Ʋj š N0b6˜0Xuóocu[d'#C0z¡ OÐetæ…±·øIm—Wsç {x'x¦3<ã3ÊcJþhxèuHošÕx–zÖJ–‰õ‡am¹³"‹#CRJà]VzÙÖ‚H¸¬ÇC®‡QPYu ‹h}tØ|~1{®Lš OP‚¿—A¸W[¼uÔTPºö…Î7^§˜Œé‡ŒÌH|ËøŒGèŒÒÈ|àBQ¸ÔײX\ѨA`7Ý×`&ßçÔèmæ<æÇ‹¨ŒéØTÞ$=ðç<ò‡Ž˜ö×ar;`õDÕJ¼£ÃèF"n ©pøH‹|q‡r5F.E†i@&)bS÷#"#X"å8’:¨B.(…pe*3è&E…‘&£’‰òþ]‡*€òƒ$Én%ù×J¨.A7U•.­/sñ„^ÖtPS…ë81]¨“"|a˜fc¨V“ÔJ/vVçi˜kˆ”Sé~hvØø~!‘~æv…ÖW¡4J­ô6y&vhhlCˆÏSxçuxNÙB‚±x›åx—X‰”U#¯Ñ;Ž˜Á㚈8œ˜žè-é~¤h’d©hC«x­˜›ù%ÑÇta‹UOG™¾8Œ¹·{µ¦š­Á*pC'Yg'š´©=³y›Ò“›º =¼Ù›ØS™åƒ^êÕ IMÂÉ=ó%z÷ez÷d›°¥>í¸æfgÐ êS}þqÏ™ˆáoø×Vi03²éeY™ÙéMÇ‘ic2fW94è‘Áj;HJ¼ )ÆrgFuvu•,×dû‰Fè]É)C]f”= 3D¹„ëÂt wš ¥!vƒ]÷uó)Ra‰ÈshÞ‰“p‰–{#}&zÇw~'n‰ŸqéæWx—¡—ۇ˜¶3imPi<°yÐyÍa˜¿#‰ŠÉœ£ö4“‰¢ïIJ™I­&¥> œÐ˜š´Ž®9W¿©¥$Ô bº=aZ¦·A¦h=gJœyqœˆÕ¦Û3Žvqަ%§Ú3uQwª¦"¤wÁŸõŸþà™ž· EtDê) i€Ç့æ§íŸ—&Àqm‚q¼‚Í&$X)ý ¦’Jº’*ã2KÆ“=X“ƒ’“}ª¡*/Hw¼ˆrHé.tÑ”¯š¢c(v§G/#[Ù•Å!–aõŸtá‡t“4S#äF—ƒø3rÁ£ƒ:ªõXÁpÄCmz±˜ºSj¥(ª×©n˜Q¥{z¥»:¥â·¦‡Ä¥Ô~ˆñ¥µ‡§ìºBãZ¯Me­øš¦÷º¯öÊ«þʯkFÛh¥®–¥·D§za§=ú”lJ®ÜŠ£¸^ïèŸú_óhh6asoXê°Qžù6å‰AbŠzpë‰þíÙ°|I‘S·e”Ê©™ª-iƒxñr ªªsŽAI¡?‰e|Ô„)S«{1…a†¡:°gµV¾JX…ÂZ¢{q¢³€áWyh4{wt—¶-·9:z‹V±=kµ‘UK•…­Çi“·iž± ê¤:Î ³V„Mæú¦è*¸i°f¾'oòz¬«¸t¥®’+°”[¹â¹˜ Zš»¹ßÖ¹†T°z§Êºv¤°yÁ°½(·?Ê7¹zú¦p;‹«ËF~ÙÈ€úµ[F¼)²÷–å¼%;DûV.Ṩaö€«{¹v1³ùYY'Sþh:«˜©etÁ¾¥1tNX¡}!µN×{‹V#ºnú{uãV¶"vZéµz¶¾¹d»¢zHh |¶`X—8gƒ–›hy9»²¹ƒi‰Á#˜t«·ªÃ:˜5‰@z¢ö·àŠ¿ý:}«fœ‡Û¼µë¹–ë£ëC;N¦+Ù‘Ã:lI+ÜÃ)ÃÃ@L1¬A¢K¤K\ôÚ¨;ªÛ]ôš»x»sÁ§°ÅŒ±»u!¨âõ»ùÁ*›»ب ù²]¹Ó›29Û)‚bòG ú[¼9¾)Ó²x1“>تq¬[ë‹UÒµþza¿Iy,ñAµ|œ¿knpV€ÄªÆ*Ǽ–j+Årñ¬u)­Šl¼¹Á•Hɽ"z›¨%‹¥¹¶ÄQ¸UüÂP,ÄCŒk5üm7ÌŒ¦Üó¬Ãµ,÷칹¼¹»L§\œ|‘Ä0ܽ泮ŒÑÄwñÄüÃËT|V¬¾¬\ÌY̱~ÁŹ0SPb(…IÚÁÞ¡,–QüÈQ,›p̛ͺ<G'Cò÷y#9"5rAŸ/Z©]’½>¶½¥ÛÎYóS5r•¸¬rÑ¡E“軳Uë¼`‰‘„ HtÁUÖÒ“Fi¡SÛÐE¬ê´BÐ ƒÐû[¹üϬþ£}çÑQ£ô'KÓ¢2r–yUÁnë(Ô*ÍÐY¤œÇÒIê;ÚÑ9ð9Ú1”öy—ؤ'|Ó¤¬Â¬[H¨ ͪ¼ÌO=ÄíÁ¸±Üš] P½\¹]-¹_­¸a-Bš0öD^Ù•Öj½!PkýÖÙ¥~Pt]×v}×x×z½×|Ý×~×@$ðׄ]؆}Ø{Ch@™°Øí+@‰ RÙ˜ ð@‘Ù M“` ` o° ¡Ú0¡ 4°¡ ¦0 ª=Û+Ñ— I€ b@Û¼m)¥0E ½]Ü"QYQ˜à ÆýÜ1ÜþñÛÁ ÝÖ}¹½ÛaÛ×ÝÝÛ²M¬íÚÞ]Þ± Ÿpê½Þ`@¥mÞð‹ ô-˜€ YPßEßü½4@Ðßîß>à~ÿà¾à‘à Îàþàá>à^áý}áß¾áæÝáîÝ â×=â$Ý&~âÆâ*ÞÛ,Þâ 1׈=ã4Î×ÿÍ5žã:N׊Ý×@¾*!FäFþ] ¡}Ɉä¡äòHM°¥~IÎ~Ñɦô›n§%åMNåØÙÌ»9Ã:¡áIÆÇažÙÂp â¾"ÎrU!i¼ͨhf¼“ƒ¨þ? !ã'Aò‰ƒ®S,—Ç!+¦:sâ0)ßË) Bêzê¨Ú7­+“ª¿âã”qѸ*ÑE)«ôÒ7mWì»n7¢”Ú¾D7«Ê쉦åÀ"v|•¾Šê·bí³VÆN¬Ôn†ØÞ2­d¡ž[­m4BS¶®qwK³‡Ñé}“À=æNˆ.­ÀsÃî“üÒö,îЮSvk8Œ)ÊŒs˜l;Úšy$ì È3Ô…X#üo¸3ðŠÃ;@}𓳭 ¿9BMÔþîNþ•±æ›ÿîþÐ]îŸ$ò\þº†äÉœ«ò˜;îÍ®2¯tä8Ÿóo½]<\Ïõó@ôB_Ñ¥ë1_ò3¿¦5/¶bôİK?¸^íôLõT7¯óZ¿õÓÅó;áóCöb?öúSô<òÆõ‰«BGŒÂ|}0±®È\§ËÎFOÍ€h`̽9öƾZœØ<Ì/|šçÞŒ²©Î-õk¿}ïü驽÷’¿êáȃéëÔgø4èɂ̺ªÓy/ùîÌ·wQÒ&zÒ~£åÓi)—ŒÓ}ŸÁšOŽÛ ™è·L}÷Tú/Õvñö±€?¯ŸGþ’Õ2ýèÔü‰tô»oõ×ï¯jïüSŸýûºýÕ¯ŠÀœBÈïMÔI„JJJ¤‰“_þW4L¢„2`ÆùÝ%.H¤gŸþ Aœ‡&w‘K޾LÐ@z¢Ÿ.—†ºjr¥¦Új­³Åzk¯¥íúk±- {l³µ,ûlµ L{m·ƒkûm¹¿Š{n»Sªûn½IÊ{ï½ûöûnÀŸ{pÂß6üðrwu¶q`¥æÀqÉ{…VñôlÅœ9B1"óÌqµ¥PM´ÑÐEÇ”tIM?Ý$ËZ`À.*†Ì3ÝNÖ[ßòP„bÈ¡Û'TwÐy'îP¦¶b¹'xšŠ6Xø€ÇeÒà A\ð€&:Àç—;?*€‚ ¬4úò_ɲÀÓpE`2Kƒ-·àÈbЃŒȉÃYþ¶À³X` Â+žþ2Sþ)" xDœýý†~*y]lfSò‘å=ièÌgÆS 9ü³f4ӛܭè=8a'€2äœpEÇ£‚¶Ó"g1iPNžRƒ(T¢yÃ+âð"H#DVêªèÁ¢#ý‰"xÜó¸ šhRdTÂ)I‡BÉ  vÄCuèC! SÆE¶4ˆ»€z(¨ñ/jc-ˆA Fñ‡]ôb”ĤN8i-,0$Ahd#¥!±@'œÉ0"GOEO|Ð>À2dIêT·¨9"ot³ŒS-ywK\R –®“e/KþD[S˜§ú%I:á9f6³V H&I¾à TÓš×Äf6µ¹Mnvӛߴ&ÍäSQºl/Í9 bîÒ˜ëô%9C¡Nx§é|g=U„ÎÓÑSŸ1ºçé–éL‚ÔOДç4Á¹P†6Ô¡Ù§<ç™Ïú†Ÿ¡ógEPŒRT£ëá¨å2úÑò…Tq#íÒ‰gÒáô?š¨ƒ¨.*Rƒº*V5uK ǸÉ9î4 BO%W9‰Fkd4YQµ¦ °Á“PªÕq‰$`B Q…Z ²PŠP\BX}Z0á‰PT! dkΊðÕPh•«i…YU¯*’©Âf©xêH˜ºþ»žl› É$D†¾z¬4ˆDIð†ÂvL ¸IV ±ÆN¬ ŒDf5{ ¢²[DDÛS˜ £ìg9–8Õú‹µ­µ×kaû.Ùζ]µµmÔ¦–ۉᖷÜòíoµ\áN‹¸ÅÖq‘‹*å.—l»u®k¡ÝØN·µ?Dvµ»]îv×»ßox¿›…,¼@¼çEozÑ;4@àԽŸØ Ô×¾÷Åo~õ»_þö׿ÿp€œ_8`¾Fp‚ïK_ã—Á †0 |àúª¢mÐÃ/àa?¸Ã{âp‚=<᜵·¾#h…¨ /ì"Äö0„cüâþØÀ%f0D¡_9  ­@ê <Ü‚ QPÅ‹|ä$ã€SˆE^чú²¢·hƒp§!×·Ç?²’Œä—yËxˆ…rq†=˜ÉU†²”©Œƒ/YÈ[.3—%|cœ™­ˆ„~{ *P½r-"ч)¸"Ñ‹nt}ÝŒH € ¼¨¯(€1‚à¢Ëöeð  }èG3ÚÑ 63„1‚>ˆ‚|X´(N=éJ_º¾¢64¢ñŒê]×—Ä}f0t _34Yfò(ê«.${ÙÍÆA.FPß!Ü¢¾Åv°™±ƒc;Ì6ó§ ìoûÙõ•6µ­ƒmþw»×»¶1…­_. ûÛÐöp°ÍœDæÔ·ÞÙæõ¿ïýi‚¿[ß¼þ4¿—ão{ƒÛàÿ5Ìü¬cbÙÇøßm#|×í¾x¾Ã ï‘3Xãù9Ãë;ŠƒûšÏgð:1£ÂÅ8À5©1.r誃n®éJ{úÏMÞuÎuÍó‚·ã>ºÐoMè\××SèC$øÀàV =â/ó3·/œá ÛÇ@¶7ÏyÎ ]äBwD•{щ6L@Òm8¸ÎŽ‚´—<Õ~wrÛßw³ƒÙÞªˆn»ï.§0%?yÊøë' {å5¿ùÊ_Þd™ç|èEß`Ï{Ú ô£G}êû[úŽ^õ¯‡=ë9ˆøÖÞöZ€ Þ÷Þ÷¿~ð…?|âßøÇG~ò/Œ—ƒ}ư‡>êe?1×Gßú›Ÿ¾Äª}îK>ûÛ~÷Åáï',üãG?‚˰ó§ßýÿ]ÿÁh{ú׿V¹ß½òõ¿þ÷ßÿÈg¾È{¿°ø˜ö#À´/üTÀd@qÀÀ¼— ¤@÷³@{ÁÀ D¿ ¬—ö²¿$Á?ìR¯TÁdÁtÁ좮”Á¤Á´ÁÄÁÔÁ$—€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_8.gif000066400000000000000000000510251343257752000272620ustar00rootroot00000000000000GIF89aµ«çŒ‚„LB<äÂÄŒF<Ä‚„\tbd$"$Ä¢¤lRL¬†|ľ¼Œjd<2,´jl \NL´–”ôâäŒvtl"$„zt\F<ìÒÔtjlÔ¦”D:4´Ž|ܲ´$4&$lZ\œzlܺ¼ôÆÄÄ–ŒÔ®¬ œ‚„TJL¼–„”"$TB<„„f\ŒrdD2,„j\Ôª¬L:4¼’„|^TÄžŒ|b\dNDdJDܦ”¬ŽŒ4.,tZT¤~tì¾¼¤ŠŒ¼žœäÊÌ,"̪¬´Š|¼vt”vl\JLìÞÜ䲤,œ~|亼üÎÌ ¤‚t¼–”œ24TF<Œ„jlL>4ÌžŒ|f\dRTt^T Ì¢”lVL¬ŠŒŒnd<64üúüT><\JDüÒÔÔªœ´’„$4*$œ~tüÊÌ  ”rlD6,dRL,&$”z|¤‚„Œ”ŽŒLBDìÂÄ´bdÄŽŒd¬Š|<24¼rt¬žœ”*,¼~|Ü®œ´’”䶴̦¤|jlŒrtÄžœ<.,\><ôÊÌܪœ¼šœìÖÔܶ´Ü¾¼ÄšŒäÎÌä¾¼œ64„nlüþü¤†„Œ\FDÔ¦œD:<´Ž„$œzt ¼–ŒTBD„jdL:<|bddNLtZ\,"$”vtTFDL><Ìž”|fdt^\lVTŒnl4*,D64ÿÿþ!ù´,µ«þ/ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóê݋Ԃ€¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹sc |/ 82£´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ ûˆ€ÐÌX¼¹óçУKŸN½ºõëØ³kßν»÷ïÞþ€—.~üóòæÓ«_Ͼ½û÷ÑgGNQ9üûøóëß~<úõÿ¥ hàæÉG_}Ë!èàƒF( {à€ Î 8†vèᇠη`Döhâ‰(êÇ!x²ÒB†Ù­˜âŒ4v¨àˆ$6XãŽ<òÅtLÒsåÃ$t ±ÐñA DÖd`¸Dy‚ô0 +˜±`4W™ä’M>I$thà ”k.Á@€#Ì BÔ€¥–\zÙã „¾w#Ž•X袌zçŒDBEœ¸‰[€2Ë¥[ÈBd"X`‘HqÞH$ŒqÊ‚¤ÄþH¤a¥œjÊ©§W²¹ÄpXYž‰Ø`C"^0רÖg*ªª6êì³ØŠhCŠBkíµKLÒ‚ 0^Ù sfðífpA$ ÌÑCœh„Â\“¼;‰“tAä¸áâkn®ç1÷F±üN‚îê2ÃÀ4”×®¼Ø6l­´Ó.T­ÃÚÉ,Pxà¥ÝRЧœtÄÉ$“ÜœÜÐÜ,ÇÙ­ ©,À/3ò43ÇHy#—,cÅ@ŸqÄ MôÑ) ¢¯Ü-¯Ë¯'‘@wÆ!A‚Ëü6Ý1 hlRžÀéJ}pºåQôÚ;MôAF³-÷ƒWР´^wͯþ…¡:°²‰¤  W˄̟ gËNw]¤sY¬ðk°Ãì…¡&¸à„Ïí¹„n¿]PÜŸ—®_žÐ1Dy3€”lñ1–- A!,±)Íݰ‚Þ®7þŸ ”ÇHuæP3l@ágžµßž»éÔºè‘^ýöþÌý÷à3w=ö—hþùzþúž½ùìÇO¡üôSï¾èðׯÿþü×ÿÛaðHÀð€L ÈÀ:ðŒ 'HÁ Zð‚Ì 7ÈÁzðƒ á=ò%d>K¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡þ@ ¢‡HDN„É_ÿ–ÈÄ&~îDS¢§HÅ*B Š“¢·ÈÅ. MDH$ˆ½HÆ2šq?XœVµRؼ xÁÀ®D2(¸Á]KHÁ  @8¼ŠŽ>ÛÐ…¾öÆ8αd ‚ìE$6’§Žwld ™£G>úQ’vÄ£ ã§H2èq#帲A6¤bµFè 7hE+n…­ñ« ^øÀBD‚Ehú®ä¢n½2–³¬eœÌÐ ø¡jz£Nyp©Ëh2‡—¾¦0ß•K®9GÚš„•¸VžcÊ’–¶@1O™Êv.q•8jåsÆ@ª“Áe›þ0+êÙ¯ë´éM£§s¼pÏhÔ›jN>º„}F= µ&sÔ0„%ÀA ã—@íI$7ÁI¢î iüà9"y:ÐdN$˜Æ/ xK@éC±#^ùŠ92mÎJ½¹Sêj .…©DsÚÏ 2t /^Ñòu =­i¯Ž*Òª†¤ Zã$ð1©dϼRW3äÈ™.á_sÎμ)ˆ¯Nò¡`…æ&Å W’…%S)ðÄ(¤Ôuc]+¿ÐêS«¶zX¥I›ãWçD•U‘HCîžÊNiæ)füj¬NY Hà­°0Dd§§!Ê®I´’eèRøv–G³*åþìee6ÌÃÚvm‰EÎb™ãPŽvm¥›`ÅÌjP†­<½eÎA ú;О¸.q¡; ¾¦4{%'où¹„åWl· ïöršÝî–ç„‚&3ƒ`ÓÚ¤j?™¹ò„½É\/¹šy×aþ§½}o|õàaÏIªvÏ‹LZê—¾’¯„KG^¾˜—`0 pvþ(Eÿ8WⲪxmÌð†;,ÉD.reeý)s>\â„xÄ\£1á°1ç|B¨ŒÃ°†9ÌNâÕvÂH~V…÷2Æ$;ùÉÜ[²^š å*[™mRÎ •Õ³BþtùÊ`†r–ñ²å0›ùÌŒóþ]ÊŒæ6»yFj¶ ›ßLç:G(Îu™³÷Ìg4‚1ŒAaMèBúЈN´¢ÍèF;ºÐG4A(ÂJ[úҘδ¦7ÍéN{úÓ ¶4 %-FõùÔ¨¾óŸ}áêy?[pÃvʳ¼ºÖ¯–Î †›ê^×Ïtiµe?dõΚ9©ÝN²Í“‚ìúúÙ_$uöLë\ãÇ>ö@1Vìp»?]{A Mî{.ÂN¨¹]Àǵû;î^XQîz«ZÚ‘çœêt'ÑÉN³cN'Ž 2×I‰Jãd“™>0°iHW:x•˜3‰”:\HyT—ÖôV6I|V%“˜þÈäj—…BjöN¹Î-yKXÄR.åbž+5@´O•¨¸{žM™¡i`Σ"5©+é|TÌá‚ –0tI1gY©ZÕÞ\}ôzbÉU°’^ßïr©üëÖ[uåI6‚I­ì»R üPמ«lÒÅ·•¡¨1‡K×·š³°%À+oµ{×àE/FrÇë`O<~Xyæ dw¯ÙÍ0 €-˜«:»™‰Ës±ŒõóÏ–-—Ðy%Ý‘ñ&乆2•y'ñR¼ìÝÃx¸]ðh—làOÞ]P­(’à7ÿÍ¥½Ýìâ SñYª¶~þ jpïÚÕ²–Î/K …›½öÕþSû·¸|æ–ÿšZá ^§¡fˆÄ,Š„9,øMÝqªÛ݈Ôþ÷/ÛÍ‘¿>k*Îe?õR.‡³‰ÓmØáã¶} Ýçú†< <:#È/­€¤B$1P$°#;ðÇ/¨£:¬qP;SlxT‚«=¶ƒ;^³Aw!pºÃ;O×\Úq_Ø€@xØz#íÁ![ÀTã‘'˜Qï±kA…Ú1„lQ„4u„bmR¸…´'vHd…þÄ&%†¢…\x†éA…k†h؆©¤†jÁ†n8‡d‡i!‡t˜‡Vd‡h‡zø‡MćgᇀXˆû#ˆþfAˆÝkÚ†kÓህ†H‡ˆXЏ,¨mË›!Íöƒ“(…•HVh†ÌÚömÓ¡Š" l ã$n¡è†£8¥83ÀnÚö|C ‘0'oôV‹hx‹bAe7$[uGP[×͘q[²q¹Òqde2¡°G °Œd$HÂpyâ“ *“ U~ Õñ=æ5¸K(‡Œ[¨ŒaAeMWt,3 ã‚J×ûøt§u€'c«Ã@@$>tÆR8°>€VBÃÅBÍ ŒÔ Ðˆg÷è…&Dez×T)…x×'ÉwxôwS7þlÏ¡Gp/à²/0GÌã G°tb%m’û"’¢H’äCe¥÷y’p×1 £·”§·UòÕ5lWÀyÏž ëTù.yM±g”Qˆ`QfJ#[•%„Ê×mÉÍ÷4%g0` ‚ È9ù‚Ào NŸôVðÈò(&Ù‡–A¨–_Aeú÷YPðQ¹†ŠK™é­#c‘2}¹[ ‘Í—ÕŒÂHŒÍ¡€Œ™–Hù>¦†.x‚7 ©‡™¸µ ƒÒ3ƒóxJjà ”×¡)^plàz°âN9‚ðp$‹×äl¯Ù€Žé—þ¸IhLˆ³°ŽÞ!‰×‰±‰?³Y?‚@ LðœåŠÙÙŠ"C³C=ByðžhŸ\±úùŸWtžoãŸZ ‹ÂŸ[A º <‚ Z¡  ¡)â Y¡z¡æ& Q”žw9_ä!“ÈÚAk¶„¦è\¾v¢ðAžì¥¡YÄ¡ ú–*Z©•o¦¢ïñ‰ÐA¡XÑd‚•„c…Õ¤§˜m#ʬˆ"’pFªmUÙP°ã$ ù¤dè„Ô“¥hÚ!f¨¦2:žâ)>.ªF0:‚ƒM¿Lò%¥K°‹ï†¢¢N?Ú¥þóó¦,C ¤þq¦†ê9‚º¦Ò¦a ¨×1oI:§¬djÝßÈHzÂ'ÏÃ*{Ò'ÈÅsD²pãnŸJªgq@‚q¬¢q‚"Ú˜!¨zMÞާŠ$JÂ$N'Yr@¹!Õ8ûp»ê$¬B›Ú©x­WâQØ‘¨çážòq¸Ê©ºªŽ:ÕŽÆóoý¶K¹ê©£ªÚ¨â¨¬Ý ­e«hò«ÖجK`­¯3%g®Þê©æˆŽõŠ®V¬qr¬åÚ®ä«Â*M·*'äú1«ªÌ*°ÒD°üb°³Ó°»t'w©øV>¦– ÙKp,X,y²šƒS)¹þ2Yƒîf²(»)tâtKuÍ“ò²Ì!² I$–‚)¶‚)¸¢³R§‘kbSqòr•ã—‘9[;+@K²Av%þh³DW˜DÊ*Hp–Î1 H ­Ÿ’9õtµi‘Ì‘üâ´4§¶%‹,+»uDZ!Òä³K ·´B´>×)É,R7F‡¶? ´s‹*9µ‚ëµ&³´Sõ¶â§µQ[ƒH›·—+s002[·™k·‘›+LK¹ µ?‡¹T+uäR”Í¡¤WA:4i0SgC0Eòƒâr“Ms» ó{,Iw.É0¦> ¶Ê ©ÒþžYøSÑ![Ú!× 4,:ÎKÜAè(´2~àÈ&FëÙžYÄi̦Ï&ÜTÞÈè_“Ÿô“ÝHßS!ßÚߢßRÁßþ=àüàQ!àžà÷aàPà þàìÁàOÁ¤çÝ"z£ˆÓßÑÝ®rî~Ñìa££vÊHÚá`÷áMâÎG2.fxL–y£WªÅ3ªkqªâõÆâLáâv¹_ÎDÍ]ê§½X¥'–ÊãNÎ%¥©çš'éŠ%SîMËõ¬º:IXÎHÓ8c¯ qËq>,—UίЪåQ~MõÈäåæãKQ-rû¹å!ç<ÅR|ër[³Lw³þEº¹ t¾·ˆ;²\#·Ìæ=îäY£ïKÈÇìèbØÌ¡½¢½+¹¿Î1ÀþØü¿ ¥½‡ŽèäææJáÁX©•)ŒÇ^ÅSŸÕÅÿÑÅPÙEüÆù©îêÎÑÅ»$Á¢Þk¤ž|Ë…œËÎÈâÍ…Ì\£ì ˜ÌÌU‰ÍÌþÌÎ½ÞæŠ®Xæ<Ò=Ô%]ÏËÄ_Ð4ÓSÜnÏTŠÏ>½™ÏáíæŽÎÌQî" ïÌñÔ×þÞÙ®[¦6ÙrRÙ”}Û-¦H†Çï·¹Ö¤]c:/XÖ¹ÖˆÝï¯ÙUØ£=ñçŠ÷Îg¿ŽŽÆ Ûížñ§¶þñGÑñ$Ÿñ&o(Ÿò×¾òEÑò./ê0O2?ól^óCqó8Ïã:/<ßóþóAôBÿàDðƒßëqáíˆ#ô ˜ô?±ô'Bâd˜l).õ™ïåU§„*M0.ð85nѬH‹\ßõß ö”:ÁÌ4ä1á{£ÿ±äkožmÿMÿêz²°f®«ÓÊ£Ç^P[.­‡Ÿ-®úp;«ˆ¿æy?{TïÕr,Œ»Ô+艋µ[M=uçÍ‘çKG¸~Î5!ùÚ7ù=Q-ÊÜ8 ì¾öûW€9 ”.–žw ÁÄ›z§ú²§úŽŒÊЮ7ØWýÖ¿÷Í1š—/ÐL}3Í8qWäþQ3}Ïv³™yÓ©gï±Dà@‚ D˜PáB† >„QâDŠ-^ĘQãFŽÎpIäH’%MžD™RåJ–-]¾„¹RÀ ‚‚¼asC ‚Z ¡Ã$„@5žLjÁs‰Ò€¢ ËÀ¢G“ ¼JiU¤JÍ@ %°':C¢ôütèÒCAaäQî\ºuíÞÅ›Wï^¾AÆXð`Â…OÎì›qË Œ/¶$†YòdÊ•-_Æø×ðfÎ=ÃþDŒYôhÒ¥MŸF¯æÏ­]¿.ZõlÚµm߯;sHؽ}ÿF)[÷pâÅGn—5pæÍ[ O]útêÕq/wž]»`èÖ½^¼GìÛÍŸWÙ}üzöí݇/^þ|õïíßÇŸ?uüùý·×g+!¦0Úˆ”Úà Zð!Çôƒ0B õâÏ? ™°A‚4œè«° R*µâ¡àš0EW´¨Â _„-C…¬€6Ä!f‘H)Pâ°¢Ú`±H#4ÈE—ôLÆ {BjA°Ä\è±­+ƒ$¿3E%™$36š„ ( ¨±§&ac3´\þB!–€C¦œZÊ)¥¸áž&‰d († c’Ü„Sζü,Q©NޏA7ãœ3 "ŠÄ –†0G%Õ¾1ËD0ázH Qê†D"Ñ`ŒSè|Œ%À`ŒÎwš¥¸˜S ?`$*°šµÖ[,±-5 JVZm]Â4¦\‚ŠÇ–0ƒ‹RÇ%¼SSE·%á` A ”BãÃ.&Ñ2¢Ð_÷@ß%è(v ¤l (^æÕ2Ú¥Zð£ ^a<‰ åˆbÃ-7c“;7]ƒ;S :€dD). ýS 7P~Ã×*¹˜„:™ |å„:Ê‹Nþ†T <„•Ü¢wc¥—¾­ãŸiÝv—xW Oü¥r |ýµ7®*sh]kR«±ÞyF<¸q‰« „‰7¤Œ+˜Æ;ïÓœ†úiá¼p ,`e6Ah¸›-0x$(×% Ha ȳhÇ® A5ü(üðÄS¦ÇV¤ ý^8D¾ÄP†ç¡áA¦¡éåˆy ˆˆäÄÊÄ@PT‚ÀÑr"ñÑ‹ÊáÍk—D $3€à€_•‘A±Ü—ð£)jäkÂ`&ˆ@¡ Cúb ëbD1j‡Œon FáLÑbbذ$G*f)#wäHƒ± . Ò“ä c!ý²Þ©‰MJ±T£Š¥Vô@‰1˜>05Ð¥iM¼#”¡¥(FaêQ~,eþ95FàÀlyÊ^:*!¡@#(60• m)âÉ¡µ(‡lR‰ Õ'ÅYÀPŠÒv¤d•«w¼fa+@@°"a†XZIç«L°c%kYì¼Ö³š¨ÄY̳žñB"lð*Ÿ-!Ÿë´–³bFh€ pÙ†‚e,d)kO:C’VI fgJ!XNs¦”ìr¼ä•´?u‘J—¸î¹˜RM)ÈÀ 6Ó´ §(ÄÔh *ž*U¦éB4p„ŒRÉ_B}ˆS&YðI (UiX!BÈ–G8#HÉrfM¥ÀS‰9Zµ¦”IÈL 4³Ùð€þÌ>IKreDF2“!HøŠÉ¥À ¯7ëæO‚†€/ªbŬBÈZVßH-¦g+#+¾…È´)¥§U[‚Ø ¢9³¹-žuc€’ê.¦žV)ok À Ah ‰ŒíIÙ>j͘‰ÛUâ2»Ü°”³$%àÑDœîs …"mÐÈGÂUKÒœRâ¸ÌiŽsì´nQ÷UÕ„.4 /uÓÛÆ%@ ÉšR&'ý›ƒbl—à:æ8IÎ}îI‰;ÝñŽ{ÀûU 6 5²‘_icðî¼–æ•å}–ª[¥0"ÇÌÉr§aèuzö$W®r<þåѸ‰cñ0ˆØ»…ÏÀ?‚¼AR^†}q_^’\™Iø`>ˆª\àÍù9E« &ÁøuSs•­Ü$,ƒÙÌ@ó˜9ÃÂ3·ù“iV³aØìf:{Îq&Ìœë¼çÞÏÜ)3ŸH?ÿYUt¢_XhCƒÑ”Ña€{8¿Ñ*ÚÒÄat£]¢g¼<1«Q\ /=jÝdZÓ,átƒjÔ¶ª:d¼Ÿž£øIjZ×ÆÔ§NÏ£oˆ¦(Á ¸ ¹’%ÔÉZ{?BƵsngJ_ÊQĵžôÔ'>±›KÐ&/æ¯ls3•¾d‹5Ãilr—æÖÉ>Lt_ЊVþ8 VíèuÅ«Ðñk£Kè§G—@¬äûŸugÁZn‚[æÜè.‰p&9Ÿ>Œ¨ûêšÖòÕê¥\µP‚U‡CU½/xÈ#sp„G”€-,[ ²2HµìÂTrlÍ ³™É\¯ mb(.+ržï…ä%¿„ÂŽZÜ‚mk‰8c5)ÜÔ~¹wL/:冭ܞWÝ|Èzoþ¶îv¿{¾û]œ¼Çð±×û¿çïÙ;‡º¾X~V‡;]~^òÛiBw=@eZ Œ<< o ų1Vj< ?\^Bá?¬÷ÿÊÇq‡ü\æŽðúÐ`ç|9²E¤yΓ3ëÿ)2Z‰Dàþ ó§—ÐäÑ @AáÈE}ìߣúdsZö·÷íqm{Ü÷…Xÿ¼kxï{âG÷§~ñ•Càÿ3É_~ôis|MC_1’´‚ü‘ÍK¿ÜÔo´õ/âi‡„hDoˆ¨½_pð:ÕY5ØÖKW—_ tÜ>÷ß¾þb·ÿÏ﯉^«7+Ù*X[".ñþû¾æs¾ÎX¶[B%g›h»“<ù(jû“kË%è¶fZ% |’I© \MA:O¦R@có?<Û:vs7f ¨6rz£8¸7~ã(’A‰j»·š–j·lÙð–¯Ò©ì?lÀͺÏZˆ‘˜‰¸£{þ¹ð˜‹*ûÁëa‡‰Â‡ƒб$TBdÂ&4‚@¹µZ¬•c™„™ºª¹¼‚C¯‚-™„†Ú7š¢Ñ"P¹¼4T´Œ³'l8×r#+\‚¤“¿Q-²i­¨S/%Z›¶±ÄÞ‘º»1ÄZCD5{Á®[»Ä;ÆÇé¯þ´ËC/ÏQ¯á‰Ñ)ê¢EP/#°P$µQ³º»»¼‹Áã á)Àã»ÀÛ—'R¼ƒ°é1DÊžía<ïÆQF+«¼Bœ‹Ì«ˆ%›ˆøiœJëÆC\C6 è=Ò3½ððZGrûÆ!c½#p=سŽþºG|lGw ñ ȃäˆ|L0ƒDȆ¼…|.†tȉ”ˆä,‰¤ÈŒl‹,+Œ¬7£/‰ˆ4X›´îÓÈ0H‚Œ É=¬$„ ¿†0?3âÆ“<3Žl)Ü"4ª°üHŸ|ˆú“Éû“µý³ÉÃIsÒÉDZ$îÊùƒÊ±*@ûÛb;J”TI­[0f‹@UÁ%h¥WŠ¥YJ›eâ@¹¢os&&²Ü6]Ú&ü%¯·«œ²¤¥RŒA€òÁq«ë)(z²'Ðy¨?¹7€¨À<¨}ã§Žú·!l;³K*KɬÜ4RZ8(”BšÚ›Ú‰£Ò)б-,ˆÍüL4ü—þ€á¸1ôBKÂÉ40¼,¤³"¬? ©°¡…J+%ÊU4J-¥L.u@/­!Ê1ƒNÀ?ˆ'ùûˆ©ʪL@5½KeS“#Ü@¹T9‚ð‚1À®h𦝄&(¦©xKÜ%o#Áp㫺äS¤ôÓ? :uƒÁw›Á+ä”Ö¢(‹Â¨})Õ‹–ÆäA¾ ¸åyÍL]SNmàjÎŽ‹ÎüHo*ˆ©òI_MÍ âÂÒ|8×”Uä¤ÕZ¬´J¹8üÈNÄR,=$iå«à\‚Ǻ¹Bí1q9rRª%"«Ý7½Œ*S)ÂRÏäÚòÚ2YJp€zÉ TEXÿùIÓ³½ ´….Ѝ£±ÓÂS3ÕS»í3|åÒd¦Þ!A¶ÒO ;¥hÔGÝ aBƒ%†SËbÙ@l›T¹´TºTAÁE[•Rþ}uÕxËš€nQŠT=UpƒyÚPÌ-…t'Ä7ÇÄ]ÔÉ] Â[&×§ÊÕªzƒ†j`€£j^Ô4Í`ݸaÅÕ)„Õà-¡áU07äͽ¢VÊ„TX€±Öï­*ï¥+»ÊÖáüCn%ãÄ^Ò^)ÞyÄ 4ØÓR×wUçL’xÝÎ2ª×øí ù%2C庽|O¶sE‚È‚h«û2ØßÊ‘Nù”E ®Ïº5`Bà ™Xct±‹­‰½”1 _Yñ¢:Ùv !–õÖÈxY‰ˆY¾ö›Q^>^¡"k½žbå#búÛ$îþ½%ž¡&vâÛƒbôÀÚ)¾´*F")ÆbÔÓbó¸bÕ`Ò<ÝÚ.Ž/½ Û"[õ3ãü@cCââlÛ¾¥2Ó¹µ7Æ8ÎŽµåÛŸœ¾¿ÓaÛS>6Ò}QÃm6¯T\Æ¥œÇ]Ô¥\ʵÜÀÜJíÀ¥¨(€2àI†T›˜PÐ ÄõÊHåܸDepã q ]Dv?V6O5ÅÓÍ(Õe]p݈]3˜ÝÚ½]\ÞÝV€VWZ‚^v¨f™GÄ\Õ~ã]b6VYNädÍ3æÔÌbÍ‘ä¥/æu^ЬޤYMPªX^`õ€©!V/ÔÂÕŒÞj¶æYVä ¥Mfþ%Η ßñUŠòUa-A_áÄÃ¥ ÁZ^V‚hšè™[蜻áy¶ZnŽúeÄÜdŠüÝßtu×M ®Ö2gÚâèuˆu.ˆMÌζ_©#P”èö h ±eÖEn\–`(؃ýß}UX¶h¨žVŠ-pæ}Õàóâà¶sؘ™6«³;þ$á½¼Þ õè«^‹häd(`2’î‰›È ÿü*Äë†Ð,…jø¨gå GÕx[‡Èaî{Ò¸þ©þ žGÔ¸k¾Ž¿î,#æG$lÂ>๶Ì0fì{ÅæwœãÈVÃÉ4ËFZÇÎJÈÖlˆålþ•ôìÏ+ÃÖJÒŽÚÐ&ÈÑFí”2í©ìÖ¶´×~ Ö–í7Smw´íÛ$Ú¾ØæmAóí+ îžîçî⮳ãžRå9ænÓå2AþNèîRéÁžHëvÂävî6ãn9óîï6³ðVVò¾lÌ>4ô^@õ^oöNo÷~‰Ý†ïìÍm6¤ïú–ßûnÂüÖï»åïôï¬Í>ífˆþoƒ pçðñCG`p··û»Çû1 ‰L„¼üÀ| R# #àûÁWüÅgü%‘‚Æ·üËÇüæè@ þ@èƒÌýÐý˜ƒ ‰˜ƒÑWýÕg}“P’¨zHhýÚ·ýÌǃJ0‰JÀƒÛ÷ýß|1{“ðz1þãGþ²ï«gþægHþè—~©Ç°þ>°ú>°~À€é÷þïwo°zÿò7ÿd ÿógÿö·Ìô_÷—ÿùÿ<ø§ÿûÇ\³ÿüçÿþ·²ýˆK,hð „ 2lèð!Ĉ'R¬hñ"ÆŒ7rìèñ#È"G’¬(ƒ %W²léò%̘2gÒ¬ió&ÎŽ'Sæìéó'РB‡-jÔèN•G—2mêô)Ô¨R§6LJõ*Ö¬Z·ríþªÕª×°bÇ’-kö,C°hײmëö-\˜jãÒ­k÷.^¸sóòíë÷/`¡{.¬1ŠÄŠ3nìø1äÈ’'S®lù2æÌš7sîìù3hÆŠ*TPú4êÔªW³níúõgQLZeû6îܺwóîíû7ðà‡/nü8òäÊ—3oîü9ôèÒ§S¯nýútf¯*ãý;øðâÇ“/oþ<úôê׳oïþ=üøòçÓ¯OÀxüö÷óïïÿ?€  vÜ x ‚ *¸ ƒ ú§y‚'¡ƒZx!†ÚWàF(t§!ˆ!Š8¢…˜Êüp…ù™h"z-–!#‰5Úx#Žþìq¨‘‡9úø#9ê7 Lòˆy4N¨c~A:ù$”%n×á‡QZy%–õQèJÞu°  ˆrÇŒ/z ¦˜dΞ~OXá §Œà~kÀ…‡(™%Ÿ}ú9á”A‡x#(ºæx¶Òù"~ú¥Òw?Œr)%xW‚©°*»,‚«bÔ*³ÑJ; ¢·2 fâêݵÙ¸í¥\ðªŸ~\,âÝ"ÉN».»î9{´íÊ;/“à¹whÈqÇw ž¾üú{éþwú!€$›ù[²ô:üpŒ²:(Ä?¬ß"EéÝ$;¬ñÈ*úù±p2Á—ª2K kÈð¡~®p2j©Û\ñ»Å{3ÏÓ¾ *~'tŒ¢Š~‡dëÑF#2®O¨’ p r©xêÙ3×ìæ\ÑÎ]‹=6Ùe—ý5Ea›½6Ûm»­,Ú©ý6ÝuÛ}·?K1Þ}ûý7àÆ-'h r8â‰+¾8ã;þ8ä‘K>9å•[~9æ™k¾9ç{þ9è¡‹>:饛~:ê¤PG£Œû:ì±Ë>;íµÛ~;î¹ë¾;ï½ûþ;ðÁ ?<ñÅ<òÉ+¿<óÍÞþK?=õÕ¯7xDs[¿=÷Ý×=DÚ{?>ùåÛ þC⛿>ûíí7¼|»??ýõ÷‰¾CêÛ¿?ÿý‹ˆC —º°€< ¨À2°| +·ºÖ9¯‚¼ 3¨Á r°ƒü C(ÂAJþ;! Sˆ!2D*|! cø.Ä… ²+Ú£Ÿ A]ó¡ g( ƈ b…%"?ÉEIŠÏü¬zñam3¢ ±®]LpßÒV´x øá\â¡¡Blè.÷`Âk,(Ö€#pâ ˜ZaëxÇÿˆ1Iz,Ø«Ôõ„@ ¦°£zú˜È?Bþ­D j‘"ËÓG:"²‘ñaò³D°5ñ>îY&ÞIÁ%!{t$PÊS†ñA«¤«ÔÕY<â²hÂõ¨õJK:h”:<#ã£JS²>'èÒ7™¶NJ’Nq±°^1=ž˜b! .Œ—epœä$)^Iò™Ñ\Ø—Â4&gz‚©@Ä ÐpNï€3NsŠÑ@²:À~gdNiÒóMö$Ïü ¦2$ôéLÓ¥$Ô&ƒŠŸú„åúùÏ€`  «gE]#>dÒ;‰á(À" ,Êç>½“QÔ™Ð$è7)zÏQ`øé=³–§Á’þ\=Pez§¡¦'`Ì#Ô­å4œ÷Ô&7½ùWŒ ‡H`ŠQÖT 7ý¨N¥JVŽª”¥r$'®fºQ›Î3›Ûì&XYγÊt­JÕÚD­ V±bͯf­kR½„MF¯^Å#F`…¨â ‹æúŽÉœ©LmªSŸª,‹ +YÊRêQ›+:0K€Â‘µe5Å)Oíêu€ ‚,3Q‘Êtíd½#[Ï–±øŽ%PQ†ÒZ ´°.mËd[IáV·ÞqogáÛ7¶n„¾#…T R Ç@v­PÛqÝ6·—Â.ͶûØÈ—³³ýl„ìàá~÷³þ¡¢Q#J'ýÚ—¸eø/©È»ï€BM?€‚y\³G7³›µÄ,:påJ—½Ôu/®àÛÛßÒ×»÷5ˆµK§ô¦l·ñ%ñh9æ1Í®®[¼ñ„º{ÝìnWÂIëoÁˆŸê¾—Ç0®/tñ;.0Ö„¿œ%ÐÅdç²ç²Þ9Ú~¿ó«` ‹ÊŠr1eðè Êè˜Åì-—AXy-Ã+LA¬…•`±fó”Ùìfò”`v|‚'²ü2Wzî²á,g\ëXvF³”×<Å=‡÷;²e&q.ÐÙΉŽóœM§4çyÒˆÎ!´lj…«ÐD@ªËphV3L]Hþ¥çž]kIsùʪttHÑu¤e½êòèºÎt:6¸ôÓìG“Ú×ÀN4+'Tí`C»Ù¾Zö§-mhCϼn3¢—ÜdA‰S…VÏ5¿SQ@ O-ƒ¸àún½^ª[Ú’(¦ò]Íf–a ²@®¬¬æh{Gàß"+¾P Óß_lqÃ=œhƒ#¼\f\8Àñ­ñ&}gxBTA§ù‰?xÂYŽq‘Û8?•t¸ÇÏñχ¥îËpÌuO¬ÝEõÎÈÚƒ‰z' -Ë~VÖ²—ᾑ!7È,éŸË0ÓשB¸Øˆ¥òŸ%¥BÌfyL^ XÁ<‚èG`Ê  ª²Lþ~ü‘L|xӌ̌pÂv‘îØ‹àþU ÷}G^— NØfàöß–ÌXzÄ-Ù ¶H&˜w ¡ý­þa§p˜ & .`È á¥˜|¹ ž ,yáÌE!þ‘Áä`‘Õ`Nv_þa!™ – w°B(%ÓÛ5]È%ÍÒ¬Ç"H‘wp,4=MMÕ\ •%eí‘~4ÍÑà¥H ÕXM×}'` Y™QÈYâ"z‡#ŽG€ MÑL⥔@"pS´‰"bbŒß&¢K'Î(Êâ(†‡Ò@È A%¥ÔJµT&>A-†Ù-¦].2â.îÑþ2þS1L+ŽÂ+öß3ÜRQÕy<Á+Ò R3~ÇTÁâ%2"!""~“+LP@1ã"$ã'Æ"3>âwÄ#Myb[c¦ü!'æãÌã!f⥄ãÌáã?™Ñ8&b9¾ã?&$.Ò£—”ûíˆà}ÌB:.‹F*KGžz]…|¤|øÒ~¤¡ $¢¦¨¤¡ ‘íaYÌ4TŽe‰IþÍN–ä=œ¼ QB@ËíÌíÌd€'BÂJOöÍSò¤2É"¥U^å %B¨Vv¥WÎVW~%Y–e÷„¥AŒ¥Y®%[J¥L¶%\Æeà eA¨å!þýÁEå{À¤\þeýÐ%AØ¥àÀÇ"Y‘†‘¦c®`„]J”‰@Aj]ˆ~´ÑÅQ/e`Òc†fùD¦@L&¦Ü+<*’ûU…¬ŸhÆ&÷æ%Ä VáUU”¾ “%ÖBÆUnVÔoÆ›wܦV¥ÕšÝ„§of#QÛÉ&uVmÆ‹…ñ׉¥jò…ùWv ¹Øwz‡AŒ­•§—åy&™y†§öñ›w¨[uÞ'à\ç `xÌZ´½ÈÆø§ðçŒÄš²õÚî5 ¾5&ª‚ÊÝ„¨€ÒYt†‡}â'†Þ~‚ÇÖ-‡Üþt@©Ý·ˆÞÚØi‹‰gthŠ^\NÌÍy˜‰6ÝwLg†æ(Ýl¨ÝáŸî…\œ”î ¨•Ýž— )…zÝõhÞE„~’¶Ú|6åwÀ¦Ž^éÚðhýÝß­ aü¥Ì*4Á¶¡~ü ¾xŒiff^ša—’ RâÂé‡i½|GHb©ž’–N\!ä7Id?šä– þ&+º"š~Ç5þf N‘@¦ã5˜A‚K£Bg"ÁUPäžv*×ôé‚ð%x`ä|¸äõeyªªÞ ¨*ˆ¨&åªÆ*TN¥D¦'-˫ʪ®â*­fOUî*°ë~´ª°«±jI¯†Ïþ¯+³6kL:™³F«´²H²¦Ï²†„ª^öÐg¦ê´~«ßôi®Òg½D65݈2 §‚+»~OµæÏ¯¾ˆežkƒd¦=gÞaIµ+¿^Ñ»6„ éjª¦k*i:xXi¿.,Ÿþk Š~ 'Á¨ÛsÖΧO gPaj°¨Äjì8i Ž2,Év¸¦çz ¬+x'|˜|žè{™Ëá‚N znVËÚ…–,ÏžÃÖÄZÛæ™H€.Û€ö!H¨Ñ&iÍ ­ƒ¢[ÿ•ÁÎö,Õ:Ìɶ(½qÝš„èˆN‰"íŒÌ(\­(6¹(‰.ªbU­ÚZíϦQÐ2*þAˆFþ‘^Ú–A”òÞ’Ÿ:iÊ(ìÚ®´\­›‚©˜Ò)Ò¬™¡—©)ÍÎßwnþ!®—å©à^.³\m¤¦L¡^ªÅJ£¢F­çFã£âŸJª ئ6&æ¶n,µíP^멈¶^’·º.îž ±kîö.dÂîVÊî“ù.ñž%ðŠ¥ð¯òòÏî.¯ófÑñ¦eò>/õþî[V/öîOóf/÷¶ÏöbHí¾Ù^Ú¨ív¯ù"ëõfˆ¹>Yºä{0æùƯaFo]&/eŠ }h&¾ºÔ,Òhʯ_ý¦ýb ‘Iô}ÒÁÂ]…Òà°Wdü€ÇÇ&ÕnÚ 2%Öþs•Wy‡ÇÞUr Örxü&‹0=yðW¥í¿03xd'{©IÝJËÒ0†i‡1 ç,/}Çy²§g؆ñ& '±ÛAk4è¹í™ ­(Ô6ñ¯ 6­›>)øQñž9ñî‘YË)ñ ÷©ÙN]'Ê‹êG³nÇ–mÖzh›Š‰NÝ‹ÇÈšñ°dòñ…•nѽ²xò+iÝñm“îÝy hú}þ!ŸwD0 pŸJ®—ÆT˜i Â@!—zq@î–Já›Þ`Ô2áš>!åJî([¡å^²÷éæjCjmþâr(ú):®0;ºc˜!æþ-O*ÁT* ê1¯c;N$Ó²ü~ï…„ï{˜jø¥4ײ—æôn38{M7׿7‡³9gî8Ûê9¯s ¥s9³3< 5Ç3=ÃÊ<×3>ë®;ç3?GË=Wˆ5'Úøjs?×ó?7Èú&汬kAÇóAC≤Ȋìï½ÖK¾~æ¾64™„X²F‡sŸ¢pZeðwpIA‘pwU ‡pVµôA•ð·ìqIŸsŸº+ŒÊ1± ²1ÏØ…q7æˬΖqN›ô>Ç€vñ)ÍÊw™S2Ó‰±TƒËÔ658÷)Tº´ñõÝ0Yc­Ò¡çw°hhÊàþ´WosŸB²ßš`!ãíKòñeñÞÂm#7åH#S\;õÛñ´Os å~)®dŒ»²*—,w‡™2d‡òä>v¡Íò`KsŸ.‚à‰Lñ5öâ.ÍDû²,6ó0£‹1Ÿ.Cþ²ê2ôfÓòîÊ€'dH@·AÏ6m?õw %Â,ào÷ ùöN‚hA4·s‡*r?·tgGO·u?Ht_·v»jvo·wQwˆå6Áï|èÇnwÏV·0¹GBÃ]û–äB7·z3luëG¦ÁñÀÁB‰dyð¯Eûo{ëk}Wí}Ç*rm¹¦GH#¬–T©`xÉöé§´™þ0Šã$tÀC­“—VMË4n&5y¦w4Ôw4Ô‡« „À5…÷kŸ&õvJ'HœwÈ(,W£˜Ö*k§ù0Qyty±q!—r1×i!qŒW8rkõ²In}0%™ÝŠúgV_ñÓBq3ŒŸ}S Y(–3y“Û7r·µJ{G" ¢H`‹bË¿ÍÜÔ±õŸµ¦ÄQ·È9Œ–ŒŸ9¸¶*"ÿhx B)”Á,Ü›ß ÌÙ©îõ5öýµ»‡ãAžäå9:„´ Ok&[ö&`ØlâÊâ"öcS¶&S®œjY¢:Êl‹fú #÷1 *i&ÀÁJâþÓàJ¢R#9þré3 "ó¶Tj”â)2M*;~Ë6®+{/y¯6³Gz_;¨‡7¸û³¹Ÿ{ sº¯{¹·»³{¶¿»vÇ»¼[7½×»tßûð²Ç¶“Ü@ß.¾¯­¾ßéz¼7º*&ü|à²7~kZxìw›`z8Ü]t+¼Ú2<‚+¸(3ø «Çƒ;pÂN8Ư7r£´`‘“†WÒtx‹ÿ8ÈÆñw\8 Ÿ8~·]ÉóìN÷ô þXƒÇ‡Žóx¥,yÚµ¬ß,‘ÖRç¼#wTG9xLù¢Xù •yÚi9ƒryUGmW;ý‚µXÝšCž›Ã¹ÅÝ-Ùkþ‹§õÙFm ƒ}»Î5Ó:x º¢3ú¦U‘fžxHº^òûI¸Üë±â Ê©e$UXÍ“‚k&uè° (QwfMthÑ£exúZÆS‡‚ar%j4«Òˆ¢ê¶`4/ñæÕ»—o_¿ÿLV âÐL×(TF5U5ÉC be ;aUÖYiMÏ<Û¸%Ã2žP%:àd2 þ€WË:¬‹´„D|Šƒ¡`‡-– ]{ýu?¶ãÖ× „%ÖXüJ€&Ë÷×C-£?¶¬ÕÞ{ñÍW_ŽnÅÕ¦= ´T’fù$V,ÙWá…n¸Î~ý¥ `‡)®Øâ‹1ò°ˆ§ËØãAYä— æø’‰GNYå•Y¹dŽQnYæ™i®ÙΗ#ŽÙæyîÙgåpöW矉.Úè£ŸÛØd‰©ãwÍ;Aê2@£·Bé­¹îÚ¤ qúé4§îhp§æc‡¯ *^¯áŽ[îŠÀÎSlváê`’z º¬ðæ;°&”5Ø&ˆ ænÜñ®ëòn²þÓ\%Žƒ,9-ð*üF’zóñÑIï9r÷œªª«Z(ü8„!×a—ýĦžŠJu«T+¡Öúª¬³zJ Ø®ØBÍăîðð2š¿cwÖo´«ôë±oùô÷4Ó2d'œ˜…!ñÉ7³Îú,´ÑJ .5†XÓMËFcíµÝ|o–X b T¼ï{ò#Èp²—@~l{DjZy’„D•¡ ‘`ÛñÇ æ9•jÖÃï¨^û)HïÓ?„”`Ny‚'àSÞ ´á ÖÀèìÉC JÊýʰ†È'ˆÁ†8t¢…]Z)‡×!©è‰?lþbEXÑ PD‰>ôõpF1ÖJ‡zz •¬„%‚\‚œ` ò¤(M©JWŠ»t&&dLešFt5ƒH!eHÖXG5ÞHtctä#åTÆÄì 6bˆ+8‘¾Kf²|y‚¢õGAJ+“ªÔ¥B*S•áS¡òÓ¨U*êôïj©ˆCËPIRÞÈUôå/y$É\=ÐYÐRÅì^;dÖ."ÊbV1£¥•iUëZåÒVÑÖ.^ XÖ<—ïÔÕ&@ æ1µ2/¾“ídŽ0;°¤`%Ñš;ñ™ÏãÀó_Ôç?úH~Ödr5èA7P¦!”¡ -þBãO‡N”¢Hƒè‚$ZQnÔf=YF9R‘ŽÌ£éIQª°’‚Ô%‚üˆÔ:ª)äž)µ©MWê—š-›N“ÔÚ(ø¶›u¤9 Cô¶N¿=oD$œçWÅ•ª5ªçÊ`9ÌiŽr#éÜÔ"ÒÈªŽµ¡W-픩¯ %DLqJëtGÞ}ðZÈûŠ\E°o,À[«ò˜F²ö fu+ÈÇ úåÆ5ŸãŒg@ã½øÑUöËåcnCBüe¶~í_ Úš•p, G d<¤ìií3B± ³…-{R›Њ–·í4+WD™èBÚP‡þ–hEZ—‰5R‘^Ë\å¦F°½µ®/IûF/í±©‘£”™Æ;n)Jâ®ÅD&6% [ùœX¯_1±NPl*c¹JV䓋Ÿ%KI)Ka*¿›z¥§æ©*üjꃽ”ïƒÃhÖEhvV ¹²u.x5sYæ|V4U3ÍQX ÃæÚÖ6½•Mw•øš_*„a¬@³DžøLGRÓïøz3F%1‹Ýð˜ÈEÖÈŒU1 ?haFvò“‘¢´¥aÊU¶2D¤­·…Œ¯|V˜A\ÁíY¸b!¢xĬ°®ËæO³¢dwgù§[ÿH›ÞËòÒöTZõÄv~|âBÞ˜£ô¬1à ¡AáÛ±¶ô9!¿¯¸ÛzOH¿ î¿I£Ïe;IØR¿ÝnŽFSÌ+‹¢›ñ]Úwù޲‹A=Ö²¦uÁINþð¶ ¼»fʪzùûÇó~°Ô/7ú€¨m_3¸ û•—(ÀiOoœä¹›>AÕ„;}X8ŸLVDÁ*pƒ™utµ HÂöƒ…Y¬áx•A¥H4'½[ã:¸ÖÊ"zýë-}}ÅØ Šã~*u®ñ:s§—6‡Dη¼­îm2€ý8ÈC.ÌåAÏ3$+™É‘ýéµ—y˜±õ­Ü¥]{¯Á^öµ?ímŸ{Ÿá@“ÏÈ›]Šg©&L÷Å÷êsÆz½_#zNPé¶·5Ùø¹ç½{ rèD/ºÑ*yô¨Ëéè_ª“®¾ñ¯OÝØIýÓ›3‰¨}Šçþà¤èç—½Y‘íW¶˜¨æ™µÞo-×\-RÖ ð€m!†­ØŽ¯NNÙŒGÿ¾ÂÙ˜èiðjyZÎþîù„怣²<Ë 8nÛÒÇÛr® ¸®|¼ÎÜÐMÝ:°ÝÖ³+Þ>çiZP8æ mϬl µúÍ 0pîëJKà.ˆÎáhk!N…ØÅ¶luϬR®Šú'‘âãüãëˆhä¾.å ËäTމ˜lRî-. QïË|®½R£ÿÀíæv.ä†0ä‚Púh½fŽläg°þÐ0ô̪ìTÉP´n^¢®Ó²©ê ëœî’ÄÍëF¤ìÆì:eÁdéµ"1ì²®UÒþî[Ϭ [Ll5æ®îî.ïbï#ð| oD ï[¯[¯‰Â‰l Ïú<ôÒü$ožD¢ž(ø~Ñõ‚ѧ’±{dùÌ¥QG q­‘Nªñµ±â40l”oÁñfºÑn¾1Í1N²ñÕ@®ïj˜¯%|¯ûfj%*oO­AM$Þ±ƒÚï÷ú úRbúì±Þðo´OÑP‘üBâû|Jü@ç ¦j ¥­ ÉFÓØoÏÜÏ#à/÷Ñ Â%rÎÌjzGÕ–)­ø$ÖüÖTQ×Ä×^1ØÐØ òÏ®Úb¢cùnq$$£Í¬$ |þÊ}:)|Ä!¬Ä¿îÇ­ÜÎ-Ýh«áíƒB*½î)ÕDâ„2ÐÎl†ôMçÚh!üÍB‚pDæ)ŠpäN qK+¢-0g,ÃR$ÇQr¨‡˜h ‡èã˜rÏ´í . Gd Ó½¾0E¤+RðŒ1Ñ21Õä ÷²ÌHK‘ÜHæÊ ,SÒæ/…p-Ý냎½†îŠÂ.M³ @23Á̬ti“4 Ü8I}žî§n!¬ŽµÎ».ä&QÏîŠzƒ+}s Âéâ¬eÍÌêœNrÕL² Lð.!ZòXZÑcѽhñÄl±›2ìTrÑÁÓ'W‘/þ:é,£q%âÑ#ŒÑ#/¢á3ÌäóÈÐq?_®?ñóG:@¥³/Q§ tA—A¹GA4B[B@%´BùÅAÈB5t/(tC=ôø¦Œ  ôCIôBCt¡J4E¿CwhDUôEAôD© FiôNXÔŒj4GÝìF'ÉEuTE;ôG4H…@‰´HáóH%ò!˜ôG•t ›U^ôI‘t/©´J…òJ±tIyt˜¶IµôK×1LÅôÉ´LÃñL¢>1-]àì!ã Ñ´ËÔ”1Ò#ý¬$B ç”N»4ž¦&©˜ço2‚!£Ñ!õ±üúÔOetFËF« "s4b#ýsU"¸þhQ­ ÿÕÖŠ.Ü*w¤B®¨(`B¯n²ÕËŠ˜Çy "zHR30SSÅìOû©10ë4²Ò±Ø§ ܧ(ƒÃàƒá°2éÒ þ'€HX5C/m•Èt oK„¾#JˆZy5 ­…€†\‹†n0ZL Á Õ䈎«‹Äð­’MŠ 3 §ËR!R‹¸0óU^rD]L …ns¾‹ŽÄ+5P³U“]ðŒ ‘>“35#6ÖËpUD Â8™Î9û+”Ö À>§85q11;né¿vé!ìb‹ ÏEB?“ÖÌ–6¢¦vCëôj10kµöü¸¶kѯjl‡Tl?Šl#´¤&aضmÝömá6nåvné¶níönñ6oõvoù¶oýöo7pwp ·p ÷p7qwq·q×£$wr)·r-÷r17s5ws9·s=÷sA7tEwtI·tM÷tQ7uUwuY·u]÷ua7vewvc—õvq7wuwwy·w}÷w7x…wx‰·x÷x‘7y•wy™·y÷y¡7z¥wz©·z­÷z±7{µw{¹·{½÷{Á7|Åw|É·|Í÷|Ñ7}ÕwA}Ù·}Ý÷}á7~åw~é·~í÷~ñ7õwù·ý÷8€x€ ¸€ ø€8x¸ø!8‚%x‚{7 ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_p_9.gif000066400000000000000000000461271343257752000272720ustar00rootroot00000000000000GIF89a@…猂„LB<ìÂĤBDĆ„„$"$lZ\Ô¦”„f\¬†|´fddJD„zt<2,Lܪœ´–” ôêìÄ–ŒT>4$lVL,&$|jl\NLÌ¢”¤‚„”ŽŒLBDôÆÄ¤FDÌ’”„Ô¦œ¬Š|¤~tŒvt,¬žœœ64䲤´’”\:<ìÞÜ|b\̪¬üúüÄ¢¤ÌšœÔª¬¼šœäº¼¬Z\Ü®œôîìÄšŒ¤NL„ œ><ŒüÎ̤†„<24D:<´Ž„”vt\FDdRT ¼–Œœ~|TBDtZ\Œnlœzt$,"$|fd\JLÌž”TFDt^\„jddNL4*,D64L>ß½ýûøóc'Ï[¿ÿÿÈ]}ØÕÀG u6èàƒáñgzVhá…ë-(´( àrb(∠JÈÑy$¦¨â}RQG%9øv[TR‡ èðC$° £QDÁD‚ƒ\ •˜ñ‚ƒ0¡Ão:0Qd7æ¸c2 @©ø˜å t1Á]Dà$LD1F"©$“+Æ)g„åHáœxæùÜ& D I_†$Z\!Ê,„^!‹ŒP4Ñ8|y’$`A,ƒ@Rƒ€PF‚‚&zh¢‹©å ÀAäuo@±ÁþP¼áÂzݤ•^ªç®¼*gâF(ö*ì°¿U¢ÀÙŠoZ°ì Zd!£ ¾Ù —nŒâÛ•l[ •Ì!ã³Í’+­©Ùùf‚¬èVBí Öú&»6\—­·Äæ+쯫ï¿sv2K?øh²š f_fÀÃÿö‡üßÅ_& ‰*  [‡Â0<ÈǾEpÇðÊò›‘¿,Ç<"$.Lp°ÅÉ@ïµè¦"‰p`$ÑCdŒîÍÛà×¹[-ÏóV{Ï2W¢ËÁlõÖ¶aÍ› }4º:ú»·BÁ$6´- £R„™ã|ôŒÀ-ñþ«®ÂÊî8 EÚk·Íõáb}‘Öˆ7î ©ÔQ„b× f0¡°‘ ¸Q = ò,¿òÂØ–Û $\Ac62fDÁ智ã¼Û§¸EŒ÷.<„*oüñ¾ý^QðÈ7_ñÎG¸ò1/ýõâAýöS?‘õ܇/þøâ{/‘?t¡þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  HÀð€´ß¼à‘J¤ìŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ¡GHšð„(L¡ AX‰þï…0Œ¡óÌðÉð†8Ì!±hêð‡þ@ ¢ˆxø ñˆHLâ}ˆè˜=ð76ˆ(DƒwéaQHƒ¶Á‚D¡pàÔSVœ)cQœb-ö0Qâ’Ñ­ƒE-Ê‘Œ¾éâÃxÇ,n‚Àa“îHFí¤‘ŠV4#”ÈÈ2±!NN¢pˆV´âQ(ºæð b8„$"pôhJÖ$+yÉL~I èÂ&~66ã\‡“ž¬¥o@)JRšr[4p a¬Jœu¾Y¥%1©ITzÈnŒ& ÉHÇ‘’˜2ÆiÑ"›éJΖºd7lç Û¬%:…YÆßt“ƒøæp´óN]úÆEþ\°Èë˜S›2â’—ì)Í‚^š ±&p&@KßHÂfèJÀà0†ÎS9ÔIÕª|cÑßam¨$¾j´Õ‚s®M-Ó4K\áqö žý$%—…?g[àå|‰ÓpúFo×År[é\hÅr«§|îì)]êŽ ººÔÁ,‚ÓÒÞîr»˜ìîu÷VÜú6î¸I.¼p‚< ’m5 0Šñª§ÍTë È_ÿøŽn„#§:RßÁ, °vá'ÂÁ`ÀA…Ië¶ßþþW²¬Ã¬}WÌ+üĈ,ޱŒwZ'`ÝiÆ8Î1]˜ŸºÇÇ:òŒ]L ùÈHÞWûuã$;ùÉJæ1”§Lå9y F®²–·ìŸ+ Ä+ ³˜ÇLæ2›ùÌhN³þš×Ìæ1·°#èK œçLç:ÛùÎxγž÷Ìç>ÏyRæ²  /«A¿ÇQq{®†æ\§?P4¤Mœ˜–И&‘¡­×i¡¹ŽöMc›3jì°€·™NuË–ü²;QšÒêaÃzC=QU9¶ŽÏÑb@UûúA›vµs`ž°aØÕm§®µ£ZüúÙ v²Â4¦2•LLdÚœo:‘„ŠYHB:fv¨D‚wµèE1*¸‡ä›J4ôÜ0:“›–”% ggÝ ‚˜“ $¥Dgl<ƒ¶Àñ#m»µêU±jmßn*D±9kÔ£~›Dieð Ÿü¨"IR¾Éœþ±ñ?ùW–ÂÙýñliSúW§Š7fkà8oOÁ¿ä4xñ¬çñ*’6qÉÎhge4W»¥ ¤läÆBÖoî5n‰mžN×·ÀGçD+ç`_ÏÎ=2‘‘la2ª»Ü‹U´3Èn#ˆZ2‘UB“ƒˆ{ÁB>Çš—±ìF›XÅ 3Šn…ýðà{Óœtž`?¤oê§VýiÊ6Íëô x £sÛnY‡¶£khÛxT+5c‹/¤«}¬»¶nûºUg’á˜Rf‘ ŸggV¿{ŠÅv5¼í†wÉw?•luûSךT¶1s¿þ+2u#‘„+Î Ÿü g”¼É 3n  Kwn×½×Ñ‘ùLÖ xƒÀ¾“2‘û¨Í{‘ÏktÊ;‘⫾!ãô;2·¦½‘K½dWwlgÀÌ¿ LÀBÕ¿ÛûvìÀn—½IUxÂ*e"€“:iµUÛºXûY—ö5®+¢g™)¡7“èø­ fµ¼“.Ù3/Ü®G£4Ã5³[74yœ“4¼·ì$“8̶ód¦ZâtAüÁg”Cɸ§×ÄC ¹3«{7)Ä„ù%? zœ7Å3Ü“ùèÂZÂzÂE·>Çv_¬Å<ÌÄ!lÆÙÆP¤Z¦[·ÉÒÆ†¨”¿1v\é•þ¬2| 8‚“]¡4]º·5GÈrTù”XÉ6ÕWÃl÷Ç’ð•5L8’|†óÅ7µÇvÓ·Éìdɘ<Q WR ìŸ1j ËÇ.¤¬e “ž,¯Õ•—È…ÌÉДÅ_Ë™ɆS•ÉW$¯ÌQ¸\Êbù²ÂÌÇÆ‡]´gËuÊÃ|}É´­%Èš\ÍÌ ÍIûÉ{KÍJÙ–P;!À˜‚©®C;¶³ÎµÓ¨V`|¤È©ÊÎEŠ—z™)¹c€‰€Ýyè<˜Á¬ÏXžÌ™bé;Úf7ä[оáÏÁÐê|ruIÑÖ—Ï%n{Š*~ù# ¨0-Ë‹™¦êÒ)Ð`bþÏ÷k7 ½!=Ð Í—y9ÈþwO'=Ñ…y˜ƒÓüì¨ æ:%Ív>½;-Í¿å§Ð%£Ò{ùÓ½`I}~ ý%E-™lÎ$‚™‚[£™ R ~ ~P°^ý¨ÂÁ™7Ne %Ú k½2ØÙÇÃÚCÜ šlà@³ +œ`ÆAš¦ÙcÞ;ÁÒÖ+ö›ÀyJ•›ÛCØöeØÇùØW3×ET×]ÙzâØ–ÙÀ&ÙMDÙšýÙšÆÙäÙðÄØÁáœþY…0q Ú·¡’Ûâ‰QäÉÊÐAŸ®s°3môF]÷vÆÑŸ´ýŸ¶ ¡•Ö™¹ m»­:Ìò]/lÖ"¸Ïþ‰¢ ݆èlÉýÚ¢]Mw"§]j¤Dj$Œj—®åÝâ‚Gæ ¥“¸©¥z‰W*°,:ޒڥ譨¿¬Ù-pcW±B{ý Rõ±ÀQ±ØJrÚÚqDk¶Áñß»²Çj4[»ù­ÜÛP2¨·V<>-µj» z«ŽKÇŽƒ0º ^¹¥·>á¿6vl¼ &v)X¬¿Þ ì)w|ÂÇ!ã üIqëâ™6vTŒÂ#¬áq<o[Kn4S®Â?ÙÂm|â¿‘áUU¾ÇHþâÞSwÌÀ¥ÍÙ¼ËèK²DKf~ÊÈ Èü9kÄ|•öš•ßZŒŒ±þo>Pf>äæ©6v/ÒïìÎí a¾ý…N—Ó×Ï4½UÝÏmè‰>^ÑšéV-èƒ>ænEÚþ¡ÕÒñÖ#X Ži˜½ê®î­þ겞±>ë¶Nµ~ëº.×Q»ë¾>~¢ÞY¤þëÄŽëÁŽ\Ã^ìÊÎëX½‚‚ÚÃ=…­½ì`÷„¦³}†£†ÛÔ^™Çž_ÅÙž½-aÌIÂ}†m˜¡ÝvÖþ¢l¾UÀ]#:Ýc££ë^íßþbw £:xm’© :©ƒžPžNé]ß¡ªÞšŠním¥uŠß÷®Ûù^dwB+ÌŒ.Dû±þZK!%à¿Aà#w² n4¹þñÚ-e¡k7©û¹>V?Yz âj+â<,¶%®¹bSò&OáR¶‘ 3GC~F5XC®ã8Þ4È›ÙwF£Á;òÍ>)ïÅ/Üåyå[ìÄcSåžwå•åFãzOõvËœ0»Í¯gæuóînžÌ×ç·,çÍGç«,Îbèc/æRÆï…UêÔ ;¨ÁšUëV®]± ØQQ„ „6&º…pN%“%E‰0(BIm)J¬‹°ÎF„•l¨ˆV-Û„vP°éBÁƒÖ"„CcШ$|uRÅœYófÎ=þZ4P«^MŸÎ ¶b¸r'f;¶]²c›0\Xb;vš凟Œ¶Oæî  Ò›…°m#ì‘ - G]ûvîݽ¯´4jò\U/[vbª¼Îmÿ6.Jݹw8¬ÉÅ„ìy € ~ð ¿ö‚*áí¡6ƒ0B '¤°B Ç+/C5ÎCèšhЉb,L‡YRjh(XXèÅ»bcE„Ú°A¿MD‚¢Äí¢¾¶ZI'MDqÀ¡4$³0J)§¤²J+}ÂPCò8”‹ 3¢ð`"Hp£@\* â*BŽ—DÎÜ´ˆþ"­AhH¥Ž"¤@hÌ2Ïr¡Êø¡VÜÀÁO3ÑTò‡GëJI'¥´RK1ËRËÓ¸Ôš‚‚O¥f¡pº4UUWeõÒL5õŠÓV‰‚@œ5W]wåu»Wa5/¬^…RŽƒaE6Ye“úX­d]6Zi§¥6ÙfýJØj·å¶[o¯¼[h¿%·\sÏå,\gÇE·]wß…÷'ueWH•‚²×½äº"£&êã‡|›xÒSãE8á¨æ…µÞñÝ·>}¡Ó΢&*ƒQ© Žp‹$P`‚êb!R…OFÙ(†5uø0’wˆ¢8@@îÞB©©‰Dim*Žþ ’ª(h’¢`±Ô”—f:¥•µlÙ§‰F™àI"8BXŽóh6t®ªŸ/žxcž RZšf›í§5ä&¢˜ Ì>q¨ÄŒøšˆ’Û¢’:H K71ç®{¢JÚ“¢ˆ:*Éáî¼÷në9©¼ðº˜`‚.Z“›n»o½ùòi˜EÑ`Ž„d{}¶„ùxÆœV®qE„¶Oùí ¹ÄŠ&6‘G’Òm‚%šE-p Ôp„Š?>ùA4âÈ#”)УŸ¾ú7 ØyæÁù ÿ§=#H€‰r ò"„:ú(¤ØË°S‘J€ A—^þ&¼òp)=ƒ0 cìôÃõÌ=¡ØN¬7ˆFp{Yˆ_³ÆP@‡Á +Q8øŽƒ,<Ë”$îi€¯ñ„ ²Ë …ø.nI[lM^Àæ=ï†d B”Ø›ßg8Å±Ü ¥6±(Ê¥zIâ-ç@Á °“Xá¬I(~ê‰ð¨ÑŽÞ*"jCÝŒ¨²™ø&ÒÁ®5©Oûé£Í~´A¬°,.$d"…"$ Ð"#óƒÈÿ1'\Cƒî8ÊoåqSGôˆ´w¤é†j‡ØÖ´61¥2DÉÙr䂽¤GH_Íþy¾ôAa}¶\å/[)1„L ÙÁDd„iJ G:ZÄò$Rvs[¦4 —"à%0‰‰L‹2 4 ™Ñ,âç—FW1„àIO¢R 68ˆAÝÌ.h@çDrŽ.ŸhêgJ\ å( NÍ=÷4\‘Ž>² 75j­«`+VG §œªÏô;•ðCÑü0ÀƒmÔ¥õèG_ú6Td›0äLu:,pÊt§?ª{ÚvÕ¨G…×Pƒ…T¦65©éVŠêTªVuYJ•*H­ºU® «ÏÒjWÅ:ÖU}55aO¿þ…€)¤¥d…«QÍš- Ñ3›ƒÈBJ–þѸöÕ¥sÝZ‰Å“0hFÌ J.ïʳ…Ä@i~…¬7;U—åÇ/ :ìØ*â5°ILm‘­d¡Õ³Vdœ¢“é(7FappI`—EÚ)ävë ã‡[Ò©–oÿCHïB;Ü;N•1hE+ð¾å!§Eɬ{ô7þ}o{¨«®ÿ`R’}‘¸ßM q #Æp0¹‘\èòD“äð/«AI(Ã`z¼÷mšxÒÅ)n‰ô©mpóÎÝT±TD¯èß,ææ:ø…ðÒôÛòzÐ?„ÏBÒ«IÄê‡?ƒ¸OJ<,É»ÐGIŠpŠã5áA¼¹Ê}ŸP4Mþ±È!Õ¬&}®ÉKÙh;î%+Q¤EnªØÈD-ikZP| æüš!'5¥¤Mo‚¨Ä$**»n¹OçÔç 1zd2£‹Å±AE#Ò¦¼µÌoÆc’IË©.´BPèœõ á3Ó. #åž Ú3ÚÐà-ô¡Mh9G•²‹†tWiJ‹uÒ•ÆtU/½fݵ­•EŠ›3=êÑl4v%^5æÏ£ì•Ô¯©A½Â– ± Qlª;ë£8Ö¿öŒ¬·hY`–½<áìZomë£|ØÏÎ ‹O›8ɸiíkc \ÚÖnq ¹mîJ7¹ßzÒfHÂ!Æmí2þ”J›HÀd\mz/¬Ñ1å’‹“»\ðqWHÏýM2]îíÏ{Ú…Ÿ¿Ã¦/–¸d»2¡‰MP…ÀzW¼),®D…ÍëÂÐ'½xBÚ¾¼w¾çínr³˜A”0‘™Ler¢A‹×œY÷ö(—ø+F4Ø8æ0T ß$ØŠkrNÏ.‘å4‡‰Ñ™ÎÈ&£f›W48×3®äƒØ°­éâM~øÂ´Ä×€ {v)ÈØ¢´zÜ…Âb}ØG2¦&yk\‘ᘼS,ïÌîÚK!D2’2“´$CYî›…'9Ê"¡²rå)g™>]ÎÓDIf4þ0¡;T¢H¿8Ê:&ƒ|ì2é4‡†ÍL1iRHÅw@Ê^ög®óóœ¬ZÝÊ÷ÇG6Ö×R?ZYÅB~ôg¯|z Vú×—–°±¿ý^iŸûߟ•÷Á?þT‰¿³ÃäRÔêi1¤÷ä§·ù•­Hm*ÕDÁš\ ÿzË9,€™vZº[Ó, È5üCˆ]cˆÇâ¿_ó?‰y¥«Éš䚋롻2±µi@h“6Ä1(ߺ6¿Á!ñ j›ÚY7ÊIÌ)ÁFÒ-Ü©6TË® |6º{1~󥿒çIò¡ñií€éz¸“ž!¼®îéŸ~c-¢8„5ŒÓþ8 B¹ á«„H! H¹“ã8“èB½ˆ/“ÃÂ1ì®)¤BRc±Ã"¥[ d5™8LˆI:Ùa$¢3°ÛC;¬ˆkÃ*¤¾†Ñº+¶Ë?ª?A|!®“F$0²CN¢D-:±B4D%«Š¨;²¼³Žª‰¥ $°Zú[ÊQ$°ÀÛ¥ S¼úrK‚? 4mÇÐxÀp$GL9D–±¾rTÇ`;G¨IÇu„ÇhkG¸yÇx´G{óÄÒºÇ}ÜŒqìŒõþKµO›F~tÃyžzÌŽûŠüÓ«e$È‚ÌGºJŠ ‰ Q( p‡I,Óµžñµ‡ìĈ|´G̉Nè‚Mp"f‹¼ Lµ ÉÌGqòÀÔ"·k’7°€àZÖ¹6Õ‰ÖÉÈoCˆp›ÁrC£|ÉQÓÁ}c®øá0°û°ù©Ÿû‘©´ŸŒÀ®ƒƒÂúbä¬Fƒl D”D—;6‹â‰Z8´ü 3¡44¡9¡9¯¬´7 £8äCf{7„(£3ºË…ØK4òC£;0“ËzF¹44+”ÄLd¶7x„ $K¤܈ÌK*$ÃD'ÒDCLH[J»ó%¼s‘¿›-0I”l¦þg’„h"ÅÔ„&\ò1Á MÂ#2ìÌCÃEÊÓE}ê<Ù‹ÄÈ…X¨†Ê²áô‹Ò¬“z =|Z½}³ÛŒ4gìŽhTŠ„ÎA³Fá»ÎÛäFoÜÎÎôÇïŒÇðÏu$Ïò,ÇóDÏpTÏõÔÆöü €DÀAÈ÷sOü‚ÏÎPÈÁRµ†ÜÂû$® ’À•<Š\ÈôHÛÐáP÷ •|ŠdÃÀŠp¶½¯D­¢´ÉHÒÔÉŸäÉ7XøÁ!¯ä ¡´Ý7, œ7 ý®ÏÅ„‹B}Y8à‰°Jª€4ž+ò¹YØÊ&4¸'ìA§„KÍþP°4¢ñKú"0X{QKH!/9·$ ’k$4l9,•¸”ÒТK)â¹¾´ HP…п„S DCºÿr°Ã\S¸RÌòê:³7àƒAª$Ë<¶õp"K<$³ÓÌÜØÄ@uP*Õ£ãbÊÁk¥«ˆ%x‰p¦×lTNEXĦÙl¥Ú´ÔKÈ%[ˆ˜¼Ê½ËãE‰4N‡*ÕZÝEc=btN‡lÕ¾’N ¡Î¤°Îb%«ìÄFfeOL=¥”h¾o„V[ÌÏkå¾lÕVìãÖn•¾oWäWK‘Ï¥Ïö[ÖqM˜r¥”ý„˜þ„ýcW “ÖpBÈ:$P þ¥åOüÈz ž{õ©óKˆ=,paÉùtIØW•É í­šÌ"ÑÉØÉŒÌ1QUQ}QLˆ‚(`ÞðI ì“7¨Q8uQ¢œXk›Ñ£¬Q‡mW‚%*MÍ$|§ýQ„R“ R-0R$UÒ'å®ì2 ã ‘¿„¡eø>Ÿ-8êÒJ¥ÝQ‰éJœ}*ˆKB=Ó,œ-­™.ýÒ2[5”/“`¡›µüÂC "Ó¶]Û·äZ5õÚ¯É#ÂÃ<%09¥Ó‰°ÓLšÁåS“H¢/„ã”ÜÀÜÓ£³KH .@íÛrT ›Ô9ÔD…ÌEÌþsTŸ±„xÛѕ̉˜Û” DH%̼ãÌÍu1ÂóÔ…UQUMÖ4]SÕ¥T€U|€õÕÕœˆ+ Zâř،EèeUÜ]1]ªXÕÝ”29ÁU]e¨ãìUaõ²‘3`‚ÖØU1yƒ$0ƒ—õU}Væ´UeüOëå\ìÍ*Ÿ¨=)1P£HÖP³Oü=g¾(ù_¶ªît>ÿU`WýÛnCw•``£à †IOI &WýýDæ¿ á[ô`}áñáþJ°Ua.a‰lám}aXáíKáÆÍÞ`®ºæaAóa•Ë Þ¾!À‡4â~³%fþb2sâ'6²(–â£â*æ3ÎW,æ@-æâßóâ/†¼+žŠsåÏOÃŒucJ!㨀W̫̠×5V•r›§D WLµ X:.¿0ÎŒ;æ×¢ Ð–œÈB~ ä@fᣘ¶¤Ø£ÌXnë¹Ú*Š˜…Q­A4ꉔåÉçè¶©ÛFžù ŦT¸…Ú ›.¢¸Z¦ÕÚúê‰V»WîZSAÎdE$ËeëR±KI ¸[3ýe- Š`άÉe]®ù \?õK3’Cü©(¡ ÜÅ%̾üÈ5]ÞÑ\g¾^&Š­[ÆDÒE\"ž»œJ]tþ™Ê,Ý K‰JçSþ&ç¡Heè­¦å^¿cç\ÙtÅu®–¦¿ëÝmbÐ{–ù“Õ\DFÞôÞõÅ<ÏCŠùèÒ3ŒÓÎðåÕ[íM$V‡žìß ¸¥È=¨Pc“¦ÿ ¾g…é#›0ãÀi4ªVÏÈ霮i;jãŸ^à|êf$jÄ„„kO&pê§†ê¨–ê©¦êª¶ê«Æê¬Öê­æê®öê¯ë°ë®Në³Fë´Vëµfë¶vkµ&îé¹¦ëº¶ë»Æë¼Öë½æë¾öë¿ìÀl€Á6ìÃFìÄVìÅfìÆîë~ÕÈ–ìɦìʶìËΊD@4HÌöìÏíþÐíÑ&íÒ6íÓFíÔF0$Hí×†íØ–íÙ¦íÚ¶íÛöÄ3°K8Üöíßîàîá&nàþ"X% ‚/(îævîç†îè–îèn=ˆ„H؃˜îíæîîöîïï¨ÊƒIÀŠ!‚ðFïôVïõfïߦ˜¬˜‚= €ö¶ïûÆïüÖoÒÒJ¬JP‚ý&ð7ðoo+x­x+@ð‡ð—ðß6„ÖÖŠÕ6„ ×ð çð·ìàl­Ðìðð7ñGqÔ˜à ˜‡ñ—q ï Àñ'è€÷ñòõž‚< rA¸„K"ÏþFò&wò'—nF`m&‡ò*·ò+÷m)7*Çò.÷ò/m-çr0'ó27sOó3Wó5gó Ió6‡ó8oó7—ó:·s/§ó;×ó=ò<çó?ô÷ó@'ôBðA7ôDWôüFôEwôGïF‡ôI§tè–ôJÇôLÿíK×ôN÷tØæôOuÒ 0õSGõTWõUgõVwõW‡õX—õY§õZ·õ[/PB¸õ^÷õ_ö`öaoõuMÁ€Jp…egöfwög‡öh—öi§öj·ökÇöl×ömçön÷öo÷p÷q'wf€@8v-ÁWp‚vw÷w‡÷x—÷yþ§÷z·÷{Ç÷|×÷}ç÷~÷÷ø€ø'ø‚7xw?÷t×u?ø†wø‡‡øˆ—ø‰§øŠ·ø~Ox…/†¿øŽ÷x‹— Q ð{€{7ŽWù•gy”Gw'Žoù™§ù}?y'ÀD@€Jz¿yŸ¯ù úŽÏx˜? ™ú¤úŸo÷U`…vGWøÉR'° ¨—zQ úvgúv_Ø„M@€5àú?°)«ƒ„à! ›WR9pà ˆq`¾<çÐ!Ä/ŽPˆ*@æƒO´n`NŽP Ç`c ›@^!†¨¸Á…«àBŒ"5H <…‡J¸J C„¡åLEApíÐ =ìI g˜¯ä†t 0ØÄ'šêŠY_è„02d‹$„¢dHCÄ‹ZáÐÀF°Ž&™`ÃÂ>Ž| !+(EÜ Ïq/ƒ®C!€ Vxþ Åú"× ‹䋃XÄ`ø²PH‰Xò YÁ,Ã+ë9”¢d–ØÆ¶Ä†iòe‡”$%ÒIL‚«•\S"+‰ÁNÊr“ú‚e%uùBºòqt´#2Û2¯- Óq‚ BÑ Šå~ÕLÀá©0Í·I‡”@7c8ÃwMŒŒt&°G„¸áñº§Oå\ë¬N>³RÎsŽ1þÄ&×DȵӚmH@­7P†„ñ†ÈÃŽ™Ldⱄ%\ÊF2q)°¢k ¦@<1 “2Â9ótHÂ˜Ì œ¨ 'ÜwÈ”ÊáwÍ3 ¸TÊRJyjþ7µ Cœ‚¥M©PIh÷<Ó|M•!B]CK‘ÈSŸ¨ »jV]¾®ï¨ÎKéJ±ºL\nu}?m&X)E‹{En£í¨3K…Ý V ² ‹FœÌª¨áQEO!{•©Òµœí¬g;u&8á¢5¦™˜0,bëÆBäoR _üÁ„0ªÕjÃHûÇæ‹¶ ùìa ÛÌnömÅ nC+Ù~1œ-–i‡YÐꪼ5®o=Ë\Ñ"Xµkñ*Kíd„­È\½gïž&•ä}Ñy‡D*S½ »Ôn‰0A 8H–”ŒâÚ-å¢S¹7Uþ±YM|œT¬ ‰ú=0øÛ_IÁÁ~pp¼àD5¾°i$q®Ú;âd•Å.~q¯T¼bÿ®U6ÜÕH¦6å„õ¸Ç=’ñŒ\ãÓÀ d½¢•­b]3ùS@2…‡œÐˆÚÄYø’BØÕä-GÄPV|S©{UL!å2šmãå/ 8ɽ-ãZæÊ­È !5»ey&¸Æõ1d#+Ùž›V6®3͆>Ò“ÙLây­‚8õ_ò(0ØÉŽvhîÄéÏ…ntÕS ý^*G ºÔ¤Y³¢kœ†šQ¬Aa×V¸p¶zƒ¡þó áèÑQ›º×¢AuªUœ,ôÌ“ÄÄ/?¹ÈF.D˜,dŸK HA{”¢.´¯³âD›J«v!Cþ‰°Ûvó› §¸Mi¢Ô¡üìÊ™µ-ï(q»Û`f´£¡Y´U SÍÊLkº£æ”ßjˆHRÒ“V3®»ï¼#`Û{IóºA(¢f„:6·¢¥-À#Û<÷,¸Íí+È+Øïš\´/­nè$.ó±Ô»â?#Rˆq"7Î g.ôpÕÜæª^¦)ž@†Y”o#ò¥¯x‡.uÜPÜèû‘'*±‰PļW6ðÔÃNõ¢[=E-;ÚCTõ²_çìiþ;tÖÎöå¸îvï2ÙçΡºß½ïjλÞùÃ÷üœ™£Õ1X‚î÷Ë=ð½|NŠ<+'ÔJ,ÃêúâQÜxÇïF»¡2G¬ìáe÷éå^JÐÅeÜ&l"~œ 6“m]&b("#rf^]¢cžed¶Îéœh¤#G´ãhÒ"d–æ?*DÒ-]Óµ&F%ZbÖqmþ$nRå4öæþ¦P§prq¾¤q'ê%çF.'s.žs6$tFgßM§?Vg :jêË:ÆkZ§ˆ`gÊ…>Šg‹'9¶Þöä×@FDAªçA>á=fYBºçx¾&l:d€A¤>Mdcž6áK^¤Ž|zãîýÙIB_ðe‹H¢$óIèG¦ä(± ׌$þÔ Ta-ÓJ6(u<(6†ŸNÞ¤[Ö¤Ñßû‰Ÿ¦ÑßBdû­&pAj¶p T¢hŠh€’Ä>`®ñЉŒ6¥’ršB “:Ñ’ngW´š¤‚¤B^ØW ©t¨h4~ Xvå‹Úä z¥‘µ`XÒ˜XþÎìSY‚iÜi‘åZ-áŽÛ*EEÊåÉÐe[:!D!#E%€ §Ü¥:Yžvª¡böÂ!W^êW-¦fb¦K5“BLU\áP!È‚cü›>êsˆ©2Çg.—Ç™NffêfÒ* ¢Ü_–êjs½qE¢ ¶œÜÄBþ RÍ’¹êFê2ÖFwj„(zEx:«pÀê0j'¶Jœ¶Ú"·vë¼}«*†«¸j¹n¢¹ž«¯¥«®+»šš»j!¼Æë¡Í+Ö«pL+.}çµÚ+½A«¢<$q¼"D¤§áUž’aÀ. žBk˜ý"Ø hXܧáäé5ì¶ ¬fDlDš@†EÞ£Ejì¿ßàp(Õœ¨Éоv p4šLÖ(MæE‹Jä@`ødÀ, Á˜B3‘ÕûÖ®ü5àÙ¦mûõdÿ5­Ó¢lžªþeMéé‘ SJ$(:E¥SÞ:ÁÞ.%’Fà“Öß—ÂíÄÉm‘[±e%²õSðécPb-u]&9[øX®|ešiýÕ)ãzÅÓ ÝÂ%àŠ*fµ[}ZÒîê”Ö'Ÿ jëa¡Ú%ƒ–nãrl6*„Ôú%¨úÛ4Ó§jªVh‚àAÜCxmꈭòæ Ù†Oòz*¥oýµªïv#ðnádjÇ+fÎSøÌj®ÌÜÖ*TBü­ÎSbDW¦Î*¯.¢¯6b­†f³~¯é:n€ž&–ð+Fü«Ã&ˆÌ&Ó-pÚî÷éæÖ1¬Ïçž¾þfp&6piv°ãaøŠïûݯžŸ0„¥0ç­0 ;˜ ; WÊH©çw‚g©0î ^ O ,)l\´gÓö°ÞÉçv(Å‚…Å"Q~21l!$ƒpd*qù]VÈ‚ÅȪg‚*¨@8ª½"ñÜE¨Ì"mÚ¸¬âÄ, ‘MÍÞlÃäìÎö, NЬíçíƒhôu(@’‹(‰šh—°²4EÖ¶m¦üBÆÖ6“ׂ-õŽÕ[•íýÐèŒ.2Oªµ­Žò(ø¨—¾mÃ’1Û©”:RÐàî-dôm3Q‘ßÒ..D,.”ê-/»²S~±ÝžQ–niþ—)*¬*—™†nš6Sç–©Dbn.Íî,5“ç‚® Æé®éç3¯Ïœ鎱ï¥*Rfê VÓëKìþíVVëÞn4)!:gÓe5a¢òÀ¢†Çë2[ݤ2÷f¦&¯AÓJó>oôŽõôõ‚KöÞpò~!šŽjÐ8œ©¢ªªVïŽh*—snòaÿ‚f®¦oI/«V”@û~ÂûžLüÎoýFÅý2Æo‹þzfJ·Ü#Bmñô±"D²ªt×°Æ´Ñý°Ý0NT«µî0Ü"µÍ)u 7ŠTWUWu¡\µ½eµV Ww›Wu–„u°5Y_‰Y§Z§õ“¬þµ¢µµ[7 \³YGç‹ 0?å0\(°³Öõ—ݵ7—W+¢z1\19#²Zö»MW쳌že ¶áñçQ‹4pl¿)È6ñWt1‚jñe‡qï´fç¼x ÖhÍÞ¬¬ryd­qk¨Ûl¦Ê1Ïú¬ßmâ-×T†ö1J OŸ +!‡q‰ÞÒ8w+`Cp`ÏôTÿ •@\÷YeÐÕÂÚV$s-¸TrØŽm&;²ÙzwÚvòw»((û‹(ïhþèC,î¹Fw ÉárÝò7úîr+Ïò-Ûr- n î­ýò+g±¿ÔZ1séaØ·¸â÷Œ}`(q /þõ²±5©´93dPsT¼_3]s¦fóšJ37¿·>¥8þ„³}=7¶RøŠ­š=É<÷wC]tî².ìÊn<”>Ñ3»éîc›>+*£>Ä?Çxj+ç¼8Õï˜U”÷Ï[¦!AWoW0¯óB¯@Hoyc¹[uòno§R4™[4ë/Bhô©:Aª®*zï}7ùs΋kÆkNÛÀ6úâtJ¯ï@´ôKcVLÓ/Q÷–M7SN§ÜN;b^ ëL›¯µ@ 5m‰¦2Ó9ur¶“èµE85Oøµ«ÊøˆÉõ\wЦg'§Ÿ:?¦zy®:«o©o˜©ÇúŽÌú„Õº­ç®/˜®ï:Œôzþ­ëyz:¸ð5iˆ:« »{™çgç‹£b“†b;W¸z|Â:dÌ[Ë£Q'{Z{j06'j»ÄF$Cˆ6lX,¹­3;v©¬ž·ìäÆqqû Ÿ-Bè±+íØÐ6kƒÍBŒA*Ô*Ô ¸ÿû ’{]™;Å ÄðîÕJÚ>ÅhÕj·,åd{_|7³JwS·ö,- d€(ÜAæd@}2¯AüµKGÁ:ð“°ïÇįt¿%¿ò¿êíÇ*ñ?ÿƒ1™k±35!ûh¸þëGÿ¶N·K1CDû!MûhT»Ì[v­ú¶KŸeçË·R¸wÿ¸×=øƒ«û§{­;H£@p2`Aƒ&TX«…!F”8‘bE‹1fÔ¸þq#€@j@†9’dI“'Q¦T¹’eK—/aÆTƒÁUÁF²²|"5“‘TQbáq€¨À¡öüt Ñ5µ¢lÂb4‚7sît¢¨Ð£E"0æS(%"qET©MǤª£ª 7fÑnõÙ• 7<˜paÇ›~”¹˜qcÇ!GI³`%k…ˆeVˆ¬^5-V´ΞA—Ž3Ë‘£YF³Ü h³fÓ?‡>º[!€R!ðÑ4N£xØ@ ž ¢îÏ0ü6jÝNðdA¼{wïßÁ'–<ž|yóçMR&øÉ“£‚ª¬:ññ©tS°»áœ_ÚMþÞ°eˆ=÷ÊO>úv#M¬'ºA;ƒð¨¤)¸ ÈÀýÊ.¼A QD=BÏÄQL1%õZ¡”(Ü` ,À2Š4a«±´Ø¤*>'\„QF'h¼/Á‡nlq–(Šª·ÝŠl2­¿F¬ÒÊ+±´¨D¹ìÒKÉX$B$tâ€Jr´ÎLs þúo Wè0hÌ2ÛDÊI±Öt :Àdû,-OƒÊRÑE½rË/!TÒk"ˆ•Ö s OfÁ”‘J7ÉëÉÝ8õ´R£Vᤵ×Ê„K1ÕÔ‰R×ø´45 ݶ\!” 5iµu Z2iÔØc‘þ=ìÑI™mÒ0ƒ8 YáÉUꀃ͘Ü3©k³Ýv·§¢šªÁMâ‹vÚj·WÛ[ R„º\’à€:ØóÕÉo±}× $6 0Ù .X¢eMXaôÂÄ2ƒW7š…ÝiÉÀà‹1Îx(ÅîØãÈÖXä‘I.¹;„?NYå–B6Ùå—aŽy!”W®Ùæ‘Z–YçyƘæ›^9瞉.Úh+Z鎇>Úé§¡.,饩n¶é¨±ÎZ눦®Úëg+ÝZì±ÉFŠã¯Ñžôêí®È(Eܨâ²é®Ûí³ÓÎÛ˵ݖtûvBâ Øîà o½G‘ï4‰…þ|ຠLîÐr QÖ ˆ– =ñ®/ä°)2 D¨M$ r¥ØÀIKTôÛé&ÝôÝ S-¶Ü+ö\Å¡Ý0Yå“(°Jʪ®Â‰x½–òJ #ýÂ]û±uçÝû—Â,î¸ä¢-³=)Ó¨ fAbSœä±üËί.7x òpûý±îþûÿU’³ ¨=¹ÚJø#ªø l@ô…ñ‚Gó1X’0­`IR RŒÐ§¾ ÌIÐkÑ‹@H$©/Tªà {vÁ Îp2¨ûS U;O ÔAèd'YêWN² ‘(3Ò0ƒaÚU¯r©L‰°B¬sþ]iØçø9!Tq¬¦¸©NÕêTN"Vѳ%2€a²¾(WÄ­¬¢Qø·ŒrÀ9aŽì„»Ä¥/€‘0ÔØÙø½Ç¦m™›#1ùÈÅE’“5Ìä'A HvÒt“ å)‘8JR6Δ¨t%ÿT¹J½µò•µ¼],e™6ZÚ’—‡Ãe.¿¶Ë^“l¿fÕ„y±JNämq«Ò%‰5csiÉÔ܇þö£ƒ dpV*ᢠµiR3hÖ%Ÿ¾ƒ¹krîJŸ §87IÎÿ™vnúŽì®© ñF§‘&JÍ©BÑ©±¾ÒçKÃA&9WPZá¿\Xž v° ûªŒBÄ}9IµÕ£D‚¨Ã!¾n±õä A5µÖ ü­ÎH[Ú„ÑR¦45J°þ@%*£tQŒ¦Zík#òÅ(ƪLÈÅß\ÕôDÝöɺÚÝoOá2Ž–7ETŒ€ÀvõK\XèÖnÜ˯p=w® dº¤EÇõΗ…N—=KóÆ|ÑyˆL 8Á \ñŽ7oÖdD*¶ÌŒH,DÐL°Ì`´íÒO Ã,®sa,¸–‹j”b)y¢›#¿£b˜Æ3ñîèYc7ªÄ7þRŽwd,õØÇ]²‘L¢ YiGNò“ÁCd&§ÈÉP¶òv¤<åU™Q¶œ92£XøÊÜɲ–SÄ\–;Ù \7If”o¸̆93šÍÃeèîy;ê ;ãþì9ÐÕÙÌKÆóK׌Nïà“v& ‹o -5CÚ«j†ˆEybP¡(ÖH… I!zR‰PÓ(ehB+–ŽJô_ ÞHjRV{!Ø„H`ëü.¤õÉ^¤×Ú;ŸúÌ,~ôU¤çê¿úØg‰ö·ïõî{?€ÓÿùÓt}ò›Ìwÿûá}ùÏŸþõ·ÿýñŸýïŸÿý÷ÿÿóOýÖï<>  ð0p°ð!0%p)°-ð105p9°=ð0 pI°MðQ0UpY°]ða0epi°mðq0upy°}ð0…pm& ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_r.gif000066400000000000000000000313201343257752000270310ustar00rootroot00000000000000GIF89aH½ç”†„LB<äÂĤFD|Ä¢¤$"$lZ\´Š|Œjd´’„ĺ´<2,´jl,dJDôâäd&$lfdÄ–Œ ŒvtìÒÔ¤–”TJLÔ¦”D:4”"$¤‚t4&$ܲ´ôÆÄ|^T¼šœ|f\œzl\F<ŒÄšŒ¤ŠŒÜº¼„nl Ä‚„¼’„dRTÔ®¬œ24„f\TB4t^T ìÂĄ̢”´Ž|Œnd´’”,dNDÌ’”üÒÔÔªœ”.,¤‚„4*$üÊÌ|bd|jlœ~tÄžœäº¼  ¼–„„j\„ ”rl¬^\D6,¼~|$,&$”z|\NL¬ŠŒœ‚„T2,D¬RT¬žœÌŽ|ôêìŒÜ®œ´bd䶴̦¤Œrt<.,ľ¼ôÊÌ|b\¼z|T><äÆÄ´nlìÖÔ”&$ܶ´¼žœÄžŒÄ†„dVTœ64üöôäÎÌœ><üþü„´–”Ì–”¤†„ä¾¼„ ¬ŽŒLBD<24Ô¦œD:<|fdœzt\FD TBDL:5¡LÚ‚ƇƒWÔÆˆTrbc¢Hï9æˆ;|MǺ߰éuÙÌ$D 8ÆÄB„A•}2r*˜ÎЭ1¸aDžœšÀ?Öæ<ކÓh®5ð‡Ì” ¥TáÀ~9„*ИZ˜M“«âýÃ$è¡ z(#âXÊSÖÉ1a`%+Ù3L¢‰U£*•ŠP5EôÌÎ1Zp(UAFÈá.Ðå²då˜ް„ÙÂdЄ!´œ¡3¡)MÈÜaw»Ì”%§‚@$ý*XÃòR±Ž•¬"y®1uþ¨…ŠÐòÉ ~ÃèŠÉ=f €Èä ç X@8ñÏ€6Â0]:ÕÙKÚ| 3[èAlÑÏ-Un£íØBó.v¡ô¥Y§T'™€ù ¦8­ŒÙ¹Òœú´`*ý©PïÔÑ¡5uE=ªRS³Ó™öt©PµLS£²¹5tMˆœfNUM*UmPçžH¼&ˆ®1¥Ã]Wç•ÔÚG8Ã㌠z‹Xô @”Í1±z;Çèn­á j¨Ã¼äA†Rx„†!;æõ1ÆCÞc–ؤµ5?Ó›¦®ç™HP¨š‘ %ûžtJð‰|æCŸúÜú›Æ°²V’þ)U1i¢b:iĬ€-Q@JjN3‚Ž™`/(Îzжh„-æd Ö*©œ¾åÞ£ˆÜÑ1ºÔÔ$÷–ØÄ'’¹TR®o˜û๱M© äu¥°ÛÞ.6žplð¨G>2Ò‘Ó”¤x—{ÙØ!±QÒídxñÙ …¶ ÚÔð> QöÖ”H‚M.÷;Þþ" ˜®jn˜ØÅÞÓ¬¡ fc¤ð¨&ìµ É\f3ŸÍ&“Â@W;™õÎgÉ3Z­qAXÀ‚H4HΊç cá™±âSŸüô'@Ú£ŒªÆjlëj>›Æ†«Pvž”EÓÒxe¹p_-ïS9cÓ}Ylav þMÏœÎ47eÍl¦¤›™ç8ïpÎK©³›‡g¥èiWÅ× »,§‰¼jókÊedAoкIkìýfE?GÚ9±k× â,²JÅ¥éliG÷N;‘½ôf´ ƒC€¢º„«] ëY¿ZL‚´n(+ê¶Z@¨íŸ"ÕtéüÑg{M0­'Æ7Zaà@ ±ØÀëôG¾*x"¶j¹wÊCXÛèQöø&sˆ9p¨s8³¡-íÿ¡ºÿÁ^²Ã·lÊ”ûÜé¾·¦Òí$_áôk (wÔ„uGûu,S¼=#îHP=£ÎsÑ6ÜLãÆ5„‘p-8<~.AJ0Á þc#hPñ¢! ÜÆ˜|ƒñòÌÆ‰+™C ãÜÃ8ÇA.r‰âM˜¹½o®©œÛççÑŒ¤0º¦p…-|áÎC~Ã]è:ìµ` ©ÆˆŠRœ\|À¸]&Þ28qÈÞ„ àÕëÞ•¢vÛþv')Ñì”±5¬Ñ®öÚ˜qˆ„âneôŽkÂçZªH@c°Ø-rÑ‹I{“8ÝÀã=ë‡n«z=ÓÈÑŠ=œôÝãðÀÀˆ8»tLçO_Ǥ=¡·¯NCzÓ·ö‘qš£gbO«Çž*R!ù¤@Õþô¯v½îÃ{×Nâm|-åèO7ÁÁÃ#A4þp h¶1n‡ „!Ã`ð×6ØÿŒö¹ï}IIß1é &‚NVº–²lÌú»?Í÷“o”¸kзu6Lž‘A,¦K$6{Ø•bnÀLM°€Q%PA8ð}wr)7N-fb´“MˆÔDhËt#xv®a µ`9·MÝôMX(pã‚Êô€ŽñbZ'cE³ó$-×WQL6dù‚ù´O%õDÖnP  DèmGÙV„K6Pf…XˆK˜dMPP˜…S(Ë"„8vdLØd˜)‚’ÒPQP(…T8‘•\ù•:á•`9–5!–dy–0a–h¹–+¡–lù–&á–p9—!!—ty—a—x¹—¡—|ù—á—€9˜ !˜„y˜a˜ˆ¹˜¡˜Œ¹˜Žù˜‘zS™–y™rð˜Ù™žù™*ÓÀ}Pš¦yš¨™šª¹š¬Ùš®ùš°›²yš0›}P›¶™›º¹›¼Ù›¾éš´¢¹ fPœÆyœÈ™œÊ¹œÌÙœÎùœÐÒyœ0fPȉÖþ¹ÜÙÞùàiœ·9œáYžæÀ N@Û™2ª pPœÚ‰žå©&RÀ 0óyžüÙŸÓ9ž‘ÄéŸzž {ÀžÖ‰N½ ò¹ õYœ]Ð Œ Ÿš¡Šœºº¡ Úž]p0`œØ¹  ª€k Ÿ{à \À%zÇ \¡f€¢*Ê¢Åé­à R°8ªž€ 4z/£3ºº ª°Ø©6š£)º¢-j" \à OpjÒ£WP R Ÿà û¢jºœªº¦pÊœÕy Á°žGÚ Äp@ ­ Ÿ²` pz¤þNP 50¨Ø‰§zʧŹÄð]@ *ª 8 ¨ƒÚ ¼ §¬¥Ú @`Šº§}jžp k/€£Å¹Ä` ] ½ Ÿ¨Ÿqš«*œ: ºú«ØÙ l€£y0£0òY Åé7ê¥ö9£ØY¬Åy¬Å)­Ô¹ž &š¬ËÚ¬Ö Qª&ž` fð­Èj®€ ¸êªfp ùiQà ò™¿Z¯fЦñ¦ö§' op¤\àÝÊ® ZœQ€§8°k Ky0¬Ûz¤ {¥ŽªNð©p +°fÀ¬Å©² y ìºz¿!Ÿvº¯qН¡þ¯*«¦Ú ·Ñj¬ç:Ÿ[œSz¤æZ­3j¢pBz© ú­9 ž=kœN žÀ®@®Ùù²¹Ê²á²T»¡ó‰ |¨yjªëªz¡wúµŒjŽ*«’J£pp+@´Ë©žš³f° OPªg› 0°N[œªð³¸@ {ûš¦Y«¡VkX{¸:ŸNð©ËZ¥À±8+Ÿö‰  ¹룞 €£¥p Wp¤•Û±/à¤WàìJÁ°¹;ʱ)p\ "ðªRÀ ¸p ~ –*±Œ»¡‰[‹¼Æû²?P Ç»¼ÿÉ«ê«Ì½qJ ¥ÄþP«Ò›½Ê9¼Q¼Úû½ý‰ ž  /À±àû½Ü;Þ{¾ìÛ¾îëé+ëû¾ô[¿ö{œñ; žÐ¿þû¿À<À\À|ÀœÀ ¼À ÜÀüÀÁìÀ¹Ûû;ÁœÁ¼ÁÜÁüÁ \ÀÜ«÷[Â&|¿ù ó{Â,ÜÂÁ›Â±Â.<Ã4ü«0ì2\Ã:¼Ãˆë¼n ½<ÄBœ¡7Ü9<ÄHœÄÒYÄ qÁ!üÄPÅR<ÅTüÄ#¼N\ÅZ¼Å\ÜÅ^üÁWüÃJ<ÆdÌL¼G\Æj<Æg¬i¢+À j†KƼð¶klÆ>œ¯@ þwÌ®Ö ªð®Ò‰¢¼0  æ»ÇKÜÇ-ûÇæ¹ÈËI ¨ÐžÅ Wz¾é™²À ž¼lmœoŒ¡Ö¹ ¤ É¡ü½š [ž ¥Ü¼ä9Ǥ2¡)3µ`ÈYº¥]jN¦cZ¦4úËÉÙªÐÆéÌ]pÌbJ¦fЦXª¥\Š£:j¥. £½üœ0¢?{¢’{¥» Î3JÍÉlœp®· §Œ©lº™*¨p; ‹ªªÊª¯«³Š½t›œºð ƹ’ «²J«¶Š«©ºª­Z¶‹zª˜ ¨øì¬*³­tj§^;Ñ~jуªÐmœ;ÏÏ9ÏQþÏQª¬Û¬ ûœ®ëÚ®ï¯ù¬œ0à ë鵟îj°òzôZœ2]´6Ë­- ÈÅ)¬ÄzÔ×ÉÒKÓ@MÒÍjÒΉÒ¡ÒakºÛÌÆ ²"K² ›Ñ\Ýœ¼Ðf¶<ÖÌ ) Ö#›°Õ§ëœýú¯ØÙ°t­ &«ïlÕ'-ÉWKÉv½Õ/ýœ»ÈÙ´OkQ›œ‡}œTp¡Œ@ÅùØS»Ø}˳N}º-3Ë2K³>;­7« ˜œµ ØW-ØŠKØÍI·û·ÖI r\œzË·¸ƒ[¸[œ·°Ä`œº½„Ë®·½Ù ¶ÀkÉìʵÉ}¶§;ÜÅþ]œ¼Ðʪ͜X=™®-§†»Ì}œŽPÈÅ9»µ{»Æ¼»½û»9kƒŠœOTÀ´èí»ìJÞ¶‹£°»¢”« …Í´Û±œ»ÕN0ß¿ûŽ|ÝØÍÚĻݹÇáI æ­ÆyŒà žË~á'œÝ¡¯3ÃŽá ž>õâ&~¸#.%~â,¾¯) +Þâ2^µ Þ½ >ã8îâ5®¾7þ«®ÊuÈA®²žãúâ1®¡„lÈôi‰ÌœO¾¯üÈFnžH½ö‰Ÿp:Ÿ˜ìʜܜ_§NPäÁ);ÊUÞŸW® c»åÇÉÊ®lÉßÝŸO –` ÁPÌfÚþi~žk>ËSÊÎÖœ£Mú¤° ¦Õ¬ÌüÍÌìÕŹèÅ,èÊ\Ì Ù_ÚÍ ¤C+éÐÉb- íý×}nå;.¿Xª£*Ò mm`¶‡n®Ž½íÏÀ»Ï·ѵ~ÓÊ©xKÑ·Ú¨©ÿ¼ÐÍ2Æ Ð ¯R@Õ§ŽêŽÑã*ÕðÔF»Õ?}íD­®ü½±ÆYÔÆ¹í6]ÖÜ=Úf@­BmœÖ:î5Ôvm§N ¥Uíßùçz±‰Ü×ũ׳Îïf×b=ŸŽð!×lý¥æ¾œÚ©×.²ûÜïdíœÌn°Ï^œ¦nï÷žêá²Ú‰´ pÚìn¬yÍþ±¥€"œŒÍ®‰­Ùò ÿë#OÚìÚî—-µÔ©ìÅ)êÅIêÆÉ翯«nœv+ÝÚ ¬°¨ˆ| ` ¨€HoÛ{»Ù²]œ´mœÇÛ‚Kܼ½ÜmœÁήikìf0õϹvŽçz^ÝA¿ñÓ>Ÿ®;à¼Kß„î¤P:­Œ°¥{ »uÿ»ömÞ‹»Ë*ÞiM»÷}ÞŸÏìö‘»ìê¹ Û£NÐ äQvjàTþö¸LÂà9çÖùãß áË[äžÏÇÓÞ¢ŸúiŽïÞÙú®oä°?û¶÷ ûºßµ¿û¾/ÏCÃ=þûįÁÃÃ_ü¾ßû3ÙËþIúM>äJ­½¨OÃÌïÂΟœK>ÇQ.΂l¼S®Ã°ŸåLîýªÌðŽûßÏœ]>Ça>ýº¡h^ÃãªdÛä‡üÚéÏú뿜p®ËaFà@‚Í0˜P¡A„ >,ø'DŠ-^¤Ø(Ž=~T†]šÁÅ̪T!X#PD0.®žS “+µ¤!€O®Ñ%EÕ¢†'6ü°KJ,Y]„îqÅ… H•2º³çÏ ‰"¬õaàÌš7Íðô 4lN ½.m*“¦M‡lùÒ…*•ªÕƒXµrÅIW`Ô©U~ȃQòdÊ 5ŠÄœ™#I“»´þb¦18pˆµèéÔ8/Â\DÌR—\½„¢‚óº iÓy 6Ô#®ʲâJ*»Kó{víÛ¹Ípq4P5kãÒiÛ>øz¡óÞ¯··vxÞ¸ÓàË E®œ9Á'¼¶'n¥ÊÊýý_¼L3?âì)º<±ÄŒ<ƒ!23\ÁÅ:ñ̸E-3¢pE¨DžhA`h 0Å Á¡JÈþ<4Ä×*C Ân %¤ÐBÃãq!]äñFˆ„ä0¡OL‘?½Ê"èHRú/J) p@+ ˉR9åºìÌPQ Ed‘"Q&äBD¡œ(²F0}ëÌ Eˆ‘þbD§rÓßÒlÍÒhÌ2ϼNMJ(Oß5Ó!F ujÎ:ëºs 7“ÎÍ€lJO=­ÒJ±ìO@øÑÁÄ0±G3Hð·8„³È<Òè‰.jmˆÖ×`eˆ ]Ò(È VVVWòÕUc[uèÙ oÍu× Šâ¢Vד$ú4ÜÿB53RÚå‰ÑžCÍŒ\`XãX3TAÌ \ˆ÷‡’\m¨Vž«Õ¼Õ,Ù…Wüøµ{óÝ×)RìèÝx[]x }_«´ „ËãQby—u^yéÕnà‚¯ˆb ÚŽà“x!E\™)#·\‘Î%ˆŠ`ié¥/Sþ8€‹`Dh‘:wÂå?ôå•’ÂkÂ×D9À ~ú+ßœHzé¦]uD šè·ºfã ˜ »Àâ‘ì¡bÛ ¹Í6º!ª­ÆkC÷¾z1U¾œ¹ðŠj¶$R §QÆ!Zâþˆ1{òÊ_ˆ—0ç}³}UvÙg§]uÖ[½vÝwç½÷q7jýæ×}'¾xãèvÐsG¾yçŸÇ\ùÄ™‡¾zë¯_øà{ï¿ß2í·½ûð- ø¡È1jÈ€×Å »˜Hí"èŸý)d1ûõ7;p…" Îb$¡œ.dÑK[Ä—²À0[ÙI+\!…E ˆ LccĬ 1kQãÑåb–¢˜PAäË[ƲE£lÊ oó_Ü¢,BRÐŇÒE-–EQ• ÅGB ï$QàáApcïPÇ ê)šl¾Ÿä,G + ƺ@‹DN<+4~ÞsœF·<ÐyM!/9H/•Œ;•\ä¡òIß R¼!ƪƒJCºr?z|¯äGÀ!)¦`þt¡ =(B掀"0­¨^If1EdÆ'µj™Iêƒ|Í ÄMÆÄ7Uéf5„Hƒ̈óœOR.=7B.ªÈEüT¨>ɉLâ§âôMo “’h›¾¤§×ðÉNlÈý9¨‚ö³…4Zè¢þI(6.”?€h@ëò(<Ês|숕õªXDZ, –­ž Ó•Ú WÞrZ9‘ÕÒ" dXÅ’W²âÔAisB/e£:'$T B«†&5ˆ.¤ÒØUìb!›˜@¬Ú°8Ar6”´¾,ÆUeµìdü:Ø¿8Ö­NèañÅÄzU¬dc ì˜È þAµ²¢]Ni+V?3¨Î¥)åeLϦ´´™ánHcì×2æ„VxB €¬×¨·ª­W„[C¸Ù …mlA›Ûb5;N3Ô­ h|Íc[Û¶§¸Žr$ÈhW+Û°°‘ê¨Ì÷ÛʬÏ?”ûrkêŸù— ÁÕ þœK?¢N7{‡-¡uåY]íÖžä“nwÅ;^à~w{á%oz» ]s W½ï/{1ƒ^øÖפòÞ õ.ãNÐ}ÜŸškßéâ7$Ôë €1Ò? M0€ú-]C H8ÿÖÀÜÛo€/z bP ¬ÌË@Xaâ^¸Žé†-òB˃y*‰¡jâþò¹ jp«£Úú™ãÂÔ·xÃòp˜ˆ6øŽb$â\¨9Ô®Üø$’qaiŒX‚°’–—TliHðâ XA,P‘œÌç›®e–!ÜXžJQž±yƒGªf‰Ó7N±33õ¤gþ|óv ²zeTxÂ9ÎØÉðUÑ„ÖÊ¡”Š$JR‘Þù!{ÊhI -Ï)g7›jS³ìQö5?ÍmPyªf6¾¦Yfˆñ¦CØéDÛU­x ¬oH¦Õ¹’Õio˜^yÍ0Vc²_·~ emCZ“ ¶ªmltŽmÉFº!¦ˆlumñ¸–É …Šo—=k9ãν©ëoe”;'þpwÀã>`³Ï}@EÞë-÷òæ¿XìáÞñÍ÷ôöýo‚ïNÞGøñžp†÷ná ‡8íqЧnâ+]ºG·÷Q¦!﮸õ.Î8Ç18†n5%,îWoä/.SšˆNƒt8† öø@>Øòë½|ã¹­.òÒ KÙTpÑcÍóæMüÙ9î§Ä 3ƒ£Gnˆ"< /y/náqë¢á&kMÓLÞÄ[Á‹Ò°¢!i^/þkɹ!bPÅ×μôrËXvq–­\h´§=à÷^u$M‚X€a‹Õ;è E`ÔFÇlçâYMö¢‚z o.|Ó¯@Eoþ¡•žP/DJ l Ȥ7ÊhH~œ‹^LCo¼‰7«Ô'ü@O¸—y˜¹PÍnU§øÒ®&4¬S¸{…>‡Ã[{ÛÙÚkìú’/ˆ×°Àá›3°+Wb³Н¹k²©¼‰;âJ¹‚2ÛØ¼U£™:ÇB-³iˆR¸YÂ6,›ý«¶ñ¶"9 ' ›?ßñ¹¨ÎѸÉX·p7ô«Àâ¹8Z(…D ððžz Áó¹8\ðUx ´ž~[Áðñ¹ÄA*±¾]ÊÁ¼¡œªóA¼Á!ìÁ"4B"B០|¾Öê¸Éø8LÂßAþ4ú"“»ˆ†@9ÎS– «Â(AB+]ð1)˜…ÿ+›ÛÂÛ )Ô¹ ÃþÔë%Wèp„.VÀ‹¡¤S¬¥›CŒp: D2 ê§€=Ò9‹•è˜pš6z£8#·¨# »Ä ßx6NѽB4Ä%Œ.ìc;8p»+›Oh°ß ¥u1¿*X’¥Câ;ãØ»Sò;KÚ<ç3ƒÁ»%Q¤Rl/n!4@{ ±Lé¼Y§¡R*p"?ÃhD4Æþq7)…¦ˆÆUi•å3ÈòÅ5kF ‘>{ô.o´«SLŰj¿]3ƒDð„<ÜC1¨X< º°ThоjòK?ÉQÉ\sšo‹?;:ˆÌbœ¯á±?üÓ?j+ši3ƒÖ( )…m›Hü`„šØƒ¦°-KTÀÔJ@mC›<‰̲gë-¤I‡¸À LsBŒèÀ·øÀ­›Ì/‚ ADÁÓDqQA³ü”|ÁT· ”KPA˽„¸:̆ÌÁL¸Â4Ì‚CÌÙ Kýú¯œ0*LÌ”HçÑBë†üB–›L®ìK ƒÃ§`¢ÃKˆ`à ¹þÐ09ìLϬÌŠ\ð·žò@lCÛ{‡lÍ\ú̈§£ °¨.8€z‰¢Á¸ 2!#²DÜ¢Lü:'"#NdÈO„²Ý<©Ã"•ìCÅ·û;”¹„`€(àŽü /31#³ù€»\ì;¸S1߯mÄΨêÍÅ‹Æ+’^hÄ’³&=»¦f²Æýô&Âù³kŒOèó<«OÃÂ.RáÓ G‹Š“5†7à„ª=§Ç"sGŠB=lôEz¼Î-¯×lÈP[5Sƒ[^¹)k15)5„|‹æ´'´ÕMMÑ5Eí¶±ê>ã$\àƒ†0«ºâ‘ÀR¿–äþ>÷3¶´J˜ð›I 5ƒú»?UÈ?ìÉZq‚Šœ¾yÉ,šÊñŸ§4›m£Êµ¡­«DĬÔÒ ÕN÷ÂÀÞiL‹Ëv£«Ó,Át®¸¬ÓˆÒ‚pAÔJ\ÒËCíÆD…TżO*›T‚[ÌK…¯LÕTõâÔN%¯O¥= °Ç M@ÅNQ¡ŸƒˆË„¹.\È8C ýÔ;a ’¢:M˜KMØÜ9Z­TO[U9¡éc¡‡°M¤ëo1ÖúBÔYÒî,Ò«ÂÈ‹“yuŒÜRX£(6‹4R*õŘÄR-åRSBš6«-žq ø’Œé¿äºˆÊL[8±ÊqÂJÎüX%ˆ<ÕÂ"R¥ˆ>-K³…Ú‚XKB¥'x= ºÂ1TPµS”ZœEµKª…ÊÜGµÜçZÜЕ5þU%]ç2ÝÓµ°ÑUÝ(KÝÖ½/Öu.ÃU–ÇDÕ¿•TçrÕŸ{°YVÀ ¡È )ð2)Þâ ÞŠØÕŸKÍ_ýÝÜÖ†ø FÍé½ÍËRˆ¨§}ZÎ$³PÂc äd‘•i–xÛ º£ Îê"q £Mì§}Ðu%Ò]L¥ŒùŒÐȤò|]ð78ˆ… Ø]à‘þ Xj»#ø$%÷ìŽït?ú4XÕObº–iÑ#ƒ’øU¸‰]hÀ@†tÉC&eFŒ]a­`ÅÝ;F‘ÑJÑ’ãP„ aêuá|‹-é’sœY€rŠš©?i0JSþâ ±ß †^ßkÑŒùÉSQmbèƒÐ1 ñWˆe>k"ˆžõ©•)c… XàÞÎÄ_©[ªEÒH[\—ˆ_Ø:{ñ„™Cuaà`˪y©—¯-dDv Â}^¶Û.ýRžTÛZÑ3(Ó† Ч(€˜q[ŸÉ6¼­ä¼%ˆ»]@J†:U\àÁµ!Ú}ˆÛUWÙ5ƒÆmKØÅ7ÀÕÜFååÃå`ÞÔa&fO5æcÕdVf€ƒåð¡å"1Õ³eš|]ÞÙ]í ÌL9¶õ]À¬U“8^r„¹Ò,ˆåÕf3èÕUu^pfæÜLàV Þ3g££çeþ…±f•ËgÅ"¨›Ö7_Ç(_€ ÷M²û± 2+’_°{ß‚^2·³sgåΊ„Ï8Qàÿu×àŸ,`38`÷ƒOô ³133#4£àå‘ù”á­ÜÙidÞœ8a1‘6ƒáž<G>;ÐËËXvi uH 6ˉ›PpY”ÉáÌÜa”ða1b!v•'þY=bBáê¥m¨L˽Ĝi AãRÁân¡Q.öb0fµ´Î¤ÕÑocÈW{c{ŒãŠ ¬ª–›hÒ=îcä#Dþ5–üZFŽ´,#[Ë^™–ÝœôÒtÓ0 eªËdØäNþäPš¶þË®Ñk[S©$-ÖÚ[OœS¿mêd–eë‰æ…@Ü?•̽T¶¬°Ê=TºdÔ ÝÝ~çf¶®kn îâægFî;îå>4è —zˆØæ‘iŽ¡jÔæ±ÿÈæ'„Õ6–UÖ†Ôpþ<62)@üt~Âu¾ÞvÖTòVxXƒ(èƒùnå‹ly¬gf ]~Ʊ÷í'.`“8"ÄPß—ˆ‰Ú†–Î"¢În.;,ªGËÝëvÝ_‚à…]0 €øp¤f3øh6`–àMj6»Ò`Õ³®i}’VÐ.ȃ^("¢Fa©aV¾¦qáÌCê@û¶Ž pÙ}þê7‰j ràˆÉ#îáLÂê Ù£YqÜØ±†ê²ÆpÙ¥bÅ2ˆ.ˆ…œŠF·6ƒ/cåSㄤ)»¦ðÍç$·hvÚ}ÁÈTèƒ(pKÐ)¿ÚAîéÁþcPdyalŸ§ÇväN=ÛÊNÛ¹2á‚ZÐ…)Š“Q†[Îæä ùl0)mSm½S¾]m`Îîg~mաmˆÀîW†n]6)ÝnfÞÞ\GMä&nçî9ív=úõa‡žb7vçAöd§?aßênŸ(¤æÚ¾_g¯î–Çï–ó"ùf•o”0o.@oõ†g‹`oytïà…ïjWnx¦oûÆoýNgŒþHÖrÆg7Ög)†ä pðgˆ h«ß×82'Wˆ6×€EWà¾óüÍhóp'MZkëW]\qýå2#—h˜vø)VØ"ÿ<Çq7r'±â ©F~•F"×`›•h$_uè]òÓãêbrAMéÐÏ¢4-¨°æÑ¢fr0§õ}§ó8gô0óiÑb4ù’Lµƒ|óm¥-ú¥ÿÑGÆÜ¨åë)Ýó>ÿó@7ìŒ×cCˆTÉ’l•Ltö ['uld“ÉWzÊždѦtKÇt˜ÛÍ>åIJWXÊR^eUN­Rï¶SWmhuå¤ÿz…hõg?ʈõZ¦v}Ÿ|þµÔ]þ-\?]]Wu^'æegvÞ³öÔÔg} \ý×Ç×—}ƒ‹ýÚw¹ÛÇ}Ãk÷Ý7îÞ÷ýï¡ýà‡á'~‹ÓýãÁäW~ØþÂ;‰è÷Aã‡3é÷xê£þæïœì×þèaþî×îÃÿñŸ™ò7qAÿôŸËïgÛqÿÑvŽÛï©ÿDZnÂ@]ÿþÀvýˆT§Ì,hð „ 24 !Ĉ! œhñb‡a¨rt°P"G’,iò$¨ »0ÔØ)¼>Xt)‘*Œc­aéÓ§Íš¬œ8ü‘§Q–0—. ‘WŠ!QR­šr¥Ò¢fº´bþTóâ.R:[&-Ñ©D¹öh5›ÑíWˆhþÉ%Õ*^“* ®Ñ%EÕ"N®Ô’ „™¥]‚àbf Uªô4#"WO353¸ðá–<=¬E“àåÌ›=6Œ81g˜ !K¦Ür+.Œ`4ýð³k‚vI‰%« Á¾›I• O¯›v9À›ìãÈ“+À­û:ðÐ g¯ÍÝ·çV®¤,"~:àËÇžZ³ûÖâÍ|Ès7/€WÔ /pÀÁŠF‹cI¹ô‚v\aF+ÄHL+yrÊp¼¡ 2è`K¨ÀAiÈ¡‡‰Øàƒ°É¸P…f˜˜,þ–€pE*M™èâ‚0¤‡Ž€€À‡f´a!Ä©Ê;²–¶¼%.e¹ÈUâ²—¾ü%%uYÇ 0®˜Æ<&2“©Ìe2³™Î|&4£)ÍiR³šó¥H1ˆmr³›Þü&8Ã)Îq’³œæ<':Ó©Îu²³î|'<߉ÍyÒ³žö¼'>ó©Ï}ò³Ÿþü'@*д =(BªÐ…2´¡}(D#*щR´¢½(F3ªÑr´£ý(HC*Ò‘’´¤&=)JS:Ï€;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_s.gif000066400000000000000000000101651343257752000270360ustar00rootroot00000000000000GIF89a˸猂„LB<ìÂĤFDĆ„t$"$lfdÔ¦”¬†|ŒjdlVL<2,ܪœ´fd l"$\NL´–”ôæäÄ–ŒŒvt\F4¤ŠŒ¼žœ,"ܲ´¼rtdNDôîì”vldJDÌžŒä¶´,„f\<.,¬ŽŒ¤~t¤‚t¼–”TF< ¬RTÌ’”„¬ŠŒŒndlZ\<64T><Ì–”\JL$|fdŒ4*$œ~|üþüÌžœ„jl ¬^\”rlD6,üÊÌÔª¬L>4œ:<,&$¼z|dRT”z|Ì¢”¤‚„”†„LBDôÆÄ¤JLÄŠŒtjlÔªœ¬Š|lVT<24ìÞÜœ24¤–”d.,¬žœä²¤üòô´’”´bdŒrtôêì\JDܺ¼Ä¾¼œ~tüúüÄ¢¤Ìª¬äº¼¼šœÜ®œÄšŒŒ  „ ¼vt„„nlüÎÌœ><¤†„D:<$|bd´Ž„t^\¼–ŒTBDtZ\,"$dNL”vtÌž”TFDŒnl4*,D64L><ÿÿþ!ù³,˸þÉH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ •B€Ñ£H“*]Ê´©Ó§P£JJu©‚ðØÊµ«×¯`ÊK¶¬Ù³hÓz-"+€BpãÊK·®Ý»xóêÝË·¯ß¹<ÚæÌú·°áÈ+.ØíâÇ…Hžü²å½W¾Ì9ïæÎ éfÆI8´i¹ŸO‡}³´jÓ©_sfmÓµìαoC¦]Ó¶n˹+æMÓ·ðÅÁ&>Ó¸rÄÉŸÿe.Ó¹ôÈ×Si=»÷ÛÛaþvÿNÞtø—ãË«¿|Þeúõð‡ Æi€‘ûøóëßÏ¿¿ÿÿ(à€¨[è„e 6èàƒF(á„Vhá…jâX|Î6_kÑu(¢_íµôÞˆ(âU"K'¦è"`Öâ‹4ƵâJ-Öèâ*Õgà@)äD ‚&©ä’L6éädj¦ã”vñ˜RŽTŠh%JX¾¶‚UÖ3bwW + ¶åI]]™vñq†)aÂ%F  EÇÂ,copšé ±˜ CŸ¸åUC~n˜èt4˜hxe!K£RR À šÔ‚p½E™_šTWBÔ¡ÉpQ²ƒ&þ—ÄÀG¨nNvצ~ —F@ˆR²ÈŒP™«°Ê—)6`JÚ¤´ºK%|ì F´ÐBŬp‚„•L—NT’«`ëÙ´Õ^[Nd ÀµƒJÌ[¹æ¢T8 ¢¤­À°ºÕÁm!š4‘\_ÐYÈš |kÁ…Ì0¨…øÐl!6pìCeÃEñ¿¶¦ImVö™ËÑ’ZA\¤ÄrPÀEƒÛõ2\u ê@@ ]ÙΣÂeJÅ*ÿY\¶0Çu¶´-÷à1K7¼òÒ  (¡„ûú ¸à…¨ÁhÓŽöõõàûÂ0©œ§!JBDÑj_ÔÁžœÇ¥€»qGë@¾&!ô"—œaì驯®4ŸnªÞ 5,æ„鲡©¦ÓÍe›%|+—äZ…†Qÿ|ðO_ÿ|ô$µ©}yÜäý÷ß…/Òøägg~Hè§/Ýú µOx]Î#ö%¥cÖ¯—ò¢1_þ…£ ÿ:JÝÉ4{B”\à÷ù½ /?KÌÝ(u(AÍ.‹ê_æªÁ.1<ˆ”¦8øA»XJƒ™ò‹°ˆµ»B +VܪŒ)xp``µ’L]æ"ªTþ§JÕªZõ*Ò*iu™a o¸Ã&º©‡2üØýÇlÝ+_ë[¿Ò5¸Ò9 ‹¸@á^ Œñe[qñ¸ÄU~‹‹›«‹Á(Æù‘ÑŒ›â÷b¶Ž‘Lb'»`!P„1¢Fm|QX\ö°¸”lbL‹#^iH©!26¢¢x²´]gƒ.a+;¢†ÑÄÌàR³›åL[ ”ä\DIJšRj¨\Óô˜Â¾ôm…àšábƒ,$€ Ø\Id5¹`MkÁDdÏêRÌc&³’d ŸUÆ9.‹m”\ࢀ‹•¡[\ÔÀ½L°yÛ[ßþ6ÎÖ•0.åþ0m¬`Ö2¸Á¥}0„;+á O¶Âû @ 6Ìá{øÃ ±ˆGLâ8„‰WÌâ»XÄðH 4áŠÛøÆ8αŽwÌãûøÇ@²‡Lä!€2v… –Ìä&;ùÉP޲”§Lå*[ùÊXβ–³|ä$oùË`³˜ÇLf1w¹#)Prþ™×\f„¢M€ Äæ:‡ùÌI³÷¼exAq4Ÿeax¾CþðPF¯v,¯ÁgE""Ý 3ˆâ «ÀÜ'³ä!¸¢†§Àê%3ûHÀš°<”Eáö%OT@Å–\úÓ§¾Õ”‘²ëa/ûä'θô¾Àù¨k ²„$ºþ½äDÄbðB)ZÍä7LxÐBÈÏþ9ßAY¦‚Ý—¬‰'¬AëW÷Á/~òë~Éæ‡~ê×~Òö~L†TP}ð¶e_ðh*0‘¦ ½w¨Ð~M†š@€q¶Z&L† ¬L&KFþ‡e¨Æ˜€àÆxËæxSF…§8iHÃzǦ:`3:èw«æiXÆ{L¦§p_0K–ƒ´—kÿǃ>Ø„@8gB¨Ó§€'Ç€KvÐwMöt00¶yOe®@NÖ ‡*à…`¸ƒP&†dh†*hš‡…-·eا}ܧ¬ 3°l fþ à€*Pk°®i‰Èd‘hVö `·d^Pˆo¸dƒXˆ‡x‚˜Gö爨ˆ“H‡²@y/ØyW†qzfPÄÇ ªPopÝw‘6P i‰ ‹¹x†Z†m·d@pT “0‹µx‹ ¨ðOÆ‹¾È À(Œú§Æ6uLJ3'fl ëöud ÍXgg—vÖ§e©ÐK ã—u6‡w i‰š q0§F!ôØg0xm2édö¨zwY— ± 9u‰‘<7‘Q‘Y)nùræÈeK6vi¸k‘¶ŽP†‘¡‘òÆv½Whp'þwô¶dtçqÖ‘éö‘fvy”¨e€gx„gx=ÙfL–x)‰“ö¦“wÆ“t¸e“Wy=y7Çd{ØwH)ù{Á7|*P|¨§zÏ·|0{µW–З{Cø’Z)|Ägz_‰|:ebI–Î÷ƒÑe ²·dy9s¹—¬v…VÉŠVƈø×}ß~óhl˜~ù7…`€Xæ¢xù·ŠQÖ˜¸ƒ(‚Pæ¯Àdœ *À™Ù‚GI˜U‚ ©$¨&Ø”K–‚ž¹è®Ùd±9›Ähe¶ ™,e3€ pÖ ¢ðš*œª9˜íˆeFˆ„J¨Lø›P¨‹Rˆ†UþheD¸dÑ™„KÈ š e=ˆÖ)mÛùd²€*›w?Èd‚‰WrJ en‡rˆa8†exžRiek؆›‡_ÈŸ´ÙŸw ¡eRà*à‘°dvøŸìW•ôÉšT–‰kP hˆˆ¨ˆŒHŠKvЧX’Nf‰LÆ¡Jˆ ª™e7¢X¢¦¨ˆÓÆwª ±Àd2ú›©¸šÏyeɸŒéØ ´h‹¸¸»Ø‹¿8ŒNš SfŒ½7¤ÌèŒHÓXLŠOŒÖ™¥O6 LfMškÞh“VŸ9wŸ#’b†Žv&§c†’ι€™§sƦ9kù¨§‹Æ§_V禂Zs*Y,y¨#—¨±¨ŒÚqŽ:)àXp©˜š©šº©œÚ©žú© ª¢:ª¤Zª¦Zª“*)àt¬Úª®Š!„ja²:«´Z«¶z«¸š«ºº«¼Ú«¾ú«ÀZ«;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_s_2.gif000066400000000000000000000600321343257752000272550ustar00rootroot00000000000000GIF89a3Í眂„lŒBDäÂÄtbd4.,Ä¢¤¤nlÄ‚„<Œrt„"$LB<ĺ´¤BDôâ䤒Œ”b\¼’„Ü’”$l\NL¬†|ìÒÔÔ¦”Œ24¼šœT2,  ¤rt”VT,&$lRLtjl”rl\F< 4&$œvt\JL䲤D:<ŒÌšœ¬Z\亼üúüTFDt ÔšŒ¤~vŒJD¤ŠŒ¤JLL4„ztŒ*$l´ŽÄvld"œZ\¼ndìÂÄœRTÔª¬œŠŒ„Œ´’”„jl¤‚„dRTìÚÜÄžœüÊ̤><œ~|œ.,Ì¢¤”:<ä¶´tD,|jl\ľ¼¤–””f`¼–‡¬Š|lVN”vm\JDŒnfD:4,"#L>;|fd$dRL”ndt^Zœ~t<224*,Ôž”d&$œ†„äÆÄĆ„Œvt¤FDôæäìÖÔŒ64¼žœÜ¶´ôÆÄ„œ64¬VTܾ¼üöô¼vt”&$Ì–”´fdܦ”äÎÌœfdÄžŒ”^TÜ®œœ><„ ¼~|”.,´nl ÄŽŒôîìÔ¦¤ŒÌžœ¬^\ä¾¼üþüŒND¤NLÔ®¬„Œ´–”„nl¤†„ìÞÜüÎÌ̦¤LBD¤’”¬†„Ô¦œ\FDD64Ìž” TBDÿÿþ!ùÿ,3ÍþÓ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^Í:/×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУóNÕººõ¿ØüÙν»÷ïàÃþ‹O¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿y=\'à€v‡&¨à‚ 6èàƒF(á„Vhá…f¨á†vèá‡âˆ$–hâ‰(¦¨âŠ#Hà‹0¶e ‹4Öhã8æ¨c‰"îèã@)äºã‘HŽ5#‘L6éä“PÇ< ö8¡•Pf©å–\Úhd’`†™Õ’]–iæ™h.À3TY!–iÆ)çœZ~)æx>E&|öégŠ@B; öȉ ¼ð"'râ ¼,Ðã<—PAËü©é¦œrhgž †ZÔž–jê©"&Ó •FôXË>þ}ô±O-š«¬=.°2ܑ˩ÀÛé§¢kìN¤ «ì²eö˜ E"h ¡F°c‹´Ô²Óã,( H†=̆+.—Äkî¹1%;îºìêhh/›´Š`8` F8óÖk=†À¿ÿ¶+ðÀ9–‹îÁŸ¤.Á 7ì¡•ì̲LÓ"h-¶÷H„2wì1‰',òÈ-üñÉ(«©à+¸zë¬Ö’G¬ûôøÊ>ìp"É)÷ì3ƒ!“,ôЙüóÑc9O=‚¨¢ú: ©¤ÎóÊ,Àˆ` Ò\Ÿ4Ñ`‡Ñ]—möÙh7üµØl³MvÚpÇ-÷Ü}®ÝöÝC¿M÷þÞ|÷í÷vã-xÂzÿmøáˆ'b€ƒ76´ˆ!ùä”Wnùå˜g®ùæœwîùç ‡.ú褗nú騧®úꬷîúë°Ç.ûì´s€ Žçž7À¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüóÐG/ýôÔWoýõØg¯ýöÜ'O‚îà‹\¸âä—o>⇯>˜ãŸïþûð—þúôÃØ~üøç¯ÒŒ×ï?ž÷ÛŸHÀRÍïdÍžz— vТý …$ õ/:Т[Õò€Ñ‹µŠ’«¢e±Fp‚EúW?êP2Pw˜1è»jƒ”áSÃIjþ<„!ÄL(ÁBMÉML¢£Ô¿:Ñ~$¡‚P)t ƒ¼ !‚ Q 6Š è'@Á3y]‰MH£±¨E#,C 2°ÇÌ(¡qÑ‹tœb¤ÄHFÞQŠ š^a‹æ±Gj¼b‹„ÆB-ñ‘ ÒŸHÉÑ,Aw0…‚jq)._w€GƒàCAQËŒ™Üd'óhNBVúä+ÊQ&H–¬L%za„^¼‰$Le‚\Ù*S:2’ÈLf&YÉfzæ’ Zd‚P` ?ÖÂFàÅUv%#¨ŠU=’&‚¨ùÊ>T3—!Üâ5g™Ím"‘‹ØD§h#€Àþ4£8¿xÎT­ŠÊ ¨@;ÄLg43 ì!ôe¯ñNŽ­bh•@hK#<‹„ U¿^9`1`!D?¨P‰¾#­¡”Á‹zA›ÇĨD7jÆ‹Ês 8Í镚xО’š Ú'9å5ì"í¬h/}bpœý\9 4#õ¨ì„iU¯ŠTtæ¢w¿d8ŸÊOr¢©¤Ô©Z× 4žúô­Ÿj‚„³UZɜ˨eU»i1‰õˆ®­´ë‚jªrÓxE§^›XR¾t›,Õ–þªÉa ¶¯c«f7[(·Âõ³š‘ë8yAŒ5JKð5‰!Fz”1­J5þËIZÓ¶ pL)…Pë t®¶µ¯UPjsyÏÑbmiÙFÍ–³Ð]kAAK]ĈA’@ó€Â<—ì¸a? Û<.ÍJÙÝnwÖ´ð¤ íwI 0np¼Þåe }¹ ]&»ÚíwcjU¦E÷À8nu<˜"øÁ~Ÿ‚La¿88Âΰá&\áçåÂS)‹~§á›¸`žõ°Š â»øÅ?ãðŠg —ÃøÆ8V[ŠiÌc¾Ø8Ç@r¸dÜã"ŸåÇBN²’‡µc#;y.Ý‹²”§Lå*[ùÊXβ–·Ìå.{¹yß{²˜ï¹Ú™ùÌhN³þš×Ìæ6»ùÍp޳œç,ºÛùÎtAò’÷Ìg9Ï€¶ŠžA|Z¨G°Eysºh¾ö™ jtlA¸'ÑB”£lr 7-–.ZÒZÆ>ùŠÕ¿yÂV/Ú¤"PÃòJ ­ï£ ;éWßÒ>r5ŽØÑÒLsú×hôa+z`¨Gý`T O$Â|.ÓÙâÅ&F8MðbEºNçR‡]°7‘Àgj6¸‡”í[k[×ÝëŽÊ]¥oÓÚB´ „¯Mo%E‘GúC<ŽMkvŸ‘Õï6ÑdΠyøûиŽ)"t72àOZÀͽîHó›âã®õ.qho(«T“¦þëMòªxºH3°G8Ø@-õBTxjz{ôÖª•ºT¦äõr5É C?ü‰F=*R Ô Žy¨D- å*gyÕrŽ)]èD§¯Ö[E Taæ5¿ù„ >JCŽr¼ ƒ+”}õ¡}òF^ õ´§1èn7úÔ’®î³§}íãÄ{Ö¹ŽjJYªê­JùÊ ÕóR.ݬuW6/uœ~ç!¤<µÀnó"¡]íÊV¸1!ïtÉk~ê—‡åéÐtE)[jHG½ÎcøyÀ£[Wø‚Ú>øqþ憟} Wßz»Ãžj–¾èoÆâ›>êÔ >â¿x­¶–üú\9y«üþ¡Œe\b¸¿½dp¢™@®xå«ð/;A"è–!ƒô·’±20}_îOpÆìe´²}Ý÷}ê·+½VóWÿU$õÐR~çgÀ£ óà öf§&/s ¢€ô—~p0 ¬’ ±`F¯B3(‚ h¶B3Eb³ôi‚ò7‚ëw€EÂ}Þ~‡DƒòòM$´‚²€„h=Ø~1Ä„B(èW$7¸²V„ÿ¤‚øƒ(„Oˆ€£$…ÿÇ‚µò2¹b€P8JW8pfäP%bpâ‚æW…N¨†b4dØJ]ƒhX€ìV-FÈ…þf(€A(ˆ>ˆ ¸$r؉X¡}€ö‚/oˆ!㇠öð ˜ Üâ-‡¶Æ ËpNS-|gQÐbF©x1­b‰û‚‰¡hßB!§Ø€­" Ò‰Ÿ¸[°o ñ5JÙR} ’‹½´oÔT/sŒ¦ˆŠÙ²ŠW(и ʼhµx‹±x‰WS­øŒS}•ŽÜˆAÞB²x/œè‰UrºÇŠ$ôŠæØŽ´¨ŽÈŽèh£ŠÒû4×膤ˆn—ïø‹é(а„ÿ‹¯¸-úÈW6EŽÕrè(·„‰(‰ 9”ˆD¤h!1— ô A¶ðKFà/ Õo Bþû@²ÊFSóxVñÒ/úâŽ·×’éÆ 2I“±–O0B)I+I!œ0³Ð ³0¡7J=‰‰C)k–@óp¯@B›è“W R_IW(U‰ aéP¬â’²foÂT;™/èè†lYŒ}×#I¹”…Ž9‰Vr9‹ÿU—Ÿ†D_‰‰c9/AY%gù“ù–19“m‰–*É’‚YŠfT˜IS•¹m:y™‹I—…ÈX%#’¦I#yL%Y!€\h ç´1{ÕhXb ˜ ó ©-ä_ãWiŽH$›b›¸©›ºHJó›½ '™4˜B×hœ¹9)" T yÁþ)-·Y9ƒrØwYŽÜyœ%IœF)VDø›Ïé?‰žóHËÙO¹ž œFàžnŸ–¹›Õ7‘ŸÒIž-©/èИCž BÈi^Ìiªmõ8Ó îÔœ11íYÃy¡róvš"ª©~¼pJ†fw3z39³3î—K'J~æ§ à*ø×úŸ²Õ2e˜„ÿ£:SF¹$8N§T£€Ô¢œð »5i 73<€Hš£  v.“ˆWê*TZ3ŽSSšVz£XJGD*£?É¤Ûæ\@ꇉè†kj¤ ‡DNú Rb¦cú\r*¤?Y§ãæ†þH3­¦6ƒ3ECTš¸ —° ÊPê¦>j_L.zN‚ZƒHT¨(32è\ŠÊ¦>ê§ :¤¥j¤´ Œ9¢°j%š‰NH“òRDD½ÐUs5Y³5´j „ ²¶jï@ÀЉM“ r õ¦Ö4u'YHd5X£5R¬ ²¬Íú ¹’¬ÈºšºÊ«¾ú&fGv â­jR{ʮΚ¥…tLNãtú"¯âªw±G­$ä®U¯¢¯%©­Áú_å:¦çe/×ú_Ë­Äj¬Ö#çÚ«ž÷wSù~U£÷ 5 ¬ °˰øÊ¯È÷°Âêw g1lPþs3€  ë¯KB›®(Û­û_+Qst' ²)k™ »/ û“7ûE½f}±º´C!lRh²éº!’@@"µCbp@mï0XËmÒªÝÆM_[œR¶7$hË5kÛ)—B¥É´r;NË'b€¢°{(0ñ`©f õt©2ž 8b±f—`û1 7kë·s¹.A&Æ“!•+$¯` ¼ &u6®T@]Ò¸ËBº~&b:õg’»º%soŽûº°Ë'ªËº´‹u»¸›»#¹µÛ»!q»º¼ÂÛp¼ë»ÆËÀ;¼Ê»¼‡V¼Çû¼‘¼Ì;½Ô«´Ðþ{½"q]þ $P‹pĪh’h¦;O˜V½æË0³‹½ê;Ú+¸>"jdEj]e!¥æ!¼Ö¹ç›¿Cæ¼ëÛ¿ Ѿ– $ÅvqɆ!l¹Roú»Àã’¾þ{½¬±A¢oço'E ÊÀ¬,üÀÏ MÎ×(‘GBô` ûªš›yЇ ¿w±+k'ÉÂ4×yɇx.—…@#°¼ã kO®°mV"š<ÄÀÒÁl¼Ð”ªj¨"b ¼°5y…cø…v8VH3 X 6jÅy8ˆ3ʆXlV»p q° TRˆÃúˆD¼ÆšbÄGÜ»Ðäžú9Ö ºŒ)@‘Fà‹ñH ›¸ÇþðŠ9¬š‘RDTTàB¢ÆlüÈtâÆoL»Ð„™Z ˜­b ­È˜‹[x9™E²˜1lyI™ ´šT9—›@¤!B ɰ<'’<É«ÇJ Ð¶ÐÊ›x E‚Çæ4zz­H* ¨<ž†LG’P~Ö@CDØ ËÔnüKËþ›Ä¨Ä"ÒD J*©”Z$€žLK›JÎ|j*:Wé,[«:£eZ¥$´ "/»„¿"¶ÕÜÏ£{ÍØ¼¾Ð´³=Y´=‚³p ìвöð².l{çl5ûÐ7)MmU@ë~"KÑ$„bG X€!T¤Ïþ\ÒäÐþ½Ò[–[ÝË!m;¾ò¶&]ÓN2Ë)Í´+ŽQŠ#2mÓ@Ý,(Óìº(²p¨»½#ÔL-,8MÔ°ºÓM=ÕÈôÔP-¢RMÕZ­DV}Õ¦™Õ[ÖÔÕ^ ’`-Öh?d]Ö‘xÖiýÖæ³Öl}}ný /ÝÓâû y-$4 ×~-pC=×µlÔ:¿gõÛ ‰ $÷û׎Ý"-Ø‘‹d¤;À‡}À‚Ù72@t#¤À=ÚžÙ’-·”Ý!|Ø´¹#žÐ Ê  ½ vÓLڶݼ§=ÉÔ Õuº6Ê-\Ã;wÊDw‡uE—x+lUµ`tDp— ‰þ!lÀ’ï`¬¯|ÛÚ½S¹ýÆD…uX(h! ÞŒ…É|Xtè…‹hð°( b`%x‚)ˆÆýÜd@¹Ýþ­p¦ÝÝQMØÂÇ»òǃœÞ—zœŠ Ò Ìh $](¬Â®nä‘ÿÝá¤)à@¥,V‡ !£<â@ù’æf%i˜&••[Ù•’ßÞÂßã4šîár âvaó©‹R̯›êà1Å «‰‘ 2יРÕ=°ÆZÛ9Þá;Îãx@yzNnÊníŒÎOÊ©ñLÈwZÅIú_ïÍ+ó Z*v2°-ÛbÇÏU®ãŽå!@³þ솫rÑG[’MG3k´µ` t@ ôZâ— ž]¬2ÒužãWŽçbV×r×Ò¶$BçÒדþß•néN†éqB¸†êªn¹wNêØG¹Åi±>º¡»ê¶ŽÛ®½¦~뼎*­žë$·ë½>ì›2êÀNcÂNìÊ.»¿~ìÀ–ìËíibìήb÷“V­-Á1¥éÛ¶×0Fº? Iá>" ?Ô^ívíçqéÝ#†í½‹ ?§–j«†m K‰;îèó$?çŽî¦îê^÷•CLB–í½š}Óî†qøÆÒ"mÔfmöî)cÊÓ¦"nÿl!Òð?-ÚjÝìhÏþM`ÄGÁ¥í$´ÚÞ«ï<òpOi"çòfÛÓ‚kóáó:oñ!Âó#Båîóï#_]{Â{É}|†â³U¾U²z¤¨ôÜ3 |T7ܹ4«‡ô(GÀ0 ›¶°x²7}°4zÍ7ÂÊMöÂmu‚WtBÔ–¾ýuU_!^%ŒÎÑÇwÑ-wÖðœ!¼÷ƒ'õÛûi[ÿö]ÿõa?ö•'};ܬŒ±‡ÜUÓÜÏ]öÑéx§Dw¥ulïøª·ÜOø _GhÏù®çùõÓ„ãC/òE?f{²Þ€8ªµ+¢UjÒ‡¤ƒ¸ɘz‡ö†_̇Tl´9(° ðÐõþÐ}ð†zøäZèK¬„}Hü’üF9ÞÁÏÅhlUØ ˜÷p…ë]ß‚‚ˆ¨´ïûbŠ…¾)ž»üÉAÌïüÐ/ý^üýxxþѧϾKFŒˆèf™ŒLáíCIŒÁû”Aº“Ë Ž94ÀH²^ó6¬µOà¾Zý)[viE‹5‚Äé¦L”*¶4bÊç>‘F*^̸ÑcG"Iš Ùs%P/cÎ4Z3©Áeár~VìX²eÍžE›6-€éܾ…Wî\ºuíÞÅ›Wï^¾}ýþXð`Â… FœXñbÆ?þ NØeÖ Úbg]QÌš‹þ:ƒ`¼FEÝÙÈfƒáB´÷ªÎY( ’±wµØÑ¥O㬼‘´0½‰Ÿ®};wÙ¢¹ èVÍΖpß“Á}6ønîDŒ=-Çx`ã}äyõôœÛ{•Ga-4gõÒ¿n^”¬þ¦c›¾Ï²†+Ž@älÃn¹ðp >ö€P5®ËŽ9ƒœƒÎAꎳÁ Ãúï´èØË¯CåÌjî¹Ô4°:#(\Έ®Ô¢±FoÄ1ÇÚ‚¬G2H!‡$²H#D2I%ß’ 'zö¡ƒ)#\+­(*‰+ŠeDcP7+_+Î *4‚è°åÖ–òr¿.Ë„RJþæ\þÓ# ⤗MP»Àîê”2¬'£DΦ *óÌ4Ïâd†YÀšeNüó´A¥´„ˆyîxE·>-½>ùãí+Rs2ôÒBßô”ÍDÑT3¤J RõËœÂqÕM#òÜÓVÿœ2W.û›rÖb«=]yåÓXCqµÓ Ô±Zk¯Å–7—ä¶[o¿7\qÇ%·ÜÅšÉL ™ú<»¬¾¢î€gØ6W„׈?0ÉiK$bKTu+•XuÙu—``6u)eõcg–eÞ]Oá¢6ëàv?c•;ƒüÐae¹:5¤eöcQㄘG„\¨˜ߊP™bÖB™ØŽM}³f‹ßþÄø+7JyÝãÍ)è¦r&8≑žÙP¥ýë9ey šg‡uvÚfö¤8§îȶl³Ï¶‘-s×f»m·ß†;n¹¿E× kràD™?Šª%•øö{ ¢â#¦NèùãgÔÿÛ xhév8ù× Wö™\’Äߨ»óÞ[qÝ.Ï|s]-ǀz“tN4פÏõÎR=#x±?É)ð¬’I=€ÀójöÐ ŠOˆMi*»ñ¦¥À‰ºs`…7žãØ‹rv#v¯<¤á‹‡þø‡.šÈˆîM§¤WR—ê'Å×]ñæå7¢ïÆÕÇüuö Fêœ,ú„åA[þ¸À¦lkn„`%8A VPIu3Â;ˆŒØ…® /àAŠbgF/&,í}0„#, /D"„£øØ+f Xâ^F8V:V rðÚSÜÒØLj‚DšÕ‹=à€¨y¼#FF¸¦õÎr@jÏ áÄfçÒ©#t®3´¨—;åéÎa*Óž÷Äg>õ¹OÂ0sžÿh@o{èÖ€Ë2Oˆ`¿”ÓÈþ)HVÔ¢Å(ŽêÉOŽvÔ£)ý™Q’–Ô¤âÜèqÒjR”¥/…iL!êÀÖÔ¦7ÅiN!3R™öÔ§?jP…:T¢žm£:EjR•ºT¦ò´¨O…jT¥:UªV5GejVµºU®"Ó©VkXÅ:V²–µ¤XíjZÕºV¶Šë«f…k\å:WºÖÕ?4mk^õºþW¾:æ­vl`;X¾­}Elb»Ø¹ü¥õËÖ3ÕR”ØÂ¥êL < »YÎvÖ³9:,cE;ZÒvÕ±ê¼,Ž–!ÃÉd9OŽØÑËÏÖÖ¶·­mhK»[Þö¤§…ìâ8Ò:€ ž K<êA£¢ô#fÕ‘YhAÜV׺ו«n}»]îv·˜À½Þ½–!X#lö˸–ðνbvå;_úBU»ÞÅo~õË6 ¢àtè‡? 'W҄׫ÙŒà_ Xkƒûo€l„1¤½‡=–DzKPX8YT¢xÁvp´,aL«¾/†qŒOzßþýÖØÆ7>¢†D(ûû±à®×íx! ᎑{|¬çq¢H>ŠM~– Sï 9²Â”ŒdýFÆ_s˜[ŠW—ÙÌgîOñs5š±™TóF€Ú+#]É š‡–SF°”¨=!£Lïf$fBÚÐÙ¢1š½hF냵j ˜|&™V¡*#¤)L&3Á*YÚ»ì¨.M¨LcºÅÔ:tªU½ê»6ÚÕ¯†õ]0è³6çËϤª.c´•ñ‡ÖûêWø²Æç¯ø™Ö¾æµ~âËjf7›Õ‰Žu´¥½_ fOzûÓŸQòš·ÉÑ»í¬m„ÇEnrá+`O•m+þw²+Ÿ~Èélz×;ÌОv¾õÍ[ "²•$0ÀµÖ$þ^À3HI;‡µf¬á#aÉÉ$%~%Âîo^úÒÞ9vñ½o’—±àŦd£9ͳi6ä/‡¹mGnrš×<­(yÎu¾s’ÎÜæ?:RqÎs¢Ýèå$sЕ¾t¥ýèO‡zÔ«ås¦WÝêötºÔµ¾u®ƒ(éW{Øñ™õ®—ÝìP§ºØÕ¾v¸‘ýìo‡{ÌÓÎvº×Ý­+Œ{Þõõ¹ÛÝïGÒ[S[M•Lj–5‚Ë÷¾xÆ_´ï€‡|ä}$øŠ®–L¾s-lWCÛÆwÞóôüºäE?ú!Qþ^£Ã-îqÝ›Üå¶ÖÎÉt??{Úóñ¤Ç}î#ƒ÷èj”+Ý>ï Ç¢^æ*lÙµG~ò±u{Ý7ßùuÁà‰ŠQ­|ú×-¡~þõ¿ >$"é+Š(ÛŠ-ÛˆzR±´+ã1$ãd2#øœ'£ ¤¸‰24ûÃÀ lµýãÀä?Þ“Ý€9 ‰ï¸8#AAÚ;Ã3I)»@ ”Ád>´AÈà ;k•hÑ4УœHÀtSÛ4è´E –h)#›Á&ÔÀ¼Á(¬»Y³ÝÈþšcÛ™\Û5„)£_ãœ#6ãS0'4CúƒB)TC±ë¿š@Ëéï7Cá¶òw·xshúžstS˜y;ÃA¬½4\ÃC¬ºè»¤Lº¾X:$†S·á*8Õ[8# ÀƒÄš¡ˆK#]j"$ê8BÅÙ3DD4E s»”ãÃQ¼QtÅÅ+ÅS”E“KÅW´Å[´=ü›Å]T»ZÄÅ_FDÓE^$F«óÅ`DÆd¬‘X,Æfl´cTÆh”FmqÆjdCÞ›ÆlÔFÐFkôF’ƒÆmGddÆo4Gýr*—<³(<Ì;<ŠZG°hÅq¤Ç/+ÇsÄGîJÇÕ³Ës½×þâG´˜-«Ç‚¬¯{ÌDŽܭ} £ëK¤œP®â{½çz/µ=ƒÔHúBH…ôHÆbÈÞc*x…<ŠHœ >×»¬x‹ãÛÈ—¬®ŽüÈ™ì+ ¸¢p?í#Kè#è5±%ü>‘H?#X? û˜ìƒ? ”A¢k蔜„¿] .ƒ ²“aB˜ÔJ™ëFšôÊü * @­¨ÀØK¨€&C)@ñ°³„2²œ2.±^h"Ô8˜¨È„Xà /ÛÊ¿Ü,™üÊÁ¼9d³D e -0Ð`Ù|À|=‹KS™kX)¬÷X0ùèKÀÍÀìJÂ$Í…ä=QKBþ9¹¥Ðµ D)Ê#ŒhQM1[P‘O3ˆLÙ”N‘–ù Íàœ+Á,ÍâL**Ì—1d̰QLJK$`Ca >Îñ>°ˆÃél™—y.—ÎïŒ+â4Îñ¼) b7î‰ÃÍ ´Ì ZÀ„w3øäŽr3ðùÃôœ2sê"ˆ§2‚äÙ0Z/ð$вOòDвÉÛ$FŠŠŸÌ žL¸K,#ÆÜD4jPSB"‹Ó t˜…‚ðÄ;2Iiá¼5Q±:ÐUÑ} GiGi'ÄÄ‹§µQ«JÑÕQ¬ÃƲb(‡ºÑ «ÝÑ"5¦…)P)!eR°"R#…R BþÒ&¥R˜{Ò(ÅÒšÒ*åR{»Ò,Ó·ÙÒ.%SfûÒ0ESsÓ2eÓC;Ó4…ÓpYÓ6¥Ó{Í8ÅSe É‹|¬>Ýu¢ÊbIwªy¬S|Óâ)†¾a]§I5bó¤¨%»¼Z8Ë´¢—…@¼‰Ù¶TåUY ôËLÎd#æä4mÜ›ZœhN‡Û’¬¥ ¥ÍÜ3…[YþcZ®å0ÍÁ˜¡´µ-£\`MÇ|M#¤[¹µfOKM¶åKFædÞäeŽá[¾È‰å‰ælY¡ è¼\€1gîèãoîbeg,þõdP¦]ÿ‰Oõ`Ï~OÛa^œ°ÏÞ­OçåŸà-£è¥ç7¶ç{†R ƒL¡Kˆ³‰sÐ Uäí6 …ãùÕÄñÅPŒÖP‚É߆gˆfiºà)I ‚uZâÌ"W•vèpnif&1@Q؇›°é f©‡Îée¦W°^È„¢ꦶ(¢.êMb§¦jÂ騎`+®ê­(¨Æêñœj®k8þê–ë±Fk¯+k–>k#˜éÞkb‘”ÑšNë.õêµ&ͳÆbw´T¹V‹-®k2½k¼L:Ή2]óh=5¶Há«‘Œ l»¾jÂþYÃ~";† < =vGͽ‘yŽìþlʦIB~%CX#Hd J9Êv5ÊGžä¥¬d‰z“§ŒJ¥<ª‰«\0à í mÒþÈ|îƒP†K!e#øç–EeVöؔ݊»í¹¬K¸ÄK½äË. n.nâVHr&f…ÙetöeŽ… `o§ËÌÌÉ<Ÿ„Ïäîî¦Òïï|lfdÙæhžæ–…͹Õfh®LTÁÍ´uÞäõï&Åïü>GñÎNáCgƒPg¼5wþ̵ž•´NìÌší„íχðo4îZ* øüçØ èåÍœ Ï>üÝ„ægáå™ýìOüDåY`¯5ñEñ·F‰¦h^°þèò%£Æ U8æñ…¸’ÖÞ E¥ýP“î$ïóYlkBjC?ôSLtEWiFotD|tH§gIŸô5¬tKGfLÏt)ÜtNŸåÉþt4SuäSgZÅêib7uÀôôR·ÁS–ßQ­‡ËbÍìWÎX—õ´lÍè^VµõZlÃ[cÈæõÐôõ_ß¿`7VdUÖ†|T³àìêáã2\vÐlvgÏ?ÓÆIÝXziïsM×{áWJÔ {=wØ–ä~¥mþõæm×Ên÷vç[ñ‰}eœ°XTÙ{ÙØxYQ‰€@·”î²äŽc¶÷—Ä÷|×= Ïå¦`ê¹—[3Á¡…ÚÈToø~A§uø‡÷U‰·ÞýÆÝäŽÇ[íAMTyC‰Íkîï)«w’/y“‡] Ãȡ뷕™›Ñž× g“lÇù¿Œx½}Þ—ÏÛ=œi¿ÆÑ6ýDb©ñ‚ÆqïYh!_z &u§7jޛ芾híõèÕv 7°WÒ+*i.ÿ!0ûœ7û³5s™Jséúù½GܾW\:÷i &üozü?Wj¦^üÈn|Ç÷»PŸ|®|ËŸBþ­Î|ûÞ|Îg;Ìÿü}ÑïEÏ/ýÐ>}Ô;Ò_ý n}׿:Ø|BBy1²`Ÿ2Hwr$XЈÇ}¬ÑÌ2™>4b£Æ‚áÀ<´–ƒSŸ*d‘ãÃeá:Ò¬ió&Μ:wòìéó'РB‡-jô(Ò¤J—2mêô)Ô¨ôHgõ*Ö¬Z·ríþêõ+ذbÇ’-kö,Ú´jײmëö-ܸrçÒ­k÷îYq:ÚbWÃY( ’±ópÁyÀj.£øÒfc‘$ Ú{Õ§£`†G4"S*èТG“.mú4êÔªW³ÖI/ìØ²gÓ®mû6îܺwóîUoÇpœ ‚qräˆ;™XÞ>:ÉC—®Ü•ÁÏýѱõNdòë;£°Õú<úôê׳oïþ½û×¾çÓ¯oÿ>þüú÷ó§ üa_9D„25uÆ\-d &ÌÉx|5ø C`BÓ<–8F ˆp|!Š8"‰%šx"ŠHÉ׋-ºø"Œ1Ê8#}ÿT -þ}äÐ+û°Ã‰$Ä‹_0!… Öh„Iœ(ó‡CD–tÒ“ÅCËCwü¨aA=þ$LÑOŠešy&šiª¹æP+Òø&œqÊ9'uöf£`dB/—,fÄ<¯ÌŒ–´€t !×ñÐ;DS™Cˆ:餯8/ÚBD8½t˜ „ÊÙC(ð2›­ºú*¬±Êš›vÚz+®¹êº+xv$ «Áƒ¥Q´À3+²É*»,³°ÖÊ+´ÑJ;-µÕ¦å«舲KÍzû-¸áŠ;nQÏZ{.ºéª»îŒ¾¾b /™°J.½õÚ{/¾jšË.¿ýúû/Àuùš/þÁ|0ªí0à ;ü0Ã'<1Å[|1N C¼1Ç{l«Ä‹<2É%«ñÇ)«¼2Ëõ…l2Ì1Ë<³‰(·|3Î9ë ×Ëí ”CØB±4}4Ò³Ú¼3ÓM;ý´U=¯·L§@´K­š4×]{}âÒP‹=6ÙKqGä1OÚNÅSOPõ3\A´ò5Þyë}^Øeûý7àÖž}ÓwÌÐvSiõc}¸7ä‘KUß[~9æsâɉ+|.àÐ<—PAË@4DQäc(üAG?þ@ÒÐ T3Ë&ØE†>zée÷P½„c'‰‰Nºé/…WþPy“K?=õqW•9öÙk'ž8ê8С,-´œÉôÂöce¤´ ° <ýÔ£ ü»„ŸÐøFŒ4%J*„¿K"“™T¯€< D®·½2°øÁS€Œ˜‚dÆ…!ŸrÄ$2AqÂ<°‚Ô«*s™‡˜p3ì (Ãê­r¼!sø< '„ày^ãÉ^lâ1ÕAÝw o;ÝùŽþÂ#@ò˜‡†V¼"Òl¨Ã-r±‹^`‘&hÑ$‰™Å2 Aƒ0!cG,„!.qIˆëÌã°¨Ç=–L‹^ü# uؽí¨K>’Œ %ļþiR•Üø/!² WÊÒ–CI0¡ê!câ#(CI1?²”¦ÌžôÄ'?‘jP…:T¢‚8ðS”’$èJõÊ0Ðh•q$Voh‡9Œáƒo¸·¸gpÃè«aoŽ£ ÓàŠ„ÐŽ=ÜÁ&¶ì³üpJp£ ³MÇ5ÀQŽ 7¹¾ñ)ùð‚­à Ý A:J|â!·u_n ´â8£Ö5®ã){Ñ”2V"ð wh j&2˜M¼0¨w+~A…)qá S¹Í |ƒÎpƒ2 +O¨Ä Œq!‡¹ÏA=ç1¢1ã ÃÆn>tàhÐä wVAAÖáè=ÙÏ–6m?—¼h÷Bˈþ´ÓÆ!Ž3¤¹ª]¬78«>_ºÕ#Ýè8ö€æ ¯Ô¶þn™$QŒ4ïÀ z^/¢A 7l…Õ®>öEsèA»·Ðʽ5´!&hؽe F™­¢Œ¬J‚+Ʊ|´¡=¥hÈ>·™šªi'sÛÑ~·¿ !‡]Wø{W¸ÑeoWºLTÓŽ¸¯–µ§°ckè>xÍL—XÏÚ½µ†7Ä«¥jèÑQþʳùM¹˜‘(o‹[Aæò©äÄn?ùˆšª•e—Z“Ž8Ìo Y§9 {xñµúæØ¤ãCQÜÈyΟ×$(?z{TÎE³û¾îŽ9Ôãt jtãÉÑ8ÆuŽÎytË ];ÙN9@1¬!ô›4ÑÅ;þ^òõõæˆ6{ìf÷¼³§Ý!ÑC:àÕ£ô®0<ÍþuÔÏ¢qĹԆÎzP¼WÈ•1ê ITödiRJî×’0éäòìC\C6?ÀÀ³žo ¯ Ë írÅÓþ>Š.C…Ë ùÎ…¦c ÇÛAÇø¢Šç BÌhç„/܉‹üÕ·¾ú©¼X˜þä§×¾û¸³4hì ÷Të7éažŒ#EêD‰¨‡Èw{ÒvzpÇ;?tmrDñ¼ñÿ»õ i`ßXÄZž7—÷- lHÂ:4%ôâ•_PüÞ€ØÉÈ„´Qæ½_OÈQGdȆ` éþåÄQ.Ñ„Ñ J–Eì5Ûì1 ¾EP›ø‘_lДäÑÒ&%Ò"1 •@ɰN®]N\RAh 'ÐÑ–àxA*’²s|R f!T¼àYÐÀ9àž{u÷Õ ’E®Ñ›{}ƒLàšŸM¨RŸüI ¸Ò©XJAØ’¦ÀR¥Äâ§x ¨ˆJ+™ €ýÐî¡""†1i¡#6¢…" –¡%r…&à µ]ÜL¹aNHSzPSQìC0)…¹="*ªÈëáG U› ¾Ü%–áÌ5\q½ÀÍé†Oe˶tK*öâ×Db[x!W7œƒÆâN]Å…!'î†þH4¢Î»ÄË1=E4F£/f£³¬"Lb…Iƒ7È2ÒСI,:£'j#;F0ÆÅ1xC{U˜Í¥ã8F›V{éÖ¥T;þã½ã\#£ã=Bœ‘Ú9fœ?¤™¬€Cž‰@.Üà7†ãAšö½W|íˆA„¤HŽ$I–¤Iž$J¦dH J¾$LƤLÎ$MÖ¤Mޤ8ÂMî$Oö¤OþdHr@<%Q¥Qú$DÂQ.%S6¥L 6‚SúäDÚE<Σ{ÕcFnøå ‹\#X†¥XŽex¬(ÀÀ À¥[¾%\Æ¥\Î%]JQ  þ Ô@]î%_ö¥_îå ”Â_&a¦_Ž‚X€a.&c6¦[%Œ*B)è¥cÎ%7Æ A†¡An%m!¯ùZÇøÈà¹C1´C9ð^ÙŒ88Y!ŽPÂl–M—3T¢ßøA!PB3œ“•A3¾ Ì[š¹C4ˆ£gÖ´¹bVuæÆìÁ9|ƒ“µÃ 8<¾ñ•0ô¦l•P;N!èA;$çØD%œƒ4”7Ø£ØàÀ HÃøÁ5˜ƒ@À2îÀ:xƒ{>&xÃÔÜ-FçSf½ÝÛÇÙ9Ã10d:Y·•¸}BµY¨Øþ¼%ÈA7ì߬øÁ”ƒøàƒ;„A:F€2 C„Áß_ä12¨LMÜ2×µyÚÇøÁ”•VÔ¦‰’04C| —”ƒ7Ž4pƒß %ˆ#lrçxúÍ1èÁmf9\Yà,'—sB§šÔ,¦™-âœÊl[Ò@;èÙD€3PB<ÁUH%ð&Ù„_m› >T”ZÅ1üænú ´Cga4¸ƒ_aÎ&(=.h›JÔÔéã}]Î(ža…t’B 4xCTÂbaE1ŒiÙÈ%Y”[Ù˜A%d ì@‡–  ºèU$@˜}ŽŽcþV_§Ô8ø-RB¡kÊ\¸—9X…1쀌ŽÍ:PB h:Àg†úÍ0”ÃUPÃŽ•&ÔjV@Ãy¾µîÌ0 §¶–“UÂ’bš6çs6«:Ý^îíÞÎt©{}B9à~Jƒ¸†7üXVxC9€¨Ø|ä¦PB?’ 78CVà ”×– ”Áx A9€*7iæD€hjVr*ÀšRB¦rQìʬê0®ì8èA4B9°éØø5P‚°¦C¢šàh%Œl:À—ßÈA; ”CžŽ f™JÂ8DCÓ­ƒÐbŽ‚ê²öèÌrÑFª©êÍl¨{í \Å‘µþÃ3Ž<üæ¤WØŽ€VDƒß’ 4è®’C;|ƒÓúÍ8ŽZ…&|«FƒœfN¿V˜sºæÙÞÐ b%%´³6\+1úCú4¼ªâ2n;Ä4B1Ž;(-V4–Ÿ’¬4¤Cª9©;°á¬VBâÒ…—¾6ËÂl-Êlæbƒ¾­h6ͬ˜{›},à@ƒ“RÂ: @7 9Ž0P¾a…4àiÙ<öôžÁä’ ï"튺W3dÛöŒm…•3ÄmòbÎtÖïîŒxƒÊ²læì)p:Ú5TÂÄÎfƒ•¸Ãß|C¤§ˆn!àìåtmÓ9ÃÞþf4èš¿bnþм¥)%Ø[ÃêŒ$„_qÁ- %ìîUÈÇŽ8äU4Hpàp4LïØƒ§ Sƒig•äjîËÂ)òŽ°Î©Å ð΄n’.MÃ}m¬öðöÈà-¯{ /ѯµÝ¯çL9Fk1ÈÁúêÌóV8¤pæhiçÖ-qñü²þ6Š2[3$.}° WÁ¦qµRÕi±ÓøéÊ:Ð5èc¶6o fUí:»×£æË²°{½€Ð1"û ã)d³=Ô¬ðÛö1E@µ-ª%W¥%TÛn[[ëЧÖïýbð)£‹þÀîã! .1cÎâ×9àÐ%/ô¾ÀoÏ3o.£n}0äŽq23ºt¥{y®Ù>MG¯)+¯è¦¨4Û²[ðý1ü ²‹r-–²8W‹B öæ#»W!0r Aq}Ã5gÏ4/×ÅæP'ëæ.K²"—ó0ïó®ì¯EŸs+‹² ëP½RBÐêÐB/çP/ i}z‘7§Y%€Cøbôœ,ïAû€“Í2SB7X±ÕfVIqÃó EjqÁ²eó{q3ƒà3%rNÓtŒd"uià¼54ÝsÑ3°›2pQI3•ñôLo‘²=38içÞþ,U¿È›VXœŽ#é@wQ˜¢t5™ðN4'{­' ö y3ÆôYÇõ}(c_Ž+[G;ÐhêC“4QçÔâ¼ñÿj 95TK5c×Ç;^g? aO7óYoq¥ªXg6AƒEʪ)µš2õŘ[טk—6^h@[[Ü&gõVWWÿäv«ùu½ “o ¥u=ŸbWXL 5Ô=€*|7x‡·x7y—·yŸ7z§wy#C…%Â*ÜCyó†w«7}×·}ß·yÛ{1Àà7}kÁnh8ûw0T C/x|놀38„—7W„W¸x?ÀnþÌ·…¸'àÞHÀ†‡ø}¸nˆ8yO¸ט8‹Wx€GxT T´¸ß8x“øå4Àeöø[Z@d*@[†%oð¸yX¦¥b6¦*ì†* 9”À ‚eF¹X:¹•ÃåÔ@•gùX6Àn¹—K‘LÁ˜3¹3"y LÁ(œ¹›c9až‚!Œ%‚›ß9Y69æ4àŸÿ9 º :¡º¡:¢ú60º¦yŸ'º¤O:¥Wz¡WC£[ú¤€žçÆ“k:¨‡º¨:©ú£—8”ºª¯:«:€¹nðy«Ï:­×ú sº3¾‚­º/캯‹ú©{zþª·úÄþß4¾¶Ãþ¡Ûþ ¯þ\Ð~¶ã~µ[¾éÓEë×~åSºîÇÅðÿ¬û~¢¾mðþï÷¾¡“>Ççºæ«>æãFòGÿëSzðï ô':ó#ºå74Áí|öW}è‡úø§ '/ Alúª¿ì£<«¿ÿôC¼•:@ص OA< &TháB‡_H7‘bE‹1fÔHþQUÇAz9’áB‘O’LIò#’aÆ”9±–7âTi€~³F´¹RaO£;M~ jfS§¼Ò‰têÔFªÒ(Ѫ#>+³ãW¥f^5Ê‹V6ƒ¢ôë…‚Á #¨„û°Ï ʤ×¶Åé5-Ó±‡'V¼8fM´iu¸ÍZkÏV ËX±ãÈ O½ZZƒ?—,Ì9qÙÔ~_~ÍVШqnf=ÖõìÐ:eß>ÛåîÞcûþ«b^[BRe¹ÒëRãc£ÎΙ\2æÎ¡gŽ®ý¡îëM{§þ[ø6~Xz¼B ?~Pè\)¸Ëþ«mm^‰o;ár>ö¦3ì¼lp#ä@k‚:`Á (’@è çxÁâ Àz*hC^:üm\±¦(DäÐCØÒeIMWÒ(hÕV_±¡k]…õ$J-Ŷm •´:‰½(»´ TÔ£ ¥’ÏSÙüË j­eµ[móÅÖÛ…TP[±%ƒX¨À•Ñ…ÌK·¢8“œ3YÞ 1Þ=Ÿ¥P‘6§ 4ÄH_<ÂÙ²î8öøâ3Ë^J0h ^L6 ]‡qι1›LbØù }ø)È6²É† W´<:é¥ ƒ-6ÀÂh¤•fzÀ„¢ˆX¢0Hjª­ÎI:Æ(ˆ—W¾ØâMu®È؃|Zhˆ¾úi­Er:먧®Zï¿·†±K”òžk¨·ö›ñ±W|o@þQº9gˆQª;hÄ‹vœo‘×ò²=ß8­Äñ.ZrÂS÷+,üqŸ•nŠÀÓ(›á"ãNsºÞ|hÕKoô:„ç‹E /²Æ ¸å#&̹˜ETQŒdI³ØÆ„~ü ÅiÂG,j‰xdYÆÊ9ñwˆä ÒÈ?Fò‘™¼$OÈ„I*B2£„Í-–×HD±!¶XX¬·ÞUò’Š,¥9 FOÞR-]±XB6„LÎ4ªSÊ\YX“ŽÂzIñ8F=ÚRšŒÌ¥B4)Á¥$˜”ÃC7µ%¨‚$“K±ÜÎ*¹x.'°(µÜe5qyËNZñ“Ì;7…)ÉoæÓ—ïôc`Ì€ä˜`á]ÜhÉËðd“”ðœ'þCAÓ•èŠb ùBC6à `Ý¢f¾„—/'êÏ,¢sŒ AÌX‘_Ù̉-[ùLô` 3xFLgºµ›Š(§;MˆOe ¨[øòñ)C¬¡µ‚,bt ‚ dI>ž§45Ps*¬µ‡\åéÆzB‡4x«¦[ÕiUmÚÕ´~UŸnše›Ð ̘U«h=ªWÔUmZ•¯kÍk_ 4‹ lǬ@mH8úiPJ•­r½j\jWµÒu¯ Y>/¦:ª[;lb7ûTg:¦-+dËÖ»ú5¨e< /›Y‹‰$¶íbC‰×‹pRIK\çŠZÝöt²Âõ¡þqˆ‡ÚÎ6!ËmHJèZS‘LW±M¬$p‡«¥Â·±öjÃÑ ²Æ*d àç‘ï²!»¬mȨ°ÚðÖ¥õMW4ý8ÈzŠÔ‹º¤'/¢Æ*žñCó@6¨Ðòê"¹»k)~õ¨_7”ŒÝïq­9aþ:Ò¿- Ó•PxzÄô°†1ìY X8c´E>¢JVz±Šu<¨ÎDœ_ GxÇýÅæ…áç€Xl`É6¬¥†P¡Æ Arƒ2¾—N4.ñ5W¬ãm2‘¬¥/ù¹Ýaò_HJu6‘UÖð•åÙa Î]ÆÃ˜Ã¼5<—ùÇ(¦nŠíþè°óø¿,î1‡ûlè-çCe´šÑªµ ô#½ aô†Ó\ Üâ2ôµï§T¾]ül1„axvj<äâïBb±…tmÕ­Î ?¨ D<ЂOŽê”Ó2j”ºiì£Cª‹Çêä©Ú#|¶gñŽ}/ö);rê[âb­"lbÚÈž¶­­ êl9ÜZªÅRþò§:ç$/c¹ N¹@‡˜Þ‡ùÄñM¸™3û‡ùn¬Eûàga½xE¶±}„͵†sÔU½îày$"^ó4¨Ñ~òIè°¨—A¾ÐuÁDPèGCâ>wŒ%á}’;/è#„ˆ ³ƒªÄw5„¶Y æ¼_ëlíthûÛEô÷Àüî™×»³ïyÀcÞÙ[Îûè bw¼k~ï}ýæÛbbU’ín‡Ñé7¯ú×·ÞïŸ5JûçÝ+ÙÉ»X½ï¿‹ÐÁe' ‚-€Ñ‚´U÷­V©=æÃÄúÔw>û¾GQè»úßwº *ÓÈCò߯ó£?ýþõ·_!R¦<•#vy-á¾îÜç?è]/ü`ï‡z"+`¥üÎ/ý¶¯!Ìý‚ ô¶ãý Oú`#ù–¯ùVƒÍ|Ë$®ïö´óŽOü¾/ÿoü°(° BPJPø‚.!†nö:Åòlo@JP÷÷†Ï‚Dè-v€`ŠÀ œ@> H`¡£þ¢+„0à~à ¾à þà>á^àÁš½¼ÜH~â)¾â(áÔÀâ9þœˆß9àÓ á)áBþäQ¾<ÞHŽA  ¸KÒ åi¾æÿô=çþQ½# ç}þç>è…~艾èþè‘>é•>è¡J‘! ÿ°–~ꩾêÞÁ¬~ë[T%`ë…~ .ìɾì.Q³mœJÁìÝþí}> îTçé^Ím38 â¡ëc1ñ^*6w’ï£Áס}×@&q³îßÅïþïíS-!_/%ß ß& ?1Æ 2¿ñE_¿ÿï7?1ü¾òAãòw£ôEòôÃõi1ôG¿ö·[ö}ö#õU’æ-2uŸ7>_ißöß·q7ƒ_,x¿÷—ÿ)’ÿ!Ÿß)¢?‹ÿø±ÿ³«øYŸ5š_õ§=†ÿþ$Ã&¶¯?ûÕ¿¯Ï_9è±üeâû¡òý»ßë]qüK8Iÿñ ý×ÿÿ"À <ˆ0¡Â… :|1¢Ä‰ªà¹ˆ1£Æ;züxÑ"È‘$KšÌ@ÕÄ• ¼: 3¦F‘2kÚ䘒¥Î‚oúIóçÉœ;‹öŠåO$ Š:} 5ªÔ©T«Z½Š5«Ö­\»zý 6¬Î£Iƒú4‹€Z^CÚ$}‹‘¨Øt.ߢµ‰€­m·Ùº 7¦\±d…–™W­âÀiUÎMWøçaÁ'sdú8³æÍœ;{þ :´èѤG–\¶òEHh1.ëxnÝÔHóŠƒqŒþ˯Æ&Ì{(m¥½Cþ{úfð’yab. =ºôéÔ«[¿Ž=ûÊäi›Ð¡‹oZ(I,~Á‹–/iã9Ÿ~ýÅm®¬õƒr¾zöiU_lCGHäY´Ö|0„ 91 0Ö¤0Ÿ*˜–ÖSóÕw_„&ˆÓq`Í6“wà‰À€ï¡·_{jåÇ¢|xÐg~+ÆÇ_^¯ô‚Q¯ˆTà‡2è „xùàE¬ AG?²¸õ,tðÒ‚bfÜ`bx–§Ÿ|Љ&4vxc‹ýÍ„“Š)–—¦ŒoÞ5r€qù—ã#{cˆã†5ªfs3JIåaÏiÇhþ£Ž> i¤’NJÚ–lÀb„´?¹ÂF6Ù°áJH**©‰ÁÆ`ñi¨£–º&qxÈ©§x@ÑêiÀŠ/¯|±Åñêꯜn¡‚<âÁª«À"ë+°3‰ø‰(]šé¦iukª´…ꬫö l¹ªÖ×6T´‚GTl#µÊ;l± K¬±xÌâÄÀb§QðÃÏ.õözoeØze)¦šæŠ‡ºãž*ëºÑ¾®¹ìšZ¸ßêj1ÅYšv'·\qÆcT2´èv¼®¡¬Â0ª¢MQÊsÏ>ÿ tÐB[·¥†xPà@H[`dÑHƒ|QÓ=F3íþtÒ¯É-®¥µôE¶°òŸ5Q‘MFc—’®*„s‘Õ­}«Ùg¦m\Y+õÔZ%õÑZËQàT7§Ä>xì¢Äšt·a·5h>9G$5ÙG‹ô¸Ýw£Ü{ƒõè€Nxß‚Cט"6é¥ûÍwèwU4í²þwá¨_=ûê[‹ä€Ó:|òÊ/Ï|óδ%_’xx#=õìbŸŸöÜgôýô¬‡¤i@ €õá¸~Ñ"ûÐA… ­ÿ'»"}ýî]‹÷K•e_=Œ„O{AàEðw@ï=¼(/ü4?öáÁ}ð“ßß¿ö±áî ŸHô÷þ¢“Í%zÝ àõX@"ð„%\`e¬—>¢ÐzŸáf˜À¦°…+4  =è‘E=oˆD,¢ˆDÜÝÉt¾ÓÝét—ºàÎ?lÂb§‘mè‚qÃ"ëDŪy±†bÉ[H˜¨º)¦qpÀÃïÆ·¦\  »bG´Èžlñ"ˆÅ¶±‘XCsãÉh§Ð¡Ñ‹d$ÛøFV‘u‘œLÀ’;áѤ’M^9YÅâMíxI,¥)O‰ÊT"qK»ÀÔ.^F3ZÑAs-×Er1³ZzŒ&¯ÃIFxÅŠmPàk´ ņ`ó‹·Ì%0…ù5þ=ÆŒii% ^ɺþ˜Íf.k¦´b µ^úç™ËÄC1iNcî1Xc D⊃%laÊŒ¦4m:kb³VÚ¤eÌpùM]Ö,.p´Æl¹5”ÜŽ+¬t%,ûÉM„”c…¥8]aM6R•í¨G? RêlÉ;€EŽ2ò….¤§ üB?ȤR^°tCIø€RºÒ“‚ŒNÙFlŒà% 06ŸŸu¨A’+jj#ŸU¨",£ÿJD‡’ê4?1é®^ÊÕœÒÔ¦a•éVÅYE©.õ"E=ªØjT¤âAT€äȤÐA @R*U«šHœÔ¤PéYÖ÷tÕLO%«bÅZ«×þI°©(]lAã²Ð­Œ4«„­•a½êR˜B–>P-«Wy ²/ÀB¯U âÎB ÛØÊv¶´•Ê–ŠƒÛÜ2'³Z¡ært \PÀs$¹äWnÜäúFKwR.^\[ÛèJwºÔ­-r‹Ý××+¾Í®w;‚~l Ö*.o³rÝï:w»J zM²ÑêÊw¾ô­/óÒûÞü æ¼Xé®~¿K:˜€B»e®{ÿ\ö2´¹öH|í áKxÂDûmƒ/ŒÈ]É‚5káÃÆÀ"¾‰)Œâ«xÅÇ q‰üáÞnøÅ4n ‰kœÛ£×Å8>1‹ ä "ÜÁq‡uÜßþùÈü½J‘—\›&[åÉPÖˆ‡Œå,kyÅT®²~‘|jzù¿`ž2Çìa)W¥Ëc¾ò–ß ç8K—Íhön™«"æ:«÷ÎT¡³ž º?_æµr.´¡ÝQ? :Áj¦Jž½ÞFOEѶÝ+7#zÓœîtò*‚„P‹zÔ¤.µ©OêT«zÕ¬nµ«OÍç© ¯®µ­oë\»:Ö¶€® ì`—š×Qµ°}ì$ÚÓÌn¶³%õ€H{ÚÔ®¶µ¯ílk{ÛÜî¶·¿­ídÜä.·¹Ïîr‹û1ÑN·»ß ïk¯{.펷½ïˆgë{ßüî·¿ÿ ð€ |Tà/¸ÁŽð„+|á o¸ÃñˆK|⯸Å/ŽñŒk|ãï¸Ç?ò‹|ä$/¹ÉOŽò”«|å,o¹Ë_ó˜Ë|æ4¯¹ÍoŽóœë|ç<ïùÎ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_s_3.gif000066400000000000000000000072621343257752000272640ustar00rootroot00000000000000GIF89a˸猂„LBDäÂÄ”RTdĆ„$"$lZ\ôâäÔ¦”Œnl¬†|”"$ìÒÔÜ®œ,´fddND<2,tjl´–”ôÆÄŒœ24亼”ŽŒÄ¾¼”z|„f\ \JL¬VTÌ–”üòôÔ®¬üÒÔ¼vtlVLœ‚„TJLäÊÌ„4*,̦¤Œvt¬ŽŒäÚÜܶ´D:<¼–„TB<”*,dRT|f\üÎÌŒœ:<üúü¤ŠŒ„ ìÂĤFDÌ’”,"$tZ\ܲ´¼rtdRLD64üÊÌì¾¼„nl¬^\äžœ¼~|¤‚„Ôª¬”vl¼’„ìÞÜ$¼–”TFD|jläÆÄÄŠŒôêìÔ¦œŒrt¬ŠŒ”&$ìÖÔ䲤D´jldNL<24¬žœôÊÌŒœ64ä¾¼¤–”œ~|„jl ¬Z\Ä¢¤üöô¼z|lVTäÎÌ„<.,̪¬´’”äÞÜä¶´L><üþü„ ,&$t^\¤†„$|fd”vtÿÿþ!ùŒ,˸þ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ - …Ñ£H“*]Ê´©Ó§P£JJµªUS˜¹Âµ«×¯`ÊK¶¬Ù³hÓª]«š¬WJÈK·®Ý»xóêÝË·¯ß¿€v W°áÈ+^œ˜pÇqKž\€åË(kfì˜#äÍ ‡}¸óÆÏ¤S÷ͬºõ^ÓQ»žM—5íÛrag”ÛµíÞ³ucä <õï⪅_$Ž<ôñ棕[d]óóꛥW¤Ž]òõþSä¾¼ùÜoG>Ïž½ø‰äÛË/þ^büùøi×8#Q‘ÿ(à€hà&¨à‚ 6è`ƒlà‘ ˜Uhá…f¨á†vèᇠ†(¢…–߉ô¥çÙz(¶œŠ§±è⌤íÑ}4樘á¨ã‚ñè@¹Œõ÷à’L6éä“P:á„#Viå•Xf©eˆ%ªgä—!¹›Œ`–y¤‰Ø1ÑG`¬É‘Èw¢åÕÕ Ù‘µé'_L`›rñh{’0AÐÙÉž€†ˆAÊõ„îÕ‡‰Š9™Þ v"‘VæÜ^(€)š±@2 þ¹Uv`Uü)W ,!ƒréðFp”qA¬˜åµj«¯Ê¥L€¥%(QxÁš¯À ;—‰œêe£øÃoœ«¨¨\f¼ „8ÈåE1Â!çîY™¸äš[‚"Ih AŠÈ…EÀ³6o½÷ÎuÞ®*lÈ•Äèê{—ºsɰˆtaë2äûZÅ%\,W"°–@B·%°, ¬‰,ÉcŒœ¢ 1jò\ªžK«­%´à‰X þllž%pœ2ÆR§ÁÓÅÊÅmÄ1N uÐ]E]:èa†\Ä`ØO½rË/¿=3kißU*×±qúšþÐË5AË!²¦\  „Ùr-’„áQDÆ6ºPŸ °ÀË¥È ”³¦8ãëõjs<+äsßn£ëÓ•†Ÿrùp,Òë"DdaˆNËáoäè¦Á¬³ëJK­µ³×~»Ö‡â=&xj.–„ì­ÍY§¦ËémæõkS?ÝzÖ=ö/¢ þøµi¿õä_zB£§ŸãúµïþŒð$ÿü-ÖoÐýì5?˜\nJa¤çó}3êÑüÂAÆPëÊŽáƒÀñå7ÌË£B5©PñÍ.—* ø¬sAÞæS^ó äìf*BMÐ>´‹ðªu­_kXY3Âàð?AVþ–¢ª\`† Öj.¸Ò¯J€­kVxÑ!}(Ä*V†ˆ¬Ùš GÈEôA`3P½ì…¯"i¸âµB d‘Z Úõ.6.ŒŒNÃËÓ¸F¾¹Ž%x˜¿™¹¬f#+Ù ér³µ±6|HW=Èج8#]_éGH2RgÖyaDFhYmiM[a ’€º >h:Ìåb4¤)-j©|Ü]VÙÊÇa0–Û‚™¹¸CÒ mj«Ëo… è ¾4a_ÄF6Ä• nÊü ]˜éLhv²ts¹Û ù/‚Qs‹SBãü8:Æà ¬ùÛ\ä©M¾n.…þ;œ#7§NÇ}“.î„';ç ¸ãxn Lp@­7d¡x¶Ã] NÇ  SêäµÑEöeu¶rì §ÚE4w»›‹E1ºº”oFHÞ8z˜(T¡<þKÌó4CÀ™vM0E`’PFüµG‘Í÷a† à ‚5êQï‚T‚ðoªó©ê@®ŠÕ£ŠòF1ì*ý¾Ú£°Š5d’Yó“SðMçaMO•™Ö;­u> l”ã:3™Ò•˜œ)!8³ÁFu°Qõ ¬\B˜=À.FcT Áå=ivJ.âü+9ý’Ä]õʆÚÊá{øÃbe XüË,KÐÙ%6Q[¢ÊþÚ]¤HÚ*ž6µv Â~(ݶT„œ5KÓ¿Ð^òcÃ̈F5²1²@{#`äx\;*·Œº´ËûÏÊH/uXÀ\˜P„l·dc7ÛJ†,‘‰åä+sÉéNòcï½™"³›ùB—¾z! b©ƒ*T2Ž´z‰ûSÀÔ2i¨<-]x ÅÿV˜ª%Úƒo‰µ 'v.v¥…€a¼ôá %ðA C̶á–ϱz)›#±É;n>3šƒõ 5é"cd®íÃ+k滫1+à¡xÈC»É¶Ì¾˜½|ɧ5ù¹ÎÐsŽîzg<wå Îåž„3Ü”ÓYe4˵2þ— šM»¡I˜K@ÙvÐõ×/"D7ÑŽ®4£}©GùÒÖ½NÏL4)ŸÙ¦;»ü¹¥Žô m7À *½( ÑS¨­®‹ºë|Úz˜RÆÔ‰™ë“ï|Ö"iU J•*n¾×êW‚«­­qkììZÔ½v¨{ì`›çׯvõ°EWì·Ù5¤lC£êaBùmkM^±½WÐ@°FËf_³¼' ¦°Ø>,¶ÌX„6¸4zŠ·³Ãö9l{y°{r²µYÍ—‰ §GKEÓV·}Ymk?›-gF¶vniguÛ"jM˜>Í›`–¹ä2 »r9ïsþy€ïú…ºîBîD¯›Ç»ˆœÈ&_pÆ—c"R¿Úô/ÉëÇûVò’™ä/^tŽož”û~÷É×uJ\J¸h¬ô0¾Kœp  ÂN—º¾XLä»8é¯9Üè–L¨ÙØ›óô^v<—_³ì¥Ó×ÙͼH}‡Æw¹\ÇK@ebY Z¨àÕ®0—@Êû$³ßÍý÷À«™ 9®³»Ã_KÑ­¨¦!ÝgAß;e¬Kñ¡IŠy”:zó‚¦(Lý:óM)Ú‚Aµdª}÷k'EÈάõ³ûZ‡;~ã¾½ò\/ü÷ýÞ~Á/~Šð^$'¸o×[оô/SƒLÿú[:¾A8þ€†î{ÿûà¿øÇOþò›ÿüá'À þö»ÿýð'ÿ†“¬à ôÏ¿O°‚5Ü@ÿ¨&Ð*°v€X‚@„G€°@O°˜,A a° "h= 0#¸‚"+±Ð,XƒÑ<@ °1`ƒ>ˆsPCPƒ?x„wÀ!?0H…k@Vx…Z°Q …\¨#ð+†b(†€Ð…fh#`jha(kXg‡†! ‡vxtx‡z8y¸‡z؇~h‡€ˆq8ˆ„h†þ†xˆ\˜ˆŠ…ŒØˆGøˆèƒ’8‰5X‰–¸‚˜˜‰"¸‰œØmð!c0ð!Ÿ˜¡(ª¸Š¬ØŠ®øŠª(pŠ8Šbp‹¸˜‹º¸‹¼x‹R0‹´h¶Ø‹ÄXŒ¾ŒÁHÃhŒÌ¨‹¿˜Œ5±ŒÍ8Ï3!ÓÈŒÕh1ÙXŒÛÈ/áߨ‹á(Ž-AŽbð¹ëh!»xŽè¸ê}àï¸æˆŒõÈ÷¨U@¸IŒôø(qbÀ†àŽëȼ˜ i )Hp·h‰þX‘ É‘ºh@ ‘Ù i")‘S] š’-™‹¹’"q‘·˜6 “i“)“bðÀ“*é“'¡ŽåèŒi”79“I9KÉ” ”OyŒRYTY•5y•‘•O¹•\™^™”`–1–åX–fYhùj¹–Ñ–Ùø–prIQY—g‰}–¡—m˜‚9˜„Y˜†I˜~™˜Š¹˜ŒÙ˜Žù˜™’9™”Y™2;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_t.gif000066400000000000000000000145371343257752000270460ustar00rootroot00000000000000GIF89aØçœ‚„LB<äÂÄŒjd|Ä¢¤$"$tbdÄ‚„lVLŒnd<2,$ܲ´´nl\NLôâä¼’„´Ž|d&$”z| ìÒÔÌžŒ\F4Äžœ¤‚„,&$dRTLBDäÆÄ„Ć„lVTT><ôîì4œ:<¬^\Ü®œ¼rt´’”䶴̦¤<.,ôÊÌܶ´ìÖÔ¼žœ¬Š|”&$äÎ̼~|ÄžŒŒÄŽŒüþü„nl”.,´fdŒä¾¼¤†„Œnl<24´Ž„Ìž”\FDD:<Ô¦œ„jd t^\TBD$|bdtZ\œzt,"$dNLTFD|fd¼–Œ4*,”vtD64L><ÿÿþ!ù¸,Øþ- H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]ꃀ§P£JJµªÕ«X³jÝʵ«×¯`Ã~åÐQÀ“ hÓª]˶­Û·pãÊK·®Ý»xóêµûD@Ù K L¸°áÈ+^,ãÇCžL¹²åÉAürø²çÏ”%Om™4èÓ¨Sgþ›ºµkÓ¯°À"L`Ø‹q»ÞmyõæÎ¼ƒWÖZ2† ·nμ²ïœ›K @,j )_BZ²5X,þˆLÞÃ%=$ËöÿÞÈ]„VøŸtüeä߈Á€Ÿ2d¸Ý%f&‡ˆØ_X¸„(uÔá"wÁ(#6.#ŠÍ•ˆÑ‰H¾&E|zü(™O.!&Xb`nGe|XjØdpJ^Ää™Å­Ø"˜z¬˜(’ ¹ÄŒRê¨e`qÎYgŒw–¹›®¥iÑš„~2 Àvlä°¶H¦ ƒæù£™‘NZ醘 f¢¨Z¢¤–f]jT)™þèq‰Þ9ˆ*š‡{Þ묵ޚ«¦©žf*E¨;Úg\2b³Ê’¨tÀE»\eLˆB„"Lä—í¶ÝZ+ܱ%+®bÄ%†ÃXd çtë¶ûî¹»‘+‘¹ôæ«/¡öFDÆ L,ðÀlðÁ'¬ð 7ìðÃG,ñÄ¿@FG—l©ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ—°¶ïË0³Ù/DøÆlóÍ­ÍüPÍ8÷ì3e:;ÄóÏDmXÐ môÒE#ÍÒLG³Ó ýKñÕXg­õÖ\wí5c¼òØd—möÙh§­ö–-ÿ&õÛRS­Ôp×M¯Ü ñœîþe)ÈZ`¼°÷t.¤`7ox#¤÷nk`1ËßK°ñ©f`QåáªMÛ_µ[Òöåàz6†-מr9¡.è€yΚ›Èy`Ç%7jd‰1Ƶ ç·€ì«Ûú’¯†!˜ðY žx4Ú—^Df²X!9\ ï:¦1bR0aL<)~ ÈØ"ÊãG½õØß¶®d³¼Ù;h‰Ä${îŸå¥¾"…ù¼Bñ)! Á"ˆ°@ÀbS…Q€"&1 EK„£@Xs{K¸'Ÿ½éUïzÙãΖ¿Ã2'ªQ¤ðòר%ðO—àþäˆÉQIR€‚! HÂ6ð»Ô¢ië•Øˆ¨6†g„$yNgFÛŽq‡™íáƒ8Ä w¸¬«+½¤):6 ²¥íAIƒF5²ÑpĬ$ ‰]Ä—f´ÌÒ™Yåæ“MeuØHIR’0—¬í*{EW¶—¸u]d`lù)׿~{íë:#'©[ €Z‚[—ðË`^Ó˜È#7\¨÷î,¾f'°Ì),ÑH€&0 *£_•“„§LUÙéNxÊ“žöt‘C¹JâÏ Ö(M EOcÑÓ8µÈ¥2±ÐnŠ-m‰Êv;r’ £ÒyaùmZ¦ò—yæ1?µÌf&*þšÓ Ô5ÏO©‡ÉÝËäìš' VÊIói蜟Ç9j|NÍV ãæe½F:VðµF›â!I®„)ôUwh Ý.°©C €„¾’9šæ´§CÝéø¨Ò¨1l¤ñü´jÉyže_Gûgî¤/0œ½„ô0;‹ `áøÜ­ª€Kœ±-óSˆb{;¹–Þa á1ÀÚéõ¯ƒí¾'8æÕ6b¨mml“{QØ(ž€ƒñ¦’,Z‚¶ý¹÷o>’7iå'7¿V2%ü-^Í€ÿ‰H·#<¥°5dB"Q|®€Ÿp ¸ ÌÄ.É œ·†)„)þ¬m í,¼áÿP‘þ˜{ä‹*¹ÈI®ÇÐ “à9èAžÜá(Uÿ–àò­ðÎ;­¡d¨(D+¢ë6Rä¡ÍT˜ <êFÌ Ö¦W—¿‚Ùz¯.!ÝÄÚÓ„±úm8©t©+æì¦†û©[ *F‰K`¢¡8µs‡íöîÔ³xô~³z!Lò®dþ¨Þ§;w klãG5EÄÖÅ££`Oëòò‰«’‰1¦Î%u#<ê1³r2=æU¯øÀˆþõì]uÒ?à,aÚÑÅäe°€ b­û`ŠßïJ.AúTO~m!þÃ|çCŒmg¶òA€I¼ š¡e)O˜î?_’áŸÞø[ùéÀøûÁÎæ0 ûƒv˜´f?`@AÐZ)@qù'C–€·ÿ€³sh€’ÄrL˜}Ë" ª`8yMÒDMQDp€c„(#&|Åbèôc •@9v|YÒNï¤Q8PƒK@ªd×ZÍöq€l¥PAf$6„E¸8ècKOŒáƒ@Ø’$ç4,Kð„%…¥1's` 5PT„c„…-Æc9HZå‚eK5MVÅsHw-y8vfx?RáÂf!ˆ0cˆþ@sxsS]óTø2‘ˆŠ˜7zFˆ$%i˜ØRš¸‰™X‰Šs‰A•Ø¥eg±¨˜ŠªˆŠ( «øŠ°‹kÑábq‹¸˜‹·@ºø‹ÀŒSAL!•ЃPŒÊ¸Œ1ÐÀŒÒ8 }@”àÔ¸Ü( à–ð™Ðä(W`–À}påØŽK }PQ;àŽöxe ±›pþ8› q}Àÿx=1}Б €™š0á”Й‘3ÑEר‘"ù1[0’*¹„Ð.ù’/Yþ¹’4YŒ 89.‰“85ù“&a. ”DyBÙE™”#q”JÙ”Á”N••RY•A•V™••ZÙ• Á•^––bY––@–f–h™–]¹–l™•nù–U—r•tY— qk³—|é1 ‚З‚Ù—'P' m˜Š¹˜ŒÙ˜Žù˜™’9™ ”¹˜–y™š¹™œÙ™›©…I' PPš¦yš¨™šª¹š¬Ùš®ùš« °yš²‰šµ9›¸™›º¹›« ¡9£É›Âùš@ U@›»©1¡pPš·9›Ï)œÑ !À sðXþ°0œÞÙ›¿)Áùäiš€œºY›U¨ð ιžåŸæ™š¤àVÐð9Ÿä集Išþù°õ n ¡ bàÎY«ðŠ€ Ôyš!ðô¹  ú ¥Y²° X ô™—P JJ¡ê€¡ Ï9£©ù!0   ¢) 8*Pà´pœ)* ¶p` ²àœ©À!0ýÉžœ€OZšDj¤HZš˜` ­Ÿ‡ ‡@Ÿ°¤MÚŸ²p FJ 4š §y ±`‹Ð£ÿž11žršœ¥‰ ¬@Ÿs`¡+0ÎÉ ¥¹þJƒZ›}ZšZš‹J›p ‰  ¨P@¨Žê§kJŸ* xðs€ 7z§»©£ÀÉ£¤Š›µé´`)úqz©…º¦·iDJŸ°:¨…š«´9{J©êùz©›š¢ªY+·ªºiªâ‰ªÌJœ¦¹¯Šê§€j¬)úœʧؚ©¶ s@¢bªžºÅZ¨ §­¸é¬u ­îÊšÏY P›Uz¤Iª­µy›` Š@Ÿùz¥P¥ŒÀ¥ñ € åš gš¦éššŸÐVPŒÀË:¯¯ ¯0a§K¯§Yj:¨ ê ±J«[²@Ÿ‹Pþ²b« z X0ôÉ ¯0Ûªž‹0:z žÎ¹1Pð©€_  ëšû»´P«±B  Q+§MëO[µZ‹£­À ˆ` ¨°µ9J§+¯b{¶ÞY — y«hûWÛYû¶t[·Q·,1·v»·|Kªx»7p —0¸„[¸†{¸ˆ›¸Š»¸ŒÛ¸Žû¸¹’;¹”Û¸§p5¸•»¹œÛ¹žû¹ º{¹Ú·¦{ºVK¶Nk¶¨Ûº®û®ª‹µ¬ÛšêÊ©®Y»¯›»åù·*¡·´ ²°©®¸«»Ä»±±+·³ ¼ª9¼@»¼Åû¼³É»)á»Ê›šÌþ˦Π½ÚËšÒ‹û´ð«Ð¥ ¾âK¾Új›+Z¡ôª¡€0¬²©1å¾ã»½ÐÛ½'á±—ànyPšýû¿œ¾´I¦NJ¯Ez¤8›³¦9ÀŒ¿Ï«¿&ᱫP ÍišœÁ¶k›–Š©±ù­\š,Áù{¼y‹ª‰P´s¥¹ÂXÐÂܼ¸ ± Âýzš0,Ã&¬»\Y[‡p !;Ä3Œ½5,Â9ŒšBLÄ=œ»?L+àF TlÅN\ÃÍk›¤¦ûZ›¡`¡X\ÅWüÄ®Å#á±4p_@ Ý müÆqÌÅØk›î ¿ò[šJ€µ9ÇþpŒÆ¯«Æ"A½‚|ÈîJÈ!aȈÜÈwªÈ ÁȱÉ1“,´Ž|Èü’|Éœ<§¥ÛÉ üÈ(¼›ʦ »5A sÐ ¬ÜÊ®üʰ˲<Ë´\˶|˸œËº¼Ë¼Ü˶<¤P«0˜Ä\ÌÆ|Ì)³ Ÿ|ÊÌ ·£Ü»ÉÛÌÒÌ´Ï<½Ñ¼´˜±ªZš0×;ͯy ›š™ì¥|Ƕ9œ! +››µù >Î乡ඦYÎqÎî¼›°x §0¬QûÍ[{½·@ä\ÍÞ{Í>Ú¬ðÏ}§]µ×QÐ˼Í*:¡ì{¡ô‹›ªÐÎCk¿è[S  Xþ £:¿[š *¢äê±ðk© ´PðÒ#ú¡'Ò+=óÑæ{¿ôZîô vÙɾŸ€Ð¥ —8M®&Ò*íœ>mÉA¾PàÙzšøÌú¼­<¥üš¼ \ÀJ` a;«™¥[Ú¥P€°! ,× kÝÖo {Áϙִ{ ˜p {À¤˜ŸNð BšžP°ZÚ× n휃m»†]šÝŠš_½aݯ<«Gìšg]¦ù íl«Ð°¬ù¨ªNLÛ¥éÚ¥ ÛΉØËÚ´ûÁ•ª«¥I í—§¸ º ¼M¾m»Àþ Ú…êÕ ½¿ Îü*Û -Ò;ìÂPÀy²ÁݪyÖ/ÌF-ÞöÞ– Bª­ßý»H\š‡pU(ªÞ¨)ÞýúÞÏߥÉÕ½£­žKœ›±pL|ÅÀÖ›Ú¦¹Üsp`P`p­¨ÙàŽÎM,ß¶Ëžx€ ª0¬Ë­áÚ=Ã^š=à§ZàÀ c¬› ÍY|ŵ` U,zàl°}=ÀŒ µéãt}ã9¾ã§ã¥YãNlÀ[šmZMä¥iän ã¶«äe¬Å¦y -Ú×]ÁÙmàdî×~œ›‹ÀÎ¥ Èq\µð z€a:ÂП!+ 2K³Pþ Ìžx>³úæq>çÏÙÇìÆ u¾ánšm0ﳂ~Ó„.ç¶‹èk®èqìõÌâÏZ·ÙLž¶Çt[êÂéåÑ*Ϊ9ÚÖò¼´UÐxðÞPëêa§$Û»ëË« “ªµ¸Ž°îë¦<ìQìÆÊÈnʾìœÜìñìÐîÈÒNÔ^íˆ|íÁÈ=›£¾ÏŒîÍbËêÌíáíÿ¼šë,ÒÐYšð|¶ô¼ÞÛæ@|Íßþšýü϶}îö.ÅøŽ£±ðåâžïwºâÑðkŒªÇñËÝ«ú¢1ºÄ°¾Ò¦™Õ:MÕ+m¨ã½šê úþ¨ zñm¡SÍÓV1ÞÕÖÎð…ìð l ÌãøŠ¦p0²bͤ ¬ßì¿ì×l­Ù áTzóIúé §p£ðÔ9Ö||ô›MMÝŸÑ Äçjñ§]š«Á§ÙÜÏÍãªy®€z¤é ¡@¾±¦Ã-«¹ýÚ± ÝZÝ3ïõ7ŒÚÛÞú¯žÿÂ, ÞüMÞ5øÖÛr°«p£kÚøÔië¾ð^öBÏ Žò‡Ÿ  ¾àNlâe>Û"l m0P0‡` aúw¬ð—Œîá±Å Æôù SŒ°;±_š3nšL^å8~åH>ø§þ9°ûê ' jK®kjåXž¾ªÎùnž¿Ç(¯â[µ¹³=û³p]þj.Çœ>èpŽétnç¦Ù²«GVàÜ aïæïoèE ¡ D˜PáB† >„Ø0Ö K-^ĘQãFŽOÄB bC!ªFbº5Ò¡­*]F¼…éåLš5Nì˜SçNCÒlÅ ‘-T6EšTéÒ„8y>…Úä@‘3k] •ç S®]½~5ê4êX¨>ÁžE›V­R±dÝæ4»Vî\ºu۾ś1n]¾}ý&½›W°¥ŠÚFœXñbÆ?†YòdÊ•-_ÆYÅÁ RZôhÒ¥MŸFZõjÖ­]¿†›5gϵm߯[÷nÞ½}ÿ\øpâÅGž\ùræÍ?‡]útêÕ­_Çž]ûvîݽ^üxòå;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_t_2.gif000066400000000000000000000136351343257752000272650ustar00rootroot00000000000000GIF89a-Ë猂„LB<ìÂĤBDĆ„t$"$lZ\Ô¦”Œnd¬†|dJD<2, ܪœôæälfd´bd´–”ÄšŒT><”z|TJLD:4ÄžŒ$äÚܬRT4&$|^TœnldRLܶ´$¤–”\F<ĺ´Œvt´Ž|Ô¢¤ œ‚„Œüöô|fd¼–„”"$ÄžœTB< ¤JL,"Œrtܲ´ôîìœzl\JDÌžŒ,üÒÔä¾¼¬ŽŒ¤‚t¼–”TF4t^TÌ’”„Œrd¬ŠŒdND¼rtÌ–”$ìÚÜ4*$|bddVTä¶´”vl üþüÌžœlVLœ24üÊÌÔª¬D6,´ZT„jl,&$œ~|\NLÌ¢”¤‚„”†„LBDôÆÄ¤FDÄŠŒÔªœŒnl¬Š|Œœ><¬žœä²¤üòô´’”<.,ôêì|b\ľ¼üúü|jlÄ¢¤Ìª¬„jdœ~t¼šœÌšœäº¼Ü®œ¬VT  „ ¬^\ ¤NL„¼vtìÞÜœ64üÎ̤†„<24D:<$dRT\FD´Ž„¼–ŒTBDL:p¢|)Ê&†F (škVêP›~%‚•›÷WŽ\1H ˆ$£_4(À$ ¨å þ\z +˜¤TùàƒiZªëAÑrF“P`Š|ù ¬°Äzê"hp1ˆ)0i'_8ñ5ØŠ ¬Ø¶Ptû¢!.¼‰Å´Ñíª®AUA%@>1¤»ðj"/b‘Z Br§öõ)hB„€ðUòĂð‚“ÆQˆ§lºëfœ¦Ðu|qÀ±å¨±¥{ü„“œëÈ$£lòÉ۩̲º%¿l³Ì3ëŠ^ôìóÏ@-ôÐDmôÑ=€GκFïÓPG-õÔTWm5Õ0ÝòÍ\w,²ÖÖÜõ؆} ötb“­öv+ŸM]ÚkDZÛb µÜk›Mwþevãí·Þ{+Ö÷l–Vø^8à€ î7Û‡²Ë6zXÚƒ¬aHâíå–?>[Û‘/f÷Óg¦>ˆ&¯ÆZš­¢^:Ú“o(ޑ袥;¥³×6ø­ ¯Þ:˜”ÿ^éÁ—5|ÊÅkιçè*?wó‚OŽúÅ(?À€â 0l=®Øóüø7^þSp£ï±úë7Õ¾ûÐÁÿRóÓ/›ý÷'•¿þ’á_ÿŽò?BF€,J è&p(N»š'HÁ B-kŒÊÎÆÁzðƒ@SZ£²@–y#DJ MH¦Ð'+d¡`\øBžÄP†²«!Sn(ßņþ:Ì cª ˆA¼ÉY,ÈÄH@Md" “” ŒàŠXÌ¢·ÈÅ.fñ[0‚ÇHF/n€ŠL“ÀV 4º± ,°Ä¶0ƒ7Ú1 nØA‰;¾‘Ht@?R± ›ˆD± 2‰jØD‚$<2ˆ{ÈÄ@P°‰C\ò…Ø‚B€á“)Ô‚%X@J•#ôÄ 2ƒ-t– ÃBPE¬€¸`¶ðNó˜/`C0ûw 68+X3 e&[Ø‚5SˆMmn3ƒÝü&8³)Ά³œ<':ï§Îu®¯îÄ<ã¼yÒ³töþ¼gàò©Oºñ³Ÿgû'@µ&ÐK&BM¨BÊІ:ô¡¨D'JÑŠNÙ´¨F7ÊÑŽzô£‚ðÈ¢HÒ’šô¤L<ÂPÊÒ–ºÔ¤"……fJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢õ¨?íbŠÔ¦:õ©PªT§JÕ¦*•©UÍêM#% : `§3ˆE R 7@Ud&ÐHÌ­je«[¥šAm i*hšQA«€ ìM¯Ú‘ ÈT°Z­«$ Wè” ¢P¦`Q0á©£(Ú„.„b¦™Ýlg?K×šæ¡ 3¾*Pä±°þ,a9bØØVU±R¤Š!ÐTšÐƒ+QÓ8–®Jl‘W)|"¤@Ã,ô0SX@˜0Ä fŠ êÞ´»8Å­¨‹™…-`MÔ• °XO*X €ä.·¹õU.sgúÜèN·ºí¯mŸ:ÛÔvÀRÅ­n¥`…V|b¦¥ðƒ,[S&h¢º·„$n‡™*á!€+dQÝT„@q m,`ÁˆØtÅ-¶©x?¡‰¿’a2X¬&>€ò†;,…‡xÄÕõ1‚¥Z`xÊOU¬$\q\Z€B v1\ÌWÅ`»R˜AþfÚŠËæVÕÂLs€‰·¶@˜ƒ,¼«‡;çyÏÕµ)LÀ[F|ö «pª‡ ÓÍj®.¤×,…6Ï4pV4–£ZåŒ\yÓHåª+þ*…BநÅL)LS W—ÌtæîÓMSbt(oMokZÓ´hƒ*݆4‚®ž)n†H½zÎu¦+¬£ ©|U7Ù ¶êR {ØlUÀü•ƒ,HÑÜá÷¸gži¤¥p€lµ¦à–ÂR€Óyûš¦˜ƒ‘g¡„a—–¦a°Ã>¡ZI«›ÒéN3¥Ûýnok«/j¼¥ Ô9´Z&˜leÝ €Qhx-˜i-þn1ƒ6¸á°âUl(º„O„  º^yË_®kp› _¶C ýï™j‚ m,ÌìqI€¼ºE?ºF^ò“ß;âDí4F> õ N¼ aÀ¶ܰбŽÂ¬Õµï~[‹VÜAéíù¿!‘ 4`‚¶`-ÛÝwúÎ:wøqî@jñNàwPE-Ì,vüž¿e?{Ú'^uŸJý"ToüQcñeŸ2^ò —1æµúx‹D~óAýÄä õ^ôOO=êÚùŠ|~õ=)xÔÓ£>Þ¶‡½P[O‘×ëþ÷À¾My?ß ÿøÈß<ñ%¢Š—:ÿùоô§O}Cyda`…ö·þÏýî{ÿûà¿øÇOþò›ÿüèO¿ú×Ïþö»ßü±Ø6m»üúÛ¿ñˈñïÏÿþ#6ÿ±þ7€Èiòg`ôW€ ¸€v€V–€ Tø8˜èÍW}ø ‚"ˆR×—}ïw‚(˜‚*¸‚,Ø‚.ø~ñq8ƒ4HSØ[7 kµ7SŒ¹GU±p5(y7È9o¦gTzÀj=È[T€e3 dV„w„ ‘„B„5åZC¥X)Ð\KXU±à[Vx…èi˜eC •guªGS®`<ö p\Q¥xx†Ù†… ¡…´f]Ø¥]fm@E þn&@ ˜  ç\Ð%]ÞUW†xSm0£ÐqsWð%_ô`R我¥X‹Øˆf”Ƈ}˜†S·†¥‹B’Ï3U”mp”R@y9‰e;i=©vÿ¨ÍT}åfCp˜@ såŽf‡v)†æSxƒwo9P ¤w0Sey–sYU˜•¶µ•ÁZµƒMu sUn@ :5„€Ù‘®y°˜•¬0fp Áø˜P'˜qeDTŸ‰yµ  ¢P ©™ÞÆ™A˜¨Ùš™ž7™®9›Ù›®'›´™›¦šÁšºù›ØÀ9œ°Å›ià›Ç…Be˜pè–@(TŽIœÃg›½GÊ™œTÕ„‰þè3 Q(TSxšÄiœÈU× Så…[8SaHTe(5Ež¸ [ç‡Hå†_hŸ<…“ð9Sò©„ŠÈˆŽ¨S‚˜]h–rÕe¤p­* V„hˆm€¢ Ð\Z¡Jk˜ó`XŠü‰ÿ%9S§8 è_“HWΖSý%‰ÙŸþIÅg>tÔ˜S0‹)Æ”t L 7ypb7P‹Å•arÎ褷¥Š•ŒDÖ‹=ÖŒQitŠådÀÈ]¹È£½è¥P&’:E¦™©6úŸè‰¦çàˆ t§§Ñ&^3©pô8i©š¶§4iŽ—–iþ¸HSn*¨oÖ–9ei‰úVןlJk™‘>  r*§ŠZ¨ßHmÓ&©Ì£í(‘©XÕ£)*“ŠRPªi¦9Ū¸Å)‘ªv(éhá š:!y©5•§ë¬GGp! ¬Šµ’5U’'y”ÊŠž§÷¬7¹‡´Š£ñiŠE•V™yÿ q !½  @IS- ¥Pz®HF¥;tCwo[š‰"—”N×ZDi”ŽÆtJ©¨à¦¯õz•o©Öª:*{‰–  3`h㊞`©X9@¡ k‹d¦Xq)x!Y—w™—d·–i7–zi–²Š×–oy’‰Çþ–`F…6Jq€ó©€‹ÉSÌyTˆùSѹ¦3k5ë•y™™³UW« 5È7š¥)žF›š?ëåù´TkƒQ‹ƒA[µZ›SH»µ^ëxW‹„Yûµ_Ûµd{¶ƒ¶Y8¶A•³Ü霌Dž?XŸ@ÅÓªÈ׳Èg¶M¥ë …cèSÞ™°M ªJ·žõÇ·H¥žÍÙž„ëS›Uh€_ÕqZ‡¸7õžÉǸG…Ÿ{z\¨¹oÛ’Ss NÅŸ{«¶h 8£'ú -  h  ¬%oº{ª+úˆ²û¢•¸U‡ç•0 ‘¿ˆ†¼I ‘ŠÕ¡*¢¤¨¦( ©þhzpA©Xj¡øu]Z¢.Z£ëºÛhRæ‹OŒ7p L0¬ ¶ a3uñ«©R0cú‹e’á%¥Læ«íÚ£6º†¦[¥Bv¥3¯Ò(¦Õ5Y´lŠ¥®OZb'¤êû¥Žº¸æû‘Ö9•vŽ™–§ê¦ ö ¤ðcø{¨%<¨Š^|j¼=ÃⵈÞŨè¹àæ§È:S0ÌR d@kÂgІ¨=,jÚº2ª £ø;S±€ZCp\§šªSܪþ»UjøÅÅ=§f$ « ¬lŸÚª9giªJÄm@ 0ðoš§º:k3%« Å5%­þR€Â3e† †plRÀ¬»æ¬îÆ’¢[û꿷JkApŒðÇ{èù’Æ ¨iV“Ž&5è™f­ Š•Ä6 ÈRÀºÇW«â寇վ!¿lf·@SC)‡ø:¯M·”6 oI¥Þ ®âêkÚÊ3e&YS°<Ê£üÀîzÁÐÈ¥S¹ËšLSµ@Œ®BÚÌV°ÂçʻֲiG»š€<'sVÀW¬v°iIÎ*KZðV¼ Û° ÏÊ£j™²nIÏÏ d lÝ<ÀX*ÁFÁÜÀÜLW@JZL å-Þë*¿°X)@]` Ç›ÖVÝÓ¿ÜÁeêÄ ØóWS0ÌÙV§KÈö¦†Z åÃúÅ6ÄùˆÌŒ†«jÝ’@|àR0ÄchÄH\þ©Lœi>j§ži… S~  igzí§÷¨à5%àÕØß2+ƒdŒÆ6|ÇŠµÅpÜÅÿxz<®Æ’yÔn‘kLª£ªl?~Ís\ÇÈ]àrªãaMkw\gzghWȪà]´ªK.©Onå|œÕ½È*™ÉÎ|Ê®È45ÉìÆæÍýàÎÉ1‰§Å“þW~Ê{îæçG)ʾ6¥ èzšÊt¹ÿ†Ê·Ð@ @P·<ß•(`x’r®Ê}ãi.ÇÌËûjÃ-Pt·ÀÕ÷Z•ùJ¯¾Œ©æjêÐü”«”Nù®©w×í*ëÎ8Í ê`½tÚ¬ÞlÃÞÜ’rŠÁS:S~  ª6šJ°Ð5UëÿèëÅŽ•hþß4¥Ï(ë²r ÚÔ;gïl²ñ,²ól‰#úíR0Ð]–éxëƒíkëîí± ²ÚNÄüÕЫ¡žv+«ºÿÖï;Svú.ÐôþÚð{ ³×Ž€ÔCÅÑUÅñFåÑPçñÉ§ÔžŽŽíTkÒEËÓþñU»ÒN›Ó>­ò2íÖ« ×2œ1ó:ýé:_Ó"¥ °ôB?ôD_ôFôHŸôJ¿ôLßôNÿôPõR?õT_õMo4/p\ßõ^ÿõ`öb?öd_öföhŸöj¿ölßönÿöp¿ö5÷t_÷v÷xŸ÷z¿÷|ß÷~ÿ÷€ø;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_t_3.gif000066400000000000000000000150221343257752000272560ustar00rootroot00000000000000GIF89a]³çŒ‚„LBDìÂÄ”JLTÄ‚„$"$lZ\Ä¢¤œfd¬†|$T><ܲ´´fddNDôâä<2,|fd¼–„ Ä–ŒŒvttÔ¦”TJLäÚÜ„”^\´Ž|D:4ÄšŒ4&$|^Tܺ¼¤’ŒŒ&$dVTüòôœzlÔªœ\F<$¼vt„nlÌžŒœ24 œ‚„ôÆÄ”NLtbdŒnd„f\¼žœ„ ¼’„TB4,&$\NL¤JLìÚܼšœĆ„ܶ´ôæäÄžŒÜ¾¼üöô„ ŒÜ®œÄŽŒôîì„ä¾¼üþüÌžœÌ–”Ô¦¤Œ”&$Ô®¬œ><¤†„¬†„dNL<24¼–Œ´Ž„D:<\FD$Ìž” ŒnlTBDtZ\,"$”vt\JLTFDt^\4*,lVT„jdD64L><ÿÿþ!ùÎ,]³þY H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«55hÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û´œpt¬®Ý»xóêÝË·¯ß¿€ L¸°áÈN¥An“ #KžL¹²å˘3kÞ̹³çÏ C‹Mšó±ÆM<.ͺµë×°cËž]ú´cÚ¸gÏs‡ œ ïîý;xäÚYXäJ¹ŒäžN¶íÔ««k½ Šƒ=FšþÜ‚Üý{øñÇ# X=ÀÈ´lŸOôu¦ªëëÏLfFåþ•!ÙÍ@F„7Äq¤‚œÇÀñ‹0ïF.p(Ü…jÙaô‡-þ1èà~(VvßRù¥è"dÍ“@%“Å8ãdñE*ÒɱK A`‘ÊÇ €d˜pRÉ @Ì`3a<å”U3Ÿ ` 2Oùâ˜+*Õâ˜(Î0&dÜL‰j²éf‰9ÀAÜ’Àx. ðä!•ÍÊ“²@&Ë„ŠhÄ8\0¢ùb™I))Š_È’I’eºé“’1!˜0ºÇLIc•!+dµBF¬¼ªziŠ”"eé¯û ðKeÆ‚*™u8i ¥* Ù‰ ðE{‰qh¶ÛqÀ'”ÕI,}Á5ì¸ÔÝÒ„_|r§ê²ë.§â^-A$ò žÒ‘Ê{|rŒ€ì"å.í@Ù®ûïÀÁûO¾‡Û ¬Ç±¹ä‚@ÎÉ/=±ÃûT<Žb f\ÉLÂE9ýø’Vß“í‡Gz Óªí¢°Oþü.šÏÓõ’°ªþ‘‘1k®ÇYý¨ûí‘ÉQîà¾n}€Ìu‚@iÕ©{Rú^Ó"ÈAëˆÍLR»ÝÕêT æ9oVì  Y÷ÁJ‘m…0×sòºÚX-Ö oÈCr®‡þ@DÑ qRà 7C¼IÈDØ$Ñ&Kl¢k“CseîŠXÌ¢·ÈÅ.z1‹›K ÛGÆ2šñŒhL£×(8ÂýpŠptb3¶C¹€SUƒLîÂͤ°±ävšá¥=±&QÌfi™äÂQžÐ-Tš?ˆ6Œ¬Ž,r1«’&‰\hâýbC¤±äv2©0^5Í@BÒ>9“PFÒ>øå+G£Jí°ò8Æ@„"]#cÌrŽG«ã"Ÿ„ˆ`ÁîCÊ<Ó HÉ C0êð¡ˆNÇé•e°©Mn^3›ÛTÖòš÷¼'í,g˜!g:•gÂvêhÁþ€”¥ˆTC3î9€û†¶Nç嬙ÏtˆDD¢È8`QžD¦Ú”y‚ ã3zÿEæ_{À‚“´Ä%/ih}©H!£Ò‘ ƒS”2˜¥¶20Õ`\À  ` "D.„¦¸ÉØN½'Ó‹f=[êÒ—"3[–2±%JW+«rô3… ÍÄ™F=JY}«dÔjÔ 0PQÜ‚fØÚ>¸ºu ÌL…"8# dÈAYo}ß“¸J+«š5F€”p¬Ñ7ú±__ýeªExì@ÐUúPšË³¬ºlf‡Và^ÅŒgA„ÒZ5¬ ¼þÃ_ù ™=$ã ¤E-d5;MÈ<ô˜Žèn9û™c$b2_ Ä ¼.m2É] ØÂϺÏíuïj×À& wØç“×Vmc ¬‡ù­Ê¸¡Óe¾š ¼n†x4FĶû°ˆM ­Ã”Œ~÷°Ýo÷¥LUØÁdZÞÈx¹9O»Ôô`á…ndŠ‘ gÁmí¯Ä(£\66¾·|åWÁð*Ï@’H8’aœ/ø hD•Öž(ã§Ç4VV Ù‰Âw*kÇ“²q†|ÂM pà—€VAŒ,-32_Ø…€˜ŒÓÆ? šo9 ߨ]ꎬa†þq¨ó©yu„4¤DOGQ*B±qt Vcr&È…ÆÏ\û…0ó¬ç9»®Î„Nôfö ­*úÑaôK iEKÚ%”®4¡/Ý’Lk:Žœf‰§/ƒæï‘‘’ÝLz!N°Åùw¡^ɨõH]N2²¹ÅhS-©Mvw±Vɬ)CJ]ž×–á5à9‚¹’ו‰%¬ ];Dã²”Ù½dEE£@ê ˜fÍ{uì”Øîx ý¦“ó †ä¢BAp÷( yš3Ý MOo+³eÀ!`„$D¡pÆ*Ÿ¼ÃÕ+GHáµõ7Àdo?@ m-¨=€Phv“¡%B8DþMíÞ…PLQ5)dxêS *‘qPa{S’Jõ¤_½ $¼' $-©Iýò9“Fšì¶ èÜkÆÁTó¢‚ ©Jå^‚ãTB&åS]ì´¿²B2±uŒ,‚A¤/ôâH°¥+£¾®Øœ[F½LÔså¾í¦Ñîb-Y5ì×êÚ„àaÁ®ur—œx!\Õ®z [= Æœ¬5W;ÚÅ‹ÓíÿùŸ€Zõªƒ×‰ó­ÖöÐ@p2l¨›íc•wÛÜvu¸–?¸È·Žâ«µw2Þ…Ì G¤JxÇÕîro?Ì>âÝ­Õº–Û©e-lÕ}hÌW~ØeQ§èŽW„W“ÅyÓþ‹]C†ø’wîÊ’ë‰ø¿;-i……fD¿ÞïrÏOb·3m cÓ&0Õ÷£ü70 fA,€/¥t # ¶zÓaKõaÃE‘Ñ &Fr\‡e7&f÷eüuƒðµJö!˜cWƒd’Ñoÿp33S3W×bAƒ4# *X^bƒ2H+PðoaÐ Q‚ö!Z†+õäemf86f¿&;äwÃF¥Fo–WXvÐ Äòj†\A4 «pÌpRŸf‡g=ÖCÅ ¹Ox†˜…&1…rDtXvx‡=”‡$±‡|xC~8€ˆ14ˆþ"Qˆ†¸BˆŠx5UH[Apj’«zŠöK^¸;ix>kˆmAàHÖ$‰·V‰°¡kÙ6E¿äk*Ò‰÷ó‰ºTl)vl¦.¢±l©ØÎn[³Y¶øÒF( ÇP’ÈJ½¤K»4ß6h¹¸1€$Yâ'Ãø–Rq:âMùÆqÎäqÊ#q.(y‘¡øNûF,8q¾õp×[ WpÉÖpíHp²Žã¨]sq% wPߨPÜrÒqîóÜ•/vueõqCcŽéP#×è–RsX‡sU‡;—ABs³R6§rÄ¥s<‡$J2tA—’HWtÊrt#5þx„þ’.E^O—TÊaO²‘WWRY—l>)u¨ „¿àˆ  ç‹u“Ê‚‘@i†UÕŠ?¤vƒ×vgUÇ—vz'Y `˜q|’Aw_Cw.ÙŒw×@¢v]}}Ýx¯·vgUQ[9}ˆB ¹ÀMÇ 4‹”Žf™w{–…lj?Dy¼uyÃTZBoAÀ˜­µY˜GÉ*®â˜•µ™²'z›ç™yz©÷Y£õ–¬‡[©[ÞW™éø‹ÊâZ¡)AÃ{Á@i9™¢ÉOªçš­ö[ÂèŠôBÖÇ\°)—†bŒÁ‡eÛ~byÇ}η@Éç|i™^ÕÉ}Éþ)|×ç”b·}z9\Îù|È)XAÀ MPAP„à~M¹oÔÙ|nWœãÕH‘ÂIAR³€A ­‰ ù%1#öœÍ S²#€AðØ Ýæ\Qi€85“ H EØŸH”1Š~Í8_ø¡A þÔŸ© ^¨¡ý§,üéŸA@VY{DÈ„H¢áØ‚[6‚7z‚Ï™ƒÇ£/(378ƒ;h¤=(¤#T¤1¸e?˜ A8„2dše[–„Ã…£Bä:Êe³Â FvÀ€5¨¤_õ£a&4@fÁ †°‰¢‘…´a§£±…Ä‚§®–aqZ{q$†dh†þ‹(<ùIC°xCmø†qˆÙX¨ô¨©’J@”º–z©ô“©ÃТ:ª¤Zª¦zª¨šªªºª¬jªµ@ Ъ²:«´Z«¶J±j«ºº«¼jªŽp¨DôEÂZ9h€0¬ÈŠE@‚ÀÉú¬¬X¨`m@T Ój³€­Y`Û®<  m † Z ®! Tà €  s £À®ö›¯B (:p ÷*y  ¬`O  ° õ° klpT k°®¬@ °°°÷êTO °€¨Ð°$ûÀ;± ¤`þ$ W@Q€¤@ -0²%›³ñ T ­@±á ¤€³ ˳›P P= :Û´a:ð 1 °Ð9;†`  à´^++ q C›³­@G;PK_Û¶1 ±  bË £ O ³Z0 ¶ªp·nû· ¡šÀª ·¬à ªM‹¸Lkª€­]¸’;µe€­X« vP {Û´Z`·P‹›­“;¹£P¹T0ŠkØš¶Më TÀµ¬`¡«­£ë¶¥k¹Š+†³^‹°0·±;»µûµ·{º¹;QжLK²‹­´;¼9[¼¨ ½Ѽ¢þK½ +½Ç‹½a½Ï˽⪽à[½Â;¾Û*¾æË¼å›¾U¾ì;Þû¾Sá¾òÛ½ë[¿LA¿ø¼Î»¿K¡¿þ¿þ{<À<ÀCQÀ|Àü ÜÀ ÜÀ;ñÀÁ||Á|Á3‘Á¼Á%»’0Â$\Â&|Â(œÂ*¼Â,ÜÂ&\&@ .\Ã6ÌÂ0!Â7¼Ã.ÜØj <ÄB<Ä! ÐzÄŠS!€ÄFÌĈ³hÅÏZÄàXœÅZ¼Å\ÜÅ^üÅ`Æb<Æd\ÆfŒÅSN|ÅgÜÆnüÆpÇ^œÆV,Çv|ÇxœÇcLÇ/aÄzüÇþ€Ès¬ÆáÇ‚|ȈœÈYÌÇ.aÈŠüȼD޼ŽÉ–|ÉeÌÈ-QɘÜɬÉÁÉž<Êž Ê+!ʤœÊylÊʪüʈÌÊ)áʰ\Ëg,ËA˶¼ËvŒË'¡ËgÌÆlœÅÃÌË‚ìËÌÆ¼ÌfŒÌ%¡Ìe,ÌX,ÍÌÈήÌ+ÀfÆ;ð¿ð ?°yœ>Àd ÌàXlÎè¬ÎììÃlppYÌ Y|pÐÍ£|Í#áÊîœÎë<Í_LÍÄÜÅ Ïí|ÎÏlLÏöŒÅøŒÅúÌϤìÏ‘ÍXüDÐ _lp ¾à ‘€Ç°þ¸` f0É€Å)½Ò-ýÒò¬ÅÌ0í üœÝÏ“¼ÉŬÅ1ÍÒ.MÐ^lÐF½ÅC=Ó0­ÒDMÓÃ|Ó9½Ó=}Ñ?ÊA}ÐXLÏNIÅ Ð= ÅtÐÓ<pU` Xl = zÀ*0Í~ äìd]Ü×]\Ì)0Ñ“)Ó‡ ‘ WŒ D !ÀÏ ÖlíÖòLÙmýÖq=×u-ϋԮ Ø[Œ2o]pP#@ÍŒٖMÚ[ ÛZ<̃Ņ}ØN ‰ýÙNàØ-Ù®ÖkÙN×rM×ÓÌÛ\Ú ¡Ñ[ N°wþ`Ùb0NP  Å PÓì/ðŽPÖN Žcm ÓÌ  =XüD°Åð-ߥ­Å¦ ÝìàNðàÖPâ X¼^pP+ÐÝßÞ ÞâMÞæÝè-ÏÌ@à[ÌÜáÊõ=ßIí=àÝ¡à¬ýàî¾Å)>ÛYœßûÝßÿàŽáŽà nââ= áå}ÞéáË}Õáܾp —€Å˜ðÕ¸ u ~¼×;X|¸°Õ©0Í®dÐÎt° ià×N_æcþáN‘ÐÕgàÞcÓœÝ\œR0ÍRNåòœçþU~åN`Y.ÏtžáB®}æbNæÅœR^â{ŽÅSîå`žè’޿ЮÅlîæp.炎ÐwþèNé .êVŽåsþž٠+pÐüœ½` ÍpX ƒîÛ=Í}€Å±‡ÔAm ;À°ÅÂNìj® K` wàwp½  ÓlÙNàŽ ¼¢ëÝëò¼ëÜþëÓÞÅ©^Ç`|ìÅ^ÓYÜ »îèN¾íÆ>ìçÞâðþáÊÎìÎíÒ.ÏÔníØ+Úî¼þïÏׇîƒLî\œÕÅÍi –Ý âÅgç®ç½pë®ðð Íñè®ÅK° bà<þ K ÕXœ6¦Q^ñêñOèk<ÆÿáŒéìÎçuîñ[œó5ï!?ò%ò:¿ò-ÿò2ó¢~ñ ÆãžÎä6ŸÒ#]Ò~ðÝ@XLÞ ìG^ólœ S`¦¼ðX¬ölïöp?ôã }à6ð mþáGD Ì_ÿa?Í…øãíe¿g¯ðN0õ” ùrßöo_ëÅtPø$nÔ„öbï•O÷q¿ö–_÷A]Òy¿÷}_óøƒø /û†údoöjnó… ù?,@í¡.1àĬÖzPm 7pþÀ¸]Ìlì a^dNýÖŸ Ø?Ío ¸®Ó(ï“Àj©p­ ÉÑ“ÍþÊÿÖÍÿüÑð} ùÚýd ¿ÀÆGP¡ÎNœÊ, T¨N©^ÅšUëÖ VQzåtèR²eÍ–mVíZ¶mŸ‚MéèØ³u¦åjjS\áÊ,î_µtíFÌ”p`Ʊvl81Y¼[[z»ØñfªKþžZieÎ¥MǪ9,hÑGIŸ†[ö\¢­m»V=[÷o¿æ\xáÚ·çžÜ´oÛÀ•?‡ÎÜ8bçЭs–.ºúuî³³O¯»½ûx¶ß'‹'Ÿ¾±yðh‘«‡/¶8xôñíoߺþýû쩘"@$°@D0Ad°A ‚ùòûB /Ä0C ”¦>1DG$±DOD1EWdqD Cû°Eg¤±FM|1Gwä±G2H!‡$²H#D2I%—d²I'Ÿ„2J)§¤²J+¯Ä2K-·ä²K/¿3L1Ç$³L3ÏD3M5×d³M7ß„3N9礳N;Í ;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_t_4.gif000066400000000000000000000334661343257752000272730ustar00rootroot00000000000000GIF89a#•甆„LB<äÂĤBDtÄ¢¤$"$lfdÄ‚„Œjdl"lRL´bdĺ´ôâä´’„$<2,\NLŒvtÄ–Œ„&$ìÒÔ Ô¦”|vtŒ2,¤–”\F<¤ŠŒÌžŒTB<´Ž|¼’„D2,”"$üÒÔ|^TäÊÌdNDäÚÜÜ¢”dJDŒ„f\L:4ܪœ¬Z\tZT¤~tì¾¼”*, ¤JL„,"´jlôêì”vlÔ¢¤œ24\JL|f\䲤¬†|üÎÌœ~|„jl亼 <.,¼z|üúü”rd,ÌšœTF<ÄŠŒdRTŒt^T”ŽŒìÂÄÌ¢””ndT>4,&$äÆÄ¤FDĆ„Œnd´fdôæäìÖÔܶ´ÄžŒÜ¾¼¼vtüöô¼žœ”&$äÎÌäÞ܌ܮœ¬^\”., ¤NL„´nlôîìÔ¦¤œ64„nlä¾¼¼~|üþüÌžœÄŽŒŒ´–”¤†„Ô®¬„ œ><¬ŽŒLBD<24Ô¦œ\FD|bdD:<œzt„jd $Ìž”TBD´Ž„dNLtZ\,"$”vt|fd”rlTFDt^\lVT¬VT4*,¼–ŒD64L><ÿÿþ!ùß,#•þq H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û±†ÈK·®Ý»xóêÝË·¯ß¿€ vð¶°a“ªY̸±ãÇ#KžL¹²å˘3kÎ €ÃáÏ ; 8¢¥´éÓ¨S«^ͺµë×°cËžM{vçиsS]»÷j¾ƒ NxíÛº“+WÈ›¸lãÎU˜ƒ¥PΩSŽzpäËÃþ‹oÎݵ÷ò¥«j­OvôÒ‰ƒO_wsUJdñÁ1BKN¦qR‡ªÄ!Ë2”†Ÿ~ü¥÷`Ô¡ŠÚ¥WA`€AH¤—‚,˜° Ci"D‰, ¤æ]­”ÆÍ`,‚$šˆ¢‚ùí×…©ý „"ˆ#ƒ;ð`„VÈ£jÈ¡‡ ŠhÚ|õUùYs„BpDC`ThAE*¡eA”–å–]¦Æ 7„¡„…S–G¡„FéuƒÂJ¸§1T Â**Ø Û”…HdPG¥j(¢Z¬É¥—Kž¦ ˜b’iæ–ifzf›¾çœ.ygžþ{öùg Szfå­‡5÷7¥¹!K¯²0 ZÐ0âi»›Þ±:ø@'²0ë,…Í”6B‹ZÈbvÒiÇDZ§ePEiÚr[Z²ZøšžvÆù*,Æ¢†®ºJûì’Ñ–ÖlzÕjqm­¸üVs­°kZ$X&žV°’4Œ&÷Çð…·jÜ3Ý€AÉözgi9„ÁÇvZpì1ÈZ<Œòy'¼pæ¹<]zgìÅ9W °À@«Õ3(¤A'TQAiñžF´ŠöjLnÔ;{ª!—V ¶>p’*x§ÊÕ¥=ÝjG'½tÓ¦™}T¿=µ¾ÓVž­Aç]þ–aL¢Š–ø[ÆZ$E‡kœYj–~žžpJÀ§`LR§¯ê9¹Ý–è061—CçF,”†Á †a\矫Ù÷ß·jíà…ž8©®7;ß yi•_žy¬Rß­÷ñcÝgĘ”q‚8(cÚ8G|(¬ÊòÍ?Oáƒ|ÔÑðËgDhHDÃv[à &†N~–¦3hkœûð‹  ÷Î[W…¢7={Ú ÷Œ†ð¯|tBŸúØ'7ã!ï‚^!z`Ÿz°‚ð¡Gh –‡ƒLá=(Bº0*&ä UHCù°o/Ì!TbXÃúð‡þ¬i¡‡ˆ:Ð HL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠV@ˆÈťȂ]` £ÇHÆ2šñŒhL£×ÈF2" ‹p< HÇ:ÒPˆqÌãNæhÇ>ú1:xÔ£ mÂÇ?ò¶Áá y“B"ò‘T‘"II™82’˜|d +ÉÉ”\2“ ôã&;IJ’hðE1šQz>Pà ¡`ÀÀŒS¢¥(”¸Î(KÉËhðQ‘šTŸú‡4£0Ž¥•Ëfúf—½Œ¦Fæ(®ô\–Ó‚ŒS.gzó8“”¦8ECÓ”ìd7£Ð„fv¡uìcߌçk 9ÎzFDƒ]þûZØî%‹lnÓjX“§@¥N{t7å4êP º{ó˜É, ëôºZôgÍhE4x¿üÁ|§A‚1ø%ìï}ñ»èEé©Ñ–ä“«ÑÁ¯TJÓ·Ô¥8=LO„f  ¥ªiMYšSîtzUCv$Tšµ¨=jS§jS¨ZU§ ¥ªVaóÔ«ŽSª[mjW½*M°†u¨7%kKÍzV•ŽU­¼dk[-úV¸’R®sh]íÊI¼æ5ž{å+%ýúWoV°‹Ô >„‰?l4Q6¤£ÙÒ²7Ò*eD¬WÆr–Cªla…sXÄ R±”øÓ–᧬¡Q¦bþ§–‰)Ú: R’¢按Lãh U£}fZM+NÅök8.¶æ5Ón𯹩©f¶üiæ÷;Ã%n4 Â%ÙÌ++Êà©…s¢ìbL2Îw¯+\í®5«v£“ÛP3¶€*ˆlZÈ'ظIݲ]“½Øu¯QáÛ]ß¾ÎqZ˜hE¬ÐÔ硽Íì Ng”»—£Óö˜@-ð/¥öŸ:ª¿ ´¤êQ …‹“] w’°Ü‘éŠåÓbWÆÃééOƒ:ãöÚ¸ž8+•ÊÔ÷¦´?ÎaüG$'Ù…KfrüäFYÊu¤r•/hD,zùË`³˜Çf-n9š_l£þš×Ìæ6»ùÍj|ã™ãšU,TËsÎÛ•íüC<çh~¡ìT¸JÄfk ªŸÿ°@·FÐèx›I€fheô‹ë|œG{:þ™A7f³kLuÑš¶’£ƒøé{õæ3˜ '¼qê§Z‡`U,e©ž5hI›Ue… ÆJHŸFÿ… 7¦%TTßš>`5Ó ôd`ÙÒ ˜¹õÙ”ºÑ¯Ø´¢È¯ù—Xmýl(sú5>`Vu)M/˜I7¾J6l0n׈»Ùä.·•Ïíô"A½[’yÓ o¬S6²Xšl¸1S|ë{`M·¾Œ3_:éwŸÅs5lŽ Ùp"v¸þÁ‡Þ…ÁÀº£Óé ¼lRÎåÆN¨AèPÂÔãùÈùÝšW’´Rñ’HüQ5A0SG9j$MéNÕÜE—®µÎó¸g;®a‡N´Ô§Ǫó¹†ÎæzhȃF:–ÝÈaû•xþõ\¦]í†ñzÛSøv¸ŒíseÝí޹罃{çûZüþ÷ æ[ðªÆ;&•ŽžBgÝì‡G|}HÓé±±4¦ÁyÉGñ¤gwóœèÌ\6¥bà=o¹Þ¤ ã]kYÓºÏg½rÀêY^‡¶AJ 6†ý²b/‰Hò™’(ûëØ {6ËV}îuoУÂí¦îþ…mafœBܦT%'m{ç·œòv½[sﮞúbk?'~.vÏ…ï.ðÍ·Ð!Ëþ³Ao³Ñ~œÈVþpsR fp¡Ó3Åãë…p  '}x<ò×_ZPq­rq¨mâ5¨Í0‚(o²Áq²rî7}¸vµ}(7a/g+ÇPÆ<-÷€9“ÓJ0(Ð =èrŒƒƒ±qzÏòt¥qs8ƒAÃ{'fRÿÃaÞC>ÆAt¾ut\h~à#>úÂ'’_˜bZ8€“–aPÈ Q‡{TX…ÖS 7WW÷xS8‡V‡<åS@Ux>ô~|¨dwFþj’TKµRˆèL„XˆXAy‚˜2‰l!‰“¨K•h‰B㇙hGȉT‰Ÿèc¢mž(PŽ7ˆ†K¡xŠ0”ŠßAG˜7šJ¯‹OázñÑCNÈŠ8—I¹¨‹MÁ‹YCCµç³†‹›HŒÉ“нtÌ× ¸|¾V$ŒåX%Y³ñ|þÑqZ «ÑÁˆÄšÅl‹×ŒÎ$Ç[Ù‡~æwòH!©åZ¬¥Z°¥~ *crp¨±°Ng uIÃØŽIÑô§Ö5ÿ§,Ôb-Ée-Ø'˜.Á2,­q ¦Æ U°#©Iì¨”Š Xh7p׈þ92Ó'À ªà F`¨w%i’\ÁÚDq,È’N3”6.Xi£4­¡ eP ²ppÇŒ>™ïQ7ˆ`>¸$[¹„ö’²qz#@;†CA©AŽZ …Râ{}ù©Ÿgq•¦}¨â¶u|¥1*hâ:Ö&ßÖaòéÙ‹þr‘†„@ùO €­]Z,àR‰‘Lå.Y¢Y3’ øž+J(1 ø2§1^,ã€èU3ç|1‰0 ãgã"wèžAº7©8Aé_Çx_å€lÃ¥¯ŽK“]:¥áƒVz¥ÏXƒð˜•±³• 6£·Ó¡¦’ra9j‚C8e©qPBlyH*ʦþ,—(–…yY—¥b⧠ד=ˆÚa±y~™)€)˜—˜!s˜$I¨ñ·œ J‘©“É¥ê)Æa‚ ¤žêfå™<–W9P¥Úª_‘še´š‹¨z®YËmi«'Éœ‘4¨ÂŠòI¬'ÄªÇ Éª¬€Ä¬ÍªÐ¡ÓšÑY­’t­†ø¬D©¡ª3f¬Ü Ù:©m¸ãÙcäZ®q®°±žáÚžÖ®îÊðúö¹øÉ®Òz¯0V ÓJ‚ È'!«D°Î§ àØ ê¯[~Ê)ã'å~Ý!ú%#J&Édö±!°ÿõpC7ÖD©þ£Är¢"û¯$[¨©*é’h³xPz; ±3[œÅQ”P£²ÝÙI©e jZ¯2´žT³ôx`»Ó;¿s´¬!–dy8QH¯6²P;ë)BÇ@dyöÖ—Ò󗚇@¶Åè­Ò£®Z‡vO ·%±g³§­`«·«d${æÑ«“ø·€Ûùª­’·‰‹ë·Žû¸¾$·Œ{d“K¹ät¹¢”¹š»‘ËàÚâêVžû¹ºÎñ®±®Nuº¨{^÷zs;òJº^{g°»e¹µ{”±¯¯Ñ¯¯Ë»BšŠzKÓ é$|Ì Ħ°°á¨Ž¦þk¼CVZÞÑ}ºUp˲á£zµ»Ø{OYº-©‘h›È‚ý¶~¬A¾²i¾ç¸©ˆ¤7»€æd2Fú€¤ù }´JWö{¿ŠÛ˜õ%¦Ý%‚zÙ·Z´°1•!‡À=Vsê•qêr;ØP9øƒhÛ¿ø§6—»åkÁ®šŠŒŠ—v—^htiÂó›®Nw9œZÁ(¬ªëuKºw›i9¼G¾Ë¹ÏqÀAŒUSb¸î§Äì…¸÷»ÃÄêÄç ÅÌ)ÅØKÅÆiÅÆ‹ÅÁ©Å¼Ëżéű Ægh°QºngÄG\d̬ۮ[šj¼Æ1»ôÙjÃq»¬‘zß$ƨkÇþxì Ã!¼®A¼rLÇ8VÉû{Ô 6’"Á#œõ¼ŒÜðËëˆsŒÈÚ[(ÌT±÷’¡Ý‹[Þw~§’~+¿«A¿ëˆÈÔJ2Š²Ç¦¾ .ãÒ*‰£ˆ¢‡ìÊ5VúÛ2.y¤ï”¤ è¿ç0M:½fê?«É¾üË Œ_ 3 ‚^³_÷‚±!ÁÃÛ´®¸ÉtŒÁžCQ¦•.7§[ÙÁI8=Tk»zú„¨ÐÍ3V+¼a‰z—+ìÂøSbŠÊÂÞƒ®MGÂP‡˜álÏ÷<Ä™ÔÃ{üÃõ¬ÐËÐD°>R?þ§†‰JÐnhÃn XDÃ0ÝÔÝÇÛÂÝw2 ¸-F×ÉÑguÞz[ÞsçÞp ßm'ßaKß³ÐZeßP+,@à>à^à~àžà >àd° þàá~àü´gžáÔá ágã=Ü?QP0 ">g/à~P'~f¹ð ºð ±ÐâU¦ %âf@ãIæ Pp¸P ã?F¿@ ¸à PðBîb´° A ¿  K.`ˆ 0«pSî^ c0*ˆ°åÄÕRP©p dŽXP°` k.X£À‘ Pp snWþ< šðç€NP0 {®VžÐ ˆÞ MÐÀè Pè‚P  N\’N镎X—žéš>éœéžþévµé¢W¤^êduê¨~Uª¾êPÕꮞS°ë.5ë´®Q¶~ë•ëºnO¼Þëf‚1ìÄ®àPìʾìrAÀîIбÒ>íÔ^íÖn®ÐøÓÏNÜ<}Çt…¹Ýîí}FwË,C46î'AŠ5 žt—îê¾·å´¼ ޲ÕJÖß!Ë¿MòÕP"DzÈhjõ. ø^Éûž|þîÕOB!X .ÙnÏ|cmŸò±e¢8v}¡äÇ*v#ײ(‚’¡Òyþñ¡‚Ê©‚±_A ~³"˜ͺ£.Ë45ŠØì[/Fk7¦½/ ³ÙBË*p7?Ø(ÛÐB5mAñ>Ó¤=[ÙL 19[Aþ¦3̵;õ”Ù/sõ—“õ$8ó¾<4,¸´¤M´Ý¡ôøâöbƒ_s»´ƒ]Íp?7§]ö!¾å|“rcɧ\{Ûç\µB®’ÛÄÃ9å\Q3z_;H øwŠƒ¼Sø|ø°²94·÷S®Î Ýgö®\uí®I7ôô¦ÄпÁ/ü"áûNuüÈo®ßþ^ßœ¿ä]FfÔ_ýÖýA`fÍiöáÞÿýàFr¶ýïúü_Çûœlþ|†þã¬þvÆþíþXÿ+-ÿRFÿEmÿ1Kþ1ýØÿÿDà@‚ D˜PáB„à‚QâDŠ-^ĘQãFŽ=~RäH’%MžD™R¥,-]¾„SæLš5mÞÄ™SçN—TþTèP¢EEšT¢€#Zœ>…UêTªU­^ÅšUëV®ZpPVìX²eÍžE‹‘iW¶mݾ…ëökZºuíÞÅ›WìÚ¸}ýþ|u®^Â… FŒ—o`ÆwœXòdÊ•-\üXófΑ/þZôÝÌœ1ýØóhÖ­]¿N)€Úµm߯[÷nÞ½©¼±à[øpâÃWÃFž\ùr\x>‡žsN#'Ñ­_‡ –ùvîݽ§ÕÅÌwòåÍŸG?åU*MèÝ¿‡ÿ2¡"w x’Ÿ_ÿ~þb5£]ú#°@ô(TÀ¥Z„0B ûÛD ˆD‘ 7ä°Ã%"5ð°DOüì(2‰ÈSP„1Fïåň€€â”wä±G£vc"SFñ±H# )(>™è ‘„2J)!’‚Š>b€)·ärÇT~á!L1y€BŠ.ÏD³Ã)Ð` ( `¥ÍñÒ¤þ³ÎßÔÆN=÷4O>ÿ4>?%´Pï54QE_CtQGµ¬QH'¥”0I+Å4Ó³.Õ´SOâôSQGM)TROEõ#SSeµÕŠVu5ÖVa•µVRiµ5×NqÕµWØ Xa‡%¶XcE6Ye—%Öa6Zi§¥¶XC|Åv"8¢[o¿7\qÇ%·\sÏE7]u×e÷Ü*È6^\¶M­ÞÎäÒìxåÅ–^{£àß¾n‹`Çôå·_ƒS[¸±  ¡>ºÁ©†ñ-Øb˜üB8á^ý­÷âÀ$è€UÜ b‹ý9+‚[†«csõW%dᇴ¨ƒ“§8þ©C Uâe™œ²g-þ 0êPÅ+—VÖ‰ 0À $,NALXÐÁ)¢ÀD¤j%©^rŠ›#ÀX&7¸öl¤ëƒvn¹-þ Š€UÁ[ï—§ ð–¯úꬷöŠq-dž¹V?… àˆFè>¨Ð‚Š>¢V"ó ‚p sÍ9·8ŒnC ª©Ž#ŒPB #‹»Aa%úpŠ*@á ©v8b ÈŸZ8 È Žvïýw§J¿w‚‡^úÝ›¹Þuíg‡ €nÀ7|-j¿=÷¼òXýýƒ§Üå~Yen-hTê§?‹P> Áþda@zE}#h…Sda„PP%q ›,*¡6¯X° {`µà^,ô žBB§èàeK¡ÅT(AÊ*ñ“_«üÕ ®/qOÁÄòœÂC¶yrHÀDD§ Q‰ZxF7À@ƒ%TE:À%È—ƒ0ðajdÞH0.z±%‹š›x¸µ¥iÔ«–D¯ÀqrûÊáüÆŒBU8A*àF…k«!©¶À6pa S…0p• ,ƒ|>àDT‘6R…Zp¡S0©IN^²„ä #ù JGF‡yDÕåÂ0‰+ZB #(ôŒ(lm ¦C0þGKØÒ+xt§0L"•ìÃÝ2éKè ’ÄHå6¨àU À;pJ3Ÿ‚ïc ;‚‘ÓœèTçë€ÎT*r}¶‹&*_ KRÕÌÀDN (ã)ÀÐâP>Mhÿ è@½Ò4>ÔrX‘@¬rÓÔ‚5˜ ç¥R!àCÙêÀAŒLÌÀÑI0$Ô`Ø›S^S# ³¦7ͩԊh°…m´£u%ù™*1fƒê¿ö¹ÔO550OjV93Uªvʪ€ÁªVÅÚ®v5S_kZÕº•²šµRCä:WºÖÕ®wÅk^õJþ:¸õTÀN`;XÂ6'²ðk?úVÆ6¶­‰}Z;ÙÉ>²‹’,e5›VË^6Q™Ýlh£ÚYÏ ´¢Em½H[Ú@6µ¯Í—RYK)¸êÕ¶·Åmnu‹[¾Î6S€5lp…;\âÚ±¾­”ka»ÜÀ¬¹zR.s¥ç>·NÑnvÙR]ë¦ »ÚoV¸ÛÝ3}7¼ç¥ÊxÉË%óNWˆèMêzµ­âÔ×¾÷õ 6€_þö×¾,­| µ­â'Žh„L“ ØÁ)fñ` »ç~øE *¼áòäÂfxE,8cÀ ð€÷84´hD4 ™2 bD:q#791 xÒ…2äd*DÙÅ-ª¼e»¨q—ÅŒ–QG:sšÅÂöhÂÍn&ˆ¤f:ÅÀs'Ô Zä™Du4RxhBŸdÐ…F´HhFwdц4FiJOdÒ•Æô¥1MiMoÒö4£AjDšÔ„6õ©jUÓ™Õ­Nó«a¨jÕÚÖ·ž– d°\÷Ú×½vÀ¬¹´ËØÇFv²•½lf§ë8† @_j‡L;ÐVŽ´³ºX{q›ÚÏÆvk´²ÍÄ$¼ì!\ÀîÑþŒ›aå®6H¯zmv¿fÜIËÙzö³  ­hÅ÷Ò&ê4¨ U£ŽÓݾÀ±•ílC\מ0pP /eä×8¬%Ü+·Ûǽö‡-p‚_s¦Ðn–o…Ûm¨ˆc\âgµŽTrë®7hÆ­ºÍECŸ Ýè´P:Í“ç¬óŠë`';{ šîó ï|<-xƃøÚ¤n½:¬á)k@ÝËÎç”§KsëT%z·†eH} *¦én¾ê¡½|ˆ{ÔÁWö÷YŒÞ9g͸¨ü~ý#dŸ2øÂ{%‘ ]åAèJ‚T1·)ÁIÈ"jª… _ÖÇÈ;þ2„“¿%N¯ÆçOó·!º‡ÚG̰ô6dÞß/šqñ‹qø¡¡âû3±‰t©Øt§DqŠUÌzôÁ¸ÐYÃT{#ˆü»3?•ÄŸéÇìÇqûh,Ÿîw¯óiÒ€dâ ÙGæ=¾û·÷>Ò$¹6Äu_,Ðxìƒ ü)y#÷ë>¬§T$õ[¿ËعYª%\Ò%^ò%`J ,&‹Y'e §”K'|‚:ª¦kJ%‘‘·?0‚0XA¨à;ïC@‚¦Zz"qB%ñ›Á†Á¹ œŒ{ƒ(*¨ƒJ¨¡a(€B‰в¨ÔÉ(ª1* ð¨'þ)’ªìƒ!ySÈB0**Ž¢B¤ŠÁ$UXÂ'j)y¹zšÂ*´'¯@ ¤ w»ªjÃÃÜ£CÞ›6§ÊÃ<üÁ=< ;«?ÄÃ@Ä DCdDu›ÃDÄØ­I¤ÄJ´ÄKL‡€D \°NôÄO .ŸØÄÊXÄF4EÈxÄQÔ‹R<ÅVÄ DTE»`EW¤EÄIÅX¼‹Y¬Å]ô;\” ]äÅZ„E_D ` FWFb4 ; ¸Ñ¸ÅÙ8¹¢¹Ç9ÆÔJFe$ ;<ºÎÑ»oŒºº#;\¦k ­lÔF±°ÃÖýÚcžÕÃ?sÜ,tLG¥°CðC¿:2Cá[>yÔ,zþ¬G¤°C¬§¤¡FòÇy¼Å€ÜÆ>Œ;b2&¢r@§#Ç„üÇ…dHutH4(šƒ¬1„C‹l,€ÌH¢0F’¢;\oÔŠV Y¬`M•eXÍX,Ýׯû¤Pò¾B ¡u=­À„½ŠžÝŕˌ=SR>産§Î’¤­à†¥ÚŸ-ÐŒ} è,Z‚iZ§h‚AÚ²õR¶ò™­à„ð Ûtõ²í@ˆ$»uš'§è%è‚ù¥¢Ë[Ü ƒ]@ÔÔJPX‹Û]×þCøü)œ"`²I3\¨†ªÜŽ”(­È×þ}U$Ôä]X»ÕO<\p‚Wy…\Öå‡=תګäKœˆªœÍÜJÛ½][¤]^Þ¥ÞÐúW€Ü ÿ’ÞéÅ/ý¢ÞëÅÞÞHÞ¢Åî¥ óÞð}‰ç-^ш° +_ù¹0?аô­œ\x]1÷M( S1ú»\(Ó_y!„_ \ð… àx¡…U€#²î…ˆX&ƒà^I€TÀ1ˆP)»à\i3‘ˆTв®Ñ‰€1áX %A³n6{³7‹³9£áT¹³’4Vã"aã6¦Œ_“ceqh™ã;–`ƒã² ¶fóã?äsÙÞ3^^d$ß=ƈBƼx;dD¶E~Ø¿0ØeX†P¼Ì+UG HvË;Ô‚ ƒh†fø0èZµÍFæä‰p·Ý7§…ú7‘e¹{š¨iCý¨i› z¸îƒ¦#;8°TR^ÖQ0me{ìÃÊü9ÐÒáÀ¸»ÙÖ‘'¦)'Ǫ$Í:  ? S;&½§ö1;õÑÃf6ÍÅSZýáÿiÛÙŒgÇþCHï3@x¼<Ê!B‚š½-íRDugšìÃà>‡2¿¨@Óóó>åã¾T"Sèë>0çrF7‚#‰ÎGf>h£p7èü£@êÚzÖ;µ¿TÂSò™SþÓo æõ1æOf\.]é i„>(´% Ü¥^҂­هD\ÁeÒÁTç'òS@EN-H]R6e}=æ4TƒÞé¡xå4,ÂÔ9ÂÏUBÑe0¨¨‹zTšI2¤FýÂNÒ X`ž-lÀ7dkÞj¡XUîɾJÍlðd2þëºl¿žÜ»<ì0IÄÄɦl¼ÒÄÅ ñÕìáEÌæÐÆ~ËþÇöbOnDÑÞbÒJV>hÔ6DÓÆbÖþC×®bØDÕvçÈ®ìÜÖí…¸lÏ6ÑÍnÂêlßF Ú^Iâ6QÐ6KÙ–bã¾ w¬x%^ä.n冪Ҭ~ýWæ~bç® Å5¸/šŠ‡‰˜‰ùBÜ튄Õjê& ïN/‰½×© “A¸› K0Ux## [« Øõfïê´î–  ý¤¸•<­0ÙøF‹» UH @êhSª@Yppe º»Lkî9žI-…e(-0‚ ÉÙ +äQ¬Pep P† Ÿ ¨}Ó ÷TÈX=v<[Z08›#H†­H[oM *› ªþ üÖo4ì練q9ÄñöpïÃÇÈŸ2Ðà‘§­ YèZ‚µ",zW«@ѯÅð)¯Ý*)è *¸-¸„€A¸•¾¬¨¤Æ˜Û4WsÀ[ª!Ô¡®#Ђ,¨‚à ðæÊ‹Ñ&nò&ØýdÊ=ݧp\>ïóDfóî‹T‰z˜7»Þ ìnÀ- :¨8©”’…•r S΂lÕÕéKWWÑzݪƒó¾Š\÷ é¶tZ¿Ðån&ÞÝ›`Þ}JÛnf÷¾Ieoef?¯aObh·"ltvN¦ö©P…<°v`¿Ûඉ(p¯‰kwd@÷tW÷ug÷vw÷w‡÷v(þhx·÷{Çwxow {æw)¹ƒWØ?x€Wx‚XxôEx#ax+ÀWp…‡?;øY˜_‹÷È\@±üåxq1ƒˆ$†‘ç](‚ Î1Vy2‰4ˆùQQ˜ˆ%»y2ŠÀ éyaȳ'?îìù1bÅlÝ~.múmdŸöý¸GêÓ²g -š)iÚºwNX(W¯`Uó.nü¤íÛJsoî¼a]»°WcιóòôçÚ·ûNª|)sîâÇ“/o^aòï!ßoïþ=üÏéÕdÿ>þüú‹Î§¿x?€ 8`ZÞù’}*¸ ƒñõç4ÑI8!…Zx!†j¸!‡zø!ˆ!Š8"‰%šx"Š)ª¸"‹&r HÈü! 5Úx#Žþ9ê¸#=úø#A 9$‘Ey$’I*¹$“M:ù$”Q 0®çTƒYj¹%wÒ— —aŠ9¦c^ª&™iª¹¦Tf~‡&›qÊ9'rZ‰ œtê¹'ŸèÙiež} :¨œn*a‹‰*º(£:ú(¤‘J:)¥!¾x§G2J¹)§zú)¨¡Š:*©¥šZ$•˜z(¡­ºÊ¥¡·±jT-Þ¤%ĦѮ¯ú:§7µø©êõš]E$­= ŒKÇþ:mš¾ƒ]A±Š6k³õ" E0-ÓSKÒÆ„ gÄ™ºÔ5ÇnºÈÖ¼îîVo^)ycCwÄâ‰åJæ"tMþ/áªÛ›±X(b¯| 3\ç •ÀüI|°n/<ñI…`Ñ/±Ü€"д†_ÓE'3Ì Ã6­@Ó…@\xÁ Ñ ÚÊ Á,3Í=à¤O5W Lj,Ô@ÖÆ)g7ôNä’l2Ê5ßœóÎ ÙŒ³Î=dSÈ@…dÓG'ýPK ÕEÃVòÉ)Í5Cw‡ ÛLtõ=7Ö)ÇM.tnO<¸OtgöÖ{ûó̰I÷ã`wMùOˆóMÓÓQnÜW×­µå ð1`dC®Þ]·îÓß…{Nœæ¢/þº@ ¼–íŸ0Šœ΀B‚ÃŒL‘eÉ _¤!þÐ#Ý€ÒØÏÐòÍ?¿UW_…ÕC-݀І4ªÉAŒ>Q˜o)ÛpSpÞû$<ñÆ÷ýôÕ3„?õÖã1Ì!zpˆaL&|ã+Ÿä&Ä>÷'~à ýŠ=éõoÔl´­@pxäžp¾W¡¾O aíÇ? *${Î;ØDzBëep,1¡üj¨>ª¦}%ÄáƒçA^†èé^7¼0ÁüÑp†bÙ¡„HØ@$¢pˆK¬ @H ™˜ôî@¿ƒ l™-‚yØ‚5Æ"i¸Œ иÞBШF¾¤ 0iA! F@&Ø8qðhG؈±™Yc߸6 þÄdÆ1˜Á„;Jmùc ëøš0Ž‘T¤BÙGÂf/zÉK!IG×X²˜ÌŽ 7™Ê-Š’” ‘£½NéÉQ*R—¥¤$+ÙÊWÂ$–>™å.méM&S‘µìå^ sI@Â’™„ìdž9-‚LU_„!#Ò²0Â`ø/*Eà5¤œçLg’gÈ-Ê3/ f+ñ°=dGžªü:{¦V¬s+§H=ó¹Ï~bçŸÔ!¨@Ñɽ/]gC·蓟0ñ'ZЄ¸0L×Dé²Ê`›ˆ—é8ºÐfœñiLjzÓž¥Œ0]ÜfZ^´þ§Ñ]71õMy•Q^¹† Â9ÈB EL0¦©Vu•=$óò…?( ŠŠ/¦A‚bZó¢W…È[ r‡åÉÂea5«t•Öµ󫛤N\XŽ]4“Á¡ºöÊÖëáªM­êØ\²¦­Y_bÕºX¿Út°¦³¦g{Úß`V¯šíë Ý:Y‚x,©wZêEaBŒJ>¤¶|ª „ÝÐíœÒT­æv·]=¡@Â7=ä –4B ÀŠ6õ-p±”ìâ!¸= Á%ø)‡m\F¹äkeo©kBë2µ·¿í®vÂ]ï"«°ÙAntÓ[Ý^÷½þôujŠËÛÌ–c=˜¯p݅ߊÉkºûÍáEl`Ÿ Ã+Èøž„ìß÷‘ ^/Û«áìÄ㢿`K˜< 6ä²bƒ´b0¨5¦‰K¤¸²Af\ãtØI›,À@âØbJÜè@¸€ ˜HÂÈ6åBŽwÜc9ÊYæq&´P h«F’—œ_´M¹:DÃÎE±¬c0÷€Ë‘³–Õe_*[yÍRæó›¯üå-wYÆ4¶1ô\|0<Ó¹°U4€J?»ù:‚ž3¡c‚:Õ±nÐ8Æ´V%å6Òqöt@p-× `h©•FºAäçȺ8µþÏ­õ“ë Ï&Xà ™«©%ìa£w;ÚRLn6Te»Ùz±lŽ˜ß9»ÚÖ¦´Gìks»Û¼ÉöZ¨ííq“›^]ô¸Ë­îuSìÜ_Ú6»ã-ﹸûLð– ¬…+]õÀ×óþ÷œÀ›{CEY.‹Lžõ—U¼áj8xŽðŒ|Ë`=W‰ùåð‹ âË‘x‡1B0‹W¥µ?¹–<>’ßý,r=£DÆù2È w5‘RQ®ó©¼- Gˆ ·÷B¤žA¿"‡û]î¼éêù•(‚Kû²ègL#A´éã,2Ýé^¿Ôô󂔞¿ùiCdÞƒ²trËþù×㟰×gìw°}ŸÕIx´3¹Üº¯ÊîpW ê†Øöðºp†•nbÁS¾<„/VD„Œèû):Ò ‘DŒ{ y"3ºÇÃU5¶*¯úç\þ_pÉ7Fü½úÙ¿«Þo2<ísO­Ö'[Ciñ½îƒÿlÛ+'ÝÂ?¾žx{ä3?ùÄ—Õò›/}6)úÖï+¥ýís¿ûÞÿ>øÃ/þ=_4úÓ¯þõ³¿ýî?üã/ÿùÓ¿þö¿?þó¯ÿýó¿ÿþÿ?  `þ¡‚¿$ . 6 > F N V ^ f n v ~ † Ž G–  ž ¦  ® ¶  ¾ Æ  Î Ö  Þ æ î ö þ ¡!¡!&¡.!6¡>!Fám;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_t_5.gif000066400000000000000000000124471343257752000272700ustar00rootroot00000000000000GIF89a-¸ç”†„LB<äÂĤFDÄ¢¤t$"$Ä‚„lZ\„f\ĺ´dJD´’”<2,´fd ôâäŒvtT><Ì’”¤–”TJLÔ¦”lfd¤‚täÚÜœjdܲ´D:4$¬VL4&$|^TdRL$\F<Œ„nl¼šœüòô”"$ÄšŒÔªœ¤ŠŒÜº¼ œzlŒ64TB<ôÆÄtbd¼’„lRLÌžŒ„ ´Ž|tZTD2,L:4¬^\4.,Œndܪœ ¤NL̪¬,"ôêì”vl\JD¬†|üÒÔ䲤,üúü¬Š|ì¾¼œ>4Œrd,&$”z|\NL¬ŠŒœ‚„LBDìÂĤJLĆ„„jdľ¼´–”¬žœ”rl´bd¬RT䶴̦¤<.,´jl|b\œ~tôÊÌ|jlìÚÜôæäÌ–”ܶ´Œ¼žœüöôÄžŒ  „ Ü®œ ôîìüþü„Ô¦¤¤†„”.,Ô®¬ä¾¼œ64¬ŽŒ<24D:<$¬VTdRT\FDTBDÌž”´Ž„tZ\Œnl,"$”vt\JLTFDt^\dNL4*,¼–ŒlVTD64L><ÿÿþ!ù»,-¸þ5 H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£J…¸@€Õ«X³jÝʵ«×¯`±.˜JVf<Òª]˶­Û·pãÊ›@…²x]ž]·¯ß¿€ L¸°a¾vó*V¹÷°ãÇ#ûM¼¸rÉÆlx¸D)W¾™7wþ¼@_+h€ôÍÕ+’c¦l¹6ÈÆHܲdåˆ-¾¹w÷þ]Úo®# À^ˆµìçˆïÚžÞ±ñ¥ ¯6Ý÷…óD^þQÓ·x qÑa9€hÐ ±„¾|úK,éÀD)Æ ÄæqGu^ÔØ<$¡š_*øw|YB l68`Ã7@@¹°Âq$ fÈ 7¢ƒ‰(ªÈ"†¨pÁµ Öa_¨£D˜µAĘˆ€Ýø¤ˆý•"K€áKP‘b*vAˆÑÀ 5d¹e—Kxq _V`BådÒí¨&Dõe 1Àñ×›q&éW+DXâE˜@˜Ò bø-‘ƒ!”`(b q¢|)Ê×%†F (škVêP›~]à‚•›÷}D±D ˆ£_5üp%¨åþ\z +˜¦TùàƒiZªëAÙr„–¨Ê|ù ¬°Äzê"hȱÄ.0i'_¼„ <芴ض7tû¢!l¼Ç´Ñíª®AeÐ%@"1¤»ðb"/b‘j“,¡‚r§ö•ˆ)`¢€€ðQ‚Ăð‚–(àÅLˆ§lºëf¬ ¦Ðu|qÀ±å¨±¥{ü„“œëÈ$£lòÉ۩̲º%¿l³Ì3ëYôìóÏ@-ôÐDmôÑ=@κbïÓPG-õÔTWm5Õ0ÝòÍ\w,²ÖÖÜõ؆} ötb“­öv+ŸM]ÚkDZÛb µÜk›Mwþevãí·Þ{+Ö÷l–V8Y@A î7Û‡²Ë6zXÚK´aÈ$“âíå–?>[Û‘/f÷Óg¦¾&¯ÆZš­¢^:Ú“o(ޑ袥;¥³×6ø­ ¯Þ:˜”ÿ^éÁ—5|ÊÅkιçè*?wó‚OŽúÅ(Á€â 0l=®Øóüø7^þSp£ï±úë7Õ¾ûÐÁÿRóÓ/›ý÷'•¿þ’á_ÿŽò?BF€,J è&p(N»š'HÁ B-kŒÊÎÆÁzðƒ@SZ£²@–y#DJ MH¦Ð'+d¡`\øBžÄP†²«!Sn(ßņþ:Ì cóª ˆA¼ÉY,ÈÄH`Md" “ TàŠXÌ¢·ÈÅ.fqW€ÇHF/j€ŠLëÁ&*! 4º± (À6a†7ÚQœØD&ö0ˆ;¾qBЄôèG*aœÐDÝPÈ$:‚9D(|a Ÿ¸B#(ùÂ\iB (ÀɾM ˆ BQʪáiÁÑÊvá 0ÈPË"à ¦0Oô²‡ €2É0†1(S™›<æOq…+H3…Ô´æ53˜Ímr³šÞ|`7Ã9Mp’³ãóé¶}òlþä¤AЂô M¨BÊІ:ô¡èCaPM‰Zô¢ͨF7 X Š ©HGÊÄ ¤(M©JEêÑY(á¥0©LgJÓšÚô¦8Í©Ng €—ö4¦?Ý©P‡JÔ¢õ¨H-ªÐÒ¤:õ©P…éO§êÓ¨ZõªXÍêQ—ÚT­zu§2ƒ.†<œ ª5¥*PiÖ±–õ¬Jh+YÍŠV%<k€©*`ªR<á«€ ìP¹Ú ¸T°ˆi)PÁ5<Á£¨+O%«„ *–±Ž…ìKÛØÇF¶²1̓^ªèá¥ÈCbWËÚ—–#†mþ-b/!žFê¥kÀHQµNµ ¤@.òªÚÒÔ¸“…©(tñÒ ›$€‰žr`ëQÅi+ \áÝîK¥€S ¡µ­,u-+[¯¾v#±m/`u1‹(B¦–]D.Îp†\øÖ§ûí/^J_ûÊ´À÷]+L¥€‰¿†¡3PÂ0!äá /à !ƒ ÀüÍÅ€+`¿´ ¹x„dA Ÿ^X¾}¯Fâ c­Ê` s¸„h‘^Ëzá/ýÄ+ d%| /½qŽwœ^%ë˜Ç”M€”0ŠDÖ ¨,!ØŠ ŸùÈ^2’• ¼ô «ðéþ–küUg„ÆlÖª>Q悦—H°"† =_B¦s®3 élgök˜™×p€!TV 0-D.ÐpÛÊúÙ§—.îÓ| é8kÕͳ§³ªHöÇAæó—Ç,ÓRÓÔÕwŽ)ÒðáZTAѱV‚¸ )”6ÌF3VýÒ<"¹£Æ*¨/"êd'uvx‚!;“¢ÈJØB)BÌçmŸ¡[x)´¥Mm;{ÚÕ¦¬$€†N( .˜r®1!Š5jÂ!Ì¡ŒyÄŸEÄýn¸ ½gàµE¸àØÊ^6ŒV,¼¡)ª§Ä+–_š¤“hˆˆˆÔªÂ05Æcš¥º›Æ¤H°\ö™w¦º–¦Ž¸¦Þç¦pzgrjÆþu ˆmÌ~tŠªÜ.õ ¤`ƒ³Ðsì·¾q%ÇlŒ§~H¤ØÛÁ#Xy J‹ú¨§úSä»Éšf‹ŒSŸŒ“¶¨1µ©—ª™ÊÊ?Õ©ˆø©ˆj»k@ª¦ê¨ ¦ªPË—&iÆs·º |»ššÊIËØ¨ØÊªŸ‹ÉX¨zÖªßê¼~ŒÇ»z° ÕìÂØˆÍÙ(­§­ÛˆÃ~LÎÜšjß@\WŸ ­élÛÍ·Ïœ vàJà ¯XœìÎÛX­Üì¬1u½®Í„Xy«±÷ڥږ²ëŽð؉ []SÃ{XoúøRëØÑöæ° ËÅMÒ;þµ =Á/ û°Û¥mÍëĹào¯€ ±ðo˜P¶;†'­V =ÓV—,–N;^AÛsº¿îÛW.‹’1‹‘L]W5SNm´.‡´'fqJp´ 9´È¦Õ™´#I %y’0ûÓQ;µŠPµ pµ –µ=wÕÖœ´p`Cõ`lýÕ[Ö?•ÔQ»Ô*y· ‹U”{TdûUTf{p‘­vž{Ôjû·mK”Ž‹S‹½¶u+•}SŸ=ÚŽ[Ú¦­¸¨Ú†‹™†`°Û²=Û´]Û¶}Û¸Ûº½Û¼ÝÛ¾ýÛÀÜÂ=ÜÄÍÛ® ÐçH|ʽÜÌÝÜÀ÷OÐÝÒ=ÝÔ]ÝÖ}ÝØÝÚ½ÝÜÝÝÞ8;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_t_6.gif000066400000000000000000001005061343257752000272630ustar00rootroot00000000000000GIF89aí`猂„|äÂÄŒBD4.,Ä‚„lfdÄ¢¤´bdTF<<¬†|䲤„f\”"$ôâäL64¤BDĺ´´–”ìÒÔŒrd$Ä–ŒœzldRLlÔ¦”,&$L>4  lRLdJDŒ64ÄšŒ”ŽŒ<64´Ž|¼rtŒVLôÆÄ|vt,”RTÔªœlZ\œ‚„|b\\NL„nlüòô”rl\F<亼¼–„üÒÔŒT><ÌžŒt $"$Œ.,\64ܲ´äÚܼ’„|^TœŠŒ äÊÌD2,d&$$ŒjdT6,¤~tœ:<¼~|¬VTÜ®œÄŽŒ´nlôîì¤NLÔ¦¤üþüÌžœÜ¾¼ìÞܬ^\„œ64„ Ì–”ŒvtÔ®¬”.,Œ¤†„TFDœztdRTÔ¦œL><´Ž„|bd\FD¼–ŒÌž” $D64tZ\|fdt^\Œnl„jdL:}§çÓãËŸÏ·zûûø×£O¿Ÿ}ÿü(à{ôhàmÙ'à‚ þÇ º’J×9ž… fÈvèá‡\)¨áˆú‘èzØe  $08\WÄ¡ã\çB:0Îh¤œz ª¨þ¤Vj¢£’Öjë­Q*k€Tq]°¨Š,¾:PÅ¡qj!iì@áªU^Gì¯Èºëˆ´âªí¶Ü¤ëµøpi¦«ÂâÂuã ×ªŸ [ª²Òžkªº²[-à2˜m·üö[ë·ùúÇ ›¬ˆd+V¸@‚9èÍYçîªj- 3LèÃ÷®ð€ðùëñǼ1;‚€J±èq,Àp2d8 ¤aEÆûá /»+·ürÌ3G<2€û‚,ôЊü³x–W0Œ.}t£-õÔòýôwI7Ê8$h1Š—[wýõÕ$MõÙhSf5ÙÜeí] D¤aƒ¼/Â-7ÝlëuþÚ|÷ ÙÚy.¸¬fûmøá™ÀÄ(Œ7îøãG.ùä”Wnùå˜g®ùæœwî¹æL˜€øè¤ ̲¨§®úꬷîúë°Ç.ûì´×nûí¸çLé¼÷žàƒ/|Ù{ûnüñk?üòÌãW8òÐG¢uÍWoý‚ÏK¯ýöR)ý÷àc—=÷ä—”÷á§_ýøæ·ï¾Oè«/¿ðì¿oÿý4)þùþü÷ïÿÿ  G:üð€:9]îÈÀ:ðŒ !´;Zð‚0‰ßü6˜·úaðƒ Ìõ8HÂïy0„(L¡C¬æ6öà! êA-˜ÐÂ)%ÔÐ UÈÄ…þrAÄÃë´BÃAŠ•CŽùð‰PlÈ–%¡gÕðfݹ€9ZD&æK 5h"öŠÅ2FqŠ×IÑŠ4fž¬uâ-º"Ž0±F1ŒfÌ#Ñx@A+YD2’¨´%']$ÀÎLÁ²&\§VR!/ò Î;U…+\1 _1 K˜ðT¦PÈ.AR’”¬ÜÐ#rÙ1?;Ô£,ßÇGøÑf«r˜¡¨”¨>]'t£Ç)ª@\'Z Avà‰mGZÈE.´`0Tp¹ G7ðTäiO¾t2•ÉÌ ™#T°zågÉNòñT©ú£µÖÕ.h¡sTñþÂ0‹ì¨‚ˆ¶dš<½Œq9@©ÂCÙ‰mœèž±úg €DbŸêtÛÉQüMBͲ"¾ÊU¬cE ÀÎ7Ì‘&<á—©s¦v¦e¬`¹€i,ø„Ÿ€q®h9 1=Ѱ#f´=±ì¨RWËd™ ]ôrUÄ:Êì㮸N9,š,·T”×ÑÂ)<àh@ #EÏVßuLÄó¨ÚèRçʽ¦N,a kX¡ 6ÐUi;(ÂUéqL-à Eˆ'.MiRó:x ÂÀ"!­…=lbGê€(„®q¥«hÝgW ©Œe.ûÌdF3Q ñ:5(þ,L±†G>@°`Ú€Ee§ "ؤŠõ P¨ fPŒÛæv·ýÇAÚÑZ·®#Óă%H µÝÕ ©[ÝëšzÌNؼFÞö–'©çïÐÒ‹»Íͽøý|åË_Ñ7¿Ï~ûKàmý7Àî΀ Ìàe7Á†¥\Laÿ>8Â^Ï‚+Ìá8à Þp‡Gü! Vê…EtÀ É3^IÄ$ŽqÑ.ÌV/  m4ân•èEÏjÂ2ò˜> €*rViJ 9”Ð%ïôç¯)î"vÀècÁXÈX†Õxäðd 1¨S ÒR'gçqÌþ« µ,»9dÙÒ”új%A¢goÂŽ(v€ÙK²Š«‹lä##9ÉJžhY×i%›]tå7;º2µ¼åruÉWWpÕ$È*q L쓘Æg2—Ù̾btÑØò£WŸw¢ê¤õªg¯~»Ø‘>õüô'@û@Ñ‘žÕj4«‡Í"‡4b45©ÒpéL/·?(U)K] S?㲨ÀN5±·] Ò–K^é:d¬Ñã<ˉϸu¸ÙHUí\UÓk½YÜšmªšÛø†tœÛfD¼ZÌ”f%˜ÅüZP,¯×IC½ev°™E¬bGêÙzûÞùÎøßö]ªÓêLµ<ÛOþX$°B¹žÊYjÅIôܶ²¥­mq«[MI·Ç—°Æw.›{ʨùé.€Zœs'òüèúÐzÇVô éPŸËí‹·¦oðéQϺ[|nu1b]ë`O ×»žÃ¯‡ýìd;ÙIhv´»ý+j_ûÕ1þöº¿%îCqwä88¾/ˆèg¦»Ý¯¼³qd/ß»üü. o§í„|÷hŒ´ 1^= çw‹å ŸÊŠÊÚ¼äGß ^k‚£™ÍóÍ}«‰ZÿúØÓöHÕé´æÐ žôÀïʉ¥A£²§ˆVü‰Jy@Ñ~G'Ò@ŽUX‘ùÌ0Èþãú\-†ö¹$ç;²;ÅàÄXÁ‰IŸúÖW%ÈCüA:ÀüÞIÿúÛ¯°ÿGèñ DŸÔV`õ~ÕgE«d,Wbø—h®$>¿|ˆ7p…EN¥æ6IÒK‹òiÅ4R´U€ 6`Nà´(V0jc3N¤öKt³‚Ê46è‚¡ÆŰë·?2‚%x‚y‚Nè6˜:è<˜ƒ;€ð i€DÖ„MÚÄMÞäƒ&hNB¸W58L!˜N¾W`h7BOè!QÕe]Q¸ÖOÖ²@¢†ÀMvfÈkùttx3ûĆÞq{±§oX!\E†kþ€˜{‰¨{@_på ÅP•ƒx"…8n‡˜¿v¢† È7’lèTÖµæ+ÕR/ÅF'  |>ESØaŠÉmÒÒc8m­ˆzØñб!2TéVR»ÈŠÂV #*8¥S¬r.À(‹ÄHŠ×±ŠÔ–h@牊Þh#ÙeˆoɲzžÇ\X5R € P Š{˜ä(>U5‡uÈFï¦ëØŽï8RâøHé˜ LpYa5VeuV×±îˆKÿˆŽšæôö…ßX‘YqZq›µl §y>õpŸ@X‰® ÄÔ ©ˆ,¨‘ñÔp*9ƒ@þ’"yxÝQ’'‰KC(“mXDãP8$‰’EY–u6I(9R9)X!‰G‘ù”T1|«Õ3Ìå\5ÇrI“б5[á-wŸPËø©(~DÝW•4·[‰g–h $[)sÐ[â–c‰KU0•è—áE—þ.ªð&Åu\É–b¹Ox©—0Ç•‰6]N •ùß²]ó#të^B™Û™O£™Úx™¢ég²tr§¦<©éÝ8š®igBuç¡:>&›Ác›¬ùšºi†wšá󉻜ћ¾iB­)œÈ9)”WœîœÉùœAœ%DÙæœÐyR„Ìþ±ÜÙÛéNàâ9žäÉÎè)šáìÙžîÉž” KðžôYŸöù°‘žú[ ѰŸ:W‚0 zà z ìdz0•`ú y4° (P z¡Pº° I Á€¡ šB±à¡Q (¢(úAÇ0 1 •¢0Š@ :¸° 1z£ïCzPa ³€£@Z> ! :ÐAš¤Ñ³ Ò` z J:¥Æ#z`È¥Z*Ï@¥^Z:Ä b:¦c* »ð¥hj8@l* bʦlJi:§†¦z@§xz8vš§|Ê7{Ú§€:5¨þ„ 2ƒZ¨ˆÊ/‡š¨ŒŠ+‹Ú¨)©”:&“Z©˜*#—š©œŠ ›Ú© :Ÿª¤£Zª¨*§šª¬Z«Úª‘:A²:«´J«@„P«ºº«¼Z;€«z£p ÄZ¬Æz¬Èš¬Êº¬ÌÚ¬Îú¬Ð­Ç Òz ÔZ­Øš­Úº­ÜÚ­Þº¬ð«ÀjFÔZœ~×yÌY)á:®äz ÔåÄH“BEÀ†ç «³1»§>ëÊ®QT® Þ0Y;y4î°(÷* ûjyøÕ¯þúD WÐå°pC¢Iœ„2Ø×+»IôHã—–8€Ð‚}õçS°þ€ËÇ$†tŒô|²#=2T™$²(³J~ö®â±>4±GE àCÕ0Ñ4M͈()$Å0!0@ÒXL{2Ø4Ø„OÈKO pi-ˆ‚NV„N«(×Q„'²&m’gVûXAˆ†±BËCD;·×±M{HõP^˜: Ð%êÒ·ñ8øˆT"‡™$—†—Š›kãÑ·_Å.äRQ°A[·*t·ê„Åð @R¿,›†/}M@’l¦K‹ÂŒ]åTÆØUÄ8ÂxºªÈ‹RR­Ë»Ã˜¹»¹œ‹BžûJ"§ Ý0¸`…»ýÑ Ë·Ë[¸BIgâþ&Ub› Ù¸ š&.Ë[¹˜²\íE·ÃBÅkGýÁ© ´Žµ·ÙÛG¢pU»´pû’ZË"=ù“©8„ªR”G‰»:y"Ã#'ö ¿ בš{¾ë®kU|\Â…2]µ,i '@BÁ®0\${–& ˜o’Šyr±‹v‰˜ËÅ—7›&SRÁÕÁ\__I^æëÀ”¾éš™Û¨! [¾Â‹Ã¤Ã; «I"?lÃA,ÄDÄEœ¸‰Ä9wÃL|@NüÄXœ/T\ÅøsÅYüÅêºÄ\|?ÌBf|ÆhœÆj¼ÆlÜÆnüÆpÇr<Çt\Çv|ÇxœÇz¼Ç|lǰþc<ÄiÐÇ„\Ȇ|ȈœÈŠ¼ÈŒ¼ÇÈäÅ`<É8²ÅÜ>’LÉšœ&b|Éæ“É›Ê ÛÉžL> ,ʨ|–\ÊÜsÊ©üÊüAʬ¬=® ˶ŒŠ²<ËÑSÆÜ˾üËÀÌÂ<ÌmüȺì>¼LÌʼÌÌÜÌÎLÌÆ|ÌŸ Á·\Í™ËÒl<µlÍÜ\!؜ͽsÅI¬z—c*FCšÝ¬Åß Î¥#ΛljgÎG”D޹γÊîì;ðÌ ™g° ezøÌÎûÜÊÔ¼zØ£zü!·•Ò{ .ú|ÐïœÐ:Â#>1+KH2Û%ˆ¤H5{~§ô}Aò³Û±³ëþ(‘`EJí}©t" èŠÑÝÎm8D«&lâ&3„øµ–¶\j.XN}Åo[M×”MÛÔMß„¶¢¦XxQ±bÓ»2Ñ98;Ý·©(ŽI"‡·Æ*’k‡»Ökòšâ›)‘8‰`âPë…wHQ—Ö‰X&Z½Õ:mѾk½ÅH-'Uf¹‹Œ?T¸Ä¬ë7å9µS=•,¶x»°—Øvײ’×zÝ7]½¼ÃnQe/SUÞ«U›ÔÛ±ÖIVf…V¸;œ5‘–Íy8Ùh³Ó|À«rpÿÔËÕpŒLš5qÝ«g YAYYéSÀ-qœÕ”±×³MÛTþ³Ó%s2¦¥r;ÃZ“x,¬–Ï¥)~ù[1ìÁªh\¶T˜¸Û\k9R7÷ܲ-ÝÚlÑøá™Þa™øÁ™Ÿ÷“îý%˜ ßÓ-ßëqÄû}šýíßR³ÓìÅ.wnàC³Í Æ îà ážÅNácáþÄ®áýÂá¾ÃâÝÒÏ_Rνb Î#¾<%nâÛ‚â82Ï]Ïàx/^=1.ã¸Bã>œÿ\yÍD½ã0Ý>~â ­|R,> mÎóVGH><=¾äµBÝ´ËµÑÆ¢±#{º~öÑÍÒ0mhÑUí•àíAßëaß÷áâç~4¹®î2‚àÎ5ì5ïlVïöþ!ø® ÎïæïÿÞ!"NðÙfð ¯ð¨Æð _ ñýžîïMnñ$ŽñðÏñÌ)ñþŸâ0ÔÐç<Ε"ïëLò%/'_ãGÏ»U=:ŽÕ0óÐQËŒ×B-4äÉXä—=ôàqä½óÏNîh–b,¯ò¾mÓJ¿ô²A´8Ò©dÒÚÑ7} xh·ëõòBæ4+hÌEh1mIÉ×6؇ö* J`%öÉ÷²âgt–õZD«¶G½à¡¶ýQ¶#Uø0èiz>Õ|~ØPâ{^NQèÔT˜ç &‚k@‚WÈFŒï…:ïñ?DËèØ1×MÖ~˜ÖÛèg˜ntƒúfí覭,r¨úm½PoÍúå(ˆpÈFª/úXOú¥oò ýéÕ&‹à¡ü®þ‹Ì_‹A…‹ƒ¡.S¿_Š1µØÕߊýa»œT4ÝÃø øÇOž›ãXÚ5Äþý±½¸D뱎ìOë’E«Bëb¥Ú iÿñÉ•d€©C± tPŽă˜>PĘQãFŽ=~RäÈ-C™RåJ–-]¾„SæLš5mÞÄ™SçNž=}þTèP¢EEšTéM§ ~(Rì=‚1´à(V䢃488B•J•«W‚®4T!ÑÉa׃V±j%xÁÜA°S«^ͺաC‚|úuè6/AvÀh¤ïZh¢ýr!˜Ç&“P›ÏF;íD†¬"RÅ×>€‰:£çr™R£ˆˆ:n‚æ&¬ï†Èï÷èl±ÉfoÔ-Ê=ûwÿ½{ï¿g gyöù­­Ó¨1‚Ð7 -µÖ§Ì²­®e,*»¤6ÿkˆ2Ó¾ÿ¹_8À¡ü+ HƒþøóëØg#ÜAN ¤ƒŸçDgê¹Nvæsœôø'qµ#–ÿDø!Є'D¡L4U„Û…IC Õex ¦Ð†7<¡—F1ha3bEc6шEôR ˆ`M4›[—¥«ÑŠWL[º¦¸E V‹_£¾´ÈE2úÏ‹aDc“5Æ2¶wgTc1:ÖÑŽwÄcõ¸G>öÑd Iװч„å¸ÈIAÑ‘„d$%9IJVÒ’—¤d( ɨ@¥jUiU1$Ê_Õ#1D䉈ÈHVæjW´›,?i NhÒ5†¼)!Ò«YKwt2åF†þµ­TnF‘­Dfž,-YÆ,˜a¦gj¹IAѯ”ÐÖ/ ÔÌŽt«˜HZe2ŪW>ÓIÑD]FŠ rC EøKhü2Í[ròOïŠW:o¤Kp“#ôú¦1Ã9N‚Rªœú„:ו4Ä`g1HCëšO‚г5ÿ…+\1Šm€À€ÅàY% (ûX1D rÄ€cKYA:†d¦ AéêDæ’Eì¥SÙé2€’ž ¦)]iKojSšõ£!©8,†1÷ä©"ÝMÀF»“µ/Ee™ËºªÔ¬‡ZfVF0¢u¨ÓÑ*[QW0¯Îõ§1µ^1âÊþÕœ:`V€ˆ(vÐ#¤! ¨(F[ûªR–ºte Ÿ=E¡…\äB ¢è‹9Hà+˜§ æ‡ÔºV5+L퇢¥š¼P!"ÂüÐ*£%ÈÕ¢5$ µ^û ´@˵Ô: ´@ûáj3tÚóh–³žešÓ öÙÍv– ¥åei÷ÚÞ`·×YÜXKRÖ³vW™Œrt¥K4êâV¼Z¥Ï`k×ÛVÍzçîÔpëŠ:€È€xÀ-V<å%­i£ÙÕ°m¤E+B뀰õEd†œ˜0Òƒ@qÁ0[Œ9ÀÂÜðVa¹]Øœ&ñß7aˆdxÃê‚L‘þ½õEÆ‹cÀi÷á‚ÔwÆÚí'w½;dS!:&sL·E n%v2Axl½%; Éâá1ˆéÌõåÀ –2”%LáÛò¢ö´Aª‹($±²;]š!¢¹ÙqË)5¨œ)2‰:àu¡‹­êr«®7ëÙ!r>ˆîœç¡Zt¦Û3z ç.‹‡Î§3)DläíÙÓß%¥iwé=‹ºÍ¤No Wf=S[ZÐi¨ï}ûr96»zeˆ.35Œ/·™/Õ;‹!l¢­á 8Ã7¨WߊF"Ó‹³­¿{Ì16²•Mm*+„!©v@•¯<þ9ÜHµÅ}èƒÜAì½lh™É´³¶7üKÁz™É`Ž6F„σØY’¥¬e1Ë^¾È0Æß`Æ£Šh¡-x¹Œ5Õ—ñË€ÛzwÉŸð€qw¼ß oŸdÚ, Vì½ä¹^(Â?tKKÝìz‘ÒêšÛ<¾)/:eÀåÓx+˜ît¨_&·I¿ùsþŸ†>Tƒ©9X1ñªoeåÀ…_ÃÍYˆTAAG­Ç—þ4P¥DK§ÃÀðð¥ ðPÝÃÃK@°ƒ „eyŠwÁïFx×»þî¡F3œ‚úa/À(× zÐ/ÚrÏ©ýó —þHC×|8øð¤^®E8Ä8ÑùÂ^ö´On]ÏU¾¤¬@X!¦¨ûÞ18Çç}?]{íù§~¦CC¥èÕEzÓwF¸l׬ŠÁÏŒ8<5à×~úÃtLï·QŸ*Ö ZHó£ýet¤úcÉ}÷÷B÷g—Y!N¦è{8ýCÀpá?ÿc@ÀCª¿ÓxÀ¤@a¿Ä@û›>ý‹@Ó˜À Á¹À $Á¥À¤DÁTÁÄ$`е„ÁHYÀ¤AgQ‚QÀÁÔÁäÁôÁ Â!$Â" B&0ŒÁ%<§¬Á',,£ŒÂ DþGñ¤k %È>&“„Â0ô‰#ÙBjÑ.*$ )<9ÑÂ+ ‚ð%&/,1´Ãz‚ˆ84ñBC´BϨò¦ƒx-€zP€ª²¦7Ä&bò&:üB'¼ÃIŠ#ɦЍ>T 5d¸ÊÛˆ`…'p>Uq|š%¿(H”AJtE´§iÄ ÒĤ8¢"“ê+©º˜ŒQ«­¢6Lë‹§R…À&)²p«˜ª‚ŒÚ¨ä ª=ƒˆn@:ˆž2™eüƒX™–aÅV|Åp´ENÚ½Z«Y¢Zl“XÜ-[š5hš§y.ý/nc8ˆ‚ÍÂr0.<˜Þþ­ɪ¬Ëò5г¬¡-ÛrÇiû±o|0ljì’X<ø:C<¿X|01ƒˆ{· À¯‘1î0S±Õé5ŠËˆo_É·Õ±Â3YzHˆl‰¤È‰¼Åƒ˜·ŒTÂL34‚x´8»œ@œ»5ÌA£´Z“4&i`ø‚]ë³?‹TÓŸÚ™?œÔÜÉpìÉÀ9J ÄÃN”7ocž´2¤¼G¥ä7Šàµƒ1}k¦S ‡mk6鈷LÊŠØ ®ÌIIüÊÁ\‰°TË+ËDÔÀ“³8ˆ¹÷!º°ËºŒ@“Ó:¤‹8‚t©kº§K»ªhŠ9û‹Æ”%žLþÝLÂdMÃÄ:tœ!u< Ãl<¸<‡Ø½ Ú‘´¶ê=.{;Wˆ;&‹=`˜½ç›%QÂ3<åó<¥½Ô LÖ¤Nt±H5C…̓M’M£àDN©>ÏèBéܧլÎüÎ)ê΢HOòüF¯<Ï0lO!ZO¢˜ÏüsÏ „Ïø|Âù¤EÅ”À?ÌÏÝ>þ4P—ðÏtPX$ÐM·…P•HÐØ\Ð*tÐ -ÐÐ åÎ MCÅÐÝO m@¡ú,  ÑQõ?H"ѥѵÑÅÑÕÑåÑõÑÝÑ<ð%ì”í´‘,dÄ-OélQu?Ò(•þÒ)¥Ò*¥R!%RNÑ%#õ 7ì'8–ÊÏ&uRï3QBQ¡8S Iñ‹EüÒFL4oSó,S(\ÓþIÓ ÈSaËOl8xIÅya4÷$Ó;-½>Íž=­ÄX,)mFÂ*£ª*s6Ól¼«m¼ª‘2G`*a´**ÆcLÆMU3gä¨([㩇ñ)J)n<odQ;ETTÔÜaÔŸ¸Åv”¯ª±®æò,wDÌrèxTЈ…Ha5.çò-zœLLLœ|t}ìÇl/‚ËL²ëËØRÈ£©­hÍÊ“¼Õ\­Î]Å^CŽDÉñ1uý0 ¸¤ ¶àÙ­=†”À…Jè`5ù`n#a¾m=¨•Ha(``ÆIŽá¡­„CX ààøE“Þ&,4Å$u.dþ­ÎØ–b•ˆX :°=˜ž•-mïcÄ8œC(žâ2þ b ‚”0ƒ,& (².nÓ}‚ˆB<ÄDŒ‹¹˜¥KäB:}Ï(6ãÖ…hX3˜=„f°$?uSPER4ET¼&U,TVôá?vÒCAЃ9Ð=Ð…DvÔ\„ÔQ…*TµT¹ÌM•UN•TOÝ«`Œ´H……REÆ3PƾjFZU»Zµƒ FkXÍÆ¾¢Õ=³Uˆ¼dL&Q!Ð*†6¨ÝAfÇÐjÈa=.t=VHÖemÖg5W† ÖÌ"ÖyŒ®kÝïÑVnÕGomH”8ň²MÈÙþgtuÈ‹µd?ff¶\H‰iøäP~ã¿èÈ”X{…2|U¹}=Eµ›™ ØŠUØŸ¬ÙÄIX†Vè·}Øis—œK™œØ…Uh‹åÊeþg'mƒk0äjæâ¿ YA»YÕAYPY–uYž…˜e†kµµµÌ¥¼5Z£çƒˆÊ©\ªìÙ«¤é¨ Zeö畎áCøä-Ži¥A[†ûÚ°[{Þˆ³-·´ÉŒj¾Üµ•ŒÉ}K'»ÄËS¤ÛݰۭÎÛ”žjª¶à]¨= NÃ4Më©\Ã@ ÅØˆ‘ l†û\]ö]“gÍ<]Ï‹¶MkÁc@ì­›6Øíg¼mþš0†O†¬âUÞåóÝ÷ˆ¢ä@m†3ÞŒ@^¶Mmb^átÞâEöòå óõB•NnÝ‚O–…¿Þaîãëï•Xn=Ð6“>ÅÏ4ïnëoþ4€OÞ‚#înö¦C÷~ïó¤Ѓ^0ï-nûÎïì†O6†ç®o_Bü.pêÜo=¨#Ö’gðrðgÍ)ød!æ ¿p3"p ç[d=¸ðð$Ó2êV¿ 'ñÁÔ…Ož†gqcúb_ ãÜ ?)c¤ñßÉ0Wþñvãñ—T‚ cDTÄÌfD=^[9&DC”ò9…Á"7rŠDO–ƒoò8fÓƒÅQ,ÅŠÔIfîtd5_âU$òÿrvµ…$‡€%¿’#aeHýå)U"Uc¼å\®«]~FV*`®FÙ©?7æä”eÞ$FC?ÕVNU^†Æ‡tæÿ«:¿óëî‚O6ƒ ·'hýÖ‰êÄlÕG~|g}ŽlqmËŒ°gÙ"VÏæ£¸v–õm…çr&ºp=jˆë›L@//õpŒhЃZàó*aЦXsr¾“d°Åá1>v‚pI˜”XšˆÕ½ŸÄî̓hì©/;p-ݤïÌɰlÊ8Ï^v;Ïù2uhçx+9’áö Ú¦mé(úÚÌíá´2ÞŽÞ߀àžÞ×f½tU<Ѝí·_Þà”ûçíí¿ß…1nœ{ª~†O®a´ßñN‘î͸>@‘ñô»øÅ¿C\ødþAèóÈñ°×|оƒOÈGýoÊüÑCÎ×ϧvÐ_ý{×'Q*ød_˜ýÚ·kܧj ød(è}ß—jà§êdødD¦Ú7þžk}äÂ`øda:ç~N‹~é¯A1øäh~ ñNtqh¥&¾üì“íçþŒ…O¾…ð¿=´/5ÿÍ ÓÐSÿýkÿ¾…ïˆe,hð „ 2\à”ƒˆ'R¤ "ErU0^tpÁÆ;j”¨¤†È”*W²léò%̘2gÒ¬is"@ wòìéó'РB‡-jô(Ò¤J—2mêô)Ô¨ céÑ#F*V‚gvþÙÕbÄNbvüŠÉÛÍ´jײmëöíÍœYçÒ­k÷.Þ¼z÷òíë·ç„ªIþÝ*± ª4®Œt,fˆT.¨ü§eÅ/Ä5¦`kÑ1dÉ/Zî(ŽÜزgÓ®][.áܺwóîíû7ðàF›UM&œ§áˆ¢”ŒǪc -$:ìp·ZeW+ZxäÒÒ1ÏäˆôNU!¡ bôéÕ¯Sžè"íøòçÓ¯OYçñüú÷óïïÿ?pÂ`AÉ9 Ñ‘*âDÔ0ìy%E(Ø,áø@.5ø`„í‰Ñ{ö™x"Š)¶„-ºø"Œ1ÊÈUQ£þ°lä@ßµVvéQ“Dߘ“OD”Çì}%Nˆ*Zy%–ò±8#—]zù%˜aMU¼h ‚FTh`¥ÔU…j:Ð &ó‰+k¶‰“„`òA– :¨Z[Šy(¢‰*ºhpBTEÌ™I´\sÏ¡§Å¨i$8¡r¬ðÀƒw}$ÑEÜIÏ¥™n*åDQ D(­µÚê~Œêº+¯½úª™z˜Ù¢U„BV4ö€*°° zä\Æ'‘¨ ˉi8è@ åÀbʧ1ë,´"v%N;Þº.»ƒú+¼ñÊ;¯®ÕTu‡‹NTD•pá¡ÄMJàÑ.þÁ[ù.½ +¼0ÃýYSUÄJ*Ñ(ã Å(k¼1Dz!Ü0È!‹<²]‘T•€ÄÅ@D6hˆÝÓv<3ÍL2Î9ë¼óOCã úÖ<4ÑEc—+ÏI+½´ÒÊT5KÐ=5ÕFßÌ4ÖYk o-zü  ÐU‹=vÁWo}6Úi{ÉLU]€-5ÙqË]«ÙjÛ}7Þûu Mÿ…¥ÌYâLÑÂDàs›(ð[uçý8ä‘÷%GUÇø w ‰»IŸ ÚQ+岤9ǤdžCºn9.9ë­»îTè1ˆ-þý¤m‰›×W§~î@I Ò·{MÄ«NÑIª#ý:óÍ;þÔ4U¡`;æ£Ç§»}_‰EVŸe?›ñm]v–òÏ›>ú<µqÍìaôg h¤™¦Ùc‘MÖšHñ—vZýªQÆ 0`q i†3ØâHfÌ@X¨¢˜`‚?…ûi®pÅ(vôÖ$ð3¡Íþè—šðp°2!ÁŸØÀF#¬à3اj® Ä 8À&°, \!Ï Áþ…dž1Ô ŸPè€×”/}N|âQ•)¼Ojã)ÏyêXgD!¹¢y.¥ž.À$pZíp§T'¤¢pF<ÃŒ.ÀÃ<ÄÈEåh!ÝÅ û‰€1‹[\¹p'%9Þþ±ŽsÌ£¥³Gˆ¢ ¤CRI?j”±c…g.FÒÑŽxÔ#"7yI/É=ðßò (ËY²n•hÐÄ!m BÝ«0v)‘9À—”‰^',H”eA¦\h–ÈÄ4&0Xذ²O’H0;4Ì^†¨•Î\ 5§™Ìˆ\3DÙT77øK`j3žÔ|¥÷F‚N©3š¯l§‘ê‰ÉËT“-«£%BÊ4cTe¹”š’˜ä$@ …¤‹h“ž¥n:`H<ž>9ÊžŠ&УU€Å@'r¤$-)£ݨ9ßRy†”¤&ìèŽNšR•˜¥"­Mi:Òötþ§¡RªÔ¥jm½Ðƒ4±¡Ý)O`PYRU=e5¤Ël¦LaRö`•"ïd&7¿é€qÄ”NvÂWÝDº R‹¬{§@;¶ÎÓ¬yjWŊɲª4¯jåk&ÿ”T¦2¶±:“EU 0U©¥jU­Ò§<•’Ê~‚U‘t§h* Q‘*qš,G£Z>rÒ“­°‚ H`ŽŽœÖ# ‰g=«ZÌ¢vZµ)Mwû*JZ²“ ƒ­liû©_ªÒ¸?¥Èo1Éárª¹®Eîl#R[Èj±Žý.xæT=è@ªù1P·¾.ÍŒëYÑJ\zÁ%®f¹—£ˆ¹Vâb ­ÞR«þí-WDpAì¨g ' ³ßhzŽ[Þ’/{é[.s6@*[0pûû_" ØVБà÷F¤Â ð€‘8ÖŠè·•€]–„9œb#XÁ®I,ëãÏËU‘…~n§8›üë&ZXo Ž<5Æy—ÇN~2¢h òÒà¼Õ2–³<ŸƒB¹Ë^þÏ0ª²+Û$fás‰™µl°4Ë_~3œƒŒ)÷bDzšó¬çBÅ2Î~þ³p¦PcÜùÊ{>4¢eâf@3ºÑvA†4ôP ;ω¾4¦9ÒgGsºÓxÑEU!KgºÔ˜^´§S­j£„az¸F*mhSÓúÒ¨þ^5®sÝTE²¦›Æ÷»Ã¹Ö±a²E6­ëe3û'¶p5¬Cê¯Ø²éܶР:Ñ­ÄÚó6\P§®‘(»Ùæ>wBºPfH{֢߻¯7‘'hôP@LuÛ—dÜÝò¼ë}ï|óî{¡·½ñm’Yá¤Üè~øÃ# =@ Ö¾™öæhÒáM„OpAÂA¸9åws5xD<r‘ÇÜeîøÇC>r?¡%Ù¿9Î 2‹ª˜á7ðáü&¨%VDA'âjtHÀÍ(æ€@íaÒUèÀ ñ…<º¡ »Iôˆt FÚ“Ñ]HÁöl}$PÿŸÔY(D±ûψ8 þdÙ»ž·gJçáM}˜vª³½ˆXWñuâîõˆ0Ñæ9?|Ä'^ Ÿ[‘aª=CUDBoP\]Õ]eßi\!aá øiS þTGta@íŸ^Eb]Æ)ÐÃ7L„[MÄVaaWÜL áf¡à®•®aªÆ“f\†…æaZíU²!E(–B!$6.Tò†äÖe ×vU&~oqÔhŠaDt‰a&V×ñWleW§,W ¤ÉDøŽt"uñt-W!N¦|âí½Ö**—D¼âr­k­`Ýbz¡'W/bþ0¢,Æ Ã‘[$V££CU%JM|­—Ř-Ftã|‘ &ÝW8‹a–c}¡˜‡XˆX8–ÅL¶E9F˜9&R‰ý^0²£)òã;v؇1Ó<ÚØjÜ£˜EÀãAãD´˜-²Ç7ö#DÊc‘e0$ºøÛ}X£HþÙ$ê l£±ÑD‘Ù„’±KKÆ ²5ÜHÎ$œQAUøÂn`\Jî¤ÜÜMþä,CUDCNº[·ÅLã %O¶ ›•%T*U2Tè†N.%VNOF%WšPêX¥Qf%YjåSv%Z>‘TE3äÆU–%\–ÎY¦%]šUèþÁ¸åX’!Äe©me]&äÜBU a˜b&¦b.&c6¦c:æxÁcN&eV¦e^&ff¦fn&g¦`~¦Ý @UÜa‚iž&j¦¦j®&k¶¦k¾&lƦj¶€Œ€lÞ&næ¦nî&oö¦oþ&pÂæ€&q:‘€èA,˜dA§s>çÙ‡U<¨1ƒ4øtf§v&Íqó 4( èAUn§yžgÈøBq0O„ç2X€àzÎ'}ÒK°ƒëÌ4Pá28 ¥Õ'€(£8Š@ ëè'.Ã4ô‚€6¨ƒJ° ä$À~„.œäƒf¨†Æˆ½è¾NôZA@å¨(Ö(p˜Œ<Ãã˜A-@CDÌ@TŒÚ(‘é_°(æ,xÍ&<,ÅV¬Ã§ÀV+ t&Çv¬Çb¦&ôÀÇŽ,ÉŽ,Bɦ¬Êzì\fl¤n¬_ÞÊ™¹\̪ˆgº¬›ÂlÍÒÊÌþÛÎòlËâì¡êìÏr+Ã ŽŽe¸ÂˆSÏ–Râ@'¤,x€¤,m*\Ñ*ZÐ ­ŸíÖŽ7<@ÒvÛiŒƒ;XØÓ¦Å¹¸B @|A'°þtBÍ…mát­×ò)ØâíŠt@9à" ½Ú }E¼RGÐÝŽƒ(9Ä{|H®Þnµ4Pyƒ_¤ßæíÞk߆n4€ ­ˆð(©íÙ†$uÄíiÇtdL{|BLØj´®r0‡s•+àáˆ|®é¢™ÞŽnÎÒìÎvÄ _.à11߀Àá>¯2ÄÐÚËýÁ"XI€¤ˆŒÃpJñvÛñ"o˜–núæS1¼CˆH&c1U{¨ G0x’-’`]/@ì€Ö¾/®°/¬º/×U¨B7xFúÙ¯tƒâZ/7a¯Eäþ{Ƨ„ïˆxÃÀøl¿Éú*ð”2ð {¤‚ì¦â >ˆ(œ{ÜH’í^Ä8”C "¥ün]‰ƒÛæBÜÎm&µð ¥° ) ŸðWƒ¥ðˆAž¹XF˜{däiˆ€€ä–¯*tn! ²(‹âÀ*CÕ^­«o—ê¿qÇð DZÎñLÅ\Œíöq\ä±Ó( òº¬L˼ "s!rŠr#OrO>2$o¨$S²&WÍÍ^ò†Àʆ²(2)—²)Ÿ2*ìx2¢*Œ,Dz,Ï2-ײ-ß2.ç².ï2/÷²/ÿ20³031³þ132'3.€"°òÐ*ï&GóšY²37h&K36ÏL'W³5Cs63ÐrsŸ^38—3»l³8(9›3;‡s:¿é:·³ï3?÷³?ÿ3¬²=‹©++³A4B'´B/4C7´C?ô13ó@‹i<ϳE§H=OôvVt¡´‹°ñ[D›ÄäE·5kôF{3WhaŠä#H;@èD„¸•tÜd4JC篭õJïì›¶º$M›ôM¯0þôŠð¬–ÜK›ÅÝ5ÕØtQ'؆ ‰ÃÔ’Ã*¬ÌFaÓu{„f:î‡1ϰEnXYç8Gºôû¸9}d‰›ø‰G²J“ÍJÖIyÇŒw’G%GC¹•“…€O9ZV9Ì|õ•·”kùOrù——9 ‹¹†’¹™¯ù#¢y€ª9›Çy˜»¹HÂyœ¯ùœÓy5Úù—yžë9$ò9[|ôO‹´x³¹¡¿‰M‘„þû>†«;r+÷¸¯¾¹0·ê/x7úæ›'ØþÛâ!¾Ö r!z`E¼ýl‹¾ÔKD.XÕWVYLð!òýö—¼ùCoïË!Ex? ÎâÔ¿Þ?@”#á€`A&E ¡Â‚ 0u(Öa¡ƒŠa¹ 8þîbB `ú e'Q¦T¹’eK—/aÆ”9“fM›7qæÔ¹“gOŸ?:”hQ£GoªHF¥%W.-¢쨕` -8Šé éÓ¨Òà(xÁ\ÁEŠ}¢×õkر[³&, U*U«X-&Ĥƒ·ÅphA0mÁVV\0w‘¬Wô V,W†S«^ÍKäÞ³ ÿެ¹ng²Nù¢Uë9!jѤq34Ý7tfÁªér»[vá¼®4T!ÑikÅÇ‘'Þl·`”$M"Õ¾{wïßÁ‡?ž|yóD•&,&Šˆ«ˆpåJDà¸+{  þ ×kï=b §"Ò‡ ÊÅ”5ܯ¿ÿ[ªV Ð=øä£Ï>üîéS`a@” ¬¨ˆ3`†“‹ŒHT>ÌOBÿº°¡øæ«/Ä ÙÛÐ=¼o)ÂôãG40Å1dˆHA,¬I{¬ñ·*“œÀ 4и¥>)`hŽ [|q´.—'*é¼;ñÌSÏ=ùìÓÏ?Å)=ã-ÔÐCñPâÐBµ€pÑG!t´E•ÔÒK1%¨ÒL9íÔÓORÂì ÔÔSQMUÕUYmU»AAUÖYi´Ö[qÍU×]?-ÕÕ_ VØa‰-½#yþM6Y˜mÙHŸÍÕÙf••vÚh«ÕêÚlIÍÎØoÁ WÜqÉÅVnÑMWÝuÙm×ÝC}-WÞyé­×Þ{—9÷Ý}ùí×ßn(^| .Øàƒ6O߀nØá‡!¾tà„)®Øâ‹1†iáˆ9îØã÷8ã‘I.Ùäq7Yå•Yn¹WoOŽYæ™i4åÜhÅ# h ¢… l]&Ôg =5è£û¹æ¥™nÚécÇ„”èhTPj‚Z¡éE³&t+æÜZìu•~Úì³ÑN[¥s$Zâ„Ø’´"rè›Pºá-H‰ëìî[Ù²Õ\ðÁKf{ËXìä¹mõ»ÎE—ÂÄÇþ)—fÂ1Ï\óƒau6«5H¦‰¨-âXÎ@(0Ïf ‚@oqt&­„T4ZÚªe¾Qj4uÕAŠ]ôûÖ†œ“_žÐÞþôÔI¥VœNÒ g•>²ZJ*ŸVÀ7/ßüó…5Ü3zNQNÒ0‡¬ˆr°‚Š|è3á QØ'õeM¹(ÔEÆñÁV(!)H ¢ «õ40TWðY$†áàBÚæ i¢¡€¸¦! ˆG$þH:@Zq„]ÄT SF1ޱ;+$Ì7Ì‘&<~[ 02P4ª‘Èô|XX|¨ °øCæ¸Æûì‘!„4”!ûøÇÃ@ Ø^ÄÑC/NRn—#ã%1™É¡˜ñHqqE=3˜N`‚!ž$ÈG‡3†DÑBTd)?ñIØÐ!È B¾sð[_öQ™eíf;ÛëPÿ:ØÍÎܰSë5¸µ±®],ß”if;›ÛƒöiEêÞ"öH¿Í¶¶7Ýmu‡‘ËÊeîœ ]øBï¹ uë\Wìh»¸»÷îÀ{îHo{ÝgÛÔËöº÷6[a²e B_‚Ø·ø_),ð@Üà—Y¥hãÃ÷Æ­aþpX„‡Ÿ¡ÆÍqÏœd†‡éþá­äÜH 1AYÇ;²n0+†yÌÓMs¥« ä­<ðÈ·RrZÚ7:VO,Oi]ˆs,G´Ì—v„!Ù2˜a¸oÎ瘓1³¹&µ —iF™:)¦²×ó v±ï_\ž?êÁ)}ˆMí Amf…zi¿kÆ{Þ“ÎwÉ\¢Õªs¦xýx+ë}òGYå5újqÞó¥7Ö¡EŸú[‘Þô­Ö«U{hEÞõµ/ìeŸ{C±Þö½Gîu|ìøžø¾ð‘¯ÚŸùá:~ò…ÏûæOÿNßæÔRrÌžýl±£‚>p¥O}ñÇú~³Õ´ïd‡íû± ÿøáïþò‘ «M¿µaÛ~о?þýGÊüßF܇ÜÂÜôϱøÏÿp“Ú&¹–«¹¢Çƒ´Ëvü­t¦GuŠÒÀŒ "ò vB'»ú­»,à†è+p}áÖ«½àáX#¿(h~,Ȉ¬¢"$NÚG*îâR,ãPp®T‘0'š®—Jn+VÎZŽˆøË ˆ0åLå"ÌåŠ0—/ Á°‡#Ì$Þ“ É‘ê³9̰@wg@-#ýàݪ„>½ge=1”%lÓ ßë´“7›ÐÇüPëv3Ü @<4™³!œ:÷P:y"$‚"¬seT˜JT0r Œ@[ *¦®"T4$ºîB3ôHYñH8q½¶ʈãáòˆ5¤ì5"¨8êî l£´!–Tá*œJ#0À–c˜`ƒLá‰J³–ÊÁûüñHÖ.:èÎ5ÀN"‘´óÎ…m‘'+Bñ~’£^1KzÎ3dqP…„Ÿ¡ÎìFÒŒ4*!üô³AþâJFÊLÐÄLcä:u£„¤"ÆA`°-q£ðÜ„I Õ+ÑH÷CÝÑò…Sp*­RÏsV‡±VßÕôÔW÷XÅ'5ƒõÂz•X!ÑX“ݘ5CõY!mX£U馕Z‘îZÑ3[µõë–•[ÁÐ[¿ϬU\;Ž÷]îÑw NËUÕÂ]Ãq]ò…Ð!3rý¶2^ÁŠ^ñR]SrY¦­·ðo$ýUYö&µÔj%°% prÖ"çuaÛ±mÞr!æ2wÊ2,™D±²zT!„G˜uf£c!°Þ€ã)õ-•r*u§>®bcM’mV3õ+3þE0u2¶B¢`~ð€ æh+S¢36 s4ÊSg‡ìbyþØÆºÆ³!²³E9†>(8­(l{ÓéÕ=±P‰”“å$ kcSk£Šk»VüØFB)”@iAùh¤öp£oý3‘äÓÆÚ0?ß WíVÖò6=AOEo”F©CVÌ& -PVeY¶f+P+cvw>ðºh–v–’*±…?£xŠWö Z–‰á-A„uê}‰ì\ª–ûQ ’Ö–¶iŸ–›èJS¬1ð¾¬V¿"3Ü.âŽóXi÷Ø5£VD§‡áx\$9þ@m{8”ªmgHmCtëfém!LnaÒ"“,n¡P’:Y·²–ƒs8’iî\ôóq…xKçÅâspohqg9ûS—ïÃpsÙ‘UÌBø•aÙãæUô’myDâs7B”F×SÔt ™p¥WHMWškéÖP÷˜“¹^"Kƒ×š@ÂvDJëNíʉN{KC18êNzÛΓ[3xÝ:x×íîtxµöÇ9ÃÎe{©—Ÿ@"z×™)dðÖä¢Z•Qµ×QÚ‡&µ :œld¡¾ŒJ®÷ð*Âñ y ðs/%WßeƒV I:ÀL‚ƒñ¥3öú~T¦Ý™išÛb§þÏÊ¥wÚ¸zÚ§½ ¨ƒš¸†š¨«Ê¨Ú¶’Z©‹Š©›º´ž:`.Xˆßªgoª)’†–[FXUùU«‘I§¹ºÕªZ`|8†Yë`ÉrÌú¬ã׫õl­ ‚%ƒøÇ(ö­ëI®‘WcáÒ‹m)¥8eËx6´²Ò °s±]¶©JvŒ »ŠûŠãÍÞnÖ¡²‹Û»L¯w/®ýšÓ|¶ˆÙ"™iY0QNñ *N; º'µõj+±7ÚÖŽ¨6m{Âê´F´G›Ò¾V EY H“E.äp˜«òMme»BLy 9¹=9u³’—Ó·Ûk„{¸mo#ΗÑþ=ÍP N¡Ì(Öp§{›—͘[‡—w?¡øHŒî»‡O¼ñ·r±Y›—›m¯ë à ¾!ëî¾±›G.HGãD™äšÕÚ·Š”¿­Ê¿ÿ›p_ô¾ÔT@ 0:xÓÙíüu÷™í¬ôíÜbžë”O1\ù4¼ö’—z=¼£é¤  5¡ ŠÁÕ¡-ªM°7ËŒ¢]•£/VkÜÆo¼õÒú_PÚRX¸¥zÊýŒ®£ü€¹¼ô’z~¿ü±Â;̳¬ÊË<|¶ÍÅJÍלrÚÜͳ ÎãÜoæœÎ•ÊÎïÜÌõ\òø¼ÏÅ&Ïÿ¨ä· ®ZÚ‹û¾zÐ#%ËCþРݧ½ Ðo_µfô+RPÏ|Ò7ÌË+#ýÑÚ4}`U—+RnØÓA=ì*¯3RÔ{ëhCæ^¥ˆsOÒ_=Ÿ”˜³Ñ˜°©ë*yr‹—ø‹3{L6VŰÇ,3—˜^´”D–'?–{¾«ÙA–TŒòe¡ë6G·—½ ªýs€ÙÛX?½×ÍKŽy›³0£d2yp·ùÇݯ¶Žã§ˆ„¶ƒP È¡àPÁ2Õ«/?347óHöÝk䋵ýàžà›År£á cŽßý‘]]Ýgî\(Ù’OùÙqÓmoh»-ù—MתSFÒ`t:a ƒl©S‹R+;þIeäoÌåÉ"æÅæ_HÕYç=å—S8ÑÝã?þHzYŒ³b=ë›Äè(¾ÅØ…%TA«Òzˆ>C€! )pýÖ@Cë§F AŒëÀëÁ^ìmíÙó¾Ý{¿;žé n™)œ”Iþ9 B™9Àñ=!.·"´à<À<@H¼æ5·ðGòËvÀ{éðñ_ª–Y$¿“öž!Ây×Óïoë\ÌyJ7‘v¯ôÅ—ž5Q‘ŽDMωÀØ€z´0ºÔheÿž ¢÷meAœ)hßöq׿"N¿îþ9ùxô5© ™œ{·¤Ry²Qw±É¯¡h‰–·"¾¸§þ€ŒÃú+âûA:T9•y/za1üÇ¿üq]ýûiú©W¤ïú»ÍX¯\RBË <ˆ0¡Â…  l1¢Ä‰ •ࡈ1£Æ;züH e$Kš<‰2¥Ê•,[º| 3¦Ì™4kÚ¼‰3§Î<{úü 4¨Ð¡Di2©Ò¥L›:} 5ªÔ©E½Š5«Ö­\»zý 6¬Ø±BR=K€ÚµHѺ} 7®\·VÉÚ½‹7¯Þ½|ûúýk´íÜÁ„ >Œøp]ÀŒ;~ 9²äÉEÍ&¾Œ9³æÍœCޤ :´èѤK›.+¸³êÕ¬[»Nûù´ìÙ´kÛ¾}×òëþݼ{ûF¼·ðáÄ‹?¾L÷ïåÌ›;¹ôéÔ«[«|jêÍx¢`lK‹ÉvŸ›×ýºúõìÛ»o™]êxÌ.ÒˆûN°•†Ë8ÒT9 p±½G`(\|Q͇_T˜“Q[äü—ÖTJÔ`†„¥‡`‡~b_ BÅ`…QurA„!©(&Þhc\†Hc6Þ”rÅX ©¸'ÀÀrF# 0äÄ@P£¸âÊ(ƒJ®ÑÖŽ=þ¸Ð¦ÀL°E8¤AÎ*}9d‘!‘這hªI0$ä%˜b: ¥@Ž9æZ]~f j•yfškŽ)$þ‘Fzhœ‰ÒY&1^ŠÖŒ8nÊi§žž¤\ ZÐÁî„d .XÑ AVŒÚÁ(‰¢E.¹h!Š«Zðpk[¢’jêBôœR ¬X)kTÑ*6 ª*«­¡Ê2ë,AyüéÀ°ÅëÀ¯¥ž h¹Âk,²]Ûì³c¦ºj«Q»î²íäB˜î+߀Ÿþ pÀ*§Ê}ôLHã”/AL|¹}Ðnûñ¹„É‘Oï‘Ò—_}ö"¦&*Å!½Ûm᫬Ðj+®³²ÂZøª…÷à/ôA¨ÓCP8äŠÅv’¼¶œwéßÿÚò ‚Ôï~éÞ÷Â@„,ðøs€þøç?m$ Xþ(`ˆz$ŒÐ䴇ª,:z€*`Á‚ýˆïH¢ ˜ä€*ˆJ"è*@,É…0”aBjPX(«ähË'ÊERN„¢f‚ Q‰ácˆ,Á4@^ÙâÃÕD‚<1Š˜¢ÔÔhÅ6–É?%¬ãD¬·Â<êq: ñ „<¤0å±£!‚G>*r‘ŒL‰ ÉH(‘¬¤%óøHºHíf’ì¤'!BÉKŠr”–Ëä'O‰Ê΄’”¬lå¿L™ÊXÊÒ0«t¥-oI#XÎÒ7Å(Æ.5TK\ s˜:Ê)މÌd*s™Ìl¦3Ÿ ÍhJsšÔ¬¦5¯‰Mþd¦ Ùì¦7¿ ÎpŠsœÊ &1ωNêe“ìl§;ß ÏxÊsžô¬§=ï‰Ï{þáùì§?ÿ Ѐ t ›ñ0²ãËxÆ4®±oŒãëxÇ<î± ä yÈD.²‘Œä$+þyÉLn²“Ÿ å(KyÊT®²•¯Œå,'…hq6ræ0‹yÌd.³™ÏŒæ4«yÍln³›ß ç8ËyÎt®³ïŒç<ëyÏ|ÎÞüç> zЄ.´¡èD+zÑŒn4™¹ìeGKzÒ”®´¥/éL:Ðmæt˜=­éP‹zÔ¤.µ©O}gH÷Ä_Fµ«_ ëXËÚÒ°ƒÄ ê5³…o¸˜sf`Ã9מ§ŸÕBìaÖÌn¶³Ÿ m7«š'¬Ž¶µ¯ílop®‡ f5Ü òø5 SýèoÙÓ¾A6Þ íxË{Þôô´wRízë{ßüî÷º÷ðƒj|þ̈x=èñDüÚ Úȃîg1« æÎAÁžðp£CipDÅ/ xDÜÏ w8ÄÑŽ4ÐÃ&¶º_>òH" þ®¹Ío~í{ë$ß8ï¹Ï.ê?ca·9:Ìqƒ˜¿Ž‡/T†r\ ¼X„Ô}ô¤/Ì30‡öps'‚‰¨8œu©£ÃI·CËÓ=ðu¿|æ@¯»ÝïÞhç„çxï»ßÿNç@§WÄ«¡Š_óÌ¥ ø±×’ˆÚð`F<˜)k7ãqÀâsÐøË¾åì„yÅ+~ƒ7Àð¬o½ëѬwœðýõ´¯=Þˆy@bäþy(ãÏîÓKâèïýïÁl|\«‚ðWwú·Ë=î0_ ¯%aûìk¿î±¿Éì·þðÏ›ÓÕx‡ &øÄÇ|äžžxáÓ/úuß@7»º1_ éWî§¿ÿÿ?~]¶j­€h€²æið X‡tJÇtë§{€ZPqYç€\g¾væv?0öwk×vúG}ë×Âv€)¨‚¥Ö}6ñ}+ƒ1èhž¦nÇx‡p¾¿yh W 8ø:¨è i@ Ç ïì§n¥À *°Ð'È&(ƒY¨…y'€ÔF€[†ax‘Pbh†gHj-Xþ/ˆ†mè†ñv¼Ðæoh‡w˜hjHlˆ‡}臧À@Ü ƒhˆ‡gz8|ˆˆèˆ‰‘Hk]¸v  瀉™¨‰›È‰è‰ŸŠ¡(Š£HŠ¥hЧˆŠ©¨Š«ÈŠ­èŠ¯‹±(‹³H‹µh‹·ˆ‹¹¨‹»È‹½è‹¿ŒÁ‹P>¡ …ŒÉ¨ŒËÈŒÍèŒÏÑ(ÓHÕh׈٨ÛÈÝèÅ‘&‰ãHŽåhŽç8gŠ(ŒˆŽíèŽïw¨Ž1ÁŽñh÷ˆù(~óõ¨ÿ)7Ç/በ© kéÉ)‘Iþ‘yH‰:a‰Â¨‘É‘é‘ ’!)’#I’%i’'‰’)©’²HŒÆø/ “1)“3I“5i“7‰“9©“;É“=ùOá8€)”CI”E©gÙi”KÉ”M)‘HÉJih3à ç–  (X{ZÙl$HoZÉ•X¨kò–´leywX‰‚Ò‡–f†–mxÏ—“æ XfP¹R)–%øf*@?(m`&RPgso^ùjgY…ãw— ؘàv˜þ‡˜{‰j†igƒ {Ž™ˆlf™Ù™•6™™V ôPˆ¸v‘{÷…G gØ€IЗmŸ¹™i(g¡Ùj–¸É™¦'h²þY›¹˜´™wÀ‰mÉ•¯™™N˜Ž»y…¾I™|©iaÙ–µVtÁ)gÞ° wyš²—šyf˜Ù€ žI–Šæœ›ö›Ï™˜ºyfÒɜֹgåi•Óçž¡Ÿ)ŸÅyžëlšiŸûÙœvƞ™œºÖm¼9g0°zë¶Þ×ê %÷pæÆnV€™¯0y  en`Pià* ¡k±žÔ &Ù€&ñ°l#‡¡Ê¡9  ¢"jf3ú¡!ºôТ9°£{€£5ºp ¡zf‡pÐ÷ D qe†r*Çr÷¢ªqWHšq$ǤCjrš£6Z„Vúx¹iq)·rþÒ¤!Jpf¥;(£4ª¦nš¦6z£pj£SÊ¡Fš¢+Ú¢àôí ¤ ˆ§\¡wI¢.š¡TzfaÚq^*¤~f¢Rf…z¤B¨¤Ú¤¦©cê©~ö§ ›6©oú¥k ¥$hsZ©‹š§‰z—¡*¨‡©­ £¶Ê¨-'«ƒjª‘jfXš©[ê–» ©q ¥j©V¨FʪZÚ¥Fúh$º§äÀ¢ è§€:«90­Õ*£÷¨#r"ç–:¡Fz­¢z¤lЦÞêqЫت¤“ ¬9Ð0f0Ðò`vÀ@§bö¤gZqŽÚ®° {פ¸W«Îz¨Íª­ê§þ â˜~†vQÇŸk–|9 R€7À `æ¸oP‡Ê¹žhàk9à¯P *ð;rÛ±0²H²gV³#[‡í a6a—³7K±Og±è™¸uC›vgv hÒ'³‹_vGë´xvD{u+uA[²]GµóYqM«uÒçµ`F¶J§ª +²B|9p¶8Û¶%µ0ëi+Û²/ûkNÛ„ÊhuÛtZ«Ÿq¸g¶·sûk(Û…kfH‹µ\»ž’ë¦{«u}{—Œ›¸6[²iû´V¸¹: f…Ë•À·`¹£Ë±R«±«k·–«t}hqû¸W¸Kë–§þºn«¹¤«º3Ûq›µ¸[ºa†·.ûºì§»Ç«·9p¸UûgcWv“+¸•ëgº[fž+}Ï+¶×{¹‹ëk©‹òÀ9Àò qðEÇ =›½N»½^‡¸ìVzæ6tEÇ€Z¹ÕK»î÷h ê‚ êŸžw|&Ûf« ð²`ö€) Úp±ëÖe¦ÀPq ¼À9ÐÀ`öÀg¶Á2ÁÕ  ·¦åàkÜÁ~öy¡g´ø§~ zŽWfø'},f˜f.¬x Ã,ŒÂœ8ܽèWyÒ÷Ãñ—ùºGì¦LlfLlÃÐ fükðç·`Å;Ã{Á ¬fB¬Á Äþ0Áý—Åg¦Ã*\Àw¹ÂÀW}V|—eÆ Ä4¼ÄbŒÅ^,ŸfÅi|ÆgÜrVhN<Ã‚ÜÆëiÅLLÆaÈyœÁž¦È‡ŒžÀFÅ~ ÇaVÉ`ü ›l’ü¶U\yKfvé Kìe–éŸ;r‰f¡NlÄÎi©«°{‰0:È£ëåÒhÔîá ®Ü ˜¿è¦užÞžÿËÖÌÙᎀÐnV  f›ðy0¯nðð°àÓ«þ u0W? ,}þð/£oðÓ[fj`ñfeqàÚðê†ï¦ðd„§ƒáª;rðw„IzB¸òÇw_ðß­3²ù~• wÛ¦«*ò-ߦՠêF¿óÓ«ôLïôf'?×GŸ0Oñ%f ÿðð «ðzÛYÿï1ŸäbÆõ/_öoõ¸m„H8ðO¼@¯õU/ô7¨òƒÞØiŸöçš­Ä©óT_¦©ZyK¯ M÷‚_÷p ô5Ÿ÷d?ñý¾öfG¬S‡õmf)Ÿƒzÿi—ø<ïi‹h‹Ÿö¡?òq—öÀéõo­—ßú`þ/óp?rKØ„šº|ô~Ïà«®ûö4Ÿö¸ªbsœ?„9 ãN îfŒ  Õ餿?uÁÿóeIƒ6ù/§X/¤©á^˜iTigæ@ñÚfþv—þ½IhëÏoî_hð?œ}VŸKMiò þ‡ÿý9hø_Ÿò9$XÐàA„ .d˜ÃÛ „ -£XÑâEŒýdkØÑãG!EŽ$YÒäI”)KPÙÒåK˜1ed ³æÌ7qîŒÈÓçÏ—:æD©¦Œ5C•”˜ÑéS‹i ZÕjU‘Wµb]ºRk×[ÁŽí(”ìÙœ_ѺÒl[fMŠ•»6î׺þv§^Õ;—©Ú (”»Dnß¹¡.Æ(ñcÈ‘%O¦\ÙòeÌ™5oæ¹)cÐw&]ÚôiÔ©U¯fÝÚõêÏ¡~]ÛömܹuïæÝÛ÷ÉØ²¡Òþ]ÜøqäÉ•/gÞܰbáÃ9:§^ÝúuìÙµow =ºSÚyíÞœá-®@ªÄË\Oº}Á‡Üåϧ_ß~ßàßOøžlMèâ¼ä‘¢+ÿ6KP jè)å>#”pB ÃòN¿‹Â;H§m4܈DT¨ÃŸøê $o6©ðEc”1»ü0¬HC¦ ûO l°‘(Bѧ÷P„á“TrI&m«ÑÆeÂþsC›<´¨&-ª°¬ GèI£zež<´)C 5À(' wTèoÊ*¯Ì‘vÒ Ç‘šÊP 1Ë<3‡4×l³?-…¤–„È& râÙ#Uä´„AU¢ÓN<R”QG ÍaÓFN+Bäzèy¡ÄHš4‡j*]H(P;²O3ÑT“M75•µI`ƒvXÈž´1¼x|Q y¥É0sn¸Á0F DnàF GÌñe7Òé/Ùe›ÍáŠh§­)º6ÛmsèöÛp]4nȃWJQá…mÛq#‡ÈqÓvBWZsjâ×_€Ý·ßãˆ\fB']sþÐÉA`‚ Îa-­z– ‡+vö]m¹õ\qR!bk¶ùfœÙ»Ê(ùˉJ¡H‰s’3Ö„´GßÞÙSmú:¡jÖuÛÍAi¦rZ ¨íµ‘ƒT&‡D8R‡ž3³I¡««1Ëì¢ ¢[È©«†ôèJÓÎaí¶ßžÕd»Ï’k‚¾Î!l™‡ÎùqÈ#—œ©¡ÄQì“ûkWïƒ.‰' U*(9}ó<÷ÌÁsÐEÏt·œ5).1' ¬TˆÚƒD´ØºWƒØ º&ÛqÏ’èÕoçjEg…§šfÝsàÝwm€² â¹"þóÐGWñÓ_'|ò™4ÃþË4&¾R#Ãð%Ç“ã®)›Wz?þù ’ýD‚¨Â{PÃjbF H„9b?« °€ÿ‹  Àúµ/T X²å E€¤  à'ùäHåca ]¡óé'}5¡‡œrPCšØAZvðBÞP Dœ0ð0#1õ¡C‡êúyòà ŽˆFDbÑÞBwù"5Q0à1D`8"!JdXM²¸EàÐ]ØÒâM®x²1¬‡]ü"<ÂØ¡œñPâqÄxÃG/$d! éœ~g†ÜÂ#·Ô¥/…é ›øAæñ 4Áã°àMU§;Õ¤þ%-‰I@i’“‚£ Ì¥£Tà°PZM¸I,‘HÈ¥B)YÒ5qD#sÌZ¢ç•™R)P¥ªvÝ2—’Ø% ‚Ìa:Ë”—Ìä&;ù)Rœã$§nâ¨+å9‰9Piw¢&>å¤g=íYšs 'a¹g?ýùO€2'Ÿ²Ù§GÞÜ&  ehCm6ÐÐÔ¡¥hE-êžÊËgåhG=úQ´@4iIMzR”f%£èÛhJ]úR˜¾T¤³ñŠä’—!†üÌAzp*˜‘äÔ/YéËÒóŸ 3iU›ÚŠª†µÕ޶ Ó¾!µk)„äAé°^þ]MhhóÖÐO Ïæ Ëÿ9ÏØ×;™•­ÍíáÂŽ+¬ëÞê¸çºì/aÚöëTdÞÚÛ{±ƒj†‡«¹ =úÛLÎ÷é†'Dü@ oø"¸W-îãYÙßÏ[x»ËBz¼!—x&ˆž ¢†jÈÀ‰õÞp´=Ùiƒ§¦t/Nìký´ÛŽ´eWƒì 2‡”/¸·”£°ÁßÅ…slÏ*è€Nô«žs@y åh®Ë×t@ò×8ÇZúÙ¼a©ðAö@ŽÌ$·'{RC®‘š.‘‡Vƒ |†“y‰_¦+ m¨Æœ¨½‡ž]Ÿ™u ‘†Ó£ÆþŽ|;ÔÄïÓÁÆÆ/Åcî©ëÃ;Þ ÷þ`~ËrÔØÜoÂüiòöbÿ8ËÃ2ŽÓê!U\Ù‚Ô`­k÷$FHB ¾ÅƱîA–]ø0=û~ C_Xi¡Lnˆ;ƒUî¬bÓ˜\ŠoÓIï,5¨ò›ÛD%÷9ËdRv,º¹Ê ½Öû©ô&+%æJ§;Rþó­~ïÌT½ ]Î#TA»žZ¦{’ìk¿ù[üƒ&ü6„ˆv,;,íúœ<(‡vè+¬“=[>©â3«É誟ˆ„rXˆ*‰xÊ*—$‚HAë0ªŒA 1}j)üŒsàþ…F0‡˜© Œ¹£@B"Ä'$(Œ,„r*ÿYB °#zà† ,–  Œ"¼B,ÔŒŒŠ$ÌB/üB0ĉ-¼‘. C3ìÃáËÞÙß8ÁÊò)΀A?LÄ0D’â‰ÜŒ©"«âŒ¯RDKCFÜC1ä;Öp+«Îh‘KE,ÌDAÄ,¶2Í"G‹±#EXì@S¤ ä«Q€Ca ô*°ìj/*)åÒäk/è’.êŠ]!/>!“\Ñ.fü[\ÀdT¯€7gô“iÌ.–`/ç*FCÆôÊ.ôþB¯hœPj0^žŽ‹EvüC9©ƒ±‰˜xÁ¦q2—¡—dŠ7[µ,“Lj83ñ[3}²xÁG!£GÃC²|ì1~CȇŒ²z£ L³‚œÈ˜QH…L"32‡”6ˆgkG“ô¸YtµV+ˆ»²N³4°Á4Ië74š•¬Iª¡4›ÔµQÛ4Më4”«ºR»´…ûɦ1Jâ:\ëI¥ŒI¤4ˆ»ù4¥Ì’÷#ø£ÌU³OÁY¿ý¿l?ò3?ösO 4O EªÄ¤ŒVÄ 4Aß \‹MDÌP=© AÔAäÜÁ}LQ5þ»w¤©°k‰«³¦&ü¥€B)ä Â-R”ÚJ#MR% $]R'}RiR(R*­)­R— 8ÀR ½ÑÉÚ 0 S1S2-S3=S4MS5]S6mS7}S8S9S:­S;½S2]€ÀS>íS?ýS@ TATB-TCýS/… O(FmTG}THTITJ­TK½TLÍTMÝTNíTOýTP UQUR-US=UTÕ,¸†TmUW}UXUYUZ­U[½U\}Ô_XC^íU_ýU` VaVb-Vc=VdMÖbµ=Ð PVhViVj­Vk½VlÍVmÝVníVoþýVp Wq]Œa¨„J†qMWu]WvmWw}WxWyWz­Wy½]аW~íWýW€ XX‚-Xƒ­ÖXЃ`=ˆ…ƒ}XˆX‰XŠ­X‹½X‹=†I ˆI8ŒýX Y‘Y’-Y“Ù6è ¨„“}Y˜Y™Yš­Y›:Ðg gÐ:¸Y  Z¡Z¢-Z£×ˆ‹ˆ†8Z§}Z¨Z©Z£Ýi0‹0hªíZ¯ýZ° [±×jÐ[°[Ѓj[¶m[·}[¸[(!† Àˆ ¹Í[½Ý[¾íÛª„apÁÜa„]ð[þÄM\Å]\Æ-XehVÈ\=P†Æ­\˽\ÌÍÜk€… †-hÖ-èÜÐ\Ò-]Ó=]ÔŽHhÖHH]×}]ØÝÊ]]=h]Ù½]ÜÍ]ÝíZÚµÝÝý]à ^á5ÙÞ^ã=^äM^-^åm^ç}^èõVæ^ê­^ë½Þ_^ìÝ^îí^ï­íý^ñ_ò5Þð-_ôM_õEÝó]_÷}_øõÛö_ú­_ûýÚù½_ýÝ_þÚüí_`Ùÿ`>`…CýÓÈ„LèöÓP@` ®`¿ …38 Þ`î`þ`aa.a>aNá>ƒ ¶`~a· þ…Np®a¾aÎaÞaîaþa b!âa$Nbª•a"nb'~b(Žb)b#Vb+¾â£eâ)Þb.îb/Þâ*Æb1ãšÕâ/>c4Nc5c2nc7&Y3Vc9žc:b6~c<ÎcŠã:vâ?îcAvâ;ÖcC>äåã:ä fäväAŽd.dD®dK¦WE¦a`…b°aHþa«p…ÈMä)þä?6S?¦ WH…>ÐäªeR¦á"PÀR‚"¨á&È0‡5(åþd äK>fdV×LöcoxO&â@.†qp‡VæF>evdTþ~fàNða–fj¦á Hƒ‡qˆ4Èf‡bèƒS˜k~ä6ædÎg}ÞÖe€(°g¨‚QpW…*ÐdNX8ƒ\öcî€<f‚6h„¦áb` ‡æo ‚ŽdXè†~è*@…4p#élæf—†hîƒ4¨g‰¦á°… á<è€ÞæI>â}j¢¶Ö~v€ð€N†iQЂ\È-M6p+¨f˜–æ g¦vj¨–j°- …Rþ„4Ða¾²ª¾j%@gV`éa~ézfd™çqØjv°apV‚þNh€„¶k˜¾a|.jÆnìa=jذd`xè"`Mv‰^媇¦lËÆl`‚‡~ä ‡/hÐlàl†€v€"é­@lm¦áqø€€åÏíæá*äS€`ØŸö쫸g¡vlèŽn_…ìbx‡€iX8ì*€…»¶æ>hjaÎnáænoO°^kn6ïá®çî®ëG¦Š4ØWNìïÖNƒ¿®áÀ¾áb(‚Tˆ÷Nl^lé>p ȦmUèѦeÒÎmï†Î~pÚ&mÓæ\`#`mn–mZ¦ë—êŸðÎöœ®aÎá þ‡'fOpŸq‹Xp`ƒTä¦~ê¨~o¼…3æÿjƃ±.ëR‡rÀõh¸–kèGlûrsFguž‡Sèƒb pP‚)j?s4¿/†¹n0h8l ·Š4 jŠ~sWˆsŒ"ކéqPœŽò@®‚p4°‚(ïÿ骨óý¦mV@$`R¨á5X@nTXn/ðçNsQGðe–d4.`0õ4ŽñQoõ¡.uUßâQгŽõ/fuWßud†u\â ‚4°øu/Öu^OvDöucovg/æPWvi¿dfvk¡WudŸvm'ãj¿voälßvq·ânÿvs—ãpwuár?wwÏõh_wy'÷~w{÷xŸw}g÷z¿wG÷|ßwOà.xƒÓ€x…` ‡xˆx‰ŸxНx‹¿xŒÏxßxŽïø‹§€…y‘y’/y“?y”Oy•_y–oy—y˜y™Ÿyš¯y›¿yœÏyßyžïyŸÿy2;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_t_7.gif000066400000000000000000001022301343257752000272600ustar00rootroot00000000000000GIF89aís猂„|äÂÄŒBD<.,Ä‚„lfdÄ¢¤œnlTF<<¬†|ôâä„f\”"$ĺ´T6,¤BDìÒÔD:4Ä–Œ´–”$œzlŒrddRL,&$  lÔ¦”lRLdJDŒ64ܲ´ÄšŒ”ŽŒ´Ž|¼rtŒVLôÆÄ|vt,”RTÔªœlZ\ܺ¼œ‚„L64|b\\NLüòôLB<”rl<64\F<„nlüÒÔÌžŒt $"$Œ.,T><äÚÜL:4¼–„Œ¼’„|^TœŠŒ äÊÌÄŠŒ´bd$Œjd¤~tœ:<¬ŽŒ¼z|¬RTܪœtZTì¾¼|jlD2,d&$´Š|ôêì„jl¤JLÔ’„œ~|„zt4&$ Ô¢¤ä²¤üÎÌ亼¤‚t|f\üúü”z|\JLÌšœœ.,ìÚÜL>4¼žœŒ´jl¬Z\t^T „ìÂÄ<2,̆|tjlÌ¢”TJLd¬ŠŒ„j\¤–”œ24„ T:<¼~|¬VTÜ®œôîì¤NLÔ¦¤ä¾¼üþüÌžœìÞÜŒ´nl¬^\„œ64„ Ì–”ŒvtÔ®¬”.,¤†„TFDD:<œztdRTÔ¦œ´Ž„|bdLBD\FDÌž”L:<¼–Œ $tZ\|fdL>½çÓãËŸÏ·zûûø×£O¿Ÿ}ÿü(à{ôhàmÙ'à‚ þÇ ¢RÊ×9ž… fÈvèá‡\)¨áˆú‘Hz;1N…%šè¢y‚(ãŒ4.%â‹/p„bò ‹'f‡¤ˆÊè%ùÇ-©„aÄvûí!ý Yä‘IV¸d“Oâè%1Ö(æ˜dêtã—#PÀ;P•B^ç ÜpƒG–'žCB Uœ%vRÂ9žœtÚ‰'zòé'š/†Yæ£FšÒ™Œ>Ø¥  ä-C\gÄ¡Ü\×B’ÁÍoh$œz ª¨þ¤Vj¢£’Öjë­Q*k€Pq©¨Š^*¾’AÅ¡qj!bAáªU^Gì¯Èºëˆ´âªí¶Ü¤ëµøpi¦«¦ÒÂuÜ ×*Ÿ [ª²Òžkªº²[-à2˜m·üö[ë·ùú‡›xxä)U´@Â9èÍYçîªj- 3LèÃ÷®ð€ðùëñǼ1;v@J±èF*·ü1ä6ˆQEÆûá /»+·ürÌ3G<2€û‚,ôЊü³x–gÄ-Œ.}t£-õÔòýôwI÷ 7$ð‰—[wýõÕ$MõÙhSf5ÙÜeí Dˆƒ¼/Â-7ÝlëuþÚ|÷ ÙÚy.¸¬fûmøáÝÐÄ'Œ7îøãG.ùä”Wnùå˜g®ùæœwî¹æMÜ€øè¤ v˲¨§®úꬷîúë°Ç.ûì´×nûí¸ç~Ké¼÷žàƒ/|Ù{ûnüñk?üòÌãW8òÐG¢uÍWoý‚ÏK¯ýöR)ý÷àc—=÷ä—”÷á§_ýøæ·ï¾Oè«/¿ðì¿oÿý4)þùþü÷ïÿÿ  ?:üð€:9]îÈÀ:ðŒ !´;Zð‚0‰ßü6˜·úaðƒ Ìõ8HÂïy0„(L¡C¬æ6öÐáêA+šÐÂa%ÔÐ UÈÄ…þj¼Ãëœ"‚Š•CŽùð‰PlÈ–%¡gÕðfÝÑÀ9Zô &æ 6h"öŠÅ2FqŠ×IÑŠ4fž¬ A-º"Ž0±F1ŒfÌ#Ñx@A+YD2’¨´%']ç$ÀÎDÁ2'\çU¸EJ!/ò Î;Tø*Pñ _1 K˜ðT¦PÈ.AR’”¬ÜÐã rÙ1?;Ô£,ßÇG2øÑf«r˜¡¨”¨>]§tsÇ(¨@\G Á€‰mÇ…, `0Rü ²øÆ5ÈðRäiO¾$2•ÉÌ #T°zågÉNòñT©ú£µÖÕ.h¡sTñþÂÎ- ‹ì˜‚ˆ¶dš<½s‹q‘!©¢ƒ)„jœèž±úg €DbŸêtÛÉQüMBͲ"¾ÊU¬cEìÀ6Î!†&<á—©s¦v¦e¬`µ€i+à„Ÿnq®h‘¡1=Ѱã f´=±ì¨RWËd™ ]ôrUÄ„Êìü‚¨¸8,š,·T”×)À(8@d #EÏVßuLÄó¨ÚèRçʽ¦N,a kX¡ 6ÐUi;o0ÂUÝqÌ áFˆ'.MiRó:t ÂÈ€"!­…=lbGJ†K„®q¥«hÝgW ©Œe.ûÌdF3Q ñ:6þG*Dq†G>À©XÚ€Ee‡ !ØdŠ… PhfÉð‹Ûæv·ýñÆAÚÑZ·®#ÓÄC,¨µÝÕ ©[ÝëšzÌNؼFÞö–'©çïÐÒ‹»Íͽøý|åË_Ñ7¿Ï~ûKàmý7Àî΀ Ìàe7Á†¥\Laÿ>8Â^Ï‚+Ìá8à Þp‡Gü! Vê…E$à É3^IÄ$ŽqÑ.ÌV/  m4ân•èEÏjÂ2ò˜> €*rViXøÆ7°Ð%ïôç¯)î"vÀècÁXÈX†ÕxäðX@ 2¨“ ÄR'gçqÌþ« µ,»9dÙÒ”új%A¢oÂŽ'€€ÙK²Š«‹lä##9ÉJžhY×i%›]tå7;º2µ¼åruÉWTp• $È*q L쓘Æg2—Ù̾btÑØò£WŸw¢ê¤õªg¯~»Ø‘>õüô'@÷@Ñ‘žÕj4«‡Í"‡4b45)ÄpéL/·?(U)K] S?㲨ÀN5±·] Ò–K^é:d¬Ñ3Ž<ˉÏd¸u¸ÙHUí\UÓk½YÜšmªšÛø†tœÛfD¼ZŒ ”f%˜ÅüZ2P,¯×C½Èe2v°™E¬bGêÙzûÞùÎøßö]ªÓêLµ<Ûþð„$àA¹žÊYjÅù ôܶ²¥­mq«[MI·Ç—°Æw.›{ʨùé.€Zœs'òüèúÐzÇVô éPŸËí‹·¦oðéQϺ[|nu1b]ë`O ×»žÃ¯‡ýìd;ÙIhv´»ý+j_ûÕ1þöº¿%îCqwä88¾/ˆèg¦»Ý¯¼³qd/ß»üü. o§í„|÷hŒ´ 1^= çw‹å ŸÊŠÊÚ¼äGß ^k‚£™Íó†üÍ}«‰ZÿúØÓöHÕé´æÐ žôÀïʉ¥A£²§ˆVü‰Jy@ß‘~ö†Äð X‘ùÌõÄ-¾þ!ãú\ý…ö¹$ç;²;¿øÃðð‡IŸúÖW%ÈCüA’ÁüÞIÿúÛ¯°ÿGè D ŸÔV`õ~ÕgE«d,Wbø—h®$>¿|ˆ7p…EN¥æ6IÒK‹òiÅ4R´E@ 8`Nà´(U0jc3N¤öKt³‚Ê46è‚¡Æ¿`ëg?2‚%x‚y‚NH6˜:è<˜ƒ;€dÀ b€DÖ„MÚÄMÞäƒ&hNB¸W58L!˜N¾W`h7BOè!QÕe]Q¸ÖOÖ²@¢†dÐMvfÈkùttx3ûĆÞq{±§oX!\E†kþ€˜{‰¨{àZpE ÅP•ƒx"…8n‡˜¿v¢† È7’lèTÖµF+ÕR/ÅF&P|>ESØaŠÉmÒÒc8m­ˆzØñб!2TéVR»ÈŠÂVp #*8¥S¬r.À(‹ÄHŠ×±ŠÔ–h@牊Þh#ÙeˆdoɲzžÇ\X5R € ð Š{˜ä(>U5‡uÈFï¦ëØŽï8RâøHé˜ MpYa5VeuV×±îˆKÿˆŽšFôö…ßX‘YqZq›µl §y>õpœ@X‰¨Ä$©H,¨‘ñÔp*9ƒ@þ’"yxÝQ’'‰KC(“mXDÜ8$‰’EY–u6I(9R9)X!‰G‘ù”T1|«Õ3Ìå\5ÇrI“б5[á%-wœËø©(~DÐÝW•4·[‰g–h $[)sdÐ[â–c‰KT0•è—áE—þ.¦ð&Åu\É–b¹Ox©—0Ç•‰6]N •ùß²]ó#të^B™Û™O£™Úx™¢ég²tr§¦<©éÝ8š®igBuç¡:>&›Ác›¬ùšºi†wšá󉻜ћ¾iB­)œÈ9)”WœîœÉùœAœ%äÙæœÐyR„Ìþ±ÜÙÛÙàâ9žäÉÎè)šáìÙžîÉžƒ`YðžôYŸöù°‘žúK`˰Ÿ:W0 v` z ìDv0q`ú y$@ 'à z¡P³@ J`¹€¡ šBªà¡á '¢(úAÈ0 Ñ q¢0Š@ :°° 1z£ïóvà »€£@Z>L± EAš¤ÑS Ì  áv0J:¥Æ3v@À¥ZÉ@¥^Z:¾`b:¦cÊ µð¥hj8ðlÊ bʦlJi:§†¦v@§xz8vš§|Ê7{Ú§€:5¨þ„ 2ƒZ¨ˆÊ/‡š¨ŒŠ+‹Ú¨)©”:&“Z©˜*#—š©œŠ ›Ú© :Ÿª¤£Zª¨*§šª¬Z«Úª‘:A²:«´J«P…P«ºº«¼Z;€«zŸ0 ÄZ¬Æz¬Èš¬Êº¬ÌÚ¬Îú¬Ð­Ç Ò: ÔZ­Øš­Úº­ÜÚ­Þº¬ð«ÀjFÔZœ~×yÌY)á:®ä: ÔåÄH“BEoÀ†ç «³1»§>ëÊ®QT® ã0Y;yÄ é°(÷* ûjyøÕ¯þúD Wðà°pC¢Iœ„2Ø×+»IôHã—–8€Ð‚}õçS°þ€ËÇ$†tŒô|²#=2T™$²(³J~ö®â±>4±GE ÀCÕ0Ñ4M͈()$¿À Ð@ÒXL{2ø4Ø„OÈKO pi-ˆ‚NV„N«(×Q„'²&m’gVûXAˆ†±BËCD;·×±M{HõP^˜:Ð%êÒ·ñ8øˆT"‡™$—†—Š›kãÑ·_Å.äRQ°A[·*t·ê„¿  @R¿,›†/{M@’l¦K‹ÂŒ]åTÆØUÄ8ÂxºªÈ‹RR­Ë»Ã˜¹»¹œ‹BžûJ"g ×0¸`…»ýq Ë·Ë[¸BIgâþ&Ub› Ù¸ š&.Ë[¹˜²\íE·ÃBÅkGý¥ ´Žµ·ÙÛGžU»´pû’ZË"=ù“©8„ªR”G‰»:y"³#'ö ¿ בš{¾ë®kU|\Â…2]µ,b '@BÁ¨0\${–& ˜o’Šyr±‹v‰˜ËÅ—7+&SRÁÕÁ\__I^æëÀ”¾éš™Û¨! [¾Â‹Ã¤Ã; «I"?lÃA,ÄDÄEœ¸‰Ä9wÃL|@NüÄXœ/T\ÅøsÅYüÅêºÄ\|?ÌBf|ÆhœÆj¼ÆlÜÆnüÆpÇr<Çt\Çv|ÇxœÇz¼Ç|lÇ þc<ÄbÐÇ„\Ȇ|ȈœÈŠ¼ÈŒ¼ÇÈäÅ`<É8²ÅÜ>’LÉšœ&b|Éæ“É›Ê ÛÉžL> ,ʨ|–\ÊÜsÊ©üÊüAʬ¬=® ˶ŒŠ²<ËÑSÆÜ˾üËÀÌÂ<ÌmüȺì>¼LÌʼÌÌÜÌÎLÌÆ|ÌŸ Á·\Í™ËÒl<µlÍÜ\!؜ͽsÅI¬z—c*FCšÝ¬Åß Î¥#ΛljgÎG”D޹γÊîì;ðÌ ™g°d ezøÌÎûÜÊÔ¼zØ£zü!·•Ò{ .ú|ÐïœÐ:Â#>1+KH2Û%ˆ¤H5{~§ô}Aò³Û±³Kþ(‘`EJí}©t" HŠÑÝÎm8D«&lâ&3„øµ–¶\j.XN}Åo[M×”MÛÔMß„¶¢¦XxQ±bÓ»2Ñ98;Ý·©(ŽI"‡·Æ*’k‡»Ökòšâ›)‘8‰`âPë…wHQ—Ö‰X&Z½Õ:mѾk½ÅH-'Uf¹‹Œ?T¸Ä¬K7E9µS=•,¶x»°—Øvײ’×zÝ7]½¼ÃnQe/SUÞ«U›ÔÛ±ÖIVf…V¸;œ5‘–Íy8Ùh³Ó|À«rpÿÔËÕpŒLš5qÝ«g YAYYéSÀ-qœÕ”±×³MÛTþ³Ó%s2¦¥r;ÃZ“x,¬–Ï¥)~ù[1ìÁªh\¶T˜¸Û\k9R7÷ܲ-ÝÚlÑøá™Þa™øÁ™Ÿ÷“îý%˜ ßÓ-ßëqÄû}šýíßR³ÓìÅ.wnàC³Í Æ îà ážÅNácáþÄ®áýÂá¾ÃâÝÒÏ_Rνbd Î#¾<%nâÛ‚â82Ï]Ïdàx/^=1.ã¸Bã>œÿ\yÍD½ã0Ý>~â ­|R,> mÎóVGH><=¾äµBÝ´ËµÑÆ¢±#{º~öÑÍÒ0mhÑUí•àíAßëaß÷áâç~4¹®î2‚àÎ5ì5ïlVïöþ!ø® ÎïæïÿÞ!"NðÙfð ¯ð¨Æð _ ñýžîïMnñ$ŽñðÏñÌ)ñþŸâ0ÔÐç<Ε"ïëLò%/'_ãGÏ»U=:ŽÕ0óÐQËŒ×B-4äÉXä—=ôàqä½óÏNîh–b,¯ò¾mÓJ¿ô²A´8Ò©dÒÚÑ7} xh·ëõòBæ4+hÌEh1mIÉ×6؇ö* J`%öÉ÷²âgt–õZD«¶G½à¡¶ýQ¶#Uø0èiz>Õ|~ØPâ{^NQèÔT˜ç &‚g@‚WÈFŒï…:ïñ?DËèØ1×MÖ~˜ÖÛèg˜ntƒúfí覭,r¨úm½PoÍúå(ˆpÈFª/úXOú¥oò ýéÕ&‹à¡ü®þ‹Ì_‹A…‹ƒ¡.S¿_Š1µØÕߊýa»œT4ÝÃø øÇOž›ãXÚ5Äþý±½¸D뱎ìOë’E«Bëb¥Ú iÿÁ 2d€éï $Žă˜ÞPĘQãFŽ=~RäÈC™RåJ–-]¾„SæLš5mÞÄ™SçNž=}þTèP¢EEšTéM£ ¾1ò‹“;‚2 ùeä"1C8B•J•«W‚¨2P!!Äa׃V±j%¨áÜA°S«^ͺաC‚|úuè6/A:DACäÁºbÙ–=›v-Y2‚á¼dƒäfÎ=þÝÑäRÒ¥MŸFZõjÖ­]¿†»gSˆ6À¥u†à¯¦R­ÈPõ›_жqë®<œ 'pn=¬œ oßÀ ¶ã ñÜ»{ÿþP<™§0ö^=<6{ÈìjûíîÉ2w]¸Cêà zƒŠÐ$°@?M6d°A„0B 'd¶/<ˆ,@+9 Ä‚ŽG$±ÄΤ0EWd±E_„1F–,4±FoÄ1GKDQF2H!‡$²E9 I%‰Û±I'Ÿ„2Jˆz,²J+¯Ä2K-·LéH)¿3L1Ť’K3ÏD3M5×DÊË1ß„3N9 ,þ“M;ïÄ3O=³tsN?ÿ4оNÚ³PCE4Ñ ´QGý²NE'¥´RK/©OH7å´S%Å4TQG%uMMã¤ã’‘b¥ ƒBô4VY-µV[oÅUÈSßÄN;‘:%¼!œµØMAÍ5Ye—eVµ]9bÒ£h)š"¹Hrè ÂB3c¿ÙfÇ%·\sqzv£jÕ•Ö#!4À¶/ˆ0\{ÿ÷\}÷åwÜ#© E TŽà¯Š[:(¥…‚”Üè QR¹Å‰…“üO1¾©À½%w3a…ɸe"‚†Xâé:NXÞÉð†{_Ž3ß~g¦¹æKô n¸Á#°HþøˆtäåÈQÐR€h‚r£âRpPº²ŸƒšŒ:>&Ãh¤ïZh¢ýj¡˜Ç&“P›ÏF;íD¼…,#2Å×=n‰:£çd™R£ˆˆ:n‚æ&(¬ï†Èï÷èl±ÉfoÔ-Ê=ûwÿ½{ï¿g gyöù­­Ó¨1‚Ð7 -µÖ§Ì²­®e,*»¤6ÿkˆ2Ó¾ÿ¹_8À¡ükCþøóëØg#ÜAŽ ¤ƒŸçDgê¹Nvæsœôø'qµ#–ÿDø!Є'D¡L4e„Û…IC Õex ¦Ð†7<¡—>Á à3bEc6шEô’ ˆ `M4›[—¥«ÑŠWL[º¦¸E V‹_£¾´ÈE2úÏ‹aDc“5Æ2¶wgTc1:ÖÑŽwÄcõ¸G>öÑd װч„å¸ÈIAÑ‘„d$%9IJVÒ’—¤d ɨ@¥jUiU1$Ê_Õ#1D䉈ÈHVæjW´›,?i !hÒ5†¼)!Ò«YKwt2åF†þµ­TnF‘­Dfž,-YÆ,˜a¦gj¹IAѯ”dÐÖ/ ÔÌŽt«˜HZe2ŪW>ÓIÑD]FŒ€…o| FøKhü2Í[ròOïŠW:o¤Kp“#ôú¦1Ã9N‚Rªœú„:×e1È`g2CëšO‚г5ÿú*Pñ‰mà·HEàY%à(ûØ/ †d¦ AéêDF’Eì¥SÙé2€’ž ¦)]iKojSšõ£!©7,†1÷ä©"ÝMÀF»“µ/Ee™ËºªÔ¬‡ZfVF0¢u¨ÓÑ*[QW0¯Îõ§1µÞ/âÊþÕœ’U€ˆ'€Ð—#ˆA ¤øE[ûªR–ºte Ÿ==QYÈ¢žèË9HЂ*˜§ çà†ÔºVµ*L퇢¥š¼H!"ÂüÐ*£%ÈÕ¢5$ µ^û ´@˵Ԓ¡´@ûáj3tÚóh–³žešÓ öÙÍv– ¥Ýei÷ÚÞ`·×YÜXKRÖ³vW™Œrt¥K4êâV¼¥Ï`k×ÛVÍzçîÔp‹Š’È@v°ƒV<å%­i£ÙÕ°m¤F+BK†°õEd†š0Òƒ@qÂ-û‹‘ÁÂÜðVa¹]Øœ&ñß7aˆdxÃê‚L‘þ½õEÆ‹cÀi÷á‚ÔwÆÚí'w½;dS!:&sL·E n%v2Axl½%“¡Éâá1ˆIÌõåÀ –2”%LáÛò¢ö´A¨Š($±²;]š!¢¹ÙqË)6¨œ)2‰’áu¡‹­êr«®7ëÙ!r>îœç¡Zt¦Û3zÈ ç.‹‡Î§3)DläíÙÓß%¥iwé=‹ºÍ¤No Wf=S[ZÐb¨ï}ûr96»zeˆ.35r‹/·™/Õ;‹!l¢! d6¨WߊF"Ó‹³­¿{Ì16²•Mm*+„!©&C•¯<þ9ÜHµÅ}èqƒÜAì½lh™É´³ö8üKÁz™É`Ž6F„σØY’¥¬e1Ë^¾È0Æß`ÆcŠ -x¹Œ5Õ—ñË€ÛzwÉè€qw¼ß oŸdÚì <ì½ä¹^(Â?tKKÝìz‘ÒJšÛ<¾)/:U…àåÓø)˜ît¨_&·I¿ùsþŸ†>Tƒ©ùð0ñªoeåÀ…_ÃÍYˆP! AG­Ç—þ4P¥Dè€K§ÃÀððÅ ðPÝÃÃK2@°ƒ „eyŠwÁïÆx×;þî¡F3œ‚úa/À(× zÐ/ÚrÏ©ýó —þHC×¼8øð¤^®FÄþÐùÂ^ö´On]ÏU¾ÄxHBð Š¡¤ûÞ18Çç}?]{íù§~¦CC¥èÕEzÓwF¸l׬~ÁÏŒ8<5à×~úÃtLï·QŸ*– ZHó£ýet¤úcÉ}÷÷B÷g—Yù†?¦è{8ýCÀpá?ÿc@ÀCª¿ÓxÀ¤@a¿Ä@û›>ý‹@Ó˜À Á¹À $Á¥À¤DÁTÁĤ[е„ÁHYÀ¤AgÁ‚OÀÁÔÁäÁôÁ Â!$Â" Â&¸ŒÁ%<§¬Á',,£ŒÂ DþGñ¤k %2È>&“„Â0ô‰#ÙBjÑ.*$ )<9ÑÂ+ ‚ð%2&/,1´Ãz‚ˆ84ñBC´BϨò¦ƒx‚HwP€ª²¦7Ä&bò&:üB'¼ÃIŠ#ɦЍ>T 5d¸ÊÛˆÀƒ'h=ØU!|š%¿(H”AJtE´§iÄ ÒĤ8¢"“ê+©º˜ŒQ«­¢6Lë‹§2…À„&)²p«˜¢‚ŒÚ¨ä ª=ƒˆkH:ˆž2™eüƒX™–aÅV|Åp´ENÚ½Z«Y¢Zl“XÜ-[š3hš§y.ý/nc8¸„Í¢ƒo0.:hÞþ­ɪ¬Ëò5ȳ¬¡-ÛrÇiû±o|0ljì’X<ø:C<¿X|01ƒˆ{· À¯‘1î0S±Õé5ŠËl¸_É·Õ±Â3YzHˆl‰¤È‰¼Åƒ˜·ŒTÂL34‚x´8»œ@œ»5ÌA£´Z“4&i€[Ђ]ë³?‹TÓŸÚ™?œÔÜÉpìÉÀ9J ÄÃN”7ocž´2¤¼G¥ä7Šàµƒ1}k¦Qp‡mk6鈷LÊŠØ ®ÌIIüÊÁ\‰°TË+ËDÔÀ“³82ˆ¹÷!º°ËºŒ@“Ó:¤‹8‚$©kº§K»ªhŠ9û‹Æ”%žLþÝLÂdMÃÄ:tœ!u< Ãl<2¸<‡Ø½ Ú‘´¶ê=.{;Tˆ;&‹½[˜½ç›%QÂ3<åó<¥½Ô LÖ¤Nt±H5#…̓M’M£àDN©>ÏèBéܧլÎüÎ)ê΢HOòüF¯<Ï0lO!ZO¢˜ÏüsÏ „Ïø|Âù¤EÅ”À?ÌÏÝ>þ4P—ðÏtPX$ÐM·…P•HÐØ\Ð*tÐ -ÐÐ åÎ MCÅÐÝO m@¡ú,  ÑQõ?"ѥѵÑÅÑÕÑåÑõÑÝÑ:à%ì”í´‘,dÄ-OélQu?Ò(•þÒ)¥Ò*¥R!%RNÑ%#õ 7ì'8–ÊÏ&uRï3QBQ¡8S Iñ‹EüÒFL4oSó,S(\ÓþIÓ ÈSaËOl8xIÅya4÷$Ó;-½>Íž=­ÄX,)mFÂ*£ª*s6Ól¼«m¼ª‘2G`*a´**ÆcLÆMU3gä¨([㩇ñ)J)n<odQ;ETTÔÜaÔŸ¸Åv”¯ª±®æò,w$”…o¸2xRЈ…Ha5.çò-zœLLLœ|l}ìÇl/‚ËL²ëËØRÈ£©­hÍÊ“¼Õ\­Î]Å^CŽDÉñ1uý° ¸:‰þ‚jÐÂI1z-ˆó·µlÓ½(I‚õ01‹K+C¸t´±y0›Ì.CÅUvÍ@wÅ*(´/×ÙˆÅ7ÃJöÂÊ ›àó¸'‚«T5Q µ±´Gˆ•´’mÊ‚¤J×ù@ÊiÛ´uÕX€0‚£EÚ¤UÚ¥eÚ¦uÚ§…Z§HˆÚªµÚ«%õÓ³6I³¶ 8ÈŽ€¶®¥2xóÄióZikXLXº0gc¼½L¸=TÅ¿ÄØ¡%ÌðÛ¿ÜÀÜÁ%ÜÂ5ÜÃE\ðÄeÜÆu\0ÊK9IkÌÂ8ŒÄXŒô!M”Ó8I{ͨÌ6Ã9ÌÈþ‰ãLªûL2ͰàÜ’‹ÔÜ[¾•];è‚ZØÚüMI«Möpø ¾ŒhÎÚ”´ÜԈݴټúM·ƒ»m±=ã´  ò•áÝ]èÓØÝìu €A˜‚4ÐŽíŸðìŒ%MÍCÕÞôm &èU`†WÀ]<ß (ôUßûE‰^˜bÈ…"à_ý(Ê%¦_O±_üUßb`”èßÿ½“ù=àTJ`Ö^Z°`p`\€`6‘à >¤ ¶àÙu;È…”€…8è`5ù`n#a¾M;x•Ha(``ÆIŽá¡EX ààøE“Þ&,4Å$u.dþ­ÎØ–b•X†X‰€;ž•-mïcÄ8œC(žâ2þ _˜‚”ƒ,ö (².nÓ}‚ˆB<ÄDŒ‹¹˜¥KäB:}Ï(6ãž…e †1˜;Z°$?uSPER4ET¼&U,TVôá?vRE`†@°ƒ6°;˜…DvÔ\„ÔQ…*TµT¹ÌM•UN•TOÝ«`Œ´HM…REÆ0PƾjFZU»Zµƒ FkXÍÆ¾¢Õ=³Uˆ¼dL&Ѱƒ)È…4¨]AØfÇÐjÈa=.t=V2HÖemÖg5W† ÖÌ"ÖyŒ®kÝïÑVnÕGomH”8ň²MÈÙþgtuÈ‹µd?ffnXH‰føäP~ã¿èÈ”X{…2|U¹}=Eµ›™ ØŠUØŸ¬ÙÄIX†Vè·}Øis—œK™œØ…Uh‹åÊeþg'Mƒc0äjæâ¿ YA»YÕAY2PY–uYž…˜e†kµµµÌ¥¼5Z£çƒˆÊ©\ªìÙ«¤é¨ Zeö畎aEøä-Ži¥A[†ûÚ°[{Þˆ³-·´ÉŒj¾Üµ•ŒÉ}K'»ÄËS¤ÛݰۭÎÛ”žjª¶àZˆ;` NÃ4Më©\Ã@ ÅØˆ‘ l†û\]ö]“gÍ<]Ï‹¶MkÁc2@ì­›6Øíg¼mþšÐ…Oî…¬âUÞåóÝ÷ˆ¢ä@m†3ÞŒ@^¶Mmb^átÞâEöòå óõB•Nn]‚O^…¿Þaîãëï•Xn;(‚6“>ÅÏ4ïnëoþ4€O^‚#înö¦C÷~ïó¤"°\0ï-nûÎïìí…OÖ…ç®o_Bü.pêÜo;ˆ#Ö’gðrðgM)ød!æ ¿p3"p ç[``;8ðð$Ó2êV¿ 'ñÁœ…On†gqcúb_ ãÜ ?)c¤ñßÉ-Wþñvãñ—T‚ cDTÄÌfD=^[9&DC”ò9…Á"7rŠv‚pI˜”XšˆÕ½ŸÄî̓hì©/;p-ݤïÌɰlÊ8Ï^v;Ïù25hçx+9’áö Ú¦mé(úÚÌíá´2ÞŽÞ߀àžÞ×f½tU<Ѝí·_Þà”ûçíí¿ß…1nœ{ªN†O®a´ßñN‘î͸>@‘ñô»øÅ¿CXøäþ@èóÈñ°×|ОƒOÈGýoÊüÑCηϧvÐ_ý{×'Ñ)øäX˜ýÚ·kܧj ød(è}ß—jà§ê`ødD¦Ú7þžk}äÂ\ød^:ç~N‹~é¯Á.øäh~ ñNtqh¥&¾üì“íçþT…O~…ð¿=´/5ÿÍ ÓÐSÿýkÿ~…ïb,hð „ 2$`™ˆ'R¤ "ÅoT0^$£áÆ;j”ˆÅ†È”*W²léò%̘2gÒ¬is"@ wòìéó'РB‡-jô(Ò¤J—2mêô)Ô¨ UÙ±ÓE*V‚gvþÙÕbD!bvüŠiÜÍ´jײmëöíÍœYçÒ­k÷.Þ¼z÷òíë·ç„ªJþÝ*‘ )1¨ŽtüUåV‡R-Ȩü§e2¿/îx‹„Ä3¢RÝrÑ1dÉ/ZîèÜØ²gÓ®][.áܺwóîíû7ðàFiU &œ§áˆž°pㆧ£Œ$>I·Ze×*vÈ*бÎäˆîFQ!¡ bôéÕ¯SžØ¢ŽíøòçÓ¯OYçñüú÷óïïÿ?p¼`AÉ‘qËÑ‘)ÞD´Ç-ìy%F(ØQ*áø€,5ø`„í‰Ñ{ö™x"Š)¶„-ºø"Œ1ÊÈß UM£þ©lDßµVvéQÝbDØœ#FODTÇì}åMˆ*Zy%–ò±8#—]zù%˜aµLU¼h ‚Fh`¥ÔU…j’!&ý *k¶‰“„d`òF– :¨Z[Šy(¢‰*ºhp#TåË™I´\sÏ¡WÀ¿(b$8¡rxì°ƒw}$ÑFÜéÎ¥™n*åD— D(­µÚê~Œêº+¯½úª™v˜Ù¢TlÓU4ö€)©¬zß\Æ'‘¤ ˉb8H† à¤"ʧ1ë,´"vå;Þº.»ƒú+¼ñÊ;¯®ÏT5‡‹NdD•pÑÅMXÐÑ.þÁ[ù.½ +¼0ÃýAS•ÄJ*Ñ'ÜPÀ'k¼1Dz!Ü0È!‹<²]’TÅ„ÄÉ@„8hˆÝÓv<3ÍL2Î9ë¼óO+c úÖ<4ÑEc—+ÏI+½´ÒÂTµKÐ=5ÕFßÌ4ÖYk ¯+vü  ÐU‹=vÁWo}6Úi{YLUr€-5ÙqË]«ÙjÛ}7Þûu­Œÿ…¥ÌYÒq L±ÒDàs›(ð[uçý8ä‘÷ÅFUÈø w ‰»I_ ÚÑ)岤9ǤÇ6Dºn9.9ë­»îTØ!H+þý¤m‰›×W§~NFI Ò·{MÄ«NÑIª#ý:óÍ;þT3U`;æ£Ç§»}_‰EVŸe?›ñm]v–òÏ›>ú<¥qÌì[ôg h¤™¦Ùc‘MÖšHñ—vZýªQöÇ-R i†3ØâHfÌÀT˜¢˜h‚?…ûé¨@Å'vôÖ$ð3¡Íþè—šðp°2!ÁŸØÀF#¬à3اjŽ Ä 8À&°, \!à Áþ…dž1Ô ŸPH†×”/}N|âQ)¼Ojã)ÏyÈêXgD!¹¢y.¥ž.à$hANíp§T'¤.qF:|ÃŒ- C;ÄÈEå@ÝñÄ û‰€1‹[\¹p'%9Þþ±ŽsÌ£¥³G2x¢ ¤CRI?”±c…g.FÒÑŽxÔ#"7yI/É=ðßò (ËY²®qhÐÄ!m BÝ«È-v)‘‘Á—”á‰^'2,H”eA&Zh–ˆ Ä4æ-hذ²O’H0;4Ì^†¨•Î\ 5§™Ìˆ\3DÙT77øK`j3žÔ|¥÷F‚N©3š¯l§‘ê‰ÉËT“-«£%BÊ4]T¥¹”š’˜ä$2@ …¤‹h“ž¥n’aH<ž>9ÊžŠ&УTHÅ@'r¤$-)£ݨ9ßRy†”¤&ìèŽNšR•˜¥"­Mi:Òötþ§¡RªÔ¥j­¸°3€±¡Ý)Od`PYRU=e5¤Ël¦LaRö`•"ïd&7¿InÄ”NvÂWÝDº R‹¬{§@;¶ÎÓ¬yjWŊɲª4¯jåk&ÿ”T¦2¶±:[EU 0U©¥jU­Ò§<•’Êr‚U‘t§hê Q‘*qš,G£Z>rÒ“§¨B HpŽŽœÖ# ‰g=«ZÌ¢vZµ)Mwû*JZ²“ ƒ­liû©_ªÒ¸?¥Èo1Éárª¹®Eîl#R[2Èj±Žý.xæT;Aªù1P·¾.ÍŒëYÑJ\zÁ%®f¹—£ˆ¹Vâd ­ÞRëþí-BpÁìÈa Í ³ßhzŽ[Þ’/{é[.s6@*[0pûû_" VÐo‘à÷F¤Â ð€‘8ÖŠè·•€]–„9œb#XÁ®I,ëãÏËUY…~n§8›üë&Xo Ž<5Æy—ÇN~2¢hPòÒà¼Õ2–³<ŸƒB¹Ë^þO/ª²+Û$fás‰™µl°4Ë_~3œŒ)ã¢Ç²šó¬çBÅ2Î~þ³p¤P]ÜùÊ{>4¢eâf@3ºÑv3ì;ω¾4¦9ÒgGsºÓx™EU!KgºÔ˜^´§S­j£lAv8F*mhSÓúÒ¨þ^5®sÝ“T… ²¦›Æ÷»Ã¹Ö±a²E6­ëe3û'­p5¬Cê¯Ø²éܶР:Ñ­ÄÚó6\P§®‘(»Ùæ>wBäP•bH{֢߻¯7‘' îPÀLuÛ—dÜÝò¼ë}ï|óî{¡·½ñm’Yá¤Üè~øÃ  ;@ Ö¾™öæhÒáMOhÁ¶A¸9åws5xD<r‘ÇÜeîøÇC>r?¡%Ù¿9Î ²‹ªŒá7ðáü&¨%VDA'âjtHÀÍ(æ€@íaÒUèÀ ñ…<º¡ »Iôˆ\# FÚ“Ñ]HÁöl}$PÿŸÔY(D±ûψ8 þdÙ»ž·gJçáM}˜vª³½ˆXWñuâîõˆ0Ñæ9?|Ä'î Ÿ[‘aª%CUHBoP\]Õ]eßi\!aá øiS þTGta@íŸ^Eb]Æ(¸6L„[MÄVaaWÜL áf¡à®•®aªÆ“f\†…æaZíU²!E(–B!$6,Tò†äÖe ×vU&~oqÔhŠaDt‰a&V×ñWleW§,— ¤ÉDøt"uñt-W!N¦|âí½Ö**—D¼âr­k­`Ýbz¡'W/bþ0¢,Æ Ã‘[$V££ùBUŒ€%JM|­—Ř-Ftã|‘ &Ý—8‹a–c}¡˜‡XˆX8–ÅL¶E9F˜9&R‰ý^0²£)òã;v؇1Ó<ÚØjÜ#˜EÀãAãD´˜-²Ç7ö#DÊc‘e0$ºøÛ}X£HþÙ$ÚA l£±ÑD‘Ù„’±KKÆ ²5ÜHÎ$œMAUÄÂn`\Jî¤ÜÜMþä,åBU,CNº[·ÅLã %O¶ ›•%T*U0TÅ è†N.%VNOF%WšPÚX¥Qf%YjåSv%Z>QT-äÆU–%\–ÎY¦%]šUØþÁ¸åX’ "Äe©me]&ä¼BU a˜b&¦b.&c6¦c:æôÁcN&eV¦e^&ff¦fn&g¦`~¦Ý @U¼a‚iž&j¦¦j®&k¶¦k¾&lƦj²€ˆ€lÞ&næ¦nî&oö¦oþ&pÂf€&q:‘€Ø*˜d)§s>çÙ‡U<¨3øtf§v&Íqóœ€2 ØAUn§yžgÈÄBq0„'1P€ÀzÎ'}ÒK°ä‚ëì‚2P!18 ¥Õ'€(£8Š@ ëè'C3à‚€6¨ƒJ° ä0Á~Ä,œäƒf¨†Æˆ½Ø¾NôZA@å¨(Ö(p˜Œ$ÃãŒ+(DÌ@ÄŒÚ(‘é_°(æÍìx&<,ÅV¬Ã§ÀV+ t&Çv¬Çbf&ðÀÇŽ,ÉŽ,Bɦ¬Êzì\fl¤n¬_ÞÊ™¹\̪ˆgº¬›ÂlÍÒÊÌþÛÎòlËâì¡êìÏrüÂ ŽŽe ÂˆSÏ–RˆA*p€¤,m)\Ñ*ZÐ ­ŸíÖÎ8<@ÒvÛipC:XØÓ¦Å¹ ‚ h°þÇAÍ…mát­×ò)ØâíŠ|8à" ½Ú }żRGÐÝŽü‚'ÜÂ7È{`H®Þnµ4PCßˆßæíÞk߆n4 ­ˆð(©íÙ‚$uÄíiÇtdL{p‚LØj´®r0‡s*àáˆ|®é¢™ÞŽnÎÒìÎvÄ _.à11ßtÀá>¯6ĸÚËýÁ"XI€¤ˆpÃpJñvÛñ"o˜–núæÓ/¨CˆH&c1U{¨ GÄ-x’-’`]/€Ö¾/®°/¬º/ו˜Â5xFúÙ/\ƒâZ/7a¯EÈBþ{Ƨ„ÃÀøl¿Éú*ð”2ð {”‚ì¦â >ˆ'„{ÜH’í^7€C "¥ün]yƒÛÊBÜÎm&µð ¥° ) ŸðWü‚¥ðˆAž¹X†˜{däixt€ä–¯)tn! ²(‹A|CÕ^­«o—ê¿qÇð DZÎñLÅ\Œíöq\ä±Ó( òº¬L˼ "s!rŠr#OrO>2$o¨$S²&WÍÍ^ò†Àʆ²(2)—²)Ÿ2*ìx2¢6|,Dz,Ï2-ײ-ß2.ç².ï2/÷²/ÿ20³031³þ132'3.@#°òÐ*ï&GóšY²37h&K36ÏL'W³5Cs63ÐrsŸ^38—3»l³8(9›3;‡s:¿é:·³ï3?÷³?ÿ3¬²=‹©++³A4B'´B/4C7´C?ô13ó@‹i<ϳE§H=OôvVt¡´‹°ñ[DÄäE·5kôF{3WhaŠä#H“AèD„¸•tÜd4JC篭õJïì›¶º$M›ôM¯0þôŠð¬–ÜK›ÅÝ5ÕØtQ'؆ yÃÔ~C¬ÌFaÓu{„f:î‡1ϰEnXYç8Gºôû¸9}d‰›ø‰G²J“ÍJÖIyÇŒw’G%GC¹•“…€O9ZV9Ì|õ•·”kùOrù——9 ‹¹†’¹™¯ù#¢y€ª9›Çy˜»¹HÂyœ¯ùœÓy5Úù—yžë9$ò9[|ôO‹´x³¹¡¿‰M‘„þû>†«“r+÷¸¯¾¹0·ê/x7úæ›'ØþÛâ!¾Ö r!z`E¼ýl‹¾ÔK„,XÕWVYLð!òýö—¼ùCoïË!Ex? ÎâÔ¿Þ?@€#A†`Á&F ¡Â‚ 0}øõa!™ŠSµ ÈþíbB É`z b'Q¦T¹’eK—/aÆ”9“fM›7qæÔ¹“gOŸ?:”hQ£GoªHN>ôT@–¬ž쨕 ŒC~I¦éÓ¨dÄ )¨á\Á7F~qr×õkر[³&, U*U«X-&Ä$™·¿†A0mÁSUZ8wÏŽxWô V,W†S«^ÍKäÞ³ ÿެ¹ng²Nù¢Uë9!jѤq34Ý7tfÁªér»[vἨ2P!!dkÅÇ‘'Þl·à%$M"Õ¾{wïßÁ‡?ž|yóD•&üå‰H©„@…*à¸+þz`*ÕþŠ ×kï=2dø¦¢Äð† ÀIE”3ܯ¿ÿ[ªS Ð=øä£Ï>üîiQRaÀ“ ¬Èˆ0R¹å‹Ž£R>ÌOBÿº°¡øæ«/Ä ÙÛ =¼o)ÂôãG240Å1dˆHA,¬I{¬ñ·*“œÀ 4и¥8€[hŽ [|q´.—ôFŒ*é¼;ñÌSÏ=ùìÓÏ?Å)=ã-ÔÐCéÀâÐB €pÑG!t´E•ÔÒK1%¨ÒL9íÔÓO‚ŽÂì ÔÔSQMUÕUYmU»AAUÖYi´Ö[qÍU×]?-ÕÕ_ VØa‰-½#yþM6Y˜mÙHŸÍÕÙf••vÚh«ÕêÚlIÍÎØoÁ WÜqÉÅVnÑMWÝuÙm×ÝC}-WÞyé­×Þ{‰9÷Ý}ùí×ßn(^| .Øàƒ6O߀nØá‡!¾tà„)®Øâ‹1†iáˆ9îØã÷8ã‘I.Ùäq7Yå•Yn¹WoOŽYæ™i4åÜh¥ãh b¥ l]&Ôg =5è£û¹æ¥™nÚécÇ„”èhTPj‚N¡éE³&t«!æÜZìu•~Úì³ÑN[¥s$Zâ„Ø’´¢oè›Pºá-‹ëìî[Ù²Õ\ðÁKf{ËXB¹mõ»ÎE—ÂdÇþ)—fÂ1Ï\óƒau6«3H¼Å‰¨-úã–TÂ@(0Ïɸe ‚@oqt&«¸¥ƒR4ZÚ¨ød¾Oj4uÕAŠ]ôûֻ囓_žÐÞþôÔI¥Ö!Äø¦‚=²ZÊ*ŸVÀ7/ßüó…5Ü3wFQNÒ8‡„ªˆr°:r'ƒ}÷éz ˆtºW(ÛdF~ô‹HöG‚÷U© °9KÍB¨*¤€õ#D…$H ê >‚Š|è3á QØ'õeM²(ÔE¸ñÁV(!)H b «íá4Î-TgðY$†dáàBÚæ i¢¡€¸¦! ˆG$þH>@Zq„]ÄT SF1ޱ;+$ 6Î!†&<~[Ì-,P4ª‘d¨Ã´|X˜T|ˆ ©øCæ¸Æûì‘!„4”!ûøÇÙ Ø^¼ÑC/NRn—#ã%1™É¡˜ñHqAE=3!`‚!ž$ÈG‡3†D‘ BTd)9ñI2Ø !È B¾Cð[_öQ™eíf;ÛëPÿ:ØÍÎܰSë5¸µ±®],ß”if;›ÛƒöiEJÞ"öH¿Í¶¶7Ýmu‡‘ËÊeîœ ]øBï¹ uë\Wìh»¸»÷îÀ{îHo{ÝgÛÔ»öº÷6[a²e B_‚Ø·ø_),ð@Üà—Y¥hãÃ÷Æ­aþpX„‡Ÿ¡ÆÍqÏœd†‡éþá­äÜH 1AYÇ;²n0+†yÌÓMs¥« ä­<ðÈ·RrZÚ7:VO,Oi]ˆs,G´Ì—v„!Ù2˜a¸oÎ瘓1³¹&µ —iF™:)¦²×ó v±ï_\ž?êÁ)}ˆMí Amf…zi¿kÆ{Þ“ÎwÉ\¢Õªs¦xýx+ë}òGYå5újqÞó¥7Ö¡EŸú[‘Þô­Ö«U{hEÞõµ/ìeŸ{C±Þö½Gîu|ìøžø¾ð‘¯ÚŸùá:~ò…ÏûæOÿNßæÔRrÌžýl±£‚>p¥O}ñÇú~³Õ´Od‡íû± ÿøáïþò‘ «M¿µaÛ~о?þýGÊüßF܇ÜÂÜôϱøÏÿp“Ú&¹–«¹¢Çƒ´Ëvü­t¦Gu~ÄŽ "ò vB'»ú­»,à†è+p}áÖ«½ÈàáX#¿(h~,ˆ h¬¢"$NÚG*îâR,ãPp®T‘0'š®—Jn+VŽ ZŽˆø‹  ˆ0åLå"ÌåŠ0—/ Á°‡#Ì$Þ“ É‘ê³9̰@wg@-â#ýàݪ„>½ge=1”%lÓ ßë´“7›ÐÇüPëv3Ü @<4™³!œ:÷P:y"$‚"¬seT˜JT0d¡ Ž@[ *¦®"T4$ºîB3ôHYñH8q½¶ʈãáòˆ5¤ì5"¨8êî l£´!–Tá*œJ#0ÉÀ–c˜`ƒLá‰J³–ÀÁûüñHÖ.:èÎ5ÈÀN"‘´óÎ…m‘'+Bñ~’£^1KzÎ3dqP…„Ÿ¡ÎìFÒŒ4*!üô³AþâJFÊLÐÄLcä:u£„¤"¸Á`°-q£ðÜ„I Õ+ÑH÷CÝÑò…Sp*­RÏsV‡±VßÕôÔW÷XÅ'5ƒõÂz•X!ÑX“ݘ5CõY!mX£U馕Z‘îZÑ3[µõë–•[ÁÐ[¿ϬU\;Ž÷]îÑw NËUÕÂ]Ãq]ò…Ð!3rý¶2^ÁŠ^ñR]SrY¦­·ðo$ýUYö&µÔj%°% prÖ"çuaÛ±mÞr!æ2wÊ2,™D±²zT!„Çšuf£c!°Þ€ã)õ-•r*u§>®bcM’mV3õ+3þE0u2¶B.a~èà ˆÚh+S¢36 s4ÊSg‡ìbyþØÆºÆ³!²³E9†>(8­(l{ÓéÕ=±P‰”“å$ kcSk£Šk»VüØFB)”@iAùh¤öp£oý3‘äÓÆÚ0?ß WíVÖò6=AOEo”F©CVÌ& -0PVeY¶f+P+cvw>ðºh–v–’*±…?£xŠW6 Z–‰á-A„uê}‰ì\ª–ûQ ’¶–¶iŸ–›èJS¬1ð¾¬V¿"3Ü.âŽóXi÷Ø5£VD§‡áx\$9Éþ@m{8”ªmgHmCtëfém!LnaÒ"“,n¡P’:Y·²–ƒs8’iî\ôóq…xKçÅâspohqg9ûS—ïÃpsÙ‘UÌBø•aÙãæUô’myDâs7B”F×SÔt ™p¥WHMWškéÖP÷˜“¹^"Kƒ×š@ÂvDJëNíʉN{KC18êNzÛΓ[3xÝ:x×íîtxµöÇ9ÃÎe{©—Ÿ@"z×™)dðÖä¢Z•Qµ×QÚ‡&µ :œld¡¾ŒJ®÷ð*Âñ y ðs/%WßeƒV I:ÀL‚ƒñ¥3öú~T¦Ý™išÛb§þÏÊ¥wÚ¸zÚ§½ ¨ƒš¸†š¨«Ê¨Ú¶’Z©‹Š©›º´ž:`.Xˆßªgoª)’†–[FXUùU«‘I§¹ºÕªZ`|8†Yë`ÉrÌú¬ã׫õl­ ‚%ƒøÇ(ö­ëI®‘WcáÒ‹m)¥8eËx6´òÄà°s±]¶©JvŒ »ŠûŠãÍÞnÖ¡²‹Û»L¯w/®ýšÓ|¶ˆÙ"™iY0INé *N; º'µõj+±7ÚÖŽ¨6m{Âê´F´G›Ò¾V EY H“E.ä†à˜ëòMme»BLy 9¹=9u³’—Ó·Ûk„{¸mo#ΗÑþ=Í F¡Ì(Öp§{›—͘[‡—w?¡øHŒî»‡O¼ñ·r±Y›—›m¯+ È °!ëî¾±›G.HGãD™äšÕÚ·Š”¿­Ê¿ÿ›p_ô¾ÔÔ 0:xÓÙíüu÷™í¬ôíÜbžë”O1\ù4¼ö’—z=¼£éÄ  5¡ ŠÁÕ¡-ªM°7ËŒ¢]•£/VkÜÆo¼õÒú_PÚRX¸¥zÊýŒ®£ü€¹¼ô’z~¿ü±Â;̳¬ÊË<|¶ÍÅJÍלrÚÜͳ ÎãÜoæœÎ•ÊÎïÜÌõ\òø¼ÏÅ&Ïÿ¨ä· ®ZÚ‹û¾zÐ#%ËCþРݧ½ Ðo_µfô+RPÏ|Ò7ÌË+#ýÑÚ4}`U—+RnØÓA=ì*¯3RÔ{ëhCæ^¥ˆsOÒ_=Ÿ”˜³Ñ˜°©ë*yr‹—ø‹3{L6VŰÇ,3—˜^´”D–'?–{¾«ÙA–TŒòe¡ë6G·—½ ªýs€ÙÛX?½×ÍKŽy›³0£d2yp·ùÇݯ¶Žã§ˆ„¶ƒHáÈ@¾áÈàHÁ2Õ«/?347óHöÝk䋵ýàžà›År£á cŽßý‘]]Ýgî\(Ù’OùÙqÓmoh»-ù—M— ª3F‚Ä`t„  ƒl©S‹R+;þIeäoÌåÉ"æÅæ_HÕYç=å—S8ÑÝã?þHzYŒ³b=ë›Äè(¾ÅØ…%TA«²zh8Cn! )pýÖ@Cë§F AŒëÉÀëÁ^ìmíÙó¾Ý{¿;žé n™)œ”Iþ9 B™9Àñ=!.·" `8€ 8 H¼æ5·ðGòËvÀ{éðñ_ª–Y$¿“öž!Ây×Óïoë\ÌyJ7‘v¯ôÅ—ž5Q‘ŽDMω€ Ѐz´0ºÔheÿž ¢÷meAœ)hßöq׿"N¿îþ9ùxô5© ™œ{·¤Ry²Qw±É¯¡h‰–·"°¸gþŒÃú+âûA:T9•y/za1üÇ¿üq]ýûiú©W¤ïú»ÍX¯\R¢À2 <ˆ0¡Â…  l1¢Ä‰ ±Ð¡ˆ1£Æ;züH b$Kš<‰2¥Ê•,[º| 3¦Ì™4kÚ¼‰3§Î<{úü 4¨Ð¡Di2©Ò¥L›:} 5ªÔ©E½Š5«Ö­\»zý 6¬Ø±BR=K€ÚµHѺ} 7®\·VÉÚ½‹7¯Þ½|ûúýk´íÜÁ„ >Œøp]ÀŒ;~ 9²äÉEÍ&¾Œ9³æÍœCޤ :´èѤK›.+¸³êÕ¬[»Nûù´ìÙ´kÛ¾}×òëþݼ{ûF¼·ðáÄ‹?NL÷ïåÌ›;¹ôéÔ«[«|jêÍt.al˪ÉvŸ›×ýºúõìÛ»o™]êxÌ-ÄxûNðT†ËCÄP9 p±½G`(\|Q͇_Tœ“Q[ßü—ÖTXØ`†„¥‡`‡~b_ BÅ`…Q ¡A„!©(&ãhc\†Hc6Þ”r¿TqK¥´Ò·¤†ýâÉ-ßÈ@Ÿ ‚Ê'þBЍÑÖŽ=þ¸Ð¢¤r‹d°E7BˆñM{9d‘!‘I†™hªIÐ-$ä%˜b’¡¥@Ž9æZ]~f j•yfškŽ)$þ‘Fzhœ‰ÒY&1^ŠÖŒ8nÊi§žž¤œ ðé„t -Tq AUŒúÁ'yR€,²à‰«ìpk[¢’jêBîŒB ¬X(gPñ)8 ª*«™!Ê2ë,AuüIưÅKƯ¥ž h¹Âk,²]Ûì³c¦ºj«Q»î²íÔB˜î+߀Ÿþ pÀ*gÊ}dìqKHÜ”/AM|¹{Ðnûñ¹„É‘Oï‘Ò—_}ö"¦&ê¿!½ÛmÑ«¬dÐj+®³â±ÃøZ€÷à/ô†¨»CC„JÅ ‘¼¶„wéßÿÚò ‚Ôï~éÞ÷Â@„,ø#ƒþøç?m$ XþK`ˆz$ŒÐ䴇ª,:z€)R±‚ýˆïHž B˜D*„J!è): ,É…0”aBlŽT(«ßh 'ÀERN„¢f‚ Q‰ácˆ,Á4@^ÙâÃÕD‚<1Š˜¢ÔÔhÅ6–É?%¬ãD¬·Â<êq: 逅<¤0å±£!‚G>*r‘ŒL‰ ÉH(‘¬¤%óøHºHíf’ì¤'!BÉKŠr”–Ëä'O‰Ê΄’”¬lå¿L™ÊXÊÒ0«t¥-oI#XÎÒ7¿øÅ.5TK\ s˜:Ê(މÌd*s™Ìl¦3Ÿ ÍhJsšÔ¬¦5¯‰Mþd¢Ùì¦7¿ ÎpŠsœÊ &1ωNêe“ìl§;ß ÏxÊsžô¬§=ï‰Ï{‚ùì§?ÿ Ѐ t ›©„ãËxÆ4®±oŒãëxÇ<î± ä yÈD.²‘Œä$+þyÉLn²“Ÿ å(KyÊT®²•¯Œå,'Ùœ+©~ æ0‹Y!œDH™ÇŒæ4«Ù3-þòšß çCžùpt޳ïÜI.«ÄËx7„_Êî;kAÅb6çAWÏÌTt§¡PQŠEýyÒ”>‹žSÂçJkzÓKÀ8Pg‰d‰éW¢ÑÆ‘ñtNx‡Û^ÄéXË:ÕµI¦gë\/Çþå$(I‰MŽBÛNÖ–`GiJIZ²°A&M­QnÊa•®”<2ZÑ{ƒ®¿ îÕº&··¹c”p@ÐmAß­rõ®h™úHÜA;ånõ‘áU¤2R8!N þ^Ò:¸Á Õð†þÈâ†)ªÀùASa@¬BèüS¯~ùüº4JRÏüèŸÝ“¾õ ßè_ûçþ7HPóqü»tþI´OþôËZD¸¥þøçùô0A¿üïÿüëCôÉ šð (€H€h€ˆ€ ¨€ È€ è€(Hhˆ¨Èè‚!(‚#H‚%h‚'ˆ‚)¨‚à·@P1(ƒ3Hƒ5hƒ7ˆƒ9¨ƒ;ȃ=èƒ?„A(„CH„Eh„G8PPxûÇ„Mè„Oøægö…Uh…W…RXTˆ…]è…_¸}ZH\†eh†gvbH þdˆ†mè†oˆkjȆpH‡uh‡p¦†ÿ·‚{ȇ}臈(ˆƒHˆ…hˆ‡ˆˆ‰¨ˆ‹¸-ø‚H‰‘(‰“H‰•h‰—ˆ‰™¨‰›È‰è‰ÿ¤„ÙçfwHŠ¥hŠk&‡£xŠ«ÈŠ­èI©˜ÝÑ á¡|’T‹«±pr3ev‹·ˆ‹¨˜¾8=´¸kU—j¢F¨¬QHfÖ.1‡n³mQsGùaD¡ŒÎ‘‹¿¸mÛØó;%Ò‹ºˆf¹Žs‘Ž¡ 1ŽUŒÚ‘u¬ÑˆÑW#nKص˜@ 2!“Dœá‹õè¼èŽ ó¸p!Ž5·ëÈ" wÙþÿXŒÁ§ x‹†H‰¢h¹ŒÏØѨ‘",‘—Ñ’‰)½ay1z$ÂÁ(’™ñ’×8æA‘7y‘ “”àX“1‰”8ùi=™.R’ú”@m%)a'(£'GÂ#~²"acfì‡r¢(È’'…Â'_É% Ñ'?òbð—®Ã–b•mb$b‰Ê6lŒ¢— A%V"Då’–{‚$J‚C~I!yYl€ù˜où'‰él|Ùpƒ‰mÈ"™Grm…¹j›Ép é–wI‡™•’2'‹G b@ ìfŒ¦ ™Õff†C²é–͆C  dþ '¸™ŒIl´ifW™•p²š­ùš»F–k¹%“Ù™Sš¦i™œÃš®)hÂy›„²'²95×¹œå"šÁù$Ë6œŸ#<à)h¼ÙœÞYšÜyš¼iœÕ™•fI)㨞ˆ’š4¤˜Ïm»6Ÿ‚‚œùé–Ñ©™ºyšdF ½I œ¤àA˜@ §0Bd@î0—™žÉŸ•Ù8îØk¿V.Úé˜Õ&šÞP1Âc’,'oÆHÛRÞ’.á+Á‚‘dv>Ã.ÙR.4 .â‚£ !¤§B ›Gt +E -ñ¢‘oGpd„¯Â+ïƒ,@ª+—w>”'¥/oNj£ÀB.ü+þO:hVÚ+Ȥû¶+kÊpmºjmªmª¥nÓ£î»â>À|mq§0¥6ù£è. a¦æ#§;Š6wªQÚ¤Œƒªuc§à§“ê3mª¦X§7J.ŠH—ê§Ú-†J¢j©íƒ©l ª aª‚ ¦ÁHª ôªïâ3ªªª¶J¦‘:oD™§Æ¸§¬ê§Áê¦\úo玔:zÃÚ§ Ñ©±“¨hµŠ«]š>¹ò §0 d0 §ð O` ‚¦HzÑŠ,Ó*>4·"ê›ØêxaZpt 4*J•ñèrE£á2“32c0“£Á¸9tI2å313› ›0Cpþ ¾ô [é°%£¯3‰Gc±õŠ£³±±“°aw¡±Û3/—²[±u‡ž5 ²2‡,-³SÔ²«Ö² Ѳ#«<'÷§83k4I)´Q²»15Š“<Û1@›¯+±sÐçÃ>!UÐ$pý@'Ò+ÝÏ-u#ÍÏîüAú%|5ÝÐ6,5=“­¨ñ#Ó©‘ÐòÑ4“±:Á‡“ÔI :MuA9ÒžPÒžz (­Ò,mÏ5ÔÁHÕ³â¥QÓ>Óí³Ó®ªÑYçÔ Í9cm£mh­Ô Ôs}ÔPýÎÓ˜Ïô§rý×ãÃÑ€’yHúуÕ":Õj]ÕÕ,DÝÑ¢'ׂ©-°µS ¢@!£”‘mÒåBÙyÝ”d xŒ—­o7Òd BêÌ-J½2þFQZ”Dgô _$pê2FA¹FWT.fÔE½ýB`ä–¾]N]äEÉýÛƒfÛmÜ¡C<Ô˜=I?D±cÜ4dC‹‰{ÛíÆâÉܺ7ÞLdÝT lÞÍ¡Ñ]DMßmaa&%é}ßù½ßÒM×mÈ=ßdÞhTElôbФ`Þà½Û]ôÓÕ,.àƒ¼{»™ÞÜsÛîÞ9TÞûk´ÎÞ!Áš Ž½uFàÊÝÝ@T˜ý} ú=Dnà^â Êà{Ú­Û\Ôãg´à(®™é}á;.{æÉ'®ãò­Ü©qàmqàÎäÓͦ·Í¿d0Ürô§JN!Yž%þÞ{¿GE§·-åÉ)ä Ñâß} ëMâcþáh¾ä‚‘ÝGN¥`] 1 Mp»ÁYßmÎ{ožÚ®—l!šéí täŒ÷J€$HÐ}ƒTG”¾Paé—’é˜.é2…Ɉ›Î‘b&ê "›‘çP¡æÑŒöºÎ®È¥ø“ 02ë¿të8 ¿`+ð瘋oO1O»Î¹IŸ”ë4™ìrì@2ÍnêIAsË®IodíJñì¿¡jÒž4Ðq &í,”I¼gK ëé®îënëæŽièÎîñ.ïóþÁNï÷Žïùî’îþ|ð®ïÿð…ü~~þ.ðþð G?…ª˜í!²h"ĸ“æH­®ð¯ñ²½åöð™Û&ÒŽžnñqò)?& ¿…åN êdÏ@i‘¿Ë.IŸ0Ÿ$©ò=Ÿðöޱ?miº“"쬎ǜgV‹RéóMð@_¢{) C  !›ò˜|b Ñ¬8WOš€’ó Z–“²& K@(«¡[oŸk'kïŽÆ™Cå9lfOwHïö† ŸÎ –•âô}¯ïPϬ[g­ q§‹ ¦èÚ7ÜRø·Z»Œj-ö’-¤ðd ß 2@ ˆú¦žj¬©a¬: ¦*ù”oùd€ù)ÒØù©Šªc:.øR´~þ/ûìõ„Û¬Êì¯CKw«²žœû °L+¶\L,“ÒCb &BP ‘Ʊ·z{°dF¸n{üIªüdÀü Ä—ѵ§û³/þ®õ2+ŒåÛÁƒÖÂw“7lÁ¶IÊ·KÂ-0+À ­r š‹5Œ»¶ dȘ(ÐÀA ’ °!™TTRIE¦Å-2+8"s«ÅB 4ˆP$lçÄ4y"°ÎA˜ ½a YÓæMœ9uîäÙÓçO A…%ZÔèQ¤I•.eÚÔéS¨Q¥NÍ 1¬YµnåÚµ†‡aO |HÖˆ@# pþâ„J 8 Ëždp–Œ‘‡þB0-dë– \¹dqÎe€éï Œâ@†C†6ë¢}XøpbÁ -#ž8áÃ[vÓ \Üøqd†0U^¸óX2}߯‰é UܹuïæÝÛ÷oàÁ…'^|·Õ®É•ký*6³˜! ¡ƳcO6ßaëN ŒC~¹ û¡§ê; <Ôp.áöîßÃ/ÿpngب2P!!ä!"  "ް =ëÖH?þühº÷ë¯,üîÈ“d‘¥€ìÈP@ ¬j!'Ì >N¼#<ñÈK茓qFk´ñFsÔqGBn9 ¹jŽ5"eøæ!#í;BŒH‘¨&ÀþIE”3úåSRY!ƒÌ2£‚”Ä8â¡ÄðF (§¬26,µäò¤²àh¡¹8€[xö c@±éË0ÇÈN<õüîÈCïÌó!9=ó2TP áI>ýTÐBôÑÌÒ¤ÒÊ6·È1žìqUV[uõUXc•uÖ£~ òVb† ?ÜèÀ¢¨ÖÌ1XY± ƒVd“UvYf›uöÙlÅH]}„öZl³Õv[n»õö[¥V¹jªP5“®E7]pÛu÷]xã•wÞáÄ×+°èÕw_~ûõ÷_€¶ÉÞ{·*W`„Vxa†v˜7‚ Îêà‡+¶øbŒ3֘߈þ%Î5ßCyd’K6ÇŽ%®–×ÁBb¶lé¸Ä§‡Xiâå—{Êù¦›ê¹¦Ÿq3öd¢‹6Ü” ^™'û\˜Û2ÏÔY SÞÚ¨ %Å-k:‹"Õ£Ã{ìd“¾wiš¾Zk®slÏ\¾QUí®‰äyש,´¶S˜P)ÅO´°øæ,ì"㚨£ƒsª\·¡²°ˆ‘lÊ+·å«<Æ×9¦éÖÚn˜cB¸C¯ûtÓQŸZ*½Koù¤„G ÄndÃðÀÁ›_ö¥ÎËÂdöË“W~ùÞÌwå%Å å—.áÌìRÄ@ÅP ÿ¸%•0ÎZm5†¢Ÿ~`þïS1¥Lš?ºØª¸¥ƒR>"ã QR¹Å ðן2xCbøF÷%íqïò£ŸýnA›ûåoVb`ýC>—¥/|©Aù`>ê•O Ò !>Q©O< { lÈ)&G¸ãÝûÞúÚ÷> ÎςԠ]LˆBfo{?kš@ö ¡ ñ\2õuÉja^­xE¥8oZ++@‚–hžÌ<¤ ]ÜÎÎA‚TaN­cHÕóE—]tøÆ[@â­¨$øÒ!wŒ‚? ¤ I@H2P‰  .„ÜáI{ìãÉPû‘!ƒ”ýÆÁØQþÕ» ðE˜ò‹Ò‡2Æ”‘ O0Ep, ÉñŽuœcÁãIKÞG”sbå†:KYr]D*ËAú BhÀÜ@W–Ô‹Ûäf7£•9Í d  õVÄÉÜgÜH6IérŒÀ<ÝISHm4É“,ÒÏš|€¹üð"|‘&©È$@’Ð?Ѥˆòl§6Áø™x’-T ÍF’΃:&FÞ B&åbÏzV¡ú”¨CìiÑŽÞ…Š åÚC¸ñ†úÌ ù€'$¸(VO!÷ôfQÚM-âjeO¢È;­¦âL,lS+Å‹¾„|)þYIKP¢–„$1êD¢U²Þ‚wájX/¹Ì§>™Å³*YêZV24¯;HÀñ‹qH®NE«I¨*ˆL䪉ÍkM" N Ð$_2žRÌ t ™ÉQ=ûYæ%õV+Ë(CÂ"VF4Rë53ê9½&$²¹l[>jÎÔ ‘­BôÂÛþš ¼[kI™Qd4¦£!M­´‚ Ü"„Xíp/š™åÎtµdyÜç28’¡‰!ùÀ78§Û€V½ë›hƒ´²ô`‡jUh Î‘Ú ¥GAÔ}üÈ!†Ä·C° ‹è#©(ÁjÐy É IʧEåyþ‚¹“" 8®¡Ó€ “%ÄâÍ1ó› ²Œ{ÙìuOb`ý׿z+¦+ūߚ†U·Ë™ÒŽQìá$ØÆ¯Z,±WÉK.™{©5Î2ÉIh ƒþþ€ß¼‚IL¬ÍL’¥$)[³xb¹R–LEQ­)ÍJÔC¨°0Uá!evS;}Œf)ŠMf~ÓD#…:$1jE‚Žr“žTè)ç•R–bª–¹G†Q4aº3‘è|f/_” ‹¾ÔDãIH8u¿ t@¤ªéP%f&ÇZÖ sòr(Fœ¶ñÆ4±‰¯€%,¡äz'çx!ˆÅ¯¡ÍZÙËNXþ­É5ÎpÕèÜ A>¡#a¯Å+˜.³½ýmpSÅÙɹ5ÖÖµ7‡œ›72 ‚p`Re›g·0A¸í}o|#eÜ›Ëw¿ýýo€ëfßB‚vÀ ~p„'\'§ÂþpˆœáÌ)xÄ-~qŒ/yâ«xÆ=þq[qãX)wÞº%³´‘ÁfòþM²Cþr˜+läû Ë[µ”W­U_ƒuÌ}þóxͼä¬#0²*¼:¹¹Jr@gzÓß%ôŽ‹»è´]élœã9]ë[×ÔÂS °€€»â¿ ÆO‡ðvH•ùv’}5dŸû¿®½ Ú(@ÐÓ,Ìaþ A¿Þ‚"Á \ÒgC»ã½‚öK|ÿöÀPˆ œ¼L¨ÈuЇ¾là 'Ç¢J(’‘ŽdÈ9æ¹ÉCv²’¦SÉ‚ú\Α—wô%%?©IC"öˆT}#ÉIÓ%™¾ì?ÑÜïÒŽxt¾%›|N&ò ‹4¾xa=*_¥¢'ù]åuŒzt!% ºR…RÔ"¥êkOÚΔÎþ%èü™÷[¿êˆÝÚ¿}B¬†ò?…€¨Ü0—A©—2@~R@¤@`?¤ L¢2?üÀx#½Ò£¹Ï¸«±2¬éj+¯*,.Û°û¸«©; d+°ò*«‚ þ+Æâ«·"µJˆìA²‚¾<+¸  <Á‡ØA#Ä ÎA(ŒB\ÁÒ#-õs "Œàê­â"®ãR¿"œš -+ .,Ô- .ø-… -.ôBþ"’7¬-ËÒB¿8à T'1¬òB?üC£Âp‚/ë/2(Ó£ ¬“ð°±0dD [ÄEDDC¾ ‹±£[D«Û»¦›³Ä SL<>›¤FD²bDXŒE¦@?²XCc3P5Û³:‹ÃLË4Dë9›³Ry“]ÜÅOQ”¼‚313Rá3;“š]¼´>ëJEK+F4É35ãF\TÆ7‹3bþ„ÆYÅMIPMIèSATB-TCõ˜?µƒ@=TFmTG}T6MÔE…TJ­TK½T•TLÝTNíTOmPMýTQUR-Uð USMUU]UVÕMTmUXUYÕÍ|UZ½U\ÍU]Å [ÝU_ýU`ýÔ^ Vb-Vc-Ôa=Ve]VfÝÒdmVhViåÑgVk½Vl­ÐjÍVníVoþõÏmýVq×XÝC8WtMWu]WvmWw}WxWyWwMA„ W}ÝW~íWmW[ WXñ䃱\GŽâó½äœ5…$cÀ­ƒÞ%cIþ^©u\­]+ßJ֮ؾØ2x†ò­e@®ÛBÎåB>äùÅÙgP‡¸b&ÖbÇ%_óUâa6ãám\30…çaÀ=ãQna6Žäø-^ŠMßõþmß‹½ƒo°åÄíeAÖerÆ_^Ž]]‡Ù &`¶æ¾q(€Ãmç Ö Ž †[3ð€f.ážfò-å5_y¦g¸\gÐ\Îõ\(?°‚2ˆ…N åjÎh#çrîhÖ=çÔÕÙ2@á(ÎÝÝãböch[ˆÙP0i˜ã2‡[g8ÜaP. ^À kØ^.Hp^ã”Y˜`銕„nj8[Š=vƒ:tèÚŒgtæhÞj¡i@þ꽕pk²i­æj´†X¯.k¶NÙpJ8rhkº®Y\Nk¼V뉭k¾^Ùu¸w°†9îkþÂ&Ù»ÎkÄص.lÆnlÇ.ÙÃNlÉöÖÅ~l˾lËŽìÉÞìk†…ýlÐí¨ÔÎ.mn¥SÕ^mÖnm×~mØŽmÙžmÚ®mÛ¾mÜÎmÝÞmÞÞm(Ónk­lÌ.nã¦kÍnå&Vâ>nç~nq^néVÖæ†në¾n»>ëéÞî[­nìþnð6líænò†UïoôNïœïònïT=oõŽoðNn÷®ïRõlÑÎoýÞo $mûþïUEíÞp/p?pOpgíßp7Uø–o ‡nú~p §Ôwn¬ÖX¹ÝpÎØÀhȦX0…pöð¶e›ÅØqøþç@¾pçÔ ?nè7ìŒMVñˆŽ‚ŸZ¯qwìŽq$·Ôórjþj&rÄÍØhÐÅÕoe¯òòŒMxñ$sG]r-ë'×h&—[iˆ†*ßð3ïð(ÏXàæ#s;7TØ=„v¨ƒiøÁåpƒt€_ÕØX=çs?/ô…–b«®^à^¯… Ëeôopt¾}wtå”–äìÝÞGç™nÞgMçôPˆÖCïó?ôA‡[E§ÛTïô‚èPçÞ-uçÚ[ÇòÐâõ¾scTؽ…(X3°Š}„sÐç5˜k¶Xeþgvggc8„PHÈöNà¾Ø/Àèmïöoç[&à†gI¾‚u¿¯½à Þ`–÷v×d¸öföh¿ƒi·qÇ÷\çi€w gzßç{§àv/ßó-öcŸx=…ÝiX‡°¥Xu€h+˜·Ø‹ÏøjOfÙ1†ä§n‡>¶X’çÛdvwdÛpæâÆ}y}y‹ÝøIöxƒwù,.xI–æ¥ù¨}yˆsŠOz5…]KˆjS¸ŠeÁ¯Ø¦ƒ§'_KP J‡ghbJ z­?¾}ä)\IÖä:ÞX}Z²§XV§z§‡z÷E§Û¶‡ùF~äp^{–½û…&öþ:WzÁçÒ".F(yˆ…ÏXÃ/y5…J¸ƒ2¸ƒiY+ð°XÈ—|Ê÷ù®×bMIf™úe.úŸ×i¨X>|ŠM|Ôus›ŸcÑh¡×X¢gY£Ÿs¤|ß¿RØ]ƒgX××u8‡á—„½v‡ÓÇXá'þ’gþнöX†Ê§Ø`}k_öê?qj8áw..HXІїàï'`…ÿw{GZð§Øhñç/þãOþ½¾~‘Mjÿñ/ÿó×€GÍŒ™st L˜0ǹXwÂ!0Ð 5q ÇESѱŽ?‚ )r$É’&O¢L©r%Ë–._ÂŒ)s&Íš6þoâÌ©s'Ïž> ª“4…š|Ôiwa™uêRq`„𑘃MºTU«|¤š¶ÎªÕˆ õ VlÙ«¹ƒnÂgêLSCÖ¬ŽEèĸ{ÔVcq·Ä8‹W.]¡Ü@˜U)S§P¥êØ‹A9·‹çÖ½›W³U¿€_MXøpâÌŸpÊ-G¡¶oãέ{7ïÞ¾.|8q›DS#O®|9óæÎŸCŽ0Ç8éWÏmµ®=ú¸©Ô..~<ùòæÏ£O¯~={ÝÇ·Ã/>ýúöï'ß~?ÿþþÿ €Ž÷Þvi!ˆ_s¦…ƒh)at¦ö~b˜¡†rØ¡‡âf „#’X¢‰'.ˆ+²Ø¢‹/Âãp"¢X£7âh¡Š2òØ£?d‹4æX¤‘GÞx¡K2Ù¤“OBbQHRY¥•[rÙ¥—Mòq‹4c’Y¦™g¢™¦šk²Ù¦›o§œsÒY'J~™§ž{òÙg𨠃Z¨¡‡"š¨¢‹2Ú¨£B©¤“Rº‰Ÿ—b𩦛rÚ©§Ÿ‚ª¨£’Zª©§¢šªª«²Úª«¯Â«¬³ÒZ«­·âš«®»òÚ«¯¿¬°Ã[¬±Ç"›¬²Ë2Û¬³ÏB­´ÓR[­µ×bkm@;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_t_8.gif000066400000000000000000000641231343257752000272710ustar00rootroot00000000000000GIF89aq(猂„LB<äÂÄd¤BDÄ‚„Ä¢¤$"$lfdd"$Œjd¬†|lRLĺ´´bd,ôâäŒ"$ <2,\NL¬šœÄ–Œlܦ”ŒvtìÒÔ|vt\BD̪¬|b\ÄšŒÜ²´Œ64´Ž|D:4|jl¤ŽŒôÆÄ4&$T2,lZ\¼rlœzlܺ¼ |¬RTÔ¦”üòô¼–„Œœ‚„TJLŒndÌžŒTB<Œ.,üÒÔ\JD¼’„|^TäÊÌÄŠŒ,D2,dNDÔ’„äÚÜ„f\œ:<¬ŽŒL:4„j\4.,T:4tZT¼z|$¤~tì¾¼„ ¼žœ„¤ŠŒ”rl ¤JLÌ¢”,"T.,´Š|´jl<ôêì쮬”vlÔªœ|f\䲤üÎÌœ~|亼 ¬Z\Ô¢¤üúü¼–”¤‚tŒrtÌšœTF<”†„tbd”fd„ztÄžœ„”*,ìÚ܌̢¤”z|Ôª¬ä¶´¤‚„dJD4$<.,Dľ¼Üªœ\F<´’„ôÊÌ4*$¼vtœ~t  ŒrdD6,dRLÔ–ŒL>4T><$,&$¼šœäÆÄ¤FDĆ„d&$¬Š|´fdôæäìÖÔÄžŒÜ¶´T6,ܾ¼¬VTüöôŒäÎÌÄŽŒœ><¼~|„ ¤NL´nlôîìä¾¼¬^\Ô¦¤üþüÌžœ„nlt ”&$Ì–”œ64„”.,ìÞÜŒ̦¤Ô®¬¤†„LBD<24|bd´Ž„D:<¼rtœzt Ô¦œ¼–ŒŒnlÌž”TBD\JLdNL„jdtZ\$,"$”vt|fdTFDt^\lVTt\FD4*,D64L><ÿÿþ!ù÷,q(þ• H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»EèÝË·¯ß¿€ L¸°áÈ+^Ìx±¼#ƒb‰å˘3kÞ̹³çÏ C‹Mº´éÓ¨I$¹µë‹Èœ™M»¶íÛ¸sëÞÍ»7m¾ƒ.¼¸ñãÈ‹¯~ͼ¹ÃØÉ£K?N\¹ôêÓ³kß~f¹óïà þBçN^;öòÒOرeöyßïË˧Î:¼}çãçë·®Ÿ¸Ž%ö¸GÝ~*Wß}¶–_Äkø ˆ€ÝÕF'>¬1ÄuÈ„1­¤ðÃmÕm±…Ø]˜á†º÷aˆ#2(cw&hã] Î8™è C&O hál{QN9´Ø]= ”ñ($Òf¢¿i$’JÀ¤“PêØ`7†)WŽ^’@Œ?´@%…ÆÔ0ÛY–3[ÂDyF9¨ ²f…g´ùfœsÖYæ~Þ‰i(\dj'³qÒʞĵÂèœd9¤mé°F*íñ™âl’6ji•Šî桨¦•h©×¡©&Ÿþ­”1[9ÄùyœÚ‰)¨²ÞY«›·ŽJ!«fžšê±d­J,rPà#{PÊe€PqE™d®{’:mµ×Z©­°|.»]¡È¦;–²æ*÷à(>LJÜ)´b Î3ÊO[’»ÞZï½ùîÛ/·íf‡®º {ÅnÂðI÷ƒ1^N ñ— gì°l'_oE”B&EÈòÈ%wÜŸ±·<ÕÃ*çö1oˆ±F'½XóÍ9Ç\¬Ë@[³ÏD­èÂA'ÝDáôÓPG-õÔTWmõÕXg­õÖ\wíõ×`s "J—íT¦h§­öÚl·íöÛpÇ-÷Üt×m÷Ýxç @þf÷­ÔÐF.8¡,ûm¸O€®øâÓ!}øã<%Îøä”ÃW8ä˜×$yåœwþÛ噇Óæž—>¹ã¢§þ馷.8êªÇ®Óa×nûí¸ç®ûî¼1¶ìÀ»¤÷ðÄoüñÈ'_<ßÁ7Ÿë®Gï3ìÎWßôÒg1õÖwÌ3GgG)Æ'KáËH„ÚËǽ÷ðO~ye¬1Nù³â‚¹5¬1iûç]üøej=JnÂGŠz è áø±ˆ€rç}Ì B 8›ÿ¨\ ßHñ@Î(´ Â¨Á„ƒ³™’§.…! qE/ÑlŒÚÀ þöZÀlñcŒb½ÚtÉ"L`E`T b”ƒ7© 9ŒˆD÷ÔŒ8ãx• ÇBšQ0<ƒ Ƨla E[zÒl„‘³l ˜Ãl> Ì èèÖmö [Ø"ÑòÎ`‹pˆã HðÁ’š$Ç3ðÑ€tO=ä¨1®ðŒ Ü Ç(„'=ÍT¶Â•§8I'^ÑÆH°EmTq?5R씺1†«Îà=Ùa B\8ºÃJAÑ2†·@iÓJO^§Œ¡Ì Ó³© V“ª·ŒqÚp£kˆ‚æ˜6AÚ&T”zT(6Q@ɲúÔ„QÎîLˆ6ãþ¸¥3=Íh0—ŠÕ¬~õ'n-¡Šµ„(&0›u,óRéÓ¥g“ 2¬â «pA&®I‡êj690å>™ÕO ޢ–µ°u¥má’O ¤ *~ Ðlì15ÄLÉÆ÷ÒˆœÄ€„3˜A @àèMsºÓkž¡)IMJU”Rˆ^öÂW£ôÅ/ÍÉ~³ÁÂ:ZÁ8  ªhÅö‡Kt©6œ°Ä-1)n =[€'”zA U­lÅÎ8ü'Õ©RÕŸØ»Å|c"d'fUÔú kØÃ†2±³9É(ËÙá”Ô²Îì%m†³Îšv7m÷D{ÚÖò&µª­þk]K[}6¶²›mmwK#ÜšQ·¼¥-l} <à·µÃ%nìæW¦ñáï çÎd«£ä*7uÌÕQýjÂü±µ¤.¬{ÝÐMtjp~@„p„ƒ1Ò vbúÜÒ†‚â•yË‹9zP½½¹À>p¤¬¡›ò­ÍKXæ—AûåïãÒ¸F¾ÖE³IEh³‡T(u‰}zèƒ8Ä"1‰ÝÉÔlÂø`ŒIø¤£,W…AÈÒqÍf=JãkÒ‘6vÄ£-ÙÇ?ò¥ÍlñÊ^ ãK•r›ÀR%$¨ÍƒP ;Œå,k¹…d^3ÉJvßm™l¸óV“[è¬òþr¼c¾b‡›Þ§8É b6æ3ÌK&³õ¬ «^Ñj‡Q&Ž=6L$ŸËáAm£P{4`Ø )žM¥ç=Ç8>ÄùÖJÅõÆ3 –Àå0p-5®3¬Xg ïfZӥꔧׄê¤Å\iÙ^zo˜V)ÅÕƒ½‰0€öšë¬çá ÎvÃ:Ö²ž5­k]Ó`Ã;ëOÖºyº]lv›éVû‚c¾vÒD«Ù”}»}7ÐD»³ÒžÝáV·ËŒûnxË;·1®7uÓ}ïŒÑ[ßÒãw¿öo€»NàOWÁcæ\™™Î„òñ6¦âpuâÚ«ÃK‡qò€w¯8²þ ×ñˆHÕ¸~`u?Zrîà×¶"ÏÉÑS 'X8¨@‚ àW‘ê'ç;ï9ÐyŽ=µ|;†yÌ!·  ß°¯&î"ˆSŽEéð #6†A<Ž%¬!%H`‡¸c„ã%æb¯xHA”ýìʺs#&$‰L˜P׿v/ŠaÊ+zºÜuS÷»ç½ðÍÊ;Ÿ¸!†L¤Ý;ØøEJž8ƒ_±-ò¥jAnté% `ˆÆ±KAÎã5Ëʉø š¤d—žPä”>“óÌíý˜2â¤~ȸD: ±Þõ°_’œBïû;ªžîÃoVñ…Oü GkØŸ"þéHHJòø¯×$'™?›ß3SP÷ü„cœJâÓ–¥'Š™eY’ê63ƒ{è†(Äw6ï×e®4þ0°dº1t=gùçËÔ~õÇ XthtH ^0½t¿LÃT Ø}¢eµfŸ£~‡³ iFôTg¯ÅWßNãB$ £ bV†N´ñ‚:g ^Ä1ƒsƒ´qƒ9˜îqO-8DXƒ¨ÅrÆ-sÂNîÔ'²‚„:Ès´Ñ„gð„ø¤Oœ§‚eÆ~ÖP9ÓW uM-3 3ÐSøgðh †Pýg‡ØÑhÆñ†q8‡ÃB‚CÔ†c þQTeQ¥Q³ˆrÈF„ȆHTF…T7¦Š ÀŠ×ä‹·H²†‰™¨4M×kÄáWÐÆVÈ63­(VdYÝ8¢°K­èvb0 h×Wmg°l}µëØŽÄŽÎvnååxŽH0œ€Ì޳±Ì2+ª$v…WzEŽæˆŽ×sÍYÓrÕ¨‰ùFÚÖ:ÜvUi!y1#Y7†iùVng.þ81Y>·’ö‘#íÖ3¨¥6â•“‚ã“ôa“ã¶‘/)\5)”ß±pEÙ9‡”II”KyZMé”Í¡”Úc“6•Tù”‘^ù•`镸РaY–fy–š¡•[ÙÑ–nù–o pY—vy—~ñk¹— |˜Íñà€ ˜ˆÙÀ ¹Ðµ˜yÎà Ê@ À™˜)AÐA  ¡À™šná Î ½À™¢™ši —)Î@ ª›dј)‹)›¸ ³ A˜/›À©n`€I€ðÁ™œV!Á° Ê9Q €P Ø™§þÔÙL± ÁÐâ9žãÉÞyžHA/°ž/ ž¿Àž€žò™â© óyŸôÙö‰ŸüIõÙŸÿ ÊZ zš  * Ú Ú¡ŠZ¡:š¡êÚ¡ š¢$J#Z¢(ú'š¢,ª+Ú¢ê2Ê3£4Z£5z —€ 6º£<Ú£u£2JB:¤DZ¤Fz¤Hš¤Jº¤LÚ¤Nú¤FP*¥PZ¥Vz¥Xš¥Zº¥Oê;@ztVrï¦Qd_JYÍrOj(3„ ö'¦ ÓËB¦¥s¦iZX`E%ŒÃ1Då€]"§þç²=…§-*£j:ë€jâDP$/cB3 (úDQDvfgNØxž2©N'OPy’×wÝ1©™ç "!©™Ú_4u#…¨,ª¨zª«pOØRH‡D…Z"{"åÐô@!?Õ«³±{3Ð{g€}{\Âi.Gœ~É÷«Ñzæ×=ò#v¬A¥|mjA´š¢¶*UÄa ¾ºC»DL”b™2 1R+íZ€rˆ"ü7‰’†³‚ó÷®h!í*Q·ò*Ê䧳Ц‰j§œ“ìÀØÔ(be%BH’f˃î1…PÙ$ªlª…Jhe`ØÙ´±)»„ »þO劢ç:RÕñª ô:Q[â`©ìгöúˆ¨ˆ/EPÁò±´‰‚he…Ècg‚³›&|EY/[¢1»OØa;°«@µ®ò'%{ÆÊ«ájµÄhŒ­è‹{²‹ÍØŠÑØ΢ÐB$b˵ ˆjR5µ$ZµÎÔ‡.Ws%/•)kÀ$¸@WdW¤”C»Ui´éßX‘îñ.ñÒ(r•¸‚KãXXz¢|[¦r’47k¡ ¢£Kºå1“ýQm©Û¡«ËºÜ”„» [«K»¼Ë ±Ë¡³Û»ÂK,¿›¡b¼Ê»¼ÌÛ¼Îû¼Ð½Ò;½Ô[½Öþ{½Ø›½Ú»½ÜÛ½Þû½Ù»¹›¢Ç ¾æ{¾è›¾ê»¾ìÛ¾îë½â›§Ã;¿íR¼¼ô›¿2b¿Š¿úû¿úÁ¿ê¿\ÀÜ!ÀJÀ¼ÀÒÀªÀ ÁÆáÀ Z¾ï{ÁœÁ¼ÁÜÁп-jÁ<Â$\Â&| º+Á,|Àã ³»ÛÂ-LÁ ê¿1l ×]Ð…>Ë’’2l.4œ 6¬r¸!:¬?üCX?œ0AŒ CL(÷§Dm’UK Ä/Lµ tôasüÁÅÓ‘tW¼,M\ 1«ª¢«vy8du1Âv³‘y[tb"«¶ÑD˜*ET4QU#iGÇþ°úwš7ÆX,¿Üê#@Â-¾Ø!§7Guä|Cv{GÆF¸®‰´HôH‘4IÙ*Éâw~„LÆY¼·)Ò®­H‚ÂXV‚xèe¹xO«&Øg LîÆÄeÉ”c(ÊeRÆzÆ+û¸‡²Û„`_(g5èƒ%KÉ·¡±ñh…ïO—â̦ž&†ÀÌ£,º¥Œ³‘âgD+e|µh eˆxص»1Ë‹xQµQV¶ÎNu‰Ý<( g·sË'¤VcÖŠªö¶|ÄT°¦´V·B…ŒG¥ˆòTП˜‹ÓxÏÞlȪ /‹U¹]Å-òˆ‘¥€µ& W›«¸_xþWjÔV&Òð(XJLÑ^’ÏzÆÃͺñ‘ÒQ’ƒâÃ2í»ß¬ºòd®ûÓQIÓýiÓÇa»F}ÔA-»`ÜÔ¬‹Ôü ÁR]ÀTŸV}Õÿ›Õ÷¹Õ\¿^=ŸO<#9,ÅÑu>Ö‹3ÖòYÖ bÄRŒÄgðql]9nžpí>µÅ&g_³ñrw=9y}ž{}º³áÅ:i)4ØmýÔÀ›"’ÆÜª­šÇöƒ"DZ÷Ç]T!\·yŽ=8…ígÜ­‰l̾hÉnV?V~|S˜4É_†~£MÚ¡glÊ|E‚]˜3K¯¼'¿|ÛESÚÝIÌ‹fÈ|ÌÍ Ü;þ¤Ì'‹Í{rgÈÛÍÛ‡F΀VP}Ò®ˆÆFèÜvêì¯ldÏÙm4ÊMûü,\ûÏÒªµÈzò}Š´1ÐÀhŠ‹l4Ñëܹ}¿’½}UºV0M)'=)½kŸûÑ–ëŽÛ(m1àDÓÞÓ©ÔÉaºÆ¡ÓѱÖ~1®œ^E=âùUâÉyâÂÁÔ*¾âÞ¿QãJÆâÁ Ö6®o8œ:¾ãïÖã¹ùã@þmBŽ›D^ä¨;ã\ãrÖ&—Ö“#âK|ä²™äƒ"×&Gדc×Ýl屩ã-·Å½á×½A€í%dÞ‚ Ì`®šbNÄ·Š-ÅN~æxÞbìæþLžÀØ!ÇQO:ˆƒÇu^7yðš¾C›MbP§vu<è$2©sÜEg‰Uè:Xªíb•ž3,vÏožš1»­ž˶±­Øa­×t꯭­±Md³mNÒȲNzÛ—ÉÞëB¶zpÐzáB§®Ë=ꢳà €¼Ü¦ÉŽêg°[†LÈÊÑ/µ@üWܵ L·VOÛ\ìæÞ |ë‡wˆÞ¾ðØ´lDÏ·¬‡K‹†v’>òñÏŽhÞL[Mo‰>ÊÆþš1KО‹¡˜€û}·´Á¶Îˆß°hJúÝjDfÐkÈWýmJCUT =o»ògóÄ!ô;/VÌç† ÒÏ6Ò–”lºÁôOOý‘Sßôð(áIáN0%-ŒÙøŽlµ+MlRÿ¹Uÿ{õ\)ê_Ãw¾ ž<-8TþÃ%Ÿ™X®äa¶÷˜‰åkã÷Áø‘Ù÷„ÿ`†™ˆŸøâµø‰ÙøŽ\˜’?ù¼Uù‚yù˜_[š˜œ/#Pžçi÷o¦q/Äs¯Zžçtíå§ï†Ì´s»aæF˜æmûÚñù|ùãcžçtNBÏÅØ¼O¾¿—1kÙNÇvþ\š^²œžèž½vÞÙÍÿÙJ´é¢}ü œúNŒ¾xêé£êµÁêÂ^d¸÷ꦮþ´ BÇíýÈ‘ük‰ìgèÊãQ&Xzá®ìÒÞÝqF 1$¶ T5Nàc8\ ©z“/¿\8ñÑgJaa^ýzöë]׆_þ|úo7jÍ“¡‚¨je® ‡1‹°X§.à p(QÖ€ ß È?¨Œ5:A<ÃÂSår°Çᇶ‰]Òbl/XãƒÝ>þX#¬‹ßÔß`#⤈ &("E˜0¦•<.Q̇y˜Qv03Ä=Œ çƒ ³ÞºkfXc†ƒÐ¦Œl®RL 8¸hŘÆÖú틽Ê«Ct»kA¾›íµÓ¾è騧hœ%Ö§„-‚Zjªña €¸ ë¼ÍþûŒqZ¹JˆkÔ)Ì5ç\õÀ+Ì|óòú{}h×?_ vÖ;¯=•'"Ú#‡€Xc ¹½ì ›o‡F®ÓÀ=2±Å–Löp¨Êx”ìË „RAG '2ŸÊ3~Ÿ|ˆ|R ;¨düò¹êúŒlÈnŽðí¿ÖFPð­}<ÃùþÒwød~àöº'qb>èDö$è½fBÖ»LýÜW"d"¥+ÒéP{™Ïƒ tŠïw¾fbvÿ¡|sÀFd(4„áÐd( ÄM ø <¨ƒLüNˆ<œáÕW4èÁçFÆ ÚHW¢ž°DFLÈBت$Œg`Dj` ä Š9cÏЊüÄ fä)0æqŒe<ÃÛøFv‘"™bH´ ‹—‰#[ø/¢PH*\¡OZxG’~lä#·2”HŽ! M(=é”R–è`g@ŠC²¸ER¢’Œ©ôaks£¢¥¦,òþÒ­Ìñ•fqÞPˆ@†Å ™Å‹X¢2•až%€€0Ÿ™¦^Fd™Íì›­‚•bêP ÝŒåЈ™¦lªEG–t&3É“M¢ó2ëŠ=‰Ï}Z—úT§?×`Ä3 Ñ!)âÄ/ê¼n~LdG; CKqÚ4È-#šŠÂ!gH7Âуl¦3)F‡Æ-‘4£€<ƒGA*RVT2”± 0;y†Ã8Å¥=CiàyIšÍ“/›ÜiO‡öÓ¤æ³kå@ŒJé(¨¦›ªäée~j' $x²œ¨OUªQ‡æ¢^¥žõ°gÑò`g<ò“bx²C3"!q«vÎ0þ0|GÌ1à\¯é2å•8vˆ+BìzÕ²BG:Ôæ( &†P £‰D,%ŸY²¯¶ëHßèØ¹Svâúl3a36dU"/»ÎE¢w8Ú“bv¡o„®û~û׋v8Yd )þd¢Ù˜ÃäöÚbì 3÷«ÂçÙÚù^.°éb­j÷+"B¶0bád)³(ÌÞª}£ùFÌ*8M2þÍsÊÝã"'ïÕÉ‚å¤\ÔTÁ€DAjÇù¸Þ’¶´¦™Òy àv¹Õín€ÃÝÞŠ9º‰³ªâW¾ßJà‰o,¡Ûw¿ ^0ƒ¬!Á¥[ŠíÙ!Ú+ƒèÃûM¯z×&³\pWüdý#û`%rÈ¢GêèG¾øA€ˆÛ¦O{V>ì£-’H¬*µÜ×ê"y†VJ”§-«²¸a Mu ‰H+ËSɺêî Î{á3>g§[þQ‡Úäç®’n"Të‘wïB‹‰N…š¨g`€1¼Q¡a,ÔÜæeÜåÎêóž ½12ú2—~—¶·jEnZ™¡4UÝr·ýO¯Ås>ÕYdÈMbÒˆx&úÒˆP‹ïù¢†z'É·~Ñ¿cè¶¶ŽÎPnk-ë¬4öÅ5­´B;Ø’­Öjåú¨¾:¿,Ã’;ÍZ?C9>£J¾ý«»ùƒ²ú0È/ 9 c:‹ø ñ¿²Rk®çJ‘ ˰ A‹³0“l3/éÀx™ÀB©ÀyJ>Á|ÓÀ8c>Vñ1·H¶Ü“̤^û¶!ô³"TÂ)d&\þ!'Œ6(¤¶Ô *ôºh?÷û,)ì4-ü»/DC7±BÔÁBe3CÀhÃ4”C#CM"CG{Ãj™Ã=¼’5¬™8̵<ô @äÃB| ?ŒBô4A¬—;4ÄG D¤1°ÄKÄÄLÔÄMäÄNôÄOÅPÅQEà€[‹G< bÓ6cK–3HBHÔI¤J$Å[ÄÅ\ÔÅ]ÜESDEHUìˆlÓ2r $”ÅY Ã:ta 4F<*g¬˜ë[™ˆ`@-ó7Xl˜dÌZ”E,C¿ƒCi\7j —ˆx¸b3‰ãÆn\Ff¤ pÄCqÔÃñ¸ÚQËÁåÙ)Îx<Œþè9»ÙG½ÉGÆ ‘Ø ÂA¹©œ•k¹—È®™9¦™1ˆpB’ºH ¹‡p¢kGŒðFK‘ÇFƒF‰Ñ¡¨"Ú ¸ó7³…p‡3@Àˆ·ÿ‘:Š îá ½{½kẰûº®»!³S«´‹aÈœÔÉ•Ü<º ÉŠÉF)ID;I½¸¸ÀC#IZ¼RrÓ°ƒ5¸›%Œ°£ÌC%ÅËCŠ¿Ã[©Ä KTÚ>È“;Ë;ƒµÄ#ÁÃÁ¹«Ê‹¸JFÉJ9…|¡ÇA<½ƒH=Ûã§2hˆ!ï1†ü©ˆß+‹Æ¬(€’KþrŠÔ£=¦ä=i"‹jJ¦­X‹þÀ´ˆÁ\¡X‚×„ÍØ”ÍÙ¤ÍÚ´ÍÛÄÍÛă.ÈÍÞôÍßÜʼH¾‹ú·¥R©L ƒU8ƒUX»Æ@)âÄ%§ˆËâôLã´ˆ»ì>ª*ò;óƒNô;õSM>yGx” €ôTÏõdÏötÏ÷„Ïø”Oùüƒp‚ùÄÏüÔO`®Â*-`‚À3°1@‚301äPŽ¿’«Ú²= Ĉþ«ND«³[«ØZ-L®ƒ`@lPÌÚ O`MóŒ6h^ØU†á¼AÛ»An€ÉÙp1Œ¨ÁS¯ŠBk)Aáû?0çšè2 ±õ1ALó¢±µþQòdQ÷óGHHx-LO;¶ˆÅñ,Ñ*•_€„](^¨óìÒ)5Ä1%Sø˜„Fp4USxlÓÄ!³`ÛS7]¶òŒÓr…FˆeØ…_€„5­Ã<õÓ9„Ó@hWH Hj˜†E%ÇF•ÃG…ÔØpƒF˜• hÀT1dTNECOýTØ€_X‰R=U^ÛTUýBVmUÀ„P`‰0g Z}•ZE VÔ²g SHÄÕ\õ‹a`–˜ihbVW F+!Æ53Æn ÉeeV¾ø‚_H‰]ðjˆbÈÔjm• ¬Æƒh·w‹·í ·VÌF|kGoýV½€>þ(`à…h †ÐÔa5Gö0„S8†?”QÇôs&nÄ×|Å‹6ˆ^ ]h„FxVTí81¸|¬ƒŒ93éǰºˆ€ü¹‘M9}<ÈÝ99vZY‡t¹€¹Ú™Èšc«)&œÓ¹½4"”H‹º-‚X@•XFɆbPhÈXEUW* ©» BÊòyÉ3ˆÉ™¬É›äŸœŒ;–ôIÊ:jD‹¡ô:°»°UÊ´=µc;§t»¯J(’;Γň=ÚŸ P kÈØàXÀë˯\¤·<%ÁK5K‡KË‹àËÄ5\.B\N¥šŠ<º¬ÜÆ›%ѼLÊËÎË»#ÉÕ£þ­À[e5Ú½•Gh„h(Ô¨m'Ó\ÈÏ´&È<ɤLˌ̔]˜-+ΤN`¢]†B¨ÚψȽ݈ÞãÝà“»Ô¼×ÔUÝFY†Œ¥VØÝ(•ʾãLÎålNðΟ²½éŒÎ¿ÜÞëìÜ9ò>•?ñs8ìÎçß­ÏdÔÛé½ 7àƒF ‚0À^¼úÏœµ?ã"PEP¦«²‚ЋPáÍ­ÚjÛ -Àê@@´ÆyõPŽÀm´_éÅßEñƒŒ…‚ÿR`ŠÑE#͈}ÒãQôQœÐ^Á"mA$…A‡A‰ØòjRTAAÆa£ÚHh„``Zq#þÖ\ûÒ’HÖG¼ß#þ XÈXXh¶'¶U%¬b+î °Ý'^™>M4îbIùb0æ (ÈØg0ã5¦ca7þ“0 ‚F 7à7.®ãÎkc<Ö bÈØ6øã@¦ãA&dœˆ€hhGHdEîbFnä›@†Œµ‹dJ8K¾äš¨…Œ…N–2c]³g#”)¦BPešŒX¼ÛÔNÖˆlM´mÓ²"áVG½ãW–“^ÈØ@:Fc©itWwƒ7y»Æ5ËF¹<Çd†WyÓÆ=te`–‰WÈXJ=c d„]¸†KÇV<ær<qVXÒxØ4¼fl†‰\ÈØa åˆZŽþ|››…ÌG™…H|–H¥¡H›ÛكȹËHŸ Z¡K“Åàç†d¹™­Ù »ÙŠdha9èÆ!Zwþexþ’$ÈØE>ʰ=g¡ìº¢ »£\É öÜŠø^¹ˆ’¾Z¹ëL‡@[•^Ûš>—`¸5!ª\ÕŽöè. ŒE†n Ì+ÜÒµ¶¹Ì·LƳËô}Û‹˜¼Ê«#¦&]I™ ¥\‰j/â\“½j‹Èê ¶f¢.j.‘ÖFØR 4æÕ̧®açU>X2^Ø«ˆäM kÚ£ã`Ð,Þ—¿>èíT¶në%I†Œý‚‘¶ˆðÕÞoæk`Ò¾ôµ¼ªªöEGþø­ù½ìÛ+ß»Þl“íìï ¿Š¨ß¡~ljq†Ö V4 Ðþs`åºëõi ­Ä+ æP ^Ð àênì«(ß@ ÎP nå:åèØ–9ÈX^µíˆpáüÑŒoó­¨ä"5Ò{AÓY¯˜Áî ¶áõj/¼¢aÞ0;o<ÒõVÒtïô¶VvlìF7Pb&în"‹b’2=aå)|g_ !ÈXXpOæÔ §ðqå…F°¿½ÂŒëB ßAïpe†Œ…Õ7ñ /ðŸ‘b>öc6´å÷5OqoÈØepqwSïpZ€d>r!þQ"ïðYÈØQýÃWòO‹qŸ‘i€diÀñÔPe÷Bå\vEd‹Ÿ)·*·rAÑF¸…(O cÄ%\¾¶m-b2g¿3g” ÈXqMDaã–g.«fózõ`:§@3·óúЂŒ€='‰“Æ¥rÖ²ulgBçAC?ôùÔFÐF?ˆsY€noŒÓŠ¥ûŠŸÕÈ”ÅÇP×hJ‡&—ñ_ÈØ^ —ÉÝè “Æl¬ "™ÖºÅu‹:]VÏWOñ[ÈX]˜uÁ`¥Ò¼\?½Œ\ªöË©öB¿tF„Œk’4€ªëë¨hìiÊLÁFMâ«ö;!öŸÓFÜoTöãPªùþµ¶øãÎÑþ z_GâHw=Y÷Ÿm×…wàÑ Þ Ð ½>íÐãþÐ6ëîwu·ôkŸêmoøNÏýÈïêïÃëÑ ïïâªÒˆö‰§øøpjà_ÿÅJfÉÖhð‘ˆp”—•_yøáFn¯(‘õÁy/Öù§]øð`ñÖ1!Ýí5.z@ûw7€Œ‚˜¯z>¼ú§ç…2vú®_k¤_”Pˆc”r³ß¬¯Oq=n>¸ñ@IU·/3¸Oñ/ÈØd({6i{øòkëòG¼y’ÐûÇòHþû5¹VsÌvók‹–ïå¹HüÏäFþE9´'f×h–Wˆóóò}.g°WÌ?z´¯Qn„R¶{o^Ð7XtdXsÎõvUvd}×g”Xn„\˜}{>õ Õ犸g•eÈŹ„ußíçˆþgç¯h‚NŒŒ©äõ‹~Yáƒè‡¤Ù…Îþœ]þŠ8ÿ‚„)…¤þñ—hóhœ5§›Éà~E ‚Œ}…ãŸ[¸ˆ32˜‘ Ý™32l˜0N æ$Xð`Bõ@”y*á“L:leZè¡ÉŒKq´nc;ô*4ˆðÌžL¶HîQ‰ÒgBaeB”HQ`MŒ ždj˘/[ÎDzñfΙz.ýþÙµ)ì<3ÂôökW¨-§Æ¬jÑfB±[2=SFØÙ¼zÉPæ÷/àÀ‚.lø0âÄŠ3nìø1dÈ5rù2濃Rž1†ÄVCUãn1V÷¤gÐ E“6­°\» [üHøƒ³CÎOaÛÀ[öÖgJ'4VûÌtѶZüsèÑÃ]?Õ«;ãoß±ñ—N¼óñäËq75n[ùëíg¯§ïý›»ðïæ‘£g¸Þüùfîïÿ?€ 8 a¹P& ¶YCÜÔ³FR…žæƒJx†0Zˆ–I­p’'äyå{>uèaB"’ØÊx sCF8!‹þiY×Pu'vµb…-Žx'0‚x¡C.idŠ'ÙÇ#”zâEÆØÐ8®é·åü)ø%˜aŠ9æaIP¶™2è ¢LÐ: 8©_›ožçœ^Ñf›‰W.‡§Có‰wFs •ÓcBKäÀ¦›pÊ™’>"zäÊz…žqh¤ Z_”M=)©£¨aÚ¢sœ¢uF¨pÉ¥—iÊ:+­µ*f eÈØzÙš ¡òC›ÙÐTƒ ?¸zÆ5äõk°Ã{,{{P ƒ%•¬WMš4±ÆÆ¥ÓXg€òD Ôc¶ ‘RCÌŠ",RÝB»\CéêHj¼Ï~«Wã–{nBö®Šþ¸sQÚ”½“²Ç­¾ó›¿æ¢«,C¥`ñê–±îº1Ç)M#ÑLã1c½žÅ:­pGB‚ ¡J+C¸PQ8}žœòÊ-¿óÌ”râÃ(kaó5£jW.Ã,3‰–L0%CþB+Æ0±­Ñv­!Ê*³|†Ò<9TtÚê¼tÏœ8 µÔT[µIeŸäöÓQÓ{Úc/6ÓD¾­7rr_M³Iã¬1$Æ{õE2ä‘KÞX”}1ùa&7¾9ç{þªD|~F&_~ºC¥£¾:êDØÁ:Cc>;í’óÑ´Ô.˜æ°ûþ;ðÁ ?<ñÅ¿*ûîÉ+/ë3”A±þ¼_½c<凰So³ñÙküõÛ{ßåãЋ?~‚n@ÒH0Å@/ý÷í»ÿ>üñ<ùõÛ™”Á²>öòûÿ?@úݯ€< lÐìbyì #(Á úŽ€¼ ý ÊøÁý£ C(Â&Ä‚<áýŠŒFPà Ê{ c(ÃÂÏ„(¼áøˆA™e¼ðƒðó!íPŠé%DQ" “è×5ņ8|bò"F8£‡"‹W†­Q\=ÓO•Ø)ïÕ`q'q"Ó8»PfɃáz²g³0®Ž3RÈD+²1‡-¨‹]] ãDÕ>;âQ|QGÈ<îþ‘!D¸Ø~§ÆI*o”Ä™HÎÍq ¡€ʰ…y ñ K Eã&%Èïq”¢$%÷<ÉW޲”¬²Ç%IÉ]ÒN”yÁîL.Tm-{‚1F±ƒ¡ä¨)Ã,æ1“¹ÌŒ0Á­HÁqáƒ5L`h`ÉÑSªÙ U0 Q¸&ÅLe:‡ExZ†tf2D0(Ž¥ži c‚mÓ\ =y¤´ˆ“œæDg4ÙI¢wN žt èì™wÂSžâÄæ7Nkôœ)H§?ÛÉP‡ ¢MÈ8ÐÓ4ò²¥¶Úe~LÎe"4¹Êkz”·(E#1ËB2k}3þJj‘ LdrS¸8,\£:‰ 2çœA§Kíéí—$Õ-IÁJÁ¸òT‡D5/rkY̶Jm•-Jµ SÏê'²JU=‘t)^'§ÊX†v&KMtZ3FÀ®Æ;ÔyÏlÂÓÉle±Ý,xÎ3×C:šê t YUæ Eµk|\ó©É&„•ÍËhÛƒŸÎ¦å³va‹s*J™È´Òym.óª[’ €2èÉl´! }¨ÂÅ‘F£¤¤Å1[H3 q©ô"Ò2À^ðJû I œY5ês‘û¡å2 ¼©îuóBÞ½AʹøŠ®¦KÛ“ KZŠ.w«_Zý‚2þ½ð+yêTªöêEÀ•b­Iö„œÅúR€º”d •*U’!Ühˆ¢e§»·¹ f‡eaM© 7¾°^RÛ$ßëO–òÔlILa ;¤U¹Ý/Žiu ʰÀ q¼æ-dQ ,@vÖ£5­jÙ,a{ÛV&䵯pE `DfÈŒQä>¶ XïBò¼Æ'‹ÊRnªÁª<1,k™µS6ØŠëUd…EIÈÇ’«¸È%±€9Ë[NˆÅnœãA“ ”yÄìLÖµœmgëXý5ÀõŒ=? š7Ái:{…ÒMË[ܪv8dzCÙ"×p6iGW(v;[©Ÿ¼6± Ô¶þ1Ý22¥¡¼º!xƒ{²iY7šmŸváDk…ìú Š d óKèi(”™E¢7)Æâ…ntªá··­& šÚæ&3B¦»ÉÁQÜî~7¼ÏÂÒsÓ»1r Œ70×nëPïwÝ‹7À7÷oλÞGŒ¨»0°[Û8Ä%XðƒSœ0¾  0ñs<‰¯8Èÿ² ^,’ÛwÇS®òJ;ä.7Œ(ã‹“;<Þ`ÁÊs®½¿¼â*l$¹Í\¯èF?:Ò“®ô¥/= ¸Ó£.õ©S½êV¿:Ö³žõžs1¡ Œ"w„A½ìf?;ÚÓ®öµ³½ínþ{ÚO`…F(îv¿;Þó®÷½ó½ï~ÿ;Û».xÂЂ àƒ / @c…AP<ä#ŸãYP&’÷O1Ák¯ûòžÿ¼§1Ei€>2™çC’Ò³¾õdeBàúÅœ>Ê5f¯ûÝC¯”ï Cƒ$ Þ/Þ~ð“¯|È ƒ2X>`† DûE‚>ö³Ÿ¦ PæÙ—>õý’bh¿üæWÐdñøåƒ?0ÔÂùã/ÿþ¼€2ºXþ.^ш\&–Ÿ? c@eÔ‚òÑ0Ø@0„Bç…Áþ F aàJ#<ô¹A(œ.`/4BøI F #„ŒíþA_P±,4‚Ð…  `å4ù-Ÿ4Â+$ÈØÀ î ºÁíPÃ)Ÿþ5Âó)Ã-`&áùùó(÷5‚L)¡Æß.œOú$Ÿ PÆ-L!šß 6Âþðžï5&u¡b_5/´àì!C!.PÆ3ìžèQQæað…áµîéP#ðâìbÌ^á±Pâ"#‚ž5‚#ÌÞ6B5¢%~ž6‚5´ÞÏ­á%~¢ä!ò•Þ†!(žâàea#è\É¡",v]6B”6ÂóÄ¢.¾ÜöÕå%ÜÂí¢0‚\ þ–çÅà £ýlB4£þ3>#4F£4N#5V£5^#6f£6n#7v£7~c7J@#ð€€£9ž#:¦£5Še\:¾#<Æ£<Î#=žã&| h>î#?ö£?þ#@ŽÀ$A¤?b¤B.$C6¤CRàã;ôEV¤E^$Ff¤Fn$Gv¤G~$H†¤HŽ$I–¤Iž$J¦$EÀH²¤J¾$LƤLÎ$MÖ¤MÞdE¾CD*L$Nþ$P¥P%Q’¤K†äQVdR%S6¥S>%TޤNJdTV¥U^¥U@7 E.åGzH6œƒ¬dKªäõô€5˜Ã´=èÁJRH6TÀ`%]Ö¥]ÞþäTò¤OÞ%_ö¥_"å9HBW%E¢Àƒ6¥HzåIedC¨A!D‚Oº¤¼Ã9ü¥fn&gö@^&HOv¦hŽ&VÀ €5(%E dC6¬@!¬¤$|ƒ0dBjö@R¢€0(&kº&l¦;|ÃÄbVƒ1´nÊ&mÚæjÆÃ@fRå90CFå¬if§v2ågHhn'x†§M²dÐW&g¸C=¨Ôƒ;¬¤9Ü ÔAb¢'C"Ô§Kª'{º'E2C=„À¨YB6‚b@|Îg}ºƒ=°g7DgEfÃ-TgE^§xf¨†ªdwÈwn(ˆþ†èWR$éEv¨€|(”Viˆºd!Ð# §0 ©Â¨‘Z§z*f—º(Œ–iWª‚‰þ¨‘ Cl ©‘ö…V'\žÃX)ž‚¨”•機jçQZ; @¦èŠ¢g‚Z¤nž¨¡éE€¨q&êê¨5Äét&éŸnjxî)€ô)§†ê_&e;TÀ~®g{¾'¢¢çQÞ;d‚bògªþg=Ü€’¥ u²ê`¦çƒªA„öj„€1h€dVCeŠªþ²Ž¦§þ¨.+´^eR¢A° ik¾¦—†i…¬6„€b~µ®€—¢;Ãh€b;Ô¯þè'ÐÁsÖA++Zª%[ºåªF«¾Öe³údzî+ÀìHNÂ:¬Á2ëN‚æ^,Ã6lEªÃ1PB=ÀƒÃVì]ökü«Ån¬²¶ƒ1dx)ÇŽìSblfh,ɦ¬Ê®,Ëz¤Ébʶ¬ÌÎ,ÍVìË^Æ7<¤Îî,Ïö¬Ïþ,ЭÐ-Ñúã7|I7¨‚:,-Ó6­Ó>-ÔF­ÔN-ÕV­Õ^-Öf­Ön-×v­×~-؆­ØŽ-Ù–­Ùž-Ú¦­ÚŠ­*tUÖ,ÜÆ­ÜþìÍFFÌÎ-Þæ­ÞfhÝBÆÝî-à®àòeß>Æß.â&®âeá:Æá..äF®ä¢dã6ÆãN.æf®æFiÂHÎ-膮èŽ.é–®éž.ê&ÝÑ*HÒ®­ë¾.ìÆ®ìÎ.íÖ®íÞ.îæ®îrmÛ¾íæþ.ð/EV.c\.P2ƒ=”e€*0fÊ:oxº$ô^)GN¯b*¯ÁZ/VÚîr®ï"eõž$ dƒ·.&Ejƒ¤¤öâ©ôj’®o†2fûæ+½‚ïÁÎo_ZC6ˆlNv®‡.¬L¯E^6f„ÛRïP pS2p¯:0_jïôJ0HÆ)NBpTRpoeýþ¢¤=\Fïb¯ýŠä;\ƒcðfª°I²pPª0þ‚§kä w¤ߤ 7°G 0fŸä 4©Eаb°ôÎfmÒhŒRˆH®Cùö+Ѓ0|Cf¬Ã  ¥‡l$h€1°d¼Ã„ƒ9Ì%zFñWq Ágñk¤c±ßA6 qØñÌ1+g/ñôöæk¾) 1sjd!8't*¦S1p ç¤ òoâ¦!Óh%[1Ç1¹B2 ‡o$òsÆÁüò±7g(ǰK’r©*sd+C±;r+›1@dÃÄ!Sj#³q!/çmbä,»äþ/»rp'&÷1n‚ñ”Pä1{q.ï2!;ó'‡k"ß@EÞ@Ë'?Ó/Fʪ¦4ƒn¤  ê¹(&F4­ (¦'M«ª‚ª´~îs}žôB¨N_¯SäL÷çüµRÓ4*4B£´‘:µGOõBß´E'eDOtE¯$M³k»º¤VÃ'P'õ–õFõ­ö€Uþ€C#µZÓpX¯d\ótºC!hƒ[ê6 Á°ÃyÒÁHgäR·çü²õNGçY’eyžç©æµYÇ´[cuE.ª÷êe é2tHþó7´ÃCS$;”ï|C?Ó0%d$ ƒb†öh÷@iSäioäl÷@m[Ã7p%¬ÃXÞvm©™"µFZê¡gÃhFZêü¶EêhE7‹·p)i›6j÷tw’2·bwv{÷ªº$x#5yc7G–w8÷bdk¯d£Ž5E²÷t[7 ÷*}oävË6zãæj#u~Óp|Àkw£NÁ:lÃ:ÜiÐ +ÿ>w‘2ê£Úo‰R8Zþwr_7mgw`v=o›wjƒ¤Wd5¨¥*EFW‰óyö@5ìË~Ó¾íã~F¢ñß~E¦¼Á·/?îWuê/ïîW$¸úf¶}9‹²b ì§¹¢«µjÿÒ÷ªò×>ó·q¹ž«AW¿î¿{÷²ô›²9[C&L±$¤rý£eþ@HУšvìZ­2Dð€6‚ L¸°ÇÂè±"þgÍÀ„´úÖÎ#€8ÙÖÄ+D°$K‚1jìáÑ%Dˆ[V¼˜‘¡C›hÜ[£ A„ knìør§Ì†6gžL¹r&ÄO+²e[ñ©Bš‡ÐÔ£ Tˆ…â­É''P¡D{à4 •fÁn¯fÝš´jÄ£Cdûõe‡'V¼˜1cïæF–<™2Afö*O®'3sgÏŸ=o=štiÒ¢MK®›Ú,jÖ¯akæ{®ë‡«MÛ»F›wnff 7>¼ñãÞÇ‘'W¾œyóظG—>}.tÐhÒ¬*K;ÁàÄÁ7Î@yóçÍF¿>}÷ÒìÝw†ŸþdëõÝÏÇ_ù¾þgëªH¿ý^û.¼ÀlÐÁ!ŒP y3Á •Q 9ìÐÃA D 1Aa…zgÂF ¾Ì2¡5Ô¨'§xçå—™zB¸C‚ܸ`wX2çêð ‹1ö)Žzn¹ãx,cØa¾„Œ „éÝd‘Iî«.„a׿›qvwN Gú·Q³P0†%J~ŽL•g­É©gˆŽ¶©é¬Aw¦cú¤æ©«¾šn§ø† §‹î!凖~hk‚º®iæ«qnÛíCuîRÃjÌYCBøª¦žŽÊci»¾"»‡Or¢Ûn¼ÅVù!Á­æ+̾„™5q›þêÚö!Ãï&(òr?÷íÏAo3î$iDáïA•Jî@ãŽÇ›|:i¾LG쯑–º.Ø Bà¨nOýJ~:½÷ß)çëÒЙo^ÈÑ}Ôðk 1¾‡lžíá[Þy{ÉÜé†`ƒkš¾zÔùá"ŸâÔyï¡z¨ŸÈôO¾>ûk0#È|ëçW? =N7Î3à_=i&<‰ËR>’‘ï4É„ˆù¬Q:{Ú¨ n’ˆO ݘ*Aý%ÜðµÂN•4Ä[⚤šÐù;´^YbW:°~®ô¬é'èû½Zã]™¼¸çâxÔ¢æ ­ R@;ß9Ïñ}á’­¨LÖ}1ÊD¬u¦[l!¸Ý¨`Ûƒzá6‚!ý=¬¢ªp‡Ê*hL”J úD ?½MBŠ<Å&Ú¡•Ÿ”îƒïÖòϾ]Bv[Ýox«¢ðl_ü×w¡ ^A5$"!IJõÍïÇE0lšvsl¼Ù\Ò‡¥± …‚yþóéœy‰|9sb¾¨™[™?7zñœgGnʉŽrNÓEu0­çèH¯ö«žu­(éš]úÖÁö™vý–_ûÙÑÞ)²“ÑìiwûÛMt=ç²è©92%,Ò>Ѷܯö«ËÜž}¬ÐTØKL^iñ#÷'ù ­ýSB8kHÙ'‚ÀòJœ7v %yѳFî  sÝÿIiÞì|ÔCêð!Bæ.jÇÈŠuæÌÍÌ,- ðÉ<¢«+ËôªhØÌu”­b?P9ígÍSêÖͨ€‚ÍÑâ"Ú/ÇpÙ>-Ô<‚Ïjm}|é Ÿ0)¶§{PÚ¼ðÁâúÂÜR¯Ä*èÏY Î*8îòVÈRîú äàbâñ! þÎá®0)Jn‚R*†‘:în4xŽ@V1:|®=ðaq«N ‰ê¢ Dêh±U/wfè|q-ɉñ‹åF‘±ÓÈ1ŸQI‡¥ñ¯û®m"·±^ÅÑF´ÑØÖ½O’Òj\nÝÑEÊ‘ %cOXóféñqEâñ½—úÈR0%RDÑ$þ*Žï±¤Ï÷"iùj\¢\|p )2N¨1zÀO¬Èª×(MÙÜÏ'æ+þÌJýø¢+ò$#¤ ‘Ë Í+çkÁëqL%i’A ÃÌϾògRPLr:gûjr(é"þüV2˶°/† {` ˯ ‰r*Ý£ IÍÔ`Í×ã“ÌÒ ÉàìqšRÈ”ðÌ„“ 2A”;Ùü®ò}ôÐ#rÙè0 ­¼2 m ˆ/QCÿr9²Ý¶-¥ÖjöÍ=".ýÝæ²a”?9tŽôr:L³3ürHÇÒ0™ôIË24-J©T:‚³J±45®4K¹”öŠTº4LOJoSLÍÔû¾´‘ÊôBGÓ2PôõüHï–ôLÇqKÏÑ8_SñÖQ6éí”4á”M Pî±OßñO¹Ñ8W¯Rè,C µNÓ4”ÐrFß)úÒMøþj÷žå‚neœ’:?jø"²=ôQ±± ¿“#¥*¥F’©ÈO`ƇÎÊ<“ê°Ô“·LõÔAá“ÑÆ¸¼«´dGV"b²$q5W£±?±ë?9Ì@M¬¾2ýËd€‹ÀB$mµüF¬DT°ÚÊs Bÿ+ÝÂj|6’uFu«Â²"Øc5JB²TªUB?wAñ[ûb+ÐAƒU´"¼‚§.^ÒµŒ?ï”x‘¬ §ïwËK¸tLmçÇ$ÁäÑK¥À‹½’5xm2jkÊþ§p|2 ÙW'/ôYË¥Ã*'’TÐZo–qˆ»D "vPÀÔ'¸oC¶¡RþFÃR©TÑ7}!—³få¬çxçs~§ìÊÂfBŵBéâf©¹¬×iXG k%KØÍÂë6Ô@¤)¢Fªü"4ƒ“ÉQ‚ÉÔ I|ú"í]ÿ ØèM´ºò+ïµüVm‡O××R—×úÐ#?ôü’ˆ«B  5·±.HÔÙä'‰¥8ox?–n;Õ#QãüÕ•8.)bâxô-YèGå2)61XÌ/8î¢Ä-OÎuûÖ=bâ<âØa#]¶.*ñÑ\„tŒ ¤dñÃa+þ£Õef!¹*Õ×Ú2K%ùMx±“‘è“E1I¹”•s“±•=V• •Ÿô”a™H#xM]6B(™ºPs–§±–{㘺#gá46™—³H–ïkÛT7ë‘P}Ó˜½™ O—‚PŒ·¸Q¡Œ 2q7UþûĘxp£Ö¡Øn@ª›+5¡¢S[ÜöœØyTÅɳ9Š ’w}7ÿðeÿ$×t§Yfì!P€Â.† +=¸ãÊýГ²dò|ïù‰ r|Ë{4™Œ´’7½~µA/˜<ç>C:?)º¢¥È•Ïò6`Lr 8 ' Ûr$ç?Z’ëžþUz¥}9l 2 U˜x3°¦=b¨‘k†…'\‹b\?ø8mø§G™¥ç.Ì -Š!†‰#ãÖÚ^‡¸¡»Ø#ÌE‘8¬Ã’ªÕȪ#7uYñØV¾šŽ)âFyG!È- Ö0aÕºªƒºHry209°iH–{ †åv±÷•­Û²§²±)Û-û²³U²mY³k2³ë£°¦eä°=E@[k‘C˜³ñ¶v:€ö´á‘³—yj§£hyP2IlÂie{2i;fw;:ª–Q?ï¶kø·kd²›c˜ú˜œÍÕy›Øùlí¤m¢¹­SФ¢ÛXÊùœÓy»»þ)J„Öɧ•› ƒûüÎsŸULmº :¡š²ÆS†g¢åûf!«¾ ¡ :¿ïj¿5 xÛ›ëÛ>¡×l¤÷µK£—?¤‹ÂOúN!‹ÂŸ‹y­t|Ámè½ýë}WpœiºÕèW¿”>uº@yZÂY\Æ]üÙ”½I¼Äü©=ØËl»®•Zǘ )”†Ù4ªÇÈ5¼´È“{ÇUdÏZØŠØ,¼ºÆ¿8¬Gt½¸¬éõ|ÀÚÊÛØ&²\×<Úº¼ÙÈzµòUÊ<‡‚Vä ‚®µ¼‘ñ:G/1ŽûÚ®‘­ÏÑܯÎÝÔ„ÏõÚ#ÎãÜ,'þ{CD;2,9>LÛÑSÒÄ1(?6”7=5ýÓi2µE]C½Ô+’ÔQU}Õ»¯ÕUdÒûb—]=1O=O‚9‡yO‹¹ÖwÖIC™cVPsû!|Û×ýÖDØnQ{ ‘H¶YVàV¼§»¼·éøî °¯¶½uÎûžÂ[Æ›ºÍû¥Ð»X²ž·›lç;u<ÚAÒÁOŸGü¾ Œ8±âÅŒ;~¬ø„”+#Thó[» Ù…`8åÛÆc ?íí¡ÊCkUU6ÔÌ™¡gТ{T­Ú%þ­(Œõ0´\¶4=Þâ›z5k2mž›tÓ “÷°¦êwðáÅÿe»¼ôª°mÎîšùiÈìÛ»?¾üùôë –l9~Ì «™[£ !)çœm)­4]Uë|Æ ؃0HanhôWÏk‰'Ú*†dÒÃ7HiåZ‚ f¸a…=Tƒb[¹mu`i{¡Ðá‡!ŽèWx,jèbU8 [ …}F‰d’J.Éd}øéeB Ý„†!¾õ€À-L-W•u¬1ôN%TZÉP–[¨ÕrªTrwTUMôЄ!õôåe—lºy›Mk¶ùfŽ0¢¦ÚuEÆ9gwÚžþ‹*¢¶g *Vy¥™LÝpN“šnÊi§ž~ÊÞ“QŽ* cM!döÐN=©N2%—_uóTUרÓªª^Ù꫱žŠ-ÝòNUäÓ«ÆÄÑ—;´šTÕ°Å2”M¡AD,nÁÊÚXOÕñɶ³l`áIÛgº®Úk!°6dÏ5 ÎKo½öÞk¤¨¤FijW =¬0„F;ì´â!° ÏÙÄQÕ'Ù0øoÀ÷PðÁ SˆÛ!Ý´!´¢YU0zLÒÃCÌÈ$·SUÆ:é¥B¾zì²ÏN;Ö­»nú{ÁÎ;vaU ÊîK²]{ñÆ~;é¹»'¼§(Lì;CÚ(ñ©5U}öq'Ÿùòí5?ø]ƒaU…SHôòÙs…öî¿o»×®?n¤øIÇ÷޼êÛßs|˜ÂÀ~Š{Žëê°Ž5 cDÄ7„‘‰B¡ÁßX³zP  -}lØÃªrþÀ.°/¬ ‡0¾A!õ ïXC8Ìq‡8‚…š ]C†,¨!%J–£‘‘M`¹JõXr˜Ät &¿Ö/ ©[€ŒÑtNS¢O´fBZù„–³£þqËP»9Ä ýHšPºúbÍe³Gƒâ&†¾9¤"sžôÌ1÷Õ/Kµ“BÖiˆ(«S¨/aIK‚¡TþÄ'…¡ðS¤ª¦1UŠ ƒâŸAU„PIqk u( pó¿zŠt¤Z¹'©úÕ®w©¨*d¼»¥Fp9«V I)ìl²®+U‹%ØšÖJ’ 1Ù] ¹U®RÅ.W¹ëW?½IN©e-¢65¨7‘jâEÒ¬fÕ¤`ƒ\Ƥ¦Ð c (‡¶0 cQÛ˜Vœv1›Uei4Sè„è1èù `Oc«Æ¼sNžÝ®¹YðjW"v…×ÓªcéÉU~þÝt½+ÛÙ˜D¼Çj–˜‘…’÷6 ÚЊ¶/ÕÏgëÓ(þvµ¬Ežü槹ɶv¶´Ýêka[:ÙÖv·¼µdiíÖÛà ·’¿µÌi‡[É1 ×¶¸Mˆ1ÞÝèJwºÔ­®u¯‹Ýìjw»Üí®w¿ ÞðŠw¼ä-ïwåqóªw½ìm¯{ß ßøÊ—ºÆ¸ms•èw¿üí¯ÿ à xÀ.°Œà+xÁ n°ƒœà4"®°…/Œá kxÃîðpß‹xÄ$.±‰OŒâÌ ¡ÐH±‹_ ãËxÆ4®±oŒãŸÒhÄ4t ä yÈD.²‘Œd!oþ  †’ å(KyÊT®²•¯C$èD+zÑŒÎ1$`1G0¹Ñ”®´¥/iý¼ÀÇÄ,2 êP‹zÔt~@ "¸Ô¬nµ«_mä]áE#Bë\ëz×¼&qQ‹b{ØÐ@F¯ìd+›2ºh„³Ÿýì`ìbÙÔ®¶µ[=€hûÎÖ¶¶ipíp‹{Ü”nv#Èît«»Ïæ^·»ß ï/·;Þô®·½…<ï{ë{ßüFq¾û ð€ <þpÿ¸ÁŽp‚<á oø¾îðˆK|ÝŸ¸Å/^íŠc|ã×µÆ;ò‡úã"/¹ÉMò“«|åtN9Ë_sý8@4¯¹ÍoŽóœë|ç<Ïy,0€ž }èDú"bŽtuKhºÓŸõ¨K}êT¯ºÕ¯Žõ¬kêb@Ò¿>aìd/»ÙÏŽö´«}ílo»Ûßw³/Áë`¯{µÅ÷¼ë}ï|ï»Ûçn÷À+ï~/¼áx²^ðŒç5áùÈK>í‹o¼å_ýøÉk~ó‡¯üå??êÌs~ô¤‡»çAzL‹¾ôÈ{ëKßyº§~ö–^=é_wÜ“]÷þ°ûéiüDÛDÙyïv¶L¶;òÙþ|½#¿õ©MíÖ2lò²¾÷=|{ áøÒ» ÊP8ßõ‡Ÿ>ùÍ®û×ë` öàþ÷ïèáÏ`5ØýØ9Q0EÀ ÎÇÆÐ )ðëGv3 €H€æ·ÆÀ€Ü øzp€ ¸€gÀ >°xvñ—‚ïw[°ö‡1HgÃw ° Æw}c·™` ¶ {à|õeðê—ƒgp~ @ ¸ƒ=øƒc÷™3Pë' kà BH„F¸DPå@(,ègØ‚/ˆvþ¿'ƒmHf4x¦„Gh !ø-à|å0veð€×Ç£‚¯W‡cw‡c!¸{H ^p† ‡gÀ‡cg ýw?ÐÖ‡†™øzå€ ¨ƒnŠo}¯'ìÀGØ (‚­À€ZHv[°ƒ ˜ŠÿÇŠg0‹Çg sèŠgx‹œ@†fè~»§k Û·†ÝŠÉˆepX‰ª ‚h‡xx„»8vâЇÐHˆÒxˆðg Qø~“Hˆ¿¨‰+˜‰jdžʨŽQÆŒg`;ðzMèƒs¨‚Ó‹)À„<8cgRH…ëWë`Ôx„_†cØŠåX†çø‰ëèì8Še')þ‚– €– ŠõÈk „h‘€‘(£€GXªðGXœ0£°O@Ž Œ ‰ŽÈø7Yd¶×{¤÷ư“鈓A™c:¹““Wå™P…½”Bé”4F”Ey kÐ eð“6ù”[9cQ)•_yMÉ•cyb^ –gixbI–k)bf‰–o¹wjÉ–s [n —wé{ZI—{‰[v‰—Y“|)˜!æ—h™€¹vr9˜‹ %K·u ™V‡*™•i™KÐuŒ©™™3sE癟9tNÐ š¥iš7wt›©šo à« ›ôæ Ðpg±i›ê¶fA€f·É›ãþÖeÊÔЛÃim ʰd@œË‰l¹l! _ÀœÓ¹k³ ¼°jÔɬæ6 1 ðÝiž¢ök@I`lçéž—Æ¿P~ mïiŸŒFTð Ñ` ÷  ˆ6 à Ó`  º  êg2mJàÆ gÐ ú Îv¡:mê¡qær*¢òæl#j¢o¢'ª¢P–¢+ê¢EÖ¢/*£@£3j£6V£7ª£1–£;ê£þV¢?*¤:Ö£Cj¤ÍU¤Gª¤¤“¤Kê¤_Ó¤O*¥P¥Sj¥Ì¤Wj›ÕÇ¥]ê¥_ ¦aÊ  š ¦þgЦi*¦ƒ ¥E@q*§sJ§uj§wЧyª§{ʧ}ê§ ¨x lÚ¦d€˜‰ª¨ƒZ¨†Š¨Š ©xɨÚp‡©—ú–“J© g©˜ê©R©©›zpú©¥Êz„*ª£ú¨E}jת¦ y¡šªGª;ùªh7“°Šx²:«W«ÇW|føvÊÇ|4Ùv·:¬+¦~ÙgŒÄÚ|„HáD€ˆ3ÐQ £Pp`¬£ˆª½p¿º{â'¬Ég~èg„Ⱥ…—«¼WóWGx~é7v°†°0vÐ ã [@K8 é|á*®ýF®Î·”xþ„8€ù ˜8±h%ùzȈ€+‚$h‚1y°ðÊ‚.x±}˜ )Iv{ c' 3€«æ˜‚ »°ûÖ°9hƒ8úø„×Ç…EÈ€Ih°Aë„s…S¸”­w…Y¨’Eë…`(†([ ™†G[J8ve0vD°  Š ®;;®«ºrÈ€ƒX‰Òèˆ{xˆ’†ˆˆÎ§ˆŒ¨…‰g Ž•x‰"¬õȉžÈ¬jˆÎ—¶"øz3°\Ð Æ` 6Û¸l‘v¼Ê¶öÖ³¤hЍ¨ŠœP‹ùбHº´8v·¸{¹ø~õØ‹X›¸Ç7ŒÅØŠ°þ˜ c·aKvckv‚ð;P ßÚ¹:û¹õºd÷Έs+“ iq»·g°Ç×ßH‚H‰–h¼ç˜µf8½g`0«ƒ3{v3ß›³ÉËoËKv勤û˜²¹»øXB;‡ýè´)Û«ƒVK‘ïÚ®‹†÷8vã¯ûºã0vô@[  0DÀ¾ð‡¼î oðk~É ’õÛ¸黯÷Á©Š‚°#é±cw’)IŽ&Ü’/I»à{®#Ü‘„H0à d%0 —ëš›«Ç—Áìn=««kדM }I¬ÄêÆÄP\vG™”KiŸ*ÅSŒnU¼Åg@••V‰•aܾ^Lo`lÆk|¼hœÆnËÆqÅnoj,Çrì¹tLnv|ÇlœÇz,n|ÜÇfüÇ€|m‚<È[\Ȇ\mˆœÈP¼ÈŒ¼ljJÉ•lÉ—ŒÉ™ì¥],Ƀ7Ÿ Ê¡,Ê£LÊ¥lʧŒÊ©¬Ê«ÌÊ­ìʨ|,˳L˵lË·ŒË¹¬Ë»Ì˽ìË¿ ÌÁ,Ììk;python-nbxmpp-nbxmpp-0.6.10/doc/apidocs/uml_class_diagram_for_nbxmpp_t_9.gif000066400000000000000000000451001343257752000272640ustar00rootroot00000000000000GIF89aõm甆„LB<äÂÄŒJDT̆|$"$lfdÄ¢¤ŒjdÄ‚„Ô¦”lRLd"´bd,ôâä <2,䲤´’„\NLŒvtìÒÔ|„ztܶ´¼šœ¤–”\F<|b\Ì–”Ü®œ”"$Œ¤‚t4&$D:4|jl ôÆÄ¬RTlZ\œzlŒndܪœ¼rtüòôÄ–ŒÌžŒœ24¤ŠŒTJL̦¤¼’„üÒÔt TB<´Š|亼dVTäÚÜ|^TœnlÌžœäÊ̤BD,*,D2,dNDÄšŒdJD„f\4.,L:4„j\tZT$¤~t”rlÄŠŒ ,"´jl,ôêì”vl\JL|f\”*,Œ¬†| üÎ̬Z\œ~|Œrt¼z|üúüÔž”œ:<¬Š|Ô¦¤¼–”„ TF<ôº¼ìÚܤJLdRT„jlt^TìÂÄdÌ’”ĺ´ÔªœlVL\2,D´’”„ܾ¼T><Ü’”Ô®¬¬žœüÊÌÔ¢¤Ü²´œ‚„tbd”fdä¶´¤‚„| 쾼Ğœ”z|¬ŠŒ\$<.,Lܺ¼\JDÌšœ4*$  ôÊÌœ~tŒrdÌ¢”̪¬¼–„´Ž|D6,dRLL>4$,&$Ôª¬Ä¾¼äÆÄ´fdôæäìÖÔ¼žœ”&$Œ¬VT¼vtüöôœ64ä¾¼äÞÜäÎ̤FDÄžŒÄŽŒ ´nlôîì”.,Œ¬^\¼~|üþüœ><„ ìÞܤNL„nl´–”„¤†„¬ŽŒLBDÔ¦œ<24„z|\FD|bdD:< œztŒnlÌž”TBDdNL„jdtZ\$,"$”vt|fdTFDt^\lVT4*,¼–Œ´Ž„D64L><ÿÿþ!ùé,õmþ… H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓJÅ# ­Û·pãÊK·®Ý»xóêÝË·¯ß¿~Õ ÖÙ€“È+^̸±ãÇ#KžL¹²å˘3W6`°g›…)ˆMº´éÓ¨S«^Íš4€Ö°a¿ŽM»¶íÛ±·tþÌ;fhÜÀƒÛžM›ømã“+W®»·s—¿—K—Ž|:€ëxt]u÷éàmþ7N>eôð臧§0›†tÜÕ¯Ÿ{|ùû$ÏÓ§ H˜0–ˆ{®‰ƒ%aHÄl >Ñ *&ä`q„1 q³˜à‚:¡„û…h~$~¤_ˆé0 4LÅ…R Ø`3ƒÜ£DP`2áhÂ8Úl3Öxã…:òè#ŠôXâ“È$x€˜C BØË'¢å€#{؈–‡.?R€Í(£dI [vù%aR0æ”ó9 åIIçrÀ` *jÎ†ŠŸÀðfŒ®] Û­‰¡hƒxè{¦g'ž˜B¤g¥ÂUÙ%–k¢’‡hØÌÖ&^Zfi‚Žj¦©þ\¢:逜Nwi¦¸.´i­¸0‹è1 &Pä¡Ä9DÒhã¬k:zÚlÄ‹¬hE.«*¯ÒÝšë¶íŠmmý…‘‰%„Ζƒ ¨ôòD†ÑdÌ÷%«]¢«.»îÂ{í·ÉiËí¿Âx˯lÁåÐË”Üän7LÀ ¯öÝjI`£Ä$I„XñÅGl)Ã; ±Ç¨M¬ÚZ„á«ô¡¬2Ë$Û rÈóÍ8sê/͘@@-ôÐDmôÑH'­ôÒL7íôÓPG-µÓHÌÌó¶\§õÖ\wíõ×`‡-öØd—möÙh§­öÚk_ݰÍ9Ç-wV»)Üsç­wþ¿uÛ'Þ{.x}}û %àƒ'®8i;Žâ‹G.x㎗¹ä˜ÏMyåÏù<õç ‡.ú褗nzUsžiÖl·îúë°Ç.ûì´k­:¦—g®ûÍ›ßþYpï¾&°É¸Ñ ¸¢©òû!A‡ðè_¼Zǃ—Gå0O&.|ûI„RŸmá×÷vžÖÙ5 ýª§qrŽ|Ô”Ï+S˜/sú%®/š{ðiVlLæNÈç}!zAõÇôñÏ3þMœE©B!HAoòP„DÓ %Œ¦VH—D#(ô"Že}ŠbÔµ"U¨xqp£1Ç9Â)D‘k`4 -a¨< ›ðQ/FuD]“=M9(¹Jà´Ò•a‰ ½éªRq0V…œ×šœ`CÒˆ`M7P#ä]ò†˜ÄJAR¸`´þZÓ:áG²š¸¹&6¿¢ÍEëXÉ2’-) ¿ÑŒ"çtF'ñ ä ⬎ÉhFÑÐA L @´„|ÎF‹½h>)Šü4 ¨Y ZÁs¥k]j×»º½HN¡¨°B HÈR  áS"–D,†K ”9°N &%ªQ‘šÏrï¥0•©úØš„µ†HHÎ$†Z)é5¬býYS³1Œ½õ®´h\µ< ¸lex ,kôºW¬ôU°ˆm a k•Ã&ö±¨Y,c©âXÈZv4’¬T*{YËfV³PálgûYÐ:%{tRž÷œ÷·ŽvJ¥5þ-SPˤžz|¢Ÿý^»0ÙÎCØÑÎJa“$PƒHQjŒÓPïÕo4øã-ŠbëÛ¤D€ÃeÍ Âð} ¸\.i x@Ò(Pº"Šiu {DI&1£º ‡(ˆF€È* ÙÄNŠ„&D¡ Ù£5ѽû¡îz¢Í ÂWFÊj¢ØI%¤S€â”âh¨hE,úu‹]ü¢ U‰à-X,äµÉ û*«T$ùÈHNRM$.qx|â¡À‹rŒ‡9›0PØÂ06N/ÂK]òÒ—pæ~Å9M¯‡Ç= M$co² œ³A‡}©•_n’Jœä,Íþ9/¼ÏmÇŸV6q–½²å5tZV¨¹ë]î‰æÎEŽCç'š‡Ft¢)Åh>[çê©wÎQ©³¹ì…ÓBéT_]š@ R0¬Öë¦'¥ÆllKŸ•­"(êQ“:/¯î¶Ñ „tW*kÖä 59®…õþd½•¾ÖµcºÖ–y½“¾þfÁÞ°‰Ñ&[ØföRœýlê-[Ú ™kµñzmlÓ„ÚÛÞ]·½-pÇLµ%Ëœ¶—“kÆE›Ü ^7Á"Fêg©»Rº5͸áýÈÉ[5ÿŽMsÓ-Ÿ)U§½tŠniöÍï–ø›Jô!¯xc3 &ˆ©þçz*~ñŒsãLHSÀþ…sÞ…¿»áB9†0`2³À@Eãß^Œp¿åpB¨q÷Íœ"ÐC/¨ñ– ˜ƒì úЋ¾¦š5"xÂ&ðå|ç=÷¡^³òù:=5QŸzÕÃ¯ÉZø ESÎ+Qàê… XÂ92ü’ âŽÑ1ÄQd幨±Ù$ÞçÁ6¦¾ 1Þñcœþ.šÏƒ}ô¾*½èI/ ×l" áC£ÙèF8žþñw¤V„=_EÅ‹Rß{ç»OÎÃbÑR’¦”w©GF:²‚¦a€¦þ| DA¹Î·1%eì}ð’ƪùxÆK£}î°³ùlBjÔrú‹œ Îèh4INz”¤Ñ~ìñ~`6c×—JzänÊ÷çAd¿4eÒ‡a¢ád½”O 0 ™sGDK£!e0·d£ÁBPp¤qxÜM‰D(/Öd»Tˆ(ìÑ Â"&Ç”Ll2*(¨,è€0ødÒDMz·€§¥dHmFƒ„‡pk–O-ð  ð`ßWK8i&WHƒOHQ8…U˜OðGB蔀 QPR¢!OôdOøDaH…âT†@w†l§q¢ÁpFh~7|ˆfQ‚Ö„1bhþ› Q@ˆ£!.`ENð`tPy¨Rƒ6“Èy‚ˆŠ8x¨áˆ(N¬Gœˆ}̃ Ý0=ýR"ER¢ŠJ‰ù4Š¥(Œfr}8[Æ—6©¶UIõ¢6qGdjB•EÃH›Ð ÀHtZ L÷‹«&&~tzL7ÆÈVKÕËØŒL N¼˜/ÜTÇHßx¤B /2UUuU¢ŽÎ˜Oå¸S¢Ñ{öj|˜‹#¡'µ–9·fkY1IíV„þh]Èñkáv)7™WÉ÷ÙVÇ&]ƒ^)7!‰‘‰æ6‘’Ó%é'‰’‹£’+Éþ-é’‰“1%#wWh€qf“7‰…¡B9”D9”vàE™”J¹”ŠÁ?9lR9•T9•;°U™•Z¹•rñ”¼Æ ~à¬à•dI ð_°e¹–P1± #À–r¹Eà¶` ~Ps¹—F^ ^|9˜B‘–q–„™˜=ñ~P Q ~ðŠ9™8¡ ³@³  ”¹™3q$ ‘ $pœYš.a~° ± ~`¦ùš* F`F °y›%! m ÅЛ¾ Ä ¸9œ ±ayœÈék@œÌÉp—¶@aIÐÍya aþi ØÙÙ¹Þž¡~ÀâyžAžæ‰žìéêÙžðÉïŸôyóYŸø)÷™Ÿõ¹ŸüŸþùŸí ŠžZ ây ê º ØÙ zµ3¡Z¡z¡ª5DÀ|@ú¡ ¢"ú¡ƒÀ70 ¢*º¢,Ú¢.ú¢0£2:£4Z£6z£8š£:*£€£=º£@¤B:¤DZ¤Fz¤Hª¢P¢qá P¥R:¥TZ¥Vz¥Xš¥Zº¥\Ú¥^ú¥`¦Y _J¦Sj¦bš¦jº¦lÚ¦nú¦pʦKj¢O§vz§xš§X Ó RЦ]º5ÎÀþ>¥€º¥‡¦^£§\š¨Œú¨©eʤᤒz©˜š©Êð§`j¦bàâð †Z¦oꨚª¨šª¬Úªn:§MZ§®:«´*¦P Qj¦„ÀÎà ,@†úÕ  “ «ª*¥*  ¥ª½ú«Á ¥bÕeЬ8Р߬ªJ¬ÆŠ¬„0aà e¨f Ð djá°sÙPÃZ¬Ç ¥@ºP d`¨eà a0Âꬾ ¬ÿŠ®êº5µz°Û¨”š–š°û°»ª­@~Ê­àp>à熚  s@ªÜ*´€"k¦›± ¥Çpþ†PÜPª}à }Ьౠ+²à€; æj¨ÌP¨:P   *Àrб²PÚ Ë@>´ªŠ±;Pš²˱ª´Í ±^ë°°Z©²úµdÛªf*ÒЬ¤€¬‚@ †J Pª ̪ª[Èj¦k ¥m ¥yû§Ð 8±ª ·: ·|˶?«ªŠP¥*Ð o·s[ ß ´†Ê¶n«}»·Š+¸eÛ¹f»°Ѱž;º’Ê«äàܪ š¹]Ë­hÚÛ¬ªËº:0»J i+¸‰« ÿª ‰ «8°KZÓºfŠÙ¤€ †ºº…;·¶k¸ª¼«JºÖþ{§a˰c{½Ü§h*Þ xk¹ÆÛºËª¶ä‹¹Èº«>@ ×j³žª¾zû»RJ ‹PbPç¿ÒÚŽ«ªé›¹—›¸Ý[Àv𽡻½¼À¶*¥ß`(Kµ+Ë­ð ¥u“ЬX;Á-»0[ª>pÇPÁ̳>à³ñ ¨NKû+¸\ „࿆: =«µ¬µ€ê ëËÀ>l« {¢ûÃDܨR*(\¸ËÎû»ZÌ`ͪ Kì¼ÓÚ apÍJ Þ`µ/<År0®s€ ),¥Èp¨ ¹_Ì­6pº@ ¯üê¯q[Å­[aP½E¼ÇÄ1Äþ|È‚l ÝÀ¨z,Ȉü©~\€œÈŽÜ½Ü@ Špâ`È|ÉiŠÀB¬À˜ÜÉdû ½à rà¼yzÈž|ʪºÈÑȨÜÊ®üʰ¼«ª<¬˶|˸\ÄšlG@ ½ðËÀÌÂ<ÌÄ\ÌÆ|ÌÈœÌʼÌÌÜÌÎüÌÐÍÒ<ÍÔ\ÍÖ|ÍØœÍÚ¼ÍÁ ÐÀ½ÌÍâ<Îä\Îæ|ÎèœÎê¼ÎìÌÍÞL§¹Ïò<ÏܻˌÌÉôœÏú¼Ï©jÏ«ŒÏüÐ=Ч:ËQËÐ ½ÐcjÐÐ ÑÐþLË=ÑÑô\ÑÎíüÑ Ò"=Ò$]Ò& Òï¼þ}Ò,ÝÒ.ýÒ0Ó2MÍ)-¶}Ó8½Ñ Ó>ýÓÌÑ}Ñ™z è`ª:¤`ÊûÌÔֻƉ\½‡ìÔüÛªè0ÂT*Ô¸´{Èü¸Ï{¥™û»¥}kíé‹êÍžês«ì´.¿U-܇;¿Íêí㮂ðç°.ëßž¸æìì¥ÕÞºÊú¿í<ïÌíâ.¸ún¥×¥ï·®Ùÿ.ê/«™M¿už¥³¥È«¼Ì[»)镼ÛÇ×­É»¼Pêo¥ o¦èþ :`ªMñ±ÍðX½sËØS½/ñ_»vmóÍ^Æ‚;òóˆó…ûÂ<ô¾[¾*ÿáñ;ô"_ñ4?ñ€šñ^ÁMoôûÍñßò7?ôÀkÚU¥-¾Ú Ô /Øá°S*4¬°§NÚÖ~¿ù»Æjÿ¿m¿¥w?¥lÁ“à Pš÷U½êõ‹ï¦=¥ÓÞºuîØ®·¬óÍ ø‹îû}øÜ ùçžî=¥´`¦–ô›ÿ÷n÷¡O¥‰¯Ùö‹¿ú[¹Œ_Á€Zú0øG¼öÞÿú¥¯©-ö6Mö:ÏÃ_ª G ¥1<Ãÿû ç æP§ê^Õ+ÜÂ/þ<ükoüÈÐÒOÉ¥Þðç¥Õýšm¦¾_øi.Á:,ùQ 6ìçÍ ýÿÛÁh®æ,Ï­Ý_§îOçáOï›þÈÒ¬óµúOÖ1GÅftèøvN!Sá>HÐ B… œxð`Â… rYا×Ag‚4öZFhC¸‰¦ùð1 Fš:&‚$$²æNKj¼r$σÇÎm¨ÃmcE6{þü(T#:e=1–UëV®]½Þ¸hU¬Õ–=Ëê(&ãX±šœ:hã€.rŠùæ U©>53&x&v-²¨ª};+—®]xõòeÛ8ïÞ¾É`£Ñ1ežÓNþÜ–…3g,4uŽLh\geÏ­{\¯0j]ú´S ¨%?®,fv탟†&{P5k×57CÖ±¼õDA“tU{4ñyåê×³ß yÏíqa36®ƒ°aÄË8 3ŽßšŠcó&Ú3ýDûŒÇkζß8Ã-µÌ[ì CœÙÍ,¬¼‚0B­ÀЬB /¬ðt0´ðÆ81DCôpDODñÄS¬p-ÇZñEgìðCÙB瘱xPB¹¢ðF!‡$²H#D2IÁ”d²I'MäñG)' +¯ÄK(³äÒÊ'eìòËóL]43M²¸Tşô1È6ç¤þ³N;ïÄ3Ï<£„óG9õ4PA%´Ð;ùìSÂ? e´QG…4R ÞLô«°$Å4SM7å”HD+µôB4_ÔðÌãHÕÉ;eµUW¿üT /e+Õ+Tá-Suxf™6aðUa‡%LJe¥RT!•af̃¨™¯Mtl(¶Zk¯,Vd³ZtG!éjW[Ÿ<„ lÏE·Xm·ý€÷â‹ö¬š¤kŽ7©F—ILÒ¡¸“ëȸkŽnÂÐFš´d‹ÜX˜~9HRlÂW_~Å0a…mº —‰ ¹8]“OÞt]dÛ=¦sæ ¯7ÀA¦iÎ › T˜#0tþi%B|£¸£êàBœ˜#§eΙiœGtð…Ç&yö¹Œ£“ƈ4RA”ÏFÛQ•em—_‹—æMâŠq¦å6³nð°±5òæßFª{,¹ux»‡®q†àpú n4¹»ïƒþÆH‘žÊN;sÍ]Ôvwƒî‰t‰VœÍ:È_pÈ& R9H—, h»uPp¾&Ñ¡…×}v›Äè‰äÍG¾ÍÎ+m»â’Gß–‰ät™Ã¡˜-Àã‰í"4¢ )`ƒ'Ùî–N‚šlÉŠøXH½é)´@ò›FôÖÉíp=æ ºÑs”[ZÝÝ :ºÒAïvå 7uÀ:×Áîgƒ¨ñ8:ÓjyTÍ#Üób½†Îí Ô+™>¥ÇìYE Ûc_r ´Lš6õX\™ï'“šìO"þ«Ù<ýç4¨=$"ýÓTt0@àd{¼D3èT¶²Ê¦ „yCÂï<…ÎPa ±¹þºzæ@-ü y ±­‡MTÙ¦Å%6‘E›D(;YH½•±#êâÃHYΎѲŠ‘ÙèÆÎ––ˆŸ5mja‰ZÕ¶V’¬uml [ÙÖ´µmn߈[:AC´%£‚ëÚx²–,’lMë9b¦)•»ê•[u;–èf+?"i‡Å[1á²Y»â¥š„¾UZk¸Úbx‹\_šw¹Ìk®“Ž®AÔL£:¯Rk*¬-7¿laªr‘MU# ŒÎÃ╱}a„ÁçÇ„c` nS•XÁ6N§0l,>°rìà|5c%æ—·Öä%”ÚDšÎ‰p…®Yšþ£82 FðŒ³yb‘¸Çáܰ„ÁAa›”35#汉?<ä'›5þñ½l dɆÈ^±A Ž0P#uˆ>A&2*sX2uï€Ùy)£")[m F¶Ö39ïŒÎhùZÛüæéSü,žÿFûŠeÏJ™Wï9gŸåÌÎ>Û‘3¨QŠo¯Å~áê;=“ç Õ³«Z{td g{Ö™k¦¾³×]”s¸Ѷôô¢CÍ–Q':Π>5®SÍiÔº¿)4¡:€ö›?‘¶Y¦YÍíÉà4TŒ8.t6±väüvQiç3oߨÛA*J9Œ²¥Û: 6¶OÚ¸“þ¦Ïx5h[âЉŒû¢æ¦w¶#sît³ûq"Õ·ìýÓ_×*ýxøžïu|àè.8yõ{¹¡»%–÷¶Š-Øúy§ëΤ˜eÇ0H¥,}]ì`jp”\Ÿ×³˜-äƒ0øÆ/!­ÉÈÌ–—‹´Vq9Î[,rá•Ü–=·yí܈ô¡gRç,6úzWzµ°Øâ±ôK=Œf?û¦—â7½CžÉ¤F;âÇÌžfê=¥n1ìÎóÌ+ägxû Cµ‰Ø¹Çö õûçf_8Ü›.³²Oûì}×;ËßžÓ¸“¸ŠÑ½ˆ:ˆ¡Ö*D ï>sò½õcóÑëÆËþ ­¬F ¢ÅJÖž•)iM:êùLúÁ³'‚8 H’b«‚Õ%6»çR:R¥*:ö=1JêIýé˜gòô½ýîÿN{¹[%ù³7~íyóüë«>âúÚJ¬×{ˆ>ÿ“ôíú³ÿ$Ú7{-½sœç¯n ìybH yѰ1õŠ?‰;H(T pØôè+÷ˆ«i¬Êð¿÷ÓãöÓ« Ô>í˜?ÙÀ@ HÓ 4 ô@â@øÛÀýƒöCÁô¼õ8 ëiÀ"Ãò<¯û:=ñ-‰"Bù/øANB8J.uù¼Š/Q Âéò#î2"29‘&L)Ìþ+/61$(tÂ.Ô .ôÂ0D0Ã2Ì£$<£%4Ã54(4¤#5´“\¯â¢B59B6„#2´“çª/V‚”ìÂÃÛrÃ=‚ÃÈû-e±\¯h‘/D´i Ä;ÒÃö)¯[±d—îrÄ °H$#ØÂ°oÒ°*Ã2«E‚a˜-ë²/+2㘠K ó&pzÅ*ë°ŒÅqœìy›SlÅ‘á2/3†©E3ã:Oô¬A¤ž4e¨-zÆ ¶a+6žPµeû¸}J‰~4m,·a4hT©¡«Ñ¬ù³n4¶ž¨FbkGÈF€ÂRÆeÔÁ?™(¾Ñ8”(pþû»Œª8ŠêG?ÛÇŒ›œ‹*4²p83@Å鋃$@H~LÈ»ÇOdÆDê ”s©§[Èl”+ :#[ ‘ŒÅÕ)É\9ô –ÌØÞQä ”¬:ˆbIsÚHŽÌÇA:ª¡Ø<™T»‹ü)ʳ<Í{¼ƒ(*í1ʧ GJœˆ£$óAõIJž ¦¼<ž8JèÄ ŒÂŽ„¤ž0«z=鋌µtËuT –ˆËçc=€KŠ>’7áK ˆ„ B°¼«ð£Ë°J1ó[+³¬"Ø, ‚A±¬ôÁöA¬ üCû¢þÁê@À!â!z!ý»Lþõ(Œ´?”¡3{%Æ%´¼¤Bì-J‘"”;”Í šÄÞÎBùÍZÑÂà4Nù¢ÍR²ÍãdN;Îæ„NåINZŠÎê ”ç´Î윟é&íôNçäNc9´D:ü$ùNÓÂN5áÃòª.@LÏÎZO¤”<ëJÄïêÃ]bDHŒOÎšÏ ´%[ÂÄüT¦ÎëÏÉ‚­jÚÅßÁESœÅ`TadEcŒ±~‘Å +³1ˆT<§=,Ø’§›!G–ãÆ¡‰ÇƒxÇk,y #?›F…›fóж‚-†BH‹"ÑÞÈS² ‹ä‰‡3ȽQrƒ(Q§ê¸’R9†Ù"<É”´ºžøþÉ“{É%UIžHÆ#¥©u›«¤Êà*J¯K§‹¨ìʽûžÕR Ï5뉈竱 Ì3̉+»Äͼ|>µB¿5)Ø:¡Z¡lÍȘ̿ªL¿rMÑÌÓLCÅ(Ô-mS„ &âAÜŒ,ô¬TKJ«È,0úÔRåÚ­6:Õâ4ÕôœÏV5ÕW…ÕO•ÕYÔZµU-ÅÕ\Ñ]•<ò´Oó„þÞäUc UOÉ(rÏVÖC®Ø<ÖñÕïQÄüT¯'—:D’ñ¢DáÏi¥ÖK…6eÕ-/n½%KÄ“à ²×["×Ô`ÌP31µÐzþ}Ð{½EÛ‘Ñ2 ³^<±ÐWU$F=3‚m]t2ƒ¸ƒðÅ­«PXVä {=Æ93‹WyMÖõFÕ5ŸA®2)’ 4“I H6›6xÔs¬š«Éš±HY—™ˆ=Q™µÆ@«•q´µR³YtTÇ.ÉñÙšxQ^«Ç¥آȇó·k³Ñˆ:ˆªíÇ—­œ±ðчŒÈs­ ±ÈZŠ38Í–€£6±M²•RTÛ‰àÚŒÌ({”Ú*œ×?qÒŸ9Й*m)+R¤€¬ãÉrªÉ›ôž܃HÜÂ…\(ÝV§Ã¹ÅíÞi\©›Üž¬‰¾¯,Í[(Ù[þ¢\;«$8Ÿ:×´»‹Óm;ÎýÊÊ K!,ŸóIŸ}ëÒ¥”]ˆŠÝ¦d׸q¨¬´]®TZ¼Ýå‰0ES±€×Ñ=“ÒUK©ÐË¿3p¸Ÿs˜ˆ»äÓ¶,74Y‹;=ˆŠ 5B°±°^ž-Qñ‹KðÍêÍ>ñÌCtÆ”P_ÞØÞ½<ˆÅtÞ)„^xÌÐ3}}Ôÿ}MϤÄE=ˆÑÜ¡JÕ˜Žƒ@àÔŒ`ÿ3¼¡Z`Óä\Õd׈Ô”Öý="¯3¥VÑM=IáF1Vþ­þuáV­VábÕÄ‘µaZ…á®ÔæaÙôá6K(T×'9aÖM¤VÚÉO)òþÔ&â“ö‘æuÞuàz™Že²C2)‹2ˆíX+ 1 ãW =äµ}Õ1F ‹ÐU³€r—¬ä…ý?"ã Lùm±Fþ؆­}š³˜ÆZ£>¢u´\3Y_“Ò aǵãžPeì]¾ü‹ZkZLÎ4Y¥å>p†Ê(Þ‹Y13Ù¨åa.U]ºÒ‰<ÆS·«¶“z¸s[Éo 7ëÚÍÚtS8¶˜[¿p(´µf x„^ÀŸ{8hîbþ~¹³èÛ¥ºæ“™ŸŒ:\“ôÛÍçm¼¶±(¹Èµ:†ÞF  i—¬#º­Y–fÂ(å]¼·YÁå½f5ÓÖÊ4µr^g³¸Þ]œq(—î)³ðR(ße–™o¾;/ =]½Þ³ÈËîëåŒSî%jÄÔí•Þ>=¾ó]墦µè“ËúÅ™©ÊöMjƒðxâõZ òó˦8?TÞa}åÔtA÷À¢µ>TÀÚLÆèÌð?në%ûÀÆ™ã`Öü¿œZð†wBĵ¨AÖ®ý â29b Ya jáŸöb!îÕÊö,5¶l$ÄáÍöÐÆöìþHíÐÆÃÑ&í54íÓ.ÃÔ.’ÇVª$žŸ%¦Ï©øjÕFV^Ns*–ßêÒVÙ>/.¶íÛV¿Ün1¾b2f:Îé5n¯á~Ö’8å2aî30…n‘Å히d|å—Q&³F¦d€:p†KÖô®¼ U)Ž­Ð mP³XòdöÖüÎÅ)ËØK&ä|íã³hdñ™ŒÞî.î7;X¾3ˆÙYn5>sÙš½8¥0Y½åoŒÆuð±pW£p G4Á Ú`fp”UÙšpÙ˜µçG‘é«©yîæˆ³Z©âƒn g‚´Û,Œ»ñž„oþ ¯•„#›ŠcÛÜå «ç‡qÒÅç~¹¬襋It€„ê¼)U%ÐeR·´.· 0sûü\ÊÉÇå ¿ÍºS¾òßa¿kn8Ês;ʉ`Þ™O8ˆ£,éÆpݱc×>¸@×Awó¸SßÈZžŽ<Ÿ¾óZÚaêSô±¾ˆ¤vjq{®œÞ¦`jòt¾<%î£jõßö­Þ ®‰PŸŠ?ÍtNÚa À·Àº¶ ÌÐŒÐ`µ`»þLüðõÔËÈŒHŸ¾Î$´ÆL, á\?UÌ×®‘k™ll¯mwÆ”îŽÒìqBqG÷,÷u÷OuwwOl÷xþG¬y§w6íl0ÙvN•_óüö{.x‡’+þÞFÄ÷¼v€¯,×¥úlÄ¥ÆÏ1ÞÏçVøH b[¹î]J\?ìžÀôŠOw&píoåpâ,Ü{éTðG8Rø±Fþn”RänbäøfXÑù€ùçµ`ÞeŒ9t08j`†9†®á5Nßóˆ~ÚU+7#ÝùF­"ÇHíÑ¡8[ÔÍfÓiH»Õs¸ ÒpÎñ¡úª7”«çráh­5hOºà!9-ú}…Ü*Õº+ "WûJÚáµèóI·æê‘ûKã F¼Ì#*ÖEô“~]Îû{ô üžx>ö…j^f ±)þçã^Úk¥>ˆSw=üõÓÉW›Êö׌`}‹ý˜ûjOA ¬Áô(ö>vü TÔN†on¯ç}ðÌ÷áïBÐÆBãgBßWþÖ²÷æ_-æ‡~õ”þé—Ïê—_Gþšð÷Ú¶~ëÆ~-®c:1øõBøÅþ~ä,þuÿßÖd8]è9¸dä–_õbãôï®ð/cãmˆiÈT4úN‡ŽpÊ2lè°!„âòð"ÆŒ7rìèñ#È"G’,iò$Ê”*$ì%̘2gÒ¼â…^ÅÌéF› „†Â…¡–­BBãÂ8+3ñ!€¨§>ê†Ê›£C¤tMþ„§O IY8sÆ‚Dˆ:¤>e¨‚Ân†r §«™¯=]»VªPR+.lø0âÄŠ«lIó1ä˜6!2ó°Ì¹ u¸ˆCXŠƒ&,ä Dq·smYª]‹ÎŠcÔ˜mˆýìræÍu€;\Z†S1ö9‡P—&†½–òAZfÍœƒ·U¡‹1öìÚ·sïî=¤ãÈâgN®ˆ¡·¹:U{¨¢BR^uZÝš:-„šäסéºé!Ä^|ó "˜_Âç'r—BÕ|czê˜`u~·!‡zø!ˆÂ¹4‰/•'‘ éÂÖD8œ`: §Ÿ} ÚØŽþDZø ~æ˜`C­TƒC"„C6a‚ŒŽlQ×!†8%•UZy%Gá•8Þ‰@êpÀ‘²HbÔ1‘|Õ—Ñ?¦˜"8£´ ×$½ÉP8‹8$Fð}&k^V„%¢‰*ºèvZnY—m}sŽ „˜r“˲A83 jªeäÌ|ޗक^ŠPo¡§Ã3s¨°3‘ÊPÕ”Š2!ÄE¥"”ª¥˜Þ‰: 1º,³Í:û‘£>iCb|ã *¥ô2 "áDJ1åTFeÀø¤ÁY‹­¶ú‘e„‚Lr×#™;‹AiâŒz6  9|umþ¶Ûš*”3>»0à +­´äaêpJÇøj:ÇP¼1Ç{qÄ’Mì1É%›|rà ‡lâȃ±Ê1Ë<3Í©¼r—5ë¼3Ï=“tsÈ9û<4ÑEó tÄB½4ÓMSŒ´´J;=5ÕU[ õ£R[½5×]g‡õ–Z?[㔃‡P¤D”±×mÓ v‰b;K6TÞ©ÀïÙ°.£fÂnû}2Ü$ÊÝ,Ýt+Ö–2̈45h!kÃß‘{8—-;\øÇ )´ø‚:*9è—¸²Ä8é¤X|IôH5\Í—ºXiêà'}R:T×]y¡¾—Xk±îzRK5E¶“VuUV[u¥WX}òþîYGT¼‘:àŽóªûU|”¡{¿0åâEZnÒí@6µÍqt¹M7Î#:ø@MPŒƒ‘¦Î•¯›Dé«°~i|#*Œ´é5±™MmŽÁ¾èð7|U›B§L1Gí3ºbïqYáƒÔÈp„h=íYKþCB µ§7¹†3òƒ=DBZá€NÈŸHM˜»Q wè•ðB²;ô:7A6¤ˆ:ìÜ;(ÅD}2‘JQ“bô£9IíÑÖ$tP¾<IJb’Œv䥉Ði?lj›ÄŵÑGplHõ̸¤,Âì`™" ¯TÅi…°!p*Ô›Õs@þ¢ :hBq6(AòTh2Ð3¸F„T’!Gœ„ìÔ¹>ýIXƒª›¡,ÈU†h5)$CˆµªMê@–˜ºF/¾QË^”!#À"„)m™DÞ€*5t»•&$Lº !±šU­‚LôŠ!¿ &¥Š¥Éd±²›reéÒ…:‚µ‹–ë*B<€F¬¦Èˆ¿&°q²Ë`?×ðÊu.?š“œÓôâ5¯jÔë2ûÜW¿þ°Õ3ƒ†è›7#ú±Ñ‘NdňÙN¶‹rôk­(Ë:*Ò‘Îí£ a^f¸’¨”¤.u8e‚Ò—Ò´¦©L-gÓò”11µhOƒ*TÄüþ&3*R“º‘¢†T©N}*´LZÑ£.j¥WÊ(´Ð¦6lª5eª0¨ú0XU;wSOVõÆ7…yÕ¥`+ߨ¶ ãºè…BMÅå­q AäÚúÒ·ê”a™lTCBƒ dsykËçKRšn'¼ë ~·¼Ý5O²£/r=ÝÁ³š>Éu‘âQÅ*XÑ ð8«½ç•%z›,^CÞ´Ž6{½›^Œº'ÙÉJ•t㣧³ÿð‚üƒŸüè§ûᯂÏIîù˜Ë>Ó„ê°S1 lhc›ý)·U¿&Ù")#…åïºî;54ÜŽRÖ<Ê¡DRHDêÀ…þ:€¡ iè&Þׄùå¡g1)WüÐH¿84p‚Õ„ >¤AêYℚÈ_~Fq¾ô-.ÎBˆÅ4²¶5s„™uF1’Ñ!zDã‰%G¹‘€w'ÕXGô>DH{ÒA“´Gk±sÂõ0GëÛ¹N“É:`¤#!iL’“ŠÄqéãÝa&2NæQd¬ƒ<ý8!´cH•OY(ȪÉU²—–©ÌlΗºü/},Aɹ5Ÿêî¨J%ã9« Sæ=Ç«žI+[•*W»¢æÅ®Ég:«sÜtó›A4X2ýl¨ÔÉÎF¸ž ç9ËyOá©ö"÷JfkRýÏ€ªi þ…Î>_¦/¼é ž ¥§§õP¶bº›pÞ)VKÒÕb{óØÌ~ö‡q Ô¯½Ì0-…6¶9äìls;Ûî6¸9øíp“[rã.7ºÛvît³Ûjën7¼›öîxÓ›hó®7¾wvï|ó[fûî7ÀKöï€|c/8ÂÁ§é¤6á7øÂ£Öð‡7&]e¥8K#žµ‰cü$OùxÇs𓼕ÇK®ò*|å.ŸëÉã–ò—Ó|C-¯9Îsóœó<¥1ÜÌ{.t¢þ¼rC?:wvŽ’‹(Ù™HÚÖ¦1¤›»èâ ºÈ;g¥³æí{£D©î·u3]ëKÅâø Æ9Ž«þ;L­³¯½î‚Ôœ²ìÎf¸]îVYo¹G£è9QãER{§Þ¢ÕC/u@[³8.³­Û¬åc[Ú¯8òécõ¿ùí×v|çœÛ۹τf4!Ÿ—.Â]cGõ:8Æ9 Qn°êýSûÐ|òî÷ºç½—&h{ìj²Ã§G½ß Ù›]ƒ‚¡8/rÄ;Q? ùä‡~hò'†oX~ürX¾Ïwwô_ÙwÎE0ê#F¼Ò6Þ‰þëuÈŽÑÒé±µEÝI[ÙûÁŸ´•å¤Y[ŒI™œ —aÄöuNš_–……u™Cp —Rµþ˜’“ÉXd5`ÕÀ™¤IS©h §ÈØ4]ÄŸÑ^‚´àíåòÝXp,îiòMS5ýÊž ¥mSÞ© ÕÀ™¯ÍÓ«é@·|Ë7ÈX&«ÝÉr^/„Á¸KmAÈ&ˆ¬q¡ÔD Bl!°©Ú‚ :à†ÖÓIJšÓ(ò²Iµõ!Éý¡ "!âÐ""öœ"rT ¼P½A Ì×[©”%^"&f¢&n"'v¢'~"(b¢$d@(–¢)ž"*¦b(f€$¨¢+¾",Æb*ÆßLœÂ Ü".æ¢.î"/ö¢/þ"0£0#1£1î¢$1#36£þ3>#4Fã C24^#6f£6Bc-Ì¡7~#8†£8F† $CÌÂ8¦£:®cdÌB$ƒ!°£<Î#=Ö£=Þ#>®L!øÁ.¬,ä#@ddÀ ì‚‚@&¤B.$C6ä<îã.C Ä‚CVä<Æ:$BZ$Gv¤G~dBîc ¼Ä+ÜHž¤´ÝÁ+¼„F¢¤K¾$LÆ$‰ì£¼„,ø ȤNЇ ø,¼„äN%Q¥BÒ$LÀØ‚Q¥-øÀDPndSV¥U^åîc0ÄD%øA`¥NfüALL%Xž%Z¦åLh¥L A¨%L¶ÁÈD0%\Þþ%^¥)$ƒÌĸB^ž¤+,ÀLA2˜B`&¦bzdƒøÂÄ„*ÜÂbv¤¨BL¬/øÁ Ae~&h&d1ìB2üÂüä-<@h:äP¦,ÜÁ$Ã.ÃjÖ¦mÒ£)ønŽ@¸ÂVÞfBƒ+„Àè&N'r&ç7znþÁ´Ì¥ræãøA\Áè¦L'wvç£ô¤ü£0¬B ¤‚wÚãÄÀ*¼,èfNž'|ÆçKÔ€n²‚| $èf Ü'Nçè¦1ôg@:¦l€€hm΂n2%‚ÞãSúA4¨„*fWúALè=ÞBsb(‡ªå0è¦yþvè<¦‚nö¥ˆžhU@‰¢è<n‹ÆèNjèXÊè:f§P¦îèI’¨ ªã‡úAˆ©‘:$葆ãúA€.)” dè&:F)8*èRZ©–Úã èfàfú¬)œzãè&bÆ)H妌î)é¬B2ø`òiE¹‚$Ãz ªUÊ¢¢Æ",*¤b¢@v@¤z"Tª,v¢Ž$Á„ª¨Ž*©–ª©ž*ª¦ªª®*«¶ª«¾*¬ªjÀ¤@¬Þ*®æª®¾*pj§F†­R€°+±«±+²&«þ².+³6«³>+´Fë²n­$¥J+¶f«¶n+´öê¯ëp«¸Ž+¹–«¹Nkµ䵞+»¶ë¸zë·>F°º+½Ö«½ž+µÖê½î+¿+¼ÆëLÌk¿,Ál¾Z+¬Â¶ë¿lLìÂF¬Ä’ëÁªkÂN,ÆfkÃ:ìK@,±^¬ÆJ,È:ëÈf¬³Vl>®+Á–,³²,Æn,Çzì°ºì³Ò,¿Ú,²²,Κ,Êâ£ÊìΫÎN,Ì:¬Ì kÐ*ëÎÀˆÀÇJ+[HÀ(àÒFkÒ¶¬TH-ÕR@ 5PäÀ°2@D.dÂ9”@Õúë±öì=þìÇ6íÓZþmÖNíÚÖ¬¸ª|‚„A¶„+d-tBÎú*ÇÂÄÑî¶.-:0ÁÜv«°Š6h&Ü-ɾkäNnåÎ@|6`ÄÁ ëx@9ˆ@'l9X.ë «ÛÚ#ÜÎlã>.ÞR€äRnë.ëÕ6+È–ƒ|€À@8ÁÚÒ€ CáîîÐA„%8-À@H€$ k X*ô‚ íô*˜€Øú+tÃ'̬°R¯õb/øŠ/ùZ.èÂÚ²ïõf¯íêA/Pì­9hAÿ^,„ïø–/ XBH@0±Î/«‚°êëÐëëÖcìþ"íù¦oýVïý¾oË/ý*îôаûæïþö/ ÿo“püN/+ðÈ‚,:D°Ðk'„Aò*oÇ2¯¿N ÐÀ$è°L.àÂ$è°:ÃÀ€¸ÒžƒäT.Û‚A)HïÅ&ñ7q_q¯­ä6Àê¢03±SL‚0@Tí&„ ¬-X1k± ÁçNÛ.6 1H€«H€°"€þª/Ûjpº¦,Í&,{±°®±®—1 Ÿq±³±°¾qϱâÖñ£p“1û16òã2ó°c°á*oâ@ùæ@ k/ôò/S@/0ÁþÖ"-6kœðÜŠB_l0 «/#³2Ÿ0‹dBùB³0 k”ïÌ23ô$@2SÀ23瀳6î#OïÅ2€po/ˆÂ®ÞJ²¾Ö28óÚF3×39W3Ò²s6ó6S@7û+8‹3—ó9s:ßð̾3$cÃ(ŒÂñ.ã/  ‚°¢‚Gƒ4˜Ã‹DXn‹€7€ ‹ôú’4E£0tB¯-LO/IçôÌöBãñÜæ4 rMßtò°&r±Š@ð@(´®Ën0=vð'·ôK´Jß­MONc5ð4ÒúôÜδPÏt!#µ¿FEáâ2þqÎ&4@Oó°ŠÀ&(2MçõÝæ)4ƒ6K³@5±6ƒ5#4`s³7#-.DAŒóÜöÂD[.aS@K0+PT·í$ûl%+_ûµatVçõd£ð\óBìb76PC2dK³Y£ð³îæòáîòñ´±&·ñ(ä€];Ci³2±vˆr?³` «M›ÀÚþ¶°ÒËqÕbC7Ô¶qCrÿ1Q?7”Cç~nè–ƒ°’Ãt‚(A4 Áfë3Âæìq'w&ò&Ï4È‚·ÛwS÷)_wv¿vtò,Crxÿ../ñêõF벬óf‚%xôXïàïþX…¨m^ƒ,QÛnÃ@…KÀ…—6[„×xþjA&¸ðÅb)Dð‡_, DC&„¬³Z§8×N@ ¤ÀTÀ°–À dB÷ZÂ=gp±Jõ¸ÉÆ9³æ@/,¬“Ë#UË9·Ò9ú¹Ñ¹žº°&6(Á$ ²ÁvöÛî® ++¡:¢›kÑlâ6zœ€„ä+:ì2º¥+¦k:§³ë¤Çk¥‡ºªóë³cž¯:Ñú9¥:¬×z½¶ú:¾º­+ì©kªï:°+þ®«£®{¿öú¯þº±/»´{:;³Û+²wª²G»µ£ë>_{ÁN;¢V»¶;±:û8BûŠ€ô :· ª·ƒ;¸‹»8’»Â€Xzºó©¦Þ;¾ç;(Öª¾"%PB¿¢¬Çk¼Á<Â'¼Â/<Ã7¼Ã?<ÄG¼ÄO<ÅK¼@AÅg¼Æw1ÃÆ¼ÄÁ[<|6i%<Ê¿õ¤ACÊ¿¼ÃÊBÜÁÃOÂ<Î#ê^fAfÎÿüžƒŽÞ ½Ñ›)/$ƒtA2ðÂÑ?½•º¥ ¼„ È%Ô_ý‘AÑÃÄ è(Ö}Œ®ÂqÂDn*ØŸ}‡ÖüÍÛþ$1˜$Ú¿ý„¦jÊ0D(Üß½€F@xRß÷}{FÞ¾|Áþ/ üBá€t ¾ãÃ'žÖéãO>äÓ)å_¾wF>æo¾rj>ç¾mz>èþgŠ>éŸ~`š>꯾Zª>ë¿>Vº>ìϾQÊ>íß¾NÚ>îï¾Kê>ïÿ¾Gú>ð¿C ?ñB?òŸ>È7¿Ä'‚n&‚óO¿Ã/¿º|(V€@`(Z¿½Ó:»¬»ƒ?®ûø»kù›¿¢ú³ëú³Œºÿû›küË?ŠÒýS¬§ã”ê?@P8`Aƒ&T¸aC‡[“8‘bE‹1fÔ¸þ‘cGA†9’dI“'Q¦TiÀ‡/€IAæL›7B\¹“gOŸ?:”hÉ–8‘ ¬ùréÀ¦I¡ÔY”jU«W±fÕZõèAD|Ú@YFáR:sìͱ2ÍÆ• ·¬Nݺ—o_¿ïìj:&bmÖM¦µ0Û&&Œ˜òcNÐå˜sgÏŸAS\ƒnŸœ „‘D‚„$0”>é…ÊDŽÇèz¼ºõk"ôô¢öá±9-ÄkMÛ6–ÂH’|rêÊ4v £9twïßÁ‡§81˜Ra±SÐ3 ®Iz”žS’Šãô‹{¼¾ýþ{P&Q‚$ÖÚ$ @>úìÓ l°™€:Ò®Kï6í¸Oà 9ì(ò¬¾ôzi.‡”ÂF …\Ê2a´¬%än)³]V§B¼ä—/™¸`*,ÅdH\ТE‘e_oqQß®i=A3-ɨA $àˆ ˆ‚.2qŽ «-ÈLæá–IÃ8s!ŠaŒ}†Y,¨XS^Ä¢Àe2sŸ{ daø„>†d(‡þ:±ýL“¢pç;íÏÒœ&]¬qµ–S›0åf7õ €#œqÕÄ8ȉÍlDêèHç]þ¤Sv¶£(’Rçˆ!]0À+Ä$ÈE1ê5RÀ<èY­üC“ÕKØÈϬú3" èa21‚Ä4Õ=(B5}ÕM‚!^•PA”  Á `À;‚Ô¤rm©ÑcfT¤DùhEŽzQŒ„„(áH):âQ‚~$ dªHGšK1_Õ¤']³,0RÊ]å„=X½Q9—¼>r¯ˆëk–¶T“8¥éZÙ)—¼ƒ4­É)m¢Ì«âdVÌÚ xÚ¦mþ'!0¼u q-ˆrÀƒPàÕ zmmÔúZ¤B=J°ð S£«X HJ,”²”¯K$#Q—½m x)€Ÿ ¨a5Ú;ë^7iÙ¥@ªžšUïÂJ²J«¢z+®êŠWè=0Y£ÅÏö¶eLH9 ŠÐ0”C äØB'D „h !¿žd-ëæ_hÕÜò–?±¥­ô´˜Z^N¸VÊ$s¡k7ëj—pûyVâWÆEš@ R0 ¤'ÈDi-Z õÄ(îZ<Ée¹!ûµòϰÌeƒ,¬asB¼üå›…ùÌÙXÇ>Öf„¤YÍ.c³œñlÉ*×YiwÎóŸWdËg¾jÐ…îòž4?ºÐtN´ÈÍè?;úÑ‹´¤ñLéJ Ž‚ôô§AjQú„ÜtÒª¸FU¯šÕ­võ«ÓØÆSÏšÖµ¶õ­qk]ïš×½öõ¯la›ØÅ66ò;python-nbxmpp-nbxmpp-0.6.10/doc/epydoc.conf000066400000000000000000000011311343257752000206260ustar00rootroot00000000000000[epydoc] # Information about the project. name: python-nbxmpp url: http://python-nbxmpp.gajim.org verbosity: 3 imports: yes redundant-details: yes docformat: restructuredtext # The list of modules to document. Modules can be named using # dotted names, module filenames, or package directory names. # This option may be repeated. modules: nbxmpp/* # Write html output to the directory "apidocs" output: html target: doc/apidocs/ # Include all automatically generated graphs. These graphs are # generated using Graphviz dot. graph: all dotpath: /usr/bin/dot graph-font: Sans graph-font-size: 10 python-nbxmpp-nbxmpp-0.6.10/doc/examples/000077500000000000000000000000001343257752000203165ustar00rootroot00000000000000python-nbxmpp-nbxmpp-0.6.10/doc/examples/xsend.py000077500000000000000000000051621343257752000220200ustar00rootroot00000000000000#!/usr/bin/python3 import sys import os import nbxmpp import time import logging try: from gi.repository import GObject as gobject except Exception: import gobject consoleloghandler = logging.StreamHandler() root_log = logging.getLogger('nbxmpp') #root_log.setLevel('DEBUG') root_log.addHandler(consoleloghandler) if len(sys.argv) < 2: print("Syntax: xsend JID text") sys.exit(0) to_jid = sys.argv[1] text = ' '.join(sys.argv[2:]) jidparams = {} if os.access(os.environ['HOME'] + '/.xsend', os.R_OK): for ln in open(os.environ['HOME'] + '/.xsend').readlines(): if not ln[0] in ('#', ';'): key, val = ln.strip().split('=', 1) jidparams[key.lower()] = val for mandatory in ['jid', 'password']: if mandatory not in jidparams.keys(): open(os.environ['HOME']+'/.xsend','w').write('#Uncomment fields before use and type in correct credentials.\n#JID=romeo@montague.net/resource (/resource is optional)\n#PASSWORD=juliet\n') print('Please point ~/.xsend config file to valid JID for sending messages.') sys.exit(0) class Connection: def __init__(self): self.jid = nbxmpp.protocol.JID(jidparams['jid']) self.password = jidparams['password'] self.sm = nbxmpp.Smacks(self) # Stream Management self.client_cert = None def on_auth(self, con, auth): if not auth: print('could not authenticate!') sys.exit() print('authenticated using ' + auth) self.send_message(to_jid, text) def on_connected(self, con, con_type): print('connected with ' + con_type) auth = self.client.auth(self.jid.getNode(), self.password, resource=self.jid.getResource(), sasl=1, on_auth=self.on_auth) def get_password(self, cb, mech): cb(self.password) def on_connection_failed(self): print('could not connect!') def _event_dispatcher(self, realm, event, data): pass def connect(self): idle_queue = nbxmpp.idlequeue.get_idlequeue() self.client = nbxmpp.NonBlockingClient(self.jid.getDomain(), idle_queue, caller=self) self.con = self.client.connect(self.on_connected, self.on_connection_failed, secure_tuple=('tls', '', '', None, None)) def send_message(self, to_jid, text): id_ = self.client.send(nbxmpp.protocol.Message(to_jid, text, typ='chat')) print('sent message with id ' + id_) gobject.timeout_add(1000, self.quit) def quit(self): self.disconnect() ml.quit() def disconnect(self): self.client.start_disconnect() con = Connection() con.connect() ml = gobject.MainLoop() ml.run() python-nbxmpp-nbxmpp-0.6.10/nbxmpp/000077500000000000000000000000001343257752000172375ustar00rootroot00000000000000python-nbxmpp-nbxmpp-0.6.10/nbxmpp/__init__.py000066400000000000000000000014041343257752000213470ustar00rootroot00000000000000# $Id: __init__.py,v 1.9 2005/03/07 09:34:51 snakeru Exp $ """ This is a fork of the xmpppy jabber python library. Most of the code is inherited but has been extended by implementation of non-blocking transports and new features like BOSH. Most of the xmpp classes are ancestors of PlugIn class to share a single set of methods in order to compile a featured and extensible XMPP client. Thanks and credits to the xmpppy developers. See: http://xmpppy.sourceforge.net/ """ from .protocol import * from . import simplexml, protocol, auth_nb, transports_nb, roster_nb from . import dispatcher_nb, features_nb, idlequeue, bosh, tls_nb, proxy_connectors from .client_nb import NonBlockingClient from .plugin import PlugIn from .smacks import Smacks __version__ = "0.6.10" python-nbxmpp-nbxmpp-0.6.10/nbxmpp/auth_nb.py000066400000000000000000000755731343257752000212520ustar00rootroot00000000000000## auth_nb.py ## based on auth.py, changes backported up to revision 1.41 ## ## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov ## modified by Dimitur Kirov ## ## 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. """ Provides plugs for SASL and NON-SASL authentication mechanisms. Can be used both for client and transport authentication See client_nb.py """ from __future__ import unicode_literals from .protocol import NS_SASL, NS_SESSION, NS_STREAMS, NS_BIND, NS_AUTH from .protocol import NS_STREAM_MGMT, NS_DOMAIN_BASED_NAME from .protocol import Node, NodeProcessed, isResultNode, Iq, Protocol, JID from .plugin import PlugIn import sys import re import os import binascii import base64 from . import dispatcher_nb import hmac import hashlib import logging log = logging.getLogger('nbxmpp.auth_nb') def HH(some): return hashlib.md5(some).hexdigest() def H(some): return hashlib.md5(some).digest() def C(some): return b':'.join(some) try: kerberos = __import__('kerberos') have_kerberos = True except ImportError: have_kerberos = False GSS_STATE_STEP = 0 GSS_STATE_WRAP = 1 SASL_FAILURE_IN_PROGRESS = 'failure-in-process' SASL_FAILURE = 'failure' SASL_SUCCESS = 'success' SASL_UNSUPPORTED = 'not-supported' SASL_IN_PROCESS = 'in-process' # compile the search regex for _challenge_splitter _challenge_regex = re.compile(""" (\w+) # keyword = ("[^"]+"|[^,]+) # value ,? # optional comma separator """, re.VERBOSE) def _challenge_splitter(data): """ Helper function that creates a dict from challenge string. Used for DIGEST-MD5 authentication. Sample challenge string: - username="example.org",realm="somerealm", nonce="OA6MG9tEQGm2hh",cnonce="OA6MHXh6VqTrRk", nc=00000001,qop="auth,auth-int,auth-conf",charset=utf-8 Expected result for challan: - dict['qop'] = ('auth','auth-int','auth-conf') - dict['realm'] = 'somerealm' """ dict_ = {} for match in _challenge_regex.finditer(data): k = match.group(1) v = match.group(2) if v.startswith('"'): v = v[1:-1] # Remove quote if v.find(',') >= 0: v = v.split(',') # Split using comma dict_[k] = v return dict_ def _scram_parse(chatter): """Helper function. Used for SCRAM-SHA-1, SCRAM-SHA-1-PLUS authentication""" return dict(s.split('=', 1) for s in chatter.split(',')) SASL_AUTHENTICATION_MECHANISMS = \ set(['ANONYMOUS', 'EXTERNAL', 'GSSAPI', 'SCRAM-SHA-1-PLUS', 'SCRAM-SHA-1', 'PLAIN', 'X-MESSENGER-OAUTH2']) class SASL(PlugIn): """ Implements SASL authentication. Can be plugged into NonBlockingClient to start authentication """ def __init__(self, username, password, on_sasl, channel_binding, auth_mechs): """ :param username: XMPP username :param password: XMPP password :param on_sasl: Callback, will be called after each SASL auth-step. :param channel_binding: TLS channel binding data, None if the binding data is not available :param auth_mechs: Set of valid authentication mechanisms. Possible entries are: 'ANONYMOUS', 'EXTERNAL', 'GSSAPI', 'SCRAM-SHA-1-PLUS', 'SCRAM-SHA-1', 'DIGEST-MD5', 'PLAIN', 'X-MESSENGER-OAUTH2' """ PlugIn.__init__(self) self.username = username self.password = password self.on_sasl = on_sasl self.channel_binding = channel_binding self.enabled_auth_mechs = auth_mechs self.realm = None self._domain_based_name = None def plugin(self, owner): if 'version' not in self._owner.Dispatcher.Stream._document_attrs: self.startsasl = SASL_UNSUPPORTED elif self._owner.Dispatcher.Stream.features: try: self.FeaturesHandler(self._owner.Dispatcher, self._owner.Dispatcher.Stream.features) except NodeProcessed: pass else: self.startsasl = None def plugout(self): """ Remove SASL handlers from owner's dispatcher. Used internally """ if 'features' in self._owner.__dict__: self._owner.UnregisterHandler('features', self.FeaturesHandler, xmlns=NS_STREAMS) if 'challenge' in self._owner.__dict__: self._owner.UnregisterHandler('challenge', self.SASLHandler, xmlns=NS_SASL) if 'failure' in self._owner.__dict__: self._owner.UnregisterHandler('failure', self.SASLHandler, xmlns=NS_SASL) if 'success' in self._owner.__dict__: self._owner.UnregisterHandler('success', self.SASLHandler, xmlns=NS_SASL) def auth(self): """ Start authentication. Result can be obtained via "SASL.startsasl" attribute and will be either SASL_SUCCESS or SASL_FAILURE Note that successful auth will take at least two Dispatcher.Process() calls. """ if self.startsasl: pass elif self._owner.Dispatcher.Stream.features: try: self.FeaturesHandler(self._owner.Dispatcher, self._owner.Dispatcher.Stream.features) except NodeProcessed: pass else: self._owner.RegisterHandler('features', self.FeaturesHandler, xmlns=NS_STREAMS) def FeaturesHandler(self, conn, feats): """ Used to determine if server supports SASL auth. Used internally """ if not feats.getTag('mechanisms', namespace=NS_SASL): self.startsasl='not-supported' log.info('SASL not supported by server') return self.mecs = set( mec.getData() for mec in feats.getTag('mechanisms', namespace=NS_SASL).getTags('mechanism') ) & self.enabled_auth_mechs hostname = feats.getTag('hostname', namespace=NS_DOMAIN_BASED_NAME) if hostname is not None: self._domain_based_name = hostname.getData() # Password based authentication mechanism ordered by strength. # If the server supports a mechanism disable all weaker mechanisms. password_auth_mechs_strength = ['SCRAM-SHA-1-PLUS', 'SCRAM-SHA-1', 'DIGEST-MD5', 'PLAIN', 'X-MESSENGER-OAUTH2'] if self.channel_binding is None: password_auth_mechs_strength.remove('SCRAM-SHA-1-PLUS') for i in range(0, len(password_auth_mechs_strength)): if password_auth_mechs_strength[i] in self.mecs: for m in password_auth_mechs_strength[i + 1:]: self.mecs.discard(m) break self._owner.RegisterHandler('challenge', self.SASLHandler, xmlns=NS_SASL) self._owner.RegisterHandler('failure', self.SASLHandler, xmlns=NS_SASL) self._owner.RegisterHandler('success', self.SASLHandler, xmlns=NS_SASL) self.MechanismHandler() def MechanismHandler(self): if 'ANONYMOUS' in self.mecs and self.username is None: self.mecs.remove('ANONYMOUS') node = Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'ANONYMOUS'}) self.mechanism = 'ANONYMOUS' self.startsasl = SASL_IN_PROCESS self._owner.send(str(node)) raise NodeProcessed if "EXTERNAL" in self.mecs: self.mecs.remove('EXTERNAL') sasl_data = '%s@%s' % (self.username, self._owner.Server) sasl_data = base64.b64encode(sasl_data.encode('utf-8')).decode( 'utf-8').replace('\n', '') node = Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'EXTERNAL'}, payload=[sasl_data]) self.mechanism = 'EXTERNAL' self.startsasl = SASL_IN_PROCESS self._owner.send(str(node)) raise NodeProcessed if 'GSSAPI' in self.mecs and have_kerberos: self.mecs.remove('GSSAPI') hostname = self._domain_based_name or self._owner.xmpp_hostname try: self.gss_vc = kerberos.authGSSClientInit('xmpp@%s' % hostname)[1] kerberos.authGSSClientStep(self.gss_vc, '') response = kerberos.authGSSClientResponse(self.gss_vc) node=Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'GSSAPI'}, payload=(response or '')) self.mechanism = 'GSSAPI' self.gss_step = GSS_STATE_STEP self.startsasl = SASL_IN_PROCESS self._owner.send(str(node)) raise NodeProcessed except kerberos.GSSError as e: log.info('GSSAPI authentication failed: %s' % str(e)) if 'SCRAM-SHA-1-PLUS' in self.mecs and self.channel_binding is not None: self.mecs.remove('SCRAM-SHA-1-PLUS') self.mechanism = 'SCRAM-SHA-1-PLUS' self._owner._caller.get_password(self.set_password, self.mechanism) self.scram_step = 0 self.startsasl = SASL_IN_PROCESS raise NodeProcessed if 'SCRAM-SHA-1' in self.mecs: self.mecs.remove('SCRAM-SHA-1') self.mechanism = 'SCRAM-SHA-1' self._owner._caller.get_password(self.set_password, self.mechanism) self.scram_step = 0 self.startsasl = SASL_IN_PROCESS raise NodeProcessed if 'DIGEST-MD5' in self.mecs: self.mecs.remove('DIGEST-MD5') node = Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'DIGEST-MD5'}) self.mechanism = 'DIGEST-MD5' self.startsasl = SASL_IN_PROCESS self._owner.send(str(node)) raise NodeProcessed if 'PLAIN' in self.mecs: self.mecs.remove('PLAIN') self.mechanism = 'PLAIN' self._owner._caller.get_password(self.set_password, self.mechanism) self.startsasl = SASL_IN_PROCESS raise NodeProcessed if 'X-MESSENGER-OAUTH2' in self.mecs: self.mecs.remove('X-MESSENGER-OAUTH2') self.mechanism = 'X-MESSENGER-OAUTH2' self._owner._caller.get_password(self.set_password, self.mechanism) self.startsasl = SASL_IN_PROCESS raise NodeProcessed self.startsasl = SASL_FAILURE log.info('I can only use ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1-PLUS,' ' SCRAM-SHA-1, DIGEST-MD5, PLAIN and X-MESSENGER-OAUTH2' ' mechanisms.') if self.on_sasl: self.on_sasl() return def SASLHandler(self, conn, challenge): """ Perform next SASL auth step. Used internally """ if challenge.getNamespace() != NS_SASL: return def scram_base64(s): try: s = s.encode('utf-8') except: pass return ''.join(base64.b64encode(s).decode('utf-8').\ split('\n')) incoming_data = challenge.getData() data=base64.b64decode(incoming_data.encode('utf-8')) if self.mechanism != 'GSSAPI': data=data.decode('utf-8') ### Handle Auth result def on_auth_fail(reason): log.info('Failed SASL authentification: %s' % reason) self._owner.send(str(Node('abort', attrs={'xmlns': NS_SASL}))) if len(self.mecs) > 0: # There are other mechanisms to test, but wait for # answer from server self.startsasl = SASL_FAILURE_IN_PROGRESS raise NodeProcessed if self.on_sasl: self.on_sasl() raise NodeProcessed if challenge.getName() == 'failure': if self.startsasl == SASL_FAILURE_IN_PROGRESS: self.MechanismHandler() raise NodeProcessed self.startsasl = SASL_FAILURE try: reason = challenge.getChildren()[0] except Exception: reason = challenge on_auth_fail(reason) elif challenge.getName() == 'success': if self.mechanism in ('SCRAM-SHA-1', 'SCRAM-SHA-1-PLUS'): # check data-with-success data = _scram_parse(data) if data['v'] != scram_base64(self.scram_ServerSignature): on_auth_fail('ServerSignature is wrong') self.startsasl = SASL_SUCCESS log.info('Successfully authenticated with remote server.') handlers = self._owner.Dispatcher.dumpHandlers() # Bosh specific dispatcher replugging # save old features. They will be used in case we won't get response # on stream restart after SASL auth (happens with XMPP over BOSH # with Openfire) old_features = self._owner.Dispatcher.Stream.features self._owner.Dispatcher.PlugOut() dispatcher_nb.Dispatcher.get_instance().PlugIn(self._owner, after_SASL=True, old_features=old_features) self._owner.Dispatcher.restoreHandlers(handlers) self._owner.User = self.username if self.on_sasl: self.on_sasl() raise NodeProcessed ### Perform auth step if self.mechanism != 'GSSAPI': log.info('Got challenge:' + data) else: log.info('Got challenge') if self.mechanism == 'GSSAPI': if self.gss_step == GSS_STATE_STEP: rc = kerberos.authGSSClientStep(self.gss_vc, incoming_data) if rc != kerberos.AUTH_GSS_CONTINUE: self.gss_step = GSS_STATE_WRAP elif self.gss_step == GSS_STATE_WRAP: rc = kerberos.authGSSClientUnwrap(self.gss_vc, incoming_data) response = kerberos.authGSSClientResponse(self.gss_vc) rc = kerberos.authGSSClientWrap(self.gss_vc, response, kerberos.authGSSClientUserName(self.gss_vc)) response = kerberos.authGSSClientResponse(self.gss_vc) if not response: response = '' self._owner.send(Node('response', attrs={'xmlns': NS_SASL}, payload=response).__str__()) raise NodeProcessed if self.mechanism in ('SCRAM-SHA-1', 'SCRAM-SHA-1-PLUS'): hashfn = hashlib.sha1 def HMAC(k, s): return hmac.new(key=k, msg=s, digestmod=hashfn).digest() if sys.version_info[0] == 2: def XOR(x, y): r = (chr(ord(px) ^ ord(py)) for px, py in zip(x, y)) return bytes(b''.join(r)) else: def XOR(x, y): r = [px ^ py for px, py in zip(x, y)] return bytes(r) def Hi(s, salt, iters): ii = 1 try: s = s.encode('utf-8') except: pass ui_1 = HMAC(s, salt + b'\0\0\0\01') ui = ui_1 for i in range(iters - 1): ii += 1 ui_1 = HMAC(s, ui_1) ui = XOR(ui, ui_1) return ui def scram_H(s): return hashfn(s).digest() if self.scram_step == 0: self.scram_step = 1 self.scram_soup += ',' + data + ',' data = _scram_parse(data) # Check server nonce here. # The first part of server nonce muss be the nonce send by client. if (data['r'][:len(self.client_nonce)] != self.client_nonce): on_auth_fail('Server nonce is incorrect') raise NodeProcessed if self.mechanism == 'SCRAM-SHA-1': r = 'c=' + scram_base64(self.scram_gs2) else: # Channel binding data goes in here too. r = 'c=' + scram_base64(self.scram_gs2.encode('utf-8') + self.channel_binding) r += ',r=' + data['r'] self.scram_soup += r self.scram_soup = self.scram_soup.encode('utf-8') salt = base64.b64decode(data['s'].encode('utf-8')) iter = int(data['i']) SaltedPassword = Hi(self.password, salt, iter) # TODO: Could cache this, along with salt+iter. ClientKey = HMAC(SaltedPassword, b'Client Key') StoredKey = scram_H(ClientKey) ClientSignature = HMAC(StoredKey, self.scram_soup) ClientProof = XOR(ClientKey, ClientSignature) r += ',p=' + scram_base64(ClientProof) ServerKey = HMAC(SaltedPassword, b'Server Key') self.scram_ServerSignature = HMAC(ServerKey, self.scram_soup) sasl_data = scram_base64(r) node = Node('response', attrs={'xmlns': NS_SASL}, payload=[sasl_data]) self._owner.send(str(node)) raise NodeProcessed if self.scram_step == 1: data = _scram_parse(data) if base64.b64decode(data['v'].encode('utf-8')).decode('utf-8') \ != self.scram_ServerSignature: # TODO: Not clear what to do here - need to abort. raise Exception node = Node('response', attrs={'xmlns': NS_SASL}); self._owner.send(str(node)) raise NodeProcessed # DIGEST-MD5 # magic foo... chal = _challenge_splitter(data) if not self.realm and 'realm' in chal: self.realm = chal['realm'] if 'qop' in chal and ((chal['qop'] =='auth') or \ (isinstance(chal['qop'], list) and 'auth' in chal['qop'])): self.resp = {'username': self.username, 'nonce': chal['nonce'], 'cnonce': '%x' % int(binascii.hexlify(os.urandom(24)), 16), 'nc': ('00000001'), # ToDo: Is this a tupel or only a string? 'qop': 'auth', 'digest-uri': 'xmpp/' + self._owner.Server, 'charset': 'utf-8' } if self.realm: self.resp['realm'] = self.realm else: self.resp['realm'] = self._owner.Server # Password is now required self._owner._caller.get_password(self.set_password, self.mechanism) elif 'rspauth' in chal: # Check rspauth value if chal['rspauth'] != self.digest_rspauth: on_auth_fail('rspauth is wrong') self._owner.send(str(Node('response', attrs={'xmlns':NS_SASL}))) else: self.startsasl = SASL_FAILURE log.info('Failed SASL authentification: unknown challenge') if self.on_sasl: self.on_sasl() raise NodeProcessed @staticmethod def _convert_to_iso88591(string): try: string = string.encode('iso-8859-1') except UnicodeEncodeError: pass return string def set_password(self, password): self.password = '' if password is None else password if self.mechanism in ('SCRAM-SHA-1', 'SCRAM-SHA-1-PLUS'): self.client_nonce = '%x' % int(binascii.hexlify(os.urandom(24)), 16) self.scram_soup = 'n=' + self.username + ',r=' + self.client_nonce if self.mechanism == 'SCRAM-SHA-1': if self.channel_binding is None: # Client doesn't support Channel Binding self.scram_gs2 = 'n,,' # No CB yet. else: # Client supports CB, but server doesn't support CB self.scram_gs2 = 'y,,' else: self.scram_gs2 = 'p=tls-unique,,' sasl_data = base64.b64encode((self.scram_gs2 + self.scram_soup).\ encode('utf-8')).decode('utf-8').replace('\n', '') node = Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': self.mechanism}, payload=[sasl_data]) elif self.mechanism == 'DIGEST-MD5': hash_username = self._convert_to_iso88591(self.resp['username']) hash_realm = self._convert_to_iso88591(self.resp['realm']) hash_password = self._convert_to_iso88591(self.password) A1 = C([H(C([hash_username, hash_realm, hash_password])), self.resp['nonce'].encode('utf-8'), self.resp['cnonce'].encode( 'utf-8')]) A2 = C([b'AUTHENTICATE', self.resp['digest-uri'].encode('utf-8')]) response = HH(C([HH(A1).encode('utf-8'), self.resp['nonce'].encode( 'utf-8'), self.resp['nc'].encode('utf-8'), self.resp['cnonce'].\ encode('utf-8'), self.resp['qop'].encode('utf-8'), HH(A2).\ encode('utf-8')])) A2 = C([b'', self.resp['digest-uri'].encode('utf-8')]) self.digest_rspauth = HH(C([HH(A1).encode('utf-8'), self.resp[ 'nonce'].encode('utf-8'), self.resp['nc'].encode('utf-8'), self.resp['cnonce'].encode('utf-8'), self.resp['qop'].encode( 'utf-8'), HH(A2).encode('utf-8')])) self.resp['response'] = response sasl_data = '' for key in ('charset', 'username', 'realm', 'nonce', 'nc', 'cnonce', 'digest-uri', 'response', 'qop'): if key in ('nc', 'qop', 'response', 'charset'): sasl_data += "%s=%s," % (key, self.resp[key]) else: sasl_data += '%s="%s",' % (key, self.resp[key]) sasl_data = base64.b64encode(sasl_data[:-1].encode('utf-8')).\ decode('utf-8').replace('\r', '').replace('\n', '') node = Node('response', attrs={'xmlns': NS_SASL}, payload=[sasl_data]) elif self.mechanism == 'PLAIN': sasl_data = '\x00%s\x00%s' % (self.username, self.password) sasl_data = base64.b64encode(sasl_data.encode('utf-8')).decode( 'utf-8').replace('\n', '') node = Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'PLAIN'}, payload=[sasl_data]) elif self.mechanism == 'X-MESSENGER-OAUTH2': node = Node('auth', attrs={'xmlns': NS_SASL, 'mechanism': 'X-MESSENGER-OAUTH2'}) node.addData(password) self._owner.send(str(node)) class NonBlockingNonSASL(PlugIn): """ Implements old Non-SASL (XEP-0078) authentication used in jabberd1.4 and transport authentication """ def __init__(self, user, password, resource, on_auth): """ Caches username, password and resource for auth """ PlugIn.__init__(self) self.user = user if password is None: self.password = '' else: self.password = password self.resource = resource self.on_auth = on_auth def plugin(self, owner): """ Determine the best auth method (digest/0k/plain) and use it for auth. Returns used method name on success. Used internally """ log.info('Querying server about possible auth methods') self.owner = owner owner.Dispatcher.SendAndWaitForResponse( Iq('get', NS_AUTH, payload=[Node('username', payload=[self.user])]), func=self._on_username) def _on_username(self, resp): if not isResultNode(resp): log.info('No result node arrived! Aborting...') return self.on_auth(None) iq=Iq(typ='set', node=resp) query = iq.getTag('query') query.setTagData('username', self.user) query.setTagData('resource', self.resource) if query.getTag('digest'): log.info("Performing digest authentication") query.setTagData('digest', hashlib.sha1(self.owner.Dispatcher.Stream._document_attrs['id'] + self.password).hexdigest()) if query.getTag('password'): query.delChild('password') self._method = 'digest' elif query.getTag('token'): token = query.getTagData('token') seq = query.getTagData('sequence') log.info("Performing zero-k authentication") def hasher(s): return hashlib.sha1(s).hexdigest() def hash_n_times(s, count): return count and hasher(hash_n_times(s, count-1)) or s hash_ = hash_n_times(hasher(hasher(self.password) + token), int(seq)) query.setTagData('hash', hash_) self._method='0k' else: log.warning("Secure methods unsupported, performing plain text \ authentication") self._method = 'plain' self._owner._caller.get_password(self._on_password, self._method) return resp = self.owner.Dispatcher.SendAndWaitForResponse(iq, func=self._on_auth) def _on_password(self, password): self.password = '' if password is None else password iq=Iq('set', NS_AUTH) query = iq.getTag('query') query.setTagData('username', self.user) query.setTagData('resource', self.resource) query.setTagData('password', self.password) resp = self.owner.Dispatcher.SendAndWaitForResponse(iq, func=self._on_auth) def _on_auth(self, resp): if isResultNode(resp): log.info('Sucessfully authenticated with remote host.') self.owner.User = self.user self.owner.Resource = self.resource self.owner._registered_name = self.owner.User + '@' + \ self.owner.Server+ '/' + self.owner.Resource return self.on_auth(self._method) log.info('Authentication failed!') return self.on_auth(None) class NonBlockingBind(PlugIn): """ Bind some JID to the current connection to allow router know of our location. Must be plugged after successful SASL auth """ def __init__(self): PlugIn.__init__(self) self.bound = None self.supports_sm = False self.resuming = False def plugin(self, owner): """ Start resource binding, if allowed at this time. Used internally. """ if self._owner.Dispatcher.Stream.features: try: self.FeaturesHandler(self._owner.Dispatcher, self._owner.Dispatcher.Stream.features) except NodeProcessed: pass else: self._owner.RegisterHandler('features', self.FeaturesHandler, xmlns=NS_STREAMS) def FeaturesHandler(self, conn, feats): """ Determine if server supports resource binding and set some internal attributes accordingly. It also checks if server supports stream management """ if feats.getTag('sm', namespace=NS_STREAM_MGMT): self.supports_sm = True # server supports stream management if self.resuming: self._owner._caller.sm.resume_request() if not feats.getTag('bind', namespace=NS_BIND): log.info('Server does not requested binding.') # we try to bind resource anyway #self.bound='failure' self.bound = [] return self.session = -1 session = feats.getTag('session', namespace=NS_SESSION) if session is not None: if session.getTag('optional') is None: self.session = 1 self.bound = [] def plugout(self): """ Remove Bind handler from owner's dispatcher. Used internally """ self._owner.UnregisterHandler('features', self.FeaturesHandler, xmlns=NS_STREAMS) def NonBlockingBind(self, resource=None, on_bound=None): """ Perform binding. Use provided resource name or random (if not provided). """ if self.resuming: # We don't bind if we resume the stream return self.on_bound = on_bound self._resource = resource if self._resource: self._resource = [Node('resource', payload=[self._resource])] else: self._resource = [] self._owner.onreceive(None) self._owner.Dispatcher.SendAndWaitForResponse( Protocol('iq', typ='set', payload=[Node('bind', attrs={'xmlns': NS_BIND}, payload=self._resource)]), func=self._on_bound) def _on_bound(self, resp): if isResultNode(resp): if resp.getTag('bind') and resp.getTag('bind').getTagData('jid'): self.bound.append(resp.getTag('bind').getTagData('jid')) log.info('Successfully bound %s.' % self.bound[-1]) jid = JID(resp.getTag('bind').getTagData('jid')) self._owner._registered_name = jid self._owner.User = jid.getNode() self._owner.Resource = jid.getResource() # Only negociate stream management after bounded if self.supports_sm: # starts negociation sm = self._owner._caller.sm sm.supports_sm = True sm.set_owner(self._owner) sm.negociate() self._owner.Dispatcher.sm = sm if hasattr(self, 'session') and self.session == -1: # Server don't want us to initialize a session log.info('No session required.') self._owner._caller.sm.resend_queue() #resend old messages still in the smacks queue self.on_bound('ok') else: self._owner.SendAndWaitForResponse(Protocol('iq', typ='set', payload=[Node('session', attrs={'xmlns':NS_SESSION})]), func=self._on_session) return if resp: log.info('Binding failed: %s.' % resp.getTag('error')) self.on_bound(None) else: log.info('Binding failed: timeout expired.') self.on_bound(None) def _on_session(self, resp): self._owner.onreceive(None) if isResultNode(resp): log.info('Successfully opened session.') self.session = 1 self._owner._caller.sm.resend_queue() #resend old messages still in the smacks queue self.on_bound('ok') else: log.error('Session open failed.') self.session = 0 self.on_bound(None) python-nbxmpp-nbxmpp-0.6.10/nbxmpp/bosh.py000066400000000000000000000535741343257752000205620ustar00rootroot00000000000000## bosh.py ## ## ## Copyright (C) 2008 Tomas Karasek ## ## This file is part of Gajim. ## ## Gajim is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published ## by the Free Software Foundation; version 3 only. ## ## Gajim is distributed in the hope that 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 Gajim. If not, see . import os import binascii import locale from hashlib import sha1 from .transports_nb import NonBlockingTransport, NonBlockingHTTPBOSH,\ CONNECTED, CONNECTING, DISCONNECTED, DISCONNECTING,\ urisplit, DISCONNECT_TIMEOUT_SECONDS from .protocol import BOSHBody, Protocol, NS_CLIENT from .simplexml import Node import logging log = logging.getLogger('nbxmpp.bosh') KEY_COUNT = 10 # Fake file descriptor - it's used for setting read_timeout in idlequeue for # BOSH Transport. In TCP-derived transports this is file descriptor of socket. FAKE_DESCRIPTOR = -1337 class NonBlockingBOSH(NonBlockingTransport): def __init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, tls_version, cipher_list, xmpp_server, domain, bosh_dict, proxy_creds): NonBlockingTransport.__init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, tls_version, cipher_list) self.bosh_sid = None self.http_version = 'HTTP/1.1' self.http_persistent = True self.http_pipelining = bosh_dict['bosh_http_pipelining'] self.bosh_to = domain self.route_host, self.route_port = xmpp_server self.bosh_wait = bosh_dict['bosh_wait'] if not self.http_pipelining: self.bosh_hold = 1 else: self.bosh_hold = bosh_dict['bosh_hold'] self.bosh_requests = self.bosh_hold self.bosh_uri = bosh_dict['bosh_uri'] self.bosh_content = bosh_dict['bosh_content'] self.over_proxy = bosh_dict['bosh_useproxy'] if estabilish_tls: self.bosh_secure = 'true' else: self.bosh_secure = 'false' self.tls_version = tls_version self.cipher_list = cipher_list self.use_proxy_auth = bosh_dict['useauth'] self.proxy_creds = proxy_creds self.wait_cb_time = None self.http_socks = [] self.stanza_buffer = [] self.prio_bosh_stanzas = [] self.current_recv_handler = None self.current_recv_socket = None self.key_stack = None self.ack_checker = None self.after_init = False self.proxy_dict = {} if self.over_proxy and self.estabilish_tls: self.proxy_dict['type'] = 'http' # with SSL over proxy, we do HTTP CONNECT to proxy to open a channel to # BOSH Connection Manager host, port = urisplit(self.bosh_uri)[1:3] self.proxy_dict['xmpp_server'] = (host, port) self.proxy_dict['credentials'] = self.proxy_creds # ssl variables self.ssl_certificate = None # first ssl error self.ssl_errnum = 0 # all ssl errors self.ssl_errors = [] def connect(self, conn_5tuple, on_connect, on_connect_failure): NonBlockingTransport.connect(self, conn_5tuple, on_connect, on_connect_failure) global FAKE_DESCRIPTOR FAKE_DESCRIPTOR -= 1 self.fd = FAKE_DESCRIPTOR self.stanza_buffer = [] self.prio_bosh_stanzas = [] self.key_stack = KeyStack(KEY_COUNT) self.ack_checker = AckChecker() self.after_init = True self.http_socks.append(self.get_new_http_socket()) self._tcp_connecting_started() self.http_socks[0].connect( conn_5tuple = conn_5tuple, on_connect = self._on_connect, on_connect_failure = self._on_connect_failure) def _on_connect(self): self.peerhost = self.http_socks[0].peerhost self.ssl_lib = self.http_socks[0].ssl_lib NonBlockingTransport._on_connect(self) def set_timeout(self, timeout): if self.get_state() != DISCONNECTED and self.fd != -1: NonBlockingTransport.set_timeout(self, timeout) else: log.warning('set_timeout: TIMEOUT NOT SET: state is %s, fd is %s' % (self.get_state(), self.fd)) def on_http_request_possible(self): """ Called when HTTP request it's possible to send a HTTP request. It can be when socket is connected or when HTTP response arrived There should be always one pending request to BOSH CM. """ log.debug('on_http_req possible, state:\n%s' % self.get_current_state()) if self.get_state()==DISCONNECTED: return #Hack for making the non-secure warning dialog work if self._owner.got_features: if (hasattr(self._owner, 'NonBlockingNonSASL') or hasattr(self._owner, 'SASL')): self.send_BOSH(None) else: # If we already got features and no auth module was plugged yet, we are # probably waiting for confirmation of the "not-secure-connection" dialog. # We don't send HTTP request in that case. # see http://lists.jabber.ru/pipermail/ejabberd/2008-August/004027.html return else: self.send_BOSH(None) def get_socket_in(self, state): """ Get sockets in desired state """ for s in self.http_socks: if s.get_state()==state: return s return None def get_free_socket(self): """ Select and returns socket eligible for sending a data to """ if self.http_pipelining: return self.get_socket_in(CONNECTED) else: last_recv_time, tmpsock = 0, None for s in self.http_socks: # we're interested only in CONNECTED socket with no requests pending if s.get_state()==CONNECTED and s.pending_requests==0: # if there's more of them, we want the one with the least recent data receive # (lowest last_recv_time) if (last_recv_time==0) or (s.last_recv_time < last_recv_time): last_recv_time = s.last_recv_time tmpsock = s if tmpsock: return tmpsock else: return None def send_BOSH(self, payload): """ Tries to send a stanza in payload by appeding it to a buffer and plugging a free socket for writing. """ total_pending_reqs = sum([s.pending_requests for s in self.http_socks]) # when called after HTTP response (Payload=None) and when there are already # some pending requests and no data to send, or when the socket is # disconnected, we do nothing if payload is None and \ total_pending_reqs > 0 and \ self.stanza_buffer == [] and \ self.prio_bosh_stanzas == [] or \ self.get_state()==DISCONNECTED: return # Add xmlns to stanza to help ejabberd server if payload and isinstance(payload, Protocol): if not payload.getNamespace(): payload.setNamespace(NS_CLIENT) # now the payload is put to buffer and will be sent at some point self.append_stanza(payload) # if we're about to make more requests than allowed, we don't send - stanzas will be # sent after HTTP response from CM, exception is when we're disconnecting - then we # send anyway if total_pending_reqs >= self.bosh_requests and self.get_state()!=DISCONNECTING: log.warning('attemp to make more requests than allowed by Connection Manager:\n%s' % self.get_current_state()) return # when there's free CONNECTED socket, we plug it for write and the data will # be sent when write is possible if self.get_free_socket(): self.plug_socket() return # if there is a connecting socket, we just wait for when it connects, # payload will be sent in a sec when the socket connects if self.get_socket_in(CONNECTING): return # being here means there are either DISCONNECTED sockets or all sockets are # CONNECTED with too many pending requests s = self.get_socket_in(DISCONNECTED) # if we have DISCONNECTED socket, lets connect it and plug for send if s: self.connect_and_flush(s) else: # otherwise create and connect a new one ss = self.get_new_http_socket() self.http_socks.append(ss) self.connect_and_flush(ss) return def plug_socket(self): stanza = None s = self.get_free_socket() if s: s._plug_idle(writable=True, readable=True) else: log.error('=====!!!!!!!!====> Couldn\'t get free socket in plug_socket())') def build_stanza(self, socket): """ Build a BOSH body tag from data in buffers and adds key, rid and ack attributes to it This method is called from _do_send() of underlying transport. This is to ensure rid and keys will be processed in correct order. If I generate them before plugging a socket for write (and did it for two sockets/HTTP connections) in parallel, they might be sent in wrong order, which results in violating the BOSH session and server-side disconnect. """ if self.prio_bosh_stanzas: stanza, add_payload = self.prio_bosh_stanzas.pop(0) if add_payload: stanza.setPayload(self.stanza_buffer) self.stanza_buffer = [] else: stanza = self.boshify_stanzas(self.stanza_buffer) self.stanza_buffer = [] stanza = self.ack_checker.backup_stanza(stanza, socket) key, newkey = self.key_stack.get() if key: stanza.setAttr('key', key) if newkey: stanza.setAttr('newkey', newkey) log.info('sending msg with rid=%s to sock %s' % (stanza.getAttr('rid'), id(socket))) self.renew_bosh_wait_timeout(self.bosh_wait + 3) return stanza def on_bosh_wait_timeout(self): log.error('Connection Manager didn\'t respond within %s + 3 seconds --> forcing disconnect' % self.bosh_wait) self.disconnect() def renew_bosh_wait_timeout(self, timeout): if self.wait_cb_time is not None: self.remove_bosh_wait_timeout() sched_time = self.idlequeue.set_alarm(self.on_bosh_wait_timeout, timeout) self.wait_cb_time = sched_time def remove_bosh_wait_timeout(self): self.idlequeue.remove_alarm( self.on_bosh_wait_timeout, self.wait_cb_time) def on_persistent_fallback(self, socket): """ Called from underlying transport when server closes TCP connection :param socket: disconnected transport object """ if socket.http_persistent: log.warning('Fallback to nonpersistent HTTP (no pipelining as well)') socket.http_persistent = False self.http_persistent = False self.http_pipelining = False socket.disconnect(do_callback=False) self.connect_and_flush(socket) else: socket.disconnect() def handle_body_attrs(self, stanza_attrs): """ Called for each incoming body stanza from dispatcher. Checks body attributes. """ self.remove_bosh_wait_timeout() if self.after_init: if 'sid' in stanza_attrs: # session ID should be only in init response self.bosh_sid = stanza_attrs['sid'] if 'requests' in stanza_attrs: self.bosh_requests = int(stanza_attrs['requests']) if 'wait' in stanza_attrs: self.bosh_wait = int(stanza_attrs['wait']) self.after_init = False ack = None if 'ack' in stanza_attrs: ack = stanza_attrs['ack'] self.ack_checker.process_incoming_ack(ack=ack, socket=self.current_recv_socket) if 'type' in stanza_attrs: if stanza_attrs['type'] in ['terminate', 'terminal']: condition = 'n/a' if 'condition' in stanza_attrs: condition = stanza_attrs['condition'] if condition == 'n/a': log.info('Received sesion-ending terminating stanza') else: log.error('Received terminating stanza: %s - %s' % (condition, bosh_errors[condition])) self.disconnect() return if stanza_attrs['type'] == 'error': # recoverable error pass return def append_stanza(self, stanza): """ Append stanza to a buffer to send """ if stanza: if isinstance(stanza, tuple): # stanza is tuple of BOSH stanza and bool value for whether to add payload self.prio_bosh_stanzas.append(stanza) else: # stanza is XMPP stanza. Will be boshified before send. self.stanza_buffer.append(stanza) def send(self, stanza, now=False): self.send_BOSH(stanza) def get_current_state(self): t = '------ SOCKET_ID\tSOCKET_STATE\tPENDING_REQS\n' for s in self.http_socks: t = '%s------ %s\t%s\t%s\n' % (t, id(s), s.get_state(), s.pending_requests) t = '%s------ prio stanzas: %s, queued XMPP stanzas: %s, not_acked stanzas: %s' \ % (t, self.prio_bosh_stanzas, self.stanza_buffer, self.ack_checker.get_not_acked_rids()) return t def connect_and_flush(self, socket): socket.connect( conn_5tuple = self.conn_5tuple, on_connect = self.on_http_request_possible, on_connect_failure = self.disconnect) def boshify_stanzas(self, stanzas=[], body_attrs=None): """ Wraps zero to many stanzas by body tag with xmlns and sid """ log.debug('boshify_staza - type is: %s, stanza is %s' % (type(stanzas), stanzas)) tag = BOSHBody(attrs={'sid': self.bosh_sid}) tag.setPayload(stanzas) return tag def send_init(self, after_SASL=False): if after_SASL: t = BOSHBody( attrs={ 'to': self.bosh_to, 'sid': self.bosh_sid, 'xml:lang': self._owner.lang, 'xmpp:restart': 'true', 'secure': self.bosh_secure, 'xmlns:xmpp': 'urn:xmpp:xbosh'}) else: t = BOSHBody( attrs={ 'content': self.bosh_content, 'hold': str(self.bosh_hold), 'route': 'xmpp:%s:%s' % (self.route_host, self.route_port), 'to': self.bosh_to, 'wait': str(self.bosh_wait), 'xml:lang': self._owner.lang, 'xmpp:version': '1.0', 'ver': '1.6', 'xmlns:xmpp': 'urn:xmpp:xbosh'}) self.send_BOSH((t, True)) def start_disconnect(self): NonBlockingTransport.start_disconnect(self) self.renew_bosh_wait_timeout(DISCONNECT_TIMEOUT_SECONDS) self.send_BOSH( (BOSHBody(attrs={'sid': self.bosh_sid, 'type': 'terminate'}), True)) def get_new_http_socket(self): http_dict = {'http_uri': self.bosh_uri, 'http_version': self.http_version, 'http_persistent': self.http_persistent, 'add_proxy_headers': self.over_proxy and not self.estabilish_tls} if self.use_proxy_auth: http_dict['proxy_user'], http_dict['proxy_pass'] = self.proxy_creds s = NonBlockingHTTPBOSH( raise_event=self.raise_event, on_disconnect=self.disconnect, idlequeue = self.idlequeue, estabilish_tls = self.estabilish_tls, tls_version = self.tls_version, cipher_list = self.cipher_list, certs = self.certs, on_http_request_possible = self.on_http_request_possible, http_dict = http_dict, proxy_dict = self.proxy_dict, on_persistent_fallback = self.on_persistent_fallback) s.onreceive(self.on_received_http) s.set_stanza_build_cb(self.build_stanza) return s def onreceive(self, recv_handler): if recv_handler is None: recv_handler = self._owner.Dispatcher.ProcessNonBlocking self.current_recv_handler = recv_handler def on_received_http(self, data, socket): self.current_recv_socket = socket self.current_recv_handler(data) def disconnect(self, do_callback=True): self.remove_bosh_wait_timeout() if self.get_state() == DISCONNECTED: return self.fd = -1 for s in self.http_socks: s.disconnect(do_callback=False) NonBlockingTransport.disconnect(self, do_callback) def get_rand_number(): # (see http://www.xmpp.org/extensions/xep-0124.html#rids) # it's also used for sequence key initialization return int(binascii.hexlify(os.urandom(6)), 16) class AckChecker(object): """ Class for generating rids and generating and checking acknowledgements in BOSH messages """ def __init__(self): self.rid = get_rand_number() self.ack = 1 self.last_rids = {} self.not_acked = [] def get_not_acked_rids(self): return [rid for rid, st in self.not_acked] def backup_stanza(self, stanza, socket): socket.pending_requests += 1 rid = self.get_rid() self.not_acked.append((rid, stanza)) stanza.setAttr('rid', str(rid)) self.last_rids[socket]=rid if self.rid != self.ack + 1: stanza.setAttr('ack', str(self.ack)) return stanza def process_incoming_ack(self, socket, ack=None): socket.pending_requests -= 1 if ack: ack = int(ack) else: ack = self.last_rids[socket] i = len([rid for rid, st in self.not_acked if ack >= rid]) self.not_acked = self.not_acked[i:] self.ack = ack def get_rid(self): self.rid = self.rid + 1 return self.rid class KeyStack(object): """ Class implementing key sequences for BOSH messages """ def __init__(self, count): self.count = count self.keys = [] self.reset() self.first_call = True def reset(self): seed = str(get_rand_number()).encode('utf-8') self.keys = [sha1(seed).hexdigest()] for i in range(self.count-1): curr_seed = self.keys[i].encode('utf-8') self.keys.append(sha1(curr_seed).hexdigest()) def get(self): if self.first_call: self.first_call = False return (None, self.keys.pop()) if len(self.keys)>1: return (self.keys.pop(), None) else: last_key = self.keys.pop() self.reset() new_key = self.keys.pop() return (last_key, new_key) # http://www.xmpp.org/extensions/xep-0124.html#errorstatus-terminal bosh_errors = { 'n/a': 'none or unknown condition in terminating body stanza', 'bad-request': 'The format of an HTTP header or binding element received from the client is unacceptable (e.g., syntax error), or Script Syntax is not supported.', 'host-gone': 'The target domain specified in the "to" attribute or the target host or port specified in the "route" attribute is no longer serviced by the connection manager.', 'host-unknown': 'The target domain specified in the "to" attribute or the target host or port specified in the "route" attribute is unknown to the connection manager.', 'improper-addressing': 'The initialization element lacks a "to" or "route" attribute (or the attribute has no value) but the connection manager requires one.', 'internal-server-error': 'The connection manager has experienced an internal error that prevents it from servicing the request.', 'item-not-found': '(1) "sid" is not valid, (2) "stream" is not valid, (3) "rid" is larger than the upper limit of the expected window, (4) connection manager is unable to resend response, (5) "key" sequence is invalid', 'other-request': 'Another request being processed at the same time as this request caused the session to terminate.', 'policy-violation': 'The client has broken the session rules (polling too frequently, requesting too frequently, too many simultaneous requests).', 'remote-connection-failed': 'The connection manager was unable to connect to, or unable to connect securely to, or has lost its connection to, the server.', 'remote-stream-error': 'Encapsulates an error in the protocol being transported.', 'see-other-uri': 'The connection manager does not operate at this URI (e.g., the connection manager accepts only SSL or TLS connections at some https: URI rather than the http: URI requested by the client). The client may try POSTing to the URI in the content of the child element.', 'system-shutdown': 'The connection manager is being shut down. All active HTTP sessions are being terminated. No new sessions can be created.', 'undefined-condition': 'The error is not one of those defined herein; the connection manager SHOULD include application-specific information in the content of the wrapper.' } python-nbxmpp-nbxmpp-0.6.10/nbxmpp/c14n.py000066400000000000000000000037261343257752000203660ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## c14n.py ## ## Copyright (C) 2007-2008 Brendan Taylor ## ## This file is part of Gajim. ## ## Gajim is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published ## by the Free Software Foundation; version 3 only. ## ## Gajim is distributed in the hope that 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 Gajim. If not, see . ## """ XML canonicalisation methods (for XEP-0116) """ from .simplexml import ustr def c14n(node, is_buggy): s = "<" + node.name if node.namespace: if not node.parent or node.parent.namespace != node.namespace: s += ' xmlns="%s"' % node.namespace sorted_attrs = sorted(node.attrs.keys()) for key in sorted_attrs: if not is_buggy and key == 'xmlns': continue val = ustr(node.attrs[key]) # like XMLescape() but with whitespace and without > s += ' %s="%s"' % (key, normalise_attr(val)) s += ">" cnt = 0 if node.kids: for a in node.kids: if (len(node.data)-1) >= cnt: s = s + normalise_text(node.data[cnt]) s = s + c14n(a, is_buggy) cnt += 1 if (len(node.data)-1) >= cnt: s = s + normalise_text(node.data[cnt]) if not node.kids and s.endswith('>'): s=s[:-1]+' />' else: s = s + "" return s def normalise_attr(val): return val.replace('&', '&').replace('<', '<').replace('"', '"').replace('\t', ' ').replace('\n', ' ').replace('\r', ' ') def normalise_text(val): return val.replace('&', '&').replace('<', '<').replace('>', '>').replace('\r', ' ') python-nbxmpp-nbxmpp-0.6.10/nbxmpp/client_nb.py000066400000000000000000000652151343257752000215570ustar00rootroot00000000000000## client_nb.py ## based on client.py, changes backported up to revision 1.60 ## ## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov ## modified by Dimitur Kirov ## ## 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. # $Id: client.py,v 1.52 2006/01/02 19:40:55 normanr Exp $ """ Client class establishes connection to XMPP Server and handles authentication """ import socket from . import transports_nb, dispatcher_nb, auth_nb, roster_nb, protocol, bosh from .protocol import NS_TLS from .auth_nb import SASL_AUTHENTICATION_MECHANISMS import logging log = logging.getLogger('nbxmpp.client_nb') class NonBlockingClient(object): """ Client class is XMPP connection mountpoint. Objects for authentication, network communication, roster, xml parsing ... are plugged to client object. Client implements the abstract behavior - mostly negotiation and callbacks handling, whereas underlying modules take care of feature-specific logic """ def __init__(self, domain, idlequeue, caller=None, lang='en'): """ Caches connection data :param domain: domain - for to: attribute (from account info) :param idlequeue: processing idlequeue :param caller: calling object - it has to implement methods _event_dispatcher which is called from dispatcher instance """ self.Namespace = protocol.NS_CLIENT self.defaultNamespace = self.Namespace self.lang = lang self.idlequeue = idlequeue self.disconnect_handlers = [] self.Server = domain self.xmpp_hostname = None # FQDN hostname to connect to # caller is who initiated this client, it is in needed to register # the EventDispatcher self._caller = caller self._owner = self self._registered_name = None # our full jid, set after successful auth self.connected = '' self.ip_addresses = [] self.socket = None self.on_connect = None self.on_proxy_failure = None self.on_connect_failure = None self.proxy = None self.got_features = False self.got_see_other_host = None self.stream_started = False self.disconnecting = False self.protocol_type = 'XMPP' self.alpn = False def disconnect(self, message=''): """ Called on disconnection - disconnect callback is picked based on state of the client. """ # to avoid recursive calls if self.ip_addresses: self._try_next_ip() return if self.disconnecting: return log.info('Disconnecting NBClient: %s' % message) sasl_failed = False if 'NonBlockingRoster' in self.__dict__: self.NonBlockingRoster.PlugOut() if 'NonBlockingBind' in self.__dict__: self.NonBlockingBind.PlugOut() if 'NonBlockingNonSASL' in self.__dict__: self.NonBlockingNonSASL.PlugOut() if 'SASL' in self.__dict__: if 'startsasl' in self.SASL.__dict__ and \ self.SASL.startsasl == 'failure-in-process': sasl_failed = True self.SASL.startsasl = 'failure' self._on_start_sasl() else: self.SASL.PlugOut() if 'NonBlockingTCP' in self.__dict__: self.NonBlockingTCP.PlugOut() if 'NonBlockingHTTP' in self.__dict__: self.NonBlockingHTTP.PlugOut() if 'NonBlockingBOSH' in self.__dict__: self.NonBlockingBOSH.PlugOut() # FIXME: we never unplug dispatcher, only on next connect # See _xmpp_connect_machine and SASLHandler connected = self.connected stream_started = self.stream_started self.connected = '' self.stream_started = False self.disconnecting = True log.debug('Client disconnected..') # Don't call any callback when it's a SASL failure. # SASL handler is already called if connected == '' and not sasl_failed: # if we're disconnecting before connection to XMPP sever is opened, # we don't call disconnect handlers but on_connect_failure callback if self.proxy: # with proxy, we have different failure callback log.debug('calling on_proxy_failure cb') self.on_proxy_failure(reason=message) else: log.debug('calling on_connect_failure cb') self.on_connect_failure() elif not sasl_failed: # we are connected to XMPP server if not stream_started: # if error occur before XML stream was opened, e.g. no response on # init request, we call the on_connect_failure callback because # proper connection is not established yet and it's not a proxy # issue log.debug('calling on_connect_failure cb') self._caller.streamError = message self.on_connect_failure() else: # with open connection, we are calling the disconnect handlers for i in reversed(self.disconnect_handlers): log.debug('Calling disconnect handler %s' % i) i() self.disconnecting = False def connect(self, on_connect, on_connect_failure, hostname=None, port=5222, on_proxy_failure=None, on_stream_error_cb=None, proxy=None, secure_tuple=('tls', None, None, None, None, False)): """ Open XMPP connection (open XML streams in both directions) :param on_connect: called after stream is successfully opened :param on_connect_failure: called when error occurs during connection :param hostname: hostname of XMPP server from SRV request :param port: port number of XMPP server :param on_proxy_failure: called if error occurs during TCP connection to proxy server or during proxy connecting process :param on_stream_error_cb: called if error occurs :param proxy: dictionary with proxy data. It should contain at least values for keys 'host' and 'port' - connection details for proxy serve and optionally keys 'user' and 'pass' as proxy credentials :param secure_tuple: tuple of (desired connection type, cacerts, mycerts, tls_version, cipher_list, alpn) connection type can be 'ssl' - TLS established after TCP connection, 'tls' - TLS established after negotiation with starttls, or 'plain'. cacerts, mycerts, tls_version, cipher_list, alpn see tls_nb.NonBlockingTLS constructor for more details """ self.on_connect = on_connect self.on_connect_failure=on_connect_failure self.on_proxy_failure = on_proxy_failure self.on_stream_error_cb = on_stream_error_cb self.desired_security, self.cacerts, self.mycerts, self.tls_version, \ self.cipher_list = secure_tuple[:5] if len(secure_tuple) == 6: # ALPN support was added in version 0.6.3 self.alpn = secure_tuple[5] self.Connection = None self.Port = port self.proxy = proxy if hostname: self.xmpp_hostname = hostname else: self.xmpp_hostname = self.Server # We only check for SSL here as for TLS we will first have to start a # PLAIN connection and negotiate TLS afterwards. # establish_tls will instruct transport to start secure connection # directly establish_tls = self.desired_security == 'ssl' certs = (self.cacerts, self.mycerts) proxy_dict = {} tcp_host = self.xmpp_hostname tcp_port = self.Port if proxy: # with proxies, client connects to proxy instead of directly to # XMPP server ((hostname, port)) # tcp_host is hostname of machine used for socket connection # (DNS request will be done for proxy or BOSH CM hostname) tcp_host, tcp_port, proxy_user, proxy_pass = \ transports_nb.get_proxy_data_from_dict(proxy) if proxy['type'] == 'bosh': # Setup BOSH transport self.socket = bosh.NonBlockingBOSH.get_instance( on_disconnect=self.disconnect, raise_event=self.raise_event, idlequeue=self.idlequeue, estabilish_tls=establish_tls, certs=certs, tls_version = self.tls_version, cipher_list = self.cipher_list, proxy_creds=(proxy_user, proxy_pass), xmpp_server=(self.xmpp_hostname, self.Port), domain=self.Server, bosh_dict=proxy) self.protocol_type = 'BOSH' self.wait_for_restart_response = \ proxy['bosh_wait_for_restart_response'] else: # http proxy proxy_dict['type'] = proxy['type'] proxy_dict['xmpp_server'] = (self.xmpp_hostname, self.Port) proxy_dict['credentials'] = (proxy_user, proxy_pass) if not proxy or proxy['type'] != 'bosh': # Setup ordinary TCP transport self.socket = transports_nb.NonBlockingTCP.get_instance( on_disconnect=self.disconnect, raise_event=self.raise_event, idlequeue=self.idlequeue, estabilish_tls=establish_tls, certs=certs, tls_version = self.tls_version, cipher_list = self.cipher_list, alpn=self.alpn, proxy_dict=proxy_dict) # plug transport into client as self.Connection self.socket.PlugIn(self) self._resolve_hostname( hostname=tcp_host, port=tcp_port, on_success=self._try_next_ip) def _resolve_hostname(self, hostname, port, on_success): """ Wrapper for getaddinfo call FIXME: getaddinfo blocks """ try: self.ip_addresses = socket.getaddrinfo(hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM) except socket.gaierror as exc: self.disconnect(message='Lookup failure for %s:%s, hostname: %s - %s' % (self.Server, self.Port, hostname, str(exc))) except socket.error as exc: errnum, errstr = exc.errno, exc.strerror self.disconnect(message='General socket error for %s:%s, hostname: ' '%s - %s' % (self.Server, self.Port, hostname, errstr)) else: on_success() def _try_next_ip(self, err_message=None): """ Iterate over IP addresses tries to connect to it """ if err_message: log.debug('While looping over DNS A records: %s' % err_message) if not self.ip_addresses: msg = 'Run out of hosts for name %s:%s.' % (self.Server, self.Port) msg += ' Error for last IP: %s' % err_message self.disconnect(msg) else: self.current_ip = self.ip_addresses.pop(0) self.socket.connect( conn_5tuple=self.current_ip, on_connect=lambda: self._xmpp_connect(), on_connect_failure=self._try_next_ip) def incoming_stream_version(self): """ Get version of xml stream """ if 'version' in self.Dispatcher.Stream._document_attrs: return self.Dispatcher.Stream._document_attrs['version'] else: return None def _xmpp_connect(self, socket_type=None): """ Start XMPP connecting process - open the XML stream. Is called after TCP connection is established or after switch to TLS when successfully negotiated with . """ # socket_type contains info which transport connection was established if not socket_type: if self.Connection.ssl_lib: # When ssl_lib is set we connected via SSL socket_type = 'ssl' else: # PLAIN is default socket_type = 'plain' self.connected = socket_type self._xmpp_connect_machine() def _xmpp_connect_machine(self, mode=None, data=None): """ Finite automaton taking care of stream opening and features tag handling. Calls _on_stream_start when stream is started, and disconnect() on failure. """ log.info('-------------xmpp_connect_machine() >> mode: %s, data: %s...' % (mode, str(data)[:20])) def on_next_receive(mode): """ Set desired on_receive callback on transport based on the state of connect_machine. """ log.info('setting %s on next receive' % mode) if mode is None: self.onreceive(None) # switch to Dispatcher.ProcessNonBlocking else: self.onreceive(lambda _data:self._xmpp_connect_machine(mode, _data)) if not mode: # starting state if 'Dispatcher' in self.__dict__: self.Dispatcher.PlugOut() self.got_features = False dispatcher_nb.Dispatcher.get_instance().PlugIn(self) on_next_receive('RECEIVE_DOCUMENT_ATTRIBUTES') elif mode == 'FAILURE': self.disconnect('During XMPP connect: %s' % data) elif mode == 'RECEIVE_DOCUMENT_ATTRIBUTES': if data: self.Dispatcher.ProcessNonBlocking(data) self.ip_addresses = [] if not hasattr(self, 'Dispatcher') or \ self.Dispatcher.Stream._document_attrs is None: self._xmpp_connect_machine(mode='FAILURE', data='Error on stream open') return # if terminating stanza was received after init request then client gets # disconnected from bosh transport plugin and we have to end the stream # negotiating process straight away. # fixes #4657 if not self.connected: return if self.incoming_stream_version() == '1.0': if not self.got_features: on_next_receive('RECEIVE_STREAM_FEATURES') else: log.info('got STREAM FEATURES in first recv') self._xmpp_connect_machine(mode='STREAM_STARTED') else: log.info('incoming stream version less than 1.0') self._xmpp_connect_machine(mode='STREAM_STARTED') elif mode == 'RECEIVE_STREAM_FEATURES': if data: # sometimes are received together with document # attributes and sometimes on next receive... self.Dispatcher.ProcessNonBlocking(data) if self.got_see_other_host: log.info('got see-other-host') self.onreceive(None) self.on_stream_error_cb(self, self.got_see_other_host) elif not self.got_features: self._xmpp_connect_machine(mode='FAILURE', data='Missing in 1.0 stream') else: log.info('got STREAM FEATURES in second recv') self._xmpp_connect_machine(mode='STREAM_STARTED') elif mode == 'STREAM_STARTED': self._on_stream_start() def _on_stream_start(self): """ Called after XMPP stream is opened. TLS negotiation may follow if supported and desired. """ self.stream_started = True if not hasattr(self, 'onreceive'): # we may already have been disconnected return self.onreceive(None) if self.connected == 'plain': if self.desired_security == 'plain': # if we want and have plain connection, we're done now self._on_connect() else: # try to negotiate TLS if self.incoming_stream_version() != '1.0': # if stream version is less than 1.0, we can't do more log.info('While connecting with type = "tls": stream version ' + 'is less than 1.0') self._on_connect() return if self.Dispatcher.Stream.features.getTag('starttls'): # Server advertises TLS support, start negotiation self.stream_started = False log.info('TLS supported by remote server. Requesting TLS start.') self._tls_negotiation_handler() else: log.info('While connecting with type = "tls": TLS unsupported ' + 'by remote server') self._on_connect() elif self.connected in ['ssl', 'tls']: self._on_connect() else: assert False, 'Stream opened for unsupported connection' def _tls_negotiation_handler(self, con=None, tag=None): """ Take care of TLS negotiation with """ log.info('-------------tls_negotiaton_handler() >> tag: %s' % tag) if not con and not tag: # starting state when we send the self.RegisterHandlerOnce('proceed', self._tls_negotiation_handler, xmlns=NS_TLS) self.RegisterHandlerOnce('failure', self._tls_negotiation_handler, xmlns=NS_TLS) self.send('' % NS_TLS) else: # we got or if tag.getNamespace() != NS_TLS: self.disconnect('Unknown namespace: %s' % tag.getNamespace()) return tagname = tag.getName() if tagname == 'failure': self.disconnect('TLS received: %s' % tag) return log.info('Got starttls proceed response. Switching to TLS/SSL...') # following call wouldn't work for BOSH transport but it doesn't matter # because negotiation with BOSH is forbidden self.Connection.tls_init( on_succ = lambda: self._xmpp_connect(socket_type='tls'), on_fail = lambda: self.disconnect('error while establishing TLS')) def _on_connect(self): """ Preceed call of on_connect callback """ self.onreceive(None) self.on_connect(self, self.connected) def raise_event(self, event_type, data): """ Raise event to connection instance. DATA_SENT and DATA_RECIVED events are used in XML console to show XMPP traffic """ e_t = event_type if type(event_type) != str: e_t = event_type.encode('utf-8') log.info('raising event from transport: :::::%s::::\n_____________\n%s\n_____________\n' % (e_t, data)) if hasattr(self, 'Dispatcher'): self.Dispatcher.Event('', event_type, data) ############################################################################### ### follows code for authentication, resource bind, session and roster download ############################################################################### def auth(self, user, password, resource='', sasl=True, on_auth=None, auth_mechs=None): """ Authenticate connnection and bind resource. If resource is not provided random one or library name used :param user: XMPP username :param password: XMPP password :param resource: resource that shall be used for auth/connecting :param sasl: Boolean indicating if SASL shall be used. (default: True) :param on_auth: Callback, called after auth. On auth failure, argument is None. :param auth_mechs: Set of valid authentification mechanisms. If None all authentification mechanisms will be allowed. Possible entries are: 'ANONYMOUS', 'EXTERNAL', 'GSSAPI', 'SCRAM-SHA-1-PLUS', 'SCRAM-SHA-1', 'DIGEST-MD5', 'PLAIN', 'X-MESSENGER-OAUTH2', 'XEP-0078' """ self._User, self._Password = user, password self._Resource, self._sasl = resource, sasl self._channel_binding = None if self.connected in ('ssl', 'tls'): try: if self.protocol_type != 'BOSH': self._channel_binding = self.Connection.NonBlockingTLS.get_channel_binding() # TLS handshake is finished so channel binding data muss exist assert (self._channel_binding is not None) except NotImplementedError: pass if auth_mechs is None: self._auth_mechs = SASL_AUTHENTICATION_MECHANISMS | set(['XEP-0078']) else: self._auth_mechs = auth_mechs self.on_auth = on_auth self._on_doc_attrs() return def _on_old_auth(self, res): """ Callback used by NON-SASL auth. On auth failure, res is None """ if res: self.connected += '+old_auth' self.on_auth(self, 'old_auth') else: self.on_auth(self, None) def _on_sasl_auth(self, res): """ Used internally. On auth failure, res is None """ self.onreceive(None) if res: self.connected += '+sasl' self.on_auth(self, 'sasl') else: self.on_auth(self, None) def _on_doc_attrs(self): """ Plug authentication objects and start auth """ if self._sasl: auth_nb.SASL.get_instance(self._User, self._Password, self._on_start_sasl, self._channel_binding, self._auth_mechs).PlugIn(self) if not hasattr(self, 'SASL'): return if ('XEP-0078' in self._auth_mechs and (not self._sasl or self.SASL.startsasl == 'not-supported')): if not self._Resource: self._Resource = 'xmpppy' auth_nb.NonBlockingNonSASL.get_instance(self._User, self._Password, self._Resource, self._on_old_auth).PlugIn(self) return self.SASL.auth() return True def _on_start_sasl(self, data=None): """ Callback used by SASL, called on each auth step """ if data: self.Dispatcher.ProcessNonBlocking(data) if 'SASL' not in self.__dict__: # SASL is pluged out, possible disconnect return if self.SASL.startsasl == 'in-process': return self.onreceive(None) if self.SASL.startsasl == 'failure': # wrong user/pass, stop auth if 'SASL' in self.__dict__: self.SASL.PlugOut() self.connected = None # FIXME: is this intended? We use ''elsewhere self._on_sasl_auth(None) elif self.SASL.startsasl == 'success': nb_bind = auth_nb.NonBlockingBind.get_instance() sm = self._caller.sm if sm._owner and sm.resumption: nb_bind.resuming = True sm.set_owner(self) self.Dispatcher.sm = sm nb_bind.PlugIn(self) self.on_auth(self, 'sasl') return nb_bind.PlugIn(self) self.onreceive(self._on_auth_bind) return True def _on_auth_bind(self, data): # FIXME: Why use this callback and not bind directly? if data: self.Dispatcher.ProcessNonBlocking(data) if self.NonBlockingBind.bound is None: return self.NonBlockingBind.NonBlockingBind(self._Resource, self._on_sasl_auth) return True def initRoster(self, version='', request=True): """ Plug in the roster """ if 'NonBlockingRoster' not in self.__dict__: return roster_nb.NonBlockingRoster.get_instance( version=version).PlugIn(self, request=request) def getRoster(self, on_ready=None, force=False): """ Return the Roster instance, previously plugging it in and requesting roster from server if needed """ if 'NonBlockingRoster' in self.__dict__: return self.NonBlockingRoster.getRoster(on_ready, force) return None def sendPresence(self, jid=None, typ=None, requestRoster=0): """ Send some specific presence state. Can also request roster from server if according agrument is set """ if requestRoster: # FIXME: used somewhere? roster_nb.NonBlockingRoster.get_instance().PlugIn(self) self.send(dispatcher_nb.Presence(to=jid, typ=typ)) ############################################################################### ### following methods are moved from blocking client class of xmpppy ############################################################################### def RegisterDisconnectHandler(self, handler): """ Register handler that will be called on disconnect """ self.disconnect_handlers.append(handler) def UnregisterDisconnectHandler(self, handler): """ Unregister handler that is called on disconnect """ self.disconnect_handlers.remove(handler) def DisconnectHandler(self): """ Default disconnect handler. Just raises an IOError. If you choosed to use this class in your production client, override this method or at least unregister it. """ raise IOError('Disconnected from server.') def get_connect_type(self): """ Return connection state. F.e.: None / 'tls' / 'plain+non_sasl' """ return self.connected def get_peerhost(self): """ Gets the ip address of the account, from which is made connection to the server (e.g. IP and port of socket) We will create listening socket on the same ip """ # FIXME: tuple (ip, port) is expected (and checked for) but port num is # useless return self.socket.peerhost python-nbxmpp-nbxmpp-0.6.10/nbxmpp/dispatcher_nb.py000066400000000000000000000614271343257752000224300ustar00rootroot00000000000000## dispatcher_nb.py ## based on dispatcher.py ## ## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov ## modified by Dimitur Kirov ## ## 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. """ Main xmpp decision making logic. Provides library with methods to assign different handlers to different XMPP stanzas and namespaces """ from __future__ import unicode_literals from . import simplexml import sys import time import locale import re import uuid import copy from xml.parsers.expat import ExpatError from .plugin import PlugIn from .protocol import (NS_DELAY2, NS_STREAMS, NS_XMPP_STREAMS, NS_HTTP_BIND, Iq, Presence, Message, Protocol, Node, Error, ERR_FEATURE_NOT_IMPLEMENTED, StreamError) import logging if sys.version_info[0] == 2: chr = unichr log = logging.getLogger('nbxmpp.dispatcher_nb') #: default timeout to wait for response for our id DEFAULT_TIMEOUT_SECONDS = 25 XML_DECLARATION = '' # FIXME: ugly class Dispatcher(object): """ Why is this here - I needed to redefine Dispatcher for BOSH and easiest way was to inherit original Dispatcher (now renamed to XMPPDispatcher). Trouble is that reference used to access dispatcher instance is in Client attribute named by __class__.__name__ of the dispatcher instance .. long story short: I wrote following to avoid changing each client.Dispatcher.whatever() in xmpp If having two kinds of dispatcher will go well, I will rewrite the dispatcher references in other scripts """ def PlugIn(self, client_obj, after_SASL=False, old_features=None): if client_obj.protocol_type == 'XMPP': XMPPDispatcher().PlugIn(client_obj) elif client_obj.protocol_type == 'BOSH': BOSHDispatcher().PlugIn(client_obj, after_SASL, old_features) else: assert False # should never be reached @classmethod def get_instance(cls, *args, **kwargs): """ Factory Method for object creation Use this instead of directly initializing the class in order to make unit testing much easier. """ return cls(*args, **kwargs) class XMPPDispatcher(PlugIn): """ Handles XMPP stream and is the first who takes control over a fresh stanza Is plugged into NonBlockingClient but can be replugged to restart handled stream headers (used by SASL f.e.). """ def __init__(self): PlugIn.__init__(self) self.handlers = {} self._expected = {} self._defaultHandler = None self._pendingExceptions = [] self._eventHandler = None self._cycleHandlers = [] self._exported_methods=[self.RegisterHandler, self.RegisterDefaultHandler, self.RegisterEventHandler, self.UnregisterCycleHandler, self.RegisterCycleHandler, self.RegisterHandlerOnce, self.UnregisterHandler, self.RegisterProtocol, self.SendAndWaitForResponse, self.SendAndCallForResponse, self.getAnID, self.Event, self.send] # Let the dispatcher know if there is support for stream management self.sm = None # \ufddo -> \ufdef range c = '\ufdd0' r = c while c < '\ufdef': c = chr(ord(c) + 1) r += '|' + c # \ufffe-\uffff, \u1fffe-\u1ffff, ..., \u10fffe-\u10ffff c = '\ufffe' r += '|' + c r += '|' + chr(ord(c) + 1) while c < '\U0010fffe': c = chr(ord(c) + 0x10000) r += '|' + c r += '|' + chr(ord(c) + 1) self.invalid_chars_re = re.compile(r) def getAnID(self): return str(uuid.uuid4()) def dumpHandlers(self): """ Return set of user-registered callbacks in it's internal format. Used within the library to carry user handlers set over Dispatcher replugins """ return self.handlers def restoreHandlers(self, handlers): """ Restore user-registered callbacks structure from dump previously obtained via dumpHandlers. Used within the library to carry user handlers set over Dispatcher replugins. """ self.handlers = handlers def _init(self): """ Register default namespaces/protocols/handlers. Used internally """ # FIXME: inject dependencies, do not rely that they are defined by our # owner self.RegisterNamespace('unknown') self.RegisterNamespace(NS_STREAMS) self.RegisterNamespace(self._owner.defaultNamespace) self.RegisterProtocol('iq', Iq) self.RegisterProtocol('presence', Presence) self.RegisterProtocol('message', Message) self.RegisterDefaultHandler(self.returnStanzaHandler) self.RegisterEventHandler(self._owner._caller._event_dispatcher) self.on_responses = {} def plugin(self, owner): """ Plug the Dispatcher instance into Client class instance and send initial stream header. Used internally """ self._init() self._owner.lastErrNode = None self._owner.lastErr = None self._owner.lastErrCode = None if hasattr(self._owner, 'StreamInit'): self._owner.StreamInit() else: self.StreamInit() def plugout(self): """ Prepare instance to be destructed """ self.Stream.dispatch = None self.Stream.features = None self.Stream.destroy() self._owner = None self.Stream = None def StreamInit(self): """ Send an initial stream header """ self._owner.Connection.sendqueue = [] self.Stream = simplexml.NodeBuilder() self.Stream.dispatch = self.dispatch self.Stream._dispatch_depth = 2 self.Stream.stream_header_received = self._check_stream_start self.Stream.features = None self._metastream = Node('stream:stream') self._metastream.setNamespace(self._owner.Namespace) self._metastream.setAttr('version', '1.0') self._metastream.setAttr('xmlns:stream', NS_STREAMS) self._metastream.setAttr('to', self._owner.Server) self._metastream.setAttr('xml:lang', self._owner.lang) self._owner.send("%s%s>" % (XML_DECLARATION, str(self._metastream)[:-2])) def _check_stream_start(self, ns, tag, attrs): if ns != NS_STREAMS or tag!='stream': raise ValueError('Incorrect stream start: (%s,%s). Terminating.' % (tag, ns)) def replace_non_character(self, data): return re.sub(self.invalid_chars_re, '\ufffd', data) def ProcessNonBlocking(self, data): """ Check incoming stream for data waiting :param data: data received from transports/IO sockets :return: 1) length of processed data if some data were processed; 2) '0' string if no data were processed but link is alive; 3) 0 (zero) if underlying connection is closed. """ # FIXME: # When an error occurs we disconnect the transport directly. Client's # disconnect method will never be called. # Is this intended? # also look at transports start_disconnect() data = self.replace_non_character(data) for handler in self._cycleHandlers: handler(self) if len(self._pendingExceptions) > 0: _pendingException = self._pendingExceptions.pop() sys.excepthook(*_pendingException) return try: self.Stream.Parse(data) # end stream:stream tag received if self.Stream and self.Stream.has_received_endtag(): self._owner.disconnect(self.Stream.streamError) return 0 except ExpatError: log.error('Invalid XML received from server. Forcing disconnect.') self._owner.Connection.disconnect() return 0 except ValueError as e: log.debug('ValueError: %s' % str(e)) self._owner.Connection.pollend() return 0 if len(self._pendingExceptions) > 0: _pendingException = self._pendingExceptions.pop() sys.excepthook(*_pendingException) return if len(data) == 0: return '0' return len(data) def RegisterNamespace(self, xmlns, order='info'): """ Create internal structures for newly registered namespace You can register handlers for this namespace afterwards. By default one namespace is already registered (jabber:client or jabber:component:accept depending on context. """ log.debug('Registering namespace "%s"' % xmlns) self.handlers[xmlns] = {} self.RegisterProtocol('unknown', Protocol, xmlns=xmlns) self.RegisterProtocol('default', Protocol, xmlns=xmlns) def RegisterProtocol(self, tag_name, Proto, xmlns=None, order='info'): """ Used to declare some top-level stanza name to dispatcher Needed to start registering handlers for such stanzas. Iq, message and presence protocols are registered by default. """ if not xmlns: xmlns=self._owner.defaultNamespace log.debug('Registering protocol "%s" as %s(%s)' %(tag_name, Proto, xmlns)) self.handlers[xmlns][tag_name] = {type:Proto, 'default':[]} def RegisterNamespaceHandler(self, xmlns, handler, typ='', ns='', makefirst=0, system=0): """ Register handler for processing all stanzas for specified namespace """ self.RegisterHandler('default', handler, typ, ns, xmlns, makefirst, system) def RegisterHandler(self, name, handler, typ='', ns='', xmlns=None, makefirst=False, system=False): """ Register user callback as stanzas handler of declared type Callback arguments: dispatcher instance (for replying), incoming return of previous handlers. The callback must raise xmpp.NodeProcessed just before return if it wants to prevent other callbacks to be called with the same stanza as argument _and_, more importantly library from returning stanza to sender with error set. :param name: name of stanza. F.e. "iq". :param handler: user callback. :param typ: value of stanza's "type" attribute. If not specified any value will match :param ns: namespace of child that stanza must contain. :param xmlns: xml namespace :param makefirst: insert handler in the beginning of handlers list instead of adding it to the end. Note that more common handlers i.e. w/o "typ" and " will be called first nevertheless. :param system: call handler even if NodeProcessed Exception were raised already. """ if not xmlns: xmlns=self._owner.defaultNamespace log.debug('Registering handler %s for "%s" type->%s ns->%s(%s)' % (handler, name, typ, ns, xmlns)) if not typ and not ns: typ='default' if xmlns not in self.handlers: self.RegisterNamespace(xmlns, 'warn') if name not in self.handlers[xmlns]: self.RegisterProtocol(name, Protocol, xmlns, 'warn') if typ+ns not in self.handlers[xmlns][name]: self.handlers[xmlns][name][typ+ns]=[] if makefirst: self.handlers[xmlns][name][typ+ns].insert(0, {'func':handler, 'system':system}) else: self.handlers[xmlns][name][typ+ns].append({'func':handler, 'system':system}) def RegisterHandlerOnce(self, name, handler, typ='', ns='', xmlns=None, makefirst=0, system=0): """ Unregister handler after first call (not implemented yet) """ # FIXME Drop or implement if not xmlns: xmlns = self._owner.defaultNamespace self.RegisterHandler(name, handler, typ, ns, xmlns, makefirst, system) def UnregisterHandler(self, name, handler, typ='', ns='', xmlns=None): """ Unregister handler. "typ" and "ns" must be specified exactly the same as with registering. """ if not xmlns: xmlns = self._owner.defaultNamespace if not typ and not ns: typ='default' if xmlns not in self.handlers: return if name not in self.handlers[xmlns]: return if typ+ns not in self.handlers[xmlns][name]: return for pack in self.handlers[xmlns][name][typ+ns]: if pack['func'] == handler: try: self.handlers[xmlns][name][typ+ns].remove(pack) except ValueError: pass def RegisterDefaultHandler(self, handler): """ Specify the handler that will be used if no NodeProcessed exception were raised. This is returnStanzaHandler by default. """ self._defaultHandler = handler def RegisterEventHandler(self, handler): """ Register handler that will process events. F.e. "FILERECEIVED" event. See common/connection: _event_dispatcher() """ self._eventHandler = handler def returnStanzaHandler(self, conn, stanza): """ Return stanza back to the sender with error set """ if stanza.getType() in ('get', 'set'): conn._owner.send(Error(stanza, ERR_FEATURE_NOT_IMPLEMENTED)) def RegisterCycleHandler(self, handler): """ Register handler that will be called on every Dispatcher.Process() call """ if handler not in self._cycleHandlers: self._cycleHandlers.append(handler) def UnregisterCycleHandler(self, handler): """ Unregister handler that will be called on every Dispatcher.Process() call """ if handler in self._cycleHandlers: self._cycleHandlers.remove(handler) def Event(self, realm, event, data): """ Raise some event :param realm: scope of event. Usually a namespace. :param event: the event itself. F.e. "SUCCESSFUL SEND". :param data: data that comes along with event. Depends on event. """ if self._eventHandler: self._eventHandler(realm, event, data) else: log.warning('Received unhandled event: %s' % event) def dispatch(self, stanza, session=None, direct=0): """ Main procedure that performs XMPP stanza recognition and calling apppropriate handlers for it. Called by simplexml """ # FIXME: Where do we set session and direct. Why? What are those intended # to do? #log.info('dispatch called: stanza = %s, session = %s, direct= %s' # % (stanza, session, direct)) self.Event('', 'STANZA RECEIVED', stanza) if not session: session = self session.Stream._mini_dom = None name = stanza.getName() if name == 'features': self._owner.got_features = True session.Stream.features = stanza elif name == 'error': if stanza.getTag('see-other-host'): self._owner.got_see_other_host = stanza xmlns = stanza.getNamespace() # log.info('in dispatch, getting ns for %s, and the ns is %s' # % (stanza, xmlns)) if xmlns not in self.handlers: log.warning('Unknown namespace: %s', xmlns) xmlns = 'unknown' # features stanza has been handled before if name not in self.handlers[xmlns]: if name not in ('features', 'stream'): log.warning('Unknown stanza: %s', stanza) else: log.debug('Got %s/%s stanza' % (xmlns, name)) name = 'unknown' else: log.debug('Got %s/%s stanza' % (xmlns, name)) if stanza.__class__.__name__ == 'Node': # FIXME: this cannot work stanza = self.handlers[xmlns][name][type](node=stanza) typ = stanza.getType() if not typ: typ = '' stanza.props = stanza.getProperties() ID = stanza.getID() log.debug('type: %s, properties: %s', typ, stanza.props) # If server supports stream management if self.sm and self.sm.enabled and (stanza.getName() != 'r' and stanza.getName() != 'a' and stanza.getName() != 'enabled' and stanza.getName() != 'resumed'): # increments the number of stanzas that has been handled self.sm.in_h += 1 list_ = ['default'] # we will use all handlers: if typ in self.handlers[xmlns][name]: list_.append(typ) # from very common... for prop in stanza.props: if prop in self.handlers[xmlns][name]: list_.append(prop) if typ and typ+prop in self.handlers[xmlns][name]: list_.append(typ+prop) # ...to very particular chain = self.handlers[xmlns]['default']['default'] for key in list_: if key: chain = chain + self.handlers[xmlns][name][key] if ID in session._expected: user = 0 if isinstance(session._expected[ID], tuple): cb, args = session._expected[ID] log.debug("Expected stanza arrived. Callback %s(%s) found!" % (cb, args)) try: cb(session,stanza,**args) except Exception as typ: if typ.__class__.__name__ != 'NodeProcessed': raise else: log.debug("Expected stanza arrived!") session._expected[ID] = stanza else: user = 1 for handler in chain: if user or handler['system']: try: log.debug('Call handler: %s', handler['func']) handler['func'](session, stanza) except Exception as typ: if typ.__class__.__name__ != 'NodeProcessed': self._pendingExceptions.insert(0, sys.exc_info()) return user=0 if user and self._defaultHandler: self._defaultHandler(session, stanza) def _WaitForData(self, data): """ Internal wrapper around ProcessNonBlocking. Will check for """ if data is None: return res = self.ProcessNonBlocking(data) # 0 result indicates that we have closed the connection, e.g. # we have released dispatcher, so self._owner has no methods if not res: return for (_id, _iq) in list(self._expected.items()): if _iq is None: # If the expected Stanza would have arrived, ProcessNonBlocking # would have placed the reply stanza in there continue if _id in self.on_responses: if len(self._expected) == 1: self._owner.onreceive(None) resp, args = self.on_responses[_id] del self.on_responses[_id] if args is None: resp(_iq) else: resp(self._owner, _iq, **args) del self._expected[_id] def SendAndWaitForResponse(self, stanza, timeout=None, func=None, args=None): """ Send stanza and wait for recipient's response to it. Will call transports on_timeout callback if response is not retrieved in time Be aware: Only timeout of latest call of SendAndWait is active. """ if timeout is None: timeout = DEFAULT_TIMEOUT_SECONDS _waitid = self.send(stanza) if func: self.on_responses[_waitid] = (func, args) if timeout: self._owner.set_timeout(timeout) self._owner.onreceive(self._WaitForData) self._expected[_waitid] = None return _waitid def SendAndCallForResponse(self, stanza, func=None, args=None): """ Put stanza on the wire and call back when recipient replies. Additional callback arguments can be specified in args """ self.SendAndWaitForResponse(stanza, 0, func, args) def send(self, stanza, now=False): """ Wrap transports send method when plugged into NonBlockingClient. Makes sure stanzas get ID and from tag. """ ID = None if type(stanza) != str: if isinstance(stanza, Protocol): ID = stanza.getID() if ID is None: stanza.setID(self.getAnID()) ID = stanza.getID() if self._owner._registered_name and not stanza.getAttr('from'): stanza.setAttr('from', self._owner._registered_name) self._owner.Connection.send(stanza, now) # If no ID then it is a whitespace if self.sm and self.sm.enabled and ID: # add timestamp to message stanza in queue if (stanza.getName() == 'message' and stanza.getType() in ('chat', 'groupchat')): timestamp = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()) attrs = {'stamp': timestamp} if stanza.getType() != 'groupchat': # Dont leak our JID to Groupchats attrs['from'] = stanza.getAttr('from') stanza.addChild('delay', namespace=NS_DELAY2, attrs=attrs) self.sm.uqueue.append(stanza) self.sm.out_h += 1 if len(self.sm.uqueue) > self.sm.max_queue: self.sm.request_ack() if (self.sm.in_h - self.sm.last_sent_in_h) > 100: self.sm.send_ack() return ID class BOSHDispatcher(XMPPDispatcher): def PlugIn(self, owner, after_SASL=False, old_features=None): self.old_features = old_features self.after_SASL = after_SASL XMPPDispatcher.PlugIn(self, owner) def StreamInit(self): """ Send an initial stream header """ self.Stream = simplexml.NodeBuilder() self.Stream.dispatch = self.dispatch self.Stream._dispatch_depth = 2 self.Stream.stream_header_received = self._check_stream_start self.Stream.features = self.old_features self._metastream = Node('stream:stream') self._metastream.setNamespace(self._owner.Namespace) self._metastream.setAttr('version', '1.0') self._metastream.setAttr('xmlns:stream', NS_STREAMS) self._metastream.setAttr('to', self._owner.Server) self._metastream.setAttr('xml:lang', self._owner.lang) self.restart = True self._owner.Connection.send_init(after_SASL=self.after_SASL) def StreamTerminate(self): """ Send a stream terminator """ self._owner.Connection.send_terminator() def ProcessNonBlocking(self, data=None): if self.restart: fromstream = self._metastream fromstream.setAttr('from', fromstream.getAttr('to')) fromstream.delAttr('to') data = '%s%s>%s' % (XML_DECLARATION, str(fromstream)[:-2], data) self.restart = False return XMPPDispatcher.ProcessNonBlocking(self, data) def dispatch(self, stanza, session=None, direct=0): if stanza.getName() == 'body' and stanza.getNamespace() == NS_HTTP_BIND: stanza_attrs = stanza.getAttrs() if 'authid' in stanza_attrs: # should be only in init response # auth module expects id of stream in document attributes self.Stream._document_attrs['id'] = stanza_attrs['authid'] self._owner.Connection.handle_body_attrs(stanza_attrs) children = stanza.getChildren() if children: for child in children: # if child doesn't have any ns specified, simplexml (or expat) # thinks it's of parent's (BOSH body) namespace, so we have to # rewrite it to jabber:client if child.getNamespace() == NS_HTTP_BIND: child.setNamespace(self._owner.defaultNamespace) XMPPDispatcher.dispatch(self, child, session, direct) else: XMPPDispatcher.dispatch(self, stanza, session, direct) python-nbxmpp-nbxmpp-0.6.10/nbxmpp/features_nb.py000066400000000000000000000173771343257752000221250ustar00rootroot00000000000000## features.py ## ## Copyright (C) 2003-2004 Alexey "Snake" Nezhdanov ## Copyright (C) 2007 Julien Pivotto ## ## 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. # $Id: features.py,v 1.22 2005/09/30 20:13:04 mikealbon Exp $ """ Different stuff that wasn't worth separating it into modules (Registration, Privacy Lists, ...) """ from .protocol import NS_REGISTER, NS_PRIVACY, NS_DATA, Iq, isResultNode, Node def _on_default_response(disp, iq, cb): def _on_response(resp): if isResultNode(resp): if cb: cb(True) elif cb: cb(False) disp.SendAndCallForResponse(iq, _on_response) ############################################################################### ### Registration ############################################################################### REGISTER_DATA_RECEIVED = 'REGISTER DATA RECEIVED' def getRegInfo(disp, host, info={}, sync=True): """ Get registration form from remote host. Info dict can be prefilled :param disp: plugged dispatcher instance :param info: dict, like {'username':'joey'}. See JEP-0077 for details. """ iq=Iq('get', NS_REGISTER, to=host) for i in info.keys(): iq.setTagData(i, info[i]) if sync: disp.SendAndCallForResponse(iq, lambda resp: _ReceivedRegInfo(disp.Dispatcher, resp, host)) else: disp.SendAndCallForResponse(iq, _ReceivedRegInfo, {'agent': host }) def _ReceivedRegInfo(con, resp, agent): Iq('get', NS_REGISTER, to=agent) if not isResultNode(resp): error_msg = resp.getErrorMsg() con.Event(NS_REGISTER, REGISTER_DATA_RECEIVED, (agent, None, False, error_msg, '')) return tag=resp.getTag('query', namespace=NS_REGISTER) if not tag: error_msg = resp.getErrorMsg() con.Event(NS_REGISTER, REGISTER_DATA_RECEIVED, (agent, None, False, error_msg, '')) return df=tag.getTag('x', namespace=NS_DATA) if df: con.Event(NS_REGISTER, REGISTER_DATA_RECEIVED, (agent, df, True, '', tag)) return df={} for i in resp.getQueryPayload(): if not isinstance(i, Node): continue df[i.getName()] = i.getData() con.Event(NS_REGISTER, REGISTER_DATA_RECEIVED, (agent, df, False, '', '')) def register(disp, host, info, cb, args=None): """ Perform registration on remote server with provided info If registration fails you can get additional info from the dispatcher's owner attributes lastErrNode, lastErr and lastErrCode. """ iq=Iq('set', NS_REGISTER, to=host) if not isinstance(info, dict): info=info.asDict() for i in info.keys(): iq.setTag('query').setTagData(i, info[i]) disp.SendAndCallForResponse(iq, cb, args) def unregister(disp, host, cb): """ Unregisters with host (permanently removes account). Returns true on success """ iq = Iq('set', NS_REGISTER, to=host, payload=[Node('remove')]) _on_default_response(disp, iq, cb) def changePasswordTo(disp, newpassword, host=None, cb = None): """ Changes password on specified or current (if not specified) server. Returns true on success. """ if not host: host = disp._owner.Server iq = Iq('set', NS_REGISTER, to=host, payload=[Node('username', payload=[disp._owner.Server]), Node('password', payload=[newpassword])]) _on_default_response(disp, iq, cb) ############################################################################### ### Privacy List ############################################################################### PL_TYPE_JID = 'jid' PL_TYPE_GROUP = 'group' PL_TYPE_SUBC = 'subscription' PL_ACT_ALLOW = 'allow' PL_ACT_DENY = 'deny' PRIVACY_LISTS_RECEIVED = 'PRIVACY LISTS RECEIVED' PRIVACY_LIST_RECEIVED = 'PRIVACY LIST RECEIVED' PRIVACY_LISTS_ACTIVE_DEFAULT = 'PRIVACY LISTS ACTIVE DEFAULT' def getPrivacyLists(disp): """ Request privacy lists from connected server. Returns dictionary of existing lists on success. """ iq = Iq('get', NS_PRIVACY) def _on_response(resp): dict_ = {'lists': []} if not isResultNode(resp): disp.Event(NS_PRIVACY, PRIVACY_LISTS_RECEIVED, False) return for list_ in resp.getQueryPayload(): if list_.getName()=='list': dict_['lists'].append(list_.getAttr('name')) else: dict_[list_.getName()]=list_.getAttr('name') disp.Event(NS_PRIVACY, PRIVACY_LISTS_RECEIVED, dict_) disp.SendAndCallForResponse(iq, _on_response) def getActiveAndDefaultPrivacyLists(disp): iq = Iq('get', NS_PRIVACY) def _on_response(resp): dict_ = {'active': '', 'default': ''} if not isResultNode(resp): disp.Event(NS_PRIVACY, PRIVACY_LISTS_ACTIVE_DEFAULT, False) return for list_ in resp.getQueryPayload(): if list_.getName() == 'active': dict_['active'] = list_.getAttr('name') elif list_.getName() == 'default': dict_['default'] = list_.getAttr('name') disp.Event(NS_PRIVACY, PRIVACY_LISTS_ACTIVE_DEFAULT, dict_) disp.SendAndCallForResponse(iq, _on_response) def getPrivacyList(disp, listname): """ Request specific privacy list listname. Returns list of XML nodes (rules) taken from the server responce. """ def _on_response(resp): if not isResultNode(resp): disp.Event(NS_PRIVACY, PRIVACY_LIST_RECEIVED, False) return disp.Event(NS_PRIVACY, PRIVACY_LIST_RECEIVED, resp) iq = Iq('get', NS_PRIVACY, payload=[Node('list', {'name': listname})]) disp.SendAndCallForResponse(iq, _on_response) def setActivePrivacyList(disp, listname=None, typ='active', cb=None): """ Switch privacy list 'listname' to specified type. By default the type is 'active'. Returns true on success. """ if listname: attrs={'name':listname} else: attrs={} iq = Iq('set', NS_PRIVACY, payload=[Node(typ, attrs)]) _on_default_response(disp, iq, cb) def setDefaultPrivacyList(disp, listname=None): """ Set the default privacy list as 'listname'. Returns true on success """ return setActivePrivacyList(disp, listname, 'default') def setPrivacyList(disp, listname, tags): """ Set the ruleset 'list' should be the simpleXML node formatted according to RFC 3921 (XMPP-IM) I.e. Node('list',{'name':listname},payload=[...]). Returns true on success. """ iq = Iq('set', NS_PRIVACY, xmlns = '') list_query = iq.getTag('query').setTag('list', {'name': listname}) for item in tags: if 'type' in item and 'value' in item: item_tag = list_query.setTag('item', {'action': item['action'], 'order': item['order'], 'type': item['type'], 'value': item['value']}) else: item_tag = list_query.setTag('item', {'action': item['action'], 'order': item['order']}) if 'child' in item: for child_tag in item['child']: item_tag.setTag(child_tag) _on_default_response(disp, iq, None) def delPrivacyList(disp, listname, cb=None): """ Deletes privacy list 'listname'. Returns true on success. """ iq = Iq('set', NS_PRIVACY, payload=[Node('list', {'name':listname})]) _on_default_response(disp, iq, cb) python-nbxmpp-nbxmpp-0.6.10/nbxmpp/idlequeue.py000066400000000000000000000445261343257752000216060ustar00rootroot00000000000000## idlequeue.py ## ## Copyright (C) 2006 Dimitur Kirov ## ## 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. """ Idlequeues are Gajim's network heartbeat. Transports can be plugged as idle objects and be informed about possible IO """ from __future__ import unicode_literals import os import errno import sys import select import logging log = logging.getLogger('nbxmpp.idlequeue') # needed for get_idleqeue try: if sys.version_info[0] == 2: import gobject else: from gi.repository import GLib HAVE_GLIB = True except ImportError: HAVE_GLIB = False # needed for idlecommand if os.name == 'nt': from subprocess import * # python24 only. we ask this for Windows elif os.name == 'posix': import fcntl if sys.version_info[0] == 2 or not HAVE_GLIB: FLAG_WRITE = 20 # write only 10100 FLAG_READ = 19 # read only 10011 FLAG_READ_WRITE = 23 # read and write 10111 FLAG_CLOSE = 16 # wait for close 10000 PENDING_READ = 3 # waiting read event 11 PENDING_WRITE = 4 # waiting write event 100 IS_CLOSED = 16 # channel closed 10000 else: FLAG_WRITE = GLib.IOCondition.OUT | GLib.IOCondition.HUP FLAG_READ = GLib.IOCondition.IN | GLib.IOCondition.PRI | \ GLib.IOCondition.HUP FLAG_READ_WRITE = GLib.IOCondition.OUT | GLib.IOCondition.IN | \ GLib.IOCondition.PRI | GLib.IOCondition.HUP FLAG_CLOSE = GLib.IOCondition.HUP PENDING_READ = GLib.IOCondition.IN # There is data to read. PENDING_WRITE = GLib.IOCondition.OUT # Data CAN be written without blocking. IS_CLOSED = GLib.IOCondition.HUP # Hung up (connection broken) def get_idlequeue(): """ Get an appropriate idlequeue """ if os.name == 'nt': # gobject.io_add_watch does not work on windows return SelectIdleQueue() else: if HAVE_GLIB: # Gajim's default Idlequeue return GlibIdleQueue() else: # GUI less implementation return SelectIdleQueue() class IdleObject(object): """ Idle listener interface. Listed methods are called by IdleQueue. """ def __init__(self): self.fd = -1 #: filedescriptor, must be unique for each IdleObject def pollend(self): """ Called on stream failure """ pass def pollin(self): """ Called on new read event """ pass def pollout(self): """ Called on new write event (connect in sockets is a pollout) """ pass def read_timeout(self): """ Called when timeout happened """ pass class IdleCommand(IdleObject): """ Can be subclassed to execute commands asynchronously by the idlequeue. Result will be optained via file descriptor of created pipe """ def __init__(self, on_result): IdleObject.__init__(self) # how long (sec.) to wait for result ( 0 - forever ) # it is a class var, instead of a constant and we can override it. self.commandtimeout = 0 # when we have some kind of result (valid, ot not) we call this handler self.result_handler = on_result # if it is True, we can safetely execute the command self.canexecute = True self.idlequeue = None self.result ='' def set_idlequeue(self, idlequeue): self.idlequeue = idlequeue def _return_result(self): if self.result_handler: self.result_handler(self.result) self.result_handler = None def _compose_command_args(self): return ['echo', 'da'] def _compose_command_line(self): """ Return one line representation of command and its arguments """ return ' '.join(self._compose_command_args()) def wait_child(self): if self.pipe.poll() is None: # result timeout if self.endtime < self.idlequeue.current_time(): self._return_result() self.pipe.stdout.close() self.pipe.stdin.close() else: # child is still active, continue to wait self.idlequeue.set_alarm(self.wait_child, 0.1) else: # child has quit self.result = self.pipe.stdout.read() self._return_result() self.pipe.stdout.close() self.pipe.stdin.close() def start(self): if not self.canexecute: self.result = '' self._return_result() return if os.name == 'nt': self._start_nt() elif os.name == 'posix': self._start_posix() def _start_nt(self): # if program is started from noninteraactive shells stdin is closed and # cannot be forwarded, so we have to keep it open self.pipe = Popen(self._compose_command_args(), stdout=PIPE, bufsize=1024, shell=True, stderr=STDOUT, stdin=PIPE) if self.commandtimeout >= 0: self.endtime = self.idlequeue.current_time() + \ (self.commandtimeout * 1e6) self.idlequeue.set_alarm(self.wait_child, 0.1) def _start_posix(self): self.pipe = os.popen(self._compose_command_line()) self.fd = self.pipe.fileno() fcntl.fcntl(self.pipe, fcntl.F_SETFL, os.O_NONBLOCK) self.idlequeue.plug_idle(self, False, True) if self.commandtimeout >= 0: self.idlequeue.set_read_timeout(self.fd, self.commandtimeout) def end(self): self.idlequeue.unplug_idle(self.fd) try: self.pipe.close() except: pass def pollend(self): self.idlequeue.remove_timeout(self.fd) self.end() self._return_result() def pollin(self): try: res = self.pipe.read() except Exception as e: res = '' if res == '': return self.pollend() else: self.result += res def read_timeout(self): self.end() self._return_result() class IdleQueue(object): """ IdleQueue provide three distinct time based features. Uses select.poll() 1. Alarm timeout: Execute a callback after foo seconds 2. Timeout event: Call read_timeout() of an plugged object if a timeout has been set, but not removed in time. 3. Check file descriptor of plugged objects for read, write and error events """ # (timeout, boolean) # Boolean is True if timeout is specified in seconds, False means miliseconds PROCESS_TIMEOUT = (100, False) def __init__(self): self.queue = {} # when there is a timeout it executes obj.read_timeout() # timeout is not removed automatically! # {fd1: {timeout1: func1, timeout2: func2}} # timout are unique (timeout1 must be != timeout2) # If func1 is None, read_time function is called self.read_timeouts = {} # cb, which are executed after XX sec., alarms are removed automatically self.alarms = {} self._init_idle() def _init_idle(self): """ Hook method for subclassed. Will be called by __init__ """ self.selector = select.poll() def set_alarm(self, alarm_cb, seconds): """ Set up a new alarm. alarm_cb will be called after specified seconds. """ alarm_time = self.current_time() + (seconds * 1e6) # almost impossible, but in case we have another alarm_cb at this time if alarm_time in self.alarms: self.alarms[alarm_time].append(alarm_cb) else: self.alarms[alarm_time] = [alarm_cb] return alarm_time def remove_alarm(self, alarm_cb, alarm_time): """ Remove alarm callback alarm_cb scheduled on alarm_time. Returns True if it was removed sucessfully, otherwise False """ if alarm_time not in self.alarms: return False i = -1 for i in range(len(self.alarms[alarm_time])): # let's not modify the list inside the loop if self.alarms[alarm_time][i] is alarm_cb: break if i != -1: del self.alarms[alarm_time][i] if not self.alarms[alarm_time]: del self.alarms[alarm_time] return True else: return False def remove_timeout(self, fd, timeout=None): """ Remove the read timeout """ log.info('read timeout removed for fd %s' % fd) if fd in self.read_timeouts: if timeout: if timeout in self.read_timeouts[fd]: del(self.read_timeouts[fd][timeout]) if len(self.read_timeouts[fd]) == 0: del(self.read_timeouts[fd]) else: del(self.read_timeouts[fd]) def set_read_timeout(self, fd, seconds, func=None): """ Seta a new timeout. If it is not removed after specified seconds, func or obj.read_timeout() will be called A filedescriptor fd can have several timeouts. """ log_txt = 'read timeout set for fd %s on %s seconds' % (fd, seconds) if func: log_txt += ' with function ' + str(func) log.info(log_txt) timeout = self.current_time() + (seconds * 1e6) if fd in self.read_timeouts: self.read_timeouts[fd][timeout] = func else: self.read_timeouts[fd] = {timeout: func} def _check_time_events(self): """ Execute and remove alarm callbacks and execute func() or read_timeout() for plugged objects if specified time has ellapsed """ current_time = self.current_time() for fd, timeouts in list(self.read_timeouts.items()): if fd not in self.queue: self.remove_timeout(fd) continue for timeout, func in list(timeouts.items()): if timeout > current_time: continue if func: log.debug('Calling %s for fd %s' % (func, fd)) func() else: log.debug('Calling read_timeout for fd %s' % fd) self.queue[fd].read_timeout() self.remove_timeout(fd, timeout) times = list(self.alarms.keys()) for alarm_time in times: if alarm_time > current_time: continue if alarm_time in self.alarms: for callback in self.alarms[alarm_time]: callback() if alarm_time in self.alarms: del(self.alarms[alarm_time]) def plug_idle(self, obj, writable=True, readable=True): """ Plug an IdleObject into idlequeue. Filedescriptor fd must be set :param obj: the IdleObject :param writable: True if obj has data to sent :param readable: True if obj expects data to be received """ if obj.fd == -1: return if obj.fd in self.queue: self.unplug_idle(obj.fd) self.queue[obj.fd] = obj if writable: if not readable: flags = FLAG_WRITE else: flags = FLAG_READ_WRITE else: if readable: flags = FLAG_READ else: # when we paused a FT, we expect only a close event flags = FLAG_CLOSE self._add_idle(obj.fd, flags) def _add_idle(self, fd, flags): """ Hook method for subclasses, called by plug_idle """ self.selector.register(fd, flags) def unplug_idle(self, fd): """ Remove plugged IdleObject, specified by filedescriptor fd """ if fd in self.queue: del(self.queue[fd]) self._remove_idle(fd) def current_time(self): from time import time return time() * 1e6 def _remove_idle(self, fd): """ Hook method for subclassed, called by unplug_idle """ self.selector.unregister(fd) def _process_events(self, fd, flags): obj = self.queue.get(fd) if obj is None: self.unplug_idle(fd) return False read_write = False if flags & PENDING_READ: #print 'waiting read on %d, flags are %d' % (fd, flags) obj.pollin() read_write = True elif flags & PENDING_WRITE and not flags & IS_CLOSED: obj.pollout() read_write = True if flags & IS_CLOSED: # io error, don't expect more events self.remove_timeout(obj.fd) self.unplug_idle(obj.fd) obj.pollend() return False if read_write: return True return False def process(self): """ This function must be overridden by an implementation of the IdleQueue. Process idlequeue. Check for any pending timeout or alarm events. Call IdleObjects on possible and requested read, write and error events on their file descriptors Call this in regular intervals. """ raise NotImplementedError("You need to define a process() method.") class SelectIdleQueue(IdleQueue): """ Extends IdleQueue to use select.select() for polling This class exisists for the sake of gtk2.8 on windows, which doesn't seem to support io_add_watch properly (yet) """ def checkQueue(self): """ Iterates through all known file descriptors and uses os.stat to check if they're valid. Greatly improves performance if the caller hands us and expects notification on an invalid file handle. """ bad_fds=[] union={} union.update(self.write_fds) union.update(self.read_fds) union.update(self.error_fds) for fd in (union.keys()): try: status = os.stat(fd) except OSError as e: # This file descriptor is invalid. Add to list for closure. bad_fds.append(fd) for fd in (bad_fds): obj = self.queue.get(fd) if obj is not None: self.remove_timeout(fd) self.unplug_idle(fd) def _init_idle(self): """ Create a dict, which maps file/pipe/sock descriptor to glib event id """ self.read_fds = {} self.write_fds = {} self.error_fds = {} def _add_idle(self, fd, flags): """ This method is called when we plug a new idle object. Add descriptor to read/write/error lists, according flags """ if flags & 3: self.read_fds[fd] = fd if flags & 4: self.write_fds[fd] = fd self.error_fds[fd] = fd def _remove_idle(self, fd): """ This method is called when we unplug a new idle object. Remove descriptor from read/write/error lists """ if fd in self.read_fds: del(self.read_fds[fd]) if fd in self.write_fds: del(self.write_fds[fd]) if fd in self.error_fds: del(self.error_fds[fd]) def process(self): if not self.write_fds and not self.read_fds: self._check_time_events() return True try: waiting_descriptors = select.select(list(self.read_fds.keys()), list(self.write_fds.keys()), list(self.error_fds.keys()), 0) except OSError as e: waiting_descriptors = ((), (), ()) if e.errno != errno.EINTR: self.checkQueue() raise for fd in waiting_descriptors[0]: q = self.queue.get(fd) if q: q.pollin() for fd in waiting_descriptors[1]: q = self.queue.get(fd) if q: q.pollout() for fd in waiting_descriptors[2]: q = self.queue.get(fd) if q: q.pollend() self._check_time_events() return True class GlibIdleQueue(IdleQueue): """ Extends IdleQueue to use glib io_add_wath, instead of select/poll In another 'non gui' implementation of Gajim IdleQueue can be used safetly """ # (timeout, boolean) # Boolean is True if timeout is specified in seconds, False means miliseconds PROCESS_TIMEOUT = (2, True) def _init_idle(self): """ Creates a dict, which maps file/pipe/sock descriptor to glib event id """ self.events = {} def _add_idle(self, fd, flags): """ This method is called when we plug a new idle object. Start listening for events from fd """ if sys.version_info[0] == 2: res = gobject.io_add_watch(fd, flags, self._process_events, priority=gobject.PRIORITY_LOW) else: res = GLib.io_add_watch(fd, GLib.PRIORITY_LOW, flags, self._process_events) # store the id of the watch, so that we can remove it on unplug self.events[fd] = res def _process_events(self, fd, flags): try: return IdleQueue._process_events(self, fd, flags) except Exception: self._remove_idle(fd) self._add_idle(fd, flags) raise def _remove_idle(self, fd): """ This method is called when we unplug a new idle object. Stop listening for events from fd """ if not fd in self.events: return if sys.version_info[0] == 2: gobject.source_remove(self.events[fd]) else: GLib.source_remove(self.events[fd]) del(self.events[fd]) def process(self): self._check_time_events() if sys.version_info[0] == 2 or not HAVE_GLIB: def current_time(self): return gobject.get_current_time() * 1e6 else: current_time = GLib.get_real_time python-nbxmpp-nbxmpp-0.6.10/nbxmpp/plugin.py000066400000000000000000000067711343257752000211220ustar00rootroot00000000000000## plugin.py ## ## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov ## ## 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. # $Id: client.py,v 1.52 2006/01/02 19:40:55 normanr Exp $ """ Provides PlugIn class functionality to develop extentions for xmpppy """ import logging log = logging.getLogger('nbxmpp.plugin') class PlugIn(object): """ Abstract xmpppy plugin infrastructure code, providing plugging in/out and debugging functionality Inherit to develop pluggable objects. No code change on the owner class required (the object where we plug into) For every instance of PlugIn class the 'owner' is the class in what the plug was plugged. """ def __init__(self): self._exported_methods=[] def PlugIn(self, owner, *args, **kwargs): """ Attach to owner and register ourself and our _exported_methods in it. If defined by a subclass, call self.plugin(owner) to execute hook code after plugging """ self._owner=owner log.info('Plugging %s __INTO__ %s' % (self, self._owner)) if self.__class__.__name__ in owner.__dict__: log.debug('Plugging ignored: another instance already plugged.') return self._old_owners_methods=[] for method in self._exported_methods: if method.__name__ in owner.__dict__: self._old_owners_methods.append(owner.__dict__[method.__name__]) owner.__dict__[method.__name__]=method if self.__class__.__name__.endswith('Dispatcher'): # FIXME: I need BOSHDispatcher or XMPPDispatcher on .Dispatcher # there must be a better way.. owner.__dict__['Dispatcher']=self else: owner.__dict__[self.__class__.__name__]=self # Execute hook if hasattr(self, 'plugin'): return self.plugin(owner, *args, **kwargs) def PlugOut(self, *args, **kwargs): """ Unregister our _exported_methods from owner and detach from it. If defined by a subclass, call self.plugout() after unplugging to execute hook code """ log.info('Plugging %s __OUT__ of %s.' % (self, self._owner)) for method in self._exported_methods: del self._owner.__dict__[method.__name__] for method in self._old_owners_methods: self._owner.__dict__[method.__name__]=method # FIXME: Dispatcher workaround if self.__class__.__name__.endswith('Dispatcher'): del self._owner.__dict__['Dispatcher'] else: del self._owner.__dict__[self.__class__.__name__] # Execute hook if hasattr(self, 'plugout'): return self.plugout(*args, **kwargs) del self._owner @classmethod def get_instance(cls, *args, **kwargs): """ Factory Method for object creation Use this instead of directly initializing the class in order to make unit testing easier. For testing, this method can be patched to inject mock objects. """ return cls(*args, **kwargs) python-nbxmpp-nbxmpp-0.6.10/nbxmpp/protocol.py000066400000000000000000002254541343257752000214660ustar00rootroot00000000000000## protocol.py ## ## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov ## ## 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. # $Id: protocol.py,v 1.52 2006/01/09 22:08:57 normanr Exp $ """ Protocol module contains tools that are needed for processing of xmpp-related data structures, including jabber-objects like JID or different stanzas and sub- stanzas) handling routines """ from .simplexml import Node, NodeBuilder import time import string import hashlib from base64 import b64encode def ascii_upper(s): return s.upper() NS_ACTIVITY = 'http://jabber.org/protocol/activity' # XEP-0108 NS_ADDRESS = 'http://jabber.org/protocol/address' # XEP-0033 NS_AGENTS = 'jabber:iq:agents' NS_AMP = 'http://jabber.org/protocol/amp' NS_AMP_ERRORS = NS_AMP + '#errors' NS_ARCHIVE = 'urn:xmpp:archive' # XEP-0136 NS_ARCHIVE_AUTO = NS_ARCHIVE + ':auto' # XEP-0136 NS_ARCHIVE_MANAGE = NS_ARCHIVE + ':manage' # XEP-0136 NS_ARCHIVE_MANUAL = NS_ARCHIVE + ':manual' # XEP-0136 NS_ARCHIVE_PREF = NS_ARCHIVE + ':pref' NS_ATOM = 'http://www.w3.org/2005/Atom' NS_ATTENTION = 'urn:xmpp:attention:0' # XEP-0224 NS_AUTH = 'jabber:iq:auth' NS_AVATAR = 'http://www.xmpp.org/extensions/xep-0084.html#ns-metadata' NS_AVATAR_METADATA = 'urn:xmpp:avatar:metadata' # XEP-0084 NS_AVATAR_DATA = 'urn:xmpp:avatar:data' # XEP-0084 NS_BIND = 'urn:ietf:params:xml:ns:xmpp-bind' NS_BLOCKING = 'urn:xmpp:blocking' # XEP-0191 NS_BOB = 'urn:xmpp:bob' # XEP-0231 NS_BOOKMARKS = 'storage:bookmarks' # XEP-0048 NS_BROWSE = 'jabber:iq:browse' NS_BROWSING = 'http://jabber.org/protocol/browsing' # XEP-0195 NS_BYTESTREAM = 'http://jabber.org/protocol/bytestreams' # XEP-0065 NS_CAPS = 'http://jabber.org/protocol/caps' # XEP-0115 NS_CAPTCHA = 'urn:xmpp:captcha' # XEP-0158 NS_CARBONS = 'urn:xmpp:carbons:2' # XEP-0280 NS_CHATMARKERS = 'urn:xmpp:chat-markers:0' # XEP-0333 NS_CHATSTATES = 'http://jabber.org/protocol/chatstates' # XEP-0085 NS_CHATTING = 'http://jabber.org/protocol/chatting' # XEP-0194 NS_CLIENT = 'jabber:client' NS_CONDITIONS = 'urn:xmpp:muc:conditions:0' # XEP-0306 NS_COMMANDS = 'http://jabber.org/protocol/commands' NS_COMPONENT_ACCEPT = 'jabber:component:accept' NS_COMPONENT_1 = 'http://jabberd.jabberstudio.org/ns/component/1.0' NS_COMPRESS = 'http://jabber.org/protocol/compress' # XEP-0138 NS_CONFERENCE = 'jabber:x:conference' NS_CORRECT = 'urn:xmpp:message-correct:0' # XEP-0308 NS_DATA = 'jabber:x:data' # XEP-0004 NS_DATA_MEDIA = 'urn:xmpp:media-element' # XEP-0221 NS_DELAY = 'jabber:x:delay' NS_DELAY2 = 'urn:xmpp:delay' NS_DIALBACK = 'jabber:server:dialback' NS_DISCO = 'http://jabber.org/protocol/disco' NS_DISCO_INFO = NS_DISCO + '#info' NS_DISCO_ITEMS = NS_DISCO + '#items' NS_EME = 'urn:xmpp:eme:0' # XEP-0380 NS_ENCRYPTED = 'jabber:x:encrypted' # XEP-0027 NS_ESESSION = 'http://www.xmpp.org/extensions/xep-0116.html#ns' NS_ESESSION_INIT = 'http://www.xmpp.org/extensions/xep-0116.html#ns-init' # XEP-0116 NS_EVENT = 'jabber:x:event' # XEP-0022 NS_FEATURE = 'http://jabber.org/protocol/feature-neg' NS_FILE = 'http://jabber.org/protocol/si/profile/file-transfer' # XEP-0096 NS_FORWARD = 'urn:xmpp:forward:0' # XEP-0297 NS_GAMING = 'http://jabber.org/protocol/gaming' # XEP-0196 NS_GATEWAY = 'jabber:iq:gateway' # XEP-0100 NS_GEOLOC = 'http://jabber.org/protocol/geoloc' # XEP-0080 NS_GROUPCHAT = 'gc-1.0' NS_MSG_HINTS = 'urn:xmpp:hints' # XEP-0280 NS_HTTP_AUTH = 'http://jabber.org/protocol/http-auth' # XEP-0070 NS_HTTP_BIND = 'http://jabber.org/protocol/httpbind' # XEP-0124 NS_HTTPUPLOAD = 'urn:xmpp:http:upload' # XEP-0363 NS_HTTPUPLOAD_0 = 'urn:xmpp:http:upload:0' # XEP-0363 NS_IBB = 'http://jabber.org/protocol/ibb' NS_IDLE = 'urn:xmpp:idle:1' # XEP-0319 NS_INVISIBLE = 'presence-invisible' # Jabberd2 NS_IQ = 'iq' # Jabberd2 NS_JINGLE ='urn:xmpp:jingle:1' # XEP-0166 NS_JINGLE_ERRORS = 'urn:xmpp:jingle:errors:1' # XEP-0166 NS_JINGLE_RTP = 'urn:xmpp:jingle:apps:rtp:1' # XEP-0167 NS_JINGLE_RTP_AUDIO = 'urn:xmpp:jingle:apps:rtp:audio' # XEP-0167 NS_JINGLE_RTP_VIDEO = 'urn:xmpp:jingle:apps:rtp:video' # XEP-0167 NS_JINGLE_FILE_TRANSFER = 'urn:xmpp:jingle:apps:file-transfer:3' # XEP-0234 NS_JINGLE_FILE_TRANSFER_5 = 'urn:xmpp:jingle:apps:file-transfer:5' # XEP-0234 NS_JINGLE_XTLS='urn:xmpp:jingle:security:xtls:0' # XTLS: EXPERIMENTAL security layer of jingle NS_JINGLE_RAW_UDP = 'urn:xmpp:jingle:transports:raw-udp:1' # XEP-0177 NS_JINGLE_ICE_UDP = 'urn:xmpp:jingle:transports:ice-udp:1' # XEP-0176 NS_JINGLE_BYTESTREAM ='urn:xmpp:jingle:transports:s5b:1' # XEP-0260 NS_JINGLE_IBB = 'urn:xmpp:jingle:transports:ibb:1' # XEP-0261 NS_LAST = 'jabber:iq:last' NS_LOCATION = 'http://jabber.org/protocol/geoloc' # XEP-0080 NS_MAM = 'urn:xmpp:mam:0' # XEP-0313 NS_MAM_1 = 'urn:xmpp:mam:1' # XEP-0313 NS_MAM_2 = 'urn:xmpp:mam:2' # XEP-0313 NS_MESSAGE = 'message' # Jabberd2 NS_MOOD = 'http://jabber.org/protocol/mood' # XEP-0107 NS_MUC = 'http://jabber.org/protocol/muc' NS_MUC_USER = NS_MUC + '#user' NS_MUC_ADMIN = NS_MUC + '#admin' NS_MUC_OWNER = NS_MUC + '#owner' NS_MUC_UNIQUE = NS_MUC + '#unique' NS_MUC_CONFIG = NS_MUC + '#roomconfig' NS_NICK = 'http://jabber.org/protocol/nick' # XEP-0172 NS_OFFLINE = 'http://www.jabber.org/jeps/jep-0030.html' # XEP-0013 NS_OMEMO = 'urn:xmpp:omemo:0' # XEP-0384 NS_PHYSLOC = 'http://jabber.org/protocol/physloc' # XEP-0112 NS_PING = 'urn:xmpp:ping' # XEP-0199 NS_PRESENCE = 'presence' # Jabberd2 NS_PRIVACY = 'jabber:iq:privacy' NS_PRIVATE = 'jabber:iq:private' NS_PROFILE = 'http://jabber.org/protocol/profile' # XEP-0154 NS_PUBSUB = 'http://jabber.org/protocol/pubsub' # XEP-0060 NS_PUBSUB_EVENT = 'http://jabber.org/protocol/pubsub#event' NS_PUBSUB_PUBLISH_OPTIONS = NS_PUBSUB + '#publish-options' # XEP-0060 NS_PUBSUB_OWNER = 'http://jabber.org/protocol/pubsub#owner' # XEP-0060 NS_REGISTER = 'jabber:iq:register' NS_ROSTER = 'jabber:iq:roster' NS_ROSTERNOTES = 'storage:rosternotes' NS_ROSTERX = 'http://jabber.org/protocol/rosterx' # XEP-0144 NS_ROSTER_VER = 'urn:xmpp:features:rosterver' # XEP-0273 NS_RPC = 'jabber:iq:rpc' # XEP-0009 NS_RSM = 'http://jabber.org/protocol/rsm' NS_SASL = 'urn:ietf:params:xml:ns:xmpp-sasl' NS_SECLABEL = 'urn:xmpp:sec-label:0' NS_SECLABEL_CATALOG = 'urn:xmpp:sec-label:catalog:2' NS_SEARCH = 'jabber:iq:search' NS_SERVER = 'jabber:server' NS_SESSION = 'urn:ietf:params:xml:ns:xmpp-session' NS_SI = 'http://jabber.org/protocol/si' # XEP-0096 NS_SI_PUB = 'http://jabber.org/protocol/sipub' # XEP-0137 NS_SID = 'urn:xmpp:sid:0' # XEP-0359 NS_SIGNED = 'jabber:x:signed' # XEP-0027 NS_SIMS = 'urn:xmpp:sims:1' # XEP-0385 NS_SSN = 'urn:xmpp:ssn' # XEP-0155 NS_STANZA_CRYPTO = 'http://www.xmpp.org/extensions/xep-0200.html#ns' # XEP-0200 NS_STANZAS = 'urn:ietf:params:xml:ns:xmpp-stanzas' NS_STREAM = 'http://affinix.com/jabber/stream' NS_STREAMS = 'http://etherx.jabber.org/streams' NS_TIME = 'jabber:iq:time' # XEP-0900 NS_TIME_REVISED = 'urn:xmpp:time' # XEP-0202 NS_TLS = 'urn:ietf:params:xml:ns:xmpp-tls' NS_TUNE = 'http://jabber.org/protocol/tune' # XEP-0118 NS_VACATION = 'http://jabber.org/protocol/vacation' NS_VCARD = 'vcard-temp' NS_GMAILNOTIFY = 'google:mail:notify' NS_GTALKSETTING = 'google:setting' NS_VCARD_UPDATE = NS_VCARD + ':x:update' NS_VERSION = 'jabber:iq:version' NS_VIEWING = 'http://jabber.org/protocol/viewing' # XEP--197 NS_WAITINGLIST = 'http://jabber.org/protocol/waitinglist' # XEP-0130 NS_XHTML_IM = 'http://jabber.org/protocol/xhtml-im' # XEP-0071 NS_XHTML = 'http://www.w3.org/1999/xhtml' # " NS_X_OOB = 'jabber:x:oob' # XEP-0066 NS_DATA_LAYOUT = 'http://jabber.org/protocol/xdata-layout' # XEP-0141 NS_DATA_VALIDATE = 'http://jabber.org/protocol/xdata-validate' # XEP-0122 NS_XMPP_STREAMS = 'urn:ietf:params:xml:ns:xmpp-streams' NS_RECEIPTS = 'urn:xmpp:receipts' NS_PUBKEY_PUBKEY = 'urn:xmpp:pubkey:2' # XEP-0189 NS_PUBKEY_REVOKE = 'urn:xmpp:revoke:2' NS_PUBKEY_ATTEST = 'urn:xmpp:attest:2' NS_STREAM_MGMT = 'urn:xmpp:sm:3' # XEP-198 NS_HASHES = 'urn:xmpp:hashes:1' # XEP-300 NS_HASHES_2 = 'urn:xmpp:hashes:2' # XEP-300 NS_HASHES_MD5 = 'urn:xmpp:hash-function-text-names:md5' NS_HASHES_SHA1 = 'urn:xmpp:hash-function-text-names:sha-1' NS_HASHES_SHA256 = 'urn:xmpp:hash-function-text-names:sha-256' NS_HASHES_SHA512 = 'urn:xmpp:hash-function-text-names:sha-512' NS_HASHES_SHA3_256 = 'urn:xmpp:hash-function-text-names:sha3-256' NS_HASHES_SHA3_512 = 'urn:xmpp:hash-function-text-names:sha3-512' NS_HASHES_BLAKE2B_256 = 'urn:xmpp:hash-function-text-names:id-blake2b256' NS_HASHES_BLAKE2B_512 = 'urn:xmpp:hash-function-text-names:id-blake2b512' NS_OPENPGP = 'urn:xmpp:openpgp:0' NS_DOMAIN_BASED_NAME = 'urn:xmpp:domain-based-name:1' #xmpp_stream_error_conditions = ''' #bad-format -- -- -- The entity has sent XML that cannot be processed. #bad-namespace-prefix -- -- -- The entity has sent a namespace prefix that is unsupported, or has sent no namespace prefix on an element that requires such a prefix. #conflict -- -- -- The server is closing the active stream for this entity because a new stream has been initiated that conflicts with the existing stream. #connection-timeout -- -- -- The entity has not generated any traffic over the stream for some period of time. #host-gone -- -- -- The value of the 'to' attribute provided by the initiating entity in the stream header corresponds to a hostname that is no longer hosted by the server. #host-unknown -- -- -- The value of the 'to' attribute provided by the initiating entity in the stream header does not correspond to a hostname that is hosted by the server. #improper-addressing -- -- -- A stanza sent between two servers lacks a 'to' or 'from' attribute (or the attribute has no value). #internal-server-error -- -- -- The server has experienced a misconfiguration or an otherwise-undefined internal error that prevents it from servicing the stream. #invalid-from -- cancel -- -- The JID or hostname provided in a 'from' address does not match an authorized JID or validated domain negotiated between servers via SASL or dialback, or between a client and a server via authentication and resource authorization. #invalid-id -- -- -- The stream ID or dialback ID is invalid or does not match an ID previously provided. #invalid-namespace -- -- -- The streams namespace name is something other than "http://etherx.jabber.org/streams" or the dialback namespace name is something other than "jabber:server:dialback". #invalid-xml -- -- -- The entity has sent invalid XML over the stream to a server that performs validation. #not-authorized -- -- -- The entity has attempted to send data before the stream has been authenticated, or otherwise is not authorized to perform an action related to stream negotiation. #policy-violation -- -- -- The entity has violated some local service policy. #remote-connection-failed -- -- -- The server is unable to properly connect to a remote resource that is required for authentication or authorization. #resource-constraint -- -- -- The server lacks the system resources necessary to service the stream. #restricted-xml -- -- -- The entity has attempted to send restricted XML features such as a comment, processing instruction, DTD, entity reference, or unescaped character. #see-other-host -- -- -- The server will not provide service to the initiating entity but is redirecting traffic to another host. #system-shutdown -- -- -- The server is being shut down and all active streams are being closed. #undefined-condition -- -- -- The error condition is not one of those defined by the other conditions in this list. #unsupported-encoding -- -- -- The initiating entity has encoded the stream in an encoding that is not supported by the server. #unsupported-stanza-type -- -- -- The initiating entity has sent a first-level child of the stream that is not supported by the server. #unsupported-version -- -- -- The value of the 'version' attribute provided by the initiating entity in the stream header specifies a version of XMPP that is not supported by the server. #xml-not-well-formed -- -- -- The initiating entity has sent XML that is not well-formed.''' #xmpp_stanza_error_conditions = ''' #bad-request -- 400 -- modify -- The sender has sent XML that is malformed or that cannot be processed. #conflict -- 409 -- cancel -- Access cannot be granted because an existing resource or session exists with the same name or address. #feature-not-implemented -- 501 -- cancel -- The feature requested is not implemented by the recipient or server and therefore cannot be processed. #forbidden -- 403 -- auth -- The requesting entity does not possess the required permissions to perform the action. #gone -- 302 -- modify -- The recipient or server can no longer be contacted at this address. #internal-server-error -- 500 -- wait -- The server could not process the stanza because of a misconfiguration or an otherwise-undefined internal server error. #item-not-found -- 404 -- cancel -- The addressed JID or item requested cannot be found. #jid-malformed -- 400 -- modify -- The value of the 'to' attribute in the sender's stanza does not adhere to the syntax defined in Addressing Scheme. #not-acceptable -- 406 -- cancel -- The recipient or server understands the request but is refusing to process it because it does not meet criteria defined by the recipient or server. #not-allowed -- 405 -- cancel -- The recipient or server does not allow any entity to perform the action. #not-authorized -- 401 -- auth -- The sender must provide proper credentials before being allowed to perform the action, or has provided improper credentials. #payment-required -- 402 -- auth -- The requesting entity is not authorized to access the requested service because payment is required. #recipient-unavailable -- 404 -- wait -- The intended recipient is temporarily unavailable. #redirect -- 302 -- modify -- The recipient or server is redirecting requests for this information to another entity. #registration-required -- 407 -- auth -- The requesting entity is not authorized to access the requested service because registration is required. #remote-server-not-found -- 404 -- cancel -- A remote server or service specified as part or all of the JID of the intended recipient does not exist. #remote-server-timeout -- 504 -- wait -- A remote server or service specified as part or all of the JID of the intended recipient could not be contacted within a reasonable amount of time. #resource-constraint -- 500 -- wait -- The server or recipient lacks the system resources necessary to service the request. #service-unavailable -- 503 -- cancel -- The server or recipient does not currently provide the requested service. #subscription-required -- 407 -- auth -- The requesting entity is not authorized to access the requested service because a subscription is required. #undefined-condition -- 500 -- -- Undefined Condition #unexpected-request -- 400 -- wait -- The recipient or server understood the request but was not expecting it at this time (e.g., the request was out of order).''' #sasl_error_conditions = ''' #aborted -- -- -- The receiving entity acknowledges an element sent by the initiating entity; sent in reply to the element. #incorrect-encoding -- -- -- The data provided by the initiating entity could not be processed because the [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003. encoding is incorrect (e.g., because the encoding does not adhere to the definition in Section 3 of [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003.); sent in reply to a element or an element with initial response data. #invalid-authzid -- -- -- The authzid provided by the initiating entity is invalid, either because it is incorrectly formatted or because the initiating entity does not have permissions to authorize that ID; sent in reply to a element or an element with initial response data. #invalid-mechanism -- -- -- The initiating entity did not provide a mechanism or requested a mechanism that is not supported by the receiving entity; sent in reply to an element. #mechanism-too-weak -- -- -- The mechanism requested by the initiating entity is weaker than server policy permits for that initiating entity; sent in reply to a element or an element with initial response data. #not-authorized -- -- -- The authentication failed because the initiating entity did not provide valid credentials (this includes but is not limited to the case of an unknown username); sent in reply to a element or an element with initial response data. #temporary-auth-failure -- -- -- The authentication failed because of a temporary error condition within the receiving entity; sent in reply to an element or element.''' #ERRORS, _errorcodes, loc = {}, {}, {} #for ns, errname, errpool in ((NS_XMPP_STREAMS, 'STREAM', #xmpp_stream_error_conditions), (NS_STANZAS, 'ERR', xmpp_stanza_error_conditions), #(NS_SASL, 'SASL', sasl_error_conditions)): #for err in errpool.split('\n')[1:]: #cond, code, typ, text = err.split(' -- ') #name = errname + '_' + ascii_upper(cond).replace('-', '_') #locals()[name] = ns + ' ' + cond #loc[name] = ns + ' ' + cond #ERRORS[ns + ' ' + cond] = [code, typ, text] #if code: #_errorcodes[code] = cond #del ns, errname, errpool, err, cond, code, typ, text #import pprint #pprint.pprint(ERRORS) #pprint.pprint(_errorcodes) #for (k, v) in loc.items(): #print('%s = \'%s\'' % (k, v)) ERRORS = { 'urn:ietf:params:xml:ns:xmpp-sasl aborted': ['', '', 'The receiving entity acknowledges an element sent by the initiating entity; sent in reply to the element.'], 'urn:ietf:params:xml:ns:xmpp-sasl incorrect-encoding': ['', '', 'The data provided by the initiating entity could not be processed because the [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003. encoding is incorrect (e.g., because the encoding does not adhere to the definition in Section 3 of [BASE64]Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003.); sent in reply to a element or an element with initial response data.'], 'urn:ietf:params:xml:ns:xmpp-sasl invalid-authzid': ['', '', 'The authzid provided by the initiating entity is invalid, either because it is incorrectly formatted or because the initiating entity does not have permissions to authorize that ID; sent in reply to a element or an element with initial response data.'], 'urn:ietf:params:xml:ns:xmpp-sasl invalid-mechanism': ['', '', 'The initiating entity did not provide a mechanism or requested a mechanism that is not supported by the receiving entity; sent in reply to an element.'], 'urn:ietf:params:xml:ns:xmpp-sasl mechanism-too-weak': ['', '', 'The mechanism requested by the initiating entity is weaker than server policy permits for that initiating entity; sent in reply to a element or an element with initial response data.'], 'urn:ietf:params:xml:ns:xmpp-sasl not-authorized': ['', '', 'The authentication failed because the initiating entity did not provide valid credentials (this includes but is not limited to the case of an unknown username); sent in reply to a element or an element with initial response data.'], 'urn:ietf:params:xml:ns:xmpp-sasl temporary-auth-failure': ['', '', 'The authentication failed because of a temporary error condition within the receiving entity; sent in reply to an element or element.'], 'urn:ietf:params:xml:ns:xmpp-stanzas bad-request': ['400', 'modify', 'The sender has sent XML that is malformed or that cannot be processed.'], 'urn:ietf:params:xml:ns:xmpp-stanzas conflict': ['409', 'cancel', 'Access cannot be granted because an existing resource or session exists with the same name or address.'], 'urn:ietf:params:xml:ns:xmpp-stanzas feature-not-implemented': ['501', 'cancel', 'The feature requested is not implemented by the recipient or server and therefore cannot be processed.'], 'urn:ietf:params:xml:ns:xmpp-stanzas forbidden': ['403', 'auth', 'The requesting entity does not possess the required permissions to perform the action.'], 'urn:ietf:params:xml:ns:xmpp-stanzas gone': ['302', 'modify', 'The recipient or server can no longer be contacted at this address.'], 'urn:ietf:params:xml:ns:xmpp-stanzas internal-server-error': ['500', 'wait', 'The server could not process the stanza because of a misconfiguration or an otherwise-undefined internal server error.'], 'urn:ietf:params:xml:ns:xmpp-stanzas item-not-found': ['404', 'cancel', 'The addressed JID or item requested cannot be found.'], 'urn:ietf:params:xml:ns:xmpp-stanzas jid-malformed': ['400', 'modify', "The value of the 'to' attribute in the sender's stanza does not adhere to the syntax defined in Addressing Scheme."], 'urn:ietf:params:xml:ns:xmpp-stanzas not-acceptable': ['406', 'cancel', 'The recipient or server understands the request but is refusing to process it because it does not meet criteria defined by the recipient or server.'], 'urn:ietf:params:xml:ns:xmpp-stanzas not-allowed': ['405', 'cancel', 'The recipient or server does not allow any entity to perform the action.'], 'urn:ietf:params:xml:ns:xmpp-stanzas not-authorized': ['401', 'auth', 'The sender must provide proper credentials before being allowed to perform the action, or has provided improper credentials.'], 'urn:ietf:params:xml:ns:xmpp-stanzas payment-required': ['402', 'auth', 'The requesting entity is not authorized to access the requested service because payment is required.'], 'urn:ietf:params:xml:ns:xmpp-stanzas recipient-unavailable': ['404', 'wait', 'The intended recipient is temporarily unavailable.'], 'urn:ietf:params:xml:ns:xmpp-stanzas redirect': ['302', 'modify', 'The recipient or server is redirecting requests for this information to another entity.'], 'urn:ietf:params:xml:ns:xmpp-stanzas registration-required': ['407', 'auth', 'The requesting entity is not authorized to access the requested service because registration is required.'], 'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-not-found': ['404', 'cancel', 'A remote server or service specified as part or all of the JID of the intended recipient does not exist.'], 'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-timeout': ['504', 'wait', 'A remote server or service specified as part or all of the JID of the intended recipient could not be contacted within a reasonable amount of time.'], 'urn:ietf:params:xml:ns:xmpp-stanzas resource-constraint': ['500', 'wait', 'The server or recipient lacks the system resources necessary to service the request.'], 'urn:ietf:params:xml:ns:xmpp-stanzas service-unavailable': ['503', 'cancel', 'The server or recipient does not currently provide the requested service.'], 'urn:ietf:params:xml:ns:xmpp-stanzas subscription-required': ['407', 'auth', 'The requesting entity is not authorized to access the requested service because a subscription is required.'], 'urn:ietf:params:xml:ns:xmpp-stanzas undefined-condition': ['500', '', 'Undefined Condition'], 'urn:ietf:params:xml:ns:xmpp-stanzas unexpected-request': ['400', 'wait', 'The recipient or server understood the request but was not expecting it at this time (e.g., the request was out of order).'], 'urn:ietf:params:xml:ns:xmpp-streams bad-format': ['', '', 'The entity has sent XML that cannot be processed.'], 'urn:ietf:params:xml:ns:xmpp-streams bad-namespace-prefix': ['', '', 'The entity has sent a namespace prefix that is unsupported, or has sent no namespace prefix on an element that requires such a prefix.'], 'urn:ietf:params:xml:ns:xmpp-streams conflict': ['', '', 'The server is closing the active stream for this entity because a new stream has been initiated that conflicts with the existing stream.'], 'urn:ietf:params:xml:ns:xmpp-streams connection-timeout': ['', '', 'The entity has not generated any traffic over the stream for some period of time.'], 'urn:ietf:params:xml:ns:xmpp-streams host-gone': ['', '', "The value of the 'to' attribute provided by the initiating entity in the stream header corresponds to a hostname that is no longer hosted by the server."], 'urn:ietf:params:xml:ns:xmpp-streams host-unknown': ['', '', "The value of the 'to' attribute provided by the initiating entity in the stream header does not correspond to a hostname that is hosted by the server."], 'urn:ietf:params:xml:ns:xmpp-streams improper-addressing': ['', '', "A stanza sent between two servers lacks a 'to' or 'from' attribute (or the attribute has no value)."], 'urn:ietf:params:xml:ns:xmpp-streams internal-server-error': ['', '', 'The server has experienced a misconfiguration or an otherwise-undefined internal error that prevents it from servicing the stream.'], 'urn:ietf:params:xml:ns:xmpp-streams invalid-from': ['cancel', '', "The JID or hostname provided in a 'from' address does not match an authorized JID or validated domain negotiated between servers via SASL or dialback, or between a client and a server via authentication and resource authorization."], 'urn:ietf:params:xml:ns:xmpp-streams invalid-id': ['', '', 'The stream ID or dialback ID is invalid or does not match an ID previously provided.'], 'urn:ietf:params:xml:ns:xmpp-streams invalid-namespace': ['', '', 'The streams namespace name is something other than "http://etherx.jabber.org/streams" or the dialback namespace name is something other than "jabber:server:dialback".'], 'urn:ietf:params:xml:ns:xmpp-streams invalid-xml': ['', '', 'The entity has sent invalid XML over the stream to a server that performs validation.'], 'urn:ietf:params:xml:ns:xmpp-streams not-authorized': ['', '', 'The entity has attempted to send data before the stream has been authenticated, or otherwise is not authorized to perform an action related to stream negotiation.'], 'urn:ietf:params:xml:ns:xmpp-streams policy-violation': ['', '', 'The entity has violated some local service policy.'], 'urn:ietf:params:xml:ns:xmpp-streams remote-connection-failed': ['', '', 'The server is unable to properly connect to a remote resource that is required for authentication or authorization.'], 'urn:ietf:params:xml:ns:xmpp-streams resource-constraint': ['', '', 'The server lacks the system resources necessary to service the stream.'], 'urn:ietf:params:xml:ns:xmpp-streams restricted-xml': ['', '', 'The entity has attempted to send restricted XML features such as a comment, processing instruction, DTD, entity reference, or unescaped character.'], 'urn:ietf:params:xml:ns:xmpp-streams see-other-host': ['', '', 'The server will not provide service to the initiating entity but is redirecting traffic to another host.'], 'urn:ietf:params:xml:ns:xmpp-streams system-shutdown': ['', '', 'The server is being shut down and all active streams are being closed.'], 'urn:ietf:params:xml:ns:xmpp-streams undefined-condition': ['', '', 'The error condition is not one of those defined by the other conditions in this list.'], 'urn:ietf:params:xml:ns:xmpp-streams unsupported-encoding': ['', '', 'The initiating entity has encoded the stream in an encoding that is not supported by the server.'], 'urn:ietf:params:xml:ns:xmpp-streams unsupported-stanza-type': ['', '', 'The initiating entity has sent a first-level child of the stream that is not supported by the server.'], 'urn:ietf:params:xml:ns:xmpp-streams unsupported-version': ['', '', "The value of the 'version' attribute provided by the initiating entity in the stream header specifies a version of XMPP that is not supported by the server."], 'urn:ietf:params:xml:ns:xmpp-streams xml-not-well-formed': ['', '', 'The initiating entity has sent XML that is not well-formed.'] } _errorcodes = { '302': 'redirect', '400': 'unexpected-request', '401': 'not-authorized', '402': 'payment-required', '403': 'forbidden', '404': 'remote-server-not-found', '405': 'not-allowed', '406': 'not-acceptable', '407': 'subscription-required', '409': 'conflict', '500': 'undefined-condition', '501': 'feature-not-implemented', '503': 'service-unavailable', '504': 'remote-server-timeout', 'cancel': 'invalid-from' } STREAM_NOT_AUTHORIZED = 'urn:ietf:params:xml:ns:xmpp-streams not-authorized' STREAM_REMOTE_CONNECTION_FAILED = 'urn:ietf:params:xml:ns:xmpp-streams remote-connection-failed' SASL_MECHANISM_TOO_WEAK = 'urn:ietf:params:xml:ns:xmpp-sasl mechanism-too-weak' STREAM_XML_NOT_WELL_FORMED = 'urn:ietf:params:xml:ns:xmpp-streams xml-not-well-formed' ERR_JID_MALFORMED = 'urn:ietf:params:xml:ns:xmpp-stanzas jid-malformed' STREAM_SEE_OTHER_HOST = 'urn:ietf:params:xml:ns:xmpp-streams see-other-host' STREAM_BAD_NAMESPACE_PREFIX = 'urn:ietf:params:xml:ns:xmpp-streams bad-namespace-prefix' ERR_SERVICE_UNAVAILABLE = 'urn:ietf:params:xml:ns:xmpp-stanzas service-unavailable' STREAM_CONNECTION_TIMEOUT = 'urn:ietf:params:xml:ns:xmpp-streams connection-timeout' STREAM_UNSUPPORTED_VERSION = 'urn:ietf:params:xml:ns:xmpp-streams unsupported-version' STREAM_IMPROPER_ADDRESSING = 'urn:ietf:params:xml:ns:xmpp-streams improper-addressing' STREAM_UNDEFINED_CONDITION = 'urn:ietf:params:xml:ns:xmpp-streams undefined-condition' SASL_NOT_AUTHORIZED = 'urn:ietf:params:xml:ns:xmpp-sasl not-authorized' ERR_GONE = 'urn:ietf:params:xml:ns:xmpp-stanzas gone' SASL_TEMPORARY_AUTH_FAILURE = 'urn:ietf:params:xml:ns:xmpp-sasl temporary-auth-failure' ERR_REMOTE_SERVER_NOT_FOUND = 'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-not-found' ERR_UNEXPECTED_REQUEST = 'urn:ietf:params:xml:ns:xmpp-stanzas unexpected-request' ERR_RECIPIENT_UNAVAILABLE = 'urn:ietf:params:xml:ns:xmpp-stanzas recipient-unavailable' ERR_CONFLICT = 'urn:ietf:params:xml:ns:xmpp-stanzas conflict' STREAM_SYSTEM_SHUTDOWN = 'urn:ietf:params:xml:ns:xmpp-streams system-shutdown' STREAM_BAD_FORMAT = 'urn:ietf:params:xml:ns:xmpp-streams bad-format' ERR_SUBSCRIPTION_REQUIRED = 'urn:ietf:params:xml:ns:xmpp-stanzas subscription-required' STREAM_INTERNAL_SERVER_ERROR = 'urn:ietf:params:xml:ns:xmpp-streams internal-server-error' ERR_NOT_AUTHORIZED = 'urn:ietf:params:xml:ns:xmpp-stanzas not-authorized' SASL_ABORTED = 'urn:ietf:params:xml:ns:xmpp-sasl aborted' ERR_REGISTRATION_REQUIRED = 'urn:ietf:params:xml:ns:xmpp-stanzas registration-required' ERR_INTERNAL_SERVER_ERROR = 'urn:ietf:params:xml:ns:xmpp-stanzas internal-server-error' SASL_INCORRECT_ENCODING = 'urn:ietf:params:xml:ns:xmpp-sasl incorrect-encoding' STREAM_HOST_GONE = 'urn:ietf:params:xml:ns:xmpp-streams host-gone' STREAM_POLICY_VIOLATION = 'urn:ietf:params:xml:ns:xmpp-streams policy-violation' STREAM_INVALID_XML = 'urn:ietf:params:xml:ns:xmpp-streams invalid-xml' STREAM_CONFLICT = 'urn:ietf:params:xml:ns:xmpp-streams conflict' STREAM_RESOURCE_CONSTRAINT = 'urn:ietf:params:xml:ns:xmpp-streams resource-constraint' STREAM_UNSUPPORTED_ENCODING = 'urn:ietf:params:xml:ns:xmpp-streams unsupported-encoding' ERR_NOT_ALLOWED = 'urn:ietf:params:xml:ns:xmpp-stanzas not-allowed' ERR_ITEM_NOT_FOUND = 'urn:ietf:params:xml:ns:xmpp-stanzas item-not-found' ERR_NOT_ACCEPTABLE = 'urn:ietf:params:xml:ns:xmpp-stanzas not-acceptable' STREAM_INVALID_FROM = 'urn:ietf:params:xml:ns:xmpp-streams invalid-from' ERR_FEATURE_NOT_IMPLEMENTED = 'urn:ietf:params:xml:ns:xmpp-stanzas feature-not-implemented' ERR_BAD_REQUEST = 'urn:ietf:params:xml:ns:xmpp-stanzas bad-request' STREAM_INVALID_ID = 'urn:ietf:params:xml:ns:xmpp-streams invalid-id' STREAM_HOST_UNKNOWN = 'urn:ietf:params:xml:ns:xmpp-streams host-unknown' ERR_UNDEFINED_CONDITION = 'urn:ietf:params:xml:ns:xmpp-stanzas undefined-condition' SASL_INVALID_MECHANISM = 'urn:ietf:params:xml:ns:xmpp-sasl invalid-mechanism' STREAM_RESTRICTED_XML = 'urn:ietf:params:xml:ns:xmpp-streams restricted-xml' ERR_RESOURCE_CONSTRAINT = 'urn:ietf:params:xml:ns:xmpp-stanzas resource-constraint' ERR_REMOTE_SERVER_TIMEOUT = 'urn:ietf:params:xml:ns:xmpp-stanzas remote-server-timeout' SASL_INVALID_AUTHZID = 'urn:ietf:params:xml:ns:xmpp-sasl invalid-authzid' ERR_PAYMENT_REQUIRED = 'urn:ietf:params:xml:ns:xmpp-stanzas payment-required' STREAM_INVALID_NAMESPACE = 'urn:ietf:params:xml:ns:xmpp-streams invalid-namespace' ERR_REDIRECT = 'urn:ietf:params:xml:ns:xmpp-stanzas redirect' STREAM_UNSUPPORTED_STANZA_TYPE = 'urn:ietf:params:xml:ns:xmpp-streams unsupported-stanza-type' ERR_FORBIDDEN = 'urn:ietf:params:xml:ns:xmpp-stanzas forbidden' def isResultNode(node): """ Return true if the node is a positive reply """ return node and node.getType() == 'result' def isErrorNode(node): """ Return true if the node is a negative reply """ return node and node.getType() == 'error' class NodeProcessed(Exception): """ Exception that should be raised by handler when the handling should be stopped """ pass class StreamError(Exception): """ Base exception class for stream errors """ pass class BadFormat(StreamError): pass class BadNamespacePrefix(StreamError): pass class Conflict(StreamError): pass class ConnectionTimeout(StreamError): pass class HostGone(StreamError): pass class HostUnknown(StreamError): pass class ImproperAddressing(StreamError): pass class InternalServerError(StreamError): pass class InvalidFrom(StreamError): pass class InvalidID(StreamError): pass class InvalidNamespace(StreamError): pass class InvalidXML(StreamError): pass class NotAuthorized(StreamError): pass class PolicyViolation(StreamError): pass class RemoteConnectionFailed(StreamError): pass class ResourceConstraint(StreamError): pass class RestrictedXML(StreamError): pass class SeeOtherHost(StreamError): pass class SystemShutdown(StreamError): pass class UndefinedCondition(StreamError): pass class UnsupportedEncoding(StreamError): pass class UnsupportedStanzaType(StreamError): pass class UnsupportedVersion(StreamError): pass class XMLNotWellFormed(StreamError): pass stream_exceptions = {'bad-format': BadFormat, 'bad-namespace-prefix': BadNamespacePrefix, 'conflict': Conflict, 'connection-timeout': ConnectionTimeout, 'host-gone': HostGone, 'host-unknown': HostUnknown, 'improper-addressing': ImproperAddressing, 'internal-server-error': InternalServerError, 'invalid-from': InvalidFrom, 'invalid-id': InvalidID, 'invalid-namespace': InvalidNamespace, 'invalid-xml': InvalidXML, 'not-authorized': NotAuthorized, 'policy-violation': PolicyViolation, 'remote-connection-failed': RemoteConnectionFailed, 'resource-constraint': ResourceConstraint, 'restricted-xml': RestrictedXML, 'see-other-host': SeeOtherHost, 'system-shutdown': SystemShutdown, 'undefined-condition': UndefinedCondition, 'unsupported-encoding': UnsupportedEncoding, 'unsupported-stanza-type': UnsupportedStanzaType, 'unsupported-version': UnsupportedVersion, 'xml-not-well-formed': XMLNotWellFormed} class JID(object): """ JID can be built from string, modified, compared, serialised into string """ def __init__(self, jid=None, node='', domain='', resource=''): """ JID can be specified as string (jid argument) or as separate parts Examples: JID('node@domain/resource') JID(node='node',domain='domain.org') """ if not jid and not domain: raise ValueError('JID must contain at least domain name') elif type(jid) == type(self): self.node, self.domain = jid.node, jid.domain self.resource = jid.resource elif domain: self.node, self.domain, self.resource = node, domain, resource else: if jid.find('@') + 1: self.node, jid = jid.split('@', 1) else: self.node = '' if jid.find('/')+1: self.domain, self.resource = jid.split('/', 1) else: self.domain, self.resource = jid, '' def getNode(self): """ Return the node part of the JID """ return self.node def setNode(self, node): """ Set the node part of the JID to new value. Specify None to remove the node part """ self.node = node.lower() def getDomain(self): """ Return the domain part of the JID """ return self.domain def setDomain(self, domain): """ Set the domain part of the JID to new value """ self.domain = domain.lower() def getResource(self): """ Return the resource part of the JID """ return self.resource def setResource(self, resource): """ Set the resource part of the JID to new value. Specify None to remove the resource part """ self.resource = resource def getStripped(self): """ Return the bare representation of JID. I.e. string value w/o resource """ return self.__str__(0) def __eq__(self, other): """ Compare the JID to another instance or to string for equality """ try: other = JID(other) except ValueError: return 0 return self.resource == other.resource and \ self.__str__(0) == other.__str__(0) def __ne__(self, other): """ Compare the JID to another instance or to string for non-equality """ return not self.__eq__(other) def bareMatch(self, other): """ Compare the node and domain parts of the JID's for equality """ return self.__str__(0) == JID(other).__str__(0) def __str__(self, wresource=1): """ Serialise JID into string """ if self.node: jid = self.node + '@' + self.domain else: jid = self.domain if wresource and self.resource: return jid + '/' + self.resource return jid def __hash__(self): """ Produce hash of the JID, Allows to use JID objects as keys of the dictionary """ return hash(str(self)) class BOSHBody(Node): """ tag that wraps usual XMPP stanzas in XMPP over BOSH """ def __init__(self, attrs=None, payload=None, node=None): Node.__init__(self, tag='body', attrs=attrs, payload=payload, node=node) self.setNamespace(NS_HTTP_BIND) class Protocol(Node): """ A "stanza" object class. Contains methods that are common for presences, iqs and messages """ def __init__(self, name=None, to=None, typ=None, frm=None, attrs=None, payload=None, timestamp=None, xmlns=None, node=None): """ Constructor, name is the name of the stanza i.e. 'message' or 'presence'or 'iq' to is the value of 'to' attribure, 'typ' - 'type' attribute frn - from attribure, attrs - other attributes mapping, payload - same meaning as for simplexml payload definition timestamp - the time value that needs to be stamped over stanza xmlns - namespace of top stanza node node - parsed or unparsed stana to be taken as prototype. """ if not attrs: attrs = {} if to: attrs['to'] = to if frm: attrs['from'] = frm if typ: attrs['type'] = typ Node.__init__(self, tag=name, attrs=attrs, payload=payload, node=node) if not node and xmlns: self.setNamespace(xmlns) if self['to']: self.setTo(self['to']) if self['from']: self.setFrom(self['from']) if node and type(self) == type(node) and \ self.__class__ == node.__class__ and 'id' in self.attrs: del self.attrs['id'] self.timestamp = None for d in self.getTags('delay', namespace=NS_DELAY2): try: if d.getAttr('stamp') < self.getTimestamp2(): self.setTimestamp(d.getAttr('stamp')) except Exception: pass if not self.timestamp: for x in self.getTags('x', namespace=NS_DELAY): try: if x.getAttr('stamp') < self.getTimestamp(): self.setTimestamp(x.getAttr('stamp')) except Exception: pass if timestamp is not None: self.setTimestamp(timestamp) # To auto-timestamp stanza just pass timestamp='' def getTo(self): """ Return value of the 'to' attribute """ try: return self['to'] except: return None def getFrom(self): """ Return value of the 'from' attribute """ try: return self['from'] except: return None def getTimestamp(self): """ Return the timestamp in the 'yyyymmddThhmmss' format """ if self.timestamp: return self.timestamp return time.strftime('%Y%m%dT%H:%M:%S', time.gmtime()) def getTimestamp2(self): """ Return the timestamp in the 'yyyymmddThhmmss' format """ if self.timestamp: return self.timestamp return time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()) def getJid(self): """ Return the value of the 'jid' attribute """ attr = self.getAttr('jid') if attr: return JID(attr) return attr def getID(self): """ Return the value of the 'id' attribute """ return self.getAttr('id') def setTo(self, val): """ Set the value of the 'to' attribute """ self.setAttr('to', JID(val)) def getType(self): """ Return the value of the 'type' attribute """ return self.getAttr('type') def setFrom(self, val): """ Set the value of the 'from' attribute """ self.setAttr('from', JID(val)) def setType(self, val): """ Set the value of the 'type' attribute """ self.setAttr('type', val) def setID(self, val): """ Set the value of the 'id' attribute """ self.setAttr('id', val) def getError(self): """ Return the error-condition (if present) or the textual description of the error (otherwise) """ errtag = self.getTag('error') if errtag: for tag in errtag.getChildren(): if tag.getName() != 'text': return tag.getName() return errtag.getData() def getErrorMsg(self): """ Return the textual description of the error (if present) or the error condition """ errtag = self.getTag('error') if errtag: for tag in errtag.getChildren(): if tag.getName() == 'text': return tag.getData() return self.getError() def getErrorCode(self): """ Return the error code. Obsolete. """ return self.getTagAttr('error', 'code') def getStatusConditions(self): """ Return the status conditions list as defined in XEP-0306. """ conds = [] condtag = self.getTag('conditions', namespace=NS_CONDITIONS) if condtag: for tag in condtag.getChildren(): conds.append(tag.getName()) return conds def setError(self, error, code=None): """ Set the error code. Obsolete. Use error-conditions instead """ if code: if str(code) in _errorcodes.keys(): error = ErrorNode(_errorcodes[str(code)], text=error) else: error = ErrorNode(ERR_UNDEFINED_CONDITION, code=code, typ='cancel', text=error) elif type(error) == str: error=ErrorNode(error) self.setType('error') self.addChild(node=error) def setTimestamp(self, val=None): """ Set the timestamp. timestamp should be the yyyymmddThhmmss string """ if not val: val = time.strftime('%Y%m%dT%H:%M:%S', time.gmtime()) self.timestamp=val self.setTag('x', {'stamp': self.timestamp}, namespace=NS_DELAY) def getProperties(self): """ Return the list of namespaces to which belongs the direct childs of element """ props = [] for child in self.getChildren(): prop = child.getNamespace() if prop not in props: props.append(prop) return props def getTag(self, name, attrs=None, namespace=None, protocol=False): """ Return the Node instance for the tag. If protocol is True convert to a new Protocol/Message instance. """ tag = Node.getTag(self, name, attrs, namespace) if protocol and tag: if name == 'message': return Message(node=tag) else: return Protocol(node=tag) return tag def __setitem__(self, item, val): """ Set the item 'item' to the value 'val' """ if item in ['to', 'from']: val = JID(val) return self.setAttr(item, val) class Message(Protocol): """ XMPP Message stanza - "push" mechanism """ def __init__(self, to=None, body=None, xhtml=None, typ=None, subject=None, attrs=None, frm=None, payload=None, timestamp=None, xmlns=NS_CLIENT, node=None): """ You can specify recipient, text of message, type of message any additional attributes, sender of the message, any additional payload (f.e. jabber:x:delay element) and namespace in one go. Alternatively you can pass in the other XML object as the 'node' parameted to replicate it as message """ Protocol.__init__(self, 'message', to=to, typ=typ, attrs=attrs, frm=frm, payload=payload, timestamp=timestamp, xmlns=xmlns, node=node) if body: self.setBody(body) if xhtml: self.setXHTML(xhtml) if subject is not None: self.setSubject(subject) def getBody(self): """ Return text of the message """ return self.getTagData('body') def getXHTML(self, xmllang=None): """ Return serialized xhtml-im element text of the message TODO: Returning a DOM could make rendering faster. """ xhtml = self.getTag('html') if xhtml: if xmllang: body = xhtml.getTag('body', attrs={'xml:lang': xmllang}) else: body = xhtml.getTag('body') return str(body) return None def getSubject(self): """ Return subject of the message """ return self.getTagData('subject') def getThread(self): """ Return thread of the message """ return self.getTagData('thread') def getOriginID(self): """ Return origin-id of the message """ return self.getTagAttr('origin-id', namespace=NS_SID, attr='id') def getStanzaIDAttrs(self): """ Return the stanza-id attributes of the message """ try: attrs = self.getTag('stanza-id', namespace=NS_SID).getAttrs() except Exception: return None, None return attrs['id'], attrs['by'] def setBody(self, val): """ Set the text of the message""" self.setTagData('body', val) def setXHTML(self, val, xmllang=None): """ Sets the xhtml text of the message (XEP-0071). The parameter is the "inner html" to the body. """ try: if xmllang: dom = NodeBuilder('%s' \ % (NS_XHTML, xmllang, val)).getDom() else: dom = NodeBuilder('%s' % (NS_XHTML, val), 0).getDom() if self.getTag('html'): self.getTag('html').addChild(node=dom) else: self.setTag('html', namespace=NS_XHTML_IM).addChild(node=dom) except Exception as e: print("Error" + str(e)) # FIXME: log. we could not set xhtml (parse error, whatever) def setSubject(self, val): """ Set the subject of the message """ self.setTagData('subject', val) def setThread(self, val): """ Set the thread of the message """ self.setTagData('thread', val) def setOriginID(self, val): """ Sets the origin-id of the message """ self.setTag('origin-id', namespace=NS_SID, attrs={'id': val}) def buildReply(self, text=None): """ Builds and returns another message object with specified text. The to, from, thread and type properties of new message are pre-set as reply to this message """ m = Message(to=self.getFrom(), frm=self.getTo(), body=text, typ=self.getType()) th = self.getThread() if th: m.setThread(th) return m def getStatusCode(self): """ Return the status code of the message (for groupchat config change) """ attrs = [] for xtag in self.getTags('x'): for child in xtag.getTags('status'): attrs.append(child.getAttr('code')) return attrs class Presence(Protocol): def __init__(self, to=None, typ=None, priority=None, show=None, status=None, attrs=None, frm=None, timestamp=None, payload=None, xmlns=NS_CLIENT, node=None): """ You can specify recipient, type of message, priority, show and status values any additional attributes, sender of the presence, timestamp, any additional payload (f.e. jabber:x:delay element) and namespace in one go. Alternatively you can pass in the other XML object as the 'node' parameted to replicate it as presence """ Protocol.__init__(self, 'presence', to=to, typ=typ, attrs=attrs, frm=frm, payload=payload, timestamp=timestamp, xmlns=xmlns, node=node) if priority: self.setPriority(priority) if show: self.setShow(show) if status: self.setStatus(status) def getPriority(self): """ Return the priority of the message """ return self.getTagData('priority') def getShow(self): """ Return the show value of the message """ return self.getTagData('show') def getStatus(self): """ Return the status string of the message """ return self.getTagData('status') def setPriority(self, val): """ Set the priority of the message """ self.setTagData('priority', val) def setShow(self, val): """ Set the show value of the message """ self.setTagData('show', val) def setStatus(self, val): """ Set the status string of the message """ self.setTagData('status', val) def _muc_getItemAttr(self, tag, attr): for xtag in self.getTags('x'): if xtag.getNamespace() not in (NS_MUC_USER, NS_MUC_ADMIN): continue for child in xtag.getTags(tag): return child.getAttr(attr) def _muc_getSubTagDataAttr(self, tag, attr): for xtag in self.getTags('x'): if xtag.getNamespace() not in (NS_MUC_USER, NS_MUC_ADMIN): continue for child in xtag.getTags('item'): for cchild in child.getTags(tag): return cchild.getData(), cchild.getAttr(attr) return None, None def getRole(self): """ Return the presence role (for groupchat) """ return self._muc_getItemAttr('item', 'role') def getAffiliation(self): """ Return the presence affiliation (for groupchat) """ return self._muc_getItemAttr('item', 'affiliation') def getNewNick(self): """ Return the status code of the presence (for groupchat) """ return self._muc_getItemAttr('item', 'nick') def getJid(self): """ Return the presence jid (for groupchat) """ return self._muc_getItemAttr('item', 'jid') def getReason(self): """ Returns the reason of the presence (for groupchat) """ return self._muc_getSubTagDataAttr('reason', '')[0] def getActor(self): """ Return the reason of the presence (for groupchat) """ return self._muc_getSubTagDataAttr('actor', 'jid')[1] def getStatusCode(self): """ Return the status code of the presence (for groupchat) """ attrs = [] for xtag in self.getTags('x'): for child in xtag.getTags('status'): attrs.append(child.getAttr('code')) return attrs class Iq(Protocol): """ XMPP Iq object - get/set dialog mechanism """ def __init__(self, typ=None, queryNS=None, attrs=None, to=None, frm=None, payload=None, xmlns=NS_CLIENT, node=None): """ You can specify type, query namespace any additional attributes, recipient of the iq, sender of the iq, any additional payload (f.e. jabber:x:data node) and namespace in one go. Alternatively you can pass in the other XML object as the 'node' parameted to replicate it as an iq """ Protocol.__init__(self, 'iq', to=to, typ=typ, attrs=attrs, frm=frm, xmlns=xmlns, node=node) if payload: self.setQueryPayload(payload) if queryNS: self.setQueryNS(queryNS) def getQuery(self): """ Return the IQ's child element if it exists, None otherwise. """ children = self.getChildren() if children and self.getType() != 'error' and \ children[0].getName() != 'error': return children[0] def getQueryNS(self): """ Return the namespace of the 'query' child element """ tag = self.getQuery() if tag: return tag.getNamespace() def getQuerynode(self): """ Return the 'node' attribute value of the 'query' child element """ tag = self.getQuery() if tag: return tag.getAttr('node') def getQueryPayload(self): """ Return the 'query' child element payload """ tag = self.getQuery() if tag: return tag.getPayload() def getQueryChildren(self): """ Return the 'query' child element child nodes """ tag = self.getQuery() if tag: return tag.getChildren() def setQuery(self, name=None): """ Change the name of the query node, creating it if needed. Keep the existing name if none is given (use 'query' if it's a creation). Return the query node. """ query = self.getQuery() if query is None: query = self.addChild('query') if name is not None: query.setName(name) return query def setQueryNS(self, namespace): """ Set the namespace of the 'query' child element """ self.setQuery().setNamespace(namespace) def setQueryPayload(self, payload): """ Set the 'query' child element payload """ self.setQuery().setPayload(payload) def setQuerynode(self, node): """ Set the 'node' attribute value of the 'query' child element """ self.setQuery().setAttr('node', node) def buildReply(self, typ): """ Build and return another Iq object of specified type. The to, from and query child node of new Iq are pre-set as reply to this Iq. """ iq = Iq(typ, to=self.getFrom(), frm=self.getTo(), attrs={'id': self.getID()}) iq.setQuery(self.getQuery().getName()).setNamespace(self.getQueryNS()) return iq class Hashes(Node): """ Hash elements for various XEPs as defined in XEP-300 """ """ RECOMENDED HASH USE: Algorithm Support MD2 MUST NOT MD4 MUST NOT MD5 MAY SHA-1 MUST SHA-256 MUST SHA-512 SHOULD """ supported = ('md5', 'sha-1', 'sha-256', 'sha-512') def __init__(self, nsp=NS_HASHES): Node.__init__(self, None, {}, [], None, None, False, None) self.setNamespace(nsp) self.setName('hash') def calculateHash(self, algo, file_string): """ Calculate the hash and add it. It is preferable doing it here instead of doing it all over the place in Gajim. """ hl = None hash_ = None # file_string can be a string or a file if type(file_string) == str: # if it is a string if algo == 'sha-1': hl = hashlib.sha1() elif algo == 'md5': hl = hashlib.md5() elif algo == 'sha-256': hl = hashlib.sha256() elif algo == 'sha-512': hl = hashlib.sha512() if hl: hl.update(file_string) hash_ = hl.hexdigest() else: # if it is a file if algo == 'sha-1': hl = hashlib.sha1() elif algo == 'md5': hl = hashlib.md5() elif algo == 'sha-256': hl = hashlib.sha256() elif algo == 'sha-512': hl = hashlib.sha512() if hl: for line in file_string: hl.update(line) hash_ = hl.hexdigest() return hash_ def addHash(self, hash_, algo): self.setAttr('algo', algo) self.setData(hash_) class Hashes2(Node): """ Hash elements for various XEPs as defined in XEP-300 """ """ RECOMENDED HASH USE: Algorithm Support MD2 MUST NOT MD4 MUST NOT MD5 MUST NOT SHA-1 SHOULD NOT SHA-256 MUST SHA-512 SHOULD SHA3-256 MUST SHA3-512 SHOULD BLAKE2b256 MUST BLAKE2b512 SHOULD """ supported = ('sha-256', 'sha-512', 'sha3-256', 'sha3-512', 'blake2b-256', 'blake2b-512') def __init__(self, nsp=NS_HASHES_2): Node.__init__(self, None, {}, [], None, None, False, None) self.setNamespace(nsp) self.setName('hash') def calculateHash(self, algo, file_string): """ Calculate the hash and add it. It is preferable doing it here instead of doing it all over the place in Gajim. """ hl = None hash_ = None if algo == 'sha-256': hl = hashlib.sha256() elif algo == 'sha-512': hl = hashlib.sha512() elif algo == 'sha3-256': hl = hashlib.sha3_256() elif algo == 'sha3-512': hl = hashlib.sha3_512() elif algo == 'blake2b-256': hl = hashlib.blake2b(digest_size=32) elif algo == 'blake2b-512': hl = hashlib.blake2b(digest_size=64) # file_string can be a string or a file if hl is not None: if isinstance(file_string, bytes): hl.update(file_string) else: # if it is a file for line in file_string: hl.update(line) hash_ = b64encode(hl.digest()).decode('ascii') return hash_ def addHash(self, hash_, algo): self.setAttr('algo', algo) self.setData(hash_) class Acks(Node): """ Acknowledgement elements for Stream Management """ def __init__(self, nsp=NS_STREAM_MGMT): Node.__init__(self, None, {}, [], None, None, False, None) self.setNamespace(nsp) def buildAnswer(self, handled): """ handled is the number of stanzas handled """ self.setName('a') self.setAttr('h', handled) def buildRequest(self): self.setName('r') def buildEnable(self, resume=False): self.setName('enable') if resume: self.setAttr('resume', 'true') def buildResume(self, handled, previd): self.setName('resume') self.setAttr('h', handled) self.setAttr('previd', previd) class ErrorNode(Node): """ XMPP-style error element In the case of stanza error should be attached to XMPP stanza. In the case of stream-level errors should be used separately. """ def __init__(self, name, code=None, typ=None, text=None): """ Mandatory parameter: name - name of error condition. Optional parameters: code, typ, text. Used for backwards compartibility with older jabber protocol. """ if name in ERRORS: cod, type_, txt = ERRORS[name] ns = name.split()[0] else: cod, ns, type_, txt = '500', NS_STANZAS, 'cancel', '' if typ: type_ = typ if code: cod = code if text: txt = text Node.__init__(self, 'error', {}, [Node(name)]) if type_: self.setAttr('type', type_) if not cod: self.setName('stream:error') if txt: self.addChild(node=Node(ns + ' text', {}, [txt])) if cod: self.setAttr('code', cod) class Error(Protocol): """ Used to quickly transform received stanza into error reply """ def __init__(self, node, error, reply=1): """ Create error reply basing on the received 'node' stanza and the 'error' error condition If the 'node' is not the received stanza but locally created ('to' and 'from' fields needs not swapping) specify the 'reply' argument as false. """ if reply: Protocol.__init__(self, to=node.getFrom(), frm=node.getTo(), node=node) else: Protocol.__init__(self, node=node) self.setError(error) if node.getType() == 'error': self.__str__ = self.__dupstr__ def __dupstr__(self, dup1=None, dup2=None): """ Dummy function used as preventor of creating error node in reply to error node. I.e. you will not be able to serialise "double" error into string. """ return '' class DataField(Node): """ This class is used in the DataForm class to describe the single data item If you are working with jabber:x:data (XEP-0004, XEP-0068, XEP-0122) then you will need to work with instances of this class. """ def __init__(self, name=None, value=None, typ=None, required=0, desc=None, options=None, node=None): """ Create new data field of specified name,value and type Also 'required','desc' and 'options' fields can be set. Alternatively other XML object can be passed in as the 'node' parameted to replicate it as a new datafiled. """ Node.__init__(self, 'field', node=node) if name: self.setVar(name) if isinstance(value, (list, tuple)): self.setValues(value) elif value: self.setValue(value) if typ: self.setType(typ) elif not typ and not node: self.setType('text-single') if required: self.setRequired(required) if desc: self.setDesc(desc) if options: self.setOptions(options) def setRequired(self, req=1): """ Change the state of the 'required' flag """ if req: self.setTag('required') else: try: self.delChild('required') except ValueError: return def isRequired(self): """ Return in this field a required one """ return self.getTag('required') def setDesc(self, desc): """ Set the description of this field """ self.setTagData('desc', desc) def getDesc(self): """ Return the description of this field """ return self.getTagData('desc') def setValue(self, val): """ Set the value of this field """ self.setTagData('value', val) def getValue(self): return self.getTagData('value') def setValues(self, lst): """ Set the values of this field as values-list. Replaces all previous filed values! If you need to just add a value - use addValue method """ while self.getTag('value'): self.delChild('value') for val in lst: self.addValue(val) def addValue(self, val): """ Add one more value to this field. Used in 'get' iq's or such """ self.addChild('value', {}, [val]) def getValues(self): """ Return the list of values associated with this field """ ret = [] for tag in self.getTags('value'): ret.append(tag.getData()) return ret def getOptions(self): """ Return label-option pairs list associated with this field """ ret = [] for tag in self.getTags('option'): ret.append([tag.getAttr('label'), tag.getTagData('value')]) return ret def setOptions(self, lst): """ Set label-option pairs list associated with this field """ while self.getTag('option'): self.delChild('option') for opt in lst: self.addOption(opt) def addOption(self, opt): """ Add one more label-option pair to this field """ if isinstance(opt, list): self.addChild('option', {'label': opt[0]}).setTagData('value', opt[1]) else: self.addChild('option').setTagData('value', opt) def getType(self): """ Get type of this field """ return self.getAttr('type') def setType(self, val): """ Set type of this field """ return self.setAttr('type', val) def getVar(self): """ Get 'var' attribute value of this field """ return self.getAttr('var') def setVar(self, val): """ Set 'var' attribute value of this field """ return self.setAttr('var', val) class DataForm(Node): """ Used for manipulating dataforms in XMPP Relevant XEPs: 0004, 0068, 0122. Can be used in disco, pub-sub and many other applications. """ def __init__(self, typ=None, data=None, title=None, node=None): """ Create new dataform of type 'typ'. 'data' is the list of DataField instances that this dataform contains, 'title' - the title string. You can specify the 'node' argument as the other node to be used as base for constructing this dataform title and instructions is optional and SHOULD NOT contain newlines. Several instructions MAY be present. 'typ' can be one of ('form' | 'submit' | 'cancel' | 'result' ) 'typ' of reply iq can be ( 'result' | 'set' | 'set' | 'result' ) respectively. 'cancel' form can not contain any fields. All other forms contains AT LEAST one field. 'title' MAY be included in forms of type "form" and "result" """ Node.__init__(self, 'x', node=node) if node: newkids = [] for n in self.getChildren(): if n.getName() == 'field': newkids.append(DataField(node=n)) else: newkids.append(n) self.kids = newkids if typ: self.setType(typ) self.setNamespace(NS_DATA) if title: self.setTitle(title) if data is not None: if isinstance(data, dict): newdata = [] for name in data.keys(): newdata.append(DataField(name, data[name])) data = newdata for child in data: if child.__class__.__name__ == 'DataField': self.kids.append(child) elif isinstance(child, Node): self.kids.append(DataField(node=child)) else: # Must be a string self.addInstructions(child) def getType(self): """ Return the type of dataform """ return self.getAttr('type') def setType(self, typ): """ Set the type of dataform """ self.setAttr('type', typ) def getTitle(self): """ Return the title of dataform """ return self.getTagData('title') def setTitle(self, text): """ Set the title of dataform """ self.setTagData('title', text) def getInstructions(self): """ Return the instructions of dataform """ return self.getTagData('instructions') def setInstructions(self, text): """ Set the instructions of dataform """ self.setTagData('instructions', text) def addInstructions(self, text): """ Add one more instruction to the dataform """ self.addChild('instructions', {}, [text]) def getField(self, name): """ Return the datafield object with name 'name' (if exists) """ return self.getTag('field', attrs={'var': name}) def setField(self, name): """ Create if nessessary or get the existing datafield object with name 'name' and return it """ f = self.getField(name) if f: return f return self.addChild(node=DataField(name)) def asDict(self): """ Represent dataform as simple dictionary mapping of datafield names to their values """ ret = {} for field in self.getTags('field'): name = field.getAttr('var') typ = field.getType() if typ and typ.endswith('-multi'): val = [] for i in field.getTags('value'): val.append(i.getData()) else: val = field.getTagData('value') ret[name] = val if self.getTag('instructions'): ret['instructions'] = self.getInstructions() return ret def __getitem__(self, name): """ Simple dictionary interface for getting datafields values by their names """ item = self.getField(name) if item: return item.getValue() raise IndexError('No such field') def __setitem__(self, name, val): """ Simple dictionary interface for setting datafields values by their names """ return self.setField(name).setValue(val) python-nbxmpp-nbxmpp-0.6.10/nbxmpp/proxy_connectors.py000066400000000000000000000223541343257752000232350ustar00rootroot00000000000000## proxy_connectors.py ## based on transports_nb.py ## ## Copyright (C) 2003-2004 Alexey "Snake" Nezhdanov ## modified by Dimitur Kirov ## modified by Tomas Karasek ## ## 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. """ Module containing classes for proxy connecting. So far its HTTP CONNECT and SOCKS5 proxy Authentication to NTLM (Microsoft implementation) proxies can be next. """ import struct, socket from base64 import b64encode import logging log = logging.getLogger('nbxmpp.proxy_connectors') class ProxyConnector(object): """ Interface for proxy-connecting object - when tunnneling XMPP over proxies, some connecting process usually has to be done before opening stream. Proxy connectors are used right after TCP connection is estabilished """ def __init__(self, send_method, onreceive, old_on_receive, on_success, on_failure, xmpp_server, proxy_creds=(None, None)): """ Creates proxy connector, starts connecting immediately and gives control back to transport afterwards :param send_method: transport send method :param onreceive: method to set on_receive callbacks :param old_on_receive: on_receive callback that should be set when proxy connection was successful :param on_success: called after proxy connection was successfully opened :param on_failure: called when errors occured while connecting :param xmpp_server: tuple of (hostname, port) :param proxy_creds: tuple of (proxy_user, proxy_credentials) """ self.send = send_method self.onreceive = onreceive self.old_on_receive = old_on_receive self.on_success = on_success self.on_failure = on_failure self.xmpp_server = xmpp_server self.proxy_user, self.proxy_pass = proxy_creds self.old_on_receive = old_on_receive self.start_connecting() @classmethod def get_instance(cls, *args, **kwargs): """ Factory Method for object creation Use this instead of directly initializing the class in order to make unit testing much easier. """ return cls(*args, **kwargs) def start_connecting(self): raise NotImplementedError def connecting_over(self): self.onreceive(self.old_on_receive) self.on_success() class HTTPCONNECTConnector(ProxyConnector): def start_connecting(self): """ Connect to a proxy, supply login and password to it (if were specified while creating instance). Instruct proxy to make connection to the target server. """ log.info('Proxy server contacted, performing authentification') connector = ['CONNECT %s:%s HTTP/1.1' % self.xmpp_server, 'Proxy-Connection: Keep-Alive', 'Pragma: no-cache', 'Host: %s:%s' % self.xmpp_server, 'User-Agent: Gajim'] if self.proxy_user and self.proxy_pass: credentials = '%s:%s' % (self.proxy_user, self.proxy_pass) credentials = b64encode(credentials.encode('utf-8')).decode( 'utf-8').strip() connector.append('Proxy-Authorization: Basic '+credentials) connector.append('\r\n') self.onreceive(self._on_headers_sent) self.send('\r\n'.join(connector)) def _on_headers_sent(self, reply): if reply is None: return self.reply = reply.replace('\r', '') try: proto, code, desc = reply.split('\n')[0].split(' ', 2) except: log.error("_on_headers_sent:", exc_info=True) #traceback.print_exc() self.on_failure('Invalid proxy reply') return if code != '200': log.error('Invalid proxy reply: %s %s %s' % (proto, code, desc)) self.on_failure('Invalid proxy reply') return if len(reply) != 2: pass self.connecting_over() class SOCKS5Connector(ProxyConnector): """ SOCKS5 proxy connection class. Allows to use SOCKS5 proxies with (optionally) simple authentication (only USERNAME/PASSWORD auth) """ def start_connecting(self): log.info('Proxy server contacted, performing authentification') if self.proxy_user and self.proxy_pass: to_send = b'\x05\x02\x00\x02' else: to_send = b'\x05\x01\x00' self.onreceive(self._on_greeting_sent) self.send(to_send) def _to_int(self, c): if type(c) == str: # py2 return ord(c) return c # py3 def _on_greeting_sent(self, reply): if reply is None: return if len(reply) != 2: self.on_failure('Invalid proxy reply') return if self._to_int(reply[0]) != 5: log.info('Invalid proxy reply') self.on_failure('Invalid proxy reply') return if self._to_int(reply[1]) == 0: return self._on_proxy_auth('\x01\x00') elif self._to_int(reply[1]) == 2: to_send = '\x01' + chr(len(self.proxy_user)) + self.proxy_user +\ chr(len(self.proxy_pass)) + self.proxy_pass self.onreceive(self._on_proxy_auth) self.send(to_send) else: if self._to_int(reply[1]) == 255: log.error('Authentification to proxy impossible: no acceptable ' 'auth method') self.on_failure('Authentification to proxy impossible: no ' 'acceptable authentification method') return log.error('Invalid proxy reply') self.on_failure('Invalid proxy reply') return def _on_proxy_auth(self, reply): if reply is None: return if len(reply) != 2: log.error('Invalid proxy reply') self.on_failure('Invalid proxy reply') return if reply[0] != '\x01': log.error('Invalid proxy reply') self.on_failure('Invalid proxy reply') return if reply[1] != '\x00': log.error('Authentification to proxy failed') self.on_failure('Authentification to proxy failed') return log.info('Authentification successfull. Jabber server contacted.') # Request connection req = b'\x05\x01\x00' # If the given destination address is an IP address, we'll # use the IPv4 address request even if remote resolving was specified. try: self.ipaddr = socket.inet_aton(self.xmpp_server[0]) req = req + b'\x01' + self.ipaddr except socket.error: # Well it's not an IP number, so it's probably a DNS name. # if self.__proxy[3]==True: # Resolve remotely self.ipaddr = None req = req + b'\x03' + (chr(len(self.xmpp_server[0])) + self.xmpp_server[0]).encode('utf-8') # else: # # Resolve locally # self.ipaddr = socket.inet_aton(socket.gethostbyname(self.xmpp_server[0])) # req = req + "\x01" + ipaddr req += struct.pack(">H", self.xmpp_server[1]) self.onreceive(self._on_req_sent) self.send(req) def _on_req_sent(self, reply): if reply is None: return if len(reply) < 10: log.error('Invalid proxy reply') self.on_failure('Invalid proxy reply') return if self._to_int(reply[0]) != 5: log.error('Invalid proxy reply') self.on_failure('Invalid proxy reply') return if self._to_int(reply[1]) != 0: # Connection failed if self._to_int(reply[1]) < 9: errors = ['general SOCKS server failure', 'connection not allowed by ruleset', 'Network unreachable', 'Host unreachable', 'Connection refused', 'TTL expired', 'Command not supported', 'Address type not supported' ] txt = errors[self._to_int(reply[1])-1] else: txt = 'Invalid proxy reply' log.error(txt) self.on_failure(txt) return # Get the bound address/port elif self._to_int(reply[3]) == 1: begin, end = 3, 7 elif self._to_int(reply[3]) == 3: begin, end = 4, 4 + self._to_int(reply[4]) elif self._to_int(reply[3]) == 4: begin, end = 3, 19 else: log.error('Invalid proxy reply') self.on_failure('Invalid proxy reply') return self.connecting_over() python-nbxmpp-nbxmpp-0.6.10/nbxmpp/roster_nb.py000066400000000000000000000313641343257752000216150ustar00rootroot00000000000000## roster_nb.py ## based on roster.py ## ## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov ## modified by Dimitur Kirov ## ## 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. # $Id: roster.py,v 1.17 2005/05/02 08:38:49 snakeru Exp $ """ Simple roster implementation. Can be used though for different tasks like mass-renaming of contacts. """ from .protocol import JID, Iq, Presence, Node, NodeProcessed, NS_MUC_USER, NS_ROSTER from .plugin import PlugIn import logging log = logging.getLogger('nbxmpp.roster_nb') class NonBlockingRoster(PlugIn): """ Defines a plenty of methods that will allow you to manage roster. Also automatically track presences from remote JIDs taking into account that every JID can have multiple resources connected. Does not currently support 'error' presences. You can also use mapping interface for access to the internal representation of contacts in roster """ def __init__(self, version=None): """ Init internal variables """ PlugIn.__init__(self) self.version = version self._data = {} self._set=None self._exported_methods=[self.getRoster] self.received_from_server = False def Request(self, force=0): """ Request roster from server if it were not yet requested (or if the 'force' argument is set) """ if self._set is None: self._set = 0 elif not force: return iq = Iq('get', NS_ROSTER) if self.version is not None: iq.setTagAttr('query', 'ver', self.version) id_ = self._owner.getAnID() iq.setID(id_) self._owner.send(iq) log.info('Roster requested from server') return id_ def RosterIqHandler(self, dis, stanza): """ Subscription tracker. Used internally for setting items state in internal roster representation """ sender = stanza.getAttr('from') if sender is not None and not sender.bareMatch( self._owner.User + '@' + self._owner.Server): return query = stanza.getTag('query') if query: self.received_from_server = True self.version = stanza.getTagAttr('query', 'ver') if self.version is None: self.version = '' for item in query.getTags('item'): jid=item.getAttr('jid') if item.getAttr('subscription')=='remove': if jid in self._data: del self._data[jid] # Looks like we have a workaround # raise NodeProcessed # a MUST log.info('Setting roster item %s...' % jid) if jid not in self._data: self._data[jid]={} self._data[jid]['name']=item.getAttr('name') self._data[jid]['ask']=item.getAttr('ask') self._data[jid]['subscription']=item.getAttr('subscription') self._data[jid]['groups']=[] if 'resources' not in self._data[jid]: self._data[jid]['resources']={} for group in item.getTags('group'): if group.getData() not in self._data[jid]['groups']: self._data[jid]['groups'].append(group.getData()) self._data[self._owner.User+'@'+self._owner.Server]={'resources': {}, 'name': None, 'ask': None, 'subscription': None, 'groups': None,} self._set=1 # Looks like we have a workaround # raise NodeProcessed # a MUST. Otherwise you'll get back an def PresenceHandler(self, dis, pres): """ Presence tracker. Used internally for setting items' resources state in internal roster representation """ if pres.getTag('x', namespace=NS_MUC_USER): return jid=pres.getFrom() if not jid: # If no from attribue, it's from server jid=self._owner.Server jid=JID(jid) if jid.getStripped() not in self._data: self._data[jid.getStripped()]={'name':None,'ask':None,'subscription':'none','groups':['Not in roster'],'resources':{}} if type(self._data[jid.getStripped()]['resources'])!=type(dict()): self._data[jid.getStripped()]['resources']={} item=self._data[jid.getStripped()] typ=pres.getType() if not typ: log.info('Setting roster item %s for resource %s...'%(jid.getStripped(), jid.getResource())) item['resources'][jid.getResource()]=res={'show':None,'status':None,'priority':'0','timestamp':None} if pres.getTag('show'): res['show']=pres.getShow() if pres.getTag('status'): res['status']=pres.getStatus() if pres.getTag('priority'): res['priority']=pres.getPriority() if not pres.getTimestamp(): pres.setTimestamp() res['timestamp']=pres.getTimestamp() elif typ=='unavailable' and jid.getResource() in item['resources']: del item['resources'][jid.getResource()] # Need to handle type='error' also def _getItemData(self, jid, dataname): """ Return specific jid's representation in internal format. Used internally """ jid = jid[:(jid+'/').find('/')] return self._data[jid][dataname] def _getResourceData(self, jid, dataname): """ Return specific jid's resource representation in internal format. Used internally """ if jid.find('/') + 1: jid, resource = jid.split('/', 1) if resource in self._data[jid]['resources']: return self._data[jid]['resources'][resource][dataname] elif list(self._data[jid]['resources'].keys()): lastpri = -129 for r in list(self._data[jid]['resources'].keys()): if int(self._data[jid]['resources'][r]['priority']) > lastpri: resource, lastpri=r, int(self._data[jid]['resources'][r]['priority']) return self._data[jid]['resources'][resource][dataname] def delItem(self, jid): """ Delete contact 'jid' from roster """ self._owner.send(Iq('set', NS_ROSTER, payload=[Node('item', {'jid': jid, 'subscription': 'remove'})])) def getAsk(self, jid): """ Return 'ask' value of contact 'jid' """ return self._getItemData(jid, 'ask') def getGroups(self, jid): """ Return groups list that contact 'jid' belongs to """ return self._getItemData(jid, 'groups') def getName(self, jid): """ Return name of contact 'jid' """ return self._getItemData(jid, 'name') def getPriority(self, jid): """ Return priority of contact 'jid'. 'jid' should be a full (not bare) JID """ return self._getResourceData(jid, 'priority') def getRawRoster(self): """ Return roster representation in internal format """ return self._data def getRawItem(self, jid): """ Return roster item 'jid' representation in internal format """ return self._data[jid[:(jid+'/').find('/')]] def getShow(self, jid): """ Return 'show' value of contact 'jid'. 'jid' should be a full (not bare) JID """ return self._getResourceData(jid, 'show') def getStatus(self, jid): """ Return 'status' value of contact 'jid'. 'jid' should be a full (not bare) JID """ return self._getResourceData(jid, 'status') def getSubscription(self, jid): """ Return 'subscription' value of contact 'jid' """ return self._getItemData(jid, 'subscription') def getResources(self, jid): """ Return list of connected resources of contact 'jid' """ return list(self._data[jid[:(jid+'/').find('/')]]['resources'].keys()) def setItem(self, jid, name=None, groups=None): """ Rename contact 'jid' and sets the groups list that it now belongs to """ iq = Iq('set', NS_ROSTER) query = iq.getTag('query') attrs = {'jid': jid} if name: attrs['name'] = name item = query.setTag('item', attrs) if groups is not None: for group in groups: item.addChild(node=Node('group', payload=[group])) self._owner.send(iq) def setItemMulti(self, items): """ Rename multiple contacts and sets their group lists """ for i in items: iq = Iq('set', NS_ROSTER) query = iq.getTag('query') attrs = {'jid': i['jid']} if i['name']: attrs['name'] = i['name'] item = query.setTag('item', attrs) for group in i['groups']: item.addChild(node=Node('group', payload=[group])) self._owner.send(iq) def getItems(self): """ Return list of all [bare] JIDs that the roster is currently tracks """ return list(self._data.keys()) def keys(self): """ Same as getItems. Provided for the sake of dictionary interface """ return list(self._data.keys()) def __getitem__(self, item): """ Get the contact in the internal format. Raises KeyError if JID 'item' is not in roster """ return self._data[item] def getItem(self, item): """ Get the contact in the internal format (or None if JID 'item' is not in roster) """ if item in self._data: return self._data[item] def Subscribe(self, jid): """ Send subscription request to JID 'jid' """ self._owner.send(Presence(jid, 'subscribe')) def Unsubscribe(self, jid): """ Ask for removing our subscription for JID 'jid' """ self._owner.send(Presence(jid, 'unsubscribe')) def Authorize(self, jid): """ Authorize JID 'jid'. Works only if these JID requested auth previously """ self._owner.send(Presence(jid, 'subscribed')) def Unauthorize(self, jid): """ Unauthorise JID 'jid'. Use for declining authorisation request or for removing existing authorization """ self._owner.send(Presence(jid, 'unsubscribed')) def getRaw(self): """ Return the internal data representation of the roster """ return self._data def setRaw(self, data): """ Return the internal data representation of the roster """ self._data = data self._data[self._owner.User + '@' + self._owner.Server] = { 'resources': {}, 'name': None, 'ask': None, 'subscription': None, 'groups': None } self._set = 1 def plugin(self, owner, request=1): """ Register presence and subscription trackers in the owner's dispatcher. Also request roster from server if the 'request' argument is set. Used internally """ self._owner.RegisterHandler('iq', self.RosterIqHandler, 'result', NS_ROSTER, makefirst = 1) self._owner.RegisterHandler('iq', self.RosterIqHandler, 'set', NS_ROSTER) self._owner.RegisterHandler('presence', self.PresenceHandler) if request: return self.Request() def _on_roster_set(self, data): if data: self._owner.Dispatcher.ProcessNonBlocking(data) if not self._set: return if not hasattr(self, '_owner') or not self._owner: # Connection has been closed by receiving a for ex, return self._owner.onreceive(None) if self.on_ready: self.on_ready(self) self.on_ready = None return True def getRoster(self, on_ready=None, force=False): """ Request roster from server if neccessary and returns self """ return_self = True if not self._set: self.on_ready = on_ready self._owner.onreceive(self._on_roster_set) return_self = False elif on_ready: on_ready(self) return_self = False if return_self or force: return self return None python-nbxmpp-nbxmpp-0.6.10/nbxmpp/simplexml.py000066400000000000000000000605771343257752000216420ustar00rootroot00000000000000## simplexml.py based on Mattew Allum's xmlstream.py ## ## Copyright (C) 2003-2005 Alexey "Snake" Nezhdanov ## ## 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. # $Id: simplexml.py,v 1.27 2005/04/30 07:20:27 snakeru Exp $ """ Simplexml module provides xmpppy library with all needed tools to handle XML nodes and XML streams. I'm personally using it in many other separate projects. It is designed to be as standalone as possible """ from __future__ import unicode_literals import sys import xml.parsers.expat import logging log = logging.getLogger('nbxmpp.simplexml') def XMLescape(txt): """ Return provided string with symbols & < > " replaced by their respective XML entities """ # replace also FORM FEED and ESC, because they are not valid XML chars return txt.replace("&", "&").replace("<", "<").replace(">", ">").replace('"', """).replace('\x0C', "").replace('\x1B', "") ENCODING='utf-8' if sys.version_info[0] == 2: def ustr(what): """ Converts object "what" to unicode string using it's own __str__ method if accessible or unicode method otherwise """ if isinstance(what, unicode): return what try: r = what.__str__() except AttributeError: r = unicode(what) if not isinstance(r, unicode): return unicode(r, ENCODING) return r else: def ustr(what): """ Converts object "what" to unicode string using it's own __str__ method if accessible or unicode method otherwise """ if isinstance(what, str): return what try: r = what.__str__() except AttributeError: r = str(what) if not isinstance(r, str): return str(r, ENCODING) return r class Node(object): """ Node class describes syntax of separate XML Node. It have a constructor that permits node creation from set of "namespace name", attributes and payload of text strings and other nodes. It does not natively support building node from text string and uses NodeBuilder class for that purpose. After creation node can be mangled in many ways so it can be completely changed. Also node can be serialised into string in one of two modes: default (where the textual representation of node describes it exactly) and "fancy" - with whitespace added to make indentation and thus make result more readable by human. Node class have attribute FORCE_NODE_RECREATION that is defaults to False thus enabling fast node replication from the some other node. The drawback of the fast way is that new node shares some info with the "original" node that is changing the one node may influence the other. Though it is rarely needed (in xmpppy it is never needed at all since I'm usually never using original node after replication (and using replication only to move upwards on the classes tree). """ FORCE_NODE_RECREATION = 0 def __init__(self, tag=None, attrs=None, payload=None, parent=None, nsp=None, node_built=False, node=None): """ Takes "tag" argument as the name of node (prepended by namespace, if needed and separated from it by a space), attrs dictionary as the set of arguments, payload list as the set of textual strings and child nodes that this node carries within itself and "parent" argument that is another node that this one will be the child of. Also the __init__ can be provided with "node" argument that is either a text string containing exactly one node or another Node instance to begin with. If both "node" and other arguments is provided then the node initially created as replica of "node" provided and then modified to be compliant with other arguments. """ if node: if self.FORCE_NODE_RECREATION and isinstance(node, Node): node = str(node) if not isinstance(node, Node): node = NodeBuilder(node, self) node_built = True else: self.name, self.namespace, self.attrs, self.data, self.kids, self.parent, self.nsd = node.name, node.namespace, {}, [], [], node.parent, {} for key in node.attrs.keys(): self.attrs[key] = node.attrs[key] for data in node.data: self.data.append(data) for kid in node.kids: self.kids.append(kid) for k, v in node.nsd.items(): self.nsd[k] = v else: self.name, self.namespace, self.attrs, self.data, self.kids, self.parent, self.nsd = 'tag', '', {}, [], [], None, {} if parent: self.parent = parent self.nsp_cache = {} if nsp: for k, v in nsp.items(): self.nsp_cache[k] = v if attrs is not None: for attr, val in attrs.items(): if attr == 'xmlns': self.nsd[''] = val elif attr.startswith('xmlns:'): self.nsd[attr[6:]] = val self.attrs[attr] = attrs[attr] if tag: if node_built: pfx, self.name = (['']+tag.split(':'))[-2:] self.namespace = self.lookup_nsp(pfx) else: if ' ' in tag: self.namespace, self.name = tag.split() else: self.name = tag if payload is not None: if not isinstance(payload, list): payload = [payload] for i in payload: if isinstance(i, Node): self.addChild(node=i) else: self.data.append(ustr(i)) def lookup_nsp(self, pfx=''): ns = self.nsd.get(pfx, None) if ns is None: ns = self.nsp_cache.get(pfx, None) if ns is None: if self.parent: ns = self.parent.lookup_nsp(pfx) self.nsp_cache[pfx] = ns else: return 'http://www.gajim.org/xmlns/undeclared' return ns def __str__(self, fancy=0): """ Method used to dump node into textual representation. If "fancy" argument is set to True produces indented output for readability """ s = (fancy-1) * 2 * ' ' + "<" + self.name if self.namespace: if not self.parent or self.parent.namespace!=self.namespace: if 'xmlns' not in self.attrs: s += ' xmlns="%s"' % self.namespace for key in self.attrs.keys(): val = ustr(self.attrs[key]) s += ' %s="%s"' % (key, XMLescape(val)) s += ">" cnt = 0 if self.kids: if fancy: s += "\n" for a in self.kids: if not fancy and (len(self.data)-1) >= cnt: s += XMLescape(self.data[cnt]) elif (len(self.data)-1) >= cnt: s += XMLescape(self.data[cnt].strip()) if isinstance(a, str): s += a.__str__() else: s += a.__str__(fancy and fancy+1) cnt += 1 if not fancy and (len(self.data)-1) >= cnt: s += XMLescape(self.data[cnt]) elif (len(self.data)-1) >= cnt: s += XMLescape(self.data[cnt].strip()) if not self.kids and s.endswith('>'): s = s[:-1] + ' />' if fancy: s += "\n" else: if fancy and not self.data: s += (fancy-1) * 2 * ' ' s += "" if fancy: s += "\n" return s def addChild(self, name=None, attrs=None, payload=None, namespace=None, node=None): """ If "node" argument is provided, adds it as child node. Else creates new node from the other arguments' values and adds it as well """ if payload is None: payload = [] if attrs is None: attrs = {} elif 'xmlns' in attrs: raise AttributeError("Use namespace=x instead of attrs={'xmlns':x}") if node: newnode=node node.parent = self else: newnode=Node(tag=name, parent=self, attrs=attrs, payload=payload) if namespace: newnode.setNamespace(namespace) self.kids.append(newnode) return newnode def addData(self, data): """ Add some CDATA to node """ self.data.append(ustr(data)) def clearData(self): """ Remove all CDATA from the node """ self.data = [] def delAttr(self, key): """ Delete an attribute "key" """ del self.attrs[key] def delChild(self, node, attrs=None): """ Delete the "node" from the node's childs list, if "node" is an instance. Else delete the first node that have specified name and (optionally) attributes """ if not isinstance(node, Node): node = self.getTag(node, attrs) self.kids.remove(node) return node def getAttrs(self): """ Return all node's attributes as dictionary """ return self.attrs def getAttr(self, key): """ Return value of specified attribute """ return self.attrs.get(key) def getChildren(self): """ Return all node's child nodes as list """ return self.kids def getData(self): """ Return all node CDATA as string (concatenated) """ return ''.join(self.data) def getName(self): """ Return the name of node """ return self.name def getNamespace(self): """ Return the namespace of node """ return self.namespace def getParent(self): """ Returns the parent of node (if present) """ return self.parent def getPayload(self): """ Return the payload of node i.e. list of child nodes and CDATA entries. F.e. for "text1 text2" will be returned list: ['text1', , , ' text2'] """ ret = [] for i in range(len(self.kids)+len(self.data)+1): try: if self.data[i]: ret.append(self.data[i]) except IndexError: pass try: ret.append(self.kids[i]) except IndexError: pass return ret def getTag(self, name, attrs=None, namespace=None): """ Filter all child nodes using specified arguments as filter. Return the first found or None if not found """ return self.getTags(name, attrs, namespace, one=1) def getTagAttr(self, tag, attr, namespace=None): """ Return attribute value of the child with specified name (or None if no such attribute) """ try: return self.getTag(tag, namespace=namespace).attrs[attr] except: return None def getTagData(self, tag): """ Return cocatenated CDATA of the child with specified name """ try: return self.getTag(tag).getData() except Exception: return None def getTags(self, name, attrs=None, namespace=None, one=0): """ Filter all child nodes using specified arguments as filter. Returns the list of nodes found """ nodes = [] for node in self.kids: if namespace and namespace != node.getNamespace(): continue if node.getName() == name: if attrs is None: attrs = {} for key in attrs.keys(): if key not in node.attrs or node.attrs[key]!=attrs[key]: break else: nodes.append(node) if one and nodes: return nodes[0] if not one: return nodes def iterTags(self, name, attrs=None, namespace=None): """ Iterate over all children using specified arguments as filter """ for node in self.kids: if namespace is not None and namespace != node.getNamespace(): continue if node.getName() == name: if attrs is None: attrs = {} for key in attrs.keys(): if key not in node.attrs or \ node.attrs[key]!=attrs[key]: break else: yield node def setAttr(self, key, val): """ Set attribute "key" with the value "val" """ self.attrs[key] = val def setData(self, data): """ Set node's CDATA to provided string. Resets all previous CDATA! """ self.data = [ustr(data)] def setName(self, val): """ Change the node name """ self.name = val def setNamespace(self, namespace): """ Changes the node namespace """ self.namespace = namespace def setParent(self, node): """ Set node's parent to "node". WARNING: do not checks if the parent already present and not removes the node from the list of childs of previous parent """ self.parent = node def setPayload(self, payload, add=0): """ Set node payload according to the list specified. WARNING: completely replaces all node's previous content. If you wish just to add child or CDATA - use addData or addChild methods """ if not isinstance(payload, list): payload = [payload] if add: self.kids += payload else: self.kids = payload def setTag(self, name, attrs=None, namespace=None): """ Same as getTag but if the node with specified namespace/attributes not found, creates such node and returns it """ node = self.getTags(name, attrs, namespace=namespace, one=1) if node: return node else: return self.addChild(name, attrs, namespace=namespace) def setTagAttr(self, tag, attr, val, namespace=None): """ Create new node (if not already present) with name "tag" and set it's attribute "attr" to value "val" """ try: self.getTag(tag, namespace=namespace).attrs[attr] = val except Exception: self.addChild(tag, namespace=namespace, attrs={attr: val}) def setTagData(self, tag, val, attrs=None): """ Creates new node (if not already present) with name "tag" and (optionally) attributes "attrs" and sets it's CDATA to string "val" """ try: self.getTag(tag, attrs).setData(ustr(val)) except Exception: self.addChild(tag, attrs, payload = [ustr(val)]) def has_attr(self, key): """ Check if node have attribute "key" """ return key in self.attrs def __getitem__(self, item): """ Return node's attribute "item" value """ return self.getAttr(item) def __setitem__(self, item, val): """ Set node's attribute "item" value """ return self.setAttr(item, val) def __delitem__(self, item): """ Delete node's attribute "item" """ return self.delAttr(item) def __contains__(self, item): """ Check if node has attribute "item" """ return self.has_attr(item) def __getattr__(self, attr): """ Reduce memory usage caused by T/NT classes - use memory only when needed """ if attr == 'T': self.T = T(self) return self.T if attr == 'NT': self.NT = NT(self) return self.NT raise AttributeError class T(object): """ Auxiliary class used to quick access to node's child nodes """ def __init__(self, node): self.__dict__['node'] = node def __getattr__(self, attr): return self.node.setTag(attr) def __setattr__(self, attr, val): if isinstance(val, Node): Node.__init__(self.node.setTag(attr), node=val) else: return self.node.setTagData(attr, val) def __delattr__(self, attr): return self.node.delChild(attr) class NT(T): """ Auxiliary class used to quick create node's child nodes """ def __getattr__(self, attr): return self.node.addChild(attr) def __setattr__(self, attr, val): if isinstance(val, Node): self.node.addChild(attr, node=val) else: return self.node.addChild(attr, payload=[val]) class NodeBuilder(object): """ Builds a Node class minidom from data parsed to it. This class used for two purposes: 1. Creation an XML Node from a textual representation. F.e. reading a config file. See an XML2Node method. 2. Handling an incoming XML stream. This is done by mangling the __dispatch_depth parameter and redefining the dispatch method. You do not need to use this class directly if you do not designing your own XML handler """ def __init__(self, data=None, initial_node=None): """ Take two optional parameters: "data" and "initial_node" By default class initialised with empty Node class instance. Though, if "initial_node" is provided it used as "starting point". You can think about it as of "node upgrade". "data" (if provided) feeded to parser immidiatedly after instance init. """ log.debug("Preparing to handle incoming XML stream.") self._parser = xml.parsers.expat.ParserCreate() self._parser.StartElementHandler = self.starttag self._parser.EndElementHandler = self.endtag self._parser.StartNamespaceDeclHandler = self.handle_namespace_start self._parser.CharacterDataHandler = self.handle_cdata self._parser.buffer_text = True self.Parse = self._parser.Parse self.__depth = 0 self.__last_depth = 0 self.__max_depth = 0 self._dispatch_depth = 1 self._document_attrs = None self._document_nsp = None self._mini_dom=initial_node self.last_is_data = 1 self._ptr=None self.data_buffer = None self.streamError = '' if data: self._parser.Parse(data, 1) def check_data_buffer(self): if self.data_buffer: self._ptr.data.append(''.join(self.data_buffer)) del self.data_buffer[:] self.data_buffer = None def destroy(self): """ Method used to allow class instance to be garbage-collected """ self.check_data_buffer() self._parser.StartElementHandler = None self._parser.EndElementHandler = None self._parser.CharacterDataHandler = None self._parser.StartNamespaceDeclHandler = None def starttag(self, tag, attrs): """ XML Parser callback. Used internally """ self.check_data_buffer() self._inc_depth() log.debug("STARTTAG.. DEPTH -> %i , tag -> %s, attrs -> %s" % (self.__depth, tag, attrs)) if self.__depth == self._dispatch_depth: if not self._mini_dom : self._mini_dom = Node(tag=tag, attrs=attrs, nsp = self._document_nsp, node_built=True) else: Node.__init__(self._mini_dom, tag=tag, attrs=attrs, nsp = self._document_nsp, node_built=True) self._ptr = self._mini_dom elif self.__depth > self._dispatch_depth: self._ptr.kids.append(Node(tag=tag, parent=self._ptr, attrs=attrs, node_built=True)) self._ptr = self._ptr.kids[-1] if self.__depth == 1: self._document_attrs = {} self._document_nsp = {} nsp, name = (['']+tag.split(':'))[-2:] for attr, val in attrs.items(): if attr == 'xmlns': self._document_nsp[''] = val elif attr.startswith('xmlns:'): self._document_nsp[attr[6:]] = val else: self._document_attrs[attr] = val ns = self._document_nsp.get(nsp, 'http://www.gajim.org/xmlns/undeclared-root') try: header = Node(tag=tag, attrs=attrs, nsp=self._document_nsp, node_built=True) self.dispatch(header) self.stream_header_received(ns, name, attrs) except ValueError as e: self._document_attrs = None raise ValueError(str(e)) if not self.last_is_data and self._ptr.parent: self._ptr.parent.data.append('') self.last_is_data = 0 def endtag(self, tag ): """ XML Parser callback. Used internally """ log.debug("DEPTH -> %i , tag -> %s" % (self.__depth, tag)) self.check_data_buffer() if self.__depth == self._dispatch_depth: if self._mini_dom.getName() == 'error': children = self._mini_dom.getChildren() if children: self.streamError = children[0].getName() else: self.streamError = self._mini_dom.getData() self.dispatch(self._mini_dom) elif self.__depth > self._dispatch_depth: self._ptr = self._ptr.parent else: log.debug("Got higher than dispatch level. Stream terminated?") self._dec_depth() self.last_is_data = 0 if self.__depth == 0: self.stream_footer_received() def handle_cdata(self, data): if self.last_is_data: if self.data_buffer: self.data_buffer.append(data) elif self._ptr: self.data_buffer = [data] self.last_is_data = 1 def handle_namespace_start(self, prefix, uri): """ XML Parser callback. Used internally """ self.check_data_buffer() def getDom(self): """ Return just built Node """ self.check_data_buffer() return self._mini_dom def dispatch(self, stanza): """ Get called when the NodeBuilder reaches some level of depth on it's way up with the built node as argument. Can be redefined to convert incoming XML stanzas to program events """ pass def stream_header_received(self, ns, tag, attrs): """ Method called when stream just opened """ self.check_data_buffer() def stream_footer_received(self): """ Method called when stream just closed """ self.check_data_buffer() def has_received_endtag(self, level=0): """ Return True if at least one end tag was seen (at level) """ return self.__depth <= level and self.__max_depth > level def _inc_depth(self): self.__last_depth = self.__depth self.__depth += 1 self.__max_depth = max(self.__depth, self.__max_depth) def _dec_depth(self): self.__last_depth = self.__depth self.__depth -= 1 def XML2Node(xml): """ Convert supplied textual string into XML node. Handy f.e. for reading configuration file. Raises xml.parser.expat.parsererror if provided string is not well-formed XML """ return NodeBuilder(xml).getDom() def BadXML2Node(xml): """ Convert supplied textual string into XML node. Survives if xml data is cutted half way round. I.e. "some text
some more text". Will raise xml.parser.expat.parsererror on misplaced tags though. F.e. "some text
some more text
" will not work """ return NodeBuilder(xml).getDom() python-nbxmpp-nbxmpp-0.6.10/nbxmpp/smacks.py000066400000000000000000000235671343257752000211070ustar00rootroot00000000000000from .protocol import Acks from .protocol import NS_STREAM_MGMT from .transports_nb import CONNECTED, CONNECTING, DISCONNECTED, DISCONNECTING import logging log = logging.getLogger('nbxmpp.smacks') class Smacks(object): """ This is Smacks is the Stream Management class. It takes care of requesting and sending acks. Also, it keeps track of the unhandled outgoing stanzas. The dispatcher has to be able to access this class to increment the number of handled stanzas """ def __init__(self, con): self.con = con # Connection object self.out_h = 0 # Outgoing stanzas handled self.in_h = 0 # Incoming stanzas handled self.last_sent_in_h = 0 # Last acked stanza. self.uqueue = [] # Unhandled stanzas queue self.old_uqueue = [] # Unhandled stanzas queue of the last session self.session_id = None self.resumption = False # If server supports resume # Max number of stanzas in queue before making a request #be more agressive here (every message must be acked), this creates fewer message duplicates on failed resume) self.max_queue = 0 self._owner = None self.resuming = False self.enabled = False # If SM is enabled self.location = None self.failed_resume = False # If last resuming attempt failed self.supports_sm = False # If server supports sm def set_owner(self, owner): self._owner = owner # Register handlers owner.Dispatcher.RegisterNamespace(NS_STREAM_MGMT) owner.Dispatcher.RegisterHandler('enabled', self._neg_response, xmlns=NS_STREAM_MGMT) owner.Dispatcher.RegisterHandler('r', self.send_ack, xmlns=NS_STREAM_MGMT) owner.Dispatcher.RegisterHandler('a', self.check_ack, xmlns=NS_STREAM_MGMT) owner.Dispatcher.RegisterHandler('resumed', self.check_resume, xmlns=NS_STREAM_MGMT) owner.Dispatcher.RegisterHandler('failed', self.error_handling, xmlns=NS_STREAM_MGMT) def _neg_response(self, disp, stanza): r = stanza.getAttr('resume') # When we receive enabled from the server, reset the IN count self.in_h = 0 log.info("Session resumption: %s" % r) if r == 'true' or r == 'True' or r == '1': self.resumption = True self.session_id = stanza.getAttr('id') if r == 'false' or r == 'False' or r == '0': self.negociate(False) l = stanza.getAttr('location') if l: self.location = l if self.failed_resume: self.con._discover_server_at_connection(self.con.connection) self.failed_resume = False def negociate(self, resume=True): # Every time we attempt to negociate, we must erase all previous info # about any previous session log.debug("Clearing smacks uqueue") self.uqueue = [] self.in_h = 0 self.last_sent_in_h = 0 self.out_h = 0 self.session_id = None self.enabled = True stanza = Acks() stanza.buildEnable(resume) self._owner.Connection.send(stanza, now=True) def resend_queue(self): """ Resends unsent stanzas when a new session is established. This way there won't be any lost outgoing messages even on failed smacks resumes (but message duplicates are possible). If your server supports revision 1.5 of smacks then even message duplicates are eliminated here :) """ if self.old_uqueue: log.info('Session resumption failed, replaying %s stanzas anyways...' % len(self.old_uqueue)) for i in self.old_uqueue: self._owner.Dispatcher.send(i, False) #use this send so that our stanzas actually increment out_h self.old_uqueue = [] def resume_request(self): if not self.session_id: self.resuming = False log.error('Attempted to resume without a valid session id ') return #save old messages in an extra "queue" to avoid race conditions and to make it possible to replay stanzas even when resuming fails #add messages here (instead of overwriting) so that repeated connection errors don't delete unacked stanzas (uqueue should be empty in this case anyways) self.old_uqueue += self.uqueue self.uqueue = [] resume = Acks() resume.buildResume(self.in_h, self.session_id) self.last_sent_in_h = self.in_h self._owner.Connection.send(resume, False) def send_ack(self, disp=None, stanza=None): ack = Acks() ack.buildAnswer(self.in_h) self.last_sent_in_h = self.in_h self._owner.Connection.send(ack, False) def send_closing_ack(self): if self._owner.Connection.get_state() != DISCONNECTING: log.error("Not allowed to send closing smacks ack when not disconnecting!") return ack = Acks() ack.buildAnswer(self.in_h) self.last_sent_in_h = self.in_h self._owner.Connection.send(ack, True) def request_ack(self): r = Acks() r.buildRequest() self._owner.Connection.send(r, False) def check_ack(self, disp, stanza): """ Checks if the number of stanzas sent are the same as the number of stanzas received by the server. Pops stanzas that were handled by the server from the queue. """ h = stanza.getAttr('h') if not h: log.error('Server did not send h attribute') return h = int(h) diff = self.out_h - h if diff < 0: log.error('Server and client number of stanzas handled mismatch (our h: %d, server h: %d, #queue: %d)' % (self.out_h, h, len(self.uqueue))) while (len(self.uqueue)): #don't accumulate all messages in this case (they would otherwise all be resent on the next reconnect) self.uqueue.pop(0) elif len(self.uqueue) < diff: log.error('Server and client number of stanzas handled mismatch (our h: %d, server h: %d, #queue: %d)' % (self.out_h, h, len(self.uqueue))) else: log.debug('Got ack for outgoing stanzas (our h: %d, server h: %d, #queue: %d), removing %d messages from queue...' % (self.out_h, h, len(self.uqueue), len(self.uqueue) - diff)) while (len(self.uqueue) > diff): self.uqueue.pop(0) def check_resume(self, disp, stanza): """ Checks if the number of stanzas sent are the same as the number of stanzas received by the server. Resends stanzas not received by the server in the last session. """ log.info("Session resumption succeeded") h = stanza.getAttr('h') if not h: log.error('Server did not send h attribute') return h = int(h) diff = self.out_h - h if diff < 0: log.error('Server and client number of stanzas handled mismatch on session resumption (our h: %d, server h: %d. #queue: %d)' % (self.out_h, h, len(self.old_uqueue))) self.old_uqueue = [] #that's weird, but we don't resend this stanzas if the server says we don't need to elif len(self.old_uqueue) < diff: log.error('Server and client number of stanzas handled mismatch on session resumption (our h: %d, server h: %d, #queue: %d)' % (self.out_h, h, len(self.old_uqueue))) else: log.info('Removing %d already acked stanzas from old outgoing queue (our h: %d, server h: %d, #queue: %d, remaining in queue: %d)' % (len(self.old_uqueue) - diff, self.out_h, h, len(self.old_uqueue), diff)) while (len(self.old_uqueue) > diff): self.old_uqueue.pop(0) self.enabled = True self.resuming = True self.con.set_oldst() if self.old_uqueue: log.info('Session resumed, replaying %s stanzas...' % len(self.old_uqueue)) for i in self.old_uqueue: self._owner.Connection.send(i, False) self.old_uqueue = [] def error_handling(self, disp, stanza): # Doesn't support resumption if stanza.getTag('feature-not-implemented'): log.info('Session resumption failed (feature-not-implemented)') self.negociate(False) return # If the server doesn't recognize previd, forget about resuming # Ask for service discovery, etc.. self.resuming = False self.enabled = False # we need to bind a resource self._owner.NonBlockingBind.resuming = False self._owner.Dispatcher.Event(NS_STREAM_MGMT, 'RESUME FAILED', None) self._owner._on_auth_bind(None) self.failed_resume = True h = stanza.getAttr('h') log.info('Session resumption failed, server h: %s' % str(h)) if not h: return #prepare old_queue to contain only unacked stanzas for later resend (which is happening after our session is established properly) h = int(h) diff = self.out_h - h if diff < 0: log.error('Server and client number of stanzas handled mismatch on session resumption (our h: %d, server h: %d, #queue: %d)' % (self.out_h, h, len(self.old_uqueue))) self.old_uqueue = [] #that's weird, but we don't resend this stanzas if the server says we don't need to elif len(self.old_uqueue) < diff: log.error('Server and client number of stanzas handled mismatch on session resumption (our h: %d, server h: %d, #queue: %d)' % (self.out_h, h, len(self.old_uqueue))) else: log.info('Removing %d already acked stanzas from old outgoing queue (our h: %d, server h: %d, #queue: %d, remaining in queue: %d)' % (len(self.old_uqueue) - diff, self.out_h, h, len(self.old_uqueue), diff)) while (len(self.old_uqueue) > diff): self.old_uqueue.pop(0) python-nbxmpp-nbxmpp-0.6.10/nbxmpp/stringprepare.py000066400000000000000000000203031343257752000224740ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/xmpp/stringprepare.py ## ## Copyright (C) 2001-2005 Twisted Matrix Laboratories ## Copyright (C) 2005-2012 Yann Leboulanger ## Copyright (C) 2006 Stefan Bethge ## Copyright (C) 2007 Jean-Marie Traissard ## ## This file is part of Gajim. ## ## Gajim is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published ## by the Free Software Foundation; version 3 only. ## ## Gajim is distributed in the hope that 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 Gajim. If not, see . ## import stringprep import unicodedata from encodings import idna class ILookupTable(object): """ Interface for character lookup classes """ def lookup(self, c): """ Return whether character is in this table """ pass class IMappingTable(object): """ Interface for character mapping classes """ def map(self, c): """ Return mapping for character """ pass class LookupTableFromFunction(object): __implements__ = ILookupTable def __init__(self, in_table_function): self.lookup = in_table_function class LookupTable(object): __implements__ = ILookupTable def __init__(self, table): self._table = table def lookup(self, c): return c in self._table class MappingTableFromFunction(object): __implements__ = IMappingTable def __init__(self, map_table_function): self.map = map_table_function class EmptyMappingTable(object): __implements__ = IMappingTable def __init__(self, in_table_function): self._in_table_function = in_table_function def map(self, c): if self._in_table_function(c): return None else: return c class Profile(object): def __init__(self, mappings=None, normalize=True, prohibiteds=None, check_unassigneds=True, check_bidi=True): if mappings is None: self.mappings = [] else: self.mappings = mappings self.normalize = normalize if prohibiteds is None: self.prohibiteds = [] else: self.prohibiteds = prohibiteds self.do_check_unassigneds = check_unassigneds self.do_check_bidi = check_bidi def prepare(self, string): result = self.map(string) if self.normalize: result = unicodedata.normalize("NFKC", result) self.check_prohibiteds(result) if self.do_check_unassigneds: self.check_unassigneds(result) if self.do_check_bidi: self.check_bidirectionals(result) return result def map(self, string): result = [] for c in string: result_c = c for mapping in self.mappings: result_c = mapping.map(c) if result_c != c: break if result_c is not None: result.append(result_c) return "".join(result) def check_prohibiteds(self, string): for c in string: for table in self.prohibiteds: if table.lookup(c): raise UnicodeError("Invalid character %s" % repr(c)) def check_unassigneds(self, string): for c in string: if stringprep.in_table_a1(c): raise UnicodeError("Unassigned code point %s" % repr(c)) def check_bidirectionals(self, string): found_LCat = False found_RandALCat = False for c in string: if stringprep.in_table_d1(c): found_RandALCat = True if stringprep.in_table_d2(c): found_LCat = True if found_LCat and found_RandALCat: raise UnicodeError("Violation of BIDI Requirement 2") if found_RandALCat and not (stringprep.in_table_d1(string[0]) and stringprep.in_table_d1(string[-1])): raise UnicodeError("Violation of BIDI Requirement 3") class NamePrep(object): """ Implements preparation of internationalized domain names This class implements preparing internationalized domain names using the rules defined in RFC 3491, section 4 (Conversion operations). We do not perform step 4 since we deal with unicode representations of domain names and do not convert from or to ASCII representations using punycode encoding. When such a conversion is needed, the L{idna} standard library provides the C{ToUnicode()} and C{ToASCII()} functions. Note that L{idna} itself assumes UseSTD3ASCIIRules to be false. The following steps are performed by C{prepare()}: * Split the domain name in labels at the dots (RFC 3490, 3.1) * Apply nameprep proper on each label (RFC 3491) * Enforce the restrictions on ASCII characters in host names by assuming STD3ASCIIRules to be true. (STD 3) * Rejoin the labels using the label separator U+002E (full stop). """ # Prohibited characters. prohibiteds = [chr(n) for n in list(range(0x00, 0x2c + 1)) + list(range(0x2e, 0x2f + 1)) + list(range(0x3a, 0x40 + 1)) + list(range(0x5b, 0x60 + 1)) + list(range(0x7b, 0x7f + 1)) ] def prepare(self, string): result = [] labels = idna.dots.split(string) if labels and len(labels[-1]) == 0: trailing_dot = '.' del labels[-1] else: trailing_dot = '' for label in labels: result.append(self.nameprep(label)) return ".".join(result)+trailing_dot def check_prohibiteds(self, string): for c in string: if c in self.prohibiteds: raise UnicodeError("Invalid character %s" % repr(c)) def nameprep(self, label): label = idna.nameprep(label) self.check_prohibiteds(label) if len(label) == 0: raise UnicodeError("Invalid empty name") if label[0] == '-': raise UnicodeError("Invalid leading hyphen-minus") if label[-1] == '-': raise UnicodeError("Invalid trailing hyphen-minus") return label C_11 = LookupTableFromFunction(stringprep.in_table_c11) C_12 = LookupTableFromFunction(stringprep.in_table_c12) C_21 = LookupTableFromFunction(stringprep.in_table_c21) C_22 = LookupTableFromFunction(stringprep.in_table_c22) C_3 = LookupTableFromFunction(stringprep.in_table_c3) C_4 = LookupTableFromFunction(stringprep.in_table_c4) C_5 = LookupTableFromFunction(stringprep.in_table_c5) C_6 = LookupTableFromFunction(stringprep.in_table_c6) C_7 = LookupTableFromFunction(stringprep.in_table_c7) C_8 = LookupTableFromFunction(stringprep.in_table_c8) C_9 = LookupTableFromFunction(stringprep.in_table_c9) B_1 = EmptyMappingTable(stringprep.in_table_b1) B_2 = MappingTableFromFunction(stringprep.map_table_b2) nodeprep = Profile(mappings=[B_1, B_2], prohibiteds=[C_11, C_12, C_21, C_22, C_3, C_4, C_5, C_6, C_7, C_8, C_9, LookupTable(['"', '&', "'", '/', ':', '<', '>', '@'])]) resourceprep = Profile(mappings=[B_1,], prohibiteds=[C_12, C_21, C_22, C_3, C_4, C_5, C_6, C_7, C_8, C_9]) nameprep = NamePrep() python-nbxmpp-nbxmpp-0.6.10/nbxmpp/tls_nb.py000066400000000000000000000505661343257752000211060ustar00rootroot00000000000000## tls_nb.py ## based on transports_nb.py ## ## Copyright (C) 2003-2004 Alexey "Snake" Nezhdanov ## modified by Dimitur Kirov ## modified by Tomas Karasek ## ## 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. from __future__ import print_function import socket import ssl from .plugin import PlugIn import sys import os import time import io import traceback import logging log = logging.getLogger('nbxmpp.tls_nb') USE_PYOPENSSL = False PYOPENSSL = 'PYOPENSSL' PYSTDLIB = 'PYSTDLIB' try: #raise ImportError("Manually disabled PyOpenSSL") import OpenSSL.SSL import OpenSSL.crypto USE_PYOPENSSL = True log.info("PyOpenSSL loaded") except ImportError: log.debug("Import of PyOpenSSL failed:", exc_info=True) # FIXME: Remove these prints before release, replace with a warning dialog. print("=" * 79, file=sys.stderr) print("PyOpenSSL not found, falling back to Python builtin SSL objects (insecure).", file=sys.stderr) print("=" * 79, file=sys.stderr) def gattr(obj, attr, default=None): try: return getattr(obj, attr) except AttributeError: return default class SSLWrapper(object): """ Abstract SSLWrapper base class """ class Error(IOError): """ Generic SSL Error Wrapper """ def __init__(self, sock=None, exc=None, errno=None, strerror=None, peer=None): self.parent = IOError errno = errno or gattr(exc, 'errno') or exc.args[0] strerror = strerror or gattr(exc, 'strerror') or gattr(exc, 'args') if not isinstance(strerror, str): strerror = repr(strerror) self.sock = sock self.exc = exc self.peer = peer self.exc_name = None self.exc_args = None self.exc_str = None self.exc_repr = None if self.exc is not None: self.exc_name = str(self.exc.__class__) self.exc_args = gattr(self.exc, 'args') self.exc_str = str(self.exc) self.exc_repr = repr(self.exc) if not errno: try: if isinstance(exc, OpenSSL.SSL.SysCallError): if self.exc_args[0] > 0: errno = self.exc_args[0] strerror = self.exc_args[1] except: pass self.parent.__init__(self, errno, strerror) if self.peer is None and sock is not None: try: ppeer = self.sock.getpeername() if len(ppeer) == 2 and isinstance(ppeer[0], str) \ and isinstance(ppeer[1], int): self.peer = ppeer except: pass def __str__(self): s = str(self.__class__) if self.peer: s += " for %s:%d" % self.peer if self.errno is not None: s += ": [Errno: %d]" % self.errno if self.strerror: s += " (%s)" % self.strerror if self.exc_name: s += ", Caused by %s" % self.exc_name if self.exc_str: if self.strerror: s += "(%s)" % self.exc_str else: s += "(%s)" % str(self.exc_args) return s def __init__(self, sslobj, sock=None): self.sslobj = sslobj self.sock = sock log.debug("%s.__init__ called with %s", self.__class__, sslobj) def recv(self, data, flags=None): """ Receive wrapper for SSL object We can return None out of this function to signal that no data is available right now. Better than an exception, which differs depending on which SSL lib we're using. Unfortunately returning '' can indicate that the socket has been closed, so to be sure, we avoid this by returning None. """ raise NotImplementedError def send(self, data, flags=None, now=False): """ Send wrapper for SSL object """ raise NotImplementedError class PyOpenSSLWrapper(SSLWrapper): """ Wrapper class for PyOpenSSL's recv() and send() methods """ def __init__(self, *args): self.parent = SSLWrapper self.parent.__init__(self, *args) def is_numtoolarge(self, e): """ Magic methods don't need documentation """ t = ('asn1 encoding routines', 'a2d_ASN1_OBJECT', 'first num too large') return (isinstance(e.args, (list, tuple)) and len(e.args) == 1 and isinstance(e.args[0], (list, tuple)) and len(e.args[0]) == 2 and e.args[0][0] == e.args[0][1] == t) def recv(self, bufsize, flags=None): retval = None try: if flags is None: retval = self.sslobj.recv(bufsize) else: retval = self.sslobj.recv(bufsize, flags) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError) as e: log.debug("Recv: Want-error: " + repr(e)) except OpenSSL.SSL.SysCallError as e: log.debug("Recv: Got OpenSSL.SSL.SysCallError: " + repr(e), exc_info=True) raise SSLWrapper.Error(self.sock or self.sslobj, e) except OpenSSL.SSL.ZeroReturnError as e: # end-of-connection raises ZeroReturnError instead of having the # connection's .recv() method return a zero-sized result. raise SSLWrapper.Error(self.sock or self.sslobj, e, -1) except OpenSSL.SSL.Error as e: if self.is_numtoolarge(e): # warn, but ignore this exception log.warning("Recv: OpenSSL: asn1enc: first num too large (ignored)") else: log.debug("Recv: Caught OpenSSL.SSL.Error:", exc_info=True) raise SSLWrapper.Error(self.sock or self.sslobj, e) return retval def send(self, data, flags=None, now=False): try: if flags is None: return self.sslobj.send(data) else: return self.sslobj.send(data, flags) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError) as e: #log.debug("Send: " + repr(e)) time.sleep(0.1) # prevent 100% CPU usage except OpenSSL.SSL.SysCallError as e: log.error("Send: Got OpenSSL.SSL.SysCallError: " + repr(e), exc_info=True) raise SSLWrapper.Error(self.sock or self.sslobj, e) except OpenSSL.SSL.Error as e: if self.is_numtoolarge(e): # warn, but ignore this exception log.warning("Send: OpenSSL: asn1enc: first num too large (ignored)") else: log.error("Send: Caught OpenSSL.SSL.Error:", exc_info=True) raise SSLWrapper.Error(self.sock or self.sslobj, e) return 0 class StdlibSSLWrapper(SSLWrapper): """ Wrapper class for Python socket.ssl read() and write() methods """ def __init__(self, *args): self.parent = SSLWrapper self.parent.__init__(self, *args) def recv(self, bufsize, flags=None): # we simply ignore flags since ssl object doesn't support it try: return self.sslobj.read(bufsize) except ssl.SSLError as e: log.debug("Recv: Caught ssl.SSLError: " + repr(e), exc_info=True) if e.args[0] not in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): raise SSLWrapper.Error(self.sock or self.sslobj, e) return None def send(self, data, flags=None, now=False): # we simply ignore flags since ssl object doesn't support it try: return self.sslobj.write(data) except ssl.SSLError as e: log.debug("Send: Caught socket.sslerror:", exc_info=True) if e.args[0] not in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): raise SSLWrapper.Error(self.sock or self.sslobj, e) return 0 class NonBlockingTLS(PlugIn): """ TLS connection used to encrypts already estabilished tcp connection Can be plugged into NonBlockingTCP and will make use of StdlibSSLWrapper or PyOpenSSLWrapper. """ def __init__(self, cacerts, mycerts, tls_version, cipher_list, alpn): """ :param cacerts: path to pem file with certificates of known XMPP servers :param mycerts: path to pem file with certificates of user trusted servers :param tls_version: The lowest supported TLS version. If None is provided, version 1.0 is used. For example setting to 1.1 will enable TLS 1.1, TLS 1.2 and all further protocols :param cipher_list: list of ciphers to use when connection to server. If None is provided, a default list is used: HIGH:!aNULL:RC4-SHA """ PlugIn.__init__(self) self.cacerts = cacerts self.mycerts = mycerts if cipher_list is None: self.cipher_list = b'HIGH:!aNULL' else: self.cipher_list = cipher_list.encode('ascii') if tls_version is None: self.tls_version = '1.2' else: self.tls_version = tls_version self.alpn = alpn def plugin(self, owner): """ Use to PlugIn TLS into transport and start establishing immediately. Returns True if TLS/SSL was established correctly, otherwise False """ log.info('Starting TLS estabilishing') try: res = self._startSSL() except Exception as e: log.error("PlugIn: while trying _startSSL():", exc_info=True) return False return res def _dumpX509(self, cert, stream=sys.stderr): try: print("Digest (SHA-2 256):" + cert.digest("sha256"), file=stream) except ValueError: # Old OpenSSL version pass print("Digest (SHA-1):" + cert.digest("sha1"), file=stream) print("Digest (MD5):" + cert.digest("md5"), file=stream) print("Serial #:" + cert.get_serial_number(), file=stream) print("Version:" + cert.get_version(), file=stream) print("Expired:" + ("Yes" if cert.has_expired() else "No"), file=stream) print("Subject:", file=stream) self._dumpX509Name(cert.get_subject(), stream) print("Issuer:", file=stream) self._dumpX509Name(cert.get_issuer(), stream) self._dumpPKey(cert.get_pubkey(), stream) def _dumpX509Name(self, name, stream=sys.stderr): print("X509Name:" + str(name), file=stream) def _dumpPKey(self, pkey, stream=sys.stderr): typedict = {OpenSSL.crypto.TYPE_RSA: "RSA", OpenSSL.crypto.TYPE_DSA: "DSA"} print("PKey bits:" + pkey.bits(), file=stream) print("PKey type: %s (%d)" % (typedict.get(pkey.type(), "Unknown"), pkey.type()), file=stream) def _startSSL(self): """ Immediatedly switch socket to TLS mode. Used internally """ log.debug("_startSSL called") if USE_PYOPENSSL: result = self._startSSL_pyOpenSSL() else: result = self._startSSL_stdlib() if result: log.debug('Synchronous handshake completed') return True else: return False def _load_cert_file(self, cert_path, cert_store, logg=True): if not os.path.isfile(cert_path): return try: if sys.version_info[0] > 2: f = open(cert_path, encoding='utf-8') else: f = io.open(cert_path, encoding='utf-8') lines = f.readlines() except (IOError, UnicodeError) as e: log.warning('Unable to open certificate file %s: %s' % \ (cert_path, str(e))) return i = 0 begin = -1 for line in lines: if 'BEGIN CERTIFICATE' in line: begin = i elif 'END CERTIFICATE' in line and begin > -1: cert = ''.join(lines[begin:i+2]) try: x509cert = OpenSSL.crypto.load_certificate( OpenSSL.crypto.FILETYPE_PEM, cert.encode('ascii', 'ignore')) cert_store.add_cert(x509cert) except OpenSSL.crypto.Error as exception_obj: if logg: log.warning('Unable to load a certificate from file %s: %s' %\ (cert_path, exception_obj.args[0][0][2])) except: log.warning('Unknown error while loading certificate from file ' '%s' % cert_path) begin = -1 i += 1 f.close() def _startSSL_pyOpenSSL(self): log.debug("_startSSL_pyOpenSSL called") tcpsock = self._owner # See http://docs.python.org/dev/library/ssl.html tcpsock._sslContext = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD) flags = OpenSSL.SSL.OP_NO_SSLv2 | OpenSSL.SSL.OP_NO_SSLv3 | \ OpenSSL.SSL.OP_SINGLE_DH_USE try: flags |= OpenSSL.SSL.OP_NO_TICKET except AttributeError as e: # py-OpenSSL < 0.9 or old OpenSSL flags |= 16384 if self.alpn: # XEP-0368 set ALPN Protocol tcpsock._sslContext.set_alpn_protos([b'xmpp-client']) try: # OpenSSL 1.0.1d supports TLS 1.1 and TLS 1.2 and # fixes renegotiation in TLS 1.1, 1.2 by using the correct TLS version. if OpenSSL.SSL.OPENSSL_VERSION_NUMBER >= 0x1000104f: if self.tls_version != '1.0': flags |= OpenSSL.SSL.OP_NO_TLSv1 if self.tls_version not in ('1.0', '1.1'): try: flags |= OpenSSL.SSL.OP_NO_TLSv1_1 except AttributeError as e: # older py-OpenSSL flags |= 0x10000000 except AttributeError as e: pass # much older py-OpenSSL tcpsock._sslContext.set_options(flags) try: # Supported only pyOpenSSL >= 0.14 # Disable session resumption, protection against Triple Handshakes TLS attack tcpsock._sslContext.set_session_cache_mode(OpenSSL.SSL.SESS_CACHE_OFF) except AttributeError as e: pass # NonBlockingHTTPBOSH instance has no attribute _owner if hasattr(tcpsock, '_owner') and tcpsock._owner._caller.client_cert \ and os.path.exists(tcpsock._owner._caller.client_cert): conn = tcpsock._owner._caller log.debug('Using client cert and key from %s' % conn.client_cert) try: p12 = OpenSSL.crypto.load_pkcs12(open(conn.client_cert, 'rb').read(), conn.client_cert_passphrase) except OpenSSL.crypto.Error as exception_obj: log.warning('Unable to load client pkcs12 certificate from ' 'file %s: %s ... Is it a valid PKCS12 cert?' % \ (conn.client_cert, exception_obj.args)) except: log.warning('Unknown error while loading certificate from file ' '%s' % conn.client_cert) else: log.info('PKCS12 Client cert loaded OK') try: tcpsock._sslContext.use_certificate(p12.get_certificate()) tcpsock._sslContext.use_privatekey(p12.get_privatekey()) log.info('p12 cert and key loaded') except OpenSSL.crypto.Error as exception_obj: log.warning('Unable to extract client certificate from ' 'file %s' % conn.client_cert) except Exception as msg: log.warning('Unknown error extracting client certificate ' 'from file %s: %s' % (conn.client_cert, msg)) else: log.info('client cert and key loaded OK') tcpsock.ssl_errnum = 0 tcpsock._sslContext.set_verify(OpenSSL.SSL.VERIFY_PEER, self._ssl_verify_callback) tcpsock._sslContext.set_cipher_list(self.cipher_list) store = tcpsock._sslContext.get_cert_store() self._load_cert_file(self.cacerts, store) self._load_cert_file(self.mycerts, store) paths = ['/etc/ssl/certs', '/etc/ssl'] # FreeBSD uses this for path in paths: if not os.path.isdir(path): continue for f in os.listdir(path): # We don't logg because there is a lot a duplicated certs # in this folder self._load_cert_file(os.path.join(path, f), store, logg=False) tcpsock._sslObj = OpenSSL.SSL.Connection(tcpsock._sslContext, tcpsock._sock) tcpsock._sslObj.set_connect_state() # set to client mode if self.alpn: # Set SNI EXT on the SSL Connection object, see XEP-0368 tcpsock._sslObj.set_tlsext_host_name(tcpsock._owner.Server.encode()) wrapper = PyOpenSSLWrapper(tcpsock._sslObj) tcpsock._recv = wrapper.recv tcpsock._send = wrapper.send log.debug("Initiating handshake...") try: tcpsock._sslObj.do_handshake() except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError) as e: pass except: log.error('Error while TLS handshake: ', exc_info=True) return False self._owner.ssl_lib = PYOPENSSL return True def _startSSL_stdlib(self): log.debug("_startSSL_stdlib called") tcpsock=self._owner try: tcpsock._sslObj = ssl.wrap_socket(tcpsock._sock, ssl_version=ssl.PROTOCOL_TLSv1, do_handshake_on_connect=False) wrapper = StdlibSSLWrapper(tcpsock._sslObj, tcpsock._sock) tcpsock._recv = wrapper.recv tcpsock._send = wrapper.send log.debug("Initiating handshake...") try: tcpsock._sslObj.do_handshake() except (ssl.SSLError) as e: if e.args[0] in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): pass else: log.error('Error while TLS handshake: ', exc_info=True) return False except: log.error('Error while TLS handshake: ', exc_info=True) return False except: log.error("Exception caught in _startSSL_stdlib:", exc_info=True) return False self._owner.ssl_lib = PYSTDLIB return True def _ssl_verify_callback(self, sslconn, cert, errnum, depth, ok): # Exceptions can't propagate up through this callback, so print them here. try: if errnum: self._owner.ssl_errors.append(errnum) # This stores all ssl errors that are encountered while # the chain is verifyed if not self._owner.ssl_errnum: # This records the first ssl error that is encountered # we keep this because of backwards compatibility self._owner.ssl_errnum = errnum if depth == 0: self._owner.ssl_certificate = cert return True except Exception: log.exception("Exception caught in _ssl_info_callback:") # Make sure something is printed, even if log is disabled. traceback.print_exc() def get_channel_binding(self): """ Get channel binding data. RFC 5929 """ sslObj = self._owner._sslObj try: if USE_PYOPENSSL: return sslObj.get_finished() else: return sslObj.get_channel_binding() except AttributeError: raise NotImplementedError python-nbxmpp-nbxmpp-0.6.10/nbxmpp/transports_nb.py000066400000000000000000000770121343257752000225160ustar00rootroot00000000000000## transports_nb.py ## based on transports.py ## ## Copyright (C) 2003-2004 Alexey "Snake" Nezhdanov ## modified by Dimitur Kirov ## modified by Tomas Karasek ## ## 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. """ Transports are objects responsible for connecting to XMPP server and putting data to wrapped sockets in in desired form (SSL, TLS, TCP, for HTTP proxy, for SOCKS5 proxy...) Transports are not aware of XMPP stanzas and only responsible for low-level connection handling. """ from __future__ import unicode_literals from .simplexml import ustr from .plugin import PlugIn from .idlequeue import IdleObject from . import proxy_connectors from . import tls_nb import socket import errno import time import traceback import base64 import sys import locale try: from urllib.parse import urlparse except ImportError: from urlparse import urlparse import logging log = logging.getLogger('nbxmpp.transports_nb') def urisplit(uri): """ Function for splitting URI string to tuple (protocol, host, port, path). e.g. urisplit('http://httpcm.jabber.org:123/webclient') returns ('http', 'httpcm.jabber.org', 123, '/webclient') return 443 as default port if proto is https else 80 """ splitted = urlparse(uri) proto, host, path = splitted.scheme, splitted.hostname, splitted.path try: port = splitted.port except ValueError: log.warning('port cannot be extracted from BOSH URL %s, using default port' \ % uri) port = '' if not port: if proto == 'https': port = 443 else: port = 80 return proto, host, port, path def get_proxy_data_from_dict(proxy): tcp_host, tcp_port, proxy_user, proxy_pass = None, None, None, None proxy_type = proxy['type'] if proxy_type == 'bosh' and not proxy['bosh_useproxy']: # with BOSH not over proxy we have to parse the hostname from BOSH URI proto, tcp_host, tcp_port, path = urisplit(proxy['bosh_uri']) else: # with proxy!=bosh or with bosh over HTTP proxy we're connecting to proxy # machine tcp_host, tcp_port = proxy['host'], proxy['port'] if proxy.get('useauth', False): proxy_user, proxy_pass = proxy['user'], proxy['pass'] return tcp_host, tcp_port, proxy_user, proxy_pass def decode_py2(string, encoding): # decodes string into unicode if in py2 # py3 has unicode strings by default try: string = string.decode(encoding) except AttributeError: pass return string #: timeout to connect to the server socket, it doesn't include auth CONNECT_TIMEOUT_SECONDS = 30 #: how long to wait for a disconnect to complete DISCONNECT_TIMEOUT_SECONDS = 5 #: size of the buffer which reads data from server # if lower, more stanzas will be fragmented and processed twice RECV_BUFSIZE = 32768 # 2x maximum size of ssl packet, should be plenty # it's inefficient but should work. Problem is that connect machine makes wrong # assumptions and that we only check for pending data in sockets but not in SSL # buffer... DATA_RECEIVED = 'DATA RECEIVED' DATA_SENT = 'DATA SENT' DATA_ERROR = 'DATA ERROR' DISCONNECTED = 'DISCONNECTED' DISCONNECTING = 'DISCONNECTING' CONNECTING = 'CONNECTING' PROXY_CONNECTING = 'PROXY_CONNECTING' CONNECTED = 'CONNECTED' STATES = (DISCONNECTED, CONNECTING, PROXY_CONNECTING, CONNECTED, DISCONNECTING) class NonBlockingTransport(PlugIn): """ Abstract class representing a transport Subclasses CAN have different constructor signature but connect method SHOULD be the same. """ def __init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, tls_version, cipher_list): """ Each trasport class can have different constructor but it has to have at least all the arguments of NonBlockingTransport constructor :param raise_event: callback for monitoring of sent and received data :param on_disconnect: callback called on disconnection during runtime :param idlequeue: processing idlequeue :param estabilish_tls: boolean whether to estabilish TLS connection after TCP connection is done :param certs: tuple of (cacerts, mycerts) see constructor of tls_nb.NonBlockingTLS for more details :param tls_version: The lowest supported TLS version. :param cipher_list: list of ciphers used to connect to server """ PlugIn.__init__(self) self.raise_event = raise_event self.on_disconnect = on_disconnect self.on_connect = None self.on_connect_failure = None self.idlequeue = idlequeue self.on_receive = None self.server = None self.port = None self.conn_5tuple = None self.set_state(DISCONNECTED) self.estabilish_tls = estabilish_tls self.certs = certs self.tls_version = tls_version self.cipher_list = cipher_list # type of used ssl lib (if any) will be assigned to this member var self.ssl_lib = None self._exported_methods=[self.onreceive, self.set_send_timeout, self.set_send_timeout2, self.set_timeout, self.remove_timeout, self.start_disconnect] # time to wait for SOME stanza to come and then send keepalive self.sendtimeout = 0 # in case we want to something different than sending keepalives self.on_timeout = None self.on_timeout2 = None def plugin(self, owner): owner.Connection = self def plugout(self): self._owner.Connection = None self._owner = None self.disconnect(do_callback=False) def connect(self, conn_5tuple, on_connect, on_connect_failure): """ Creates and connects transport to server and port defined in conn_5tuple which should be item from list returned from getaddrinfo :param conn_5tuple: 5-tuple returned from getaddrinfo :param on_connect: callback called on successful connect to the server :param on_connect_failure: callback called on failure when connecting """ self.on_connect = on_connect self.on_connect_failure = on_connect_failure self.server, self.port = conn_5tuple[4][:2] self.conn_5tuple = conn_5tuple def set_state(self, newstate): assert(newstate in STATES) self.state = newstate def get_state(self): return self.state def _on_connect(self): """ Preceeds call of on_connect callback """ # data is reference to socket wrapper instance. We don't need it in client # because self.set_state(CONNECTED) self.on_connect() def _on_connect_failure(self, err_message): """ Preceeds call of on_connect_failure callback """ # In case of error while connecting we need to disconnect transport # but we don't want to call DisconnectHandlers from client, # thus the do_callback=False self.disconnect(do_callback=False) self.on_connect_failure(err_message=err_message) def send(self, raw_data, now=False): if self.get_state() == DISCONNECTED: log.error('Unable to send %s \n because state is %s.' % (raw_data, self.get_state())) def disconnect(self, do_callback=True): self.set_state(DISCONNECTED) if do_callback: # invoke callback given in __init__ self.on_disconnect() def onreceive(self, recv_handler): """ Set the on_receive callback. onreceive(None) sets callback to Dispatcher.ProcessNonBlocking which is the default one that will decide what to do with received stanza based on its tag name and namespace. Do not confuse it with on_receive() method, which is the callback itself. """ if not recv_handler: if hasattr(self, '_owner') and hasattr(self._owner, 'Dispatcher'): self.on_receive = self._owner.Dispatcher.ProcessNonBlocking else: log.warning('No Dispatcher plugged. Received data will not be processed') self.on_receive = None return self.on_receive = recv_handler def _tcp_connecting_started(self): self.set_state(CONNECTING) def read_timeout(self): """ Called when there's no response from server in defined timeout """ if self.on_timeout: self.on_timeout() self.renew_send_timeout() def read_timeout2(self): """ called when there's no response from server in defined timeout """ if self.on_timeout2: self.on_timeout2() self.renew_send_timeout2() def renew_send_timeout(self): if self.on_timeout and self.sendtimeout > 0: self.set_timeout(self.sendtimeout) def renew_send_timeout2(self): if self.on_timeout2 and self.sendtimeout2 > 0: self.set_timeout2(self.sendtimeout2) def set_timeout(self, timeout): self.idlequeue.set_read_timeout(self.fd, timeout) def set_timeout2(self, timeout2): self.idlequeue.set_read_timeout(self.fd, timeout2, self.read_timeout2) def get_fd(self): pass def remove_timeout(self): self.idlequeue.remove_timeout(self.fd) def set_send_timeout(self, timeout, on_timeout): self.sendtimeout = timeout if self.sendtimeout > 0: self.on_timeout = on_timeout else: self.on_timeout = None def set_send_timeout2(self, timeout2, on_timeout2): self.sendtimeout2 = timeout2 if self.sendtimeout2 > 0: self.on_timeout2 = on_timeout2 else: self.on_timeout2 = None # FIXME: where and why does this need to be called def start_disconnect(self): self.set_state(DISCONNECTING) if self._owner._caller.sm and self._owner._caller.sm.enabled: self._owner._caller.sm.send_closing_ack() class NonBlockingTCP(NonBlockingTransport, IdleObject): """ Non-blocking TCP socket wrapper It is used for simple XMPP connection. Can be connected via proxy and can estabilish TLS connection. """ def __init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, tls_version, cipher_list, alpn, proxy_dict=None): """ :param proxy_dict: dictionary with proxy data as loaded from config file """ NonBlockingTransport.__init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, tls_version, cipher_list) IdleObject.__init__(self) # queue with messages to be send self.sendqueue = [] # bytes remained from the last send message self.sendbuff = '' self.sent_bytes_buff = b'' # bytes remained from the last received message self.received_bytes_buff = b'' self.proxy_dict = proxy_dict self.on_remote_disconnect = self.disconnect # ssl variables self.ssl_certificate = None # first ssl error self.ssl_errnum = 0 # all ssl errors self.ssl_errors = [] self.alpn = alpn # FIXME: transport should not be aware xmpp def start_disconnect(self): NonBlockingTransport.start_disconnect(self) self.send('', now=True) self.disconnect() def connect(self, conn_5tuple, on_connect, on_connect_failure): NonBlockingTransport.connect(self, conn_5tuple, on_connect, on_connect_failure) log.info('NonBlockingTCP Connect :: About to connect to %s:%s' % (self.server, self.port)) try: self._sock = socket.socket(*conn_5tuple[:3]) except socket.error as e: self._on_connect_failure('NonBlockingTCP Connect: Error while creating\ socket: %s' % str(e)) return self._send = self._sock.send self._recv = self._sock.recv self.fd = self._sock.fileno() # we want to be notified when send is possible to connected socket because # it means the TCP connection is estabilished self._plug_idle(writable=True, readable=False) self.peerhost = None # variable for errno symbol that will be found from exception raised # from connect() errnum = 0 errstr = str() # set timeout for TCP connecting - if nonblocking connect() fails, pollend # is called. If if succeeds pollout is called. self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT_SECONDS) try: self._sock.setblocking(False) self._sock.connect((self.server, self.port)) except Exception as exc: errnum, errstr = exc.errno, \ decode_py2(exc.strerror, locale.getpreferredencoding()) if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): # connecting in progress log.info('After NB connect() of %s. "%s" raised => CONNECTING' % (id(self), errstr)) self._tcp_connecting_started() return # if there was some other exception, call failure callback and unplug # transport which will also remove read_timeouts for descriptor self._on_connect_failure('Exception while connecting to %s:%s - %s %s' % (self.server, self.port, errnum, errstr)) def _connect_to_proxy(self): self.set_state(PROXY_CONNECTING) if self.proxy_dict['type'] == 'socks5': proxyclass = proxy_connectors.SOCKS5Connector elif self.proxy_dict['type'] == 'http' : proxyclass = proxy_connectors.HTTPCONNECTConnector proxyclass.get_instance( send_method=self.send, onreceive=self.onreceive, old_on_receive=self.on_receive, on_success=self._on_connect, on_failure=self._on_connect_failure, xmpp_server=self.proxy_dict['xmpp_server'], proxy_creds=self.proxy_dict['credentials']) def _on_connect(self): """ Preceed invoking of on_connect callback. TCP connection is already estabilished by this time """ if self.estabilish_tls: self.tls_init( on_succ = lambda: NonBlockingTransport._on_connect(self), on_fail = lambda: self._on_connect_failure( 'error while estabilishing TLS')) else: NonBlockingTransport._on_connect(self) def tls_init(self, on_succ, on_fail): """ Estabilishes TLS/SSL using this TCP connection by plugging a NonBlockingTLS module """ cacerts, mycerts = self.certs result = tls_nb.NonBlockingTLS.get_instance(cacerts, mycerts, self.tls_version, self.cipher_list, self.alpn).PlugIn(self) if result: on_succ() else: on_fail() def pollin(self): """ Called by idlequeu when receive on plugged socket is possible """ log.info('pollin called, state == %s' % self.get_state()) self._do_receive() def pollout(self): """ Called by idlequeu when send to plugged socket is possible """ log.info('pollout called, state == %s' % self.get_state()) if self.get_state() == CONNECTING: log.info('%s socket wrapper connected' % id(self)) self.idlequeue.remove_timeout(self.fd) self._plug_idle(writable=False, readable=False) self.peerhost = self._sock.getsockname() if self.proxy_dict: self._connect_to_proxy() else: self._on_connect() else: self._do_send() def pollend(self): """ Called by idlequeue on TCP connection errors """ log.info('pollend called, state == %s' % self.get_state()) if self.get_state() == CONNECTING: self._on_connect_failure('Error during connect to %s:%s' % (self.server, self.port)) else: self.disconnect() def disconnect(self, do_callback=True): if self.get_state() == DISCONNECTED: return self.set_state(DISCONNECTED) self.idlequeue.unplug_idle(self.fd) if 'NonBlockingTLS' in self.__dict__: self.NonBlockingTLS.PlugOut() try: self._sock.shutdown(socket.SHUT_RDWR) self._sock.close() except socket.error as e: errstr = decode_py2(e.strerror, locale.getpreferredencoding()) log.info('Error while disconnecting socket: %s' % errstr) self.fd = -1 NonBlockingTransport.disconnect(self, do_callback) def read_timeout(self): log.info('read_timeout called, state == %s' % self.get_state()) if self.get_state() == CONNECTING: # if read_timeout is called during connecting, connect() didn't end yet # thus we have to call the tcp failure callback self._on_connect_failure('Error during connect to %s:%s' % (self.server, self.port)) else: NonBlockingTransport.read_timeout(self) def set_timeout(self, timeout): if self.get_state() != DISCONNECTED and self.fd != -1: NonBlockingTransport.set_timeout(self, timeout) else: log.warning('set_timeout: TIMEOUT NOT SET: state is %s, fd is %s' % (self.get_state(), self.fd)) def remove_timeout(self): if self.fd: NonBlockingTransport.remove_timeout(self) else: log.warning('remove_timeout: no self.fd state is %s' % self.get_state()) def send(self, raw_data, now=False): """ Append raw_data to the queue of messages to be send. If supplied data is unicode string, encode it to utf-8. """ NonBlockingTransport.send(self, raw_data, now) if isinstance(raw_data, bytes): r = raw_data else: r = self.encode_stanza(raw_data) if now: self.sendqueue.insert(0, r) self._do_send() else: self.sendqueue.append(r) self._plug_idle(writable=True, readable=True) def encode_stanza(self, stanza): """ Encode str or unicode to utf-8 """ if isinstance(stanza, str): stanza = stanza.encode('utf-8') elif not isinstance(stanza, str): stanza = ustr(stanza).encode('utf-8') return stanza def _plug_idle(self, writable, readable): """ Plug file descriptor of socket to Idlequeue Plugged socket will be watched for "send possible" or/and "recv possible" events. pollin() callback is invoked on "recv possible", pollout() on "send_possible". Plugged socket will always be watched for "error" event - in that case, pollend() is called. """ log.info('Plugging fd %d, W:%s, R:%s' % (self.fd, writable, readable)) self.idlequeue.plug_idle(self, writable, readable) def _do_send(self): """ Called when send() to connected socket is possible. First message from sendqueue will be sent """ if not self.sendbuff: if not self.sendqueue: log.warning('calling send on empty buffer and queue') self._plug_idle(writable=False, readable=True) return None self.sendbuff = self.sendqueue.pop(0) try: send_count = self._send(self.sendbuff) if send_count: sent_data = self.sendbuff[:send_count] self.sendbuff = self.sendbuff[send_count:] self._plug_idle(writable=(self.sendqueue != []), readable=True) if self.sent_bytes_buff: sent_data = self.sent_bytes_buff + sent_data self.sent_bytes_buff = b'' # try to decode sent data try: sent_data = decode_py2(sent_data, 'utf-8') except UnicodeDecodeError: for i in range(-1, -4, -1): char = sent_data[i] if ord(char) & 0xc0 == 0xc0: self.sent_bytes_buff = sent_data[i:] sent_data = sent_data[:i] break sent_data = decode_py2(sent_data, 'utf-8') self.raise_event(DATA_SENT, sent_data) except Exception: log.error('_do_send:', exc_info=True) traceback.print_exc() self.disconnect() def _do_receive(self): """ Reads all pending incoming data. Will call owner's disconnected() method if appropriate """ received = None errnum = 0 errstr = 'No Error Set' try: # get as many bites, as possible, but not more than RECV_BUFSIZE received = self._recv(RECV_BUFSIZE) except tls_nb.SSLWrapper.Error as e: log.info("_do_receive, caught SSL error, got %s:" % received, exc_info=True) errnum, errstr = e.errno,\ decode_py2(e.strerror, locale.getpreferredencoding()) except socket.error as e: log.info("_do_receive: got %s:" % received, exc_info=True) if received == '': errstr = 'zero bytes on recv' if (self.ssl_lib is None and received == '') or \ (self.ssl_lib == tls_nb.PYSTDLIB and errnum == 8 ) or \ (self.ssl_lib == tls_nb.PYOPENSSL and errnum == -1 ): # 8 in stdlib: errstr == EOF occured in violation of protocol # -1 in pyopenssl: errstr == Unexpected EOF log.info("Disconnected by remote server: #%s, %s" % (errnum, errstr)) self.on_remote_disconnect() return if errnum: log.info("Connection to %s:%s lost: %s %s" % (self.server, self.port, errnum, errstr), exc_info=True) self.disconnect() return # this branch is for case of non-fatal SSL errors - None is returned from # recv() but no errnum is set if received is None: return # we have received some bytes, stop the timeout! self.remove_timeout() self.renew_send_timeout() self.renew_send_timeout2() if self.received_bytes_buff: received = self.received_bytes_buff + received self.received_bytes_buff = b'' if self.state != PROXY_CONNECTING or self.proxy_dict['type'] != \ 'socks5': # try to decode data try: received = decode_py2(received, 'utf-8') except UnicodeDecodeError: for i in range(-1, -4, -1): char = received[i] if sys.version_info[0] < 3: # with py2 we get a str char = ord(char) if char & 0xc0 == 0xc0: self.received_bytes_buff = received[i:] received = received[:i] break received = decode_py2(received, 'utf-8') # pass received data to owner if self.on_receive: self.raise_event(DATA_RECEIVED, received) self._on_receive(received) else: # This should never happen, so we need the debug. # (If there is no handler on receive specified, data is passed to # Dispatcher.ProcessNonBlocking) log.error('SOCKET %s Unhandled data received: %s' % (id(self), received)) self.disconnect() def _on_receive(self, data): """ Preceeds on_receive callback. It peels off and checks HTTP headers in HTTP classes, in here it just calls the callback """ self.on_receive(data) class NonBlockingHTTP(NonBlockingTCP): """ Socket wrapper that creates HTTP message out of sent data and peels-off HTTP headers from incoming messages """ def __init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, tls_version, cipher_list, on_http_request_possible, on_persistent_fallback, http_dict, proxy_dict=None): """ :param on_http_request_possible: method to call when HTTP request to socket owned by transport is possible. :param on_persistent_fallback: callback called when server ends TCP connection. It doesn't have to be fatal for HTTP session. :param http_dict: dictionary with data for HTTP request and headers """ NonBlockingTCP.__init__(self, raise_event, on_disconnect, idlequeue, estabilish_tls, certs, tls_version, cipher_list, False, proxy_dict) self.http_protocol, self.http_host, self.http_port, self.http_path = \ urisplit(http_dict['http_uri']) self.http_protocol = self.http_protocol or 'http' self.http_path = self.http_path or '/' self.http_version = http_dict['http_version'] self.http_persistent = http_dict['http_persistent'] self.add_proxy_headers = http_dict['add_proxy_headers'] if 'proxy_user' in http_dict and 'proxy_pass' in http_dict: self.proxy_user, self.proxy_pass = http_dict['proxy_user'], http_dict[ 'proxy_pass'] else: self.proxy_user, self.proxy_pass = None, None # buffer for partial responses self.recvbuff = '' self.expected_length = 0 self.pending_requests = 0 self.on_http_request_possible = on_http_request_possible self.last_recv_time = 0 self.close_current_connection = False self.on_remote_disconnect = lambda: on_persistent_fallback(self) def http_send(self, raw_data, now=False): self.send(self.build_http_message(raw_data), now) def _on_receive(self, data): """ Preceeds passing received data to owner class. Gets rid of HTTP headers and checks them. """ if self.get_state() == PROXY_CONNECTING: NonBlockingTCP._on_receive(self, data) return # append currently received data to HTTP msg in buffer self.recvbuff = '%s%s' % (self.recvbuff or '', data) statusline, headers, httpbody, buffer_rest = self.parse_http_message( self.recvbuff) if not (statusline and headers and httpbody): log.debug('Received incomplete HTTP response') return if statusline[1] != '200': log.error('HTTP Error: %s %s' % (statusline[1], statusline[2])) self.disconnect() return self.expected_length = int(headers['Content-Length']) if 'Connection' in headers and headers['Connection'].strip()=='close': self.close_current_connection = True if self.expected_length > len(httpbody.encode('utf-8')): # If we haven't received the whole HTTP mess yet, let's end the thread. # It will be finnished from one of following recvs on plugged socket. log.info('not enough bytes in HTTP response - %d expected, got %d' % (self.expected_length, len(httpbody.encode('utf-8')))) else: # First part of buffer has been extraced and is going to be handled, # remove it from buffer self.recvbuff = buffer_rest # everything was received self.expected_length = 0 if not self.http_persistent or self.close_current_connection: # not-persistent connections disconnect after response self.disconnect(do_callback=False) self.close_current_connection = False self.last_recv_time = time.time() self.on_receive(data=httpbody, socket=self) self.on_http_request_possible() def build_http_message(self, httpbody, method='POST'): """ Builds http message with given body. Values for headers and status line fields are taken from class variables """ headers = ['%s %s %s' % (method, self.http_path, self.http_version), 'Host: %s:%s' % (self.http_host, self.http_port), 'User-Agent: Gajim', 'Content-Type: text/xml; charset=utf-8', 'Content-Length: %s' % len(httpbody)] if self.add_proxy_headers: headers.append('Proxy-Connection: keep-alive') headers.append('Pragma: no-cache') if self.proxy_user and self.proxy_pass: credentials = '%s:%s' % (self.proxy_user, self.proxy_pass) credentials = base64.encodestring(credentials).strip() headers.append('Proxy-Authorization: Basic %s' % credentials) else: headers.append('Connection: Keep-Alive') headers.append('\r\n') headers = '\r\n'.join(headers) return b'%s%s' % (headers.encode('utf-8'), httpbody) def parse_http_message(self, message): """ Split http message into a tuple: - (statusline - list of e.g. ['HTTP/1.1', '200', 'OK'], - headers - dictionary of headers e.g. {'Content-Length': '604', 'Content-Type': 'text/xml; charset=utf-8'}, - httpbody - string with http body) - http_rest - what is left in the message after a full HTTP header + body """ splitted = message.split('\r\n\r\n') if len(splitted) < 2: # no complete http message. Keep filling the buffer until we find one buffer_rest = message return ('', '', '', buffer_rest) else: (header, httpbody) = splitted[:2] header = header.replace('\r', '') header = header.lstrip('\n') header = header.split('\n') statusline = header[0].split(' ', 2) header = header[1:] headers = {} for dummy in header: row = dummy.split(' ', 1) headers[row[0][:-1]] = row[1] body_size = int(headers['Content-Length']) rest_splitted = splitted[2:] while (len(httpbody) < body_size) and rest_splitted: # Complete httpbody until it has the announced size httpbody = '\n\n'.join([httpbody, rest_splitted.pop(0)]) buffer_rest = "\n\n".join(rest_splitted) return (statusline, headers, httpbody, buffer_rest) class NonBlockingHTTPBOSH(NonBlockingHTTP): """ Class for BOSH HTTP connections. Slightly redefines HTTP transport by calling bosh bodytag generating callback before putting data on wire """ def set_stanza_build_cb(self, build_cb): self.build_cb = build_cb def _do_send(self): if self.state == PROXY_CONNECTING: NonBlockingTCP._do_send(self) return if not self.sendbuff: stanza = self.build_cb(socket=self) stanza = self.encode_stanza(stanza) stanza = self.build_http_message(httpbody=stanza) self.sendbuff = stanza NonBlockingTCP._do_send(self) python-nbxmpp-nbxmpp-0.6.10/setup.py000077500000000000000000000004771343257752000174600ustar00rootroot00000000000000#!/usr/bin/env python from distutils.core import setup setup(name='nbxmpp', version='0.6.10', description='Non blocking Jabber/XMPP module', author='Yann Leboulanger', author_email='asterix@lagaule.org', url='http://dev.gajim.org/gajim/python-nbxmpp', packages=['nbxmpp'], ) python-nbxmpp-nbxmpp-0.6.10/test/000077500000000000000000000000001343257752000167125ustar00rootroot00000000000000python-nbxmpp-nbxmpp-0.6.10/test/lib/000077500000000000000000000000001343257752000174605ustar00rootroot00000000000000python-nbxmpp-nbxmpp-0.6.10/test/lib/__init__.py000066400000000000000000000021511343257752000215700ustar00rootroot00000000000000import sys import os import getopt root = os.path.join(os.path.abspath(os.path.dirname(__file__)), '../..') # look for modules in the CWD, then gajim/test/lib, then gajim/src, # then everywhere else sys.path.insert(1, root) sys.path.insert(1, root + '/test/lib') def xml2str_sorted(data): s = "<" + data.name if data.namespace: if not data.parent or data.parent.namespace!=data.namespace: if 'xmlns' not in data.attrs: s += ' xmlns="%s"' % data.namespace for key in sorted(data.attrs.keys()): val = str(data.attrs[key]) s += ' %s="%s"' % (key, val) s += ">" cnt = 0 if data.kids: for a in data.kids: if (len(data.data)-1) >= cnt: s += data.data[cnt] if isinstance(a, str): s += a.__str__() else: s += xml2str_sorted(a) cnt += 1 if (len(data.data)-1) >= cnt: s += data.data[cnt] if not data.kids and s.endswith('>'): s = s[:-1] + ' />' else: s += "" return s def setup_env(): pass python-nbxmpp-nbxmpp-0.6.10/test/lib/mock.py000066400000000000000000000372711343257752000207750ustar00rootroot00000000000000# # (c) Dave Kirby 2001 - 2005 # mock@thedeveloperscoach.com # # Original call interceptor and call assertion code by Phil Dawes (pdawes@users.sourceforge.net) # Call interceptor code enhanced by Bruce Cropley (cropleyb@yahoo.com.au) # # This Python module and associated files are released under the FreeBSD # license. Essentially, you can do what you like with it except pretend you wrote # it yourself. # # # Copyright (c) 2005, Dave Kirby # Copyright (c) 2009, Yann Leboulanger # # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # * Neither the name of this library nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # mock@thedeveloperscoach.com """ Mock object library for Python. Mock objects can be used when unit testing to remove a dependency on another production class. They are typically used when the dependency would either pull in lots of other classes, or significantly slow down the execution of the test. They are also used to create exceptional conditions that cannot otherwise be easily triggered in the class under test. """ __version__ = "0.1.0" # Added in Python 2.1 import inspect import re class MockInterfaceError(Exception): pass class Mock(object): """ The Mock class emulates any other class for testing purposes. All method calls are stored for later examination. """ def __init__(self, returnValues=None, realClass=None): """ The Mock class constructor takes a dictionary of method names and the values they return. Methods that are not in the returnValues dictionary will return None. You may also supply a class whose interface is being mocked. All calls will be checked to see if they appear in the original interface. Any calls to methods not appearing in the real class will raise a MockInterfaceError. Any calls that would fail due to non-matching parameter lists will also raise a MockInterfaceError. Both of these help to prevent the Mock class getting out of sync with the class it is Mocking. """ self.mockCalledMethods = {} self.mockAllCalledMethods = [] self.mockReturnValues = returnValues or {} self.mockExpectations = {} self.realClass = realClass self.realClassMethods = None if realClass: self.realClassMethods = dict(inspect.getmembers(realClass, inspect.isroutine)) for retMethod in self.mockReturnValues.keys(): if retMethod not in self.realClassMethods: raise MockInterfaceError("Return value supplied for method '%s' that was not in the original class" % retMethod) self._setupSubclassMethodInterceptors() def _setupSubclassMethodInterceptors(self): methods = inspect.getmembers(self.realClass, inspect.isroutine) baseMethods = dict(inspect.getmembers(Mock, inspect.ismethod)) for m in methods: name = m[0] # Don't record calls to methods of Mock base class. if not name in baseMethods: self.__dict__[name] = MockCallable(name, self, handcrafted=True) def __getattr__(self, name): return MockCallable(name, self) def mockAddReturnValues(self, **methodReturnValues ): self.mockReturnValues.update(methodReturnValues) def mockSetExpectation(self, name, testFn, after=0, until=0): self.mockExpectations.setdefault(name, []).append((testFn, after, until)) def _checkInterfaceCall(self, name, callParams, callKwParams): """ Check that a call to a method of the given name to the original class with the given parameters would not fail. If it would fail, raise a MockInterfaceError. Based on the Python 2.3.3 Reference Manual section 5.3.4: Calls. """ if self.realClassMethods is None: return if name not in self.realClassMethods: return func = self.realClassMethods[name] try: args, varargs, varkw, defaults = inspect.getargspec(func) except TypeError: # func is not a Python function. It is probably a builtin, # such as __repr__ or __coerce__. TODO: Checking? # For now assume params are OK. return # callParams doesn't include self; args does include self. numPosCallParams = 1 + len(callParams) if numPosCallParams > len(args) and not varargs: raise MockInterfaceError("Original %s() takes at most %s arguments (%s given)" % (name, len(args), numPosCallParams)) # Get the number of positional arguments that appear in the call, # also check for duplicate parameters and unknown parameters numPosSeen = _getNumPosSeenAndCheck(numPosCallParams, callKwParams, args, varkw) lenArgsNoDefaults = len(args) - len(defaults or []) if numPosSeen < lenArgsNoDefaults: raise MockInterfaceError("Original %s() takes at least %s arguments (%s given)" % (name, lenArgsNoDefaults, numPosSeen)) def mockGetAllCalls(self): """ Return a list of MockCall objects, representing all the methods in the order they were called. """ return self.mockAllCalledMethods getAllCalls = mockGetAllCalls # deprecated - kept for backward compatibility def mockGetNamedCalls(self, methodName): """ Return a list of MockCall objects, representing all the calls to the named method in the order they were called. """ return self.mockCalledMethods.get(methodName, []) getNamedCalls = mockGetNamedCalls # deprecated - kept for backward compatibility def mockCheckCall(self, index, name, *args, **kwargs): '''test that the index-th call had the specified name and parameters''' call = self.mockAllCalledMethods[index] assert name == call.getName(), "%r != %r" % (name, call.getName()) call.checkArgs(*args, **kwargs) def _getNumPosSeenAndCheck(numPosCallParams, callKwParams, args, varkw): """ Positional arguments can appear as call parameters either named as a named (keyword) parameter, or just as a value to be matched by position. Count the positional arguments that are given by either keyword or position, and check for duplicate specifications. Also check for arguments specified by keyword that do not appear in the method's parameter list. """ posSeen = {} for arg in args[:numPosCallParams]: posSeen[arg] = True for kwp in callKwParams: if kwp in posSeen: raise MockInterfaceError("%s appears as both a positional and named parameter." % kwp) if kwp in args: posSeen[kwp] = True elif not varkw: raise MockInterfaceError("Original method does not have a parameter '%s'" % kwp) return len(posSeen) class MockCall: """ MockCall records the name and parameters of a call to an instance of a Mock class. Instances of MockCall are created by the Mock class, but can be inspected later as part of the test. """ def __init__(self, name, params, kwparams ): self.name = name self.params = params self.kwparams = kwparams def checkArgs(self, *args, **kwargs): assert args == self.params, "%r != %r" % (args, self.params) assert kwargs == self.kwparams, "%r != %r" % (kwargs, self.kwparams) def getParam( self, n ): if isinstance(n, int): return self.params[n] elif isinstance(n, str): return self.kwparams[n] else: raise IndexError('illegal index type for getParam') def getNumParams(self): return len(self.params) def getNumKwParams(self): return len(self.kwparams) def getName(self): return self.name #pretty-print the method call def __str__(self): s = self.name + "(" sep = '' for p in self.params: s = s + sep + repr(p) sep = ', ' items = sorted(self.kwparams.items()) for k, v in items: s = s + sep + k + '=' + repr(v) sep = ', ' s = s + ')' return s def __repr__(self): return self.__str__() class MockCallable: """ Intercepts the call and records it, then delegates to either the mock's dictionary of mock return values that was passed in to the constructor, or a handcrafted method of a Mock subclass. """ def __init__(self, name, mock, handcrafted=False): self.name = name self.mock = mock self.handcrafted = handcrafted def __call__(self, *params, **kwparams): self.mock._checkInterfaceCall(self.name, params, kwparams) thisCall = self.recordCall(params, kwparams) self.checkExpectations(thisCall, params, kwparams) return self.makeCall(params, kwparams) def recordCall(self, params, kwparams): """ Record the MockCall in an ordered list of all calls, and an ordered list of calls for that method name. """ thisCall = MockCall(self.name, params, kwparams) calls = self.mock.mockCalledMethods.setdefault(self.name, []) calls.append(thisCall) self.mock.mockAllCalledMethods.append(thisCall) return thisCall def makeCall(self, params, kwparams): if self.handcrafted: allPosParams = (self.mock,) + params func = _findFunc(self.mock.realClass, self.name) if not func: raise NotImplementedError return func(*allPosParams, **kwparams) else: returnVal = self.mock.mockReturnValues.get(self.name) if isinstance(returnVal, ReturnValuesBase): returnVal = returnVal.next() return returnVal def checkExpectations(self, thisCall, params, kwparams): if self.name in self.mock.mockExpectations: callsMade = len(self.mock.mockCalledMethods[self.name]) for (expectation, after, until) in self.mock.mockExpectations[self.name]: if callsMade > after and (until==0 or callsMade < until): assert expectation(self.mock, thisCall, len(self.mock.mockAllCalledMethods)-1), 'Expectation failed: '+str(thisCall) def _findFunc(cl, name): """ Depth first search for a method with a given name. """ if name in cl.__dict__: return cl.__dict__[name] for base in cl.__bases__: func = _findFunc(base, name) if func: return func return None class ReturnValuesBase: def next(self): try: return self.iter.next() except StopIteration: raise AssertionError("No more return values") def __iter__(self): return self class ReturnValues(ReturnValuesBase): def __init__(self, *values): self.iter = iter(values) class ReturnIterator(ReturnValuesBase): def __init__(self, iterator): self.iter = iter(iterator) def expectParams(*params, **keywords): '''check that the callObj is called with specified params and keywords ''' def fn(mockObj, callObj, idx): return callObj.params == params and callObj.kwparams == keywords return fn def expectAfter(*methods): '''check that the function is only called after all the functions in 'methods' ''' def fn(mockObj, callObj, idx): calledMethods = [method.getName() for method in mockObj.mockGetAllCalls()] #skip last entry, since that is the current call calledMethods = calledMethods[:-1] for method in methods: if method not in calledMethods: return False return True return fn def expectException(exception, *args, **kwargs): ''' raise an exception when the method is called ''' def fn(mockObj, callObj, idx): raise exception(*args, **kwargs) return fn def expectParam(paramIdx, cond): '''check that the callObj is called with parameter specified by paramIdx (a position index or keyword) fulfills the condition specified by cond. cond is a function that takes a single argument, the value to test. ''' def fn(mockObj, callObj, idx): param = callObj.getParam(paramIdx) return cond(param) return fn def EQ(value): def testFn(param): return param == value return testFn def NE(value): def testFn(param): return param != value return testFn def GT(value): def testFn(param): return param > value return testFn def LT(value): def testFn(param): return param < value return testFn def GE(value): def testFn(param): return param >= value return testFn def LE(value): def testFn(param): return param <= value return testFn def AND(*condlist): def testFn(param): for cond in condlist: if not cond(param): return False return True return testFn def OR(*condlist): def testFn(param): for cond in condlist: if cond(param): return True return False return testFn def NOT(cond): def testFn(param): return not cond(param) return testFn def MATCHES(regex, *args, **kwargs): compiled_regex = re.compile(regex, *args, **kwargs) def testFn(param): return compiled_regex.match(param) is not None return testFn def SEQ(*sequence): iterator = iter(sequence) def testFn(param): try: cond = iterator.next() except StopIteration: raise AssertionError('SEQ exhausted') return cond(param) return testFn def IS(instance): def testFn(param): return param is instance return testFn def ISINSTANCE(class_): def testFn(param): return isinstance(param, class_) return testFn def ISSUBCLASS(class_): def testFn(param): return issubclass(param, class_) return testFn def CONTAINS(val): def testFn(param): return val in param return testFn def IN(container): def testFn(param): return param in container return testFn def HASATTR(attr): def testFn(param): return hasattr(param, attr) return testFn def HASMETHOD(method): def testFn(param): return hasattr(param, method) and callable(getattr(param, method)) return testFn CALLABLE = callable python-nbxmpp-nbxmpp-0.6.10/test/lib/xmpp_mocks.py000066400000000000000000000052111343257752000222110ustar00rootroot00000000000000''' Module with dummy classes for unit testing of XMPP and related code. ''' import threading, time from mock import Mock from nbxmpp import idlequeue IDLEQUEUE_INTERVAL = 0.2 # polling interval. 200ms is used in Gajim as default IDLEMOCK_TIMEOUT = 30 # how long we wait for an event class IdleQueueThread(threading.Thread): ''' Thread for regular processing of idlequeue. ''' def __init__(self): self.iq = idlequeue.SelectIdleQueue() self.stop = threading.Event() # Event to stop the thread main loop. self.stop.clear() threading.Thread.__init__(self) def run(self): while not self.stop.isSet(): self.iq.process() time.sleep(IDLEQUEUE_INTERVAL) def stop_thread(self): self.stop.set() class IdleMock: ''' Serves as template for testing objects that are normally controlled by GUI. Allows to wait for asynchronous callbacks with wait() method. ''' def __init__(self): self._event = threading.Event() self._event.clear() def wait(self): ''' Block until some callback sets the event and clearing the event subsequently. Returns True if event was set, False on timeout ''' self._event.wait(IDLEMOCK_TIMEOUT) if self._event.isSet(): self._event.clear() return True else: return False def set_event(self): self._event.set() class MockConnection(IdleMock, Mock): ''' Class simulating Connection class from src/common/connection.py It is derived from Mock in order to avoid defining all methods from real Connection that are called from NBClient or Dispatcher ( _event_dispatcher for example) ''' def __init__(self, *args): self.connect_succeeded = True IdleMock.__init__(self) Mock.__init__(self, *args) def on_connect(self, success, *args): ''' Method called after connecting - after receiving from server (NOT after TLS stream restart) or connect failure ''' self.connect_succeeded = success self.set_event() def on_auth(self, con, auth): ''' Method called after authentication, regardless of the result. :Parameters: con : NonBlockingClient reference to authenticated object auth : string type of authetication in case of success ('old_auth', 'sasl') or None in case of auth failure ''' self.auth_connection = con self.auth = auth self.set_event() python-nbxmpp-nbxmpp-0.6.10/test/runtests.py000077500000000000000000000024631343257752000211630ustar00rootroot00000000000000#!/usr/bin/env python3 ''' Runs python-nbxmpp's Test Suite Unit tests tests will be run on each commit. ''' from __future__ import print_function import sys import unittest import getopt verbose = 1 try: shortargs = 'hv:' longargs = 'help verbose=' opts, args = getopt.getopt(sys.argv[1:], shortargs, longargs.split()) except getopt.error as msg: print(msg) print('for help use --help') sys.exit(2) for o, a in opts: if o in ('-h', '--help'): print('runtests [--help] [--verbose level]') sys.exit() elif o in ('-v', '--verbose'): try: verbose = int(a) except Exception: print('verbose must be a number >= 0') sys.exit(2) # new test modules need to be added manually modules = ( 'unit.test_xmpp_dispatcher_nb', 'unit.test_xmpp_transports_nb', 'unit.test_xmpp_smacks', #'unit.test_xmpp_client_nb', gajim.org only supports TLS/SSL connections 'unit.test_xmpp_transports_nb2', ) nb_errors = 0 nb_failures = 0 for mod in modules: suite = unittest.defaultTestLoader.loadTestsFromName(mod) result = unittest.TextTestRunner(verbosity=verbose).run(suite) nb_errors += len(result.errors) nb_failures += len(result.failures) sys.exit(nb_errors + nb_failures) python-nbxmpp-nbxmpp-0.6.10/test/unit/000077500000000000000000000000001343257752000176715ustar00rootroot00000000000000python-nbxmpp-nbxmpp-0.6.10/test/unit/__init__.py000066400000000000000000000000661343257752000220040ustar00rootroot00000000000000''' This package just contains plain unit tests ''' python-nbxmpp-nbxmpp-0.6.10/test/unit/test_xmpp_client_nb.py000066400000000000000000000133411343257752000243050ustar00rootroot00000000000000''' Testing script for NonBlockingClient class (src/common/xmpp/client_nb.py) It actually connects to a xmpp server. ''' import unittest import lib lib.setup_env() from xmpp_mocks import MockConnection, IdleQueueThread from mock import Mock from nbxmpp import client_nb # (XMPP server hostname, c2s port). Script will connect to the machine. xmpp_server_port = ('gajim.org', 5222) # [username, password, resource]. Script will authenticate to server above credentials = ['unittest', 'testtest', 'res'] class TestNonBlockingClient(unittest.TestCase): ''' Test Cases class for NonBlockingClient. ''' def setUp(self): ''' IdleQueue thread is run and dummy connection is created. ''' self.idlequeue_thread = IdleQueueThread() self.connection = MockConnection() # for dummy callbacks self.idlequeue_thread.start() def tearDown(self): ''' IdleQueue thread is stopped. ''' self.idlequeue_thread.stop_thread() self.idlequeue_thread.join() del self.connection self.client = None def open_stream(self, server_port, wrong_pass=False): ''' Method opening the XMPP connection. It returns when is received from server. :param server_port: tuple of (hostname, port) for where the client should connect. ''' class TempConnection(): def get_password(self, cb, mechanism): if wrong_pass: cb('wrong pass') else: cb(credentials[1]) def on_connect_failure(self): pass self.client = client_nb.NonBlockingClient( domain=server_port[0], idlequeue=self.idlequeue_thread.iq, caller=Mock(realClass=TempConnection)) self.client.connect( hostname=server_port[0], port=server_port[1], on_connect=lambda *args: self.connection.on_connect(True, *args), on_connect_failure=lambda *args: self.connection.on_connect( False, *args)) self.assert_(self.connection.wait(), msg='waiting for callback from client constructor') # if on_connect was called, client has to be connected and vice versa if self.connection.connect_succeeded: self.assert_(self.client.get_connect_type()) else: self.assert_(not self.client.get_connect_type()) def client_auth(self, username, password, resource, sasl): ''' Method authenticating connected client with supplied credentials. Returns when authentication is over. :param sasl: whether to use sasl (sasl=1) or old (sasl=0) authentication :todo: to check and be more specific about when it returns (bind, session..) ''' self.client.auth(username, password, resource, sasl, on_auth=self.connection.on_auth) self.assert_(self.connection.wait(), msg='waiting for authentication') def do_disconnect(self): ''' Does disconnecting of connected client. Returns when TCP connection is closed. ''' self.client.RegisterDisconnectHandler(self.connection.set_event) self.client.disconnect() self.assertTrue(self.connection.wait(), msg='waiting for disconnecting') def test_proper_connect_sasl(self): ''' The ideal testcase - client is connected, authenticated with SASL and then disconnected. ''' self.open_stream(xmpp_server_port) # if client is not connected, lets raise the AssertionError self.assert_(self.client.get_connect_type()) # client.disconnect() is already called from NBClient via # _on_connected_failure, no need to call it here self.client_auth(credentials[0], credentials[1], credentials[2], sasl=1) self.assert_(self.connection.con) self.assert_(self.connection.auth=='sasl', msg='Unable to auth via SASL') self.do_disconnect() def test_proper_connect_oldauth(self): ''' The ideal testcase - client is connected, authenticated with old auth and then disconnected. ''' self.open_stream(xmpp_server_port) self.assert_(self.client.get_connect_type()) self.client_auth(credentials[0], credentials[1], credentials[2], sasl=0) self.assert_(self.connection.con) features = self.client.Dispatcher.Stream.features if not features.getTag('auth'): print "Server doesn't support old authentication type, ignoring test" else: self.assert_(self.connection.auth=='old_auth', msg='Unable to auth via old_auth') self.do_disconnect() def test_connect_to_nonexisting_host(self): ''' Connect to nonexisting host. DNS request for A records should return nothing. ''' self.open_stream(('fdsfsdf.fdsf.fss', 5222)) self.assert_(not self.client.get_connect_type()) def test_connect_to_wrong_port(self): ''' Connect to nonexisting server. DNS request for A records should return an IP but there shouldn't be XMPP server running on specified port. ''' self.open_stream((xmpp_server_port[0], 31337)) self.assert_(not self.client.get_connect_type()) def test_connect_with_wrong_creds(self): ''' Connecting with invalid password. ''' self.open_stream(xmpp_server_port, wrong_pass=True) self.assert_(self.client.get_connect_type()) self.client_auth(credentials[0], 'wrong pass', credentials[2], sasl=1) self.assert_(self.connection.auth is None) self.do_disconnect() python-nbxmpp-nbxmpp-0.6.10/test/unit/test_xmpp_dispatcher_nb.py000066400000000000000000000072311343257752000251560ustar00rootroot00000000000000''' Tests for dispatcher_nb.py ''' import unittest import lib lib.setup_env() from mock import Mock from nbxmpp import dispatcher_nb from nbxmpp import protocol class TestDispatcherNB(unittest.TestCase): ''' Test class for NonBlocking dispatcher. Tested dispatcher will be plugged into a mock client ''' def setUp(self): self.dispatcher = dispatcher_nb.XMPPDispatcher() # Setup mock client self.client = Mock() self.client.__str__ = lambda: 'Mock' # FIXME: why do I need this one? self.client._caller = Mock() self.client.defaultNamespace = protocol.NS_CLIENT self.client.Connection = Mock() # mock transport self.con = self.client.Connection def tearDown(self): # Unplug if needed if hasattr(self.dispatcher, '_owner'): self.dispatcher.PlugOut() def _simulate_connect(self): self.dispatcher.PlugIn(self.client) # client is owner # Simulate that we have established a connection self.dispatcher.StreamInit() self.dispatcher.ProcessNonBlocking("") def test_unbound_namespace_prefix(self): '''tests our handling of a message with an unbound namespace prefix''' self._simulate_connect() msgs = [] def _got_message(conn, msg): msgs.append(msg) self.dispatcher.RegisterHandler('message', _got_message) # should be able to parse a normal message self.dispatcher.ProcessNonBlocking('hello') self.assertEqual(1, len(msgs)) self.dispatcher.ProcessNonBlocking('') self.assertEqual(2, len(msgs)) # we should not have been disconnected after that message self.assertEqual(0, len(self.con.mockGetNamedCalls('pollend'))) self.assertEqual(0, len(self.con.mockGetNamedCalls('disconnect'))) # we should be able to keep parsing self.dispatcher.ProcessNonBlocking('still here?') self.assertEqual(3, len(msgs)) def test_process_non_blocking(self): ''' Check for ProcessNonBlocking return types ''' self._simulate_connect() process = self.dispatcher.ProcessNonBlocking # length of data expected data = "Please don't fail" result = process(data) self.assertEqual(result, len(data)) # no data processed, link shall still be active result = process('') self.assertEqual(result, '0') self.assertEqual(0, len(self.con.mockGetNamedCalls('pollend')) + len(self.con.mockGetNamedCalls('disconnect'))) # simulate disconnect result = process('') self.assertEqual(1, len(self.client.mockGetNamedCalls('disconnect'))) def test_return_stanza_handler(self): ''' Test sasl_error_conditions transformation in protocol.py ''' # quick'n dirty...I wasn't aware of it existance and thought it would # always fail :-) self._simulate_connect() stanza = "" def send(data): self.assertEqual(lib.xml2str_sorted(data), 'The feature requested is not implemented by the recipient or server and therefore cannot be processed.') self.client.send = send self.dispatcher.ProcessNonBlocking(stanza) if __name__ == '__main__': unittest.main() python-nbxmpp-nbxmpp-0.6.10/test/unit/test_xmpp_smacks.py000066400000000000000000000111551343257752000236320ustar00rootroot00000000000000''' Tests for smacks.py Stream Management ''' import unittest import lib lib.setup_env() from mock import Mock from nbxmpp import dispatcher_nb from nbxmpp import protocol from nbxmpp import smacks class TestDispatcherNB(unittest.TestCase): ''' Test class for NonBlocking dispatcher. Tested dispatcher will be plugged into a mock client ''' def setUp(self): self.dispatcher = dispatcher_nb.XMPPDispatcher() # Setup mock client self.client = Mock() self.client.__str__ = lambda: 'Mock' # FIXME: why do I need this one? self.client._caller = Mock() self.client.defaultNamespace = protocol.NS_CLIENT self.client.Connection = Mock() # mock transport self.con = self.client.Connection self.con.sm = smacks.Smacks(self.con) def tearDown(self): # Unplug if needed if hasattr(self.dispatcher, '_owner'): self.dispatcher.PlugOut() def _simulate_connect(self): self.dispatcher.PlugIn(self.client) # client is owner self.con.sm.set_owner(self.client) self.dispatcher.sm = self.con.sm # Simulate that we have established a connection self.dispatcher.StreamInit() self.dispatcher.ProcessNonBlocking("") self.dispatcher.ProcessNonBlocking(" " " ") self.con.sm.negociate() self.dispatcher.ProcessNonBlocking("") assert(self.con.sm.enabled) def _simulate_resume(self): self.con.sm.resume_request() # Resuming acknowledging 5 stanzas self.dispatcher.ProcessNonBlocking("") assert(self.con.sm.resuming) def _send(self, send, r, stanza): for i in range(r): send(stanza) def test_messages(self): message = 'Helloo ' iq = ''' ''' presence = ''' 24 In love Kakashi Sensei :P db4b7c52e39ba28562c74542d5988d47f09108a3 ''' self._simulate_connect() uqueue = self.con.sm.uqueue self.assertEqual(self.con.sm.out_h, 0) self.assertEqual(self.con.sm.in_h, 0) # The server sends 10 stanzas self._send(self.dispatcher.ProcessNonBlocking, 5, message) self._send(self.dispatcher.ProcessNonBlocking, 4, iq) self._send(self.dispatcher.ProcessNonBlocking, 1, presence) # The client has recieved 10 stanzas and sent none self.assertEqual(self.con.sm.in_h, 10) self.assertEqual(self.con.sm.out_h, 0) m = protocol.Message() # The client sends 10 stanzas for i in range(10): m = protocol.Message(body=str(i)) self.dispatcher.send(m) # Client sends 10 stanzas and put them in the queue self.assertEqual(self.con.sm.out_h, 10) self.assertEqual(len(uqueue), 10) # The server acknowledges that it recieved 5 stanzas self.dispatcher.ProcessNonBlocking("
") # 5 stanzas are removed from the queue, only 5 stanzas are left self.assertEqual(len(uqueue), 5) # Check for the right order of stanzas in the queue l = ['5', '6', '7', '8', '9'] for i in uqueue: self.assertEqual(i.getBody(), l[0]) l.pop(0) def test_resumption(self): self._simulate_connect() m = protocol.Message() # The client sends 5 stanzas for i in range(5): m = protocol.Message(body=str(i)) self.dispatcher.send(m) self._simulate_resume() # No stanzas left self.assertEqual(len(self.con.sm.uqueue), 0) if __name__ == '__main__': unittest.main() python-nbxmpp-nbxmpp-0.6.10/test/unit/test_xmpp_transports_nb.py000066400000000000000000000064221343257752000252500ustar00rootroot00000000000000''' Unit test for tranports classes. ''' import unittest import lib lib.setup_env() from nbxmpp import transports_nb class TestModuleLevelFunctions(unittest.TestCase): ''' Test class for functions defined at module level ''' def test_urisplit(self): def check_uri(uri, proto, host, port, path): _proto, _host, _port, _path = transports_nb.urisplit(uri) self.assertEqual(proto, _proto) self.assertEqual(host, _host) self.assertEqual(path, _path) self.assertEqual(port, _port) check_uri('http://httpcm.jabber.org:5280/webclient', proto='http', host='httpcm.jabber.org', port=5280, path='/webclient') check_uri('http://httpcm.jabber.org/webclient', proto='http', host='httpcm.jabber.org', port=80, path='/webclient') check_uri('https://httpcm.jabber.org/webclient', proto='https', host='httpcm.jabber.org', port=443, path='/webclient') def test_get_proxy_data_from_dict(self): def check_dict(proxy_dict, host, port, user, passwd): _host, _port, _user, _passwd = transports_nb.get_proxy_data_from_dict( proxy_dict) self.assertEqual(_host, host) self.assertEqual(_port, port) self.assertEqual(_user, user) self.assertEqual(_passwd, passwd) bosh_dict = {'bosh_content': u'text/xml; charset=utf-8', 'bosh_hold': 2, 'bosh_http_pipelining': False, 'bosh_uri': u'http://gajim.org:5280/http-bind', 'bosh_useproxy': False, 'bosh_wait': 30, 'bosh_wait_for_restart_response': False, 'host': u'172.16.99.11', 'pass': u'pass', 'port': 3128, 'type': u'bosh', 'useauth': True, 'user': u'user'} check_dict(bosh_dict, host=u'gajim.org', port=5280, user=u'user', passwd=u'pass') proxy_dict = {'bosh_content': u'text/xml; charset=utf-8', 'bosh_hold': 2, 'bosh_http_pipelining': False, 'bosh_port': 5280, 'bosh_uri': u'', 'bosh_useproxy': True, 'bosh_wait': 30, 'bosh_wait_for_restart_response': False, 'host': u'172.16.99.11', 'pass': u'pass', 'port': 3128, 'type': 'socks5', 'useauth': True, 'user': u'user'} check_dict(proxy_dict, host=u'172.16.99.11', port=3128, user=u'user', passwd=u'pass') if __name__ == '__main__': unittest.main() python-nbxmpp-nbxmpp-0.6.10/test/unit/test_xmpp_transports_nb2.py000066400000000000000000000247731343257752000253430ustar00rootroot00000000000000''' Integration test for tranports classes. See unit for the ordinary unit tests of this module. ''' import unittest import socket import lib lib.setup_env() from xmpp_mocks import IdleQueueThread, IdleMock from nbxmpp import transports_nb class AbstractTransportTest(unittest.TestCase): ''' Encapsulates Idlequeue instantiation for transports and more...''' def setUp(self): ''' IdleQueue thread is run and dummy connection is created. ''' self.idlequeue_thread = IdleQueueThread() self.idlequeue_thread.start() self._setup_hook() def tearDown(self): ''' IdleQueue thread is stopped. ''' self._teardown_hook() self.idlequeue_thread.stop_thread() self.idlequeue_thread.join() def _setup_hook(self): pass def _teardown_hook(self): pass def expect_receive(self, expected, count=1, msg=None): ''' Returns a callback function that will assert whether the data passed to it equals the one specified when calling this function. Can be used to make sure transport dispatch correct data. ''' def receive(data, *args, **kwargs): self.assertEqual(data, expected, msg=msg) self._expected_count -= 1 self._expected_count = count return receive def have_received_expected(self): ''' Plays together with expect_receive(). Will return true if expected_rcv callback was called as often as specified ''' return self._expected_count == 0 class TestNonBlockingTCP(AbstractTransportTest): ''' Test class for NonBlockingTCP. Will actually try to connect to an existing XMPP server. ''' class MockClient(IdleMock): ''' Simple client to test transport functionality ''' def __init__(self, idlequeue, testcase): self.idlequeue = idlequeue self.testcase = testcase IdleMock.__init__(self) def do_connect(self, establish_tls=False, proxy_dict=None): try: ips = socket.getaddrinfo('gajim.org', 5222, socket.AF_UNSPEC, socket.SOCK_STREAM) ip = ips[0] except socket.error as e: self.testcase.fail(msg=str(e)) self.socket = transports_nb.NonBlockingTCP( raise_event=lambda event_type, data: self.testcase.assertTrue( event_type and data), on_disconnect=lambda: self.on_success(mode='SocketDisconnect'), idlequeue=self.idlequeue, estabilish_tls=establish_tls, certs=('../data/other/cacerts.pem', 'tmp/cacerts.pem'), tls_version=None, cipher_list=None, alpn=True, proxy_dict=proxy_dict) self.socket.PlugIn(self) self.socket.connect(conn_5tuple=ip, on_connect=lambda: self.on_success(mode='TCPconnect'), on_connect_failure=self.on_failure) self.testcase.assertTrue(self.wait(), msg='Connection timed out') def do_disconnect(self): self.socket.disconnect() self.testcase.assertTrue(self.wait(), msg='Disconnect timed out') def on_failure(self, err_message): self.set_event() self.testcase.fail(msg=err_message) def on_success(self, mode, data=None): if mode == "TCPconnect": pass if mode == "SocketDisconnect": pass self.set_event() def _setup_hook(self): self.client = self.MockClient(idlequeue=self.idlequeue_thread.iq, testcase=self) def _teardown_hook(self): if self.client.socket.state == 'CONNECTED': self.client.do_disconnect() def test_connect_disconnect_plain(self): ''' Establish plain connection ''' self.client.do_connect(establish_tls=False) self.assertEquals(self.client.socket.state, 'CONNECTED') self.client.do_disconnect() self.assertEquals(self.client.socket.state, 'DISCONNECTED') # def test_connect_disconnect_ssl(self): # ''' Establish SSL (not TLS) connection ''' # self.client.do_connect(establish_tls=True) # self.assertEquals(self.client.socket.state, 'CONNECTED') # self.client.do_disconnect() # self.assertEquals(self.client.socket.state, 'DISCONNECTED') def test_do_receive(self): ''' Test _do_receive method by overwriting socket.recv ''' self.client.do_connect() sock = self.client.socket # transport shall receive data data = "Please don't fail" sock._recv = lambda buffer: data sock.onreceive(self.expect_receive(data)) sock._do_receive() self.assertTrue(self.have_received_expected(), msg='Did not receive data') self.assert_(self.client.socket.state == 'CONNECTED') # transport shall do nothing as an non-fatal SSL is simulated sock._recv = lambda buffer: None sock.onreceive(self.assertFalse) # we did not receive anything... sock._do_receive() self.assert_(self.client.socket.state == 'CONNECTED') # transport shall disconnect as remote side closed the connection sock._recv = lambda buffer: '' sock.onreceive(self.assertFalse) # we did not receive anything... sock._do_receive() self.assert_(self.client.socket.state == 'DISCONNECTED') def test_do_send(self): ''' Test _do_send method by overwriting socket.send ''' self.client.do_connect() sock = self.client.socket outgoing = [] # what we have actually send to our socket.socket data_part1 = "Please don't " data_part2 = "fail!" data_complete = data_part1 + data_part2 # Simulate everything could be send in one go def _send_all(data): outgoing.append(data) return len(data) sock._send = _send_all sock.send(data_part1) sock.send(data_part2) sock._do_send() sock._do_send() self.assertTrue(self.client.socket.state == 'CONNECTED') self.assertTrue(data_part1.encode('utf8') in outgoing) self.assertTrue(data_part2.encode('utf8') in outgoing) self.assertFalse(sock.sendqueue and sock.sendbuff, msg='There is still unsend data in buffers') # Simulate data could only be sent in chunks self.chunk_count = 0 outgoing = [] def _send_chunks(data): if self.chunk_count == 0: outgoing.append(data_part1) self.chunk_count += 1 return len(data_part1) else: outgoing.append(data_part2) return len(data_part2) sock._send = _send_chunks sock.send(data_complete) sock._do_send() # process first chunk sock._do_send() # process the second one self.assertTrue(self.client.socket.state == 'CONNECTED') self.assertTrue(data_part1 in outgoing and data_part2 in outgoing) self.assertFalse(sock.sendqueue and sock.sendbuff, msg='There is still unsend data in buffers') class TestNonBlockingHTTP(AbstractTransportTest): ''' Test class for NonBlockingHTTP transport''' bosh_http_dict = { 'http_uri': 'http://gajim.org:5280/http-bind', 'http_version': 'HTTP/1.1', 'http_persistent': True, 'add_proxy_headers': False } def _get_transport(self, http_dict, proxy_dict=None): return transports_nb.NonBlockingHTTP( raise_event=None, on_disconnect=None, idlequeue=self.idlequeue_thread.iq, estabilish_tls=False, certs=None, tls_version=None, cipher_list=None, on_http_request_possible=lambda: None, on_persistent_fallback=None, http_dict=http_dict, proxy_dict=proxy_dict, ) def test_parse_own_http_message(self): ''' Build a HTTP message and try to parse it afterwards ''' transport = self._get_transport(self.bosh_http_dict) data = "Please don't fail!" http_message = transport.build_http_message(data.encode('utf-8')) statusline, headers, http_body, buffer_rest = \ transport.parse_http_message(http_message.decode('utf-8')) self.assertFalse(bool(buffer_rest)) self.assertTrue(statusline and isinstance(statusline, list)) self.assertTrue(headers and isinstance(headers, dict)) self.assertEqual(data, http_body, msg='Input and output are different') def test_receive_http_message(self): ''' Let _on_receive handle some http messages ''' transport = self._get_transport(self.bosh_http_dict) header = ("HTTP/1.1 200 OK\r\nContent-Type: text/xml; charset=utf-8\r\n" + "Content-Length: 88\r\n\r\n") payload = "Please don't fail!" body = "%s" \ % payload message = "%s%s" % (header, body) # try to receive in one go transport.onreceive(self.expect_receive(body, msg='Failed: In one go')) transport._on_receive(message) self.assertTrue(self.have_received_expected(), msg='Failed: In one go') def test_receive_http_message_in_chunks(self): ''' Let _on_receive handle some chunked http messages ''' transport = self._get_transport(self.bosh_http_dict) payload = "Please don't fail!\n\n" body = "%s" \ % payload header = "HTTP/1.1 200 OK\r\nContent-Type: text/xml; charset=utf-8\r\n" +\ "Content-Length: %i\r\n\r\n" % len(body) message = "%s%s" % (header, body) chunk1, chunk2, chunk3, chunk4 = message[:20], message[20:73], \ message[73:85], message[85:] nextmessage_chunk = "HTTP/1.1 200 OK\r\nContent-Type: text/x" chunks = (chunk1, chunk2, chunk3, chunk4, nextmessage_chunk) transport.onreceive(self.expect_receive(body, msg='Failed: In chunks')) for chunk in chunks: transport._on_receive(chunk) self.assertTrue(self.have_received_expected(), msg='Failed: In chunks') if __name__ == '__main__': unittest.main()