python-ilorest-4.8.0.0/0000755000175000017500000000000014556457137014562 5ustar carstencarstenpython-ilorest-4.8.0.0/test_build_drone.yml0000644000175000017500000001310014556457137020625 0ustar carstencarstenkind: pipeline name: Redfish_Library_Drone_Test steps: - name: Github_Analyzer image: python:3.7.2-alpine3.8 pull: true volumes: - name: drone_store path: /tmp/store - name: drone_slate path: /tmp/slate environment: HTTP_PROXY: http://web-proxy.houston.hpecorp.net:8080 GITHUB_USERNAME: from_secret: github_username GITHUB_PASSWORD: from_secret: github_password DRONE_STORE_PATH: /tmp/store/ SLATE_SHARE_PATH: /tmp/slate/ DOCS: 'library' commands: - easy_install distribute - apk add git - echo $(git --version) - pip install --upgrade pip - pip install -U sphinx - pip install sphinxcontrib.restbuilder jsonpatch jsonpath_rw - python /tmp/store/drone_pr_selector_data_gatherer.py - more tmp.json trigger: event: exclude: -push - name: RIS-library-Tester-2.7 image: python:2.7 pull: true volumes: - name: drone_store path: /tmp/store environment: HTTP_PROXY: http://web-proxy.houston.hpecorp.net:8080 PYTHON: 27 GITHUB_USERNAME: from_secret: github_username GITHUB_PASSWORD: from_secret: github_password DRONE_STORE_PATH: /tmp/store/ PYTYPE_CONFIG: tests/pytype/pytype.cfg REPO_OWNER: intelligent-provisioning REPO_NAME: python-redfish-library PYTYPE_DIR: redfish #LIBRARY: "http://github.hpe.com/intelligent-provisioning/python-redfish-library.git" RESULTS_URL: http://infinitymaster.us.rdlabs.hpecorp.net:1051/Drone_Git_Build_Data/ PYLINT: true UNIT_TEST: true commands: - easy_install distribute - echo "python_version = 2.7" >> tests/pytype/pytype.cfg - more tests/pytype/pytype.cfg - echo "Upgrading Pip" - pip install --upgrade pip - echo "Installing Python iLORest Library" - python setup.py sdist --formats=zip - pip install --upgrade dist/python-ilorest-library-*.zip - echo "Installing Test Libraries" - pip install --upgrade pip - pip install pylint pytest pytest-logging mock requests ntplib datetime pytz pytype inspect-it future six #- echo "Installing Library Requirements" #- pip install redfish #- pip install -r requirements.txt #- python /tmp/store/libs_parse_installer.py - echo "Running Analysis" - python /tmp/store/drone_analyzer.py - more tmp.json # --cov=./src/extensions/* # --html=./tests/ilorest_tests/_results/tests/index.html \ # --cov-report=html:./test/ilorest_tests/_results/py2/coverage \ # --junit-xml=./tests/ilorest_tests/_results/py2/test-results.xml \ # --cov-report=html:./tests/ilorest_tests/_results/py2/coverage.xml #- cat ./tests/pmemtests/_results/data/pylint-results.txt #- cat ./tests/pmemtests/_results/data/pylint-py3-results.txt #- echo $rc2 # fatal=1 | error=2 | usage error=32 #- exit $(( $rc & 35 )) - name: RIS-library-Tester-3.5 image: python:3.5 pull: true volumes: - name: drone_store path: /tmp/store environment: HTTP_PROXY: http://web-proxy.houston.hpecorp.net:8080 PYTHON: 35 GITHUB_USERNAME: from_secret: github_username GITHUB_PASSWORD: from_secret: github_password RESTLAX_FILE_PATH: /tmp/store/Restlax_web.txt DRONE_STORE_PATH: /tmp/store/ PYTYPE_CONFIG: tests/pytype/pytype.cfg REPO_OWNER: intelligent-provisioning REPO_NAME: python-redfish-library PYTYPE_DIR: redfish #LIBRARY: "http://github.hpe.com/intelligent-provisioning/python-redfish-library.git" RESULTS_URL: http://infinitymaster.us.rdlabs.hpecorp.net:1051/Drone_Git_Build_Data/ PYLINT: true UNIT_TEST: true commands: - echo "python_version = 3.5" >> tests/pytype/pytype.cfg - more tests/pytype/pytype.cfg - echo "Upgrading Pip" - pip install --upgrade pip - echo "Installing Python iLORest Library" #easier to reference packages by installing the library - python setup.py sdist --formats=zip - pip install --upgrade dist/python-ilorest-library-*.zip - echo "Installing Additional Libraries" - pip install --upgrade pip - pip install pylint pytest mock requests ntplib datetime pytz pytype redfish inspect-it six #- echo "Installing Library Requirements" #- pip install redfish #- pip install -r requirements.txt #- python /tmp/store/libs_parse_installer.py - echo "Running Analysis" - python /tmp/store/drone_analyzer.py - more tmp.json #- pytest tests/unit/ > pytype_results.txt #- more pytype_results.txt #- name: notify-email # hub.docker.hpecorp.net/ilorest/email_notify:latest # image: drillster/drone-email # settings: # host: smtp3.hpe.com # skip_verify: true # port: 25 # from: grant.oconnor@hpe.com # recipients: [grant.oconnor@hpe.com] # #- ILORest-Notify@groups.int.hpe.com - name: Comment_Issuer image: python:3.7.2-alpine3.8 pull: true volumes: - name: drone_store path: /tmp/store - name: drone_slate path: /tmp/slate environment: HTTP_PROXY: http://web-proxy.houston.hpecorp.net:8080 GITHUB_USERNAME: from_secret: github_username GITHUB_PASSWORD: from_secret: github_password DRONE_STORE_PATH: /tmp/store/ SLATE_SHARE_PATH: /tmp/slate/ RESTLAX_FILE_PATH: /tmp/store/Restlax_web.txt RESULTS_URL: http://infinitymaster.us.rdlabs.hpecorp.net:1051/Drone_Git_Build_Data/ DOCS: 'library' commands: - easy_install distribute - echo "Upgrading Pip" - pip install --upgrade pip - pip install requests - more tmp.json - python /tmp/store/github_comment_issuer.py trigger: event: exclude: -push volumes: - name: drone_store host: path: /opt/docker_drone_share/ - name: drone_slate host: path: /opt/docker_slate_share/ trigger: event: - pull_requestpython-ilorest-4.8.0.0/docs/0000755000175000017500000000000014556457137015512 5ustar carstencarstenpython-ilorest-4.8.0.0/docs/Monolith.rest0000644000175000017500000003531314556457137020207 0ustar carstencarsten.. image:: /images/hpe_logo2.png :width: 150pt | .. toctree:: :maxdepth: 1 The Monolith ============ The monolith is a database of LegacyRest or Redfish responses. The main database class is **RisMonolith** with members being of class **RisMonolithMemberv100**. You can interact with the monolith directly, or with the **RmcApp** class for full convenience functions and monolith interaction. A monolith is automatically created as part of an RmcApp class. Direct Monolith Usage ===================== Direct usage of the monolith can be useful for crawling an entire tree or creating your own app implementation. The first thing we need to do is create a client and login. If you are unfamiliar with clients, please see the `Quickstart section `_. Creating a monolith ------------------- >>> import redfish >>> REST_OBJ = redfish.RedfishClient(base_url=iLO_host, username=login_account, password=login_password) >>> REST_OBJ.login() Then, we need to create a compatibility instance that goes along with this client. For more information on this compatibility class, see `System Compatibility `_. >>> from redfish.ris.gen_compat import Typesandpathdefines >>> COMPAT_OBJ = Typesandpathdefines() >>> COMPAT_OBJ.getgen(url=iLO_host, username=login_account, password=login_password) We now have everything required to build a **RisMonolith** class. Just pass in the client and compatibility instances. >>> from redfish.ris.ris import RisMonolith >>> MONOLITH = RisMonolith(REST_OBJ, COMPAT_OBJ) Building the monolith --------------------- Now that we have a monolith object we can use our client to build the database. There are multiple ways we can add data to the monolith. We can crawl and load the entire tree, load a single path, or add a **RestResponse** or **RisMonolithMember** instance directly. Loading an instance directly **************************** We can load an instance from data we already have with the **update_member** function. A path that already has a member will be updated instead of creating a new instance in monolith. Just include a monolith member instance... >>> from redfish.ris.ris import RisMonolithMemberv100 >>> resp = REST_OBJ.get('/redfish/v1/Systems/1/') >>> member = RisMonolithMemberv100(resp, COMPAT_OBJ.is_redfish) >>> member >>> MONOLITH.update_member(member=member) >>> MONOLITH.paths {'/redfish/v1/Systems/1/': } or the rest response and path. >>> resp = REST_OBJ.get('/redfish/v1/Managers/1/') >>> MONOLITH.update_member(resp=resp, path=resp.path, init=False) >>> MONOLITH.paths {'/redfish/v1/Systems/1/': , '/redfish/v1/Managers/1/': } Loading a single path ********************* We can instruct the monolith to load a single path into the monolith using the client we passed when we created it using the monolith **load** function. Just specify the path and set crawl to **False**. >>> MONOLITH.load(path='/redfish/v1/Systems/', crawl=False) >>> MONOLITH.paths {'/redfish/v1/Systems/1/': , '/redfish/v1/Managers/1/': , '/redfish/v1/Systems/': } Crawling the entire tree ************************ Monolith's main functionality is crawling the entire tree and creating a database from the responses. We need to use the **load** function to crawl. The **directory_load** attribute needs to be set to **False** to load the monolith completely with responses for all members. >>> MONOLITH.directory_load = False >>> MONOLITH.load() >>> len(MONOLITH.paths) 295 >>> member = MONOLITH.path('/redfish/v1/Systems/1/') >>> member.dict['@odata.id'] .. note:: It may take a while for load to perform get responses on all URIs. This is expected with large trees. For systems with a **ResourceDirectory.** type with the **directory_load** flag set to **True** monolith will perform a quick load of all types in the ResourceDirectory, creating monolith members for every item in the **ResourceDirectory.** *Instances* list, but not actually visit that path. This can be useful to get the majority of paths and types available on the system without needed to actually crawl everything. In order to add the members that do not have responses to the monolith the **init** argument must be included with load. >>> MONOLITH = RisMonolith(REST_OBJ, COMPAT_OBJ) >>> MONOLITH.load(init=True) >>> len(MONOLITH.paths) 286 >>> member = MONOLITH.path('/redfish/v1/Systems/1/') >>> member.path u'/redfish/v1/Systems/1/' >>> member.dict AttributeError: 'NoneType' object has no attribute 'dict' .. note:: Any response without a json response will return an **AttributeError** For a full list of options in **load**, see the resource documentation `here `_. RmcApp Usage ===================== The RmcApp class is a convenience class that combines the client, compatibility, validation, caching, and monolith into one class. RmcApp supplies functions for easily interacting with a server and monolith. For full functionality see the reference on RmcApp `here `_. Creating the RmcApp class ------------------------- Creating an RmcApp class will build everything we need to start working with a server. >>> from redfish.ris.rmc import RmcApp >>> APP = RmcApp() Using the RmcApp with a Server ------------------------------ We have an RmcApp, but we haven't connected it to a server yet. We can do that with the **login** function. Include the login/connection information with the login command and the App will use that to create a client, monolith, and compatibility class. >>> APP.login(base_url='https://16.83.62.248', username='admin', password='password') Now that we are logged in we can start performing functions on the server and reading data. If you used the RedfishClient or RestClient you may have noticed we were always working with paths or @odata.ids. The RmcApp generally works with types, or @odata.types. Getting data ************ **getprops** can be used to gather or **GET** data from the server. We specify the type of data we want to gather with the **selector** argument and what properties we want to gather with the **props** argument. If **props** isn't included, the entire dictionary is returned in a list. >>> APP.getprops(selector='ComputerSystem.', props=['AssetTag','Boot/BootSourceOverrideEnabled']) [{u'AssetTag': u'', u'Boot': {u'BootSourceOverrideEnabled': u'Disabled'}}] If there are multiple instances associated with one type, each is returned in the list. >>> APP.getprops(selector='EthernetInterface.', props=['@odata.id']) [{u'@odata.id': u'/redfish/v1/Systems/1/EthernetInterfaces/2/'}, {u'@odata.id': u'/redfish/v1/Systems/1/EthernetInterfaces/1/'}, {u'@odata.id': u'/redfish/v1/Managers/1/EthernetInterfaces/1/'}, {u'@odata.id': u'/redfish/v1/Systems/1/EthernetInterfaces/3/'}, {u'@odata.id': u'/redfish/v1/Managers/1/EthernetInterfaces/2/'}, {u'@odata.id': u'/redfish/v1/Systems/1/EthernetInterfaces/4/'}, {u'@odata.id': u'/redfish/v1/Managers/1/EthernetInterfaces/3/'}] If there are multiple instances associated, but you only want specific instance(s) returned, you can directly choose which monolith instances are searched by **getprops** using **select**, filtering by a key/value pair with the fltrvals argument. **fltrvals** takes a tuple of (Key,Value). You can then pass these instances to **getprops** to use instead of using all instances of a specific type. .. note:: The value can include a (*) which will include all instances that match the Key exactly and with a Value string that starts with the value exactly up to the (*). Anything after is ignored. >>> instances = APP.select(selector='EthernetInterface.', fltrvals=('@odata.id','/redfish/v1/Managers/*')) >>> instances [, , ] >>> APP.getprops(insts=instances, props=['@odata.id']) [{u'@odata.id': u'/redfish/v1/Managers/1/EthernetInterfaces/1/'}, {u'@odata.id': u'/redfish/v1/Managers/1/EthernetInterfaces/2/'}, {u'@odata.id': u'/redfish/v1/Managers/1/EthernetInterfaces/3/'}] Getting schema data ******************* If schema data is available on the system, we can get schema data with the **info** function. Just include the **selector** for the schema you wish to return. .. note:: **info** is optimized for HPE servers, but it should work for any schema which is on the system. If a specific system does not return schema data, please open a GitHub issue. >>> schema = APP.info(selector='ComputerSystem.') >>> schema['AssetTag'] {u'readonly': False, u'etag': True, u'type': [u'string', u'null'], u'description': u'A user-definable tag that is used to track this system for inventory or other client purposes.'} Instead of querying the entire schema, you can get specific schema keys using the **props** argument. >>> assettag_schema = APP.info(selector='ComputerSystem.', props=['AssetTag']) >>> assettag_schema {u'readonly': False, u'etag': True, u'type': [u'string', u'null'], u'description': u'A user-definable tag that is used to track this system for inventory or other client purposes.'} Modifying data ************** **loadset** can be used to set or **PATCH** data to the server. Data modified with **loadset** requires a **commit** to be updated on the server. First we need to get the dictionary we want to modify. We will use **getprops**. >>> system = APP.getprops(selector='ComputerSystem.') >>> system[0]['AssetTag'] u'' >>> system[0]['AssetTag']='newtag' >>> system[0]['AssetTag'] 'newtag' You can also pass partial dictionaries to **loadset**. So you can use **getprops** to only gather the properties that you want to modify. >>> assettag = APP.getprops(selector='ComputerSystem.', props=['AssetTag']) >>> assettag[0]['AssetTag'] u' >>> assettag[0]['AssetTag']='newtag' >>> assettag[0]['AssetTag'] 'newtag' Now that we have a modified dictionary, we can pass it to **loadset** to set patches. Loadset will return a list of changes that occurred. Remember to pass the dictionary, not the list returned from **getprops**. .. note:: **fltrvals**, much like in getprops, can be used to filter out instances of the same type so that you only make changes to specific instances, instead of all instances of a type. >>> APP.loadset(seldict=system[0], selector='ComputerSystem.') [{u'AssetTag': 'newtag'}] You can also use **status** to see all of the pending patches. Even if they are from multiple types. >>> APP.status() [{u'ComputerSystem.v1_4_0(/redfish/v1/Systems/1/)': [{u'path': u'/AssetTag', u'value': 'newtag', u'op': u'replace'}]}] Finally, we apply our pending changes to the server with **commit**. Commit is a generator, so we need to loop through to confirm the settings applied. .. note:: False means no error occurred for that path. True means an error occurred. >>> for commit in APP.commit(): print commit /redfish/v1/Systems/1/ False We can double check our setting applied with another getprops call. .. note:: We don't need to reload the monolith because it knows changes were made and auto reloads the path! >>> assettag = APP.getprops(selector='ComputerSystem.', props=['AssetTag']) >>> assettag [{u'AssetTag': u'newtag'}] Performing Actions ****************** Actions are just **POST** operations. They can be performed with the RmcApp handlers for raw HTTP commands. See the `post_handler `_. HTTP handlers ************* RmcApp supplies handlers for the raw HTTP methods **GET**, **PATCH**, **POST**, **DELETE**, **PUT**, and **HEAD**. On top of standard request and response returns, the handlers also allow for either printing or logging of full error message strings from registries if the registries are available on the system. TODO: ADD info about showwarnings once it's fixed. *********** GET Handler *********** The **get_handler** is the equivalent of HTTP **GET** and returns a **RestResponse** object. Simply add the path to GET as an argument. >>> APP.get_handler('/redfish/v1/systems/1/') ************* PATCH Handler ************* The **patch_handler** is the equivalent of HTTP **PATCH** and returns a **RestResponse** object. Simply add the path to PATCH and the body as arguments. >>> APP.patch_handler('/redfish/v1/systems/1/', {'AssetTag': 'TAG'}) ************ POST handler ************ The **post_handler** is the equivalent of HTTP **POST** and returns a **RestResponse** object. Simply add the path to POST and the body as arguments. >>> APP.post_handler('/redfish/v1/Systems/1/Actions/ComputerSystem.Reset/', {'ResetType': 'On'}) ************** DELETE handler ************** The **delete_handler** is the equivalent of HTTP **DELETE** and returns a **RestResponse** object. Simply add the path to DELETE as an argument. >>> resp = APP.delete_handler('/redfish/v1/systems/1/') .. note:: We did not actually delete /redfish/v1/systems/1/. If you were to read the RestResponse you would see that an error returned. *********** PUT handler *********** The **put_handler** is the equivalent of HTTP **PUT** and returns a **RestResponse** object. Simply add the path to PUT and the body as arguments. >>> APP.put_handler('/redfish/v1/systems/1/', {'test': 'data'}) .. note:: We did not actually PUT to /redfish/v1/systems/1/. If you were to read the RestResponse, you would see that an error returned. ************ HEAD handler ************ The **head_handler** is the equivalent of HTTP **HEAD** and returns a **RestResponse** object. Simply add the path to gather headers from. Note there is no body response of a head. Headers are available by the **getheaders()** function of RestResponse. >>> resp = APP.head_handler('/redfish/v1/Systems/1/') >>> resp.getheaders() {'Content-Length': '0', 'ETag': 'W/"44499A19"', 'Link': '; rel=describedby', 'Allow': 'GET, HEAD, POST, PATCH', 'Date': 'Fri, 03 Jan 2020 19:21:53 GMT', 'OData-Version': '4.0', 'X-Frame-Options': 'sameorigin'} Ending A Session **************** After finishing operations on a server, it's important to logout using **logout** to free sessions. >>> APP.logout() python-ilorest-4.8.0.0/docs/redfish_quick.json0000644000175000017500000000124114556457137021223 0ustar carstencarsten{ "@odata.context": "/redfish/v1/$metadata#ComputerSystem.ComputerSystem", "@odata.etag": "W/\"E4BDA463\"", "@odata.id": "/redfish/v1/Systems/1", "@odata.type": "#ComputerSystem.v1_4_0.ComputerSystem", "Id": "1", "Actions": { "#ComputerSystem.Reset": { "ResetType@Redfish.AllowableValues": [ "On", "ForceOff", "ForceRestart", "Nmi", "PushPowerButton" ], "target": "/redfish/v1/Systems/1/Actions/ComputerSystem.Reset" } }, "AssetTag": "", "Bios": { "@odata.id": "/redfish/v1/systems/1/bios" } }python-ilorest-4.8.0.0/docs/conf.py0000644000175000017500000002236714556457137017023 0ustar carstencarsten# -*- coding: utf-8 -*- # # iLO RESTful API documentation build configuration file, created by # sphinx-quickstart on Fri Mar 11 11:34:15 2016. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys import os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('../src')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = ['sphinx.ext.autodoc', 'sphinxcontrib.restbuilder'] # Add any paths that contain templates here, relative to this directory. templates_path = ['.templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # source_suffix = ['.rst', '.md'] source_suffix = ['.rst', '.rest'] # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'python-ilorest-library' copyright = u'Copyright 2016-2021 Hewlett Packard Enterprise Development LP' author = u'Hewlett Packard Enterprise' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = u'4.0' # The full version, including alpha/beta/rc tags. release = u'4.0.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['.build'] # The reST default role (used for this markup: `text`) to use for all # documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. #html_theme = 'alabaster' html_theme = 'sphinx_rtd_theme' #html_theme = 'classic' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] html_theme_path = ["themes",] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['.static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. #html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' #html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # Now only 'ja' uses this config value #html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. #html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = 'iLORESTfulAPIdoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', # Latex figure (float) alignment #'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'iLORESTfulAPI.tex', u'iLO RESTful API Documentation', u'Hewlett Packard Enterprise', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ (master_doc, 'ilorestfulapi', u'iLO RESTful API Documentation', [author], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'iLORESTfulAPI', u'iLO RESTful API Documentation', author, 'iLORESTfulAPI', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False python-ilorest-4.8.0.0/docs/Quick-Start.rest0000644000175000017500000002024214556457137020560 0ustar carstencarsten.. image:: /images/hpe_logo2.png :width: 150pt | .. toctree:: :maxdepth: 1 =========== Quick Start =========== This will cover object creation, a simple call to the API, and a response object. Scripts of the information provided below are available at: `quickstart_redfish.py `_ and `quickstart_legacy_rest.py `_. For more elaborate examples that use the Redfish API and python-ilorest-library check out the `Examples `_ section. The python-ilorest-library provides support for communication using both remote using HTTPS and local in-band using CHIF. Importing Redfish ================== Make sure that the redfish library is imported. .. code-block:: python import redfish The very first thing that needs to be done for a restful request is to create a **LegacyRestClient** or **RedfishClient** object. A **RedfishClient** is for interacting with a Redfish API and a **LegacyRestClient** is for interacting with HPE's Legacy Rest API. For maximum compatibility between iLOs and other vendor hardware that implements Redfish it is recommended to use the Redfish API whenever possible. .. note:: HPE's Legacy Rest API is available starting in **iLO 4 2.00**. iLO 4 is Redfish conformant starting with **iLO 4 2.30**. In iLO 5 and above the iLO RESTful API is Redfish only. Creating a Remote Object ============================ Creating a remote client requires including the iLO hostname or ip address and credentials. Create a Redfish Object ----------------------- .. note:: *New in version 3.0.0* Creation of a Redfish object instance is done using the **RedfishClient** class instead of the **redfish_client** function. **RedfishClient** takes as parameters iLO hostname/ip address, username, password, and other optional arguments. For a full list of optional arguments see `here `_. .. code-block:: python REST_OBJ = redfish.RedfishClient(base_url=iLO_host, username=login_account, password=login_password) Create a LegacyRest Object -------------------------- .. note:: *New in version 3.0.0* Creation of a Legacy Rest object instance is done using the **LegacyRestClient** class instead of the **rest_client** function. **LegacyRestClient** takes as parameters iLO hostname/ip address, username, password, and other optional arguments. For a full list of optional arguments see `here `_. .. code-block:: python REST_OBJ = redfish.LegacyRestClient(base_url=iLO_host, username=login_account, password=login_password) Creating a Local Object =========================== Requirements ----------------------- * You must be running on a server with iLO and the latest iLO drivers from the SPP. * You will need to download the iLOrest Chif DLL/SO for your corresponding operating system and place it in your working environment path. By downloading, you agree to the terms and conditions of the `Hewlett Packard Enterprise Software License Agreement`_. Windows Download: ilorest_chif.dll_ Linux Download: ilorest_chif.so_ .. _`Hewlett Packard Enterprise Software License Agreement` : https://www.hpe.com/us/en/software/licensing.html .. _ilorest_chif.dll: https://downloads.hpe.com/pub/softlib2/software1/pubsw-windows/p1463761240/v167985/ilorest_chif.dll .. _ilorest_chif.so: https://downloads.hpe.com/pub/softlib2/software1/pubsw-linux/p1093353304/v168967/ilorest_chif.so Create a Redfish or LegacyRest Object ------------------------------------- If you create a **LegacyRest** or **Redfish** object without a base_url argument it will automatically create an object configured for a local CHIF connection. A username and password may be included in object creation if they are required. For **most** operations in **Production** security mode no credentials are required locally. Some reasons credentials may be required locally: * iLO is operating in a higher security mode (Such as HighSecurity). * Some operations require the credentials of an account with a specific privilege to complete (Even in Production security mode). .. code-block:: python REST_OBJ = redfish.RedfishClient() Create a login session ============================ Next the rest object's **login** method is called to initiate a rest session. The login method takes the credentials specified in the REST object we created. Login also takes an authentication type optional parameter, if the argument is not included the Client will choose an authentication type for you based on the arguments given with `session` being the default. For `session` authentication, a session key is generated through a rest request, the default for username and password arguments. For `basic` authentication, the username and password is base64 encoded and sent in a header for each request. For security, session authentication is preferred. .. code-block:: python REST_OBJ.login(auth="session") Remember to call **logout** method once the session is completed to free up sessions. Perform your first Restful API GET operation ============================================ The following example performs a GET operation on the systems resource (/redfish/v1/systems/1) using the HPE Restful API for iLO. It does an HTTP GET request on the iLO SSL(HTTPS) port (typically 443 but the iLO can be configured to use another port as well). The interface is not available over open HTTP (port 80), so SSL handshake must be used. Perform a HTTP **GET** request by using the **get** method. >>> response = REST_OBJ.get('/redfish/v1/systems/1') Response Object =============== A **Response** object called *response* is now available for us to inspect. The **status** property returns the HTTP response to our request: >>> response.status 200 The **dict** property returns the response json body as a Python dictionary: >>> response.dict The **getheaders()** method returns a dictionary of all http response headers: >>> response.getheaders() {'Transfer-Encoding': 'chunked', 'X_HP-CHRP-Service-Version': '1.0.3', 'ETag': 'W/"0129EA9F"', 'Link': '; rel=describedby', 'Allow': 'GET, HEAD, POST, PATCH', 'Cache-Control': 'no-cache', 'Date': 'Tue, 06 Aug 2019 19:42:26 GMT', 'OData-Version': '4.0', 'X-Frame-Options': 'sameorigin', 'Content-type': 'application/json; charset=utf-8'} You can also print the Response object directly: >>> sys.stdout.write("%s\n" % response) Response status: 200 Response header: | Transfer-Encoding chunked | X_HP-CHRP-Service-Version 1.0.3 | ETag W/"E4BDA463" | Link ; rel=describedby | Allow GET, HEAD, POST, PATCH | Cache-Control no-cache | Date Thu, 01 Aug 2019 19:13:17 GMT | OData-Version 4.0 | X-Frame-Options sameorigin | Content-type application/json; charset=utf-8 The formated Response body (Truncated for size): .. literalinclude:: redfish_quick.json :language: JSON A full description of the Response Object is available in the reference `here `_. Other HTTP Requests ============================ Other HTTP Requests **HEAD**, **PATCH**, **POST**, **DELETE**, and **PUT** are just as simple to use as **GET**. >>> response = REST_OBJ.head('/redfish/v1/systems/1') >>> response = REST_OBJ.patch('/redfish/v1/systems/1', {'AssetTag': 'newtag'}) >>> response = REST_OBJ.post('/redfish/v1/Systems/1/Actions/ComputerSystem.Reset/', {'ResetType': 'ForceRestart'}) >>> response = REST_OBJ.delete(REST_OBJ.session_location) >>> response = REST_OBJ.put('', 'data') Close the login session ============================ Logout of the current session. This is only required for `session` based authentication. .. code-block:: python REST_OBJ.logout() Continued Reading ================= That's it! You're ready to perform some Redfish requests! If you are looking for more advanced topics like *setting timeouts*, more detail on the *response* object, or configuration of the *Redfish* or *LegacyRest* objects check out the `Advanced Usage `_ section.python-ilorest-4.8.0.0/docs/make.bat0000644000175000017500000001553014556457137017123 0ustar carstencarsten@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=.build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled echo. coverage to run coverage check of the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) REM Check if sphinx-build is available and fallback to Python version if any %SPHINXBUILD% 1>NUL 2>NUL if errorlevel 9009 goto sphinx_python goto sphinx_ok :sphinx_python set SPHINXBUILD=python -m sphinx.__init__ %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) :sphinx_ok if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\iLORESTfulAPI.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\iLORESTfulAPI.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdf" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf cd %~dp0 echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdfja" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf-ja cd %~dp0 echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) if "%1" == "coverage" ( %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage if errorlevel 1 exit /b 1 echo. echo.Testing of coverage in the sources finished, look at the ^ results in %BUILDDIR%/coverage/python.txt. goto end ) if "%1" == "xml" ( %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml if errorlevel 1 exit /b 1 echo. echo.Build finished. The XML files are in %BUILDDIR%/xml. goto end ) if "%1" == "pseudoxml" ( %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml if errorlevel 1 exit /b 1 echo. echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. goto end ) :end python-ilorest-4.8.0.0/docs/Frequently-Asked-Questions.rest0000644000175000017500000000272714556457137023574 0ustar carstencarsten.. image:: /images/hpe_logo2.png :width: 150pt | .. toctree:: :maxdepth: 1 Frequently Asked Questions ========================== Q1: What is the difference between REST and Redfish API? -------------------------------------------------------- Representational State Transfer(REST) is a web-based software architectural style consisting of a set of constraints that focus on a system's resource. The HPE REST library performs the basic HTTP operations GET, POST, PUT, PATCH and DELETE on resources using the HATEOS (Hypermedia as the Engine of Application) REST architecture. RESTful typically refers to web services implementing REST architecture. Redfish API uses a hypermedia data model OData(Open Data Protocol) v4 represented within a RESTful interface. OData is a specific implementation of REST architecture that allows resources identified using URIs and defined in an abstract data model. Since the Redfish implementation is based on OData v4, it requires the starting metadata OData header to be version 4. Redfish changes the linking between resources. Where the HPE Restful URIs places all link as "href" inside a "links" sub-object, Redfish changes "**href**" to "**@odata.id**", "**links**" sub-objects to "**Links**". For more information on iLO's implementation of Redfish, click `here `_. More information on Redfish can be found on the `DMTF Redfish Website `_. python-ilorest-4.8.0.0/docs/API-Overview.rest0000644000175000017500000001342214556457137020630 0ustar carstencarsten.. image:: /images/hpe_logo2.png :width: 150pt | .. toctree:: :maxdepth: 1 ============= API Overview ============= REST API Documentation ====================== For complete documentation of the iLO 4 and iLO 5 REST APIs see the `documentation `_. Why iLO RESTful API? ==================== This HPE RESTful API for iLO is the main management API for iLO and iLO Chassis Manager based HPE servers. Its feature set is becoming larger than the existing iLO XML API (RIBCL) and IPMI interfaces. Using this API, you can take full inventory of the server, control power and reset, configure BIOS and iLO settings, fetch event logs, as well as many other functions. This API follows the trend of the Internet in moving to a common pattern for new software interfaces. Many web services in a variety of industries use REST APIs because they are easy to implement, easy to consume, and offer scalability advantages over previous technologies. HPE OneView, OpenStack, and many other server management APIs are now REST APIs. Most HPE Management software offerings, as well as the entire Software Defined Data Center architecture, are built upon REST APIs. The HPE RESTful API for iLO has the additional advantage of consistency across all present and projected server architectures. The same data model works for traditional rack-mount servers, blades, as well as newer types of systems like Moonshot. This advantage comes because the data model is designed to self-describe the service’s capabilities to the client and has room for flexibility designed in from the start. For full documentation on the iLO 4 and iLO 5 implementations of the API, click `here `_. Redfish =================== Redfish is an open, industry-standard specification and schema, designed to provide simple and secure management of modern scalable hardware. Redfish is based on the tools and scripting environments most users already have, enabling feature-rich remote management compatible with existing toolsets. Redfish was built from the ground up to scale to the modern, multiple-server environments common in today’s enterprise, hyperscale, and cloud infrastructures. Redfish defines the industry standard for the software-defined data center (SDDC), and the effort to modernize heterogeneous data centers. HPE ProLiant servers provide iLO RESTful API extensions to Redfish, allowing you to take advantage of the full range of value-added API features. You can now benefit from adopting the Redfish standard into HPE ProLiant Gen8, Gen9, and Gen10 servers, as well as on other non-HPE server products that implement to the standard. More information on Redfish can be found on the `DMTF Redfish Website `_. Resource operations =================== RESTful APIs are stateless. The resource manager maintains the resource state that is reported as the resource representation. The client maintains the application state and the client might manipulate the resource locally, but until a PATCH or POST is made, the resource, as known by the resource manager, is not changed. +------------------------+---------------------------------+-----------------------------------------------------------+ | Operation | HTTP Verb | Description | +========================+=================================+===========================================================+ | Create | POST resource URI (payload = | Create new resources. A synchronous POST returns the newly| | | resource data) | created resource. | +------------------------+---------------------------------+-----------------------------------------------------------+ | Read | GET resource URI | Returns the requested resource representations. | +------------------------+---------------------------------+-----------------------------------------------------------+ | Update | PATCH resource URI (payload = | Updates an existing resource. You can only PATCH | | | update data) | properties that are marked readonly = false in the schema.| +------------------------+---------------------------------+-----------------------------------------------------------+ | Delete | DELETE resource URI | Deletes the specified resource. | +------------------------+---------------------------------+-----------------------------------------------------------+ Return codes ============ +------------------------+---------------------------------------------------------------------------------------------+ | Return code | Description | +========================+=================================+===========================================================+ | 2xx | Successful operation. | +------------------------+---------------------------------+-----------------------------------------------------------+ | 4xx | Client-side error with error message returned. | +------------------------+---------------------------------+-----------------------------------------------------------+ | 5xx | iLO error with error message returned. | +------------------------+---------------------------------+-----------------------------------------------------------+ python-ilorest-4.8.0.0/docs/Client-Quick-Start.rest0000644000175000017500000002072114556457137021776 0ustar carstencarsten.. image:: /images/hpe_logo2.png :width: 150pt | .. toctree:: :maxdepth: 1 Client Quick Start ================== This section describes the basic functionality of the library for users, who only need a basic client configured for a LegacyRest or Redfish host. For a convenient class for performing higher level functionality or for users unfamiliar with Redfish implementations, see `RmcApp Usage `_. This Quick Start covers client object creation, a simple call to the API, and a response object. Scripts of the information provided below are available at: `quickstart_redfish.py `_ and `quickstart_legacy_rest.py `_. For more elaborate examples that use the Redfish API and the python-ilorest-library, see the `Examples `_ section. The python-ilorest-library provides support for communication using both remote using HTTPS and local in-band using CHIF. Importing the Redfish Library ============================= Import the Redfish library. .. code-block:: python import redfish The very first thing that needs to be done for a RESTful request is to create a **LegacyRestClient** or **RedfishClient** object. A **RedfishClient** is for interacting with a Redfish API, and a **LegacyRestClient** is for interacting with HPE Legacy Rest API. For maximum compatibility between iLOs and other vendor hardware that implements Redfish, it is recommended to use the Redfish API whenever possible. .. note:: HPE's Legacy Rest API is available starting in **iLO 4 2.00**. iLO 4 is Redfish conformant starting with **iLO 4 2.30**. In iLO 5 and above the iLO RESTful API is Redfish only. Creating a Remote Object ======================== Creating a remote client requires including the iLO hostname or IP address and credentials. Create a Redfish Object ----------------------- .. note:: *New in version 3.0.0* Creation of a Redfish object instance is done using the **RedfishClient** class instead of the **redfish_client** function. **RedfishClient** takes as parameters iLO hostname/IP address, username, password, and other optional arguments. For a full list of optional arguments see `here `_. .. code-block:: python REST_OBJ = redfish.RedfishClient(base_url=iLO_host, username=login_account, password=login_password) Create a LegacyRest Object -------------------------- .. note:: *New in version 3.0.0* Creation of a Legacy Rest object instance is done using the **LegacyRestClient** class instead of the **rest_client** function. **LegacyRestClient** takes as parameters iLO hostname/IP address, username, password, and other optional arguments. For a full list of optional arguments see `here `_. .. code-block:: python REST_OBJ = redfish.LegacyRestClient(base_url=iLO_host, username=login_account, password=login_password) Creating a Local Object =========================== Requirements ----------------------- * You must be running on a server with iLO and the latest iLO drivers from the SPP. * You will need to download the iLOrest Chif DLL/SO for your corresponding operating system and place it in your working environment path. By downloading, you agree to the terms and conditions of the `Hewlett Packard Enterprise Software License Agreement`_. Windows Download: ilorest_chif.dll_ Linux Download: ilorest_chif.so_ .. _`Hewlett Packard Enterprise Software License Agreement` : https://www.hpe.com/us/en/software/licensing.html .. _ilorest_chif.dll: https://downloads.hpe.com/pub/softlib2/software1/pubsw-windows/p1463761240/v167985/ilorest_chif.dll .. _ilorest_chif.so: https://downloads.hpe.com/pub/softlib2/software1/pubsw-linux/p1093353304/v168967/ilorest_chif.so Create a Redfish or LegacyRest Object ------------------------------------- If you create a **LegacyRest** or **Redfish** object without a base_url argument it will automatically create an object configured for a local CHIF connection. A username and password may be included in object creation if they are required. For **most** operations in **Production** security mode no credentials are required locally. Some reasons credentials may be required locally: * iLO is operating in a higher security mode (Such as HighSecurity). * Some operations require the credentials of an account with a specific privilege to complete (Even in Production security mode). .. code-block:: python REST_OBJ = redfish.RedfishClient() Create a login session ====================== Next the rest object's **login** method is called to initiate a rest session. The login method takes the credentials specified in the REST object we created. Login also takes an authentication type optional parameter, if the argument is not included the Client will choose an authentication type for you based on the arguments given with `session` being the default. For `session` authentication, a session key is generated through a rest request, the default for username and password arguments. For `basic` authentication, the username and password is base64 encoded and sent in a header for each request. For security, session authentication is preferred. .. code-block:: python REST_OBJ.login(auth="session") Remember to call **logout** method once the session is completed to free up sessions. Perform your first RESTful API GET operation ============================================ The following example performs a GET operation on the systems resource (/redfish/v1/systems/1) using the HPE RESTful API for iLO. It does an HTTP GET request on the iLO SSL(HTTPS) port (typically 443 but the iLO can be configured to use another port as well). The interface is not available over open HTTP (port 80), so SSL handshake must be used. Perform a HTTP **GET** request by using the **get** method. >>> response = REST_OBJ.get('/redfish/v1/systems/1') Response Object =============== A **Response** object called *response* is now available for us to inspect. The **status** property returns the HTTP response to our request: >>> response.status 200 The **dict** property returns the response json body as a Python dictionary: >>> response.dict The **getheaders()** method returns a dictionary of all http response headers: >>> response.getheaders() {'Transfer-Encoding': 'chunked', 'X_HP-CHRP-Service-Version': '1.0.3', 'ETag': 'W/"0129EA9F"', 'Link': '; rel=describedby', 'Allow': 'GET, HEAD, POST, PATCH', 'Cache-Control': 'no-cache', 'Date': 'Tue, 06 Aug 2019 19:42:26 GMT', 'OData-Version': '4.0', 'X-Frame-Options': 'sameorigin', 'Content-type': 'application/json; charset=utf-8'} You can also print the Response object directly: >>> sys.stdout.write("%s\n" % response) Response status: 200 Response header: | Transfer-Encoding chunked | X_HP-CHRP-Service-Version 1.0.3 | ETag W/"E4BDA463" | Link ; rel=describedby | Allow GET, HEAD, POST, PATCH | Cache-Control no-cache | Date Thu, 01 Aug 2019 19:13:17 GMT | OData-Version 4.0 | X-Frame-Options sameorigin | Content-type application/json; charset=utf-8 The formated Response body (Truncated for size): .. literalinclude:: redfish_quick.json :language: JSON A full description of the Response Object is available in the reference `here `_. Other HTTP Requests =================== Other HTTP Requests **HEAD**, **PATCH**, **POST**, **DELETE**, and **PUT** are just as simple to use as **GET**. >>> response = REST_OBJ.head('/redfish/v1/systems/1') >>> response = REST_OBJ.patch('/redfish/v1/systems/1', {'AssetTag': 'newtag'}) >>> response = REST_OBJ.post('/redfish/v1/Systems/1/Actions/ComputerSystem.Reset/', {'ResetType': 'ForceRestart'}) >>> response = REST_OBJ.delete(REST_OBJ.session_location) >>> response = REST_OBJ.put('', 'data') Close the login session ======================= Logout of the current session. This is only required for `session` based authentication. .. code-block:: python REST_OBJ.logout() Continued Reading ================= That's it! You're ready to perform some Redfish requests! If you are looking for more advanced topics like *setting timeouts*, more detail on the *response* object, or configuration of the *Redfish* or *LegacyRest* objects check out the `Advanced Usage `_ section. python-ilorest-4.8.0.0/docs/Reference.rest0000644000175000017500000000275714556457137020322 0ustar carstencarsten======================= Reference Documentation ======================= redfish.rest --------------- .. automodule:: redfish.rest redfish.rest.v1 =============== .. automodule:: redfish.rest.v1 :members: :show-inheritance: redfish.rest.connections ======================== .. automodule:: redfish.rest.connections :members: :show-inheritance: redfish.rest.containers ======================= .. automodule:: redfish.rest.containers :members: RestRequest, RestResponse :show-inheritance: redfish.ris --------------- .. automodule:: redfish.ris redfish.ris.gen_compat ====================== .. automodule:: redfish.ris.gen_compat :members: :show-inheritance: redfish.ris.ris =============== .. automodule:: redfish.ris.ris :members: :show-inheritance: redfish.ris.ris_threaded ======================== .. automodule:: redfish.ris.ris_threaded :members: :show-inheritance: redfish.ris.utils ================= .. automodule:: redfish.ris.utils :members: :show-inheritance: redfish.ris.rmc =============== .. automodule:: redfish.ris.rmc :members: :show-inheritance: redfish.ris.rmc_helper ====================== .. automodule:: redfish.ris.rmc_helper :members: :show-inheritance: redfish.ris.resp_handler ======================== .. automodule:: redfish.ris.resp_handler :members: :show-inheritance: redfish.ris.validation ======================== .. automodule:: redfish.ris.validation :members: :show-inheritance:python-ilorest-4.8.0.0/docs/Makefile0000644000175000017500000001700414556457137017154 0ustar carstencarsten# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = .build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " applehelp to make an Apple Help Book" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" @echo " coverage to run coverage check of the documentation (if enabled)" .PHONY: clean clean: rm -rf $(BUILDDIR)/* .PHONY: html html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." .PHONY: dirhtml dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." .PHONY: singlehtml singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." .PHONY: pickle pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." .PHONY: json json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." .PHONY: htmlhelp htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." .PHONY: qthelp qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/iLORESTfulAPI.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/iLORESTfulAPI.qhc" .PHONY: applehelp applehelp: $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp @echo @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." @echo "N.B. You won't be able to view it unless you put it in" \ "~/Library/Documentation/Help or install it in your application" \ "bundle." .PHONY: devhelp devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/iLORESTfulAPI" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/iLORESTfulAPI" @echo "# devhelp" .PHONY: epub epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." .PHONY: latex latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." .PHONY: latexpdf latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." .PHONY: latexpdfja latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." .PHONY: text text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." .PHONY: man man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." .PHONY: texinfo texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." .PHONY: info info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." .PHONY: gettext gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." .PHONY: changes changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." .PHONY: linkcheck linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." .PHONY: doctest doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." .PHONY: coverage coverage: $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage @echo "Testing of coverage in the sources finished, look at the " \ "results in $(BUILDDIR)/coverage/python.txt." .PHONY: xml xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." .PHONY: pseudoxml pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." python-ilorest-4.8.0.0/docs/images/0000755000175000017500000000000014556457137016757 5ustar carstencarstenpython-ilorest-4.8.0.0/docs/images/hpe_logo2.png0000644000175000017500000012617714556457137021361 0ustar carstencarstenPNG  IHDRyksRGBgAMA a pHYsodIDATx^}E^sΠb#b%*f% fb~U#3TU^~nn{vf0[Xٌqg@%A fvrH2$.i%J R"&TXS?`0Vi̩J$E 6eJgR$#A}i"ˀ#QP~%?o%$ˤ[H/,?b%T pv/Je7AQS <e?@ sL$.LQ ɈG ?(@lFf,(#IrqNFp2rX&PIHT"1QC # I$P(" P`~ MH OCC )+O@IDI?P:3!@cf% JID O4qe~a`2py,Y-J尅?$ Lń" $4Pm+@7FO"zLҶr] ̨FŃpS6ƿ 4!W.nu J&Oÿ Ҙr6hhT`?n G[ Ts EШ@[@^ys "HR=[[CBx7ڱeиGVVtnn D8 JWS hhhT Zʔ`z LoWgik54*$3$u@J<%A˻444*Kɴ~5ƿlmz|k)A@dStskhTD`g@+0g@}Iu/HDCCb܆k; *0$Ш0.<)!jږVf˽54*( xa(8˴!)`Ӡ/4(~4jjM y@.Ɂ\DFS4UYli\Ш$¿(e-=ACC|茽"T"IiOjVeizPA ݂'ъ[Ej_ߞFH444*;蚲5]@+ܯQ!! (š/7424С p$47"a޲4FC89qp#d+@g*UQ w%cx^#}DխQ!wbd,NAĿԞ2 nn LDDo'.E\9,,1,vt%xHT,Ҭ#b y-T! I BP^+(& 4@V栌V̖T;}ʤL?޺G544*xg@s/NΈZ*zL&+g"KRԢLb L$ʩ@5jm"BQ:&H⠿D Bń siP&vc%OUf"'f:lQAzgQaa >#Jn- *(K0xlUI,VEY,Q% HD鐨KRp|&TTeM~S:yKBlR٥8.Z- GBH6P""Dd*6>[! M#8UCCb@~π(lJ❁a_ӈnEC34*HAI΀b()"%55'‰A(tRgK2 ~&JTXa c8fF0#dVMm)QLШH:Q܁ 1E82D`>Jm ag PJʼnCQ$ PEH!trpTUN QM"F?Gh`0JPg$9`f ud7b\jdY8 $ $pXP ̥QN'x//.5_L'(fq@pH6t3`@DgorqXĒ@Jf'I? Gĩ&Ţ"27Z!dxp)pj(d3 ,5*O-DD8544*2 %PpND`0a|e5AtGO1GODgDhN$9ld$ ?j (_krP. "GL֓(sWLMls'`YF ȕ0G #D5u?A>(t$/cH8 4E)~␲D=0(dRR@a$p1EdMAe Y  }TL%xY$x,QQD! Rf*3E   S!WI*y1C:+L ReD Sh85gZ(B<YN$ A,YNGj,PD)QS"qZ5D$ItUQQ_ ΄`.0,ܓQ"r.A| F),d"T>fv!*\ fgSʛyAN0(0jJ,fFld40((DÒK(6E:/ CQ$lTS` khhT㸸xy:xb99ws-ܬ%aԨ믨(HRB^J*ofjUq0qk}5|S-46Ȗ& 0ȈZk5i֢UVڶsÛo1S¤0` zcOشIcE8X//lX`3?Zx*j+AV4Ү`VkD;ik~2h+h s0% f #0'O̘:w S@1MXNlqF!'l[uZl8HP @ T(J9J1S.LF#!Ŕl[$)322N< 8q"33S -Dzi[#3k@-j-[DDDBBG(Ɇix#0(+x`j<7 2A74v䈑$|\}͠ t͐0&9X $\J.XFA,3A-!}f /4J 1m$(%I;m]zՆԵc k)[kI8~غ59`nժ zze#SkXrS4L3{:9i掌1+"2@f+k!bs3jv<ASK#eXdQj!6F$"9_DE!Qi#2q2=ԧ r2:<$A 6:יڤI7mZ؊Nd:%FAZŌHZ1xCEMhgnw?-h ۞R7a4Ce//(#w0&.eh,>yܹn+r_,<n۲3+"#TIÌ]HpITY&90pIb4J Ax%VE??w SR/&rώjذB @5hѸY͛әFMըUeggcYP\iFbcuS$L+,O i!yCq6nM ]N{ZZDh#gBMrԎNGAɧ)Be/H/(q-7O9c:|dzf?>9=&rXm%GD;zo PqUu QƞQFd +"'U8T(=ȍrA 4~ejJ#e xA  , ș 5jhܰaƍVZsN{? )+JQ6ܢvŋ2 À k "@T8(T.;ajk"U /+Mbؗ?mMVNz'bJn0~ 2) DC4` xy*ToWƍOJNvݤhKmpRS+•"O Ωoo3c}HVWA2Y-S9J7ۚ$یLiLD5_QkP{?pY@(ö¡^ \vŃ -ܞv{NV͛8 !IqFs+7Bmo Lja,;R R>iYl?k׮ݽ{css݊ C#7BfV7mUW,[<55u=ǎweGtt4] @;J:k%I T$,T:O`0ƍ7X^=mKn0uc߰q#ie8oܸ ]ggeg>}۶+W-EYNg+`VNY윜Gٳgmje,[|ժ۶m;tPzzF۾ t܂2t+̎cU"֬Ys׮cǎo{ l7 *#;;{ͷ8|o-}酗^<)1) ^efd3GQ!#3kh 7ڵȡC Ջ]^Mڷo׵[ӛơCi^b-֮})R(``,]Nyyy֭um߶݁ԄwZ ??C V/V͚T8.U7nܹcGeNV[Aƍ;ªݻ捒;vܰ~59+xǏGFgsݍ5:)_ٜ9batzMYða?裨(kL-_`衇7S+Qde233]uմӋzTb[7oްa;s'fKHL]nhޱcmTNIQ}Yz[n۳{E\bJ 6iҤc:wmެVc<;sڴȈ- oӺ‘G/zI,/?wdE ݲe-[֯߸{ÒnK%|UU]A-uh߶M2R~9uZeBJ't=h+V._lٙpG*۵k{a߾*|G%dž vuObFmРY]uqM7_.bџ4C & *Nfκ[&w2xŗߘ4111:HXzgyԓ37/V._f1KabT<省n:*!`pť\NzQbn?"oyM78v4)yy-k #ඛo?wn|ރ%##c=u }LtLNkԪoj*d/rի0=bNy |?WA7ܥsG?zݧGOr;f?,;+K#qiS !=hhb u C+ ԠÏ#I1W[oIK;N}#a4dg׻όߏAӹp/-{[rv_Q4U~>))m۷{W]}uՙشy˂ ~_ݹΈHv̎q}$͚lLqX̘gߟM\s6&8Ny^/ OS'=XbvvN|2*+3ՏOƍڅר;KCuKJI:wzW\~٥QQz:7zG-bPWtazu뀌 SÇb٩Aݹ I3>O^0ߗ |+Y~8C^1)CGfkڬU\sU\髯{1X{ 9(v $>,_ M]w=z0DDrPXx9vOg=cǍfPI DM>ß|6.XPUЯDDxǟXE'Q(.`3a.X.P #-?4p ]@hHQQ >l!_~~A˖-j֨T+ j (#GMK2$x,2MQ)av=瓏)#)9d&)/TI@Rk^`|૗to=r1+9=f7((=}m7h@7+J\ ^(oر}:=eèɖ-3BDr[G'sA~>]Հ&JLb1k/͍|)WYd"H(ֹ_ΟijH%p5ɚޔgF߉YIL!(KQ# Q!T8rZCQ5zݞ5IO邶*kav >fgQ&5~ӦL%%?#;mK\w 9e,AmGCg \ӧM_ԭb,9>HX\&r)Z*;#ċ?rjE #H(̞aW_w~NdL'O?¡y0?%F .U}Nhg[vl!=3JkO_0(6 PqDP$QM tL]ڪlʤ?hlԖ=*⯋Tg [%umFطgO\Bd9f)!cѓ e_g7 ΌZTj*l۠ѣ*sMPaf3I$[Ĥc?C,vOLyX5*Ǐۘ9\t Vf>3 n`6(#E@4 aSbAׁBD˙@o\O?ڄqO oLHg>^YyC3nH5b6P6DB#ǾzloaCA#2'ԱPB,R@P(d,uO?,@S6!)kDK;x;!. ~"pNq9sRH yLȬ-&v y n8,޽ҭ;5ޏh"Qzfc9j|糡C|-^LL8D n;"Ѻ]ˮ_ksa@zR.EC/煔dA׮]>HY&Ė0==}UpQ/jQ.4a-ؙ.+W1BTE&g3_]dO)T->t֒=@ulyyy7*:m_}͕^{N>UW*J8ӡ,YBy^o  tV_3+qტ\.Dr!> l$#;۔&$F@6uѣ(4I.\мe-( Ua=Ȉ ζpz\7DSR[qYX6m.O?6U2*;W[}2^Z(W\9.7UzPϣOMh`{m5W8LR֑@An:Q$(#煩=+]Ʒd5;Q,`Lɥ@Ta\6{Nѿ`EP"U]LPf<[fMlL,!0hv2h)ǀt#0>$ߚ&>ikdQ.ӘWN8H2XC ī8v9_]a]I |~2zO>='O4i)/#+W\JAs7kҸQVm[,ڡDr?+ł[=rPKG5VQԪA) 1nB^#bXې?(ٳwgs}[`9?O>'O&&cNsN$@qN uguBԨq#%ʐֱs]:'$&*2 Pz(䉓Yk*2 `: [ uΉOHlּyk?䓯LiSg|i'6t+_~}/f@e)Ųt_x `LujSuNKi/TYsϽ! 1/{Qƍ+B_kv/͙ե1yΣ=&()Rz[n6鉯1eƌ3)/ݧr*9\2 )Mo"Ak@ uA)c ǎz 1r"#DjծݡCԢy5o2)9+|~BD 4Yrm'A3NŹřҽgD@ -7c! JJUd>=#|>}tI6 DD5 \gͪ1f;vِiq&Z?0Cgnsջw]yx`y=s hgY&//+aE5Ղ۷nAg zbVz]wWs'[ysJI㳔36m2y„\36.``+RNQOQg}aWtڭ}9GKۋoKP:|'O^c*(p%c\}wHZV&s='OؿwOaް.Uz;#)aNVGuֿn]tQhv2#cŊU~o-*:FL*byOJ,0{҆NJfPFXn}̏?墇i6z.䑠/a P\V>xpu;u `D䉁G7n ^^2ɀ`11R׮=~\[k۶m*WAF& N*ݷP&>smkO٪_sW^ɡ)g6'O\"ILEPH"iGU)i茹se}>wY?^z;##NZV%Y&$c_|eAyV'NW._/Ѩa;5!3)0>{-|[zzOԥb^@ iV_g]x&Ԯu׿3eZmNV"pQDbc [QF_c>c]t&J\ۦ}Ǎ'>ѽ[bf'Y=Q/:qOccذs:sy9uGe=1YAwni<;e{7ޛIˋ -T5ŏ4mw|{'m2)II}/荺h2PݔB3T8nDd Rbm7lPFרy]wOHPͬ(R[hҼPH֏9.С>sNrz*`T=k+bZD<?l\BB]b`XPȴy!K]ufݡlqsŗ{E+RT=aLŌI*TC|ZCubK~!-𵠧~~=e#|Ղ#?=r##̛MoO?'ұp6n|%uc<ݺ#[E+e5H~8/o(JD"TԨWN4x 0s=rU-˖-8ypM+Pz}c>}bвE`nD"ؘV[/S$.[=vbQJڵjHѶ]FMz26,³19f![Jsg|Wcj0 oظ aA, fλ:v,+boikD΢.qʇpV),1K*" 6E3- lܸWو E_TTt= _ BB|<z0E8N8$ѥK6 vyG0i(u"F۷׮Dgؾ}ۖ-QQnrЮM4iHbhpF)K@ Xv-ܖ288)5UV_qՀX@?~ZZkfTĖTBˍ`TEaz5fOe .9[$ٷ|~:O>={΂?6nڒczzԨAcaWSx< 6nit*>\x٥HTF AڏlªٻwرǏP"Fkj5k|zt2 7mٺ_'|ǟlwgvSOJJZZ TjM!<wвK Du`Gk(ktoۚ&}׼EkgR h߾-<.J*J|[K㨾э^e`v .@4|-n֙Ywy~-GD.nҴ ]yQaIV~]jm#9AbFϸ؏F .O{zyOF5e1wg担Uܻ{Od$Yj_&S1|o*ėТM/A"))g / 2Xd_~?geger]^:]ZJh>{֧+-[t;wE/92޼CÅ_2}t,ZF 1Q~ ~GTb`7&:dָA"Yijժ5hؐ.fԘ7`.$ٳJ2ǭYd3Jnw;=&␢D*:dwMu9D4r,^ÎSaO(zс7ڲq\X&WsX'.Ff[2vܫHϿλ{ӿW}ٳu@{uS E~w`æw c]pddP#CѴ+N<۰X\ڴ3t x2b˦btgK._W`:&r#hBVF=wi P[ VA`#רUk܄ ^Xܻ%5kgf:v!{j0zcb"snJRyys?ߣ2ؼy\@)hٳj,2^ajR hry&0u:st 7M6mO?eĒE-*FƉȦ'4i-BDfإ3 xwKWƍ|X,0&"Q(?k_Vy<e'Q頠˙^>lgsl@ጰ:(ʩ~Wb)J+|{L;)dee=|D`4;zz4.S #NN'G@gk 9Bhey!:FFzFZtʕ^FbG٪M6mVZ3ɀ*4j~ &&×_ҥuT[|* A+Tf&сeՅ(Ep!u9 ' _2y )E)I'?NElh@"ǝ£mUXdP~!2RRz]pko)u61rϮ q -Pͤ,#lQEwHj@yA0@lAOgȧO7wl|t=gqcWo9dSQ4 `艓F) !( ,T, ` Ik>UP@T`W$ U$@~a,GIz$:cFOƲn&dIew1Ď:Y3ca[½~ݗ 1P52"Uթ]J@vjl׮^3nLznԸIx ;YBBIr-FRU2 ʥʼn Ky9g l CIU*l)Q<;+===]y/xࡇ|?/+ALOؾuK,=r> :j9hYF;$ [z(\T4>M IgeZԡ Y$a/J7L?.﫨6܈$Vo]ĒY̎E(ɱ&Xa 55/3Tc)Sa iEQoԢ'%G"d"(ʰ~j4)o[!Oq?]!b:ϴ"M;mݺv-@E-۲y-ȴ[n6hب!;94(Űmۖ._qPZ4 ԴizuK{%AQnam,kS^)*eVTIC~$! V;$TEɶ ~Zp@Qlsz~u܇}Cxdž=צϜS̘gundD'σ?,^D?`"eʶ' }6|mb߉LjsW?S J&bc6 *4Bt3t_͎A}IyNDή]tѵD8~ݻ5KYfE}E,enPZ@ĬjiA 9B Klz" fѓJV* b5 Mą/6&j?:&**Qё%L t",BM!nۦ^`DDF!.` R3ʰʱ8^T%&%]տxQs-|11;wl{J;bc 0nq5jMe=+Ptzp~K@Kcm ǎxaT r+3@1(ed;J_^z'OL4DfF1c |`Hڡ }aX9nKXDP(lP\Iuҹa_c/qא;ۄzU0 KĒ5Ddee4IY_toW0`JpZ6'19yGu+-+R7)4q֨Uk7 wr>zqS mȐ{9#Vr&9}tg*pO`#(lX|niSO֯_0d ,""os뭥[n˱հ[|Vw6mO?Wǡ 1Ͻ?mjd=gP D)*W2uLfXn[W^y"QJQҤQ5k=W^/uom?|4sƉǃ%Э]KT PS]d&084H@Zi]ٯ" 9x!RFM@e9j\jB}_vmiVp[3';)1\ݵt\c Pg: 1Q37 <șڼs7uQ<,W@Rժj^>\FmcI ,֯6ԣP`"Qr쁑k,VͩU\MTv(lؖΠ\{ x3.zWA kA⏲@U_ oebLa&㇏{68хgfw>n"y˨NTZFMX޽k?:%kᤒRj<`*UQz_1g\|4E*k׬Χ7rB,w!,5hA31޼YE֤Yhj(\2TFeI: |BXb%KU Kߠm:)AK [7AHHW /k,#G2[ +1u&|X]dݸ16Wjvn۶MUp|~ 4g}nY}KxFYL5S}㡑_gN7'J7U^)K7!@@tVC@xtSN9B&McG2UEGJzdPJ%dDPvi)p4o A܌$%&:fӆ _-gmڴSg[ȡA*U$ڵQ{ kޣGw-&aEDS`ٲMGD:"*r|S_({ a7Lm6,좾D¨7~AEm)Fj>Eded^\1hT%h@#g&۰(?۴T+03r;-e*YM(J2%orאmں.T"~:ſBq:)/痶_f cCrW-ET@7XjSJ4i,))xDm]sazq/(%/>?YQT'vpiR2@ǂ4d!ީSgz!a~;|ӦNYrPJu7Hшѳ'rI+҆D6 &6]_mڬE Vx6lغM@y(LL gk/3;=_ΛomܼeeOhQіWhXA/Wgeg*i/ 7_SBm޽L:}@uh =+M E~={bTS?ItdK~l+W2ETVlO8Ͽf|* _PJDYj~z+T"pYO~Ћb9Ř&,'Oܻgp޳@0 B>8 )h|gVY3{?b"1c?,*x% ]$4d#8g1)eXOERQb۴k۬y3cͨaEaC\(Ckw1dꔩT,u'Q)$jڼ6m[^C2 *~dX;vQKrQ*|kX ݻO KuOFvڶȨ۷ {п_ozM|wO?VE2m?vЯij"..>*uAQ}1&VEq:a"R]0FI\v{xFF={14-:_'y )-hݦM]' vĸ;=:/(9:iwP`D%߄҉z#/wRЌ҅0dƴ?no۲5W~̛7Q䄰iCB0Q2Cu %9k\2WE G1 >zȰ'e!'O;q+f}0I 6⽔O!Ql]Tcڴn޸2u}?'׏;^,ZnӠQc?OVd5O3UVi"W*"[mcg?n@S=pt1o",1R`ڄpsf2P9a}6&K.TaeIãcbV{y?@"Ѿ_~g%ZUVU,mOIP7ɁK=I":*r*". fs f~ϏX|=ێpz 1j~X!` Q.\ˆ(y0111{wcO 믿ڽ-[̙3ww>qbn~ V0vCTceb4Fv, d$9fھ-*&!Dҳ̛3kn[YN||<|b^^>GҶn۶~kVrCz)c)Pf6mlLB7AjHmu:&&%k bjXJ> N֮]C^_l"% X 5<2"o>p@}֭o֬٫c_!ƕW^ٜi546gH}ߞcF޽{˖aظ8j^VVVځ;\nC16&X,0hU܄"оdݏ=H=5jp8s۶oTқo=t- 0z&C5a}gL{췒O߸a />߳gO%LiqFOti&pz d=z&+bJ+4]b7x3ujd"?IUDV\qsgl(i28yyޯ>kҼyFwm[7gg8hzXF[mZBNNJpB]V \W(+Ӯ]ԮG՗Aru%@Kn`E-bI^D0,"țX[ooÿ́*D/>CjTtT$fed`v+;vj[OHd8`T%&&bEOU^ >ݼ_ja "#*aeu-\Eӄڵk{9nr;"齛kV&;ޛ2e…Nl |RVE^CPhẁ9Ntfb a 1e rQF? :d? 1U@Jr?Bm@SЙӧ˻ ޽kM=bIGlYw} c~kV#2*2$0CKALH\qvKrF|ۏ^/CTmj 1A7N Tmd(7%Z r(d+RRF٨ISz J`gT&܀ ڄp=hвeo12Yx=xz@{t Rvd1DI%!**S%y R!㌠hXX*G]N]U'i%RTF艅Ya]_(_6k޶}{' ,lKYTb*=7R JrYp9! !Nۮ=֯7A O= e4 LUKȈ'xGsNhʤ,lS&HT.ل`*R(LR,F *%>[7_# ʕ*Zzz rY*h`@°0/+Þ$qDiT(5\:TC&&ѤHRR@mDFq#8",rNL'h߮/<_FMsY b*Kbc:uJ_f)TxZj1qCFRU46%b}A åD5kŢGnO?lbrD. [<,\k ^ĭeAD S>ֲ͈F=_uɪ*Geg,,$truy,R#-S;r%;2En:/Jvrrro,aXk# ]~XI4Ҭ, fM_:*/y?W$حY9C zcJ_Rwρ PX$oi 9ěG UdrfC+ ),B!ZA[uZX4T9S}iغoD@~niaa^/gAoR 2mڶƙѴYz^ y^o]+U,7nbIS=\sՋ/gvvvKL%V\(ac/%[ kZn(Z( 4mU8֩3AhJz rH&1sfrYAڨ `Yb}Z#'Y nPř`fu<$]RMp`5B}熛oJ$w@ڎ`-*@}[8P{52[(}sz˺mG5(w9aW_s5"&yEVa=A(q1= yAo)'9A-^rɓGKahD3*zzo EQtc QB2qRbDT'`R4w:彩F]> 6S^s!@]UNVݺs} {iPJݺx&զ_ :srjԬѸI]QQZd@%E8#,ZԨY},F?lRJʜzds}oO ìQP-bfh%`U5U^Fط>T? \rq^zJj( E2Rt(x * \-TB^I I(eK mT#^\gM7zo.GD+'b%ԏ?E(X-FFE/BڵCQt@nW Mԩ[\_O$aa& +a٫MK }1~kD+|衔)_T~8""y"9}/xo\ An8eA9%ѷ1f`ҫt@QPeRTmQҧ s2~ \^W_*.!љMB:p59؋nWǍmڤ ^Dש]wHAzm}$ /,߭/YvmBB&"y߭[7],-ݻA5kgfddêN&WKT\Un~/"Roުw԰a]zIlXءCN]G 9N!+pos{Y9ڵTPH^_ZLȁ6/J6u{q۵㮻 vX,Zjٵ[18]МۏF#`G8Zhy5ר^ػwJۋ ܮ\;) pJA -[P_jv:݀Y>Oo @bBٺm\ѣ|3ZT4G9q=rӷ~[ttԞ={-\+Ģj3""]}^1`[nշo&͛cHGam@=;0u6m衧zeJdӦ`cPZU+u9qz#H^%7 jՄ۰3331 }nV<\#׊+-]#u׿_믁uK;>>_Gvz pq 9Gг~iiy򄇣9;uԈw/c~ϏX(ƲVYQ|s*իWkִIY"vܵrկ_ VdgYv͚5Rץ:B"?nu8P/:u6o٪FjqO'ׯȓ./# ֡|VVM,XVMx_&uK֭]{$- s%0tկp]~%?W!YiÇcElNwd1coТU۷n*6 s@XV?֯Y{x7 N,7iھSgEV:|;10w0B5Zk׵k.;ʣ e֭ eqרQڵ|M[#݋N#j5jjӦY=ڷk08e8. ]]6EP7nܴrJta_Ǝ?//ntSZVmtҵS<{m4YQ&۶mS1Ykצؿ ۷S@`W~lٴؑ#0,AkЮcǞgըQCS}v؉IB-.-!!u9* vi7_+`qP[?`^vkW<~8iv&J)ɭڵRk.r-D#\EsuQ=Ob]SJTrv2>&zX6Iy]r%sːQ ޼cԴGtJJ ƝJr\N,"8|XFFVUBY{28-_ 44444d' @Oz2Г' =hhhhh@CCCCГ 44444d@CCCC#̶rj<""#6iT_[.]xm'_01g!xS#8+fKe^zez c}/>rp5{]E(z5kN&xpقH:Oda߅!mҼG~ܸQ#8~+vu{4l4^G%khhKƆ@"Afg~~ q~;޵cGlllxxxA~~[h444ʂ3`P1H@p>8 Ӈ\{۶^8fӢlْGLeZ8o 'lG%Gr\*$H东NW~ABFFK?d_vޭ5}*k}jʠ=*E ΀FƗ7/Y^?TA{f >S*r嗥$3du\YQ9>^x7_{=!1^ndddfzG}X544c29]wʻ/K~48Řdž>9rHš?[c֍bbc<_[m;cM44LDkcqȿ/5e}͚5yᥗ:upD:"#t+@C0SSEL4Gy}8y3?F=v?ܞg4 C 9R2TDWf_7ﻶ5ժVQT rw%^Ae#@CCo- *FȍTqQ![ࣻEQK׫(dgg;̬=GL @>hӆ+7+;:-0g3 z=iy/*dfg]ÛxU ee䠭PYi/:vZqRAYԙU Wu2 Kb|pcGQ*-Wlׯ( 7XφM8 XFfMvܩmv1ъ?~bT _iݺ ==vs\tvv[nZ[#n֨Q{uYq|VU;(((kP^oܰ!uݺ=w;vt|QIɕT_^˖7i *CyqPڦ׮Mݵ{#G]N'qqTE3Ghݺv¬ Xw4\vgv23MpI'4\~Y iߞGNMXX6Ts4 {k_. ' yr2%{|p:{yw;-?ozҿקDZdkթwYg];`@>\2o䨧Y4- UHNI5<|7vlU d'ON>n\>=wK/4 ##7^ׯR*/+Wzr]͢j@O yW_ "K>_@-Cv 7qk_">YkVD;P4q̀} hrlݺ &]k-SK1رs׼-Zp ؃PqR@ l֢e]^|q{}ܽg/huk4JF-aFnݦm߾}񆺵kq> 61&eq__fxrs=G;r8qsc>k{s{9x0!>! (pDEGq'$$:,{}񅗜Nd, Ǔ=ȑR'U a}9rG@ĆY-[z~yN;%j>@K8~gg?p߽Ç\/6әCU8v14L?y Vλߜ5lŲ(Gl#BMd8AK]2UZI;wڄ RF:Tw(l(9>c3?pkST眹s>x/gL:Q)dUthb|\#<|ƿW_]ȷ,`1jFED$#io>3j6 5]9csrUB #p@<0 WJ6@@/,Z]w 9*!J0!Fe!1)9)'+ÙzAO9%ͬ:vI>୰c^Gs, \Vx= (2֬Y}OpLYjQI͘y]wJVhZb>g?9 aG"A,սJ+yyy&N5|͛07,gv4bFBfef̛3QQi"+;{G<LqdRAA$LH11׮6tos(4bcNB ^sA{mc޼Ǐ(ꉆDDžM`+j|\C$d9Hn@ .|߹m3(Lzw~:*TZxFhѓOQ'3ƏYO> iUM9UQ#Fܾ~!Js^;TYn聵- +/.[.@ȧłs`y TSM.E{YV y< "S^Gefdn􌌑#F?m/?:dY& LGo䎋OpfgO;vڴ3{VC02E5p!N6l.\ڤIy^/֪ a`r\8{t9y^qiS,Y7! @6"X FJvӉ8A=kɘѣ>59@׋n cò K_)2 jm w8 %$kzדU)nԟEGE1&,`ccɤ6zl:yy7&OQC{d5>-[w"ג˖06ن>u##"+ gZfƍбmUTps0(i>9l.Ð{֯[RrrJJʕeǔMVX\׬Y3J|NIOLlզ%\Ygᄀ?{xӀ II:^?p`k–m`?z,''+""ԦE9} 5kСQO?o\NJn[6oʒ=͚.}- #"ܹǎ_%`_-b4N<,Vnڟ}^.ݺoHO^^C㿂syϽ"ohy~ kUwJa7FMY1eu3Zfͯ\ЦUK$ב#~] /蘘fֵ"1?a(!rժa?6laYYA\j֨T?>5 :ܻw= _4qڵ2":[2kVR&x|9bL|ycQl 9;UQ;{[nߕt?d̨3a´!mն]袦olmj՗_ط)@;s{L Og=le%P>:{ 5ƒZO?՞0u}6oL6la;m&{rXO5~뮻6lukjf|~zuUr!lܸoJ;xnsbi}9[nn|G3s͉[IF~G";ihyd@Oz.˜jjͭ x 8XPgu\]rӣGE!1nLuϐ!lQsUyի 0v#t))Ϟ2G}ּXJ(O^ 0@H xyADf/u>h0VZ/./8kH6"֝=wnC5$f͞3J&K:ع˃>rAޅD b Y=ϝ:cz"&^{P8Zx`8g-szF|чbsa&HN4 \s^GuK6iF??~@^aXb_(ulݼitlݼm[L(0ͨylp!^4Pr(C|ͻ'MXLT\1Ϝ|8tpV2E^O,=A=?Ǐ3W>/R13ШagV:LszFi-}sqg  -8?=wj13йS7~r]fv 22r@Fr\:ߺB. R3AXV9h\`-[jFҭe^*Q^aÞ|wڶoWBHMMoF a#1[oVG^"d];/^, 3 c2B00Bmt>@D)Da *:%<6\ P2#FXE*)IC+19<; a?vxS*p{(5V^_YݖUΈQ*WHEc7ta$٢"7_i&F\.j.q Ȓ}rsb /ؼe+$[M~w=v\2ajiи/ԸԏyjEpZnuǖYf3k]ʫ/3/XUɓe(ZK_u͵7<)%஻":aUQ86y,\Tb44N hxCP/Й)BQkw$"Ei ]|1Ae+ $Hj5k=R~cֳY[DHO?& Ճ-hmii""o\6δ]kԪ{qUVIja- WuV#$)z@-Ƶ%ƪyVOۘJK9h&ϫR_8Ju̓'ڸq#]; *LzSBߋ/i߾U?.n(w.gM8=X,z,Iq ReݹG7(QABC͂( (֮ݲM2;GIq@"o*hgJls:GTtt~A?v{ttx:vux͛JGي'Nc.DuXtLmNpP0w0###CBI{-++KqFaL쾵<ޮ|^VȨ1/- J]!tcJYt?Ǣ_Yoοq_"ixOkV:P0" 7JʂL4B+rv$X;^쫹Q2ީQ:/EVRJ=XJ\~-Y@,ɗ32җ۳F}l޼GIHO?.>:(7 n}+Lt,\$~"ŠF6o4*:@i88Tv;8qX(ey'##~gDD>2**"84s_a/DH5|ŀ|[J}CArE,Q6TToydhHHqP%Дf96,}z?|dԝ&DdKIh(Ǐ1'}lm;GYY99t E ƗvGd3DL_A 貢~O`>5Pxԥ"rvc`ͅD [ԙ?p*kYB~:Zx 'A_ #IN:^'~~ۜͧ)BUK|70y˖.V2#y'GBbzՊW_z}!뢷tfUI&)C<[MPEqyꃼE{s3ǃ,C4Z*,XAaƨUV`=gr,L@ho2؊=)WCI]rEfjCDD|p֩W/333.!-1%ׯ[cM4? W|>=ĩ]ͦ/, ),Dr[ICP?h%NAGi ]\)Ӓ,Qψ7{(iV@.v11q8(r11tQuJ0bbPO͝8A>f2ޥcʰEEE f3 A)zƴPjQ63i3g5mn\/}:DÌh'wko'#** lRRy~!6N4:1"=DظȨ(%YCLָ5>6ϗ^qgZjy=q ISޛz(R_?أX:=9>'M8;G(ou9 :rHN/>ߥ]>5>֕;u~璓DxjԨHઆ>Y[K᪼^o*U}yFexMkG:,,f^6|ǣ 9q>O=9TqX9tG8y;S0FX,:,̙S+B#k.Z_vPNva.DEE3uE]H{;ʎ/+Gy֩S[TCłFDe``ԝsV𕽲@ԬU֍* >aO - dV8kvS)`xzI*=Q|:3 5W袾cǾ矿+W_^}7(ONViӳs!OLJNLJ9*EFD=lٲAz&/'t_ZYZSϴ "+귔qb%BCiPV-Lf.E]o;/ kRG|TSB(` W($!Gpn"E u|,Z5k xÔSN>lԨf-[xPQW|TE2DPE/T[jJ xTY(ƥvk1Zst`>J "P46ldԵᴃj 5/Z⎥ҥz0v޻md7SרUvN/d|Ko`kGy^XJE۽b ff+WFE6m@]oTcPPJ!]. RE#FRWUGG_:rƚڢy-e_(㋕ѣG藙!x< 5Q/s/Y.Dzumw ˗XggdrJDTMc˸%- }P]ziPE0`3e/$`zbv gAҬYM;P+Yҥ +L{v%\zdg|7.Wx8_PЪuпυr3Q孀 |ꔅ~-7׫_+w6 qt U9~]%hhF0)7aOg4(8WwS-S֪pg995%rݺw!!Tp:sMS{ RT44ڙ11sٶ}K/rqqq"Y<7%99F|č]V\+7FTVNݺd8x" )fqo54aM}GiQt1t9uc qL;|+80JlaȨ?~mڴrޏT$$G/@_$BĔ HK;?HYz1hLbRJY&==+?bW`ɛ6ig54 fUIT.SqC=q3T_/G !9%zZj%5u8"80}tOe{ű雃\^xf̳U?~w߽Ju#9[I9*@4a1G|xm:I~޻^|9E =ܖZ_ue?)mDBurr&Ow߽O% F*\ /"thd1̳̮/>}ĉ%= y/}Flnԋ<~z1pЙԩY/(1lGόT@?\۶.zj1v˵t޳lڔ쳿k%+P7{-ڨR_'5z }ͭߠ_qE+4G6&5_-^( 40|&M~z֬?fݧr~9mb'{Ν;lo7%R.]/sz]jظX;֊̥˗[+Y-thzgs`ݚccbcеh5EGJܻυ о]BBBr*n?+V~wc\Nia !uhxpe"X0 KM!Md@~$.>iWQ0J3~C0(/dڵ`-tnҠ^3C|{gŲej>d+@JJ۶kب!QQyyYYǎ۹}--C_?<1t,5,zEժ>?MO  ׮S7"2";+s׎GҠ*Ed [ 8i$+ yJEM,}%B&;0Xv#"rVm6iҤvZ))ɱ1gdٻoʕkָs]5 Cˆ_)'ݻ<]۷W y{"1m6 Kɧ(@]Cmݴ +e! O9f@xP_ NwdXo)~g0,Wcժ͛?L/w8nJhAB)a<`N!Fg-{% la"wSp) hH;]r Z.Azu*HmMA6$h#Ž]@RNvVϙ>sF*5 m„IojvX.RŤj[FӤ'ޞ2AEƙ K3 =@A Q @6v2 EFY4wP/ Կ[ĀpQQQp111p6J\۷8ir`hBDEG{'1 q`,wREr&a/@B Kp9so4cNpzFbYHgȀ/ҭK Lh]*(&tBlC`@qlk)~8: 8'PwV*R_ʂ a&#]L` <=#2; CjdDdLtLlt |lc=w4ln^߂(`cH`b:1&ՙ+k0%gQnakbYQ 䲂ѷpo΍7p\NSyn80]˃YΰѣxͦM+1%2F #ܦ8 S*'yngq#uj,M?0ͷ)sW: x3o}pBR2ToUTq t*ʊmfLܹ/޲eK$'&cDdl(sbl9 ĕIDbHLV^zYrYcǎ ɕ*_|%u3+vڽj*hL:$$DFE]tEm۶U"&&^j~#p<ɒJh߾}4k~U-Mcg^ftztn{ɂ'7 Sxn,QUqP;( ]vYk.8to'::ZM6u޹(rs8n;w:t\ KTr56jغU5kȭ֕\>1)))mqR(پc?ciiWRnzZalU)l? ##h/4zdHOO\k-""Js 8#=cΝ[m;cOiqUVUNM۶n]ZUJe;5^O쯯m.,u)timF:[k4h.n%#:5ִVқ]_Fk-ذmat;J[[&d[%kPEPYƵ{Mu[L{I/]bLlTX-m8# TP+KNӚ5 B+9/.mCQ)g [\MI(&c)@o=7Lch_[nvw}$i=;&\mz ( >ZXi7VePCy(~x,-f6!˱>jTtSL-EM=ݰӮMͅIa3_[\]̶eIQ.d5 E,4ǰKMKOA4Z)GRPEPEPEPX>#O<g#|-;L}?CN:x-mM[iuϽ9g8z((((((((((((((((((((( Zo?DGWh Zfmwo xBOPO|| uW⏇u9~ڗc? ~ȟhto|l?_4[<-2_:la/kH[+ʱğlu{W#_ů^ேu=D]j Me.`3%Z:ZyAAsz<sf!dK{+~oy&'ZxffĚƟAee|o|QaKNd6.wa&Z;Yuylss񝕮~5_'b|>ԿJj~ x{$xcE_ x]>iJ/>.%SO Ez獼[?xGO |:Ц4I,]kus~kR]gÚƺjKgXtW8J(K FF|O[?=} A$\i9xDq{LSE$E[K1N) lj=!Z=I=KSX闒k?a|(xe狼I/Co 7A-?CӴgj/x-GYյ&FtOkAiYo4vy>$V5>G>iz%zn/xZ KMҾ]{H0S e/?[~8o|{@мG;M ohxkKכ¾&оQxkN+=}GfKL֭qks>$xW?~%dҼk.~x'Z|c¿mWM- oMabKƙ/> g;ť]_^Z-R(5 j5eXsMmoz›_𷆾'>n[xK;G]/㹺/mDŽ..mL -6kExᄟj=/{׈ _m|qiIMZ&;(o&]cPK7W(?U(m|\u- f:5 j? C K;z^mmֳk|FFJxCτ 16C#z^ xu_x@ѥЬ;x<__ dx6t`xx<>lgfw4Gf8.o_6帳qW xx߃<t} *մ^G(pfv?HPEe74>#őY| ЬfO~1hNa"wZƵuǬMh#CQ,`~4j-S׎g~:FNVu 'Z |Ek "𷃭L~񎵤xz~EuoחZ|lKG|iwëO~~_1o [ OqOj"OZU5Coczn6]ҵ po#ⅿ?փc"_g[~ߤ_ nIxsZ ~9|6:nsy,hp~? /#_ m}{M5]Q"TХZPYMIjW]{ѿ<q'Y=Ow~q~z 5wEVTYoæȖ^t ϫMW6i߈51ߵ ׈oƧxd2h4Pk{3qľλ_maik~X;AƓe-UtORӽ^-R\Rjk GgG2ð)1rIrSSba zST>|'Z~!xOþ7o_ GGwPZ}J๲5t/\Aɉ#V y}+?ާdíCᗀmF'҇jp[9.h3imͿ~zsſt|3x6Ŧi~!χ)|.Sڲ|Exs.|M?xFo|^m_hz|6v'..=-NЧ.=W+iZtoq.5 i^Cow%iE[p[O REz_Nmr,mTjzy;_ h}O)LJ3hsc?UU9TZVrRpS|?Q;ǿP|+1PIB0S kB^5Pv\IB^@!hx[]jSR/]? f_>&Ծ3s῍'k>>|1v^xRvxKQ𭯉9^Zj^??ɿn ?UFj ~.M4XekjGxYصO־$z,QL4WwNH^WYc>uRJ.MzTMj>B1`1Ա8O7:Fc*8&;*iUxo̧*b#JufjT)B7P6?o<;w++ g GUԼ |yq{}EaYR!Av϶ҼF?%=ڻg>8;{e_>SWOU))RQ.H~r{Ki{*jq7GNexwC>*X6Qx<j_;Pn켽ZYlТ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_](RLմv+gW'ZepGRʮE (Mz(+"@ѯ'Z}օmjL.mMR)6ͮ ?G |+W!^<տMo3&u=S'^lۣYj:h_.6Z<\g^Q5-Ob?ٹ;+arp4pSաLVl=9Մ",V30k̰8vR U*?(QtiFNnJPm?c(/7fQ wp_Σ8߿#CDj1 w?࠿t61GKu!5~;o}-+Am\οox=-uK;mM.Lz_X_;譮^=弍ƽCVv{;i4ILpQ_ ¦,F 0ZJ5T)PZy֫NQ)EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@yT@Q@Q@Q@U|_PW#o@@((D#p{76QYH __4*?x|;Qxmh{H,K!X$Vy$vTDR@??ˣ#y?esFyiijuoeaaeO ^^]JZZZI=$64ƌ> ;]񯌾i:4}xOV񎄐^Ƈ=n_ \q5vS5ldXH.OP.?ԿzT_+<`TQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו^;E#c7<qAa{4MXm.elS +ះ*]i^i|Q=|3]w- xcFM O ^^jZ%QmV8"S!8O-Rri\)7%f{n9L9ʳ|U[V/˰}<] ž4ibpV/2,d+"Œe*t=3R+GUÁ& sA4^^kVo?յ ke RA+( Z_:;k=/Z 0 xXu;=@h Ԣ"}:ULNru.W6QOO}>x↍eo񭖳m4]KCZ]>ޛb eWietk+TOu6REk 4k d;Zb6H1yiFex5k5䤷 gyI=,{8G 8R(d ~?OS~QcJ8,$azpJ[VxRgğĞOŭ'*|!7>%W>wC;kirWRmA nj4|@ק~">$x@Cͨx?hiυ|=γ',vs%zh.]p?@&mZoꗷ^+kxψ~ͩ~81fӮ7Cxx3zSB>|i/=# >&W$z-'zzpӭłxy5?LSzwkVژ~'~Cs=_B7u*ɂ캖j7?g{Y"ɹh%۲h珁h|P:O;ψ{}LY2M4\]j1!Hc~֞.|5uV]ν[\wšϏckB=B-?G_?|%*&i:mON.|vqm,LmS7½7~utK^>(cvOi0&j M]]co<9hӢ5?V>'`wks rv $<_ i _5dyqo:$Z]ŁOOW[g!վUվ |AKx5~eY5յ׷[ė>{_V⿈_/x@nc|($P G|&lI =rړ +1{ee է˝LC[WN|;@__4*?x|;Jmt>Vү,u+MF.4>^{9HFXUhفGRytuد'Լ{~(;wǯ\/vÝO7 UOeyk6nluHuGa#G)aCo}O?$uvo ^Kk?ZA_ |?˛'EֵM:m\D!>|DSkRRDO/'tcLWYQRzEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@yTs,2覍rWtr)G]C #*A \ƛ N>O+-ԅ}{u/ }ϏԱMҲzs)lW]_/kMz< J<5LUXN0w9}= sR>xWҼ9^h--SXkzh& MwI,֑>v2+w][nm?2 w0DI$tNTm|ds^֥uo{W{djSȗgU#YQ9_x#0xg쯴}Ceݬw]{5;̒٥'/?fש$m$oj?!]7ӼW˧뚆=8Vǯ1ƞym6iKM~uپL+jRč5,_}>;Wy |:<'@߇Ƨk7hufKF5+۶3J\M98- :]kG|Ej-٤keyMeE]A,^u9mCᏁO2|%<xf?xxr+4XoHccR{ |o;h<9hFx ѮD\vvmGon˙bIa%Mox[4ƾ ߄1=֢^|.,R+)G W7ZC~?/,t]CNF[N4:ύY[x{_5Vw&$ОESNH-Kgc]_~Ÿ{35 @x*NH[X)eB8o7ǢcZtV=YX"_Ou}u!%[˛]渚Y]ݻ?|_PW#o@@_үt{H-/gD5 ju}Z5 +[e܀yvk9Bљ.MῈ-\rkO^m^O]CVPy/[fU)TM&z_ү| |9 ?c&ռoS-{]'Py.KVxbzN(mῳ\_,e#YO|Ti^k >h<.6%BYK~->"; =B%'_wV0"yy?og ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +f'+.k2y/mRXƬwa w?l(8cc뉻g =v}762OG!XP?3 s*?@c@#,u`{|C???g:0T= \ G!XP?3 s*?@c@#,u`{|C???g:0T= \ kTnc[}=u^Jz\vv:qi}wmjwDֺ֗]k-\Ky47$V bUu ?3 s*?@c@#,u`{|C???g:0T= \ x7st ?Mӵ+ YOQ.o"y4] ;8a W(z<=Eеd~ CN,"Kk7Q,n& he6ߋG S+TpOvY07,7I#,n2IY3Wmss+7kE[vxO[/ f-gBz-MV8TUAVqfЄνw IU(TW~/[Q ]+9|4Wo.x 8'-16M&ϱ.?ɥym%" JK y}-YB'dYnKeeI${.m5\Y]'WZ#^BZZ%(Ѓ%40E#((((((((((((((((((((((((( Zo?DGWh hk6i(s]HUs䌳(A/z_ -?ۚ/4Z?4_ i0nhaiǨ1PcKJ(((((((((((((((((((((((((((((((( Zo?DGWh_-j_PEx'Ǎ{_XVhZ%<mk=jpk^3]EYWˊNc[{^{s:ej> ӯom4"]& [[x42}T(uJX]kZ4fSO]߳mCh^!&-' {浯h_,4}'I5ca. VJ^[ WKem_Yq@{ gcoxGF _um|<=׈|}Iil%/l}OEak'Ңk|EX:]M7UR;9a)F!)J1e(M;&ٝX*p5zz4BZ2*F#$ BmBjIYM&g.x\QUۍOG-"|S9XkpKw/6_ߋԚ 3x{'Cifagn'g⯁|!oh[~;ῂl|<|8fO^0_ƯZ%|L._w,vpp8zw*Z-:j_YK:ʭhӧ*s8k(uxe,=|0}2IY5*86Wk MJk]Yċ/OV|᷏' !Jǽ➕Tf_bS|q'~ϺoК濩i[xBW+Ǧ\*ƍjN"|- 'Tzi\[G +IANQ2Jxzm?0bڅJٞIV< ̱5h噇zs<],F3( 5:3g$|8//_ xVfqW3k]k_kWozFo ~?7a?>oŸ 4:nQ㿅ůMWF_ ƏdžoxYJ '|SAҮ%l~|@ |j|5ux7, u xSt=_^gZbB4[m uQe՚j8Brj<3 7U+BOkTOҝ_iKd%N.",-W C(QF8-ccì7~ -bp_Ə h S'>$|?o'xWĨ<3I'ѠxFĿ|Ui?_NޙiU4 @{OfoZį/N f/o'iWWԾ-džtsU]29|ZtxlPG NQWaWtCFdVt í)KTx%FQq`0t)渜ѯF *8nw/7x}C^);O?"8/h/gqDBxbCS7]Ylkwqq2ku=b)-yfnK5Axm_x9#\x7> ?5/uWVþoxkJ"H FY;~֧uz=C]S⯏O%ji<w7 |=1'φW~?5VwElmØY7%W#܆yf],K*ͱNa<99' 1]K(~gce뿲ox%㻟o5O ~Ӗ:׈S]JmXOmr-OCA ߋ{;ڥே9_yEc\|<?0|AK8O&HSuޮk.$g9n/0o+.RVh΅>6 ~?~|񗁵/h3MY~2]'^;4)Z9K񑰆M/C֧ԮihkĿ|}>#Qƚ5z_WSGu'ّ_^C%΃HF F7 ow?YF*wL^KKkux;Bx;b' U,fgүs4c5˟'𷃼 ~M\Exžoovm-֥c|I[[~5 >uHt&{l;M_ߊ9?j[G?] C džu 55_ xW|[bYF!Y1sFM®sK.,>Q㯏pԾ//o~ >x?>~#Ҽ7x|B]GuX|?VDRz;% o|QecͶ5o<#j7^7~fOLӵ &Qw⏈3ԢY Ҽ6i},+#\.ipX| Wtx3 gx:9? ew֧d\[*(qaVXjbgM{y›GW(aW|Moqx_@m55^cPĞ=OF+~~v,'Sþ2_ڿ=LW~>ӮuK{.(Zyũ6r >x^>ְ=5V+faGƶ~ |UÚ\\|iM>$r|&ƞ ?GO[a'`Ѽ[Ý R:힡|5o _,>macҖIYPȰYN2˲ş kaWͪ .]19,e1Xs*Y}ia='iXg/׎'sݵk~x@[C_~_ֺus<$bvԒL-|]kyYFÏx߲'7\xLh?v6gχ:必&7 k.ks7qn~ l ΰx}#2%O#qJp~_1k?j?5|S 9|V_Z|`<kz3㟊|Fּ?xn&Ӟd>~-H 5<eaN|`ִ NC:K_?W?v79 ͬi[5=;T9p{YSAxW2> q.~C2Î3n#rڏS0xӁ f'2;G9/I{Cߎ$bK;X[xco5c> DV[vV?"o9Njb?k{ ğᏋu Sc~ֿQxU|]?D1xkwh0X|CɼI5߅s/%@?Ǿ 5|~?ڋ!/:]xKଟ׾ t!O|E02L?W0ļa׏R0xYq7?\'/ p2^%a~&24w03T$~ODTtѼ;a%Cok_ڱ,T:$Ě!I/&Cω&_o|8x_|3go }ptl;j/~vdQz?;8k} -%udx ]ymx)Sü=-,f6?NCTg0J7t6þ*w/~%IDR~$+QhSXwMv06n m |Yp<ڞn|iyk|G𯉼Gc7Ii%6g/U~t;/xAiUln-/i?<;Nj~˳. =S|d3O)rm,9d8l,n ɱEbszY#90yNhgW՚ֽ0ϋOw] x;<!CM?>Jm_ιyYIՇwo4co~|sѨ|x';>ugzg|:λ?-+ޯ h+g>wiHxc% .3c2ʲG-VTs׈F PYN[a1<ףĸq.:Xܪ!:xxoCƽB{[m;l-UmV^][:wPUQ1kUc_5 ߄Wk~5k߉?-&[x9>Ko&ۘYyyiyo&}a]pWaq+dXxT'36mre2|-ͱR X83%$~~%|VV~UOx>~sh.H>i\GѼ9gJĊEӢV7]UxO\x?p3'^ MxG 0o4'U'EX0>:/Cs6Nm;1^%xW**pXVK浪}[8U5|f#G%OmoZ?oo?XGe'L<1x-vOyGK=x㯍Fx#m_>o؃ն4x wb_xz?كWУ4%u hey5g[Q<,x,,*˩ 9a3=. EL.y 8hC% 8 渚9Oh{%l.@m 5͵[}'៎<o? mo5ߏxGLj?Eg>K;EM;|rmFo~ s=cŚ< W7 q]i?uo]x˪Z|!<Y[bzƗ% 1*|=CsCgn͸߅pǚcri\y^ 2 brOK.幞9-sYGχ 7oeJIiڇ~x*۲L0h펃\~7o5xN#ԼI;]Ji/?o/ k1_=Wz?h^_M+şWQw?#ZXmX5 O>|?cjϩM}ٞ'zY?/5[ %?l%Url#yUhVg/;Ǯ%tiЖG3-흨ӟ%A|>xO_co7E&XTxG Q%K*xyca_:xx w7eiQb|I'^-=xC eOA]!y!4'ViK[?FkO唲e?ٔఘG0cKK(yq5g)ʤ"ޠQ_.EPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(#Nо&xZǖOic5-J-gcǟk6m7qMEv7az߈ךօ?w84>7|Cu^|C[FQ)%RRIO yJQe*\j~m5:sleLuUrLW=Zb*Qr>U)"J3j?O_᷌~>;߈/6{sVռQ{x+Uo{jZ>3kؽo{.>‹;Ƿ>0x-~gۏPd?f"Dr"/G u=ލ!.\u%JR_2tZt(GPw]2NrIu' 9u2:t9ƦQ T2'fsJaԧ Ǥo =ƾDҾ !DsJxSl4-[]uoxVռ/txZFU6mJ{{oƟ| <}a}xDѦĞ5ω /}+/h76j?-PvaC{ZuTFe)ii4\з%I{#)6,ֶa aV3 "]R-8Q(! F1u܏zتUJS~q_r7F ᷎gѼua㻿&x_; Au^#&[[i;:'4Դ;X-5K(#?f#:^{j>#|co41=ֹe&[ƞ$M4"ҬҦ;Q)8UQqPJy"\ҾȆ;N*ԋtQg*nq-:j5%NM֍G5C35УOpjҭQªUg^K / Npًa'QO BTh߳7:EBjexB40BU)ί__ iZ(|\0\:7߈[8 ;ONjm☴=" %DZ Ťq*VBXVRQ7+`X cZԝZw%:tJ4FJ0bH1_t^#%*Vap8uӌh4p<5(B(R(#oKu[3GXm.a?|B$5NڧYbZ5 Xl;K{x"k3'x6|QkoU|W>k|mFD% ~5աu  :Tiwpmxbli?©<){ޔM?n"t[co|Si:lM>ylַZd*s9~o2iNDsz7+g9E\&s4r\m(LJJrڎ/ af+`kaibP8߲__ ߂w1 z])jHMI;{_ h6V =·6gsPgে#?`Z (I;ş#ԴY.t.|Tnj|eiz%Ӵ]{N :#>cy:x ?FC>yU)b:Y'exb/et?`08 aS ?_<) DŋMgƾᯊa7!G?u w?<_x;ƃkOX_i^\˩UIc~?eies6+tm~xO߅wmxR[{.~:pY_. l!̱wXufȰv:F__ٴdҩW˪*` cρ4x_P[;6+c|KiZ}亥槨joϏºֹjAkZjIo[ெ6>"_[χxw|]+zk7o.&xEJ9}c3}|O \Adc<ÿj2)`gPdTq5̻`:Yv ,.;.+=bQNqv{/~LsL|jZVzޕjn+Z&okqrlx7ÿ[T|%ig6x4X{9o]-JZIYxdh#q8ynSFXJqY֩RJK8hs5 0 >6Lz>[ry -FU睄kŢ^ֺ PCACmo^kQu7^5Vjh_7'cƶ~ ŎxnWvK :m#ſLJ.4/Z|> gxcA5 hnSy^9j9MO*dٴ+~a*`{Lkٕ\=3x=33|7x/^95_SGwѤ][P%[{ K^_I 2 |!>)NiW:o_wğx ML_Εj6&s~tzbN?>ώ|G?16췩~[6{97Ğ&fUs. Ø[$8k8F/;>bAOFυlG6~1mFO~]O*?Wn8 \,1|+j\1ت5Fa8,ncK2$qNqG5)f:okK*x;QcH|U/~|/R]^|ן/G)?fO}';KQҬu?[_ jz7ڶ?+εꚝxPԵ Y^9aa,D3ܾY+xkV''2 /iV71eQi?\\|Qox,'յO_Z9L>'tXZy 6&m+=|kWZǀOh\ڞ!wqfQK}o,veUYvas:x⡄yn 2=:،o xHFQ{dkWJm,<[{GKhG~Ǥ 5|,6#/j׾}OsfڽP_S)r|%W,D^5`22f1jsL2L^yq'Q'd߁l<;xmy5wĚ=.|aK o_ğ~jW73[jI[eѲ icxSkxH'S W3wu ƇݯfP񅷀5֣4ƫ%;m{qryV̲&>>ԭ]09ve_Tbaa[_fLfkd,k<5_j^ >!j_x+V_2k G𶔾 ]/־E,k{KHܳ>XI|a7Gi.j 4}E1ۇԵ %V[4דiy3;aX^:G +_ *+$ОWxO/ 4xFvy%ե׼C-KQY #Ol/ xVݲit7_ضW5QDfak>k8|Yφ:/<ľ)|  -cRӣ𾇤mi}~֖wy`Dobj^q à Y+SelQf8ج5xyQ,12>.)~̟'(t/A9ik9nOn> HOFDMG4^u_>^|9'r_^OxO_ZkhTKo+]}g='.wV#1r,$j|ȸ)V_^+lfʽ:SY׳|QO5ciУ;_'~$__X \ɣ|C 9rn5qnM߆nH7|/kȨ,%o!IVp&g?kګBVnCk6NMg}fo w^#coCjw,zyWm SqV,gPy߇^$cN!sq 撖t4he8~*,6 42\.L: <['NzhM x_˓w᫏=ϋtn3rD]vEFf(|Z=:Γoÿ&꺧ƏUǾ(o x>uk(¾+VOxC*&00WxYe&}-t[ PY ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@_1YgwͩjNjz?P߉"🉯!_P-)mmm44T߆<>&M@s*:\mǑm-RTHDYEbWQoi?Gލ{ Fs5&y #iU6HoitRR4kg۳:Xq<աZ1/3%$emVkWo/o n__IxK+Yc*E_ῈڅK?8s|KT:}{[%#߅~yJL a%C Exb0A[Sҭ:=տ:K=WS[9Nx_~ (>%-xj.a?R/x_A~?&jY*ɘ1xL ü>`>SqxS_Φ˚S aҧZTr>\.RO2x؋w~(|"׮$\ ׿SF𖰶֟uN gÒKh;+ ߶E1|G›MIax݄lz__|wv˥jj Ԧ:}|}{<>aQB*b.'T'%/f)*M{rOniƭҞ)Lha0X6U)}qO.PhXhT_/ၜ_*o.j8)o ƚW{~>Vק|sD| .KķW G# }sZv/f m-|=u-q /nj28'Z5~|NJĞ%:g_>/ucZP O(s3*/fNGEީ*)ԯ4R1sO&9F*PNI7fU1J+pl.Y5<]Lya1yFXx>2ᇅ|Y֥ͥOS{,o3cLSV$}W!i}!vׅOiƺƃvP\5oVQ4? *Χ.I5@m>I]IUթQsRkW{/CLv)q[#֩[MrÛiG1sŏ^9kweZzuhoͥ[/݉l"Udx/f}[+]񷍾,kŨm{MN.navŢ:T0ɨ[+o4[e}NqSpf*N+{*MFX'S)?n%%|}~~.?>6xšWxc< >g|%vrYUռUy;k^.U|Oƹ~ sviៃß|H~&'i>|>txW~>*k[=Q\#Px_ w_ |_:Wfm ΟέG~j:hNeNJd&cծEm\'G8o# 1f9F+|O(<YF3gE2˱VP`*:to?/O< gǚ8;ߊGïOOkzTYVV?W%k$ն ^׎tjqx+O7xB =O<;z?ïx?u\YZRFu]\_6Mk'qa8;lLj8n4e5sYYYk#FLw 6*`Td},W`197-g2*| 1M5>1|1Iw=}STxg}k\Ϣ>كOo@]cDУsᏊ:]u>͕}vg>5|TQ7~3hwßß |3fx. D < AxKMФt}Cz}m{|3.|Tk^?3q `3ZY٬_ :ͩq 9Wϧ`jus 6zidRi/> ycgyo| Cj-3 Yo'Ļnl2zZ|I/k7?x;BQ~&xA1Z^iςxK+kOՃ}ŧc7sf0xy8nUże,:>xl^iUfЕ*kˈZ*^.Ğ|{>R]_h6mw^|K=O$.k֡6{[Zۇiy"dfsǹ.QO)TpX a\UK GbgS˥F*8L= 4)Y|&1|-OK'Mx\.ŏKѤs:E.x>Լ9\h>2^v/ҼwuzGŏKC{G?hf׼a\4?~V>'Y㟍&^ ;zFY|(>,Yci{f/O.i%Ɵ`G`cx~,ʴA^us|#YpURzug\>&5j)UʮYS7-G3/,ZO#~Vg¾%<,|N6=x'm :敩MjW7 #!qOxsW.L \OYSZ~#gJ+>Gxk|FaG_ 1xyVѼ/6X>:oh #Ꮔd3›ė7Ľ3Pt˛}2/oh~ВxN?ڧZ*|Lw fR7oc>=~xQӼg%ޙ)1aKxGKm5-sY\!#Sa ŅrZ?~-xG// \Cxٍn*ȱԧV0T=U]/_sĞ>gsҵ|_ݠvKbNtό:UgXoo`7gø;q{smQj_F[{o%)xNK{~!w{vWhZ'eQC6ʏGS+yuy x Iio:>}jӯ.uXSU SSյ]c^..n m:9#Ӵ];LmloB^ğ1#8!ẕ<,7G B1J1bM9ɮZkYxotD__jcj$k$0GMoE\exÈql7'<ƅ:MeG(ʥ(`Q_,EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(8x;v ~"_]ƇBG=S^="jVna5֡sS\Mlrj1NRm$mI-[}.:g T:*IB:q91"&QIH~xE'Kÿ>Box<uiOOexö&m 7:>gŸ 7G> 0 WkL𖋧xz#|1Ծ$_o2-7xMY:>ma1֡XXUjUNUo WpH1tHS9]S)O;˳\0ʆ>9Z4i8lʔ'C26VJ'' έSOZeMc[T? u?ec*e;"_ ag2$ֶi {yQd4uyW>ğ|  e _xgZG<ƾ|W(9xŖ>~? ᵇAҵԼZ\rB.Tya9cNZ֮MIFq9FJ19ЌRMTIM58gEK C1b\2oOGJO1iW%[N')c*~ ~x'>&ԞMT^ ?@-M5MSĈ/UXUD[--UgX~/M7c.F~ xH/o#hUǜXdm5%^2U1JJ2D8IgEMFs Y amR<6>5dcVO8ZU!s&߄~M/gßh4Gt /łúlj+Lׄt ו3Onemk˜RkwVC"~>o[W}%-6_Zæꉥ[xjt4t[eN-ՅH1N']UZP8IKUJ4*;Xf4[xg\S.;;Tg+oN,kcÇҴ  AtO [x_GoiqҼ7kyymiaӡyULn2jƮ/V5+Fzj*M?~w᯻^+8OGgXY!XbµyT޵uR>^Su+;]CN-n,o/⻲ຳ$ $h)wDdfSYY[ıOy_Ask,q~Y٦_aOyV? D%*_Xb)(Ƶ5(JT8J.QnpNΕZsRq:' -8I)FKi4ab7o9;@x?~G )O170ꖚ)wim{N)ay_f |0k:֕ /CweitxS:eΝ%:՞`o;qW^ ø$l?r,&qV3eDrEzRi1ҧ, hD~{>| RTx[g{j]{:nckPT}BH ^ No>>;(B[&z׈lx@}QyZGYO]\]jqiK=}]9b)|WeXL&N6|;~~XlTs{ 4ͱ1*bc5Uʃ|1(~^ u K/ǟ 1sރ3[q^׉'NdY/d{{8V*^m2~ͿS?Wm? 6O/h.OI h^촚kTնm, Dkϰ9!X)0|E<&3 |AQ rb1e{f '᷅o| _#Rՠ/ǃ-[vT֯|=E֭o0jSys-Hx_ǩcmo&4.?GX]xѬ=r` WS/y.Ǘ.5ψcYyĹ/7ygbsʦ'-QbjsJVWOԭ O tûb4ah4,҅DMKxY4kAj" 1vL笾xMα;|GqN:-ucy}xmcA=/S7}9/mg}rPkO izTs c&,V'ϙļ68N }XO7Z0x(~˿3 ~|"<=wgw.dﭥ wK4>Q6HKY-GOZφ~ |R%^$~x?ٛIt<5+? ݞVٮ^tatEwg,xuT4~cŞ#fOs 6%GK+f85y_ ER O M_@F?|+EB=tc%qkAlhnEϨ^fuKG')'&g#ןߊ-x^Z_/3M5KMɤii5ߦjڥjzƷj7ă'f+u^żgdU3&T09,& qo ~*[3p| Kᆉuy/İx<-o]O7O\yj?äS_|5Լ_9SM 7+xX3~ K.lon͓235n=bYq~3'#Rɫѩ3[7yV' akhʌiT? ~|^_Oᗂ9g NREY Q.Ւ.nA*x > jRO 5掷sM݋1;OX:?L5$Zm qg8Ncqf7?ͱ_>8V.zf K|6NC;,<aO_> [ρ.G-#+4߁>xG~w wXvoū+Oc%ƛ\J$O_|xf)|'hz`^manB½xIy{=Կ׏_%<<823!rE L,u,_)/_e{Y ~7x6-z?Z<6A;ǣx~;_X][ڜ&gYyYLl hbj]ʳ X| CSC 8' U% NCFSVh?O|G~x_w|]!WJfAtY>\xKHyﴸ"FVe׫\L'n:sܫ1>gK并aCS}ь_թ @(cIuM;WQﭵ xu=KմgX;K;Qv71q ZTjb#FjRZiѥVjʅ:RpJѡ^T))T shYzO>kuoz]!nUION7LKH{<gM%kҢč$QI^}Kհ~'1UrS+f9&g T˳,/*)sfxbJj-+?OX +Sӵ37F4kӧj֋]Y>ɨڬеŕǗs %)>D(֩NhQ:T9z9SK4iIk^nBV^5V-s.i"Y7ip=֍?}Wf3/ң Abpaae_ բc^uh:+RU`MգV=9EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(>;|3 H|#|2kY5/koGiMa{uXx Ė:ȢMWKЦ48u?-Vu~MxOҴPwIY,mb]H5+×M={J-.$+ءK; s= v-tx;6kfe| ܋K{#8X[[KdMӜgsBJJӺ٧4oTb(irJ#Vq惼ouI?fO >{[V:7{/$h'VlYSǹ<+O%Ǟ(xo u㏃kF+m2|m4 Wl3*4#ZZk}Jh*S ')NPVxzP)Э)9Unr'FO19]<5y'Xjp,D%^t>*PCSNH~EJ)ҩ4գ.$dhJ&\:GhfpLM cSa#SK)b UX=v1`7X㿈r|; j*#Lnk|Qo}7/o~]Hln%?g/~S_ "k~8}#ks^%/K-iZxjT)GO95`UNB/r*є ʅx451tqL޽l6MpT)c<7_N*XfY?U[S1W,jf3F R_#G߈kwRo|Jo^,m0վ6T|-}_IqsiVsXE]ѴmVωxl5!IFRQu!E{WǛ%W KHҋ:jΔa5:8:X6 4hPl ,"˨b)b)*Mxc\U* \%>Yʕ 5%w|5n(~?}{Ÿ~"ii#@\Uğ<{H}k^fLl|C]A|rx@#_g |[/tx[/^$VCJ8ήT0x>Jmج/ ߂/u~,xc<Z/\|5]SO7Atڮ/5ω67>0Үe%]iUa 8: Uc䵢kC/cugeg Yj* KQNkM[Ǟ'|eN {5Ӗ[GM$s\O_k <o/ FLXjJ |?_W{+ExGúN|Eh YnRs+sNNN׵ۻvvXM|UUSVuf995)JJ)$&|KG<'M 5慫6%Wap-仵Y2T.#!l~OtNj>)tRπv~%MÉwI?{ƚTVicG,abk~!n ļyJX~y"94W5:09yCw,5C^ zGc?xO%?;m;ߎ 1_m]cy>"xOŸ<)_|'Dii'g|9uKt?Wh?~_/xw3?{-Z߈r% :6 ? +{GKCIJi>+!,x!_x#!' :pY58b w(pGf/g,x,5uz9\2oe ߴ?_:?O ~'jW:ߊg/_xǾ!etI}}}k[޷^CsU񏆿gߌzO>|^6&j3I|\?-Fm6 isQӛL? xWwt4+XYP.*QYqxOOfx_⦟:N3I~k<{υu{xsS,厥jwK)lu dfY6+iTǃ9 2#pS!bxk(aB[K/|[A׆?coŏ|^>B$n&O\~xD!ռ^$ݍ[]+FxOك&NzWi-ox8]~?~|?΍^x#ZO ]hm4jré&wWM̸?WyAz~g-ߴ'u_HOoαˤ*K|o_6<:u<i/#jWRj_AzwǏ~*?~ٿM=?[xO^+З{ZcE-I|;T8x&~7ӡ2 1qs`2xN9?cnx|08=a_h]7W=O7OG%߉Һo>)K&[(cZmŜw/#co̿f+b?OW|k6CD||n٦,|C;|NlTIO]hg%)n,eq<=[?e5/sb4x+V?.;s&'•3:j|! (Vr2'w߲?d߉~$~txgT㿊:?Zx{#~5+kkcM_Hď:xCgF>[?P/Dž>+^|JF>{ze~z-c)5=:i!6 t-W_<3<ļn : p3<%;l/ `N?#c3+x1xY,g^1|-Y'zXsj卣;4h(iV7?j|D &]|(Ӽa b]oS 4~4=SWig>>hZOO/eFk!44Dԑu 3Zg3=i"6Oϲ^!ʸs*W[#7߂?-> uae8tkEn xCԖv>&gfxCׇ5C>3Þ%V0\js_ O-/$m?XV6cxĒN⼳8w7J\S<򬪥|]ᾭj^< &  .ttŗ?NuxtEkJN_~P_|;վ w@oZ s'дe=Ծ:gy[kNFr<6et)e;1k5α8~ ϣQN\_Ͳ X~ p*հJ|4|pu? > +վC8Ex__ OR>E/>^RZjڟc-g➚MW Cǿo|\kj#'<_ML4rxvSƋ1=+V|m5:w|{i~Bg9B12\v[*8c_|]?? ]Ɖ|ez~п!<1Ozo ?dko}7L[mOw7V7~Ǿ$ O7l> ڗs/K.7 uZHu-3Tγ{4X~&xV>%Zσ4c?>؏D<@+e7f\Ey/\8| 3^(ȸc8q<.5r0gF3'Z(a!xǟ|xQg~ŤNu_˩Kz_i$&__ ү?ż#qeN ^=p~#Ĝ.ΡW0唡W:ُpT1x'xov.8ա`e%1ZZd?Ox?,G]{R'Í-,4K'&<-&~VW÷hʞ!e|4"("o-h]_ UxZ7tm;Q|wwCO/K#H$h3=_׾ѮR։c o׫| >?ğ=´ |r%Qz߃J!5]1[xG5ƓIzZ? 垗+_6گ4_IE?_8tҾ*~I[;f^ڞGN-BX̣a3\NUO9=\ W %gO,¼E gMӒfm\^Moisχ5'\Ɓм3=div3ޝ+@ҖH[Sֵ#^חAn$C aƩɨ=#t94G.gQU jz^<%Y R\VaETgRWr:1ѝIɸ8(%K<-bx_:Nto?_cxH3=' R,\q拼efUj~ƵZ>ҝ_eRtsѩ'iJv\nhJ˚-;++|3>+~tCn/Qԙ/|G`[=&C{ux8 . X2Iœ9FWJJ*Wm%դV\Uzj篈NsFkN4Úr#9%9F*M>yamǎ> if|?}]ixĚ惫x~ڥݠd՗3R8k#¿ Y>vo&s|/kaIūrMkꚡ-F'LkT8tR#ORaNvR㏳$ZT?bce ԰tY~m,f"j0C 1r¼6 *?TBI18XὓW:jzNi׺i^m-桨_]L 3\J0;*#|~yCwTgKo/X:0~$ =u6Vς7|L&/~z9v_ N2e:T08?㱸ϫa}k+(((n Ky,`r *4lT`%IV +QC; 3w_x{ hךwZ֛Yci>q3^JZiP!m^K;[oȾ-bOFƓ tMMWVZW4mb@STђ[MotKEynYׁ֣otkIᶞ0<> мCj1|gռA EG#旡C{|jx4/O~|htC1iTׯ ?Դ}7Đh<_>"x|K|⿁^|OgiZaexÏk][:>)𷈼5x[ãHVI,]ž"Tt*Z:JSKKj5p;h5EYC<)᰹eyY. NY:8nGuR9;MN]vK^UV.zNY1RNS,Tb&ݢV%࿷ neOmŷ+U{oݞ|A߆u@~8M70=Múutktisx'hp\[hWhr n-OP ."04<ɓ# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=Q@>"hǴAMg x^-KZ䶱suaieƧk:+u$QII;C) 21HaXLQR`vH WQ@p~ i_4UkS^go[Z]Ǫg4ˈ/J!'Y.g4Ԝ)SSnm&]]фO(Bxn4)EJrg%{ɨɥgkO|h>> |/Ԯwk5mSI4u5 KWm&GCSӊ,Dߘ?f? Qwh[ _t#&HּQJ5+xuZ {%\}gQ4 i.+ڝtrt*?C,43XHTd[1msrݨ_MCN2Yy5 ޶K_]ȨbU*tTiѤF()9*nTxGƟL<ɤ_WS+ >iFm8qω>>ZY<{y ž e鷖P/-+gTMW+wĻ~ G2]h2֣nַ7='x'\> xQu-3\_,/S)K{-:kTH԰ǞX,\aVQg?*9m 4Х}FU3 t {I5WZ P(plًÿ|QnjoݧoBFT~%,*4׺ׅ//O+YH!F~k׍^K|M3<_JT]񞍮^sHMMCRk;k'4n|hGxFuO}M˓JyԒZkNYe|?/*%YΖU^QU2ƞWN!NSek*|Kվ<|Ծx.ͣ [xMy+ҵƙ=[Htu? "U FOe#<2~)ף_W^Qq&{UNs7_fJ^Zmzs+-zA}akkss{i.422ֳcD ᖛxƾU<)x<=7ψ~j׈c3;ѯb,t0Z_/~sQBԝF..j;œ7ȫbl^qKO ?r&j`(a0SN JU1#F"?~V㏅IW'< >1sBjϦ۫OY­-ƀ>|u#wZ|cU?V|B|5c \^k-/NyFeDROs`NЫcR:s$')Ye_*0_PYi7 ]nV0Z8JTj:rqQZ#5f]ҒOMӵ֯e*ԥVpBS'N& 2)ɸ´c?q%5%(&W?h? |8𾧮'Ee⮭oj~54׈~4ڦh?>X,bk3( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@ >%8hx Qi %Gz&.n񏀎0ͼߑqs]xcV]x?i~1o,u[{MsI%Դf 8u{:vӵYԓY7M?g쿡x@;(?A{ڍĚz%ֵvP<)M)Z5x[!*izvjmggo{yVsyWV79TV 6iӺi٧5eBs(Μ ŧN2[84]i&?eC ~#ߍ xGW / xR66{M th6w 嶭ḵ}>_ٳq~'{㷌<_|E)x{7^'x~" W,FռehWaeNjO9Vκ""I>КӝCI$&Uę=<cp*XFkvk  6qURc<%N 8J*Y}C/˯k+Q]>w'tI׾h12P|_e $hR'On,vx~վnlmVxX> bg8_|K3:o55[x R^S_3>=J쭉BBIPPp9B.X)UM{eb(9Fs/ Ş ?w$_ǯ|].ݮ|{,un[Uu/ҧo~6LJ#W *}jXmRťZa)JU# S%Vv>{ e:O`59*yx:ش԰Xl[!rcʻS++-~w_K*Ɯ/O|-sk_Eb_hQitZ=; ;mE^DmKz>\k/ ռ1x{Y~ċmi4~&ͽşݎ_xAskᮏп^:7MO?oܿ½3ǞмSZ |="= vw⯈$$Ւk:kϷV*ԣ챸uT JկEӄBphR%h` eX,~)Oqtsvea(N[G0Z9t,CiPp\6w?h_G1i~/I,u<GSaC&2y]lThfL*P1 se߇Gŭ{S:ֿw_?j=g&Őxwe .ty(隅ϊo],tw퍼&|/_Ɨ{?.}yWO^7ϢsOi_ϒmRH ! 1x(h­#N8Նj;멈Qm,DIojqx+]Qe0L&pWKjbWISEFi^8)ʎ[ Gh So[DZ74?WAk'< _ZF-_@ImS17?k?[ŷi.w,zu=)+E gZiod?G |.7؛,n9cq .b?gG⛈t?:1mo/#C7/V\>,~ "q&Iž%\_u={.^UtÞ^h\'oz6.z%)(bpRG 1q*ugBT5cN 3()MCث qu+fmõ(q:Rtr.6WWʎ:KVɩaaW?_O#\V~-GMa'A~'X1h]C.ʫqLnkB8%B5T1xZwS/@д6}D4w'Kln!iizfm5H4:&K[Kx~l|7g6|SK_]5>Ğ*OsI~ 7HDڮk&۲WmdJI%$ԩRԝYԜ'B0y۴!*#$xD ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=Q@[/9^ ^ռ5藚ƻx'<ygy:3k4Rgq-Ԇ;&sK~+x;MP]eGqԃ_\6gC,iZKXE@>|G,Oj5icխt.yf}Y_VAot^?^-Ѽ5jKȼ;&QlSYuZxhck {\x:]ӯt}Eni,S:QJPu%JEvINr:p)i5PxI<>/4YԲ``(0Upb0\T3JOW*,F >}if5Mk\<#Oxh>%c╽ޚ}g+՟+YPSO iA58cTaF:<5J^.zΰգ9cRJ~ ട]#׎t|}~Э xYմ;[;'?ZoV:>m ߖAy.5oxz Z3s3|!j^,@t2/_XwNkmΝ~.YZcx/ZoR:غhx**U{C-JX\T(`lD??_hߋk~/W5?nkķ_-O&^xCRu+Na{ ?wovehN<Z]>:Znt- ֿc(ooG iZ˧,T`,U;ҫV4(8SNXZj`NU[/ xzOďֳ`V|#m 7em!uhKc9R=*xR&XJhҊB:U8΄^&jRj*IK*91V:,oKx|/afxx*0e\6>3 8U3rx ++WFO7 |qz_x7ž ,?fj"]Shbqqx:nVGCXT`㟆?>x\A-|9_ 5 kKƃO<1:t^'\,< ӒVtVTlR"F_XFPyZY͍ 3G<5e,43 Xzn+wB8m0xVґڎeiqY]js0HmlW8 E$1 *'_|+|Ewt@Mh?>[Q?>"]iz~$;i? ~ ߈!z{:ҥ'UT*[ NJ4֔RSt% ]e93+W<5ca+Bbj.c^ N2gBsXiԧDOPr⇈gC7#~"Hx'^0{q~&mPiLXF*G!de! % \u(&@_$g) ThiAܼ%)̰AYGQnS\99jeiaխ_[+XXᒌaMҫDT^NxgFPWiӡW7ItMS]~xlMďxSĚׂr|C^;_ⶇ4a_xN_xh5+[]CRs>v+PMt^rZu'JQTsFn.)&Рq .jC WKUO ^_mO:R8NUaR jn# ʱ8lp^6ZΆ *7U<'*O~8N߆>_ki>ռ7m=N+] 7Z~o4}jL#ٯfR:U[ x_ <s^,Wඹi+A^{ k|U?>uHm4f#:x *UZ4qV8)UTFU#R*ju#KũT"l7 qx}U)g幵,W FaWOC/(1T?XF.2gG{~1{_i,lf]6kM-om|QZzu_ZJOUNjկOʔ'%A){Q7iJ~mSGⰹ~;2i[(>,eLLe:3hS^z:|o?ڳ_^_*-Kix߇'eo^+ [ǃ,dԴᖳ GSM$:_ iGMuy؍VW?+}3? xG_kVuhums S/QUHSrWUQ.Z8TGTQU9L|T0If=E(Hҧtӕa2bqpK T_^G)~ @U㟉>ͲI ;z7koi  . sE=BH΃kVx3U4moLݭE<=[ۥ˧\x;-GYk Ⲏ !ӯ_Zn}6/XŦjQTH/~ž#ivP_>ş^8_-GS+as{}uG=\ZF-.#Ĺ:\Е<&PJS ЩNuJ^E!윫xqSVڭ2,S*u)1,.a(ePKU~Ruq1\?'OaRoO I%O>7žJW>K=^*/'ӯ3j^,MqcRKv@igRgSƯwxOSgtOj ixO/<8ׄU`坳מl}iҔ#BpJB. ZJފ´hVpslb>Zy^; PSc],vgʦK/X \uj1aN5 P ǟgŏP|<_SO>|QC_k}s?|"%Ԧ <'oX!<16G*|(5x2xŷ!wV~/ O< Rx]Ѿs_χ<hV\71i*Ljj%W'[~2|){'źWg/Ao.Zυ|Sv*x[4+ xzQValCRF# xjL61QNԥ*q ظ5VEIZ|֦W`l;c<$G7˰5_\V'&՞Wi)X>F8֒wc#J}It xG/~4k_u[7>8ϋZFu6gெzxAKfhwpXGOjo5~ͭ < x/J=t ?Z>ŵcOg:f ~&65Lv TsJ!Ntp*t-p4hNJ0r\ P%yؼTa<-yfYl*牖Kfv[b(RȪRXWUbʶkj1;O:i^qWq /hozZ_z&Nj<~˾'ۍBPĘ̍RK~|)gl]No'HG/x񏉾jZ7Ưk~xƚէo-ii^M?|?h4u[o͏ O2\i'#Etu#qwXNh)(bqxz4Tg'BI8*FQu%9S).qQrWq??p:8UeeDkԯK-ß #υwᾅ6PcC@<_{{}h/ß_|bra_߄:|+[=4o_>x"A(ִz]Đ͠xZR GtqzjUAUg8fB#Qi%9ᗶU!]29V[ĹVWf$2c/G9Sa<=ulV.:WqD#5p굗┽? ~OMm~/MN_H!~W,#UԜKMh4nDV1G( w៉U@G,t>(WB}GQMGTMwi.D>5$c}c Ns7^~KSN QVqSIZ< (n\ O4E2b0xL;RSS%O0F9i4p!WnZ>*9CVEC >m㟈^Lj|5m;G|I/? k:M?׉':&&O>?ÝG⎩gigawDŽiz6֚=Uw-?XڞsH b NjIRZtQnZQx% ];r.]ɨLNTcp<."",U 8\pүFy0⫥NxW*N:ߴ姉º:~߳;xuu_ xG?l&|muzէ4^iZG5ӨU㞷H"~|)>+2|k,a_]cixGOnjww>-֖щ`!*h`J3SUxnXQQV2G N*u9&11xj0u(Gɰy6' s ְ,R%ѫ?[[<](a7 ?|+qk/V_{0 w[ww`\躆toAo^6dMFYR7%-2Ѝ,u*2zFU08)՗ThKRUkWj8⬺ y}\TacF2̡B8s\]\ve:MBC<ޓTq.y'!OŭVdžw'GX>-M?_#|WjmRImm/!4|4|zSoH?>?~c^׿-8Qx\Q+CX.&:o2 2?V|*Yp%#K VIBmZL*U wVmRT#r%Z9)c^w񇉼Mx_UZ9>~~O,:kkCP־/?vt/WįZ/^ %摧O/w5/_Wıkz%h?:~/*^,+gi~2lZ[C~ig.Yt|,_iMCö {{+D&>T?|'3Xb[ o|Kkc5{G馼NaʤJѦ IJ(a]8agBudሡq>k*P(C9̧3xWZ+.axGl *3*aIF:Z[GΒP!uacD׊+öz^4Oj-*M.mNz <5cBZ{>LeLּ^+4&Z4*atic+¶"3FtpR5kti*u#()&=xoM#> ~ >^J?ωZu 't$_tx^ƣbfPφi\_oxWxu𥝗5ۯ^o_Jjs}/Úv">xmOĚo|)8\vWu7[5&4R/aOxD>%~mB/|@&Rk]b[sZvOE$Zv%4km:>$lƝL&p2dK3$oe,+8asipyuZTkR2&:=.(((((((((((((((((((((((((((( Zo?DGWh_-j_PEx>>*|e/-|-6~ >;t]jk-:/NNռH >cԴgm? Z eޣkGWIg HCr X-bo A@m}A@V%j+BnSC* _mI IЁXDth%Zۢ (ľ9#VO x?|As]/'ßxy<]h',5]h#6H"̵6oZߣגEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(>qi~*mψ <O2iR1߈oyWܮǨ-xN6koj?WqEp^m_fLqQCYE,,a (a:N'}|߳jMN?OGjke&E??n]wI-mnƾO'*Tx7|Z':`:drceΡ2x|j|؈Lb|9bͅUc͆kz/(㯍_ fM_)1l|= +AQ>4߆?x>M`~xķWN\(&џ~$|No`~~,Ē׺vYu>_z-?<]_,7V#xȿz|7pDyW. 'MSGcpQ3H ~$e39C1x0<eUУL5 W2/75#~,סҵSv1A]lKIWt]z~ϩ / i_ E>^ӵɾ'ZBkeѮ!֩>^pm\/.a Ml+C063*aK8xS,]xx~y?Q_+0XlZx|/|J>|3C|=?i}2{{94k}E׀1ɪZx խ.S/uV_ ~ݳѾ;oZ?gߋ xV-w5|5}hxSIд_|4S@(Ç&eUxۊ9jagÜ9dY^22"2l^30eK%S/gxN&Ozn3so6A|G4 x~.^ n|]&VU߆t ߂I׬AӴkԵ5?S߱玾*|O'7OtO|_?5ϊuoX^YxcUuOZGm_|XM/ O>]Lv8ȳ-? 9FC "Ἇ87f~*dn:^]ʸ#/ʲKf4Zڗwu߉~4>?x /47 w5--heqsqg7PTp ?a-]/ht~ ?cEJ_]qZp"(*"N<嵭;|M`]WmvJ]u]'KY4>IҴK{ 7MmbXm!K{[[xP!"5QT _PPE uF2btWI+b=澲}%qpVm0`ڌ3`PEp~tH.KKm ƾݣ3ZAx?ރ /xo> )g~"ѯ]"_ |:o)m6Ն{b|^|./ ʸqF]aTvOO_|g:NQec譧BZt? F5e=7Ėz׾-Y^YC.ᱼm:Yq1Ξ2zYxV?d:P|C_O?H,4=7N1tlt G^ikj?&8}~P6+!Gr+̠E*d*>\gٶwȲckcaUs>X˞x|ghևi滧x֝6<1XCQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhv`t>:3?rC@|7~_ڧY|Gy-cYj׺WB-gZ[x\_]jo 5p.Ug^'qNk: gÙ6U q8KQ!_xYf WH> ~їCY'?r=cĞ gUDBfO¯kZ~|''C. >Zo |FMutMjvzt|5+>#zZ Ǐ087XUs܏J|/,xKW CN\pFatqPɰ4QcTE5 &|@ |=~ϿA.nG/~-{WO$xIZMޱh?9xg_^*K]h|+9/xkV C "6Ԯu^jS@k3{9/fӾ=C%05H)dY{|/eWo3|2<9_ϋ}mo ~xSSЬt/Fg~weU_w~)?ecKߏl|Lb:K!j mԯ]'ßu;:Vx@ֵ#N"𿂱8 )-̋>l?,Ӆ#Qq+&jks8W"WȪK,?'?௎? ogk~_jZu`#|t>&:R}ž:#CZ>m:+ ~ x~7Ql¾7GCά4@u_H|[j%&?ǞO>pf_/q|N>*,p.iøb5\+E[ͧƙe;,p#|~<|aG/􏋟|E&x_O > Ogheϋ|5uZ̖ZOM]yď߷d/w2|9x_ k5m2ǿYkxW=2}emq;I /%.⇊˳\QaD_x_>wo"zޛ|%Q߀^ռ)5u'>:ZaΚEմWc ~?i˿r*~'5 %kBдGz[>*c #UTb&E~rEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ |{,<\" ]7|]Cskykq}E-啭ޜm:!sbmgv| /k=fW :ym&D/tczglM: Z_MOw(z3Nt #IӴ.NH-,"X-m*E G(U@z+݇$p̳;0X䶊ux4]M\<v6ė`tPEs+oqci(,oź|?l?|!Yxú]ZK/~}y$~}msk$>go kxIV..uoZum./4w~)ƥx¾".K#^4sJE iF#r.'/ƍ^̧<\"Vx9թV'Z6gƶOJS*5 xd?S3ݗο ߆W– KV.ǎQĿexc[O17Oq^h_KWO ڿWtg(gxqpT0iad8YdYaL-:fWVy4 KX __?Z $յHuo6ZwKi o?ċ7D!fmnxW4x)𵮧=ix]t[XnⲊ+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@|LRW+W__FkK U'mXZ$2v=uqZ}[|)m_Aޫ#^5w%ie߈լ-u;WOQ->-zAPY0ɝwQ'Ey~m澾oٿ&|'g5C֢ *x&Wٶ~ow'yRQtrߛva ;/|yqj>&x_V2Az7ߊerSa׊$:+u<1O|A,?gxWū{ +ž'>~޽%0x6Z/.=XQOYüag2_n}u7YL. [/3~T1Upx"x0[ 9)O %xGoo_O;e1gGR~7-ΆChTϳ>'[eχ 4=FFu> \] ?kL?kilcw>[??]~fγ6/c,ź.^ڣy)NDy9~XWEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ ψ>Q ]6⯇~kvVwXA<7Z:ZCg;yU[khYg`W> gKҼ?w:lt}9|k xʊeyq6x}E7O햗h6V:-mŦXvptEFWH : (~O|}_WiAO:֢ ֵÚtu/A`mSZ-4:FMh-QyC^[O#ЭbkRzSb+N4СFeRj%tSRr!&2{|UQďxZW->QMm/MeSj׷Z0I湴k> __?ĭk__7ckП݇CjW>gfԭ CyZ3&cm/WW3^tfNxsXo4{L7.dcrM`x/kំ1 p˻/xz/ÿu&}i vŞ,澻K5.KVLua!1|>8s0Vlwa!LvaeQ#1|9O_eYQ k`_eq$sc <>#|5u>_|C׼+izeoR(%KhԸf;KKky8يᗅg?xOǿ|!};¾7|OrI[8ņY6FSgAcm};q/i s?31Z8GM^s^1񧃾_[xk Փ~#u/4ؙRMC['JZ@X׀cLv,0x2qx|_0~;Z|&¥|V/^:|= s^J%9F,9>|n_~.gsꚶyong]jrCkggko5̱HJXv=y/s8yf;Lx,TT_ʱt(VQ5O5-;NӮ}BIR/.ӬXy{H"Y$X԰ Iẵ+kyRk{ydx&9a6Y"6d]xXFʂQutUGGV'*|' i6kVWZjWPXncWԑ[YYE-ıorM43JZiСNjժB4*jթ% tӂsRڌ!)5@g)ω_RÞ#е4kK=a4M_O_J4?^Ԗvm+YE-Γ*wIZbx ya\FQ,>*\=xQԕ*хE zћ-Z5iՃ'0(p ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=Wax{> }7o|'u[ /xJķjٵݞSX{ !" >{ᦃhu7>"z^wo?g^P\o G ]q_Y/ms?h-ӢfMhvޡ%GӴW1wey|3˳\*e&aU7_(N=(To8I?σu_|Ox_៌-/| _< gx<{x{H]K_V/vg|ZB~[|&ÿ_~IΉS|"֣!uc/6~?I&]bijxoEŦvgy3838̯³|^af_W)2\\a`R0Co^_ݼ3P<%Ѿmx¾-񆗢Z~؟ 5e+?i/ĚBZ_j_ip)XxZOV#zoiZ?gKN,fe\;?1xzMfx2xqv<%Sl^kW\䙆gq3%ņ;Ɵ<+ýOÏF>Wď NJ&6'C|Iw{>Դut:O-o3'oxwmoAMcmg)|z_m<M浨Ko95I_ Cl>e,χjhKqo[#^ʼ}YxCO=7ǿ>|5𦧩G|K'4V't˯".~&~w<QbFQ/qغ|I9V_gXN&Nnxg5j,G YSYa8j7rܾ.&,B߈^?_G |A~|B[.3XxWqwO~>7ևqk-x6:ϣxCW헠|[𷈼=8_ƞ6' ~/Cվ!x/xK@X5] <|#΁g[w޿yY2<ԩw#? ?jE~)h_ |P}|/~1:u/~{mVËZڿg"F p^W:n\fy $Q 0x(ฦ%#d;~cƭS.sjj>!5Vվ5x j+k2~i-մ}E7ŏ|Us1<]^|::W|=^j[ң82~p8k>[x{\'4,6ZlqUmOl^o|Ex_ h/w㯃xWi/gWZxC{-|_eI㿋^'o߁> O>4hz _ׂc}M^k^\M<_Aޙi5Ŕq~?Y9^ -Ӈ7ùEEG.ro ХpTua _ 97>k7j{% 1Y);^:Noimuج<D 4˰lJgai:ͧQ0"Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh|FG[^#'e6i}[PO⹾x7[[S 7]|Y Wt>n?x_^h2k6hRIZutR\gMykMJKK 䳾;i% -xcY}A@V%I5f!,t?`Ӗt bIsj)fX Nxn$.nnu6>4|og_ Zx/wJaѡ/>||Okr_dki}qf{,F A4M6i3iKe""/u+E?hÿiMYh3ϟ%f {W=׃/s[[{/Or=q6kK hḸ73Q@d&uF/7;4O'fԛ󼝞.#>M ZD?ٗ>(T}'ÿjsSMB<.OGOeX[MԭOXA9/][:]GbӅURLTtӣZt!% Sj3IFb(T*phG= - |2\Xم|;4VXuV4qUZXJ4,EzlM5EN]џ݇ |Yj_5-;Fw˿_XIҼ59滩ju]]^4K,NJ;\njm|fQx3Υh]|DkE&_&Ҽ1i wcu5PNOI1J*RU7E *rPt߾ZHq )ʬ4[:ѧ ᅞ_) 1RXVxל(j?xýo><w  |Q>@m="uZ߆eIv/8 MͱdBxୟ _hxo:ѶOl8{;.Y,t97V9~&+ *qg>=:]M' 5 ~#;㷀|97ڿ3mkZί=֝q[Cis&2z?ÿzGĽ'[t]?Yӭt?w [Ou|?V blu F94SHJim'1Iwcc;=qW^9δӬ(UׅEͩӜZ6w&7< aeyV[fx|T(ҭ(סNTRXZE%+I&~$K_/|CumKHnxP{[jNKӭ'/m/+*keճ|-p(f]B&Sln"JNHQUe U')8ӜH K-Jӵ9|}{wVVU}, ;Ji>bi[Q#yxo=xkᏂF/"L \Я-t?^",t鮣&L/hd-hvB Op7Y/l,-hcs~sg8.KfNgJ44peCYSjE|Yok Yi[_2F-kiV? ŦKb ۨy7CWÿ {I:?_)i#I.VЬB3bu(& &,dfe_ù 9~exGp]Wa1>C4o']iCMᶲtB/I%o xAS/ x^I|GsW[UË[-U.Oƺ$tؙd?fG_l3\nA|)p? c0qoefkJMQ8l*LNEZ: &Bʘփ־|r>2"$Hy4|[ڗ<-}oH|mkWF]?_дdu?~T?C}>Ş[g:&sSTK?Mx/"!\_'=jqhv- Gۭ3H}㹮bм.5B>%1 "LB[¢ nuOa3\ r,)?l1gѭ2QU|:Z)έ ֟2to uQ Foxfzŝ֣nu[/ YLַh𼺬b/c' X[o$|iGZ/ _K|@߃|U烼IxcPPƤXc溳-v 9]cHuqank1|eZ&OͲqub3|e03|M}[ WRs㇁y2 yx,~|;rN7F_/&{i,>51ZI"MvqKį%|64/>;]|?4J;/_ >2|NtY-V]GA6kyCys ?3zL,/8b[42܇T̲}\5刣Y:|% x~SnXuzIt="k}[YuI5F8mB;{u4ګb㯈+_q ƺχ<c/x3h9뗶 &W/X̋89`c260|E2 5LN Z+y fQFSU3,…l 4J!:؟'[í|E^S? xGGY?Xx->|KxRe{}MDILv?g-ռj)SxOV,o#[ޣ%ä cer2ı`|Plx;9c2Я¼ASS>G ÕqYm MRõ1p:"F&j_ 4&x}Yox#7WU[w/X[YH[N]E$K/~-j&cW3ZUi2|BO j !: u-/Tx^MPZy׵\[[Y> [8VAxΩ+~&| kÞ,4h[ti.izCkt[Nԯx:|=+C/9;J60Ǹ2X\(*ؚΊQR` 8X~ \;|{'K?Q[W~ }n-mIkm^Dӗ[k紾Ƣ<;m!߈ymL{/Ư\Ig|{GX,,t,s:csZjĺ#m]7#{Xc_ȳ l0yMgx5+֎1Pϳn%̳_e:,n+?57,&yW Xyd=K =Ul]f2c1':ԃwU$Q_xA:>VҠu}z[Q4'Mu= _]Zo?j{>2?5/,ִ cB{VDYɧwTm7i J&\f?f>a88w/dRϱY*:N ]u<' fEK OXq)/ᇇ0|-~%x5y@)|Q+-^}V!_\C3ꚍ~ZR{=2߀._EaN[Y[K-'xS'gW->Dl)eMi)*e8N Ӟ"53L:B8*9NaRs8<^L] 0DxC >G$<%k3?뚏/mݗlt^ݣ-կ--MCWCk5GVo^|6|{[_V^eŖ>Ze\^m.OrUVf<-q0kOV'J:>̡VqT3|bڔC >ҟ|c M9i]{^">;W]Dž?[\|7&y#աXvWQ[i>7־$ko oMS RFHuZLpRK݃)F}n(s^ ͳ<<;|2ɸzf|w q *֧\M0հ?uE:Rzb]eÝ=5xW?/o5x~މߋ>xkCt~Va ƣNmj3A$WKO xc~#|ߴ)%%y^ tƻ-#O|;hپ˫Eo:77Kn)k,1>"\U ]: &EQùzgȳS8~?+1ٮ{^ezxͭȝneҒC;poc0?=Gp9%\5{,pElng{8 5%Ga%xJ>xzUIV3,ՆGի,gʚ0Y 0#?g u|5F_xG+:ROV7>6qem|%o'çCngQh/W SH[] σwoO}[FQ YJ̓R< qG={].[uOž&,Yqq/[Ys._fyc 8,/g;)RR uV0/]O½;fm>%:|G}cK^?].6T y5_'slRWӾ#N1D=[$4+n`yRXXCxs~5B7X ӭ[ŸXxR*ϩ)TiЭ:ƔCĴ53x~Z߈oc_Aa' O txO>$.:^EǨڴn>Ǐto[xzmVRW<9Jѭ5gw{8͎G_3N拫B)͠O[|(3~YF[x%s3 Zٖ_//֜3,^ &F3*>p~#o A?.^k#Y[hi~.n,xAusݘ4h γӤ`դ+_rs1Ns ᄫZJ41X,:1*aYSS8ҕhԫNP'P +(((((((((((((( Zo?DGWh_-j_P^@[xV}Ʒ~$;h44_ x xi%NM:=AZ0a iC|XΩ7Z´>|=i>:uՎ6N&wva46Zͬ\/=еO x+:jh6h ~&Hu3;çǍ"Im奻( ɆœresɱXlYgS6qQbم,v+ЩYe4X\GӅZo-b*Tl76i?~?­gG*h5o~ǐxz?O saO]{~6ON Roo^0}wwς>-s\oe <]^,!i⏈YOtXƋo jk{cN;UT֧t0hoT7)9NK| b0X>*ux 6eGEe,>Qr՝z9IX~>$>"|(l&{~Zʼnm|>|9_,>0Vj>$AxZ[b6 >-M4~6wo*i[]/mO[֑;;[h^?%ou;CMUpQt*?5(8Jέʥ<hefPXۨ~˯d^{l|7) +8eh951x^OJYY$F0}%[?߄Kg?5{o^,;(Y~b`/iƅ4 iך]^!<+i%/5/-v[+4:요͵\W5UJFu^gu8*RI$BcNi=T]JpNP|r#/q̰4C2R0%c YƕLV %V 7J t#Fqm+@e _DӼ-? >}+oa v i#e_5 /Gԯ,V߭3[gNB5;;{>Oowew0njh֫KRz!Zj3*jҒ:AtSc8NRZi3>%|:O Ϩ\_iѬ`x.0|g/_wY׿g[?ߊ4w!狿hRe?9. @xks۩='s~Ͼ'?OاNw-w&X'wFItSEwx''`3̷1^,҇x)aY’xC6*g-.gU8֯)d3ⱹ(zms%|Uѓ_χ6,^:|wkLJ5?~U5o:@<7-Q Fo /Z?ѠكWu|'sĿ^:Z75~~+ioejp\iZ< =P<<f[ܓG.q،6sSG <<6'0qĸ9Ve,l^Yl/ OWT3|H_#O|O\#oş8񥎋|e7z.am5ek:Gjzsph/?>5'<}kl3"oz֧h4K6]Wvo~_ -<gf|mMb>' M{pq6.'x| 8?42rmg-\ׅr\ Up\EnUhgy6I9MPIO]OA]7Ὧ}CHs\jß|VծkmIt={FM=-NM,3sĿ N%]֮D%e"^Y]dHW\O;sIm%įq._u)b>aU8 b3l%uZ1:43I5^.Nd!5xC?⏋og Zta[xG6~g;A^|HŬW4g]-~o4:[ŮZqh62k, % xwr\?&yY?c},2Np\ӭ1Tx?TNQc^o>|HE<3lϧx6@$];/ |5lMsoWeᯇښ=սiwsI\H|w?3f5<|;Ĵoj/j mWMï)o\3?˧wn'ȰY_ץ8(b0p 2c*eNͰ&#.qy%L?jf# 3zӪA>o??6?|G~?aY$8?bq~?U<dA <)}oyW<4Z;C*p+|['OྕkUM_^7$>º_~Yx?_%C/4<%>o,ߠ[ΈxK 5'm ? x+Gu[i&w>NӾkY x{¸+=~9qf[Ęܣ>CĘܧp)\1,χ(ag%CpխLֵX> -ߊ{~Σ,4մg{?/ec$_ ꖒJShiIنY0sZh.7t6z֯kA\;W^#~'?fo?-_<3?*5Qt_ >h~(ӵy|kvT喒{^XMG#Z#/ KN/3dYEqY g [W3VG['Xp_ >.|־'|c|MwZ?z=?wZVDZO_Axavȟ cNM??|B?g~.׾|7OXm?Cߌo~[NiGvsI7SQcir7o R!l93 v'd;lxgs u3R3aiVe ,Os0@ w⟃g; L-Gec ylFkdU{.qy:90:牾xc :=6p'+ n[:][u6.ok?W^u 7~!Ǎf?uӼ9=gf Tkl|*\5  tmo c ri]=xƺ4U,>^F m:WG,xw>-ſ| OĺxcJ=ތ4HSs{ixmw' Cׅ%|?^VC]OGuw>356u.j YoF}+E_ɩkoj-neZN9}Pg~q~g.;jRK$ KpTq8*C*|5/5֧<X.|8kJ+G_|Aᾛiv_ x^Y ahέ߈tϷj7om>4=WEMNOc}⎝,4^1NsF{xzyPjZ?1AiGIP47QkҾ2k=]Cq{{^^G;A}zM&'m> L֭/c^x&S}߆;j-kw|Y$qfm{\Ɔyz1Ȫj]ZkUB55s1:u#VA/04x}m>k|O|+>*OA>'x.Kƞ|~ǎn ˥^jPܿkNj>&u~ԚO~zOcŤþ/<]෈l_Ph?a;+/JҴ>Я;O'W'6\WpF]eX|*ʕ~Ά<_:Աa970؞=R8:Ѣ~W7? |Q[O>;=[߳fYCm~%toj~^oGOkiĺ~zQ_/??hsK| Z߂#xu3e|aauh}?Xj l7=YSd|1yF+%yo 1Ec)XJ~AW;3LgJ^=o|gᑇǺh^sq :@G%gsj6xm!MF~NOFMILo hfXAoZMZݜys7hu[Y!$r|?f~0xܪ 3d^b2~#1q9yy%|ekS̲=¾ԆwW:]nt}>}H^hb[v:DZ8ͰS[ۑ&~U_FqXN&8jPzkF p:thJ:p)Ö!(((((((((((((( Zo?DGWh_-j_P^?_D>։_Ѣ VǪG ;c&"Z.{^Zj;+f6+}MOPkKyo-uM> "G+J{ .kH,\gg0 (o.oYI&$|` x7IԵ ɼ?_|my#м/i..񦄞lv |Vi~kycEOq"YXxD-,,l 6K70${\tQ@r7&[W?ďxS];xݲKo^u(xa58 NpNrR8Nq'QjQdM4il>#Pa+i0؜=YaњJ ҩΝJr8FJI1>_J?OxK炴( ލ/ I+$:W -?Ii$㴴Wyf'sIʥIu''9rr&ܥ)IJRm&mc1xXMZ8MYb+՛ZUUVrT)NsnRm((((jZnFae:Νzvז7WQmygwo$6IJtV ЩRj5!VjS:Ӓ:A¤&8()E~W i w 6z|'- LmtCҴc4`#,HW{=Eof3\n/3,^#9&3bOqbx*Vb+ԩZiΥIrW Q@Q@Q@Q@_K<5im$Hд=#KQO/u 뷎%k˛4'b1f"+Wbjԯ+ԕZEzZիUURRR9ɶ8 5so%o</Ba|}gº[k0t K[èkSReֻ,4qofX,#XF;v]#Rge\.EpxjZB8D +((((((((((((((((:Duv g"֥n_k@E5bzuxZ/ߝsBM|kG]=-cڱY qxKMLx_Ú>,~KdAe/&w>lR̓nQ@xoC|<w㏍~$ѯZDΡC~~ϧ^h5-9I]e$LsWdx4p%o/|o! O4mt[ {K =[֯vu='C&ʚ\IY^K游ŧC{jm5xZ׭u)u:O4 xmxLKE:{ܴWwg:\Zqmy̗vd5Zu6BD.% }E1_s>m0qx;x*K <#&y5k[_ c_Bceu<Ӵa9xsZծR O˨xIC+8ߗ5+J]O)EF˙6M'mI/>%A[Y/.տV^W?j}[z\_ wEuO[|M5&kZlv~K(ק%RݬeO92>zx? zƣxT$mC4G]\E{-%.i45[" _xWB𝅖uiXEcՌ4 oc's[^WW:u*{gNs$e+_va6?xǟ-ψ/f->>|RM ^? < ki/u Eq[ NUsrx . ?b$yq%$]_XJ+I|+!6?Zo'u?H>T?wnSqp:$Wϊ*ej ;7GV@t}o A8O?o?D?O+Tm>? "Zo6?[NS[OSq?wn?'A|GȇV@tej ;7G #|VSC+Tm?OxO }_>+!6?Zo'u?H>T?wnSqp:$Wϊ*ej ;7GV@t}o A8O?o?D?O+Tm>? "Zo6?[NS[OSq?wn?'A|GȇV@tej ;7G #|VSC+Tm?OxO }_>+!6?Zo'u?H>T?wnSqp:$Wϊ*ej ;7GV@t}o A8O?o?D?O+Tm>? "Zo6?[NS[OSq?wn?'A|GȇV@tej ;7G #|VSC+Tm?OxO }_>+!6?Zo'u?H>T?wnSqp:$Wϊ*ej ;7GV@t}o A8O?o?D?O+Tm>? "Zo6?[NS[OSq?wn?'A|GȇV@tej ;7G #|VSC+Tm?OxO }_>+!6?Zo'u?H>T?wnSqp:$Wϊ*ej ;7GV@t}o A8O?o?D?O+Tm>? "Zo6?[NS[OSq?wn?'A|GȇV@tej ;7G #|VSC+Tm?OxO }_>+!6?Zo'u?H>T?wnSqp:$Wϊ*ej ;7GV@t}o A8O?o?D?O+Tm>? "Zo6?[NS[OSq?wn?'A|GȇV@tej ;7G #|VSC+Tm?OxO }_>+!6?Zo'u?H>T?wnSqp:$Wϊ*ej ;7GV@t}o A8O?o?D?O+Tm>? "Zo6?[NS[OSq?wn?'A|GȇV@tej ;7G #|VSC+Tm?OxO }_>+!6?Zo'u?H>T?wnSqp:$Wϊ*ej ;7GV@t}o A8O?o?D?O+Tm>? "z sꂹȵ۟@x'Ǎ{_XVhZ%<mk=jpk^3]EYWˊNc[]u÷+>$x—6pizG|#a/U[سߌu5[4l=h'N𝖻xg@F|AK]#O^ͭ5tjgZXE=ךCmkQQD`?n4 ,o2x1i|AEw([@K Y5$uҗ'Wuo+ZvױՂxeeG:xc΍xhOh #6C孟#,l<'_Geuj6^].Lׯ'7m]A ^~"[_W0Wo"Qօs8kojk־m-ּ;m%_Y*|c*qTO#/dJH)8Ҍ T% ԏVgW 0ŵ+UqU0N' 8oSTSWRe_ګ^f |u!5]3JOZj7 ڭޟŧ

U"*2*LNxZ3R5ZtJUJrB4Jui{x(TӘd|=sl:qedM_$WRacbI xZ̶ ]VjS V'>x?o>?iO|i/_ln?j|R'-/,u/Z][4KӧLž'i ׮~&޽ؼk^Hvח> _o:=__ ZA>kxӺ5/Sҧ(SU:!*U%BHsҍJa;ɩEUӺSlϟͰ W~`5\&K0Xcjdҧ9 EZ*3}߅C[º=[K/⛏ ]wP$zׂG\jlַxk^!$7m;X1|Xǀu>3ME_y:%R7"+4"F2 l ٷIeβg0lD}Zt:FQXa+ދU9O4>6>4DX[+yaq{σ<^|_> Mƍa4ɨx't{ƿU2hmk7#\q%ImG?^æ| foq߂4xWZgI&We3#S9FcYfOǏ=Eӿg~7 slᙛj V=Nz n, xP]Ÿ=['/4m#G-qCW[i^^0 ־SWK?ش-;E,/Q:{_oO?߈ м7ekiz; /KF^;똙.>8ZyQN0*Xˎr>7?7~~#P_~2|+G{-.mwZKm/`/ρ<%eK)...2ҷr\*e\o^%1Y~aՌ%qhfp!~˶_o |BD?x2|;:9{׉/_?:-^˭6ӞQ}wH4x?>%|8a m!E{/||i:V xnwšе9u ;y\ISy\p *엋3 )9p q_&AW`NSΰ,.9M,(_5Z?>5ďw׫|V}ͦxL?ZWG=ɢkt]מ$[e[h?]ZԤMo6[voZ SIc0\d"[Ðå 97_2ZW\gϘRӭeAĹU(%̨jslL8(a_8`(((((((((((((((((((((((:Duv g"֥n_k@E~Ҭim:>lڝ敩XjD+55-6!Vݖӹ-7us^< w6i&tKtf-~G4 u : tmt:K<ٛn (5~??h/xs⯅< yo_njj~!mI Dխ5}gÚsYM}sS{;n?oᗃ|a_~8=o}Ji~u7Zŏ |5OË i߆|MhxVv:۽}<N<,RYVxiںB;V*/3'flV35u|Y=lJO2 jƝxtzW>\%V?|zyia>(ZTO[9Oxv@<0 πZ9&59Kni%j-õuo6*<[Z25KᙹbSRkNIe<=sIrkE.P4"ƕy>)]ͷċxwYEhI{ׇ5xFմCy):u-Z+;?~ KO?5k%D|m߉ski%ދ£![H4yZ{FMMjS?.^_ayV' Xx]KR&'qs2# 6IS̠ƾQFt8VYn&8L,kUI QnkJx\y앦GWK> ? >>)ŧZ+ÞHu{+9uӴ{ Q{xG[]`lu]ּ7m|IC]'5%: :nZ\\u 6Y"oo@| 13ռj?K'h~%k ]~xwQwy}?vKJoq)ap:p<17 vKi`2ő湇dmxeJJS9f ~ɾβ ~*|]qWo|g}3U? 86!OTz~a}i-; |j_5/|sq?Ν{.h=# >:[|BŚtkVexVj:e>i5?ȼkľ,ȱ9C¹7 ;Y8 s`pOcʝL8S[Y|F].:v=SEu?xRz_i]\ڴ!Mqu|3 n+Tx_ Y.QP|>Iexw(=]𦙠O_ `.= յhAkV yz4?S~(ѼA#W;k-/)wwYִr ? KTx_8y6/1V׭y? #ጥUCթyLKqr3U_/ZIjLj5ejaeMUbR,G|6m5xR 9𭎯&E"1xYF;c0Ke3'`p?{SѩKxq0q,g# A |#3bďxמ&]3gKhuaW>2]|)8⿿K7~?e #HҾ1|K'-7^=G<~%h|:oMC>#þk{-mt ?>EOO 8aaصf\=s0Xυ2<c4ߢYIvWej Օ sY^:K![:QgJ.cH<*xOo5_^3K7џ>PkMsL/.8ڭO_(((((((((((((((((((((((:Duv g"֥n_k@EtAֱ}3FwSPѴbگ<3y=:z}\l6O4o%]:uk_D-{tg5C jޣwƓ>4{ ^' iahVwڢ }OPO Z\]t8OƏu_> A.#Gw\ŽunOxgOҼ>CMJR6^ ~(!⏅|SzIwይ;7ßZ_[05|\QK5>"Ѭnk.&^MaKҔ 2ZRRIݦMifάj8|^zJURB#Rr65$&Z3w5Ȟ' ᧊+x@7|vg{N*5LB<' R};Ylt$[Z_ gOFw>). ~#i/t4/g[/|Bjk6^wޟi`X:UH^*.ZoEJۏ/2D8qf4.2u 4t0xYnRiP̰TL:thb':~US|GI|]߆x⯉<)'GTo GM. $NgkoxFO_ixk & /Rn?w)w4}[Dž|q4< ߈_>5KZ3_do_4|,|iikq/7>"sy=6] q8V~0BR3 ւRU=Xzr֧.LUHVKZ^U);(dYfYb0ٌ_x2CƲC6H]c5ď٣^-|,-Z5 v[ӢmV'>JT52?eZTrc*q\Ӧ n~YNKpp9ƔK!NM>!1 *&pjjG]||g<3^~(ߏ?Zݧ֭Z~uO-}ڔ&wݵ Ί4ߐ|AnxG><|@'¿oZ/_|i?|G|R>'Y|= x7]zޡpOS<лsua?~lePXW:zt](`.'')T"F0te6< 6ie81a O:%f8\L s|KU֭Ytpuq5'<3gOk> |[? _G4>o֢nY7wB/bI6wYxM|[K]B,=?e?g& IC/ZVP|5cs`< uM6o+$֭*HeSSU}SxsO"ѼKsNF|w~ο|=Hb+m5IO5-qJn;N5/x[G| OxoZqx&s2K- 7n<.S3㌧:,Lqt)L<1qxwχ?f;{N'|=3dz7ŏxG<-A{yeמ ^|Z]N|._ῃM~*ċ[b|YS:׼?Oqi?ŝumGYLXLOK)TJia.Q2V05#|;~SxI#^20N'UqX&(UVTr=\^.V2թsN|G ;ό(7xooh4xg_~ԼKۨ5? ~.x<-,W5WH ռ4i#OCL(5׉'±_kƭy<5}N'T  StӣծynR&q5Q)֋fR! §4RS^sie4rib,&"W9]K ӕ:UGQb(bV8R1<u w^?м5h~f 󋉖k^ {Ih5߃t7YR /.<յMpuR4]oE%[V&N4SN&yZng$7v0YZͭQ*+AQ?g[` ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=W߆~ieaŕwpZ8[[-u9lo,nEiQ o3;ns^$DM^ĒxK4j4ɣFKռY xb_յ8nA=I1.{FҼ;amEiqml"XmxT4U%坙b_PPEr<-xž5մ/>&oJ-m,u˛}9.KP=N}F}FOյH8g-B_]?縺kk+໋F_h:=j}Z}'ʝ@O^GN1=ؾU Yzo9̰nb'FS/gO,ފJt䛆cSw֔JTO |m ]Z|%/AiV|/?xRι#|M-m^1g z6ǹG}Cֳ_jڶyw3 T#)Rc[ Uk^2suԂ3TI9մ=56Ҿ:|wΗ* j 7|Cw'T&꺏a͟(=o[Fּgxڕvx/YKp!xdkmS^?|MrQ,Ok[6pr||I3sއqk~>cZ0ivڧ|+hz}ƥ=:|7wy-v#kq(X_#ٚO/} :'n~~> ;Nu<{*GF3ki-/๸KF׿NPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ 𥶯}Wzxܖ-/~#xNWVHe/,^{}>FLLq oyW G/t~26"?GOWnm|)[{@SFhZ,cui 嗎 -F=+Dzx!Eߊ4GP躕լx (k:C.t]WQ{Y5:f+|мCyNwL}☬t=c[/EKvھZ5O$:~Ew-[K|S ?^Ӿ(^ x<'ȳj'J:2,ֆPDד/^@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh$F|? g|Ṵfp1HҖDHLK9>GHl.O4O4]#JKu1kf- yD1H|DEzR4jQmGϡx.N 1__5Nj>#/? \,m73y!խ5MQ:NdnuN)!NMF)RiF)6n$mZ]:u+T*TVIƝ:t)ԩ9r&cm$fW'['iI.NJI.u}{8ѫ%MƜjtiIŨN}8pUi9+)žo%W-Xk txS[:5oP:V4bOլݜL-u;wwʬR9Ӛ9ӴdN5t}EpհxFg׫O3uT*愥 r24%(׌io^3$t&5FIyⵁ -3odO4PdF(.?hW6gAewi֏w5mƟi2]Mkw 3'䗳|OܼiNڋA :/eu}(]zkz/G_i>kZivdu+`'(b@ZGU֘|=|]z\- ؜N&<> :N4СFeRj%tӌ91\F')|XY_ x>( 'W6>7/m~gjOY}WZh|(|4k?|%o> ^X|:no _ Gz/T8o ȱ\C[$̩xlcC&fGG589uLDqupr*eAhzkZޥaMΣjڭ徟i}Oqw}_ 7W2#+)`jiwީXi.as:yogivvww^GikakiW7ȱ0駃T%K V&X<,Ы5QrqU1X; |RF9 (9= _FDUCI ]Iln'kVҵH.R:¯gym4X<^.#(ԖBi(Jh¢|=ZUǖW8Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh|cڞ]'4];xYt-K|]_]5 j3ٓ6k$ Ox⽽Ӏ>wEƅx~>j?xwtF]Xx"i ΍xZhZT1cXm& &g/S~ 9h/.<9EgyR^yl w)ǟ4RDc@_PPE xu|otX#o^k}.;Z3/GW j{-6^ kc4Y=H<_CcwiyYحiwZsBnR?%^-I^{q0\ Zz|58ߖQ٧aMÏÏ|gc_}Kφ^[m;I߅_J,L oxB6xQo-uKz'߈Oٻ?ifM4-Gه\Z]Fǟg~+Ŀ< jm \V1rW)sXX9)xiPt%]|ϚzAWsl_O!icZb+dy֍| zv'8xj=Uk '{>~?cOW=z_<g>![hn?{hĩa?>Ş'X{ SJ}\ky?$ <[gwVW!~O㯋3x ;A6뚖iAe/| 5k?3'|g/xuc ⧇~*"֧dG-G'?+I}{R :iSԌqN F9U8])R'BU|S 8XdXXUK4BG:41T(Tq|3J)5ӆ+G½?Pg=kWŸ~XAߊ2t__~#_xqOT5U %5 VJt,~灼9,ӴvB5-{?_7:hzCx_ՒKZ%w.u:OM`k̷>3)9RPUF8ҊW FU9)NMS8傌R?+U\eUiTad a0 Vr . J t!N!N7ZFڮ7F[E~-,>-|iDHefش0%^Ѿ%#&B՛O+߰Fb],* Ѷie|2\*&aUT7_(NJqP 8Fqvsڣ yeV|M? gcFhZOo_"/B/fȚ!xX[XKsX#]| _~(&Bh? <1D|]-x/^[Z#^7lVyX|o f' `M|,?_mk/ ohS~-5A{e|WDnoMҵ3ݢ~˟|FO5i~߈OO'56÷|=x_,GmsHuizީ_ ^_|S+x.akCs~-x=9p *=!ͼ4zo./$okl`,ḾQym$[{%@EZ+ (-I7 c}L+[KWK2:uq&qsssGh\oᏇEHZ]|)KkԵ.o^ŀҬﮗOZޙ[+/Q%Rq9FWJJ*Wm%՛aqUCWUF9zdNQy朣{ɥvpz {Eg/SQY|?[/ߪxOUÚGo,Ӯ- D4MKS%¾㻴{7=kz`g2WZO|O? _KҵxNimoHl.m5 ?QU%BZU:5] ޵i.J^Ԅ$է ҄i)x{6fUpi0ؗ,v^ JtVT0_Z/BZ4& W[ 1\yώ>+x+η@mֽeGKO+"&4So|K:[OWún{t˽Eջ˟]]7_eq<_"Ts6.$ݚTҜTk)858KHTΣ'*mJ/ݨ'(WG^*a*>ZXZޝ**g*jʋ%FOfg<{ߊ 7ؼxs W\O_[n2XZJv/uSRΤB|9˚d YsBVeexeS|>'؊*l.#ԕ?oh\=^_iF,}9FVW>y<)U?5Qg;C,uKaZjwiguy>.iY#j(k uέ}N.ɧ\\}/ʶwH3񏀟NXkw,Xt3~ʿok1M5υ|)v -mr->9m[P{U3<_:#w[iz\ƽP5C]>yYunR5]OV ۻJGF$Xb8:( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=W|il(I]v+26]io_|&5|MB{y>:O׊ c~յK=b;OJ~/|Cqoguy~u|goH,h6ox :Ҵ񧄵M:=؎{!0> мCj1|gռA EG#旡C{|R:nCh\ό_fwzwDGtO3#G5/?<+⿇4=b[O|=-nZ]s!5b]b^*Q[G UxUӥ{TaNR(崞hw8wTfRc93ܻ"3"qx*u1%<;2zJqhah>ux[@>i|%:  3|)-J߳;y~$|C| xA~8?M?QO_iWg7~Ҽ1_ ?eM3J$|S ~ K~ ~xGO៊H/ﵑ} Kl/5+^Y˖L5Ll\apؘVX{3 +VԩVv3USsEC'J|iqQ7ex 1h']x,}KG~<_ivax:Vu R1=?]|Jw?o_|k_ (|[cSVMnAwCzVV>EpO6V? g]Н B"99bSPRVSJ_eT _M8j;\x*o߀mII(|,tO~_Mӣxo|{Cht[o CH֛i{'VUF.*l9jg|-j5eNOVRXN*(Ԩ[fr}'jqԬ"dx<0˱0QyiarZ V)=-u__?x޹~451So:t9Um/?x.E;]3P񕔺N㛫umO6s4y^߄ďiͧQx F[rOA-e ?[[6aV β:"2r(Rut&%pPuj{EuxT*:b159 ?W[.58CYJ9Oݯ'.s"/_,F>u ,'F]/&cJ~\g]&Iu&z&_D}wtQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhox\X ƾ9 ~KIgxLZ_wf9E6 Qx[Þ0s#ĺR\hem|~.OcCr2kVyc c]φCx4YdHa+jV]`_*UDtn#4_PPE H5FBftTH[b%ҽcwr,`:t0XjP\|g> wKcg]w CuZG5ZE%ê o#kO7A?ȼ+A|;\Yu=C cjA%ْ7o "x&,Q[AN*G6J-۷KZypΫX.G^QW̢.iB/ߔmh7r ( (_BDžKXjxgiiмA\:4MBz}ſln _;-j.kOߵWCJ[4SCamhh?eC;EsCP+UlCPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ .#Ӽ'/x]޿mt2?5ZnX_@mRiQvy{KN+,Ƿ^?o xK E;z^*oYOkhet5N+M='Z,;!N[N;/tD| m[0Լ6|=>5kHt|1n/ j62Pwi#-R:-?e*j7Wj^OZmBDq4]j7~(z?ھ׮kQ@|w{ZoZ0߀I=kF)𞉨^![aH|Ga?iv'\,m+ +|#߅<1 hVSxlSOm!Kyc[y9bEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz( zt%g|=ok_j^7]I*Ei=|\`%nS:dV|'k_4=PC'5 YVx_@_>8MB[l6gn/mi>oxM'ik,PNh,kx=2+E+nb^ʶ ڿ>'<@kcj}3WOQ>'a?Y}@V%pjҪ._Cs2Hƥ, -сGGwX-YEۢ ֯m4gIxn|A k59Et2;v)v[SE8_~|uo 7ேu~z~h׊555/jW}R/ QXb#@-[/]x#BE7_^8ZS 4kS1}O3f$7)CեM˕T9[J<ֺ{]_kάc1<${X|4r{Odօ'SCK<L ;㖵,B)mߋ/~|@7 OYWд~}w f8j.i>E6Ƒ|Ha|G[͏sGBvĩ]{^ Wft>xb/!.UisI)+.IG5~ol SSNwteԥUjڤ%)JxjtiWo[K?h"7R6Cּ)~0R'uiZi|n֑kCLn2\i^$#B.o|*uˤ63ҵCi'5?W/C~iO\ȑXHPtەZPTڌ"J;ԹN4n$/G*+ 9y3-tP !ʄ㌩䒮,-,**!RNx/1?]x{ڼ7(  ex j>8o x9!~ =;㇁i ĻO_^'n~=677A^}z֑ VHնS]b?o4;_k_ *i?g[zcC_vmKj~R;=^J\Y][S&%XzɹJ KE9{Z\TN.UN~>*x:CqdUq)b2td0|AW'K.\F?}xW~ O cHӭSQ3LvCkio^ZնiuΧW6ves}wom'Κ(ִLs/7<#|Axvƺï^ft^5- D OZҵˈ4>[R)*^)qmI5g:R#(RuiMKʸo0`48`(eJ*400jSቫN/ Nj4Jׯ>|U %ϋ.n~|E[h$^ DT>Am ߴ' ~: Ə-׍55G}'xSAW Mįrh5]}_u궗M2iZT02'8.xX֔eFU,LiN8WZB*c- .)UCUUZ9Z5 ,5xWp3 F*1B^񓥂֭K|Qi|T䚶Q<Rg%ү h%\(h>&t=cNh^,ӯҵ;QwG_Wn n]=rHӊyjܣR&7?h۞&IE)JQip⥐XrOIW.+EJ1yf PX2ӄhԍj)sbP<T|dž}?υg O '|7>5/^ob<3[i:M{:4[-fDwi/xOx#L0w_]~#%3[]?HԵ[/i_x7]5\CcM/Dty~[i,?hF4R9GwWTT+I`R1|-|F+G/9/s7㏌+j-7[in&|mΩZE>'Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh;~(xšg_;K׼sj!D6+noԵh4 j "xCž7߄OX?7/uą,<.mq,mga kU| ;u:^u]ySOK\L e\\NhyC_~:E^xcᏃt~o4Gagqxu;<>FZ[-A hwM#Kz (dλf6__7ړy>wyښ~ɡkQ@d&uF/7;4O'fԛ󼝞.#>M ZUW?ߍ]X<-}㸬?xM/ Ů G(⬷/ɰElIpټXK`jҧ,W%`U'h~J!r߈oo]6Gi %x4{I-uYSG Q`xIμ,4~8i>4w!ks7k/o&k.e$ګ|:mgeO5.K?߅>9+M/H|j^3ⶋx?wVOi>'7&Ƴ|Couo/V5_Iң)NX8S*)Μ1AU7:E8LJ('bp2^#ԫ_,gFxʔTp#el,Xa[|"E–nKϏ?h2hOQ>=Ə]NgW-(\o 薺-ǷkoiC8?ğ/={/ :~ x+Fi%ߎI࿆ o:ƥYiqMysiqjS07:uUץ(l5N+9ϖyBLOJR2U!^8+ȪN7 :טRü(`dž1-*aV+ 88aq4ᾮ2[38i__4O?,d^|8_|Y@~,x+xuCy[~kMB+\Җ}G+X|>5OlObqM W BsvŪeSi'SWq-gJQ*rUS2L~S˗=?.X^brTggWdW(9eYN7N^#'>zgO ƒM3Ş>zO ?w>kӼ7GOQ7ۭF *|Ogڟ%4+7: ?oW>|ANkM _@v8]u-αլ9?;Xjx"T8x΂xl;H|O-OLo%Wc]xHh~A6毣E6id4۹,5\.q^*?hߎ)0{#?o:^g^4%w/|oź΃qyxW? e≥xwFm`j:xW ԇVne^a+95)ڗ[9OREL.qV2OBYCNY*.e,:Saկ˃xlv3ž C~HX|<?ko4-Qskx_M]Jׂ> % NĞ)3X7mGǷHu<)/?wB֡ϭg_?> /iK Mo1 'Eޏu5ί{b+Tu]Zkƌ]UO 5 ):n5c^Oqq.WPMSTQִq5[\%:㟟 o<]bƿs R̟?g> џ>.|Ce=ď1Ǿ3}qi=D+[\խΑqca$:*$JEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(8y/E|#jE5m[\ׇZ46q 1.f@R;ԍ,^VrYʀy_:4i>↵O'o^iVŭA$o5mAwPWܬIqfp+)52+#"į+}A@VL1]eIc󼍾gy|'mjg_k5a/Nm<}ey>v#kP?ej^E_5xo:ޱFco6^ڦg;j> Ҵ4k=Jk{ 6Pb,]:Ou3W:޵r 8Wx̯)α.%c1ymSjp rfQ˲ ^=g9yL; l%:98l¶w~)߀x>OƓ[-_|2p!<=M N6W>Sa^{M Em#?t %iGSnv>p5k&}z-t3jmmPA' 幭A3iy~#%O8ȱ 336ʲ!XL40Yf.cF3/8E~rEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(<'<-oHj~W>$ช}.U}''Ix]W7o5{׶K0 >/~l|Z xn?OLHQm5K\ִ}6dEqRY <|'7JҴXtm.Fy†M:VmB]丞Y%Y]`+H5h7)~IQ /L$MF@_:\4znIum@b[&&4?2 A%٤iHд]GKMZI. (<[K~-s_/>-黷k>Pψ<9ڞhރ{.z蟲aďZ?~,x5g>O]|Kw 5|ix[may ׾!xUY׵RKyoոo|ATrlv{J s8l- NG<&\Cᱸ mVԫ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=W|]ұ& lwyښ~ɡkQ@yň~ \x[mlD}Zt:FQXa+ދU9@+ƯQ/>-ƙi.i |Iῄ/ _x=3*_ڬ 7? q{JT{Vg_z>C>?ix⥇χV?IYN ѧmdP~inxPOj5k=7qi uqYW-|O7x9;*|7'l|CS昼3oV"0x(<,ijߴ'ƕk |;;*? :x?[xMwtH_کX<+]HF`t_ɇη~-~ > l>"]s. xo~'&x7__P|;KJo^ʣGbϪxSǼ'lσ0>müCO7X< 繖c(2<㱙L>:V3Ku7_xcW'#cO#wBo OJRj>%/t4d\oiu |]n˿|ڳ/iZ%<=/ 5xH[ ,w4,5 _jKþM "xoqK,;\~WR R2 \gGxxo X68iz8|v[~џ`u#< Ꮚ4][FE ߈Z>OZᄷ/ϩ> ]Xqh3\7e|Kk~~*j~1xzoĿ~1i_-mSzV4O%=i\C[uamim?mQ/f<7crׇ)O Se9WpdX NjYV3uq9,x&p9f3~7<fA$x_|_j$[x ?f  Q}~֌"RQXƟD,2:X~#`j#eX9N 8ˏ(ѭVUx+ZxW^_`(@(((((((((((((((((((((((((( Zo?DGWh_-j_P^QmoZ FKSΙxMn-f6?a%` ߇Zλiz{|\M2m+WûKpGu4n-AtIy n(Iд=/:&lt}Nt4y$[k xmaLK!LAy}A@VL/!u]WI]$xʖӽR]Ʊױ[鶗P-_j0cokQ@dwQ؅tGXym;Ie%k-{iu 2= 6XQ@_/ú֩ie~5]"{K{~xB΋o+_}֭+}R$.gӥ⻆o/ů CWVoJO|cM7ž f+ͤxZi {i[\i{Z/5 .7}eUbishakUcO+:t|ʩaP,5iJTCƥ|+>?tũl~{Piv^:zi=SO3 ,l-u-[FL=Ƽن?_Ĺ8.#^ʮAkq>g33:C5Kxg930ex7↑7ǟįz>>*z,7>h~iPAmֵุM_RKvꪞ E࿀sQ~^'|-Ꮙ^#fH#|;𭎉x~?j6^7^mBYug٧V'Ō.2.+{n)!UljTge|1ywF^Sj9WbS[Oj>+|nӴXt7:Ž?Ŏh6i~_Mi"zFYnMֿ=٭¾z?ھ׮kQ@d5F_+?;yWy_iˇ|G֡?pZ+ξ,xc2x¾ _u-UmuM") Kee`dg_S$0Qᡍ`LԣK ^ [ F*5UT*5 I5|E[-K[_x+xu_F>oo|H›w>֠eC:&Kem7Gu5g5|G_? <}{Fz?_FOU/f泧ߴ}eNM3|I I\r,f<d\Ax-ܟ)N<2 ^y$x)s,w|7a0JENJ>u okg? y&o'¡oW|>[W=i~)7^ a|qß/l . vּ1j^:׼Gx>o+GWo{mf/ &iyC tax-3,õkg&e.x9F? L_ayg4^U㿳|8*Vv?>1~ѿ?_Fω9վfEY|M7Þ5'xO _jgR_ïj,l+? I;%~ߴRDs3]KxM~%xּ1!x5 3xo4U=5}Cźo|/E¾!i_φeyë? |=6&|~&{t?ߵ ]O2j:s(.t;O|+j2ZwqG\a3rpjf|5ļ.? |`rE&U?(i +_cO[S7߆5htX|)g9%MLZ]|L;ihZX?X42;__x[vzu< ԭ ީ<}*?iե OHtu?rCM`+D4*n*/)dWA_x=a0X<'4Wg5s\8MxC^6?~/+|U/?|w^.M{O5=VTE[43Msq$M|| 7O7$^x!N9&:c+_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh? kH)Zlt#Q/^Rx? GCx`ne%Xhk?| hp%úuƑv> +}*{3U?O(׵NdYIFtmJzkhMnekggl8`$U,Ř@4 (-I/a}>ӸkKhWA=uqomsmIvEnMY|C fY_,r[EnPU ﮦӮk{kmbK (9x3^;t_ںe[[jZ'=z捨p2ywg9M\_NͪgyCx|-e꼽JU*?1Fp*r_~RZ|Hgo"i>=?_{6yߏZoO^$KҴQ\|u? EHh馯_O>&o|w@4Z}Ť6?H)ҭ<9hv šƚz^N>귊"b\8(qYŵ3\ ̲), VgiQڋiq>,q)c5g7+ 38:Y,2܃ bᬅe9QKb%7C+O5 Z;ڦok:{ ^==}BW_XxRGe;3"σ'xMOIWm^9񞻤[WZ}:ngssoE< xg~-mixV|x^$6e6:/|yxºo/dka૰>ѧ9oRk]c33?G œ#xvxypL22)UȸnUpfU؜.UQF/D_s|O߇6%d5Y mue89Zg{xzHַMGi7ٷOj oj6a'>(|gHICOhrqKx\iQ-"<:T) M+g/{fNc>wy3oOa729.}<]`(e<=yS,Tj0ԭ[KURh9д'Xs$B!mV | ?K>)^hUxZ(e@zo-ҔS IxO:W<3xKC[h4Mc)i[Gk r +a|egs+ (a:N'}|߳jMN?OGjke&E utYFWWtN{V/s +almYmb>-H4 W!x|]kuL@|7$w#~x;ĺ+=_—F.weׄ*ppmy1UWf9%lf6Qv]a8+ft5\.l|%iTjI~^)^1׎h/[~5;[|wsjM?~Zkn(7k^g#1-{FXtObkFºy5 _Gpn??p |' {qX l3<)R`qY3@':3Wa韆 >oo?]lf#٤zsyxneaif/@nr.yiSRĺ_u=$hХ}%>kBukip + ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@xM3}y4SvmeN 22c2w[[91Ď`HqxRY>FӠM=֧wo 6Ň' H3Z [%x1O 0MŽQH<2)2$R#+"3#RA%( ɇۺ| 5'?&Dà j(~O|}_WiAO:֢ ֵzeַ-cK4k^֡iik<[BWAkn&xyb3$l>PhV5al=)b1thPN2VZ:TS9FIW}%/%{:Wtx5z:7K_^vᦿ,n4 SO5~/io >(i5+O'wtSY"5?: v/|05mF[4;Ll[SV5Yq gQ0Y,ν(f{*yt1Jcȧ]b*R15+? .N]:5e쭮FdՄ?32Lqmq6qpn=~SfNZYeqUpy7,8jجz,.[BqJ~}xo|)l'u >tqm%湮x{mO:D-<ě?dZ'xke%|յx> w$Ԯ}LYj?6Im;Fm4Vi=o%ÕxŸg,>m )ˇ(0O&ymbOdWIeVQwZExG~nxxw@,"kWZ[M7JlG [xTE,:0<^a0\F;PXJq8^/V4p\.g[V)PJVNe)$ÍUm>.0{K4˯|*>!ڔJ]>XiF%+p05:U^inis70XwwrOss<1G9!TX̧B? np<}y\kk/X'S}U]5tՀ6Aj+j ɻ2djQ4k h/,o%xn-!t whdK 9U Х :8ӆ!EДTcYE9:MlG4[-ıM3QCJ^IeʤqƊb&e)(9JMF1nRvI%mս|k~-ϊvk~N[&|9ws KŶdua,)tՎcULe*1jLU(֥ eRxSVZU9A*B/ L +(((((((((((((((((((((((:Duv g"֥n_k@E?,6^>7񦗪Z΋hz^sZkW6̘kY%|GyZ}~>ž)x/FS~>+xt:Ţ0MܖVf Kv_k;?> t7mt9$N->YleTL-){6ʹ@_PPE xu|otX#o^k}.;Z3/GW j(cƻc~y|*_o+?pO>z?ھ׮kQ@q>>šBk3 Ktr['a9-i$E#ݖf/pcURt|"&:spu)ǝB$uH>=/(txPxFѼy⻟h:>&>xǾ.ht ƭͼ j^x+=s+קx~5xb7xV]f< !:4 8~ͫc^ڻ A MxP\[=7tM;t]3׀jm__gUD_Ӯ|Y]@g ?Tԓ%;ϳAqe7d f| gÜw;a93" u93gʸ*iXUv?O|.-Zߌ>!XxSǟh4L񼖾))5|[|Zx7U|'ݳ=/=sd<ς7sc᧊1x.7ExLm¾ Ӽ9_?|>G|g'\k^?o _GO[ .' ۆ+a2eaK>o[xL)33exc|hR+/^0wBYk~'|m^Ѿ-x6?-Euj-񅗆',!tωN{{\y%n|-sßt:7ufϏ,u-ST״L&<<:p0 VY 9_|KYEӭ8ޚ|(|QaèSٓwo>+ɨ0ƩoįW~7>3)]ëXKc⯄nM3)!xd>"xA}h7Y:V;G~,cocvibwgҭ1uF?־ ̻-%҇p'2Y6(7 ee,Jx^2eSKJ|488oZV>-BGោΝSß?t:xsVڔacosO|;_i>k|0$?h _Ş ogOcx|Ex[P ia?8tiwv Iu Ǜo /bcq=^p ?YV ld2r:JXelˇ2p, <%|#/𬚣r.(LqKO} wm29u f =f=&msEbTtM`p8l&jsJ7RIsqP"Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhCǀbmxXmtoo~OZlޡ ck~~D֯(EKG_ xח 3i Vơmk,5ȕY}k:Wt;]MW4FU5 I#eaєX+}A@V%I5f!,t?`Ӗt bIsj)fX Nxn$.nnu6-I7 c}L+[KWK2:uq&qsssGh^WAq]#⦷e/7~/UJ|=chnbѾ_WV_xڦk/o߅Fϋ>G jF^o(I]v+26]iozFx4? xmum_Aqi>;[J]ߙu.[/ j?i[{ld y~ .U4X!ծf)k%ci W 8QPI( ɆL뺌^nvi:,Oo5~7y;<]?G}VL2g]bsId|_yoI;bh*VEwڷiύl<_Vֵogntt~tڏ4V់4'/}[&OE5?x-5=#:Iu=DŽkMTltn,{V[ZT*SZkʇ(Ƽ28{XEQTMի J1s*􋃳*j0U>gW-Y_O2*l/װc,.' SңdTS_?VӾ= <=i?>ja_O|F}jTQOi^9֭t jZl3C5sY,R\EH~ҿ|?. RѼo¾84;Q '!^}#ڕڥ压y{ukiz%̱ckx5N_tʛ4U:iԷ*l qsK ۥYV9xC ?{`!yDGQtG7ff/ړd|M^SE߇|/n/ҭ~!>STaV[o`Hha`qR^Ya9CQ )ֵghl5]E >+xj_0S/mOx"Ox~|:nk}* /].MXEgi3[ tYBKT}sxz1JpՍh:IוZ,ڷg]Y|3(R|=*eTOx8Js7N rTJ|%/x?N_>%Tּ/L^A%:>y#N8onnÍ/?t_^>x'|[j+? xoåߟjCf8|$o|_]unj/o|@WºVoh^O4?Wm +&6Mg`U%<&&*:T*RnPZJrZy!Wg4)1+exPץNt#6"E 4pQUJ'!>;o3#֓}SzG,1-&Yմ(o|= x;D2[FU~|W>'FG={C|AgZ-ޡ`m3[6K)"֭u;h"^k:tgAԣZ3Z2R9A8E\Ooa<~yv#,2}N1UURt煭B34fYӗ$jJPS G,'xQm?Z l)/%ѴF+H .&&4HK01.j0QSJcJn1c)(ݨO d>/|H xtJM:Ï|NL-6mR vyhpkuoӢT⦯ xx{ߋ^\寇Og+:FZǧxU.4ct;͵32p.[!7ѫO9ͰX/qYS7G$ř2㳜kR6ur4` ^;O> |] 'xCPIeOƶmLdžmN-P"Ԟ%PC~s']CgK? ɦ xú&A6_TH(P{y&?̩qN <%W+Rs\3[/_,\E [k& > 7w0f'fiS\=ÜIpqecx`vaZCG2eQ{* y5Cg|/i7?h¾7OŏZ~o[~$~?.|=~kZխ5ac n,$o|gGÛ#|B_˦]kf~.속e{鷺5 iu~d-*O7Y5ÙSLڜVYxu3S|  \V/( Fl66Yw4 ~,3 -/Z'wo O2;Śn0dXD2~_⮭5IƋ/S5RHgjڍuU᳹$kq9tsfŘ(xX0쿈8e8۪]XHҟ>_OUMSJ%SRv&{;kɭdhi 7dFb+ (a/Nm<}ey>v#kP?ej^E xu|otX#o^k}.;Z3/GW jZ^hl56V767S7zekc>6ݣVRjIm4ӺiSOT֩ ΜRN9Fp$8N-J3ԣ('&i4Gߴo|Bk|#~0|yW9kaFMcG#c~uͪk7~5 {?kKmF{Xl,TS^qg8]RӞ 5YN#5^c,Dr/|+'x_?e|<||a^*7mG;^<5hSįU֐)W}C7Yx‰BoƑ|:~Κ֔>-~ٿٶW7@֧wW)xQ"D>)*iz.5[I-݅Mץ:K b0!RTN#n4ڣ4.ag.)G5dka((S2V)թaG C-hR\ +TGĿ?9|?kO7>%D|k |OҾj6]R9A#ƱIh~7 혞nO:'/ş?tm+v'kTƭ]rKOtM;KMW⟊iGKxt÷)bpn*E%_ Gu)~фrεs`9|$49IƄG;''YA2Y3 oS/U ,yl2uW_:SNu{ w$|@/N;h?~?kZ;Ʈ<oCw/oİ_ws˭_dcft~_$'~Ǧ9|w⯆^&N=!c|7OT54/ xBּ-s'/3z.yj֥g^姈*XxtJcN8v}b4RP ba3LfKđ`&ja&tka*bSQ%W,2a \bja[gϊ>3=Xz NK>YxVo_c7S٧z73h<=?G9oiIK߁>5 Kg|]}G>"2_6u_|(~$5[h| u ewO9iI WFR|S*PcS**~\ <φ3 Jeb=:<x ю*JaNx|<=+8KU{//R$Zu^(~7.<-ᯇ?kݧ6sg ZOm?9jP:N[~7~_럳߆|+o>9S}_UMCM߅|WZMCŞ gIJxG׭ctG8JsjS(UT5ECF(9`UJ)~xʎa+`cs _GW(U,sI] >aO:8B_ZsU[־*M^|Dg5?}:|g!¿om˻(x:]._ nOQ}z&>Rjjnibu ׷:^sre=;NG֖GfSSʊJ5N(~81N7kf⚌"{Y,fqϫ/Tp8ZT7y`xtM<-/2Ntc8ѡJ4h~hk=;_B1(/ \xV׾~+Rg}=nj^,xNxM[N>w?aO XxCKd^KO Y^׼9m] !NeH?GMII|+-|/׌ |7e7ǽG_$>!6me_cǺ&&K5kVXoI*k\9.3wR3 c\ˏs;`j0x G †7埍-Uu1$WE<3'G$Z-.W&_ekϋZ' ,??Qj4i6*Fm[ݗY=m|%}_|IӾx |H83edʧոw-Ś`3\ȱ$b3JٶYBxz95arpr߳ƇWƯ?M?>#v_Ľw< ,&|Z$[K{uOI]6](koll}%_ wrw*~&Mbix'\'Ju}Xž8v-/j:\1ZZ]FC)a)HC7\2U,q91x<>"keK,j*kߍik_t_ >xRo .|IǢkӾ6|>xTjkkޏ≵]Q<绣<%O*uP? > >1O>Iex*[oo[5 /}&Σ+*U_j:gNk<pps `r00^0=*yySq*W/ hPMu% &-ĺ./NKoCIn>T{-P@Guk}{_[}_Xg~mY]^,+sq5z(ĐYCm;Vҵ>Z,X,5 -KD֬⾂xumQJ`Tahg$WJ2Reu(٦]tԣRhԝ*N)ʝHIm(N-J2]ZkE";?|3+Ǿ[ K_ K\iރZ57Q(' )Bqn2ӌ$ӌii4kBl5j85j|F:|E ZjSU)VVJUiN1:g J-4{CдO hW<5i^i:&Nviv}qYA 1PƑդۓrrrmۻm[oVޭRJ'VVYʥJ%)ԩRrr97)rnRmR ((( ׶VzޝZ~kqea{o՝Oեݬ$60H[̏;"21¯ |*xctz]x?/SEEz:x?Mӭ<^WK-/A4L.y`SpYi˪fx y~0S2x9fm<-*С,.c7SbN8a[[ii6mkkmAomo,P1* 0ƫQF" ͜9Js9sr&ܥ)6ܥ&mmp *@((((((((((((((((((((((:Duv g"֥n_k@E_<#M-~'"O!jVj[YjFe? B Eb2|mF;)_O࿆ D moĞ7f᙮%Nf)-<X}"{Y^m69!iu|?@rjiRvv~%mzƱZݕh,K+CFȎ}MU5$ (a:N'}|߳jMN?OGjke&E>7sůZ_XW6 |>zoStյYĺkFu0Y[/@?<'k׭u:ihZċB4Ŧ0X]Y>>-|Vuk%PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ &/wӴxbS_6.*?G;:obW-uE7<)erxQc{F_JƷk^߈ ^OivaoiZ,-R5͋+GG 𧈵}-MS]:; iW6D̑,"J*( Ɇ)Sbz;O|P_5_<f|>ցN=b0gF|y⹴Fh ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@yk𭏄]O ivWv:^!}.ho>X2>!kF@ ϟ?i\\$~ >Q񖟥,v,mNW7v_~:&xOoM:4geZ!y|U;[|Coxvã6j#uw ?_N¾-Own🊴M][hg't~S?Eq^AḴ{YVDҡX' Ex_÷x|Y މG℆|BYBZ[}:(,-Ƨgx<*((+ (O.į-n$4|4O^x{i?>|VzVrž,xXhdw? ㋽GH|Wt\t"x\SƻIui{`G񵱘I \MQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<+5O/h~28hnJ7W~$w5[ @Awj5K+&XQXhsÚI|e4RWe4ngqkwU? ޾4D \xMЬ-(^Z5 nu eĤ]PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ ׈5 C{3^MkCໟwNg|L4_jm .}4˧AizJg}>K>|W__j6]!tV^IujxkN[R[Ԯl$/^'5O4-7hs POsM=rK-BKY-n!@޾cooҼ3s>hw?hh׫ew5_~?~^ьH5GziQUfYj~"Csi߈2%tyxƞ+,-'N\Fkkڎwr^g ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=W [;{{Cix^.X|'=Om֭HBf^ׁ4d7f,̺uSضm䵚b#g,LFʬ6,l+M>?&I[ZĐA+,\QFvbI_PP^1\W?U6k7ߏ>8?x|]ڞo~#QKUЯ<'5ޠ|DC߀y't? X*xG?|A⏍jRAna4Srm$mݒIjz$lBug t**J0Ns6B1NRcI6ΟNtcOմ=SJ,3SӮ>ymI Xucrm4MMhOT(JPe N3(E(M&i ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=W;/> f |Gi6|A:^ B~$~&}B8"ԥӌjBP<;OOx~ᖗx/bNZ= h[1" ;[;*{+%Ϋ; -2zu. QIAq7PKnI|75tw.m8oovB ;3w?:_bA/oGoľ//jk׺95x^qc}q.!D杧 yjvŸkME|5|Q{Vm㭦_zW5/1W^ ǧk6:Va}zzd^{V_AJ*SƬ\U]XҞ*]hգUbڥ/gTi*)~C:# UWOi畸o,u,qY:1nkG9N<o, 1J V dOW'guơ?MƖ|[{᎙Y݇=ix/]FW_;~/I_5]৆~,Im5OX"žo֏}-K_/=φ+~$g5:8nX~u]yr+* 8Ӫ8/o9SQYOR~LҞ?+X<ήmVuiC4Iks l>$Yx F>d?.4ڎiV/~qw[u խ=+? O|7MxXӵKA]6-oƾ,'VQgueaxݕ;{gXu )Qx58S-#RTpqie>I'Z^Fʢ>:<5, yS35upQ,\?vwjv_3/(RmW55Ob R'RBDnŌė YFB%kE-J;k-𞧣i}[K+_b赴qC90N?඙MO?wqO _t v֩ ;v˓/MQC[PJXx}BIBI/iJ=<40,8ΰ9^cCԌi{CZ+N*412yI:w¿M'^-oUO*g}ÙbRӚ-nQdKA= L>5~͖m'û/Zؼ?ᨵ@{E mͦ/It[R)tJӭ̎l!{ĝOLu7Pѵ>V5k3Uҵ;H/OMK[?P[[YeH. HfvS9ΤR:99NsnRܥ)6ۓmnb1ubUbq8+1^zu*֭ZRZR)rrmT<=E𧄴ޗcw^tMAth#E-t/K!O(ෆ8TsTmᖷswgCW<^i)/t;&d]A|[y^r'ɉ4 >MeH|dKAix 5z%tźo>7gR N]+Z]Qb{CΗwxYҼ?X='KY/淴\ FiIfK> nx5ץ(-III4OɓRJ3*J$:u#(N[pRTh H xW-'㔾1Ưfw<%/_%njc𖳫2wlˬ6'cVhGSmq7 lp86愔kuOh Q*F9xߕ뤓>|-/ǻ|\S^ѴI|+O xvn#?ĺƻqGxR[K?jB#N Q<'M's?xވ5^/|1X_?/:'-3DWu}"ڣO ʭ*[YF7:.Is'Z>ЍIJgJ08L;eَW<-!F0oN2UX1|y]6SKnW:o>%~!NxoIBԾ xT ֚ ~hw~'xօ*{.Mogh^ iGn־|=>>[ͫk u|mb vৰӼ῍.cF5v-L_4-&-4v>.Ep+fJj,*cJ3XiB' bThFNhGVU%|E ÌaiTTY:&QR>#W8TrT *έ(N8GsٷT3~ |MV5QW4=KM _-|iDHefش0'Rr9ԕ''kvg昬ML^&*:PRPR%ݒrKvվ#h>+ 3xV ־ɣz谝6K)b׵ =5'D{Ou^)m, O~ &6;~>y6}3{/W:tzE֥hzޗzuޡՒ"k%A{Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<+ϼu? ~+_Cb7zƥ|</Ou}O״8çZ͚tV9@)|iݷn56_)M*342Sxgzh^He5+%ŜHdz4h:?n]{Nմ.tVu;k=B΅E -6 (wկlKcӴ˥Dz=ί !]BK a&ٵ JCuohW)/cmR:Vy xRlu-D˯ĺW<1`-;ijxV?lnm, TayNQUҼҊi+Iuf|=\Uz8jiѣhÞY(B<Ӕai4(^i]f7 PI3\׆ gмIa|6YZTWkogyZũKggTvZ/<5{ѵ1}xKYkqiO{b5?Q[{?-sܑA1zIՓpjGf'(paFz5Ts)e$:Ra,?,A<Җ{}-ޥ{H$}d7W>_inLӼqR/!׼?Ck Z]W7f5Y3]l=\ZUmXލ^xzUxUai{kǺgƞ1xǞ0NO:I;De6^ *S6vL-t;yvJ(BU'A^Sat)4Jv]Y(Uףz؊Q4cV:q曌#9%)F*J/S2x/ jo?|K/%|4 n|>Iе(4IfqiiWr\$lwS;ljl/.|Ew',-?MF>7*N_r|(L8F|b8ny^y8ө𜳬K;cs =,,,:/~|i_= kiziZԾxO Sizz-I|;6{^ i{-|pky/!Ω`U%N}ףQa1Yvw,58.?+1|HϢk$%s+_ >'oJM_PU躿|i_xVgN֓)=s*aqX<]O0ͤ\e<yvCs1V2lC,+:H0~п >4kw5/ihAqxz]%|3|Swo|aB!Ӽo85eNAÉxk7gt,hTe95hn&^xH׼-axޙ`g|2=u~9>!cRik6? 9h~/>|YoVi^ZOtM\kZUͦ]F3[yl\{ž6GbU&.yƜqE<67/iM\#q8%̰9f؜?gVNqWSUVgV:B[^#>sCm%0_]){so= >+gzm⇋ux_P񍟊|?c66㯅~ oB/'#oo _Xx%3qyl <)̳.YVWα0x<ʶYbrr̗PsF[C&cv]BoʢWuLx#: k?%x?6Ҵm`Ե84|\oWQxMkRݤ>|lQgZ|5·]K_𗏇&˫EgxuKm.5Qg[i~sO2mG2ܫ6) fr+YF?h<ڬ^QO<,0Y]`̛6;g??߆Ce}/G>_]W_>.|@Y4[|wF;[3'yo^xF< }x/xBotK>1tzܚms-`{:qm_gsN\657;eaO |ii|1)5=yax<7_5s{ 62+]pڎ|_;dYc8¬&-u=aq>5Zs<σ^25ǀ<[.ze=c㯊~яß xޅ]SXye&h|{x,E.\=JxZ:&xNHQKV9Ӧӓ%?f/e,L%|PParTpS_T]|6/ RwUb#a0aakӥ*R{ѼiRx:90a~i -Q)4aú~-if{7QdNڸJq:}+Jl ^TXԧ*2jeS08nyN7#qcW/x#qp\=ia+ek*xgPmG- ƚ_!;ŏKx]GwxbOm'TIܷ?`ٿo]~?? ~?Q?c{?x>񏆴R𮕮O]|Kׇ%.:-n6C4| Z13(8uj aJ**;)dxG`meYc8zxT)c[0C>yx{Z<}mh:4׋|Aڷ||/ÿ׆|a+s, jZ?OƁ{5M*_xPc+MZXRjpJԪО250g[&|=h_XYR:%GgsǗ>ֵ:w!?^n#!X!CsYdcOz?aG u;B ,?;ߌ,˥Ec~w> ^&+tģ}I6V:鴝TaUAC FcN#O EUq OեN.-NtœjTJx8(v_,e\ ƴN4C$*m|Fk &7f\gb >3?qx_>~ɖ?ώ~!'_x;?~KC'Aj|i )%|g|zޡxlI/k_ JEyw!/O!Ѿ |Yo~U;ka~P|~/#>π5 _7Ԗ_|2t9oմ.m+U(f)8G1Tt)u kւCh:Չ^:Ŕ~hnl添6wC[&UW_?jA2~//Ȟ7{k{m+3}K4[ŞijYЭ4=Q_PӤ1G? gpX~|YbzrCꔳܗ<8eXZ5*8u9RxU|7!|D<)Env^/Mc7iow;z{kzo RI<=}6Qruv-~:h'<}^Í2|e_|0W<]W2uƟ>W>yø\"<7C&ܧ4|Jgg< i 1? [FE"<˛SG3n"uOVւOY ï6|s}kDBZūMfo>i#pNj-/Ӭa4;wT>)pUp>%g|+v3oü`e\\63\lļUNy)jɳjtfksU~&薾 񟎭RBa/W^7)}kj^K?9/ _kMԴm|9VW]7=kN|e~7x,~R^mmώxw'~:<3qŧ\k1]xs@5_'ÌE8p|H7KG>%>|3|4^)u ikZ5~?:'O>Űx&Cw+~ʟ],u=f=c'#xUѵ/.gxr]rJ@cǏ5w0e<7g uƷ q:Y6KθO:ϲ~Y%+[5 l)j#T?h.yptGeky]™tڭnt6ټs]xPX[K}XxAX_ -?'{O#Ǐ5>6G SjZ/rͯj _߂j]xZ^fxjRkĺߩȫ+ x}xJ[qpsɳˇws9W*o a O1 E:gm⿉_<3Iփ?9_ 1k%ѿ >Y7߇Eg~M gKh$>x.4j7;vhIS~4cĩN&oxh(Dd G,j Oh|N/浸GU<8X Vfo>◂¿p#_,Uͱ;M\;#g6߅𞲾 ~)[j$[xx74eĺ[3 ;';E W5%-N.F[%B*j֞m+EE (4((((((((((((((((((( Zo?DGWh_-j_P^]?s/nvrzo~Vhk_xZK*EY:ח Jo&P >!^{xCEZi`ƽ& ARӤtoRԮ/ⰴHQ>&h~*$]#:]=żOm2LeQ.Xz+8|R׾ Yq=^K$ZvR[4A'K+hɾ |3k{Z$;knnohHK.ak^~6-OZ>񖏣 :wÿxCӵd9|G{iV}s~02#}w@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhcH\+Fhx\ƿ1t'Ǎֵ Zy<Gn͸)ev?Ɩzމ~|qsQi:&ލ٭zFmxRS[s)4.x/4~ 4{K?ixwM YΒmyg,-iyſ-D')c_PP^)|'φ ,ke2६~/<7ּTm ZW=BIٵhqC@wϊ >|Omo,t 4DB5 +hZ奝٥햰_$&i`3Fdk__~|}t v7Wt ~zk~#/4ŕ4i:Wt}fMu,QY\$p@=Ba+{xb8`(a$ QF#4UHETDPTQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<+ƾ0xG[ƛmZ9O&EC?Xԭ@մ*~,ż'̋Wd6ڌ"w []kᧁ4;ּ?h>8͠t,|2|)>kIxK|;?g.xNT𾯨z5+H'o&M({f($TQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<+>:Y>xKWzEx|CM2zvYyx[I sAwjht4]Yq8:M"Bbs_΃o zֻZj) Sf8!JfW5o)It*;)7SIlK0hukbq,hCP{_PP^kG_LJ xE5]K7ÝWMuK}?47ƺًHmm& ާoseI(U!qSi5iDu`bԱU,4B5FPIs3.)>6N|QU௎e㯀_W$|R_/7-Ν [u _> 0j?۶CI[%蟵ſƞ8ţxj⇉~%w?fMĞzF/wh Ϋ+] /h'3JB8$3jC5TF#ZZ3hTXx7 O*|)K.f>/,*gXUX9,&?W PqD?m' 3kE x?Dn+d*6ZV 9̺>xWmsz/t-n-G u?'4φ8|am'M5y2V֯iki5{\ӼQ'šVүln4߽7VҍZ*RiNw|eBNr9GJo¸w-Z8̳ )\®# L,z_YVba<$+SYQT*|A:?( 5χ>_<72W[|<Te)5_On'in>5漿ѭ'Ui'_¿/ T񎓤Oӛ^o:[xGVԼ) ֵkdS  V?lkKJ5U^SUV?a\8fhS>xS¬5*+y3ѝnj:xe*%)ΒiVfcz7?>k??e.嗌?*~2-OM> :ťv^ѵj .+Wg>!x? 2x[XO!ke/&]x^h'\+Gƭooh>%㸃Zw%Qes1XIZ4O4)aqO FQѨdӢ.Cxp>& !'RӧNyǴBlҔgÛ/K8[YhT*eAվ0঻#ueuM yo:}+q[]_߁zޛte4:ՅTi oUKW8⿈> eoæ3cǞ6lll<x;57b:/o񾽢x7X}?Q/5 ~Kg^0[B:xL񿆴oh־#4]İ@詬/ǺcPӼCizjUTtfR4Jm6❓lXz8M-GW NHQ 8ɨϞ9%u(%9ߋ1> wZG+ wzv01ӬtUࠚOxFoO~ b񅶕Bm?W>( 7x;|Gȼcm_ŖfktN[ӷMxgu 70eƹfIr.gb?B|,qY~aV.no ڸ|^zyF!oҞϊxo׉_ < xN65DuwƺNF|kOEMc~ю5I-_G~|h_ÿ¯ x4hv>5f뿈u?VǷZ?'QL5^$VVaf~0Êx WY2]Yo^GŚFm Y٦!&a\6$~o":OM3^"4[ %ΡBU,~'xLenI_ĝ|C#Ė<)]ij PcJݕ`[m:]:RH,.?1Ng-xo ȸX8o O&|F%SWbùUZ,D\倢r|I_o4;5Zn xOAM/QO5ޣjϧʺSş_~xTo{!m ?O7xJ.<7_.i+wv:ԴWH_O2\'q=,چj/ɸg2f 4C!Y'"<6+s1y/ xlv0Xl50ǼFTCV:V4ӣ͍$㹛JMHl[;iKq|KLOŏ|5]g|1wxGU=vþox?ƍOK<1qyoĚ˯x_~i~S=qI˱QpgrZM\vc 83eT0˥`s8JV߳w߈5'}k?o!x~|;O/%C=k>-nwūkSoiz^m/cúM״5gMYGдgV-7LS+{X%CpYcp3sE239YS:˰xm2 rƶ'*գeipXySA_ |ožվ(kЬOxn/K;YMks+ox^&)/B~xzrh-j 5[=#S` wW?m}qĺfe [3 ~'Xg YSJt3<XJa)c3:T'YE%CWlupzR5?OWό¯|5i3M5wexǽ6:> KǪixCBCe.X|J ⶇ  =]-[xğM>O"UԴ[^\2EnbSӡsigYLYGacxϳ &sÔc<#0<5\=UXa $1_|c:o+ž /sṼHjuoi^#5-5Ym&a9g~zo#?xJ𶘚/_~ ]|H^1z1h+_A>ZY,Mam^<7yC[Cļ3|&eYqD"2Y~7aOx2\Ln69īB9gdtJ_ 9bC|;g>#xSF 躞*^B~j|Ew̳i~ou6[[C0[EslE=KO|\٪|*/Xn>5_h7A ϊm|Ux Mj |MmxKOC7b7}r\e,0]+bٕ b9_&oVf#281~~n4{:OM7o;Jw ;Sg&x-+ַ+,Yh H|G]vmncTl>/?ϊKJGaGpxw}'֧д xVK}^ AjF3,8)džx_xk\F_,pq_Y]V n(eHP1ׯ~ǿ2|]'9&}?Kc~ߴG |q=+㟃[iSxᇀtO j:^ZkVZ>"|@sk.<[s[x#4O xN(ok_xZﴧ[K״cM_Dsx })'[\%&]9^ 96kΦ.Wec_5Yi^yX _u->&x/Nƒ 75׊4YO5Eosꗶ':ﴥJ[ږmeU8 cY=xlelV: uj'ѡ9mS%FM0 +((((((((((((((((((((( Zo?DGWh_-j_P^AWϋZ6m/x2ڟ^3ּ]軶O=A?RqI tC; ǃZ߇t\Ki>K;}ők35ޤ-sU[Ӽ?Jt6^25싺K#_]I=Ɏ4;E\( (h??:]g^eKO-'VYmg?|%Gk_~:_ٵf#>.׼Gix[Z-?~P<77f '<O4oM/~[࿊Z/Gw"Uk x~GAL[SڬwuO}q*{o**p,Dk{(( wtR̜\AMc)d_O8_OC$,^ޖ{ Ɲ7>YJyfύ-KԼKx@׼x+kEx?7(h~ >8ԣ:zɭ'?bo|L 3x+7tOZ{]*^!??'Z|IkZ Lԭ/5xJ4;Y5UXB\qXin>0USF1pEl1z!8)iT *k3RמsJ:^,d0pV߈%.|Q??eY:ؾ g߅_ xSǞ)[yH/l='Wo9C=Ω˨񮻭xjK6/eo?9x V+WVW◂~~ ѴVz,=u_$Mֽx_:N*xu|'X9fi:%JL\+9P%NTjLEXNUTXx٩]N,*ff{̪bqEJ[C [Wz+cbg[]bq+tzOy_R3|_ L;XΏsg=KPOM7D|6G|s c^OE +n}ۿ?ieWؼ'rFjB]:rQNPa}8*P359MB (FcqtX|6x\-L*!WUa(ɥUG + >MN"(i׭^uЌpǦ%hX81IiRF“[ѣ$AE2C-|]eǺZ%Ԧ{KQ=11Ĝ=ĸ_m2 |LXe8>>Sa+{L<}&':PI#oك!3|Qu_>x_E^gĺ74è|?-ZhV6(Cihr^髩 NS|S>'x(Y^"-[ #jWo#[sgƞ'n2xT>i6t7M+1 ˸ MGW.mYⱘ0ӈifxl~Qb<x"l8:9Pu>M?%+gMZ[]7Oƥ.f4旾 𮝾^KRqk_1Ej~<MBZC{w=ڣFm~A$ ϲ&N'ga[C<-CpmXfr40XZ0؜.Ǭ BAz1j S'g7wTҼEeᏉ? + [PxkWᆭ:_%,RkG]/5|x^ńiZo> Njj>?owQ~З7%޻k]ƾӧKˆx8_*~Q>(ƙ'pq.8ɿ8,2^-W863blY# Cş|g|3/?>+᷅/]KF|?G=J-NU/ZO 3GIlMPx^7-x%JKH .Y4oտa׆$n4 w Ւ/Q qMlǀf|sfFmٗf|/p>SC!dE (a3LO<,3ph3f5 OGÞ5gӵ ෎|cXkk^6Ttk5 N⫿Z8|qv/4Bߴ 3ÚtX4mN /.e%ռYZǀ }}֏a?5z ?KF[]ޭ-/͎>/ 6yœ?cxJ^ψ9]bc28ؕ{:XaܘʑX>|='[vmcO^ix~(}oK◌׼Au 2TЬ| ~;hWO;<8B?KzCxբmi4^|;kcၡT;X>Lx_y?<+2̇x qb+?q&USKeEŽ#'X:~až1ax--ŗ_C>$B;7~ӥ[?ꘊ ~#%`-|FqV:AB_>8Qgďx$G mXG+<;^_o_xG6mh$S.+9g~,|r-' xǀ|]\@i!5i{i'lfw3q]RGm<ԥTn%4PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ ;oB-?ß'xOVâZmɊK"ZiiMӦO|GΡߏ~xrP~, YxQ.xoú u ip/Uu&k+ai Ou{۝7I-#Q冝{{i0jͭiCRƖVRZ֑s4O}?hoB4υi>O߅5{DQa:OID t?\:U:hVW[- _0E7Kϰj'C|aMlM߄m/&;EdԒJ\^2vw|(宇mwغż_j//gC 4|Nczgx~☵OR wG; iϭsD)? -? z}S WƝ*T& &)Ѕ QtNU?dOTGYKV2K9VYgr=Lέj5x҃pf N -35gվ"/XW3Z $WuS5Û?hj,j0xL[\7_FN_5.KC;7on-ϋe𭬣=7w:Ǐ|5 I:߁Fy᫿xj|EZ:,,d炩URY9brԩVP{:su#Z&]904,,5l~jUWV-`py\ɍB#,u!L-ibԾ/.imsᆃ>5'ď?_R_Ë~$'7syw9OGylԴxnQb=)~'i_ M{B6jZ4Qb_RIa\V*rsUZOE9E]1d01\sWdʅENX nakN:q)ɸCV\ߠsT X9?Q4Bž#ZC֮|%xdwxwĺ%26+|k:msj'mV[mwVүwmAS:-~|'K i7pt<_D((((((((((((((((((((((((((((( Zo?DGWh_-j_P\|7c/ xZpi'5M{ !=Zkl丂Rݠy"Y!ABx,>7ύ|)GF}OIqۭ2DS> 9Wӯ[])tndi=/K+V\ R=.GR5/b4HcȺvah KҾ/_Gƭ6~"!"|WӾ iogMt99Y'9r9I?b!WS4TjiP؜LҊP8F&\֭)ԕOiw&j:^cxpxz_%ݥp\kշ xZ SSkAcEt>Ek? >2Js+i'4;ؼ1O!g}/_:voA]i_Zb" "wǞ/oOAO'!Nž> X\gUk{ e<4@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<+?ڷW|9M{_xroxZ_ zٰдgڮkڵZ_BKO qI? xY_l-Z់SmlmbҠ"5;YfWVD[r$5~{?i 𥏋WRM{ojyAaztHO6es"GIQCM}A@WQ|_oO.1u|Fs]bW[ x_F*)fZ5ލsu[kɬ5)cVRaRTRJJI;Ӳi,ݙՂGWIWJ*U(BjB2NP&&dkF|-I? =~~>;|Y6B|o|0Mtω'|Yi6273ũQm71k^>-`о&,|w7Cx㏈?gO .~.i[_:ǭe<+EiwZ?N ? zg|wYGi<1e&o&INxfa_|Yszč>~J\rɩ MO/ƏxCF麭=]ޥ>ou{io|Y~%?χ> G_? eOt־x[nn_|O?>%x6nĞ}{HSim5gCQ[(R"uS51 NY>II+NJQ)*!U]ʏ6YUp<&WҶe)Y=egJWapbX:>=z?> |I| -/|I֣c#z-_US)_f.AQq<Ϡ[ 헮[]7eo٫7'[мCF7]JӾ6x{Pc7>_:~hmɤs{9SQ:p?\}ib\9eRMSCvX<X߉*g~H+k?f:Ż ⷅ:?Ot]+:jxǃ|_5 Ia76<:ׁ}C@!ԣJbjTӧNU5^iUN :QPHNU`'p8G\+L&F8Xf\¦7/ዖ#EQ*cpyv|3q;KxOuKh|9fokuH[#Z_kw|N:!lltΝms^%k|Xb/^0gi /OCnx|]qjWzE֓/ Q*U*jjaqUR8* MhT.4kN^tG{3 BX8dy?Vg*x:|*<#Nx_%ߵ9.kU{tV~2k>/Z\K|#ᡆu97 xJ֖Oѧ 7,EW L)TT-Vg):~e>ɰ4\}J'C1r¢y6Ks؉V1obdc0مJ'G?W_K/>1|(,? |s? cRtG]s߃i Ǿ&Z|qx[QV5>^0 ?L.6JI/ߎ?l]^]4¾s?W@Vp?߈t馹|=?> W^5K}/0MO(VIWceV4b IЄ]j/<)5#(ʕiB,3oPĬM\< NYdP<<8CЃ⣙(}w0ZTTӫTCNpdi^&$Mx寉|coze_X֗;xf=OǞibG˕=ŧ'{i|F ?i?6uOKoocFGkGۏ .mi<_Yg_ͧj!XiaEUl$hVф'1R8L եVpcUsAӜ>M !f+x_o sxUOׅ51S|/ً_7}8|&&xkL~|Q~f/k\Ն_]BKi<7yoeicὧ!J |F#Z,2Fx9Ч<[Zq*Qjw . gyX 6cxlۇ3FOO2qk^(lcy$u[Pe2zֱpK%_4vTFNh9VRN2ZGrj⛒e9^&+,˱K+ePYzU^eiQKQB"ЄC J Ս*5kjT/Aۭ|A^?? o>'xkģ5b [RI>qQzi/N^ w-5ۍKֈz~ÿnWLw¾,զkZ'ڶ;x "+{  oyw`/w;MxW~vO C:3j C>"ԭK^$maܯNiN8IBQqыi^Iwg百+ +bpxha0!P 4ahҪ*-ӏ iH߻Y.b巚8dMU ,ʂ@ك|M_޹k>>޵oEizfk"׵ =IRi;Ϋ7'?@MO=;~};H>O._I5+ cZ$tC]JKo7L񷆯?k+_G?9xw{?5ς_ 5._E _Ǧ?S@=&]4K+˻;*Ͳ.'+eȸxGw!xWl<,Zt5J,W6|,a3,$rL~9O+ ??^]~'K&W?~_+<ҖLg Q?>ö2uiɬZ^U~;]xDO)\~Z햙uuQYg_> ^&(NoKDing_76YW Sď x(,߇+p*k [e|}q:GO:x{x5="|=KVԗuψZ$.hu}2$i#gk3<*/Qe>YW fX̂sO"Eapg3&ٿƂx7:(.b_pMu-S._ߍ^"xB i.|?տho_!e_ "?>[|dl?H>!^kυC%qxWse_ط3χm4cI1<?x7yvCO־;6x'6r\üGָ/> |.o/xO]*ž'֭-W5jrGkk^ԵJo6hQ@_ 㟆 AŇN6A3/Yh'<{ Kk6[m3_~ u ퟋ5kZ;5a{猵xCJҭx7tO?AUCgW֟Smk IP1ܹgG߬O iRRJ1F-B1{a߈ΫIVi擧_!1TV*\jQCVGJy~ R(ӧRAQ4eR/ًIw>WÚcxND?u K{ s+߲M?] 5=?[5_|Z=ηMkqr/>8߈~-~zƟ{]K“Z/."F\2,B\-5_PJ9ra:R䍹*4c[5rrL,(k >]J J|)C·[z%ljגCc?g Mko 61ok4U|kn5]?O7|W{5x:J𮭣w6rS2ǩN`jK4sNucISSJZUik!5Kxo➊>9tuw|H iYB𯋴X|?ss5ކ}әO ~?|+En4701H54Kk? 9kZ~O<3@e&}.'mft3e՟}5EYZ*񸚎Yҩ.J)rJqU:PXx/S(4F'sT_ c8U_e^4*t+.B9E =6 ,TJ(hs>/GgxHރ{?YTcR A;`gǃeG%9HZ26_W2Ӿ!x7K7<;xBx?Zׄ{-DcYŇocvKN$:*@:ίekEΗ.!rԌpXGQ)%5ASS ugR'aVeNu*kgO$ьӆ զ:,W+{Lf ^ux_:W"anOv_x~7 O[n/mtiisðȡtzM/^iNx7ß<x_ x@ռ/M6+KJC,gu;8=O$/Y֗PN*1ج5n]cu:U,V1zxUUSNtSJirԄXy¯ٿ??w4]Z_/Gl i)o>8oiRiMӴ:W_ ?c߂mԼyk="Soņɩj>e׆z4>$])#T4{>?B5.wo{x|5ezRxdQl>0~aJE 8~xOTY]\:) 0ÆoAuo/T$A{3+7< u~:}/K3[/x~o,KӬ7_ >xVguS_u@o-u[OU¾ 5 Ku-OQԵ=/4mCQy%n 2*|-cGœ%Sj9~Qp+*2'lK3a_500~~̟>k7炴_qwcq'W<']w>s߈5?~jxltO hM ?ˍTrgx3׆|gcZּ n>4nt&\躟<c-|%QB_+4/<'&hV>euK̲USy>opWSgSrl3yqQ|Ym_7cx글 o CxzS—7-[oG/xĖZMoBNc)5O[SBZm#_ xM>&iAcFy& _M~MS| 47-qF j-\Zn!7V>#լx5 |мCyNwL}☬t=c[/EKvھZ5O$:~E~|O7^B'yɾxH񅮚Uo,!7(8]0>TD8+.)xl\c,5hVoI.nY[U+>~A߳7/? hW9|)ſWco{q6f>2kZv>hdeRGQ|^q~8u'UοԶ].M;n7 >+Yݧi|'.jgyeȺm|sٓ㇄__'K|:T<~/¶ 7j/!WËO:+?/ 6O/m3OПľTԫᤰ4l>&*bbׅ5 n4[Xrj'M8r|gV +Jx:bR,5 J8| ) PyWå0AφM3njiY5x[&&3Z=m6?~,kui6 _t+ 'oȼgKm]kȼM_&%_῁bjߵ?>_ o>' ~ wZgn<_ci:>xb x u-^$Qa/g,=o,d:zQZ&5S%9άVnX8VVSVUK1O S2E,5,,(3j9,RЭWrRJuO$ǍoV?l 7GcKG-7|UM wl5>=+k? 4?z3Zխ^-KZ[~Y_j_M fy?'uZN:拫Mi't:to/kOQ?Sn¼5IeᧉS/hfF<>uRGjj x'Cx$/ĽZ/ÑJXL/f.peFUs:" 9{˰,Fa:ezg8i-t'1~xfG_O#:sZƳNǞ&KiگuLCmkxd_kk~(;$h7^/t,3׾83𗃡DN.{4 S]wHTmoxƌaSNP_V*T/G |.tXZ4u׵TkOߒ9Oٝ,VUB qtq`e,σiTy &ur&gs:KOZqWQF/|a|VI{`}©9ை?O }xľ!|3ď? ^}5ږiG1cHx35~е?#ÿ6+ P5}+=^h:j ԴXWsptpXa別NXz1ҝMʂyεlb)bTp򤬪$'Wa7jXZXs <,U_f3U0t.;{~Ծ(x?7 xwmx/A'N݋r⏌'x7gEqZ ż''B.O֡Vc l*050҆+Kh^.⏆ߴ* _?i5g>$X։Gi 5kȼ-Z:G|Eu>-8O虶vO7ß |'5DC:5O<}/=oKo|9⏇vG^Ѵ|AW{xCo NN|ө}N' V?cVqjhµXӬNGFx)丼n_ˉ).;{1>#'J3 u,.>2qaƟ?6K?^Icėլs~] Ķ%g񭶙3ƞ fyr_"~<3C_gm6V{^l~%L5sǿ#1|E>0Ov_~k>+;kok>uM.L]sxt\4zʌ, 8:ULSQJu)RŬCuIJu)<=JI5?+ɡTa8Z3Ҏc2gp˩uYS32׫ְO+`c G?<7V|L>2'_[#hZ֏O/|!o JG hu_j(o Ϯw KGM> _ '%;C_1o8AxXk0Hx]~-% SAQҵ{ψ=JڮqQVQQf8zύ\kr2?Q/`o7_؏⟈OZ}RxI]_J}$YK|_n+k[Q|E-s?7i%ğ}2_ X8:FR-㿇IDjuaԎ"ƍцF8aV+UxUc0C)ʡ$تYWUxʎ[Rf2,,0QjSĸJ:TqQ|YWNFd_[Ⴗ;il?sF,ڶ.y~lN'kD=3Y41?{IKӫh:&o-64Z,g晭VMxxZuy\W$# ^Yg<1f5))N_aOB|ʒ-uO_Mkco;o/|l!}o^9[guHڧ|5 }9&> =U)t-jmS~9I.m>' M_ |7}hn< 4orNut{d4n4bmrڥYm/^/U^qq*ZxUUZTS̩Tjר<553)ѭUhgTSJyH'NU\%>O(*; g'aཏf[|1qu<  <+4s4i,NZA߁os|-Ҿ\iw? ߇gq_Heӧ%.$ҚB^X݉5_ZwUw-.OzG5l9,jitYԫ,-|ZX>~?uUkc~~>?\ൃCmΝk࿱ZdojwpBMuq-gُƞ|5xz GτzxTS@ei.:UݻK۹um6 6g903ͩ,k28rSĺSw{?etS<έydiCx R\/j5RoQ[3uhyYFU1WxVӞ}Ÿ>x֣>x3.u3|.xw֨uX:tWVS7:do 0'+¿ uxվxsǃ?ZZ3FzUr\钭,n2\ؼTxjsb*iÈW-Y^Fu8k|0E[|'q?{_<[i}57iD2HLRGfpؓQ+~͟ W+kZuo <)h붫g~ ^ۛ.`&1MvSj*|Me bVSՒN.NW7Jn%'~of8c3L?C1ڑqgʪl-LyVOVT soGo_ CVYÿG槠kJtsVKq1'ٿw|U~ cw!W^ys:f1Ui\f?)OTu)aq5a)JdgOZ?'q|#ax]5nN[z^]ߋ['6 kXsᗀ5o5Ox¾|sJf2j1д j2Է.geiW\V&* *XKU)USp[YZq|Eَ#gpͫ)zouOZ|Qk:fMwz4/nx]|9IzSNj}SÿOh0|LD7W厃p&1 & iˉ=mq◊;FH|'t+KtF.,[9R9q$gImb( Ɇ"xGב7Kt"Mz]s_Zic(x6]∬Fid1^!_7 Vzx̳ yQb2Sn9<{ Y|'>5ktᇄ |\~&Ï8o}}^㷂I^2ƫÚͩCV^+vh|[~*|gïxYi|I}[]^2=?j|3G<23!^𮍮\EoiQE {,>Qr lKg9r_ Fޭk+V5K52湹WH-m- Hy6K[~O q 𭝟~ר\Zqsf_[U Kq5#F?kZt8ǞHS86?|"oSV~Mjpj"~;^)=etOiZ&hZ.xa]RI!㖋A~_ I]in c|o>Z 3[̒{Ř<9LVC*3ʼ;J{iG XSk68N gYN_rV?.cs  :eC|'|}sO~|@_|C֡xP厙ãxºfi.Ə}S𶯦kƛ]i&K>>5 -i"O.ZRӼ~")[TtGt{ RX^iWvRq'&o\IcCpULf6,<̯ aapѯcpغx#*{kӈuU^;[9tki^c6k{9\n. ,E*#ʁg4x7JD4m#DZڦķRi5 FP.y~ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@|M.<=tK+APSE摨ۍgIy|G Nᵽ!olnn#RV'~|GB|!| aΑ{Xiͤk"/,{YQvր|@xow'u)\o>$oX/|?qswS '$/Eyj0SNբtWm#o?_7Aӡ*k6zՏoxgHOYV^"Fox^(A~QCl3s,&θ!ȳ?Ys158c3LJr \3~\G?m!S}o_Juς( ELVZLx:බҼQ|+&mmf_ᯆutž2uj36ek}ymi6w3\\~d>CŞ!gno8n*.\5g9;qM<߉.5+q6:y6xUy~|tq*5$~x| ?>Ԧ<M7;+XЮot}Z;)OiN42(/Ol'Z[]E,)WPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(wĿ |$voOtfyvZm5{.Ib4k,?m&7670RMÚgA>6|)i_Ygm-ci\G6jڶiKIdI"'i"FHHLfXY1C dbXG\1+&k-訑F$K}{h;(Y![m+/,t`5/ᾅc~j.7 Э. nOtK^[Ҡ+I -fvSB|ѭUVTN:JjUe U%& 49hkr|#ƿ Uѣ6z;o]7_.UBNo4}cK߇/vоx><_5-^kڰ!|c_k-z7oCPk|>)Xn+0>8<_XWcqyS 5**e15d| ?= >xV~/XVoi>=~"x;R|E\]i=Ɲ- C-.,c e/ i^>$i^!/Ėw/zmO>xW?dDLouk|%|Y[iiڿ|=y x \f_E7qx*, g8g7'ʲʟU7(/U_aFUu[MWe2~ h'E׎|+c?Gqq'$-_B). +-O |PbS|;OvomWQsᏌcmXk6 OKtAxrDQ$:tvud/(ܣ,dkY3V; p XgR S,5l$>$_j5xwffHuv]*mOPapNvKk-fwsSsxR}ᨼ").|Y#?Ў=Ʊjqkb{>鍼zpܒ7MW\΁ ޱ~x|_LwM>lw-H`oچ( }A@V%pjҪ._Cs2Hƥ, -сGGwX-YEۯ7ۿ>-[O o<*}Xݵh6ѱ:HXg݋\=L.oYULO9<_xC^e '[nUi<_5λoF[ .O~&!$g#$ _c_C!6_ۘN~~wn.3|MmT7>Gþ uj oIkZݔsX _.k9RU)cqac3(5qLp:R MHQM Z߀~"_7N |y/Ҽ+ [+ZW= R<1g-cZx'Μw Wsi#W=SūC)^S>_xǰ1<7 z'1> kEsHcMt;b'^.ʲ kxsW?׌UOP45XH>xro)'t\F-_]k~|i:%Ck16W"_kö /N̲> @ygcr6\+ü3o?8dEYm3l'|;aq9o(a(`@o7?[N]SPmSQ5ml\Z'usĖtoxUBtUl'~x>7iOx <_ hz~jkw u;.;.6A^h^om*α8((((((((((((((((((((((((((((:Duv g"֥n_k@E~, %="A^k2_WͫxR|)}2|O'/6IuuOQRG/\M\| tո}jM;Vͦ7VZmղh_gcw|`~ƿ~1k7|[i߳ơ|Og ׍t%V~#|eX{:m'ľ2hMTW' -n!ȸW' Ni2ɳHx.&4s\<':jq8<_1Xlۆr.cco>-O>^ y㿊$io/Z޺f~2|GOZoK{ee5},3[_{ox-mk_ 5-NF5Xv'|c|n1\xw57ni6'pGqNf\GÙ-\̏[eF/V7/;8ʱywוZyv/)gY0kSL+ذx1|K~ǭ,nj,4+PՐx{~ڧ6Ӡ72^}_4-RX۸Mc[⏎|Sg)+< |IY,toxoW<7 V־8>ݭxúm֯Cn+qW>aW"­gF׎~x|Cڤk^#Ե=f+(t'Ŀ z Om1fXl,fw\/S%|ayX$q8l4qW3N\ K.((\rse 5x/?4k])<(VOCծPSx/,ͩBK/y/f6W^x'J4+ԭF7Bk:3FVd$ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=W|U!֍[x 6GúW~!|:.㲻PO컻ԬoxC(>Ϣ7cCRxo4Kᵯ|)yk76wL'Fծou -Mf0vcIk׼+_x3> m|3X_yb,XHaA1[@[-QH(( ķMZ%hMh~eTA8K-I bi"#k莗 ]k@tP|mSO?ď>+EBoDcx*>A_~%[7oݮ A=ל2k:_uo|[|EW %8M^5;n8Ӯ<"So٣xLBcWZtm#:D~' SGRt]W=M@em&Qp_G?6M6?Ǚf/"pAM)a HzMi~xJTǩ/gMm|eK?Tv?=ui"`jkЏͰÞ(쫡~?G>|h_^~o/iC{H"t>%|oͤOwWYk?PmÞ",|L* pdC),%-,|:g5K2ͫ3̫eܷ˞/E.w{كyt.oe(Cy|S7σ^NfG‰}57w ,jr]]FXI^*mqF_T1x?3*`Ĵ [ xΖ3"3~ ʨp09 VKܙnDpщ#cheM-CiV֥74 hnln7Ӵ+YΥz4ՃLoAK}i]|kii+uEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(i -Oo9*z׉tj-:.ܘ,^/HEAwP:hn(kI O|aa c>3+亟'Ea! F,#I&LWo/ y}෌5_+?uU8o/ 6g ˉf/y&k8(P[C,\Y0PY0ɝwQ'Ey~m澾oٿ&|'g5C֯7;iq|26sw|;'H^ G& `)բ2&5t#G9ʥ0rb!0 .V1砧l;U{|I?hi)9|?>3x>'zׇc㯇_Ŗ OC-kxJl/olmDؿ?_=hχzT^ 4wxž2g?ƞ|/~#'qxc|k5ំ2xs^oyixGNZ +9e~cY8LƧly&VdsN 쟇ZYvU[-z1ٮ'G0gC^? S) Y'?υýzmsd:DQᆸNnXx0sS"Vt>P|KΈ }O`px,N.p)JNտ9wt ?|cG>&Gk3^tu bKԯխ!W{៉~6~«?jZ&Sׇ~>5zDީៈ:| k[= I&I9/xG axgM<182l_G(\%8x2>Q幍X`c38k˾P=d_b6RC. z f x[mAii ˣ?{Zo3T[=.!Y,3y,92gE)ƑۏxIoiaT'Fkk>Aux_jY%$ks}aeinioaİYZB CEj*r+&뺌e.+讒/37P|U\wo"yaאַ`Ik tBU>s|]pћo/xķM:>|Co4֛q#o ;g8kgf\7qXqm,Ë2|6g_9Aʸ,b񘪏pbjץkR׬gei xnCgne_Aj^\ax`I~$~.x❏/ |/OIҴ_Xcx^],ŭxßu\7u DOeW3w1q8Eq_s,̲Qg'/,ƿ<9ٶ-WQԾwG ]>..f/t߃?mco ~%>:|SIa^.$Z]6;? x3obY=wW7<'{"efOdx>+1>A yOs{DŽ*fY&6*qE.8 xjyoBU,zv Ƒ\5>}t[[ҥ\^i: G"uV>ĭg7D῅~-?t iV^8񭽆_njixZ* [OukO hΚMz=Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh}?xSZ^/-Uso i<}kP]gG^%jZcYj& ;ZǒLD/oDž~c+xš;Yv#kP?ej^^oO(4'^#m㿆ejz-dž/z"iQKs,~"晩Wt.K ĩdx&_X~0x:ib)+¥l<5ZeNT4FN3j-> g:-k"F |, ⷋ<+ΉZD,Kϊ]MYjej>??|x &x>4^#Kۍ3ú? "xF|To!_Nƍ:@VgmO[xlͨI}g1>αe*q%n2\Sdxx*٦Ggx,/ WR̸yn vpï^ W? /Wş|-炢լcg۽BFxĺ.x_Seks%޲iM?/ [~:|߁!>l3=^(cR:Gu|'>/j.4D@:V&'832szQ<wg40YK4872bp}G19>oқr`W*`G:Z|1|C4_ Kuſ؃7k MWAw-{Ώk7Fh[]xÚF|Sqyg+7<3PDߵ߂(t]Ӽ|i:_m%񦕦ZP𿿖n4Sü[d* T8b8ʇ 0N}9rpf9Ok_Wqyv&;Î7ڳV>x῏<Cg?o]#H=`N6NSG~wU՛?woep'׾ ?) goxxPo2nbke\>*_h~0uȵSK^%o} x*yX8C\_|19' K2o<< U~0\o aqn/<l#.Qs\.qNL_;|j<4]cae;ƖnŷlK:O GOu;]?S5;sjuvVzOt| WI{o?=4=;|7tKRůx{MxK}z͵h -y3/ Nq"qn#8bl0Ͳχd8e2VUv'2L>L V|FI|4|+^# h-u|-=ZnuX:d:}49[KILHޗ_x?4bX`u]%C N4iƝ TpTa)>F9NMMQ^PQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<+O x[i|H"[bmox¶77LseiaT,յ^&WĿ |}"Ttt])1&B8"@kk χenHȉɚ5#4;EӬ4&NK{ ;O `00BhUP (Kvjh~c2ϧ4c+u"O}u6p\G\k]m@U࿀:xb_bpti)uL74-=]hӥ}gp_!y!nYf_T=DR-s^ռ(k\YMk<#EխSTw}Vk3%x&|Sd|AKpx|ǂ/9ѭKK3xWXӄe|T7bjU / ~|! 4zhoKGcFDK4.<ǿIpZOxu<9s]kau4Ic1~ ,O[WZ*|O|QZoOeǍe˨x<ĶV6VVvc|b}|f";!,njT< fxBHCC WaY>bqAGGt Bt$ό_f񝝔Zeq~4]*toK`I4n߳M7α<1jg-wS(xMh|a|`'uow5FAǍFFFdu:/qZrOqDja8O0X5\=|6_ a0 GajQGÿO :/¸ g~ͧS7> V?"Lv7&?׮b|Mwyon,'0DSV--wW xSֵmCğ~33ZEͅ惭Y|d' WxjKe𦩤x­af<;q-AqoOjb. <#L*XJyVC&K[QCٍ %96*MR~ QW]+RҼk|E?x●/,?jҴ]7ÿmowcH|c=2O1{dVv&3#v~+D[/_~| ƚ?< xKKҿgy0>:p ɪU 6/ocgO80./_G<1+Dv'k瀾XznAֹn#zbЧ0][>&R 'S?V>>|!ďO-?|f]վ0 %|Hѿd$Ak:ݦZn'uV߆8 8g3^pψJEr2c,'Ef>axc:Χ9+wʰ6 `?{oԼ7k Pj~<㩮ŏO$_:l!:oڼhbL- isImԥgf8|Ok^.JSMCPWEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(!meе?KhO G"90tߋK = 2 o:[5=oj_d=u4)t\ w%ME7O햗h6V:-mŦXvptEFWH : (~O|}_WiAO:֬g^;i gJЬ&4&+gQ%uJGtof5^JΡ^ZG5Q>|>#^ B+N :֫% ThѧTVN#)MF)Mx Ć]Gƞ׬5ϛYxR36Zk]}(5M9G$O Pl%tv~1J餅,:&kYHgGkp0#o^phbiO0-O0c\yMK5#-50l[e:l2Gn  xBmv<[߆7k_Yzfu=2Pl%eSxp?CYă983Gax]_*ᗙr0+.'t-b0}S V mK|➥ yq!x^~}kXnaeq1>5њgi3~'GC/_]eXVi6sj:^ig5;頲 dx0]Tfp~.UUFUbiqSy`%rѤqXd<4(Sa7IHZޑ TsVzҵ8GԾ4a-bOYc-\x6# Zx|^OΆ"J5ԃ*Nqo FJi(@((((((((((((((((((((((((((( Zo?DGWh_-j_P_7|yFxg\49⹼2]Mb:PoxCd}6(vVHYƿ4}>yy_ [hBxRҼ3pjuxS'or W-m=_ |;?f-nĞ5&c}iZjve esA -ex2Jvھ+&2XߤF3ʼO\>wo?g^x'=CX,Waol>?h2#ZFovKzwjeKkK]fas,ixcZ::sq炿%HJ v> w]O |#u.?0aּk?/x=)5_?K4[suG/>{/_ΫweOkZÏ O?C\xI᛿ sX~4/+q-^%˱~!VeEq3|O,.OyVU52TK4]zT >!G5&u㯀4!i~ XZּHxv 7WbGK~^|x roŨxv?Ou2ŦV|04ccK\}e$nep|>C0.nNd,05|7y3^I,u CϏ>-5?[F-1J/|}|[CU~^_tH}Bx4x'$O㣤Y6si߃tW᷈[؛u?xǿ txs]o5>.~z.mk0OiO >MH__CE3Xãiޞxʸd5(gyψ^8VCOe6qxx,4rÉ19w;lu<]lEOhx3e? SKsh~%i]O~6hrYkqFmDK'&ݥ }6VCT|խ|/hoÿh oxRSI׭Wnfk[E t4Q888g.dy~&8L.2 *Fy *52v.OƔTD;xD~'D{, i}heߠYϋ Ng/ZWD_X-Cij7΅I--/\Yxt&3['?i:ΚK6vg}w6KeAk}i#"3^[As " ( e_h?_XxZ6pkZ7foh)/#msĖ6vgO?>_k:<[o{qx2M/MN]G-8𦳥m^)i׶^A*F(((((((((((((((((((((((((((((( Zo?DGWh_-j_P_=rm]~0m7LfOu2Smc&䳰eR}-#Cj |om|nGu]|8wN-|&>aXC領IQOVDxx;>5t/--~~+oZ..k~?Ήھ V~Y4Ӄ8SM'9('hݮM3 3C NPaJ3iSJ*QKd$6^"|'44}ĺ|24[D5o ]݆b,5i\ =nPJU+T1NtVUw&2RCSʮck<9&|ڵo/Ά3iSsѩ ЦZl/&&"b< xeSI9ՍDk)s/Eߎ6_]FG/5FGANck{Vm'V6>ѵaѭ˂K/V T)>qYJ+AVNsnx983œIb,.GTC eF"V˪:xy85(MU6O}\|ckW7?A|acV׋|F_ m_:g5̼$7|=}z}ywǽ/R{ψ OsI.yao+Peᘴ[;;3PO+77UAx=B CKRbe-K W['GI4FiJ1W2a}m2Ye>JEBU'^NnuU:n6xsg2X]V9^:X*Xa{un/XKbi>k|WeSx[ᆡKD| [Ս/ ?~k_| >o|Lx \j_^3i=۵(> -ǖG%)<&%F)ѓt*R*R|JjT)SL%ÜCU<9<>3 ש,QƮ Vn ]|C TN*)IVI8ŧRuTZIlޏ o[[ |RgO3Xl ޗit:m䖺WgӮO'O -wY|+o~ "gNT>"a6?aw\xzšݗ>ִ綆 6E.-+J*X T*yK=:rZr:^TPHKye'հqupa$&z Oe-լWk}@m&Fc C״|bYSº>//_s#:zEn4}^US#,A{pdy`Ue<&&7NBUӌU%NjUi'٧Rj7Xxc2 C|߇r\,XW/J$gUc?jFyKWRn-$MqNU!,5e*u169{c%*\W5 q<158w=br&\0[ YVJXuR|˙}BHƦ15xԺ1>~ؿO- | k>e c_XktO\_ieO z}w5ЗxwAv~xJt*⏄񎋧ƺnMo Gmkyqz}kuVcTJ *ѩJ -JQrNRW gY<W燆3XB6# NVbiβaB>u8{UCq:[[s b;H`) (' s\kQדI^vF|_×aDž#xgqn4Mv9};H4^}z~ WJiK> ?RL4>>f=Wէďڷ xl7^/'a,I{-.9[x5{ugqof.OO^| |fX.t#04jbÓJ0JTPz~o<)h?o doԼ)]<3_YiQ^_#]4h4xSź^H𭏇k ]ZjsG—Sjƛy>׀| #5/|K>5'|OZ^ xl~"x^㿌"7Vg|bխ-ǹX(Q:SUhԪ*hBq*!<Lsxw 9}:n>Zr3/ MކW*CVe0GE*''[:AFKu!eo|1~Lľ/{|X>)3Q_A=SPDq[??Uè| |;oxPjZ~Mxz555^|/Ţ[j5ZG,N:S?(*uFxV=sB0c(Fq|K䱞XLVSUC *Yfk+qDl-***)PZpUj')▩KEƯXDaf⾩M2K'5 |`)'FZF໹>5 ?J:.'!>_|fJ?uUOᘣ<% NiCF!,} SjS7\9FCex,u8fu(2qxUl\ZK8UO6b DJsFF/ڿ|Kkί⿅CѾ[9Qkk_~ XM~յk[x'x^soM'zw{+}?hkq{˧/)S+Ϥx7&m '_~._hW#;M'SmWCNOxO[)\$X5?CWtk};ԛg/?k|.x GxO:x #x YaMCH4<7iu]Y^:=ᓝhTF:TzxJ*u05#V~Ҫ }fIʌ+NӋLLFak0<*q p8x8̾{,V9`)1xj8yIX 8ο>,~8ּQj_h>|g<?i fَ)WXl}*9mZ5, 0*1y>7>RT(1*w(G]<9? |W2O>.-,u/ ˢ~w4 "gu_xƾ堿;Ef=XkB}{g?>|ib|^%_4a? -?H>!/x{{h!LR^T RYn2xҊ#%ss8⟳F|' \ob'q (''iǖn^VC*Ζy%{,#זx3 ƞ5Io ixŶ G|{>/*VI{ci/ uw pXxNFm-A>"Yj}0Z6hJ8–; &棇cJt'}s)V> .| J o6en"hx,Z<`Ukf?\~|U1|e~NJIJAN?nz? xNu]'GǚtpMSVg*HR[G B)ҭ:Fu qjY wtZ^Vg~3Ra7zc6/*˰8>WS>:'.uPiG[+ʦE;g 5jӫK6𫚎SWNTiJJ3,*ȱ41Y.g x|Ʀi\vNy$|)W>'t'Z φ?GNOï |=^/^(ĝSúM#^)_zk|8x{&. -nib{]OIѭ6yi:]Bb#_#(,EuC՛V%,R0tQ 9~}աO3̡ eyb]l= >1O>Iex*[oo[5 /}&Σ+*U_j:gfO uo@Ф4=6i=6$)4??d}Ba !7eAUj5eX,, N6_y͊Aahc3j0Pȩ(aspo_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh+I>Ѣ VǪG ;c&"Z.{^Zj;+f6+@)O:m݇KMOv_xn{Zhɧ(Zƹ>6a҃: "G+J{ .kH,\gg0 O>.>|0mc_.^_-c𥕕y~60CoxoZҼ%NͨxCv |Vi~kycEOq"YXxD-,,l 6K70${\tQ@Q@Q@Q@Q@USK57Pѵ:Wk+7TҵKK}CMԴ^Pk[+y$) )ctfRiM4N5iSOTBs8ԧ)Bpg N3ԣ(-8-'&i44; |Q/o<=uΪj7:O4&{Ueݮ$UPWVZ'ZJ|ӫVrRrimOͶΌn;bf+0b:f7WUi'R"VQIM$QYEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(4oQF>kN_׈%m$SHFxA$s_-pa#\?xc᷃xImcR腤`t-/,e$}TљQ-:_<.< x<_I sG?e{,a%DN͗Rm@: /6x>,1I^ƉC⇌;;/N!jZsxĺZI}i7hÿf_a Z?C_ƥ,o#+|O:kx5ɟB|H?^Ow>յ{^u]swWυ}GMԼ=qZG>y4lE4F"訠(((((((((((((((((((((((((((((( Zo?DGWh_-j_P^|weoQ.ŋ&oM7PkDϬjGb0=cCk$e_fX5Al}v f_xc)Yn<@lcpvVwQ]ZGskؐWi4I"YMᄰ14` Uux{Gǀt[MsUԾ#|95xotWTH|kIfѼ1qڍ̒i}v6QMR%R`9&QoVM.NV / KQN#^eJ<:PQ|U5QƯ@5Ŀ%x4K᮫ij~:4]éxvZi5 U*ʵjqԡJ9U%%N%k.ɱuC,bhckfY6||vYG}r\<-n&ЭYa04*߶Q|FuN/I&/JNĘ]?f=Vw#iGoTh1.|a OVvWn<}K{r[?|pڵx^ (J|C0^fΡuox^ZuiWR)/AL\|4rnK֮tdѤǥ/◌qo|GMg|)#Ǐ'j~Ick/\KwHh/K}F|  u_Zz|Bh6Z&u x^<>j?Xmtkl#x_Vw>3[|'A)xOx_~"oc/E>GkYb0ykŸLѥ[UaV#",9mH*RͦFiN!6OtW/_,׀|_}kW߇j>Em>?Y|PJxÑiz&Zؼs:1s̲/eEz|5xa|:ssᏇ2jMO# weៈE5*Nzm_/lC?\~ؚvj,~&{#o⎝{u?EuejZg>!=o˧hWaz2ꊅ_<8{V Z#y><Tx4NW.yg_C|9$ '+xB&uN'wo[_l'Þ|kaOg^~(SROoV?|YIi:)O7!>_6|lT/t=H5LJGSaCGlOřFW7hq6G ρX_IJ͸.䩕fs /.fAw?M/5<;C΅xoV;1C✟rN+*Yl,8`8hegC.pxT ^Ewqizgcƭ-"-SE>RۥKCQ6w=;KMNy-t?O^(Y_GOx?Z9ɫ|Rү!m?R^К{y-:|u}vįw5 .U+dyt0x:ls*ƖE*K!,3Gʱ`Ɩ/.1>վ'@|b |9+Zw?ڷQi}5zZg^?4u/|E+7'>|Lm-  G.+Y}~'LBn e|E2t'yt8\F 2i˃p3Cpz9S?eT5z_P6Ɵկ>"imhSCE߃$],|OiuM>:m/ŷ_k':f_ x[U.jVZj:L֝ڭsgs4E%+p^r|(ͫ8F{¸|o'frel-L&1tqXu>\^UNpN\|lƾ?Nς%KUhsɪiUߋeO^I6[o ;~o#g#>Gx?|>-1%/?ee'&k=R'|Vu؎?EmOM jYÐc1Y:.yIGVf-peٌq[❧ßO-~ d,/4N/)fbE=o^ ޭQ.4#bu!u/,#Ԗ><|& 3\ >?ڙ#&5PfҶa嘪Rb0tcs!`Ve48/=vKO Ӽ1o n-|5S gt뺥)aҳ佸:vA|eU8 cY=xlelV: uj'ѡ9mS%FM0 +(((((((((((((((((((((:Duv g"֥n_k@E7о!k~\ |'c=Ֆρ.[}!­w3m[dXk-#$Xʨbp=}s=C᷊tj^wmYs>|Kuğ$xᯍSnFU_m>4 xkMZ [-NlIȥ`;|H{xK;-:__|v<[7~/(g}w·_| 5O> O4z/;k sji_k2wJxb)9B")ќu*{% y XepU'C``qrb1e.]|Qf*5pQ,D1}߆?dk~ηM6xX/{Lq֤aK}SB?gOAq[K3]Yͬ׶I\Wxc1>&k?x[)x?X Wš|7!]\h.|;}'ⵞa_\kZW4 )摗sZN(J}uӜm}ZKiT|,aiq5|z`a`ƫeU+qq* ({~?g(>x7S7Ogi좁|5ix"R]o?$j\v/_xg?'Jv|w/¦Rf(~ /3m ̟g-_'Og5H+ b0*k i[IaTU ƻ(?*\ma\a6mp3Q8%[(C J_S*9^SU刜r(ҩK9/ٛp7a'O|1?gK|@37_~1ռI &tow o߈t-f<)]O||-{VW' ևOxVn{mcz*T.WVtzFJu'Vjex*<߼=odQN*N{ǺX9a2ŚeٲStcp3>l=5 Ut U-?}B,sy9x~hZ0VzM?mu5݄ OU%m3+V >x㗀o?j~)x'^Eox}|7߇^'2O.kWE񿀎뒧WzՍ<1x*Q)IiY$:xB^ѭ|{xsľ1:<+#Z̗Z7A4+6B4ڌ' 'G^UFޱKY35ޅh+؎K^|Si1vmMLԒRӯKy.fj}(PVs\5Ob,6'N_=ԅGJsei )~|zDŽ|Q|m|`Wfc R/K&oP֩-|1'Ikoxךtه:l~"[S_|+#mÿ+oxwN;>O}}RּI@Uʭak7+. *)pQ 4<32 K#eX/?>,|Z >\|&=uG#\Ț|2TP}FaCW8jǙ28zu|7Ϋa95kI/WMş_ >* 7G<;/⏃RZhUڴ>'/_ bdYƧ]RntYŀG%mOڌ0^Z_G dvuAXG6Mwd/m~'|87/OƟ8oT=;]ex>Ěǂ.~$|o[xĶ_\ֻB07}=L=kzD۷} WԾxgSĭ*-SѾ y^wZf_).{%ҭ-`-Pi>[ͼSyv:x(e(|.;O!Y\:x̷br6asl^r)c^c gTqXobwE=ŭ OKz‹L4?^=׵/NtjxF|̳+ ~wB#O I𵗈g؟ޱ&x@JQ̻:8&⊼1a2 2|kr p8.n˅98o/Y}oC Z&}SJ酶#5_5|z> S/?<9nkOյOx_ϦxOC xbI/>y=~!8 ~)p323>ϥ/?f~Ͽn<) ; BGxQc ^U-FeKm;g؂?_|3&⦥fᖫx+ *|AMjP_K{tmc]4o N@++}WѠ_⯤m48a8>ergFsǼOaWc0>-\fY,v' ˲߫h<~:xyW|;w⯋|I|/eZѴ5Osj7~,Dύ5 [.mjC{*#%z@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhy3O4^7>#[Om<7ki? MϏ{ I~kk:XZ][eeǟ>UVo&cGkSvQ_F/TaeN^\L#O2C( O t'QFr?DTf9,M[ hx,fq2׊|7o3GX|N/ <%|GK_˧3G'᾽iÚj1:}"Ow7|-#¿oYW}vF|0BO2#Wg'Tеmb~_]nk]q2BUeB:8{N勥N/-'*RPt>rhbrٖg1\GG+#/)h<|tߊ%Ώ8OPxCdoTGȞ:]J5H7:5>(TW//:fs9'cS,G_,e F_ M់<} ֞/ok᝴bş=>9Dk&ݠf3'm_c|q??ѳ%I΁ Vx] ko:}:Osm#Zҵ=;Z|iڞ2^ZjWZoa 콦$9Og8\[S:ݵ8g!adV2,^,s[_bż.dC^gN\6 8~&I%#>>İnxkit4kC[XFN"vuOxoK5xE,~ ׃|Iw@j^g饏<+Ɇ䢡~MVwOz-] AEů;?m:4Zϑg>y,z~[ƇZ vN=MK_\5 -#Hԯmm;Ÿtz?>|e'ğO:sO> kڦo{>|/[O/4Nk%⧋>)xasgQ3(((((((((((((((((((((((((( Zo?DGWh_-j_P\<x[_;],#ln0}h$aIBH+_ |>KM,GmE. Dno uu-k%@WQ@o⟅}.yA$}-ln,үeg𦨺7w16,/֊,/u6^-<%I&G3FbhV1_~*&^S/?>w ѵ xwP4> f Ρkyֱ?B8jt_^gxOᖅ=41|4>j:Տ<-[]MJ"^|L4"Ao 7_Ze ՝υU]xOix]EY`έ;»t6oiiT".W;N8d<>,Xt3)8Oa[k AۭS5ѥ𵞝[|=[l#eu+RPϚڏv_ wZͭ.Ueɧ^t_W&O>{Y&8)J)biɼrcp?W(Ҋ|Y5|Crˌc|9V;aJ|K4hap2W hx)eXطu 5Kj([Ɵ ?){Z7MxAwGM񏇵G4OGAkyfkKIywi;š_|C㎹/UwZyFᏆ^2Dn<.n^ ((((((((((((((((((((((((((:Duv g"֥n_k@E? ^šׅV|1m⫟xKNZK:$hxZ/S 44~ԭ-`xnCa η(⏅|SzIwይ;7ßZ_[05|\QK5>"Ѭnk.&^MaKҔ 2ZRRIݦMifάj8|^zJURB#Rr65$&Z3Ꮚ&=Iq>?x=3>a [MiO ko,QYl?]XYD~:?<7G\G/wZ I;'O/蟲&jw~|l<1jCյ] ϠCwxMSXt}M5{=ᰕaΌTW,8TTT£O~u`%I3Y>C`o,N]J\1U0l^> XT|SɱOǡQf8fʜ^Y[Mznwĭ/G|E-'_|g/^7aޡ oZM;5/FE|VԼKvQG}~*wmo~?t^ǎW'lco |r/)O&~񷉼Uysu- +{AM;^ttצH}o ^0u)K Rr>*1t$Ԩ:TJ299 xL3O225|>Or/W&bj֗!UN\8LEjiZpTˈ̩SNVQtBTJ *=|.`,0a y6yUn3*b81G,ʾR(*07~ңW/6_şw> hKV)mƶ?Cws}i?J|Gik?_WƯ:|- xw+HiWo}#:g/0/|+?Qk}4{2JO S:XeS30<,^&uxzNTjUj\9y^# aV<=n!Ryjee8S Xl5IӯaeKʎ7^TpOfxſ~о=#}$_N~0GYKk?o[=~MG-?FwxLԼUKP>5Ρ>x=uzߏ'O?k|*E=#ľ+'Ү> =W |eVx^u'A(x;];|_|^|?w?<G~_ ux7ÚOt+?Qmsa[Rl: ƊZMTk uܨP F-L3j<>e3,!eіePˡ09YN.eZe:fYR* jq׾~?|qj>9‰?꿲-'x_Z1^iimR|0Tu+?Eh~$a^Ŀ>*koo:m4ρfk[)z+ ,۫i0`$ivmwO:Wv7jx?ib7񮏮jGmlᦐI}%/eGO ?=Gľ]5h w:hǨh>G>ޭu}u{t&'xp?57:139<*aN\c7 N9ܻK)OWN#g5a1F12Xl.>ү:8C8a^oK hmkC5OxoO\LǥZgOXKEY7jO yqƭh?hzz//ڶi7:vw5?Ru 9!,.hmnbx$IQXy>#ு4_¾*GǞv?_AK|4wO70|S{/tz :pvktQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh/4eĉ)&FǍ+c}ct6ZƝ_hBk[_ۼehN|KI*]HΗ {Nϻes^ S/x^~߯6mwWou]súK[j?jyiU0os"xMj|o?YGƏ/IxlkmZZ i?~,hmngwJ[^4_dzFէ>Ul_-'ne<-q?BG^*Gi߉y[O4/_x{+ Xfx4?%gR abyF**D|kjgm|}i|K' k ҵ |\}zD޿}^GӬo*?SGF.hJiF:)BҥstΧ4KZ\UˡQ5<]V:tpXl4ʸI0P`cP.X,lR_ B=~~"㛯J4~ UW? 2_8B|)Uw1&p4:A1Eiq?ߧ7`qSƏuO$G}6,mkwJJ|Y}S̱¤9TIsPKgyҔj||26^2a0:k8e/XZK,4UOklK&gZ?kᏈ~+Z_|7tox˧jt~6&ox?'<7þ:|Gi}e{?uOڔ6'7Əzޚ#M:@>)|@)4 CWUWz^ su#)Pҵ*q`V5(rV5aBN͸7)7x4 U?gZV0y1xw0X`? Ra0L=8(b)%)O )ի)Ch/ë};n|ExO|EԮ.}~+ ]Yxw|ٓ ⯇VG= 0^xW^?^Gi}|\׎cSd.{ 8oApOaXL,`>?l5{/[xk][^k"ğ_qKcZk?~.x:,gGӯEqM4:esJՐՔw`A*?++V\NIU6N($c T Tœ#()$'0sLe|v1xD\.N0iBᰴ(҄)ҧEEs ~nK{hK ׌9KC/oz|1[N+]JV ]$6xwI tzc-Ķ>Cx!FKc<73^Iuaig;^3^`cvMǘh (a:N'}|߳jMN?OGjke&^oOͧi~ϷӼw' $u <ƷvF1\xz+u,ik[ňdyL*)2B:' p*is:sJp>U0G<Z-Ǟ4/?/5|ţ֡ៈh.;>_,eҗ~t#ώq||Cxㆩ!o/:~| oI'?G?fx0xIm|)鵫 oEH,o8k7Cx7l<^mgve yz lqSG asQ>kÇ8\|s8||Ww=C*ߊ n|/9|r~|C5BdTg_3ƏkޯW]iB~> jg]cNj|Ox6 W|U ]x/ize}e-KHS^xN4xOL%}$|/m+߃:5|Lּ ?h~7OkxOsG=K7:-57oqƏ">8Č<G!1ͳ12繦}TS:xkq#ʩ8^Ν p76^'gg➿yaH~(j WU|;6}xE/㻛n/|1w=cE-bjPC%8Nr8G8`3[%3<$e8lx<#N9y&T?bxv+ D=*_?Ÿ 3_j2_ m>|/<+kh,5M7Ph^*Чwo,PW7ƿ^ 4|A%|K#ZX=gEzW{ Y"xSx5/xJx9bqx/u1~F4)qc(Q_j6|> > >|*G٫΍MkjMέ/>5ش{'^4ޗmh֧W)w -Y}WŚMqooi-ypxqo,qr ǵ2\.{73<<+-†{&''4v\5Vo 2ߋi~зoQ|C} ԓX'½T޽=MJh--u07xG_V-<w ~ŏo;OxC5ߍ|Wsox;K׿n5Oˤzm|;\{S7/Qù&orܫ0\/y5xwHmoV>$\ JԴ^> S?π~׼cj_?fu_xQ|B?7hui~𼗚>a׼_,+Sx4Ô1O 37e #.~RE86ϳ&a`egYץ! !IVTydW,SIK :H9xdu%YHe$hJ (~O|}_WiAO:֬g^;i gJЬ&4&+gQ%uJGtof5^JΡ^ZG5Q>|>#^ B+N :֫% ThѧTVN#)MF)a#ş_'~A,{FP{rxO.}3.:iCu M^gѴ]4k=:+-lǘҺx~'`2lo?˰Yf'<1?Uq8,6q֨c+}[Z?㉭hIU><~z' ZgoHtkN𷇼UaՇ 3Z \"uehXG}V[u:{?ohO_x<qsK^mO |K׉oSIr .vm]py^__gvUvcI\;8L-(6˳\3`Zyf8or^/2$Sφg? xfOo4_nP}{G׭m xgMjUe1.'/r~1dqW &7b`xqUY >a⣄V,f;3lUE0~k?GĿsxcdg?Ϸ:|g⿄zϪxVm' k Y.-Lw6?ׇRQoxgP]͢_Lo.ykOxx1㼣08p8/㸫 է^Iԣ_%Ն771u*9Z/ý~>H<5Xx8iZN<1ke4k!ckGO~|"a: xShu#xgBl4[ӨBl\LyHqf/8~#ΰۙճ~!Ug{,~sT昸UPNxʵG 4+ SGo5;57< ^W]>'s[g5mx8|<|#׺BKލ8i:mGKEu]5퐲5ѹ3!M2,qiq?fma31̳̳&81M\F34Rb3 MJ5"/~<^ԬkjXtD,>;eY~#dya¸( *F'>l+00y;5Zك0ٖ/J,ej޴OgįGZ5ť&ꯥ]NXZKcq;X^zAt"IF{;i O ^Fo|At]=%/O~/%ž#@o6ܼvVc5JV,6; c 5%Px48zZ0_Vz3qF:r&EsQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh1Y|]5ƿχ k-zCi,6*mKY.{85mB}Di|Sn> ~> å\Em뺅/YkћNÏŤnRH<T~z^s_]xrTeˢ_-am)"ḧƀ=+&2XߤF3ʼO\>wo?g^x'=CX,Waol>?h2#ZFovKzwjeKkK]fas,ixcZ::sq炿%HJ +߆>:~(x_ǿ9gx2xN!K[}Þ2\F]?Vi?~x3ֿg:Ë~2R/~"V%9g^na/g[&>%6F]λ 8R\A.Upx7eu̖_3%LLÌl./*9m/-,by$:_'|18|S7|!¿ڏ Y|Z xBNRtYxJ_&ñγ.qC />k6_$-1h~-H|Sx6YT]?W;9CM+txcjf|g^#ן\^Qg53':f"AOjZm4z޳?~Za{cgx{Jb }e]!~(x[ƾ&Y5O6wZͽՊCᓬ[]ZX_ú-[Z{T֑RMz㟇>(4|S>!~ǟ|!>xO`|Mӿi]D?kOA(5?7:S}a}x#A&/49_Vs/Qyfqx[ڗέ|^mdXWBT,slN]SR|o]k_j:/|W ~ު6_Íh"GW<13)Դ"8$ʿdx|#_eu_{4ZqemտgZ~wN<%xJ~) ;/ҵ~jj).((w#L5M6 o_K?h|w4ֽО<3Ww0^|Ce͢kkK|47q\> G*W)湯><)Mf$!*yi24'l^:m:zCxrSO~6dW ~1m<;ώZ5t+'{~|.\x>.6wWM78̷&SxWù^9/,żMBm|2+G-?v7Gį~-]]|6[> t?|_mU:xZ|9&/쟳giſ<į|KKs_ᏈiC^7/|FɨKti&Oj>%j}9-˫aheXN >S͸SQY~ySdXpY^ eaxsnjn||uC~\wtn/z%z [^qyjwz}6vBȹmqOK){<˨;TV|Άuc!Q^`Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<+|+-: Szzen[_jZ0i.[_k:֣*ȖUن9f|u߉^$ / FKV59aT[~ci(/s@}A@V%I5f!,t?`Ӗt bIsj)fX Nxn$.nnu6|3-&\ft2:] j[vK gMK¶vi^qkc ]~cynT0xJ>ҕ/kԍ4iӣOz!N7;ֿhZ->&]V𾧯>}xľ5W"xXֿ"uu7ͤS5u>)υG\_hw:| WҜ&2Ҵ?_ٓK@N6 $Mwc o85b8oyjgjS>`)q <|?_2(f3 U0|\o1G4x6mkĞ闺uC:vZZ ,}/Sol'9}g'n? MGz𗋼y\]k/|x>$u=_QӴ#ú]]ErKxp|T<-W,1~_ .{,z x|Xq8f: :؜M*V!P5O|`>Oɤ/Y?~ћ~'FYI_? :5f۫7ǟ%x|q; v>|X/+z~ux+/|mZsԺ \Erl8_o5ˉ|8N/1YnC9'q&iu:E[gU8SqfUcx[9F8\h]oį| 6Ǘ<3ڤUmmQt=>|Gje?t-WU K)pFUsl$aFc8,/=Lna¾?0`νjqb<4bkѣ ԈT]O?0<]=364Z|Q=sg|jG]U_O\yR Ÿ ⿉>9|^"4R/kzV}zih>v772GzUW7Ka,O9QyWpsbs,F*VSx[7g5M^T >.S7M '~ZjRR|W#?a;URtX=}"ykx//O,%pqdylqbkYE9=JQ_<3fmjKx,4cY2H +<x᎓u|7֣3Uo=e9<=h! J}WSf OKu+=N{D|K-Y+_E|EgϩjweV{;kyvK+$mc8{6;36Gfv:jeku6uMbS5Kg]-[[umBPمikoZ˚ex<2tpRUWJ;CUE\&&WQΛU먯<((((((((((((((((((((((((:Duv g"֥n_k@EOm/P|\𿋟VwK}:ĽR ڝs>oeZx~;zDO$wׂ5CΡ?$? |ORG߅A.<<:zjDڌVzYftJXӬKHᶿM+TC*ݞIgIFP (dλf6__7ړy>wyښ~ɡkV/xM luxk^wW2Mk/ ~)s&}sMn<5={4q|G>|I+axЯa<'[÷Vbo=/w5/|M|]RqN h<4WHЯ4 +Q~-_Lg= o_xGCu֚}ΙsW]tmCMu+U>"ڵX=L\9ٶs\.v 0O?Y&y ξ6wWjWbf^Ыq\eZK'޹#zOYX\wňgeh6Ӽ7U KjG(_j=_ -<'ZZfx:dzZ]9x=xQu :Dcؙ,4`mfg˩Viu8w9Rdrʡ~:aG!´s Yv;(>KeG`n6e+ ?\Y/0~1JOI6 n:컫h'o׼Mo<3M5/M 5 6—[:q3'/S~ N` 'RZu95\tY9sZ`| wt/7o|/oY\x>Ǿ =b5-5$~9/߈a_Q7['{S_-3_~3|f/99qwbxξ;úT/0y^.ٮMr ~; slLE`:_Ok_3~ŚDŽ|@~M+Y |'}oC+lj~=xI|mjEh>}~ضx oG>_ ig_Bo7S'Nj8 KL+>f:9~'qUGᦕ2Ǐ4|F3:=[oo:+O>iI61y3M7?}>&Ӽ CW>homulc xwSPkf爴=)fZUY.#<5G8~ʸ"Ωc3&E ."7X**YA=,ʴk8污_+$:ߎ>''g/Դώ$%վZGys⋝k/ ӴY&ռYk:ȸOg߃?4K44|,~!h:Ctm-[Wyi-՚FqYHi1"pGŋ31Ypڙ<+3SY0aꚮεh>gsꚮyong]_] 77#+)a cW?.0ý(Kx^>𧊼&t-ZC:LjjB3`u($x><+~AcLcc9^7ͣ^YVW(ОcG _ZdpEJ(7_4G]%w-G:V+?ZV(bnxKW,oG&hF&<)ǣYiwzyk__EigeimMsuwu;(<ΑE3ʪH3.|5Yuq &;gx,]Hӝ<./*Pb*B)j8ԧ(ũŰB({KM[_~ j l|a~>y>%ZZƝ3m Uѵ(<{[h_,[ #wvS~?O?<{¿ l1h#M+A,}5/5[STK> {UԵ;˽FD%y.'F;YL_ O \ʞes*1QQΝ]:uӦJ5 + ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@|{5Oz?-94^Zo?Q5K5[|c#h+kosow\ivwWF!ㅗ< + wZ? ~GZ˜MHoxk.YZj1#MRM+ G;w{m2=ޅmm [银z1{XcHj6\ɠ (cƻc~y|*_o+?pO>z?ھ׮kU GJ5xbմ ROQKIRҵTLmmU i#](֫N (W8ԥZN*jPNg IJ3RI9+g\q&o|O4|o}g4O-~jf-oXZ蚽Ɠ{[º΢V??anM׀M{?x_!>@񞫧6 ~0_4N]״_jڼd"C߈?gh|+s#_W~{(Gϲ Sf<%"~&|/ɳ9QO&xO,N?[8:#x UE,i0|MC>᝷uMZ?eֻᛍ+ঃ-F4 J}^VxwXY/k΁Y_^xg32Ec^ }8_=z4K\qqjTK|ej>sme}s_C H/.4g59qjf+*m.cpqtg΄s:-і+ G(a?-~)h,?g/#e[6|-5 ;? AoG~:4Ж:MO Y ~?7>о9I!}Gq /hz&u:iW^)5-3Vyt<>*ׇ3~i "CV|A#A6H:_@Džme6MɟK RY?[=3\hx[]dԃN>G= ٿf_dž"s+sC⫡3 hgOW OKo10?fi|qxVW|]o +BË^(|[]xZƵi~5:Λurjo|Y}CWL-cΕisf^ ?ecJ6~k=77b;ߠr&||Ga`ڴqw#i2֗f_[j~ HK]<_kKP_}mQmr[}^#xh_ tK?iQIijz.Ėдx?nxK2gy FMeE82pFqϸ^#gfx_֯Ҡ wsuX|;ċv~]Xo_ IZF|3]i~x]w|ʲ)50|+X,ۡf8zyfSK _1>_oO#/_|KO75gUվGOŏxCO^:8įx;Fi&|a{<_xYмkx3ޣm]G×7zfx—6W5ևa8J((((((((((((((((((((((((((((((:Duv g"֥n_k@EOς>4ƛk|1~}υ~*\:Nڲ~%n-8SI.gEh{MugYQcφ^Wz DK[_⦱. :mu.ks=x@c6+şwǟue|;o)ԗBҵ-X_j Yzl i@c_~/Ecq'?}KV +5 K=WSѼSnRi)K+/4-^[k;|k'?I \ĺ4-g a#jze᫝R F}ioKi RuPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ ƛ_k^m> -ޫ7~'khփaq\BucSYh4.ۭJOo>PuO=WErIZ.5n{K%K4kZՖ]4{k&?j+\jz>\$ M{e̫ ȱ+5y$pw9b_PPEux{Gǀt[MsUԾ#|95xotWTH|kIfѼ1qڍ̒i}v6QMR%R`9&QoVM.NV / KQN#^eJ<:PQؗ?[>>2xǾOᎃK}'_U[ O^,Ӭ=sT~_ƣ+Inl߂nx⏈h?9Zg7k ś7߉Zݎ_]GCxѴw dtJ5J6&1iקFQn8XʼMJ@F *92BbWCO,Vpa0iTt2<<:l"Jz)a}؞ >K㋿ĝ7˫_g[ZP"mk=sND[J|_~0`|y>%/>1>+|-|3~04<5u{AVk|/ƗxPͮx^=sX2֡ 58V* VK0>h n8t#M'BX6 aSQ欫`Ig8g1QҧjWSPU?__x7? "1׾$[5Oax?Wŏ~5]/MھI;c\ t+OToc ׋㾵^f4_ 7|7/?mOoR/O,_D4KALYu(эU878DUFk8R:u*IEg*3q^Ꭷa1yKBiFdRe 8ҫΖ__ օ)eq%S]MS7?𿋿M|r~%x4+W9>)8to jQ~N[|_~޿ |g=c 5X\~]|? ?muI^<Ҭu}me|AoqĽC߆`е= (9NP=e)BUIV/zR4Μg R|0B.~E#Rxz}1AC/֕,U,&iW +o^:cU¯x3/xošZ.xúqmFO|k_;ĉ;mg>״ȡ;ȯtWM-_k4oSt?J⾼7gգgWuK,5 }4Է<ҝFxQ/T:PN#RrJ0MFt5$xQ˰x,}^cK0*2־ WxLCf &piPPF8^ ~*mM3:]ak $.`\wtqȫ{Cu6pku1s^>x[xHޥ{=N{]S]:uΙ\귶[VOaI3 W,fx >cZT'ҥ :eG*#V'JH I暏>5-K?i |oxzmAHVľӵ+kٮX\ VNq^ {vտe8 ͇.xľ ]Qk[iOol46Nb {EUuoGD'_ {MҴ/F;]KѬp/SNUPinvy.'IeWy( ( |'oe˜wSI?'u6a[_c~/}?l<].kڇּ?jmms٦IޥC{5*NpXjTsST$$)RqԒo2": bp6*1kSf[Uk5jlM\ʖ"4jb / &ٯo-o50Q ,]Nt,:h1XP,TgjnQTb1>.Šq3ܻ3ӥG/, QRRQU%ҕIT;K?7PnVҼ=y-ΜZ)+QatiZ|kh> }eu xsPmn8uCC~Yh1=݄뚔ԛy!LC  S$!|hd@w-'}wRi_toxF Eu$6|e+VK\k]gi亍mb{}V ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=W?+jw>Ƴᙵ= 'W^r-:Bރx/k, y6 5hxRҾᆱWysk5τ֟u?^ &o çQfķ>Lmx{>(i+> E7tu_$:JX j2;|cMB 6AogѬ#K`1?hoB4υi>O߅5{DQa:OID t?\:U:hVW[- (5[q4 ̞!t;|>D`kJ=V=mBgVMI-t!ǝju`bl".j*I7x^n>|χ~?_~Z7獼k΅?>m}OFa/⻛Ú: Iuįx?nox/_c= [ýw7Zw~ϺDĺNi>5i_N,5g 4O8ї6`ק)R.5-?Ҏ%hS|D2lTpsjO/q]L3F|V%xl}R*QePB\IU.w4|EĿX~$ƽ3CM/ ?K?}t]>Y4xIsqiz4=WW}mxzG|Bg+ j_Mw㇀/SUkpx32[^:Ҽ-àKio z~3&XZ9`Z }^kSM˞r,wV?ҫ輮xg_1b3<0kQӕZYOĹ^m!e~/hZG/_\?:$xzZB,Xr=|OIV?u}"4VvW:ߏ>'xK ڕΡZ%ƫ'DoúV۾G OŖk2xof~# |@NH}nL<SEl e4FeZ. R\ҏ,DM9(ajs{*ۧgἿ.W0ja>x^ |-υOgzށYi}']Οp ]sEմRN2@>nLWvz@ S%m#Bog}:c.-Y.K]R63Z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@y]FxĶDּ?~Ѫh\tJ^N$V-ՅkMsrlRT` ˟xA𧅼ywCL߅:͝Ù.f5OڼzüIhچ3̗I3$ZgD|;ZzNf$maao"IId1)YY/#1?J (ti 70N.8;[M2{xfy푭乎(Z`!X{i_>'V\׾i/oBt/Q._t+]24z>{sgBn!3/4|^ zG|/6zt Ѽ'~ 1 /YIf?+%Eմkh;i<:.TO7V%a9]?>Ϝ|,ԕWIRH7ʬyj}^N]r42Fr<JЭkV^4wB^x:ŋ™G4/+[sei |m|Ck)ƭe~oDžE]=LJMo|22h06QӵG񍗉tGP3^ux.5k:u-gὗ];Pͧ[G<9A3-iw> b[{u,W(GZr&rxy8xqSˈ8ʚ܁RYp ޺gVxyzeV(sSF>4sZQlO ~W8Ɵ3x/,mߎᖕOS^:6ៅءм3h1&լmd{}=icඟoNH>4įċ|E Wt-w-?pZc:d.n.. RznSPԯ8TeV51ڔԖ7fuXIcoYpvXZXU2:X۟9B&di"4Kw7DK:YY$dA43DY@)(p1SKK[x6^%ͨ6<䁂:x{z`]߈kϋD9|Q|x_Z5??O»tH׈<] QOG60id~&ѼeMmXӠmA.#d#gKYgIERC`+&2XߤF3ʼO\>wo?g^-xsK|%; 6;mjVZ\xo>W-2/iqJa2麔]\JGeUa +F"+ B*V^Q^TJNd6mQO>UMMicOEwVx-gq :LqX2g*gl4x^#X~{]j$uwHMGZ-A}RkKW "ݛs#&9vE㱼qXev1t$qzB p#PS7(TrJ((((((((((((((((((((((((((((( Zo?DGWh_-j_P\>x7WV,EkM[(Wu_4o{\jִJHHeW2 |shrhWZD^д9|#?xBahmx3Zuso W:t [gѴm+Vz}6XiuKTDP;bIү( ķa &\!3,sNL9-]^(b*Si5z]Ͷ%V7k5ZivڌsjXOc=7xY*Γh!ux0nެ7s? }ᧁ<xğuSC(sK}㿆7i>o>'ïxwpi51JX6Af'KZ,FoS#'g9VqN<?i<%xW=EiSKӚWa߳|%}xKg|S~(˪ {n\{X.M5:I7 e>8O[ZUX~;>/ }0k[TwmH s;g6o:n8qo*:VGĺOaCҨ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=W B_˨|Vx{B{ O捣O)H~ַ>$K>YrR=%'Ew:|- =;Xú=Ɨvp قkDxw_| qǂ|'u?zx7PZK d,8}K^ [PD/i8xXS=w]YleTL-){6ʹ@_PPE xu|otX#o^k}.;Z3/GW j|MO6w ҖK)|U Mwq^t }S;~>*&OOյg> Ե]HAi֖:s5kew3w58s  "f|QGxԎkZ4LMHG ɉ,'Nusb$R>'ߍ<=x!Y?ivZ3A[t k?z5b;k">}Wѭxtw mya7H@!?/ R/G-KqxJMOrkm-6^aow+jzޔ4m_s= |R/]EZ6i"V[Qᑖ6upcA| (dλf6__7ړy>wyښ~ɡkV/xM luxk^,E͵Զr$Xjw-]Z%<1/EԮGqjΥ'/.jz 'u1##=,o9c]l.;9N o^9ң szӔ0˞bt4WEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(:׏u?P7M.Vj_ 4" 1 6uy7٢u JlEEF_ h~-ؿмEZjUVC5+4El4RmDhz΁k'5H|~sL>{0MOX{_N¿ xPr^?ºdž|IxK_|Bg>kj^t;;;W%>@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhuٓ]o[:ڭb_G 7Kntm`Cܰ4֢`#iּG־7<;SDUԼ;:džϋ5[\yt2OM"K >dTҴlIkԯ5;,k{Y(H" (>Gۼ9e '* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@yoĿxzu4 xV֋^kψ uRyO>+ͬHJķRX(#⿍:<-gQ]Ox) i8I4ˬNPHӴ5=JXn${}?N}F((Kg52|AΈ_|ER? YY]j?Wj^*S6G+Z$ڇ8 ago'趷:?__]!K-roX/ o4s G'p?i^|<++-?~x⷇o-ޚxC״;Y]:O]Ne{wj'\w{ ß_H< ƕ$zg1-;DtYMGGX;EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(:u/-!"ck4n֢v-eӮ|2|)>kIxK|;?g.xNT𾯨z5+H'o&M({f($TQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<+.k><𮅩Þ-NhZ<7w>ƚyw|P,0ͪ\MeXii׳M΄^m` {PcH^a]KߏnRaҠ΃si̷>}kR1 >2tz [n3_6=nckXrm%ҭLt+7|O'J㦣V6k^}tѾxci0McϡKqxVτ|/[i7cQ^S98֎J6&1i5:2uNWiJWkR+G %Oz`x+L\eAgnoSZxIer$ |@XjcKqxXnCC'$_RӮx?\y'-OjW YM>7:]/4 C,. uj1oR榬K V.ی)UJpJ0EÁslˈ2l;:y\jIg5W i`Ld'ĹҡVxWB'/1`@Qេ~<gxE/xs߁"_:~%xᏇ<O_V);ⷁ1oi(5[V>!zׅ><:_ǭsBfm<'o 'M|k? emG7<szon|]2m-Y\Q NP%[E וXa*S: q)ΰ&HC1Y]:|Z΍Lml xYd3':8pXcտm >k3\~ zGKω>|7/A |3_A-?v;6$ЭQ|K3oËo|9_|a_ᾩ 1|{6XxJѼAwpZ<9~:f5 O슼c>WOٺb,+QvOzcNFN8燩sJ*f*K0y|3nYˤ_WOO::UBnG>x[yUtKľO˫/¯Ք\|] ߈|; 7na1ouk"U,k4߀ucmm JӵMZv|AiXh6zm3\xZbC*6&β&k^x\e|N+RWlD*P:8yT:4TBPROO4Ƥ+c guV|.Gٵ//4_ך a7Z5퍶 ѢE_ݸm>I]I4k ( L)| wP/_?#^򿴿m?v}eﴯ[$▛R]w?$4)τw1})g.gT uO67è1_Skú]xMvkxx/lͮucB B1_h[_ŠxKÉ>)|)"o>?qk/FqWdl|-זƨq%T'ݗXxS>#|V> Q uk|=xUtL75xrm/KMb{\Q'7|g<9}'__/Og 6>xēi~7独|e kh:yx\ӵ?o*)֌*Su.N4kνIBWZjU$5hu3<>1WZxVhRfxM<Xc15+T1*xTV?fg6}@Ok_٫'LӴMoڛM2qx^1&v6jMY}#|Y^GZj/kpWrV׭dְcKO%xcwYUU)V+b+]S^qRsO #<*Y;4W0y~=;_<_oC]s<[[]GP+x:$Z=|Owa$mu&sPT&u64be3&YAnckP70||/M3Z7[+|[F s^5`c_ElƗinZgAmzPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ g\;}#G<)qcgxg6 ?[հ?Q[SUOدmlw>0O3 1P񭵎k</Z1i0%ΧxsC^^mhn!Euw>PoK fƴtPX[Ow>g6yTQ PWWQ-Ə^}VO:>C "o0{bn%h3+&RεWxN:O xg6VF5$n̷Z1Vѿha!~&~<|G5~$CAֵq]:Ou~"⿂Ö뢭Ծ6o#O%|Q1m|KڿƽH3 iN<uxx?h7|+F6w:?P V)d}$*Pѥ7bcl3 7MTaRn1ŹM)Y T2JYkR\IIؼޖE1*x F{G(J 4iaq5J:lC>ooX^|f\omu?.Ҿh|!yXx? o5'OdQohH^-N_:}+X}:u(W[kFM_RŸZ߈tKxZmJ<^!5ncl+xǒUk;JZ}r|oq a_Ze~+>2]Z:$g|= OUo *NtuAf*9eβgPlD}Zt^>VQª5WO<?{M{:gū|H'4]cDپ ͤR +F5 RŚ7?7!<__`>+f/XemThg,28,~[2c^ Ybjc1/|Vo5̩exF;,|SUkOX|17FĒx\{Ič;qX썬z]~o+uK$c˅O+?r?p + ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=W-xGMM_Sǃ;oMҮuyMGR-_J][ܗ3Eq46l/j-0%_x&m-/dqܕnIjƁ@4kWuLKGJ𮅤xkBi֚VkK1yy'M #4Gf 5P3|w ?> iz徫SOarZ?P_ R|eG{L7Ҵ/Awonֺhy?eۿ~ ~J~ZO|8,Ow'.ksg_&֡i5Eynkۻ[-&N4,ՕIVXԏ%J# \({*w'N::¬gQ5,.`#Ù&_W1O7CBx\^[C>MjO3 tҩ޻o~xN+xƷu7[VӼOiun{xCpR7N6hڕΟO xZ7ö 6Yе#N=CS/,Qtw÷WvAo)[’qcxms[nU&Tch4%cNX|kC N:-҅z؊}jNj)RP +;Jt[P׮l,Z=*WY]J LtH #}+KK[ 6Embyšx[Cl;Y:9&H[RK9|B=P^-/^{J𥥦⥯»oi>t=7IoN}&-n"XzpoÕs5kqJ*X BRqO˜Uu-F,-#ծ=Zmaڥ|6voeMc-CLg _DI(,~z_|G[5Ʃ U!~ԷA/}~/š_'?4mwBf(nIa9%{Q  o_PP^kG¾)~?~$֝ωu-_Sn/-i>.th7z5ΗtMm&ԥyXiJQHJqRgJ-))$NɦvgV >/ ^%^*ЩV 9BPPVqIƯ|WEqOX v/lZ<.m'f+O xmKc>>'}/ŏ ?xZO*׊OkƟ ]'Y>x5(࿏?x+S|E;^k(,7JWֺ _6ni1Ni`XҶ {\4gOc98JѶJxIP2Uc,UЫ좖/ G4`(p2\Ӟ+0W^*+d5NJͧIg?WƟ-eOὥmGysOZiz?n4m ó|E5}NU K˫<^dKL|Ro/w =Cz}Zxb-σ_2[Ů^j]+s [ityҝ9:%Ud:Z(O5r> 4ΫWJ9UjeqXNyeJX,uiakuRfԥ_Tï c?<=~,Ś=ůj+׎>22ZVf=x} w-Tτs|߅>2L/eژ*K J3Y8<҆gS.'`jT:׈dz2(>i#_*Q=fUO=Ɵ᛻&/E~:^+_?Nm|⏄6"eOB'?tS^] KkZ"?똮&n'u>>ͨ=JtUZRt hҩHJ)ԕ.eNRxZRe<7`r<Ɩ BQBu1t0YhC UahۯŇ;ψ>"gx?+­◅-fM7_{j2缴~"ym,_{/s~~"4h_m?6ͨ6}xwGO㿋<`['|/{FRQIKu#XJI'S:غpiN5`ʄPU& !Բ FF)Y a3N-`4, cp%4e[,gx|>:0J~|HS:<eW/|)}RWռ}J/i^".xz|mԿ[6<#kI|E?ojhֶ6jgtk2k%3HrQJPTa U C)0aj0J N B,Rϱyzz1幤az4('ɱ؊8eah,[ʎ84TixB׾Ѯ{s^1:55@ taş ? !xOw|-^&5@M*M-")M.}:hH{xTP^K`sGx V7 :4a0U8iЯ(ѯa:RZQQI¤$៊-7ڃ7xV|O|>tj* {2ݍjA"r:U߅*>χ?>#3I|UaOީ#XTO Uo~ |>]?ᶝo㞓#kv7?-[&@i =k F o?g!s;7j|%_^ >L"=ϡŜc&b>˱Y7˪T+p¥Z) Rf52\ه fO6_ p#8ƞ /]zҭ*ՒR@Q^ Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh 躶뚍ڵ/ M\hS=asٶytI:YOt/5WVg Yn.| K6s\niFg[}NmEPym<3ǻ|RarNl-m!$UI.lnwf$ UPlGę#/Zk/,~|jN}bM/j}X/to<3 KN\ϦIumm49>Ѽ xZi?Ə<;⿏iK&/ kaZZZ޽֙Z_G }q׎ac%)?a=Ew{82qqumd卽.\6!K;ysΧJ ӤO0SPeK&-;_>;?l8|_'^񿀵XCu]M.ȿc~ 4i+?<#YWΏ{Xx[r6X&p̱tjTeV֛B8Q~MmԼӆ BSPƞ7#ȳ熩BGeUө5)ܪbܨ?㾱6HEu 9|ti6ZhoHE!7Sm">! /Fd[̱nN\Sxa0qm7QXy4<"K R^Z\cNres%8r T.mJѧB2󊩉N9&&/"ׇ?e7_o+WuxĞ:mcZ/Qmgwڧ=j^/u_j3T5_υ=SKF˽Rj>0|[_+m{FKY4xWxiCþ'힭KM>- L#_&*PZ-#5 ~ڜmO(BURQQg)Nիas&e1iУM X˄*,>.S'm,~̿~] oć|GqOX[cw |U]3_>ǧ⟈>$5 J[7Nӡ5O?-_#[j+H4zݿ]GK}bci:m+{;Xmڥ"&)gIBNurw^9u8PAR_رBYjF8six 2j_Ix_'GQxd!ō߃5~1&ӭ''mTŹ77&k|/Ե߆|ex O_i?'(JwngN?ēKu.~4\cwkm rvp:j0_T:xhrS.i\%'9,BeT1zL5:8d$l5>Rq48pUUj>%Io$Nu]kz橮ž&&|}:+khnAwXn`{OB%)as"ѼN-dRbx$C$rxC'ZjScw0!!1J1I|71U񸺊'RUj4Q4:4!N PPB:t(Ҍ)Q p<+x#Z7kzXXx>.YFwW|isľ1.C>!uMBE ]2"*ur^:'~&xOZ7;OW6iix#+i๴ {3Smu-/P4kh'ȴWօ Oh#/x( KKH=_IOO1` zL:pn'2?8r,,wr;Ùge8tTβ½\T.>OS>)e9sO ɟ ߍXk?/?i:\u࿉(ìMyi>x7~]5eK?odןm5ğ~8]iiZEcoZ׆;eagomdY㻺oKip[tɸo个V_[cC |6վxOZ$_g'5kwxZ<9^6Hu8|?MkŚŖwVVPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(h/ =mKC$n5Cssy.\Ex_LM_0FnX,k|TOᯇ1Ztσ :~-.?xKT{Aw}$.,Em%|yrG+%Ϋ; -2zu. QIAq7PKnI|75tw.m8oovB ;3w?:_bA/oGoľ//jk׺9"cKỿf_i*0>ܧ=D[_6luO_<=Qs_7# |_f/|vj0[M|ImxSZN5VVaWxj.u}6:uޤepx `989C5aQc\e8xcWab΍\ߊ_> wG>uG~ K'Ϩ~Ϛ>eGFs>jzIltH k^'-coO~_xG~9xw7KVԯtX|>WyX麾|uʆ:qu*:1WVikpΜVmV68r*m_XL~sqsq\[G;0X|pxK!+j%,q<ާ'WaqM yߊ^!uWžÿ:~|㯃d)VZ,5;<~4x0\]!4ߌ~+y>;j |~? (7z_]wCN%ω<1 ck 죎NSX=isJ5og8E%Z䴣(TJKC"XJ|IGK3)͞Xk,*%ҧ+JaPZ~OFgbزþ,^|^>:־&>7_[S𯃿Qk:iNu&F/h[KT+/ ޯƯ|n> jZ76@|wuø|Tt? |7 0>-|m57 mS? Y݅G:ѥS|miOR2N))TsN*ԝ)Z_F]W)1]*3\®#1x <,4Q|6"_g[0YQc@o;j2_o O'Z|u|#H<{;R!TexUXW[?.j"?˦5P_|G!g5jS=h1i\%jidn-8 {~.֍ksÞ%h!|!]O5dѼ'YTFWvd3ji>iUx^7 r㧌t+]-uO-ư)u ԞKdBٜմPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ u! x῅|Coiws|GYƐvhr孄33BOiY~>xwMP|k_ k:-ԑ_txm/#i2XY_':a[z'<3=զ`}^MqVI"60f 2OQ&uaZ1uqeh&%QRvg;SfC 8Lޖo_3(gظՍҮ"e9&4Ɩ6s2iP% /gr~Ow4s\?|ko^4?,]>O>O_mia-卷m"YYɢE:Tb4^#e_kWѴ/kSZYZ˩i2Ooko /_|-վh~xOڧ/9L".kў9X\ڒ>/9T Dd牂y9MV5eyh^#LeJxʆk^U\uYbszTٝyUK4ahQr҇ g ?|#eOxG}? |CE? 1Fbk-[vd\ _z"S'6? ~k |c Ͳl+5t]J ;TKasl%}ԖcQ(T.XiV-UjSJMӍY^so2wUTlϱs ,V70=i*kVqJMҥViׇh$_úiŝ]ϥkme-GKM6Wpg{SG$b<Ѽ/ si4=3^д; Bѭl.P$2qqvqiM=SgԧRJ9ҩ 8ΝH$%4")>1,=᷎>:&|3Ho K­Kᯈ|'VM-]|p5is燴/s|^Cu.'e 2Yu:S5i`^ÞJjX^jrк^ڟ4LMޡue&[MiqQ.r͒jA[[;y#Y IbvFV7ҫVzU(ףRtQ SJ98TVgN9pRi +03ίYt\}9tэ՟I;955Ӽ߶6Z=%̱҉]PMkt=rĶ>ax{_QC!M'WOto,.<= =]z ]ѣ׎W&pѭ9FZJU$ڏ|9ܛ=[_4O5\6Mo]0\GuMLش[70ѲԬ5:P [{ +lIn.y DxHݑ3SRzWwQ(*U_5%-iT[V 4$$I=P C =e(i׊XCo,mHyHKP ַ#C3ʱ>&2lE\UŸWx<+BX/eܕj>)ү x&jxfh >1:3h c6@]vEߊ*WGM2 >?G\|Uеk.++ K_x6ɼUxr[^P/4]Ᶎ$ռ_O ]_ھZ_1ISWA{ʅoa(K@m_PPEz MZ>2wlˬ6'cVhGSmq7 lp86愔kuOh Q*F9xߕ뤓?<k_ %[x^񖳦پxžВLվ.:J? |3q?~#|S)tfoAj /#O ~ſ Z?aRTpJxZpe2=yC0XQ%~0c9 :)Ftөk 3K`l. [3kf7 y\75R2:XjexYVѣG)`VBX=C`_oMnG\=- ~k4υ?~2xf^y ◇th1Ϧx[g|X<"kZ߄Z;2[C> uj(u oE~$|CýSX?|Ai"#HS5K8( ,Rs^8fy*ٍjUFx-֮Wӣ Xp/'s^?/ bGşxbſc"<[8u/?|H֋q-v^-N?&Yh67_V&hfsynMԫUil='$UZR䂩J|,̰cYVSR9~|;t8s3.>,*rŪ2:qГaE9~3/'|iMw~?_ƿh/g<;-_t{]7rQSJoKo|=kIQv?F<|L|8ƶQNgo^!|=|KsC|S j pDXz5Ⱄ`(Qug<,!Rzx+ApjTQP 2僇c!qL042#_b9ridSR0k/plE-rtX[إ\ >=Bk#z]\i_|hW47g/, VP S :Z/;>t+DJ'*I[rrvݮ۷k~Gk⪨5%)ɨJRQM')4l}_ ^X]: kQݴڲR_h:{\=qN\ (x{ ѩ ùEfUvaK3doe.Yc {]W?4F xwTDZ|>t u?^#FᎵ.~^Դ?&_rvx~|Vk~7ڌWXXm.>x;V{]&@Ѵ|oN/E{;[=Z_8d$s~!?/gоxzOj?gxN]3ݟ|5hDnךL^<7dYu2(2,\ˆX7a%/rʙ*2G<ƺ[ߌ_,cm||n|C/|iO[K Mj)4]o/\Zvc=Ս+oǯE>#7O7OK9fOk5 ?n?xB_ O\ZxSi&y R\쥃φx=3X,.w^ՖIS)p`eeY.W>~%AKCimUџ_S O_⿎(]iIb? k\ԭm5}#G?>*j y k'n>@h_y+lzᖑ.^{? +|IÛ?ǁ5o[ף'<_ׯ-/<1ڎeZo|B⯈^ ċKx⇃lw-uu;/罸~#w3\jug~i;$O,|`/ldYD%Ü9A 9p\&+l~o1pV|=PN>!k6V3?W@DM>JR(k^Ge%|/`Eڻ/K.mcF?u$9wE|W>sTo`Ɵ_-̗0MZ-cR^7em6`r싃0|Wr~7$/d<9f? C."^!S擡/I\?36uR|3;Kr`a> EFG&g |hǃ4x:~Mo_k -&k'cw?|gIok xYmf4E_>鷺ƀOV~~?:xſS*H}?~{ K{߆)[k xOឳfEcdd'MqMJSÆ13.#.i6yML?!5q.GO-8<[3?zZ|1O_)W)bWii HC@W[m mes>4'NF_?ğ0υɭx~Ծ ҿo'珴y2H#7-ּ͝ ׃|#k4>Z|)Ll;IgٽL70<%8F ,㾡P>f&P +kGCzޛ}jPAwya4wE}kg$Huesow0xTuօzjq4d[VzR!R1Jq JHΝD*BPgEM'Jt-/M4{+m7H,+NaӴx,la@+{[hbHUT׶jwvBFb{YZ W6Cso!$E<-!$UaRמ&XʕLLLQ*QՕJj9nSS6ڒi<=xG'|5hޓzfnZc۫3kkPwyP3f;4b5F3VuX8ZzZI9ԩ9NM%vހ!T@aF222PGǀgW?>3|_=+MY|.Ӿ>*'V_ 1MT hоᵲ5 7}Eī! G"16,yqXLdt&q2N5bDQ_0EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(%kxMѾhS:Wu;{h> ϨƆ^UΓ%ijkZ2s?KV|?ú}+jul..06ɦ[(_|{eH대c~No-'c/ xKĞ+g [bUG/G!#S|i>𷉴/cþ2jfڢCsl[U[mynv7P\.่I RoQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh^=]Cƾ/m4[S<9|2t,]G _[@rKicwf칺Xc~7ct|D MV>:/-kyh˩Z2]ԵKVW\i~0I>| S_~LuX,|9ݏĻ]wk7V2l.5kIMZ\\^$0#3c=bT\ WR< jU{9ȗ( ռC}K_hAP :f)WáY)bでMNLK3})ՅiVJGIpWfSR.YVrxޥ'VX<2Xo]Rh>3:Le |4: Ʋjx7G 91_X"8{ibƗ'xU(HJ*vxz/_:Džj+ĺ_OjWG.m3:ͦ6-CK;F_l`%(XN~͟όПPzŧto| WXzg?//4MR[ۋkx`yKno…~ڤyѷ'jC߅?qԘN~?]弑ʱ2pUo븬7F oo^iS?xfH|/+hƵm??+oD״ E|#{mkgx(d$:ޡ]gEsx&<_&zr3^ uk+c}xlYBKZi-5٭Z,FkS*b8OTFp-)&()FeںxdY _S>W7OZXzb js\M.^G>ψ9>xƟu-WR< }oz[]W:q]Zi6}ƣq gB𝿄ŏ/uWDLj=q W΁cm{au.c7b7`kph+%o2L)⽎e1 8\С^<-Xpmcv>/_ !D$*^Ľm|9Ok:kih]֚?Ѵ۽7Sg,u_㷉oď/Z9t?:xJt[oQ©;-K 6/f(ּ14@ I-Lp9XM_*|Ad7ai#WY^>08[Abp0T~&\xGs 5? ֑]vE'5C-oc0~sn¾5𿆼EEiY qo~xE›7Q?x^M>"[#h-֣>$JpN'8VãeUʳ9STiPnT?Dʳ# 9a lpUgfo[XW1UNYp<¶[)c^STXEd|#+>ڞcW<k7u+ēæѼ#q~5xUft?FJU/Auý^8F׈ ?G:n ~k:gOɦR^Gq\_!zux][U4]6û|O-K Au xZu#XA(t΢T%,n5|eO :5(ᒫW Ҕ+ƍwNg&.1Z]Z-># N)֖_rxCx|aR`**YveS9_+?)D? '_|4|Wƹ(xw/ǯk:KC5φ< 㯂Pw"մf+ʫz^>XNk=vvesCsg}euv;E=I $H9ѭWVzjPB+QFrVZrSVH8ΝJs' )BIJ-4'~->uKk}W_xo4~tO Dֳx~$GzCǪxr]{qs-z\^^;5q9ۥa™8/Q4.Q7G?x7sr<.AVk̼Ysl攸\H}eh6FiRjq_i/Ci0 mMywidW7&I+4qmiqoO?gtӼX<3- V+_N<ox[Xuͩx{X|G7,~ck |E|MG[^":nzQ8Q:)QN8c(@(((((((((((((((((((((((((:Duv g"֥n_k@E] |5=[Z.yk>"xזaIM?H_㨯6#E+wHmclG4Ms4G֭ ~!;Atm[zֽC}resjY; |KψXSυ߈XXrJMvYդ].Etr}k+>#`s/oڟl{S_o>}}q^kG V^?Xj.H|w #Zٹk DN4]Jm`TB".ҔJʧ8Mάbxl,{׭ R=s?*ח7mzh 36x۽ S=Ş%UgÞU&7:6.;mtkXBt^Z4 _Pqt0|}?ZG]]8mx_-žE>^:.xK<@_^CkY^zVV#*i^1U0JU&N#^YISJIFS_m[#`1thF]H֭ fxmjibcNHƕZgj3WַmHѬwŻ.h&/x2S/+Ѵ_Z,tT~{-T4Yx2K=;oū#t[oV>smi>!|KԾ__<4 43^LJV=GтtdOdoગO )KrEyRUƓO,'Uiisf /*3dWN{ u*m_|/˪xŖd{[3/ Yx_l|=?'4_%&4m]o emeux^Ck⏆PĚ65o]'Om? xT- o]ZR[%7N*Nq8iKsW4b%RM)o [YQ8:o֬Uu5,|5)%Riў1X)ЫR$i@SC׆,6'ï5O6 V:ĭovZ| \|:Om%ZM:eW{~=aM'~1/As[h {GWѭt-Nx k}ԯRXg 7/k*| П:^f[;[&(ӭ_xhཛྷeChb+x~۔f'75kkt hI<@sZ<14̂IcB\r!ߍ8CS¿_ ou]O:o^%4 GKԼixw<)/6U🇡X9<-Kw(((((((((((((((((((((((((((( Zo?DGWh_-j_P^u^5ZCOcݭE<=[ۥ˧\x;-GYk Ⲏ <?˯6xSfz.kPcYχaյ~muve n⍬߻74߂?7/Eg$Mi\#EԾe4H_DM2-uB5i>^^wy|?NRZ&-hFeP L'7Px_SWɾ,Cx)/Ot_u2iwNk%]jX}1/]*񧎏A_>~MǏٲ kú|~NlRo~:.,[Acԧ]#fú \ΌGʮ&IX|Ct+Z7>uyb8\]Z3N399* T?1G^b<;X?Z<;km<7 xQx-;Z|`u<$uOOm:LKf: 5 <[ x>*_ٖKN1n.u]g^&ㆶ^쬺%)5!R >TWsЦBWrSJVXbVa:86/.yFqcs:# ef-:8JxCï |xѼ9߀Əkx{5EqNJ#_w4F9]5]B(|? u|ste >~^/>*xS7z~AVNzG}8Vq q0}Z WJxx M ~? 3kV -z&[]*]΁@ˢeiw0py&I|ůa"Ҽ=_/xt=3R| ;BԵ xE[FExGXb4~(((((((((((((((((((((((((((( Zo?DGWh_-j_P_8|s|6<7cox#&_|AмA= }oF}?zᆱY/omoouiXIeKV~ [ 4/x'j:N,5K_kwZLW+V-K\ 77niچʰ[iWw0 9;=GZkĚ4OjN\ғU7Ln;{(M)Fn0sINZ&WsO[aZR2% NKQE(EQqOt/:xxS4?ƍw8O i^;a=? x_FדGLڽ!丌M*\E 6#jpê]0xyf400y* +ឡ뿉l[^.ggUj/|W7O?4Fu>h<)xŖŴ4gkox_x!4?Eᛛi㕗1VRjAbduC*Zu9S&ӦrRLMzTpMSB+ ,apFG8 KWl-.S7X/x¿goVc⮝sY:.{y/ÚƗjxW:QM%wv5o5o ^6yx➛iW4ՠWy/A>wusxĿ_XZznej|<ǀf~v8Ι9qS{Gw|6Q͟ I^#-i>aaOO]BڧB 5*J2ts^ҔhSSJ:ؘnqTcN(Rpnj|`ʎ8| _S)x< O֯guO U2[~ /PwXͫEόꖩH/>7ŭ]ϭcҭtoOM?tKÿOt]xu<g?|?oxg^qUNJk6~a<;|?-NK}[?u;!BpuӒpЫܣ\՛6P(PisyW K cLX' Cc>:h*)fiƾ"Z9u*8gJ]ck*\7|!A/4J}W‰\֜G\jՕ䇴>Hrγl(WuDXI( 7a7YGcqVo:؏aK{8Z|kh> }eu xsPmn8uCC~Yh1=݄뚔Ԟ9S|&gkWZ~Rŏ闚_xoZ牼;tGEsi{]D%ʭ8ikPg/xHl|6Zi>q_x_H<.nuW| / K"!QIx< ux] XtJn>x{E9:}xm{ju`^cplQxޢêucz_W2?}^?~?SPI}?$?>  8D|L>7x^.{hoz޻\Y?I(<1{N0uJ4B/2CQ,2JJG8^ bXofJ &c\[SoMd#b0ߊ/|Z޹(oொw`hڕƋ[&Uht7Ogk4b6z-mO?Oo{>8xίSŰfWWG~?_<[eO^'&;43<*9Uif|-Hb0U0ԥNaR0V8z8'SzjXgwLeY.+3'(biPcfYq (׌O3.2OG_~xoAc⿉g&𵞛w"xTO4]oFѤƢs[p0Z}\F"HKJ;UG*ZsnnJ|/Z^96bGOpia8a*sCG C]L=|c.Gd*uo>Sw~~& ?~Z5C1 R=^_IawoW7|M-~??\ϊZ&#Ĩ ۣxx;^aH+x>/3L#zTm{7 bx_G*`cN4㆝zh5aQRpxiЩPYΥꘜ,)|1O;aa)ճ,uZ?T/׃R&|x~v=~4=oV?|Io~em)J~V~ד :H5tC4Xx~>*x^4<x2?M3лë>sx-'ҵuqi/z6z'S*N6sU)J0U)B8V+KRNqi>VWxѧaE,N"l(wp|ƤpS[Cԫb+Y*p'g_xkSͺ'O>֥y N-;ev:ulH/77VӪJSo4|R4Z_m7ڭ!|AoZkq]Rok񶴻öll^"Ӯ&pMKG}F9>!2|=a "ׅi>"ķx Dν<%T%*|Vp)U!zQV%*ђU*+ݩ5< |N ^;7G0հ8qx|*XnxF>ZkJjN5G}Sk%{K%߃|auho$׀ <3lP TAS\#uxˆk`O \ +1Sղ QbrLC1X rBXho =((((((((((((((((((((((((:Duv g"֥n_k@E2a1í#5W,O|4ЯWHկg=C~^K[VE=wK+V\ R=.GR5/b4HcȺvah K (q^0};Lgs;]V8Υ,k2-GwGY5-YcEТ< ?o)ƫy[ExjON'5_CsE=>L=F+Y&/xoj"Go|gqo&5=eos w|ygiM3^3D|kCKf2yaA*Mb/MB: t$E:UfU9Sci42<4s ,STPؼ>m:sӝ pჭ-O~ |'8K$QxKEsZjkG7I4jOe֗u65غG~㏋-k^Sƾ?}o G[ճMΓׁ<xnfqxO^u;Z%q>)֝jm*THΕ'*ҽ9(S֯Q*TThףG)iFy#04N / DX|1.k߳Ex]$M2w6xVԤ FZjXl5:?]^N17FBL=?Nt)󪸅+GTSrn,ir|&3R<ޥL/a1YV2RymIJxc3d8|ŸqqCu»xW_Axw9|*tO DköO/5{hZ$αumcl5mKU%ԵK۝K+(v@А@u nVg^{:tQiRtF=Tq#RJӜܟxfxڸdž`8ѥGXa)l;1xSB:j+UquqRZ|7z׌K S;x^$KIK_xOX",]º<~8w |\'+4ZVq:mݾkzhukech u;[ b>:|wWſF+{{VNq_ xSE5'H5[Fy- >qq gV>#5ly& )1mgLf|ʦmJ3$n x\ yv{y0•,4r|)g0̃<7㟉մ[vSRF,,{s6}OZikhvie姪Wgy3?a )gZjx.]p5>ҭXj(VtUz"z@p ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=WnMu? |Wn 񆱨x᧎O"M>CjZjzUߟ.u:,f~Xu?YxwM𧏵CKk;{l-4km _ ڧ-oxYN .)j ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@yx/Ǘ:uQwmx^ѽsx;\u "Hb}&NT-@̞h_x[|@<>(l moӬ13ht.D,9utt]_XAuuzRu+QZL_PPEg#g(2|Xox@[X_'ƽO:ƗL9|o:G$|#f7g;2j^)'#Ѧ4V?XSioSoƞ׬AxKFNn>ĺ|- ~/M_:6k_9gumPԮg{ˉI ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=W60]Σ:ֹqఒLVp~Sze-Xbѧ3x’Ii}th?g7? i|`:V?[/[B=|vDwb6%ŵ}YSu|9ɠЮt]eT}'KM6:y# JI4r:H@;z (5~?dk϶MG-tҫydm֑ 7C)7J*%w i^qwϷgu`ObyaBc~^gNJIsrڭ_wOV)?ߋτ>*xNWЬ|ixkƲO⨼#Ohm'5?˭B=Jm&Q1qx;wgOf'¿?_<e#JL =GV1ow_SiW<8mrUеCt=XN"*՞xuj{ 1PpZ*.9+rN*~l5*xf;12W*8!5LiT1tJ M?<-__Pφl5OZO>!C_>-}iZ /|Q?/G}[]wRG6o 3WÿxOq@_x]Gx&N|>+_pu>wQR0)0_]VujO0|K V ~⚪MҤ\SJrxX\,E V;b8_VdxVWO TK,C"xLsLJЫNźŚ/U7~luOZOZ%?)g7ڧ~1[ zUjv}axs>xww(U⧄=#t=[ +kd/zf"L|+-T$=NO:[uZMI9R8Ӆ UQT0?>?ٿo|ME|A&߄Z߇^ ([2|*-|UekxozdžγwO&K薯k?~ j7O945Zu&4x^i/شI*R:Yʦ)ʼJU}"5% ajL-ZѩRRs:ڻ`pxgy[Kb 2cBWÞ;~3 KxO~!ea_[ۋ77Z=|to\:O3|]>!/T-,xH 1A9|93~֚ԶAy~+XΏSEN ,URg(ƄFRԍHEsjccrSXl򬒮Aø|-~*b'Z4^RCfTrefU|4J YGx[wq[Oo_|YOW/]7(gğ.3K>ǩ~_n㿂 wwU|Nߊ4x+Ÿw_ 6CO'+~=b7Z--PWo _?kt>$Wo:_3⏏OAΙ.ÿ{ׅ<[ajG/ b%N 0xxzlcO%T*JaeIRqˉpaBmS nLeEzMYfO4%0kᅩy/1,Nǂh?@?>9K⛏;dx>eif)π>%i VwȾѴEۿhpx~ڃV0{?hO 0]⸼u>.kNo:x+Jԭ$o:^iN%LD0:RၦTc 5p4BN8 9ח4jʗa'_`jak *4qq[ԥN[|jO6̪*pX x**~{|B& ?43NeJ'mOUp0B|^|GԆ> $xƝ߅giykH%gh/97}-/]|ɩC4u'n7iziְ#ZjZe#G ^'<-(//[2⡊ʞ6_-dka%8R̼j}j[m߿uR jrk-E~xuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh|'ƵW.'%ؗQ1t`P,Ϟc [.x2^8ÍcFotwz5 3ú*OVx?G]_|3zVP_Zǫxw6Zm{mmy^Y̰[qYbךO?Zc7> .BO_tDŽƜ= [5ӽi4+œ+,L)­H#F5IJ:0j<.max\ *qO4BXңӥS:#8Ɲᆏ~<*M '-;|I"t^])}(idDW`ygX~/M7c.F~ xH/o#hUǜ&گU7q-_Ŷ[WfϳRgY93Npq.rJQ:RQǶPu&U9Z7|'  8߆to?X;xF[X0i# O"MbchM > ?/_6[#׃1Ln"M iM%aIP9-O똻}k̪ӬuZy)VO8% u>8Erťg΢Վ3 ƣ̱s c2`Pz)R8A(lgۢi YgGvm_XO|%lK7}]5qiqiK/<⯅'B|'x3Rx;^׷n< 'lCY4}& aӬ-㳴2TW,DZQ4TxέiʼRr)T|Cx:hLV{K>3Z'_^8 L!^ ƽlʮ7ZB4eBL_}߄ ~x|1}>-=o7&h<'i:RYVW$p`q9 W_|%W/k+ß<|;SW!eԼh־]M:iY^- խEVTn"N>o~VW\ԓnϳ9g9(19bL<bd7_0:էGUJU"M)o߇<= ~x>?!𯅼? cÞwiDҬtX%km{{۸<*e{%WlK3}n}4'TU4MSM[UԼ>f_z-/ndK9b+u$RrQsrrr)9I۽&w׭V:Ue[^?R&T:ZիRU*JRJ&۔Ʃk k[o juJ;fY>$]ۺ-kizڬ`]SQXA{r%<+Oiqs_<#kxF~G¾x?SԬbKKSi O:ơ6:I{Wol]I/ 4Z-k; )^ CQ?O^ ߇}|'ux5s>$ |Qȷf.+ӯ׫ѿi]:.Z!qC ~3xJ >nHsJ5k^-ѼkkngyPts!ե/xڵ)Ujb*15խ^"U=sQsU)JqɾGc<8^i3|sLfk_,Zү:RNu![:Ԝ)^:0SRsxgX|;o xG}͗į xgß#:M3ŶQ]EsoOJH]g? ~| גj3xkw|/˨L}.=/IӤUVK383M\v6jB3V cWVjԄT!Rg68A(BRNQQM$3x1u} fkQbcbל18=B գ:h40!>>kC@|5MV^fiedڦjε ީ7Oys4xcyjVX}77WQ<Vw %խ[4NȌA~ 13߃KoRuﴟi=ީt]Ĵ$u,2ts u[ eԱu1~x8TX|El/jt=Oe((.qMFn)*VQI_cԨ(((((((((((((((((((((((( Zo?DGWh_-j_P_ڥw[M+G㏈ZujT6v7/^x-nmvѼ7K<<{_ٷ@H>sj^/ojl|0[izY޻`%+g"jW.${A 06Z\I-WBwuxI'}7_T} Pe,M֛s$)Cg$Xub>xׅ|-Ѯ4Ok$) ؏|G"? W犼5|[xXnkM73Su7OtmBV5k+]OJt˸/OM;CO[[+ibH. 9ubz((((((((((((((((((((((((((((((:Duv g"֥n_k@Ex<=/%)v":6]4< yA4Qt:|ag;u-cXV7:n: x{7AoI%սKM`u_CR-8/; *"e/4RRUX -- Lnn|;>z {qӵx_W~'3|.I|qE37|P/EѼMkvv^!΍hy:=oT!* )F*]dJiaUWzF(sFӛQy(7nהWVie'37ƍ+VSL^|]ៃڶx.~ wmnmo Zf׃|;a{Ltol,cJ{m҄T();Jû5& +x\?`OԥuΒPq9L:u%f/>FxiĚ4vzriY}mR7ڴ](. >T5i+]]=kTٮOQ0B9*×<Нބx6M(+xyc#yWX(Լ#h؅U #F|.lu_L5MA_x>\=͎ſ| |]y5YKnknVY1=ʊ((((((((((((((((((((((((((:Duv g"֥n_k@Egǽ7Qdž/|QƗoix5xm_TO<iz6DմCVPc۫IxVOxiZ+Ov9W Cj?wQs]RMtw<=a-X%5 <.yuw7}'_>9Ě\h}%6 z=GOӯ׶m<`y>|xL/bϫxxG /Bx_Ú>ꗺN\iVv70׍}/+[鶾  :tmqwl- j΅{vjvKo;Ki;D#xKF8IJ.ҋM;'fNFkTVjRJJp]Ӵ>e FGž-O]|hU|sޥxB¾&Ҽs3_Et,O?|k/^S|o6O-㟅V7|;j/~χĨmnϊ mRm?Xw FX(Tץ1=XO8>J:R ҏ%8{< ̤fx !aZ18l^(apN,GԤs-3\|Uoῃ[Kψ[/g&U[b<7|_0/qƵ=4GJzxc@Yh|8?8IYz앦/&Oѵj>8Kk_tM3A5XjnX.zQ•Vt,ebB)ΪVX p^8ьZ4k}cC9cU/ u WhQpu:<6 젱t4ԋ-x_ uWֿ|/e~4WaҼMo s?8ƺw/íC͍>QӴu"o mgMºOI>3~x?:vh ~!>7o h&5y/k>;ռRoSVs%ixlm'Þw΋4On-{xAюR߆^ >/x{za8kQxnC.>Y#L ~3ll[}"A{us~+|8<0x> $g$i &U5;7!`oyk[KI-R%K Jpt'\s'VOg1jf\KL.Iў7a,?X8|E:uqtsԞ!NTJti(h7>?f5+Ož,g_=Kv;Ӿ-EZ>¶OOJ-7vm? ;>WF%#7OxWO_K5#)_ggO)<㿇>3dx{obyx7E5L> |@ 726:Y}[lo~ 7tx77~Zτu*-:E^F-$Khҷ^gGVZRЯ .tR)}VTNtTZY}G*:\ӍS>'3̳ `ffk*WkԭWpf0.uXJa? NQ|}5{Ś賹ծnu~Fu v[B-qzm$F #?<g,E w_ؼve /w,<+ϓ^,)N{%~$j1gZTwݤ*1Z$I=ĝG?z9_ jB|[k,~]ɨڼ60톏Osej^񕆟s}ZqkٿׁWImSWK/au;3F}W-;{NE K4QEk&G@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh-|"Z|4C]sxF}2KOxz5ux;" Yj̮F5崙׫(ҥ:Uq512SU爪)Bxq P5/}VJ2ȜNgG౹+6,$3LNmBz\-*dr5W9!JxZ2jڋgW'Ko'U(offM-FXI ?79[Wt Ƴ!蟳'_ $Ӽ#~qsVO7~RI{o~hַ:V"i Ŭ<\Ab9PJ)s=ZڦSq28[9Obq4yq[,`x E %8|~YW08YQO>|yu/:;-gY7¿@~)x]ohr_ 5={Ot5M{[VwŠi׾G ~A࿇|C|;^颷_类}[Cx`4rLhSIF|JcQԝGMEPRe*iZpK4pc2%Ogt1^ʭ,VY7TJl|*cIO #V2nh~8xź'Q=V:xcڎ~4[J?5)5+t#Ƣ@7L>C>%:޳Νk^Mn{SOkKcj1ɤ]EܺTKoy=KkR:c:ԣQNR)9)SW-fRRM8rL~ c)N2bpW8|epXVUKq(ՍHT[D?|M_ݛx?׊5{x|s;<5 Ѡ/xVzvx^)hf.#{ &X\Zҡt7>o< .=~OҴ[BQԯ$Q5;OT5ۙ${ Oke)9'*>Qo MSb9uwsSXOkpx֞#تLRuiӧ̨W*QN"tVg #IQHFHC A xgc xx_3|McH-4_^xkao࿅W# $ :( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=W<x KNl >.$}dž/4eҬu۫9o7YƽY|+ox1~jo =j~nGkK++4LZEwCp<)j}+ j XM/:A񽮫oii:ZwgouNv:zZk9k5'//|%W/u{QTu2}D֮jv|'4ۉ6VBQSFo4Q@P4/W-WM⳿l,c44J.c`ӯ" 1=ʊM6wM;4LNtӔ88IQkg&kM3g7? <'_ Wx -y/xO '_x7' þ9>jfN?=F^ϹКͮiikφ+#ž-e=῎~+Z}Wv|E}pjoN[}O^֡lLe()tNї#URxzR*ӫ:TYYG-'fVUVc+yv#ЩͨVPWaN'ʾ7Q]aN/>&bVJ8~Wgh믈?ě=C߆|'g൧Qto |8B?&$? xWR +N:׺ahCR>.TEbp^"?aeRКyB ʜ$.]kqi+jqtce8摋aW9(mC 6gW'U;h=CῈh/ɪmSzgŝ/}K a˛ q|_/omVm:&k;eI/g_>д3a-:K7t7D%%e&_PRXԯbVTU x[QQr5E^r*2>C;acԲia//HӅ94k0xNhfQX%BQ t#Fqm+@e _DӼ-? >}+oa v i#e_5 /Gԯ,VĿm ,~8Xwڿ/4~*ݮm >6Ѽ;_-~tK k׾ +{K JI5W0x@M3dڅ<;ynM]6NP5K;h z'_E|-w֊X-i'[j;O/ʹWa ,=SU<3k:<7jF^S:5wi-8f%6GJA_PPE utYD9ks+'4>;G(Oa|H,=!sI5C}OKx/@{ԓz4Z][Ğ{M"Þχ|OxS^;wtsO~4N`%IN AIsE9J|R+,'d} ^a0xו*ҧUGj:rWBnNZҨ!,A M^"~&o8^ZX&|u' 3\Tӵ'ѯ>C}iAExj-0|Ӿ7" O4_O㟂~&ծFyv<-߆ZxBZ 2[kY-fP{E֡*uBu,R4a]N &1g+IPLzӣu1U4aeCO/搯˫Bq5/Zj8l}Z0CJxgZqO[|Rv.GiC^?6cci/%yǏm? xK_ ~+i5|`xV_|"!е $?M[SzGkh5O j!b@>[R*J*8pkg]5W#I(Jn(ZrSeӔv/4噊`aC4qV G21pjU00ٷXļ$i`8c$F{%t[&?d_~6<nӨ9/~'x i^#Ijsg}Z_[W~+<7|2> G/txY}sږ]kI~7_^348|/}[vfI9ƺ"*rt#*Rs" Cʊh\G^&_s8`WN FW_ Vym 87Z:_4ԡa]W.Lžm:qo<#/ٟI>|"𝆃-C?~ ocrixU~ G7eմȾ |9ռOl|? ޳hm7> =_ƿ<7-Ʒ מ]{[X'ͶaJ˭"]l}Jm6UЭnլX.Z)V冩u8֥R!MWr,NQ% ӍKÅp,S g|bpat,V1X\yTkQUJl>>,Z _[>??2ϑ Ķ~}쏶?˵-zy/D~4W?#U},_aּqiPxW:-޼1f+)R1N3NU)ƌTZ.)7iZYë/\1-gïx#Oݵ ɡ|Z'Se>{mAmSZ\hZ\ƾMߏO Eza. LWJQy /®o/TugR}%N$2jU'Nq+FPsQVo| J/ _<6 C,F F 5UN)œ\*IUNg^exk"}^txoX K4[3P{Yd#h:?,|>׎cN'<GY;_k mx,MY_;m}S._`& b:Ϟj?'<9|=7|6hgmu C~-?t[7Gw?h#[;i~՞>u7x;ÿ +Ƕ~Gŋ^񇁼s+Z7uumoBլN+}>itnRY9v?Q..O2d\U0K'xF5䯎r`s._Vf \. _^g|7!|xo5kԵM3_5 ;/boMt|Jo |>YJxoI/"~̞/>|e:x?ƿ /|ET|9Mt-k:_- {X\t)axZPKʺVUP^֛St&~++eyM\ni<A:L 'YL2e0S'#W}{ (bj'ENn%hK/|I=Ǿ<6Yi#Zw|yh|C|QAxFIn`Wφm7O|5g۵?\?2ojoRL^%š[vf~;a׼O߈?7:ww/ʥupT?mס<ӯ\;¦Mb1uq?~#x _Um>ަľ%Ý/Ğ _iSQokZ߇4gX vwV:)m ⷇~V~x3~|eO0־6'ڏ|M{\I,|wX6pӭ )b%*8Ӡ8ӧzR>~eIV.ca0խx:P`1l6ƵUE`i5rG)F0?di|U4o>-r> >񥔚x#5ËoxŚKGԮ!ťiSǩiSئ{ m鿲7~x6_G½ <emx{Z5go>/oVW߉1gy|+ehMCxec 5Gt#*U8ᰓJ?Qm&'2p6.yuphʛ }(ȱ84*bUny(Ԕc*]4OaԿoړUßT5mk%GxxK5|!KDjiKmOM(꺧2~I~|?¶>#xF4t;Mxᧈ5Kw1j2K[y e%h? to?|5O?kn<:MwGxg~+| ^(wY9Qk , KlMYZxypM|,6X ٖgx_1` *O`1ts*ky#)7{ ;TOP͒z,zVVGMN'IeaxGMm^w7:4}2 LkxJ?;sbTyh:3 XTT +((((((((((((((((((((((((( Zo?DGWh_-j_P_8|s|6<7cox#&_|AмA= }oF}?zᆱY/omoouiXIe<}~>_j?% xGt?i} MejQ\_]Z]Z&aꚡ0<1k@u_B-WFYZe/,ḹ:G!K# YQf.e (Oݷ<-?q&{ />.$,,n𾛦Gm[:ޯrZxmGByפx@ o_4Yj'|-6uKm#Q4kKSDKH躔ZT$0NIŽ$)Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<+]_xu}KxCF4 w:lS#|e⿂_O¶:w+~.ĺh}–!O oZK|5g4W俚h5cww77a'}ҸYEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(>>>3Ğ0}jד|3|wgtdk'>\1j:ݎVڬu .dּm2Ksyžu6zO>*C|@[}K4z_RP쬵)?g {oj?WqEp^m_fLqQCYE,,a (?n4 ,o2x1i|AEw([@K Y5$uҗ'Wuo+ZvױՂxeeGiSl+~&xDjG?.O|_{_/Ii2xvS|%6ZhOM_N/ux+ru$+~Z_.v?<-{uŚG|y;඗Z?QgԴ _* FV?RFTaMM[csB 54]8ӕ(ԔŷokVPpXG,n(q9+NiRTr'ƖOFXZ8J**(r1~?_ >/?h2xc_uO h>/¶3x=-&~sOO7ŏ~oů ? K7AM.hme{Ŀ 6 gY \oZlWwK< SƝ|e\Eldr\iƄN8xίSŰfWWG~?_<[eO^'&;43 [_3^2Ҭ6Nh/|3n3ÚFhYSסZUVN՜cM}eIJjSJs##|w/~~_/|P_ ^)M[O'1k~ Λ|2aZx+i_4Z$7|Fu/x{ƽ^.ύ<3GּG7:Q#E.`UZ g[ʔNTT7V&5NUfn ʞb3aS0ea*SYypRf"a^5F4^COEYo|?1Ɩ#K?%3kVyx3V8Y5 ѡ_s QmKP}BYW~)~Ծ2~MG>(ދ? izW+u{Ná8,l7l4(Τ%YR\%>|L88 O BYa(,bqԳl gC=/މ/7eY?AyLnui%鬴ms58ֲ\fC[*̥*S9cy2OOTVPlUQ۷èh_~xN?g+ >%k myO)πWĽVi_ x^ѴQ4xd[XV mBZGuW~ w⎉_£|o.,Xj~b2үmttkqj yq|8V089jg8lWvH<{͞+N+!yS`"S`-,^oOk&߀v5|2~xH+▻NB67<7c[[/k6/ ķzn/xխh; _~П |3I3@x⹼Fv|hyg,4][5k]W3hӚY)c*­8G GOQFXڥ:$JirB^6;2lL*6<>3 RCIή^x\N\X&/5R)X|>"'Tpչ=7|\Wu h |tO7Ů|akZ|3дO3'}}gi|gkl:?-36E5-[Do xWԼ-?haΧnkB6eD,E"Qq.ZIST`$Sy^ǚP(~_GG9ccGK -W^0)Kb(Q_}GVNYp&ּO߂-d_òOS'~YCk43KnG~S:LE?cJW  WNSQPƵ[ԕzQY~w2l+7gP+0fa-lF(⡖f%sY:yeGO^~ V.ڞ|>]SZLJ_wa4VNIgmkpiZ>" q/k,<-gs{/{>.3y{^{xQNA <^ĭ<|tcptkƴUa֎.xRhFhEFnUT')^$ڌ[WvWKK|; ^ <ѼO_G=ki,_~(ß^/'icgh^=}FCeό?UJ(L.^ ecGSN;ePl %n+)[q*QK4:1)乪F01+K;]@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh_ ^a;>3',[Kx6â}G@].^N+ȅեg3Hmh{@?k.4;X4+v&!E&cqg|LjOjxoW>i:MZ[imckmgei [€$PA iQ `P (<|]^0l<_hw^1f_oAQk2yuO jiQnfK _ >]|\'>?:N[L/ Yg>Y|"&[W|'<1iSh:o][N q:u )ᦣ^4N5'^+//Ϟ]aeQ%b^g*=L8 9f&{YPP9ft6?[o_ oHxL⟌گÚ"}D];[(t-Il?hiӮ"f3⏆?Ѭ.ݯ,X xOL~5ψ|*╯|x-cT״ ӯ4?>?4_&K.M$RK׼؟^?ˋ|Awk4!6[+x§VR3;jX<@l]X[iJʬ9:8zPTe)F0r)r9VNsܤaa2({<&5ҥWV!Wjƥzkʭj?<} SV~xJadXվ!G[ۆnz^;냬wCԒO'l<sXxGƏ"_U~ l9_G?NQO 'B5y =fT<E GVcJ)FjNSrʜ*T6"HᥗeUxuե7 F ㍎SaםL5LD*¢Vc(b9D>u7H.ZDŽ'|ajvf֞.ʫ%^uJ"*VU*ܴUV_:T)`b5p~3R*m*xjrU}O+?>55g?g"!MfMN 8 ~k>$x[mOV_m x:|Y_]|<<>zZxGleKЬtO_Is0QrMcq^U t.ҚY~tڧOnc\nt#>$*lDV!b)-c+_p ޶j>/]wk|!~Af} >oko^njmn/|+jޙw6Mazb٭m'uh]]jXle_ ^&1BjrҜSqqѦ<%(~Y|Wou_GO~9f⿌/>]X.K៰˩%:u%|AUtAUݜbtU:T0nXF 1fFSRXn"U'RF1N<ܧ797\ok+F1I%dWhPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(~5i-zug]-cADWfO5|5mV;ksV6s^xoP[?;/ 뷞;.cK7to _5^׵k:I7隆He6&jU':犾x]-:戱ZE䮭=Μ5u|5h#pOY /4O,xBM]wú~#IS'Rosp7d ^Bu ‘Ku -uixgY|/o j Ѽm;g:2;h((((((((((((((((((((((((((((((( Zo?DGWh_-j_P\w|?453OPM"}OVo!*ЮY_[i~#eN5==&UmD=Qx$-ƙiuZ^xľ'v4Ѯ5k:wxDҧxcylXv:fhu[i^ioaiq$VV,ֶ"Q# _PP^O-+7{O?x]}R'ŏ|& OO%~ |kSism-4Yk1rH7L֓?t~<%>yc^ ~*$W|*xnm,񷆵Fl./S|_ x_Z⛯x{EЮ|O;{OikTzƭ%_w;WϽ\ Q@Q@Q@!!Af!UA,Ā$xI<Fxo:-|# >#]3_ahP-XjeՍq\5o<,LDaqXV'b0x"QaqXzbp 1*tQԥR2EEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ OE:O¿xA់AԧZx÷6ωo)Gl4k-]1մqkwoZoN<96{o-a?HQmC=.=v YZ{*^C~|O7^B'yɾxH񅮚Uo,!7(8]0>TD8+.)xl\c,5hVoI.nY[U+?6h/?a ᯉ_=e᫟|>~iZڷVhsk־"ѯ9j~+m_NJ~1~^)> ~0iKR q_Uz5ѩJz'Nz:K=WS[9Nx_~ (>%-xj.a?R/x3Kofx![,')!u952^xgA 2|Tw V^n/u8ټ N1E{f7\xiyHk gi-Z٬R ѝF:(^itimk|Mֻa #?f.TtCLvc\YW4'm ?Ledjb8.R8?V%eτ^⯇>?;SR74o w._G?<Τ-ZVljⵆ MOp8L#r##go&`3Œ/>KRм_}r_ß-wf?a7|Ga6:֍C_685< Ưa8̞.wf_ ˇhP*ex5hbRas 5δ)|T|%=i?Fw'.Un/eg]7j֋w j ։_hV@ZĨ>k3-4? iMY/otC:._O֤|f\8=_SyZ̳\E!I#G7 3 GW'Z\ T8lRJRᳯc1yD3:tፖY`=WM重d] O ƍ_8u8LJc|!++mkGԼ1iZiWQ y[[n~N|,~>?Wx&e} YZ5+? >ia &u_s 5{+mGUmW N'ܻ<,˃psy6],&?q<11X}l1g՞ mxRE>~пuOgŸ?DiO~cgc ~!/ x#>U> |%)}n5-^NO h/|o&GoWsEwW-|7EEվ.@`/Jt;jA~&!O$eaS/+ Q;?l4̪ n.̪ge,?xC/+_15Nt=_Rg[x=f_j^,tψ)ӵK_*ÞlRI6_PI"sc٣A? >!xc{_ZN'G~0>kzV^Z??> &}-m5/.ͳ ฾ f+::2ʲe-9&syeeQgX+o?~='&fjP OzVkĚrw xJ-چjї>'Mo>4~͞ IGI[MwF𮧦-x":~,Ş"W 2}}p"#'.K|Wk? +> W? Oź]xF7ϋ<_A{Ƈ/֗,L4pkF_>+d1hU%. P,'_kG1lf|SX0gUl>OŹ|5<6}c8+fQKBK_+.#UTWb*bZ1` ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@y׏#{R:Rk _ViGxzRm$4ltH _햃{|ӥi.'=wNtWkV:{4k>E7O햗h6V:-mŦXvptEFWH : 5 öמ ִ SKKcQ-r +D-RM"f/`kNMF)MM%oEӧRJ'VI(SN29;F0Sފ)6މ>Q:-~P֭jpiڕ.eIu{_C=:RSQmktj|R~ /^O⯄ CM3C/oA4KV<-fԡ!UbJ2gF2N9RqjjܵjLW;jRNk / SlƤʔ3juge¤.&2j]Oo=k_5 uopXZP%xJ:]=|+ȓZ٦-E<*/colM;w>03An: cJ[m/Dխ.th,lWn2)8Lb#0:YsJLsBi'J,quc\:\5WS)F[߆<*|{?/R|*:P>{ O'BKЎ0Z]_,~i> t_V~~h)y?-?h:ޑhH=94mRKlbtBhahN*9JLEJ3NSIS&Qw8xfw׫f'3/S_[jғ:J.Nu9bI˚N Ni֛hΟciޙZn%XG-]\$I$3F)Z]>q X4hox?zjgsAҭ"vجi.Gmn%N{ >PhV5al=)b1thPN2VZ:TS9FID : xzmv_(hw|K 2o6W0>{ewk~p _=xKB-ˬxŞ լMCچi%ocM%" )P2`3.'paynq42֎\}Cf9&T*O auF'NV |m\^W ³:s}^iH%ٴHĜ? Ͽ< P7?|VU_ }Oh< h~*SN/ʩHnSQ a88p0ь0IhaϨB(1"*) ~)B :>Klr >hqߥƉ%0ެ (B\pgioc; #VZJy^|AЭ;_\#Mx+4M{x^;S,>DŽ>xJ;׊|BtkG[T,JI=,.y8+Y_JX܃ f50y'&|9KR*9|\hVy*J t~߶_ÿhzgڳ5h^24}k?wWEm> XZXf+^4u~>^~ ( Zmލ"w O{}? ]ic>%'pgqO8x/Cx\>^ Ø7> O >k, ֎xFi{#7=ᏈZfOٛo|}SJesY| ? |<^JuxT̑:w6F;>w̸q~i8;=qFuu9,F*γL#ba*p!)O1R7l㰇WGr;X["ԢX#4 NWKU4}BMew p?ge #Y7gkKῃ|/n]wѴ'wVi3u#41b]ƞs5^kę[+|;OeX7%wF >c ,0ThⰎ.??~.~|?~xB?gFQ.4]ď^麎ys"!;584=MfðY6.-8uuuegss${Ki&I8s(,3JoY?:L.8f&"`08,YU'S =(@)xGYxS~ׂ|/ FZ_ (|MGş hnbA񗃼sfol]g!>ȺG:ln!xUմfK9q4${];sFlEL&"&/R5awh;.]$HZm]"/x'/O|,S=ďh"`ҭkկ.lIm ZƋrzWΗggOE2>1  mFVOh~>U}],:’c5YBĸTOQ֩94O72B9k}jY>?>oX<>qR/.tpyV.n?֫ԔxƟ?g%.G55i ~2<]?s A|E W5~? xc?e#(kS π ~,\Woh>ׅUڨ׮4pꬨK IEWRS)|Q)5c5 Z79{8ʹU\N<1ak|ˊ12T5q4)ciק<6 iO*S0qkԭSúOOo xg  ?<O[:߁ymh ~x{6ѦC<5&m>OSƙ{ xsGq-JÑ^xgW^vYu}!-oR)HhY-=[%Nĺܕ(C R5y9&V,>W Qҟ7c~)ƺX&a0gt19m G"\`rT[zj8HJuj^|A4m N׿@}hm񯏼 G ]q_Y/ms?h-ӢfMhvޡ%GӴW1NWWs<5¨jV>?|_/þ_|CXxW?~) o4"pBcOG|lhyg_ ONN6~8,tkߋ< PV~ ѼO C FHaǾдZ[2\Sq>p#quyI[nnj8kd_yLq,ShQG- ⡉˸{V\xB|L?c312n x񅕯 -EMvW9_eYn5/W#|aRWj\3ʱ\<\s/W! 0Y5,)ჽ_ ^~1E߇1x0?hozW|9Ú?-hoOPd>m't-f{[xZy5x_8NhtK|CY(4X7Z:U_ ~>=cV ͤ]xzS5?s2 ]OAᬳ᜸o.gg\?_bLĘ:^e>f'18f{bCԼX|eyU^~_~|-j~2?ƍ3K^^x^ÝOU4{ oᗃ;JbџTկ&>]7[V_Au=<-m&/B֩o<3'<Ǧ_j:*WKRu U_ŸCp<WpMCqy6#X\(ev;'`~[،lEfc1&:|0 <{⧍| xdþ_xK_+#>.ӵ=KOſ> iZo_j@ _ w?G F2ŏ4O_Rj^8~.s]~3<)l[o>ywiwmlτpY4 WrLj)wC!<ͱ8w q *[[ CSʲb8x_~߲m^%]*? ~g'oxE|w<'Ğx5}>$| ]+[д }{R$ϊ[5yZů:/</?=ZN|_M?hmK/ȼM{C M5}Cnyo7cayg<7C~.pFgn"g p9~>.kWo p9'1Ol>34O-/oX(xgHվ~ߟm{~$ws⭼?5_ ?|1h4X]J}<5|BԼP -bǿq m4/U¯<>8AeaMxML_ujVPz|oO$:଻ >uq/<8LgogըR^͸ q[,YgXƖ3q؜xcጾ(mKo;%Ox_[X-h'dcr A#./~x¾:!ͮx;:Gxu zIu==_݅8ҵ[;>{yOl8مL,M\>?b(8e 6]AڭJ %)TnmJE((((((((((((((((((((((((:Duv g"֥n_k@E1ZxUmFSL|Y-R-&;bLv_=$R(yeG hZo/|EWEZ}=8VCXg5;Hm?6O䬲) Z旦:k.XjV2\Z]O%I- mym,Ls4+ +1=?MԛVn5IOL2_c_1B-u{; ݶz揨-׋n.f^T:sV%(I];J-+ӳM]6Fb0pZ䯆Rh)B|hTC r-sBR&̏k'4k%lt?sIu{Z#tISek`CכO?v6~j{I \ߊ5ŕkIa5Ү >uH!k6;K).slNE`3$(Tؚx1:M1U(ԔU i =(aj>'Ʒ#$YxV^[3fEM{K|nt_j6:kZYd2ct :+Uؚ08| wtWE/{MԵ:\j:γ:y}]Jem5-`먠(((((((((((((((((((((((( Zo?DGWh_-j_P_xc<]ǿk;|eek_Muޛ{}X?_/ mg_to>"^Ÿ.m%ot-sſ tFI5jփrSøGG )֌BB.tq(=ۧ5xg1C/7ҩZlThnIR'f90_C&JU8YM76?eG_?ž[ڿžmzmu_/zE~\k_<-SItdž<t ? zo/ k? 5 xZ_ 6K<;m|H,dl_sټKGM~_7)Jr)OEyIޖZފիTV.zԭVvyUǚRnъJt_𶣥XxĚ++GmS tMF73Xx?>-|;-GMQmd&鏢OC;n+"ɺXi#yeTPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ |N</xI|Kw6/@SSW|-0N/6*B3|E~o i}ZXUxqXhӽϭQ]YO$ `lgQu}3NmT, tQfHom㹉fXXUITH$ @/Q@p~ i_4UkS^go[Z]Ǫg4ˈ/J!'Y.g4Ԝ)SSnm&]]фO(Bxn4)EJrg%{ɨɥgh_K?_"񗆼&w"/UbԔ%R7›oh~oO^Ϗ4MWQߎt_u톹kWVO\wiAkyyYM4R4=?Y[:De🊵46l,;.AvfK K%)jҥ:t RԡZc))ӔW*dԔtld/Tf9~&f8|m*SVhT9ҩhV+6sD [o[SHm&Դw'kk\]Ƽ#~~ Ũ>0Le'˥|}M|_yu ~tx~'|KLÖi`I~S$Ѧ5yS,MZS*QiRIrW)WQG5ċd5qvO)eW3de:c\F}ʱn4sQNoY[,W-Wnj}3ON)gH[Dҵohsb}mufw0 Ū[G@ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=WxG[x^LțQ->ly׈?i{;-. ⭏..?.uѦs>kOCj7Cko_b{{cgMOPkKyo-uM> "G+J{ .kH,\gg0 (dλf6__7ړy>wyښ~ɡkW|l״ >EZw_?uVzϏk|5Z6{jѼe^k{DMFRk֊rN*n/OWWeTܗm J ; Y:^_nNcRļ,fR)ϝO΢i^u'UIyk)W%i4{4c6?m jZlG"WRӮtY텣|V/Ꮟ|5τ5- h>.ֿg|sѵ}GK߃n-1g9>u/vnO?Oj'^Fj7 1F|OFZH_ ;t_z-_Վ 7V2>4[G#|EJɯ3]D`мYF24Vwo[(U<#`TRT~[n*j5eWTb8;5`(ckb2Jnuȥ1Xya΋=Nu噺1(GSL^«_kZJW-|!+е.EQUOZqr̆Yo{He_=h~˿ /(x>uV7>K}5{ ɪ?xz\Q<o[toVFWTmn1S t՝hrj*[/7HД-fTVR~~ b Õ*` kOjVi<'kǂYo޷iV,"𑾹6k,+ j/ga  K 濢j}ޱ^׆5ÖzXGkwuΉg]\ñjTFIʚt8j8ʔaZiQRy*IM*FS;S NX<'`)VO qrS|JƽLE8uv~KxwFwqZxNܫoZ|H_~#j:Yx 'o,|",5j>/|[kcO_|!Mo toM;@~,x#Þ:pIu[:-WMRK.ĩ?hƜ+RR+[6S:u(դjm0/SQP̰Yv+G1/ O ,x|WNx*? $O+^Ypiq>t5t ^*&b[[v!xoK_@}k|ele x>?XiZ׈)xNNhgiW]ƃi7ZVwB^<g kOhu i7Z<:fӯ&-և:~}*0),߅(, QITʨax,Ϫp.6қ |')Sm._{}g^/oΛY#់&լ|Y߃|CO Eo>4O>|i /x$mKD|%k%Kڷğ ]1ݬU-y649\j8lw \eq^k,>Ab8$Ge'q&WW)TcYeWQlž*wO?eOB_m|m#³7;i>u1⋙tC᭮q}^=;ⶉgis$NyW>)~,>Iףp9LU8*^eP1x5`*ೌ0oW29mj|u,vuxKo>0~ |oҧ|iÛMGynǿ <] yVZ 0iG4E]&~ j eA>=:|Q{c۹-Rմ ,)u]/I2w^NxPxsz/VYU:a] m\?߶7 [ESᶛx?> OC5]^??>|57F_kGi]}Tӥ|T|cK |D%yF;1qm\P(qz?xC][*/SE. SV6>E(>ĿT9[u? y}Y|ui| #AxiU1d, NOŲ̏L[gY7<]'OG/p9W٥,9f/L>]Gku鐈o_vCV;ft+iIGQ]I%WQ_xO9#-[HgU_UNJ9i*? vڗ>%3Ftݰ5ape)^1FR󬶶)kf N-l7K̿Wßk&<)s'5C~ Hg/ÿx3qru)KA-:ƺ/LƧ|j4 <Pǁ=g[|7vmq׶1^ڤWy_qg`|CWs :g/U4%r|\1q-q/ ߳׏🂼S-So~ɤ? .x.]Oš!-ޅyZ.kcGԯռaY,5:k-G{L|R|:MZx@~~0Iaƅ5?+NMr5-NMz;}myx;(Ϫx9Ĕeܣrlj۪\p^"enX|~/F+Yu, `zD|!Myoke#]{ZwqڅkV>t/iZ jV^M3iƞ^=f `~ߴÿ6YSw&/*Ү&{:[MkqwcO. (y>w 瘊xq *2Lۉ9}_B[ey;F!ƕj~&h.߅<[>Kkhzl/49x>t2,Ṭ.eN &jWVLb-)Os Sx 6>_ŝ[7[ټc>go|1q(1ïKEͣjk_ 5oNiz;Y#?i_ŏÍJXK|V6[,{J>D7 Ť 5/jچny^r~ xøV_6&xςqΞp+SJgi՞22/B8#fAno_(xF?+D|3PP4j/KF=֩%_Go,t/hmSL_ Oڗ[Sw?]|Lt| isS,5&˟OhY]Ew!ƹkʩV Y|8VS,VAGc':Xfga'r*eHb$goi0|mW߁?tcןٞ5m_Ygci<_мfQgA ΁͵ŌX^0D~1[GωHKBz?w(5M kti{Kc;{`s,|9Çh.3a~$̩dtsaFdϮׯ0󜊶sHfVm7|0񍿉(Ch"~!G2,BkqݧmprnVe/u1ԭMFFIs\wPψ~1hCcK}w:v9Ӏ /_RA4sٔ!ἪRhqmXV42YWq˜yno>4xJ-.d<WuM0]\KmxĞ0߉^wV/}CUhOx\OɭxZ}RCᶕ W?^m?_5UM14xZg5uy廁$53Z9FgqxuJ]˰8`+Vɸ2ZLOÁoo_C׵ jO꺾5Oڶow|8~<;?o x?Ş t/×LҼZu%uP8n+2kfM<dx8C\4̨c<n3,/ 0甡yLv`)n0eMuOmgsx9𝎗ڞV7z ᤱӵۍ^_ x]3<9q3;' Mxg#OGV3Osk^Kk2^ vjM"?x9?Ǻ1S8fR\I\uj?*2n([lVY~#0j_@gǽO\[x j>"oROrjw#JlGNhc]m]mѣ/: ."Y"O1Ο>[o{9ja^J.? |7¶> IĚΗ,G:GIe(.6k%41]x\x'^xS揠h6Y}K䉼/c$ۼuuPY0ɝwQ'Ey~m澾oٿ&|'g5C֢?6?V2Kp3^ՆC[4j&t(xǾ5'Ʒ/_ ? M<73?^5WSǟ&Ok?ǿCߌ5߃*Mgsh|9N]2]_׆E>iSʩt:jR^,6j.xT TZ7ZN5&EԣUax 'J~cಌNf%,e^a(sasΖ+ L^_@peݷ/_ n_mqn+ &^ ,^_?ƿ O ?GIomq[>0|?$~(I/ٞ[aVQkUS*R|d)J)>m#5(7pPe85|/UX'6C W$ե*VOٻGgPnZ㇛,Z>"i'ĿYҢ9wxር<[ x~|?jzN[ெ_~/xsúρtε๿i ?>*x7RVˆ񷁾zχ-E࿔\|ԮMW|n\*ՅWjƍʋTъ^JR19 c3 2K3C %xLn,>Uxyzx tɩRYЯVР~ xno|H!/>1fd]wl.<=?|=wS5 }.ŚsD6hQP|dE}@xS?O6WVkzmޟ.?x iXͫ oUKlٯ5lM ~Q^NOaFp`ZfQjqN?d^%LqY[?<\,G ̻,P 8 LX GK0L/JqX8ӎx/oS!Hռ=k Z ƚ?> Kt}V7#^ӭ=fsG⾵ j|U&G?ohtV$/ |+Σggo+IQl>O@'-SZ|C_G4#r?m{xzÞ0χcԬlѧxVSңPOx#m^[ @7#7K<QssN *ҧ ,yb>l*hU):Jr~eYu^2>0tpu1\7Ëa5r7<ɦd<,EU?yخ\+Ug آVpRp9Q<u w^?м5h~f 󋉖k^ {Ih5߃t7YR /.\v#-h7~9΅_lI&>(q+@eZuu :M/'C8 8y}f0/ͨW|djUƝXp 1WU9ќ.Zό? tOƚo gh_>7|u1)oGZ5rMj~zXIj^k :dwҿ_Ot) a ^¿ < ߅0x>V K ta :iX-oJhb]R8r?X#ne٥j8 .p{/^RS WVUkbkPu'Ǎ7Ƶo e:/? K_'׋> i^:Y|]NjxE<i^\^֟[< X|gKO>GټA xHn?^&uxBPЬmhϏ5O]_"ߞ>7ƓN{dy.AtOpx.e\7<*ObY6+ t#L9Mo/{[k/>e3H<~5//',qK/WI~6I=vyvLn5K}55{"ڂg xts,qN7-vO<+ʲv7W%e<6f؉`0iG*qqQυ|AiOPf }|/񷋾+,=>_ \:<1t A_Z]٭k9z~¤φ> xXju6eZ3vPxFƉi?ooiƾʳ A53,g)q69a40,S6ڶe[Y%<> mO>5/IO_㯅4P:oExkK xG^9cd1?gOٟwg?5hsG_x/6^,m{NJYuZwc/:`ெkGH.ĺztv"AǼ-cs6U673Rh1%>%s gpEsmKjp i'߳&V?>|L?kV{_w4#Uw},z]jv:wml x#M|Vo,/0|N>#KK@|Ohzv_ U5jV^g6q>#Å3Yqa ೎ʲ|&{α3^#p~!><s jdqJAź9Pa~6]7~? hzO:|MνqJ3_-Qne=/|4ޡhO-ٹk=+?fς>W|Gx'H3']ԒC}z~+a+N4_ 7MKVB嗧8rŜ18LFaȰywcW!˸ Ӗk9*p1gNcÙ.|oGTWa~?^4iO Wu>,O来k!^ sQj6ZO~'E=DA}i{kxӥ/kO |Oӵ=:$Gsݟ冭'tmr_&x7wqͪ,kp l-_[#8k*g )jxev{U$#q.j3 8ֆP0<7 &w'ī|i־#Gno~&ixmƪ/Qk5%_>[G_)eAn'[co#_>)IKǖ'%GwoQ5+^3uUS<SŜCN y p^M8_'csxON>#pL=| TɸSG)ӧZ{G7o?]wmm,[Gm#$weujz-K=J=CEɟQOq-O7~w_[']Pax>5gb8-e|nS<e>%c2yl&sj$]|=vqCQ|OkZo.wM:/uf{Vt6ss&i¯ Ժw/о@Ҽ/h?hO4mmOOPOGqXPiaH[|;\&Wǘ|<τr C/0cGy#Y]\''a3 Ę^s*V2r^#Y|=aYxRr[Wz߄K Mc`5 ,4w卯 qh4UCq ʸg[f!fw1̲,q:y5 ~QS-g9~%hfu h*a)ooY[.? k'AjשAboiw,ɅWwU>R]h-g Wߜ_h?7'`k(eg 8sA/ksi<x^. kuuf[ T<;ȸ )|Ɣ7ɱu &}̯8ңd$ %a, W0`2UX o?&|8-o7 2?x0DRC_ Ꮖv֚5MKQ MVӣbSPڋϚύ~ i_kޫY ?{Zڢn>3Q]i0^}Fi}Lj|E?^3Pγ| a a|W*]\. K# uƦeW#'O՜? ?~Wu~'Ëim&-JU{FGIkм9|>>uD?xTwu|#4jӾ%xz|{gAR᥾{]'~1+.0f3*e8|=̧oj?9fm][ Xl2ҩ縬!;E|Om#cKϊ^DҒ ^|?3ľc[xᾉ^͢Y?n+Z4?>uWYh4Z!?V8^.~ٽ,opOUͼ4nj=c2Y~1TἳTixSqOZK.pJp/J?f_mN~=w .)Լ9뿲KXtE,D K#g*x@f7Oڃ>(D^+w#;xo×ܶ~o(ҵ KfUׂnN-nrƾ9\VSľ&LO&7 _320&gX _2ܧֱY>Ticx /@aѼ=O$?_G|c .I`" W&]/tb-fU#M k_>xbƾ_>&x?m,44;}w=<?߉z|7I/ sihߏ|s<\^dlㆫEG9q_ 0yiyfWF#L#gRn/[:&Zg[.8Y[;$s(Y?j/|'V;_7f LO x]<%YNql s,6x]ؼ`2帬GaOfi#<jv/h? K"zsi#Yug " rͤFVSxסŋJ,v֞*];5٥ gwjt*5/~ '}7oGxV|4{gSY mڭơ}a2=ηgrs>ks'UΣgkb kz޻=1iZFm꺜Agw<1?hߴ~IDmρ=)5[cx4C~Z.K=kP'գYZF (cƻc~y|*_o+?pO>z?ھ׮kW|Ws iwtKM{^-Mu[{_ ?k-m]Y&sXciQ_iPIt%Rj7rMA)4i]KV7 KRT1aFU"3NӂjM\|oٗUgƝ[z~GV".%> zStAA5(A)91k/-}K6'*-WX )59F8wV5)J- K.O*B>*uH- %:xWFͩӫF9~*Z^̞$N+>oƵ ~$[jZFaŇ^/u P?"xZΓ]jB:ԠW w"+aF0ZF4eWF^gN\5 F|x^Tkc qA¶?R[7Tet0԰p8JL&c b"es7kcaFP7il,uE{Xgum!3ѼYZKlw~/B_NWQћa#NNP&n);ߺџ9upTpSӟ2WRQi"]x>/γqek?:牵F .+=MԧkJl%َ&G)Ŀe_g]/7~j:]7>|$;ztMam_)#,cu 3ÿ li03b((((((((((((((((((((((((((( Zo?DGWh_-j_P\/71xV_485OϤJ'{Fe.Z6-;GV_v6@|36%kI?m?xSQխIol%eմ #x6<96Úd:t7wZIfh$IKXkmA j: 7Jky,}3Om&5mZk]2]W_ouwS XMC[5-GY] Υ_7yw<}_@V%j+BnSC* _mI IЁXDth%Zۢ>sgI'x[ů |A^Zk~,xOJx;3+O_>!x=gBSSjeU F-ft,8Z0MO]Q𷎼;ujCv|!S~mSKĶ[ `d-mԝ/xnXEωWqˍ ?Y> |F&,5o_ImY>3U^4 hp22ԠSˇNeoexK)UEӟ7:kq*&++XLd+⥔uh{,ӭIjsaj*91t08nXjbaVUsd&(*Do,)5>IiY$:xB^ѭ|{xsľ1:<+#Z̗Z7A4+6B4ڌ' O~5$ßxvzs.ezm5ڬ[~-xsĺUݖfW/ d?W>xno?'x^_~.|kedž5O'菮[1G \j^ >OxTԤ|8m㯇7nMO*Yjq;/i7JÞ}l?~6ߴ6i >1|2|? ,= ^kZ{}GtV?k~ lt8uЬ/}ĶZ/ PY0ɝwQ'Ey~m澾oٿ&|'g5C֢ _pD=? >I5-瓡}CÇr|F !JwUB/jKC/{Z|˝{ ,n W6 b\eZ^Ush_WO/xW_|}g>yo@%D?OX1Ğlj/~Kk,V6桡G^j^|B>Y/> \6l|ԡS W<;࿀v^<~Ҥ"~&Ydؾ C?GVM*m,J0.s|ΌwQbWSMbTiGVω<};_⿉>  ߄+xw'|GWBT/:C\RV?xZR<u3Mv>,4Oۏמς7W7>5:KJ|/k Q[o~"Ӵoxii {mRUO)exzr_#FuZR#Ab,u,EZuIVT5VҥVSukG/N a1 \= Vp? .?<L.~Z, ^s{Whů~~. 5R~|/Դ:]7|ogG;mmcWZ-ּSiZ}io=N}6^\/hIe;4>9U|_C~ u4k3xN!xV>W\632^ҥR*xjJVJZSuxz剏,T.G1US,f<&OGa1ys$|.ÿ?gZG~8k/kD|Dgcź׊tiσ|)`!]7ǷKk-Ƴpn RSUcN+EQJ|ui)(GF'MƜ*x)Rxxq&.&8acMd)HWeG ^ʵ*굥,-,fH>]cMKo~W6~|Io\ӵO  _E-W7a>t~i߇uAd, cJ@jgs>t;~ڗt CƟ(߇V_a|C}wz?9i6uKtHX ,iS7J.^i9:t"J*\P|px<9yoa0(OZeTcIEùB1~?nil;_ l5]|Kj|y_S:?,<;G_V% žoBhR>*$π7___ 5/]_^OMAZZ x/᎓M#ǾsxYjwzJiS-ajԎ+*6|JO?j> ῂ~uU(6< C,k5\Z»m+?D~v @NIg_\Kj.ZÏQNGoM]ZZ[A %}.XӻX?i_f|{|Z|/-[LǽWz$ il>0#| |7;{U#}{Z.uzՆWG Bl4QaԩF]YNO;PQi=UO%K*7#u,Å`Uz8e2x˱t狯(pvjtcOSh=Ĩ/Ͽ~#Zh?oo? / h|Sw xD㹾Gu`ŔCzfOXG[UᯁUx3ƍN_BaЯINWkqф0jS*8}bl,N1u_4(N>Cl.*Y;4j9&sõ\n+ `3i3IVx,N"JXфS_ƞ/o7LElO>ӥ#/-xoi_Oj_4 H44:ۦQgnc="]+—G,~%WEYaROFdX:M2*clj0#Ʒgb0\f&ϥG <$Wk.#_ C7(]`5GŞ?g^ŧxo9W|s[Zך~,< g1.?(mUkk+u šߵow\Khn ͜?. agQ,ʭ\7cJ.%B _4#%YqJmBRpdUlv;(ס<O,Μ4b( 3eSFh*ץb'=ZKdZ;|D6ROe^f:U* ~>]ė&c֌-mΉoumytij?ˬZ|po 5h 63s C>|#{{_|?yx:1$Z/K⺖Ӻ]Nx BYuzRRF4剄KE•JuN9Jr9SMVg\FiSRN3ѥcTp4|>"kT2bpن cZ\"Tc9o/vxRhes9?g]/×>0ҎXZA:|?NuM3C|u4֮-"!voi~~3eR-'홠|tci*<5%]S[і=#'úҮNqɫ,-\MUhJJ:ITj]U:2tgSvT>WPaqhS¾/Y L1U!Ye u .]RX(Qs\MI`Te-8|IѦ|K= 7|9i>:?o""е9x7G3^ |Ako.7>xm9~DjwVgX~Z_ߵ #Hx?TFUAO/0|km6 OU駗a1S%9Yǁ1᧍~#|棭&ӼM7>2`E#SK+㿆`M?X|CswoT`Ž+P:t= .j1PQnI:pAJsՌg426cl\?">ҩJbF_',]j&T()eVa%xvF_^WIZWOtk?φ&F4ok`񶟨hrx__Ju;K/|$⦬n$<7-~HUC{7 S'a]W:7(3`[ ϵ4Ka0 9B.WNt_4e^kSUZrNt&NR(٦WdXfөBd ٦_8jXU7F<-\MX 0JJ>kxKG5cBH&w_[^ivڅƯH<9Vz~w<%^9|ɪY\ͦizE %3Ҵ/d_ ?^'ԵOxo6[l4+z4:֫-PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/ y[\:/#[ZӼ1[h%u}Q,&mܷQUy-/$`azgۆ~oZT.quf-ZYAtX᧖aknրt( Ʌ:K :+бy_YRwK8Z+}6e{Fm j(ti 70N.8;[M2{xfy푭乎(Z`?> Yh:~>g5+{x'[kW\Jֱ*]Ļ?!-_{ k(WŌ{kzC7ʷ+;xqPqRRn)T'*;ic{0/XJPʒTrs`qy}I71qt:MEN5<3>gigW ?~~/->!_^~Z]i>!񞑩x~ w;/tx+K)zgF: :sUӣeFJUJr 9iII8+*a, R:t11/ 8,+b*e1x ԭ SxxI+/MxoǟO?׾+獼/Kڽ K^j? <Iqui|9em;Fwe5 |=/|@_zď _x?I: >|{|?'KՠW u|˒)p#S+FQ8T b*7MWVΤ'>0b<.ԩ,aiexY\\儩ZUq/ xcP7ƿئK_ּ|(~ƾY~߇9axn? -ñx_懢i_ -5{\w%5cW{i/cpZsq̩S Ӥ~ʭL2KG^Ngza,UxOߋz<γ-/ƾ <#Zk hetCͅkO_]-CgRX\$jPK!J%5:+F%WIOrt).^ "JT(fYa}8CC-}waa' _r|5ڟ.jkohMHυ o/HNr}{Qzĺa~ɖw8?g|xHѮwx> h´֫  |6+jx_W𦕪[I_xT6!4酊 C**ThEK(JQ|ҫ 9N\H]*Pk ;Q|@XRG,JW W/)yi׭RyΞ ZůړO|3ixR;^;м+kho|9'ইi!b3>ZWZu15)5SržcZ9'L0h32tk|>)̫ԥI8VVU*NKٔn@;|gv}7¯_<3i?m\k:E56|0t-^k]:ǟ?bQNGOԼ(u6j:P|iTGo>mKOԴ=)Mxq̪SaԠ{hфk{8d':JrukKqXje96 z)`0Գ5BU*ѕ8uuS)T&Mtwc^qHTiM<+x f[jŝȲ J(E88UeNRYrբ GĒO02$f2:~[,޶(<TW8ͳ\sJʶ2aӂXjG7V{)6~>"j / 1k^vAeo~'_mY{ĺ߆~x3N"-tAN<5 F^÷kM]_w}S+BԧU*jgMMFU߶WJ> Aa'2k+b%c! $1FNiSWYfۯUWͪx Ph mo5t'K;K2 м>ӼSksO~^2Եxoº |1m'h^$K/|azAZg}[_W2|-W/g\~So\KS;eyfyNK_֡* B aѥN6u^cOK>̗⯇,ZZY|Te7^ o~=/-뺷/SR㵷m8嶛?q|:F?4|~O 8~/$G{NsA >>1Qℵ6մ7]̛*p(5Q:[դ(Ut=*=qr~I%Uu*u?E|DyZ7=>Ys?mUYO16, OFs([V;f,+ ՍuaF6_e^,ӿf|XwYxMxTe;$xǖ+bn>4+{]VDw~4Ҿ%IXXizƗ+ |>]F}3JtWwⲶ|QjjM3nX|,eUGތk^FkVz{LTg5YMNRJ:>Ώu87r\t)N,0LƤV/9_O1"8!YG,e |%˯w:7[ῄLtԴ=cFsuA^jx/K Py,e[xm}֕g%ʤ*kIթYK-]1مltZ4B"FqMWbj6cfqjSR@tkzO[jGOK4 O"K%ν=V=R3SӴT-:z>"MG_k|!/gO l_ ]~<sOJۢxQin?c]Fw [jZ۴Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<+柍Zgd=]o὇5?Y0cX|Qٹĺ~ [CFU뺕͵מ)`K#(qF񎫩''7 |^l𗏵HݮnU΂FRԦt xuV4WM-Ն_xgJ?SHOƣ]SB[zxWRԴ~#ϟ~4|OмC|b )^u?k-kwPx3:~-R jV<_d^!g[G PY0ǍwQ'E6UW;}?}\֢ ɆGߴ i~|FM3^-~:ONxT{5ݖe>ew>35ͦ“?g_ tڳF|m)3~ď?|7}e*]%xwBҵa:oN4+a<0[YQPXJxZ~TK 4d`]/Ұr!,F(YchX^%tFFuOhUȥ~:yh{mx >8x^]"?Z|Mk6xS'N?OK6k}_I9g E|}_bú߆IK>J&J~2p&()՜Via(ӡR81Rr b/(Ⰻ ܛ>ga*ԜlV]OWЫK b:5X~о"~КWſ?G| }G_eXԼῈ>+_[?6&>;}r. [Onx<N/Bi 7ORoÏ|\_~;^+> xRZtmN? jrxWEt\8ʗ 1W`9jjMqXµB TN*1Eѭ+~_O'3T1$F I.ol#pxE)C%x?]LgďUxs/ٷ5ƉB?j?uo 3#4?m|Uwki,W?SmWNб|ZЯh?;=gއߎWuKO>k>ҥдO 7["9~)Sx*TNUFT҇+6V檷G, x._(V\El-PIp1'ygW?xÿ$xca+񽧈-rMkծK ?=s~8ּ1_~4mri6kڟ߀?'^xύ<5_u{Oh_~ i>1ѵ-S4x/ĉ/s?ٚſTr5:qq+cpJHԥSBqye 0T* VSa1BtK pptp~EGżžʮgtG0˦zTp_ >_/[ǰ{|G6|>GWǯ|@;'g&w>ǿ^8uKg x/?~.jׅ"~"V7=?o_6$V|u~]oS4.)mxNoRе+}Vi4&_c)bpc,=lG(^-NFTiQB>IяqpWhU1yusJYFK8+T9]_/`2 F_Eb,CVPx{wx㗀lu]ON-ſ1=S7.~x;◄/x:|Ex?ɵKBŵŧ4G60>ݾ&x ~xw.xzܮi>n{,gP9U^ej4劅,,juBRhBӥ~MEql]ap%iWjvѵ#RCt,YO >س_mٻ“~'OjÛﵨ|yk:oOs,iu(1=zYV¬ izlo}6-_ͅQ4z¢UץAҕ8StN.ISTT\ (q>)cib1cet21Xp0uY0xGzXa+ROJj>I|h~Ԭ<=|cDt~ M%llk8luۋ]wNw>f#f9jxž.n?ρ>'|9^?@dW27I{+{~#]xW?^x3^Z]x/h"^(5ko2桨WOI&2:'u)և:њhSK(%Ȥ({Gc춦ԣ̳lX)fKpX\AixI<5lNb)ѧKנ5>lOC|~ n/vkO? Bv+KCw4DMe>8k_5:s3Wǝ6=VG+7zÔ🊚Q|x#隔mkiJWQt0xz 4c{,V>l]*xFX 8֥EN.ss~ʲႆO-J0x*Uu+Ύa8\57rBS"OL'|"_<{]Kᮣ߲;!,Z"xKhzƏc=?W+X%rjZ=z(u}7:x_.]Zyu >)nk{KRt(u9yeEw!p԰T7: 8c R%Uv.g Vo|U1:xj ם\q VU%9F ^|-α*PTw{.h3S0⣓RR2XK*"*{{/|wo5KIֵm (Cd@Y? x%\Euj? 4 \_j:XI⧃|buFU79t[G_I:vmxҮ5gaq4H-6UR JZ(b\-Hʬ*Ӆ5MTR.քn''gla*W㰘*V;3VWC.U.'SIwI=Wl  h.ukZT]ڝxj}xǖڎqwwr]=yşok:?h{ǟo>%]|{<2lo@nZ]My#Y FҼ;amEiqml"XmxT4U%坙b_PPEnMY|C fY_,r[EnPU ﮦӮk{kmbK (Kvjh~c2ϧ4c+u"O}u6p\G\k]m@־'=xH횅?+hn~t{<[vx'o`n闚YtSJ%j:6khׇ[[@oA6z kzN^iڅi S)BI:=;Q+.3M7ԢҳM݆̱J zJ`Ы XR^iӭN:sO"h1p7 2 ;Z7ԭgMJ M׭!|(&)ԡǁ8s=ufHo?|O_<{xfK7Dhl4b5TqT*MFRp爊eN:-%^:oj*ta–][b1xNW(+C S O UNgbx*xq]Ch_[+|Sz~!|Mllt>?xSQ<)?>Q|C$|6cϦ9.π[šowmCǞ=/~--#R?,G_UXX /Q𱰰oejt5#I:KP燕|Tf1iYVNҖCG/jX,\k B 9i/ m&QR))Q_FXxӍ.JFӧxzLߴ1{ZEt;7{? +a?Ayj[qu#8O게R?tT ,2:PT8tItۋ{^'٨7ZF~GK}+%O=Զ3y|OWY\xǞ.ewxĺgzqo95V𽮃~ie^\dh:R:nQtTd䒿j5QI-xLm)ѩ \=L Z *eZTeV;uiFj*P,T+JOgQu[ċ)k 6zawEL,|3ƺOch7fK/ RÝ?Ě+"kMokxZR nmx/CEnMSod9EjlrJT%GR J(F\rV9':僜0'ԫV⧇+[r ZEBPN3~x;|'^ox-W~3׏&hhVsiML[iXx ,e{M7Ccs^+IƉ[zO +ŏ~๷^8f?[ gMuiv6E.*8iO<1Ue5=s*,V1lV.T̪P*a],?WJ_XcXh_7DUY.CB58M޷uk|WF5qkqkj˫ x%D5{_8'4{;~x9I|SR{:?(I}OT𶣨\\j 5]SG𞡢Z ]_^Ӽcy:t,&g[~xcJƏx'-!𮍫Xxz+I, _~|*O/G׭!x¶˩O}uS^8O3^]jzDž| oR]\>fGlcq]g9SPF>ޟ:P4]Nj\%gOf2 F||& nqSONzU9+¦W٣f^/簗HW? hSk4w8^k˰i+X</?41~4W$5K_x_=^O-!?htxt-At5]N쩎ՕYNSqңF-R*pd(F2ܧ7)NnKę62lU8O K. R8*> F5kPN':3Vy~ɟ>Iǂ4ׄW8|@koZe6>"zM֏e?<1sk6Y> -K}ï x_,#k6|)kuk}jjzZ>\^XMu+J]\~&iJl54):0TJINt&i1֫`k9>OW8LR^#< 'xoxKIkO#gϋ<9;Tksi | ~(o;P[;H/l>>(S랾"&jg%rRF*14ۜRRnS5:ѣNVQ:nRp~ U*TJʊխԫV:Vx^<3,5=^ o4.gsivE^߈Wþ䴴k#_tST{oS֯o5 zf~ ]χ>3]9IǏZů ~_56>(x_W.&xs]ͣxtMfkO3YlNb5p4~(((((((((((((((((((:Duv g"֥n_k@E G/t~26"?GOWnm|)[{@SFhZ,cui < ⾑6z7Yl/}{|ڎ7o{il|4^i~#ylmO-/ ߀%9ń2\Mk氱K 6KK9n<@_PPE utYwyښ~ɡkQ@yŏ| 6]Dk}'V5[a}&E )C'fss9OO)2yK~Ӓ%gSܒ+?k?fSAh2|=Jh^FI~+h,|+!~i6]c-a+/|H>u}O%.leSߍ?kͧq~ 1l&qqxx'<=.PX^|Y.s[ktVucz BM'fZfԋ_0K쑘>{O :،F"N iU*֫RQJ8u'(ri0|IW|#~x#p{~>Wl< S1Zux-@Wk?lE }Rq#g& ~ kڥj6^Z4j6s'^i 4S1I_i˜,2p]\R~ Yҡe˸ 5 iah1 P͡Bœo+G>:5? _~ y |>]<h_U^.L_ |O?]Ǫ|6ï^Ԓ|{_%]Ɲ ⹱^"xVqgC+ELR<擫!Nyᳬ[Pj7 wgτ3 uPeᯇ~о_GB;iz=.j']np<o> ~xO渽¿#^C֟0M9@CJFw09qVo<K. l!Nyqb3RW  ӯZVjAO7MW[~$𶱥@!i$m2{.8n4%A(8߂< ᧇ -f&эψ5KĚiҴ/ j֚'-Ú5æhZ6Z3-b c2| 6zo^v׳z6K%ojd[˄^;l/asĿmjs8ڇ~e?ĝ ź޳KNWӦƗ%aT^OK:)/`2[#J6tS&xcFit-{Hhn>Zv_۴-Fͳi;1|98 uK˱Cap8ܣZuB441yv&n4q\N,^u` ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=_K/"$]+zw||+?Cga5oW)Դ=7T!KM:0޹ef/-4^_E;܇YTѼA7<-:G}KSҮt 5OZgF:]χ#T[=bHJ[{=Ý/VÐ$Vz5+-5]nG{ iyIE.dF4PY0ǍwQ'E6UW;}?}\֢ Ɇ>={d}gO-ݭ幂{6n̶O4R:ʝfa_)̲ Yf; aU'Mb)h7Ry*BN7Q]{]'LG5ګgmǞ+f7Y|Cú y!Ԭ KN#'5~ֿi ]6.>|OxCokar+ς:/WƷ~7گ5 4hMxG3,]/el ?,NxzL3ʶ7+QlG Sc+g5+B9m@5-?NM<+\%#xo[xJѿh]^Džl?_*o$|;oHm'lZ5'[ϰyI<)_3{8GG*xc4Wb? x4|5>3"0Tү|joR>f<~S_iG_o>-|Xe?n|!{X!ҥ!oo?~7(cᶙq0x__'Bo w5xú7.OÔ}[[^Ӭa]?(֦QV.# POi(|i_izLx;}+_DJ+s_j?__Zycৌoן0xR!oߴV~ 4u iR3SG*#3\S9pFQK=/ C*7 ^Y_p]Ξ#/pl+XZKiM᫝zOeƭoNxM.5 O2uwyc xA>xc~:exJjҾ+_ZKex::M2_=-o4ۋD=l+x>Q<>FK/ d;qNISf.Yb00|Ͱ| |(x?f|z_vg?g/UC]|SBÿ|i"]OG&Эu}7ZVzuƕ^_ E>*|Q/P?xvPK,;v𿁼/J[; &4O '! ;o8\s|y{ÜS:(r' ἓ $K/el } aԫSE~EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/8EGG~+֬=ί\iomcagѭͺ]G-ʹNkoqSol)~CUIVzE\@zeEI#5ߋ_ 5x[[ּai7l|!2K%#4,b_=6mckkp/P_PPEnMYKaX4\pڼY/aӭ4b;@ (KujBX~S ,d+R̰A}knI\mוa/oxH諩YiFߴ?~&xn:Fo||įw^(f/:źfmjþ"ѼEυ<ڶi׺}O W0hV((((((((((((((((((((((((((((:Duv g"֥n_k@E|Eɤ^O \4. Z>xƺ9 "נ<%nM2+kI5SMl׷p^⭶sKx>ᕎxSIֵ=q<F<"mV׵]7M*ICna-@0 ~ϟ ;#: |=O?h?=k@U-#M#W{4ƿnizYjmojV1*U=?Wn8Q@ PY0ɝwQ'Ey~m澾oٿ&|'g5C֢ ɆL뺌^nvi:,Oo5~7y;<]?G}싨 1ji{%M~:znkZ_~ \̖>iׯLfcy_c(_o?_OO5)A|MNJ4+V{Z~hM .tkK[ ĖVQK vTPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(˼{?u/ hNJ}'KKR cZ!5ch0jp ]2P n|Tfoxc^3פQ{M<6hӦ[{{W_<+Y{kKxK:}<@-Y/ č +xotI[hn~|,xo|m⧋S={\3.O][YAZΟm焿hr ?ssh o |Mw7 Ǥ%h/f\w}j6dۈbY FY8֎J3 ֝)׌NTe*%89qQO|OG O0fX̾q_!cYvab:5)Q XUF\Uj :PR:M=Iiᶉko%lt|U◁mڝvh9]_ jA==25C/z熾:#:?/ jz_H.m/=5.H5z k/JRxLJjU(֌ Qpt߾8ū'>*tUTQkUW:Y*p'* 0סU^*2TeO? >%|6ß x+ͦZ犴jB[OtՖ˅6(VI]?%Y|EgxgC6)ρX>(OM g`$Vi:]#ޣOD|Nxf5 ,YjןfWqktB˝\"j:Bt:U(VWҧ+JnŮk;&;qsrN,+-(by -\"9槌8qS*\qs|2>"VZxߊ=?B֯t:Rmo/4KFg 8%x[Wͳ<*ԣJg*e8a)ԯ:p8QFUe u')8m( /O)~?gS#??gA5[R5_Z>!kE'c>,Wcڮ%wauYw<>%4߅ 9OT+^-A>|e߉>i63^mfEZC6gv?(52 Kjp_P ,Uʸ=ƧBUĹ}څ< ĵ,LTia2L~s2Y{_7[v^=Iோ~{~6:.|-]2_h[ Iu>Nu 6-?Ꮅso=E;)<-ۿ 4e:UyuZy:xLj,=zcpiO_캕⧎l~գxrIH&{O 뺕gl4i!N#'_c|+ G q-a w/?ڕ~dmɭ)}wCOxOqwqGKx/qجUϸ{,|5}[xRbUtr܇O4eٮYb0iNT3'SL>_Сt mkI[մCWҴy54u='IOU=wv6E^C-̱4ڋf4߈ΉD 465]/5 7ᅦ>sZ*NH{K.#\4a )3^E!|?~W)Otlo'mP=XVKHL>~xw8|t djx__u-rMuJ֮2[C'HQ$}Lx#x 6~EC`!UO!ia0OпXxW~t G_Ij6~˻ Fu o k@"H]P?R{kտv!O]OdUm?ƾ?]}8|SxWu$ڵbyX<ٖ}WIc3*6، ƺ4+T+`iT*D6o~"~DZ|xnĖ_MucNмNP<mϬZmw垕54=Jm8/.3^Ig!ɸwĸUkՎ*XLÉ B3jVuJtEUHG 0~;h:xf˫^/Ŧ6 *(RllcH9usᯂ___xᏋ? |M㫍+^"_ x_Ś75 -mf[; U'6C}A/VC)߉1GR~^M:M7Œ}e Ys_~ľ7g~3(>5ď h_|!q} O.5O A #ֶƪIfw9u/bx_%ۋ(x?2g K>˲jңeeX\>opY>luRx,f^G3a?y-/><5 xE>(" wK4=rRk,W6#G9$Վ!7_~+V6 t?^վ!r%5{h mA$dW.7or٦15b2LMP{pLLpt4_Nx x X be:PaxE{5_\i[xWLMCY,Vc[hCk Ѭʸ_x;^3/Fx{Ưi^ oŝGuK/‡F޵G7Z_uK@"|=69<'sa܏Ì<<"RdU0f05(?D!xr,ތs!kv.I}]HuO[co!]Oo~.E Wý6GXuR-]vM> "~Ԯqr2Op.or} t)fOaiխU[;N R)*a[s?n9Ռ*N_mUP O K?%J|'? V&_mŦ{BSZҴ;kCMy U{FO^w?\xoAҭ'uoƧ\ =Jtyߨ3GwwYEo5m?%hdGù 80(ḣ)̲*reSC0QUSQaZ4jBX# Մjk/| KOt/ |5;R/Ŀ K6}GP>"k^𤶚k:σ3|L?L _d1L5iLzaEKjc!ݤ3o s*u\_ø%⬧pm}GS6L ~C1U8 Vi*'b3Y 2AL~pj/#4+xW+Y?t׍!lno4} mKSx-+5x3Y5/ho: j:nauPS6~?͎GI4Wᶛw>5M'UuZ/BN8?¿c/(~ |~7|Kc|;oƅzxOԴi~c8^3O|9l8?*gh./-n!vtϸPȧͲ'L\~WT^cg =\ x-ìGy';ʱU%_*X W_~?ǾUߌ /CЭDŽtOhRx?S|CB#IJu4C"`0KJ~ u}  xS[vk?~*xBtH7k.ޛψ@{aY#-|p>x<9gbJ<-boU'rTxkNY vgS 5^&2μKO⧉>x W~3۟ s\| Eo]Hejs^mLs}KSI-S"xO_6iKcٵkk&o|?.kyis֦{_:)w^1㎼?˄0YxqG8,*091y6+3`fp -<]l8z*n)k3G_[?<]O*]MmG_ |;%צtcރ_6vu=Q>|)񨲰J~"C G_wY1`o>O+x!ZwVW,Pw;v|oY'0*gyLBryni6^jMjShhƕ-;Rk Vq x#?mY.~+5|.hI{KU Zm'Z9b{u&d62Oqf}YpgYiʬ%̳liC.g,& Z e7O9vmaj*k$Ϗ?7<i#aW<+]xIֵ+F癩H5K{[JDiPſ3_[#՗<<3Oj7[|A%71g\Og?jrY؂uyaku;g9?]W1x2n/˸g2l2~qq a+9[fXO]0POO#%eO/ǚoh1|>wtxkXl>h>Q04,2_co⎝7᷋\xݣOtqǥAxK|Qk&ks`kz6j6Me|9|]VȸoÎ7γZ80 )>!q>Weweʘi' :18"* `kV >(??.|tKy7|__X |j>Ca$!4o^ o#|eS~!Zo|Dbpeg5b^jO<>|T/4}[qM?R\l&o<HnuءM.+0 x^) P.wfIt>KQmQ-rח $a\;S1)n" (rܻ;b v3 KQ+F<aT: !RKҴT4xF^$M~Nҭ-.۝R;nu[;tot][[ܬrDE8PXı9B<$@\#+81rl=qX-Լ=i|mq Ew&xNӬ#/񏌼+,zzbiBQ'xo;Ok8<{|Q O|0|k&xM= ZO{-ե.<;O_ FGCau]o|>>jW&Լ3h$cZ|s/ٓN¶~6? ukܦma(Mx dRH%iT*c)*P3Ud=*JR/ss:j`jaF.+.RpXw?c^9j٘lUJ\<IGI |s?|B>Z_qk>h:-|Su?|-MMbLx~A{ ?Ok!N!kk##DQǞGƟ _/t  V{\GPDž|INmׇťݟ:nu:8=8F2ҧ9Baykyj3ŷeUI_Y̲'N/!NUSWecʫav܅\XhG ӯ[5 |X<=j[h>~gL^%|E[o3 O·gw-]-dУ{8o.o4G_k~'~^C-j]HMޱ >cIWKYioOiLiV%ORXj)?mɏJ>-凋K -[֨,Uc/aՉrl[(bp,7}G1+T2JYgyl3N(Ƶoϸ>xş)[W%`ѿ *(܍Rᗋ$x6?0='Y3ͬxoï6>gLz^Eڍcgf9QHn JR^錷RVJFu^eJj)TvWaV4Փ8M噂##)' n>zp8\LcO^p N=!'_ /k(M,>f|; dO=dK׈5+Vs,wwoyzf_hΝc::[څm ͝r]D$2̒#) piWV *Bg*uhէ%:uiTԧ8p$IqGIaƋiڇ;owZx s_QOEѭa&-dXZyq.'LsGpN01+,lx,/1TB > |Cl?c- -k]k'A{}gEjctoepx&N.Ce\kG,q&7N#|^ ןpϲ%µOĮK8WYX@#Yڿ>2|bd^I?xGf~xmׂ/4x H׼Kk>_W :vy w}Iou-S-a_럳ƹ|8/SN>ǚ[wcj~9Ęx鿳_t=K\̆3u|blGXY&t_UP}7U'x2<e|¹Y*r_10 QTb;Rk&R'=?4F=x|ׇ׌ER&x6¾=WVv M!? _f8vjrLxsL&I˲\ˇg-LχK.LF")i=FN▁ukdTu\ZT2\ޟh:.? .m]cP5}S_|!w|;\x~I-4߆~iVVIn_wZՔ[BhUb|%ρ.|2e>ïş=+~,+ >]_\;~$~"p`s3pC3 +p_q as-™n#s0`2ۇ+ؼ4sLf7. >,>!xcLUǂৃbs⯃9tmCVG|U[74_-/.Pn"χ"W?|gqἿG/xBҴ/x!ѼE|/h"tok\7?9O0acv8XN41^0P>p.3'lxx\B]b-\O6Gq;jcU,&iBNp|WR >p^A ?*|g#4R#4RG%< _Yx^q>7{ C_þ;HG? tg|)_ku_>3qfÞ/"{~,~'A^-i=jEM,Z|~f[Ueyyʱ|/*,O3~&\%ke<^ q/G7o[,RαO4[f?d~O ] $ω6?YԼWo~5sXh;t_:S:Oa[/W~_oYjk[x堞W>#:ŮQ~'|Ky*:'FO x3V|a(G>#[i|_t/Z6hVo g0p'> f85l&}Ur'<}JV> beN_~oOO޿Fj;O)/&𾏠V˪x@ ⏇:.{4>-Mr|E,|e\Zj?Ofp,|9S}˰9G ĸn$`*fZ9 Y>iَM<.18^O9N}O_/'^O8Z1W\>k:/ğ||jnj9>< WM5xƚ?K?7iGDdz6Rk7 ~1K=?⟆rx&mi-.K \K)At˻iSgG48_qx4r/' ˖h1K#x,Nu3Tp5q| ̸*d_'U4(->ݟ72[-|~ZWM~?ǫy7j<=FrX;xw^e| kº&?:WNqjVͦxþ- _&eR{Ւ|\uBKG)/v]ᾍᏇih - 'Ğ+|%hY|=WnKn*"mE61/253> ,5U|7)'!;1YKeHT?s\!!*|xmPI4g'^ ?`-/i>5{Oj~;-B:4;+/JҴЯ9&м[&.w M3̖[ž5nkV㾛AEz_ämΫxV K;;3񏆞crqx<mÙcFY6L|[-6Ox:׋ig~1ͶuE}sD,|? CSVMZA^!?1]{ⷅ~-^Ïiu?g~"x>+xjOe_|J^1-x#6<|?Yyyɸx\I,^EqY_-¯ c8vaj)ac3>6*x7|eE|0;'V4K? wM'X[Vگ&4k:[+\x'Uiw,x\|5/,o<ڋ|W3x-ƥkئ塸lmMet1cz*pl08C8\+[bi>8_GqNqdu:s9gJ1YVFc~uf"g#C5N=𿇵? #?gȼi{xJ}f}[/C᯲1_kjGC~Mt2J9/$4fu&¶2|$h#ZHč1uxq 8O7 ˅aõxkd9ÕqS\=LjXL&]eF_x?hg ߆)2o|9?sx ğ5Ož,~Mo{C7MIjZ~2> l˫}S:Uׅ"-!6+eCFc8W"eX\YE\.7ĵ'Ohמf9MIft+x;Vk{Vofb߈~7hk~qO_VO BAw<\l?K~?şӾ<3Zx~OQi k|OZmӡS̫pď7tx7,1vm]0>&ጢx kYJ%a诋6_lh~_~6<{~'h>.JPiE"~ ".sPxV~wwjJť_VLFHtg 5_IKM?㷄GF78tWMgk_&AEw{5 BY 1 (Uޮ3 p?q>U9ˈdپMxeq9/.q,’)xSeĹ\]>"<4OL7tu7ϊ>x#-7ⅾxECq+_~k=WѬdN>5_X2_|_~x>_:o/#E-f[5Z_o@.<'WOv%׆t_E4oV<9efEk2%Lenj)3VfpX̋ _*_d0a`20~.cß~ k|Z:"~*KQkz-׎|Aⷉ|]vjgEᾣؑ?xzo0\;piN##ʕZUƳqO'q>+ʩ\+ccɲ1fxebO>1m/P׈tK't4gmn TK ]ϩZZi d4Z^&b[FiJ|Wh` ( ( ( ( ( ( ( ( ( +Z}x=?*]|;𭝧u0)tU_"% y|?54幸E#iW sq-Ӏ'>|8e^j|Hnotpo{lM[1}k Ņnc5F@W1/375|BUm; ߆ īx?><m-gtzNlDҳK(I#3X{s:JJ$:96)MRm6mV'+1^*JV&JEzsZzZjNNu*T97)IQP`PEPEPEPUl+;;Q4B+;; KYH.mn`ḷ)wDdb өRHU9ҫJqN9J)Ԅ8N-Je$Mx^c}+ |? Т ? K4åx@:).%y#id03 vmk3qUنa՞#c15*qxUz+b15TZR990( ( ( ( ( (D[hz>ewjݞYiVZֽ\jqocMk:ާ_ȍwWshigi1] N,4XZ5|Qia1m_]Ca)j/߃sLe,~VY1Z9ZLe*! vf 9a1Q ~ Fp֊ ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=9 Ś.xIm?I\߆ >(|Imec? Ѫ6{9gNv^}ƾ!>'iOM~Nx6~ {uwBrx^TՅxoC[=b)tVM[o -▟ishj=OMODI|Ev~ssS‘~DH?w?x_ƿ{h:^u]S+i/$q034eMqq8Bk+u5PY0ɝwQ'Ey~m澾oٿ&|'g5C֢  ~~ _/t|VdžxR=[TwKW:[jڬizb]5:,b߲}tr|+M]7AOx;.>m>(?\u5S~Uᧁ,޼!-丑9~ڕ-/^7uk*Jo#ͽF[Y"/s4SCu2Yizt-VCxcUX/$H-5+]FuAt |=Z ֯ #Ӵm"Su66Eo;=GZkĚ4OjN\ғU7L[؛}~$J(|RQqR|N*mݦXӡ[aj5c8BTN#ZE*pp%9-^I4xO?h?? g|]'E~.k_7|k*ZW"7ߦuo [PL?WZ|\\7W>x_0ihß'o^ 𞧦T:&53S#7ZgDet1:X~޶NL^"pIӕ<uo->odž|]oD'5^/g RY}gk}xPyҕ?mR4/jB<)RSNF;II»b<>`aalKC2~,l'.ai[B4Tyf!^xlz__~O_i__Uo<5JxNJfڇQ2➙럇z-.Nt-c_Tz+펭p4MԆKVU+ӥWRBY{>hBtj5|\1Sc0V]: }\NiPx˲ZHܕ ?rBXWuueO7 g;:}^lue9,TT3IԞ) E,.6/ ?i? 365mF{V%5T<-mu{GDnӼsn ,?h?n;Α|㋏,G-<g37MOkv^ҬP]PqZXhh5fg^hҎإ9F,-HMNXHЊ~ԯFvmO,^1C(#Gɱ|D+ȩ唡k9)ESf_xV]'k8~Ӿ#|%u_ԧmFoxogSk_Ƈwckw1Bе]&O0GMߋ|E߃xs >&xA>$x6 +ji4|7w$jZtkcG?VahPG隻2ܱISZ'*xw l4 :u׶9UztFn T[r:<.cVQbpa, 0&2V&Zx*8oO/~Y4jv5g𥞵bE׵xuOM?|'1xY,-o_ w~(47MA.u ^+fMZ]jgW)֒J{WEPKJVPF/ؘTrד5+5x.t2su{Y7o _-> xQᴂ7Wƛ˛S]=G4/[LgݼrUJZSN"Wα5(T%T u0QcsSx 8ֆ`8{ JMWkq4~(|=xw>!ῌ|1O=ᖻ~^|<׼/?;~*K>ms@6WZ6lS?(5W'|<5[/=> _? <ڬ?.z|3~+VGm3_|^q,%ct〯GPce_)+'_Pʬ?)`Ʀa^hTgOTDŽ~+/ړS<Xj?hgo#"1[H\麂GyIsiߵ|y_9t| mZ$3uDŽp f_[bX偍ٌ7U j1:X|b^Dҫg@|Fx[?gO5Q2CƷ'giU/G|{n;ksO;῏|Y ~ 6:ޗ^ A Ǜ^C -әvZ\\4p5|5*8aVk*oMVPQrJMp/JN(~&gr"py>:xaFuap20jRsң*jK:wN;)D|GԼ o*|xkٗ_|`g;mSWooW'4Heg|/9M7'OӢZ_/hښ4m}o>%޳kf> ݸ?Ŀ7|>wN?S׼s KO]x|kǀ>0|D>֭=ŝq\]MS; R,E8lDŶ_BΕ[)'IҧaaeOLVgܫ qҨ$<;ҩJeFK3ef/CSZ>Y[9[cBwEkmox@olok>VPՋۗCo'_Gc="=G^= _({摫xm#R{w7PAb1 ڛGOǫïqxV^~x2:'+=GsI^K>wAjRi~Ͽ-w zZw=>xsÑh^&Aßྻ}Qn--fm73~ҕIׅ4nXhFrEZJtS˩)WK=ȟ[:9 Mzpl <8VɨQ} =)øs <]CSKּ}0|Y7__u;,&a Q- ntmI5'KAw|$xxw+jVpڶ>Uֵ[ 4m+ĺkZYӥ.li0\=Le%!ВT(hP)5 )EAdY.U < 2c(QcVjYU*0( ;:S:4OiZ_x3P5yxZ-ΣjSĞ#4O(oj"ҴQ.tMNZ><_>5|W,YgM>xtZ|3cƾ*op>@|Wk>$M{n<e;N ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@Io0iO] o]F Wth^Ǿ `Shu-gkq狾 O~#i^+Ƒ#BDžﵭGW+k>Mc5wM;Vo!Ԣ` ]p5=b7~|{o#N%ŵj+ۛk{UW|byKV_a_tOx_E🇴+JkmcѴM 4[{y iwydYew6t+Kѭ?IPյit+k iu]U׵NX-b)5 o\ԵgWt7:{=I}PX@|ID ML'Iei$lR4-$WBmbtKhn*%ga D3Gm<-.FPhٯE? x#σ o xs7<.x{||'&>8[_hZ7&j\ַ6G> gxΙgO~6^]x/Ix/7!G%-P[]_cZ iJgX.zê*{o5GVpu#;Pu84Ͱ9 xo9\8f/?O O bJ/Xʧ~~'=_-r_|G?f/\_ {ᵗ'E𖡮?b }ڽ~%4ztMZ!n/K>'wn*OK_~5_iWMsľ;6:u柯s;V[/ ۮft><>Q]J0]:o EaoIT:wUiRƛR(GOwO||5)y%XPaJ+q#O~(^5_MW]~|D+x=KV.|C-\h//e.mO/Ɵ_|wyP~"x[5߅>2o0᎙"(x|ڦ=kOJ~IKeE҅g,[J9|}Zx{B$##jJӇ_r`*O3UR{,>WµQe8FSa ׎ UnJsD#jG)|_x/gZ698.|5_JOYxVM(O^뚆O>5/_i>,G6 NÝ.OZw:#Y㏈"Z74sű!ĺ~xEfy;(ƥ:piO[ [ /*^ƞNyF9Nu>MөKعT|Rܺ/ ln Wd쒧W.WĪeJN*>xl^XTp bwIq$JMn|Co>|%l#yu^ fC|wNүIЬ?4_<9i|AB9xSmC}]x:'еkcΡT!,U)PSj`Q<\'^4gNIHP*TRxc㖁ᯗxc~ :,-.4it.3Ķ)<_㉼HM4'y-xG|>,x/džBCHҴ^[z :7o爬4-h.T(J wV*bӝF2zI*UV+QʥtW=L¶i 2:iy.3K!Zg*fm, }"]_UnΧ.Vԭ^_ ֱh?}u)5]&kfVӡ.oymSCKSҤLlڂjlYe9ug Moߪجl8EaP$u?ghFcw6|K?oZŨmyjz/8"[j:*yK"M!|:S9z8\=ZtkJb! t)Гx(^#T*)a2¶f6P`,-Wd5)8~|6hs"߳/4;/x~#x <GѾ~СK9X|u4;]= h 7:|n線Ϻ|I#\-<1~ռx'JՍ~PxjKsXl$<1 eUa牕xaӪTFmуj({:~佴7ˌ2\UNx.28,Nc m J5|Ž&O/qu1T> W/!oK}⏎_>"'g[~| ~^O|M_<[)u [~a gk~?+FΉ~ nmY~W7O_‘kz׃t|9đ^<[.ψ)_ j^IM,MSp uqPNܭ6ѝXJRN*tFi)s#+ eӇ`27*U#Ol-aPx3S_~.>_|-Ծ ''kJ5/j~8ޗźFizK-1***5԰N/էS c,EEBħ(F8wMFi51q~+[βrFa{Bl <2Z: xoeN"W|:mx[?N/឵NWx|m-bKY[Sx:ߏu屶k= ]q໩'&>﷟ڼm/O_o?:t?l|쯰SXa}kgRIGU ^)ч^t7(xϳ1aQ1axϸj8& :'BhЄ(TBWk8??@mf/,:kÚ'<]jG(/|\R"].ѮݎGj #ÿOPW|EF%Wxƚ6i=>Ҿ7Ry5ܴ:\zdkT0XF3Tq(ѨXGSIRI.s43zbiEeR">0ppX\5ZuB bJq8 M_e5τE!+~-CM/>&O"ӴYx}uG6߲_/ZW?dt_ xGºسO5ӣ Ğ'wXȍ[/q5i׭*J?8ʧY^UfO~Ο+tU*J7:a3,}\nSWSYʮ2*,6STpsa58𫋯h4Z\#1vP^W@ּ;GCx^l|g^kIyXjzGmisiFwi.{O70ms WIż c4r*3$:1V+eoJ+/xOF>"xOJ%s¾ 熾0Ajf(gxHд]QռE}ɭ,zޓcc4s׾;χ?BE_S =z=WJΛab KzKi\}3x+w>uψM(5mw~/ͼ7Oty__h`PY0ɝwQ'Ey~m澾oٿ&|'g5C֯5K4^By:?N<8|g jLy juQd+J^=̹׻|7}25s`+qE͆U~^:/-Xg5COՇ&?CC/F𥷁 2)ׇƞ%;t5&|k+5zwtu>$<3gN|goOڥGтuZJqoX?l:^Ԅ*TF5ۧҰ\3gy<[a<NjyUgAˣ3g,n/ yUf/2 ,άP'7|#?]{l?>M{1yx?yeúo~#kw`k\I-RPۻlh/~ΖZ֛ڧ?j w&w;_xglMCW}6waxcz֏j,qoO RJ5! ևʥ\Sx>IYRuۂ"1eYתq%QహL,s?pUcaJUCů/9Z;*.{zڂ;(<go|>ែ RK[fo ci퍍pUoᬺGKo'ź%>)|s:k8 l?hO{^𾿮ݼs¿Zt {gxN8&/KWK4x$Tc T㎎# QB)R)sJP!(ƫ!8R0y<`ЖAd5rl.;-X,G סĴ| ZkNmң5| ?~K] ߋ4O*13&\>#xX1s=sVӼAxKUuk?B5gğ m~(Kg'IK_ݾ"/u-gZiv_m<h߅,aQ[mn/]u/Tu0x|V2~CBXaJkW)S'_:ҍIbUi)T)%/?<cKW> I\д/[|3վ {mjM 4? N~I|lO[wog[ּ+C>'xV_ X趾&¿7D鷞Ӭ__;?g*|<|B? ~.uZotVJ,f_״渖wYt?^j!~|!w tK^V5;G>cK[ ^sjKw/+PJ1PrbR* QS*VVpTF+ӡ'QԣJfYoʹ U:ytrfL=\W v][?ekʦ*OtXlڇ|s㯉 ᳬAu? YC{}x~ m{_ ďxS^s:;ڧr] o=CcWc|;n~7K 5+x3Wc|'׼}eo+|t(5!.ڷ¿Icox]ӧ?kDt`Eso6iwQ' ~1%{~|R⾇Y>mj_ >xsZ>{Y&bmƚf۬FKZӭ +Ul,֯IGAjS:_X*j\K7k9N *# Na2~=P3ӣÓsL/|noWÿd.:~!ώu6:^mkZƵOe|U}|eYY0Х<.&H)ΕL385 EV3MJ+X-\_&3 N59LqW uhNi(V)tGRp+Q7#z#~? MxV|so5/hw"QfsTTz:Ԛ6 O\i[_E5Gڍ9Ԭ"V<eZiz]j:J-t" (,T!)VNSXP')Q֊\SZ/>jML_<.,Lx a+(a4Zt*u0gR.1?ˬZ|po 5h 63s C>|#{{_|?yx:1$Z/K⺖lj.ퟀj:nm57ե.= ]#ׇ%Mwƞfk )Yԭq/k* RRJtjҊU$Uوʔs 2i֎:[ &X8ՊY)B'F!5YQ 5//7'σ>ᤞ0Ҿ&~7?jn#K|u7ú}>_O>NE,/,~6x>WK/:W>9m o&Dм(J^9ƚvh /]}Pm`=pJn1%T^9aaU/J8UJg(~֤5?g%:>eyvWG4%a\|OL&&9"J6Cp/~˾v|P$Y&-oú׈46ė>\Vein. H炿j]_m5_6/~4j>=5}gOxPh?Oi2#_֑SG5ƟVŨIT!N`SU9rSSSnN:icsl6K ,M3|~3PْJuV"8NTN?ٯ q&:j6 _ lM"OsK^hBhC*WXA{_|xߊ|)xG/C5E}ǹMDxJu?>7~#PU{KSx,r[\\tyd'B*хLMթFs SU)ISr J8k᎖F]`ؾOn#f1dpeiO_2_O  ,hbe  _xoeMǂWU΍/ M>'4wFZkwҡ2A8|PmSOִ[<]LJԴ. Kké,I_~#е_h^4|7s)u& SPf[u>д+&:\А oAx[: E"5 xOڼ75u::馜^ /hZIj:>Y:]<-v&y% HIdyd W]+ (ayRBN#t,^GT爐5MlQ{},Z+&뺌e.+讒h?t:%.;QlKv!ѵyndo Zľ>&|XXҌ\-,Dt)dԯK^ۼ&Ea|},Kt)foJXz;B}k05?!qZ8PG0_7B/_\7B|1xv&6~עm:V:/𝡶w^'E'5?]m5-aI X߉ʥj.V75)?d  OĿ_|u|~%8դg( :k|>/5 x]F>YD _fo?h?xKV>3^+Э?x;>o~ׂ|mM#zWQ_~*֬tyҭ O^:q)(JT5(:T7/kYqaB|(ЎcB>##SUQfUZ0XK3aRxg xX=4x7>;eXx7L׼/ºU/ |D~մO~̞;G/bohRkř_kGUɨ]^x㕧񎅥jfe/D iǭ_/:̶r;Ңn+㈗(GO ꒋdv𔠥Z1Ҩ9;t:kai2_)gt΃ȫSg8ap>:؈:K^$Z|kO:eo&#gu7uU+x&'_> ѵ6"~ JMSzee O>:pi=k?Z]֬jNoᾍ '|GzŞyy _Zf)FԚ)FrNKrT:^|USFGcUEᏈ?ho[kF5ֳ/Z_+Mc[ֵ_Z.Mb0Qxԫ!Kgu ˪I};g}JKG8a&|cgW*TiBQq:~Ɯ0QVF5;:x#ch0)ԣKXPPʰ;JeeNXN&뺕*sAS|g[O "ƞ3Ǐ Dk};Pw?Fix*m&9pڎ ǩx[u󏇟kF!sB!=g^khF4_ hvPk!oAqU<F\5Xj:ʍG8B1u Tt#RԼcL/ ;(U1u1FG.B/-+,.UŹR GCV%|H͌zO,$k<-.i7 _hMkGo'ּS9|_GZ ǃ4 |Cbi:E<'xGӴ릵ּUx! k=Dyƅ rVx*߸JN\yKRVPW+Ng^[ajf8gM㏶YVkeʾ>OVXcKF7cN<7>>4|k_uõ~5p.zL7S>.?:5jKn`ַ>?o6ULw6Z-4:U-o[d 5KDt/гlDJ98ҧ \:jM)Jrܜք1408.W RpةP Q˃xn+խFU{jW ,<-x^u/|#o&oK~6ytiz[oVs="T$}jLլu _ 5Z?Ro>, E:#߄Ğ.O_7y]HK etLMDTuZn+2INruLU,•<#m*(U8L,5L H`>b+TZZ8ژUm~3ys㿈?>V^?CZ:_wo~+k_aG!&yl52N՛R5jҝ{7UUU`B7\WZͽM)f^2T<O˕\ʤ#̒GI )K\iޓ7?h-oV|Yk:Y|+7Kм3yx/iuyj^ SM?Oӹ?e?OƩwYS9oxnw4O fx}džu+OkO4^<qQH\Ta)}8^9^&kCBuIaǕT3 4#IS**OTabp_i3K#ž5MSP|g7<1Z5M{S|7 \y$CǞ$ah-7S-~^/|q+D>'<mS]߁-|}7MIjzσ#/ X~-ZO]L_uZ#J2abNRRhUU)Sӂ#OSWM94QJ <30?1c}bX-:\5:T)R_ 5kVž4|to_߅!K;--=֓Pas1\oQx[>'~3]'ƅ:ΓORCCj _mBKP/zpd+.Rs:XL$%ZkRrRj]STUURTJ֦cZC`Գ8TԭOKs"9<^*x4Z1X/i*o_oExWuM:>0Oo4_ x+M`TKHcU,M eǍ"? n|;x \_C[}~&~tsUú;_oxSA?廛G4.l[PKE-RxYQu( Ɇ3CPk>$ZҴoj#aOxo#[ jK5͎$τe |Y$S¾ ѿ>/^{z>{k{:i>4zxj~!{_\~Նa{$yyqfQ܇m˲`12ϫ౵gC+c<Y^9ng>"gOOgS_OGI-~'|[MDž7C_x.{MFLo>%DhzN}Z}a?>F}x2­goO׾ xM嶽8NjSt4V./5HU^Rϋ4ܗGیXE,Ÿ^[|^?>ey\sfḴlj<W |UO |n! kM?jϊ:?5-}3^5~/I %:ֿ;'o44?/4 8,>Wl*3 ;Øܶ''󅲼^_g_d,nS 8$g|K5|nKb▛"iռ/,i >x SJZ`o~!>LJ#yUr4e# .?=Y 8p=j9y^\xP|>W吡C(.t~zᎿ/մ8?ouo 5ޢ_:厯1Ԣ>hj%AM # Uk/~!j#Z4 K  ƺTq^.ӖTId{o pgY"M7gvX('fm*oY]43/:P=B(((((((((((((((((((((((((:Duv g"֥n_k@Ey>KL:uij[w1^[^;׃ouk}gyuIŨ]VeΠSiQy{J;U?xF֭5AeѬuKOxIEA旫H%ӸkKhWA=uqomsmIvEP -c|;zPũڒHana !Դk]GJt]OIԭmu6 Bx/ž񿈴o>W6L׆o G/4Qȿqx1!s&-yiƾE3 `1 T*`3L+fvrWᲬ9\sc xWxG~)[xjS;o1~!x7m!a] ]'ž+6x_Qt@Ӯbe3ET_30qgGdX̓r.28o/09 Cr]Lx0O~˿|9o|<ψIi/o!BK$L1W+,ysᗂ <%s/Lo ɥK.=<x{U4e㫿^8/x}>m#7:xĺeq>i׈ol4:ilt{KY#cTƆo`γ{[ü3&7- Tr|N()WÓʸv8zUrˇg |=76-j[{{>+f7'LGW4on<+v EҬ >_-\ANu`fU!W)Ȱtҧ,[ezThӧK pjqPnQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhh Z|Mw;'j-_56!}_QIFswq<__=|c^Ė3|+S9<๎AZ{"Ck4K[]j1=N0 t]>|(3~(xE:ē\j}ȴ|)nj2Cs5=;~ҼZGޑl#KM:;XKi]c+/+;XA_PPE utYwyښ~ɡkWaG|>s_/e0=6ګxkƺFJΛWVlD_o>0ïx_>%QhW +¾𾅧|w~hV> Yī((((((((((((((((((((((((((((( Zo?DGWh_-j_P|@_G\|Tívot hS4"_Nj[ 4WDQ;.sJaIoU-V(iqmbI;'nm(x$IaPId)у) @Q@dGwzdG?ڿēWO aVL?hwǧNS>>ٯwI?}A4'kW||╧[-Ok,r|]}z`ҧ~=~:֥}i.;n/ 7RQrcܥ&KV%z"өZ)Rի8ӧNe:*NJ0!9MF1rI6"?nj<%Cgߊ7~-ƫ?' ό>)|I0G4M;F6sM#]k(ᧅ |4'[ZxCυ4?jX渇Fur0[&bMpD ⌣8kލ^yu躸zUVV*Myj-N*i*Jo߇2\ѿEIVv:ڦhUi^cl[aZI.%Kꠚi95I$m$նIjPNU*TaN"9mF0b)Im$dzֽoF|G-gI<=YMjZ6[FeuK頱 ex0]U4 5\6skH!vQ-捩}yêEum-Νu],(FYMB\ϕtk]sGK]ѢbbU r*Stc8;UTy׵x&;~7جgZ9jzum3At[ SY]/Ht^Q+`IYDVat(WWѫjӡЧ:׭5N4U*իRQ:p9F1ri"TM]ѵ5&ѵ5;-I]lҵEca.cv"wWF!%}_I5"SӮ],մ{i .=J9eӟQVMB('ɮbnWȱ]SQKW ZlDBpRBxHҫQFIbMH4(09 |K_/Þ7˥C %u_*mv͵ VXVң-lPVB _|eA?WVm^yGxD7|1_ԢVH񆛠juI z~ ۈe+ >|!Ŕ2 0]*y&e>Mq$pS5,23,Y.;*8l85kUP.;&/k_ѴNմ<-G~+͆s7W4COl˧_}Zm唰{ƞ?}&^o CO Y^4&m&~%`9[j:퍜߈5{m/DҢ]F '8:/4jyue^iF%7*ӆ ueeKVp>5M8hɤs-:_.-GzЋgXS,nƧFeUѣVJU:t5JeʵW(pJRSi\4kC75j~#~|s=kYtO? YVaVCGGjThR+r?cqa;乖'(&X,fTp| 0Sbc*yTE|Nujv_M^ùδkk+/ 9 ֵjհ5p=ZkЭNtQJnZ5TQ:B93$h u& RCTӡ+;GN彶Tl`/nٵM2! 9u7T|Oz^Ӵ?z֡]Q4OXi:{jK =U4zi}QBRK B;{{d~幌1qce6&8ZKSx?g ,JJac7]0-jMiZmkKw:ZbC&&e$s{ͼmh52ٺG<% c|So_U펛-HKX𖣩jm+tCI,muX-'Ӯ Kic<3ca0(XU<&"x|>]<ƞO }zRO6K+*BYZxQgL::'[E4^ GKK-{/VӥYbK.F\X[\Z\2FѡZTjb#FjRZiѥVjʅ:RpJѡ^T))T srğx9ukB_ b6ц۝?i:.`XY\lүo KH̲~Oh}[[/ʳJt +Y]~j*}k,1>RUocJ*RWuZUi~g{{mku_cwOc[,r։4]ݺ {iNBo? Ze/^K|5мy]_#VZ$jjzun΁XP} qi1nA8+yp9V;2Hc818z(fu)13>p:(aWu]i}ֹ~Vm}{miqjkc{<ɨ_jY,-g1߂.]?Ķ2LJ5mV J6ZxrFXU my\eog[<LJ& `aVRq8xnU|zƓ6wCi}G}m&ej[iޜkFKn-ӯI-.=ڴ+aWVJxF9Ӕ)Bc5*UԧZD*Ҝ*Aah \so`;w|FtkzfOM2߻^`H*@  9pEz q.MyoU= ^'|)r!`1 dy+K Pbb*) Q(T|-gk#V ç64ok%nV͵1yl:r25/B"սV:}9tiVȟ%(&JЊk4(>xi_<{7^_\E>u;W]lVwyZA# A5f|3ę.]gNS\F;L)2!a127Ͱ\d'b0qhc*'q@Q^L6C6WK}miSX[wz{.M2 !x,l#7Y-]][Y[\^AigiWwwRomkmoK=E ď$q;7x\L^K^/S*ʵL2"j TRI>xJ(9]['T2Zp^xJ L)JRZ.U EpQ@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhjY~i'u ^+ӼsYM; 4N麦 rZiц+1yio-96>/⦍ ao I>+Zsi_j~*<%4_ƾ1|9]>]N;]i44ox;ß`ռam> xLgm:-WAеk!<}?WMxamYMF{Þ+G-t; G(4=NI&ӡO8⸖k[dwU+cc#$^ͳmQ@d5F_+?;yWy_iˇ|G֡?pZ+&2XߤF3ʼO\>wo?g^@+xKMxMƱ]n_N^V 2"vi= 6Y,;y+n:sSg׌ӵֶi|."up)]QQd~YEz L^o,Ex[⥷ƭJ):"~!|Hզ+/^"<=k)4/WWDV;hZ_Z"_n>*kGm_wZRx/8۽>#S{Ʃnx>AyJ𘊐WMΥ'ZYrRI?F{YMXEeC8XZ2xo~ />+~6? xƖ? Qۛ޻}2;ѼocC|]|I^\~auc;FNM3n=Q#=φG'~?&|Ӿ0V-K**+:z>*exW ¾^G<#0mGO쩇$R\ӯS.B"J' J^T :i3*Z1^7 bCb(y/_ PY4a',dR~ȿ|S[᷅6|t_+Ja |-Ծ0~SkFBѼxt"95g˥͢Mi9waif'FՖׇ5MQA}mn/Q<[Wɚ cIJ=Z++hcX!;eKb:|M(Qե=3RCW _ > j*QA}W➍ Vikq_humj=WIod=5xfԩ|R?|WZ>!~.x⟍xj8:3us ?ூ?/|a5־1pr``ᆯ<VK8HE׼'6W(|Cht/D/ ǢC/XntQmRP cS.G,<-gyq.o东VGqGNq*aic*bL/c%*40y|Wó|7㟄^*<O/4m+E7<xJjT䷾-iv," <{|mo-<| <7ڛyO"=֝h_ ~(ko(/RF?5w@Qtq:KyY`利噟 eIx S <x XPVϰХO5>5urwzOKGO)jcz--C\M+YՖks{'>#ZXe8eYoG_5|A$Mn@uJ/xI'E__Y)^3]6O#YMj=LW UlYNS9Âp<#U쪕q>Ys< _‹i᲌ Cژ l&+%ͥ`>|2 Ɵ> xOGߴ7>hG~|R |"Ե/62GxKi5mRUy\?W[???u'?t¾#Լ ?jU?,5y|i .?5 7L>U yfni,qrcq? f^'apX6{|@O6MO/}wM=6:&ֿc'^iۻhz^a]x? /AAG-34duo,|slIxj?$Ky8վំ~Ԥ.-m/e5i-_͹0,_d|k|k1_C{T?xowC|4vnsY~$/W+~."Iɲ|WfS찼1 #(%Lω<1NE260%m/Þajh9 8?> //k_OO//^WzKg쵬 |/]ԮZđaqg|@_\0p<+xbC|6+ḛ%gÙ^ 𙏈^Q38TSĮ$2|.| 𯈼O~0&G->!l -|5ZEMmK·>#x;F:LЖo#*9RnJ?ڙU{_x:5~O/K#H$h3=_׾ѮRWX2TMí/x[a7IxN{-Qbri֖ZEԩbS/)l3vc6 d\O2'Ox㸃pK?ʲ þ (|A|^x_/io=?i?6q|I1XeL 7?j0SJ!GћvP^B>O0Ǖ[Kߍ>CLHgK|3|wع>CŌ繎gpSنxSe+m,˃xϥe8 )8>̲̲Ze:A/][ǿ>?h~Ծ7[< k>׾!x{Aû}ƾ4OI#SԼ6NY|E⍃Gi|5~gfc~2rW ime+OYz5ܚ=߷'ͱ,~JsL/'s̨Gp8.ɩO .+#`g3Xc7b/ONew FhvL sY|1 V -n!φ+C \6ἳ: ^:9EZLrϳZX*sYfK|_? &GzF/_Wc%׌tO8KgɩVx|UZo&RkC|'Ŧzi۞<¿|u׍ Wdּdž~ |j h,]WK? 7~hVvd_|V\{BYeׅ/qXѼ9qĞ+ԾhV~ˣ7~->|ugs_xDZi:zYz/|} |fG7x~ j7^%ԗ|#h/ OQ}Of+뱪[SM2Yɧ|%NMX"f7S38USpna%O0S~*L.qG6 xa9̰L >|D| ZiFo D<_?ګg<_B [<w){5x?j׋tcPּO-^)M֑}"[4|Ek/=_)#N;I7C<9iVL:mn-Yx;ĚQY~KYSĬWx9VM+ͣ1x1$,'a8/(qjUpu\ZJ|;>#h-5[%ᘵ?[TC[StMp/|RoxG.l[ßEΝ_m@IR<0X|x/m|}ᵊx+샨j/|?\1+hc [Ϗ5okis|-WX_x"i6۸If? (<7Ŀ~4/|g]J{>'l/-|N֚g,mյO¹ p.i<&i_f4q|_a_Sa8qTq'5$좷 1xڥp@x~iC|N}u{/xkZv'm ?5O>(3Q7{?~.g_c._xŝ;^(GBOǃ4|Hmo>߳wxU1^K?|WiXi~O8u[AqZeWf\QX^TkqYWpόgrK3)eI85exo5<&;r%em/m~x h|'.U/M(O|HaּQ t*=Ε|-$=/ÒjwBo?~,|N_~ x]}|>d:' b'>` /3/s<%LNe&ULҎq> |6g[ T(`+|d>2Jd]YO:&M+SWϑ/ ||A-S[棯wJҾǨYx >xVTZC]^կ-KXo:fq|:Wι;'eeG|Dkm&jZ^yj ]WV-#°{$1$cD!#P*a_YKXbyIEVxkxԭRڬMҥEI>`$ ( ( ( ( ( ( ( ( ( +Z}x=x/<7]=?E^e fPu}B K{k 8/&n.m@,t9omus__|+>Wڟo{{gO5v$jO4]wR,Z-`-(ITf~x~E֯u8Ci1O>+LJ!v  5 D+krS\Uw6xIӵT{;}CLlYolY xd6VNU iWQ@b[Vo2CV 9g@&+$1\6,2e XtwM.Xn+.Tg ?mJ4U}CSGǟZR{[B>|;&}*}OVEQyw>77Lu6Yd% n(ӟ7$Zn'$e8.m燣Ԫ WƜ9PzzƲN_a^^IKէ;Mq_ iM#cr~; 7|]zWtl<OxE4 L,t/ZnJpT)Ӈ<7B1\9&qqªUYazapXĺ8l=*T)b'ju֭)ՑEdq~ƃ{iOisMu ഞlLeZl5{ iz*7</Vx\V/B,iqT1uTUFR˰Pqpe*`Q\PEcAҼU~mDhzŤww/u궒-qijgXguos\^l: -?Na-mm@(-"4R4UP7P˝W:xQ_YJ ՔUIeB!PJgP-Vf!mVYoM5( k J[;Ȣ絿KyDKo$_71v-BtN|=iИw5Ϫף53co? T~Uh3 r >,~aK,f7u+*+#{iwWT'*4o0<5/b8]YW15x\bqeZY\U$y;$<=oh; /N[Žrdy^Kۋ۩fie~n31y6bk1uVνz#Eԫ9ͨF1M1JEsQ@W^Nȴ(jάspj!/sPTu+FyfWgtUՍsf/0uM|^*c*EIVQ#Rr,#Fb@Q\s|McLK5{_&Z>}RSu+yy#(:qY3uxElV&ԕJSڅ8B)E|/a|&uxrXwܺŕzď>7-mObM.U.dk4⼽In|5?xBS sZYfoys1FO2ia爍\Ejpζ")TՔh8^u]JiNQ^yzy>wݿoljζ,t}>Jv& "(tKV^$\4#ƑzxLl(ʆq &|>Ϫ#<%ŗ׈.eƥgx?gK$Ye~3얎/['dca1L4rL>g1tExPEP^A?,O:s}x(ũx9oCVڵL [-7Zǃ-٭uX&5 Zȳd8f._203o+ay`qRԥX :Z!FT(+c鱷Qu&X<>鶖NvQ.W[Cs=\ǥkՆbpk]/jSVpu)J.TU 9Rs):U*BAQ\PEPEPEPEPEPEPEPEPERa^V":@r3kR?/>mmt\'GxOx-CŸ _]J~k]ַ&ezuͩ&k۸J/VZm<~ |mAX~*[xEm|*= KN:w|U} x>Ѽ7u4ķhXLԮdK|]φ> nvڮw4O\-IXd1^ b>ZzM}A@VL2g]bsId|_yoI;bh0|/ĭ3w:ŸIty"_>4Eѵ/u^ gxC>Fg;C<7H,GN$[~m\LYn ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@^д ľ6^"BԼ [^Cy x^[B=14okj>_ |#=VKY5M+L?چĖMJS8&(ݑH( Ɇxn|+< ^/h Yk/hz3n5_h~M;K>~ x;u~мSixO]'ĺEZi 4f+Ԭ㺹9tU:( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=?*]|;𭝧u+Uh<cZ4GL,5i>յ˸>իt N "Xj0~>uM{^4B4_Zֵ{m7I46[GT5a>ongXq+>#`s/oڟl{S_o>}}qEoĚ?̮sw&ke1K"²Kt`v=KVh@6moƯo%kx߄#iZ Ş? KZuua'[i]OL7y҂R7.U9V*\u{^tu`pcpIU1(ЕnOiV`{5(9'k[^ (xsc>7C/4yE|.w-GoÏ Xk͡[ZhnsoQNi:~ў_@x2O 5 m4Zj?sLŅxC&5-i4K Y[}SN.;%9Ӛ㌫yT\7QTM&;}i?z W*T8BT%[Y*3gЧR0'*qP:`moE!Ki|13:n?,/xt]Go|#ki66L*qëZ kPӴρ|O'V>⯁mu4}dƾ)o~ZjV}OTݬC^J~0j4_6+ NquR5+FTiJ_0:e͇δpd1~l#VS2*c33`Ajc硈RJ8p~о=eO@q'^}  o]wž|U|?KšeiAxH5ok~*ҴX>į!t|9gNE-mD$X"D*ᢥJRNxe 5OJ]::T\4kRZ<j3\|y~Ux8c,,΢TSG' |9}šd:½k>L_|Hiyr¶B?~%AycƖ%4kK(k6q^]iV_K'Ũe,=LYmRdQƾ_FreΖ/RYe%V3? )x:տ3G3ww#KyuvoykƭZiz.Y_k֫ygV7ݽG~Ig}U=+[{?;.%.ⷅ< MWHo9u_ ZYiR^J%,%z#O‹~Қ<NjTԄ%NN3eR ^ 'i|U+ XTJ. U㎯BLV#CS ֥W\7[_4D){SY_2x7u_V4s{-ëxG.5H'h H~'ww$x;> _#57_X7YmcgZǿ>$ZֱxWŸ-D3ռ3h֞ݟ/%xVמ67Z>%Οk&2Ԅ&Ubaa1x,E7*MW)?f֧|=Z{H*1P1XgvIϸw5ζ/ J73խXH3 7ʽ< [=+79[QŞօ3I㏃k>-!x㟆XNos h'M/ڟ%5AF%:|Eu37|)ji-C|ɣbu= J<5|Pmc_>|[ F]@Ե+H8qt-IkKIpd|o5/&<,|x]kGYY_w{F'x4q9t #ަ[:]S(1 \^j}^&Ч;ZWnto4bI-;+ ho`;>$Ogھ{}g'}gyyM|Ŀڇ⧇"?¾G?Nh gUv^ZxO6YxJM2}+躿WS 4tkS((((((((((((((((((((((((( Zo?DGWh_-j_Pj/h.]'&sk~0E%?d/F4繞m;3|WyxP4m úqx[[^<W~?h? 5~m6O}-ho |Z?xF5W:߈Xt*>#FZ[-A hwM#Kz (dλf6__7ړy>wyښ~ɡkQ@-ӟgAC:-{|#gW_~?Xe7O_~]YEۛOkW(Υ_GMOGƾ97>Gĭ[0͟1fHnjt_O|w|Y/|3ceu cww}j8ZXEΕjx'Sʵ-%/'*,~8Ԍ]f%NYR˥Jp*YӖ-_xf>#l/$<;Wg|I|O:~{ᮁo=摤x[>/ ?HФa.䴇WC}'[:xƚ=w|mPxtxB-}&NiWG_Z^_ u5[xJh֤UW(`jGCF(U! 9Uu(O?^]11J\O,?)V0IgZ28bhe?ZЫ*:x/| bm+= DŽ(ß 4\3⧎>! /<usxN~6ƗOiWVnɱ.C F_ֳ^)>9|OYjmcZOo/şkKC'O ,|IgR{}?TO|/,BTXCۂaR*x:ӜU:xztaESfBz8*'jj (dY&(`3ⲚL6W|p)b!(,Oi??A0x^oxí'ZY5bS_~7|^v%'_5U&ްO}iq,| .+;ĺ&Jҧ]RB'KJ7ž+ˑKJ:&r.xGĚƙm4Ϸo9(<]s-8--.b\W7^O B**JUc$՗krAJ)C.;bqzeb+C\cIu?(>!⍯?E4ix4w x+%A|Qu[Oφ(.#m'~26Ƿ'|;?:/#yu9x75ӭ|Uim7A I.4k:OR\MJoȓt)ai3'RRjU:sbdC|^+.REP<:Xj4⧕e8 x𫉖 B 1Px@dž|Jך\iv +u;[|Ex'=档bHnMC\Z?dGr)W/~< >|.ߌ?>&>6qxLW w{vAdZfoyR? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@'Ǿ;D x_G5GIGI:~-Ѽ3Ӧ^Ic[%Ttovz/ZeLj|3c_kEiiߊOKѬ%MSU.VyK OK.y/E|#jE5m[\ׇZ46q 1.f@R;ԍ,^VrY.<W3x6Zރi׈)[c"X,4}/J s4v~V&Ú>nm,u_֚ơkh`,yt{mCHV-gIk(a/Nm<}ey>v#kP?ej^E'C[OS[Y_ïfijZw}j)J+]*᧻-'xp ߀R5Q?K~Я'Ϋx_Szp0 WvzF?h'PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(>-4#I׋5[[wB <_qy}{JxZ}Ljq5-n4cxѼ7ehWp:+ֵoj~4z]6/z4EݝK,n:P >q+(`xD;xUaw{NM6N,B:]$䵰'jQkvn]Ή]]Yi7Lj.ve֥$u&xviz5z>6j5emam.귺QE&뚖Rկugi>+H5h7)~IQ /L$MF@_:\4znIum@|[|1⇄4_KUd+Ox_ޅk _LK߇0|>&0x"㻝o-j8|C :PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<v+ëKƁm|k]7ixY>7|?&Ew4}:]?RYcj*Ai[i_R |K֕ 4 DGMsw N k~tk;=J]CY7qZ6LuK` ?fxV /DãAoxZ5^3]6m!:3iv=?|wWp[O"ϡq9>#Wd?%FKS!ZR~֗W!>eν{vV7Xw.l2nK~oz>!|bQ6A׼Q/MsP_0{7ֺV./Ԧľn5[)m[?NwT--4~8gU`O/4&JM*?V7I<3^fh׾p+є8*0\N\^JMrϳeY][U⊔)⯈>NuRFkTRs19j9xv~ⷆ|Y.55 ڭχž<߲׵=YuMVO ^W? | O^RIYkߵ-/iEk%UMZ 웥xú2S|Ig-=ZTLSFO +SU%:r֔#p] sFU `a 5U9!lZ0R 2^,jt|@񇋼+{-|]xƓ|^ΪT>YI_j~ >'kkrW? o>Wx{Qǿ< >=׾.Oj1>xW^OVPhrzo:Q0T:2^jצEFvЧ Pgf5YZp\g, B142tj8Xڟ]ul6?@Bo %~h[xVBBVo|8]k%iZޝx ӵ=eKgIn_mzi>$xoD!-o7֨t5) }jVL:Ȱ\xZ0:sZН*NT*ҡV=(ԫJJSSRҽ$4d~W:|N _[^[+` ؊uG^#F<&ޗk^ /OPY. Cx& .xBig$_k {Vi[X0,پBe%KG+0sWKh2U6+\2g#i ׏>\T:<_aS=x׌~(MCx;t|->%յ>ռSA׼B_x_:čZL.'lfm> ~ӗ/>4-{'KX~L#UX#jZOO'NAsoO ~#xo'cm x~5t\G2-/5 oP}-oÜS~QQ,?q߇u81r1 1qx?5>cTGGG!yNk`fgá j>?69FxcoxN~i7lj[_]X7D>[=&mOk:>;|cE?:$|;|#;*k$c]hqs1S VMḛ1;B?;j8/O þ"g~^?;KŨz˯36R{oxklKqck]| hK?ى~: ~hN[4W|Mg+GKxKğ |?K1WP.Ӵ.CP1 ; Ř>=Nnq9fc͡:XĘ'y~.9WUQ2{՟>ktgh#=ƭoO|Q\o3V>/wZ]w¿phw>5 G?z4 #SycIΫK䃇4Â;|V3y~;e򬦎C+渊'[+ ~u& >[>eoZ\DŽaxDBYkk5U~g3ẜG˰9K+ Y[QJ@WQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh2վ%izt9,ONZ j~_Ie:Vq6X\NbJ~ ]SLiK$\YMd{^^$NMկ4H[_xej<]6]V_]xWB<5ZGдM+M%ge A<Ӽ&YB# (^C1H] 5-{,cbm.[aK֢ Ʌ:K :+бy_YRwK8Z+}6e{Fm j(6_ h?^m++H|K&I xHl? ~'xt;7 AZ>Mb oYV:|YkbZ,[k~ BpШ2Sxiʣ΢詪r%BSxv_.Jy5*O*bRK&Z,tYeR J*\-g{mCW|L:xKms=x(WKv >->þf PW#?N=;ឿQQЗ.S'HGxz; t:}_R^^-wy?&]b9]X7O VĨӊPSK*ѥN5g: BU*ʦ/T>%yƆ8%G FUO978x<7phwԾ2~ |-LMd^O z=iqOQNƱۗ+cH3xO_>1'x3d'9'j:S[͢K>5w̦VPai:\/gҩ:4\EGjգJV2TӄB}:ʸ|$,?VmSxN H$>!i ѵKI4y4"{'c b.;R,!t$CeyR TwQucx?B<3/Cּg_Z&\M:OZ~2g6vS9H}|Q߃#|>/Twͣk .4+X/mSGMVђK-bXͲԬ7Q.\+@qF|98.R'bHL*NT+`Aя3iՅHB|g/6M7ş i>>/xVwJ߇3^^ n<% B]ҵ{Mj jZvmosB~ m+ǣE?ׇ~xwP-A]?NZóieu-t^-ωt b;x'[qTu8L,2^2l~? ξ)Yf#+XLuم\>]jq7_6z!h_<_x;ƞ?h_x1@>[q-!>V _|&F@-]^Kn^_7xK^%ѵ_rh-/~s^ yDi2XO\R-,̷ÒXSBbU7e<}XaV#G|O㧈~$x0~ |HmxKBϨZ 2OATՆio}5ORK>l<_4cּ{Ꮟd}Ѭ]WƁuu=aMx:MEV\5/: o3,n'n l=<TRzy?'p|ˋ3 LpfxoL7'i,ӈ0yu>Fϋ~+Siv^CT]՗!-m<_Ioi(ľ8?ԭාW񆠰9>RK9/5^ ?tHbdoM#`_{[C=Dh> XRöQACÜ?Bm7K|MF;m O߆b? BSм8ue5/u.S]hg=b((((((((((((((((((((((( Zo?DGWh_-j_P]om{EֱLÛMC 1XI>f[׼/AM. 4SPq&{yg忴L.AuZDžMCF!sj<Εjqwsi>4P)t3xS^Ǟ^ ~޿mAaevl4-'>Z{v閾ВSB_iC?<9eqJ)t/ W_?6FL-1]G׎$k?xo kח/ ƕxjSr(R(ƴ# Tqu!5QsI7E*uQBں|E,_ɰKjW)SRe+ӣSI7(f5+X|U,6xlk'7 ' 鿵g??i2|ox_AU|)K?iׇt]e.k/< ᯎ~CØ<1Cx7oR><3C.4}WJG5}K]E^\hV/+3 rnTeF5t㈎1q_\Sxh:RCpANS#1i8P,_K3p O6Ktb֞QEs8Q_,|kwajZG?߇&x{<7K ie+^%x?];'? (]e癴<S^Kľ2< xĞ|-~#?#kϏxgC~;^h弚K}AE[Fg x\UIEү|^|5 biaCW^j0P(էV19U,&|.6l8U,ep⫗b3So_F8~jn3 KŅWY~ _gK7⯊ҼOj6y7t˟z5Ŭ,N<1iqEo>𾙨7~ծxCC}_Wec NҼrhˋpne8icF7,yN6TyWUrl5|,8Z6GFV%e5hj~wƚ_tk4~$φLyek׫i2k2./<u2Y\ti#ǟh'_o_ ;a./eO+}_\ÿڦ_Gx[RYtk:ij,=Xcqu8?*ԧb(ƣx5bqpJ Ow+<1>5$ksXHf},\ñ3|MJ\l>`[ZLK/C/k+7+/ Fq#.|CkZ| _|gcq'~'?\|; mZoF:DA|$/y_Ŗ$W/ }s]:/tY(5{&̶:Uo⇋(ZJI|p̮yUG.FU%J'uP]G;˨pu(ĺX:1Q^>Ҳ}Px@dž|Jך\iv +u;[|Ex'=档bHnMC\Z7Oڮ{wjzgngSVx-..#{k$h&%Xy Ͼ E>2hx_?.9~֟G)j:ht{}˩<:uHŕ]/L((((((((((((((((((((((((( Zo?DGWh_-j_PᏄ$ç[|K5sx:VwP;Ě Zޟ{eky\ u6u#O$gMþ$>/tkm~%|H..%Ztoi/-/-5]nIfp:vDjzyk%7 ԮӸkKhWA=uqomsmIvEpx߄5_|F݇'I/tqK6 KJ4)u=\uKKMWC״{ gDլ5M&?co|K4߉zi2|IG_J=ie_>7x⎫z~ui/XFZyx룎*ScY)СUJ9SORMRBjK˸9kaXYirl<=GV x52X\1_x_LOς>"\j>9Ajc|'mgÞ4ڿ/{B?|1xkT/G$^% //='LuOsZ׈|ex-|_M.;;}/Ɨ_qZeci,oi=ZfJKR_U%6(6^TNK$:N^~9*`paW ]<֦iL 8Ri`NPWL^UZxa18*};mo?%мir|i}rƞK1>[ԼS-{C׵XQj5; dKᏇ+qLs5ϋ[o._Yime}2|Fc7ayeD4YKGX'JR O |Ӧ(aIJzgVy> aքիԅ\~2dY Ujx:tVe_jXF'Nm'|S<3xWmGK~&|obV4k_wWN"oel|+yI\&z'/t?z.⥿8naԟK.Y%wmgMݍkYOoac51^%ƛ(P8vNQe^I$x)F'9sJjpx<#8`etp<F<iR:R'oO_ׂ<]:oux=N[ύmpmZX|p k:׈l-uxooN$w7[ z' Aj`Ӵ'?u/h{ ^3֖6QMSqU'VrxvէZVn'iGB3qN#O"5Z/*;ZY\c28{a*bS:r*S̰l=&o*t8Eǿ;w I|>\Ŀ2Cj7jj $׮ %|G$[_xOlG~ oGպZxQc?vp$HCKM \6ko`$iX%ܕ3,]GVRօy<&UaSTARStʬ)(S8BuRqRO2xիX†iE`"=U0x`iמ [qj}Mz4GW7[xR!]sĿ~)|R]JI7ͣW:?:3z/\MHRdtWi}V*99k:t(F1*0Jc$G[t"':a0 4#J(ҥ`(aXZ4S:T0z4i1)+ǃ#xBú-߉t/5K񇍼g ]i}NVIQ%h>WCEm7okt-?žg$+/PҬ潖;H.{ !WhpGt3ߴ?՗| xK[JIu˭J.|GLb\ w3Xԗ_^.lZ֔Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhh Z|Mw;'j-_56!}_QIFswq<_V~>/U;Ceo j 坫oè\ii=?Am  Ӽ/!SZ{}bxk?_ |+?m#aSOž* + ư5t(((((((((((((((((((((((((((( Zo?DGWh_-j_P|@_G\|Tívot hS4"_Nj[ 4WDQS/>Yx %{O{’h4[iFflt/+;M?NHZ壶)x]. Yi[EyJ Vk$k:]Ưf: !X{H0pZdXbHH$P#K 5Ź@ wmsP7' om[Tp$xo]ƾ-t+z?=oyiz=ֹycswvܬVv-F`!e!*# 8 AP5p)JPܮPU ۊII_XlD(RNhkխB&TBx48u*N8IΔq%QEUTw~">w7x;ĺ_<-/|Oxb?\iSD%Kдsj ik1O/῅D YG~1񦿤[G C]:UX77p@$4/#F-*NOOGc i%kyvaYU2<6ZkV USPUjB/W $w53>lZҴ>gdA:!NS1G)rB)77){QMh4Vb+b1  TjTjaB.uVtƔdU:qNZV7ZZvko}acqݕIqkygunAsksoq :I2RMi٧Mnф(JP\e(82M4M& i[c#ygX#H*(,M-i$m$mKV߇/𿊄vL|9:瓤xɵ? jf]yzwt}CC|[jJv@AUN'P8]&M]4֚њՕ M zPs^Պ#RTF39pm.hJ2WM"GGXY"" ,*,@JK?|gO^0}64_ Y}~#мmoT-ROy;[X}u&'tPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/>KeYZĞ5+xNπg7l&#xJ:Ꚅ6iF[,妑 xڗ?| ?> jiqK_k߅Ɨx&o5ծ,i3şil$]=&ĖA.vսshK=? WQMSUg2ϥAdگu I`Xѭ|Wj-{_{R\hב)@8__| x>>u/^b]Z#>м?]>B-5j> uWMZÞ75_C@VL1]eIc󼍾gy|'mjg_k5a/Nm<}ey>v#kP?ej^E xu|otX#o^k}.;Z3/GW j> D-K~"kѵ[{bq'.kݭ. KixY|i7/:xߌ|7S·u?4]R}+@]F 'RfgxtneKȤ[㏆|y1?Ŀ_,OştoS=A3~>.k7S6^eֹ& pj:n,ajaZJ"5 iԨkYAUW,[T$,IeT1mzpƶ_QP:xL^.Lh`3%UEabO9\fa:\|m/ |@__~3|{C뷾)ּqO>.7G_z?OC3DVis.lXԟ~,W >M)|B9>)xYOKN^4/x⾉qjϊO%^5ԧKUp%Cc՜+9#ԥ_JWP#zcH}NLv' ʸ;*kk&˩QUgUf\G8jzNxըQ{*'Ὴv+jO xkǟٻ]|OǟU~('A=oNo}FNJKš-֓zh^tw>~ڞ~(>xT?M>-x-|}|dljmxHK(~\\ho5W].-tie-"Bxe R*04`O9Μ%|~ᇧ*W`pQx/# F*p+bplMNʱT/|>U|y>7I+~3Z O-<;= φ>#_x{~ιs5e/jv;'Z4g???ڃoO7?m_P8| zωKe5i=Bhឝ hr\ z0j\)G TBql}?hNtleZ𯃔iКľoibK0t2<=fyfcO68 q kN^4rYrWJ_ЫhkYϊ.q|3|5kzC뙾)'gͧ|_O=?iWP]hokLfMϏ'e|. _Co|=]bznc2ۄlUXRͫa5#Δag7~7ܾH kjck/C,_W4վ 曦'džSOKƞů> o_| f|V~jZڶiP>Hui#iQ]E*ch0pTujʰWfJt֯ߞRTZç +&9|~30\#,L~X:<1̟T){|$rc\De:s|*)]5=ԣSOE4<;Lӂ;b9ub-cXuē{/.kOL>j~qo/xo:M+ gPՏ<kƴ|jӯRUgni(k݄`޻Z.3U٩(څ xx49y;$yVe_3e߲/AtJ> ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=x/<7]=?E^e fPu}B K{k 8/&n.m@,t9omurx7>2?-A3M}څ6~g&Sn4$o[^7fh~8Gj~ 4 ַVK˃HnÞ |Y&n%u:VҮӤ[K o:I+X& kگ( ķQ &d%0r΁oLVI.bm^Xe,ְ Ě]αV%I5f!,t?`Ӗt bIsj)fX Nxn$.nnu6-I7 c}L+[KWK2:uq&qsssGhE>{?|/]&\׵1ej&KiEk}]Vaocgss)bG!O^,Ks ^)ج]hPN?iV!*ԅ8_sS='žm[]eÏ?l`@5ƥxk^w˴sk$0}˪AXiتcM[k-L\kGmLmaC H*GjUM_PPE utYwyښ~ɡkQ@d&uF/7;4O'fԛ󼝞.#>M Z+>мicž&_NkUf,gH@:8ɮ/qJjn# V5ӟ%HF\!(J֔e?j_z ྗ|KoᏍ-..|9?Zu4\ռ[xOL&>~& I?a]OY u _6/5C?jo|Wdžߋko6t?o#w~"oCqϏ{MJMR}_Lt{tx;2 Q7<t|aS2˸c,5cjCʡf3xoW X/ʲ\\"l>Xm?\|KٗXog|vu =R[Oڿ|--sN _iv ]%Ni76փǖ^<;?b+Gn/3Լ8|i3&$i|H4ohrXSSn<0aaGŎ[Cbd'luywDžÜ 3쾭 ͰvvhO=UΘ4+_?_[[%,vW#wEK+m7maZ<<5׬Ş  +/<3N4$ntZ<|Fƾ 4<3PiwnodK-=w7(bqңǙJW3n#mb0IBPJuWa ikV[םn~ߪX{C[˛thxmY .'kC<9q_w=iw4 8 :[:v?b^/YJN`pxhr҄!5 T.NiML= ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=?:4]iuczn˩MgXhѴ5MJK^yo^ ~ϠYkˬ_~$;O .]Ru_O?uGj:ylM7ׄRl4}Cž+𝝼ͩak&?k?Eq6~&h~+O]O?چ9a5_|D_VѮ&խfOcbq6cg, 8%ĹO2\yVeYd$rLFcs8Wσ>,OIo |KFEu~iV|lvrgҕ4-zZ C>;9mil|Bw xW"44]^AȍZMOZ_`Eg>[w-&[,c?c*UBloecL-g OC G/5/1+}/> 7|O&=*sɩxDm[8Aƀ[}ů OO?<g%W^/uo x0Ma{5=SLI"&ͅ0"(8ylׂ+ycùՖ#tЯ,6[^4jʝ*sq-]]|Os8xGSeχfY~ ;~O7";x LRV}>=CP|}¯ψ<+c\GOXqW_|'fWY?GK >Xx9x,V N&-^x|awk=d|H>tS 0Oh:ӼCwX|_>WΟxB=mⷘ6O~(euunAxO7ى4K%D6~A@/S[C<6 .w3&D9g7 3Ӆ3|8(8,u:]ejXzXbGEbf0ļf B4>loi| S߅'Ѿ#IV>4o> *\_nh|Ex@-SH|C6A~w>2%мY-xoI4֟-kNֵfנGmkyqv%^+yRʱO¹i s4x_[ YcJKQBXeXP{-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<PRxO%&> ܚ]:N?n>2V7Q鉧} ]GPO㙩noxoᏋ[Uּiv{+ xwwƳ/M[[KOGoZIw?kUYxnk>0g x[ź起/|khhNtZ֑qrLKt/6|GxOOҬu쨭(^Xp*,$Ykkon€}A@VL1]eIc󼍾gy|'mjg_k5a/Nm<}ey>v#kP?ej^E xu|otX#o^k}.;Z3/GW j(kz}ޓBfgoѼmMiF\=ZX=Z+Щ kQUVեR3Rp$I=]O^Z/Mx:iwc[%/ƚNCĺF_x?J4Z[_h2K|YW|ci ]gSmg\{ö˨~/xbS4;oiN S:n{>x3Sn{8Iy..9/ Va,mT̸~9c,/MO ,.YV߳~&w4ρf7Gյ\OxDؼcG|յY|W%`"^O-? _V_ŸYye7>x2l|9Ӯtcx;9-=ƺ/HτM:q%*✺[{4Krd1bWV 6f;>:6Z.LR R?oWv?~%ςO߳hU4i7j|Svs\Mu`[9B?kο| K< -w?xoqᯈ1>,<뻋hd_kuf K_vxqM fyFOo+a.bO1\:ar ~xB|eWp~#/N ?M73|"^ Y{b>4o ~׼'xG:'> k(Ю ֓siڄ/{wǏ+7ƻ3GOylWt-HaڍHׂ.m<)^M65({q~*%\(d!yⲜml:+q>sUˡL9xk21Y1,a2[]٧?|X>C*u_xT~dnxmWY2G xhza?wP5ߊ|"⇉4 _;㝖o |Yi7ñyk~7eyx@!ͮz֩h}J+a˸x"N{,ܺ(x"fSAG6VK˨xk_~,x'=wඳ/7./\hz΁]^O|?g{,> Ю˲v;0Zjgh.. mnX}aM( `Ҵx461YڬVk!b\~,7b2gT8,/\%14J|_NXlFxa3b ڢ6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@C?û x'_:>5Zݢ9xKwwwU|=[E=io? @'ulkZ&hi冯 'w=ڵxi׺Y$K>Fď>0'%xG—^4_xŢ:mݿ<[u]/n}a6Z}d>OxLgtнŜ,זrn֗\[I-Bxv5PX&|0_3Z5O/Լ./oOⱋQA|6͌Xon>(((((((((((((((((((((((((((:Duv g"֥n_k@ExƯ|Bf|~-OojW>,4_[YXBjM{ӿ7q)]#Fм;j.nw~#{cXfn4i&>O~׾%SAӮrl_>9gKOzt6PgP> (.oXWoZ'"Hyʛ%G1Fn..g#-6 (a:N'}|߳jMN?OGjke&E utYwyښ~ɡkW|^_}l=]aCa)#CizCjRag%H@O_>-LO_|Pj/ڃZ}/> ^ _i SY/YӦ [MI "Bʆ#_x7gU~VƧkhf-Jɖ^+ړ$:u[xg;El%]KQקMU#E`2K&s"JΗ>5g隶_߈- eGo )sF/+K,@z?ھ׮kQ@d5F_+?;yWy_iˇ|G֡?pZ >5:-jG gG~( x:֩4z} c }_Hl4YMW>O9Z4Zjr*u1hM9ʜjQR3\x!u)/oW:z*+T &IӪ[ GX }{}#@]'<, V xlT8,ow>sBrYbO6˖.l5(2\Ň?@'Gㆻ?>3;EU?A/5x,O|:&ҊR2 xJ񕞥}Zx +_5t+G< y.47NƁCY'?<+>OEO>Ui:[iڇ>|D ) z4>(ϋl|=oyۭ_'ry N'=OC ';W cL<_s,\+1w_txš׆exc१imwm j{RXMlW:7LTzƿt^,{͟4 / /??b2 & :gV/QNAg_xK?>|\Ꭳ߃__|Eii*_xI֙-cBvcÿ6H&>|DUwW^!wU?Ks|+Q.oڷ߄oo5_ɼ'i*\`4l7b%Xxqqn,Z S=8ü_XN ?yv3ㄡc*d،/A*|Kþ,dž|kE[K? E3H=cz@Rּ/ xho់>mG{|5$V:Z\/ߍ~-d;J6߈^(e>0|oMMλ^۟Җ+;nKۋjZ]d1JyeecUֱ[K;2_#f*Xl. ,V/N]bC + ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@Io0iO] o]F Wth^Ǿ `Shu-gkq~|Gq6~ 7~$^ּ5zΟc[ú\Bnl<1j-ƫ65QGk&[xSLfCY]K<ɫxך^w_:cuo{<;^n.,|?Ca#^^Ȼh8ԓ\HӾU€+H5h7)~IQ /L$MF@_:\4znIum@b[&&4?2 A%٤iHд]GKMZI. (cƻc~y|*_o+?pO>z?ھ׮kQ@-A|h_ "o \F;vhLJ|]xcYqmz_,9? Oh\X1FϋK?\/8ZVip[q;_F$ >xO_iGOS{mFZL)QMז/UhSFhDV*V**oi5/q\6-qRkdx\x KKUPNX|-ZT3 lG%%x7v|¯ @^g7}g_|.uK/1~O$~,5ݾ76MYO?gύi/Lju_h~6-/> <Ɵ j^?įxB%~+:25 vvGnXqT*S,}*\\%aURK JWQBUTnGpԡbjKs=i`rzٮW1UaWƾ[Jt3EKC B2TB-KÖ6tV4~?<-=I#╾?|&KgGd M׌5[R O^&_=ޓYZjizc,*687QaSQƼĸ᩺xF09NVQQym|a2L2/*y]%yJYFXl_G VWƮK هY>8Pg m?-7 ~k;x*^~.5/AsPj^s4@ {E |)mK|@>8hxWPO'BRygq?Mqoio?rMsm{Wk~ ߀>)@AuH;xS 5۽/W5]wSu n7?a~$*'t&EK{}bmo5xZm='h'Oh:՟=DuR|omɫZXih92u)sU]Tb^0éTRYM(7&QѫxVypS2>W ؼ8 lN&U4&JPhԏQ&^/aY[W=3GeΓqWvgi1k %了񍟆h:EԳ^v;,f&"RA)b3b#q7QijpUK֭וuBgU6:)Ї3|E ,sJRO*05~c–4ԓ m]FZDюisdoȏ70oW|5)| o| [ZφW J𾗧k KsyԆf̥Md;K248yWG6snQ#gO VqjL#qK  ff WQ/^?|{)2Z/M{[iV0.2p[pqFQGCpxl+1ka8{>y/iq-ѣQutc0Gr|1g1|8(lih߲ggKu9㟈(|PwO>"hg~,iV_hI.Oмt'>ZKoXzO8%ÙOs:3|#pGcen#1yQv#86JY~=[VL~"gNp4C_ ?CL ű?|5|#>  i?|=/:~ i{xj-OO>Ʋ_KG5YeR*^W|Qķ~3.?kNzqV堲[oşs8|U^Y~yy#A֯V, ,/OSY}_ _((((((((((((((((((((((:Duv g"֥n_k@Ex7wWW5CoV|o~MN!ht~w=PZTNӘ:/V>wᭇBA|\jǤK7Ud" /H5k{[[1eo G-y HL:u$𾋩FY4]Qj/jKۘ--VJ+ (a:N'}|߳jMN?OGjke&E utYqjz6Z-._&SjZlCa%a῁$wx7QKUu }OY(Si!kGđ_Z^'Eڮ< o~|/|Ncq^UH_FaW]:ou> )ɒKfivw~ecw6>GèRƠ5Z&L~yN-!p}A@VL/!u]WI]$xʖӽR]Ʊױ[鶗P-_j0cokQ@dwQ؅tGXym;Ie%k-{iu 2= 6XW|[׊* 1#mw|7S| wͥxO}۫]xk@tl=(((((((((((((((((((((((((((( Zo?DGWh_-j_P]om{EֱLÛMC 1XI>f[׼/AM. 4SPq&{yggukǖ7P-֝>5O5Tc)7z~e%֑o ^v{p[ƚCX(JGd;o6?Bᶱ_Z-Lj5I+iϣGZy[xIo[L'm;\WUFZ=O]]vLӵ ]wŏ5-D$Dgω?>'^!־1|w/t @5sM5m<?J5+}KX/[Coy3 (cƻc~y|*_o+?pO>z?ھ׮kQ@d5F_+?;yWy_iˇ|G֡?pZ+~(}Vx[U|iCjVOAcsx3Vsxo^ӼGu]xƞ:| :9ukZ~#i~ο^McKx[GB:>iMSn իY/W:tOsx_MkPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<ǟ |%&:ŋYm-/m$b.+[2PK˨=y5׆co/ i3|T}Є^-֭Mukmn/=^S.ظZ'?O᫽MtڇtAլ~-|X5k ZeNi5%V EYm:渏K$ۢ ķa &\!3,sNL9-]^(b*Si5z]Ͷ%W|S/~Iy|s~SŝѰ:'<6O?kcdVkk{KK`K0n{o'?<_ gxc÷_>-x⮋ .eu?׵[o{U1BU((((((((((((((((((((((((((((:Duv g"֥n_k@E|FRTkW_߉? WNЭYl8-o&鶉 ROeb5;>+絰|q|iv:O| IoxZ<ڕPEuFq?Nj : ov׶wq> x[×~e?ú>xCXk0OK xU🌧u`$C9/c-m_uUzo >rjeϬk5STl5 Zt .gi5wp߳ߴv/g/t tg^X߉|_/^# "Mѯtrx! xC (dλf6__7ړy>wyښ~ɡkQ@d&uF/7;4O'fԛ󼝞.#>M Z+&31y٤y>~/ͼ7Oty__h`~Z}|?ͲצКHjm_Ǧ5nkqrnUe1dҕGJ:]ө ^pgk{;v:8<>*0/;ՅUnYr8Z>O.dύ7ux?> 'Ğ&0'Sm!4Ox:~,][n{/ ZnEI]>?.׿a?_noGf]kWWs9/៉kz$_~x?{_}bK|0u)hNT>t%Hc$ʢQһw>// :sZQ>׊I칰Vtxcc sF ٪T R:gJj$e1ax+Éi|?"uS#%c(b\VZ֧qw}/?u?5Ÿ kt}_ei7}];~Iik?Z=iA+[ԏ~xǿ~~?hs3ݰߵ6#-w?j3h~(di?ZxZJ1_%t{XuF5/c )FjXVL$q>Ɣ*yJ-ok*~MF7U,ƭ_>aøb#[kX|yĴ92|1ெ9#-f ڭޝu7\%OosqcgAK^z8jUJV5a*תN/SRiIrFXmJQ. 11x 3~b反\ZTՖ>–gMWc े|R }'ƲM4j< /Xt|?gkm:m*&⋛s{xAWЗJ0/O&i3FFAus#KL4oنH$t-7쿢kLԼ>ZVOM>%$v"lКbhS 9EP ԍ(BzM_VsSZS1z?ގ * }.X8q.mSVrj~ǪGkCYw+d1IK_ػ3jOj"c7e_k)iK;=I~JwTTʹowngVe__M/sfC6 u_ .$Jw T֑w>8񗆼?xŗ,Iw&p]Lp<((((((((((((((((((((((( Zo?DGWh_-j_P|@_G\|Tívot hS4"_Nj[ 4WDQ|B٤q~+ >t /-+VVv6t_A6֖Pl PT@ςRhN?|, B3&<)Fv77GNдHilV4 =2Ki泒 m%)-exKgZ -"bx"LmR'( ɇۺ| 5'?&Dà j(~O|}_WiAO:֢ ɇۺ| 5'?&Dà j(/QMb}"WR@Ƶ\j:}&WjD0&j6͡W_"x |>?O xOπ>xSNx#¿7vj$l<9ھ<^\y4y\U|sjW }2x[Z ^WWc0jGle t))}UsĺٮeUqLcTxΗtKV:.>"گ-E'|o/x_tVook-^ {Ad< mu{FJ51[>ۈeW?zZfΛE- c;=2DVl.K]HOG,eAm`%9oAr\,Wf^qCf~eB'౰cסMWN:a"N6yWWW9jb⧍爭[ .iVu*b`qNN`\eGOg '>!V?||C𧊼%)%|Mo -xo^!mk@]&V:v7 amn&4'_|7GGt<𶑪x-+w^ѡ ShEq+颳KHXjyoRXL3LέJ*O /Rj~rIUb0*qsj|56V%x!kqqT؜>+3(1(G C^jWG b*FUЌhqU|8O5_z5>𷃼+YxP7yZյC2+ o}vCOCᧅSIV9/mAAcVam:Ԏc*ٛֆqʮa,E h9hGS:N\L19i)bJu̱T N>5*8ERnlBR%'y<+߂Wßh_ /| v>-'t \In|uj.lE"1BxSD!kWIy.n"}gCW x~@>u[-GP,3hi~V]REl^l72ʱq05+0իq&-bp*,EbpЭ)z(թhՅXJPdsqo|ṵ_8^JMV5/x3>G_?zO 3𿆼AFkޅV:^wskq62^R̲Ȳ;`l|1Wegv~$EimjqA]'ITq#$8wn*MEt!NY*e)5UӲn|ܖl ϱ!|TsifX̧I`*$XQI*NG1Ox/zc~~,|)i^|S[5?R-,AM.7I.K%c7mgwiUŷoٹwmݻn݌nF#L_x/m?ා_ zev#kP?ej^E xu|otX#o^k}.;Z3/GW j(;o~G-xd6uMam6Imȷ#ݮne*O?|姎w]˪x6 Ox->)'Y״Zմ4m $SG67I_ ξ#>TqG#akƤQYeXqpj4h3Ip*ZZ(Ṣ )j^(~<%|']ί37k 6'πMm/|!ZDo|qxCMU-<Oףſ? hڗz~_cgA8'zڳ?1İiK_zu]v+9WfuL_c6{+|')e'yĸN&Lm,5>-{ ĸ,G :: P&oxhgĿ^NZiw^{2kE5K h:h%斞!U}kWz |dAΟo.Y#|9𥏅<3w|9>&]rjF5eyw8,lr\*o|8xg -l(PX<_8^|}\2\uo,},Nxg)eAx-i|l Gf/~5woٻey<9{g-I:jvtuäSm?~+ԼYxOw?~ e ׉}ROx*?  jw6WU4poqx,t=Y<œ_ /x:Zc[8\.dd<2SQßnU@ (-I7 c}L+[KWK2:uq&qsssGhEnMYKaX4\pڼY/aӭ4b;@ (KujBX~S ,d+R̰A}knI\mט|^O ~3~'Z%acƏ msH[ß OZizTef,tv?ï#Ga?$k%ͯ|Q3='^֮?=? 27?|5iͳºcFY{}z9xO7Ѥt{#Pfk WttVjzu %Mg[]YM=uO (P傍|N,^ 'DB|!k14Oz~-.^{HmbԀ9_? Wm=oxFឥ__cat:]isKKd9Q 3+?̯ފ'u664q16`Z7qldms: (dλf6__7ړy>wyښ~ɡkQ@d&uF/7;4O'fԛ󼝞.#>M Z+&31y٤y>~/ͼ7Oty__h`P x;ὺXi`,oxZWI[:kN(F`j<'gu{v tź>oqe4^Zmeq:^;9R'i"FHHLfXY1C dbXG\1+&k-訑F$K}{h;(Y![m+/,t`5aI^NtlRDWcERN PZ+&k-訑F$K}{h;(Y![m+/,t`5oڣA|l"𞝩xr>e#]厑>=%3#Uj:<^5[`w8mթNZNu%m$޶MdΌ&xV NPLV"iuFeRQFRNn1QM_Ὲ~˟7>8~MO|F0_;|ޯ;Fx,ğmfy e1U+h/&f piԭ__<=:7_>"ީ 3lNto^,~fuwweo I7NKu<H>>|>vǏt~<?]-tkhzLjn! }O)b՞6QԱb›gJZT߹RN"NqN:wWίOT_x0O#O+TN(ʒs5|ğ ;w_KR2_/¾"3Vt=^Ht o-Lk[~Կ% Om"Ƌ~4c߇0u3y4Ox)a~u kguEpo. F>>jxyeBQkUtS,YKx֫\=!k|1HоǫxM犼_&2xl^=^}GRM>m^%.{zo>cWPtC_*?$R8bOZyyokEO\GkpuF5$8AZNsHET=}N_敲y(7B\E SRRsusx[;WQM)?O_|VoO-]c"O~&+^ 6gK񎕭vQ]E.Eմ/6xO翶q' +Ou;HwӼG4oе,1Cmq.\,zV=%AVrbuܰRR\TyrϖWU%y|EBs0.g:^:2J8<>>SZCQJ8ޤS+ _ *|>O'~?<;j5߇56][kw RsdȺ 0?$Tz&!s+MM|Kc4>0_PYi7 ]nV0Z8'J5h:ôQӭN6t[R|}u3̥qTOq8LƜS MAkP%3q?g$pSEiiwW$!ZVE]F6DRua*rR(Rp+NJ)vɻl7韵xW^7ïE?h~,_G1k hrx-quhKCqC1x\5syyg@'{ MwᮯgwƍY]5喝]ZuOeUc|F\-<'qn!ir\wWg dXEY00X]]XPg_C| ෍|} |S7;ɁX H!̼>| V*cO>C(g`)'<>7^c 0 ߈E#kICgxšTF[^&!aY/"2K^gY~1_}ú4w~wt&O4[ /2T-Cc{o]qsqb-ydIg&qkanYYf_((b1S`k8wZ5,̀(((((((((((((((((((((( Zo?DGWh_-j_Pzź-#~/?1Wе/u|eCt1ePLM>Z=|OO⮳/V4 {.6I|s{Z[oYJ_iQkzROky]+V4[uy4{4|kZ?oJ'tj)xG]arn/QN|۵[ۘ຿[[e[ł!8@;j (cƻc~y|*_o+?pO>z?ھ׮kQ@d5F_+?;yWy_iˇ|G֡?pZ+&2XߤF3ʼO\>wo?g^CSҴjM;Yl5m>i-S[;om%9`y-o-흣-YbGVM4iviSMjz*9ƥ9J8Nq'FQiQi84It|P|!<{/[w%k_-Ox#Jt+Wkύϋ>׵[\O6}O U>[~ /uIo JνYuYQb)aUq|]UJTJٺtJ>n&c.Y8O첼v (S/qJ}o_'W#SNx:c128tj*5O(|iY4O|#⯃_/XgBWo >XkxBmsT,Z&c忴m>3x.4t/$>~;}ρ>4xZWW< IR~$|Tk1<]Y?gΟe]/a]3~i&i_ig/"<]IrG[MZŦ}i>|_)~)oc^%RNoh~=t/B"uj'E&S簁/9+֧'Uc)Vj4B~FTJU%CX*r$j^rfXYXq2dGΎ6(Wythe*c?ږZu(,=,[z~B>/ >&x>+~_mMwwe,VhuxsXĿEZLk<vV~)At? ^W ~xcI/|9.->|MVl-muS1>&x?`iE8Ƣ,7*w*.TFq9f7JX:0N* C/?m/ƽ:u6yIS&CREN/FN/+?~~Кq7=ghCkնkfevA}G>wc%-v>+h/_|P/g:]^5t[n.|GxI#pM3c^MyS[ofVvvz5 ;mb |p|q.'8Cθ#qe1&o<s.aDžt 9_5#ę?o|O᚜s|֮/ >8⼧1V 0'Z]Gh5٢/؃?<9⯅zń%'}E/b3OĿoGÞ(ՖTG?c')__jG]s6=W É,\mM> x/&x%OY|qC +CSL7. >yfo_[%-f눟n \? O3W[܃\ˆǜ߲|[O4O>9+OJ]Cjڡ>*<|d]Ÿn;SOmORžށIh{mND{4mu IRi~~`]?n5ާt d<|NqxV5jDSڒXǧ wmyVm%co /4ޯ=SU<3k:<7jF^S:5wi-8f%6GJA_PPEoĚ?̮sw&ke1K"²Kt`v=KVh@6-xVVr㙕`lF5)dXVIn=;ǩj(W|YGQ־|YO%ƥEu>>VTOxNol|/yk\xwZuk$VKִ(5KhmԠ+ԷY1PX|?9hz?u2WӚFmu".-ޕXjmɋαlo^+xeGJ2'EFQmJ2NQj4itEҫRJuԝԧҜԥRRJsR$ũFI4IR +Ğ猴 gž/4_x[zm xJ4 wH!{k+Yѵ8.SMK{inawh6e.2%N2ReEJ-YM4M]RVZuTFF)ʝZUiNJu RJPZdI_Gtox/Ú<'>H/it*1hM*mecmDr)Nr)9JRnR)JNɶmۻ+VVz+ׯRuV9TZI9ԫVܧRIs&&l(3 ( ( &+kxh'd1 H9b6d7VGF*"2%R%(-Q](Y&M4WZ >|#gi.EaE~ \դ24mM#IS]'c$%>^}߈pgYel}JtЧSTХJ'^TӋPb ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@/ßY7tߋ[Ěϋ+ړ$:u[xg;El%]KQקMU#E`2K&s"JΗ>5g隶_߈- eGo )sF/+K,@<;[ᆩ}q௅Px~%ռAC'4K?[izvk=\:ťǧIc蚞g_|<1k@u_B-WFYZe/,ḹ:G!K# YQf.e (a/Nm<}ey>v#kP?ej^E xu|otX#o^k}.;Z3/GW j:Go e¿~>Ҳ|K~9x@i6-|t5ԮصQml<|RS+/ u5߈ឿ0Ox+ğx&\⿈ RE/~"xu,-E(PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(>-4#I׋5[[wB <_qy}{JxZ}Ljq5-n4cÏ7?x&OaĞ>k׆];y T~+xwP4M͇5 _]壸ff{`Ŀ |sjlԼ?|ZE}Zݢk %=~<3+۽F:5 .Α!TZŲD: (Ky >$բVܦ&UD$24 6)+6~pKI%ִE xu|otX#o^k}.;Z3/GW j?%7 5u+-(|گ"U}6mWGHs?ηg*>?𕏍>ў7?>5 xGjzï~w0um"Q?t}G%k"((((((((((((((((((((((((((((( Zo?DGWh_-j_P|n~%xu|xCX4? | [=o1x4FKWsk,u UH-4m9Cc[|M~xN/.Ʃz zM~%YK-`k=SVSH(Wū{'5?ᵮs_>$_-Bm-E$z>ėvb?|~Qj ݬq,%Vo$g1 he[ "=>+&31y٤y>~/ͼ7Oty__h`P^]>.ໟ xwįXFS|Wm?ٟ>dVa̞ ȁ5"yRg\Uǝ-S ^ @5?Zl>KxsJ9|(13I nNt -+LtK{ >%H(PU@ PY0]c)v!]'Et/#k*[NYIw ^o]C y}=E<} ?JAï:w1^;.äXY@2h#E+>WzῊT4>:[Vw|E\þ'u]a]]^j)& o/m6MMeMB{uhe`O!G<%|FCރ:_cW^5:o|H{a./HSSVdm'X/tA'xğ,^|~%Et|!ZӴZh_Yawx'Z}o'|377ZǍ<{{'C4:֩\Z݀v <I[WZk!.|t[啤Z^"e4/im,xwMY]PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<ǟ |%&:ŋYm-/m$b.+[2PK˨=y |!{+NeZFt`/KIdҼ]e/*}f4Y>?"E-X2MH>|qknx~hmm yL4l;3LӴ]:Hl/KӴ8 K++H k[xc C(ƊUP^( ķa &\!3,sNL9-]^(b*Si5z]Ͷ%WgD^6\x#*ZŦsxöt/dE [kFi[ |y_[鿴'~'hzl,xχ.Լ)= u7wj\qk5֛qsZ]z,y6Ws .tbx* `ZbUbƥzхZ5i8ΝHFqjI4EsQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhh Z|Mw;'j-_56!}_QIFswq<_Sgex3om;ԵO'Kӵ=(ZđxOqGVqMH]{kk*pxŸh?I=yoE>XǨv2j[[Z4גLךDI3Y=鶾+ (a:N'}|߳jMN?OGjke&E utY+ iu*x_o<7gwMG u|7j71xh0-KhE\O-^8<[Nj5 &_+gN.|Kᗁ~#Fm3隕ލ<{(}kN4JRH% 1ԩRThST5Q{rcK+e4Sbup1`&^8)Q|6~_<5~ܟ|UGľ%S߲ ADž?j64Ztz}j567_ c0b~!xڿPğ>4í3~oC-_KSO-t-Ow-ji:~{U+o=QK|u#ſgl|Lie!kBv Ux(΅*1N(Bu% n RteRgqάҔo3ʅ:U_K/c>GCC ,*1u>S u?c,N7YSpJ'R}g|ae.Mbus<Bsq3C&]k=( a\E5OSşAW/wWV?os C|l`uu%k";[C.݂"ws)dSŸU3(QT8X9%wN'nWg̟xg5h[Zh]`ku}O[Vt WT< HgUw>ޕi|ۥxC> Ժ_oOix߳ǃC/<;6Z%]musĺ /6Q]Y]xw'e|3.gy  ωrbkx[l6g b*fP˨s .X'r\Z9x>pU%?j/E_ WΡ࿆,:?}: ?_xSÖ7IO$h |=x\j^ }<3f;nƷڋǗF׿iφz|3|R/㧆|A"VOxsh~2|-D:m~+|$6w׌'i poc37 x3/ù\fY`?qF_σ0&I82+U'S1na Wbxj25?j+|`赽Z$a[t+[ƑFiz_`<}{w.?s4ge4|2ß|g-O_ d: x_얾&xFK xv>&A{i~=J'ӭ_4c}`|5&Ax ׃W 5jg<O13  1gbjg3YQVCYnaS/`xz|39~$&_|;xS>~FOj>H9|.U֧r۾5|=OOΚrWQ~v?OO~>-ih_4KjJ, o/~`viOZ5)E̖O5nE'̫~@*jٷkp%oYMlOWg,ֶx|^+*f&OWU0YwYe/*~(qGGp<:93~iWC8<.c_k5qk_>*5?IԴk; N/߁~x᥄wq:oo j ݵ_g xÞuڇ |Za]/šG=xANƳa=oM': f4jυ'O4Ô_EQxVߵׄ|?ïO׼?Ӽ B}QSG_=mt[Ե_wJ m?sO0?d|Ytt x)h^5E3g]y T--ZM^w_Q K:dTkONxZrzfsJj~ӌ-<.> rիgAN#Vf|<~3woئUcž0}c힍o±׋!]SR^ V>(kx=aS7ki1K.i8?i?+ o|i9Yi:׀俗WI'čCP#洞&Wc.Rc0&U ? xz;SqDX8f馰>/:55M|k3?o =h7\umD}C C 7/Lh#1xZklm^;hzLq[cIgWHΩf_wG=sҴ)hBT g%]E7O햗h6V:-mŦXvptEFWH : (~O|}_WiAO:֢ ɇۺ| 5'?&Dà jZlLj'DY[Ozq_[it_sj垝exgRQrcܥ&KV%z"өZ)Rի8ӧNe:*NJ0!9MF1rI6Z^]xP>/541cƬ|KT0yUj^:u<6[+\#ƖCRtT8:] |a૏ ~|5yu  x*uxUn<+iz~2q3E ,^̗"U$W/4.o<| ன{| /b]mR}NFPUƓ$mE>SE)μ13*IO)sUI«nn2M\IQ[:'F!f^oI3JUiW1έYaӔ4%RU>~߳gGM3 |U |,W>7&4<4<)oah;ViNFi"-|)Sÿ=7?u궞$Ӽ /xWÞ 53U a}I-5{ r[ԭ#լu&KxfJ:UWsZzoN5&եwQNTmx3n O72xn?1O4rzen7,4qnUkᔝR vy'go{tK,ZkƝk^4hz~c7 f\{yRDI $rDr]I X֥^ӍIyGa!:Q :Q4dc(mF3՚pJ+:yQx4(bpTI΅i`)ӝ:5g4jajU(xtC>gG=Ox{LZxx[/V~,u fkۙt ).55[i_mYYQd,C#.ueee! 55)T9¤\e -U)$dڿ+j;٦qxغ[ `&8G"M΍Iғ7iBI-_|K^5*ŸGSZ\!5XԼ5&ݮ"մVQ͵{Y K1{_>|/O῀.]^tڔ^NhB^,E\KvO\?>o᳌}{Bx|&m_+__4SJ8\t'Nrфq8,U?eWRz%J9tR4'(J׌i#VW>??g | oG?W9~kVMWW񿆿<%[-Q5 zh5"2- f/g91:Fmjz>n"^'im֮+zUݻ>ug#'gYNf mq>mG?⌫1 fj^;zs^x?K>Vy.<㌶Y3⼾Ysqi,fYf\C*>}:o8ձfi2\N*%7O>о%W Dx#Þ`!V&𦏡: X5X] d+59~'fճ|Nk?fX >q+gyCSȳޮ'1<7iҧO)̱ˡN֣E m+?^V]%4_.3EWGO?FxOҧԯ&LԮ!nbKcy4gثA?x\^<^<3*f]vQ{k*dg<[qix:--5 ƝE53/O>$Oq G$g%Zy9p&1Ly[`xO2q^ZOƺu~o xz]{I Zܺ.&xoVOU59*mCI; t>Ky|9!_Z?/Y/|MßxSxTMkgIWÙg|YTr~CKESZyc 11Y[KGxyva0Q&3a:EO׾'ԾUQ_2\9ldr:sKkxG} /!N}Xk4#_-ݮ?Fl5Yn.Cwx.fyzXBͱ;,m|y%L/3Ml oTIJN!i1~$֒hcWd-Ҭ"amncf. x2s:G|G}wXmo8-FHgwյ Z6bIxf cg[0 9~k>_-s,U?̱u\ J<:\E Ufg_ޣk|?sڵYjc 6~"mx_tK}kֈ a/tXu)cPs>x#.8> MϏAegVoYu{əIr@ǩWq}n%~!%g76%X ,،CpT(a0tOeѥR o_e{Y ~7x6-z?Z<6A;ǣx~;_X][ڜ&אEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(ږ_E֍\:s+u]7Gk_xt[* PY0ǍwQ'E6UW;}?}\֢ Ɇ#!ÿ,\V[T0`0up_ߌ_~8/*|3͢|}|> o-D]xboj7!,;5&][_z <$ 7XMi_xWk+ֆ[|k\Z4d6LJҫ5%HԣׇxUhTyh45]B^ƃV%K؊tUf_9ӧCe02j9as*xz/*`CR5l<''?<㎵\~9ؼ iψ5ZW~&7]|K/'oJVi~mb1e#x ][²Z__u 5Ɨ^mA^!K%rGo|>O[K3^ k%p[Z9bp;A!%8aO E8z8ƥ8G3SWVN+cr9*цb'## R ,=|5ʱT'KҥXhukk=G_?}i2k(/?ڟ V~ÞS}ǃM-Z%ԼER$#_Ok5|IPn ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=x/<7]=?E^e fPu}B K{k 8/&n.m@,t9omusO_'wd6+cw\jZψ>1W}{Oѣ<l١I'Ehc?ğ=L.|b4WC[Jc7VVz(uɼ= Q|7UKoe@ =I,/Mtך]?VԬdK;#[-B [I X9hWQ@b[Vo2CV 9g@&+$1\6,2e XtwM.Xn+G$y:°i:1Y$ya,_Zç[7iw77:vtPYھI5sPt]N}WPLio5 BfHm!VX7UI/{ſ?miگ-k^1ӵO|_xֵx÷¿\|BoxXe-վYmIJ)4iʤw{Y{5k%z[.\&(RUV$JXATSnN.19a>g+R ( ( |_K f<[o:|\WYKsowovr=“*4 hfƟqxhAoÞ>9h?k=;VA3|5)+ƧVRɧ]Kj?OPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/>mmt\'GxOx-CŸ _]J~k]ַ&ezuͩ&k۸J*rм[K&59,NWudciY4:Fŵ= :f}[ [}?^iz7WTt"(cJo5{t5 E utYwyښ~ɡkQ@|pxP<hd [{[)g gTqgOT|- _4Ѽ;kx7^F@< &7|6Ŷ/|=&mw K}"Ѵ.e +C sHȬ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@]sxcE֗X,sov->?Au}3NmT, tQfHom㹉fXXUITH$ @/Q@d’ wQم7ؤyme܋$+{-wu41X%厝 7VL) u ݘ[IQ#ynHJ=vQȲBWwSC^XcqkQ@`[ko:͢jZ[_i~}mnU%㷸K/&mK6$syK &<7~8nVM7ψ/OIpIxz[+Z~3iq˧x~YW4 k6iZR,! HթNZNu%m$޶MdΌ&xV NPLV"iuFeRQFRNn1QM4 㯈Ǫ߉k:Ze sw7Cgcgin5<Ȩ7NjNZN*n8wkh(Rn2RW# S:cqx XJQFso %^&/<9kj_\}ơ̶ "|?D:όs^v?Mi+Kj`8%I]P԰ؘUt'N.TU%.GMMIOjRZrl6Ym|2Ƭ/SƵ::2ΒºtgMd鴦O7uoMYߍ״ώ ucwO|f7,% F+߈ZscT|OŸWVZl?[ς<|&Gx7ᶕ-OYx_ ڛhf}V -֗xF#Mmm?Gv)(tJ?ZwR"+_P7%>h<҇<\O[PΡ 18j*o9ygSͨLJ%Z%:O RjNNq(ʉ6>"<5gnLn;IuKme`ONӵ9Vkxr9_0\+χW<'~8|A⏃0_mڷUEnEh^$O_W(mOJVt˟!8RWwNrN(MѧRiFHOJVvN~"3X\%ym|PK.1eGKFtT^IB\jxV>vls7/xQҴC£WHĺ֡ڶ>&kI4|1jEwt?߂+'/_h7>)-$?ekuyMZGZOqfE * N2IN~RQVu'gR +cNxUpjuq焋aT*ܜ\*cPTc>_O_-|GϊV>%|[yokmRIxgW5cY%4Fx£KߋOu?>|^S]>@ytU1jP隙[yU,m&.(V+ry~TsV*od7[fntV_캘:Y9n6rsR~O >Tʿ:xkB_I*i)k?>:.ޮV5~ AQWګ:eBJQۃn/j-I'W˙erm\ jkTL<:2UJtaV1R--. A5Ċ) m# ʥ ?'IO^R ;|+x0_φ!Hhi4* e-}o{>xں'ִPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<'>-Լ=i|mq Ew&xNӬ#/񏌼+,zzbiBQ'xjxo}/!v6> W eG'{Wwo?g^PY0ǍwQ'E6UW;}?}\֪VRiΛaiIm,{i,Qkyoowlh.`x:iM4ӳMjkT5P5)P%p8(2N2IIM;ڿ'#| > >)xN<]=O3oo|C+_WJtkze'4؆|դ~?.ۣᇍ5|xv__ MS^}d}yiy(ts&|E.׿`”]K+{ե?b"5(5~ZfO0ur7pO2wq #qytJ9q|"x h]Y5[Y_׉WUώ,:FL뗚_7?7|+~ ߧ'f(qh NhbRsF X[mgF-:\|+\xu Xc,?CVX<RBKύ|EE??Rc9u(q*0zOgTRB5!F}e{U%B4S˩0M<.#,Lyv )1eN/#aB1QP˱uq8ЬX%F2|/MZ_Ļ0|>|/6bN iֱj:f>7l<1 Z4K~Hף+:ey/=QOƿ?ß xg~0SG>?MLJ/4[_fqjɥW EoN:bm ҇$Tp!/jOtbT9~?f*gx{&. -nib{]OIѭ6yi:]Bb#^/V? RV~?}e6.5 rU0'Xn$ ޟ2}i,)IJNRvMɶI]KI-ZkԭRjQRVr6'9&MI m[K-| ɗ~?o_)U@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<.V:! Ě_uKG c2P).LS~/x?K¾*fǎ5 ksxgJ~x-kPէʋ7Dv<ۂQs_5_ᮟh4}kǶZķso xRl[Gn_\i`#t﵋9'EA{ƛ5Ɵc> ֖[|RDIG7rxC4t~Z8],4RUu=9y=/̂. En>C?|lU>{;y5#Nƞnfhpm_.)W/k F>ۿZg⯇ x;=r|N[\MfxwE}O=sYmQ~%#ӧ:|W_p8fCru5)~ J|"n-S~4ğiZޡj:U/xkU⛍P h>-FKk4GS6Z1&YT>S|6+2ySpxK <1S;4ryG\! v"^hm⎡&jM$%zO<.< x<_I sG?e{,a%DN͗Rm@: (dλf6__7ړy>wyښ~ɡkQ@d&uF/7;4O'fԛ󼝞.#>M Z+&31y٤y>~/ͼ7Oty__h`PEyŝ~wO׉̏r٦":Ύ?˨pJxXqa:[lNWxW)D>Pc¿ڟS %?~xÿ `|1GU֭u/x6t:ӦZ"G/2_J3|rx?ķ^Ҿxs |e: +ړ$:u[xg;El%]KQקMU#E`2K&s"ՏBD?YxCÏ o_1}ǯUfm7zl1GqsjXAqzo +|+Ѽg 5_2>h},-o5MK^YԮnnYyK+;oxlHk+$nrpX N NQ (cƻc~y|*_o+?pO>z?ھ׮kQ@d5F_+?;yWy_iˇ|G֡?pZ+&2XߤF3ʼO\>wo?g^׃g  ~!6a%>/|"_å#Nx3wjK J?ֶli: iFxk¶:|x:;W#f"FkYZi=x{vXiO||M񽟅#xJ__? i~|J5[5ڧ^uA>ĺ翰 ^;;.o/xkFseu/tپZu+Ѧcx z]MX<{];M^L_4-[R ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@ ]~ c@65.yn4ռG>DӢi>.]}5V ӭ/ 3Tw<+InaѠGxŸ~ZO]a~,M&|T|O?_iKYXY]h!}{S4]g^)appj<5҆aש:F8h¥zXjtkWO'MKF&аY&Mȱu\X:UbT\?FQC YF:L038k[5,"CC z^\|O_ jzg1w;| &C^>ߌ<['g+H$i~a ZNk>#mt)2|eaYox|ş|>{7 xMw.i߂ޙK/bNk9qIVNXdU& TcJʝ:T(yElRZhѕa*15ysiT[p{:q5Teؙ|am|-nw?)k6tt?$a_g|?5c~[ Hf|%za5w>=xM#[_uO톿>k`Z> xG%u -RmWZ"T*`[G/n oϱ,+[u%Mp)ex pQ֣²B w72`_x_ԥ6RpXskUj_Wo|%-kL? Czއ?|Yojo|UO}Sn/)Ƈ.'@MBKx~'W-i+O ia61 5kI~_xC:޵a ;:嶼t4.6*`p*pW"xAMa)8Nw:^sʭ^Xu,GE 3(pt81f WNr,rН 5+į__T,LR:;EE+'ED?fW=%StC7; 5j)Xi~'4kkk_ jWO>'j~< >xO߉:}3?5#wkj~Ѯ隦l5I{g-ƠG/'UJ&EN1S犜ZВn*RM6+SKpU1*4iΥhR̨p#H)W …E9ҍz-6%NQ7xo¿>(xO :ӚWƯ$2xžOig?Syiu˧jQZ5; #ojl6Ue9 f4mB9&S UJUp4!5gNkǠn8?j(7|=;k? ?bgR a>k}ci࿇^3|CBu x“x}-5.O6e53io/UH<! oW:g Ν,|g9^7")R-F8ܢxM<#qp*،D-RYJ=#š+=JWG =ֺwyyU,_.[t]ODﴯc4q^ԄtZu? g^fK?G/ɺ(?mK ?|7} xKq|VXImŸ *^ |R|F糟o]#_#Yxƶm#y ilӻ5C%ʳn'ovAęn3p|;qK0*w L zmpeɁ>JS<:#xO~xwt^8kϭX?<;txoP/L!ĖEc|Fmn*uoܷ+"~袶îj0x#1,xBU_|^ U> whm~+f4d{<ZOΩsL1IOs<-\6k7YYel6ix;УOX UjJaQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր</ []KxBLe>qjz6Z-._&SjZlCa%a῁$> .>+GVLm3Vcwmy"F_j>?uBH~֑[?>6}k|2a7RM-dѴW0__ii5`^M}vwIm%P_PPE uF2btWI+b=澲}%qpVm0`ڌ3`PY0]c)v!]'Et/#k*[NYIw ^o]C y}=EsZVYdp; ru)cY9mL==ɩjv(|Ju|SOZ$W4}"%펡u_[QϛO+[;/~.|87û/:S UiW2qkŖMm6?~ZJޡmgu4=o*ztƅg]Sj9{.hTtS%J)9ӚNVvqy]L&C-g xʣ{L6*x<^#LFΫ"p?)e[P|Ɵmt}CÚ>"xoOo<.yi-/ +-OM^Ω3oRg~5~) OƟ~6}/6Ծ⯄5k"G' hV|;m wAдχ6^槢\֯S89aԩKK>EQV7>㟉*ǯ53<KӥqI7o E?~xQ< u@}ag^j'ux\ |k=Cuk+ϋZ&neG<3h~[ ӵ=@|^mEޱ.c_dg`rJ85*t(Z)T5!B*Ns&ѓ"VSq_=V ~ʧa!|-Zy1_v &#y)T څlf:&o]>j׍*RmWwKϊ+ѼG o [J?|kM*6ھj>*7wOs -sEO\he@C=SIl/aӼ]>}Ժ{/k=_\KYH:b* Rq,k'̗,fҎsV9T˧_0qWn91Sêx?ٻK} |īZUω'k-_x\_3. |/< ՟^y kRr4CT/Ty ӴY5hNi~D!|;G_.'u-JPm4ɡ\پ7XӾ3ڮh>߅kiTCKuHbi[J=UxᢗVM*p&w&h§c.2pCk1S+b09]*.XF /':^"JRFK𦁪vRo}zͮOhv}%݇?|ˠxjL.u{W3#/5#./OY$s#K[%"&u*DO"C,Ie7_ 3|)O<3S֧i%{Hմf"`~W ּCh G~. ]<~#,D/׿ ~ u9/;|q[iE>%kA^0w  x-Mg,~!VkKď2*߇ Ü&Ur=d?U<Àax1|{1㌳5|կ~+\RW  ,5mA5; n)O7n9c$gt}:im_:8\Yd.I_N*88L^=S0ͫ13Ϭh6.մX4]7Qi5 աO[i<}$Uo ?|9wY~={^v#kP?ej^E xu|otX#o^k}.;Z3/GW j(4{/=OQI_q]%娲;<ahFi~%L-wkwlGm]|+}w,_xǏ?~<4z$w-|9 r ּ?ysȶnnL-97WuhWt7B-HӴ:1 K 1 Ɗ$1,@4 (-I/a}>ӸkKhWA=uqomsmIvEnMY|C fY_,r[EnPU ﮦӮk{kmbK (4|b{{' >"|EK>=;?*ׂUσ xm.,:~ukK+SEF"?f~xQuoxwFQhŠx\5x oPm-gVKP+ck㺒T@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhh Z|Mw;'j-_56!}_QIFswq<_Sgex3om;ԵO'Kӵ=(ZđxOqGVqMH]{kk*y? ř'SMaMnú7-4k6^ť0hGk\% sEqOkuxxbKu.&`XXxy%Ն%xxe7a[( ɆL뺌^nvi:,Oo5~7y;<]?G}VL2g]bsId|_yoI;bh*xkֻ 7i: 4o jqũsCn/X{ͅCG+(>^ B.I7|,O{(vtiNf{;X#6;%*4 uOuW~ k}{K{}Iѡ,qE|֬Lpmo,Xx #Ia'Y")<|ae[ߟyaoq]rQM:Ox:O#ԵncӬKMR[V,J5=7ZӬ5PմVR]2 ;RӯaK+ Y%;[ydXxX#v _?iYJ%sſ 4?:~jWYZ\~yq|c?~"wx_ox_u_~~%\m>.kϭgo|DE[ߗƟBPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/>KeYZĞ5+xNπg7l&#xJ:Ꚅ6iF[,妑 x i:'~7?մ{W]&H-)|OhC=KԵ?~"|1|O+N)^M2ZOam4$EiEFok}oz/_:^ݧ HO8jVZk<-qݞ8&\Ȍh+ (a/Nm<}ey>v#kP?ej^EbxhxTY")*)*E|3z쭡6oxoϊ4߄^1m| ~ϏtF"v:e5W厝mR/<)o|Ox{DwC~&x:hwznkZ]֛z\j7vG4I ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@W"#sxz#[V^݌i gW.`h.OY'W:0|[0-t VyjkEmeE ssq4ZZA=đA,$l__aKľ(oiZo[/uKt. yu9wZ2Z¯"WQ@b[Vo2CV 9g@&+$1\6,2e XtwM.Xn+ho2Zh? -^uا >2 DӢ}F_f>7n~z|V-2ү*|,+:ņ[E]|^/xX]Jgfq5549߀|-?Iм-]"B4{C3zm[Z[,s;$Qsuzf[jzݲk4}*iT37$zWkY 7{kVKiZ oxZPmym&Gug=~ϟ~h^!5?3 #KС揧꺥d1EU5yGcG _ (dλf6__7ړy>wyښ~ɡkQ@|y[/s[QlMG?V:&q֙,<}w}g>񖏣 bx62xw@KXttӡOX֑L,v42j ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@]sxcE֗Xk+iՅriskߓl,fup>x~ς\IÓr|J֐dIޱ-k¾ #~4豫.Y %I|0׌u?Y,-5o h֗z~.^0o{}40zV\ wNJtu''+9(&i&n&ta0bJr*bpНVNR4*g(2sqmFOGÏ1!Ě_>^|W _IMz]VZ<1{sYjPlnn$~;|=m֥ :&q.GπZ_U<9xKS4&qcjzuo8D,hS\,"99qrJ弓ɤ吝[sT+WTsia]j9ԩU.EvUnNM_9G˯?|*_𝧋)Ꮃk+'..+k9$կ4hq[i kiv~ֿ=F|? ɤߍ_ e;okc5KKKKmKUtS L"M^UF,21%9"J^~r)_NqTn,=UnTg=5U)іrU 6 IץZisϡ_?<+:o~^>'7:?oK"똼o[| /CƺG?j^WJ]J<-Yhv7 LY8o1Le9U4qS,?Nq+tJ2[^}^e_.s 4}vS'Nԝ)O VB*:uF)|!?Ɵx\ֵ/+TðO_h m Em.X).^8j<I/Iu9|xP:ݵռ6,ơ}-CP󴖚-n[Q#yUL%zP*teJTV3ZmJ]-$Zh1UeTrm,F1*kP4p|e Jy>#xLe|E֬]KH7z~omw_X:uƥui^i67pKp0#l/fyvUF|UpӭSS^tVp ԌN0RqQ~1z#|i{x,Η˭ZxB- Ikfύ?Xw Z:~jڣ;džF=Ww_+xs[4'}ZL~Þ*]_⧀u5;=<\:垑wV}O Բ\vi.!f4s<Up%|TrX#!f[e<PPx_K,5?h:u7u[+cO<2#-.#BI!m^"[Kx% :(h|m@D>KI |YubZtV~_uxZ :6ZT֮t77xsÎ=ڸHpq>oKpAOqC7C'S/<p˛:UV"PPu?i֥߂|V{SyW.ZiA-ieԮ!u[{R.x_'{Qbk~#ҵ۽J4Vٷj;'uCљWfMNg20x؜6vkeԫ t19tO~=σ>(?ES[/x *]惬i)txkW5-/AեG1j sMh;n xĿ<6~ _Uw%`|YoO>+|74{ k jzTd˭ihb|%✷=.2N^<4k5|ʾҖ?9fY,^SfX,6aygz6?_TǾƍjuK7Qxnm$q2[k~0,g{4]7/[xwQ&1ieZo:qWiW~'/wo9ؼnU?`bbs9PfUqFMW~7/x[A#:/ů< {lv>~RhZbk̑;Y_?l٣Ԟ" w ^)G ~3lGg5ޙc%צ#_X,Hu;PyrCc|q'fq]pvod|Wf%x)[KMۦ뚻 oM:(lo%Wk8q|)2v'`LF]VlELF V\TSpQ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=?n H3r5xK|³.|?MQrz}χ[mk V;5]:6-dp %x |D֟}<mT?a6!|)"iCywͦ.Α4Kk_v_DxZ8އooۿivm!+khRL W[ыE;W-vNMoQ@d5F_+?;yWy_iˇ|G֡?pZ+&2XߤF3ʼO\>wo?g^CSҴjkmbnlo gohn}OM6Q +;MB}mݻG<H7ԓM4itZS*9¥9ʝJr8IpZg EFQN2M4ij߃$|;_Ǟ)&Vx[?C|:>k6o=m ]|]Mo[յ0p.e?gڇφ|c|=|3Q?NVk{_\xÍ 9^%o[S~6z$Oxzٵ xLfXѬG}a}:rZt N:1!VXISuZ#$Q˱i̥8ӭ1.I%!W6c4OsUО4O>5Ǧ_9tWKK_^o]Z}g>%x#L-9emRǾ+ҠSEM:/Q^s4]c|ƿc_z^X...4uX̶z:ryB4aE8RTJUa*Tdӆ!*XiN4j|\ULu)+\ BK+pk*J9OZU1p?$|W|,g?3ğuMCgox_Ś͇u~+xBYu͟?=<+$&,ƹehs&⏁8ecς:~j'> [е^>|o|/P|+m#HNj}Smwem7j5js9SťVLV0)5QJ#R4{EGӫ)h.]bpG#[ 8Lqxl^u1Ͱe)ӥVb TNMR >'_ /k(M,>f|; dO=dK׈5+Vs,wwoyzf_hΝc::[څm ͝r]D$2̒#) F\=ZUUB FʝZ5iNZU :u)*p$ %(gxo OƚG#}lju]ş M$>?ů<}-ß/_ýb[-lx_P[Uuk/dKЭ?hn)r1Mq& $,.1ٵ.|dYjn yF>ȸZgexl#K։ߌ xIsM!|]gNP.+뚾i-D<3IZ6vmxV @?O/ ^?φBI;]|^?Bԓ:{QoExh.]^S?%ͧ}TySR>&Z/'b?a 31x^M8j<)/,b2[=1%>x +]x?▉|=4<=nO+]_?h;]F77#z} Ht]!AWYWľ/x? ߊ&!/ſxVj֗#ƾ3еBúr,>cp2>:'qsJ|A$2x gY>6/&3̿/ftr,fq8ܛ(/īό75 G O?犿b *49_.}o,z쬵fxhH.hh ?i/wůφ ĝ&W+xD>äf|Wê\-7~? gi[l<3ÜxG C.q<qkgxYV./TO&G. so?x.i9>?~z|Z6c'I‹xgOO&I[^]iίL@O+/𿀧n/$~"ҬtIu>&v7GO {xWT|Sj~":>es^4mSH b1 #Z"EJ)RSZS%N8R8BbX((((((((((((((((((((((( Zo?DGWh_-j_POu¶v N tGVhxf$5*]?m`kizQOqtefkL?i~$E>=6dQeҬ&iZ^ֱ<iqw=7?>1?wirdk=<;kڍ>~x=Pg4R\h,VIswmG^Ixi>L^dچjt/ AeC\wq?Z,Q]=޳sU6w_~Ta?n_ Sٟڿjzwvy?k ϲϳ:(-xVVr㙕`lF5)dXVIn=;ǩj(V%pjҪ._Cs2Hƥ, -сGGwX-YEۯ5^}(^F4oq "hΦbkfIln:RJ*Rr7/ZU]Zø+By.iW40up0u >2 3*|>֭IP\0Xc1O]O4ObV&8IԔf*pζi&41n*2\/g3o@.!ே?W ?Z^o/#m5& wZ:>cHu}*K6{%Q8{ak)V)Qg W.|RQs=E =ne +ҋQuUI.wi㰸~2NtahQZ!*Sb%hR h|٫Eo 4C}k~hvxW日C࿊о+i*W]s~#ڴ+GK>Kg/? >)O>e>桤zJ{|& x^ Ѽt<#&ajF[J4 3eLF[x<^N; հգUWX$(WƬJ.\x]|y~u09~wW&kc[чgR/Pc0q&`|oKe'")?h!]jKa/?fsiaj:Əh^J-총_HރaKB} 'MCe{K xGd~%ѤicOm׎$UE'Fafxڸƾ&+ЯkRW=oVTNlD֝jӜ)KOa)Xhr:?O 񷍾w|Iϵ}GV~wOj%7>x?{_CSÑxG_ xi;/-Yt]_+\J\:}֩MPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(5xs4]F.o xRg5 |Q ~2Uls6+< Su kZ7SuF}ĝ3V 64 %[uO4H"0 ^&Ql<NiJW?mjm+lmWћWmYmؕ iN]XZ[oi?' fWׯ|?zEֵu N}>+i/$q03 <k)|;aƽ+ֽ8~jlMO5[i4.(a:N'}|߳jMN?OGjke&E utY]Ÿoo+*}k_uGsKN]vѩrC/m?m]7Ɣh>JJ5(SpN\)E{#y XlګkhgU .(ej;y}9uJqxC l}3Kq~=K'/Y~ ~?:guG:"^Tk}C4]At?\oxbz_О g|`ٮxCO:<;Oş*4־8]Zίg ;xtm ᡽5|^ k'Y|;_|,qxj5j, CUZX9ti}MyÏ>|G0h?O6qkڄ-_ P4>6Am0||c, G[cͺwsymOPk9>+ W۟WVu*⽛δ',5*~SEJ5VP:~^qv# >7=׌>c>cacxk/y|bWOkYB~7%K~Zmb**β\g#ʵ-:_Xui,dgESj!Zqs7ճ:tAjL.%˩מ6VXx:XiG/P+QOʔ'1~Пd|Ӣ){M;?>5k{Pt?o~N%WXNq_ZAOQsOxoO-uO7ckx[];#|e+{G_t;m^yKN44hU{:S Ol.& 7b~"ıobrİ,2*8]Lz/i|{w2}7úAS_i7k_O㗃| ]:P_V6tؼ4I&eJUq5*Q"MХsqΣНJ4]ITtQgq3xKBO"M5j g5Bsqin?jkh^:z5y+O,~ ~&kν:/K]_$zvYjzΣ9h~h+]~ xUfBIuxzRj6i:/McP0]jz<:=OGePY0ǍwQ'E6UW;}?}\֢ Ɇ&Qipxn-%V~iZj7ng~< }~t+KѬaF4k(kӬUm.k۝KYeFt/FG4&mCVզ,-uV^u9`(5sRu^Z{,s'Q@b[&&4?2 A%٤iHд]GKMZI. (Ky >$բVܦ&UD$24 6)+6~pKI%ִEIM/⇀Gc5?9RY#O/@" Dk}Xguc{c;(Oٯ㆛ݦ~2S]385|]v&ucX|\'ƇԐE㏇M⟇wPh~'>0:((((((((((((((((((((((((((((:Duv g"֥n_k@Ex7wWW5CoV|o~MN!ht~w=PZTNӘ8{ S<[|J]>Zgi&+-/W?k7dxc] m7N|wO |,Ïx_]Ɓ|B> –-&AiE=?w:w0l̉7}x\]|?x`+}c ) Xk5 /FY-<|mhm >$>|beY>/x{~ֵKE>/&,%AsVpyY\_l_(a:N'}|߳jMN?OGjke&E utYwyښ~ɡkW|]r7 "W[$Wѧ0hTCx j>/f=Z|˝{ïmN ,n c̓X;6UҵUz\xc|Q#G/ďM?.~&?YѾxV|=\kv ҭسkO$z}X](?cou+_k[|IJ\xSZ|<}?kvo-'nj >}E4UGꐝ*ui)Bv,^HYEI!*J:<#*ubmtU*5o^3Sƾ?C>0Giծ߇Y˝;n>Gm&M}SѵU{GN^7@gi>wO&6Ik e|^\CsNj% V*'.<ܶRK1)%`(cp-Bq*ש?,*]gE4WBZ4#Gtگ,O/мW_ŋ߈|d_iƁ-k]s[yo੼o]'.tB-JQ4ӿlOOFSyhį|B]9ngYh+oKZ]xw:ljo4+tcx~. =RwJj_~8t_*4W$#ZPSN 9{60X~;#a:UN8,U˰o+gV2̱jO KV11ʰtq~`mfWW<m㿃'/kOg)?È.a]E^.$?ٖs\WQZο>x/4?z zƍ{B>)|Ηqcx)KugƋ&jj3mچ1FTkО#灼1qX,%x}mAѣ^3NU}G YsLq?9V}幞U19Q*7'K=U2<ʄsaeo:uLF7~%|ٶk$|= :ާjWmqkm滫&Z~ n5MBkm>f_(k^#L4eπ<_Oj)c/Դk^GkXiWcs=Ͷ8<ף!VhѼj񖻣j6zya`nog9*JT{>h*0N.Mڜt\y^Uէ0L=)T b풫Jc[듩?Q_ |kԾ)xv/߄~(I&iickSGuc?whO @m7^j+{;?0h:Σ\sv|'G|4ޞR/ 6i u]YW!xȺ : P[XJ ^N4-u^Jܣg| xq9egO plO*nux W3S,^1ԃJQ{?vc<M?d]m j<# {-VG='KGE$$,,٘j˥}A@VL/!u]WI]$xʖӽR]Ʊױ[鶗P-_j0cokQ@dwQ؅tGXym;Ie%k-{iu 2= 6XVL/!u]WI]$xʖӽR]Ʊױ[鶗P-_j0cokQ@Aoïg>,h. tOk,4m_:o_Y U*厶%,uƾ8K/%IX:*~[?MO'ğ?4xq7t^i Mu_ 6KF>6$=e5|%C鎣vS{}^~={Hk?7L%i:elY]cRV1|<9q+I%Y-rލ5:>Jjj8ڪόxT͇ʲ7Ρ`NH\/,Na]V 5}wㄦG5?~5|K'ŕ\-gDkK7qOޣ.5oqssjs}޾[徙L5OxZ?$iדF<=<_ :fFmsúUΡxFo5櫤]zs XztXUƫ=n#)VWqSNTRSνxqkJ8| 1tqA<&ZC KpZU+c+c] ^d*b1neIo^վ;|yZoxX>(~!|0_ N;xCMկ}Ww)`]4z#q?>3?~%|! ExRNt3qi t}2ZS \_CSp#Rr9Ft#) JT$IJPnxFiP|/\Ukj`{|& ʨXAa%˱5֡[ҩ xXZA4Oo|OkEKHl|SGZo<9m>7]^v}čXëkε,4qxig>8YxoV·&"[hwQ xxVaUg,3'Ƈ1^ßَ]wğ>/|a~,x#MkVOYͽ4 IowZo-Mi^?\槬*%JVU})Pr9a!Rq5FSRM<5u|uLw֕[xG:w/]l]~#5%E* mW5÷*Sj=y{BFYIEISXTq"̖&00_O>6\,<*GQ|j՗4O_ V1꺅욯W23@*x(׌0J>F)UԨArƓ"|ʳu#:J0O42,fPJTH-I(`eq֞:Ta,KeVLOZ<)jԭsk޳kvw6Iwa=5<u4K^UL0'K H˨|ᳪC%ƙ»*Dw9U]e(I&'shƝ͋j q%=_{ow1x(xDé~._Ew4 ]\~ӂeyMdx, $ql7G_2A>  f،WbU1Xj+_iL|3njkk8 r>7.jVG'xq' o<0OG?Sh*`2첦*X v9O|'xi~'wo.?eiֿ_:Y|I7{:V3]+?6u|\kԽ1/.-WBګ޹'+ƾ('Ŀx'>2y%𿇾4|E^Y.GAӿc\'`l' p[gO-19øl 7[s x,$G|G0 =X>9|_ #|C|9^_ w566x~#o\Sž#Ru+ZDO %+We|8>^H|co92x;EӼ(v럅_5ω_iI 7׺YAsMojpOL1yVepq^ a-~#2|Zc¾)l.O/juq#G7$^x!N9&:c+_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh? |INbk}.+K} ~:umo.w4 >Lm2/?O{i^Gm h.C{xvC×uf0ךūOjrjrppLx/^,k<6d=i^ҴCtIMӬX-lG D*"ݘ嘳H}A@V%I5e 4?gӚw `mCVh'Ny#m.6-I/a}>ӸkKhWA=uqomsmIvEnMY|C fY_,r[EnPU ﮦӮk{kmbK (9'_)~UXKkmRNԬ*)~Z մCS^:,xƞ*͇﮵ _Yѭ<1KC_G}EpK2rVm疩dx~41y~:+(1n+82 gk)ʩ4q(Gil|C?>1uϣ?)x>?lm4*S5;c+),g/ 'RUߊ>(Noxm׆/ZxVMf\}CՈ?8N>x+YGxN\ 2" >U %̣ >);_ e8|NUZOmt?PGLJ'gShmc~']gTN3xz4/k$z=`,a<+0|_Ko '> XŦ"|ctX&Mϋ'ByG[dw>gWfy.,]|x >+&vi[eY ddž^UL',UJeς>|mmcGk(^|O#K 蚟-xƾ7AkCOǤb[˩?gK<?g ~5U|kn-վ%|@~#! Ok4liCiq,nef| E˳},c(U <!ɰOrC)ɣ_#ᇓő_\bI}L'I5[z-cS⿉?%ͧiZc]6 |K<#ݍ^F𖊷.+}c86\%l0)bgʲ #eV*s9SVIEx`PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(7–]IZvogǾky5GMH_W`{+1\O=W/.~ ^3K_|#ĿhC^{f>V>)G5O}T`bP>txg@7i.RNWX4WQ@d&uF/7;4O'fԛ󼝞.#>M Z+&31y٤y>~/ͼ7Oty__h`PY0ɝwQ'Ey~m澾oٿ&|'g5C֯0G{EۭBV'SWn5M*FLԧkDPewK䍘7>)gjoI< Ɨů̚o/-7DtieK=6dGv'(((((((((((((((((((((((((((( Zo?DGWh_-j_P|@_G\|Tívot hS4"_Nj[ 4WDQ_x;BޙYxkG&Mcz h\Y\$:= hf8#  Ox_ ޿|?1Ke kZ4H"MiGS4Q-0KHã‘㻂xnah-"x'DM I"^924-}A@VL?hwǧNS>>ٯwI?}A4'kQ@dGwzdG?ڿēWO aVL?hwǧNS>>ٯwI?}A4'kW|ygRQ__Y_isK? Agƛ[^j^OPv$֚^,nA.41)5)JM$KVEӧRHR իVqN8u*TaB)sc)4m!EE?|^G/>/ea;ׇuxV t|aa|ԬYG_mZdYΕ_t_J?5 +þ) O.yj6!u=JD|/h 'C}"O U3MRn^oe*<Խj\tڞ gS+a,a<&8*9.T xE :9u><ࢀ3m[JtG[5=?Et+KVkm;K4(^QK++KxXyeYtH]Uу#He`AV ӳ+m'gfMm)EM_tS#QJ(F)2+#RSTJJzֽjSZ֓iNΣj6zUBH,~}4l5[-3N6/?fߋ7S >90tY5 B/xS%nyvm:"'*9p>y<%|2^/ۆi`1O]a0Xa+קG5gFa9J@XWBׂ'4KTYt X Z`}kRӥE-#_qgn?31x6MsG[ \Z$SiIY| t7mt9$N->YleTL-){6ʹ@_PPE xu|otX#o^k}.;Z3/GW j(cƻc~y|*_o+?pO>z?ھ׮kQ@d5F_+?;yWy_iˇ|G֡?pZψ>>%KR_tmVGX\I9k{2/#O6IFGIstBmNqoԕӵֶk t}E>kJ5#R.2q抽k٧Mga0Nocm뺗߇>>?j3Iͦj%)h>_O]R>&b4wOC8=\| p~)^/_go~o>hz /ƾ<E .go^ 5(8ƥln/*T N ˫>hԕWZNtN8iaBr9t(b"x SY'֡aZx Q%R*Fs5^|oKaGn~Ѫ|_MskFA|#<m*/x_օ#^HӴMFV>͗?!#NNf?ekaGx[%+L__QkJo~gX/Т{Ҝ8hK0Ӟ e DjSõ*q?oBXW7VZuVap |Qx'ͩcw-NLNO,bTa*¬qxܲ.[~ZW> ?#_O ^ čfo~::.-KĺhnRdžZQo~jmk@47w^ )!^5hu[8moν<%t-:V5|^[ 7A5%9<0peYѧkFs劃a,MIUZoZ<UpIqGAB[,3SQ˱^\[:˄09fx,rz7|JC_OźoٗޕM_&IÒtMf >wtHX4Tc50 BjU9B2^R(c*m5QʤRPiƌZt.K/pGcuCU*p>_R9qU*uh֌8M?⟆?>sLvV|p&uks1W^NK|%G>u݇>.mhzկ;sV]-ko NO/?|cq4~$|BKҾ^ccGv_.47V/p[^3Ӿ':}TFaWI֝l›aQ `yJT(V!R4`^l,qX &Qrbq)dy-ns,J_pXUS-36:s/u_|.>(8O??%۷uk-Ҽa{ {_ޝ ?xúʳ/JXTXJU&UR߅Zƃh$vZxeVGXˋ}W~m]]o?6~x\5=>Mi Bgʱ]H3*H *|U%J:IʜR*Wqri4uv٣>-?{Rm9~I,'XtՉ,40m:nu=̶eoʾ?2cz>|3Ծƾ/R(<l^#I i~RV{qg ^)⿶s 5XL 57Ty5l-lfe `o?,Sjղ}lf_C8ߏM|]IOG_ķ>*{nPx/S.OG<|3 kZ=ڼM XX-/᎐Ft־UӺ/> %>!3\Ngemx@m;π=eέ? I &ɥM2j`pod,O8ӈ8)%a(.eq2^oU'$}x^O<)fa?bCĿ_+W#YtσRگWmWV_{U獾KO Z߂5tӼKj7eȿѵ(Lf#_6x~)A:>~6|Uú~qxz'|7~<}kX: xHܟ3(x|WxcW|_˜LI}hK(6mù'<~s:WS5:kgf+ƿ-om&Ejn/nGWzE#|=Q]\5}> ⏌>6}g'íz_~?o_ĦOOxĿٛgdwMu/xsX.5QhxÅ2Onp9\#<' )fcgoi5k5/ Fã)ʰV * (KujBX~S ,d+R̰A}knI\m@b[Vo2CV 9g@&+$1\6,2e XtwM.Xn+~,|M e|Hմhk/?>*we/"_|CXE>+whWMJgn:x?<Ꮘ-|K>!ֻd[zN kr^Cm{k!Fqg}mm}ep[C,)PE>x%?5&_x'q\YZ"~3 ,=[i568-kR=C2!e_˲ڕjL>Ya, xYbfYTb3%W' gCsm'|8n5>t{^kkVL֓iOOei-R]kcgo$#Ckeb^μ0fyk(b3 nvڮw4O\-IXd1^ b>ZzM}A@VL2g]bsId|_yoI;bh&k-źƔ|yK5MSJүtPus_s_>EſW_W4u_B}:ICÞ*Oh72>ƛu2€Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh.9Լ1K_+/Ot.]Jk85j@\jVV__3-t}B5㟈Dž=gx]lZƛxNO "ӦԮonkFZR ۋ[*qOo ϥ>5K{᫏~п mO1yP}*ƾ(־^?V:Om 춾< o[[RtGiZ,fcNp߲඙/c8|2ޛcsoUÑXɣI[d,/ w F+G%\]}'hO7Bt;Dk]/GѴ+m7JҴNt(;{[KXb44U4PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<'>-Լ=i|mq Ew&xNӬ#/񏌼+,zzbiBQ'xj_hZ=:_|JGTV!Ȼ>vb7znA4 fd׏8x?Pi:ŝ6~O [ޝqxFP&&msÇS-}6gku>\ZV_} ᯌxrHnugooT&oh_5N5;1om z?ھ׮kQ@d5F_+?;yWy_iˇ|G֡?pZ+os?e_>6;ߊGwkCsoz5_6 R xGE=ε|Cax;:shW0iq~YxIaDua]PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<Kw~Nu|;j:Es6> &f9RQnX{L/"{,#7Ց$ h[exc~#Io~@I-V_xu-QQ۳iڠ~"[~i_^"ׯ9iϡ?GZo[ <] GӬE{4_W|?i&i׺jni:mj7g}3]2<|w?O_V|G ^5ߌ?>ghgjag},>+85iUa/~9] L$cREd#,zkm@b[&*"?3+djRȰ{w{R՚9-tP (d6Z4GFY%ˋ~7gmNuDXm+hBb:-ɡy??>i$~IOJng3Ï|7U B {k6mx].`kt.s:%T4_wZOaMUn c:Ps4zRV7.UR kGWk[X:cpxIT1byVW N'499ksF\NMKOtQo|,׾4j[U_&757N6kᩯ!҄mc-X.%ڟ./f Ŀ^$5met  i^"["AY^ەfpw.i8͵R/fX6-NF2*x%Z]HR.g,?μy`EA> =_ƿ<7-Ʒ מ]{[X'ͶaJ˭"]l}Jm6UЭnլ¿#xƺ[{Bhh-,l--[Tԯt#H5]cSt+{i9#AΝ AUkWASI^*SsY*Kxp|.]S :ga0,xiSļCΜ΅P4V)WKOi؞"j4{Z㏆?uh{5L/^xş/VgkD7Nw"4 f4vqoMgC 4DY]UNrQq_VĸKW٧,:l:'"E9NjS+Nt)_rsUeK58:s\-O`eK.J*sƖaU[/V𵯄<]:Oèݘ3q03y/iڟ w~ӼW^_/|Nox(/%\x/ x6uh6Nf'j֓= jyU%^ TsR)FFHU)ISKSU%RnY9i)TဥrVƬ*bTpKSKF' up<^8^/ }x  PԴ|-j|5;xU<1WMNt;-U^8%9/|cEռK߄_|7o߳>o4[{O?D𾍯2h)OZfm,_ot)KnqT{wQuG(aZkF1/8SiΤCkUTkJ88K(ӕ:| ,tl>O[0c 4xPPbqXi֥9zxK·ھk{[T9*pBtԡIڗ?mE$ܹu\9VCԧ^1(b1Xu(0T*x'*پ^ӧJrgKSc'CW7E.?KS߆> Zx,:< }/κmټum[WOisi?Vomwqa1|^૏:K?xjY ^ نO]EJ1*Q' >omVRRR:q<+`,]<:y}L!T*2˾T،!V2~ >,?2w:hI5fx;?%!i/'#mдedӆ &fž7_-G.nj_'xS_ҼEgxWi#֥s]AcR];[Ѯ-GJKKh.hIO(5>^[ӌ^3 *xB0U/a-C^Uu];n^{Go^g[[/v3ȉٿkmݷn9qmoş|,=)~"85Q&n.uO((((((((((((((((((((((:Duv g"֥n_k@ExƯ|Bf|~-OojW>,4_[YXBjM{ӿ7q4{DV6"Wp4ewapG[u _mGW5=͈RXe^!&..e.gaoZVqiַeA-VJ|eP!'h>-uB5i>^^wy|?NRZ&-hFePY0ɝwQ'Ey~m澾oٿ&|'g5C֢ ɆL뺌^nvi:,Oo5~7y;<]?G}VL2g]bsId|_yoI;bh('>,1ƾi>~#3:h2xW?"Ayi;=@\Xk5 a[ I"j7JjZ*Q%8h7RW8|$ j済eF?iaʱSV0a <动玂Ac<ǿ7Wÿ>#W~Ѿ$?bcxcž5siWÏxR7&)kZiqӴ4R}Ix/%<#n |!ƾ;NJm~W/>};DI]Wƾ$ h>;—4G2BʵZ^%R**s"G1e:*VI9<7CS(x<YS8bXk04z`;Ja0GSG_c24So_1R'-7ߴgmw9>%{4 `=N֥/n 1kkMg_Y~)ÿx +>]|E<9a' Vvjs[=2N"Tn59TyUui8Apj. 8 T ZiJHU'.g9u%U d>MO <1k={w|9]GXd;,믋[ux.|Vqڞ}"O\YKko xlnn/|U/ZGBѣb} ཭Ha2\N/e8VrIA_9VU_lml_ pܱ+eu9Z yM)K%b0(aqz_ g?/ k?8i_?^5},|!_]bA]w@ԼKjf}7iX-,|X$ߴE4} ß pF?j/'o|Ii:7w5 ck=sHΝI}Z|<_k,~ƨBpjiУ<3T9!BjtP*U$ޯ/ ĔlM ?'1Ybru VqW= :<5p\ljIehO|r߁?x;2|;_^|—xzLOCƧb47\ gi\F/d_r~6\~p3Jf|$7?XΑ{kj_>j>-|C=GV4>kJkr4xZPx8W F*Zۯo5Ma>H*єj/eU,J92eЧWf3ԋ̱ʝ\4(C0V>xbK_Oy#Ğ;#>]]OtiZŽԴ?,No hZy y exƺ<iZNῄ3^tכ.SaqIa[|&s}:;3{5/֎-sԛ1 JpregNҏLz*2:p#j)cնcZ挾Ӯc—~4ԟ<;EvE<]_I5JWG'ҵWM]~ӵ;&aĺ1٩Ve__M/ڏf6 OC_ ->$5ws|K֑jv8oAwv5:i&pݣB?H(((((((((((((((((((((((:Duv g"֥n_k@ExxI-}D|W'#׵&HtFvJNGyy%ldMREӫ3w?AEޣ<] GO/M&JIo{5ZX?řa$z|Ux|>5amgiE׵okCC}iH}HAsvonejMs\|M xWD5h{XAusdL2$(`: (cƻc~y|*_o+?pO>z?ھ׮kQ@d5F_+?;yWy_iˇ|G֡?pZ+&2XߤF3ʼO\>wo?g^P^us^>x[xHޥ{=N{]S]:uΙ\귶[VOa|390yarVg8UBxl |]*X^3FTpR5kBtԌC_Lj"F[H‰kjQ=\ Z 9q]2ڛ[T)$hǍ|3nToukź[^/ zOQ-|ׇ1 Ԓmv.ȳ"cƬ d|n +9|ʔhV,x2/aptPEP2;F~_?σYh'#_xR^~"O|+|2G%ǎ|7qᨭ>$kFr~յ;]3V_3FtMMM/߅>#i0W|*~$^?WX7Pů|*nt-J=m>& /]Z^dN'Wl_1L*Ȳ u^dOf_a+1<(db(ʳlar<~n1Ng4r`>~5]SI~R$>gIt_X3wsE'<-kW_u_yUqƷ|1|[k7D>ow>#n5L4jZt R{M3Okv̀zfم< .'*bq닳l2̽9E ^+G<}[*Us|<:5aRn~|&m:?f|8j9O_^LkϣhZ6e |3A R[mwv~=o+^.|}m-{A7OAi:a^fZ-2KKmgZƥ4ަsx\>+;1Uhqqfrp~ 9ySp,`pY'fx|TG TJO^#?Xh0'4ckzHִjiooZ%ޚfHO5 ueoDmSPIxy/-/څp _&~G6:uu_YEKX]C^D .~ʗ)̓ZiY{e}jZv躍eY5yxOn6[OjRGWRg  (Ky >$բVܦ&UD$24 6)+6~pKI%ִEo$ĚJЛ?$ʨq&[fA#BEt F/.=7Ii$ր6-VZrUN lH4ؤhZH#G-$ZQ@ue&}>&{O(iPuu mxy~φGcK-m/1kv7G%ŻkWֳ^/&xjQ0W27 β):Xq ,%5ڿU7Ÿ <=-7:7+^K=+TQb^+uKk ~˦M8b{o&i>cFvpxǒ-Kx1 'Oi}m{d[xrYfhc`O|A¯ xfo/Qk{maf`jZ|9m,6};ȵ v/!4P[Vk(\kKoE}pCoE"}A@VL2g]bsId|_yoI;bhsjFCּgkmg#=Ɠǿ_o%ƩhLԴK)o>xCcI_[|J3|ZѼ8|C|w x:]m=]PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<_Ve^5=;Yh<'ji֋u}'ɔZIcmsXu8oe_ui#čm4uy/@-n|Sq{=߀ӵ)_7lf+i_~k;ÿ:,~GkxCʽҠnoSkV躦(I|<;i^д hVb-:Jm|f0B@4$ɱyyf+&뺌e.+讒/x |?<GèXY_Eյ䌗.z~&v3MԥxoqJSg?¿ _/~"|}+|iu_ O>15]FLQh4? $\w6] w~GCH>!|K_xFTR🀴K.k&X =v]f/ t_dZzQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<h:<7?sixA+I>zLz%h)&aj$o,]<~;צDմ_ [xӾ0x֡Ώ-KYd.ƲLvy%/ $~2jޛk?xBohZhOqxy|ei^%~q&ЦGy˩˩]\}~/š_'?4mwBf(nIa9%{Q  o_PPE xu|otX#o^k}.;Z3/GW j(cƻc~y|*_o+?pO>z?ھ׮kQ@d5F_+?;yWy_iˇ|G֡?pZS_<; TB[OYjyZxI 6isuZP4Kॴ:JQZsT Ғc$hI=:5:J =jeTj4u)JF5R&$,M~v^/W%Oƞ;w6Oo'uOcQsOVz}i<-h? ?yi9}Mu n|0|O3_|7Ú_OWω^2þ5^'w.<# ]'LZkZ'ǃ4j`N,? Gρj&’w`RI2VAek)5JTheS*n8| Q[7U& l;~պb?<;bO/:|ּ9xN![Y7ac'?(Ҵτv<[~KnߜF~_ |'/ú?|^Q_Dz|?ңşxWM^Qi|ckFM6"n2Jip(:_m%%’UÜ%GFy̰TiN8+̨ե, 5lN*SPࡃ+|3񅞡iZׇψ>"jφdou f&B^i7,mk+Y~?jυxſ>5|Ei/i>KAUo.4~_-gƺƇkC~ĚkCP֧o ZYZ*05̱4R8ڔMW)_UY^Stp~ :xX2B 19zVV6x9S{EzW/Oo"^3+C[>.5|qׇo E&fCUgd׬|]5m̖5|Լw{o%?΃#%/<T>,oxCIoxAkZe-bln牾.h oo /~*i>Z>{b+Wÿ5&?|)vvw:WU=VUK*NxLE P%JƖ%N5ZRSHEǁxzLNT̰Fqeӆ}ff/*f,%,r*7`*G)_Ͽ:|vwOkcQoOx|O5g]tz|e^-厭I?^i%_~xxƺaFM{2i:g>xzʸ,.%-ӄjjYuk!agSeR5c'%B'j8VTU,q $eJ4k:԰Ud^8ό?n-|cGz-߄|c^猀 07^(ͯ iԧӵK_ ~xSEƏ?h8~M|mho_ 4xS2Z+◌-<|mhW֯tboUԥ<qK| 2"̸cF8'Ŕk5&e}YT,pg*/cat'>6|4Ox[_ZmL~;>0kzNJ'h5Džm#|K]mOh76-{6'hڛIc|ro?1ר0|2ߊ<YA/ ⏎|9n[-|1iBO#Ozğ-~s$M.(sJٟe'<ex4l^sG!‹+C5gC2~GKCW&CZ|mx־ q~>h'>7'|6>xMo!_Q}ooߊ^~ &X?S5oE&!j~3?[A%͂kX4 {MN k}3OO`3n&c6hEřI_'19&wZi:]M]Em+W |M*[>/4C$iͨ#YmeNi5%V EYm:渏K$ۢ ķa &\!3,sNL9-]^(b*Si5z]Ͷ%V|VHDwvj)w$ r!oh ڥ6.5` (񏂼3xwgLJ5gBCxh.쮿_hmg5پ{ ͔ˉWo3Zs<` pë$GOZ2L)?>+_4ІVӬ{gNKխt۫Iu^)R_ӧV 仝:*E8'NgMg$/WVIטa)px;xrG5 GOVXizbj~ |,][Lž,ş,<6ľ#+v^ѼI⦻Zhڏ-㻳׍xT7 X\-;ʝJsRp{:gNApq,fs*8\S`vXζVWRYxl+b*aT~g0h_j~!JͥFqS|NɷW3xO4Di&{7د/\NUr.e*U2,_VXz|-LXl.XSaQ4pX*8 ZXL<)t g ~|7a=wᶱaqců֍Ŗ5/cF iz-biK[%ςY|/sɦYasvkx?O|~i:{;м&lLѫ*q  dSJ4odN¬i~XW t XjXLfw өN]p4p|[ T˰piN~WgMJ'޹_xǾ(DŽuh#G#/ɣxW; G[s^̖ju[/ #ǚ՝j׃cmSCԴ;V𮯭_>.qa]g{y44]l¼R(ueR7J-z38SM5 :q83*f~ V|7,uy|ŷP־"Yf[tk/|aAxwOM?zVeX<򵞛rk+jSVJiE( TaN8Q#g8[t>[apx< ӧp _C ӌ!Xl=*kYrJM=JH=Wx-Gj7nZAq+GxOH𷆬Dzg4m+M+D#hx̊F;C4J1 $67GUaïg|Ft^j~>Ѿ'h=j0AWǗZMvI/&k% pOq{VmeUrLf8El g19kA1YX%CeJN8l5:t<+#T`mx?u?>=C3jZ6׾)~-Q_|K;K;z]Z̟ d|_>ovgS/t5SO$|L嗈ouF ZX>-ZzW2o· cr n?\8Uᚒy.<o´5*`^2l/tURx7&x?<#AJnH|}<=hDŽ_x_Om|wWZV[M/|o5~-]*/TI3I//U4Ӷa_t %ll;e x49ggYVUⱹ ٦:{V3p<,ecr/82٦/G&y9$Ws^+UNN{?/u|Mc? m5Nurφ-i_DZ7Sq>uٗ}bqUa%[ eyM:SUr [sLέ 9ifٶ+qxQ^Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<𥮩'zÿ~[q%ZMcQm,jw7z}WkaœJM[K[o| oCx@Х[OGi<=oznq=^_wmnBŞ/68,;{.xt8a(,cuXG"\"vPY0ɝwQ'Ey~m澾oٿ&|'g5C֢ ɆL뺌^nvi:,Oo5~7y;<]?G}W|[/{~|uS?JO/ [CHK'P׋t_FJ;2K6;Ia@ j?<.7x <9O>>'DU^_P9xOR񯂤HA#J_hU>4}651Oegivo-ͥpZܔ5p -%I +$.x F#!*ARA%}A@VL?hwǧNS>>ٯwI?}A4'kQ@dGwzdG?ڿēWO ay_g7 VZ3x/ |37|k(ԯbo~uKE'a_oh |J߇^!G@w 7GW5[BťŝѲ[A5&i[~0^ xora⿊ }yd$L%v]z( # _TQ=]LjS^JJM[ZKMxbhY_֨ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=_K/"$]+zw||+?Cga5oW)Դ=7T!KM:0޹ef/-4^_E;ᯉ4Syiz[/XxLYҼKx8ZZ^kMbfeCOx&/|H>3SmxwVԼ~,_KkikC4]0/,Z}pjt}BO=ؿ Ix6}oF.cʧ&(b+k wk mwo?g^PY0ǍwQ'E6UW;}?}\֢>E|R~򾺠((((((((((((((((((((((((((((:Duv g"֥n_k@Eq^/oxOnWYx{v35_P+ɣ[t =f[h\/>։c +x[0 d>Y?N5Α ;VP Þ |Y&n%u:VҮӤ[K o:I+X& kگ( ķQ &d%0r΁oLVI.bm^Xe,ְ Ě]αW]ρ^~'xOh&wmş>+Τ_|wLT}p.s}!nono;OxŸ<\/|e$ƿ3j^jE2%ŴѹxCq S$'~&xA5௎?ghVW#|l?KOm^?&/V3y߳+ox/^?}q'|kZmmt\'GxOx-CŸ _]J~k]ַ&ezuͩ&k۸J*a"֩hCo 5M:MƵoe:xNt;ֵ̺Oċk=*3l˪[w)@?Z_}DZn|P`&DѬ/X.&}v[I vCaqk}{egO~?<O)ѵ/D5gM~+M _~ O?[ xĚ-)͎s գ~9x.>8~%i..>hrK'ylj\oh=?.Ea}n@W ܚ]:N?n>2V7Q鉧} ]GPO㙩|Zmqhz}*k-RZ^ [ ?"S|c =ڕ5^2i-,[5KG冝kW~$j>Դo-/,.bկ[]eKOi#Ѽ'ϧtV:TV{ki/ vvVb8l,gh@ھ+&2XߤF3ʼO\>wo?g^P?~4ޥgsi ]xPw{i_5;[mO'O |IhV2ͪuMw^u?v:Nxm4OH]R 7Z\]EtڕwW1^G4QNYEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<Kw~Nu|;j:Es6> &f9RQnX{L/"{,#7Ց$ h[exc~#Io~@I-V_xu-QQ۳iڠo|Ax/^ ƽ|sZ߇m4kx] u]rxwAZja=g%g ~)[xgx~zo,,|9aEs&q\.mauV]9mmd@O|]OSW~|7oOfj=??ڇ~7g>>ϸ ķMZUXE~fWC9;5ԥaY%0;h 4rZu}w=~?j Sf?xf_1!о_j_BMKW'Ŀx-GR׵_Z᫭?Ė^"y4 Ϧ,W Xz§U:u%8*ua PGj3QxW u3>*傖>[G,C QR`8};j_6ֵ+i'/t M;K_oox_RfK%v\i-վi,ZR֥[sETVjbXhԒI8_3[< 僎yS%ʡg4~F8ЄF+5MG5JXJpMO.Ms~Wm>xc_èxtɬ_⇂/xzKıkY𝬺G - Wy]xZ*v~+^^٦)SSHOխ|2Fh]5ڵSQI<<;*2K{~ о|j/ƶFXj:^MKOyW= aanJ[PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(5xs4]F.o xRg5 |Q ~2Uls6+< (*jV4Zx^#n^!4~_iQߪ"gKCᇀ~x[G<:/ؼD-xkiZ(kashVvs-m/Woz"HrdQ j_2s$~t&~:E^xcᏃt~o4Gagqxu;<>FZ[-A hwM#Kz (dλf6__7ړy>wyښ~ɡkQ@ ~?5#QxSdž<{|%{WtmF>>6 6S]Z昗 YoQS 9Ɵ|u:x[B1է4uk>Rh®\)bX~fB26j0&}ˆpxS|h5j_T?qغSC-uqXyBL(J^wOᯀm#ⶶzcÞ?P9VgoB߉fY2G,to;+4{[E-n]>bvSiq^CD4v7nf*tb*Ί)^?蓟J;N~ƜN7bfNVE}O {Dλ˰U+`牨y~L& R'koC񮏠]%-=Cu FtZ| K2Ce_;w"\ϡHֱѾ+|/j0/koXtHx>þ(^<]LԵxNе-B^,Vx7đi! >  ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@'Ǿ;D x_G5GIGI:~-Ѽ3Ӧ^Ic[%Tt׆e|?ψ5-CSSx4ki_ Bt/ /_xW1"DŽ|'A_o&wÍ'GƷckᛩ5?zOkc$-,s/oN+,<1$NT 8Yu',Y]\/eѼu|1YV%  ="߅!X;|{|+/mCE2/C5k&j8Z.GwO [Úf3O,R4'w )ʲP*r)INW匥pV3X/\!N Ua X8JգΌjpgV5%}gӭR~^,E|wY gޕo T'O?{s3\x7e^i6ľ9|u h__R; \UFm!- ZUu /mMʶ u c5Iu(jRUNRRJp5#('a`r.*3(1Q X,;:*k> r%Z^y-U__~,.m, z]i6:ES]wia CMq8|'x=#ǿ&??x >xA>o|s|c ?:iŚG~ 7QEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<߁S״ڽ|43^ZϲM?9Gź~2-^4oi:xKռ?s5ܰ$+,嵸KMVU6ٸhS|?ռ?G7qmc>2Ou};G-_iZM3]XXiz4YQ}Ӽ?Jt6^25싺K#_]I=Ɏ4;E\(t/FG4&mCVզ,-uV^u9`(5sRu^Z{,s'Q@b[&&4?2 A%٤iHд]GKMZI. (KU.&Y/qBHn$ BJ 3C P߁5ƾ/K/O~/|_S>^kxF f ]bQ`pxXW*8hq B+ ZR F05mM kp+i@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<oį/ktq=f/A&CHtJ{em1}Ha|gxsφf+^z+[m zh`կԳ:E惢X\4֗wQVǍ lx6W,d]g\&xsDH J'5Y4>wmBZ+ (a:N'}|߳jMN?OGjke&E utYI5-瓡}CÇr|F !JwUB/jKC/{Z|˝{ ,n W6 b\eZ^Us']x ou?.Qos_uoi5_^$xĿ), '|xZJ{Mysᯎ?xoo-6Mi?O7-.?|! mGVҵ]wŸ |;skKmXפӡ%'S½^&t匣T#hҫhJIqPexLWVYyl37X!xuk7|C%F~!<9%K,K ϯW Kt4V2Uj]cBrYJ#)tV༭Utq|D8ܙ`*p!)`C,}ql}K,W^LuZץz5?k-o_~4|8]_?i_º_|5?u熼x+mb;}ON/wkZnS%}h%ZZ_ͩ7o{h#ilm;ܥI\ a$uK\^ N5V&UooJ:tjSUh9N4j79I4'> 8g8\l]5`qVcOؼ,q]JqV1XIJyT 5xC\K]|?ڦfW }ׄo|Kٝ[Nn:{‡w5<:&Ř{7P,ĩ|(vbѦ.}*|?pam_#S6Zʶ&ݷۙVJL4ǟ.XOl/Ly_{)_ aS/O'OW/ _/Kf2iXjF f9(<s~8|rt?=OD4ڷ|qxO{O| ֟e}T|קVauX,I|0˞q:QqxIʸ$,cxJth X2_-$ˠD;L_Ƿ |EW4?#h#A'=}Ŷzṵ7xjSUx5_".ᧉ\xC~Ծ&MbxGzc_ >"87ygv į?>( <1h |7NŸ3>Ö5XxYV=6Cn~=W{\C qf'[0_s>fCʮYScڙn)9ml0sj_&όZ|ÿsi7oEEeԴM7OdGm?z\>&|bGOEbѬ|p1_>,|W* xSƚ>x#/MPZ̮|?i~|AKOMcgZ1_1ae̳x&(̖E&"3 2R_b2. Cgϊ5_|Ryx]١]|4]3/[}/ O|ghߍO:>06g N][Wu PĿi=OVu)>[ V]■pT{-V0s'N09߈t2̫1ľx>+eb?^ʥal([aƭ2A8|PmSOִ[<]LJԴ. Kké,IO^P5\xL"0k&L魵?Sf_4_ {Ú5ޝuww5fxv#4>Ek֩sjv:ޛw.YMNI,}#SJ!O]4:U.mm}cTKQԥ@kشM7G#.Z$Ck@ (^C1H] 5-{,cbm.[aK֢ Ʌ:K :+бy_YRwK8Z+}6e{Fm j(~9|_Εo'Mw6|o|2׊4m{Iuv?|Q= NUnfI洺).c|9<*E]W.R58cL:fWZ4{;['V)mnwQ΅*tC'N+A8z [xKEցhڇ<++^I֗h-Ptn𮛠^ ? jé?_ x?i4>1Vs|Ko/j~7?|-IY'ӤguVŇ`5DɶOӫvTaNJQN^Te>i3 Ԍ֜S#QJa(U,6 PLqx,֖ W:Y~#bh߅5O:֛T[/~ݩx߃u"Ci /ß|:{(aؼ+姿{="di"4Kw7DK:YY$dA43DY@)(xU9Ɲ:1iRST魔a'RI$TRnOqؘc1u4x\:槂 (|V*PLV+өV9Ԗ4=O^Ѵ-g>#ivik}OFľ#Yٵf^G0GOxOB¢˻uyŏ][e5;#Q{_#\a/ xKkKi5㏇׺- .bÚhx5y]FW[?ya._0|] V|O36\ywg_]m}uy⋟4;$g9VY;1_XeGx{;1Wx+ nNppVC6eWWS@= V__h68OxoZ;3_D߅[ae{SlZΥsLxQ9߂_>[|,xT'">!X~κ~S)XTֵCm?z=ZZ]X09;q7 `NհY7R|x𘜻li[S)+lQD;oSᶫx?~$i7L/!S?m/^꺎;FQwt+O[Oe]u[U{[m|O&q9r ԧ`r,O#'`ppx}ޡ|?.4X^]xq[+{4WĞ75PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(珏.fXޏxͦf$ 3Gd͠w{ V)O8St~*~~$j,^ߌet_CV4h N]N!km_L5ZKll5k6Dԯh%|g-?u^)m-AYo5, RIݬdHY 2*(`( Ɇ4=߇; :/W\= 'DLJ5hMumD_a}$67W3G)FiNq*BSJJQ\e5gV>7_IWC^ FhN)S**6$dm~Z߲ލ?~KCZ~$_?<:G-wOd0oz=E N:| ;aYuihA9FJxӄKR MO깎M,׌qK9f/|NeMxIԝ*p*Ԟ&WƭGhO|4-Z[|Rڗ~#_3⿋V6oٿ9ڌiz\w{w%Rn~khJ~'ƚ ߈3|3KDڿ|e9x_ޯG=A,e3?ۖO 3hrˮiW´SF*XYSt*b?gURiibiЩ9Bi:qُ~p]Xguؼ'as̖yv':a)fla0 N]Z6i<6+;uQ~ 4i~xwφ5o z@<}|BQ$G|3:>׉seK' gN}BĚ7Nhrol#[8կ U3Le9NXXs8(9(prs&? KPbu *8*x14pUUJu'Z}p'W|:URu㭇7滧[Ktx>usES U|Im[]/G|]}Fbmuxu%Ci|3|%o_<[sWգ|-^jmK0izd2ivww7r4i*TeQԔb佥<m$f$mɞ>:XY\pX}O,UZ4%V[Tq1S5 )N}ga{.3,qq2ku=b)-yfnK5Apaf5-Ů+ZΝ sƱ⏅><3Y:NwZxt u>>IOƾ3R _Dx?  /kv1G&obDo< W~0ծ!_cis-"b%|F2]_ N>3o (IV8sb8Ya뙔+%|,~4|-Vῃ?>;~'iZ^jx?㷊iVNgk55+χsM?g>%k SD>iv_]GN]F _ O]C.T#>Y/k\:|4'o,=^(QVO[imη&s/^_˼E`3L֦3-Setc)ƾ*`U 3N2|T=iVjVQ (((((((((((((((((((((((((:Duv g"֥n_k@Ey>KL:uij[w1^[^;׃ouk}gyuIŨ]VeΠSiQy{J;TxhiZ=IiՇw5_%O53_Zڶ }&f(kkRx^Wu͠x_)i>H(L+o\K2Kq:Cr(#K4-&]Fk]>-W5jrGkk^ԵJo6hQ@b[V_.C}9p& [1f{면뇚=.Xn+݇$p̳;0X䶊ux4]M\<v6ė`tP-xgVn3RH/|_AB"veO >fwg4֝g{I=դx+eo,u{^Þ-w|Q:M5 xTg)Qt])EOYFPqv)v}Z[,FQ8?7I6^i4-SK#."SvF*Z(`t4ӕӅS OSByRw8:g3)–`٦/,*B]L,-a+0+yvsJ8VsTBo[US? Rqq{ew뚻GVz_J'.<[676>gԗz.`*,un WFWF]]N [R\\#dQVRIfs<76v+Qzө{ 4)(BQF1M.JQPQKoKu[3GXm.a?|B$5NڧYbZ5 Xl;K{x"k9;~=.<1;WBu+#y`úޝMsuYݧ'Oa?{IgLK_:k[_ZjMNgx{Xk mumX~צj3C ﴝ^3ZAyoW,.dY󬲭*t9!e_ٹY.T՜SwSEFNQЧR*$SZ5gF%aBMJqVQMS\_m7"^j>6׋XVnJu?OH񧊼mX9kKtmPF$znpEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(7–]IZvogǾky5GMH_W`{+1\O=W/'YKQ-3 g¾*|=u-{?^+`oi2jZ}.k(gh x_?ÿW';h~&|Ichb,tv+k]*Y\hdOjz.44º΋LriO;DuIRI#fGIo_PPE utYwyښ~ɡkW[qkc~ʹ׼OsC}<xu8ԏƚg@ 7fJU=ZURR%+^׵gn 7.[L?|qxZMc↓q.ˇ1qR,a[,$ԝG ֥JN%ZƬ_*7)'+O ]*43 EybBa8<_0t8chJX%\l6z)HѼwU^_= ot}᥯ |>i$Ix[᧍5/ͥOaBOǭi?@Z=GLj*+v|;r/g8Q]|B&$R9m9<5**0m`եN&tʇ%J*p\98Պ5uchb32eI0Lq5rGqSRb+֕,m>^#|:0~^a-N}Þ)|8e{kV7gOM/[]?U,G}ȼ8> IxG𶯭? $'ng3uOivOwgom7cźnt9T%&WVzU 4^qIЕZKON*6Weٹ|hU솼?qC,67\. K2JNSkcQ*סRr?k_ <-J/߲V|[_~ _뚵6 oZ>KxsHm>x,E_d)0oӿCW6j߳ 3/Ii #xwg~~"a-bKơ?oi> 1¯gRjTXj~ڭH*rxʰS#G(֕oV& Хc~2m/ ?gφ <+|No¶Ļ_ k>xr]F%zgu+_i_>!wWu;{/o7^m3SMƏ"Hn|}-+]CF4O /{ ȷ5sVݵCrA5R= y猍icOTN_*pcI{ZR*juy,O;U\g9jK20[g3*Kω)gX[|`8`Qf F2U%Vx,םx[OI<{KNO'=O /އu&UWE_>íA^?:+ҡtgoQk "/>"x>#<]a)<=Dk{x<==+6N߆~kW^jZu7Qdu](a# 2pخiӭJ97pi U(R8 cd4dxˆ?v0f8fm<4*z>28jXQCR}-_O=\>6_|Y:/߂>>~'/ᾎ~|W⯆~,,>Wᶏ|:%k}:\xR{iFixGAλ_Mxv~Ξգ xsu~_->+[/? ]iZ:Ե|<)TSS^51OeҔisVq _dٹD3[,ϢǦZYXx7௅~OWPӶ] 5:?oh-dn?QÊ+eIt:ypxa](}:,=Z)e?2¯ ]a9#C g~6h֞3Ե'>xŢfj/b|M=w~/ABnN'?O>?'^Դ1Y{C_ү>2O:֏Wz֦79g (9fa 7߆?iٿo!i?5*Z}oƯ]K·0kσt}# CxLuh'xhI>!i- 3^ >ox:f'e]RNl .Q46wM6@X21a',sLϊxʸG9`o`9l8XL·2Qv/RZ.8USiw5^ x_vouThBUӵς:(,&yx 53T]6(uco?hohW:Ҿ0HUMw#no| Rukľ%_Q5+ۻۛ1$d hG?03Ka*v}I"_2W $I动T\eIbq^_E>|??Ǩ|Te_5x, `ևgCm[+RoWuk{F,k9sԲ2j-2/cWxSنYY+# P<1^5.K u 8v׃O M=+f#6̣3\gyc^'9V{k0 5-QȰӅ7FB~>&iuC/Ʒ6 ľZ-] /Wh_?_Ŧ{GVh;/5x^{gYg+Os㇂mtcQUw[j6ODk>!^{xV?PsF,j3LvK%C#uh!Ye1Q{:s8gf NQ[GUXuF*G1~ CG_]A+ _ˣk|S&u F}j3|C#5>9?Ow6C[7vOOθߊ)4^!#3 *g9gu3ž e7 =^1UjX\.4 |*{gcُᯄ|k|2x 3ⶴU&A vy'|5?Urg<'Ix{Mg&NkV!iGԼaICPO oV{;}^qp2Y3.ZԱU(asga*dJ3 OgxQ O10hɟ_W;VǤgJ= MFYX|"׵9hot|TM7įkϛM M7Tv:Mw;O"<97Bci iF9kO4|>幞}׳˄lyN.ᬶ0?ᰑM p`S>|aZx_~ʾ>ֿi?|j4+47zu{/boⷀKt;Yi @Y!YkB`>=ǯ:=:/ hcOVz/=K:ׅ|G*Ped_KiΕWgXLF34,^QŞfqN*y$#Բ|"eù.ó8[-`08s-q4Yu |M/?^rv]0m^~Z-ۀ҄&n+zUᾪx*Ss<5%F/,)Rw^ә{NHE|Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh:?"HᯇZ0E3@Ѽ5 iD#c"+;6E i/xC~j PfE o Egm֭đ6}[*x%o~kz}|w_Zm=4sźoiQGYjzͬFPE;O1X,jþkky[I`KYm7VKwDFT*A (aG=?t_#B_I??Z+,|c=?zgǏ? |;7>-<k_])XIOxIz-vu)i_Kj<%ZfZuj:ZZ^]jZu)sea}k$זWvqkuo,\C"KRUK+MKMԭ.l5:^$H.mHgGTdfSK_ s|1_5q/9<K>+Hta :+X㷎bEAqR8r5c9G>Zq3^GèGЍ <|4&95)ie$J(s#" |,n.Px8MggO[]|GSa&VOQf3,5%J4Ih8]~ge/m> _C%_^ Yyo-wu-<%q y$Ruw dW|1͟ x;3FNd_;iOe/Kb< 7֭xq JXԬ91|J.(iPaeY찹a0K7 ~iG2Qxg#VW**sUŮ?~ |?eß"aVg/~<77_ӵk]O,i>(Pn/vmIh^(\K]xH?[$M>mJK'&Ya8ՄFX֯bkJ5AµTJpI8EUżU^:~& s(ֵo~(&{tȬt;IJLND!OKEǟ JQPQՊNU"28!yO5>kC@|5MV^fiedڦjε ީ7Oys4|Vf#ҵ :Nz:ZVcp'4觳 IaPt`qZЯ_ ^+ ZNBס^JUէ(ԥVHtBQ'(I&٭-崞ghKyCK G$2F7ԣ(T^ioZ~ ANmFW6 ZnMnNo7&iMw3d2J>=0Y{[/gy.3Ნի_*kV+W[/Zx:JM<#?,)? xk>N߄t-/z'Yh5h&iDv$ŎLn/21kc1v"/*J#b'R'^Vz'VIJs&szW|!ZZ<7YxVuiZZ\וW\u{KXb5meQUuUT^M0Q+E,kg/oA/?j:k9/S& [gɚ8BZ Ǽs#a2^3Ytx'qqC+L266 a4sJѡ3E g ox{3kJw&kWS]j:ܐywq$jfe=<0a*֕gf\:q،K1FLTJry6Y:kUU'Qx?<[x[^&񮠅;>ix6bs_JI*xu5 snUR_; (c%q[RxoÍ2~ϳ|'l&&2-ch|18bSMEƵ^p A_ U:ƞ7<=DwE?|Givzlj&1ˬ^U'.˭g⏃>|;]Zy[O',|K?n\SMZG%vbS7ĚPi )⌋M |YBEYf9~[ùcQ,`9N` &1aAUo_~x^/ks_{ xWĆZށinL9Wx ѾkS|Lj18C4x3ytl%|IǺka^0Եt汵¾u[j>93 Nuq&79(̲J\==x,xb)XN9LJ,\m,&QSajU= ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=_K/"$]+zw||+?Cga5oW)Դ=7T!KM:0޹ef/-4^_E;ƿ|Ns\x_XPg+滪YGe{KUX轥:nq}m1_iWk,iyjzrOeimym hn`dtP uPX?$՛̄>NY-%W `:ḓK#ۢ _RͮYKj5 [|Q=|0'[Z Ls㯅~M_YӴ.yz{BU' pWE]+M(i]V\Uzj篈NsFkN4Úr#9%9F*MM;|3ƷG?Vz|I^xN[L`Ҽ[Q捥xJ_ |o'NnW ¿s _JoGqz=DŽ675Clٴ˻]f+x<VU:5=FQSN JOkV0u) ›MT\V8ʦ<&[x[?/uJ4xRab0IbVCQ\P7s]& i7潪owv~wMkaow}p"Ki$#dQ;?xR:O-]^E"~i}]RB6E t*|S.jի/{}qX\]żߧWޕ8[X{Χ%?/ݟ+<' |DԟR_ xTf[N4eM;Iu=9?쬾ڶ}m?Ztr[S8J&%kMj[5e֝ ^xBvgz]$Rvn4hy i]c(RK$B$qwbTb&G׵2@4 |Q⯂Gp_6:/Q|5w7f\E-ŭ[d*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=o&kxr<'=sx7jmV/ x^T𗆵4($cӯmN5g[^Qxkw< Oχ|)]R:K?i+5K{Ms^ 5 WDKk 7 _iW/-x&_;r⽯5[3T?MQ5R[{[]h:U,ˋ+xZ YW{Ɠ tMMWVZW4mb@STђ[MotKEynYׁ֣otkIᶞ0<> мCj1|gռA EG#旡C{|%\]چ湧xEe=W\}qk,IQ(.҄읥vif5QSZz2B+R.Z rJ/QNN.i?τ_ xDGHieоwto4g?[DeΑ?'Q/m'ךFt5ek3 pBV B*J*5e"*tg*je^0f^eX'[<5Z*Tbh8,.¶pt?.|M~fA-\?|XĿ>9x5~+?ž_Mo>1ǚ75Cōeᧈb'M υ_ oϿƣ|&cO,tj>f2/z/u?Ccj <~,ƶ誸k x3!6L*pet*5)NX(Ɣ8!)⌞xZMQ8qE a1p.9!<' Ab2]:z44g,E,N""LO0.i?>!|#~>:,|pH !??4QѮ& ]ƳDaK߄I<-M_D5> OOşث (uď*/t+_׍=Yӵ[\h^}1ҧFNh}f8B'AΜhS_BgөI)S^5ĵ D/84c8~3]LF_Efsb2.', %F+9@xclUI=79 ɨj <=i Ie>ml]y%͖}M'ӿw]Q']%(~'CvLXojiNKh1z)ksl^Sa,&Qͱy#!1P<}J5T#m#~𝏈tkZ5gs\u77r [if!n8xH/FZx7XcC w,y^/X?Py~W&IJSvJ6I#jժb*εisԨ9Z1I%TbIh0?h{:/ xsՎI4XgQxm.ak CKK _Z^Լ+ >Oَ+۟? 𮗮^èZwf=[vڝ "h7XLq ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@]sxcE֗Xsj;Ir4R@Fc2̡Rd$dsX:PY0]d/vam'ED6)"^k+@1Gw" o]M V ycCƨEZ&iid#\rtأi8D%I+$wZp~ i_ <#ukOuK M[1ޫ5ߋWx?L0[i :i==oW3Cm5ӃR8I )J)ɤIlɝL46 E4'Uӄԍ(ʤ0c&QjB|&'PƟ| /~ |GjW_>)?Uּq_\Bf&t4%Q& Vo F.?7 ߅ZҵH,;|'ykO:Oχ>uxMg.Oe_{]7YX,tVGaq=A}Z^7Wy/7|PG~xv]* R-wz6{"M65 Jݬ GѻL|hU'%Dbɸrr68&5x?he*uO,ھE*ʳ–mRNXeN2x K hb(%RNைhx@/>,u44s}e_IOu=Iev!xNH|I/Iu9|xP:ݵռ6,ơ}-CP󴖚-n[Q#ys8TX)R:5)TShT"eNQN-:5&dM+2<~ UpX~+_P5VգR9bc¬R2Z3\bW:g/x.eZG/S+{kjAӮ5+M&On!x๿[%Ȼey}l3˲=J4x_B&Sln"J NeVPRq&ҋ~W+Ynw5a ^iv:ͤZw< buK/A5sicO]ٳ諩\h$ce%槬jZ^hYii5-VHӗPͭ8̰kَQgT)ANMC#d9˲t29˲|~ `Xjh#o+ύ_ |[xQn|-Jg>+k:98B vsa]xs6p'9419%q~S0|F# W,+ć7H>$H7xs"_I Ś2x_NJK-i;FtkVoM/K=z vַGayZp%% qf_U6/8#x\m[C&qW ps5cq/ gepsW7 ,5|@{-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<PRxO%&> ܚ]:N?n>2V7Q鉧} ]GPO㙸??wῈ_}:oo n^X4ψM:?_ţZIsm5--xM]WNS'a>/#Lտ5 iUkm堰Ygttg g/}?ŚW<+QM[z= qzsݭ-r, jWQ@d5F_+?;yWy_iˇ|G֡?pZ+&2XߤF3ʼO\>wo?g^CSҴjkmbnlo gohn}OM6Q +;MB}mݻG<H7ԓM4itZS*9¥9ʝJr8IpZg EFQN2M4ii_ D~w\h 3^¿ xSӵE&+Ƨ?|aixMoڗjk?|w>7|Hq/_I <wqwWw?;[-CZK_^gCws{a}7BR/aZr7z)֌?g%BNq)SS60ժ,)gRK , s^ԲG V^7:xZRB~Kf~x~:?W||`'H׺WïZZk߳厕>$5 x^ށe}\H/_h |x:Y࿋xOzm/7ǿ٢]]V5YxR}}*}fskx{w_WUq㽜֣p!R:3U9~ue)VO4՜(f[E U,N&#`2z3<֞ 'Ofsyn'V\ ~ȿ5>=9.K;Y`wjZݼ .tmKat>5;KT:O]kR˩\FE桫JO. w+X 3YUUro83TӤ("մf+ʫz^>XNk=vvesCsg}euv;E=I $H"?ĚZZxźZ;e+H|*/_׋og ޣ/($/YOx?| Yw^_7ye{mA֗p7\?Xw%:~qqi r߈r.Z Rb.u9^UC ^?߃~$M x_޷ZW?4V; rR\PX П %| =oe>}ae4kMW_|Gq{ okzm>k] |A-Hm>US<=]mjF|mgfCL- R Y#x"+xwK- Ĺ~S1i.hҖi(bh2,kׂ7 >QI?~xⷊ&G<OPѼ ; o_]CZ5Ӄ0"_x e?Qlf|q&SΗ rx6h rX8q,'bhpL A~_ |gox_7o^O M'Sa~O6V/ ֚NjU iz6g,uN*[kt |BOխ#x~,<9\|.KG! =/]OkEGe|w7_chq&>'p1y~?MBO6.-㰙;i˂^-xrelxei]\j&Ӽ⯈f_<)ψ4;:|GO|񏏾n=wF4]i!^(NiWiiq֏{b 6hUiz=b6 +LNa}CoF.αSlWUar\6}Ɨfn[qKy^}uIK,{%vG.xzTF<4dZ{z Jciׂ/2Tbgq9N Sz|,glLOjpuq9rr_;~(j>*]2#Lgu9,xBO|?]`佼o;XEφ{JoCG|iaz|'ױ#Ʒc X]IY^géڝUnI*TKxN*|T]gz:2QQpNɎ#^S[?2zTp~֜0US1U*UFЩB310%GB0^hvg^3={k> ID]Z:t'Ft[i DSmMO{n~ [@O ࿉- u.mGm}j[K!7}8u.Ys$;pRRӚk]rٶ5Ltrf{:8C >zU~/Y׍fp?fC٨қT7,׎9_-tOIn|xQA'дF'Uӿ$[_|k8O-r\9qS}RgNգRKUJNUOdu9y=/̼S|[GA_ZOm/R|JҾgzǏ.-ZuJ-c>4!|%3=>m)&x^|~#_j^#`+ 'o?LtZ&3<_,˰m~Q~eW>5|] 94xs &28LtZg+~x?GHOiO'Et~|*f[}W^tiڟtBt?KmƝ ¯xS2|d?.|N_uodᏈtMnmGva7OvW.{Sp8*ti]prԳ. WW01X~ ؾ >*cYUOUG"ψ0Yg8 QVt⎡&0^)bO2ʰYmrsW}Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhψ^,t]Ooſ-MJŞ00`>FKk+4^Tis%(7/ L[ ŚO/Q?e xNx>x7RwKV6Aq^ԼUhAoLnm>:Ta*W1o_yBnc :^9{Tc5jnj2*JLQbqȰ|+yf" d\F*]mGRO g !E'#!s^0ޗu ^|Jևj8ޟ8aKVχo<]7Cxn% (㥮S<+M}NJiK7 ľ_xk:i~*kkm7Zׇ_M^Uҧ5+^+T vK=7>Ϗ(|J/t*x'h]JO;50~Þ#Uȸk#9Z|x#󌲓*lbp5e+|N7 x\=3 f a`Ég|?,?? |5>4⟁u뚶ᕜĘ5}'HmubN-gno|Ѽ߲짠Ϸ>*#nEu-G^5WKM,̋V_/6ּ5-{|A[kVoN`;/|>뚱=_'u=cK|+Zx{ĺد|Ai5楧_^k׿hk-+M֯P}__5HZ^+Le76bGH" dd *,с̢Uq@=}A@VL1]eIc󼍾gy|'mjg_k5a/Nm<}ey>v#kP?ej^^ko_|w|:m|A׼Y闺nZ7[LJ4O_c ?ucXDw obl'Ҕa*QӕHFrMEIII8Ev[cNln*Ռ S:Ѝju›y'Z^ ßxtg/?>M+P|knjt5 wμ 5NFteٽlj_# [U/ x;'~ |3t/_+_趚=M{L԰ũS֍ỏ Yw;)~Sc7s\XiB!56e$ڴ_x E;:X富|Wyrxn7־ 2;-[PItHx?~,|o<\GYյ;uIk* VoBT^&IaNѽNvv)эNXJOd8}NSG[*FMMK^qĨ1GS`(<5O]~-xVY?gog,|~E;SSic)oм+kwjש&ogdχ?'j~=牵جtv7-/:|+x*/~$oxmr{? W| f}{PU/K|(ӭQR*sVӇ>i8NSEG e.|Ie8|] % -|6>kb- eu1)f)eӧ[+Ok--O>5!!ǎ~#ǟ u ᖹ gS] |W^_yP|p?>kM'W~kl>QGhψW,'NdxiqlX4#gD|3xN;[^".w-m-—~uV 3]Z75M3Gԧ{8l,-^\)ΥL>^4gVwVTgKpO"m&^ r.|1񏏼C?GoRL^]_ *a0%*jRw*r) IԅJ œUeCعer̲*~ rXxS3b #01k@nk><5=hixJ{M{úhӅGRr%7vԟ4SWKݛRVmƎ.TUe[g:u*a(UEΔa'V4T&8M4Ե,<9[:WuKAҍԵ.K͕ 蠶-]\yU+G㏅> џ|Ao h$c=7T~5 :*x]lGch c^-W'H}Q]fP?pO}4sC1g.[ 5J\v}~2PbNζt*tjQףWƏQWÏoo j'⯄q 'ᧉ ω5 뺝߆au{/4cJiyg<ƖV[/o|B}k5˟5׉|msW5ΛemoV_JKMxW\9Sx}_,Aeg,УiHys,=Tx? JL<.C2Wg↳'!/V֛~PtoIJ{kDc֏W6z^)ooZY|ᶵ{|}wmw6~kw"KMP4;JK{yEJ;?x/rn#jy4"OfeQ`r>xS"j*2roO x:nuSĿ 7\O ԯ, ͮݍB=N)|]uu{6-ݗ|C5͓Y-|"$߅_~y fMTfwƟ>&iTU#Þ_|!j o&M/ş(Pm .n2'ɱsg؊pmpX|* lBQIb^[ $1QWy9, OōO_+|4t$nMg'c=w4<#w|?Wv~vTVweDE,*%P $2k_c'.RͰ>wf8,:C[,y>xM|c %,L:Qq@|/?_<3t[j7|gt;u˭gG4ZAuq,zj3/$|-e;|U#U\_||=߅cogGMs.ӡ ]+K ~\xƟf#xM?|uD#f#׾)xCWm&=GNuKM3W7iM\1[FiK?8&{]ʲa3!_&sl3i},&2qXL7a,~..4.xQ/>x?z]((ߍ`pXaxi|0xM5-CXxUk9Ӄrb0x fG.a\V3[#9gX<)`2v_BI,.&k1>b)߇|q_zG$i ;?7_x>^þ.g7;IQgoZ.]6SGo}!Dŝ#H<h_L K :'J:⼻!q:w+kc^!}w//3i^!ѣ{2; Oi-N9feƛ,~sᏋu/h9em#1- [WLj5iRMt񾗫x~=Jk`IWYkpmmO񶛥KzɏtGF-ۻ]&~6Bh }.EX~<3+۽F:5 .Α!TZŲD: (Ky >$բVܦ&UD$24 6)+6~pKI%ִE xu|otX#o^k}.;Z3/GW j(0|6Ӿ0|.Rm.ƾ8Xךqm#6`ݨxVZ< /l`eE_~!}xC^ ;uO>93NC׼5{_p]Q{ZN~<,hd1qNT\!8*r(Ջ(F-ϩxӭ Rq0X{<;֡Q*j#U(ciO+RJt;8'=/|"?e,e'? -]grxWU]߀8x_sM1xG%-ӮtucPuƟ~(|c~ڵvW|q7i#{? 7M&$_?iV:{wZeg:<ԜX1)U"¨z9y/\fi,ya exLV"A}\RscaTodTi?g|C|=@oN/>3iq#s~9Z:utkVҬ7A>oX$ O#/GEþ>Cmw<1 ~Z|/Ծ1'o oDÏ6?ǎ<='D拤hQo:Cu>yWiu%ݺi g'|Ne3[u xO2Bkω t~пYGOԼ',Qî]+;.1*sQsҜ)Œ**VzoKJ"Sk,G_:GC CRGѧzjZchb2R·z|wcxM:_mk_u⟊~v}s-HxV<Au3m`Ci߱|wƽ]Wa__iz|SK[lt|ACaeM_$՛@zB,!֧S/ tF}ngy}R58zQƬ%T^yԢN0bS9x6# CKVy,LA:K1#VMyX>7^]*_uBƖZ;A%ΩL+~7|1G[4?|w]i1붶팶3swagY%2<ȬMz?O!ϲL9VK年(³άmdiUt%7EF5:jjqaE/|/|Q 75O~O=&m&[ OL^\:Y|RxΖ'tioֵn'2x8GsN++yd8a3 3qV7C&bkgYl\dpU޷xgďCⷌ,4_ݿ%oW_x.WWZ5-FXծxrj~"Mt+Gy#X)Q$ThEFUсVFRU k㸧=51 dm 6.獞_eX: *QwR8 & 73R`׎|_dxK▏{_ޗĞ!l:֚ ~Z|/I}R6\ks fO?]Kⵎ$Oon|u~ԿH:}mgx|4<Ďl88v/!dٶKƙv_d2l%,5L<u FE M^it7úe:^:-5Yc}oRYc-/ȿ?f_/%x#S',s:gO~?R^=9t;^#>5h[ZhM.oA'4ŦX`hz.O pQ4#US1܇Y|#y."xป*>8 X\6SeTtbu??f/|,|1xg|0|Doh/ G"wF?/"֝&=WoC/ sr<]Oz#֯|3<&[K֏jKijUh>6aΛ-w߃"k񗎾9kP!/~~;}[ĺg? \x[%xEм9d֑t kW],-*3 ʳe幗?a'eF!fx Gt:N'=2 Ю<;\YOkL5#^վ"|FX.>%xxz"^i Э_i713E>9b$|9 *7"\6u_r>$⌿L*_Za̫K(R ᲼Y5L^XaC>l)/|Kρ|9xt_F-$ҼC+G~ţ,^'ic c4DQ=ãi_*u_zMy%ȃL֋kb'/կ].&8RQ_\dxCf9XeY>bOpoP6d8eկ׋a`|g<;I_~0[8t9I#~ |9ɤ67jv'O?W^;~.|u oþ?:~/:/-[N){;-S-'žÚ/];M{SWX|Gkޣ ¿cr$p>yqV[42L!G?N zEo`3.̔wsN;W|D|s7[ wzW.#ⷋl9kFimfwmOa37ESc> xlt+gx>|H<ڋ_X]®=ͽ֍cȼ7Oi8;>ɪ8+O(g>53ڕ۹=~"\7OBQ[30mwsa~ _Sw?xI|W ᶙx'G5gI7eem<xRFw]l'T^r,*θ e=I'q70pPp38Rg-(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<oį/ktq=f/A&CHtJ{em1}Ha|gxsφf+^z+[m zh`կԳ:E惢X\4֗wQww _o>?~>Y<}ᵯC[Cܢ<モhZ?^]{i.5Ia_cZyxak8n\K4 3YǩE ze@ȱ`O( ɆL뺌^nvi:,Oo5~7y;<]?G}W|`$.+}75Ef$OgO?<6Xu3'F @4kHcs@k$|_Ծ/|44}G?|EE)_C4TK$!uaN97?MEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(̾%5ovZ^/|e -3Sӵp!ơڦhWx~,Ni\A 6;SXkW6mǾnEa?"C3W>#6M>.\Gu{%@}7Nt -+LtK{ >%H(PU@ PY0]c)v!]'Et/#k*[NYIw ^o]C y}=E<} ?JAï:w1^;.äXY@2h#E+>WzῊT4>:[Vw|E\þ'u]a]]^j)3n'Ǟ0oꚆx-JZ𵞍wW&j]Ou|"[ucԵ4]Z{ 8jPjZG29bUPY0ǍwQ'E6UW;}?}\֢ _~O<wzν,}OCIY4g:ow_~k ]έuC}o!FmE&|9 [nhf4XI5(Mxh#>x ?K~%x]-~ |%x+[n|#;}}gYK[^&M?ףB.bBzb'ڭQ/ezjI*t{5#ܳ/ 6 Ѣ8q]X|$q)bFk75'YV~~0Zp*7ڼ_~#xK(5k2?mVG;_G}_K]&X,%/`N`: aRՋ8K'jZ04!Y_<9m|mJW pg(8,YyF:iI)O2aVa^1qZLJ?aOػ^-SzEkZOxOQAGA]k j"OCjWvZ[Ks"C' ?iώ~|p-xG_g;o_x]]|q{r|v/  Fapj^58F:BVPxJ j:<yJhi⧝ѫ[-ڞ'Bo_Ǐ~#;]߃~1s>i&8i ˤxƿĕG5?mm(ze5 u.m~g?jvOixV%?Vmo]jZ~$?[v5Mz֫aHF T9PnLBjt8:傝?n=.;X`k .G5JUapXx Xy]\6YMSGK7E3#'ę|QkOQ/buZ=xk>N41.ϦQϧGw]_F]^x>xk>/)[ZS,1~*ּS"mko ijZ^\yuePRJ0[Vowz|^:F&upBF1pB9Jws%6ֲrs&;5|/hf]:χA=kMx|O\jIXol <ue{isWhiO ◊k>6M~0xÖ^Ҭ|Om'x>~.S| $>֓xWIhE`q<;aapN^ *y*x|T^cG0V:UqT*aGΒ6$;ǚ\ j/Ms$M'$͢t(((((((((((((((((((((((((( Zo?DGWh_-j_PᏄ$ç[|K5sx:VwP;Ě Zޟ{eky\ u6u#g1ܧ]k\/nuMF}gTO2krj:-Gx^<~3eKeqKI,-,m (nb7MާgCѯZ^F$9%wEafFemiz]ĐZYYZD[ZT!D4P(}A@V%I5e 4?gӚw `mCVh'Ny#m.6 < x?uhŜ^/ xC4L_<-#=2VwӼCsH֬L[YyՏ:ᶭ|3_xk^-|Sğ"4^|ke|d4Nkx|QizmYXU,n&8ҧ8jqqj>TQre,;9Nt$7`p41\x)ʜ7u(ҭ[+ye^hk7U>kG+Ss]}S@~|Co51M5?\Ams"ٍ/ٿ݇{߂FeᾛSiHn>a+MZEig=),ZMK%/-g8,J+0-Arͬ="TquOsFrZ, Grjg~kf?ƈcIº8lI?Rl|hVzl^_Q#?Dymx~ll 'o*ͤ:]qqF5+{y%«TSjSM4(UORO |WRJ,^aVɲX(ťqa|k.:z7Ia}J_7x͞GC힥k>/Vib.w~;-htix; +Q"=g iZ[_kz'O>8:}?*Ӵxl4}WwUigkl? >&Yie+ x_ (V O|5'|i;!乷-.[INw/:~\׭ZVwi Y,`{x"u/#-KF9 5w^ʱ^\ORK39## yf'|"q2XHX,Uϲ5cFa FƭeS7JxoLO~xFҥ5VI&Tv̈́:TeGhT@ 7߳4 o> ~Y|A.ޭp$4?>OΩiQ ZX4<)FQrQM۲I-[oDNJ!J9իRqN8u*NmF0"9I6I&zW?߉~xO]g(>%J}3zOoir>k'ckQtkO:iږwmg{d>?>>|:~kZoh^ MoGKº&kh6~${Hc rW9Y(VRtUYҜi:Jr#fL3 VWqu،&; ' MJQ<^47ZyT=FGu _R[i]ޣrRYE\Nc$AI!HW۶4f!NI6ZKFSayNQVI+%vե_| ^ՆxwIg5ciVejN,Z]Qqo ;9Μ,Pn%tvi5`8&&W ^4gP*Ua JehJQ4|į xV~$G,o/m/u)Ŷgsj:V--"$Ox>|ePӦմ;]|UOLI$Kִ GO"M^#:1Qd%Uf('neVK5,2Y},+.8՞ Mae)¬ꫫ rIAAC/~.>k#>恦zM(jnZ}u7W$Q;fQTTtgNrt(7+ӳM]6Fϊb8$7z$^ֵ[y崺uHdKkEf@Z֡[QQBT\V:U"8 )FQ[Zũ+٘eSpܳJ4WakT^+ѕL>&:Ѝj)֥)A*B\ߌOx\<3iVO\-+I{{hIBu'B2(\9ɥ)7)Imz+abqiSj֚JTԪUV tNsSHڱ-6Pӵ [{ 쯬K[;w [$k{dxHݑI14$QD$)gGbwbTHM4ikT[pf(MIũg-]=-ri曧Z.ahj]御zu)qgZI5ݼmum,O ,R:24-ı3P J^IeʤqƊb&n-5$M4[9r(N5#7NT(4\Zz5s<4GPN5'\t6R_˻/NhwϋmZZ[:sq$x.2WIWM5eՕ M zPs^Պ#RTF39pm.hJ2WM+_KeYZĞ5+xNπg7l&#xJ:Ꚅ6iF[,妑 xҾ&k^<]jM@״k/<+=S->巚Lљ%hZt5InW/? Mj\oxW4^Lյf3Glk$.ⰳ"ӽ;&  SIOgǞw:H>u/^b]Z#>м?]>B-5j> uWMZÞ75_C@VL1]eIc󼍾gy|'mjg_k5?6xd#~m9ݥmf΃bѤQIhfK[KU sHPgx%{Y4oTbhbr\5ju_~YFVJ_f_Z?ƿ1ᇆ?ij>*x>{㏃V'ljfuxt乞5W^( |v#/G׬IyƟ-w:W9mUH:/_֕WBVSRTUZuq:ѧNZ*FJUb+F*Se'GB:YlB3ө 8.33x<&asLU-LB:] u<6/¬߃~"s/x⟅%h^9~|g>)0CSdO"𧇼3sKC sT_Zou3x/xŷ?f? m%<1v 7~ |5EGo_MY#JJsV:*`0OW\t^&g:'gTs,$#_&ɾÉ+SGS gYuE| ^IC ]|!/|W~/o$<Xea^xC^-u[_'߈4մ?@o_6ω>2υe {[>=xG Go`Ŀ~ֿsppԨ!:JG9./Ô?_ b+ e̢̢^]^q8`pU(a3/|[ |GG ؿj~ KmnV>>8Q}=9]-ht i3't]?O ?ƹ~u¿jO?k?L𶙥 o8#(~ھ 7$ XĻ QX໻M.ykc V?NNTshl(\iFUW fGhhNh3dX5LT<;0$:I*Uӌ2*cqU7Pe_M/w[56>$X~iKuW;pW~#xCxݴ_ 9=^hROO!~ȿqcែ>xzqƟuߊUo_Ixwf_KBMizT3Gb7O-HӫSICGT(:5<XSúibjK NIyWHXl."%f.T4}PJx:SԪSzu1y M/i)BR)3|j\Cu 8f V0Uu1x:9rʭ9U,\xƞ #Vl4񝗊o[l#w{K|U5hE|ib!-Σ5 x2l!Y|Os^mo>a`{-}FaL% <ʍFkB>5_ 'γG|^k뫩&_%G/W꼰6:*,M r~:.5pӡF"N'%u3Jp)e7֣V / Wt>(o!Lڃ<'i|OKNgot~]F5-'[_Z%QxĞ=ĭ6/|.s_io_|MXKY+|f঩q^jv7B;m:Nq4V{q0nk[A(0PNe:aVNR&96s|=I`81βP#FUapWa<58{p\- {F6(Ki?xv8w,q$r73Zgo"ZǡWu_4v|]jڟ OWՍG|'ÞR4ū@6x_o L9ZԕYۚJ)a'nE7:e(*cF2jJ6B )r(^NI+%Ė~׮-}J h .1jV#мQ{iizOKtBH_?a{(f ^DC~/ϥY|Q~/xSGocַV~ψ<=kZfgJ^ +#((((((((((((((((((((((( Zo?DGWh_-j_Pwz՗7c9}CY --l,⸼5Kh忹I߁",o9ំql"9/i!ݭon:o /?kO AGYAveuxiw<*7u'T47Y^itZRy,Il-o$xdF{kh.abcV@_PPEnMYKaX4\pڼY/aӭ4b;@ (Wƞ5\tKM[GRdkElK Ax7hx-bxIœ9FWJJ*Wm%դmW^9+SFч=ZӍ:p朣NIsNQ$g=,qxw-|Y7YHn~G?x?){\t{MwWm.=OWXɨNyJ UhN'(U Ə%ZnuBZv! UEVІ79rY WCa fXε8eօn+Zׯ|,G|K_YӵK \ԴOxO>67~|ah>2_-m,n|=Fm-.&Hn`y=**ҝR%x8׀Foqp<#/ž8E՗iL7]/NU9gr9~\.xpV|LpJؿoaV[bf*Fמ}&2Uq8XZ^ξ+|VW_? 떞/t-2_FO^!%x3Jw5Yh%u)=8iZ&tk(u?ji,z=X4EՍWN3:ppU!9MTMʝZ*2ʸ.:40ҽw^U<,+έi:Ӆ t+#󯋟 t mzy^sW.,uk 4mƣat-A?J(Eq%cEE'p9=hI҅,*TUcJ2MJylM%<]I`ap^.J^RQ'EJ9JiC;\ִ LjhkZqqM3KOu?k6Mq.͐$y?|R/írk'íw,Şs(:Λ ]Mša}R*:ӷxLӼ?h oڥ彼_h k6|F}:F_-u.EBǺMt*}jVw_kz\QAys[kGٗvQ2z)QR`+\'s}%ѝ\>QXRINQŪT:Ҥ}~u|/SF~<{ cbWhK^%Žgoo6jzQHl+Via^+s\=̝Q|D"áK_E<]Gk:FuC"l<;dyeokya5שWgkY#&ΰa',Fz4}˞XNЫ'kJM ( (((((((((((((((((((((:Duv g"֥n_k@E|Eɤ^O \4. Z>xƺ9 "נ<%nM2+kI5SMl׷p^Lڟ;xvib6h{l5ee{k:~jj3ɥ],@ǻ-ºW➔eh :# ?h|,?|A.gw(ZMF+H'#|?{x}KĖ_X\G 1h%p+&31y٤y>~/ͼ7Oty__h`P\-HmĶS_QWkP4賙lCִ>|9e *2%P]N4ѦJ5aRF\hTjSeR.Y)E)I5t|gZ|<> 4Ti{3*W_d9/⮫/ ɩH4F?-|e3z> 6]3ߎe_!į7>:?qO^!tay73qjP[u/psĸSeN!]Ib/8N^ڭ Y)du+gK)~%B  Y(VYkaU0&8p|jW l6| մ|:6D _'|x׌ qmC~&ĺvsBվF|Y7ƚ+Oid5)8|)aeY|e G>-x7x>kΡ?x \h9'?f}ƿ~,xGFj? o @?|%}zQg2Zcx{⟅~:~>37<]E#@^*G7wa+|55qgK nj^_0\RR%Buq7J*xxJU!kԏY%<E̥CrT2,+啳 ̰8^"fԲ8ؼ?RSY> м?~3~I- ׏|k[YP3Ɯ%) xGWTúPe)F|<)+yQ|?O BqyfM*?Rf8<*ZmT:X:ѣ'<eߋz_'>kxNj/~φ4/i'^~˺9|Au ~x|/$}zΜ]xMGSZ7OOU|;a/^վ%ke_x/ƫ˽#LXY-W=z[^N1c MONQN:>8С]Χy4<#3,ŹJ3:{j!W }pReyu*b[Ǫl> s/;?g|"Gog~#ň>xǾ_ͧCx7nV{˦ŪIi\Nṱ)Ua aAWFN*=:(9FM>叧jqW|AM+VQJ[-1lfkR<&exLVRTagR?*?x Ffψg‡T>-_ßōWOWQNt^>PԮ>yv̕ ЮBHFI8F F>MFy}N&WC0l8f7Z+| J4qXʳ i'ÿo/?f^4Y7ºFO߳aH{Ğ0_[^&j<}&=WK%"|9:xC~ x{M8_ǂ//9<0<=E[𮍧x[úE<ڥسZmK}r\_}Io>,i}eٱ|+X| :N+2uqe^n%k :Mxǹ%~ [9o֎U|,L`SQX,Æ1IFT#,Uҩh~!x4 +tρ~:Ѽe;i'Ao ž&L.4-7^uT ;l /_ |k3h?d š$>&|I[l}x͵DžWCÞ,֖V^+]vmť.t#G2'8̸JyupqL8lgx4C/q,)eGl'"b2zu\Dkk,E|/[hOͯh֣jZ^n<BĚ˧gzPӴTwθs~ V0l'lyÅ\%҆gG6Sdmd'˞)p!>xh~x_],<o<1k ZΟ_^J[X. ]7XΧ ]?W8?|1s kx~%RUThi/gJy(ҧryyy9IQ^hQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<^ÝK._I7AԦX֬4un}X ei%/s"6̂[K5eל7>5K m~.x^tkXՍ0Q}i\MlImZ(nno-.a/PW4VeK}NPId;eeTDH 0}A@VL) u ݘ[IQ#ynHJ=vQȲBWwSC^XcqkQ@p~ i_ <#ukOuK M[1ޫ5ߋWx?L0[i :i==oW3Cm5ӃR8I )J)ɤIlɝL46 E4'Uӄԍ(ʤ0c&QjB|&'PƟ| /~ |GjW_>)?Uּq_\Bf&t4~ҟ mYu?5fmy읒npJEUxj^X{HэXTNuEBJ1%/xxIףp,٧"/NX x\FN0bc"t*j<+=/x#OOڣ~?|wo{ƚVhִVM^>]pЈ:>6%ax?x?Gx4 X5G ت~%//mJ??x/~h''Rg|6-JU]A_x~7 .4B-fX?xg>x_  NWh?ِƥ=[o,s}RȒyhƥ^GV,GսՌ]W't_Q+ƌf6٪.qv 7y72u*2δa0*RxL~1C]^k?g)Gګvnw' ?׋~xe_Mn{!ֵKx_zM1ư~_-9m)~-s+qx;jZ<_?U9JW!pJti9*N}^e%DvÄ3i+UQ(fʫpٜ8E_eO!><=oqzcድ.˥[CIiVrZYK்$"oï }MMB]GO"=&&UŚڦڃD%ɍ5L%xJ*(<3*>ךJuVjڨ՛8qc<63voS&bn=Zxl6&ZNX~*4e8eؙGMʜ//|_xo_p<]|OO<+SilCĞ![Zmy37? .º%s-s}g,^˥^mԖmΧYMԍ:*ҔUөNJy*қv*BZ<7 jҥnhaj­EVi{ vװa½'<O>6Ѵ2x^9Y֋wkwXLzG>H]Nl෿xŚ_èxC{$t/ 6Kx[ ɨr=7Ivj2إݵ^Z%e/nc`O ΧDL2 T^9BjRn*)BSTU1FxUjҍ:ta*f7 4aN(sIRN*q)b߳<_jx;|-5+Kԯ)}ixޓf`^Qekq_!_|)nf5kٛ1MW:4vXkW~g.m4 jZdwZjQO|)S8r)[xKO)'=sZ~5Ogy-&Y@4[OA+[9SNӼQ{ҕ3@$)%~$xWo񽟀~0mO[b_^$|GZu ]oM Sd4}: WNySĸL:s^riR,ege-^w`9 r ;3ZgX vi u>xM_e_4?{Vפ}j-5}_PЮ<#^ɮC*bߌ|Y|^:5G^8}xL ĶZOT,K+MGQWʖ\α s '̸Cxe'x)0ḯG,sg OƦr)SG| ?~H~ iį |:aˣ\\~#дr{i,VZ[u{gG1Ԗ-(a u߉^:~h<' @kxJW_,մHA Wxa=Z2>3dK<| >ʞf|nWux6]˳apvcÕ+cTp92YSg96kZ~пmoRu Nϋ>o#CejgmCiC%ݖqs Vpx3~#xDUo _ g x ^6_j:g@ZzJAd`3\؟ |Qg}r3,^'/_׭cˡK ?b=l&kgIN|]AÝcAU~uKihs崖Ɖ'jN-oIux4RKNP}0^&ae 7_;[]T$4CMCy Wqs^$2l/i1g9[UX12a1nM:?gbiU&5o>VqZoEO?>2&[i%j 5fL:qa}&'Y<݌|M犼fx[T~0Mi|iRm?HMC]D].ͣKxJ,M7rkwkqcke:_+90bp8d\5kUTpغl>NxJ:^ڔc*|'( +((((((((((((((((( Zo?DGWh_-j_Pzź-#~/?1Wе/u|eCt1ePLM>Z=|Oͯ#_txdh7?|K|GR>ݥxsL5Y%ujP^^RB$.M14 Od_ςzm#΁ߊ1 cxrZӮ2|_bJUkcM״;-R\/=еO x+:jh6h ~&Hu3;çǍ"Im奻( ɆV|/A;߉r|94ωzï )=ON|?ĚΒi%x'|9ej^}#V^NJmR]/Nፏğ?'8e:4aLLr\FoY)ⰸ~!y% `4'^#q./+bT1Pu%[~ | !>cW'ƿ c| ~1|.~o5 |8N߅ZH~mk%|{Ŗ)m\x>!k0;mKR}sh{l%eʯ`^WN |oxK|M[ƍ_ů~7ᇈ>Cm> X-%kv-n"mooKGړyg?[;h,5|Y_ n<]zy?HxY~"ktk?Z<=Uysi6q bpRyI<إ,E:16J;IᒕyaX:T2L>.3~L\ O%C&SQb|GZ%IdNHy¿ Gok|)(_𯈼-}ŷ5tx!3]u~%xcOռ/p}=_~-> *nTe._ xPψ>7y=_|}ῇ~'o|Koڷ׶omJ4I*:u+IV3(0Kܵ*ЩV?kF9QTRxBqhzs7s2&31,,iPyW˰|IK1x̿᾽pk6Z޹(0GM.]^m(F˗ EJiq1J8 tjThX9RjVʇ%?cC2r|%oe43|V[S)ikqag< 9 \,:R>/~?i5xF}Hky;ÿXмs lx Gö>%xľ?`OmxK8'~͖?> XY'n$~&amnMGxs:WX4ja&1=SSZq#Wp} Vud<ގ.sL7hb)p3 K+<3hfV73eFSb'Qadg~ʖ_ .~^9{?x_ivϋ|>|b-y"ӵ'fu>lY[O.i~'ne fm+w]x{|ӵ NG.zTZ&XcC}15:Niq\ܙfNӬlŵQt}C|>3 M>)x /ᮏj{SƟcQOxL'ڤW׿ۿk񆛤xmWLrwm+۲I%w$KCiԩV\g:j1r9r*4v#E^ьTUH{+=FO--/+;; KiHn-!wx&Gh  xwѠ>!躆M?N۱|;{ZC\m[kXgUV\;>64׫ aq8l](JG F Ys_џJ0~q7CK_Ww|u^'6K {/3>oh-R[~_^ZZfz]Oo?ÏxNM儛= ğ:N>\1_\j@ԧmkK>J)h[_ o/>0T^}w7 MojO&^&]h'?D|V|AԦx'Gu((1b8+2\YSzy7 y_)gf>: Ve->;l1`P)c%< Zi ~$6K|'fv> +[IKU6^%]̐kFyo ֩ D5/o-Sk ]0>1am#'>k?]|(5?jw| 0xK&:ƭ>OkOpgqfolLj8OB b$g\OԧC3ʎC QR3 ό~h=K× MxBCP)zlRҭng{g.\zGs◀uz➎6!'O sFյ|(|GU=^6mZf/FTu[yxK.=e5K|/*1Ħq-,=s^"m_% c192eK?:Kf_t_|Bٓ[~ |?[ke{k3/îx{R֠0hFV2Ҿ#xw unv|-WĿ t)3hzmη#J[~# SӬKdžj,|9LXWMÈ+VYSC+gp>(T̟Č>e9W 9"aqYml-b'i<2>~˟4ךڂ/ூ+O[/߇./-_³>:u}GB _^KugoG/>&tO潦 xƾ=޹+= e{i:uAemw'pw> Ͳ",#+2x?*t|sfcKy,_8;*O᥋O8 JP|OQBM3 |I6 ecχ>#hWi~4ֵSJ]4hΕM'+Zo~+%+x#>~*xr<7jlpo _Pq[BHgl]7O8*p=ly>Q i9 4xop c\s?崸W4,3x PV|Gw?{|y_uI~o>fxx ]K\>[\=Υ^ZEk|oZ}g>|%e j$]ᆵϊ;>^+ּt%H|) C4kvQ?=,,)gZQeFoW9 OJ81|aG4jpⷐg&Z7>? φ?x _m>T}e_<7N]{&Ӿ4k>)yk~(ּei0_E 28"sÙ~+U3G Gu8,Z\4̻/&g•2\71ӯ -g? ~+j?cO_Pz/_xinW>[0|%x'C+k?V%-&o%woM5:p e7ƞ1YX- Ft?Tgia:&zgIJҢ x[RПQ.?8ʣ>=aBȸ*8"G_ 8rll1]~C ՞ ø$kJѫξ$^>S8Xy=oUjdPψ|e4q.c(|D^|1ѴY3'ޓɧx" t!?_lKWtf z+-h5xx^WYk^?l5>):oS'4?xğ ׾x!⟉!{qrŖ4_2Uo_M&5_ >;Om GC_|Qҵ_k-sV|Ě'u=}k|Svkվ+ӂ:#)%xx8ʎk# ̫p|>ZU;WW־3q?}3M ó|YXOͷu7tU=v}&?ʟt?6~Ԛ/Fk9L|O;˽*߶'HеSVVOhXۇxǀ~\cyq+xK!p3lź_}e≯batBxZL 1xjucW ^Sۃz Ȼ5ãbV[߷}SҴ-B-4 k;tn|N5+ᮛ:#^Gy} 5ˉb85V8P^ΌgRJNJ)M\PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(~'Tww[;O'_xúF[Z_<3ci~Qn.5{B(m23}W>%> ӯAkz]Xu/|D,“<6~Q_FmbFW,%d؎i@<ƿ5i 9 N?v71XhkɬK{uѴ$sB4ٯ.4l洷MTຒ$yԧ濴Boy.a%A&{;fs ]( ķMZUXE~fWC9;5ԥaY%0;h 4rZtP^ko_ w/Qw PhixÞ Qk LD4ѯL9>,͘ tkV7.UR nn^y(Zu}:8ecaҭ=ZOg~E.nNx[7O՗1sCMXO7F#:ռk_wJK}SoS5ۻ?u>L t_A,%e< Y[*|[Rh~ޞX$ga rQznW7?_he+2e3S=iեaⰿXi!~%ź%xOw⻈=+Im Qk[K["YV&:Ĭ7XFSBj18IVM4 sG]~0l#[),^o !d}:pasZَ"HfJ1VLoY?}WBoWǝߍ-[x@m?OJtxV:l6.%m;j׍semcēc7SxcƆxKcx}Q4ReJ?mm}jv6-)UNJT/ gP:PVeJZmNvohr\sK`*b3|,}s Vaq*,>*X5Hbq 85OU>*8 u\?A Z5x摡x[C=P5 xټ3⏇~߅Dfi3u{3S..`~_|EFm/>ցV? >(xžϊ5 AxQP%FsWrJjaX`ji5l\+4iWI(b^FѤX|eH`1Xs' OXA>"|Wе?T^I>:Kៃo|A M 4{#C_IM8>|O~:KW>>%|+xWH%6Yߊ>|4>(xmWÞ!u;Ro$oMa\0*xgSrb=yhT8Q }QFJ9c) N:? mo,E)RqTxlYY'G ]ϰ'`J*xV#3:V{*Mf?>x6ƞ?.O\vwr4zx! ^]c:Í Z.C o>\#|V2i~GG躭ݖf{ SOJUƜiԦם:˖N.xQVH*C = F7WbpuX Fe&FOe1|3-'Ğ.tKy(mt x+S,oWץ]o'ֻ{$MlMgo ֿax@kaa WE滷ѵ භN-[OSC<I֎.to08PtSJz_~VV{ZND(F9W8ԃ~nsVxt0ОK2xuˌГAbb^,̪)bhNxfOi:޿xY}w{j? .hZ߃bM7N^k㫏 ᾤA!W'twXW7>oe{s]Ե=>k +[+k "upMA$کJ\nI.h{jqoiTu-:J3?a L&*?ij<w17mmvsj-o57 _> ?Em xLJාBь-ྍxScI82eY3 Tø +x_i %xk1l"TS>3 7mG:!74˿?~aZ5yψ|;S57LPJ?gOAg|/>Ҡ¿ 5֥m] D_ k~0ƥ4V~ dpSZdˏxYS7c9~;ɰl0?昌4,'f9{r⾩^i.†u%NGe<[iMzLť4<9/׵?x]u.[oiW 麅WA@G^ķ>񇂇<Kς~#hX*{oῈ>Wm|0[u5[W[{+ "f9sX|'0ey-acRl-+=pK*X[gRϱYhu~*|S#&4]x֞'mif\kC xL*Q3\ׇb"'/b{Nufy S쮎/5ͱt2|#2s_?WT} u;-޴WQ@q>iፖ|5~\] vZωӬU,45{W^G67n%f/8lZ*٦[CUrW]WR8|eLX`RXYb+ʃrڊ4<5iҖQ]3Cl=o}BVկV{awjp"^wW/-IJ>a"pPWƭHb0S׫AIR[ OB)ц+rkR z+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@/ßY7tߋ[ĚϋdHްJV?2MW_PPE utYr̗ǟYKDžu|S#Zt2=R/uw/jg>yz|ؼ5i,%Z刧]*.G smάG%ż1!fx?id"r-?졦Emw:ޏHxI[X5hF)PW ZXJtObTq15l$bs3*rjXܮYq x9.1jx 5>bxԝ 5٢o gEii5>!Y|BqK j>6Scq=&QW|8k5 Rbχ|\k7<ƺ'o5ë=O at_5 >2\[ǁ-tK-2j2jXoWSNxiOUp V""*RѕZ2۔-qW '̳LfpUJ;(akifmK 2̾Y*TZТO5ZćW|w'}*[AU Ξ<}g=OLݯxE]ឣ ÷|5#$YY_h-W>7|ׄ| |)>&/ڦk?/>Wmk(յ_| hz WޠQX?>%IbeT)J0A61s%qX{FRҵfQYR4C5qpUia 58~ǹ8v?~|oe6.}7|S_4Q x7GAψ@MQ95DMN+ŸǍS }/x__k>4_Oo_^𞋠ܿb7N&T牭 cibhBIV?h5煪'AƔ SWMҌps,=~!^02`G֡ft1sfz\F6xYh߬_3ō'gG'_wxs⟇4Ҽwj5xCE}I\AmJym`?>#P>.w>|)񧊾$hx.zj~=wï淯O)bѬ amx4)8,F:O*aV*jjo *Wʜ֧NsJ7K!px9E|# 5|n"dձx}:1*j8L&y11ƭ\fX?g<_ٛ??ѵo?5Odt߆1h:Ghέ];Ci[ºƅ>,w'~o7v/X~xB'0M\šx.^]3e,:8:hC٥b*5YGBta`,=H9rիJ0柫[F;ʣh mM˔a%crF ЩQ1}3En|U?~< ;/O߅Z_\j @ߊ|Gg =(ъê_jOco'|ETƻ__js?'x3Z>)+h^Z6'/ݝ6A{NgK>)8 Ἣ/K1Wϊ#C$/įe-,?lokk{x.? Mho,O3FZ%'㟌70D|&? tχ'oxNk_/OU-.kqPZ_K?+JfcjJ9] 3eyfaϲ2x5yߥƿWmbo I~ xG^0(xN-uoh^}?]MĘM{o!gO*~0;Dg4$M 3uo + -36-SGnA_7O6Tμ3=?x 8#q.{W:r>'M Y p~Q_PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/+ړ$:u[xg;El%]KQקMU#E`2K&s"s Z9:&s{xψ iFxk¶:|x:;W#f"FkYZi>G/Mrš;L'M+\G ޹Ϥi:N#3kr}m5 tƟ 5_6>g? xV:?ύM> [Wvm{5 iא Դonv~mxszm嗇4tn+qq[I446Ekg 4uPX@|ID ML'Iei$lR4-$WBmbtKhnwo D/,x.oDҴ0{TԚh_ J^k*xCHH?56)wOᯍ~~Ǻ;M7~ze-cg'oxYɼ#nb|F𵱰Э|UOSxi|B9rji+_5j-5nn \Np(((((((((((((((((((((((((((((:Duv g"֥n_k@Ex7wWW5CoV|o~MN!ht~w=PZTNӘ-k:gwOޭYo:ꚭ펚~{kg n4W?>o뺏xFޓg-2CRC[xᗉ^ZmOlJ5W7t >(M Z?<5">>dד\m,_5/Ĉ^!G&I+`)3 t,k bEU)\}ՁxUxÿf?jZ?>,F6tWu-/H|mx'ڵ? ~f;]KMi5׈!UKgk:l|iw-gV⏄ U{} /igYxQ[i~'-yZǎ]3IfSBft2bykgro4Vy[)b1Uy/?SmK.࿃|)G !Z>|e|8#fuG]#ǚFxᏀo<.zk6{iw}kWٻS~_:L)X r+#Tω~Yڽ1k\ۭ_kڭ.JG_W_(B+,=hI(cjTxNŒTf ϣRȱQ23ϱi2'(ʱjЧ!eh]~!|&? σ:UgL|&<>h5'<~tb?6ּO k^ tM3ڻ6?h:+?x[Śo/4ۭ7SNӼEmo1A״]A"*`hMcJ z)J89ӆ"BcZJp5(I9c# _a\&quZ!հ8fl)p' rՏu2e9X+­ ӝ)J*~)]|D'%U xCh5,&IHo'χ~|^մ[^ok7ءK>|d<;#Ѽe'|5|}>?x7N 4-;-_/t}KR|y=qB:u~YJe* ^ʋVJ+*VYUb(Փn0ƏM^ U£Q*,N0b֋x~|#0G Veߵ s|_/ ୧ÏA| b?LZ}'¾:^#:|?7xgQ'-N''${ɬ<;95xe|-4N&IZ^95)[ :'Ÿ|z)W^*þ"^;־+Te:'VBӠkj"QW#cgFiTiQJ58,K.+ӝ:hFh8A|1fgۉq9~"0c/,hfx\F-[N)bK1:ic}G7x?~x<Gо$6`߫~5u5|co[MվOxKT΋ij 84OCUԴU=&ңO)1,c8Se T,YBa&婗Z؈cG[SRsL.&uq49U_%J8ab? ko~>=|okᏃw< x'K#uOxLu=GöW5FM~ݴZVZgx~(߳⯄~|D3'4+ -{C̺ƅCl瀼9m"ĺu|blAu6iF^ N3BXgb}i 8<Iթ[{PNpm[1 Qz<&;MpOo_-|ptO3x{5(o_o}ψ;'!B֞>XmڮVT0u]GKNJq)XN2h7%$EF F/Ce+W.q<+3啞_R"mqea:8Mj1QpKRX/h_~(4_?(N|9b,<6j׿Oxc>~뿉kksz6Whx᷄+u|&au+,t{+ !IҫB/ / B֎12ha%$ܨAԜq/G$:1|e$uS%2T*ьcb<(d5+Fr2ףbѣBJ|iqD4_Ğ⫦1=b?`0ɮMm5Vѭm c¢c-< n\?ę(Rz4U%SO+K߃.ikgq4wn|;{561N{ ZY>y}]E%ŵ]Oe,Kwl6I"][ݛOn%n.DQ=SIҒM7{I'qϖIf>%'//ڳ"xK]cr7 _ UA_c4oi>%hN:M:|_mG K;FGx<1fDb2=\Ml;1R*ӫWF<-zUpp9:~Jd4VQ%'e((fi5&Q_"nPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<_Ve^5=;Yh<'ji֋u}'ɔZIcmsXu8oe5< ix\urI5[N.Ziz>e.c ŌzU[^pq0-{:o j<kzn.sͧϦj:m%ƑowzP.n乚+{n (^C1H] 5-{,cbm.[aK֢;k~'.,5km>ú<;?oV]]/Yɩ6o$s2͇Txo/>5񅗊#Xou/-|o cOKu G^aዯjz&6m?@}Zѵ WFou~ x঱[ǿ>"?hN#_Z_k{mdW<']/[G]~g=Ɩ)%qpb&"jVP^*UE:nN.^U9:NS>C:,=<}N0yu[00 *g2S1歉uO0o'Mo{P[iz-Űm%Vi3AiSa0NN~Wu_ ݶ/G_5MGO ~ GX/5KOXx;W@>xQT{P/,. u!g;Wt=oĿ@_ oh/ k ]þ2֯NJ,Q#hqg=& H>]^ >Gß/jl. Vïm[Zs{>|Ui*4p:%FaJJuVf%A⽚tRNocO.,E&7-fpٴ#]˰\1X8ʹe g,<' Wt%?\iG\?񾚚Zàr:um}+Sj2\_NO, ~bM[u>.7[Qoo=:xFWt=&?"MK R75YmoWYG81thJP J59j64e/rԥINGq4R,Y^pxԱOYCp)p)u֪X(WƷ|T./^!>ƿ $0NӮԼ!M m}oT_a/ŝ Io Ưÿ>?~%W5+QG쳩"O /3D|F%^'OW޿_k~ |tnzRÚBȒ|I~"^#iV~.< Wo ixkojWz.9teR&VtJ>ҴkSԕ'JUcIU&"T)Ud\hJ'8zk^xv' d8 b9(acՎ]YOWK<~s3j~9c+c*TK-ЯWuzWHO|0[<8<#w7t/Zo%_^%ĺ_94vPr]xGcTO SG?kP|Ct _oM>|/=W# L{k(=K[.tUTp7܊&RU=ˑ8`XLL;r|V%aLD"x|QV|4 +⯎%[C[x sO x%[m?xS@ޏai|>.pYafJ1~|JF)1:^Xae*=L0<ƖcO# F-ḇ Wa1X rJԩ҆kxM:gPy×lW7)oWOŰZi'Zl/[ֹ sV;߇eڪ?<,ER;f JҮbpQQTmG||ة]Շ-*|[ūNTg\7FcFJTigzyծs]ch:X,To/<>aqt>~ mwZυmuh׋ot Ki^>5ΧKKYotWƉ~*Uy4h\uj8JIYϕrI^ܪ1TSQMkf+7żv5xӥNhEU*TU3TcNtN2(7Qs<9j%ωgmEZGi[o 7#kMk=όnYǺovI714jC,Ium}٤FEE<t$"-dR&9'fJI4ggNgfiy¿ox!ƏVz> xA?~(qk&Ld>/t9=> MCַogMcIۿ9m43Eb"_pԨϯ<e: x0W_R3*ժ?hgN6sF9I+H:$VKCh((((((((((((((((((((((:Duv g"֥n_k@E| ״_k9x;N_jz|ZU]lz>hڊi_KE<=v,C>6zψG.<+wOha[-Y.VQ4w6+*-̉=+&2XߤF3ʼO\>wo?g^)xkKeNWK WK o4?xkJt 6UM?Vԥ59eK(¥9*Q)Eԣ&ѦM=ά j8|n"kУVB#V:ʜڄ8 &i3/?u;[Ş Nj<]a_"]Nkxַ>3i_-ִOZA]nel]f2y|QJ_>8_Os'Xt C^Xֿik[F5z_J*JTᅩ.j8\1p:qNB\QNpMJ?ysL+qX, xp>aq=*YԲ:r]եNXZrPK3ÿV> x/_Cß%?|uOx%?i=3Ŀ5xW"\cLM&_~_~:~?;{ gχGOw|9i麮}==A|g?7~1x3FռEiղ BL*VJJ\vXiP=G<qu9"zt!5:ӥMŸSS+g,ę% z^KC,NASPc+4e1a.>5P2x]|Ig>~П|EŸڧ$vu=ڤ:Ro!kMgz|Aa4v62nΕ*%*jHG0U' ?cWF2'RtJ\`pynsNף@־VмUDAe&3n-Inuǚ=iSƿ; \xT:hST|mYt%Kkh(ִiS (|z8"2ʅ| rt <435:9ifUQ<:UZj_>z✿)|Egg >g/Fk;W_GM|_su{ml!ɨqGyP Oii|Ik/|-WoxokZݵ=[u6 8 mu-r{ pSn:U1h҄ hҥK~*XB;Uʇa;8eΦ7 yM,pz<†E:uU`lMu1_ڸ ӡT֣Wo|q^ 'cZ =#M57ψ 4ME<Gռ5$=Gk1E./gtG~:x=ox[mkis_Ɵ>+| B=BӼ=}SچyjjcZ iЏ%}2uo~%ow| nU4_j#_$|-niRG47ͮ>0X^h'W|/ |ٶo~ӼQh^[T)Ok^!?F߅PxQ¶Z]k>CZOibe_ IS 'RtXTQ'GVXYTJTk/-X::=պN,yp8,- >ƽОYM_ ,pk?hZ1|(?e"D>6t߇: _sd?ckw4as{Aߌ(|/[G_A-s^XWm *_=?|-C=xw>|- _x#ľ{ GGO x?R4uiuC]^oxeb15]\cF2J)ƕ:=FugOxThӅJzєjKY6I癜)Sm bJ e_X qN6p0\>'ԲԱټ _bo |B? |3;oǖ^O 7<}g-+f5b2n!_*9e>&K|ooV>^ /xi_cKړ;MJ<xvtHtM|p'&_ޗHosޓH etpR L^T5*q5ƳTCEyiu2/Z9G2QOO 3oJ9O.eK:)0iS(El{S?_O _+ɴoľU?^ [|Gam:\ 4MCImr; }2MRί=żݭ>;/_=*[4]xRXy_|Enwĝ2vޖ kL&xF5XQM8QTU9ՕJnUR3pԦ87/h,|y4KCbrzJ<|F:3 S :bh $"(Mgz׃OWV17h᭗uOAx_ M=SP?^7+'_]j%SI>`Ԟ]+߁o?_~_x~5wS?7E-Y?|AcCk6ę>GD헌AUΙ:~ Af՚['0h+? %h他8%r+ e<AK%a9>[g+%(fO5j(q>d?<[^5xQoKumCڎ*E|g>(j i7Hh5Wڅowk%m\x_? Att ?|S4{)|}ڻ⦍o;tm zV6,mmOU w"\-.ڶ:|&pv/.p<]B{_>yMcq\#G0lq8z3f|#Qρ|A}|:ߍt"ixf_ҟt}7VmKRϊ􉎣|5j=G'#"ž"o^g!x-5/I׵o? Ik熯cke4Jk-[ 8r\Qf9728f3, xe|djg೜ ~.9_.X/dY^2|5ck=TC†]~3,,fF+.ɱ9U,4Ù}MZĿkσ< xFu x^/o^6ޕ__» _x+H5~Lx+@Jϡ6>te[+k;Wg W(q)Y^O./^}֧fYx(xNS\7S Yx/lǃ~ :b<)g|3ំ7O~9\֓'~7㟋~$<7?to\_XuJL⧋m7)׉][o jПђ~5o5_deL*ʸ9pUl#!qxwļMgN'`$hK+`rU< pjxL`xSw#/!:WWۨo- 8վë./Hm$N\\C2~ YQ2ڙ>YK,N XLs,UH'8֪x% תVꕽ*ME|Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh? |INbk}.+K} ~:umo.w4 >Lm2/?O{i^Gmq)s=ׂcO jֹYye\^ꚍΩ&euD[Ǝ$y1e~<|EcONmu_Ş տﴛS惨_rC77:tjmJZVvY!a5R8Tdcvf%}A@V%I5e 4?gӚw `mCVh'Ny#m.6&S<)W xyd__E&Ӯ4__/xYЮ/n#^h7bN{kib< 3%{ xDxo0VhG 3,bY1U0e /nA0?Y_R<]#g%\ڃjcs&M$L5{Ŷ A$jXDܩ- gJ>ʚQhZ߹ *GUnRէrW҄)SxOa<$iң}[ˇ'Vn~;+6Z=i_|5y;Z|LE̗Zw^K.Z7鿳cP{9{^&~/mc#|YIGΥߊ~5|COpvگ5 [P6]G,m,MjSe7F)B3tK %Hu/87 {Eec.ؼ.>5%ZbgBG,&CKjXV+XW$jIj hfÖZǻod; ]źuS?gt.V#+ksI4KZ40.tnxʴ3Jѩ,6G*MFF~”煡SœӒߌ1f1e LfB|&bL ѯNx4q?LE|.ż(⣀Տs|&u\Dּ+a7ş i~myi)΍gXi=ws6V~$|nj`//|🂵:7kLJ5YugĿx?X [m>)񭾇SKDկ! ciEayymqn&FjJQ0>IpVOFk{:nZ(oBTl\XiUʩХt+N \*ҡR,{e&Xz./dž-x/Z}xFy,k;Wxx|xn[ Ϗ|'-6Ws|B-wsk+436bBO)N TFэ<9*|M?)ڇVLY/O/o'M#^+a}}CQAΗk-BQGӬi]TtTV*8<. rӧB*T^N5NZwq3_ZuI84apflVfX|,-<W3B!Wj%׵ Mn-$? uk^3oƩkexcSuV%i#?h/Z֮Dgx7i ]k4~#RӠOF Nxw:aTQ΄QkٻFX*TRSR|>"pn+X'_*|]\&ⰵu29m|~^r0aZ5F^[kĚ/*$cyxW\ӕ,&u{'Lڬ6KO؊[lw|;x"iOn[_u52p|ZMWxC:뺎 .H\6>T0gR3d)Sq AW('dU[,s*>()xU,\+ʭ\E\? | ^o8T Kַ|U<|9ԗoF~:q>qcsnF[Vܺf5t,$᳷{x!Y?G k:Bz|J+$7_㉼+yi4oDX$(sb{DF ha0xR|TcJ8~gO`o}qb?,Z|aR[d9M*Rϥe:yS?{,9f /JHw}/^)ִo_T>A⮍x#[;}W~ >'wï_ASct6NQ`b-~˿~x+O«O5▩x^ ^}oM|b ]<+w ixfIuMCOSqu#Z2.Z* h>J1<1OcXBNzx>(֯Ya]:Y.I,#X|K՞7C|n"__|/O3|B։KikOx@ ɦ'ƗkKIJI[{ #<%__o<-CǶ64O~|?V=? V[:.hQ}4+(H5oS1#SةaNXEUFNoa)%RJTZO|\C fqK  Uo!24𼵨K ^TyUj1NYS1n8m\N)~3_H=bO{ #iSťV־ev]nCu?<૟-^O_ kQrOKeQL~VQ?6q5ʮ7ZrJrqjӍMҕN!(J\1NSɺ;ƽLF+NU*¥9*8,l%LeO PuVJ(J"leG,eZ/i>V:|oOYMҍt֙]m¾ %4q꺥!EE<A5I5RA<2(xT1r$Fdu# Je'g'tI~~'Cx4+7V/O<[Aew|/ďx_ tۻh,.>~,KQ'#>>7@]~D[^㏈~4< msiW3<+7GOhYv׈nYxg.8cxx%l).2%aY:42|XN#(ȪAg:9wfo |]?)k{aG⿋_>!xw~a >'w:,!h>x$mxwqEO:}C`)NU}/dX|O֫[[ęFxy[׫g3&| ίOL<9Tx6>'u~5T7?KLn"POuHumyuVEqT|5>%/ |cۻCīڧ fQ~,q%݆eeh7#‹7t+=7ïǞg*>u^> wWw|CUՠmW4_Wici]_Bshb8Kr 3ڹVSB ˓e\!(Q1X̗17qX Ey5mZڟŷCk )xi;v:%u?Kco֟MRNc_ ~J@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhh Z|Mw;'j-_56!}_QIFswq<_[  O]w6%!^i7V."M ZkO5}mᗎ_ߴIo5;E`n7MizI*%wNp[]JIlgu`qRpǞX\EDa*5#Q.g%w_V>h+||q?t_ h~!FwgE7axI״^ZY6r/,ڭ[v:~qzǟi8>|#Om_G)\iy_kKF:^/oVOšGV?c^u`֞ +FNnJ0bFO3r]8#0p3ن#'f4S]HQb(R*iq +BF'RO8d־~/Xx_pѼgo/m;MφAjZ:炼 7ú*x |Igς|w<+]߱Oi0nu 6߳wa94?l"K^\Y] ھ8j A`piJRt<6 7 Ewƍ㇫TZMcK%# vWkNV 8s1NT3LO,uqԲiG)g O j*g gRW~Ҿ=CFc-?I~ʾ/7ljzO㺛Q~to aXcVOm%,t^~!xn=W:&^#oy)ql;Sq,5OC1/Pu!KĪ\jVPQܛ|xOp2|Rx 7U],~VWG *G <}ckJy֜iď   g_~_FmX4|GIK+m?⯀(x o]3R\^gsp-E~d{ xA{|J~^|AW4mV1[;{C> }cQ ;K1#Lw4#7h$Юy0J1:JVQru*5(*kMƕHRh(>IO1|IU9,FeJ3r#x,$`40S1Q.)ҥG?\}wھksci-׾!!8*(aʶ# ㄌOk ua?CR\ؼL*èh|>I³Cr5|3ɪSȩUUx^x>]kQ<]3qPaEúsK.KPWW|;ĝ SyѼ}y_xG2\>:-n,ui5KuAqjRRƎ rЮ0>U0Ҟ[RQxJu,JU(u5- N8n_ÙVVVUC9⊸xNU^Pb:sc Jib~֥_o~? cW  R|m3Y wS|/E֏}IeNEGwӼQ|m,ug~С⿋(;;]֍CHz6Y_2Fya^N5*SUF%ZuNun59wf8"ˣ,fi-b'Gh5kc1]<ҫ18Œ0-uW;x7>bѮg^_-GxVTb] :81ԪO~Ɲ'߁~/w{msDŽ>$xO3O"?}-rV'ojAuo|K-gNmnBE5_|I4 .x3To+o>5VC5Ti~7a}*×qTfK<<_f?j|p_ֵ߲cAŞxVᗋ| gr۲MXƢxzKoOqi{qqtMGO^Pt^xɺXU`hF=hdUG;kFeK_Y )f>δlDCB epmS(7>$x7q Gk?w쭪h7to ^:MJ#{E+wfg&5mtfo~9񧈼 V-?|cn?'t_?1֝M;[,>3ij~1JkOUah*΄aiQO:tO(XX<:Iש Z%|kh3o_¿ "^]8u}I >&}v{+~bO{{ ~2Ms3U}k="ǚ?Z7-j^7⏀>/gC߅ҋ{[CKtVXC JJ2Q*Oҍ Uj)ʗ#G$\F2sJ<9RI!Y}uNN'B4rµE| < /T> j u]i6w ޣ$kGkVˌ0+U𐚭8'WT*P:}pVFUV3119 v*5a cɩ`0tkK6.1|cgbဣSxXe?H/Z78j4|msq/ :DžE[ |!]'š5[{#W#jlagٷK J#[|"cE:cy?uψϘƦ=p[MKΞ-6.*J<=F.'&UrUMN)|>Zq~Kʲe< rq(ͳό&ja#_*1V,- >( κWf}r.ÿdF=ƿqk pھ_|@6bt:\->| Ma~|8?/<3eFxWtMRo:]xZ 63[:⻟tRAPkYnI/pd ;)jeANA!N:W^ctqiSb?iIGU""8 eu`U~E?Ϯx+`_G|w^/"Wk{^xsP{bs ]? -㲜1ql>:CGG%Ⲯ XlF0֧`C;eR*>>>'?gO6|4][?h=f6s|%xj#$:C9M41\E-Q3C2,MRH$ȌUԕ`A"Xخ1kWb b2~mU./⼖+ Z(PMS|%QF4i[`?/_fmiZ?|+=^,>&\:|9j=2¶\^Oo >{ o$|7O߳_X%P?h_ïzw__B.]S>(G׿x#V[MIW=^*`upUx<\ )u^fhCYr/i̽$X((((((((((((((((((:Duv g"֥n_k@Ey %zEO |:a-'AN8=nh`M%q1Yٰ(cHtE j fÿYiMx:^ׅte#2XevaHAb0 N:č[ō^;Z-aTx3ҢG=#ƕ0hY\A>Os$sC4i,3D$R"HBQt!ԕe!A + (aG=?t_#B_I??ZuBݜz'At"kQյNEoubIҬΣZXY51;Iɨ9JM(&m$KV˧NjJթ8ӧNe:'6BNSҌbmliߵuρW V fM|(|kewhoHkYg@)zqjzVdt?z_Ï6=Z/ 8q}hm!LJZ|~R+dĺi}AR/B{:X5MO/XAA E^qQmQXyF'vgOƸ.#p+ Ҷiͨps0u1cFR[Ҕ&ZrR߰O\{ n!C%}bՓ+;M`6iC(W!59;O-WO c9{H {W| ]'.mmO=BK<1:uRa uhJQI>ZRK yX|:af9c3ڐ0jkEŦ{-g0)[ct&1܉O?_ k_3YY_A~_ uOVu[MSSI-BactMե:գ,\e:ׯ:RI7 Nx7۬mh~-\G˫gkblĕa9at'TR:>p79_gυk*_ۯ(ƿ.~x*kk]"jPŨ"^ [._ >|0?gRz~ w5MF6[ω_ O~[mJBĺ=cR&@cʜXڔjbB*|G<$jN1*u*Fj2R/E!&+;,癅 fYQ\M7՝*ngS SBU~οw~ Ǟ ^"mq<3$kxOH]|X;<&t]%tkŞ-5MGUwu? g_ _ <7}o[IgAԴB_m֛g^mWN顂N,mu(ṵdu؜Ejή*0ZVsJ*d|RI^RRcnT.$3l~/x118`^6#eƚ\ُ(֫ZXx1xź tMJ@n>k\yz&#Im=BO;w_'y/>ڎ5;ׄ<1;Ciï^xsDt{j-SOԣ'{俲YŴ2'?RӌJs*E9QJPNTJM^~I_sl׳<-:05~ rv*֡ʦ큩8aw]~E㟇%о;_nj> /oO xt9W.[ -[8?j|{B,^g?; | էc_ï=̺&mt]|xnHmZO2>s6Z̫J406[f41  ` e^q^ PR*؜v]Bg_N"f.O3JDg1t5O, +G ,e5J%uQP_ |9x_>x[ScεQ_5j6oM+-j'vwL|Bêya<|a/?7?!X5#oW4 ?MI֡"ԬocI%Gw؞oS87[.8{7ɲ!ܯ8k28\#m 0¤SX7o[[W5̪q9|eLv*xٖUeC0WZ:V\*VH|9?f/woGo9Awl-;kXgel㾽 m^+bKˤn%sx%CKo^/|wx_<9+t wTGtxo G#=QRo,5-̰OM0?<}xs"4*-X֯C𗅵?M֟=KVԵ4h^]_j閲_42g#?}O<kx' 7h:6wvQ c,M<8*.˳lV"4Y7&X41WⲪxSVl 1GQR&mOQ EntPv-w9`_?|tO/࿃.lyꚎt ilu9|shTlհ{Ynݴ|GpaCC et1غ8\4UᄍHP<05|B9f8'u=tgZOí[VҖ.LwG(Vimi0HâoO_Ʋ|=/|J s ;ط..'M'7%L~:ʶ7VU8וLEiʴh*JۨI)SSmAf&jkEfPSkc3|WO8R"sCRwR8i3(<+{k z7htW~ЯMKBf4Ӵ]+MYqcj"ޮiJR4+&3nɷ&۲rݳƩZgVJ Q9M2:ҌyRVY%dT97{ _ xCuxQ19l4c?^i!׎izQ5y/5&vGTl+;;Q4B+;; KYH.mn`ḷ)wDdbϿ c'Wot9)o+#/׼##U}.{=ͥv ,UK<5ücYu 8n+2^!򬗉x׆9VCP N&ifT14G^0UZA:_%&4O wGּkyiWM3O<[Xih&--aׯ,[m.U{m: ]-%|b\1=ϋ/[RUO^$&^GA/}*MfIQkGw2f'_Ŵ)E p.2gyr ÐO8 :T1N01E ~x3¯<{x/ЖK.exYI$8$OxKš&?h/ͦx_4]6ZMƏbf?[Khɴ5Oe{[KVDc,NJx8cqy繦+2r19ac?+**egNU*\f_jTAwIMGҴ]:[KPI4)/WX{[8a5]NQԮZ35q˰E`h,<-o>Cca CoKs?c^㎟m*w| ݋}M פzFQMVGԼQQHt&LѭS(((((((((((((((((((:Duv g"֥n_k@E|RH'"G>_ CYYkĸ|Qh8s _3^+iE<;k ,^[/0xoH|i|9x߈2'|oxcQ1uϥA>~:/]xT/[O _qˠ&jVrǦ O <13-iƋ+kL7Y㇃n<7x>վ$7kbimk xzXQxE t(JtiN:WQiUy{^kK区rq,5px\ eLFp/ʱeL]f1ah8GBYeQʰu+Q+}S2?/Aq~^-ogƞ4Kx5wZw{>Ea/a^|tU"Ok'OaZD4k ԼI :}mK7!jw:ehVYJ3WaOOR10hBXYSJP#?zt<ԫ`xg;3LpKJxTx3"1[%<7,pIaS p_lR?E|'=凌G~-O:.5 m_ZCa)b-o'Ubk"tMsᧃu [_i?k-ZIBOO+ehwIA+7ԛ9NV{^$oeSWTӒW,TRJRQKY3ct>z|9x_X{tr}:Iwk{jO),$PR;?#oQ&i.vW7&{;S@BdFOi7x ԣ['\?BIa#[<)aSX5 N964bU)Js*ByO_ LgMzg؇I?vq6 +/L)N̷W_ 3ߍ?NWϊc>!K}ΛPy'|ocxI}FxD./*ЯWٶY.'? 3Zd~7jg \{S,ke qgYU)p# dYZN\ds h}xw_{K|:Wyxwe >(|X ?i|=xL ߂_(xQ/OƯ~ZSV kV_z_~ںw?=#޽k&#x`ğ|@Nk{x~΁mC]/MTwlۍ pF3 y P~}xw&a/.ϋpʢ<e?r0Ͱy}srixgߋZ?{~ |iuHEݧW|Y-Ag|Qż9|UJS 9 É%X!6]6' Xs ni |sׁ1xS'+w> X[>>hZjwZL>?|ID']6my|$'.m3i2N;s~S_~# |ioiOGm?R࿋|}). yh.lGn4mX.XL+>βo%|5O9n4>UCU𜚴/ Rm:PP|6PXip[m;ɵ' Ku&;[BDžsǮKx[xczI'A?x@ |+>wvOYHumztZ]</<̕qBƬi[i8իջ9U98ŨD:+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@W"#sxz#[V^݌i gW.`h.OY'W5|i?ėvz^Wm;LKUH~vE m(ITW־/|4M{WkI|,r[{tӗI9 ݻOOO?Py( ķQ &d%0r΁oLVI.bm^Xe,ְ Ě]αr2>u#iw!-VRLKxCJ_?kzflF jIWE]+M(i]VmWi_V09Ւ#9FKrU&~) C֕SQ<]G^|ďk05hW&QYQD:on~å\tt.Nwşf%"=JE`tOxS^״D;xJ|_iXNz>d6$3OFU*q*j2m>j1F2qgFsN0)&b(P>[[0˫bbJT(cXN,xeׯ УZj+E zi>ޑkt\[i>g6_yjy6vO'#! \b(*Q۲_6˥NjҋZ:pVNJ0&J ˜o]kQGSoh#_uk] F ThC1y-*s2[2NXO TP1njQШS <_x ž$u$-T'i M7EѬ5;綰mlimqs(M$jA^ScJ]iw5F&=:էFIέYSrj)rJi+ݴ79"^)bI` "B, x'᧎įi^2߀6Ŀo _DKxkv)Y9_ jfe֣E#j:\yR\orZn ϛK _~:Y&~օ7Rrjs/e*&_uWǿ ?ҵKO^Zu_H}ƣq{h_׼5yjqYkn4))Bt੹ZN{8GbiW8oͥPBhVéa0Ϊ+<_VJU)WçixG~ ??>344!`-NG_PFhcx◁~&lx'[Y>oH4f,At8\Gn- ދ C캕՜ PR/Iڣ|х3MYn5U`gSuhJ~ڕUQNkҍFk$e(Q+-M5}JoiUޥq7ecWSyPG,PE#p$lqSN0(*^RiE]Jc7/McÞm|]_F·mƳ4 kQOnk.yRZZ{ho-}ߵ7/2|9?hpxJ>"T?>|SxKfxHj۴uF!hVZ!^4>|AkNjL.9A9b1K/YĨν xWV*YTb"6״RyUHENr9e?ޙTx4{}FJŸ?u]OA[[xSLxx5)˰nG𗀼)g<ƞ*ԼkۍGTsڬ6ΖvM&hZ^z~ٮUqr!rձ, (էGb1X,DfV0Jn5iԄtR*q(XFK՚ѦvWXQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhh4]+× ?&PoR߇>!xcZz5ɦYEmi&}sjuI:j[w = ( |gϩky> ?ھT [Ni.2ult߁ R᭪^ qx{J!\ѼSsGctOV-}yk%+}cN-#;"4SCcU {vz~q%ckw e&@ (a:N'}|߳jMN?OGjke&\|+Lv-oz_oYvG{[n I`N((;5ҍjzї%Z3Jse8IJ2viM!~? me?Ÿz/Olu]C5x> =\Zͯ3k֘MGy_g[ ׎ֿhm+ǿ6s{o7d|5CEvx7mwR{z7jwfTpj9b^J}kJ8NΫ(%),=FSN=RgU,=  0˹k O51f8ζ=ЧNXxӫ WU C-4 x>׼+t}#Q|k⧈> ~a|aI(ϊku}Ͽ> |3_<{.˾|+\dG>'x*o^mcO~S׋3_>?#> A<]xE>em6u2?du&Z:GG>[W^yim::į|y'w 5 j wCC|g-mU}3P&Ŵ >4'7e=S__4~,>TE<-iZoZ'J5wͨQw'F ?ٳt߲VGoi3u_ kN@o u/ 'h ᷛ)|cu#_ ’=OA'|/=W?>x V,u4i~%VZ|HᏂ?,|?F?·x>)=ox@t.}=;^k D7ɠд]FINkJ=rGAᆁ௉?u/|  xgu[~$>Ͼ1_U~|/s&CwM+u[S> il[HJtܿ(C2Ԃ.jiSXIU*V)IMSe~eakaqG,&U|-džqxcUX <ͧ7 c8RjNbC?g|Qu_Neׇ) c2<5I\|)&m3!4~ǿ0] _smxlO>inN4ˍZA6yTXT1qWFӭC^Rƥ St%iF|sceZhx./.xL&?-^gG20 4qYf L& AF,=~94υZeq{/ K㘗eƞ)ZͫKO^|RӚm]ǏMv%~w쯠wgm#ßT}z߆u=^ L?û)o#o p 7 gCx¾|C#!hZotV<E?U߼:a1y4O<=Z|;V_ٶ[SpeYzƕZXL g!UPFPGm: S,f7%p^-h>"Ixoh|oO,ox_O);_'[ tk k'Dz^7ns~⇂%Mkoßeec>[YiՐf]jZ}Ɨ:-& HԬ]VԴ[6I0.q<T+hp+a10,FѫQUR9;095%7;N2h7 ZQNJN1iZ-+ZE|yPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(˼{?u/ hNJ}'KKR cZ!5ch0jp ]2P n K8j!'>n [K{^>#!K[X,^yBiӪ(kߊП xs>7}xD{O ZO-ڔ>0Gn^;i2:J3Wy-Y&0t kK|Bm"HoWLAi{ηqmZ_\NHSM'Rqrvrri6oVӣ:0i1Xl%9SLMzT!:Ɣ%VjIF3a+ɨɨ[o6?|;[K>x;DŽvsĚF="+<Fx| V׺Ǐt~öNt< J5W|CMkޡᯋOƛ 6O4 +Vk[xZ$VB]OLլo4z/djRQWR;TTcV1tU9өYPP*<Ԣ caj8; ΦZ|s ٤qԱi\F5N.`ΟRZIM?BZּ!O I:25|)h퟈ңVRHlQK]WG#߃O{/~ ,K;C-#JKtwֱh%VԚmAh$ Wxsⷁ|C\gh:μ<9:2izvs}usA(ho7ß<!^֩5_xkS!M"BkMJ9xb3:C,."WB! ꛥ98%eFM&vEkdys쪸V]SRiUF UԜa()Uψ:x0jxC?xG2@mVTa&u[%j~.4mJK)ol?lًo|Q#o3\X{χjLe/- N-ag]XjT*՛FTU9Uty(C5uծ:hu`f;~_ k0蚷> xźNoO&iKiZe[஫@Ə_~?NS|;^rx({X$i%ZN^6&ݵz|C=ޑ-KPk--Ikeݭl~ BJ)Iҋn׽-RwJI=7NZ/ <"Xz94IPju!+5gxJO3ᗀƍ֖^_&x &?F[%i?u ۍV 佖x{.#`x\~Sp?McccR+Ȱ1Ub8T -Zqt*ӣK'oKs_"|Í3Dg/R|8ǭIx_~(44-G~6K֙6yiMx O>lw_k׆-7No[[N5E:j> |qI7H/Vq7ĿǫiϪ[?v"6ڥ"7$k,ߎg|)̼9㌿$~!Mp(p} =WrmifeX<¾VcO':G37>.h?oG潷#ⷀ/e[}Fx^~wHobյ+G97`oƯu=kE}kᗎ Z.-'<=D%<;kV&}uiZ7.}763O^F?or+35˰5'A|X4>,>;χK&ѵޱCk H?)m.C)0w>2%мY-xoI4֟-kNֵfנGmkyqv%}N*gv#yZ8yO4o[ K04~c%+t0Z++D燼54-ږkP_䚆^ajڽ_j%y,7sM3 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@^д ľ6^"BԼ [^Cy x^[B=14okj3,4'>ӥzn gG 6,^mz?߇OA𥦝/5/m 6sxoV^+loKa%#ӭâ#ˣMwulGў(<7v6e/H{ 'mUbƑgN ]l@PY0ǍwQ'E6UW;}?}\֪CmAoYA_[zN W1w^kkihqe}mowm$SiM4N5iSOfT':sJs' )Bp(QZqzi+G?|;Ww2[㾇MO? ,kС$5ExPukB']vQӒ3:O^MWOKf/Bǽj:.u+|0n Km}ׁ oEk d#OF^U*0[𞍦Z뚇uXqSj <[7u|H/oÐXWt7l ii7'xooz_|E|?Cf՟|_z;5.u;ˍJ~&f+e|(;{.xߏ~i#m >T>o-O:G<5z&%Eu9g?~+0>7U{_z_xwƇj__ ᎋu>vwz?|# #$~>mE]-yt,=\.. d,JUiիz-S@|i.-Ē:hKGYbTm($Z;XTK=:sj%N9T}?iN1ԔHөsj'6i`ၯ`_S &> M|,x&pWO,_=F?NּuX+Cw0Coq}P[[[Mwx,ASMDxN|7ᯄ4K;KGG27o%7?|WI.^ ԭ[e̱߽ݼ^CmVVZE|:s9Nm$99I)6QJ+]Ihjz^>XNk=vvesCsg}euv;E=I $H?=ӟ 9po_ ׾%x_Zk/P'Sub[;53]5ik[ZIpV<[UeQf5#S<i8o&"1*x3FXZ=*rW$ĿǎO~M+ |W<s+KAԴO^.-MZ#/4/z"B_DS/X%~~!j?~kmx?^'<%s Gž/M3񾫯$Em^GsXq~ej:3Ǹ\#W ᔳ|7 /snVd bio0r v#|1x_|< uIc׵fZ|:LơDFfΰA@{şك߁z¿xW^Ռ=}_u_藚\|8i{?F?^'7#Xkk\v+6 X6kCx-f]ar'. x*Y-qxLV3VMOªK |s?>"xx>_ C_ׇSvzI i&jgg{Ffu4m_]?x?g?/=7t3/BYO뺟ʿeچ ŭ3gKm//p Pfgjp]|FxWg9O~U0sy|x?N%yvW˰5jeq~)]֧xD|9yq#Cm/j6Q{6Xz~NEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<Kw~Nu|;j:Es6> &f9RQnX{L/"{,#7Ko}S:} þmc@/ό|7׼S ŝc:V?45(/Oj5Ycխt.6jͯڷAoBo_"ֽ~;]|,~$NÚvLƛq;9ApjiTĪʔ)ҕYaUb%]k?o$58N!kbzyl2UPe̖QK֮g(ӯ,t&' C MbeUB:=?i!#x\4x><7tWBOkq>%ܑkɠxG{ZK㏏ ~K X6^,|9j gJ>úx(t RG5](>o>8W{5J'VT#8StNUZQU'ILk:=e jaԣ:U3tS W(ƞ*凩BQ¬RXؿ>A/K'߇ZqjwCW/H''|1ݖjVEֹf=<3=7Xω?E)_Ǎ4|6Woڦ+Be᫨<;E>!'Χɼi 9o_Gc|:Q:xVW/"/ov>-R'g?-+=oOkya /ԆSSGQMLU W5#oQF)9գWPFN㈡*RqF9eLe4Q>y,-h"wo2G:L4VzEW^o"h h|c⇀<[Yд4{w5+vHn|a4sKצBԟj~Қ/ʢܚ*r759F/yax0u Y] o1-F]S zT(PxobjREZtGㆃß.S|^oG-^):|'G4 Cw fV% 6SP͉҅g&|I[=G[Lׅۍqi(ޗWI7ڞƄ|Vjd򄹔~kYgy4e1{*pp{8ϞZYez]hjֆe=ҕG7,׎&io.n [H5MSin3J%Im]gSl &xrZ4v oxKu ([xWö?h2~<_ >VcM{UѼ7;?W^Ӽe/"]TO /i+sogwxw<{i/ ]3ģ OuM?fA&,柘+➧x{|ExM𿉼P'Vx`FKk+4^Tiswyښ~ɡkQ@6~bVtm ?x_7o1}Fό4Ƿ>jƇɩc3i^&]IY^jmkq.}f>}a;i~Q|=C'o'I/Exַ}Z#V爬um+TtZK\4qi]aRQAj5j(S:5**JS]We9E^het1tO \&_S㹫B*%d⇅|G˯.o|'b|Q<_4/ x^g?[j>>7д+OtۍVO'msxV#/o~ 1T5?gſO "/Ei~'uz0 qVJJtR=G,5e9Ы*7Zu(9*^Qaq8<5C> g4??ωc{+Ə7[>E!oV̾l?Ŷt%(uR8`pZ50U)Pcƕ(aat`?;ĹjTO:C`1<9e|FQ`1\>Q,Rxom_nkOıB?m/[ x &Meƺ|ķ"ZwKI/=mm4{_>|iĿ -Yoꟴߌ><{χ.|5w/_[߅_/?\hiUմv˧I ~?gmKү߆o5 Yo~#C-KÚO4kV,xSOn2\[ǁ-tK-2l=*50h֫^xr7Z5ҢZ5b)Iu?heRprI(Ο&WX<Գ nkϰyKrf5uؼRo 20UWZka_xᆻϏ-x\k^5-[¾##Ni[P4_R_k:,PEkdTGw.*bQYv8I )8 `.i{:s4RpF.I9%'+)$j&ϳ:8?kL#? Vxl0hBXFUB┟9^oK hmkC5OxoO\LǥZgOXKEY7jO yq!E0.:4{JoI>q{mbt_n%;uvJ}J[Xnm^k0.k/O>\,47z|95^6> |7.U 4 Y]BmNO _ɱ?Kȸ*sJv No. ˱WK0\;tb18c(ba||A6|u%w<\7S{]_2󯁞3C埇?jkljׁC¿ Sǯh?.eُѮ]i>luQ[S}by4 6W6žAh2AiRΤUW3µxˈ2q+oIمzxglЧVq'.O(a5P w/o3ĺF/k_ |i/78RQ־ xR?ZDZOV_O{߈V Ե {o~R1>cڣ[USkO"FH/%MVI 3>O Yq?/2\)N/?Li&Ωӆ!ٞ&qe]|li}^M^5[9̾?xm$5JxO×=~ Z qa=熼I ^h~*?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x={I'{Q_tx^ԙ!Ӭ|G?.a*Z:jy:.Y5KNsŽsᶩ}s5'wSz4V 5 5{{k{{LnK-/GuXO?z?ھ׮kW|Ws iwtKM{^-Mu[{_ ?k-m]Y&sXciQ_iPIt%Rj7rMA)4i]KV7 KRT1aFU"3NӂjM\?hȾ|":|6s}O۾ 1nj<% %GEծ~XUc}WUԼ% ^X-˦jr=o {?hߎ6Ú/-[~<Ti>0yx#SNưf)*2"XK oocP^UcRgJ3P ռ 2f5 W%y?QC >/EΥ;ץ4iWXS úG U*R<랇2tW.iWT,kBY,&C7NSJ#)xxts n)|AC.6vsx3P]˸_V`637?lh?? -M7HWO\^ Oj-t\t>|==FO_|Q T[-Lg T͉Il*ag^,4ү[1a8e0ѫ^ZkW_?> ɦ4Ooa \eޙn>7|\L5{XAx^ٍޥ yT~ _« [_ψ[PmZ.^Zй~3q 4kHKj$.yC8օ%U,b)QLDa<k{J5FBa9Gp:Rdt3( jp41Y 8,d*fueVs˲}>&>(B|F>7~ 1^u g&xj ~=x|?ox |+}{\u 7ZWtߊGKE\k ./Wk~ |)?Ei>#M Ŀy7U{[U//u-,;e(TxsӟRLgRlR5HԣORH_IWêt2|V*YaTxv9w#C<o~6OkEd?ߊ~ d0=dž4FLjm5oH&G?iF?|.o¾%𯂧WׅI ^<<%ag4^"KhxwYoo_,\*J>?g:XխNUL*QG5儫7J%:m9}#Jq_,e(X9/oO3ciq]:xa#5ot> |QWׂ6? ,{OlJ ִ>%_])ђJX?Gh(MSZ/G>k@nk><5=hixJ{M{úƯqwiwv}NpK%L,K̩,n j1RIrSZq I)KI+>8^7|!? _| Cx?V7OVӯSaWs43Zѵ{-m,]ZOZ/i8|FL#⯎x]>. |&OƇoj>mkTo?(c,ʥ>YQ[(a^L߈0|EpժygS O5<q1xz_ړ t}k\ ||%{/ֺ`u3/Ս֯/OYѼ'Tc֡Ҵ}Z}x0|:x Lo}>(hK&=?QĨxB4kn/ s8#\I¸ "kuEzx:W*P\f몙9-b/큣mWOO 5τz7QxŖ |Sx?zw jzj]xL e ךr#xq||D0YNWeot4~-o7ōvo[ZÚ-?/ǧT|/W%cas`-QAj|L4Kcj>O~"HClqjko+G牯Y!]S/oq7e9O OG#,ËR㚫.3 ).3|Ra2AXU\"1|~ |)c ᯊ[6X_/ށ'߂oxO].΁}[zZVG13ukSKᏂi1;6=*~ִ7YƛISAjOP6Z'4-^SaԞJ'UuTVQ ugE^BRJۤ}&q|>QU2OqXJ+RcckSR_Q~Vq<)Ƒ^7(A_~2ͬ{g_a!xKW_ Qx-g/xkK=7J~9;Ɵ <¿xş 5M?῎O??yk.}IJqpq-fk8Օ,eLTq|F=b8҇τUjV7х.1qn8cjsVsO*y6xL>_#70iKߵ<)QC~%~^ M[`Ҿ<|>/'|>0d񍏈<Z-/xV5n Ƨj&- NmR"9φ~$[V~[/Pho13K4n~$k8еmR LKf:xFTѝJo0 W(эyף(**Z*p%(TtC+rf`urƺ԰T3Jٖ_W8v*LL3]eQU|>/\N<Ik7񖱡D/_1BSj[x/a?#ƾ!X:vhz>ե~5]+s߄~W,|q[svtfil)6\k~ +]>#xO ¾7 BuiSùʜ*U#Zt=7*ty1OSJS+lj2rW1L$0fX-J\gAf,Nj،.ўdz_gOߊ :ڥi$.t kO{? r\vv߳G.SS>,cǧE #sx#H/|auL3e|y]oS LÏ1a#SBP_\pz9+NXhuaKURս?g8"NAS(ԣҖ&U:^'1O5h^&1 eqZ'ĿY|Z6H ēZU|\O__~4'Oïsß~>/|kgݽĚ~;'fՇf6 n9{3J4tc*u) '›*GSJ^WINTӕ)Qq]ja1JW.KZ?[G)ü~2X[oS|upU@?d~RT{P}d> Ii~/kY̷:jT}[JK߳3S)b&ȹxc1 B#hR>c3Cjճjs_?ͥOG Mq'8K*0^&efg(bj`h|;~>ֵ>Cs Y_yд gN}m/:ŬoW񟋬_CgzzA?RxZ5uZ][~|?fֺ5t񦓭1K2Mp [5o/p^;̱l.gZ(x,&1f8L&a'f5 ÇRcU*`|Jxz˗:[0KM?knj?m_'|c>o-{Tӵ-SGϊuj:tkKռ5e{S_I5A?V|Qj^N~3x"vsYxRqOuΙ? $ò[<]+s׈~u`Lc2_ bpYn/^e֭fe}^O a>'7en8@o]xw:7|?&Ew4}:]?RYcj*Ai[i_R¾!𾛦xo3 Zo~lΌ|aԴ {D;'˚-G[УUN|A\̀+;| F6W KtJktmH-'ǫڎn,N-GQ.k`@h"sSxJ wG[uO0/-akˆ4'kt}9d/LQᖓ_xYd ZZ״K/>ĚKXCΫcYï-eq~%Hh ɆL뺌^nvi:,Oo5~7y;<]?G}yx~#\xkK}+%HK 5O<~+g? ƣKYj㏃Attj G;. iP|+|EWE_|_֞.Ǟ)7uM?ú+?ӵ/|9os ]ϲ+a}p b+O.KBYhSHB8r~Fc_?>#o?|P!OxJL1{@/⋏;VG7Q5 x _5{ K\mnx?Q "Wÿ>?i/|l4het1T̪epbS˩WOSŸP+_ |%ƷW_ߴW=/෎xO?V|\/ƿ?i )¶Z/k?|M4OT?Dז=cŦhfMcУJING,R|CM_w[u q7| ᯃ|DӾ!ޥ)CKw~(>slj ~$|Nо-[G>3WkhWZ'];>? iԵ? -'o<o>ߋ4<vS?s>:<)/Z-S^]2NQSGQjpէ:vTc77Qj3+RbLeak.x#K=JbS^taQq1pW.<96wAW7z >aHI[? xKG@:[Z( }j?įw=xg-X/"~'4?`Ѿjc5֍I _|+}׊lu jƛedx Y,N[Vdk}OFtpPnt*(1iʂ?_%/? 4_x w_O;KX|+ӵe| 9fѼGoBOi(M%:ƸO~kÿX5=k}+፭EnVi荶mVA𗅛H6jmMCq hn23W/:C ϊQ9sP$aYF*6Xe\D*bNL#C'lkO BgFVm'#Ÿx~ߊOK)xǀ^+{rF| ࿇?x/oG+_|OI.h MnQmK.V:+Tl4'k9Ս_௎-g5UOgI߳gkK{?ǂNwK|wq?xWĚ׃+mjj/)oڃ_ |5> #㎕|R{]z_:eKZ# omanx5=_L *j%*)bF.Y}5VjTNqEJ jn5fs|U 2xV2T ac ~}[SYG*X[6~3|4~~ ҵm#h:[_|:ss=^?V'O4#zįڄM[%ƭoӿ{/[_c>7:G [>_^.<JGd-}w.?nd da{eIμ4gTQSTMbf(VQJ:mY*QeuP_8N'1ZOG%\pp|<_Żď:V\Ïi:.hwzO?xQw,5)Mz N&0xjKЫc+pҖYi`"+ i# eJJ+P<[!,#C}{|#?]]"\4now.%ݦf/)/|QY?g~o4.iυW}^ѧ׵MYg/-ϊn?xtDg 5iF}cYѶڱQ|1_Zͮ|FL)q_*g#d[5{u[ 8T9C ' e9㈩*^iUqNCܼ9ω`šxE+Y?|_dXxVًƩdޓG#şSխLjuOQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh2վ%izt9,ONZ j~_Ie:Vq6X\NbJ M}k xsŚG&狼?/!ռE:݆W%+ %ݍ̳fg þ}g-/ʫ#z<%]ZF@$ݪ>J5RTq4֝Z|\aVRXҝc8O|%ЧƞW]|EijL~_|%:k,s^d, ]VPï |?{ś xmѵ+ x+["Nl<7zQn5\jI.HF,%)SļM:#g)Q:~o*n\8Fr\6s< ¼WtQ̅*| 6uYΗԩVku_YOx>"|A>.Yx[Yѭ&m_A-5f8,v+?6f3?Mb^~!^$ x_|5~:=K_ f!5oh<2v/բֵ<{ƥ,"qAf:pҧR3T7*5}_R -ORl+B,~[/|n3<>,CO pՅ/3J1ጯex8j3ohz|տh? )3֦9k_|Sxk,[]Ǵs=pU{g?h?us}7ǚx'᷃! M~My]uCkW̔'ZPFcMaZ)}f$91+g_.cC C.TcqG,0(kf/@uٽD8.+ 2|KF9eweŃ}g4R5r2OKEWRN?ï<ſ j7sL<C- jH5W׈Eqei@՟g+\Zx3>GǛ4CWLJ[P]6~/BֵQf^KK⥘[, BUUSKFTe<Լ/σ? -GT&t uzvӼ#X,#x]tAľ-KK H5O_s[w1vvZ50JtРYU:j JQMǟ *NzJiyrxbⰙ~YxX\,qjna81XqXC^/?<1w߈oo0⯎_h>mv^l_ |5%o>Zm[Zq[CFGSώ~-k_>{>/o.gF>0 aՇ|gV9|7xZUgUF?[Yk,k(pR%I(V=:<^jnMާ-ZʯdxMbG$hƭZQG ٭W:eO3y.u0O챹,gx;~ C7↭;%|koO XDd<ci7$xBĚgVE?nt.|c⟋~߉^4^]um{O Mᧂ-džusRլu-[γs: KYH8IT,&~4J>"|N9TxmVN 7.Z\TquYC'Af>/ͫLUl*Yq,>/,F!ձȞ&~,bT|1|wᮋ}qYh>;Wgյb=uwkB-=kU{o/3wό7`1ı|L~[xP|T~O%|4𧄵ƍc?/[چ}7^oK3JR)ѕZ-(J9B"oFUתNj5*§el![%Ȱul~](ƍ,.[.jd渜DRY^Z:Y:l1 +Ş9Tkcٟǟ|T~.D^Ï|"oZj~$J:*_տa?iE~O k#W1UOQ}xOzZk^m? 5-Ƨkcuu|s\h.MK??eQ{8(4-?R-W']oU rG/KfO<ҵLifyie]qT ε _f5wQԯ3|1w)RgXvUN8ZXL8cNՃ?[s:*r]֭W恪>%Sa+kK-mkgo<4;e5>1gQK&gc1/6[Oυ6~W3^E>>կx|/e))4}Wh V~~|뛛Өi3x%Gm"?4<}/sh^wW}k^+׼/,+=^[m"wZi6>nSF4~[}cNŵPDPaP/g[kI%QJY]:z (cƻc~y|*_o+?pO>z?ھ׮kQ@y > Es]r]]vz]Ah5;Hu&)}[Úv dx&_e nenXbl]؜,hW"'JTkJ4Tjl(i_)ៃ?Eű?ګZ]xfJԼ;Lfg4ZfSIϏׂ&\_|z,x>-uƟ1F9l=cY׉5O'B񇇴'Z?8^#+xGf[W n]tp2Y5Á3_ʭ|fu!Gm|3?/o(xOƯ^%I}.xoo>k:΃{sjTmW^4 j~_!t}[:UN侳&N;ͱQGÙ^")%9dxIf3l eynK֗<#`p|z%l >)/~.7 x>8>O%:Χ1XxGѬ >3|F>O~ |Dy7~$ x>3|M9t?#^(ͤ62hZ AcĞ;r#J>f F{i{&Aqw;qh8 *K"k0<+Uk SRŠCC>0𦣣uO-9,Xj~7|+\x_&6xoڦ:\YΓqMZ DۣʊĴxg*>38LކMq ,׆|3(yrI?*<,V;2ln>G~מ$_Bo,]WuZY]Ch1jz}항s%e^~Ҽ|A(Dŧ6VJH,4:%pH"(َY1$iWQ@b[V_.C}9p& [1f{면뇚=.Xn(__ς 语h7vյ:N^EQKF?G_ / V]Ɨ~o(^`wr ~&z_YSu{{eOƛE$z\~/#M&8Ɲv9aÙN$3 S:19fSaNa,>'X^7!}[S1lez101YQѧV!z]g^Kqˏx;Zy&k07_xmF}Um+O6Z/+C' ƞ |ki~&ό~$@ ⎅Ut,KS|c^xRM>oͦMo|A1t!,CxF`jprIG"R܉%\Yo &K.Q‡COٻ|3aMÚ݅?&][><"^!_M]I^&׼7MgYtXm>1~(/ ig[uy6]3ÖkoMzini+5ׇXζi,4Tq1y~UepcW2. *`KeXl&,|.a,,t{WQ|v> 񟆿j_VtckhM#5o ]iֶlZuy<=y@Ow oCx cMIb|A+|@|0Ҵ iQSS<6^{1Wd|9q>.{ <>8'✩atx,e03-e-3=h4|'8omqel>saU,7p] .3P[ d`y_ djeKw91RK)NsQѰ~ 9վ4^>5ߌ<]xY/Xu-j;|_O}'BPB0^ȦZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=_K]SOO]w~$-];Be_K𵼚ƣ$/0YI=n'+ x't:Zǃ*֞K2Z]¥OtiaF/ I%~/OC|5ƾ0|_xĖ%u>"YxkOYMvv3HW3q? ^ ΁-moH]6m%4񗕝,h( ɆL뺌^nvi:,Oo5~7y;<]?G}WWwmS7~ ͵|sC{9>\m o>(<xZ&.S+hZ&G̓VV3mB/M5O~_Z~o 'Ֆ~\~=|&m躧 Ic |=V0#k^&e\=pL.} [FzY>:|oOIc⏆o<oJ-;Sk SxSQn}aCS|G%xuuF fK{q!6Ix~$0M}Q1U^ Fxᯀ>(Lg+ڣ7K O_~":e->}S&hӡmcNo~sExXx>|>>)i>0~~⿄6V+o#y^Sb3O7x> è_x Z炵?h|}#ßx~ռiku>kK>7xdbH, x>4| E⏎rxC-W5ah'Ӯd, x?u'V]?CRMc[xdpL<G=g8~/g_39'`G;oi^8oS }o=G07VbaY>o+,4ub:.Ok4)aiOХy#\((((((((((((((((((((((((((( Zo?DGWh_-j_P|@_G\|Tívot hS4"_Nj[ 4WDQJ^Ӿ*i r%l> Y.Bӥ89k8$8-h5TX@8xSN7M/_cI/xž!Is;)V5ojBI״i}`ol}Oº44?5kixc?<"=sڟcMpUդ~yLόQI||76!f\8209OgԨdIdXڸlz4qs G_09wOxR薶n ^4+t_ ۻ$Э,`imj?Z$D|!!MqluNJ-J^[;M6݂kp.2͸Yvq~$8jei9eRϩazXciM)RMI|;5aIb|j!59<=ƶ$𿆖2ksW[ /_|a=K^-+>t_xoWgx;[5DŽt KúuhiwVrO4d+U~:, |/..o<[ xOI5i.qwZi3vWRϧg+=1ƽO? hxS -5Ƨ7x+^%Ԯn4 iV%T]h$l 9>!0a9 :xg>!K+ZjG%mo\F//ӝns㧉SxH_ j_įætv]'g4a-͝ιvZ[[ey5k_.u,tMs⭜n4KV$vڬZM%-"ӯ̈́kk/k+O'ਁ~7K]v7A SIb8%YD"lDPY0ǍwQ'E6UW;}?}\֢ |}m?fZt_̿a{h{ Fn5ݭ&mKC I,8%++9]T+,a3 2,E'yaoksS<%jů|wgcx|#/ ]|IgךR嶉LJ<i;xCs,ἇw%K0xn/Tb|m[|!N[Ř|pg9asqUu _LC#>356ΕG߄*՗>4ꯀZe^/ƭoSW'ǿ ɨJ,xDԴrI$+pt^x29^c̾#v?U,?`'FoO9w fqP3U8_*#/rq\]93 1gZA|!Ꮕ>6-lj|y[bx-K]'OKK^\roxOžt/x񧃼Qg7~Bh7^[OgiW0 Ό1f|1fxN8~*.i)ƔjW(ӍIԚ[NJ)'&(((((((((((((((((((((((((((( Zo?DGWh_-j_Pwz՗7c9}CY --l,⸼5Kh忹_|Og'%c>0NGRf<뺝`go5{H4y&9nGU Ə%}6{=GO c~7N On_hiĒja{]4mgJkvʳZ]F[A"$l:2`@ү( ķQ &d%0r΁oLVI.bm^Xe,ְ Ě]αW//oOuhV.qz, @u;Ú<Kk:d;gq)/L~ ,JT+Z|=/kZtBҭJt~j7?iZE _ǖZM-|#yizk|W5?hIt#:AZzF}.-E|b{?5WZc.[GCScL>Mgh:Εp," -kxp~7&˰tqLNx -,'xO:ؚٳvV(׆.4X>Gl<3x{I"^?Oo[(o?<[xM˫i4i n3^}O.NZ~Z m6mi}Ne-̦]%w_Y&*Ys[e<˱tٖ)^[j`'tiNHVPxW6MNPluV\n j-Zr麵ƕ IaF,~Eɵg4x7JD4m#DZڦķRi5 FP.y~,~cqY~:֞ITUSMքR+VRq}$@ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=o&kxr<'=sx7jmV/ x^T𗆵4($cӯmN5g[^QyKu~"'OᏀY-q'~'{Wt=U¶7ݤ o %}GÚ։᧊,to</ =BK=6t6仓_ CLkF].O?]φ> nvڮw4O\-IXd1^ b>ZzM}A@VL2g]bsId|_yoI;bh7/H'!q^ՎdԵ^K6776<5?xo!ጋܓ=,/٫LOl&?kfY&K*yL^+1nG:0o|?пg=WѨ3>&~#s>M{ i o[x#SѮ|xv7O<3j5mKGl$7?"o?  h ;e V_<ayxoOm/].o.sŚA|eNw׆$[[_8[YAmi0G71xv2bb*Bҵiԟ%(œ9#bEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<#RƋ.xWt?Mtu)5 s[|:6YZI}w 0- 0<3x;^<Gl7^ئ}q[Naw{ŵa{}_Kmsm6Tsw<0l<=ysx^6ծg}xZaiyxe? o,ow'N^F_ h~-ؿмEZjUVC5+4El4RmDi,>wwCo ҭ;Ym۵=\[3'[ t ÿ{ڗ~"3~ &?|syԭ߅kMUUj*(((((((((((((((((((((((((((((( Zo?DGWh_-j_Pzź-#~/?1Wе/u|eCt1ePLM>Z=|O͟gw0Ҽ?h C|5Y-d40jZ5+N 'hgF6vDf*="+&2XߤF3ʼO\>wo?g^P?~4ޥgsi ]xPw{i_5;[mO'O |IhV2ͪuMw^u?v:Nxm4OH]R 7Z\]EtڕwW1^G4QNYEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<Kw~Nu|;j:Es6> &f9RQnX{L/"{,#7|H ox+Z'D|)uK7lZ,iqæcŷZ5riyj:ŧ@?Va?ix օmtگt IՕ}OҴh`A%}JYu(~}'NkڦhZ&{Z֯{m:FK{ꚦ{,6z~5[ZC,Q7_~Ta?n_ Sٟڿjzwvy?k ϲϳ:(-xVVr㙕`lF5)dXVIn=;ǩj(|_|;ᧇ_ڃ²|TY3'^9ƙzLm4x[L:4_4:d7\i1j:zw҂R7.U9V*\u{^tu`pcpIU1(ЕnOiV`{5(9'k[^ic^^%~4xR⭍x>(~ϟ ;kxbռ9x\VLYYX'yu]vO{՞/CGgN!a75 U=_Oo i'o_|⿇zG&Դ.=<6LߌDz_yqb85r6U_)`2EH㥆 6"+V< EJӴ:g{~|fokW\[i^cqyz֟ _'a꺍ݥL|Ҽ-j>!׭t^>w-du+Xn 1xږ h%:Džg-#])Kb0V5N 5T\ɵQ'rW35ᧆ:e#O7'D0yq)”ԤVs*kQם<5jug?m qh?Ο4[Yt*Cԍ4~k~5hgL|&_|aԦiڬz/^7n7H>JwO^&ԵJKŏ|\TM3ñ,PS7:}beRthPQ{:<=jSḏ18b,)ԥqUuvüK=Y韵SᶽY|Yi~i?~(s74jGL7/ /|i37$&Ye4F=Jɧ gco~5~žt5/x*_>|l%{w ڇ~?|Mu/ ǧéוXԝ:.(?ky1RX4aڔoQ9,xXN.OF_[qqxSqt)bqs,T\pu n_ ߉qY|_^4˽kVuo  !5S%vwִAz^U| ~xjxV|7kM'wHq ] D>@~)k'mOLOhx5u_>,f,UT(1<=Zt5^:3t)MUiT 5+(:Q*jrN2գJ<[1JXfYZ8*G(ez'S+[zx3q |`kι|C⻿6cW7w'|]P.ПPִs؞K7->S|)o}|yٚ)|b9Ga,w}[ᯈbN $𞳫yZ "ҤMRIu)!IԄaө}YTpUHVSAGPF'q8\ކx2Tʡ̰*1<*xl68o_:gZw_R j? $x+Ÿ_ OGeqoWx~JX(1 \^j}^&Ч;ZWnto4bI-;+ h#⿎X|-+/sFKk+4^TisejWƝkvTn7Ȋ}MUvC߇_+ |1n\M,5^|ǞU+eh:~Niv_oPE utY^Keh)|FԼ-{ZZG%ĺt3Cs+O? ?ii_,3ޛ'~4 -Qf? u?:πz?<eS.׃/~9G<9c5xRVVk:NɴNtK%FGc?|33_+O>;^? -D_>1h7>"Q+WI/%ΗmqO[_rή])N4)AC0QLT(##`q2>?jbqfup0ܖoR;A>||o~OT5!y81ݎ2o51i:ׇ~Xi$> GnQߴ,E6_4"{FoQx\U|Szj_ٹn.3RgSѼm.x^'ſw~xr{}F–vi& s:E<5&g4:Z%dz1~_|o[q|-WſQ^|gxN@7 Cǁ|_\x> S-[('ؼ-ɴ[)ܱO:Ч$MTIUўJ\jrIp⌡R[S eZ[y,[ƪ䵣*6"/<>~՞7#f>xwľ>?fм;/7=|]x?g5?^ԼX7ZZd/U7k}W}&Ɓb`1Gh-ƞ7R|3axsVĿ |O2H,wg-vXִYxv-X/K9xuGP4UQm{H?utOWJSa%˖'-˰4ʖqIpaB1qtLCt&_ |]f{߇<Rk &iś χ+4(ŏcoo<>^~tm{ɨEq뗚RϨ7w|Iߎ*ѥğ|1~ ot?Ŀh-:%Vv%-󧎡G S JeF:QDL<*SԃFQЫ:5'%*NJ6̿',^c ?b psZ{eXWsZ37qxie4Sʲul^7Som+ƋJK}6 ti;P-ƏW]by.?iEc7\upbRR~N<ѥrqc*FSAԚGJ n\I33^ 1YtdeKY~)ySJlT#^1Ra]gBIӄdB<3VH_hQXCŢ-k?u 5 ,oK:Fswj孔:N~麆_+i:>:j>׬7MPe8 uSxs瀬m_n.CeI` QQdEduVRi@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh"O ?/蚏#zc?t[ WRuU{/$t-ɪ\Ⱥus- O 6i>#t/xB[ѢOeau}fK[ZcpYiz>:9|r񟅴OڼO Ak?E6Zv}--=s“YjڔWVz$GɧXhLj k4oWдKUіVt8n.lĎDTY˙D:z (cƻc~y|*_o+?pO>z?ھ׮kQ@y}{ƾMޫET=6N5[Sk^5+鬴kKM#Ú b/61?(fY_̱4ѡS K^ 3J^NQSAI0Ix᎗>)$x|Q~ _Z嗈Ϩj;'#6\qϺlVڷŝ'm~:[4/oI ⧏x^F}~;ƿ&{& ͥRmW_I b| n+kKXN]yebCdVab8j-4#I׋5[[wB <_qy}{JxZ}Ljq5-n4c+ gkz_Le5?믬;75;-f{+FF95Kwf-ωI<VT[hFxx:~} f Oi}-嶗iO6H{wKmޏumin+_x3> m|3X_yb,XHaA1[@[-QH(( ķMZ%hMh~eTA8K-I bi"#k莗 ]k@tPEy߅?|OOğ~'_y|u?ohdmWG3}4~.Em/ '麗 z׍,]^{MWӚχ^ y->&ڕCSe]h}'3i =R많<_Ȭ-mMwEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(7k:Լ!hƾ|O-ƞڷC}htWq #Gӥ+ﵖ:Ҥu!}ߊ|+ g0կ&gϬɧɦK@״O|bu 8Yt]W \xeΗUG|9? lKƟ>Z|TT8it!h kwiYjSMw ~+/0|1-W_Ἴ0۵7.%䙬Ԣ=Am ar YdXðQ@d&uF/7;4O'fԛ󼝞.#>M Z+~+>2]Z:$g|= OUo *NtuAf+:%Cd2fjxsaZG Ǜ !^_Qo?j^'/o~?t^i~|@59|8 kFį+۬3OԵ/!|;ޏZhZkmO+n".UpɩqV "3s_ C5 m|V 'LdCw|aa.x'3 L"cffy'NSg*x3_|,,Z~&j_%Aoc>-$9tg/wMc\t%fo%&R览vPwŷ֚OګzEy@PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(̾%5ovZ^/|e -3Sӵp!ơڦhWx~,Ni\A 6;SX>nh?fɼ)yuoh3Auqa/Us}Bwcs,ٳY~{@?k.4;X4+v&!E&cqg|LjOjxoW>i:MZ[imckmgei [€$PA iQ `P (^C1H] 5-{,cbm.[aK֢ (śZ5 ׍mV𞁣xb; MlVZމi¾ y{s?c~7eT1yEnU_'(ೌaҶ 2dYKS3X E|3T<˜q ?e; .־3b|#|UMg$_&ᾚ[+;>]:%24Evnd.y_Vѕc:iasmw5X>{q[|2y㻿4xwFߋ!5m"{BmҷQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh? |INbk}.+K} ~:umo.w4 >Lm2/?O{i^GgxᗃC$L4k_4/ Z] ~|Qh? m<[ouXVtiOIm -GßƧ=<O|l3/os;X/=;}j? 'mgwWVyMỦG^_34/]7m_\e?+絰{"IW/h>/3{]|?:kOxvž5-4h톍e=ZyM ZkO5}mᗎ_ߴIo5;E`n7MizI*%wNp[]JIlgu`qRpǞX\EDa*5#Q.g%w_V>O eg~x#M;|'chz_i1hƑ}Ed,4|D,S˧_M#W P >3k(WޙM ZO-?>^j^ OZčxžv|?4[Ӽ{j^+0%h: EbZKF5cyIƥHŪa(rTʖqc,#BwK4QPzzXM5 s*X:XzajxGc_׿//Ɵ~78о'5쉧N# 5v>"_x3z^,|{oO6{m;MEV^-ޡ72>vTOY`t,´,QTe %H7RjHէ|,񑇳O;,ļ#p W3 3~3J9mL>CBcp#2*CJi2e^8*Ưڂ:<Cmÿ?c{_<C-KWf?~ּ5+W5g|I9m׭j^4'[_I|'ό4~w~8.?u=R?m?<M-.mF˪K\)V8=o1{<[HѼFھ< ځ+$81]O} xw럄4uؒl77l;6?/"n@~:acyxoHŠKqnƜ**e9iIWnYwl0rr|6C }La|sS7aU ʳU#ex>vZ6>1o#BmN]^6Ayca_?.!;kZOoal<\|bw:8ZgZ9wx"Ʒ_~>_q = m.S?<= YodVk`eke@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh:?"HᯇZ0E3@Ѽ5 iD#c"+;6E ie)/>ON.cieAWX6i6T1!<${EYxE) =ko5=KQA=WmA)KψѴIt7:fYa[Z6 :#b+Gm#+倸 : (~O|}_WiAO:֯ et d?omNg|}x?~f_k!t}?C:^NEoYmNMF)RiF)6n$mZ]:u+T*TVIƝ:t)ԩ9r&cm$g||nxw:?g_kpֿi>,|o-!mZž n i(mY/̒0oF8T0tq>5TԱϴH҆&6\ɪܗQR+9x9 & /`p._: t9~̭z8~:'o7=SS=|.>Q:j&>|y{"O]*OL86` bxHм? o쎛:hkZGt:~V6zE6|6s{ybRMb]utw58K^[~%r79+\Tmrnk/[p2!a:i:>ᔞ|ksC_ 5zIzgbæ==ZPq=&G~~ O & $_ mK+:9/m;7]ޜŪZY-F13b*b#ZOiUx^Q9ZXFv\G:8dX|VmK0/*8V7]pQUե9c)' RMi]]-#ޥmqg%x7Oeix%ݭ4X|+umtqTN*PF-/ُ_>ZxZ g;>U-5xB+]bI" -YiH-ҡ.aYjLehs V#0Ɯ0'[Цjg-q~xWۅJ.jyoFթf,21O{ /F+\5/ќ!Bp<J>|o 'tt 35M\7_Э4X֧~R/~ƒ]'=GI)xMѴ]3OcxwE\x{I|Kux;U1XOkI_ݸl3L;<&YĹ |GY/$19oaC;)RW+9|qT֧ʤʺMĘxX 4ifr{*بTJ8?gR$m7^a__ 58>xO灮|%vzi{'Ļ9#>~O|4׾_<k?)ھk=Q|%4ԟ,b^b/?mV8UZmµK߫ۍI^qm%ve<=if:i̱gBS YcFu*J.>"9B\O ~ xlx; "Wᧂ7O j+L;"ΛbF;{*T/m47Mull,l{ۻ9'HY]QYib+Wb+Ub:jԛQ\ӜJf8cqUe[WbkMuk+ukUU*NRնs<- ᷆<%;F>7"׵MVOm46j7uggo|zơix%^ummF 6{[Hum/[hV7 оR)Bq' 8N2ڔeM4isM'^m4/ OV%ioK[K8DV}Kkd$!m^_?bf#'8|/yY~Gw(;JgXxGYH\uo;y¡1IpY&swgژ \A,2*gg9 =LWS2FT0(KZ.TqI1,$QD$ʑ)gGbfbTHrj1MɴIvI%mհ*iƍFgmzwoZ})qg}a}k$wVG=ͼA<.쌬oUեWV QFVVVZrpJ9ΝJs4'$@gj+R׵SN4=U5^MҴ2 .-KQ; +X+{h#iHјx/ڛcucG F۫xz K_|^}'QͭcW:e6]^N 1Ygqud%ٷ G,s\ g W.6T0&P'`=ݙQYݕT3,(IPҵm/^4kCԴgFլ /Vү-3RgImu7d`O*FxFӫJLB7FjЫRKƭXaΕ9IN(ՔT~!-4z߆5wm}ZS&Ceq'޽{it=kP𮨚',4ZQ޵%Fkgq4>^a%X_Y29K Rb(a`iSJJtj)a)VTe =*E 5:eOZR# x)6^|Gx4ȵixH6 >QKƓOɩ:Jn.1vag8̻KcհxjJs:Zǚ UEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/>KeYZĞ5+xNπg7l&#xJ:Ꚅ6iF[,妑 xI>0w'-Ci ŷM3SՅoxZ汨6.tWFӥV61]w:_†~!x᷁t+˯%2W&E,|Y3o hR[x~{>gyz \Z}Ě _k+{WkK1iv#kP?ej^\W|FѴ x,txƐ 'IV_hqn/#k7t"KC2ZZ\bMӜ*G℣8kũ+uѣ|."CKSO22W4>sᯂeψw-|% xuM#/ i)wd+[xUGk1屵TTFwgִw?xKgW~_XԬ>1[ῆt E+DykMD[N=+ZV(֡ӧ^&Ԩ7N%()E׌rjH84a2.,Q0bp0UTFb%RJRxiTg] 9Q]/w_3_%^{OXZfԭ([֬ˏ4/D/,>|J(kf=|64ό?jv­CVDoO]ti~/ 𼺷tƾѴ=JXtF|8QXW]`hάzx*?X.lD^ gjJTa\ lZ>˱Gxܳ O*ugYUkV1Y*ܹUG73?!x<~s:O5+,|5%}4Ї-81yN">F25\?*yVHk G-Դgǁ]o.Qy[_Y:}ń2ZKᦉᯇB˩~|3?<Mh`K~>>šBk3 Ktr['a9-i$E#YWs,5¨>k^ aß|IoZ?~"R4△V}goO5ykcY×hb\ '㼿_~о*CxoG_52-|<}.xo^5#~=|nluo Λ75/k_[e,˃. #yBX d;ofYkbkSf~6 ;Kà|4~ ǟy[v|I;xJqz'~ ^>/_ #'--F| f^ wc?(|~;K|y}F;Mc ׷}qOW Oŕ fc1^9vWqUo$d.n&˼)_&˨ey? :<,+˨Pr< 1Ϻ~xQ_ه_:{G#J[Lx:,.5o@okw3h~ k,wxU=g:Ϗ xV_=c_M[2jD !ViW>Uƕ|wnnAPRs U 뿎֚MCǾ$+ tOz j*/ x~7,RxnM'~\;"Yb_oĮ'pYLoρpXOpخ"8 ;˼R>!52b>k>-~>1/c_#'/3HWƋ_ǂ>$>_~%ԼeO4jpCB;Lm:wZ៏_@o~^iFW7B|%_x~ F>9MPѼYj~kQXk[8 Gc oar*5jaq|++S&wØ<3ᧈo7>s\}wŸ/^-'jtW&M '[-CVs$z~jz%tkkbOe+]f |loB|" '!SU_\~Dta7~x_WG֖[jWUxw3߇94lî✳aeÓf{[[1YDi-"Im6?O2֧T15N a^ I1EC3i/|B[xs};4 ek~5iq+=DxŎP˿g>)6%4 |.Ե#Auſ <64]wĞ5`кDZ>>5]:ۙ~KrpN7x82^߇Y6UoOb e^>.Oю4a> 0 x՟o>2ZUicgHO ߳\W?ǝkSk-7֡>'2 ºn?~xc *B,V?i_'<9Y־|T |:C];B6ViYUͰ' / pnp<;+ȱ9NgBy χ*qnM(g9u?Le^, 1-3 Λ(=z~k-υKmvnjZ |C<-BѮlH ?>?`Eڻ/K.mc|F?u$9wE|W>sTo`Ɵ-̗0MZ-cR^78* ÜUS,N2Xl3%⌦I\E<Y%|uϦxs\5[.JPЭ7>t+/:ׅu9-;?xQm.d_5u; IlTP#f>%~c_pYN/k*qxzkڮܷWSO^x1\#!0x⺼=p [L3$pgX9G/y/*Ua*1xoiMNCS}[3k2?|?259٢9Giou#iw!-VRLKxCJ_?kzflF jIWE]+M(i]VmWi_V09Ւ#9FKrU&h>kx / 45xk} ĖiucwDhUV2F6NYe(CyƣRu?gR3npV1v2Lf_O 5aq:|>mZ*Cy [ꘚ8g^HS.? >I;Zxkw? gş x3vx{FxMc4↙C\C=̣BjjzWXv~n|WRKgX~*+w>03i.:Dž5b,5EO24jJJˑS(FNU)NS*NSU*f?gJ|ib`qYЭ* ҫsTVOiSJ!aiĺ4 K~F3Oៃ4x5K/aψ>4~AW|7&Hu :յĚ\Wvw/i JhsZZj~.|s"ɨ iu0j1=.-6Y; \a+ⲜNVѯ<,^QVU' *u%W ,t1q凕zcGgOUJ*$Js^4?xßO>˧j6K}^ .ZN7vھmwRQuwt\vua^RQb烩FxJu%Ju}%i(njx}cytڅG±|K-Y+_E|EgϩjweV{;kyvK+$m _`^"O#J9JRq4F<;|7 xzmG|2M^ i3)WLJ_s1a9ؕ,Dp8 S qX^* O ' 5QQJ ,/.ZA5ĬPAK4(f!#FbY 𷉴?xk0NxAԖ U4}bCM[k--7v\Fd dbƓx*8*qX8)r9{FK 4`gi289x~ |uAZb3utuo{6TGZ\/0]N0UX̿O PB!] ?xᙴ? !xcZz5ɦYEmi&}sjuI:-t#13YxYGtk?P빎^7kCEķ2#ί;.sg/{/B6?> GexUXky&&=դ :avmaC H*GjUM_PPE utYhx3oenj5JRxcaS :qrxu:P[JpnQJ[.`JX>%o3d'RgK,>YBoRUSEԕZQ|C}I',''?;_? |y)x/QqOth_1O YxJ+ʿGf~:,~Z߂|g\ŞOᧂy :g9|o*0zN&ZڴS |Ӿ |%??iQ?c*ݥ uߋǥxLΝ)4j- M.&uNm@ eZŸiW Lo|F-/Lj{>%]VzO;z1 ʽO{FUa^4TYekάQISMխ# W1'W93Z8\f*[8t |K| ٧7G9g?ZVOiZC,:Ͼ ~~(u?uo W_ kO  >%GWlMO_KiWt^.iTC2U+/הkTsuUUW5uiS'řT>UlN ɕcs:3<I"Y:\ڵ~;:<57ק7<#9:+O4~-ۯx{Sg{ǟu-?Jm[VƯk2^xVvZ7j?tۏٷG>4,/ǁ,ϋ1񇆼Ei6$o^ݧv tCJ8 XzFT;+/a|DpGM4rW+UcwVL Ĺm|^_CG&~> Ef>1={w쉤~^I+_`> ߋ-;*o:t^n7~&xL<)4;x2?>Y\7Zo/7A|Ok}CiTGI:ھO|# ӗOoxZ[˟׶v}g@-qV+?gL^!)KN?6.>sQIХJ&INuiFSjS?<ڶ/߳ƍy5i>  CĚ6|u{;Zķ9eO}{wN=~>|3?>3mG[_m+?>(įொwf GVQ_~tWӼG~qf>'9/9xS<2#c<5V11YqX 9Y__.s|1>a0|<{|Zئ_ZRk֙/VxS+ 'Z/cPA"G-9Oi^ f?5oc3O~%s¿è#>\ז_tٿi_Ms߇G:j7Vƞ4bsμvY&yGxςSNx,* y/cz.xf؞Ml֦Y\P'ƟVP)c_rLvx/ᗁ $ф/&Rv]:I+.auqθ2ڄsQ>:q#0\ q0W\c7 gS`q|3-数#BQYn Xpx⇂%Mkoßeec>[YiՐf]jZ}Ɨ:-& HԬ]VԴ[((((((((((((((((((((((( Zo?DGWh_-j_Px~^u/N.5ƵaCksF`5++I/{ex?txǞ"}_ ÆK#{ύ> ]Zt vڕtm5;[SOPLI[Pie K4?hM..XӞ[[i\B'VX&Tp(,b_PPE H5FBftTH[b%ҽcwr,`:t0XjE|4lF3?_VR𾡬|OGvZ/6H$%H7RWMPik^׾#L񷁼] Y|CuCȶz}gZkM&[W4YJtj**acNjԨӜ {5*~iJWQj2OZ|=X ٮ/&(cqxwJaaS<|6? ? q *#ޛXoX4(Ks~~#ӯy:\ck^SvHiQB:5XSj'VTgqfԔz C_/g4eƮ:氕ckeج=,<ӕ,M.*U~+-дx\ on߈^%|c;@&a F;vv͌Y4h07_?{w?< è+{<1 vmG[? kNcQ  &&|5aNUԍժ qpZ8(d9uF0 .V FK/pzc*TR8һ,3Ч84a/IOt]:kvVjUxCX[CQM"T.ҧ[{R]m{XԃRtpqmŴNީ4xZaΔITܠ'(M]ixHjVZ6NҬn+H cJ}v—9￲jQt+Y4m//qlE9ԀxV & 'x'N_[xX MӼ=\2^3_Mӯ|3[\iٚu:=sc$ubү`iK[u?g쿡x@;(?A{ڍĚz%ֵvP<)M)Z5x[!+&2XߤF3ʼO\>wo?g^CRҴbm}6UӵH-+;{ }OIa9cKԭmu :n,xcZm4ii٦M5iʄNqNr%(Nq%x2N2OTM=S>t~kZS)EO'ZW<9/|/// |L= ]<;=?^ wWtr$kn./G v?x$o&Wfy &U5{jEsm^km d}Z4#S{X%N(_9RU9sގ4s証;Rg8\/`nXYoc(پ" /J\-eXMWRï"~˿_/<?/C](5 3Fm-tYWGAנH5?XX#H&K_Zox]o?jg#hw-A4;&֧ҖK]TUZ4!UJUKӡY)ѥ%'Nv*ie9~sQi᳌kASqѯĹFe/Weم8a' t0.'|[/GaU>k^^^X3ۓrmvmm[}3U*NU*NNS9NRޭzp_K߀_|/5k2@ll徺ƺ(ú|/[m#Ro|'XO|Ix iZV"qhto}K|Yh:e%,tX%M2W>cj@$$J( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=?*]|;𭝧uLțQ->lq?X>x/L5^0x.NuY+6P7#kkl4X-ⷽῴ%g ~)[xgx~zo,,|9aEs&q\.mauV]9mmd@O|]OSW~|7oOfj=??ڇ~7g>>ϸ ķMZUXE~fWC9;5ԥaY%0;h 4rZtP^ko_ w/Qw PhixÞ Qk LD4ѯL9>,͘ tkV7.UR nn^y(Zu}:8ecaҭ=ZOg~E.nNx[7_8<>_Ÿ k5?h g(j~ ƣy_5 }6-i?nlh=F_h~6k;Sτa;P|!~~)=dkHNx^8x~%{ MvG5=jiGsT:t.E $*/aӦӔԺJ4Si|/C Z7<̩K bpt8lZճ%ĩC' % (׮:ocxWy;_ k|ICE_G- _3\9ğ{GZW5/|JkM3Dt'[G-5~w_~L_x*7HAE<5s__*ԬSb,>i!-SEo,*Ui䊞0ʼ0 UU>Jxh^1ru&t> +ja>!C NCKU>uǬֻ2zu,Unpg 3>2n/_>hy_|ux–wto >dKxMӼALAٮ{;WӾQ>gu.o{O3M{EydO:L]>qi2 jW~:j1:kέ5_CP3]8UZӓԊqn5g/9ni_}G e%VЎ;O ^2R\5ۥ֝zqwVk,wZťݼ4I._k%?_`=ޫc|%mx667Ww$Y𶓢kqpXץ%⬎k)eOO^4=߅:3!xEto> '5+x[G/-`!z5Qg=iٛ⸎S~*?%x[An<~,@Լy`<| %ݼkj^ <)f%ԡJX S :+i-&mெ vPh^!A♼)hu=]Z$Z[KxkO[Oso[ټ +7ƑeY9Sq2ZDW5Hu/s9?:Wj ? ~|"Я<1? s7Ol#׼Ez׺z#OӭT?Km;&}@VL2g]bsId|_yoI;bh05gc*y|Mjoͤq3\ >ysN_[E C3J𾧤?=xQk[Jm֑|kW^Z~wީz|]|da,S:4ӫB[/Ҍtj4CŠt;7^Æheq ,TpUņx|2dr9`O~~W?~h^'/ l=~5dxMψ|A|ois5ωoi!#y.n/RN3*jN*RXJc^Xb&h1:u 'Ӄ쯟pPUqpt-j} *y0V 1:Ua'a迲wo4|[Mw xĞ.GwMּKmivSxCxoIQ?j6.  ]s>#Z/&|8=/uVU}CI8ik~ 5|a{Ú]s9~oWDŽ>xž4/m?%m>_y_څ֧:.MZiZƗ[Idݱ}PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<▥Auz@ѵgZLJ~an.m-GoIE\S1CNKg|Y6hl~>~'/E1hw0¹wo?g^PY0ǍwQ'E6UW;}?}\֯5>վh bӬ7UխNÚ'/nlM:};6IamuJ0ZQiʤ#9&$UۻM-ڱՁB7GQajpНhFE:TMJsZhC/ᯆ\~4)}sĿO/ ki'~&^xQnG/_,Lwզ[Wτ7w7xPUv_uJXh&[U)P҇5gFJIN/GC %S jeRNt8)Ə,2W`pЭUUg*ʓ瀡SգK+FY/iW֩PXxX|gu|+xo[ះƃI>+[_4xWm[3ZJ~k> umG>&{w퇩_Olu|{jbŶvF1Nķڷ~&m=GO_OᢣxFx,c*)Eד5QKӕzp_tB3r>B#>ѩeiէ<֬y*p\J Z*?_PJߊƧ,Gį~ sUeqz+ ^wWSm/g;ֵKhO JH|6/u_xCEo~D,g|Ht}jKmBVe]B &(,5Sf,,Cyۼ=W5 ޹R^˖wU{Gdsaec ˗^&54b\Y6ELWjeYs|O N?ai7֍vZ^f6/wx5C׌|9x wt-/PJuxc/|=?UvuZk*En4V #k=27hffGd|/8pyarNgUFx| lU*x^3JTJHխ RR2iGៈ|{ |uY JxFþZmZjR]k QVMսy5|Kw~Pς3Yxx-c#k~!|8 E|^&Ѥ{g>>YGf{C+c[Tm5f9Ni08*|E )fp]N.7Bq~xC7/|a}o4}|5>˩\h A񎽭_xf %|CgWڎiۥk /mS |?eMC6^ԯ-L_4ǣii~7{ Ǣ]Z\f->&Ͳ, ˱Jijø|V;+.yW\f3[T?0gwJ>9Yx>Եᧉu_]gVqi+<=E /|%lψgX[y :fy>.xq?|U { n3UOSLS+Ji6!uׇM wq /88Ͳ+<,g`aq\Ü)K4}k9f[g<`s4 /ĝcE>| RV"!|[i]|5ZdX}+]Rk'4|zNv_> ڝ>[Xjwާ? hw%qoCxrD`ڋJu[XR>M3,N]f,j԰ƶ7NSK67S C+18jʕl%NJҜj>㟁5 ;Mu> UᲹ\;|0DΛk%/ x(!([?|=Ww旦|>(~ßxSx?]ׯ<| vlz52 CV(6# fIvC?eO#:+f^e^R y.u:#I?m? O?~=|+x@{x/__Ѽ57< agiluohj>uτ!XJFx/_5g@Ÿ ھC#vz쫏~O8Ե?hz6^hn bS[:tgDz6sS/̳<>0W[!|W Y̳*? Džb3ϞGs 6.8P-|yL[?>*0.,tg+熯~|U ܶωma4;vgDӵk|iiV>/OU@f/jvwuYhXJ&ȷÃ0>y9M~"ʳ7 e[94ؼ*F.!Ȳlfٵ,FKƬ>,|JM; yR i^~l<97.Oּ[[D&Ş{cOݭϳ.gs 2}j`<7gPT)g8<'f/' *QJt߆V~/9Wៈ~%)>"3Yf ^þ[o+K*$Ҧנ@Ţ?_Pll5B ?|Q⛏_ğ!|;Ӿ|A#gG?l~CėC⟂?>/h8еx|p /i[ך%:5.pK>N+`p7NJ3Ot0rSfu  zfi ?\K2A:_ ^|a\x&⧄KM2Uּ*X4?K<%-Ii#σ< PGS?#?e6گOB72h5/iqqG~2<> e6'z8pղ^f># 9^qRɱ/!3b!|k7Λi/[xg:Mt&lE]Xqi~#Ż\]Ɵ-umc_HW]ylc9d#'O[r"1|4)% rE|Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh9;>o i>o!⿇s_[3V#[} ~xXTjp[imdxuxW. i_/ ]x^[yLJ1/,n=^jqiZ߈B-5[ /ᝍbO9G Z}];B7q5xMm՝̷O }:ĞOW-ڤާe.=>/T>ӡ/d]]_ݴIFI.Lqfib*@U_PPEo$ĚJЛ?$ʨq&[fA#BEt F/.=7Ii$ր6a/Nm<}ey>v#kP?ej^Eywįw_(| xؾg쿳|J~'ڼ 6|Agi7k_i6K𧆤Wc?G-熵ؠfbFTT>U8ª9bb_,J~ϑ7NissYە6Qa0+FzXl}< zx\J"O9}[scl>_e,\xEn&|]ĖDҤj军Zq~5~̟*տe~1I3| cDĖ @.KwtZ BOO4:K c8VIr8U,hU^Pź*0M 7nl>zX~&Y 8sO'ʞ6*xlnI i TˡN9O'*xIa~;M?!xN#huGzꐈkQx/v^>ҥ<*nzlSۤOB{}keq}qo>ĺGAs෋oęf]cy>MC./*ΰv3># ]\6؜F[Q?|y(ً?Pv |7}[Lp>IIKxveƽ#t}Ee>v?%h> x,M?'?gvexV%j|C,e៴]q^;Ƽ;..YIǑ<%[ŜuN/%.,ɲ^ܣ0Px?$å[92N3) C٠_nS㎅7E~ϟd閗>'M:l!DFhWѭ#&'CzW>iz8i67V: 5_%׵efK×[xE/?1{h 26"`pyfI㸟G2qse F X`q 5_0мEY2HqM⫭Z)zbZ8IԮ yg=k>šwAOk7/žh#B,<@4 Y<{J$ߋ+}s^Y9u?-J[yn3,Ӊ2^1ak`p\~?1 gҧ<[+TH)a1q |-~|8k:[<& 7ƷPAxihWMxm"d *{>x FŶm{5wMwz|osaE5R|Esi O,V.1?r,)8n"ę eW|x7 fu*k `k\.Wc!fρZ2վ1Кo|kͩjW$GKKO}>}6Uӭtm;1#~_ ]x~.}+N}UjP'Uþ+_ |_|I=|3;AQo_GǺi=񝮔 WCï/ex|ż0ͳ lp~e327!җ U8X Rúx^_WIpx<<7oZ^~|ci>{$д)Y> j:'MxY@E5x5gQk4g~4i>=Ǻ9,!+(𥤲,mnbW5.iW_n,]o=+yg0|c/0;IxandMpXeU*ab0s<`s?f|OγZtYÿ\|uX,Np|!g%|]=WG-} MN? 3Lž,/i7|A=džt.o 3ѡ?_ uh1|O⟉r}jV7_i^^,O9"0Ʈa=8 qำ2 䕰833*; 䐩=z)߳o^|;_ O­/N]ͯuό?OxA@վw5[O~~?>;w>?j1fψKe}s:m7 ~1.49RӥKj7Y.7bP:؞-5F/VF].+8# X 2VbHW}¾ Fe:Yk4u]2^x~?sA^¯*Z kN),?bg~jzƯ~u;~^6S/GY%>&`> /ɼԼkROSKJ_^ڕѿbz}ҝNz+ (a:N'}|߳jMN?OGjke&E<> ǁ7|J|A-o:7vY.OOͥjLѬ #Z./|??5Qu_yl-"u? |W 3>?uHd>`X_:擭~{jzMtQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<o)xÞ$O~;υZ`hɨVפ|q/C cgaKl~oꯈZxB׿8M×~ǚ"xk&OR7@uBi[MY#`QOHᯇG|a_ x\iƒ7tODR<]u$~A{Ydp5SZΗgqV7zskoz\:,j^^Ţi>t.1"X /Q@dwQ؅tGXym;Ie%k-{iu 2= 6XW|`x.#+W6V?4xOafeptWSl ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=tW-sǶ:Hn:<[Í"ڮ.{dVkOQԵKAamuqxS׋|!Z|_Yi w|kQ|AOxW:U#Y,.udD5K.:+MZ?~ϾwM.qiq|>|K>Mak=WHu=]loemỽ}>[>8~ A.#Gw\ŽunOxgOҼ>CMJR6^ ~(!+&2XߤF3ʼO\>wo?g^P^ko¾)=xO]׼z喯wPi:'<9x KGkWޛhB _ !=)J0Js4!RZRRd/vWI=:5:J =jeTj4BuiJFQTe '&l#>m_XԒXR 'Iqω׿~_xF?k!~#x/Cm-#xZg_!Wzx~1tM7Ú*|?&aުɨk6qoQEVBuӭRZ8ңiAR8J4\)H̸ e1yM)exUC<~+0cRF80Xx:b(ԥξ!(FsBs,^OxD>(M]7Wg~4|5WLG{R?&qk\$?i?< O>KvGï>/>u; ~#[/мNu׏':ޟ붹 ՞ЬQ({:eZ4BRJUUᅪ*e8561a:X?[[+o6,t ~J~V:2kÚ/x[|-imxo |PIss z/Yq'Aox~h>%^?]X{Y{ė? .P:t[DC| \m5R*-FU)fqt)ԧK5Bn8B2)Ҩԏ%/kV&Up˪d&ScE,F#]Wxłajfⰸ T,6o5/}|w/1 |.ڧÿ9fo*qAk-fG|9CCu/,2Za<UEu'K[xħBo|[OxM<}Kh<)?O g[tk;.n?3_RUӫR"֢O /#RBq8IR oM4S'1Xw1̷F8/ڋХTe78PgXz."k Jx^W~9xAu jo>Y|_Zw~;ϊX_|Nu_^*]A?k;]Ko~|g}?~$[W5>$k>ԼyA.q t+Ǻ.o[~.7uM .V5i>Zx"RRah֨./oIjtzTˇ8CqK3ԥafx3|>ZyUr0O2|*T_zW?h߃_=㟄[Z)~xaD9.o~&Q=:SZVu[kZK5 qwBmᏊ>|ki^"4 :?Oעաm;A}*];TtƵh t6_K-(-+5Wcͽt JwCe{pҾ,kuSi0x*z3اu#ߌZo -4/^DֺU֬xJա*ҧ(ԅW JS(EJOPiU'YIZ^[S2ɱu(c(jaVuhc>L/S4%8 NW:5qxoxR:ޡ|IxM'LOYW0%޹ľ%p-Rm\k7.> ^? k_ i~}H5[|;6x#j=:,׵:R8*qqTci2iGOzI'NpeK FьjRPZJ&ཥju*'779r$񏊴xS~3.t h[k~ &ҭ%Fgľ!Ԛ\ZijmiP} /W~9/ A|CBFJ^o_ox:|CF%׆mV/F=g"{B(((((((((((((((((((((((( Zo?DGWh_-j_P/s~&Wp6u隗~"DDֺ}q{Ud7r htY^+ktFm|Ep>cǚo&nBKΗ {Nϻe`^ՆxLԲgį G*ƟjYwsĿ*+ȣ?#:m±_",m;SOXVMq~ƧjRVzua:ub"NgNI4Ӓ}lIx-,V *KLnQU085HEte Ԍw~u^s~mƬ\:JhI;OO|?m%,|Qm+˼YF ~? |)xV M_~,J׵xš4xY{Zct>[;-Xќ'dZy:x J^ZpNJ%WJ|I{x2qѭ, c3:03X O ,XK0تlF\04+SW 5_n|+mgᕦ[M7ޑ}/\[;KY$-q:x[WI7DZVk *[/$-{-oF9*ڬע)FPsN*nOT(1q\g5$ωU̹Q:5px y#,\ppZ1B9ЭNU:u>|B_ca?H]f>=@h_x]֭t/JGOZii㣢N_sWq{{?uOڔ6'7Əzޚ#M:@>)|@)4 CWUWz^ ṞrUZa8֍Z1QҌ)KRU'Ju2g"|1:8zz*9]<RZ[Rz*S>i_zooq%ƕǴ>8>k[E=+6k)Lï_\3Ɵ/P%Ƴ z@hV6=v^o]lu:FlXj̱n!̕JGHԥʩ{**iPQ3F1sRgɡ ^cjT3GKKX9D1v 1pu3PV&}N)Z>'2=gZ4th~"Mo͢.-_1u߃}=h^4A'|ǃm6-,] 0Zv,hMǍSFZ4MCz4mZZ[jWZ'7)QjZU89qJ9:Tj1tYRkcdo*'8C z8JeiSfarI^>^ cF(4 ğ^iZBi,CnQ{d_|A޿7Я|}_M. ١t4Dޔt/C4n厢AŸg %;⇌_)ďgχ ( (-'>׵:-kU3IGPƱsk6Ol&u+RӵX,5(o쯣nN8<^". CFuj4*եӯj516kJ'Bd֧ EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(~;~iо"xVմsUgnBs+Do,UM!}WP/|'nwyښ~ɡkW[qkc~ʹ׼OsC}<xu8ԏƚg@ 7fJU=ZURR%+^׵gn i:ju]v$u}[ZV*=5XʥlGFxBXXƕZQ)EZRΠΚT1~ueq:1xז_xz-:X,n <j7J4*WዥwƟC?ƙ~.|B# `C Nf9B=>-FB>7_PDx[uwi>"x?|8!$;oz {\4:/x_j:v^ ųiF^ŽM08Z1FҭI ~7R*xiRTN28qW*9&&|a_:xL^I[,(|+OCԯ5|5} Nn|;?/jEk:'uWv\6*C$N6e[_ŦP\7"1hVl,/i9ѕݵL>_ x>R*KKw`^DwM']DRɳ7?m<3fPΩY`qTQ*(sJ&Nk$ѵoz[ I]iCzj~Һo1|a`뿱-~=kwOO$Wwwfn_𿃘,=j\u ajx<9 ?h`s_>!s ڷq[*p0Y&|9b⏍f~7gw5}2 ~xஷou8/t]&+.<;_hzW~˞_&?h)Ox#Ŷo*?YKG+:]}[pxM6e@xI <4k8\,x6o<'e\񗰧t8\s9c2X>8KOj_?-K2^X[Cr>vZLj&[pjv .;[=GL➭VxKZ ^Чz."G~ ֡jv'Ğt6kiu`mqic7sf0xy8nUże,:>xl^iUfЕ*kˈZ*^.Ğ|{>R]_h6mw^|K=O$.k֡6{[Zۇiy"dfsǹ.QO)TpX a\UK GbgS˥F*8L= 4)Y|&1|-OK'Mx\.ŏKѤs:E.x>Լ9\h>2^v/ҼwuzGŏKC{G?hf׼a\4?~V>'Y㟍&^ ;zFY|(>,Yci{f/O.i%Ɵ`G`cx~,ʴA^us|#YpURzug\>&5j)UʮYS7-G3/,ZO#~Vg¾%<,|N6=x'm :敩MjW7 #!qOxsW.L \OYSZ~#gJ+>Gxk|FaG_ 1xyVѼ/6X>:oh #Ꮔd3›ė7Ľ3Pt˛}2/oh~ВxN?ڧZ*|Lw fR7oc>=~xQӼg%ޙ)1aKxGKm5-sY\!#Sa ŅrZ?~-xG// \Cxٍn*ȱԧV0T=U]/_sĞ>gsҵ|_ݠvKbNtό:UgXoo`7gø;q{smQj_F[{o%)xNK{~!w{vWhZ'eQC6ʏGS+yuy x Iio:>}jӯ.uXSU SSյ]c^..n m:9#Ӵ];Lmln"|\#==k#Np#T(?՗dwUGSC׬-?D."]~ɟ sq!1?fo xþ%|L/52Oc}Jl8n-&\M>90oQx.544A9NcOl@|޺qᏂ?~0~ӚǍEeX2N׀> X|>m/[ +HĚ <W cuwxѼq AJx79v?m߲e^ݕׄ|u{5i z ;h6g ~ 5%BKcYP~;[ᚹ}JS+qNqUWV7+.xuK7@qzo x6:^xU4.mK~R:s\ ǣY:i"La8|t_'+~ڧ_|eoJ]+NX_?g{?o_=1hqSx0s+ iSq >$xC!/wEj>o|'ׄ9|2/?xJ¾|o.mk ծ; xG[iIɟqMqg{-\| ɩ|s%ǏW ٺ_ !>;ӱFxGM>o- _ƺ5z?K5WM .IҬ?i?>;KO׎CO_|6|!?x灾 hz焢D|++}J9tGwԳCwY ~'c^`0e6| U13yc®C,=Lp^2|RQρ>ŝp޻{υD\:5`7|gF4]6-u-K03ډ!m#u4g>?Θtcw~x[-դt/Mn{Ci,^[;C"p|m9j XC!fiO!͈xVX, |L*rjq(@(((((((((((((((((:Duv g"֥n_k@Ex=3yk'Sۧk٢}7B>)xK rn[$g9)-/4G߆4߉?t ŷ|7g4p/-uL-yQQv({MXZxw{ '鈑yiV[6 1\=3۪EQXw[Mmo5Ki,Ik-[>ٯwI?}A4'kQ@y?ŏg^Lo~~ſxǃuE4 R֥N-5KmZ'SDӀ=+LkN4mBV5[+]KKt˸/KN.l/dX-n dIbucz2-D֤Ҧ4}/VB"4Iu->M[ cJ{em;TPP0k{wnfG_D|3KŸ^FÿxDK }/E׵+Z>aZFiiizoq}aakogi_ᯃ4vlKNiqi}KZ}ڸʓ`eV>IJKk>/K;u+Kz>k]Fᴃ,Cu$]\CĹs#k7#H\QĪLB,b*攳ʵo*3ts~<ҋt IVWg]O> /BV>_ GUXS:4'K:^}7 BYF)`(xHE)$RHF(Uԕ`A"VzZJjIʥZJS۔6sq/qx~;VUXn"+7yb+ΥjfJmw~xkF_+x;Öix{~ xkBgx4m F4wwK[X Vwe@Xg)|B6/kXv=*;KCGk%Yn$)kQMjM*+K;}o~(>Gğjūx|cR+ẲQ׈5,m๵K)Vx! F]NYن/&py_l)b/*)TL Z# ɰxFkS(r/{Ï_|2y9拦zڅ1Y_I}c;E$(//o>;A?vmW -M1 xgCltKֿ ͌ Yzy 3qiWqLljmL2Ԇ[33rիguHԩ0ׅ*oW~xЯ5;n izVq}s/s[FVm'߇|WV>+K+h,`E k[h{xcP88@UEU/|3x/N7x_k΋kr_j.X`KM_xKY\/u6wٮU2_GQ\,DR17,f-RNjfூ~Ϛw }w .Xgy`\_xCZz^Zw]K&0{xs@OG?m6O GOeoq6˧iaQh֓F 8ό1s8%ϫfk6q6fyX -XV?[BXVsӝZt8R9i¿_'3WM<-^xg4?I&o]fhTyr~i5mgxψ_|:ovj7:gJc[ou}[P}KWֵJSqE<*ggW8sc$& y<~*gXf`,o//|&Ljm>žug_T`𶓥Ej.dOr2͙k]Kß? |AZx_º7/д o˺Y3)qwn!ey#ŕE+q<2+eIP˫pհ̥X:z0q o Qg8U񭏄x+Ö~0[ص/[h%> ;Y.Vdq' i $ POh|>,/=س%Lӣ!YOMEVf\qƙ3_a;2lv3ρs+^6Y6 ;ӧ|KY|U&s_xO|;_Wt|=[q,j A*g|=WySt >;~uqielRC__0RwOqs(/3Tk$?_OLu#E5+K}o7X1j0uqo4Ϫxxo<=m@㽗WVnn5+5 .+W}25u/[^&c(|I= Y|AO !D x}kok:E~om1U;<dX0T~&β'+֠ У5Xg W8ZU9_/A]~C3x~|kc23Qk:bxDvRV/,!6gS~ zCVOi I [1t51x]1/[ñGΚl/)o 51u|<E9vm92}vN;ͳ Z:'o|cl2;]7[u;yP(ibGS nm{; xfm4*ۭ" i׺S)m o.Nmn%|EltsN358*Yls'?G.K1G^k 6K { tLƜ)cq1Sxo@gt3>(okno:6ɩj:)#_\u g?k4<;[ t/%#?YixUyWxmyX^,3:x.& %<%s .sp:x\3,L#p<>UUp4aƝ E@:2@-|+K^Aҡޯ<:oãS[imu$:Re߄M$|eoc +(4A㓥N4h>ŴpqK |QUq&eَOTg Sb/7 X̻4JXu0DlM*> huOZ'ůE⎑/ |GA&^񵞕u{(v*P dc]Sa1_>'_k7 7/ ׾xkNvRIy9&^)xC `(tp9e#qwSg\)`ͰLJ%j\%B[UC Jr  > mS^$|3iڟ/5]V^xN5X}RƁeglЮ5 zYB-8.cPfGdf5y`rl4}G-J1pxjx*r\>[ETZQ_,EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(?< F6ΉeώCѴ_ j{\%ƛn xS+HmSދx ?kCc|Ҽߋί_X[hFp|Ma}cǞ3M-#imbΕ83_X-*E |h>&7m[ lixpVІyeoC7$ݵ>a6?I?JC%dѵv K(VDԯ?\I4`m*$[X/b/' (a/Nm<}ey>v#kP?ej^EbxhxTY")*)*E|3z쭡6oxoϊ4߄^1m| ~ϏtF"v:e5W厝mR/<)o|Ox{DwC~&x:hwznkZ]֛z\j7vG4I ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@'~$xSv]y#ݡx3^/-"7-_xWt.?ˬi2^iކ!*Iœ9FWJJ*Wm%դmW^9+SFч=ZӍ:p朣NIsNQ$gx7_?v/4?j0~z1ҵ{O$G/ ӴB|OӢ`O kyku?|S^[|5~WQ^|CxbP59ièjw1Oxj+ ȓy0J!JS\RhЖM]UaʽyJܾb8{9Э 6jѝ(FcK*ө(p֥AӋu.Q\NJP/okׄ|G'Hw5#aiеаm/;H-l#l0)~9WM}I%5OkŴSO^$ѣSӓNjپէJAw,NTteݩ8^?7;vG yi'YP_iIZ==4]_;|j9)gXi85/$H"G)wv!UAf k3?g&^T4KUG gc [G ۧk_|!qule*((((((((((((((((((((((((((( Zo?DGWh_-j_Pl档t1?.WLJ>xǺg4'f x&--lΩpaM |־h _ xڗº}gWltfOmi=cMӧJӤѵ 5;`  ~xoe K^ \"6[zeO ˭7t;gU4&c%1C=xUU+X5T/d|A[/Ru5[|5u[xm?gπ?/隟_oxQo_ayP sG]RIt*#ׅ/C@VL2g]bsId|_yoI;bhN2x8|\ÿmWO~Omo[W>#Nadσ ~>,g7SG~F 5/B<>1xdGCÚkOjݕ1їyQcSG+rWNW U!MBj*r'8(U1aa* b.ΝOَ+۟? 𮗮^èZwf=[vڝ "h7Xh ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@syhBwx>/ 0ҬtI>(WWGf[R.DSl_g~~ no6O/$utoiOamk^HPk)8?}>xR~6,fKzF FGvcu>770Gᔂ']~x>~sᯂ~'m'?|9Z~z^-a%͍ zV:k=]k8n 8FYqFM\&qپ3>d )ɰT0rf9#aSQkJ&8m*tPσ>,OIo |KFEu~iV|lvrgҕ4-zZ~4߈ >,4 5(~o$Ѥ6-Q>(B%9} v+W嘼/̱82`w[ xL^}lD0_XW<]?e ύhhZs.\nA!׼{ZZy|!az^ m{ƨiZaWv3A _mgԚ C/!fG4-=᛿wZl)e3ZkxaTP)ane8'\A s9}\$X|El=YvQ,2J),FQ`ɃSF@|iGZ/ _K|@߃|U烼IxcPPƤXc溳-v 9]cHuqan|p7O/!פXjhV-k<چ{ K֯!ԑO<_ j p>#1ⓧsF"0q&+_>0ͺM;ċO_| RKWO"KUQ|q?&-'<N_ ǩOI4=f;ks>55+yZ]C$K<5.sW05a51+acξQtlZXjT*B ? 9|| V~'_<'榯$mk_T:=m5op)ǹ ;ω>׀g7ki~-SjJνwWΏ >Ţ·\x ⌯7 #8s;OeiО;M9UPx-i4vjKCN&+uU9]_xw i£p>(Xw_φ$xL֮y)^x4 G#IQ kWS̳1ٽ, Ӄg [:K)" Rll( <#Ba_q?oj"<7~ >:.4}[.1{{y"u@tIsW<{_~1+K/zo>!xGYmoJ'tj)xG]arn/QN|۵[ۘ຿[[e[ł!8@;j (cƻc~y|*_o+?pO>z?ھ׮kQ@d5F_+?;yWy_iˇ|G֡?pZjzVZ cMլM͍ ޙ}oF9a7:~giXϳʹh)ԢڒiM4kT5eBs8T9SNQ' 8R((2IIM4g^;_6jw)ߋ,ўEZnZŲwko@4}yY׮ 2^?|:,C5YH[>0Ԥ3φ/O>wok1x Q}R@z\M6SqsUZp՜S6*NRpTld$0fNdsl>"幆#Z8,&7RRaZ0|Eji(ί-7|I ?4_xſٻ⾋/Z/]|F~h[#?e[+k~ auhmא&24"jm,]\;' N>Zt2QKÕxх=xW_z& l&¹~վ|^=F& ~%`Eމ?^$Hu "4>oCh]jZ}Z]J2-m/5 ZR~w k_}xuw:^5)N{jtj$쿉J^*0gXlʖc*pOOIbhP0 \cR0+hENyR\-+Dx7HOP 7 d>_fm yي2:kzu:cizY\Y]G-ݭNOo~;~~: ~_~7|'Xx_M״bxOᇅdW[m+ϋKME`uI<-hqIe^Ax.|?r?_q/kg<a3.W)˟ҟ |aCጥ`o34^Ҽ ve~񎅩'u^[NP\2&K)OJO|\߅x?x_l6_T? &ό5Qm/x~KuOO#d7=nY*qL9Uy[y|s"ɳ,+Fo_*̿k``bkR=xton]?>%q??n\ mһy:?tHPW~ |V)/~5ZVx|?k<{G=s^k>-+ k]цmMHM֏w^cVx}S6 B:8L6̰Xb]*n 8S5*u1Uh*G5?fψ=¯!;|]ccl<}|L'kgSOӮKO֢WA".<7O^n8|HѼ__1,d';-E߆tm4i_+8CUAqr 8QxWȲ_9/ V_Ͳ>Od8hO3e<"aaCX*7Ԟ tl~"麝#umvUOgg6']Vd^E5s_ ES^пg i_u|5//C k8 ]Iׂ|Mj'_fs,sa8jȸþ(eYr>3aaŸNuabqqUu|p2Ԕhe9^$>deo~-ĉѼ=~/sv>_뷺KCu;OT6%mkg{ W%ѯX\xㆲ^.~/xE/ ~QxjKy]ǪY,Ė/c%ꗺǾh=G4׋-ioY?o/_zMI]šfJP,vtQܷVp<9!3'Z>!xgwlIeqT*szٝ ֽ\Vq9>/ѡ#dω{ij|*fix÷1k>k$U?f xJ"[/쏡x~5P5 yQueiNA6]n֓C;NJ~#0 \u!s<Ȳ2e_p6#\|G.kp>+xL7a xW-ѽѼ77>atlKrZ)ֵ b Tڥ"5>4buib1N3%iWW%v*9v޲ݷ`W0Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<^$φtԼ!xN]eAt+8>,ubvoHӡp6=A~| l,xO [šƚlz]-޿]NN;<j>0PuV_<}૯I^AZq&/H_n6jڅj %v'lr^5]s:hzƫi|u3][Gq6Ӎܶm!YjT|D tPX0)tU_"% y|?54幸E#iW sq-Ӏ'>|8e^j|Hnotpo{lM[1}k Ņnc5F@Q@Q@Q@Q@KRtgN5{ -WIltOKԭ`ӵ>[k;y$H'GTtvS+ῆ4;=> o hY&6FXZmYf0YZCI$+؞湤2$3,|2lN; b21+x:.1U; cpl\KB3FHUè(((Ad=5xï]> wZΧ=GG/t/zuӬk׺~a]k:FO ~y_9iN2Ҷ qY~c~_R8l]lϩURT^ph ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@ß|[sh|>:>'VskKy:uXMYtɮ--uO k?{MXx"\/? xSӼ yu֧ /Vƅm,YiZk,`%J >IX[:6)f}vOX-I|a,z46:mw4>@}A@VL2g]bsId|_yoI;bh7iOx <_ hz~jkw u;.;.6A^h^om*α((((((((((((((((((((((((((((:Duv g"֥n_k@Ey-Kǚ}kεqk7"\Z[ ԧ}]cJϐwm-1}L3N<_xgw'Kÿ sAKjm盻|hb'aj/C_ :dFҴrŧ\2Go  ;=GZkĚ4OjN\ғU7L[؛}~$J(|RQqR|N*mݦXӡ[aj5c8BTN#ZE*pp%9-^I4|csǀ|yK|A z';º?[KԮu_ZGcHna 3[BourF+JV!_WW~ xf_O|QGui+ixT|^x< ;Z?5SgxEH~'į_~c/hĽCණywzΫj~0T𥖏h֢MQ}fVjݴTa qjVukPTJ:NR—-JrSJuR)FT5V0} >[ E.#qy(hgζ+p ~l bjt8^ L D1԰%hjV%ܮV5^-^{O3AԵ]F/5MgT|xbKj*IRCD{bnh [P{*e?`] x^Eo7Q.LjKE_*jg*!W/m8„NJTIʲ%)q٪ eYuz؜ 13+ C8hb(C p8tLzN~_ץno 07O?Ěio~4<=a/A5τA^׎Դ;O$O[F}YAFOcҼQwka(_NORKewi6it}cGk-^Z4g K:J4MMµIO>VIŦWN44+VyWeG&Tu26"1}jNkNS>~?_|`"_bZ,<6|yڶ|Aceg s\+H>~wpF,-7ÏKI|Z|3 .kkzޑPX/Mr[ȮN4- ~ѦsPq>BHJ)WïU,5XJhb RG9^:!q-RxR᰸Tc+b_W3ʩGc(V3\4>3mCiԬk-?mx?=A>5_1Sh < ;7]?B; #hY-eYJ*RS)"^٨bM)5RʝhӼ*dͰVV l3Ͱ^BpY1if[ W~*|_ OA1xmTXI;'OvwֻoE}WG{x;CxKo'@CSs/| VмCv> ]Oye~.hZ&=i:u?"I*uaMUKR.TcR8K tZJMХYF\_NkZdXLu$1ю X20+d4Sʥ` N Y#FxSc_|ᯂZok9W /g<+{>$ޕĚM헎ڮ&ቆ=?H"M'78ׄ+|S57Vmm&,>6bOմbQԵAakO Bݮ/KQk}\ =~<3+۽F:5 .Α!TZŲD7+Kѭ?IPյit+k iu]U׵NX-b)5 o\ԵgWt7:{=I}PX@|ID ML'Iei$lR4-$WBmbtKhn*%ga D3Gm<-.FP~#|45τzF>|IkãM07GAc _ڭ~-SV?<)kƿtg-7zÏj6Zo>9[욇o5gxW\.|7j~3P#$P*UTe]NXǚ'Rd)*Xgq/ xjUKW F6Q*,Thb1XJRq›<sߏ i Sᾯi3fٷý^֥mgOWk+UwxZƱlBkn4M7Scx~Y'?> .C'4M#úzx_ψ:'< W%~#PuEn]T^X> dT)F*T%**B#퓥U^RTzP,fY:}C |[V fؚ_2b~c<0K,j_xWm:٣`M;P~ i|/Q?t}k\j W^.K?64/?~9u<|8?hx4_?ᮕ(|'=a@h#%OQyǪoh]<ҕJl,QբTS )EKUFJYƜ*NQN:ύ8\qٖI7{_j7Z ߅sBtPOXVNJѧ]F T[J*\c)಼D8ldx|0cfx`cyz8<pZ1>yէJ(RF|/Mk U-f.)/=sU?hvwxWLҵ-Af/k[ _ԥx9J1R(9y}%:j׳=֫!UsEW+1n3)QdjӣOa^AOUX|. D#ᇕ/wSg|&D~-;;</[ᧁ~ÿ~i,u?K i1"!Mο+XP4ً*KM;|5?Q V]|/|^m54񦿮j|w5+haM,m4gJti֖**R篌XƝ:yk'B+UU]VsRuNӇFix,V NW;U*~Z<'έ|< \fNx5(xUtXdf|\3Ggcizl'ZM[{3o7?lj/xiv~ }Ay O?U/K4k|to_ [F[K?wƨQh5k~8Ct.s*pӧ[Ft=ka"J09JN[B0iqfY ĘN3l.=^/G WeK49>h.֫,ρ?>8/m W_o>:?=_PYM/{jwY:۫I䲃H%/̺ ߈zޭ+TqM}ៀgX\hI[osK|B;k?xRxE Y.6Uq% t(R2'TUkԌ%FUJZ*)Gęmj!QS x>147 G%Qq}(aq=ZUj\W/ OYh _:2j~tI[;x ^v]6:at4??|5^.ҮtOxg_Q52vkyipB,so$SEOU׾i{|sҾ1| ߉:o?|%_iZ? 9Z~s|4׎.ලk隦Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<iY(C_|7^u_C|{w/X&uL'/ROmEjKKMo/tֲX/෌5_+?uU8o/ 6g ˉf/y&k8(P[C,\Y0PY0ɝwQ'Ey~m澾oٿ&|'g5C֢ ɆL뺌^nvi:,Oo5~7y;<]?G}yŸ~"\xw`>ϡq9>#Wd?%FKS!ZR~֗W!>eν{vV7Xw.l2nK~ozgbo|C_Gԟ 4OWI__J' _bf9u~ |&STK7%έk7^W=aC{ŚUG~~=(~\}T ~1h _>t06/i|e[Lnm̂^])q|9搽xIͅi6ګ~z?>T0K F7K Pþ!m';ѓYCwR+~)_~gC6 9oxwON_ ~*75;熤?\`Lze\"\n[Sp~EKW+kf)lj9~OĞ.gnaqCnnk_ Uo7'G|8&gL}Lh6+<#/z5/|n,|QA;ɯOq7g?(1;o&z ] H~ ]kZxA_1iB5SAuE 1?Gi!̓3ㅲ)8bX/+p]Lj3/-O&q7̳51ړ_e?xw\~%|:%\ZWmouV-6g\_Q{5ҿh/m/POk^tZFvo_jS麏ǁⱼtWwSE\^+2^u:^Uor ،~7*^1S<l|zx_~ΜC|P$_ v.hO_ |J𮷥uj ~ |? ۟xs^׆5&XڧK_4By<][k=|-9ֵ jI b?tM,m WmU$.e_PC ˸w4x0XZ>E.3,n57/.Y,bԧ\]GWL?k_"7+ÿ>i'Ŀx "-<'O?~v6v7|aB[7O!oO 8/7ϼE48xk fn"Bbo{yVbS20rlF7bg Y|LDt_52]ˠ@մRᇏ>,Dxkg[_h}7Y/v>:F?:9\3!<[ x=WD<[Km<~+ Kr9#pY;8 lj+bFO,JyІoRX*x>A_!~1xMkG)Ӧ4__ME-xsׅ_ u;XQ冽m<kMl/x};w6 |9eI쮢{?C> Kb jkugy{ #xz8ᬛ >TsF#6`𸊙:N832RqxL-qʤ0Q?֣@?]-t)E1VMưcGP]QN$^#n5}jFk9-4.ď^;gu?>[V+7T/g]{* IꚗuMZ] !ҩü#ʖ]p,qvUf5Zhp+g/<'?i?ꟲVE.W|Q⫻,,ѢG.s=]~֟ |]xCZ/,q|H{+wu Vxn4yc :- JTҮRC\ښ-~?|%q|GŒ7<焸{2 8_]ÙO`a08>7x.;3!wN1X `~ҟQ|<5-+㾑{j,>zvw‡ᗇ-υoC|bMu;mgCG֠oi_4B/_ ~2W׏7Ow<5xxΓ|> km!<_Kݟ 3u1L 1ɲxf=ReGVl7ȳU|?ؼJ7QoAB[m:kw@6On xEth/<Oh?|'{i_t$>H_x4VU{p&ix?^iV |Q}nWcKN9 z\5S8C<\VaO,3 fao'My^=CŖ.hi7𞩨:|+WMy9o+SziZŅs̐z-?hU( 2:PSj Y!/Jz FNãF>8Kx\Fq} (f;0slvU{ wK.s?pLΎAĵ0 q+phWPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(ɼ{u/x>!w>si&p][^Mǀe6= k 9.!9{"9i ^/4_]JhxlזĨ9<>#?`5/}M_/|xw^?2ß茇× |2E`.,ck6jz?`.˛/ٓVg-Cjw-ӼUz_HEKt-E12O'7a/o5k+?Hz(N3xXIOPNNS%{)KSV#|>C:o? B5bjd+O /I'?e_ >+M)oqҦF)cIy#tI43U%)2FHtC4E "2RF:*NM?Zj+9w>bqTpX\"2xL,fp1xlChV3ZY=Lhz5hZό|GTƞ/|G:j:ͯ+Ay `𞅧E1#w3~)h~.?k͟ as@tˉu_%f8 a2Jo)qkf)G.UcdٞSn.rlpx,Z!> m|;:/>-֍6?Qx#W4Ծ|$U?:Vg^nc=zX{SླC^ǟۥWxC~ ̶ºM;~ˬ+Kn+x#_*>i_N W:"eqnqZI}W7u뚗%׉ZO7lOXln jmj8<UpUp9mL9f\$f2bxRJ&"xMP#@7BT<=j6aeƓqTiWM4+|7"mu;\f.eozFU΀g oե5Zke.fĹ}j8^s쫈3iU\M|ヅl.+ R_4L]?~|?x;w7ž#ǭ7exY_Š Rƣj붱 X,4t;6_g/r5/Bn/o,Z\ӚPƢVMvYkfT[c#xO5+Oc_q]|!bg ȰTie+*:Vy̩cM/i,TP<"v|Dό%xk×=_e]<+HuM;KmW~/6?o g %_G_~ '| u«k |'_ ._ 7u}_υ7sMOup#\.?ҢxC"uMyN1L øVoܿ:7?p83αl`@ͷ5q>'i_Oe؜VMφq؅^1LV"[,˰Wuľ Yn|s3Fo;/T wKAeqyxNw-vph;.~:/jQj)?vq_ x_6k:2ie`#X-R%򸓍q1<+1=< yS {UfmuڅJt )=7xNj>*xi//(^-G4L}4/z͍Ꮛl^[ͨ\hj%m >xUP|sMF~,szQwT"NM>$[jČ6s!!yW^(p,78 O8xlBYsSNZSS~<3Sooi>uCws}ym#=ݽ̶Eaj8|ECǺƣ:ُ|EgC};!o4iYYp>"ld),UI™>ayO-%,Nc 8˱:Zcb^w*h2YN_dn (KC}hz-~4jZ?xTᏂ624/B-:?|R4*k;N-F|E'Z}P~,|k#|7kGt[Sj~)19|Zv1 >_6Jh1]c7n9_>EeX&? Z 1γ χpn;Tqwc\ޗGkW 2܃(!G_ wC~'xPҼw<Gwm5jv?\_˨x3>׈4E5/ \zw;i~2W+¯~ xO֫o_eY5h-զQ|׺5}izO=*y,1EKrGQA+t3[q~䰹 ڹVIT0L*Z~Xs߱_|9աA'jgugmDŽ-G7lxEZώM⿉$vᯈ:%څ߱?|Ggׯ&S Dt~*m}_|%汩Mׇ4WK>e#yZz/qٞ5O02|NTq)q8\W=F֢m~6<\63*Te^.`8pocHO=}g7"|O2wo_ [M{2ܚ^MZxQ>4|k{K{?~:ǀ_+wz?#⦳ Fu<1,𮆱X&&-ٓğ ~*|? .qǏ4oنsE7Z\;~Dc@t/H?+1wHuJ{Oxle.,X ;dX0lc.0If8Y84xlMyVPC^l(hM7tUw>xׁ|cL[kBִ:/T}gKh:Hts_^>942>3kֱb͍njok>_oExWuM:>0Oo4_ x+M`TKHcU,dz ⯄^|Kvy,zy+Oaus ]b* Z+H&S'1B@=j+&2XߤF3ʼO\>wo?g^P^]7.~/־(HԿj Ɛ^i}=V&G TtBD4߱W}JV}GU='ŬV>+4 g^|mgjg|ֱ? x_þ&BO ]PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(|_~9tkuNtK?~"x"k]>uW^*2cM4rO:[E,F|!_-Þ#>140|M\Ki=՝ֵ>.cǚo&nBK$%¤P $qT@ (-I/a}>ӸkKhWA=uqomsmIvE5O:?o>xw?nÿ>+ׂ%w]KQ x>aɬthmwoqh!d|O N$'Sմvҵx ^NO%'Tyo }ᧁ<xğuSC|-xωK?i z>ois\mγPז{5Ԗ:g–ڿ]5_rXhv^;o]Z!Xyu22ǧh-Cj:: kiױhڎNIm*i׺gxzXӭ/ 3vs[G-ƙ,{~ϓ~ӷo?iؾ > Ӽ/!SZ{}b.ن@mfҕOeVTԅDkIJ׳k۳:8<>*0xzЪ.^g sr׿+ f<2?Ma3ZDéx(~ҳ[BG?h&p4V1xQQC_h3~؟ ,u?pxA|ռc5!վ5hz%<ǀbҼmy˫Ȟ%R/\N3SKbTtUOOr~S7++fJLӈͧ^S^'ÿCSkҽΡ-ɞg ?,~l|W7SKo|H|5/5,lCe=;%39n6BUaΝvgJӜTrrJGWgZK|ϲP4]|&i*~ x,. QxiP:T/p-hܿ |'Fp|#<(φ>XmxbJ𝯇#i|3oFCMG?-_-/?gϊ -SE~4xMoցGS7ź߃n975}N]x|-ZqT:^X:p):ts׫ZU)=QPoKx-voW<5drOӯp2RXlK x֓P4%,5D<]voK}Ք+c6,lK?|@W/3]º|,7xsHfߍox;>YjWjV[xKFHUݽҮcNWaUƥ~z5i֤]+::RZ88| y.|jH4/v=j:.'XxO@U]|UeW8 !~? h ~DŽ1%]?_*ëxJW~ 6U|6Ωi:i?y׷P}r̽m7gO9s/|?h ~Ǟ>%ZEUÿ$a>!?&-Uӧׅ3o8 ~~o3,1m /.aNiJ>:Zj_Y#Ɯdy:埽q1\ &&1?u2fqΕL󥆥V3*MVxї?a_YxoKx]k\OoPLɥWZ-OG;FXne<MtgoSǀ^?$>ou=;}?Jm{S44jw4f掠-&W՞I>^[3GT30UBxǞ5xk> g^Xn,tm>( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@1OLZI6hMеv7Ry,4I5l(dhKix.t <-5+o{2SoiavZʹ[KkK=1b7"ZΚ6/⮏WJӾ Y|3i8b_*+eK1tڑ[ K4?öZ^Y[äX֖E#Skmbd"*m_,m"4 (aG=?t_#B_I??Z*\H6iep3_,;,- Y3 ]Dף\f-7Tu:-WOc{5$e4آuwv7QŬJ'ºŷsSNO[ºsEĢ jIOY#no`Hf89B0srSN`ڳZn][KGM USOS UuaѦ^u#OJZQʒ|tx7ÿO[>5'>EZ4Z*öҗD7_A-3G/ӵKKƿ[C~ʟn|Gg O~ >Z[^? jV6QYeơmCpoNi{LneMTqQSN/4ҕXU̥ /W88$,qXS'8GqRh*67*OlEVTkaڇ"Q|;?t,>&m/W~wA'>}];x3_><{}>W<'"x9@3A#_H9%xL:o^q[ԃRQ*ӋS^IV<"# S4PgOK{a*#jԌU=$ؿ-wտe߅t|mCS_^Ҽ%xW]l%ait=B{m8${[eHHM#Q'|wρ_g;_.Mῇ|3vv i{B~gZGmuxk,/RaK{W\΄+TѦLM N {J^/˚}|=\F726e|Qa%o7ql&Y)}g2՝:O3S}*V2gW߀_~#Xe_|7 <kV<'h:u;jmO߃~#VQھ i 7%ͯ_xA4 .6s fGj*UsXcOCK餶 S FӴi@u~NSү繒-໴&Hgh٣e)cfIъN².UYPg?bF**XpsN2i)&¤ZƓq^pjt֛gaj:iwj/ [;Hg( *MkIS4]oUӟQ[3EPW,aqeͤZ1iq&Gw>feGV˱Ա| ~O12iCVQ8*Ӣҩ8Ň/~|o_? %/oxS[զ% M-dwUU- .>ͱ9pwj~Iai0ԱIrP+Jƾ*T HIe"$i%FT8K<;3@M3Su6Xѵ_Hl/U.KO.,/dH綹H'XVteTj<*ӡ:V )QT#V(՝:nJs*jh/QYVtƓk˪ik%jf=({ȡ{{Y (g9.Y5ByJ4(խ(R^qNu% 4)ʵzPRqF'VF)ӄ7Ŵ4xo7妁\Ʈ-Xjw㳳dl'I>K;;Au:gä^kUq]Ρi>gCe,s.ϨZg̱gfT2BqS ^8e:8P5V4%q੼,RRSa ?ho?!'1p-|Kω /#𖷫peH7C$nw+Vxᦟi:_< uoz|>e ]faG7%I{z\|:c߆~?Xho?k^R95~I׊;mIhY%]I~|~M5|i45_MnKmBγkgpVck k-^2~#%(9Lޮgaa;%U0xx7ZXztW@p5x}ׇu ?UºVt卾X7ijAz9w5fyV?'T>ʳ8Sj`seuT0b}G{E:UR9[Tg)K8Dw<[ i^Ե]/Ob%aiY-㓪n]eӧO00+RuagV[SxS,FR)VZ1 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@9x_E5?xEtMON.|unWj.4vm$ZZCnvO+_>M~ONg^-$E]56E薂mO_e[sz 4#Fӭ_ټAC"~orQxvbԼO_eyCC*iuO(o\mc/4 kv$ΗL5MJWӴ(lྰk+0Ik+V3EvPY0ǍwQ'E6UW;}?}\֢ ɆOƾ1]uJT%ZJѯZx,}JUHU8U aQJg*t?ReXJy>]cqY<֔Iqe~*ྥN862l c1YjlUJ*" :~5=0f?ڎ? ~$BGkS+ |:~)/-WZ|1}_-xwM7-ߞKk_N;P6_ ڱ mcSN߲7 B,ls<5B9VӧS N4VZAU˖:ΤTu%JR8<$'<,e0x<ɰXn&,~VGqxL¦*3#|AŻ8pՎG/kY-,NOz.{{i[k7iŬu:\jڿ OKxR/0[ۢOvإh_|8>tswi awW +&om^g]O>#׀巾[ Zz|?IQ;xYdQxpcO [%r63.[qeM/rep>h|$| ]+[д }{R$0׿e~sOO$iLJuOz?i??EWKЮS?h~Z"xޙuKCm,i=<\X>%esf_*xqY¸'ȸ]d^29nC[:0U2_ {+xl Ozxo#|]/Z<{֭tMoY={%ŽVx~h2K;'-D|7g/}KYM7> oσ<=c:mBkzCcsTeMᶷ^5k`߃8+}G nɸ^(W%O{W Ftҧ_6:T|4(>/t YO>7y~)xۆ&KXsٗ,˄q7po9>"? - gyaLym\OW(qYn>bjӣUe1]x>?|"x⾗sYo#u6guWĚOuޣfךOxF<<-1Kqc.'w߲?d߉~$~txgT㿊:?Zx{#~5+kkcM_H(-Ǽ)|r aGN  *5)%xv_ Z$؜|a*j y k'n>@h_y+lzᖑ7,] $ե`8+W)q3QʳzuodNs̋^ L|N?/{5wšWE+|Dn_ Þ>c4$tj?xľ#*xƓZ>?%zO.<5xZ*9|S{K+~Ҟh/'c~͞ a(h+ͭ|%aP>S7B|Fnr>~,WVW[G7\xXX~ xk64U7 4q$`x[3|6 Wb<7xwe,NJd_OK2( b˳7qk0?X2>_\_s]O~NjHҭY_ i1j`S0Cs?8|V`F S IPXTZI%MSN.jSWEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/8OH4GqoyyBg_[!šo}{Mo4 H%olh,baym,P۵u{5i@㯉oZԮ5- z}ws~𾽧e?6lФ1:ΚK6vg}w6KeAk}i#"3^[As " (KujBX~S ,d+R̰A}knI\m@yߊ GwZhwv ~Y⸋\OkuG>$ϥ@> /.G|)#/7ZO ks;Yj&koS"\[M72IQ@Q@~ƃ{iOisMu ഞlLeZl5{ iz*7</Vx\V/B,iqT1uTUFR˰Pqpe*`Q\xº<7GZrj ^K5jZm ucrsq q*ul\,Kౘ0u] fC :85XWUFg :ua 2jҌi""(TEUU@ mmնml x_Bxj.yc\GZm}c47iݴ[,3eI"bQNQEQ i 0ƑCHQHDDQUeOG.Vx|V'J,cRPUrQSK(STۧ:\¦g6j:}_Xib=*k$=KN]VS GM,LF.쮠 >ONio>!|OO>8>>1nl4ֵgY'F3Ohfeke@OG fy%,/Sͱx؜Z8,Jk,^1{\`yf>bذ ++^AY] {Kyeh.bxf\ ͼ7`$DU<=xG'|5hޓzfnZc۫3kkPwyP3f=K _`cjPJ*514)VF'J# i WRM݅БmXV'aͬcv =O bHdIXgs'|?xWZm :~6jk:UV:};VE w;b,n&8*|jA(ХZ<*XD)'*\bI64W(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<<4t.'uj8OL֗<_Dš^[Y. 0Yi i <o)>X_+7-sW|3j>4iRMx=*Q)&%7h>1f?m1uIlWC^%ΥwȷZ^-]w ?IQk;v䴌qj<'w|kkoe._ZZyg֞&"b rd 7yT: (dλf6__7ړy>wyښ~ɡkQ@#w߲ޓMb)<.' :_5+ xcw,SMưC5_3JL~kM׎YO⯁|''ǃ|q&֧sk[Gwe=։-?I״{E:^K[+k;*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@syhBwx>/ 0ҬtI>(WWGf[R.DSl_g<=Oiֵe|@5h_ gڟmrS ,]sFcǒx 01,|C zZsC|7;j/ 𵕴gVojiSxiomnb7߶?L<cSO(N8tT/3H]W?i9v/|C[%gAʞcJcXF0Q48W]~XG'NSw g)QGN0JxTjxN3\EXTҸo~$o٫zׇ|/}5otOßC~rמ~)5×"ҮteO)ǂ4q{_Yn-46 uys ^EW *UbYѦʴє\cR)WUU58TNI'c)g0geIdjjY}ZsK8P ЭCքa?e~? ^zh`:G>|sw~g|5{|Qkچ촻}F-V'`rq('TpQr£EoJhgDXCn?447[ӗ:5Y[jX5;Ii>o=دe7:JRUJYQFgN*CFT״ZI+e~LNCp2Vc*1Y~6# Q[ Z%JQ/ DRq?}U.;D6VLUEom4^|C:3l>5/5Z:y'toY\Vb#fi4em|=i>:uՎ6N&wva46Zͬ\/SkM78O[]x\h&}B _O4eWtmL֥ 9Ѥm*Xu 5vj2j2Mqsp~ϟBwQx~x_׵5MwQ/oKj6qiϢxSMSed.?k&C@VL1]eIc󼍾gy|'mjg_k5jzVZ cMլM͍ ޙ}oF9a7:~giXϳʹh)ԢڒiM4kT5eBs8T9SNQ' 8R((2IIM4=[ğG_~?lk~&Xƾ5_l3j:߃O&}wy95-J?>"O<3W!<-AxR_>)ݩhkZ ?ÍN[/< oF{cX_S)Q5WMUTN~U O8 `2M<<^/1?gf1ӕV*MR,¶&)Я4o~x_~;i̺"_/Fn^nDX!4=7ZMO{(Em]:ü+|`׿b߇ kX'~ S'<3 C*Cxtz͜<{jڗشI_Jta~xcpR#Q(BI`PTTJR"P&)Yu**7FxċOm_ZV&w~.XQ៎, JG-xG▭=? xú}%EbQ?o (½*#I5RT\ѥXnF+p>e˳5 *pؾ ʰB| `qX8 /S_O ъGgO lR_clj?iM!S |c]k:Γ?5_׏|xڭ6x_8F{޼>~(ǟ~J,F>kGxk\ҵ x=í}U쵏'{`# 6yUh9R1<&&$FYFSN~ʛΤYR8NcJREK:̮Uphq7S/+̡Ke3L59?gաWӥZ*z"ϋC`cEڏ V .CYS"dյxSvz>G}Zi6vkꚓč Pԥ%/.u+o-\Xc] R#9(AMю&<_VTOy3FX^"kNTfJp)מq˙KSp?P>88aJ$I/|5&git>FXf'i%vxk}̹;w|}WO{᷈ ji.ݖjvR\-rd5n/CjxK>,z_C2eh^1?gcE<7{mOGy.vDh]Ēh Y.-Gڝ<>@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh;OgO}Km4OU_8koB}=#Ϸ_]F'ht:N|Yմ >Fk;O^O#t'zOu- M_֮xR}z-4-. CQxڔ ~0d~m+5o,z-ö2hi2%6#[;vcm!;W4ٯ.4l洷MTຒ$yԧ濴Boy.a%A&{;fs ]( ķMZUXE~fWC9;5ԥaY%0;h 4rZtPY0ɝwQ'Ey~m澾oٿ&|'g5C֯5^}(^F4oq "hΦbkfIln:RJ*Rr7/8iRkٹהaNJRIʜ}]~ %O [,GFc[)SʲO ƾ ank'xƭ<>Qju0vt|/VC}J[Uu;B+yc_ ~ IBʖuoOt^uy.?m:/O_xsd:^,nGMŽ]mXt>YTd:j~.fhm_TI+9('^X2g]SpROW 9NRbpOOJZ8:igZqF,Fc$WaoB8"fIWbT1җ)ߌe~*#7u Zk㏆/Acwr? "Sy7?i?x!1φ&ݯu-  [x7 k)EYDCsm;LKIR;/<3 C8:¿(/дZ>wsx{ jO,m,4Qi*4 ab29\gS1Zq3S">㯀Wkx/5)b/"T{A|Mv/m 7^gZM8iς1_<}cMoHf>x> ⟄|:S4+4"f.Is|Dbr%xZC8s39e\ &1(O:ɰy'.Ⱌ9fO5_ ߎZw>7?*SJgжK:>A xoQV ~%爵mZCӯa/h? ?#~KKm"MFo%F`Ȟ2[𭶫+ۘZ|%ȸO8~gq$k/|@i'u[K]C:{h>{yix6\爞iI5]WItO wo xS'"g KGÚ׈9{}zAN}O^JD^[59\+סl<zg f|l-,eX:ф1j?U)֣D9_ܾ6j o|@vmo_|IF6Ky{ej:֛\%Cn|Ms?5OEP hC%|)u>>I.R,^+gѯn[12 f=xLN*Q8 N dN\L%ԧR?">14OXB?#C<5;^Kl>:FpZksxfǾnco m'..2[M6~MKBݴ}6]Z`Oa~%Fw[ 8_c2.;='Ͳl-qW<++TxtlZ[De@m?Oxǿ4=;EK?^o9luZIc㟈:>$2]s>>-K|oeW`|5~/?BMyپ/| sº.GBg_ |AthoP<}XGk=?SӦ1 v>cx&sl&nQ/<819' S2qySO)[ыe*`Q'um"ÚG$¯ eo _jV6ݗ/xb.!> ):C/;E֯?6xĚx?VEƖz ^xN;7Qm[zGDе}7QX|Msl,"ik`8s8W˰Ef-౸Yc4_8FxhqÏڿ(#swh=>[-g|W'>0YmhWIK}BH剟Q&u߇:-֥o[:]ˣ]:ͷ5ÿm zw}WKG|oXҴ9ol+u0b}[Utu4ZKLo)$_M=7DmR/|9_\]I-/[۸<%ag)/ukCe5m^߁eIdt3kk,}GK2G*a1yw5BU6~׾>π>>|WO|YW_|Q3OhZ?!9cSo׈mXKnCaٿ⹋OMOew; x7PGO||?-e"cOuҼe^~+LJh_ "gaGO: 13bp\7c15M*̸n\ 3js=Ӟ2'?>5}yx[]M|ES_/ x'7-GI<[mi>u ?Umem,WǠ;kغ_/ t_~3mϊtx$?|'# sV ~oc_I/|?iq~xn%̲x0r̷^E<,ʲz٧q>KJY6yC*C05ºynoKWof RX?WOlj|3x+\:<;GEόt]7S'|CFM77M武\zkK w{'Y Ʊh^ CK5i__t?CƱ|5oXbi&/}v/2KDjobn8pfWfx/3 q8J8fy_,9nQΪdN5ͱ~iD8ٟwN4>?ǯ 0^3 f9xPʟ'|ù5M-m |Vq6wZk_OyH|'O}k >.xkVQju<ߝsBM|kG]=-cڱY qxKMLx_Ú>,~KdAe/&w>lR̓nQ@d&uF/7;4O'fԛ󼝞.#>M Z+&31y٤y>~/ͼ7Oty__h`P_oB isAF#[V74Ch4Iu|GEv6{s3{o½#?IJjV^_|;4/Zukß(߾jZ%֣hִKhW $p8\M nk:TTJ*I%nZJOI:J_]g9ny}XXj0K[+B0mRx|5|~y}[ (F1Xe*Nc'lNa|3]Þ1_hvKO0Z4}k{~/^!6 IZEƱꜦ-eFx7~ yƟE >8xrSV?h/[дO:HдO &{/e< QúJr.DF:Ҝib~u%S0U)?38Z>ᚙ#!bRY|ʶsa:<7M] 2*>-閿<1DzX~N7ş OXZZjG+EWTPdC嶱Tu+}Jc*+@81+A&4d jK2jʒQQJZqRQJkը3`7Nx\F7 KEɸOh᪴TبEOs^.֍uÞh!м!O$ѼY;٪d_'vgFӣ:8^!'x[g<}8\|6E;ǟbސ'ƺ_$3?xŞsOU cW5ζ~5Kg#EpuL&YP ^qʰXl82nR1l fV fXH:c^KPM? |^{Z7 mG'~Z-_s(u]wLՄpx0^^mbm u6M?| _?xnjηV:W%?o߬^🀴;M /W o1.\+1 R2LᏆ>/L˅'x׊xˁ1 NG.\519?/W!>:3vx+A xcE T$|oAkk; _ *7nx+W<W_Q<m+~ =Ծ qgij)D=il<[mEл{O,þ.gx-~̿L0xSqVw9&Kb rL xn# WB8#ƕ|o~5xx찪GAѿȍ5k[' Jok XU>Yğ:hvi:. _Ρ7zϋ|qqcrG|Xt[oZAk>ώr^QǙf2>N,|aҡI\CMQζ2éҡZ]^5X^Z.a>1{7¨HSG⧂}V^xƧV~.>wcwXZvbZy_Eᯆ?#>~fx_oiCe6xQ+KIm/BXb>*8 g9d8W>㼟2,(p|LNoe?^.?T؊G5u<&YJ L>Tlŷ=Cų\>Դ~uj7χ^6pj6P(_.f :Pkͧ'\9bNPϰv3,|/ r:pspEW :4uuS~aSƺw ᡧ|wFxzR.ŷ|3io 1hB4$g}흣<1 +zc˧|F_J}+ Y𿂯$% ^xs|X~#|\Wz?| 8<;}?~̟숾Ӽ.53ZK۟Ѿ x+c៊%|G_Mv=+Z'CKu:lF7xzt{M?[_<:x<7zG=hz0[tOXk^{7xS+08Fg,pr,<Ço d[V8sdXL¾#25qK<8߁4|zmsc/|kx#<_>y_?d_ts ?l$D:JkTee'6~+D_OW}gDƾ,/MN a ׇ|u>iQ?5u$i:Wfg[F]2 3n wK<dr,Fr_0\?Occy]<&Cz9J3⯄t_ j!xu/Zxjд/n/M.oůIi@Ÿ߁'Hitۍ?~#}k/t>:|!xgEMoeOSԼ?xj̖o{]Cū|q*^-_;'9U2|)wqSԧUGdgΩ䴰ȞV@|zckl~\oğxwgew?_?ixwZuu3žso&Fž> [+60+/.s_ g3X7 v#kP?ej^E4:ǂlxwÿn_>x/"wmKNg3|>luy}!\h:ڑj9٣ 'kVFo2д;txH|a@GjViqjslu8 {PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<[ÿxW/)kDe/ҵ~n4[SGInmR-icQQ]wym|JѼ7mhhzIzxwZҵ=].?LXK[Wēg9 YSWj> sš_d-_ƱK|ڧxyujkfne=mY_g?Bl~3Þ nno,9CCwx![f8I+[8LvѤƠ( ķMZ%hMh~eTA8K-I bi"#k莗 ]k@tP^]x.Ǟ.~(HƓj.Z}|BĶDteu->ل_ï|8u۟K||j~(^1/Oij&ǩy? _ZӐhB6+YLJkEO]aޙRš^t>kCyx 6;ky,߉$7Ej6j+p_KD_kׂ|G 6/nMJꚙTaLI:g\;}#G<)qcgxg6 ?[հ?Q[SUOدmlwﴯI9;7Σ/mN=&/izAc6LW^ZQ4 gf߳mCh^!&-' {浯h_,4}'I5ca. VJ^[ WKeE utYOӼMU]B{xƑCS#|#=|[HLJ~-:ψiq$&Y_խ0Ѿ7Izmͣj.x#֌G GeƤ\jrSBpQURJ}N 4Z\[p._ae4qUI,2j+NtK ,d)xnb!IL¦k)N?coHR>_ &U˧||;cо*[|D?h-V2G7j&/~xH5]ھt}Sץ~.|{c? UOǾ_ /O#x+[!kēVM Ug<#45Z\Mk[,*8T50Nt,b:5# JQ 3c+ek3ipv/< BT搭BQcNV)Ѕ d*T1G@'?cfjZ_i? <)Rz~kGS~7ox;OZ΁6i%mtWTN#?o猼sG>GoOZ-[4Om}Ş>K#Qo6:$?l|7"_\tYFOѽk X"xxK^|ac>uͺlA7~/xo4 |~_RtӾ|#>o xPB--޿,4WRHbMb+J0%˾.JQ*tgɈtc n3LCha_ZxCn8qQat9*eRy}u/|ndžxwWA|+_|o=R+_|X/iݿ>߆s{6hrk^w/_h >x/;_z׉>xsZ?&N_Mm'x&oGZ.j#% [xkYb[8G?mQOzbX|7A5x4t:A5ψ-~C#^'xl8j,aV4eV߲Z(~:4)AJKi>:][UEf9e9as,BJK11RjNqvuOxoK5xE,~ ׃|Iw@j^g o3e_zg F,w־>h1Z ::|;SUv^R-Ceo|,>o[~J𿋼z W|·})|9>)ѵo>ܶa&!V5(b!Bnr:؅j*7Ir<6i j9x<,jR"ƿӟh+6oR:NJ=A<%UyS6Z. /F՞0|2Ҽ/}M_/|xw^?2ß茇× |2E`.,ck6jz?`.s̹-Bp ќ>~XҥE%F)G^ۗ-Xc?X p>>+?cC˥[>-T"/RciSU5ٚ_¯|gZ熼Luτ6;^|ICúO#GjnH<4M6j7W7e~~t|N'Ǿ7<_|Qx#Fj uj>ǀ<gķ: m^RMu1e4JWE5ۄ/F3N冤*jsRʗURKX>l9*i擖mWѧqzmJNj8⳧V5siW~Ⱦ>0Ѽe/Vv|pF#⥆uO_~/o G-MdtmEsgJWzG^Nهšo)xc4Xՠ~'A};x :!W~ 𾑢麾]<]CSԵy7ڕ–cQPҽZs(F t.ZAYUzW[^ )،%\5,l\'ʰRc1K)')fR+| S|,uo/ύe fo{ib\GN 2Gs"kworYYYCe:.ut,r<*gR4P**jIZu*[K:m&f8ct8,iE1`Ab8S攫՜)Τ&s z?B^0}5ǒi}R?!K8EkSXt{IMZR>LtB y-/lີW{y&hREdq#~R|\ş>j_<1ῇG⿃(+M]" eGM7Ok/^cZllI-gO ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@!E }R<{co4|#ź8-m-2뗱MnfH5f4=5KTWzWo}WH|9|.񅷆xžѵG5"-T3]uYnbkç&8nMu? |Wn 񆱨x᧎O"M>CjZjzUߟ.u:v#kP?ej^^ko¾)=xO]׼z喯wPi:'<9x KGkWޛhB _ !=)J0Js4!RZRRd/vWI=:5:J =jeTj4BuiJFQTe '&lW8xCχ<ol&wN|S6?<7$_<=6 vc¶: xKVQhj|/콮^^c'|XM>|oĚ|0ڽO5е/iF,L(ҫ{VAxYcIVՔxUT*\#({k9ԯQɖK+ʩK$$p_W˕jU9;^ XlUwH?~^%k6Ÿ|¿~ Xh'MußLbE=ԚoK$jz|h_l,{L LFj躕ï_M~5ioօgo^~@;iIxJW~:ƙ6" <ž%9ΓO^tXiSRXte N5e'8taxge'{Q987_*YlrjEOTrFt'GVw~_r<]SǺ>b' ]hW%Ѵ%~3~ПM&V𿍴 Zx{~_:9m?xFx7S᤿׵N :~}NѭlmϦveKtfX)TN&eOC MrKJXzP|wexf CSq8h_)R`EO eynMxz )}70uj#׋|5]xC熼c=?t/xS񿆴@-tok>}kj/ݙѴ|>7~B5+7ZMkj:%΁U՞[DS\u]-夑,񴨠K`sGx V7 :4a0U8iЯ(ѯa:RZQQI¤$wo )!xí}j~xsZUEz6ϧi;ՙ/.}?|[{χ5uj^)<|)/>nρ|9Nq7ĝ3L ڹ^WS/ȳ(Qեͱ9>cS,0Fgp?O0f,xN_aꇎ^~_ρ x)/]sO /5Cy=K?x#`kO> ;2|;~ ᮃe|4Og7OVִj :o.Xk:o惡K0ÜC- pج>`v[ű^ ԫ_3lp]W$ጿg5x>y\Mâh_ty]o^od Ρ Wσ-+ghxkUt]Cn]xjYKd}@?Q~[t9+xT,E埈4x A6>>%[VqB~SH<k60ACx[@c~|G)GHԤ[#VxƶS"t 3-ʰy{ lifXIG%|?G$᜿70bC >X\OGZzuW/< 6_xX|Q+?wh~t>~xqq*x,˲?c85L='N|2)d-*tx78< QYaqP} oΛzo`o uGC\otM?[/]rҾ6n8hkK 4TQ7_~%xƟu'mt/sPƾھGAi,I|GNmZ h>=]I4hu_d}a.-Ě%b|+42Up\3naXo\=3L"_< Ψx ˆ~C%gٵls/,MKYw_fܾ-=?~@4khе)$u >>x73fMR|\5j4XLZYg^pNp50έGpѢFX((((((((((((((((((:Duv g"֥n_k@Ey/:mu|WiZNxg/OMkη*+^Cw,pIK{h⶷H⏄> 񞅢sg7Fvm'ֵ=':/o,E{^D.䕀!W$^4M;Z 'h~Qoi>'7,/mNOpLKFѴ:n[iz>eoiub[++H{xc^#FIf9gfbXiQ@b[V_.C}9p& [1f{면뇚=.Xn+>+WMZ";;LYHƷmR\}OdW~}DžnEhx'64ğl-?#>*w?|[Giq~j*<36 [|1ׄ54; vF NÚ+PY* S9FȧJX{cY)S k2jqviŴl<̲ZJnA*xY#W bpؘ,eU14\Q'*m4ٛ%i Z-VWƯ^6KKMCJt~ ⧇/=XYxZ@?/-ܚT$[_/m~'2//%h6Б[>65 H4{;Qņ.TJr8G }:¬2աBl(d؉С* I>' G_|AἚ>%|]|kEkeG.36i4K4_!뺦"I.z:8O x7_i_zt}JD%_Mauhl-CD}CME:^5~x7ë߅ZxIUeivN Km;K¿7z-ož 4.x=Kq>3'g q^$[0*yLp8|#p84e,i`1VBu!X8/~˟Q:=N8!}o/k(, =⯋$V#/m,4?x_h|1uxCWw q1ƍo-쿈Ns+`kẔ>䔲 G :9> 6@<-hl`t/i:~ociVXYŠVE1Ey>|0_]wx3>"Wv^tHj4ok}=ɇD} X4 N4[?9>k; fn{ᰘ9gTjpЮӣ<*JLSP{*><_ xg> o%YF>>Au9[?o:{W,LaןR|2_~s|~7`zZْ/ =x&t&ăxĞ"\ʦQ,Oḓp*|'d;n*upYm'XV21S_#6J6]WG>/|h_T6>xNSO>7x4-9l9qqo 'fakM:x~/<+|Bl|Eæ_xƺOu oxO:=q4 vO?4r/f8$|w 8 S!_5f\v]C"r nCdrn3q\1TƇ/ uYP+Xͮ7Vҵό>6ޭ [\\[xO@<5m<,TnC ߳?x~N*ڗ|Uψ|)Z23^Oᯇ>VľxgNtoCWxwؿT<|=S>9& 5pZ*,3 a1U'ÿG i~"ѭtk:-4|o7i4UOBUxL&v8<-'[X\?ʾe+8V*b:~|"Z^&Ң'?5Z.e{M<} xFQ1_[rIm)c  ~X|2}Y_]EӞ=O^T&O>_Mnf]zRubp'd5yA9C2C.742lmzfQp[BE9~r.øx4!ķNXʾ_ xǞ3eaw47hOnwkagkIோehuk+M'H Դ7Kա4_jV4Q'|?_᎑Woi%ޙ+^όup]x^!BK_Qu}aC:u܍̧'G'fW x <)㲬!ܓ!(TIUC8C s :?_j2hſ<+ElQ4~;iZ\zg=7OdX8 |( gk KO|-M ;X9|k|06VpᯇZNbPuf~.qn2u$`0,nWP刕)lt8S71ye|~_>7:ׁ4u֏h:/67kEm6~6Ci6~Ӥ;&6ƿo*wLjχ7_$ğڇߡڌ-G|%߉4\+Yͩ= |15NJ⽃J5oAZxq~ |hL5|5.|CƉI;wƖ˥/wO_YքzZ- Gh5Y[~.$Z xJ NGq2~!cs<2|O?2|<g)d~Q fg1~9oK?*97Gsc|/|e)|u kVZڦcBcXgï[}XQ |1(58KC}3!AZԵ[/X.k\ǮBG{۟|E +JF/.ukrcUξofy}zS>jtgS:үRasV";qV[K /7ϱyqwWE~xEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(~;~iо"xVմsUgnBs+Do,UM!}WP/x_ͧ߇ĺ_&qg~6f?56:.}yah׳]MIa G/t~26"?GOWnm|)[{@SFhZ,cui G5m~|:M Z+˾0|1Bx.ǟ ~5|>n<[I5m-]/V^ks;Ϧjijtg\=|xVf jN4߅Z EoZE__Ϡh6w gRN=}yۯx2ğiPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(>)音]i:?^NXc%w׉&3=Y̍yIh|{fk_-?Z|oe?C}CvѼ k %Z$(Qc#O>tk*MWD|@Z; -CQK}:_ h_g57|BKKmV)t ycgRQrcܥ&KV%z"өZ)Rի8ӧNe:*NJ0!9MF1rI6;.kin6Q 0y/}x~n@5[Mkþ!Hҵͅp\ZI~ڇ~xß/_O=@>_ğ|qᏈ: [xSO_>Ѝۛ/Ad%k +Aoo T]ЬӨγ5JTS5}Ԛ;b3)y2.1e|8AԎt 8A95J,}Ebyvis뺦6k^jzZMs{y,6,1e@kuSC^,<;&|'95{*txwDǝ}z͞ő]^\dnqWs''R~ 1rs nSU߽5Wޖ t0O]aХJI1-ҊЌ#'ZuJF\75 >3(G_"CžҦ!RQ^j }O}Mi p#GV>`He`  #GSF ʝjU(Ԅ ­9Sg9BQN2\k]+\n]e\Xz0،67 _ aQ u)WSu)N1RQJQYaEQ=7Du gY,tH]WSt6KCP+[++X+{kxi4f/w߉4ɢ1zƝ>ww4]Ml.nAn ZFjP+M-(MBNcV(䯴pѩ ӡKJrOާTQpZ}/z88EI> x#gƯiSE/|7nZ-hu-WivxNnDPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/>sSj~ o蚞\Y4=E͢\i1kI-8",=OKk7W_O\~"<^rGizMߋ5o^Ca{,Pfq=׉bMx"@<t|Ua7:6iiP};Ma4%r<5uxš OԣO[6'ҵ)KNxmCjz٤[Y)Ϟm )㬿Mx > l|-PtWnz־鸷ѯU(a/Nm<}ey>v#kP?ej^E@+xKMxMƱ]n_N^V 2"vi= 6Y,;y+n:sSg׌ӵֶi|."up)]QQd~YEz~>Awek 9~$<xgOx_dzWSt#o?&wiY+:PTY3S"-s϶Z|8-<-wֺVoI/R[_O];hOgS1ωYmKMgI2ƿ~!|?)~ RI x"[o[x/Źfu 65 ak%xFJ ^ڛ¿"iZh~$?/3;߆>46D>)<5q{uQxkl+>qJ8 4cZhPOBU2S^Z1MOعGǕ~'S[2c,q\a2L>-a>Wα8l˨iWNuVyticX~V5M3oo |JZg"/2|0ֻtK4'#ğ'݆umFOo xo ?fj?ψ?d~)|-bIj?i%ş?x"Ox> mĞ$~Isy` ~Gg_h ~!|_OIu?w5eg_G|3H>h |[xVkNT1NRUqL=LGm&20u+PUb,8Rs(S ijfw,-ZUO \+rqy9\(Qm)Qag(a0x|V3 /|L?g[H(ۮ i߉.qk_A|e~)xm\Lo>VM7ģ;VW?ka|kO/jV3Q?m?4Vw t{_k$~ ԣZhZvmsK~%K9#G7>YAt/iܵnDKY--|lʫaNt'OBj:xyЭV$5'X?r2X<:pZ:`kO,.U[r ˲YOu?p $jNI,6 cA| gk'/&McE'Sᾱ?֗sž C/iūZaķz5u/S-nִ(sb?g:2S!.YYQfX]+QKuCKV:TZ=Z Nqr^IʍAO f7.cKrXǘC NI,b' T<LlgGQYH𦁮xh>=[)K #GQԯ^Xmli)$*݅jV2;T$kqe}\[b#Jc4CmQXb5~hZXTiWK^4RII4ٿ>7Z¯ {#þׇ|A]q~d׮4 x> ;ok:m6^]?K6@KӮ:]槩Zivk=q M=(Oq41#I#)"v; X~&r֫ZkB4]G)b=ZtW95OOZDI;>#O>Iԯ<7^:7֣RSEƓۤwMqou-SoKj&&s[ksmcYj, ’AnKQx֖Bk)n=_6=θgbh;g9\b8Y"aVQo`= UՊqRCKJ|*ٮ>5;Nֵ;/fеk3_={y^\^꣊W8AGC^ 8,GT/&5Jzj5冮1*.z ,/.ZA5ĬPAK4(f!#FbY 𷉴?xk0NxAԖ U4}bCM[k--7v\Fd dx:謫?8bH(igF1M Z[Alhv9i#g2Omqi:}g=s4Te(J3%('iEi٥MwFkT֥^*Щ ԧh˖9)\RSj)7Ëjڿg-?ݨ SQ=gOA|}t7>5ixb 30𮃦> 񌚮qhzc+5BFCWzUgRS sWrU:spU!)tr?~4ig/)cb0xl%ztz ceNT1y~5#Wa])+~"|BG}u'Xo ^/>!!Bgi.]Mg᯲/+ >xkIkrKk߷]|&&_FqǾ-g6 ⛍z;⡪ /M[OS3a:pjacKF3SihUb9ҫlW̨RSNcC Q2NMG•yc+S˰5CK21[üE8D?f~M1*ҼSv%>=B-_n+0 _G7;G ֵkV5Y-n.5nnBqU:+yʴV* ՍkߍYF?&1̱٦5̿3F#Y;Xd5S6#O0U_qg+ɼ/_´o!Ƈ-Yb% /_;?>Mu^(Ή?k-=]*Dquj/JKKSsc={ydkq0/qJP~jrTϒ#.Z%kJ2i\o$xLms75Ϋ&iAs=RJt 6b[o v>bßh?/ጟ.>"Xk~=;O''#xd,tWqgQɸ:d|C,Ÿxb451Uxp;Gx[|^?/ृ; :-[O?c_e/<[?;vg:mOEԾ("mľ  x\Ӿ#qÚ]=#> ^i?jm'fᯆ3z/g?g'ҼAa o#Wl"^Ӭ[KVy^q=d9RO P1\d8'2L^ aYEx~,N7-kr>+~7?eoĞo>+|1'LciΟfO>bafP-n|2nG> |"g[<-+[v߳ mx ׼;x*M>2ЬKN=F|1lrwgGV[u8߉G5 04eFMȼVdT(|(TBy#rxgмBîx7amG>. .վEi> IŲIği拫x7FEyĞռCs']^|Ct?&>%Ҿ |O|UuḴ#R>< ^io|G2 ̲(\ >[?Ἳ =\7XodN"O~0Me6=?:;[|a$i?_-|5_gB_G}zL>._z&} [mR'_ٙm>2.7Gfr."ʸUr.4̲8f>eD2l5dڸ!D8sïg>]W,lmCğ'e+NOLW_#HmMh߇ wEkq=7ICu?/ʿ~?ixgk !FKmko./Z^~KA2c촽7_ tO ?/DâBF9tuG_n-ZŚ*;/ C⫏j, yw\[}n%(q6֞{?8_ŊIpFOG q'ppMĴR˲~K'aO$Z Κ|C Gc6,_c?>+IBK-7㧋ol>ỉZ;}k:}?&/_hK/ ^@/X 'vHMg8CkGgkC2Ln6e~"OC=K $[ar\%GR[ɱ̳^x7ڃƟ_4J__ +> >|$q1KG6>R6٧_}i1 16W_/ŦsW7e{M&i7Ƣ[-#~˞2Ͽ~,aic?<~U' o?sVaoN1NM:KK'9 eV!} 8jS8kfTe\qtja' 9/wQ3s\:_ľ0wb- ǍWmF짦95? O/Eh/ EDOG^&t^&KqԵSĞU||ফsG#1O_#*> GoÏֵs?|5k(|8~xBuo3?ܓ]l/|3N\eӅ&w[ _TαY|>rxS|1go|L׾ x_Ꮘ4JĿuOx_4]vƜaf+g\KqIv+x3 '8Vc1<Χa͸K2]y6S[\^BهX]Sg~|n/}r_ 5ּoS!~ wu\qcA?-81eM'vkշ|U~( a_Klծ4]?QxONo|?:_j&ѧ8=u0{6:̩cKyQe9~,=RC]|3Ө\[~Ҿ#ŖW~$1:v] *R"Ѣ>|_ixgz7_ xƿ ='V?۳?k/Ե]+[4 x3Z]͟3k4p97\Lxe𬲏8S/U3p b04_qK`1-K[FY?/Y𷎞=@j/z_6;[_%ƣSXĐܨLUXH,Xs-Y& =[m)gmQb|^#a-rZW16GOKxoKF˥kz\-LZK R5 FyDʊ7@Q@Q@5=+K֭ j&vvMtouPgk{mouG<1ȷGZ* U*֧AN:F›|Z|<*1Rc6((EfT5=+Ln4gN˵Eӵ;;{D9mT8A$lDG2QWV#V *Bg*Uhե%:uiTԧ8p$ %(`_izykZmjY}}s[\'2֎iQUj:UNuƌ+Յ6!R0xUbR4(mPQ mizkgXm:~װIm;YjMՎ]coisl8^KO&Mmww*ωRA%xZ[^.u<0%Amq4†M)O 8/x긌,U55K jx]ZrXeT0V/(nmm,-໴[k[x) ^)'hEh䍙J m,4K[ [{+x,쬭 %HmD"D(cUT쾯j{i=5Ox#G-u E_xo>cqK-_Nh$$idFT22xNw?>?/AׅSq+Gм/iz/ß[z-жGP`E3`Ϩizmίä6Z] o7R[k5v[KeÄPX6xSo|i⯋/Q^#% os>yx~9O}HPC=Qy 8LwV?_z-|L/|wiz[D֠Y^;mp4Nѕ5ſ?x>O|2-;Y_W%iVO xJtY5-.vi7VRIm,NIL4Nm>I4+]7KҴH,47N-,,mc(mm xcH#EQz ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@ß|[sh|>:>'VskKy:uXMYtɮ--u??źg-/ÿl |D|Q'CgDd۴zr2EYº'~~/ͼ7Oty__h`?||7:|Zgw’ݦx◍9}W5O4jzd:uN_.uU->yToO>jk'^45-,9:ex_}Džt[ǰ< ]#CtkukS>(((((((((((((((((((((((((((((:Duv g"֥n_k@Ey-Kǚ}kεqk7"\Z[ ԧ}]cJ>?/h~+CtkmM4x:M6+I+N[m%ȱq> | }Λa~5%F]J[*v'Y$tj((((((((((((((((((((((((((((((:Duv g"֥n_k@Ex~8ί_xSIֈ}w?_ki&8[żƢTKm:|JxJ/X#Ğ~k<]+ySl,:KΡktenI59-l>7K⟄{ֻCw9&.ntMkR52M{-9|Y4\ohC0GD'_ {MҴ/F;]KѬp/SNUPinvy.'IeWy( N;7^%;wڬҾ | ēxOG=o_xsG/$]~ GᏆ5ŠRϋ"^k#MNFI|E_čvڶyww5!66qEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<+kwX|M~[:ehZfɇBŞ$B4HST B9|loh+][NBR`Ƌ_^(l-hYimt+}KTĞWxU~k) ;g C? &ֆd_[}J ߵXjWfX++ V]3Xhz^ckkC<:gmyy6f3;(:: ?#|B<ߎxI\E2j7յ4x PoCm#pf⿃^-mo~\|-S(մ}wᖵh/'JKIl~k:sf-4ɴ^G/|MrI=e߆>$1[Iimj,|&-1^-$#<%}7'n$ӠAM6 k[mѴ5]J;|Ad@G訠(((((((((((((((((((((((((((((( Zo?DGWh_-j_P|r__oԵ#/|o n4[ko jLS[ YtM?OMGR-8>Ғᇆe?Yh|;<mot^ԴKwQ-ѠKCRym@< >[|E?o_oG^{hv|&zuNjEȿSx/7)ͣt6-%z" wl)k㿏͆4:o{S3PYi.8}t=bbHѕu;uvRo1ůhrk)צOG|U_x^FhNKAԑhZ,^D[+H}Ó@n|['gfz:ImjZ~]OÞu.}O ƇK+YUgVXJrqJ;U |loddC➛#Y\eWO9xGe?QKÞ2YkOZ~Lh:υ'~(z:.xnk -Fh-VS?E<ø0\oW&qLgn_# Px[~/ڞGln]hi/ugzq\Z[ҭ3JkW& +}*{3U?O(׵NdYIFtmJzkhMnekggl8`$U,Ř@4 ([~ ϋ/#Lн'G)?5 _ [|+hoX&g>{Y)"g^Xjv拪xw^-<1sk\ǎe{}`5 GN鬯jxFpRuN)99Rr4*Fp[OC cpu8akoPץʭJ)VץV.iU|]:+ѩ:΄7ŸW ?o>êxkm#bCwX?KVǞ$Vx'R_^"Ԧ}y)aw $м-_#|w|)-;w5;_]Dž}Z]\iHf{FG?oopwtm:N.pOUq-?o7BXL {YrXg JHO*O:xiaԌ~?|c _7:ĺOExs>/g O67V:lE^־: u-I7Fğ;L̖BhC"xT.SqNl1Qhӡ$#ê}>iu%Vޟs.Z.Im4~]jMG#5_YjVnd2}fNt"~#54hmּWS[O5I"Z\kZɒR.w<#f_ <sW6PtmFUѵ }[D4/h_|7U4?xT5Q5 [c}5Y]eXv1b}ʆ3Z=IPSէ:5pJ*8H8_ ͟< ծl,q|JUG ƺ|/66E񷊼AZƜ4}*;^2mpi' ށNMswN_{v>5v?et+?/M'w$`42԰qmqXVEiѣ2F^{[([pk{yԌ<2|ýWG>w_z쮭kSλw^DO^0]Ֆx16^&׵(u[Ԩ((((((((((((((((((((((((((( Zo?DGWh_-j_Pw=2C||D֭cicmmw}0^9ÚVeռXo>Cgat^|D<? i?{kσ4z RYҬ4Gĭr4;+Ib5Rm@_{km|/ᯄ~~#>$|R?&񗄴?jQ/`˩n5+X[>-)#-sxtxg@7i.RNWX4WWQoi?Gލ{ Fs5&y #iU6HoitRR4kg۳:Xq<աZ1/3%$emV> Ke$) k}?5oោ*mCM. |rDžI^UK8}$]ik o59B?`^|:񷈿g/ Zg&_i_>X> ޡih~?-ug^ m'WލxU*ЫWZ#ө^PTZ0XI:5ctfQ2\=<~γ: fiV̫VK O1BYeY*;<6j_Ŀ_'_3'?SKg_?ޅOÚ7v>"+7º/g:U͜zx?&~"+? Q~w_~jzOyKFCx?/!|P[׃Nimށ[h յq< 'D:T$VX u}u%Gb%MRN(ο*k3 y=iQͫrڑj S:XV˖/7E, ٛ y_q@Mk??[^;JsK7׺叉/i:f7}\/?o> >5uĻ|}Z# |Kӎo;|9>|kz-t[loAcK:wX:hNqNtqjMF׵6U*Vêt򚿴ssBYnOG~o=eC 2tT7cԖ*^|y ~%ҏo~7G_jJڗցZ߇aum7?YCox}}G_W5[]G~ߴO4_~cɾ?eM>?ѴCÏ٫Egޯ i&u%[ìeFJ1U'j+V`8F*tb}9b.uZUUƬeLf]xGbWR8v_SøiSgu)Rc0[6S [Vxgƾ0?ώ_uk_ ?i ; =ݏ?čk~'q[mxj-DZơ|x{DmK6K8_[ǎ>*|^GE3ᾯ}FG5E[Ag-imgg.R]'ºJS4gnԒJUg5B^r(*i'հY5LFIGoiҟ7 iFx啖*2PJ㊫;LGV7%k]'쭪|e-|kY|GcψZ};Rٶմ"φoF3o&ᔟ <+Em./xuKQeg|H `֢R$` :. Ot#iSJ C ʣz)BqJWT]*s]+.c|7^/#f2x{QCnXB/xIx?쏬< ƲW>=W$<uOxcH<x^!.&>MwKsRp>qp0a\I>8fqO ox )g9OgUN`ƄyeŇz>"xoګT4W᷅? ƾsA~2i?xrMS/ִXzwl@:i޻.7 |5~~ |B<}q/<;C˳x-l3jE/%He8Gø^36EĔabM^! 1~ Y'6+cRYsƅztbkT*(@((((((((((((((((((((((((((:Duv g"֥n_k@Ex=3yk'Sۧk٢}7B>)xK rn[$g9)-CǞt;'v'Nm,FiNӐ,xdA"L:V:" VqxRY>FӠM=֧wo 6Ň' H3Z [%x1O 0MŽQH<2)2$R#+"3#RA%(c^м;omy kIЭ/5=/D5=2Y/ҴM"{٠}OX.t.&kB ;H8٤bI$mZ$]:u*BujT:t)scE9JM袓m>0fo/{[~"xz/4<:ĺe3Oԣ>`=_h-;>Om|)C᧌2o8=s"+,2D0GOЍ,O&*)Vt9jӍ Ӿ #V_ x'T&xGBNKޡ<ҾyZ\i,g$%ؚτZ߄|MZWWu=[[uOb>-u뺿7wˣkڞ1ԵkVQ&Y bq*JK]ITJNeYKUOO}NuG6̣Z8ŘFbXY#U^uXJħi:|5[_Wý?f$MK-_?XwJ8`MC@N۟ h )wiӬWw1O(}{}Z>| 9kQD~[1L T\˩\-|$ƣ4ڄiYnX9N&/ |%U g VK|-xcLT 'MRiigYe[8<:Y.i ९[d¿inY~š/K㼒Itw.\Jbԥ5ĩμqRUJX98b%%+rVHI&لx?Zf_2׫[@|ist[43K4 5h.^46Vrw_ ?f_G߇~~:fq ]xS~ ZzWmZܳng'4ԒqVcVR%QRnuiFVs|i;O8,ehf+ЧWqW^4VSkQ"ep+6jΣ/P}wLԯt8f˿W_ 4a3j6G𽦤=׶M !>}ce^ij7]_Y]]YZΒAsksCqo4o;"23) UU'NĪnu}9w?ެ4>c bj9q12Rr/.mʫ~ɷ=Yo ch>4-^𶏧~4N=I4.8 [{KX#H`8ToV'emS4}+:eq:j>] ŕ.\ZA, /OK_5m^^|9-ZS֬KO hUmkVz6)simuRn$ʙ&3MW5grke3̲j9vsSG $\#Kʓa)׭ Ƭԃ? ' g ,Z$3xڧV##o'.DW/^ &;F \jp<#?e⏆\%úΥ?S.iRH _Z(((((((((((((((((((((((((:Duv g"֥n_k@E|⧁|!A=95=;Lֳhz6-__/uDmbA[jpEi Yzo¯'thjxcL?in𕟂?o3ZG|H~['*onGCƯ<iŮ>!/_7GLƭ/mVTu"Nu"<mU\eNRpRXԌcRY{Z`8Q|W`Ȱ8ypaZrtbRs IR_?O:j?gc.Q3kº˟kҴ۟J^r5դ4}_r麶x>otk^ 7/zi?/Q[> {_𖣨xV>(ͣ볯:u{隭xW/ڤ)I^cZ, Q*K UJ%FVPR;Q ,bq7Zy^-`7!ejڏNW~E5*{yBj4t?DG+;'~&%kڷ_/߄EZx'ۿ:O'ӯ<|hm7[kU,vwphV3ß4[_Ϳ|]_Ziௌ#U|NȾ 3).cڿ6ߵ?..dOzQľ0Ik|+/ֿ,t'>.P5+"YU/TVt*ӎ,6&RaIP7Q(A*P.I[,bp&No<V[ah8&OVcr]^8QXZ<= tT8sAE_h;6o~ + / h^%o9|X| s7Z^{c -/&_>(j ~x{F/٫tWwJM.į86>Iд @om=,t^Pҵ^k:V:ҍ<6UN*7R8ӃSj^?< ֯Ն̳IН WM\8zӕ<|/Ql=?/ Ÿ |gρ[(ƿ7xᏁ|YO1> |nHoFn|[[mfLf|_k||o/HTӬhxW> JHDm2{zj.|ew){.k=Oz&hg }|>6D?M_[[&ڽemV6^RO6XEL<`cg RUK칽z\oK~qeU9:p|m%NP Ɔ +IJ1_'QʛRqqV߆ռ5މyit?ƚR_i|'>}hҷkm˹K]K?Ï <5}qO 75Q#-ou]'Z^lћ(ྼOK[?cb?g:2S!!h#uulfߎ6|> |C/|E.е+\~_74FV@PK%Y+X22F+$ $tZ<U'ckQҧW5Exտ ehG<"Kع`p8[8[x{Σ?/ݟ+| @ү5Mz^WvW[^ݥPW5RG1/SV—>(ąLzo _ەQxzntۅ8 (2pe8Oi4%(OKIrN2|ZЩ 5թB*ө<5wYPBR [Tt+Ь&V>YÝWthWz ίz=׈|OO!?|As|׈OQ3Lḻ{m+Ltm,mu*JIԕNSi^ɶMmY\f&7UPLUzƚqV8S)F\a)5jHʬ+H 9<'Vv66veoePEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(~6xP^㘟Iß <3šZ_ tW|Dn<]}Kaz6YmgT0e^8>w< ?EӴPi~)IOĩ? YZA4z^2yZ&iou:A _lx.7TKWD`VHծdTxde_\,2/G1G-@=&+[鶾  :tmqwl- j΅{vjvKo;Ki;D#xKF8IJ.ҋM;'fNFkTVjRJJp]Ӵ>?~H|Y<[O/&~(}MCŞ->~!߇.ouj |si4 3K:e',5Mv=?J< ?xSş~1lq⎙/_Zu|]+?|D׼8o>j֣SLt].Q0өJU?iFqujUJQi'IRԝ;SR +u1ɳVG>ܫ3VZxXbz`2edqZW<?4?o kC:?_S.߈e?/šWVj* -yľllJ G߅;4( _9Og6"n{!Σc]4N9^j~^N?X<ԚQ}nVgRUŸ;g;LQ67̲zFq2<_K~ 𖽣hv~~#+]2_Vּa /? g iWM^o~8׈5/R6" a: Zq߰/5ZO^~xG|9S1?O> ~.Ml_ ֓^,M2ۧbjpncx̻35șg,b1^s[ |Nlܞ#V4ܒBxiz'^ _cM[MBaNھX(((((((((((((((((((((((((((( Zo?DGWh_-j_Px*;oЭ~49#y3u?v6:V65߄5kOR[#Ӵ}?TtDt[J?1Yضx#Zu_ ]CšLּ)%D!nXԯ`,B=:;9OA4_kCo.-2WҮ²aY/aCl'^6A_PPE|A|8MWWӵN-{miww.#M*TX)f`x[RpNrQNNM]IuvgF 㿇7^ ,u[ ?UoCyjIa 3Cm/tlJ_aU*8xYFTkKQ"'OۚI8SSq\; k*QJ\9ym,7qVQNT0 o{᎝B <4׼_ ⯁(o=LT^):玴-U恭jCkU|KO5y=?O +ᇄnciΩaix[F6>fwO {6١S׭'gⰊhc8RNLEL4THTV*ѕ5gV:GKJQIW(E[Goi Y5M;Fm29tXV4[HlmotiekFܲy '{y~^O i~'֗$<fůofXZkWd?%c\W𭧀4>&qI,w+۱V\?~۟ k? <-{}]_>j,RFoMoqTox pb8C5]\ 乴< Ca^a,F0~x7Ÿ?>%?6/>(^͖}koo]]Jԯ ﭤɕ-V?j/ o_ ~Z_|7]hn94j5=SOoC5uIgx L8e⬏3NJo23!Yy,7*Wª,x*'O^zV]xVtK .mkRԵ9ᳳtkFAI=J"8)jW4~,>|]sxOOE|SPxV4:_ЕfC{}R'7ĕ(ORI8lNoWx1[oѥU'#4_CxN:?5ƿ_Y_]>tS^jW~n?>%xc▃>Mկ=MQ_iM^.,QoI,M.N4[KB4J﯉8ϸ{0F7,SWZW{0l(Ja3l*X"rl^3/ >&oK U>ǣڮm4ۮs? xD亦_ xs~%o> żQ?4xUmv R~׼?{&inf S<.&&xua:"f$Qષx U x.z߃7W߆|!]犾xž3ލeյ-3NV9Pk5G7 V#ѿiٯ~vZwnu|Y_ů_DZ}eu{bL(^xfi6?#2ΰ2Lc2~ V6EaVtkC,1pʕXhUtu>(g[Kj:'//|#٫y"|[^|]FtZ&ꚞ}Ku/z雴sĚ9{}CL|'j]/.ps\-x(F13JU<xU]g'tko>X>'gx~*OxLGu 4R4mON-Y|M]o^Ž2i oUoEO5 0|O}ֱ}k^4мG`u2{"nҗK/c-qht4 u[{Kصi/oaum,\I w~x]p64hq &[3+ }8pOC8qXYAT`Zm*Qc#`1Xl5RZm-Vi-4m2UQ$e Id6%XyIa7bS~ 7[=㟊}k~keY?io5Կ5 60C__yV/ a3^>%q p* ._~/qn7OYzy g UpW&'SBh~.Mz?oŸi};S> Ҿ|w-x?e4qLk6,U Tf' ;sr $8rdZʐsĔr"*q|UW) "Jv+ ]`?%σux>\_ >#xOk>Myǥ^BCa_"jpNx# ||o/CӼOmp^\ޝc|/x޿3|}?x_x_ٷ^鷺Vl_?h捫xx@.u +K,{9s!2F\;ØN'ˣ \{Rcd/'&ϰ,e^*p]Qxo0ϰ6*}Guukcks{{s]]Mm5̑A#4Һj쪤~?x>{o ]wpx5[kD>qfj6iuD\(Mc v-1[ b(BU#R ."rTNqⱵS0،DF>|*5Ko_>ּ/h]}?zۯxIVM+D{GsFռI{G@~ |9X|NSs8lT3l,qzq }C =JUf-*h֡1XZԫ3ScCs90|iм]i~ t|KKkk-&R&jiq:kOB|1jfxJEhm?>t |EF->|]lE~=MK=?>[^!>!bg8RyPYuJپ#__*lm |O27(r|V3+g48P녿־1֙⏇:|G8h}'Ez~  ż|JtTKBſ{vv~+u z^ 'lt4 Yi1}in{+Khn}7Pեg-\¬+>%,2qʱyLO g'[3ϮdX*+7ʣ¸RʫfS//TO_#k஋S:62 t M1n_RxzzYݽ4-\[ ڧă@kKOxiBh '|"u׾m];Vepi^K[[(gKQR.*+}53uR2*YYNyj8IeEc#E~nEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(>4^|C:3l>5/5Z:y'toY\Vb#fi4e蹿t6/<' |IaWд kCE(J$<5-fKKWo,5oxZF^ ^ jľ+櫥Kj%{.eIRhwEG|!}GzjV -bƧq3]Mok#EIQ"3_PPECPҴ^;h]6SUPTcu+dUN+Ȃ\Z\G*+M4i429ӔgNRӌ'Edi4ϑ?h/K_‡χ߃7+OTt/_!2;q-֛qqxEi즼+kx߆^#|]~'W?oß| o4]C4'_tah^ |Gwq_Qju?[֣x!#nį#<=IgEw?f/ƞoh:JhD? Z|I`S^ -->:t:oMzNk]MmT֥U:Ќb:~ NhOWھ"ķ(MWI`qx;-_X\SG)a0|vY_:+*e. 湄3yʶ.xsZҴ izM!𞗦־!eWMЮ/|Q_K˫jZsu^(n|86|2/il`> O;_f4KUtϲ/׆`?W+ 6ܤmݶmoVv|\:JJ9NS۔)7)JM)6muږk6riƝco,:yi$QkyoջgJ/>mFQs |5 ^^^~$i-H?V ]jϋֵ Kf+CX$pIͰ9kS:c=ͪ A/m<#9Pa1+R4ῈxY<S5x᧏~9s/=NӼM}xUZ^宭־%|Ӽ1iZl>xEM֣ca7Ѽ-m T}Q, I?H/X%x3~QRpXqE3fk/F  T_2Z[92yQVŇ?i] >%,r"xߍt?k?|]^-C=nUh?0"Qyo9>.k?kLBxÚt!)]7ioILo?nI?z}:=aWVO &kIBb|?9lۀe~'a XG1Ɯ#OkJ\23ˇ+|D!|KMW׍+4r/xYҼ?&}i2煯m:]5.m-,.eӭ~:zOK.ZwmLx@/Ë/TGLJ-~"CWއ-\}kHtV \Qj!4W!cm',ǚo!MoHK| ƾ>O+xWysGQNkxn%{x%w0_~%'gOx4oxm#ѯ-mZ[>kV++Kc*?Kq>$qu9Q:~bidVxo+p<[`r9!2- 䱣цSa?!o_m|5귺mek0/I_X xb;%YFn|G{]3~G<;? }Z4kKºψ>>^ .{J='ZÌ_rzxlԭ\'X g2pmTʰ+`ZsR >2&// v[*?+s'pK .]>Y*X8f|9Ow x0]s\wJU*8[>Bpha:.j%0?fT+xFa⿇~x. H⯌| ҵ7|O~jj]wZ'-5NWoj>*;xO?~[eKg@^ uZMG#˧m,V)Kkn58 *Xhg8\%pU\;ԲSe^EaryYdX<>YapuŏZ=O+8x_>Vo 75ox^"m>DI=ҭ<p TF}PO0ώs2 +Vˋ0|-.WdX.oZ!b?ƜSGYb3\mJ<8}EM>Vw4>_~״<Ȣ/tkh|8c&̚HMۤt@X~r_G@tc_~F?[h@]t2@y?n6wZ /mtXƝsiV) ͰT1"+18w.lW7aptXTxCfkԪ83s3Y~)x'_x^)o_KZ-kGм;i 4߇2}ׅ+GıcDZϨX^J^ռ[Kro*>9~'~1?7cFcƭi}^&g9xcՖ3CuXK~}=Q]O<cǀ!x,|+8gY Bdffk¸ΖMar[R̃UuduWGR++YH!  F+W_MkZo1ŭ鷳xŸ|YOw[\Is@Ӽ5B:[^zޥO`("2㼿^T3 v_T+W/23.pUeN2/È3(+8SuhQ/xhU|r-IyVo+ɯS 2>Lx e\-pAᬃ7`x샅 r|fyf72[,1ƿN>umaxoZv_DNxA-n_ڗ_aq4&k n|%_UHMn'?,Qe,.V{O83ͪf/<ͥ VUh,ֆASbqu=__ᯆ$w7McUׁku`> kᦹcŽ$Ѽ9kwS}wiw 9|)'OҬ^xN_}N;Э4,)/ [odN~̟.o~x xP ㎽M/F/]+ h4FxVVMl > k;HokpW`Eޡ ^OS-zj>oyi[\ۤ<'hpv_^eٳȩs> 㣆i mwIݩ OkW]7t+OF.VXx/乲/xGE|AR[\n|?kMk ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@w Ğ9Ξ<Xiڞ: -7QwYѴ|]se:Ŧi\ t9'_W|?i&i׺jni:mj7g}3]2<|w?O_V|G ^5ߌ?>ghgjag},>+~(ޏJ\x7ß E>ax^[7-aƃkM;ʃHY_XZRRܹTZ^WՂì^/ OcJUy=SN|ZF?j[E} ⿋8|;z^ #:FkఖuKk#R!lߵg/ĞS"{OӵxsP_ ~VSix߂kV _¤ю&b燤B4RK[N:K(Q>Zu!8n ba2Yϳs a` ^6 ӜaUe5hԡ8f/~>W'(?|% O. ]7?w?5L éCM:Rؑp|}Ҵ)/t|xYuO_ G_oi_<+F|[ize4EZJXE'iKT+IrR)yq6b2XB{pl= deVDZ:u^23k/?[Ҽ>.xnWPB?hnjLխ5 ? ~ѵ ]>-'//Ţz޳sma5C7x[0|CZ }'ZW$</ xc+񧏵-yA7 ~v5 [ylN+|5|+Z]t x⟄f\>3%?/5 t4mF=}Ze-"h$ԯRvS QI< ve N\9$9&qYY~'5aPF_QpxLERuUUZU ŝׅUoC񏂼G' xƟ DԠK;X&LմY#,.-.&i#ucƺgox.֏ƚ:o[r $X {leffA$.9~!)W_/ͮ ƯkkjU^4ԼA;uqiO@,~?䥿E>_?~9PV񆯠NU%[>]-Ѡ%1ȱׇ1\>; Lҍ>ekQ8|>*: us<]86F"5!OcV9/Þ~_Ś k3|Ez!OtJ F2R{Ky Y#e866:]Yu6v66YYZ[Ʊ[Zۤp[[,P iQ*' XS˩b"SץG_ +* >\Di)PNsp-Q\P\~#4_x_Gwbgt:Qx[SңMMJlRmDK4ن?Gqx\>i 3֡G1C Jp/ v a* SoY6wz~kmam=]YYD\N ŵ.Mr##s9x?C<1-E[XtoxsJ4=&l'L!vB@),v68*lqqTqp U`pСSPQ7V,EzpaVmQ\PEPEPEP_~h_5_7v٬Wï5GݺUŞ f۠&lϬWqq%l#?ef%Y75ɲ^-puq esP0J_J4` ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@ß|[sh|>:>'VskKy:uXMYtɮ--u/x6{ொɦtxY<' kk{ᔏmA=xWڐ\Eo-%K (e<߉,5$ßhWc'öYk"kN=O֪VDtZ%Hޠ(/_~l>i_ åZ-קaХC/ ?>xc >xsĞAj+2{RWzw7xR}NY[iךy|>~+QVռk⹾)/ïO[-B)+Xf͟OGcaUojZ]uGޕ1*8xQKb9¥Ztf)Z*§SBT(άT 2>_aU8<arDkb3hcq9+ ^QI .X1X_Hσ?i߉_ []i/ŏ|L4u߅n<7_ןt/q+KrX|C1bJx=>T?Gx+_ٷz? ?OZo, ? /G7i|/P>}ௌmZTXx&GKUƩBTj*{_YՔ^!nZJjMNU!7Tp$[ .fVfYf9Qo8Q 51XHr3 [Ce V>+kkwj>*<9X,|Cß ͥhq>/ Ml-N rOvcMR-o%oV'k[{,u9mfG:n-LGcvIN"ZrQ9NTiTs{8I)α8Lfk)<%jTWwJ1뼻R .xx`_N*ry~=߆;_qM]#U_׍|m|Kx~xOuTĶz/$c_ ikoKE,./LbhOj?l|ch+_i^Yk4nݴ8lk}GGs!m2Pș9dI@P%Upu5PY0ǍwQ'E6UW;}?}\֯4Þ薚wZ/ h~8ZFM o,N.,am(J8n48)4RiһM] <=ln.ajb(R3%NEUgQJ%95)䚹OlKgٯ~ E?ß-\7G;SoZ4? u߇-aŚv"🅍ԚơkJ}X5no~50x߆93@(߳Ư_|Zu_R׭5wŐjz׉|+O ~= x>/ɴ |5C7t]}[Y*) ch:{u-W<1k[|#/0~;xgᇍ~|E&|_N ֥?6JĒiuipMm+lo*`paOET^zuaNYTxUNdJ`>w n Q#L+NfXLuc !13uJѯ^c{?O|u?#xk,U|x?.񕧈/t~յ]2PK텩S7>3%ŋo|w476]CtWo"ҬmSX-N|g/C![hz{eae;J(GZdžk׿ix>J~?xsXGvP4 ԡtȮ7UMuo-K']H(Uө)TJJ5- yG :U({J t8WԪJ r/d8>3&b,_Oص .7*K#`9g01|ʵeS5hV˰WWW'}sRmt]'I5H/' Ǿ.t bm/-NYtٮ$c{+ȃB/g?|sJ7xJOGӵi<]˪^ M{A YZ^ u}W{] ^r&0fR`JԔ9a)(o+|~CJ&8l^-ԣB*!>_UO ^)Mf5擌*{*:0}cI>iO~za xw?+Z֣T,|H%-#xwu=53>2{cGo{??x]IkzckZt׃l5{uw|ڴ^ Dv|֖V5l5xU9RU)8yӜcV:֔*Ժ!$g42l[FyRV0ux.*n UĶUN%F_ai~8ޗĶZfZZ0{HR]uOBϋ9L;EnCO.?>ֽ-5 >mK+F=_zn}yiridjWkhZ|], Icpet0.c<> PWU)t0q+*TStJsU*T4>h?~+ůx:*Z'i"MWfBBTA*x\ӯ ?hX]cMg|m~:?52cߍZ7 [ >M=Ǘ M<#ϊ~?<9uDӞ1nPS}+@Kǂx|<2\˳ 8o.dF?4Rq\fEnY~7-ϫg R㯊~0CoTo5O=Yw_ {"֡| ci%o|Wiɣx/|_/X%oN/eMGM]u/> .BB׈)VI:Uլ/en!.\U?peurV+ExJpSUΎ_.reqTV)_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh9;>o i>o!⿇s_[3V#[} ~xXTjp[imlÿu"MCᝮ㏇#b%rzol/jz6!>0t'J%IJiRoiΝHʔzpo(JS>&6#-!W.ƾSJ9Q\'+s(*mV5ej}'O?1xJ7[^|A~g~5ޱcJEs\;+~O:7||>?oV <']:<_ýǷ3/%4Kҏ x[W5vPַ<Ԅ8*OzsR*t?}tRWq5N8S:#)bV%SpcusHX:X|÷J\ {>gKĿ-ߏX"|=M?Şմ! #ZеksVovn!Ə_x|b_<-I_|%u l|+m=4O j>!J[<7FL6ZUqT!xשRMӥVJUZSV>*oFNtjG(Q1̮\3B \\!RXTa*XoF)yaٯOx__|h {}/x?`o$g[ɴf&\Z^t3}SռEk>ojm׌<[. P'kwNz2i>W*4SO^_7iḲ4iQ~ *R `*T:~0IIY7JOً:?Bşh]~:g>6_xj5_|@t3Bd%7jz}n-2M?L;}K ~6=OIOľ;|mũݬ6rio2r]E*{RPN*~ʭԔp}c/j犧~"N2,nRfQ &x,r_Euiey{y҅E˥M`|GSz_~ _ş~>|'tx zg<(.~ þ_5Oͦ!o_<]}muxy-+Y,:0x,*Ҧ)J5'a^# V:' ҄c*%x{?[! aVWPs #XN'ЧBye /N3u}XO~!ׄO>#xooh C:xc)u]{V>!S+Et -69VʮU3uẂ.ಇB :b*µYN9RNjN8Ӈ=ENڊsiSی!E|~m+00X8axZؘ+԰# 6LU150WIaQ9_YxoKx]k\OoPLɥWZ-OG;FXne<Mtgoy_Ưv>kCÓjR躶m*KK+𦻦>%"}6 -y3=I+zwĝ[7/ 1x /~x+ž? rexrem b1 XSuNWπQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh ƝmCĖu߇V0fmsYaдgI%йh-t-;T.P_)[>/kto~D^'/\:{Lgψ[iuW-|9v{b(?.࿀~0k)>Wž Mt_xVm |DŸjzH5k<7k*ȚT+0][};ȵ v/!4P[Vk(\kKoE}pCoE"}A@W{uźMĚ/)kccvm<'=3¯o^YSŏ+-̖V063 ! ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@M߅/xsĉ~s+O 5o<(l8L3XYq ^׼k~ů:(Ӥuk?(YB,?/MeWU|~OlqEK{x(6u-TuK;]5IӻxWB<5ZGдM+M%ge A<Ӽ&YB# ( h< 7Xޛ1|׬Gicw>~7N-no<%|AU~#"yf7źޫúo<}[Y<+ai\γi_T0Gvu v mK6I_ <+YdiRY&\/+u{&<)yMᙴK3.h-lt-fX& +m:Oɳ|yVֱ$GJK'hwݘ@-WWx M/eCԣc_ 9S-nIa?\[Km3ZFxfx{ewMNh^!b;xNKLVqh:E"%;m_@-tA~'_Qׄ?Hh5~?dk϶MG-tҫydm֑ 7C)7J*%w i^qwϷgu`ObyaBc~^gNJIsrڭ_R|𗁾 ~ISj? oTڇ>5x] |,/X$1xƖqDHӥO?dx>+ua/%¯>/o>KΫG__KZ? xRxKK~uhaakc%?K'WQTsS :r:{pSO avO14,wU+DŽ+V# -lns/=< YuLl#,8\<1E7 QE?>E7Ko!?|3xWÿ[_ 4i÷Orjټ ᏆqmR=&o I=~-?Rw 5;'徻,Z,ӥ(R)BYzsRPsWkb0;S(5Vl%^|ʳyv&UVSy#xƝ>=7ῂK?Gƾ9ᖩz.yY񵗆nO]Pi/A>8q魪;>G5xO|Aoƍ?AK_bx K:wvu?@\i:ta=OP5_x'@՝#G*΍SWJJ}ׇx7FRļQ( e5S%î4ft2c[NrS)y/ҩW9:)QJM+'_/|+EVоPa3x[^xK:߅ )xAK |yNYƜT:pXiTRU *fuh'j'*,L#eq|yaqPe_/dquF6Zxj.,q1?㖑4o?2Wl>ox6O|YЛm+kh.ῃ>khŤOYZxBb|}<]x7|_/z%xBݾ_ FA ]; cz` *(b)ϚR) D҃[z:bppp:O+*\Ny^ ^ 渜a( BjWLULJ*+Oh>Ɵ/a>/B^=/I5S)VVZׁ[Kv m^sK?J5e' AuKKĞ=REYYI]I?EOW(ιxOUGk~}Mg0$|' x[ºgm6^GxčPϔ8ou=*r6cpX3$˱v'CQW 8W:Rꄣ):W燁d/{z;tӿe-?IՓQKOBծVD7mՖ{TVK x  wB~ A7]0ᏏG Equ_ .4{-h ǡ3u+JxeOժtvT,q95]t=j3x\VcWcU^ UTbR983PS|ݵ6_ %%gW%ÏAk9RKd܁s$p&d2 <_> Ⱦ'OxxJ?Ny `|@yIN4d{.;׫+_#?nYq',rNY5g[kw-3O~O__ |X.~/Am?#kx"N{G-Ȭ럅_>^|.o__Z= στMi J-2~ 6ޯ}kg6Z彺5h8,F.~Zo߯yb<xUs/{Wg MFqu};PL4Uu+KQU~?ӥ9fJ9Jy+7U҂)7W/φ?<o~ wwv/|?_h1{}@Ҵ]:6!.$<1jҵoB𭞯j^ǂ4-^𶏧~4N=I4.8 [{KX#H`8TZ4_hƃ|d:ޗi-u+I NCC3rpqك_o>Uև?Sx;ƽZG<1[V&TcHY] Ns*NxL ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=ǏPx#S_xD2ZΉ/ص}X֮mMa]IoE6goz_VzoxFš4UNJ/"m'7ö0ZɠiCo=NĆ++]J ]jWVSϧZxU/>h6? Zk?S[[ht>%-^(&Zjz\5 Ix6}oF.cʧ&(b+k wk mο<xƟ߳o~:K~ߴ^BK{/ޏjW{}F}jោCO¾8W3Q=480RFS,}JBJsIW¨Q9ygs'/Y8`*,]8Xc1؜,1xJֆ.g_ aT+iR?eĺ^_|SѼ?)eߎ^2ZIFxi/~&St"k Pu5m/G [<0Ě_RÑj<mg֓ڂk%Ծz׬uwúwN3 &O CCQ(;S}1(ŧIK Qrù\9y\|VO7jRxajR(<*i΃~3u?owG< ?~ПU+?hh xV~!HwO bZ/xů#մ>ޓ ? xS_|bL8еǯj~ WRJt0ȰT *e7 |B ? >*,Dž>3|W>7wöwC}RMޡV-ΙfKqo ~?Y.8Χ 8-_^ 6gsb!W ?V2eѕ:EF9*KAV K8)FܩꕯٟlxOžt/x񧃼Qg7~Bh7^[OgiW0 Ό5@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhƿ<);y|M.[^nм/OCR5tQ4fmCTvh⟌va bķ>tf |@%Ե c&ȷH͙}aGP>.?C5ok-l/4SlUfheԦςtn˦k-aVK8gi>,th7iiWSY_i\ЭťXvz ݬ`Z5mWQ@r/<麧#&R LjgkzwuJOvBcu]ZY5uJ+rQWm+FzqUaCzJч4ci0۵%դy_?i߃iz[~, Oo?G#ye Y_kS<^=?N^e]qπ~3x_zƑ}0j:'<)/c"j~g_h>/4,'Pt=[Y{x'S*8֕ ZTH65uO8Ƴ9TKmU(G G[-ɘeqTT'*u\.>ՄgY}z (/FO(+̾0|M//׍#–i?> cv/zƟv5u[UTZ:4s8SN.sTRQڼ(+YI$`& rq4pxկC JU#JTsy+RJ7V)R\%wc|x'f:vOǏ)iemtYi< w-mGUknuO{ZT)rZ"vOܭBu(Z ^M*keDu+aRx c+2N3ւ4(lG}j.m1{xT/ooAx_x6J[^/=2TKğĶvm-t9׵it{ۛjBUT%OuP9T')Vq%8pi6ָaᆫltp>UJa(XUzᧉI(Ur,s6%˺9:6U8 +|9'5xSjQ:vYMꗢJM ]>}]ҲF8 yIvWm+J*1pa^jt)C1Vj8sNQy$%{%vU|) |iS?ލ@i|D״Mf]+Qе]g6^/ϣ=!&ak6[ghhm.? kzg<';(.et+Zݮ!F[?x+g4s^qf2qq&p\ʱLÇ3ld.+ xfKRa?uiИlZ//xkox[FunO5~Jҭe|?akzZ,dBGœ 7⟀u>|Go&@Zj:wZ͍.cGes/jA&50˫fL"a``v%b#W 9Kah5f/PWgp;|EXLpup|3Uͳ|F?:2XSQorp 2e1<1`|RPqe~Ͽ5/¾$h~x'׵zO~ Ӿ*ze^\j U};i=⧀-[eH἟zFJQ64}tSe|]FHx5L¶YB%x-G TQx*9.oCOS 9!5oAOoMV[QOڔ;Ηǟ|3Txd=ޟ[o˩,gKq.y9o hbz j,U,}l6#˸=3*k1ӣ8*@qO){._5-cs(+)I po*yIa󜮲 Yl<;C>}Kx&R|Mσ#y5O|Io4OoxbT'E?<={-RT#kv^)tit{&)c<>⼲u`gO8~0?2N& xٞWc2Xu#b2Yc3S"eszUpP/_x᷆Ex+_O/xS'tui $k~m7R|j*隓v4^> _m5ϋkwm-r '߈/Ě]ٵQ5oQleӞqJ2.|ac0tb:Emn> 8'`5gdl.Ü]|gqX^vwe1tX ^bqts<jyvN[?Ozo xj*f,+˻[+IXeӴ۩oomn8fK8*_k9V[`TaVSaʚ(u)bBu0iVQuiA/k|@5G߾ޑZ{F9ymid5fჩNcajUTU~g9d^? Uok eY.WsOx:o |)O~/N/ֿ&+M ^ Md|n_7uxwt?m_+O^< 6594O k)% G}uc<.|,FUO(,?p3Y>4a3jF: ?eڥe]W_gmx>t$SI]Sxc_񞇧F &])E熼1joxY-խݕei 229[tfmmogooik vmmo X$P#5TDP&( EmŖm,oxAN\] m{_ݥ6NѵFNRN٭Sѥ(UZ*Ғ%det$i~6o=:?h zFG߉S]}jz3K?|GvK>p4?k~ 'p|Vi? COoٛ?=gC<5s~+YτGž x_6]B|FϷ%<%OW[SFP«(J5#J9Eujb9%NԣJ7g8.L;~W폯U`j׫Nu8^jrR&_||/𿊾|~^:}u9HЮt_x?eO|3_7t ^}׎WI%˚GZ #df~|?&♿ek>3ӼRmʗ8Put9]BKt[3S>\jsQPQUWO7UFY{̡`1qnj n.8?m+R4FS? o~-/_n=/-ğ*T(sx j6A?pZ O.kŖ*o~%c?#_º%&Լ+cBgƿkZuZGx3xo-#ZХ*ga ba:2yRԭQR<{[RnY"Yc+WckN N,ʮ 1ѩQϿhEիYW{ xKC? !iRxF(|Cixvkߎ[\|?oB3$W׍1뚞ľ*.w~n?e<=iGƟ~̿gCzgk㻝GW4;kE^N^`daUiV̕XNy xœT0JkI*Ry9Ì#nYOb(a)a+8Y]u:xe1E%aOJ?dI}Yl>3⾳{T M5w3i t!.t=N|5K-_ƫoA=χ obş_-[~ߌ~>.m=wVsMJ^,ZƷ>ZMO*5z0t珡Qδzʞ%W:UIҫMVr&ykβ|,ep-żNcB ,ఙ<fyf-c8 NxklL3ի/>2Kǟ fhZֳ>WMa~< uIkz+C|Z<Y*~.~ xT7 u⥅ͯ>i񿉾$@ePLj5 v>6~tG&Ŀ~|So1kgeZ<|X}kL:eΙef|!i/%q5 DZiKJe;xQU*:ʬ`SZT\T FJ9c+cJxUeN><+%~"pp1(a8 7[h?jً_7<#k{m;]lx74_ 4YkŖmm6 nH/̈́u 5\h.='FW;xIEgvyxz}i6_|MgHۦocgWt}ǝ*LBL.!SNZU^eJPV~R)Ӽ58麹fGEbOf 1ˋnd ւ 8Z+twA G 7'?mVg/ڟl_C$dwyr');oMQ[vI#+V֗=I('+F7PiZ)-!m4':z_~#5-Z3[ 'XOm ͜vh|YซJj׎SM?- ߈W_Yhz'Ѽ-ƾ6֮a i~{F'8Ɨ `1:|C8̧)#y*c`*s ~cTpY?0_τiĞ-A3N?Y㯌u? u |uh+z=CՓIDzx5Oh>| ~|\;{xSPw4G ˏ ?2xsQO^4=kZN2^"/C.\MƔxKO_ufe| X fe#O|su &PmgO>k~V~U3x &Wd.jY^OѮoge|cxCǼgq]x;s| Sn'Ø|nEsW8/wK೯1X >-꿱}Dž|/? Ӽsᯇiiύt-i ,|Y7m]ԡfuԴğO_FIe&k_#MŤ m46oo43,71Izҡ0 qsyQ,fUeG<.%VrG]eiG W?,SXyG֡R;h]/YROşxorxOOxi_4 85 N^ܗ>H?(ɠ2 ^V=/-{\ϕ3a/좱/ϳ1β|MpcK(d9'x~Lo ek9)x wfmf8v668;23&Kx{^,:}G h~!/g6.4;HUma2~~_ ɦK@^!Լ=^irxUÚ'}C]uZޙ}D4MRevkùw ]Y-F83L.Pa^j!eyl6Et:}xs+MKc|'SDվ5] W|k$ J> ^7:ĝUWD> |)񕏌?Uo<1͟'Pk߳h%ZoxfI{oXT,2hf\=G86x9,-N3y+'e\6Qwż5f]1iI^ҡsJkn=|7 C^.o|lu&_iVn<u>o[_QĢXZ}hcuy- ~y?#^y)~!6w5xoӯXn_h|m~+OaC8Tϸ[ cJp\9*rtl,SC6< | u_֞!t x\|'4:j_/AuHѵA>+R;5h?G$Y~?_+m<~lFCĿEM`bnq{qGAd93r/Tfyg/~6GO31,_t_@4Kewkx iq{e=7@UU!Oexgf|O}x| _xbm>OXtA;ŗZ\pp־Կi_E{[0]xK[q~:R 4jq %2+<<.2<,Xl qm|_ "Y8[Ϯ⸃3@|_Hik|>j^6>~7?j_R75U4n}|5ҭ}sokzLj'~NOx;>'=v^/ }м! (mk|M{ψ.'|=4PX|r%摪\ KKyeпF-q_o . ,0-puR<-|7u_:r^ KO|eu-S׵ok(Դ=#RA|+ZОB ;XRUw?gg.tKw?jZn/-|+߃|A:~:ngyO)g8 ϸ7ͣcxa8ax;8'?x?D@ y>8a/Y🈭>~Ϟ=_-nb~!Et 隌 6F⿊Cs7t |,e=[Mi69O1lW uA|-`bC1y$SN B ;XRUw?gg.tKw?jZn/-|+߃|A:~:ng!+2G#tGeATQr1Qu*#>x^uKdX¾ gx.fY 4,-̖/U2.^׃n<|+K᷊oOD:|Xׯ7:mD!f~?_|(e:F/Iu'XFWIHeUeٯ6#%e63 ar| pFA4<3,v*/ b*b+rܤ?>W?<;vi>>jңᏍ#B?h>G_|hҾtFY7AWI4k6OhxíW~߄$w O&>ό|;vx_Wͤ;Y#r:ZVƥV.?xC2P[;E;%,$_u YJK[ D%ر𮳩ikjdi7[>~S˼:g^ / pYNO<7U|#!̱7[& <~X$2)bf 0>(x/E?kxw)%еM'#OM`%M`u2? >"&a-Ƨ7uukEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/8xV[x6l |^aXx|Q Įma\0ؾy_j𷃴6^ <~ć\ǀ,"M!]jzӥ'ۥP >!^{xCEZi`ƽ& ARӤtoRԮ/ⰴHQ>&h~*$]#:]=żOm2LeQ.Xz+Jq蚮kZZ;;} =WǾ'<)\Gy}ƚU iI~.ns]~?<9۽f׺rLyy{ڽj֥kzjw}y]˧7ե)9&rGžX98ERT&˔,#ŬluZxGAŪKR:nju凣:ҥ N}UPEP^k?~%N7.ep!twV ծ/nuCV>O^x74ĺ3UqTk&%zpQLvg6eaC`ba117_) =x\D=ʣͽ嬡g$^C DGUfwPAu_xkhC][U֯RCX|PYvcbԡC تYai*?],1' H;+ o"}?x9;?x-]7sZuMcvz>-'_Mө[j> u(+x)VLrFOիN*3505:8z8 *f97ayz%: Q_0EPEc|?.o4-O7Z L}~Cm0i7VWZtW+gqwikq,/5NQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhyπYkC -kes[xyijkMľ 🇢-'Q _BӼ'x oojzg (Lke-.\ |3kjfN?=F^ϹКͮiikφ+#ž-e=῎~+Z}Wv|E}pjoN[}O^֡lLe()tNї#URxzR*ӫ:TYYG-'fVUVc+yv#ЩͨVPWaN'ʾ7Q]aN/>&bVJ8~Wgh믈?ě=C߆|'g൧Qto |8B?&$? xWR +N:׺ahCR>.TEbp^"?aeRКyB ʜ$.]kqi+jqtce8摋aW9(mC 6gW'U;h=CῈh/ɪmSzgŝ/}K a˛ q|_/omVm:&k;eI/g_>д3a-:K7t7D%%e&_PRXԯbVTU x[QQr5E^r*2>C;acԲia//HӅ94k0xNhfQX%BQ t#Fqm+@e _DӼ-? >}+oa v i#e_5 /Gԯ,VĿm ,~8Xwڿ/4~*ݮm >6Ѽ;_-~tK k׾ +{K JI5W}u[4D:>bhO ']D-_x[𯊮i. HѾ gV^miPA2ҸKp Yz'tQρGAz6f+OCq-J-Mn-̧D4m㷼l'4!34--,A4/qg:K%圲ۼhK{hF }A@VL2g]bsId|_yoI;bh+@m/^$:x!tAQCk5 @ cO:rصмATN*+_JJ.V{]^ֺ:8h1L$qhJ'QR0u=5̯stfX~d?kbᆝ#T׏SGΗ'sPEA?-RO _~&h -kύuox4x;>>=NDZxoGwkޞi=ӭ;e??i'8.U&)Kr|W5xZe~^TOJV%ôʥ\O k:j*Tc'JPL|'7M{⷇wº/?{kIc4ԟ4r;MSNԟFyEmqq/SN@~"/>$|q?~ VMP~j>3Ҽq j{? x2Po}}dC/k8BZW ԳHхu:$pGЭ&qC1N> Y$VcQ M<B/. xl֌qij8[ߵ)k?pޕ\3?=<g㇅jZ'u'I_h~ߍ~$^xH? o7E“\Eo%͚$ꗰ<<ЌjC DIx8%c**UirWXxoY]8`1]|-Y(Gk`ν|Rayu\53 yٿ0fƿ'vY_|55yW_/g V"V=7zΕj6(X߄'D_^xg[uot;)`_6q*zG. t(mWBV`jPZn$i֌"ZHVx5]<9F0+N5/Þ` ML6#G QQrX|asXb)REQG V*jt5~(|Mo#Too>Gwo,/xwg?>.C?۬k?!>fFg/k3M])E. I7ؼή taQ՜UJrp:Вk(T9pA-EYkõ..:*x%dz\~% 3,.3(֥W : qp%U8v!xoKz~٪/9- V:ØKֵ=Hje=D<ʾear|xuTM. מS9!~y[d5p 6hy}z!߄ZYMnk(}^5߆O wVV:>,_hv,]|Qư_/M`5}? |2WGҖhh!ƣ ϶<ˀf}sc .U,^] Xñcbsڸ,LBRk4UNjAtW`PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(¾0xs⏋nt:O5BGu#pmt)o4^:9#Q.k .5ž|%cFo~\rY4ڎk7zGmo|2-][('Xo R cޫ|47zׇ 4y|;۽3U%0Ф|1x{_iaFV\]I{6|o'W~xkSO? |]dp)^Σ/5Q{-Nk9otCYImfӡK\C҇|XVURڛӥ)3\Y^ +jsI* ff:jgձ(Yj>7ICQ<*/Rsw4/Gx@BYxCO)>=loOiӼ-sC 7WNs|7i~k=>ݩOWƯzǂb/>- G7oK&Aӽ9y ϨT|3Я/%ae_+C.aJXwJ0N%5 oJ.aէUbg|C^և U,V+Al 0xܾ2l%l6n3#_~2ZSi6mh%/~~$oo{Jz~xZn=ak:~o㷻Lo.O;ⶋ{(wo|Gǀk/v~ζ>>|KkBMFe{7OH4ֻCl%8YK)QVTV8s*KPuc/h߶Jas P\ޭlo҆+a5¬x+Ij<\O1?$\\N/᧋| oQ,״=k [x,5 jZ>uE N-+J=KHb5k5e[nwMs~2> ML/x&kѬu+=nO|};x\O?[-kDo^2#=4({a?';ox]/x= ^x\j&W׵JXh~iGU=/~gNx^?+_]Ƿ2EߋWυצzXOfd^g`lψ"/o {rl L\ \fU t|6W_3IN{oڧxBlcxe> j2:mt>K+ s:kjw><)LhVf>^ |EUDq<&c͉zZO*u#ZO939AЩTƂJQ_(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<▥Auz@ѵgZLJ~an.m-GoIE\S1CNKg$|p׼#Z7b|>6KxjCV׵oO4IKgV{]ɹ{ |hN&a^?1|9w#߈MFM_K$) ](tC; ǃZ߇t\Ki>K;}ők35ޤ-sU[Ӽ?Jt6^25싺K#_]I=Ɏ4;E\( (?ӣ| ׉u?]=$_>0|x$&%xW亁!w?i3I|C2;s߲?‘{zcGh>;Լ+H0Fӯ$xźђ{xW#]^]pan Q}#@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh ƝmCĖu߇V0fmsYaдgI%йh-t-;T.P_)[>8~ڿßgľ[xRVl|75dLuk!u=vO zuξY:d|m:_~=mOO˭CQ6)e}G\Y-5dWYԙo-a\->O.į-n$4|4O^x{i?>|VzVrž,xXhdw? ㋽GH|Wt\t"x\SƻIui{`G񵱘I \MQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh&—׈9D Z9ΕvumzM7?H6z&,丆c5oZm յi[vizѬt5wMoJ b ~ >_š>tgD/I9S}:IEҗKF+]m;?No˛[xX#u)cP-M&?-Y __ŏE4ŷG"Y}E$h|8C㟆_ x'S%K¿4i ,t3]b%o:C <\nuS[{kOzOg7>zg/\-=Ėt="Ѭnk.&^MaKҔ 2ZRRIݦMifάj8|^zJURB#Rr65$&Z3䏋_>/i:~ W7?<-o&AW㇇?q> Y] \i~$7P|sWÏy~ Zυ/w_ *?aա*>(DxcwOhOuγ7D<|GφihQ_Ra`ф^41 R΅9JRIJKܦ: -:yY,d#a|ڞ8P1Ȱi 0uf},E,]{j>)ӭ|LOǾ.Lj{Ė~ ƭ7v|CSԥ7m"MмyoƋqu?ロweWi h><%Zgok)>{OhX4/_^~;]Y&bWnN<< r7e\Q(RkIbFQu*`%NT~:)CKUIb Mr?ğ&u~"Fo^е_o t; KHK_iB+Dm-mn=SIUJfl;[McOu;kJ6u'Al-WZq}nͥiJ֐Ueթ8EB9F)(Rn1Q$ҲZC1FVF0(ѣRJMt8J0Pp\m$'⿅Q"s.u=WR.Ҵo{Z:>;U |lodd[u[ZψGӼo?n|}_Ѽ'soÚ[|F_?><|-CO.<5KM:k>c7r*e9Q7᳌p > x*8J>7/<k3sL=^IM߀_obONJ)Zx⟉-"[HV~,uxVesE_>><>ٚ˽j>,$ЬK{xxǟ? -o8|VEQ6U,6bژ pN7Y1f\>;:_/>|S_AS=.`|uժwxcwZj/('i7v5H Ѽ7y ??>'u8]`:|Yk>6_>&k2{k; _‰}F K g(|+nuS77>xZn×[ ~ u߉e|E&^h4/kxw|m_\ZC kP.N,I9V_Ĺ<W&p+ Y5h98!,nMɿ9>C7 #C(e؞ƀy#o_2hƿ <"~ "|m~)xH?{p~5^AѼiGw}#G])m//d}[Q~h.w;/!ៃ'ǟi~D|]/ xOOxsZZIoEE4kIOCت_|F4)&kX@_xT^hga2j6yi}֑xAK!%{\^Se%YOu 9&'_/pL* >rG|3'/7W ?cn]jWܪNEyPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(|_~9tkuNtK?~"x"k]>uW^*2cM4rO:[E,GGCׂ5o?h>T5OQү-dLjn'DQdԙn$> Wu8~֎}>.G|s۹OQn|Cbv6w>mo4Qj|;+֍gx爼 C=ΣTST7z5G'߆iÞSG|Cx:ْ]gž<^YmS6QO2&~g OKe8ʕ/k)(J-7Mu(swሣWNzu҅'cVI^x9be 'S>/DtYS^]m|A- <|q_Lִnl.F7uFўR;{]}'Lt7GPJmfյmW^e5-s]ufZU5 SP2]\M,MiViiz4|#/o/_Dž>"_ks]-׈0kW*ͩk j_If_^FozT'yl^i8P3< S 縌džjX9ɿOnx/_guI4O1[>XV>$/ @>0x_4۫gZ5Z6ƒh f [%?h#t{N[# S⟌~#xHN4y< dj6]Vo^1q~9qdڞ6UpyeӟgTYUTSpY8V y,3nxww_?>%a|{h~2qmtOǏfs[}2MSDMlV(/{m8^ [2xrQ}S>6k.s*h-G_:42]hj3sXɨ]\>&q^k&G|5[y?ͧ\>gK[C"07G:\/9`\7Oø\J\0uQux;5~=9<[u#>:j_.6. vB_G qòe% 8L$d| \]C\'Y9 V*,Nkdxg 1W1e<^aaU?f_W|x|}f:k?ڧtw>&`+(7k W ozgO -Iڤŗ__75w=%ψ9}{yj^,uMVU-un.*2'1N86ʳKg9Vab{g aB5#˸W幄l fU1A91RK)NsQѰ~ 9վ4^>5ߌ<]xY/Xu-j;|_O}'BPB0^Ȧ=V(((((((((((((((((((((((((( Zo?DGWh_-j_Pw=2C||D֭cicmmw}0^9ÚVeռXo>Cgat^K>B|#<=&\մOkmji/>#Ф*toSլ )֦\cO_\|/ ׬|;& jZxC5rkoiG3@Ե{H?q z]/$ӵ{8gᦧ?<sIA/+\$ʨN&nltG[K.$9htXv~|O7^B'yɾxH񅮚Uo,!7(8]0>TD8+.)xl\c,5hVoI.nY[U+>.>xfO[o\? 2WX9Dj<_<1x#MWnk6^,4oF&b&}CO~|OJ[cfٻ[{?~&8gW7m;:tZ;6ѴgCΛ>mDJXpjkcjJUSu+c2cv75 OΞ#=7NƙIiy&c7^P|e#}Dxz [NEFZCBѴ=.fVj~:n3[Eth]{(Y%Nq-ԫo IAnjzR}~_K iOTs*|{gϧ14RsEbp*Sjb!%VΔ:sS'ߍ&/>xc_|]n:<#[#炼31\|Z ߃¾>M&[?,n4kZPou?<4|I~(=1|1'bu?Z\Z|B~HM3J4xC-aۦ-N{:юOWWJ7xVQIPI Clƕ^9]1eO_V&3ΪtcC>!|yh?W7H迳^IӾ*gOA][k to ]Oî[մZO-;f/ڞŞ9?rxcl <-ƚfҧ!' VB03u*}SP|C׺~k'<%+%ϭ?>(`8zn6;֩Bt)qg8\vW,ne25UH+q&P%Q?g?|\ugW7Id=_ƚ~c/xo}7J[,xúvuwÿ~&X~/~z_{ρS~ j&< > j~&c]Sw,] ïh-jeDŽ`gX^+xxW8,~'Î0p81/a8.Nk9X^slwW2΅ VxʸOK<%~5ZxKՏmKw_ >NED<ciQ$ԼA<]k-UK!קS_AĴ1|qW͝ZYOvptah|]^L\ n8\$eAQ _~/M3? e>0|uQP[}V}{?wm6 .iF6P~|>Gǧ#X>x=[(Ÿx6ٛSԌRx5Q1Zͽ'\qEϸ2%x#?;f9gᜯx8&48a}GRy}8(((((((((((((((((((((((:Duv g"֥n_k@Ex=3yk'Sۧk٢}7B>)xK rn[$g9)-X#DmƟwg]#펅5Սža? FYึ"-!bγE"&- _$Wkf/Wᾱx_M7^87z~ki0gb)wz[[g$KRZl񽴖[Dxmk=Íw蹲Dڎ.'D3yqgY#>'||3/ٛ쳮|; ,g e4 hNrE6;H-,g?tAQڛ#B=+ Z1j1OݵdG\nx XIգxԒ\6 TԒƝ4գnGOxJ+ 1/ A ʹ^ p^AƛM7W1#Ul~m7NJ,5- a }sNMGCO[뺟5+K6Rj櫲ͿĪ8Bk}f#D""RWnO޻"ql|FmG8߲*oS Js6RGQXάߵrjQWtٯ \x-χv u$3 npxq<+qmS𿝺(oτZ/U_Í':| Rm4]Fhv\Z_f4{ &]^;K K[xbH;R5W^\Utۨ&{ <3,Pk~?<& TXo|+[]!%3_{7[ů+n>[jjx_!m=%nbwwUf$㱰nQb']b+ښngwij].&:'Zgtjέ,N|7RgycxW3q'Ÿ|=Io58!~ԵF#t+IK6[AqrѡG(wCR6wFдk[-/KGwtgvT=Adk>|GtM#]ӵ]/]6T\/"t]f+gU5!U./!hej..x/zvuSÚ>-τ/ SW ]v'𾧫jey%^imqys$:p<mIUTЦpFX(*հX:TRpj N \xZg{xvxT\xvϨoMwg4χm5i!ub}SQtV2;53~:A-.UmWQ`!/|"i;]jksC4 |5֯]#XooAgY궚UWŹG \-C4s|w f\hVȳ HpyC/0X8f9~]difXL nX,60{ï >Z ~wM?%x'NCO%5M^ Di Vx?QSON%ikD GMZH%mCi5ot~o x$,33>αy/;ͱ;hSb D>*غKB)ץ ~<3i W~mE=L|3e:,7QyO:fT؋fo#g&@<Y#_]>D.=V]wRʹ˻C[}bidU]BvGs:n&1'ǃMj"ϟkc[m{Z#|7Iooœ T&i=?/|Z~+n+gW⿁{Gi,׆/|'u]z|Cxzލk>n}#81]Tiԝ8VVjTR49W;*eR?VȪfqF5gj [ r ¶e|f\V_S9̰r*RtU*u׫];F] X{o_OOͶ♼Cx}/2^xWDּ;D6x K+rw1`7X㿈r|; j*#Lnk|Qo}7/o~]Hln%l=K^3icڊIKwZk&_qcR~ |3FLеm7Fw5/?d>H(0WJtž Iec'))BfNxg*xz`qPf ЭW`ٖ Ù6k68|5k2FeY^/ Pa|BκMֳx?De/W_ ?hω_%|uk{]QEcXxÖw{4-I~<ៅ_|Yi'&?ZuGs{ľ>/VX͵={Q_u 6kEy%יJu1I(2$G (Ԕ"%'K(|5(A8ѨN2>+q8&/5ȪFiG8aV +ץSO,SZ~*X ]:Z5eJo|:5_/S>  w_CRaq[i?FkI tվHk4]6Ok{x|i~_Nk3Ŗ>({E/ixkM)ok_Zׇ<xZw+8t˟Uoh_|xisNt Y 4[] .O1oH$Q$K ; ((((((((((((((((((((((((((((:Duv g"֥n_k@Ep5Oiuvx:xZ3j@3Zcw5imt5eԵq?>ޝvw5kR7jVqMqB8 bvJ\UzXz^iR4a9ǚr#vyIEuivfY}ĶZ4j! wJnR\]2,ioyb=k34O[Sb-5 /--C>զK{dn#ܭ嵾V rFRh»'{VN]^ى3' UkU ңO(/՗7.aNx{GRt߉@?.?B|Sox?>25Ox{^zn-ZF}\4yc:sRI(AJQrNSa/)%~6 _ఱ,F*(PZ0НZQ%_R |j*UjB<+ݣs1߀SMCѴ䷼TwFȰvu]>22F+$ $/^ ~c7zՖ[^ Kx?:wK]R55֑jSw^4|?e\Y˧i77Ft*T+ jD̠ӌozjԦ^\T pjb0xH㱐RUi 4*t15' >5'_g߆5OR:G4ahڎ:Le_khZLe,I#?㇂o|IJ <_m%ZUޫh0;{u=06K%s۴S5=ҟe+rߛfmL< ̕/%xG[RxTU\!.uO[s]4__uf'ǝ>O[Gl-/K>? g ^6̺׍u@aH=3~2 j~/vthյ5__[ilKBs-mfe2p+L~ ,躔*ج]haZӧFRjS T`!qY#W|=wqkK|9I|M[Kψ5iU#%RjZYm5il~_ŸOxZOu ?K>k?>J} x:CC_OC|)q ri]foh?|ks>SF/1E\s|M\&F_<9'/j&YͲ|cqY[GFᆉ;CIJ%[Kku ??i_OnFRԼ?OM˩cWxW36t ?hKiggնKlX}OIa#1!9v], οr5Х!Nx*:~˞2,FJutWQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhCGK?z?bX]&|4t hNi|-^uM,Z[XeRygƯ#(| |'l|'ğ wi⎣ Ec_|'÷:Ea6p|xLt- |;{qc5͵gѾ_' 6e/U;!ۍQй c&oQ@s"}6Q=i> àx|' x>9#-gٖ?ي_Yӯ*xL-jYn+G޿k?kB}cR'ūm#]/ x۫OC|oxm/ i-5ZG5Cjx~[_+Yo3G~+Vw^Gt.iV ~O,ҼiU׍#1{=oʹGэ&3)au]({*^5N3~iZ9wlgO/ +O'Xb0OC;㋫̨}jc8f8J8 9^ 8m?x'/ᅯ~^ßZς7o!f}hiU M0!ѿ%Mn;>qC'^<-=/Hӵ-3C/%Դ{뛋6ͥjV_#Qؓ*KyS,<>x<^#=/Q,FkQR3>JjBP(-y4qg~<> ^!%_wZwuswkϪj~.7cO}uExoOYʟ|-_ _x{7?a/_Kx⽭RƟ4υu^ušj~_~ ˩eywgٯ hIgXLb=afs<d9<:ʾS./5COL~_/o^<0x*O ڿ 5 ~֡kUxf ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=7 >7+g_ *NH{x].%tvkk %-RE1s_(,ח^Ft,,}o\MJj:}JOn$C vW0ZMÚgA>6|)i_Ygm-ci\G6jڶiKIdI"'i"FHHLfXY1C dbXG\1+Jq蚮kZZ;;} =WǾ'<)\Gy}ƚU iI~.n*aѶ"JF8ROUJr9SH|5Sb.Tj*a0 ھcTï>jԊĪ0EFQ:4-Oִ-;^>DVs?kXPԢm&V֍W(E[Goi Y5M;Fm29tXV4[HlmotiekFܲy '~Ӛk4?|pW{:g|//Ɛ|Jop'? +P2l/xÈWMvWُq.(C8mŘNkS5p˱8`4ʲ, Gb%C bjTs~l?犿dۍS CvռkiVI[/fkԇQE gHԮ@:lP_tz ~+g|-ơioZĿ֒mO֮<;\iIz:o%ȉr(;f^=G`y]\%No^ qcC'㙾qZX8 s<Ʈ 8ad> -i:I𷅼/Z[5@,mKM9_ZƲH̨/ >%|;ǿt.ž)V24*k Q>.o6(^Rkp1Ę2 `s<K0YV?asWy^U(煡k _VlpEJ(xnt7ſ&ٶ=K]gÿ!Ὲ|B'q|;9o":6]h<^&hi7vyg"?zVi36յjzj:O$"?cC qYkC -kes[xyijk ?|qwQ߂?V? |2(GT:Ejz촭GQZhY,ZLBX{5߄>4ӵok_i? gO|G/h~ mR-Yo=|(?I٧R'ΥxiP7Yxºoռ]g 07>m-Qyp]_-F}A@U CJxt N+;V=B;MSKMԭ9V :(o" qissm4itӳOkTʄNQ9JN3eqi4>]|ss~|m-,<]מWY |E[Y'~xO;OO֧n3nCm5N ~摨oƚ|li?¿<)ߌ6_ |AmⵯM=ڍυ|WokZ_GM=l=jAR2WJTν{Xʮ"5U.GE(Β:(MUrܲyoNhgle\l&2gb> ڎ5`U xp1̫q9uSK>. ^s/x/¾ |GH F/+-,uoX梯iOSR-? &jzR#Z0RXSZM*qaXwtTO)FqtiKጯ+Peجnf+G ċeН\%,M*LrP# kV,oԩKh_ x xcYҾ|\d;)uߌ!м+a} fex5Tk/şum/5ODtm3StOG~%w 64mGuo|Q:dξxz5p+B0TYU:XHP榣[u F0TqfVFb|T)t(qm CxLcrmd42[ ~2iq+* Q} A<9iZ&^OKtKk_zIW(oemm5-CR/\\?7HѾxJ>—4 hzOOxJmC~k~%{a*g| k0}+wrnRmmo?>RsRrRr9sr&)I&mλRfM;XӬu]>Y-R[;o-$9`y-o-ືvB\ 4uSw^^/x)7֯6 |D׬tϊz'qyŷ|g Zϫ-Z:Ìg*r-slU|θs/aL79fzl&8d9|nLqUlj?f);A෈5O?hxžž/|mT~ԃ=G?~>/%uu;Y_Ao5O>wa>>?hN&᮵Uͣ-|Rqſ>(]}W\>ixZ[c?^1G~ium;gL}w x,XL/yw i2zeթ *~9\AĘ1c0(Ko;_xjyN eeuY|n|GО7ϋ|q>_?b;6ĚbdWu%]Oƾ/޿4zN{z\^Գ~1ph<خg x; vI2l-^ xƗcFea\4[ ,h,sEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<+>(H<3#Y}$/?t}^!N;BGu5Vl\[ ZX|S}{]ÝWt ikpw1~ZToڕGyOڨ)>e$3xC÷fteMu'ƽ/ !h;}R]^ԭ#PEm6[xxDPtTPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz()j^<xG_4 Xux{\ݴMtdXΥ;D:T|G {? ,|ExV+ωڷ|mo,48m{VTk]Dug켛'^ }9|-3~5x@|9'l:6:9.j^XjԓCjj k4oWдKUіVt8n.lĎDTY˙D:z _:<=n:-_7n[ |ai5ZEդh mFI4>n;{(M)Fn0sINZ&WsO[aZR2% NKQE(EQqOtĿ>9櫧x/៊Yo~<>(q+7ý^1M'Z{hm۾y^#]1xO_57^u[+~'wg??='-xtxKv-O AнםIb1]զ΄jIaHFiUU:|E؎'J]O1bkf.k,vM6YK]e52b^ucpX1p*1T⡡oگ^ ωEyOp9Oj3񿄼igk6j<_tu:Y3.u/=UPaw|/)|iy|C}]$uosºO4=i |x֯Ŀ /~ Ù'xgǾ.#WEw/>j<6a7fNK6!eC-u5/ (IILTSƨ 74%y&^m/i¼QL Cb2jXBp1VD'Ue?zQT񍗈~ ~#O \ſ |Zg]/▕ O7J*߄= k6SnnQSS%Zyjҧ x):ucOؼ'(*S(8pI8cͰφBXXXe2֩< 9P-fta,ʵ:T7??lO1o4ip+'Q>h ,"W'7k =j#Nʕ*OfeR&Tz*/mEq)ZS^d8/S6}3x[03 K g>[-<6 bKZ.-<-,W3WE|ƞ Ğ֋j!x[QSGW:4"xYG2(b+/Umcᯋ|ixWŚm;ǿ+OҼ98< ?G5hYcRt b)t{w_{nt 5---5ҝFxQ/T:PN#RrJ0MFt5$yQ˰x,}^cK0*2־ WxLCf &piPPF8^ ~*mM3:]ak $.`\wtqȫ{Cu6pku1s^>x[xHޥ{=N{]S]:uΙ\귶[VOaI3 W,fx >cZT'ҥ :eG*#V'JH I-|oߊ&c6_t [O '<x^񿃵­ OYD|a -nOk~>_t|yo?g Ǟ*_>|#|Ekⵍޕˉ(%Ax{ĸGi[ .u⌃ ܰ=~J9gdM5+ƾշD}4 |O/x2o-nŗ> k xn/ fmzė/xLgoDZŒ6i5??k&2i:kG-shc1L[uyng ƯXfWc!קO`)z3aM~1_xf:4$f=?kSoi?ow)y վ/h4Y]*A'|-Z|K \xN௅*.OkGgm&v%U7'xfxxgck}7S]B[YK<o|l×$E;ž7𞯡.\G-n_7~&Cx~|k+sZ'#㈴O x÷ŏᎷIj~5/־!晬_꺖3ĞV,5ëiځ%^| 2Q΍c}}勫bHU!9m,lDQ _K? _!e^ƻoqOk?>ׇj$"׏[Ӣ΋%zD)G#k_k-OO_^)=Ķ^qh(<; x+N񇅴]CZ_{oU"jzxLM8=QkbjtpNSӨ' bjWUST9}Cai)}:YͰcy/ʱx,.:x4T8JTԫSS8fUh/I{Z}3ß&^~ʞek t?Zޝ/>*|)~9/]x7ׅo]=VK{M7I D;o~YxAе⇆5Ÿ x1ߎ+|?)ui^ $b_k:mup)Uy؆ʝ:PJ|qM)7Oz*a" \sVZ˫ap9gYRTͩ9 NUeO'샮~ѿ5/*%k/"hfm'WO^Dg|GFXZv?$񅮿rM&;:/ t=_>>-cG;WWM_U¿/@}Sh1[j&OjrX6uE,ӓ ㋍RBX ui ê0WMm>hBє7{ Y{G+'*F&QO bS/)kbRrZ< j5ht|]>2|Cq Ez|7|"|8'ռ#|O3.g_Io::=/s9J|jn1F{~u/Au=3p!۽?ZԬFk'tzXW <㰕:PF4iQQTiy'8CISu c8| zEhb ӡa)qQ0Р/b3jL6a- b߲j>#>|cY~+2;^4v=^?g/ ̿$ӭtv&Y=y?ڣ[g%JUI>lMybW8՟,W4!B)E|{|viVcZx~7gY pMZTb}8*NRVT𵿉<7X|A}. p":][^9=] &c{-5)#k7O_@k V=φx_xg*Wx- JmB-|cOXko³i[5e k7ŸΞ&O-/|P-Z_xqΉmx:K?^Zj:xjE$Hu)#Ѿ /̰8jӈ'~)ay|7`_-Fy %Fb07eWj7,|=SG5~> ֬`6?Γ}jR5獯l5h(ԢO>D?e6?Y3/xůAu wϊVz/ŗ:'44=1=4}kO־q|8O |!+NGg~# 0O xHx{x?(W1xi E pu|JG,-<\0DŽ~%¿5!`Ӵ{?o:Iu?fŽY ,Bi|?Xt_q7*s̟)ck0faSα,=Y9Ɔ+6ԱsSʰ~J y7:+ox ºs:5}/6~#zeζ,|eYHenΏ5Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh ƝmCĖu߇V0fmsYaдgI%йh-t-;T.P_)[>8~ڿßgľ[xRVl|75dLuk!u=vO zuξY:d׾%x4/<}g:Wu?0OçCXFM!4/!_Noj?WqEp^m_fLqQCYE,,a +~(G />s'n|7Z7~UdPRKw])r{H{Ez|Z}m{X'X3GA#zs~^7W[O>1x{oi^o|Mio6F𗇏O kIl2}O"bӵ)?[F%޼&SB*bcGqr?{FNZ6 }\=es˰9԰@y\Ƥhs*T14'G*\br6xԍJ!oE|>!xLٻ÷ũ|s} gW-kWi+(%o (tզִ}/Ki65H<+9Tោ_ >._~h9 ~϶,~WLoh;ޟ{Nw}<_'ޟmFyYL+{tbj{ӡOJ4SV.5ܱ'J:|< 3 ^qj+*dU G3l0]ѧˣ¼}GOeBX5~wc_<_'']^>%M?/j A-)' jƻI<7>|-𞘺'S?Ym7C}&+ Cp>' \=?ͳ<'JI/2'>ft3&'4T-2Ya3 ypqwC$iQ%W ڷO|\|]_EkMKZ_ > h,a);X&| VÞ%ŢN)gFt%x Nmh +m< o%^?]bgy>3,ST)Ǭ fyiY~*#Zg2ɝ8ʱ|J9=Oڏw]/_|;>|Q7Ū7^,FxKO_h ?l~|9eg>Z/k~xO[m|qq a XOg<;7?E}S8'$p'5*ʵSͱiuN˿ Pkd~ q- gel ]o{߳/|e|+M_ xgö:ƚj^<[w|7Xt׮e׈t궗qGs~?|.ٮf~ "}OH[]πZ\kͧ !kjվ ZjVZŝt=WOՂK)͸O;')뚯ß?7z࿈7g4o 7ᮓ5-'xǞ |!uxZjwzDy7_7I?ƿ埁Okߎ| 3_?_YPG OznϨj ]ǣx]GT=Y~m™LeÙ>; |83aqx. \\ˇ1y;s:8<2blN#y'uD]xZ?yx௅ yq4%_"%Xh:֛x[ó_># zݾ m|7u.j~3Lg½bį^.F_>7$OmCWz|+ \\m ԵmR43P]#ex] eBZmW1ď_~6X%k4umK\\I?Z/č6 go!_54מO߇~(|:5O<[OfӼ|5xN}VQ˸..,:vG[_K?1so |h Nxyt*ON_GZtZurRT.ndmXW[7;ψ?ˉ<=>iZ5ƬOk#V֦ujc ‹r|sL O|3*ӊ2W`2(T'B(aN3}V:C JF!cU|9㏎_O|}6aе_s΅kAʸ%SIyg?!2gbi^_96fY# .'ѝ|2OEJWEQ_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<o)xÞ$O~;υZ`hɨVפ|q/C cgaKl~o< x_V]ޡ[_h徧a6wAQxyThVzM""⏆>)ƑۏxIoiaT'Fkk>Aux_jY%$ks}aeinioaİYZB CEj*r? /.ƿ m|q^xsTo| ?-4]R&֬t#<)4n [Z>qjq!nc+{m#7cEk_<^Sn_ZIJZؼm*L/5ﻰ؅Qqx~Qbe(+A8T)ڧuܮGʾ&ͩΖUQ{qZP> ^L+8\r&&Vu~>f?7/ ~[Ld{0x6|H ^x|$_~ĚpBl|x'A+h փ}ZZ^^vnckhW7vΙ.qék:~I}a#դzx_?(\VX|OxWVB_<[B-WÞ*ίLzƏBDvVn:Vj5u]Who+MKZ^&ֵH.E\=ae<'Tg:ΰy#7˰**?9e2."YnkO*8yc.gRs!7eO w^׼Awh;.# O#ៈ~X-?I/K<6ڴI7|YqS৉#i_Vj#盛n%{{X[mS ӵ-mm 2Yىe|p|09OI,pu_7r<4gyvhS1瘌)*fkX=/?;|Cⷋ_Z"ҡ4/ 4ú'+ n5? R:j5^iH; +@xk\֞8K3 qp|ASX<u^+18Y8hO J*qk5_7ڎk?/5h$;QI+F[ خMVQᗉYq<xX4xҞ)aY,w e؊\kO4A~%i0Ϗ5ktO7<;C+NӴSQ}:vq'u 딆h FmO!8g ! lkdvg=P2G \"Sey_ l O#ßx<*?:~+DZJɭ>)NA$3şYhΗ {صס-x~7}[Pou xCƚ]M33/[v6mO}&y,eL~kd،TT1 ?(*t!s V_Q!M3*2HJOA;~Za2~$<\b|:O %߆.|K^jqo H|OsE,0FѮtnmy5,vsJR*BSc8QiII'vvM5:Uxj*iVJeTHFIڄԒMhϛ"|6?_?[5}O_qz)i~GNgkyXhFmZM}.CtS~V~'A⧅%&c>{d=g+]rixm㿒K4jj5`1N _Y6MFpbֱRQt(eϯ`0У_0xZ5?3F2:zѧ*rn(ӧN|i<__v^8` ,T-ïC~i|#5|7oꚎ///|-s]ͩ^h8~i,>___5_kڥ"xf[+i^xH_]C~g[/|iMN|On_hsY~9&յxcǾbtM{Y~ѯ|Oivi>C:u^mcko?.tyeN4a *^Pl,':0iƬ-;r%#8Fl q~rPQOK0ɨbq} ν,5f&^B\HOEnh)KZ?5^%mi/u?x?Q״K,:<7w[$wW,g%_(n?\W\|xݞhPiZ7|=xGIkV杪A67Ccsq2i~uc ,1 i:ib!atkbpq^0)Q(ҪQIO7%K/xc mw0qǷ>x 3zDž,5⇉ִ+|m zkjW0GpGLJ<Y?e=+'XJN9V/3LViȲwV]<_K3 na xr\Ѿ3{xY?oGk'xB4)5??|b3gB('t_nO&?Wb?<q kA7@ҿ-o?k|4i B~$xo RyxUӵ3?,-~ /p?WdW 5a'K ¸ 71C,&ÉU‘60-O+ =to^?^+|5 韶?7>+Ǐto?#x;<~xxi] c^PmDmD\x|M7yB/._|$/ -G|Q?no'uM[Rm4]]Ӭ"D~oeΡ_'ý;_~#|&uWx|UOďګn3L햙? _7h^:6 _e<1/^/,t /o%sgC~!V1~gx/pdq~kxplU 02l5|gḖ f~ˇ8 W3Ψz.?I~>$m sQׁ=?ߴk?4>Ҽwou]Cߏ{˨X<1d7oܞ!~ |wdZ;BO׿j}xcMmnkmMa k-׏W!׼ ~?d;><{?ŏ1@;?iۏ~:/Ǜ_xcT~ ~џ|oMI/!cUz"𖫨Yk^%>]8H>!h7D?scwWh4|>?A֮!C|+WiȐKZ_{^g.9 3?5⬪lS;/83;x7'o p`J[oKC3 xɗe^)L=LcH|$GBվ.|f[Kfᛤ.'O0Ӵ;74}Z bmRխW⿆i#Ux%px>V~(h >Ǟ' O/}-M44 '™N&˸-q20VQᏈx%Şv'+7*78:n iK>!0ul.] |GH5 ~yM#kߍ&؟/}nǍ|'ZK+^浪IO Z%Ͽ i/xK> ~җ~:񆁫x_A9h ,? oj|2z&uww6}RfFx"?Wlr|ǜcMxKR?ae|18,/,!"t|,_ڇ>&|Eľ?<_&K1x>6|c[KmG턗CLdm}38me𾥧iwdWg/s-OWSLu-v+I_xRXqښ cN-/#𽟌>?hK5 R|UM >.mKkVs{콡xo о?/++㟍)'|I t?ZͶ}T~u&埂b}2hP |+zi~!|5nj\~ٿZ/ _JS⻍uf<:~=GSmqsfW^8(:3.k웆 r> =p`gOsVa*o>(' 9g,=<,w~5Oz mVzQi٪HxnaGΡ½KV"}ۛ˽cm<g#G=E?|aom OZ~7'}FU5ψ? ~_G/u6^Iy{]š5N_|YASl~c%\pδ8kVkXÃ|^Ȱaɲ G'oC22x 9/;~2'C_|m? |W7~_<||\4/:F?m/U =N7i{=B?gK__|oOxxhc7Lio}CZ^^|9t * jN5j2|@t'xg`r>xfLI<;o[ƴS1YV[gCiq(fEfxd,XgC Ծ ƥHh|# 3?+Mw gy_RӴ{M/BR1|4Qfpji?'iOQjZ|B;^'ԼO ]zlV.,<~?r42 <*˲Z78xq9xV<8fu.0 _9 ٳZuυwo|$Rſ_w|Tt>xG|e߇|?;<x_Mдj$~&O'Ľ'Z4_|^,~п,YhD<i>;1K_>=_ .<%jwa׿./6#Ǚn2<-xfS[î_X*0|ax;1S=No3?kم b8|?w׏,妳[:~xqG"M;¾{xKg\tk: >ύ(ŋ_DiĿ >%ok&k}jOw|G.𭦙2|=k:x)#>cW*򜓆1-<%jY>+YWα&*|[XZyু9n3_k_ )' MΧo}{ᶟ[i% o}k'&-8??lmwgoO|D) |Y|4Ox*M Ğ4wSvͮ?~!j|:ï]10✗&sFx~]KT7j`s\| qAYw gSjYC3ekLJ'Ýz[/gę70i! 9Wk XxM6/ޗm>E_MźW? Q𯎣~"j~$Nh.>no|wOx2cjv̞ [xCMfдUF"O|V8_(3,,r l/e,˱|m}R dJYOٽ >"|/_n!x'AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(|_~9tkuNtK?~"x"k]>uW^*2cM4rO:[E,FwKeixG_G#.6RkOa[q-TܩtI$ /~ŖEYǠSc>%MͶמ 4ˠ>'=4jGsivXiMvvgAieeimko aR(`8@ P|V7Vc:^wojkߍ<-iy.?AOCVm7Qtɵ/ I5 6y_/'9i$5Zsqwg> s)c*zoO]px_noj}6Yn8]8RFQqeR] %)g)NV|-G<<9Iro2"00Yv)Sc+ FYf]RNzSR'Vj&&uq< ׫)q++ᆛ/Xw3O$%_k3'QiK#F ?Ï |+y>:kkMv/^F$~+z~u,@Q/MZmGX5wZԵZn'5Sbyu;^V5=> [M4/ntORu(གKiWo95=*RGucwouS' JRujKu%)M%yIݻ$I-KC1xF;b:؜Ujj1Vns$#A97F0a$xsA𶁢kLYӴ.HC ~{M>;[yTSMRHV$!\2̳w>x>8u :i^"KK,7LW-|AxUo|_k^)ҵk-vĺ xEi}Q5;m>燼Fs昪Ж 9;5q!008[?f\/O*ժe:ß,ukZ~׿#Y^gIᏌ>#٪[V}7tyydQ$ևnOiQQEƱkX?{'k0oO5?ω/yq]ZZY+b|WMZ}n%qe|6UY6)a)ax) _oC082x*d21ze2>i63<)%ޱh?+_]RyH;ݽxǒx#eQQfý{᎑c]?AM:u⮿[6hh<Ҽ;k}-Nƻu[㭷c54%um46+UW>ឍkOx\ߏUC_^⇊|QL6omWMXGB+'.!62GWXcy v2ী>"`jp zSz흝gk[gccmkK 0BQ W?_h?~Ė>j-/|!?<,β5xc^Ib|?iwȗ*!qX QlnC1fJ=xa42:_Yf8LV MΆ/^Ju⿇>Λ [u~=Λ5k:#4'mkkXX:O:/.>3\k73Rx~꧊c[ kXA7f/χXL3.MʱV3 0x}B 5yULFQS&Y*υf>WkW:mAOCin-/ď>*Mqx@nfdmK| qf=`&k?';[KҮ{ož7:^\xO8q]e&?48k2R &KHr5xw%d9&EGեÚg?cZVa>~tms\άRFӼCGHxԴmRQ,ַPʪ|/5|<[Z|=6qs3ǟ/x"K;k?|Bx[m GI#cbkxӈ,Mbx.#5˳Y6HrqX(PJt CdlҎO09~?` >mn>,ռFP~'??_\F8/x/ hj څҴ?O޻/w4ϋ>v~)K^\-miZݖޙau; )-QeKŸ#T dxܳ+,fYNvS9LvY01zB?wy Y5|E;7-cO}'S<&\xM'KK ;wMsFm7ZaZ5񴾁]jeϕ#y7efdIx;N"9\Lޭl%dY&Ie8hP`;er C 2 a𴡆~|#׭|m |OVsK_Zv?ϊ^3!hQ$4Mf-l&~ȿ |ps6ų\[Ceui? {+kK9|4|Qr:׌1|W|`ТKǾ1hjzƕi~)../4{KZcG?x.ŷz(;OXi^i4;xx{IԵ ǮK^ɦ֯w97/s᥾oZA"4xad)2<X"+TȲ,Np`gR<._x,L?LMe<zx\4il~x;xt_}n¾CoiMa}~-WKM"-y_nRm}S_mSCߎ0Hcj@Ӽa?|1⿋/pwCN|F𦦷Y1'::Dl~m;– 5,t}6GnO5?xZƚ5;{"ZRۋk_qy<۫+ x(OM,=ϋeG5XK %u\Ïxf2 Se|#S*VfAFWb,4gχ?m^4v^.񆵬+N77w'$>+u^z5we嗄6Wh:.s/ Nq|kxSX=׺X<->gL[L/5=I7O"kfg?2fßcT &y<2y-, (et԰X|:R^)_e? `8gAioXk_(xSUW>3׾#ԡEa Z]i<2[~꾄/2q+ RPS*2j U)I˰Sc1xVc303ln;7ͱ8'm[FϏO7ρ;|8W4:#4mcׇ-kx{~ v_խβ}bh((((((((((((((((((( Zo?DGWh_-j_Pw=2C||D֭cicmmw}0^9ÚVeռXo>Cgat^ 6ojZO_<_xgEMZczDShm*ŮOZ\:0/L?=K}_V7?MM'ϬKڴ>O-i5J,äE|_j:: kiױhڎNIm*i׺gxzXӭ/ 3vs[G-ƙ,{~ϓ~ӷo?iؾ > Ӽ/!SZ{}bRu;Nt*:|jQ9JS3rM63&CCeͫGㆌq8,"eB>R6 '*'6߅@-7?a?n#Y.~?14~0uGauc|2wi>1^#oh2}÷ڭ:%vF1WS\)ka*FUItU“ME+ʢy&+| th9JbxU#fG N"ʆ xp2lj~6|@ ?'į^Z-SĚ6{{/g\< .'t?χu ^[ Ŀ𜮍/D~ѿ֡OxU7'Hмu{ l~$i"g ,qu&2_6 ȷ-HU)N0rjK :sO :JQ.WUB>6._Яe40Rj<n9LXi7~-xk3Qeч3m+NiZlg6t kUxG~8m`Gãyq¯o!U  ~" |7xM7>~x:)S-6^e!U2ZZRђ<_ًXc_> iZ 7? tn[|$ҥ𭞫%Ot:;K .#5Љ(1T8)VUƍZpYAU$[(ӲJI_9(YkK/bNi0a!KQQrF4REx/OGVs?Oj׎OZo-j:eayZ5hVѵix&_^kNg3~ƿ.9/ï߳'K^6A|㯅~-hzwеMBox~]#_R tMg`-w2>,F!ENZNHתԭ;BuIJНI/uNf2GQbif渷Ḵ,kU1 |N? UUQF|UUju*Gg~k~Q?Bx7R#vxLf~;O K;oy6"v 7xgIWÿ[> mͦ/It[R)tJӭ̎l!{Ğyq5)*ujJ5J3䔜yJ1[SJ +/1yeEV5k3Uҵ;H/OMK[?P[[YeH. HfvSo]/C4_K]3Cmx>NѴ-+M;JtEL,-U#Rmm|#)0(+EyIݒijy}TϚxs_ԾQi'Ӭ|FťcaXYj7Mjymmi;4"H'GIio|q'n-xG^?:OtKOxk=K2]5/z߄4-R }3Z(T[**.ƣz^KrI+.[{pX8ʙ|O봱SONժ}jWBT ӏsSMN P]x[5k WTЯ4mJT[fuk)U{?Td`g]zFQn2N2N2M4駪~L¥:g:UiΕHItFP$$.с_|ghw+Vx{^wԵw]l#JbQ.--y8јykns]h?BH&C⿀+^n妙j>='Pk{8/@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKh<|T/"<:&i>:tMF|7|~ūshm Z6K}-N!K;}OS>«3W~ԬT'FGxF׭_6ZxV[-Z=:34F0 5٣&OďBZÃTӬ?.{}Nnwyooo/jn/­>hx*n=]o4h:/ ^ڲ&b5 '[О(5 6P|_h^!OemKؗVO/WOоco hڅψ2wlˬ6'cVhGSmq7 lp86愔kuOh Q*F9xߕ뤓>|-/ǻ|\S^ѴI|+O xvn#?ĺƻqGxR[K?jB^%R럳V]{tO|G-ִK✚wj>M z< I|AKW4o#ۢ3,tikQ֭ŷ{H: Bwu!IIRdNĔ0U U28`jNT̩O ]Ԗ3 xWƏ~/O{o ?goSU_6ퟣj% [k7t=sQn߅0k~  j[sxGx6[խ|0j#ӦU< :kZ]EwƧ©ֆiXVן%  ILBiJ\5K$qpρ2iC2+>J7;5Τpr|Lgj]Mb(x'㗂>36< ~G'M?楯 o_x~.xW5]x[ş&,<__7)uj_N/kӼ}kyo#4aFU< ]oM^gZl- [xW4rsS7O BtW:}P7&i\>Go/ג;{+}Zļ&;};LXA\$0ȶm.}PԤ7VHs0~SĞ9aCDImTmFSԯ% fblh2c/xNMQS_#{wm࿎~u+eI4YF}r:PEP|e]mQ5}@>$xG[~xV]"匶2Z ѼE&d%Ek4n{o[ K㯄>LwַZnAWֿg}CogO ˉ|KV[Tͩ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=?"7.CKk,\`u[Ѽ+;X=@=GLJ>4#ТOQ5cb5zv%Ӿ%Zilm)W4:^{Vxw_Ëk--m}/ri5t=.kDuea׼KJӾ!Cqx^/ú-GS҅4}wz4Soi.tV;kk{ZtO/~/ͼ7Oty__h`o?MӢfko|fe!x_^#in4RѼåkLJ|Mc4Pqb2m1b1R!p'M@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<|u[Gum/xYc$rO=G.;5ږr"b9uzm_~_V^Bhu\^jx Z{ʍd oT@񵾫Z[YEpHG5i(n4ȣS]2kB_Lӵ[e-; =B'TYxbY75RU*I"+ PY0]d/vam'ED6)"^k+@1Gw" o]M V ycCƨ\'WĞe C|5]RaZݔv^FYl&#tp8+__I j;n>h~/垧otB:|EL%0}W'{~?ڇgf#\ Eo x\\4o/5?^G%eOOsJYv-(J)T:7үQF=HF]ZSܩ0{О_S.N 2RC˧WT3 BJJZVCoN+WuiMx#ƥc|F}|h:OCmˤx_RVxS/,nhQ +ڿk[9)i SH-_ڛE+Z[,u-kZ5//FѴ;PU-(f1`ib)UUK5Rt6YũFyENj<-ĕV0$#<|tcS ʂQb)N5]Ԣ)m뿴o}Qxr;Ɵ~(kơii5TM\O1|_=gÚuzN~Z~7׀[TSrizw. SŲiZv/oxjoiM5٠W=c $o/!п)O'm߆G=?ž1+?ûmrJ5Fž!,t,:^51&,=\N01QwavMCc9n]*Ic3,(ŽV1J*pPσ>,OIo |KFEu~iV|lvrgҕ4-zZ C>;9mil|Bw xW"44]^AȍZMOZ_`Eg'w-&[,c?c*UBloecL-g OC~h]P' 3Z=:^|)vOg hujL~<7'O+"DFbtv3oRx_1,4ʸs$ u(]IC/<^!񾃨v<ޗM|M݇A}Ϧ=%žS6kOk EO5 a%w:֟ᖹYm:ŝiqikڞz\ܸC^/emLʖ[S W F'rl}<;TJ+iM,zEO_ZԨ/~OtoxG]ǤxOv ^Pj]CFyu-{{ Y,{Y M_LsW?xN_xL> _HGP-si:h2]j,{ -ZD<0-X;pyO8hTqs+/q/J9N5B4qqYcx\Lp%ԌL<6Դ=~%wTx/þ: oĺw84{>/E:{)t|.x/ |QBhm:GO_4 1|+LƩ^^KNY ?wm`[M^[;XIDl&9O/aq3N!f96Gg8rx 7;YFY aepyn314[Fx<7j7:F?=VMyڷmVNm!"[+ˈn`$R G6O )XV];~!xG->_ίãCj/o4~T|c?ܩ8#؜Y 37a8b0TG' gZ٧4*4/>$h,7ÿ_{x/gSx,Oqj}açks5.,ͤV?ˍ>|y /3|7_~V ߝ/r䍴y|1GY" -"#r⟄WoB.V xoBn{]R[x5k[Y"to/.mŊ]⼻72 "x=ɰ1yK6W/<|®kGN jq*3U~|vZW4+Þ52xš&HX =[NM{LѵKI]* m䚧o}0_߂~%%Ӵ(?<{xGl3뚬PmRP -w5~isύ)p-ljyR7*Xyd& 1NJqPԧ(VRf证 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=/>!?us-r.'3F&pXLv&InJ|=zPiT偕og>-!9|OҾ'|2~kMG;ͷah6S5^'4gдn(xGOkF1_/'6?7~Ao>=2R u_|j}-:1)T2)3GRXjuN5F>F*n -)BQ~ *-f9WC?`gqur.?.O3SJZaP,gTʍ:qU[߄᎗ρ2Uwf~ww GOg|$Ru%Mfnn>Dy=Btkm./4ėږo-nuBMJ}bRn.u[+{JZj7ѣQBѨN(N8\*Y}<.Kݎ* NQxgN; t#Fqm+@e _DӼ-? >}+oa v i#e_5 /Gԯ,V߭3[gNB5;;{>Oowew0njh֫KRz!Zj3*jҒ:AtSc8NRZi37|=z'ؼ5;⸼9/oKy^:x|o|1 _:ϊ~#͗)ǟ'kcΝsx+<=qmu_>5OͦzG|%iЫ/W!^S&rwY4) ɲtĔgx08l6F7&Ÿ?ho_5i~5o%;a>Gu/u5uf]gMφuOYM +DwB+7Zw|@/>OOo/g.;xt?13VNy5/+W. ^'p_pj1R252#-VW-ᜋ01V[(dzX㧉4~<%O͡x_MޫH?o6\&mIJ6O޵~-,fYQ᱓axo9rVsaqU)PpOa!F.]`Ղ[fn~,7F;k#oƟ$~iVد.r 붠Vƾ1%>"j3xF7OLu[#OE$ďAÿ> xgö:ƣ-xko_G/>#Oh:)mHk$H(sc<7.> c,2/? +XLe卡G -Z؜!e - ~;x6㯎/3[(?F|hO½[ᄞ?hO1|CnYg>!~zz nCSg_j3)xjڹ?6Or<\&s&3 t)Uwb|FIFs>M:xZ-xgپ*xß~)i?_趿u9KFd~ ]SGߌu-5mCPt [J6O;TǹO7x-NVU"XJJ?ibWSy JUd*`qC:o |U}K_?o(EdVӭ5 [/x"DP n)lO-k$#^)cX+f<=Kp:Ts%` G*y p-ձr1j^!jm=//{to x_ïxz'^Ѵ};LMѴ}V7^&Ii%k Mwpd`r(l2VxbemS)ʔaü%y~6jqyCBVέ)´~(((((((((((((((((((((( Zo?DGWh_-j_PB'|3x{6v/OĵӡYžgۯkxF'S\yh85$Ӽcō[%jvd^/\H-]eh2?Myv -5?kOq}ox]iO&_kwڱJjӵ/'M6kˍ>}B+k-強o4.xu)4#KIsIٜ€k (-xVVr㙕`lF5)dXVIn=;ǩj(x|lZ_Z_E.GKG>}RHW rđI5/ hz>$hq$gĭ//[ +H_ N6mGMVeA=Zݜw6h*k ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@ß|[sh|>:>'VskKy:uXMYtɮ--uASR7UkΛ]?^3Nyuȭ~]h|D0 [B |6~i:-j^?lZ_.?Ŗ݌$ϣj38j50_K'ǂ|/51h/{aL>dHްJV?2MW_PPE utY>-|3;InD}']5=2_:'M/l:ƪIgº-i𮑡B5|^PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<▥Auz@ѵgZLJ~an.m-GoIE\S1CNKg |Yh [+o*ޡXվ|Di{t} Pu;Z߆4h$!5Ms:[M ?;ZI</|,gG}=V? |8a[8]BY^𽧊Vi[%,?F%ݕWVWqxgѨ^ukKemwVx3Ɵ<{ }GǞ^ ^n/| & ?i~RMRϊt׺յAb[. ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()i+_]ȵ۟@-?ߎjZ_^\j~M#DAmkO dvF[q|'|6NK?'J/07~%9'N'+^ $jQ\ꖚws_k uH[=[Wĭ-^Ɨ}ċMЦ͏V~.LZ~Ko_FV7qiwsspl:w+uPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<+kwX|M~[:ehZfɇBŞ$B4HST B9|o=kÿ u{huC? ,~>$ֆgZ NN?$ PuhVᖑ¿>#[Om<7ki? MϏ{ I~kk:XZ][es'n|7Z7~UdPRKw])r{H{Ez|Z}m{X'X3GA#zs~^7W[O<O|{Ptu-|W蛴[4!bkKK q{)Ԗ~6|V׾[x+D?K⛏?Ljşxug}Rū^O:G_xo׷^Zh>-cԫJTբ,ZD+հܲIbc8p~])ҠB`j`MBcpT3Jf3J2eJ5S8=i?>8v8oy-icׇ{ᨼiៈ߃| kMisY&ԗN_Ym/ +#o_x֡hu{⫏%ᕽiU72$,-obOFhSSuTYQRCtTSRS<^<ҊL<.Uz3_ V8T%vþ%״Y.a_P1]K{]KH |;a-⎧[|;.Ț5x.euDem|[wC> s0,~%/&sw7F5?NEy.5>;5̰~9!ETQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<o)xÞ$O~;υZ`hɨVפ|q/C cgaKl~o߈>`~,J.mnSDzO;P"xB n9;/µ'KtѾp}H}JR ontK WR]-v[˥}A@TK:4[̊'fkyqkF-ZC=3<\wv0|r) H>z/c|c?mCH_/}ށ/> M't.t|$^Kj2C5G0th’g(ye՝ TU'ccRWh&^*̻԰0\MZs*fXKj'ץC9<SVK.u' 9%|N"dk~џ~0i?.C/i_f&D>Լke7~r'+[|-:W䷲D<ϟ-~|PϏ>6|1ŏO?k_2m{ x |+>x;m.Payi}?^,,R)Ֆ"*gUFRsT>eF5^3Rs#|MWp#S4O S= __V-W G>"ӜBjJ3|0t.O_KKh5o h>*5>փs4}/=~0|U2𞜺ݺ\pk߇t[9pn5ѡ[h-l28_k;O<]%<)}LWO7M5/qgſxCTԚ2Ox᭥ $4AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(>9X᯷Zluq >7Ou_xUE]&]r)׺&j/7~,j>_z7>'w?Xǟn[Kix ȶ=-OR;]Z+b}MKŰ'|S[>$k ՚Og >0]zQXZFKQV]51?RXg=N#ŗWe'mb0\C,+(;K[_MD_PPE xu|otX#o^k}.;Z3/GW jOO5%߅u+o|2 ez%dž|+ ^%nLRK<5jƛ*[R障w2ҔaR(pjQqiIgV>7 _J5QQZ NHtNmBqSڌiŏ z|߱֙O?dž gş~+k /%|tC~ҼGx~)IֺUƛym/v{wm5~_Ze*7/^O)k⯆Z׉tOi1u/Ni{ah,#<)aܩUSV>.Fuǖ8•5EBQtEX^iP['Y^YE*0Q9洧kկF O/5B3MRg6|oς$hf/ 'f/>)nxwY IsCkߴO؟gX~|UG \H|{7友.!^3>$xC~Q@?,zNg ]Ɠux x> ״ƞ*75Ax)/56ih>?k-& gZj6VhVogARLTCޝE%KG Ojiڄn9qf%Ⴍkfw|3&¥ tYF_mʥ<=&'އu]A4)K[z<7r@o SktdXw.DCdc>,xc2x¾ _u-UmuM") Kee`dg]rL^e~ 4xJ40غU8iЯ a:RZQUM£PO~/<9Xsy5뻿|Kd>w*]I6~ΛfJ>%$A4;[FǏxz<_u|Lig?^%m/t!ޛo|FOY_E/ ]~!Դ諣~G<8,[sN-ᬎ9^YW/ȳ<>UfLl\®[6i #ym,S3l69ITbFyiK?s_|aa_3'oor:Ɲs{¾%/Kz'W/|s\xK։sj:/[WoFptj'!xoJK}{<{Mx4ҬVծ,tq>aS>++/g41~aܿh;VX#3l/QW/᪹f3cx%ᦍᯅ|M)eoƫ jzįz? xSg!xNn+m7㎋[+?]fV5<_[K4Q@f4zwjjܾk~[[d&:<:eXN ώsys[⌟ ï% ǮG|6e^OydYMxcaRɪS,+?%i_*>$ӵ?x¾ տ]>W~y=7M,>xO7"˻=Aҵ[JL};?|geho~F{_xrxĶzݶh5h2XđLlM*/;3^`Z 8oq42iWeSa+&ٍj.X2cf&WF4_1'<{AxZ6wigi}iz6iFpz/_>$x?| |G<13>?ҵMh־0x_:7#Xc5׶z^wY[3,W ajd'KE<,3.1y2,iI¬RV6?{:y=OVS4^~߁?Gnui&vĿ">*J]6=/ ~_ 'r.eoX 4o Wϻ_^!'HK}'OӣΓ_jIqn/1:7 eyk6zsͳnܳ8FGa8 AU8|i:(ymHrFen2H~Ⱦ)@; Ѽ'G/ `j8v/ e\UytaO-PƇc.<=9<) F|y +[O |?s8i+PJޝkV<6-ս#S^\𧋴>MaQ'ď>,nu|Iƕs;x 8|55߃.4Vk 賿<+멙gqk̯᷉yr˸O:.qc'V9e,BeON_/?|_Ꮛ*4KM+Xoi~exg>. %ҠZ_ꚥVE]Wş|Qz'|5  ~Et.5 .I{_|FWLz+G1ZI}xjVj5~M=5eô2X(8V{X/Udx 5p&OB\8"p~/tώ~Ŀ|X|)AxE;d'Dz4#@4;MGY??V^i"Rn.82od|Uu]뗶oxw;b@k8s+RGYΝq zh\g9b{'˲N3vIʶMx0-PORtÈ،D VZ!άOY~+^}okAsZG>2^zOmawE&~]ߏr'⿃?>3^>u^ ռ ߈?!h$4Oѭb0 qce K53!^k0&]Vͳ|^sxVq<-y^g,0bkfrjM'5xHо*C|WOW!^+3O<^.|P ]ß</ڤm 8X| O|N_LeO^7մҞ<tU|E)qO՗^æqhp?8c;?hWx!vSqvwٞ{qGhpPC9xbq،x9]<'/u_|-sWHxBoa' ^O>o6={σڎ<;2Yx^;MUu]/~Cl[{-??kگx¯co4O|N_[x;!--K>eaτ\geMl Ꮘ cqnq9dxFs]ᰘyK%Ρ_+HM-SxͭWwݧLeԭR |NQSf<jj)ždjn~xڧÿj,YOwIּ-㟍tӥ[ZW^8fGK?|kRWAD>`t!^“YM|".GᆏK >PЭ |2[G¾:>-@]; \xiK)2N;-β|9c] e]_;N),¶< pU #:Ȫb+TWPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(|_~9tkuNtK?~"x"k]>uW^*2cM4rO:[E,FwKeixG_G#.6RkOa[q-TܩtI$ %CCFl$.\xSĞ(-妁:@:ׇ4 %y웆kѴm+úNhv^Y[fg%ׅHEQYY٘ uPYZj׷!ieȦ=WD.Ȇ53j~ Հ4([ ϊu_kzSbYu-N8'Ntj\tՂQN9iU8=egW0)5'Њҧ\v8h֌:I@٫B|(>!x \gƿ^_C㏈^ %qxoRѼsa{iȑP`꿲' ojv_.|+oh~1౞?f?YiF<ԴH"/t[1sTFؕQX<k'Z4$(sF2xXa\۶gt*{ZS)G<8=<|jSG j9kJYdC%J4g/ C j5-+*i2xc2B6?xM>!&fOI$V,,'{ྵK2"-6QPC'ýKWŶ m,?>#ֿlKO#zv+ RSgfM}B~$q}$23_=̓C@_2cƗ^^KڕSK\՟~͟ <5|=|eh~/6MS-B&.5Oxğ}TI=</oL6xƘ9br 4s~'YopFSByB͕aȲN'/˱dt1n[_2ʱur~ WŞ t=s7-Coi#J?/>3t}2Ou=~Mlnm[h_< _>:gXυagx~&]mi`t|Tϊ|Cv>tbÞ T7@870s>2<3Vzx<$[Ї3x*G rFay~&Q‡ֺ>e[hl:=(0p[-6ہ孤v]#+<C__{࿇pޙixg>.ѵ}>\^j_u|kj]Ww6ޝ+]gKJ{[Ca;ym)Ԯ<5X^x6SdΙ5;Rs=ϟ~_| E+Ş.;_>Lv?á~,ltd|!k,o+ 'úO_N+8G cjrlYwTezX >KSἛ е+t ݟ_Rgt?5A߇,5f J[[;%{ٵ+Y` /n8g YqNUZYo1Ur|"<.ynOpCeYRc* >*6sCڪk|-~{o7R~'? C9㵴h^7җ^i}H;M/ua ?`{is!q=j+MG:^MRt˛-J=_&T,R+G|N>&*y, 37.W2<7 Cꔫ'hN'JRyo\xé|hM:ƕsz6ĝ AEt4K[a?WZޡ :%|L|?+nn m7O|_|5}vvl7V~`3qw<ⱼ=2; \#a؊^A^p\-mF/>aP>Z u?|-|:FNG|) F_>iWO5O|! iv}Q^3U)xR.{[Hw#x:Y>_G^9^LGhٺwڴE!xϛg8/3!2|+fy.Nab̿ig8x+*_gZUі'*bfx Im l4oXyFS򙟋meKfR,Nid<83J<)O3lejf+8p3'3|8qF/|1mk|N1m{N8_,7VDF 3LV,Zֵ}B>~ȟ|H~,xFnjO^!gMKO}?/>Uko ţ[K>UqaO 9#ʸs>||A)pl[K(ͳ3N2i8̣58v+[b)ǀe |T._M]Ʒɣv_7rqCºIok >ݥ|>w[+'&h^'gt?4wiZFC⧊mB6o\y{ix_ֲZڴ&3јY׳f p~up)bnxlc2ǃ\g9lgY~SKkJ.|BKQӾ3|OuYC{:|/guom=I|q^w93\.ܛ%0t~y.L ̶8Mz،vcc3L3*V ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=??xL_ig/ x[Ἒzk){cQ}Dֵ6qJk֗LxGҼE`Ϳ]:~|S/<3jqZVڷ_Oo~$^úN`ӣеKn'蟀%9ń2\Mk氱K 6KK9n<@_PPEῴ;߃><-cGZkk$|i5{oxAOxAK`bxǟ[_`4h>:мOZw4 *燦)xK rn[$g9)-o|A5OxCL>u >&j 4 .V_i)g>𖏦|pkTԬ-|)꺿6_x#ZNMF)MM%oEӧRJ'VI(SN29;F0Sފ)6މ/ G>xv'ux{ux7~>߂7zglA/Z&/|ED^O_/-ӾS:gZΛteo W Koq|̗z}Z *xAO|mSӴ˟k:&h?bbZK6݆-tI%Vۥ~!#B7kO T|]>/ Ӧ|[Vnε{qm\xE;>:|S}:Uϋ|M4VxX^BUm|8ۭZLfN/4/k<᫭Cդd}z|(/>Mh:\smW B\ZO|_h^!OemKؗVO/WOоco hڅψ2wlˬ6'cVhGSmq7 lp86愔kuOh Q*F9xߕ뤓?9jٷZ17"*t_?O|A]2֕O⧊54Mto{H,55 Z)WQuw==kS5Gc |i٧O|G/_ ,|c[=J^mx{l-> ^* z+8xJO4vO U,G4Vq䔜>ip^NQS<{Z|mp>Rf_jyF*~1!4Js_*K O'?iX>K?kO.< ,+:ֽ BxR?+x^UWMKQXZ]"OBPaZ3Ux7RT*Jr N/L ei#y=lڴWUC WqҞV3 <xk+߆_}'ǿu5:on[cǚ/ x5C< |[>6վ+^i;ٟ>R|5ߵg4oawW?|'l|?ajE/4ž8TUũJ˰b_P7(B|'hG92>uQx\+ΰ>66p" ^Ŀ̺⿎>uWZwgkk8~?|BW㷂~=!ռ/s|/| xZmR{sn~/iڟ"uۿOM2m^ÿ/|@>6uSqkqj 6P>IƩ}4jz6]E%[n ZT\DhO VFRB"|rJ41Xyϖ^ΒN~K? 1,x|FQ2B5qUxr+J𥇝LG,βMwO 𘸼. FxZ?Nx3Z_kNmex;5-Fm9-5oxY:J,-RP.SN[[mm5q=Z|4nΉ4+3cI(_i)~^:AqH%fNU':4{]]nlUQU1gVj J SQRNRin⿷o1dsg,IPsh((((((((((((((((((((((((((:Duv g"֥n_k@Ep5Oiuvx:xZ3j@3|i^)4<7ht}"Gw1X,iBx: %*Nux:k*<#Rꊫ̬{K3TrFYOLUxԯ[`Ԏ[1N/9z:x߫P~E`y 3 꺂ۋ_^+ n Z8u[[݈.>x x^+O -/}_Lujڵd5gQյBEY/;ۻyV>B :U?Q%yj8S۫?i9MCec~[nX  ^Xh*c^u1_aah#>2.6(h<#?S<+.t{Mr[u- _h"ГUŵY~}L-~%MYsLonu;[7\ߠ{Kk_7ϿsHľ%C-k[ZfԀ{Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Xו\ZԿKhCGK?z?bX]&|4t hNi|-^uM,Z[XeRy;7 E~}w=~x6-siM/mK:M|'K[ {F,W_ׂ5CΡ?$? |ORG߅A.<<:zjDڌVzYftbx =+5ͬ^=i%$s%ޛ}E.T͢k"x,|B𿀼Fi񦥣yJuh×ŗ<.ebb0c#(9nBO=Z ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=7 >7+g_ *NH{x].%tvkk %-RE1s|_𮙡x;X|Qw >֚% ō%6w:ue\sjz桥iZbw=Skڇ,->M=姄-qY'<])yݼS}t53žQ$Gt gMX ^R<2R'py (RA20F/5{죻doeԮ+ӡT֮{ߏ|+OxF_.Fet-n};U/# W[HJ:8V_߃^ //$Q_~2|wP{+Or_hv q^עht}2'tm?4񎵧:m~U+<-ofO^7+x㶚թNZNu%m$޶MdΌ&xV NPLV"iuFeRQFRNn1QMCX<ii 7? |?xS7uψ:vgv>"|?x>w}+V=kC3F._~" ?.?~.^7Ún#Eԧԧ٥VA,%J*uW_#BRJ.EJU)nT^g{C=hO 𯋩{Lc)R̡aӫ*tCWBU[ %-+SQ||W~:~4&<R_~1Ӿ#x>¾4U'~!e(9O?5fPдi4*x&Y.|Ab'u/:AqÿzGĽ'[t]?Yӭt?w [Ou|?V blu F94SHJim'1Iwcc;=wU:ʤ D\MԌc&"kT't 9f0YfkW'G3x4U5˲miUQa8O'ǚ_xcjZGtCWt <]i=|ho!yYUYul4r=J4?Pᇥ[RӫRa:YBI N4$lt)4;Zӗ7׼oenou_?P󴦚Mw+ƞe7h_^~'6O#OIݶhZA:`/GK_]ݮnH Ag̃(;0l&1aܷ.rL $mfaGGVAU8Fnxg'φ>%"Gº|?i4F6m;V_ Jښ t\-G_!R6ѿ>!x;M}+]gKŚ.{dF&B/"yJ ;WpWhܓ-qB1l`1* 672&|Ӏ1e| G#?o_7U>Y槯[[MqoI|5xWx~ǣxsjFH@ϑh_.x?o_-/[վD];Cէ4}fεgjcϑ"L#1:;{)db8,ZyU:~ox/AuHt; A}zK&&àFXbNxy ZMy}X5W'~ϊ|Y'^;kO\YAgnP4׵mOT=.on~n\!/N6eK-ZxZ96>RB=JƭE jTw?|y{c'º7Mz "K&ZZ}6=WPԭ>gf>ᱹ(plw6E[✷h0*![.gak,jO/Uq񊄂O~]+^'snj5F>(|mxkX5MBuKHtSsg5SĿ 4]*xYIi&xN׮|;ec&szbqq og'dpSUVS湖 cg6 t0EPm`iTxMhUVmxS_Ix wgw=Ĉ)~"3\\x4Z)wokhi$EH 6ףj#5wſhzƋk }O>h-ޓjյ[?RK ẅ^HH56q+r'Uɨg<6G[s:Ye\ (jxPiU5 3>W~(kvƚ7ÿ I .(Ӽ5wz˪hV@Phƞ|Nj%e 08AK88O?b2Tѭ¦J(FR .X8-?Q?_!ZOƗo n| (m Ƣ@u -iX6A>;ف|6S+kߊ[~|@[Ú/5}P$RxS`0̼;&Vr<5K+Us.4 IR+gU1XPʩga:y]Ls ¤% #(Q$xqoN|5ZxÚ^-ˏ ?4ˍW4! j:uƏqjWp6u C`xs2QRy] &PUUn6( W`؀O+>wo?g^PT5=+K֭ j&jvvLۣmu?R,g_Z۴sqjQmI4MwM5i29Ӝ*Sԧ(g ũFpZe$$M&hK/]F5o x;ŏhcM"-7IOtֵuX k>eo{k?ۆf/>:|3|.t_ W3WL zD?j0֛>Ӵ{?v> KMQ{){wZ&o[B>)NuUyx=iJ:mҤpTuvG9+fQb1̫q>Y15cc5*OujT՟;J, wExC>|hZ4_i?h|M->'!uᾃ gX0f NՓU<1oOTЩJ1O:SBqN*0e 1Su0O1nJ߳(gWpn+6ʸ [?aquzy:T2ՔC҅yc8rTiӎ:v% t>&|«5n~xSm=:{=u['Ŀ OPK'*k66+su%x{\l<%^iwxP𮙦$פԵylt;jS6ֺqs^]\׉[ܝJPԣQΗeRNEuu)Bv^Rp0ԝybnޟw:uj}{+嶹74owSSF\=ZX=Z+Щ kQUVեR3Rp$Iq_|Ku?QF|I㯈^;~$㿇> 櫯\ǫxN6`kM9/.!TTs\ R^:mq$Ǽ>3ԡdb10wyC|JiK/ >?{x7TѮc~2? n|5kͥxFmWh_?%^῍2ӾO~85i@x|7|5Xx WAe>9q,l0p?ڹo YIb yF3$q+3yhPE⯆G~2h*)jsǿ]CSnd<y5)&K+)hs?2k¿>/q<ϊ1]⫟{yN~4a'X[Nҵ=?\yu땴_]z&?>#X}(k=oI| :Կd(XBOoiQ/)iokZC]7-/J.t+O[O~ > }o;?k~Z__z{o[~ Dÿ~x_ƍa.-{JזRj RA|. 9Oe8wO1ͳ7'K,LzkW?<x+4' XnXl=L|egmu^Ƒh'~xFIΉaxz _Q^ZM6@"JKqi[5ԥK<OMd!}ď[Ɵ>|)Ϯ_Oxb>+9Vs^4mR>'4OA˯ OV[ZokmϦj20O- ׇ![vXj&ѵ ᦛ*x+Wt ι/H]F|-}[X3 83Iq癵lm41*^;09}\%S7qul?FkRXtf/Z_~+?xúip@4ZGž'Ѭ5/Ŵլ𽗉h^ߣM˭N^qC:o |U}K_?o,En&vib0Xto x_ïxz'^Ѵ};LMѴ}V7^&Ii%k Mwpd߯ɱx^?<^;*]zEEN:ե:S4,#F) (` ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=I xCM1-mVqo|Y.B Iơ'o|I4? j :F֚uޡ\QMJNgbiڽ\Ag鷅 ,@]Dog.^=BxtxVKg5K ]k{.}SIQ۝_OIn,m'Դ{Aowak$ xr#,4+ (-xVVr㙕`lF5)dXVIn=;ǩj(x|lZ_Z_E.GKG>}RHW rđI5/ hz>$hq$gĭ//[ +H_ N6mGMVeA=Zݜw6h*k ( ( ( ( (v67WZ^Yͭݭm ŵͼo<.M :9Ӝ*Sԧ(ΝHIpg EFQN2M4i u=??kQW4t[VMjv>t[FVKۨrZRXӫs3lnmYeUVs1faZ4J5a[U*t*TNO1H + ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +Z}x=_<9Gŷ:F'!yc:uo86?ïGZeLH]BX~"ּk?xS_=u{ ~u)5[msxV}BK o&KKGg` 7|4¿h"Zj5ftndt=-<kAt[l0O5{?w?x_ƿ{h:^u]S+i/$q034eMqq8Bk+u5PY0ɝwQ'Ey~m澾oٿ&|'g5C֯y?4M3m躿-|1S!Ct?sjisʥ@~~GU_?/R񦉭Myig|A,Gs<+=O ,3\O˯_ZPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz()j^<xG_4 Xux{\ݴMtdXΥ;D:T|ƿIe VExWq7E=}n}Jöqt}2|gyxo (,OGt]9/s]I-"YWZ.}:饞k_e6 UXSB WXRk(.eXVGE^V#3 (ۡo>*YYgoo~|>,m3Jρ?h٣Qѵ뷞,׬O>iaԬ9;7+|g>)\x><;CּWU'_M_~!k~x7.u%kķ]PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPERa^V":@r3kR?/<[ÿxW/)kDe/ҵ~n4[SGInmR-icQQ]wym_ /|;EElf{D 3MӭlX,^U]}~< }~t+KѬaF4k(kӬUm.k۝KYeF+ (coǟҼM>k:Vvg7ew _ ? +xAфSF"4m;zkjcQJo6z|)}ڔ_uW((((((((((((((((((((((((((((((:Duv g"֥n_k@EyV4 j$:tд?k3kǓ<7I.Gakhiڦw} rJO㟋.do-BRouZN_ĭcöN熴P[jjKkn Oӧ2Cwwdwqi_WX<5[ŚkO:/m 7(\Y]Z b[ irk&`aEn=FW|"Pk:ۯx%oa5|k s^>\1?[%ϟ xĚg_ 'xoךֽ^i~('$Տ"Zń.u[*yo4++_C-C@WQ-Ə^}VO:>C "o0{bn%h3+&RεWxN:O xg6VF5$n̷Z~$|%^fͬ>?1guoՕ㏂z9 mu=OtɂdbxOOW *O>O<=O]Ns]Mм;wZxĚ- 3NEA]z^.ya0հ𗰕 G0knR '^**tdEGyT?WB˪eyfa5yQ*N|2%xlO ΖgURG7qXE:|3)iOzm׿g]FۮW/ \|Z¯Z2R__|`3ii:&-_Id~[4i7^T X_ګQ:  ?g=Qu[:>"_|_Vw{x0MocΖ>UD˕JN5nI`Qy8'j U׻{x򺊛Z*XyeTpW̪:y{fLRBIh/fsIMʔ0~%~5 xuwߋn% 5~<Ǎ|8:/>'<=5|9 Ǭq>?K|)⟅sM djTI`TXG>?pIW;e3z1W #NXwl?F0N*51E(jwxSMZG_.-3í⫏z/;TPT[4}YZvh'fWZO @Ӽ1o>;wýmW|W{Л_ 5yh-xHMNƽOY_Ycɍ^ s%}bN' ԕOcYGzzêXg4վï8\5W#RY*$׆)q񧚩:A@S7Z?>?]l QD_\^&Т4|'s-׈;W4:߈o |P_@rP=cI ZΝR:Y~\cf:IO )ѪNo5CXT֜oR:CJb!W`8brjxpd(b&㡁>ygJ\-JTw(|t|aO_-'~#Ҽ | ᔞ" t:iXKmZ1X)eJgSo/%F B9wK{ē^I}$1<ƽUuOYS^%V=HRMn2msI(̰V]K213昊`9^a -7P7-+ qӯxLTU(}5Oľѵg#}jiu}xFľմf^*񿃧(wx]ʺâs&KÿFto >ӚSk>EojZ5ۭ;CM5.5}sX,"Rd |m>/_ğ?|?? υ> xG@1jo)🉵x;yVѵ #Sng.fIҴ-KΉwD[CӬ.I;[XDu[KǶ4Eg;oNмE-uQucxmekenGK9h /o\Eƽ ~--Y<7r]h>-ŝAChv]4q.L5GJeqᒼ/˯^x|gn㼚,1cOl~ G{KNi}mXXxVy"N3vL9AF*<W57*mWkCҥŕ<.QaO0*a η&[6kÍ?gWپj!htɯ4 Yjz.|@5mD| ׭j> h KŚ.|GcմJaң$|"_ jr=ޱחwSKŤeR)'r6I9JnXSS)%:P|;ʕ<8=?cN8lp:RΣ*ΜgViΥ9W,N%mO3"!~9G{LNiK 4:'-oC?vLχu ,d ooWg~\^JXoSMSĵ"ӟ6^,%V7^UcO3RV*ӭ#7iJ/5寉U[G/ǻf?kqmŏicëZS4GEaOm"A_[:;CNm࿇^-|1Wp7w24KM%OJ,O2C,I|AVituئ3$^~Z k|>"=ŷOX|6;׾=V:xaG֏l`V)u /Mxš?->Asbڂ\G"(0oGvr-$,.=}A@VL1]eIc󼍾gy|'mjg_k5>+S>2֗xCė~ԭ}7/ xźi1Ku,~$֕l~oKjsCʗJQJsTRIF2MŧM&z;ٝXp%|E(סGFj2*F:u#)ӕ9 qN.j2Mg?<+~Zg>"_Zh?5|A|4𗎼 qJkK-'OZiWm- xu޲u։9~*mk[e$>7'k^%⇁{ſ > |kG+]?gƿafY+Oߝ'΅iC~_?bګŞa]W|7s!OCt߇>,G~{w%7Y}GQ𶟭-"Ѥ 8 J)R? ӥ)ѧ[gOS꿮B9')9C<+*9~qb18SQØ|Viy_5'Qt1N~?6,x+mOO]G_kMGWPHk :֒}h|%vXxoMW? |-+^ӼGxƿOj$-ľ֥:VoS8m/X5iXZ ;Z5JU1Sszte.|=5?uQjG9YS̖+ /=a ΂  *Ge~ *; \xz׍t}/.o0ޓ6~*ռ+mO:]ђ-b}MF:߆ SD[]~UԴK [_iWڱ4-..t{k8LKYu1xLuchcp,/pu(CbVᧇB+фJiFU7 BRg>sľcω׮}/ŐjW֧CO35 hw$s:n+H$ZlA|o⏍??</ $}֭3ᥟ xW?Ӡzm=>eZ .PvϡƢR|CouM\7̲lMn88ye\"Vm1s n{٤2崱O(Ͱh%S>&i/uϋ<mM~ſˠuGu ^ ~$|[/_&m_ ώluq/Z%Ν_io 9_Y;ռsGWr-|EYb8ͰKE^6k_cO[S7߆5htX|)g9%MLZ]|L;ihZXߎ:/nįuZH|m/LF\9)yo8;2|',.w=4Uٕz?\Qe5ፆeK&N<R|Ph NGi /Vtgo_i7P'q=?t.Jlu+m2u Ak-|~Ğ4j hZdڵݥ#ZNmXif[[YZ hkQ3QDŽt gTKJ׭5kxgZ|3cQH^zޕgOl>GO8̱\5r̟ Y.Z̸,Ȳ''& JZXxW =[Oh>x~9xG~!Ѻe֝_x[WV4_īm+_t6vn_|6躯񗍿b/|DѼ7?xCGm^>~"Yx_#֧-?N:N}%ź\<+j?-ٮokaRe6͸ril' qSyVC򊹦33|(#Eba ]3 4o o~e]jOnuƝo|Im4z=? u~PӯFF'"㏇_<'[F$|4|>insXS΃jL/$Ʊ{{kcp' qVW5bR~$Ȳ|>˲*mW&1ؼ.qqW ц//ˡ<Cc%x Yo<[~ڟ4o<-ψBO*zw|X.78-4aοgjQ LV4++ȗJíi|jZZJv__|IG&M3\|%Qи|,&|]q_17? ƥi%CeZA7ppwƯ bølic MZ'+ib0[ÙV]2Lcp= rp1bb5#xI>9gƿicUMXo>DӴ@5gPXizUQK9a=ޗ_|2iե&E㯈kg,B=n-Nd:|GMѫɱ|wx(rE~d\4v7q=yn.x @Ubd:V9UxfY~#~>^_~O j ksB~Ko\xރUpkU{~?j; OO3/^i 10g3_^">xO_vy<)XF]%o~(QpA~&]ㅋ>f\Y %O&n3 7<}~ ܎'4yT+b2}z8|S_Ə [|!| <|,<5 Wznj>!|A5+,z6Ky|:eSşt/Y)]i_#¯%VG'R4nK\&kkᛋmJ=/s.Ǝ;R7 Ss\oΟ aYfeR_ Ⲍ&cR#0Ϋdt.~?0GӼ?xTߍ>9ӦO؛Zntx!O$zƧ X5yt&wz}ڬ}?r-׼'%ߊ40Ğ]2 KDӾ,x9eEiZ%ޥAOo'Nfm"ՠAq uxfSYU/Qƿ4;7&o+ekPpyN*>83:o4—_毮xK}/OF>0|(gG㟈>6iIXhR^cx4>ҬtF-m4@|Phwo7zG~j94':G:}MԬMk@uHlb/547:pX+XL?*#q8˅x8YS0ٞYQv!̳,F?9 fn|dx6<K>|uW^*2cM4rO:[E,Fs|Em9.|=Mݟ|}(iX_x"^5(.AqqfBcÝf@B"&ZCmKփ賛xdHӧ<Ť=i^ҴCtIMӬX-lG D*"ݘ嘳H}A@V|VHDwvj)w$ r!oh ڥ6.5` (3W޽}T}+BFwMݽu8lkKeo^3_|L.k>Wzonb5^<4}7K<%5XV]KEyg. ӝ9C/"*5`jxSNpU}N2Ogx{~}x%j xMa`1"㿴Ʈ175'jrNP'jP }B^'Dz>9-/W5=?W1x>/h:}wԴo^`xz}2$T:C[??Z˟x~2ekx,gſ'wm/5-Kk)kx%bVV?a ь1XW(ź-6 ֔mg#N/a)&\=׻Nb2-?+kzg->*?|Iqia[A6 I#Z\.kzBI&}ꃘ^_E%׮9ik}ZԬmxj|Q8k+RСRI$Rӆ[Tτ> RUm[K->ď|c~񞝥O eiz~kao>^wW6r>SX<=W,;8akYnW18 `9y2\r<~ v'T:oه_|߉>_I LGwOk3`P)W,exWᏎ7.#t!9L< Q´eX|^_e5i-m -:\e vyki-`|gb|}/:~Zi^Om_OW7ךƗ+vZzͦxYhdүn&,^[O󼫈,VcsiK-bpb!FuӭG%:><_G>|7࿊>.x8|K־ݯxw);o~/뺕浪Ɩ5_Ǯkp.e~|?QVõt E{.;]'C[1GVwɧXiz{g׶v׶7VPE2}.{gqnijz\Wr˫&]jS~r/]8fR'%GC-Uu,">2|[x}%5+ xo?>(j! ŧY.xq5MNGԳ\os߳/=_xB`o*gi3mS~04K/@4Z 3CIW;4e$~'|Oڦn~ş|eEM=T~ՠ֗|4*]L7Wញ xg|g7u>CG† h7g<]g[e/áx6);-0Gq8L,ˉ9/1Y+VE*ON:Ä18XG _ ~>xcK{]ƚ喽>%x'ExC|7F[|Ciz0[ɤ=\~#7>)n=oLjg~3jn)%V{VF3Җo5R;^91Uus\xF#e<99lVWG'K>-ˣWB, I\z+j;ٻ t®|k>}_!4wh-/-t :t-cCbgԼ]ý n|7/ YRlmJX/FxKۭN}BioVeo0yC9U|֖[~gqrܟ$ȲO(˞[p\9fCa0TʆGZ_ d߆!ws^ä%ԵO#B{8m?Oh,,,g-Ej|Qtˍ FG?!/iׇ>Qφí,X0Ƌf-hcsЯcÿ<x |7<6Vpφ/t3}$H~~k-UԴů|3D؝G_:~7K >xcD:mv\Ycn~$`2Φ3Z2UƦQ[j;#ˇ)_A{ /9Fh |5|V׾}gC:mt~oCៈ|S xOM#HG~F"|gxO඗ kQ{|$|gqKO2--q:yD#ęn*(`Gpy|q鼧p>bcJ9g2=R WL??k">^|ll_Q~ӿKF{kk vėi]xJ ź5Z,/f?š_]6T~+s|_fCgat^ +ŷ^(mn{!/xL/xW.<>埇<]{;=(Y\j>,/[YpVxEqx>5ԗVWt}g%6 d@ԡ3x3:8#OtF2uv ҺW^Vw<+h/w |y[⏆׸H>(+Þ4Ӽ!k]:N񶂞!>.SϦxFN4/.J|>6?eσڷi |5uxiUMy2x-q= wxWƓ[]cö5Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<zgZNO0׳Dn|S93a?5I kg!Es#FR[c^0S`0K_ nݖ(-WW6 ![Sq_|.t^|cOY.(cnl;ڬiwg M,@$G#s ʹ\[EO,3* "c,E"2r#2:0e$hZ (i!Ѿ|iA+Tx_Uw/}2MK?焴}3tkZakMWU_i62/y rj1NRm$mI-[}.:g T:*IB:q91"&QIH k^;"N` #ï VҼMjV KO-gB}F+ OGKx+Am<76/4/x~ ˹|9ZdW7,Ζvy\33J2de(5(;44iꞌ*SFJUiΕZS:FPN$:u!$ IQRM&~>'ƾg%%<OJGwk^w7<=yg][ٚRț춲OӬ B{⵳{kxQy"$i$eE$WPj6˕n-)(;ZM6QIi,.*4XR8JQSJ:ǖRQEMmFVH|x _G>k#×;Ox!7zPЮO%uMGOF-_}Eh |Kk=u#_mEԬ[[mg@ԮmwHiSu{++VNԭ.o" bKEVZ7JNppnԢfMVM6:1Vi ~[  f jptq1R 5TZM3^$6i^ -߃<_#|aosO^7Ym?[]]Z6j7EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-7Ak#W/?/sZz(?< F6ΉeώCѴ_ j{\%ƛn xS+HmSƑxŵ?G*K߇.cqxR\i>-}OZ\hgZX.;MZ/MіR%oSOfR]:l, xvKVK /мB~:ڗ/.|^{}o}ѵ xN{]_ںk}^/!+π?6&ص|e٭!Y7l#x KcZ|'⿏? |MJķӮ4- ^&}>5x_^ңVҧE+4aI-γ 53<6C/mWO+UWQ2SJSê2\"AL|OD gG KƝo->$VW=#St-=oQ)|s:.7ßX5~:|Y4<[ ˩k^f/i'Ԭ.|g Vḏ=톉g?4xn@ZEѬq$E@OP(((((((((((((((((((((((((((( Zo?DGWh_-j_P _}&^H-/7h^ chi:u36 ;4 s?~'c6hCymVӭ=wyliH{uqYS^ ^ OA~5{SMZt*IRKUr`u5mgJkvʳZ]F[A"$l:2`@ү( ϊV/ N.5y:2 ]Rֵ#;+?+k'V*Mn4 -=E㧀_L|Kro +4mM/ojV?mT5]OEEgw-vwojn46w/iI2!dyq子fU^u)՝:- aYާ=:tW=%ځ&&QYmuG]wkfq= VQ^C3s|cC:sjRα\- WԈs?hO.|McS TSC[?Z덩x{W>z&i=X\,7c"^?f<$&ϲ.'ʪ`>7ȳ<=|*hb2A:'viki:.}jwȶvm-GK42 rJ Ǝ)MXӼC:r/4sM4 ;SCs7Q1OƒQ}K/d{~h[^.Noh߲ܹ9˙J`x OCVmzw}4rMf{|`m_^hZv-܉ B.*XZ1N. ώ *nlN+B5IխB2r 5xw\w;𷇼IKSE:cWu#oklvKa7%$ 'ÿ>+> O # ͡HQzKv[X5 Ξ WV{e̢\M &X^&ⲜNa^l.x^Xƍj8zUajsG.NH((((((((((((((((((((((:Duv g"֥n_k@Exj:YKs5xs᧏{xSBvkKn ψNjib/R-,cm0g/[|#| ^&ѵo-#O|'ox\j^mM=.__k0yb?/ R/G-KqxJMOrkm-6^aow+jzޔ4m_s= |R/]EZ6i"V[Qᑖ6upcA| (dλf6__7ړy>wyښ~ɡkW?_ >/<{N>'>GUw #4_W'|s/F|G.m52c+IhTi!b)K5YsN (ҔS +`#Q3ff,C9F# WWޭzcK^N+O?_ 3X|#!y|jZ]΋~}NGoᙣVW,F-X|>egY~uO%n"?eqL.êqv#-=~cg2ྐྵ_Sྙ~Ȟ*|kOCO_W >E?:_Gº毠X/*h}VM'TZ[?ٿ/!t_=o  %S3>|i< 2f7ǚ~#X=" x?IokxWֵ[lˎG ,׍(xÔ~6=nχ\<G8ڞ#3pax_rleW< ς ~Ͼ~?meo&Eu: :|,6{NNO&w>|,Ҽ+/;H׼Aj~+oxLдSuc6-?O6 Sxe9>7Y_ 42d2~#84˳ &"|=<_qjbrխITsAGοw/>?CS⏊}Iׅn/  P~ x= 4n_KF>ZG{'!5z}.a5K,oI'⿄_%YJזO g)K>sSrfxK+l#Y̖<63~c'o0*o&kK+xZ g2x4HѴ Qmfc[?/iƟ߱?u^b_c+)aM/=]SJ>8🉮!u&k=ԺmqVKx KĞ|hſ[p<49F&C+&4*ɳ1Ǫ,K>Mǂ4[w~ 1⿇?'+.m*|{:Ӽ0!]Oo<4 -cV Z_ُIq3Ghχno <+?Go2ǃ592NZ]ֵ/ Eq?qWe4x Bk3r&cV武MRiCF}૽[[>e{xqlox_I?8oA> u༣(xcN__ٖBúMܺih:U5Կ]/ᗁ $ф/&Rv]:I+.auqθ2ڄsQ^&<8jsfs< <ڷ qG qOrM%G8O4 W &8 u)b)jF$@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@KMuyZEKր<|u[Gum/xYc$rO=G.;5ږr"b9,+źzqVv=jJ|Cfog,.m=ȸIa.㞗mf>5x7-[xJ]τBͫx]'Mhm5CR;;grzVuKK?S;H/F'9m.ḶHf9jQUU* VgFwVөR:VPVJF*(N4iFMpHEfEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPI4=ƚN;i/5<IFYkC -kes[xyijkxÚnj<3Oi[4xN#?m^ {}Ym.fݶ] T!XI/Mhgϋ/T$پ>_ |#=VKY5M+L?چĖMJS8&(ݑH( |_'OhVkSԒh^MKۉs["M/℻ʦ>f<=xM ׈=kOgZ>{09Nִh|][Z ˪#ggaPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE~x|յ7rHD|U蛎UX?/o?ףP/?/sZz(!x>R=k ;Su'bZЬO{Q5]#NA.9/|M񕿁.!so_JNk$t_>O;|Uúc @?]bʚo4+:>cz:pC,҈.c8  0C1[0A i0( *q"(U*Z((((((((((((((((((((((((((((((_v:=ծFR浣FdL %'K?OԿe^@\ZԿKh ϊ>-4O >~I _׈|x9Хx?DDլ&[,dB%?YxIm?VMoXo@Dм7Ohho; YllL;~.ח]xź׆V|1]VPR:dS<`ӄƚ-nɪMYKicWƝkvT.";}6YW p_( hog.q5\h>(xþӼOۭ7F{( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?;C!s_P?RMz5{}r3kR?/<▥Auz@ѵgZLJ~an.m-GoIE\S1CNKg>%Z|8~%Xk^ =~ uw)w/':3šך_Wvq\M:oF[Bjl~k <+~[Lj<1MgjVl76:T^9nt6'/mjX"'j>&o2'{-j [i_`>jR_ ,:K]<u-KJD0D1F ,@:Z=ΡY\o.=ǻ˼y]#fX@<7',?*C.W/<)kDeq+\VLյ94>H1.-57w[i[>(> j^Ҵ}3MO4gxY4#Tqskrj[ō=OOſ_{^7Ho? xI&Sw `_. The following example sets a **RedfishClient** with a timeout of 30 seconds and five retries. >>> REST_OBJ = redfish.RedfishClient(base_url=iLO_host, username=login_account, password=login_password, timeout=30, retries=5) Proxy Support ------------- The python-ilorest-library **version 2.5.0 and greater** supports both HTTP and SOCKS proxies. If you are using a socks proxy, you must `install the [socks] add-on `_. >>> REST_OBJ = redfish.RedfishClient(base_url="https://10.0.0.100", username="username", password="password", proxy='http://proxy.proxy.com:8080') SOCKS proxies must start with `socks` >>> REST_OBJ = redfish.RedfishClient(base_url="https://10.0.0.100", username="username", password="password", proxy='socks5://proxy.proxy.com:8080') HTTPS verification ------------------ By default the python-ilorest-library creates an unverified context for HTTPS connections. To verify the HTTPS certificate, pass an optional argument to urllib3 through a Client object, **ca_certs**. >>> REST_OBJ = redfish.RedfishClient(base_url="https://hostname", username="username", password="password", ca_certs='C:\\CA.crt') For a full description of possible arguments in ca_certs, see `urllib3's documentation on the subject `_. A deeper dive into the Response Class ===================================== The **Response** class was already mentioned briefly in the `Quick Start `_ section, but this section provides more details about the useful properties of the Response class. You can use the **getheader()** function to search for a specific header in a response. *getheader is case insensitive* >>> response.getheader('link') '; rel=describedby' The **ori** property returns the response body in its original form, and it is useful for binary responses. >>> response.ori The **obj** property returns the response body in dot notation. >>> resp_obj = response.obj >>> resp_obj.AssetTag u'assettag' For keys with special characters, the dictionary notation still works. >>> resp_obj.Bios['@odata.id'] u'/redfish/v1/systems/1/bios' Response Object --------------- A class has been implemented within the library to handle HTTP response codes from iLO for patch, post and put type requests. HTTP response data is parsed and then combined with the relevant error response resource as associated with the applied properties (categorized by type and MessageId). Error response data is guided by HTTP status codes. See `List of HTTP status codes `_ for more information: * **200** response codes indicate success. Generally these types of responses include simple messages, such as "successful" or "one or more properties have been changed, an ilo reset is required for the properties to take effect" (on some rare occassions no response message or an empty response string will occur). * **400** response codes indicate client failures such as an invalid post or patch, or the resource could not be modified. Additional detailed information will likely accompany the response message. .. note:: Response codes outside of 200 and 400 have not been extensively tested or witnessed. Responses for HTTP response codes under 300 redirects or 500 server errors might be observed; please feel free to note and share the results of such encounters by opening a GitHub issue. Generally 400 error response codes result in a full error response. A response might include the following data; however, the entries are not guaranteed for every response: * An error response message ID ("MessageId"), iLO response error message code identification. * An error response message description ("Description"), essentially a quick synopsis of the issue. * An error response message ("Message") describing the reason for the error in greater detail. The offending properties are noted as per the relevant error response resource. * An error response resolution ("Resolution") describing steps to correct the error. The following is an example response message for an error in the iLODateTime type regarding the property "NTPServers": .. code-block:: TEXT HTTP Response Code: [400] MessageId: iLO.2.8.PropertyNotWritableOrUnknown Description: The request included a value for a read-only or unknown property. Message: The property "NTPServers" is a read-only property and cannot be assigned a value, or not valid for this resource. Resolution: If the operation did not complete, remove the property from the request body and resubmit the request. .. note:: The response data is also available when utilizing the iLO Channel Interface Driver (Chif). Request Object -------------- The **response** property of the Response object returns a **Request** object, which describes the request that generated the response. >>> response.request The **url** property shows the actual system the call was made against. >>> response.request.url 'https://10.0.0.100' The **method** property shows the method applied. >>> response.request.method 'PATCH' The **path** property shows what path the method was made against. >>> response.request.path '/redfish/v1/systems/1' The **body** property shows what body (if any) was passed along with the request. >>> response.request.body '{"AssetTag": "new tag"}' Certificate Based Authentication (HPE iLO Supported Authentication Only) ======================================================================== The python-ilorest-library (**version 3.2.0 and greater**) supports the use of certificate based authentication when accessing an HPE iLO based BMC. Certificate based authentication utilizes Urllib3 TLS certificates passed to the PoolManager when an http client is initialized. >>> REST_OBJ = redfish.RedfishClient(base_url="https://10.0.0.100", username="username", ca_cert_data=) Upon successful login, a session key is provided in return, by iLO, which can be used for all subsequent transactions. >>> REST_OBJ.login(auth="session") .. note:: This feature requires iLO 5 version 2.40 or greater. In addition to the version requirement the iLO internal RTC clock must have the correct date and time (NTP must be configured), have a valid "iLO Advanced Premium Security Edition" license key, have CAC/Smartcard Authentication enabled, incorporate a valid SSL certificate, as well as certificate thumbprint mappings for the relevant iLO management users which can be authenticated by the client certificate(s). Multiple users can share the same certificate, if so configured. The dictionary of certificate data should include: #. iLO User TLS Certificate (.pem suggested) #. iLO User Root CA Certificate (if self signed) (.pem suggested) #. Private Root CA Password (if available) >>> {'ca_certs': , 'cert_file': , 'key_file': , 'key_password': } General steps to create the necessary steps include: #. Generate a root CA private key (.PEM) using RSA. This key can be password protected, which must be supplied in order to be used. Bit encryption level should be consistent. #. Generate a user certificate private key. This key can be password protected, which must be supplied in order to be used. #. Generate a root CA Certificate (.PEM), if using a self signed option. Alternatively this can be generated by a valid, trusted, certificate authority (CA) (IdenTrust, DigiCert, GoDaddy, GlobalSign, and Let's Encrypt just to name a few). #. Configure and set X509 SSL certificate by generating a certificate signing request from iLO (CSR) and signing with the previously generated private root CA key. #. Add X509 SSL certificate to iLO. #. Add root CA Certificate to CAC/Smartcard and enable CAC Smartcard Authentication. #. Generate user certificate. #. Add user certificate mappings to iLO Multi-part Form Data ==================== .. note:: Multi-part Form data is only supported on iLO with a **Remote Object**. Multi-part form data is sent as a list of tuples. Standard fields are a tuple of `(field, value)` >>> ('field1': 'value') Json data is just another value >>> ('jsondata', {'key1': 'value1', 'key2': 'value2'}) Files & binary data are similar to the standard fields, except instead of a value we have another tuple. This value tuple has 2 or 3 items `(filename, filedata)` or optionally include the MIME type explicitly `(filename, filedata , MIME type)` >>> ('filedata', ('filename.data', '', 'application/octet-stream')) So putting it all together in a single form data request: >>> [('field1': 'value'), ('jsondata', {'key1': 'value1', 'key2': 'value2'}), ('filedata', ('filename.data', '', 'application/octet-stream'))] For an example of Multi-part form data in action, see the `example for uploading firmware to the iLO repository `_. Logging ======= Logging of all request and responses is available through the redfish_logger function. First, import the logging and redfish_logger functions. >>> import logging >>> from redfish import redfish_logger Then, specify the logger file name, format of the logger, and the logging level. See the `logging` python documentation for more information on these arguments. >>> LOGGERFILE = "RedfishApiExamples.log" >>> LOGGERFORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" >>> LOGGER = redfish_logger(LOGGERFILE, LOGGERFORMAT, logging.DEBUG) After running some commands, your log file should be populated in the file specified at creation. python-ilorest-4.8.0.0/docs/Examples.rest0000644000175000017500000070076214556457137020203 0ustar carstencarsten.. image:: /images/hpe_logo2.png :width: 150pt | .. toctree:: :maxdepth: 1 ======== Examples ======== .. note:: Successful creation, modification or deletion of a resource will usually result in a response code of 200 or 201. An unsuccessful attempt will likely result in a 400 error code with a more detailed error message within the body of the response, '@Message.ExtendedInfo'. .. note:: Examples showcasing Redfish standard properties and Actions will work for any BMC implementing Redfish. Any HPE OEM extensions are labeled in the examples as such. The `Redfish `_ and `Legacy_Rest `_ folders contain many examples for performing different iLO tasks using the Redfish API and Legacy RESTful API respectively. .. _Redfish_add_user_account: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/add_user_account.py .. _Redfish_bios_revert_default: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/bios_revert_default.py .. _Redfish_change_bios_setting: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/change_bios_setting.py .. _Redfish_change_boot_order: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/change_boot_order.py .. _Redfish_change_temporary_boot_order: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/change_temporary_boot_order.py .. _Redfish_clear_ahs_data: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/clear_ahs_data.py .. _Redfish_clear_ilo_IEL_IML_log: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/clear_ilo_IEL_IML_log.py .. _Redfish_computer_details: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/computer_details.py .. _Redfish_configure_snmp: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/configure_snmp.py .. _Redfish_enable_ntp_servers: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/enable_ntp_servers.py .. _Redfish_enable_secure_boot: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/enable_secure_boot.py .. _Redfish_expand_data: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/expand_data.py .. _Redfish_find_ilo_mac_address: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/find_ilo_mac_address.py .. _Redfish_generate_csr: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/generate_csr.py .. _Redfish_get_ESKM: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/get_ESKM.py .. _Redfish_get_LogicalDrives: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/get_LogicalDrives.py .. _Redfish_get_SmartArray_EncryptionSettings: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/get_SmartArray_EncryptionSettings.py .. _Redfish_get_ahs_data: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/get_ahs_data.py .. _Redfish_get_base_registry: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/get_base_registry.py .. _Redfish_get_ilo_ip: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/get_ilo_ip.py .. _Redfish_get_ilo_nic: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/get_ilo_nic.py .. _Redfish_get_license_key: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/get_license_key.py .. _Redfish_get_powermetrics_average: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/get_powermetrics_average.py .. _Redfish_get_resource_directory: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/get_resource_directory.py .. _Redfish_ilorest_util: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/ilorest_util.py .. _Redfish_get_schema: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/get_schema.py .. _Redfish_import_ssl: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/import_ssl.py .. _Redfish_modify_user_account: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/modify_user_account.py .. _Redfish_mount_virtual_media_iso: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/mount_virtual_media_iso.py .. _Redfish_quickstart_redfish: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/quickstart_redfish.py .. _Redfish_reboot_server: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/reboot_server.py .. _Redfish_remove_account: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/remove_account.py .. _Redfish_reset_ESKM_eventlog: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/reset_ESKM_eventlog.py .. _Redfish_reset_ilo: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/reset_ilo.py .. _Redfish_reset_server: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/reset_server.py .. _Redfish_sessions: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/sessions.py .. _Redfish_set_ESKM_PrimaryKeyServer: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_ESKM_PrimaryKeyServer.py .. _Redfish_set_ESKM_username_password: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_ESKM_username_password.py .. _Redfish_set_active_ilo_nic: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_active_ilo_nic.py .. _Redfish_set_bios_iscsi: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_bios_iscsi.py .. _Redfish_set_bios_password: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_bios_password.py .. _Redfish_set_ethernet_management_iface_static_ip: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_ethernet_management_iface_static_ip.py .. _Redfish_set_ilo_ntp_servers: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_ilo_ntp_servers.py .. _Redfish_set_ilo_timezone: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_ilo_timezone.py .. _Redfish_set_license_key: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_license_key.py .. _Redfish_set_server_asset_tag: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_server_asset_tag.py .. _Redfish_set_snmp_alert: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_snmp_alert.py .. _Redfish_set_uid_light: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/set_uid_light.py .. _Redfish_software_firmware_inventory: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/software_firmware_inventory.py .. _Redfish_test_ESKM_connection: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/test_ESKM_connection.py .. _Redfish_update_ilo_firmware: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/update_ilo_firmware.py .. _Redfish_upload_firmware_ilo_repository: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/upload_firmware_ilo_repository.py .. _Redfish_upload_firmware_ilo_repository_with_compsig: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Redfish/upload_firmware_ilo_repository_with_compsig.py .. _Legacy_Rest_add_ilo_user_account: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/add_ilo_user_account.py .. _Legacy_Rest_bios_revert_default: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/bios_revert_default.py .. _Legacy_Rest_change_bios_setting: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/change_bios_setting.py .. _Legacy_Rest_change_boot_order: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/change_boot_order.py .. _Legacy_Rest_change_temporary_boot_order: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/change_temporary_boot_order.py .. _Legacy_Rest_clear_ahs_data: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/clear_ahs_data.py .. _Legacy_Rest_clear_ilo_event_log: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/clear_ilo_event_log.py .. _Legacy_Rest_clear_iml: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/clear_iml.py .. _Legacy_Rest_computer_details: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/computer_details.py .. _Legacy_Rest_configure_snmp: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/configure_snmp.py .. _Legacy_Rest_dump_eskm_event_log: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/dump_eskm_event_log.py .. _Legacy_Rest_dump_ilo_event_log: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/dump_ilo_event_log.py .. _Legacy_Rest_dump_ilo_nic: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/dump_ilo_nic.py .. _Legacy_Rest_dump_iml: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/dump_iml.py .. _Legacy_Rest_enable_secure_boot: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/enable_secure_boot.py .. _Legacy_Rest_find_ilo_mac_address: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/find_ilo_mac_address.py .. _Legacy_Rest_generate_csr: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/generate_csr.py .. _Legacy_Rest_get_ESKM: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_ESKM.py .. _Legacy_Rest_get_EncryptionSettings: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_EncryptionSettings.py .. _Legacy_Rest_get_LogicalDrives: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_LogicalDrives.py .. _Legacy_Rest_get_ahs_data: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_ahs_data.py .. _Legacy_Rest_get_base_registry: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_base_registry.py .. _Legacy_Rest_get_csr: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_csr.py .. _Legacy_Rest_get_ilo_ip: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_ilo_ip. .. _Legacy_Rest_get_ilo_nic: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_ilo_nic.py .. _Legacy_Rest_get_license_key: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_license_key.py .. _Legacy_Rest_get_powermetrics_average: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_powermetrics_average.py .. _Legacy_Rest_get_resource_directory: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_resource_directory.py .. _Legacy_Rest_get_schema: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/get_schema.py .. _Legacy_Rest_import_ssl: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/import_ssl.py .. _Legacy_Rest_modify_ilo_user_account: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/modify_ilo_user_account.py .. _Legacy_Rest_mount_virtual_media_iso: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/mount_virtual_media_iso.py .. _Legacy_Rest_remove_ilo_account: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/remove_ilo_account.py .. _Legacy_Rest_reset_ESKM_eventlog: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/reset_ESKM_eventlog.py .. _Legacy_Rest_reset_ilo: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/reset_ilo.py .. _Legacy_Rest_reset_server: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/reset_server.py .. _Legacy_Rest_sessions: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/sessions.py .. _Legacy_Rest_set_active_ilo_nic: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_active_ilo_nic.py .. _Legacy_Rest_set_bios_dhcp: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_bios_dhcp.py .. _Legacy_Rest_set_ESKM_PrimaryKeyServer: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_ESKM_PrimaryKeyServer.py .. _Legacy_Rest_set_ESKM_username_password: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_ESKM_username_password.py .. _Legacy_Rest_set_ilo_ntp_servers: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_Ilo_ntp_servers.py .. _Legacy_Rest_set_bios_iscsi: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_bios_iscsi.py .. _Legacy_Rest_set_bios_password: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_bios_password.py .. _Legacy_Rest_set_bios_service: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_bios_service.py .. _Legacy_Rest_set_bios_uefi_shell_startup: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_bios_uefi_shell_startup.py .. _Legacy_Rest_set_bios_url_boot_file: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_bios_url_boot_file.py .. _Legacy_Rest_set_ilo_timezone: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_ilo_timezone.py .. _Legacy_Rest_set_license_key: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_license_key.py .. _Legacy_Rest_set_server_asset_tag: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_server_asset_tag.py .. _Legacy_Rest_set_uid_light: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/set_uid_light.py .. _Legacy_Rest_test_ESKM_connection: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/test_ESKM_connection.py .. _Legacy_Rest_update_ilo_firmware: https://github.com/HewlettPackard/python-ilorest-library/blob/master/examples/Legacy_Rest/update_ilo_firmware.py ------------------------------- Redfish Example Reference Table ------------------------------- .. |br| raw:: html
.. tabularcolumns:: :widths: 20 40 +----------------------------------------------------+-----------------------------------------------------------+ | Example | Link | +----------------------------------------------------+-----------------------------------------------------------+ | Add an iLO Manager Account | `Redfish_add_user_account`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Revert the BIOs to default values | `Redfish_bios_revert_default`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Change the BIOs settings. | `Redfish_change_bios_setting`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Change the boot order for HPE iLO systems. | `Redfish_change_boot_order`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Change the temporary boot order. | `Redfish_change_temporary_boot_order`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Clear AHS data for HPE iLO systems. | `Redfish_clear_ahs_data`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Clear IEL or IML Logs for HPE iLO systems. | `Redfish_clear_ilo_IEL_IML_log`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Gather the computer system details. | `Redfish_computer_details`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Configure SNMP for HPE iLO systems. | `Redfish_configure_snmp`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Enable NTP servers for HPE iLO systems. | `Redfish_enable_ntp_servers`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Enable secure boot. | `Redfish_enable_secure_boot`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Expand data responses. | `Redfish_expand_data`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Clear IEL or IML Logs for HPE iLO systems. | `Redfish_find_ilo_mac_address`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Generate a certificate signing request for |br| | `Redfish_generate_csr`_ | | HPE iLO systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Gather ESKM data for HPE iLO systems. | `Redfish_get_ESKM`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Gather the Logical Drives on an HPE iLO system. | `Redfish_get_LogicalDrives`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Gather the Smart Array encryption settings on |br| | `Redfish_get_SmartArray_EncryptionSettings`_ | | HPE iLO based systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Gather AHS data for HPE iLO systems. | `Redfish_get_ahs_data`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the base message registry. | `Redfish_get_base_registry`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the Manager IP. | `Redfish_get_ilo_ip`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the Manager NIC data. | `Redfish_get_ilo_nic`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain an iLO license key for HPE iLO systems. | `Redfish_get_license_key`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the power metrics average on HPE iLO |br| | `Redfish_get_powermetrics_average`_ | | systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain iLO information. | `Redfish_get_resource_directory`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain iLO utility information, such as iLO |br| | `Redfish_ilorest_util`_ | | generation, version and resource directory for |br|| | | HPE iLO systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain schema data on any BMC with schemas |br| | `Redfish_get_schema`_ | | available. | | +----------------------------------------------------+-----------------------------------------------------------+ | Import an SSL certificate for HPE iLO systems. | `Redfish_import_ssl`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Modify a user account. | `Redfish_modify_user_account`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Mount virtual media for HPE iLO systems. | `Redfish_mount_virtual_media_iso`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Create Redfish client. | `Redfish_quickstart_redfish`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Reboot a server. | `Redfish_reboot_server`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Remove a user account. | `Redfish_remove_account`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Reset the ESKM event log for HPE iLO systems. | `Redfish_reset_ESKM_eventlog`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Reset a Manager. | `Redfish_reset_ilo`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Reset a sever. | `Redfish_reset_server`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Manually manage sessions with Redfish | `Redfish_sessions`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the primary ESKM key server properties |br| | `Redfish_set_ESKM_PrimaryKeyServer`_ | | for HPE iLO systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Set the ESKM username and password for HPE |br| | `Redfish_set_ESKM_username_password`_ | | iLO systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Set active Manager NIC. | `Redfish_set_active_ilo_nic`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set an ISCSI boot instance for HPE iLO |br| | `Redfish_set_bios_iscsi`_ | | systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Set the BIOS password for HPE iLO systems. | `Redfish_set_bios_password`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the Manager ethernet interface static IP. | `Redfish_set_ethernet_management_iface_static_ip`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the NTP servers for HPE iLO systems. | `Redfish_set_ilo_ntp_servers`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the time zone for HPE iLO systems. | `Redfish_set_ilo_timezone`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Add a license key for HPE iLO systems. | `Redfish_set_license_key`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the server asset tag. | `Redfish_set_server_asset_tag`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Configure SNMP alert for HPE iLO systems. | `Redfish_set_snmp_alert`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the UID light. | `Redfish_set_uid_light`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Provide the firmware inventory on HPE iLO |br| | `Redfish_software_firmware_inventory`_ | | systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Test a connection to the ESKM system for HPE |br| | `Redfish_test_ESKM_connection`_ | | iLO systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Update the firmware by using an HTTP URL. | `Redfish_update_ilo_firmware`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Upload the firmware to the iLO Repository for |br| | `Redfish_upload_firmware_ilo_repository`_ | | flashing. | | +----------------------------------------------------+-----------------------------------------------------------+ | Upload a firmware component with a size less |br| | `Redfish_upload_firmware_ilo_repository_with_compsig`_ | | than 32 GB and associated compsig signature |br| | | | file to the iLO repository. | | +----------------------------------------------------+-----------------------------------------------------------+ ----------------------------------- Legacy Rest Example Reference Table ----------------------------------- .. tabularcolumns:: :widths: 10 40 +----------------------------------------------------+-----------------------------------------------------------+ | Example | Link | +----------------------------------------------------+-----------------------------------------------------------+ | Add an iLO user account. | `Legacy_Rest_add_ilo_user_account`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Revert the BIOs to default values. | `Legacy_Rest_bios_revert_default`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Change the BIOs settings. | `Legacy_Rest_change_bios_setting`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Change the boot order for HPE iLO systems. | `Legacy_Rest_change_boot_order`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Change the temporary boot order. | `Legacy_Rest_change_temporary_boot_order`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Clear the AHS data. | `Legacy_Rest_clear_ahs_data`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Clear IEL or IML Logs for HPE iLO systems. | `Legacy_Rest_clear_ilo_event_log`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Clear the IML. | `Legacy_Rest_clear_iml`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Gather the computer system details. | `Legacy_Rest_computer_details`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Configure SNMP for HPE iLO systems. | `Legacy_Rest_configure_snmp`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Dump the ESKM event log. | `Legacy_Rest_dump_eskm_event_log`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Dump the iLO event log. | `Legacy_Rest_dump_ilo_event_log`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Dump the Manager NIC data. | `Legacy_Rest_dump_ilo_nic`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Dump the IML. | `Legacy_Rest_dump_iml`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Enables secure boot. | `Legacy_Rest_enable_secure_boot`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Clear IEL or IML Logs for HPE iLO systems. | `Legacy_Rest_find_ilo_mac_address`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Generate a certificate signing request for |br| | `Legacy_Rest_generate_csr`_ | | HPE iLO systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Gather ESKM data for HPE iLO systems. | `Legacy_Rest_get_ESKM`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Gather the encryption settings on HPE iLO systems. | `Legacy_Rest_get_EncryptionSettings`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the logical drives. | `Legacy_Rest_get_LogicalDrives`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Gather AHS data for HPE iLO systems. | `Legacy_Rest_get_ahs_data`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the base message registry. | `Legacy_Rest_get_base_registry`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the CSR. | `Legacy_Rest_get_csr`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the Manager IP. | `Legacy_Rest_get_ilo_ip`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the Manager NIC data. | `Legacy_Rest_get_ilo_nic`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain an iLO license key for HPE iLO systems. | `Legacy_Rest_get_license_key`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the power metrics average on HPE iLO |br| | `Legacy_Rest_get_powermetrics_average`_ | | systems | | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the iLO information, such as iLO |br| | `Legacy_Rest_get_resource_directory`_ | | generation, version, and resource directory |br| | | | for HPE iLO systems. | `Legacy_Rest_get_resource_directory`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Obtain the schema data on any system with |br| | `Legacy_Rest_get_schema`_ | | schemas on system. | | +----------------------------------------------------+-----------------------------------------------------------+ | Import an SSL certificate for HPE iLO systems. | `Legacy_Rest_import_ssl`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Modify a user account. | `Legacy_Rest_modify_ilo_user_account`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Mount virtual media for HPE iLO systems. | `Legacy_Rest_mount_virtual_media_iso`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Remove an iLO user account. | `Legacy_Rest_remove_ilo_account`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Reset the ESKM event log for HPE iLO systems. | `Legacy_Rest_reset_ESKM_eventlog`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Reset iLO. | `Legacy_Rest_reset_ilo`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Reset a sever. | `Legacy_Rest_reset_server`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Create a session. | `Legacy_Rest_sessions`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set active Manager NIC. | `Legacy_Rest_set_active_ilo_nic`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the DHCP boot instance for HPE iLO systems. | `Legacy_Rest_set_bios_dhcp`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the primary ESKM key server for HPE iLO |br| | `Legacy_Rest_set_ESKM_PrimaryKeyServer`_ | | systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Set the ESKM username and password for HPE iLO |br|| `Legacy_Rest_set_ESKM_username_password`_ | | systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Set the NTP servers for HPE iLO systems. | `Legacy_Rest_set_Ilo_ntp_servers`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set an ISCSI boot instance for HPE iLO systems. | `Legacy_Rest_set_bios_iscsi`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the BIOS password for HPE iLO systems. | `Legacy_Rest_set_bios_password`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the BIOS service. | `Legacy_Rest_set_bios_service`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the UEFI shell startup. | `Legacy_Rest_set_bios_uefi_shell_startup`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the URL boot file. | `Legacy_Rest_set_bios_url_boot_file`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the time zone for HPE iLO systems. | `Legacy_Rest_set_ilo_timezone`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Add a license key for HPE iLO systems. | `Legacy_Rest_set_license_key`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the server asset tag. | `Legacy_Rest_set_server_asset_tag`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Set the UID light. | `Legacy_Rest_set_uid_light`_ | +----------------------------------------------------+-----------------------------------------------------------+ | Test a connection to the ESKM system for HPE |br| | `Legacy_Rest_test_ESKM_connection`_ | | iLO systems. | | +----------------------------------------------------+-----------------------------------------------------------+ | Update the firmware by using an HTTP URL. | `Legacy_Rest_update_ilo_firmware`_ | +----------------------------------------------------+-----------------------------------------------------------+ ----------------------- Add iLO Manager Account ----------------------- Add an iLO Manager Account based on permissions (iLO 4 and iLO 5) or role ID (iLO 5). .. code-block:: python :linenos: def add_ilo_user_account(_redfishobj, new_loginname, new_username, new_password, role_id, \ privilege_dict): resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #resource directory is not available so we will navigate through paths manually to obtain #account info account_service_uri = _redfishobj.root.obj['AccountService']['@odata.id'] account_service_response = _redfishobj.get(account_service_uri) account_collection_uri = account_service_response.obj['Accounts']['@odata.id'] #Add via role id body = {"RoleId": role_id} else: #obtain all account instances from resource directory for instance in resource_instances: if '#ManagerAccountCollection.' in instance['@odata.type']: account_collection_uri = instance['@odata.id'] body = {"Oem": {"Hpe": {"Privileges": {}}}} #HPE server, so add via privileges for priv in privilege_dict: body["Oem"]["Hpe"]["Privileges"][priv] = privilege_dict[priv] #Add login name body["Oem"]["Hpe"]["LoginName"] = new_loginname #Fill in the rest of the payload body["UserName"] = new_username body["Password"] = new_password #We pass the URI and the dictionary as a POST command (part of the redfish object) resp = _redfishobj.post(account_collection_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, sort_keys=True)) except Exception: sys.stderr.write("A response error occurred, unable to access iLO Extended Message "\ "Info...") elif not resp.status in [200, 201]: sys.stderr.write("An http response of '%s' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ------------------- BIOS Revert Default ------------------- Set all BIOS attributes to their respective factory default states. .. code-block:: python :linenos: def bios_revert_default(_redfishobj): bios_reset_action_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) bios_uri = systems_members_response.obj['Bios']['@odata.id'] bios_response = _redfishobj.get(bios_uri) bios_reset_action_uri = bios_response.obj['Actions']['#Bios.ResetBios']['target'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#Bios.' in instance['@odata.type']: bios_uri = instance['@odata.id'] bios_data = _redfishobj.get(bios_uri) bios_reset_action_uri = bios_data.obj['Actions']['#Bios.ResetBios']['target'] break body = {'Action': 'Bios.ResetBios', 'ResetType':'default'} resp = _redfishobj.post(bios_reset_action_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, sort_keys=True)) except Exception: sys.stderr.write("A response error occurred, unable to access iLO Extended Message "\ "Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ------------------- Change BIOS Setting ------------------- Alter one ore more BIOS attributes. .. code-block:: python :linenos: def change_bios_setting(_redfishobj, bios_property, property_value, bios_password): bios_uri = None bios_data = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) bios_uri = systems_members_response.obj['Bios']['@odata.id'] bios_data = _redfishobj.get(bios_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#Bios.' in instance['@odata.type']: bios_uri = instance['@odata.id'] bios_data = _redfishobj.get(bios_uri) break if bios_data: print("\n\nShowing bios attributes before changes:\n\n") print(json.dumps(bios_data.dict, indent=4, sort_keys=True)) if bios_uri: #Bios settings URI is needed bios_settings_uri = bios_data.obj['@Redfish.Settings']['SettingsObject']['@odata.id'] body = {'Attributes': {bios_property: property_value}} #update bios password if bios_password: _redfishobj.bios_password = bios_password resp = _redfishobj.patch(bios_settings_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("\nSuccess!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) #uncomment if you would like to see the full list of attributes #print("\n\nShowing bios attributes after changes:\n\n") #bios_data = _redfishobj.get(bios_uri) #print(json.dumps(bios_data.dict, indent=4, sort_keys=True)) --------------------------- Change Temporary Boot Order --------------------------- Alter the temporary boot order. .. code-block:: python :linenos: def change_temporary_boot_order(_redfishobj, boottarget): systems_members_uri = None systems_members_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) else: for instance in resource_instances: if '#ComputerSystem.' in instance['@odata.type']: systems_members_uri = instance['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) if systems_members_response: print("\n\nShowing bios attributes before changes:\n\n") print(json.dumps(systems_members_response.dict.get('Boot'), indent=4, sort_keys=True)) body = {'Boot': {'BootSourceOverrideTarget': boottarget}} resp = _redfishobj.patch(systems_members_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended Message "\ "Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("\nSuccess!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) if systems_members_response: print("\n\nShowing boot override target:\n\n") print(json.dumps(systems_members_response.dict.get('Boot'), indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Example of the Boot Object ^^^^^^^^^^^^^^^^^^^^^^^^^^ The folowing JSON output can be obtained first by noting the *systems_members_response* on line 42 above. .. code-block:: python else: for instance in resource_instances: if '#ComputerSystem.' in instance['@odata.type']: systems_members_uri = instance['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) if systems_members_response: print("\n\nShowing bios attributes before changes:\n\n") print(json.dumps(systems_members_response.dict.get('Boot'), indent=4, sort_keys=True)) The user can preview the data prior: .. code-block:: JSON :linenos: { "BootOptions": { "@odata.id": "/redfish/v1/Systems/1/BootOptions/" }, "BootOrder": [ "Boot0011", "Boot0019", "Boot0009", "Boot0012", "Boot0010", "Boot0014", "Boot000C", "Boot000E", "Boot000F", "Boot0017", "Boot000D", "Boot0013" ], "BootSourceOverrideEnabled": "Disabled", "BootSourceOverrideMode": "UEFI", "BootSourceOverrideTarget": "None", "BootSourceOverrideTarget@Redfish.AllowableValues": [ "None", "Cd", "Hdd", "Usb", "SDCard", "Utilities", "Diags", "BiosSetup", "Pxe", "UefiShell", "UefiHttp", "UefiTarget" ], "UefiTargetBootSourceOverride": "None", "UefiTargetBootSourceOverride@Redfish.AllowableValues": [ "HD(1,GPT,0940C33C-EAF1-43CD-8C8F-4426672227FE,0x800,0x4E000)/\\EFI\\sles\\shim.efi", "HD(1,GPT,22F62F69-47E7-4334-BCE6-A0B321810BA1,0x800,0x64000)/\\EFI\\redhat\\shimx64.efi", "PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv4(0.0.0.0)/Uri()", "PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv4(0.0.0.0)", "PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv6(0000:0000:0000:0000:0000:0000:0000:0000)/Uri()", "PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv6(0000:0000:0000:0000:0000:0000:0000:0000)", "PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x0)", "PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x1)", "PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x2)", "PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x3)", "PciRoot(0x0)/Pci(0x14,0x0)/USB(0xD,0x0)/USB(0x1,0x0)", "PciRoot(0x0)/Pci(0x14,0x0)/USB(0xD,0x0)/USB(0x1,0x1)" ] } ----------------- Change Boot Order ----------------- Alter the default boot order. .. code-block:: python :linenos: def change_boot_order(_redfishobj, bios_password): bios_boot_uri = None bios_boot_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) bios_uri = systems_members_response.obj['Bios']['@odata.id'] bios_response = _redfishobj.get(bios_uri) bios_boot_uri = bios_response.obj.Oem.Hpe.Links.Boot['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeServerBootSettings.' in instance['@odata.type']: bios_boot_uri = instance['@odata.id'] break if bios_boot_uri: bios_boot_response = _redfishobj.get(bios_boot_uri) #Bios boot settings URI is needed bios_boot_settings_uri = bios_boot_response.obj['@Redfish.Settings']['SettingsObject']\ ['@odata.id'] #update bios password if bios_password: _redfishobj.bios_password = bios_password sys.stdout.write("Rotating the first boot device to the end of the boot order.\n") sys.stdout.write('Current Order:\n') boot_order = bios_boot_response.obj['DefaultBootOrder'] for indx, boot_device in enumerate(boot_order): sys.stdout.write('Pos ' + str(indx) + ' : ' + boot_device + '\n') device = boot_order.pop(0) sys.stdout.write("Rotating device: \'%s\' to the end of the boot order.\n" % device) boot_order.append(device) body = {'DefaultBootOrder': boot_order} resp = _redfishobj.patch(bios_boot_settings_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended Message"\ " Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success! Your system may need to be restarted.\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) else: sys.stderr.write("Unable to find Boot Order URI.\n") -------------- Clear AHS Data -------------- Clear Active Health System log data. .. code-block:: python :linenos: def clear_ahs_data(_redfishobj): active_health_system_clear_log_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) active_health_system_uri = managers_members_response.obj.Oem.Hpe.Links\ ['ActiveHealthSystem']['@odata.id'] active_health_system_response = _redfishobj.get(active_health_system_uri) active_health_system_clear_log_uri = active_health_system_response.obj['Actions']\ ['#HpeiLOActiveHealthSystem.ClearLog']['target'] else: for instance in resource_instances: if '#HpeiLOActiveHealthSystem.' in instance['@odata.type']: active_health_system_uri = instance['@odata.id'] active_health_system_response = _redfishobj.get(active_health_system_uri) active_health_system_clear_log_uri = active_health_system_response['Actions']\ ['#HpeiLOActiveHealthSystem.ClearLog']['target'] break if active_health_system_clear_log_uri: body = {"Action": "HpeiLOActiveHealthSystem.ClearLog"} resp = _redfishobj.redfish_client.post(active_health_system_clear_log_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4,\ sort_keys=True)) except Exception: sys.stderr.write("A response error occurred, unable to access iLO Extended " \ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ------------------ Clear IEL/IML Data ------------------ Clear iLO event log and management log data. .. code-block:: python :linenos: def clear_ilo_event_log(_redfishobj, clear_IML_IEL): clear_log_services_uri = [] resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) log_services_uri = systems_members_response.obj['LogServices']['@odata.id'] log_services_response = _redfishobj.get(log_services_uri) log_services_uris = log_services_response.obj['Members'] for log_services_uri in log_services_uris: log_services_response = _redfishobj.get(log_services_uri['@odata.id']) clear_log_services_uri.append(log_services_response.obj['Actions']\ ['#LogService.ClearLog']['target']) else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#LogService.' in instance['@odata.type']: log_service_uri = instance['@odata.id'] clear_log_services_uri.append(_redfishobj.get(log_service_uri).dict['Actions']\ ['#LogService.ClearLog']['target']) if clear_log_services_uri: body = {"Action": "LogService.ClearLog"} for path in clear_log_services_uri: if ("IEL" in clear_IML_IEL and "IEL" in path) or ("IML" in clear_IML_IEL and \ "IML" in path): if "IEL" in path: sys.stdout.write("Clearing IEL log.\n") else: sys.stdout.write("Clearing IML log.\n") resp = _redfishobj.post(path, body) else: continue #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended #info error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO "\ "Extended Message Info...\n") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ------------------ Clear IEL/IML Data ------------------ Print computer system JSON data. .. code-block:: python :linenos: def computer_details(_redfishobj): systems_members_uri = None systems_members_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#ComputerSystem.' in instance['@odata.type']: systems_members_uri = instance['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) print("\n\nPrinting computer system details:\n\n") print(json.dumps(systems_members_response.dict, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^^^^^ Computer System Data ^^^^^^^^^^^^^^^^^^^^ The folowing JSON output is obtained when accessing type *ComputerSystem*. Values may vary from system to system, and key entries may differ based on the schema version for #ComputerSystem. The user can preview the data prior: .. code-block:: JSON :linenos: { "@odata.context": "/redfish/v1/$metadata#ComputerSystem.ComputerSystem", "@odata.etag": "W/\"7010F715\"", "@odata.id": "/redfish/v1/Systems/1/", "@odata.type": "#ComputerSystem.v1_10_0.ComputerSystem", "Actions": { "#ComputerSystem.Reset": { "ResetType@Redfish.AllowableValues": [ "On", "ForceOff", "GracefulShutdown", "ForceRestart", "Nmi", "PushPowerButton" ], "target": "/redfish/v1/Systems/1/Actions/ComputerSystem.Reset/" } }, "AssetTag": "", "Bios": { "@odata.id": "/redfish/v1/systems/1/bios/" }, "BiosVersion": "U32 v2.22 (11/13/2019)", "Boot": { "BootOptions": { "@odata.id": "/redfish/v1/Systems/1/BootOptions/" }, "BootOrder": [ "Boot0011", "Boot0019", "Boot0009", "Boot0012", "Boot0010", "Boot0014", "Boot000C", "Boot000E", "Boot000F", "Boot0017", "Boot000D", "Boot0013" ], "BootSourceOverrideEnabled": "Once", "BootSourceOverrideMode": "UEFI", "BootSourceOverrideTarget": "Hdd", "BootSourceOverrideTarget@Redfish.AllowableValues": [ "None", "Cd", "Hdd", "Usb", "SDCard", "Utilities", "Diags", "BiosSetup", "Pxe", "UefiShell", "UefiHttp", "UefiTarget" ], "UefiTargetBootSourceOverride": "None", "UefiTargetBootSourceOverride@Redfish.AllowableValues": [ "HD(1,GPT,0940C33C-EAF1-43CD-8C8F-4426672227FE,0x800,0x4E000)/\\EFI\\sles\\shim.efi", "HD(1,GPT,22F62F69-47E7-4334-BCE6-A0B321810BA1,0x800,0x64000)/\\EFI\\redhat\\shimx64.efi", "PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv4(0.0.0.0)/Uri()", "PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv4(0.0.0.0)", "PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv6(0000:0000:0000:0000:0000:0000:0000:0000)/Uri()", "PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv6(0000:0000:0000:0000:0000:0000:0000:0000)", "PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x0)", "PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x1)", "PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x2)", "PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x3)", "PciRoot(0x0)/Pci(0x14,0x0)/USB(0xD,0x0)/USB(0x1,0x0)", "PciRoot(0x0)/Pci(0x14,0x0)/USB(0xD,0x0)/USB(0x1,0x1)" ] }, "EthernetInterfaces": { "@odata.id": "/redfish/v1/Systems/1/EthernetInterfaces/" }, "HostName": "localhost.americas.hpqcorp.net", "Id": "1", "IndicatorLED": "Off", "Links": { "Chassis": [ { "@odata.id": "/redfish/v1/Chassis/1/" } ], "ManagedBy": [ { "@odata.id": "/redfish/v1/Managers/1/" } ] }, "LogServices": { "@odata.id": "/redfish/v1/Systems/1/LogServices/" }, "Manufacturer": "HPE", "Memory": { "@odata.id": "/redfish/v1/Systems/1/Memory/" }, "MemoryDomains": { "@odata.id": "/redfish/v1/Systems/1/MemoryDomains/" }, "MemorySummary": { "Status": { "HealthRollup": "OK" }, "TotalSystemMemoryGiB": 32, "TotalSystemPersistentMemoryGiB": 0 }, "Model": "ProLiant DL360 Gen10", "Name": "Computer System", "NetworkInterfaces": { "@odata.id": "/redfish/v1/Systems/1/NetworkInterfaces/" }, "Oem": { "Hpe": { "@odata.context": "/redfish/v1/$metadata#HpeComputerSystemExt.HpeComputerSystemExt", "@odata.type": "#HpeComputerSystemExt.v2_9_0.HpeComputerSystemExt", "Actions": { "#HpeComputerSystemExt.PowerButton": { "PushType@Redfish.AllowableValues": [ "Press", "PressAndHold" ], "target": "/redfish/v1/Systems/1/Actions/Oem/Hpe/HpeComputerSystemExt.PowerButton/" }, "#HpeComputerSystemExt.SecureSystemErase": { "target": "/redfish/v1/Systems/1/Actions/Oem/Hpe/HpeComputerSystemExt.SecureSystemErase/" }, "#HpeComputerSystemExt.SystemReset": { "ResetType@Redfish.AllowableValues": [ "ColdBoot", "AuxCycle" ], "target": "/redfish/v1/Systems/1/Actions/Oem/Hpe/HpeComputerSystemExt.SystemReset/" } }, "AggregateHealthStatus": { "AgentlessManagementService": "Unavailable", "BiosOrHardwareHealth": { "Status": { "Health": "OK" } }, "FanRedundancy": "Redundant", "Fans": { "Status": { "Health": "OK" } }, "Memory": { "Status": { "Health": "OK" } }, "Network": { "Status": { "Health": "OK" } }, "PowerSupplies": { "PowerSuppliesMismatch": false, "Status": { "Health": "OK" } }, "Processors": { "Status": { "Health": "OK" } }, "Storage": { "Status": { "Health": "Warning" } }, "Temperatures": { "Status": { "Health": "OK" } } }, "Bios": { "Backup": { "Date": "11/13/2019", "Family": "U32", "VersionString": "U32 v2.22 (11/13/2019)" }, "Current": { "Date": "11/13/2019", "Family": "U32", "VersionString": "U32 v2.22 (11/13/2019)" }, "UefiClass": 2 }, "CriticalTempRemainOff": false, "CurrentPowerOnTimeSeconds": null, "DeviceDiscoveryComplete": { "AMSDeviceDiscovery": "NoAMS", "DeviceDiscovery": "vMainDeviceDiscoveryComplete", "SmartArrayDiscovery": "Complete" }, "ElapsedEraseTimeInMinutes": 0, "EndOfPostDelaySeconds": null, "EstimatedEraseTimeInMinutes": 0, "IntelligentProvisioningAlwaysOn": true, "IntelligentProvisioningIndex": 8, "IntelligentProvisioningLocation": "System Board", "IntelligentProvisioningVersion": "3.60.12", "IsColdBooting": false, "Links": { "EthernetInterfaces": { "@odata.id": "/redfish/v1/Systems/1/EthernetInterfaces/" }, "HpeIpProvider": { "@odata.id": "/redfish/v1/systems/1/hpeip/" }, "NetworkAdapters": { "@odata.id": "/redfish/v1/Systems/1/BaseNetworkAdapters/" }, "PCIDevices": { "@odata.id": "/redfish/v1/Systems/1/PCIDevices/" }, "PCISlots": { "@odata.id": "/redfish/v1/Systems/1/PCISlots/" }, "SUT": { "@odata.id": "/redfish/v1/systems/1/hpsut/" }, "SecureEraseReportService": { "@odata.id": "/redfish/v1/Systems/1/SecureEraseReportService/" }, "SmartStorage": { "@odata.id": "/redfish/v1/Systems/1/SmartStorage/" }, "USBDevices": { "@odata.id": "/redfish/v1/Systems/1/USBDevices/" }, "USBPorts": { "@odata.id": "/redfish/v1/Systems/1/USBPorts/" }, "WorkloadPerformanceAdvisor": { "@odata.id": "/redfish/v1/Systems/1/WorkloadPerformanceAdvisor/" } }, "PCAPartNumber": "847479-001", "PCASerialNumber": "PVZEK0ARHA014I", "PostDiscoveryCompleteTimeStamp": null, "PostDiscoveryMode": null, "PostMode": null, "PostState": "FinishedPost", "PowerAllocationLimit": 500, "PowerAutoOn": "Restore", "PowerOnDelay": "Minimum", "PowerOnMinutes": 80051, "PowerRegulatorMode": "OSControl", "PowerRegulatorModesSupported": [ "OSControl", "Dynamic", "Max", "Min" ], "ProcessorJitterControl": { "ConfiguredFrequencyLimitMHz": 0, "Mode": "Disabled" }, "SMBIOS": { "extref": "/smbios" }, "ServerFQDN": "", "SmartStorageConfig": [ { "@odata.id": "/redfish/v1/systems/1/smartstorageconfig/" } ], "SystemROMAndiLOEraseComponentStatus": { "BIOSSettingsEraseStatus": "Idle", "iLOSettingsEraseStatus": "Idle" }, "SystemROMAndiLOEraseStatus": "Idle", "UserDataEraseComponentStatus": {}, "UserDataEraseStatus": "Idle", "VirtualProfile": "Inactive" } }, "PowerState": "On", "ProcessorSummary": { "Count": 1, "Model": "Intel(R) Xeon(R) Bronze 3106 CPU @ 1.70GHz", "Status": { "HealthRollup": "OK" } }, "Processors": { "@odata.id": "/redfish/v1/Systems/1/Processors/" }, "SKU": "DL3000GEN10", "SecureBoot": { "@odata.id": "/redfish/v1/Systems/1/SecureBoot/" }, "SerialNumber": "TX86NP0121", "Status": { "Health": "Warning", "HealthRollup": "Warning", "State": "Enabled" }, "Storage": { "@odata.id": "/redfish/v1/Systems/1/Storage/" }, "SystemType": "Physical", "TrustedModules": [ { "Oem": { "Hpe": { "@odata.context": "/redfish/v1/$metadata#HpeTrustedModuleExt.HpeTrustedModuleExt", "@odata.type": "#HpeTrustedModuleExt.v2_0_0.HpeTrustedModuleExt" } }, "Status": { "State": "Absent" } } ], "UUID": "30334C44-3030-5854-3836-4E5030313231" } -------------- Configure SNMP -------------- Configure iLO Simple Network Management Protocol. .. code-block:: python :linenos: def configure_snmp(_redfishobj, read_communities, snmp_alerts): snmp_service_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) snmp_service_uri = managers_members_response.obj.Oem.Hpe.Links['Snmp']['@odata.id'] else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#HpeiLOSnmpService.' in instance['@odata.type']: snmp_service_uri = instance['@odata.id'] if snmp_service_uri: body = {"AlertsEnabled": snmp_alerts, "ReadCommunities": read_communities} resp = _redfishobj.patch(snmp_service_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ---------- Enable NTP ---------- In order to configure iLO Network Time Protocol, certain settings must be in-place on the iLO Management NIC(s) including settings the value of the OEM/HPE object key-value pair *UseNTPServers* to *True*. .. note:: An iLO Reset will be required in order for the change to be applied. .. code-block:: python :linenos: def enable_ntp(_redfishobj, ntp_servers): ethernet_data = {} resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) manager_ethernet_interfaces = managers_members_response.obj['EthernetInterfaces']\ ['@odata.id'] manager_ethernet_interfaces_response = _redfishobj.get(manager_ethernet_interfaces) manager_ethernet_interfaces_members = manager_ethernet_interfaces_response.\ obj['Members'] for _member in manager_ethernet_interfaces_members: _tmp = _redfishobj.get(_member['@odata.id']).obj ethernet_data[_member['@odata.id']] = _tmp else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#EthernetInterfaceCollection.' in instance['@odata.type'] and 'Managers' in \ instance['@odata.id']: ethernet_uri = instance['@odata.id'] ethernet_interfaces = _redfishobj.get(ethernet_uri).obj['Members'] for _ethernet_interface in ethernet_interfaces: ethernet_data[_ethernet_interface['@odata.id']] = _redfishobj.\ get(_ethernet_interface['@odata.id']).dict break if ethernet_data: print("\n\nShowing all available ethernet management interfaces before changes:\n\n") print(json.dumps(ethernet_data, indent=4, sort_keys=True)) body = {"Oem": {"Hpe": {"DHCPv4": {"UseNTPServers": ntp_servers}, \ "DHCPv6": {"UseNTPServers": ntp_servers}}}} for ethernet in ethernet_data: resp = _redfishobj.patch(ethernet, body) if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) _data = _redfishobj.get(ethernet).dict sys.stdout.write("\nShowing \'%s\' interface after changes:\n" % ethernet) print(json.dumps(_data, indent=4, sort_keys=True)) ------------------ Enable Secure Boot ------------------ Enable/Disable Secure Boot. .. code-block:: python :linenos: def enable_secure_boot(_redfishobj, secure_boot_enable): secure_boot_uri = None secure_boot_data = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) secure_boot_uri = systems_members_response.obj['SecureBoot']['@odata.id'] secure_boot_data = _redfishobj.get(secure_boot_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#SecureBoot.' in instance['@odata.type']: secure_boot_uri = instance['@odata.id'] secure_boot_data = _redfishobj.get(secure_boot_uri) if secure_boot_data: print("\n\nShowing Secure Boot properties before changes:\n\n") print(json.dumps(secure_boot_data.dict, indent=4, sort_keys=True)) if secure_boot_uri: body = {'SecureBootEnable': secure_boot_enable} resp = _redfishobj.patch(secure_boot_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception: sys.stderr.write("A response error occurred, unable to access iLO Extended " \ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("\nSuccess!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) print("\n\nShowing Secure Boot properties after changes:\n\n") secure_boot_data = _redfishobj.get(secure_boot_uri) print(json.dumps(secure_boot_data.dict, indent=4, sort_keys=True)) ----------- Expand Data ----------- JSON data is typically provided in a collapsed/compactted state. Use *$expand* as a query string on the desired URI. .. code-block:: python :linenos: def expand_data(_redfishobj, expand_url="/redfish/v1/"): response = _redfishobj.get(expand_url) exp_response = _redfishobj.get(expand_url+'?$expand=.') sys.stdout.write('Standard response:\n') sys.stdout.write('\t'+str(response.dict)+'\n') sys.stdout.write('Expanded response:\n') sys.stdout.write('\t'+str(exp_response.dict)+'\n') ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Standard response: .. code-block:: TEXT {'@odata.context': '/redfish/v1/$metadata#ComputerSystemCollection.ComputerSystemCollection', '@odata.etag': 'W/"AA6D42B0"', '@odata.id': '/redfish/v1/Systems/', '@odata.type': '#ComputerSystemCollection.ComputerSystemCollection', 'Description': 'Computer Systems view', 'Name': 'Computer Systems', 'Members': [{'@odata.id': '/redfish/v1/Systems/1/'}], 'Members@odata.count': 1} Expanded response: .. code-block:: TEXT {'@odata.context': '/redfish/v1/$metadata#ComputerSystemCollection.ComputerSystemCollection', '@odata.etag': 'W/"5737F79D"', '@odata.id': '/redfish/v1/Systems/', '@odata.type': '#ComputerSystemCollection.ComputerSystemCollection', 'Description': 'Computer Systems view', 'Name': 'Computer Systems', 'Members': [{'@odata.context': '/redfish/v1/$metadata#ComputerSystem.ComputerSystem', '@odata.id': '/redfish/v1/Systems/1/', '@odata.type': '#ComputerSystem.v1_10_0.ComputerSystem', 'Id': '1', 'Actions': {'#ComputerSystem.Reset': {'ResetType@Redfish.AllowableValues': ['On', 'ForceOff', 'GracefulShutdown', 'ForceRestart', 'Nmi', 'PushPowerButton'], 'target': '/redfish/v1/Systems/1/Actions/ComputerSystem.Reset/'}}, 'AssetTag': '', 'Bios': {'@odata.id': '/redfish/v1/systems/1/bios/'}, 'BiosVersion': 'U32 v2.22 (11/13/2019)', 'Boot': {'BootOptions': {'@odata.id': '/redfish/v1/Systems/1/BootOptions/'}, 'BootOrder': ['Boot0011', 'Boot0019', 'Boot0009', 'Boot0012', 'Boot0010', 'Boot0014', 'Boot000C', 'Boot000E', 'Boot000F', 'Boot0017', 'Boot000D', 'Boot0013'], 'BootSourceOverrideEnabled': 'Once', 'BootSourceOverrideMode': 'UEFI', 'BootSourceOverrideTarget': 'Hdd', 'BootSourceOverrideTarget@Redfish.AllowableValues': ['None', 'Cd', 'Hdd', 'Usb', 'SDCard', 'Utilities', 'Diags', 'BiosSetup', 'Pxe', 'UefiShell', 'UefiHttp', 'UefiTarget'], 'UefiTargetBootSourceOverride': 'None', 'UefiTargetBootSourceOverride@Redfish.AllowableValues': ['HD(1,GPT,0940C33C-EAF1-43CD-8C8F-4426672227FE,0x800,0x4E000)/\\EFI\\sles\\shim.efi', 'HD(1,GPT,22F62F69-47E7-4334-BCE6-A0B321810BA1,0x800,0x64000)/\\EFI\\redhat\\shimx64.efi', 'PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv4(0.0.0.0)/Uri()', 'PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv4(0.0.0.0)', 'PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv6(0000:0000:0000:0000:0000:0000:0000:0000)/Uri()', 'PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B32CB4A8,0x0)/IPv6(0000:0000:0000:0000:0000:0000:0000:0000)', 'PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x0)', 'PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x1)', 'PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x2)', 'PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x3)', 'PciRoot(0x0)/Pci(0x14,0x0)/USB(0xD,0x0)/USB(0x1,0x0)', 'PciRoot(0x0)/Pci(0x14,0x0)/USB(0xD,0x0)/USB(0x1,0x1)']}, 'EthernetInterfaces': {'@odata.id': '/redfish/v1/Systems/1/EthernetInterfaces/'}, 'HostName': 'localhost.americas.hpqcorp.net', 'IndicatorLED': 'Off', 'Links': {'ManagedBy': [{'@odata.id': '/redfish/v1/Managers/1/'}], 'Chassis': [{'@odata.id': '/redfish/v1/Chassis/1/'}]}, 'LogServices': {'@odata.id': '/redfish/v1/Systems/1/LogServices/'}, 'Manufacturer': 'HPE', 'Memory': {'@odata.id': '/redfish/v1/Systems/1/Memory/'}, 'MemoryDomains': {'@odata.id': '/redfish/v1/Systems/1/MemoryDomains/'}, 'MemorySummary': {'Status': {'HealthRollup': 'OK'}, 'TotalSystemMemoryGiB': 32, 'TotalSystemPersistentMemoryGiB': 0}, 'Model': 'ProLiant DL360 Gen10', 'Name': 'Computer System', 'NetworkInterfaces': {'@odata.id': '/redfish/v1/Systems/1/NetworkInterfaces/'}, 'Oem': {'Hpe': {'@odata.context': '/redfish/v1/$metadata#HpeComputerSystemExt.HpeComputerSystemExt', '@odata.type': '#HpeComputerSystemExt.v2_9_0.HpeComputerSystemExt', 'Actions': {'#HpeComputerSystemExt.PowerButton': {'PushType@Redfish.AllowableValues': ['Press', 'PressAndHold'], 'target': '/redfish/v1/Systems/1/Actions/Oem/Hpe/HpeComputerSystemExt.PowerButton/'}, '#HpeComputerSystemExt.SecureSystemErase': {'target': '/redfish/v1/Systems/1/Actions/Oem/Hpe/HpeComputerSystemExt.SecureSystemErase/'}, '#HpeComputerSystemExt.SystemReset': {'ResetType@Redfish.AllowableValues': ['ColdBoot', 'AuxCycle'], 'target': '/redfish/v1/Systems/1/Actions/Oem/Hpe/HpeComputerSystemExt.SystemReset/'}}, 'AggregateHealthStatus': {'AgentlessManagementService': 'Unavailable', 'BiosOrHardwareHealth': {'Status': {'Health': 'OK'}}, 'FanRedundancy': 'Redundant', 'Fans': {'Status': {'Health': 'OK'}}, 'Memory': {'Status': {'Health': 'OK'}}, 'Network': {'Status': {'Health': 'OK'}}, 'PowerSupplies': {'PowerSuppliesMismatch': False, 'Status': {'Health': 'OK'}}, 'Processors': {'Status': {'Health': 'OK'}}, 'Storage': {'Status': {'Health': 'Warning'}}, 'Temperatures': {'Status': {'Health': 'OK'}}}, 'Bios': {'Backup': {'Date': '11/13/2019', 'Family': 'U32', 'VersionString': 'U32 v2.22 (11/13/2019)'}, 'Current': {'Date': '11/13/2019', 'Family': 'U32', 'VersionString': 'U32 v2.22 (11/13/2019)'}, 'UefiClass': 2}, 'CriticalTempRemainOff': False, 'CurrentPowerOnTimeSeconds': None, 'DeviceDiscoveryComplete': {'AMSDeviceDiscovery': 'NoAMS', 'DeviceDiscovery': 'vMainDeviceDiscoveryComplete', 'SmartArrayDiscovery': 'Complete'}, 'ElapsedEraseTimeInMinutes': 0, 'EndOfPostDelaySeconds': None, 'EstimatedEraseTimeInMinutes': 0, 'IntelligentProvisioningAlwaysOn': True, 'IntelligentProvisioningIndex': 8, 'IntelligentProvisioningLocation': 'System Board', 'IntelligentProvisioningVersion': '3.60.12', 'IsColdBooting': False, 'Links': {'HpeIpProvider': {'@odata.id': '/redfish/v1/systems/1/hpeip/'}, 'SUT': {'@odata.id': '/redfish/v1/systems/1/hpsut/'}, 'PCIDevices': {'@odata.id': '/redfish/v1/Systems/1/PCIDevices/'}, 'PCISlots': {'@odata.id': '/redfish/v1/Systems/1/PCISlots/'}, 'NetworkAdapters': {'@odata.id': '/redfish/v1/Systems/1/BaseNetworkAdapters/'}, 'SmartStorage': {'@odata.id': '/redfish/v1/Systems/1/SmartStorage/'}, 'USBPorts': {'@odata.id': '/redfish/v1/Systems/1/USBPorts/'}, 'USBDevices': {'@odata.id': '/redfish/v1/Systems/1/USBDevices/'}, 'EthernetInterfaces': {'@odata.id': '/redfish/v1/Systems/1/EthernetInterfaces/'}, 'WorkloadPerformanceAdvisor': {'@odata.id': '/redfish/v1/Systems/1/WorkloadPerformanceAdvisor/'}, 'SecureEraseReportService': {'@odata.id': '/redfish/v1/Systems/1/SecureEraseReportService/'}}, 'PCAPartNumber': '847479-001', 'PCASerialNumber': 'PVZEK0ARHA014I', 'PostDiscoveryCompleteTimeStamp': None, 'PostDiscoveryMode': None, 'PostMode': None, 'PostState': 'FinishedPost', 'PowerAllocationLimit': 500, 'PowerAutoOn': 'Restore', 'PowerOnDelay': 'Minimum', 'PowerOnMinutes': 80090, 'PowerRegulatorMode': 'OSControl', 'PowerRegulatorModesSupported': ['OSControl', 'Dynamic', 'Max', 'Min'], 'ProcessorJitterControl': {'ConfiguredFrequencyLimitMHz': 0, 'Mode': 'Disabled'}, 'SMBIOS': {'extref': '/smbios'}, 'ServerFQDN': '', 'SmartStorageConfig': [{'@odata.id': '/redfish/v1/systems/1/smartstorageconfig/'}], 'SystemROMAndiLOEraseComponentStatus': {'BIOSSettingsEraseStatus': 'Idle', 'iLOSettingsEraseStatus': 'Idle'}, 'SystemROMAndiLOEraseStatus': 'Idle', 'UserDataEraseComponentStatus': {}, 'UserDataEraseStatus': 'Idle', 'VirtualProfile': 'Inactive'}}, 'PowerState': 'On', 'ProcessorSummary': {'Count': 1, 'Model': 'Intel(R) Xeon(R) Bronze 3106 CPU @ 1.70GHz', 'Status': {'HealthRollup': 'OK'}}, 'Processors': {'@odata.id': '/redfish/v1/Systems/1/Processors/'}, 'SKU': 'DL3000GEN10', 'SecureBoot': {'@odata.id': '/redfish/v1/Systems/1/SecureBoot/'}, 'SerialNumber': 'TX86NP0121', 'Status': {'Health': 'Warning', 'HealthRollup': 'Warning', 'State': 'Enabled'}, 'Storage': {'@odata.id': '/redfish/v1/Systems/1/Storage/'}, 'SystemType': 'Physical', 'TrustedModules': [{'Oem': {'Hpe': {'@odata.context': '/redfish/v1/$metadata#HpeTrustedModuleExt.HpeTrustedModuleExt', '@odata.type': '#HpeTrustedModuleExt.v2_0_0.HpeTrustedModuleExt'}}, 'Status': {'State': 'Absent'}}], 'UUID': '30334C44-3030-5854-3836-4E5030313231'}], 'Members@odata.count': 1} -------------------- Find iLO MAC Address -------------------- Retrieve MAC Addresses for iLO Management Network Interfaces. .. code-block:: python :linenos: def find_ilo_mac_address(_redfishobj): ethernet_data = {} resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) manager_ethernet_interfaces = managers_members_response.obj['EthernetInterfaces']\ ['@odata.id'] manager_ethernet_interfaces_response = _redfishobj.get(manager_ethernet_interfaces) manager_ethernet_interfaces_members = manager_ethernet_interfaces_response.\ obj['Members'] for _member in manager_ethernet_interfaces_members: _tmp = _redfishobj.get(_member['@odata.id']).obj ethernet_data[_member['@odata.id']] = _tmp else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#EthernetInterfaceCollection.' in instance['@odata.type'] and 'Managers' in \ instance['@odata.id']: ethernet_uri = instance['@odata.id'] ethernet_interfaces = _redfishobj.get(ethernet_uri).obj['Members'] for _ethernet_interface in ethernet_interfaces: ethernet_data[_ethernet_interface['@odata.id']] = _redfishobj.\ get(_ethernet_interface['@odata.id']).dict for iface in ethernet_data: sys.stdout.write("iLO Network Manager Interface: \'%s\'\n" % ethernet_data[iface]['Id']) sys.stdout.write("\tiLO Mac Address: \'%s\'\n" % ethernet_data[iface].get('MACAddress')) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Standard response: .. code-block:: TEXT iLO Network Manager Interface: '1' iLO Mac Address: '98:F2:B3:21:7B:48' iLO Network Manager Interface: '2' iLO Mac Address: '98:F2:B3:21:7B:49' iLO Network Manager Interface: '3' iLO Mac Address: '0A:CA:FE:F0:0D:04' ------------------------------- Get Certificate Signing Request ------------------------------- Obtain an iLO Certificate Signing Request for use with Secure Socket Layer (SSL)/Transport Layer Security (TLS) Certificate. .. note:: This process may take some time to complete on iLO (~5 minutes). .. code-block:: python :linenos: def generate_csr(_redfishobj, csr_file, csr_properties): csr_uri = None generate_csr_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) security_service_uri = managers_members_response.obj.Oem.Hpe.Links\ ['SecurityService']['@odata.id'] security_service_response = _redfishobj.get(security_service_uri) csr_uri = security_service_response.obj.Links['HttpsCert']['@odata.id'] https_cert_response = _redfishobj.get(csr_uri) generate_csr_uri = https_cert_response.obj['Actions']['#HpeHttpsCert.GenerateCSR']\ ['target'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeHttpsCert.' in instance['@odata.type']: csr_uri = instance['@odata.id'] generate_csr_uri = _redfishobj.get(csr_uri).obj['Actions']\ ['#HpeHttpsCert.GenerateCSR']['target'] break if generate_csr_uri: body = dict() body["Action"] = "HpeHttpsCert.GenerateCSR" body["City"] = csr_properties["City"] body["CommonName"] = csr_properties["CommonName"] body["Country"] = csr_properties["Country"] body["OrgName"] = csr_properties["OrgName"] body["OrgUnit"] = csr_properties["OrgUnit"] body["State"] = csr_properties["State"] resp = _redfishobj.post(generate_csr_uri, body) if resp.status in [200, 201]: sys.stdout.write("Generating CSR, this may take a few minutes\n") sys.stdout.write("Sleeping for 5 minutes...\n") time.sleep(600) csr_resp = _redfishobj.get(csr_uri).dict['CertificateSigningRequest'] with open(csr_file, 'wb') as csroutput: csroutput.write(csr_resp) sys.stdout.write("CSR Data saved to file: '%s'\n" % csr_file) else: #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended #info error message to see what went wrong if resp.status not in [200, 201]: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO "\ "Extended Message Info...\n") ------------ Get AHS Data ------------ Obtain Active Health System Data. .. note:: AHS data is saved to a file, the contents of which are encoded. The use of an AHS Viewer to decode and parse is required. Please review Active Health System Viewer Documentation for further details: https://support.hpe.com/hpesc/public/docDisplay?docId=c05384164 .. code-block:: python :linenos: def get_ahs_data(_redfishobj, logfile): active_health_system_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) active_health_system_uri = managers_members_response.obj.Oem.Hpe.Links\ ['ActiveHealthSystem']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeiLOActiveHealthSystem.' in instance['@odata.type']: active_health_system_uri = instance['@odata.id'] if active_health_system_uri: active_health_system_response = _redfishobj.get(active_health_system_uri) active_health_system_log_uri = active_health_system_response.obj.Links['AHSLocation']\ ['extref'] active_health_system_log_resp = _redfishobj.get(active_health_system_log_uri) if active_health_system_log_resp.status == 400: try: print(json.dumps(active_health_system_log_resp.obj['error']\ ['@Message.ExtendedInfo'], indent=4, sort_keys=True)) except Exception: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif active_health_system_log_resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") with open(logfile, 'wb') as ahsoutput: ahsoutput.write(active_health_system_log_resp.ori) ahsoutput.close() sys.stdout.write("AHS Data saved successfully as: \'%s\'" % logfile) ------------------- Get Base Registries ------------------- Obtain Registry Providers. Registry providers allow for the transaction of data between properties and firmware. .. code-block:: python :linenos: def get_base_registry(_redfishobj): registries_uri = _redfishobj.root.obj['Registries']['@odata.id'] if registries_uri: registries_members = _redfishobj.get(registries_uri).obj['Members'] for registry in registries_members: sys.stdout.write("Registry URI at '%s'\n" % registry['@odata.id']) -------- Get ESKM -------- Obtain HPE Enterprise Secure Key Manager Encryption Data. .. code-block:: python :linenos: def get_ESKM(_redfishobj): security_service_eskm_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) security_service_uri = managers_members_response.obj.Oem.Hpe.Links\ ['SecurityService']['@odata.id'] security_service_response = _redfishobj.get(security_service_uri) security_service_eskm_uri = security_service_response.obj.Links['ESKM']['@odata.id'] else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#HpeESKM.' in instance['@odata.type']: security_service_eskm_uri = instance['@odata.id'] break if security_service_eskm_uri: security_service_eskm_resp = _redfishobj.get(security_service_eskm_uri) print(json.dumps(security_service_eskm_resp.dict, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ .. code-block:: JSON :linenos: { "@odata.context": "/redfish/v1/$metadata#HpeESKM.HpeESKM", "@odata.etag": "W/\"87058EB1\"", "@odata.id": "/redfish/v1/Managers/1/SecurityService/ESKM/", "@odata.type": "#HpeESKM.v2_0_0.HpeESKM", "Actions": { "#HpeESKM.ClearESKMLog": { "target": "/redfish/v1/Managers/1/SecurityService/ESKM/Actions/HpeESKM.ClearESKMLog/" }, "#HpeESKM.TestESKMConnections": { "target": "/redfish/v1/Managers/1/SecurityService/ESKM/Actions/HpeESKM.TestESKMConnections/" } }, "Id": "ESKM", "KeyManagerConfig": { "AccountGroup": "", "AccountName": "ilo-98f2b3217b48", "ESKMLocalCACertificateName": "", "ImportedCertificateIssuer": "", "ImportedCertificateSubject": "" }, "KeyServerRedundancyReq": false, "PrimaryKeyServerAddress": null, "PrimaryKeyServerPort": null, "SecondaryKeyServerAddress": null, "SecondaryKeyServerPort": null } ---------- Get iLO IP ---------- Obtain iLO Network Management Interface(s) IP Address(s). .. code-block:: python :linenos: def get_ilo_ip(_redfishobj): ethernet_data = {} resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) manager_ethernet_interfaces = managers_members_response.obj['EthernetInterfaces']\ ['@odata.id'] manager_ethernet_interfaces_response = _redfishobj.get(manager_ethernet_interfaces) manager_ethernet_interfaces_members = manager_ethernet_interfaces_response.\ obj['Members'] for _member in manager_ethernet_interfaces_members: _tmp = _redfishobj.get(_member['@odata.id']).obj ethernet_data[_member['@odata.id']] = _tmp else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#EthernetInterfaceCollection.' in instance['@odata.type'] and 'Managers' in \ instance['@odata.id']: ethernet_uri = instance['@odata.id'] ethernet_interfaces = _redfishobj.get(ethernet_uri).obj['Members'] for _ethernet_interface in ethernet_interfaces: ethernet_data[_ethernet_interface['@odata.id']] = _redfishobj.\ get(_ethernet_interface['@odata.id']).dict break if ethernet_data: for ethernet_interface in ethernet_data: sys.stdout.write("\n\nShowing iLO IPv4 Address Info on: %s\n\n" % ethernet_interface) print(json.dumps(ethernet_data[ethernet_interface]['IPv4Addresses'],\ indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Response data for each available network management interface is parsed for the Redfish IPv4 Data including: IP Address, Address Origin (Static/DHCP), Network Gateway, and Network Subnet Mask .. code-block: TEXT Showing iLO IPv4 Address Info on: /redfish/v1/Managers/1/EthernetInterfaces/1/ [ { "Address": "10.0.0.100", "AddressOrigin": "DHCP", "Gateway": "10.0.0.1", "SubnetMask": "255.255.255.0" } ] Showing iLO IPv4 Address Info on: /redfish/v1/Managers/1/EthernetInterfaces/3/ [] Showing iLO IPv4 Address Info on: /redfish/v1/Managers/1/EthernetInterfaces/2/ [ { "Address": "0.0.0.0", "AddressOrigin": "DHCP", "Gateway": "0.0.0.0", "SubnetMask": "255.255.255.255" } ] ----------- Get iLO NIC ----------- Obtain iLO Network Management Interface(s) Interface Enabled states. Modify lines 34-37 to display relevant desired data or all key-value pairs. .. code-block:: python :linenos: def get_ilo_nic(_redfishobj, get_enabled): ethernet_data = {} resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) manager_ethernet_interfaces = managers_members_response.obj['EthernetInterfaces']\ ['@odata.id'] manager_ethernet_interfaces_response = _redfishobj.get(manager_ethernet_interfaces) manager_ethernet_interfaces_members = manager_ethernet_interfaces_response.\ obj['Members'] for _member in manager_ethernet_interfaces_members: _tmp = _redfishobj.get(_member['@odata.id']).obj ethernet_data[_member['@odata.id']] = _tmp else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#EthernetInterfaceCollection.' in instance['@odata.type'] and 'Managers' in \ instance['@odata.id']: ethernet_uri = instance['@odata.id'] ethernet_interfaces = _redfishobj.get(ethernet_uri).obj['Members'] for _ethernet_interface in ethernet_interfaces: ethernet_data[_ethernet_interface['@odata.id']] = _redfishobj.\ get(_ethernet_interface['@odata.id']).dict break if ethernet_data: for ethernet_interface in ethernet_data: sys.stdout.write("\n\nShowing iLO IPv4 Address Info on: %s\n\n" % ethernet_interface) sys.stdout.write("\n\'Interface_Enabled\': \'%s\'\n" % json.dumps(ethernet_data\ [ethernet_interface][get_enabled], indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Response data for each available network management interface is parsed for the Redfish IPv4 Data including: IP Address, Address Origin (Static/DHCP), Network Gateway, and Network Subnet Mask .. code-block: TEXT Showing iLO IPv4 Address Info on: /redfish/v1/Managers/1/EthernetInterfaces/1/ 'Interface_Enabled': 'true' Showing iLO IPv4 Address Info on: /redfish/v1/Managers/1/EthernetInterfaces/2/ 'Interface_Enabled': 'false' Showing iLO IPv4 Address Info on: /redfish/v1/Managers/1/EthernetInterfaces/3/ 'Interface_Enabled': 'false' --------------- Get License Key --------------- Obtain iLO Licensing Key Information. .. code-block:: python :linenos: def get_license_key(_redfishobj): license_uri = None license_data = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) hp_hpe = next(iter(managers_members_response.obj.Oem)) license_collection_uri = managers_members_response.obj.Oem[hp_hpe].Links['LicenseService']\ ['@odata.id'] license_collection_response = _redfishobj.get(license_collection_uri) license_collection_members_uri = next(iter(license_collection_response.obj\ ['Members']))['@odata.id'] license_data = _redfishobj.get(license_collection_members_uri).dict license_uri = _redfishobj.get(license_collection_members_uri).dict['@odata.id'] else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#HpeiLOLicense.' in instance['@odata.type']: license_uri = instance['@odata.id'] license_data = _redfishobj.get(license_uri).dict break if license_data: try: sys.stdout.write("\n\'License Info\': \'%s\'\n" % \ json.dumps(license_data['ConfirmationRequest']['EON'], indent=4, sort_keys=True)) except KeyError: sys.stdout.write("\n\'License Info\': \'%s\'\n" % \ json.dumps(license_data['LicenseKey'], indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Response Data will include the License Type, License Key (iLO 5) and State. .. code-block: JSON "License Info": { "License": "iLO Advanced limited-distribution test", "LicenseKey": "333K2-CBV3G-P59QR-YXDTG-JKPM2", "Quantity": 1, "State": "nfr" } ------------------ Get Logical Drives ------------------ List all logical drives associated with a smart array controller. .. code-block:: python :linenos: def get_SmartArray_LogicalDrives(_redfishobj): smartstorage_response = [] smartarraycontrollers = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) smart_storage_uri = systems_members_response.obj.Oem.Hpe.Links\ ['SmartStorage']['@odata.id'] smart_storage_arraycontrollers_uri = _redfishobj.get(smart_storage_uri).obj.Links\ ['ArrayControllers']['@odata.id'] smartstorage_response = _redfishobj.get(smart_storage_arraycontrollers_uri).obj['Members'] else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#HpeSmartStorageArrayController.' in instance['@odata.type']: smartstorage_uri = instance['@odata.id'] smartstorage_resp = _redfishobj.get(smartstorage_uri).obj sys.stdout.write("Logical Drive URIs for Smart Storage Array Controller " \ "'%s\' : \n" % smartstorage_resp.get('Id')) logicaldrives_uri = smartstorage_resp.Links['LogicalDrives']['@odata.id'] logicaldrives_resp = _redfishobj.get(logicaldrives_uri) if not logicaldrives_resp.dict['Members']: sys.stderr.write("\tLogical drives are not available for this controller.\n") for drives in logicaldrives_resp.dict['Members']: sys.stdout.write("\t An associated logical drive: %s\n" % drives) drive_data = _redfishobj.get(drives['@odata.id']).dict print(json.dumps(drive_data, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Logical drives listed .. code-block: TEXT :linenos: Logical Drive URIs for Smart Storage Array Controller '0' : An associated logical drive: {'@odata.id': '/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/1/'} { "@odata.context": "/redfish/v1/$metadata#HpeSmartStorageLogicalDrive.HpeSmartStorageLogicalDrive", "@odata.etag": "W/\"1E5315F5\"", "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/1/", "@odata.type": "#HpeSmartStorageLogicalDrive.v2_3_0.HpeSmartStorageLogicalDrive", "AccelerationMethod": "ControllerCache", "CapacityMiB": 286070, "Description": "HPE Smart Storage Logical Drive View", "Id": "1", "InterfaceType": "SAS", "LegacyBootPriority": "None", "Links": { "DataDrives": { "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/1/DataDrives/" } }, "LogicalDriveEncryption": false, "LogicalDriveName": "Ubuntu", "LogicalDriveNumber": 1, "LogicalDriveStatusReasons": [ "Ok" ], "LogicalDriveType": "Data", "MediaType": "HDD", "Name": "HpeSmartStorageLogicalDrive", "Raid": "0", "Status": { "Health": "OK", "State": "Enabled" }, "StripeSizeBytes": 262144, "VolumeUniqueIdentifier": "600508B1001C62CD82E5F0A829D6F166" } An associated logical drive: {'@odata.id': '/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/2/'} { "@odata.context": "/redfish/v1/$metadata#HpeSmartStorageLogicalDrive.HpeSmartStorageLogicalDrive", "@odata.etag": "W/\"5765A79C\"", "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/2/", "@odata.type": "#HpeSmartStorageLogicalDrive.v2_3_0.HpeSmartStorageLogicalDrive", "AccelerationMethod": "None", "CapacityMiB": 286070, "Description": "HPE Smart Storage Logical Drive View", "Id": "2", "InterfaceType": "SAS", "LegacyBootPriority": "None", "Links": { "DataDrives": { "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/2/DataDrives/" } }, "LogicalDriveEncryption": false, "LogicalDriveName": "RedHat", "LogicalDriveNumber": 2, "LogicalDriveStatusReasons": [ "Ok" ], "LogicalDriveType": "Data", "MediaType": "HDD", "Name": "HpeSmartStorageLogicalDrive", "Raid": "0", "Status": { "Health": "Warning", "State": "Enabled" }, "StripeSizeBytes": 262144, "VolumeUniqueIdentifier": "600508B1001C1479064E27DBA1A62E9F" } An associated logical drive: {'@odata.id': '/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/3/'} { "@odata.context": "/redfish/v1/$metadata#HpeSmartStorageLogicalDrive.HpeSmartStorageLogicalDrive", "@odata.etag": "W/\"8A549D6D\"", "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/3/", "@odata.type": "#HpeSmartStorageLogicalDrive.v2_3_0.HpeSmartStorageLogicalDrive", "AccelerationMethod": "None", "CapacityMiB": 286070, "Description": "HPE Smart Storage Logical Drive View", "Id": "3", "InterfaceType": "SAS", "LegacyBootPriority": "None", "Links": { "DataDrives": { "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/3/DataDrives/" } }, "LogicalDriveEncryption": false, "LogicalDriveName": "Suse", "LogicalDriveNumber": 3, "LogicalDriveStatusReasons": [ "Ok" ], "LogicalDriveType": "Data", "MediaType": "HDD", "Name": "HpeSmartStorageLogicalDrive", "Raid": "0", "Status": { "Health": "Warning", "State": "Enabled" }, "StripeSizeBytes": 262144, "VolumeUniqueIdentifier": "600508B1001C9375ABBBD2D850E73768" } An associated logical drive: {'@odata.id': '/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/4/'} { "@odata.context": "/redfish/v1/$metadata#HpeSmartStorageLogicalDrive.HpeSmartStorageLogicalDrive", "@odata.etag": "W/\"7E05B474\"", "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/4/", "@odata.type": "#HpeSmartStorageLogicalDrive.v2_3_0.HpeSmartStorageLogicalDrive", "AccelerationMethod": "None", "CapacityMiB": 286070, "Description": "HPE Smart Storage Logical Drive View", "Id": "4", "InterfaceType": "SAS", "LegacyBootPriority": "None", "Links": { "DataDrives": { "@odata.id": "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/0/LogicalDrives/4/DataDrives/" } }, "LogicalDriveEncryption": false, "LogicalDriveName": "VMWare", "LogicalDriveNumber": 4, "LogicalDriveStatusReasons": [ "Ok" ], "LogicalDriveType": "Data", "MediaType": "HDD", "Name": "HpeSmartStorageLogicalDrive", "Raid": "0", "Status": { "Health": "Warning", "State": "Enabled" }, "StripeSizeBytes": 262144, "VolumeUniqueIdentifier": "600508B1001C027715587DEA05B333DE" } ----------------- Get Power Metrics ----------------- Obtain Redfish power metrics. .. code-block:: python :linenos: def get_powermetrics_average(_redfishobj): power_metrics_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI chassis_uri = _redfishobj.root.obj['Chassis']['@odata.id'] chassis_response = _redfishobj.get(chassis_uri) chassis_members_uri = next(iter(chassis_response.obj['Members']))['@odata.id'] chassis_members_response = _redfishobj.get(chassis_members_uri) power_metrics_uri = chassis_members_response.obj.Oem.Hpe['Power']['@odata.id'] else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#Power.' in instance['@odata.type']: power_metrics_uri = instance['@odata.id'] break if power_metrics_uri: power_metrics_data = _redfishobj.get(power_metrics_uri).obj.Oem.Hpe print("\n\nPower Data:\n\n") print(json.dumps(power_metrics_data, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Power Metric Data .. code-block: JSON :linenos: { "@odata.context": "/redfish/v1/$metadata#HpePowerMetricsExt.HpePowerMetricsExt", "@odata.type": "#HpePowerMetricsExt.v2_2_0.HpePowerMetricsExt", "BrownoutRecoveryEnabled": true, "HasCpuPowerMetering": true, "HasDimmPowerMetering": true, "HasGpuPowerMetering": false, "HasPowerMetering": true, "HighEfficiencyMode": "Balanced", "Links": { "FastPowerMeter": { "@odata.id": "/redfish/v1/Chassis/1/Power/FastPowerMeter/" }, "FederatedGroupCapping": { "@odata.id": "/redfish/v1/Chassis/1/Power/FederatedGroupCapping/" }, "PowerMeter": { "@odata.id": "/redfish/v1/Chassis/1/Power/PowerMeter/" } }, "MinimumSafelyAchievableCap": null, "MinimumSafelyAchievableCapValid": false, "SNMPPowerThresholdAlert": { "DurationInMin": 0, "ThresholdWatts": 0, "Trigger": "Disabled" } } ---------------------- Get Resource Directory ---------------------- Obtain iLO Resource Directory, quick access to all '@odata.type' references and respective '@odata.id'. .. note:: This resource is only available on iLO systems. .. code-block:: python :linenos: def get_resource_directory(redfishobj): try: resource_uri = redfishobj.root.obj.Oem.Hpe.Links.ResourceDirectory['@odata.id'] except KeyError: sys.stderr.write("Resource directory is only available on HPE servers.\n") return None response = redfishobj.get(resource_uri) resources = [] if response.status == 200: sys.stdout.write("\tFound resource directory at /redfish/v1/resourcedirectory" + "\n\n") resources = response.dict["Instances"] else: sys.stderr.write("\tResource directory missing at /redfish/v1/resourcedirectory" + "\n") return resources ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Snippet of Resource directory .. code-block: TEXT :linenos: #ServiceRoot.v1_5_1.ServiceRoot /redfish/v1/ #Manager.v1_5_1.Manager /redfish/v1/Managers/1/ #ManagerCollection.ManagerCollection /redfish/v1/Managers/ #ComputerSystem.v1_10_0.ComputerSystem /redfish/v1/Systems/1/ #ComputerSystemCollection.ComputerSystemCollection /redfish/v1/Systems/ #Chassis.v1_6_0.Chassis /redfish/v1/Chassis/1/ #ChassisCollection.ChassisCollection /redfish/v1/Chassis/ .... ----------- Get Schemas ----------- Obtain schema data. .. code-block:: python :linenos: def get_schema(_redfishobj): schema_members_uris = [] schema_members_expanded = {} schema_uri = _redfishobj.root.obj['JsonSchemas']['@odata.id'] schema_response = _redfishobj.get(schema_uri) schema_members_uris = schema_response.obj['Members'] for member in schema_members_uris: data = _redfishobj.get(member['@odata.id']).dict instance_id = data['Location'].index(next(iter(data['Location']))) schema_uri = data['Location'][instance_id]['Uri'] schema = _redfishobj.get(schema_uri).dict #I am just replacing the URI link for the sub-schema with the actual schema. You will #see EVERYTHING _tmp = {schema_uri + ' ->': schema} data['Location'][instance_id]['Uri'] = _tmp schema_members_expanded[member['@odata.id']] = data print(json.dumps(schema_members_expanded, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Snippet of schema data for *HpeiLOManagerNetworkService* .. code-block: TEXT :linenos: "/redfish/v1/JsonSchemas/HpeiLOManagerNetworkService/": { "@odata.context": "/redfish/v1/$metadata#JsonSchemaFile.JsonSchemaFile", "@odata.etag": "W/\"02E6EE72\"", "@odata.id": "/redfish/v1/JsonSchemas/HpeiLOManagerNetworkService/", "@odata.type": "#JsonSchemaFile.v1_0_4.JsonSchemaFile", "Description": "Schema Definition File for HpeiLOManagerNetworkService", "Id": "HpeiLOManagerNetworkService", "Languages": [ "en" ], "Location": [ { "Language": "en", "Uri": { "/redfish/v1/SchemaStore/en/HpeiLOManagerNetworkService.json/ ->": { "$schema": "http://json-schema.org/draft-04/schema#", "@odata.id": "HpeiLOManagerNetworkService", "actions": { "actions": { "HpeiLOManagerNetworkService.SendTestAlertMail": { "additionalProperties": false, "properties": { "Action": { "description": "Sends test alert mail to configured AlertMail email address.", "enum": [ "HpeiLOManagerNetworkService.SendTestAlertMail" ], "readonly": true, "type": "string" } }, "required": [ "Action" ], "type": "object" }, "HpeiLOManagerNetworkService.SendTestSyslog": { "additionalProperties": false, "properties": { "Action": { "enum": [ "HpeiLOManagerNetworkService.SendTestSyslog" ], "type": "string" } }, "required": [ "Action" ], "type": "object" } }, "description": "These describe the POST custom actions defined for this type (although the implemented actions may be a subset of these)." }, "additionalProperties": false, "copyright": "Copyright 2014-2019 Hewlett Packard Enterprise Development, LP. Portions Copyright 2014-2019 Distributed Management Task Force. All rights reserved.", "description": "The HpeiLOManagerNetworkService object extends the Redfish ManagerNetworkProtocol resource with additional HPE functionality.", "properties": { "@odata.context": { "$ref": "Resource.json#/definitions/odatacontext" }, "@odata.etag": { "$ref": "Resource.json#/definitions/odataetag" }, "@odata.id": { "$ref": "Resource.json#/definitions/odataid" }, "@odata.type": { "$ref": "Resource.json#/definitions/odatatype" }, "Actions": { "additionalProperties": false, "properties": { "#HpeiLOManagerNetworkService.SendTestAlertMail": { "additionalProperties": false, "properties": { "target": { "description": "Link to invoke action", "type": "string" }, "title": { "description": "Friendly action name", "type": "string" } }, "type": "object" }, "#HpeiLOManagerNetworkService.SendTestSyslog": { "additionalProperties": false, "properties": { "target": { "description": "Link to invoke action", "type": "string" }, "title": { "description": "Friendly action name", "type": "string" } }, "type": "object" } }, "type": "object" }, "AlertMailEmail": { "description": "The destination email address for email alerts.", "etag": true, "readonly": false, "type": "string" }, "AlertMailEnabled": { "description": "Indicates whether AlertMail is enabled. This can be enabled only when the properties AlertMailEmail, AlertMailSenderDomain and AlertMailSMTPServer are set or not empty.", "etag": true, "readonly": false, "type": "boolean" }, "AlertMailSMTPAuthEnabled": { "description": "Indicates whether AlertMail SMTP Authentication is enabled. This can be enabled only when the properties AlertMailSMTPSecureEnabled, AlertMailSMTPAuthUser and AlertMailSMTPAuthPw are set or not empty.", "etag": true, "readonly": false, "type": "boolean" }, "AlertMailSMTPAuthPw": { "description": "The password credential for SMTP server Authentication.", "etag": true, "maxLength": 63, "readonly": false, "type": [ "string", "null" ] }, "AlertMailSMTPAuthUser": { "description": "The username credential for SMTP server Authentication.", "etag": true, "maxLength": 63, "readonly": false, "type": "string" }, "AlertMailSMTPPort": { "default": 25, "description": "The SMTP server port number.", "etag": true, "maximum": 65535, "minimum": 1, "readonly": false, "type": "integer" }, "AlertMailSMTPSecureEnabled": { "description": "Indicates whether AlertMail SMTP Secure Connection (SSL/TLS) is enabled.", "etag": true, "readonly": false, "type": "boolean" }, "AlertMailSMTPServer": { "description": "The IP address or DNS name of the SMTP server or the Mail Submission Agent (MSA).", "etag": true, "readonly": false, "type": "string" }, "AlertMailSenderDomain": { "description": "The domain name for the sender email address.", "etag": true, "maxLength": 63, "readonly": false, "type": "string" }, "ConfigurationSettings": { "description": "State of the currently displayed configuration settings.", "enum": [ "Current", "SomePendingReset" ], "etag": true, "readonly": true, "type": "string" }, "FederationEnabled": { "description": "Indicates whether management processor federation management is enabled or disabled.", "etag": true, "readonly": false, "type": "boolean" }, "FederationSupported": { "description": "Indicates whether management processor federation is supported.", "etag": true, "readonly": true, "type": "boolean" }, "Id": { "$ref": "Resource.json#/definitions/Id" }, "Links": { "additionalProperties": false, "description": "The resource URIs related to the network services managed by this manager.", "properties": { "EthernetInterfaces": { "description": "The URIs of the Ethernet NICs.", "properties": { "@odata.id": { "$ref": "Resource.json#/definitions/odataid" } }, "readonly": true, "type": "object" }, "SNMPService": { "description": "The SNMP Service resource URI.", "properties": { "@odata.id": { "$ref": "Resource.json#/definitions/odataid" } }, "readonly": true, "type": "object" } }, "type": "object" }, "RemoteSyslogEnabled": { "description": "Indicates whether Remote Syslog is enabled. When enabled, management processor sends notification messages to the specified Syslog server. This can be enabled only when the property RemoteSyslogServer is set or not empty.", "etag": true, "readonly": false, "type": "boolean" }, "RemoteSyslogPort": { "default": 514, "description": "The port number through which the Syslog servers are listening.", "etag": true, "maximum": 65535, "minimum": 1, "readonly": false, "type": "integer" }, "RemoteSyslogServer": { "description": "The IP address, FQDN, IPv6 name, or short name of the servers running the Syslog service.", "etag": true, "readonly": false, "type": "string" }, "SNMPTrapPort": { "description": "The SNMP trap port number.", "etag": true, "maximum": 65535, "minimum": 1, "readonly": false, "type": "integer" }, "SerialOverLanLogging": { "description": "Indicates whether Serial Over LAN (SOL) or Virtual Serial Port (VSP) logging is enabled.", "etag": true, "readonly": false, "type": "boolean" }, "VirtualMediaEncryptionEnabled": { "description": "Enables or disables encryption on virtual media connections.", "etag": true, "readonly": false, "type": "boolean" }, "XMLResponseEnabled": { "description": "Determines whether management processor responds to anonymous XML discovery requests.", "etag": true, "readonly": false, "type": "boolean" } }, "readonly": false, "title": "#HpeiLOManagerNetworkService.v2_2_0.HpeiLOManagerNetworkService", "type": "object" } } } ], "Name": "HpeiLOManagerNetworkService Schema Definition File", "Schema": "#HpeiLOManagerNetworkService.v2_2_0.HpeiLOManagerNetworkService" } -------------------------- Get Smart Array Encryption -------------------------- Obtain Smart Array controller encryption property data. .. code-block:: python :linenos: def get_SmartArray_EncryptionSettings(_redfishobj, desired_properties): smartstorage_response = [] smartarraycontrollers = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) smart_storage_uri = systems_members_response.obj.Oem.Hpe.Links\ ['SmartStorage']['@odata.id'] smart_storage_arraycontrollers_uri = _redfishobj.get(smart_storage_uri).obj.Links\ ['ArrayControllers']['@odata.id'] smartstorage_response = _redfishobj.get(smart_storage_arraycontrollers_uri).obj['Members'] else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#HpeSmartStorageArrayControllerCollection.' in instance['@odata.type']: smartstorage_uri = instance['@odata.id'] smartstorage_response = _redfishobj.get(smartstorage_uri).obj['Members'] break for controller in smartstorage_response: smartarraycontrollers[controller['@odata.id']] = _redfishobj.get(controller['@odata.id']).\ obj sys.stdout.write("Encryption Properties for Smart Storage Array Controller \'%s\' : \n" \ % smartarraycontrollers[controller['@odata.id']].get('Id')) for data in smartarraycontrollers[controller['@odata.id']]: if data in desired_properties: sys.stdout.write("\t %s : %s\n" % (data, smartarraycontrollers[controller\ ['@odata.id']].get(data))) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ .. code-block:: JSON :linenos: { "@odata.context": "/redfish/v1/$metadata#HpeESKM.HpeESKM", "@odata.etag": "W/\"87058EB1\"", "@odata.id": "/redfish/v1/Managers/1/SecurityService/ESKM/", "@odata.type": "#HpeESKM.v2_0_0.HpeESKM", "Actions": { "#HpeESKM.ClearESKMLog": { "target": "/redfish/v1/Managers/1/SecurityService/ESKM/Actions/HpeESKM.ClearESKMLog/" }, "#HpeESKM.TestESKMConnections": { "target": "/redfish/v1/Managers/1/SecurityService/ESKM/Actions/HpeESKM.TestESKMConnections/" } }, "Id": "ESKM", "KeyManagerConfig": { "AccountGroup": "", "AccountName": "ilo-98f2b3217b48", "ESKMLocalCACertificateName": "", "ImportedCertificateIssuer": "", "ImportedCertificateSubject": "" }, "KeyServerRedundancyReq": false, "PrimaryKeyServerAddress": null, "PrimaryKeyServerPort": null, "SecondaryKeyServerAddress": null, "SecondaryKeyServerPort": null } ---------------------- Import SSL Certificate ---------------------- Import Secure Socket Layer Certificate. .. code-block:: python :linenos: def import_ssl(_redfishobj, ssl_file_path): https_cert_uri = None body = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) security_service_uri = managers_members_response.obj.Oem.Hpe.Links['SecurityService']\ ['@odata.id'] security_service_response = _redfishobj.get(security_service_uri) https_cert_uri = security_service_response.obj.Links['HttpsCert']['@odata.id'] else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#HpeHttpsCert.' in instance['@odata.type']: https_cert_uri = instance['@odata.id'] break if https_cert_uri: https_cert_import_uri = _redfishobj.get(https_cert_uri).obj['Actions']\ ['#HpeHttpsCert.ImportCertificate']['target'] body = dict() body["Action"] = "HpeHttpsCert.ImportCertificate" body["Certificate"] = ssl_cert resp = _redfishobj.post(https_cert_import_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) print("\nImporting SSL Certificate may take a few minutes...\n "\ "iLO will reset with new changes.\n") ---------------------------------- Modify iLO Management User Account ---------------------------------- Modify a management interface user account. .. code-block:: python :linenos: def modify_ilo_user_account(_redfishobj, username_to_modify, new_loginname, new_username, \ new_password, role_id, privilege_dict): account_collection_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #resource directory is not available so we will navigate through paths manually to obtain #account info account_service_uri = _redfishobj.root.obj['AccountService']['@odata.id'] account_service_response = _redfishobj.get(account_service_uri) account_collection_uri = account_service_response.obj['Accounts']['@odata.id'] #modify role id if role_id: body = {"RoleId": role_id} else: #obtain all account instances from resource directory for instance in resource_instances: if '#ManagerAccountCollection.' in instance['@odata.type']: account_collection_uri = instance['@odata.id'] if privilege_dict: #HPE server, so modify privileges body = {"Oem": {"Hpe": {"Privileges": {}}}} for priv in privilege_dict: body["Oem"]["Hpe"]["Privileges"][priv] = privilege_dict[priv] if new_loginname: #modify login name body["Oem"]["Hpe"]["LoginName"] = new_loginname if new_username: body["UserName"] = new_username if new_password: body["Password"] = new_password #find the account to modify account_uri_to_modify = None account_uris = REDFISHOBJ.get(account_collection_uri) for account_uri in account_uris.dict['Members']: account = REDFISHOBJ.get(account_uri['@odata.id']) if account.dict['UserName'] == username_to_modify: account_uri_to_modify = account_uri['@odata.id'] break if not account_uri_to_modify: sys.stderr.write("Cannot find account to modify") return #modify the account resp = REDFISHOBJ.patch(account_uri_to_modify, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended Message "\ "Info...") elif resp.status != 200: sys.stderr.write("An http response of '%s' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ An example Redfish response error message. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "Base.1.4.AccountModified" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } -------------------- Modify Virtual Media -------------------- Modify a virtual media entry. .. code-block:: python :linenos: def mount_virtual_media_iso(_redfishobj, iso_url, media_type, boot_on_next_server_reset): virtual_media_uri = None virtual_media_response = [] resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) virtual_media_uri = managers_members_response.obj['VirtualMedia']['@odata.id'] else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#VirtualMediaCollection.' in instance['@odata.type']: virtual_media_uri = instance['@odata.id'] if virtual_media_uri: virtual_media_response = _redfishobj.get(virtual_media_uri) for virtual_media_slot in virtual_media_response.obj['Members']: data = _redfishobj.get(virtual_media_slot['@odata.id']) if media_type in data.dict['MediaTypes']: virtual_media_mount_uri = data.obj['Actions']['#VirtualMedia.InsertMedia']['target'] post_body = {"Image": iso_url} if iso_url: resp = _redfishobj.post(virtual_media_mount_uri, post_body) if boot_on_next_server_reset is not None: patch_body = {} patch_body["Oem"] = {"Hpe": {"BootOnNextServerReset": \ boot_on_next_server_reset}} boot_resp = _redfishobj.patch(data.obj['@odata.id'], patch_body) if not boot_resp.status == 200: sys.stderr.write("Failure setting BootOnNextServerReset") if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO" "Extended Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) break ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ An example Redfish response error message following a successful modification of a user account. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "Base.1.4.Success" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ------------- Reboot Server ------------- Reboot a server. .. code-block:: python :linenos: def reboot_server(_redfishobj): systems_members_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#ComputerSystem.' in instance['@odata.type']: systems_members_uri = instance['@odata.id'] systems_members_response = _redfishobj.get(systems_uri) if systems_members_response: system_reboot_uri = systems_members_response.obj['Actions']['#ComputerSystem.Reset']\ ['target'] body = dict() body['Action'] = 'ComputerSystem.Reset' body['ResetType'] = "ForceRestart" resp = _redfishobj.post(system_reboot_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended " "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ An example Redfish response error message following a successful application of virtual media. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "Base.1.4.Success" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ------------------------------------- Remove an iLO User Management Account ------------------------------------- Delete an iLO User Management Account .. code-block:: python :linenos: def reboot_server(_redfishobj): systems_members_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#ComputerSystem.' in instance['@odata.type']: systems_members_uri = instance['@odata.id'] systems_members_response = _redfishobj.get(systems_uri) if systems_members_response: system_reboot_uri = systems_members_response.obj['Actions']['#ComputerSystem.Reset']\ ['target'] body = dict() body['Action'] = 'ComputerSystem.Reset' body['ResetType'] = "ForceRestart" resp = _redfishobj.post(system_reboot_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended " "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ An example Redfish response error message following a successful application of virtual media. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "Base.1.4.Success" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } -------------------- Reset ESKM Event log -------------------- Reset Enterprise Secure Key Manager event log. .. code-block:: python :linenos: def reset_ESKM_eventlog(_redfishobj): body = dict() security_service_eskm_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) security_service_uri = managers_members_response.obj.Oem.Hpe.Links\ ['SecurityService']['@odata.id'] security_service_response = _redfishobj.get(security_service_uri) security_service_eskm_uri = security_service_response.obj.Links['ESKM']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeESKM.' in instance['@odata.type']: security_service_eskm_uri = instance['@odata.id'] break if security_service_eskm_uri: security_service_eskm_uri = _redfishobj.get(security_service_uri).obj.Links\ ['ESKM']['@odata.id'] security_service_eskm_resp = _redfishobj.get(security_service_eskm_uri) security_service_eskm_clearlog_uri = security_service_eskm_resp.obj['Actions']\ ['#HpeESKM.ClearESKMLog']['target'] body["Action"] = "HpeESKM.ClearESKMLog" #We pass the URI and the dictionary as a POST command (part of the redfish object) resp = _redfishobj.post(security_service_eskm_clearlog_uri, body) #If iLO responds with something outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ An example Redfish response error message following a successful reset of ESKM log. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "Base.1.4.Success" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } --------- Reset iLO --------- Reset iLO BMC. .. code-block:: python :linenos: def reset_ilo(_redfishobj): managers_members_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#Manager.' in instance['@odata.type']: managers_members_uri = instance['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) if managers_members_response: reset_ilo_uri = managers_members_response.obj['Actions']['#Manager.Reset']['target'] body = {'Action': 'Manager.Reset'} resp = _redfishobj.post(reset_ilo_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended Message "\ "Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ An example Redfish response error message following a successful reset of iLO. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "iLO.2.14.ResetInProgress" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } -------- Sessions -------- Example of session management. .. code-block:: python :linenos: def sessions(_redfishobj, login_account, login_password): new_session = {"UserName": login_account, "Password": login_password} response = _redfishobj.post('/redfish/v1/Sessions', new_session) if response.status == 201: print("Success!\n") session_uri = response.getheader("location") session_uri = urllib.parse.urlparse(session_uri) sys.stdout.write("\tSession " + session_uri.path + " created.\n") x_auth_token = response.getheader("x-auth-token") sys.stdout.write("\tThis is the session X-Auth Token key " + x_auth_token + ".\n") print(json.dumps(response.dict, indent=4, sort_keys=True)) # Delete the created session sys.stdout.write("\tTerminating this session.\n") sessresp = _redfishobj.delete(session_uri.path) print(json.dumps(sessresp.dict, indent=4, sort_keys=True)) else: sys.stderr.write("ERROR: failed to create a session.\n") try: print(json.dumps(sessresp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended" " Message Info...") ^^^^^^^^^^^^^^^^ Session Creation ^^^^^^^^^^^^^^^^ Session token and URI. Session tokens can be cached and used for authentication for all subsequent calls as long as the session has not been terminated by the client or timed out by the server. .. note:: This is only true in production mode. Some higher security modes may require additional authentication techniques to be performed. .. code-block:: TEXT Session X-Auth Token: 61ac3d750eeda276749cdd2138117a8f Session URI: /redfish/v1/SessionService/Sessions/admin000000005f3d4cbfdbde43a8 An example Redfish response error message following a successful creation. .. code-block:: JSON :linenos: { "@odata.context": "/redfish/v1/$metadata#Session.Session", "@odata.etag": "W/\"F1F51DF3\"", "@odata.id": "/redfish/v1/SessionService/Sessions/admin000000005f3d4cbfdbde43a8", "@odata.type": "#Session.v1_0_0.Session", "Description": "Manager User Session", "Id": "admin000000005f3d4cbfdbde43a8", "Name": "User Session", "Oem": { "Hpe": { "@odata.context": "/redfish/v1/$metadata#HpeiLOSession.HpeiLOSession", "@odata.type": "#HpeiLOSession.v2_1_0.HpeiLOSession", "AccessTime": "2020-08-19T16:01:03Z", "LoginTime": "2020-08-19T16:01:03Z", "MySession": false, "UserExpires": "2020-08-19T16:31:03Z", "UserIP": "16.214.34.25", "UserTag": "REST", "UserType": "Local" } }, "UserName": "admin" } ^^^^^^^^^^^^^^^^ Session Creation ^^^^^^^^^^^^^^^^ Terminating a session from the client side simply requires deletion of the session URI. Attempting to re-access the session results in the following response message. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "Base.1.4.NoValidSession" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ----------------------- iLO Management NIC Data ----------------------- Example of ethernet management NIC enablement/disablement. On iLO systems: * *Ethernet Management Interface 1* is typically the physical NIC port * *Ethernet Management Interface 2* is typically the shared NIC interface. ** Shared physical System/iLO NIC. ** iLO USB port (requires the use of a USB to NIC adapter) * *Ethernet Management Interface 3* is typically the virtual NIC interface. This is generally PnP with a supported Kernel/kernel virtual usb drivers. .. code-block:: python :linenos: def set_active_ilo_nic(_redfishobj): ethernet_data = {} resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) manager_ethernet_interfaces = managers_members_response.obj['EthernetInterfaces']\ ['@odata.id'] manager_ethernet_interfaces_response = _redfishobj.get(manager_ethernet_interfaces) manager_ethernet_interfaces_members = manager_ethernet_interfaces_response.\ obj['Members'] for _member in manager_ethernet_interfaces_members: _tmp = _redfishobj.get(_member['@odata.id']).obj ethernet_data[_member['@odata.id']] = _tmp else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#EthernetInterfaceCollection.' in instance['@odata.type'] and 'Managers' in \ instance['@odata.id']: ethernet_uri = instance['@odata.id'] ethernet_interfaces = _redfishobj.get(ethernet_uri).obj['Members'] for _ethernet_interface in ethernet_interfaces: ethernet_data[_ethernet_interface['@odata.id']] = _redfishobj.\ get(_ethernet_interface['@odata.id']).dict break if ethernet_data: print("\n\nShowing all available ethernet management interfaces before changes:\n\n") for interface in ethernet_data: sys.stdout.write("Ethernet Management Inteface \'%s\'\n" % ethernet_data\ [interface].get('Id')) sys.stdout.write("\t\'Interface Enabled\': %s\n" % ethernet_data[interface].\ get('InterfaceEnabled')) for ethernet in ethernet_data: sys.stdout.write("Ethernet Interface: %s\n" % ethernet) ans = input("Would you like to enable/disable this interface? (enable/disable)\n") if "en" in ans: body = {"InterfaceEnabled": True} else: body = {"InterfaceEnabled": False} resp = _redfishobj.patch(ethernet, body) if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success! You will need to reset iLO for this change to take effect.\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ---------- BIOS iSCSI ---------- Configure iSCSI (Internet Small Computer Systems Interface) for ip based network attached storage. .. code-block:: python :linenos: def set_bios_iscsi(_redfishobj, iscsi_properties): iscsi_uri = None iscsi_data = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) bios_uri = systems_members_response.obj['Bios']['@odata.id'] bios_response = _redfishobj.get(bios_uri) iscsi_uri = bios_response.obj.Oem.Hpe.Links['iScsi']['@odata.id'] iscsi_data = _redfishobj.get(iscsi_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeiSCSISoftwareInitiator.' in instance['@odata.type']: iscsi_uri = instance['@odata.id'] iscsi_data = _redfishobj.get(iscsi_uri) if iscsi_data: for indx, inst in enumerate(iscsi_data.obj['iSCSISources']): if iscsi_properties['iSCSIBootInstance'] == indx: iscsi_data.dict['iSCSISources'][indx].update(iscsi_properties) resp = _redfishobj.patch(iscsi_uri, {'iSCSISources' : iscsi_data.dict['iSCSISources']}) #If iLO responds with soemthing outside of 200 or 201 then lets check the #iLO extended info error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], \ indent=4, sort_keys=True)) except Exception as excp: print(json.dumps(resp.ori, indent=4, sort_keys=True)) sys.stderr.write("A response error occurred, unable to access iLO " \ "Extended Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success! A system reboot will be required to complete the change.\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) break ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Successful modification of iSCSI data. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "iLO.2.14.SystemResetRequired" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ----------------- Set BIOS Password ----------------- Set BIOS Password. .. code-block:: python :linenos: def set_bios_password(_redfishobj, new_password, bios_password): bios_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) bios_uri = systems_members_response.obj['Bios']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#Bios.' in instance['@odata.type']: bios_uri = instance['@odata.id'] break if bios_uri: bios_data = _redfishobj.get(bios_uri) bios_change_pass_uri = bios_data.obj['Actions']['#Bios.ChangePassword']['target'] body = dict() body["PasswordName"] = "Administrator" body["OldPassword"] = bios_password body["NewPassword"] = new_password resp = _redfishobj.post(bios_change_pass_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Successful modification of BIOS password. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "Base.1.4.Success" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } -------------------- Set ESKM Primary Key -------------------- Set HPE Enterprise Secure Key Manager Key Manager Config. .. note:: A valid ESKM key manager config is required and is tested upon patch submission. An error initializing ESKM may occur if the ESKM key manager or associated required properties are invalid. See '@Message.ExtendedInfo' in the http response message. .. code-block:: JSON { "error": { "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information.", "@Message.ExtendedInfo": [{ "MessageId": "iLO.2.14.ErrorIntializingESKM" }] } } .. code-block:: python :linenos: def set_ESKM_PrimaryKeyServer(_redfishobj, primary_key_server_address, primary_key_server_port): eskm_uri = None body = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) security_service_uri = managers_members_response.obj.Oem.Hpe.Links['SecurityService']\ ['@odata.id'] security_service_response = _redfishobj.get(security_service_uri) eskm_uri = security_service_response.obj.Links['ESKM']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeESKM.' in instance['@odata.type']: eskm_uri = instance['@odata.id'] break if eskm_uri: body["PrimaryKeyServerAddress"] = primary_key_server_address body["PrimaryKeyServerPort"] = int(primary_key_server_port) resp = _redfishobj.post(eskm_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ------------------------------------ Configure Ethernet Management NIC(s) ------------------------------------ Configure Ethernet Management NIC(s) for DHCP/Static Network Addressing. .. code-block:: python :linenos: def set_ilo_static_ipv4(_redfishobj, ipv4_dict, dns_dict): ethernet_data = {} body = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) manager_ethernet_interfaces = managers_members_response.obj['EthernetInterfaces']\ ['@odata.id'] manager_ethernet_interfaces_response = _redfishobj.get(manager_ethernet_interfaces) manager_ethernet_interfaces_members = manager_ethernet_interfaces_response.\ obj['Members'] for _member in manager_ethernet_interfaces_members: _tmp = _redfishobj.get(_member['@odata.id']).obj ethernet_data[_member['@odata.id']] = _tmp else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#EthernetInterfaceCollection.' in instance['@odata.type'] and 'Managers' in \ instance['@odata.id']: ethernet_uri = instance['@odata.id'] ethernet_interfaces = _redfishobj.get(ethernet_uri).obj['Members'] for _ethernet_interface in ethernet_interfaces: ethernet_data[_ethernet_interface['@odata.id']] = _redfishobj.\ get(_ethernet_interface['@odata.id']).dict break if ethernet_data: print("\n\nShowing all available ethernet management interfaces before changes:\n\n") for interface in ethernet_data: sys.stdout.write("Ethernet Management Inteface \'%s\'\n" % ethernet_data\ [interface].get('Id')) sys.stdout.write("\'DHCPv4\':\n") if ethernet_data[interface].get('DHCPv4'): print(json.dumps(ethernet_data[interface].get('DHCPv4'), indent=4, sort_keys=True)) else: print(json.dumps(ethernet_data[interface]['Oem']['Hpe'].get('DHCPv4'), indent=4, \ sort_keys=True)) sys.stdout.write("\'IPv4\':\n") if ethernet_data[interface].get('IPv4StaticAddresses'): print(json.dumps(ethernet_data[interface].get('IPv4Addresses'), indent=4, \ sort_keys=True)) sys.stdout.write("\'StaticNameServers\':\n") if ethernet_data[interface].get('StaticNameServers'): print(json.dumps(ethernet_data[interface].get('StaticNameServers'), indent=4, \ sort_keys=True)) for ethernet in ethernet_data: sys.stdout.write("Ethernet Interface: %s\n" % ethernet) ans = input("Would you like to modify this interface? (y/n)\n") if "n" in ans: continue if 'DHCPv4' in ethernet_data[ethernet]: if ethernet_data[ethernet]['DHCPv4'].get('UseDNSServers'): resp = _redfishobj.patch(ethernet, {"DHCPv4": {"UseDNSServers": False}}) ilo_response(_redfishobj, resp) if ethernet_data[ethernet]['DHCPv4'].get('UseGateway'): resp = _redfishobj.pathc(ethernet, {"DHCPv4": {"UseGateway": False}}) ilo_response(_redfishobj, resp) if 'IPv4StaticAddresses' in ethernet_data[ethernet]: body.update({"IPv4Addresses": [ipv4_dict]}) if 'StaticNameServers' in ethernet_data[ethernet]: body.update({"StaticNameServers" : [dns_dict.get('PrimaryDNS'), \ dns_dict.get('SecondaryDNS')]}) else: body.update({"Oem": {"Hpe": {"IPv4": {"DNSServers": [dns_dict.get('PrimaryDNS'), \ dns_dict.get('SecondaryDNS')]}}}}) resp = _redfishobj.patch(ethernet, body) ilo_response(_redfishobj, resp) break --------------------------- Set iLO NTP Server Settings --------------------------- Configure NTP Server Settings. .. note:: The physical or shared ethernet networking adapter must be configured with *'StaticNTPServers':'True'*, if static network time protocol servers are to be used. DHCP must also be disabled. The following is an error message which will occur in the event DHCP is enabled while attempting to configure static NTP server entries. .. code-block:: JSON { "MessageArgs": [ "StaticNTPServers" ], "MessageId": "iLO.2.14.SNTPConfigurationManagedByDHCPAndIsReadOnly" } .. code-block:: python :linenos: def set_ilo_ntp_servers(_redfishobj, ntp_server_list): date_time_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) date_time_uri = managers_members_response.obj.Oem.Hpe.Links['DateTimeService']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeiLODateTime.' in instance['@odata.type']: date_time_uri = instance['@odata.id'] if date_time_uri: data = _redfishobj.get(date_time_uri) if data.dict.get('StaticNTPServers'): resp = _redfishobj.patch(date_time_uri, {'StaticNTPServers': ntp_server_list}) else: raise Exception("\'StaticNTPServers\' property is not available/modifyable.\n") #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended " \ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ntp_data = _redfishobj.get(date_time_uri).dict.get('StaticNTPServers') print("Printing updated NTP Servers:\n") print(json.dumps(ntp_data, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Successful modification of StaticNTPServers. (Only displaying response from *iLODateTime*) .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "iLO.2.14.SystemResetRequired" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ------------ Set Timezone ------------ Configure Network Time Protocol Time zone. .. note:: DHCP must be disabled. The following is an error message which will occur in the event DHCP is enabled while attempting to modify the NTP timezone. .. code-block:: JSON { "MessageArgs": [ "StaticNTPServers" ], "MessageId": "iLO.2.14.SNTPConfigurationManagedByDHCPAndIsReadOnly" } .. code-block:: python :linenos: def set_timezone(_redfishobj, timezone): date_time_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) date_time_uri = managers_members_response.obj.Oem.Hpe.Links['DateTimeService']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeiLODateTime.' in instance['@odata.type']: date_time_uri = instance['@odata.id'] if date_time_uri: data = _redfishobj.get(date_time_uri) if data.dict.get('TimeZone'): _data = {'TimeZone': {"Name": timezone}} resp = _redfishobj.patch(date_time_uri, _data) else: raise Exception("\'TimeZone\' property is not available/modifyable.\n") #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) print(json.dumps(data.obj.get('TimeZoneList'), indent=4, sort_keys=True)) sys.stderr.write("Check the TimeZone value...\n") except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended " \ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ntp_data = _redfishobj.get(date_time_uri).dict.get('TimeZone') print("Printing updated NTP Servers:\n") print(json.dumps(ntp_data, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Successful modification of iLO timezone. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "Base.1.4.Success" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ------------------------- Configure iLO License Key ------------------------- Configure iLO License Key. .. code-block:: python :linenos: def set_license_key(_redfishobj, ilo_key): ilo_lic_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) ilo_lic_uri = managers_members_response.obj.Oem.Hpe.Links['LicenseService']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeiLOLicense.' in instance['@odata.type']: ilo_lic_uri = instance['@odata.id'] if ilo_lic_uri: ilo_license_collection = _redfishobj.get(ilo_lic_uri) ilo_license_member_uri = next(iter(ilo_license_collection.obj['Members']))['@odata.id'] try: ilo_license_data = _redfishobj.get(ilo_license_member_uri).obj['ConfirmationRequest']\ ['EON'] except KeyError: sys.stdout.write("This machine will not show the full License Key.\n") ilo_license_data = _redfishobj.get(ilo_license_member_uri).obj['LicenseKey'] sys.stdout.write("Current iLO License Data:\n") print(json.dumps(ilo_license_data, indent=4, sort_keys=True)) resp = _redfishobj.post(ilo_lic_uri, {'LicenseKey' : ilo_key}) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) sys.stderr.write("Check the validity of your license key...\n") except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO " \ "Extended Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^^^^^^^ Response Example Valid ^^^^^^^^^^^^^^^^^^^^^^ Successful addition/modification of iLO license key. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "Base.1.4.Success" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ^^^^^^^^^^^^^^^^^^^^^^^^ Response Example Invalid ^^^^^^^^^^^^^^^^^^^^^^^^ An invalid iLO license key. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "iLO.2.14.InvalidLicenseKey" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ---------------- Server Asset Tag ---------------- Configure Redfish asset tag. .. code-block:: python :linenos: def set_server_asset_tag(_redfishobj, tag): systems_members_uri = None systems_members_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#ComputerSystem.' in instance['@odata.type']: systems_members_uri = instance['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) if systems_members_response and systems_members_uri and tag: print("Current Asset Tag: \'%s\'\n" % systems_members_response.dict.get("AssetTag")) resp = _redfishobj.patch(systems_members_uri, {"AssetTag" : tag}) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) time.sleep(10) #going to wait 10 seconds before obtaining the LED indicator state sys.stdout.write("\nUpdated Asset Tag: \'%s\'\n" % _redfishobj.\ get(systems_members_uri).dict.get("AssetTag")) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Successful addition/modification of Redfish asset tag. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "Base.1.4.Success" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ---------------- Server UID Light ---------------- Configure System Unit Identification Light as either 'Lit' or 'Off'. .. code-block:: python :linenos: def set_uid_light(_redfishobj): body = dict() systems_members_uri = None systems_members_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#ComputerSystem.' in instance['@odata.type']: systems_members_uri = instance['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) if systems_members_response and systems_members_uri: print("Current Indicator LED Status: \'%s\'\n" % systems_members_response.dict.\ get("IndicatorLED")) if "Off" in systems_members_response.dict.get("IndicatorLED"): print("Will illuminate indicator LED.\n") body["IndicatorLED"] = "Lit" else: print("Will extinguish indicator LED.\n") body["IndicatorLED"] = "Off" resp = _redfishobj.patch(systems_members_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) time.sleep(10) #going to wait 10 seconds before obtaining the LED indicator state sys.stdout.write("\nUpdated Indicator LED Status: \'%s\'\n" % _redfishobj.\ get(systems_members_uri).dict['IndicatorLED']) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Successful addition/modification of UID light. .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "Base.1.4.Success" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ------------------------- Server Firmware Inventory ------------------------- List all iLO onboard device firmware. .. code-block:: python :linenos: def get_inventory_uri(_redfishobj, select): update_service_uri = None inventory_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI update_service_uri = _redfishobj.root.obj['UpdateService']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#UpdateService.' in instance['@odata.type']: update_service_uri = instance['@odata.id'] if update_service_uri: update_service_resp = _redfishobj.get(update_service_uri) if "software" in select.lower(): inventory_uri = update_service_resp.obj['SoftwareInventory']['@odata.id'] elif "firmware" in select.lower(): inventory_uri = update_service_resp.obj['FirmwareInventory']['@odata.id'] else: raise Exception("Invalid selection provided: Please select 'software' or 'firmware' " \ "to obtain the relevant invetory data.") sys.stdout.write("Printing data in invetory: %s\n" % inventory_uri) get_inventory(_redfishobj, inventory_uri) ^^^^^^^^^^^^^^^^ Response Example ^^^^^^^^^^^^^^^^ Snippet of Firmware Inventory Response. .. code-block:: JSON :linenos: [ { "@odata.context": "/redfish/v1/$metadata#SoftwareInventory.SoftwareInventory", "@odata.etag": "W/\"0539D502\"", "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/15/", "@odata.type": "#SoftwareInventory.v1_0_0.SoftwareInventory", "Description": "102b0538159000e4", "Id": "15", "Name": "Embedded Video Controller", "Oem": { "Hpe": { "@odata.context": "/redfish/v1/$metadata#HpeiLOSoftwareInventory.HpeiLOSoftwareInventory", "@odata.type": "#HpeiLOSoftwareInventory.v2_0_0.HpeiLOSoftwareInventory", "DeviceClass": null, "DeviceContext": "Embedded Device", "DeviceInstance": "PciRoot(0x0)/Pci(0x1C,0x4)/Pci(0x0,0x1)", "Targets": [ "a6b1a447-382a-5a4f-102b-0538159000e4" ] } }, "Version": "2.5" }, { "@odata.context": "/redfish/v1/$metadata#SoftwareInventory.SoftwareInventory", "@odata.etag": "W/\"0539D502\"", "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/13/", "@odata.type": "#SoftwareInventory.v1_0_0.SoftwareInventory", "Description": "14e41657103c22be", "Id": "13", "Name": "HPE Ethernet 1Gb 4-port 331i Adapter - NIC", "Oem": { "Hpe": { "@odata.context": "/redfish/v1/$metadata#HpeiLOSoftwareInventory.HpeiLOSoftwareInventory", "@odata.type": "#HpeiLOSoftwareInventory.v2_0_0.HpeiLOSoftwareInventory", "DeviceClass": null, "DeviceContext": "Embedded LOM", "DeviceInstance": "PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)", "Targets": [ "a6b1a447-382a-5a4f-14e4-1657103c22be" ] } }, "Version": "20.6.61" } ] ---------------------- Test ESKM Connectivity ---------------------- Test HPE Enterprise Secure Key Manager connectivity. .. code-block:: python :linenos: def test_ESKM_connection(_redfishobj): eskm_uri = None body = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) security_service_uri = managers_members_response.obj.Oem.Hpe.Links['SecurityService']\ ['@odata.id'] security_service_response = _redfishobj.get(security_service_uri) eskm_uri = security_service_response.obj.Links['ESKM']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeESKM.' in instance['@odata.type']: eskm_uri = instance['@odata.id'] break if eskm_uri: eskm_test_conn_uri = _redfishobj.get(eskm_uri).obj['Actions']\ ['#HpeESKM.TestESKMConnections']['target'] body["Action"] = "HpeESKM.TestESKMConnections" resp = _redfishobj.post(eskm_test_conn_uri, body) #If iLO responds with something outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Response Example Not Configured ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Response of a failed test ESKM connection action. (ESKM not properly configured) .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "iLO.2.14.ESKMServersNotConfigured" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ---------------------- Test ESKM Connectivity ---------------------- Test HPE Enterprise Secure Key Manager connectivity. .. code-block:: python :linenos: def test_ESKM_connection(_redfishobj): eskm_uri = None body = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) security_service_uri = managers_members_response.obj.Oem.Hpe.Links['SecurityService']\ ['@odata.id'] security_service_response = _redfishobj.get(security_service_uri) eskm_uri = security_service_response.obj.Links['ESKM']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeESKM.' in instance['@odata.type']: eskm_uri = instance['@odata.id'] break if eskm_uri: eskm_test_conn_uri = _redfishobj.get(eskm_uri).obj['Actions']\ ['#HpeESKM.TestESKMConnections']['target'] body["Action"] = "HpeESKM.TestESKMConnections" resp = _redfishobj.post(eskm_test_conn_uri, body) #If iLO responds with something outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Response Example Not Configured ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Response of a failed test ESKM connection action. (ESKM not properly configured) .. code-block:: JSON :linenos: { "error": { "@Message.ExtendedInfo": [ { "MessageId": "iLO.2.14.ESKMServersNotConfigured" } ], "code": "iLO.0.10.ExtendedInfo", "message": "See @Message.ExtendedInfo for more information." } } ------------------- Update iLO Firmware ------------------- Process for a client to invoke a simple update of iLO firmware. Firmware is intended to be hosted and gathered by iLO by pointing to a URL for iLO to consume. A valid URL will result in an http 202 response code; however, this only indicates iLO will separately handle both downloading and processing the firmware update. The client will need to separately poll for status information regarding the update progress. .. code-block:: python :linenos: def update_ilo_firmware(_redfishobj, fw_url, tpm_flag): body = dict() update_service_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI update_service_uri = _redfishobj.root.obj['UpdateService']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#UpdateService.' in instance['@odata.type']: update_service_uri = instance['@odata.id'] break if update_service_uri and fw_url: update_uri = _redfishobj.get(update_service_uri).obj['Actions']\ ['#UpdateService.SimpleUpdate']['target'] body["ImageURI"] = fw_url if tpm_flag: body["TPMOverrideFlag"] = tpm_flag resp = _redfishobj.post(update_uri, body) if resp.status == 400: try: print(json.dumps(resp.obj['error']\ ['@Message.ExtendedInfo'], indent=4, sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, sort_keys=True)) --------------------------------- Upload firmware to iLO Repository --------------------------------- Upload firmware to iLO's Absaroka flash based repository. Firmware can be stored and catalogued, to be used at a later date or in the need to recover the platform from a failure condition. An http response code of 200 will be supplied upon completion of a successful upload; no other extended message information is provided. .. code-block:: python :linenos: def upload_firmware(_redfishobj, firmware_loc, update_repo=True, update_target=False): resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #resource directory is not available so we will navigate through paths manually update_service_uri = _redfishobj.root.obj['UpdateService']['@odata.id'] else: #obtain all account instances from resource directory for instance in resource_instances: if '#UpdateService.' in instance['@odata.type']: update_service_uri = instance['@odata.id'] update_service_response = _redfishobj.get(update_service_uri) path = update_service_response.obj.HttpPushUri body = [] json_data = {'UpdateRepository': update_repo, 'UpdateTarget': update_target, 'ETag': 'atag', 'Section': 0} session_key = _redfishobj.session_key filename = os.path.basename(firmware_loc) with open(firmware_loc, 'rb') as fle: output = fle.read() session_tuple = ('sessionKey', session_key) parameters_tuple = ('parameters', json.dumps(json_data)) file_tuple = ('file', (filename, output, 'application/octet-stream')) #Build the payload from each multipart-form data tuple body.append(session_tuple) body.append(parameters_tuple) body.append(file_tuple) #Create our header dictionary header = {'Cookie': 'sessionKey=' + session_key} #We pass the whole list payload to post resp = _redfishobj.post(path, body, headers=header) if resp.status == 400: sys.stderr.write("Failed to upload firmware...") elif not resp.status in [200, 201]: sys.stderr.write("An http response of '%s' was returned.\n" % resp.status) else: print("Upload complete!\n") python-ilorest-4.8.0.0/docs/Installation-Guide.rest0000644000175000017500000000341114556457137022104 0ustar carstencarsten.. image:: /images/hpe_logo2.png :width: 150pt | ================== Installation Guide ================== The python-ilorest-library supports **Python 2** (Up to 2.7.15, which is the EOL version) and **Python 3** (At present, 3.8). Pip install =========== Standard install ---------------- :: pip install python-ilorest-library With SOCKS proxy support ------------------------ Starting with **version 2.5.0** of the python-ilorest-library, you can include the SOCKS proxy add-on if you need that support. :: pip install python-ilorest-library[socks] Building from Source ==================== Checkout using SVN (Subversion) ------------------------------- Assuming that SVN is already installed in your system and it is already in the system path, run the following command from the directory where you want to copy the source. :: svn checkout https://github.hpe.com/intelligent-provisioning/python-redfish-library.git Clone using GIT --------------- Run the following command from the directory where you want to copy the source. :: git clone https://github.hpe.com/intelligent-provisioning/python-redfish-library.git Building Source --------------- After you have checked out the latest code, run the following commands: :: cd python-ilorest-library python setup.py sdist --formats=zip (this will produce a .zip file) cd dist pip install python-ilorest-library-x.x.x.zip[socks] A successful installation will display that python-ilorest-library-x.x.x and the dependencies have been successfully installed. Building From Source With SOCKS Proxy Support --------------------------------------------- :: cd python-ilorest-library python setup.py sdist --formats=zip (this will produce a .zip file) cd dist pip install python-ilorest-library-x.x.x.zip[socks] python-ilorest-4.8.0.0/docs/iLO_4_REST_API_Data_Model.md0000644000175000017500000000031014556457137022333 0ustar carstencarsten# iLO 4 REST API Data Model The data model documentation can be found
here. python-ilorest-4.8.0.0/docs/index.rst0000644000175000017500000000375114556457137017361 0ustar carstencarsten.. iLO RESTful API documentation master file, created by sphinx-quickstart on Fri Mar 11 11:34:15 2016. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. .. image:: /images/hpe_logo2.png :width: 150pt | | Python iLO Redfish Library ========================== The iLO Redfish Library is a python library built for interacting with systems that implement the **Redfish API**, which includes the HPE iLO RESTful API. The library is the platform on which the `RESTful Interface tool `_ was built on. The library can connect **remotely** to any BMC that implements a Redfish API via HTTPS or **locally** to an HPE server using the HPE CHIF interface and implements Redfish or Legacy Rest APIs. On top of this functionality, the library also offers remote and local support for the Legacy HPE iLO RESTful API that was the starting point for the DMTF Redfish standard. For more information on the HPE iLO RESTful API and Redfish see the `API overview `_. .. note:: HPE's Legacy Rest API is available starting in **iLO 4 2.00**. iLO 4 is Redfish conformant starting with **iLO 4 2.30**. In iLO 5 and above the iLO RESTful API is Redfish only. Documentation ------------- .. toctree:: :maxdepth: 1 API-Overview Installation-Guide Client-Quick-Start Advanced-Usage Monolith System-Compatibility Examples Frequently-Asked-Questions Reference Get in touch with the team -------------------------- If you have further questions, please contact the team: * `Matthew Kocurek `_ * `Tony Wang `_ * `Grant O'Connor `_ * `Matthew Whiteside `_ Contributors ------------- Contributors are listed `here `_. python-ilorest-4.8.0.0/docs/System-Compatibility.rest0000644000175000017500000000706314556457137022512 0ustar carstencarsten.. image:: /images/hpe_logo2.png :width: 150pt | .. toctree:: :maxdepth: 1 ==================== System Compatibility ==================== Compatibility can be hard to maintain if you have many different systems with different firmware versions and system generations on each of them. `Gen_compat `_ tries to help alleviate the headaches associated with this. It can automatically detect what type of system you are using and provide useful string values of key property keys, paths, types, and booleans to check what the system type is. A compatibility class is automatically created as part of an RmcApp class. .. note:: While currently gen_compat only specifically supports HPE iLO systems, the `Definevalstenplus `_ class defines are mostly Redfish standard values. Gen_compat can also easily be extended to provide strings for any system type. Creating a Compatibility Class ============================== To create a compatibility class we first need to import the relevant module and create an empty class. >>> from redfish.ris.gen_compat import Typesandpathdefines >>> COMPAT_OBJ = Typesandpathdefines() Using a Compatibility Class =========================== Now if you try to read any defines you will find the values are all empty. We need to point the compatibility class to a system in order to detect its API type, iLO version, and generation if necessary. This is done with the `getgen` function. If any other connection requirements are needed they can also be added now. >>> COMPAT_OBJ.getgen(url=iLO_host, username=login_account, password=login_password) After running the `getgen` function, if no connection errors occurred, you should be able to see information on the system as well as a list of string defines you can use in place of direct strings. That way you guarantee no matter the system you will have the correct key, type, or path value. .. note:: The following example defines are from an iLO 5 system. >>> COMPAT_OBJ.ilogen 5 >>> COMPAT_OBJ.defs.hrefstring '@odata.id' >>> COMPAT_OBJ.defs.collectionstring 'Members' >>> COMPAT_OBJ.defs.biostype 'Bios.' Here is the compatibility class in action on a RedfishClient. The following code would work the same for LegacyRest due to the use of the compatibility class instead of hard coding paths and keys. >>> REST_OBJ = RestClient(base_url=iLO_host, username=login_account, password=login_password) >>> resp = REST_OBJ.get(COMPAT_OBJ.defs.startpath) >>> resp.path '/redfish/v1/' >>> resp.obj.Chassis[COMPAT_OBJ.defs.hrefstring] u'/redfish/v1/Chassis/' Updating a Compatibility Class ============================== On some iLO 4 systems both Redfish and LegacyRest are available for use for backwards compatibility. The compatibility class will automatically assume LegacyRest in this instance. In order to use Redfish on these systems you will need to update the defines. First create a new object with the redfish flag added. >>> COMPAT_OBJ = Typesandpathdefines() >>> COMPAT_OBJ.getgen(url=iLO_host, username=login_account, password=login_password, isredfish=True) The initial isredfish flag will ensure we load redfish paths when performing the initial detection. We still need to call `updatedefinesflag` to update our defines to Redfish. >>> COMPAT_OBJ.defs.startpath '/rest/v1' >>> COMPAT_OBJ.updatedefinesflag(redfishflag=True) True >>> COMPAT_OBJ.defs.startpath '/redfish/v1/' .. note:: This will not do anything on Redfish only systems, so it is safe to use in all cases to ensure Redfish is used if that is desired.python-ilorest-4.8.0.0/setup.cfg0000644000175000017500000000024414556457137016403 0ustar carstencarsten[metadata] description-file = README.rst [bdist_rpm] requires = jsonpatch >= 1.3 jsonpath-rw >= 1.3.0 jsonpointer >= 1.1 urllib3 >= 1.23 ilorest_chif >= 2.3.0 python-ilorest-4.8.0.0/MANIFEST.in0000644000175000017500000000004514556457137016317 0ustar carstencarsteninclude README.rst include LICENSE python-ilorest-4.8.0.0/README.rst0000644000175000017500000001153614556457137016257 0ustar carstencarstenpython-ilorest-library ====================== .. image:: https://img.shields.io/pypi/v/python-ilorest-library.svg?maxAge=2592000 :target: https://pypi.python.org/pypi/python-ilorest-library .. image:: https://img.shields.io/github/release/HewlettPackard/python-ilorest-library.svg?maxAge=2592000 :target: .. image:: https://img.shields.io/badge/license-Apache%202-blue.svg :target: https://raw.githubusercontent.com/HewlettPackard/python-ilorest-library/master/LICENSE .. image:: https://img.shields.io/pypi/pyversions/python-ilorest-library.svg?maxAge=2592000 :target: https://pypi.python.org/pypi/python-ilorest-library .. contents:: :depth: 1 Description ---------- The python-ilorest-library is a python library built for interacting with the Redfish API remotely to any BMC that implements a Redfish API or any HPE system locally. The library also supports HPE's legacy REST API. Go to the library `documentation `_ for more details. HPE RESTful API for iLO is a RESTful application programming interface for the management of iLO and iLO Chassis Manager based HPE servers. REST (Representational State Transfer) is a web based software architectural style consisting of a set of constraints that focuses on a system's resources. iLO REST library performs the basic HTTP operations GET, POST, PUT, PATCH and DELETE on resources using the HATEOAS (Hypermedia as the Engine of Application State) REST architecture. The API allows the clients to manage and interact with iLO through a fixed URL and several URIs. Go to the API `documentation `_ for more details. Installing ---------- .. code-block:: console pip install python-ilorest-library Building from zip file source ~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: console python setup.py sdist --formats=zip (this will produce a .zip file) cd dist pip install python-ilorest-library-x.x.x.zip Including socks support (Version 2.5 or greater) ~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: console pip install python-ilorest-library[socks] .. code-block:: console python setup.py sdist --formats=zip (this will produce a .zip file) cd dist pip install python-ilorest-library-x.x.x.zip[socks] Requirements ------------ Remote communication ~~~~~~~~~~~~~~~~~~~~ No special requirements. Inband communication ~~~~~~~~~~~~~~~~~~~~~~~~~ To enable support for inband communications, you must download the DLL/SO for your system. By downloading, you agree to the terms and conditions of the `Hewlett Packard Enterprise Software License Agreement`_. It must be placed in your working environment path. Windows Chif Driver Download: ilorest_chif.dll_ Linux Chif Driver Download: ilorest_chif.so_ .. _`Hewlett Packard Enterprise Software License Agreement` : https://www.hpe.com/us/en/software/licensing.html .. _ilorest_chif.dll: https://github.com/HewlettPackard/python-ilorest-library/releases/tag/v3.6.0.0/ilorest_chif.dll .. _ilorest_chif.so: https://github.com/HewlettPackard/python-ilorest-library/releases/tag/v3.6.0.0/ilorest_chif.so Usage ---------- For usage documentation: https://hewlettpackard.github.io/python-ilorest-library/API-Overview.html Contributing ---------- 1. Fork it! 2. Create your feature branch: `git checkout -b my-new-feature` 3. Commit your changes: `git commit -am 'Add some feature'` 4. Push to the branch: `git push origin my-new-feature` 5. Submit a pull request :D History ------- * 04/01/2016: Initial Commit * 06/23/2016: Release of v1.1.0 * 07/25/2016: Release of v1.2.0 * 08/02/2016: Release of v1.3.0 * 09/06/2016: Release of v1.4.0 * 11/04/2016: Release of v1.5.0 * 12/06/2016: Release of v1.6.0 * 01/17/2017: Release of v1.7.0 * 02/01/2017: Release of v1.8.0 * 03/22/2017: Release of v1.9.0 * 04/12/2017: Release of v1.9.1 * 07/17/2017: Release of v2.0.0 * 10/30/2017: Release of v2.1.0 * 02/20/2018: Release of v2.2.0 * 06/11/2018: Release of v2.3.0 * 07/02/2018: Release of v2.3.1 * 03/25/2019: Release of v2.4.1 * 05/09/2019: Release of v2.4.2 * 07/05/2019: Release of v2.5.0 * 07/11/2019: Release of v2.5.1 * 08/13/2019: Release of v2.5.2 * 11/13/2019: Release of v3.0.0 * 09/29/2022: Release of v3.6.0 Copyright and License --------------------- :: Copyright 2016 Hewlett Packard Enterprise Development LP Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. python-ilorest-4.8.0.0/Makefile0000644000175000017500000003325314556457137016230 0ustar carstencarstenUNZIP=$(shell which unzip) EXPORT=$(shell which export) FIND=$(shell which find) ECHO=$(shell which echo) RM=$(shell which rm) PYTHON=$(shell which python) PYLINT=$(shell which pylint) NOSE=$(shell which nosetests) CREATE_CHROOT := /net/blofly.us.rdlabs.hpecorp.net/data/blofly/iss-linux-sdk/chrootbuilder/create_chroot.sh CHROOT := /net/blofly.us.rdlabs.hpecorp.net/data/blofly/iss-linux-sdk/chrootbuilder/tools/muchroot BUILD_DIR := $(shell pwd)/.blddir SOURCEDIR := $(shell pwd)/ ZYPPER := zypper --non-interactive install TOPDIR:=$(shell pwd)/topdir BUILD_DIR := $(shell pwd)/.blddir SRCROOT := $(shell pwd) CHROOT_LOCAL_DIR:= $(shell pwd) NAME:=ilorest VERSION:=2.4.0 RELEASE:=1 SPHINXBUILD:=$(BUILD_DIR)/pylib/Sphinx-1.0.7/sphinx-build.py BLOFLY := /net #CREATE_CHROOT := /net/blofly.us.rdlabs.hpecorp.net/data/blofly/iss-linux-sdk/chrootbuilder/create_chroot.sh CREATE_CHROOT := $(CHROOT_LOCAL_DIR)/chrootbuilder/create_chroot.sh #CHROOT := /net/blofly.us.rdlabs.hpecorp.net/data/blofly/iss-linux-sdk/chrootbuilder/tools/muchroot CHROOT := $(CHROOT_LOCAL_DIR)/chrootbuilder/tools/muchroot UNAME_SPOOF := /net/blofly.us.rdlabs.hpecorp.net/data/blofly/iss-linux-sdk/chrootbuilder/tools/uname_spoof export CHROOT_DESTDIR=/home ifdef MTX_PRODUCT_VERSION VERSION:=$(MTX_PRODUCT_VERSION) endif ifdef MTX_BUILD_NUMBER RELEASE:=$(MTX_BUILD_NUMBER) endif DEBCHROOTD := $(BUILD_DIR)/chroots/squeeze all: freeze-src rpms rpms: $(call freeze-chroot,x86_64) #$(CHROOT) $(DEBCHROOTD) bash -c 'useradd -m monkey' #cp "$(NAME)-$(VERSION).tar.bz2" $(DEBCHROOTD)/home/monkey #$(CHROOT) $(DEBCHROOTD) bash -c 'su - monkey -c "mkdir -p ~/build && cd ~/build && mkdir -p BUILD RPMS SOURCES SPECS SRPMS"' #echo "export LDFLAGS=-L/usr/local/ssl/lib/" > $(DEBCHROOTD)/home/monkey/c.sh #echo "export SL_INSTALL_PATH=/usr/local/ssl" >> $(DEBCHROOTD)/home/monkey/c.sh #echo "export OPENSSL_FIPS=1" >> $(DEBCHROOTD)/home/monkey/c.sh #echo "export LD_LIBRARY_PATH=/usr/local/ssl/lib/" >> $(DEBCHROOTD)/home/monkey/c.sh #echo "export CPPFLAGS=-I/usr/local/ssl/include/ -I/usr/local/ssl/include/openssl/" >> $(DEBCHROOTD)/home/monkey/c.sh #echo "rpmbuild -ta --define '_topdir /home/monkey/build/' /home/monkey/$(NAME)-$(VERSION).tar.bz2 " >> $(DEBCHROOTD)/home/monkey/c.sh #$(CHROOT) $(DEBCHROOTD) bash -c 'chmod a+x /home/monkey/c.sh' #$(CHROOT) $(DEBCHROOTD) bash -c 'su - monkey -c "/home/monkey/c.sh"' #cp -r $(DEBCHROOTD)/home/monkey/build/RPMS/ . #-find ./RPMS -type f -name '*-debuginfo-*.rpm' -exec rm -f {} \; #-find ./RPMS -type d -empty -exec rmdir {} \; ifdef MTX_COLLECTION_PATH #cp -r ./RPMS $(MTX_COLLECTION_PATH)/ # hpsign will error out if signing not successful hpsign --signonly `find /opt/mxdk/buildagent/work/MTX_COLLECTION_PATH -type f -name '*.rpm'` endif freeze-src: rm -rf hp git clone git@github.hpe.com:ess-morpheus/chrootbuilder.git $(CHROOT_LOCAL_DIR)/chrootbuilder define freeze-chroot rm -rf $(BUILD_DIR)/chroots # create the chroot $(CREATE_CHROOT) -d SLES12SP2 -a $1 -D $(DEBCHROOTD) #import keys cp -r $(CHROOT_LOCAL_DIR)/chrootbuilder/public_keys $(DEBCHROOTD)/ $(CHROOT) $(DEBCHROOTD) mkdir -p /usr/lib/rpm/gnupg/ #$(CHROOT) $(DEBCHROOTD) bash -c 'gpg --import /public_keys/*.asc' $(CHROOT) $(DEBCHROOTD) zypper --non-interactive install zlib-devel libffi-devel openssl $(CHROOT) $(DEBCHROOTD) zypper --non-interactive install libxml2-devel libxslt-devel ncurses-devel expat sqlite3-devel readline-devel bzip2 $(CHROOT) $(DEBCHROOTD) openssl version $(CHROOT) $(DEBCHROOTD) bash -c 'export LC_ALL=en_US.UTF-8' $(CHROOT) $(DEBCHROOTD) bash -c 'export PYTHONIOENCODING=UTF-8' #tar -xvf $(SRCROOT)/packaging/python3/openssl-1.0.2u.tar.gz -C $(DEBCHROOTD) #tar -xvf $(SRCROOT)/packaging/python3/openssl-fips-2.0.16.tar.gz -C $(DEBCHROOTD) #$(CHROOT) $(DEBCHROOTD) bash -c 'cd /openssl-fips-2.0.16 && ./config && make && make install && cd ..' #$(CHROOT) $(DEBCHROOTD) bash -c 'cd /openssl-1.0.2u && ./config fips shared --with-fipsdir=/usr/local/ssl/fips-2.0 -m64 -Wa,--noexecstack threads no-idea no-mdc2 no-rc5 no-krb5 no-ssl2 no-ssl3 enable-asm enable-camellia enable-seed enable-tlsext enable-rfc3779 enable-cms && make depend && make install' #$(CHROOT) $(DEBCHROOTD) /usr/local/ssl/bin/./openssl version #$(CHROOT) $(DEBCHROOTD) ln -s -f /usr/local/ssl/bin/openssl /usr/bin/openssl #$(CHROOT) $(DEBCHROOTD) openssl version #$(CHROOT) $(DEBCHROOTD) mv /usr/lib64/libcrypto.so.1.1 /usr/lib64/old_libcrypto.so.1.1 #$(CHROOT) $(DEBCHROOTD) mv /usr/lib64/libssl.so.1.1 /usr/lib64/old_libssl.so.1.1 #$(CHROOT) $(DEBCHROOTD) cp /usr/local/ssl/lib/libcrypto.so.1.0.0 /usr/lib64/ && \ #$(CHROOT) $(DEBCHROOTD) cp /usr/local/ssl/lib/libssl.so.1.0.0 /usr/lib64/ tar xf $(SRCROOT)/packaging/python3/Python-3.7.3.tgz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /Python-3.7.3 && ./configure --prefix=/usr/local/python3.7 --enable-shared --with-openssl=/usr/local/ssl/' $(CHROOT) $(DEBCHROOTD) make -C /Python-3.7.3 $(CHROOT) $(DEBCHROOTD) make -C /Python-3.7.3 install $(CHROOT) $(DEBCHROOTD) cp /usr/local/python3.7/lib/libpython3.7m.so.1.0 /usr/lib64/ $(CHROOT) $(DEBCHROOTD) cp /usr/local/python3.7/lib/libpython3.7m.so.1.0 /lib64/ #Added external packages $(CHROOT) $(DEBCHROOTD) bash -c '/usr/local/python3.7/bin/python3.7 -m ensurepip --upgrade' mkdir -p $(DEBCHROOTD)/collection/ $(CHROOT) $(DEBCHROOTD) bash -c 'update-alternatives --install /usr/bin/python3 python3 /usr/local/python3.7/bin/python3.7 1 && update-alternatives --config python3 && python3 --version' unzip $(SRCROOT)/packaging/ext/setuptools-50.3.2.zip -d $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /setuptools-50.3.2 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/pyinstaller-hooks-contrib-2020.10.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /pyinstaller-hooks-contrib-2020.10 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/python-dotenv-0.15.0.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /python-dotenv-0.15.0 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/altgraph-0.17.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /altgraph-0.17 && /usr/local/python3.7/bin/python3.7 setup.py install' #tar xfz $(SRCROOT)/packaging/pyinstaller/PyInstaller-3.6.tar.gz -C $(DEBCHROOTD) #$(CHROOT) $(DEBCHROOTD) bash -c 'cd /PyInstaller-3.6 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/jsonpointer-2.0.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /jsonpointer-2.0 && alias python3=/usr/local/python3.7/bin/python3.7 && python3 setup.py install && python3 setup.py bdist_rpm --dist-dir /collection/' tar xfz $(SRCROOT)/packaging/ext/six-1.15.0.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /six-1.15.0 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/ply-3.11.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /ply-3.11 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/decorator-4.4.2.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /decorator-4.4.2 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/jsonpatch-1.26.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /jsonpatch-1.26 && alias python3=/usr/local/python3.7/bin/python3.7 && python3 setup.py install && python3 setup.py bdist_rpm --dist-dir /collection/' tar xfz $(SRCROOT)/packaging/ext/jsonpath-rw-1.4.0.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /jsonpath-rw-1.4.0 && alias python3=/usr/local/python3.7/bin/python3.7 && python3 setup.py install && python3 setup.py bdist_rpm --dist-dir /collection/' tar xfz $(SRCROOT)/packaging/ext/setproctitle-1.1.10.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /setproctitle-1.1.10 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/pyudev-0.22.0.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /pyudev-0.22.0 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/jsondiff-1.2.0.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /jsondiff-1.2.0 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/pyaes-1.6.1.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /pyaes-1.6.1 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/urllib3-1.26.2.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /urllib3-1.26.2 && alias python3=/usr/local/python3.7/bin/python3.7 && python3 setup.py install && python3 setup.py bdist_rpm --dist-dir /collection/' tar xfz $(SRCROOT)/packaging/ext/colorama-0.4.4.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'export LC_ALL=en_US.UTF-8 && cd /colorama-0.4.4 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/tabulate-0.8.7.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /tabulate-0.8.7 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/wcwidth-0.2.5.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /wcwidth-0.2.5 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/prompt_toolkit-3.0.8.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /prompt_toolkit-3.0.8 && /usr/local/python3.7/bin/python3.7 setup.py install' tar xfz $(SRCROOT)/packaging/ext/certifi-2020.11.8.tar.gz -C $(DEBCHROOTD) $(CHROOT) $(DEBCHROOTD) bash -c 'cd /certifi-2020.11.8 && /usr/local/python3.7/bin/python3.7 setup.py install' #cp -r $(MTX_STAGING_PATH)/externals/*.zip packaging/ext #cp -r $(SRCROOT)/*.* $(DEBCHROOTD)/buildpwd #$(CHROOT) $(DEBCHROOTD) bash -c 'cd /' #unzip packaging/ext/python-ilorest-library-$(MX_ILOREST_LIB_VERSION).zip -d $(DEBCHROOTD) mkdir -p $(DEBCHROOTD)/buildpwd/ cp -r $(SRCROOT)/* $(DEBCHROOTD)/buildpwd $(CHROOT) $(DEBCHROOTD) bash -c 'update-alternatives --install /usr/bin/python3 python3 /usr/local/python3.7/bin/python3.7 1 && update-alternatives --config python3 && python3 --version && \ alias python3=/usr/local/python3.7/bin/python3.7 && cd /buildpwd/ && python3 setup.py bdist_rpm --dist-dir /collection/' mv $(DEBCHROOTD)/collection/*.noarch.rpm ${MTX_COLLECTION_PATH}/ endef bdist-rpm: zypper --non-interactive install rpm-build $(eval DIR=$(shell pwd)) $(eval ILOREST=$(DIR)/ilorest/src) $(eval PYTHONPATH=$(ILOREST):$(PYTHONPATH)) mkdir ${MTX_COLLECTION_PATH}/python2/ tar xfz ./packaging/ext/setuptools-2.2.tar.gz cd ./setuptools-2.2 && \ $(PYTHON) setup.py install tar xfz ./packaging/ext/PySocks-1.6.8.tar.gz cd ./PySocks-1.6.8 && \ $(PYTHON) setup.py install tar xfz ./packaging/ext/wheel-0.36.1.tar.gz cd ./wheel-0.36.1 && \ $(PYTHON) setup.py install unzip ./packaging/ext/recordtype-1.1.zip cd ./recordtype-1.1 && \ $(PYTHON) setup.py bdist_rpm --dist-dir ${MTX_COLLECTION_PATH}/python2/ tar xfz ./packaging/ext/pypandoc-1.4.tar.gz cd ./pypandoc-1.4 && \ $(PYTHON) setup.py install $(PYTHON) setup.py bdist_rpm --dist-dir ${MTX_COLLECTION_PATH}/python2/ tar xfz ./packaging/ext/jsonpointer-1.10.tar.gz cd ./jsonpointer-1.10 && \ iconv -f 'UTF-8' -t 'ASCII//TRANSLIT//IGNORE' jsonpointer.py > jp && \ cp -f jp jsonpointer.py cd ./jsonpointer-1.10 && \ rm jp cd ./jsonpointer-1.10 && \ $(PYTHON) setup.py bdist_rpm --dist-dir ${MTX_COLLECTION_PATH}/python2/ tar xfz ./packaging/ext/jsonpatch-1.16.tar.gz cd ./jsonpatch-1.16 && \ iconv -f 'UTF-8' -t 'ASCII//TRANSLIT//IGNORE' jsonpatch.py > jp && \ cp -f jp jsonpatch.py cd ./jsonpatch-1.16 && \ rm jp cd ./jsonpatch-1.16 && \ $(PYTHON) setup.py bdist_rpm --dist-dir ${MTX_COLLECTION_PATH}/python2/ tar xfz ./packaging/ext/jsonpath-rw-1.4.0.tar.gz cd ./jsonpath-rw-1.4.0 && \ $(PYTHON) setup.py bdist_rpm --dist-dir ${MTX_COLLECTION_PATH}/python2/ tar xfz ./packaging/ext/decorator-4.1.2.tar.gz cd ./decorator-4.1.2 && \ $(PYTHON) setup.py bdist_rpm --dist-dir ${MTX_COLLECTION_PATH}/python2/ tar xfz ./packaging/ext/six-1.10.0.tar.gz cd ./six-1.10.0 && \ $(PYTHON) setup.py bdist_rpm --dist-dir ${MTX_COLLECTION_PATH}/python2/ tar xfz ./packaging/ext/urllib3-1.23.tar.gz cd ./urllib3-1.23 && \ $(PYTHON) setup.py bdist_rpm --dist-dir ${MTX_COLLECTION_PATH}/python2/ tar xfz ./packaging/ext/ply-3.10.tar.gz cd ./ply-3.10 && \ $(PYTHON) setup.py bdist_rpm --dist-dir ${MTX_COLLECTION_PATH}/python2/ rm -rf ${MTX_COLLECTION_PATH}/*.src.rpm rm -rf ${MTX_COLLECTION_PATH}/python2/*.src.rpm define build-pkg tar xfz $(DEBCHROOTD)/buildpwd/packaging/ext/$1* -C $(BUILD_DIR)/buildpwd/ $(CHROOT) $(DEBCHROOTD) bash -c 'cd /buildpwd/$1 && python3 setup.py bdist_rpm --dist-dir /collection/' rm -r $(BUILD_DIR)/buildpwd/$1 endef #export LC_ALL=en_US.UTF-8 #export PYTHONIOENCODING=utf-8 bdist-rpm-python3: $(CREATE_CHROOT) -d SLES12SP2 -D $(BUILD_DIR) $(CHROOT) $(BUILD_DIR) $(ZYPPER) python3 python3-setuptools mkdir -p $(BUILD_DIR)/buildpwd $(BUILD_DIR)/collection/ cp -a $(SOURCEDIR)* $(BUILD_DIR)/buildpwd $(call build-pkg,recordtype-1.3) $(call build-pkg,pypandoc-1.4) $(call build-pkg,jsonpointer-2.0) $(call build-pkg,jsonpatch-1.26) $(call build-pkg,jsonpath-rw-1.4.0) #$(call build-pkg,decorator-4.1.2) $(call build-pkg,urllib3-1.26.2) $(call build-pkg,ply-3.11) $(call build-pkg,six-1.15.0) #cd $(BUILD_DIR)/collection/ && rename "" python3- *.rpm $(CHROOT) $(BUILD_DIR) bash -c 'cd /buildpwd/ && python3 setup.py bdist_rpm --dist-dir /collection/' #cd $(BUILD_DIR)/collection/ && rename python- python3- *.rpm mkdir ${MTX_COLLECTION_PATH}/python3/ mv $(BUILD_DIR)/collection/*.noarch.rpm ${MTX_COLLECTION_PATH}/python3/ rm -rf ${MTX_COLLECTION_PATH}/*.src.rpm rm -rf ${MTX_COLLECTION_PATH}python3/*.src.rpm python-ilorest-4.8.0.0/.gitignore0000644000175000017500000000135614556457137016557 0ustar carstencarsten# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml # Translations *.mo *.pot # Django stuff: *.log # Sphinx documentation docs/_build/ # PyBuilder target/ python-ilorest-4.8.0.0/.pydevproject0000644000175000017500000000066314556457137017306 0ustar carstencarsten /${PROJECT_DIR_NAME}/src python 2.7 Default python-ilorest-4.8.0.0/AUTHORS.md0000644000175000017500000000100014556457137016220 0ustar carstencarsten# Original Contribution: * [Jack Garcia](//github.com/lumbajack) - HPE - Hewlett Packard Enterprise Restful API Group * [Matthew Kocurek](//github.com/Yergidy) - HPE - Hewlett Packard Enterprise Restful API Group * [Prithvi Subrahmanya](//github.com/PrithviBS) - HPE - Hewlett Packard Enterprise Restful API Group # Other Key Contributions: *For a list of people who have contributed to the codebase, see [GitHub's list of contributors](https://github.com/DMTF/python-redfish-library/contributors).* python-ilorest-4.8.0.0/examples/0000755000175000017500000000000014556457137016400 5ustar carstencarstenpython-ilorest-4.8.0.0/examples/Legacy_Rest/0000755000175000017500000000000014556457137020601 5ustar carstencarstenpython-ilorest-4.8.0.0/examples/Legacy_Rest/find_ilo_mac_address.py0000644000175000017500000000441514556457137025267 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def find_ilo_mac_address(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Manager." in instance.Type: manager_path = instance.href break tmp = restobj.get(manager_path) response = restobj.get(tmp.dict["links"]["EthernetNICs"]["href"]) for item in response.dict["Items"]: if "MacAddress" not in item: sys.stderr.write("\tNIC resource does not contain 'MacAddress' property\n") else: sys.stdout.write("\t" + item["Name"] + " = " + item["MacAddress"] + "\t(" + \ item["Status"]["State"] + ")\n") sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) sys.stdout.write("\nEXAMPLE 9: Find iLO's MAC Addresses\n") REST_OBJ.login() find_ilo_mac_address(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/get_EncryptionSettings.py0000644000175000017500000000547214556457137025675 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def get_EncryptionSettings(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Collection.1.0.0" in instance.Type: if "HpSmartStorageArrayController." in instance.MemberType: array_controllers = instance.href break types = ["Name", "Model", "SerialNumber", "EncryptionBootPasswordSet",\ "EncryptionCryptoOfficerPasswordSet",\ "EncryptionLocalKeyCacheEnabled", "EncryptionMixedVolumesEnabled",\ "EncryptionPhysicalDriveCount", "EncryptionRecoveryParamsSet",\ "EncryptionStandaloneModeEnabled", "EncryptionUserPasswordSet"] collection = restobj.get(array_controllers) for instance in collection.obj.links.Member: response = restobj.get(instance.href) for item in types: sys.stdout.write("\tID: " + str(response.dict["@odata.id"]) + "\n") if item in response.dict: sys.stdout.write("\t" + item + ": " + str(response.dict[item]) + "\n") else: sys.stderr.write("\t" + item + "is not " \ "available on HpSmartStorageArrayController resource\n") sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 43: Dump EncryptionSettings\n") get_EncryptionSettings(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/reset_server.py0000644000175000017500000000367614556457137023677 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def reset_server(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "ComputerSystem." in instance.Type: system_path = instance.href break body = dict() body["Action"] = "Reset" body["ResetType"] = "ForceRestart" response = restobj.post(system_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nExample 4: Reset a server\n") reset_server(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/get_schema.py0000644000175000017500000000442114556457137023253 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def get_schema(restobj, schema_prefix): sys.stdout.write("\nEXAMPLE 27: Find and return schema " + \ schema_prefix + "\n") response = restobj.get("/rest/v1/Schemas") for schema in response.dict["Items"]: if schema["Schema"].startswith(schema_prefix): for location in schema["Location"]: extref_uri = location["Uri"]["extref"] response = restobj.get(extref_uri) if response.status == 200: sys.stdout.write("\tFound " + schema_prefix + " at " + extref_uri + "\n") return else: sys.stderr.write("\t" + schema_prefix + " not found at " + extref_uri + "\n") return sys.stderr.write("Registry " + schema_prefix + " not found.\n") if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() get_schema(REST_OBJ, "ComputerSystem") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_license_key.py0000644000175000017500000000401314556457137024316 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_license_key(restobj, iLO_Key): sys.stdout.write("\nEXAMPLE 31: Set iLO License Key\n") resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Manager." in instance.Type: manager_path = instance.href break rsp = restobj.get(manager_path) body = dict() body["LicenseKey"] = iLO_Key response = restobj.post(rsp.dict["Oem"]["Hp"]["links"]["LicenseService"]["href"], body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() set_license_key(REST_OBJ, "test_iLO_Key") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_uid_light.py0000644000175000017500000000376214556457137024006 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_uid_light(restobj, uid): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "ComputerSystem." in instance.Type: system_path = instance.href break body = dict() if uid: body["IndicatorLED"] = "Lit" else: body["IndicatorLED"] = "Off" response = restobj.patch(system_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 15: Set UID Light on or off\n") set_uid_light(REST_OBJ, True) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_bios_uefi_shell_startup.py0000644000175000017500000000460614556457137026751 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_bios_uefi_shell_startup(restobj, uefienabled="Enabled", \ networkpath="", urlpath="", \ bios_password=None): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpBios." in instance.Type: if "PUT" in instance.HttpMethods: bios_path = instance.href break #BIOS password is the password if secondary authentication is #required before entering RBSU screen Only required on Gen9 systems restobj.bios_password = bios_password body = dict() body["UefiShellStartup"] = uefienabled body["UefiShellStartupLocation"] = networkpath body["UefiShellStartupUrl"] = urlpath response = restobj.patch(bios_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() set_bios_uefi_shell_startup(REST_OBJ, "Enabled", "10.0.0.0", "test.com") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/reset_ESKM_eventlog.py0000644000175000017500000000365314556457137025026 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def reset_ESKM_eventlog(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpESKM." in instance.Type: eskm_path = instance.href break body = dict() body["Action"] = "ClearESKMLog" response = restobj.post(eskm_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 40: Reset ESKM event logs\n") reset_ESKM_eventlog(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/clear_ahs_data.py0000644000175000017500000000362214556457137024070 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def clear_ahs_data(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpiLOActiveHealthSystem." in instance.Type: AHS_path = instance.href break body = {"Action": "ClearLog"} response = restobj.post(AHS_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 47: Clear AHS Data\n") clear_ahs_data(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_bios_iscsi.py0000644000175000017500000000455714556457137024167 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_bios_iscsi(restobj, bios_properties, bios_password=None): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpiSCSISoftwareInitiator." in instance.Type: if "PUT" in instance.HttpMethods: iscsi_path = instance.href break #BIOS password is the password if secondary authentication is #required before entering RBSU screen Only required on Gen9 systems restobj.bios_password = bios_password response = restobj.patch(iscsi_path, bios_properties) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 35: Set ISCSI Config\n") set_bios_iscsi(REST_OBJ, {"iSCSIBootAttemptInstance": 2, \ "iSCSIBootAttemptName": \ "Updated Attempt Name", \ "iSCSIConnectRetry": 5}) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_bios_dhcp.py0000644000175000017500000000464714556457137023773 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_bios_dhcp(restobj, bios_properties, bios_password=None): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpBios." in instance.Type: if "PUT" in instance.HttpMethods: bios_path = instance.href break #BIOS password is the password if secondary authentication is #required before entering RBSU screen Only required on Gen9 systems restobj.bios_password = bios_password response = restobj.patch(bios_path, bios_properties) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 32: Set DHCP\n") set_bios_dhcp(REST_OBJ, {'Ipv4Address':'192.168.0.1', \ 'Ipv4Gateway':'192.168.0.2', \ 'Ipv4PrimaryDNS':'192.168.0.3', \ 'Ipv4SecondaryDNS':'192.168.0.4', \ 'Ipv4SubnetMask':'192.168.0.5'}) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/change_bios_setting.py0000644000175000017500000000432614556457137025156 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def change_bios_setting(restobj, bios_property, property_value, bios_password=None): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpBios." in instance.Type: if "PUT" in instance.HttpMethods: bios_path = instance.href break body = {bios_property: property_value} #BIOS password is the password if secondary authentication is #required before entering RBSU screen Only required on Gen9 systems restobj.bios_password = bios_password response = restobj.patch(bios_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 3: Change a BIOS setting\n") change_bios_setting(REST_OBJ, "AdminName", "admin") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/remove_ilo_account.py0000644000175000017500000000431714556457137025034 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def remove_ilo_account(restobj, ilo_loginname_to_remove): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Collection." in instance.Type: if "ManagerAccount." in instance.MemberType: accounts_path = instance.href break accounts = restobj.get(accounts_path) for account in accounts.dict["Items"]: if account["UserName"] == ilo_loginname_to_remove: newrsp = restobj.delete(account["links"]["self"]["href"]) sys.stdout.write("%s" % newrsp) return sys.stderr.write("Account not found\n") if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 12: Remove an iLO account\n") remove_ilo_account(REST_OBJ, "newname") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_Ilo_ntp_servers.py0000644000175000017500000000442614556457137025211 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys import json from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_ilo_ntp_servers(restobj, ntp_servers): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpiLODateTime." in instance.Type: datetime_path = instance.href break response = restobj.get(datetime_path) sys.stdout.write("\tCurrent iLO Date/Time Settings: " + json.dumps(response.dict["ConfigurationSettings"]) + "\n") sys.stdout.write("\tCurrent iLO NTP Servers: " + json.dumps(response.dict["NTPServers"]) + "\n") body = {"StaticNTPServers": ntp_servers} response = restobj.patch(datetime_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 29: Set iLO's NTP Servers\n") set_ilo_ntp_servers(REST_OBJ, ["192.168.0.1", "192.168.0.2"]) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_active_ilo_nic.py0000644000175000017500000000551414556457137025002 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_active_ilo_nic(restobj, shared_nic): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Manager." in instance.Type: manager_path = instance.href break selected_nic_uri = None tmp = restobj.get(instance["href"]) response = restobj.get(tmp.dict["links"]["EthernetNICs"]["href"]) for nic in response.dict["Items"]: try: if (nic["Oem"]["Hp"]["SupportsFlexibleLOM"] == True and shared_nic == True): selected_nic_uri = nic["links"]["self"]["href"] break except KeyError: pass try: if (nic["Oem"]["Hp"]["SupportsLOM"] == True and shared_nic == True): selected_nic_uri = nic["links"]["self"]["href"] break except KeyError: pass if not shared_nic: selected_nic_uri = nic["links"]["self"]["href"] break elif not selected_nic_uri: sys.stderr.write("\tShared NIC is not supported\n") break if selected_nic_uri: body = {"Oem": {"Hp": {"NICEnabled": True}}} response = restobj.patch(selected_nic_uri, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 21: Set the active iLO NIC\n") set_active_ilo_nic(REST_OBJ, False) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/modify_ilo_user_account.py0000644000175000017500000000737714556457137026075 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def modify_ilo_user_account(restobj, ilo_login_name_to_modify, \ new_ilo_loginname, new_ilo_username, new_ilo_password, \ irc=None, cfg=None, virtual_media=None, usercfg=None, vpr=None): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Collection." in instance.Type: if "ManagerAccount." in instance.MemberType: accounts_path = instance.href break accounts = restobj.get(accounts_path) for account in accounts.obj.Items: for account in accounts.dict["Items"]: if account["UserName"] == ilo_login_name_to_modify: body = {} body_oemhp = {} body_oemhp_privs = {} # if new loginname or password specified if new_ilo_password: body["Password"] = new_ilo_password if new_ilo_loginname: body["UserName"] = new_ilo_loginname # if different username specified if new_ilo_username: body_oemhp["LoginName"] = new_ilo_username # if different privileges were requested (None = no change) if irc != None: body_oemhp_privs["RemoteConsolePriv"] = irc if virtual_media != None: body_oemhp_privs["VirtualMediaPriv"] = virtual_media if cfg != None: body_oemhp_privs["iLOConfigPriv"] = cfg if usercfg != None: body_oemhp_privs["UserConfigPriv"] = usercfg if vpr != None: body_oemhp_privs["VirtualPowerAndResetPriv"] = vpr # component assembly if len(body_oemhp_privs): body_oemhp["Privileges"] = body_oemhp_privs if len(body_oemhp): body["Oem"] = {"Hp": body_oemhp} newrsp = restobj.patch(account["links"]["self"]["href"], body) sys.stdout.write("%s" % newrsp) return sys.stderr.write("Account not found\n") if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 11: Modify an iLO user account\n") modify_ilo_user_account(REST_OBJ, "name", "newname", "newusername", "newpassword") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/bios_revert_default.py0000644000175000017500000000373014556457137025205 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def bios_revert_default(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpBios." in instance.Type: if "PUT" in instance.HttpMethods: bios_path = instance.href break body = {"BaseConfig": "default"} response = restobj.put(bios_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 6: Revert BIOS settings to default\n") bios_revert_default(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/enable_secure_boot.py0000644000175000017500000000424714556457137025001 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def enable_secure_boot(restobj, secure_boot_enable, bios_password=None): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpSecureBoot." in instance.Type: secure_boot_path = instance.href break #BIOS password is the password if secondary authentication is #required before entering RBSU screen Only required on Gen9 systems restobj.bios_password = bios_password body = {"SecureBootEnable": secure_boot_enable} response = restobj.patch(secure_boot_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 5: Enable/Disable UEFI Secure Boot\n") enable_secure_boot(REST_OBJ, False) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/clear_ilo_event_log.py0000644000175000017500000000372014556457137025150 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def clear_ilo_event_log(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "LogService." in instance.Type: if instance["href"].endswith("IEL"): IEL_path = instance.href break body = {"Action": "ClearLog"} response = restobj.post(IEL_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 25: Clear iLO Event Log\n") clear_ilo_event_log(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/test_ESKM_connection.py0000644000175000017500000000366314556457137025200 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def test_ESKM_connection(restobj): sys.stdout.write("\nEXAMPLE 39: Test ESKM connection\n") resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpESKM." in instance.Type: eskm_path = instance.href break body = dict() body["Action"] = "TestESKMConnections" response = restobj.post(eskm_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() test_ESKM_connection(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/computer_details.py0000644000175000017500000001151014556457137024514 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def computer_details(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "ComputerSystem." in instance.Type: system_path = instance.href break response = restobj.get(system_path) sys.stdout.write("\tManufacturer: " + \ str(response.dict["Manufacturer"]) + "\n") sys.stdout.write("\tModel: " + str(response.dict["Model"]) + "\n") sys.stdout.write("\tSerial Number: " + \ str(response.dict["SerialNumber"]) + "\n") if "VirtualSerialNumber" in response.dict: sys.stdout.write("\tVirtual Serial Number: " + str(response.dict["VirtualSerialNumber"]) + "\n") else: sys.stderr.write("\tVirtual Serial Number information not " \ "available on system resource\n") sys.stdout.write("\tUUID: " + str(response.dict["UUID"]) + "\n") if "VirtualUUID" in response.dict["Oem"]["Hp"]: sys.stdout.write("\tVirtualUUID: " + \ str(response.dict["Oem"]["Hp"]["VirtualUUID"]) + "\n") else: sys.stderr.write("\tVirtualUUID not available system " \ "resource\n") if "AssetTag" in response.dict: sys.stdout.write("\tAsset Tag: " + response.dict["AssetTag"] \ + "\n") else: sys.stderr.write("\tNo Asset Tag information on system " \ "resource\n") sys.stdout.write("\tBIOS Version: " + \ response.dict["Bios"]["Current"]["VersionString"] + "\n") sys.stdout.write("\tMemory: " + str(response.dict["Memory"]["TotalSystemMemoryGB"]) +" GB\n") sys.stdout.write("\tProcessors: " + \ str(response.dict["Processors"]["Count"]) + " x " + \ str(response.dict["Processors"]["ProcessorFamily"])+ "\n") if "Status" not in response.dict or "Health" not in \ response.dict["Status"]: sys.stdout.write("\tStatus/Health information not available in " "system resource\n") else: sys.stdout.write("\tHealth: " + \ str(response.dict["Status"]["Health"]) + "\n") if "HostCorrelation" in response.dict: if "HostFQDN" in response.dict["HostCorrelation"]: sys.stdout.write("\tHost FQDN: " + \ response.dict["HostCorrelation"]["HostFQDN"] + "\n") if "HostMACAddress" in response.dict["HostCorrelation"]: for mac in response.dict["HostCorrelation"]["HostMACAddress"]: sys.stdout.write("\tHost MAC Address: " + str(mac) + "\n") if "HostName" in response.dict["HostCorrelation"]: sys.stdout.write("\tHost Name: " + \ response.dict["HostCorrelation"]["HostName"] + "\n") if "IPAddress" in response.dict["HostCorrelation"]: for ip_address in response.dict["HostCorrelation"]["IPAddress"]: if ip_address: sys.stdout.write("\tHost IP Address: " + str(ip_address) + "\n") sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 16: Dump host computer details\n") computer_details(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_ESKM_username_password.py0000644000175000017500000000453114556457137026411 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_ESKM_username_password(restobj, username, password, accountgroup): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpESKM." in instance.Type: eskm_path = instance.href break body = dict() body["KeyManagerConfig"] = dict() body["KeyManagerConfig"]["LoginName"] = username body["KeyManagerConfig"]["Password"] = password body["KeyManagerConfig"]["AccountGroup"] = accountgroup body["KeyManagerConfig"]["ESKMLocalCACertificateName"] = "" response = restobj.patch(eskm_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" eskm_username = "admin" eskm_password = "password" eskm_accountgroup = "group" # Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 38: Set ESKM username, password\n") set_ESKM_username_password(REST_OBJ, eskm_username, eskm_password, eskm_accountgroup) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/mount_virtual_media_iso.py0000644000175000017500000000472714556457137026106 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def mount_virtual_media_iso(restobj, iso_url, boot_on_next_server_reset): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Manager." in instance.Type: manager_path = instance.href break rsp = restobj.get(manager_path) rsp = restobj.get(rsp.dict["links"]["VirtualMedia"]["href"]) for vmlink in rsp.dict["links"]["Member"]: response = restobj.get(vmlink["href"]) if response.status == 200 and "DVD" in response.dict["MediaTypes"]: body = {"Image": iso_url} if (iso_url is not None and boot_on_next_server_reset is not None): body["Oem"] = {"Hp": {"BootOnNextServerReset": boot_on_next_server_reset}} response = restobj.patch(vmlink["href"], body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 17: Mount iLO Virtual Media DVD ISO from URL\n") mount_virtual_media_iso(REST_OBJ, "http://10.0.0.100/test.iso", True) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/change_boot_order.py0000644000175000017500000000457414556457137024630 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def change_boot_order(restobj, bios_password=None): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "ServerBootSettings." in instance.Type: if "PATCH" in instance.HttpMethods: boot_settings_path = instance.href break response = restobj.get(boot_settings_path) bootorder = response.dict["PersistentBootConfigOrder"] #TODO: Need to change the persistent boot order here body = dict() body["PersistentBootConfigOrder"] = bootorder #BIOS password is the password if secondary authentication is #required before entering RBSU screen Only required on Gen9 systems restobj.bios_password = bios_password response = restobj.patch(boot_settings_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 7: Change Boot Order (UEFI)\n") change_boot_order(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_server_asset_tag.py0000644000175000017500000000367714556457137025403 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_server_asset_tag(restobj, asset_tag): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "ComputerSystem." in instance.Type: system_path = instance.href break body = {"AssetTag": asset_tag} response = restobj.patch(system_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 18: Set Computer Asset Tag\n") set_server_asset_tag(REST_OBJ, "assettaghere") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_bios_service.py0000644000175000017500000000431214556457137024502 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_bios_service(restobj, bios_properties, bios_password=None): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpBios." in instance.Type: if "PUT" in instance.HttpMethods: bios_path = instance.href break #BIOS password is the password if secondary authentication is #required before entering RBSU screen Only required on Gen9 systems restobj.bios_password = bios_password response = restobj.patch(bios_path, bios_properties, bios_password) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 33: Set BIOS Service.\n") set_bios_service(REST_OBJ, {'ServiceName':'HPE', 'ServiceEmail':'me@hpe.com'}) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/sessions.py0000644000175000017500000000436614556457137023032 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from urllib3.util import parse_url from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def sessions(restobj, login_account, login_password): new_session = {"UserName": login_account, "Password": login_password} response = restobj.post("/rest/v1/Sessions", new_session) sys.stdout.write("%s" % response) if response.status == 201: session_uri = response.getheader("location") session_uri = parse_url(session_uri) sys.stdout.write("\tSession " + session_uri.path + " created\n") x_auth_token = response.getheader("x-auth-token") sys.stdout.write("\tSession key " + x_auth_token + " created\n") # Delete the created session sessresp = restobj.delete(session_uri.path) sys.stdout.write("%s" % response) else: sys.stderr.write("ERROR: failed to create a session.\n") if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) sys.stdout.write("\nEXAMPLE 14: Create/Use/Delete a user session\n") sessions(REST_OBJ, "admin", "admin123") python-ilorest-4.8.0.0/examples/Legacy_Rest/get_powermetrics_average.py0000644000175000017500000000473414556457137026237 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def get_powermetrics_average(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "PowerMetrics." in instance.Type: power_path = instance.href break response = restobj.get(power_path) if "PowerMetrics" not in response.dict or \ "AverageConsumedWatts" not in response.dict["PowerMetrics"] or \ "IntervalInMin" not in response.dict["PowerMetrics"]: sys.stdout.write("\tPowerMetrics resource does not contain "\ "'AverageConsumedWatts' or 'IntervalInMin' property\n") else: sys.stdout.write("\t" + " AverageConsumedWatts = " + \ str(response.dict["PowerMetrics"]["AverageConsumedWatts"]) + \ " watts over a " + str(response.dict["PowerMetrics"]\ ["IntervalInMin"]) + " minute moving average\n") if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 30: Report PowerMetrics Average Watts\n") get_powermetrics_average(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/dump_iml.py0000644000175000017500000000510614556457137022763 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def dump_iml(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "LogService." in instance.Type: if instance["href"].endswith("IML"): IML_path = instance.href break tmp = restobj.get(IML_path) for entry in tmp.dict["links"]["Entries"]: response = restobj.get(entry["href"]) print_log_entries(response.dict["Items"]) while 'NextPage' in response.dict["links"]: response = restobj.get(entry["href"] + '?page=' + \ str(response.dict["links"]['NextPage']['page'])) print_log_entries(response.dict["Items"]) def print_log_entries(log_entries): for log_entry in log_entries: sys.stdout.write(log_entry["Severity"] + ": Class " + \ str(log_entry["Oem"]["Hp"]["Class"]) + \ " / Code " + str(log_entry["Oem"]["Hp"]["Code"]) + \ ":\t" + log_entry["Message"] + "\n") if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 22: Dump Integrated Management Log\n") dump_iml(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/get_base_registry.py0000644000175000017500000000457714556457137024671 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def get_base_registry(restobj): response = restobj.get("/rest/v1/Registries") messages = {} identifier = None for entry in response.dict["Items"]: if "Id" in entry: identifier = entry["Id"] else: identifier = entry["Schema"].split(".")[0] if identifier not in ["Base", "iLO"]: continue for location in entry["Location"]: reg_resp = restobj.get(location["Uri"]["extref"]) if reg_resp.status == 200: sys.stdout.write("\tFound " + identifier + " at " + \ location["Uri"]["extref"] + "\n") messages[identifier] = reg_resp.dict["Messages"] else: sys.stdout.write("\t" + identifier + " not found at "\ + location["Uri"]["extref"] + "\n") return messages if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 2: Find and return registry " + "\n") get_base_registry(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/get_resource_directory.py0000644000175000017500000000375014556457137025732 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient def get_resource_directory(restobj): response = restobj.get("/rest/v1/resourcedirectory") resources = [] if response.status == 200: resources = response.obj.Instances else: sys.stderr.write("\tResource directory missing at /rest/v1/resourcedirectory" + "\n") return resources if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 1: Find the resource directory " + "\n") resources = get_resource_directory(REST_OBJ) for resource in resources: try: sys.stdout.write("\t" + str(resource["@odata.type"]) + \ "\n\t\t" + str(resource["@odata.id"]) + "\n") except KeyError: pass REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/update_ilo_firmware.py0000644000175000017500000000424414556457137025200 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def update_ilo_firmware(restobj, fw_url=None, tpm_flag=False): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpiLOFirmwareUpdate." in instance.Type: update_path = instance.href break body = dict() body["Action"] = "InstallFromURI" body["FirmwareURI"] = fw_url body["TPMOverrideFlag"] = tpm_flag response = restobj.post(update_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # While this example can be run remotely, it is used locally to locate the # iLO IP address #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 53: Update iLO Firmware\n") update_ilo_firmware(REST_OBJ, "http://test.com/ilo4_244.bin", False) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_bios_url_boot_file.py0000644000175000017500000000430414556457137025667 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_bios_url_boot_file(restobj, path='', bios_password=None): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpBios." in instance.Type: if "PUT" in instance.HttpMethods: bios_path = instance.href break #BIOS password is the password if secondary authentication is #required before entering RBSU screen Only required on Gen9 systems restobj.bios_password = bios_password body = {"UrlBootFile": path} response = restobj.patch(bios_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 36: Set BIOS url boot file\n") set_bios_url_boot_file(REST_OBJ, "http://test.test/test.efi") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/reset_ilo.py0000644000175000017500000000356714556457137023153 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def reset_ilo(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Manager." in instance.Type: manager_path = instance.href break body = {"Action": "Reset"} response = restobj.post(manager_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 19: Reset iLO\n") reset_ilo(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/import_ssl.py0000644000175000017500000000410214556457137023343 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def import_ssl(restobj, filename): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpHttpsCert." in instance.Type: https_path = instance.href break with open(filename, 'r') as csr_data: ssl_cert = csr_data.read() csr_data.close() body = dict() body["Action"] = "ImportCertificate" body["Certificate"] = ssl_cert response = restobj.post(https_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 51: Import SSL Certificate\n") import_ssl(REST_OBJ, "ssl.txt") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/clear_iml.py0000644000175000017500000000373414556457137023111 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def clear_iml(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "LogService." in instance.Type: if instance["href"].endswith("IML"): IEL_path = instance.href break body = {"Action": "ClearLog"} response = restobj.post(instance["href"], body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 24: Clear Integrated Management Log\n") clear_iml(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/dump_ilo_event_log.py0000644000175000017500000000470014556457137025026 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def dump_ilo_event_log(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "LogService." in instance.Type: if instance["href"].endswith("IEL"): IEL_path = instance.href break tmp = restobj.get(IEL_path) for entry in tmp.dict["links"]["Entries"]: response = restobj.get(entry["href"]) print_log_entries(response.dict["Items"]) while 'NextPage' in response.dict["links"]: response = restobj.get(entry["href"] + '?page=' + \ str(response.dict["links"]['NextPage']['page'])) print_log_entries(response.dict["Items"]) sys.stdout.write("%s" % response) def print_log_entries(log_entries): for log_entry in log_entries: sys.stdout.write(log_entry["Message"] + "\n") if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 23: Dump iLO Event Log\n") dump_ilo_event_log(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/get_ESKM.py0000644000175000017500000000667714556457137022571 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys import json from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def get_ESKM(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpESKM." in instance.Type: eskm_path = instance.href break response = restobj.get(eskm_path) sys.stdout.write("\tPrimaryKeyServerAddress: " + json.dumps(response.dict["PrimaryKeyServerAddress"]) + "\n") sys.stdout.write("\tPrimaryKeyServerPort: " + json.dumps(response.dict["PrimaryKeyServerPort"]) + "\n") sys.stdout.write("\tSecondaryKeyServerAddress: " + json.dumps(response.dict["SecondaryKeyServerAddress"])\ + "\n") sys.stdout.write("\tSecondaryKeyServerPort: " + json.dumps(response.dict["SecondaryKeyServerPort"])\ + "\n") sys.stdout.write("\tType: " + json.dumps(response.dict["Type"]) + "\n") sys.stdout.write("\tKeyServerRedundancyReq: " + json.dumps(response.dict["KeyServerRedundancyReq"]) + "\n") sys.stdout.write("\tAccountGroup: " + json.dumps(response.dict["KeyManagerConfig"]\ ["AccountGroup"]) + "\n") sys.stdout.write("\tESKMLocalCACertificateName: " + json.dumps(response.dict["KeyManagerConfig"]\ ["ESKMLocalCACertificateName"]) + "\n") sys.stdout.write("\tImportedCertificateIssuer: " + json.dumps(response.dict["KeyManagerConfig"]\ ["ImportedCertificateIssuer"]) + "\n") sys.stdout.write("\tESKMEvents: " + json.dumps(response.dict["ESKMEvents"]) + "\n") tmp = response.dict["ESKMEvents"] for entry in tmp: sys.stdout.write("\tTimestamp : " + entry["Timestamp"] + "Event: " + json.dumps(entry["Event"]) + "\n") sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 42: Get ESKM configuration\n") get_ESKM(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/get_ilo_nic.py0000644000175000017500000000460014556457137023426 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys import json from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def get_ilo_nic(restobj, get_active): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Manager." in instance.Type: manager_path = instance.href break tmp = restobj.get(manager_path) response = restobj.get(tmp.dict["links"]["EthernetNICs"]["href"]) for nic in response.dict["Items"]: if get_active and nic["Status"]["State"] == "Enabled": sys.stdout.write("Active\t" + nic["links"]["self"]["href"] + \ ": " + json.dumps(nic) + "\n") elif get_active == False and nic["Status"]["State"] == "Disabled": sys.stdout.write("InActive\t" + nic["links"]["self"]["href"] + \ ": " + json.dumps(nic) + "\n") if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 20: Get iLO's NIC configuration\n") get_ilo_nic(REST_OBJ, True) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/change_temporary_boot_order.py0000644000175000017500000000506014556457137026721 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def change_temporary_boot_order(restobj, boottarget, bios_password=None): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "ComputerSystem." in instance.Type: system_path = instance.href break response = restobj.get(system_path) bootoptions = response.dict["Boot"] if boottarget not in bootoptions["BootSourceOverrideSupported"]: sys.stderr.write("ERROR: %s is not a supported boot option.\n" % boottarget) return body = dict() body["Boot"] = dict() body["Boot"]["BootSourceOverrideTarget"] = boottarget #BIOS password is the password if secondary authentication is #required before entering RBSU screen Only required on Gen9 systems restobj.bios_password = bios_password response = restobj.patch(system_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 8: Change temporary boot order (one time boot" \ " or temporary override)\n") change_temporary_boot_order(REST_OBJ, "Hdd") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/get_ahs_data.py0000644000175000017500000000420214556457137023554 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def get_ahs_data(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpiLOActiveHealthSystem." in instance.Type: AHS_path = instance.href break sys.stdout.write("Fetching AHS Data, this may take minutes to hours\n") response = restobj.get(AHS_path) ahslink = restobj.get(response.dict["links"]["AHSLocation"]["extref"]) with open("data.ahs", 'wb') as ahsoutput: ahsoutput.write(ahslink.ori) ahsoutput.close() sys.stdout.write("AHS Data saved successfully as data.ahs\n") if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 46: Get AHS Data\n") get_ahs_data(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_bios_password.py0000644000175000017500000000436714556457137024716 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_bios_password(restobj, new_password, bios_password=None): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpBios." in instance.Type: if "PUT" in instance.HttpMethods: bios_path = instance.href break #BIOS password is the password if secondary authentication is #required before entering RBSU screen Only required on Gen9 systems restobj.bios_password = bios_password body = {"AdminPassword": new_password, \ "OldAdminPassword": bios_password} response = restobj.patch(bios_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 48: Set Bios Password\n") set_bios_password(REST_OBJ, "newpassword", "biospassword") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/get_license_key.py0000644000175000017500000000433414556457137024310 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def get_license_key(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpiLOLicense." in instance.Type: manager_path = instance.href break license_result = dict() licenseproperties = ["License", "LicenseKey", "LicenseType"] response = restobj.get(instance["href"]) license_result["License"] = response.dict["License"] for licenseproperty in licenseproperties: sys.stdout.write("\t" + licenseproperty + ": " + \ str(response.dict[licenseproperty]) + "\n") sys.stdout.write("%s" % response) return (license_result) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 45: Get iLO License Key\n") get_license_key(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_ESKM_PrimaryKeyServer.py0000644000175000017500000000430314556457137026130 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_ESKM_PrimaryKeyServer(restobj, PrimaryKeyServerAddress, PrimaryKeyServerPort): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpESKM." in instance.Type: eskm_path = instance.href break body = dict() body["PrimaryKeyServerAddress"] = PrimaryKeyServerAddress body["PrimaryKeyServerPort"] = int(PrimaryKeyServerPort) response = restobj.patch(eskm_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" PrimaryKeyServerAddress = "10.0.0.100" PrimaryKeyServerPort = "9000" # Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 37: Set ESKM Primary Key Server\n") set_ESKM_PrimaryKeyServer(REST_OBJ, PrimaryKeyServerAddress, PrimaryKeyServerPort) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/generate_csr.py0000644000175000017500000000510214556457137023612 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def generate_csr(restobj, csr_properties): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpHttpsCert." in instance.Type: https_path = instance.href break body = dict() body["Action"] = "GenerateCSR" body["City"] = csr_properties["City"] body["CommonName"] = csr_properties["CommonName"] body["Country"] = csr_properties["Country"] body["OrgName"] = csr_properties["OrgName"] body["OrgUnit"] = csr_properties["OrgUnit"] body["State"] = csr_properties["State"] response = restobj.post(https_path, body) sys.stdout.write("%s" % response) sys.stdout.write("Generating CSR, this may take a few minutes\n") if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 49: Generate CSR\n") generate_csr(REST_OBJ, {"City" : "City",\ "CommonName": "Common Name",\ "Country": "US",\ "OrgName": "Organization",\ "OrgUnit": "Unit",\ "State": "State"}) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/get_csr.py0000644000175000017500000000427114556457137022605 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def get_csr(restobj, filename): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpHttpsCert." in instance.Type: https_path = instance.href break response = restobj.get(https_path) try: csr_response = response.dict["CertificateSigningRequest"] with open(filename, 'wb') as csroutput: csroutput.write(csr_response) csroutput.close() sys.stdout.write("\tCSR Data saved successfully as "+ filename + "\n") except KeyError: sys.stdout.write("\tCSR cannot be accessed right now, please try again later") if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 50: Get CSR\n") get_csr(REST_OBJ, "csr.txt") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/add_ilo_user_account.py0000644000175000017500000000541614556457137025326 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. """ An example of adding a user account by iLO privileges """ import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def add_ilo_user_account(restobj, new_ilo_loginname, new_ilo_username, \ new_ilo_password, irc=False, cfg=False, \ virtual_media=False, usercfg=False, vpr=False): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Collection." in instance.Type: if instance.MemberType.startswith("ManagerAccount."): accounts_path = instance.href break body = {"UserName": new_ilo_loginname, "Password": new_ilo_password, "Oem": {}} body["Oem"]["Hp"] = {} body["Oem"]["Hp"]["LoginName"] = new_ilo_username body["Oem"]["Hp"]["Privileges"] = {} body["Oem"]["Hp"]["Privileges"]["RemoteConsolePriv"] = irc body["Oem"]["Hp"]["Privileges"]["iLOConfigPriv"] = cfg body["Oem"]["Hp"]["Privileges"]["VirtualMediaPriv"] = virtual_media body["Oem"]["Hp"]["Privileges"]["UserConfigPriv"] = usercfg body["Oem"]["Hp"]["Privileges"]["VirtualPowerAndResetPriv"] = vpr response = restobj.post(accounts_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 10: Create an iLO User Account\n") add_ilo_user_account(REST_OBJ, "name", "username", "password") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/dump_ilo_nic.py0000644000175000017500000000650114556457137023616 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def dump_ilo_nic(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Manager." in instance.Type: manager_path = instance.href break manager = restobj.get(manager_path) response = restobj.get(manager.dict["links"]["EthernetNICs"]["href"]) for nic in response.dict["Items"]: if nic["Status"]["State"] == "Enabled": sys.stdout.write("\t" + nic["Name"] + "\n") if "MacAddress" not in nic: sys.stderr.write("\tNo MacAddress information available (no" " 'MacAddress' property in NIC resource)\n") else: sys.stdout.write("\tMAC: " + str(nic["MacAddress"]) + "\n") sys.stdout.write("\tSpeed: " + str(nic["SpeedMbps"]) + "\n") sys.stdout.write("\tAutosense: " + str(nic["Autosense"]) + "\n") sys.stdout.write("\tFull Duplex: " + str(nic["FullDuplex"]) + "\n") if "FQDN" not in nic: sys.stderr.write("\tNo FQDN information available\n") else: sys.stdout.write("\tFQDN: " + str(nic["FQDN"]) + "\n") for addr in nic["IPv4Addresses"]: sys.stdout.write("\tIPv4 Address: " + addr["Address"] + " from " + addr["AddressOrigin"] + "\n") if "IPv6Addresses" not in nic: sys.stderr.write("\tIPv6Addresses information not "\ "available\n") else: for addr in nic["IPv6Addresses"]: sys.stdout.write("\tIPv6 Address: " + addr["Address"] + " from " + addr["AddressOrigin"] + "\n") sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 13: Get iLO NIC state\n") dump_ilo_nic(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/dump_eskm_event_log.py0000644000175000017500000000374514556457137025212 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def dump_eskm_event_log(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpESKM." in instance.Type: eskm_path = instance.href break response = restobj.get(eskm_path) for entry in response.dict["ESKMEvents"]: sys.stdout.write(entry["Timestamp"] + "\n" + entry["Event"] + "\n") sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 41: Dump ESKM Event Log\n") dump_eskm_event_log(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/set_ilo_timezone.py0000644000175000017500000000445514556457137024533 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def set_ilo_timezone(restobj, olson_timezone): sys.stdout.write("\tNOTE: This only works if iLO is NOT configured to " \ "take time settings from DHCP v4 or v6\n") resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "HpiLODateTime." in instance.Type: datetime_path = instance.href break response = restobj.get(datetime_path) for timezone in response.dict["TimeZoneList"]: if timezone["Name"].startswith(olson_timezone): body = {"TimeZone": {"Name": timezone["Name"]}} response = restobj.patch(datetime_path, body) sys.stdout.write("%s" % response) break if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://16.83.63.89" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 28: Set iLO's Timezone\n") set_ilo_timezone(REST_OBJ, "America/Chicago") REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/get_LogicalDrives.py0000644000175000017500000000456514556457137024553 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys import json from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def get_LogicalDrives(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Collection.1.0.0" in instance.Type: if "HpSmartStorageArrayController." in instance.MemberType: array_controllers = instance.href break collection = restobj.get(array_controllers) for instance in collection.obj.links.Member: controller = restobj.get(instance.href) sys.stdout.write("Location: %s\n" % controller.obj.Location) logicaldrivecollection = restobj.get(controller.obj.links.LogicalDrives.href) for logicaldrive in logicaldrivecollection.obj.links.Member: drive = restobj.get(logicaldrive.href) sys.stdout.write("\t%s\n" % json.dumps(drive.dict)) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) sys.stdout.write("\nEXAMPLE 44: Dump LogicalDrive details\n") REST_OBJ.login() get_LogicalDrives(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/get_ilo_ip.py0000644000175000017500000000431514556457137023270 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def get_ilo_ip(restobj): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "Manager." in instance.Type: manager_path = instance.href break response = restobj.get(manager_path) ethernet_rsp = restobj.get(response.dict["links"]["EthernetNICs"]["href"]) for item in ethernet_rsp.dict["Items"]: if not item["IPv4Addresses"][0]["Address"] == "0.0.0.0": sys.stdout.write("\t" + item["IPv4Addresses"][0]["Address"] + "\n") sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # While this example can be run remotely, it is used locally to locate the # iLO IP address SYSTEM_URL = None LOGIN_ACCOUNT = None LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" # SYSTEM_URL = "https://10.0.0.100" # LOGIN_ACCOUNT = "admin" # LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 52: Get iLO IP locally\n") get_ilo_ip(REST_OBJ) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/Legacy_Rest/configure_snmp.py0000644000175000017500000000373414556457137024200 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys from redfish import LegacyRestClient from get_resource_directory import get_resource_directory def configure_snmp(restobj, snmp_mode, snmp_alerts): resource_instances = get_resource_directory(restobj) if resource_instances: #Get URI from resource directory for instance in resource_instances: if "SnmpService." in instance.Type: snmp_path = instance.href break body = {"Mode": snmp_mode, "AlertsEnabled": snmp_alerts} response = restobj.patch(snmp_path, body) sys.stdout.write("%s" % response) if __name__ == "__main__": # When running on the server locally use the following commented values # SYSTEM_URL = None # LOGIN_ACCOUNT = None # LOGIN_PASSWORD = None # When running remotely connect using the iLO secured (https://) address, # iLO account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Create a REST object REST_OBJ = LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REST_OBJ.login() sys.stdout.write("\nEXAMPLE 26: Configure iLO SNMP Settings\n") configure_snmp(REST_OBJ, "Agentless", False) REST_OBJ.logout() python-ilorest-4.8.0.0/examples/quickstart_legacy_rest.py0000644000175000017500000000273414556457137023533 0ustar carstencarsten### # Copyright 2020 Hewlett Packard Enterprise, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ### # -*- coding: utf-8 -*- """A quickstart example for LegacyRestClient""" import sys import redfish # When running on the server locally use the following commented values # HOST = "blobstore://." # LOGIN_ACCOUNT = "None" # LOGIN_PASSWORD = "None" # When running remotely connect using the iLO address, iLO account name, # and password to send https requests SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # Create a REST object REST_OBJ = redfish.LegacyRestClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT,\ password=LOGIN_PASSWORD) # Login into the server and create a session REST_OBJ.login(auth="session") # Do a GET on a given path RESPONSE = REST_OBJ.get("/rest/v1/systems/1") # Print out the response sys.stdout.write("%s\n" % RESPONSE) # Logout of the current session REST_OBJ.logout() python-ilorest-4.8.0.0/examples/quickstart_redfish.py0000644000175000017500000000301314556457137022645 0ustar carstencarsten### # Copyright 2020 Hewlett Packard Enterprise, Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ### # -*- coding: utf-8 -*- """A quickstart example for RedfishClient""" import sys import redfish # When running on the server locally use the following commented values # HOST = "blobstore://." # LOGIN_ACCOUNT = "None" # LOGIN_PASSWORD = "None" # When running remotely connect using the iLO address, iLO account name, # and password to send https requests SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" ## Create a REDFISH object REDFISH_OBJ = redfish.RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT,\ password=LOGIN_PASSWORD) # Login into the server and create a session REDFISH_OBJ.login() # Do a GET on a given path RESPONSE = REDFISH_OBJ.get("/redfish/v1/systems/1") # Print out the response sys.stdout.write("%s\n" % RESPONSE) # Logout of the current session REDFISH_OBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/0000755000175000017500000000000014556457137017764 5ustar carstencarstenpython-ilorest-4.8.0.0/examples/Redfish/set_ilo_ntp_servers.py0000644000175000017500000001276514556457137024441 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of setting NTP servers for HPE iLO systems """ import sys import json import time from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory from reset_ilo import reset_ilo from enable_ntp_servers import enable_ntp def set_ilo_ntp_servers(_redfishobj, ntp_server_list): date_time_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) date_time_uri = managers_members_response.obj.Oem.Hpe.Links['DateTimeService']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeiLODateTime.' in instance['@odata.type']: date_time_uri = instance['@odata.id'] if date_time_uri: data = _redfishobj.get(date_time_uri) if data.dict.get('StaticNTPServers'): resp = _redfishobj.patch(date_time_uri, {'StaticNTPServers': ntp_server_list}) else: raise Exception("\'StaticNTPServers\' property is not available/modifyable.\n") #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended " \ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) ntp_data = _redfishobj.get(date_time_uri).dict.get('StaticNTPServers') print("Printing updated NTP Servers:\n") print(json.dumps(ntp_data, indent=4, sort_keys=True)) def give_client(): try: # Create a Redfish client object rf_obj = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client rf_obj.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() return rf_obj if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://16.83.61.9" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # Static NTP Servers NTP_SERVER_LIST = ["192.168.0.1", "192.168.0.2"] # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False REDFISHOBJ = give_client() #must enable ntp servers for the primary iLO network management interface enable_ntp(REDFISHOBJ, True, DISABLE_RESOURCE_DIR) sys.stdout.write("NTP Servers property has been set on the relevant ethernet management "\ "interfaces...\n") #must reset iLO for ntp servers changes to be applied. sys.stdout.write("iLO must be reset to apply the NTP Server properties and reveal the "\ " static NTP servers in the DateTime URI.\n") reset_ilo(REDFISHOBJ, DISABLE_RESOURCE_DIR) sys.stdout.write("iLO has been reset...sleeping 60 seconds before trying login.\n") time.sleep(60) #logout to release the channel REDFISHOBJ.logout() #delete the redfish object. By a new token must be issued when iLO is reset #(all channels are cleared), and this library does not cache credentials (for security reasons) #A new redfish object must be created and asigned the appropriate credentials. del REDFISHOBJ REDFISHOBJ = give_client() set_ilo_ntp_servers(REDFISHOBJ, NTP_SERVER_LIST) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/find_ilo_mac_address.py0000644000175000017500000001012214556457137024442 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of clearing IEL or IML Logs for HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def find_ilo_mac_address(_redfishobj): ethernet_data = {} resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) manager_ethernet_interfaces = managers_members_response.obj['EthernetInterfaces']\ ['@odata.id'] manager_ethernet_interfaces_response = _redfishobj.get(manager_ethernet_interfaces) manager_ethernet_interfaces_members = manager_ethernet_interfaces_response.\ obj['Members'] for _member in manager_ethernet_interfaces_members: _tmp = _redfishobj.get(_member['@odata.id']).obj ethernet_data[_member['@odata.id']] = _tmp else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#EthernetInterfaceCollection.' in instance['@odata.type'] and 'Managers' in \ instance['@odata.id']: ethernet_uri = instance['@odata.id'] ethernet_interfaces = _redfishobj.get(ethernet_uri).obj['Members'] for _ethernet_interface in ethernet_interfaces: ethernet_data[_ethernet_interface['@odata.id']] = _redfishobj.\ get(_ethernet_interface['@odata.id']).dict for iface in ethernet_data: sys.stdout.write("iLO Network Manager Interface: \'%s\'\n" % ethernet_data[iface]['Id']) sys.stdout.write("\tiLO Mac Address: \'%s\'\n" % ethernet_data[iface].get('MACAddress')) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() find_ilo_mac_address(REDFISHOBJ) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/reset_server.py0000644000175000017500000001275514556457137023060 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development, LP. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import sys import json import argparse from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError global DISABLE_RESOURCE_DIR from ilorest_util import get_resource_directory from ilorest_util import get_gen def reset_server(_redfishobj): managers_members_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Systems']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if "ComputerSystem." in instance['@odata.type']: managers_members_uri = instance['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) if managers_members_response: path = managers_members_response.obj["Actions"]["#ComputerSystem.Reset"]["target"] body = dict() resettype = ['ForceRestart','GracefulRestart'] body["Action"] = "ComputerSystem.Reset" for reset in resettype: if reset.lower() == "forcerestart": body['ResetType'] = "ForceRestart" resp = _redfishobj.post(path, body) elif reset.lower() == "gracefulrestart": body['ResetType'] = "GracefulRestart" resp = _redfishobj.post(path, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended Message "\ "Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) def reset_server_gen9(_redfishobj): managers_uri = "/redfish/v1/Systems/1/" managers_response = _redfishobj.get(managers_uri) system_path = managers_response.obj["Actions"]["#ComputerSystem.Reset"]["target"] print(system_path) body = dict() body["Action"] = "Reset" body["ResetType"] = "ForceRestart" resp = _redfishobj.post(system_path, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended Message "\ "Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # Initialize parser parser = argparse.ArgumentParser(description = "Script to upload and flash NVMe FW") parser.add_argument( '-i', '--ilo', dest='ilo_ip', action="store", help="iLO IP of the server", default=None) parser.add_argument( '-u', '--user', dest='ilo_user', action="store", help="iLO username to login", default=None) parser.add_argument( '-p', '--password', dest='ilo_pass', action="store", help="iLO password to log in.", default=None) options = parser.parse_args() system_url = "https://" + options.ilo_ip print (system_url) # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = True try: # Create a Redfish client object redfish_obj = RedfishClient(base_url=system_url, username=options.ilo_user, password=options.ilo_pass) # Login with the Redfish client redfish_obj.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() (ilogen,_) = get_gen(redfish_obj) print ("Generation is ", ilogen) if int(ilogen) == 5: reset_server(redfish_obj) else: reset_server_gen9(redfish_obj) redfish_obj.logout() python-ilorest-4.8.0.0/examples/Redfish/upload_firmware_ilo_repository_with_compsig.py0000644000175000017500000001103214556457137031431 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of uploading a firmware component with a size less than 32 GB, and associated compsig signature file to the iLO Repository. """ import os import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def upload_firmware(_redfishobj, firmware_loc, compsig_loc, update_repo=True, update_target=False): resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #resource directory is not available so we will navigate through paths manually update_service_uri = _redfishobj.root.obj['UpdateService']['@odata.id'] else: #obtain all account instances from resource directory for instance in resource_instances: if '#UpdateService.' in instance['@odata.type']: update_service_uri = instance['@odata.id'] update_service_response = _redfishobj.get(update_service_uri) path = update_service_response.obj.HttpPushUri body = [] json_data = {'UpdateRepository': update_repo, 'UpdateTarget': update_target, 'ETag': 'atag', 'Section': 0} session_key = _redfishobj.session_key filename = os.path.basename(firmware_loc) with open(firmware_loc, 'rb') as fle: output = fle.read() compsigname = os.path.basename(compsig_loc) with open(compsig_loc, 'rb') as cle: compsigoutput = cle.read() session_tuple = ('sessionKey', session_key) parameters_tuple = ('parameters', json.dumps(json_data)) file_tuple = ('file', (filename, output, 'application/octet-stream')) compsig_tuple = ('compsig', (compsigname, compsigoutput, 'application/octet-stream')) #Build the payload from each multipart-form data tuple body.append(session_tuple) body.append(parameters_tuple) body.append(compsig_tuple) body.append(file_tuple) #Create our header dictionary header = {'Cookie': 'sessionKey=' + session_key} #We pass the whole list payload to post resp = _redfishobj.post(path, body, headers=header) if resp.status == 400: sys.stderr.write("Failed to upload firmware... Error: '%s'\n" % str(resp)) elif not resp.status in [200, 201]: sys.stderr.write("An http response of '%s' was returned.\n" % resp.status) else: print("Upload complete!\n") if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.0" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.0" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # The path to the firmware component file to upload. # .rpm and .zip component are also valid. # FIRMWARE_PATH = "/path/to/cpxxxxxx.exe" COMPSIG_PATH = "/path/to//cpxxxxxx.compsig" # Upload the firmware file to the iLO Repository UPDATE_REPO = True # Update the system with the firmware file UPDATE_TARGET = False # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() upload_firmware(REDFISHOBJ, FIRMWARE_PATH, COMPSIG_PATH, UPDATE_REPO, UPDATE_TARGET) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/get_schema.py0000644000175000017500000000523214556457137022437 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of obtaining system schema data """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError def get_schema(_redfishobj): schema_members_uris = [] schema_members_expanded = {} schema_uri = _redfishobj.root.obj['JsonSchemas']['@odata.id'] schema_response = _redfishobj.get(schema_uri) schema_members_uris = schema_response.obj['Members'] for member in schema_members_uris: data = _redfishobj.get(member['@odata.id']).dict instance_id = data['Location'].index(next(iter(data['Location']))) schema_uri = data['Location'][instance_id]['Uri'] schema = _redfishobj.get(schema_uri).dict #I am just replacing the URI link for the sub-schema with the actual schema. You will #see EVERYTHING _tmp = {schema_uri + ' ->': schema} data['Location'][instance_id]['Uri'] = _tmp schema_members_expanded[member['@odata.id']] = data print(json.dumps(schema_members_expanded, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() get_schema(REDFISHOBJ) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/set_license_key.py0000644000175000017500000001120314556457137023500 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of adding an license key for HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def set_license_key(_redfishobj, ilo_key): ilo_lic_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) ilo_lic_uri = managers_members_response.obj.Oem.Hpe.Links['LicenseService']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeiLOLicense.' in instance['@odata.type']: ilo_lic_uri = instance['@odata.id'] if ilo_lic_uri: ilo_license_collection = _redfishobj.get(ilo_lic_uri) ilo_license_member_uri = next(iter(ilo_license_collection.obj['Members']))['@odata.id'] try: ilo_license_data = _redfishobj.get(ilo_license_member_uri).obj['ConfirmationRequest']\ ['EON'] except KeyError: sys.stdout.write("This machine will not show the full License Key.\n") ilo_license_data = _redfishobj.get(ilo_license_member_uri).obj['LicenseKey'] sys.stdout.write("Current iLO License Data:\n") print(json.dumps(ilo_license_data, indent=4, sort_keys=True)) resp = _redfishobj.post(ilo_lic_uri, {'LicenseKey' : ilo_key}) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) sys.stderr.write("Check the validity of your license key...\n") except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO " \ "Extended Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # Must be a valid iLO License Key ILO_LICENSE_KEY = "XXXX-XXXX-XXXX-XXXX-XXXXX" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = True try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() set_license_key(REDFISHOBJ, ILO_LICENSE_KEY) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/add_user_account.py0000644000175000017500000001646014556457137023647 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of adding a user account by iLO privileges or redfish standard roles """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError global DISABLE_RESOURCE_DIR from ilorest_util import get_resource_directory from ilorest_util import get_gen def add_ilo_user_account(_redfishobj, new_loginname, new_username, new_password, role_id, \ privilege_dict): resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #resource directory is not available so we will navigate through paths manually to obtain #account info account_service_uri = _redfishobj.root.obj['AccountService']['@odata.id'] account_service_response = _redfishobj.get(account_service_uri) account_collection_uri = account_service_response.obj['Accounts']['@odata.id'] #Add via role id body = {"RoleId": role_id} else: #obtain all account instances from resource directory for instance in resource_instances: if '#ManagerAccountCollection.' in instance['@odata.type']: account_collection_uri = instance['@odata.id'] body = {"Oem": {"Hpe": {"Privileges": {}}}} #HPE server, so add via privileges for priv in privilege_dict: body["Oem"]["Hpe"]["Privileges"][priv] = privilege_dict[priv] #Add login name body["Oem"]["Hpe"]["LoginName"] = new_loginname #Fill in the rest of the payload body["UserName"] = new_username body["Password"] = new_password #We pass the URI and the dictionary as a POST command (part of the redfish object) resp = _redfishobj.post(account_collection_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, sort_keys=True)) except Exception: sys.stderr.write("A response error occurred, unable to access iLO Extended Message "\ "Info...") elif not resp.status in [200, 201]: sys.stderr.write("An http response of '%s' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) def add_ilo_user_account_gen9(_redfishobj, new_loginname, new_username, new_password): account_collection_uri = "/redfish/v1/AccountService/Accounts/" #Add via gen9 priv dic body = {'Oem': {'Hp': {'Privileges': {"LoginPriv": True, "RemoteConsolePriv": True, "UserConfigPriv": True, "VirtualMediaPriv": True, "VirtualPowerAndResetPriv": True, "iLOConfigPriv": True}, 'LoginName': new_loginname}},'UserName': new_username, 'Password': new_password} #We pass the URI and the dictionary as a POST command (part of the redfish object) resp = _redfishobj.post(account_collection_uri, body) print(json.dumps(resp.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.0" # "https://ilo.hostname" if len(sys.argv) == 4: # Remote mode SYSTEM_URL = sys.argv[1] LOGIN_ACCOUNT = sys.argv[2] LOGIN_PASSWORD = sys.argv[3] else: # Local mode SYSTEM_URL = None LOGIN_ACCOUNT = None LOGIN_PASSWORD = None #account login name (iLO GUI actually considers this to be 'UserName', but #this is the redfish standard username) ACCOUNT_LOGIN_NAME = "batman" #account user name (iLO GUI actually considers this to be 'LoginName', but #this is the redfish login) ACCOUNT_USER_NAME = "bruce_wayne" #account password ACCOUNT_PASSWORD = "thedarkknight123" #A predefined role for the user, (The redfish standard method for accounts). #This is a translated to a pre-configured arrangement of privileges on HPE servers ROLE_ID = "Administrator" #Administrator, ReadOnly or Operator are available #Dictionary of modifiable privileges for HPE servers (modify this if you wish to directly set #an account with specific privileges PRIVILEGE_DICT = {"iLOConfigPriv": True, "VirtualMediaPriv": True, "RemoteConsolePriv": True,\ "UserConfigPriv": True, "VirtualPowerAndResetPriv": True, \ "SystemRecoveryConfigPriv": False, "LoginPriv": True, \ "HostStorageConfigPriv": True, "HostNICConfigPriv": True, \ "HostBIOSConfigPriv": True} # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False #For certificate login #ca_cert_data = {} #ca_cert_data["cert_file"] = "c:\\test\\ppcacuser.crt" #ca_cert_data["key_file"] = "c:\\test\\ppcacuserpriv.key" #ca_cert_data["key_password"] = "password" #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD) REDFISHOBJ.login() # For Certificate login #REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, password=LOGIN_PASSWORD, ca_cert_data=ca_cert_data) #REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, ca_cert_data=ca_cert_data) # Login with the Redfish client #if ca_cert_data is None: # REDFISHOBJ.login() #else: # REDFISHOBJ.login(auth='certificate') except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() #obtain all account instances, by navigating set paths and keys to find the relevant URI #(account_collection_uri, accounts, rd) = get_accounts(redfishobj, DISABLE_RESOURCE_DIR) #print("\n\nShowing accounts before changes:\n\n") #show_accounts(redfishobj, accounts) #if account_collection_uri and accounts: #add specified account (ilogen,_) = get_gen(REDFISHOBJ) print ("Generation is ", ilogen) if int(ilogen) >= 5: add_ilo_user_account(REDFISHOBJ,ACCOUNT_LOGIN_NAME,ACCOUNT_USER_NAME,ACCOUNT_PASSWORD,ROLE_ID,PRIVILEGE_DICT) else: add_ilo_user_account_gen9(REDFISHOBJ,ACCOUNT_LOGIN_NAME,ACCOUNT_USER_NAME,ACCOUNT_PASSWORD) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/set_uid_light.py0000644000175000017500000001105514556457137023163 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of setting the UID light """ import sys import json import time from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def set_uid_light(_redfishobj): body = dict() systems_members_uri = None systems_members_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#ComputerSystem.' in instance['@odata.type']: systems_members_uri = instance['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) if systems_members_response and systems_members_uri: print("Current Indicator LED Status: \'%s\'\n" % systems_members_response.dict.\ get("IndicatorLED")) if "Off" in systems_members_response.dict.get("IndicatorLED"): print("Will illuminate indicator LED.\n") body["IndicatorLED"] = "Lit" else: print("Will extinguish indicator LED.\n") body["IndicatorLED"] = "Off" resp = _redfishobj.patch(systems_members_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) time.sleep(10) #going to wait 10 seconds before obtaining the LED indicator state sys.stdout.write("\nUpdated Indicator LED Status: \'%s\'\n" % _redfishobj.\ get(systems_members_uri).dict['IndicatorLED']) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = True try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() set_uid_light(REDFISHOBJ) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/reset_ESKM_eventlog.py0000644000175000017500000001125214556457137024203 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of resetting the ESKM event log for HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def reset_ESKM_eventlog(_redfishobj): body = dict() security_service_eskm_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) security_service_uri = managers_members_response.obj.Oem.Hpe.Links\ ['SecurityService']['@odata.id'] security_service_response = _redfishobj.get(security_service_uri) security_service_eskm_uri = security_service_response.obj.Links['ESKM']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeESKM.' in instance['@odata.type']: security_service_eskm_uri = instance['@odata.id'] break if security_service_eskm_uri: security_service_eskm_uri = _redfishobj.get(security_service_uri).obj.Links\ ['ESKM']['@odata.id'] security_service_eskm_resp = _redfishobj.get(security_service_eskm_uri) security_service_eskm_clearlog_uri = security_service_eskm_resp.obj['Actions']\ ['#HpeESKM.ClearESKMLog']['target'] body["Action"] = "HpeESKM.ClearESKMLog" #We pass the URI and the dictionary as a POST command (part of the redfish object) resp = _redfishobj.post(security_service_eskm_clearlog_uri, body) #If iLO responds with something outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = True try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() reset_ESKM_eventlog(REDFISHOBJ) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/get_bios_setting.py0000644000175000017500000001014714556457137023671 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of retrieving bios settings """ import sys import json import argparse from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError global DISABLE_RESOURCE_DIR #from ilorest_util import get_resource_directory #from ilorest_util import get_gen def get_bios_setting(_redfishobj): bios_uri = None bios_data = None resource_instances = _redfishobj.get_resource_directory() if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) bios_uri = systems_members_response.obj['Bios']['@odata.id'] bios_data = _redfishobj.get(bios_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#Bios.' in instance['@odata.type']: bios_uri = instance['@odata.id'] bios_data = _redfishobj.get(bios_uri) break if bios_data: print("\n\nShowing bios attributes before changes:\n\n") print(json.dumps(bios_data.dict, indent=4, sort_keys=True)) def get_bios_setting_gen9(_redfishobj): bios_uri = "/redfish/v1/systems/1/bios" bios_data = None #Use Resource directory to find the relevant URI bios_data = _redfishobj.get(bios_uri) if bios_data: print("\n\nShowing bios attributes before changes:\n\n") print(json.dumps(bios_data.dict, indent=4, sort_keys=True)) if __name__ == "__main__": SYSTEM_URL = input("Enter iLO IP Address: ") LOGIN_ACCOUNT = input("Enter Username: ") LOGIN_PASSWORD = input("Enter password: ") # Initialize parser ## parser = argparse.ArgumentParser(description = "Script to upload and flash NVMe FW") ## ## parser.add_argument( ## '-i', ## '--ilo', ## dest='ilo_ip', ## action="store", ## help="iLO IP of the server", ## default=None) ## parser.add_argument( ## '-u', ## '--user', ## dest='ilo_user', ## action="store", ## help="iLO username to login", ## default=None) ## parser.add_argument( ## '-p', ## '--password', ## dest='ilo_pass', ## action="store", ## help="iLO password to log in.", ## default=None) ## ## options = parser.parse_args() ## ## system_url = "https://" + options.ilo_ip ## print (system_url) DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object #redfish_obj = RedfishClient(base_url=system_url, username=options.ilo_user, password=options.ilo_pass) redfish_obj = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client redfish_obj.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() (ilogen,_) = redfish_obj.get_gen() print ("Generation is ", ilogen) if int(ilogen) == 5: get_bios_setting(redfish_obj) else: get_bios_setting_gen9(redfish_obj) redfish_obj.logout() python-ilorest-4.8.0.0/examples/Redfish/clear_ahs_data.py0000644000175000017500000001053514556457137023254 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of clearing AHS data for HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def clear_ahs_data(_redfishobj): active_health_system_clear_log_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) active_health_system_uri = managers_members_response.obj.Oem.Hpe.Links\ ['ActiveHealthSystem']['@odata.id'] active_health_system_response = _redfishobj.get(active_health_system_uri) active_health_system_clear_log_uri = active_health_system_response.obj['Actions']\ ['#HpeiLOActiveHealthSystem.ClearLog']['target'] else: for instance in resource_instances: if '#HpeiLOActiveHealthSystem.' in instance['@odata.type']: active_health_system_uri = instance['@odata.id'] active_health_system_response = _redfishobj.get(active_health_system_uri) active_health_system_clear_log_uri = active_health_system_response['Actions']\ ['#HpeiLOActiveHealthSystem.ClearLog']['target'] break if active_health_system_clear_log_uri: body = {"Action": "HpeiLOActiveHealthSystem.ClearLog"} resp = _redfishobj.redfish_client.post(active_health_system_clear_log_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4,\ sort_keys=True)) except Exception: sys.stderr.write("A response error occurred, unable to access iLO Extended " \ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() clear_ahs_data(REDFISHOBJ) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/set_ethernet_management_iface_static_ip.py0000644000175000017500000001715214556457137030417 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of setting the Manager ethernet interface static IP """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def set_ilo_static_ipv4(_redfishobj, ipv4_dict, dns_dict): ethernet_data = {} body = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) manager_ethernet_interfaces = managers_members_response.obj['EthernetInterfaces']\ ['@odata.id'] manager_ethernet_interfaces_response = _redfishobj.get(manager_ethernet_interfaces) manager_ethernet_interfaces_members = manager_ethernet_interfaces_response.\ obj['Members'] for _member in manager_ethernet_interfaces_members: _tmp = _redfishobj.get(_member['@odata.id']).obj ethernet_data[_member['@odata.id']] = _tmp else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#EthernetInterfaceCollection.' in instance['@odata.type'] and 'Managers' in \ instance['@odata.id']: ethernet_uri = instance['@odata.id'] ethernet_interfaces = _redfishobj.get(ethernet_uri).obj['Members'] for _ethernet_interface in ethernet_interfaces: ethernet_data[_ethernet_interface['@odata.id']] = _redfishobj.\ get(_ethernet_interface['@odata.id']).dict break if ethernet_data: print("\n\nShowing all available ethernet management interfaces before changes:\n\n") for interface in ethernet_data: sys.stdout.write("Ethernet Management Inteface \'%s\'\n" % ethernet_data\ [interface].get('Id')) sys.stdout.write("\'DHCPv4\':\n") if ethernet_data[interface].get('DHCPv4'): print(json.dumps(ethernet_data[interface].get('DHCPv4'), indent=4, sort_keys=True)) else: print(json.dumps(ethernet_data[interface]['Oem']['Hpe'].get('DHCPv4'), indent=4, \ sort_keys=True)) sys.stdout.write("\'IPv4\':\n") if ethernet_data[interface].get('IPv4StaticAddresses'): print(json.dumps(ethernet_data[interface].get('IPv4Addresses'), indent=4, \ sort_keys=True)) sys.stdout.write("\'StaticNameServers\':\n") if ethernet_data[interface].get('StaticNameServers'): print(json.dumps(ethernet_data[interface].get('StaticNameServers'), indent=4, \ sort_keys=True)) for ethernet in ethernet_data: sys.stdout.write("Ethernet Interface: %s\n" % ethernet) ans = input("Would you like to modify this interface? (y/n)\n") if "n" in ans: continue if 'DHCPv4' in ethernet_data[ethernet]: if ethernet_data[ethernet]['DHCPv4'].get('UseDNSServers'): resp = _redfishobj.patch(ethernet, {"DHCPv4": {"UseDNSServers": False}}) ilo_response(_redfishobj, resp) if ethernet_data[ethernet]['DHCPv4'].get('UseGateway'): resp = _redfishobj.pathc(ethernet, {"DHCPv4": {"UseGateway": False}}) ilo_response(_redfishobj, resp) if 'IPv4StaticAddresses' in ethernet_data[ethernet]: body.update({"IPv4Addresses": [ipv4_dict]}) if 'StaticNameServers' in ethernet_data[ethernet]: body.update({"StaticNameServers" : [dns_dict.get('PrimaryDNS'), \ dns_dict.get('SecondaryDNS')]}) else: body.update({"Oem": {"Hpe": {"IPv4": {"DNSServers": [dns_dict.get('PrimaryDNS'), \ dns_dict.get('SecondaryDNS')]}}}}) resp = _redfishobj.patch(ethernet, body) ilo_response(_redfishobj, resp) break def ilo_response(_redfishobj, resp): if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success! Suggest to reset iLO for settings to take effect.\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #IPv4 settings for Address, Gateway and SubnetMask as well as DNS. IPV4_DICT = {'Address':'16.83.61.123', \ 'Gateway':'16.83.60.1', \ 'SubnetMask':'255.255.252.0' \ } DNS_DICT = {'PrimaryDNS':'16.110.135.52', \ 'SecondaryDNS':'16.110.135.51' \ } # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() set_ilo_static_ipv4(REDFISHOBJ, IPV4_DICT, DNS_DICT) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/software_firmware_inventory.py0000644000175000017500000000766314556457137026215 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of viewing the firmware inventory on HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def get_inventory_uri(_redfishobj, select): update_service_uri = None inventory_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI update_service_uri = _redfishobj.root.obj['UpdateService']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#UpdateService.' in instance['@odata.type']: update_service_uri = instance['@odata.id'] if update_service_uri: update_service_resp = _redfishobj.get(update_service_uri) if "software" in select.lower(): inventory_uri = update_service_resp.obj['SoftwareInventory']['@odata.id'] elif "firmware" in select.lower(): inventory_uri = update_service_resp.obj['FirmwareInventory']['@odata.id'] else: raise Exception("Invalid selection provided: Please select 'software' or 'firmware' " \ "to obtain the relevant invetory data.") sys.stdout.write("Printing data in invetory: %s\n" % inventory_uri) get_inventory(_redfishobj, inventory_uri) def get_inventory(_redfishobj, inventory_uri): _members = _redfishobj.get(inventory_uri).obj['Members'] if not _members: sys.stderr.write("\tInventory empty.\n") else: for inventory_item in _members: _resp = _redfishobj.get(inventory_item['@odata.id']) sys.stdout.write("Printing contents of inventory item, \'%s\':\'%s\'\n" % \ (_resp.dict.get('Name'), _resp.dict.get('Description'))) print(json.dumps(_resp.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. SELECT = "firmware" #provide either 'software' or 'firmware' for inventory selection DISABLE_RESOURCE_DIR = True try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() get_inventory_uri(REDFISHOBJ, SELECT) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/set_bios_iscsi.py0000644000175000017500000001134414556457137023342 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of setting an ISCSI boot instance for HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def set_bios_iscsi(_redfishobj, iscsi_properties): iscsi_uri = None iscsi_data = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) bios_uri = systems_members_response.obj['Bios']['@odata.id'] bios_response = _redfishobj.get(bios_uri) iscsi_uri = bios_response.obj.Oem.Hpe.Links['iScsi']['@odata.id'] iscsi_data = _redfishobj.get(iscsi_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeiSCSISoftwareInitiator.' in instance['@odata.type']: iscsi_uri = instance['@odata.id'] iscsi_data = _redfishobj.get(iscsi_uri) if iscsi_data: for indx, inst in enumerate(iscsi_data.obj['iSCSISources']): if iscsi_properties['iSCSIBootInstance'] == indx: iscsi_data.dict['iSCSISources'][indx].update(iscsi_properties) resp = _redfishobj.patch(iscsi_uri, {'iSCSISources' : iscsi_data.dict['iSCSISources']}) #If iLO responds with soemthing outside of 200 or 201 then lets check the #iLO extended info error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], \ indent=4, sort_keys=True)) except Exception as excp: print(json.dumps(resp.ori, indent=4, sort_keys=True)) sys.stderr.write("A response error occurred, unable to access iLO " \ "Extended Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success! A system reboot will be required to complete the change.\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) break if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #iscsi properties ISCSI_PROPERTIES = {"iSCSIBootInstance": 2, \ "iSCSITargetName": "Target", \ "iSCSIAttemptName": "Empty", \ "iSCSIConnectRetry": 5} # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() set_bios_iscsi(REDFISHOBJ, ISCSI_PROPERTIES) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/change_bios_setting.py0000644000175000017500000001153614556457137024342 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of changing BIOS settings """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def change_bios_setting(_redfishobj, bios_property, property_value, bios_password): bios_uri = None bios_data = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) bios_uri = systems_members_response.obj['Bios']['@odata.id'] bios_data = _redfishobj.get(bios_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#Bios.' in instance['@odata.type']: bios_uri = instance['@odata.id'] bios_data = _redfishobj.get(bios_uri) break if bios_data: print("\n\nShowing BIOS attributes before changes:\n\n") print(json.dumps(bios_data.dict, indent=4, sort_keys=True)) if bios_uri: #BIOS settings URI is needed bios_settings_uri = bios_data.obj['@Redfish.Settings']['SettingsObject']['@odata.id'] body = {'Attributes': {bios_property: property_value}} #update BIOS password if bios_password: _redfishobj.bios_password = bios_password resp = _redfishobj.patch(bios_settings_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("\nSuccess!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) #uncomment if you would like to see the full list of attributes #print("\n\nShowing BIOS attributes after changes:\n\n") #bios_data = _redfishobj.get(bios_uri) #print(json.dumps(bios_data.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" BIOS_PASSWORD = "" #provide the attribute name and the associated attribute value. Note: some, values may #be containers (arrays or dictionaries) so keep this in mind. ATTRIBUTE = "AdminName" ATTRIBUTE_VAL = "Luigi" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() change_bios_setting(REDFISHOBJ, ATTRIBUTE, ATTRIBUTE_VAL, BIOS_PASSWORD) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/clear_ilo_IEL_IML_log.py0000644000175000017500000001203014556457137024316 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of clearing IEL or IML Logs for HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def clear_ilo_event_log(_redfishobj, clear_IML_IEL): clear_log_services_uri = [] resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) log_services_uri = systems_members_response.obj['LogServices']['@odata.id'] log_services_response = _redfishobj.get(log_services_uri) log_services_uris = log_services_response.obj['Members'] for log_services_uri in log_services_uris: log_services_response = _redfishobj.get(log_services_uri['@odata.id']) clear_log_services_uri.append(log_services_response.obj['Actions']\ ['#LogService.ClearLog']['target']) else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#LogService.' in instance['@odata.type']: log_service_uri = instance['@odata.id'] clear_log_services_uri.append(_redfishobj.get(log_service_uri).dict['Actions']\ ['#LogService.ClearLog']['target']) if clear_log_services_uri: body = {"Action": "LogService.ClearLog"} for path in clear_log_services_uri: if ("IEL" in clear_IML_IEL and "IEL" in path) or ("IML" in clear_IML_IEL and \ "IML" in path): if "IEL" in path: sys.stdout.write("Clearing IEL log.\n") else: sys.stdout.write("Clearing IML log.\n") resp = _redfishobj.post(path, body) else: continue #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended #info error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO "\ "Extended Message Info...\n") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False CLEAR_IML_IEL = "IML" # provide either the string IML or IEL try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() clear_ilo_event_log(REDFISHOBJ, CLEAR_IML_IEL) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/set_active_ilo_nic.py0000644000175000017500000001271614556457137024167 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of setting the active Manager NIC """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def set_active_ilo_nic(_redfishobj): ethernet_data = {} resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) manager_ethernet_interfaces = managers_members_response.obj['EthernetInterfaces']\ ['@odata.id'] manager_ethernet_interfaces_response = _redfishobj.get(manager_ethernet_interfaces) manager_ethernet_interfaces_members = manager_ethernet_interfaces_response.\ obj['Members'] for _member in manager_ethernet_interfaces_members: _tmp = _redfishobj.get(_member['@odata.id']).obj ethernet_data[_member['@odata.id']] = _tmp else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#EthernetInterfaceCollection.' in instance['@odata.type'] and 'Managers' in \ instance['@odata.id']: ethernet_uri = instance['@odata.id'] ethernet_interfaces = _redfishobj.get(ethernet_uri).obj['Members'] for _ethernet_interface in ethernet_interfaces: ethernet_data[_ethernet_interface['@odata.id']] = _redfishobj.\ get(_ethernet_interface['@odata.id']).dict break if ethernet_data: print("\n\nShowing all available ethernet management interfaces before changes:\n\n") for interface in ethernet_data: sys.stdout.write("Ethernet Management Inteface \'%s\'\n" % ethernet_data\ [interface].get('Id')) sys.stdout.write("\t\'Interface Enabled\': %s\n" % ethernet_data[interface].\ get('InterfaceEnabled')) for ethernet in ethernet_data: sys.stdout.write("Ethernet Interface: %s\n" % ethernet) ans = input("Would you like to enable/disable this interface? (enable/disable)\n") if "en" in ans: body = {"InterfaceEnabled": True} else: body = {"InterfaceEnabled": False} resp = _redfishobj.patch(ethernet, body) if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success! You will need to reset iLO for this change to take effect.\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) break if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() set_active_ilo_nic(REDFISHOBJ) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/upload_firmware_ilo_repository.py0000644000175000017500000001017214556457137026661 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of uploading firmware to the iLO Repository for flashing """ import os import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def upload_firmware(_redfishobj, firmware_loc, update_repo=True, update_target=False): resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #resource directory is not available so we will navigate through paths manually update_service_uri = _redfishobj.root.obj['UpdateService']['@odata.id'] else: #obtain all account instances from resource directory for instance in resource_instances: if '#UpdateService.' in instance['@odata.type']: update_service_uri = instance['@odata.id'] update_service_response = _redfishobj.get(update_service_uri) path = update_service_response.obj.HttpPushUri body = [] json_data = {'UpdateRepository': update_repo, 'UpdateTarget': update_target, 'ETag': 'atag', 'Section': 0} session_key = _redfishobj.session_key filename = os.path.basename(firmware_loc) with open(firmware_loc, 'rb') as fle: output = fle.read() session_tuple = ('sessionKey', session_key) parameters_tuple = ('parameters', json.dumps(json_data)) file_tuple = ('file', (filename, output, 'application/octet-stream')) #Build the payload from each multipart-form data tuple body.append(session_tuple) body.append(parameters_tuple) body.append(file_tuple) #Create our header dictionary header = {'Cookie': 'sessionKey=' + session_key} #We pass the whole list payload to post resp = _redfishobj.post(path, body, headers=header) if resp.status == 400: sys.stderr.write("Failed to upload firmware...") elif not resp.status in [200, 201]: sys.stderr.write("An http response of '%s' was returned.\n" % resp.status) else: print("Upload complete!\n") if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.0" # "https://ilo.hostname" SYSTEM_URL = "https://16.83.61.104" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # The path to the firmware file to upload FIRMWARE_PATH = "C:\\Users\\oconnogr\\git\\python-restful-interface-tool\\src\\ilo5_230_p31.fwpkg" # Upload the firmware file to the iLO Repository UPDATE_REPO = True # Update the system with the firmware file UPDATE_TARGET = False # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = True try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() upload_firmware(REDFISHOBJ, FIRMWARE_PATH, UPDATE_REPO, UPDATE_TARGET) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/bios_revert_default.py0000644000175000017500000000765614556457137024403 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example for reverting the BIOS to default values """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def bios_revert_default(_redfishobj): bios_reset_action_uri = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) bios_uri = systems_members_response.obj['Bios']['@odata.id'] bios_response = _redfishobj.get(bios_uri) bios_reset_action_uri = bios_response.obj['Actions']['#Bios.ResetBios']['target'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#Bios.' in instance['@odata.type']: bios_uri = instance['@odata.id'] bios_data = _redfishobj.get(bios_uri) bios_reset_action_uri = bios_data.obj['Actions']['#Bios.ResetBios']['target'] break body = {'Action': 'Bios.ResetBios', 'ResetType':'default'} resp = _redfishobj.post(bios_reset_action_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, sort_keys=True)) except Exception: sys.stderr.write("A response error occurred, unable to access iLO Extended Message "\ "Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT,\ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() bios_revert_default(REDFISHOBJ) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/enable_secure_boot.py0000644000175000017500000001065414556457137024163 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of enabling secure boot """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def enable_secure_boot(_redfishobj, secure_boot_enable): secure_boot_uri = None secure_boot_data = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) secure_boot_uri = systems_members_response.obj['SecureBoot']['@odata.id'] secure_boot_data = _redfishobj.get(secure_boot_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#SecureBoot.' in instance['@odata.type']: secure_boot_uri = instance['@odata.id'] secure_boot_data = _redfishobj.get(secure_boot_uri) if secure_boot_data: print("\n\nShowing Secure Boot properties before changes:\n\n") print(json.dumps(secure_boot_data.dict, indent=4, sort_keys=True)) if secure_boot_uri: body = {'SecureBootEnable': secure_boot_enable} resp = _redfishobj.patch(secure_boot_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception: sys.stderr.write("A response error occurred, unable to access iLO Extended " \ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("\nSuccess!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) print("\n\nShowing Secure Boot properties after changes:\n\n") secure_boot_data = _redfishobj.get(secure_boot_uri) print(json.dumps(secure_boot_data.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #Properties: #secure boot enable property SECURE_BOOT_ENABLE = True # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() enable_secure_boot(REDFISHOBJ, SECURE_BOOT_ENABLE) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/test_ESKM_connection.py0000644000175000017500000001040514556457137024353 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of testing connection to the ESKM system for HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def test_ESKM_connection(_redfishobj): eskm_uri = None body = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) security_service_uri = managers_members_response.obj.Oem.Hpe.Links['SecurityService']\ ['@odata.id'] security_service_response = _redfishobj.get(security_service_uri) eskm_uri = security_service_response.obj.Links['ESKM']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeESKM.' in instance['@odata.type']: eskm_uri = instance['@odata.id'] break if eskm_uri: eskm_test_conn_uri = _redfishobj.get(eskm_uri).obj['Actions']\ ['#HpeESKM.TestESKMConnections']['target'] body["Action"] = "HpeESKM.TestESKMConnections" resp = _redfishobj.post(eskm_test_conn_uri, body) #If iLO responds with something outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() test_ESKM_connection(REDFISHOBJ) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/computer_details.py0000644000175000017500000000607514556457137023711 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of gathering the computer system details """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def computer_details(_redfishobj): systems_members_uri = None systems_members_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#ComputerSystem.' in instance['@odata.type']: systems_members_uri = instance['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) print("\n\nPrinting computer system details:\n\n") print(json.dumps(systems_members_response.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://16.83.61.9" LOGIN_ACCOUNT = "Administrator" LOGIN_PASSWORD = "password" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() computer_details(REDFISHOBJ) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/set_ESKM_username_password.py0000644000175000017500000001160514556457137025574 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of setting the ESKM username and password for HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def ESKM_username_pass(_redfishobj, eskm_username, eskm_password, eskm_accountgroup, \ eskm_primarykeyserver_addr, eskm_primarykeyserver_port): eskm_uri = None body = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) security_service_uri = managers_members_response.obj.Oem.Hpe.Links['SecurityService']\ ['@odata.id'] security_service_response = _redfishobj.get(security_service_uri) eskm_uri = security_service_response.obj.Links['ESKM']['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeESKM.' in instance['@odata.type']: eskm_uri = instance['@odata.id'] break if eskm_uri: body["KeyManagerConfig"] = dict() body["KeyManagerConfig"]["LoginName"] = eskm_username body["KeyManagerConfig"]["Password"] = eskm_password body["KeyManagerConfig"]["AccountGroup"] = eskm_accountgroup body["KeyManagerConfig"]["ESKMLocalCACertificateName"] = "" body["PrimaryKeyServerAddress"] = eskm_primarykeyserver_addr body["PrimaryKeyServerPort"] = eskm_primarykeyserver_port resp = _redfishobj.patch(eskm_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" ESKM_USERNAME = "admin" ESKM_PASSWORD = "password" ESKM_ACCOUNTGROUP = "group" ESKM_PRIMARYKEYSERVER_ADDR = "192.168.1.10" ESKM_PRIMARYKEYSERVER_PORT = 5927 # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() ESKM_username_pass(REDFISHOBJ, ESKM_USERNAME, ESKM_PASSWORD, ESKM_ACCOUNTGROUP, \ ESKM_PRIMARYKEYSERVER_ADDR, ESKM_PRIMARYKEYSERVER_PORT) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/expand_data.py0000644000175000017500000000431514556457137022611 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of expanding data responses """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError def expand_data(_redfishobj, expand_url="/redfish/v1/"): response = _redfishobj.get(expand_url) exp_response = _redfishobj.get(expand_url+'?$expand=.') sys.stdout.write('Standard response:\n') sys.stdout.write('\t'+str(response.dict)+'\n') sys.stdout.write('Expanded response:\n') sys.stdout.write('\t'+str(exp_response.dict)+'\n') if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #url to be expanded EXPAND_URL = "/redfish/v1/systems/" try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() expand_data(REDFISHOBJ, EXPAND_URL) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/get_logical_drives.py0000644000175000017500000001465614556457137024177 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of gathering the Logical Drives on an HPE iLO system """ import sys import json import argparse from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from ilorest_util import get_resource_directory from ilorest_util import get_gen def get_SmartArray_LogicalDrives(_redfishobj): smartstorage_response = [] smartarraycontrollers = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) smart_storage_uri = systems_members_response.obj.Oem.Hpe.Links\ ['SmartStorage']['@odata.id'] smart_storage_arraycontrollers_uri = _redfishobj.get(smart_storage_uri).obj.Links\ ['ArrayControllers']['@odata.id'] smartstorage_response = _redfishobj.get(smart_storage_arraycontrollers_uri).obj['Members'] else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#HpeSmartStorageArrayControllerCollection.' in instance['@odata.type']: smartstorage_uri = instance['@odata.id'] print (smartstorage_uri) smartstorage_response = _redfishobj.get(smartstorage_uri).obj['Members'] break for controller in smartstorage_response: smartarraycontrollers[controller['@odata.id']] = _redfishobj.get(controller['@odata.id']).obj sys.stdout.write("Logical Drive URIs for Smart Storage Array Controller \'%s\' : \n" \ % smartarraycontrollers[controller['@odata.id']].get('Id')) logicaldrives_uri = smartarraycontrollers[controller['@odata.id']].Links\ ['LogicalDrives']['@odata.id'] logicaldrives_resp = _redfishobj.get(logicaldrives_uri) smartarraycontrollers[controller['@odata.id']]['LogicalDrives'] = logicaldrives_resp.dict\ ['Members'] if not logicaldrives_resp.dict['Members']: sys.stderr.write("\tLogical drives are not available for this controller.\n") for lds in logicaldrives_resp.dict['Members']: sys.stdout.write("\t An associated logical drive: %s\n" % logicaldrives_resp.dict['Name']) drive_data = _redfishobj.get(lds['@odata.id']).dict print(json.dumps(drive_data, indent=4, sort_keys=True)) def get_SmartArray_LogicalDrives_gen9(_redfishobj): smartstorage_response = [] smartarraycontrollers = dict() smartstorage_uri = "/redfish/v1/Systems/1/SmartStorage/ArrayControllers/" print (smartstorage_uri) smartstorage_response = _redfishobj.get(smartstorage_uri).obj['Members'] for controller in smartstorage_response: smartarraycontrollers[controller['@odata.id']] = _redfishobj.get(controller['@odata.id']).obj sys.stdout.write("Logical Drive URIs for Smart Storage Array Controller \'%s\' : \n" \ % smartarraycontrollers[controller['@odata.id']].get('Id')) logicaldrives_uri = smartarraycontrollers[controller['@odata.id']].Links\ ['LogicalDrives']['@odata.id'] print (logicaldrives_uri) logicaldrives_resp = _redfishobj.get(logicaldrives_uri) if logicaldrives_resp.dict['Members@odata.count'] == 0: sys.stderr.write("\tLogical drives are not available for this controller.\n") else: for lds in logicaldrives_resp.dict['Members']: sys.stdout.write("\t An associated logical drive: %s\n" % logicaldrives_resp.dict['Name']) drive_data = _redfishobj.get(lds['@odata.id']).dict print(json.dumps(drive_data, indent=4, sort_keys=True)) if __name__ == "__main__": # Initialize parser parser = argparse.ArgumentParser(description = "Script to upload and flash NVMe FW") parser.add_argument( '-i', '--ilo', dest='ilo_ip', action="store", help="iLO IP of the server", default=None) parser.add_argument( '-u', '--user', dest='ilo_user', action="store", help="iLO username to login", default=None) parser.add_argument( '-p', '--password', dest='ilo_pass', action="store", help="iLO password to log in.", default=None) options = parser.parse_args() system_url = "https://" + options.ilo_ip print (system_url) # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object redfish_obj = RedfishClient(base_url=system_url, username=options.ilo_user, password=options.ilo_pass) # Login with the Redfish client redfish_obj.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() (ilogen,_) = get_gen(redfish_obj) print ("Generation is ", ilogen) if int(ilogen) == 5: get_SmartArray_LogicalDrives(redfish_obj) else: get_SmartArray_LogicalDrives_gen9(redfish_obj) redfish_obj.logout() python-ilorest-4.8.0.0/examples/Redfish/mount_virtual_media_iso.py0000644000175000017500000001221714556457137025262 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of mounting virtual media for HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def mount_virtual_media_iso(_redfishobj, iso_url, media_type, boot_on_next_server_reset): virtual_media_uri = None virtual_media_response = [] resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) virtual_media_uri = managers_members_response.obj['VirtualMedia']['@odata.id'] else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#VirtualMediaCollection.' in instance['@odata.type']: virtual_media_uri = instance['@odata.id'] if virtual_media_uri: virtual_media_response = _redfishobj.get(virtual_media_uri) for virtual_media_slot in virtual_media_response.obj['Members']: data = _redfishobj.get(virtual_media_slot['@odata.id']) if media_type in data.dict['MediaTypes']: virtual_media_mount_uri = data.obj['Actions']['#VirtualMedia.InsertMedia']['target'] post_body = {"Image": iso_url} if iso_url: resp = _redfishobj.post(virtual_media_mount_uri, post_body) if boot_on_next_server_reset is not None: patch_body = {} patch_body["Oem"] = {"Hpe": {"BootOnNextServerReset": \ boot_on_next_server_reset}} boot_resp = _redfishobj.patch(data.obj['@odata.id'], patch_body) if not boot_resp.status == 200: sys.stderr.write("Failure setting BootOnNextServerReset") if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO" "Extended Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) break if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" MEDIA_URL = "http:///media.iso" #specify the type of content the media represents MEDIA_TYPE = "CD" #current possible options: Floppy, USBStick, CD, DVD #specify if the server should attempt to boot this media on system restart BOOT_ON_NEXT_SERVER_RESET = True # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() mount_virtual_media_iso(REDFISHOBJ, MEDIA_URL, MEDIA_TYPE, BOOT_ON_NEXT_SERVER_RESET) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/enable_ntp_servers.py0000644000175000017500000001236414556457137024224 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of enabling NTP servers on HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def enable_ntp(_redfishobj, ntp_servers, DISABLE_RESOURCE_DIR): ethernet_data = {} resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI managers_uri = _redfishobj.root.obj['Managers']['@odata.id'] managers_response = _redfishobj.get(managers_uri) managers_members_uri = next(iter(managers_response.obj['Members']))['@odata.id'] managers_members_response = _redfishobj.get(managers_members_uri) manager_ethernet_interfaces = managers_members_response.obj['EthernetInterfaces']\ ['@odata.id'] manager_ethernet_interfaces_response = _redfishobj.get(manager_ethernet_interfaces) manager_ethernet_interfaces_members = manager_ethernet_interfaces_response.\ obj['Members'] for _member in manager_ethernet_interfaces_members: _tmp = _redfishobj.get(_member['@odata.id']).obj ethernet_data[_member['@odata.id']] = _tmp else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#EthernetInterfaceCollection.' in instance['@odata.type'] and 'Managers' in \ instance['@odata.id']: ethernet_uri = instance['@odata.id'] ethernet_interfaces = _redfishobj.get(ethernet_uri).obj['Members'] for _ethernet_interface in ethernet_interfaces: ethernet_data[_ethernet_interface['@odata.id']] = _redfishobj.\ get(_ethernet_interface['@odata.id']).dict break if ethernet_data: print("\n\nShowing all available ethernet management interfaces before changes:\n\n") print(json.dumps(ethernet_data, indent=4, sort_keys=True)) body = {"Oem": {"Hpe": {"DHCPv4": {"UseNTPServers": ntp_servers}, \ "DHCPv6": {"UseNTPServers": ntp_servers}}}} for ethernet in ethernet_data: resp = _redfishobj.patch(ethernet, body) if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) _data = _redfishobj.get(ethernet).dict sys.stdout.write("\nShowing \'%s\' interface after changes:\n" % ethernet) print(json.dumps(_data, indent=4, sort_keys=True)) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" # Properties # NTP Servers Enable/Disable Flag NTP_SERVERS = True # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() enable_ntp(REDFISHOBJ, NTP_SERVERS, DISABLE_RESOURCE_DIR) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/get_SmartArray_EncryptionSettings.py0000644000175000017500000001126014556457137027215 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of gathering the smart array encryption settings on HPE iLO systems """ import sys from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def get_SmartArray_EncryptionSettings(_redfishobj, desired_properties): smartstorage_response = [] smartarraycontrollers = dict() resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) smart_storage_uri = systems_members_response.obj.Oem.Hpe.Links\ ['SmartStorage']['@odata.id'] smart_storage_arraycontrollers_uri = _redfishobj.get(smart_storage_uri).obj.Links\ ['ArrayControllers']['@odata.id'] smartstorage_response = _redfishobj.get(smart_storage_arraycontrollers_uri).obj['Members'] else: for instance in resource_instances: #Use Resource directory to find the relevant URI if '#HpeSmartStorageArrayControllerCollection.' in instance['@odata.type']: smartstorage_uri = instance['@odata.id'] smartstorage_response = _redfishobj.get(smartstorage_uri).obj['Members'] break for controller in smartstorage_response: smartarraycontrollers[controller['@odata.id']] = _redfishobj.get(controller['@odata.id']).\ obj sys.stdout.write("Encryption Properties for Smart Storage Array Controller \'%s\' : \n" \ % smartarraycontrollers[controller['@odata.id']].get('Id')) for data in smartarraycontrollers[controller['@odata.id']]: if data in desired_properties: sys.stdout.write("\t %s : %s\n" % (data, smartarraycontrollers[controller\ ['@odata.id']].get(data))) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #list of desired properties related to Smart Array controller encryption DESIRED_PROPERTIES = ["Name", "Model", "SerialNumber", "EncryptionBootPasswordSet",\ "EncryptionCryptoOfficerPasswordSet",\ "EncryptionLocalKeyCacheEnabled", "EncryptionMixedVolumesEnabled",\ "EncryptionPhysicalDriveCount", "EncryptionRecoveryParamsSet",\ "EncryptionStandaloneModeEnabled", "EncryptionUserPasswordSet"] # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() get_SmartArray_EncryptionSettings(REDFISHOBJ, DESIRED_PROPERTIES) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/change_boot_order.py0000644000175000017500000001177614556457137024015 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of changing the boot order for HPE iLO systems """ import sys import json from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def change_boot_order(_redfishobj, bios_password): bios_boot_uri = None bios_boot_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) bios_uri = systems_members_response.obj['Bios']['@odata.id'] bios_response = _redfishobj.get(bios_uri) bios_boot_uri = bios_response.obj.Oem.Hpe.Links.Boot['@odata.id'] else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#HpeServerBootSettings.' in instance['@odata.type']: bios_boot_uri = instance['@odata.id'] break if bios_boot_uri: bios_boot_response = _redfishobj.get(bios_boot_uri) #Bios boot settings URI is needed bios_boot_settings_uri = bios_boot_response.obj['@Redfish.Settings']['SettingsObject']\ ['@odata.id'] #update BIOS password if bios_password: _redfishobj.bios_password = bios_password sys.stdout.write("Rotating the first boot device to the end of the boot order.\n") sys.stdout.write('Current Order:\n') boot_order = bios_boot_response.obj['DefaultBootOrder'] for indx, boot_device in enumerate(boot_order): sys.stdout.write('Pos ' + str(indx) + ' : ' + boot_device + '\n') device = boot_order.pop(0) sys.stdout.write("Rotating device: \'%s\' to the end of the boot order.\n" % device) boot_order.append(device) body = {'DefaultBootOrder': boot_order} resp = _redfishobj.patch(bios_boot_settings_uri, body) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended Message"\ " Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success! Your system may need to be restarted.\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) else: sys.stderr.write("Unable to find Boot Order URI.\n") if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" BIOS_PASSWORD = None # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = False try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() change_boot_order(REDFISHOBJ, BIOS_PASSWORD) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/set_server_asset_tag.py0000644000175000017500000001044114556457137024551 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of setting the server asset tag """ import sys import json import time from redfish import RedfishClient from redfish.rest.v1 import ServerDownOrUnreachableError from get_resource_directory import get_resource_directory def set_server_asset_tag(_redfishobj, tag): systems_members_uri = None systems_members_response = None resource_instances = get_resource_directory(_redfishobj) if DISABLE_RESOURCE_DIR or not resource_instances: #if we do not have a resource directory or want to force it's non use to find the #relevant URI systems_uri = _redfishobj.root.obj['Systems']['@odata.id'] systems_response = _redfishobj.get(systems_uri) systems_members_uri = next(iter(systems_response.obj['Members']))['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) else: #Use Resource directory to find the relevant URI for instance in resource_instances: if '#ComputerSystem.' in instance['@odata.type']: systems_members_uri = instance['@odata.id'] systems_members_response = _redfishobj.get(systems_members_uri) if systems_members_response and systems_members_uri and tag: print("Current Asset Tag: \'%s\'\n" % systems_members_response.dict.get("AssetTag")) resp = _redfishobj.patch(systems_members_uri, {"AssetTag" : tag}) #If iLO responds with soemthing outside of 200 or 201 then lets check the iLO extended info #error message to see what went wrong if resp.status == 400: try: print(json.dumps(resp.obj['error']['@Message.ExtendedInfo'], indent=4, \ sort_keys=True)) except Exception as excp: sys.stderr.write("A response error occurred, unable to access iLO Extended "\ "Message Info...") elif resp.status != 200: sys.stderr.write("An http response of \'%s\' was returned.\n" % resp.status) else: print("Success!\n") print(json.dumps(resp.dict, indent=4, sort_keys=True)) time.sleep(10) #going to wait 10 seconds before obtaining the LED indicator state sys.stdout.write("\nUpdated Asset Tag: \'%s\'\n" % _redfishobj.\ get(systems_members_uri).dict.get("AssetTag")) if __name__ == "__main__": # When running on the server locally use the following commented values #SYSTEM_URL = None #LOGIN_ACCOUNT = None #LOGIN_PASSWORD = None # When running remotely connect using the secured (https://) address, # account name, and password to send https requests # SYSTEM_URL acceptable examples: # "https://10.0.0.100" # "https://ilo.hostname" SYSTEM_URL = "https://10.0.0.100" LOGIN_ACCOUNT = "admin" LOGIN_PASSWORD = "password" #asset tag property in computer systems ASSET_TAG = "Asset01" # flag to force disable resource directory. Resource directory and associated operations are # intended for HPE servers. DISABLE_RESOURCE_DIR = True try: # Create a Redfish client object REDFISHOBJ = RedfishClient(base_url=SYSTEM_URL, username=LOGIN_ACCOUNT, \ password=LOGIN_PASSWORD) # Login with the Redfish client REDFISHOBJ.login() except ServerDownOrUnreachableError as excp: sys.stderr.write("ERROR: server not reachable or does not support RedFish.\n") sys.exit() set_server_asset_tag(REDFISHOBJ, ASSET_TAG) REDFISHOBJ.logout() python-ilorest-4.8.0.0/examples/Redfish/quickstart_redfish.py0000644000175000017500000000146414556457137024241 0ustar carstencarsten# -*- coding: utf-8 -*- import sys import redfish # When running on the server locally use the following commented values # iLO_host = "blobstore://." # LOGIN_ACCOUNT = "None" # LOGIN_PASSWORD = "None" # When running remotely connect using the iLO address, iLO account name, # and password to send https requests iLO_host = "https://10.0.0.100" login_account = "admin" login_password = "password" ## Create a REDFISH object REDFISH_OBJ = redfish.RedfishClient(base_url=iLO_host,username=login_account, \ password=login_password) # Login into the server and create a session REDFISH_OBJ.login() # Do a GET on a given path response = REDFISH_OBJ.get("/redfish/v1/systems/1") # Print out the response sys.stdout.write("%s\n" % response) # Logout of the current session REDFISH_OBJ.logout()python-ilorest-4.8.0.0/examples/Redfish/set_snmp_alert.py0000644000175000017500000001426114556457137023361 0ustar carstencarsten # Copyright 2020 Hewlett Packard Enterprise Development LP # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # -*- coding: utf-8 -*- """ An example of configuring SNMP alert for HPE iLO systems Usage: python