From bd7727a52fa2f03aa2972331c439cc2687403e26 Mon Sep 17 00:00:00 2001 From: Vinayak <32881538+vinayak42@users.noreply.github.com> Date: Sat, 6 Oct 2018 21:37:18 +0530 Subject: [PATCH 001/663] Added link to "Get tenant settings" Added link on line 35 for getting tenant dettings --- auth0/v3/management/tenants.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/auth0/v3/management/tenants.py b/auth0/v3/management/tenants.py index a2456d0a..210165d2 100644 --- a/auth0/v3/management/tenants.py +++ b/auth0/v3/management/tenants.py @@ -31,6 +31,8 @@ def get(self, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise. + + See: https://auth0.com/docs/api/management/v2#!/Tenants/get_settings """ params = {'fields': fields and ','.join(fields) or None, From d2410c2ff6c0a06a3e2212b2eaa68c5e0eb662d9 Mon Sep 17 00:00:00 2001 From: Vinayak <32881538+vinayak42@users.noreply.github.com> Date: Sat, 6 Oct 2018 21:43:27 +0530 Subject: [PATCH 002/663] Added links Added links to get, delete and update functions --- auth0/v3/management/clients.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/auth0/v3/management/clients.py b/auth0/v3/management/clients.py index fd4bcbc0..95cf96a3 100644 --- a/auth0/v3/management/clients.py +++ b/auth0/v3/management/clients.py @@ -79,6 +79,9 @@ def get(self, id, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients """ params = {'fields': fields and ','.join(fields) or None, @@ -91,6 +94,9 @@ def delete(self, id): Args: id (str): Id of application to delete. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id """ return self.client.delete(self._url(id)) @@ -105,6 +111,7 @@ def update(self, id, body): id (str): Client id of the application. body (dict): Attributes to modify. + See: https://auth0.com/docs/api/management/v2#!/Clients/patch_clients_by_id """ return self.client.patch(self._url(id), data=body) From 76c57484177a7ab527a9ed5d3f522962ee759fe8 Mon Sep 17 00:00:00 2001 From: vinuthegr8 Date: Tue, 9 Oct 2018 01:33:45 +0530 Subject: [PATCH 003/663] Added links and created function --- auth0/v3/management/blacklists.py | 6 ++++++ auth0/v3/management/client_grants.py | 6 ++++++ auth0/v3/management/clients.py | 22 ++++++++++++++++++++++ auth0/v3/management/connections.py | 14 ++++++++++++++ 4 files changed, 48 insertions(+) diff --git a/auth0/v3/management/blacklists.py b/auth0/v3/management/blacklists.py index cbbbc68d..0180a05c 100644 --- a/auth0/v3/management/blacklists.py +++ b/auth0/v3/management/blacklists.py @@ -24,6 +24,9 @@ def get(self, aud=None): Args: aud (str, optional): The JWT's aud claim. The client_id of the application for which it was issued. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Blacklists/get_tokens """ params = { @@ -39,6 +42,9 @@ def create(self, jti, aud=''): jti (str): the jti of the JWT to blacklist. aud (str, optional): The JWT's aud claim. The client_id of the application for which it was issued. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Blacklists/post_tokens """ return self.client.post(self.url, data={'jti': jti, 'aud': aud}) diff --git a/auth0/v3/management/client_grants.py b/auth0/v3/management/client_grants.py index 2f55709b..668c52d6 100644 --- a/auth0/v3/management/client_grants.py +++ b/auth0/v3/management/client_grants.py @@ -37,6 +37,9 @@ def all(self, audience=None, page=None, per_page=None, include_totals=False): include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Client_Grants/get_client_grants """ params = { @@ -63,6 +66,9 @@ def delete(self, id): Args: id (str): Id of client grant to delete. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Client_Grants/delete_client_grants_by_id """ return self.client.delete(self._url(id)) diff --git a/auth0/v3/management/clients.py b/auth0/v3/management/clients.py index fd4bcbc0..dc1a7c14 100644 --- a/auth0/v3/management/clients.py +++ b/auth0/v3/management/clients.py @@ -45,6 +45,9 @@ def all(self, fields=None, include_fields=True, page=None, per_page=None, extra_ extra_params (dictionary, optional): The extra parameters to add to the request. The fields, include_fields, page and per_page values specified as parameters take precedence over the ones defined here. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients """ params = extra_params or {} params['fields'] = fields and ','.join(fields) or None @@ -79,6 +82,9 @@ def get(self, id, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients_by_id """ params = {'fields': fields and ','.join(fields) or None, @@ -91,6 +97,9 @@ def delete(self, id): Args: id (str): Id of application to delete. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id """ return self.client.delete(self._url(id)) @@ -105,6 +114,19 @@ def update(self, id, body): id (str): Client id of the application. body (dict): Attributes to modify. + See: https://auth0.com/docs/api/management/v2#!/Clients/patch_clients_by_id """ return self.client.patch(self._url(id), data=body) + + def rotate(self, id): + """Rotate a client secret. + + Args: + id (str): Id of application to rotate + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Clients/post_rotate_secret + """ + + return self.client.rotate(self._url(id)) diff --git a/auth0/v3/management/connections.py b/auth0/v3/management/connections.py index d2bcc65e..dfcce1b7 100644 --- a/auth0/v3/management/connections.py +++ b/auth0/v3/management/connections.py @@ -45,6 +45,9 @@ def all(self, strategy=None, fields=None, include_fields=True, page=None, per_pa the request. The fields, include_fields, page and per_page values specified as parameters take precedence over the ones defined here. + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Connections/get_connections + Returns: A list of connection objects. """ @@ -71,6 +74,9 @@ def get(self, id, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise. + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Connections/get_connections_by_id + Returns: A connection object. """ @@ -86,6 +92,9 @@ def delete(self, id): Args: id: Id of the connection to delete. + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Connections/delete_connections_by_id + Returns: An empty dict. """ @@ -100,6 +109,7 @@ def update(self, id, body): body (dict): Specifies which fields are to be modified, and to what values. + See: https://auth0.com/docs/api/management/v2#!/Connections/patch_connections_by_id Returns: The modified connection object. @@ -113,6 +123,7 @@ def create(self, body): Args: body (dict): Attributes used to create the connection. Mandatory attributes are: 'name' and 'strategy'. + See: https://auth0.com/docs/api/management/v2#!/Connections/post_connections """ return self.client.post(self._url(), data=body) @@ -125,6 +136,9 @@ def delete_user_by_email(self, id, email): email (str): The email of the user to delete. + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Connections/delete_users_by_email + Returns: An empty dict. """ From 6f6f81d03c530fdd36afb9da7a7c508955922bfc Mon Sep 17 00:00:00 2001 From: Zafarullah M Date: Wed, 10 Oct 2018 11:41:12 +0530 Subject: [PATCH 004/663] Minor changes in README --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 4192f876..85d8d43e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,7 +13,7 @@ What is Auth0? Auth0 helps you to: * Add authentication with `multiple authentication sources `_, - either social like **Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce, amont others**, + either social like **Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce, among others**, or enterprise identity systems like **Windows Azure AD, Google Apps, Active Directory, ADFS or any SAML Identity Provider**. * Add authentication through more traditional `username/password databases `_. * Add support for `linking different user accounts `_ with the same user. From b5cb3e3b7a21d9ce14d5ab6addd7e63736454b33 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 10 Oct 2018 19:04:33 +0300 Subject: [PATCH 005/663] Update README - add license badge --- README.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 37de9155..f25b19f0 100644 --- a/README.rst +++ b/README.rst @@ -2,7 +2,7 @@ Auth0 - Python ************** -|pypi| |build| |coverage| +|pypi| |build| |coverage| |license| In this repository, you'll find all the information about integrating Auth0 with Python. @@ -226,3 +226,7 @@ file for more info. .. |build| image:: https://circleci.com/gh/auth0/auth0-python.svg?style=shield&circle-token=:circle-token :target: https://circleci.com/gh/auth0/auth0-python :alt: Build status + +.. |license| image:: http://img.shields.io/:license-mit-blue.svg?style=flat + :target: http://doge.mit-license.org + :alt: License From 6c62c461431d69aa1136f067ca1a925e856e94c5 Mon Sep 17 00:00:00 2001 From: vinuthegr8 Date: Mon, 15 Oct 2018 19:13:13 +0530 Subject: [PATCH 006/663] Added more links and functions --- auth0/v3/management/device_credentials.py | 6 ++++++ auth0/v3/management/email_templates.py | 12 +++++++++++ auth0/v3/management/emails.py | 7 ++++++ auth0/v3/management/guardian.py | 26 ++++++++++++++++++++++- auth0/v3/management/jobs.py | 19 +++++++++++++++++ auth0/v3/management/logs.py | 6 ++++++ auth0/v3/management/resource_servers.py | 9 ++++++++ auth0/v3/management/rules.py | 9 ++++++++ auth0/v3/management/stats.py | 7 ++++++ auth0/v3/management/user_blocks.py | 12 +++++++++++ auth0/v3/management/users.py | 20 +++++++++++++++++ auth0/v3/management/users_by_email.py | 3 +++ 12 files changed, 135 insertions(+), 1 deletion(-) diff --git a/auth0/v3/management/device_credentials.py b/auth0/v3/management/device_credentials.py index e3de825b..b8e36b16 100644 --- a/auth0/v3/management/device_credentials.py +++ b/auth0/v3/management/device_credentials.py @@ -41,6 +41,9 @@ def get(self, user_id, client_id, type, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise (defaults to true) + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Device_Credentials/get_device_credentials """ params = { @@ -67,5 +70,8 @@ def delete(self, id): Args: id (str): The id of the credential to delete + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Device_Credentials/delete_device_credentials_by_id """ return self.client.delete(self._url(id)) diff --git a/auth0/v3/management/email_templates.py b/auth0/v3/management/email_templates.py index 25866f25..6f3e1e57 100644 --- a/auth0/v3/management/email_templates.py +++ b/auth0/v3/management/email_templates.py @@ -57,7 +57,19 @@ def update(self, template_name, body): 'change_password', 'password_reset', 'mfa_oob_code'. body (dict): Attributes to update on the email template. + See: https://auth0.com/docs/api/management/v2#!/Email_Templates/put_email_templates_by_templateName + + """ + + return self.client.put(self._url(template_name), data=body) + + def patch(self, template_name, body): + """Patch an email template + + Args: + body (dict): See: https://auth0.com/docs/api/management/v2#!/Email_Templates/patch_email_templates_by_templateName + """ return self.client.patch(self._url(template_name), data=body) diff --git a/auth0/v3/management/emails.py b/auth0/v3/management/emails.py index 21962fe5..9f3545a2 100644 --- a/auth0/v3/management/emails.py +++ b/auth0/v3/management/emails.py @@ -34,6 +34,9 @@ def get(self, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Emails/get_provider """ params = {'fields': fields and ','.join(fields) or None, 'include_fields': str(include_fields).lower()} @@ -50,6 +53,10 @@ def config(self, body): def delete(self): """Delete the email provider. (USE WITH CAUTION) + + Args: + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Emails/delete_provider """ return self.client.delete(self._url()) diff --git a/auth0/v3/management/guardian.py b/auth0/v3/management/guardian.py index 1d6f2ee2..8defca14 100644 --- a/auth0/v3/management/guardian.py +++ b/auth0/v3/management/guardian.py @@ -27,6 +27,10 @@ def _url(self, id=None): def all_factors(self): """Retrieves all factors. Useful to check factor enablement and trial status. + + Args: + body (dict): https://auth0.com/docs/api/management/v2#!/Guardian/get_factors + See: """ return self.client.get(self._url('factors')) @@ -60,6 +64,11 @@ def get_templates(self): Retrieve both templates. Useful to check if a different template than default was set. + + Args: + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Guardian/get_templates """ return self.client.get(self._url('factors/sms/templates')) @@ -70,6 +79,9 @@ def get_enrollment(self, id): Args: id (str): The id of the device account to update + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Guardian/get_enrollments_by_id """ url = self._url('enrollments/%s' % (id)) return self.client.get(url) @@ -81,6 +93,9 @@ def delete_enrollment(self, id): Args: id (str): The id of the device account to update + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Guardian/delete_enrollments_by_id """ url = self._url('enrollments/%s' % (id)) return self.client.delete(url) @@ -98,12 +113,16 @@ def create_enrollment_ticket(self, body): return self.client.post(self._url('enrollments/ticket'), data=body) def get_factor_providers(self, factor_name, name): - """Get Guardian factor providers. + """Get Guardian SNS factor providers. Returns provider configuration Args: factor_name (str): Either push-notification or sms name (str): Name of the provider + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Guardian/get_sns + https://auth0.com/docs/api/management/v2#!/Guardian/get_twilio """ url = self._url('factors/{}/providers/{}'.format(factor_name, name)) return self.client.get(url) @@ -115,6 +134,11 @@ def update_factor_providers(self, factor_name, name, body): Args: factor_name (str): Either push-notification or sms name (str): Name of the provider + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Guardian/put_twilio """ url = self._url('factors/{}/providers/{}'.format(factor_name, name)) return self.client.put(url, data=body) + + diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index c1831ef5..4d876479 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -29,6 +29,9 @@ def get(self, id): Args: id (str): The id of the job. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Jobs/get_jobs_by_id """ return self.client.get(self._url(id)) @@ -37,10 +40,23 @@ def get_failed_job(self, id): Args: id (str): The id of the job. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Jobs/get_errors """ url = self._url('%s/errors' % (id)) return self.client.get(url) + def get_results(self, job_id): + """Get results of a job + + Args: + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Jobs/get_results + """ + url = self._url('%s/results' % (job_id)) + return self.client.get(url) + def export_users(self, body): """Export all users to a file using a long running job. @@ -61,6 +77,9 @@ def import_users(self, connection_id, file_obj, upsert=False): file_obj (file): A file-like object to upload. The format for this file is explained in: https://auth0.com/docs/bulk-import + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Jobs/post_users_imports """ return self.client.file_post(self._url('users-imports'), data={'connection_id': connection_id, 'upsert': str(upsert).lower()}, diff --git a/auth0/v3/management/logs.py b/auth0/v3/management/logs.py index ca8c312c..693f0db6 100644 --- a/auth0/v3/management/logs.py +++ b/auth0/v3/management/logs.py @@ -54,6 +54,9 @@ def search(self, page=0, per_page=50, sort=None, q=None, take (int, optional): The total amount of entries to retrieve when using the from parameter. + + body (dict): + https://auth0.com/docs/api/management/v2#!/Logs/get_logs """ params = { 'per_page': per_page, @@ -73,6 +76,9 @@ def get(self, id): Args: id (str): The log_id of the log to retrieve + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Logs/get_logs_by_id """ return self.client.get(self._url(id)) diff --git a/auth0/v3/management/resource_servers.py b/auth0/v3/management/resource_servers.py index daec1689..2a7ca07e 100644 --- a/auth0/v3/management/resource_servers.py +++ b/auth0/v3/management/resource_servers.py @@ -44,6 +44,9 @@ def get_all(self, page=None, per_page=None, include_totals=False): include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/get_resource_servers """ params = { @@ -59,6 +62,9 @@ def get(self, id): Args: id (str): Id of the resource server to get. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/get_resource_servers_by_id """ return self.client.get(self._url(id)) @@ -68,6 +74,9 @@ def delete(self, id): Args: id (str): Id of resource server to delete. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/delete_resource_servers_by_id """ return self.client.delete(self._url(id)) diff --git a/auth0/v3/management/rules.py b/auth0/v3/management/rules.py index 982c82a7..771185e4 100644 --- a/auth0/v3/management/rules.py +++ b/auth0/v3/management/rules.py @@ -49,6 +49,9 @@ def all(self, stage='login_success', enabled=True, fields=None, include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Rules/get_rules """ params = { @@ -88,6 +91,9 @@ def get(self, id, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise (defaults to true). + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Rules/get_rules_by_id """ params = {'fields': fields and ','.join(fields) or None, 'include_fields': str(include_fields).lower()} @@ -98,6 +104,9 @@ def delete(self, id): Args: id (str): The id of the rule to delete. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Rules/delete_rules_by_id """ return self.client.delete(self._url(id)) diff --git a/auth0/v3/management/stats.py b/auth0/v3/management/stats.py index 852ce05e..13d24acb 100644 --- a/auth0/v3/management/stats.py +++ b/auth0/v3/management/stats.py @@ -24,6 +24,10 @@ def active_users(self): """Gets the active users count (logged in during the last 30 days). Returns: An integer. + + Args: + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Stats/get_active_users """ return self.client.get(self._url('active-users')) @@ -37,6 +41,9 @@ def daily_stats(self, from_date=None, to_date=None): to_date (str): The last day of the period (inclusive) in YYYYMMDD format. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Stats/get_daily """ return self.client.get(self._url('daily'), params={'from': from_date, diff --git a/auth0/v3/management/user_blocks.py b/auth0/v3/management/user_blocks.py index e2170d87..b91f8a8b 100644 --- a/auth0/v3/management/user_blocks.py +++ b/auth0/v3/management/user_blocks.py @@ -29,6 +29,9 @@ def get_by_identifier(self, identifier): Args: identifier (str): Should be any of: username, phone_number, email. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/get_user_blocks """ params = {'identifier': identifier} @@ -40,6 +43,9 @@ def unblock_by_identifier(self, identifier): Args: identifier (str): Should be any of: username, phone_number, email. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/delete_user_blocks """ params = {'identifier': identifier} @@ -51,6 +57,9 @@ def get(self, id): Args: id (str): The user_id of the user to retrieve. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/get_user_blocks_by_id """ return self.client.get(self._url(id)) @@ -60,6 +69,9 @@ def unblock(self, id): Args: id (str): The user_id of the user to update. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/delete_user_blocks_by_id """ return self.client.delete(self._url(id)) diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index f1d80842..91448aa4 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -52,6 +52,9 @@ def list(self, page=0, per_page=25, sort=None, connection=None, q=None, include_fields (bool, optional): True if the fields specified are to be include in the result, False otherwise. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Users/get_users """ params = { 'per_page': per_page, @@ -76,6 +79,8 @@ def create(self, body): def delete_all_users(self): """Deletes all users (USE WITH CAUTION). + + Args: """ return self.client.delete(self._url()) @@ -91,6 +96,9 @@ def get(self, id, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Users/get_users_by_id """ params = { 'fields': fields and ','.join(fields) or None, @@ -104,6 +112,9 @@ def delete(self, id): Args: id (str): The user_id of the user to delete. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Users/delete_users_by_id """ return self.client.delete(self._url(id)) @@ -125,6 +136,9 @@ def delete_multifactor(self, id, provider): provider (str): The multifactor provider. Supported values 'duo' or 'google-authenticator' + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Users/delete_multifactor_by_provider """ url = self._url('{}/multifactor/{}'.format(id, provider)) return self.client.delete(url) @@ -138,6 +152,9 @@ def unlink_user_account(self, id, provider, user_id): provider (str): The type of identity provider (e.g: facebook). user_id (str): The unique identifier for the user for the identity. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Users/delete_user_identity_by_user_id """ url = self._url('{}/identities/{}/{}'.format(id, provider, user_id)) return self.client.delete(url) @@ -162,6 +179,9 @@ def regenerate_recovery_code(self, user_id): Args: user_id (str): The user_id of the user identity. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Users/post_recovery_code_regeneration """ url = self._url('%s/recovery-code-regeneration' % user_id) return self.client.post(url) diff --git a/auth0/v3/management/users_by_email.py b/auth0/v3/management/users_by_email.py index cd04e557..ea68610a 100644 --- a/auth0/v3/management/users_by_email.py +++ b/auth0/v3/management/users_by_email.py @@ -35,6 +35,9 @@ def search_users_by_email(self, email, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be include in the result, False otherwise. + + body (dict): + See: https://auth0.com/docs/api/management/v2#!/Users_By_Email/get_users_by_email """ params = { 'email': email.lower(), From c89bde41b40308f13ce3822a499d512c9df719ec Mon Sep 17 00:00:00 2001 From: vinuthegr8 Date: Mon, 15 Oct 2018 19:21:40 +0530 Subject: [PATCH 007/663] Removed patch function in email_templates.py --- auth0/v3/management/email_templates.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/auth0/v3/management/email_templates.py b/auth0/v3/management/email_templates.py index 6f3e1e57..95f848f0 100644 --- a/auth0/v3/management/email_templates.py +++ b/auth0/v3/management/email_templates.py @@ -62,14 +62,3 @@ def update(self, template_name, body): """ return self.client.put(self._url(template_name), data=body) - - def patch(self, template_name, body): - """Patch an email template - - Args: - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Email_Templates/patch_email_templates_by_templateName - - """ - - return self.client.patch(self._url(template_name), data=body) From 2f6a187a1655afcd9205d17e71786927f9cb2197 Mon Sep 17 00:00:00 2001 From: vinuthegr8 Date: Mon, 15 Oct 2018 19:25:20 +0530 Subject: [PATCH 008/663] Fixed error in email-template --- auth0/v3/management/email_templates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/management/email_templates.py b/auth0/v3/management/email_templates.py index 95f848f0..10787dc2 100644 --- a/auth0/v3/management/email_templates.py +++ b/auth0/v3/management/email_templates.py @@ -61,4 +61,4 @@ def update(self, template_name, body): """ - return self.client.put(self._url(template_name), data=body) + return self.client.patch(self._url(template_name), data=body) From 39cd44436bff31f81291f38ce4ac6956a202d0d8 Mon Sep 17 00:00:00 2001 From: Prabhu Pant Date: Tue, 16 Oct 2018 09:21:18 +0530 Subject: [PATCH 009/663] Corrections in README.rst --- README.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index f25b19f0..47ef16f6 100644 --- a/README.rst +++ b/README.rst @@ -34,12 +34,18 @@ Create a free Auth0 Account Installation ============ -You can install the auth0 Python SDK issuing the following command. +You can install the auth0 Python SDK using the following command. .. code-block:: pip install auth0-python +For python3, use the following command + +.. code-block:: + + pip3 install auth0-python + Python 3.2 and 3.3 have reached [end-of-life](https://en.wikipedia.org/wiki/CPython#Version_history) and support will be removed in the near future. From 6bd72c4fc1cec343684d5f6b55678fc516b245dc Mon Sep 17 00:00:00 2001 From: "Matt (IPv4)" Date: Wed, 17 Oct 2018 15:41:27 +0100 Subject: [PATCH 010/663] standardise badges --- README.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index f25b19f0..9af8e9fe 100644 --- a/README.rst +++ b/README.rst @@ -219,14 +219,14 @@ file for more info. :target: https://pypi.org/project/auth0-python/ :alt: Latest version released on PyPI -.. |coverage| image:: https://codecov.io/gh/auth0/auth0-python/badge.svg - :target: https://codecov.io/gh/auth0/auth0-python - :alt: Test coverage - -.. |build| image:: https://circleci.com/gh/auth0/auth0-python.svg?style=shield&circle-token=:circle-token +.. |build| image:: https://img.shields.io/circleci/project/github/auth0/auth0-python.svg?style=flat-square&label=circleci :target: https://circleci.com/gh/auth0/auth0-python :alt: Build status -.. |license| image:: http://img.shields.io/:license-mit-blue.svg?style=flat +.. |coverage| image:: https://img.shields.io/codecov/c/github/auth0/auth0-python.svg?style=flat-square&label=codecov + :target: https://codecov.io/gh/auth0/auth0-python + :alt: Test coverage + +.. |license| image:: https://img.shields.io/:license-mit-blue.svg?style=flat-square :target: http://doge.mit-license.org :alt: License From 16fde01c20a379f749f5f7f670fc35af0a87fb06 Mon Sep 17 00:00:00 2001 From: vinuthegr8 Date: Thu, 18 Oct 2018 20:37:28 +0530 Subject: [PATCH 011/663] Removed body arg in some functions and removed new funcs --- auth0/v3/management/blacklists.py | 4 ++-- auth0/v3/management/client_grants.py | 7 +++---- auth0/v3/management/clients.py | 23 ++++++---------------- auth0/v3/management/connections.py | 12 ++++-------- auth0/v3/management/device_credentials.py | 8 ++++---- auth0/v3/management/email_templates.py | 3 ++- auth0/v3/management/emails.py | 7 ++----- auth0/v3/management/guardian.py | 24 ++++++++++------------- auth0/v3/management/jobs.py | 19 +++--------------- auth0/v3/management/logs.py | 7 +++---- auth0/v3/management/resource_servers.py | 9 +++------ auth0/v3/management/rules.py | 9 +++------ auth0/v3/management/stats.py | 8 +++----- auth0/v3/management/user_blocks.py | 12 ++++-------- auth0/v3/management/users.py | 22 +++++++++------------ auth0/v3/management/users_by_email.py | 3 +-- 16 files changed, 62 insertions(+), 115 deletions(-) diff --git a/auth0/v3/management/blacklists.py b/auth0/v3/management/blacklists.py index 0180a05c..b1aa4d37 100644 --- a/auth0/v3/management/blacklists.py +++ b/auth0/v3/management/blacklists.py @@ -25,8 +25,8 @@ def get(self, aud=None): aud (str, optional): The JWT's aud claim. The client_id of the application for which it was issued. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Blacklists/get_tokens + + See: https://auth0.com/docs/api/management/v2#!/Blacklists/get_tokens """ params = { diff --git a/auth0/v3/management/client_grants.py b/auth0/v3/management/client_grants.py index 668c52d6..6b370154 100644 --- a/auth0/v3/management/client_grants.py +++ b/auth0/v3/management/client_grants.py @@ -38,8 +38,7 @@ def all(self, audience=None, page=None, per_page=None, include_totals=False): include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Client_Grants/get_client_grants + See: https://auth0.com/docs/api/management/v2#!/Client_Grants/get_client_grants """ params = { @@ -67,8 +66,8 @@ def delete(self, id): Args: id (str): Id of client grant to delete. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Client_Grants/delete_client_grants_by_id + + See: https://auth0.com/docs/api/management/v2#!/Client_Grants/delete_client_grants_by_id """ return self.client.delete(self._url(id)) diff --git a/auth0/v3/management/clients.py b/auth0/v3/management/clients.py index 55138a67..93ae8699 100644 --- a/auth0/v3/management/clients.py +++ b/auth0/v3/management/clients.py @@ -46,8 +46,8 @@ def all(self, fields=None, include_fields=True, page=None, per_page=None, extra_ the request. The fields, include_fields, page and per_page values specified as parameters take precedence over the ones defined here. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients """ params = extra_params or {} params['fields'] = fields and ','.join(fields) or None @@ -83,8 +83,8 @@ def get(self, id, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients_by_id + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients_by_id """ params = {'fields': fields and ','.join(fields) or None, @@ -98,8 +98,8 @@ def delete(self, id): Args: id (str): Id of application to delete. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + + See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id """ return self.client.delete(self._url(id)) @@ -119,14 +119,3 @@ def update(self, id, body): return self.client.patch(self._url(id), data=body) - def rotate(self, id): - """Rotate a client secret. - - Args: - id (str): Id of application to rotate - - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Clients/post_rotate_secret - """ - - return self.client.rotate(self._url(id)) diff --git a/auth0/v3/management/connections.py b/auth0/v3/management/connections.py index ccb87332..483fe0e6 100644 --- a/auth0/v3/management/connections.py +++ b/auth0/v3/management/connections.py @@ -45,8 +45,7 @@ def all(self, strategy=None, fields=None, include_fields=True, page=None, per_pa the request. The fields, include_fields, page and per_page values specified as parameters take precedence over the ones defined here. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Connections/get_connections + See: https://auth0.com/docs/api/management/v2#!/Connections/get_connections Returns: A list of connection objects. @@ -74,8 +73,7 @@ def get(self, id, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Connections/get_connections_by_id + See: https://auth0.com/docs/api/management/v2#!/Connections/get_connections_by_id Returns: A connection object. @@ -92,8 +90,7 @@ def delete(self, id): Args: id: Id of the connection to delete. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Connections/delete_connections_by_id + See: https://auth0.com/docs/api/management/v2#!/Connections/delete_connections_by_id Returns: An empty dict. @@ -136,8 +133,7 @@ def delete_user_by_email(self, id, email): email (str): The email of the user to delete. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Connections/delete_users_by_email + See: https://auth0.com/docs/api/management/v2#!/Connections/delete_users_by_email Returns: An empty dict. diff --git a/auth0/v3/management/device_credentials.py b/auth0/v3/management/device_credentials.py index b8e36b16..d85a672c 100644 --- a/auth0/v3/management/device_credentials.py +++ b/auth0/v3/management/device_credentials.py @@ -42,8 +42,8 @@ def get(self, user_id, client_id, type, fields=None, include_fields=True): to be included in the result, False otherwise (defaults to true) - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Device_Credentials/get_device_credentials + + See: https://auth0.com/docs/api/management/v2#!/Device_Credentials/get_device_credentials """ params = { @@ -71,7 +71,7 @@ def delete(self, id): Args: id (str): The id of the credential to delete - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Device_Credentials/delete_device_credentials_by_id + + See: https://auth0.com/docs/api/management/v2#!/Device_Credentials/delete_device_credentials_by_id """ return self.client.delete(self._url(id)) diff --git a/auth0/v3/management/email_templates.py b/auth0/v3/management/email_templates.py index 10787dc2..b2710382 100644 --- a/auth0/v3/management/email_templates.py +++ b/auth0/v3/management/email_templates.py @@ -42,7 +42,8 @@ def get(self, template_name): Must be one of: 'verify_email', 'reset_email', 'welcome_email', 'blocked_account', 'stolen_credentials', 'enrollment_email', 'change_password', 'password_reset', 'mfa_oob_code'. - See: https://auth0.com/docs/api/management/v2#!/Email_Templates/get_email_templates_by_templateName + + See: https://auth0.com/docs/api/management/v2#!/Email_Templates/get_email_templates_by_templateName """ return self.client.get(self._url(template_name)) diff --git a/auth0/v3/management/emails.py b/auth0/v3/management/emails.py index 9f3545a2..0b1aae59 100644 --- a/auth0/v3/management/emails.py +++ b/auth0/v3/management/emails.py @@ -35,8 +35,7 @@ def get(self, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Emails/get_provider + See: https://auth0.com/docs/api/management/v2#!/Emails/get_provider """ params = {'fields': fields and ','.join(fields) or None, 'include_fields': str(include_fields).lower()} @@ -54,9 +53,7 @@ def config(self, body): def delete(self): """Delete the email provider. (USE WITH CAUTION) - Args: - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Emails/delete_provider + See: https://auth0.com/docs/api/management/v2#!/Emails/delete_provider """ return self.client.delete(self._url()) diff --git a/auth0/v3/management/guardian.py b/auth0/v3/management/guardian.py index 8defca14..1a63d2a4 100644 --- a/auth0/v3/management/guardian.py +++ b/auth0/v3/management/guardian.py @@ -28,9 +28,7 @@ def all_factors(self): """Retrieves all factors. Useful to check factor enablement and trial status. - Args: - body (dict): https://auth0.com/docs/api/management/v2#!/Guardian/get_factors - See: + See: https://auth0.com/docs/api/management/v2#!/Guardian/get_factors """ return self.client.get(self._url('factors')) @@ -65,10 +63,8 @@ def get_templates(self): Retrieve both templates. Useful to check if a different template than default was set. - Args: - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Guardian/get_templates + See: https://auth0.com/docs/api/management/v2#!/Guardian/get_templates """ return self.client.get(self._url('factors/sms/templates')) @@ -80,8 +76,8 @@ def get_enrollment(self, id): Args: id (str): The id of the device account to update - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Guardian/get_enrollments_by_id + + See: https://auth0.com/docs/api/management/v2#!/Guardian/get_enrollments_by_id """ url = self._url('enrollments/%s' % (id)) return self.client.get(url) @@ -94,8 +90,8 @@ def delete_enrollment(self, id): Args: id (str): The id of the device account to update - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Guardian/delete_enrollments_by_id + + See: https://auth0.com/docs/api/management/v2#!/Guardian/delete_enrollments_by_id """ url = self._url('enrollments/%s' % (id)) return self.client.delete(url) @@ -120,10 +116,10 @@ def get_factor_providers(self, factor_name, name): factor_name (str): Either push-notification or sms name (str): Name of the provider - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Guardian/get_sns - https://auth0.com/docs/api/management/v2#!/Guardian/get_twilio - """ + + See: https://auth0.com/docs/api/management/v2#!/Guardian/get_sns + https://auth0.com/docs/api/management/v2#!/Guardian/get_twilio +""" url = self._url('factors/{}/providers/{}'.format(factor_name, name)) return self.client.get(url) diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index 4d876479..c88cf999 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -30,8 +30,7 @@ def get(self, id): Args: id (str): The id of the job. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Jobs/get_jobs_by_id + See: https://auth0.com/docs/api/management/v2#!/Jobs/get_jobs_by_id """ return self.client.get(self._url(id)) @@ -41,22 +40,11 @@ def get_failed_job(self, id): Args: id (str): The id of the job. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Jobs/get_errors + See: https://auth0.com/docs/api/management/v2#!/Jobs/get_errors """ url = self._url('%s/errors' % (id)) return self.client.get(url) - def get_results(self, job_id): - """Get results of a job - - Args: - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Jobs/get_results - """ - url = self._url('%s/results' % (job_id)) - return self.client.get(url) - def export_users(self, body): """Export all users to a file using a long running job. @@ -78,8 +66,7 @@ def import_users(self, connection_id, file_obj, upsert=False): file_obj (file): A file-like object to upload. The format for this file is explained in: https://auth0.com/docs/bulk-import - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Jobs/post_users_imports + See: https://auth0.com/docs/api/management/v2#!/Jobs/post_users_imports """ return self.client.file_post(self._url('users-imports'), data={'connection_id': connection_id, 'upsert': str(upsert).lower()}, diff --git a/auth0/v3/management/logs.py b/auth0/v3/management/logs.py index 693f0db6..46cf572a 100644 --- a/auth0/v3/management/logs.py +++ b/auth0/v3/management/logs.py @@ -55,8 +55,7 @@ def search(self, page=0, per_page=50, sort=None, q=None, take (int, optional): The total amount of entries to retrieve when using the from parameter. - body (dict): - https://auth0.com/docs/api/management/v2#!/Logs/get_logs + https://auth0.com/docs/api/management/v2#!/Logs/get_logs """ params = { 'per_page': per_page, @@ -77,8 +76,8 @@ def get(self, id): Args: id (str): The log_id of the log to retrieve - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Logs/get_logs_by_id + + See: https://auth0.com/docs/api/management/v2#!/Logs/get_logs_by_id """ return self.client.get(self._url(id)) diff --git a/auth0/v3/management/resource_servers.py b/auth0/v3/management/resource_servers.py index 2a7ca07e..33f87054 100644 --- a/auth0/v3/management/resource_servers.py +++ b/auth0/v3/management/resource_servers.py @@ -45,8 +45,7 @@ def get_all(self, page=None, per_page=None, include_totals=False): include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/get_resource_servers + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/get_resource_servers """ params = { @@ -63,8 +62,7 @@ def get(self, id): Args: id (str): Id of the resource server to get. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/get_resource_servers_by_id + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/get_resource_servers_by_id """ return self.client.get(self._url(id)) @@ -75,8 +73,7 @@ def delete(self, id): Args: id (str): Id of resource server to delete. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/delete_resource_servers_by_id + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/delete_resource_servers_by_id """ return self.client.delete(self._url(id)) diff --git a/auth0/v3/management/rules.py b/auth0/v3/management/rules.py index 771185e4..1abb208d 100644 --- a/auth0/v3/management/rules.py +++ b/auth0/v3/management/rules.py @@ -50,8 +50,7 @@ def all(self, stage='login_success', enabled=True, fields=None, include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Rules/get_rules + See: https://auth0.com/docs/api/management/v2#!/Rules/get_rules """ params = { @@ -92,8 +91,7 @@ def get(self, id, fields=None, include_fields=True): to be included in the result, False otherwise (defaults to true). - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Rules/get_rules_by_id + See: https://auth0.com/docs/api/management/v2#!/Rules/get_rules_by_id """ params = {'fields': fields and ','.join(fields) or None, 'include_fields': str(include_fields).lower()} @@ -105,8 +103,7 @@ def delete(self, id): Args: id (str): The id of the rule to delete. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Rules/delete_rules_by_id + See: https://auth0.com/docs/api/management/v2#!/Rules/delete_rules_by_id """ return self.client.delete(self._url(id)) diff --git a/auth0/v3/management/stats.py b/auth0/v3/management/stats.py index 13d24acb..a03507d6 100644 --- a/auth0/v3/management/stats.py +++ b/auth0/v3/management/stats.py @@ -25,9 +25,8 @@ def active_users(self): Returns: An integer. - Args: - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Stats/get_active_users + + See: https://auth0.com/docs/api/management/v2#!/Stats/get_active_users """ return self.client.get(self._url('active-users')) @@ -42,8 +41,7 @@ def daily_stats(self, from_date=None, to_date=None): to_date (str): The last day of the period (inclusive) in YYYYMMDD format. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Stats/get_daily + See: https://auth0.com/docs/api/management/v2#!/Stats/get_daily """ return self.client.get(self._url('daily'), params={'from': from_date, diff --git a/auth0/v3/management/user_blocks.py b/auth0/v3/management/user_blocks.py index b91f8a8b..a6b0adb4 100644 --- a/auth0/v3/management/user_blocks.py +++ b/auth0/v3/management/user_blocks.py @@ -30,8 +30,7 @@ def get_by_identifier(self, identifier): Args: identifier (str): Should be any of: username, phone_number, email. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/User_Blocks/get_user_blocks + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/get_user_blocks """ params = {'identifier': identifier} @@ -44,8 +43,7 @@ def unblock_by_identifier(self, identifier): Args: identifier (str): Should be any of: username, phone_number, email. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/User_Blocks/delete_user_blocks + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/delete_user_blocks """ params = {'identifier': identifier} @@ -58,8 +56,7 @@ def get(self, id): Args: id (str): The user_id of the user to retrieve. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/User_Blocks/get_user_blocks_by_id + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/get_user_blocks_by_id """ return self.client.get(self._url(id)) @@ -70,8 +67,7 @@ def unblock(self, id): Args: id (str): The user_id of the user to update. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/User_Blocks/delete_user_blocks_by_id + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/delete_user_blocks_by_id """ return self.client.delete(self._url(id)) diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 91448aa4..46854b5c 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -53,8 +53,7 @@ def list(self, page=0, per_page=25, sort=None, connection=None, q=None, include_fields (bool, optional): True if the fields specified are to be include in the result, False otherwise. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Users/get_users + See: https://auth0.com/docs/api/management/v2#!/Users/get_users """ params = { 'per_page': per_page, @@ -97,8 +96,7 @@ def get(self, id, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be included in the result, False otherwise. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Users/get_users_by_id + See: https://auth0.com/docs/api/management/v2#!/Users/get_users_by_id """ params = { 'fields': fields and ','.join(fields) or None, @@ -113,8 +111,7 @@ def delete(self, id): Args: id (str): The user_id of the user to delete. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Users/delete_users_by_id + See: https://auth0.com/docs/api/management/v2#!/Users/delete_users_by_id """ return self.client.delete(self._url(id)) @@ -136,9 +133,8 @@ def delete_multifactor(self, id, provider): provider (str): The multifactor provider. Supported values 'duo' or 'google-authenticator' - - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Users/delete_multifactor_by_provider + + See: https://auth0.com/docs/api/management/v2#!/Users/delete_multifactor_by_provider """ url = self._url('{}/multifactor/{}'.format(id, provider)) return self.client.delete(url) @@ -153,8 +149,7 @@ def unlink_user_account(self, id, provider, user_id): user_id (str): The unique identifier for the user for the identity. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Users/delete_user_identity_by_user_id + See: https://auth0.com/docs/api/management/v2#!/Users/delete_user_identity_by_user_id """ url = self._url('{}/identities/{}/{}'.format(id, provider, user_id)) return self.client.delete(url) @@ -180,8 +175,7 @@ def regenerate_recovery_code(self, user_id): Args: user_id (str): The user_id of the user identity. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Users/post_recovery_code_regeneration + See: https://auth0.com/docs/api/management/v2#!/Users/post_recovery_code_regeneration """ url = self._url('%s/recovery-code-regeneration' % user_id) return self.client.post(url) @@ -191,6 +185,8 @@ def get_guardian_enrollments(self, user_id): Args: user_id (str): The user_id of the user to retrieve + + See: https://auth0.com/docs/api/management/v2#!/Users/get_enrollments """ url = self._url('%s/enrollments' % user_id) return self.client.get(url) diff --git a/auth0/v3/management/users_by_email.py b/auth0/v3/management/users_by_email.py index ea68610a..0c92e6a4 100644 --- a/auth0/v3/management/users_by_email.py +++ b/auth0/v3/management/users_by_email.py @@ -36,8 +36,7 @@ def search_users_by_email(self, email, fields=None, include_fields=True): include_fields (bool, optional): True if the fields specified are to be include in the result, False otherwise. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Users_By_Email/get_users_by_email + See: https://auth0.com/docs/api/management/v2#!/Users_By_Email/get_users_by_email """ params = { 'email': email.lower(), From f48a52c391e74b774e08993b2808c5f8ce9446b5 Mon Sep 17 00:00:00 2001 From: Chovin Date: Fri, 19 Oct 2018 10:43:46 +1000 Subject: [PATCH 012/663] fix link in readme (closes #149) --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index f25b19f0..391d169d 100644 --- a/README.rst +++ b/README.rst @@ -40,7 +40,7 @@ You can install the auth0 Python SDK issuing the following command. pip install auth0-python -Python 3.2 and 3.3 have reached [end-of-life](https://en.wikipedia.org/wiki/CPython#Version_history) +Python 3.2 and 3.3 have reached `end-of-life`_ and support will be removed in the near future. ==================== From 7645b0a62653fea7b91160c147be8e14bea6de83 Mon Sep 17 00:00:00 2001 From: Shubham Bhattar Date: Sat, 20 Oct 2018 23:46:03 +0530 Subject: [PATCH 013/663] Used COPY instead of ADD. The use of COPY is preferred over ADD when additional functionalities of ADD are not being used (like spraying the contents of a tar in a folder). --- dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockerfile b/dockerfile index 33305f06..2cf2ab93 100644 --- a/dockerfile +++ b/dockerfile @@ -2,8 +2,8 @@ FROM python:3 WORKDIR /home/app -ADD . /home/app -ADD ./.pypirc ~/ +COPY . /home/app +COPY ./.pypirc ~/ RUN cp /home/app/.pypirc ~ CMD python setup.py sdist bdist upload From 546cb3346f5125fd49e130c3330206a3572118f3 Mon Sep 17 00:00:00 2001 From: "Matt (IPv4)" Date: Mon, 22 Oct 2018 18:51:20 +0100 Subject: [PATCH 014/663] change mit url --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 9af8e9fe..0c66bd33 100644 --- a/README.rst +++ b/README.rst @@ -228,5 +228,5 @@ file for more info. :alt: Test coverage .. |license| image:: https://img.shields.io/:license-mit-blue.svg?style=flat-square - :target: http://doge.mit-license.org + :target: https://opensource.org/licenses/MIT :alt: License From ec893d0e8051aaeb526f525c9e4ec8b198b595db Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 24 Oct 2018 11:49:55 +0530 Subject: [PATCH 015/663] Change put to patch in link Co-Authored-By: vinayak42 --- auth0/v3/management/email_templates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/management/email_templates.py b/auth0/v3/management/email_templates.py index b2710382..49e7fc8b 100644 --- a/auth0/v3/management/email_templates.py +++ b/auth0/v3/management/email_templates.py @@ -58,7 +58,7 @@ def update(self, template_name, body): 'change_password', 'password_reset', 'mfa_oob_code'. body (dict): Attributes to update on the email template. - See: https://auth0.com/docs/api/management/v2#!/Email_Templates/put_email_templates_by_templateName + See: https://auth0.com/docs/api/management/v2#!/Email_Templates/patch_email_templates_by_templateName """ From 8158c4bad2189d34abf6bba4a59bfff1343a3a0f Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 24 Oct 2018 11:50:40 +0530 Subject: [PATCH 016/663] Update docstring Co-Authored-By: vinayak42 --- auth0/v3/management/guardian.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/management/guardian.py b/auth0/v3/management/guardian.py index 1a63d2a4..ab94d5b9 100644 --- a/auth0/v3/management/guardian.py +++ b/auth0/v3/management/guardian.py @@ -109,7 +109,7 @@ def create_enrollment_ticket(self, body): return self.client.post(self._url('enrollments/ticket'), data=body) def get_factor_providers(self, factor_name, name): - """Get Guardian SNS factor providers. + """Get Guardian SNS or SMS factor providers. Returns provider configuration Args: From 0bc41236d51be557b295ea070b6d2617eaabfaeb Mon Sep 17 00:00:00 2001 From: Saurabh Shrivastava Date: Tue, 6 Nov 2018 01:14:54 +0530 Subject: [PATCH 017/663] Fix hyperlink markup in README. --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index a12b3744..ad795945 100644 --- a/README.rst +++ b/README.rst @@ -46,7 +46,7 @@ For python3, use the following command pip3 install auth0-python -Python 3.2 and 3.3 have reached `end-of-life`_ and support will be removed in the near future. +Python 3.2 and 3.3 have reached `EOL `_ and support will be removed in the near future. ==================== Management SDK Usage From 175f9b7206db22b33f6288ef1f3c96c1390bc3ec Mon Sep 17 00:00:00 2001 From: Willem D'Haeseleer Date: Mon, 5 Nov 2018 13:14:08 -0800 Subject: [PATCH 018/663] remove lower casing of email --- auth0/v3/management/users_by_email.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/management/users_by_email.py b/auth0/v3/management/users_by_email.py index 0c92e6a4..24622a9c 100644 --- a/auth0/v3/management/users_by_email.py +++ b/auth0/v3/management/users_by_email.py @@ -39,7 +39,7 @@ def search_users_by_email(self, email, fields=None, include_fields=True): See: https://auth0.com/docs/api/management/v2#!/Users_By_Email/get_users_by_email """ params = { - 'email': email.lower(), + 'email': email, 'fields': fields and ','.join(fields) or None, 'include_fields': str(include_fields).lower() } From d665c79d8d55daf40b95e9b73460b0d0e6e2f6e2 Mon Sep 17 00:00:00 2001 From: Willem D'Haeseleer Date: Mon, 5 Nov 2018 13:19:32 -0800 Subject: [PATCH 019/663] test --- auth0/v3/test/management/test_users_by_email.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/test/management/test_users_by_email.py b/auth0/v3/test/management/test_users_by_email.py index 012c597e..2c6e9af3 100644 --- a/auth0/v3/test/management/test_users_by_email.py +++ b/auth0/v3/test/management/test_users_by_email.py @@ -16,7 +16,7 @@ def test_search_users_by_email(self, mock_rc): self.assertEqual('https://domain/api/v2/users-by-email', args[0]) self.assertEqual(kwargs['params'], { - 'email': 'a@b.com', + 'email': 'A@B.com', 'fields': None, 'include_fields': 'true' }) From 46f72eb9c0c7b568d3a2dd6550ef4fe4da5b89c2 Mon Sep 17 00:00:00 2001 From: gkwang Date: Mon, 5 Nov 2018 14:00:41 -0800 Subject: [PATCH 020/663] Add snyk policy file for unrelated vulnerable packages. --- .snyk | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .snyk diff --git a/.snyk b/.snyk new file mode 100644 index 00000000..3b39db80 --- /dev/null +++ b/.snyk @@ -0,0 +1,12 @@ +# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. +version: v1.12.0 +# ignores vulnerabilities until expiry date; change duration by modifying expiry date +ignore: + SNYK-PYTHON-REQUESTS-72435: + - '*': + reason: 'unaffected, only affects https->http authorization header redirection.' + expires: 2019-11-05T00:00:00.000Z + SNYK-PYTHON-REQUESTS-40470: + - '*': + reason: 'patched in latest python versions: https://bugs.python.org/issue27568' +patch: {} From ebff4305a4ad6146942b8fe62eb5d28eee6d2400 Mon Sep 17 00:00:00 2001 From: danishprakash Date: Wed, 24 Oct 2018 13:39:54 +0530 Subject: [PATCH 021/663] Add `client_id` param to ClientGrants.all Closes #76 --- auth0/v3/management/client_grants.py | 9 +++++--- .../v3/test/management/test_client_grants.py | 23 ++++++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/auth0/v3/management/client_grants.py b/auth0/v3/management/client_grants.py index 6b370154..719aab31 100644 --- a/auth0/v3/management/client_grants.py +++ b/auth0/v3/management/client_grants.py @@ -24,7 +24,7 @@ def _url(self, id=None): return url + '/' + id return url - def all(self, audience=None, page=None, per_page=None, include_totals=False): + def all(self, audience=None, page=None, per_page=None, include_totals=False, client_id=None): """Retrieves all client grants. Args: @@ -37,7 +37,9 @@ def all(self, audience=None, page=None, per_page=None, include_totals=False): include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. - + + client_id (string, optional): The id of a client to filter + See: https://auth0.com/docs/api/management/v2#!/Client_Grants/get_client_grants """ @@ -45,7 +47,8 @@ def all(self, audience=None, page=None, per_page=None, include_totals=False): 'audience': audience, 'page': page, 'per_page': per_page, - 'include_totals': str(include_totals).lower() + 'include_totals': str(include_totals).lower(), + 'client_id': client_id, } return self.client.get(self._url(), params=params) diff --git a/auth0/v3/test/management/test_client_grants.py b/auth0/v3/test/management/test_client_grants.py index 3d6b2926..1155649e 100644 --- a/auth0/v3/test/management/test_client_grants.py +++ b/auth0/v3/test/management/test_client_grants.py @@ -21,7 +21,8 @@ def test_all(self, mock_rc): 'audience': None, 'page': None, 'per_page': None, - 'include_totals': 'false' + 'include_totals': 'false', + 'client_id': None, }) # With audience @@ -34,7 +35,8 @@ def test_all(self, mock_rc): 'audience': 'http://domain.auth0.com/api/v2/', 'page': None, 'per_page': None, - 'include_totals': 'false' + 'include_totals': 'false', + 'client_id': None, }) # With pagination params @@ -47,7 +49,22 @@ def test_all(self, mock_rc): 'audience': None, 'page': 7, 'per_page': 23, - 'include_totals': 'true' + 'include_totals': 'true', + 'client_id': None, + }) + + # With client_id param + c.all(client_id='exampleid') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/client-grants', args[0]) + self.assertEqual(kwargs['params'], { + 'audience': None, + 'page': None, + 'per_page': None, + 'include_totals': 'false', + 'client_id': 'exampleid', }) @mock.patch('auth0.v3.management.client_grants.RestClient') From 777fb97d5a3e8ed2f5184091e33cbc89eabe5cd9 Mon Sep 17 00:00:00 2001 From: Mohammed Rishad Date: Wed, 7 Nov 2018 23:25:43 +0530 Subject: [PATCH 022/663] String Formatting Updated (#141) Updated string format --- auth0/v3/authentication/authorize_client.py | 2 +- auth0/v3/authentication/database.py | 6 +- auth0/v3/authentication/delegated.py | 2 +- auth0/v3/authentication/enterprise.py | 4 +- auth0/v3/authentication/get_token.py | 10 +- auth0/v3/authentication/passwordless.py | 6 +- auth0/v3/authentication/social.py | 2 +- auth0/v3/authentication/users.py | 6 +- auth0/v3/management/blacklists.py | 3 +- auth0/v3/management/client_grants.py | 4 +- auth0/v3/management/clients.py | 4 +- auth0/v3/management/connections.py | 5 +- auth0/v3/management/device_credentials.py | 4 +- auth0/v3/management/email_templates.py | 4 +- auth0/v3/management/emails.py | 4 +- auth0/v3/management/guardian.py | 10 +- auth0/v3/management/jobs.py | 6 +- auth0/v3/management/logs.py | 4 +- auth0/v3/management/resource_servers.py | 4 +- auth0/v3/management/rest.py | 14 +-- auth0/v3/management/rules.py | 4 +- auth0/v3/management/tenants.py | 2 +- auth0/v3/management/user_blocks.py | 4 +- auth0/v3/management/users.py | 12 +-- auth0/v3/management/users_by_email.py | 2 +- docs/conf.py | 113 ++++++++++---------- 26 files changed, 119 insertions(+), 122 deletions(-) diff --git a/auth0/v3/authentication/authorize_client.py b/auth0/v3/authentication/authorize_client.py index eb57bd93..f2bb4cb5 100644 --- a/auth0/v3/authentication/authorize_client.py +++ b/auth0/v3/authentication/authorize_client.py @@ -28,5 +28,5 @@ def authorize(self, client_id, audience=None, state=None, redirect_uri=None, } return self.get( - 'https://%s/authorize' % self.domain, + 'https://{}/authorize'.format(self.domain), params=params) diff --git a/auth0/v3/authentication/database.py b/auth0/v3/authentication/database.py index da017ab6..48aad9d9 100644 --- a/auth0/v3/authentication/database.py +++ b/auth0/v3/authentication/database.py @@ -25,7 +25,7 @@ def login(self, client_id, username, password, connection, id_token=None, """ warnings.warn("/oauth/ro will be deprecated in future releases", DeprecationWarning) return self.post( - 'https://%s/oauth/ro' % self.domain, + 'https://{}/oauth/ro'.format(self.domain), data={ 'client_id': client_id, 'username': username, @@ -44,7 +44,7 @@ def signup(self, client_id, email, password, connection): """ return self.post( - 'https://%s/dbconnections/signup' % self.domain, + 'https://{}/dbconnections/signup'.format(self.domain), data={ 'client_id': client_id, 'email': email, @@ -59,7 +59,7 @@ def change_password(self, client_id, email, connection, password=None): """ return self.post( - 'https://%s/dbconnections/change_password' % self.domain, + 'https://{}/dbconnections/change_password'.format(self.domain), data={ 'client_id': client_id, 'email': email, diff --git a/auth0/v3/authentication/delegated.py b/auth0/v3/authentication/delegated.py index f0eec7a9..4a91f79a 100644 --- a/auth0/v3/authentication/delegated.py +++ b/auth0/v3/authentication/delegated.py @@ -39,7 +39,7 @@ def get_token(self, client_id, target, api_type, grant_type, 'have a value') return self.post( - 'https://%s/delegation' % self.domain, + 'https://{}/delegation'.format(self.domain), headers={'Content-Type': 'application/json'}, data=data ) diff --git a/auth0/v3/authentication/enterprise.py b/auth0/v3/authentication/enterprise.py index 2fd87ad9..c3180756 100644 --- a/auth0/v3/authentication/enterprise.py +++ b/auth0/v3/authentication/enterprise.py @@ -26,7 +26,7 @@ def wsfed_metadata(self): """Returns the WS-Federation Metadata. """ - url = 'https://%s/wsfed/FederationMetadata' \ + url = 'https://{}/wsfed/FederationMetadata' \ '/2007-06/FederationMetadata.xml' - return self.get(url=url % self.domain) + return self.get(url=url.format(self.domain)) diff --git a/auth0/v3/authentication/get_token.py b/auth0/v3/authentication/get_token.py index 9d2179a7..4064e767 100644 --- a/auth0/v3/authentication/get_token.py +++ b/auth0/v3/authentication/get_token.py @@ -38,7 +38,7 @@ def authorization_code(self, client_id, client_secret, code, """ return self.post( - 'https://%s/oauth/token' % self.domain, + 'https://{}/oauth/token'.format(self.domain), data={ 'client_id': client_id, 'client_secret': client_secret, @@ -75,7 +75,7 @@ def authorization_code_pkce(self, client_id, code_verifier, code, """ return self.post( - 'https://%s/oauth/token' % self.domain, + 'https://{}/oauth/token'.format(self.domain), data={ 'client_id': client_id, 'code_verifier': code_verifier, @@ -110,7 +110,7 @@ def client_credentials(self, client_id, client_secret, audience, """ return self.post( - 'https://%s/oauth/token' % self.domain, + 'https://{}/oauth/token'.format(self.domain), data={ 'client_id': client_id, 'client_secret': client_secret, @@ -157,7 +157,7 @@ def login(self, client_id, client_secret, username, password, scope, realm, """ return self.post( - 'https://%s/oauth/token' % self.domain, + 'https://{}/oauth/token'.format(self.domain), data={ 'client_id': client_id, 'username': username, @@ -191,7 +191,7 @@ def refresh_token(self, client_id, client_secret, refresh_token, grant_type='ref """ return self.post( - 'https://%s/oauth/token' % self.domain, + 'https://{}/oauth/token'.format(self.domain), data={ 'client_id': client_id, 'client_secret': client_secret, diff --git a/auth0/v3/authentication/passwordless.py b/auth0/v3/authentication/passwordless.py index 91b47388..45434aaa 100644 --- a/auth0/v3/authentication/passwordless.py +++ b/auth0/v3/authentication/passwordless.py @@ -37,7 +37,7 @@ def email(self, client_id, email, send='link', auth_params=None): """ return self.post( - 'https://%s/passwordless/start' % self.domain, + 'https://{}/passwordless/start'.format(self.domain), data={ 'client_id': client_id, 'connection': 'email', @@ -53,7 +53,7 @@ def sms(self, client_id, phone_number): """ return self.post( - 'https://%s/passwordless/start' % self.domain, + 'https://{}/passwordless/start'.format(self.domain), data={ 'client_id': client_id, 'connection': 'sms', @@ -67,7 +67,7 @@ def sms_login(self, client_id, phone_number, code, scope='openid'): """ return self.post( - 'https://%s/oauth/ro' % self.domain, + 'https://{}/oauth/ro'.format(self.domain), data={ 'client_id': client_id, 'connection': 'sms', diff --git a/auth0/v3/authentication/social.py b/auth0/v3/authentication/social.py index 4f612897..a4c044b1 100644 --- a/auth0/v3/authentication/social.py +++ b/auth0/v3/authentication/social.py @@ -32,7 +32,7 @@ def login(self, client_id, access_token, connection, scope='openid'): """ return self.post( - 'https://%s/oauth/access_token' % self.domain, + 'https://{}/oauth/access_token'.format(self.domain), data={ 'client_id': client_id, 'access_token': access_token, diff --git a/auth0/v3/authentication/users.py b/auth0/v3/authentication/users.py index 1df6b24f..3594779b 100644 --- a/auth0/v3/authentication/users.py +++ b/auth0/v3/authentication/users.py @@ -26,8 +26,8 @@ def userinfo(self, access_token): """ return self.get( - url='https://%s/userinfo' % self.domain, - headers={'Authorization': 'Bearer %s' % access_token} + url='https://{}/userinfo'.format(self.domain), + headers={'Authorization': 'Bearer {}'.format(access_token)} ) def tokeninfo(self, jwt): @@ -46,7 +46,7 @@ def tokeninfo(self, jwt): """ warnings.warn("/tokeninfo will be deprecated in future releases", DeprecationWarning) return self.post( - url='https://%s/tokeninfo' % self.domain, + url='https://{}/tokeninfo'.format(self.domain), data={'id_token': jwt}, headers={'Content-Type': 'application/json'} ) diff --git a/auth0/v3/management/blacklists.py b/auth0/v3/management/blacklists.py index b1aa4d37..534f1909 100644 --- a/auth0/v3/management/blacklists.py +++ b/auth0/v3/management/blacklists.py @@ -2,7 +2,6 @@ class Blacklists(object): - """Auth0 blacklists endpoints Args: @@ -15,7 +14,7 @@ class Blacklists(object): """ def __init__(self, domain, token, telemetry=True): - self.url = 'https://%s/api/v2/blacklists/tokens' % domain + self.url = 'https://{}/api/v2/blacklists/tokens'.format(domain) self.client = RestClient(jwt=token, telemetry=telemetry) def get(self, aud=None): diff --git a/auth0/v3/management/client_grants.py b/auth0/v3/management/client_grants.py index 719aab31..43222569 100644 --- a/auth0/v3/management/client_grants.py +++ b/auth0/v3/management/client_grants.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/client-grants' % self.domain + url = 'https://{}/api/v2/client-grants'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def all(self, audience=None, page=None, per_page=None, include_totals=False, client_id=None): diff --git a/auth0/v3/management/clients.py b/auth0/v3/management/clients.py index 93ae8699..60db7a9f 100644 --- a/auth0/v3/management/clients.py +++ b/auth0/v3/management/clients.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/clients' % self.domain + url = 'https://{}/api/v2/clients'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def all(self, fields=None, include_fields=True, page=None, per_page=None, extra_params=None): diff --git a/auth0/v3/management/connections.py b/auth0/v3/management/connections.py index 483fe0e6..2e2db1c5 100644 --- a/auth0/v3/management/connections.py +++ b/auth0/v3/management/connections.py @@ -18,9 +18,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/connections' % self.domain + url = 'https://{}/api/v2/connections'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def all(self, strategy=None, fields=None, include_fields=True, page=None, per_page=None, extra_params=None): @@ -139,4 +139,3 @@ def delete_user_by_email(self, id, email): An empty dict. """ return self.client.delete(self._url(id) + '/users', params={'email': email}) - diff --git a/auth0/v3/management/device_credentials.py b/auth0/v3/management/device_credentials.py index d85a672c..516a70ac 100644 --- a/auth0/v3/management/device_credentials.py +++ b/auth0/v3/management/device_credentials.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/device-credentials' % self.domain + url = 'https://{}/api/v2/device-credentials'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def get(self, user_id, client_id, type, fields=None, include_fields=True): diff --git a/auth0/v3/management/email_templates.py b/auth0/v3/management/email_templates.py index 49e7fc8b..365b4d98 100644 --- a/auth0/v3/management/email_templates.py +++ b/auth0/v3/management/email_templates.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/email-templates' % self.domain + url = 'https://{}/api/v2/email-templates'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def create(self, body): diff --git a/auth0/v3/management/emails.py b/auth0/v3/management/emails.py index 0b1aae59..e709846b 100644 --- a/auth0/v3/management/emails.py +++ b/auth0/v3/management/emails.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/emails/provider' % self.domain + url = 'https://{}/api/v2/emails/provider'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def get(self, fields=None, include_fields=True): diff --git a/auth0/v3/management/guardian.py b/auth0/v3/management/guardian.py index ab94d5b9..e421b4b7 100644 --- a/auth0/v3/management/guardian.py +++ b/auth0/v3/management/guardian.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/guardian' % self.domain + url = 'https://{}/api/v2/guardian'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def all_factors(self): @@ -42,7 +42,7 @@ def update_factor(self, name, body): body (dict): Attributes to modify. See: https://auth0.com/docs/api/management/v2#!/Guardian/put_factors_by_name """ - url = self._url('factors/%s' % (name)) + url = self._url('factors/{}'.format(name)) return self.client.put(url, data=body) def update_templates(self, body): @@ -79,7 +79,7 @@ def get_enrollment(self, id): See: https://auth0.com/docs/api/management/v2#!/Guardian/get_enrollments_by_id """ - url = self._url('enrollments/%s' % (id)) + url = self._url('enrollments/{}'.format(id)) return self.client.get(url) def delete_enrollment(self, id): @@ -93,7 +93,7 @@ def delete_enrollment(self, id): See: https://auth0.com/docs/api/management/v2#!/Guardian/delete_enrollments_by_id """ - url = self._url('enrollments/%s' % (id)) + url = self._url('enrollments/{}'.format(id)) return self.client.delete(url) def create_enrollment_ticket(self, body): diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index c88cf999..c06f3db4 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, path=None): - url = 'https://%s/api/v2/jobs' % self.domain + url = 'https://{}/api/v2/jobs'.format(self.domain) if path is not None: - return url + '/' + path + return '{}/{}'.format(url, path) return url def get(self, id): @@ -42,7 +42,7 @@ def get_failed_job(self, id): See: https://auth0.com/docs/api/management/v2#!/Jobs/get_errors """ - url = self._url('%s/errors' % (id)) + url = self._url('{}/errors'.format(id)) return self.client.get(url) def export_users(self, body): diff --git a/auth0/v3/management/logs.py b/auth0/v3/management/logs.py index 46cf572a..d7b70288 100644 --- a/auth0/v3/management/logs.py +++ b/auth0/v3/management/logs.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/logs' % self.domain + url = 'https://{}/api/v2/logs'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def search(self, page=0, per_page=50, sort=None, q=None, diff --git a/auth0/v3/management/resource_servers.py b/auth0/v3/management/resource_servers.py index 33f87054..90a6be7b 100644 --- a/auth0/v3/management/resource_servers.py +++ b/auth0/v3/management/resource_servers.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/resource-servers' % self.domain + url = 'https://{}/api/v2/resource-servers'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def create(self, body): diff --git a/auth0/v3/management/rest.py b/auth0/v3/management/rest.py index 9f87614a..cca81c37 100644 --- a/auth0/v3/management/rest.py +++ b/auth0/v3/management/rest.py @@ -37,7 +37,7 @@ def __init__(self, jwt, telemetry=True): }).encode('utf-8') self.base_headers = { - 'User-Agent': 'Python/%s' % py_version, + 'User-Agent': 'Python/{}'.format(py_version), 'Auth0-Client': base64.b64encode(auth0_client), 'Content-Type': 'application/json' } @@ -47,7 +47,7 @@ def __init__(self, jwt, telemetry=True): def get(self, url, params=None): headers = self.base_headers.copy() headers.update({ - 'Authorization': 'Bearer %s' % self.jwt, + 'Authorization': 'Bearer {}'.format(self.jwt), }) response = requests.get(url, params=params, headers=headers) @@ -56,7 +56,7 @@ def get(self, url, params=None): def post(self, url, data=None): headers = self.base_headers.copy() headers.update({ - 'Authorization': 'Bearer %s' % self.jwt, + 'Authorization': 'Bearer {}'.format(self.jwt), 'Content-Type': 'application/json' }) @@ -67,7 +67,7 @@ def file_post(self, url, data=None, files=None): headers = self.base_headers.copy() headers.pop('Content-Type', None) headers.update({ - 'Authorization': 'Bearer %s' % self.jwt, + 'Authorization': 'Bearer {}'.format(self.jwt), }) response = requests.post(url, data=data, files=files, headers=headers) @@ -76,7 +76,7 @@ def file_post(self, url, data=None, files=None): def patch(self, url, data=None): headers = self.base_headers.copy() headers.update({ - 'Authorization': 'Bearer %s' % self.jwt, + 'Authorization': 'Bearer {}'.format(self.jwt), 'Content-Type': 'application/json' }) @@ -86,7 +86,7 @@ def patch(self, url, data=None): def put(self, url, data=None): headers = self.base_headers.copy() headers.update({ - 'Authorization': 'Bearer %s' % self.jwt, + 'Authorization': 'Bearer {}'.format(self.jwt), 'Content-Type': 'application/json' }) @@ -96,7 +96,7 @@ def put(self, url, data=None): def delete(self, url, params=None): headers = self.base_headers.copy() headers.update({ - 'Authorization': 'Bearer %s' % self.jwt, + 'Authorization': 'Bearer {}'.format(self.jwt), }) response = requests.delete(url, headers=headers, params=params or {}) diff --git a/auth0/v3/management/rules.py b/auth0/v3/management/rules.py index 1abb208d..5838a65d 100644 --- a/auth0/v3/management/rules.py +++ b/auth0/v3/management/rules.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/rules' % self.domain + url = 'https://{}/api/v2/rules'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def all(self, stage='login_success', enabled=True, fields=None, diff --git a/auth0/v3/management/tenants.py b/auth0/v3/management/tenants.py index 210165d2..b1faef70 100644 --- a/auth0/v3/management/tenants.py +++ b/auth0/v3/management/tenants.py @@ -19,7 +19,7 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self): - return 'https://%s/api/v2/tenants/settings' % self.domain + return 'https://{}/api/v2/tenants/settings'.format(self.domain) def get(self, fields=None, include_fields=True): """Get tenant settings. diff --git a/auth0/v3/management/user_blocks.py b/auth0/v3/management/user_blocks.py index a6b0adb4..82af8e51 100644 --- a/auth0/v3/management/user_blocks.py +++ b/auth0/v3/management/user_blocks.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/user-blocks' % self.domain + url = 'https://{}/api/v2/user-blocks'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def get_by_identifier(self, identifier): diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 46854b5c..6640e5eb 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -19,9 +19,9 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self, id=None): - url = 'https://%s/api/v2/users' % self.domain + url = 'https://{}/api/v2/users'.format(self.domain) if id is not None: - return url + '/' + id + return '{}/{}'.format(url, id) return url def list(self, page=0, per_page=25, sort=None, connection=None, q=None, @@ -166,7 +166,7 @@ def link_user_account(self, user_id, body): body (dict): Please see: https://auth0.com/docs/api/v2#!/Users/post_identities """ - url = self._url('%s/identities' % user_id) + url = self._url('{}/identities'.format(user_id)) return self.client.post(url, data=body) def regenerate_recovery_code(self, user_id): @@ -177,7 +177,7 @@ def regenerate_recovery_code(self, user_id): See: https://auth0.com/docs/api/management/v2#!/Users/post_recovery_code_regeneration """ - url = self._url('%s/recovery-code-regeneration' % user_id) + url = self._url('{}/recovery-code-regeneration'.format(user_id)) return self.client.post(url) def get_guardian_enrollments(self, user_id): @@ -188,7 +188,7 @@ def get_guardian_enrollments(self, user_id): See: https://auth0.com/docs/api/management/v2#!/Users/get_enrollments """ - url = self._url('%s/enrollments' % user_id) + url = self._url('{}/enrollments'.format(user_id)) return self.client.get(url) def get_log_events(self, user_id, page=0, per_page=50, sort=None, @@ -220,5 +220,5 @@ def get_log_events(self, user_id, page=0, per_page=50, sort=None, 'sort': sort } - url = self._url('%s/logs' % user_id) + url = self._url('{}/logs'.format(user_id)) return self.client.get(url, params=params) diff --git a/auth0/v3/management/users_by_email.py b/auth0/v3/management/users_by_email.py index 24622a9c..c9f582e7 100644 --- a/auth0/v3/management/users_by_email.py +++ b/auth0/v3/management/users_by_email.py @@ -19,7 +19,7 @@ def __init__(self, domain, token, telemetry=True): self.client = RestClient(jwt=token, telemetry=telemetry) def _url(self): - url = 'https://%s/api/v2/users-by-email' % self.domain + url = 'https://{}/api/v2/users-by-email'.format(self.domain) return url def search_users_by_email(self, email, fields=None, include_fields=True): diff --git a/docs/conf.py b/docs/conf.py index c1de7cd3..98802d8d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -19,14 +19,14 @@ # 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('.')) +# sys.path.insert(0, os.path.abspath('.')) sys.path.insert(0, os.path.abspath('../')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +# 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 @@ -47,7 +47,7 @@ source_suffix = '.rst' # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' @@ -75,9 +75,9 @@ # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -85,32 +85,31 @@ # The reST default role (used for this markup: `text`) to use for all # documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# 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 +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# 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 = [] +# modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False +# 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 @@ -120,21 +119,21 @@ # 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 = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -#html_title = None +# html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# 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 +# 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 @@ -149,62 +148,62 @@ # 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 = [] +# 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' +# 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 +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = 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 = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# 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' +# 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'} +# 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' +# html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = 'Auth0-Pythondoc' @@ -212,46 +211,46 @@ # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # Additional stuff for the LaTeX preamble. + # 'preamble': '', -# Latex figure (float) alignment -#'figure_align': 'htbp', + # 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, 'Auth0-Python.tex', u'Auth0 - Python Documentation', - u'Auth0', 'manual'), + (master_doc, 'Auth0-Python.tex', u'Auth0 - Python Documentation', + u'Auth0', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output --------------------------------------- @@ -264,7 +263,7 @@ ] # If true, show URL addresses after external links. -#man_show_urls = False +# man_show_urls = False # -- Options for Texinfo output ------------------------------------------- @@ -273,19 +272,19 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'Auth0-Python', u'Auth0 - Python Documentation', - author, 'Auth0-Python', 'One line description of project.', - 'Miscellaneous'), + (master_doc, 'Auth0-Python', u'Auth0 - Python Documentation', + author, 'Auth0-Python', 'One line description of project.', + 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False +# texinfo_no_detailmenu = False From 3c60f6e90bf06aa54b99b0e69001197e6003bdd4 Mon Sep 17 00:00:00 2001 From: Chad Knight Date: Wed, 7 Nov 2018 12:03:10 -0600 Subject: [PATCH 023/663] Add telemetry headers to AuthenticationBase (#152) * Add telemetry headers to AuthenticationBase fixes #136 * Use AuthenticationBase constructor in subclasses --- auth0/v3/authentication/authorize_client.py | 3 - auth0/v3/authentication/base.py | 50 +++++++++- auth0/v3/authentication/database.py | 3 - auth0/v3/authentication/delegated.py | 3 - auth0/v3/authentication/enterprise.py | 3 - auth0/v3/authentication/get_token.py | 3 - auth0/v3/authentication/logout.py | 3 - auth0/v3/authentication/passwordless.py | 3 - auth0/v3/authentication/social.py | 3 - auth0/v3/authentication/users.py | 3 - auth0/v3/test/authentication/test_base.py | 101 ++++++++++++++++++-- 11 files changed, 141 insertions(+), 37 deletions(-) diff --git a/auth0/v3/authentication/authorize_client.py b/auth0/v3/authentication/authorize_client.py index f2bb4cb5..db5060c5 100644 --- a/auth0/v3/authentication/authorize_client.py +++ b/auth0/v3/authentication/authorize_client.py @@ -9,9 +9,6 @@ class AuthorizeClient(AuthenticationBase): domain (str): Your auth0 domain (e.g: username.auth0.com) """ - def __init__(self, domain): - self.domain = domain - def authorize(self, client_id, audience=None, state=None, redirect_uri=None, response_type='code', scope='openid'): """Authorization code grant diff --git a/auth0/v3/authentication/base.py b/auth0/v3/authentication/base.py index 7f9eb3de..21e02aab 100644 --- a/auth0/v3/authentication/base.py +++ b/auth0/v3/authentication/base.py @@ -1,4 +1,7 @@ +import base64 import json +import sys +import platform import requests from ..exceptions import Auth0Error @@ -8,13 +11,56 @@ class AuthenticationBase(object): + """Base authentication object providing simple REST methods. + + Args: + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + """ + + def __init__(self, domain, telemetry=True): + self.domain = domain + + self.base_headers = {'Content-Type': 'application/json'} + + if telemetry: + py_version = platform.python_version() + version = sys.modules['auth0'].__version__ + + auth0_client = json.dumps({ + 'name': 'auth0-python', + 'version': version, + 'dependencies': [ + { + 'name': 'requests', + 'version': requests.__version__, + } + ], + 'environment': [ + { + 'name': 'python', + 'version': py_version, + } + ] + }).encode('utf-8') + + self.base_headers.update({ + 'User-Agent': 'Python/%s' % py_version, + 'Auth0-Client': base64.b64encode(auth0_client), + }) + def post(self, url, data=None, headers=None): + request_headers = self.base_headers.copy() + request_headers.update(headers) response = requests.post(url=url, data=json.dumps(data), - headers=headers) + headers=request_headers) return self._process_response(response) def get(self, url, params=None, headers=None): - return requests.get(url=url, params=params, headers=headers).text + request_headers = self.base_headers.copy() + request_headers.update(headers) + response = requests.get(url=url, params=params, headers=request_headers) + return response.text def _process_response(self, response): return self._parse(response).content() diff --git a/auth0/v3/authentication/database.py b/auth0/v3/authentication/database.py index 48aad9d9..8dc49e2c 100644 --- a/auth0/v3/authentication/database.py +++ b/auth0/v3/authentication/database.py @@ -10,9 +10,6 @@ class Database(AuthenticationBase): domain (str): Your auth0 domain (e.g: username.auth0.com) """ - def __init__(self, domain): - self.domain = domain - def login(self, client_id, username, password, connection, id_token=None, grant_type='password', device=None, scope='openid'): """Login using username and password diff --git a/auth0/v3/authentication/delegated.py b/auth0/v3/authentication/delegated.py index 4a91f79a..2a568f6f 100644 --- a/auth0/v3/authentication/delegated.py +++ b/auth0/v3/authentication/delegated.py @@ -9,9 +9,6 @@ class Delegated(AuthenticationBase): domain (str): Your auth0 domain (e.g: username.auth0.com) """ - def __init__(self, domain): - self.domain = domain - def get_token(self, client_id, target, api_type, grant_type, id_token=None, refresh_token=None, scope='openid'): diff --git a/auth0/v3/authentication/enterprise.py b/auth0/v3/authentication/enterprise.py index c3180756..63c3b115 100644 --- a/auth0/v3/authentication/enterprise.py +++ b/auth0/v3/authentication/enterprise.py @@ -9,9 +9,6 @@ class Enterprise(AuthenticationBase): domain (str): Your auth0 domain (e.g: username.auth0.com) """ - def __init__(self, domain): - self.domain = domain - def saml_metadata(self, client_id): """Get SAML2.0 Metadata. diff --git a/auth0/v3/authentication/get_token.py b/auth0/v3/authentication/get_token.py index 4064e767..6d254a5d 100644 --- a/auth0/v3/authentication/get_token.py +++ b/auth0/v3/authentication/get_token.py @@ -9,9 +9,6 @@ class GetToken(AuthenticationBase): domain (str): Your auth0 domain (e.g: username.auth0.com) """ - def __init__(self, domain): - self.domain = domain - def authorization_code(self, client_id, client_secret, code, redirect_uri, grant_type='authorization_code'): """Authorization code grant diff --git a/auth0/v3/authentication/logout.py b/auth0/v3/authentication/logout.py index 2c970d02..8d38a2c8 100644 --- a/auth0/v3/authentication/logout.py +++ b/auth0/v3/authentication/logout.py @@ -13,9 +13,6 @@ class Logout(AuthenticationBase): domain (str): Your auth0 domain (e.g: username.auth0.com) """ - def __init__(self, domain): - self.domain = domain - def logout(self, client_id, return_to, federated=False): """Logout diff --git a/auth0/v3/authentication/passwordless.py b/auth0/v3/authentication/passwordless.py index 45434aaa..83ed90e7 100644 --- a/auth0/v3/authentication/passwordless.py +++ b/auth0/v3/authentication/passwordless.py @@ -9,9 +9,6 @@ class Passwordless(AuthenticationBase): domain (str): Your auth0 domain (e.g: username.auth0.com) """ - def __init__(self, domain): - self.domain = domain - def email(self, client_id, email, send='link', auth_params=None): """Start flow sending an email. diff --git a/auth0/v3/authentication/social.py b/auth0/v3/authentication/social.py index a4c044b1..333333d6 100644 --- a/auth0/v3/authentication/social.py +++ b/auth0/v3/authentication/social.py @@ -9,9 +9,6 @@ class Social(AuthenticationBase): domain (str): Your auth0 domain (e.g: username.auth0.com) """ - def __init__(self, domain): - self.domain = domain - def login(self, client_id, access_token, connection, scope='openid'): """Login using a social provider's access token diff --git a/auth0/v3/authentication/users.py b/auth0/v3/authentication/users.py index 3594779b..56bed129 100644 --- a/auth0/v3/authentication/users.py +++ b/auth0/v3/authentication/users.py @@ -10,9 +10,6 @@ class Users(AuthenticationBase): domain (str): Your auth0 domain (e.g: username.auth0.com) """ - def __init__(self, domain): - self.domain = domain - def userinfo(self, access_token): """Returns the user information based on the Auth0 access token. diff --git a/auth0/v3/test/authentication/test_base.py b/auth0/v3/test/authentication/test_base.py index 218bf5bf..3032cd94 100644 --- a/auth0/v3/test/authentication/test_base.py +++ b/auth0/v3/test/authentication/test_base.py @@ -1,14 +1,57 @@ -import unittest +import base64 +import json import mock +import sys +import requests +import unittest from ...authentication.base import AuthenticationBase from ...exceptions import Auth0Error class TestBase(unittest.TestCase): + def test_telemetry_enabled_by_default(self): + ab = AuthenticationBase('auth0.com') + + user_agent = ab.base_headers['User-Agent'] + auth0_client_bytes = base64.b64decode(ab.base_headers['Auth0-Client']) + auth0_client_json = auth0_client_bytes.decode('utf-8') + auth0_client = json.loads(auth0_client_json) + content_type = ab.base_headers['Content-Type'] + + from auth0 import __version__ as auth0_version + python_version = '{}.{}.{}'.format(sys.version_info.major, + sys.version_info.minor, + sys.version_info.micro) + + client_info = { + 'name': 'auth0-python', 'version': auth0_version, + 'dependencies': [ + { + 'name': 'requests', + 'version': requests.__version__ + } + ], + 'environment': [ + { + 'name': 'python', + 'version': python_version + } + ] + } + + self.assertEqual(user_agent, 'Python/{}'.format(python_version)) + self.assertEqual(auth0_client, client_info) + self.assertEqual(content_type, 'application/json') + + def test_telemetry_disabled(self): + ab = AuthenticationBase('auth0.com', telemetry=False) + + self.assertEqual(ab.base_headers, {'Content-Type': 'application/json'}) + @mock.patch('requests.post') def test_post(self, mock_post): - ab = AuthenticationBase() + ab = AuthenticationBase('auth0.com', telemetry=False) mock_post.return_value.status_code = 200 mock_post.return_value.text = '{"x": "y"}' @@ -16,13 +59,34 @@ def test_post(self, mock_post): data = ab.post('the-url', data={'a': 'b'}, headers={'c': 'd'}) mock_post.assert_called_with(url='the-url', data='{"a": "b"}', - headers={'c': 'd'}) + headers={'c': 'd', 'Content-Type': 'application/json'}) + + self.assertEqual(data, {'x': 'y'}) + + @mock.patch('requests.post') + def test_post_includes_telemetry(self, mock_post): + ab = AuthenticationBase('auth0.com') + + mock_post.return_value.status_code = 200 + mock_post.return_value.text = '{"x": "y"}' + + data = ab.post('the-url', data={'a': 'b'}, headers={'c': 'd'}) + + self.assertEqual(mock_post.call_count, 1) + call_kwargs = mock_post.call_args[1] + self.assertEqual(call_kwargs['url'], 'the-url') + self.assertEqual(call_kwargs['data'], '{"a": "b"}') + headers = call_kwargs['headers'] + self.assertEqual(headers['c'], 'd') + self.assertEqual(headers['Content-Type'], 'application/json') + self.assertIn('User-Agent', headers) + self.assertIn('Auth0-Client', headers) self.assertEqual(data, {'x': 'y'}) @mock.patch('requests.post') def test_post_error(self, mock_post): - ab = AuthenticationBase() + ab = AuthenticationBase('auth0.com', telemetry=False) for error_status in [400, 500, None]: mock_post.return_value.status_code = error_status @@ -38,7 +102,7 @@ def test_post_error(self, mock_post): @mock.patch('requests.post') def test_post_error_with_code_property(self, mock_post): - ab = AuthenticationBase() + ab = AuthenticationBase('auth0.com', telemetry=False) for error_status in [400, 500, None]: mock_post.return_value.status_code = error_status @@ -54,7 +118,7 @@ def test_post_error_with_code_property(self, mock_post): @mock.patch('requests.post') def test_post_error_with_no_error_code(self, mock_post): - ab = AuthenticationBase() + ab = AuthenticationBase('auth0.com', telemetry=False) for error_status in [400, 500, None]: mock_post.return_value.status_code = error_status @@ -70,7 +134,7 @@ def test_post_error_with_no_error_code(self, mock_post): @mock.patch('requests.post') def test_post_error_with_text_response(self, mock_post): - ab = AuthenticationBase() + ab = AuthenticationBase('auth0.com', telemetry=False) for error_status in [400, 500, None]: mock_post.return_value.status_code = error_status @@ -87,7 +151,7 @@ def test_post_error_with_text_response(self, mock_post): @mock.patch('requests.post') def test_post_error_with_no_response_text(self, mock_post): - ab = AuthenticationBase() + ab = AuthenticationBase('auth0.com', telemetry=False) for error_status in [400, 500, None]: mock_post.return_value.status_code = error_status @@ -100,3 +164,24 @@ def test_post_error_with_no_response_text(self, mock_post): self.assertEqual(context.exception.error_code, 'a0.sdk.internal.unknown') self.assertEqual(context.exception.message, '') + + @mock.patch('requests.get') + def test_get_includes_telemetry(self, mock_get): + ab = AuthenticationBase('auth0.com') + + mock_get.return_value.status_code = 200 + mock_get.return_value.text = '{"x": "y"}' + + data = ab.get('the-url', params={'a': 'b'}, headers={'c': 'd'}) + + self.assertEqual(mock_get.call_count, 1) + call_kwargs = mock_get.call_args[1] + self.assertEqual(call_kwargs['url'], 'the-url') + self.assertEqual(call_kwargs['params'], {'a': 'b'}) + headers = call_kwargs['headers'] + self.assertEqual(headers['c'], 'd') + self.assertEqual(headers['Content-Type'], 'application/json') + self.assertIn('User-Agent', headers) + self.assertIn('Auth0-Client', headers) + + self.assertEqual(data, '{"x": "y"}') From bed48738c51c104d17d323ae4962652d5cf0e68b Mon Sep 17 00:00:00 2001 From: Chad Knight Date: Thu, 8 Nov 2018 10:26:10 -0600 Subject: [PATCH 024/663] Always include Content-Type header in management requests (#158) * always include Content-Type header in management requests * set authorization header in management constructor * string format in AuthenticationBase --- auth0/v3/authentication/base.py | 2 +- auth0/v3/management/rest.py | 32 +++++---------------------- auth0/v3/test/management/test_rest.py | 30 ++++++++++++++++++++++--- 3 files changed, 34 insertions(+), 30 deletions(-) diff --git a/auth0/v3/authentication/base.py b/auth0/v3/authentication/base.py index 21e02aab..c8d03cad 100644 --- a/auth0/v3/authentication/base.py +++ b/auth0/v3/authentication/base.py @@ -45,7 +45,7 @@ def __init__(self, domain, telemetry=True): }).encode('utf-8') self.base_headers.update({ - 'User-Agent': 'Python/%s' % py_version, + 'User-Agent': 'Python/{}'.format(py_version), 'Auth0-Client': base64.b64encode(auth0_client), }) diff --git a/auth0/v3/management/rest.py b/auth0/v3/management/rest.py index cca81c37..e3c6eac6 100644 --- a/auth0/v3/management/rest.py +++ b/auth0/v3/management/rest.py @@ -16,6 +16,10 @@ class RestClient(object): def __init__(self, jwt, telemetry=True): self.jwt = jwt + self.base_headers = { + 'Authorization': 'Bearer {}'.format(self.jwt), + 'Content-Type': 'application/json', + } if telemetry: py_version = platform.python_version() version = sys.modules['auth0'].__version__ @@ -36,29 +40,19 @@ def __init__(self, jwt, telemetry=True): ] }).encode('utf-8') - self.base_headers = { + self.base_headers.update({ 'User-Agent': 'Python/{}'.format(py_version), 'Auth0-Client': base64.b64encode(auth0_client), - 'Content-Type': 'application/json' - } - else: - self.base_headers = {} + }) def get(self, url, params=None): headers = self.base_headers.copy() - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - }) response = requests.get(url, params=params, headers=headers) return self._process_response(response) def post(self, url, data=None): headers = self.base_headers.copy() - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - 'Content-Type': 'application/json' - }) response = requests.post(url, data=json.dumps(data or {}), headers=headers) return self._process_response(response) @@ -66,38 +60,24 @@ def post(self, url, data=None): def file_post(self, url, data=None, files=None): headers = self.base_headers.copy() headers.pop('Content-Type', None) - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - }) response = requests.post(url, data=data, files=files, headers=headers) return self._process_response(response) def patch(self, url, data=None): headers = self.base_headers.copy() - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - 'Content-Type': 'application/json' - }) response = requests.patch(url, data=json.dumps(data or {}), headers=headers) return self._process_response(response) def put(self, url, data=None): headers = self.base_headers.copy() - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - 'Content-Type': 'application/json' - }) response = requests.put(url, data=json.dumps(data or {}), headers=headers) return self._process_response(response) def delete(self, url, params=None): headers = self.base_headers.copy() - headers.update({ - 'Authorization': 'Bearer {}'.format(self.jwt), - }) response = requests.delete(url, headers=headers, params=params or {}) return self._process_response(response) diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index 52187b7b..9d578436 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -13,7 +13,10 @@ class TestRest(unittest.TestCase): @mock.patch('requests.get') def test_get(self, mock_get): rc = RestClient(jwt='a-token', telemetry=False) - headers = {'Authorization': 'Bearer a-token'} + headers = { + 'Authorization': 'Bearer a-token', + 'Content-Type': 'application/json', + } mock_get.return_value.text = '["a", "b"]' mock_get.return_value.status_code = 200 @@ -198,6 +201,20 @@ def test_post_error_with_no_response_text(self, mock_post): self.assertEqual(context.exception.error_code, 'a0.sdk.internal.unknown') self.assertEqual(context.exception.message, '') + @mock.patch('requests.post') + def test_file_post_content_type_is_none(self, mock_post): + rc = RestClient(jwt='a-token', telemetry=False) + headers = {'Authorization': 'Bearer a-token'} + mock_post.return_value.status_code = 200 + mock_post.return_value.text = 'Success' + + data = {'some': 'data'} + files = [mock.Mock()] + + rc.file_post('the-url', data=data, files=files) + + mock_post.assert_called_once_with('the-url', data=data, files=files, headers=headers) + @mock.patch('requests.patch') def test_patch(self, mock_patch): rc = RestClient(jwt='a-token', telemetry=False) @@ -234,7 +251,10 @@ def test_patch_errors(self, mock_patch): @mock.patch('requests.delete') def test_delete(self, mock_delete): rc = RestClient(jwt='a-token', telemetry=False) - headers = {'Authorization': 'Bearer a-token'} + headers = { + 'Authorization': 'Bearer a-token', + 'Content-Type': 'application/json', + } mock_delete.return_value.text = '["a", "b"]' mock_delete.return_value.status_code = 200 @@ -262,8 +282,12 @@ def test_delete_errors(self, mock_delete): def test_disabled_telemetry(self): rc = RestClient(jwt='a-token', telemetry=False) + expected_headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer a-token', + } - self.assertEqual(rc.base_headers, {}) + self.assertEqual(rc.base_headers, expected_headers) def test_enabled_telemetry(self): rc = RestClient(jwt='a-token', telemetry=True) From 7c64a15888d6a8767b8587b1c03acf77fc77b604 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 9 Nov 2018 14:56:01 -0300 Subject: [PATCH 025/663] prepare release 3.4.0 (#168) --- CHANGELOG.md | 19 +++++++++++++++++++ auth0/__init__.py | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 139ecd88..e53aad93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,25 @@ Changes ======= +3.4.0 +------------------ + +**Added** +- Add `client_id` param to ClientGrants.all [\#159](https://github.com/auth0/auth0-python/pull/159) ([danishprakash](https://github.com/danishprakash)) +- Add telemetry headers to AuthenticationBase [\#152](https://github.com/auth0/auth0-python/pull/152) ([crgk](https://github.com/crgk)) +- Add pre-commit pypgrade hook and update supported versions [\#124](https://github.com/auth0/auth0-python/pull/124) ([hugovk](https://github.com/hugovk)) +- Implemented delete_user_by_email and test for connections [\#122](https://github.com/auth0/auth0-python/pull/122) ([runz0rd](https://github.com/runz0rd)) +- Adds user export job creation. [\#112](https://github.com/auth0/auth0-python/pull/112) ([dmark](https://github.com/dmark)) + +**Changed** +- String Formatting Updated [\#141](https://github.com/auth0/auth0-python/pull/141) ([vkmrishad](https://github.com/vkmrishad)) +- Uses Python built-in modules to retrieve Python and auth0-python version number [\#125](https://github.com/auth0/auth0-python/pull/125) ([edawine](https://github.com/edawine)) + +**Fixed** +- Stop lower-casing email on user search [\#167](https://github.com/auth0/auth0-python/pull/167) ([helmus](https://github.com/helmus)) +- Always include Content-Type header in management requests [\#158](https://github.com/auth0/auth0-python/pull/158) ([crgk](https://github.com/crgk)) + + 3.3.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 6a157dcb..f6310076 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.3.0' +__version__ = '3.4.0' From dc43a2bdf92387a4851d708b856631625cf7b9b6 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 27 Nov 2018 15:13:55 -0300 Subject: [PATCH 026/663] Add Revoke Refresh Token endpoint (#170) * add revoke refresh token endpoint * chore comments --- auth0/v3/authentication/revoke_token.py | 37 ++++++++++++++++++ .../test/authentication/test_revoke_token.py | 38 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 auth0/v3/authentication/revoke_token.py create mode 100644 auth0/v3/test/authentication/test_revoke_token.py diff --git a/auth0/v3/authentication/revoke_token.py b/auth0/v3/authentication/revoke_token.py new file mode 100644 index 00000000..1705bb12 --- /dev/null +++ b/auth0/v3/authentication/revoke_token.py @@ -0,0 +1,37 @@ +from .base import AuthenticationBase + + +class RevokeToken(AuthenticationBase): + + """Revoke Refresh Token endpoint + + Args: + domain (str): Your auth0 domain (e.g: username.auth0.com) + """ + + def revoke_refresh_token(self, client_id, token, client_secret=None): + """Revokes a Refresh Token if it has been compromised + + Each revocation request invalidates not only the specific token, but all other tokens + based on the same authorization grant. This means that all Refresh Tokens that have + been issued for the same user, application, and audience will be revoked. + + Args: + client_id (str): The Client ID for your Application + + token (str): The Refresh Token you want to revoke + + client_secret (str, optional): The Client Secret for your Application. + Required for confidential applications. + See: https://auth0.com/docs/applications/application-types#confidential-applications + + See: https://auth0.com/docs/api/authentication#refresh-token + """ + body = { + 'client_id': client_id, + 'token': token, + 'client_secret': client_secret + } + + return self.post( + 'https://{}/oauth/revoke'.format(self.domain), data=body) diff --git a/auth0/v3/test/authentication/test_revoke_token.py b/auth0/v3/test/authentication/test_revoke_token.py new file mode 100644 index 00000000..0aa40fd1 --- /dev/null +++ b/auth0/v3/test/authentication/test_revoke_token.py @@ -0,0 +1,38 @@ +import unittest +import mock +from ...authentication.revoke_token import RevokeToken + + +class TestRevokeToken(unittest.TestCase): + + @mock.patch('auth0.v3.authentication.revoke_token.RevokeToken.post') + def test_revoke_refresh_token(self, mock_post): + + a = RevokeToken('my.domain.com') + + # regular apps + a.revoke_refresh_token(client_id='cid', + token='tkn') + + args, kwargs = mock_post.call_args + + self.assertEqual(args[0], 'https://my.domain.com/oauth/revoke') + self.assertEqual(kwargs['data'], { + 'client_id': 'cid', + 'token': 'tkn', + 'client_secret': None + }) + + # confidential apps + a.revoke_refresh_token(client_id='cid', + token='tkn', + client_secret='sh!') + + args, kwargs = mock_post.call_args + + self.assertEqual(args[0], 'https://my.domain.com/oauth/revoke') + self.assertEqual(kwargs['data'], { + 'client_id': 'cid', + 'token': 'tkn', + 'client_secret': 'sh!' + }) From 578e3a37867ed3314af9cc53ea10fb3daeb148f5 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 27 Nov 2018 15:25:04 -0300 Subject: [PATCH 027/663] Add /dbconnections/signup with username and metadata (#169) * add dbconnections/signup with username and metadata * chore comments --- auth0/v3/authentication/database.py | 36 ++++++++++++++----- auth0/v3/test/authentication/test_database.py | 35 +++++++++++++++++- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/auth0/v3/authentication/database.py b/auth0/v3/authentication/database.py index 8dc49e2c..e9740d77 100644 --- a/auth0/v3/authentication/database.py +++ b/auth0/v3/authentication/database.py @@ -36,18 +36,38 @@ def login(self, client_id, username, password, connection, id_token=None, headers={'Content-Type': 'application/json'} ) - def signup(self, client_id, email, password, connection): - """Signup using username and password. + def signup(self, client_id, email, password, connection, username=None, + user_metadata=None): + """Signup using email and password. + + Args: + client_id (str): ID of the application to use. + + email (str): The user's email address. + + password (str): The user's desired password. + + connection (str): The name of the database connection where this user should be created. + + username (str, optional): The user's username, if required by the database connection. + + user_metadata (dict, optional): Additional key-value information to store for the user. + Some limitations apply, see: https://auth0.com/docs/metadata#metadata-restrictions + + See: https://auth0.com/docs/api/authentication#signup """ + body = { + 'client_id': client_id, + 'email': email, + 'password': password, + 'connection': connection, + 'username': username, + 'user_metadata': user_metadata + } return self.post( 'https://{}/dbconnections/signup'.format(self.domain), - data={ - 'client_id': client_id, - 'email': email, - 'password': password, - 'connection': connection, - }, + data=body, headers={'Content-Type': 'application/json'} ) diff --git a/auth0/v3/test/authentication/test_database.py b/auth0/v3/test/authentication/test_database.py index 9a23fc10..2fd0a3c1 100644 --- a/auth0/v3/test/authentication/test_database.py +++ b/auth0/v3/test/authentication/test_database.py @@ -41,6 +41,7 @@ def test_signup(self, mock_post): d = Database('my.domain.com') + # using only email and password d.signup(client_id='cid', email='a@b.com', password='pswd', @@ -54,7 +55,39 @@ def test_signup(self, mock_post): 'email': 'a@b.com', 'password': 'pswd', 'connection': 'conn', - }) + 'username': None, + 'user_metadata': None + }) + self.assertEqual(kwargs['headers'], { + 'Content-Type': 'application/json' + }) + + + # Using also username and metadata + sample_meta = { + 'hobby': 'surfing', + 'preference': { + 'color': 'pink' + } + } + d.signup(client_id='cid', + email='a@b.com', + password='pswd', + connection='conn', + username='usr', + user_metadata=sample_meta) + + args, kwargs = mock_post.call_args + + self.assertEqual(args[0], 'https://my.domain.com/dbconnections/signup') + self.assertEqual(kwargs['data'], { + 'client_id': 'cid', + 'email': 'a@b.com', + 'password': 'pswd', + 'connection': 'conn', + 'username': 'usr', + 'user_metadata': sample_meta + }) self.assertEqual(kwargs['headers'], { 'Content-Type': 'application/json' }) From 62ed528914573faea5d316b61052ab8e8635b1c9 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 27 Dec 2018 15:58:55 -0300 Subject: [PATCH 028/663] Release 3.5.0 (#176) --- CHANGELOG.md | 8 ++++++++ auth0/__init__.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e53aad93..6f0de1b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Changes ======= +3.5.0 +------------------ + +**Added** +- Add Revoke Refresh Token endpoint [\#170](https://github.com/auth0/auth0-python/pull/170) ([lbalmaceda](https://github.com/lbalmaceda)) +- Add /dbconnections/signup with username and metadata [\#169](https://github.com/auth0/auth0-python/pull/169) ([lbalmaceda](https://github.com/lbalmaceda)) + + 3.4.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index f6310076..01bd03ce 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.4.0' +__version__ = '3.5.0' From e09d69d440362a511d0de3ae7ef90d9a7d950b7b Mon Sep 17 00:00:00 2001 From: sagnew-dg <42581806+sagnew-dg@users.noreply.github.com> Date: Fri, 4 Jan 2019 09:09:18 -0700 Subject: [PATCH 029/663] Add grants, custom domains, rules_configs to API (#177) * Added method and unit test for Guardian SNS factor provider configuration and also added a bash script called clean.sh to clean-up any files before a commit. This helps developers like myself to clean things up before requesting a merge * Added another function and unit tests for Twileo factor provider configuration * Add class for grants * Added delete grant and unit test * Added custom_domain and unit tests * Removed Guardian changes - functionality already exists. * Fix typo in custom domain unit test * Fix typo * Added rotate secret and unit test to client * Added configure new custom domain and unit test * Added get custom domain configuration and unit test * Added verify custom domain and unit test * Added job results search and unit test * Added rulesconfigs and unit test * address comments from original PR (#160) * small code review fixes * code review comments; name rules configs methods set / unset because it's a PUT, fix docstrings, remove extra_params where not needed --- .gitignore | 1 + auth0/v3/management/__init__.py | 3 + auth0/v3/management/auth0.py | 6 ++ auth0/v3/management/clients.py | 16 +++- auth0/v3/management/custom_domains.py | 75 +++++++++++++++++++ auth0/v3/management/grants.py | 63 ++++++++++++++++ auth0/v3/management/jobs.py | 11 +++ auth0/v3/management/rules_configs.py | 60 +++++++++++++++ auth0/v3/test/management/test_clients.py | 14 ++++ .../v3/test/management/test_custom_domains.py | 52 +++++++++++++ auth0/v3/test/management/test_grants.py | 31 ++++++++ auth0/v3/test/management/test_jobs.py | 11 +++ .../v3/test/management/test_rules_configs.py | 43 +++++++++++ 13 files changed, 385 insertions(+), 1 deletion(-) create mode 100644 auth0/v3/management/custom_domains.py create mode 100644 auth0/v3/management/grants.py create mode 100644 auth0/v3/management/rules_configs.py create mode 100644 auth0/v3/test/management/test_custom_domains.py create mode 100644 auth0/v3/test/management/test_grants.py create mode 100644 auth0/v3/test/management/test_rules_configs.py diff --git a/.gitignore b/.gitignore index 4714cf42..40ae7098 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ nosetests.xml coverage.xml *,cover .hypothesis/ +.pytest_cache # Translations *.mo diff --git a/auth0/v3/management/__init__.py b/auth0/v3/management/__init__.py index 750b728b..3c8c0325 100644 --- a/auth0/v3/management/__init__.py +++ b/auth0/v3/management/__init__.py @@ -3,14 +3,17 @@ from .clients import Clients from .client_grants import ClientGrants from .connections import Connections +from .custom_domains import CustomDomains from .device_credentials import DeviceCredentials from .emails import Emails from .email_templates import EmailTemplates +from .grants import Grants from .guardian import Guardian from .jobs import Jobs from .logs import Logs from .resource_servers import ResourceServers from .rules import Rules +from .rules_configs import RulesConfigs from .stats import Stats from .tenants import Tenants from .tickets import Tickets diff --git a/auth0/v3/management/auth0.py b/auth0/v3/management/auth0.py index 10d534d4..b014d398 100644 --- a/auth0/v3/management/auth0.py +++ b/auth0/v3/management/auth0.py @@ -1,3 +1,5 @@ +from .grants import Grants +from .custom_domains import CustomDomains from .blacklists import Blacklists from .clients import Clients from .client_grants import ClientGrants @@ -10,6 +12,7 @@ from .logs import Logs from .resource_servers import ResourceServers from .rules import Rules +from .rules_configs import RulesConfigs from .stats import Stats from .tenants import Tenants from .tickets import Tickets @@ -31,15 +34,18 @@ def __init__(self, domain, token): self.blacklists = Blacklists(domain, token) self.clients = Clients(domain, token) self.client_grants = ClientGrants(domain, token) + self.custom_domains = CustomDomains(domain, token) self.connections = Connections(domain, token) self.device_credentials = DeviceCredentials(domain, token) self.emails = Emails(domain, token) self.email_templates = EmailTemplates(domain, token) + self.grants = Grants(domain.token) self.guardian = Guardian(domain, token) self.jobs = Jobs(domain, token) self.logs = Logs(domain, token) self.resource_servers = ResourceServers(domain, token) self.rules = Rules(domain, token) + self.rules_configs = RulesConfigs(domain, token) self.stats = Stats(domain, token) self.tenants = Tenants(domain, token) self.tickets = Tickets(domain, token) diff --git a/auth0/v3/management/clients.py b/auth0/v3/management/clients.py index 60db7a9f..a69dfa68 100644 --- a/auth0/v3/management/clients.py +++ b/auth0/v3/management/clients.py @@ -111,7 +111,7 @@ def update(self, id, body): attributes can only be updated with the update:client_keys scope. Args: - id (str): Client id of the application. + id (str): Client ID of the application. body (dict): Attributes to modify. See: https://auth0.com/docs/api/management/v2#!/Clients/patch_clients_by_id @@ -119,3 +119,17 @@ def update(self, id, body): return self.client.patch(self._url(id), data=body) + def rotate_secret(self, id): + """Rotate a client secret. The generated secret is NOT base64 encoded. + + Args: + id (str): Client ID of the application. + + body (dict): Attributes to modify. + See: https://auth0.com/docs/api/management/v2#!/Clients/post_rotate_secret + """ + + params = {'id': id } + + url = self._url('%s/rotate-secret' % id) + return self.client.get(url, params=params) \ No newline at end of file diff --git a/auth0/v3/management/custom_domains.py b/auth0/v3/management/custom_domains.py new file mode 100644 index 00000000..98e3d45e --- /dev/null +++ b/auth0/v3/management/custom_domains.py @@ -0,0 +1,75 @@ +from .rest import RestClient + + +class CustomDomains(object): + + """Auth0 custom domains endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + """ + + def __init__(self, domain, token, telemetry=True): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry) + + def _url(self, id=None): + url = 'https://%s/api/v2/custom-domains' % self.domain + if id is not None: + return url + '/' + id + return url + + def all(self): + """Retrieves all custom domains. + + See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/get_custom_domains + """ + return self.client.get(self._url()) + + def get(self, id): + """Retrieves custom domain. + + See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/get_custom_domains_by_id + """ + url = self._url('%s' % (id)) + return self.client.get(url) + + def delete(self, id): + """Deletes a grant. + + Args: + id (str): The id of the custom domain to delete + + + See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/delete_custom_domains_by_id + """ + url = self._url('%s' % (id)) + return self.client.delete(url) + + def create_new(self, body): + """Configure a new custom domain + + Args: + body (str): The domain, tye and verification method in json + + + See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/post_custom_domains + """ + return self.client.post(self._url(), data=body) + + def verify(self, id): + """Verify a custom domain + + Args: + id (str): The id of the custom domain to delete + + + See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/post_verify + """ + url = self._url('%s/verify' % (id)) + return self.client.post(url) \ No newline at end of file diff --git a/auth0/v3/management/grants.py b/auth0/v3/management/grants.py new file mode 100644 index 00000000..da3b332a --- /dev/null +++ b/auth0/v3/management/grants.py @@ -0,0 +1,63 @@ +from .rest import RestClient + + +class Grants(object): + + """Auth0 grants endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + """ + + def __init__(self, domain, token, telemetry=True): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry) + + def _url(self, id=None): + url = 'https://%s/api/v2/grants' % self.domain + if id is not None: + return url + '/' + id + return url + + def all(self, page=None, per_page=None, include_totals=False, extra_params=None): + """Retrieves all grants. + + Args: + page (int, optional): The result's page number (zero based). + + per_page (int, optional): The amount of entries per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. + + extra_params (dictionary, optional): The extra parameters to add to + the request. The page, per_page, and include_totals values + specified as parameters take precedence over the ones defined here. + + See: https://auth0.com/docs/api/management/v2#!/Grants/get_grants + """ + params = extra_params or {} + params.update({ + 'page': page, + 'per_page': per_page, + 'include_totals': str(include_totals).lower() + }) + + return self.client.get(self._url(), params=params) + + def delete(self, id): + """Deletes a grant. + + Args: + id (str): The id of the grant to delete + + + See: https://auth0.com/docs/api/management/v2#!/Grants/delete_grants_by_id + """ + url = self._url('%s' % (id)) + return self.client.delete(url) \ No newline at end of file diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index c06f3db4..9d8864b3 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -45,6 +45,17 @@ def get_failed_job(self, id): url = self._url('{}/errors'.format(id)) return self.client.get(url) + def get_results(self, job_id): + """Get results of a job + + Args: + job_id (str): The ID of the job. + + See: https://auth0.com/docs/api/management/v2#!/Jobs/get_results + """ + url = self._url('%s/results' % job_id) + return self.client.get(url) + def export_users(self, body): """Export all users to a file using a long running job. diff --git a/auth0/v3/management/rules_configs.py b/auth0/v3/management/rules_configs.py new file mode 100644 index 00000000..cfde7b02 --- /dev/null +++ b/auth0/v3/management/rules_configs.py @@ -0,0 +1,60 @@ +from .rest import RestClient + + +class RulesConfigs(object): + + """RulesConfig endpoint implementation. + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + """ + + def __init__(self, domain, token, telemetry=True): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry) + + def _url(self, id=None): + url = 'https://%s/api/v2/rules-configs' % self.domain + if id is not None: + return url + '/' + id + return url + + def all(self): + """Lists the config variable keys for rules. + + See: https://auth0.com/docs/api/management/v2#!/Rules_Configs/get_rules_configs + """ + return self.client.get(self._url()) + + def unset(self, key): + """Removes the rules config for a given key. + + Args: + key (str): rules config key to remove + + See: https://auth0.com/docs/api/management/v2#!/Rules_Configs/delete_rules_configs_by_key + """ + params = { + 'key': key + } + return self.client.delete(self._url(), params=params) + + def set(self, key, value): + """Sets the rules config for a given key. + + Args: + key (str): rules config key to set + + value (str): value to set for the rules config key + + See: https://auth0.com/docs/api/management/v2#!/Rules_Configs/put_rules_configs_by_key + """ + url = self._url('{}'.format(key)) + body = {'value': value} + return self.client.put(url, data=body) + diff --git a/auth0/v3/test/management/test_clients.py b/auth0/v3/test/management/test_clients.py index 1c952b0d..ae9d5e55 100644 --- a/auth0/v3/test/management/test_clients.py +++ b/auth0/v3/test/management/test_clients.py @@ -111,3 +111,17 @@ def test_update(self, mock_rc): self.assertEqual('https://domain/api/v2/clients/this-id', args[0]) self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) + + @mock.patch('auth0.v3.management.clients.RestClient') + def test_rotate_secret(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Clients(domain='domain', token='jwttoken') + c.rotate_secret('this-id') + + mock_instance.get.assert_called_with( + 'https://domain/api/v2/clients/this-id/rotate-secret', params={'id': 'this-id'} + ) + + + diff --git a/auth0/v3/test/management/test_custom_domains.py b/auth0/v3/test/management/test_custom_domains.py new file mode 100644 index 00000000..d80dc825 --- /dev/null +++ b/auth0/v3/test/management/test_custom_domains.py @@ -0,0 +1,52 @@ +import unittest +import mock +from ...management.custom_domains import CustomDomains + + +class TestCustomDomains(unittest.TestCase): + + @mock.patch('auth0.v3.management.custom_domains.RestClient') + def test_get_all(self, mock_rc): + mock_instance = mock_rc.return_value + + g = CustomDomains(domain='domain', token='jwttoken') + g.all() + + mock_instance.get.assert_called_with( + 'https://domain/api/v2/custom-domains' + ) + + @mock.patch('auth0.v3.management.custom_domains.RestClient') + def test_create_new(self, mock_rc): + mock_instance = mock_rc.return_value + + g = CustomDomains(domain='domain', token='jwttoken') + g.create_new(body={'a': 'b', 'c': 'd','e': 'f'}) + + args, kwargs = mock_instance.post.call_args + + self.assertEqual('https://domain/api/v2/custom-domains',args[0]) + self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd','e': 'f'}) + + @mock.patch('auth0.v3.management.custom_domains.RestClient') + def test_get_domain_by_id(self, mock_rc): + mock_instance = mock_rc.return_value + + g = CustomDomains(domain='domain', token='jwttoken') + g.get('an-id') + + mock_instance.get.assert_called_with('https://domain/api/v2/custom-domains/an-id') + + + @mock.patch('auth0.v3.management.custom_domains.RestClient') + def test_verify(self, mock_rc): + mock_instance = mock_rc.return_value + + g = CustomDomains(domain='domain', token='jwttoken') + g.verify('an-id') + + args, kwargs = mock_instance.post.call_args + + self.assertEqual('https://domain/api/v2/custom-domains/an-id/verify', args[0]) + + diff --git a/auth0/v3/test/management/test_grants.py b/auth0/v3/test/management/test_grants.py new file mode 100644 index 00000000..35d06369 --- /dev/null +++ b/auth0/v3/test/management/test_grants.py @@ -0,0 +1,31 @@ +import unittest +import mock +from ...management.grants import Grants + + +class TestGrants(unittest.TestCase): + + @mock.patch('auth0.v3.management.grants.RestClient') + def test_get_all(self, mock_rc): + mock_instance = mock_rc.return_value + + g = Grants(domain='domain', token='jwttoken') + g.all(extra_params={'user_id':'an-id', 'client_id': 'an-id', 'audience':'test'}) + + args, kwargs = mock_instance.get.call_args + + mock_instance.get.assert_called_with( + 'https://domain/api/v2/grants', params={'user_id': 'an-id', 'client_id': 'an-id', 'audience': 'test', 'page': None, 'per_page': None, 'include_totals': 'false'} + ) + + + @mock.patch('auth0.v3.management.grants.RestClient') + def test_delete(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Grants(domain='domain', token='jwttoken') + c.delete('an-id') + + mock_instance.delete.assert_called_with( + 'https://domain/api/v2/grants/an-id' + ) diff --git a/auth0/v3/test/management/test_jobs.py b/auth0/v3/test/management/test_jobs.py index 72870118..e2685c4e 100644 --- a/auth0/v3/test/management/test_jobs.py +++ b/auth0/v3/test/management/test_jobs.py @@ -27,6 +27,17 @@ def get_failed_job(self, mock_rc): 'https://domain/api/v2/jobs/an-id/errors', ) + @mock.patch('auth0.v3.management.jobs.RestClient') + def get_job_results(self, mock_rc): + mock_instance = mock_rc.return_value + + j = Jobs(domain='domain', token='jwttoken') + j.get('an-id') + + mock_instance.get.assert_called_with( + 'https://domain/api/v2/jobs/an-id/results', + ) + @mock.patch('auth0.v3.management.jobs.RestClient') def test_export_users(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_rules_configs.py b/auth0/v3/test/management/test_rules_configs.py new file mode 100644 index 00000000..68ee0181 --- /dev/null +++ b/auth0/v3/test/management/test_rules_configs.py @@ -0,0 +1,43 @@ +import unittest +import mock +from ...management.rules_configs import RulesConfigs + + +class TestRules(unittest.TestCase): + + @mock.patch('auth0.v3.management.rules_configs.RestClient') + def test_all(self, mock_rc): + mock_instance = mock_rc.return_value + + c = RulesConfigs(domain='domain', token='jwttoken') + + c.all() + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/rules-configs', args[0]) + + @mock.patch('auth0.v3.management.rules_configs.RestClient') + def test_unset(self, mock_rc): + mock_instance = mock_rc.return_value + + c = RulesConfigs(domain='domain', token='jwttoken') + c.unset('an-id') + + mock_instance.delete.assert_called_with( + 'https://domain/api/v2/rules-configs', params={'key': 'an-id'} + ) + + @mock.patch('auth0.v3.management.rules_configs.RestClient') + def test_set(self, mock_rc): + mock_instance = mock_rc.return_value + + g = RulesConfigs(domain='domain', token='jwttoken') + g.set('key', 'MY_RULES_CONFIG_VALUES') + + args, kwargs = mock_instance.put.call_args + self.assertEqual('https://domain/api/v2/rules-configs/key', args[0]) + + + + From b89731db628137a4169fb678c4292d558d26a7c1 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 4 Jan 2019 13:14:21 -0300 Subject: [PATCH 030/663] Release 3.6.0 (#178) --- CHANGELOG.md | 7 +++++++ auth0/__init__.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f0de1b2..f2287eac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changes ======= +3.6.0 +------------------ + +**Added** +- Add grants, custom domains, rules_configs to API [\#177](https://github.com/auth0/auth0-python/pull/177) ([sagnew-dg](https://github.com/sagnew-dg)) + + 3.5.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 01bd03ce..826cf62c 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.5.0' +__version__ = '3.6.0' From eb4b01755c22f10569b26b472d0dca2d324abb53 Mon Sep 17 00:00:00 2001 From: Brian Beck Date: Fri, 4 Jan 2019 12:52:52 -0700 Subject: [PATCH 031/663] fixed typo by changing '.' to ',' (#179) * fixed typo by changing '.' to ',' * added unit tests for auth0 object --- auth0/v3/management/auth0.py | 2 +- auth0/v3/test/management/test_auth0.py | 94 ++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 auth0/v3/test/management/test_auth0.py diff --git a/auth0/v3/management/auth0.py b/auth0/v3/management/auth0.py index b014d398..6d43bc53 100644 --- a/auth0/v3/management/auth0.py +++ b/auth0/v3/management/auth0.py @@ -39,7 +39,7 @@ def __init__(self, domain, token): self.device_credentials = DeviceCredentials(domain, token) self.emails = Emails(domain, token) self.email_templates = EmailTemplates(domain, token) - self.grants = Grants(domain.token) + self.grants = Grants(domain, token) self.guardian = Guardian(domain, token) self.jobs = Jobs(domain, token) self.logs = Logs(domain, token) diff --git a/auth0/v3/test/management/test_auth0.py b/auth0/v3/test/management/test_auth0.py new file mode 100644 index 00000000..2026ebe6 --- /dev/null +++ b/auth0/v3/test/management/test_auth0.py @@ -0,0 +1,94 @@ +import unittest +from ...management.auth0 import Auth0 +from ...management.blacklists import Blacklists +from ...management.clients import Clients +from ...management.client_grants import ClientGrants +from ...management.connections import Connections +from ...management.custom_domains import CustomDomains +from ...management.device_credentials import DeviceCredentials +from ...management.emails import Emails +from ...management.email_templates import EmailTemplates +from ...management.grants import Grants +from ...management.guardian import Guardian +from ...management.jobs import Jobs +from ...management.logs import Logs +from ...management.resource_servers import ResourceServers +from ...management.rules import Rules +from ...management.rules_configs import RulesConfigs +from ...management.stats import Stats +from ...management.tenants import Tenants +from ...management.tickets import Tickets +from ...management.user_blocks import UserBlocks +from ...management.users import Users +from ...management.users_by_email import UsersByEmail + + +class TestAuth0(unittest.TestCase): + + def setUp(self): + self.domain = 'user.some.domain' + self.token = 'a-token' + self.a0 = Auth0(self.domain, self.token) + + def test_blacklists(self): + self.assertIsInstance(self.a0.blacklists, Blacklists) + + def test_clients(self): + self.assertIsInstance(self.a0.clients, Clients) + + def test_client_grants(self): + self.assertIsInstance(self.a0.client_grants, ClientGrants) + + def test_custom_domains(self): + self.assertIsInstance(self.a0.custom_domains, CustomDomains) + + def test_connections(self): + self.assertIsInstance(self.a0.connections, Connections) + + def test_device_credentials(self): + self.assertIsInstance(self.a0.device_credentials, DeviceCredentials) + + def test_emails(self): + self.assertIsInstance(self.a0.emails, Emails) + + def test_email_templates(self): + self.assertIsInstance(self.a0.email_templates, EmailTemplates) + + def test_grants(self): + self.assertIsInstance(self.a0.grants, Grants) + + def test_guardian(self): + self.assertIsInstance(self.a0.guardian, Guardian) + + def test_jobs(self): + self.assertIsInstance(self.a0.jobs, Jobs) + + def test_logs(self): + self.assertIsInstance(self.a0.logs, Logs) + + def test_resource_servers(self): + self.assertIsInstance(self.a0.resource_servers, ResourceServers) + + def test_rules(self): + self.assertIsInstance(self.a0.rules, Rules) + + def test_rules_configs(self): + self.assertIsInstance(self.a0.rules_configs, RulesConfigs) + + def test_stats(self): + self.assertIsInstance(self.a0.stats, Stats) + + def test_tenants(self): + self.assertIsInstance(self.a0.tenants, Tenants) + + def test_tickets(self): + self.assertIsInstance(self.a0.tickets, Tickets) + + def test_user_blocks(self): + self.assertIsInstance(self.a0.user_blocks, UserBlocks) + + def test_users(self): + self.assertIsInstance(self.a0.users, Users) + + def test_users_by_email(self): + self.assertIsInstance(self.a0.users_by_email, UsersByEmail) From 8bf0d406ea077f6678bf273a741e93d0053f3d0f Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 4 Jan 2019 16:57:55 -0300 Subject: [PATCH 032/663] Release 3.6.1 (#180) --- CHANGELOG.md | 7 +++++++ auth0/__init__.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2287eac..7cfda2c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changes ======= +3.6.1 +------------------ + +**Fixed** +- Fixed Management API Grants class instantiation [\#179](https://github.com/auth0/auth0-python/pull/179) ([beck3905](https://github.com/beck3905)) + + 3.6.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 826cf62c..bce59824 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.6.0' +__version__ = '3.6.1' From 37e63a4f85e6a20ef770a8f26e75130840f3a9f8 Mon Sep 17 00:00:00 2001 From: Damien Guard Date: Mon, 11 Feb 2019 12:41:41 -0800 Subject: [PATCH 033/663] Adding GitHub issue and PR templates (#181) Add GitHub issue and PR templates --- .github/ISSUE_TEMPLATE.md | 39 ++++++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 35 ++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..cc10d9c7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,39 @@ +In order to efficiently and accurately address your issue or feature request, please read through the template below and answer all relevant questions. Your additional work here is greatly appreciated and will help us respond as quickly as possible. Please delete any sections or questions below that do not pertain to this request. + +For general support or usage questions, please use the [Auth0 Community](https://community.auth0.com/) or [Auth0 Support](https://support.auth0.com). + +### Description + +Description of the bug or feature request and why it's a problem. Consider including: + +- The use case or overall problem you're trying to solve +- Information about when the problem started + +### Prerequisites + +- [ ] I have checked the documentation for this library [Add a link]. +- [ ] I have checked the [Auth0 Community](https://community.auth0.com/) for related posts. +- [ ] I have checked for related or duplicate [Issues](https://github.com/auth0/auth0-python/issues) and [PRs](https://github.com/auth0/auth0-python/pulls). +- [ ] I have read the [Auth0 general contribution guidelines](https://github.com/auth0/open-source-template/blob/master/GENERAL-CONTRIBUTING.md). +- [ ] I have read the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md). +- [ ] I am reporting this to the correct repository [Add links to other related]. + +### Environment + +Please provide the following: + +- Version of the library being used +- Version of the platform or framework used, if applicable +- Relevant environmental versions (language version, OS version) +- Additional modules/plugins/add-ons that might be affecting your instance + +### Reproduction + +Detail the steps taken to reproduce this error and note if this issue can be reproduced consistently or if it is intermittent. + +Please include: + +- Code sample to reproduce the issue +- Log files (redact/remove sensitive information) +- Application settings (redact/remove sensitive information) +- Screenshots, if helpful diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..8fe0a08a --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,35 @@ +### Changes + +Please describe both what is changing and why this is important. Include: + +- Endpoints added, deleted, deprecated, or changed +- Classes and methods added, deleted, deprecated, or changed +- Screenshots of new or changed UI, if applicable +- A summary of usage if this is a new feature or change to a public API (this should also be added to relevant documentation once released) +- Any alternative designs or approaches considered + +### References + +Please include relevant links supporting this change such as a: + +- support ticket +- community post +- StackOverflow post +- support forum thread + +### Testing + +Please describe how this can be tested by reviewers. Be specific about anything not tested and reasons why. If this library has unit and/or integration testing, tests should be added for new functionality and existing tests should complete without errors. + +- [ ] This change adds unit test coverage +- [ ] This change adds integration test coverage +- [ ] This change has been tested on the latest version of the platform/language or why not + +### Checklist + +- [ ] I have read the [Auth0 general contribution guidelines](https://github.com/auth0/open-source-template/blob/master/GENERAL-CONTRIBUTING.md) +- [ ] I have read the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md) +- [ ] All existing and new tests complete without errors +- [ ] All code quality tools/guidelines in the [CONTRIBUTING documentation](CONTRIBUTING.md) have been run/followed +- [ ] All relevant assets have been compiled as directed in the [CONTRIBUTING documentation](CONTRIBUTING.md), if applicable +- [ ] The correct base branch is being used, if not `master` From c0086e6b804b911899c003959d69d85a31e749f4 Mon Sep 17 00:00:00 2001 From: Damien Guard Date: Mon, 11 Feb 2019 12:46:50 -0800 Subject: [PATCH 034/663] Fix doc link in Issue Template --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index cc10d9c7..4c0a5242 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -11,7 +11,7 @@ Description of the bug or feature request and why it's a problem. Consider inclu ### Prerequisites -- [ ] I have checked the documentation for this library [Add a link]. +- [ ] I have checked the [README documentation](https://github.com/auth0/auth0-python/blob/master/README.rst) - [ ] I have checked the [Auth0 Community](https://community.auth0.com/) for related posts. - [ ] I have checked for related or duplicate [Issues](https://github.com/auth0/auth0-python/issues) and [PRs](https://github.com/auth0/auth0-python/pulls). - [ ] I have read the [Auth0 general contribution guidelines](https://github.com/auth0/open-source-template/blob/master/GENERAL-CONTRIBUTING.md). From 8e487e901cea59fece825118151e9777ed73c55e Mon Sep 17 00:00:00 2001 From: Damien Guard Date: Mon, 11 Feb 2019 12:47:21 -0800 Subject: [PATCH 035/663] Update ISSUE_TEMPLATE.md --- .github/ISSUE_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 4c0a5242..44eae341 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -11,12 +11,12 @@ Description of the bug or feature request and why it's a problem. Consider inclu ### Prerequisites -- [ ] I have checked the [README documentation](https://github.com/auth0/auth0-python/blob/master/README.rst) +- [ ] I have checked the [README documentation](https://github.com/auth0/auth0-python/blob/master/README.rst). - [ ] I have checked the [Auth0 Community](https://community.auth0.com/) for related posts. - [ ] I have checked for related or duplicate [Issues](https://github.com/auth0/auth0-python/issues) and [PRs](https://github.com/auth0/auth0-python/pulls). - [ ] I have read the [Auth0 general contribution guidelines](https://github.com/auth0/open-source-template/blob/master/GENERAL-CONTRIBUTING.md). - [ ] I have read the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md). -- [ ] I am reporting this to the correct repository [Add links to other related]. +- [ ] I am reporting this to the correct repository. ### Environment From 36f4150ba12bdd9540eae654972876a8c6b56487 Mon Sep 17 00:00:00 2001 From: Josh Cunningham Date: Mon, 18 Feb 2019 10:16:04 -0800 Subject: [PATCH 036/663] Update PULL_REQUEST_TEMPLATE.md (#182) --- .github/PULL_REQUEST_TEMPLATE.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8fe0a08a..92b54230 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -30,6 +30,3 @@ Please describe how this can be tested by reviewers. Be specific about anything - [ ] I have read the [Auth0 general contribution guidelines](https://github.com/auth0/open-source-template/blob/master/GENERAL-CONTRIBUTING.md) - [ ] I have read the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md) - [ ] All existing and new tests complete without errors -- [ ] All code quality tools/guidelines in the [CONTRIBUTING documentation](CONTRIBUTING.md) have been run/followed -- [ ] All relevant assets have been compiled as directed in the [CONTRIBUTING documentation](CONTRIBUTING.md), if applicable -- [ ] The correct base branch is being used, if not `master` From 533018bc10b289683a4b4277ea97165963fe8051 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 4 Apr 2019 12:34:03 -0300 Subject: [PATCH 037/663] Remove default value for search_engine (#185) --- auth0/v3/management/users.py | 7 ++++--- auth0/v3/test/management/test_users.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 6640e5eb..396d73c4 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -25,7 +25,7 @@ def _url(self, id=None): return url def list(self, page=0, per_page=25, sort=None, connection=None, q=None, - search_engine='v1', include_totals=True, fields=None, + search_engine=None, include_totals=True, fields=None, include_fields=True): """List or search users. @@ -43,8 +43,9 @@ def list(self, page=0, per_page=25, sort=None, connection=None, q=None, in app_metadata, user_metadata or the normalized user profile are searchable. - search_engine (str, optional): Use 'v2' if you want to try our new - search engine. + search_engine (str, optional): The version of the search_engine to use + when querying for users. Will default to the latest version available. + See: https://auth0.com/docs/users/search fields (list of str, optional): A list of fields to include or exclude from the result (depending on include_fields). Empty to diff --git a/auth0/v3/test/management/test_users.py b/auth0/v3/test/management/test_users.py index b13f600f..36a57573 100644 --- a/auth0/v3/test/management/test_users.py +++ b/auth0/v3/test/management/test_users.py @@ -24,7 +24,7 @@ def test_list(self, mock_rc): 'fields': None, 'include_fields': 'true', 'q': None, - 'search_engine': 'v1' + 'search_engine': None }) u.list(page=1, per_page=50, sort='s', connection='con', q='q', From b693a7ded56c8a752dffd1af1373ebc4319c877c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 4 Apr 2019 12:52:08 -0300 Subject: [PATCH 038/663] Release 3.7.0 (#186) --- CHANGELOG.md | 7 +++++++ auth0/__init__.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cfda2c9..c1b412bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changes ======= +3.7.0 +------------------ + +**Changed** +- Remove default value for search_engine [\#185](https://github.com/auth0/auth0-python/pull/185) ([lbalmaceda](https://github.com/lbalmaceda)) + + 3.6.1 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index bce59824..8c3336cc 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.6.1' +__version__ = '3.7.0' From d74593448c8cbc268c824f7952fd227d0950d637 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 12 Apr 2019 12:02:46 -0300 Subject: [PATCH 039/663] update telemetry format (#187) --- auth0/v3/authentication/base.py | 15 +++------------ auth0/v3/management/rest.py | 18 +++++------------- auth0/v3/test/authentication/test_base.py | 18 +++++------------- auth0/v3/test/management/test_rest.py | 18 +++++------------- 4 files changed, 18 insertions(+), 51 deletions(-) diff --git a/auth0/v3/authentication/base.py b/auth0/v3/authentication/base.py index c8d03cad..1b670e32 100644 --- a/auth0/v3/authentication/base.py +++ b/auth0/v3/authentication/base.py @@ -30,18 +30,9 @@ def __init__(self, domain, telemetry=True): auth0_client = json.dumps({ 'name': 'auth0-python', 'version': version, - 'dependencies': [ - { - 'name': 'requests', - 'version': requests.__version__, - } - ], - 'environment': [ - { - 'name': 'python', - 'version': py_version, - } - ] + 'env': { + 'python': py_version, + } }).encode('utf-8') self.base_headers.update({ diff --git a/auth0/v3/management/rest.py b/auth0/v3/management/rest.py index e3c6eac6..aafa25fe 100644 --- a/auth0/v3/management/rest.py +++ b/auth0/v3/management/rest.py @@ -25,19 +25,11 @@ def __init__(self, jwt, telemetry=True): version = sys.modules['auth0'].__version__ auth0_client = json.dumps({ - 'name': 'auth0-python', 'version': version, - 'dependencies': [ - { - 'name': 'requests', - 'version': requests.__version__, - } - ], - 'environment': [ - { - 'name': 'python', - 'version': py_version, - } - ] + 'name': 'auth0-python', + 'version': version, + 'env': { + 'python': py_version, + } }).encode('utf-8') self.base_headers.update({ diff --git a/auth0/v3/test/authentication/test_base.py b/auth0/v3/test/authentication/test_base.py index 3032cd94..0f20dcf7 100644 --- a/auth0/v3/test/authentication/test_base.py +++ b/auth0/v3/test/authentication/test_base.py @@ -25,19 +25,11 @@ def test_telemetry_enabled_by_default(self): sys.version_info.micro) client_info = { - 'name': 'auth0-python', 'version': auth0_version, - 'dependencies': [ - { - 'name': 'requests', - 'version': requests.__version__ - } - ], - 'environment': [ - { - 'name': 'python', - 'version': python_version - } - ] + 'name': 'auth0-python', + 'version': auth0_version, + 'env': { + 'python': python_version + } } self.assertEqual(user_agent, 'Python/{}'.format(python_version)) diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index 9d578436..9403514b 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -304,19 +304,11 @@ def test_enabled_telemetry(self): sys.version_info.micro) client_info = { - 'name': 'auth0-python', 'version': auth0_version, - 'dependencies': [ - { - 'name': 'requests', - 'version': requests.__version__ - } - ], - 'environment': [ - { - 'name': 'python', - 'version': python_version - } - ] + 'name': 'auth0-python', + 'version': auth0_version, + 'env': { + 'python': python_version + } } self.assertEqual(user_agent, 'Python/{}'.format(python_version)) From 34adad3f342226aaaa6071387fa405ab840e5c02 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 12 Apr 2019 16:34:27 -0300 Subject: [PATCH 040/663] Release 3.7.1 (#188) --- CHANGELOG.md | 7 +++++++ auth0/__init__.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1b412bd..be60a52c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changes ======= +3.7.1 +------------------ + +**Fixed** +- Update telemetry format [\#187](https://github.com/auth0/auth0-python/pull/187) ([lbalmaceda](https://github.com/lbalmaceda)) + + 3.7.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 8c3336cc..380cd80a 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.7.0' +__version__ = '3.7.1' From c666de8225dbc3872c88e5f6c2c260f62c4627db Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 2 May 2019 17:25:55 -0300 Subject: [PATCH 041/663] Fix wrong HTTP method being used for rotating client secret (#191) --- auth0/v3/management/clients.py | 4 ++-- auth0/v3/test/management/test_clients.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/auth0/v3/management/clients.py b/auth0/v3/management/clients.py index a69dfa68..c0142179 100644 --- a/auth0/v3/management/clients.py +++ b/auth0/v3/management/clients.py @@ -129,7 +129,7 @@ def rotate_secret(self, id): See: https://auth0.com/docs/api/management/v2#!/Clients/post_rotate_secret """ - params = {'id': id } + data = {'id': id } url = self._url('%s/rotate-secret' % id) - return self.client.get(url, params=params) \ No newline at end of file + return self.client.post(url, data=data) \ No newline at end of file diff --git a/auth0/v3/test/management/test_clients.py b/auth0/v3/test/management/test_clients.py index ae9d5e55..4e4c10ee 100644 --- a/auth0/v3/test/management/test_clients.py +++ b/auth0/v3/test/management/test_clients.py @@ -119,8 +119,8 @@ def test_rotate_secret(self, mock_rc): c = Clients(domain='domain', token='jwttoken') c.rotate_secret('this-id') - mock_instance.get.assert_called_with( - 'https://domain/api/v2/clients/this-id/rotate-secret', params={'id': 'this-id'} + mock_instance.post.assert_called_with( + 'https://domain/api/v2/clients/this-id/rotate-secret', data={'id': 'this-id'} ) From 75ee881b17b5326acfc49e66034c1a87356149dd Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 2 May 2019 17:58:12 -0300 Subject: [PATCH 042/663] Release 3.7.2 (#192) Release 3.7.2 --- CHANGELOG.md | 6 ++++++ DEVELOPMENT.rst | 3 ++- auth0/__init__.py | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be60a52c..2d872b28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changes ======= +3.7.2 +------------------ + +**Fixed** +- Fix HTTP method used for rotating Client secret [\#191](https://github.com/auth0/auth0-python/pull/191) ([lbalmaceda](https://github.com/lbalmaceda)) + 3.7.1 ------------------ diff --git a/DEVELOPMENT.rst b/DEVELOPMENT.rst index 0c02cc40..cf4fb101 100644 --- a/DEVELOPMENT.rst +++ b/DEVELOPMENT.rst @@ -24,7 +24,8 @@ Instructions to upload auth0-python to PyPI .. code-block:: bash - python setup.py sdist bdist upload + python3 setup.py sdist bdist_wheel --universal + twine upload --repository-url https://upload.pypi.org/legacy/ dist/* or do it using docker: diff --git a/auth0/__init__.py b/auth0/__init__.py index 380cd80a..368b1f26 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.7.1' +__version__ = '3.7.2' From af5d863ffe75a4a7cd729c9d084cad6b37bd632e Mon Sep 17 00:00:00 2001 From: Damien Guard Date: Fri, 3 May 2019 14:39:01 -0700 Subject: [PATCH 043/663] Setup the CODEOWNERS for pull request reviews (#193) --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..6a263cd8 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @auth0/sdk-team-approvers From a2706a57103ad41edde9a9e8c9f6613d4b37c069 Mon Sep 17 00:00:00 2001 From: Jeff Hunken Date: Fri, 10 May 2019 11:04:19 -0700 Subject: [PATCH 044/663] Fix rules_config#unset (#195) * use path param instead of query param * fix unittest --- auth0/v3/management/rules_configs.py | 5 +---- auth0/v3/test/management/test_rules_configs.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/auth0/v3/management/rules_configs.py b/auth0/v3/management/rules_configs.py index cfde7b02..686f1013 100644 --- a/auth0/v3/management/rules_configs.py +++ b/auth0/v3/management/rules_configs.py @@ -39,10 +39,7 @@ def unset(self, key): See: https://auth0.com/docs/api/management/v2#!/Rules_Configs/delete_rules_configs_by_key """ - params = { - 'key': key - } - return self.client.delete(self._url(), params=params) + return self.client.delete(self._url(key)) def set(self, key, value): """Sets the rules config for a given key. diff --git a/auth0/v3/test/management/test_rules_configs.py b/auth0/v3/test/management/test_rules_configs.py index 68ee0181..d3c41e5b 100644 --- a/auth0/v3/test/management/test_rules_configs.py +++ b/auth0/v3/test/management/test_rules_configs.py @@ -25,7 +25,7 @@ def test_unset(self, mock_rc): c.unset('an-id') mock_instance.delete.assert_called_with( - 'https://domain/api/v2/rules-configs', params={'key': 'an-id'} + 'https://domain/api/v2/rules-configs/an-id' ) @mock.patch('auth0.v3.management.rules_configs.RestClient') From 0c5634c6e087e51a870283fabc4cf72d85501c8c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 31 May 2019 16:47:56 -0300 Subject: [PATCH 045/663] bump requests dependency to latest --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6aad85c6..e44d855b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -requests==2.8.1 +requests>=2.22.0 mock==1.3.0 pre-commit From 2f51218a6fa275e51aadc37fcd375772dc96f4ae Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 7 Jun 2019 15:56:26 -0300 Subject: [PATCH 046/663] Release 3.8.0 (#197) --- CHANGELOG.md | 9 +++++++++ auth0/__init__.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d872b28..192d6542 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ Changes ======= +3.8.0 +------------------ + +**Fixed** +- rules_config.unset fix [\#195](https://github.com/auth0/auth0-python/pull/195) ([jhunken](https://github.com/jhunken)) + +**Security** +- Update requests dependency to latest version [\#196](https://github.com/auth0/auth0-python/pull/196) ([lbalmaceda](https://github.com/lbalmaceda)) + 3.7.2 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 368b1f26..99d6aece 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.7.2' +__version__ = '3.8.0' From 7a25a0c0b5f584025567a46a6721dedb08144256 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 13 Jun 2019 15:29:58 -0300 Subject: [PATCH 047/663] fix dictionary update call with None argument --- auth0/v3/authentication/base.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/auth0/v3/authentication/base.py b/auth0/v3/authentication/base.py index 1b670e32..8d108718 100644 --- a/auth0/v3/authentication/base.py +++ b/auth0/v3/authentication/base.py @@ -42,14 +42,13 @@ def __init__(self, domain, telemetry=True): def post(self, url, data=None, headers=None): request_headers = self.base_headers.copy() - request_headers.update(headers) - response = requests.post(url=url, data=json.dumps(data), - headers=request_headers) + request_headers.update(headers or {}) + response = requests.post(url=url, json=data, headers=request_headers) return self._process_response(response) def get(self, url, params=None, headers=None): request_headers = self.base_headers.copy() - request_headers.update(headers) + request_headers.update(headers or {}) response = requests.get(url=url, params=params, headers=request_headers) return response.text From 4a7d304bf259b448930ec5e922983d1838aeb7f0 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 13 Jun 2019 15:30:35 -0300 Subject: [PATCH 048/663] fix response not property being converted when JSON --- auth0/v3/authentication/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/authentication/base.py b/auth0/v3/authentication/base.py index 8d108718..8e60ff88 100644 --- a/auth0/v3/authentication/base.py +++ b/auth0/v3/authentication/base.py @@ -50,7 +50,7 @@ def get(self, url, params=None, headers=None): request_headers = self.base_headers.copy() request_headers.update(headers or {}) response = requests.get(url=url, params=params, headers=request_headers) - return response.text + return self._process_response(response) def _process_response(self, response): return self._parse(response).content() From b0a5a91eb5537e2dd587275bf2f389b286ec6f76 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 13 Jun 2019 15:31:56 -0300 Subject: [PATCH 049/663] call request using json instead of data --- auth0/v3/management/rest.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/auth0/v3/management/rest.py b/auth0/v3/management/rest.py index aafa25fe..44d9342b 100644 --- a/auth0/v3/management/rest.py +++ b/auth0/v3/management/rest.py @@ -46,7 +46,7 @@ def get(self, url, params=None): def post(self, url, data=None): headers = self.base_headers.copy() - response = requests.post(url, data=json.dumps(data or {}), headers=headers) + response = requests.post(url, json=data, headers=headers) return self._process_response(response) def file_post(self, url, data=None, files=None): @@ -59,13 +59,13 @@ def file_post(self, url, data=None, files=None): def patch(self, url, data=None): headers = self.base_headers.copy() - response = requests.patch(url, data=json.dumps(data or {}), headers=headers) + response = requests.patch(url, json=data, headers=headers) return self._process_response(response) def put(self, url, data=None): headers = self.base_headers.copy() - response = requests.put(url, data=json.dumps(data or {}), headers=headers) + response = requests.put(url, json=data, headers=headers) return self._process_response(response) def delete(self, url, params=None): From ff72ccec6d3b9981cd03f54bdf33de1332958320 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 13 Jun 2019 15:32:32 -0300 Subject: [PATCH 050/663] remove explicit headers arg. defaults already set it --- auth0/v3/authentication/database.py | 9 +++------ auth0/v3/authentication/delegated.py | 1 - auth0/v3/authentication/get_token.py | 15 +++++---------- auth0/v3/authentication/logout.py | 6 ++---- auth0/v3/authentication/passwordless.py | 9 +++------ auth0/v3/authentication/social.py | 3 +-- auth0/v3/authentication/users.py | 3 +-- 7 files changed, 15 insertions(+), 31 deletions(-) diff --git a/auth0/v3/authentication/database.py b/auth0/v3/authentication/database.py index e9740d77..f8673849 100644 --- a/auth0/v3/authentication/database.py +++ b/auth0/v3/authentication/database.py @@ -32,8 +32,7 @@ def login(self, client_id, username, password, connection, id_token=None, 'device': device, 'grant_type': grant_type, 'scope': scope, - }, - headers={'Content-Type': 'application/json'} + } ) def signup(self, client_id, email, password, connection, username=None, @@ -67,8 +66,7 @@ def signup(self, client_id, email, password, connection, username=None, return self.post( 'https://{}/dbconnections/signup'.format(self.domain), - data=body, - headers={'Content-Type': 'application/json'} + data=body ) def change_password(self, client_id, email, connection, password=None): @@ -82,6 +80,5 @@ def change_password(self, client_id, email, connection, password=None): 'email': email, 'password': password, 'connection': connection, - }, - headers={'Content-Type': 'application/json'} + } ) diff --git a/auth0/v3/authentication/delegated.py b/auth0/v3/authentication/delegated.py index 2a568f6f..5c738de6 100644 --- a/auth0/v3/authentication/delegated.py +++ b/auth0/v3/authentication/delegated.py @@ -37,6 +37,5 @@ def get_token(self, client_id, target, api_type, grant_type, return self.post( 'https://{}/delegation'.format(self.domain), - headers={'Content-Type': 'application/json'}, data=data ) diff --git a/auth0/v3/authentication/get_token.py b/auth0/v3/authentication/get_token.py index 6d254a5d..dfc0c05d 100644 --- a/auth0/v3/authentication/get_token.py +++ b/auth0/v3/authentication/get_token.py @@ -42,8 +42,7 @@ def authorization_code(self, client_id, client_secret, code, 'code': code, 'grant_type': grant_type, 'redirect_uri': redirect_uri, - }, - headers={'Content-Type': 'application/json'} + } ) def authorization_code_pkce(self, client_id, code_verifier, code, @@ -79,8 +78,7 @@ def authorization_code_pkce(self, client_id, code_verifier, code, 'code': code, 'grant_type': grant_type, 'redirect_uri': redirect_uri, - }, - headers={'Content-Type': 'application/json'} + } ) def client_credentials(self, client_id, client_secret, audience, @@ -113,8 +111,7 @@ def client_credentials(self, client_id, client_secret, audience, 'client_secret': client_secret, 'audience': audience, 'grant_type': grant_type, - }, - headers={'Content-Type': 'application/json'} + } ) def login(self, client_id, client_secret, username, password, scope, realm, @@ -164,8 +161,7 @@ def login(self, client_id, client_secret, username, password, scope, realm, 'scope': scope, 'audience': audience, 'grant_type': grant_type - }, - headers={'Content-Type': 'application/json'} + } ) def refresh_token(self, client_id, client_secret, refresh_token, grant_type='refresh_token'): @@ -194,6 +190,5 @@ def refresh_token(self, client_id, client_secret, refresh_token, grant_type='ref 'client_secret': client_secret, 'refresh_token': refresh_token, 'grant_type': grant_type - }, - headers={'Content-Type': 'application/json'} + } ) diff --git a/auth0/v3/authentication/logout.py b/auth0/v3/authentication/logout.py index 8d38a2c8..8e154e1c 100644 --- a/auth0/v3/authentication/logout.py +++ b/auth0/v3/authentication/logout.py @@ -32,12 +32,10 @@ def logout(self, client_id, return_to, federated=False): if federated is True: return self.get( 'https://{}/v2/logout?federated&client_id={}&returnTo={}'.format( - self.domain, client_id, return_to), - headers={'Content-Type': 'application/json'} + self.domain, client_id, return_to) ) return self.get( 'https://{}/v2/logout?client_id={}&returnTo={}'.format(self.domain, client_id, - return_to), - headers={'Content-Type': 'application/json'} + return_to) ) diff --git a/auth0/v3/authentication/passwordless.py b/auth0/v3/authentication/passwordless.py index 83ed90e7..dd8db971 100644 --- a/auth0/v3/authentication/passwordless.py +++ b/auth0/v3/authentication/passwordless.py @@ -41,8 +41,7 @@ def email(self, client_id, email, send='link', auth_params=None): 'email': email, 'send': send, 'authParams': auth_params - }, - headers={'Content-Type': 'application/json'} + } ) def sms(self, client_id, phone_number): @@ -55,8 +54,7 @@ def sms(self, client_id, phone_number): 'client_id': client_id, 'connection': 'sms', 'phone_number': phone_number, - }, - headers={'Content-Type': 'application/json'} + } ) def sms_login(self, client_id, phone_number, code, scope='openid'): @@ -72,6 +70,5 @@ def sms_login(self, client_id, phone_number, code, scope='openid'): 'username': phone_number, 'password': code, 'scope': scope, - }, - headers={'Content-Type': 'application/json'} + } ) diff --git a/auth0/v3/authentication/social.py b/auth0/v3/authentication/social.py index 333333d6..da6e1176 100644 --- a/auth0/v3/authentication/social.py +++ b/auth0/v3/authentication/social.py @@ -35,6 +35,5 @@ def login(self, client_id, access_token, connection, scope='openid'): 'access_token': access_token, 'connection': connection, 'scope': scope, - }, - headers={'Content-Type': 'application/json'} + } ) diff --git a/auth0/v3/authentication/users.py b/auth0/v3/authentication/users.py index 56bed129..1af5e75c 100644 --- a/auth0/v3/authentication/users.py +++ b/auth0/v3/authentication/users.py @@ -44,6 +44,5 @@ def tokeninfo(self, jwt): warnings.warn("/tokeninfo will be deprecated in future releases", DeprecationWarning) return self.post( url='https://{}/tokeninfo'.format(self.domain), - data={'id_token': jwt}, - headers={'Content-Type': 'application/json'} + data={'id_token': jwt} ) From 3e670b4a4ff5f1316ec7f3db03cd5a2d27f99753 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 13 Jun 2019 15:32:45 -0300 Subject: [PATCH 051/663] update tests and add missing ones --- auth0/v3/test/authentication/test_base.py | 50 +++++++++++++++++-- auth0/v3/test/authentication/test_database.py | 12 ----- .../v3/test/authentication/test_delegated.py | 6 --- .../v3/test/authentication/test_get_token.py | 17 +------ auth0/v3/test/authentication/test_logout.py | 8 --- .../test/authentication/test_passwordless.py | 16 +----- auth0/v3/test/authentication/test_social.py | 6 --- auth0/v3/test/authentication/test_users.py | 3 +- auth0/v3/test/management/test_rest.py | 38 +++++++++++++- 9 files changed, 87 insertions(+), 69 deletions(-) diff --git a/auth0/v3/test/authentication/test_base.py b/auth0/v3/test/authentication/test_base.py index 0f20dcf7..804c4593 100644 --- a/auth0/v3/test/authentication/test_base.py +++ b/auth0/v3/test/authentication/test_base.py @@ -50,10 +50,25 @@ def test_post(self, mock_post): data = ab.post('the-url', data={'a': 'b'}, headers={'c': 'd'}) - mock_post.assert_called_with(url='the-url', data='{"a": "b"}', + mock_post.assert_called_with(url='the-url', json={'a': 'b'}, headers={'c': 'd', 'Content-Type': 'application/json'}) self.assertEqual(data, {'x': 'y'}) + + @mock.patch('requests.post') + def test_post_with_defaults(self, mock_post): + ab = AuthenticationBase('auth0.com', telemetry=False) + + mock_post.return_value.status_code = 200 + mock_post.return_value.text = '{"x": "y"}' + + # Only required params are passed + data = ab.post('the-url') + + mock_post.assert_called_with(url='the-url', json=None, + headers={'Content-Type': 'application/json'}) + + self.assertEqual(data, {'x': 'y'}) @mock.patch('requests.post') def test_post_includes_telemetry(self, mock_post): @@ -67,7 +82,7 @@ def test_post_includes_telemetry(self, mock_post): self.assertEqual(mock_post.call_count, 1) call_kwargs = mock_post.call_args[1] self.assertEqual(call_kwargs['url'], 'the-url') - self.assertEqual(call_kwargs['data'], '{"a": "b"}') + self.assertEqual(call_kwargs['json'], {'a': 'b'}) headers = call_kwargs['headers'] self.assertEqual(headers['c'], 'd') self.assertEqual(headers['Content-Type'], 'application/json') @@ -157,6 +172,35 @@ def test_post_error_with_no_response_text(self, mock_post): 'a0.sdk.internal.unknown') self.assertEqual(context.exception.message, '') + @mock.patch('requests.get') + def test_get(self, mock_get): + ab = AuthenticationBase('auth0.com', telemetry=False) + + mock_get.return_value.status_code = 200 + mock_get.return_value.text = '{"x": "y"}' + + data = ab.get('the-url', params={'a': 'b'}, headers={'c': 'd'}) + + mock_get.assert_called_with(url='the-url', params={'a': 'b'}, + headers={'c': 'd', 'Content-Type': 'application/json'}) + + self.assertEqual(data, {'x': 'y'}) + + @mock.patch('requests.get') + def test_get_with_defaults(self, mock_get): + ab = AuthenticationBase('auth0.com', telemetry=False) + + mock_get.return_value.status_code = 200 + mock_get.return_value.text = '{"x": "y"}' + + # Only required params are passed + data = ab.get('the-url') + + mock_get.assert_called_with(url='the-url', params=None, + headers={'Content-Type': 'application/json'}) + + self.assertEqual(data, {'x': 'y'}) + @mock.patch('requests.get') def test_get_includes_telemetry(self, mock_get): ab = AuthenticationBase('auth0.com') @@ -176,4 +220,4 @@ def test_get_includes_telemetry(self, mock_get): self.assertIn('User-Agent', headers) self.assertIn('Auth0-Client', headers) - self.assertEqual(data, '{"x": "y"}') + self.assertEqual(data, {"x": "y"}) diff --git a/auth0/v3/test/authentication/test_database.py b/auth0/v3/test/authentication/test_database.py index 2fd0a3c1..0291f2f9 100644 --- a/auth0/v3/test/authentication/test_database.py +++ b/auth0/v3/test/authentication/test_database.py @@ -32,9 +32,6 @@ def test_login(self, mock_post): 'grant_type': 'gt', 'scope': 'openid profile', }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.database.Database.post') def test_signup(self, mock_post): @@ -58,9 +55,6 @@ def test_signup(self, mock_post): 'username': None, 'user_metadata': None }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) # Using also username and metadata @@ -88,9 +82,6 @@ def test_signup(self, mock_post): 'username': 'usr', 'user_metadata': sample_meta }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.database.Database.post') def test_change_password(self, mock_post): @@ -112,6 +103,3 @@ def test_change_password(self, mock_post): 'password': 'pswd', 'connection': 'conn', }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) diff --git a/auth0/v3/test/authentication/test_delegated.py b/auth0/v3/test/authentication/test_delegated.py index 697678e7..a69e346d 100644 --- a/auth0/v3/test/authentication/test_delegated.py +++ b/auth0/v3/test/authentication/test_delegated.py @@ -28,9 +28,6 @@ def test_get_token_id_token(self, mock_post): 'scope': 'openid profile', 'api_type': 'apt', }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.delegated.Delegated.post') def test_get_token_refresh_token(self, mock_post): @@ -54,9 +51,6 @@ def test_get_token_refresh_token(self, mock_post): 'scope': 'openid', 'api_type': 'apt', }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.delegated.Delegated.post') def test_get_token_value_error(self, mock_post): diff --git a/auth0/v3/test/authentication/test_get_token.py b/auth0/v3/test/authentication/test_get_token.py index 3feff6c7..c6350229 100644 --- a/auth0/v3/test/authentication/test_get_token.py +++ b/auth0/v3/test/authentication/test_get_token.py @@ -26,9 +26,6 @@ def test_authorization_code(self, mock_post): 'grant_type': 'gt', 'redirect_uri': 'idt' }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.get_token.GetToken.post') def test_authorization_code_pkce(self, mock_post): @@ -51,9 +48,6 @@ def test_authorization_code_pkce(self, mock_post): 'grant_type': 'gt', 'redirect_uri': 'idt' }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.get_token.GetToken.post') def test_client_credentials(self, mock_post): @@ -74,9 +68,6 @@ def test_client_credentials(self, mock_post): 'audience': 'aud', 'grant_type': 'gt' }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.get_token.GetToken.post') def test_login(self, mock_post): @@ -105,9 +96,6 @@ def test_login(self, mock_post): 'audience': 'aud', 'grant_type': 'gt' }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.get_token.GetToken.post') def test_refresh_token(self, mock_post): @@ -126,7 +114,4 @@ def test_refresh_token(self, mock_post): 'client_secret': 'clsec', 'refresh_token': 'rt', 'grant_type': 'gt' - }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) + }) \ No newline at end of file diff --git a/auth0/v3/test/authentication/test_logout.py b/auth0/v3/test/authentication/test_logout.py index 6f83a69e..7f8278ee 100644 --- a/auth0/v3/test/authentication/test_logout.py +++ b/auth0/v3/test/authentication/test_logout.py @@ -14,11 +14,7 @@ def test_logout(self, mock_get): return_to='rto') args, kwargs = mock_get.call_args - self.assertEqual(args[0], 'https://my.domain.com/v2/logout?client_id=cid&returnTo=rto') - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.logout.Logout.get') def test_federated_logout(self, mock_get): @@ -30,8 +26,4 @@ def test_federated_logout(self, mock_get): federated=True) args, kwargs = mock_get.call_args - self.assertEqual(args[0], 'https://my.domain.com/v2/logout?federated&client_id=cid&returnTo=rto') - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) diff --git a/auth0/v3/test/authentication/test_passwordless.py b/auth0/v3/test/authentication/test_passwordless.py index 39deb20e..4a59a7aa 100644 --- a/auth0/v3/test/authentication/test_passwordless.py +++ b/auth0/v3/test/authentication/test_passwordless.py @@ -25,9 +25,6 @@ def test_email(self, mock_post): 'authParams': {'a': 'b'}, 'connection': 'email', }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') def test_sms(self, mock_post): @@ -43,10 +40,7 @@ def test_sms(self, mock_post): 'phone_number': '123456', 'connection': 'sms', }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) - + @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') def test_sms_login(self, mock_post): @@ -65,9 +59,6 @@ def test_sms_login(self, mock_post): 'password': 'abcd', 'scope': 'openid', }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') def test_sms_login_with_scope(self, mock_post): @@ -87,7 +78,4 @@ def test_sms_login_with_scope(self, mock_post): 'username': '123456', 'password': 'abcd', 'scope': 'openid profile', - }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) + }) \ No newline at end of file diff --git a/auth0/v3/test/authentication/test_social.py b/auth0/v3/test/authentication/test_social.py index eaceb0a2..6874dabf 100644 --- a/auth0/v3/test/authentication/test_social.py +++ b/auth0/v3/test/authentication/test_social.py @@ -19,9 +19,6 @@ def test_login(self, mock_post): 'connection': 'conn', 'scope': 'openid', }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) @mock.patch('auth0.v3.authentication.social.Social.post') def test_login_with_scope(self, mock_post): @@ -38,6 +35,3 @@ def test_login_with_scope(self, mock_post): 'connection': 'conn', 'scope': 'openid profile', }) - self.assertEqual(kwargs['headers'], { - 'Content-Type': 'application/json' - }) diff --git a/auth0/v3/test/authentication/test_users.py b/auth0/v3/test/authentication/test_users.py index a201d071..b847ebbd 100644 --- a/auth0/v3/test/authentication/test_users.py +++ b/auth0/v3/test/authentication/test_users.py @@ -26,6 +26,5 @@ def test_tokeninfo(self, mock_post): mock_post.assert_called_with( url='https://my.domain.com/tokeninfo', - data={'id_token': 'jwtoken'}, - headers={'Content-Type': 'application/json'} + data={'id_token': 'jwtoken'} ) diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index 9403514b..e3b86194 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -64,7 +64,7 @@ def test_post(self, mock_post): mock_post.return_value.status_code = 200 response = rc.post('the/url', data=data) - mock_post.assert_called_with('the/url', data=json.dumps(data), + mock_post.assert_called_with('the/url', json=data, headers=headers) self.assertEqual(response, {'a': 'b'}) @@ -215,6 +215,40 @@ def test_file_post_content_type_is_none(self, mock_post): mock_post.assert_called_once_with('the-url', data=data, files=files, headers=headers) + + @mock.patch('requests.put') + def test_put(self, mock_put): + rc = RestClient(jwt='a-token', telemetry=False) + headers = {'Authorization': 'Bearer a-token', + 'Content-Type': 'application/json'} + + mock_put.return_value.text = '["a", "b"]' + mock_put.return_value.status_code = 200 + + data = {'some': 'data'} + + response = rc.put(url='the-url', data=data) + mock_put.assert_called_with('the-url', json=data, + headers=headers) + + self.assertEqual(response, ['a', 'b']) + + @mock.patch('requests.put') + def test_put_errors(self, mock_put): + rc = RestClient(jwt='a-token', telemetry=False) + + mock_put.return_value.text = '{"statusCode": 999,' \ + ' "errorCode": "code",' \ + ' "message": "message"}' + mock_put.return_value.status_code = 999 + + with self.assertRaises(Auth0Error) as context: + rc.put(url='the/url') + + self.assertEqual(context.exception.status_code, 999) + self.assertEqual(context.exception.error_code, 'code') + self.assertEqual(context.exception.message, 'message') + @mock.patch('requests.patch') def test_patch(self, mock_patch): rc = RestClient(jwt='a-token', telemetry=False) @@ -227,7 +261,7 @@ def test_patch(self, mock_patch): data = {'some': 'data'} response = rc.patch(url='the-url', data=data) - mock_patch.assert_called_with('the-url', data=json.dumps(data), + mock_patch.assert_called_with('the-url', json=data, headers=headers) self.assertEqual(response, ['a', 'b']) From bd689807cd4b3553d2a6b1eef33b22180c743459 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 14 Jun 2019 16:07:34 -0300 Subject: [PATCH 052/663] Release 3.8.1 --- CHANGELOG.md | 6 ++++++ auth0/__init__.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 192d6542..4cd95a0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changes ======= +3.8.1 +------------------ + +**Fixed** +- Fix request creation when headers are the default [\#198](https://github.com/auth0/auth0-python/pull/198) ([lbalmaceda](https://github.com/lbalmaceda)) + 3.8.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 99d6aece..64e0fe00 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.8.0' +__version__ = '3.8.1' From b8ef3f4f41e4d62a057be52edb1db1eec577c45f Mon Sep 17 00:00:00 2001 From: Emile Fugulin Date: Wed, 17 Apr 2019 22:14:59 -0400 Subject: [PATCH 053/663] Add user roles API --- auth0/v3/management/users.py | 39 ++++++++++++++++++++++++++ auth0/v3/test/management/test_users.py | 37 ++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 396d73c4..71fb4a96 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -126,6 +126,45 @@ def update(self, id, body): """ return self.client.patch(self._url(id), data=body) + def get_roles(self, id): + """Get a user's roles. + + Args: + id (str): The user's id. + + See https://auth0.com/docs/api/management/v2#!/Users/get_user_roles + """ + url = self._url('{}/roles'.format(id)) + return self.client.get(url) + + def delete_roles(self, id, roles): + """Removes roles from a user. + + Args: + id (str): The user's id. + + roles (list of str): A list of roles ids to unassociate from the user. + + See https://auth0.com/docs/api/management/v2#!/Users/delete_user_roles + """ + url = self._url('{}/roles'.format(id)) + body = {'roles': roles} + return self.client.delete(url, data=body) + + def assign_roles(self, id, roles): + """Assign roles to a user + + Args: + id (str): The user's id. + + roles (list of str): A list of roles ids to associated with the user. + + See https://auth0.com/docs/api/management/v2#!/Users/post_user_roles + """ + url = self._url('{}/roles'.format(id)) + body = {'roles': roles} + return self.client.post(url, data=body) + def delete_multifactor(self, id, provider): """Delete a user's multifactor provider. diff --git a/auth0/v3/test/management/test_users.py b/auth0/v3/test/management/test_users.py index 36a57573..8e33efb1 100644 --- a/auth0/v3/test/management/test_users.py +++ b/auth0/v3/test/management/test_users.py @@ -113,6 +113,43 @@ def test_update(self, mock_rc): self.assertEqual('https://domain/api/v2/users/an-id', args[0]) self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) + @mock.patch('auth0.v3.management.users.RestClient') + def test_get_roles(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Users(domain='domain', token='jwttoken') + u.get_roles('an-id') + + mock_instance.get.assert_called_with( + 'https://domain/api/v2/users/an-id/roles' + ) + + @mock.patch('auth0.v3.management.users.RestClient') + def test_delete_roles(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Users(domain='domain', token='jwttoken') + u.delete_roles('an-id', ['a', 'b']) + + args, kwargs = mock_instance.delete.call_args + + self.assertEqual('https://domain/api/v2/users/an-id/roles', + args[0]) + self.assertEqual(kwargs['data'], {'roles': ['a', 'b']}) + + @mock.patch('auth0.v3.management.users.RestClient') + def test_assign_roles(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Users(domain='domain', token='jwttoken') + u.assign_roles('an-id', ['a', 'b']) + + args, kwargs = mock_instance.post.call_args + + self.assertEqual('https://domain/api/v2/users/an-id/roles', + args[0]) + self.assertEqual(kwargs['data'], {'roles': ['a', 'b']}) + @mock.patch('auth0.v3.management.users.RestClient') def test_delete_multifactor(self, mock_rc): mock_instance = mock_rc.return_value From 4429097a96a2765d5189789b68c466a847d66afe Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 27 Jun 2019 18:52:24 -0300 Subject: [PATCH 054/663] chore PR #190 comments --- auth0/v3/management/rest.py | 4 ++-- auth0/v3/management/users.py | 16 +++++++++++++--- auth0/v3/test/management/test_users.py | 12 ++++++------ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/auth0/v3/management/rest.py b/auth0/v3/management/rest.py index 44d9342b..013a1d63 100644 --- a/auth0/v3/management/rest.py +++ b/auth0/v3/management/rest.py @@ -68,10 +68,10 @@ def put(self, url, data=None): response = requests.put(url, json=data, headers=headers) return self._process_response(response) - def delete(self, url, params=None): + def delete(self, url, params=None, data=None): headers = self.base_headers.copy() - response = requests.delete(url, headers=headers, params=params or {}) + response = requests.delete(url, headers=headers, params=params or {}, json=data) return self._process_response(response) def _process_response(self, response): diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 71fb4a96..971a94b2 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -47,6 +47,9 @@ def list(self, page=0, per_page=25, sort=None, connection=None, q=None, when querying for users. Will default to the latest version available. See: https://auth0.com/docs/users/search + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. + fields (list of str, optional): A list of fields to include or exclude from the result (depending on include_fields). Empty to retrieve all fields. @@ -126,18 +129,25 @@ def update(self, id, body): """ return self.client.patch(self._url(id), data=body) - def get_roles(self, id): + def list_roles(self, id, page=0, per_page=25, include_totals=True): """Get a user's roles. Args: id (str): The user's id. + page (int, optional): The result's page number (zero based). + + per_page (int, optional): The amount of entries per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. + See https://auth0.com/docs/api/management/v2#!/Users/get_user_roles """ url = self._url('{}/roles'.format(id)) return self.client.get(url) - def delete_roles(self, id, roles): + def remove_roles(self, id, roles): """Removes roles from a user. Args: @@ -151,7 +161,7 @@ def delete_roles(self, id, roles): body = {'roles': roles} return self.client.delete(url, data=body) - def assign_roles(self, id, roles): + def add_roles(self, id, roles): """Assign roles to a user Args: diff --git a/auth0/v3/test/management/test_users.py b/auth0/v3/test/management/test_users.py index 8e33efb1..25d38eed 100644 --- a/auth0/v3/test/management/test_users.py +++ b/auth0/v3/test/management/test_users.py @@ -114,22 +114,22 @@ def test_update(self, mock_rc): self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) @mock.patch('auth0.v3.management.users.RestClient') - def test_get_roles(self, mock_rc): + def test_list_roles(self, mock_rc): mock_instance = mock_rc.return_value u = Users(domain='domain', token='jwttoken') - u.get_roles('an-id') + u.list_roles('an-id') mock_instance.get.assert_called_with( 'https://domain/api/v2/users/an-id/roles' ) @mock.patch('auth0.v3.management.users.RestClient') - def test_delete_roles(self, mock_rc): + def test_remove_roles(self, mock_rc): mock_instance = mock_rc.return_value u = Users(domain='domain', token='jwttoken') - u.delete_roles('an-id', ['a', 'b']) + u.remove_roles('an-id', ['a', 'b']) args, kwargs = mock_instance.delete.call_args @@ -138,11 +138,11 @@ def test_delete_roles(self, mock_rc): self.assertEqual(kwargs['data'], {'roles': ['a', 'b']}) @mock.patch('auth0.v3.management.users.RestClient') - def test_assign_roles(self, mock_rc): + def test_add_roles(self, mock_rc): mock_instance = mock_rc.return_value u = Users(domain='domain', token='jwttoken') - u.assign_roles('an-id', ['a', 'b']) + u.add_roles('an-id', ['a', 'b']) args, kwargs = mock_instance.post.call_args From f13ab9d39e9b5d3a426473c260fa6b1214b63277 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 27 Jun 2019 19:06:12 -0300 Subject: [PATCH 055/663] add user permissions --- auth0/v3/management/users.py | 46 ++++++++++++++++++++++++++ auth0/v3/test/management/test_rest.py | 21 +++++++++++- auth0/v3/test/management/test_users.py | 37 +++++++++++++++++++++ 3 files changed, 103 insertions(+), 1 deletion(-) diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 971a94b2..b9b21a94 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -175,6 +175,52 @@ def add_roles(self, id, roles): body = {'roles': roles} return self.client.post(url, data=body) + def list_permissions(self, id, page=0, per_page=25, include_totals=True): + """Get a user's permissions. + + Args: + id (str): The user's id. + + page (int, optional): The result's page number (zero based). + + per_page (int, optional): The amount of entries per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. + + See https://auth0.com/docs/api/management/v2#!/Users/get_permissions + """ + url = self._url('{}/permissions'.format(id)) + return self.client.get(url) + + def remove_permissions(self, id, permissions): + """Removes permissions from a user. + + Args: + id (str): The user's id. + + permissions (list of str): A list of permissions ids to unassociate from the user. + + See https://auth0.com/docs/api/management/v2#!/Users/delete_permissions + """ + url = self._url('{}/permissions'.format(id)) + body = {'permissions': permissions} + return self.client.delete(url, data=body) + + def add_permissions(self, id, permissions): + """Assign permissions to a user + + Args: + id (str): The user's id. + + permissions (list of str): A list of permissions ids to associated with the user. + + See https://auth0.com/docs/api/management/v2#!/Users/post_permissions + """ + url = self._url('{}/permissions'.format(id)) + body = {'permissions': permissions} + return self.client.post(url, data=body) + def delete_multifactor(self, id, provider): """Delete a user's multifactor provider. diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index e3b86194..5a773179 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -294,7 +294,26 @@ def test_delete(self, mock_delete): mock_delete.return_value.status_code = 200 response = rc.delete(url='the-url/ID') - mock_delete.assert_called_with('the-url/ID', headers=headers, params={}) + mock_delete.assert_called_with('the-url/ID', headers=headers, params={}, json=None) + + self.assertEqual(response, ['a', 'b']) + + @mock.patch('requests.delete') + def test_delete_with_body_and_params(self, mock_delete): + rc = RestClient(jwt='a-token', telemetry=False) + headers = { + 'Authorization': 'Bearer a-token', + 'Content-Type': 'application/json', + } + + mock_delete.return_value.text = '["a", "b"]' + mock_delete.return_value.status_code = 200 + + data = {'some': 'data'} + params={'A': 'param', 'B': 'param'} + + response = rc.delete(url='the-url/ID', params=params, data=data) + mock_delete.assert_called_with('the-url/ID', headers=headers, params=params, json=data) self.assertEqual(response, ['a', 'b']) diff --git a/auth0/v3/test/management/test_users.py b/auth0/v3/test/management/test_users.py index 25d38eed..9eb316fd 100644 --- a/auth0/v3/test/management/test_users.py +++ b/auth0/v3/test/management/test_users.py @@ -150,6 +150,43 @@ def test_add_roles(self, mock_rc): args[0]) self.assertEqual(kwargs['data'], {'roles': ['a', 'b']}) + @mock.patch('auth0.v3.management.users.RestClient') + def test_list_permissions(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Users(domain='domain', token='jwttoken') + u.list_permissions('an-id') + + mock_instance.get.assert_called_with( + 'https://domain/api/v2/users/an-id/permissions' + ) + + @mock.patch('auth0.v3.management.users.RestClient') + def test_remove_permissions(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Users(domain='domain', token='jwttoken') + u.remove_permissions('an-id', ['a', 'b']) + + args, kwargs = mock_instance.delete.call_args + + self.assertEqual('https://domain/api/v2/users/an-id/permissions', + args[0]) + self.assertEqual(kwargs['data'], {'permissions': ['a', 'b']}) + + @mock.patch('auth0.v3.management.users.RestClient') + def test_add_permissions(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Users(domain='domain', token='jwttoken') + u.add_permissions('an-id', ['a', 'b']) + + args, kwargs = mock_instance.post.call_args + + self.assertEqual('https://domain/api/v2/users/an-id/permissions', + args[0]) + self.assertEqual(kwargs['data'], {'permissions': ['a', 'b']}) + @mock.patch('auth0.v3.management.users.RestClient') def test_delete_multifactor(self, mock_rc): mock_instance = mock_rc.return_value From 6520cc184c0e1021db1bdd7facf08ea06e08b04e Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 27 Jun 2019 19:44:11 -0300 Subject: [PATCH 056/663] add Roles endpoints --- auth0/v3/management/auth0.py | 2 + auth0/v3/management/roles.py | 178 +++++++++++++++++++++++++ auth0/v3/management/users.py | 16 ++- auth0/v3/test/management/test_auth0.py | 4 + auth0/v3/test/management/test_roles.py | 173 ++++++++++++++++++++++++ auth0/v3/test/management/test_users.py | 42 +++++- 6 files changed, 407 insertions(+), 8 deletions(-) create mode 100644 auth0/v3/management/roles.py create mode 100644 auth0/v3/test/management/test_roles.py diff --git a/auth0/v3/management/auth0.py b/auth0/v3/management/auth0.py index 6d43bc53..f51ef693 100644 --- a/auth0/v3/management/auth0.py +++ b/auth0/v3/management/auth0.py @@ -11,6 +11,7 @@ from .jobs import Jobs from .logs import Logs from .resource_servers import ResourceServers +from .roles import Roles from .rules import Rules from .rules_configs import RulesConfigs from .stats import Stats @@ -44,6 +45,7 @@ def __init__(self, domain, token): self.jobs = Jobs(domain, token) self.logs = Logs(domain, token) self.resource_servers = ResourceServers(domain, token) + self.roles = Roles(domain, token) self.rules = Rules(domain, token) self.rules_configs = RulesConfigs(domain, token) self.stats = Stats(domain, token) diff --git a/auth0/v3/management/roles.py b/auth0/v3/management/roles.py new file mode 100644 index 00000000..3c936788 --- /dev/null +++ b/auth0/v3/management/roles.py @@ -0,0 +1,178 @@ +from .rest import RestClient + + +class Roles(object): + + """Auth0 roles endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + """ + + def __init__(self, domain, token, telemetry=True): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry) + + def _url(self, id=None): + url = 'https://{}/api/v2/roles'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + + def list(self, page=0, per_page=25, include_totals=True, name_filter=None): + """List or search roles. + + Args: + page (int, optional): The result's page number (zero based). + + per_page (int, optional): The amount of entries per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. + + name_filter (str, optional): A case-insensitive filter to apply + to search for roles by name + + See: https://auth0.com/docs/api/management/v2#!/Roles/get_roles + """ + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower(), + 'name_filter': name_filter + } + return self.client.get(self._url(), params=params) + + def create(self, body): + """Creates a new role. + + Args: + body (dict): Please see: https://auth0.com/docs/api/v2#!/Roles/post_roles + """ + return self.client.post(self._url(), data=body) + + def get(self, id): + """Get a role. + + Args: + id (str): The id of the role to retrieve. + + See: https://auth0.com/docs/api/management/v2#!/Roles/get_roles_by_id + """ + + return self.client.get(self._url(id)) + + def delete(self, id): + """Delete a role. + + Args: + id (str): The id of the role to delete. + + See: https://auth0.com/docs/api/management/v2#!/Roles/delete_roles_by_id + """ + return self.client.delete(self._url(id)) + + def update(self, id, body): + """Update a role with the attributes passed in 'body' + + Args: + id (str): The id of the role to update. + + body (dict): Please see: https://auth0.com/docs/api/management/v2#!/Roles/patch_roles_by_id + """ + return self.client.patch(self._url(id), data=body) + + def list_users(self, id, page=0, per_page=25, include_totals=True): + """Lists the users that have been associated with a given role. + + Args: + id (str): The role's id. + + page (int, optional): The result's page number (zero based). + + per_page (int, optional): The amount of entries per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. + + See https://auth0.com/docs/api/management/v2#!/Roles/get_role_user + """ + + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower() + } + url = self._url('{}/users'.format(id)) + return self.client.get(url, params=params) + + def add_users(self, id, users): + """Assign users to a role. + + Args: + id (str): The role's id. + + users (list of str): A list of users ids to add to this role + + See https://auth0.com/docs/api/management/v2#!/Roles/post_role_users + """ + url = self._url('{}/users'.format(id)) + body = {'users': users} + return self.client.post(url, data=body) + + def list_permissions(self, id, page=0, per_page=25, include_totals=True): + """Gets the permissions for a role. + + Args: + id (str): The role's id. + + page (int, optional): The result's page number (zero based). + + per_page (int, optional): The amount of entries per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. + + See https://auth0.com/docs/api/management/v2#!/Roles/get_role_permission + """ + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower() + } + url = self._url('{}/permissions'.format(id)) + return self.client.get(url, params=params) + + def remove_permissions(self, id, permissions): + """Removes permissions from a role. + + Args: + id (str): The role's id. + + permissions (list of str): A list of permissions ids to unassociate from the role. + + See https://auth0.com/docs/api/management/v2#!/Roles/delete_role_permission_assignment + """ + url = self._url('{}/permissions'.format(id)) + body = {'permissions': permissions} + return self.client.delete(url, data=body) + + + def add_permissions(self, id, permissions): + """Adds permissions from a role. + + Args: + id (str): The role's id. + + permissions (list of str): A list of permissions ids to associate to the role. + + See https://auth0.com/docs/api/management/v2#!/Roles/post_role_permission_assignment + """ + url = self._url('{}/permissions'.format(id)) + body = {'permissions': permissions} + return self.client.post(url, data=body) \ No newline at end of file diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index b9b21a94..9be4854b 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -144,8 +144,14 @@ def list_roles(self, id, page=0, per_page=25, include_totals=True): See https://auth0.com/docs/api/management/v2#!/Users/get_user_roles """ + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower() + } + url = self._url('{}/roles'.format(id)) - return self.client.get(url) + return self.client.get(url, params=params) def remove_roles(self, id, roles): """Removes roles from a user. @@ -190,8 +196,14 @@ def list_permissions(self, id, page=0, per_page=25, include_totals=True): See https://auth0.com/docs/api/management/v2#!/Users/get_permissions """ + + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower() + } url = self._url('{}/permissions'.format(id)) - return self.client.get(url) + return self.client.get(url, params=params) def remove_permissions(self, id, permissions): """Removes permissions from a user. diff --git a/auth0/v3/test/management/test_auth0.py b/auth0/v3/test/management/test_auth0.py index 2026ebe6..51e2f8df 100644 --- a/auth0/v3/test/management/test_auth0.py +++ b/auth0/v3/test/management/test_auth0.py @@ -13,6 +13,7 @@ from ...management.jobs import Jobs from ...management.logs import Logs from ...management.resource_servers import ResourceServers +from ...management.roles import Roles from ...management.rules import Rules from ...management.rules_configs import RulesConfigs from ...management.stats import Stats @@ -69,6 +70,9 @@ def test_logs(self): def test_resource_servers(self): self.assertIsInstance(self.a0.resource_servers, ResourceServers) + def test_roles(self): + self.assertIsInstance(self.a0.roles, Roles) + def test_rules(self): self.assertIsInstance(self.a0.rules, Rules) diff --git a/auth0/v3/test/management/test_roles.py b/auth0/v3/test/management/test_roles.py new file mode 100644 index 00000000..76ccec1c --- /dev/null +++ b/auth0/v3/test/management/test_roles.py @@ -0,0 +1,173 @@ +import unittest +import mock +from ...management.roles import Roles + + +class TestRoles(unittest.TestCase): + + @mock.patch('auth0.v3.management.roles.RestClient') + def test_list(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Roles(domain='domain', token='jwttoken') + u.list() + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/roles', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 25, + 'page': 0, + 'include_totals': 'true', + 'name_filter': None + }) + + u.list(page=1, per_page=50, include_totals=False, name_filter='little-role') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/roles', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 50, + 'page': 1, + 'include_totals': 'false', + 'name_filter': 'little-role' + }) + + @mock.patch('auth0.v3.management.roles.RestClient') + def test_create(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Roles(domain='domain', token='jwttoken') + u.create({'a': 'b', 'c': 'd'}) + + args, kwargs = mock_instance.post.call_args + + self.assertEqual('https://domain/api/v2/roles', args[0]) + self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) + + @mock.patch('auth0.v3.management.roles.RestClient') + def test_get(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Roles(domain='domain', token='jwttoken') + u.get('an-id') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/roles/an-id', args[0]) + + @mock.patch('auth0.v3.management.roles.RestClient') + def test_delete(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Roles(domain='domain', token='jwttoken') + u.delete('an-id') + + mock_instance.delete.assert_called_with( + 'https://domain/api/v2/roles/an-id' + ) + + @mock.patch('auth0.v3.management.roles.RestClient') + def test_update(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Roles(domain='domain', token='jwttoken') + u.update('an-id', {'a': 'b', 'c': 'd'}) + + args, kwargs = mock_instance.patch.call_args + + self.assertEqual('https://domain/api/v2/roles/an-id', args[0]) + self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) + + @mock.patch('auth0.v3.management.roles.RestClient') + def test_list_users(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Roles(domain='domain', token='jwttoken') + u.list_users('an-id') + + args, kwargs = mock_instance.get.call_args + self.assertEqual('https://domain/api/v2/roles/an-id/users', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 25, + 'page': 0, + 'include_totals': 'true' + }) + + u.list_users(id='an-id', page=1, per_page=50, include_totals=False) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/roles/an-id/users', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 50, + 'page': 1, + 'include_totals': 'false' + }) + + + @mock.patch('auth0.v3.management.roles.RestClient') + def test_add_users(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Roles(domain='domain', token='jwttoken') + u.add_users('an-id', ['a', 'b']) + + args, kwargs = mock_instance.post.call_args + + self.assertEqual('https://domain/api/v2/roles/an-id/users', + args[0]) + self.assertEqual(kwargs['data'], {'users': ['a', 'b']}) + + @mock.patch('auth0.v3.management.roles.RestClient') + def test_list_permissions(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Roles(domain='domain', token='jwttoken') + u.list_permissions('an-id') + + args, kwargs = mock_instance.get.call_args + self.assertEqual('https://domain/api/v2/roles/an-id/permissions', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 25, + 'page': 0, + 'include_totals': 'true' + }) + + u.list_permissions(id='an-id', page=1, per_page=50, include_totals=False) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/roles/an-id/permissions', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 50, + 'page': 1, + 'include_totals': 'false' + }) + + @mock.patch('auth0.v3.management.roles.RestClient') + def test_remove_permissions(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Roles(domain='domain', token='jwttoken') + u.remove_permissions('an-id', ['a', 'b']) + + args, kwargs = mock_instance.delete.call_args + + self.assertEqual('https://domain/api/v2/roles/an-id/permissions', + args[0]) + self.assertEqual(kwargs['data'], {'permissions': ['a', 'b']}) + + @mock.patch('auth0.v3.management.roles.RestClient') + def test_add_permissions(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Roles(domain='domain', token='jwttoken') + u.add_permissions('an-id', ['a', 'b']) + + args, kwargs = mock_instance.post.call_args + + self.assertEqual('https://domain/api/v2/roles/an-id/permissions', + args[0]) + self.assertEqual(kwargs['data'], {'permissions': ['a', 'b']}) diff --git a/auth0/v3/test/management/test_users.py b/auth0/v3/test/management/test_users.py index 9eb316fd..b3908c1c 100644 --- a/auth0/v3/test/management/test_users.py +++ b/auth0/v3/test/management/test_users.py @@ -120,9 +120,24 @@ def test_list_roles(self, mock_rc): u = Users(domain='domain', token='jwttoken') u.list_roles('an-id') - mock_instance.get.assert_called_with( - 'https://domain/api/v2/users/an-id/roles' - ) + args, kwargs = mock_instance.get.call_args + self.assertEqual('https://domain/api/v2/users/an-id/roles', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 25, + 'page': 0, + 'include_totals': 'true' + }) + + u.list_roles(id='an-id', page=1, per_page=50, include_totals=False) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/users/an-id/roles', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 50, + 'page': 1, + 'include_totals': 'false' + }) @mock.patch('auth0.v3.management.users.RestClient') def test_remove_roles(self, mock_rc): @@ -157,9 +172,24 @@ def test_list_permissions(self, mock_rc): u = Users(domain='domain', token='jwttoken') u.list_permissions('an-id') - mock_instance.get.assert_called_with( - 'https://domain/api/v2/users/an-id/permissions' - ) + args, kwargs = mock_instance.get.call_args + self.assertEqual('https://domain/api/v2/users/an-id/permissions', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 25, + 'page': 0, + 'include_totals': 'true' + }) + + u.list_permissions(id='an-id', page=1, per_page=50, include_totals=False) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/users/an-id/permissions', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 50, + 'page': 1, + 'include_totals': 'false' + }) @mock.patch('auth0.v3.management.users.RestClient') def test_remove_permissions(self, mock_rc): From 52276e11cb714b25553280499c5938f15cc6fb31 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 2 Jul 2019 11:12:19 -0300 Subject: [PATCH 057/663] chore review comments --- auth0/v3/management/roles.py | 12 ++++++------ auth0/v3/management/users.py | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/auth0/v3/management/roles.py b/auth0/v3/management/roles.py index 3c936788..0503d8ed 100644 --- a/auth0/v3/management/roles.py +++ b/auth0/v3/management/roles.py @@ -88,7 +88,7 @@ def update(self, id, body): return self.client.patch(self._url(id), data=body) def list_users(self, id, page=0, per_page=25, include_totals=True): - """Lists the users that have been associated with a given role. + """List the users that have been associated with a given role. Args: id (str): The role's id. @@ -126,7 +126,7 @@ def add_users(self, id, users): return self.client.post(url, data=body) def list_permissions(self, id, page=0, per_page=25, include_totals=True): - """Gets the permissions for a role. + """List the permissions associated to a role. Args: id (str): The role's id. @@ -149,12 +149,12 @@ def list_permissions(self, id, page=0, per_page=25, include_totals=True): return self.client.get(url, params=params) def remove_permissions(self, id, permissions): - """Removes permissions from a role. + """Unassociates permissions from a role. Args: id (str): The role's id. - permissions (list of str): A list of permissions ids to unassociate from the role. + permissions (list of str): A list of permission ids to unassociate from the role. See https://auth0.com/docs/api/management/v2#!/Roles/delete_role_permission_assignment """ @@ -164,12 +164,12 @@ def remove_permissions(self, id, permissions): def add_permissions(self, id, permissions): - """Adds permissions from a role. + """Associates permissions with a role. Args: id (str): The role's id. - permissions (list of str): A list of permissions ids to associate to the role. + permissions (list of str): A list of permission ids to associate to the role. See https://auth0.com/docs/api/management/v2#!/Roles/post_role_permission_assignment """ diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 9be4854b..79514e09 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -130,7 +130,7 @@ def update(self, id, body): return self.client.patch(self._url(id), data=body) def list_roles(self, id, page=0, per_page=25, include_totals=True): - """Get a user's roles. + """List the roles associated with a user. Args: id (str): The user's id. @@ -154,7 +154,7 @@ def list_roles(self, id, page=0, per_page=25, include_totals=True): return self.client.get(url, params=params) def remove_roles(self, id, roles): - """Removes roles from a user. + """Removes an array of roles from a user. Args: id (str): The user's id. @@ -168,7 +168,7 @@ def remove_roles(self, id, roles): return self.client.delete(url, data=body) def add_roles(self, id, roles): - """Assign roles to a user + """Associate an array of roles with a user. Args: id (str): The user's id. @@ -182,7 +182,7 @@ def add_roles(self, id, roles): return self.client.post(url, data=body) def list_permissions(self, id, page=0, per_page=25, include_totals=True): - """Get a user's permissions. + """List the permissions associated to the user. Args: id (str): The user's id. @@ -211,7 +211,7 @@ def remove_permissions(self, id, permissions): Args: id (str): The user's id. - permissions (list of str): A list of permissions ids to unassociate from the user. + permissions (list of str): A list of permission ids to unassociate from the user. See https://auth0.com/docs/api/management/v2#!/Users/delete_permissions """ @@ -220,12 +220,12 @@ def remove_permissions(self, id, permissions): return self.client.delete(url, data=body) def add_permissions(self, id, permissions): - """Assign permissions to a user + """Assign permissions to a user. Args: id (str): The user's id. - permissions (list of str): A list of permissions ids to associated with the user. + permissions (list of str): A list of permission ids to associated with the user. See https://auth0.com/docs/api/management/v2#!/Users/post_permissions """ From b5406793831e365a3a79333d3c442c34717def2b Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 2 Jul 2019 16:25:20 -0300 Subject: [PATCH 058/663] Release 3.9.0 --- CHANGELOG.md | 6 ++++++ auth0/__init__.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cd95a0f..bcaca649 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changes ======= +3.9.0 +------------------ + +**Added** +- Add Roles and Permissions endpoints [\#202](https://github.com/auth0/auth0-python/pull/202) ([lbalmaceda](https://github.com/lbalmaceda)) + 3.8.1 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 64e0fe00..2de9e710 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.8.1' +__version__ = '3.9.0' From fcb3a101bc726bdc4e0131024bc21aea461b8742 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 31 Jul 2019 16:50:50 -0300 Subject: [PATCH 059/663] Update minimum "requests" version to 2.14.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e44d855b..7131eefc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -requests>=2.22.0 +requests>=2.14.0 mock==1.3.0 pre-commit From dd8b2a2864ab12eef8dc455b88e0d7cc9f7d91cf Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 31 Jul 2019 17:05:14 -0300 Subject: [PATCH 060/663] Re-categorize changelog entry --- CHANGELOG.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcaca649..34535781 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,13 @@ Changes 3.8.1 ------------------ -**Fixed** -- Fix request creation when headers are the default [\#198](https://github.com/auth0/auth0-python/pull/198) ([lbalmaceda](https://github.com/lbalmaceda)) +This release includes a breaking change affecting those users that manually parse the response from GET requests. e.g. /userinfo or /authorize. The `AuthenticationBase#get` method was incorrectly parsing the request result into a String. + +From this release on, making a GET request will return a Dictionary instead. + +**Breaking Change** +- Fix request creation when headers are the default [\#198](https://github.com/auth0/auth0-python/pull/198) ([lbalmaceda](https://github.com/lbalmaceda)). + 3.8.0 ------------------ From 7ca71a06ec0271a707414c36e8dde7f5624c72ac Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 31 Jul 2019 17:12:53 -0300 Subject: [PATCH 061/663] Update redaction --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34535781..78943e89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,9 +10,9 @@ Changes 3.8.1 ------------------ -This release includes a breaking change affecting those users that manually parse the response from GET requests. e.g. /userinfo or /authorize. The `AuthenticationBase#get` method was incorrectly parsing the request result into a String. +July 18, 2019: This release included a breaking change affecting those users that were manually parsing the response from GET requests. e.g. /userinfo or /authorize. The `AuthenticationBase#get` method was incorrectly parsing the request result into a String. -From this release on, making a GET request will return a Dictionary instead. +From this release on, making a GET request returns a Dictionary instead. **Breaking Change** - Fix request creation when headers are the default [\#198](https://github.com/auth0/auth0-python/pull/198) ([lbalmaceda](https://github.com/lbalmaceda)). From 60eea06b6916224e270146d28aa2f01b34d363f6 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 31 Jul 2019 18:07:40 -0300 Subject: [PATCH 062/663] update wording --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78943e89..43f27d18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ Changes 3.8.1 ------------------ -July 18, 2019: This release included a breaking change affecting those users that were manually parsing the response from GET requests. e.g. /userinfo or /authorize. The `AuthenticationBase#get` method was incorrectly parsing the request result into a String. +July 18, 2019: This release included an unintentionally breaking change affecting those users that were manually parsing the response from GET requests. e.g. /userinfo or /authorize. The `AuthenticationBase#get` method was incorrectly parsing the request result into a String. From this release on, making a GET request returns a Dictionary instead. From abf8bf747c17801a7e55478eda88df424624f74b Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 31 Jul 2019 18:28:11 -0300 Subject: [PATCH 063/663] Release 3.9.1 --- CHANGELOG.md | 6 ++++++ auth0/__init__.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43f27d18..4f8acfc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changes ======= +3.9.1 +------------------ + +**Changed** +- Update minimum "requests" version to 2.14.0 [\#204](https://github.com/auth0/auth0-python/pull/204) ([lbalmaceda](https://github.com/lbalmaceda)) + 3.9.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 2de9e710..d0282444 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.9.0' +__version__ = '3.9.1' From 31d979dd7a5f935915f5580e58a9545d92c4b21a Mon Sep 17 00:00:00 2001 From: Damien Guard Date: Tue, 8 Oct 2019 10:18:08 -0700 Subject: [PATCH 064/663] Setup the CODEOWNERS for pull request reviews --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6a263cd8..073d5ffc 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @auth0/sdk-team-approvers +* @auth0/dx-sdk-approver From 6a1e985ac23e50ef695b989b04af7f9677f7cdb3 Mon Sep 17 00:00:00 2001 From: Damien Guard Date: Tue, 8 Oct 2019 12:08:23 -0700 Subject: [PATCH 065/663] Setup the CODEOWNERS for pull request reviews --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 073d5ffc..c9ff4921 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @auth0/dx-sdk-approver +* @auth0/dx-sdks-approver From c99e7fccb050740051f13785775a116684cf0006 Mon Sep 17 00:00:00 2001 From: Josh Cunningham Date: Fri, 25 Oct 2019 17:02:16 -0700 Subject: [PATCH 066/663] Setup the .github/stale.yml for Probot:Stale --- .github/stale.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 00000000..b2e13fc7 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,20 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an Issue or Pull Request becomes stale +daysUntilStale: 90 + +# Number of days of inactivity before an Issue or Pull Request with the stale label is closed. +daysUntilClose: 7 + +# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable +exemptLabels: [] + +# Set to true to ignore issues with an assignee (defaults to false) +exemptAssignees: true + +# Label to use when marking as stale +staleLabel: closed:stale + +# Comment to post when marking as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. If you have not received a response for our team (apologies for the delay) and this is still a blocker, please reply with additional information or just a ping. Thank you for your contribution! 🙇‍♂️ \ No newline at end of file From b34a6f587e6c783e3a89a8ccbdf88b3da46e5745 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 20 Apr 2020 19:17:07 -0300 Subject: [PATCH 067/663] Accept client_secret as passwordless/start param --- auth0/v3/authentication/passwordless.py | 30 ++++++++++++-- .../test/authentication/test_passwordless.py | 41 +++++++++++++++++++ 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/auth0/v3/authentication/passwordless.py b/auth0/v3/authentication/passwordless.py index dd8db971..3ba4bc51 100644 --- a/auth0/v3/authentication/passwordless.py +++ b/auth0/v3/authentication/passwordless.py @@ -9,7 +9,7 @@ class Passwordless(AuthenticationBase): domain (str): Your auth0 domain (e.g: username.auth0.com) """ - def email(self, client_id, email, send='link', auth_params=None): + def email(self, client_id, email, send='link', auth_params=None, client_secret=None): """Start flow sending an email. Given the user email address, it will send an email with: @@ -31,12 +31,15 @@ def email(self, client_id, email, send='link', auth_params=None): send (str, optional): Can be: 'link' or 'code'. Defaults to 'link'. auth_params (dict, optional): Parameters to append or override. + + client_secret (str): Client Secret of the application. """ return self.post( 'https://{}/passwordless/start'.format(self.domain), data={ 'client_id': client_id, + 'client_secret': client_secret, 'connection': 'email', 'email': email, 'send': send, @@ -44,14 +47,26 @@ def email(self, client_id, email, send='link', auth_params=None): } ) - def sms(self, client_id, phone_number): - """Start flow sending a SMS message. + def sms(self, client_id, phone_number, client_secret=None): + """Start flow sending an SMS message. + + Given the user phone number, it will send an SMS with + a verification code. You can then authenticate with + this user using phone number as username and code as password. + + Args: + client_id (str): Client Id of the application. + + client_secret (str): Client Secret of the application. + + phone_number (str): Phone number. """ return self.post( 'https://{}/passwordless/start'.format(self.domain), data={ 'client_id': client_id, + 'client_secret': client_secret, 'connection': 'sms', 'phone_number': phone_number, } @@ -59,6 +74,15 @@ def sms(self, client_id, phone_number): def sms_login(self, client_id, phone_number, code, scope='openid'): """Login using phone number/verification code. + + Args: + client_id (str): Client Id of the application. + + phone_number (str): Phone number. + + code (str): Code received in the SMS. + + scope (str, optional): Scope to use. Defaults to 'openid'. """ return self.post( diff --git a/auth0/v3/test/authentication/test_passwordless.py b/auth0/v3/test/authentication/test_passwordless.py index 4a59a7aa..ea4fad01 100644 --- a/auth0/v3/test/authentication/test_passwordless.py +++ b/auth0/v3/test/authentication/test_passwordless.py @@ -20,6 +20,30 @@ def test_email(self, mock_post): self.assertEqual(args[0], 'https://my.domain.com/passwordless/start') self.assertEqual(kwargs['data'], { 'client_id': 'cid', + 'client_secret': None, + 'email': 'a@b.com', + 'send': 'snd', + 'authParams': {'a': 'b'}, + 'connection': 'email', + }) + + @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') + def test_email_with_secret(self, mock_post): + + p = Passwordless('my.domain.com') + + p.email(client_id='cid', + client_secret='csecret', + email='a@b.com', + send='snd', + auth_params={'a': 'b'}) + + args, kwargs = mock_post.call_args + + self.assertEqual(args[0], 'https://my.domain.com/passwordless/start') + self.assertEqual(kwargs['data'], { + 'client_id': 'cid', + 'client_secret': 'csecret', 'email': 'a@b.com', 'send': 'snd', 'authParams': {'a': 'b'}, @@ -37,6 +61,23 @@ def test_sms(self, mock_post): self.assertEqual(args[0], 'https://my.domain.com/passwordless/start') self.assertEqual(kwargs['data'], { 'client_id': 'cid', + 'client_secret': None, + 'phone_number': '123456', + 'connection': 'sms', + }) + + @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') + def test_sms_with_secret(self, mock_post): + p = Passwordless('my.domain.com') + + p.sms(client_id='cid', client_secret='csecret', phone_number='123456') + + args, kwargs = mock_post.call_args + + self.assertEqual(args[0], 'https://my.domain.com/passwordless/start') + self.assertEqual(kwargs['data'], { + 'client_id': 'cid', + 'client_secret': 'csecret', 'phone_number': '123456', 'connection': 'sms', }) From b414688096ce2588643311164529c0f80242f47c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 21 Apr 2020 13:12:56 -0300 Subject: [PATCH 068/663] avoid sending None parameters --- auth0/v3/authentication/passwordless.py | 35 +++++++++++-------- .../test/authentication/test_passwordless.py | 29 +++++++++++---- 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/auth0/v3/authentication/passwordless.py b/auth0/v3/authentication/passwordless.py index 3ba4bc51..8b4f8a0d 100644 --- a/auth0/v3/authentication/passwordless.py +++ b/auth0/v3/authentication/passwordless.py @@ -35,16 +35,20 @@ def email(self, client_id, email, send='link', auth_params=None, client_secret=N client_secret (str): Client Secret of the application. """ + data={ + 'client_id': client_id, + 'connection': 'email', + 'email': email, + 'send': send, + } + if auth_params: + data.update({'authParams': auth_params}) + if client_secret: + data.update({'client_secret': client_secret}) + return self.post( 'https://{}/passwordless/start'.format(self.domain), - data={ - 'client_id': client_id, - 'client_secret': client_secret, - 'connection': 'email', - 'email': email, - 'send': send, - 'authParams': auth_params - } + data=data ) def sms(self, client_id, phone_number, client_secret=None): @@ -62,14 +66,17 @@ def sms(self, client_id, phone_number, client_secret=None): phone_number (str): Phone number. """ + data={ + 'client_id': client_id, + 'connection': 'sms', + 'phone_number': phone_number, + } + if client_secret: + data.update({'client_secret': client_secret}) + return self.post( 'https://{}/passwordless/start'.format(self.domain), - data={ - 'client_id': client_id, - 'client_secret': client_secret, - 'connection': 'sms', - 'phone_number': phone_number, - } + data=data ) def sms_login(self, client_id, phone_number, code, scope='openid'): diff --git a/auth0/v3/test/authentication/test_passwordless.py b/auth0/v3/test/authentication/test_passwordless.py index ea4fad01..86fa985b 100644 --- a/auth0/v3/test/authentication/test_passwordless.py +++ b/auth0/v3/test/authentication/test_passwordless.py @@ -10,6 +10,25 @@ def test_email(self, mock_post): p = Passwordless('my.domain.com') + p.email(client_id='cid', + email='a@b.com', + send='snd') + + args, kwargs = mock_post.call_args + + self.assertEqual(args[0], 'https://my.domain.com/passwordless/start') + self.assertEqual(kwargs['data'], { + 'client_id': 'cid', + 'email': 'a@b.com', + 'send': 'snd', + 'connection': 'email', + }) + + @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') + def test_email_with_auth_params(self, mock_post): + + p = Passwordless('my.domain.com') + p.email(client_id='cid', email='a@b.com', send='snd', @@ -20,7 +39,6 @@ def test_email(self, mock_post): self.assertEqual(args[0], 'https://my.domain.com/passwordless/start') self.assertEqual(kwargs['data'], { 'client_id': 'cid', - 'client_secret': None, 'email': 'a@b.com', 'send': 'snd', 'authParams': {'a': 'b'}, @@ -28,15 +46,14 @@ def test_email(self, mock_post): }) @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') - def test_email_with_secret(self, mock_post): + def test_email_with_client_secret(self, mock_post): p = Passwordless('my.domain.com') p.email(client_id='cid', client_secret='csecret', email='a@b.com', - send='snd', - auth_params={'a': 'b'}) + send='snd') args, kwargs = mock_post.call_args @@ -46,7 +63,6 @@ def test_email_with_secret(self, mock_post): 'client_secret': 'csecret', 'email': 'a@b.com', 'send': 'snd', - 'authParams': {'a': 'b'}, 'connection': 'email', }) @@ -61,13 +77,12 @@ def test_sms(self, mock_post): self.assertEqual(args[0], 'https://my.domain.com/passwordless/start') self.assertEqual(kwargs['data'], { 'client_id': 'cid', - 'client_secret': None, 'phone_number': '123456', 'connection': 'sms', }) @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') - def test_sms_with_secret(self, mock_post): + def test_sms_with_client_secret(self, mock_post): p = Passwordless('my.domain.com') p.sms(client_id='cid', client_secret='csecret', phone_number='123456') From 09bac0130ca493e20610dfc0fd14bffab0fa3a2c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 6 May 2020 12:46:46 -0300 Subject: [PATCH 069/663] Release 3.9.2 --- CHANGELOG.md | 6 ++++++ auth0/__init__.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f8acfc9..57f2a291 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changes ======= +3.9.2 +------------------ + +**Fixed** +- Accept client_secret as passwordless/start param [\#211](https://github.com/auth0/auth0-python/pull/211) ([lbalmaceda](https://github.com/lbalmaceda)) + 3.9.1 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index d0282444..bc7856cc 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.9.1' +__version__ = '3.9.2' From f3fb905b6739a84e30c2681c5c5f6e27343d9407 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 7 May 2020 19:41:03 -0300 Subject: [PATCH 070/663] Applied https://github.com/auth0/auth0-python/commit/59c1942acbd9723adaf587ac4bc94c9583fe38a0.patch. --- auth0/v3/authentication/base.py | 8 ++++---- auth0/v3/management/blacklists.py | 4 ++-- auth0/v3/management/client_grants.py | 4 ++-- auth0/v3/management/clients.py | 4 ++-- auth0/v3/management/connections.py | 4 ++-- auth0/v3/management/custom_domains.py | 4 ++-- auth0/v3/management/device_credentials.py | 4 ++-- auth0/v3/management/email_templates.py | 4 ++-- auth0/v3/management/emails.py | 4 ++-- auth0/v3/management/grants.py | 4 ++-- auth0/v3/management/guardian.py | 4 ++-- auth0/v3/management/jobs.py | 4 ++-- auth0/v3/management/logs.py | 4 ++-- auth0/v3/management/resource_servers.py | 4 ++-- auth0/v3/management/rest.py | 15 ++++++++------- auth0/v3/management/roles.py | 4 ++-- auth0/v3/management/rules.py | 4 ++-- auth0/v3/management/rules_configs.py | 4 ++-- auth0/v3/management/stats.py | 4 ++-- auth0/v3/management/tenants.py | 4 ++-- auth0/v3/management/tickets.py | 4 ++-- auth0/v3/management/user_blocks.py | 4 ++-- auth0/v3/management/users.py | 4 ++-- auth0/v3/management/users_by_email.py | 4 ++-- auth0/v3/test/authentication/test_base.py | 20 ++++++++++++++++---- auth0/v3/test/management/test_rest.py | 16 ++++++++-------- 26 files changed, 80 insertions(+), 67 deletions(-) diff --git a/auth0/v3/authentication/base.py b/auth0/v3/authentication/base.py index 8e60ff88..e16c735c 100644 --- a/auth0/v3/authentication/base.py +++ b/auth0/v3/authentication/base.py @@ -18,9 +18,9 @@ class AuthenticationBase(object): (defaults to True) """ - def __init__(self, domain, telemetry=True): + def __init__(self, domain, telemetry=True, timeout=5.0): self.domain = domain - + self.timeout = timeout self.base_headers = {'Content-Type': 'application/json'} if telemetry: @@ -43,13 +43,13 @@ def __init__(self, domain, telemetry=True): def post(self, url, data=None, headers=None): request_headers = self.base_headers.copy() request_headers.update(headers or {}) - response = requests.post(url=url, json=data, headers=request_headers) + response = requests.post(url=url, json=data, headers=request_headers, timeout=self.timeout) return self._process_response(response) def get(self, url, params=None, headers=None): request_headers = self.base_headers.copy() request_headers.update(headers or {}) - response = requests.get(url=url, params=params, headers=request_headers) + response = requests.get(url=url, params=params, headers=request_headers, timeout=self.timeout) return self._process_response(response) def _process_response(self, response): diff --git a/auth0/v3/management/blacklists.py b/auth0/v3/management/blacklists.py index 534f1909..ff1c47ff 100644 --- a/auth0/v3/management/blacklists.py +++ b/auth0/v3/management/blacklists.py @@ -13,9 +13,9 @@ class Blacklists(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.url = 'https://{}/api/v2/blacklists/tokens'.format(domain) - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def get(self, aud=None): """Retrieves the jti and aud of all tokens in the blacklist. diff --git a/auth0/v3/management/client_grants.py b/auth0/v3/management/client_grants.py index 43222569..5cfda298 100644 --- a/auth0/v3/management/client_grants.py +++ b/auth0/v3/management/client_grants.py @@ -14,9 +14,9 @@ class ClientGrants(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/client-grants'.format(self.domain) diff --git a/auth0/v3/management/clients.py b/auth0/v3/management/clients.py index c0142179..80a7b81e 100644 --- a/auth0/v3/management/clients.py +++ b/auth0/v3/management/clients.py @@ -14,9 +14,9 @@ class Clients(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/clients'.format(self.domain) diff --git a/auth0/v3/management/connections.py b/auth0/v3/management/connections.py index 2e2db1c5..0cae9aba 100644 --- a/auth0/v3/management/connections.py +++ b/auth0/v3/management/connections.py @@ -13,9 +13,9 @@ class Connections(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/connections'.format(self.domain) diff --git a/auth0/v3/management/custom_domains.py b/auth0/v3/management/custom_domains.py index 98e3d45e..82d24b43 100644 --- a/auth0/v3/management/custom_domains.py +++ b/auth0/v3/management/custom_domains.py @@ -14,9 +14,9 @@ class CustomDomains(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://%s/api/v2/custom-domains' % self.domain diff --git a/auth0/v3/management/device_credentials.py b/auth0/v3/management/device_credentials.py index 516a70ac..1624f454 100644 --- a/auth0/v3/management/device_credentials.py +++ b/auth0/v3/management/device_credentials.py @@ -14,9 +14,9 @@ class DeviceCredentials(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/device-credentials'.format(self.domain) diff --git a/auth0/v3/management/email_templates.py b/auth0/v3/management/email_templates.py index 365b4d98..cec5907c 100644 --- a/auth0/v3/management/email_templates.py +++ b/auth0/v3/management/email_templates.py @@ -14,9 +14,9 @@ class EmailTemplates(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/email-templates'.format(self.domain) diff --git a/auth0/v3/management/emails.py b/auth0/v3/management/emails.py index e709846b..ba39cd3f 100644 --- a/auth0/v3/management/emails.py +++ b/auth0/v3/management/emails.py @@ -14,9 +14,9 @@ class Emails(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/emails/provider'.format(self.domain) diff --git a/auth0/v3/management/grants.py b/auth0/v3/management/grants.py index da3b332a..7e4b0ccb 100644 --- a/auth0/v3/management/grants.py +++ b/auth0/v3/management/grants.py @@ -14,9 +14,9 @@ class Grants(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://%s/api/v2/grants' % self.domain diff --git a/auth0/v3/management/guardian.py b/auth0/v3/management/guardian.py index e421b4b7..eed73fe1 100644 --- a/auth0/v3/management/guardian.py +++ b/auth0/v3/management/guardian.py @@ -14,9 +14,9 @@ class Guardian(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/guardian'.format(self.domain) diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index 9d8864b3..95334420 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -14,9 +14,9 @@ class Jobs(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, path=None): url = 'https://{}/api/v2/jobs'.format(self.domain) diff --git a/auth0/v3/management/logs.py b/auth0/v3/management/logs.py index d7b70288..f200a37e 100644 --- a/auth0/v3/management/logs.py +++ b/auth0/v3/management/logs.py @@ -14,9 +14,9 @@ class Logs(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/logs'.format(self.domain) diff --git a/auth0/v3/management/resource_servers.py b/auth0/v3/management/resource_servers.py index 90a6be7b..7a110973 100644 --- a/auth0/v3/management/resource_servers.py +++ b/auth0/v3/management/resource_servers.py @@ -14,9 +14,9 @@ class ResourceServers(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/resource-servers'.format(self.domain) diff --git a/auth0/v3/management/rest.py b/auth0/v3/management/rest.py index 013a1d63..a8c90d78 100644 --- a/auth0/v3/management/rest.py +++ b/auth0/v3/management/rest.py @@ -13,8 +13,9 @@ class RestClient(object): """Provides simple methods for handling all RESTful api endpoints. """ - def __init__(self, jwt, telemetry=True): + def __init__(self, jwt, telemetry=True, timeout=5.0): self.jwt = jwt + self.timeout = timeout self.base_headers = { 'Authorization': 'Bearer {}'.format(self.jwt), @@ -40,38 +41,38 @@ def __init__(self, jwt, telemetry=True): def get(self, url, params=None): headers = self.base_headers.copy() - response = requests.get(url, params=params, headers=headers) + response = requests.get(url, params=params, headers=headers, timeout=self.timeout) return self._process_response(response) def post(self, url, data=None): headers = self.base_headers.copy() - response = requests.post(url, json=data, headers=headers) + response = requests.post(url, json=data, headers=headers, timeout=self.timeout) return self._process_response(response) def file_post(self, url, data=None, files=None): headers = self.base_headers.copy() headers.pop('Content-Type', None) - response = requests.post(url, data=data, files=files, headers=headers) + response = requests.post(url, data=data, files=files, headers=headers, timeout=self.timeout) return self._process_response(response) def patch(self, url, data=None): headers = self.base_headers.copy() - response = requests.patch(url, json=data, headers=headers) + response = requests.patch(url, json=data, headers=headers, timeout=self.timeout) return self._process_response(response) def put(self, url, data=None): headers = self.base_headers.copy() - response = requests.put(url, json=data, headers=headers) + response = requests.put(url, json=data, headers=headers, timeout=self.timeout) return self._process_response(response) def delete(self, url, params=None, data=None): headers = self.base_headers.copy() - response = requests.delete(url, headers=headers, params=params or {}, json=data) + response = requests.delete(url, headers=headers, params=params or {}, json=data, timeout=self.timeout) return self._process_response(response) def _process_response(self, response): diff --git a/auth0/v3/management/roles.py b/auth0/v3/management/roles.py index 0503d8ed..0ba703ee 100644 --- a/auth0/v3/management/roles.py +++ b/auth0/v3/management/roles.py @@ -14,9 +14,9 @@ class Roles(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/roles'.format(self.domain) diff --git a/auth0/v3/management/rules.py b/auth0/v3/management/rules.py index 5838a65d..5146851b 100644 --- a/auth0/v3/management/rules.py +++ b/auth0/v3/management/rules.py @@ -14,9 +14,9 @@ class Rules(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/rules'.format(self.domain) diff --git a/auth0/v3/management/rules_configs.py b/auth0/v3/management/rules_configs.py index 686f1013..cd935e69 100644 --- a/auth0/v3/management/rules_configs.py +++ b/auth0/v3/management/rules_configs.py @@ -14,9 +14,9 @@ class RulesConfigs(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://%s/api/v2/rules-configs' % self.domain diff --git a/auth0/v3/management/stats.py b/auth0/v3/management/stats.py index a03507d6..d6f223da 100644 --- a/auth0/v3/management/stats.py +++ b/auth0/v3/management/stats.py @@ -13,9 +13,9 @@ class Stats(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, action): return 'https://{}/api/v2/stats/{}'.format(self.domain, action) diff --git a/auth0/v3/management/tenants.py b/auth0/v3/management/tenants.py index b1faef70..62d8efe4 100644 --- a/auth0/v3/management/tenants.py +++ b/auth0/v3/management/tenants.py @@ -14,9 +14,9 @@ class Tenants(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self): return 'https://{}/api/v2/tenants/settings'.format(self.domain) diff --git a/auth0/v3/management/tickets.py b/auth0/v3/management/tickets.py index bffd9f53..b62e86ff 100644 --- a/auth0/v3/management/tickets.py +++ b/auth0/v3/management/tickets.py @@ -14,9 +14,9 @@ class Tickets(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, action): return 'https://{}/api/v2/tickets/{}'.format(self.domain, action) diff --git a/auth0/v3/management/user_blocks.py b/auth0/v3/management/user_blocks.py index 82af8e51..8712d863 100644 --- a/auth0/v3/management/user_blocks.py +++ b/auth0/v3/management/user_blocks.py @@ -14,9 +14,9 @@ class UserBlocks(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/user-blocks'.format(self.domain) diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 79514e09..45b71648 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -14,9 +14,9 @@ class Users(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): url = 'https://{}/api/v2/users'.format(self.domain) diff --git a/auth0/v3/management/users_by_email.py b/auth0/v3/management/users_by_email.py index c9f582e7..8993e378 100644 --- a/auth0/v3/management/users_by_email.py +++ b/auth0/v3/management/users_by_email.py @@ -14,9 +14,9 @@ class UsersByEmail(object): (defaults to True) """ - def __init__(self, domain, token, telemetry=True): + def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain - self.client = RestClient(jwt=token, telemetry=telemetry) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self): url = 'https://{}/api/v2/users-by-email'.format(self.domain) diff --git a/auth0/v3/test/authentication/test_base.py b/auth0/v3/test/authentication/test_base.py index 804c4593..5d9cde01 100644 --- a/auth0/v3/test/authentication/test_base.py +++ b/auth0/v3/test/authentication/test_base.py @@ -51,7 +51,7 @@ def test_post(self, mock_post): data = ab.post('the-url', data={'a': 'b'}, headers={'c': 'd'}) mock_post.assert_called_with(url='the-url', json={'a': 'b'}, - headers={'c': 'd', 'Content-Type': 'application/json'}) + headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=5.0) self.assertEqual(data, {'x': 'y'}) @@ -66,7 +66,7 @@ def test_post_with_defaults(self, mock_post): data = ab.post('the-url') mock_post.assert_called_with(url='the-url', json=None, - headers={'Content-Type': 'application/json'}) + headers={'Content-Type': 'application/json'}, timeout=5.0) self.assertEqual(data, {'x': 'y'}) @@ -182,7 +182,7 @@ def test_get(self, mock_get): data = ab.get('the-url', params={'a': 'b'}, headers={'c': 'd'}) mock_get.assert_called_with(url='the-url', params={'a': 'b'}, - headers={'c': 'd', 'Content-Type': 'application/json'}) + headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=5.0) self.assertEqual(data, {'x': 'y'}) @@ -197,7 +197,7 @@ def test_get_with_defaults(self, mock_get): data = ab.get('the-url') mock_get.assert_called_with(url='the-url', params=None, - headers={'Content-Type': 'application/json'}) + headers={'Content-Type': 'application/json'}, timeout=5.0) self.assertEqual(data, {'x': 'y'}) @@ -221,3 +221,15 @@ def test_get_includes_telemetry(self, mock_get): self.assertIn('Auth0-Client', headers) self.assertEqual(data, {"x": "y"}) + + def test_get_can_timeout(self): + ab = AuthenticationBase('auth0.com', timeout=0.00001) + + with self.assertRaises(requests.exceptions.Timeout): + ab.get('https://auth0.com', params={'a': 'b'}, headers={'c': 'd'}) + + def test_post_can_timeout(self): + ab = AuthenticationBase('auth0.com', timeout=0.00001) + + with self.assertRaises(requests.exceptions.Timeout): + ab.post('https://auth0.com', data={'a': 'b'}, headers={'c': 'd'}) diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index 5a773179..16b0cf6a 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -22,14 +22,14 @@ def test_get(self, mock_get): mock_get.return_value.status_code = 200 response = rc.get('the-url') - mock_get.assert_called_with('the-url', params=None, headers=headers) + mock_get.assert_called_with('the-url', params=None, headers=headers, timeout=5.0) self.assertEqual(response, ['a', 'b']) response = rc.get(url='the/url', params={'A': 'param', 'B': 'param'}) mock_get.assert_called_with('the/url', params={'A': 'param', 'B': 'param'}, - headers=headers) + headers=headers, timeout=5.0) self.assertEqual(response, ['a', 'b']) mock_get.return_value.text = '' @@ -65,7 +65,7 @@ def test_post(self, mock_post): mock_post.return_value.status_code = 200 response = rc.post('the/url', data=data) mock_post.assert_called_with('the/url', json=data, - headers=headers) + headers=headers, timeout=5.0) self.assertEqual(response, {'a': 'b'}) @@ -213,7 +213,7 @@ def test_file_post_content_type_is_none(self, mock_post): rc.file_post('the-url', data=data, files=files) - mock_post.assert_called_once_with('the-url', data=data, files=files, headers=headers) + mock_post.assert_called_once_with('the-url', data=data, files=files, headers=headers, timeout=5.0) @mock.patch('requests.put') @@ -229,7 +229,7 @@ def test_put(self, mock_put): response = rc.put(url='the-url', data=data) mock_put.assert_called_with('the-url', json=data, - headers=headers) + headers=headers, timeout=5.0) self.assertEqual(response, ['a', 'b']) @@ -262,7 +262,7 @@ def test_patch(self, mock_patch): response = rc.patch(url='the-url', data=data) mock_patch.assert_called_with('the-url', json=data, - headers=headers) + headers=headers, timeout=5.0) self.assertEqual(response, ['a', 'b']) @@ -294,7 +294,7 @@ def test_delete(self, mock_delete): mock_delete.return_value.status_code = 200 response = rc.delete(url='the-url/ID') - mock_delete.assert_called_with('the-url/ID', headers=headers, params={}, json=None) + mock_delete.assert_called_with('the-url/ID', headers=headers, params={}, json=None, timeout=5.0) self.assertEqual(response, ['a', 'b']) @@ -313,7 +313,7 @@ def test_delete_with_body_and_params(self, mock_delete): params={'A': 'param', 'B': 'param'} response = rc.delete(url='the-url/ID', params=params, data=data) - mock_delete.assert_called_with('the-url/ID', headers=headers, params=params, json=data) + mock_delete.assert_called_with('the-url/ID', headers=headers, params=params, json=data, timeout=5.0) self.assertEqual(response, ['a', 'b']) From 2ceae0ff4c0af89655b0c9ba5ac53ffe283d8aa5 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 7 May 2020 20:16:14 -0300 Subject: [PATCH 071/663] add docblocks --- auth0/v3/authentication/base.py | 4 ++++ auth0/v3/management/blacklists.py | 5 +++++ auth0/v3/management/client_grants.py | 5 +++++ auth0/v3/management/clients.py | 5 +++++ auth0/v3/management/connections.py | 5 +++++ auth0/v3/management/custom_domains.py | 5 +++++ auth0/v3/management/device_credentials.py | 5 +++++ auth0/v3/management/email_templates.py | 5 +++++ auth0/v3/management/emails.py | 5 +++++ auth0/v3/management/grants.py | 5 +++++ auth0/v3/management/guardian.py | 5 +++++ auth0/v3/management/jobs.py | 5 +++++ auth0/v3/management/logs.py | 5 +++++ auth0/v3/management/resource_servers.py | 5 +++++ auth0/v3/management/rest.py | 12 ++++++++++-- auth0/v3/management/roles.py | 5 +++++ auth0/v3/management/rules.py | 5 +++++ auth0/v3/management/rules_configs.py | 5 +++++ auth0/v3/management/stats.py | 5 +++++ auth0/v3/management/tenants.py | 5 +++++ auth0/v3/management/tickets.py | 5 +++++ auth0/v3/management/user_blocks.py | 5 +++++ auth0/v3/management/users.py | 5 +++++ auth0/v3/management/users_by_email.py | 5 +++++ 24 files changed, 124 insertions(+), 2 deletions(-) diff --git a/auth0/v3/authentication/base.py b/auth0/v3/authentication/base.py index e16c735c..bfb770f7 100644 --- a/auth0/v3/authentication/base.py +++ b/auth0/v3/authentication/base.py @@ -16,6 +16,10 @@ class AuthenticationBase(object): Args: telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/blacklists.py b/auth0/v3/management/blacklists.py index ff1c47ff..c1fe86bb 100644 --- a/auth0/v3/management/blacklists.py +++ b/auth0/v3/management/blacklists.py @@ -11,6 +11,11 @@ class Blacklists(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/client_grants.py b/auth0/v3/management/client_grants.py index 5cfda298..b64ae820 100644 --- a/auth0/v3/management/client_grants.py +++ b/auth0/v3/management/client_grants.py @@ -12,6 +12,11 @@ class ClientGrants(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/clients.py b/auth0/v3/management/clients.py index 80a7b81e..3bedd589 100644 --- a/auth0/v3/management/clients.py +++ b/auth0/v3/management/clients.py @@ -12,6 +12,11 @@ class Clients(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/connections.py b/auth0/v3/management/connections.py index 0cae9aba..3c372df8 100644 --- a/auth0/v3/management/connections.py +++ b/auth0/v3/management/connections.py @@ -11,6 +11,11 @@ class Connections(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/custom_domains.py b/auth0/v3/management/custom_domains.py index 82d24b43..c31f19d3 100644 --- a/auth0/v3/management/custom_domains.py +++ b/auth0/v3/management/custom_domains.py @@ -12,6 +12,11 @@ class CustomDomains(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/device_credentials.py b/auth0/v3/management/device_credentials.py index 1624f454..6b7b31d3 100644 --- a/auth0/v3/management/device_credentials.py +++ b/auth0/v3/management/device_credentials.py @@ -12,6 +12,11 @@ class DeviceCredentials(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/email_templates.py b/auth0/v3/management/email_templates.py index cec5907c..dcda2bfa 100644 --- a/auth0/v3/management/email_templates.py +++ b/auth0/v3/management/email_templates.py @@ -12,6 +12,11 @@ class EmailTemplates(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/emails.py b/auth0/v3/management/emails.py index ba39cd3f..e88f4e73 100644 --- a/auth0/v3/management/emails.py +++ b/auth0/v3/management/emails.py @@ -12,6 +12,11 @@ class Emails(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/grants.py b/auth0/v3/management/grants.py index 7e4b0ccb..d80c4f48 100644 --- a/auth0/v3/management/grants.py +++ b/auth0/v3/management/grants.py @@ -12,6 +12,11 @@ class Grants(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/guardian.py b/auth0/v3/management/guardian.py index eed73fe1..ff77a60a 100644 --- a/auth0/v3/management/guardian.py +++ b/auth0/v3/management/guardian.py @@ -12,6 +12,11 @@ class Guardian(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index 95334420..eeb2dd4c 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -12,6 +12,11 @@ class Jobs(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/logs.py b/auth0/v3/management/logs.py index f200a37e..854c4ac2 100644 --- a/auth0/v3/management/logs.py +++ b/auth0/v3/management/logs.py @@ -12,6 +12,11 @@ class Logs(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/resource_servers.py b/auth0/v3/management/resource_servers.py index 7a110973..61115dbb 100644 --- a/auth0/v3/management/resource_servers.py +++ b/auth0/v3/management/resource_servers.py @@ -12,6 +12,11 @@ class ResourceServers(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/rest.py b/auth0/v3/management/rest.py index a8c90d78..8e6fd20e 100644 --- a/auth0/v3/management/rest.py +++ b/auth0/v3/management/rest.py @@ -11,8 +11,16 @@ class RestClient(object): - """Provides simple methods for handling all RESTful api endpoints. """ - + """Provides simple methods for handling all RESTful api endpoints. + + Args: + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ def __init__(self, jwt, telemetry=True, timeout=5.0): self.jwt = jwt self.timeout = timeout diff --git a/auth0/v3/management/roles.py b/auth0/v3/management/roles.py index 0ba703ee..31c004e0 100644 --- a/auth0/v3/management/roles.py +++ b/auth0/v3/management/roles.py @@ -12,6 +12,11 @@ class Roles(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/rules.py b/auth0/v3/management/rules.py index 5146851b..10173623 100644 --- a/auth0/v3/management/rules.py +++ b/auth0/v3/management/rules.py @@ -12,6 +12,11 @@ class Rules(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/rules_configs.py b/auth0/v3/management/rules_configs.py index cd935e69..b29cebe1 100644 --- a/auth0/v3/management/rules_configs.py +++ b/auth0/v3/management/rules_configs.py @@ -12,6 +12,11 @@ class RulesConfigs(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/stats.py b/auth0/v3/management/stats.py index d6f223da..8c34ad50 100644 --- a/auth0/v3/management/stats.py +++ b/auth0/v3/management/stats.py @@ -11,6 +11,11 @@ class Stats(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/tenants.py b/auth0/v3/management/tenants.py index 62d8efe4..8b6ba727 100644 --- a/auth0/v3/management/tenants.py +++ b/auth0/v3/management/tenants.py @@ -12,6 +12,11 @@ class Tenants(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/tickets.py b/auth0/v3/management/tickets.py index b62e86ff..76677875 100644 --- a/auth0/v3/management/tickets.py +++ b/auth0/v3/management/tickets.py @@ -12,6 +12,11 @@ class Tickets(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/user_blocks.py b/auth0/v3/management/user_blocks.py index 8712d863..e7670a35 100644 --- a/auth0/v3/management/user_blocks.py +++ b/auth0/v3/management/user_blocks.py @@ -12,6 +12,11 @@ class UserBlocks(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 45b71648..6bc78303 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -12,6 +12,11 @@ class Users(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): diff --git a/auth0/v3/management/users_by_email.py b/auth0/v3/management/users_by_email.py index 8993e378..295ea0b5 100644 --- a/auth0/v3/management/users_by_email.py +++ b/auth0/v3/management/users_by_email.py @@ -12,6 +12,11 @@ class UsersByEmail(object): telemetry (bool, optional): Enable or disable Telemetry (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) """ def __init__(self, domain, token, telemetry=True, timeout=5.0): From 93af30e7d49d2e015b549a5457f1a031484afb6a Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 7 May 2020 20:50:32 -0300 Subject: [PATCH 072/663] add tests ensuring timeout is passed --- auth0/v3/test/authentication/test_base.py | 10 +- auth0/v3/test/management/test_blacklists.py | 6 ++ .../v3/test/management/test_client_grants.py | 6 ++ auth0/v3/test/management/test_clients.py | 6 ++ auth0/v3/test/management/test_connections.py | 6 ++ .../v3/test/management/test_custom_domains.py | 6 ++ .../management/test_device_credentials.py | 6 ++ .../test/management/test_email_endpoints.py | 6 ++ auth0/v3/test/management/test_emails.py | 6 ++ auth0/v3/test/management/test_grants.py | 6 ++ auth0/v3/test/management/test_guardian.py | 6 ++ auth0/v3/test/management/test_jobs.py | 6 ++ auth0/v3/test/management/test_logs.py | 6 ++ .../test/management/test_resource_servers.py | 6 ++ auth0/v3/test/management/test_rest.py | 99 ++++++++++++++++++- auth0/v3/test/management/test_roles.py | 6 ++ auth0/v3/test/management/test_rules.py | 6 ++ .../v3/test/management/test_rules_configs.py | 8 +- auth0/v3/test/management/test_stats.py | 8 +- auth0/v3/test/management/test_tenants.py | 6 ++ auth0/v3/test/management/test_tickets.py | 6 ++ auth0/v3/test/management/test_user_blocks.py | 6 ++ auth0/v3/test/management/test_users.py | 6 ++ .../v3/test/management/test_users_by_email.py | 6 ++ 24 files changed, 238 insertions(+), 7 deletions(-) diff --git a/auth0/v3/test/authentication/test_base.py b/auth0/v3/test/authentication/test_base.py index 5d9cde01..1d495ac6 100644 --- a/auth0/v3/test/authentication/test_base.py +++ b/auth0/v3/test/authentication/test_base.py @@ -1,5 +1,7 @@ import base64 import json +from time import sleep + import mock import sys import requests @@ -43,7 +45,7 @@ def test_telemetry_disabled(self): @mock.patch('requests.post') def test_post(self, mock_post): - ab = AuthenticationBase('auth0.com', telemetry=False) + ab = AuthenticationBase('auth0.com', telemetry=False, timeout=(10, 2)) mock_post.return_value.status_code = 200 mock_post.return_value.text = '{"x": "y"}' @@ -51,7 +53,7 @@ def test_post(self, mock_post): data = ab.post('the-url', data={'a': 'b'}, headers={'c': 'd'}) mock_post.assert_called_with(url='the-url', json={'a': 'b'}, - headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=5.0) + headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=(10, 2)) self.assertEqual(data, {'x': 'y'}) @@ -174,7 +176,7 @@ def test_post_error_with_no_response_text(self, mock_post): @mock.patch('requests.get') def test_get(self, mock_get): - ab = AuthenticationBase('auth0.com', telemetry=False) + ab = AuthenticationBase('auth0.com', telemetry=False, timeout=(10, 2)) mock_get.return_value.status_code = 200 mock_get.return_value.text = '{"x": "y"}' @@ -182,7 +184,7 @@ def test_get(self, mock_get): data = ab.get('the-url', params={'a': 'b'}, headers={'c': 'd'}) mock_get.assert_called_with(url='the-url', params={'a': 'b'}, - headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=5.0) + headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=(10, 2)) self.assertEqual(data, {'x': 'y'}) diff --git a/auth0/v3/test/management/test_blacklists.py b/auth0/v3/test/management/test_blacklists.py index 27065af4..cbf74e96 100644 --- a/auth0/v3/test/management/test_blacklists.py +++ b/auth0/v3/test/management/test_blacklists.py @@ -5,6 +5,12 @@ class TestBlacklists(unittest.TestCase): + def test_init_with_optionals(self): + t = Blacklists(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.blacklists.RestClient') def test_get(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_client_grants.py b/auth0/v3/test/management/test_client_grants.py index 1155649e..399c5cb8 100644 --- a/auth0/v3/test/management/test_client_grants.py +++ b/auth0/v3/test/management/test_client_grants.py @@ -5,6 +5,12 @@ class TestClientGrants(unittest.TestCase): + def test_init_with_optionals(self): + t = ClientGrants(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.client_grants.RestClient') def test_all(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_clients.py b/auth0/v3/test/management/test_clients.py index 4e4c10ee..58be544d 100644 --- a/auth0/v3/test/management/test_clients.py +++ b/auth0/v3/test/management/test_clients.py @@ -5,6 +5,12 @@ class TestClients(unittest.TestCase): + def test_init_with_optionals(self): + t = Clients(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.clients.RestClient') def test_all(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_connections.py b/auth0/v3/test/management/test_connections.py index 87a5f50e..841f7e8c 100644 --- a/auth0/v3/test/management/test_connections.py +++ b/auth0/v3/test/management/test_connections.py @@ -5,6 +5,12 @@ class TestConnection(unittest.TestCase): + def test_init_with_optionals(self): + t = Connections(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.connections.RestClient') def test_all(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_custom_domains.py b/auth0/v3/test/management/test_custom_domains.py index d80dc825..2a42dbbe 100644 --- a/auth0/v3/test/management/test_custom_domains.py +++ b/auth0/v3/test/management/test_custom_domains.py @@ -5,6 +5,12 @@ class TestCustomDomains(unittest.TestCase): + def test_init_with_optionals(self): + t = CustomDomains(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.custom_domains.RestClient') def test_get_all(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_device_credentials.py b/auth0/v3/test/management/test_device_credentials.py index a976f343..c720ba69 100644 --- a/auth0/v3/test/management/test_device_credentials.py +++ b/auth0/v3/test/management/test_device_credentials.py @@ -5,6 +5,12 @@ class TestDeviceCredentials(unittest.TestCase): + def test_init_with_optionals(self): + t = DeviceCredentials(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.device_credentials.RestClient') def test_get(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_email_endpoints.py b/auth0/v3/test/management/test_email_endpoints.py index d494c37e..5ebd1903 100644 --- a/auth0/v3/test/management/test_email_endpoints.py +++ b/auth0/v3/test/management/test_email_endpoints.py @@ -5,6 +5,12 @@ class TestClients(unittest.TestCase): + def test_init_with_optionals(self): + t = EmailTemplates(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.email_templates.RestClient') def test_create(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_emails.py b/auth0/v3/test/management/test_emails.py index e0a13c5f..e212c673 100644 --- a/auth0/v3/test/management/test_emails.py +++ b/auth0/v3/test/management/test_emails.py @@ -5,6 +5,12 @@ class TestEmails(unittest.TestCase): + def test_init_with_optionals(self): + t = Emails(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.emails.RestClient') def test_get(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_grants.py b/auth0/v3/test/management/test_grants.py index 35d06369..a9325c04 100644 --- a/auth0/v3/test/management/test_grants.py +++ b/auth0/v3/test/management/test_grants.py @@ -5,6 +5,12 @@ class TestGrants(unittest.TestCase): + def test_init_with_optionals(self): + t = Grants(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.grants.RestClient') def test_get_all(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_guardian.py b/auth0/v3/test/management/test_guardian.py index 002e1736..3c7b2991 100644 --- a/auth0/v3/test/management/test_guardian.py +++ b/auth0/v3/test/management/test_guardian.py @@ -5,6 +5,12 @@ class TestGuardian(unittest.TestCase): + def test_init_with_optionals(self): + t = Guardian(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.guardian.RestClient') def test_all_factors(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_jobs.py b/auth0/v3/test/management/test_jobs.py index e2685c4e..ad49ddf4 100644 --- a/auth0/v3/test/management/test_jobs.py +++ b/auth0/v3/test/management/test_jobs.py @@ -5,6 +5,12 @@ class TestJobs(unittest.TestCase): + def test_init_with_optionals(self): + t = Jobs(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.jobs.RestClient') def test_get(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_logs.py b/auth0/v3/test/management/test_logs.py index 4fa2da69..30759215 100644 --- a/auth0/v3/test/management/test_logs.py +++ b/auth0/v3/test/management/test_logs.py @@ -5,6 +5,12 @@ class TestLogs(unittest.TestCase): + def test_init_with_optionals(self): + t = Logs(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.logs.RestClient') def test_search(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_resource_servers.py b/auth0/v3/test/management/test_resource_servers.py index bd1f57f8..340bfc43 100644 --- a/auth0/v3/test/management/test_resource_servers.py +++ b/auth0/v3/test/management/test_resource_servers.py @@ -5,6 +5,12 @@ class TestResourceServers(unittest.TestCase): + def test_init_with_optionals(self): + t = ResourceServers(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.resource_servers.RestClient') def test_create(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index 16b0cf6a..717657d3 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -2,14 +2,111 @@ import sys import json import base64 -import requests + import mock +import requests + from ...management.rest import RestClient from ...exceptions import Auth0Error class TestRest(unittest.TestCase): + def test_get_can_timeout(self): + rc = RestClient(jwt='a-token', telemetry=False, timeout=0.00001) + + with self.assertRaises(requests.exceptions.Timeout): + rc.get('http://auth0.com') + + def test_post_can_timeout(self): + rc = RestClient(jwt='a-token', telemetry=False, timeout=0.00001) + + with self.assertRaises(requests.exceptions.Timeout): + rc.post('http://auth0.com') + + def test_put_can_timeout(self): + rc = RestClient(jwt='a-token', telemetry=False, timeout=0.00001) + + with self.assertRaises(requests.exceptions.Timeout): + rc.put('http://auth0.com') + + def test_patch_can_timeout(self): + rc = RestClient(jwt='a-token', telemetry=False, timeout=0.00001) + + with self.assertRaises(requests.exceptions.Timeout): + rc.patch('http://auth0.com') + + def test_delete_can_timeout(self): + rc = RestClient(jwt='a-token', telemetry=False, timeout=0.00001) + + with self.assertRaises(requests.exceptions.Timeout): + rc.delete('http://auth0.com') + + @mock.patch('requests.get') + def test_get_custom_timeout(self, mock_get): + rc = RestClient(jwt='a-token', telemetry=False, timeout=(10, 2)) + headers = { + 'Authorization': 'Bearer a-token', + 'Content-Type': 'application/json', + } + mock_get.return_value.text = '["a", "b"]' + mock_get.return_value.status_code = 200 + + rc.get('the-url') + mock_get.assert_called_with('the-url', params=None, headers=headers, timeout=(10, 2)) + + @mock.patch('requests.post') + def test_post_custom_timeout(self, mock_post): + rc = RestClient(jwt='a-token', telemetry=False, timeout=(10, 2)) + headers = { + 'Authorization': 'Bearer a-token', + 'Content-Type': 'application/json', + } + mock_post.return_value.text = '["a", "b"]' + mock_post.return_value.status_code = 200 + + rc.post('the-url') + mock_post.assert_called_with('the-url', json=None, headers=headers, timeout=(10, 2)) + + @mock.patch('requests.put') + def test_put_custom_timeout(self, mock_put): + rc = RestClient(jwt='a-token', telemetry=False, timeout=(10, 2)) + headers = { + 'Authorization': 'Bearer a-token', + 'Content-Type': 'application/json', + } + mock_put.return_value.text = '["a", "b"]' + mock_put.return_value.status_code = 200 + + rc.put('the-url') + mock_put.assert_called_with('the-url', json=None, headers=headers, timeout=(10, 2)) + + @mock.patch('requests.patch') + def test_patch_custom_timeout(self, mock_patch): + rc = RestClient(jwt='a-token', telemetry=False, timeout=(10, 2)) + headers = { + 'Authorization': 'Bearer a-token', + 'Content-Type': 'application/json', + } + mock_patch.return_value.text = '["a", "b"]' + mock_patch.return_value.status_code = 200 + + rc.patch('the-url') + mock_patch.assert_called_with('the-url', json=None, headers=headers, timeout=(10, 2)) + + @mock.patch('requests.delete') + def test_delete_custom_timeout(self, mock_delete): + rc = RestClient(jwt='a-token', telemetry=False, timeout=(10, 2)) + headers = { + 'Authorization': 'Bearer a-token', + 'Content-Type': 'application/json', + } + mock_delete.return_value.text = '["a", "b"]' + mock_delete.return_value.status_code = 200 + + rc.delete('the-url') + mock_delete.assert_called_with('the-url', params={}, json=None, headers=headers, timeout=(10, 2)) + @mock.patch('requests.get') def test_get(self, mock_get): rc = RestClient(jwt='a-token', telemetry=False) diff --git a/auth0/v3/test/management/test_roles.py b/auth0/v3/test/management/test_roles.py index 76ccec1c..2742a08c 100644 --- a/auth0/v3/test/management/test_roles.py +++ b/auth0/v3/test/management/test_roles.py @@ -5,6 +5,12 @@ class TestRoles(unittest.TestCase): + def test_init_with_optionals(self): + t = Roles(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.roles.RestClient') def test_list(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_rules.py b/auth0/v3/test/management/test_rules.py index d57da953..2db78137 100644 --- a/auth0/v3/test/management/test_rules.py +++ b/auth0/v3/test/management/test_rules.py @@ -5,6 +5,12 @@ class TestRules(unittest.TestCase): + def test_init_with_optionals(self): + t = Rules(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.rules.RestClient') def test_all(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_rules_configs.py b/auth0/v3/test/management/test_rules_configs.py index d3c41e5b..9e6babfd 100644 --- a/auth0/v3/test/management/test_rules_configs.py +++ b/auth0/v3/test/management/test_rules_configs.py @@ -3,7 +3,13 @@ from ...management.rules_configs import RulesConfigs -class TestRules(unittest.TestCase): +class TestRulesConfigs(unittest.TestCase): + + def test_init_with_optionals(self): + t = RulesConfigs(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) @mock.patch('auth0.v3.management.rules_configs.RestClient') def test_all(self, mock_rc): diff --git a/auth0/v3/test/management/test_stats.py b/auth0/v3/test/management/test_stats.py index d7db82ee..91f94613 100644 --- a/auth0/v3/test/management/test_stats.py +++ b/auth0/v3/test/management/test_stats.py @@ -3,7 +3,13 @@ from ...management.stats import Stats -class TestTickets(unittest.TestCase): +class TestStats(unittest.TestCase): + + def test_init_with_optionals(self): + t = Stats(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) @mock.patch('auth0.v3.management.stats.RestClient') def test_active_users(self, mock_rc): diff --git a/auth0/v3/test/management/test_tenants.py b/auth0/v3/test/management/test_tenants.py index 37ac552a..0838c056 100644 --- a/auth0/v3/test/management/test_tenants.py +++ b/auth0/v3/test/management/test_tenants.py @@ -5,6 +5,12 @@ class TestTenants(unittest.TestCase): + def test_init_with_optionals(self): + t = Tenants(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.tenants.RestClient') def test_get(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_tickets.py b/auth0/v3/test/management/test_tickets.py index eb0b75f9..3bbd2e5d 100644 --- a/auth0/v3/test/management/test_tickets.py +++ b/auth0/v3/test/management/test_tickets.py @@ -5,6 +5,12 @@ class TestTickets(unittest.TestCase): + def test_init_with_optionals(self): + t = Tickets(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.tickets.RestClient') def test_email(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_user_blocks.py b/auth0/v3/test/management/test_user_blocks.py index ec096d5a..c240c046 100644 --- a/auth0/v3/test/management/test_user_blocks.py +++ b/auth0/v3/test/management/test_user_blocks.py @@ -5,6 +5,12 @@ class TestUserBlocks(unittest.TestCase): + def test_init_with_optionals(self): + t = UserBlocks(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.user_blocks.RestClient') def test_get_by_identifier(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_users.py b/auth0/v3/test/management/test_users.py index b3908c1c..fc9bc104 100644 --- a/auth0/v3/test/management/test_users.py +++ b/auth0/v3/test/management/test_users.py @@ -5,6 +5,12 @@ class TestUsers(unittest.TestCase): + def test_init_with_optionals(self): + t = Users(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.users.RestClient') def test_list(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_users_by_email.py b/auth0/v3/test/management/test_users_by_email.py index 2c6e9af3..3d947f0f 100644 --- a/auth0/v3/test/management/test_users_by_email.py +++ b/auth0/v3/test/management/test_users_by_email.py @@ -5,6 +5,12 @@ class TestUsersByEmail(unittest.TestCase): + def test_init_with_optionals(self): + t = UsersByEmail(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + @mock.patch('auth0.v3.management.users_by_email.RestClient') def test_search_users_by_email(self, mock_rc): mock_instance = mock_rc.return_value From e35d645589c7940755b4f1ab058d271f6250cad3 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 7 May 2020 21:00:03 -0300 Subject: [PATCH 073/663] use different url --- auth0/v3/test/authentication/test_base.py | 4 ++-- auth0/v3/test/management/test_rest.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/auth0/v3/test/authentication/test_base.py b/auth0/v3/test/authentication/test_base.py index 1d495ac6..b2426a17 100644 --- a/auth0/v3/test/authentication/test_base.py +++ b/auth0/v3/test/authentication/test_base.py @@ -228,10 +228,10 @@ def test_get_can_timeout(self): ab = AuthenticationBase('auth0.com', timeout=0.00001) with self.assertRaises(requests.exceptions.Timeout): - ab.get('https://auth0.com', params={'a': 'b'}, headers={'c': 'd'}) + ab.get('https://google.com', params={'a': 'b'}, headers={'c': 'd'}) def test_post_can_timeout(self): ab = AuthenticationBase('auth0.com', timeout=0.00001) with self.assertRaises(requests.exceptions.Timeout): - ab.post('https://auth0.com', data={'a': 'b'}, headers={'c': 'd'}) + ab.post('https://google.com', data={'a': 'b'}, headers={'c': 'd'}) diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index 717657d3..4d3ac5b9 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -16,31 +16,31 @@ def test_get_can_timeout(self): rc = RestClient(jwt='a-token', telemetry=False, timeout=0.00001) with self.assertRaises(requests.exceptions.Timeout): - rc.get('http://auth0.com') + rc.get('http://google.com') def test_post_can_timeout(self): rc = RestClient(jwt='a-token', telemetry=False, timeout=0.00001) with self.assertRaises(requests.exceptions.Timeout): - rc.post('http://auth0.com') + rc.post('http://google.com') def test_put_can_timeout(self): rc = RestClient(jwt='a-token', telemetry=False, timeout=0.00001) with self.assertRaises(requests.exceptions.Timeout): - rc.put('http://auth0.com') + rc.put('http://google.com') def test_patch_can_timeout(self): rc = RestClient(jwt='a-token', telemetry=False, timeout=0.00001) with self.assertRaises(requests.exceptions.Timeout): - rc.patch('http://auth0.com') + rc.patch('http://google.com') def test_delete_can_timeout(self): rc = RestClient(jwt='a-token', telemetry=False, timeout=0.00001) with self.assertRaises(requests.exceptions.Timeout): - rc.delete('http://auth0.com') + rc.delete('http://google.com') @mock.patch('requests.get') def test_get_custom_timeout(self, mock_get): From a89219d2b1ac7afe7c972b13e3b39c431403e000 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 22 Apr 2020 20:12:24 -0300 Subject: [PATCH 074/663] add token verifier logic --- auth0/v3/authentication/token_verifier.py | 129 ++++++++++++++++++++++ requirements.txt | 1 + 2 files changed, 130 insertions(+) create mode 100644 auth0/v3/authentication/token_verifier.py diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py new file mode 100644 index 00000000..04bfafc4 --- /dev/null +++ b/auth0/v3/authentication/token_verifier.py @@ -0,0 +1,129 @@ +from ..exceptions import Auth0Error +import jwt +import time + +# TODO: Have a custom exception class +TOKEN_VERIFIER_ERROR = 'a0.sdk.internal.token_verification' + +class SignatureVerifier(): + + def __init__(self, algorithm): + if (algorithm not in ['HS256', 'RS256'] or type(algorithm) != str): + raise """Invalid algorithm! Supported values are: "HS256" and "RS256".""" + self.algorithm = algorithm + + def verifySignature(self, token): + try: + #TODO: Make this take the algorithm from self and fetch the keys + decoded = jwt.decode(jwt=token, secret='secret', algorithm="HS256" ) + except jwt.exceptions.InvalidSignatureError: + raise Exception("Invalid token signature.") + except jwt.exceptions.DecodeError: + raise Exception("Failed to decode the token.") + return decoded + + +class TokenVerifier(): + + def __init__(self, signatureVerifier, issuer, audience, leeway=60, _clock=None): + if (not signatureVerifier or type(signatureVerifier) is not SignatureVerifier): + raise Exception("Signature verified not specified.") + if (not issuer or type(issuer) != str): + raise Exception("Issuer not specified.") + if (not audience or type(audience) != str): + raise Exception("Audience not specified.") + if (type(leeway) != int): + raise Exception("Invalid leeway value.") + + self.options = { + 'signatureVerifier': signatureVerifier, + 'iss': issuer, + 'aud': audience, + 'leeway': leeway, + '_clock': _clock + } + + def verify(self, token, nonce=None, maxAge=-1): + #Verify token presence + if (not token or type(token) != str): + raise Exception("ID token is required but missing.") + if (nonce and type(nonce) != str): + raise Exception("Nonce not specified.") + if (maxAge and type(maxAge) != int): + raise Exception("Max Age not specified.") + + opt = self.options.copy() + opt['nonce'] = nonce + opt['maxAge'] = maxAge + + #Verify algorithm and signature + payload = opt.signatureVerifier.verifySignature(token) + + #Verify claims + ##Issuer + + if (not payload.iss or type(payload.iss) != str): + raise Exception('Issuer (iss) claim must be a string present in the ID token') + if (payload.iss != opt.iss): + raise Exception('Issuer (iss) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt.iss, payload.iss)) + + ##Subject + if (not payload.sub or type(payload.sub) != str): + raise Exception('Subject (sub) claim must be a string present in the ID token') + + + ##Audience + if (not payload.aud or not (type(payload.aud) == str or type(payload.aud) is list)): + raise Exception('Audience (aud) claim must be a string or array of strings present in the ID token') + + if (type(payload.aud) is list and not payload.aud.includes(opt.audience)): + payloadAudiences = ", ".join(payload.aud) + raise Exception('Audience (aud) claim mismatch in the ID token; expected "{}" but was not one of "{}"'.format(opt.aud, payloadAudiences)) + elif (type(payload.aud) == str and payload.aud != opt.aud): + raise Exception('Audience (aud) claim mismatch in the ID token; expected "{}" but found "{}"'.format(opt.aud, payload.aud)) + + ##--Time validation (epoch)-- + now = opt._clock or time.time() + leeway = opt.leeway + + ##Expires at + if (not payload.exp or type(payload.exp) != int): + raise Exception('Expiration Time (exp) claim must be a number present in the ID token') + + expTime = payload.exp + leeway + if (now > expTime): + raise Exception('Expiration Time (exp) claim error in the ID token; current time ({}) is after expiration time ({})'.format(now, expTime)) + + ##Issued at + if (not payload.iat or type(payload.iat) != int): + raise Exception('Issued At (iat) claim must be a number present in the ID token') + + iatTime = payload.iat - leeway + if (now < iatTime): + raise Exception('Issued At (iat) claim error in the ID token; current time ({}) is before issued at time ({})'.format(now, iatTime)) + + ##Nonce + if (opt.nonce): + if (not payload.nonce or type(payload.nonce) != str): + raise Exception('Nonce (nonce) claim must be a string present in the ID token') + if (payload.nonce != opt.nonce): + raise Exception('Nonce (nonce) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt.nonce, payload.nonce)) + + ##Authorized party + if (type(payload.aud) is list and payload.aud.length > 1): + if (not payload.azp or type(payload.azp) != str): + raise Exception('Authorized Party (azp) claim must be a string present in the ID token when Audience (aud) claim has multiple values') + if (payload.azp != opt.audience): + raise Exception('Authorized Party (azp) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt.aud, payload.azp)) + + ##Authentication time + if (opt.maxAge): + if (not payload.auth_time or type(payload.auth_time) != int): + raise Exception('Authentication Time (auth_time) claim must be a number present in the ID token when Max Age (max_age) is specified') + + authValidUntil = payload.auth_time + opt.maxAge + leeway + if (now > authValidUntil): + raise Exception('Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Currrent time ({}) is after last auth at ({})'.format(now, authValidUntil)) + + + diff --git a/requirements.txt b/requirements.txt index 7131eefc..2396e9ae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ requests>=2.14.0 mock==1.3.0 pre-commit +pyjwt[crypto]>=1.7.1 \ No newline at end of file From fd74ce333b61abd283a916d3fdf4cb52c9ddd4c8 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 27 Apr 2020 19:44:30 -0300 Subject: [PATCH 075/663] fix python syntax --- auth0/v3/authentication/token_verifier.py | 114 ++++++++++++++-------- 1 file changed, 73 insertions(+), 41 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index 04bfafc4..198bde69 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -7,26 +7,52 @@ class SignatureVerifier(): - def __init__(self, algorithm): + def __init__(self, algorithm, secret=None, certificate=None): if (algorithm not in ['HS256', 'RS256'] or type(algorithm) != str): - raise """Invalid algorithm! Supported values are: "HS256" and "RS256".""" + # This checks that it was set up correctly + raise 'Signature algorithm of "%{}" is not supported. Expected the ID token to be signed with "%{}"'.format(algorithm, "RS256") self.algorithm = algorithm + self.secret = secret + self.certificate = certificate def verifySignature(self, token): + disabledClaimsCheck = { + "verify_signature": True, + "verify_exp": False, + "verify_nbf": False, + "verify_iat": False, + "verify_aud": False, + "verify_iss": False, + "require_exp": False, + "require_iat": False, + "require_nbf": False, + } try: #TODO: Make this take the algorithm from self and fetch the keys - decoded = jwt.decode(jwt=token, secret='secret', algorithm="HS256" ) + decoded = jwt.decode(jwt=token, key=self.certificate or self.secret, algorithms=[self.algorithm], options=disabledClaimsCheck) except jwt.exceptions.InvalidSignatureError: raise Exception("Invalid token signature.") except jwt.exceptions.DecodeError: - raise Exception("Failed to decode the token.") + raise Exception("ID token could not be decoded.") + except jwt.exceptions.InvalidAlgorithmError: + # This is raised when the token's algorithm is not one of the expected + raise Exception('Signature algorithm of "{}" is not supported. Expected the ID token to be signed with "{}"'.format(self.algorithm, "RS256")) return decoded - + + # def _getSecretOrCertificate(self, token): + # if (self.options.client_secret and self.algorithm == 'HS256'): + # return self.options.client_secret + # if (self.algorithm == 'RS256'): + # _fetchPublicKey(self.options.issuer) + + # key = 'secret' + # header = jwt.get_unverified_header(encoded) + class TokenVerifier(): - - def __init__(self, signatureVerifier, issuer, audience, leeway=60, _clock=None): - if (not signatureVerifier or type(signatureVerifier) is not SignatureVerifier): + + def __init__(self, signatureVerifier, issuer, audience, leeway=0, _clock=None): + if (not signatureVerifier or type(signatureVerifier) is not SignatureVerifier): raise Exception("Signature verified not specified.") if (not issuer or type(issuer) != str): raise Exception("Issuer not specified.") @@ -44,7 +70,7 @@ def __init__(self, signatureVerifier, issuer, audience, leeway=60, _clock=None): } def verify(self, token, nonce=None, maxAge=-1): - #Verify token presence + # Verify token presence if (not token or type(token) != str): raise Exception("ID token is required but missing.") if (nonce and type(nonce) != str): @@ -55,75 +81,81 @@ def verify(self, token, nonce=None, maxAge=-1): opt = self.options.copy() opt['nonce'] = nonce opt['maxAge'] = maxAge - - #Verify algorithm and signature - payload = opt.signatureVerifier.verifySignature(token) + + # Verify algorithm and signature + payload = opt['signatureVerifier'].verifySignature(token) #Verify claims ##Issuer - if (not payload.iss or type(payload.iss) != str): + if ('iss' not in payload or type(payload['iss']) != str): raise Exception('Issuer (iss) claim must be a string present in the ID token') - if (payload.iss != opt.iss): - raise Exception('Issuer (iss) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt.iss, payload.iss)) + if (payload['iss'] != opt['iss']): + raise Exception('Issuer (iss) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['iss'], payload['iss'])) ##Subject - if (not payload.sub or type(payload.sub) != str): + if ('sub' not in payload or type(payload['sub']) != str): raise Exception('Subject (sub) claim must be a string present in the ID token') ##Audience - if (not payload.aud or not (type(payload.aud) == str or type(payload.aud) is list)): + if ('aud' not in payload or not (type(payload['aud']) == str or type(payload['aud']) is list)): raise Exception('Audience (aud) claim must be a string or array of strings present in the ID token') - if (type(payload.aud) is list and not payload.aud.includes(opt.audience)): - payloadAudiences = ", ".join(payload.aud) - raise Exception('Audience (aud) claim mismatch in the ID token; expected "{}" but was not one of "{}"'.format(opt.aud, payloadAudiences)) - elif (type(payload.aud) == str and payload.aud != opt.aud): - raise Exception('Audience (aud) claim mismatch in the ID token; expected "{}" but found "{}"'.format(opt.aud, payload.aud)) + if (type(payload['aud']) is list and not opt['aud'] in payload['aud']): + payloadAudiences = ", ".join(payload['aud']) + raise Exception('Audience (aud) claim mismatch in the ID token; expected "{}" but was not one of "{}"'.format(opt['aud'], payloadAudiences)) + elif (type(payload['aud']) == str and payload['aud'] != opt['aud']): + raise Exception('Audience (aud) claim mismatch in the ID token; expected "{}" but found "{}"'.format(opt['aud'], payload['aud'])) ##--Time validation (epoch)-- - now = opt._clock or time.time() - leeway = opt.leeway + realClock = time.time() + now = opt['_clock'] or time.time() + print("Real clock: {}".format(realClock)) + print("Using now: {}".format(now)) + leeway = opt['leeway'] + print("Leeway: {}".format(leeway)) ##Expires at - if (not payload.exp or type(payload.exp) != int): + if ('exp' not in payload or type(payload['exp']) != int): raise Exception('Expiration Time (exp) claim must be a number present in the ID token') - expTime = payload.exp + leeway + expTime = payload['exp'] + leeway if (now > expTime): raise Exception('Expiration Time (exp) claim error in the ID token; current time ({}) is after expiration time ({})'.format(now, expTime)) ##Issued at - if (not payload.iat or type(payload.iat) != int): + if ('iat' not in payload or type(payload['iat']) != int): raise Exception('Issued At (iat) claim must be a number present in the ID token') - iatTime = payload.iat - leeway + iatTime = payload['iat'] - leeway + print("Found iat+leeway: {}".format(iatTime)) + print("now - iat claim: {}".format(now - iatTime)) if (now < iatTime): raise Exception('Issued At (iat) claim error in the ID token; current time ({}) is before issued at time ({})'.format(now, iatTime)) ##Nonce - if (opt.nonce): - if (not payload.nonce or type(payload.nonce) != str): + if ( 'nonce' in opt and opt['nonce']): + if ('nonce' not in payload or type(payload['nonce']) != str): raise Exception('Nonce (nonce) claim must be a string present in the ID token') - if (payload.nonce != opt.nonce): - raise Exception('Nonce (nonce) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt.nonce, payload.nonce)) + if (payload['nonce'] != opt['nonce']): + raise Exception('Nonce (nonce) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['nonce'], payload['nonce'])) ##Authorized party - if (type(payload.aud) is list and payload.aud.length > 1): - if (not payload.azp or type(payload.azp) != str): + if (type(payload['aud']) is list and len(payload['aud']) > 1): + if ('azp' not in payload or type(payload['azp']) != str): raise Exception('Authorized Party (azp) claim must be a string present in the ID token when Audience (aud) claim has multiple values') - if (payload.azp != opt.audience): - raise Exception('Authorized Party (azp) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt.aud, payload.azp)) + if (payload['azp'] != opt['aud']): + raise Exception('Authorized Party (azp) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['aud'], payload['azp'])) ##Authentication time - if (opt.maxAge): - if (not payload.auth_time or type(payload.auth_time) != int): + if ('maxAge' in opt and opt['maxAge']): + if ('auth_time' not in payload or type(payload['auth_time']) != int): raise Exception('Authentication Time (auth_time) claim must be a number present in the ID token when Max Age (max_age) is specified') - authValidUntil = payload.auth_time + opt.maxAge + leeway + authValidUntil = payload['auth_time'] + opt['maxAge'] + leeway if (now > authValidUntil): - raise Exception('Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Currrent time ({}) is after last auth at ({})'.format(now, authValidUntil)) + raise Exception('Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time ({}) is after last auth at ({})'.format(now, authValidUntil)) + - From 8939138f9ac5ded5bcddecac7209f2ca39869a69 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 27 Apr 2020 19:44:43 -0300 Subject: [PATCH 076/663] add tests for most cases --- .../authentication/test_token_verifier.py | 167 ++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 auth0/v3/test/authentication/test_token_verifier.py diff --git a/auth0/v3/test/authentication/test_token_verifier.py b/auth0/v3/test/authentication/test_token_verifier.py new file mode 100644 index 00000000..6387c020 --- /dev/null +++ b/auth0/v3/test/authentication/test_token_verifier.py @@ -0,0 +1,167 @@ +import unittest +from ...authentication.token_verifier import TokenVerifier, SignatureVerifier + +expectations = { + "audience": "tokens-test-123", + "audience_alt": "external-test-999", + "issuer": "https://tokens-test.auth0.com/", + "nonce": "a1b2c3d4e5" +} + +HMAC_SHARED_SECRET = "secret" +RSA_PUBLIC_KEY = b"""-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGbXWiK3dQTyCbX5xdE4\nyCuYp0AF2d15Qq1JSXT/lx8CEcXb9RbDddl8jGDv+spi5qPa8qEHiK7FwV2KpRE9\n83wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVs\nWXI9C+yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT\n69s7of9+I9l5lsJ9cozf1rxrXX4V1u/SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8\nAziMCxS+VrRPDM+zfvpIJg3JljAh3PJHDiLu902v9w+Iplu1WyoB2aPfitxEhRN0\nYwIDAQAB\n-----END PUBLIC KEY-----""" +TOKEN_ISSUER = "https://tokens-test.auth0.com/" +TOKEN_AUDIENCE = "tokens-test-123" +MOCKED_CLOCK = 1587592561 #Apr 22 2020 21:56:01 UTC +DEFAULT_LEEWAY = 60 + + +# Run with: python -m unittest discover -s auth0 -p 'test_token_*' +class TestBase(unittest.TestCase): + + def assert_fails_with_error(self, token, error_message, signature_verifier=None, audience=TOKEN_AUDIENCE, issuer=TOKEN_ISSUER, nonce=None, max_age=None, _clock=MOCKED_CLOCK): + sv = signature_verifier or SignatureVerifier(algorithm="RS256", certificate=RSA_PUBLIC_KEY) + tv = TokenVerifier( + signatureVerifier=sv, + issuer=issuer, + audience=audience, + leeway=DEFAULT_LEEWAY, + _clock=_clock + ) + with self.assertRaises(Exception) as err: + tv.verify(token, nonce, max_age) + self.assertEqual(str(err.exception), error_message) + + def test_err_token_empty(self): + token = "" + self.assert_fails_with_error(token, "ID token is required but missing.") + token = None + self.assert_fails_with_error(token, "ID token is required but missing.") + + def test_err_token_format_invalid(self): + token = "a.b" + self.assert_fails_with_error(token, "ID token could not be decoded.") + token = "a.b." + self.assert_fails_with_error(token, "ID token could not be decoded.") + token = "a.b.c.d" + self.assert_fails_with_error(token, "ID token could not be decoded.") + + def test_HS256_token_signature_passes(self): + token = "eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.Hn38QVtN_mWN0c-jOa-Fqq69kXpbBp0THsvE-CQ47Ps" + + sv = SignatureVerifier(algorithm="HS256", secret=HMAC_SHARED_SECRET) + tv = TokenVerifier( + signatureVerifier=sv, + issuer=TOKEN_ISSUER, + audience=TOKEN_AUDIENCE, + _clock=MOCKED_CLOCK) + tv.verify(token) + + def test_RS256_token_signature_passes(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.Eo2jxdlrKmutIeyn9Un6VHorMJaCL5txPDCC3QiAQn0pYYnrRU7VMQwqbTiXLQ9zPYh5Q4pQmT-XRaGL-HwDH8vCUieVJKOm0-gNFAMzx1i8sRH1ubw75sn69y09AQKcitYtjnBmahgfZrswtsxOXM7XovlLftPjv6goAi_U38GYsS_V_zOBvdbX2cM5zdooJAC0e7vlCr3bXNo90qwgCuezvCGt1ZrgWyDNO9oMzK-TlK86q36LuIkux7XZboF5rc3zsThEce_tPufA5qoEa-7I_ybmjwlvOCWmngYLT52_S2CbHeRNarePMjZIlmAuG-DcetwO8jJsX84Ra0SdUw" + + sv = SignatureVerifier(algorithm="RS256", certificate=RSA_PUBLIC_KEY) + tv = TokenVerifier( + signatureVerifier=sv, + issuer=TOKEN_ISSUER, + audience=TOKEN_AUDIENCE, + _clock=MOCKED_CLOCK) + tv.verify(token) + + def test_HS256_token_signature_fails(self): + token = "eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.invalidsignature" + sv = SignatureVerifier(algorithm="HS256", secret=HMAC_SHARED_SECRET) + + self.assert_fails_with_error(token, "Invalid token signature.", signature_verifier=sv) + + def test_RS256_token_signature_fails(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.invalidsignature" + sv = SignatureVerifier(algorithm="RS256", certificate=RSA_PUBLIC_KEY) + + self.assert_fails_with_error(token, "Invalid token signature.", signature_verifier=sv) + + # def test_fails_with_algorithm_not_supported(self): + # FIXME + # token = "eyJhbGciOiJub25lIn0.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0." + # self.assert_fails_with_error(token, 'Signature algorithm of "none" is not supported. Expected the ID token to be signed with "HS256"') + # return + + def test_fails_with_iss_missing(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.XuWmo_XxNET0mOW1AaLwi8koUOd05TZULWCGF_3WbeR5VJB6aK0rzo8AkHXrSv9Yr6he_1N8xFDKBIIyXFa4Y2PN8kdwUQtsJcj-cj8_2Ta2S0vV6O7XqbW58eXhX8Ng0OUrqgkHT1leIUJnBZ10YhM0-0zmdIq_WlNnwTdmvAGtYAUGcjyUmq-QEKBc2YYnf83vtGuFT2xGUGsTKR_Jj7lH_QTYdFaiT4t7gwFyXhP5KVUkG3ebdQUkIAQnoY0TXwrgDDCQhAWiUYZehMlv7Ml4tqLsiIUMgm4w5wSfdTdhVEMa7wHPj7gp4s-bfEqaOuyg0xH24rP19LkJROITDw" + self.assert_fails_with_error(token, 'Issuer (iss) claim must be a string present in the ID token') + + def test_fails_with_iss_invalid(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJzb21ldGhpbmctZWxzZSIsInN1YiI6ImF1dGgwfDEyMzQ1Njc4OSIsImF1ZCI6WyJ0b2tlbnMtdGVzdC0xMjMiLCJleHRlcm5hbC10ZXN0LTk5OSJdLCJleHAiOjE1ODc3NjUzNjEsImlhdCI6MTU4NzU5MjU2MSwibm9uY2UiOiJhMWIyYzNkNGU1IiwiYXpwIjoidG9rZW5zLXRlc3QtMTIzIiwiYXV0aF90aW1lIjoxNTg3Njc4OTYxfQ.HNQ1lXWWQOC4D1-D4XfYlF2MBE6F7TW1EoBqt3ayxehNqtc8ZUJ6MR4aE_o7NnY0aBNbp7J9okgRC2PIKPHZkXUdxHvGZNldrEDDKeKPe0kZFxF5sEK8RYCnJk5m28JFpgRYvXA9KjKnLsBsbV--8VnkgRlw0-LClxqp3ynoGgmh2dVvBqXV8DiAbRvvRPZOg7CVFqCxJoMFD0FJ_dej7ChxMDSe_NDW-CjG9rgEsw_el-_vUcKSp7bzZ1jKm0zOcPDRPfgda5oek0xR6_bg2es_TarYKCwlQCVG1NEmgcJ5gNeVIsrwaPrMXqGr9KNs-nLerQO9Jl1EhCU8No5Sfg" + self.assert_fails_with_error(token, 'Issuer (iss) claim mismatch in the ID token; expected "{}", found "something-else"'.format(expectations['issuer'])) + + def test_fails_with_sub_missing(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.VtPtxkKh7vZKECzFiNXLWBeWcRgaX1lIOhW0fKU5WSgTcjYZRYoxW-wwI8pai7vgJMQQCizBpLpjMPpCBYBGEiYgGpa9D7vAD8XmYjcVZujG1FLFGkOTkgisCtgVT6WpvwxIejNrl_TcgSEBkCcD9f7gGnFVOjJe4YtSMEUdtuDz-pHEGGNbJLdq0L-pPUrO2Fyw3NspX1RrEYVn7uGuAlDQWQ4x6IOtM40NPzAmyLVrsOPmz_5Igyi7ZZar6epcfd5dBeUbgp8yK178XV-r6-UMuj39NJE4Bx8cDQR1qjxMsxgZ3Lem6OLfFvKWXsgJs7dh13kJDqrx2jXfhvpd-w" + self.assert_fails_with_error(token, 'Subject (sub) claim must be a string present in the ID token') + + def test_fails_with_aud_missing(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJleHAiOjE1ODc3NjUzNjEsImlhdCI6MTU4NzU5MjU2MSwibm9uY2UiOiJhMWIyYzNkNGU1IiwiYXpwIjoidG9rZW5zLXRlc3QtMTIzIiwiYXV0aF90aW1lIjoxNTg3Njc4OTYxfQ.t5SBd_J-k_GwPHfyGfPxOcT8n0Pbwy9R-pj7tK8231m3My1Zg3LyKx3tl7MFtymgRHcs2hd4WrWrKjyFrHMOzUWX8dQ2-b6KVRuFQjc70gnW54igj-cT-oo07Lzen0Ol6_7w_5rabWCOL9lM0UM9jpau_llVh97zyYgcUEBeA5lLld5ZLTB-JKMVehjJelBR-MPEDvMr2zT9nRPPUXqezAWZOPYG83oRRB2ktoafaUM4RVvp34q6uUWJq49m-qY2DfKuyDGK4axo1fHKE3JmrsayEDpuGDYDFNDQzy4g1lJvzBKxV2SJl0LKP6sxbM8sw7qaH4ViRNZpFQBZ7veGPQ" + self.assert_fails_with_error(token, 'Audience (aud) claim must be a string or array of strings present in the ID token') + + def test_fails_with_aud_invalid(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.d1BFaw_h5VOAw0tXAQ98hrru4gWCNjIxcCQktFVcLIqrX9m74-vWv2SVoFBAQlXihEXoDS-5QSMhVPG1iry9arseN16PnSOmilBhSebiqAVSBojLxq5KFEDuUz90lApt4d5BSCMAIAQ1Dp1pGKwJC0BiLrFNOQ2KrmoEvQMgaD0PLlCLy1lL7MntABE86tX_BoqI4ZkWJ1lX1n2-SZAn-ldoOK8W8RUYiwBUDTktpgAfICFUSPAZXj_vn05vwvQBoozhMQkuJrPziz81Tj8lPh0iPsnMBtsAqvAhdwtp3p-eadXPVcjNu4yE3dkBgFDQwoNtV_elWQtmFBn49FEKyw" + self.assert_fails_with_error(token, 'Audience (aud) claim mismatch in the ID token; expected "{}" but was not one of "external-test-999"'.format(expectations['audience'])) + + def test_fails_with_exp_missing(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiaWF0IjoxNTg3NTkyNTYxLCJub25jZSI6ImExYjJjM2Q0ZTUiLCJhenAiOiJ0b2tlbnMtdGVzdC0xMjMiLCJhdXRoX3RpbWUiOjE1ODc2Nzg5NjF9.qq4Tyz8VGnAJy2KmKo3zmThnWXviGwJB-Bz18lnJlicjAXk4ObeUVoX0WHB3I8vmDMscC9JXhkDP5KIGSAkeaLzil0FFJwwQB_saFE_y3zjfMQgdsz_qtDR96S1SQtnZ7AhChIAZ7cV4p_wmj_-TQYuZVQ0F6MoBmFsJITIr7gxnNFJWw6KJEU94nq8-q_IAyC5-9epdEtphUi_wkalHzEy6w8tQawKXCLYxo12VNlEy5mi8PlwqGsqVcwFwqec-ERt2hajyuqL1210-cZJMA-NmXz4mv4scHdiE09KZcLScKcezs9KaM5iaButMBL0Fyec0KcwwfELX_zghekALOA" + self.assert_fails_with_error(token, 'Expiration Time (exp) claim must be a number present in the ID token') + + def test_fails_with_exp_invalid(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NTkyNTYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.KUbd2s3Km-PVpP8KEJo1e0lyQv19TjiKMFX-lVebFoiPNwlVTXS08g5qe_G8pcOrwNfX6cRkRLbp7TNQ7tGDCuEcdia9KOaWeVWla5B3UPCv1qozCyMv4ZYrA0qdT2KgwytRMVWSov9ly29FSo6SRQksAMKZdnAzPaqnJGKBgVIjKN3a5ePIeX5yBIGxlNjS3nyWt8LIQJ9BFaQWk3i0vAKYpDeco3VLNLX-wH7739MzS7ll6t6LyuZi6kBaRG6XZc394glKidTvCp06ViQlPlcuV7JsCJfbkBc0AS5TmzOEdUCype-gzNqbuLcSXihS-qOx7Yjv8y3farV1_7qYqw" + mocked_clock = MOCKED_CLOCK + DEFAULT_LEEWAY + 1 + self.assert_fails_with_error(token, 'Expiration Time (exp) claim error in the ID token; current time ({}) is after expiration time (1587592621)'.format(mocked_clock), _clock=mocked_clock) + + def test_fails_with_iat_missing(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJub25jZSI6ImExYjJjM2Q0ZTUiLCJhenAiOiJ0b2tlbnMtdGVzdC0xMjMiLCJhdXRoX3RpbWUiOjE1ODc2Nzg5NjF9.CWW7mWUhiI-rramQ2dIGi7vBsOMmsouIg32IL9u2g4Dg3PV0C55R7dL6Jvf9hqaZXvx9Psrw0vLnOlhFztAC6LlQuq2eCaLYsDme36NxeYGC7CFXygvlU_eXD5IdNK35GriTfpG_b5hC7tl2glMmNQcZWlsIyKw7eq8o1POpqo0K2bCVjoyJkHL6WUpw6_08HPspmTL_Qd0km08z6zgvbl8Hpzk-tLmXqN7LjmuhEsjnIFphu-dGwcQsoY3RAomYxAFXAPYT8siEIf2w3zlIoUde-mujiMUtMD-Od7t7w36GO6Kubb9M9inVwPEg1yFKlFTXZBKXu91xmOmvMJ5Qfg" + self.assert_fails_with_error(token, 'Issued At (iat) claim must be a number present in the ID token') + + def test_fails_with_iat_invalid(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc3NjUzNjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.hVFs3ix49ZIrUCr9EM4CrjYvwxemsHOqhZdjzOmy9suQOe8xG0NzEdlRcxuCt8Exdqrrd2lu4iPFqUgwudjMFZT5f-1YE9AdvLqqDyBRVRPu2dV5SP4QbO4OAjMvNq-yfoRQ4kEuIfBnz56l6imB-tNgfbSveOzHzTPapE6vSlVnI03jlDR91qoEpda1XCXreKhar4lsTNBsuAP6mA313DHaErvyhoBlsq3lEh7vXafFlegl5DMuEmNmzgAO3JO-mpn0J2nBfZOvUQIkf9ITs09zYrxE0fZ3M6J7tIhd13UvaJuNDXbfX1zzyhjAHqgmlkd25o2IZIBVC51NQv483g" + mocked_clock = MOCKED_CLOCK - DEFAULT_LEEWAY - 1 + self.assert_fails_with_error(token, + 'Issued At (iat) claim error in the ID token; current time ({}) is before issued at time (1587765301)'.format( + mocked_clock), _clock=mocked_clock) + + def test_passes_when_nonce_missing_but_not_required(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.L-DveLCDf4Te7x3JZmQ6rCkUQrenl1NFpHqKD8Fs-glhd2iyc-TYffk1M30T0-wBri-3tTgraDAjZAjXuwSk0gV_V5uKCHyIoSRphrC88aX8IeECteQpHa4KR15lbzA5JdVhJu7LuCZ2EFvdjHh5GiViLRWsTSHGUM-uqcMK0q2kWGvCEgfOIXqocnQiyCNITxfgMYJd38zOsVeP7HFf9riuFEQz65oER22o3xyIZ-ILSaU10n6Ob559Rbjc0NVKH4hrggRg8kG7cJCiXbRxXnzO_VM8LmRHhF56jh3ZSrO4bzQa5xv04bMbX6A77muMZD0vghsaslvpWerWbwaSQQ" + + sv = SignatureVerifier(algorithm="RS256", certificate=RSA_PUBLIC_KEY) + tv = TokenVerifier( + signatureVerifier=sv, + issuer=TOKEN_ISSUER, + audience=TOKEN_AUDIENCE, + _clock=MOCKED_CLOCK) + tv.verify(token) + + def test_fails_with_nonce_missing(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.L-DveLCDf4Te7x3JZmQ6rCkUQrenl1NFpHqKD8Fs-glhd2iyc-TYffk1M30T0-wBri-3tTgraDAjZAjXuwSk0gV_V5uKCHyIoSRphrC88aX8IeECteQpHa4KR15lbzA5JdVhJu7LuCZ2EFvdjHh5GiViLRWsTSHGUM-uqcMK0q2kWGvCEgfOIXqocnQiyCNITxfgMYJd38zOsVeP7HFf9riuFEQz65oER22o3xyIZ-ILSaU10n6Ob559Rbjc0NVKH4hrggRg8kG7cJCiXbRxXnzO_VM8LmRHhF56jh3ZSrO4bzQa5xv04bMbX6A77muMZD0vghsaslvpWerWbwaSQQ" + self.assert_fails_with_error(token, 'Nonce (nonce) claim must be a string present in the ID token', nonce=expectations['nonce']) + + def test_fails_with_nonce_invalid(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiMDAwOTk5IiwiYXpwIjoidG9rZW5zLXRlc3QtMTIzIiwiYXV0aF90aW1lIjoxNTg3Njc4OTYxfQ.Z0n4vKcTCTrKJXUx56TyoQk3-okpjOqCDRN9NqH5zkCi0at7WV-E3TxGbXpIN0UsXwUWxrHiuvL9lN2M4PoIvL4XvzUqgsepAYYBCPGR9Wxb-ALmhhWdS_LNRVAgfUCn94khc_G51XtyeP0bQgWRkV7VbeWxkBTnrhmGwEkVx6XbfpnTRUCDSR_luJfUu84LkFJf1n2ohnEU7Q74BXJjxIIJnhZrg4J65E3cNtZ9N7AOIrbpbZ0oB7NhcZP0xA0A75qt7ZnKOuLsbRppZjcz56QmVIArOSCkkegl3qLx4cNdVa-O840AQWCwkAcHxS9lHBIWyaToC7IVMOLxIcGVlQ" + self.assert_fails_with_error(token, 'Nonce (nonce) claim mismatch in the ID token; expected "{}", found "000999"'.format(expectations['nonce']), nonce=expectations['nonce']) + + def test_fails_with_aud_array_and_azp_missing(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.Xpxc2tj3sDwAYftYAcoiLO3kq0X54KSngDzQu_foTjlDQFTPApVVrX_BQqMAUFsmiNdt-3Tf9lkUlAagpvXy_VUY5LIjzEihEKDzqQFMQ8wm7RK7qV2XLS1abltxXd8AuOHcPnVHbtERpsCXR5eRt0-ESSPUw_scqHOwmYQOFF0sOQJ72r9EYZFMGhojyzpbzhBF0jgi9wMqj0VSpLEzZ3MnkWBCTlmc5OAPXQGdq6C1dVfcBXy4iiIBEaPCG962Yqrr-bbL92_T_XG-FmtpIViuRjHDWRJ26uoD0cmXwePwojxlyeY7VrAoKX3VtA4lm1Co0BMh9DjMKv-p3zT6XA" + self.assert_fails_with_error(token, 'Authorized Party (azp) claim must be a string present in the ID token when Audience (aud) claim has multiple values') + + def test_fails_with_aud_array_and_azp_invalid(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6ImV4dGVybmFsLXRlc3QtOTk5IiwiYXV0aF90aW1lIjoxNTg3Njc4OTYxfQ.Bx56kdY8rBwlAZ8Walh6NjONs94Tdv37iP0EPKFxvpELFt_8RENhPp8Lqe52zrrgXqUdA1eeBynegqH7_duJawQ0l86u2dsaPonMOsh_W8ZjaqPOVHLv1z7xQb84UdjMSSJbMGMLPmuX2GMlc5hcjW5YgWU1xp-gpNpKMIzW19gNxpwtIWkLZ5zkjEVBYHSTAw7CO6HkncTZBqdYA3bq3ziQPljqvSvyPehuJ-2Q5TlrdVLRO5HS4-C6NEs-h8fpX25NP537FM9g7T7pRB1wDxsrJTny6uKBKFCwtNSF5laojV2edEDlDUsEEUCGh6zUzITGeZNa0M52ZsxGoAehIw" + self.assert_fails_with_error(token, + 'Authorized Party (azp) claim mismatch in the ID token; expected "{}", found "external-test-999"'.format(expectations['audience'])) + + def test_fails_when_max_age_sent_with_auth_time_missing(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyJ9.pWr6hjQ9Mi9cYSYIFWG1d-KJ98OeKeKb3F7X_DdUgQ5Xir8wHLLuZDrFAalKlxYiTJTMXqh9YkxKLcEjFQsTECEXA4VMliUv4A2Egk8EDUi5SQtoQ11xGJo-S7qM4cL-x-69ZnJvNWlZZ8NnvtTOSgzpa_fsG7T3PScr0b9ukxOQ-o8suV2fLE7bOliBKZn9PC7sowtF_oeQ03f0e0thtZFl121ROL65ARh9C-ic2azgmIn3YgsvguaoT5ZpAFRe2McaP026bNimOmfEzVIwHCDuR6rkFZvX4QUduX6UQ4bOQp_EC9G0XDk08H0nBXx2JXSHCW4YPZz9bz1f12B4kg" + self.assert_fails_with_error(token, "Authentication Time (auth_time) claim must be a number present in the ID token when Max Age (max_age) is specified", max_age=120) + + def test_fails_when_max_age_sent_with_auth_time_invalid(self): + token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzU5MjU2MX0.VcVv1cGthPtuHZAZa-x7XZjhrcKEV3xUW6rVfhNMM_zCRBxLdyJl6gVv396eyfMX5-3dhr0-9kAYQAjPrmcvUDFLOR4Qjamg83U-TMa4agnYwQ_Iv3u_zhYmSrKzZlQvbOhT5imZShL11hycyukv2D1ODbFpvCdsHWXUFF0LotiXrBRr45AoEie2bASNSMmCZbQh-_Pq7gdhKOZMhBTErrk-aEOZrmsUG0sL2ZcVLdZ0_U-23ysR2GVpNg8jyv1HLZaPw5IJC4XucRw5r-5UiIcIIdxbUNphamPgq1cqL3QP_UsCGotCIUQTDNMbXB7-J_opBM2uGFp-cW95-Wq7qg" + max_age = 120 + expected_auth_time = MOCKED_CLOCK + DEFAULT_LEEWAY + max_age + mocked_clock = expected_auth_time + 1 + + self.assert_fails_with_error(token, "Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time ({}) is after last auth at ({})".format(mocked_clock, expected_auth_time), max_age=max_age, _clock=mocked_clock) From 25d77b4d2e0e2398bdceff30b55c865d60a4b032 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 28 Apr 2020 17:47:41 -0300 Subject: [PATCH 077/663] add subclasses of SignatureVerifier and update tests --- auth0/v3/authentication/token_verifier.py | 95 ++++++++++++------- .../authentication/test_token_verifier.py | 25 ++--- 2 files changed, 73 insertions(+), 47 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index 198bde69..eec92fc3 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -1,3 +1,5 @@ +from abc import ABC + from ..exceptions import Auth0Error import jwt import time @@ -5,54 +7,77 @@ # TODO: Have a custom exception class TOKEN_VERIFIER_ERROR = 'a0.sdk.internal.token_verification' +RSA_PUBLIC_KEY = b"""-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGbXWiK3dQTyCbX5xdE4\nyCuYp0AF2d15Qq1JSXT/lx8CEcXb9RbDddl8jGDv+spi5qPa8qEHiK7FwV2KpRE9\n83wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVs\nWXI9C+yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT\n69s7of9+I9l5lsJ9cozf1rxrXX4V1u/SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8\nAziMCxS+VrRPDM+zfvpIJg3JljAh3PJHDiLu902v9w+Iplu1WyoB2aPfitxEhRN0\nYwIDAQAB\n-----END PUBLIC KEY-----""" + +DISABLE_JWT_CHECKS = { + "verify_signature": True, + "verify_exp": False, + "verify_nbf": False, + "verify_iat": False, + "verify_aud": False, + "verify_iss": False, + "require_exp": False, + "require_iat": False, + "require_nbf": False, +} + + class SignatureVerifier(): - def __init__(self, algorithm, secret=None, certificate=None): - if (algorithm not in ['HS256', 'RS256'] or type(algorithm) != str): - # This checks that it was set up correctly - raise 'Signature algorithm of "%{}" is not supported. Expected the ID token to be signed with "%{}"'.format(algorithm, "RS256") + def __init__(self, algorithm): + if (not algorithm or type(algorithm) != str): + raise Exception("The algorithm value is invalid") self.algorithm = algorithm - self.secret = secret - self.certificate = certificate + + def _fetch_key(self, key_id=None): + raise NotImplementedError def verifySignature(self, token): - disabledClaimsCheck = { - "verify_signature": True, - "verify_exp": False, - "verify_nbf": False, - "verify_iat": False, - "verify_aud": False, - "verify_iss": False, - "require_exp": False, - "require_iat": False, - "require_nbf": False, - } try: - #TODO: Make this take the algorithm from self and fetch the keys - decoded = jwt.decode(jwt=token, key=self.certificate or self.secret, algorithms=[self.algorithm], options=disabledClaimsCheck) - except jwt.exceptions.InvalidSignatureError: - raise Exception("Invalid token signature.") + header = jwt.get_unverified_header(token) except jwt.exceptions.DecodeError: raise Exception("ID token could not be decoded.") - except jwt.exceptions.InvalidAlgorithmError: - # This is raised when the token's algorithm is not one of the expected - raise Exception('Signature algorithm of "{}" is not supported. Expected the ID token to be signed with "{}"'.format(self.algorithm, "RS256")) + + alg = header.get('alg', None) + if (alg != self.algorithm): + raise Exception('Signature algorithm of "{}" is not supported. Expected the ID token to be signed with "{}"'.format(alg, self.algorithm)) + + kid = header.get('kid', None) + secret_or_certificate = self._fetch_key(key_id=kid) + + try: + decoded = jwt.decode(jwt=token, key=secret_or_certificate, algorithms=[self.algorithm], options=DISABLE_JWT_CHECKS) + except jwt.exceptions.InvalidSignatureError: + raise Exception("Invalid token signature.") return decoded - # def _getSecretOrCertificate(self, token): - # if (self.options.client_secret and self.algorithm == 'HS256'): - # return self.options.client_secret - # if (self.algorithm == 'RS256'): - # _fetchPublicKey(self.options.issuer) - # key = 'secret' - # header = jwt.get_unverified_header(encoded) +class SymmetricSignatureVerifier(SignatureVerifier): + + def __init__(self, shared_secret, algorithm="HS256"): + SignatureVerifier.__init__(self, algorithm) + self.shared_secret = shared_secret + + def _fetch_key(self, key_id=None): + return self.shared_secret + + +class AsymmetricSignatureVerifier(SignatureVerifier): + + def __init__(self, jwks_url, algorithm="RS256"): + SignatureVerifier.__init__(self, algorithm) + self.jwks_url = jwks_url + + def _fetch_key(self, key_id=None): + # TODO: Delegate this to some jwks fetching code + # e.g. https://pypi.org/project/simple-memory-cache/ + return RSA_PUBLIC_KEY class TokenVerifier(): def __init__(self, signatureVerifier, issuer, audience, leeway=0, _clock=None): - if (not signatureVerifier or type(signatureVerifier) is not SignatureVerifier): + if (not signatureVerifier or not isinstance(signatureVerifier, SignatureVerifier)): raise Exception("Signature verified not specified.") if (not issuer or type(issuer) != str): raise Exception("Issuer not specified.") @@ -69,18 +94,18 @@ def __init__(self, signatureVerifier, issuer, audience, leeway=0, _clock=None): '_clock': _clock } - def verify(self, token, nonce=None, maxAge=-1): + def verify(self, token, nonce=None, max_age=None): # Verify token presence if (not token or type(token) != str): raise Exception("ID token is required but missing.") if (nonce and type(nonce) != str): raise Exception("Nonce not specified.") - if (maxAge and type(maxAge) != int): + if (max_age and type(max_age) != int): raise Exception("Max Age not specified.") opt = self.options.copy() opt['nonce'] = nonce - opt['maxAge'] = maxAge + opt['maxAge'] = max_age # Verify algorithm and signature payload = opt['signatureVerifier'].verifySignature(token) diff --git a/auth0/v3/test/authentication/test_token_verifier.py b/auth0/v3/test/authentication/test_token_verifier.py index 6387c020..fb381b10 100644 --- a/auth0/v3/test/authentication/test_token_verifier.py +++ b/auth0/v3/test/authentication/test_token_verifier.py @@ -1,5 +1,7 @@ import unittest -from ...authentication.token_verifier import TokenVerifier, SignatureVerifier + +from ...authentication.token_verifier import TokenVerifier, AsymmetricSignatureVerifier, \ + SymmetricSignatureVerifier expectations = { "audience": "tokens-test-123", @@ -20,7 +22,7 @@ class TestBase(unittest.TestCase): def assert_fails_with_error(self, token, error_message, signature_verifier=None, audience=TOKEN_AUDIENCE, issuer=TOKEN_ISSUER, nonce=None, max_age=None, _clock=MOCKED_CLOCK): - sv = signature_verifier or SignatureVerifier(algorithm="RS256", certificate=RSA_PUBLIC_KEY) + sv = signature_verifier or AsymmetricSignatureVerifier(jwks_url=None) # FIXME mock and update tv = TokenVerifier( signatureVerifier=sv, issuer=issuer, @@ -49,7 +51,7 @@ def test_err_token_format_invalid(self): def test_HS256_token_signature_passes(self): token = "eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.Hn38QVtN_mWN0c-jOa-Fqq69kXpbBp0THsvE-CQ47Ps" - sv = SignatureVerifier(algorithm="HS256", secret=HMAC_SHARED_SECRET) + sv = SymmetricSignatureVerifier(HMAC_SHARED_SECRET) tv = TokenVerifier( signatureVerifier=sv, issuer=TOKEN_ISSUER, @@ -60,7 +62,7 @@ def test_HS256_token_signature_passes(self): def test_RS256_token_signature_passes(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.Eo2jxdlrKmutIeyn9Un6VHorMJaCL5txPDCC3QiAQn0pYYnrRU7VMQwqbTiXLQ9zPYh5Q4pQmT-XRaGL-HwDH8vCUieVJKOm0-gNFAMzx1i8sRH1ubw75sn69y09AQKcitYtjnBmahgfZrswtsxOXM7XovlLftPjv6goAi_U38GYsS_V_zOBvdbX2cM5zdooJAC0e7vlCr3bXNo90qwgCuezvCGt1ZrgWyDNO9oMzK-TlK86q36LuIkux7XZboF5rc3zsThEce_tPufA5qoEa-7I_ybmjwlvOCWmngYLT52_S2CbHeRNarePMjZIlmAuG-DcetwO8jJsX84Ra0SdUw" - sv = SignatureVerifier(algorithm="RS256", certificate=RSA_PUBLIC_KEY) + sv = AsymmetricSignatureVerifier(jwks_url=None) # FIXME tv = TokenVerifier( signatureVerifier=sv, issuer=TOKEN_ISSUER, @@ -70,21 +72,20 @@ def test_RS256_token_signature_passes(self): def test_HS256_token_signature_fails(self): token = "eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.invalidsignature" - sv = SignatureVerifier(algorithm="HS256", secret=HMAC_SHARED_SECRET) + sv = SymmetricSignatureVerifier(HMAC_SHARED_SECRET) self.assert_fails_with_error(token, "Invalid token signature.", signature_verifier=sv) def test_RS256_token_signature_fails(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.invalidsignature" - sv = SignatureVerifier(algorithm="RS256", certificate=RSA_PUBLIC_KEY) + sv = AsymmetricSignatureVerifier(jwks_url=None) # FIXME self.assert_fails_with_error(token, "Invalid token signature.", signature_verifier=sv) - # def test_fails_with_algorithm_not_supported(self): - # FIXME - # token = "eyJhbGciOiJub25lIn0.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0." - # self.assert_fails_with_error(token, 'Signature algorithm of "none" is not supported. Expected the ID token to be signed with "HS256"') - # return + def test_fails_with_algorithm_not_supported(self): + token = "eyJhbGciOiJub25lIn0.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0." + self.assert_fails_with_error(token, 'Signature algorithm of "none" is not supported. Expected the ID token to be signed with "RS256"') + return def test_fails_with_iss_missing(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.XuWmo_XxNET0mOW1AaLwi8koUOd05TZULWCGF_3WbeR5VJB6aK0rzo8AkHXrSv9Yr6he_1N8xFDKBIIyXFa4Y2PN8kdwUQtsJcj-cj8_2Ta2S0vV6O7XqbW58eXhX8Ng0OUrqgkHT1leIUJnBZ10YhM0-0zmdIq_WlNnwTdmvAGtYAUGcjyUmq-QEKBc2YYnf83vtGuFT2xGUGsTKR_Jj7lH_QTYdFaiT4t7gwFyXhP5KVUkG3ebdQUkIAQnoY0TXwrgDDCQhAWiUYZehMlv7Ml4tqLsiIUMgm4w5wSfdTdhVEMa7wHPj7gp4s-bfEqaOuyg0xH24rP19LkJROITDw" @@ -129,7 +130,7 @@ def test_fails_with_iat_invalid(self): def test_passes_when_nonce_missing_but_not_required(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.L-DveLCDf4Te7x3JZmQ6rCkUQrenl1NFpHqKD8Fs-glhd2iyc-TYffk1M30T0-wBri-3tTgraDAjZAjXuwSk0gV_V5uKCHyIoSRphrC88aX8IeECteQpHa4KR15lbzA5JdVhJu7LuCZ2EFvdjHh5GiViLRWsTSHGUM-uqcMK0q2kWGvCEgfOIXqocnQiyCNITxfgMYJd38zOsVeP7HFf9riuFEQz65oER22o3xyIZ-ILSaU10n6Ob559Rbjc0NVKH4hrggRg8kG7cJCiXbRxXnzO_VM8LmRHhF56jh3ZSrO4bzQa5xv04bMbX6A77muMZD0vghsaslvpWerWbwaSQQ" - sv = SignatureVerifier(algorithm="RS256", certificate=RSA_PUBLIC_KEY) + sv = AsymmetricSignatureVerifier(jwks_url=None) # FIXME tv = TokenVerifier( signatureVerifier=sv, issuer=TOKEN_ISSUER, From 290cfa4456065cff283b1ef9d5b55e302397de1e Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 28 Apr 2020 18:02:17 -0300 Subject: [PATCH 078/663] refactor into pythonish syntax --- auth0/v3/authentication/token_verifier.py | 110 +++++++++--------- .../authentication/test_token_verifier.py | 8 +- 2 files changed, 56 insertions(+), 62 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index eec92fc3..afb901cc 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -25,21 +25,21 @@ class SignatureVerifier(): def __init__(self, algorithm): - if (not algorithm or type(algorithm) != str): + if not algorithm or type(algorithm) != str: raise Exception("The algorithm value is invalid") self.algorithm = algorithm def _fetch_key(self, key_id=None): raise NotImplementedError - def verifySignature(self, token): + def verify_signature(self, token): try: header = jwt.get_unverified_header(token) except jwt.exceptions.DecodeError: raise Exception("ID token could not be decoded.") alg = header.get('alg', None) - if (alg != self.algorithm): + if alg != self.algorithm: raise Exception('Signature algorithm of "{}" is not supported. Expected the ID token to be signed with "{}"'.format(alg, self.algorithm)) kid = header.get('kid', None) @@ -76,18 +76,19 @@ def _fetch_key(self, key_id=None): class TokenVerifier(): - def __init__(self, signatureVerifier, issuer, audience, leeway=0, _clock=None): - if (not signatureVerifier or not isinstance(signatureVerifier, SignatureVerifier)): + def __init__(self, signature_verifier, issuer, audience, leeway=0, _clock=None): + # TODO: See if these checks are OK + if not signature_verifier or not isinstance(signature_verifier, SignatureVerifier): raise Exception("Signature verified not specified.") - if (not issuer or type(issuer) != str): + if not issuer or type(issuer) != str: raise Exception("Issuer not specified.") - if (not audience or type(audience) != str): + if not audience or type(audience) != str: raise Exception("Audience not specified.") - if (type(leeway) != int): + if type(leeway) != int: raise Exception("Invalid leeway value.") self.options = { - 'signatureVerifier': signatureVerifier, + 'signature_verifier': signature_verifier, 'iss': issuer, 'aud': audience, 'leeway': leeway, @@ -96,91 +97,84 @@ def __init__(self, signatureVerifier, issuer, audience, leeway=0, _clock=None): def verify(self, token, nonce=None, max_age=None): # Verify token presence - if (not token or type(token) != str): + if not token or type(token) != str: raise Exception("ID token is required but missing.") - if (nonce and type(nonce) != str): + if nonce and type(nonce) != str: raise Exception("Nonce not specified.") - if (max_age and type(max_age) != int): + if max_age and type(max_age) != int: raise Exception("Max Age not specified.") opt = self.options.copy() opt['nonce'] = nonce - opt['maxAge'] = max_age + opt['max_age'] = max_age # Verify algorithm and signature - payload = opt['signatureVerifier'].verifySignature(token) + payload = opt['signature_verifier'].verify_signature(token) - #Verify claims - ##Issuer + # Verify claims + # Issuer - if ('iss' not in payload or type(payload['iss']) != str): + if 'iss' not in payload or type(payload['iss']) != str: raise Exception('Issuer (iss) claim must be a string present in the ID token') - if (payload['iss'] != opt['iss']): + if payload['iss'] != opt['iss']: raise Exception('Issuer (iss) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['iss'], payload['iss'])) - ##Subject - if ('sub' not in payload or type(payload['sub']) != str): + # Subject + if 'sub' not in payload or type(payload['sub']) != str: raise Exception('Subject (sub) claim must be a string present in the ID token') - - ##Audience - if ('aud' not in payload or not (type(payload['aud']) == str or type(payload['aud']) is list)): + # Audience + if 'aud' not in payload or not (type(payload['aud']) == str or type(payload['aud']) is list): raise Exception('Audience (aud) claim must be a string or array of strings present in the ID token') - if (type(payload['aud']) is list and not opt['aud'] in payload['aud']): - payloadAudiences = ", ".join(payload['aud']) - raise Exception('Audience (aud) claim mismatch in the ID token; expected "{}" but was not one of "{}"'.format(opt['aud'], payloadAudiences)) - elif (type(payload['aud']) == str and payload['aud'] != opt['aud']): + if type(payload['aud']) is list and not opt['aud'] in payload['aud']: + payload_audiences = ", ".join(payload['aud']) + raise Exception('Audience (aud) claim mismatch in the ID token; expected "{}" but was not one of "{}"'.format(opt['aud'], payload_audiences)) + elif type(payload['aud']) == str and payload['aud'] != opt['aud']: raise Exception('Audience (aud) claim mismatch in the ID token; expected "{}" but found "{}"'.format(opt['aud'], payload['aud'])) - ##--Time validation (epoch)-- - realClock = time.time() + # --Time validation (epoch)-- now = opt['_clock'] or time.time() - print("Real clock: {}".format(realClock)) - print("Using now: {}".format(now)) leeway = opt['leeway'] - print("Leeway: {}".format(leeway)) - ##Expires at - if ('exp' not in payload or type(payload['exp']) != int): + # Expires at + if 'exp' not in payload or type(payload['exp']) != int: raise Exception('Expiration Time (exp) claim must be a number present in the ID token') - expTime = payload['exp'] + leeway - if (now > expTime): - raise Exception('Expiration Time (exp) claim error in the ID token; current time ({}) is after expiration time ({})'.format(now, expTime)) + exp_time = payload['exp'] + leeway + if now > exp_time: + raise Exception('Expiration Time (exp) claim error in the ID token; current time ({}) is after expiration time ({})'.format(now, exp_time)) - ##Issued at - if ('iat' not in payload or type(payload['iat']) != int): + # Issued at + if 'iat' not in payload or type(payload['iat']) != int: raise Exception('Issued At (iat) claim must be a number present in the ID token') - iatTime = payload['iat'] - leeway - print("Found iat+leeway: {}".format(iatTime)) - print("now - iat claim: {}".format(now - iatTime)) - if (now < iatTime): - raise Exception('Issued At (iat) claim error in the ID token; current time ({}) is before issued at time ({})'.format(now, iatTime)) + iat_time = payload['iat'] - leeway + if now < iat_time: + raise Exception('Issued At (iat) claim error in the ID token; current time ({}) is before issued at time ({})'.format(now, iat_time)) - ##Nonce - if ( 'nonce' in opt and opt['nonce']): - if ('nonce' not in payload or type(payload['nonce']) != str): + # Nonce + if 'nonce' in opt and opt['nonce']: + if 'nonce' not in payload or type(payload['nonce']) != str: raise Exception('Nonce (nonce) claim must be a string present in the ID token') - if (payload['nonce'] != opt['nonce']): + if payload['nonce'] != opt['nonce']: raise Exception('Nonce (nonce) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['nonce'], payload['nonce'])) - ##Authorized party - if (type(payload['aud']) is list and len(payload['aud']) > 1): - if ('azp' not in payload or type(payload['azp']) != str): + # Authorized party + if type(payload['aud']) is list and len(payload['aud']) > 1: + if 'azp' not in payload or type(payload['azp']) != str: raise Exception('Authorized Party (azp) claim must be a string present in the ID token when Audience (aud) claim has multiple values') - if (payload['azp'] != opt['aud']): + if payload['azp'] != opt['aud']: raise Exception('Authorized Party (azp) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['aud'], payload['azp'])) - ##Authentication time - if ('maxAge' in opt and opt['maxAge']): - if ('auth_time' not in payload or type(payload['auth_time']) != int): + # Authentication time + if 'max_age' in opt and opt['max_age']: + if 'auth_time' not in payload or type(payload['auth_time']) != int: raise Exception('Authentication Time (auth_time) claim must be a number present in the ID token when Max Age (max_age) is specified') - authValidUntil = payload['auth_time'] + opt['maxAge'] + leeway - if (now > authValidUntil): - raise Exception('Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time ({}) is after last auth at ({})'.format(now, authValidUntil)) + auth_valid_until = payload['auth_time'] + opt['max_age'] + leeway + if now > auth_valid_until: + raise Exception('Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time ({}) is after last auth at ({})'.format(now, auth_valid_until)) diff --git a/auth0/v3/test/authentication/test_token_verifier.py b/auth0/v3/test/authentication/test_token_verifier.py index fb381b10..cf1bd31e 100644 --- a/auth0/v3/test/authentication/test_token_verifier.py +++ b/auth0/v3/test/authentication/test_token_verifier.py @@ -24,7 +24,7 @@ class TestBase(unittest.TestCase): def assert_fails_with_error(self, token, error_message, signature_verifier=None, audience=TOKEN_AUDIENCE, issuer=TOKEN_ISSUER, nonce=None, max_age=None, _clock=MOCKED_CLOCK): sv = signature_verifier or AsymmetricSignatureVerifier(jwks_url=None) # FIXME mock and update tv = TokenVerifier( - signatureVerifier=sv, + signature_verifier=sv, issuer=issuer, audience=audience, leeway=DEFAULT_LEEWAY, @@ -53,7 +53,7 @@ def test_HS256_token_signature_passes(self): sv = SymmetricSignatureVerifier(HMAC_SHARED_SECRET) tv = TokenVerifier( - signatureVerifier=sv, + signature_verifier=sv, issuer=TOKEN_ISSUER, audience=TOKEN_AUDIENCE, _clock=MOCKED_CLOCK) @@ -64,7 +64,7 @@ def test_RS256_token_signature_passes(self): sv = AsymmetricSignatureVerifier(jwks_url=None) # FIXME tv = TokenVerifier( - signatureVerifier=sv, + signature_verifier=sv, issuer=TOKEN_ISSUER, audience=TOKEN_AUDIENCE, _clock=MOCKED_CLOCK) @@ -132,7 +132,7 @@ def test_passes_when_nonce_missing_but_not_required(self): sv = AsymmetricSignatureVerifier(jwks_url=None) # FIXME tv = TokenVerifier( - signatureVerifier=sv, + signature_verifier=sv, issuer=TOKEN_ISSUER, audience=TOKEN_AUDIENCE, _clock=MOCKED_CLOCK) From 9139a63a1852d63e6515fdda72f45dc1847e92ab Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 30 Apr 2020 21:36:41 -0300 Subject: [PATCH 079/663] add jwks fetcher, cache logic and tests. --- auth0/v3/authentication/token_verifier.py | 71 +++++- .../authentication/test_token_verifier.py | 209 ++++++++++++++++-- 2 files changed, 253 insertions(+), 27 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index afb901cc..9c2a46de 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -1,13 +1,14 @@ -from abc import ABC +import json from ..exceptions import Auth0Error import jwt import time +import requests # TODO: Have a custom exception class TOKEN_VERIFIER_ERROR = 'a0.sdk.internal.token_verification' -RSA_PUBLIC_KEY = b"""-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGbXWiK3dQTyCbX5xdE4\nyCuYp0AF2d15Qq1JSXT/lx8CEcXb9RbDddl8jGDv+spi5qPa8qEHiK7FwV2KpRE9\n83wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVs\nWXI9C+yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT\n69s7of9+I9l5lsJ9cozf1rxrXX4V1u/SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8\nAziMCxS+VrRPDM+zfvpIJg3JljAh3PJHDiLu902v9w+Iplu1WyoB2aPfitxEhRN0\nYwIDAQAB\n-----END PUBLIC KEY-----""" +JWKS_CACHE_TTL = 60 # In seconds DISABLE_JWT_CHECKS = { "verify_signature": True, @@ -64,20 +65,76 @@ def _fetch_key(self, key_id=None): class AsymmetricSignatureVerifier(SignatureVerifier): - def __init__(self, jwks_url, algorithm="RS256"): + def __init__(self, jwks_url, algorithm="RS256", _jwks_fetcher=None): SignatureVerifier.__init__(self, algorithm) - self.jwks_url = jwks_url + self.fetcher = _jwks_fetcher or JwksFetcher(jwks_url) def _fetch_key(self, key_id=None): - # TODO: Delegate this to some jwks fetching code - # e.g. https://pypi.org/project/simple-memory-cache/ - return RSA_PUBLIC_KEY + return self.fetcher.get_key(key_id) + + +class JwksFetcher(): + + def __init__(self, jwks_url, cache_ttl=JWKS_CACHE_TTL): + self.jwks_url = jwks_url + self._init_cache(cache_ttl) + return + + def _init_cache(self, cache_ttl): + # FIXME: Are these and other properties suppose to be private? + self.cache_value = {} + self.cache_date = 0 + self.cache_ttl = cache_ttl + self.cache_is_fresh = False + + def _fetch_jwks(self, force=False): + has_expired = self.cache_date + self.cache_ttl < time.time() + + if not force and not has_expired: + # Return from cache + self.cache_is_fresh = False + return self.cache_value + + # Invalidate cache and fetch fresh data + self.cache_value = {} + response = requests.get(self.jwks_url) + + if response.ok: + # Update cache + jwks = response.json() + self.cache_value = self._parse_jwks(jwks) + self.cache_is_fresh = True + self.cache_date = time.time() + return self.cache_value + + def _parse_jwks(self, jwks): + keys = {} + + for key in jwks['keys']: + # noinspection PyUnresolvedReferences + # requirement already includes cryptography -> pyjwt[crypto] + rsa_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(key)) + keys[key["kid"]] = rsa_key + return keys + + def get_key(self, key_id): + keys = self._fetch_jwks() + + if keys and key_id in keys: + return keys[key_id] + + if not self.cache_is_fresh: + keys = self._fetch_jwks(force=True) + if keys and key_id in keys: + return keys[key_id] + raise Exception('RSA Public Key with ID "{}" was not found.'.format(key_id)) class TokenVerifier(): def __init__(self, signature_verifier, issuer, audience, leeway=0, _clock=None): # TODO: See if these checks are OK + # TODO: init JWKS / cache if not signature_verifier or not isinstance(signature_verifier, SignatureVerifier): raise Exception("Signature verified not specified.") if not issuer or type(issuer) != str: diff --git a/auth0/v3/test/authentication/test_token_verifier.py b/auth0/v3/test/authentication/test_token_verifier.py index cf1bd31e..d338b174 100644 --- a/auth0/v3/test/authentication/test_token_verifier.py +++ b/auth0/v3/test/authentication/test_token_verifier.py @@ -1,7 +1,24 @@ +import json + +import jwt import unittest +import time + +from mock import MagicMock, patch from ...authentication.token_verifier import TokenVerifier, AsymmetricSignatureVerifier, \ - SymmetricSignatureVerifier + SymmetricSignatureVerifier, JwksFetcher + +RSA_PUB_KEY_1_PEM = b"""-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGbXWiK3dQTyCbX5xdE4\nyCuYp0AF2d15Qq1JSXT/lx8CEcXb9RbDddl8jGDv+spi5qPa8qEHiK7FwV2KpRE9\n83wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVs\nWXI9C+yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT\n69s7of9+I9l5lsJ9cozf1rxrXX4V1u/SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8\nAziMCxS+VrRPDM+zfvpIJg3JljAh3PJHDiLu902v9w+Iplu1WyoB2aPfitxEhRN0\nYwIDAQAB\n-----END PUBLIC KEY-----\n""" +RSA_PUB_KEY_2_PEM = b"""-----BEGIN PUBLIC KEY-----\nMDowDQYJKoZIhvcNAQEBBQADKQAwJgIfAI7TBUCn8e1hj/fNpb5dqMf8Jj6Ja6qN\npqyeOGYEzAIDAQAB\n-----END PUBLIC KEY-----\n""" +RSA_PUB_KEY_1_JWK = {"kty": "RSA", "use": "sig", "n": "uGbXWiK3dQTyCbX5xdE4yCuYp0AF2d15Qq1JSXT_lx8CEcXb9RbDddl8jGDv-spi5qPa8qEHiK7FwV2KpRE983wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVsWXI9C-yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT69s7of9-I9l5lsJ9cozf1rxrXX4V1u_SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8AziMCxS-VrRPDM-zfvpIJg3JljAh3PJHDiLu902v9w-Iplu1WyoB2aPfitxEhRN0Yw", "e": "AQAB", "kid": "test-key-1"} +RSA_PUB_KEY_2_JWK = {"kty": "RSA", "use": "sig", "n": "jtMFQKfx7WGP982lvl2ox_wmPolrqo2mrJ44ZgTM", "e": "AQAB", "kid": "test-key-2"} +JWKS_RESPONSE_SINGLE_KEY = {"keys": [RSA_PUB_KEY_1_JWK]} +JWKS_RESPONSE_MULTIPLE_KEYS = {"keys": [RSA_PUB_KEY_1_JWK, RSA_PUB_KEY_2_JWK]} +HMAC_SHARED_SECRET = "secret" + +MOCKED_CLOCK = 1587592561 # Apr 22 2020 21:56:01 UTC +DEFAULT_LEEWAY = 60 expectations = { "audience": "tokens-test-123", @@ -10,19 +27,171 @@ "nonce": "a1b2c3d4e5" } -HMAC_SHARED_SECRET = "secret" -RSA_PUBLIC_KEY = b"""-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGbXWiK3dQTyCbX5xdE4\nyCuYp0AF2d15Qq1JSXT/lx8CEcXb9RbDddl8jGDv+spi5qPa8qEHiK7FwV2KpRE9\n83wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVs\nWXI9C+yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT\n69s7of9+I9l5lsJ9cozf1rxrXX4V1u/SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8\nAziMCxS+VrRPDM+zfvpIJg3JljAh3PJHDiLu902v9w+Iplu1WyoB2aPfitxEhRN0\nYwIDAQAB\n-----END PUBLIC KEY-----""" -TOKEN_ISSUER = "https://tokens-test.auth0.com/" -TOKEN_AUDIENCE = "tokens-test-123" -MOCKED_CLOCK = 1587592561 #Apr 22 2020 21:56:01 UTC -DEFAULT_LEEWAY = 60 - # Run with: python -m unittest discover -s auth0 -p 'test_token_*' -class TestBase(unittest.TestCase): +class TestSignatureVerifier(unittest.TestCase): + + def test_symmetric_verifier_uses_hs256_alg(self): + verifier = SymmetricSignatureVerifier("some secret") + self.assertEqual(verifier.algorithm, "HS256") + + def test_asymmetric_verifier_uses_rs256_alg(self): + verifier = AsymmetricSignatureVerifier("some URL") + self.assertEqual(verifier.algorithm, "RS256") + + def test_symmetric_verifier_fetches_key(self): + verifier = SymmetricSignatureVerifier("some secret") + key = verifier._fetch_key() + + self.assertEqual(verifier.shared_secret, "some secret") + self.assertEqual(key, "some secret") + + def test_asymmetric_verifier_fetches_key(self): + + mock_fetcher = JwksFetcher('some URL') + mock_fetcher.get_key = MagicMock('get_key') + mock_fetcher.get_key.return_value = RSA_PUB_KEY_1_JWK + + verifier = AsymmetricSignatureVerifier("some URL", _jwks_fetcher=mock_fetcher) + + key = verifier._fetch_key('test-key') + + args, kwargs = mock_fetcher.get_key.call_args + self.assertEqual(args[0], 'test-key') + + self.assertEqual(mock_fetcher, verifier.fetcher) + self.assertEqual(mock_fetcher.jwks_url, "some URL") + self.assertEqual(key, RSA_PUB_KEY_1_JWK) + + +class TestJwksFetcher(unittest.TestCase): + + @staticmethod + def _get_pem_bytes(rsa_public_key): + # noinspection PyPackageRequirements + # requirement already includes cryptography -> pyjwt[crypto] + from cryptography.hazmat.primitives import serialization + return rsa_public_key.public_bytes(serialization.Encoding.PEM, serialization.PublicFormat.SubjectPublicKeyInfo) + + @patch('requests.get') + def test_get_jwks_json_twice_on_cache_expired(self, mock_get): + JWKS_URL = 'https://app.myhosting.com/.well-known/jwks.json' + fetcher = JwksFetcher(JWKS_URL, cache_ttl=1) + + mock_get.return_value.ok = True + mock_get.return_value.status_code = 200 + mock_get.return_value.json.return_value = JWKS_RESPONSE_SINGLE_KEY + + key_1 = fetcher.get_key('test-key-1') + expected_key_1_pem = self._get_pem_bytes(key_1) + self.assertEqual(expected_key_1_pem, RSA_PUB_KEY_1_PEM) + + mock_get.assert_called_with(JWKS_URL) + self.assertEqual(mock_get.call_count, 1) + + time.sleep(2) + + # 2 seconds has passed, cache should be expired + key_1 = fetcher.get_key('test-key-1') + expected_key_1_pem = self._get_pem_bytes(key_1) + self.assertEqual(expected_key_1_pem, RSA_PUB_KEY_1_PEM) + + mock_get.assert_called_with(JWKS_URL) + self.assertEqual(mock_get.call_count, 2) + + @patch('requests.get') + def test_get_jwks_json_once_on_cache_hit(self, mock_get): + JWKS_URL = 'https://app.myhosting.com/.well-known/jwks.json' + fetcher = JwksFetcher(JWKS_URL) + + mock_get.return_value.ok = True + mock_get.return_value.status_code = 200 + mock_get.return_value.json.return_value = JWKS_RESPONSE_MULTIPLE_KEYS + + key_1 = fetcher.get_key('test-key-1') + key_2 = fetcher.get_key('test-key-2') + expected_key_1_pem = self._get_pem_bytes(key_1) + expected_key_2_pem = self._get_pem_bytes(key_2) + self.assertEqual(expected_key_1_pem, RSA_PUB_KEY_1_PEM) + self.assertEqual(expected_key_2_pem, RSA_PUB_KEY_2_PEM) + + mock_get.assert_called_with(JWKS_URL) + self.assertEqual(mock_get.call_count, 1) + + @patch('requests.get') + def test_fetches_jwks_json_forced_on_cache_miss(self, mock_get): + JWKS_URL = 'https://app.myhosting.com/.well-known/jwks.json' + fetcher = JwksFetcher(JWKS_URL) + + mock_get.return_value.ok = True + mock_get.return_value.status_code = 200 + mock_get.return_value.json.return_value = {'keys':[RSA_PUB_KEY_1_JWK]} + + # Triggers the first call + key_1 = fetcher.get_key('test-key-1') + expected_key_1_pem = self._get_pem_bytes(key_1) + self.assertEqual(expected_key_1_pem, RSA_PUB_KEY_1_PEM) + + mock_get.assert_called_with(JWKS_URL) + self.assertEqual(mock_get.call_count, 1) + + mock_get.return_value.json.return_value = JWKS_RESPONSE_MULTIPLE_KEYS + + # Triggers the second call + key_2 = fetcher.get_key('test-key-2') + expected_key_2_pem = self._get_pem_bytes(key_2) + self.assertEqual(expected_key_2_pem, RSA_PUB_KEY_2_PEM) + + mock_get.assert_called_with(JWKS_URL) + self.assertEqual(mock_get.call_count, 2) + + @patch('requests.get') + def test_fetches_jwks_json_once_on_cache_miss(self, mock_get): + JWKS_URL = 'https://app.myhosting.com/.well-known/jwks.json' + fetcher = JwksFetcher(JWKS_URL) + + mock_get.return_value.ok = True + mock_get.return_value.status_code = 200 + mock_get.return_value.json.return_value = JWKS_RESPONSE_SINGLE_KEY + + with self.assertRaises(Exception) as err: + key_1 = fetcher.get_key('missing-key') + + mock_get.assert_called_with(JWKS_URL) + self.assertEqual(str(err.exception), 'RSA Public Key with ID "missing-key" was not found.') + self.assertEqual(mock_get.call_count, 1) + + @patch('requests.get') + def test_fails_to_fetch_jwks_json_after_retrying_twice(self, mock_get): + JWKS_URL = 'https://app.myhosting.com/.well-known/jwks.json' + fetcher = JwksFetcher(JWKS_URL) + + mock_get.return_value.ok = False + mock_get.return_value.status_code = 500 + mock_get.return_value.text = "Some error happened" + + with self.assertRaises(Exception) as err: + key_1 = fetcher.get_key('id1') + + mock_get.assert_called_with(JWKS_URL) + self.assertEqual(str(err.exception), 'RSA Public Key with ID "id1" was not found.') + self.assertEqual(mock_get.call_count, 2) + + +class TestTokenVerifier(unittest.TestCase): + + @staticmethod + def asymmetric_signature_verifier_mock(): + verifier = AsymmetricSignatureVerifier('some URL') + verifier._fetch_key = MagicMock('_fetch_key') + + # noinspection PyUnresolvedReferences + # requirement already includes cryptography -> pyjwt[crypto] + verifier._fetch_key.return_value = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(RSA_PUB_KEY_1_JWK)) + return verifier - def assert_fails_with_error(self, token, error_message, signature_verifier=None, audience=TOKEN_AUDIENCE, issuer=TOKEN_ISSUER, nonce=None, max_age=None, _clock=MOCKED_CLOCK): - sv = signature_verifier or AsymmetricSignatureVerifier(jwks_url=None) # FIXME mock and update + def assert_fails_with_error(self, token, error_message, signature_verifier=None, audience=expectations['audience'], issuer=expectations['issuer'], nonce=None, max_age=None, _clock=MOCKED_CLOCK): + sv = signature_verifier or self.asymmetric_signature_verifier_mock() tv = TokenVerifier( signature_verifier=sv, issuer=issuer, @@ -54,19 +223,19 @@ def test_HS256_token_signature_passes(self): sv = SymmetricSignatureVerifier(HMAC_SHARED_SECRET) tv = TokenVerifier( signature_verifier=sv, - issuer=TOKEN_ISSUER, - audience=TOKEN_AUDIENCE, + issuer=expectations['issuer'], + audience=expectations['audience'], _clock=MOCKED_CLOCK) tv.verify(token) def test_RS256_token_signature_passes(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.Eo2jxdlrKmutIeyn9Un6VHorMJaCL5txPDCC3QiAQn0pYYnrRU7VMQwqbTiXLQ9zPYh5Q4pQmT-XRaGL-HwDH8vCUieVJKOm0-gNFAMzx1i8sRH1ubw75sn69y09AQKcitYtjnBmahgfZrswtsxOXM7XovlLftPjv6goAi_U38GYsS_V_zOBvdbX2cM5zdooJAC0e7vlCr3bXNo90qwgCuezvCGt1ZrgWyDNO9oMzK-TlK86q36LuIkux7XZboF5rc3zsThEce_tPufA5qoEa-7I_ybmjwlvOCWmngYLT52_S2CbHeRNarePMjZIlmAuG-DcetwO8jJsX84Ra0SdUw" - sv = AsymmetricSignatureVerifier(jwks_url=None) # FIXME + sv = self.asymmetric_signature_verifier_mock() tv = TokenVerifier( signature_verifier=sv, - issuer=TOKEN_ISSUER, - audience=TOKEN_AUDIENCE, + issuer=expectations['issuer'], + audience=expectations['audience'], _clock=MOCKED_CLOCK) tv.verify(token) @@ -78,7 +247,7 @@ def test_HS256_token_signature_fails(self): def test_RS256_token_signature_fails(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.invalidsignature" - sv = AsymmetricSignatureVerifier(jwks_url=None) # FIXME + sv = self.asymmetric_signature_verifier_mock() self.assert_fails_with_error(token, "Invalid token signature.", signature_verifier=sv) @@ -130,11 +299,11 @@ def test_fails_with_iat_invalid(self): def test_passes_when_nonce_missing_but_not_required(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.L-DveLCDf4Te7x3JZmQ6rCkUQrenl1NFpHqKD8Fs-glhd2iyc-TYffk1M30T0-wBri-3tTgraDAjZAjXuwSk0gV_V5uKCHyIoSRphrC88aX8IeECteQpHa4KR15lbzA5JdVhJu7LuCZ2EFvdjHh5GiViLRWsTSHGUM-uqcMK0q2kWGvCEgfOIXqocnQiyCNITxfgMYJd38zOsVeP7HFf9riuFEQz65oER22o3xyIZ-ILSaU10n6Ob559Rbjc0NVKH4hrggRg8kG7cJCiXbRxXnzO_VM8LmRHhF56jh3ZSrO4bzQa5xv04bMbX6A77muMZD0vghsaslvpWerWbwaSQQ" - sv = AsymmetricSignatureVerifier(jwks_url=None) # FIXME + sv = self.asymmetric_signature_verifier_mock() tv = TokenVerifier( signature_verifier=sv, - issuer=TOKEN_ISSUER, - audience=TOKEN_AUDIENCE, + issuer=expectations['issuer'], + audience=expectations['audience'], _clock=MOCKED_CLOCK) tv.verify(token) From 9cf63af32ba5d69e11057c3100c17f01b0e5eca0 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 4 May 2020 16:28:50 -0300 Subject: [PATCH 080/663] hide private properties --- auth0/v3/authentication/token_verifier.py | 57 +++++++++---------- .../authentication/test_token_verifier.py | 10 ++-- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index 9c2a46de..08ee745a 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -1,8 +1,7 @@ import json +import time -from ..exceptions import Auth0Error import jwt -import time import requests # TODO: Have a custom exception class @@ -28,7 +27,7 @@ class SignatureVerifier(): def __init__(self, algorithm): if not algorithm or type(algorithm) != str: raise Exception("The algorithm value is invalid") - self.algorithm = algorithm + self._algorithm = algorithm def _fetch_key(self, key_id=None): raise NotImplementedError @@ -40,14 +39,14 @@ def verify_signature(self, token): raise Exception("ID token could not be decoded.") alg = header.get('alg', None) - if alg != self.algorithm: - raise Exception('Signature algorithm of "{}" is not supported. Expected the ID token to be signed with "{}"'.format(alg, self.algorithm)) + if alg != self._algorithm: + raise Exception('Signature algorithm of "{}" is not supported. Expected the ID token to be signed with "{}"'.format(alg, self._algorithm)) kid = header.get('kid', None) secret_or_certificate = self._fetch_key(key_id=kid) try: - decoded = jwt.decode(jwt=token, key=secret_or_certificate, algorithms=[self.algorithm], options=DISABLE_JWT_CHECKS) + decoded = jwt.decode(jwt=token, key=secret_or_certificate, algorithms=[self._algorithm], options=DISABLE_JWT_CHECKS) except jwt.exceptions.InvalidSignatureError: raise Exception("Invalid token signature.") return decoded @@ -57,57 +56,57 @@ class SymmetricSignatureVerifier(SignatureVerifier): def __init__(self, shared_secret, algorithm="HS256"): SignatureVerifier.__init__(self, algorithm) - self.shared_secret = shared_secret + self._shared_secret = shared_secret def _fetch_key(self, key_id=None): - return self.shared_secret + return self._shared_secret class AsymmetricSignatureVerifier(SignatureVerifier): def __init__(self, jwks_url, algorithm="RS256", _jwks_fetcher=None): SignatureVerifier.__init__(self, algorithm) - self.fetcher = _jwks_fetcher or JwksFetcher(jwks_url) + self._fetcher = _jwks_fetcher or JwksFetcher(jwks_url) def _fetch_key(self, key_id=None): - return self.fetcher.get_key(key_id) + return self._fetcher.get_key(key_id) class JwksFetcher(): def __init__(self, jwks_url, cache_ttl=JWKS_CACHE_TTL): - self.jwks_url = jwks_url + self._jwks_url = jwks_url self._init_cache(cache_ttl) return def _init_cache(self, cache_ttl): - # FIXME: Are these and other properties suppose to be private? - self.cache_value = {} - self.cache_date = 0 - self.cache_ttl = cache_ttl - self.cache_is_fresh = False + self._cache_value = {} + self._cache_date = 0 + self._cache_ttl = cache_ttl + self._cache_is_fresh = False def _fetch_jwks(self, force=False): - has_expired = self.cache_date + self.cache_ttl < time.time() + has_expired = self._cache_date + self._cache_ttl < time.time() if not force and not has_expired: # Return from cache - self.cache_is_fresh = False - return self.cache_value + self._cache_is_fresh = False + return self._cache_value # Invalidate cache and fetch fresh data - self.cache_value = {} - response = requests.get(self.jwks_url) + self._cache_value = {} + response = requests.get(self._jwks_url) if response.ok: # Update cache jwks = response.json() - self.cache_value = self._parse_jwks(jwks) - self.cache_is_fresh = True - self.cache_date = time.time() - return self.cache_value + self._cache_value = self._parse_jwks(jwks) + self._cache_is_fresh = True + self._cache_date = time.time() + return self._cache_value - def _parse_jwks(self, jwks): + @staticmethod + def _parse_jwks(jwks): keys = {} for key in jwks['keys']: @@ -123,7 +122,7 @@ def get_key(self, key_id): if keys and key_id in keys: return keys[key_id] - if not self.cache_is_fresh: + if not self._cache_is_fresh: keys = self._fetch_jwks(force=True) if keys and key_id in keys: return keys[key_id] @@ -144,7 +143,7 @@ def __init__(self, signature_verifier, issuer, audience, leeway=0, _clock=None): if type(leeway) != int: raise Exception("Invalid leeway value.") - self.options = { + self._options = { 'signature_verifier': signature_verifier, 'iss': issuer, 'aud': audience, @@ -161,7 +160,7 @@ def verify(self, token, nonce=None, max_age=None): if max_age and type(max_age) != int: raise Exception("Max Age not specified.") - opt = self.options.copy() + opt = self._options.copy() opt['nonce'] = nonce opt['max_age'] = max_age diff --git a/auth0/v3/test/authentication/test_token_verifier.py b/auth0/v3/test/authentication/test_token_verifier.py index d338b174..861c2ba2 100644 --- a/auth0/v3/test/authentication/test_token_verifier.py +++ b/auth0/v3/test/authentication/test_token_verifier.py @@ -33,17 +33,17 @@ class TestSignatureVerifier(unittest.TestCase): def test_symmetric_verifier_uses_hs256_alg(self): verifier = SymmetricSignatureVerifier("some secret") - self.assertEqual(verifier.algorithm, "HS256") + self.assertEqual(verifier._algorithm, "HS256") def test_asymmetric_verifier_uses_rs256_alg(self): verifier = AsymmetricSignatureVerifier("some URL") - self.assertEqual(verifier.algorithm, "RS256") + self.assertEqual(verifier._algorithm, "RS256") def test_symmetric_verifier_fetches_key(self): verifier = SymmetricSignatureVerifier("some secret") key = verifier._fetch_key() - self.assertEqual(verifier.shared_secret, "some secret") + self.assertEqual(verifier._shared_secret, "some secret") self.assertEqual(key, "some secret") def test_asymmetric_verifier_fetches_key(self): @@ -59,8 +59,8 @@ def test_asymmetric_verifier_fetches_key(self): args, kwargs = mock_fetcher.get_key.call_args self.assertEqual(args[0], 'test-key') - self.assertEqual(mock_fetcher, verifier.fetcher) - self.assertEqual(mock_fetcher.jwks_url, "some URL") + self.assertEqual(mock_fetcher, verifier._fetcher) + self.assertEqual(mock_fetcher._jwks_url, "some URL") self.assertEqual(key, RSA_PUB_KEY_1_JWK) From 495087a93569e39064e20c24185573968b859b65 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 4 May 2020 19:06:03 -0300 Subject: [PATCH 081/663] add custom exception class --- auth0/v3/authentication/token_verifier.py | 61 ++++++++----------- auth0/v3/exceptions.py | 8 +++ .../authentication/test_token_verifier.py | 41 ++++++++++++- 3 files changed, 73 insertions(+), 37 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index 08ee745a..4fc29b1a 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -4,8 +4,7 @@ import jwt import requests -# TODO: Have a custom exception class -TOKEN_VERIFIER_ERROR = 'a0.sdk.internal.token_verification' +from auth0.v3.exceptions import TokenValidationError JWKS_CACHE_TTL = 60 # In seconds @@ -26,7 +25,7 @@ class SignatureVerifier(): def __init__(self, algorithm): if not algorithm or type(algorithm) != str: - raise Exception("The algorithm value is invalid") + raise ValueError("algorithm must be specified.") self._algorithm = algorithm def _fetch_key(self, key_id=None): @@ -36,11 +35,11 @@ def verify_signature(self, token): try: header = jwt.get_unverified_header(token) except jwt.exceptions.DecodeError: - raise Exception("ID token could not be decoded.") + raise TokenValidationError("ID token could not be decoded.") alg = header.get('alg', None) if alg != self._algorithm: - raise Exception('Signature algorithm of "{}" is not supported. Expected the ID token to be signed with "{}"'.format(alg, self._algorithm)) + raise TokenValidationError('Signature algorithm of "{}" is not supported. Expected the ID token to be signed with "{}"'.format(alg, self._algorithm)) kid = header.get('kid', None) secret_or_certificate = self._fetch_key(key_id=kid) @@ -48,7 +47,7 @@ def verify_signature(self, token): try: decoded = jwt.decode(jwt=token, key=secret_or_certificate, algorithms=[self._algorithm], options=DISABLE_JWT_CHECKS) except jwt.exceptions.InvalidSignatureError: - raise Exception("Invalid token signature.") + raise TokenValidationError("Invalid token signature.") return decoded @@ -126,22 +125,14 @@ def get_key(self, key_id): keys = self._fetch_jwks(force=True) if keys and key_id in keys: return keys[key_id] - raise Exception('RSA Public Key with ID "{}" was not found.'.format(key_id)) + raise TokenValidationError('RSA Public Key with ID "{}" was not found.'.format(key_id)) class TokenVerifier(): def __init__(self, signature_verifier, issuer, audience, leeway=0, _clock=None): - # TODO: See if these checks are OK - # TODO: init JWKS / cache if not signature_verifier or not isinstance(signature_verifier, SignatureVerifier): - raise Exception("Signature verified not specified.") - if not issuer or type(issuer) != str: - raise Exception("Issuer not specified.") - if not audience or type(audience) != str: - raise Exception("Audience not specified.") - if type(leeway) != int: - raise Exception("Invalid leeway value.") + raise TypeError("signature_verifier must be an instance of SignatureVerifier.") self._options = { 'signature_verifier': signature_verifier, @@ -154,11 +145,11 @@ def __init__(self, signature_verifier, issuer, audience, leeway=0, _clock=None): def verify(self, token, nonce=None, max_age=None): # Verify token presence if not token or type(token) != str: - raise Exception("ID token is required but missing.") + raise TokenValidationError("ID token is required but missing.") if nonce and type(nonce) != str: - raise Exception("Nonce not specified.") + raise TokenValidationError("Nonce not specified.") if max_age and type(max_age) != int: - raise Exception("Max Age not specified.") + raise TokenValidationError("Max Age not specified.") opt = self._options.copy() opt['nonce'] = nonce @@ -171,23 +162,23 @@ def verify(self, token, nonce=None, max_age=None): # Issuer if 'iss' not in payload or type(payload['iss']) != str: - raise Exception('Issuer (iss) claim must be a string present in the ID token') + raise TokenValidationError('Issuer (iss) claim must be a string present in the ID token') if payload['iss'] != opt['iss']: - raise Exception('Issuer (iss) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['iss'], payload['iss'])) + raise TokenValidationError('Issuer (iss) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['iss'], payload['iss'])) # Subject if 'sub' not in payload or type(payload['sub']) != str: - raise Exception('Subject (sub) claim must be a string present in the ID token') + raise TokenValidationError('Subject (sub) claim must be a string present in the ID token') # Audience if 'aud' not in payload or not (type(payload['aud']) == str or type(payload['aud']) is list): - raise Exception('Audience (aud) claim must be a string or array of strings present in the ID token') + raise TokenValidationError('Audience (aud) claim must be a string or array of strings present in the ID token') if type(payload['aud']) is list and not opt['aud'] in payload['aud']: payload_audiences = ", ".join(payload['aud']) - raise Exception('Audience (aud) claim mismatch in the ID token; expected "{}" but was not one of "{}"'.format(opt['aud'], payload_audiences)) + raise TokenValidationError('Audience (aud) claim mismatch in the ID token; expected "{}" but was not one of "{}"'.format(opt['aud'], payload_audiences)) elif type(payload['aud']) == str and payload['aud'] != opt['aud']: - raise Exception('Audience (aud) claim mismatch in the ID token; expected "{}" but found "{}"'.format(opt['aud'], payload['aud'])) + raise TokenValidationError('Audience (aud) claim mismatch in the ID token; expected "{}" but found "{}"'.format(opt['aud'], payload['aud'])) # --Time validation (epoch)-- now = opt['_clock'] or time.time() @@ -195,42 +186,42 @@ def verify(self, token, nonce=None, max_age=None): # Expires at if 'exp' not in payload or type(payload['exp']) != int: - raise Exception('Expiration Time (exp) claim must be a number present in the ID token') + raise TokenValidationError('Expiration Time (exp) claim must be a number present in the ID token') exp_time = payload['exp'] + leeway if now > exp_time: - raise Exception('Expiration Time (exp) claim error in the ID token; current time ({}) is after expiration time ({})'.format(now, exp_time)) + raise TokenValidationError('Expiration Time (exp) claim error in the ID token; current time ({}) is after expiration time ({})'.format(now, exp_time)) # Issued at if 'iat' not in payload or type(payload['iat']) != int: - raise Exception('Issued At (iat) claim must be a number present in the ID token') + raise TokenValidationError('Issued At (iat) claim must be a number present in the ID token') iat_time = payload['iat'] - leeway if now < iat_time: - raise Exception('Issued At (iat) claim error in the ID token; current time ({}) is before issued at time ({})'.format(now, iat_time)) + raise TokenValidationError('Issued At (iat) claim error in the ID token; current time ({}) is before issued at time ({})'.format(now, iat_time)) # Nonce if 'nonce' in opt and opt['nonce']: if 'nonce' not in payload or type(payload['nonce']) != str: - raise Exception('Nonce (nonce) claim must be a string present in the ID token') + raise TokenValidationError('Nonce (nonce) claim must be a string present in the ID token') if payload['nonce'] != opt['nonce']: - raise Exception('Nonce (nonce) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['nonce'], payload['nonce'])) + raise TokenValidationError('Nonce (nonce) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['nonce'], payload['nonce'])) # Authorized party if type(payload['aud']) is list and len(payload['aud']) > 1: if 'azp' not in payload or type(payload['azp']) != str: - raise Exception('Authorized Party (azp) claim must be a string present in the ID token when Audience (aud) claim has multiple values') + raise TokenValidationError('Authorized Party (azp) claim must be a string present in the ID token when Audience (aud) claim has multiple values') if payload['azp'] != opt['aud']: - raise Exception('Authorized Party (azp) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['aud'], payload['azp'])) + raise TokenValidationError('Authorized Party (azp) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['aud'], payload['azp'])) # Authentication time if 'max_age' in opt and opt['max_age']: if 'auth_time' not in payload or type(payload['auth_time']) != int: - raise Exception('Authentication Time (auth_time) claim must be a number present in the ID token when Max Age (max_age) is specified') + raise TokenValidationError('Authentication Time (auth_time) claim must be a number present in the ID token when Max Age (max_age) is specified') auth_valid_until = payload['auth_time'] + opt['max_age'] + leeway if now > auth_valid_until: - raise Exception('Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time ({}) is after last auth at ({})'.format(now, auth_valid_until)) + raise TokenValidationError('Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time ({}) is after last auth at ({})'.format(now, auth_valid_until)) diff --git a/auth0/v3/exceptions.py b/auth0/v3/exceptions.py index 9cef84fc..2fe830f5 100644 --- a/auth0/v3/exceptions.py +++ b/auth0/v3/exceptions.py @@ -6,3 +6,11 @@ def __init__(self, status_code, error_code, message): def __str__(self): return '{}: {}'.format(self.status_code, self.message) + + +class TokenValidationError(Exception): + def __init__(self, message): + self.message = message + + def __str__(self): + return self.message diff --git a/auth0/v3/test/authentication/test_token_verifier.py b/auth0/v3/test/authentication/test_token_verifier.py index 861c2ba2..ca4ea8b0 100644 --- a/auth0/v3/test/authentication/test_token_verifier.py +++ b/auth0/v3/test/authentication/test_token_verifier.py @@ -7,7 +7,8 @@ from mock import MagicMock, patch from ...authentication.token_verifier import TokenVerifier, AsymmetricSignatureVerifier, \ - SymmetricSignatureVerifier, JwksFetcher + SymmetricSignatureVerifier, JwksFetcher, SignatureVerifier +from ...exceptions import TokenValidationError RSA_PUB_KEY_1_PEM = b"""-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGbXWiK3dQTyCbX5xdE4\nyCuYp0AF2d15Qq1JSXT/lx8CEcXb9RbDddl8jGDv+spi5qPa8qEHiK7FwV2KpRE9\n83wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVs\nWXI9C+yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT\n69s7of9+I9l5lsJ9cozf1rxrXX4V1u/SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8\nAziMCxS+VrRPDM+zfvpIJg3JljAh3PJHDiLu902v9w+Iplu1WyoB2aPfitxEhRN0\nYwIDAQAB\n-----END PUBLIC KEY-----\n""" RSA_PUB_KEY_2_PEM = b"""-----BEGIN PUBLIC KEY-----\nMDowDQYJKoZIhvcNAQEBBQADKQAwJgIfAI7TBUCn8e1hj/fNpb5dqMf8Jj6Ja6qN\npqyeOGYEzAIDAQAB\n-----END PUBLIC KEY-----\n""" @@ -31,6 +32,21 @@ # Run with: python -m unittest discover -s auth0 -p 'test_token_*' class TestSignatureVerifier(unittest.TestCase): + def test_fail_at_creation_with_invalid_algorithm(self): + alg = 12345 + + with self.assertRaises(ValueError) as err: + SymmetricSignatureVerifier("some secret", algorithm=alg) + self.assertEqual(str(err.exception), "algorithm must be specified.") + + with self.assertRaises(ValueError) as err: + AsymmetricSignatureVerifier("some url", algorithm=alg) + self.assertEqual(str(err.exception), "algorithm must be specified.") + + with self.assertRaises(ValueError) as err: + SignatureVerifier(algorithm=alg) + self.assertEqual(str(err.exception), "algorithm must be specified.") + def test_symmetric_verifier_uses_hs256_alg(self): verifier = SymmetricSignatureVerifier("some secret") self.assertEqual(verifier._algorithm, "HS256") @@ -63,6 +79,21 @@ def test_asymmetric_verifier_fetches_key(self): self.assertEqual(mock_fetcher._jwks_url, "some URL") self.assertEqual(key, RSA_PUB_KEY_1_JWK) + def test_fails_with_none_algorithm(self): + # below is a token without signature and "signed" with none + jwt = "ewogICJhbGciOiAibm9uZSIsCiAgInR5cCI6ICJKV1QiCn0.eyJ1c2VybmFtZSI6ImFkbWluIn0." + + verifier = SymmetricSignatureVerifier("some secret") + with self.assertRaises(Exception) as err: + verifier.verify_signature(jwt) + self.assertEqual(str(err.exception), 'Signature algorithm of "none" is not supported. Expected the ID token to be signed with "HS256"') + + verifier = AsymmetricSignatureVerifier("some url") + with self.assertRaises(Exception) as err: + verifier.verify_signature(jwt) + self.assertEqual(str(err.exception), + 'Signature algorithm of "none" is not supported. Expected the ID token to be signed with "RS256"') + class TestJwksFetcher(unittest.TestCase): @@ -199,10 +230,16 @@ def assert_fails_with_error(self, token, error_message, signature_verifier=None, leeway=DEFAULT_LEEWAY, _clock=_clock ) - with self.assertRaises(Exception) as err: + with self.assertRaises(TokenValidationError) as err: tv.verify(token, nonce, max_age) self.assertEqual(str(err.exception), error_message) + def test_fails_at_creation_with_invalid_signature_verifier(self): + sv = "string is not an instance of signature verifier" + with self.assertRaises(TypeError) as err: + TokenVerifier(signature_verifier=sv, issuer="valid issuer", audience="valid audience") + self.assertEqual(str(err.exception), "signature_verifier must be an instance of SignatureVerifier.") + def test_err_token_empty(self): token = "" self.assert_fails_with_error(token, "ID token is required but missing.") From 282d60c1c5ffda8713f274d9ddf8e16e243fb867 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 4 May 2020 19:15:06 -0300 Subject: [PATCH 082/663] reorder constants --- auth0/v3/authentication/token_verifier.py | 30 +++++++++++------------ 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index 4fc29b1a..b192295b 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -6,22 +6,19 @@ from auth0.v3.exceptions import TokenValidationError -JWKS_CACHE_TTL = 60 # In seconds - -DISABLE_JWT_CHECKS = { - "verify_signature": True, - "verify_exp": False, - "verify_nbf": False, - "verify_iat": False, - "verify_aud": False, - "verify_iss": False, - "require_exp": False, - "require_iat": False, - "require_nbf": False, -} - class SignatureVerifier(): + DISABLE_JWT_CHECKS = { + "verify_signature": True, + "verify_exp": False, + "verify_nbf": False, + "verify_iat": False, + "verify_aud": False, + "verify_iss": False, + "require_exp": False, + "require_iat": False, + "require_nbf": False, + } def __init__(self, algorithm): if not algorithm or type(algorithm) != str: @@ -45,7 +42,7 @@ def verify_signature(self, token): secret_or_certificate = self._fetch_key(key_id=kid) try: - decoded = jwt.decode(jwt=token, key=secret_or_certificate, algorithms=[self._algorithm], options=DISABLE_JWT_CHECKS) + decoded = jwt.decode(jwt=token, key=secret_or_certificate, algorithms=[self._algorithm], options=self.DISABLE_JWT_CHECKS) except jwt.exceptions.InvalidSignatureError: raise TokenValidationError("Invalid token signature.") return decoded @@ -72,8 +69,9 @@ def _fetch_key(self, key_id=None): class JwksFetcher(): + CACHE_TTL = 600 # 10 min cache lifetime - def __init__(self, jwks_url, cache_ttl=JWKS_CACHE_TTL): + def __init__(self, jwks_url, cache_ttl=CACHE_TTL): self._jwks_url = jwks_url self._init_cache(cache_ttl) return From aa34bbc45f0aba1de5434f6f6ab6a934a8521492 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 5 May 2020 15:53:17 -0300 Subject: [PATCH 083/663] add docs to the introduced classes --- auth0/v3/authentication/token_verifier.py | 148 +++++++++++++++++++--- 1 file changed, 128 insertions(+), 20 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index b192295b..423ad7d7 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -20,14 +20,41 @@ class SignatureVerifier(): "require_nbf": False, } + """Abstract class that will verify a given JSON web token's signature + using the key fetched internally given its key id. + + Args: + algorithm (str): The expected signing algorithm (e.g. RS256). + """ + def __init__(self, algorithm): if not algorithm or type(algorithm) != str: raise ValueError("algorithm must be specified.") self._algorithm = algorithm + """Obtains the key associated to the given key id. + Must be implemented by subclasses. + + Args: + key_id (str, optional): The id of the key to fetch. + + Returns: + the key to use for verifying a cryptographic signature + """ + def _fetch_key(self, key_id=None): raise NotImplementedError + """Verifies the signature of the given JSON web token. + + Args: + token (str): The JWT to get its signature verified. + + Raises: + TokenValidationError: if the token cannot be decoded, the algorithm is invalid + or the token's signature doesn't match the calculated one. + """ + def verify_signature(self, token): try: header = jwt.get_unverified_header(token) @@ -36,19 +63,27 @@ def verify_signature(self, token): alg = header.get('alg', None) if alg != self._algorithm: - raise TokenValidationError('Signature algorithm of "{}" is not supported. Expected the ID token to be signed with "{}"'.format(alg, self._algorithm)) + raise TokenValidationError( + 'Signature algorithm of "{}" is not supported. Expected the ID token ' + 'to be signed with "{}"'.format(alg, self._algorithm)) kid = header.get('kid', None) secret_or_certificate = self._fetch_key(key_id=kid) try: - decoded = jwt.decode(jwt=token, key=secret_or_certificate, algorithms=[self._algorithm], options=self.DISABLE_JWT_CHECKS) + decoded = jwt.decode(jwt=token, key=secret_or_certificate, + algorithms=[self._algorithm], options=self.DISABLE_JWT_CHECKS) except jwt.exceptions.InvalidSignatureError: raise TokenValidationError("Invalid token signature.") return decoded class SymmetricSignatureVerifier(SignatureVerifier): + """Verifier for HMAC signatures, which rely on shared secrets. + + Args: + algorithm (str, optional): The expected signing algorithm. Defaults to "RS256". + """ def __init__(self, shared_secret, algorithm="HS256"): SignatureVerifier.__init__(self, algorithm) @@ -59,6 +94,11 @@ def _fetch_key(self, key_id=None): class AsymmetricSignatureVerifier(SignatureVerifier): + """Verifier for RSA signatures, which rely on public key certificates. + + Args: + algorithm (str, optional): The expected signing algorithm. Defaults to "HS256". + """ def __init__(self, jwks_url, algorithm="RS256", _jwks_fetcher=None): SignatureVerifier.__init__(self, algorithm) @@ -71,6 +111,14 @@ def _fetch_key(self, key_id=None): class JwksFetcher(): CACHE_TTL = 600 # 10 min cache lifetime + """Class that fetches and holds a JSON web key set. + This class makes use of an in-memory cache. For it to work properly, define this instance once and re-use it. + + Args: + jwks_url (str): The url where the JWK set is located. + cache_ttl (str, optional): The lifetime of the JWK set cache in seconds. Defaults to 600 seconds. + """ + def __init__(self, jwks_url, cache_ttl=CACHE_TTL): self._jwks_url = jwks_url self._init_cache(cache_ttl) @@ -82,6 +130,14 @@ def _init_cache(self, cache_ttl): self._cache_ttl = cache_ttl self._cache_is_fresh = False + """Attempts to obtain the JWK set from the cache, as long as it's still valid. + When not, it will perform a network request to the jwks_url to obtain a fresh result + and update the cache value with it. + + Args: + force (bool, optional): whether to ignore the cache and force a network request or not. Defaults to False. + """ + def _fetch_jwks(self, force=False): has_expired = self._cache_date + self._cache_ttl < time.time() @@ -102,6 +158,9 @@ def _fetch_jwks(self, force=False): self._cache_date = time.time() return self._cache_value + """Converts a JWK string representation into a binary certificate in PEM format. + """ + @staticmethod def _parse_jwks(jwks): keys = {} @@ -113,6 +172,18 @@ def _parse_jwks(jwks): keys[key["kid"]] = rsa_key return keys + """Obtains the JWK associated with the given key id. + + Args: + key_id (str): The id of the key to fetch. + + Returns: + the JWK associated with the given key id. + + Raises: + TokenValidationError: when a key with that id cannot be found + """ + def get_key(self, key_id): keys = self._fetch_jwks() @@ -127,6 +198,16 @@ def get_key(self, key_id): class TokenVerifier(): + """Class that verifies ID tokens following the steps defined in the OpenID Connect spec. + An OpenID Connect ID token is not meant to be consumed until it's verified. + + Args: + signature_verifier (SignatureVerifier): The instance that knows how to verify the signature. + issuer (str): The expected issuer claim value. + audience (str): The expected audience claim value. + leeway (int, optional): The clock skew to accept when verifying date related claims in seconds. + Defaults to 60 seconds. + """ def __init__(self, signature_verifier, issuer, audience, leeway=0, _clock=None): if not signature_verifier or not isinstance(signature_verifier, SignatureVerifier): @@ -140,14 +221,22 @@ def __init__(self, signature_verifier, issuer, audience, leeway=0, _clock=None): '_clock': _clock } + """Attempts to verify the given ID token, following the steps defined in the OpenID Connect spec. + + Args: + token (str): The JWT to verify. + nonce (str, optional): The nonce value sent during authentication. + max_age (int, optional): The max_age value sent during authentication. + + Raises: + TokenValidationError: when the token cannot be decoded, the token signing algorithm is not the expected one, + the token signature is invalid or the token has a claim missing or with unexpected value. + """ + def verify(self, token, nonce=None, max_age=None): # Verify token presence if not token or type(token) != str: raise TokenValidationError("ID token is required but missing.") - if nonce and type(nonce) != str: - raise TokenValidationError("Nonce not specified.") - if max_age and type(max_age) != int: - raise TokenValidationError("Max Age not specified.") opt = self._options.copy() opt['nonce'] = nonce @@ -162,7 +251,9 @@ def verify(self, token, nonce=None, max_age=None): if 'iss' not in payload or type(payload['iss']) != str: raise TokenValidationError('Issuer (iss) claim must be a string present in the ID token') if payload['iss'] != opt['iss']: - raise TokenValidationError('Issuer (iss) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['iss'], payload['iss'])) + raise TokenValidationError( + 'Issuer (iss) claim mismatch in the ID token; expected "{}", ' + 'found "{}"'.format(opt['iss'], payload['iss'])) # Subject if 'sub' not in payload or type(payload['sub']) != str: @@ -170,13 +261,18 @@ def verify(self, token, nonce=None, max_age=None): # Audience if 'aud' not in payload or not (type(payload['aud']) == str or type(payload['aud']) is list): - raise TokenValidationError('Audience (aud) claim must be a string or array of strings present in the ID token') + raise TokenValidationError( + 'Audience (aud) claim must be a string or array of strings present in the ID token') if type(payload['aud']) is list and not opt['aud'] in payload['aud']: payload_audiences = ", ".join(payload['aud']) - raise TokenValidationError('Audience (aud) claim mismatch in the ID token; expected "{}" but was not one of "{}"'.format(opt['aud'], payload_audiences)) + raise TokenValidationError( + 'Audience (aud) claim mismatch in the ID token; expected "{}" but was ' + 'not one of "{}"'.format(opt['aud'], payload_audiences)) elif type(payload['aud']) == str and payload['aud'] != opt['aud']: - raise TokenValidationError('Audience (aud) claim mismatch in the ID token; expected "{}" but found "{}"'.format(opt['aud'], payload['aud'])) + raise TokenValidationError( + 'Audience (aud) claim mismatch in the ID token; expected "{}" ' + 'but found "{}"'.format(opt['aud'], payload['aud'])) # --Time validation (epoch)-- now = opt['_clock'] or time.time() @@ -188,7 +284,9 @@ def verify(self, token, nonce=None, max_age=None): exp_time = payload['exp'] + leeway if now > exp_time: - raise TokenValidationError('Expiration Time (exp) claim error in the ID token; current time ({}) is after expiration time ({})'.format(now, exp_time)) + raise TokenValidationError( + 'Expiration Time (exp) claim error in the ID token; current time ({}) is ' + 'after expiration time ({})'.format(now, exp_time)) # Issued at if 'iat' not in payload or type(payload['iat']) != int: @@ -196,30 +294,40 @@ def verify(self, token, nonce=None, max_age=None): iat_time = payload['iat'] - leeway if now < iat_time: - raise TokenValidationError('Issued At (iat) claim error in the ID token; current time ({}) is before issued at time ({})'.format(now, iat_time)) + raise TokenValidationError( + 'Issued At (iat) claim error in the ID token; current time ({}) is ' + 'before issued at time ({})'.format(now, iat_time)) # Nonce if 'nonce' in opt and opt['nonce']: if 'nonce' not in payload or type(payload['nonce']) != str: raise TokenValidationError('Nonce (nonce) claim must be a string present in the ID token') if payload['nonce'] != opt['nonce']: - raise TokenValidationError('Nonce (nonce) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['nonce'], payload['nonce'])) + raise TokenValidationError( + 'Nonce (nonce) claim mismatch in the ID token; expected "{}", ' + 'found "{}"'.format(opt['nonce'], payload['nonce'])) # Authorized party if type(payload['aud']) is list and len(payload['aud']) > 1: if 'azp' not in payload or type(payload['azp']) != str: - raise TokenValidationError('Authorized Party (azp) claim must be a string present in the ID token when Audience (aud) claim has multiple values') + raise TokenValidationError( + 'Authorized Party (azp) claim must be a string present in the ID token when ' + 'Audience (aud) claim has multiple values') if payload['azp'] != opt['aud']: - raise TokenValidationError('Authorized Party (azp) claim mismatch in the ID token; expected "{}", found "{}"'.format(opt['aud'], payload['azp'])) + raise TokenValidationError( + 'Authorized Party (azp) claim mismatch in the ID token; expected "{}", ' + 'found "{}"'.format(opt['aud'], payload['azp'])) # Authentication time if 'max_age' in opt and opt['max_age']: if 'auth_time' not in payload or type(payload['auth_time']) != int: - raise TokenValidationError('Authentication Time (auth_time) claim must be a number present in the ID token when Max Age (max_age) is specified') + raise TokenValidationError( + 'Authentication Time (auth_time) claim must be a number present in the ID token ' + 'when Max Age (max_age) is specified') auth_valid_until = payload['auth_time'] + opt['max_age'] + leeway if now > auth_valid_until: - raise TokenValidationError('Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time ({}) is after last auth at ({})'.format(now, auth_valid_until)) - - - + raise TokenValidationError( + 'Authentication Time (auth_time) claim in the ID token indicates that too much ' + 'time has passed since the last end-user authentication. Current time ({}) ' + 'is after last auth at ({})'.format(now, auth_valid_until)) From 32a811ab8b3e7c44e9352cf43d0fdceaa078268d Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 5 May 2020 17:15:18 -0300 Subject: [PATCH 084/663] add usage notes to the README --- README.rst | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/README.rst b/README.rst index ad795945..1df1c822 100644 --- a/README.rst +++ b/README.rst @@ -156,6 +156,63 @@ For example: s.login(client_id='...', access_token='...', connection='facebook') +=================== +ID Token validation +=================== + +As the result of the authentication and among the credentials received, an ``id_token`` +might be present. This artifact contains information associated to the user that has +just logged in, provided the scope used contained ``openid``. You can read more +about ID tokens `here `_. + +Before you access their contents, you must first verify the ID token to ensure its +contents has not been tampered with and that is meant for your application to consume. + +For that purpose you use the ``TokenVerifier`` class, which requires to be passed +a few options: +* A ``SignatureVerifier`` instance, in charge of checking the expected algorithm +and signature. +* The expected issuer value, typically matches the Auth0 domain prefixed with +``https://`` and suffixed with ``/``. +* The expected audience value, typically matches the Auth0 application client ID. + +You choose the signature verifier depending on the signing algorithm used by your Auth0 application. +You can check its value under ``Advanced settings | OAuth | JsonWebToken Signature Algorithm``. +* For symmetric algorithms like "HS256", use the `SymmetricSignatureVerifier` class passing +as secret the client secret value for your Auth0 application. +* For asymmetric algorithms like "RS256", use the `AsymmetricSignatureVerifier` class passing +the public URL where the certificates for the public keys can be found. + +Auth0 hosts Public Keys inside the ``.well-known`` directory of your tenant's domain. +That URL looks like this: ``https://myaccount.auth0.com/.well-known/jwks.json``. +After replacing `myaccount.auth0.com` with your tenant's domain, you should be able +to access your tenant's public keys. + +It is recommended that you make use of asymmetric signing algorithms as their keys are easier +to rotate in case they need to be revoked. + +With all in place, the next snippets shows how to verify an RS256 signed ID token: + +.. code-block:: python + + from auth0.v3.authentication.token_verifier import TokenVerifier, AsymmetricSignatureVerifier + + domain = 'myaccount.auth0.com' + client_id = 'exampleid' + + # After authenticating + id_token = auth_result['id_token'] + + jwks_url = 'https://{}/.well-known/jwks.json'.format(domain) + issuer = 'https://{}/'.format(domain) + + sv = AsymmetricSignatureVerifier(jwks_url) # Reusable instance + tv = TokenVerifier(signature_verifier=sv, issuer=issuer, audience=client_id) + tv.verify(id_token) + +Provided something goes wrong, a ``TokenValidationError`` will be raised. In this +scenario, the ID token should be deemed invalid and its contents not be trusted. + Available Management Endpoints ============================== From bd0ddd61182a2914c5d17d29c690683b270a3a8e Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 6 May 2020 18:00:49 -0300 Subject: [PATCH 085/663] dont expose the visible for testing options as parameters --- auth0/v3/authentication/token_verifier.py | 10 +++--- .../authentication/test_token_verifier.py | 32 +++++++++++-------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index 423ad7d7..35a8b640 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -100,9 +100,9 @@ class AsymmetricSignatureVerifier(SignatureVerifier): algorithm (str, optional): The expected signing algorithm. Defaults to "HS256". """ - def __init__(self, jwks_url, algorithm="RS256", _jwks_fetcher=None): + def __init__(self, jwks_url, algorithm="RS256"): SignatureVerifier.__init__(self, algorithm) - self._fetcher = _jwks_fetcher or JwksFetcher(jwks_url) + self._fetcher = JwksFetcher(jwks_url) def _fetch_key(self, key_id=None): return self._fetcher.get_key(key_id) @@ -209,7 +209,7 @@ class TokenVerifier(): Defaults to 60 seconds. """ - def __init__(self, signature_verifier, issuer, audience, leeway=0, _clock=None): + def __init__(self, signature_verifier, issuer, audience, leeway=0): if not signature_verifier or not isinstance(signature_verifier, SignatureVerifier): raise TypeError("signature_verifier must be an instance of SignatureVerifier.") @@ -218,7 +218,7 @@ def __init__(self, signature_verifier, issuer, audience, leeway=0, _clock=None): 'iss': issuer, 'aud': audience, 'leeway': leeway, - '_clock': _clock + '_clock': None } """Attempts to verify the given ID token, following the steps defined in the OpenID Connect spec. @@ -275,7 +275,7 @@ def verify(self, token, nonce=None, max_age=None): 'but found "{}"'.format(opt['aud'], payload['aud'])) # --Time validation (epoch)-- - now = opt['_clock'] or time.time() + now = opt.get('_clock', time.time()) leeway = opt['leeway'] # Expires at diff --git a/auth0/v3/test/authentication/test_token_verifier.py b/auth0/v3/test/authentication/test_token_verifier.py index ca4ea8b0..1e0a7a75 100644 --- a/auth0/v3/test/authentication/test_token_verifier.py +++ b/auth0/v3/test/authentication/test_token_verifier.py @@ -68,7 +68,8 @@ def test_asymmetric_verifier_fetches_key(self): mock_fetcher.get_key = MagicMock('get_key') mock_fetcher.get_key.return_value = RSA_PUB_KEY_1_JWK - verifier = AsymmetricSignatureVerifier("some URL", _jwks_fetcher=mock_fetcher) + verifier = AsymmetricSignatureVerifier("some URL") + verifier._fetcher = mock_fetcher key = verifier._fetch_key('test-key') @@ -221,15 +222,15 @@ def asymmetric_signature_verifier_mock(): verifier._fetch_key.return_value = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(RSA_PUB_KEY_1_JWK)) return verifier - def assert_fails_with_error(self, token, error_message, signature_verifier=None, audience=expectations['audience'], issuer=expectations['issuer'], nonce=None, max_age=None, _clock=MOCKED_CLOCK): + def assert_fails_with_error(self, token, error_message, signature_verifier=None, audience=expectations['audience'], issuer=expectations['issuer'], nonce=None, max_age=None, clock=MOCKED_CLOCK): sv = signature_verifier or self.asymmetric_signature_verifier_mock() tv = TokenVerifier( signature_verifier=sv, issuer=issuer, audience=audience, - leeway=DEFAULT_LEEWAY, - _clock=_clock - ) + leeway=DEFAULT_LEEWAY + ) + tv._options['_clock'] = clock with self.assertRaises(TokenValidationError) as err: tv.verify(token, nonce, max_age) self.assertEqual(str(err.exception), error_message) @@ -261,8 +262,9 @@ def test_HS256_token_signature_passes(self): tv = TokenVerifier( signature_verifier=sv, issuer=expectations['issuer'], - audience=expectations['audience'], - _clock=MOCKED_CLOCK) + audience=expectations['audience'] + ) + tv._options['_clock'] = MOCKED_CLOCK tv.verify(token) def test_RS256_token_signature_passes(self): @@ -272,8 +274,9 @@ def test_RS256_token_signature_passes(self): tv = TokenVerifier( signature_verifier=sv, issuer=expectations['issuer'], - audience=expectations['audience'], - _clock=MOCKED_CLOCK) + audience=expectations['audience'] + ) + tv._options['_clock'] = MOCKED_CLOCK tv.verify(token) def test_HS256_token_signature_fails(self): @@ -320,7 +323,7 @@ def test_fails_with_exp_missing(self): def test_fails_with_exp_invalid(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NTkyNTYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.KUbd2s3Km-PVpP8KEJo1e0lyQv19TjiKMFX-lVebFoiPNwlVTXS08g5qe_G8pcOrwNfX6cRkRLbp7TNQ7tGDCuEcdia9KOaWeVWla5B3UPCv1qozCyMv4ZYrA0qdT2KgwytRMVWSov9ly29FSo6SRQksAMKZdnAzPaqnJGKBgVIjKN3a5ePIeX5yBIGxlNjS3nyWt8LIQJ9BFaQWk3i0vAKYpDeco3VLNLX-wH7739MzS7ll6t6LyuZi6kBaRG6XZc394glKidTvCp06ViQlPlcuV7JsCJfbkBc0AS5TmzOEdUCype-gzNqbuLcSXihS-qOx7Yjv8y3farV1_7qYqw" mocked_clock = MOCKED_CLOCK + DEFAULT_LEEWAY + 1 - self.assert_fails_with_error(token, 'Expiration Time (exp) claim error in the ID token; current time ({}) is after expiration time (1587592621)'.format(mocked_clock), _clock=mocked_clock) + self.assert_fails_with_error(token, 'Expiration Time (exp) claim error in the ID token; current time ({}) is after expiration time (1587592621)'.format(mocked_clock), clock=mocked_clock) def test_fails_with_iat_missing(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJub25jZSI6ImExYjJjM2Q0ZTUiLCJhenAiOiJ0b2tlbnMtdGVzdC0xMjMiLCJhdXRoX3RpbWUiOjE1ODc2Nzg5NjF9.CWW7mWUhiI-rramQ2dIGi7vBsOMmsouIg32IL9u2g4Dg3PV0C55R7dL6Jvf9hqaZXvx9Psrw0vLnOlhFztAC6LlQuq2eCaLYsDme36NxeYGC7CFXygvlU_eXD5IdNK35GriTfpG_b5hC7tl2glMmNQcZWlsIyKw7eq8o1POpqo0K2bCVjoyJkHL6WUpw6_08HPspmTL_Qd0km08z6zgvbl8Hpzk-tLmXqN7LjmuhEsjnIFphu-dGwcQsoY3RAomYxAFXAPYT8siEIf2w3zlIoUde-mujiMUtMD-Od7t7w36GO6Kubb9M9inVwPEg1yFKlFTXZBKXu91xmOmvMJ5Qfg" @@ -331,7 +334,7 @@ def test_fails_with_iat_invalid(self): mocked_clock = MOCKED_CLOCK - DEFAULT_LEEWAY - 1 self.assert_fails_with_error(token, 'Issued At (iat) claim error in the ID token; current time ({}) is before issued at time (1587765301)'.format( - mocked_clock), _clock=mocked_clock) + mocked_clock), clock=mocked_clock) def test_passes_when_nonce_missing_but_not_required(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.L-DveLCDf4Te7x3JZmQ6rCkUQrenl1NFpHqKD8Fs-glhd2iyc-TYffk1M30T0-wBri-3tTgraDAjZAjXuwSk0gV_V5uKCHyIoSRphrC88aX8IeECteQpHa4KR15lbzA5JdVhJu7LuCZ2EFvdjHh5GiViLRWsTSHGUM-uqcMK0q2kWGvCEgfOIXqocnQiyCNITxfgMYJd38zOsVeP7HFf9riuFEQz65oER22o3xyIZ-ILSaU10n6Ob559Rbjc0NVKH4hrggRg8kG7cJCiXbRxXnzO_VM8LmRHhF56jh3ZSrO4bzQa5xv04bMbX6A77muMZD0vghsaslvpWerWbwaSQQ" @@ -340,8 +343,9 @@ def test_passes_when_nonce_missing_but_not_required(self): tv = TokenVerifier( signature_verifier=sv, issuer=expectations['issuer'], - audience=expectations['audience'], - _clock=MOCKED_CLOCK) + audience=expectations['audience'] + ) + tv._options['_clock'] = MOCKED_CLOCK tv.verify(token) def test_fails_with_nonce_missing(self): @@ -371,4 +375,4 @@ def test_fails_when_max_age_sent_with_auth_time_invalid(self): expected_auth_time = MOCKED_CLOCK + DEFAULT_LEEWAY + max_age mocked_clock = expected_auth_time + 1 - self.assert_fails_with_error(token, "Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time ({}) is after last auth at ({})".format(mocked_clock, expected_auth_time), max_age=max_age, _clock=mocked_clock) + self.assert_fails_with_error(token, "Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time ({}) is after last auth at ({})".format(mocked_clock, expected_auth_time), max_age=max_age, clock=mocked_clock) From eb2f588d556567d75971b2c8f373950be7486a8b Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 6 May 2020 18:15:36 -0300 Subject: [PATCH 086/663] simplify the exception class definition --- auth0/v3/exceptions.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/auth0/v3/exceptions.py b/auth0/v3/exceptions.py index 2fe830f5..b086af3c 100644 --- a/auth0/v3/exceptions.py +++ b/auth0/v3/exceptions.py @@ -9,8 +9,4 @@ def __str__(self): class TokenValidationError(Exception): - def __init__(self, message): - self.message = message - - def __str__(self): - return self.message + pass From 256d3802a2e690138ae752260e8af80fb269175b Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 6 May 2020 18:58:06 -0300 Subject: [PATCH 087/663] use class attr for id token verifier arguments --- auth0/v3/authentication/token_verifier.py | 68 +++++++++---------- .../authentication/test_token_verifier.py | 9 +-- 2 files changed, 36 insertions(+), 41 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index 35a8b640..fbba3ef0 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -213,13 +213,11 @@ def __init__(self, signature_verifier, issuer, audience, leeway=0): if not signature_verifier or not isinstance(signature_verifier, SignatureVerifier): raise TypeError("signature_verifier must be an instance of SignatureVerifier.") - self._options = { - 'signature_verifier': signature_verifier, - 'iss': issuer, - 'aud': audience, - 'leeway': leeway, - '_clock': None - } + self.iss = issuer + self.aud = audience + self.leeway = leeway + self._sv = signature_verifier + self._clock = None # visible for testing """Attempts to verify the given ID token, following the steps defined in the OpenID Connect spec. @@ -235,51 +233,47 @@ def __init__(self, signature_verifier, issuer, audience, leeway=0): def verify(self, token, nonce=None, max_age=None): # Verify token presence - if not token or type(token) != str: + if not token or not isinstance(token, str): raise TokenValidationError("ID token is required but missing.") - opt = self._options.copy() - opt['nonce'] = nonce - opt['max_age'] = max_age - # Verify algorithm and signature - payload = opt['signature_verifier'].verify_signature(token) + payload = self._sv.verify_signature(token) # Verify claims # Issuer - if 'iss' not in payload or type(payload['iss']) != str: + if 'iss' not in payload or not isinstance(payload['iss'], str): raise TokenValidationError('Issuer (iss) claim must be a string present in the ID token') - if payload['iss'] != opt['iss']: + if payload['iss'] != self.iss: raise TokenValidationError( 'Issuer (iss) claim mismatch in the ID token; expected "{}", ' - 'found "{}"'.format(opt['iss'], payload['iss'])) + 'found "{}"'.format(self.iss, payload['iss'])) # Subject - if 'sub' not in payload or type(payload['sub']) != str: + if 'sub' not in payload or not isinstance(payload['sub'], str): raise TokenValidationError('Subject (sub) claim must be a string present in the ID token') # Audience - if 'aud' not in payload or not (type(payload['aud']) == str or type(payload['aud']) is list): + if 'aud' not in payload or not (isinstance(payload['aud'], str) or isinstance(payload['aud'], list)): raise TokenValidationError( 'Audience (aud) claim must be a string or array of strings present in the ID token') - if type(payload['aud']) is list and not opt['aud'] in payload['aud']: + if isinstance(payload['aud'], list) and not self.aud in payload['aud']: payload_audiences = ", ".join(payload['aud']) raise TokenValidationError( 'Audience (aud) claim mismatch in the ID token; expected "{}" but was ' - 'not one of "{}"'.format(opt['aud'], payload_audiences)) - elif type(payload['aud']) == str and payload['aud'] != opt['aud']: + 'not one of "{}"'.format(self.aud, payload_audiences)) + elif isinstance(payload['aud'], str) and payload['aud'] != self.aud: raise TokenValidationError( 'Audience (aud) claim mismatch in the ID token; expected "{}" ' - 'but found "{}"'.format(opt['aud'], payload['aud'])) + 'but found "{}"'.format(self.aud, payload['aud'])) # --Time validation (epoch)-- - now = opt.get('_clock', time.time()) - leeway = opt['leeway'] + now = self._clock or time.time() + leeway = self.leeway # Expires at - if 'exp' not in payload or type(payload['exp']) != int: + if 'exp' not in payload or not isinstance(payload['exp'], int): raise TokenValidationError('Expiration Time (exp) claim must be a number present in the ID token') exp_time = payload['exp'] + leeway @@ -289,7 +283,7 @@ def verify(self, token, nonce=None, max_age=None): 'after expiration time ({})'.format(now, exp_time)) # Issued at - if 'iat' not in payload or type(payload['iat']) != int: + if 'iat' not in payload or not isinstance(payload['iat'], int): raise TokenValidationError('Issued At (iat) claim must be a number present in the ID token') iat_time = payload['iat'] - leeway @@ -299,33 +293,33 @@ def verify(self, token, nonce=None, max_age=None): 'before issued at time ({})'.format(now, iat_time)) # Nonce - if 'nonce' in opt and opt['nonce']: - if 'nonce' not in payload or type(payload['nonce']) != str: + if nonce: + if 'nonce' not in payload or not isinstance(payload['nonce'], str): raise TokenValidationError('Nonce (nonce) claim must be a string present in the ID token') - if payload['nonce'] != opt['nonce']: + if payload['nonce'] != nonce: raise TokenValidationError( 'Nonce (nonce) claim mismatch in the ID token; expected "{}", ' - 'found "{}"'.format(opt['nonce'], payload['nonce'])) + 'found "{}"'.format(nonce, payload['nonce'])) # Authorized party - if type(payload['aud']) is list and len(payload['aud']) > 1: - if 'azp' not in payload or type(payload['azp']) != str: + if isinstance(payload['aud'], list) and len(payload['aud']) > 1: + if 'azp' not in payload or not isinstance(payload['azp'], str): raise TokenValidationError( 'Authorized Party (azp) claim must be a string present in the ID token when ' 'Audience (aud) claim has multiple values') - if payload['azp'] != opt['aud']: + if payload['azp'] != self.aud: raise TokenValidationError( 'Authorized Party (azp) claim mismatch in the ID token; expected "{}", ' - 'found "{}"'.format(opt['aud'], payload['azp'])) + 'found "{}"'.format(self.aud, payload['azp'])) # Authentication time - if 'max_age' in opt and opt['max_age']: - if 'auth_time' not in payload or type(payload['auth_time']) != int: + if max_age: + if 'auth_time' not in payload or not isinstance(payload['auth_time'], int): raise TokenValidationError( 'Authentication Time (auth_time) claim must be a number present in the ID token ' 'when Max Age (max_age) is specified') - auth_valid_until = payload['auth_time'] + opt['max_age'] + leeway + auth_valid_until = payload['auth_time'] + max_age + leeway if now > auth_valid_until: raise TokenValidationError( 'Authentication Time (auth_time) claim in the ID token indicates that too much ' diff --git a/auth0/v3/test/authentication/test_token_verifier.py b/auth0/v3/test/authentication/test_token_verifier.py index 1e0a7a75..9174c7f0 100644 --- a/auth0/v3/test/authentication/test_token_verifier.py +++ b/auth0/v3/test/authentication/test_token_verifier.py @@ -230,7 +230,7 @@ def assert_fails_with_error(self, token, error_message, signature_verifier=None, audience=audience, leeway=DEFAULT_LEEWAY ) - tv._options['_clock'] = clock + tv._clock = clock with self.assertRaises(TokenValidationError) as err: tv.verify(token, nonce, max_age) self.assertEqual(str(err.exception), error_message) @@ -238,6 +238,7 @@ def assert_fails_with_error(self, token, error_message, signature_verifier=None, def test_fails_at_creation_with_invalid_signature_verifier(self): sv = "string is not an instance of signature verifier" with self.assertRaises(TypeError) as err: + # noinspection PyTypeChecker TokenVerifier(signature_verifier=sv, issuer="valid issuer", audience="valid audience") self.assertEqual(str(err.exception), "signature_verifier must be an instance of SignatureVerifier.") @@ -264,7 +265,7 @@ def test_HS256_token_signature_passes(self): issuer=expectations['issuer'], audience=expectations['audience'] ) - tv._options['_clock'] = MOCKED_CLOCK + tv._clock = MOCKED_CLOCK tv.verify(token) def test_RS256_token_signature_passes(self): @@ -276,7 +277,7 @@ def test_RS256_token_signature_passes(self): issuer=expectations['issuer'], audience=expectations['audience'] ) - tv._options['_clock'] = MOCKED_CLOCK + tv._clock = MOCKED_CLOCK tv.verify(token) def test_HS256_token_signature_fails(self): @@ -345,7 +346,7 @@ def test_passes_when_nonce_missing_but_not_required(self): issuer=expectations['issuer'], audience=expectations['audience'] ) - tv._options['_clock'] = MOCKED_CLOCK + tv._clock = MOCKED_CLOCK tv.verify(token) def test_fails_with_nonce_missing(self): From 0f24064ee1da2c5a62aab59be31c8c1d75163db7 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 6 May 2020 18:59:38 -0300 Subject: [PATCH 088/663] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: José Padilla --- auth0/v3/authentication/token_verifier.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index fbba3ef0..05a4f5fa 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -86,7 +86,7 @@ class SymmetricSignatureVerifier(SignatureVerifier): """ def __init__(self, shared_secret, algorithm="HS256"): - SignatureVerifier.__init__(self, algorithm) + super(SymmetricSignatureVerifier, self).__init__(algorithm) self._shared_secret = shared_secret def _fetch_key(self, key_id=None): @@ -101,7 +101,7 @@ class AsymmetricSignatureVerifier(SignatureVerifier): """ def __init__(self, jwks_url, algorithm="RS256"): - SignatureVerifier.__init__(self, algorithm) + super(AsymmetricSignatureVerifier, self).__init__(algorithm) self._fetcher = JwksFetcher(jwks_url) def _fetch_key(self, key_id=None): From ad5acc69fa4d303800b2822f2ff4edc333735900 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 6 May 2020 19:42:46 -0300 Subject: [PATCH 089/663] fix 2.7 tests by checking str claims against unicode and str --- auth0/v3/authentication/token_verifier.py | 28 +++++++++++++------ .../authentication/test_token_verifier.py | 1 - 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index 05a4f5fa..0e1e7aa7 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -7,7 +7,7 @@ from auth0.v3.exceptions import TokenValidationError -class SignatureVerifier(): +class SignatureVerifier(object): DISABLE_JWT_CHECKS = { "verify_signature": True, "verify_exp": False, @@ -108,7 +108,7 @@ def _fetch_key(self, key_id=None): return self._fetcher.get_key(key_id) -class JwksFetcher(): +class JwksFetcher(object): CACHE_TTL = 600 # 10 min cache lifetime """Class that fetches and holds a JSON web key set. @@ -240,9 +240,19 @@ def verify(self, token, nonce=None, max_age=None): payload = self._sv.verify_signature(token) # Verify claims - # Issuer + self._verify_payload(payload, nonce, max_age) - if 'iss' not in payload or not isinstance(payload['iss'], str): + def _verify_payload(self, payload, nonce=None, max_age=None): + try: + # on Python 2.7, 'str' keys as parsed as 'unicode' + # But 'unicode' was removed on Python 3.7 + # noinspection PyUnresolvedReferences + ustr = unicode + except NameError: + ustr = str + + # Issuer + if 'iss' not in payload or not isinstance(payload['iss'], (str, ustr)): raise TokenValidationError('Issuer (iss) claim must be a string present in the ID token') if payload['iss'] != self.iss: raise TokenValidationError( @@ -250,11 +260,11 @@ def verify(self, token, nonce=None, max_age=None): 'found "{}"'.format(self.iss, payload['iss'])) # Subject - if 'sub' not in payload or not isinstance(payload['sub'], str): + if 'sub' not in payload or not isinstance(payload['sub'], (str, ustr)): raise TokenValidationError('Subject (sub) claim must be a string present in the ID token') # Audience - if 'aud' not in payload or not (isinstance(payload['aud'], str) or isinstance(payload['aud'], list)): + if 'aud' not in payload or not (isinstance(payload['aud'], (str, ustr)) or isinstance(payload['aud'], list)): raise TokenValidationError( 'Audience (aud) claim must be a string or array of strings present in the ID token') @@ -263,7 +273,7 @@ def verify(self, token, nonce=None, max_age=None): raise TokenValidationError( 'Audience (aud) claim mismatch in the ID token; expected "{}" but was ' 'not one of "{}"'.format(self.aud, payload_audiences)) - elif isinstance(payload['aud'], str) and payload['aud'] != self.aud: + elif isinstance(payload['aud'], (str, ustr)) and payload['aud'] != self.aud: raise TokenValidationError( 'Audience (aud) claim mismatch in the ID token; expected "{}" ' 'but found "{}"'.format(self.aud, payload['aud'])) @@ -294,7 +304,7 @@ def verify(self, token, nonce=None, max_age=None): # Nonce if nonce: - if 'nonce' not in payload or not isinstance(payload['nonce'], str): + if 'nonce' not in payload or not isinstance(payload['nonce'], (str, ustr)): raise TokenValidationError('Nonce (nonce) claim must be a string present in the ID token') if payload['nonce'] != nonce: raise TokenValidationError( @@ -303,7 +313,7 @@ def verify(self, token, nonce=None, max_age=None): # Authorized party if isinstance(payload['aud'], list) and len(payload['aud']) > 1: - if 'azp' not in payload or not isinstance(payload['azp'], str): + if 'azp' not in payload or not isinstance(payload['azp'], (str, ustr)): raise TokenValidationError( 'Authorized Party (azp) claim must be a string present in the ID token when ' 'Audience (aud) claim has multiple values') diff --git a/auth0/v3/test/authentication/test_token_verifier.py b/auth0/v3/test/authentication/test_token_verifier.py index 9174c7f0..7d58b18c 100644 --- a/auth0/v3/test/authentication/test_token_verifier.py +++ b/auth0/v3/test/authentication/test_token_verifier.py @@ -29,7 +29,6 @@ } -# Run with: python -m unittest discover -s auth0 -p 'test_token_*' class TestSignatureVerifier(unittest.TestCase): def test_fail_at_creation_with_invalid_algorithm(self): From d6a96fcc5735876279a7456dee76ddeee60b24ad Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 15 May 2020 20:37:52 -0300 Subject: [PATCH 090/663] Release 3.10.0 --- CHANGELOG.md | 6 ++++++ auth0/__init__.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57f2a291..f77ae8ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changes ======= +3.10.0 +------------------ + +**Security** +- Improved OIDC compliance [\#213](https://github.com/auth0/auth0-python/pull/213) ([lbalmaceda](https://github.com/lbalmaceda)) + 3.9.2 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index bc7856cc..3f3750c9 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.9.2' +__version__ = '3.10.0' From af0c61b41eaede987078b768a04eddfd42eb390f Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 29 May 2020 15:15:19 -0300 Subject: [PATCH 091/663] add note about DELETE /users (all users) being unavailable --- auth0/v3/management/users.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 6bc78303..6353970a 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -1,4 +1,5 @@ from .rest import RestClient +import warnings class Users(object): @@ -87,9 +88,11 @@ def create(self, body): def delete_all_users(self): """Deletes all users (USE WITH CAUTION). + Deprecation: This endpoint is no longer available server-side. Args: """ + warnings.warn("DELETE all users endpoint is no longer available.", DeprecationWarning) return self.client.delete(self._url()) def get(self, id, fields=None, include_fields=True): From b5fd8bbcf553acc076a0bce2ca4d9afab4c6a3d9 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 23 Jun 2020 17:31:43 -0300 Subject: [PATCH 092/663] handle rate limit errors exposing the reset header value --- auth0/v3/authentication/base.py | 19 ++++++++++++------- auth0/v3/exceptions.py | 6 ++++++ auth0/v3/management/rest.py | 26 +++++++++++++++++--------- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/auth0/v3/authentication/base.py b/auth0/v3/authentication/base.py index bfb770f7..056c4b5e 100644 --- a/auth0/v3/authentication/base.py +++ b/auth0/v3/authentication/base.py @@ -3,14 +3,12 @@ import sys import platform import requests -from ..exceptions import Auth0Error - +from ..exceptions import Auth0Error, RateLimitError UNKNOWN_ERROR = 'a0.sdk.internal.unknown' class AuthenticationBase(object): - """Base authentication object providing simple REST methods. Args: @@ -69,12 +67,19 @@ def _parse(self, response): class Response(object): - def __init__(self, status_code, content): + def __init__(self, status_code, content, headers): self._status_code = status_code self._content = content + self._headers = headers def content(self): if self._is_error(): + if self._status_code == 429: + reset_at = int(self._headers.get('x-ratelimit-reset', '-1')) + raise RateLimitError(error_code=self._error_code(), + message=self._error_message(), + reset_at=reset_at) + raise Auth0Error(status_code=self._status_code, error_code=self._error_code(), message=self._error_message()) @@ -95,7 +100,7 @@ def _error_message(self): class JsonResponse(Response): def __init__(self, response): content = json.loads(response.text) - super(JsonResponse, self).__init__(response.status_code, content) + super(JsonResponse, self).__init__(response.status_code, content, response.headers) def _error_code(self): if 'error' in self._content: @@ -111,7 +116,7 @@ def _error_message(self): class PlainResponse(Response): def __init__(self, response): - super(PlainResponse, self).__init__(response.status_code, response.text) + super(PlainResponse, self).__init__(response.status_code, response.text, response.headers) def _error_code(self): return UNKNOWN_ERROR @@ -122,7 +127,7 @@ def _error_message(self): class EmptyResponse(Response): def __init__(self, status_code): - super(EmptyResponse, self).__init__(status_code, '') + super(EmptyResponse, self).__init__(status_code, '', {}) def _error_code(self): return UNKNOWN_ERROR diff --git a/auth0/v3/exceptions.py b/auth0/v3/exceptions.py index b086af3c..789d2a0f 100644 --- a/auth0/v3/exceptions.py +++ b/auth0/v3/exceptions.py @@ -8,5 +8,11 @@ def __str__(self): return '{}: {}'.format(self.status_code, self.message) +class RateLimitError(Auth0Error): + def __init__(self, error_code, message, reset_at): + super(RateLimitError, self).__init__(status_code=429, error_code=error_code, message=message) + self.reset_at = reset_at + + class TokenValidationError(Exception): pass diff --git a/auth0/v3/management/rest.py b/auth0/v3/management/rest.py index 8e6fd20e..e8dc1fa5 100644 --- a/auth0/v3/management/rest.py +++ b/auth0/v3/management/rest.py @@ -1,16 +1,16 @@ -import sys -import platform -import json import base64 +import json +import platform +import sys + import requests -from ..exceptions import Auth0Error +from ..exceptions import Auth0Error, RateLimitError UNKNOWN_ERROR = 'a0.sdk.internal.unknown' class RestClient(object): - """Provides simple methods for handling all RESTful api endpoints. Args: @@ -21,6 +21,7 @@ class RestClient(object): both values separately or a float to set both to it. (defaults to 5.0 for both) """ + def __init__(self, jwt, telemetry=True, timeout=5.0): self.jwt = jwt self.timeout = timeout @@ -96,12 +97,19 @@ def _parse(self, response): class Response(object): - def __init__(self, status_code, content): + def __init__(self, status_code, content, headers): self._status_code = status_code self._content = content + self._headers = headers def content(self): if self._is_error(): + if self._status_code == 429: + reset_at = int(self._headers.get('x-ratelimit-reset', '-1')) + raise RateLimitError(error_code=self._error_code(), + message=self._error_message(), + reset_at=reset_at) + raise Auth0Error(status_code=self._status_code, error_code=self._error_code(), message=self._error_message()) @@ -122,7 +130,7 @@ def _error_message(self): class JsonResponse(Response): def __init__(self, response): content = json.loads(response.text) - super(JsonResponse, self).__init__(response.status_code, content) + super(JsonResponse, self).__init__(response.status_code, content, response.headers) def _error_code(self): if 'errorCode' in self._content: @@ -141,7 +149,7 @@ def _error_message(self): class PlainResponse(Response): def __init__(self, response): - super(PlainResponse, self).__init__(response.status_code, response.text) + super(PlainResponse, self).__init__(response.status_code, response.text, response.headers) def _error_code(self): return UNKNOWN_ERROR @@ -152,7 +160,7 @@ def _error_message(self): class EmptyResponse(Response): def __init__(self, status_code): - super(EmptyResponse, self).__init__(status_code, '') + super(EmptyResponse, self).__init__(status_code, '', {}) def _error_code(self): return UNKNOWN_ERROR From bae687a89b6fbbfa546fe33db4bb1c87d5d5f46c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 23 Jun 2020 17:57:19 -0300 Subject: [PATCH 093/663] add tests for rate limit --- auth0/v3/test/authentication/test_base.py | 37 ++++++++++++++++++----- auth0/v3/test/management/test_rest.py | 25 ++++++++++++++- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/auth0/v3/test/authentication/test_base.py b/auth0/v3/test/authentication/test_base.py index b2426a17..e1defc25 100644 --- a/auth0/v3/test/authentication/test_base.py +++ b/auth0/v3/test/authentication/test_base.py @@ -7,7 +7,7 @@ import requests import unittest from ...authentication.base import AuthenticationBase -from ...exceptions import Auth0Error +from ...exceptions import Auth0Error, RateLimitError class TestBase(unittest.TestCase): @@ -27,7 +27,7 @@ def test_telemetry_enabled_by_default(self): sys.version_info.micro) client_info = { - 'name': 'auth0-python', + 'name': 'auth0-python', 'version': auth0_version, 'env': { 'python': python_version @@ -53,10 +53,10 @@ def test_post(self, mock_post): data = ab.post('the-url', data={'a': 'b'}, headers={'c': 'd'}) mock_post.assert_called_with(url='the-url', json={'a': 'b'}, - headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=(10, 2)) + headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=(10, 2)) self.assertEqual(data, {'x': 'y'}) - + @mock.patch('requests.post') def test_post_with_defaults(self, mock_post): ab = AuthenticationBase('auth0.com', telemetry=False) @@ -68,7 +68,7 @@ def test_post_with_defaults(self, mock_post): data = ab.post('the-url') mock_post.assert_called_with(url='the-url', json=None, - headers={'Content-Type': 'application/json'}, timeout=5.0) + headers={'Content-Type': 'application/json'}, timeout=5.0) self.assertEqual(data, {'x': 'y'}) @@ -109,6 +109,29 @@ def test_post_error(self, mock_post): self.assertEqual(context.exception.error_code, 'e0') self.assertEqual(context.exception.message, 'desc') + @mock.patch('requests.post') + def test_post_rate_limit_error(self, mock_post): + ab = AuthenticationBase('auth0.com', telemetry=False) + + mock_post.return_value.text = '{"statusCode": 429,' \ + ' "error": "e0",' \ + ' "error_description": "desc"}' + mock_post.return_value.status_code = 429 + mock_post.return_value.headers = { + 'x-ratelimit-limit': '3', + 'x-ratelimit-remaining': '6', + 'x-ratelimit-reset': '9', + } + + with self.assertRaises(Auth0Error) as context: + ab.post('the-url', data={'a': 'b'}, headers={'c': 'd'}) + + self.assertEqual(context.exception.status_code, 429) + self.assertEqual(context.exception.error_code, 'e0') + self.assertEqual(context.exception.message, 'desc') + self.assertIsInstance(context.exception, RateLimitError) + self.assertEqual(context.exception.reset_at, 9) + @mock.patch('requests.post') def test_post_error_with_code_property(self, mock_post): ab = AuthenticationBase('auth0.com', telemetry=False) @@ -184,7 +207,7 @@ def test_get(self, mock_get): data = ab.get('the-url', params={'a': 'b'}, headers={'c': 'd'}) mock_get.assert_called_with(url='the-url', params={'a': 'b'}, - headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=(10, 2)) + headers={'c': 'd', 'Content-Type': 'application/json'}, timeout=(10, 2)) self.assertEqual(data, {'x': 'y'}) @@ -199,7 +222,7 @@ def test_get_with_defaults(self, mock_get): data = ab.get('the-url') mock_get.assert_called_with(url='the-url', params=None, - headers={'Content-Type': 'application/json'}, timeout=5.0) + headers={'Content-Type': 'application/json'}, timeout=5.0) self.assertEqual(data, {'x': 'y'}) diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index 4d3ac5b9..5adf85d8 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -7,7 +7,7 @@ import requests from ...management.rest import RestClient -from ...exceptions import Auth0Error +from ...exceptions import Auth0Error, RateLimitError class TestRest(unittest.TestCase): @@ -149,6 +149,29 @@ def test_get_errors(self, mock_get): self.assertEqual(context.exception.error_code, 'code') self.assertEqual(context.exception.message, 'message') + @mock.patch('requests.get') + def test_get_rate_limit_error(self, mock_get): + rc = RestClient(jwt='a-token', telemetry=False) + + mock_get.return_value.text = '{"statusCode": 429,' \ + ' "errorCode": "code",' \ + ' "message": "message"}' + mock_get.return_value.status_code = 429 + mock_get.return_value.headers = { + 'x-ratelimit-limit': '3', + 'x-ratelimit-remaining': '6', + 'x-ratelimit-reset': '9', + } + + with self.assertRaises(Auth0Error) as context: + rc.get('the/url') + + self.assertEqual(context.exception.status_code, 429) + self.assertEqual(context.exception.error_code, 'code') + self.assertEqual(context.exception.message, 'message') + self.assertIsInstance(context.exception, RateLimitError) + self.assertEqual(context.exception.reset_at, 9) + @mock.patch('requests.post') def test_post(self, mock_post): rc = RestClient(jwt='a-token', telemetry=False) From 4e385cb35a05c226013867c7bd049172903e343e Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 23 Jun 2020 19:12:37 -0300 Subject: [PATCH 094/663] add test case for missing headers --- auth0/v3/test/authentication/test_base.py | 19 ++++++++++++++ auth0/v3/test/management/test_rest.py | 32 ++++++++++++++++++----- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/auth0/v3/test/authentication/test_base.py b/auth0/v3/test/authentication/test_base.py index e1defc25..31b6027e 100644 --- a/auth0/v3/test/authentication/test_base.py +++ b/auth0/v3/test/authentication/test_base.py @@ -132,6 +132,25 @@ def test_post_rate_limit_error(self, mock_post): self.assertIsInstance(context.exception, RateLimitError) self.assertEqual(context.exception.reset_at, 9) + @mock.patch('requests.post') + def test_post_rate_limit_error_without_headers(self, mock_post): + ab = AuthenticationBase('auth0.com', telemetry=False) + + mock_post.return_value.text = '{"statusCode": 429,' \ + ' "error": "e0",' \ + ' "error_description": "desc"}' + mock_post.return_value.status_code = 429 + mock_post.return_value.headers = {} + + with self.assertRaises(Auth0Error) as context: + ab.post('the-url', data={'a': 'b'}, headers={'c': 'd'}) + + self.assertEqual(context.exception.status_code, 429) + self.assertEqual(context.exception.error_code, 'e0') + self.assertEqual(context.exception.message, 'desc') + self.assertIsInstance(context.exception, RateLimitError) + self.assertEqual(context.exception.reset_at, -1) + @mock.patch('requests.post') def test_post_error_with_code_property(self, mock_post): ab = AuthenticationBase('auth0.com', telemetry=False) diff --git a/auth0/v3/test/management/test_rest.py b/auth0/v3/test/management/test_rest.py index 5adf85d8..05a88acc 100644 --- a/auth0/v3/test/management/test_rest.py +++ b/auth0/v3/test/management/test_rest.py @@ -172,6 +172,25 @@ def test_get_rate_limit_error(self, mock_get): self.assertIsInstance(context.exception, RateLimitError) self.assertEqual(context.exception.reset_at, 9) + @mock.patch('requests.get') + def test_get_rate_limit_error_without_headers(self, mock_get): + rc = RestClient(jwt='a-token', telemetry=False) + + mock_get.return_value.text = '{"statusCode": 429,' \ + ' "errorCode": "code",' \ + ' "message": "message"}' + mock_get.return_value.status_code = 429 + + mock_get.return_value.headers = {} + with self.assertRaises(Auth0Error) as context: + rc.get('the/url') + + self.assertEqual(context.exception.status_code, 429) + self.assertEqual(context.exception.error_code, 'code') + self.assertEqual(context.exception.message, 'message') + self.assertIsInstance(context.exception, RateLimitError) + self.assertEqual(context.exception.reset_at, -1) + @mock.patch('requests.post') def test_post(self, mock_post): rc = RestClient(jwt='a-token', telemetry=False) @@ -335,7 +354,6 @@ def test_file_post_content_type_is_none(self, mock_post): mock_post.assert_called_once_with('the-url', data=data, files=files, headers=headers, timeout=5.0) - @mock.patch('requests.put') def test_put(self, mock_put): rc = RestClient(jwt='a-token', telemetry=False) @@ -349,7 +367,7 @@ def test_put(self, mock_put): response = rc.put(url='the-url', data=data) mock_put.assert_called_with('the-url', json=data, - headers=headers, timeout=5.0) + headers=headers, timeout=5.0) self.assertEqual(response, ['a', 'b']) @@ -358,8 +376,8 @@ def test_put_errors(self, mock_put): rc = RestClient(jwt='a-token', telemetry=False) mock_put.return_value.text = '{"statusCode": 999,' \ - ' "errorCode": "code",' \ - ' "message": "message"}' + ' "errorCode": "code",' \ + ' "message": "message"}' mock_put.return_value.status_code = 999 with self.assertRaises(Auth0Error) as context: @@ -430,7 +448,7 @@ def test_delete_with_body_and_params(self, mock_delete): mock_delete.return_value.status_code = 200 data = {'some': 'data'} - params={'A': 'param', 'B': 'param'} + params = {'A': 'param', 'B': 'param'} response = rc.delete(url='the-url/ID', params=params, data=data) mock_delete.assert_called_with('the-url/ID', headers=headers, params=params, json=data, timeout=5.0) @@ -459,7 +477,7 @@ def test_disabled_telemetry(self): 'Content-Type': 'application/json', 'Authorization': 'Bearer a-token', } - + self.assertEqual(rc.base_headers, expected_headers) def test_enabled_telemetry(self): @@ -477,7 +495,7 @@ def test_enabled_telemetry(self): sys.version_info.micro) client_info = { - 'name': 'auth0-python', + 'name': 'auth0-python', 'version': auth0_version, 'env': { 'python': python_version From 99ee54be58ae63576163271aa4928fa3d1b7c17c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 23 Jun 2020 19:30:50 -0300 Subject: [PATCH 095/663] add an error handling note to the readme --- README.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.rst b/README.rst index 1df1c822..68e01331 100644 --- a/README.rst +++ b/README.rst @@ -213,6 +213,16 @@ With all in place, the next snippets shows how to verify an RS256 signed ID toke Provided something goes wrong, a ``TokenValidationError`` will be raised. In this scenario, the ID token should be deemed invalid and its contents not be trusted. +============== +Error Handling +============== + +When consuming methods from the API clients, the requests could fail for a number of reasons: +- Invalid data sent as part of the request: An ``Auth0Error` is raised with the error code and description. +- Global or Client Rate Limit reached: A ``RateLimitError`` is raised and the time at which the limit +resets is exposed in the ``reset_at`` property. When the header is unset, this value will be ``-1``. +- Network timeouts: Adjustable by passing a the ``timeout`` argument to the client. See the `rate limit docs `_ for details. + Available Management Endpoints ============================== From 13a87e72351676aa6c14c84d9fc4ea5b5832ad3b Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 24 Jun 2020 12:05:55 -0300 Subject: [PATCH 096/663] Apply suggestions from code review Co-authored-by: Adam Mcgrath --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 68e01331..c80209ad 100644 --- a/README.rst +++ b/README.rst @@ -221,7 +221,7 @@ When consuming methods from the API clients, the requests could fail for a numbe - Invalid data sent as part of the request: An ``Auth0Error` is raised with the error code and description. - Global or Client Rate Limit reached: A ``RateLimitError`` is raised and the time at which the limit resets is exposed in the ``reset_at`` property. When the header is unset, this value will be ``-1``. -- Network timeouts: Adjustable by passing a the ``timeout`` argument to the client. See the `rate limit docs `_ for details. +- Network timeouts: Adjustable by passing a ``timeout`` argument to the client. See the `rate limit docs `_ for details. Available Management Endpoints ============================== From 6dd2798f179237599daabb4578319d7ff0cd786c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 24 Jun 2020 16:30:33 -0300 Subject: [PATCH 097/663] add send_completion_email to users import job --- auth0/v3/management/jobs.py | 15 +++++++++++++-- auth0/v3/test/management/test_jobs.py | 10 +++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index eeb2dd4c..6e9c0bba 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -72,7 +72,7 @@ def export_users(self, body): """ return self.client.post(self._url('users-exports'), data=body) - def import_users(self, connection_id, file_obj, upsert=False): + def import_users(self, connection_id, file_obj, upsert=False, send_completion_email=True): """Imports users to a connection from a file. Args: @@ -82,10 +82,21 @@ def import_users(self, connection_id, file_obj, upsert=False): file_obj (file): A file-like object to upload. The format for this file is explained in: https://auth0.com/docs/bulk-import + upsert (bool): When set to False, pre-existing users that match on email address, user ID, or username + will fail. When set to True, pre-existing users that match on any of these fields will be updated, but + only with upsertable attributes. Defaults to False. + For a list of user profile fields that can be upserted during import, see the following article + https://auth0.com/docs/users/references/user-profile-structure#user-profile-attributes + + send_completion_email (bool): When set to True, an email will be sent to notify the completion of this job. + When set to False, no email will be sent. Defaults to True. + See: https://auth0.com/docs/api/management/v2#!/Jobs/post_users_imports """ return self.client.file_post(self._url('users-imports'), - data={'connection_id': connection_id, 'upsert': str(upsert).lower()}, + data={'connection_id': connection_id, + 'upsert': str(upsert).lower(), + 'send_completion_email': str(send_completion_email).lower()}, files={'users': file_obj}) def send_verification_email(self, body): diff --git a/auth0/v3/test/management/test_jobs.py b/auth0/v3/test/management/test_jobs.py index ad49ddf4..b30d7803 100644 --- a/auth0/v3/test/management/test_jobs.py +++ b/auth0/v3/test/management/test_jobs.py @@ -65,21 +65,21 @@ def test_import_users(self, mock_rc): mock_instance.file_post.assert_called_with( 'https://domain/api/v2/jobs/users-imports', - data={'connection_id': '1234', 'upsert': 'false'}, + data={'connection_id': '1234', 'upsert': 'false', 'send_completion_email': 'true'}, files={'users': {}} ) - j.import_users(connection_id='1234', file_obj={}, upsert=True) + j.import_users(connection_id='1234', file_obj={}, upsert=True, send_completion_email=False) mock_instance.file_post.assert_called_with( 'https://domain/api/v2/jobs/users-imports', - data={'connection_id': '1234', 'upsert': 'true'}, + data={'connection_id': '1234', 'upsert': 'true', 'send_completion_email': 'false'}, files={'users': {}} ) - j.import_users(connection_id='1234', file_obj={}, upsert=False) + j.import_users(connection_id='1234', file_obj={}, upsert=False, send_completion_email=True) mock_instance.file_post.assert_called_with( 'https://domain/api/v2/jobs/users-imports', - data={'connection_id': '1234', 'upsert': 'false'}, + data={'connection_id': '1234', 'upsert': 'false', 'send_completion_email': 'true'}, files={'users': {}} ) From 1866d217b27826591102411a68ac541a8080f61a Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 25 Jun 2020 10:25:46 -0300 Subject: [PATCH 098/663] add missing entry to the changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f77ae8ec..e5d29516 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ Changes **Security** - Improved OIDC compliance [\#213](https://github.com/auth0/auth0-python/pull/213) ([lbalmaceda](https://github.com/lbalmaceda)) +**Added** +- Add connect/read timeout option [\#215](https://github.com/auth0/auth0-python/pull/215) ([lbalmaceda](https://github.com/lbalmaceda)) + 3.9.2 ------------------ From 3a22ca58342ed4afda3643919d6eccf57eb1fc5e Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 25 Jun 2020 10:27:44 -0300 Subject: [PATCH 099/663] Release 3.11.0 --- CHANGELOG.md | 10 ++++++++++ auth0/__init__.py | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5d29516..5159df52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ Changes ======= +3.11.0 +------------------ + +**Added** +- Add send_completion_email to users import job [\#220](https://github.com/auth0/auth0-python/pull/220) ([lbalmaceda](https://github.com/lbalmaceda)) +- Expose the time at which the Rate Limit will reset [\#219](https://github.com/auth0/auth0-python/pull/219) ([lbalmaceda](https://github.com/lbalmaceda)) + +**Removed** +- Add deprecation note for DELETE /users (all users) [\#217](https://github.com/auth0/auth0-python/pull/217) ([lbalmaceda](https://github.com/lbalmaceda)) + 3.10.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 3f3750c9..b8b2efb8 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.10.0' +__version__ = '3.11.0' From 1d895a78abfb9319bc6b0e04e3b13a08494c2192 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 29 Jun 2020 18:12:35 -0300 Subject: [PATCH 100/663] stop checking iat value. keep presence check --- auth0/v3/authentication/token_verifier.py | 6 ------ auth0/v3/test/authentication/test_token_verifier.py | 7 ------- 2 files changed, 13 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index 0e1e7aa7..70a42ea3 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -296,12 +296,6 @@ def _verify_payload(self, payload, nonce=None, max_age=None): if 'iat' not in payload or not isinstance(payload['iat'], int): raise TokenValidationError('Issued At (iat) claim must be a number present in the ID token') - iat_time = payload['iat'] - leeway - if now < iat_time: - raise TokenValidationError( - 'Issued At (iat) claim error in the ID token; current time ({}) is ' - 'before issued at time ({})'.format(now, iat_time)) - # Nonce if nonce: if 'nonce' not in payload or not isinstance(payload['nonce'], (str, ustr)): diff --git a/auth0/v3/test/authentication/test_token_verifier.py b/auth0/v3/test/authentication/test_token_verifier.py index 7d58b18c..293f2606 100644 --- a/auth0/v3/test/authentication/test_token_verifier.py +++ b/auth0/v3/test/authentication/test_token_verifier.py @@ -329,13 +329,6 @@ def test_fails_with_iat_missing(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJub25jZSI6ImExYjJjM2Q0ZTUiLCJhenAiOiJ0b2tlbnMtdGVzdC0xMjMiLCJhdXRoX3RpbWUiOjE1ODc2Nzg5NjF9.CWW7mWUhiI-rramQ2dIGi7vBsOMmsouIg32IL9u2g4Dg3PV0C55R7dL6Jvf9hqaZXvx9Psrw0vLnOlhFztAC6LlQuq2eCaLYsDme36NxeYGC7CFXygvlU_eXD5IdNK35GriTfpG_b5hC7tl2glMmNQcZWlsIyKw7eq8o1POpqo0K2bCVjoyJkHL6WUpw6_08HPspmTL_Qd0km08z6zgvbl8Hpzk-tLmXqN7LjmuhEsjnIFphu-dGwcQsoY3RAomYxAFXAPYT8siEIf2w3zlIoUde-mujiMUtMD-Od7t7w36GO6Kubb9M9inVwPEg1yFKlFTXZBKXu91xmOmvMJ5Qfg" self.assert_fails_with_error(token, 'Issued At (iat) claim must be a number present in the ID token') - def test_fails_with_iat_invalid(self): - token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc3NjUzNjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.hVFs3ix49ZIrUCr9EM4CrjYvwxemsHOqhZdjzOmy9suQOe8xG0NzEdlRcxuCt8Exdqrrd2lu4iPFqUgwudjMFZT5f-1YE9AdvLqqDyBRVRPu2dV5SP4QbO4OAjMvNq-yfoRQ4kEuIfBnz56l6imB-tNgfbSveOzHzTPapE6vSlVnI03jlDR91qoEpda1XCXreKhar4lsTNBsuAP6mA313DHaErvyhoBlsq3lEh7vXafFlegl5DMuEmNmzgAO3JO-mpn0J2nBfZOvUQIkf9ITs09zYrxE0fZ3M6J7tIhd13UvaJuNDXbfX1zzyhjAHqgmlkd25o2IZIBVC51NQv483g" - mocked_clock = MOCKED_CLOCK - DEFAULT_LEEWAY - 1 - self.assert_fails_with_error(token, - 'Issued At (iat) claim error in the ID token; current time ({}) is before issued at time (1587765301)'.format( - mocked_clock), clock=mocked_clock) - def test_passes_when_nonce_missing_but_not_required(self): token = "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.L-DveLCDf4Te7x3JZmQ6rCkUQrenl1NFpHqKD8Fs-glhd2iyc-TYffk1M30T0-wBri-3tTgraDAjZAjXuwSk0gV_V5uKCHyIoSRphrC88aX8IeECteQpHa4KR15lbzA5JdVhJu7LuCZ2EFvdjHh5GiViLRWsTSHGUM-uqcMK0q2kWGvCEgfOIXqocnQiyCNITxfgMYJd38zOsVeP7HFf9riuFEQz65oER22o3xyIZ-ILSaU10n6Ob559Rbjc0NVKH4hrggRg8kG7cJCiXbRxXnzO_VM8LmRHhF56jh3ZSrO4bzQa5xv04bMbX6A77muMZD0vghsaslvpWerWbwaSQQ" From 5f9373f520f7eb5cf8572dfc835f075d81681f55 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 29 Jun 2020 15:41:49 -0300 Subject: [PATCH 101/663] add missing external_id property to the import users job --- auth0/v3/management/jobs.py | 8 +++++--- auth0/v3/test/management/test_jobs.py | 8 ++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index 6e9c0bba..aa7cde47 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -2,7 +2,6 @@ class Jobs(object): - """Auth0 jobs endpoints Args: @@ -72,7 +71,7 @@ def export_users(self, body): """ return self.client.post(self._url('users-exports'), data=body) - def import_users(self, connection_id, file_obj, upsert=False, send_completion_email=True): + def import_users(self, connection_id, file_obj, upsert=False, send_completion_email=True, external_id=None): """Imports users to a connection from a file. Args: @@ -91,12 +90,15 @@ def import_users(self, connection_id, file_obj, upsert=False, send_completion_em send_completion_email (bool): When set to True, an email will be sent to notify the completion of this job. When set to False, no email will be sent. Defaults to True. + external_id (str): Customer-defined ID. + See: https://auth0.com/docs/api/management/v2#!/Jobs/post_users_imports """ return self.client.file_post(self._url('users-imports'), data={'connection_id': connection_id, 'upsert': str(upsert).lower(), - 'send_completion_email': str(send_completion_email).lower()}, + 'send_completion_email': str(send_completion_email).lower(), + 'external_id': external_id}, files={'users': file_obj}) def send_verification_email(self, body): diff --git a/auth0/v3/test/management/test_jobs.py b/auth0/v3/test/management/test_jobs.py index b30d7803..e589019b 100644 --- a/auth0/v3/test/management/test_jobs.py +++ b/auth0/v3/test/management/test_jobs.py @@ -65,21 +65,21 @@ def test_import_users(self, mock_rc): mock_instance.file_post.assert_called_with( 'https://domain/api/v2/jobs/users-imports', - data={'connection_id': '1234', 'upsert': 'false', 'send_completion_email': 'true'}, + data={'connection_id': '1234', 'upsert': 'false', 'send_completion_email': 'true', 'external_id': None}, files={'users': {}} ) - j.import_users(connection_id='1234', file_obj={}, upsert=True, send_completion_email=False) + j.import_users(connection_id='1234', file_obj={}, upsert=True, send_completion_email=False, external_id="ext-id-123") mock_instance.file_post.assert_called_with( 'https://domain/api/v2/jobs/users-imports', - data={'connection_id': '1234', 'upsert': 'true', 'send_completion_email': 'false'}, + data={'connection_id': '1234', 'upsert': 'true', 'send_completion_email': 'false', 'external_id': 'ext-id-123'}, files={'users': {}} ) j.import_users(connection_id='1234', file_obj={}, upsert=False, send_completion_email=True) mock_instance.file_post.assert_called_with( 'https://domain/api/v2/jobs/users-imports', - data={'connection_id': '1234', 'upsert': 'false', 'send_completion_email': 'true'}, + data={'connection_id': '1234', 'upsert': 'false', 'send_completion_email': 'true', 'external_id': None}, files={'users': {}} ) From 2f7b42910f56667d5e64c7860e6f2e95727b5a39 Mon Sep 17 00:00:00 2001 From: will mclafferty Date: Wed, 1 Jul 2020 16:49:18 -0700 Subject: [PATCH 102/663] fix docstrings for A/SymmetricSignatureVerifiers --- auth0/v3/authentication/token_verifier.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index 70a42ea3..e86938aa 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -82,7 +82,8 @@ class SymmetricSignatureVerifier(SignatureVerifier): """Verifier for HMAC signatures, which rely on shared secrets. Args: - algorithm (str, optional): The expected signing algorithm. Defaults to "RS256". + shared_secret (str): The shared secret used to decode the token. + algorithm (str, optional): The expected signing algorithm. Defaults to "HS256". """ def __init__(self, shared_secret, algorithm="HS256"): @@ -97,7 +98,8 @@ class AsymmetricSignatureVerifier(SignatureVerifier): """Verifier for RSA signatures, which rely on public key certificates. Args: - algorithm (str, optional): The expected signing algorithm. Defaults to "HS256". + jwks_url (str): The url where the JWK set is located. + algorithm (str, optional): The expected signing algorithm. Defaults to "RS256". """ def __init__(self, jwks_url, algorithm="RS256"): From c46a3ca0fc13ebb06016f5262d09f2b3e2ac6e86 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 7 Jul 2020 17:01:16 -0300 Subject: [PATCH 103/663] add missing optional properties for the user signup endpoint --- auth0/v3/authentication/database.py | 36 ++++++++++++-- auth0/v3/test/authentication/test_database.py | 48 +++++++++++-------- 2 files changed, 59 insertions(+), 25 deletions(-) diff --git a/auth0/v3/authentication/database.py b/auth0/v3/authentication/database.py index f8673849..bc57de88 100644 --- a/auth0/v3/authentication/database.py +++ b/auth0/v3/authentication/database.py @@ -1,9 +1,9 @@ -from .base import AuthenticationBase import warnings +from .base import AuthenticationBase -class Database(AuthenticationBase): +class Database(AuthenticationBase): """Database & Active Directory / LDAP Authentication. Args: @@ -35,10 +35,10 @@ def login(self, client_id, username, password, connection, id_token=None, } ) - def signup(self, client_id, email, password, connection, username=None, - user_metadata=None): + def signup(self, client_id, email, password, connection, username=None, user_metadata=None, + given_name=None, family_name=None, name=None, nickname=None, picture=None): """Signup using email and password. - + Args: client_id (str): ID of the application to use. @@ -53,6 +53,17 @@ def signup(self, client_id, email, password, connection, username=None, user_metadata (dict, optional): Additional key-value information to store for the user. Some limitations apply, see: https://auth0.com/docs/metadata#metadata-restrictions + given_name (str, optional): The user's given name(s). + + family_name (str, optional): The user's family name(s). + + name (str, optional): The user's full name. + + nickname (str, optional): The user's nickname. + + picture (str, optional): A URI pointing to the user's picture. + + See: https://auth0.com/docs/api/authentication#signup """ body = { @@ -64,6 +75,21 @@ def signup(self, client_id, email, password, connection, username=None, 'user_metadata': user_metadata } + if username: + body.update({'username': username}) + if user_metadata: + body.update({'user_metadata': user_metadata}) + if given_name: + body.update({'given_name': given_name}) + if family_name: + body.update({'family_name': family_name}) + if name: + body.update({'name': name}) + if nickname: + body.update({'nickname': nickname}) + if picture: + body.update({'picture': picture}) + return self.post( 'https://{}/dbconnections/signup'.format(self.domain), data=body diff --git a/auth0/v3/test/authentication/test_database.py b/auth0/v3/test/authentication/test_database.py index 0291f2f9..3966b414 100644 --- a/auth0/v3/test/authentication/test_database.py +++ b/auth0/v3/test/authentication/test_database.py @@ -1,5 +1,7 @@ import unittest + import mock + from ...authentication.database import Database @@ -7,7 +9,6 @@ class TestDatabase(unittest.TestCase): @mock.patch('auth0.v3.authentication.database.Database.post') def test_login(self, mock_post): - d = Database('my.domain.com') d.login(client_id='cid', @@ -35,7 +36,6 @@ def test_login(self, mock_post): @mock.patch('auth0.v3.authentication.database.Database.post') def test_signup(self, mock_post): - d = Database('my.domain.com') # using only email and password @@ -48,16 +48,15 @@ def test_signup(self, mock_post): self.assertEqual(args[0], 'https://my.domain.com/dbconnections/signup') self.assertEqual(kwargs['data'], { - 'client_id': 'cid', - 'email': 'a@b.com', - 'password': 'pswd', - 'connection': 'conn', - 'username': None, - 'user_metadata': None - }) - + 'client_id': 'cid', + 'email': 'a@b.com', + 'password': 'pswd', + 'connection': 'conn', + 'username': None, + 'user_metadata': None + }) - # Using also username and metadata + # Using also optional properties sample_meta = { 'hobby': 'surfing', 'preference': { @@ -69,23 +68,32 @@ def test_signup(self, mock_post): password='pswd', connection='conn', username='usr', - user_metadata=sample_meta) + user_metadata=sample_meta, + given_name='john', + family_name='doe', + name='john doe', + nickname='johnny', + picture='avatars.com/john-doe') args, kwargs = mock_post.call_args self.assertEqual(args[0], 'https://my.domain.com/dbconnections/signup') self.assertEqual(kwargs['data'], { - 'client_id': 'cid', - 'email': 'a@b.com', - 'password': 'pswd', - 'connection': 'conn', - 'username': 'usr', - 'user_metadata': sample_meta - }) + 'client_id': 'cid', + 'email': 'a@b.com', + 'password': 'pswd', + 'connection': 'conn', + 'username': 'usr', + 'user_metadata': sample_meta, + 'given_name': 'john', + 'family_name': 'doe', + 'name': 'john doe', + 'nickname': 'johnny', + 'picture': 'avatars.com/john-doe', + }) @mock.patch('auth0.v3.authentication.database.Database.post') def test_change_password(self, mock_post): - d = Database('my.domain.com') d.change_password(client_id='cid', From a6dbdd792167cafc4c1f5f9503e69f7899c11793 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 7 Jul 2020 17:48:46 -0300 Subject: [PATCH 104/663] improve docs formatting, defaultt values and behavior --- README.rst | 4 ++ auth0/v3/management/__init__.py | 4 +- auth0/v3/management/auth0.py | 8 +-- auth0/v3/management/blacklists.py | 4 +- auth0/v3/management/client_grants.py | 22 ++++--- auth0/v3/management/clients.py | 31 +++++----- auth0/v3/management/connections.py | 27 ++++---- auth0/v3/management/custom_domains.py | 16 ++--- auth0/v3/management/device_credentials.py | 15 ++--- auth0/v3/management/email_templates.py | 6 +- auth0/v3/management/emails.py | 15 +++-- auth0/v3/management/grants.py | 18 +++--- auth0/v3/management/guardian.py | 54 ++++++++-------- auth0/v3/management/jobs.py | 22 ++++--- auth0/v3/management/logs.py | 23 +++---- auth0/v3/management/resource_servers.py | 22 ++++--- auth0/v3/management/roles.py | 44 +++++++------ auth0/v3/management/rules.py | 31 +++++----- auth0/v3/management/rules_configs.py | 8 +-- auth0/v3/management/stats.py | 5 +- auth0/v3/management/tenants.py | 11 ++-- auth0/v3/management/tickets.py | 9 ++- auth0/v3/management/user_blocks.py | 1 - auth0/v3/management/users.py | 75 ++++++++++++++--------- auth0/v3/management/users_by_email.py | 5 +- 25 files changed, 260 insertions(+), 220 deletions(-) diff --git a/README.rst b/README.rst index c80209ad..d405e164 100644 --- a/README.rst +++ b/README.rst @@ -229,15 +229,19 @@ Available Management Endpoints - Blacklists() ( ``Auth0().blacklists`` ) - Clients() ( ``Auth0().clients`` ) - ClientGrants() ( ``Auth0().client_grants`` ) +- CustomDomains() ( ``Auth0().custom_domains`` ) - Connections() ( ``Auth0().connections`` ) - DeviceCredentials() ( ``Auth0().device_credentials`` ) - Emails() ( ``Auth0().emails`` ) - EmailTemplates() ( ``Auth0().email_templates`` ) +- Grants() ( ``Auth0().grants`` ) - Guardian() ( ``Auth0().guardian`` ) - Jobs() ( ``Auth0().jobs`` ) - Logs() ( ``Auth0().logs`` ) - ResourceServers() (``Auth0().resource_servers`` ) +- Roles() ( ``Auth0().roles`` ) - Rules() ( ``Auth0().rules`` ) +- RulesConfigs() ( ``Auth0().rules_configs`` ) - Stats() ( ``Auth0().stats`` ) - Tenants() ( ``Auth0().tenants`` ) - Tickets() ( ``Auth0().tickets`` ) diff --git a/auth0/v3/management/__init__.py b/auth0/v3/management/__init__.py index 3c8c0325..547425fe 100644 --- a/auth0/v3/management/__init__.py +++ b/auth0/v3/management/__init__.py @@ -1,12 +1,12 @@ from .auth0 import Auth0 from .blacklists import Blacklists -from .clients import Clients from .client_grants import ClientGrants +from .clients import Clients from .connections import Connections from .custom_domains import CustomDomains from .device_credentials import DeviceCredentials -from .emails import Emails from .email_templates import EmailTemplates +from .emails import Emails from .grants import Grants from .guardian import Guardian from .jobs import Jobs diff --git a/auth0/v3/management/auth0.py b/auth0/v3/management/auth0.py index f51ef693..3b4d425f 100644 --- a/auth0/v3/management/auth0.py +++ b/auth0/v3/management/auth0.py @@ -1,12 +1,12 @@ -from .grants import Grants -from .custom_domains import CustomDomains from .blacklists import Blacklists -from .clients import Clients from .client_grants import ClientGrants +from .clients import Clients from .connections import Connections +from .custom_domains import CustomDomains from .device_credentials import DeviceCredentials -from .emails import Emails from .email_templates import EmailTemplates +from .emails import Emails +from .grants import Grants from .guardian import Guardian from .jobs import Jobs from .logs import Logs diff --git a/auth0/v3/management/blacklists.py b/auth0/v3/management/blacklists.py index c1fe86bb..0b8a76c8 100644 --- a/auth0/v3/management/blacklists.py +++ b/auth0/v3/management/blacklists.py @@ -44,11 +44,11 @@ def create(self, jti, aud=''): Args: jti (str): the jti of the JWT to blacklist. + aud (str, optional): The JWT's aud claim. The client_id of the application for which it was issued. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Blacklists/post_tokens + See: https://auth0.com/docs/api/management/v2#!/Blacklists/post_tokens """ return self.client.post(self.url, data={'jti': jti, 'aud': aud}) diff --git a/auth0/v3/management/client_grants.py b/auth0/v3/management/client_grants.py index b64ae820..3c16904e 100644 --- a/auth0/v3/management/client_grants.py +++ b/auth0/v3/management/client_grants.py @@ -2,7 +2,6 @@ class ClientGrants(object): - """Auth0 client grants endpoints Args: @@ -34,16 +33,18 @@ def all(self, audience=None, page=None, per_page=None, include_totals=False, cli Args: audience (str, optional): URL encoded audience of a Resource Server - to filter + to filter. - page (int, optional): The result's page number (zero based). + page (int, optional): The result's page number (zero based). When not set, + the default value is up to the server. - per_page (int, optional): The amount of entries per page. + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to False. - client_id (string, optional): The id of a client to filter + client_id (string, optional): The id of a client to filter. See: https://auth0.com/docs/api/management/v2#!/Client_Grants/get_client_grants """ @@ -63,7 +64,8 @@ def create(self, body): Args: body (dict): Attributes for the new client grant. - See: https://auth0.com/docs/api/management/v2#!/Client_Grants/post_client_grants + + See: https://auth0.com/docs/api/management/v2#!/Client_Grants/post_client_grants """ return self.client.post(self._url(), data=body) @@ -74,7 +76,6 @@ def delete(self, id): Args: id (str): Id of client grant to delete. - See: https://auth0.com/docs/api/management/v2#!/Client_Grants/delete_client_grants_by_id """ @@ -86,8 +87,9 @@ def update(self, id, body): Args: id (str): The id of the client grant to modify. - body (dict): Attributes to modify. - See: https://auth0.com/docs/api/management/v2#!/Client_Grants/patch_client_grants_by_id + body (dict): Attributes to update. + + See: https://auth0.com/docs/api/management/v2#!/Client_Grants/patch_client_grants_by_id """ return self.client.patch(self._url(id), data=body) diff --git a/auth0/v3/management/clients.py b/auth0/v3/management/clients.py index 3bedd589..2360c917 100644 --- a/auth0/v3/management/clients.py +++ b/auth0/v3/management/clients.py @@ -2,7 +2,6 @@ class Clients(object): - """Auth0 applications endpoints Args: @@ -37,21 +36,22 @@ def all(self, fields=None, include_fields=True, page=None, per_page=None, extra_ Args: fields (list of str, optional): A list of fields to include or - exclude from the result (depending on include_fields). Empty to + exclude from the result (depending on include_fields). Leave empty to retrieve all fields. include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. - page (int): The result's page number (zero based). + page (int): The result's page number (zero based). When not set, + the default value is up to the server. - per_page (int, optional): The amount of entries per page. + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. extra_params (dictionary, optional): The extra parameters to add to the request. The fields, include_fields, page and per_page values specified as parameters take precedence over the ones defined here. - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients """ params = extra_params or {} @@ -67,7 +67,8 @@ def create(self, body): Args: body (dict): Attributes for the new application. - See: https://auth0.com/docs/api/v2#!/Clients/post_clients + + See: https://auth0.com/docs/api/v2#!/Clients/post_clients """ return self.client.post(self._url(), data=body) @@ -82,12 +83,11 @@ def get(self, id, fields=None, include_fields=True): id (str): Id of the application to get. fields (list of str, optional): A list of fields to include or - exclude from the result (depending on include_fields). Empty to + exclude from the result (depending on include_fields). Leave empty to retrieve all fields. include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise. - + to be included in the result, False otherwise. Defaults to True. See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients_by_id """ @@ -103,7 +103,6 @@ def delete(self, id): Args: id (str): Id of application to delete. - See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id """ @@ -119,7 +118,8 @@ def update(self, id, body): id (str): Client ID of the application. body (dict): Attributes to modify. - See: https://auth0.com/docs/api/management/v2#!/Clients/patch_clients_by_id + + See: https://auth0.com/docs/api/management/v2#!/Clients/patch_clients_by_id """ return self.client.patch(self._url(id), data=body) @@ -130,11 +130,10 @@ def rotate_secret(self, id): Args: id (str): Client ID of the application. - body (dict): Attributes to modify. - See: https://auth0.com/docs/api/management/v2#!/Clients/post_rotate_secret + See: https://auth0.com/docs/api/management/v2#!/Clients/post_rotate_secret """ - data = {'id': id } + data = {'id': id} url = self._url('%s/rotate-secret' % id) - return self.client.post(url, data=data) \ No newline at end of file + return self.client.post(url, data=data) diff --git a/auth0/v3/management/connections.py b/auth0/v3/management/connections.py index 3c372df8..a32953cc 100644 --- a/auth0/v3/management/connections.py +++ b/auth0/v3/management/connections.py @@ -36,15 +36,17 @@ def all(self, strategy=None, fields=None, include_fields=True, page=None, per_pa this strategy type. (e.g: strategy='amazon') fields (list of str, optional): A list of fields to include or - exclude from the result (depending on include_fields). Empty to - retrieve all fields. + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. By default, all the fields will be retrieved. include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. - page (int): The result's page number (zero based). + page (int): The result's page number (zero based). When not set, + the default value is up to the server. - per_page (int, optional): The amount of entries per page. + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. extra_params (dictionary, optional): The extra parameters to add to the request. The fields, include_fields, page and per_page values @@ -72,11 +74,11 @@ def get(self, id, fields=None, include_fields=True): id (str): Id of the connection to get. fields (list of str, optional): A list of fields to include or - exclude from the result (depending on include_fields). Empty to - retrieve all fields. + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. By default, all the fields will be retrieved. include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. See: https://auth0.com/docs/api/management/v2#!/Connections/get_connections_by_id @@ -109,9 +111,9 @@ def update(self, id, body): Args: id: Id of the connection. - body (dict): Specifies which fields are to be modified, and to what - values. - See: https://auth0.com/docs/api/management/v2#!/Connections/patch_connections_by_id + body (dict): Specifies which fields are to be modified, and to what values. + + See: https://auth0.com/docs/api/management/v2#!/Connections/patch_connections_by_id Returns: The modified connection object. @@ -125,7 +127,8 @@ def create(self, body): Args: body (dict): Attributes used to create the connection. Mandatory attributes are: 'name' and 'strategy'. - See: https://auth0.com/docs/api/management/v2#!/Connections/post_connections + + See: https://auth0.com/docs/api/management/v2#!/Connections/post_connections """ return self.client.post(self._url(), data=body) diff --git a/auth0/v3/management/custom_domains.py b/auth0/v3/management/custom_domains.py index c31f19d3..c463da8d 100644 --- a/auth0/v3/management/custom_domains.py +++ b/auth0/v3/management/custom_domains.py @@ -2,7 +2,6 @@ class CustomDomains(object): - """Auth0 custom domains endpoints Args: @@ -48,8 +47,7 @@ def delete(self, id): """Deletes a grant. Args: - id (str): The id of the custom domain to delete - + id (str): The id of the custom domain to delete. See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/delete_custom_domains_by_id """ @@ -57,24 +55,22 @@ def delete(self, id): return self.client.delete(url) def create_new(self, body): - """Configure a new custom domain + """Configure a new custom domain. Args: - body (str): The domain, tye and verification method in json - + body (str): The domain, tye and verification method in json. See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/post_custom_domains """ return self.client.post(self._url(), data=body) def verify(self, id): - """Verify a custom domain + """Verify a custom domain. Args: - id (str): The id of the custom domain to delete - + id (str): The id of the custom domain to delete. See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/post_verify """ url = self._url('%s/verify' % (id)) - return self.client.post(url) \ No newline at end of file + return self.client.post(url) diff --git a/auth0/v3/management/device_credentials.py b/auth0/v3/management/device_credentials.py index 6b7b31d3..ff49bf3e 100644 --- a/auth0/v3/management/device_credentials.py +++ b/auth0/v3/management/device_credentials.py @@ -2,7 +2,6 @@ class DeviceCredentials(object): - """Auth0 connection endpoints Args: @@ -40,13 +39,11 @@ def get(self, user_id, client_id, type, fields=None, include_fields=True): type (str): The type of credentials (public_key, refresh_token). fields (list, optional): A list of fields to include or exclude - (depending on include_fields) from the result, empty to - retrieve all fields + (depending on include_fields) from the result. Leave empty to + retrieve all fields. include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise - (defaults to true) - + to be included in the result, False otherwise. Defaults to True. See: https://auth0.com/docs/api/management/v2#!/Device_Credentials/get_device_credentials """ @@ -66,7 +63,8 @@ def create(self, body): Args: body (dict): parameters for creating the public key (e.g: type, device_name, client_id, etc). - Please see: https://auth0.com/docs/api/v2#!/Device_Credentials/post_device_credentials + + See: https://auth0.com/docs/api/v2#!/Device_Credentials/post_device_credentials """ return self.client.post(self._url(), data=body) @@ -74,8 +72,7 @@ def delete(self, id): """Delete credential. Args: - id (str): The id of the credential to delete - + id (str): The id of the credential to delete. See: https://auth0.com/docs/api/management/v2#!/Device_Credentials/delete_device_credentials_by_id """ diff --git a/auth0/v3/management/email_templates.py b/auth0/v3/management/email_templates.py index dcda2bfa..47fc68d4 100644 --- a/auth0/v3/management/email_templates.py +++ b/auth0/v3/management/email_templates.py @@ -2,7 +2,6 @@ class EmailTemplates(object): - """Auth0 email templates endpoints Args: @@ -34,7 +33,8 @@ def create(self, body): Args: body (dict): Attributes for the new email template. - See: https://auth0.com/docs/api/management/v2#!/Email_Templates/post_email_templates + + See: https://auth0.com/docs/api/management/v2#!/Email_Templates/post_email_templates """ return self.client.post(self._url(), data=body) @@ -63,8 +63,8 @@ def update(self, template_name, body): 'change_password', 'password_reset', 'mfa_oob_code'. body (dict): Attributes to update on the email template. - See: https://auth0.com/docs/api/management/v2#!/Email_Templates/patch_email_templates_by_templateName + See: https://auth0.com/docs/api/management/v2#!/Email_Templates/patch_email_templates_by_templateName """ return self.client.patch(self._url(template_name), data=body) diff --git a/auth0/v3/management/emails.py b/auth0/v3/management/emails.py index e88f4e73..99342128 100644 --- a/auth0/v3/management/emails.py +++ b/auth0/v3/management/emails.py @@ -2,7 +2,6 @@ class Emails(object): - """Auth0 email endpoints Args: @@ -34,11 +33,11 @@ def get(self, fields=None, include_fields=True): Args: fields (list of str, optional): A list of fields to include or - exclude from the result (depending on include_fields). Empty - to retrieve all fields. + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. See: https://auth0.com/docs/api/management/v2#!/Emails/get_provider """ @@ -51,7 +50,9 @@ def config(self, body): """Configure the email provider. Args: - body (dict): Please see: https://auth0.com/docs/api/v2#!/Emails/post_provider + body (dict): attributes of the created email provider. + + See: https://auth0.com/docs/api/v2#!/Emails/post_provider """ return self.client.post(self._url(), data=body) @@ -66,6 +67,8 @@ def update(self, body): """Update the email provider. Args: - body (dict): Please see: https://auth0.com/docs/api/v2#!/Emails/patch_provider + body (dict): attributes to update on the email provider + + See: https://auth0.com/docs/api/v2#!/Emails/patch_provider """ return self.client.patch(self._url(), data=body) diff --git a/auth0/v3/management/grants.py b/auth0/v3/management/grants.py index d80c4f48..a5d8b4f7 100644 --- a/auth0/v3/management/grants.py +++ b/auth0/v3/management/grants.py @@ -2,7 +2,6 @@ class Grants(object): - """Auth0 grants endpoints Args: @@ -33,16 +32,18 @@ def all(self, page=None, per_page=None, include_totals=False, extra_params=None) """Retrieves all grants. Args: - page (int, optional): The result's page number (zero based). + page (int, optional): The result's page number (zero based). When not set, + the default value is up to the server. - per_page (int, optional): The amount of entries per page. + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to False. extra_params (dictionary, optional): The extra parameters to add to - the request. The page, per_page, and include_totals values - specified as parameters take precedence over the ones defined here. + the request. The page, per_page, and include_totals values + specified as parameters take precedence over the ones defined here. See: https://auth0.com/docs/api/management/v2#!/Grants/get_grants """ @@ -59,10 +60,9 @@ def delete(self, id): """Deletes a grant. Args: - id (str): The id of the grant to delete - + id (str): The id of the grant to delete. See: https://auth0.com/docs/api/management/v2#!/Grants/delete_grants_by_id """ url = self._url('%s' % (id)) - return self.client.delete(url) \ No newline at end of file + return self.client.delete(url) diff --git a/auth0/v3/management/guardian.py b/auth0/v3/management/guardian.py index ff77a60a..01f64568 100644 --- a/auth0/v3/management/guardian.py +++ b/auth0/v3/management/guardian.py @@ -2,7 +2,6 @@ class Guardian(object): - """Auth0 guardian endpoints Args: @@ -39,13 +38,15 @@ def all_factors(self): return self.client.get(self._url('factors')) def update_factor(self, name, body): - """Update Guardian factor - Useful to enable / disable factor + """Update Guardian factor. + Useful to enable / disable factor. Args: - name (str): Either push-notification or sms + name (str): Either push-notification or sms. + body (dict): Attributes to modify. - See: https://auth0.com/docs/api/management/v2#!/Guardian/put_factors_by_name + + See: https://auth0.com/docs/api/management/v2#!/Guardian/put_factors_by_name """ url = self._url('factors/{}'.format(name)) return self.client.put(url, data=body) @@ -53,22 +54,22 @@ def update_factor(self, name, body): def update_templates(self, body): """Update enrollment and verification SMS templates. - Useful to send custom messages on sms enrollment and verification + Useful to send custom messages on sms enrollment and verification. Args: body (dict): Attributes to modify. - See: https://auth0.com/docs/api/management/v2#!/Guardian/put_templates + + See: https://auth0.com/docs/api/management/v2#!/Guardian/put_templates """ return self.client.put(self._url('factors/sms/templates'), data=body) def get_templates(self): - """Get enrollment and verification templates + """Get enrollment and verification templates. Retrieve both templates. Useful to check if a different template than default was set. - See: https://auth0.com/docs/api/management/v2#!/Guardian/get_templates """ @@ -79,8 +80,7 @@ def get_enrollment(self, id): Useful to check its type and related metadata. Args: - id (str): The id of the device account to update - + id (str): The id of the device account to update. See: https://auth0.com/docs/api/management/v2#!/Guardian/get_enrollments_by_id """ @@ -93,8 +93,7 @@ def delete_enrollment(self, id): Useful when you want to force re-enroll. Args: - id (str): The id of the device account to update - + id (str): The id of the device account to update. See: https://auth0.com/docs/api/management/v2#!/Guardian/delete_enrollments_by_id """ @@ -105,41 +104,44 @@ def create_enrollment_ticket(self, body): """Creates an enrollment ticket for user_id A useful way to send an email to a user, with a link that lead to - start the enrollment process + start the enrollment process. Args: body (dict): Details of the user to send the ticket to. - See: https://auth0.com/docs/api/management/v2#!/Guardian/post_ticket + + See: https://auth0.com/docs/api/management/v2#!/Guardian/post_ticket """ return self.client.post(self._url('enrollments/ticket'), data=body) def get_factor_providers(self, factor_name, name): """Get Guardian SNS or SMS factor providers. - Returns provider configuration + Returns provider configuration. + Args: - factor_name (str): Either push-notification or sms - name (str): Name of the provider + factor_name (str): Either push-notification or sms. + name (str): Name of the provider. See: https://auth0.com/docs/api/management/v2#!/Guardian/get_sns https://auth0.com/docs/api/management/v2#!/Guardian/get_twilio -""" + """ url = self._url('factors/{}/providers/{}'.format(factor_name, name)) return self.client.get(url) def update_factor_providers(self, factor_name, name, body): """Get Guardian factor providers. - Returns provider configuration + Returns provider configuration. + Args: - factor_name (str): Either push-notification or sms - name (str): Name of the provider + factor_name (str): Either push-notification or sms. + + name (str): Name of the provider. - body (dict): - See: https://auth0.com/docs/api/management/v2#!/Guardian/put_twilio + body (dict): Details of the factor provider. + + See: https://auth0.com/docs/api/management/v2#!/Guardian/put_twilio """ url = self._url('factors/{}/providers/{}'.format(factor_name, name)) return self.client.put(url, data=body) - - diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index aa7cde47..e629715b 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -39,7 +39,7 @@ def get(self, id): return self.client.get(self._url(id)) def get_failed_job(self, id): - """Get failed job error details + """Get failed job error details. Args: id (str): The id of the job. @@ -53,7 +53,7 @@ def get_results(self, job_id): """Get results of a job Args: - job_id (str): The ID of the job. + job_id (str): The id of the job. See: https://auth0.com/docs/api/management/v2#!/Jobs/get_results """ @@ -67,7 +67,9 @@ def export_users(self, body): included in the status once the job is complete. Args: - body (dict): Please see: https://auth0.com/docs/api/management/v2#!/Jobs/post_users_exports + body (dict): The details of the export users request. + + See: https://auth0.com/docs/api/management/v2#!/Jobs/post_users_exports """ return self.client.post(self._url('users-exports'), data=body) @@ -79,18 +81,18 @@ def import_users(self, connection_id, file_obj, upsert=False, send_completion_em users will be inserted. file_obj (file): A file-like object to upload. The format for - this file is explained in: https://auth0.com/docs/bulk-import + this file is explained in: https://auth0.com/docs/bulk-import. - upsert (bool): When set to False, pre-existing users that match on email address, user ID, or username + upsert (bool, optional): When set to False, pre-existing users that match on email address, user ID, or username will fail. When set to True, pre-existing users that match on any of these fields will be updated, but only with upsertable attributes. Defaults to False. For a list of user profile fields that can be upserted during import, see the following article - https://auth0.com/docs/users/references/user-profile-structure#user-profile-attributes + https://auth0.com/docs/users/references/user-profile-structure#user-profile-attributes. - send_completion_email (bool): When set to True, an email will be sent to notify the completion of this job. + send_completion_email (bool, optional): When set to True, an email will be sent to notify the completion of this job. When set to False, no email will be sent. Defaults to True. - external_id (str): Customer-defined ID. + external_id (str, optional): Customer-defined ID. See: https://auth0.com/docs/api/management/v2#!/Jobs/post_users_imports """ @@ -108,6 +110,8 @@ def send_verification_email(self, body): verify their email address. Args: - body (dict): Please see: https://auth0.com/docs/api/v2#!/Jobs/post_verification_email + body (dict): Details of verification email request. + + See: https://auth0.com/docs/api/v2#!/Jobs/post_verification_email """ return self.client.post(self._url('verification-email'), data=body) diff --git a/auth0/v3/management/logs.py b/auth0/v3/management/logs.py index 854c4ac2..afaf45a6 100644 --- a/auth0/v3/management/logs.py +++ b/auth0/v3/management/logs.py @@ -2,7 +2,6 @@ class Logs(object): - """Auth0 logs endpoints Args: @@ -35,32 +34,35 @@ def search(self, page=0, per_page=50, sort=None, q=None, """Search log events. Args: - page (int, optional): The result's page number (zero based). + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. - per_page (int, optional): The amount of entries per page. + per_page (int, optional): The amount of entries per page. By default, + retrieves 50 results per page. sort (str, optional): The field to use for sorting. 1 == ascending and -1 == descending. (e.g: date:1) + When not set, the default value is up to the server. q (str, optional): Query in Lucene query string syntax. fields (list of str, optional): A list of fields to include or - exclude from the result (depending on include_fields). Empty to + exclude from the result (depending on include_fields). Leave empty to retrieve all fields. include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. from_param (str, optional): Log Event Id to start retrieving logs. You can - limit the amount of logs using the take parameter + limit the amount of logs using the take parameter. take (int, optional): The total amount of entries to retrieve when - using the from parameter. + using the from parameter. When not set, the default value is up to the server. - https://auth0.com/docs/api/management/v2#!/Logs/get_logs + See: https://auth0.com/docs/api/management/v2#!/Logs/get_logs """ params = { 'per_page': per_page, @@ -79,8 +81,7 @@ def get(self, id): """Retrieves the data related to the log entry identified by id. Args: - id (str): The log_id of the log to retrieve - + id (str): The log_id of the log to retrieve. See: https://auth0.com/docs/api/management/v2#!/Logs/get_logs_by_id """ diff --git a/auth0/v3/management/resource_servers.py b/auth0/v3/management/resource_servers.py index 61115dbb..e4aeaee7 100644 --- a/auth0/v3/management/resource_servers.py +++ b/auth0/v3/management/resource_servers.py @@ -2,7 +2,6 @@ class ResourceServers(object): - """Auth0 resource servers endpoints Args: @@ -33,8 +32,9 @@ def create(self, body): """Create a new resource server. Args: - body (dict): Attributes for the new resource Server - See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/post_resource_servers + body (dict): Attributes for the new resource Server. + + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/post_resource_servers """ return self.client.post(self._url(), data=body) @@ -43,12 +43,15 @@ def get_all(self, page=None, per_page=None, include_totals=False): """Retrieves all resource servers Args: - page (int, optional): The result's page number (zero based). + page (int, optional): The result's page number (zero based). When not set, + the default value is up to the server. - per_page (int, optional): The amount of entries per page. + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to False. + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/get_resource_servers """ @@ -65,7 +68,8 @@ def get(self, id): """Retrieves a resource server by its id. Args: - id (str): Id of the resource server to get. + id (str): id of the resource server to get. + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/get_resource_servers_by_id """ @@ -78,6 +82,7 @@ def delete(self, id): Args: id (str): Id of resource server to delete. + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/delete_resource_servers_by_id """ @@ -90,7 +95,8 @@ def update(self, id, body): id (str): The id of the resource server to update. body (dict): Attributes to modify. - See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/patch_resource_servers_by_id + + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/patch_resource_servers_by_id """ return self.client.patch(self._url(id), data=body) diff --git a/auth0/v3/management/roles.py b/auth0/v3/management/roles.py index 31c004e0..9cbdcd75 100644 --- a/auth0/v3/management/roles.py +++ b/auth0/v3/management/roles.py @@ -2,7 +2,6 @@ class Roles(object): - """Auth0 roles endpoints Args: @@ -33,15 +32,17 @@ def list(self, page=0, per_page=25, include_totals=True, name_filter=None): """List or search roles. Args: - page (int, optional): The result's page number (zero based). + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. - per_page (int, optional): The amount of entries per page. + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. name_filter (str, optional): A case-insensitive filter to apply - to search for roles by name + to search for roles by name. See: https://auth0.com/docs/api/management/v2#!/Roles/get_roles """ @@ -57,7 +58,9 @@ def create(self, body): """Creates a new role. Args: - body (dict): Please see: https://auth0.com/docs/api/v2#!/Roles/post_roles + body (dict): the attributes for the role to create. + + See: https://auth0.com/docs/api/v2#!/Roles/post_roles """ return self.client.post(self._url(), data=body) @@ -88,7 +91,9 @@ def update(self, id, body): Args: id (str): The id of the role to update. - body (dict): Please see: https://auth0.com/docs/api/management/v2#!/Roles/patch_roles_by_id + body (dict): the attributes to update on the role. + + See: https://auth0.com/docs/api/management/v2#!/Roles/patch_roles_by_id """ return self.client.patch(self._url(id), data=body) @@ -98,12 +103,14 @@ def list_users(self, id, page=0, per_page=25, include_totals=True): Args: id (str): The role's id. - page (int, optional): The result's page number (zero based). - - per_page (int, optional): The amount of entries per page. + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. See https://auth0.com/docs/api/management/v2#!/Roles/get_role_user """ @@ -122,7 +129,7 @@ def add_users(self, id, users): Args: id (str): The role's id. - users (list of str): A list of users ids to add to this role + users (list of str): A list of users ids to add to this role. See https://auth0.com/docs/api/management/v2#!/Roles/post_role_users """ @@ -136,12 +143,14 @@ def list_permissions(self, id, page=0, per_page=25, include_totals=True): Args: id (str): The role's id. - page (int, optional): The result's page number (zero based). - - per_page (int, optional): The amount of entries per page. + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. See https://auth0.com/docs/api/management/v2#!/Roles/get_role_permission """ @@ -167,7 +176,6 @@ def remove_permissions(self, id, permissions): body = {'permissions': permissions} return self.client.delete(url, data=body) - def add_permissions(self, id, permissions): """Associates permissions with a role. @@ -180,4 +188,4 @@ def add_permissions(self, id, permissions): """ url = self._url('{}/permissions'.format(id)) body = {'permissions': permissions} - return self.client.post(url, data=body) \ No newline at end of file + return self.client.post(url, data=body) diff --git a/auth0/v3/management/rules.py b/auth0/v3/management/rules.py index 10173623..73d4fa25 100644 --- a/auth0/v3/management/rules.py +++ b/auth0/v3/management/rules.py @@ -2,7 +2,6 @@ class Rules(object): - """Rules endpoint implementation. Args: @@ -34,26 +33,27 @@ def all(self, stage='login_success', enabled=True, fields=None, """Retrieves a list of all rules. Args: - stage (str, optional): Retrieves rules that match the execution - stage (defaults to login_success). + stage (str, optional): Retrieves rules that match the execution stage. + Defaults to login_success. enabled (bool, optional): If provided, retrieves rules that match the value, otherwise all rules are retrieved. fields (list, optional): A list of fields to include or exclude - (depending on include_fields) from the result, empty to + (depending on include_fields) from the result. Leave empty to retrieve all fields. include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise - (defaults to true). + to be included in the result, False otherwise. Defaults to True. - page (int, optional): The result's page number (zero based). + page (int, optional): The result's page number (zero based). When not set, + the default value is up to the server. - per_page (int, optional): The amount of entries per page. + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to False. See: https://auth0.com/docs/api/management/v2#!/Rules/get_rules """ @@ -77,8 +77,9 @@ def create(self, body): """Creates a new rule. Args: - body (dict): Attributes for the newly created rule, - See: https://auth0.com/docs/api/v2#!/Rules/post_rules + body (dict): Attributes for the newly created rule. + + See: https://auth0.com/docs/api/v2#!/Rules/post_rules """ return self.client.post(self._url(), data=body) @@ -89,12 +90,11 @@ def get(self, id, fields=None, include_fields=True): id (str): The id of the rule to retrieve. fields (list, optional): A list of fields to include or exclude - (depending on include_fields) from the result, empty to + (depending on include_fields) from the result. Leave empty to retrieve all fields. include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise - (defaults to true). + to be included in the result, False otherwise. Defaults to True. See: https://auth0.com/docs/api/management/v2#!/Rules/get_rules_by_id """ @@ -119,6 +119,7 @@ def update(self, id, body): id (str): The id of the rule to modify. body (dict): Attributes to modify. - See: https://auth0.com/docs/api/v2#!/Rules/patch_rules_by_id + + See: https://auth0.com/docs/api/v2#!/Rules/patch_rules_by_id """ return self.client.patch(self._url(id), data=body) diff --git a/auth0/v3/management/rules_configs.py b/auth0/v3/management/rules_configs.py index b29cebe1..f4c97b3c 100644 --- a/auth0/v3/management/rules_configs.py +++ b/auth0/v3/management/rules_configs.py @@ -2,7 +2,6 @@ class RulesConfigs(object): - """RulesConfig endpoint implementation. Args: @@ -40,7 +39,7 @@ def unset(self, key): """Removes the rules config for a given key. Args: - key (str): rules config key to remove + key (str): rules config key to remove. See: https://auth0.com/docs/api/management/v2#!/Rules_Configs/delete_rules_configs_by_key """ @@ -50,13 +49,12 @@ def set(self, key, value): """Sets the rules config for a given key. Args: - key (str): rules config key to set + key (str): rules config key to set. - value (str): value to set for the rules config key + value (str): value to set for the rules config key. See: https://auth0.com/docs/api/management/v2#!/Rules_Configs/put_rules_configs_by_key """ url = self._url('{}'.format(key)) body = {'value': value} return self.client.put(url, data=body) - diff --git a/auth0/v3/management/stats.py b/auth0/v3/management/stats.py index 8c34ad50..cb933987 100644 --- a/auth0/v3/management/stats.py +++ b/auth0/v3/management/stats.py @@ -30,7 +30,6 @@ def active_users(self): Returns: An integer. - See: https://auth0.com/docs/api/management/v2#!/Stats/get_active_users """ @@ -40,10 +39,10 @@ def daily_stats(self, from_date=None, to_date=None): """Gets the daily stats for a particular period. Args: - from_date (str): The first day of the period (inclusive) in + from_date (str, optional): The first day of the period (inclusive) in YYYYMMDD format. - to_date (str): The last day of the period (inclusive) in + to_date (str, optional): The last day of the period (inclusive) in YYYYMMDD format. See: https://auth0.com/docs/api/management/v2#!/Stats/get_daily diff --git a/auth0/v3/management/tenants.py b/auth0/v3/management/tenants.py index 8b6ba727..76fba30f 100644 --- a/auth0/v3/management/tenants.py +++ b/auth0/v3/management/tenants.py @@ -2,7 +2,6 @@ class Tenants(object): - """Auth0 tenants endpoints Args: @@ -31,13 +30,13 @@ def get(self, fields=None, include_fields=True): Args: fields (list of str, optional): A list of fields to include or - exclude from the result (depending on include_fields). Empty to + exclude from the result (depending on include_fields). Leave empty to retrieve all fields. include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. - See: https://auth0.com/docs/api/management/v2#!/Tenants/get_settings + See: https://auth0.com/docs/api/management/v2#!/Tenants/get_settings """ params = {'fields': fields and ','.join(fields) or None, @@ -49,6 +48,8 @@ def update(self, body): """Update tenant settings. Args: - body (dict): Please see: https://auth0.com/docs/api/v2#!/Tenants/patch_settings + body (dict): the attributes to update in the tenant. + + See: https://auth0.com/docs/api/v2#!/Tenants/patch_settings """ return self.client.patch(self._url(), data=body) diff --git a/auth0/v3/management/tickets.py b/auth0/v3/management/tickets.py index 76677875..985d1b46 100644 --- a/auth0/v3/management/tickets.py +++ b/auth0/v3/management/tickets.py @@ -2,7 +2,6 @@ class Tickets(object): - """Auth0 tickets endpoints Args: @@ -30,7 +29,9 @@ def create_email_verification(self, body): """Create an email verification ticket. Args: - body (dict): Please see: https://auth0.com/docs/api/v2#!/Tickets/post_email_verification + body (dict): attributes to set on the email verification request. + + See: https://auth0.com/docs/api/v2#!/Tickets/post_email_verification """ return self.client.post(self._url('email-verification'), data=body) @@ -38,6 +39,8 @@ def create_pswd_change(self, body): """Create password change ticket. Args: - body (dict): Please see: https://auth0.com/docs/api/v2#!/Tickets/post_password_change + body (dict): attributes to set on the password change request. + + See: https://auth0.com/docs/api/v2#!/Tickets/post_password_change """ return self.client.post(self._url('password-change'), data=body) diff --git a/auth0/v3/management/user_blocks.py b/auth0/v3/management/user_blocks.py index e7670a35..1c36f872 100644 --- a/auth0/v3/management/user_blocks.py +++ b/auth0/v3/management/user_blocks.py @@ -2,7 +2,6 @@ class UserBlocks(object): - """Auth0 user blocks endpoints Args: diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 6353970a..d90c5a4f 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -1,9 +1,9 @@ -from .rest import RestClient import warnings +from .rest import RestClient -class Users(object): +class Users(object): """Auth0 users endpoints Args: @@ -36,12 +36,15 @@ def list(self, page=0, per_page=25, sort=None, connection=None, q=None, """List or search users. Args: - page (int, optional): The result's page number (zero based). + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. - per_page (int, optional): The amount of entries per page. + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. sort (str, optional): The field to use for sorting. 1 == ascending and -1 == descending. (e.g: email:1) + When not set, the default value is up to the server. connection (str, optional): Connection filter. @@ -51,17 +54,17 @@ def list(self, page=0, per_page=25, sort=None, connection=None, q=None, search_engine (str, optional): The version of the search_engine to use when querying for users. Will default to the latest version available. - See: https://auth0.com/docs/users/search + See: https://auth0.com/docs/users/search. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. fields (list of str, optional): A list of fields to include or - exclude from the result (depending on include_fields). Empty to + exclude from the result (depending on include_fields). Leave empty to retrieve all fields. include_fields (bool, optional): True if the fields specified are - to be include in the result, False otherwise. + to be include in the result, False otherwise. Defaults to True. See: https://auth0.com/docs/api/management/v2#!/Users/get_users """ @@ -82,7 +85,9 @@ def create(self, body): """Creates a new user. Args: - body (dict): Please see: https://auth0.com/docs/api/v2#!/Users/post_users + body (dict): the attributes to set on the user to create. + + See: https://auth0.com/docs/api/v2#!/Users/post_users """ return self.client.post(self._url(), data=body) @@ -102,11 +107,11 @@ def get(self, id, fields=None, include_fields=True): id (str): The user_id of the user to retrieve. fields (list of str, optional): A list of fields to include or - exclude from the result (depending on include_fields). Empty to + exclude from the result (depending on include_fields). Leave empty to retrieve all fields. include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. See: https://auth0.com/docs/api/management/v2#!/Users/get_users_by_id """ @@ -133,7 +138,9 @@ def update(self, id, body): Args: id (str): The user_id of the user to update. - body (dict): Please see: https://auth0.com/docs/api/v2#!/Users/patch_users_by_id + body (dict): The attributes of the user to update. + + See: https://auth0.com/docs/api/v2#!/Users/patch_users_by_id """ return self.client.patch(self._url(id), data=body) @@ -143,12 +150,14 @@ def list_roles(self, id, page=0, per_page=25, include_totals=True): Args: id (str): The user's id. - page (int, optional): The result's page number (zero based). - - per_page (int, optional): The amount of entries per page. + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. See https://auth0.com/docs/api/management/v2#!/Users/get_user_roles """ @@ -195,12 +204,14 @@ def list_permissions(self, id, page=0, per_page=25, include_totals=True): Args: id (str): The user's id. - page (int, optional): The result's page number (zero based). - - per_page (int, optional): The amount of entries per page. + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to True. See https://auth0.com/docs/api/management/v2#!/Users/get_permissions """ @@ -248,7 +259,7 @@ def delete_multifactor(self, id, provider): id (str): The user's id. provider (str): The multifactor provider. Supported values 'duo' - or 'google-authenticator' + or 'google-authenticator'. See: https://auth0.com/docs/api/management/v2#!/Users/delete_multifactor_by_provider """ @@ -280,7 +291,9 @@ def link_user_account(self, user_id, body): id (str): The user_id of the primary identity where you are linking the secondary account to. - body (dict): Please see: https://auth0.com/docs/api/v2#!/Users/post_identities + body (dict): the attributes to send as part of this request. + + See: https://auth0.com/docs/api/v2#!/Users/post_identities """ url = self._url('{}/identities'.format(user_id)) return self.client.post(url, data=body) @@ -300,7 +313,7 @@ def get_guardian_enrollments(self, user_id): """Retrieves all Guardian enrollments. Args: - user_id (str): The user_id of the user to retrieve + user_id (str): The user_id of the user to retrieve. See: https://auth0.com/docs/api/management/v2#!/Users/get_enrollments """ @@ -309,24 +322,26 @@ def get_guardian_enrollments(self, user_id): def get_log_events(self, user_id, page=0, per_page=50, sort=None, include_totals=False): - """Retrieve every log event for a specific user id + """Retrieve every log event for a specific user id. Args: - user_id (str): The user_id of the logs to retrieve + user_id (str): The user_id of the logs to retrieve. - page (int, optional): The result's page number (zero based). + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. - per_page (int, optional): The amount of entries per page. - Default: 50. Max value: 100 + per_page (int, optional): The amount of entries per page. By default, + retrieves 50 results per page. sort (str, optional): The field to use for sorting. Use field:order where order is 1 for ascending and -1 for descending. For example date:-1 + When not set, the default value is up to the server. include_totals (bool, optional): True if the query summary is - to be included in the result, False otherwise. + to be included in the result, False otherwise. Defaults to False. - See: https://auth0.com/docs/api/management/v2#!/Users/get_logs_by_user + See: https://auth0.com/docs/api/management/v2#!/Users/get_logs_by_user """ params = { diff --git a/auth0/v3/management/users_by_email.py b/auth0/v3/management/users_by_email.py index 295ea0b5..edb2f37a 100644 --- a/auth0/v3/management/users_by_email.py +++ b/auth0/v3/management/users_by_email.py @@ -2,7 +2,6 @@ class UsersByEmail(object): - """Auth0 users by email endpoints Args: @@ -32,10 +31,10 @@ def search_users_by_email(self, email, fields=None, include_fields=True): Args: - email: Email to search + email: Email to search. fields (list of str, optional): A list of fields to include or - exclude from the result (depending on include_fields). Empty to + exclude from the result (depending on include_fields). Leave empty to retrieve all fields. include_fields (bool, optional): True if the fields specified are From 65801afc2dd3ae40f1c573cdf35c3660a8da6aa7 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 7 Jul 2020 16:27:50 -0300 Subject: [PATCH 105/663] skip sending optional parameters on POST request when unspecified --- auth0/v3/authentication/database.py | 52 ++++++++----------- auth0/v3/authentication/delegated.py | 6 +-- auth0/v3/authentication/revoke_token.py | 8 +-- auth0/v3/management/blacklists.py | 10 +++- auth0/v3/test/authentication/test_database.py | 2 - .../test/authentication/test_revoke_token.py | 6 +-- auth0/v3/test/management/test_blacklists.py | 10 ++++ 7 files changed, 48 insertions(+), 46 deletions(-) diff --git a/auth0/v3/authentication/database.py b/auth0/v3/authentication/database.py index bc57de88..5ecebbdf 100644 --- a/auth0/v3/authentication/database.py +++ b/auth0/v3/authentication/database.py @@ -21,19 +21,20 @@ def login(self, client_id, username, password, connection, id_token=None, Windows Azure AD and ADFS. """ warnings.warn("/oauth/ro will be deprecated in future releases", DeprecationWarning) - return self.post( - 'https://{}/oauth/ro'.format(self.domain), - data={ - 'client_id': client_id, - 'username': username, - 'password': password, - 'id_token': id_token, - 'connection': connection, - 'device': device, - 'grant_type': grant_type, - 'scope': scope, - } - ) + + body = { + 'client_id': client_id, + 'username': username, + 'password': password, + 'connection': connection, + 'grant_type': grant_type, + 'scope': scope, + } + if id_token: + body.update({'id_token': id_token}) + if device: + body.update({'device': device}) + return self.post('https://{}/oauth/ro'.format(self.domain), data=body) def signup(self, client_id, email, password, connection, username=None, user_metadata=None, given_name=None, family_name=None, name=None, nickname=None, picture=None): @@ -71,10 +72,7 @@ def signup(self, client_id, email, password, connection, username=None, user_met 'email': email, 'password': password, 'connection': connection, - 'username': username, - 'user_metadata': user_metadata } - if username: body.update({'username': username}) if user_metadata: @@ -90,21 +88,17 @@ def signup(self, client_id, email, password, connection, username=None, user_met if picture: body.update({'picture': picture}) - return self.post( - 'https://{}/dbconnections/signup'.format(self.domain), - data=body - ) + return self.post('https://{}/dbconnections/signup'.format(self.domain), data=body) def change_password(self, client_id, email, connection, password=None): """Asks to change a password for a given user. """ + body = { + 'client_id': client_id, + 'email': email, + 'connection': connection, + } + if password: + body.update({'password': password}) - return self.post( - 'https://{}/dbconnections/change_password'.format(self.domain), - data={ - 'client_id': client_id, - 'email': email, - 'password': password, - 'connection': connection, - } - ) + return self.post('https://{}/dbconnections/change_password'.format(self.domain), data=body) diff --git a/auth0/v3/authentication/delegated.py b/auth0/v3/authentication/delegated.py index 5c738de6..f84cef2c 100644 --- a/auth0/v3/authentication/delegated.py +++ b/auth0/v3/authentication/delegated.py @@ -2,7 +2,6 @@ class Delegated(AuthenticationBase): - """Delegated authentication endpoints. Args: @@ -35,7 +34,4 @@ def get_token(self, client_id, target, api_type, grant_type, raise ValueError('Either id_token or refresh_token must ' 'have a value') - return self.post( - 'https://{}/delegation'.format(self.domain), - data=data - ) + return self.post('https://{}/delegation'.format(self.domain), data=data) diff --git a/auth0/v3/authentication/revoke_token.py b/auth0/v3/authentication/revoke_token.py index 1705bb12..9523c5f7 100644 --- a/auth0/v3/authentication/revoke_token.py +++ b/auth0/v3/authentication/revoke_token.py @@ -2,7 +2,6 @@ class RevokeToken(AuthenticationBase): - """Revoke Refresh Token endpoint Args: @@ -30,8 +29,9 @@ def revoke_refresh_token(self, client_id, token, client_secret=None): body = { 'client_id': client_id, 'token': token, - 'client_secret': client_secret } - return self.post( - 'https://{}/oauth/revoke'.format(self.domain), data=body) + if client_secret: + body.update({'client_secret': client_secret}) + + return self.post('https://{}/oauth/revoke'.format(self.domain), data=body) diff --git a/auth0/v3/management/blacklists.py b/auth0/v3/management/blacklists.py index 0b8a76c8..219a0fd5 100644 --- a/auth0/v3/management/blacklists.py +++ b/auth0/v3/management/blacklists.py @@ -39,7 +39,7 @@ def get(self, aud=None): return self.client.get(self.url, params=params) - def create(self, jti, aud=''): + def create(self, jti, aud=None): """Adds a token to the blacklist. Args: @@ -50,5 +50,11 @@ def create(self, jti, aud=''): See: https://auth0.com/docs/api/management/v2#!/Blacklists/post_tokens """ + body = { + 'jti': jti, + } + + if aud: + body.update({'aud': aud}) - return self.client.post(self.url, data={'jti': jti, 'aud': aud}) + return self.client.post(self.url, data=body) diff --git a/auth0/v3/test/authentication/test_database.py b/auth0/v3/test/authentication/test_database.py index 3966b414..bc6c77f4 100644 --- a/auth0/v3/test/authentication/test_database.py +++ b/auth0/v3/test/authentication/test_database.py @@ -52,8 +52,6 @@ def test_signup(self, mock_post): 'email': 'a@b.com', 'password': 'pswd', 'connection': 'conn', - 'username': None, - 'user_metadata': None }) # Using also optional properties diff --git a/auth0/v3/test/authentication/test_revoke_token.py b/auth0/v3/test/authentication/test_revoke_token.py index 0aa40fd1..57a1d21a 100644 --- a/auth0/v3/test/authentication/test_revoke_token.py +++ b/auth0/v3/test/authentication/test_revoke_token.py @@ -11,16 +11,14 @@ def test_revoke_refresh_token(self, mock_post): a = RevokeToken('my.domain.com') # regular apps - a.revoke_refresh_token(client_id='cid', - token='tkn') + a.revoke_refresh_token(client_id='cid', token='tkn') args, kwargs = mock_post.call_args self.assertEqual(args[0], 'https://my.domain.com/oauth/revoke') self.assertEqual(kwargs['data'], { 'client_id': 'cid', - 'token': 'tkn', - 'client_secret': None + 'token': 'tkn' }) # confidential apps diff --git a/auth0/v3/test/management/test_blacklists.py b/auth0/v3/test/management/test_blacklists.py index cbf74e96..7c62e57d 100644 --- a/auth0/v3/test/management/test_blacklists.py +++ b/auth0/v3/test/management/test_blacklists.py @@ -28,6 +28,16 @@ def test_create(self, mock_rc): mock_instance = mock_rc.return_value t = Blacklists(domain='domain', token='jwttoken') + + # create without audience + t.create(jti='the-jti') + + args, kwargs = mock_instance.post.call_args + + self.assertEqual('https://domain/api/v2/blacklists/tokens', args[0]) + self.assertEqual(kwargs['data'], {'jti': 'the-jti'}) + + # create with audience t.create(jti='the-jti', aud='the-aud') args, kwargs = mock_instance.post.call_args From 967168d080710c88f370e8bca2a4ddcad585feae Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 8 Jul 2020 14:16:32 -0300 Subject: [PATCH 106/663] skip sending password on change password endpoint --- auth0/v3/authentication/database.py | 10 +++++++--- auth0/v3/test/authentication/test_database.py | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/auth0/v3/authentication/database.py b/auth0/v3/authentication/database.py index 5ecebbdf..e89a825c 100644 --- a/auth0/v3/authentication/database.py +++ b/auth0/v3/authentication/database.py @@ -92,13 +92,17 @@ def signup(self, client_id, email, password, connection, username=None, user_met def change_password(self, client_id, email, connection, password=None): """Asks to change a password for a given user. + + client_id (str): ID of the application to use. + + email (str): The user's email address. + + connection (str): The name of the database connection where this user should be created. """ body = { 'client_id': client_id, 'email': email, 'connection': connection, } - if password: - body.update({'password': password}) - + return self.post('https://{}/dbconnections/change_password'.format(self.domain), data=body) diff --git a/auth0/v3/test/authentication/test_database.py b/auth0/v3/test/authentication/test_database.py index bc6c77f4..d614fd14 100644 --- a/auth0/v3/test/authentication/test_database.py +++ b/auth0/v3/test/authentication/test_database.py @@ -94,6 +94,7 @@ def test_signup(self, mock_post): def test_change_password(self, mock_post): d = Database('my.domain.com') + # ignores the password argument d.change_password(client_id='cid', email='a@b.com', password='pswd', @@ -106,6 +107,5 @@ def test_change_password(self, mock_post): self.assertEqual(kwargs['data'], { 'client_id': 'cid', 'email': 'a@b.com', - 'password': 'pswd', 'connection': 'conn', }) From d9801246ec1071f3773d836f6dd4cbf37bcbaad8 Mon Sep 17 00:00:00 2001 From: Guillaume Pujol Date: Fri, 3 Jul 2020 10:21:36 +0200 Subject: [PATCH 107/663] add Hooks management API --- auth0/v3/management/hooks.py | 188 +++++++++++++++++++++++++ auth0/v3/test/management/test_hooks.py | 174 +++++++++++++++++++++++ 2 files changed, 362 insertions(+) create mode 100644 auth0/v3/management/hooks.py create mode 100644 auth0/v3/test/management/test_hooks.py diff --git a/auth0/v3/management/hooks.py b/auth0/v3/management/hooks.py new file mode 100644 index 00000000..91a8b61d --- /dev/null +++ b/auth0/v3/management/hooks.py @@ -0,0 +1,188 @@ +from auth0.v3.management.rest import RestClient + + +class Hooks(object): + + """Hooks endpoint implementation. + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = "https://{}/api/v2/hooks".format(self.domain) + if id is not None: + return "{}/{}".format(url, id) + return url + + def all( + self, + enabled=True, + fields=None, + include_fields=True, + page=None, + per_page=None, + include_totals=False, + ): + """Retrieves a list of all hooks. + + Args: + enabled (bool, optional): If provided, retrieves hooks that match + the value, otherwise all hooks are retrieved. + + fields (list, optional): A list of fields to include or exclude + (depending on include_fields) from the result, empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise + (defaults to true). + + page (int, optional): The result's page number (zero based). + + per_page (int, optional): The amount of entries per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/get_hooks + """ + + params = { + "fields": fields and ",".join(fields) or None, + "include_fields": str(include_fields).lower(), + "page": page, + "per_page": per_page, + "include_totals": str(include_totals).lower(), + } + + # since the default is True, this is here to disable the filter + if enabled is not None: + params["enabled"] = str(enabled).lower() + + return self.client.get(self._url(), params=params) + + def create(self, body): + """Creates a new Hook. + + Args: + body (dict): Attributes for the newly created hook, + See: https://auth0.com/docs/api/v2#!/Hooks/post_hooks + """ + return self.client.post(self._url(), data=body) + + def get(self, id, fields=None, include_fields=True): + """Retrieves a hook by its ID. + + Args: + id (str): The id of the hook to retrieve. + + fields (list, optional): A list of fields to include or exclude + (depending on include_fields) from the result, empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise + (defaults to true). + + See: https://auth0.com/docs/api/management/v2#!/Hooks/get_hooks_by_id + """ + params = { + "fields": fields and ",".join(fields) or None, + "include_fields": str(include_fields).lower(), + } + return self.client.get(self._url(id), params=params) + + def delete(self, id): + """Deletes a hook. + + Args: + id (str): The id of the hook to delete. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/delete_hooks_by_id + """ + return self.client.delete(self._url(id)) + + def update(self, id, body): + """Updates an existing hook. + + Args: + id (str): The id of the hook to modify. + + body (dict): Attributes to modify. + + See: https://auth0.com/docs/api/v2#!/Hooks/patch_hooks_by_id + """ + return self.client.patch(self._url(id), data=body) + + def get_secrets(self, id, fields=None, include_fields=True): + """Retrieves a hook's secrets. + + Args: + id (str): The id of the hook to retrieve secrets from. + + fields (list, optional): A list of fields to include or exclude + (depending on include_fields) from the result, empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise + (defaults to true). + + See: https://auth0.com/docs/api/management/v2#!/Hooks/get_secrets + """ + params = { + "fields": fields and ",".join(fields) or None, + "include_fields": str(include_fields).lower(), + } + return self.client.get(self._url("%s/secrets" % id), params=params) + + def add_secrets(self, id, body): + """Add one or more secrets for an existing hook. + + Args: + id (str): The id of the hook to add secrets to. + + body (dict): Dict of key-value pairs where the value must be a string. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/post_secrets + """ + return self.client.post(self._url("%s/secrets" % id), data=body) + + def delete_secrets(self, id, body): + """Delete one or more existing secrets for an existing hook. + + Args: + id (str): The id of the hook to add secrets to. + + body (list): List of secret names to delete. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/delete_secrets + """ + return self.client.delete(self._url("%s/secrets" % id), data=body) + + def update_secrets(self, id, body): + """Update one or more existing secrets for an existing hook. + + Args: + id (str): The id of the hook to add secrets to. + + body (dict): Dict of key-value pairs where the value must be a string. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/patch_secrets + """ + return self.client.patch(self._url("%s/secrets" % id), data=body) diff --git a/auth0/v3/test/management/test_hooks.py b/auth0/v3/test/management/test_hooks.py new file mode 100644 index 00000000..9098240c --- /dev/null +++ b/auth0/v3/test/management/test_hooks.py @@ -0,0 +1,174 @@ +import unittest +import mock +from ...management.hooks import Hooks + + +class TestRules(unittest.TestCase): + + def test_init_with_optionals(self): + t = Hooks(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + + @mock.patch('auth0.v3.management.hooks.RestClient') + def test_all(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Hooks(domain='domain', token='jwttoken') + + # with default params + c.all() + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/hooks', args[0]) + self.assertEqual(kwargs['params'], { + "enabled": 'true', + "fields": None, + "include_fields": 'true', + "page": None, + "per_page": None, + "include_totals": 'false', + }) + + # with fields params + c.all(enabled=False, fields=['a', 'b'], + include_fields=False) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/hooks', args[0]) + self.assertEqual(kwargs['params'], {'fields': 'a,b', + 'include_fields': 'false', + 'enabled': 'false', + 'page': None, + 'per_page': None, + 'include_totals': 'false'}) + + # with pagination params + c.all(page=3, per_page=27, include_totals=True) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/hooks', args[0]) + self.assertEqual(kwargs['params'], {'fields': None, + 'include_fields': 'true', + 'enabled': 'true', + 'page': 3, + 'per_page': 27, + 'include_totals': 'true'}) + + @mock.patch('auth0.v3.management.hooks.RestClient') + def test_create(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Hooks(domain='domain', token='jwttoken') + c.create({'a': 'b', 'c': 'd'}) + + args, kwargs = mock_instance.post.call_args + + self.assertEqual('https://domain/api/v2/hooks', args[0]) + self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) + + @mock.patch('auth0.v3.management.hooks.RestClient') + def test_get(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Hooks(domain='domain', token='jwttoken') + c.get('an-id') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/hooks/an-id', args[0]) + self.assertEqual(kwargs['params'], {'fields': None, + 'include_fields': 'true'}) + + c.get('an-id', fields=['a', 'b'], include_fields=False) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/hooks/an-id', args[0]) + self.assertEqual(kwargs['params'], {'fields': 'a,b', + 'include_fields': 'false'}) + + @mock.patch('auth0.v3.management.hooks.RestClient') + def test_delete(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Hooks(domain='domain', token='jwttoken') + c.delete('an-id') + + mock_instance.delete.assert_called_with( + 'https://domain/api/v2/hooks/an-id' + ) + + @mock.patch('auth0.v3.management.hooks.RestClient') + def test_update(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Hooks(domain='domain', token='jwttoken') + c.update('an-id', {'a': 'b', 'c': 'd'}) + + args, kwargs = mock_instance.patch.call_args + + self.assertEqual('https://domain/api/v2/hooks/an-id', args[0]) + self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) + + # test for hooks secrets + @mock.patch('auth0.v3.management.hooks.RestClient') + def test_add_secret(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Hooks(domain='domain', token='jwttoken') + c.add_secrets('an-id', {'a': 'b', 'c': 'd'}) + + args, kwargs = mock_instance.post.call_args + + self.assertEqual('https://domain/api/v2/hooks/an-id/secrets', args[0]) + self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) + + @mock.patch('auth0.v3.management.hooks.RestClient') + def test_get_secrets(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Hooks(domain='domain', token='jwttoken') + c.get_secrets('an-id') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/hooks/an-id/secrets', args[0]) + self.assertEqual(kwargs['params'], {'fields': None, + 'include_fields': 'true'}) + + c.get_secrets('an-id', fields=['a', 'b'], include_fields=False) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/hooks/an-id/secrets', args[0]) + self.assertEqual(kwargs['params'], {'fields': 'a,b', + 'include_fields': 'false'}) + + @mock.patch('auth0.v3.management.hooks.RestClient') + def test_delete_secrets(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Hooks(domain='domain', token='jwttoken') + c.delete_secrets('an-id', ['a', 'b']) + + args, kwargs = mock_instance.delete.call_args + + self.assertEqual('https://domain/api/v2/hooks/an-id/secrets', args[0]) + self.assertEqual(kwargs['data'], ['a', 'b']) + + @mock.patch('auth0.v3.management.hooks.RestClient') + def test_update_secrets(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Hooks(domain='domain', token='jwttoken') + c.update_secrets('an-id', {'a': 'b', 'c': 'd'}) + + args, kwargs = mock_instance.patch.call_args + + self.assertEqual('https://domain/api/v2/hooks/an-id/secrets', args[0]) + self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) From 7a4bc478b22f8c7135b68ccb1bea598ef4a9da4a Mon Sep 17 00:00:00 2001 From: Guillaume Pujol Date: Fri, 3 Jul 2020 10:27:47 +0200 Subject: [PATCH 108/663] add Hooks to Auth0 Management attributes --- auth0/v3/management/auth0.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/auth0/v3/management/auth0.py b/auth0/v3/management/auth0.py index 3b4d425f..850e5991 100644 --- a/auth0/v3/management/auth0.py +++ b/auth0/v3/management/auth0.py @@ -8,6 +8,7 @@ from .emails import Emails from .grants import Grants from .guardian import Guardian +from .hooks import Hooks from .jobs import Jobs from .logs import Logs from .resource_servers import ResourceServers @@ -42,6 +43,7 @@ def __init__(self, domain, token): self.email_templates = EmailTemplates(domain, token) self.grants = Grants(domain, token) self.guardian = Guardian(domain, token) + self.hooks = Hooks(domain, token) self.jobs = Jobs(domain, token) self.logs = Logs(domain, token) self.resource_servers = ResourceServers(domain, token) From 65f149065b23a381303ad6f2b688cdf3094707af Mon Sep 17 00:00:00 2001 From: Guillaume Pujol Date: Fri, 3 Jul 2020 10:47:11 +0200 Subject: [PATCH 109/663] add missing in test_auth0.py for Hooks --- auth0/v3/test/management/test_auth0.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/auth0/v3/test/management/test_auth0.py b/auth0/v3/test/management/test_auth0.py index 51e2f8df..a3fa8b57 100644 --- a/auth0/v3/test/management/test_auth0.py +++ b/auth0/v3/test/management/test_auth0.py @@ -10,6 +10,7 @@ from ...management.email_templates import EmailTemplates from ...management.grants import Grants from ...management.guardian import Guardian +from ...management.hooks import Hooks from ...management.jobs import Jobs from ...management.logs import Logs from ...management.resource_servers import ResourceServers @@ -61,6 +62,9 @@ def test_grants(self): def test_guardian(self): self.assertIsInstance(self.a0.guardian, Guardian) + def test_hooks(self): + self.assertIsInstance(self.a0.hooks, Hooks) + def test_jobs(self): self.assertIsInstance(self.a0.jobs, Jobs) From 55e8db96ab3542da6735d76a4bef3588ebe2070f Mon Sep 17 00:00:00 2001 From: Guillaume Pujol Date: Fri, 3 Jul 2020 10:51:48 +0200 Subject: [PATCH 110/663] fix import for Python2 --- auth0/v3/management/hooks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/management/hooks.py b/auth0/v3/management/hooks.py index 91a8b61d..5809876c 100644 --- a/auth0/v3/management/hooks.py +++ b/auth0/v3/management/hooks.py @@ -1,4 +1,4 @@ -from auth0.v3.management.rest import RestClient +from .rest import RestClient class Hooks(object): From b93281cc0b13eee10e623f20e0041f727ee0c58a Mon Sep 17 00:00:00 2001 From: Guillaume Pujol Date: Fri, 3 Jul 2020 22:19:22 +0200 Subject: [PATCH 111/663] remove fields and include_fields from Hooks.get_secrets --- auth0/v3/management/hooks.py | 17 +++-------------- auth0/v3/test/management/test_hooks.py | 11 +---------- 2 files changed, 4 insertions(+), 24 deletions(-) diff --git a/auth0/v3/management/hooks.py b/auth0/v3/management/hooks.py index 5809876c..a6d2a34e 100644 --- a/auth0/v3/management/hooks.py +++ b/auth0/v3/management/hooks.py @@ -129,27 +129,16 @@ def update(self, id, body): """ return self.client.patch(self._url(id), data=body) - def get_secrets(self, id, fields=None, include_fields=True): + def get_secrets(self, id): """Retrieves a hook's secrets. Args: id (str): The id of the hook to retrieve secrets from. - fields (list, optional): A list of fields to include or exclude - (depending on include_fields) from the result, empty to - retrieve all fields. - - include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise - (defaults to true). - See: https://auth0.com/docs/api/management/v2#!/Hooks/get_secrets """ - params = { - "fields": fields and ",".join(fields) or None, - "include_fields": str(include_fields).lower(), - } - return self.client.get(self._url("%s/secrets" % id), params=params) + + return self.client.get(self._url("%s/secrets" % id)) def add_secrets(self, id, body): """Add one or more secrets for an existing hook. diff --git a/auth0/v3/test/management/test_hooks.py b/auth0/v3/test/management/test_hooks.py index 9098240c..d6528f2f 100644 --- a/auth0/v3/test/management/test_hooks.py +++ b/auth0/v3/test/management/test_hooks.py @@ -138,16 +138,7 @@ def test_get_secrets(self, mock_rc): args, kwargs = mock_instance.get.call_args self.assertEqual('https://domain/api/v2/hooks/an-id/secrets', args[0]) - self.assertEqual(kwargs['params'], {'fields': None, - 'include_fields': 'true'}) - - c.get_secrets('an-id', fields=['a', 'b'], include_fields=False) - - args, kwargs = mock_instance.get.call_args - - self.assertEqual('https://domain/api/v2/hooks/an-id/secrets', args[0]) - self.assertEqual(kwargs['params'], {'fields': 'a,b', - 'include_fields': 'false'}) + self.assertNotIn("params", kwargs) @mock.patch('auth0.v3.management.hooks.RestClient') def test_delete_secrets(self, mock_rc): From e8fabe13e98b0b9ea12f9e5ce7e7e99d7af44187 Mon Sep 17 00:00:00 2001 From: Guillaume Pujol Date: Mon, 13 Jul 2020 15:43:11 +0200 Subject: [PATCH 112/663] remove include_fields from Hooks.get() since auth0 mentions this is unsupported --- auth0/v3/management/hooks.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/auth0/v3/management/hooks.py b/auth0/v3/management/hooks.py index a6d2a34e..0493b6c5 100644 --- a/auth0/v3/management/hooks.py +++ b/auth0/v3/management/hooks.py @@ -85,7 +85,7 @@ def create(self, body): """ return self.client.post(self._url(), data=body) - def get(self, id, fields=None, include_fields=True): + def get(self, id, fields=None): """Retrieves a hook by its ID. Args: @@ -95,15 +95,10 @@ def get(self, id, fields=None, include_fields=True): (depending on include_fields) from the result, empty to retrieve all fields. - include_fields (bool, optional): True if the fields specified are - to be included in the result, False otherwise - (defaults to true). - See: https://auth0.com/docs/api/management/v2#!/Hooks/get_hooks_by_id """ params = { "fields": fields and ",".join(fields) or None, - "include_fields": str(include_fields).lower(), } return self.client.get(self._url(id), params=params) From d69ca20af9c13602fbed675ada35672ec7d33799 Mon Sep 17 00:00:00 2001 From: Guillaume Pujol Date: Mon, 13 Jul 2020 15:46:36 +0200 Subject: [PATCH 113/663] fixed test case after include_fields removed from Hooks.get() --- auth0/v3/test/management/test_hooks.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/auth0/v3/test/management/test_hooks.py b/auth0/v3/test/management/test_hooks.py index d6528f2f..5376b1c8 100644 --- a/auth0/v3/test/management/test_hooks.py +++ b/auth0/v3/test/management/test_hooks.py @@ -81,16 +81,14 @@ def test_get(self, mock_rc): args, kwargs = mock_instance.get.call_args self.assertEqual('https://domain/api/v2/hooks/an-id', args[0]) - self.assertEqual(kwargs['params'], {'fields': None, - 'include_fields': 'true'}) + self.assertEqual(kwargs['params'], {'fields': None}) - c.get('an-id', fields=['a', 'b'], include_fields=False) + c.get('an-id', fields=['a', 'b']) args, kwargs = mock_instance.get.call_args self.assertEqual('https://domain/api/v2/hooks/an-id', args[0]) - self.assertEqual(kwargs['params'], {'fields': 'a,b', - 'include_fields': 'false'}) + self.assertEqual(kwargs['params'], {'fields': 'a,b'}) @mock.patch('auth0.v3.management.hooks.RestClient') def test_delete(self, mock_rc): From 1571b18535c46502e39e70f988f96624f2dfef21 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 13 Jul 2020 14:29:35 -0300 Subject: [PATCH 114/663] Release 3.12.0 --- CHANGELOG.md | 14 ++++++++++++++ auth0/__init__.py | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5159df52..d7a55985 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,20 @@ Changes ======= +3.12.0 +------------------ + +**Added** +- Add missing user profile properties to the signup endpoint [\#231](https://github.com/auth0/auth0-python/pull/231) ([lbalmaceda](https://github.com/lbalmaceda)) +- Add Hooks management API [\#227](https://github.com/auth0/auth0-python/pull/227) ([guillp](https://github.com/guillp)) +- Add missing external_id property to the import users job [\#222](https://github.com/auth0/auth0-python/pull/222) ([lbalmaceda](https://github.com/lbalmaceda)) + +**Changed** +- Remove iat claim value check [\#223](https://github.com/auth0/auth0-python/pull/223) ([lbalmaceda](https://github.com/lbalmaceda)) + +**Fixed** +- Skip sending optional parameters on POST request when unspecified [\#230](https://github.com/auth0/auth0-python/pull/230) ([lbalmaceda](https://github.com/lbalmaceda)) + 3.11.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index b8b2efb8..447562b9 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.11.0' +__version__ = '3.12.0' From 83c93744a9701e82b42ab9a1a9719e6db71b9ccd Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 26 Aug 2020 18:24:53 -0300 Subject: [PATCH 115/663] add log streams API --- auth0/v3/management/log_streams.py | 81 ++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 auth0/v3/management/log_streams.py diff --git a/auth0/v3/management/log_streams.py b/auth0/v3/management/log_streams.py new file mode 100644 index 00000000..659f23d0 --- /dev/null +++ b/auth0/v3/management/log_streams.py @@ -0,0 +1,81 @@ +from .rest import RestClient + + +class Logs(object): + """Auth0 log streams endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/log-streams'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + + def list(self): + """Search log events. + + Args: + See: https://auth0.com/docs/api/management/v2/#!/Log_Streams/get_log_streams + """ + + return self.client.get(self._url(), params={}) + + def get(self, id): + """Retrieves the data related to the log stream entry identified by id. + + Args: + id (str): The id of the log stream to retrieve. + + See: https://auth0.com/docs/api/management/v2/#!/Log_Streams/get_log_streams_by_id + """ + + return self.client.get(self._url(id)) + + def create(self, body): + """Creates a new log stream. + + Args: + body (dict): the attributes for the role to create. + + See: https://auth0.com/docs/api/management/v2/#!/Log_Streams/post_log_streams + """ + return self.client.post(self._url(), data=body) + + def delete(self, id): + """Delete a log stream. + + Args: + id (str): The id of the log ste to delete. + + See: https://auth0.com/docs/api/management/v2/#!/Log_Streams/delete_log_streams_by_id + """ + return self.client.delete(self._url(id)) + + def update(self, id, body): + """Update a log stream with the attributes passed in 'body' + + Args: + id (str): The id of the log stream to update. + + body (dict): the attributes to update on the log stream. + + See: https://auth0.com/docs/api/management/v2/#!/Log_Streams/patch_log_streams_by_id + """ + return self.client.patch(self._url(id), data=body) From 6f138791211894afac88618878e6367bc0545234 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 26 Aug 2020 18:26:28 -0300 Subject: [PATCH 116/663] add API class to the readme --- README.rst | 1 + auth0/v3/management/auth0.py | 2 ++ auth0/v3/management/log_streams.py | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index d405e164..38e1436d 100644 --- a/README.rst +++ b/README.rst @@ -238,6 +238,7 @@ Available Management Endpoints - Guardian() ( ``Auth0().guardian`` ) - Jobs() ( ``Auth0().jobs`` ) - Logs() ( ``Auth0().logs`` ) +- LogStreams() ( ``Auth0().log_streams`` ) - ResourceServers() (``Auth0().resource_servers`` ) - Roles() ( ``Auth0().roles`` ) - Rules() ( ``Auth0().rules`` ) diff --git a/auth0/v3/management/auth0.py b/auth0/v3/management/auth0.py index 850e5991..262760dd 100644 --- a/auth0/v3/management/auth0.py +++ b/auth0/v3/management/auth0.py @@ -10,6 +10,7 @@ from .guardian import Guardian from .hooks import Hooks from .jobs import Jobs +from .log_streams import LogStreams from .logs import Logs from .resource_servers import ResourceServers from .roles import Roles @@ -46,6 +47,7 @@ def __init__(self, domain, token): self.hooks = Hooks(domain, token) self.jobs = Jobs(domain, token) self.logs = Logs(domain, token) + self.log_streams = LogStreams(domain, token) self.resource_servers = ResourceServers(domain, token) self.roles = Roles(domain, token) self.rules = Rules(domain, token) diff --git a/auth0/v3/management/log_streams.py b/auth0/v3/management/log_streams.py index 659f23d0..c0de134f 100644 --- a/auth0/v3/management/log_streams.py +++ b/auth0/v3/management/log_streams.py @@ -1,7 +1,7 @@ from .rest import RestClient -class Logs(object): +class LogStreams(object): """Auth0 log streams endpoints Args: From 5c5615cc6e6f5156fbd7cb09484622756824f7a5 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 26 Aug 2020 18:38:52 -0300 Subject: [PATCH 117/663] add unit tests for the log stream API --- auth0/v3/management/log_streams.py | 2 +- auth0/v3/test/management/test_auth0.py | 9 +- auth0/v3/test/management/test_log_streams.py | 86 ++++++++++++++++++++ 3 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 auth0/v3/test/management/test_log_streams.py diff --git a/auth0/v3/management/log_streams.py b/auth0/v3/management/log_streams.py index c0de134f..deddeb3b 100644 --- a/auth0/v3/management/log_streams.py +++ b/auth0/v3/management/log_streams.py @@ -35,7 +35,7 @@ def list(self): See: https://auth0.com/docs/api/management/v2/#!/Log_Streams/get_log_streams """ - return self.client.get(self._url(), params={}) + return self.client.get(self._url()) def get(self, id): """Retrieves the data related to the log stream entry identified by id. diff --git a/auth0/v3/test/management/test_auth0.py b/auth0/v3/test/management/test_auth0.py index a3fa8b57..da4d550d 100644 --- a/auth0/v3/test/management/test_auth0.py +++ b/auth0/v3/test/management/test_auth0.py @@ -1,17 +1,19 @@ import unittest + from ...management.auth0 import Auth0 from ...management.blacklists import Blacklists -from ...management.clients import Clients from ...management.client_grants import ClientGrants +from ...management.clients import Clients from ...management.connections import Connections from ...management.custom_domains import CustomDomains from ...management.device_credentials import DeviceCredentials -from ...management.emails import Emails from ...management.email_templates import EmailTemplates +from ...management.emails import Emails from ...management.grants import Grants from ...management.guardian import Guardian from ...management.hooks import Hooks from ...management.jobs import Jobs +from ...management.log_streams import LogStreams from ...management.logs import Logs from ...management.resource_servers import ResourceServers from ...management.roles import Roles @@ -71,6 +73,9 @@ def test_jobs(self): def test_logs(self): self.assertIsInstance(self.a0.logs, Logs) + def test_log_streams(self): + self.assertIsInstance(self.a0.log_streams, LogStreams) + def test_resource_servers(self): self.assertIsInstance(self.a0.resource_servers, ResourceServers) diff --git a/auth0/v3/test/management/test_log_streams.py b/auth0/v3/test/management/test_log_streams.py new file mode 100644 index 00000000..94f3d36d --- /dev/null +++ b/auth0/v3/test/management/test_log_streams.py @@ -0,0 +1,86 @@ +import unittest + +import mock + +from ...management.log_streams import LogStreams + + +class TestLogStreams(unittest.TestCase): + + def test_init_with_optionals(self): + t = LogStreams(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + + @mock.patch('auth0.v3.management.log_streams.RestClient') + def test_list(self, mock_rc): + mock_instance = mock_rc.return_value + + c = LogStreams(domain='domain', token='jwttoken') + + c.list() + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/log-streams', args[0]) + + @mock.patch('auth0.v3.management.log_streams.RestClient') + def test_get(self, mock_rc): + mock_instance = mock_rc.return_value + + c = LogStreams(domain='domain', token='jwttoken') + c.get('an-id') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/log-streams/an-id', args[0]) + + @mock.patch('auth0.v3.management.log_streams.RestClient') + def test_create(self, mock_rc): + mock_instance = mock_rc.return_value + + c = LogStreams(domain='domain', token='jwttoken') + # Sample data belongs to an `http` stream + log_stream_data = { + "name": "string", + "type": "http", + "sink": { + "httpEndpoint": "string", + "httpContentType": "string", + "httpContentFormat": "JSONLINES|JSONARRAY", + "httpAuthorization": "string" + } + } + c.create(log_stream_data) + + args, kwargs = mock_instance.post.call_args + + self.assertEqual('https://domain/api/v2/log-streams', args[0]) + self.assertEqual(kwargs['data'], log_stream_data) + + @mock.patch('auth0.v3.management.log_streams.RestClient') + def test_delete(self, mock_rc): + mock_instance = mock_rc.return_value + + c = LogStreams(domain='domain', token='jwttoken') + c.delete('an-id') + + mock_instance.delete.assert_called_with( + 'https://domain/api/v2/log-streams/an-id' + ) + + @mock.patch('auth0.v3.management.log_streams.RestClient') + def test_update(self, mock_rc): + mock_instance = mock_rc.return_value + log_stream_update = { + "name": "string" + } + + c = LogStreams(domain='domain', token='jwttoken') + c.update('an-id', log_stream_update) + + args, kwargs = mock_instance.patch.call_args + + self.assertEqual('https://domain/api/v2/log-streams/an-id', args[0]) + self.assertEqual(kwargs['data'], log_stream_update) From ff8e41e3ff12d8b34fe66945b8748a689f5a7782 Mon Sep 17 00:00:00 2001 From: Matt Armand Date: Thu, 20 Aug 2020 09:57:34 -0400 Subject: [PATCH 118/663] Import hooks in management __init__ so that 'from auth0.v3.management import Hooks' is possible --- auth0/v3/management/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/auth0/v3/management/__init__.py b/auth0/v3/management/__init__.py index 547425fe..98d92db8 100644 --- a/auth0/v3/management/__init__.py +++ b/auth0/v3/management/__init__.py @@ -9,6 +9,7 @@ from .emails import Emails from .grants import Grants from .guardian import Guardian +from .hooks import Hooks from .jobs import Jobs from .logs import Logs from .resource_servers import ResourceServers From 3b2ee92062c9388641c928d20adf7b89542f28c8 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 28 Aug 2020 11:51:03 -0300 Subject: [PATCH 119/663] Add log-streams entity to the __init__.py file --- auth0/v3/management/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/auth0/v3/management/__init__.py b/auth0/v3/management/__init__.py index 98d92db8..00c597db 100644 --- a/auth0/v3/management/__init__.py +++ b/auth0/v3/management/__init__.py @@ -1,4 +1,3 @@ -from .auth0 import Auth0 from .blacklists import Blacklists from .client_grants import ClientGrants from .clients import Clients @@ -11,8 +10,10 @@ from .guardian import Guardian from .hooks import Hooks from .jobs import Jobs +from .log_streams import LogStreams from .logs import Logs from .resource_servers import ResourceServers +from .roles import Roles from .rules import Rules from .rules_configs import RulesConfigs from .stats import Stats From b580ce0d2034cc442632e9ab3d3e509476b25a95 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 28 Aug 2020 11:51:41 -0300 Subject: [PATCH 120/663] re-add the 'auth0' client --- auth0/v3/management/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/auth0/v3/management/__init__.py b/auth0/v3/management/__init__.py index 00c597db..452b4cc4 100644 --- a/auth0/v3/management/__init__.py +++ b/auth0/v3/management/__init__.py @@ -1,3 +1,4 @@ +from .auth0 import Auth0 from .blacklists import Blacklists from .client_grants import ClientGrants from .clients import Clients From 62f5da839a718f80db532dd266c3663b05b794af Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 28 Aug 2020 11:59:00 -0300 Subject: [PATCH 121/663] Release v3.13.0 --- CHANGELOG.md | 9 +++++++++ auth0/__init__.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7a55985..2aeb927b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ Changes ======= +3.13.0 +------------------ + +**Added** +- Add support for Log Streams API [\#236](https://github.com/auth0/auth0-python/pull/236) ([lbalmaceda](https://github.com/lbalmaceda)) + +**Fixed** +- Fix imports on the management/__init__.py file [\#235](https://github.com/auth0/auth0-python/pull/235) ([matthewarmand](https://github.com/matthewarmand)) + 3.12.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 447562b9..8576e6e6 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.12.0' +__version__ = '3.13.0' From a060059ae264c1415385a3b63df49db5c742531c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 28 Aug 2020 18:34:57 -0300 Subject: [PATCH 122/663] add note in the readme about bot protection --- README.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.rst b/README.rst index 38e1436d..e9983b26 100644 --- a/README.rst +++ b/README.rst @@ -223,6 +223,27 @@ When consuming methods from the API clients, the requests could fail for a numbe resets is exposed in the ``reset_at`` property. When the header is unset, this value will be ``-1``. - Network timeouts: Adjustable by passing a ``timeout`` argument to the client. See the `rate limit docs `_ for details. +============== +Bot Protection +============== + +If you are using the `Bot Protection `_ feature and performing database +login/signup via the Authentication API, you need to handle the ``requires_verification`` error. It indicates that the request was +flagged as suspicious and an additional verification step is necessary to log the user in. That verification step is web-based, +so you need to use Universal Login to complete it. + +.. code-block:: python + + from auth0.v3.authentication import Database + + db = Database('myaccount.auth0.com') + + try: + res = db.signup(client_id='my_client_id', email='user@app.com', password='secret', connection='database-1') + except Auth0Error as err: + if (err.error_code == 'requires_verification') + # Use the AuthorizeClient and redirect the user to the Universal Login to complete the authentication + Available Management Endpoints ============================== From 258338c5a9e0789444873ce99a70d011b2fb9b97 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 3 Sep 2020 14:40:01 -0300 Subject: [PATCH 123/663] Revert "add note in the readme about bot protection" This reverts commit a060059ae264c1415385a3b63df49db5c742531c. --- README.rst | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/README.rst b/README.rst index e9983b26..38e1436d 100644 --- a/README.rst +++ b/README.rst @@ -223,27 +223,6 @@ When consuming methods from the API clients, the requests could fail for a numbe resets is exposed in the ``reset_at`` property. When the header is unset, this value will be ``-1``. - Network timeouts: Adjustable by passing a ``timeout`` argument to the client. See the `rate limit docs `_ for details. -============== -Bot Protection -============== - -If you are using the `Bot Protection `_ feature and performing database -login/signup via the Authentication API, you need to handle the ``requires_verification`` error. It indicates that the request was -flagged as suspicious and an additional verification step is necessary to log the user in. That verification step is web-based, -so you need to use Universal Login to complete it. - -.. code-block:: python - - from auth0.v3.authentication import Database - - db = Database('myaccount.auth0.com') - - try: - res = db.signup(client_id='my_client_id', email='user@app.com', password='secret', connection='database-1') - except Auth0Error as err: - if (err.error_code == 'requires_verification') - # Use the AuthorizeClient and redirect the user to the Universal Login to complete the authentication - Available Management Endpoints ============================== From 2c701eb2007bc473846803910aa727195beea0cf Mon Sep 17 00:00:00 2001 From: fossabot Date: Wed, 9 Sep 2020 10:59:35 -0700 Subject: [PATCH 124/663] Add license scan report and status Signed off by: fossabot --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index 38e1436d..ea1650d9 100644 --- a/README.rst +++ b/README.rst @@ -1,3 +1,5 @@ +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python?ref=badge_shield) + ************** Auth0 - Python ************** @@ -307,3 +309,6 @@ file for more info. .. |license| image:: https://img.shields.io/:license-mit-blue.svg?style=flat-square :target: https://opensource.org/licenses/MIT :alt: License + + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python?ref=badge_large) \ No newline at end of file From 17132436921c43b6905cb121e3d7962345b28e19 Mon Sep 17 00:00:00 2001 From: lbalmaceda Date: Tue, 27 Oct 2020 08:30:32 -0300 Subject: [PATCH 125/663] Setup the CODEOWNERS for pull request reviews --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c9ff4921..60f116c0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @auth0/dx-sdks-approver +* @auth0/dx-sdks-engineer From ded2fdc2bc42866a217dba17f162a879dca9ee18 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 28 Oct 2020 18:11:11 -0300 Subject: [PATCH 126/663] Setup pull-request and issue templates --- .github/ISSUE_TEMPLATE.md | 39 ---------------- .github/ISSUE_TEMPLATE/config.yml | 5 +++ .github/ISSUE_TEMPLATE/feature_request.md | 39 ++++++++++++++++ .github/ISSUE_TEMPLATE/report_a_bug.md | 55 +++++++++++++++++++++++ 4 files changed, 99 insertions(+), 39 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/report_a_bug.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 44eae341..00000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,39 +0,0 @@ -In order to efficiently and accurately address your issue or feature request, please read through the template below and answer all relevant questions. Your additional work here is greatly appreciated and will help us respond as quickly as possible. Please delete any sections or questions below that do not pertain to this request. - -For general support or usage questions, please use the [Auth0 Community](https://community.auth0.com/) or [Auth0 Support](https://support.auth0.com). - -### Description - -Description of the bug or feature request and why it's a problem. Consider including: - -- The use case or overall problem you're trying to solve -- Information about when the problem started - -### Prerequisites - -- [ ] I have checked the [README documentation](https://github.com/auth0/auth0-python/blob/master/README.rst). -- [ ] I have checked the [Auth0 Community](https://community.auth0.com/) for related posts. -- [ ] I have checked for related or duplicate [Issues](https://github.com/auth0/auth0-python/issues) and [PRs](https://github.com/auth0/auth0-python/pulls). -- [ ] I have read the [Auth0 general contribution guidelines](https://github.com/auth0/open-source-template/blob/master/GENERAL-CONTRIBUTING.md). -- [ ] I have read the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md). -- [ ] I am reporting this to the correct repository. - -### Environment - -Please provide the following: - -- Version of the library being used -- Version of the platform or framework used, if applicable -- Relevant environmental versions (language version, OS version) -- Additional modules/plugins/add-ons that might be affecting your instance - -### Reproduction - -Detail the steps taken to reproduce this error and note if this issue can be reproduced consistently or if it is intermittent. - -Please include: - -- Code sample to reproduce the issue -- Log files (redact/remove sensitive information) -- Application settings (redact/remove sensitive information) -- Screenshots, if helpful diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..b785e527 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Auth0 Community + url: https://community.auth0.com/c/sdks/5 + about: Discuss this SDK in the Auth0 Community forums \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..9faeb3c5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,39 @@ +--- + name: Feature request + about: Suggest an idea or a feature for this project + title: '' + labels: feature request + assignees: '' + --- + + + + ### Describe the problem you'd like to have solved + + + + ### Describe the ideal solution + + + + ## Alternatives and current work-arounds + + + + ### Additional information, if any + + \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/report_a_bug.md b/.github/ISSUE_TEMPLATE/report_a_bug.md new file mode 100644 index 00000000..5786565e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/report_a_bug.md @@ -0,0 +1,55 @@ +--- + name: Report a bug + about: Have you found a bug or issue? Create a bug report for this SDK + title: '' + labels: bug report + assignees: '' + --- + + + + ### Describe the problem + + + + ### What was the expected behavior? + + + + ### Reproduction + + + - Step 1.. + - Step 2.. + - ... + + ### Environment + + + + - **Version of this library used:** + - **Which framework are you using, if applicable:** + - **Other modules/plugins/libraries that might be involved:** + - **Any other relevant information you think would be useful:** \ No newline at end of file From 445d19c4f425e5871647fb8fc3cc35038699dba3 Mon Sep 17 00:00:00 2001 From: Jim Anderson Date: Thu, 29 Oct 2020 08:53:31 -0500 Subject: [PATCH 127/663] update issue templates config Add link to library docs --- .github/ISSUE_TEMPLATE/config.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b785e527..4cd71d48 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,4 +2,7 @@ blank_issues_enabled: false contact_links: - name: Auth0 Community url: https://community.auth0.com/c/sdks/5 - about: Discuss this SDK in the Auth0 Community forums \ No newline at end of file + about: Discuss this SDK in the Auth0 Community forums + - name: Library Documentation + url: https://github.com/auth0/auth0-python/blob/master/README.rst + about: Read the library docs From ae34d181d61ce3f7c4a1e3cd52fed469b40bce06 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 18 Nov 2020 10:50:56 -0300 Subject: [PATCH 128/663] Setup pull-request and issue templates --- .github/ISSUE_TEMPLATE/config.yml | 5 +- .github/ISSUE_TEMPLATE/feature_request.md | 76 +++++++-------- .github/ISSUE_TEMPLATE/report_a_bug.md | 108 +++++++++++----------- 3 files changed, 93 insertions(+), 96 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 4cd71d48..b785e527 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,7 +2,4 @@ blank_issues_enabled: false contact_links: - name: Auth0 Community url: https://community.auth0.com/c/sdks/5 - about: Discuss this SDK in the Auth0 Community forums - - name: Library Documentation - url: https://github.com/auth0/auth0-python/blob/master/README.rst - about: Read the library docs + about: Discuss this SDK in the Auth0 Community forums \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 9faeb3c5..68352ba2 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,39 +1,39 @@ --- - name: Feature request - about: Suggest an idea or a feature for this project - title: '' - labels: feature request - assignees: '' - --- - - - - ### Describe the problem you'd like to have solved - - - - ### Describe the ideal solution - - - - ## Alternatives and current work-arounds - - - - ### Additional information, if any - - \ No newline at end of file +name: Feature request +about: Suggest an idea or a feature for this project +title: '' +labels: feature request +assignees: '' +--- + + + +### Describe the problem you'd like to have solved + + + +### Describe the ideal solution + + + +## Alternatives and current work-arounds + + + +### Additional information, if any + + \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/report_a_bug.md b/.github/ISSUE_TEMPLATE/report_a_bug.md index 5786565e..50b9fa7e 100644 --- a/.github/ISSUE_TEMPLATE/report_a_bug.md +++ b/.github/ISSUE_TEMPLATE/report_a_bug.md @@ -1,55 +1,55 @@ --- - name: Report a bug - about: Have you found a bug or issue? Create a bug report for this SDK - title: '' - labels: bug report - assignees: '' - --- - - - - ### Describe the problem - - - - ### What was the expected behavior? - - - - ### Reproduction - - - - Step 1.. - - Step 2.. - - ... - - ### Environment - - - - - **Version of this library used:** - - **Which framework are you using, if applicable:** - - **Other modules/plugins/libraries that might be involved:** - - **Any other relevant information you think would be useful:** \ No newline at end of file +name: Report a bug +about: Have you found a bug or issue? Create a bug report for this SDK +title: '' +labels: bug report +assignees: '' +--- + + + +### Describe the problem + + + +### What was the expected behavior? + + + +### Reproduction + + +- Step 1.. +- Step 2.. +- ... + +### Environment + + + +- **Version of this library used:** +- **Which framework are you using, if applicable:** +- **Other modules/plugins/libraries that might be involved:** +- **Any other relevant information you think would be useful:** \ No newline at end of file From 06effedc66c435ceafb1db82b1a603806346032c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 18 Nov 2020 14:51:26 +0100 Subject: [PATCH 129/663] Update config.yml --- .github/ISSUE_TEMPLATE/config.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b785e527..4cd71d48 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,4 +2,7 @@ blank_issues_enabled: false contact_links: - name: Auth0 Community url: https://community.auth0.com/c/sdks/5 - about: Discuss this SDK in the Auth0 Community forums \ No newline at end of file + about: Discuss this SDK in the Auth0 Community forums + - name: Library Documentation + url: https://github.com/auth0/auth0-python/blob/master/README.rst + about: Read the library docs From 5f7928fc484be4f1448fe82cad2b60437776d260 Mon Sep 17 00:00:00 2001 From: Kyle Purdon Date: Wed, 25 Nov 2020 15:57:42 -0700 Subject: [PATCH 130/663] Adds a new user method invalidate_remembered_browsers https://auth0.com/docs/api/management/v2#!/Users/post_invalidate_remember_browser --- auth0/v3/management/users.py | 12 ++++++++++++ auth0/v3/test/management/test_users.py | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index d90c5a4f..c5663ad7 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -353,3 +353,15 @@ def get_log_events(self, user_id, page=0, per_page=50, sort=None, url = self._url('{}/logs'.format(user_id)) return self.client.get(url, params=params) + + def invalidate_remembered_browsers(self, user_id): + """Invalidate all remembered browsers across all authentication factors for a user. + + Args: + user_id (str): The user_id to invalidate remembered browsers for. + + See: https://auth0.com/docs/api/management/v2#!/Users/post_invalidate_remember_browser + """ + + url = self._url('{}/multifactor/actions/invalidate-remember-browser'.format(user_id)) + return self.client.post(url) diff --git a/auth0/v3/test/management/test_users.py b/auth0/v3/test/management/test_users.py index fc9bc104..c59cb4fc 100644 --- a/auth0/v3/test/management/test_users.py +++ b/auth0/v3/test/management/test_users.py @@ -293,3 +293,13 @@ def test_get_log_events(self, mock_rc): self.assertEqual(kwargs['params']['per_page'], 50) self.assertIsNone(kwargs['params']['sort']) self.assertEqual(kwargs['params']['include_totals'], 'false') + + @mock.patch('auth0.v3.management.users.RestClient') + def test_invalidate_remembered_browsers(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Users(domain='domain', token='jwttoken') + u.invalidate_remembered_browsers('used_id') + + args, kwargs = mock_instance.post.call_args + self.assertEqual('https://domain/api/v2/users/used_id/multifactor/actions/invalidate-remember-browser', args[0]) From e1adcbe51d955180ae0559d6c9c3a098660e477c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 22 Dec 2020 17:38:58 +0100 Subject: [PATCH 131/663] Apply suggestions from code review --- auth0/v3/test/management/test_users.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/auth0/v3/test/management/test_users.py b/auth0/v3/test/management/test_users.py index c59cb4fc..359876e1 100644 --- a/auth0/v3/test/management/test_users.py +++ b/auth0/v3/test/management/test_users.py @@ -299,7 +299,7 @@ def test_invalidate_remembered_browsers(self, mock_rc): mock_instance = mock_rc.return_value u = Users(domain='domain', token='jwttoken') - u.invalidate_remembered_browsers('used_id') + u.invalidate_remembered_browsers('user-id') args, kwargs = mock_instance.post.call_args - self.assertEqual('https://domain/api/v2/users/used_id/multifactor/actions/invalidate-remember-browser', args[0]) + self.assertEqual('https://domain/api/v2/users/user-id/multifactor/actions/invalidate-remember-browser', args[0]) From b88b056d0c68eb26a1171f33273010faf8fefe63 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 22 Dec 2020 17:44:45 +0100 Subject: [PATCH 132/663] Release 3.14.0 --- CHANGELOG.md | 6 ++++++ auth0/__init__.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2aeb927b..ec850fc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changes ======= +3.14.0 +------------------ + +**Added** +- Adds a new user method invalidate_remembered_browsers [\#248](https://github.com/auth0/auth0-python/pull/248) ([kpurdon](https://github.com/kpurdon)) + 3.13.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 8576e6e6..6e9b3ce4 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.13.0' +__version__ = '3.14.0' From e604c974d7d8e705ea2a00e5c485261d89da0e74 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 22 Feb 2021 18:29:08 +0100 Subject: [PATCH 133/663] fix Fossa badge --- README.rst | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index ea1650d9..24e22454 100644 --- a/README.rst +++ b/README.rst @@ -1,10 +1,8 @@ -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python?ref=badge_shield) - ************** Auth0 - Python ************** -|pypi| |build| |coverage| |license| +|pypi| |build| |coverage| |license| |fossa| In this repository, you'll find all the information about integrating Auth0 with Python. @@ -310,5 +308,6 @@ file for more info. :target: https://opensource.org/licenses/MIT :alt: License - -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python?ref=badge_large) \ No newline at end of file +.. |fossa| image:: https://app.fossa.com/api/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python.svg?type=large + :target: https://app.fossa.com/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python?ref=badge_large + :alt: fossa \ No newline at end of file From 34247b9c1c3ff3ba72814b0dd4975b4c15a8962b Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 24 Feb 2021 13:21:16 +0100 Subject: [PATCH 134/663] move authentication before management API --- README.rst | 171 ++++++++++++++++++++++++++--------------------------- 1 file changed, 85 insertions(+), 86 deletions(-) diff --git a/README.rst b/README.rst index 24e22454..44067f36 100644 --- a/README.rst +++ b/README.rst @@ -48,6 +48,79 @@ For python3, use the following command Python 3.2 and 3.3 have reached `EOL `_ and support will be removed in the near future. +======================== +Authentication SDK Usage +======================== + +The Authentication SDK is divided into components mimicking the structure of the +`API's documentation `_. +For example: + +.. code-block:: python + + from auth0.v3.authentication import Social + + social = Social('myaccount.auth0.com') + + s.login(client_id='...', access_token='...', connection='facebook') + +=================== +ID Token validation +=================== + +As the result of the authentication and among the credentials received, an ``id_token`` +might be present. This artifact contains information associated to the user that has +just logged in, provided the scope used contained ``openid``. You can read more +about ID tokens `here `_. + +Before you access their contents, you must first verify the ID token to ensure its +contents has not been tampered with and that is meant for your application to consume. + +For that purpose you use the ``TokenVerifier`` class, which requires to be passed +a few options: +* A ``SignatureVerifier`` instance, in charge of checking the expected algorithm +and signature. +* The expected issuer value, typically matches the Auth0 domain prefixed with +``https://`` and suffixed with ``/``. +* The expected audience value, typically matches the Auth0 application client ID. + +You choose the signature verifier depending on the signing algorithm used by your Auth0 application. +You can check its value under ``Advanced settings | OAuth | JsonWebToken Signature Algorithm``. +* For symmetric algorithms like "HS256", use the `SymmetricSignatureVerifier` class passing +as secret the client secret value for your Auth0 application. +* For asymmetric algorithms like "RS256", use the `AsymmetricSignatureVerifier` class passing +the public URL where the certificates for the public keys can be found. + +Auth0 hosts Public Keys inside the ``.well-known`` directory of your tenant's domain. +That URL looks like this: ``https://myaccount.auth0.com/.well-known/jwks.json``. +After replacing `myaccount.auth0.com` with your tenant's domain, you should be able +to access your tenant's public keys. + +It is recommended that you make use of asymmetric signing algorithms as their keys are easier +to rotate in case they need to be revoked. + +With all in place, the next snippets shows how to verify an RS256 signed ID token: + +.. code-block:: python + + from auth0.v3.authentication.token_verifier import TokenVerifier, AsymmetricSignatureVerifier + + domain = 'myaccount.auth0.com' + client_id = 'exampleid' + + # After authenticating + id_token = auth_result['id_token'] + + jwks_url = 'https://{}/.well-known/jwks.json'.format(domain) + issuer = 'https://{}/'.format(domain) + + sv = AsymmetricSignatureVerifier(jwks_url) # Reusable instance + tv = TokenVerifier(signature_verifier=sv, issuer=issuer, audience=client_id) + tv.verify(id_token) + +Provided something goes wrong, a ``TokenValidationError`` will be raised. In this +scenario, the ID token should be deemed invalid and its contents not be trusted. + ==================== Management SDK Usage ==================== @@ -140,79 +213,6 @@ Success! All endpoints follow a similar structure to ``connections``, and try to follow as closely as possible the `API documentation `_. -======================== -Authentication SDK Usage -======================== - -The Authentication SDK is divided into components mimicking the structure of the -`API's documentation `_. -For example: - -.. code-block:: python - - from auth0.v3.authentication import Social - - social = Social('myaccount.auth0.com') - - s.login(client_id='...', access_token='...', connection='facebook') - -=================== -ID Token validation -=================== - -As the result of the authentication and among the credentials received, an ``id_token`` -might be present. This artifact contains information associated to the user that has -just logged in, provided the scope used contained ``openid``. You can read more -about ID tokens `here `_. - -Before you access their contents, you must first verify the ID token to ensure its -contents has not been tampered with and that is meant for your application to consume. - -For that purpose you use the ``TokenVerifier`` class, which requires to be passed -a few options: -* A ``SignatureVerifier`` instance, in charge of checking the expected algorithm -and signature. -* The expected issuer value, typically matches the Auth0 domain prefixed with -``https://`` and suffixed with ``/``. -* The expected audience value, typically matches the Auth0 application client ID. - -You choose the signature verifier depending on the signing algorithm used by your Auth0 application. -You can check its value under ``Advanced settings | OAuth | JsonWebToken Signature Algorithm``. -* For symmetric algorithms like "HS256", use the `SymmetricSignatureVerifier` class passing -as secret the client secret value for your Auth0 application. -* For asymmetric algorithms like "RS256", use the `AsymmetricSignatureVerifier` class passing -the public URL where the certificates for the public keys can be found. - -Auth0 hosts Public Keys inside the ``.well-known`` directory of your tenant's domain. -That URL looks like this: ``https://myaccount.auth0.com/.well-known/jwks.json``. -After replacing `myaccount.auth0.com` with your tenant's domain, you should be able -to access your tenant's public keys. - -It is recommended that you make use of asymmetric signing algorithms as their keys are easier -to rotate in case they need to be revoked. - -With all in place, the next snippets shows how to verify an RS256 signed ID token: - -.. code-block:: python - - from auth0.v3.authentication.token_verifier import TokenVerifier, AsymmetricSignatureVerifier - - domain = 'myaccount.auth0.com' - client_id = 'exampleid' - - # After authenticating - id_token = auth_result['id_token'] - - jwks_url = 'https://{}/.well-known/jwks.json'.format(domain) - issuer = 'https://{}/'.format(domain) - - sv = AsymmetricSignatureVerifier(jwks_url) # Reusable instance - tv = TokenVerifier(signature_verifier=sv, issuer=issuer, audience=client_id) - tv.verify(id_token) - -Provided something goes wrong, a ``TokenValidationError`` will be raised. In this -scenario, the ID token should be deemed invalid and its contents not be trusted. - ============== Error Handling ============== @@ -223,6 +223,18 @@ When consuming methods from the API clients, the requests could fail for a numbe resets is exposed in the ``reset_at`` property. When the header is unset, this value will be ``-1``. - Network timeouts: Adjustable by passing a ``timeout`` argument to the client. See the `rate limit docs `_ for details. +Available Authentication Endpoints +================================== + +- Users ( ``authentication.Users`` ) +- Database ( ``authentication.Database`` ) +- Delegated ( ``authentication.Delegated`` ) +- Enterprise ( ``authentication.Enterprise`` ) +- Passwordless ( ``authentication.Passwordless`` ) +- Social ( ``authentication.Social`` ) +- API Authorization - Get Token ( ``authentication.GetToken``) +- API Authorization - Authorization Code Grant (``authentication.AuthorizeClient``) +     Available Management Endpoints ============================== @@ -250,19 +262,6 @@ Available Management Endpoints - Users() ( ``Auth0().users`` ) - UsersByEmail() ( ``Auth0().users_by_email`` ) -Available Authentication Endpoints -================================== - -- Users ( ``authentication.Users`` ) -- Database ( ``authentication.Database`` ) -- Delegated ( ``authentication.Delegated`` ) -- Enterprise ( ``authentication.Enterprise`` ) -- Passwordless ( ``authentication.Passwordless`` ) -- Social ( ``authentication.Social`` ) -- API Authorization - Get Token ( ``authentication.GetToken``) -- API Authorization - Authorization Code Grant (``authentication.AuthorizeClient``) -     - ========== Change Log ========== From 273d3d78b92b893c8995334e03d0f98c6ebd4e48 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 24 Feb 2021 18:53:36 +0100 Subject: [PATCH 135/663] add basic auth snippets to the readme --- README.rst | 76 +++++++++++++++++----------- auth0/v3/authentication/get_token.py | 6 +-- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/README.rst b/README.rst index 44067f36..835cc81f 100644 --- a/README.rst +++ b/README.rst @@ -6,30 +6,6 @@ Auth0 - Python In this repository, you'll find all the information about integrating Auth0 with Python. - -============== -What is Auth0? -============== - -Auth0 helps you to: - -* Add authentication with `multiple authentication sources `_, - either social like **Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce, among others**, - or enterprise identity systems like **Windows Azure AD, Google Apps, Active Directory, ADFS or any SAML Identity Provider**. -* Add authentication through more traditional `username/password databases `_. -* Add support for `linking different user accounts `_ with the same user. -* Support for generating signed `JSON Web Tokens `_ to call your APIs and **flow the user identity** securely. -* Analytics of how, when and where users are logging in. -* Pull data from other sources and add it to the user profile, through `JavaScript rules `_. - - -=========================== -Create a free Auth0 Account -=========================== - -1. Go to `Auth0`_ and click Sign Up. -2. Use Google, GitHub or Microsoft Account to log in. - ============ Installation ============ @@ -62,7 +38,30 @@ For example: social = Social('myaccount.auth0.com') - s.login(client_id='...', access_token='...', connection='facebook') + social.login(client_id='...', access_token='...', connection='facebook') + + +If you need to sign up a user using their email and password, you can use the Database object. + +.. code-block:: python + + from auth0.v3.authentication import Database + + database = Database('myaccount.auth0.com'') + + database.signup(client_id='...', email='user@domain.com', password='secr3t', connection='Username-Password-Authentication') + + +If you need to authenticate a user using their email and password, you can use the GetToken object, which gives you access to requests made against the /oauth/token endpoint. + +.. code-block:: python + + from auth0.v3.authentication import GetToken + + token = GetToken('myaccount.auth0.com') + + token.login(client_id='...', client_secret='...', username='user@domain.com', password='secr3t', realm='Username-Password-Authentication') + =================== ID Token validation @@ -234,7 +233,8 @@ Available Authentication Endpoints - Social ( ``authentication.Social`` ) - API Authorization - Get Token ( ``authentication.GetToken``) - API Authorization - Authorization Code Grant (``authentication.AuthorizeClient``) -     + + Available Management Endpoints ============================== @@ -276,11 +276,27 @@ If you have found a bug or if you have a feature request, please report them at Please do not report security vulnerabilities on the public GitHub issue tracker. The `Responsible Disclosure Program `_ details the procedure for disclosing security issues. -====== -Author -====== +============== +What is Auth0? +============== + +Auth0 helps you to: -`Auth0`_ +* Add authentication with `multiple authentication sources `_, + either social like **Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce, among others**, + or enterprise identity systems like **Windows Azure AD, Google Apps, Active Directory, ADFS or any SAML Identity Provider**. +* Add authentication through more traditional `username/password databases `_. +* Add support for `linking different user accounts `_ with the same user. +* Support for generating signed `JSON Web Tokens `_ to call your APIs and **flow the user identity** securely. +* Analytics of how, when and where users are logging in. +* Pull data from other sources and add it to the user profile, through `JavaScript rules `_. + +=========================== +Create a free Auth0 Account +=========================== + +1. Go to `Auth0 `_ and click Sign Up. +2. Use Google, GitHub or Microsoft Account to log in. ======= License diff --git a/auth0/v3/authentication/get_token.py b/auth0/v3/authentication/get_token.py index dfc0c05d..28109697 100644 --- a/auth0/v3/authentication/get_token.py +++ b/auth0/v3/authentication/get_token.py @@ -3,7 +3,7 @@ class GetToken(AuthenticationBase): - """Oauth/token related endpoints + """/oauth/token related endpoints Args: domain (str): Your auth0 domain (e.g: username.auth0.com) @@ -116,7 +116,7 @@ def client_credentials(self, client_id, client_secret, audience, def login(self, client_id, client_secret, username, password, scope, realm, audience, grant_type='http://auth0.com/oauth/grant-type/password-realm'): - """Calls oauth/token endpoint with password-realm grant type + """Calls /oauth/token endpoint with password-realm grant type This is the OAuth 2.0 grant that highly trusted apps utilize in order @@ -165,7 +165,7 @@ def login(self, client_id, client_secret, username, password, scope, realm, ) def refresh_token(self, client_id, client_secret, refresh_token, grant_type='refresh_token'): - """Calls oauth/token endpoint with refresh token grant type + """Calls /oauth/token endpoint with refresh token grant type Use this endpoint to refresh an access token, using the refresh token you got during authorization. From 5164edf304e3480145cdedf678151daacafa71d9 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 25 Feb 2021 11:24:25 +0100 Subject: [PATCH 136/663] remove fossa badge --- README.rst | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index 835cc81f..a3feb62a 100644 --- a/README.rst +++ b/README.rst @@ -2,7 +2,7 @@ Auth0 - Python ************** -|pypi| |build| |coverage| |license| |fossa| +|pypi| |build| |coverage| |license| In this repository, you'll find all the information about integrating Auth0 with Python. @@ -321,8 +321,4 @@ file for more info. .. |license| image:: https://img.shields.io/:license-mit-blue.svg?style=flat-square :target: https://opensource.org/licenses/MIT - :alt: License - -.. |fossa| image:: https://app.fossa.com/api/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python.svg?type=large - :target: https://app.fossa.com/projects/git%2Bgithub.com%2Fauth0%2Fauth0-python?ref=badge_large - :alt: fossa \ No newline at end of file + :alt: License \ No newline at end of file From 9c2b9ebf35c43d6b61c7aa5f0ddf673ab55f8ad3 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 26 Feb 2021 16:32:04 +0100 Subject: [PATCH 137/663] Apply suggestions from code review Co-authored-by: Jim Anderson --- README.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index a3feb62a..30979ea0 100644 --- a/README.rst +++ b/README.rst @@ -28,8 +28,8 @@ Python 3.2 and 3.3 have reached `EOL `_. +The Authentication SDK is organized into components that mirror the structure of the +`API documentation `_. For example: .. code-block:: python @@ -52,7 +52,7 @@ If you need to sign up a user using their email and password, you can use the Da database.signup(client_id='...', email='user@domain.com', password='secr3t', connection='Username-Password-Authentication') -If you need to authenticate a user using their email and password, you can use the GetToken object, which gives you access to requests made against the /oauth/token endpoint. +If you need to authenticate a user using their email and password, you can use the ``GetToken`` object, which enables making requests to the ``/oauth/token`` endpoint. .. code-block:: python @@ -321,4 +321,4 @@ file for more info. .. |license| image:: https://img.shields.io/:license-mit-blue.svg?style=flat-square :target: https://opensource.org/licenses/MIT - :alt: License \ No newline at end of file + :alt: License From 64b43b80c4e227d1c1ecb7f819737de01414d9f7 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 25 Feb 2021 14:31:55 +0100 Subject: [PATCH 138/663] update version for autodoc with sphynx --- docs/conf.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 98802d8d..09aa2102 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -54,7 +54,7 @@ # General information about the project. project = u'Auth0 - Python' -copyright = u'2015, Auth0' +copyright = u'2020, Auth0' author = u'Auth0' # The version info for the project you're documenting, acts as replacement for @@ -62,9 +62,9 @@ # built documents. # # The short X.Y version. -version = '2.0' +version = '3.14.0' # The full version, including alpha/beta/rc tags. -release = '2.0.0b2' +release = '3.14.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From d0d5fe87546d2acaabc22237b54cca578db26ea7 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 26 Feb 2021 16:32:25 +0100 Subject: [PATCH 139/663] amend the ID token validation section --- README.rst | 63 +++++++++++++++++++++--------------------------------- 1 file changed, 24 insertions(+), 39 deletions(-) diff --git a/README.rst b/README.rst index 30979ea0..be31bb6c 100644 --- a/README.rst +++ b/README.rst @@ -67,58 +67,43 @@ If you need to authenticate a user using their email and password, you can use t ID Token validation =================== -As the result of the authentication and among the credentials received, an ``id_token`` -might be present. This artifact contains information associated to the user that has -just logged in, provided the scope used contained ``openid``. You can read more -about ID tokens `here `_. - -Before you access their contents, you must first verify the ID token to ensure its -contents has not been tampered with and that is meant for your application to consume. - -For that purpose you use the ``TokenVerifier`` class, which requires to be passed -a few options: -* A ``SignatureVerifier`` instance, in charge of checking the expected algorithm -and signature. -* The expected issuer value, typically matches the Auth0 domain prefixed with -``https://`` and suffixed with ``/``. -* The expected audience value, typically matches the Auth0 application client ID. - -You choose the signature verifier depending on the signing algorithm used by your Auth0 application. -You can check its value under ``Advanced settings | OAuth | JsonWebToken Signature Algorithm``. -* For symmetric algorithms like "HS256", use the `SymmetricSignatureVerifier` class passing -as secret the client secret value for your Auth0 application. -* For asymmetric algorithms like "RS256", use the `AsymmetricSignatureVerifier` class passing -the public URL where the certificates for the public keys can be found. - -Auth0 hosts Public Keys inside the ``.well-known`` directory of your tenant's domain. -That URL looks like this: ``https://myaccount.auth0.com/.well-known/jwks.json``. -After replacing `myaccount.auth0.com` with your tenant's domain, you should be able -to access your tenant's public keys. - -It is recommended that you make use of asymmetric signing algorithms as their keys are easier -to rotate in case they need to be revoked. - -With all in place, the next snippets shows how to verify an RS256 signed ID token: +Upon successful authentication, the credentials received may include an ``id_token``, if the authentication request contained the ``openid`` scope. The ``id_token`` contains information associated with the authenticated user. You can read more about ID tokens `here `_. -.. code-block:: python +Before you access its contents, you must verify that the ID token has not been tampered with and that it is meant for your application to consume. The ``TokenVerifier`` class can be used to perform this verification. - from auth0.v3.authentication.token_verifier import TokenVerifier, AsymmetricSignatureVerifier +To create a ``TokenVerifier``, the following arguments are required: +* A ``SignatureVerifier`` instance, which is responsible for verifying the token's algorithm name and signature. +* The expected issuer value, which typically matches the Auth0 domain prefixed with ``https://`` and suffixed with ``/``. +* The expected audience value, which typically matches the Auth0 application client ID. + +The type of ``SignatureVerifier`` used depends upon the signing algorithm used by your Auth0 application. You can view this value in your application settings under ``Advanced settings | OAuth | JsonWebToken Signature Algorithm``. Auth0 recommends using the RS256 asymmetric signing algorithm. You can read more about signing algorithms `here `_. + +For asymmetric algorithms like RS256, use the ``AsymmetricSignatureVerifier`` class, passing +the public URL where the certificates for the public keys can be found. This will typically be your Auth0 domain with the ``/.well-known/jwks.json`` path appended to it. For example, ``https://your-domain.auth0.com/.well-known/jwks.json``. + +For symmetric algorithms like HS256, use the ``SymmetricSignatureVerifier`` class, passing the value of the client secret of your Auth0 application. +The following example demonstrates the verification of an ID token signed with the RS256 signing algorithm: + +.. code-block:: python + + from auth0.v3.authentication.token_verifier import TokenVerifier, AsymmetricSignatureVerifier + domain = 'myaccount.auth0.com' client_id = 'exampleid' - + # After authenticating id_token = auth_result['id_token'] - + jwks_url = 'https://{}/.well-known/jwks.json'.format(domain) issuer = 'https://{}/'.format(domain) - + sv = AsymmetricSignatureVerifier(jwks_url) # Reusable instance tv = TokenVerifier(signature_verifier=sv, issuer=issuer, audience=client_id) tv.verify(id_token) + +If the token verification fails, a ``TokenValidationError`` will be raised. In that scenario, the ID token should be deemed invalid and its contents should not be trusted. -Provided something goes wrong, a ``TokenValidationError`` will be raised. In this -scenario, the ID token should be deemed invalid and its contents not be trusted. ==================== Management SDK Usage From 1e2fa551fc7f80b3973dc3631f6b22d7038cb7af Mon Sep 17 00:00:00 2001 From: Jim Anderson Date: Thu, 25 Mar 2021 08:59:33 -0500 Subject: [PATCH 140/663] Add support for organizations feature (#258) * Add support for organizations feature * README updates - fix typo, add info about where to get invitation ID --- README.rst | 69 +++++++++++++++++++ auth0/v3/authentication/authorize_client.py | 6 +- auth0/v3/authentication/token_verifier.py | 17 ++++- .../authentication/test_authorize_client.py | 29 +++++++- .../authentication/test_token_verifier.py | 38 +++++++++- 5 files changed, 150 insertions(+), 9 deletions(-) diff --git a/README.rst b/README.rst index be31bb6c..a9e053d4 100644 --- a/README.rst +++ b/README.rst @@ -104,6 +104,75 @@ The following example demonstrates the verification of an ID token signed with t If the token verification fails, a ``TokenValidationError`` will be raised. In that scenario, the ID token should be deemed invalid and its contents should not be trusted. +=========================== +Organizations (Closed Beta) +=========================== + +Organizations is a set of features that provide better support for developers who build and maintain SaaS and Business-to-Business (B2B) applications. + +Using Organizations, you can: +* Represent teams, business customers, partner companies, or any logical grouping of users that should have different ways of accessing your applications, as organizations. +* Manage their membership in a variety of ways, including user invitation. +* Configure branded, federated login flows for each organization. +* Implement role-based access control, such that users can have different roles when authenticating in the context of different organizations. +* Build administration capabilities into your products, using Organizations APIs, so that those businesses can manage their own organizations. + +Note that Organizations is currently only available to customers on our Enterprise and Startup subscription plans. + +------------------------- +Log in to an organization +------------------------- + +Log in to an organization by specifying the ``organization`` property when calling ``authorize()``: + +.. code-block:: python + + from auth0.v3.authentication.authorize_client import AuthorizeClient + + client = AuthorizeClient('my.domain.com') + + client.authorize(client_id='client_id', + redirect_uri='http://localhost', + organization="org_abc") + +When logging into an organization, it is important to ensure the ``org_id`` claim of the ID Token matches the expected organization value. The ``TokenVerifier`` can be be used to ensure the ID Token contains the expected ``org_id`` claim value: + +.. code-block:: python + + from auth0.v3.authentication.token_verifier import TokenVerifier, AsymmetricSignatureVerifier + + domain = 'myaccount.auth0.com' + client_id = 'exampleid' + + # After authenticating + id_token = auth_result['id_token'] + + jwks_url = 'https://{}/.well-known/jwks.json'.format(domain) + issuer = 'https://{}/'.format(domain) + + sv = AsymmetricSignatureVerifier(jwks_url) # Reusable instance + tv = TokenVerifier(signature_verifier=sv, issuer=issuer, audience=client_id) + + # pass the expected organization the user logged in to: + tv.verify(id_token, organization='org_abc') + +----------------------- +Accept user invitations +----------------------- + +Accept a user invitation by specifying the ``invitation`` property when calling ``authorize()``. Note that you must also specify the ``organization`` if providing an ``invitation``. +The ID of the invitation and organization are available as query parameters on the invitation URL, e.g., ``https://your-domain.auth0.com/login?invitation=invitation_id&organization=org_id&organization_name=org_name`` + +.. code-block:: python + + from auth0.v3.authentication.authorize_client import AuthorizeClient + + client = AuthorizeClient('my.domain.com') + + client.authorize(client_id='client_id', + redirect_uri='http://localhost', + organization='org_abc', + invitation="invitation_123") ==================== Management SDK Usage diff --git a/auth0/v3/authentication/authorize_client.py b/auth0/v3/authentication/authorize_client.py index db5060c5..bc9621fb 100644 --- a/auth0/v3/authentication/authorize_client.py +++ b/auth0/v3/authentication/authorize_client.py @@ -10,7 +10,7 @@ class AuthorizeClient(AuthenticationBase): """ def authorize(self, client_id, audience=None, state=None, redirect_uri=None, - response_type='code', scope='openid'): + response_type='code', scope='openid', organization=None, invitation=None): """Authorization code grant This is the OAuth 2.0 grant that regular web apps utilize in order to access an API. @@ -21,7 +21,9 @@ def authorize(self, client_id, audience=None, state=None, redirect_uri=None, 'response_type': response_type, 'scope': scope, 'state': state, - 'redirect_uri': redirect_uri + 'redirect_uri': redirect_uri, + 'organization': organization, + 'invitation': invitation } return self.get( diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index e86938aa..a6a11cde 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -227,13 +227,15 @@ def __init__(self, signature_verifier, issuer, audience, leeway=0): token (str): The JWT to verify. nonce (str, optional): The nonce value sent during authentication. max_age (int, optional): The max_age value sent during authentication. + organization (str, optional): The expected organization ID (org_id) claim value. This should be specified + when logging in to an organization. Raises: TokenValidationError: when the token cannot be decoded, the token signing algorithm is not the expected one, the token signature is invalid or the token has a claim missing or with unexpected value. """ - def verify(self, token, nonce=None, max_age=None): + def verify(self, token, nonce=None, max_age=None, organization=None): # Verify token presence if not token or not isinstance(token, str): raise TokenValidationError("ID token is required but missing.") @@ -242,9 +244,9 @@ def verify(self, token, nonce=None, max_age=None): payload = self._sv.verify_signature(token) # Verify claims - self._verify_payload(payload, nonce, max_age) + self._verify_payload(payload, nonce, max_age, organization) - def _verify_payload(self, payload, nonce=None, max_age=None): + def _verify_payload(self, payload, nonce=None, max_age=None, organization=None): try: # on Python 2.7, 'str' keys as parsed as 'unicode' # But 'unicode' was removed on Python 3.7 @@ -307,6 +309,15 @@ def _verify_payload(self, payload, nonce=None, max_age=None): 'Nonce (nonce) claim mismatch in the ID token; expected "{}", ' 'found "{}"'.format(nonce, payload['nonce'])) + # Organization + if organization: + if 'org_id' not in payload or not isinstance(payload['org_id'], (str, ustr)): + raise TokenValidationError('Organization (org_id) claim must be a string present in the ID token') + if payload['org_id'] != organization: + raise TokenValidationError( + 'Organization (org_id) claim mismatch in the ID token; expected "{}", ' + 'found "{}"'.format(organization, payload['org_id'])) + # Authorized party if isinstance(payload['aud'], list) and len(payload['aud']) > 1: if 'azp' not in payload or not isinstance(payload['azp'], (str, ustr)): diff --git a/auth0/v3/test/authentication/test_authorize_client.py b/auth0/v3/test/authentication/test_authorize_client.py index 1bc54ec2..59febf3d 100644 --- a/auth0/v3/test/authentication/test_authorize_client.py +++ b/auth0/v3/test/authentication/test_authorize_client.py @@ -15,7 +15,9 @@ def test_login(self, mock_get): state='st', redirect_uri='http://localhost', response_type='token', - scope='openid profile') + scope='openid profile', + organization='org_123', + invitation='invitation_abc') args, kwargs = mock_get.call_args @@ -26,5 +28,28 @@ def test_login(self, mock_get): 'state': 'st', 'redirect_uri': 'http://localhost', 'response_type': 'token', - 'scope': 'openid profile' + 'scope': 'openid profile', + 'organization': 'org_123', + 'invitation': 'invitation_abc' + }) + + @mock.patch('auth0.v3.authentication.authorize_client.AuthorizeClient.get') + def test_login_default_param_values(self, mock_get): + + a = AuthorizeClient('my.domain.com') + + a.authorize(client_id='cid') + + args, kwargs = mock_get.call_args + + self.assertEqual(args[0], 'https://my.domain.com/authorize') + self.assertEqual(kwargs['params'], { + 'audience': None, + 'invitation': None, + 'organization': None, + 'redirect_uri': None, + 'state': None, + 'client_id': 'cid', + 'response_type': 'code', + 'scope': 'openid' }) diff --git a/auth0/v3/test/authentication/test_token_verifier.py b/auth0/v3/test/authentication/test_token_verifier.py index 293f2606..befe8789 100644 --- a/auth0/v3/test/authentication/test_token_verifier.py +++ b/auth0/v3/test/authentication/test_token_verifier.py @@ -221,7 +221,7 @@ def asymmetric_signature_verifier_mock(): verifier._fetch_key.return_value = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(RSA_PUB_KEY_1_JWK)) return verifier - def assert_fails_with_error(self, token, error_message, signature_verifier=None, audience=expectations['audience'], issuer=expectations['issuer'], nonce=None, max_age=None, clock=MOCKED_CLOCK): + def assert_fails_with_error(self, token, error_message, signature_verifier=None, audience=expectations['audience'], issuer=expectations['issuer'], nonce=None, max_age=None, clock=MOCKED_CLOCK, organization=None): sv = signature_verifier or self.asymmetric_signature_verifier_mock() tv = TokenVerifier( signature_verifier=sv, @@ -231,7 +231,7 @@ def assert_fails_with_error(self, token, error_message, signature_verifier=None, ) tv._clock = clock with self.assertRaises(TokenValidationError) as err: - tv.verify(token, nonce, max_age) + tv.verify(token, nonce, max_age, organization) self.assertEqual(str(err.exception), error_message) def test_fails_at_creation_with_invalid_signature_verifier(self): @@ -369,3 +369,37 @@ def test_fails_when_max_age_sent_with_auth_time_invalid(self): mocked_clock = expected_auth_time + 1 self.assert_fails_with_error(token, "Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time ({}) is after last auth at ({})".format(mocked_clock, expected_auth_time), max_age=max_age, clock=mocked_clock) + + def test_passes_when_org_present_but_not_required(self): + token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhdXRoMHxzZGs0NThma3MiLCJhdWQiOiJ0b2tlbnMtdGVzdC0xMjMiLCJvcmdfaWQiOiJvcmdfMTIzIiwiaXNzIjoiaHR0cHM6Ly90b2tlbnMtdGVzdC5hdXRoMC5jb20vIiwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjF9.hjSPgJpg0Dn2z0giCdGqVLD5Kmqy_yMYlSkgwKD7ahQ" + sv = SymmetricSignatureVerifier(HMAC_SHARED_SECRET) + tv = TokenVerifier( + signature_verifier=sv, + issuer=expectations['issuer'], + audience=expectations['audience'] + ) + tv._clock = MOCKED_CLOCK + tv.verify(token) + + def test_passes_when_org_present_and_matches(self): + token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhdXRoMHxzZGs0NThma3MiLCJhdWQiOiJ0b2tlbnMtdGVzdC0xMjMiLCJvcmdfaWQiOiJvcmdfMTIzIiwiaXNzIjoiaHR0cHM6Ly90b2tlbnMtdGVzdC5hdXRoMC5jb20vIiwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjF9.hjSPgJpg0Dn2z0giCdGqVLD5Kmqy_yMYlSkgwKD7ahQ" + sv = SymmetricSignatureVerifier(HMAC_SHARED_SECRET) + tv = TokenVerifier( + signature_verifier=sv, + issuer=expectations['issuer'], + audience=expectations['audience'] + ) + tv._clock = MOCKED_CLOCK + tv.verify(token, organization='org_123') + + def test_fails_when_org_specified_but_not_present(self): + token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhdXRoMHxzZGs0NThma3MiLCJhdWQiOiJ0b2tlbnMtdGVzdC0xMjMiLCJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJleHAiOjE1ODc3NjUzNjEsImlhdCI6MTU4NzU5MjU2MX0.wotJnUdD5IfdZMewF_-BnHc0pI56uwzwr5qaSXvSu9w" + self.assert_fails_with_error(token, "Organization (org_id) claim must be a string present in the ID token", signature_verifier=SymmetricSignatureVerifier(HMAC_SHARED_SECRET), organization='org_123') + + def test_fails_when_org_specified_but_not_(self): + token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhdXRoMHxzZGs0NThma3MiLCJhdWQiOiJ0b2tlbnMtdGVzdC0xMjMiLCJvcmdfaWQiOjQyLCJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJleHAiOjE1ODc3NjUzNjEsImlhdCI6MTU4NzU5MjU2MX0.fGL1_akaHikdovS7NRYla3flne1xdtCjP0ei_CRxO6k" + self.assert_fails_with_error(token, "Organization (org_id) claim must be a string present in the ID token", signature_verifier=SymmetricSignatureVerifier(HMAC_SHARED_SECRET), organization='org_123') + + def test_fails_when_org_specified_but_does_not_match(self): + token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhdXRoMHxzZGs0NThma3MiLCJhdWQiOiJ0b2tlbnMtdGVzdC0xMjMiLCJvcmdfaWQiOiJvcmdfMTIzIiwiaXNzIjoiaHR0cHM6Ly90b2tlbnMtdGVzdC5hdXRoMC5jb20vIiwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjF9.hjSPgJpg0Dn2z0giCdGqVLD5Kmqy_yMYlSkgwKD7ahQ" + self.assert_fails_with_error(token, 'Organization (org_id) claim mismatch in the ID token; expected "org_abc", found "org_123"', signature_verifier=SymmetricSignatureVerifier(HMAC_SHARED_SECRET), organization='org_abc') \ No newline at end of file From 4f9e89e403b5f30aa45dc480687898d465bd2c11 Mon Sep 17 00:00:00 2001 From: James Anderson Date: Fri, 26 Mar 2021 10:11:45 -0500 Subject: [PATCH 141/663] Release 3.15.0 --- CHANGELOG.md | 6 ++++++ auth0/__init__.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec850fc8..820858e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changes ======= +3.15.0 +------------------ + +**Added** +- Add support for organizations feature [\#258](https://github.com/auth0/auth0-python/pull/258) ([jimmyjames](https://github.com/jimmyjames)) + 3.14.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 6e9b3ce4..254db7b7 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.14.0' +__version__ = '3.15.0' From 92f28e79a2852091c664c875f09390969b84e27c Mon Sep 17 00:00:00 2001 From: Charles Riley Date: Mon, 8 Mar 2021 16:17:41 -0500 Subject: [PATCH 142/663] Add scope to refresh_token --- auth0/v3/authentication/get_token.py | 7 ++++++- auth0/v3/test/authentication/test_get_token.py | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/auth0/v3/authentication/get_token.py b/auth0/v3/authentication/get_token.py index 28109697..55d416e1 100644 --- a/auth0/v3/authentication/get_token.py +++ b/auth0/v3/authentication/get_token.py @@ -164,7 +164,8 @@ def login(self, client_id, client_secret, username, password, scope, realm, } ) - def refresh_token(self, client_id, client_secret, refresh_token, grant_type='refresh_token'): + def refresh_token(self, client_id, client_secret, refresh_token, scope, + grant_type='refresh_token'): """Calls /oauth/token endpoint with refresh token grant type Use this endpoint to refresh an access token, using the refresh token you got during authorization. @@ -179,6 +180,9 @@ def refresh_token(self, client_id, client_secret, refresh_token, grant_type='ref refresh_token (str): The refresh token returned from the initial token request. + scope (str): String value of the different scopes the client is asking for. + Multiple scopes are separated with whitespace. + Returns: access_token, id_token """ @@ -189,6 +193,7 @@ def refresh_token(self, client_id, client_secret, refresh_token, grant_type='ref 'client_id': client_id, 'client_secret': client_secret, 'refresh_token': refresh_token, + 'scope': scope, 'grant_type': grant_type } ) diff --git a/auth0/v3/test/authentication/test_get_token.py b/auth0/v3/test/authentication/test_get_token.py index c6350229..4ba2a374 100644 --- a/auth0/v3/test/authentication/test_get_token.py +++ b/auth0/v3/test/authentication/test_get_token.py @@ -104,6 +104,7 @@ def test_refresh_token(self, mock_post): g.refresh_token(client_id='cid', client_secret='clsec', refresh_token='rt', + scope='s', grant_type='gt') args, kwargs = mock_post.call_args @@ -113,5 +114,6 @@ def test_refresh_token(self, mock_post): 'client_id': 'cid', 'client_secret': 'clsec', 'refresh_token': 'rt', + 'scope': 's', 'grant_type': 'gt' }) \ No newline at end of file From 86e5c7d7c48dbe5a4135fc6fd9f904959142d9da Mon Sep 17 00:00:00 2001 From: Charles Riley Date: Wed, 10 Mar 2021 11:57:06 -0500 Subject: [PATCH 143/663] @balmaceda code review --- auth0/v3/authentication/get_token.py | 3 +-- auth0/v3/test/authentication/test_get_token.py | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/auth0/v3/authentication/get_token.py b/auth0/v3/authentication/get_token.py index 55d416e1..dad945c2 100644 --- a/auth0/v3/authentication/get_token.py +++ b/auth0/v3/authentication/get_token.py @@ -164,8 +164,7 @@ def login(self, client_id, client_secret, username, password, scope, realm, } ) - def refresh_token(self, client_id, client_secret, refresh_token, scope, - grant_type='refresh_token'): + def refresh_token(self, client_id, client_secret, refresh_token, grant_type='refresh_token', scope=''): """Calls /oauth/token endpoint with refresh token grant type Use this endpoint to refresh an access token, using the refresh token you got during authorization. diff --git a/auth0/v3/test/authentication/test_get_token.py b/auth0/v3/test/authentication/test_get_token.py index 4ba2a374..e10c9b1c 100644 --- a/auth0/v3/test/authentication/test_get_token.py +++ b/auth0/v3/test/authentication/test_get_token.py @@ -104,8 +104,8 @@ def test_refresh_token(self, mock_post): g.refresh_token(client_id='cid', client_secret='clsec', refresh_token='rt', - scope='s', - grant_type='gt') + grant_type='gt', + scope='s') args, kwargs = mock_post.call_args @@ -114,6 +114,6 @@ def test_refresh_token(self, mock_post): 'client_id': 'cid', 'client_secret': 'clsec', 'refresh_token': 'rt', - 'scope': 's', - 'grant_type': 'gt' - }) \ No newline at end of file + 'grant_type': 'gt', + 'scope': 's' + }) From f8ce56f171a83bb90e35cae0f52ffe7dd378f411 Mon Sep 17 00:00:00 2001 From: James Anderson Date: Mon, 29 Mar 2021 08:50:53 -0500 Subject: [PATCH 144/663] Fix README --- README.rst | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/README.rst b/README.rst index a9e053d4..deaf6f82 100644 --- a/README.rst +++ b/README.rst @@ -12,24 +12,24 @@ Installation You can install the auth0 Python SDK using the following command. -.. code-block:: +.. code-block:: python pip install auth0-python For python3, use the following command -.. code-block:: +.. code-block:: python pip3 install auth0-python -Python 3.2 and 3.3 have reached `EOL `_ and support will be removed in the near future. +Python 3.2 and 3.3 have reached `EOL `__ and support will be removed in the near future. ======================== Authentication SDK Usage ======================== The Authentication SDK is organized into components that mirror the structure of the -`API documentation `_. +`API documentation `__. For example: .. code-block:: python @@ -67,16 +67,17 @@ If you need to authenticate a user using their email and password, you can use t ID Token validation =================== -Upon successful authentication, the credentials received may include an ``id_token``, if the authentication request contained the ``openid`` scope. The ``id_token`` contains information associated with the authenticated user. You can read more about ID tokens `here `_. +Upon successful authentication, the credentials received may include an ``id_token``, if the authentication request contained the ``openid`` scope. The ``id_token`` contains information associated with the authenticated user. You can read more about ID tokens `here `__. Before you access its contents, you must verify that the ID token has not been tampered with and that it is meant for your application to consume. The ``TokenVerifier`` class can be used to perform this verification. To create a ``TokenVerifier``, the following arguments are required: -* A ``SignatureVerifier`` instance, which is responsible for verifying the token's algorithm name and signature. -* The expected issuer value, which typically matches the Auth0 domain prefixed with ``https://`` and suffixed with ``/``. -* The expected audience value, which typically matches the Auth0 application client ID. -The type of ``SignatureVerifier`` used depends upon the signing algorithm used by your Auth0 application. You can view this value in your application settings under ``Advanced settings | OAuth | JsonWebToken Signature Algorithm``. Auth0 recommends using the RS256 asymmetric signing algorithm. You can read more about signing algorithms `here `_. +- A ``SignatureVerifier`` instance, which is responsible for verifying the token's algorithm name and signature. +- The expected issuer value, which typically matches the Auth0 domain prefixed with ``https://`` and suffixed with ``/``. +- The expected audience value, which typically matches the Auth0 application client ID. + +The type of ``SignatureVerifier`` used depends upon the signing algorithm used by your Auth0 application. You can view this value in your application settings under ``Advanced settings | OAuth | JsonWebToken Signature Algorithm``. Auth0 recommends using the RS256 asymmetric signing algorithm. You can read more about signing algorithms `here `__. For asymmetric algorithms like RS256, use the ``AsymmetricSignatureVerifier`` class, passing the public URL where the certificates for the public keys can be found. This will typically be your Auth0 domain with the ``/.well-known/jwks.json`` path appended to it. For example, ``https://your-domain.auth0.com/.well-known/jwks.json``. @@ -178,7 +179,7 @@ The ID of the invitation and organization are available as query parameters on t Management SDK Usage ==================== -To use the management library you will need to instantiate an Auth0 object with a domain and a `Management API v2 token `_. Please note that these token last 24 hours, so if you need it constantly you should ask for it programmatically using the client credentials grant with a `non interactive client `_ authorized to access the API. For example: +To use the management library you will need to instantiate an Auth0 object with a domain and a `Management API v2 token `__. Please note that these token last 24 hours, so if you need it constantly you should ask for it programmatically using the client credentials grant with a `non interactive client `__ authorized to access the API. For example: .. code-block:: python @@ -264,7 +265,7 @@ Which returns something like this Success! All endpoints follow a similar structure to ``connections``, and try to follow as -closely as possible the `API documentation `_. +closely as possible the `API documentation `__. ============== Error Handling @@ -274,8 +275,9 @@ When consuming methods from the API clients, the requests could fail for a numbe - Invalid data sent as part of the request: An ``Auth0Error` is raised with the error code and description. - Global or Client Rate Limit reached: A ``RateLimitError`` is raised and the time at which the limit resets is exposed in the ``reset_at`` property. When the header is unset, this value will be ``-1``. -- Network timeouts: Adjustable by passing a ``timeout`` argument to the client. See the `rate limit docs `_ for details. +- Network timeouts: Adjustable by passing a ``timeout`` argument to the client. See the `rate limit docs `__ for details. +================================== Available Authentication Endpoints ================================== @@ -288,7 +290,7 @@ Available Authentication Endpoints - API Authorization - Get Token ( ``authentication.GetToken``) - API Authorization - Authorization Code Grant (``authentication.AuthorizeClient``) - +============================== Available Management Endpoints ============================== @@ -320,7 +322,7 @@ Available Management Endpoints Change Log ========== -Please see `CHANGELOG.md `_. +Please see `CHANGELOG.md `__. =============== Issue Reporting @@ -328,7 +330,7 @@ Issue Reporting If you have found a bug or if you have a feature request, please report them at this repository issues section. Please do not report security vulnerabilities on the public GitHub issue tracker. -The `Responsible Disclosure Program `_ details the procedure for disclosing security issues. +The `Responsible Disclosure Program `__ details the procedure for disclosing security issues. ============== What is Auth0? @@ -336,20 +338,20 @@ What is Auth0? Auth0 helps you to: -* Add authentication with `multiple authentication sources `_, +* Add authentication with `multiple authentication sources `__, either social like **Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce, among others**, or enterprise identity systems like **Windows Azure AD, Google Apps, Active Directory, ADFS or any SAML Identity Provider**. -* Add authentication through more traditional `username/password databases `_. -* Add support for `linking different user accounts `_ with the same user. -* Support for generating signed `JSON Web Tokens `_ to call your APIs and **flow the user identity** securely. +* Add authentication through more traditional `username/password databases `__. +* Add support for `linking different user accounts `__ with the same user. +* Support for generating signed `JSON Web Tokens `__ to call your APIs and **flow the user identity** securely. * Analytics of how, when and where users are logging in. -* Pull data from other sources and add it to the user profile, through `JavaScript rules `_. +* Pull data from other sources and add it to the user profile, through `JavaScript rules `__. =========================== Create a free Auth0 Account =========================== -1. Go to `Auth0 `_ and click Sign Up. +1. Go to `Auth0 `__ and click Sign Up. 2. Use Google, GitHub or Microsoft Account to log in. ======= From 07e4b67bad30127aaf72b4e21852f402a4e41ac2 Mon Sep 17 00:00:00 2001 From: Garry Jeromson Date: Thu, 28 Jan 2021 23:44:21 +0100 Subject: [PATCH 145/663] Allow configuration of outgoing request protocol Remove hardcoded HTTPS in URLs for outgoing requests to make the library more friendly to integration testing, where SSL is a pain. See https://github.com/auth0/auth0-python/issues/253. --- auth0/v3/authentication/authorize_client.py | 2 +- auth0/v3/authentication/base.py | 3 ++- auth0/v3/authentication/database.py | 6 +++--- auth0/v3/authentication/delegated.py | 2 +- auth0/v3/authentication/enterprise.py | 7 +++---- auth0/v3/authentication/get_token.py | 10 +++++----- auth0/v3/authentication/logout.py | 7 ++++--- auth0/v3/authentication/passwordless.py | 6 +++--- auth0/v3/authentication/revoke_token.py | 2 +- auth0/v3/authentication/social.py | 2 +- auth0/v3/authentication/users.py | 4 ++-- auth0/v3/management/blacklists.py | 4 ++-- auth0/v3/management/client_grants.py | 5 +++-- auth0/v3/management/clients.py | 5 +++-- auth0/v3/management/connections.py | 5 +++-- auth0/v3/management/custom_domains.py | 5 +++-- auth0/v3/management/device_credentials.py | 5 +++-- auth0/v3/management/email_templates.py | 5 +++-- auth0/v3/management/emails.py | 5 +++-- auth0/v3/management/grants.py | 5 +++-- auth0/v3/management/guardian.py | 5 +++-- auth0/v3/management/hooks.py | 5 +++-- auth0/v3/management/jobs.py | 5 +++-- auth0/v3/management/log_streams.py | 5 +++-- auth0/v3/management/logs.py | 5 +++-- auth0/v3/management/resource_servers.py | 5 +++-- auth0/v3/management/roles.py | 5 +++-- auth0/v3/management/rules.py | 5 +++-- auth0/v3/management/rules_configs.py | 5 +++-- auth0/v3/management/stats.py | 5 +++-- auth0/v3/management/tenants.py | 5 +++-- auth0/v3/management/tickets.py | 5 +++-- auth0/v3/management/user_blocks.py | 5 +++-- auth0/v3/management/users.py | 5 +++-- auth0/v3/management/users_by_email.py | 5 +++-- 35 files changed, 97 insertions(+), 73 deletions(-) diff --git a/auth0/v3/authentication/authorize_client.py b/auth0/v3/authentication/authorize_client.py index bc9621fb..44ecb344 100644 --- a/auth0/v3/authentication/authorize_client.py +++ b/auth0/v3/authentication/authorize_client.py @@ -27,5 +27,5 @@ def authorize(self, client_id, audience=None, state=None, redirect_uri=None, } return self.get( - 'https://{}/authorize'.format(self.domain), + '{}://{}/authorize'.format(self.protocol, self.domain), params=params) diff --git a/auth0/v3/authentication/base.py b/auth0/v3/authentication/base.py index 056c4b5e..7747da94 100644 --- a/auth0/v3/authentication/base.py +++ b/auth0/v3/authentication/base.py @@ -20,9 +20,10 @@ class AuthenticationBase(object): (defaults to 5.0 for both) """ - def __init__(self, domain, telemetry=True, timeout=5.0): + def __init__(self, domain, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain self.timeout = timeout + self.protocol = protocol self.base_headers = {'Content-Type': 'application/json'} if telemetry: diff --git a/auth0/v3/authentication/database.py b/auth0/v3/authentication/database.py index e89a825c..e19f87be 100644 --- a/auth0/v3/authentication/database.py +++ b/auth0/v3/authentication/database.py @@ -34,7 +34,7 @@ def login(self, client_id, username, password, connection, id_token=None, body.update({'id_token': id_token}) if device: body.update({'device': device}) - return self.post('https://{}/oauth/ro'.format(self.domain), data=body) + return self.post('{}://{}/oauth/ro'.format(self.protocol, self.domain), data=body) def signup(self, client_id, email, password, connection, username=None, user_metadata=None, given_name=None, family_name=None, name=None, nickname=None, picture=None): @@ -88,7 +88,7 @@ def signup(self, client_id, email, password, connection, username=None, user_met if picture: body.update({'picture': picture}) - return self.post('https://{}/dbconnections/signup'.format(self.domain), data=body) + return self.post('{}://{}/dbconnections/signup'.format(self.protocol, self.domain), data=body) def change_password(self, client_id, email, connection, password=None): """Asks to change a password for a given user. @@ -105,4 +105,4 @@ def change_password(self, client_id, email, connection, password=None): 'connection': connection, } - return self.post('https://{}/dbconnections/change_password'.format(self.domain), data=body) + return self.post('{}://{}/dbconnections/change_password'.format(self.protocol, self.domain), data=body) diff --git a/auth0/v3/authentication/delegated.py b/auth0/v3/authentication/delegated.py index f84cef2c..9df0233f 100644 --- a/auth0/v3/authentication/delegated.py +++ b/auth0/v3/authentication/delegated.py @@ -34,4 +34,4 @@ def get_token(self, client_id, target, api_type, grant_type, raise ValueError('Either id_token or refresh_token must ' 'have a value') - return self.post('https://{}/delegation'.format(self.domain), data=data) + return self.post('{}://{}/delegation'.format(self.protocol, self.domain), data=data) diff --git a/auth0/v3/authentication/enterprise.py b/auth0/v3/authentication/enterprise.py index 63c3b115..e8ff9084 100644 --- a/auth0/v3/authentication/enterprise.py +++ b/auth0/v3/authentication/enterprise.py @@ -16,14 +16,13 @@ def saml_metadata(self, client_id): client_id (str): Client Id of the application to get the SAML metadata for. """ - return self.get(url='https://{}/samlp/metadata/{}'.format(self.domain, - client_id)) + return self.get(url='{}://{}/samlp/metadata/{}'.format(self.protocol, self.domain, client_id)) def wsfed_metadata(self): """Returns the WS-Federation Metadata. """ - url = 'https://{}/wsfed/FederationMetadata' \ + url = '{}://{}/wsfed/FederationMetadata' \ '/2007-06/FederationMetadata.xml' - return self.get(url=url.format(self.domain)) + return self.get(url=url.format(self.protocol, self.domain)) diff --git a/auth0/v3/authentication/get_token.py b/auth0/v3/authentication/get_token.py index dad945c2..04e8f24c 100644 --- a/auth0/v3/authentication/get_token.py +++ b/auth0/v3/authentication/get_token.py @@ -35,7 +35,7 @@ def authorization_code(self, client_id, client_secret, code, """ return self.post( - 'https://{}/oauth/token'.format(self.domain), + '{}://{}/oauth/token'.format(self.protocol, self.domain), data={ 'client_id': client_id, 'client_secret': client_secret, @@ -71,7 +71,7 @@ def authorization_code_pkce(self, client_id, code_verifier, code, """ return self.post( - 'https://{}/oauth/token'.format(self.domain), + '{}://{}/oauth/token'.format(self.protocol, self.domain), data={ 'client_id': client_id, 'code_verifier': code_verifier, @@ -105,7 +105,7 @@ def client_credentials(self, client_id, client_secret, audience, """ return self.post( - 'https://{}/oauth/token'.format(self.domain), + '{}://{}/oauth/token'.format(self.protocol, self.domain), data={ 'client_id': client_id, 'client_secret': client_secret, @@ -151,7 +151,7 @@ def login(self, client_id, client_secret, username, password, scope, realm, """ return self.post( - 'https://{}/oauth/token'.format(self.domain), + '{}://{}/oauth/token'.format(self.protocol, self.domain), data={ 'client_id': client_id, 'username': username, @@ -187,7 +187,7 @@ def refresh_token(self, client_id, client_secret, refresh_token, grant_type='ref """ return self.post( - 'https://{}/oauth/token'.format(self.domain), + '{}://{}/oauth/token'.format(self.protocol, self.domain), data={ 'client_id': client_id, 'client_secret': client_secret, diff --git a/auth0/v3/authentication/logout.py b/auth0/v3/authentication/logout.py index 8e154e1c..fad72457 100644 --- a/auth0/v3/authentication/logout.py +++ b/auth0/v3/authentication/logout.py @@ -31,11 +31,12 @@ def logout(self, client_id, return_to, federated=False): if federated is True: return self.get( - 'https://{}/v2/logout?federated&client_id={}&returnTo={}'.format( - self.domain, client_id, return_to) + '{}://{}/v2/logout?federated&client_id={}&returnTo={}'.format( + self.protocol, self.domain, client_id, return_to) ) return self.get( - 'https://{}/v2/logout?client_id={}&returnTo={}'.format(self.domain, + '{}://{}/v2/logout?client_id={}&returnTo={}'.format(self.protocol, + self.domain, client_id, return_to) ) diff --git a/auth0/v3/authentication/passwordless.py b/auth0/v3/authentication/passwordless.py index 8b4f8a0d..4cf18e4b 100644 --- a/auth0/v3/authentication/passwordless.py +++ b/auth0/v3/authentication/passwordless.py @@ -47,7 +47,7 @@ def email(self, client_id, email, send='link', auth_params=None, client_secret=N data.update({'client_secret': client_secret}) return self.post( - 'https://{}/passwordless/start'.format(self.domain), + '{}://{}/passwordless/start'.format(self.protocol, self.domain), data=data ) @@ -75,7 +75,7 @@ def sms(self, client_id, phone_number, client_secret=None): data.update({'client_secret': client_secret}) return self.post( - 'https://{}/passwordless/start'.format(self.domain), + '{}://{}/passwordless/start'.format(self.protocol, self.domain), data=data ) @@ -93,7 +93,7 @@ def sms_login(self, client_id, phone_number, code, scope='openid'): """ return self.post( - 'https://{}/oauth/ro'.format(self.domain), + '{}://{}/oauth/ro'.format(self.protocol, self.domain), data={ 'client_id': client_id, 'connection': 'sms', diff --git a/auth0/v3/authentication/revoke_token.py b/auth0/v3/authentication/revoke_token.py index 9523c5f7..5d746fa0 100644 --- a/auth0/v3/authentication/revoke_token.py +++ b/auth0/v3/authentication/revoke_token.py @@ -34,4 +34,4 @@ def revoke_refresh_token(self, client_id, token, client_secret=None): if client_secret: body.update({'client_secret': client_secret}) - return self.post('https://{}/oauth/revoke'.format(self.domain), data=body) + return self.post('{}://{}/oauth/revoke'.format(self.protocol, self.domain), data=body) diff --git a/auth0/v3/authentication/social.py b/auth0/v3/authentication/social.py index da6e1176..78df9aa2 100644 --- a/auth0/v3/authentication/social.py +++ b/auth0/v3/authentication/social.py @@ -29,7 +29,7 @@ def login(self, client_id, access_token, connection, scope='openid'): """ return self.post( - 'https://{}/oauth/access_token'.format(self.domain), + '{}://{}/oauth/access_token'.format(self.protocol, self.domain), data={ 'client_id': client_id, 'access_token': access_token, diff --git a/auth0/v3/authentication/users.py b/auth0/v3/authentication/users.py index 1af5e75c..75733fb5 100644 --- a/auth0/v3/authentication/users.py +++ b/auth0/v3/authentication/users.py @@ -23,7 +23,7 @@ def userinfo(self, access_token): """ return self.get( - url='https://{}/userinfo'.format(self.domain), + url='{}://{}/userinfo'.format(self.protocol, self.domain), headers={'Authorization': 'Bearer {}'.format(access_token)} ) @@ -43,6 +43,6 @@ def tokeninfo(self, jwt): """ warnings.warn("/tokeninfo will be deprecated in future releases", DeprecationWarning) return self.post( - url='https://{}/tokeninfo'.format(self.domain), + url='{}://{}/tokeninfo'.format(self.protocol, self.domain), data={'id_token': jwt} ) diff --git a/auth0/v3/management/blacklists.py b/auth0/v3/management/blacklists.py index 219a0fd5..5ef2357c 100644 --- a/auth0/v3/management/blacklists.py +++ b/auth0/v3/management/blacklists.py @@ -18,8 +18,8 @@ class Blacklists(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): - self.url = 'https://{}/api/v2/blacklists/tokens'.format(domain) + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): + self.url = '{}://{}/api/v2/blacklists/tokens'.format(protocol, domain) self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def get(self, aud=None): diff --git a/auth0/v3/management/client_grants.py b/auth0/v3/management/client_grants.py index 3c16904e..5b11b61e 100644 --- a/auth0/v3/management/client_grants.py +++ b/auth0/v3/management/client_grants.py @@ -18,12 +18,13 @@ class ClientGrants(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/client-grants'.format(self.domain) + url = '{}://{}/api/v2/client-grants'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/clients.py b/auth0/v3/management/clients.py index 2360c917..b098f2af 100644 --- a/auth0/v3/management/clients.py +++ b/auth0/v3/management/clients.py @@ -18,12 +18,13 @@ class Clients(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/clients'.format(self.domain) + url = '{}://{}/api/v2/clients'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/connections.py b/auth0/v3/management/connections.py index a32953cc..1172657b 100644 --- a/auth0/v3/management/connections.py +++ b/auth0/v3/management/connections.py @@ -18,12 +18,13 @@ class Connections(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/connections'.format(self.domain) + url = '{}://{}/api/v2/connections'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/custom_domains.py b/auth0/v3/management/custom_domains.py index c463da8d..d7e6c0b7 100644 --- a/auth0/v3/management/custom_domains.py +++ b/auth0/v3/management/custom_domains.py @@ -18,12 +18,13 @@ class CustomDomains(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://%s/api/v2/custom-domains' % self.domain + url = '{}://{}/api/v2/custom-domains'.format(self.protocol, self.domain) if id is not None: return url + '/' + id return url diff --git a/auth0/v3/management/device_credentials.py b/auth0/v3/management/device_credentials.py index ff49bf3e..06672881 100644 --- a/auth0/v3/management/device_credentials.py +++ b/auth0/v3/management/device_credentials.py @@ -18,12 +18,13 @@ class DeviceCredentials(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/device-credentials'.format(self.domain) + url = '{}://{}/api/v2/device-credentials'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/email_templates.py b/auth0/v3/management/email_templates.py index 47fc68d4..7f97c788 100644 --- a/auth0/v3/management/email_templates.py +++ b/auth0/v3/management/email_templates.py @@ -18,12 +18,13 @@ class EmailTemplates(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/email-templates'.format(self.domain) + url = '{}://{}/api/v2/email-templates'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/emails.py b/auth0/v3/management/emails.py index 99342128..ea15738c 100644 --- a/auth0/v3/management/emails.py +++ b/auth0/v3/management/emails.py @@ -18,12 +18,13 @@ class Emails(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/emails/provider'.format(self.domain) + url = '{}://{}/api/v2/emails/provider'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/grants.py b/auth0/v3/management/grants.py index a5d8b4f7..37cd3368 100644 --- a/auth0/v3/management/grants.py +++ b/auth0/v3/management/grants.py @@ -18,12 +18,13 @@ class Grants(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://%s/api/v2/grants' % self.domain + url = '{}://{}/api/v2/grants'.format(self.protocol, self.domain) if id is not None: return url + '/' + id return url diff --git a/auth0/v3/management/guardian.py b/auth0/v3/management/guardian.py index 01f64568..0e966694 100644 --- a/auth0/v3/management/guardian.py +++ b/auth0/v3/management/guardian.py @@ -18,12 +18,13 @@ class Guardian(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/guardian'.format(self.domain) + url = '{}://{}/api/v2/guardian'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/hooks.py b/auth0/v3/management/hooks.py index 0493b6c5..d3c4e9b2 100644 --- a/auth0/v3/management/hooks.py +++ b/auth0/v3/management/hooks.py @@ -19,12 +19,13 @@ class Hooks(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = "https://{}/api/v2/hooks".format(self.domain) + url = "{}://{}/api/v2/hooks".format(self.protocol, self.domain) if id is not None: return "{}/{}".format(url, id) return url diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index e629715b..0cd9b0ca 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -18,12 +18,13 @@ class Jobs(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, path=None): - url = 'https://{}/api/v2/jobs'.format(self.domain) + url = '{}://{}/api/v2/jobs'.format(self.protocol, self.domain) if path is not None: return '{}/{}'.format(url, path) return url diff --git a/auth0/v3/management/log_streams.py b/auth0/v3/management/log_streams.py index deddeb3b..16f4e957 100644 --- a/auth0/v3/management/log_streams.py +++ b/auth0/v3/management/log_streams.py @@ -18,12 +18,13 @@ class LogStreams(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/log-streams'.format(self.domain) + url = '{}://{}/api/v2/log-streams'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/logs.py b/auth0/v3/management/logs.py index afaf45a6..81ceb9fa 100644 --- a/auth0/v3/management/logs.py +++ b/auth0/v3/management/logs.py @@ -18,12 +18,13 @@ class Logs(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/logs'.format(self.domain) + url = '{}://{}/api/v2/logs'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/resource_servers.py b/auth0/v3/management/resource_servers.py index e4aeaee7..ce891363 100644 --- a/auth0/v3/management/resource_servers.py +++ b/auth0/v3/management/resource_servers.py @@ -18,12 +18,13 @@ class ResourceServers(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/resource-servers'.format(self.domain) + url = '{}://{}/api/v2/resource-servers'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/roles.py b/auth0/v3/management/roles.py index 9cbdcd75..7896156e 100644 --- a/auth0/v3/management/roles.py +++ b/auth0/v3/management/roles.py @@ -18,12 +18,13 @@ class Roles(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/roles'.format(self.domain) + url = '{}://{}/api/v2/roles'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/rules.py b/auth0/v3/management/rules.py index 73d4fa25..2cd76273 100644 --- a/auth0/v3/management/rules.py +++ b/auth0/v3/management/rules.py @@ -18,12 +18,13 @@ class Rules(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/rules'.format(self.domain) + url = '{}://{}/api/v2/rules'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/rules_configs.py b/auth0/v3/management/rules_configs.py index f4c97b3c..dc4f8a86 100644 --- a/auth0/v3/management/rules_configs.py +++ b/auth0/v3/management/rules_configs.py @@ -18,12 +18,13 @@ class RulesConfigs(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://%s/api/v2/rules-configs' % self.domain + url = '{}://{}/api/v2/rules-configs'.format(self.protocol, self.domain) if id is not None: return url + '/' + id return url diff --git a/auth0/v3/management/stats.py b/auth0/v3/management/stats.py index cb933987..a860330d 100644 --- a/auth0/v3/management/stats.py +++ b/auth0/v3/management/stats.py @@ -18,12 +18,13 @@ class Stats(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, action): - return 'https://{}/api/v2/stats/{}'.format(self.domain, action) + return '{}://{}/api/v2/stats/{}'.format(self.protocol, self.domain, action) def active_users(self): """Gets the active users count (logged in during the last 30 days). diff --git a/auth0/v3/management/tenants.py b/auth0/v3/management/tenants.py index 76fba30f..09a51f88 100644 --- a/auth0/v3/management/tenants.py +++ b/auth0/v3/management/tenants.py @@ -18,12 +18,13 @@ class Tenants(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self): - return 'https://{}/api/v2/tenants/settings'.format(self.domain) + return '{}://{}/api/v2/tenants/settings'.format(self.protocol, self.domain) def get(self, fields=None, include_fields=True): """Get tenant settings. diff --git a/auth0/v3/management/tickets.py b/auth0/v3/management/tickets.py index 985d1b46..a5e1bfca 100644 --- a/auth0/v3/management/tickets.py +++ b/auth0/v3/management/tickets.py @@ -18,12 +18,13 @@ class Tickets(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, action): - return 'https://{}/api/v2/tickets/{}'.format(self.domain, action) + return '{}://{}/api/v2/tickets/{}'.format(self.protocol, self.domain, action) def create_email_verification(self, body): """Create an email verification ticket. diff --git a/auth0/v3/management/user_blocks.py b/auth0/v3/management/user_blocks.py index 1c36f872..402e7dd1 100644 --- a/auth0/v3/management/user_blocks.py +++ b/auth0/v3/management/user_blocks.py @@ -18,12 +18,13 @@ class UserBlocks(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/user-blocks'.format(self.domain) + url = '{}://{}/api/v2/user-blocks'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index c5663ad7..09ec966e 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -20,12 +20,13 @@ class Users(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, id=None): - url = 'https://{}/api/v2/users'.format(self.domain) + url = '{}://{}/api/v2/users'.format(self.protocol, self.domain) if id is not None: return '{}/{}'.format(url, id) return url diff --git a/auth0/v3/management/users_by_email.py b/auth0/v3/management/users_by_email.py index edb2f37a..25d02277 100644 --- a/auth0/v3/management/users_by_email.py +++ b/auth0/v3/management/users_by_email.py @@ -18,12 +18,13 @@ class UsersByEmail(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self): - url = 'https://{}/api/v2/users-by-email'.format(self.domain) + url = '{}://{}/api/v2/users-by-email'.format(self.protocol, self.domain) return url def search_users_by_email(self, email, fields=None, include_fields=True): From 45816c064a78074a35486262ddc30981619b173e Mon Sep 17 00:00:00 2001 From: Adam Mcgrath Date: Thu, 8 Apr 2021 11:37:42 +0100 Subject: [PATCH 146/663] Update README.rst --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index deaf6f82..be6ad8ce 100644 --- a/README.rst +++ b/README.rst @@ -106,10 +106,10 @@ The following example demonstrates the verification of an ID token signed with t If the token verification fails, a ``TokenValidationError`` will be raised. In that scenario, the ID token should be deemed invalid and its contents should not be trusted. =========================== -Organizations (Closed Beta) +Organizations =========================== -Organizations is a set of features that provide better support for developers who build and maintain SaaS and Business-to-Business (B2B) applications. +[Organizations](https://auth0.com/docs/organizations) is a set of features that provide better support for developers who build and maintain SaaS and Business-to-Business (B2B) applications. Using Organizations, you can: * Represent teams, business customers, partner companies, or any logical grouping of users that should have different ways of accessing your applications, as organizations. From 6956265f631c4f577981915e07241e9fbe52f11d Mon Sep 17 00:00:00 2001 From: Adam Mcgrath Date: Thu, 8 Apr 2021 11:49:07 +0100 Subject: [PATCH 147/663] Update README.rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index be6ad8ce..6674025c 100644 --- a/README.rst +++ b/README.rst @@ -109,7 +109,7 @@ If the token verification fails, a ``TokenValidationError`` will be raised. In t Organizations =========================== -[Organizations](https://auth0.com/docs/organizations) is a set of features that provide better support for developers who build and maintain SaaS and Business-to-Business (B2B) applications. +`Organizations `__ is a set of features that provide better support for developers who build and maintain SaaS and Business-to-Business (B2B) applications. Using Organizations, you can: * Represent teams, business customers, partner companies, or any logical grouping of users that should have different ways of accessing your applications, as organizations. From 28999d2514ae54156e2db0352af08492b95851c9 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 6 Apr 2021 19:06:43 +0200 Subject: [PATCH 148/663] add access token validation guidance for organizations --- README.rst | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/README.rst b/README.rst index 6674025c..957267f7 100644 --- a/README.rst +++ b/README.rst @@ -175,6 +175,37 @@ The ID of the invitation and organization are available as query parameters on t organization='org_abc', invitation="invitation_123") +-------------------------------------- +Authorizing users from an Organization +-------------------------------------- + +When this SDK is used in an API or Backend application, it would typically receive network requests with an Access Token coming from the client application. These tokens include information that is useful to determine whether the request is coming from an authorized individual. + +Among checking for the Access Token's signature, expiration, and audience values, when a specific organization is expected it should also be checked against the value of the ``org_id`` claim. The snippet below attempts to illustrate how this verification could look like using the `PyJWT `__ library. This dependency will take care of pulling the RS256 public key that was used by the server to sign the Access Token. It will also validate its signature, expiration, and the audience value. After the basic verification, get the ``org_id`` claim and check it against the expected value. + +.. code-block:: python + + import jwt # PyJWT + from jwt import PyJWKClient + + access_token = # access token from the request + url = 'https://{YOUR AUTH0 DOMAIN}/.well-known/jwks.json' + jwks_client = PyJWKClient(url) + signing_key = jwks_client.get_signing_key_from_jwt(access_token) + data = jwt.decode( + access_token, + signing_key.key, + algorithms=['RS256'], + audience='{YOUR API AUDIENCE}' + ) + + organization = # expected organization ID + if data['org_id'] != organization: + raise Exception('Organization (org_id) claim mismatch') + + # if this line is reached, validation is successful + + ==================== Management SDK Usage ==================== From 110f4bafceb9027bf7f6c72352f796437c579a7c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 7 Apr 2021 15:34:42 +0200 Subject: [PATCH 149/663] update wording around organization access token verification --- README.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 957267f7..c39650a9 100644 --- a/README.rst +++ b/README.rst @@ -179,9 +179,18 @@ The ID of the invitation and organization are available as query parameters on t Authorizing users from an Organization -------------------------------------- -When this SDK is used in an API or Backend application, it would typically receive network requests with an Access Token coming from the client application. These tokens include information that is useful to determine whether the request is coming from an authorized individual. +If an ``org_id`` claim is present in the Access Token, then the claim should be validated by the API to ensure that the value received is expected or known. -Among checking for the Access Token's signature, expiration, and audience values, when a specific organization is expected it should also be checked against the value of the ``org_id`` claim. The snippet below attempts to illustrate how this verification could look like using the `PyJWT `__ library. This dependency will take care of pulling the RS256 public key that was used by the server to sign the Access Token. It will also validate its signature, expiration, and the audience value. After the basic verification, get the ``org_id`` claim and check it against the expected value. +In particular: + +- The issuer (``iss``) claim should be checked to ensure the token was issued by Auth0 +- The organization ID (``org_id``) claim should be checked to ensure it is a value that is already known to the application. This could be validated against a known list of organization IDs, or perhaps checked in conjunction with the current request URL. e.g. the sub-domain may hint at what organization should be used to validate the Access Token. + +Normally, validating the issuer would be enough to ensure that the token was issued by Auth0. In the case of organizations, additional checks should be made so that the organization within an Auth0 tenant is expected. + +If the claim cannot be validated, then the application should deem the token invalid. + +The snippet below attempts to illustrate how this verification could look like using the external `PyJWT `__ library. This dependency will take care of pulling the RS256 Public Key that was used by the server to sign the Access Token. It will also validate its signature, expiration, and the audience value. After the basic verification, get the ``org_id`` claim and check it against the expected value. The code assumes your application is configured to sign tokens using the RS256 algorithm. Check the `Validate JSON Web Tokens `__ article to learn more about this verification. .. code-block:: python From 3193799cc063e8bd5a4353947f2c466bf6a391d0 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 29 Mar 2021 19:36:09 +0200 Subject: [PATCH 150/663] add CRUD for organizations and tests --- auth0/v3/management/organizations.py | 95 +++++++++++++++++++ .../v3/test/management/test_organizations.py | 83 ++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 auth0/v3/management/organizations.py create mode 100644 auth0/v3/test/management/test_organizations.py diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py new file mode 100644 index 00000000..1955665a --- /dev/null +++ b/auth0/v3/management/organizations.py @@ -0,0 +1,95 @@ +from .rest import RestClient + + +class Organizations(object): + """Auth0 organizations endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/organizations'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + + def all_organizations(self, page=None, per_page=None): + """Retrieves a list of all the organizations. + + Args: + page (int): The result's page number (zero based). When not set, + the default value is up to the server. + + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + """ + params = {} + params['page'] = page + params['per_page'] = per_page + + return self.client.get(self._url(), params=params) + + def get_organization_by_name(self, name=None): + """Retrieves an organization given its name. + + Args: + name (str): The name of the organization to retrieve. + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + """ + params = {} + params['name'] = name + + return self.client.get(self._url(), params=params) + + def create_organization(self, body): + """Create a new organization. + + Args: + body (dict): Attributes for the new organization. + + See: https://auth0.com/docs/api/v2#!/Clients/post_clients + """ + + return self.client.post(self._url(), data=body) + + def update_organization(self, id, body): + """Modifies an organization. + + Args: + id (str): the ID of the organization. + + body (dict): Attributes to modify. + + See: https://auth0.com/docs/api/management/v2#!/Clients/patch_clients_by_id + """ + + return self.client.patch(self._url(id), data=body) + + def delete_organization(self, id): + """Deletes an organization and all its related assets. + + Args: + id (str): Id of organization to delete. + + See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + """ + + return self.client.delete(self._url(id)) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py new file mode 100644 index 00000000..00e1bab2 --- /dev/null +++ b/auth0/v3/test/management/test_organizations.py @@ -0,0 +1,83 @@ +import unittest +import mock +from ...management.organizations import Organizations + + +class TestOrganizations(unittest.TestCase): + + def test_init_with_optionals(self): + t = Organizations(domain='domain', token='jwttoken', telemetry=False, timeout=(10, 2)) + self.assertEqual(t.client.timeout, (10, 2)) + telemetry_header = t.client.base_headers.get('Auth0-Client', None) + self.assertEqual(telemetry_header, None) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_all_organizations(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + + # Default parameters are requested + c.all_organizations() + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations', args[0]) + self.assertEqual(kwargs['params'], {'page': None, + 'per_page': None}) + + # Specific pagination + c.all_organizations(page=7, per_page=25) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations', args[0]) + self.assertEqual(kwargs['params'], {'page': 7, + 'per_page': 25}) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_get_organization_by_name(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.get_organization_by_name('test-org') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations', args[0]) + self.assertEqual(kwargs['params'], {'name': 'test-org'}) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_create_organization(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.create_organization({'a': 'b', 'c': 'd'}) + + mock_instance.post.assert_called_with( + 'https://domain/api/v2/organizations', + data={'a': 'b', 'c': 'd'} + ) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_update(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.update('this-id', {'a': 'b', 'c': 'd'}) + + args, kwargs = mock_instance.patch.call_args + + self.assertEqual('https://domain/api/v2/organizations/this-id', args[0]) + self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_delete_organization(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.delete_organization('this-id') + + mock_instance.delete.assert_called_with( + 'https://domain/api/v2/organizations/this-id' + ) \ No newline at end of file From aa563d84f54c4bfd562b32f35ab9e870eb7da15c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 29 Mar 2021 20:10:21 +0200 Subject: [PATCH 151/663] fix wrong method call --- auth0/v3/test/management/test_organizations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index 00e1bab2..2a8fba89 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -60,11 +60,11 @@ def test_create_organization(self, mock_rc): ) @mock.patch('auth0.v3.management.organizations.RestClient') - def test_update(self, mock_rc): + def test_update_organization(self, mock_rc): mock_instance = mock_rc.return_value c = Organizations(domain='domain', token='jwttoken') - c.update('this-id', {'a': 'b', 'c': 'd'}) + c.update_organization('this-id', {'a': 'b', 'c': 'd'}) args, kwargs = mock_instance.patch.call_args From 36d0b3786e71d140bb2c2ee78349a7d549316668 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 30 Mar 2021 13:01:26 +0200 Subject: [PATCH 152/663] add CRUD for organization connections --- auth0/v3/management/organizations.py | 86 ++++++++++++++++++- .../v3/test/management/test_organizations.py | 73 ++++++++++++++++ 2 files changed, 157 insertions(+), 2 deletions(-) diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py index 1955665a..bfa57321 100644 --- a/auth0/v3/management/organizations.py +++ b/auth0/v3/management/organizations.py @@ -22,12 +22,17 @@ def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) - def _url(self, id=None): + def _url(self, id=None, path=None, secondary_id=None): url = 'https://{}/api/v2/organizations'.format(self.domain) if id is not None: - return '{}/{}'.format(url, id) + url = '{}/{}'.format(url, id) + if path is not None: + url = '{}/{}'.format(url, path) + if secondary_id is not None: + url = '{}/{}'.format(url, secondary_id) return url + # Organizations def all_organizations(self, page=None, per_page=None): """Retrieves a list of all the organizations. @@ -93,3 +98,80 @@ def delete_organization(self, id): """ return self.client.delete(self._url(id)) + + + # Organization Connections + def all_organization_connections(self, id, page=None, per_page=None): + """Retrieves a list of all the organization connections. + + Args: + id (str): the ID of the organization. + + page (int): The result's page number (zero based). When not set, + the default value is up to the server. + + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + """ + params = {} + params['page'] = page + params['per_page'] = per_page + + return self.client.get(self._url(id, 'enabled_connections'), params=params) + + def get_organization_connection(self, id, connection_id): + """Retrieves an organization connection by its ID. + + Args: + id (str): the ID of the organization. + + connection_id (str): the ID of the connection. + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + """ + params = {} + + return self.client.get(self._url(id, 'enabled_connections', connection_id), params=params) + + def create_organization_connection(self, id, body): + """Adds a connection to an organization. + + Args: + id (str): the ID of the organization. + + body (dict): Attributes for the connection to add. + + See: https://auth0.com/docs/api/v2#!/Clients/post_clients + """ + + return self.client.post(self._url(id, 'enabled_connections'), data=body) + + def update_organization_connection(self, id, connection_id, body): + """Modifies an organization. + + Args: + id (str): the ID of the organization. + + connection_id (str): the ID of the connection to update. + + body (dict): Attributes to modify. + + See: https://auth0.com/docs/api/management/v2#!/Clients/patch_clients_by_id + """ + + return self.client.patch(self._url(id, 'enabled_connections', connection_id), data=body) + + def delete_organization_connection(self, id, connection_id): + """Deletes a connection from the given organization. + + Args: + id (str): Id of organization. + + connection_id (str): the ID of the connection to delete. + + See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + """ + + return self.client.delete(self._url(id, 'enabled_connections', connection_id)) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index 2a8fba89..2bacb11f 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -11,6 +11,7 @@ def test_init_with_optionals(self): telemetry_header = t.client.base_headers.get('Auth0-Client', None) self.assertEqual(telemetry_header, None) + # Organizations @mock.patch('auth0.v3.management.organizations.RestClient') def test_all_organizations(self, mock_rc): mock_instance = mock_rc.return_value @@ -80,4 +81,76 @@ def test_delete_organization(self, mock_rc): mock_instance.delete.assert_called_with( 'https://domain/api/v2/organizations/this-id' + ) + + # Organization Connections + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_all_organization_connections(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + + # Default parameters are requested + c.all_organization_connections('test-org') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/enabled_connections', args[0]) + self.assertEqual(kwargs['params'], {'page': None, + 'per_page': None}) + + # Specific pagination + c.all_organization_connections('test-org', page=7, per_page=25) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/enabled_connections', args[0]) + self.assertEqual(kwargs['params'], {'page': 7, + 'per_page': 25}) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_get_organization_connection(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.get_organization_connection('test-org', 'test-con') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/enabled_connections/test-con', args[0]) + self.assertEqual(kwargs['params'], {}) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_create_organization_connection(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.create_organization_connection('test-org', {'a': 'b', 'c': 'd'}) + + mock_instance.post.assert_called_with( + 'https://domain/api/v2/organizations/test-org/enabled_connections', + data={'a': 'b', 'c': 'd'} + ) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_update_organization_connection(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.update_organization_connection('test-org', 'test-con', {'a': 'b', 'c': 'd'}) + + args, kwargs = mock_instance.patch.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/enabled_connections/test-con', args[0]) + self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_delete_organization_connection(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.delete_organization_connection('test-org', 'test-con') + + mock_instance.delete.assert_called_with( + 'https://domain/api/v2/organizations/test-org/enabled_connections/test-con' ) \ No newline at end of file From 8b2982530d7daece103ec9e5cd6b6240b50f8a83 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 30 Mar 2021 15:40:07 +0200 Subject: [PATCH 153/663] add CRUD for organization members --- auth0/v3/management/organizations.py | 47 ++++++++++++++++++ .../v3/test/management/test_organizations.py | 49 +++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py index bfa57321..ce611695 100644 --- a/auth0/v3/management/organizations.py +++ b/auth0/v3/management/organizations.py @@ -175,3 +175,50 @@ def delete_organization_connection(self, id, connection_id): """ return self.client.delete(self._url(id, 'enabled_connections', connection_id)) + + # Organization Members + def all_organization_members(self, id, page=None, per_page=None): + """Retrieves a list of all the organization members. + + Args: + id (str): the ID of the organization. + + page (int): The result's page number (zero based). When not set, + the default value is up to the server. + + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + """ + params = {} + params['page'] = page + params['per_page'] = per_page + + return self.client.get(self._url(id, 'members'), params=params) + + def create_organization_members(self, id, body): + """Adds members to an organization. + + Args: + id (str): the ID of the organization. + + body (dict): Attributes from the members to add. + + See: https://auth0.com/docs/api/v2#!/Clients/post_clients + """ + + return self.client.post(self._url(id, 'members'), data=body) + + def delete_organization_members(self, id, body): + """Deletes members from the given organization. + + Args: + id (str): Id of organization. + + body (dict): Attributes from the members to delete + + See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + """ + + return self.client.delete(self._url(id, 'members'), data=body) \ No newline at end of file diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index 2bacb11f..25bbe74a 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -153,4 +153,53 @@ def test_delete_organization_connection(self, mock_rc): mock_instance.delete.assert_called_with( 'https://domain/api/v2/organizations/test-org/enabled_connections/test-con' + ) + + # Organization Connections + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_all_organization_members(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + + # Default parameters are requested + c.all_organization_members('test-org') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/members', args[0]) + self.assertEqual(kwargs['params'], {'page': None, + 'per_page': None}) + + # Specific pagination + c.all_organization_members('test-org', page=7, per_page=25) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/members', args[0]) + self.assertEqual(kwargs['params'], {'page': 7, + 'per_page': 25}) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_create_organization_members(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.create_organization_members('test-org', {'a': 'b', 'c': 'd'}) + + mock_instance.post.assert_called_with( + 'https://domain/api/v2/organizations/test-org/members', + data={'a': 'b', 'c': 'd'} + ) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_delete_organization_members(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.delete_organization_members('test-org', {'a': 'b', 'c': 'd'}) + + mock_instance.delete.assert_called_with( + 'https://domain/api/v2/organizations/test-org/members', + data={'a': 'b', 'c': 'd'} ) \ No newline at end of file From dd935ec9a51466e0ed8d2ad5bacdf78e4b1c5d4d Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 30 Mar 2021 16:05:51 +0200 Subject: [PATCH 154/663] add CRUD for organization member roles --- auth0/v3/management/organizations.py | 66 ++++++++++++++++--- .../v3/test/management/test_organizations.py | 51 +++++++++++++- 2 files changed, 108 insertions(+), 9 deletions(-) diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py index ce611695..6b54a238 100644 --- a/auth0/v3/management/organizations.py +++ b/auth0/v3/management/organizations.py @@ -22,14 +22,11 @@ def __init__(self, domain, token, telemetry=True, timeout=5.0): self.domain = domain self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) - def _url(self, id=None, path=None, secondary_id=None): + def _url(self, *args): url = 'https://{}/api/v2/organizations'.format(self.domain) - if id is not None: - url = '{}/{}'.format(url, id) - if path is not None: - url = '{}/{}'.format(url, path) - if secondary_id is not None: - url = '{}/{}'.format(url, secondary_id) + for p in args: + if p is not None: + url = '{}/{}'.format(url, p) return url # Organizations @@ -221,4 +218,57 @@ def delete_organization_members(self, id, body): See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id """ - return self.client.delete(self._url(id, 'members'), data=body) \ No newline at end of file + return self.client.delete(self._url(id, 'members'), data=body) + + # Organization Member Roles + def all_organization_member_roles(self, id, user_id, page=None, per_page=None): + """Retrieves a list of all the roles from the given organization member. + + Args: + id (str): the ID of the organization. + + user_id (str): the ID of the user member of the organization. + + page (int): The result's page number (zero based). When not set, + the default value is up to the server. + + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + """ + params = {} + params['page'] = page + params['per_page'] = per_page + + return self.client.get(self._url(id, 'members', user_id, 'roles'), params=params) + + def create_organization_member_roles(self, id, user_id, body): + """Adds roles to a member of an organization. + + Args: + id (str): the ID of the organization. + + user_id (str): the ID of the user member of the organization. + + body (dict): Attributes from the members to add. + + See: https://auth0.com/docs/api/v2#!/Clients/post_clients + """ + + return self.client.post(self._url(id, 'members', user_id, 'roles'), data=body) + + def delete_organization_member_roles(self, id, user_id, body): + """Deletes roles from a member of an organization. + + Args: + id (str): Id of organization. + + user_id (str): the ID of the user member of the organization. + + body (dict): Attributes from the members to delete + + See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + """ + + return self.client.delete(self._url(id, 'members', user_id, 'roles'), data=body) \ No newline at end of file diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index 25bbe74a..445d76c0 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -155,7 +155,7 @@ def test_delete_organization_connection(self, mock_rc): 'https://domain/api/v2/organizations/test-org/enabled_connections/test-con' ) - # Organization Connections + # Organization Members @mock.patch('auth0.v3.management.organizations.RestClient') def test_all_organization_members(self, mock_rc): mock_instance = mock_rc.return_value @@ -202,4 +202,53 @@ def test_delete_organization_members(self, mock_rc): mock_instance.delete.assert_called_with( 'https://domain/api/v2/organizations/test-org/members', data={'a': 'b', 'c': 'd'} + ) + + # Organization Member Roles + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_all_organization_member_roles(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + + # Default parameters are requested + c.all_organization_member_roles('test-org', 'test-user') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/members/test-user/roles', args[0]) + self.assertEqual(kwargs['params'], {'page': None, + 'per_page': None}) + + # Specific pagination + c.all_organization_member_roles('test-org', 'test-user', page=7, per_page=25) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/members/test-user/roles', args[0]) + self.assertEqual(kwargs['params'], {'page': 7, + 'per_page': 25}) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_create_organization_member_roles(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.create_organization_member_roles('test-org', 'test-user', {'a': 'b', 'c': 'd'}) + + mock_instance.post.assert_called_with( + 'https://domain/api/v2/organizations/test-org/members/test-user/roles', + data={'a': 'b', 'c': 'd'} + ) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_delete_organization_member_roles(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.delete_organization_member_roles('test-org', 'test-user', {'a': 'b', 'c': 'd'}) + + mock_instance.delete.assert_called_with( + 'https://domain/api/v2/organizations/test-org/members/test-user/roles', + data={'a': 'b', 'c': 'd'} ) \ No newline at end of file From b468e3afd0a26a6ca615043a341a8ee8adbb345d Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 30 Mar 2021 16:13:53 +0200 Subject: [PATCH 155/663] add CRUD for organization invitations --- auth0/v3/management/organizations.py | 64 ++++++++++++++++++- .../v3/test/management/test_organizations.py | 62 +++++++++++++++++- 2 files changed, 124 insertions(+), 2 deletions(-) diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py index 6b54a238..10fdc736 100644 --- a/auth0/v3/management/organizations.py +++ b/auth0/v3/management/organizations.py @@ -271,4 +271,66 @@ def delete_organization_member_roles(self, id, user_id, body): See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id """ - return self.client.delete(self._url(id, 'members', user_id, 'roles'), data=body) \ No newline at end of file + return self.client.delete(self._url(id, 'members', user_id, 'roles'), data=body) + + + # Organization Invitations + def all_organization_invitations(self, id, page=None, per_page=None): + """Retrieves a list of all the organization invitations. + + Args: + id (str): the ID of the organization. + + page (int): The result's page number (zero based). When not set, + the default value is up to the server. + + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + """ + params = {} + params['page'] = page + params['per_page'] = per_page + + return self.client.get(self._url(id, 'invitations'), params=params) + + def get_organization_invitation(self, id, invitaton_id): + """Retrieves an organization invitation by its ID. + + Args: + id (str): the ID of the organization. + + invitaton_id (str): the ID of the invitation. + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + """ + params = {} + + return self.client.get(self._url(id, 'invitations', invitaton_id), params=params) + + def create_organization_invitation(self, id, body): + """Create an invitation to an organization. + + Args: + id (str): the ID of the organization. + + body (dict): Attributes for the invitation to create. + + See: https://auth0.com/docs/api/v2#!/Clients/post_clients + """ + + return self.client.post(self._url(id, 'invitations'), data=body) + + def delete_organization_invitation(self, id, invitation_id): + """Deletes an invitation from the given organization. + + Args: + id (str): Id of organization. + + invitation_id (str): the ID of the invitation to delete. + + See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + """ + + return self.client.delete(self._url(id, 'invitations', invitation_id)) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index 445d76c0..ca1113ef 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -251,4 +251,64 @@ def test_delete_organization_member_roles(self, mock_rc): mock_instance.delete.assert_called_with( 'https://domain/api/v2/organizations/test-org/members/test-user/roles', data={'a': 'b', 'c': 'd'} - ) \ No newline at end of file + ) + + # Organization Invitations + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_all_organization_invitations(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + + # Default parameters are requested + c.all_organization_invitations('test-org') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/invitations', args[0]) + self.assertEqual(kwargs['params'], {'page': None, + 'per_page': None}) + + # Specific pagination + c.all_organization_invitations('test-org', page=7, per_page=25) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/invitations', args[0]) + self.assertEqual(kwargs['params'], {'page': 7, + 'per_page': 25}) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_get_organization_invitation(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.get_organization_invitation('test-org', 'test-inv') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/invitations/test-inv', args[0]) + self.assertEqual(kwargs['params'], {}) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_create_organization_invitation(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.create_organization_invitation('test-org', {'a': 'b', 'c': 'd'}) + + mock_instance.post.assert_called_with( + 'https://domain/api/v2/organizations/test-org/invitations', + data={'a': 'b', 'c': 'd'} + ) + + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_delete_organization_invitation(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.delete_organization_invitation('test-org', 'test-inv') + + mock_instance.delete.assert_called_with( + 'https://domain/api/v2/organizations/test-org/invitations/test-inv' + ) From ab625eb04489cd298169b57fcef5e5d21bdd7e2d Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 30 Mar 2021 16:17:44 +0200 Subject: [PATCH 156/663] add GET user's organizations --- auth0/v3/management/users.py | 26 ++++++++++++++++++++++++++ auth0/v3/test/management/test_users.py | 26 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index 09ec966e..fe4d77b0 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -145,6 +145,32 @@ def update(self, id, body): """ return self.client.patch(self._url(id), data=body) + def list_organizations(self, id, page=0, per_page=25, include_totals=True): + """List the organizations that the user is member of. + + Args: + id (str): The user's id. + + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to True. + + See https://auth0.com/docs/api/management/v2#!/Users/get_user_roles + """ + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower() + } + + url = self._url('{}/organizations'.format(id)) + return self.client.get(url, params=params) + def list_roles(self, id, page=0, per_page=25, include_totals=True): """List the roles associated with a user. diff --git a/auth0/v3/test/management/test_users.py b/auth0/v3/test/management/test_users.py index 359876e1..8e03f7e0 100644 --- a/auth0/v3/test/management/test_users.py +++ b/auth0/v3/test/management/test_users.py @@ -119,6 +119,32 @@ def test_update(self, mock_rc): self.assertEqual('https://domain/api/v2/users/an-id', args[0]) self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) + @mock.patch('auth0.v3.management.users.RestClient') + def test_list_organizations(self, mock_rc): + mock_instance = mock_rc.return_value + + u = Users(domain='domain', token='jwttoken') + u.list_organizations('an-id') + + args, kwargs = mock_instance.get.call_args + self.assertEqual('https://domain/api/v2/users/an-id/organizations', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 25, + 'page': 0, + 'include_totals': 'true' + }) + + u.list_organizations(id='an-id', page=1, per_page=50, include_totals=False) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/users/an-id/organizations', args[0]) + self.assertEqual(kwargs['params'], { + 'per_page': 50, + 'page': 1, + 'include_totals': 'false' + }) + @mock.patch('auth0.v3.management.users.RestClient') def test_list_roles(self, mock_rc): mock_instance = mock_rc.return_value From 321c768f9ac7802d5800a23756d15d3a48f744dd Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 30 Mar 2021 18:26:45 +0200 Subject: [PATCH 157/663] add Organizations client to MGMT class and to the readme --- README.rst | 1 + auth0/v3/management/auth0.py | 2 ++ auth0/v3/test/management/test_auth0.py | 3 +++ 3 files changed, 6 insertions(+) diff --git a/README.rst b/README.rst index c39650a9..108ea01d 100644 --- a/README.rst +++ b/README.rst @@ -347,6 +347,7 @@ Available Management Endpoints - Jobs() ( ``Auth0().jobs`` ) - Logs() ( ``Auth0().logs`` ) - LogStreams() ( ``Auth0().log_streams`` ) +- Organizations() ( ``Auth0().organizations`` ) - ResourceServers() (``Auth0().resource_servers`` ) - Roles() ( ``Auth0().roles`` ) - Rules() ( ``Auth0().rules`` ) diff --git a/auth0/v3/management/auth0.py b/auth0/v3/management/auth0.py index 262760dd..5f4ab47d 100644 --- a/auth0/v3/management/auth0.py +++ b/auth0/v3/management/auth0.py @@ -12,6 +12,7 @@ from .jobs import Jobs from .log_streams import LogStreams from .logs import Logs +from .organizations import Organizations from .resource_servers import ResourceServers from .roles import Roles from .rules import Rules @@ -48,6 +49,7 @@ def __init__(self, domain, token): self.jobs = Jobs(domain, token) self.logs = Logs(domain, token) self.log_streams = LogStreams(domain, token) + self.organizations = Organizations(domain, token) self.resource_servers = ResourceServers(domain, token) self.roles = Roles(domain, token) self.rules = Rules(domain, token) diff --git a/auth0/v3/test/management/test_auth0.py b/auth0/v3/test/management/test_auth0.py index da4d550d..6924d926 100644 --- a/auth0/v3/test/management/test_auth0.py +++ b/auth0/v3/test/management/test_auth0.py @@ -76,6 +76,9 @@ def test_logs(self): def test_log_streams(self): self.assertIsInstance(self.a0.log_streams, LogStreams) + def test_organizations(self): + self.assertIsInstance(self.a0.organizations, Organizations) + def test_resource_servers(self): self.assertIsInstance(self.a0.resource_servers, ResourceServers) From a4b18a29eb21c7e8b6df6bfa0b253c53faf63d79 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 31 Mar 2021 13:25:45 +0200 Subject: [PATCH 158/663] add GET organization by id endpoint. Fix tests --- auth0/v3/management/organizations.py | 12 ++++++++++++ auth0/v3/test/management/test_auth0.py | 1 + auth0/v3/test/management/test_organizations.py | 12 ++++++++++++ 3 files changed, 25 insertions(+) diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py index 10fdc736..76ecca57 100644 --- a/auth0/v3/management/organizations.py +++ b/auth0/v3/management/organizations.py @@ -60,6 +60,18 @@ def get_organization_by_name(self, name=None): params['name'] = name return self.client.get(self._url(), params=params) + + def get_organization(self, id): + """Retrieves an organization by its ID. + + Args: + id (str): Id of organization to retrieve. + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + """ + params = {} + + return self.client.get(self._url(id), params=params) def create_organization(self, body): """Create a new organization. diff --git a/auth0/v3/test/management/test_auth0.py b/auth0/v3/test/management/test_auth0.py index 6924d926..1031fd60 100644 --- a/auth0/v3/test/management/test_auth0.py +++ b/auth0/v3/test/management/test_auth0.py @@ -15,6 +15,7 @@ from ...management.jobs import Jobs from ...management.log_streams import LogStreams from ...management.logs import Logs +from ...management.organizations import Organizations from ...management.resource_servers import ResourceServers from ...management.roles import Roles from ...management.rules import Rules diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index ca1113ef..babb7fe9 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -48,6 +48,18 @@ def test_get_organization_by_name(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations', args[0]) self.assertEqual(kwargs['params'], {'name': 'test-org'}) + @mock.patch('auth0.v3.management.organizations.RestClient') + def test_get_organization(self, mock_rc): + mock_instance = mock_rc.return_value + + c = Organizations(domain='domain', token='jwttoken') + c.get_organization('org123') + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/org123', args[0]) + self.assertEqual(kwargs['params'], {}) + @mock.patch('auth0.v3.management.organizations.RestClient') def test_create_organization(self, mock_rc): mock_instance = mock_rc.return_value From 7d353927002cfa3b14f147b9d436bb5e27c1c864 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 31 Mar 2021 13:29:21 +0200 Subject: [PATCH 159/663] rebase protocols PR --- auth0/v3/management/organizations.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py index 76ecca57..258f4656 100644 --- a/auth0/v3/management/organizations.py +++ b/auth0/v3/management/organizations.py @@ -18,12 +18,13 @@ class Organizations(object): (defaults to 5.0 for both) """ - def __init__(self, domain, token, telemetry=True, timeout=5.0): + def __init__(self, domain, token, telemetry=True, timeout=5.0, protocol="https"): self.domain = domain + self.protocol = protocol self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) def _url(self, *args): - url = 'https://{}/api/v2/organizations'.format(self.domain) + url = '{}://{}/api/v2/organizations'.format(self.protocol, self.domain) for p in args: if p is not None: url = '{}/{}'.format(url, p) From 5c15ac9a91653be19afdf159c9fec28c51e93cba Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 9 Apr 2021 11:17:52 +0200 Subject: [PATCH 160/663] update links to swagger docs --- auth0/v3/management/organizations.py | 42 ++++++++++++++-------------- auth0/v3/management/users.py | 2 +- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py index 258f4656..bbb72e90 100644 --- a/auth0/v3/management/organizations.py +++ b/auth0/v3/management/organizations.py @@ -41,7 +41,7 @@ def all_organizations(self, page=None, per_page=None): per_page (int, optional): The amount of entries per page. When not set, the default value is up to the server. - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/get_organizations """ params = {} params['page'] = page @@ -55,7 +55,7 @@ def get_organization_by_name(self, name=None): Args: name (str): The name of the organization to retrieve. - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/get_name_by_name """ params = {} params['name'] = name @@ -68,7 +68,7 @@ def get_organization(self, id): Args: id (str): Id of organization to retrieve. - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/get_organizations_by_id """ params = {} @@ -80,7 +80,7 @@ def create_organization(self, body): Args: body (dict): Attributes for the new organization. - See: https://auth0.com/docs/api/v2#!/Clients/post_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/post_organizations """ return self.client.post(self._url(), data=body) @@ -93,7 +93,7 @@ def update_organization(self, id, body): body (dict): Attributes to modify. - See: https://auth0.com/docs/api/management/v2#!/Clients/patch_clients_by_id + See: https://auth0.com/docs/api/management/v2#!/Organizations/patch_organizations_by_id """ return self.client.patch(self._url(id), data=body) @@ -104,7 +104,7 @@ def delete_organization(self, id): Args: id (str): Id of organization to delete. - See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + See: https://auth0.com/docs/api/management/v2#!/Organizations/delete_organizations_by_id """ return self.client.delete(self._url(id)) @@ -123,7 +123,7 @@ def all_organization_connections(self, id, page=None, per_page=None): per_page (int, optional): The amount of entries per page. When not set, the default value is up to the server. - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/get_enabled_connections """ params = {} params['page'] = page @@ -139,7 +139,7 @@ def get_organization_connection(self, id, connection_id): connection_id (str): the ID of the connection. - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/get_enabled_connections_by_connectionId """ params = {} @@ -153,7 +153,7 @@ def create_organization_connection(self, id, body): body (dict): Attributes for the connection to add. - See: https://auth0.com/docs/api/v2#!/Clients/post_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/post_enabled_connections """ return self.client.post(self._url(id, 'enabled_connections'), data=body) @@ -168,7 +168,7 @@ def update_organization_connection(self, id, connection_id, body): body (dict): Attributes to modify. - See: https://auth0.com/docs/api/management/v2#!/Clients/patch_clients_by_id + See: https://auth0.com/docs/api/management/v2#!/Organizations/patch_enabled_connections_by_connectionId """ return self.client.patch(self._url(id, 'enabled_connections', connection_id), data=body) @@ -181,7 +181,7 @@ def delete_organization_connection(self, id, connection_id): connection_id (str): the ID of the connection to delete. - See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + See: https://auth0.com/docs/api/management/v2#!/Organizations/delete_enabled_connections_by_connectionId """ return self.client.delete(self._url(id, 'enabled_connections', connection_id)) @@ -199,7 +199,7 @@ def all_organization_members(self, id, page=None, per_page=None): per_page (int, optional): The amount of entries per page. When not set, the default value is up to the server. - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/get_members """ params = {} params['page'] = page @@ -215,7 +215,7 @@ def create_organization_members(self, id, body): body (dict): Attributes from the members to add. - See: https://auth0.com/docs/api/v2#!/Clients/post_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/post_members """ return self.client.post(self._url(id, 'members'), data=body) @@ -228,7 +228,7 @@ def delete_organization_members(self, id, body): body (dict): Attributes from the members to delete - See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + See: https://auth0.com/docs/api/management/v2#!/Organizations/delete_members """ return self.client.delete(self._url(id, 'members'), data=body) @@ -248,7 +248,7 @@ def all_organization_member_roles(self, id, user_id, page=None, per_page=None): per_page (int, optional): The amount of entries per page. When not set, the default value is up to the server. - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/get_organization_member_roles """ params = {} params['page'] = page @@ -266,7 +266,7 @@ def create_organization_member_roles(self, id, user_id, body): body (dict): Attributes from the members to add. - See: https://auth0.com/docs/api/v2#!/Clients/post_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/post_organization_member_roles """ return self.client.post(self._url(id, 'members', user_id, 'roles'), data=body) @@ -281,7 +281,7 @@ def delete_organization_member_roles(self, id, user_id, body): body (dict): Attributes from the members to delete - See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + See: https://auth0.com/docs/api/management/v2#!/Organizations/delete_organization_member_roles """ return self.client.delete(self._url(id, 'members', user_id, 'roles'), data=body) @@ -300,7 +300,7 @@ def all_organization_invitations(self, id, page=None, per_page=None): per_page (int, optional): The amount of entries per page. When not set, the default value is up to the server. - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/get_invitations """ params = {} params['page'] = page @@ -316,7 +316,7 @@ def get_organization_invitation(self, id, invitaton_id): invitaton_id (str): the ID of the invitation. - See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/get_invitations_by_invitation_id """ params = {} @@ -330,7 +330,7 @@ def create_organization_invitation(self, id, body): body (dict): Attributes for the invitation to create. - See: https://auth0.com/docs/api/v2#!/Clients/post_clients + See: https://auth0.com/docs/api/management/v2#!/Organizations/post_invitations """ return self.client.post(self._url(id, 'invitations'), data=body) @@ -343,7 +343,7 @@ def delete_organization_invitation(self, id, invitation_id): invitation_id (str): the ID of the invitation to delete. - See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + See: https://auth0.com/docs/api/management/v2#!/Organizations/delete_invitations_by_invitation_id """ return self.client.delete(self._url(id, 'invitations', invitation_id)) diff --git a/auth0/v3/management/users.py b/auth0/v3/management/users.py index fe4d77b0..b4c20e7c 100644 --- a/auth0/v3/management/users.py +++ b/auth0/v3/management/users.py @@ -160,7 +160,7 @@ def list_organizations(self, id, page=0, per_page=25, include_totals=True): include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. Defaults to True. - See https://auth0.com/docs/api/management/v2#!/Users/get_user_roles + See https://auth0.com/docs/api/management/v2#!/Users/get_organizations """ params = { 'per_page': per_page, From 567b8043b30b7b5aaa8ec71dea266d439a92b6ae Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 9 Apr 2021 11:43:46 +0200 Subject: [PATCH 161/663] Release 3.16.0 --- CHANGELOG.md | 9 +++++++++ auth0/__init__.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 820858e7..6738d141 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ Changes ======= +3.16.0 +------------------ + +**Added** +- Add access token validation guidance for organizations [\#262](https://github.com/auth0/auth0-python/pull/262) ([lbalmaceda](https://github.com/lbalmaceda)) +- Add support for Organization MGMT API endpoints [SDK-2439] [\#261](https://github.com/auth0/auth0-python/pull/261) ([lbalmaceda](https://github.com/lbalmaceda)) +- Add scope to refresh_token [\#256](https://github.com/auth0/auth0-python/pull/256) ([criles25](https://github.com/criles25)) +- Allow configuration of outgoing request protocol [\#254](https://github.com/auth0/auth0-python/pull/254) ([garry-jeromson](https://github.com/garry-jeromson)) + 3.15.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 254db7b7..0c9d57a9 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.15.0' +__version__ = '3.16.0' From 273e3085cdf43de3e346f813c14ec25f72110e34 Mon Sep 17 00:00:00 2001 From: Snow Date: Mon, 19 Apr 2021 11:19:09 +1000 Subject: [PATCH 162/663] Repair Organisation get by name url. --- auth0/v3/management/organizations.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py index bbb72e90..c41855ce 100644 --- a/auth0/v3/management/organizations.py +++ b/auth0/v3/management/organizations.py @@ -57,11 +57,8 @@ def get_organization_by_name(self, name=None): See: https://auth0.com/docs/api/management/v2#!/Organizations/get_name_by_name """ - params = {} - params['name'] = name + return self.client.get(self._url('name', name)) - return self.client.get(self._url(), params=params) - def get_organization(self, id): """Retrieves an organization by its ID. From b691e51f456a863250bf118298500fa00911ccce Mon Sep 17 00:00:00 2001 From: Snow Date: Mon, 19 Apr 2021 12:02:06 +1000 Subject: [PATCH 163/663] Follow Auth0 formatting. --- auth0/v3/management/organizations.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py index c41855ce..16a9b536 100644 --- a/auth0/v3/management/organizations.py +++ b/auth0/v3/management/organizations.py @@ -57,7 +57,9 @@ def get_organization_by_name(self, name=None): See: https://auth0.com/docs/api/management/v2#!/Organizations/get_name_by_name """ - return self.client.get(self._url('name', name)) + params = {} + + return self.client.get(self._url('name', name), params=params) def get_organization(self, id): """Retrieves an organization by its ID. From e495f0e32359510343a08e5605e5a100bfd4e7c0 Mon Sep 17 00:00:00 2001 From: Snow Date: Mon, 19 Apr 2021 12:06:19 +1000 Subject: [PATCH 164/663] Update organisations tests with correct URL. --- auth0/v3/test/management/test_organizations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index babb7fe9..92c52cee 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -45,7 +45,7 @@ def test_get_organization_by_name(self, mock_rc): args, kwargs = mock_instance.get.call_args - self.assertEqual('https://domain/api/v2/organizations', args[0]) + self.assertEqual('https://domain/api/v2/organizations/name/test-org', args[0]) self.assertEqual(kwargs['params'], {'name': 'test-org'}) @mock.patch('auth0.v3.management.organizations.RestClient') From 0f82f78e825cbd49957651cdead8b7f853f4af59 Mon Sep 17 00:00:00 2001 From: Snow Date: Mon, 19 Apr 2021 12:08:32 +1000 Subject: [PATCH 165/663] Update organisations tests with correct params. --- auth0/v3/test/management/test_organizations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index 92c52cee..0c8219bf 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -46,7 +46,7 @@ def test_get_organization_by_name(self, mock_rc): args, kwargs = mock_instance.get.call_args self.assertEqual('https://domain/api/v2/organizations/name/test-org', args[0]) - self.assertEqual(kwargs['params'], {'name': 'test-org'}) + self.assertEqual(kwargs['params'], {}) @mock.patch('auth0.v3.management.organizations.RestClient') def test_get_organization(self, mock_rc): From c67f8501f6fb7ed5be6aefa8e16cd21e89676d5e Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 19 Apr 2021 19:48:33 +0200 Subject: [PATCH 166/663] remove requirements.txt file --- requirements.txt | 4 ---- setup.py | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 2396e9ae..00000000 --- a/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -requests>=2.14.0 -mock==1.3.0 -pre-commit -pyjwt[crypto]>=1.7.1 \ No newline at end of file diff --git a/setup.py b/setup.py index 1fdeb0a3..18a3b203 100644 --- a/setup.py +++ b/setup.py @@ -27,8 +27,8 @@ def find_version(): author_email='support@auth0.com', license='MIT', packages=find_packages(), - install_requires=['requests'], - extras_require={'test': ['mock']}, + install_requires=['requests>=2.14.0', 'pyjwt[crypto]>=1.7.1'], + extras_require={'test': ['mock>=1.3.0', 'pre-commit']}, python_requires='>=2.7, !=3.0.*, !=3.1.*', classifiers=[ 'Development Status :: 4 - Beta', From d4e040a8559038f63b59f3ec27f39de09f66b7d9 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Mon, 19 Apr 2021 20:32:21 +0200 Subject: [PATCH 167/663] fix ci script --- .circleci/config.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3f6dfda8..ae9508a7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,13 +10,13 @@ jobs: sudo chown -R circleci:circleci /usr/local/bin sudo chown -R circleci:circleci /usr/local/lib/python2.7/site-packages - restore_cache: - key: deps2-{{ .Branch }}-{{ checksum "requirements.txt" }} + key: deps2-{{ .Branch }}-{{ checksum "setup.py" }} - run: command: | - pip install -r requirements.txt + pip install .[test] pip install codecov - save_cache: - key: deps2-{{ .Branch }}-{{ checksum "requirements.txt" }} + key: deps2-{{ .Branch }}-{{ checksum "setup.py" }} paths: - ".venv" - "/usr/local/bin" @@ -35,13 +35,13 @@ jobs: sudo chown -R circleci:circleci /usr/local/bin sudo chown -R circleci:circleci /usr/local/lib/python3.6/site-packages - restore_cache: - key: deps3-{{ .Branch }}-{{ checksum "requirements.txt" }} + key: deps3-{{ .Branch }}-{{ checksum "setup.py" }} - run: command: | - pip install -r requirements.txt + pip install .[test] pip install codecov - save_cache: - key: deps3-{{ .Branch }}-{{ checksum "requirements.txt" }} + key: deps3-{{ .Branch }}-{{ checksum "setup.py" }} paths: - ".venv" - "/usr/local/bin" From 036494e34e642186f3733b33e5abc0d51e946588 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 22 Apr 2021 14:07:32 +0200 Subject: [PATCH 168/663] Release 3.16.1 --- CHANGELOG.md | 7 +++++++ auth0/__init__.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6738d141..fc233e71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changes ======= +3.16.1 +------------------ + +**Fixed** +- Remove requirements.txt file [\#270](https://github.com/auth0/auth0-python/pull/270) ([lbalmaceda](https://github.com/lbalmaceda)) +- Repair Organisation get by name URL. [\#269](https://github.com/auth0/auth0-python/pull/269) ([queenvictoria](https://github.com/queenvictoria)) + 3.16.0 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 0c9d57a9..405c30df 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.16.0' +__version__ = '3.16.1' From a4c9c06830cd06bc5983efd63877e7f459f7abd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bu=C4=9Fra=20=C4=B0=C5=9Fg=C3=BCzar?= Date: Sun, 25 Apr 2021 14:26:34 +0300 Subject: [PATCH 169/663] Update token_verifier.py --- auth0/v3/authentication/token_verifier.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index a6a11cde..1755be5d 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -245,6 +245,8 @@ def verify(self, token, nonce=None, max_age=None, organization=None): # Verify claims self._verify_payload(payload, nonce, max_age, organization) + + return True def _verify_payload(self, payload, nonce=None, max_age=None, organization=None): try: From f742dca69cc88807c7da6bf9539fececf85e9503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bu=C4=9Fra=20=C4=B0=C5=9Fg=C3=BCzar?= Date: Fri, 28 May 2021 10:17:58 +0300 Subject: [PATCH 170/663] Update token_verifier.py --- auth0/v3/authentication/token_verifier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/authentication/token_verifier.py b/auth0/v3/authentication/token_verifier.py index 1755be5d..d3874c5f 100644 --- a/auth0/v3/authentication/token_verifier.py +++ b/auth0/v3/authentication/token_verifier.py @@ -246,7 +246,7 @@ def verify(self, token, nonce=None, max_age=None, organization=None): # Verify claims self._verify_payload(payload, nonce, max_age, organization) - return True + return payload def _verify_payload(self, payload, nonce=None, max_age=None, organization=None): try: From 73290ea11bff611db7da6aa0afe9da571470b882 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 27 May 2021 17:06:39 +0200 Subject: [PATCH 171/663] re-route job results --- auth0/v3/management/jobs.py | 11 ++++++++--- auth0/v3/test/management/test_jobs.py | 9 +++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/auth0/v3/management/jobs.py b/auth0/v3/management/jobs.py index 0cd9b0ca..0bf22200 100644 --- a/auth0/v3/management/jobs.py +++ b/auth0/v3/management/jobs.py @@ -1,4 +1,5 @@ from .rest import RestClient +import warnings class Jobs(object): @@ -56,10 +57,14 @@ def get_results(self, job_id): Args: job_id (str): The id of the job. - See: https://auth0.com/docs/api/management/v2#!/Jobs/get_results + Deprecation: + The /jobs/{id}/results endpoint was removed from the Management API. + You can obtain the Job results by querying a Job by ID. + + See: https://auth0.com/docs/api/management/v2#!/Jobs/get_jobs_by_id """ - url = self._url('%s/results' % job_id) - return self.client.get(url) + warnings.warn("/jobs/{id}/results is no longer available. The get(id) function will be called instead.", DeprecationWarning) + return self.get(job_id) def export_users(self, body): """Export all users to a file using a long running job. diff --git a/auth0/v3/test/management/test_jobs.py b/auth0/v3/test/management/test_jobs.py index e589019b..5b3d069d 100644 --- a/auth0/v3/test/management/test_jobs.py +++ b/auth0/v3/test/management/test_jobs.py @@ -23,25 +23,26 @@ def test_get(self, mock_rc): ) @mock.patch('auth0.v3.management.jobs.RestClient') - def get_failed_job(self, mock_rc): + def test_get_failed_job(self, mock_rc): mock_instance = mock_rc.return_value j = Jobs(domain='domain', token='jwttoken') - j.get('an-id') + j.get_failed_job('an-id') mock_instance.get.assert_called_with( 'https://domain/api/v2/jobs/an-id/errors', ) @mock.patch('auth0.v3.management.jobs.RestClient') - def get_job_results(self, mock_rc): + def test_get_job_results(self, mock_rc): mock_instance = mock_rc.return_value j = Jobs(domain='domain', token='jwttoken') j.get('an-id') + # Should use the 'get by id' URL mock_instance.get.assert_called_with( - 'https://domain/api/v2/jobs/an-id/results', + 'https://domain/api/v2/jobs/an-id', ) @mock.patch('auth0.v3.management.jobs.RestClient') From 0ac4fd031890e691dba29ad5c4264d8bdfadaa8d Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 27 May 2021 18:19:30 +0200 Subject: [PATCH 172/663] fix tests --- auth0/v3/test/management/test_jobs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/test/management/test_jobs.py b/auth0/v3/test/management/test_jobs.py index 5b3d069d..203185ec 100644 --- a/auth0/v3/test/management/test_jobs.py +++ b/auth0/v3/test/management/test_jobs.py @@ -38,7 +38,7 @@ def test_get_job_results(self, mock_rc): mock_instance = mock_rc.return_value j = Jobs(domain='domain', token='jwttoken') - j.get('an-id') + j.get_results('an-id') # Should use the 'get by id' URL mock_instance.get.assert_called_with( From afe66b8fb6f7d28609c0ec46ae2fa3bf89a8fcae Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 28 May 2021 12:39:54 +0200 Subject: [PATCH 173/663] Release 3.16.2 --- CHANGELOG.md | 6 ++++++ auth0/__init__.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc233e71..1d7dde6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changes ======= +3.16.2 +------------------ + +**Fixed** +- Re-Route Job Results endpoint [\#275](https://github.com/auth0/auth0-python/pull/275) ([lbalmaceda](https://github.com/lbalmaceda)) + 3.16.1 ------------------ diff --git a/auth0/__init__.py b/auth0/__init__.py index 405c30df..a35ecdde 100644 --- a/auth0/__init__.py +++ b/auth0/__init__.py @@ -1 +1 @@ -__version__ = '3.16.1' +__version__ = '3.16.2' From 51e38670e8e8dd47cc899b4859d079e33c1bc764 Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Tue, 20 Jul 2021 12:50:10 -0400 Subject: [PATCH 174/663] feat: Update endpoint methods to support 'from' and 'take' checkpoint pagination parameters, where appropriate --- auth0/v3/management/organizations.py | 70 +++++++++++++++++++--------- auth0/v3/management/roles.py | 13 +++++- 2 files changed, 60 insertions(+), 23 deletions(-) diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py index 16a9b536..c58f0301 100644 --- a/auth0/v3/management/organizations.py +++ b/auth0/v3/management/organizations.py @@ -31,21 +31,35 @@ def _url(self, *args): return url # Organizations - def all_organizations(self, page=None, per_page=None): + def all_organizations(self, page=None, per_page=None, include_totals=True, from_param=None, take=None): """Retrieves a list of all the organizations. Args: - page (int): The result's page number (zero based). When not set, - the default value is up to the server. + page (int): The result's page number (zero based). When not set, + the default value is up to the server. - per_page (int, optional): The amount of entries per page. When not set, - the default value is up to the server. + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to True. + + from_param (str, optional): Checkpoint Id form which to begin retrieving results. + You can limit the amount of logs using the take parameter. + + take (int, optional): The total amount of entries to retrieve when + using the from parameter. When not set, the default value is up to the server. See: https://auth0.com/docs/api/management/v2#!/Organizations/get_organizations """ - params = {} - params['page'] = page - params['per_page'] = per_page + + params = { + 'page': page, + 'per_page': per_page, + 'include_totals': str(include_totals).lower(), + 'from': from_param, + 'take': take + } return self.client.get(self._url(), params=params) @@ -83,7 +97,7 @@ def create_organization(self, body): """ return self.client.post(self._url(), data=body) - + def update_organization(self, id, body): """Modifies an organization. @@ -156,7 +170,7 @@ def create_organization_connection(self, id, body): """ return self.client.post(self._url(id, 'enabled_connections'), data=body) - + def update_organization_connection(self, id, connection_id, body): """Modifies an organization. @@ -186,23 +200,37 @@ def delete_organization_connection(self, id, connection_id): return self.client.delete(self._url(id, 'enabled_connections', connection_id)) # Organization Members - def all_organization_members(self, id, page=None, per_page=None): + def all_organization_members(self, id, page=None, per_page=None, include_totals=True, from_param=None, take=None): """Retrieves a list of all the organization members. Args: - id (str): the ID of the organization. + id (str): the ID of the organization. - page (int): The result's page number (zero based). When not set, - the default value is up to the server. + page (int): The result's page number (zero based). When not set, + the default value is up to the server. - per_page (int, optional): The amount of entries per page. When not set, - the default value is up to the server. + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to True. + + from_param (str, optional): Checkpoint Id form which to begin retrieving results. + You can limit the amount of logs using the take parameter. + + take (int, optional): The total amount of entries to retrieve when + using the from parameter. When not set, the default value is up to the server. See: https://auth0.com/docs/api/management/v2#!/Organizations/get_members """ - params = {} - params['page'] = page - params['per_page'] = per_page + + params = { + 'page': page, + 'per_page': per_page, + 'include_totals': str(include_totals).lower(), + 'from': from_param, + 'take': take + } return self.client.get(self._url(id, 'members'), params=params) @@ -238,7 +266,7 @@ def all_organization_member_roles(self, id, user_id, page=None, per_page=None): Args: id (str): the ID of the organization. - + user_id (str): the ID of the user member of the organization. page (int): The result's page number (zero based). When not set, @@ -333,7 +361,7 @@ def create_organization_invitation(self, id, body): """ return self.client.post(self._url(id, 'invitations'), data=body) - + def delete_organization_invitation(self, id, invitation_id): """Deletes an invitation from the given organization. diff --git a/auth0/v3/management/roles.py b/auth0/v3/management/roles.py index 7896156e..51e4ba22 100644 --- a/auth0/v3/management/roles.py +++ b/auth0/v3/management/roles.py @@ -98,7 +98,7 @@ def update(self, id, body): """ return self.client.patch(self._url(id), data=body) - def list_users(self, id, page=0, per_page=25, include_totals=True): + def list_users(self, id, page=0, per_page=25, include_totals=True, from_param=None, take=None): """List the users that have been associated with a given role. Args: @@ -113,14 +113,23 @@ def list_users(self, id, page=0, per_page=25, include_totals=True): include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. Defaults to True. + from_param (str, optional): Checkpoint Id form which to begin retrieving results. + You can limit the amount of logs using the take parameter. + + take (int, optional): The total amount of entries to retrieve when + using the from parameter. When not set, the default value is up to the server. + See https://auth0.com/docs/api/management/v2#!/Roles/get_role_user """ params = { 'per_page': per_page, 'page': page, - 'include_totals': str(include_totals).lower() + 'include_totals': str(include_totals).lower(), + 'from': from_param, + 'take': take } + url = self._url('{}/users'.format(id)) return self.client.get(url, params=params) From 1a458ad8b8242396e37c5307f8ad90df2001b567 Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Tue, 20 Jul 2021 12:54:05 -0400 Subject: [PATCH 175/663] tests: Update tests --- .../v3/test/management/test_organizations.py | 28 +++++++++++++++---- auth0/v3/test/management/test_roles.py | 10 +++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index 0c8219bf..f5385155 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -27,7 +27,7 @@ def test_all_organizations(self, mock_rc): self.assertEqual(kwargs['params'], {'page': None, 'per_page': None}) - # Specific pagination + # Basic pagination c.all_organizations(page=7, per_page=25) args, kwargs = mock_instance.get.call_args @@ -36,6 +36,15 @@ def test_all_organizations(self, mock_rc): self.assertEqual(kwargs['params'], {'page': 7, 'per_page': 25}) + # Checkpoint pagination + c.all_organizations(from_param=8675309, take=75) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations', args[0]) + self.assertEqual(kwargs['params'], {'from': 8675309, + 'take': 75}) + @mock.patch('auth0.v3.management.organizations.RestClient') def test_get_organization_by_name(self, mock_rc): mock_instance = mock_rc.return_value @@ -83,7 +92,7 @@ def test_update_organization(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations/this-id', args[0]) self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) - + @mock.patch('auth0.v3.management.organizations.RestClient') def test_delete_organization(self, mock_rc): mock_instance = mock_rc.return_value @@ -94,7 +103,7 @@ def test_delete_organization(self, mock_rc): mock_instance.delete.assert_called_with( 'https://domain/api/v2/organizations/this-id' ) - + # Organization Connections @mock.patch('auth0.v3.management.organizations.RestClient') def test_all_organization_connections(self, mock_rc): @@ -155,7 +164,7 @@ def test_update_organization_connection(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations/test-org/enabled_connections/test-con', args[0]) self.assertEqual(kwargs['data'], {'a': 'b', 'c': 'd'}) - + @mock.patch('auth0.v3.management.organizations.RestClient') def test_delete_organization_connection(self, mock_rc): mock_instance = mock_rc.return_value @@ -192,6 +201,15 @@ def test_all_organization_members(self, mock_rc): self.assertEqual(kwargs['params'], {'page': 7, 'per_page': 25}) + # Checkpoint pagination + c.all_organization_members('test-org', from_param=8675309, take=75) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/organizations/test-org/members', args[0]) + self.assertEqual(kwargs['params'], {'from': 8675309, + 'take': 75}) + @mock.patch('auth0.v3.management.organizations.RestClient') def test_create_organization_members(self, mock_rc): mock_instance = mock_rc.return_value @@ -313,7 +331,7 @@ def test_create_organization_invitation(self, mock_rc): 'https://domain/api/v2/organizations/test-org/invitations', data={'a': 'b', 'c': 'd'} ) - + @mock.patch('auth0.v3.management.organizations.RestClient') def test_delete_organization_invitation(self, mock_rc): mock_instance = mock_rc.return_value diff --git a/auth0/v3/test/management/test_roles.py b/auth0/v3/test/management/test_roles.py index 2742a08c..7d97a740 100644 --- a/auth0/v3/test/management/test_roles.py +++ b/auth0/v3/test/management/test_roles.py @@ -112,6 +112,16 @@ def test_list_users(self, mock_rc): 'include_totals': 'false' }) + u.list_users(id='an-id', from_param=8675309, take=75) + + args, kwargs = mock_instance.get.call_args + + self.assertEqual('https://domain/api/v2/roles/an-id/users', args[0]) + self.assertEqual(kwargs['params'], { + 'from': 8675309, + 'take': 75 + }) + @mock.patch('auth0.v3.management.roles.RestClient') def test_add_users(self, mock_rc): From 876ab3ceddbb4fd3719fccbb05ab7845e4a518c0 Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Tue, 20 Jul 2021 13:00:14 -0400 Subject: [PATCH 176/663] tests: Updates to tests --- auth0/v3/test/management/test_organizations.py | 10 ++++++++-- auth0/v3/test/management/test_roles.py | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index f5385155..f2024c70 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -190,7 +190,10 @@ def test_all_organization_members(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations/test-org/members', args[0]) self.assertEqual(kwargs['params'], {'page': None, - 'per_page': None}) + 'per_page': None, + 'include_totals': None, + 'from': None, + 'take': None}) # Specific pagination c.all_organization_members('test-org', page=7, per_page=25) @@ -248,7 +251,10 @@ def test_all_organization_member_roles(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations/test-org/members/test-user/roles', args[0]) self.assertEqual(kwargs['params'], {'page': None, - 'per_page': None}) + 'per_page': None + 'include_totals': None, + 'from': None, + 'take': None}) # Specific pagination c.all_organization_member_roles('test-org', 'test-user', page=7, per_page=25) diff --git a/auth0/v3/test/management/test_roles.py b/auth0/v3/test/management/test_roles.py index 7d97a740..bebd8851 100644 --- a/auth0/v3/test/management/test_roles.py +++ b/auth0/v3/test/management/test_roles.py @@ -98,7 +98,9 @@ def test_list_users(self, mock_rc): self.assertEqual(kwargs['params'], { 'per_page': 25, 'page': 0, - 'include_totals': 'true' + 'include_totals': 'true', + 'from': None, + 'take': None }) u.list_users(id='an-id', page=1, per_page=50, include_totals=False) From a191e8394aeef54fc5ea7356088bcb5adab9ee6b Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Tue, 20 Jul 2021 13:01:25 -0400 Subject: [PATCH 177/663] tests: Update tests --- auth0/v3/test/management/test_organizations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index f2024c70..36eb05e9 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -251,7 +251,7 @@ def test_all_organization_member_roles(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations/test-org/members/test-user/roles', args[0]) self.assertEqual(kwargs['params'], {'page': None, - 'per_page': None + 'per_page': None, 'include_totals': None, 'from': None, 'take': None}) From 7ddc4a0bad05a6d1ed0260e17732a5b7991ce2e6 Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Tue, 20 Jul 2021 13:01:59 -0400 Subject: [PATCH 178/663] tests: Update tests --- auth0/v3/test/management/test_roles.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/auth0/v3/test/management/test_roles.py b/auth0/v3/test/management/test_roles.py index bebd8851..5ef2cebd 100644 --- a/auth0/v3/test/management/test_roles.py +++ b/auth0/v3/test/management/test_roles.py @@ -111,7 +111,9 @@ def test_list_users(self, mock_rc): self.assertEqual(kwargs['params'], { 'per_page': 50, 'page': 1, - 'include_totals': 'false' + 'include_totals': 'false', + 'from': None, + 'take': None }) u.list_users(id='an-id', from_param=8675309, take=75) From 53bdc843d0bad6d8d56a02dcd610b238b4bcfcf5 Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Tue, 20 Jul 2021 13:03:58 -0400 Subject: [PATCH 179/663] tests: Update tests --- auth0/v3/test/management/test_organizations.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index 36eb05e9..bb439682 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -251,10 +251,7 @@ def test_all_organization_member_roles(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations/test-org/members/test-user/roles', args[0]) self.assertEqual(kwargs['params'], {'page': None, - 'per_page': None, - 'include_totals': None, - 'from': None, - 'take': None}) + 'per_page': None}) # Specific pagination c.all_organization_member_roles('test-org', 'test-user', page=7, per_page=25) From b55e607fc10abd6faf237d44f11dcfb92f549778 Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Tue, 20 Jul 2021 13:05:58 -0400 Subject: [PATCH 180/663] tests: Update tests --- auth0/v3/test/management/test_organizations.py | 7 +++++-- auth0/v3/test/management/test_roles.py | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index bb439682..65458749 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -25,7 +25,10 @@ def test_all_organizations(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations', args[0]) self.assertEqual(kwargs['params'], {'page': None, - 'per_page': None}) + 'per_page': None, + 'include_totals': True, + 'from': None, + 'take': None}) # Basic pagination c.all_organizations(page=7, per_page=25) @@ -191,7 +194,7 @@ def test_all_organization_members(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations/test-org/members', args[0]) self.assertEqual(kwargs['params'], {'page': None, 'per_page': None, - 'include_totals': None, + 'include_totals': True, 'from': None, 'take': None}) diff --git a/auth0/v3/test/management/test_roles.py b/auth0/v3/test/management/test_roles.py index 5ef2cebd..79087a7e 100644 --- a/auth0/v3/test/management/test_roles.py +++ b/auth0/v3/test/management/test_roles.py @@ -123,7 +123,10 @@ def test_list_users(self, mock_rc): self.assertEqual('https://domain/api/v2/roles/an-id/users', args[0]) self.assertEqual(kwargs['params'], { 'from': 8675309, - 'take': 75 + 'take': 75, + 'per_page': None, + 'page': None, + 'include_totals': True, }) From cdd5a6bfb0cb728f96090aaccb63a1f99fa33c99 Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Tue, 20 Jul 2021 13:07:27 -0400 Subject: [PATCH 181/663] tests: Update tests --- auth0/v3/test/management/test_organizations.py | 4 ++-- auth0/v3/test/management/test_roles.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index 65458749..6ac6f806 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -26,7 +26,7 @@ def test_all_organizations(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations', args[0]) self.assertEqual(kwargs['params'], {'page': None, 'per_page': None, - 'include_totals': True, + 'include_totals': 'true', 'from': None, 'take': None}) @@ -194,7 +194,7 @@ def test_all_organization_members(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations/test-org/members', args[0]) self.assertEqual(kwargs['params'], {'page': None, 'per_page': None, - 'include_totals': True, + 'include_totals': 'true', 'from': None, 'take': None}) diff --git a/auth0/v3/test/management/test_roles.py b/auth0/v3/test/management/test_roles.py index 79087a7e..bc296436 100644 --- a/auth0/v3/test/management/test_roles.py +++ b/auth0/v3/test/management/test_roles.py @@ -126,7 +126,7 @@ def test_list_users(self, mock_rc): 'take': 75, 'per_page': None, 'page': None, - 'include_totals': True, + 'include_totals': 'true', }) From 626702aa5eef653a8d186844d8d8d9a013c82f84 Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Tue, 20 Jul 2021 13:09:37 -0400 Subject: [PATCH 182/663] tests: Update tests --- auth0/v3/test/management/test_organizations.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index 6ac6f806..d8bd5126 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -31,13 +31,16 @@ def test_all_organizations(self, mock_rc): 'take': None}) # Basic pagination - c.all_organizations(page=7, per_page=25) + c.all_organizations(page=7, per_page=25, include_totals=False) args, kwargs = mock_instance.get.call_args self.assertEqual('https://domain/api/v2/organizations', args[0]) self.assertEqual(kwargs['params'], {'page': 7, - 'per_page': 25}) + 'per_page': 25, + 'include_totals': 'false', + 'from': None, + 'take': None}) # Checkpoint pagination c.all_organizations(from_param=8675309, take=75) @@ -199,13 +202,16 @@ def test_all_organization_members(self, mock_rc): 'take': None}) # Specific pagination - c.all_organization_members('test-org', page=7, per_page=25) + c.all_organization_members('test-org', page=7, per_page=25, include_totals=False) args, kwargs = mock_instance.get.call_args self.assertEqual('https://domain/api/v2/organizations/test-org/members', args[0]) self.assertEqual(kwargs['params'], {'page': 7, - 'per_page': 25}) + 'per_page': 25, + 'include_totals': 'false', + 'from': None, + 'take': None}) # Checkpoint pagination c.all_organization_members('test-org', from_param=8675309, take=75) From 03ddabd2df9074ab9c750d1e16acc4f4527b6b7c Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Tue, 20 Jul 2021 13:12:11 -0400 Subject: [PATCH 183/663] tests: Update tests --- auth0/v3/test/management/test_organizations.py | 5 ++++- auth0/v3/test/management/test_roles.py | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index d8bd5126..002e399f 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -220,7 +220,10 @@ def test_all_organization_members(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations/test-org/members', args[0]) self.assertEqual(kwargs['params'], {'from': 8675309, - 'take': 75}) + 'take': 75, + 'page': None, + 'per_page': None, + 'include_totals': 'true'}) @mock.patch('auth0.v3.management.organizations.RestClient') def test_create_organization_members(self, mock_rc): diff --git a/auth0/v3/test/management/test_roles.py b/auth0/v3/test/management/test_roles.py index bc296436..f2559a33 100644 --- a/auth0/v3/test/management/test_roles.py +++ b/auth0/v3/test/management/test_roles.py @@ -124,8 +124,8 @@ def test_list_users(self, mock_rc): self.assertEqual(kwargs['params'], { 'from': 8675309, 'take': 75, - 'per_page': None, - 'page': None, + 'per_page': 25, + 'page': 0, 'include_totals': 'true', }) From 2e013c67a63b3a049188925ef56bc58aa4ac0798 Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Tue, 20 Jul 2021 13:14:21 -0400 Subject: [PATCH 184/663] tests: Update tests --- auth0/v3/test/management/test_organizations.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/auth0/v3/test/management/test_organizations.py b/auth0/v3/test/management/test_organizations.py index 002e399f..69ce6813 100644 --- a/auth0/v3/test/management/test_organizations.py +++ b/auth0/v3/test/management/test_organizations.py @@ -49,7 +49,10 @@ def test_all_organizations(self, mock_rc): self.assertEqual('https://domain/api/v2/organizations', args[0]) self.assertEqual(kwargs['params'], {'from': 8675309, - 'take': 75}) + 'take': 75, + 'page': None, + 'per_page': None, + 'include_totals': 'true'}) @mock.patch('auth0.v3.management.organizations.RestClient') def test_get_organization_by_name(self, mock_rc): From 685efc0383e57cdb8e02d170dea62ea6603654bf Mon Sep 17 00:00:00 2001 From: Evan Sims Date: Mon, 26 Jul 2021 07:52:33 -0400 Subject: [PATCH 185/663] Apply suggestions from code review Co-authored-by: Luciano Balmaceda --- auth0/v3/management/organizations.py | 8 ++++---- auth0/v3/management/roles.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/auth0/v3/management/organizations.py b/auth0/v3/management/organizations.py index c58f0301..21df879f 100644 --- a/auth0/v3/management/organizations.py +++ b/auth0/v3/management/organizations.py @@ -44,8 +44,8 @@ def all_organizations(self, page=None, per_page=None, include_totals=True, from_ include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. Defaults to True. - from_param (str, optional): Checkpoint Id form which to begin retrieving results. - You can limit the amount of logs using the take parameter. + from_param (str, optional): Checkpoint Id from which to begin retrieving results. + You can limit the number of entries using the take parameter. take (int, optional): The total amount of entries to retrieve when using the from parameter. When not set, the default value is up to the server. @@ -215,8 +215,8 @@ def all_organization_members(self, id, page=None, per_page=None, include_totals= include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. Defaults to True. - from_param (str, optional): Checkpoint Id form which to begin retrieving results. - You can limit the amount of logs using the take parameter. + from_param (str, optional): Checkpoint Id from which to begin retrieving results. + You can limit the number of entries using the take parameter. take (int, optional): The total amount of entries to retrieve when using the from parameter. When not set, the default value is up to the server. diff --git a/auth0/v3/management/roles.py b/auth0/v3/management/roles.py index 51e4ba22..140a053e 100644 --- a/auth0/v3/management/roles.py +++ b/auth0/v3/management/roles.py @@ -113,8 +113,8 @@ def list_users(self, id, page=0, per_page=25, include_totals=True, from_param=No include_totals (bool, optional): True if the query summary is to be included in the result, False otherwise. Defaults to True. - from_param (str, optional): Checkpoint Id form which to begin retrieving results. - You can limit the amount of logs using the take parameter. + from_param (str, optional): Checkpoint Id from which to begin retrieving results. + You can limit the number of entries using the take parameter. take (int, optional): The total amount of entries to retrieve when using the from parameter. When not set, the default value is up to the server. From dcf7880b21703a8e3a91370e1709946bc080fa6b Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 10 Aug 2021 18:47:04 +0200 Subject: [PATCH 186/663] add /oauth/token login with passwordless grant --- auth0/v3/authentication/get_token.py | 41 +++++++++++++ auth0/v3/authentication/passwordless.py | 4 ++ .../v3/test/authentication/test_get_token.py | 58 +++++++++++++++++++ .../test/authentication/test_passwordless.py | 14 ++--- 4 files changed, 110 insertions(+), 7 deletions(-) diff --git a/auth0/v3/authentication/get_token.py b/auth0/v3/authentication/get_token.py index 04e8f24c..bb02ad42 100644 --- a/auth0/v3/authentication/get_token.py +++ b/auth0/v3/authentication/get_token.py @@ -196,3 +196,44 @@ def refresh_token(self, client_id, client_secret, refresh_token, grant_type='ref 'grant_type': grant_type } ) + + def passwordless_login(self, client_id, client_secret, username, otp, realm, scope, audience): + """Calls /oauth/token endpoint with http://auth0.com/oauth/grant-type/passwordless/otp grant type + + Once the verification code was received, login the user using this endpoint with their + phone number/email and verification code. + + Args: + client_id (str): your application's client Id + + client_secret (str): your application's client Secret. Only required for Regular Web Apps. + + username (str): The user's phone number or email address. + + otp (str): the user's verification code. + + realm (str): use 'sms' or 'email'. + Should be the same as the one used to start the passwordless flow. + + scope(str): String value of the different scopes the client is asking for. + Multiple scopes are separated with whitespace. + + audience (str): The unique identifier of the target API you want to access. + + Returns: + access_token, id_token + """ + + return self.post( + '{}://{}/oauth/token'.format(self.protocol, self.domain), + data={ + 'client_id': client_id, + 'username': username, + 'otp': otp, + 'realm': realm, + 'client_secret': client_secret, + 'scope': scope, + 'audience': audience, + 'grant_type': 'http://auth0.com/oauth/grant-type/passwordless/otp' + } + ) \ No newline at end of file diff --git a/auth0/v3/authentication/passwordless.py b/auth0/v3/authentication/passwordless.py index 4cf18e4b..554de49c 100644 --- a/auth0/v3/authentication/passwordless.py +++ b/auth0/v3/authentication/passwordless.py @@ -23,6 +23,8 @@ def email(self, client_id, email, send='link', auth_params=None, client_secret=N - A verification code (send:"code"). You can then authenticate with this user using email as username and code as password. + Complete the authentication using the get_token.passwordless_login method. + Args: client_id (str): Client Id of the application. @@ -58,6 +60,8 @@ def sms(self, client_id, phone_number, client_secret=None): a verification code. You can then authenticate with this user using phone number as username and code as password. + Complete the authentication using the get_token.passwordless_login method. + Args: client_id (str): Client Id of the application. diff --git a/auth0/v3/test/authentication/test_get_token.py b/auth0/v3/test/authentication/test_get_token.py index e10c9b1c..e5f2f3c4 100644 --- a/auth0/v3/test/authentication/test_get_token.py +++ b/auth0/v3/test/authentication/test_get_token.py @@ -117,3 +117,61 @@ def test_refresh_token(self, mock_post): 'grant_type': 'gt', 'scope': 's' }) + + + @mock.patch('auth0.v3.authentication.get_token.GetToken.post') + def test_passwordless_login_with_sms(self, mock_post): + + g = GetToken('my.domain.com') + + g.passwordless_login( + client_id='cid', + client_secret='csec', + username='123456', + otp='abcd', + realm='sms', + audience='aud', + scope='openid') + + args, kwargs = mock_post.call_args + + self.assertEqual(args[0], 'https://my.domain.com/oauth/token') + self.assertEqual(kwargs['data'], { + 'client_id': 'cid', + 'client_secret': 'csec', + 'realm': 'sms', + 'grant_type': 'http://auth0.com/oauth/grant-type/passwordless/otp', + 'username': '123456', + 'otp': 'abcd', + 'audience': 'aud', + 'scope': 'openid', + }) + + + @mock.patch('auth0.v3.authentication.get_token.GetToken.post') + def test_passwordless_login_with_email(self, mock_post): + + g = GetToken('my.domain.com') + + g.passwordless_login( + client_id='cid', + client_secret='csec', + username='a@b.c', + otp='abcd', + realm='email', + audience='aud', + scope='openid') + + args, kwargs = mock_post.call_args + + self.assertEqual(args[0], 'https://my.domain.com/oauth/token') + self.assertEqual(kwargs['data'], { + 'client_id': 'cid', + 'client_secret': 'csec', + 'realm': 'email', + 'grant_type': 'http://auth0.com/oauth/grant-type/passwordless/otp', + 'username': 'a@b.c', + 'otp': 'abcd', + 'audience': 'aud', + 'scope': 'openid', + }) diff --git a/auth0/v3/test/authentication/test_passwordless.py b/auth0/v3/test/authentication/test_passwordless.py index 86fa985b..6041f5cf 100644 --- a/auth0/v3/test/authentication/test_passwordless.py +++ b/auth0/v3/test/authentication/test_passwordless.py @@ -6,7 +6,7 @@ class TestPasswordless(unittest.TestCase): @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') - def test_email(self, mock_post): + def test_send_email(self, mock_post): p = Passwordless('my.domain.com') @@ -25,7 +25,7 @@ def test_email(self, mock_post): }) @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') - def test_email_with_auth_params(self, mock_post): + def test_send_email_with_auth_params(self, mock_post): p = Passwordless('my.domain.com') @@ -46,7 +46,7 @@ def test_email_with_auth_params(self, mock_post): }) @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') - def test_email_with_client_secret(self, mock_post): + def test_send_email_with_client_secret(self, mock_post): p = Passwordless('my.domain.com') @@ -67,7 +67,7 @@ def test_email_with_client_secret(self, mock_post): }) @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') - def test_sms(self, mock_post): + def test_send_sms(self, mock_post): p = Passwordless('my.domain.com') p.sms(client_id='cid', phone_number='123456') @@ -82,7 +82,7 @@ def test_sms(self, mock_post): }) @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') - def test_sms_with_client_secret(self, mock_post): + def test_send_sms_with_client_secret(self, mock_post): p = Passwordless('my.domain.com') p.sms(client_id='cid', client_secret='csecret', phone_number='123456') @@ -98,7 +98,7 @@ def test_sms_with_client_secret(self, mock_post): }) @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') - def test_sms_login(self, mock_post): + def test_send_sms_login(self, mock_post): p = Passwordless('my.domain.com') @@ -117,7 +117,7 @@ def test_sms_login(self, mock_post): }) @mock.patch('auth0.v3.authentication.passwordless.Passwordless.post') - def test_sms_login_with_scope(self, mock_post): + def test_send_sms_login_with_scope(self, mock_post): p = Passwordless('my.domain.com') From 14330aab6fe3588f9c001000a2d4501964e4242c Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Tue, 10 Aug 2021 18:50:08 +0200 Subject: [PATCH 187/663] deprecate /oauth/ro for passwordless --- auth0/v3/authentication/passwordless.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/auth0/v3/authentication/passwordless.py b/auth0/v3/authentication/passwordless.py index 554de49c..1cdc1fca 100644 --- a/auth0/v3/authentication/passwordless.py +++ b/auth0/v3/authentication/passwordless.py @@ -95,7 +95,8 @@ def sms_login(self, client_id, phone_number, code, scope='openid'): scope (str, optional): Scope to use. Defaults to 'openid'. """ - + warnings.warn("/oauth/ro will be deprecated in future releases", DeprecationWarning) + return self.post( '{}://{}/oauth/ro'.format(self.protocol, self.domain), data={ From 618df0e09bcebd6a0e1d57b6fdbb6daf2c529462 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Wed, 11 Aug 2021 11:29:06 +0200 Subject: [PATCH 188/663] add missing import statement --- auth0/v3/authentication/passwordless.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/auth0/v3/authentication/passwordless.py b/auth0/v3/authentication/passwordless.py index 1cdc1fca..7ba3ff3f 100644 --- a/auth0/v3/authentication/passwordless.py +++ b/auth0/v3/authentication/passwordless.py @@ -1,3 +1,4 @@ +import warnings from .base import AuthenticationBase @@ -96,7 +97,7 @@ def sms_login(self, client_id, phone_number, code, scope='openid'): scope (str, optional): Scope to use. Defaults to 'openid'. """ warnings.warn("/oauth/ro will be deprecated in future releases", DeprecationWarning) - + return self.post( '{}://{}/oauth/ro'.format(self.protocol, self.domain), data={ From 3303593cfcbf433050d57501a202cf8c0bf2c887 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Fri, 26 Feb 2021 17:13:54 +0100 Subject: [PATCH 189/663] re-run sphinx quickstart --- auth0/v3/authentication/__init__.py | 2 + auth0/v3/doctrees/environment.pickle | Bin 0 -> 243219 bytes auth0/v3/doctrees/index.doctree | Bin 0 -> 4971 bytes auth0/v3/doctrees/modules.doctree | Bin 0 -> 2863 bytes auth0/v3/doctrees/v3.authentication.doctree | Bin 0 -> 196140 bytes auth0/v3/doctrees/v3.doctree | Bin 0 -> 11083 bytes auth0/v3/doctrees/v3.management.doctree | Bin 0 -> 641735 bytes auth0/v3/html/.buildinfo | 4 + auth0/v3/html/.nojekyll | 0 auth0/v3/html/_modules/index.html | 242 + .../v3/authentication/authorize_client.html | 225 + .../html/_modules/v3/authentication/base.html | 332 + .../_modules/v3/authentication/database.html | 304 + .../_modules/v3/authentication/delegated.html | 233 + .../v3/authentication/enterprise.html | 225 + .../_modules/v3/authentication/get_token.html | 390 + .../_modules/v3/authentication/logout.html | 237 + .../v3/authentication/passwordless.html | 301 + .../v3/authentication/revoke_token.html | 233 + .../_modules/v3/authentication/social.html | 235 + .../_modules/v3/authentication/users.html | 244 + auth0/v3/html/_modules/v3/exceptions.html | 223 + .../v3/html/_modules/v3/management/auth0.html | 262 + .../_modules/v3/management/blacklists.html | 262 + .../_modules/v3/management/client_grants.html | 297 + .../html/_modules/v3/management/clients.html | 341 + .../_modules/v3/management/connections.html | 351 + .../v3/management/custom_domains.html | 278 + .../v3/management/device_credentials.html | 281 + .../v3/management/email_templates.html | 272 + .../html/_modules/v3/management/emails.html | 276 + .../html/_modules/v3/management/grants.html | 270 + .../html/_modules/v3/management/guardian.html | 349 + .../v3/html/_modules/v3/management/hooks.html | 374 + .../v3/html/_modules/v3/management/jobs.html | 319 + .../_modules/v3/management/log_streams.html | 283 + .../v3/html/_modules/v3/management/logs.html | 291 + .../v3/management/resource_servers.html | 304 + .../v3/html/_modules/v3/management/rest.html | 371 + .../v3/html/_modules/v3/management/roles.html | 393 + .../v3/html/_modules/v3/management/rules.html | 327 + .../_modules/v3/management/rules_configs.html | 262 + .../v3/html/_modules/v3/management/stats.html | 254 + .../html/_modules/v3/management/tenants.html | 257 + .../html/_modules/v3/management/tickets.html | 248 + .../_modules/v3/management/user_blocks.html | 279 + .../v3/html/_modules/v3/management/users.html | 569 + .../v3/management/users_by_email.html | 252 + auth0/v3/html/_sources/index.rst.txt | 25 + auth0/v3/html/_sources/modules.rst.txt | 7 + .../html/_sources/v3.authentication.rst.txt | 109 + auth0/v3/html/_sources/v3.management.rst.txt | 221 + auth0/v3/html/_sources/v3.rst.txt | 30 + auth0/v3/html/_static/basic.css | 856 ++ auth0/v3/html/_static/css/badge_only.css | 1 + .../_static/css/fonts/Roboto-Slab-Bold.woff | Bin 0 -> 87624 bytes .../_static/css/fonts/Roboto-Slab-Bold.woff2 | Bin 0 -> 67312 bytes .../css/fonts/Roboto-Slab-Regular.woff | Bin 0 -> 86288 bytes .../css/fonts/Roboto-Slab-Regular.woff2 | Bin 0 -> 66444 bytes .../_static/css/fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../_static/css/fonts/fontawesome-webfont.svg | 2671 ++++ .../_static/css/fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../css/fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../css/fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes .../_static/css/fonts/lato-bold-italic.woff | Bin 0 -> 323344 bytes .../_static/css/fonts/lato-bold-italic.woff2 | Bin 0 -> 193308 bytes .../v3/html/_static/css/fonts/lato-bold.woff | Bin 0 -> 309728 bytes .../v3/html/_static/css/fonts/lato-bold.woff2 | Bin 0 -> 184912 bytes .../_static/css/fonts/lato-normal-italic.woff | Bin 0 -> 328412 bytes .../css/fonts/lato-normal-italic.woff2 | Bin 0 -> 195704 bytes .../html/_static/css/fonts/lato-normal.woff | Bin 0 -> 309192 bytes .../html/_static/css/fonts/lato-normal.woff2 | Bin 0 -> 182708 bytes auth0/v3/html/_static/css/theme.css | 4 + auth0/v3/html/_static/doctools.js | 321 + .../v3/html/_static/documentation_options.js | 12 + auth0/v3/html/_static/file.png | Bin 0 -> 286 bytes auth0/v3/html/_static/jquery-3.5.1.js | 10872 ++++++++++++++++ auth0/v3/html/_static/jquery.js | 2 + auth0/v3/html/_static/js/badge_only.js | 1 + .../_static/js/html5shiv-printshiv.min.js | 4 + auth0/v3/html/_static/js/html5shiv.min.js | 4 + auth0/v3/html/_static/js/theme.js | 1 + auth0/v3/html/_static/language_data.js | 297 + auth0/v3/html/_static/minus.png | Bin 0 -> 90 bytes auth0/v3/html/_static/plus.png | Bin 0 -> 90 bytes auth0/v3/html/_static/pygments.css | 74 + auth0/v3/html/_static/searchtools.js | 522 + auth0/v3/html/_static/underscore-1.12.0.js | 2027 +++ auth0/v3/html/_static/underscore.js | 6 + auth0/v3/html/genindex.html | 1213 ++ auth0/v3/html/index.html | 304 + auth0/v3/html/modules.html | 215 + auth0/v3/html/objects.inv | Bin 0 -> 2100 bytes auth0/v3/html/py-modindex.html | 438 + auth0/v3/html/search.html | 223 + auth0/v3/html/searchindex.js | 1 + auth0/v3/html/v3.authentication.html | 849 ++ auth0/v3/html/v3.html | 290 + auth0/v3/html/v3.management.html | 2548 ++++ docs/Makefile | 200 +- docs/_static/favicon.ico | Bin 105566 -> 0 bytes docs/auth_users.rst | 6 - docs/blacklists.rst | 6 - docs/clients.rst | 6 - docs/conf.py | 290 - docs/connections.rst | 6 - docs/database.rst | 6 - docs/delegated.rst | 6 - docs/device_credentials.rst | 6 - docs/emails.rst | 7 - docs/enterprise.rst | 6 - docs/index.rst | 184 - docs/jobs.rst | 7 - docs/link.rst | 6 - docs/make.bat | 248 +- docs/passwordless.rst | 6 - docs/rules.rst | 7 - docs/social.rst | 6 - docs/source/conf.py | 73 + docs/source/index.rst | 25 + docs/source/modules.rst | 7 + docs/source/readme_content.rst | 4 + docs/source/v3.authentication.rst | 109 + docs/source/v3.management.rst | 221 + docs/source/v3.rst | 30 + docs/stats.rst | 7 - docs/tenants.rst | 7 - docs/tickets.rst | 7 - docs/users.rst | 7 - 129 files changed, 36093 insertions(+), 1013 deletions(-) create mode 100644 auth0/v3/doctrees/environment.pickle create mode 100644 auth0/v3/doctrees/index.doctree create mode 100644 auth0/v3/doctrees/modules.doctree create mode 100644 auth0/v3/doctrees/v3.authentication.doctree create mode 100644 auth0/v3/doctrees/v3.doctree create mode 100644 auth0/v3/doctrees/v3.management.doctree create mode 100644 auth0/v3/html/.buildinfo create mode 100644 auth0/v3/html/.nojekyll create mode 100644 auth0/v3/html/_modules/index.html create mode 100644 auth0/v3/html/_modules/v3/authentication/authorize_client.html create mode 100644 auth0/v3/html/_modules/v3/authentication/base.html create mode 100644 auth0/v3/html/_modules/v3/authentication/database.html create mode 100644 auth0/v3/html/_modules/v3/authentication/delegated.html create mode 100644 auth0/v3/html/_modules/v3/authentication/enterprise.html create mode 100644 auth0/v3/html/_modules/v3/authentication/get_token.html create mode 100644 auth0/v3/html/_modules/v3/authentication/logout.html create mode 100644 auth0/v3/html/_modules/v3/authentication/passwordless.html create mode 100644 auth0/v3/html/_modules/v3/authentication/revoke_token.html create mode 100644 auth0/v3/html/_modules/v3/authentication/social.html create mode 100644 auth0/v3/html/_modules/v3/authentication/users.html create mode 100644 auth0/v3/html/_modules/v3/exceptions.html create mode 100644 auth0/v3/html/_modules/v3/management/auth0.html create mode 100644 auth0/v3/html/_modules/v3/management/blacklists.html create mode 100644 auth0/v3/html/_modules/v3/management/client_grants.html create mode 100644 auth0/v3/html/_modules/v3/management/clients.html create mode 100644 auth0/v3/html/_modules/v3/management/connections.html create mode 100644 auth0/v3/html/_modules/v3/management/custom_domains.html create mode 100644 auth0/v3/html/_modules/v3/management/device_credentials.html create mode 100644 auth0/v3/html/_modules/v3/management/email_templates.html create mode 100644 auth0/v3/html/_modules/v3/management/emails.html create mode 100644 auth0/v3/html/_modules/v3/management/grants.html create mode 100644 auth0/v3/html/_modules/v3/management/guardian.html create mode 100644 auth0/v3/html/_modules/v3/management/hooks.html create mode 100644 auth0/v3/html/_modules/v3/management/jobs.html create mode 100644 auth0/v3/html/_modules/v3/management/log_streams.html create mode 100644 auth0/v3/html/_modules/v3/management/logs.html create mode 100644 auth0/v3/html/_modules/v3/management/resource_servers.html create mode 100644 auth0/v3/html/_modules/v3/management/rest.html create mode 100644 auth0/v3/html/_modules/v3/management/roles.html create mode 100644 auth0/v3/html/_modules/v3/management/rules.html create mode 100644 auth0/v3/html/_modules/v3/management/rules_configs.html create mode 100644 auth0/v3/html/_modules/v3/management/stats.html create mode 100644 auth0/v3/html/_modules/v3/management/tenants.html create mode 100644 auth0/v3/html/_modules/v3/management/tickets.html create mode 100644 auth0/v3/html/_modules/v3/management/user_blocks.html create mode 100644 auth0/v3/html/_modules/v3/management/users.html create mode 100644 auth0/v3/html/_modules/v3/management/users_by_email.html create mode 100644 auth0/v3/html/_sources/index.rst.txt create mode 100644 auth0/v3/html/_sources/modules.rst.txt create mode 100644 auth0/v3/html/_sources/v3.authentication.rst.txt create mode 100644 auth0/v3/html/_sources/v3.management.rst.txt create mode 100644 auth0/v3/html/_sources/v3.rst.txt create mode 100644 auth0/v3/html/_static/basic.css create mode 100644 auth0/v3/html/_static/css/badge_only.css create mode 100644 auth0/v3/html/_static/css/fonts/Roboto-Slab-Bold.woff create mode 100644 auth0/v3/html/_static/css/fonts/Roboto-Slab-Bold.woff2 create mode 100644 auth0/v3/html/_static/css/fonts/Roboto-Slab-Regular.woff create mode 100644 auth0/v3/html/_static/css/fonts/Roboto-Slab-Regular.woff2 create mode 100644 auth0/v3/html/_static/css/fonts/fontawesome-webfont.eot create mode 100644 auth0/v3/html/_static/css/fonts/fontawesome-webfont.svg create mode 100644 auth0/v3/html/_static/css/fonts/fontawesome-webfont.ttf create mode 100644 auth0/v3/html/_static/css/fonts/fontawesome-webfont.woff create mode 100644 auth0/v3/html/_static/css/fonts/fontawesome-webfont.woff2 create mode 100644 auth0/v3/html/_static/css/fonts/lato-bold-italic.woff create mode 100644 auth0/v3/html/_static/css/fonts/lato-bold-italic.woff2 create mode 100644 auth0/v3/html/_static/css/fonts/lato-bold.woff create mode 100644 auth0/v3/html/_static/css/fonts/lato-bold.woff2 create mode 100644 auth0/v3/html/_static/css/fonts/lato-normal-italic.woff create mode 100644 auth0/v3/html/_static/css/fonts/lato-normal-italic.woff2 create mode 100644 auth0/v3/html/_static/css/fonts/lato-normal.woff create mode 100644 auth0/v3/html/_static/css/fonts/lato-normal.woff2 create mode 100644 auth0/v3/html/_static/css/theme.css create mode 100644 auth0/v3/html/_static/doctools.js create mode 100644 auth0/v3/html/_static/documentation_options.js create mode 100644 auth0/v3/html/_static/file.png create mode 100644 auth0/v3/html/_static/jquery-3.5.1.js create mode 100644 auth0/v3/html/_static/jquery.js create mode 100644 auth0/v3/html/_static/js/badge_only.js create mode 100644 auth0/v3/html/_static/js/html5shiv-printshiv.min.js create mode 100644 auth0/v3/html/_static/js/html5shiv.min.js create mode 100644 auth0/v3/html/_static/js/theme.js create mode 100644 auth0/v3/html/_static/language_data.js create mode 100644 auth0/v3/html/_static/minus.png create mode 100644 auth0/v3/html/_static/plus.png create mode 100644 auth0/v3/html/_static/pygments.css create mode 100644 auth0/v3/html/_static/searchtools.js create mode 100644 auth0/v3/html/_static/underscore-1.12.0.js create mode 100644 auth0/v3/html/_static/underscore.js create mode 100644 auth0/v3/html/genindex.html create mode 100644 auth0/v3/html/index.html create mode 100644 auth0/v3/html/modules.html create mode 100644 auth0/v3/html/objects.inv create mode 100644 auth0/v3/html/py-modindex.html create mode 100644 auth0/v3/html/search.html create mode 100644 auth0/v3/html/searchindex.js create mode 100644 auth0/v3/html/v3.authentication.html create mode 100644 auth0/v3/html/v3.html create mode 100644 auth0/v3/html/v3.management.html delete mode 100644 docs/_static/favicon.ico delete mode 100644 docs/auth_users.rst delete mode 100644 docs/blacklists.rst delete mode 100644 docs/clients.rst delete mode 100644 docs/conf.py delete mode 100644 docs/connections.rst delete mode 100644 docs/database.rst delete mode 100644 docs/delegated.rst delete mode 100644 docs/device_credentials.rst delete mode 100644 docs/emails.rst delete mode 100644 docs/enterprise.rst delete mode 100644 docs/index.rst delete mode 100644 docs/jobs.rst delete mode 100644 docs/link.rst delete mode 100644 docs/passwordless.rst delete mode 100644 docs/rules.rst delete mode 100644 docs/social.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst create mode 100644 docs/source/modules.rst create mode 100644 docs/source/readme_content.rst create mode 100644 docs/source/v3.authentication.rst create mode 100644 docs/source/v3.management.rst create mode 100644 docs/source/v3.rst delete mode 100644 docs/stats.rst delete mode 100644 docs/tenants.rst delete mode 100644 docs/tickets.rst delete mode 100644 docs/users.rst diff --git a/auth0/v3/authentication/__init__.py b/auth0/v3/authentication/__init__.py index fe685660..c24a882b 100644 --- a/auth0/v3/authentication/__init__.py +++ b/auth0/v3/authentication/__init__.py @@ -1,3 +1,5 @@ +"""Authentication module +""" from .authorize_client import AuthorizeClient from .database import Database from .delegated import Delegated diff --git a/auth0/v3/doctrees/environment.pickle b/auth0/v3/doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..ba87242af230744092f2278bfce179d5b9b7f5e7 GIT binary patch literal 243219 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 hUbHr1OjCdoVaf`nay8F2f?nA3T*kG-lI% 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 literal 0 HcmV?d00001 diff --git a/auth0/v3/doctrees/v3.authentication.doctree b/auth0/v3/doctrees/v3.authentication.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0870e9b831479bb1b4bd13307434945bbc258382 GIT binary patch literal 196140 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 literal 0 HcmV?d00001 diff --git a/auth0/v3/doctrees/v3.doctree b/auth0/v3/doctrees/v3.doctree new file mode 100644 index 0000000000000000000000000000000000000000..97c68074e4c6f1bed216c788badca4b6fad9a024 GIT binary patch literal 11083 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 LC|T@P0Dt-a=c}oG literal 0 HcmV?d00001 diff --git a/auth0/v3/doctrees/v3.management.doctree b/auth0/v3/doctrees/v3.management.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5d03474762b770555fd15678fac7c85416d3c5d5 GIT binary patch literal 641735 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

3L49R$b{{4dKnXB$@@6{_ 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

#xbnZ2flza(l7$ zKM$qFNlPRGv6Y^K(umypAAFUVNW8m$@9)YS(x+p0i_ntY-Qc zN{|tn(ZOIu2aM394Z%824M4KGjnYmFp|q{5jy`fZ5AfyVmDbRffg<4SwJ1u%4Q7M0 zlXJjXsAIrnWveSq3n=#1fIKx6dmEP2Pz-qs0V>-*a2qRi5~|5iOio^)LN%+~7UP3r zp8)b)Q0&wAy$^~hGqL;Vv`QvUrh}>^(de^TUr@wZXS2TSq)i-Iah%P18RS5=;oy_` zL=VG+?CGrh15&x?v+%4_f%93lq3iLgF8g7g&hG6($|BS6fds%xzKb8mxXE2T#QCg$ zQ8mQ*tPf4u`7EM5a6XF*+2^w~iCv{tQrmIov$*V)k{(!FOADsi?&o$w=d-9c@A<4w zqO9{-T1bSG^3P{cQ&WFFYrp$r?NP#4JfF3fsx@;8k2#;k3X%B1eLhPTQe#!D9*JU+ z)a4(jQZRTvOA97F0vpJj&!WyGLAy!&wfpWb+&6B=oPFy}(M+As+6c^K;G}y8wa!)4 zK%P?4xPv-flr;j|=1DBQ!85=0oX>iet5-LH*SLzt64=A@SuGbGZj#4E(dbb79gdcB zL+#vtu~7TVUA>eDwNvMQNRw+Yy*QusR}MxzIS+3uric$ZTFzAjw{IyTa6aqPu0Ber zfx0fDhHzQ*d^l&csqlR8tlXa4sBWqaZ%qj?ebQjHSc`Z94OGaA{0BH zwUeU-b1P%(&N`p9H&iWtKI=b0D0Dsx6*ML1vlxa%d5pQNL=Ws)Ld}JCpS*8PP)FpC zdXn|s=|Pa^uc$Bo`K-+E3d^KRu@?wZ;79D9rx)k5x)-G(lxM@}w4)c6lWxcPtUt-~ zS!a@Iu7!`zsmPp2&@05g&ed3h&SyPU)N=SbXY={2ONryBMR3fM1apku-3y6h%auE& z=d-ROYM)h@T6D!Rwb_yT=XXAGN6V4K=Ee`!Y}+h1UTFw!+oNn`%Q9yf4_B4rA{NbUMshXWofjy5HMfM}~}M zu>G3Nifl4h3hp2^<^Ys!m1$vZIQmA{3YMt-%Dl7@Zol~!o+ep7DYZjdhQeB~%oKhnvM$oQWL~LX7 z<@>xF$aCfUJdEFG@_ht4Gc2ey{9Mm~XS{ji@W7CG)3q?}Jh=ewH2U!a&KJ%o;Iv2# zAD--Ya*^L4Jup&}nt_oY2hw{1BX@h7n2JTblf)rlV?Buf>+;}{(+6Nz*VPV)hGRV$1W)Q*CF``xwH=YrP8+~laDX`mSw0=(`rk@(Y zG$TfX>60UBF=8b7*o%B;aEV<_Mh8bmbijyFS{PsoY9NCc*T-HSIf>y%+7EZ&gU!zx7#yh&UEi4 z+KymF&|$SrrCT{VjI>vlUfN?Lk^*YZ-#Pu8tWeU|x` zlm!xDew&pZZ_G0PM^$T97=xW~?mWtCYDwaja6vT#h}G%e6xXq`!o+hetMt3rKu6;F ze64Lsm-&@V!7mC^fLlo?1$q-VQ|ae(-tK_5?j7GwuA&ACmbQuM=l=^bf_YR&H_Sxy zLh0v+xq5XIc!;ZLEP*{tKR?MuhnwUTqG)vb`B{#ZbF-egeJksEPUxn$OI^K`$a|*F zZTw>br(A>SMf!Qo!H6gQyjn~VH#%C*RRp(hDI$=5{(M&-CDcG&7g0mFEP863Gg_(i z^S<2YL5x*H#s1PKV1lvJm|-I#QqVP78L!OeppwTcbA-zkYxZoVp=0mZAEu$xdLmpJ zkHOcmZkaCA&_4*qVZz+PY3QHC2J+I-KjkpLVrl3fceG%Re_MZ68u~v$)#7RB4?`_V zLq`R9)6i!JbcPXxN(^m#dBgl~P?Te?@5g_V^Uq2+UA$hr7=lKd@NNsPE*!7d;MGKl zYI4gcn3MhocCk49ckW5%>iBUfdI5;iS%F2xXf))MO?BOoqz*SqCPVeHvFcC@QVfRS z=E}-2IE6>6^@&!0aw&L=lS7$2$PEgEziAkcKq^ zZ?ZR_!lsdW1uhYV3J}Z}1>xT{cz_)%!fl%RPRiB&D|FV~eCLzTbA{hm+Aja4t@Mv% zrGJ2rNbl@_VGT-B|DCAi@XpTWB=vnC6ytJl_y}>#^9FN_{^$jwmYthCrAg|C6SapG zrWW0TOl@}L{`n=TpGb0C86iiGLa^2`P5T5<%VFoXA(T#1-$=xr6+xVBl1SW{5w$p4 zKz#U-DXu^qEikx0p19wUq&~Gt>Vsqi&yG;1ZK0Sv{4CPZjwJQYCDXrL8jpxHN%S{F zh~6H5n4~@yQH#ePX{pHgL*3H&%df@JI-2nFi!v>=cIOwh=K`eVHxW32X_3%T0^ibE zLQln)GL|NNf!(Fyv({PZ{qdC?Pl{+3+RvNmP(j@5BKvD6taxCgHoR0ozXDH)Jc@(C zh_w1QEYkOcuGtT$TC+-2+Bv)n9J&{Kb?r}8UukEm`f6bt|EX}YaGQV8HPYQa$E9l|?KSFGWf|$5hs1tj7yO7CHhQ0*zE|i_(ECSCZx*jxJMH#rO692yCw*}3D_q!k zC1iUe@dNM`Jl%lF-}onPA?5Y^rBc2RCDsmxkI+_$Aqg{tTcra;tsrRbFUE#cOVMgt zU&j+ueGyFYVs9{YY(y# zmy2v@9N+^Knih9y3!@@G*udZQo+-L!@Vt4FLD-QmdhwoGl}#IWPjXAlNqN%a*AFd9GBR zCVrnu^0`dt}@VmSPU{IHdRjRjWOFMXhn;d@Vc@jK+_dpEQol z{Isxber3z?Eg+H1`s&7&Z*Ud$;L6uTmPK5tm6G0v`k7W-d03wDdQhe&ID;~80|pF~ z*%i3_EXt6K)B0FV+kCWDhnr#&rf=af)}l71DtT%3NHdzQOu|Clpi z<{emx4jX<^Qyzku=S!F=Cl3iXuh>$b7#YTgv?^l|ve>jnpv|$$XmwdKzNJ1^9T=M! z9jwCpVd4m4Dd_nVV)w`Jkr^6>y(5zhJ()>_o<9(^g3$9Ut%|a&$+@x@O=(^K4>A9{ z2<9208qEJDq839`l9LS=%-}LgmwiA+2j7e6fFY{1Hb5uTKn9{-*h7dK15OY9D;l|S z{Mg|1oZf&_X%)R{PFaQkq(=b@d1FEY(qpis2BgS)2v*wmgn(4)FjSKPshk=?DQL_WT!sCJSS4uG?^J-co~r0D`0pZ zN{)dci9-OxD^W6$z;N%YXyRedqg*sPzgEK}eLFV3IDLTokV{w;1iS((5d?gTrZEHo zPm~Z);-ef-BfSw*3haHD7<&{xGDdD#E-qyZ_Lv<6dmj+Bf?#i1l%J8Akh&;VNo(r! z#L#0A4Do_%F!b4oS`6TbcYAsD063$A_eFHT08ZKptmf1}2Ebj}4S*Z2j#T0LDP#U6 z&qWN9`w7a}>t?*9B$CUe2t18FZ&w+Oz;^!`P>sfR|Ai$rwnJ%z5Sndji0!0$Lp2%O z$=MC8K`jBc@%gabe(!K&yMyq1AGT8#R~p-0$ZJK1KdfXhd0la&XLsz!efQ3|)6pp@ zIG=_`lD65G6ZdVoMSjs@>H-6-=+S5afFmcmAqd0J#yM44JK=^E70w4%%; zWXv9Cq$WCpIgbJ+dWAV_C`ZPeBpiV`k3~5}V$Ow(Il&?6@-v zFz7K@i7;qG(;UK}GwOzH6T5fAM`mCc)@~qEW)hL<3q-9TGVO)$kWZoXqA9KGHxTo$ zi(sCig~9xN5w#e_lALTH;X$!R2X{tvz$jK)8{igdAcJC`)>{-CgI_<4()Hrk^LvJ0 zzsD&W@mawV>Fh=EJOy19>ig z;}ZCBh_|AA8}78;;g$ao^;YC4(&Vcx_A^$c(oJz5k%aJ zoj@rc+50Y_Y`;#@=r{IlQFmT^Jpay%McLLnFT2PqqO3CA<*&sewG)0ABg_vCaaG0i z)<1ywsD`-4;&WYGV{v5Y8jI%kHVf?p-@XEloLTStY4Y0j?lug~Xcuu)MD`o@3R{a#YIU)&vP zH5mQso!Cs>Gf@R*GAPu&J*&8i8h}+w8MkNGin6`9XW|xDuWkY-T}5LF?BP8V_qgbA zll%%%H2R*2w>nzRz21P^x2`t`-ZSxDS1%|uhIT!ZPwJrj>P81dXQ@tIRpqzTX#!fztU4eD~Iru`~`d+?I}5{(yTVuBx{C7;28IsXV(W)IOY9p zwX@ree>YN~)mI?!L;gl0N#d{Y-4aJ*19^8#918_HSA$}AOC0HF!5s6p=B&FVmP6Iz zcS{@ywdigMRFL;>i5bDRth3OrlJ}$QffIIR9fbcR_nUQ<#6j!TRT9nY(}td36?#c8 zz-A$to?9>CXqyS_D8`o|ihx&d$CHMClD9=Xn~d^0_~@K^%!$Krhdv!^&}|WaDQY>~ zp&h5O)(qF-sg5z3a`24$L?fZGL_a`UY5(Rm$rAKFVA3g{@f@m;E|GhIGvbhD zjld}{J*THP5Xbchj(KWej?n=;LL6Ju!j#??aVt@KOJQo!vBuP9NA92BZ4ui^j<1Z6 zBPXP=*6~7ymx@{rJMYnL5pN^n-WoxiZIVdbna%|6<~P$88Z) zdt1cclM#F(LY=mSqMP$0q@x|TMU=WN;wvQje~u8nJ^t{vh%ZFc;_*jXDl-01w>19p zYjIeNCj9)OObe~u`9nOQ-y-sSFPfj8_|@wPq9EF>L0gb+bEJ zUl+05yT2qacz;LZ9sYUEMEllh_RnW23uW#cC%mVf^&njb4)JL5We*JQlaT@KQZwJH zy^QbxFM20!lca*f9$@suE>yKc%KeYv1_1wlJ`nrHUq2OzQ_|?MLq7*rJ}6i z-(6tnmk_hg7s~#&ux)*3YxR5=9d44(b`{Mf*+1P#ZzQ_5w27pB&_x#+Lq%L$?Sq`d z$CDtWY0P-L_63?tdb?8LMcEf_w@B+KTuu!lDTodE0Vt5j)S#!VhY54@m^t|I0*Q(^ z+^0f5fl|sk(p#|W#p!dHg7C0MILYhf{#c0;g|=x9vKtfoT8tZf$?9;YM{T%&{(Qsi zlfIE!6JAQ(l+Xl696E(DdDLITZZeW(WaGY%&=*5KAgdA&xdRQFesSY8evnW1hB z24e@!!oVF`ThwywEIM}3hh%fzNd|I%yeL~hTy6qlGWNc2C0gGSL94Ae-21+fXtnmf zmulfcC|F9o3k^tqdf%`%~3o0p?c+{jvAPvp(I=HYs2bWnCp8(0VM19pe1Do z0>peHAZ?xM^err@Q=O3GNY^qecXyDJ)L5t{XA{ZU9u%xrLff8v*+jnq@?5D-zsK)0 zsZIjs8b(watDl5WvQZzY7DMSvV^F$i){oC8X9AxyO(A5yNJ9$}4gyW_uPhqhLy1t% zg~m6w@$UC7d(_1t@V!*6_KeF+WA8nbNO-m>kGlJS!OT+ZhOo!DiW;l7gr%5Ok%+Pe z>YmHm$K8^~+vc}$s}hy5^|sE{tDC^nT}5*VwC4xYi7%N!jIE6zJp#IzE{wfT$3XC) zYfW7SUGE0ec8{(%p;#GR6aNBT&qq;2qU%0D*MuVRE%HjEQNf!tXjBudtk^(1zJjur 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%0D;Vb_o#Qz31&-lpK5B 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 + + + + + + + Overview: module code — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Overview: module code
  • + + +
  • + +
  • + +
+ + +
+
+ +
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/authentication/authorize_client.html b/auth0/v3/html/_modules/v3/authentication/authorize_client.html new file mode 100644 index 00000000..417e36f4 --- /dev/null +++ b/auth0/v3/html/_modules/v3/authentication/authorize_client.html @@ -0,0 +1,225 @@ + + + + + + + + + + v3.authentication.authorize_client — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.authentication.authorize_client
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.authentication.authorize_client

+from .base import AuthenticationBase
+
+
+
[docs]class AuthorizeClient(AuthenticationBase): + + """Authorize Client + + Args: + domain (str): Your auth0 domain (e.g: username.auth0.com) + """ + +
[docs] def authorize(self, client_id, audience=None, state=None, redirect_uri=None, + response_type='code', scope='openid'): + """Authorization code grant + + This is the OAuth 2.0 grant that regular web apps utilize in order to access an API. + """ + params = { + 'client_id': client_id, + 'audience': audience, + 'response_type': response_type, + 'scope': scope, + 'state': state, + 'redirect_uri': redirect_uri + } + + return self.get( + 'https://{}/authorize'.format(self.domain), + params=params)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/authentication/base.html b/auth0/v3/html/_modules/v3/authentication/base.html new file mode 100644 index 00000000..b6e7d905 --- /dev/null +++ b/auth0/v3/html/_modules/v3/authentication/base.html @@ -0,0 +1,332 @@ + + + + + + + + + + v3.authentication.base — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.authentication.base
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.authentication.base

+import base64
+import json
+import sys
+import platform
+import requests
+from ..exceptions import Auth0Error, RateLimitError
+
+UNKNOWN_ERROR = 'a0.sdk.internal.unknown'
+
+
+
[docs]class AuthenticationBase(object): + """Base authentication object providing simple REST methods. + + Args: + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, telemetry=True, timeout=5.0): + self.domain = domain + self.timeout = timeout + self.base_headers = {'Content-Type': 'application/json'} + + if telemetry: + py_version = platform.python_version() + version = sys.modules['auth0'].__version__ + + auth0_client = json.dumps({ + 'name': 'auth0-python', + 'version': version, + 'env': { + 'python': py_version, + } + }).encode('utf-8') + + self.base_headers.update({ + 'User-Agent': 'Python/{}'.format(py_version), + 'Auth0-Client': base64.b64encode(auth0_client), + }) + +
[docs] def post(self, url, data=None, headers=None): + request_headers = self.base_headers.copy() + request_headers.update(headers or {}) + response = requests.post(url=url, json=data, headers=request_headers, timeout=self.timeout) + return self._process_response(response)
+ +
[docs] def get(self, url, params=None, headers=None): + request_headers = self.base_headers.copy() + request_headers.update(headers or {}) + response = requests.get(url=url, params=params, headers=request_headers, timeout=self.timeout) + return self._process_response(response)
+ + def _process_response(self, response): + return self._parse(response).content() + + def _parse(self, response): + if not response.text: + return EmptyResponse(response.status_code) + try: + return JsonResponse(response) + except ValueError: + return PlainResponse(response)
+ + +
[docs]class Response(object): + def __init__(self, status_code, content, headers): + self._status_code = status_code + self._content = content + self._headers = headers + +
[docs] def content(self): + if self._is_error(): + if self._status_code == 429: + reset_at = int(self._headers.get('x-ratelimit-reset', '-1')) + raise RateLimitError(error_code=self._error_code(), + message=self._error_message(), + reset_at=reset_at) + + raise Auth0Error(status_code=self._status_code, + error_code=self._error_code(), + message=self._error_message()) + else: + return self._content
+ + def _is_error(self): + return self._status_code is None or self._status_code >= 400 + + # Adding these methods to force implementation in subclasses because they are references in this parent class + def _error_code(self): + raise NotImplementedError + + def _error_message(self): + raise NotImplementedError
+ + +
[docs]class JsonResponse(Response): + def __init__(self, response): + content = json.loads(response.text) + super(JsonResponse, self).__init__(response.status_code, content, response.headers) + + def _error_code(self): + if 'error' in self._content: + return self._content.get('error') + elif 'code' in self._content: + return self._content.get('code') + else: + return UNKNOWN_ERROR + + def _error_message(self): + return self._content.get('error_description', '')
+ + +
[docs]class PlainResponse(Response): + def __init__(self, response): + super(PlainResponse, self).__init__(response.status_code, response.text, response.headers) + + def _error_code(self): + return UNKNOWN_ERROR + + def _error_message(self): + return self._content
+ + +
[docs]class EmptyResponse(Response): + def __init__(self, status_code): + super(EmptyResponse, self).__init__(status_code, '', {}) + + def _error_code(self): + return UNKNOWN_ERROR + + def _error_message(self): + return ''
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/authentication/database.html b/auth0/v3/html/_modules/v3/authentication/database.html new file mode 100644 index 00000000..49deec19 --- /dev/null +++ b/auth0/v3/html/_modules/v3/authentication/database.html @@ -0,0 +1,304 @@ + + + + + + + + + + v3.authentication.database — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.authentication.database
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.authentication.database

+import warnings
+
+from .base import AuthenticationBase
+
+
+
[docs]class Database(AuthenticationBase): + """Database & Active Directory / LDAP Authentication. + + Args: + domain (str): Your auth0 domain (e.g: username.auth0.com) + """ + +
[docs] def login(self, client_id, username, password, connection, id_token=None, + grant_type='password', device=None, scope='openid'): + """Login using username and password + + Given the user credentials and the connection specified, it will do + the authentication on the provider and return a dict with the + access_token and id_token. This endpoint only works for database + connections, passwordless connections, Active Directory/LDAP, + Windows Azure AD and ADFS. + """ + warnings.warn("/oauth/ro will be deprecated in future releases", DeprecationWarning) + + body = { + 'client_id': client_id, + 'username': username, + 'password': password, + 'connection': connection, + 'grant_type': grant_type, + 'scope': scope, + } + if id_token: + body.update({'id_token': id_token}) + if device: + body.update({'device': device}) + return self.post('https://{}/oauth/ro'.format(self.domain), data=body)
+ +
[docs] def signup(self, client_id, email, password, connection, username=None, user_metadata=None, + given_name=None, family_name=None, name=None, nickname=None, picture=None): + """Signup using email and password. + + Args: + client_id (str): ID of the application to use. + + email (str): The user's email address. + + password (str): The user's desired password. + + connection (str): The name of the database connection where this user should be created. + + username (str, optional): The user's username, if required by the database connection. + + user_metadata (dict, optional): Additional key-value information to store for the user. + Some limitations apply, see: https://auth0.com/docs/metadata#metadata-restrictions + + given_name (str, optional): The user's given name(s). + + family_name (str, optional): The user's family name(s). + + name (str, optional): The user's full name. + + nickname (str, optional): The user's nickname. + + picture (str, optional): A URI pointing to the user's picture. + + + See: https://auth0.com/docs/api/authentication#signup + """ + body = { + 'client_id': client_id, + 'email': email, + 'password': password, + 'connection': connection, + } + if username: + body.update({'username': username}) + if user_metadata: + body.update({'user_metadata': user_metadata}) + if given_name: + body.update({'given_name': given_name}) + if family_name: + body.update({'family_name': family_name}) + if name: + body.update({'name': name}) + if nickname: + body.update({'nickname': nickname}) + if picture: + body.update({'picture': picture}) + + return self.post('https://{}/dbconnections/signup'.format(self.domain), data=body)
+ +
[docs] def change_password(self, client_id, email, connection, password=None): + """Asks to change a password for a given user. + + client_id (str): ID of the application to use. + + email (str): The user's email address. + + connection (str): The name of the database connection where this user should be created. + """ + body = { + 'client_id': client_id, + 'email': email, + 'connection': connection, + } + + return self.post('https://{}/dbconnections/change_password'.format(self.domain), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/authentication/delegated.html b/auth0/v3/html/_modules/v3/authentication/delegated.html new file mode 100644 index 00000000..54a38f0c --- /dev/null +++ b/auth0/v3/html/_modules/v3/authentication/delegated.html @@ -0,0 +1,233 @@ + + + + + + + + + + v3.authentication.delegated — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.authentication.delegated
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.authentication.delegated

+from .base import AuthenticationBase
+
+
+
[docs]class Delegated(AuthenticationBase): + """Delegated authentication endpoints. + + Args: + domain (str): Your auth0 domain (e.g: username.auth0.com) + """ + +
[docs] def get_token(self, client_id, target, api_type, grant_type, + id_token=None, refresh_token=None, scope='openid'): + + """Obtain a delegation token. + """ + + if id_token and refresh_token: + raise ValueError('Only one of id_token or refresh_token ' + 'can be None') + + data = { + 'client_id': client_id, + 'grant_type': grant_type, + 'target': target, + 'scope': scope, + 'api_type': api_type, + } + + if id_token: + data.update({'id_token': id_token}) + elif refresh_token: + data.update({'refresh_token': refresh_token}) + else: + raise ValueError('Either id_token or refresh_token must ' + 'have a value') + + return self.post('https://{}/delegation'.format(self.domain), data=data)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/authentication/enterprise.html b/auth0/v3/html/_modules/v3/authentication/enterprise.html new file mode 100644 index 00000000..43a76a9d --- /dev/null +++ b/auth0/v3/html/_modules/v3/authentication/enterprise.html @@ -0,0 +1,225 @@ + + + + + + + + + + v3.authentication.enterprise — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.authentication.enterprise
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.authentication.enterprise

+from .base import AuthenticationBase
+
+
+
[docs]class Enterprise(AuthenticationBase): + + """Enterprise endpoints. + + Args: + domain (str): Your auth0 domain (e.g: username.auth0.com) + """ + +
[docs] def saml_metadata(self, client_id): + """Get SAML2.0 Metadata. + + Args: + client_id (str): Client Id of the application to get the SAML metadata for. + """ + + return self.get(url='https://{}/samlp/metadata/{}'.format(self.domain, + client_id))
+ +
[docs] def wsfed_metadata(self): + """Returns the WS-Federation Metadata. + """ + + url = 'https://{}/wsfed/FederationMetadata' \ + '/2007-06/FederationMetadata.xml' + + return self.get(url=url.format(self.domain))
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/authentication/get_token.html b/auth0/v3/html/_modules/v3/authentication/get_token.html new file mode 100644 index 00000000..eb1dad10 --- /dev/null +++ b/auth0/v3/html/_modules/v3/authentication/get_token.html @@ -0,0 +1,390 @@ + + + + + + + + + + v3.authentication.get_token — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.authentication.get_token
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.authentication.get_token

+from .base import AuthenticationBase
+
+
+
[docs]class GetToken(AuthenticationBase): + + """Oauth/token related endpoints + + Args: + domain (str): Your auth0 domain (e.g: username.auth0.com) + """ + +
[docs] def authorization_code(self, client_id, client_secret, code, + redirect_uri, grant_type='authorization_code'): + """Authorization code grant + + This is the OAuth 2.0 grant that regular web apps utilize in order + to access an API. Use this endpoint to exchange an Authorization Code + for a Token. + + Args: + grant_type (str): Denotes the flow you're using. For authorization code + use authorization_code + + client_id (str): your application's client Id + + client_secret (str): your application's client Secret + + code (str): The Authorization Code received from the /authorize Calls + + redirect_uri (str, optional): This is required only if it was set at + the GET /authorize endpoint. The values must match + + Returns: + access_token, id_token + """ + + return self.post( + 'https://{}/oauth/token'.format(self.domain), + data={ + 'client_id': client_id, + 'client_secret': client_secret, + 'code': code, + 'grant_type': grant_type, + 'redirect_uri': redirect_uri, + } + )
+ +
[docs] def authorization_code_pkce(self, client_id, code_verifier, code, + redirect_uri, grant_type='authorization_code'): + """Authorization code pkce grant + + This is the OAuth 2.0 grant that mobile apps utilize in order to access an API. + Use this endpoint to exchange an Authorization Code for a Token. + + Args: + grant_type (str): Denotes the flow you're using. For authorization code pkce + use authorization_code + + client_id (str): your application's client Id + + code_verifier (str): Cryptographically random key that was used to generate + the code_challenge passed to /authorize. + + code (str): The Authorization Code received from the /authorize Calls + + redirect_uri (str, optional): This is required only if it was set at + the GET /authorize endpoint. The values must match + + Returns: + access_token, id_token + """ + + return self.post( + 'https://{}/oauth/token'.format(self.domain), + data={ + 'client_id': client_id, + 'code_verifier': code_verifier, + 'code': code, + 'grant_type': grant_type, + 'redirect_uri': redirect_uri, + } + )
+ +
[docs] def client_credentials(self, client_id, client_secret, audience, + grant_type='client_credentials'): + """Client credentials grant + + This is the OAuth 2.0 grant that server processes utilize in + order to access an API. Use this endpoint to directly request + an access_token by using the Application Credentials (a Client Id and + a Client Secret). + + Args: + grant_type (str): Denotes the flow you're using. For client credentials + use client_credentials + + client_id (str): your application's client Id + + client_secret (str): your application's client Secret + + audience (str): The unique identifier of the target API you want to access. + + Returns: + access_token + """ + + return self.post( + 'https://{}/oauth/token'.format(self.domain), + data={ + 'client_id': client_id, + 'client_secret': client_secret, + 'audience': audience, + 'grant_type': grant_type, + } + )
+ +
[docs] def login(self, client_id, client_secret, username, password, scope, realm, + audience, grant_type='http://auth0.com/oauth/grant-type/password-realm'): + """Calls oauth/token endpoint with password-realm grant type + + + This is the OAuth 2.0 grant that highly trusted apps utilize in order + to access an API. In this flow the end-user is asked to fill in credentials + (username/password) typically using an interactive form in the user-agent + (browser). This information is later on sent to the client and Auth0. + It is therefore imperative that the client is absolutely trusted with + this information. + + Args: + grant_type (str): Denotes the flow you're using. For password realm + use http://auth0.com/oauth/grant-type/password-realm + + client_id (str): your application's client Id + + client_secret (str): your application's client Secret + + audience (str): The unique identifier of the target API you want to access. + + username (str): Resource owner's identifier + + password (str): resource owner's Secret + + scope(str): String value of the different scopes the client is asking for. + Multiple scopes are separated with whitespace. + + realm (str): String value of the realm the user belongs. + Set this if you want to add realm support at this grant. + + Returns: + access_token, id_token + """ + + return self.post( + 'https://{}/oauth/token'.format(self.domain), + data={ + 'client_id': client_id, + 'username': username, + 'password': password, + 'realm': realm, + 'client_secret': client_secret, + 'scope': scope, + 'audience': audience, + 'grant_type': grant_type + } + )
+ +
[docs] def refresh_token(self, client_id, client_secret, refresh_token, grant_type='refresh_token'): + """Calls oauth/token endpoint with refresh token grant type + + Use this endpoint to refresh an access token, using the refresh token you got during authorization. + + Args: + grant_type (str): Denotes the flow you're using. For refresh token + use refresh_token + + client_id (str): your application's client Id + + client_secret (str): your application's client Secret + + refresh_token (str): The refresh token returned from the initial token request. + + Returns: + access_token, id_token + """ + + return self.post( + 'https://{}/oauth/token'.format(self.domain), + data={ + 'client_id': client_id, + 'client_secret': client_secret, + 'refresh_token': refresh_token, + 'grant_type': grant_type + } + )
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/authentication/logout.html b/auth0/v3/html/_modules/v3/authentication/logout.html new file mode 100644 index 00000000..8578a6fb --- /dev/null +++ b/auth0/v3/html/_modules/v3/authentication/logout.html @@ -0,0 +1,237 @@ + + + + + + + + + + v3.authentication.logout — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.authentication.logout
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.authentication.logout

+from .base import AuthenticationBase
+try:
+    from urllib.parse import quote_plus
+except ImportError:
+    from urllib import quote_plus
+
+
+
[docs]class Logout(AuthenticationBase): + + """Logout Endpoint + + Args: + domain (str): Your auth0 domain (e.g: username.auth0.com) + """ + +
[docs] def logout(self, client_id, return_to, federated=False): + """Logout + + Use this endpoint to logout a user. If you want to navigate the user to a + specific URL after the logout, set that URL at the returnTo parameter. + The URL should be included in any the appropriate Allowed Logout URLs list: + + Args: + client_id (str): The client_id of your application. + + returnTo (str): URL to redirect the user after the logout. + + federated (bool): Querystring parameter to log the user out of the IdP + """ + return_to = quote_plus(return_to) + + if federated is True: + return self.get( + 'https://{}/v2/logout?federated&client_id={}&returnTo={}'.format( + self.domain, client_id, return_to) + ) + return self.get( + 'https://{}/v2/logout?client_id={}&returnTo={}'.format(self.domain, + client_id, + return_to) + )
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/authentication/passwordless.html b/auth0/v3/html/_modules/v3/authentication/passwordless.html new file mode 100644 index 00000000..4aec8572 --- /dev/null +++ b/auth0/v3/html/_modules/v3/authentication/passwordless.html @@ -0,0 +1,301 @@ + + + + + + + + + + v3.authentication.passwordless — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.authentication.passwordless
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.authentication.passwordless

+from .base import AuthenticationBase
+
+
+
[docs]class Passwordless(AuthenticationBase): + + """Passwordless connections endpoints. + + Args: + domain (str): Your auth0 domain (e.g: username.auth0.com) + """ + +
[docs] def email(self, client_id, email, send='link', auth_params=None, client_secret=None): + """Start flow sending an email. + + Given the user email address, it will send an email with: + + - A link (default, send:"link"). You can then authenticate with + this user opening the link and he will be automatically logged in + to the application. Optionally, you can append/override + parameters to the link (like scope, redirect_uri, protocol, + response_type, etc.) using auth_params dict. + + - A verification code (send:"code"). You can then authenticate with + this user using email as username and code as password. + + Args: + client_id (str): Client Id of the application. + + email (str): Email address. + + send (str, optional): Can be: 'link' or 'code'. Defaults to 'link'. + + auth_params (dict, optional): Parameters to append or override. + + client_secret (str): Client Secret of the application. + """ + + data={ + 'client_id': client_id, + 'connection': 'email', + 'email': email, + 'send': send, + } + if auth_params: + data.update({'authParams': auth_params}) + if client_secret: + data.update({'client_secret': client_secret}) + + return self.post( + 'https://{}/passwordless/start'.format(self.domain), + data=data + )
+ +
[docs] def sms(self, client_id, phone_number, client_secret=None): + """Start flow sending an SMS message. + + Given the user phone number, it will send an SMS with + a verification code. You can then authenticate with + this user using phone number as username and code as password. + + Args: + client_id (str): Client Id of the application. + + client_secret (str): Client Secret of the application. + + phone_number (str): Phone number. + """ + + data={ + 'client_id': client_id, + 'connection': 'sms', + 'phone_number': phone_number, + } + if client_secret: + data.update({'client_secret': client_secret}) + + return self.post( + 'https://{}/passwordless/start'.format(self.domain), + data=data + )
+ +
[docs] def sms_login(self, client_id, phone_number, code, scope='openid'): + """Login using phone number/verification code. + + Args: + client_id (str): Client Id of the application. + + phone_number (str): Phone number. + + code (str): Code received in the SMS. + + scope (str, optional): Scope to use. Defaults to 'openid'. + """ + + return self.post( + 'https://{}/oauth/ro'.format(self.domain), + data={ + 'client_id': client_id, + 'connection': 'sms', + 'grant_type': 'password', + 'username': phone_number, + 'password': code, + 'scope': scope, + } + )
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/authentication/revoke_token.html b/auth0/v3/html/_modules/v3/authentication/revoke_token.html new file mode 100644 index 00000000..bffd1913 --- /dev/null +++ b/auth0/v3/html/_modules/v3/authentication/revoke_token.html @@ -0,0 +1,233 @@ + + + + + + + + + + v3.authentication.revoke_token — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.authentication.revoke_token
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.authentication.revoke_token

+from .base import AuthenticationBase
+
+
+
[docs]class RevokeToken(AuthenticationBase): + """Revoke Refresh Token endpoint + + Args: + domain (str): Your auth0 domain (e.g: username.auth0.com) + """ + +
[docs] def revoke_refresh_token(self, client_id, token, client_secret=None): + """Revokes a Refresh Token if it has been compromised + + Each revocation request invalidates not only the specific token, but all other tokens + based on the same authorization grant. This means that all Refresh Tokens that have + been issued for the same user, application, and audience will be revoked. + + Args: + client_id (str): The Client ID for your Application + + token (str): The Refresh Token you want to revoke + + client_secret (str, optional): The Client Secret for your Application. + Required for confidential applications. + See: https://auth0.com/docs/applications/application-types#confidential-applications + + See: https://auth0.com/docs/api/authentication#refresh-token + """ + body = { + 'client_id': client_id, + 'token': token, + } + + if client_secret: + body.update({'client_secret': client_secret}) + + return self.post('https://{}/oauth/revoke'.format(self.domain), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/authentication/social.html b/auth0/v3/html/_modules/v3/authentication/social.html new file mode 100644 index 00000000..dedecc0d --- /dev/null +++ b/auth0/v3/html/_modules/v3/authentication/social.html @@ -0,0 +1,235 @@ + + + + + + + + + + v3.authentication.social — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.authentication.social
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.authentication.social

+from .base import AuthenticationBase
+
+
+
[docs]class Social(AuthenticationBase): + + """Social provider's endpoints. + + Args: + domain (str): Your auth0 domain (e.g: username.auth0.com) + """ + +
[docs] def login(self, client_id, access_token, connection, scope='openid'): + """Login using a social provider's access token + + Given the social provider's access_token and the connection specified, + it will do the authentication on the provider and return a dict with + the access_token and id_token. Currently, this endpoint only works for + Facebook, Google, Twitter and Weibo. + + Args: + client_id (str): application's client id. + + access_token (str): social provider's access_token. + + connection (str): connection type (e.g: 'facebook') + + Returns: + A dict with 'access_token' and 'id_token' keys. + """ + + return self.post( + 'https://{}/oauth/access_token'.format(self.domain), + data={ + 'client_id': client_id, + 'access_token': access_token, + 'connection': connection, + 'scope': scope, + } + )
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/authentication/users.html b/auth0/v3/html/_modules/v3/authentication/users.html new file mode 100644 index 00000000..6a53efc9 --- /dev/null +++ b/auth0/v3/html/_modules/v3/authentication/users.html @@ -0,0 +1,244 @@ + + + + + + + + + + v3.authentication.users — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.authentication.users
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.authentication.users

+from .base import AuthenticationBase
+import warnings
+
+
+
[docs]class Users(AuthenticationBase): + + """Userinfo related endpoints. + + Args: + domain (str): Your auth0 domain (e.g: username.auth0.com) + """ + +
[docs] def userinfo(self, access_token): + + """Returns the user information based on the Auth0 access token. + This endpoint will work only if openid was granted as a scope for the access_token. + + Args: + access_token (str): Auth0 access token (obtained during login). + + Returns: + The user profile. + """ + + return self.get( + url='https://{}/userinfo'.format(self.domain), + headers={'Authorization': 'Bearer {}'.format(access_token)} + )
+ +
[docs] def tokeninfo(self, jwt): + + """Returns user profile based on the user's jwt + + Validates a JSON Web Token (signature and expiration) and returns the + user information associated with the user id (sub property) of + the token. + + Args: + jwt (str): User's jwt + + Returns: + The user profile. + """ + warnings.warn("/tokeninfo will be deprecated in future releases", DeprecationWarning) + return self.post( + url='https://{}/tokeninfo'.format(self.domain), + data={'id_token': jwt} + )
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/exceptions.html b/auth0/v3/html/_modules/v3/exceptions.html new file mode 100644 index 00000000..0a9343a4 --- /dev/null +++ b/auth0/v3/html/_modules/v3/exceptions.html @@ -0,0 +1,223 @@ + + + + + + + + + + v3.exceptions — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.exceptions
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.exceptions

+
[docs]class Auth0Error(Exception): + def __init__(self, status_code, error_code, message): + self.status_code = status_code + self.error_code = error_code + self.message = message + + def __str__(self): + return '{}: {}'.format(self.status_code, self.message)
+ + +
[docs]class RateLimitError(Auth0Error): + def __init__(self, error_code, message, reset_at): + super(RateLimitError, self).__init__(status_code=429, error_code=error_code, message=message) + self.reset_at = reset_at
+ + +
[docs]class TokenValidationError(Exception): + pass
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/auth0.html b/auth0/v3/html/_modules/v3/management/auth0.html new file mode 100644 index 00000000..ea63a98a --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/auth0.html @@ -0,0 +1,262 @@ + + + + + + + + + + v3.management.auth0 — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.auth0
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.auth0

+from .blacklists import Blacklists
+from .client_grants import ClientGrants
+from .clients import Clients
+from .connections import Connections
+from .custom_domains import CustomDomains
+from .device_credentials import DeviceCredentials
+from .email_templates import EmailTemplates
+from .emails import Emails
+from .grants import Grants
+from .guardian import Guardian
+from .hooks import Hooks
+from .jobs import Jobs
+from .log_streams import LogStreams
+from .logs import Logs
+from .resource_servers import ResourceServers
+from .roles import Roles
+from .rules import Rules
+from .rules_configs import RulesConfigs
+from .stats import Stats
+from .tenants import Tenants
+from .tickets import Tickets
+from .user_blocks import UserBlocks
+from .users import Users
+from .users_by_email import UsersByEmail
+
+
+
[docs]class Auth0(object): + """Provides easy access to all endpoint classes + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + """ + + def __init__(self, domain, token): + self.blacklists = Blacklists(domain, token) + self.clients = Clients(domain, token) + self.client_grants = ClientGrants(domain, token) + self.custom_domains = CustomDomains(domain, token) + self.connections = Connections(domain, token) + self.device_credentials = DeviceCredentials(domain, token) + self.emails = Emails(domain, token) + self.email_templates = EmailTemplates(domain, token) + self.grants = Grants(domain, token) + self.guardian = Guardian(domain, token) + self.hooks = Hooks(domain, token) + self.jobs = Jobs(domain, token) + self.logs = Logs(domain, token) + self.log_streams = LogStreams(domain, token) + self.resource_servers = ResourceServers(domain, token) + self.roles = Roles(domain, token) + self.rules = Rules(domain, token) + self.rules_configs = RulesConfigs(domain, token) + self.stats = Stats(domain, token) + self.tenants = Tenants(domain, token) + self.tickets = Tickets(domain, token) + self.user_blocks = UserBlocks(domain, token) + self.users = Users(domain, token) + self.users_by_email = UsersByEmail(domain, token)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/blacklists.html b/auth0/v3/html/_modules/v3/management/blacklists.html new file mode 100644 index 00000000..6a7b5d8e --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/blacklists.html @@ -0,0 +1,262 @@ + + + + + + + + + + v3.management.blacklists — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.blacklists
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.blacklists

+from .rest import RestClient
+
+
+
[docs]class Blacklists(object): + """Auth0 blacklists endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.url = 'https://{}/api/v2/blacklists/tokens'.format(domain) + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + +
[docs] def get(self, aud=None): + """Retrieves the jti and aud of all tokens in the blacklist. + + Args: + aud (str, optional): The JWT's aud claim. The client_id of the + application for which it was issued. + + + See: https://auth0.com/docs/api/management/v2#!/Blacklists/get_tokens + """ + + params = { + 'aud': aud + } + + return self.client.get(self.url, params=params)
+ +
[docs] def create(self, jti, aud=None): + """Adds a token to the blacklist. + + Args: + jti (str): the jti of the JWT to blacklist. + + aud (str, optional): The JWT's aud claim. The client_id of the + application for which it was issued. + + See: https://auth0.com/docs/api/management/v2#!/Blacklists/post_tokens + """ + body = { + 'jti': jti, + } + + if aud: + body.update({'aud': aud}) + + return self.client.post(self.url, data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/client_grants.html b/auth0/v3/html/_modules/v3/management/client_grants.html new file mode 100644 index 00000000..f2c2ab25 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/client_grants.html @@ -0,0 +1,297 @@ + + + + + + + + + + v3.management.client_grants — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.client_grants
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.client_grants

+from .rest import RestClient
+
+
+
[docs]class ClientGrants(object): + """Auth0 client grants endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/client-grants'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def all(self, audience=None, page=None, per_page=None, include_totals=False, client_id=None): + """Retrieves all client grants. + + Args: + audience (str, optional): URL encoded audience of a Resource Server + to filter. + + page (int, optional): The result's page number (zero based). When not set, + the default value is up to the server. + + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to False. + + client_id (string, optional): The id of a client to filter. + + See: https://auth0.com/docs/api/management/v2#!/Client_Grants/get_client_grants + """ + + params = { + 'audience': audience, + 'page': page, + 'per_page': per_page, + 'include_totals': str(include_totals).lower(), + 'client_id': client_id, + } + + return self.client.get(self._url(), params=params)
+ +
[docs] def create(self, body): + """Creates a client grant. + + Args: + body (dict): Attributes for the new client grant. + + See: https://auth0.com/docs/api/management/v2#!/Client_Grants/post_client_grants + """ + + return self.client.post(self._url(), data=body)
+ +
[docs] def delete(self, id): + """Deletes a client grant. + + Args: + id (str): Id of client grant to delete. + + See: https://auth0.com/docs/api/management/v2#!/Client_Grants/delete_client_grants_by_id + """ + + return self.client.delete(self._url(id))
+ +
[docs] def update(self, id, body): + """Modifies a client grant. + + Args: + id (str): The id of the client grant to modify. + + body (dict): Attributes to update. + + See: https://auth0.com/docs/api/management/v2#!/Client_Grants/patch_client_grants_by_id + """ + + return self.client.patch(self._url(id), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/clients.html b/auth0/v3/html/_modules/v3/management/clients.html new file mode 100644 index 00000000..6634a3c1 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/clients.html @@ -0,0 +1,341 @@ + + + + + + + + + + v3.management.clients — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.clients
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.clients

+from .rest import RestClient
+
+
+
[docs]class Clients(object): + """Auth0 applications endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/clients'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def all(self, fields=None, include_fields=True, page=None, per_page=None, extra_params=None): + """Retrieves a list of all the applications. + + Important: The client_secret and encryption_key attributes can only be + retrieved with the read:client_keys scope. + + Args: + fields (list of str, optional): A list of fields to include or + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise. Defaults to True. + + page (int): The result's page number (zero based). When not set, + the default value is up to the server. + + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + extra_params (dictionary, optional): The extra parameters to add to + the request. The fields, include_fields, page and per_page values + specified as parameters take precedence over the ones defined here. + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients + """ + params = extra_params or {} + params['fields'] = fields and ','.join(fields) or None + params['include_fields'] = str(include_fields).lower() + params['page'] = page + params['per_page'] = per_page + + return self.client.get(self._url(), params=params)
+ +
[docs] def create(self, body): + """Create a new application. + + Args: + body (dict): Attributes for the new application. + + See: https://auth0.com/docs/api/v2#!/Clients/post_clients + """ + + return self.client.post(self._url(), data=body)
+ +
[docs] def get(self, id, fields=None, include_fields=True): + """Retrieves an application by its id. + + Important: The client_secret, encryption_key and signing_keys + attributes can only be retrieved with the read:client_keys scope. + + Args: + id (str): Id of the application to get. + + fields (list of str, optional): A list of fields to include or + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise. Defaults to True. + + See: https://auth0.com/docs/api/management/v2#!/Clients/get_clients_by_id + """ + + params = {'fields': fields and ','.join(fields) or None, + 'include_fields': str(include_fields).lower()} + + return self.client.get(self._url(id), params=params)
+ +
[docs] def delete(self, id): + """Deletes an application and all its related assets. + + Args: + id (str): Id of application to delete. + + See: https://auth0.com/docs/api/management/v2#!/Clients/delete_clients_by_id + """ + + return self.client.delete(self._url(id))
+ +
[docs] def update(self, id, body): + """Modifies an application. + + Important: The client_secret, encryption_key and signing_keys + attributes can only be updated with the update:client_keys scope. + + Args: + id (str): Client ID of the application. + + body (dict): Attributes to modify. + + See: https://auth0.com/docs/api/management/v2#!/Clients/patch_clients_by_id + """ + + return self.client.patch(self._url(id), data=body)
+ +
[docs] def rotate_secret(self, id): + """Rotate a client secret. The generated secret is NOT base64 encoded. + + Args: + id (str): Client ID of the application. + + See: https://auth0.com/docs/api/management/v2#!/Clients/post_rotate_secret + """ + + data = {'id': id} + + url = self._url('%s/rotate-secret' % id) + return self.client.post(url, data=data)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/connections.html b/auth0/v3/html/_modules/v3/management/connections.html new file mode 100644 index 00000000..39217620 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/connections.html @@ -0,0 +1,351 @@ + + + + + + + + + + v3.management.connections — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.connections
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.connections

+from .rest import RestClient
+
+
+
[docs]class Connections(object): + """Auth0 connection endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/connections'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def all(self, strategy=None, fields=None, include_fields=True, page=None, per_page=None, extra_params=None): + """Retrieves all connections. + + Args: + strategy (str, optional): Only retrieve connections of + this strategy type. (e.g: strategy='amazon') + + fields (list of str, optional): A list of fields to include or + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. By default, all the fields will be retrieved. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise. Defaults to True. + + page (int): The result's page number (zero based). When not set, + the default value is up to the server. + + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + extra_params (dictionary, optional): The extra parameters to add to + the request. The fields, include_fields, page and per_page values + specified as parameters take precedence over the ones defined here. + + See: https://auth0.com/docs/api/management/v2#!/Connections/get_connections + + Returns: + A list of connection objects. + """ + + params = extra_params or {} + params['strategy'] = strategy or None + params['fields'] = fields and ','.join(fields) or None + params['include_fields'] = str(include_fields).lower() + params['page'] = page + params['per_page'] = per_page + + return self.client.get(self._url(), params=params)
+ +
[docs] def get(self, id, fields=None, include_fields=True): + """Retrieve connection by id. + + Args: + id (str): Id of the connection to get. + + fields (list of str, optional): A list of fields to include or + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. By default, all the fields will be retrieved. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise. Defaults to True. + + See: https://auth0.com/docs/api/management/v2#!/Connections/get_connections_by_id + + Returns: + A connection object. + """ + + params = {'fields': fields and ','.join(fields) or None, + 'include_fields': str(include_fields).lower()} + + return self.client.get(self._url(id), params=params)
+ +
[docs] def delete(self, id): + """Deletes a connection and all its users. + + Args: + id: Id of the connection to delete. + + See: https://auth0.com/docs/api/management/v2#!/Connections/delete_connections_by_id + + Returns: + An empty dict. + """ + + return self.client.delete(self._url(id))
+ +
[docs] def update(self, id, body): + """Modifies a connection. + + Args: + id: Id of the connection. + + body (dict): Specifies which fields are to be modified, and to what values. + + See: https://auth0.com/docs/api/management/v2#!/Connections/patch_connections_by_id + + Returns: + The modified connection object. + """ + + return self.client.patch(self._url(id), data=body)
+ +
[docs] def create(self, body): + """Creates a new connection. + + Args: + body (dict): Attributes used to create the connection. Mandatory + attributes are: 'name' and 'strategy'. + + See: https://auth0.com/docs/api/management/v2#!/Connections/post_connections + """ + + return self.client.post(self._url(), data=body)
+ +
[docs] def delete_user_by_email(self, id, email): + """Deletes a specified connection user by its email. + + Args: + id (str): The id of the connection (must be a database connection). + + email (str): The email of the user to delete. + + See: https://auth0.com/docs/api/management/v2#!/Connections/delete_users_by_email + + Returns: + An empty dict. + """ + return self.client.delete(self._url(id) + '/users', params={'email': email})
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/custom_domains.html b/auth0/v3/html/_modules/v3/management/custom_domains.html new file mode 100644 index 00000000..d61c8023 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/custom_domains.html @@ -0,0 +1,278 @@ + + + + + + + + + + v3.management.custom_domains — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.custom_domains
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.custom_domains

+from .rest import RestClient
+
+
+
[docs]class CustomDomains(object): + """Auth0 custom domains endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://%s/api/v2/custom-domains' % self.domain + if id is not None: + return url + '/' + id + return url + +
[docs] def all(self): + """Retrieves all custom domains. + + See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/get_custom_domains + """ + return self.client.get(self._url())
+ +
[docs] def get(self, id): + """Retrieves custom domain. + + See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/get_custom_domains_by_id + """ + url = self._url('%s' % (id)) + return self.client.get(url)
+ +
[docs] def delete(self, id): + """Deletes a grant. + + Args: + id (str): The id of the custom domain to delete. + + See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/delete_custom_domains_by_id + """ + url = self._url('%s' % (id)) + return self.client.delete(url)
+ +
[docs] def create_new(self, body): + """Configure a new custom domain. + + Args: + body (str): The domain, tye and verification method in json. + + See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/post_custom_domains + """ + return self.client.post(self._url(), data=body)
+ +
[docs] def verify(self, id): + """Verify a custom domain. + + Args: + id (str): The id of the custom domain to delete. + + See: https://auth0.com/docs/api/management/v2#!/Custom_Domains/post_verify + """ + url = self._url('%s/verify' % (id)) + return self.client.post(url)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/device_credentials.html b/auth0/v3/html/_modules/v3/management/device_credentials.html new file mode 100644 index 00000000..cc795f32 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/device_credentials.html @@ -0,0 +1,281 @@ + + + + + + + + + + v3.management.device_credentials — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.device_credentials
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.device_credentials

+from .rest import RestClient
+
+
+
[docs]class DeviceCredentials(object): + """Auth0 connection endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/device-credentials'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def get(self, user_id, client_id, type, fields=None, include_fields=True): + """List device credentials. + + Args: + user_id (str): The user_id of the devices to retrieve. + + client_id (str): The client_id of the devices to retrieve. + + type (str): The type of credentials (public_key, refresh_token). + + fields (list, optional): A list of fields to include or exclude + (depending on include_fields) from the result. Leave empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise. Defaults to True. + + See: https://auth0.com/docs/api/management/v2#!/Device_Credentials/get_device_credentials + """ + + params = { + 'fields': fields and ','.join(fields) or None, + 'include_fields': str(include_fields).lower(), + 'user_id': user_id, + 'client_id': client_id, + 'type': type, + } + return self.client.get(self._url(), params=params)
+ +
[docs] def create(self, body): + """Create a device public key. + + Args: + body (dict): parameters for creating the public key (e.g: type, + device_name, client_id, etc). + + See: https://auth0.com/docs/api/v2#!/Device_Credentials/post_device_credentials + """ + return self.client.post(self._url(), data=body)
+ +
[docs] def delete(self, id): + """Delete credential. + + Args: + id (str): The id of the credential to delete. + + See: https://auth0.com/docs/api/management/v2#!/Device_Credentials/delete_device_credentials_by_id + """ + return self.client.delete(self._url(id))
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/email_templates.html b/auth0/v3/html/_modules/v3/management/email_templates.html new file mode 100644 index 00000000..7d705451 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/email_templates.html @@ -0,0 +1,272 @@ + + + + + + + + + + v3.management.email_templates — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.email_templates
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.email_templates

+from .rest import RestClient
+
+
+
[docs]class EmailTemplates(object): + """Auth0 email templates endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/email-templates'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def create(self, body): + """Create a new email template. + + Args: + body (dict): Attributes for the new email template. + + See: https://auth0.com/docs/api/management/v2#!/Email_Templates/post_email_templates + """ + + return self.client.post(self._url(), data=body)
+ +
[docs] def get(self, template_name): + """Retrieves an email template by its name. + + Args: + template_name (str): Name of the email template to get. + Must be one of: 'verify_email', 'reset_email', 'welcome_email', + 'blocked_account', 'stolen_credentials', 'enrollment_email', + 'change_password', 'password_reset', 'mfa_oob_code'. + + See: https://auth0.com/docs/api/management/v2#!/Email_Templates/get_email_templates_by_templateName + """ + + return self.client.get(self._url(template_name))
+ +
[docs] def update(self, template_name, body): + """Update an existing email template. + + Args: + template_name (str): Name of the email template to update. + Must be one of: 'verify_email', 'reset_email', 'welcome_email', + 'blocked_account', 'stolen_credentials', 'enrollment_email', + 'change_password', 'password_reset', 'mfa_oob_code'. + + body (dict): Attributes to update on the email template. + + See: https://auth0.com/docs/api/management/v2#!/Email_Templates/patch_email_templates_by_templateName + """ + + return self.client.patch(self._url(template_name), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/emails.html b/auth0/v3/html/_modules/v3/management/emails.html new file mode 100644 index 00000000..9cddfe05 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/emails.html @@ -0,0 +1,276 @@ + + + + + + + + + + v3.management.emails — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.emails
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.emails

+from .rest import RestClient
+
+
+
[docs]class Emails(object): + """Auth0 email endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/emails/provider'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def get(self, fields=None, include_fields=True): + """Get the email provider. + + Args: + fields (list of str, optional): A list of fields to include or + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise. Defaults to True. + + See: https://auth0.com/docs/api/management/v2#!/Emails/get_provider + """ + params = {'fields': fields and ','.join(fields) or None, + 'include_fields': str(include_fields).lower()} + + return self.client.get(self._url(), params=params)
+ +
[docs] def config(self, body): + """Configure the email provider. + + Args: + body (dict): attributes of the created email provider. + + See: https://auth0.com/docs/api/v2#!/Emails/post_provider + """ + return self.client.post(self._url(), data=body)
+ +
[docs] def delete(self): + """Delete the email provider. (USE WITH CAUTION) + + See: https://auth0.com/docs/api/management/v2#!/Emails/delete_provider + """ + return self.client.delete(self._url())
+ +
[docs] def update(self, body): + """Update the email provider. + + Args: + body (dict): attributes to update on the email provider + + See: https://auth0.com/docs/api/v2#!/Emails/patch_provider + """ + return self.client.patch(self._url(), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/grants.html b/auth0/v3/html/_modules/v3/management/grants.html new file mode 100644 index 00000000..5e9d5181 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/grants.html @@ -0,0 +1,270 @@ + + + + + + + + + + v3.management.grants — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.grants
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.grants

+from .rest import RestClient
+
+
+
[docs]class Grants(object): + """Auth0 grants endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://%s/api/v2/grants' % self.domain + if id is not None: + return url + '/' + id + return url + +
[docs] def all(self, page=None, per_page=None, include_totals=False, extra_params=None): + """Retrieves all grants. + + Args: + page (int, optional): The result's page number (zero based). When not set, + the default value is up to the server. + + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to False. + + extra_params (dictionary, optional): The extra parameters to add to + the request. The page, per_page, and include_totals values + specified as parameters take precedence over the ones defined here. + + See: https://auth0.com/docs/api/management/v2#!/Grants/get_grants + """ + params = extra_params or {} + params.update({ + 'page': page, + 'per_page': per_page, + 'include_totals': str(include_totals).lower() + }) + + return self.client.get(self._url(), params=params)
+ +
[docs] def delete(self, id): + """Deletes a grant. + + Args: + id (str): The id of the grant to delete. + + See: https://auth0.com/docs/api/management/v2#!/Grants/delete_grants_by_id + """ + url = self._url('%s' % (id)) + return self.client.delete(url)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/guardian.html b/auth0/v3/html/_modules/v3/management/guardian.html new file mode 100644 index 00000000..2847f457 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/guardian.html @@ -0,0 +1,349 @@ + + + + + + + + + + v3.management.guardian — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.guardian
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.guardian

+from .rest import RestClient
+
+
+
[docs]class Guardian(object): + """Auth0 guardian endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/guardian'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def all_factors(self): + """Retrieves all factors. Useful to check factor enablement and + trial status. + + See: https://auth0.com/docs/api/management/v2#!/Guardian/get_factors + """ + + return self.client.get(self._url('factors'))
+ +
[docs] def update_factor(self, name, body): + """Update Guardian factor. + Useful to enable / disable factor. + + Args: + name (str): Either push-notification or sms. + + body (dict): Attributes to modify. + + See: https://auth0.com/docs/api/management/v2#!/Guardian/put_factors_by_name + """ + url = self._url('factors/{}'.format(name)) + return self.client.put(url, data=body)
+ +
[docs] def update_templates(self, body): + """Update enrollment and verification SMS templates. + + Useful to send custom messages on sms enrollment and verification. + + Args: + body (dict): Attributes to modify. + + See: https://auth0.com/docs/api/management/v2#!/Guardian/put_templates + """ + + return self.client.put(self._url('factors/sms/templates'), data=body)
+ +
[docs] def get_templates(self): + """Get enrollment and verification templates. + + Retrieve both templates. Useful to check if a different template than + default was set. + + See: https://auth0.com/docs/api/management/v2#!/Guardian/get_templates + """ + + return self.client.get(self._url('factors/sms/templates'))
+ +
[docs] def get_enrollment(self, id): + """Retrieves an enrollment. + Useful to check its type and related metadata. + + Args: + id (str): The id of the device account to update. + + See: https://auth0.com/docs/api/management/v2#!/Guardian/get_enrollments_by_id + """ + url = self._url('enrollments/{}'.format(id)) + return self.client.get(url)
+ +
[docs] def delete_enrollment(self, id): + """Deletes an enrollment. + + Useful when you want to force re-enroll. + + Args: + id (str): The id of the device account to update. + + See: https://auth0.com/docs/api/management/v2#!/Guardian/delete_enrollments_by_id + """ + url = self._url('enrollments/{}'.format(id)) + return self.client.delete(url)
+ +
[docs] def create_enrollment_ticket(self, body): + """Creates an enrollment ticket for user_id + + A useful way to send an email to a user, with a link that lead to + start the enrollment process. + + Args: + body (dict): Details of the user to send the ticket to. + + See: https://auth0.com/docs/api/management/v2#!/Guardian/post_ticket + """ + return self.client.post(self._url('enrollments/ticket'), data=body)
+ +
[docs] def get_factor_providers(self, factor_name, name): + """Get Guardian SNS or SMS factor providers. + + Returns provider configuration. + + Args: + factor_name (str): Either push-notification or sms. + + name (str): Name of the provider. + + See: https://auth0.com/docs/api/management/v2#!/Guardian/get_sns + https://auth0.com/docs/api/management/v2#!/Guardian/get_twilio + """ + url = self._url('factors/{}/providers/{}'.format(factor_name, name)) + return self.client.get(url)
+ +
[docs] def update_factor_providers(self, factor_name, name, body): + """Get Guardian factor providers. + + Returns provider configuration. + + Args: + factor_name (str): Either push-notification or sms. + + name (str): Name of the provider. + + body (dict): Details of the factor provider. + + See: https://auth0.com/docs/api/management/v2#!/Guardian/put_twilio + """ + url = self._url('factors/{}/providers/{}'.format(factor_name, name)) + return self.client.put(url, data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/hooks.html b/auth0/v3/html/_modules/v3/management/hooks.html new file mode 100644 index 00000000..3aeb7396 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/hooks.html @@ -0,0 +1,374 @@ + + + + + + + + + + v3.management.hooks — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.hooks
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.hooks

+from .rest import RestClient
+
+
+
[docs]class Hooks(object): + + """Hooks endpoint implementation. + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = "https://{}/api/v2/hooks".format(self.domain) + if id is not None: + return "{}/{}".format(url, id) + return url + +
[docs] def all( + self, + enabled=True, + fields=None, + include_fields=True, + page=None, + per_page=None, + include_totals=False, + ): + """Retrieves a list of all hooks. + + Args: + enabled (bool, optional): If provided, retrieves hooks that match + the value, otherwise all hooks are retrieved. + + fields (list, optional): A list of fields to include or exclude + (depending on include_fields) from the result, empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise + (defaults to true). + + page (int, optional): The result's page number (zero based). + + per_page (int, optional): The amount of entries per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/get_hooks + """ + + params = { + "fields": fields and ",".join(fields) or None, + "include_fields": str(include_fields).lower(), + "page": page, + "per_page": per_page, + "include_totals": str(include_totals).lower(), + } + + # since the default is True, this is here to disable the filter + if enabled is not None: + params["enabled"] = str(enabled).lower() + + return self.client.get(self._url(), params=params)
+ +
[docs] def create(self, body): + """Creates a new Hook. + + Args: + body (dict): Attributes for the newly created hook, + See: https://auth0.com/docs/api/v2#!/Hooks/post_hooks + """ + return self.client.post(self._url(), data=body)
+ +
[docs] def get(self, id, fields=None): + """Retrieves a hook by its ID. + + Args: + id (str): The id of the hook to retrieve. + + fields (list, optional): A list of fields to include or exclude + (depending on include_fields) from the result, empty to + retrieve all fields. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/get_hooks_by_id + """ + params = { + "fields": fields and ",".join(fields) or None, + } + return self.client.get(self._url(id), params=params)
+ +
[docs] def delete(self, id): + """Deletes a hook. + + Args: + id (str): The id of the hook to delete. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/delete_hooks_by_id + """ + return self.client.delete(self._url(id))
+ +
[docs] def update(self, id, body): + """Updates an existing hook. + + Args: + id (str): The id of the hook to modify. + + body (dict): Attributes to modify. + + See: https://auth0.com/docs/api/v2#!/Hooks/patch_hooks_by_id + """ + return self.client.patch(self._url(id), data=body)
+ +
[docs] def get_secrets(self, id): + """Retrieves a hook's secrets. + + Args: + id (str): The id of the hook to retrieve secrets from. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/get_secrets + """ + + return self.client.get(self._url("%s/secrets" % id))
+ +
[docs] def add_secrets(self, id, body): + """Add one or more secrets for an existing hook. + + Args: + id (str): The id of the hook to add secrets to. + + body (dict): Dict of key-value pairs where the value must be a string. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/post_secrets + """ + return self.client.post(self._url("%s/secrets" % id), data=body)
+ +
[docs] def delete_secrets(self, id, body): + """Delete one or more existing secrets for an existing hook. + + Args: + id (str): The id of the hook to add secrets to. + + body (list): List of secret names to delete. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/delete_secrets + """ + return self.client.delete(self._url("%s/secrets" % id), data=body)
+ +
[docs] def update_secrets(self, id, body): + """Update one or more existing secrets for an existing hook. + + Args: + id (str): The id of the hook to add secrets to. + + body (dict): Dict of key-value pairs where the value must be a string. + + See: https://auth0.com/docs/api/management/v2#!/Hooks/patch_secrets + """ + return self.client.patch(self._url("%s/secrets" % id), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/jobs.html b/auth0/v3/html/_modules/v3/management/jobs.html new file mode 100644 index 00000000..c53196e5 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/jobs.html @@ -0,0 +1,319 @@ + + + + + + + + + + v3.management.jobs — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.jobs
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.jobs

+from .rest import RestClient
+
+
+
[docs]class Jobs(object): + """Auth0 jobs endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, path=None): + url = 'https://{}/api/v2/jobs'.format(self.domain) + if path is not None: + return '{}/{}'.format(url, path) + return url + +
[docs] def get(self, id): + """Retrieves a job. Useful to check its status. + + Args: + id (str): The id of the job. + + See: https://auth0.com/docs/api/management/v2#!/Jobs/get_jobs_by_id + """ + return self.client.get(self._url(id))
+ +
[docs] def get_failed_job(self, id): + """Get failed job error details. + + Args: + id (str): The id of the job. + + See: https://auth0.com/docs/api/management/v2#!/Jobs/get_errors + """ + url = self._url('{}/errors'.format(id)) + return self.client.get(url)
+ +
[docs] def get_results(self, job_id): + """Get results of a job + + Args: + job_id (str): The id of the job. + + See: https://auth0.com/docs/api/management/v2#!/Jobs/get_results + """ + url = self._url('%s/results' % job_id) + return self.client.get(url)
+ +
[docs] def export_users(self, body): + """Export all users to a file using a long running job. + + Check job status with get(). URL pointing to the export file will be + included in the status once the job is complete. + + Args: + body (dict): The details of the export users request. + + See: https://auth0.com/docs/api/management/v2#!/Jobs/post_users_exports + """ + return self.client.post(self._url('users-exports'), data=body)
+ +
[docs] def import_users(self, connection_id, file_obj, upsert=False, send_completion_email=True, external_id=None): + """Imports users to a connection from a file. + + Args: + connection_id (str): The connection id of the connection to which + users will be inserted. + + file_obj (file): A file-like object to upload. The format for + this file is explained in: https://auth0.com/docs/bulk-import. + + upsert (bool, optional): When set to False, pre-existing users that match on email address, user ID, or username + will fail. When set to True, pre-existing users that match on any of these fields will be updated, but + only with upsertable attributes. Defaults to False. + For a list of user profile fields that can be upserted during import, see the following article + https://auth0.com/docs/users/references/user-profile-structure#user-profile-attributes. + + send_completion_email (bool, optional): When set to True, an email will be sent to notify the completion of this job. + When set to False, no email will be sent. Defaults to True. + + external_id (str, optional): Customer-defined ID. + + See: https://auth0.com/docs/api/management/v2#!/Jobs/post_users_imports + """ + return self.client.file_post(self._url('users-imports'), + data={'connection_id': connection_id, + 'upsert': str(upsert).lower(), + 'send_completion_email': str(send_completion_email).lower(), + 'external_id': external_id}, + files={'users': file_obj})
+ +
[docs] def send_verification_email(self, body): + """Send verification email. + + Send an email to the specified user that asks them to click a link to + verify their email address. + + Args: + body (dict): Details of verification email request. + + See: https://auth0.com/docs/api/v2#!/Jobs/post_verification_email + """ + return self.client.post(self._url('verification-email'), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/log_streams.html b/auth0/v3/html/_modules/v3/management/log_streams.html new file mode 100644 index 00000000..c6465125 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/log_streams.html @@ -0,0 +1,283 @@ + + + + + + + + + + v3.management.log_streams — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.log_streams
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.log_streams

+from .rest import RestClient
+
+
+
[docs]class LogStreams(object): + """Auth0 log streams endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/log-streams'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def list(self): + """Search log events. + + Args: + See: https://auth0.com/docs/api/management/v2/#!/Log_Streams/get_log_streams + """ + + return self.client.get(self._url())
+ +
[docs] def get(self, id): + """Retrieves the data related to the log stream entry identified by id. + + Args: + id (str): The id of the log stream to retrieve. + + See: https://auth0.com/docs/api/management/v2/#!/Log_Streams/get_log_streams_by_id + """ + + return self.client.get(self._url(id))
+ +
[docs] def create(self, body): + """Creates a new log stream. + + Args: + body (dict): the attributes for the role to create. + + See: https://auth0.com/docs/api/management/v2/#!/Log_Streams/post_log_streams + """ + return self.client.post(self._url(), data=body)
+ +
[docs] def delete(self, id): + """Delete a log stream. + + Args: + id (str): The id of the log ste to delete. + + See: https://auth0.com/docs/api/management/v2/#!/Log_Streams/delete_log_streams_by_id + """ + return self.client.delete(self._url(id))
+ +
[docs] def update(self, id, body): + """Update a log stream with the attributes passed in 'body' + + Args: + id (str): The id of the log stream to update. + + body (dict): the attributes to update on the log stream. + + See: https://auth0.com/docs/api/management/v2/#!/Log_Streams/patch_log_streams_by_id + """ + return self.client.patch(self._url(id), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/logs.html b/auth0/v3/html/_modules/v3/management/logs.html new file mode 100644 index 00000000..d9b48380 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/logs.html @@ -0,0 +1,291 @@ + + + + + + + + + + v3.management.logs — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.logs
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.logs

+from .rest import RestClient
+
+
+
[docs]class Logs(object): + """Auth0 logs endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/logs'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def search(self, page=0, per_page=50, sort=None, q=None, + include_totals=True, fields=None, from_param=None, take=None, + include_fields=True): + """Search log events. + + Args: + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 50 results per page. + + sort (str, optional): The field to use for sorting. + 1 == ascending and -1 == descending. (e.g: date:1) + When not set, the default value is up to the server. + + q (str, optional): Query in Lucene query string syntax. + + fields (list of str, optional): A list of fields to include or + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise. Defaults to True. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to True. + + from_param (str, optional): Log Event Id to start retrieving logs. You can + limit the amount of logs using the take parameter. + + take (int, optional): The total amount of entries to retrieve when + using the from parameter. When not set, the default value is up to the server. + + See: https://auth0.com/docs/api/management/v2#!/Logs/get_logs + """ + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower(), + 'sort': sort, + 'fields': fields and ','.join(fields) or None, + 'include_fields': str(include_fields).lower(), + 'q': q, + 'from': from_param, + 'take': take + } + return self.client.get(self._url(), params=params)
+ +
[docs] def get(self, id): + """Retrieves the data related to the log entry identified by id. + + Args: + id (str): The log_id of the log to retrieve. + + See: https://auth0.com/docs/api/management/v2#!/Logs/get_logs_by_id + """ + + return self.client.get(self._url(id))
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/resource_servers.html b/auth0/v3/html/_modules/v3/management/resource_servers.html new file mode 100644 index 00000000..8cf1bcfb --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/resource_servers.html @@ -0,0 +1,304 @@ + + + + + + + + + + v3.management.resource_servers — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.resource_servers
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.resource_servers

+from .rest import RestClient
+
+
+
[docs]class ResourceServers(object): + """Auth0 resource servers endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/resource-servers'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def create(self, body): + """Create a new resource server. + + Args: + body (dict): Attributes for the new resource Server. + + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/post_resource_servers + """ + + return self.client.post(self._url(), data=body)
+ +
[docs] def get_all(self, page=None, per_page=None, include_totals=False): + """Retrieves all resource servers + + Args: + page (int, optional): The result's page number (zero based). When not set, + the default value is up to the server. + + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to False. + + + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/get_resource_servers + """ + + params = { + 'page': page, + 'per_page': per_page, + 'include_totals': str(include_totals).lower() + } + + return self.client.get(self._url(), params=params)
+ +
[docs] def get(self, id): + """Retrieves a resource server by its id. + + Args: + id (str): id of the resource server to get. + + + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/get_resource_servers_by_id + """ + + return self.client.get(self._url(id))
+ +
[docs] def delete(self, id): + """Deletes a resource server. + + Args: + id (str): Id of resource server to delete. + + + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/delete_resource_servers_by_id + """ + + return self.client.delete(self._url(id))
+ +
[docs] def update(self, id, body): + """Modifies a resource server. + + Args: + id (str): The id of the resource server to update. + + body (dict): Attributes to modify. + + See: https://auth0.com/docs/api/management/v2#!/Resource_Servers/patch_resource_servers_by_id + """ + + return self.client.patch(self._url(id), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/rest.html b/auth0/v3/html/_modules/v3/management/rest.html new file mode 100644 index 00000000..d9979d32 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/rest.html @@ -0,0 +1,371 @@ + + + + + + + + + + v3.management.rest — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.rest
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.rest

+import base64
+import json
+import platform
+import sys
+
+import requests
+
+from ..exceptions import Auth0Error, RateLimitError
+
+UNKNOWN_ERROR = 'a0.sdk.internal.unknown'
+
+
+
[docs]class RestClient(object): + """Provides simple methods for handling all RESTful api endpoints. + + Args: + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, jwt, telemetry=True, timeout=5.0): + self.jwt = jwt + self.timeout = timeout + + self.base_headers = { + 'Authorization': 'Bearer {}'.format(self.jwt), + 'Content-Type': 'application/json', + } + if telemetry: + py_version = platform.python_version() + version = sys.modules['auth0'].__version__ + + auth0_client = json.dumps({ + 'name': 'auth0-python', + 'version': version, + 'env': { + 'python': py_version, + } + }).encode('utf-8') + + self.base_headers.update({ + 'User-Agent': 'Python/{}'.format(py_version), + 'Auth0-Client': base64.b64encode(auth0_client), + }) + +
[docs] def get(self, url, params=None): + headers = self.base_headers.copy() + + response = requests.get(url, params=params, headers=headers, timeout=self.timeout) + return self._process_response(response)
+ +
[docs] def post(self, url, data=None): + headers = self.base_headers.copy() + + response = requests.post(url, json=data, headers=headers, timeout=self.timeout) + return self._process_response(response)
+ +
[docs] def file_post(self, url, data=None, files=None): + headers = self.base_headers.copy() + headers.pop('Content-Type', None) + + response = requests.post(url, data=data, files=files, headers=headers, timeout=self.timeout) + return self._process_response(response)
+ +
[docs] def patch(self, url, data=None): + headers = self.base_headers.copy() + + response = requests.patch(url, json=data, headers=headers, timeout=self.timeout) + return self._process_response(response)
+ +
[docs] def put(self, url, data=None): + headers = self.base_headers.copy() + + response = requests.put(url, json=data, headers=headers, timeout=self.timeout) + return self._process_response(response)
+ +
[docs] def delete(self, url, params=None, data=None): + headers = self.base_headers.copy() + + response = requests.delete(url, headers=headers, params=params or {}, json=data, timeout=self.timeout) + return self._process_response(response)
+ + def _process_response(self, response): + return self._parse(response).content() + + def _parse(self, response): + if not response.text: + return EmptyResponse(response.status_code) + try: + return JsonResponse(response) + except ValueError: + return PlainResponse(response)
+ + +
[docs]class Response(object): + def __init__(self, status_code, content, headers): + self._status_code = status_code + self._content = content + self._headers = headers + +
[docs] def content(self): + if self._is_error(): + if self._status_code == 429: + reset_at = int(self._headers.get('x-ratelimit-reset', '-1')) + raise RateLimitError(error_code=self._error_code(), + message=self._error_message(), + reset_at=reset_at) + + raise Auth0Error(status_code=self._status_code, + error_code=self._error_code(), + message=self._error_message()) + else: + return self._content
+ + def _is_error(self): + return self._status_code is None or self._status_code >= 400 + + # Adding these methods to force implementation in subclasses because they are references in this parent class + def _error_code(self): + raise NotImplementedError + + def _error_message(self): + raise NotImplementedError
+ + +
[docs]class JsonResponse(Response): + def __init__(self, response): + content = json.loads(response.text) + super(JsonResponse, self).__init__(response.status_code, content, response.headers) + + def _error_code(self): + if 'errorCode' in self._content: + return self._content.get('errorCode') + elif 'error' in self._content: + return self._content.get('error') + else: + return UNKNOWN_ERROR + + def _error_message(self): + message = self._content.get('message', '') + if message is not None and message != '': + return message + return self._content.get('error', '')
+ + +
[docs]class PlainResponse(Response): + def __init__(self, response): + super(PlainResponse, self).__init__(response.status_code, response.text, response.headers) + + def _error_code(self): + return UNKNOWN_ERROR + + def _error_message(self): + return self._content
+ + +
[docs]class EmptyResponse(Response): + def __init__(self, status_code): + super(EmptyResponse, self).__init__(status_code, '', {}) + + def _error_code(self): + return UNKNOWN_ERROR + + def _error_message(self): + return ''
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/roles.html b/auth0/v3/html/_modules/v3/management/roles.html new file mode 100644 index 00000000..6c05e577 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/roles.html @@ -0,0 +1,393 @@ + + + + + + + + + + v3.management.roles — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.roles
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.roles

+from .rest import RestClient
+
+
+
[docs]class Roles(object): + """Auth0 roles endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/roles'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def list(self, page=0, per_page=25, include_totals=True, name_filter=None): + """List or search roles. + + Args: + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to True. + + name_filter (str, optional): A case-insensitive filter to apply + to search for roles by name. + + See: https://auth0.com/docs/api/management/v2#!/Roles/get_roles + """ + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower(), + 'name_filter': name_filter + } + return self.client.get(self._url(), params=params)
+ +
[docs] def create(self, body): + """Creates a new role. + + Args: + body (dict): the attributes for the role to create. + + See: https://auth0.com/docs/api/v2#!/Roles/post_roles + """ + return self.client.post(self._url(), data=body)
+ +
[docs] def get(self, id): + """Get a role. + + Args: + id (str): The id of the role to retrieve. + + See: https://auth0.com/docs/api/management/v2#!/Roles/get_roles_by_id + """ + + return self.client.get(self._url(id))
+ +
[docs] def delete(self, id): + """Delete a role. + + Args: + id (str): The id of the role to delete. + + See: https://auth0.com/docs/api/management/v2#!/Roles/delete_roles_by_id + """ + return self.client.delete(self._url(id))
+ +
[docs] def update(self, id, body): + """Update a role with the attributes passed in 'body' + + Args: + id (str): The id of the role to update. + + body (dict): the attributes to update on the role. + + See: https://auth0.com/docs/api/management/v2#!/Roles/patch_roles_by_id + """ + return self.client.patch(self._url(id), data=body)
+ +
[docs] def list_users(self, id, page=0, per_page=25, include_totals=True): + """List the users that have been associated with a given role. + + Args: + id (str): The role's id. + + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to True. + + See https://auth0.com/docs/api/management/v2#!/Roles/get_role_user + """ + + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower() + } + url = self._url('{}/users'.format(id)) + return self.client.get(url, params=params)
+ +
[docs] def add_users(self, id, users): + """Assign users to a role. + + Args: + id (str): The role's id. + + users (list of str): A list of users ids to add to this role. + + See https://auth0.com/docs/api/management/v2#!/Roles/post_role_users + """ + url = self._url('{}/users'.format(id)) + body = {'users': users} + return self.client.post(url, data=body)
+ +
[docs] def list_permissions(self, id, page=0, per_page=25, include_totals=True): + """List the permissions associated to a role. + + Args: + id (str): The role's id. + + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to True. + + See https://auth0.com/docs/api/management/v2#!/Roles/get_role_permission + """ + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower() + } + url = self._url('{}/permissions'.format(id)) + return self.client.get(url, params=params)
+ +
[docs] def remove_permissions(self, id, permissions): + """Unassociates permissions from a role. + + Args: + id (str): The role's id. + + permissions (list of str): A list of permission ids to unassociate from the role. + + See https://auth0.com/docs/api/management/v2#!/Roles/delete_role_permission_assignment + """ + url = self._url('{}/permissions'.format(id)) + body = {'permissions': permissions} + return self.client.delete(url, data=body)
+ +
[docs] def add_permissions(self, id, permissions): + """Associates permissions with a role. + + Args: + id (str): The role's id. + + permissions (list of str): A list of permission ids to associate to the role. + + See https://auth0.com/docs/api/management/v2#!/Roles/post_role_permission_assignment + """ + url = self._url('{}/permissions'.format(id)) + body = {'permissions': permissions} + return self.client.post(url, data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/rules.html b/auth0/v3/html/_modules/v3/management/rules.html new file mode 100644 index 00000000..e1ddc82d --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/rules.html @@ -0,0 +1,327 @@ + + + + + + + + + + v3.management.rules — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.rules
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.rules

+from .rest import RestClient
+
+
+
[docs]class Rules(object): + """Rules endpoint implementation. + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/rules'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def all(self, stage='login_success', enabled=True, fields=None, + include_fields=True, page=None, per_page=None, include_totals=False): + """Retrieves a list of all rules. + + Args: + stage (str, optional): Retrieves rules that match the execution stage. + Defaults to login_success. + + enabled (bool, optional): If provided, retrieves rules that match + the value, otherwise all rules are retrieved. + + fields (list, optional): A list of fields to include or exclude + (depending on include_fields) from the result. Leave empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise. Defaults to True. + + page (int, optional): The result's page number (zero based). When not set, + the default value is up to the server. + + per_page (int, optional): The amount of entries per page. When not set, + the default value is up to the server. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to False. + + See: https://auth0.com/docs/api/management/v2#!/Rules/get_rules + """ + + params = { + 'stage': stage, + 'fields': fields and ','.join(fields) or None, + 'include_fields': str(include_fields).lower(), + 'page': page, + 'per_page': per_page, + 'include_totals': str(include_totals).lower() + } + + # since the default is True, this is here to disable the filter + if enabled is not None: + params['enabled'] = str(enabled).lower() + + return self.client.get(self._url(), params=params)
+ +
[docs] def create(self, body): + """Creates a new rule. + + Args: + body (dict): Attributes for the newly created rule. + + See: https://auth0.com/docs/api/v2#!/Rules/post_rules + """ + return self.client.post(self._url(), data=body)
+ +
[docs] def get(self, id, fields=None, include_fields=True): + """Retrieves a rule by its ID. + + Args: + id (str): The id of the rule to retrieve. + + fields (list, optional): A list of fields to include or exclude + (depending on include_fields) from the result. Leave empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise. Defaults to True. + + See: https://auth0.com/docs/api/management/v2#!/Rules/get_rules_by_id + """ + params = {'fields': fields and ','.join(fields) or None, + 'include_fields': str(include_fields).lower()} + return self.client.get(self._url(id), params=params)
+ +
[docs] def delete(self, id): + """Delete a rule. + + Args: + id (str): The id of the rule to delete. + + See: https://auth0.com/docs/api/management/v2#!/Rules/delete_rules_by_id + """ + return self.client.delete(self._url(id))
+ +
[docs] def update(self, id, body): + """Update an existing rule + + Args: + id (str): The id of the rule to modify. + + body (dict): Attributes to modify. + + See: https://auth0.com/docs/api/v2#!/Rules/patch_rules_by_id + """ + return self.client.patch(self._url(id), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/rules_configs.html b/auth0/v3/html/_modules/v3/management/rules_configs.html new file mode 100644 index 00000000..dfe1385a --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/rules_configs.html @@ -0,0 +1,262 @@ + + + + + + + + + + v3.management.rules_configs — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.rules_configs
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.rules_configs

+from .rest import RestClient
+
+
+
[docs]class RulesConfigs(object): + """RulesConfig endpoint implementation. + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://%s/api/v2/rules-configs' % self.domain + if id is not None: + return url + '/' + id + return url + +
[docs] def all(self): + """Lists the config variable keys for rules. + + See: https://auth0.com/docs/api/management/v2#!/Rules_Configs/get_rules_configs + """ + return self.client.get(self._url())
+ +
[docs] def unset(self, key): + """Removes the rules config for a given key. + + Args: + key (str): rules config key to remove. + + See: https://auth0.com/docs/api/management/v2#!/Rules_Configs/delete_rules_configs_by_key + """ + return self.client.delete(self._url(key))
+ +
[docs] def set(self, key, value): + """Sets the rules config for a given key. + + Args: + key (str): rules config key to set. + + value (str): value to set for the rules config key. + + See: https://auth0.com/docs/api/management/v2#!/Rules_Configs/put_rules_configs_by_key + """ + url = self._url('{}'.format(key)) + body = {'value': value} + return self.client.put(url, data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/stats.html b/auth0/v3/html/_modules/v3/management/stats.html new file mode 100644 index 00000000..f868f7b5 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/stats.html @@ -0,0 +1,254 @@ + + + + + + + + + + v3.management.stats — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.stats
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.stats

+from .rest import RestClient
+
+
+
[docs]class Stats(object): + """Auth0 stats endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, action): + return 'https://{}/api/v2/stats/{}'.format(self.domain, action) + +
[docs] def active_users(self): + """Gets the active users count (logged in during the last 30 days). + + Returns: An integer. + + See: https://auth0.com/docs/api/management/v2#!/Stats/get_active_users + """ + + return self.client.get(self._url('active-users'))
+ +
[docs] def daily_stats(self, from_date=None, to_date=None): + """Gets the daily stats for a particular period. + + Args: + from_date (str, optional): The first day of the period (inclusive) in + YYYYMMDD format. + + to_date (str, optional): The last day of the period (inclusive) in + YYYYMMDD format. + + See: https://auth0.com/docs/api/management/v2#!/Stats/get_daily + """ + + return self.client.get(self._url('daily'), params={'from': from_date, + 'to': to_date})
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/tenants.html b/auth0/v3/html/_modules/v3/management/tenants.html new file mode 100644 index 00000000..bdc0cb83 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/tenants.html @@ -0,0 +1,257 @@ + + + + + + + + + + v3.management.tenants — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.tenants
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.tenants

+from .rest import RestClient
+
+
+
[docs]class Tenants(object): + """Auth0 tenants endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self): + return 'https://{}/api/v2/tenants/settings'.format(self.domain) + +
[docs] def get(self, fields=None, include_fields=True): + """Get tenant settings. + + Args: + fields (list of str, optional): A list of fields to include or + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise. Defaults to True. + + See: https://auth0.com/docs/api/management/v2#!/Tenants/get_settings + """ + + params = {'fields': fields and ','.join(fields) or None, + 'include_fields': str(include_fields).lower()} + + return self.client.get(self._url(), params=params)
+ +
[docs] def update(self, body): + """Update tenant settings. + + Args: + body (dict): the attributes to update in the tenant. + + See: https://auth0.com/docs/api/v2#!/Tenants/patch_settings + """ + return self.client.patch(self._url(), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/tickets.html b/auth0/v3/html/_modules/v3/management/tickets.html new file mode 100644 index 00000000..fe3bfc1b --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/tickets.html @@ -0,0 +1,248 @@ + + + + + + + + + + v3.management.tickets — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.tickets
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.tickets

+from .rest import RestClient
+
+
+
[docs]class Tickets(object): + """Auth0 tickets endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, action): + return 'https://{}/api/v2/tickets/{}'.format(self.domain, action) + +
[docs] def create_email_verification(self, body): + """Create an email verification ticket. + + Args: + body (dict): attributes to set on the email verification request. + + See: https://auth0.com/docs/api/v2#!/Tickets/post_email_verification + """ + return self.client.post(self._url('email-verification'), data=body)
+ +
[docs] def create_pswd_change(self, body): + """Create password change ticket. + + Args: + body (dict): attributes to set on the password change request. + + See: https://auth0.com/docs/api/v2#!/Tickets/post_password_change + """ + return self.client.post(self._url('password-change'), data=body)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/user_blocks.html b/auth0/v3/html/_modules/v3/management/user_blocks.html new file mode 100644 index 00000000..e3581cb4 --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/user_blocks.html @@ -0,0 +1,279 @@ + + + + + + + + + + v3.management.user_blocks — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.user_blocks
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.user_blocks

+from .rest import RestClient
+
+
+
[docs]class UserBlocks(object): + """Auth0 user blocks endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/user-blocks'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def get_by_identifier(self, identifier): + """Gets blocks by identifier + + Args: + identifier (str): Should be any of: username, phone_number, email. + + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/get_user_blocks + """ + + params = {'identifier': identifier} + + return self.client.get(self._url(), params=params)
+ +
[docs] def unblock_by_identifier(self, identifier): + """Unblocks by identifier + + Args: + identifier (str): Should be any of: username, phone_number, email. + + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/delete_user_blocks + """ + + params = {'identifier': identifier} + + return self.client.delete(self._url(), params=params)
+ +
[docs] def get(self, id): + """Get a user's blocks + + Args: + id (str): The user_id of the user to retrieve. + + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/get_user_blocks_by_id + """ + + return self.client.get(self._url(id))
+ +
[docs] def unblock(self, id): + """Unblock a user + + Args: + id (str): The user_id of the user to update. + + See: https://auth0.com/docs/api/management/v2#!/User_Blocks/delete_user_blocks_by_id + """ + + return self.client.delete(self._url(id))
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/users.html b/auth0/v3/html/_modules/v3/management/users.html new file mode 100644 index 00000000..00d7bf4b --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/users.html @@ -0,0 +1,569 @@ + + + + + + + + + + v3.management.users — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.users
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.users

+import warnings
+
+from .rest import RestClient
+
+
+
[docs]class Users(object): + """Auth0 users endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self, id=None): + url = 'https://{}/api/v2/users'.format(self.domain) + if id is not None: + return '{}/{}'.format(url, id) + return url + +
[docs] def list(self, page=0, per_page=25, sort=None, connection=None, q=None, + search_engine=None, include_totals=True, fields=None, + include_fields=True): + """List or search users. + + Args: + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. + + sort (str, optional): The field to use for sorting. + 1 == ascending and -1 == descending. (e.g: email:1) + When not set, the default value is up to the server. + + connection (str, optional): Connection filter. + + q (str, optional): Query in Lucene query string syntax. Only fields + in app_metadata, user_metadata or the normalized user profile + are searchable. + + search_engine (str, optional): The version of the search_engine to use + when querying for users. Will default to the latest version available. + See: https://auth0.com/docs/users/search. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to True. + + fields (list of str, optional): A list of fields to include or + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be include in the result, False otherwise. Defaults to True. + + See: https://auth0.com/docs/api/management/v2#!/Users/get_users + """ + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower(), + 'sort': sort, + 'connection': connection, + 'fields': fields and ','.join(fields) or None, + 'include_fields': str(include_fields).lower(), + 'q': q, + 'search_engine': search_engine + } + return self.client.get(self._url(), params=params)
+ +
[docs] def create(self, body): + """Creates a new user. + + Args: + body (dict): the attributes to set on the user to create. + + See: https://auth0.com/docs/api/v2#!/Users/post_users + """ + return self.client.post(self._url(), data=body)
+ +
[docs] def delete_all_users(self): + """Deletes all users (USE WITH CAUTION). + Deprecation: This endpoint is no longer available server-side. + + Args: + """ + warnings.warn("DELETE all users endpoint is no longer available.", DeprecationWarning) + return self.client.delete(self._url())
+ +
[docs] def get(self, id, fields=None, include_fields=True): + """Get a user. + + Args: + id (str): The user_id of the user to retrieve. + + fields (list of str, optional): A list of fields to include or + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be included in the result, False otherwise. Defaults to True. + + See: https://auth0.com/docs/api/management/v2#!/Users/get_users_by_id + """ + params = { + 'fields': fields and ','.join(fields) or None, + 'include_fields': str(include_fields).lower() + } + + return self.client.get(self._url(id), params=params)
+ +
[docs] def delete(self, id): + """Delete a user. + + Args: + id (str): The user_id of the user to delete. + + See: https://auth0.com/docs/api/management/v2#!/Users/delete_users_by_id + """ + return self.client.delete(self._url(id))
+ +
[docs] def update(self, id, body): + """Update a user with the attributes passed in 'body' + + Args: + id (str): The user_id of the user to update. + + body (dict): The attributes of the user to update. + + See: https://auth0.com/docs/api/v2#!/Users/patch_users_by_id + """ + return self.client.patch(self._url(id), data=body)
+ +
[docs] def list_roles(self, id, page=0, per_page=25, include_totals=True): + """List the roles associated with a user. + + Args: + id (str): The user's id. + + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to True. + + See https://auth0.com/docs/api/management/v2#!/Users/get_user_roles + """ + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower() + } + + url = self._url('{}/roles'.format(id)) + return self.client.get(url, params=params)
+ +
[docs] def remove_roles(self, id, roles): + """Removes an array of roles from a user. + + Args: + id (str): The user's id. + + roles (list of str): A list of roles ids to unassociate from the user. + + See https://auth0.com/docs/api/management/v2#!/Users/delete_user_roles + """ + url = self._url('{}/roles'.format(id)) + body = {'roles': roles} + return self.client.delete(url, data=body)
+ +
[docs] def add_roles(self, id, roles): + """Associate an array of roles with a user. + + Args: + id (str): The user's id. + + roles (list of str): A list of roles ids to associated with the user. + + See https://auth0.com/docs/api/management/v2#!/Users/post_user_roles + """ + url = self._url('{}/roles'.format(id)) + body = {'roles': roles} + return self.client.post(url, data=body)
+ +
[docs] def list_permissions(self, id, page=0, per_page=25, include_totals=True): + """List the permissions associated to the user. + + Args: + id (str): The user's id. + + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 25 results per page. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to True. + + See https://auth0.com/docs/api/management/v2#!/Users/get_permissions + """ + + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower() + } + url = self._url('{}/permissions'.format(id)) + return self.client.get(url, params=params)
+ +
[docs] def remove_permissions(self, id, permissions): + """Removes permissions from a user. + + Args: + id (str): The user's id. + + permissions (list of str): A list of permission ids to unassociate from the user. + + See https://auth0.com/docs/api/management/v2#!/Users/delete_permissions + """ + url = self._url('{}/permissions'.format(id)) + body = {'permissions': permissions} + return self.client.delete(url, data=body)
+ +
[docs] def add_permissions(self, id, permissions): + """Assign permissions to a user. + + Args: + id (str): The user's id. + + permissions (list of str): A list of permission ids to associated with the user. + + See https://auth0.com/docs/api/management/v2#!/Users/post_permissions + """ + url = self._url('{}/permissions'.format(id)) + body = {'permissions': permissions} + return self.client.post(url, data=body)
+ +
[docs] def delete_multifactor(self, id, provider): + """Delete a user's multifactor provider. + + Args: + id (str): The user's id. + + provider (str): The multifactor provider. Supported values 'duo' + or 'google-authenticator'. + + See: https://auth0.com/docs/api/management/v2#!/Users/delete_multifactor_by_provider + """ + url = self._url('{}/multifactor/{}'.format(id, provider)) + return self.client.delete(url)
+ + + + + +
[docs] def regenerate_recovery_code(self, user_id): + """Removes the current recovery token, generates and returns a new one + + Args: + user_id (str): The user_id of the user identity. + + See: https://auth0.com/docs/api/management/v2#!/Users/post_recovery_code_regeneration + """ + url = self._url('{}/recovery-code-regeneration'.format(user_id)) + return self.client.post(url)
+ +
[docs] def get_guardian_enrollments(self, user_id): + """Retrieves all Guardian enrollments. + + Args: + user_id (str): The user_id of the user to retrieve. + + See: https://auth0.com/docs/api/management/v2#!/Users/get_enrollments + """ + url = self._url('{}/enrollments'.format(user_id)) + return self.client.get(url)
+ +
[docs] def get_log_events(self, user_id, page=0, per_page=50, sort=None, + include_totals=False): + """Retrieve every log event for a specific user id. + + Args: + user_id (str): The user_id of the logs to retrieve. + + page (int, optional): The result's page number (zero based). By default, + retrieves the first page of results. + + per_page (int, optional): The amount of entries per page. By default, + retrieves 50 results per page. + + sort (str, optional): The field to use for sorting. Use field:order + where order is 1 for ascending and -1 for descending. + For example date:-1 + When not set, the default value is up to the server. + + include_totals (bool, optional): True if the query summary is + to be included in the result, False otherwise. Defaults to False. + + See: https://auth0.com/docs/api/management/v2#!/Users/get_logs_by_user + """ + + params = { + 'per_page': per_page, + 'page': page, + 'include_totals': str(include_totals).lower(), + 'sort': sort + } + + url = self._url('{}/logs'.format(user_id)) + return self.client.get(url, params=params)
+ +
[docs] def invalidate_remembered_browsers(self, user_id): + """Invalidate all remembered browsers across all authentication factors for a user. + + Args: + user_id (str): The user_id to invalidate remembered browsers for. + + See: https://auth0.com/docs/api/management/v2#!/Users/post_invalidate_remember_browser + """ + + url = self._url('{}/multifactor/actions/invalidate-remember-browser'.format(user_id)) + return self.client.post(url)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_modules/v3/management/users_by_email.html b/auth0/v3/html/_modules/v3/management/users_by_email.html new file mode 100644 index 00000000..b905c0eb --- /dev/null +++ b/auth0/v3/html/_modules/v3/management/users_by_email.html @@ -0,0 +1,252 @@ + + + + + + + + + + v3.management.users_by_email — auth0-python 3.13.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • »
  • + +
  • Module code »
  • + +
  • v3.management.users_by_email
  • + + +
  • + +
  • + +
+ + +
+
+
+
+ +

Source code for v3.management.users_by_email

+from .rest import RestClient
+
+
+
[docs]class UsersByEmail(object): + """Auth0 users by email endpoints + + Args: + domain (str): Your Auth0 domain, e.g: 'username.auth0.com' + + token (str): Management API v2 Token + + telemetry (bool, optional): Enable or disable Telemetry + (defaults to True) + + timeout (float or tuple, optional): Change the requests + connect and read timeout. Pass a tuple to specify + both values separately or a float to set both to it. + (defaults to 5.0 for both) + """ + + def __init__(self, domain, token, telemetry=True, timeout=5.0): + self.domain = domain + self.client = RestClient(jwt=token, telemetry=telemetry, timeout=timeout) + + def _url(self): + url = 'https://{}/api/v2/users-by-email'.format(self.domain) + return url + +
[docs] def search_users_by_email(self, email, fields=None, include_fields=True): + """List or search users. + + Args: + + email: Email to search. + + fields (list of str, optional): A list of fields to include or + exclude from the result (depending on include_fields). Leave empty to + retrieve all fields. + + include_fields (bool, optional): True if the fields specified are + to be include in the result, False otherwise. + + See: https://auth0.com/docs/api/management/v2#!/Users_By_Email/get_users_by_email + """ + params = { + 'email': email, + 'fields': fields and ','.join(fields) or None, + 'include_fields': str(include_fields).lower() + } + return self.client.get(self._url(), params=params)
+
+ +
+ +
+
+ +
+ +
+

+ © Copyright 2021, Auth0. + +

+
+ + + + Built with Sphinx using a + + theme + + provided by Read the Docs. + +
+
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/auth0/v3/html/_sources/index.rst.txt b/auth0/v3/html/_sources/index.rst.txt new file mode 100644 index 00000000..05ae8f57 --- /dev/null +++ b/auth0/v3/html/_sources/index.rst.txt @@ -0,0 +1,25 @@ +.. auth0-python documentation master file, created by + sphinx-quickstart on Fri Feb 26 17:06:48 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to auth0-python's documentation! +======================================== + +.. toctree:: + :maxdepth: 3 + :caption: Contents: + + readme_content + modules + v3 + v3.authentication + v3.management + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/auth0/v3/html/_sources/modules.rst.txt b/auth0/v3/html/_sources/modules.rst.txt new file mode 100644 index 00000000..c897f8a4 --- /dev/null +++ b/auth0/v3/html/_sources/modules.rst.txt @@ -0,0 +1,7 @@ +auth0 +===== + +.. automodule:: auth0 + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/auth0/v3/html/_sources/v3.authentication.rst.txt b/auth0/v3/html/_sources/v3.authentication.rst.txt new file mode 100644 index 00000000..cef10b16 --- /dev/null +++ b/auth0/v3/html/_sources/v3.authentication.rst.txt @@ -0,0 +1,109 @@ +v3.authentication package +========================= + +Submodules +---------- + +v3.authentication.authorize\_client module +------------------------------------------ + +.. automodule:: auth0.v3.authentication.authorize_client + :members: + :undoc-members: + :show-inheritance: + +v3.authentication.base module +----------------------------- + +.. automodule:: auth0.v3.authentication.base + :members: + :undoc-members: + :show-inheritance: + +v3.authentication.database module +--------------------------------- + +.. automodule:: auth0.v3.authentication.database + :members: + :undoc-members: + :show-inheritance: + +v3.authentication.delegated module +---------------------------------- + +.. automodule:: auth0.v3.authentication.delegated + :members: + :undoc-members: + :show-inheritance: + +v3.authentication.enterprise module +----------------------------------- + +.. automodule:: auth0.v3.authentication.enterprise + :members: + :undoc-members: + :show-inheritance: + +v3.authentication.get\_token module +----------------------------------- + +.. automodule:: auth0.v3.authentication.get_token + :members: + :undoc-members: + :show-inheritance: + +v3.authentication.logout module +------------------------------- + +.. automodule:: auth0.v3.authentication.logout + :members: + :undoc-members: + :show-inheritance: + +v3.authentication.passwordless module +------------------------------------- + +.. automodule:: auth0.v3.authentication.passwordless + :members: + :undoc-members: + :show-inheritance: + +v3.authentication.revoke\_token module +-------------------------------------- + +.. automodule:: auth0.v3.authentication.revoke_token + :members: + :undoc-members: + :show-inheritance: + +v3.authentication.social module +------------------------------- + +.. automodule:: auth0.v3.authentication.social + :members: + :undoc-members: + :show-inheritance: + +v3.authentication.token\_verifier module +---------------------------------------- + +.. automodule:: auth0.v3.authentication.token_verifier + :members: + :undoc-members: + :show-inheritance: + +v3.authentication.users module +------------------------------ + +.. automodule:: auth0.v3.authentication.users + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: auth0.v3.authentication + :members: + :undoc-members: + :show-inheritance: diff --git a/auth0/v3/html/_sources/v3.management.rst.txt b/auth0/v3/html/_sources/v3.management.rst.txt new file mode 100644 index 00000000..77e2da46 --- /dev/null +++ b/auth0/v3/html/_sources/v3.management.rst.txt @@ -0,0 +1,221 @@ +v3.management package +===================== + +Submodules +---------- + +v3.management.auth0 module +-------------------------- + +.. automodule:: auth0.v3.management.auth0 + :members: + :undoc-members: + :show-inheritance: + +v3.management.blacklists module +------------------------------- + +.. automodule:: auth0.v3.management.blacklists + :members: + :undoc-members: + :show-inheritance: + +v3.management.client\_grants module +----------------------------------- + +.. automodule:: auth0.v3.management.client_grants + :members: + :undoc-members: + :show-inheritance: + +v3.management.clients module +---------------------------- + +.. automodule:: auth0.v3.management.clients + :members: + :undoc-members: + :show-inheritance: + +v3.management.connections module +-------------------------------- + +.. automodule:: auth0.v3.management.connections + :members: + :undoc-members: + :show-inheritance: + +v3.management.custom\_domains module +------------------------------------ + +.. automodule:: auth0.v3.management.custom_domains + :members: + :undoc-members: + :show-inheritance: + +v3.management.device\_credentials module +---------------------------------------- + +.. automodule:: auth0.v3.management.device_credentials + :members: + :undoc-members: + :show-inheritance: + +v3.management.email\_templates module +------------------------------------- + +.. automodule:: auth0.v3.management.email_templates + :members: + :undoc-members: + :show-inheritance: + +v3.management.emails module +--------------------------- + +.. automodule:: auth0.v3.management.emails + :members: + :undoc-members: + :show-inheritance: + +v3.management.grants module +--------------------------- + +.. automodule:: auth0.v3.management.grants + :members: + :undoc-members: + :show-inheritance: + +v3.management.guardian module +----------------------------- + +.. automodule:: auth0.v3.management.guardian + :members: + :undoc-members: + :show-inheritance: + +v3.management.hooks module +-------------------------- + +.. automodule:: auth0.v3.management.hooks + :members: + :undoc-members: + :show-inheritance: + +v3.management.jobs module +------------------------- + +.. automodule:: auth0.v3.management.jobs + :members: + :undoc-members: + :show-inheritance: + +v3.management.log\_streams module +--------------------------------- + +.. automodule:: auth0.v3.management.log_streams + :members: + :undoc-members: + :show-inheritance: + +v3.management.logs module +------------------------- + +.. automodule:: auth0.v3.management.logs + :members: + :undoc-members: + :show-inheritance: + +v3.management.resource\_servers module +-------------------------------------- + +.. automodule:: auth0.v3.management.resource_servers + :members: + :undoc-members: + :show-inheritance: + +v3.management.rest module +------------------------- + +.. automodule:: auth0.v3.management.rest + :members: + :undoc-members: + :show-inheritance: + +v3.management.roles module +-------------------------- + +.. automodule:: auth0.v3.management.roles + :members: + :undoc-members: + :show-inheritance: + +v3.management.rules module +-------------------------- + +.. automodule:: auth0.v3.management.rules + :members: + :undoc-members: + :show-inheritance: + +v3.management.rules\_configs module +----------------------------------- + +.. automodule:: auth0.v3.management.rules_configs + :members: + :undoc-members: + :show-inheritance: + +v3.management.stats module +-------------------------- + +.. automodule:: auth0.v3.management.stats + :members: + :undoc-members: + :show-inheritance: + +v3.management.tenants module +---------------------------- + +.. automodule:: auth0.v3.management.tenants + :members: + :undoc-members: + :show-inheritance: + +v3.management.tickets module +---------------------------- + +.. automodule:: auth0.v3.management.tickets + :members: + :undoc-members: + :show-inheritance: + +v3.management.user\_blocks module +--------------------------------- + +.. automodule:: auth0.v3.management.user_blocks + :members: + :undoc-members: + :show-inheritance: + +v3.management.users module +-------------------------- + +.. automodule:: auth0.v3.management.users + :members: + :undoc-members: + :show-inheritance: + +v3.management.users\_by\_email module +------------------------------------- + +.. automodule:: auth0.v3.management.users_by_email + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: auth0.v3.management + :members: + :undoc-members: + :show-inheritance: diff --git a/auth0/v3/html/_sources/v3.rst.txt b/auth0/v3/html/_sources/v3.rst.txt new file mode 100644 index 00000000..6ad94c93 --- /dev/null +++ b/auth0/v3/html/_sources/v3.rst.txt @@ -0,0 +1,30 @@ +v3 package +========== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + v3.authentication + v3.management + +Submodules +---------- + +v3.exceptions module +-------------------- + +.. automodule:: v3.exceptions + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: v3 + :members: + :undoc-members: + :show-inheritance: diff --git a/auth0/v3/html/_static/basic.css b/auth0/v3/html/_static/basic.css new file mode 100644 index 00000000..be19270e --- /dev/null +++ b/auth0/v3/html/_static/basic.css @@ -0,0 +1,856 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/auth0/v3/html/_static/css/badge_only.css b/auth0/v3/html/_static/css/badge_only.css new file mode 100644 index 00000000..e380325b --- /dev/null +++ b/auth0/v3/html/_static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/auth0/v3/html/_static/css/fonts/Roboto-Slab-Bold.woff b/auth0/v3/html/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..6cb60000181dbd348963953ac8ac54afb46c63d5 GIT binary patch literal 87624 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

!pma|lSQ?8FBe{DRl|@FzhU7Cb>&@ataZS{g zrCQo@Lushkm71KyL3$%QD?KeSADp!x{f z=8g-xggQyFIyp&U(+DO4!2ygCg$vPu1pqEc^*Qa)IPstXB!i@fDLx<-```)5UsmT$Yl%a2onC zAFmUqUVZ7M=U;sB~=#ZhJ zS2lbGii8+5IZ#kxQUi*iaRi9X

#R4x5a04mzf2YJ>#U<-Nc81}`=EFMdUjIP>d| zG57p9Z{fmuKgy=mdh|^p{vLBqr2nl~Uvs`o<0(=ordV4cwH1`u!(29-sxfB~U?9oiFvwlQ~h zMtU+gNR!Fi+Hj^AdqXJb=<~`-ovK?Q2R#<$zZh3ihYT*KQsJfd{QuUW`+mlZ**7k| zA+K}pJ!@y)aP?O)&%QQq-p#X*@bHBL*FI8|_w@2%-GiKm@1IvS?Pe;LTypfH#`^kM zfQIh3iSL1qiZgXY5~NUv20JiatF#2(>ujRX)dcQ^917nje3D-C>7-LO9D|Qr2Cw)-tt>dQFl~e294@LmTlbdf46VkAe*1~ zyZBW!i|uL`RpE%lty{b14)U|xxc)&pr`-?go~fAw@C`=J=7)S%*=`Utg#?VnlSZ}r z*t%tNu^Wee=n9lZJBvr%l9KC?*fbsKwZt(`REc-Qn7PEk!O?Qh=n6XB5e}y`r?9V6 zOq5wG?G^EldQlJQp(*LT-5;TjsQ~KE`=E|BEJ*H*53j#E&bRx)^OO>avtf&Eg4ANuBcw@ z0pJUa{U`|K8;6dzlw{-ZfDuShv4GK(Gu)6WW0Tp{xD-WVZ`))kl{cRGxK!Lek93=J z?))rLI8WS;w=a$Co_X=JS&_p{X~ae1)5GB;u>q$hg~REQpCT8HK6|}bmuU9cTmU}G z;3|couJ$<2jD68ltnyStBS8M`21&8SW^9l>5XBUYOJkFU&pEH1pH2J=#7xDH#Qgch z&p{VCcv=sK9TA5(WN@$nF@mKjCL>Hq<7GEjOcIRMC* zOBs>`N$QZ;rZU8dve#2j5M_SY*_=ozHm99VZQe=ti9*+zR32X6yellOzn7JU@s8+O zmI#wR+J>k~LcusO1|-Bd+fXVA{-%=1Gc9$>Li(&;Ek@zfeD^PVk6S)7J}0qtIbC(> z>;eImn3EVi=dgRwlZYKiojA+Gzr3wppCH2c_e*vGC;?gx1d)scLaF6bq-$Pz#k3z{uaZ7|A27A7BNZ*ymotzA>JCQk;Q9_goe1Sd(4ICW{YBDkH2xns_xE~ z4Y;k_^09}Hi&M4Nmru^jykg)D6S4JMaeCD7Tlp~AHkOj63W=fyF$^xxuldM-}a(rbpFuYmT?3 zVjN5{Bsg=*SHhFgq2HT_xs-F<1N{G}-O0?Ki#tmf;nc z`?V7RdkyZ7x46T)ek@X);8bBuIXuA+=GW6JGMHqtI16sIyCo%y$S73Fs)+f+(VH%Iq?yw z6vJ7LjLB>$P*JI&2EJUvH5W3TqEtO3ln;>B&3rLZ#}vcLVnEZ0%psLUITDxM+-o`d zIau_7An@DSf#-KSUwP(W&5A;&5Z`?^=B0{~L8~gJPwT$y^8IHpx9$&RwOLuU{ijbM z4z=}_!*6T;_`TLH{zGo>vYCVXhS2xbnnw$};d_N8G6WDh0I;8A%x0@uk`jUj<&fVo zvgyf52(lzlr79#V)X^|tX1jO#oL&ca#H65T!7}@*nf>Zcx7Bh?3*0&J&pTH|-da>W zp>Iw5MUl58>02nX{odhK=ROm|jqdv5qH8+mM_w?-Y4iJ0N^E(X^^@^iFpe`H86CUy-&mlopl&gn;DN6iEUyOiyz<^pqqEW$com z0RSeJwxWg}m6-HEsX=RKlxlgSgMA0w-hcBI#Ia;I>eq?HK2I!^zF*B7!!2{ako+oJ zs+Ch+O-=1E@n?gGF9ZM+8=0YeZ=Uw3(rJ2LVKDt|kE%<0%+L;*E9#R~l~JD*?N5g3nx_fn$&)F%K9{y=mzAiX!ErdvVeRU=W% zbIU%gBBpV~Mt0XFb=!$Cjl*u7KswEX=b-0z-#_bz)~~)stN7;2Z^Sp4+c@)vYo^_J zV$1W3_@7q>VB=Wj;e`1Z< z^Ca$#61Nk)Dl#?Xkex*sw<2Z9Nm9HcRHBYi9ivCn%hfTja;k1rZG-u=DcUC5e^;!_ zP9L0bTcInW@}v9GF$Ydzu58kiva@SslQxTV#gJvcey^}%NuR#5X|H{}TUR{Sy?Fcm zWTJTHf4Iu7KWt zZs_vVRgpbrm_2y;WD6HR(xR@BZ&iGm`UO47M*NTZh3kLPFO0(JZ=+wR<9-w4Gke;* zYf48>9Jln~uI57v->jr>9fwQpOM473|vZ&RXhO)SWp9P8bdWAaMM|Ym>Ww?4bo-M z1U*hd))gl(H_~PDbHy8U{Bqm2;?C|aS?Ps!J??pQ(EyN0!P&AGY}KbtIeihqb5lkqdU!Y;BJ8t{TtFsv=N()rdfpz7J$Kxxkf zC85CY^$XR*8Z~69LNpjP-Wt;}?7E>C+0@CFg?f!&Q$Gk8zw%leIOF{H2epIWU6_Fv zZ)(t9+w+DtbtYbwnTOT%~RG z3%^C)beM{H;=`%<$&|+)o{Imd7Z=gjAoMAlw~m)mRtjE);Pq_Y*c7crqks+$8a2D@K!n|AB+eil6#t25q^0_DO;Jf}Lo_6~sLJC~j$xao ziW|E<@Sv}M=bU7B!q5t*M{Jo&Y&YL&)wa$fHoC&vd|}pui3#r#HaIwj&QFnoh8SIe z*y=DfrwIV`eTgYa@xLUbT>B4N25@d|D`m(XGr!5{GY=!t_`Z-6cVXAW|L5#G;G#OZ zx97~vy?2+sEK3(ymSquah=5{S6?;Xn02b`nHI~?GOt+<|38a`_Owczm%^1^TG^W3) z8jWeDnqHJ0zB%{aEf`|n@2@{#(Jg2CnRA}!IVT%eQzrfhKgA}Wk^s9sbk9~;c(49> z9M?h}(0O#-5{e9K4dZe2(Aok=reS<|MZa+qCXDM>(fRp%MpsvlzUTQPx|O%LZM%CWT6s(H z*$0nKoBQg#DMugtvDmPADy-nour4GC@c`<)x-xZ^_4eL0hO{W2`K6F+2&cXRZ@(Kpg-*>HU-Mc)w5Y zww~I7cy4YGSHr!$1Ti`-;)oEi><>Me&|bJ#d<<^=>uUDo?*Q125l!KoDcK|oqbZ4w zSZ3Vl!!48&7J98$fJ`S$&j?qmfcxceynbSoi_pG6(q$qb&W_nOk_B18yS+gkpt9#< z4R%5E8~y-!!?!YaG=H+>*o z2;t*p?j#Elf=QrRpf}Mhibbm-zzKmGD<}vU1cg@;i$yIbsv6gaL9;ku7RhpDX4>T; zgDLe03BE~?^TJq51#a)qUYwQtYwth4-dkn6N;G;snHCi@Dy(;sje^&u8A}pj9T?T}=Yra`$;pn7%j7ZUY30#824Jt)Q*8Pg z#R<4PbtV9W;52#1p-)bo_Qc@zo3F?(=v=sM^Oiw-C)NCC@b)b?6m%|Vf6bQ0WoI9J z;OyB49y~j{d+%P|FWYw2kVhs@dvf^o+qM^X>)!c>?K_7(K6TQ*!JD_!l}|K@Cm$Dr zfR69Me5i{I^A2`q$V4bn!>pJ-;2b^jFe|Z!ky;B7O-H|0sX!HAvcZ+%V6{f{F_2uY z%=EOBWSemu*G>`#Q{OiZX8h^omKFOa-CtJURySB z#arBpao`ASW@c93Wh}HBf}KI96GidEna!b2A_&s$uf9Jcjwlq8x6he<>GJ!3`=(+<-@cIY z{jU(KQ1RvRIhQP)zxR)CdOfg@9--hsW59?d7nOI z9lZzkjJ>*T$IX-Xy!FXpb?l-seFhKh;5`r%79Sozs6*MvPGNEQpnnyiWE=mSZ8gUu z-fIt%yzq<&f)Mop^H%Yj9PbGH&Od+cwbuw?7&BJhQ(nZgo)nTX-ij!o3=lXRK)Qs1 z33c%=F;0leNj1?l9k!}4tU@;Q6oN*>F>$3Lfv`GyA78<^xkbZsuMQv0tIBIOi9f|omWyHN zTAJx3#N&46W#-A(XJpH$xm9+33sG~2$CDihnumtW2U)_HbN;YPH{5^6Rb9LE9&k6P z4_tfsEfG=Tih?<|D+iUA(B~cPliPP+F>C&^f*!p(wU1OMZ`g9Vc)4I~?uKrz8Qykz zZ4npC$znE{U5~g}zL;dgk`GRR21{T{(+TuuWEfQ8pnKR1^lSvv?-~>^A7PKR$LauE zAeX>Wwx79)Lb@A#iFnEP>y`Z{51X`se%O3oLAML$-9w^*jl6PA$(Z!Cxq~{l?&XMal;sxnFTK25=K&=I z$aP8to2%^m2Y(N{ajwrzKUN~{HumFL>@Iq_@)Gu8Fs>5d#$g~15Wa52RZIdLqGm%* zyIHp{n0Mj9G>|{C;Ep>MTyo2;3k&=AD=Hc^$oMS0Aibxg$K^&#>O?kuzdFtUUv> z&wchePNs>pj((`TLXt6-5Cv2xuyUOhz!9XxaRQABa9f}hX*V%S9QKhrK)jLORDkrC z;G`e=w#(3kt9^cP=U1t^?}lx+%w9E@LKUs6YwXykwWqLKdv(^14NFI^o-tlEeA$t7 zEB#jH;d04H@9=P-5CEY1uYUXLTffp8Qx848+DP#!0cwO&@?X)xOXWcHw(ZlJzALHoqsT}{k zTol3wL?zJ}*8rdlK`D$N`WQ($rdMLZQQ~azXrnp&9>WtUhN0o!(U0G!6?F3sOIN#u zj~p?3-R{=8t)0piV}4GjH^Jj_{VOEV+=b2bI+X+K-+qxJ2amtK7Ru;Nbm?sggp#@R z5teCU&Qc_D67Od)Ca`@lGZ=eOqVU|OZ@u;4)3@Aquwm?|kz*^%E5`7pHyk){!;%}H zeDcOoGiHohQeInIZg4%kWGB0yJw{wS1s{`aSo#+M4VJ=ILNE>^*M-Wcekv)9GrfoL zLGWa3Fltiu!08N9C>6ffPm3EC zcJolk79Y|2%^Sy+Trsk$cJwIq(9zQ`to~qd+liy#*7L@>Mznk6o{~gbAzvjGfF?*J z4pB5Eh%{HjEQ+cF&ckqmgb|ApW@!#Q*G5`F(;~G}ls>SVCtz%NB8KX847yz!YR9W{ zC`ZH7`$~Eb`|D)5*bxK2hUj`-yK=hvxXWO;?}LphT=CMXSY{Clx=Gg5(SH;Ziz zsXOnEYM}jSE+99Xyup6qn@PCj5m}K(WCth)NC40PxQ23x^wY&+7 zpeuB}OB{isyQHV`(p^v_ju`xp0ZqG=1pyYZHFK6AZnJz>Y42^bR$MMlbZDoFwAM3wJ^7R`J=3Ma zhn{hrp4e}IU)#31^Xyc}*{1_J-L8fEr-@geq6?nx0gW%YvLuvq>iu1TwMjs5r-?Zr zgr7qUmoaxO8lxPDJr+})6laEtH%?`o9*f|#+L#BpVlhUW7T*dzPR?_(`m^kDWn~=i$S1A3pX&gCp(a*Z4LklxsQP#3&Q_e|7xFZN3VJIE%D3#k%P*{ zA^W-M-Rbvr?SAK!cYpRRrF_+@ajS+6?eSh?UCA2vBa`Qrv&@MTGzzmuIm(8VR_?#$ zwmn^kR}bzSt8RO`xKpQM@#pDV)dib!T0hZY;OpIU_m1t^wJ&{i+l_zL-DTg=5cl%v&a2`t}F$E<}7a_{xqvZdl=0!=7;sbdMWVU;5_IvzhD1F5h(3 zB}=YS=o0bL!66c?`4A+%c^YhOJbdtm!gUL0+S4OHa`ekzywF#W)9Kdr^KX9tUV~G1 z7w^U&(_<9jnByRZ6I6-Yzk=*Zg>z-7c?>8#RDGe)={7l(yxaLk&c$~0u<(m^|Lmc! z&;RhXv2P7&TEqwPL&m;^SOu#}RU$Vps!&s?f~$(k6{LT$**f5bn0S|9A~4bJF;FgM zhZPtXL}K8^FeHS#k_+_tV(dzGqZ5b7#B|$=)_v}nJZ-MbP8ZhX4Z35_gvs=yIJ+v& z#kNgeI8zLYj8c3tnKmx;*w1La(m zDQrqIMGfDgCSv{?;}Qvk;`z+s!W6b*A|L!fsEektZU3Ie&V)nlH;np+EVjf@`1X1G zUYN#KQyY&oOJfsCvI$Wn#-GUD3eVR}Cj#RUF|8pxN#}x4J^qQrP*xdXrO2`mS19^^ z7L|rz6bNaZkE?;ygn~DCk>)JH@clq77Wt~6QO|Ro6En!chTgIOB(=k4X%uZ;4mn5tvgd5~QTkNqCtQ@7_ZHhzyi$v8Yszba9 z^6pqDUKm-`@p=-_R_xFMtUs+#w~bz3fBZNSgw8)%clFh>!xfSyc6nd$iq?`SB)fTs z=LHWujevF_NrceZh;>38fM`<$#;_vF(42uNQwbnR&$<;GY@p!B!H3sfhaiTvYvrlR zuF8KQUugPh-jw@7E_Ir?`BE`hjl)Sa&8K43UWeZmGfWu^E1&$@7E&s0Bl;>eB|{ zv~l#f^?k(8q5+0ORNpPb*?k80v@xt?QRl9Uy4-NjeI^YxEF6Y_6*|bTArV%cj_R9j zwX$C<;RpAN*B^TZ&zo`5ulY@mM<(e&x}esW3L0?$qp9(fBNow0D6`VaFbmZ*KR`zX z#(22`I@P#ieoa~Vk1|dkKZ_3Z@$Q==5v$83 zVs+l6b%RIresANFgME4*SlkRO#qN_ZRthu5=%>)oe*K4p!dQn47%(IhLIwRySSye= zgwQi;TVltxX#tSoR3HX9%#3D8r_+RzWwBVCYR&MgII-GXt0PwvQ(LF@A5!PrFa5|b z5ViWgqLvM8Ou>Dq>3cDlX=+;o^^^>%Vg*VpfJ7?4npwP_rsQRa`i&06fs+6MDhQ6z ztE?G?vs@l(A3c0VbZ7E%Xj$ys>GlYKlH4P_PS&K5y>L;AK_FlOCDx!&tXv;fuvk}22K=gPap zg*XpqMq)y&P1XEjW4*8$3ZdgvjxoMaIU9$&&?S#7>AQh$B_`KH`BeqYxL3+hb=~lT zls$1$JRKlgx$Ej~MhX@@%WnpH<6X)ZKUjRf2l-Z^Of0lj*Q%S(cabd8)!RAKnGx@> zg2tK5=Q6-vMW=j%YJiB)DXX9c=TFb7yIgKpyhCT#_`4O?ho@y=6)#tNaC95EO`mB2&aro{^YiI#xMT|8C=X8u!me(1IAifYcEaxYSZ2>h5=U#oZwYg5b zGESRw=ym_fxIym^D)+?ixQ&nSWAx*I5j>ahGl;^eQfUJ7agGJx`VROfj6N73P!BQ; zoW=TzMIklRqwzQ~VHW)jB#J*iIq?&{95MQn*A0?8-mN3XM=()0nvW3ge3kQyI0~T2 z-EG!2IjtWp9N4&e<#Z)^!aRNas$}l8n~Zf>kmI8=yp`xsD@tbL3Z|v8u{MmK%ILf% zBd7(e+lO^GzYEFt^YaPUU6=f$9{ZK=(L?z)_#UPn3(Q7$EsFTxqqxAKxS+5Ap1My1CT3Zv47!xzYuV#tJVZ`y#fKr_D6nk~75zq!RPAs7qN-QQ+o8<_YjVcFj zy-nr=UM?Njzf{?)uHC(Rty(f{e-|*F-9T4ROJ!X%`6oCHU|2#W1U|qq9@0)UeAM+kNge<0cml%1_CQ zu-t4AZ!Hu;VDxiN%o1nat7f@K`fHq z&y|-}_uJPgE5Gj2s?LWxxeAomYOWa5t8MOtYsPrn6ROXthvl47NEqhh1DRD41#&9H z8u|DHaCw+Bfw}12ph-;3NAw2Z^v4s*52|QXKv9Gqmux3$;O3@#aSU*FnQS(MxR^cT zAB2Q|7=(7Sh7GB$9Wrdz!kqNf?CjL^9MONmg#P`;jqlsa<7t)Q@#tePj6VcVD_>%- z58i8)(Y^2x*~t_m^&4|x&LgGSvnneeF%fC30G{4=@GJS2UGRD1`G4Su@?CSC!YDBL zdj-t(`ImJ7Wd$hk0i z4P-6pLwajZ zzBHyM@E@;YX-;>>rrK)n0BbKJMkvSop5S;l6WNWm#Tp{JNY|4+BRP9R=r`gs3JG-3 zw?9&dO@9>#A*?bK?eW*Ds1p1mJ zN#;5R@o#TaCyN`f)#Ng1^WEwJBOZeqizqHcxKh~+JrWGUNWV#uU-(As?jL^e9sA*j zrI57udL2Xp;o?A3lRrO(V~3BKN|qARVmoX!)zsgTJ;=8sKNY}qwc}* zx_Rrh1@Yp3-gYmk=rTfbwyT3`E?c)DWgEvQf)M2Z;$s3#RE(0=62Gv{Nd2xJgvx-N zLg1q1kVm_pD}&4FUE)zy*?VrpDYlg03Xx}it@4t5WFzUA*9*k3O!8q|XhaDwU4cNB zauMwYwpv^UtKi#Lj8d_BeYM?(z%>3nodLxY_?+&I#Xn0tm2r~Co=SsE%SD&E=gDxo zBjV)w8+o5o5xxh)Pkk=gF;~NaZ4y1G;8;s-Ki}>T19M8XDSHi7Nn~SjDz7Qn5kM@c ztfWt==Dpwu&Z$5!!9TN*pfG0Y zO`8&d$b6Fhu=W06DXw1E^CnhA_})b`K}m?5B4vdyEaiVTWsHtELF$$yGt(CH71 zbkzL@1>)Fm*n8rat;-c<`Bv6-^D;%bbPF)`+|f7X_ugsu-=Ef76HRX%ZB)Cb-FIIa zwai)$6yBzE-Msm0DHZJ~tT42MRLs%kVEovfQh$^XGgAhSuuV1a14=eTZtJeJbM=G|ZjA^aD)Pq+|^9YrWLVuR)u z!2v;1iYee0pKVLXMzlmxta+2dZ2?Vnnn|$?f`M8M^PKNbU%Y+8x~)rQ2@8--cf%mC z$iGAH-Uy1&e#?Z&U)sO=_B)5$|0aHQ{`Oflw0p2EB43=s+1>IFAQm(|Ajyks(wXnz@Zbm-wG$RBT zn?&I3PK9PXhC5wZYB*0y?~+};E~CR$;|_oF$&rfn?c>FiiL<+nN`=&ll39~^7hlHU zZj`Ac@8zv`cgnZequ{zoTBG?TP>p+sNs@|p7~q`LWJhj%uG}iZNgTvkLuFXv{2-Q2S@r;8#}*$1 z=g?7a1FIRe>WZ^(47{$pI1aYwCyX6GYWP&ooIcZ*Etp=Ty!8H~lXmClJ+<+TFWlLp zSh@YVKYTl8P8mM$(wfHeY3a)+%vt-o$-S7!2k^cmg{<*LB_&1@4pgC(1T>3NjH3}L zO@uNs-Gtx}V$*%Kh<|uWg8wNOeS^x%$KvALS$2$2Xdqk60@p4aP(SB}52zOJi{sx! zWC?}1<2}^{x#`i<_?r_>+Vu(xSJ#nDw zB2LnttoMei03=&GMfp-jf@w5km93J_MXHOp$tmq%?xjIh40#J2M%nDoA<2a$*YZX zYmDp@4<9OLak+OyD^OI#se}Vi_BZuC3!wa7wO`Fyjx2yl5Bo=;Ss=}4ASbf^0pMIv z;Gn%~X4He$I(J^mah3Kd^XA6{8GZp;BV;_X{Jd{D7^$DW3r zRqLEt%LnYZ`;qNxk#|tX;+_ZfHVqc5*kROJ#yc&T92!Fz9m=TTWf}s?8R<+K=>P*+ zEuqz#DVkm+F#u?1Y_Yua7qY`**W7WEIZ%HkY#)0=yLM2}W6=J)F1zL!^))JccZ*T$ z53Q*j6`$B{@`4dBbe)?&HpA5+#@>G4j+-FyfuEIAdS5pQF^QL>P6J}v!`b~r&a zn}4UnP^}q2w=uLajikBka>v8-*$k6=nsI%d{^0pN68e^yl$O1sd(EY`qFX23^|&}b zazwAm87#bQmZH8Kms(a{R`uprQktxA@s##?jo<5M_a$;a9<1ZB;!VHO02QF`^mmyn zm)#T?Y_7o$PIHvOY3@>daC04YF&9)-V;6r^pb|T@9fq>(`ZziyN3kIo zJ5m`+O9S!8jtGGYBamanj-WXm5o1UHZPUJ0W@cLZisD=Dm020+)vKcx{&rmSgALSU zdlT<(iBp>FAFj zLL>vjuZ-H*K^%wh&%Zb? zj!&LBaXdiExYF5^ph@PjyO;O``}AAL6t9S;n-4v44KxuWlP$YMa>In4^BLp~XMoqL zcn5`^#(@;8s~b%ulo~=Q33v+G2vC?E`fruq2q1E2<|Gp`Il37^;*?1%G4?)_i6WhE zT6*|rPQ@Q%%jZwJbklv8DVxXcYTvd~r>{Q&l@B|4NF6orv1`*dT%|*jQb9^ z{1QX^(PwFo#sEk_x4$#Bi)T)rGHc;XHn#WvDUK83qzvjizJb=h5A@Lf6%RakxiR0| zlB0bOFEL_qctH%)#XF5mj$&kT079ho?Zl4LO|{Fj!Fl0iD`xkIqoK3x1K=emeP0IW zSNuuib7N)utNBnvK`;dvKySaI69<4G?9jNe>j@9D)!EeJl>R^r#m{WE@jKv?(k@e% zv%+=|U*J7|{?$)iS@xvFwCt7LFIf${7fw6AbuG}1wZeCkI4_?1=o6S{?*EII5=tsX zrt&fGPm+n-&<&xKq$EZWj(61Hq#^p8aXFKd>^6BsDp^FHh1drgUR^M~mOizH<6uZy&n+YW1-Vz#v)tB90?$M!kA9T{tDv5#fTtKh!~3*{;3^CTxE$ zh0-po9ukK>JSkqx5FO|tn)v93s~cRcLiouE$R2T^Oi_fvO^)~*H#sgoF33$*AcUC= zCNDWld^rs=A!cWgm;9MHeyhPtu7N7sUJ#cZ)_KVfin^EvxZ+);CF?pJB2z7r>#sG& z^jyG5W}-vm3T7AraUHy1b6uiCj-@9d(P4~b0^aD29`fJ>*SpM?Eu%5b$Ml<(b5z+! zTQ<@z`4HV@fZV#?6UTkxJ6Be0Or|lobnq=w0*;k6-ba&Oyne~g8>jrf{TJ~_n&<%U zWf*}1XzCT%)EQr=ifc&>tiEJdC3ML z*4=vSsvRf{z2mB5x2^-WUZ0}Bi05a|m@ylALc~pYHz0@+m$9yJ8amf+SU^x)#e2f?0jZ7GtF3+_EKhV+tEn_W8Bf^XEm= z`+FWdES?d6iQmP3=v4PZ)iAZSC$HeYd+VdVduYa!Cq6vr^U3A(A`JLTB7S}Sb{(QW zm0x0^FuYgqK3*gK#eY@~6Bp|4C8-pMEy}=vDL_Fn!~_gw?Km@8EiXKAhBH+Zaud+6 zKk&Ef4=e1xb3;Z)M-p>IxI4#+({fdvv3Jgj$YKd`9i1C@bh|NDwev@AT4f3U1bC-B zUyX3VcXWGRCk~&4TbAw;Ypbe^d(ap;FHXpL5l`BnN>mttiVR(%5>2gD7$wAnMPsG4 zz!hB1ia47i%dH>6uK4)o)1atWp1^>!9QO!g=Qh1U^~Acw)K^X~eki}-p-Vn{B_-)n z^>T3?Yn9Y^C^?n(88&PZbeuSRXkWH);4PzYLd=^rYaULB(YFkE)z>)m))B*R9d_Gm zSM4}9MvfGSJ(PgF@4i5*b%oB}XyDEm=$fPBZ>pR|wjF?1LR<0UO zMV5^6IkIBoTsA%2gh5^GZZ6lT+vCC69x9mQLiWBACd0j-^o$uMY7s5~Sk9p5+VslLF*T>~C&giiXGZw6g2p5Blz@1(U1c*)Ext@`H7#GGa zT>x4}(AUY*4i&Y~r2Qt|z;rtkoH}-+McMdgblLd( zUyWhZ<~z%xU%9ts`S_QmeEcW-)zj(|r&^GYr=%SrmY%xiWftaIlM*R#y^aaN95m78 z{gg6`F6^l4xmGjWnVL#SYF4V0=$EfecDig?uCO>=npEB(@Z3i)P8#bfl=j>7IJ+OG ztUOb9?i}QZ56<~ci#0L~_HACyj=A-G`neUGHmyM9oOnz8@#fp&PyU7&B&x-=r~ZK6 z@T$y3XNsunW=%KsczQ|OuQT;>hj<6tVhovV3nLlnSf51Y8t&*;uqezjjsQ_KP)w<8 z+5cS59D@k$a^<;lGwl*(U0{z3OYp~VgF@!PMwubqAn3YRoeupgLzUIKx^w4cyWT(N z>tE+SnrlmE|XGPZ4)2Cd8H3tY$A4EJE zjs^#=%UmZQy3vXV3oW=7P;01K1prGKu~-7)-_o;20VedV1B)PoJIsh>r@yTM{*w#{ z|K4?32MC93j99MQ++k&B1e84`=l?;R{|Bw%-~9YL8vgs{dEr)(8Jzt_tX%BE^=n`c z5kndo0mQ0F(?AdAHRD|9A&^Lpxr`Kh za%PrOT4rgc`)@+-gCp-X^F7X$(e{KH*f4?Q%4%5LUVr9U0-?E7dt zR6UvBFE`#9m*=W3oO9WL(>o=Cq`rRVCw(uQ+o>vBVvOSQ`n7)wM(*^zQ}O|>zG-_T!?tZXOUG>4? zsrR(cduY|GpTBoZ9kqB#^`hAy>-kecR0qb?&|^S`l+FxC@9cmal= z%R=iRYy{hw%jXx2b?0X!#I+k%{5f2IlkZTu`0>H!brG&wF+olnO_9^)u#6W>p%1(onpq?UHb(m2v#_oQ+GFZ4F=_>1=voC8 zeL0v``Do#5cZ|Y7iIXTqnSHV6RC*Izw{~W<&TrkJO|HkC zk>kw4gFh=XLT1h+X(t0|F3tk~)OHv*W2cUVx0?Yso6~;?P+Pqw(eDqy7_ezZWfKNA z7%T1-KQcKwH{QH=@68&xl$-YMy=h3=An^S9C*%)HyW@_uVdAYne--Z!O1pz^di?&o z9;W~C4cm9;{rk-`b+_7E*=y*zVTKYR4Hm+z785^DV32X5@(`UJyS>n_k!~ws{`0h; z*@606wD|6PrmpQDa-jNr&%?wEk5dDytDHg~3vrZbt>i8d9TjG^Qr)%9NC!O6nT{~y zl#F8l;Fp(i6iP%gO1$Yhff-qa{?u;}jp(1*Y*SsIyS!4J^J9HGU$>>ly}gZkAbPeO zrpDOL{PG7{_Q#evwitNRKgS6%_cBWg)(64)ot)$+gD@I_ctD&(Kznma{mFV|q>-SO zHEX2L=f|=KJL$p-Hhqy-C+(@Pr&V>Z%dB7XXKrYBHT#K{p+ z5fP>$2f~i099rvlpv?LR0Y8epP+#wNq59Q}_2DPkX5EiMlf@(GLg8Mv6&Coo=}B?i zW3?HGPtk8KIhgJ8WaB0)u?mDHCE|in0WBw1X);mAg=x&fO>_cOaN|gGyYU|5&T;1$ zcbSxAxz?jeRF*T`mIomwV+TVBv?FLe(*J)9*e|=Bd+Y0s+Cz<>>+P6Ouk7`GVYCCg z{#;WC0L1Sd(ndof0BcK{K5R5eB&o>MN=c54;DjPZfnkd@;EeEb7DZ)xgBXJf!&6L3 ziisg4DK#lICNU<#ZZq0qZJ{lp_EQ#WKV-FNwU0M96z}cd@i&y0jC(Hul|+JWpQb9R zrqmM3QF97~S2$I8rJpMo7aA_sZ@qS-mbi3(%pzpLdLM|<4WM>4SNlqcc>uByzal<) zK>S$wVOsXqv3EWbO$7rVjeh37>W#T+AM!7!tq`-tv-#pVF=yFy$apTVd zbj*7W{cwBJH`)f}MdX!WrYHqFR3(xM#N?eZ*+G#~4}@#Lt8}{qx5hvcL;AInM`AY> zdvSip8UPDDG!^h%p&35QE+@t{4wwoK$N>YD|ChKUYr9^kYOf!oWmLo(AltbV(OL02 zUaJhE#ASwmBre2jG19x~52Z-o13e@US1$#s@&o`Sw{{o~l`(Ti7zWLa`gq(V zXRj=}ZFa#JS9V;hxV-+JOLp#n)bsF{&%SEefB(CDCA6(q{L|khUR<;~IpMgb_DilynxP>UQ&>-YQJ#5KZTgq z3hM{9%1z6SwOLdm5h0q11UFL>v833K?^pF2wFyBXDHLvB@HtTN)7c-zPXKWzCyhVN z_*17AY_jv>>x&lF)-IA<1SZ5+CmmmkQ;_}THF8Whw23L~rar&MWxsl*lHcRg`jyd_ z-?Mv@V`aUuuB!>*PxF%hpPGo#|4U88P`wxb@^+ZZ+fz_vR`@ya!B5l1uUz}Zd%h~& z3IA&7p#CGi+BbB-$nxF1WY>-%OVblKRo+x@kg|MNebJ?J=WfqHr-H7<1V}eR*pIx# zz*y?igouS}31b-@#8@IK5Iw|TWt{ix*rSg}h}SXDz~;zH^2R#f5}edH&iUeL?$i4x z8FP1GR)up-ufRir;@#MMf7PNe0KcdOA;~gAf;k?{DrQ?HO}QlGr?2N^}EDQj<`gcld(t2hq{L$N8ug>zD60nB%5iVl4Ww^Dro@g7~!5$j0E zTd}UVhYlx`{bFyPX-@DnP78{gU05_bdP}-1O1G?D`=*$4!xw83d#5>KQ}R6{3Z`D! zb(_p9q^()9t>nsS9Y^Hkr^d#m_fA;z*^Oe(8ynX6PB)|-7PA}TVeO0VHi~v6F?HgE zA795tzy9NdiK&T4G^LIEMX^4<0d733b2)oAeaAlV<4G>2TlBZvZ-RdNtepvT|1n6K|MRIge;PZiYNGJH^`!Vi#k^}p*@zM4_4M){T{;c$7OC4G zxohXZ<*tmi<90o~=MJ^=pkZD5^?Hf`8HF{TYJHRy3kBHFd8xLrsO0JGF`6Ymc6Iyt2#=>dh8z&F=eUU+`u zexPV_PG#b*mKn(zQ5bQ60;uVjptN|qjSk#yZFsx2A<6vWGX;&Trlp&v-qHQ?sU1gn z^3$T@()uJ`d;WSc|GNd7d{5W2tAi83!rQrC6W1gf69A1heC&aQa9sb1m~)M@M@MnO z5b|c^841x>qq$p|zLi6Q=wpowfD@AoE>AJ;t-%W|y|G?2zVv-No-wssJ^RY^_USd> z%Jc4>FX67!O*k{L?})#@)SGyTQM*Bk&_}9@N&st9>fG9(a`M$Stubc@L^vl2~J`TQ>bUBDo_?t19#=Ppx zOaAxTnb9rR&U84N$5iCM83vA`-Pgd>)vJwL(F?0Z{Tkm3#?YNPgZ*S!_x}6ls0HWx zzhjuA{|5~7DCyXKA$#V9HR2}u$@m$;Po>x3E^gN9viH&2mwqWCB%5x32Bla!qwa zQP2efI0dD57${1VS*eKY3^EI78fG#UWK??W#4(M3luwFI zi;ij)T{Buu6v>g%etCqbi1)GA-;0R!qgkUOAYK-vY`p1N&U~{OyJySRyD6hP8GEKq zuc3WNN!N3O$wqz$dqVDagjuwZ8>p%&9M^AXFd-p9c29CbvV5%rZ=p7Mw8B5$K@0h+ zJLToGu}F6=Hf@6G^6S|;Ueb8C?-cY3%$LRVTK&8+YV|9z(zXn&E0)$u--s!y$;SgD z81vxBoj2)9;}lK-LZ(dyNtf%|jp4G;paM?Y;LsRR2Re84gaz(_*=uNzdMwE29-4Vp z_+&Y;?d>aYIvZ<9>x<_FVw;jMwV`la*SM;KafRsSaRrxj zM4ZNoHo6G^HVfp9!Z-(bAPYQt$fN$R7+lNPKdh?p9_%ADC%BeJibL86)ON@HB`LAR zc#xqp-#mo7T^a7^QYIZgHLnng+7&Opdw??^{mtejH zv$v{3IY_sb={Ikxa!gfW%z&!ZNYymT=bMCEbNeF%Q!epw@;zd+WY?kIDQ2d0nIpeb z8w?jftkhYbUw`!YU*|sdEs?j?qg7+aRI{;LV8PzBtuNhm-)p!ZiT{ZImh~>JAcW(& zp@r#tQWD7|*`&-n%$=1aH$s(A9LIl%6ht?R6u4Z;$%MGFUD?T*$<9_O7|UrEDF}7H zm4I4D^LuuR-)b2pe8tf5Xnan$zkR*j-|jT6$BquDdx%?&me3BkYW(+z1H9yaj1NTr z&+&oK7W|{#kkz8SzBfay1k&5AVU~$XEjEN-f(B_oG-e7k(OQD>BSXPKqkyDdv!({R zl4^yK7YBkV6NeqcNt$Y)-K>ZPxgap0r;muKv7>vAAf``NnfM-JsddK8HpAnb-?5$_ zul)m}#JQgjHc5l5r}hPX3rZk~MWtHw@7k9IDHl(7VweiDN@)>~?ebE9<*)hrY^ zpd5KC1%-&1VpJ2eBDsiwMyiO#(p-e7%jupqGxI#YM{$9&=dS6S zR^O!W(K1e<=yQIocNEs`O97Q<0B8yj;3)L3DqO9_77;+9R}JL51q=CEnicYsy^$JH z%n#@NMT`0Q;UaX5jWz()aqE;_R@V z-3Aas_4B$LFZn-ULZbg26Vlv44>rK`(gUrKzH*4S{@TZX$yQu%cCpmGVg(`OJwz@uY>p5HZbjy|OfQ**-hOVg7 zX<$Jx6QijXCeK-gbK`UZGCQF63nLBk8s=i$Cd2hY6i9I6sS+ndIwC=2$4+0fM!yP) zbObjvb1#FJMj&gXeh}6o&p>@cO|SZ`sdz6m05hb*sP1Vvlo^Ou$Z{cA(kx4;`;bAv zWblDz5kGxA|B)_T_s{!C`~vP7)itvrd-nJVwaVT`+v#6N3>!A$w@=yGM%$_t%U1_~ zqD^b%xl+SR{%%wBzu6Sv#$~r;lUno3;VHLtD%w5e6)Bf8WWdO=;2u6=&`@6DTYmhz ze)7+E$LSTmo}5)PkHL zeXjYPxP*j+^n|obxeI4GCHyYIK=lXKM{wQ+)_GD>lU&{BKa{Jx9;H%_R*oH8$-jS8 zeE31bK3N5h&3SZ!6l+cr4^13AU=lI#08QU%`4VSWAoWBi6y&-YSo5+dfk;r8D~)m` zGd-TET=^UFE)1v!h`p;K0M_zA5e&850=k!x-@a{|)-s-Ng76{|FABo*$M%EZuvi_G zr{(LQya!*6V(^WyQ_HIl2SIsf#Fm&XegH&${q`i71F->!-ltEf2b7n8^+WWQLTk}G zts#Inm${Sa*Ri#HVPA zs%kYH$<&HQbomsJodBSR=qwdsV6iwXrS03wk`^vkte%m{)H|V|=z=3g4l8y>@D%d6 zLLnb?n**$$2Tq(>wHp27PpV9s?mv=F3K6#z-ClGg>9V&#F;Ab%XDN>=^DZ~eCFR{e zg0U4!I+@&iJ4rAQ6+t$-334SW2MQ{!(&1bRqb3<&ueF7DpCC6~4xaqW49#3urv-2b z+Q8Ebgjzki>bK#e#|f1dL*i9xLp1;Sd{lHpgAFv%1zr(<*&66JxXsiKe@OSg9hjYu zM6N5^!c{J9q2R~cV(&tk-{A{0)49qp?v1BFk2zAT=cd_YKc|r_%$B4i({R03XpEwUwoEgia#lU$ z7pB)s3N+0n5m#xc*eaY1`kZ#!^)|7<7!)^ak3JN#IqOfEgD}?|m3;ARVB+pH#^oD2 z0>>jbJ{vCa&s*PKV~k2<8)hndQC}Ccq>fl>VYxspo@^W^j9UVUKzE#*LQ15XSS&^j zoIaXjP93}3AwzSHOlzW{KCcGwoLO$O0DpXZ2*y+2pup~=Z>*WWei4@bga|C0^RTkA zK{Wo-xLKa+i`R`>9V+c;fZD^-IB zz-5MB86j#PO>^wy-`Hfh^CTSZlUP)!gQi(rqAeK z7C`cHTj!wWZc1`Yw8Du8JSNi=TjNN`E-Gev6PcuQ78hb0v4v)1iwo>7x_jzaF?pq` zy!`BK`}iGuZ-4w*uC5f5Dkn$C7OvT@uJXZ_nw5_4zs9C_a(cQbS~~BcTRm2?O6LN2r&M~(JO2|&Qhz~9Mc>fUBD)a#=noI zf3)Kh#AR~nsjYEv{f9^?ywKvfhK_!}#T~>ofuSapBoJcRCC9px?2Xah@(3$q;e-N& zqqb#oCD^)ITxZ^9)Ep?XpmRi?iG1k zT>)G_dxV!~Yb&v?40;`1iVB!TGjO1)oZvF}%X<=w#xx77wPJvPXtWYHA&evia$!2? zB$x}s34v1gc{#28XwZ((G2EXI^O$JRqGo7NgX4+$9h8v@&Y3x9z>NDCtSNK^;Be z)n}I8+cx*XRYyK6XxnX2@`G82HgCIr_UL&FzGgT06~++1Jd7Pue0qOO@zz|lKbm)g zKR=|Ep}Kw4|Di_;i<;Fo`S%`qa$IHggbvk7Nw4=ly84r*38UvO@x7bhr~BZ-ksI%U zhi>jXeaWSl%&PPE2c0{lXHjoRv0eXX|DiYESh3peTvoB`e!V+x$vv=oUIO5G*X0m=GOh=+)U{qvE6EB?`ut z2hG%dK#z0D_S(_=!f=mx{kD$H+8n*wQdmjm>^can}P|y)!B))IIeO^(X z|CZaoKBOqme52bx4Ef@Gm|;J9S7!aeO247aHTGJzxp}2!@SDo~#t&;&ZCOm7VWDt4 zwa%PaGs8;7Bx<>^@G?|iF-KA6T;ZFrah{^g+erKvb!D9L0&$>riya8l#qEgh)YO`p zN9<#NVA*L3P$1t5*wqe^Hg+s5z2iBm3Hg^C2FrrpXn|dR!Nqi?y1e)zec=V#;h%-2 z_!M~gui@|}Z2DJuDc$}}+{+*J+mCn;g41k*UPJ|3p{m#lMWGYXY(t>}n^Ga0;!rMZ z0Fz(tixm8(TX*hMckJ*z^$&%=&%=}F-h!8p|8xCsMi$Du*SA_eX-B-IAF1_D>(_@8 zYwuq12!ajQm12m>6|O3^B!YxRMTAvHLu5EuNu;%!L`6mQLC}=}`IgQdC`y2g*S>w< z()Ql=J$oS6qM&03bQWSASu!LdJ=WqP?r0v5=#-U^fTdOc76OoswL9cf^aInSlO=fp zc#1u8OXTXi5Gj8CaL&Gxu6t);)FR@)YISWbMlRxKO{%J`t(upxUcA&gzi89)1^uAY zeBml9fyb2lC~y2q@H35r2MrqBcm^83YUK384I2dCxPJL+IS00{UcP=KG;Y`c-(0?| zpdi*gcg`|VUOeae^?JXJl6&OO%6n$N&GpVI?IruIPw&uvlc3_TC~K|1|3dmLEG(j& zL`1}ebY8-Ro!77LMLJKqR-u6t*(un0L9mz8|DeUrQ#9;7o~6FpboROG>+?HaSM~f4 z;)pt;YEbXK!@)7EU$4Q{!;dAb6EC*zP^@=c;e7Gjts}d_W4t$G-+y%M;~xg}??2#& zkB@!yJ!2m(UVLoH;zdjDzkkW1#Y>JYUJSnl`s|y>isx=J{4PCirD;SXIT*)uf`x+~ zJDU}bXnmNahx=qsg!!3ymI|wJkGEI|vE*2C5Gp1kg>kwTk$fk)S|VffK;GP)vUQ3r z&L2k#KH#z+^l-VHV^n2JLG0L1FRz_2ezy2%c1`sR@i9bxG;e>`E|1Lr7^2mk3l^+h z`&FZD_3{;~*xBIEPk+Pk*RQ8_ZV@%&UCO?TwMC(`jJ8DoU)lmKwFSr2ANq%{SZ7r< zJW5lC4jM6Bd^~pKfFa`ePp?ebUDWB8DTjYidSOe%Ultu=R_+vVk zd9^nzLPx$K!_CmUY(*$TT3&5)&1SPyu&IEV9C(shd(Qt{R+@70cR;lvi8wXO)7i3V zA?meckbv$3HoAaSh!gMp37rH`Naa*~zI@|`Yp>n#w73o?JE8Oka6&kY6u$4(%~!sC zpEz;V))OGR@txib_i`d0yyzf%Iv0pi5|hEK)G{@^|$J{btEC--~~?jhn7 zJhx}v1L8T@^5D7$q4vQI4?;gN`@yvj=%0Tzzk`ied_+SHb6p8^qA4O{()J<{nP^T` z9X;kLc6t&V&~+csOxUMntbrfqz;S%94N3xAr88!hYn^@7=W!x(!^o`pS|HdE(%PMCF!cbLP5Z3ksH9jyf|+5=>BM z5{1~jSdD>jT|a4(4Pqorp+HN}W;_EWWy8IwFtZVkJ1VR1f> zjOyQu+G3U78I0=UhP>7-Z+4oZs1{YR)Mlq7Wri!(u!t~gL~WK`KGilm4tP9Z7OgrF zEXg28JghnuBGN$e)}pHAz{{Bs8z|l!(Z`eC$`!3d%0HzG-b+G$fpOdK(Be0Am6QRUv@-r++B4;;|9PluizdUo%MCrd{A zjP`BwTFcESCOt-S1!M%kZb~WV$PxBrH!Dhe;qUf~|Np=L{x9#xVyLoUQq4k6Yx6sH zY!6>jWnoRtC7jOeP|&em8UCjKr~IwGc)QuJzA?>S>Ki5hH~6dgve}cnH+x_Hi#mM9 zjNxitNlBjgRvlI=AGhfuA6tWueSd}g`{(M2>C;EZ$6eYe$^O^=^Ye*5x29<0^m>z4 z5=HDJiKG!1$svQh{WG2MjL{rdT2g}C1dzQL775Ig-71w6(7CG2B-?Qa7HwCMNM=>! zc0oAdv1&}7k|4JR=8?Ms6e|w5+!|1I#GRljpeY_V^RQw&B-k~^)5BNP^ec&w-)LGS z3>EjBUmPhOfhtx{p;xI}G&TN0#j|}OJI{7Qua{Yk?Z)0Ob&C=Y!6bf16pWPMP+P>R z$^Ea2@DtI`|u|DVVS`}EV-%tX#pPs!BWYnaGUO81M6W+LbL z{W6nr{$wDL!}PuTG-~N$MKsK9+G8mvNH^lRkAp%1k*@%~2t#l=pzfl%6Poxhg{P$^ zN-A2ol{=I;H5w_3#SA(6+!d0Y0e?_{zc)<`npSxZoZ{rU-(_e_=fC~FV)g13ztfm; zaB4gp5>0QuCB#909NO1w(~Ox{Nqd`q6*as@o{bFIB6!D7(YRhWg;B2XI8;c`GqMV! zp|w+5E}P^)V1+ameV2bPoy2?36zgXAI>CKW9WJl@hZ0Ju-h-tYwf$yu<2%AuNky6yG3>%pxYR-rvyS(Mai}>3RHVEiVvJM+FF7H4As97)v!;IT0_Km9Nvx?0AR$zs0LfFR zby6t(UYzsIG_CK1c<3w6$t`-v47h#QouL}nVu^T1e0EM+Mqht@*Aq{Pc}6b3i+GJM z#{3K7GiCM#6pVRutV|LSj&Z(#76tOWFv_QwIE^+5pl*Af(@5!KSD^?+Jk?BD^w6v! z`~I;AajX;w6wzlNTQPO|_VuO4V6sGduv-CQf z0a=2=0!K^I1mKd6m)^sA(Z$W1%kOm_>wD$APE}d?4rg4OzWEP8uQjq`f9i5?`DWiE zLFRa4V?c7CV1W3`Eh(rO5#xq z&uRU#SRW^O1G{z|PpiYWxCqgb<@k88Ey&;JkO(TxcI*6oO;Hit%PH5V5JE&NtrqH+ zn85&vU)9<}JO-KHX$wm*z@Y{I!sf@FG*U82huv^-N`D=H9f6}4qx8$M1ASk^yw@N( zHg5Dhg6+X%P_lCI)HwFvl;pwZ>d&j|Dau3?J^}GmF$_pMPhRrJHCI2Uzqc38!w9l~F735h2 zZJveTEtY>W;_e{T0@K*ML}y!|!M??zbPH)N?(O?5g{WhNdwZ6_D0O8TWi~Aej|3gg zuJh4(wXQr$#}HLDw{~-aNGnmqDo87BX4N8b6fo*ZqFiG@u9#x#J6bH&%{Py#p%B1`dmLxw71F1!Nxv4aO<-^gDMSIeeb7Nx*i!`Yn`*$3^4g zoByn_T50&QSG?U1E`0aFx?AcAB@>#?aMTXXF{;H$;;2Hqw5F=!PM}=H7W3Xjp(<5$ zR18)5bY{qQhqSn;uwC06c{P@8)?x#tZ3#9|wprENtfPMQ7-+1+-(uNR&6SP+Z8V*W zsSge8cI5z{c;Wj4YL{MDFHrJ39=!Rsm;3c{4a*g;7PeM%JGF1Cwk=3ZPEJgMu0M`H z1`(Wos%@Atar0g)E4qFBjgNjW&b_>K>fTaKgT>pcF6Deq`Az+o<++yjCqPogZmk>E zB0vO)QHOv@hgqdGs0*i1WsnBwGlp5IA&Eh$I+ExoAt6}%TSo$6z92l&BpEqvp$t(! z-)Q`)@MTgH1LYn}os2ibPbzY~Z)uFx)e?eA86fvtV~^JHx$uqfinI=?Hs}9acUkyJq(yD@UCF8>v}TdXw7F(0EF?6b z-N8sUS?W#Abf%`*W96m^4C_&n?-EE?9#Sj=IR2gT8X&PRvY;qPpivg{@*wZS#QJnKE z?vk9OY?+mkmpsf${VOx6@!osa{sTGbEY+a&-}p&|(x|VMy?zcA1+EvqA-bTG&Zq*a zbEqf~T8-jE{(>bYhsxphbEqz&6o-~>tLuHY7e(Um6kop?hXkV;1lX`(*L{`Jqs z$ZVc#j}jg5A$RCCJoB2qmieC-5l@aaJe}cG1rAJ=vyi12JC;fqS6QV6f@R)uM)~V4 z;HH(H2E-+$Q`55(ar>RB!%$v6;={G$^Xwxq;Z@x>fd*MbFLl~&QfT>BqS+db2P*5qQ_HRu~Xx1v! zDadrTa;Lcy(4&dabgcqxmBd!+jcTcmC-c|qq+fh4zSfqkd|VzV=bx4}J6B)@yGiSY z4Da*bTV#1o2GhqlAnj!K3){MmO+D~wXoXI;!K}z>)Un;COjY(8y6H|Ua*=_AgQCL; zxvInh(;Gz;)u>d@I2&W&ob+XnchW>#fRBvMxsGd!^~-PKgz_K$rL?+kIxK>9_lh@9 zHtCKF?5Mqcr#O#O%J5lM)3UwEqC7)YiHT#iZ4<$&KiH1Po9eSRC_sF4#Vd(NzR z%m6!;WA#)=99~mF8VhV3TI*k~_VzY=oDvsA^%vL;?9qiTi>JO`s)CLE0VZGn*d342 zLyxVPG97Ndb{^iJP0ac0P`@`(eBJI;!)4;nt_Rz!o3MHXlIKkwr@^{5q8rZ!Ta2Mg zWWkw?%ppb27d0`oYpa5N+Q(lCDoMu@U~yM1K2)oy#cIKUibJ@IVnu5CQ&uK5xh>vi z1&Gl5zMxz%-6R(HZLbi6l_Fm9|7UyjzuWHjz6<_td*J>ltL03&7WUQEnYQOkUXHj$ zI<{u7o22K)IRR1*y!O6%4)ksMM#)lM!k8)YSM>Ukk(A=8r?9^lk&OGFibxvDE^gdw zoW(_dFCsY|M#3C%i=51Fhy(0V#$NpIrB4sdFFyI>)_bhfcgb$$C9z$+b%!`Et^$}1 zJ$9&1eeFs4G`0AA!fU&g^qZg5`@Fl{R|e_vp~2n(fITb?SHeLLi7K3NrG_xza$OUk z9O!g}v6rDfo18R3XpvEBLf-vl>J6y_3DB~t0_fGTcpiuw4jvO9e*cDe50wO$Oqwrq zhF8D{Cbpvg^SGFi{>>p>LvZw>CDmIuJO(q=fc|G!v4ju6IFZg%0YcL(R0SI-M$vIq zCp&SXa%n6Ew5Ah6%m9o@e!}P|nrgG*24WcH{3n~~TU1;tIiOF1*mdA&(CDQ#X!Mn= zT#@e26QVZb+h<<+;{Bs)#iAvZTQ{Ptnq<^mDyH&pP?L+NTuMkb*;6UM!`nZ`g9guo zr|G}Q-9qp%!N4WA@D$MG#8EYzx}vX5#fw~~J=2|~ zyLFDR%sf5zJy~qzy>uNF8*$=i1+`QxJQ*~Wbg|EhZuzsYBBV3cDL)IZxUm>jXm%mT zs&UM5K~eFX5GfY;!`Fu%Z1ebCvVw7xqho4LTQ*lJtX@`U+;X99o$q|ZeUDkJCsnma zw*~_Puf)oJw2@@e)7vd7QZ@i6mSy3zw|~dg6E7Sx{eTv zv1j#OWv`#RX4(b42?qtR^aBuufnu0uQ7O`GG(T|-OyXKXye(R{uN5A}LHo@8wm_Z_ zMY{gGrgB%%)@r}4Xl&o=DI7AShvLklT%0)~cK+S;CYU*4@IAw)?C5{&ct{%tG<~fu z(Rp7*sN{s0O2rAl3$iIu)N=@dc+X61wY_PIIoZL-{`0v19X^ zIhPDv=1hEV=-C_o0?W0VwyuG;o~o&e#X1wJGBW|Y?%pRYux85g&uZsRn8~s;c7r;8 z>c?*_z9-*x&#KZ6J>Y>|on{wB?Y;bwD(pIT=RP7!iZq>8Ch=jU6VB=s;H+a71!@Hq zbV9X;;(QvW1*a2AK&4O}^(%VHM#g42-EM3pPG1#G*IhG@+1{WQPfN{JQZnUq z{&DXU`@^~viY9u~gzD11y~m2*sPfYzZ+%`-Ryz*TvwIKZTv-5>^z`)W`oI4byJW-Q zj-3w=@7HYr^y{MTeBptcDpq-tE*+KMHXp8Bk=Dx@jXWR83*N=IDUT5k$;Z<#3V#;B}yp3T2*-&F~fcN9psy2x55Fn$jV$78B6J2JDhTgV;_K7 zFs0CWYX9cd%?5Jg>Pu&4=7_g*5|+-Rzb-1@=E((>Rv1H=o~#3?KYnY$-5pv#w03#7 z%hTgCZs@yY&I;fA(?1_Ltly2}KEid)#WG&W2a;^k0i&6CDUAo*WUzgCxq38``&TuSz*=>d%k9@#W<4S1z^1iFabH6DsKq zX6xXJ!y~-ihW6{M?s%c$<}vHCleWzt>Kq>%Wvgj7cu1MJEZ8&xq+Qb)Z4uU0L|+_b zGB{zaz$lo29v7`OMS{%m3{{GE(mP;#ay>eb1 zuc@oU&1p8bSa5|Io717U!}x2Wlek1|`OF6ya9Z~juhTcBg4xAUd(CZ$J!5DUoKcta zk`UV!w4I>sj4*`+Y>)m&+g&=pxmZ^?YT0(xuw8xal`{i*>#Cu3>|yDg59~RloNL-_ zsKkXO8V|kvQ5YNbm3Usf`7`W2D$sCYk%r%RS-YD2sJ$!qjQ(BxW!POR`}{N6=k0J$ zXcrxYnOtJwBpFnYe8wEv44vi=gaaOYDg)JjzhF$Mz=*R0BhIoN^8SMn=a8GlKlguO z;2wu@GCIs)G#W>Q#Tp!iXWkC;{U>;%!^=i+7;uXV8HTR|S34jTay)*Q$Ds{9x^i3&rJ%9OP5ooXbX@U>C1m9?;%;Ju^j^xY`|$IFpi@_8RZ6OJXn>@ zze&60A0!FY%S6(V3l+cs}FU8n96f8KivR?N*Fo*TIrF@VzEMAR=p9)RE8 zjC9(P!3m)TJAwu~)Sxy&z+i`AFfI({i;Uu5K6zf8fW)82Z*AAE{j$E7EMC33Z!sGV zV`);i+IA1_gObm3PeX|-{dj8Hfz`R|o`SC36TT72n9Eu3jf~RS*$al(wXJoS-uND zh2?@bH{KVV$SV$xGbb_|yV-v)Dv+^yoX6?tA?NndUx5KV zd-dZm8y3Xals_Jo8_8NTJS?gQa?M$pB+8co)gkD5jCL-Fh6NdZ{kzO-% z*tVS3zw`f0Io@BMyyKt4yEl6q)~kucia1StT~8e-Q;M$)ocIN>e%26qsQ;!^PCe0Y zc;6c*9MbU<;vifN>A}zJ>Hkc3@Re8Tul&8wloS2%v_B!+StdVor<#cUqd)EsGvRGQ zo&_&4(4_$@k|4$Gn`!JP>Qg)8Yw$72hFXPy2DLC63$%Hq45Pw1@d8K_l9B>_I*`3h zKQlfHAIsOxjKbH=gvq$~cw>#%^#m|J(0C=qw$YFEw%PIBqar!OXX)>rNNpi4RQ}dh z7;!SJc1D&q&z5Pc&6dapD}|?8EFAkM3PuOZ~gkYbJw%%sq5BGtD3fI)iiyq5G=O|2#ys#CfOv$g0$Zl_!R5v zdhHAV%q9fpzVSL`^o6e@9^-ZRdiEd8;&~GkM)3_erRF=}A2lP7sHBV3h8U*f@;#)G z^dV(r6vpK%Ae@hauy7SLQVyy%(oU(W^d@0MAz?~206~!bu#FzMXq@_IB;o6JGH@IzQUmt;E}_YquUhZlSMifoW?W z>YSh7`JuH#*X=2mbxQZFW9!yF{Ls3gYxnF~+jy)?+2Ec-yOaP&K)An^br~9XM87N< zKD=aTNm*IR`Tq{)mkcJR=KoG;VviA(q^!K5lzY&GNI}w7|R6CO!7C69VXFwrQoH=mzEPG6> zu!|KS3zgzC9b_(>rQ{+w?h#5LC$Cuc+@09=xu)@yU%+3A(q-3+eE3WLx=isM`2Y$s zvK9_nd*y$FvMc7NNq^)5hjz``%|x?1w>w@P)FCZOC|URV%QD$^WYcG^B{o(1ybY}P0Y%I$0ANPri689ckk`|wwu^bN8bOQQ}Nlj ze*H&qm?m~}sDUGNz@oO>#I{qBS4thNrF&+-{o~2U)tc(1vuDfS^cZO`$rpOsj4gIV zo*gzJ+=D?%=6sKa((sh|Np*^j_1ytbLN~g zXU?4X_b#gv?@(G)vNP!F zxPYLmE9xr*Tns@|A84jrZv)_1kP5l!>Pmg(T6RB`R@O}}b=;K-U|6+4gb|lj{M0tt zW%Qk0i8E%7=}@My3LO{GfG>YR-oW>5*l^O_V`%$PGhrvrfSpjUJ8iz1*#i?(Fn*}J zV%Z9#SKwr7Qg3RpdXCA8Wi;QD>SsQm;NwIv3T46>qbU9GjzMibT=iMblgNU#IyX-% zr9lGpBUP%lhUh z(?0&U`Kr+QoTpG)wS98RPT+T7JQ>{sZZ0MWd3qBGBiHzZj6w8fDj-i0 zobP+8X4$tlzRevG)yCP)Q;6?kjM!IKSzX;@dU{ZG>D94SUJLQb0qw?*WtBbwVLdbO zT?pOSgVK<&hVD1~cZBQBXjMN-L%FMirICObN<*^mYi~gcExNH{xrvtbj-`GUx>Hq0 zQG#m5SF2Zl{ne^9U)S{Np5Ci>w~U^5R^nT#{emW345(H# zyB8LAAK9&_s2fBQceXQo6&l|+*KzRymKXbqB(saTG_jwB4WXU2xh|z0NY$5VdOM1-Kr(0RMuV@G>Y-J%If<74{a3Ym-L$ zP$Y7xG@F2oZ*MJ*?XmwhEkN z?9dGIeKeR;n*}bgv}gCOC>uQhqz@d}8zWvF-C%KzlkR^;jb*{I&C8b-_mz87ymFcvba?(didPQB>ojAEmWX(r zk?;~rm^nnbwgq7Q3=slNL$pW*(l_!21AQORHPBHb7^Ph#UJnFA;EV(=i`Z}a21fcV zd!^A5n#N*wFEPf%t;$GOME(DG94j);|2ZgxT&)oF&Fa-7y=!t}LR^RTEjzmD3gC^r zP3+a@mOMhoAijpuF^|&mETfC&Q#vA6q9f-*z8gik$N`wvfIt8NnFG(Y^CV? zLBM_d}`+KQ4<9r1P9`cBbyj}4D2pG08?L2 ze#=?!4+qaJ@8=z|YRZrmQm-Ceevf!&753>PAoEh)DK_X5k~^9pmW&}* z1@_Q#O-l8GWs>P_rB$t6O?jQS_`$0c_Y#xuRlUOX;P7I_z2wCEU%mh*d~;OUq)o;~ zTP6${{eH)YVdYzm%{ERf8;Rf~&B!4@5 zFQ-n)p5LBV$L?^~57rsz|H2E(E+54Q@Gn15`Lq}EWy?`)-7yV z5@)7Euf{(6pNW3u(Fxf-60>5X%Ki2I%cEkm5_@DPM3?(ne)d1?ptw|U^>TMfiN6+~ z;^OY*3aN3wed2G@x{qi2vmdz4j0K^Exh`FI1qpbQkxviWi8@3^K5f{9Sf{!> zWoXtZ=sW~>M(qa=W$)IXu74J{nSA{*j_8oCOlx*8S3z}1*VarSu?no2yHQN&m!Jc) zo9?L25Na6c>2Roxx2UTJk>{^+bLsPg=<}`&&oq4Qc|zCLghy$=Ii4{g|1r{KMLCuM z&}w+Jke>zR*~MT3L-9iV6fZ<|2P_23eFw=GzE+0*Ist!VrO;T;)`xuItQePB>?z&?$0(s=5v zV|8_C5|NT^**-+<D0H)C zf$*xw*0P;yjhjj>Ycd;|pL)L^@w9YrYc*@jd#+i9owm1t}@zQT{9YInG zav*0>A{zv2g&CO1h{wV$h-M{%LR}Rr2!e>*s6Si&Y@yEMmGkN&AEljJi=Wx7$prERp^{KYx`S9vapmyYcl<@lB^ynfQj{a>tL)9nyd7 z*#5t!CHp2AnM8ObC8=)w8lRdPKO`C;IZhd541ZwzP*U@yE53b*%|nmVa!$`nD-E;1-E z#W5taSD)>wWKO@5)9981TqWZoo-^HD4MpAZ&yD^+_xW?M8NW0Y<(202!QXjW z_ekGYt=hF@$r5P2y?a*QZri!aZ#Lx4^LANK6lqptQ52}`nsH5(gEu7GxuI)(bdTox zhnydQ!Gy6SFpvV|0uuGHdPeFW3z7l3B-UYPZP_9wbzL(@;UHI?1`EL$-hN*|hb^c^ zU$Lq}$VV2^e)l)dfjvy5sN;Fje@8IV+VY4LsQUC?FgUW0yp^?|bC8>VU}U?wN%=$V z&A-$&^mg#;q+o!VimPA?v%aMrVJ3qu_$IW*RmecZp^*ELwH59Y9OMKCxgE=(W;a7f zi27t~K_?d_QSxcgzp-W@99_Nom<~GFMVXc~CnvuBTn{JrvDuxxmwGvP@U=qTq)B-~ zKv=jxm?oCS1-6!T85A4Pn#@_monc*c^vIm9WKKI%eQ{1L`StK{BXaH$L;^@dq(#+1 zxhbjXNr#ZmSL@au6#%E0b_(bDgczO8wHXn>*ZPNr`3nQe%LfQfgGhj~;9y(WH6gIQ z5X>;*oTpd^VOaB8eG*R(TKbH&1mW1~HOF+|V3IN|c}N}FzMNn)prT@c5D*y|@B@FC z_6^{kv);lfT6KYp=V-12bUYoo2l;SQgnWu%-sq>*Ykoptw|ZZ4N5849Y#s9xJGxc2 zvUcHK3xv^c{SwhP+RMo?A~&k7Gozm4rSJop!;Z{ht|!4P=gF=~K0H1mkQK7ug?~ps zty%pO>S+`a#BmX!I+e@11o77%3iIX(<43Tzc7n4*S@By^UG5nL^Hh;Q9xnC z%3<&Zu#tvg{qCVVTL?gO5Lm+Fza%{8uySGl|6pxMTPzvti1_c3aAB`ieF-v4FTLu2S8@Q2&tJ$;#4zVO!{^Pc;$oXjV{FzrHTYoiK%TAxsl9 zD&HtObyB|Bm7byOzKg5eu%_FTR<;ZKZ`h*NO8xQgkA;G1DRIvA{T^&55Lsor(je6+Xn&RM~0cbiiZp>%266ZrEu~hSU=zN5*#l6 zDCB0ZnZ0?&s-BWhiQ>7O;Aza*68f2%(6gGRf20OI-b~|OLyPW#JHCET^`(f^mi&r} ze6A9|y?pr!{!2pTj>><*kSk>iq`Y-bLB_V!=s|@v9*x+QF7D{*DwYhzX52NvN8t<( zf=&i^q=E3t=}pWL{B$~Ar5>v@8Ow~GAvo}CSrCA_aHR}&j=y7wH^E)(O0>0lm<3

b(7>T&1{%W+D%3_gwxcBR7_myM-&X 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 DnuPx& literal 0 HcmV?d00001 diff --git a/auth0/v3/html/_static/css/fonts/Roboto-Slab-Regular.woff b/auth0/v3/html/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..f815f63f99da80ad2be69e4021023ec2981eaea0 GIT binary patch literal 86288 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 z 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

msZ%O|+*Z+LS;;x4v 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%0AU9xwl*jMUcB+ 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 NDMp1hFB${m{{V&DCTjoy literal 0 HcmV?d00001 diff --git a/auth0/v3/html/_static/css/fonts/lato-bold-italic.woff2 b/auth0/v3/html/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c4e3d804b57b625b16a36d767bfca6bbf63d414e GIT binary patch literal 193308 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

l?s7}*4vp!2W|88=L^r| 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

nR1?qM=|aYy zM|LKvB;R5NJdjnvur6290{d8I9Cged*NIm)9^$pFQJrfD+j+BC7Lz zdBM+_sMrF-*}F4WJr3IY{|d7>SbJNQj;pep}-z1sQ24NzuFn z$Tv*0O}NpTGG2eeIYtLxmU)<(e~_5@Cz`D8~v_{vD8|Z-~0|2_b=B zZ5YFysc?Yv3}ND$Fa+4C+3ETJhVQKXS-mCE@_%^{iML*s-(+2k(Ly?=3%gh!Vccfd9z@eKFD;7)E0#{lEX;$*lsz_-(q zE~Gi>GB|I53D$WjHaa5sP0hs$>u8g{$E>W=@H4RaA+ZDA5cg{@%+=fzwbbpSjqT=) znpCX$;+#H%2k7r$KG!Jp`cT3A#+|lD(kTC#k<=B@P_qQCCKHO!m@C(1 zA2-Gu%qW%RWTD1QcNy&2;ah*VCYM|ww5lcd19@r5F=NRd;e+NIjh=U2YK`5KzeVh9 z4^gBGldr+%yRw5#&Cw_j7gcpFEIJK7!u^1P1S6fG-Zb^KYyO+J=d6NDg3N83YlaE? zriM%dCg|1=ara%kWb)?_&;IMugK@){n0t;t)z|(!dJnxwcV-d}{mQ3_p7fVJxqX}Y z0{BFA9Y!7%nDSrjEmi);B_HP4!D82Msq!77H7^EHs!0RjA=!b4Kg!#Y@2|IhlZi{q&;&Wu}?mdf+y|OCLP_0Z&6k(XqBzc+k#jErrcFp% z`F_4{oT!|x8bmC*+GX#ncb}50tR+%Mv}Dugq~)-XVB8SNN)adM&w_;f>1)g)9fKdK zuhiGdBtCvJP)yKmTC^R){sg7Wm`@38MSn6ir0edX9-E@8fZ?cLDImSdP^tg4bLw)Y>nBOx!>eDY!A^t?F@31F#oL@dG}~Smw~LDN!qMsCg5Ak0;!!$g?%tW`c)WW3WW`R; zZoPjRm<4!3l>xqts+A`k@bq=`nnb_rT?K!UJ~+6F#Z#gF%FCoIA z2ye%*gCXGcwr^==0ruoD+%CmmEhJgYgJM(GxbYP{)@{1l`6w8XnRnN|6~Q~lVNBod z*k^;>-p9)EbDM{%KY%**>UJmQ^j%J{M!^g)1Mi=~{7piq$1kr#?#(aH87{O{sc<5y zDfm4=&I`=d7avfhd6&3lQn;@5{!=5wsiRdm8!YD+{`*>aoM2N9jrya^6O1?ag zaGPI#=1nv*i!KZ~LY-(Q@c57S{)TzHQX)gW6lMsb3LFYmX;kGV7fRiHh4i5yif7@5 zf7b8CA~V}%<_Au?WvT0-ngHBoQ>sd03OC6kcJr0;MuW#hhVS#FQ|h36U15G7;{uoRbmryhVGanA(3KA zbPOM*0!SHG@H|USkZhq)knV$<1X|%%0N?&RjU>2C*mN7Zm4lm@vHd+1SgW+Ol)f1T;s%EOnI*Hh73) zDtZAS{E5i=&MuFlvQ=LBFlAaFNtkozE-F+Zf11>J9ze^ka6EYC?}d77%WVF{{lmAY z;-4T}P;`78dps67ofS~=vjIip_hrcJFr%q&eeW3hR1l3*E1@afilc#YGyLE8Q@G*7 zK(FwC1*C-8vYR3EW;(Kd8m`Jk@7K=i5W5~xNdO4tay$bT zizz7Or$WQM?Kadun1z2amRC3Q)h-C%V$taYkQNdsxonDLT#{xKFFRi!aoDk=;*Po0X7eepMB3m8KC^bd((@V}xkTgqTBdof9gR)9}<`un^ zXBXAR>!i>0)z5k4yLVHIJ19f?G}>Z8PLtuMUYQHS!1el3K|;qoVhi=hiRT!dkU&=4 zUKETAv8YmkBa+Mx&0QRc>X76?x~FyE!YW{9G91f*!wO^hNL5=J;=^TmahTJ>Pu#_# zgm%qcNQ$8o;h>uaNs_;h<|!2d0s`qO6qIFsG_w=HxM9Q4w_H|;i2ASQIFN>z4_rR5oC)42qC5cFAJ z@kSh`SsGG!D9OaUC!QdY{)LX7vBPOL3Hm#6$^+Bjd|Tdzt9ayy)31J zN@mS5g|7G1M0|pR^s=S+$_nh|xhrSWfhnK!*&lf$)rWRyOJA=|LXGYU{tXG}YiQtcznCyIRX>Go zB{d@i7zeI{7k{uip^(f5uva4*5K4hak<{D7Cn*8uA%IG`xhG%v*wKbr`h(WE9bhG4 z1N;0co8hvGvO>}5jcwPU?+@zmSgtYd2{ty%bWs(kK&f< z>~osX9dyD{zH16TM#Q>}7fPYsW_r|Jbo-hF+elLKFtP>UFMZ`=VZOXF}y%VkP1Bk!qJJ%#) zC@?YRk8S@9VEs7pKh@MNr!~_j;(oUT!m0`nZ|IsppVa|Uf% z`Adju_Sg9OJR+cw)F7s$pj>QaY|SR@&5oM^uGi#SUVZ`jSA6_|aQwnXpv~Ky4(k;L zR%A??9n*?6(&w0Q!e~(5r_elCSDT>=rf!@RCe~3`3p&iN4h-Y0Pi=ZGSl{e%)SJe= zP`hDIZX|^07!KPXJogWGUt$5XKEOyV^va3}G890MP6BXEp{Q<**>|b8pA--upFySjt zua12Q{NN8YZZl-*6Rob$W7+J?mR>PjObRrXD^sVS zk2himkc*^MVTvnJD*y}nky+9`wK1tbtO$O*&I_y`W##gU;I^3bSTtCSV{plAq{5j9ik_^v|ZiGkr zN1e^tHD)H>ez$0@1}8e_p^HP?*Vi@i6k@HM=_u(B0@DBAavxjoqxl7xo{cyJ7PttY zGj&b?AB!~bIc}^R>^IJtICdzK>A5&4a@qAGR25LIaJ?f_Sjb+?N+*BGCQ^WGV(uY1 z06*;b(>h~@SvBEPAPvSHFev*FG@A)w2@9$*DO&hlQC0a5kQ*L-F+I?>=2U6t(du}v zM=fiCv3@YuR)wRTEQ;2$W;`QffbMe`3^=zR_OfIOO4u+pY?Ue`DxZEef+-45C3jwa zRYfjYr#e=jXI69{$2j1YrD6gNB?IXclQhWOubLQIc+9Qwd=mA&en75olo- zH{o1}Ldg<^2~PfV)>?HU3myGp^O&)upCcK|TC&yVcRNhQAa6Q>cGA|;VYsHu&EriJC2~aWbKMxb7UB8Jk!}rsDG-n+WoWU$#d?i z(gm5l5C~iouIe##Nf&`_rnFSc&=u9l%CPrblalFH4*7|DdE}o(gNZiOtcja^YKvst z+^@I@HiiMe%1EP4*DV@~R|9G{25(`#AV6@$2tnuq{xDdM1%;N+)5RfnJ(!5&FU5~U zTE6nTfxn&-8$k|-)f2Y}d1Y340*YmPq#K|ip)6cX>SBp&cvQHWC2~>~QfCA%wtfCy832{odNO;*$mf?dx#dURMiI9MZMPO3JG%L0D-a*hCHRz6JIb9X}L;y7fR;ZeqQGH?ggSq zrcZXXTbD2@i5+JZncU%;`lk$h)bW4J4MmK9JA+fSp4_3B<*HbZhL4jwRC>U@Uqfg)9N+FngkshorZbjR5(0q}AV9VtX9u+8xK_pUE*2Eq3cl?mFP4NDr3 zC{#_I0RKG}A*g+aS!uybiIEeH7N=T*5e~4pCc|-9lGV!Da8;Y$*)Vw1QpNU=jY6Sr zOp_9i>FXH3PGAVe=(-;CxY?Ea^W{jMhXIR_({!^St%d;#UxEg|yz)_C`i2c;v=^H->D97p}ZF1;^EU3rJ}< z3B>hLoNk|^l$o0Ao`~qk&EJ_Qn2DeMx&WE5^J7e8UxbCr4Xujm%W-0>SCa_1}x51vt%)bm6^g-wbIdfXCqpE6n|#^S5{5apzz}ChSa__!2t$ zyQ(K-xXlC84qJ}7FA1RQXBJ=-WVn^33t)huJj>s%Ys@+8=t^S_=^VXqD*=g&0Wr~~ zm^z^93w6htZD86($Ps)pj4&gQPm@qM1A&PXW5DwtIuvo=`{jp9w}79sz>o zAJXJwJX{Vt-%+Ltjo8(T36--_H-`eu^j~_eJE9`_z-G!nL7&e_8JyN!31I!IPR&5i ziG@~MWVx(Tw>SLkaQ6jM4a-T?@IG|phKm`>NV#y=G`B=0t%LFCY)F1mP^pukGSa|h ze9ZzAPYm0VmaWg9bQa6F?b#X};XMl8UvXq!WkN_@mdl3C|CEKinvuKZFp(-DFvB>CiHM_`K zdF{@mr0C`^tArcC4L)a>-H`etCPZu!64v~kexk#dtyyRB#I|)i*C~ybHJ-{ok8U<3 zU7kN8yl;0IXcr8?L;5$%J$#z0C1k5~$u`_*0X#RZni7LlcG77!?3mRNJpk>EkUr98 zHSW_V5%)umf6|n+u-lb3%C_lMg!4*Q)`0U2LCO(qu^gzG`XvBOvaevub4QF)sk+U> zon{A|_75C2I}1_TR0fi5D<+xpGa=^Q@l!RDAO+N2C19Mbx{G{=%;9p9uVRwD(m+2L z8i|sEdI4d0B-kRK{D;MoR%vvxvJdPU?XGyUzzBb$rzu*q)Q1gR3Y$y3LE+FrDT*3z zQ{XL-qNC!@-#`*TU~9+CDagRatrbM`C6FHxsNjf|ba3KymTzGVUW=la&a#mjSBE&O zj{CY~gIVF|)&KEX@da1djX#?Yq7=$tUf~MweTCKYW}*`#Rb4Ur-NuXG9aU%2_TllH z+`wzt5+qKAH4P(;h|#~OL{vLe=BUVDooYL)&CFZkXZqRmW*KHolV54$C)Q^J!m6=N z?zhHa*{hn7q(FZ($){W^=bUoCqHNKMZ z2PQPgU^}X2h$dX7G$DQOr?bky`d%>Z*U?z{IO1s0#6Q?!DfUHS3Hw0uo~J8-z!^LF zSm(>41XxAyi zuvS~hRB4l{u>sRr;1t&INwqL3H5PdV!sc^NgcjwxOyQPvRFa(a6z?Gys_R;bEF_Yki9E$Ga-xU2MeYs_=62of!tL#0KB3Kx6l z**vtuQ{X?#7F{E%wa|>afk-PAKWi#u>7&U^_(~dSA=(qt)6goVFw+*aiTAU-n-z?UVBzq)L6?j*2s!K0DjP;}l;DqP{ z$CZN|@7#=ca*G|fFymHs$r}3UwkuMn$p_a9+l%|<)?%Pe%^t6PFY;Jt|7zMCvux$P z_>LpqZ<~*UqKXdb$72r%5%vUt}u`qhq5mG`;bk0&W)q7503l+ z?3@RzF!LnxzL0p(6SCHO0U~2H<8t)ix|NT&1rI^zn#WYY(tGg-vYNCK`!>SJJu=4l zfg(+F#$HRTF&%_+^e8029E4Pm_S_Qlce()lP{v?a0h{g-VaAdLc5lQkU`oB~Ur9mE z5(eC_iO280Fv{J#MZuFCx5$R(e-`ORvkB0ifBhU%l&sTN@#vmV`aD4#d{^PHd z(8b?fRJFlmh=VG>sSaa#Aw@(Af%rZQ^a0qK|2mba$MaXDW>RNL2rZKLu=6DML;zStVh( zz%is9OfoSa&3s=#?Ww9G$ViLP6lDJeoXPE$XdykVjTZ6b2V2^D5s|}{g>7C)(zLh8 zKX3_sVtItW84uAqXBlttW~xITB}+?3$4EKx6q#ITs_8TBA-Kz%Sh9a?%Y&PhSxV6N&4I}i+f<|ve3plshl^(hTHwe^4T1y_ss2cO zHa&&FmdXG5;p-ax#TUaISD!@a)rA$mB0``#qXmhZf#7#ibVeXhx>K-(MvMn{k|s0q zhIU!o7$^>k*ZfW-JC2m5xD=BtTYE_@czMB5pbdW<*N=BssJhGIj?r3xq+ttOVRd66 zT^9($k95VUsz7Qr+JFjPHbEYB{U(0O+O<>E0z!35NeqEg!7=Lf*P7m zN&F3x_yon7b)fhpnJgrbD{7_DV7m0fLIQrub{egOeYVj1?94XW4o1Jn8xSenagNLu zVOM1yKI-`{l&~G+`B{&@K=6E?kbmXv`;5)O{T_c3hQX$E3!R89mKL2yaR^?hXgqhJ zTzy)g-T)HHn0t}|A0phUvA%{?c#BjtB{Yqolm4k?DVy}qA~)~@rInYteEn^Opsg0C2w-Z zQVC;pDo9WVIf#KIb7GGdacm&`WqH7&ec_rmf&=f)vFJWY@!)9(sL487pzNj@#1e$H zBTP6!nj^wr;F*7kiQ>F|_ZQ&UXC6De+4tT3hgbRdc`KCl8O+4worBSeo+qpbBsnhq zthR0sJPjVJr?+ra&2|ZTHFNrCd*-dz;)<7&FiW``w#2Ygfv+#OrS4(h;DWW(yDrUX zXB~D{7~k&OcEwua*)Pv)=Nx|Hd=sI>mT;7&>qbvn9n*@el04+Sm#Erq)C3rp;YO}| z(|KuS23;3^+Toa7q!&lPxC9>gPc9n6DEE~6S*OG*_q-^ziE+rqMR!%(jZ3K2 zlkTW%Oz?W(8*0SNRJZ@~-~u^~X$f#kd5YFPyrBqfj>2Po$4B^MWZ5P1i0rljg!9K zFFk{xDT5K09&xH>K`0M;#XcC&rg>o3S*B|X`cEG&_=YTLy4BG->y=)1K#{r&bqqcZ z@XRPfmNwpMZ<+B*D?gZZF^oP2AO9P6!m_U+ulE#o2s}h;YIGN{1W}nEE;;vGK_|wL zgq6B1`ib(C_3TljNbB^9y45Qx0&R`I;XV5%8Q|MJCZ_~2#BCIEKV7|#>tEEmLR)OztNW2~_qvUlvk`prm zI$EUZn;-mQZ*3=G{|E45ZCFN2SasC>g{u%^kMC{DUFAC3CbaaQj{r63gu`m?y<_Gak_SBQ|f257Wp!Vrk>|NqQvpp>$yQ>8uwo0Oqfla6@T$$ z{4BjgAE*4ZpoN@TS^P`-3hTY7M0$W$u8uD0V}!F&&+eze<-$GX6wy`=DQC0$`jvXQ82S0O;9PpDOt9p&Hb<_ zggG`!d4OKoFo3ouFr^-aY*b$FE57~1g(Ad$p#u%1U$L`GzfmgD1*{fcQ2@(eNPf>U zl)n!}6jr;5+3j%|^weq1)#ux?D;I?DEm8I8yufr->LRbGn*QmH-75E;mTMTyn1bc0 zYUaUN8Ue&mp?RR^yUhHBXIPw&dxWUTgCV&Wc%boJD)sjq^MD8~e@s(o zS@DGbt*onT&t_4WX9@s^+DY9mnBbo-8IeuTP-hSqaMATY#TJbILF{%e9R(cx>bCSp zqZix@?v`7YoIy|DtG4V7X4a(El&+^W9ix(`tzM#_X9F;U&Cs0O zdyZ?Z$-kp3Uqmz%(TxwtL)3*zEA2*@iJEhhpiszDx#%S)QPWRimO)Un4qch!nf5=2 zo&~`yJB2>k0G2>8vkw8bhxQvzFP_LT2CGT>5~exiU@h0=F7RyiZP|!i!&@yf@sIDm zp$%mss)&_u&n*;7l83_JZc~(J51(ksvfR&Rc?sVv82$$0(whKcP5*54(x3oH4OHrT z{c<;gLrXdxHLF}JBm^33!v`Q@+oM@P9c`pVov+yPwU+~2y&JmfkYnCf^HBQgHu)d5 zJ#k^dNxSox4gr2#jG4dody0o2;Lgrzv+XqLp=-D=$qO-wQ8x?a0H;T6&#I`UHsX}V zEKl7BVTZ?WpH7$`AVkYd9DeVrA4@3lkyV$SlM@t||5)i85fo7h=(CsEKieUy!u#Od z?AGK&<<=|&DD&=D@N#9aw3lDd6 z(qES+-Ovrqig0Em^-!h9&ElIt07pQ$zcLktqW;$v)TRuLJ2rRey)BK{1AQJIQE-0I z5|9D&hPb*i0Em(5*26mDq~N;+$)bGFeX2^u2`*2l8quam+LM~{EMUN_>@=Yndcic2 zbRi~ET9EcUMJ&^&JCzxM7v{$O>?a=0c6lk55<_P}NYl&6XTzR;7i{%X^!y+I#zpDU zOn}UEZg)_F2racmV?9D;bUTV7_+1L4!H;?G9yw^A}0>W7tMr$&pG zHW79Q2D(WY(s)eQl*FpU_!Qy-tx3^3Q0a#W#YJv-0wBcWqh?Y_Z;<KoyVz-8N7H-{@|+V`mXJSLy1@Q ziBX4^BCs<7i{Wg6!l8dfPT(m%#IWo%|4Iu2#zdFV65i&-MEJc;ZF%&7;s=KPiT8$^ zk|dY_?s~|2y*YqH&Qgn300K6?G909Z2@w$~-?%1mT>XAG8T|L2FcKqEEna=J^#>fP zEgZs8y|ZPeBC1e^$*veUt`(?uFO(n#T$kt8;t6kS@WG#Wc*47Q9Ly77;rz=kEF5P= z2tpPELkc;%Wrj=|V|_1KI>`!wHNfd7JoyZMcM?XNO?Z-zC}*_+2#MNq4~h6qYr`dG zSehthf`m;PaX7wq+qK?0cOpWof z3a&qeK@1Hwq(&mJU<(<-E=TaljfhCb;7C3nYl)Qv7fQ7YZm88_V{&jjM|~2hj*O?! ze;Sqn0tuP{L9e`{#TY=_^D$%seeY}>qMDq1{>vQGro{&;Z|G^bFdp^Y&77Q!@jq>y zP6R|n^qPaHlw^%3<$<3fh~bX&8<9wp19AY5T^0Oi^vKRCiN_~%!8u71)@x!WZC7jX zW=w*?Obp5QN$p5#Hjn!3Adm{9&r<5)W^I!v?b}iEBN~XeP~jDajKt__D>ybzC_~FB z9?ZG$G3Q$kMFI+fh)PxYh%2Wl^qwCf26sqb+|)54vU69^0UM$I_PVeAI7SOAq%^E9 zL5qwA_Ap(g&B=C~dFMq!)kv;44lI&T0MCHrl^GhGsqguAg`nBV$LB<=xGRAslR#YUGv(k(fo^ZY%~6oFdPrue1VpSX zOs`>vVskuP&V0LO$cHBT3@wElv+~2z@@TnK)>7`1Re~8jPN%hVBQ088y|6u2ZU1Es z*}B4ppsF*c8x{}%NB)g5eeD-(hKI+S$W^}nk9gnXnbGWoGVsPOLt6|PXe*t=2?5|rg|d+N?L|i`CZse<70s*PTnipZ%%^9W}d_1K47*s1+Jwe+o;Wni$ zD!h;p?X2JNd-$ z7M5rm;*lbRsm`D!=2u>5LA@GK7$$ z)FylGT*}S0`IjCO2-9N33`&xm`3a6Irb*p7y949`waXpBo&~rkE)ligzD;9C8{1hp z3i@A!y7Iudn8W4&Ks4%QygIu+jz%SLMO{ChXO#QG%UR_Bm4h_NV^FZ~Q%9h7y-Z{j zbO(cx_X2$sbNj*jBzEoho)i+|H_!LJyKqaCRTkw#{eZi^l2a52H2rgTLx+h?NR!(L zx^G@Ngf+(Oh*4F%pCr|4S;GvCfg0-Y%N;1H>QUjPyIGC{?F*1wA>wNAY!VAs-by~y zdh9EJ)DDDO#hgeXgakPWfw;{MR=( zSYp-<0<`7iAz`uoeSCtBu*92)4f=6nsTsh#7wnKARyJsItx3|Yon|$L+ce4dcY50x zAm}Va{LBYvR1(sExixx&xD@Ub3NL1MxH9Lacn@uZeUESC1dr4HLLm_7>kjfgLkPro zHF(Se)oC=LAeRSVik0JhorwFmME|@%!-u)QXWcBDkSyKgk1Gl4^I0z=o*TrSK2UyD%>uF%qE;o<-z+9#_>4^6`r za(%|p7g-$rML({Nh0Fc-=&4fP5<=6ul^xWk$yHCySx}%yR>YGMvI~mPWdn(Fkc%)9 z%P-7+_6VXAPj|edN>1FmXcfmr5sm}Aqaojb=Po)lZ`N#pCC|Iw@f3rYO@N1^u9(aH zDE7mzn;(nIzE$DT*Q=vB@=S>fZZS&@{swJRT@051d9)j5!YpYT$DzO63|IncuzPzj zidthrH#KS_8a^5W&oomHkcm+%Kl@3vmha1aBf}%JHWGn^-R$Ug=E`Hx(s&5^$6YjS zRFlQu37Q>GhEgO`j$rQt&iLsl=`%5W@}QfVV-zHz1zr%C%T!F}218%^QSUngl4M7p z?~fRONs04uB;H#Y2AkePSh`~ghQP*##zDOuvdu^dcU!RkdlZD9ipGxHoNgh^Ht01? zksp+@%MpYUMhv(15!W>Nj*8)^f7iJSIQhsN0*b!` zLO(kA2z4CMwkl9a_%W5H04lIkRCKGfL5vjSIg}7bL{Wi}`3#WJ_g^XSw9G}glw^Su z935rLGxVz$t{~c00z~u!D9K+Zk_!sJ`;b{Wo`Orxbktg(wn}qNE==bb9n%%~SpuC- zOjoe|k@scm^Q*G~dboDvhrEI7ss-|p1G5pFKV_vp0Pab5*aurH-=4R zhxqlXdQrB3GBbdJ&HG#ML4z0BL4a|fD=zRaC@tp=FB=dO#~ubo9WjScLG{#L%W?GgAKuI_$H+Lr%AXFh*yLlDcKX!|1)e@UmsHwr)={jB9T%@*B= zEfE>R$7q>KjnbKOC}kjUL#!HLCRz+0dr5_ekWq3e1R=?qH3-$0el!%Qt-YcDNh;GL zLL0!5p+xL$KMw(nGvvaddUqVj$h^zeny@6JRvBgeOj{ib6ZAwFdo)G1L<}mt1~Utg zGkS$g!Hh_PD@n^r!EAh}fUI7z78g)`*>cS`i|!+~Kon>1BBumYi3~_hq3fypH-O|&v+em5!$!*k z9=}5yfQ#Xy;s>Qhjlhoa<&fn=j6F=S!{{Ak7WHf@phapci-0jRuM8g#T=4L$8~g()Bw#z0l^>GvAL-X6ceoo%w= z*f!%~mftS^`7di9z-iXyalZ~1fzxHBCYMI7;>H6Aq1~EKmqdC!?A_XvTo3GEY^P`ZV$2$kAFR3b)|lD`!byZOR&94cj*+6G3KX12 zLIpV6e}v^D%>ppnT8XcM9T3xIhGUSt$0`sO4mr|K08w|V9x&25DeJ0t4Htsq)o3nIxzXp~d*` zh~|A2{P58tiL&m%1iAYJcFjQ&&2AE=!BpmT%j*bwX%*;z3l&4|Po{%@Wzo0jspz>V zosX4I{+*Zzu9%+rZPa_3UsUHzZnn{J09sDd0!4Smr+x!&5A*#E1A{gH=w-Q&v3u^K z8V&vYSHX0h%YIp2i2S^sW~#mBATZJCzH|Bn5L!EZrS>>4+G z;w3v!$8cju`E_w6Zm38|9`KaN8?)%Bin z9jE;9R;GAZvwboqQPRr%8RA}TTda!bhB;9&DKhG}j+~7BVM6^|HW6x6g6nQf=>YO% zK!*olI@4TOsvwe}3^fOW#RIe!G){~en1x+E6IT4a`J=;qHJ}9G3Y6!o>o2&JiP|H3 zDMhny)9L2g1aTvtk;m@#)3)BTRTForytK#-93j1@Yk+Z3k@5u4?oQMns*9Ejiow0w z6Prci*Gq;DWW+`zWZ#3z%;OVB1@W_r{6Ouyvih@15SMv~AUu3a8skoC`Z++}@Px%` z|KMmGX6u-?fW*zWV576&p&IB;%=50jebkaDX)Bgw@?18{Dly#GE#Mp6ldnEW9&ZGxG5PxF2Kt;H&k_~JR z{=MPc8Ce`N@iaJrQ+lr}0*(C)`(o0?)(Hz@@u9n=5XU3fwfI)}8#3yDzV9lbbAWuR zA%s|`lZ8R}U>PXZ@kDdkkDC!Zg{PtxV9oQ>wl_?|gO^9-Sus$>^_c*w8vD#P5PEcR z9~7h#hv&IbNX6}v!j-BW;HC37JXUo{+!Od;Bz|-!tIz-M_+B*Q*DT|AzAG^Btf;*p z3p5-=D_()d-SHoV+yX%r-YL8$K_=VS33Yxm^RE16nbf;%Wcer3FDA96-dHe-T z>dS^T%Ug)-hnr)jZ@XB2+(1TBU~jmUHc090Xh7v=wX<$^xeWGPE$lwx`?mE+y2Xpn zIIZ_*2&HLf$j(4a>(PjS`QYOW*C}K9Ug?W&rSVE$W;atu%JPWh>CZGZP%f#u=Y15q zYNo6!b3hpZTFabiEF*b3BT2kk8hu(A&~R5FUtou_3tkVR7xXPLNx1>O6~hpZprglD znD|yxh=2~}JZGc!Za?j_spX&6d1*%$?=W9*yEp(&o*u#|MPQIBluR*^@&29$d&Ez^Cz`y z57tlf#tv{s6|NcW*~(GZJr6Pdj1GGH_Mwe|WypNd;MYqH|If9EFPyUXQRm~uQ_p+# zjmKVxP4-DCA!&4YlRqi%4HeSgXEaDvqK?|YT?mtWCy+HqEVC4iD31p<1^vXa6VA8# z67<9rXD@T5Vc4v-WbeJ=I+CL%dNf|MNc;^YU?fzrf@Ys0o}C~kHf2Q>iP?yJ&B<%% z{j)}~=EA9djjO9rD!H6^ zkY0E$QXpXYaZw7SuxXx>lge?%Y$2b-g^@1#ZfOwV_C(BZW!Rl?}%Dh=rXq-VgRvx z)=30uTq8=&{0tObbvc0O`jqK7T2?T{wj^6{mTt`IC^Z?iV8E3i-<5D>s=B=4q%jQq~{e23Nw^qH#ye52R}Y9`$SfEQj=14 zTdbk#xhkuN?h=dzUyk51-UfZHTKrazC_g*49W5`|%`V7w5VRfXGjMnHT35j}r(K*d z@8E~i6LMwE1b}j2evAesFgT-r=UV}7;WUxX81{cT6%0-?UZASl0aeBv)47q%L>VEY zQ2}JP>opZN(l?cI5l(i@4agTGoq!!O0;2gcQZRgd)zaye-X5ZUuWFp_34l4V<5%pHP;+P~J~ zuyf)fO)v)gkbsM<{rL6OTX~-UnLYL4FQ(sY`VSAk#EnVLlgCK%J_&^OwugLI zYv5Yt`0YgblRg9*fP?B}_rNb+dGyv%RcpwcUh{*q#;v1Jw!X9dSc)530&{+AA}g>F z>riC5V}~;U*j3w=o5Z+ljp5xJ1SV`}5AE>Y=x-PbU)#OBk#0eDM z;VCt+9H6akHjS$&u~SQ*=Oy*&&Hu|oPAa2M_326mIO37aJ^3zaWj192&hSM99K_5r z$Vt=riR~nnzXUI-%c!a5Axrx&>pTY1i3_eUt~QTa^!qYsB!40$Xniw_+W;+`4;dh#OZkFZNS$AdRTEbjyMJpJ-W{L%pT^&6C* z&NbUNz;w2EnYzX&8l6_cO~7b=1UGaTw|NA&c^Er13=!IzfcA6-c(=z#p_+hgPpP_h zpaf*LpQ(g92JFnHLVC55l-t?bS@W?y7USWyZe z*7>3B^c>%;Pso2~(Uz>(=^*hd13k(Wd{jjxZ6|_S2qqmcS;_^jh?@xLW}?(!rh9qz&CdXC!~;@)%fH6Ar!-*- zT_E8jD|O}l4x;FR1o#l0S^p+8A1Tu>l?rm;%kz(9^tOZUSf7@iiqs{>lbxWFiHiNh zbr~^1`SRSFklYkC1eB5-F=x;T)O4HjrdF2$K(~F7klOqbC($GmMM=e9V>Wa~7dr?B zu_#2$|MPJFv4}oK6|}jG=2yKF=bd>uGw(@u5NdwiJAQsHKr+mMyN%wxU8=O%io|7u zZUpYYxyV*D;2Cg3?ZU>mvkJcvs)rRRKOzwhWKx06GHlQ%7;E;Ynf{;s!-R|4GIdML zR*V<0-YUydCOems2Oou0RW+vp*fO8Jc=z0MqSN4e?g4hg-)DOWPdKwVw}IM?6)>%K z$ix%sQoEARB1;P=*cM+QMwA8DM_|&XdY`ct%jPLv<`eCvm|=^?Qo#|rh8)2m9u!E5 z0tmaR@l#RMumVgrx_t+C4eR)H3t&k)(o&U?oDw&W6(h3C6=ITaeFR#ufXw$%&+y`n z9WaX@m7~kVN;RSsb6P_*FD?ZlWmrM1X4_cDHg0X4KmizaS(MSAK2P(8AS?G+uuC*i zG*_9i#abRt>XK_E6r?b$O?MwM|7#yZE7wgV=~p7mFgjNU!iW{Z5F<;*Rc{WhLgfLa zXrX3eTUud1T2@E`?Y0sv1Vb}q0A_Ukh|I$lJcAd43za&PDBAlvqu4Nri9iVyQz*}- zwz`g=Pd^&sGzb?&t z^sh+)e}t_aMJ?IUU!>-g2IrlRPr(FC1a4Ooei%vkjur&t4Nc(mCg-ny_|sF(SB(Ui zT->Chs6W?sKCH(K8qXwM>>=OzK}He3T)qA7O1q_%so$~j+k)sHtMC`xW(TOru6?59 zM#{RQ*7&$*=Y{W?r)mw62&*R4)3B|sAscS>_TBC}Dt(sttcK)@KXFYw zwe#*}3h3Hn${NnDD9VVsef8Wralis$%i+8TDB@023``m0j1w!cElpCyj!3kkkzk-N zb=w1k=68*nZ;>uNp}rObbcF@ceVk!eK-VtF7q1XmtRtG7`S8()0;S@9x&_w>x95%w z;!EExAy603m-q#RnQMS6fg4OA zLggaD{1V^?J?^lary{y4g1%ql<>o5*n&mtl;$(iF9{eNlOpLqo*FtS?pjdo}uJxt7 zNp~YRj^KIBw_PZN5;^ZQBS0ic()lwU>>ih}_dD+7KlHXR6VL_zT%EK%ozgUy@>Ep5 zX-67O|C^g4>%Ns-9i3lV98W)Q)83u^>8jRJS2Ciz)NHS{{0ya`i#lZ^^Z>gktC!IO zra@i)7xx6>-yqO6ah=Q!aL!6Al$W1$LV-Yym|ddBMTO9wNGWD|BQZNdk-O%ps6ZT&1E>zbrw$1{vbft3A&-M0*u=m!w`UKr**my@u`1o57 z)|vGF-)K}f=(jJq6CmP0c8ZDFVn#&wfBqd0prUiGZc*L6!rnr~^m>om>U9O}3c3U% z^m;UI^#y^RU3T#>vI}&z{4yhP_v{JWrmXk(T&9lJq=6j)b8pF3XWWGj&zit)hWCSY zMs3jEuG_%=q*m|~Y52mZ`FS{fIOJNgta}@*m+(i9cq_JfNlpD?=YLzL2%g;JrutOT zZU9~F4ThI*6Ly79cfds7ZbXSlu;rz4Nw}BE>>nN2l|R}7I)ApGQ4-ESmtfSxYapr5 zCiU7AXa236_Z-hJY(@QMXh`SzVO+(&UjmC;wzXZu9c=v<QreCceA9hi!F$h5oJx_&Xf>5 zm9xOG8L!xiE9860wLTwl)l^mI6X5lAv4T9=1&rJvlnyb)8h&HFDnDECWo=MZ;LNzz z-c3O7ZsPM`Mof`X9_(f*#~O)V$^Ien*AGZMhPXI#TuMEzWmU4Sp{v_Ij<3j&_I|N_ zYeTlI4k=oF(&I=2?AwDYFEZPa>e=uXKucXOge`YuFLSO|4OCrEGUk8V;4by+e(#Ve%H*}x%Llbjyyrvp zPM|w5FwtbjC<{|eAH@MJ8}&COL$OmddfIeEp#HU7!}LX0a6^lO2JZ*Wl3NyD z98>gzS?7)nc4LQ52{!(L8;|)&)v1P<<6J3 zhVE`5wFUF={c{SL_;HU?K07nh*;-ZW#pdAu-jbC%MXSIf`S4zjk}%#XJxr=-qV;GT z5{hJcJ72yK5j*bxGM1Q=QPm4*xm$&h<$3u_yxUFNif$(ACmEklM9&qN^MO94X&n07 zy3XBtbAMg&(G`I2{xe>w`>b5@J4%0RSZOUu7&TCTn2cMi&fLeiSX@qeFLrLAe>nA2 zc6m9a)j}P}C#s)XF#vA?!MoViE&^tX|HZ)N)VNb@(ghcshAxz0_-00gJEg2a$png8 zKK($Fu+%ahhW0Ei4~*Z(p&j63H58!~Epm`KwuGz_DTy?r$+>6|3!mK~-P+otdpqnw z_K4fR%^*&fWzBkU0hLcm>PVEqNx1Xtc zu1#xSfsVSmBP>5oWEl=k*w0pWG&ZiCq4UZi6dHX(nz1>PDY~81cR0K<{iz$Gp7ck? zys&to0i8!`g0}^i z-;laM1!KXU-lS+}Hkn*7!vP!j3+;TAgzxmLY&%c;<|UCaTBvN2bTFIEt{^in$QFmC zkh@1ls2-VSe;~FZ4%mQKH`-g;9h|R*Oan56=r&M9AG)Ez64E;7yEHD3Y|+c}Yp|4+ z_K-qS5t$&`n21{~;mC<{xg@yl1lZVTZY4Q7$WwM#SXoqA4wqcHacI9MuO_N1M`FGj zQPJ2OhCRY=bzB)jqq494GJZd3)1OuFt+p(om?JlpkwsqU zQ=hgFH`iu`i4|PEv7Rh<{0m%O4_IUVX9>nY>Iq0uEQXo#=%J!o>`8gktXp!%Q*#{~ z>GzCzq2Vut`IH7vV~baha--krb^xDNrUlxTj3(K^n12_M$O8+u*(>_^je7=3?UCB- z`&s?#;VLYj@HgYbS1ba4e_X~@NYB#2at?97Ci+ZjqR5S@CQa#deW4F$ni|7pFo`G2 zprS>WHR*;3*6aw$v1@XczJ~%X1U|$nc^FQ9ow5s`;SNbAK7o|Yv63XRw z1hGQ9#9;;b+z>+OCj-^L!i>CvS`tgY8g2_?y&kEmFeY^qJyN$wss7j~DmNmYYfhwR zKrxL~;LY{J4dAZX{qFxfr*eyId|E)e5Rw%r#Jn?FzvE&dVaYIona{YWb_>4LiQ)p^ zp#c`hU+#ci{0hlZ4~?Lwmma!)1f^q5o+U|;kygJJ95nE3H!J{pX zk8|gD?3k~A?%2Gnun+b$lRNMDxU`h}N$%Nmehn}WoV6ZPT1mf`yl=95Z}Mg9n&Era zg=7CHN_Em9UqRBWJE_iGno9P-n15A!WnuNpFIv&Cv9h7Z2@Z;e^Gz5LgP72Ox@ zEgK%MTBswk%2LY1ieA7p>R(6fM07z96>cMTW8VF~!Ez2X1Uf>Z-y{O(Q|Opi;8mmf z1HV9hgRM5Gu#w+4+1eWyhDE=M)mhhtf&r3%bVi>(WI; z}JsOT&W7_Jdh2f~0Qc|8(2Rh+b!cB#@oV=$|tUfFlumxGPdC}#2zeQwnX z{c2SpXgH^$NwL1>&B4TJrN?2|rM&zZMstwV-is5|niMt;< zXWEV*LbUUBurpomn9}3<0B}tq9L8ODfG^cjE~CE&w;e(B{oV#j(dBBWzkbq_jE;J zh{i)z*xWu|0IJ-#Aw^HXCttC3AM{=tc=vX+n9XSv0MM$bwEVgGE?(~bdoq4s28xa? zo=g-Xpf~PA?75b`VS!^Y*+({d4J25VIb(~>2s&=o57jjC0^C|ZgXzQ??vn6uHMYfk z$68L}S`Ebl{~&Q@EoVbGM_k*Wd&5?HNSn^t6|%9?Da1faen|##EA4Egy)OwZ`PP^k3rdR6=pdjW649+%M+=^7uK;q z-J{4{q2*4v`!i__gMQ0cZ*o$wSJI9<8zpu`Gf=&~Z0!o#zCrilY@?sALwg#v)dL*S zw=&c!GGoIf^^21kfc-RSw_)yA(qaTUfP$W7CGH3$PiH}z%I3~IQCqXi5JWi}nsZLt z^n|vt2M9F({UwPBC5c2MdyR`pl5=E}LK&^K&$*jYAQB_+ER6{K%MiowDvW1q7~wds zn6e;Ds1L}E&O=3Jm9mu%q}j$`J7K98A%r%F;XfA2*=()XUOu6SdKn6>7>Hb+)gO_s z>f?q4ula8(<^P>2?&t+I`6sEB`7V!GUWLfSC;fZ^9u07F{Pf8^B|)4QdX#;l(w9nILS@1*^mv-@aVp1G3_{o0XgtZQcLMqrDD z0Wr%FJ^VtKr4_HqR#1^y4R1!m{r%SbOBBnjlu^*3nnY2pif0Q$m8YZSK^dQ-*D}gk z`y2Au)s}?pE1h~sgHG^wGPDO$SzIc`#hum+`}}?10^8e?(X{!1JMmwVRVH=_5F$f- z%(9R}|A^xOsfZz5MHs9rHGKe*O7}K+_f&pi2c2ffNQsS4eDUiz#FdX{{ z^U2`B6u{`__=_2&^G^bq-#Mt)2|T@9t1lrXIJb)_&O?-#?b@(GeRpYMg~~` zWlT1MiFSsd1Jo6=a@_GuX5^`3ye6_`fm2V|J@r&Xa+7=>maoE~yOg8ZAUe8_OaI5M zXumz0SEg1spn8lc;=5&ohviCb2X7%GGN$h@afkyH+U9*pz*c0q)yg_lElf={HmWlS z=|vh@9ik2?!kqj?N_AWIkgb z1A1%?Y%sCZhS@&-zBTG={i8*JY^_P?M9cNyB=!?ZqCAdoLqyX^L z|-dOW_TDEF%J*=`9A8->x`~%RQ@p7P8ZHlRDJ1z% zraTu_EC5pnt9piRm*&S5v@T7ipSBsZG5fFYS}T(#BfBP84}4bW;=ZdCuShPV5bRY&F`Jh~_Yozv<-T@-=J9oGK+T@*V^*~txPR9IgRQ;?Cny@| zWph&xzY|=y7C_BCm>2t2G?R`(V{fDW4@cw z7^gjYfnV^wd2>XkXQ$0SxfhxkxM8FM9 zFatX9+dHrW9s$(=?cs=@rc2@Nhj$9(-x804tInwQyxAIWa`IUEdc!K$h8C|=@#pDW zPvDQfeW8cZprIAlRKOv{0f4$&9(+M$pAf~`Wzoxn=poVhPfOwPd7k7FoGR2@V_ZR% zmQcG+c1X_eCfNol-})6Qt@3u?iv0%3Nv1v2rq5R_i?mR31#c6X66FD4H%@ifqO zJ*(G6JNsuPK3s6mE+GWt$Va_bInoQc7pxx0^I3cWeXFf3zPV5 z05lFpZYY(go8;?tO#-O&PUG+vFx`?IuTL6>M-P#&H>YSzB_Ah|-Z1Ihc@Vd4C$KKw zgm{!fdJr}tyIQCmgGX;5Uu{bI&N#%gdcc|`+7k9x6X{yynKYA&3%+Cs50S6eH3F|s zk1O5VeflqUTE^!dvnr;Z7U|2M6i9)4Vj=kL5H#ywsxke}vHWtdy4;og&HK3JSGtFz zYK4~nOI%0GvM`xbvkX}3*5l4-W%F6nHg056udj)w2Ce^NfmPDFNiK; zoYGI>IO2**jJWJHeLXIdSl;Nse!NyW&>Dh>TzP#*=!RGO-dzyKbF6V`1yTfDVcm<( zCY1cei?r2ljzl6g4g<&Oy^i`6=IJCN>X$MEa@uGyE{ovqTVMSWpDxMhi(0^k#{uQitDsiy0|SgjT!(Hp@2!C=QhL2PyZ3)h{@C zUyyQd$?h`6hLvsYg!%DVPgxc8=0A(-KI_sZ%mBX3=!HATuDgh`xd8c=h|Xa)N&%54 z1hFrpW&`@nkVJ0nC*X>F0|G|iW+~uNc)^HDQD$F<6})bFCDh?AaTz4UQ`n6^K|GlE zT&0v=89-d~K&lb%Uk$U9H&-&u2BhOYHm+oMMLnGMdZ*Qa6hDn=T7r-`N7CY63q1iLel2(>pAG zBv}brM&1t%jcXL!4WiGEjm72*N5C8FHcKpaQ7(OLF`as8OBf%W?DxSFa}!ff;W}4i zH4PbkW^s|~y<(XAXU~7OK>OE(*!J#{KXm#m_=LD?4vTB%1jM1^aruH#|5}rP^(4jr z(s0XR{}f+FH4jfKB~oyg&+l;f1zliCh^T5G-Vpe~T}*OPuix%f?Rh0)!~RiOZ-HCW zLQ%jFirTYVXJuoDr09S?V5Fd@MOw75%b$v*YrndqoAm|K=7mC5+Vo+a6^-qT{d)hv z_04Y9)*O*r_ZB5|)8)|~x}$?sxi`JXf%9X@FQUvIPzng>0=)==hpmQ1$3uZgFo$dR zljs6O7rvK#HzH-e$!*IFrD*#`QSrvxk#bV`mPcgE{t{{9*p?{eneF3(Z;$(mDmDZ6 z{1=!d8xQZSVlH&Yc=+L1&RKB0B>(T&W%&$*uddHoTZtCF{egt`z^<&Ik*|0U(=*+e zp-EOJK3ktC0o33Cq{ILg%!Dny{H3u+#+&Yb7uVN?8R|Yy4?0|%0qb{~^*DOLCcm;B z-E9K5TC%NfykX5j4vwUS3apBw==Z5w$bwr+ew)5KxADqHfgDkR4P)Zu;Y6=_%cs;BNP&# zotAP(dEM3N_A?sXEojR1#7VPSiPc;u6k`J7>$VVEy9Vs^1X}*bPX4Ki%5k-c1$y;Tc~i9#kM_(#Wt_C?f<2Kl>) zBwByHwhg6Dw4-uT)7~I7jE|}v_j6}5V@k4$8l=$gM;fBhN;qc0*|pG%+y(oC05d?$ zzld>@zxc1TPH$zRed1`1XIDLcPGrKA{u;Nk2_lF#Va;i5xtkhV;4ntju<6xo@?W$FV=4@EeN+jseX zmj8PJ{)aaZJgYm6FMz{-(Z&v!4GJizG7;Q8P=nx`P}@>=*5>;$Uj zho`zB5$g;kbj>^7M*+3<^K?_hJkr32Rf#*;J)U{}#qnG48?Gc%kvjm0$}CVBS`(XZ z)G;IgqI|~mV@C{M*Hr7OH|m_V$5r6#fF}yiV>g@vG|MZ^RoF1Il`H(Xa)ccEe`KEi2Ae@4?xcD6<>4~Gy`7x_Xi~e+;5ET z><|*Ttph#t75vAVKjpAeJ~yJe^5X%#A($Wp_6+v(8O}Ixrr`>t$hxzj-UtnO-4h-l zaC<*WkVQmL#jR3wDoO^h;&DbWFcnPUA+omrz-X;lBTLiGQ_iH2nIPH07Ur51Rb*T{PVLuQvAg)=eOk zmni6l3jLWb>xrZWD?@KQkrrt83yYxJLnDZ205sAJKop2=q+ouK;5hw_T*l*REUB*@ zunQL?aMgJ**!bg7dd7)F_YK^Jyq=PHy-w0QbzCvofEMv@M}QgRPfFa3m=gSWH8HMz z$=1?CQAfWlxt2gAS1g~xOiQ@+m|OL1$`vNmFZuL8z0loIWhguOm|6^--8nmlfpIYM z^^TbPw=)9n-L}%r?rOlCf{lK8`t{flVGvT-;r()9vihQ=;!Q(AA!y5Yre=;0(=-gW zecC=%$m}tjuV3znu95l#k+V>rXzWxngc<3DEqBbZ1JUBQuoengSGxH%du*MAL5XDD zDJN|Hpt0tE*c8=D(6oRY!Ax_6Y~%H~*rd_b+GzSsp4@U!*X(#E+PUO_B(^&dVNOcN z3jWXTA{*i`i-_Y5xasEc)6NIdX*nQ*M%iaOqlsy|dY~`}4cBURxs&!}mjkqE)NQmYF$m#d3 zdh*@7_2mC*J$^j`~UaniayU+D&^VO-To6TPYU46+u*i*Ia zrpwo^PM1158PNL`Y@VpDUqPtf@zGB+cb^Q2Kx_5b#Lch5Z-rlFo0S0C1`lFkaH%4n z4sd!76_zcC3&_>nldiSD@9vx$PgVW;WE@A~Ew1U2D}ie4@;N*CvINU0c9^))Re4<# zR^e-cxMRYaVCCA3@183*^Qi=%NLKS)$I2J~COk?1@I3b-A9WM4YasSmRQ-NvXVtrd z^ti{OOs&-kT(*qF@&m8;oC?< zgrrflOqR?G-)gb*k*}-;rurIJ7SBt9+_c3L(IcmQQjhz4b;NjI1fTef6i8R&kpldA4sF~^y8~~ zVu?5qT361Z3U&1J7K!(*N$2(r(H0X}v_FQ7O8X?tcFisrpr2MVWM-7(5`$UNws&en z*-91r%#;6HT)oyj_E=POPeytgSA%XoUU6L{5m?rIwpnOq<=`DArJ^;P(?nEdI%u{Q zTx(E`uZT-rAZ+{`@g6J4ALcc0CQ}l^!Y!GzI(OfFT}(ZiBl5O5DcV+=^QtXBYb@?8 z*Pm*AZpCU6$-G{kC6lqqXlhy9f+0Kk8P%I@7I$Xd0QY%ST$h37^|q#>c%L^XEpE?g z55k{Ig~xenaoc*{iZrjX`qVYAFXVBbH#0Mm*<#Yw45o{@3k?}*46VY;JZqWTm!Ca( z79dPdMuyto(?x{ltgR4b0`%ngG#3V&4*4ZMhhES$4;J3@&x@RaabDA8`VcTl@nT11 zjeb1e<0wwxSFjKLHGSX{krg>Q@xab z>~*tdnSG4JTXrnE=WJ1v)osOBL8XdW+~TCR;FAR-<1*Hmt8&(fdA-15gzpDcfI7!uR!b4B zr^5#*r$ALN*~E@}{oZMm5q^lBP7|~%oPoxaoc-%vdSSeT{QRZGh%JiB{o`2&??%nK4-QO%z zsv|wQ|5c1fl&F(O!f7clwZBF=p4ud!(jnpB0B`gTIyC$rC+3~qDYSG>29%Zi>T(G^ zq`=T-8zmI#ZS617M#GCeSkD;pH%G%=Ln@;kdl9`JmbN)fAz*$FyA|wmrfd zm?pN)=x3llG(e8!|M+*%_47aQY@=q=vli&+IH5jjrbL$Nw^*6ieg%n`@)HIIDKU?^ z5o2xx!UN#mR5$S@{z>unxAEOTkM2|eZl?2LthYbK07&%4_&ph3CIDg(i|@_ie086z z>#b-O7rK8a=}89pEI77%f_LF(*Mnv<(c|g}5d2IL4MJtXbkEqyG7~{m!Q&5|2oRaP zMPVHX5HSjJmUWj`kn@;=jS8&zBo&>Ev+nWg+aFi5kwMqiBSmIO^s-QZ%f1?mUWmgk zZ>AUEfaSZNAC7%VcGc`w%LR|8Bfz-VCG+q95)NJZ*_w{{NU?cwe zUxQLBz}x$C^unJZmQBPJtfy;yod{kJ1nD&={x~NJPqx`sT^Xp$^E{6(x6tWOGIXUu z=F*2lzr436^?5iDkN*1`e3j~8a^`3{Kjo&j$f~RWa2XptF!G17x{aH2V((rl zIrYB}sIBjTUO-|Nj77~~#`doVDfFeeq^Z~b{L3cqHMunM{{T%xT{9Bmn_F*XZ?5Ch zWh$^QiH*o0`Wpla4c=iE@kDK<^tNyDM1n*GmQmIi9=tO#Bx$I*W(+AUl8O4KY(%EO z;Q<^uVuzC$FI7-CYlQm&acz_-S8Qv2C`B0YaJV(j`9ung(CBx(<&THmd749owfT@~ zsg?$0Jv`{Uva98;D4SoMRPLBw@P(+m?vD7dT%|Hmfgw4clkx;&^)oZNj#cxiIeqBdM{s*?6A_Qzj>FzE#g?o95;I&ZzE(MFu*J?{2$XKw?yshckCBb=-f&+yE$ z2rr?g0;Y#HU0SBSnXNbcRFr~re(!kENgS_WRwK5a4uW9aX{DDtBTeNHC0ncxMy)7-;9f)c*@zzVf#yqR&Y zId>inUX#n~kXphQMvCQw6Z&H6*(qXyQ=kyB7^jS73d>y4c|UsJed;2hOFs+)&@g?e zFSs2rpH+v07dC4*Rn@LUcru7-To0_J1|X#kV^j-L+iqu+MKww#()^uZ@h|Mb zS-BMzPSUZPo?s3Wb9Hu#n*fS=v0@+B_|%~TeZs9BoH2!0Zz{a%tJ3fw9-(L>ukSm) z9y%seA_nD|!pU>N762-}@DRX=_X-HmJ6uBW?-Of2N1kL$g+2-KuE z1}?!lOMH2V%Ma-O)@dN*6+98r>C}>LcIZfojx{PDORgwmt!lX)La;fX49hQrC8tV^ zoB^Q~@}te2d>ak+i?x}bbnrvjpBlo^d~3dz)mac;;R{O80-E+0mROub28%2^L~#Ba zLG7VMc@mFcs89fFZ0ir|+vw+{IEWXt*`*gURL*z0_<1mm{pV1Gyd6ggAg=rwC>#<=J{Djrk`~wjJsZ?rq%D|TD z8Dm2E=b}0>tGjVIapUbAP*e0O5c4qc6$W#HS@~_Z|CeKV|^A*et7AZoj@UEw|xCIGCSW zIaqYZ!R)_ob{MS?Oq3+hxb0Dyf3;b+M!~}}n$rO>V7~0$Ot@Hv8e!BMotF`}N}(L+ zX(a<%!S_8Q{m(2C%Q_F{D_b9Pez|myZ1laE)6vp>vC;Qv9vm+%bdA1l=b_)BV%6kK z&KIdWmAr2+JEDK`VaFe5yVmxh3p|cA+lgFz<4oS>oSu*&tFJ2cJDf{=7c)V_K)A$E z{tdfbHTQ?ZO+82ae{jn|DLv_4UaY8;)#C{GJ{NdnLfJ zMT3)hwb)nOj}O>`S3`IipJej=Y`Ip9_;l@;n+dtc)A*Q^c!K(8@^xLD5PAiK4Sz6!=iqzU?}pr)^EV zexsrWV4-%Y5Z+%5^bz5t*2Yyg>E%BGe`_^pR_|J{S zcF4RRvzm_+TJssgYQ;}&swzI?esARG;HzP)I?}!p?%=ZLMYr93y!7htVTX*31Y{zcYzjAN$W18ak zOfnn`7$Dqw&bWAhHC%wA>q1k96ZF3_dTO(=?Q^-CaMy++Q8agh1ah!P162Z zpjHpOjXdKOtZCm$|GvZ=%sE*((=bh*y}dE#5ck$uU)PqO(4gQl=Jozf@WBlLGh7BP z0}6vc=;CCbW=!NEIO@2t=6ok5px}*@CnxymQ7QhGg{$=u(^OSmT6rh+U;z{ZaqSat zm05=alS`CM)eSF*v6AR6}Pna|>`{#>_IENlN#sTlNpV)1dF4 z?Yb8SGuOg`L2DVa3>CQW@w1x$oH>dhWOK#@?V6&WGk)0 zp@u#-jwC^ZQ;{x$y|w;YeYBE)yS}jM)!`De7fSms{~kON3}2tMAqw>J!MgS6 z>VEBm-OadM8mT!lCkgecL&^&HxbZ;e8LTCJHnn9=gSir7i^uaBEOEXE-mN4Y_V>BX z_8`n}XZT2-yOUT5)pG>gouzllV55Vka?GSzt$Eq)!q>HWX$xvK?ysbUerBygX~}t# zNs@?94|L>ple}u$`Cs?|i7+aX#X01j;Z|TJpV)sl@3+TQvF1|9<4)fU2W-sX>V)~} zRy8d458jV1bp*EN=gc`*QK^;~V1uG5uuJf#b|AeTAJ1nM7qavBblhVb_>sj#pj?xf zpWS|2f=S;epXF*WN5IcY#=psxo5a?oC?|TbL(|Pxe}b%af869<>_7~kv^fgo0aBBh zpKVX&C2IG3N4AFYIg)8&Y@Ih?BH95b>;;gF8L{+IhhUE&HMYmcFt#wXfY=pX=yj|% z-`5p;m{b=1A4H$;T5X9IWXb@A0fZ|ThB{o7D;as&G-8wcE4c@z+x1?56%?~*Cj51W z)+~fX^}Q3YG!{hu`m`TaaMJ!Td=s-{gP>U)7v#Z$nCX5VQ)ImRvsou%hB_@zu8b%G z4BQ|G=#>>qHstnbbo@6bX}6b&jTg!=N6M{U_+~**WTT+maQ8VlBy2AHcemr&bzA^s zmhTEjvl0(UH0FY=dDWTDfPr5$3+pjQM$5*YYI^$s7{H)sbzz4(ZSStwJor$8oV-nO ziuxi!cdkDJE}8rXVXrMX)nb+x7v@7~-cS=B`>AikR`%+uV=bnxn9vQTA@rwlnk{{y z61=HZxKHs)YW%ur_^HgYY}FRpoSnd}=3g=gel+Ot$>n$}8P11J zFFaD6u$No{KV6}tNLLd=JKA4ni4QURkam%*={%fr2!O<2T+n8>wKD8uWSpfPAPtl)M)8(~-;u+x9)=OYA-hdwFrFP%e3l{7* zQ;vuf6;Uoh9s?sQC2scJYUdST8&$NTxWxs{_<*r5u<)mLy`Cd*(F*dUN|j7c!ne*a zljo|f=)T7pZ$g1KVO1i$Ny=AAi|kiPD-UFn_`rcP^U{%wj4Q6p$Uh>$M3acK3=V(` zf*nA8K{rEcBS!CC?63TMZvzOV`Kn(HT4U9~Wqr=_#NHC%niIa(`8|oTag6BEC!9am z0UAFAZ(4gg3}iiFhq1o?LaN1pb1T~UN%9P_OeMHGcvooQlbzpA`>J*6^KWp0W_|tNX zaoQk@A3&Iv=IW`tR&yM0fMZXae_GO}6E%^5(fm{Ii5yfp%4w>B`L@~A+R({7+yRFb#+YWx@=7dYtpGY}W3x^HWt<4M*&+V9|VvFfef zOeseQjF|F=jnx(^`8piTroGM=DQWpUr9jnp-kXqyr9P~;X8-en_mxvlkHZ`pXFT*i zZptL=&?L-SI|&eiy0waF3rQ{!A9qZ9QuZtJZQ5aQ7X*D3xs^{*tuibIDql-t$2SQb z`8pz^xlj$dFPUmCZduPGAUIF_Ph{VOIkXT5x?u$_PCs-WtIK+E2EY#$^|adxu}-*z z7=cVhC1x`~qih%Ej*r)!@JV0V)r;)5{`^$u75QB)9l)x14V6fviClQ|*aD1Ahe2{3 zzhTuD7_t$WL1w_lS!*?1a31t)41A3;BwU4;)jd(OJ_+Bwj~iPD=_UbfPy&XMH-?~> z+_HX34^%hHRf{(S^sfZ4&FOO$n+!nG)AiJye)3bLPBzaB#Iwwus7dZfN8{XHaue(D zeY0)Wd^Gn32EX;$a+n)%?mWlmk@c6Q*hp(e&4L^`y>q<9oo90AHOjf2ZqdzoMt5E+ zn)b9LvpcXht3~dvbLYL3>YX8MkqWV}G}zI81`MB{SQUJ4R8xgTzvtkHmISA_QTmT> zH;kz9k>O#-uG_nqBYka)8f0+n7aIo^uV>F3pTRHz`A}+=$DGa24ryzSUKB>x2cA+P zQ(I1ZWbO<+kDJ$Xc)j`aN=ocM>qF97rCkL|!?LO|i>`LqOA6^HT2qOdy&5@N=fhmX zCeH)YYpd7R=N`qW?;>q_oyXYS89+`%G@+mg(0YRp?n5~Hk=CVSSQYmpRqN;5Qp!`&uymkwK`_}S2mFx0nre%@>`2{t!A#e2RInINdrmy#H zK>g>a@joXSA32Tl4oZ(i1aRYtU-vir`&($}0Mjn8{bcd)R23Xu4Hh5=;tXWu9K{hp z8}Z+)Bd7o!^~YtMITa&gNf8FnsQ3?9P_T^LZ7?;TGpTd{~7%@=_=+wcl3wNVl( z!MI8RVEb=eVUl1TL&YCK_1#YhB5#U2eTrLOejig)v=WHVMeGuWK?k~ilPZmm@{OFj z*6ZUvsHv3WzE?998M!*N@hM1>knlk#->W&A+$2 zneM<<&b}gfKgBY9i4cZ|r!NDQ7<~(t_Kdsvvh{ni;xn@SEB*X}5a#0&EWt7W6_;_g zCQFwja_WN%3D`{|CR2WJO_J(ba5I0>LM7^RH%OfYe9XW^P_#+vNV{h)v zFz7FR>-f{&I(9VBpLpx_3%c4wpR)+hUFKPe5DCqK`3zTh@&uqOu8=)&_K&;tCd)>8 zVRyeE&prqNFxZViaGe~O9U`$pTng!4^XR`i%NwLo+Qf2JXnmo{DW?8a~-igHQ_QZdW&CC|$ z*sfDRVLX)L;g|s1!9R=qxf0&u_rWUAM(reMgU|$0u9y|{UpFWR9GSo3Z%=D%xudyY z@>AMF*5l?(fBkYe7?}5jk3X+bQQFMbvtpI+aQgCCs^D%bnFm9gIq1BPqsfFm{~uT@ zkeE8Rn99nZ^NmAt_Huxw0_!)cu^l4plzpod?DXWtEDHgoc*DBnjOGbe`GLtTUaIpl zf(#&#T@J$Aw+6=L!1vVzZ}0<|BTBIj?-&Svy%)dct73PLH=PCbLQ8>aES*e{Z}#zr zKto7_WLt|OI2A;Y_1jdyto?N|X_G;OW7c|!uo7I!NZorgxg{VXya?8og?ItHgju4=r@7tgz%5v>{F zGY#N4w{-2464WXA!pbVL=TlhLxq@Oa$y*q(EBPr9A;u6`y`7hU5;H6MG-++BW|(_<+O=eE{ma z^Hau-HBZJKPi0;#=lE8wA6uD*YH_hEspAPc_4^Vg|L6D#U%J!#rkvgILmSXEyYERo zAr^kG%)W05-^1%wvKYHlLl`0Bez3M*^TxeV^+QT)(MHP7<^NAoCx(RB@sFcZ`-cQe zoQfQGt}obt(bF@B_89;AV;+c#KVdJMfAg*M_yg*)OsOh9VMl(Xep=j(leTZo69-Q%%NW*Y1;y zU0hQe6uo9sMHm>wT<<|>yn00fJ>a!TIiFzhgkad8A>Wkx{nzo%G5^o5dKTM{hbhuL zIGKlbDHO-Z(Y4~Fyhn9ROZe-`55L~5O+e~11liZnZm z@nZgX7(~jQ#T-<9zJ;t`uU=1-+~A7>%HbQEWCN-9iY85oDI4fv!%?Qwx*}>D?GW)l zGCRRuGrr?CiW?UmV3AlQw9I)>aVAE|o1zPDiASY>O783v_J0o&{*1B+?INf|IlEmH z_Ue3+(*{5J-DJJD-b1sf3jA}C<74{wNyaW26CF#}ZuHL*H2VnZD?33CdTmDaJ5hi5 zI*!T-Op*4{$)M(r;=tn{4QQL3*ldl;mr{Ar&+CL;)wG-3OukzXAq5eW>Zef;MG=$u zKmR>}$j_q5zrGFy!Cq8LYlv_S(`KdmB8y(viG0b?-6$^Hh!i_Y|At7nale%H;}KD> zSFJZHzk%lJb&3t54$r9*?_>jU_Z20&P$Q~Y)C^tL+c`k8Gk@PRtf&s=L)P63J}QsC6rb+mVLQJ7NS1UrBzAhV79vq=`zptE?& z$PlCMUJCn{6`Ae4;$Uh_UsQQ!&?ay@WE0(A5IN$oC~_A5Lx-K<0LuSwhECcE-o%Qt zB{qFiB8Bx97?*-Qq`v=ofaaBkh#&9YnXl|axj12Z&gwCxlSfg-*BViiYk9>*RbRi zks$muh#omgqs42DUj(GXoOx~Ln65}7XTIt?7f@u8{>&fK&LI>hsy}qzF&5di@)dys z)1Sunw8d!ulwj^zIIn?fz2e%IDTOLj>~ih3E$f-Axq1K4;a|;)w1^Co7?DM4JgUAK zb`Zf#v)dy499G$4wrxwaw&5|0%e!$g`tAxMgs6K`?dVY={54irkH0R+Aa3WJ`n39K zxho=!&G}i%yyS$kE>plfe7bQVJpU3^>@AhtNWtS))GBV1sMIROi0Tspx^loPfbLg$ zaWxI)t9}~z?^bnR33`mv@)eY)KuiMo@GO_IxCHzH%uA-m{-aK22DC0PhCz7}QaS7a z?kHSER)b#}RHYeyr;I*%b4ast*z>i_ROm5gj`aVIL14z${FU_rYSsRGBPO1d>O&ur z;31yy<@kEA^{FS}4p5+7UVAHF*GIcrpCvo~emh;CLk^;wtnZhjVLTe%D}@0{fx`bJ zh|xEJdJ6WG8oGkQ959K)2Pb|KnC_-CrN((7VGe{8&IddH8tg0U0xu3=nwplMeu91A zb~JUOh%PorIq0Z6v_(YR1NWn$T}doa@VCd`E4@X?%NW#FlCjN5}Q-BI4-XQ=7!xBfSWZXGg;xF#2gkZhiTSKnn{uVQqB(#R(i@--gCk{EwmL&7e^5_7U&9>9iHQT76O&0VI>vXu z0-(|^AwtN5l;IC6w=V$V1jGm9q!vP&65ICnZUvnn`hS2>#3zaJbqodP8$7EqcDmHa zb(x@J$ZsdZvF0cMXlaizT4*=0fRTCUiV2bSPb+h3IuEn_@(gMP{al@f?<`CLP=0N} zGoTs1CF_cLNO*8Y94kN`9mv_%1hss^DlIny)rt?9QVVI_osZ+_^?5RoHu94Fkd1L1 z4GFkYI%(`D-y1NDcpLqNfyxCf1y{iD708b(#jp2bh-iksH!8+z|ID00Q(-e^53(rU zJ@|c?&V-sZMdA&{$hU76^aP zFKzg)Sr0*|@vIQ(Qy85r6-LUOxqIDO7F=;G69QNgddhlxGzi4Pd50R!6c48!lo9sh z9B`rx5KV7W^?kuY48(vkh{eFc%ldx+76lic6t%NErKq}xnpgvoQpVL9d>H%SR`Lz_ zZ`q~vywr*&ko$;}&C-)jyd3L^(~n(eRd8wl0035JK7AV#tWTQY_YXo29mC(mm0Q$q zM%GA6Oga z`b`PeFQ&j=sb5V5SxsbOX%$*sV1fVmr3uurl`|4f&FV7Ti*~blqcI2%oDd}^XE{+! zrMm^;oW>OeVAaaHE*NE0S(yw*F(yZ@Skni+40rLp52MoG*U>+9>@gj$>BJp6`IR!> z(5J8Jv$tB=CFMM*)3;1J^B6!2eHlApvv}*a=PQQ?aoUBI+XF6wJ(^OSJx{I7DqGHO zri8{V+C3b-!7`WKb~fdhR~CNexi^?fXu~(V!b1R<`OMZVn20o6_-}raqNo7kbO2tG zk4;&y>7SN4ha-OrBaH2ed@LnB-qn)l9&wMhrE zR;|xZ(+d0#KNJytx*u8;`*G6pmc)yB3u8~-g4mR|G*+J&c)+S$== zM(bc_3O2Ua7RQpXp}2I0n+w%JmyF%BhpQ&Pbg)rdUxr)xcDr~O-z=`FJ4`CWgF`9E zdG_Y!Fw!9B738wsjWVfQ+n>Z{tko?;a+_t+bk={mw6vF2v~{|%dhHs#eY>Vr3+dip zAolw{i*72~{I1_Z?At?C@T3Y~@V1`{x7T=R{}FP?JL6P0b_Cc`c6L(YJhnHVGRjvK z*tJT{(!$gUyGkoJTPecRifP&EY)$T3avfIne0Kxmb0cVSGt=VIFC>eKu}AT$%HLD% z8g{LQI@iMuz~@G|=?m9~rL4-a8P!A?P3EQ`2favUPBM$qm3qBTY1??x^MGam*e-QTajxX3_sQI}k2eXKg<06%D}U&!}%s z#sL_6(C`lk%bGLH6&6qJk*R6l?H&SO#$jf=fHg=T9#+8nO^4VuM@SW5T3xiaFnt{aHFRfYYi}3`7->MH$qD4%5{4CpfnV+G9X?$5jJw zn$H3UC}wqx_M$QEW)+hEo0*UIzuqEKRtLf=VRIwDX9@?JBj<{u^wM{Ozjh`qV)SyE z_P^xOm*Juu1Rc4PX@RHS{}kypMf3c+Vt6IVYp-)^A4fgGC#Yn*C&S61DT2$*jL%Jg z`TA@eQwQi+Wg=~~zBr%A8_?@&Z!zrdkQQTMD#qD0Y`-CMO4R342xNiJ02S>p%AYGK zXCWeG5P(eb3j!JX;G=>T&tq*1l&PB8(#Dnx`#(Rc?4T^_zru+hV5S!`mtFCpaRD|0 zaLItXuDM}Y+_Q)xcPq9Pwe>SB?nNU8_tYA`K<>DNc7NN zF4e}da+&zI6eafoY)*Sbsa8mqCN^vZhMpn z^G0xhMsScuCL*2Rf{NrHPiH35Zz!~*(VH$cE65fc=QZdr)71I;nv1qWcfDvGWgFe9 zm6js4{&E2_FpvOW9CW#%=9D4h?2V4^(RN_RBpU9ZNVx}B7BClISkW2UoLLzG<&&xn zg6&lMOJa6DZt-2gwIa81^B~dBne?+C%28JD&b*oXU0~Hj6=@3F$j4z;mfOkdtQ`IT zZ#nk-dG7xX5!NK~!kAn_zH#a)qGL-KByz%xG@W+P3*rxglC8CBVuD#zr$j zdRvG!X}Fm7h>=l-a;J}kU8%krGAiG1A_@h9LOerEed~y*9?GVmj~Z}^S5aJ9 z8>3t#Mi~}%T46y1nf{0(2jc}qC)|9C_joe&1KpE~AZet%SqCa33lMhrg`IhvMXTTS ze*nm(-V`Dp4fbZr(59`SSX0zxgh)j;Ua0JU1hSa03sok?9}P$uqKEfLoH$ttOG@;G zX$37#DnsgjxOy2SoRnr@RxV@-pva-^xi<$knauWKIClBJfL+4!h|;l@QPj3gsv4&R z%$Iv8qp_`hJU0%jWb0RJQ>QFdSkH%5_Kr|1mgmj5i=?ljU^}BY_S}q$loCJDC=4X>I3#n%0i1U8HjS z?mqij34-EJu>s_a8)T=7PwbO3y;a3sH7w6?gBK^WNPY9wI3-^>ER=~XK+vui_UL>7 zGI0-Ph9L_MMOfE-w*i;(b+&PBMImt8itIwV#fh^!Y?SjrdnEYy{blz*$&GYJ+I~i` zE+OL2C&kJO>pIz8jDkX0aav!AFXu|fima2t(PV!^=LfzVD1liB25h$E1M;?EOYyys>o|9Vyd*(lyUGUkf+F2#5O^0Xn8?iwf%=p(!$9-2ROA^hseD4yZYZCzCqYM%xoc8cA6Z{>0jBEROteu{-ItRNy@qJbMx z9z;RIRGiSR?DD^lSuRM3I2|K~&QPEexr!@~HIalscG3}kdUx^~55@S`7DxxA7Z5UO zRN&>wC?5O$aDnSg0l*FkcW?Pd9zhfO9kx{D#;o3v1xSv(FuKP)Ny*#T0|;rBNU(Q= zn}f&h^E};!R5wY!-A}9QDiSCjBVOwc@o0ls?EpI$*xg$6=C75#q=Q?&;{?mxES&k! z3)}x$Ar~H=7`73)Ui^e~^7@goVu0sXmQWd5 zBc`PEu>l2w5r~cxXmzE2s7~NO^$PP(8frM@aa-*$w{|sHd*zt&HpoAOJkQD}V_1~h zm4x&>qyV8$UeeX}DDT7BDQBZNRWB~^+Y8|;d?HNBY~FxwcG6XmWar8> z;09PNj^TY3MSfxFyx3dH*hhA!0j}Z%HqK;jQ)}lU(E(ClFQvh|eNW{I+RLoI6Rc*| zxHK0XlO1L4UU-o3kP#goJoXsRR`@Dy){e#&ptwP5Jwcg(=#Ko&WRn*K+GY0neSn3V3F%ngXo@8 zVj2hVQZX?y_O#l5r z6A&S7S=I%161odKR)WVK`m3i$z*l~DHl>4of#QLTTDLE{vdt^U6c+K@4URk1RmY?! z*5=3Gntn^NZ*=r2?8!t`cstqs;eB+5pO9|!$mqI77BqRuj>Xrv8j^G~M*~5b8b9l2 zoc7o`{*0z*D~j*$pOt0W_F*x8dCy}<0ZRL1tiDLFXoR!9$9f|p(^j}euy{mc0$Zo3 zr;``n?YWVxgDc#NO%G5yBxu9?2wNOh?D~5Pv<2ll03H}ws(P=DE!P_a5_uJpIg`K# zB;){61hcz$twv;KbPYAG!g6Fiu~<;L~ivvq^ZsBNBCn&F~fI)7#jXaJY;PYTEI@MSIt}Wo;lRP3(BP_=A8F`J-y*Hbu z>yEu_Di@460g|*y;5Zv8|Fxs&FfQ{R(5*1`31OfA5yGFRkb>*1x7t_T{u&Cf%LdY3 z8~A7>hSqn(dm1x|{{Aks101K}D-M{c&Lbn&;5_UA_e%K&!`Hf=HEIcRkjO-t z=Pm&9M``gdbl72t*GV9x)bPX;*ME2WC+`2-iM@k%jz33(3p@AU_fLbw?-)XgbNoxg zf7hmD>OG(P_6G2FH#_M~FxKI2!|$n)&*?8Cjs7_Rzl%)5rpOy|BL^3MTsi-T^71aX z?CTWs_^g9^^sm)a?%(c!YfAevbkwnDZZYm>m9BithRq*k)%Y6p{nb6C|K9cgRbirv z|MzsGFQDvwm~Yhmo&CR^^RjPDZFr*vj*o9v%l|bV{2&nO9e@vHnMxY_Q~AHE|6;cF z|K)#B;F2|7E#2y8~lBY>)Kqs>gLoe zk6$;3!EUat6;I=zciuy_=qo#1Tn67tp&ZGcUN@Lx7_C{L@SdFp*2HKfvoHhUF)- zoC3n3O1P9Lkv@JCo9X(VX=Ce4S*g5KB&V4Dh4`P>Rs274Gv^dTpBLk+ewpH+VNUSK zhLu>abS$wJkKWq#${k+b>}Q!J_wLKVLVFHorUHI1^J#Jt_dc)ffpk4;({^m9rrkiG zo@D7wt8_2F^EJzuz5GaTn2hax`<)^}`QIwwRWESBReXMGx93&(@;h6%J~n0*Q0WHE z4H7DTxbP`fEyL@}&1$zk-F-J1jBY!&?UH`E_P4c4R(iHKn{J^0LF4*-t=_gaG{76Y z8(z;nzIXPk+fKzvqIbR)ZsT@E;nk$*=(YQ5q_*;mf<2${V77o1v*l*@Q3x|vn@J!l zUDp#+UkLZI&6i`#ak7DsH#;bh7I|heew$m%)X;e=H{>qy%#b&v1r`OU~WE^5}s{=V#i&tV7Owl|J z*K}OAjC}=E9Lv`3;O_43ZVAEN3GPmCcP9+)?(S~Eg9dkkdx8YF;11yp$vNkq`~UB) z_4ex3U0%C(?W)@K^-T51hg|D}$x@9LhP^1%1E=NeU%N3}_AGhsmVrl8o_4oCFLQi_ zJ6vy5SZ9vtQ%qNX8dEuH#i2(r6lyYKGAjcU2|;NIkYMTQ);c2Z+et*dJ9(P)m=X&Y zW10K;ninb;Yi-Tq(Na(CjL=Wp{CF!=`i!xMQWrXJli26=T2+qYf^PEY1|VHL`^lmk zM~sG~ig)6Zusdg@!iUj$sA~vhAwc~rPqx8zH;5sGOZQ(vmtbB)lini4w5KW<`ZRfpN zb@BaVkzidHl7i7iA&H5HjH;$n5)wOqq$IuugF5e+?Yh8-ig=xK%_L>A>x1pe@Ta|5 z8(!eIC5xZ3J79IX+Gx12L8jSvrMT)rBqToY=m&GjBLc;#C8>vdFzm7dGtfYT zap0618AoynsavkUj^Qt!I#Ya}?N3TV#y{0C>uVcTwVreLQ{i|I1-=qdUKpOeZ+ys$ zwW8v+Taf}wP@&^zCp{cfD!+9dgDUCzq4D$iqGonYFl8Pogc#TWcY4hKBVtLWXv#%e ztcc&?BY(?w1?AF0rV386yHh8)$hn?AuXze?UrNT@stOwrrlmy*ykJMeDAvGDQjFdH z27F1~`g_M0@geDnNkOSL8l0!}pEVI<_s%ro5|eVL5{%@h6LuD^Dk3xCdY-jkR5wiL zAs?Iglh&4D{8CBhp&r$dseH)&{l23Qpk6ITOO^87B%4CaU!{T})B6D%cBmOrMIeue z8ym?W=@1T&5S=VX3UT>1NE|<0n1zVW8m@Tw>y533Ih6Ev~or%9~TT3!yZFXX*yX!yOPdiG*qkk6g#Dsp=wcT z02522OBNj=nfn4E;#0&OED+#_Xokg;3o~I-_VLZe&^=u=z?v#ibXQSL;Bh3xw&J$~}H;Y)D^KJ4m)$+k8ge!@?u<#{k-XjPk)D;Qr zYu+DttUc*YTt&E);bhS;1<4;_QGGM7WaO=r)vs-Gd)}fDo~qU>vfsU>K?uVLKeLwT z^wi}#Y*A!2KIcjhVG7nvFd^d5tX%3jYd|jX2d}u9mfO)%*-ke%$X8b?l4{aG5jPE> z$jTWD=ZKX-<>ytiCQK(7EDZ3}eK%9GBH)7b8T6$o!p(dKT+DRv(7li|rlj@Kh~@o# zxkY#d5?ZMQg3hC}1Do#-@j+tEAv~~bo8sYZxnJ!(gUVBY3mb7~XGXQDMc&b0Vf_T< zP7Ef#YwM!Y_;g*H2AGdv4aHsoV^C@64G7+nnq@Ch%BrT&p3}sNC}nyvXCD#b9aLXB zer=?2XX!snceHn6N*%B>-a{;$N!BdVY6u@bq=51J?6gOhr9a)2Z7m&a52ql7<}=nm zmDA?of2$K7A*I<&bPs2{!^hD~g%?RH#1{Mxw=%7)o<@F8o~Hgz$JhFtB1=au5T6TK z&TwQD260{3PRfw-d$KNYTIw)lM0jiCtYzYcr8jI%>hN$Kjaw-DjLOQO}>=$8C|nrVZ{0e(-Q zJoXCz zosZ#!HW_S2rVk#_Qx;(Cc+vr$#_29s^S<*}@O$n7d_K~Kn$5Xq8*ExLOF~<4%N{v3t=10d%jO2;$Mzvjn zJxq2U4m^POLjW;ZZZf!ZcnucUqT0V#bD+ay-S@n^v~cJf1h2GR=I~7o`Rqnoaff zt~miX=g0a{S{QMims#&mG4_s-u!Tgi^PuINRQTwd7Az3F#ZV{rP0ja^pycI>c5)0= zu@$CzvjnA0*{7@*dmX-BG;ti{Zw9Gb9z^18cWoF|!@k8=C5n*$+@k1kt$M#o<1-eI zJ5Se?<8C)%w3vKwVjMD8pMGd#<9Ils7B2gCaB!_FTGA9o-rRKB5wAFNt=zRPI)!3S zdZ&>)9&}nk@hrRAmUwH4ojcXrciEfV34;gGYk}XRuQ(dclY!&m3k@E6G%Y)+pG3DA3efZrU zP6!nUf$~7;qml|E4YW3yw4qDH4wiiffu?S2s0Sm>3Dz{HJ^mk50?qsR}V zm|@ZEZ@j#iIJI!h1E&U077EB%Y}-G%V2nYPnV9Lz4{ru^&lP#$Cl2f!az>EIV3xVw<=$ zlBrUhJ!O;AS&)$)c%++eburO1ukNV#mWf){SjAdy$qf&M=i|1I9rX2Ak8c#;d8~l} zosX7UMx)<|Z%~b6ZGNgBzWI)1ti*5B z^sNiFhkF$jphi5^X|`ten+hcZ68&G3p( z5h5{Wi|TP7X}>Eww};%`C76(a2Sd$|e{-)}6FowH^Mq{XH5FALQp)Iwjg>c9aW)S3 zwX9aeAE#e7P@E-9$I5no0rqLD?`Nhz)JSK`*nFj@Tg`K48wJg%*8w(abDoJMkrGn1 zx$3Gr49Mp)Ky1376qT=Y3(295t)UEqKph1tuv`uSYe z(8{3E%8kAtouJ{^&)M8Sl7@DxW5h!}R5alFFr7%7$dtSIRd z?%inL&!VnO8F0l@l*7~G)v589afuPjPCm!{+n&w>upDCD-$_hI187XHE}CKblCES^ zO&eH~E#_nFvhgV-c9iF5_9~n_GCzCpDDq~~nO0A5luphR!;RGr@M!1uG)rYm((jc; zG{+*!e2Yc`m| zhWeG0hWiA6M+7e{DFv6?lM84X+i--awU1pf$wM@#zJAa*Y{Gyqd!u~WFm)zPz)mZl z=TW8QndKjb*3F&wp_w>)O$+vr{H`LwFP~YgtqrF zRdqaGy8n(m$3+)LFdy4x&jqW$VeDA0Lgtgv`xN6WWF3!YPC{EYsJ{ilEwyE( zbnu`6 zAX;G_HmOO*p(z5ZUN+?|onBVp@@$f_BoFT7K~Fj!Mhr)KIo8z5+c@OqgYWz({>4O+-!abbgO@R{{g`kbL>;s z%L4Wgnq;BSuq|Q%an8BITiFeLZdOy9>4s)M0ZZX{t_r94VlIVixrXhU%;z=W)O85= z^JoTY6&0oDAc0x)Q1gnmCjInnAxW{?l%xl;`6H&!ks#G!(bLs0G<6=5#x1HOCO&1G z{9c#)6{6|Qh@A@aaaHHIyHq;h%qkQ8`%FleOpPy;$#8{ANU#@ggw>tkM^hQAIGNN# ztJk0Gj+ENi=dQZUOvE?2zF`X+(oNvkYIQP}Oq*{-!%n1aIUX)$O~sTf1QJ1)(Rm`R zdS-Cy@Bwx;-!^;en6_uUdjx&h7~)OOuax(uBR&>NRdeol=43`MbnODy9bShla7*hB z?M2qPNkl(at1Oo&sM?tZKf%gk+03+|7I-#SjhWJMgTKv)t#{E@lJQwV&Om{L=EA$v2x!lX?p9*RB6h z#k4BJ{vlES7Zr___;h@joLrZeEv){ODW%fdYk+QsjDM0%vUkY`%vaivvT)~8( zonN%c-|Pg3QpGH;lWcHHffOfz#(nrjx7^T)bUyZ7UEEf`NseYiYBLqqm0Wi^mOA7) zH^c6gpBy+@oN2RfT59l7^Or_uM$b<^DU+p|^l1#(pG`Jr2fQxI^<$L6DZmXGKh^i9 zDD^TThr7QaTquvM^K2txF&57l^t!rB_CFmq8XSin;#R3z%@{Bt|B6oGN?joN2^K)` zcFU}ArXnPD+%aeQ*!h11M zH+ccMliLTPyM2qY0^}5EMe38L(^7)#(p1HqekB6RqB(tf#ZI+(Rz(EDd4v-cafMs` z7lZK0BvZy^dC{(}Y>g6`zS7Q283Puw!Jbz~Z)2Y*L@2Ol%56JQdtBHC10voCLSuek z3H-({z5Z0Mn9N^1hod6RE-q0~ZJqGhR8}n0}}`FI@_$> zXv2DiS313`Dznc32A#OUquo~CTL*m%~ z+$8rRol{707z@ITkFg?Fh-ub|Q&on5chu4<3N|xtxO%?s`h)9^AoCWDX*BFrr(HDI zkIVEk3|A8li2_nVB+U94Ttt$u870LJ%lh`nW<}b|7U}O@pVO8swc2chcn}D4@wPQt zTb5MWH6f3+F6#Vk$M;s!NW*y;Fg{1igyDuj$Wn@hqira7DibUpXqcMlhx+EIv zPimxSD!xV7)z8T=VAqBB7Be4LoFkQX-Py>WszNRaTO}`(GYQP6e@7*{)qmf60amR z9?Xa5xW~cmNoG@*_Isc5J#kSIUgpovA7ybRlnw|qgy^J4aYdnxq~_8)$5|HG%lm&E zp@={!arPBq&bx`g??-xlaLfa&k~}DO=NQqFFOi)6BG~M!hk`t_0`EyE%;6VTsQ~YJ zxYWR?T5R_g2&aG2>tm56WppU>tX3{<<2bA}8MlD5oMA|QvuMI$M~C~i_Bi}~vi|rF z0XVc=`18SGrF`O*H7yaY>*R86HGA#% zi%-mbQD|vkT{igAB!|ZFhRw5uiPygNbax3xKVPS=mJp0{^>HyeSTR@|pne8C&ZW^T5^~sVUfxvcjFAm9{d~vdYCtZ16BMVH~g;xi;EK^85Ez8Sc_8cIA%I~T0ZJSLtV9OkRJAN@K-I#hTFs$O?g{2 zg~CX9zE{cUE1L_3YIqb2Z0obv_IE!&R;f*%(65~>r`E*4sDx0S%dK}ef%jQmU|eoq zREWfSZhCwqG-aMqC9|M}JqGtP&t8;10s>WU-9Epdh=EN;|l>wwx#R4IJ^a6gH~xwz0adBS&0!@ zHY+RaMYa>z?wzfZr^D+xx(w3*Cd`1}Pi>Tkx5tcHJejhZkDIq_Kd0M-u&Us)}U* zQhOX)x`|N-Lc1TB0CsWo;M#)vV&UVRb zJ$i?)nUTKTEn9c9qn?A}Ksb}A0$EeoPp+pLMZ>XhUIm$c?@@#s@^vAhH$cqjtUcq2 zk(Hc<2A)v=?$bAlE+@Piq+!GBU2h@F01I2VNf-6TNHdIfc+6`|eXg9@ZgRxfQgy*A zvtJ=$PnP($5DQ-09JVFj2S0eLP?L*|O)A6h@q5;MZgnYf%_>Py?R2(zsk4D|cMVyC zuw)|cD)521Zu^4;}h-d0NU^s%Y#>Lk)%!j@jj zPIBe|Tc(7Nn^cW*B5aT^a%!=t=@BzqZ@!RC_sWr!vqGzk8TmprXvO+KOnkH6Cuuor zzUsPXXP~B?r+z$b@)rD%ll}bg{)MPJjkxxcGcGLrK-4An33sA873FAYXM%9ExtwIM zqZMq%5a=hfSY||Wy<3Uqk=LO=vq_+02==k;1O$rv?buE+;TmYDe`s>=?s?3}+`o-k z!K4N|LdIl;xJ|TEUCVHAqSCDt?(j&1yZYquQDC^Cz}?uCAsS<9lG7YRx_fB^O`!E{ zcNGvjev#NK;n;~l*g76oea(VfgOBMbJncy(HC=p~+QH0-hfe^@_7JRdAFQr0?Rz$4 z;h@2zH1XD*emK;#6PyuYhJ1t^65Wd+%7qWzS0?{Fzmz;LbSVdB2!$NOOzSK~3oR9k zP#mxPWr*v!7V`~$#Av9IdRnO1P9(>4UHM5;^d7qf&>uw|)04Kwa@aRl8u}$fJzCQw zIR}J{9Hv^u)>QbgV&B7h1{ctn4Chv3(OITOt{S9}$2?CgI_hr|yg^7jTOz2Z6IJ&c zR&s>)5;JVe&Zs7`tP>x&7t8t4gbnWd_%lwxk|ymyxO#J&MnAQ=?qg{N<*_`6%OqGV z^c@F%;3&0(6>{O*s~lN8(PyF1NMhl{JZB+IS55VcI{ruRh12i7A7dr?1147D4E>~c z6RYl(5c4#q6@<*ybmQx2Z{&=*9m4C3*Ob{GkfRkC>0P?sZgfWM}Hy8ne zM+Lx7OWYZ7<_IRt|7@NC2K(qP5rH*WLgvNV2_z$Dr2ghe>ld{5aKCLEl{sB^4YCKiq{K86KTq`4dYvCb~4UtkVFPiI8SB z$+%Gu{)7@df<^tj^mXL}00O=P^@@NEM&>x2``!xdCksHtFOCFui6Wj6RjE$T`b>rr zL2e^m@ur(Mo{`l*lw3=wTQ;7NG~2hGtI$XR3@lc>9td0%(du@dRx$*C3HC~f)WuTR z7?Q#!ZMW=60p~6SIBEJ70v0j536k$&0Rqv7ia@JwoAxD9Ft!gPgD*_$Hl~#V>#cL` z!HN5gpPGy6EDVR!NEnVkli3}QMVP+P1^@)YBOybcuddQQ@bK4ivgyM~R+_N1kZMY^ z_ZlObIQ3l7W7|V4nBi#lW53UQS#4`O7KadGn7tiK$KuMZXq^p*zYqXm(gHB^11^w; zKg3Ku%_W_x24u2e!hgu)v|#@hiXC?v2d}?9dxR3GcJJ_u!7+(MDa3#AbG}}1)7$w7 zAA9;BZQi9O)hAIr z!!T(5N^_!x!8j)o3_*Uz=a2sRj*F{{Dt6HwJe!BF5q4Eo+*T^r( z62H;qmLSRFyp;Qp&Qgfo^CG;}pQ}9+A*?D1fP^lxJJe1s{O#9EDy%bV4n>aeYFAg8HGR1?g=95r%aXJjI9hdsV*H&d$F@W?RK2;TR5gEozp zyX5>>W(0?t0C0NRn!icW)il1r;|zKX(; z-wCcSoD`A{)W~>Z>ot{@QItSwaj!MWFOfkMZr~SKRVQ~(A&IoH<;B+c03(rAt5r1R zw{q6UlhI(F(Y&>v!`LV0RpC*o8>^d%$Xxpx2iHoQ0~cLN$VWLfR1PeVP^md9C;nvl zDM1GSQMb<`PRC1Yi1Wp(4?vYbDgAmudi<#!8a zIddf|!;s2ZsAp0X*`+NkeOH;od(ABLS7w)IouB-wS1_+(Wn~p00*3_v)KEws1`ub8 z!tul#(X9y~{>A0bM`0)c5X?cR=u6Z!Is!ll!p9a406^j_BZUq4*9Bg4r}c4r{;XUE zf)p3-Box7oG<&AvB;)*Y4IFS5@?%B9l(x6Nz^d@A@hPH^8WaG)oquNd+`nUE zJub|VRzhAv_c~+lsys$5=<-D3c8)bd?ozb@+4b~_M;uaqOb7(v)Iit>3;ALoj{cZp zHM5J@S>FmoiIymwwzv|#8s5No*4W-ALB4E|ChoDu%s|zRC@a?0COI`{Xy?2#$aX$n zI(OK33{|zRZd%ZuT#5}8q-F&Io}sk*(;+S4B!VPqh2bnX21~?4Kj!A^87n)<)O;(q zyy_+!CsfC99~{}SOk70a?i-Kw2`I7%+3^4qqLcwiqRmMAhHg~drDl1qoi>~WHKHHA z{Fo8Kx4OPYyl}n~j0K1qm52L24s!xGiW>AmV`oR#!Wp+0kFYb}rq1*DVBW3R_V2PL z_q5kFiQEkDCbHdAVU6+Fog zw9UJ!tyn20x(0t|$HtO=IyPnL*|vXk;I>=cJP}i^E7wXlN!H#mv-4rp-k1(702@yv z3l)pl)XE?N|F)tmI6`1tl@aZ>nC{EW9%nLJgVp;H7KlMXqTq6tHZA#f|GKti3b(-O z(s$CsbRP>lp}v0~${}7VZBFS)7Devsa_bjU(=#5IEl&Nl)o>yx>}OGU&s>BX6S?L? zFsp5-Z=|)Dk*s3I3a563XMo@(k5|8T;O}Mb;-=2#RhQN`&ZJaRc+*P5x)-168qx}+ z#C+O1ew2FrT)XuBkYgiq**9WCpX*h_K{N%B;?HSCq%pBAU0X9cpQLz7Oi7@Yf1ni# zBE>E|l;+|(Oy(IjQC-g8T}GjQI5m>bQ+=9wSjY{K(D=Y~v;THy74Y% zbcRRE%Y~r4P%G$IR7F`?!m^Z&Xs#5-7u2-%H74zSgxSo zFOCZ->F!I1fQZDTocgTY;{z_?#m|rXO`_qB4&|c&|z?Zksv|< z0Ejy|C?`sf3o&XYiCH=_hDrxhi;(eSeK#q;$ij&BLXvO6Q%QJKB5%Ed3 zG)#T+bgEHjtX2}t7w~qMHB%<&8A`bx8P~_qHRM0*O~KH_cBoD=*dzPer=oNb2tME4 zx;DM@?@4&G02%qcruj%5V}dknQ_hH!h39LU6w$0%2XfvbeM?fsbdxc}iVN$|`Shmt zV2MrfW1yRr$TtdzKe`6}MwdpXHkA_quxY;%BY;Ii3l_;oMMFbVDm(OapOqixBaqtt z$ct6K=}DuILw^5!aAv7i7PHb|cXOjp%+~%WPO+j7={$p)!D3?qtU0lxG|NWT39n8Ke-jRyABAe`T1zXtx^JUl(F2q*rqWqHh^N4mbo9;iYW( zlm0a?xrNT|e0&rcamijY@O(!H(DF5hc_r3LYV|o@o zRB!7O5Hz(xp@t_^m4Q~sl#|cI?}9e_@d8}Kr8fFW^U^$eheqRic%m&? zm8G{^y_-re%xJ3L-o@9E9gcCiS67m!%07NAO|Zh%tZ)=onDmaA!Y#P;PYj6#HulA{ zxv|ogxJkpnSST->A&)fWL5cg;MX2PeojW}^O|^n^3I|_3My%DjEj7u4&#}${@&EM8 zzwaiXmFJa!_>j1$f1LkychG_cq?#7?Ck(|}^cw@FWb(N3plBcdP6PiIw3ZqLM=-9# zrcNf4{*acCU=snYc*5cZi3sHcC0u$qZXy4S1kiA}+HeZsBmGgR(^=K{;d2?&T!It(`6z_| z=i*iIhzNY1Y|0_vHM6TgsED_%dn*~b_T$1H4_DUy=nVpOgdB+^?UqPQ+b#EC7Lz}u z2y1{bx3DtEIO_l@@7PoZeQGi z=Swlhk8Z;k%T!Mvf8=L~`H9Bao4jR*6y=wcHge$pBO!v)!HONN4-7HlAr~##MR0 z32(SIZe_JLjyu0#F3`PcD-Tw>^hwgPTLMBdIO|8t5*p%n?oSG~Cl8q?KjIqdxs3}R z=Zf(&r3)AN?}&eV^uIBCCpcEmsNLZ7aLKw{)`DVD*ke`F=VJ!7<%z|yu;PPb3N@Hy~0M9;U+*85c|cypv=uQB1DJtuBgG-9&Yy*tY7`ARMPu2wCYg z^RX;lM`2da{^*F~L7tH+PVo#C3-tGcNV@VX+7A-rGCMBumwlMn~{#AGNk`AV4 zd5G^4#KeiX-Y81ibJb+mN;8QxPF@zdbbacHf;w_~7&1mY{3T?+YG_>&c(agUR^zNU z<8=G(uqV`qPog!b8b0<=ndIDIyiuRNd{@3iOnBW&!|iz0cig0uuhf{auGT71fqV#mYgf}Wlg zsRO8^tM&|vA14CWa{0XDI3Bv!z~G^=Tm}f0>}9WcSVhMnNpJv{XTP_@y|3Hh8E~nG zkPXo*GfP0B!W$I>y6D}NZlmT78n1OZM75kIf&dO$il9$bWh?tkq|u=5!z=Ya-IH)< zZtBRDrxjo(LZecrsESq_tjf&H3ZJR)!0JB^$C|-1O5@%WiH)kjj zEe{%0Kr6s1P6X*92%l9D=XK-Mw%|ws4%!6GzN#wlRf%7l@=9l5f1avpzlou(nQ!ul zh)J!&@2QAK`N8VsD7LgxlW`%lI9F0U>;0E$jarymqVFe8t-9Z1Y*(9CPu$vxh8(lL zP7UIIh+-S0Jkk?HQs;`WH6 zERR#GWWo9H;%yd5LmV4q@A@v6xj_g;SnkhkitG4w0gM!qf;I$$Qk;Wv2%&(Ifw`r^ zXu2~qeuRCtn%KkVXC%qdTd=YE4JDIU*58vQ;@G(mD%EcQ;6rsl`|Ym4Z( zf&X&tw?hDkJN_@i2ldJ!1VFz{;9rUVaRMvARQ*`zm1h#KSvJt>*8;M*kYG9VWUNuD zY6Twf9cYp%WM7{F0p~)gRFqlMs>Ym_l?AzJc(!|4AMs zuH=8hKyV`fNX);T!$EI>o8}#Yg8C>Tp`~ccwp$NHnqVS6i!@tLv`CT4nguHoS8x!5 zcS^s|;dk80Q0B45A<*SRNeTa7g$sdy0ss^QG!v3&|LpMpf9?q)uRD5x6y|>w^}ju5 z-;Cd+QL78~?<9WqrOvsFjmy2#wdOf$-JJY}iNhXk6Zwd}KGuDe8cZDUiYDn^w}x8U zApO1fB-$#}{_F**lz^40Ge1?4J8Kg+Q8%Y?$(G_bSA~=QC{L<3v@ZO&hCv7?nTXH3 z^buBSn3*B}hnckh=!X#Z72f}{yMjb<{#m8|&b6WVx9jgGQ1m~={1t}$mo@iy5&)3( z(jWI9A0P!he-gdAgdXCjJ%l>4X|Jhv zx{9sN%bN#dG1Ft!mh*3vV$CHLxOD`zpAvF>PL5bhZt)@oAfDa@R^6$hJBJi7+de!_ z3e;id*GeY(r5C1a8qXhufi{#lhKQ>!r!@kdj|A5vYcKcP9(+vu*GdC4ghu*K^~ohE zA<$$%)_g77nAdsr!&|QAzc0Ut4gIQ5Jr(5n04QT~PebZXOA{M)#sjri9vG(7i1 z+Yrhi`jbtFHGq1tS@sD!Xbx!>zuf==1n__e2m)OGBFNV+v&ks2{P)#|;`ei_S9l)K zYhp18?R{_Z@5qdjWqW_f*J8S5K$$y`)L$p-c@j|2sp@MmKIwh`=%#*6g8~~jt`29U8lm3RjD5Yio%4D^ae7ho<|Tn0!YMv6Dp|A z69-UE;4>NkSa-sKsb5IAD4is^I5Up~>KNOmlUK{0%gs-H`VZ#zdwBx2?v=`tlx66O z|GL3r{SJGD-zox#UfsaI#{9_mKLp_XvpoG?qi`>|K}-v@{N_6Duf)rLWYC=dmry8w zSGBSBXL|XwIARNk33{-&w2c9>oQGy2U{K zH&ees!GANzBk=b~{<~hPzdGZOxXXnJgf-PwtLNVBWjTL+x2No<2V)Cqq@~oP3~JY0 zUNk8qLxno1r5X5*zaey)d_nS8O8DCkVp}=zO#sNE&@TTi6DzAJ3DguUH3lw@SCU0q zfqlgei;0{5ukH7>R`^Q-zgzI>w`MfkivAw^z~3dt1b}!U7D$33lTS@k5@V=~K^01y zs(K^&M-s&H^nbPKuY!VzU$DrCi{2@W(-tIaZry?mmVbcTpCm%BCI1%oZx`TC9fp5% z@wamR=EkG{j{x{l*uMe#=mzMgB{)F+Hh_ zED6I1W+bGNHke$U6lyV6-XG8V-=4TX9{Jy%Prp56*~amtG7KAZ*l-1nBGd!q!b$4G zC7P6BGw`6(9|LHsh5mRLAOQ9-YHHUgfQ~=_;I(6k!GL67z;|HX`ypeze-Kw3kP6Aq zj&X>yflB$z210xw!Tp6ueJ}x^$<8+WLQzNreD2Q9ty$UrB7Z}xzo>%vA3fH^0^IQf z0C_shpgu1+|LM(!<+gO#5r<`r~_D~-)DuPQh z@W((PAETma=*qZnueJGm-JQxCj)g4Y^1I^eYCbr8z38T;$*WGZZ}!x`cCRhi-D7q! zWvh0s_I^*yAqs`T+3yJ+4qwfYC+XL|(l31FvdK1UlO(-b^}9Or-t=-Lf2#Iji;RMm z!xF%kN&;Be|de8QijQjk@Zp z@^3*fJzv+vUD^HEQ*a-6LIEE3KT!7T>mb+=jO0Ld;oqhvWPpj(>#LK+He0l)8$FXT zQfltH?b|m;=8s1gEPv*|-!=XFcEpVGZ|^^DkB8oW-2ZXtc>n+)YxI9n-Xv&v3N@wF z*mW?tTVH8+Q;X-(h$?nh&bkP&+^ylBm$IIcJrOmDH)3;S3~hUwv6u*JMKmiW9#qEU zNqDb+>Gb3^yPOAa3PYMD$rtsbxnN0AuU*}@Y75`I>J%4>z@*Y1kLbL;!F6tiNB6hz8MGF8eLLdUYr+Iz+-tt^C zrPqia6t1%GBOw$tp8tZoA#!W~Zr8FZ=-m4=WKr~`wvVt~-k1Vky+D1D1Ug!tTi|XT zrYK6G;R{$K+C@54TDJjeFANX!hE(bcR^dU%)IFE_yrwu}LWOkR!b zLg$^vKw~!NU2isokl(SPG{tde)G$Eq-5%NJy<75;&rOQj&Bz%qIYCP8e!UTVg&R?V z?GaD9?@my|p3VY(rAobE)cVt23ZUsRVLy)e`R&}5M$ejBheNLgepq(9oq!Q2!+3aF z<*^*F`iV(`>kGRWXbKh0?%a_-l(7|2)ZWB-DJ{ zvcRw_tv8w~;1DU$>%n?$d(NjI3LnA7qrPrcO>}s~yjYj&;iEue z3poPC$u)dLQkdO0zY=l9E!{ne4Zfm^k};{Dp2i7Vl_* zVT+39Yy2Mv`)r01-FC^_WlY7T_EZIIN7WlR(#Ww%VdKsYjz>cUtul2)lck~|SY)>s z+P{-tL%w$}*q5(N(G>F;zMM2Wn=8qpk?0hhI2EG zqynPyy+D`DMn^t>1AY7)W+M5!&j9xBZ;zo|uCakZE$J`MNCFc{iD=y5t2pN6-$}E{ zYALgg<92cLN`sk_0t+DeezAG54W6T1XsRsvP@vcnM0!7SNG8V20|g(L>7~ zeS~oC^WN{@8TskZRBKLT|9~j`M6OHHIjpB@7NcFcJa*^Qh*; zPhFyJVDe{F9Q00k(N*~}U|s)&ZHKTYx<60#g<74yc^M{J&iQ!(nfeu0%b*9leo#*l ztPLN}C#{IZe!V$#mBjB$i$%yiwn#zyWl;^^i*lX@%EQ5FY0KVT-&ePfk=9<9SEq}5 z(%7>mu7~zxQ`mQ~F5cO0HYRZ_dJJtenk%Gc{4R|FwiNqJS*p+|8eniIn=hj<_sGjc ziT6#im+D0t;}TzfVrSW5%Qn>?^H^%4|J1WFc`N+p>8r+`Vrem1cB@{b>o zl;oQ;gi#gm!HtRWMv1Mg@v=;E2bPzG?cK%#Do=-mTg-zeAiWrU*Q|>Y9fc-^d_s-L z*6|t*StzyFb}uPmm2l1is7Wq(c$-_vnGxy5Y>a%25f;waxdg>#ll5i*It;{45i)A} zNC^qka)}Sf)a@I*8r5r24+zml9Gt$rY;u@=u=^rf)wT$1{Olw;3lsx=4m^B%8G3KZ zsjjb{_1IlJap$mY$nMX^6JRM|Y)I8rizG=9YxoHAmA>qz+sr1t*?!Vuxmcs}zKinO zhDg0-j}?KInRmMFNe``BA^cUrN#^B$5#P6PCO4|K7mbsGZ=oVE+YQe&>17P$?${rH z(R%iF)+aU_D=c+$8_BAyS1i}WyQ7(wy5#XEv(ZA*hlb8YOsNf?80o>wDK(?fzp>1k zWjcZ$Mz7C$UpsBGGqVXUBQ(r`aKf0IL{1m=rovAi*cbNMDW(xha_62C%&{!|y1zN7 zj9y?S=6Z>j+N=a&Z;?WYbNnDX&j@|%-1uHNlZhe&MV~=6ckoQkmAs~6jUqe7=Y4Bq zN$=`lnNvDusxNTq5!U+j2n%7ermv~SaTZ8da;ke2nYlw}`1iWohyM9M_ zg1tC8Sc3el=AE<)qt^FSTV+?g+Y4UKtn_)TmP3qQVBPMo982yL=ON8qKfk`OpC^(d zYf4!eLMlCFaAD{UG9u;F%5;Y)uu@W+t!!jIjeJJW!6h4<%{?gbue-y_n;^Wb0i71{ zD;P$S;Ei`!pn*NNLckXY7ceqf$STzFs`vrdg}AHa{(Sn#5Y|m{UD%Ox2hFhNnIYqE z*bMJGQqg;bjXk6i7{x0%m*M=0oYtm!XfVU$aPNim$+wO|p2QfW5W5TG%AOdfl9(Uv z21pnsd_2>Ut))bs(SKEwqQQ%@Qud2E2OnDmVFp`SSTIYdhR?7jc}~!Tv=-_HZ|aNl zjbNMELt+(>9gIxPHFX(NP_T_!B!8>0X=1t^HgVmlma%XXyIO;2-tN!&#{DCT!PAk( zKpmb@ep7QiJ61e`C|1pfPP#nt{?MhXm^_&{(?3EQ6Q)fgAWY4%Vm6y-x-sIDl)HIR z>5q==O33eOOpom|Ut8=7Cz@C6O26N%oaXh#B%z&nzvn&bh-7X*Y|FH3Kk5o4_C9Pq zw*YP~iIy4d96@N#)2sCyOciN$fwOYe#8aP_!#nNT6Fbp*^yOctC)ZunDOXDpVM{7*qlDG$fJSryeL0kub7g zLYcDsb6-XyQnN_`>f@BL0cyakYV2}d@Bn>THI-yNWz(YH+PtJ5g#VmaKAR>0<_DY@ zdb&vQG#+Z=z^;R*57<^QnJh!EY(HZlDJvv=V7nf^Sbh&PoM(-!PNZ0gqNNM;pM?I3 zlqpiCPQl8>3l^?kfzv(HBk5Pl_fSEBF4)B2&0&6MlHFkW&(5|a)!&oG;@oWPm(x_zS{BL7#9VaXXBclN+p z=aw_#o1RUdd#YH|pWtuPG2D?VNst1u!T2i564E}|1m;)r!pi)TgjNX?%z8AVYOhOU zJt8KmysUypp;yrxBHhyLE;Diq)h}%&nv=1C~mbO_4lX zMCt@HGW2wpmkQl6<*F*$^N5n-z~9!~+TyKy4yknsA*7dI#V4D+FybGowJjjkDxW5S zpI3Es8RTO9N%=&Bp}d#!sor_<`W{82!?s>;fhJZM2=v5TS^KaNcAoyfjc94<_A1ZNWbI8I@Sj9^>t;4P2s8tMWR78jco&6@wZaD^><2@MgcjKI6Nwfjs(bwuo;plEcXAhv z9<@*1zN(a7IaN1TwWO`Y|Hu9VoC9ipaDIFpDh$#Ku^bM*7hxciG(PZZK_lp7jrkll zP?}n$ODtA0pOxo>3FDAw z*MNfX!zlip^J~|WpMM7h9ibY7b(DG$FQI~Y#I(6PpPv1v*&W`d>iXL24*V7tWHjs) z9YNAS@li`Ozy}5_nay@f_txUY9hCSZ4-og34>CxrhaJ3P} z!#m$@rZs4q(n|HSx8oM*G7K7bd>Ybr_s-;edbV$ zxjk}_M;Bcnz&s@mLTI!=rx(&JXsj}+5<`nKHT=729S`@}{u^~`$bZKxUhkaDh3^5;wQ^!K~P zMHjJDw+}OsQ(MG*0c*MbdPa*m|lm7R7^FN}3x|uo6m*690)Oo1wK}Fl;R>`!ic{v&|sx~suS*4(0 zjjI-#S?tVZzrv>W6k!IlvONAtCSXz2{3053>0j|Fj#e&K7D_Cc|N3l2kn;It>b@|R zwOY0L5f*uBH9hiG-FtTWcW745q#xO1{)?vmaU=cXH_D=byw51m(oaxZuGbTZ{IId- z11pO3>;?XxoD9O&HdQ+g{j$iUa8YZ&RKH$%w>);XcD8rBb;X8N=JfgMEvvw6V>@s8 z$Mzx5iObT&8?uNnyGSxV+_bsZoOy;bl2f|g6F@{ zv=Wv~N_bCXyKNj)6FF*?q4q#}qJ>{=N^bz9L!F@vAQe$ape=Po&770kf6XLiaKz6) zah-R+KrNIv15x z1fW~4ppa&bI+I5SfhnvdjXT-(IQAIA`$g6_l48wmu*Zav5A)0Fc4>({w+PacF+-Le zAEm70R4+d4lXO1EQOtyi8Bj;a=D~{J2oi`qt4`RqI&F;oZcVOFqOkZ;Rhv64Bt>N* zvuIjG*lNWp58|JWq4a%ST7=lIbmAMU^|j|B;{tOCC#8#MO7YFPkmwY$gR9X#?|6S?%wsFf2o|Jw^L zROk^hqZ;jZ})iIYW zvwy8nblU=jGY>oMP)P|#7gc;-T)c*{xZwPZ0=RC7#2E2TUm2hjAL9Mh_dZ#1u+ zD&rOM+WT?q2FaI=dQ3q)7CZ1U02>G>MU_d-CT#*#1_c`XiC}!5+^*)Bvp=No+DKrZ z_>p$$d&NAdp39ymI6(`FKO6f?j{Z^^v4l+A<|1B5j{Bc|17eNhSh0R&KsqpA(qh{< z2Zn)PcYc5l%`u2(wuJ~O9J@e1If_(jI#mKmx=$SjU=iMf*jlr6u|a8FGfK{^<@!T^ zB!hPRU2KMQ-bWQ${w)O%FgTuOBpF7rreK35%Pu{Hy}P)le3yBHR*n8`WOY8Hxat=f ztraEZ_;R;mz#jTeIZ=pSPV_qRIVCzSN+kR4fOaZ;Cqe8@Gks@&CrG7u8^PK7|AvRw5W8|v5Q zn4wy|$K!QeAU4O7OhdJq%{_nRF!8xhMHQ&TMu*91fq$~aPw~;pfIh(oAi|;n<`r$D zIT<<3`0eMVfACQ#p^$Zyk#ND{DDTZ>$!a#1+DAGPqG<~9nAIwBb0Kc2Jc zy$uulR;0PZGjQP{fNQ84k7dVLh61E5XZ{-EU#$CFHnh%d^*V=GA6IJM& zHY$Eq>-vs__g1)5oky1Z&H@|pH$~Wq zQ+5?@eZ^y68HjS7>hJ7<=n2@^uY$47KrNg#P+Vr=(9EgOx5%eB>7@RvAu)s3(vu!? zv;u654MH|+<0LXSo!L6ctCEzfxYoGkO;hS)_e>l7Igu>FVZFAh?4U3D? zEvgUqJc%-&~EH42_9LZ&F8tzuHL|F3#Tnh>;uS z@Rd6^TMoIkXz0Fea{OMnxl?<7;P*I*Fn^Pj04I}bW#p}@x9z6}udjHA)#A~ce5yL# z=UrAPeo?1Z6bR3cZr=cE&H#3bGY>0$aI z3c`sSZ;k1CMr}_-mAdrqJk)DuAEBQ$odJR^P7ZkilGp8Vo!0AtgI89wg6DwWPui-* zM+4oB{PwAKp-09>i9~H7L#6r(4;>|o@_!Na6Q(xu(>mj3U+|qQdo*XX$Wp4ZCLZ<9 zRS>*FWKE>c8`8uzEJHjdBl{Xf@3EuAEexppynC0c8}^ZO)~e;R|4r)ccml zm5Kew2~E@v*VXow*UMglrcGP(0_Xlwyq{R;JwxYpy<=!(chslBqtcfyC>Quf!^ulI z2hEl)u4NHDs^S%O0eUP_?aSLozXv#8aAZ)H=nQ`-83(%L>MfqhV{d|ef$*8~>bfa2 z?mIKEZ1X+AR~2g_Tf09jQ5GSBLtJn9Tu6Dl-z(Mc@! z?e1LzGaWJ`Y@AF?i6mP zcSe~N6#|_Y9+e(1S-RDhwksw1GH3dT}%nzGC|k#g$(KGt&G_;v8q}nCCyiO zq5e94XT@!2)&S4_HQ_I3muaw|`rkMAGx?VFD=KHz(>-P-8(KyrfEkx$Uc^@MW#*PL+PEcHzM`32W~;oa`dbb=CP3 zwe#Os6BFqI?U}PnRr>Ym;3^&aB*P74-giYdnH0$cHz8dV$2(4GMse|IzqvV&UFGQ` zDbiY$-j0n@ADiBZIWTsXodK^;)Q!HQhWYvG)e{LGeDjK9=RkQ=w0dfi)XcJH6HEQN zpW3USB0XO`hBKRv_1MPo;Czoq2x>M{_i=m+3lLbNR)@(Fp7n0qaPaBiA|@d(!=$gL zVc0Sq|8xg|F$b^;sh78FX~i-i5b+~yvG7*G7kCGJ`~tZ()Rr);KgLBvL~SFQ2UX?R ztw=6pw})w+#4k&n>!9<;Rvmc6}%&Z6A#Bl7P1QalEgRpNjV3 z{kg;i7m?MfKX?MI+HrzjnL(x!D>)HcM22bE%Aw6Thn<#L z#XRXvoC?s0m`ujI3A|)IdUrT$X4&}>dB{i}Q>Ap7$15Om-=kO_K}F{tewxEAA%W5z zWNM^KBV+v4x_mJE?S~rSiyLF^;;SXiqho=JgFL-ABfcpD*T#xg{5(x{FNLyR*=c1) zE7g(r1WACI*Ok_B(o$}(qx>}r(%x#deXe;I*H+h)dCAc3o$GhD^x;)WIK%RtfL2b6Wjd1z(8sp;lJj7`>S*}UsOUTPbrI`%_0$^iMz;v$4QcSN?2z86)y_6o z>+ZPwK0tKc(KuZZEnjXP6HqXe1|0RHHa3xzE8=r=-c;I$MURD1{yyKyc7kRKhs*}1 zF@oi#ZDFF?SxszcMcFq{r+?H-xwf`R`h-PEVZE9(dag+juYp!$JKnhuRhHNCx7 zMT}Xzp(k##-&mx71_IG$Iw-IDg~0RF-XRQU1Cs}i070*~Ft(%&L$KT90GqDMXvBf? z+*}4{Q@kjQ9}|THZ3pm+pLWitKU z!PS9}0ERn%3AgB*cacN>ZsDYL+HjF<{eYl@$!83iaYT zJT&CjWR089j~)nTzTkjQyYV2IW=C9}U)Q9Jv5pjdAUmHZnkRqsXT96KcQ>|9l6m`x z7I+67{CQA89i=}+K%Wy1E& zzJM$Ly`Mqfg^Q^xFilXgreYCQ{0q+FEI|tU7yW&9F$sqortk0uL$-*LRYk&E#WFv?_Y?W6P*`IStrshkFNX`hAV25hTURELq(P zN|0kYxdCgp-gvp?<;A=-)wA(Kcj)Nb{_hT+WH})?b{b>#RBWUVZ`J5#$X|`^r_-7*aPxnqLp8| ze>ds*tdnk%hlatvFq!xX|C_#wk7U-fktGC)k}onhRy0N4_htxksF9P5nH7&A*&V_@%-_iZy8RbNi zbM8u^WRIER=Kdt@?Tq$m5d9-Bd!JjM)VZK1>~mjdTP<&}oN&6N*EV6aQU)4dMy7?2 zwFx8@r1y^dxtpjJ?ejGNxU2cbxc6v%*}sjM0A&;Z`vyU2OM|jRpq0j2izszWQOS z6F*9*D5JolCt0^q5$}yh4*wHg^@T#`XF+nL8gy@9f_z%Cz5AdZqh4N2pI}LerWi9v zDEj9R6)YbV9#ke8OI4qU=@DdWdFvO{$3cZy8+kZydK#FbS+=&h1VKI2#@6n&jd%>U2Gb!!*K>OJXg+ zSTEoyL(649b;)v~oLKLU3~`TBI)5|4KB?D`776$@Cf1g8dp)K@`2o?w^gFWq)^K2}A zUa0;jGh{depU-1L{<=<|*Y?c&g}a5jTC_RPDb9vToV_!B6>KEK?AI9s?@UdbB4o0krP=!}0!~@IjX`8>v)eC)zv&SXR z6l0Fh^oyJfQT_Sj*e{q4b3|e3*qg;mx?9|-qx?Sh zG5C;=2Iq=`X_B(O+lxZIcMBi^zo~bRqDTIG5AQC1iSiVF|8sxeD}12S4#5j<697QVJl`O@Sv z#FOISh*=erlbhlWX_}#%z=@eChVg#FmdZgKVB+oILuBwDabcn)NB#6kF-X~HFQc%| zk|Uw8*-}FL$KjQpfMhx8xcm6s^3F%^XJ)r4v&z0 zO+>@TzP!5+Ql;kG;~whHSr5~GJ5oLvUDg2!lpzwW{NsLr$A?-24DFp%`2d8c+S+Xq z7XDk%$_xmE4+1@i+)O{3_o9P9{dXXdB@k$bPb+;~|4Aeu-!(D@wCf0bfp^fO9!nR6 z0KI~McM}RP^?p*TCj`>r>#>A;Xw|}Je zInJ~7VxD8T#}7h#I~|9eLjj~?!XBTClP_N#>K%k8s!fAKXfTG!1WE1`H{)Kbls>#~ z9r6jz^ULEuU-<-twJrQ|$2o;h6yswsuHZ&H zDu+N>Sl0a6Ow_D^5a5FG=$>6xv1mTi%-YyxVPOyGYF8?edCso}39?){@s!z#AIXRXT&e#5;0FUQ+*U7?;b(G>pFfQlyk$_iuG~lx_Gw8 zI{QuaH#l437K6FvHIm?V0jK_r%BW0%Wue^BfE`-mG)@zz+s$GXtD?L zM&i`ut|bspK?OHVTJ@KA11`wC-)Ne&sBya z=^{26O>8&iZ|qx(&s-|a4842{&nW6qhbeJ}QcOLRi(RcOk-(_+Eym7f^t#}Veo|JB@VTTSQ$*04^YEPc z^Tr&t8YYW+PI%iSB7c!Mks#NE<5}N0J~u41$_obV!uMC^PSopvL?MukS)$=x9|i(xA625-gPX1 z+$Q}vsp_aHq>AKRdQRT){TxLbh-*b;e5Iz*pyJ@w+b#!Uy5!y#;z0?Js3M}$_D60S>Pp=Hq(xjS>q+qCIx9pI%~F7Xw7lyCRahlqN~%1 zcbBbqvK9#vx$0)ktWfw&eN9Td=cd#ERViND7QA1P-#qw%RQZhIF25r7eP3os$(Dus1G=dK{jl+isE`yC&p4P=s=#-*UHfo(XB$-o9=^*<+uH zfz)E}jzQszK{6YFM$$A5%Y6~n2`5kId!UHOOczhz_pz64!)yI>bt+&0&|Zh1e$f)h zNd^IjJ%wSxoqto6#QVePg0fGV_tDlpbV6Wnx8TZMs z9}aw|7iL9X27L#mRgwi!88tNM!(gzvy(UviB5#rlPJt!bgg46flxv}GpK?heXzFyz zw5uEW7MZBG#Cw-?Os`dz4#}}~(4^&*Uh#Ip#jY3*g|f+P@ItIql85pY+ir-ec+#+& z1oxm-o-NztmlO**&h0_yE1uW(PmxoMl+R9Z3gHDH&hX`RJzcU1GY;9s5~5ey`+Z># zp!U(%(`a|i4M+N8C2SmnxEuxX^S3>vH3_j+1Qa5>a$3D~sAB`OCm1)o7bewfq-USj z^!C^mX&3O*LYq-;B#<0S*Tg0#PeXRe?T{Arsq>RKj0j5iCe`B`-3hMv^RtYn+0_{Y zHcx88CM!7>$}^TE7l*V8*6FXU3NQEiLhqYW^B~Q&_=ZOr%Ufy)W{(D3jFCrE<&Y*r zIH-Drx(2QYJ4mK_uaF3eBMzEfbWNJ2T=LqbN>o}gh7~8c zBd5wTf5vjwEs&T+fg2#pVqN|xMoFW#n>~0tW%y)TEAsQpi|DF5x#1L zQI-u_H;MC1RNT|)A3zEfP#WdnT?PqH;N6S)gakseqQi9>;6q6m;v)xRoZ?3W{JedF z*jRDG?*S?K|(ug1X&N%Ziuf zzq1B=yd{+af8qX&$+W7s!N+W3s~4nUfYCBEi~He-+QN?hWry`CKa>Af71Z*l#41_b zkeRBW5FI(GCi!W+11YMrLZ%5EEF9OoE?>WUIkyQ#d{~99@ETqV(iX`C*5n)wK+B6H zh*{+IG_he``^2{wj0Px`TKyMa9kbsFE;A9r+OE~VUxRLI^PfEoh&IGK3=*osyYBSn zg$Rv!K!Cx<>ADYMis{XLx7wg8uFyem`7Ht013`I}{c{%%>jv6vh+g^#aw{{^z7To% zL45$cscWlMD(Q8ZbMR>3&Z>I~TC*YAVW3wP8LBAd{2i`n`~8m`NX`K13H-EaD+dhtx?Uv{V;_0L~b_VIrMFx>$s&b1g9L%yR_u9|j0Y9ok=@u@k z)2&7mB=iVDYtr=m^6^E{DpN*$>b(gs8Xh?;^Tm~F0~F0I!PF|lX9@02QRWm1G^QA| z!|XPQGDVnP1L(REH*o}=ML?6(g5`d zIMN{3Pag>L2#Tnj{l+F>o4WHSpgqKqFa4G$;P1tMU2^zA9g6sH-G(rNa8!oa;H!;& zNtA{&!vBmFlBVlr3bH~MCjhaq8#x7`cGVI9XC^^B;%jcmEC@f|%~gg)r}KM?L+n?%#!Bp)e~LovZ@(sROX^LYPa2Hnfax8e;y^gop~VY7=s?QcA=Lmw z??9luhL}Q*QX$^dFbaMYbQuf;5f8v}Z2H1hgx&{1RVicPh_TIeAW%Dy$acb-Dt0y` zuKE(K1~O=gn(Ep(%YLnfsgR&=$WbmN5^{iUQG}godBy|!YM&1J-2)&AXccJ{31%KN z>Y*Bon@12f-v-L|O9UEk%#iBoc9g#Iz3=v~oVV{wcv0Yiuzh&Hjym?7#37`OTfjV) z2bPh|TV0caJ{4e~G5(Q|^pI(Ss#X5lz2Icbf(7!-TdMtBxM_)2e8(iiCSXx<;sUR~ z75nQfvrA6t@f`jWNtfl={T8a3JGGK?_ojYT+8F?+#;c7IQ`HR;U|)W5pLL^$R1Ri) zVCndpp4C(Rv=aeIjl3|?c~*-U*K(>=3sr4eH%`733kc`^km+>Auq5Lhb>fupq&Cgd zu-0Wl^npjG!JU->_lAoK5T~f?q*nVbSnFNfo9EQg?b{P`p4j=wSu+{^rieCY0--&2 zk15m3&%?WKk|*Pt^J$;rvM%LnW`+Mj9#b#>ru&JPe->!TdZsyje~ARRT)tS}rK^z> zip&|SaFr!znBfEUQ#`=D{Fy(95cZH*lxsud5}!@A*&Q=M9V)J1NIm8#l1lAU~MmEuXyX^Xb1@9bPSLGC9za z5_r3aOF069h(bBEJ)$hTC|)@%m;TS_NYDo4$bLl~^k~7l$-!69pG(MI_#3by2O6>x zOLrKvDyJ#7BV48b$@nnrD@Z-{0^9Mg@baIHru8H4!>=lbHtu_?0$yt(BAgPIec~~o zF7ul?jT-shj^x~X-`*|qNl@l#C;$0E33LYpc~1KX?~9OKWk=tS{~6zY{s-{i)cfzS zobWz1*;QP$$DmB>X1?CJ63ZPh)N@)=*ou;jD>gc9K<3?MKFzrj*6;Z7NAShNzpc?t zg^og!i{%`|JV8PlNIHS_w}-L>6Y{4{R+ykJR(w>dRW^Ktd;`uL^L=bGm#}F5UYX4G zeEBn_qFbPf=QO?WZ&?L8KrS8QLnz>?BQ;=FI4zpY(#2Hl12Ss>&6H!qwv)x(p_5c`1xMmCc7H zr#rOF_ud0)!5?OV8~2w?h7l|7QJ!}B?M61Z%KAj zYj#ulCpcVk%)<)FJp8?PQSNhjc5T07lp2T5p!V#-+^1OFCy%KLdWE)kn^eY{RN9p( zo0nvpsftXhio|PeoL$1)OrS|lA_+<^t%Nm!*j;=W_n+0LpOmJbY(v8BL;Yc=cdd&j zzvfKBTxv?{&T+o(FUh9BqKQGklElCN)?GeK z%nc`|`q>F|Jy&Y`4(&0dOZofYaBW-O9kH!#W5yqT# zd!;j;rnYIXr%f|mpQvhL_yLqA3a4y4{Ktx8t7+XM4Y%sL{X-|tRFP*i*%Jj4A#CZ+ z_|rIIk~-0-T&NJLhkjVL74mI49M*6KgFF%T@25{Lf^-aJW2Q;tRk@sEpq-5cL zTY(?_r1^~}821#S4(8nNSu7+#9UT@;OlD%yI-K}C8TCtM<;f>-Z~2iY>Ke8Zgc-L= zP8>w#fZgV6>>wWXJbEX8b_?!d8ejhG`iLT0RHO{u?DHEFj#rBFn@FHOGJa)R{isgo zXH*5bFe{J?Q!%XT<1p>isBsd62!ugfT;O_nb=yFX z%2kX$u^cPgv49xOwci2|J<`fA>Gvru_56>zTk zr_?Vy#cmN%J7@paGyi%@;)y0Q0AT3+k0jBgV>9rHsd40Q(FL7&7R6U>2312+L6mfG zM7-eB{Ily&MuEyoUl*LMsQ{eCW~c#^RBoFv#WYB8;KcNY<`lLWh?Ie5c`<) z*1I-trEK#n_h#M3X5Go4r8!VKJVgqzR_+`p8uW0x1QLbv`E@9c;F zEs1>ydSqkw)}rCZZf8dUN3QJKQ*^X9J)%%-ryLI-=3fy(M@TV`f!c27Zxb3?LonxT~HMvQJ*otf5di;@~N_71Ze4F{^n{PE4-y`kRAqv-8}Oa?}? z@$Ei8GjELz1KZ__|4CY*`07SzjMc%3bKSCshB(6K?eVxwD{E2xu*bZVryoXL7ad{T z7K59;f||WTno%y=Z<@7_*O(Q;3l}F1kGGqyIkc?`Y8NM6u9>2RhBr{3`^s8J7Phjl z7$(!Se0s`+M))%c%sEPxMpjWPgndhs?|sr1bQTBI9vo+QEAXT6GH05o+2XDqGhE8H zN;ZJI+>TrQJ;YjrYM@Sj;a-04PJZt({;@|SDe9VvA1O-+W^R-@K((?XS+hHu+7T01 zd$wlCk&0k_C7+wpeHqX~;lMl9m+6YLgf&*2i0M-5Bw<6_@o#=O(Y9)?WR{)Ce|Muj zXvQiSHIMw7Q9AqP4D>S&hf%TTvRnB=^M(B1xB6kWn_e+v-sJ;b z?4@0B8Cs}MqsoW&`Lu9YO7n_`yBR*$AX=@`t}Hy19}Tw8jFe$|d-Y^M+$-S!+o%HIGPUdVG^tE~yHh z`cMqvW6l$26L(#H3;qIv{IK?h#a_vZzBjoYoKrbyYY(XR4jE`TQFeyt=&ds`@B`rXNKRRjwLU&_r7ndF}>4}d3K;htW?CVJj z4Fg43_X(t12Y@1MC4ovu5msm;ll^JQ?B|Zs!eaw%9fJDTK3QFZK&c2T)1Hlp6b+9mhN5e9peCs!O3L`j3T-d3?s%wM6VL&5@ zGTvd+CJdhyn7pc{IpS_DS*OXk5aLp$=Zs6#qh764Hsyjn?2_5TtZRPeUl9y=Kda(d z9KJRez9D+Xf9wK#)8zNDU`;RCWur%U3Hz+xj$s6Q)}^+m)J21RSE`!If|SW`H1ER% zZq$3jU<=$jEMeS8e^yR(230 zP|YKwRO6JySOa!`!bCmT0KI(6nec64}7U8QmL3A&wzYG6FfeY6m znp1-AZ}{SmftdDk;J*s^v6WG9RK~*^3DtL|Px+&%ZAjpPb{gP@Ia}zcPQT@p^1gXD z!R|E9KgYBrM&__6CcJ<^*3CSJ^3j0h(ErIn)I%b=8{zjLN!aBSyvH7N>!q*Wy(o)U zPO|WX9NBIG+P}erQ+oTivS3+VLH(2qPkmFm_R_oZ<3e>emD1+onWgD{yFai5+_hrq zN8pUm^ggMTOEgHuXue?sc0Y+zeG_|9FWbUiv@W>zq>n%9uuntn+Ee(Wu%1sq$gpwt zNp5WmniMw{8=VjD&`HF(@npBoB`ea5h#!sYM32|>3%9)RqO&b^kg*0T2(4mq7fqu= zLuMG!d>`O~U75jr>2o{gwVu?pVw%x6J#{37%}gAKB(v6al6yu+tP#8+z1E<_YX?|T za_FHWW(^tlK%%szyMVt-oa>;Y};@9ANREzlA=Jh-&7BIbP_{C2Fu<%KqJfcC%frKv}H!ZRW0uMrru)x3U1YLqFW{ zTn7nJgE6$5O@}$rYAwp?Jlx?8jk;(*;-xVxZVeQpmaj`$2aV?!$cN>Qc1&AdtJ2A+ z4Jsp6Mk50$6Fnmo6=zo9)n#@gv+_$A6TI;0hMx>0B35gbjnxTaY zveT{B$7S>!c0&>A>>Gt608N8Fxzw{CBe$>2TG9wu4EoZ{xlu+MEDieJrJf;H;LFut zCE$bLg_fz{Sf{Kb>at?hS*J=Pu=UMvG@Q)zU3clv=Ca3h22*u;Kk%Ek4WyoB+<9bj ze02JX=J@rB!0=I|*Y`}paYEEtj5-$h5;IZKsnsVZWZ)AerIO^!Fd&FlN-{6xH8w`* zZy-bxBNj*z$7>Ps_c9$N=HDx6jSHkG!QI3Sl73fMZ!mI-F2&?0L(C8SFZ~&<|n!Si+=CIuPKxw)XB~hhFs4#G>PA~xn z!Cb0KE7n2%WyZg8m89HMCll1%w?TYxm?>vLqR19)SL^MezC7OHz6d_b=j77bW3P#z zZ`u-K^@?jBta)p*Mc|~L_eN%X72c1mkKAS4A(~eJKbRrA{RnDCF%JlBxHUfi0V=LV97R75K-DlrFF68N@kqCW=J1iT^ zeXj4VD5h|XqzLxApSomyQsn$4m?y=*Nm7w=$BXi~izn_h@+HFwhw8HVZg}2aI3<*q z5~r6E%-=Oh^GIDxDnPm$8F!lc(v#*5C?62|Oy~C}r9IRAS%2R2XCG=@wyQSowCtrI zBf>A&;gcjWIR^aem*<#{pL#@nJ~z5jPA0#;q+W*zb-B+6lLY+T=s&mkQ{(^YcBAKM z9mH~nUx1HZ<| z3!~p{$O|R2M#KxZ(&ct4^m${AAV%tX^l$O}HCb2#9O%6@xT$WG&%s2m(RgA=?Z|}| zMLimPFCBi{Kppm@7tRukXwS^s3*Mq?Q7rib-0WQx^N!3CZ^?1$xy|ZQwvp=l2&?)V zCr1CaglqnjXH`NOIf1ddsM|)qeU|pf1&O3Rqt#03Y|6^L!mjrAu*6bLkVE2qgx+Ji zTvVJ|gh!~74{C!cb-pUxBD>0>-$B7f)51x;rx@B9fw_rOpA?87%=z5Pyd%)3bLM2N zOxBTcc3^|htU^rnn^%O{HP1?D$u|GI@0f%@t)JF5$FS$vqqe8Kh;>nR{kQRjJ@cc> zTGx9mfv2)e@9+O#FmoX*DDbk51^nV>U}a;W7jq9?jsjB8f7XzIDH!JzJQ(LXPt#Ls?(UQ9B&}A-KZy>axw%Ltmh^GIM!W{=~ZIrvBT*!k*XB zFZ}V>g-mkU;p$-^AXJq}Iwy~2Qw0Cz8}yF@Av%)FPS<+_0k5h|;W>FSnl~!On(-WLv)IGl)Ne5YhZDHtrT-yDuy;-<^vorZ)MEGdw?>1?_aNnaAEc-Dz~>cl zkbN%b>jdciF6h-I2=_O9mVo*NWKJ%!8e{qfw^O-oEKn!2(-Zq_(e3b{7K5SML) zGDxF0X4ZJ{pnCI4^W1~UT`1|1Sl*lTo%gYX_p!KlmZZ0ys5dFtk^0>pzx9?U=cxpX zny2z5Pc#ire{A~3z^L`WXy!nF_2!1=xntQiDQlx<>7emoZ}sMPO($!n#w$ywgKuS$ z$al3!cN|GA1aiv})b@RGJXaoAj8hQfb}u4x*c_PoSdwPK4X=zeTk+LdXsSHed~ay$ zR#+qcKtX@s+NbX;{ja;yfhb1Ee3Ti)81hjsXk`N8sk#O+);2>NoFsXF;p0k%z<6`9feafCo* z=5Eo&EJwO+j9@`wP4Jl`;`zoOPK6e9Kjyt!gy8FTC0E}v$~gRFTy(lW9O1>wN;G;m z{z09=9LG^TR^$h9tUPG$UeqOPv~&ufrk;6|%uvtf!tW@LiZyti!OIdHg6*#SdFb1E zSd(1JCihvbr`G4ezV#9vnklvTff#p6m1|rrr}BZMCCMn8S5Br;tiyD%v=4|#V;L+W zxU(jVN;!6Tff2@mlv#Mgs9k-=&G+>V1A1NbKf*DufWe2P;0Jxo-I&g2}hgSU!ruYu`0^xwI(e%(_m}d zu-kw)TBgHTkQ5;w@c8$1gN_^8u9u_=L9_rt*urx_mS9mk$?>P}6G3GYNyY+EM{C>m zRoUM_pO4v{mP#r+=`4L=%Aax6nXYZNQ z;^uN)bJW-^%;IrPE{}{Jg6kt?ADWA=>=k7hI~aBM0xaU)JL>t2g>Rif;19U_^V(Ng zv7`Ft)-*b%92yXhZD0s`zjft`+B~D1G4s^9=8pP3!z$%PyaBr)q>2H9Ai}p*`V>^~ zD0sxLXpJBR#gP?0E0HSVgOtn$l2iPdlw+l17NCbWyPu^KYH|^urHK&l{MJwmzOshz(iNO23&ZxbI#3nrQZ2 zaCcuEsakpuR<`d1PMK}|Mo+Umx^MsK6?vH+$MJf@-vXX5yJ&xXm0jH1Z}R19jj?Wn zUr(P57&t=0SD`vWZlp^v?Lw3~m!NFZo&(qv9XqYI%WIL#n%J(IW6U>YIfYl?At%{yC@gpABLkxO z?{)Wg-9jCZF!b^C;NU+sgrh>FrY*BUt@(L^^avmBu(bd>zBTq z3n3+%G^X;fk&KSqt;P`g>ri+@2LP!T;Lb{>=Ld_9hO}l1fW_@Bt-??GB;sMvSVm)2 z5}Ia}SC|GY{)_I$$C~f|{Ad1`c_#Ls14Hh_ovF;z29qtF zLSwYg*JUJwWK9w<2oU*{C@>j9{MsKgnG*EmNNZ=GbeWu#3Hj(FGZLibODJe(V&bO; z-dJvaCUjCp`5ntr(H6x1jyZqg;-H_k!5CcI3S3*V!}N*q9126x_nuMF2X?=5!aiyC zv{}&+L!lvzHsv&+eFGut6YXOJt<9!93Bb?wYcIerQ9wAF*3+N10XplHz)f!?^T%lb zrC{z01pt~t)f$3SSr3;WMf%Jwfr7&=$V^7TGY9YSjwR%6to50H{cWe3`kwh?&I^%S zI1#!ow6Ifu%9@sVrjs7Lsk1<55behKXCi&NF1(6$B#pDc(%UXI&o!$Kyo&F?71Xz= zJq_hM@U|ZZ@wQiyKAZ;TePY30Lz21`$7oXw_$Sv7THj$63DvXHmxcEf7QSt@1CRLj ze+v=Ya#oT4$r$wFmEHQ`=vS>Hse5*Yv1p#bGPeD7xY~!ecr76V&8H;zU9=J&4UaqT7{mWdlaymwxg>jOjOUG zvf59~Dzkc3AGTIF940+YD-=3AGfle$luIK@4rASqD_pl9$;;5fW(yZLi|uDZOp$`D zty-0zANd@R%9}FCWoBefgKB1Eh#NSP7owHGj)YYEVq@s4QQ514Gl?-URK+)p0?B*; zVey2z;u1w;sFNT==g1>R`}I~>D6a&?*ed#hJ^cIAeos>UZZsr-ZtmNDimB92dSXhv z;Me9fG~as$ZJ0OEwJxFb?jcyNe7LTBTyppu0*F3ys3fM+z|jsJbY^!Hc^-Y>4Z$jl z<8cTeT9jg0B+vBFf5J=jqgA8_Xj+fkCw3{YXIi+SAMHtgy4=PkXd69{#sojiWIkSW<5Z{db{GzJP}$U!%~q*_2K&UM*6=gw=5v0#zR z4&1$v&uc~Bx|HA}Qj}-;jh4n*T&dSBEZ#P?*y+Fxn=&h9%T4cKUNuU3{bg56(hFB9 zTWZ=Iwxp~lEb#mGvkVj|#3`USr}&GAl5`5_CVn)8e} zt-lui3{~Q9)V7mQ0^*=pDhNfLlZ4NB2cJ>ywVuvE@i6O#uIPclz#_3_s*1Qk+rgqj zZxVZ;nsAhB#Hz%W0>ppo!T^Vb<6kV_YmoN`QbnfuGn^^Lf4kWiu8K@M82#|1*6kGK z!WbMW=!2x`MOg?H=%EON|7Q~;+oq@#6INTiiG%}NO!rz!jNwlFm!Z}N{?2}RiJrN6 zIqcY~L4K;(pYzE7sEnu#ZvEe)#LTOZleu}4!$Y&!Av@j9(s!x?X{CCJcymk0t{N8& zn1W-&%s=L~N)MeV1awv_?+`bY9*-!WU1Kv{*KP66zI-?YAhadzfexMB_)>MVM=BJI zXN#&29!?u&Ju9Y8dOmJSxh_ZcyU#!6A3iGy9#fLKVMI5-zEY98lAwLrwC;$f)M=(# zMSx=?4J)s@DhZqZvkYF#{|FvD7V;Q4W zU9R+d@|*Ad<7qj4`M@(eE9X3E+P`kr%~Nl+XuOj`vrYf6u4$qw+l&!yn8sPP_L04D z9sss?Ht$xsrrB@5GXGv%RX+^8_K0rZ9`EfR@f3=l)x6ac#u0-g)fkvW?Dbsgn>?;` zl2!8Nb7@mMcu)e+Bf90D5@H{Vt>MtMKm|4{HXsEyL)Ev)4KLqLzo#^)Zg=Zv=cNR^uJGXfoh_>Nyz$2mHrnW2h8blO3;kL99A;olVy?# z-J+`|rcTQL%kY6?zZ`hPk9cv5lO#i(KCTgdYET5ScQlz|(-RYGhRz1Izb>-)K21gF zP#9XPV=*<7nucV3BD1CZPVdr3d24%xZTj4jFinM5?pvaN$nj`BNgf52jv34=<03Y{ zM2rd!aa1ZD#K#eGxsOFzwYnMQ>&;gLontSs&I0ZujPPnhGL3weGRLksb`k3yeJ;Fe z*p2c-=BhA=v_)*Fn8QL4SmsyJ{}B27Dp&@q7fpB#`#46u(h=AgR8l=5k@(dZRNU*` zLEE;wOF_&3Y|JKf$}*XxPkMJ-@muloZ;USWB9_A^KeBnS{4XJLYjW-l`=wsc^6=Rw+_WfA#=$iFoB)5BcPwgCh7HvI@b~ zi+tSNIfm~*?ulB`zBOz7JHh;i3=r`dg-Zj<*k^KXNE zyMmq|ik%VWr=s*H z_+GIJ7WO|e8o8?s*gAoJrHT$Xh!x_UYIF^Vuo~5%`a_>r5BkH;vo-%G*P0+VXu;$a z*y>r6*AJSoi=z1dQd9hshoRomR+YlkP16R(cc6jgS z@-2{Ri&QE3aBuKo<8@R*pi(kx38P{yzeByO^lZ%oz4VIqj*t~C;Y3Y`jBoaPzQ#11 zRvgD(9nM^b8OG=FPge;u!iI4XVa)l2M@yve73-pW)O1BK zTM0QCm2G>w5;`_dS3tMhaaCCdZvP`7( zjiiFB^PV&(*+4!rt@uPCx8k62(GO222UhnkwF0iLGNlnm&&0}fBb#CR z132yITgmk+?IuNshjE#@HMMfribo%EMBWGpn3xA29>!#n)YMA2x(&HmbPEF_&Y{M+~ zmz&_di*QKOb%tMVo#J=q5U@0(9X&LG6WBAlJc!U90rno2gz9qLf#7!0_e?Z0bqaQ8 zORH+P`7@hRNw{mf&0Ob3P}AoPIRtFXf=3Ul{t-UwKc*^EvuVCTR>$;D>@oP0Ynmy) z6iBE8?EF8P!K}i&l|Vj!%sMwO_Qz~2{M8e4ACm$V&Ao4Bm#{t}&B?RNV+8aWvFjkd zgV8o&q^FFXL*opul>H;*nIEYg_ToMRbRz6SJQ3&6`JM_hu5l$tpReO_k8~+O0^;_$ z*jUHl1i=qLYNGm#3!fp02V~U>!9AaoZ+^-bjaC#IU&X6Md^OxbQw>TZ)-AegjBJG5U zn&_a$M<`EugWVsT!)5$s z%?0hE;gy%i$NeAQrtm!B#;{uP$o>0M73qfk%fWL2KY`$W@bQBusGS$B9uUic=cuXr zBkD6IYjxTIbC4=G8)cGUS0Gp_i{qA8t!@MRxu$S+h9}_}R+4K3C0}z%(q2gT@xomQ z!ic-;DKJnNdXCcBQe53>>sz7`Fz8Zr0|a%<0wY#$@mGijF%p9X$E;<#@%NAj2$u&2LnArbMt0A+Q21xLYmdVJ73pLDH;i_N}cme^9L9wO1~HKgdCX)M!mQ$JEsKVVibP}2;}$Rk_Vj~y%< z&{SU)R?ne#dk)Vn*d18nW@{^T{*7iG)hwk9 ziJHNV`nz5H3VU~U>XNHj;_J_vb?w^No{~*|?ZMy9f5f!qQE)U8E+`cST4gt<(-T$| za_JnEoH4umF?x^VFslfthV(@|6Xbh$0Y&!HLf+%MlTg{4OR`XTG>*?iTti=cXOo4^ z&oByLNik>6{~Z3H*-N;sG0eaaq1yF2v1ip(x=B9bGpjaztf$07^Lm7bzmh#V86p+q zZjGNB6WSh&5C!zaf`fb3OkHhSs!sj-Z2On7k_D|9Z8OCVlH+29L`OI1`n=utj4^^M_;?teFq`wj-`PQa)*+>$x+kS2o2Gw2M`e|JK+Qx(sl1$!i{YL;6QzrX+- zF{-r~Bh@jY(MSnR)S7luNJBd|qDg9h%-F{8C^=cHdt|;f=bw73g`d(pekg^?F=$33 zkov~V0G1JSnmU$xPISG2T}yAyjWhCDyv`JtrKUuLJ=}Q22&wiqPSdHHW`#W-|NADe zqL!64pT1{G%jiw1f!P6^%1IRFJD2?4r>5#WdTXbcR3-zOvS5!`twSSR`Vpho0|H$@ zFFpRvldcY?Aog(c(0XJeTcPS}!s=_@YVJf`qMnK?itli2!-ga05@wANngZ`Ka`he2 z*uH$iCwh4~;z_|FGB^^=ana6kAZXT_rFCP}qh!QVIY-N|W!^=lB9$meS<(s5aHT+Z zlPhy}rM2g9e1O{!>D>-FWdBM?S}- zG7P*$Bq;Wa_#6|9T@x$Ltvn!!nEILmOP3Z)EhZG(OluWH@CJ`v%`M@S?$S)y%K$>Z z`OYo^HFdL0JZ}x;&i9fC0{KnICdtOlQI;71fwd#7Uh3wm05pf-m$3 zRX5n&dv0HO!mo5AxTo5fQKr+Ia3IZ(_(>m`a0J>E#*AXuq>6K^445D;v_{!6PTIn1 zy~TlZPWL+>QqtiMV?3K>v@M8#VId3SY(V2$jeVq^H~Z8?-qftvIO!wZpcARC@!(bZ zGu?Os#x6NP z{A!cMvRqpdrP{Csc}h5uX8Dsgb;XuSQo#&_s*`DW_VPXHSd-~UneG#*@L==Zs;(dh z2PYG_D_QEGdYPLSZo`oNL6v(4XfviXpOIg~7c9>(`G%TsK3e)ZKlaJOr2PzjPm+w` zo=%c1aJM^9_-7+D953LmL_yGLE(T6y!vNAssMg^vz3bvwRHflpedDkC7Xm6vOV6_c zk8d(buBYeMKCifH{#bH-*6TO`dG(O09t#x%f1Mcoevp?NT1~TlHCVNkKUE5rtLw~I z#RABZ2h$Mjaco0a7|#;LJQG(zu8%8Y zRyz}cn>9_1-uCw4m0yd}2}R$1xVQ=1Ek9Eyns1iecDUhl;SU@xlSI`koe?hBy<+!x z)v0iFYX+HR*~fA*Y4HYsxjgz>V>Y?5v~+Ps?RcNT%_Xt9DXfouLKBXVak53a^aA*) z9`V4HJu|8C*yy`k_tWN(x=Gu2&+=Csr0;N?Yn$i|lW5G`Gqgy}lkifuV9ng4v`CAB zmG%r(&E9v}Af+DhnSG3!PqL_p{HV^>{9)u6xmKY2aE!H?34up=L+F0q(vt>r9C(llHpXG>-hT~V#?dEhg z1=hlAtgU3|Qg6Xi9z}Bww^1RXMK9`7y}=S|A2B1s8`emSO15<_kT5QL-b^+la1FF1 zP!ORx7E<6#sQ=A%tLXOP{~h0{d+BgQRjdHx7E_VB zRyg_CTnB+ArJ!P`Wvu2^QF~_E`yKltD^jOOMt!Wg!Ge(zSu}pKAvtd;>EZ{fG5Jy@!xA69IQ4ex zoUu+SOMKQ0#m0*Lf4qGKR2|C_ZAb_Nch>;H?ch#uhv4pZ@Zc^9?yfQ7yZ62S_bUUh2r^vv}1%<8VLs-B}qBqu2t6etQnqIe}J4izb?@LIJX9#V**NJ=-9u7^x0$!*}S4%hiGfqaP>eiM<|ZJumEeo}+P z^@PZ^a1`sh;zW;OLT~K!3D&0k*cqnTg!o%`wC?PJl}_Xul*m|jKC4~^D;>|>s3$l0*!uzt{FrU$>ePbYHm=5O$0Qbp4p&K68-*x~h=r+~Ze#Mx4F@v__QnI|u3gCh0r zb}yF>wg+i;`}%5=s+F4S?q*&_8%v2C+ecMM{f6e)aYM=zhsn!t@CCL23Ss=#o>x=z z!?#Q}+h6-w9T=~B`yQsX$E(lR5~Wf;92?O6Ex zPO#mL&ac0$`iWw{1g-m#eD`UeMAAD~hojdkksc=1&sc}$Bliui6Z%?@Il6M=wE*rj=jd1Be(GZzL(LI_X=`?_uGYkn`o+gg`_{byH7aY>M=mp+gO`s z1gf92%TU@{iy>FW_7XOpy~kt>nCcEa(3r$^m9xL&8fdJ|oa#QXzw@DmanB^|whZ?s zp6zhJW~GjOIFs$4fvD_zkmn~3A+7a*`hFzm6yie;krn%}Z`-($P=5p-8xhK%aAhqh zy%>PoiG($PH0e!T$}M8>^d2ktVF?zv07y1HQ|mVK7-sBOH-lu&@L*T);G& zUYKp$=n}AN@mCBrb!XlohTn4F-=uS0E;}77A8w4V40*xNqw-7qcwu$Dt^EcJ|*nt;(d{U z=zW5yecs4@eAyw z-)|1&iJv==xN#zTa6s{<_*jXw#7FK+BYTiRHAVZ}#ol9Htc5IMAByCf7TE&>D(!X4 z^ux(Px1LWS$Q`1Eh;(V&~>R)w^Jnxh~V# zmY?8nsUluP`Pr<$G{Wy{tY>c~7rT#g8|stx6`MDmauM`=b2o_Q3}Ufgx&$cHC}j0q z#NMH=m6iv()hN%z9RU^3OcbHYKLs`UYo&c}G2)_uP4CK($x|O?u82C4D(X7PnKPe{ zW0iE@hrile;y%5~Ah@~#Jb4Cq;SB)aJ32t1kGVlOK)PzBPrex{ji=zFX3h>=m)y*# zp^z|VU>CHAmg#?E79=z3?1#uK9U_MSC1f8wu1H|33ODp7pSaf4zFmImXzBT`(2%AX zIsQ;mz=#@*tjzYC3)XQQlf?{#(7n={N}y#bq1FPg@7P^V@5&sIoCitQ?acO~fBB+c z9=4BCyJXahwr1*Uk|`!%W|G1M&oj;HSj`%H-I>pcv3u6G0pR&g10RE$(6vOE7UPb` zwgQ!=%9h}E*=6I^6_xYpuz_%FHyOar!tH!!bUJGoM{AfXrAGfZ)xfU8vKsL=GB|eO&&~Py_$UuZw}}>;UjCB6dIpu4Bt_Cz|XwF&)Q{Cz6@ILY79D~uKn7u zL^Qq@A)>^vVF+5f%CPZ%N+m9@ZxHupb*9_i@Kb#^lXa}g(&tK9uKuIXtDcj}R(HHN zTi+AK#%y*+s^j`J1SrPebT_!g4`2@%pDdNRxy6MK93EgXwlTVO@asl8`YPsFyUJ5( zr>(9ztl7jUU&C-~YOS1qI`6wu5lASvhJ9r_z3b+?s@OzBvqZJK4uW<6az5TtzI#D` zgz-5jv=~(5)~?a0_oX)Od)5bB(;3nb1`QuVg)rUzLk45##IpJfKaJLcRl~7E1~ccx zih8b|&%we#BFEqypdUJeT6tSO(06>FL#>Bq39h{P!=ds}+|g8eLp>?SM`Dh2#@dfm zwdtHLAIawU>5e<5H@qG9Y3BsAj|DtozrKcT(SdEgI)5T?@RFy6zD58x9ErugYl9cRYGUo1+1&p5 zaDgt!Adrh^-BClJeVeVpEfi;Gy$25W)wm#7t~>5()#|(u#d_=_LZfAkQ*!35in{u5|TTm{<=Nov$GT*U#?mHj^KRyR<9yAl_} zZ+)_8z~fmxp{5_kWTTJYVeO(}Ws$AP0sNkz9$Q_+bd5)BObE^QW>nq zI5N1ARi;+hn)&_EnPyn`{$h>W-kBZdl_O`gB4+Bf$~pemYXAY)#FU2Kel5eiy#ART z#SUoi!`KidrybNV7ef}O5LA3(Lwv>)B4<%mYDaR33n#W*6Wng>)69wRxbYa8i6G22 zBKU&|zuk#6nE!&&sOD zHw;pnU@>w%6WM^72LOxGLWl{{*%H z>P~+jYb}}0Y)Gd~u(=4HWDgAYp|l>@uY~&=(19_o{Ms=G>2xKROffwI+HrOK+L3hv zI9(~}p_43;SNtEkh0^<0RtM)-Dh5$R(Vy`bnh(50QDsAjKUTVh>(ao&a}ltFI_Wtc z{J_N^WQxDbuG8N3AQYb0>0lVw1ygn13Jd=QJ`D=;#ASEX$ONIv8 zCe{k0yZiSY80-KHhu;X0-Uy-H2(sJ=!`}$30(D(&ZB};aFp8c6z2amX!ephx`NYoaxNpvFtA>F3tWV9`3p-2??L z1?`WNxY<#Qb#~|KuMU;i$$uf*P;s^^0CFfbetP}oW%gLYwGEtmkHq}pa8>;=4c#Bq z9v=pu#?@>q=S_93%eeUeKvlLNK_2b!n>9sgg{t^8@tK8j=gkKk>CZG9Bs49f}&(fFf2bsoc2F>u@#VN=Pj}cfsJwyZ0GI2 z0fDxMJ(_#Cr^1RPT^K4kRNKv{#%d>maLjL24>u;ii&vauy7$graoZmZ^V_(-#diq( z7jvDEm_eYC+E15_r{jg&`^bzqmY`jrTM*zJR{wy#Lzjzm0Y(zsHoRjd6L1EUf9+u^ z4}jCw=P+8pahChg<$zuluJL_M2h{O4mYcy$(6$j#cOX*>RBxoy#JiTGo#RuLKpPaD zK2y?%8(R`d%)jvwEf7Iv(IIBhWy~mfu8!ob()JR6x)_i1wY1qvc_j{%XxqSqcf*9g zb}<3uTSWhTDtJ(H6G3&p)yOexS_GGVZ1lHEwH2t9pF}~;{>=+*JtB}g*&oiqphqG} zL~Gn8(tnykz0SLiyqP}X`z;tTOwLK>i#Wt>?sVLLE!&A458Z5?(#A&vD~ z=L@JS9-6&=ucGfEtHs>ZW{6`m8DFzQrBR7QVAX5*;q7G34r}z#+M13ZD`V@2#Kpee zeIp|$M#lOY=DF86^-zyG_n!y2M4ca@RYQ<_3!3%*jT`>Ahf&T?AoLLbs_ij-ht5&; z_pv&bY(w&|IR!s4jTo)bO-dsNIhQ((a{1mA(JMmqjR?XWjqk{;GcdMgd~T9THcfqH z+gp~+G=Lu3KyPuc@tR!B0rzYt z!HW!y9RC|a8J}0st`qp#?h{(8DaG!7YPwA?tR_4JmWu^;2qNc-Nu0@d5<=jKwFMI} zUv3TesgLw&8|%6GjBX2=D%3xd#mwK4EcA5>QQQN#oXx}LZxqp9<_F(yWz^Mfe4(w) z5B{-*47cLQw6nS-w24la{xapNnF>sJL~Pbhjx}Xeip>7+RVile#5q%jrE|+iD0cr* zrH$)OYiDp)qK=2$h@y2_L5rlQ8X=fH?kqeOW^EW!oy4KK{rtnecE!7iXEWnjtzeC0 z<})?epqV!pBM705r{Uv^H5<0pcGa17RcUa$t4abQu+cbhtpLRz%)K#Zuo4>)5{C7< zudcLs*8S|LQdX5X5+yeKE2}X1S#5{50e&s#&uR+1QLbmrhW3x{ImLs^2KnSKPH^)kHN{)@Za5*I zMB^bt&O~bbBxK#-60ij{h(sFw+qQw56SNI{-8B-#3-u^o}6vp`Jw0F2&k(| z=+o?7qcyU{D60vcoM|`zp~vC~z^F?I*6eMkUDLy`EeWofXxG@$qjdn$qe*$bWCy6G z-pgsfWB*CvpLG1x3#p-}GzXMw=|$JlyZ*PBUhgnNUOEvFcF!~`eXBsz2TaitpJ%P@xLCU!Cwe9#d5QQc;o)mr&Etw~EqsG-$V?cnT;HbBEU zP4PHx&@ix?2BE}M7&A4ZQ{|-&)$#gZehJ^X{70T?1xY7 zdxzTwCuL2ly}P1YmQWF0omH!rQ_M!_X|sg8`5W||2&eTsUXHuqaA`99ly`T>8};p( zBL|+#L!WMVo$WXjc{suYtq=1s2S)c7@OfM9-exXoAtX|U`|-RCH?_*3nM(gTnCxE! z(d(BZ>V>Gh6b?i^sC$7i?ki)C((boLG&DH1pF_@2&UlPk1=j%E;LCKp$m_kxeJk&? zxZ!}*VvKP(u$&DB82E*uQ6AqJ4zm7nZO;c^zm*Hr2Ruy4n|5DMp+# zo{SI3Tnlkv9Fr;U6TR%X?u(u;PiD7YTUA9_vq)jLpS#V*h_6t$ci3zX*ka5T4q0v* z$=6oBx!nrPH!ixd)jSHY-k#GKcbxrZ4>MknMccCz>U*<3y0M`0)cJUjHL&TY6 zh12*q7RNH`%2u-tC*Q_K3o)wDI}`L%LrkznXmUJz0}?0zw)#pP*Qg^jwN{dDy@3fm z07t#piLH_feVmT+5O?lMb@RIks1io~_zug^Sv*(zQ^B2870;cUYLVrw4(70JT0ne;$@=_nhWYT^UQOnud|nxoI+sv?lk~ zQ~7DzN{pQsld_H?Rd}tAk`n;i^&p=}SK%F~dG-3e*oJn5+iBLN_$C5acFf!S^>0G@ z;L(lVV)M;edpg68^qZUs$9R&LXnWn70!;iUq|5gc_QMchpz;uO(V~615w^!Oi#G=! zRw|Rn;ditBg%{G1oPgl?*zf*E6`&C}?2dgT32dGk=XdMh{AFry{maz;>V9g!7O4m}#^l31#jOxM*YxQ0nZxLs2xm1>n9 zc{|87+>X|7dvG%A_QfCKkh5wV`-{YfeVdy5$-KOxr~Mp1igkd^0jku>Q@A$1qi-x+ z;vbwO`F7kz*4@{j9n)nC;n8Jf8}!epH=V5$w4Z;*`@&gSTkGT!jY3 z6+;uW->8C8j>@dX+;Z6jlb2AVV{sEdSD(9Z&57e%?9}EJ%^>E-K6Ms2ux?D7mi;!~ z)MXfaF{3`y|D@`OWt!9Nhvtt?6X}-n}f8OdOfi%zlKZ-wncs z+LXK#*Dyd1j{K2pe7!4r{79DNOopCw%(Sa&N!GClj1ZZ(lS#w61?}rRU7cxBh8ou^QVUhZsY+eI+-#Q^d`52H4lWYp9>AD=i1dLGY9jj#*$1eIf!5=!IpLi$^a-*u9s6ZixRLgZzc%Z}JcD3FuVXOjpSxSodq3JC$9UT8o7nEsun62VTO*d-^t8e9RG|OMm=xpb{#2EIlvhje5uj#Cmx>W^6R!W>(p;{uBfV{(C3?7pqq|_wezfg0)0n;(Grb(r3;iP0Eg95{R zwhn{IcudBSeUraa)5i?NKevOvjo~{*C;b zb3U1f`aj2F5UQ}bWj|${G+N{`uYST=YK;`X&}OK?2e0uqICnJPoO^*y;pp{R-uUA4 z#LUvve9&tVJ;~&X&^ISgb~d=f{qL!niqYBF+mSi%nZ+1;7_kSq3pwyxTAjd|+gjBu zWSh1c)(F0D1^Sm8x5G@?W~83h13!Jou&;oKE&7C=!HinSd?;>4)Ndvw1XGxpmsz1R z?RUfxv|jPWyzaqc>XObn2Qgs3i?{DKKKE?Exsc#e{|ST*j`I(*d(Zpwv*Laef+b?u z*0*jUNax_h7x=;@c%d=?h%{Ylo=&!qPH?w(fjT@x2{KG;C>GG)#4IRt7R@9(Vcnix zzGn%Z7I84OrN=m;Cx9tN3@*l$D283kh_BRG15)jCE9s$qQ`vW?$)^x`2MxGEU`^$QjwPvlZ{MRuzsOu4 zHs18*wx8Ak>RM!AuS%ZD@@V+IcZ;Fnil9f1$^T|b`=WN5v9H7%A9LU9iL ztB0hwjk>o3*Dd%$WBunOpq;@-pIvFewV;hsaN)i!3)(rHyRS3L|L?Q$_xh7=f?S3? zK_s}X6so4u5S<0=XuUCOb}A8IRQ>mEOu9lNoM{+_&K*RAM3`#nhfwoOq;apK?9(+U zTZ(Rj$_t*`*NCeOoaV8TQ0g>u@an{kFzRG3J~!kNtxjKj@nThV#n?y(d?LAZm7KW^ zBIt+T@*`3fmUl@`8IW2q$d6{7aP?Kfr#6>4Y0aUW3`KMdzmQr{Opi!b= znPi44=@4}^Fs{?&7Z{twi81w%BxQ#hnPjR?0pnQyUeyq)&nD z#@=NJbx7o|>qTB<`np=)fp*BhTE~@b&6|7Vl)S93n#@BNuGlcH4jsxE-Qg^!5# zF*ZqAH%T!Drfin?OR5>0es?8Nu3z_xJxvt6Dmbs=rYIj^nleV-J)++|g55pJs_r?v zg-lbX-BP*@){;v`PZEQv80IfCNmo+Ki$ymrbfGbTmKqgDslZNMI{Y<^K!W`#RyawV zSSlk@%_K_+dsFqEFwKt484@jIlA{V`@)b@JB(A_t>b6reVJKwkqL-RuaiiHAmX^UZ z8WgVyr}CU<$v>P&oz4EFMNb_|+sdG7^dh&0cKsOol;9elHu^M4&{c{NwTDWvD7rq+ zF3zxgQZk!!x@v_xJHB4BOjEk7FKdz|dy+PL(rDP6F&0e2D9)h)Lrsrg_*TtE5AmG|%@VWZAwD$->X1)4|kDzAl@5RlgJrj@%>RX2r!Uq#_$%Tf+%=)vK$%c}`N0Op} zeVxEQCABi&G4ph0V@l6`(AsKcruCv2-iunfoS~00BOeC_KSl!w6PY$7vF%9VID8@8 zr}MgD)$B-VE@5ddU(j&)qPxf3BZWVhM=F>{B3L?8NF6wo*wJJ?nN+@{w!_TDkCy{!MC@ZrVp(g4}x;D>bs} z<5oH1#83CJAaOM^?MPyu5_i}+PXgbCj`iQjOjnLn?v`6nSxk#hR}NPeDi)4W4=hO4tS;w=FNdBcu31kIUFu;G~yPN|=SA63)F`w555Rp#jBv0HZuQ^`Dm@B``725f@7thf?^1v zJWi0HV83LBz09xn+rS&C-(oEw1A#~o?}W@*>CZuxWR*{U6;wH3J;6x2`^A2f`qh3D z+Y(FWXOLc|mW!Ya&wsGrl8xK{ne`U_{oZhe#3joi| zxq943#68tZi&YqiNJO;dM=4thDXy-=adKjmm-NIv4 zo*R)pSZ()~hSHU+5s>#K@-~t$+yr^!AWO+?2++J)sf`fbI-rxqyc3>Y+oV@{%94Z- ziB})tRFA-;*#q}0A8tz#TL>{*5Xs|iE4Fv{1~$F1iSb({twFho93r^QkD(@5#Y?yh zk-kU8i|-|ecFfBR!yF=SB;I~g=%Xkr|LH|^$`a@i!uN=eFE^`(r?VuypMZH2_*MrJ zp)R98t?sh`{ZGt&;3h*-i~gvdemqjSci@}rT5X=cG5Za!`ejC9Bhd2e=Hpx2?}}CQ z5h)j^%;J3xkTg6I^x~>5DVDdGIpGx^Kuj%2l?!o}i$K~5lGzDk*af}_j?Ldao@KGe*NXGzi7C)(N{T$OSXC8hr738q4EP5M2NDWg~6MZ)_DE_EcFJ=UThL8yn zT1N_ZV{*E^fW;N;d2O%?HS~f>ZwR$-ke@U-&Izq>A6rYrOzj#6=*^lfRK8m80HmV} z{Kt6sAWXvn%jE)Ieel^J#?2tXGkQetHwTSCfqfpHuW#G}!s(Ou^nK3xLy!vFjn9+! zte!T06?E&eNcQPUXxaQUb8BMGUi)06YGDH%cUBL5oLOB9(RQDvu~lQRyxol&)cP%Y zi4<`<6ldcMn}~}uXFY~tD$O3It9yH8LLAdUO%`#lB-)*w)ife1KhG~uw+SVZ(jHht zrtQUGr}d0qrcArTjbBv9cb-99T^v@EM_|3rQ9O~4HJ7C| zg`u!eNWtSe@NE; zlK#PU&h1&b_)6j0z9oLL@xAb2aylU1ti?kIwvNR&cV{k1qgL`Uf=JI!34dSAxXvFcWf(4bo9NcJQz{TJ!*}h7<(vDw`eVUkC zJWS#7BcI=LTk0TNuB|hu=2m^i@5%hUg=Ht+shDlH&p?g8oTbPcNrmnMvNPWp^vsXD zI3K^s3upGS+&ip5-$xXiWB%+GvOFa^!s^!*-LaMI5wPn${!%40+~!u_oM64y^c(du zipHrG!*`YF8@0oXNF!r6@l@8aIO9V8n*LPeP)^dzhAoH{oxdb4BwBKeY`{o8@1 z+q-S&$Rmh-=Vz0*%O_A|p#V3o%0qYL=zOiT2y;pB@J|P*1e`RzAj50`_)aPgyJjF% z+PU2ctEtQrZoK)xvi>C<&Jif@=E+&^&_E?3t8AM+y6qfIWB3!x9^_>_>APiSn8^+~ zT6w>#ox5gdzRFdn{aW80#Fvcxuo(^kM9~7(R`=jH6l>212uLOy$BjkM_iqPQ4T7e} z_g<}dERa{L0WL5m@#VIm$?7&{>L)iE0ksWV2KHlTXUg(MNw^y+Eokm{kVS?-L{r1N zhXFyS5XL_EG`+@c4$hgh{0WH>FumMwZlxZQm%9tTq0=L=_lpbYEX+dGUyNclJ)LP< zFH8$$6^jhX3p;LfOi3gpLx;enhG2i4&vTt`iUn@|3+wCdp@8P~axU4coQGK6edq3Z zeVo;H{POl-Bs!|;UT2asN)*;Duh+q*E0bDD4on99HF6Fe0Lvhm;^&CCBlup$L>$E` zaaaf;TBzQ<8&M{)RIuRD_$ri=mhH4lym_i>bl4p3+ETznQl_{DeS*XVT`KfSU7=KH z^&;mMj=7yM)=jnx`Xk zvyt$B*Pg`hK*DW@N-Riiqaayk>L+^s=`bY859C*9c2-K(=Z&^N?{D>kDJI6ju!fS> zcu0q@!pzY!+y)!aW=7~G-?DdV4#|jG{v7sn@LT~qO^sYa5j#zMS>D8rGE^q};8T?~ zq@(P6S8^e&AIk{fvSGX?0pC}+`@qq#dl^(=^wseY7InGaV=v(qRyt|s6VHKMWW}Ja zVYJ8vPIMQf)E62O9&cVT~q>p-kWU=YIjL*|Q~*I$`m zwnZH?`G7Oid-F@Goyje9GXZRk!Gd&Jb%tk+$O3*%4}VSnXRgt`>7{;93BSC$bN+O7o00FK_kYCg5LR`Ob*nt=< z@Epsv7~^Um=5+Z9{1T!^`@Kt((c!cP#>qZ)YU@#6ID`|}%IAw$Ol>_*&qD_>r3O*^R!nSv=D@)f zWj>_B1Xcq5PdB{6HhlUw-hbKf`?2vZ)d{8n*!_p`K8=OvXS(q6GuU?j^B1l3xCHv( zJk6pZEx*q{D)e~2VS4+1S1{==-keOAA!mU~^6@!<;zKB9^f;hFf31i5=wCY6TCOuC zneYB->QOODUGaV5k#|~_!H4jGskKbe768||n0O_7%^^29?FUe7rii zF=rgWDH8x1t?8B_^tOV27>|k*X>}Wek?C=g65aa@XFSgiAm5Y6C+g-K*i4uLh|EJ( zFe;_%aZeppK?#?=@SGYKmoYoVnZw9&B#bR#*6cQbUP?Sa-xhLW!593iIVBd?X*S zgsFO8bgT62_@QB{IfM>N!dc)Xx?xnF1ZSl}<+2dd*Y;u6NiX88{L%~jh;blWTz8Xe zcb1-kT>7R8kOMs_tQ{EJ17zj|A%ylcn5{@*ZAkDC`0|4Z-Z&5!9ox^>uOty&H(f{t zh=i^th`#$e6AU&NOobBXb$b24ik0qC6@9yU!V>YnfFzoy^R9i39|h0*{}yQ!JRm$C z{(Jo&PWby>KXnf{`D^T)^A|bi&5{S+iA%inG|1l*zp(<|5$H{&svcA!B~}_U2n`rv zTYSq(Z2dQo+3}bM_w!|Z%z}I9q%HR&`2i6-GMf2 z=DeXsT6|1&TgvHm)e`7wBooj{C1Fr&wnUS_RR&+?dlWKcI+Bzj^ zgHFm06P@fU*55*6tQ%EE-=&(cLj5NiNDP3^JfP@UU<_$r$Mio)@S>wfD!}_wxqmo3 zu(w@sO^?VH5LuJ(O+(UvmXrYlB{BGseu^nqIRuKJ5}!Xl7LgGu^at#e*mK6By!e#)`PCMrt`{DgSrskh@$?2vbP}Df)05f0Bx5 zbdW-|Fr^Bm9N)2l(14zOSl;#ayU9Zcs#2{BtIw7_7X_8B`E#m8f$9D;z;l%~%toW^ z6xt@n-iWzw&+T%JRD=Z)LQ}z?O$WyHW6NDylOrii<_0AwurPP>A}}L;hE^+%tc@xo6iA{R(6J=Omy5iZ zVbb1o$5+mAxyFz}Pb+WJ+U>kkp}PtzRx9y{m;Uv0rkJK9 zAl@1hTW^C$!X9<-Utq_vv24C()&HNNogt?m^8s{;9L4~X%LFEO$s`_9DT3&naIulj zEazCUBg*JC#Z+hI$6YxR1S8quo5P)U&as>Qod)arrFGqcjxL=10=b%8BW}~Vi<#=jL}DY!cAH_nHKev_5niY2}EBQgft9;s=HCG zW1*HPQGCLoS~|fO_22IU_|6ju-6RotNM8^{dxv*5cdjhx+w32}o&wm<6L8%m;dw|Q zf4}FR#&(m0<4N89?p)dQwM=t)^2@=_mw~b?_S8uUXCqe9O?Q%p@T{}QW1grvk>M** z7Xq<8;#v2sx^TO*66kYLM}o~CKer=)@C?t2)L#9LTse)L;fb2=gqDjIJd70OLGBVE zx)3EH5VKSCDRqb|b)YqzwJWyFDKnZ|n+b9pbKR$%?(*X^H|}Q8U74Xuw)M3Yrc**~7YA;O^h;bnvQIIY`wl;Eh-Dq{Zs^=A}zXknd!F z?0qIj$y|57gUG{Kw57QzULzQo*TH^vdy;bNSHg>{Uv1uA*YJa}p5hF1Dg*NB=G%M7 zs?4P-pU#WMZXdZ59{n%fJs36@>KeD`@s4l%OceJZJSvwoN6(Xk906v1%=KO4z+n8D zB*?0HCFiTAb!@m9iVCiGvajcR zl`n#d7-Am~?MfZ{0N?HT9{mHVGf~sk-3!k6>qv>)Z?BdwDA{A@7Z1BVuT)7tL-`g> zstM!FMb!AQY`m9d?l@2E&Yo3|~bY9GB7)MVC;19qXj|}RdKCA_2q&RJE&BF! ztb_W}=B0a0M56|IQjeZeDL)9Z2VpMvelEyx8Y@YLW98 zdET48s`r_t_e0_8^}uA9J|{lP#NGY6r!-!uXn^mC_QAoY9U1*QGo#Fh^r-0Yz83S; z&PTUbZ|g5!FWNeA3B#Hf>mJ(u4!*}nd9g}(hS>$zz7U$|(Xy%r3ULg9H(lrA=ur^9 z-LR@zZmpY><`*u|+A@h`H+Fa1Btq%P{T@D}Vj=vbfi|zAdcKIDu8Wk-{vkiS%l=1H z)#kbHOL;@N$W8)FLSUTsTsUCRBcx)7-D z=?765{1FPq-B0b&jTkW=5>S50a@a?S5C8o#klz+1{LvWmW_z&2B1nS2>$8QSB=ZEy ziwZ-_MS`ZvZ{ZWawKz|_1#>W1CiO`S?u7 z&pFqxD?Y}Vf3En@cVOl7_4D7S$8XLoRdKzK>9BcJG^NK;52x~5+~=nSyEvf_EIQYF zVGJRHTqJ#iPm650A3d=3pqUutm_X>s8-4Ck6$Iu7b-QET;c-dGFX5bHAzsj`yTojo%5>x|r}jZY*l5rPO&8ytaJuQMRUjtK+tNrrAnYSRP}A~v*;8@%p+g-Be$ z0<|Q6*-toRkE}`dm*U~TanM;P@JZV3wdkCSER)|62Q z!bN59$tjQt+5akFM2DWrm3yJm5DLMF%BG-x7yEx9z6W(~Jcck))1cT5cGla5$e^9r` zgl@9((oj#LGd$!*Wr8lnWO*t6c5>(m1va73vn-$&DqKVcm>kpVAPCWai#$fBaFMW$ z3W>LV&i=MJG{0JSN(=OnkvC5W61c?1^r9*f3}{GIpOKh(8NfvpfJHICE`<;sBkcMd zUBL0H_(?zM!X{LOL1pCTh{sQn2yYbcj*Bcc%-XS+J0<15#1=C{3l;MswW|lEeM4&2 z29(nvqwV$0J*0kjfWmd4@uC*q1c%V#S(b%YIb1{~*f7iMDG1T&C;toixz-N!r`qwf zL>9rK(-}>6n;D+D5|ErDeHAt90t{}C z=rrph4B#Vr!J^n-GeC;2J?X+FOngRS>-9+1Bpc9@B?jl$I#6g%^NrIMZcTy7alH9n z@hr>ED+WGd7_{|T93ygAD9dh0yVil7LQ`W_tqt<~|lQaHHip2jw z=iBY(OF|m{6~+_czcAv>7;sc~*}aY4Tp%53mdf$|V7F@qf+Unu4mg$k`&f$R?iigL ztC?9SHx2uSyE{fP@n}^2*r%n${B)Mpe5lkfg2-QVD>)#7YovSi2pKk!e+YUCZ7C%F z+((Z>l<(uWu~+5gVt$n-&$4|@NExG}K_5osSK+X|9bilu>qcw1^=xw8yF2h)Iq*nU z?Ps^`KfAhh)85{=UYnajC>U`IA9#JFL3N!*v^3PhikI2(F)On8%spW(l0wZ8CtGo6qd zHOv3~@tX*I=wSgq7jjXAzk`I8KxiFqEk35F=KiDTf7wT=M>Q^1pAuSp3f)dYkj3_!Z^y z#Gw_%(kUqvUip5`dJ~KK`JTj#L4|nb%O|G$Mh??FaD8eU^z_8i2`NxXeBWoii9m&p z;^&hi7lnQ#k!@dj)q_XGKRHBxO%As5+lJQDZ%r>Bi9rf5JMkwe$ggw3|5mkF=_$GB zlXP%Iagd-V1cMcQ@(lT_*S+dFzapb6?jtoYQ~cq$ha3D4 znE$P5GqnO-UT*p3VPyQH5--qzyS4g;&fkT7v?pB){=_CP-t}m&DC_QKuL$=3Df|bO zoH=LrjUA%2T~l1^&F@WAPGl@%FxE2cuZKqBL@arRv`)O_CYT%^aD-&dL)0(Qb`iiv z@JMR-2IM1JqY-`KZ&M7YhDH()>?PL2M>+~f5NYEg@(aKu(hCT9N#w^&)GyG62-*#c z1PBkn66__^gFs>oNZ@OOB{D(+1P7=-Qgw(WFi3x!$d_(Ahqn8*I&1gWcD}D+BM(_W zvED75?GotnhyeLClyxM4dKwA>(GnpM{JmI10#zhBAVIK=goqRg5EvjPC`qJ;{78Wb z;=XPpL$t;M9c&FxbV{se6&f%FC?UYZ?fW#eZ(zG7zX3a7%#|7n@dgkcrXry|(CM5-Kg=h%eh$c+|kl|bf~ zhnb-l5cHDL@6I5#dNXzj?x;=AJ@veUs$KU6$Iex@1Ox5Q!ZF%e4;f895AzOsMNeU8 z)*$uV$9W0*sLi++B~7Sf9O)qY^81q1df-9q;u6kUU_-z}a6p4S5js*ym4{(2p}h(Dof1(l&fvR>70njO~n-1|T?u8l_9sGB;0qm6c}?cqP1bJW)4XkQ)> zAS6glq=$qQeD_RQB>IlE5pO>Y@qj=R&%Mm~v19wShx=>goR>@HI<21LvZxp3j!Id? z6{!RR>Hnd)!&wh}=&7KQgH}o$jcz~gP-UsEeSfiHb<>BtBSh2_ip)SafLS`W+1JnBP z+@}-zHH%b3#oX`{`qu>2>pS*=4W}WK0BroSq%px({X)jmD?70EJHR9-HvU;OIron# za=d!73GN97C%Rqlh1}VY=vr$gVWBY8q!x{nz7T|*BOE1E8WE4TTkHj4(`|yvdygMTZd3*NfW^s7P13q z^2h%l*4_iG$)#Hxe%%&qz!p%Xt0+wnrFTS1r1#!bdha!qEhtD=X+mfcdT*hJh$xX7 zLhlF>5(ohzNq|7$i@Nvs?sMLA&VSDN{_9%Yv*uoFX2^3r*E4-)j2;u~f7Y7Cy<8~J zb%uYs(EX5Oo985-g7Xf&7; zoRk=V483k<8I@3;b$mQ`+2u!?B9EA+Aq$U22|QrEL}0Oj@gemE2#YX_b{mLSL2oX9u+jRpNqnu)g+!6^iJrtiNL7Fs_lMB)9ki}rhtoj@vU;BV=}FQ=Lys+ zCG>&D)ROfz#7qK%#+_rR(}g=i?~U%HRlG1r*Q;RAFn(07!DoD-Sm6JSy!GDbc3S+4 zw;6h)3>p@X)HV6mB}4X1e`+p2iY&U5*7SGte}ja0Egryjs%1~UowWR`d--F&s~3v@ zEZ5+To&bY}>ZAW($uzxq1`Yj3{2F|!7mE4bGu=rmd|~i+@_+ZU{(L_F{6+sJ&;PKX ze<8aLyq=Anki4Fq>oIZ zxqZV!5%U{ag0Ho%J^o2EJl6kBUGs*^h1){Ui|)K8fCl^gx|5ZZ$6qE%zCXCmO$k?9 zdwD&?YQ@fR6F8=X6pDLBc=YU53^W%}4w z={Mqux)Mv@rt^Z>tu0pT)|jJOT++eN$vMcUU?KbkAs@$q%&4Jp#P><&`*kyUwy(zW zs}qLrdC`a4tpu&Xw;xdSM)VFpSp$UbZlR=fE?E%AvB^iT$-H|u>R}I#HI-L;*4kYeaq3_|&KF#*gL(rDwl4uoar@Mz1*wcwQ6#1!hLSNgpURO#78^c7 z#MX@2xRjc&V6N}T6v*sF^r0aj>@|1ZH)GqRl-BhUj5^xp;V9c{!nw50iyVqk$xekR z^avjGsx@|!a^^Q3;HV?3o779+7#7+$uS7(k1fGzF}A8=c| z*Su>4dDOfGqOT}1<(RQac7M#(wSdHZ#Vlemi(8n$K>K`T>GrD=MwZQrd~#9$i2aX#k(5&r?1jBz0a;<+f%YqV$i&ON`>L!Uw~nG@AM+? z4Jo0?_C?;6P&GDz{xXI;5e#B#k~GwfCjLHk34RgGxQ)kw-~}*qbdc=FJ(XMt;#rq) zsCwX5Ms9}#+H*#lSC-cSU9_2#mYdq(XAr0(GvMhogA=40i#FM9vl3v|Az7Q*sn&iC zZaRTO{WazudFj@T4Q?iZLwz;;bi;i$(lg?BI!f%P(l)b=rqpM|`F})mOt2Z&h7DNP znE=RUyG5Wi$6mf%b}GQHTYMM|r=DtNRUQ*j6cdp)t=N9g=N}wQ6r><3om`rhpJ|%< z-L;041!qhua?(4Rfj0^wi2EUgYQFN=c8BS-%b?V!hP0V1S884>)_&g?_dKa0sULVA zi1WhMSR)u$iHjmxVoqz{8*Da>)bD;9%dujO{CKk*(BUwWb2vV4?{($@jxwC}?njp)OoxDeb~=7e(?JoG#4>@4BJ?jqq%`Ld1yEx>&y|a|$gu z0Yv{+QBgU+IC|aBpN~T=zf^c+8QH$Zjd7NVNiIfVf@LH_>ks6}jz*rx*TO+v$|pML zu|4qc+9eF^yL2zMFf+Thlnuk|&%K}mOKf-8^_=OP!;EhJb;! zg@%w8_eCL45LHzx@#Hpac~d_3W!%GlLqg==ng8b55TYZ2=v$MXk>dyPCONDB42>OI z`ZrCo76ckC9Rk^KZyQ1kBy?GcZ`Ghh?s;P0?>OvI!?dB)U%c%vd;i+6#Q(`+HY`X$sA`4IHk zMK?HS{uSvTH_wu}Yv|;#QT0!c{=X+nE%*D^ynd1zB|3fM{8=&%FLZx~cMMDIH`26n z-V%x6jf}ZvBGH;U$!7d^k%J5Mif4SU;yrb%nAXd_{5tj~e+2~@affVFi zIcm?Os7~Oeakv?Tsghh*L0_5iY{H<*B3@S$UrrCoc!tdW`rBdW@3Hp^6V@5p)9!&! z3I^6`2+AL?%x_$%`PftG5k!0Kb6{^;HoyL`VjjOb@(CA3}k=?ba zQ9Gqj!Nm1KPm8PR_*$Bij1}7@M@DeKe#`GC*H)Gu9a+ALyoC3U z8n6v*-zFlf6taVg7o2ZV*l;@E&31v#x-zd6etfLd^HF{*`2+h_y=V~<-P7&g{|49U zTK=f)X_ZO*8*sGFKCk>w!Q2Y>VS?_z4?PnKRya304!gXIMnyMSOBm8!Uf7iAhrV1n z;pnX@f0YWGH!_;JI}=^63TjjdoS*mU->SqAY*ZR4MVuhQlAU0gZ<@vs14{y>MP@n8*h6C&SOqVp9xQvyx(Mc;K zPmY4u=lFGN)#O`eqCvmF@m)1?pgVZBf+W3fe17l#TSE4bf3_X{yQhwzH3^=xQ@0J%Gcjkqb zJud`lwpxB%VA#s|A5jxEW;stnZsn@*0#b(<_sXq5?^}p92Hrsl4m7%4%tc*C6z^g{ zTak14Nci_9u;Ji|&Vv)#&qv#7`x`WC8OJXXJ43zmGu_5YZr%YS>{iN(7Z;=25*EJ+ zXx#E)(k_A7sG7f(${jw>I>gPpg5Nyx7hknRs`$a74}y7)hv&aFh9wMg@lMq=Tdf|r z&7YY2$4h@(q*bI}jOt17Zhg^nhyC8N_k~zZDXWjm40M@4sAAfD)Lig{8t`~19Rx3A zxR&W^>V3^}vUcU`56`ti#v#?c-jx|MxyECbt~f}g94tN={t|UEHj%d!vU#mNedVqq ztR=Dbc-}LFhVp!IQ)5Iv52U&`8cz6!{Nu=ySj^MVd90!m-WXge$gBrwYLT8?Tr&fL z>~J2*kRV*VK_r*31|ml)q5Fqb2av;6kd#JEM<93_R)g|09aYc3H#}WYy81Uguu0?`oR5dVN-K z7H;LiJ{-^-rS(>5F?XyM(hcImrcJzAj%0 z>1^jkF=VI9Gn~LIJ_DcL#3)3)cYf4`$<|zU;rnHo)Rjti+xjDc@T4xCrGiF`d-kKH z;%($!9QuJfPs~u2b#BM}cWPzQ9<@>#U}|ZjtQfB|6TG@*(J~PoGRD8AUHVQk_t~O< z{|Q`ClXNu)l;qdw<0&yb)Y~>ACCP?%M9sVBfUG-iwT<{*kylP|xe#E$9ANl1V^qX~ zv#FUd(qGV4oS6qkyIh4ntXx+OjhpP}3r{PF=tutJrP$*T0X=>TCflo@+f=1m&ZDm_ z&)>=cnRggiB=hu|Y7SlD&F0n-1LV94Xsq{?m>lYDpD~l1WB1wq>Os6)F(5hoZt#!9 zLIjJvZP}2B#Nh9fwgc>OjNf_*S9yi{DgxzCGQE7|74eZ_@{yHac^$o{vgL7C<=;4` za0a=rf9gi!;a&3i%!^5m-&nbxZHx$e()JR^DC(RQT5(x_c{ zS~T_4Hu2V~5IT8{$P4$}SaiL>Eo0Zjo;Md&NAFrTzxQwf&OQ$;%5`=M<;6YfK&s5< zE&{eo=|^HQ+@wZcoGOl>Kg-+Nx{4BuBNbCHj7^Fh5A!eIo9w4QgUYe)n@L|e_9n=# zAK=)#18qFmYOh6tw#025GBezwg3j2r3Og+3hX`yKBB0 zW^#u|l@b>Yo?%;pkkiEH*m#4x=;|1w)(1p zT|a|4X7%OMkf&xg*Z*Tx;^O6jOFiE|)^*+&q+a#(-%`E(j^u&grF1fV+7rhda_*u0 zSxN__tb5l*{*`KwR(007l5LpyABmis4t^7MzjVK2sq(73=lHu?cm}rmDrEaWt|!>x%LWCtQt7 z+<3HJ=B#fqg?{?v4;cYVyT{d=j6&ZkU-o7OvDz+rgw0f&+`Wt4R@XUa$tr)Cls6!e zoJRv_F|*4PUo%6gD_DNRFpmRCM{}nko~oKcsYH4Kk;>b z>W4iocBamry!@csUVcnMB&ON10(n}u1c82BoG);;UGm)t{bISovl>yVH1x?%04Daz z$ehMY;0>TrcuK{#K2g4+>%U8~ep-qJUgpq*Bk}&feUUE71fCoN@*Bb1Z zg3&1i%MOXdB9iRu6>6Z*OP*YU$QuANNlTGIgjbvLw}2^M7P%Yt zzMOpM00SlnW!ap@V_?@%Bkh!mb$xO9ijx1743ihMr5~8;`A)3+OFaQ^v)g!vty6Dx zo7Y4jcbnpE3MQH)1Xv6;deh!MD7M$)|F1nIZq#)}_5VH5YSb5&5`2$#s~ z=v^wTT2wn(4<0G$wf*|pcrsKa3BH81YH-v~f>|6^Es}+NoB7JI;v1n!LQXU&kF4fZ zi&~i1id}bd93@(mk!Hjxsv76fWk-&(lbLyt`$U%?C@^O@lNV2_`}k`5cgpOQz?Fs5 z!GXGz)GL>u5t)#~ss&RvQ_e(R)C!gnFLgB~Uzc}fo9W$?L(3$?@Z_R_H*$uDF&o^4 zRpR98`blX*@ajF(_*Wh$PTtOdVTU+B^Jj?`PKog;7?ZZ9o9*_gJ~Ah^tfiD)8;?GVH1gbg9n_qCuhd3}8>`r{Caj?4TOXE}As zb9Z?cy@!_?iS^Bk@JX%(>Vf@III;BaEpAKCaCfWaKhG`^ENDC$KI3fcfPfI!ohl(j zM9&+}r&vpm@ak&eI^vXj_zsWd(z=zRJv~+(=HIhdIJNb8JK1b=v0)Zkx&Rc+Wr;4I&h8=SRL%cmy1^8P|zC8y`?84Dy8T=mRcXQFGz-4im%e5{VV@`8;L>WH z9^L;6>ZIdsTrTh_F#t8W#gW&^fThUrrjTL#zlIT?>l6u(mix1Y$LW-cVzhp?!Zd8b zwPTVPK^aiVNYFZvK$+!@pLD8(h*{|lOq#}q*mC#c0C#sy*)At#&n z*|vYjp8b&~i@0s>XHzHqgsDWkHzoaLFqiHeAU52896m-gy|LmXBe&b+l($GQ%x8ly z?Aru+K*c95?V#esC6L((h^@W{L72@9#@PaKwnsy+pb?4)FD*9wY<>f&Z}K<;f|zLy zMEByuQS3Dm9f^^L&p!9UxfacMTcoq+IEHXU1m+W#cvR|i9GZg{O$l8S&O6Wy2koEF zoFqXjZ0a>#Yo!s@$+M`t8!15)?V8F3!*0OYF$p6d?+zd=XgdfZp1;s)ebm0&xn)%= zyXTe6XHz={Z4(duyw|=_3vF$lz{CW#jU%9es&#>3crWl^?Lue?iItYPN&Q@gx5FA1 zYBx+XC;h}c55OE~CiuZ=ct~IGZi20kKJMZ~Ky&AC#?%BwU$*yasAbs1HQP!Lq<-o4 z{Hz=WGjfVnZrDZtxkF02cz>sngW?LCDxK@>F!NLym4#{t(^J}tIn8l z?W)cgPp**E!E%PQ1sZ9y4KH%vl^1Eii`(TZ*7vz7n7B=uHeoAgi4)pW6;N*19&YSh zV9ynK2ok<4`7J&PE(s&GPr1~y6}H(dXU%rZM{ZuN!C#yjk9^6ikf1sl+8%K&!F3M4 zWy2&}+eH!0Td(mrDZn|+MKnY5Dq8mB+~ggr0aZj5k7}41_JNzcNp0tTW9&c`q^Yac z$*uNn)t-hE6gJ7V8q=I_=@+0($^65n1{YL98E#t20*$-Qmm;RgeM#unFBS<^kTRPj zY;MD`mTUgn93~$vK^l)Sne&z#kQc38drOO&JF>Xy(aPCeN77K-(}3-0z^1?Xy}*YA z&b5Ol9oafNK5!4XEiSl^;p?{GPV$Wn&2U~E{sJ&j@jWcKr_$ms>6mfSqR!`V7Gt@j zz!DkZhiYwFyjq`cGaY<3DBMB8W_OJ3Zg7ui%0%*$mrf?Zj;hdDl>T~OyCGK%amNv| zgr132(80Dux}UC(Qe@?Kyw1N>#-WSoE%JXdawV5dFmaeJBe=K*gTKKtbU81nhBiZu zG1>u1RMJhOGf|T~2SuLh-bHG5UqZ%pXJfj)es45sb|GY)-zSUs$Y z1XNyP>2UHVO+zuildZ-jNqRDaIK&w9yh2X0_u*ri_~ep4{~v9=kmF#PZXDzK?H1h< z!@@?;67y=d;zO=P-|9KFlon52*;XhwPDQrkL}$PnW8GAFNbNR}C1)4xwoCR#fD0|K z$-Oa7{d@1KRUO^l$VRJ%M%Gtgl5Iu=SgJ+JRNr=gFVn3Q91~FP_Cx+*(k5rNdN6@> z6>3x)xO`UFWiD;bjo+gqVnC}&x%l>YwraKccy^HMkSt^^_n!__TY^Pn*$)S* zt#DG1>HtbfRLh33$xnv4h_xIvU?$d1>N@+s!wHP-la%~X1bB657c4FW1O?^Thlu1V zqenvs+T>sJGMv>el!t^zSekWZ!c+2joH|fnwmfDs1-aNnAD+X5>}ui)k0OSf4W>vG*WWilHft6qsZp! z{v4B7|E>M?k3sIyvPNRVY^?`pB8b$Gyun@jJlG1zga9%fg=i9%7R}uW{nQ#AhU@%e=khzgi)D^66`;GWnlU#Vn zMX{~N2V$YB)csX}zR5k8L;c&vatQa2Z#;_WE|MTg+0 zH!4``^CX|i*D@VhzL%SK@+o8>P2Ug;|8zFRjs&%;Gk#PzDnV=o#Tu|P9 zRE5Oxu%eC~#U|~l^=-$bQo?!qCBrl5-YYLC3R;X2LI#9YYQ;G`LsZh-WJbwrPTBx~ z8))TVkrw$XQBlV6zJ)XoS3pt-_2fT~6ahQx!0_Ap;t)6TdF_PI?CsJS!g*>B%tA}P z>1_kVwr1NExhRxhXgIHsf6x2Sfb5dynZ-rhTorfDLImk2WIjqKq%6iRKNV`1<_eW$ z^?;^uCJR*m?1daZ(p4319xe_Uzf$cUKI?n)*GMn`(aa;1pA-t0XJ3WO3xGOBAMnWJ zR`$m=V|<4zHYgw>;g7s7L~C6W={PeQ+_8ZQIMRvJM|~7e@&kidO;sGKVHR#^kOIrq zY`XYKmzf-sB+I521q3jFx{YEAzIiqG0V&bBTC`eb%oQu4-)(MeY5OXI^C$`p>qYyq z_fe8>V;|pJ!LQ3L4x?~#i+S(#pb2nZ{Jz9bBF>{?jA3px(9=s-b|iU1B&B6{e>u*& zg8P?y#P3uhxT8@n2R;|lnG0{x=|o6u2LV$yoL5eFt2jlT%a63FX}?+D(uU&&qZsq! zhjrMU4_pSK3&#>|GOt7Ld0MgL&QEKWm*q~)g-~`o7l*N_!O$NODk%12aX%Pb(o5H@ zDS9vV_+&TslDBgXtZ{TJ2hqV@x#&4I+gcseL13O2`Ue5!e`NtViUqM&ICOcT4+Fat zt#sKJf4m(NE@4YGrgW=&q>`QrCp@qtZzgtWjySxa4Y1helaZM%acNjxMW#0_(}QYW zc{;ZXv_Ic&VM(pcAkJ>t(G;eF=;H*2#wxDl=YK(`g1CHuo{;&@ccIP>1P6tsnqr8B zXNYN?k$UgzSXZ~P$|Q2ISowzj3^sEN!@6Ba#1k0zpmDONU$SyPB*BC7S7aD*os zt$rjIm+!TPuHD&PJnEEGY}xgbRg8R-KX-6YVPY>DYBQ)UoCIPFPj2Bo!^|STYej58 z`n^KfYPoY(t9QO!WQ7h}8*f#3o4)K2urgk)xM*tJTK-Y{s%ORZ2bJ?i%O&e-g94I2 zITp_fZ^M_Mt#2h4C5;m^jCCq*^RPhn#K~Ju2Nwp2+h;4o(Vi&VLDBreHsn~+TAZ7wU>ehy@tiu^=P3pwNWe0u$gCei7RQX5st6<0U)Dpi@cAe}V)v-3d9#xim z6=Gcs4s5o?Q}Z@}vXAO4Iu+gq>8YWK1=Iq)4L*M{U(LISHfk;T_~0toZUSQ_E@C1L zc2%j8;JRAva%@g$Le{u8RkGqLtn^l+Dt<=1AAWW=UHwCV#z?B5aBph;fQEP!9eS)J ze^QVaIr1e#vSBsJJ%rnG@r%T#3s>pNd>_6%Ex@j~{KrLViW@zrsC)dfZE81&u60g& z7n{%bcMo?zzON8`XIddRy%0mauc{kJIJzue;~FsOZado8%aLAy@8c4;istIiJ_PAGj6hMg}c z4&V$>xuUDMJ(xj5+ierq!x&4WwDRTC8>L%5{wtV*n?71A?+PCH_^yl>@cTHf3@G`n zSjJt7p8S*^cQ^V%TqWbwIZK|=IQKg1XZIhlZ;pFE>^ar#Nt^Gw?|;93xsf*Z+_vX_ zSPwc{o|Vo^>el|l9(`KCSuR(pn&nSlduVOl_n(a{dRz3kbOYFQyre|;&3a5(hc7Bn zXIFYcx=+zAx$f)il*jC{b#bwedq3@Y*?p6iS<;FjtY*0(W+1wUHDcOZ+dH@i!5VRm zeau_A2N7+@=IPqXFV(edN(-aaac(VMMt)6;fwOX6y5}BTxZL-(Fs6;xFItoJnwTKn zJr9h#8JpG2$kP4mS{{57muX;Le3FUhg2Xy!cS7%j-;YW?csCPlg!=YG6@^dYJ&O?6 z@yKDV@;tIeZAXbGjj?T?w{h>R#BbeLkZSaCeC^R$i|@KIwf~0=`+0_?HZkXmQD0wv zI*QQ*b!~fXz2krnE^PMJ-^~{Ggu+}r$L4)#k~;i%8IPa5U|Cj@13=oNr7@oQ1A$9j2%V`T%0L0@DeNXZ9t?8nLZ9=lkN zHP4Rp!&r9+su|z~nwMx>AmMS;&&e7ter~~i&aDL&aR?8RDkAMIaMUa$R&CxX(XSEj8*oMCXkf3 z6$sQ7Wnq}q*g*DKpvvwyl3nxORK(^nZ;tndP^oq29L|=!m02SlzB?wY5RO}SLrAS9 zb|B{QgUSfG<-yuK3b8RVB+#?J#?UjbAy9*ulcMdZSh|-pC@q{XdpvJFoa?`pIV_Kz z-_8e4v<2mYq-!aiJ=9z}g(;;l2)ddwY!Zpa!#dVLCuf0Wo7d8z)%~8vGjnB|9!8`E z0ibDmcxHdZBL`k1!u6~2YO1!?g)MqW$*H@cbD^qUrG+i}$hmS1&WIpU5z^_(3C^xH z8A2KF22aSTi6iv;ss%!V(mOje7On4i#d_Nr@4gEaSA3rhuUs>)2(g^#takM@?sjwC zj)a+IctcOaF+{^AL_qyV-B`N`&8E{k`TzYXgk$&Gw>^)eH7n&jtDI z)o%`5wpZ^%?S8|DeBYO&=Aw0xnz86<2gicJ%OOREoa<=-&es6W`z6=(onqJ(bV+%< zKtw7O-M1*6b(=T!oBcLB>(E0mi?i72B*y~eWwGq%YPC(9S7>h$!7VaZ(QMA>Nx0D+Tv5l*^6>X^zq ziL0b{E$~iz{Npj+=$09*$U3l`0QKKw=?(@)EaYXXFQv>Kf=Tl%orl{++g=l+doMPw z+C23t4<@l0;6EGS9egg<6pu(b^j;99P69Th@tyF9dp=IQ3+8aUfVW1vLHvUw#NOwf z)2%MeH?oep?^%In6kFXqER8N0cw z$`vi&w9u7btNMp3W|fR(%Uo%UT}_G|sbK7AyjoDfZj>Hf;j34fQ_9dN@Su{Rk*rX; z{X-)+P_>B$3y%^LQ2B(TDw&%A6 zklNeL0j~25%l9C+S201gvMmcp7(fVmHxKT;b({l?<(5nJ^ZGjPMD)rB%gyR{@$Scg zJ4J%;v_A+=w@F!(S~(qFcSvzvpnWMEm-TC@ zKNR9_<%?wh*~;bOq011ZkMmSZ0Wks|4*=BrQlm|5Kx3^^?Qb&IZuAMi`IebfIj>t@ z1sP|yPT(;dvA>wDrIgD5SmdmF$&EgyF3_MC^X}Z|FAvU2mxy(7dc5Q`9I?B&ZJo$z zxW65|2%?76IK7UiYf|&0*ZiGQvCQb574|b(Q8x^Kx4&qsvo_EdCe5OB{Kt(J?k_lP zQ?&&BZ={k+x9x{z;R=~vyt}xZdK}XDN8e{udW&Ag36E!2$cw%g>(l+z%KLgdd+%6k zNT`S|95o}{`b+>@CCJzh#~mIjdB1;|tT7td9?v zxxX+GTC?mjc1Y|s(s^z?G#$49k7iv&HJVuN%(kxCsG~X9cLB*E8?@?ZHBOlIN0(I3 z-pYN6b;nMBQ5#6hMCy?6M%>yJ7f0Y<5|)(Iac*w1Z`VHDW|XI|3BOwgW}}_$^tHwH zqh6FP-E|D9Q0%&8*6|y&t$spn$!F8i1P}If8(BKPpNgb_j2QwhSf<=SadTO=Rz~9-#pjn z>y+M>Ft_asG@TU+HCo-PJUR~jff45SOUcR;OWV%z70qSO5-OT((@B-15yrDi(<#5P z3<$0|-ypwt#hF%9Dj>FynAz{KNq4^SSthHbxWWO(p0IwLDTGqdY}=tw;d*H7p)?Ug zjZBavlavyMoU7oyZ6{e}WxfdlEoHukzuep2_tP4C@?mK!hV=rj8QbfNUo*DT7f-I} z)t`{6UiP@{x_ z1#n)fRg)p(-EF!Zu-AF-KR3N-cPJ@ZZ4{3QDw{5h7b=^slVCnj)O5xvJu>Doa#+zG zo0XOJtT$a>YlYZ2Kiy zDnm=l7q1dGguKYsnBe`_SMdA*(QnQg$wf?7YkW2-Cz{KAqsh1YnYeRuR=)}II&mOV z=Z|hk26_8sfEvw6Od0Z@C(LVxeFHKo0j)B_;-alGT^69#4XLHeKe)!(9nN1?W?$lY zQ#eZ338zS(qQ;%HTUgO4D!6@FlGF-~GRT2ukomMJ$mpEBRf1rtlXUnwD##D4o9l2b z6IgO0gi8@$2}(L#-w0J!Vz-%TeZsC)=B?MGW_z@X39~`xTE-2RQ<~ zBQkaybMjY@1kp~?k*}#b>@_M@I^y=b{-EBufXOR)+-+#SE$Meay0tuYE75X1apPi5 z)+h1Q*0m=!Sw^s!6IM92cc#wncN@+=^K-=ED!XWT1Z|`Nh4r|IEPkX;blaznMX6$I zmtj13t2=nBoA@KEl{Uc2LE9%k`XHPbk8OBTN7taW?OKiS2`+%*Ja1cz?T~LFTkJmD zc%P1(+L$8R&Pn+l8i|#!GVP&Q=FfWCY7n#7TR8eW;J$P9^MQgb90MNk$y%)LN)tue z_pOQ>&a5^g;Asl z(M{1(9bh?8OG%u2_qz8CDq8{!<0-aI?CZFm8uTWu`R#7=j2J(p>O$|t*ytG-myf+o zgac}Q`>1vlYoNy@1gE5d!$MQRT2lQl^u4dZ6y48QeM0ZaZord#6IQ@$6Pf#jJI8`M zPJ{R~(Z^3h`jNc*J5RZ%ZY=`eZF8=593E^%IHi4UJaluK_+3ckqL8o2g(K}{uZxi= ztWZMY!-N%4kN73)kPxv?imJ!!=-deI(OZ{wo_b%5HoTrA@|(~vSxHjutp9Sp$=Plo zXN7do^#0|sO-a0Em25j~(xS4k@S0_8F+Zh)FZfb>xb7t@meOnG-swiuaru!dP3S8) zV|EIU4D=5W@7J{p)%XtXx#NlIl@pc8X7`#%-v-3&C5dpr#`Ljsne=hk?lltdB_$b? zvSfMa)*AGY+SUmb5|WysFjq z{R9B#Uk{I9iS+C|R`|Lv-+-9zQ4PJr&KB8BDb>Fd%)6Ah^JVww3c7Q@CE3=O{qE|j zLP(pf%~onA3Xyr-T~Fxmb6foeIl{|%$q8TD>;DLq`!1J4*nO;6Aq0S|hK+7d`y~_4 z!pTtzSfrCYxeAa^#58hJCb*hp;-gTu#U;HV#l=KKU{M zm7bU+=T9!q%$}Z%P`X2?h}yTNf#xiIKCo`K8Kl(uo>UTz8q-ifta@W+BT%|6GZom@ zn&}2?Ys%F8J2Ym>0;NR*7b}T`Nw>g`<=`nUY{M+Da49&)t8vo8EuHv~S5k25QXl!` zOXT|rS;z`jJNB$lbE0B?$78p94YACd%SyH8^_l)drxw_E+~|UzpFaL@s%1twG*#Eo z-}eKAB;t&<+MIa8Tq{3#irM?aQ8xG9N;?UIVE2}x$>}>)>h~dw-s!Bq z7?WQ1*J=HO@!r=zE=fI6pczE}AyEn%Vbr&+@ z);-7ZnIrkx7yWsU+MsDH2PrfbN;iXj4efHT6`rGp_ZnIbakvOz$I{|fOUt1pYA*~j zX%QBc*h%9A-!50=Ye(Ssrj~@Q4>x^K-gT@x0mK0cePy!-ObRd zbI{C)7gOo!&giyu!$~hr;vaV|7KaC9cDW0K<}?$aP1Bn5`Owh9LN40|c*YZ65AQb; zkKLjxHxQZ8=2Y=^8L@G1u;hnuh1`aR+vZKHG1rSYa0Wk-X>P9=rsUyLAV0 zEW>T^5)_m4xSp4JdN-;b@0AqxskOn+!-_??Z@Wx9@cqKzz>-tQ{Sv04^(*RRhYB_0 z35lxN7~{D*S2h!mo(c~$2yJEa(|<=!hZs?h%=iVLPM}FAcCuAYyyM3S^(F|qiN&V` z`o)yBuo&0IKH?Oc3CmMMwyvc@g^w9g3s`x}K%KK_BX1oCv{7)QSBQ7sS+sdzp2MOx z-t$N?v0+z8YANbZNQ{Hs@w+Ef!fByCQ}#9N(s0X9_!g!)-0~+3;3a9K(2qR)=f{Dl zjYZ4)ZXk$UZE`S?pL7Hv@G5&oFa;1?2tvRMfMc9sU;<3vCu2WwMm zlHNX*gDvh{^pZ)bLF9An4M3!~q$q?j)(eo9$*>Q1Pg;-rN~isFvETs${0ssN+`i2)Ge-@$$Wt+E4G^^loRd)g8+K5xf#DVV6Gphk)#Ye{A_loV9dq ztY%-D+@dxg@zc#sxpQ-4bWBs9bTVY;6l#)!+MsuFB}2Rx$85N*wjj%{*u?=;A6(}W zPQLK7W9dOJOa;rDUl>BR>nfIzkfj|Gezcn~a&$`!c78~hJor~k?eaU@7i-M#4^+)6 zKU3#(ChuA%?`#f;ZM02chKj=d!ps*W9=NO9&;9+Uh~Zk4bhPepH8Ug$hJ{ zBQDiHL5yt(l(c5am3+=($lnq@0wyq>3?-2VS*T)j-|74i%Ok&-k(`@iPUj~~x_^Xb z)@+8uwDHI%_f>kBPBIJF7nl-NbkD5qcJoo!hn!^3)q=6@vnNls9-l!zxuujePW{Ij z8GAvW%v?>(g#_v+a6Wv{HvMBEF$Ieref;5?2?e@6>>PH3)jjOj_8p{lQi|E|dw|yLg=XTVH$i*wZ(U^FG&};$r4}NCS1RHd)G(w4_B1P!0Nc&!c`{Q*vM|m z@{^8|(}}71g}P%-iHrHg%9uLm3jG`MYQV>P#?Y`#n=Vb^C2`UK-hn53A3r}9c5+0>+Uav~J z;APn8RVw66F)j_*2yJWEslXPs=atr=%ccu>7NXGJix%3cOt;%2N+lj z8%~W;8DYhm*ieF6m^=iK0G~2Sb(Jp9_z6?xt3?(%6;v3m{7cI#$=G#mE2P4KG~_7f zmpQNWSAu-Q0dX!Ba4yh5`897tdBT%$4d{|kun^`dN>-YfDO zp%xakcbp#y>3i_=ZVKw-wn&`5N-(+mze8(kZE9^#BEox!o8*9RiGG7p@SmXN zb|hrEyW+KWQi^(H1twY~Vg+i7TLYsw+|w&z`M_6^%Ew78Vwl#8ol@+Ktt6X`Q*iqt zKX-hm=WDMOAL;-B>APweNB9>XlFTqO2Rb2nR~3Fxh?*x*J}S?e-6B=gRwgFKfAI$P zRvJl*_k^(M40s#Fq>ALEu`oua^jiI#R9(q%E;hs*@qytYN^T+vy9-g-7w@9 za>8P5?W=q;7D{c%!%o$UO-Cy{b3p{0Z)f(>E@?Yiw&w(*WUBLd|f2e^wPp$v`t;z&^dV6>*a@YEx>$A-k$9CUM@Dc z8ao9Msjebcq1(0(^NZY)oIt!ERNkEt?zTS(7-RT6a7(N6)<(Q(oBY*rKMUQx{Hb;` zm5**alBB0RgHbc{d8hqm;8R(!n?ftv?`U?PK0i5n%~}6?ktor5dix`=?)kl4gyqX}m(4Z6sB6Ekqth~eNfaGBS{l)7yU*6uk<=IgLm{aDQ zAiZ^hK(iFNhX@#E$mv#jy~QFY`Z2nvA=guq-WZ;q%9X0j{bIKP;Vt=c9d~zB1Cd{m zE1>IA>T}}X3e=8&h7)|(<2GZ9lgmK&JbD6a+RO}m~xbVSG@*~g5!M5D2@K??Ki_JZB(-%6PNNzrdR_(d%>*q}krGF;(>seY5eMZ5G zzrj`B9k-U1C@#ZHUIOy}fxda=-opyHO6sB+)8%ZrilCiN!H`G!J#wZz=cZC6qt_3+ zmq+w$=94e4*`XgiHqJ=UL^AC>qjQ%nAMy}o}VDpdV9AV6hu^C|_ zKeP=#$Mf+vJK;_Nj<&WR6jT0ij;&;%F^1*$3$@+u?|LYH%K^cs7hi0^-h?_IHm-mJqP%%y1XPh!rro-wI=&hhpJi@}ErM&joLSWiMMF~;{CaTYPF_`SIw+$${Y_Zlb-6)ZzxNN{SmWsMl7m#=XTR`Ql}FQhI+4F z%^>&RpT%)1HvV#kolk9j>y+8No8XrCwLRAVL)=?H)v=^&ph>Xc!5uR-D;T*H{cqY6T4 z+EttodOMsFUm@utwt&XyLbbqDw3m1>qZf2IB)*P1#e9S{8jNe)6w|P!C~rhjUJj

OpDP3|0?=Hpn`oQXwta441dM0dMX2+hksO6Y7us8oFZU@k_kwCJ@Je|93l? zNOOkYhiuJc8DB%WZ<@s0KZ0`C%&MTcboBpL4ikV+3llJuGx!!Aa;%FK9aeuG3>_Xx z=Yxb#f)2fecftmW6H0z3VbI* zL4o&IxmmJn8$}*bQK_EOe9&8?-`7p1;!gdo;QAXDvg0xe>Cpe&~`V+BUnIW%qj63uzC zEv0n)KtR~?D&ca#2xgit^pLvhvxYwXWBYjoCEn(<3EjXcQUkm_M?jy)?x)g1gD+d( z2$pZK#@Ghk`x@O-mq?sOMXj_^rP0exY6BD`QTUS+Ek*XO6(uV-lJn#7eV39pZTZ6= zhvx-S8JST&>D%v82_)N+QqxJNvrr>ag;8|Z^u{Ht_9`Y9^}=^cZJ8nHY7i_Yngwa* zFK!CUKnf|QX}cA zjEEOQewrWb>Lt&nS4ZtqvZO0-&r|BcBri5q~CY zw>513k*W~d`2A}u-&i!p;95C*wIZUjMUU!Ob~{SPT*ZgdLLnTsNcPEM9CFL)h}rjH z5|ERFNPK*?4RDv4UZRV>AGfPAg;mPmTk@goBxQ;%D<>@}?&M{fo$JX+V&Ex+JRI6; zvob~&_zGPlSE!uGvQmiqjCK&k$Kq(F%$%|$g4O79eD_MLg#OfpI}iQP4b_D)(PN{;X~{~`3469F>$0iT1r|>g zNvMV?C%{_g9krUh$L-KC`?$1%MUinRg?Sfq63yTJf9q zN^YaUW2$Ft6x_zJccI_VyUr|We5M)XebVU+BaK|XB;o4i2Nq_aCmrDbYN1{^X}Oz- zoH)P1ta^NzS2#zbvLT4R2;478;1O!_$p=MfFtr(3kc|FDZ3xo?5W5}5t zE@WgNANlv7y^caM9{S(USTrkM_=kkn@}Rgv{#g{A$^MVxA?u?ZyN*V5D+u`$qObW1 zc3Nr-yFs?Vi|b-g2BK7A&bF)FzRNa%gu3u6%D+rD9P$^X02M{aw&qxDO|fulBH@JS9PxpP!`b}mx*`ipa`lu!)ck7yA`4w| z^+X_q%E`|FJT~A0XuP!zxZ$+oS(qrcA;Z+dOinUL9__Q@3Ivs%g#~z7_TjiPNjPDF z+UuqFw^Nu)-)Gua>Hd2I*g&-XgZWFV9*atUmrza$(4O?Re0`Ld0=d5h zeEngtPVRQ&k++}kZZ*lx!W6TkNOe-S(^?m@O?6B@54zO&1m*^*-SKJuHHR+R_W-U+ zv~TgBFAdb()d4qLpD%^mVIXaA5jT8Vkd|du>2`fww36PC`hBqR#tPmbcFF{8k%4Mh zXO8uT|IyDeXk3ZQ+%7Z^nxYGB;Xmf>E;A3||KDx?3st#LdFcM9EdtZVTk3*Bbs$gQ zPGwEjV}ryg^F}K?%O!vPvfcVt&hN*wY9)xV+LT5Im}X-pG@8SP7d7^{KS;9;Z-NQs zg@F9MD}xCfRW5&REL%28Z2LMRW5-~f&$s5hQv{kEuhNXk!PcC2oBbb$5;r^#D zDO4Y;x2EjH$cR?mBua#lH}G~!x}!KHkC5~?rNuG&`NYu2VbDb#-o3_l!a;3UZ|VD} z+G|3t&lpFSJcur77@AKnB#)6(6gr^*q>+XU0#x8Abn;p{_Q{d)`prWtVJ3aV?fG|2 zQt5rW*FWGlihv)oR30{zzyX~G1opKTiDQBO?GJQ5gXnx1i#yekvawlD0$Nj6>s4Wu zK}$=yX$XeK0t*?x>?q?l;^BC*yr(UV{GQ8O&HGM#i-tI0ncS* z9J_#F_(>=!P1cA6tnqTrAe>v-2y`wXeBH)`bjU~C5Kii#lT4E}54yl%Ba#|>(x1QC zMg$G+pc7w{HFqdei|kZ36MoZ)8hgxttI38FEqt%@OrtRsI>CO!j#^{Xf2hfZ4UKxQ zbLW2`hYeGyE<){fs9WHy+fyoW!`5D5=^|MKP*tLE2U?yI0UZUp5a0bYE3vNIwQe!L zdAnEQ!L>J>;$Zvnzk}uJ(EZ}Ao!f;D-PVbar2qKS38b2@e}gYe@DjYB;}yDzlGw2+R5bf6AS!l_GVU) zMer#m{(RnYe#5d*P`3l}v%U&OcbaKbla%93}_0pyxP)zBjG1{iYO64c1qv!rlM0J5qwG)9Owa~h2QOZ zqq9t5-St5QMtt2}1!_o#t<+EP6vMLq&p%pSEVtL%oywIspW3D7!M^IkXTmosVpu5# zsK;$68UC*!S=%5C5nOn?wGDE3hb`;tf_27J?;0Dp&5mF5$r}wnaUC$Md3@DXnZLUf zh@ouMlt0oDj9dcQ6Wz&y4RFa0yBJ%#9 zAH^6Rz6cK%P|RHh?US{}g*}Q6Xevz8{mq z+KVm0m~LivA1P`n>ylK z<7~qWKf2qoz{#2dVSKS}fxCtF>o*-}^5v_u4Ga8_-HsK`#uSLp7wcBI%Ok#jCi`wd z9^VGO$Mo>&dI!SOg<#sXV$qla`?&@qqKk}`YNYqY)#9D>fS8zJocKet15Z!AWtCvtFeD~unLT|0u(tj(DFa;mIcQN#z6va`*w1|41{SMaw~NW5 zF#vY1as!iDqbonu_l)*6&{3KcXg_ZQ2Q0AfVzXckgx#y$z-CVE3ivxYnDX;it3sqk zfhPkmGe!2(IeO{&+beY*e^A?ES|rPW3Do(l)*6DMck9Y^#4$1=A8Clk*A| zf^up*!yE=f-BfTcB`;ZKQq}rik3+KaqwPZ>jKenb!|xApKRedlw3S~!&&{j?w#`nG zBSaK12#aARW2G6R+d_Ix)?z4mdfX)s++UpIr=EkDef?kb4Z7**H_27*V0? ztU@-}1gzl**nMxqr}hS0*6-MVbHi6$yiII#iD<&uol9#GWhxTT)qUG35UZj5?L*Pow~<2(dZr(_YCk&}RHNh0wsD112xO38c(iiX^O zs~`+$t4&F$_>mu@H?$vlx0&qEK+du}2Qfg>sJ(WS&-NQeSrV7kJv1W6BQQytKy*kMR;0%G90L<2W+yKE+PSr2G6iUddG)K%ix z_0UAmEQus2v+GSgdFbkq6GX!{a(iv$^jVAOQm4_S%wR~E0%9<`{)tvr3i*^zNGBr@ znFk*XbR)T5(qAb1?T$UqDQ8faVa$a{FWj&8N^Y`k8C8up3WhRRp;%+^pj}M^z?gx- zn4ULV&S%AEK7|%7q`T-;dYNa@Cc3r3d$GlvnQ}O0ypobE*EU{q>N(1Xz?E7ZnXck! zB^mP4^BX3;`c9stZIR+<02EfEEqS{Ld2NaLFft`P!MImMGK zt`8;=UwB;wZkGs7DHrj5m83XtjNXvZWCSt<3YiegBi-^i)7U*55W$mZ9TF% zh8w<$Dc_jcSa8b461?}&fu@v=d~+yH9tAL>;a3_5C!3ahR^KQ9Yf6N+pehxBeAvfG zFV}o2#}XfWWKe*$oKf~1z^9NGKWW~4Uy&9gzGNWBqnPVKFT;aTm{BaxLpCi9b+vt* zsaaZ*KR&qieTe9~hkCZZUa!o8fIHUmanJXJ#Ml&kWneZmwv1_89JVO1bWM!Ge+jHw z;sNH)Bbajt!Aaq(hLpbN(EOU-ir#`+gP7EuJ8;2J=IXR>WfnO+)CEbC2IgnzC(%7$ zRRAk@!A=SCE#mC%D}36Y$LB7b0`*omdRs404`vv^VPaTVxl11V3chT~BeQb1)kuSV zj|th*-@47^v2iz4U%y4>vT=(((OgK{lJ7nv+q^}#bqi+Y7R1i@5H5}IGA?G|YycS_ zkOydL`>c6Ma8nLJt+m%Uywx~71r_csh;EQX`;pBF+w8?}zhU>`f$_|H4ex}A4v&ax zi~#?kkm2I5A}exl0HmvxIteV-6wh=~IQcp%-~C@h z*__>95>@I>XpUEBhJWyD9PpA@Ocy1SKgHy){4=C}FNqeJA0sk#c!E-TIjZMkjG&+C zhpU!-@S%b(dy)}h_$%GX-bvO?g_xi;)08|k6P#-P^S2as)(Aqa%;O#v^jG{kp{WHp zV~;;h>i6zE8@S}}MfSPPb~(*AU35(s(xnyH-P2@U~n68Mb-9*i%{f3{TXVdN#RE0*; zghw<*>}cLMJ&63^j{cg0$vH-=8ISSPH@g7F|CRl zRwWE>lE(GOl859dpb8gJhRdm9=Vd1f3j!A#11>ZMTz3q(f*bNhA?dEH>~Ie7K=Dn~ zp?j`NM%1(sVI793rI1`oRIL#w6?B;KI%TRa==(ejQBxtg_^jvG16r?Q&2h16~eXxzoncr*V0|Ih`%Cr*S{)G24E z&jc;Fme)_yU}dc8B6fflOe;WnT`>`AN{4;eOT-Cwx5G{4l?hl}XoOg=Fws^{^qK6y zZJ~ji0zEf52Hr0^ZZluZRz9z>NN!ny%&HifMKL&qyhrl?J37yc{Qn|?Pn;A%>q} zxi(c6p$+j6sFpi5aChOIYKxiCTsn0-=Dah*6$lR#O}+9Cus}((`5FyYm0rH}Fcg4^ z^7(O2$LTgy#uPpkK@6A+Ojj|y9*5C#Uhe{?EUV6y^)_Jiwb- znL8F^P!xb7b0G+Z@0{>XEt7MAW7?A`RQ!;woN=TlrllmU1*`LG;a)SPz9ks=mHfng zb{3-4Hy$$0QX+BCnCg?rN_&y{rrg61a&;jB$B)(;H%(C@kpmy1uCxfhs%{(3B4gcN z@1c@CLy>U@)a9Rfe0Ji&Gry_2Mrt{6T*Xgg^jw)2SfytUL_Lo$3TV+UhOEnEp7w5j z2Y!{w?Z*#d@>ZIczywCRQ+^yY`6I)sykyQHMxNfn5B+7cF)fGaKBlxHFrTKlUMj2x z3(gajOqQOawgLRL<)@j8ie>vw!15I54dIyL!?AxmTQg!I{bEcMyR8Fz*UDTf%p>By z#d-qo-eViC@)(BYnf1gKZ-w-wwJdJM=u~0R%syb`7@0oqo@2b-nssK)?B0`QPR>No z8L>9ZIBmxff^mh7n=3P78I9FirNxsHWzeEmmU*kc2h&P+X~uvPB}8ny^$2@LAl!^o z*ikxjF9YtRTgIw3z~!t%h2tHLc-v^))KR6I(x8Um@@LtbPhB=|Thm<%WgXWjshR?^X- zHfTFM_iH%!*^e2T;u(%mDQ#=)0*Fk~)tusMT$I!dLUPVp$;-lcpT+}gx=$`wBpRuC zkl?J0tK58}wqnUHjYImQqyVc9akAU{g`SHgXggx(mtp|VHmijAOq_Fel*5fo>%@~l z-}7dxpy636f5XXq_1A~#d9vaO<9K2x&jm*-0Nz#rUQPoDfX*ew*5TpVGZZe)KJ;Y3 zv{!Ia7Z?=;yO`lUw$vCphTq6-DR+qd99uQ4?bp^JkqB0!3peaPw*l+CGOfWbNtH=d z>oYqJzW9;D1Rf`oz$RA`7{Qf^NGj};nARsgq(iz&400J3;4;d_Wsv)eU^dVnq0RN*$v_yEHGlS)dM^$L z92;bRqL<}JDom4@mLfJIL8^-h`bjTBYj?3!!e9H|Yxjg=%kno0wze~wqnZv5M4V-a zKii)vp+=PKiFCVunwXN`-!OkOM=$4k+sD_p1NCSUSPuVav_YUjpe0wmSe=achEFV>m8p~h6g>r6DtPjF@Z*n0?xFSKxD`Dm z-3mYN*L0J(6mV<16}J_&5iuVb+Em`sH)`0hRk1W`+3=q^+L+oD-OirIZeX0HWwq(X zveGc(AWa_)n6Vctx3{t!+#KCNC_}IIJ9Np6)t*jZdYdZf+}}>*3Jb@n+jtIA@hGG{ zXrHw!cv#&vb+9BdKR<}NulmZLhRIm&cLwICWfkyCE1UE`t~%WFBs&@TL!x{ueWxw! zdZLKJpv?q#1xvwLdTE*`9;dE&pj9GWX1ShmSngs|d}+E; z&112$a?{*a%1ux@h?kF|OL5qGEq(KRSG&0(>aN+kd5_k`Q5fTCy1*mZ^tk|B@duUv z9yfmayRcOgdg-*awB*@m8i|+`DJ$j!JoyW)vQPER6Nf@aQJ)K#k7f>5%Ul}(bak#} z8s+SDA27j}R4e|by83YA^(&2p# z157Tv!~jM@RdC<>s^G%#tKdR)>9B_W)QdLHCTIh8fYHz)noiaOfu7*d3j=Dgc&}(@ zSzttYI0U$-r+H};Wg1Y&Qofrlh9K@w_Y8={yA8#LejF(5%D;g!!0E|@iwV2XhptB4;yx1<^04He@1kpvN z0dDNDZ}k73+{rQEj-|vS8WJ8jm#udDGaNQfCIL^{g@zT2kBA2LL;TrE@?-#e>VwKK zGtD0vif@!U$!}i)^T<@7@jfEEf#P+s--2@Igw1w=&%aI4VX*KnJ7u%*{goID@`NmC zpJhUgJmR0-B*Tany!&xNgESdh(B9vT5UHDbBfdd^u63oau*uhIKTjCx12khq|A&#B zX9_a|2Bno`sOdYDtY|=R?jBRbKuI!r=vwh|IXIwkRWLoDc=}vhw^>9!&{;Dn3-Uty zB3nd0V`*dDYY8@qXM+d+?j*T)IK!_%#TY4lE_TPL&;mNi*%P_9e>qdzPdorzapyaK_!{e_cVf{q2KL^^hl3=w+s!)tbQq z2oYx=#gvcOMm+FcGKWlb=RR&Wfqi+y&>A!B;stSn&F`&_cxk2_I|{#gKm5?bB9IO& zfZ!gZn1(&oZjx<19A;bL-SvH(D;eVl89PLuY1XA(_B;;FekhJ6IlgyOH83HuhXn@H z3XQ{ubaOA<0CkMn+x|RF=|WKxFrP%g3n=9zWF&WU>YT+`FN{tZhqf94l1?EzH|zXK z!Qguo%7)E${JW%5q@au9S*_znSH&<*`M&Q6tP?$65?(xF;HKzs`|u@5)@y51Mr|G_ zyL~Yb*WVoRjYy*6wh`LDQQo44V)I>0fN#{M<5tM^m~^ZlSvMfMm7(T#z{DeOTodav zq<)r%Yby#}bNF~ivY8W;C;c=n&!FmeUM!)tvze5{Spz3E16~j;(`i%TlKr8=;m()8 zttHY$wp}K-TQ;*@PTy=)+-{s9GQ8ZGSCl8NA~__KV1CF4HM~{_0n+vX`8yF@Nrk*u$Hnvvh3N7gFI2oj8>$n%eo6-@qT z0Vdg$+=PB+Poa{1(>UMSFZW5uq_8Ny0m0t-RblQT`goJ`fiQOS$Gp<3d=!>St_)?l zg=;#KVk0I*9A(qtN@lziOqp>KwQ`PXMObCi{z`)~s8bITEhR4b5Ay^`^{L(BT0;a&=d}9Aw0emgDh87wm__)^)+ zxm+_I&m1q^hI6Q_=@8060_4{a`@KbUC)Bn6U#N<ACfYur+yfTyu5u^3^qSKczK9UgyaqAGv+xAa*W2L=mO0!tVPx zHW5QOIaP$B;ok?U9e%b1$?c;Cp+pP?;elOEhxsrcq8NAIhq1kR!SXRG?4rYbi1v}) zP$GJViZ_#@dOXqH*n~6?MMHd>c9HdyqUr~PWncRk#ynfc9ORVX$S4A1>w42l&(m-%}Yz#>N7LPmYq&I3NBx0I%hoqybIX^X$PiI|XfvH-cU_G?|fVOqv&u$N`6+f#^7 zatY65H@YgSR*6_Wv^TV~ad&28)i45QK~7$mbME4G*Ee}1nFajA5c9HrS{VN#J2c%p zh*lF7YhIcknA-VguNm~hq*;HQ(pFCOya*3{e4tF>E0iomg#a@d9J5zX!y-HklVhQE zS#aZPp}z`4BDcd}Hy}+w!!|@sK-|Zhf2Mf7KBeS@0MUIn9Pi)DMvJBu$g(b}@?NvI zVVz+1g09rJt*hV^qqKl}@t-14uSb}E7<~Jcr2NZ@=z4vN`pwtZ=56){2`dcUDfA)2 zOD@ao0~WTwz75o`8Uh{fm&}UXcEiRuMUmhKyu?hCeW4hUkaHccRe9T3jQHVJ5rQ`r zynZIUMpyu!rewrCSTQh*N?+3@{{bt zXl7FUk;ir!oe;M=4sp-tiT-M=)1LMnc!y5r8`*#kn`=YRP`^E0I}kkhBQI z9pbbY`RzleP%TjMx|kAyKTCpu84%E3XBGcce_{MF=Wo>(Z`3#J=fSnx6HZYq0{^H1 zG70giC;d|$OXtn$UxNQHf!(HVqUY6Q>ZmEdDldYazyC^mBae~%mH38N=)?aM3bLXwhRes4 zBmtBj?I1O>nBr=guMz^8yBS%F%5M~R?0XqyyLpIKVS zV3orVjJNU4dRjMq9>ZGPy;`_pT5u>VrcVi9MRnIiH}MFTqa>VFF*f0!rW9>$e%4BX zoZCU%h%^>N9b(z$HtQ#}yS@1!{9JrMCT-@z=V?02Nio8wJ;1+x4#LNgcoJ>y`%U*7 z9^4>*Gtqgd6&aS&m{~O@C|lzdW8*ryqW1 zM4a+X5jsH>HR4)M$ z3<`d-9LY>B&fd**G0jz>%~fC2&M3^9E_qgbP0T7)SgAcBt7XiI2G)v-&KQ%SjY1zpDrf?67X*0 zPFNSM-_-3`E{=<0#ZLqnW=8{tI}b^=(@xWaIt5@qJ#^HW_lj3sD<<_6lIkiLtf~{R zRrtyYE0A;vjz0|TKN(uoh`OL#;{uw-v1k$52he-fp*&pDtJ1pAzjmNs(0)^A_-0wk zlmL9alAAO77;|r8AlT5nY=Ob(^%_;0OO|lCm zU~8%1JH$8l`(tnGjA$lFr_~kU{;6-@?-FbQAM*JQi}(odo9_J%{2J|@4^-0_6_Rgo z(pu~SAFfQBYV$+bc=KUZM%5jxKc$GqMrA}~#m6Ns1 z10&SV4rmY8t=G_(KOk-qJOZ|sjlr)+5@DncsjstYCqTI30N|mT}^(@GB1y31h|!F#8Vf2f{<1DsE_T-21u@9z9AsaMGEVZP zC=pk=2pqjsIHS~02As77X|wog^~7o4+D%;2T?&coWb_X+Ns62?WiL_-c1;CFroJQ> z&@o9PnI&WtDejV&?1&kLEoUMReYROS+CJ!GdIRQ>W{~m)Y7BoR9Vy6$FCe@BL1w!y zcNwnmTuIIf7ClKb@pRdpLU}R>+2G)-ycnCvhxpT3fg1KUc!7rzkqfVx86Ks^bbM8`MA*mSw8)+hvC9_4L5-0?zSytL>b<`R8>6F+5)w=#50yZaIuu>bm+ z(T^k(;f5)IWP{AAhAKaQ942{42GN5QvW*xLAo>D$V*RvZ{MM5F@WeXdi8cbGPhF!< zv7%0wqE7imZ?gy=lL;S5egfb)Nkk9x--CeNPXs$F_+G?Xs`Etb4{i1%x~GUZ%s)QTg;(Jp8IBe@W;jD)oWaVJeNni@fA{e{e(ej}jPl z*(GwXOZY?^?SU@J6Pk-BGzm{|@bA$i(U%EDQ18wW7QWKKef=onjG4fdMMjdwdQ6{s z&9Pkfp_~;H!Y#F1PI~I&w{zi@8Pn}oazm7e;%|d?*rM0qbK_@ozt@&nJ9%fbWb&47tQC8s)ANd^dTr^(2Pa}pgw;H+=7!1hVt&# z=>jX?d~?^>u2{cIuO5YZ3r+;@88SgTEE;|7m!G_!~X1z|vq_Wgk zdLTT@nDSIzqkYJ-dcpYAO^}SA9c`3YSdM{DzC|N^mcVc;PW&7l)W+DMy?L6T^0)&! zu+Od@)viRTPmy1&?mhN68o%7BJ-bB_avIxnJMfBg`#rARJ9xG)f!N*rs9X51rx8TA zeGV=9S#+>zXm+?Bl_)eSU(f`qS&SD_dY$<6TQae<#=&Tuv`pWVR|SSFbfFFso}nl6 zV2!i|?Rp08wr#Z)o6uoYfw-O!ukA#goSXP_s%>bhWpS2Oa;%pIng)f{3ZPQirp3?q zr!OtoJ4R5*uQ|^jL4SAr;F`AG_HhnbRRC9Ej3*NF7T1MJl{SKl<~{Uo6xc<-kF!As zXSEJ4kfTf#78e*t;b4sL_U7u!o`^10{31+U^b4xs_f&MUs9f5 zB3V%P1xU;f?Z921H;Qx)jIQh1HYUQOg>>}Tfn>~3cK3L6_gFN}pERm)QrDxQsRxA+ zt?RI{&ZBvs+)1zN5jCnHP=9)b#^DuG*4v|JTLscM4|m10VpC;pTV;}Z$V%;q{aLI# z4birM!F$XSZe4=HHvdCv(OYA7F9w|UBp?CFD*t9Qw>kPy1ji;9q;UcRdkZGq7QBzu zS3k9bPJ^`<1G~##ztJX?;RSBJ3Xk&D$8M*CTStem2?b&8ef`4OzUpK3`b~3VcLnO- z+Q8t2Z*$9jg#b`2PtqV|NAU&)dLYh3j_FS+EAc_Em16 zGh-9r_I>H2+q4aJ`j6r3zWo4w!gX|A?=e3_n@~{f9QN>uH+>@Qbj=&+6tl+^8Bn4(?SWw*gR0ffg6e;`ZMIgYB0m5pz3*c4v5AYbV5Dwoaqm&2>i^;Fz@-cSH!+n$N~9Tm`z zY`jnu(8_GR$rR8)Yd&{Q!~@iv1|fv;-1f$$o=sZAV*^9s-dZJ`-rqY za@0(WS~d#MTwbv3DBlI!fzOe}^Gvy%DZJ(HK2mtgPy`3OKVQdZG))e{8Ly}q9jTL> z5xE?*^D;8?e2c*8$0s5t#z#!{(H-pZT~skzmxHz7p4-fA9WJO4pF;L`*Imnkn8QD0 zNfZ1Q4v~F0#CygUY4-K|@&4~e{?-Ku{<#;w_KHafmZf7()YtKTO%nq;Ow~{!)SoRq z#%lC1N+E*JS-*~LQ~xGHCjQhjjBBD7-$c)t(Uz2b9vSDmKinuUz$M$0f4p^ce^sWo zoD7o%H7q6I8?5k}Q6@*tc-qANsE0!VPV*Gr%0k4C@4TPYvN@i{({T1jO&pAQni-&0 zoJTI>$Fn&$_D84oM=2Q%kT9zuTb=m0s3oU+`J(QHab)<(-@p8#{g{tbEj)CNnsG`XF3$_ z2N0a|0TAj3@|=n;i|O>*`LYO!t!*obzJZ_ix}wdwpwwLvSs6 ze9N3FAWp8v+wQko4;A$)Hd^OSSIwPHm|AWy-Md0=v~oP14)C;qtyNdple*1TRi_G+ zm%UQUT=0$BnHI&Wd5pm`dK}qh2=cuklvdL37SOvP0_9E! zRw2OE`VPyFy4RHx&OX*x$q3c zE%agBOJ3aSDcnog6~nz0HD_X2TBcnTmQH!F6}202%q^1v%8RGJ$xC~zr{zDjo$|uI zS$9#yoDLGU&_h;8bpEHXVk54>PYD!D2+4}afm<|%yIM}VnDd~V1 zA>Hqw_F)fU1t^v}W?3+b88_?Q=HzRda=YLejI9@A5hb3IN%&hIjcBQ$7oPj8+oJ&| z1Z&*)2P=7YSvxM=jFOEUWK@Gx(3BM(I$~rM6xvvrad>@eNm(HjrR9mTP5e7yaYMLU z>3!eI%!-+F7JbalcFdK(Dz>VHE#4G#w8-yoneKcvS1M<#+$CYM+;ObKbv9Xnm*AYe z$TD>=dsMrt!zvo8L*xB{hug-o!^64aE|~W0_^E_SV^3*C`0#tVdd`pKX0#J2-QLQ# z05_-k#mXsN^CQ!wiZYhvwo<93>9#A98SQx+%Pwn7V$L)E9BC|T>(uMqn<6RLxqx94 z`czcSSqHVL6-oJI7reWA)i9$~)DEiV2J8hp_o>)Oj55^1hz6~ddxN7*hyv!TSXB76 zi-@8}RsaJy1C>?HT^3nZSVLHYWotWQs_F5Q`e*A5s{+M<)s#j52A=66@dtjuz_jTk zz}NJGNAfO>pJNB0oL`Rjc_b7agU0 z;AM1*0NXk5>xI>;lUb1;ZO$h%0hCF{Jm#ZQ*s%XYLk2E2YPvh*-@Xnb`Mh)+BH)0 zqg|*gz#YZW(wFl4`gRZSz>vY-mlz^ST-+~@^r_npoeAuJRl-6>zGmHr={Y|oBZ-#O zka9N~7yeFfS)9jJ zhuzfW$!Z5T5^`Q|ge?>C6!Lle0`5L=m9O=F`a``V($YQGQuCT;cp^nhM$!!j7VB8F z{|#Gy`dHLWQ~&)I$kCYolXGbs<@lb|gt-*h?1|n}MsV=W*t)~bcS(R<+2vPy%}T(q z2=&T)KvK%1c@8}LzAv||fBkKmrFgTaQa1N@dmgzHki7$4$uoq>W)HxDQJ zjJsSmLXz5Em5uAaBA<~jY$|8kEQ~ns7W_~bT)<>U+soP>%b3Bnz`;?weSjUM8OW+Y@7WA zs}w}q@V5lQ<+kCWHU>fV2HX3>&pS7&PqPo1aAT5wm*4kl>tnS1V^VO0M@BMSE4U~|7DK9wCN>|0c%ALHLbd@eHlK>fT;P`$zM5{Ho^n^mwKT?r zB15r;BwwBhHcB$Xdo_idyIrBkfBm(9yvoPC(r0Q!T9Lt?ifK(FtoH-v*2De!gV4r9 z^Tq?XKEARJKAPIG0!e8uHifBa+L*^pQOF~OVn7R-x%QPjWZRh{YDO~*ja#WU@by#+ z^Wx0c(P6Cy`ZNopDYZ3K2^Qab3NMI{Ee_dJnn&}~Yl`+P4%t#%M)R#|MhapDpN!<& z7N)J4uTmuc3V&3j(nk~wZ;@We*R5vbNIx0N0~V$|nXfV={{@^)Gs|VttZVpGa)0Vj zHr-xfXiYuF-)lFkFsc?&!(6hFO`@^gE(rH~!}_uxm2K?z4#ED%&6mJ`=3e^QU4^+3 zkqN>Q8t=u_oNa%L?bf*&-+|e6by?`%0%=iu9O_l;yOEF9F+swzL zsOH#4RaL^Sfp^wg2=1d-qt}QiQtGjs6W36&ibu&7ZBymb&c=F@PyH#gFb@fU)0EZ6 za|0D+&d)4v-)W!J(x$)d6*gfr-LMD&ni{jM8x{*)$l*qGF*Leh%5{6+&BS32WDC(3 zMTP3)T2sUwEnLuDr*@=Q6!FblQ(vcqJnibWHT?-rdz2@aA7W`JH<80_FRmq*Z0eLh zl>r;Ozy`(EPOb}Bk(O}rT)%wJUZz~1Z;+WD&cj&Gvwamn<2w)9AFw>0ph+$K@`qBH z33OAfuf`%D_3`_JPm$sr{dqXslW=yX5I}mFeNAhyXVt#yM&mmdn(NrVfbvy0<@2r# zX8}pH(U1iHw3&P-$%demjG@`|{Fy)M|Do+Iz~b1lwPBnPEVx4icL@+Y2^QSl9U5;m zxFirf1b2edXyY!yf=g)Jg44J(jq{V7nYri8%s2mi?svcEd0D*sUA0%y)m_EftGf2i z%pM6zvE+2&8+sX>La*rWAV(^IBPG@Oy@(kW4iZUEkk{`2@E0S1tT_^pU|IPEgC*tP z8MlA#@K61JHQmVNX*(p4r8AJkrNvH@UW00dit2JSr%8IRj4FLE;HE zrbo3D?2>;x#=IY>uBZ}#%2b3BjDKgo z0Vqp*I|1nu?OP>;+6sY?znQ3D$Sdu?8{*12OilC-fROe+MoE-$Ekh|^kjC}<5q<6b z$0Y_PZk(m=A&`+uK_pE*hzT!_=9=+eOlSx6$u$78#JQ3j{ofj<%2cEhrd1xj0FVbp z-mB6%vszVSUQ|sr%HQ}!|0(3ZHblA`DG8V-{>k`73{?M**J~I&; z;Y{W^Tf-`QB~EVjZVe0B{~k*UXL`IG>Zv+P3vqSuL&ht)0q5Rm4sZT&( zr?(_AZz^R{P|Mb@BsSHUSBfGJBz;UAqf4b;>i<#Yivr_H;^d*@*VOH$crz%=rP{c4ZZ$ zicswPS4tca-IHSm-qvOnoEp~$M@!Bd6-WM|^yQdQ{muJ-?Ea^q1{sLeHk@f_f0#v+ zI-w!=(Afjdc`C~v#(da+H+7iqf@tn>CUE(!$HL_9^IZqlGxoU6*v9;iW(;xk?N_#8&JLWvxLnDb%lkb+|F-xr8g+ey>S^($ z4>NC;>~P_4inK+kG|Znz8^tK|c#B4EnExrRS@9*>q>pc-qktxFzJxf_xUy{g+c0kE zq&stMhOB*|>U{Cv>6iPs{)eQxX5U4vct;%|n2@TNU+`BtDHu+hKrWZxt6B_J2eAGh z>4vOnyNFjZj*2ZyajgjB5jW64rkuqSVD1l)~~qJ-?Y^*Xf`2ZH3d0j3vDBM1sSe*Iw5UiUj?*f(`@6S1q2#DA;k&___`v&DW7y58jNR5ONx5Z zA!GcK6ghL!_C_hNu#;y+=ZMmix&`45)ewavFsYMeMdOIvld1)A35BOa&zRnmq6OJ9 z@NMg3vHjWV51vEPow z5`qj4wC-FR*Zeq4T@S~07ldGfF<(6X%ZN(ue1nbQbw)a6IHxf`Wszfi|d%g8rBPtl*$O*QU&TFXS)SV$h z@%^5UhG}z`Ki7@pbI73#%=^NK15OX{=g7X2L;fZSX&zS3O|3uosP+~+Yxb-~5!MZA zY4j%r_(cM+U1oElN1uhR1uk;vZ7JMMN{T>p42LOh<81TOxAW{`t2Xi$hTaP)JZ9o& z*w9vuPGG$I9)Fv+SAU?6ZL1n1v}cR#f5w6=Ed&U5;mV()CvTS{_L4sXZTXC_u(4E8wsrnm8GMwx-mU(&abe(sPM!k4ok=;=W;AA?!Pe)p-ZFH{4slFIMbi{y{WFUrDuxAmk>gVCeUi zU12LqT4vJ1RKsvgJao%~foVU!h4RwAGkT;R^;DVoJ>#)(yeGA+Fz&t^_na-#++g$@ z1{1lhudVc^atyz$5`!~pKRvEldh#asi4&9H9dSvAk1m z{cH8y*Z5QAf%l9X!tp0Bw7lA4U1{q-6;2*D@QfFZ2T~i-Dak%j zGoS~KMN{TY$J+G`KXs}bjp3f5BX_*!e1wH2-l6RDd?manno~s#NI%jPMsAyCs93i1cFY<6;mgIdB@%tOGtbCU5jWA=pF$=orF##4HWV(;Bb7h zMf3v(_zw+S=!P@Yf)oZsgmDLYz5nDzCfh13(TbIC7^2G2Rg}bIoKII;lVix9ZRn8m z3+(xZ?9R>(BwKZ4E+XYu&4%i12LF2YQSzwq7AVr>D$<;eys*R#x&)+qU<~H3pdY=^ zMsqJQ;j-5-tA1PivOdV(SZD^(J;=bA|5K323P~l&9`bc3qSF&fqy!LM9S_btS?GRb zmwT^?&{}1N^UTOAJF9dT4hzbE=h~Hl%y>N(#?C|>4ch8BT|qtKIC}1h(Sl`&SP?Yc zvAcqOM4ybf(iMceYk!23jJkw+7zpn~UlBjTyCC&J5=G4l9PPB@ME5~#LwN@2dmOAG z5sYfgtBw4)Q@0X_Fc`n`4XmCo=n*4o+8co)1icQ;N(ERF@lPREYB`l-?z$#HdLG>C zS~_R%vSxFqDZ>LCsxptoB1p3#{9ugByDwk*hDqZd7Z%R1bsqN|_Wd+$9cl`=@Bv)p z>o&^W@p}#S>HaVQ)&oMe8Wj%EEma0sWm6=XvI^pL6q%|SEr|0YE7bnbez%5l;&tM= zBUCL@MvJ6=lZPH^CEBv7k}}ndHpFzpIe9wqFERD%4q3|z@(z_JnBrZT>Glmu@_OQ5 zMtreUnPB~=ZT})B!U6;X@iUptJXV=Zgy|v+KTNA!mo>=N0^8W<2kx3!^P@dvsg#P> zVpQvo;{`KS`_!PGzXc{YVJ)QV=uqD+j=!mtN?~hE&cbxjh26*TuQI0=!vBDm==NoqE07FbU-1Jv zF$gp?YEsE>eJ41kpwf6QO#jX7d9i#zpSh>J`){~<%75tV&OJ(g6chGW}eDW}5ya<^(Q zeuYB&&!#l}KtD^jYp9Gd(a2kMG$;*8@uIX?jOB39IILO;!yNk z67|xx&U8{;`I;Qh#`S*fbr+48Y?O|FO>bUZrV8v%*}hg8`@6~~;r5*)Q=>(%$$`bx zc6|!mqJtv=UExT{9adQ@l_r^!@+{2P2~m6=c9TF^J8-BQAw?}CSTc-F)=tGV0$(qF z=9^TS8o)a}>d#tEH!)ouBlx2)U!Q22S=KN(TqW9f=`k|yw~nspm{zoFyJ%lNkG<-~ z2jBix2p*;s>)^rG0a{b=?{w#B?{A3|Y}_4$cMW(YAv{FpW_Kz9bSjJsE?!?De)xuM znP75nEOLGs`U)3945BI-Zj8)P^7=23I(cGsn5{4hqy2XMY9LS}ACU(1(f)}e{KXx& z!i7N{$Jj}L6BEqT6BTbto}aA9bcgYepw{hfz9@g`@;l;RqafFu8tS9ke{=_XCXKsY zwDi4S9+q5RCkFyW1X5HZMn&_+q6zoTMHOEf?qB0(WL)D)m0jby2?%fA28;QOW(%Z_ z_&NGMzFK`%9#=L=w|=s(+h}*Bbx5b&6vt%1ZkY2i(wSV{mT-M1{z#OSfn>1Xjg?^< zoUW-@Tp}$s#RjX$CEtyv-cJp;(gM6j&nSIiS#}3^-Jiv^P&0bzx`f2(_7S36 zsc6CAT*Z~5x##RH?`ZDajV*(pryyfr z8(L^(C(&2XXg;(p!MiZLwtaVv1rj=>Z}8ml_O9)m8e$fl(X6Yt*R0E}J3Z2)dVUwE z@3R_joqtLPp%DPQkhYJ%n^%Ha_Dc#2FmjV`lSJY)9a&4qrdejHT)hVp9?u$`jzAKo z#G5EFi+s!dyaLB*Zql~Y4cA_72yP14#%LM3OdbyqK-hgl=gQzktyj-#mBh?Zio~y} z_F&rdfmhjqqQlnjhIw-ozg)I+S?5TTE4<;EN(&~=&NsBntF#;DPOzXDBhCw!|BPA% z!^x#;ueWLqzMBw9BiGNN0g?p4nz~yN?NIQPLH^E3-~|-E!6XgYh2Q@*Io$8R0mWWr zOE=+G38U1oA2*zt#-!z=UueU3W2px=$S_Vitev>$l@JSedY0IlzBOxboV)!{x*9>< z+F=+@I#b$|UNPfDXB~?erhAH|8K~d|-awE4LH?+>+K;Ls3^wl;cJJHTcaNAndWCcw zaZgdHtaZ`8b}wnnrHzyrw6Vg_`r;_xu+&f$(=GqXkVai>yGXa7UTFDzCP%aKuDV?L z*&XibJ@XXiOy8a65_zivQI#*-b?I9D^Hz-nW1(Fg2L!yjq$<|9!-tE+#^g879n|`E z;o6?t)Fr5&0gY4p*W82pGj_QA5#PM!!>CAei^5Z{)!QxqebwDkOJ<#WvtL(>_#xk+ zxj@tgvaz7&=X)BYbG;TXXz*!wxPUj?_foJai(qkB|XpPyJ+mD+953

F}woT zIx({Ow~?=c{IbPJ5zvC(7;};$g#;0Fa{7*mQAQ%X=w$qiu85S|NqUrZb+@qZm2{8e z#ITitbb#a$T)aZfiM@b%fD8{t?{GbO>iI|*iyAQ|sIOyfMW(gup3swA7&#MlG;pgE zbH!*y@(ACPtOdyswIXo3lVU}I6S)P|GN`^&$e393;?cR4%3w*+&(Y$ajJ!7jyp;JN zxsy)u+p13y5 zRv%)$M#nwp$-1;D2}vU!Lq9{keeKVQfQ1s=Va$nwg~||QV*H8}Q7TB~DQ-H7R4~_y zxzpoUMCoX~K|ealj459cq@!A+Lg@qC7)!-XsGxjKLJi0Z7zF{%9gD`~bd6ev8t`50 z+FnHtF2xnuB?_bYUqd*>9l+vzyz?acghy=Ku5)WAEN2Po^+&#mq}#IVc7*0hFofU; zzL(eaf+g?1ueo^o>(fWm5o4UPME*nb@FmNcrVGmqT3s-eF~bb1dobe+asx2gyHm81 zh7tk2^O>^DuD|MGO(v33uvJI(iolVuC*loe%OgW1j$o~hl9h+40X>mhFf0)Uj8)M7 z8(D2@|3g;mRiS~P8O)pgq!e|x1Ff}l?$PsXLOZmLY$Q8Gy-q&pc-?;|m+HeBKuqN- z`z5LxzR~X>)c#8v2Ij76!BI=h^V=-&i9P2-2B8--A*5yy9mpDT$*5%vT@pv1oalNc zu=}#<<~ihuV`CjYpv4avsa4(I&YOcP6_U$^C+OSkd2r267gzdh0YB-Rv=yk!2>=kK zeL1v}r)Q_za@&%O+BTDBZ%z^bk<7Y*%yW^=e~v*r5v{$dV*flKloI?~{a*U1DHk5b%JuP-UQD)Q<;Mzz`aL zD1LG#^8PAZn2olcZrwep#baMJA4XEt7?Tb!S9mMgX8N)y9bmqlDHS>p6GaJ`+Ad;H ztrE@+ZG&tV9|iXwSgxtR@zV_nqzXS#s|SF15aENy{M_ZR0U!pn)<^+i0$-p7HcA zPBVIYr;qrqLyZoUROpSMM&E};(tX*BDMp0+H-!#wbi@JAAYZDeIa{u>PZLsss&j11 zxI?eY+yjcEy)d!%1HZQBHHE6f8?>PNc`X@UvywUd*L}>7~emq^G_pOdj7G3vGG=Zu$A)mZP}OQ!B`{h;sNQMR>ht6 z=O5vWzOgMz^ZC#;rBuv#?sndGEvg|pOKmqUtrR*?MPujVA`?wYu6>9mn#$^}W@17< zb>$o$M6q5Fk3-aS)&oRc>!m9`88^jgi*>xsG_?jugym`E)ag-_w)SG&(ckGsaox?| zR!1t`9$t#^JRh(Y8T70EASl^tbyE!hMp-tEW^5nq9c;BF?g+s34n~Fj3f#F5Hv~p? zn#ZeW2u@0mEqhpB!nG7M%}QK`UA>3TyoS%rOn-D2^b_?bM0vlYp19cSP2%;t_+H#U zSbnV!uk}jfS(pL1mk^ar)lpAgtj7|slbdS zP3bOA`6Y3_KqzsRQpA0Ts=;dHmSb=2{j2iZ;mQ_VYoa(CBJ{?`ti91jozY3AQC%W2 zjP1A7#-juSIU14K8u}wd&xVM8`jtPbcb0sW!t%|t^jxB}PD~5sI!*rtcwwt@L8#$5 z>k8oYwZ?EGzWk=F(`x(pm%C-p=>{40@{gAl-+P3C$0(&0`IPXuh&E1cDW478^=H;b zg^dGrK#0R@@55~Ib)aCQPk70t!#T*f!u~vNczu<4#PE$odssD9&Jz9wok}lanN#L# zcH#@YD-C%eYpNf64_6~z@vyA;A{wAe4 z5rlLr1}MyD8`qJC`p_(AMd!=+!1Ic-CmqhU7U(&j~31xb*-<< z4b%-b;1D^#aN{%Zmm9bSLr5rNYO_vemR}{0rfkkTBEX`QXWL>yg@?3>xe$b9GS

8ef8K{ReTQT1j*|N=yGY3`pO&^8cVFIF5q8r(x&+80p#lAF=a`?4g(d=C!;H#LV#ibs2NtX>?Se4o7ML%Dy?bzq#UFV^!Gucrb zr~|TD5iwI;@m(9~K!*-@go4agUO+gGiple-l^sOH-v?+dS3q}VK-gU7h$KQ?**&(SaZng5~u!~WUzH}3OLsy*#M znHrsjUq95wV90I5UigVz{aRlcQgUHZE?BR~(vcKV%{q5husCt_EBv_}5%`1BI)=T# z?=c&Q7Je1aw(U1FSPOrr1I!KR@@w_K6Q+AH6zVCt+r!<@_sEl};JZr0G zYO4qHXqGcMYq3iEn98q^yCWtSH3=+ll{)&r!H2-#oh!))#0Pc9aLety%^Avr-eofWm zG+3{Fu_w34gSBxi1tga3u%?ltVpsHU7EpZdQBOoV`+MnIzw^o{xyKq!!@M$gEnm0k zuMfJRPbU<6fo#d!7yGWdu0*HJO2wjay%O(@CQJTJxiXJ8ZU${hSnW)HbkP`;d6*KS zl~SnX9c+xD{n!sdEXX2TTj@LzTHQkAr6Lc?B>ACP5jI=MkfyYwH~i0cBL0$=1=M#u z3;;aQhma0~;2qa1$VV6#gg$7Z=+$pNpZcS=p`E@F)qdx5MWv0>hA!8MYj=;wiagk< zWQ=-2_Te?6HuhA&+e+e6WXS+v8l5rn%&$aE*=W;J8Hf1{@Xv{(AL5_#MvR(F0FyBS zi4!vJQ4pzb^9C|~63d)?Ee;FP;q{A9Yb&AM;I}6e=Mv%6G9?lvk z(FO#06q2Bbj-C~KC#D80eVlRxe`J63U+-%af>50U;(t|^QQ-mJoxUr6zF9DYWE^Ug znMT+nPeNfdYIG$i@08k#%@LL-u`qfjI!AziAW5g(ip9}mPofqyLv+Ug{!Xmd-j&w4 zQ}ZiSoR}?`OUQ@8xE-M@FOIk_P<$SXB4-898sl6b`Cx29C8va+pcn;Kbox{x_#mHj zzCHSV03$l_D+zB9{7?ovfR#u$SZ}@3h|t<^4O$X3F=jgaDBhsN2MuRast2$cKjhr* zJ3UhlPf)!(IE*U{_l%0SE-_)R?;S*DX?|-QGle9V@L=SXr?2uzP_3!atg4L=8sOi>(hZg?gGh2A6QC37?yq-DYoH!E*E5fix>#Oe z72aQZ9}Kf~L#ZI_WRX0Q#k(Gccosa(WTF|3kFgr)&~ zSV`GjOZnzm06&&@Ig*b!VpeI9MFqJcgIt4mnWrky;#_|pf%ry;mHRXuAhoc9Xr?7z zW&w&4LC+7?Z$BiCUY;ibwi+@mmmfwncK#~p$FJT9D?W)K=w3tlXDUj~Kodg%lb<45 zLNm_9S+xmTy7WR{qW@Hnv1%XWnfCM-4O_L(@l1Q%qM##Bk!bJs&?lUm{Vf^E*T@Lv zUP;Ea=kd;X0}YQX^glev*d$*=B9yx%i+(q(Dmr52*A~Q}RZ)!9R zwUF!Q!jt1V%#U!L*cxyaida_5YE7}#PdU|3CAp%XpL+Gm@%#yfbN zy77N64|BMFyrfIU3=#}Sk6L|`>p8|q{qldG278V@rGEJd9eef7e~;Fn;OYjUvvme1 zuDp>u%BJ%i!xy$D#3k`8zF>Fff52%VdjoNR@>=)j6#E{q>j6aEl;9CrWEn z-QbsF#O49+*&^Q&GhVarxFQ<7;UA+qL+T4Aci~2jT~Ji zNe{Ch96|po$E-qfJz#9m-IjG=3(#BM^L;LFO&-E&VQnpo-m&lFHu7gnu^RA zt?4CHP7SIx-K(wn3FG#Z>!4P*MUU51w08VKNQ=vt(H%OV zcmA&ryuV!k1eF4j=}7bW2(sL!web69$1lZv49=E)3_6`S-#VT}q2y|hA~S$R$s0Z&Tc)JE>nStN;BY{_waI3ChaT$h%%XiA zp~p^wcPlhd=)p|T9c=mQTVBz~DPEXfrB6gOKT)$t#7K^rJv-BWBtrZ)=HuUJ9lppf zsKO>}$IYL;)On;pEEV^0+}z})4(b1xYMy_O`bWKM1Z~SWbWJByZfO*mpyRTM@L{>W z7WDTNO{Ihen&Ipb*@Mrws~$D62K^T`_y0j=K>RjIa?AqHbyn6@2gN}16FZAU5>d|J zfWx<1q`=?J6W!9mJ+mgulrN*@LoU7CqZl+^)0kt~y*zrQM&l zGpwth%$0WYzB_b{LNM!STwy+&f*60n`8uwdGydGV<`FqtkQB@7T%zo8*)eMtefakN zc1^-|4Zf@HGeLVg!7|be;x~noV>Wc#HJpNMk&2kPKfe7dWqDml)UfnJ&mapLwOz~U z#TH~3kv;wG7cHA?e(fk-{c+sRLE6< ztvBl*o*5wCq21w>|M{l!(uC0PtAN{7jHh^$zb56e*N3)|E~ya|6}?; zJvje$;D1FpuiqR8;MM4&lo7`|rYRtL1U7f7Ury;fwBM9Sj{S#E0aA@FqHY;NnPz|{ z%j*)NY{=s=0IGHE|1+7+x)#4i7eluUrA#wOljTiGLN-Kp4DjETiE<&~;{XfmTJ9QM zGTkz)GR+W87V(mVuaLUjUwCl#Sl61?=yK_nk(OyjYO+X`{L$w@{+As;zZ>={Z2wy( zUnag?|Ky78gCFMC<+t1Q_-A?;S7j)-nn8XnZ`#WUMJ(C}b0bXJ*|?Jdn2{qv+sXcp6e1ag8fWC|50$R_hGl6VtB4(tMpnu zm2w}LX`!8~KX7=za9^!@mvEN=`q)0!u33BLcuu3*hl+-ZR?Hr_6Bw#K-SHw&S|g@| zAdo?$qNB7U3FKjHVjM=Euir+pKhD0n5Kv5B><(=|FRX_ecrguTG)Xv4ZdBQe=+##) zpt*0ec~Q)j0S`Fu`ZbHaxEYrW^v&FQTyo$R-@hVMrFb69DPZJBmU+z`*T zgcfC6RT51qC;AToz_yf)H&$7}UQuz&Z|(gX`wi!fT^MZ90TXlH+D)T_C)kxp&2`iM z6VY*x4OQ-))3sMcA^m6dPsoqP zirH0rA(}|m5B5x3;2mpzx>4Q4z+UZR(gp0g>b~gQqvjv|W?=?=g^J-|L?Ht!e^33x zQs)FGQXQ);!xN%nW{nKjdZ8WSdAB`I;-6UOTzVP4b(+&*_6$yrF4sJX;BXt3g^C~7 zwl2GS*TF+#$kk_YLt(-&{H^-K^o{x}g3YY$!r863)EBt7f)#Uen~*-@9YpPKs=gpU z@tDa)m;^LXaC)&b-z)y%C@}ApHMbeYOx=$~*iICKQMT@J_fMc{u+VQ^Z*J=*=c{zj zo8{(G?c2pDP1>7bJ__nFu)S;)x+ZzuTkYGRwvm5UPM4u54;3XfI%+O1GWu z$Ce6#Ev$NI6bP^^qBh@>_FLYY>;~S_y}uwYF|gN5uh~jaeGZfnVy1^jP{|o8MENn< zdV>bkM3QQcOaz2z`CK0D8mROL2!NUn)OGqe+6~z*@{>haI?>KKg7awvY-0siV{#|V zQ&1en3kR=qy*?e#pSxAuv};UHi&dqUE9JTqob8|Ad3{lYyqNhiuv9O%pIOMU6{!ZZ z6R-@XY}PDoYpP9rM^-1WwWJBb*+_NyWZTW%e@Sk4VO!k(R#wGRBHHoGC7p4mA^R?7 z<&V%0X`j^`lVo)LWuGaW%Aqn!I5UQ_P*yReVt<3=)RbGccc&1euV zJ!!pfy&vYWwQ1L=treeNCIHXF0nuro!YaQCKbhrZ$AH)8V*QiG$^Jv(<_+fr?=at`1pDTay$w!p?WdNgY+GX+IpCbJDk$j&%-9i>b92ww71VNbR&X^aYHDJ4H~8A*t>>i& zT3UMR_!YWlu*Ih8+luEX0gJJr`k{+`lyTVn8vD#(@4A_MuesNwm3*UloL@2n+B^+U zCO`E42Cr$Fgois8Ts0pWEQdk`joKWGn`Z03X=NXr*q_*I!mpWq^d?=G`Ih})pDQNL zimZl7d9n@p)`rla3f170{3V{|WP?ec>gHKBHcs!fF7-BnZ1)P3t3$MRg(<+SHTqvjwq`9wg`m)UwSVBp*mB+yr5eA3||7cCmil&#CvQ#{3- z@N%x`rK(NIghtMQF{qF`<%>G8ns37JWPmQ9kX%-TZ1TrzA}4GhwkrFyF?5K{jrifI z5S9vC6kd`SyjHU>A`?b=L#{C2-S(*ZTY=EZtBZOg9_G;}RL{x)t@vp;=#Y(QEiH`qqMO{u6k8OGmZcpW#;eY` z9HgK<)2+DK>~kHzTu*b&*(2&R6PooNfrYC_7Ri(j5&R`UTZUDWTe~MkyfVSlZi99+ z7o3dp09H%NQ=VZKjhy!h?`uI;hQZi$CgS|XSDVAys>t(SlFej5U+sVY3|Q&myRWD& z8}qmi&!4-dYpaTb(?U$ShLd$G9p)v(!6EYC5HC|~YH&!h?$nrmX(!v%m}YGuQ9b?J zop-Vs>iiE^HfUHGWrd<~YrPDA!ypRsh;G%lA=tbci^0B1W`NQI z3qa0+86f|_iW`C~Uo6G3=6S7$+KT~-9iQK}Z_k+7?(#Cq<=DNAyaPpXb&zIHL?NKkwZ?NFI9X(Y9W;Z0N8Q!nQXWV9m`?b zFtT-Xl;wP_`4BRJe=~u$al3VNTo!2zBUHhyX&u)E_LvHKh&nEHwrUUmyh3j-^DoD4Xps@ga?^}L7b62@* zlCbJE1S8d>_7EwTpZ-y9_3o$6boI?ujxCx!jE!XK@M;DI2EOn0E)p6wzm7o8WXfb> z9(SqVa@bT8QPZf}q8=4tp640niGq2Hz~_u=V-N9%PSN)3C7+yFcYHFrxrmCSYpO(xA@{^xWt{Wh!=CI5HKnKq^K#6S!Z3HPwM+(Lc z_4{ji8vOB^i^_8V@ny?7a~_+x;k8>yEKCk^8!`9k6q}yd)PZj>MJt&|AGIzuVW@V44jK(+-KbqHMcF*3NQLV4YgTcW(rc=1 z4u>UU58jzZK2r)I)f6(d>KXt8lRdt0^vx)ROxAnNF6&gH>4>YR3)A3RWte7syHVd| zg-i-gUkRP=mQkcE+bw=O7b^8mUX~-Iwpw%)DN-#BE$d4Wv+*tVnbO~-AhO-i8%(LF z^s}U{`UV2m4(Jx9YWHY{0W9n*WfN@d>*~0cE%r5v@oW3=YDqw>Ip<}dul{NNNhcQ` z*Kkn5op1LsIPeg;GEaX=YyaIM|B{$y`Rn^wu~jy`Hz8vSRCH}=(Ni~gM5NDx3Q z0{E8RoV6CoE>iMjl)1C!NY8SGWj=HMc{{?y*p4S`gz1tvtKl4+ko9fHb2P%z$Hiv#n zjbw)RehL?!?@WX2B_bCA=YsS!?FA|cFM!v!qn!?;d!7SwfU3wv3^FY8J&LpXORte2&-)Jot00S^n0OuDozoGp)tQnLV1zPm0y_lW>~$fa(7!px83 ze#8+U8#-=E{*7s!#tgi8qyi4TG+mpxem&=2bI+4lKYwZ9b$*sRLH~Aw zBKGh`)j2tejiF9gX1J_qR`o~lR{VyIjf^DTY5{pYIEKBU2h z5ntKpfsEyn@;B21@3&+{mz@2Wrn+o5%u0NT#;>7gc8!yq@rFuM(OOp7bt7*(Epk@a zH5#{TDU^NrbIZ^o-jYSUO(`9Dq5&)@`cf^Ckj@4&7Y3Pw1hwM7qo_RJ%9WtjBFTP} zsX>w>Y6+5)@Q^27JjNZzn+}g|pr!&#EUw(*@jB;je@c^-UU)9JIz@WjDq9~G)F4jS zozX_&!(YVIhTMh>W#^fS)bL2lS_2n`_hr&kU;7E4!=cZ7+}??>8(zIXo~T&MXPK10 zIeo^9d2d(Tn0T9zb=b|oL6UV7cd?$;!%%^j)uQQhB6!^2vl=JY%}`N~wh}kk&ESZi zr5~syDks@Pp*6QO^QpcStTKAuE9KjA94w_ak4w?_Gqjy+!VcFiJscf}Vr#Z-I@$W# za1A&QC-<-Rt#Gd0_m0}NTee*Y@-VPlkR4u>9o|?mu}^St>Ny;$)2DBTelssF-#+&o z-**__r*`#rtns3OB;8(fz1Q&P4Y)-Ifs3|(fDte;U!~>R+0(q3TVj}7;+R_^w0F$e zJ%eq%WV8~`YW`e@5?GUPcLP;cU_~tMCjd?Vu2^` z$NrLow_9mBrvwsP4B;ac41!`Zu71Abm)PCJ*eZkUDuWK-cXF%~Pa+~oBJ7?D3Oqn+ zuPSiHBAsy^MddpTJW{B#H#*}OPmrO;2b_P zN&DWgxyY`EW!{dbFs&8UURniNkD!dFW8?@BNV-fB45!ehR<~J?T;&K*eA+ylcXuq2 zg++I_M&+UR#5YVw@%Dmia*gWGQj_tK`OWG-U)nk6QXvPqX}bD0k>qDgR zSyaGuD$XquJzV%i4DZwz^jCkH+h{4|8PLfI+f9atrpd&ov9f&)>#ixIP35IcRlvWF zCb)JF^W}eXeIDjJo%D)Na&;!48%!N$hK%3mMH_9;YkoU4Y;0Md$7& zx0lKYwyo+eaoFkMqBC@pghN)wRsmJ9} zQ8VmUrkvrXOps$A@-I2&@v@sOMvE;@n3>C_$tU`~P}8*}aBQsCPnih)rF`K_VO6ny z5%!ishH&oPRib>@+eQ43O}=qH)73o(DlhZJ`s43t)vn^?!&DY0vdm@uzcAg(6r3@n zv?;VH4DCOv`zle1ov+m&pVfIr(rSLG&0^M%RxU4cZSUl{PV?-TIB zV@fwrOFIyi#K<}DA71fH(<}Mm1W*|MLP&74Ab{b{SIN!DHrVr z!ekOll&bW7vBDgqbdT+M8dqP&m55jAQ+?TherBBx(gd8g#24A9Ibih1^Fey6kJrZQ>}vY-@=|B%a##LLPnEsctG zLpIrViGxGdXF>WAn|CB)7b?5J3jLh=m@`bpy`#KLc0HOY4txUkXW`niEu@pDxI&}# z8Xj$cyXEKe-+)@vZMIib7Vlf=(Gl&F?A!e^J~=T_D+|DP-J!dCo`uXkVjae1Dri8l zQ)S4zQ0Bqxb)kKs$QfVQBJ}Zqwp6;R<+82Y`P}nJI}!K!BC3dYK4x%*_-Q*PhDGi$ zFHjCpn-)i~yJg)PK5iR*U2xv2Uuf9&)zYqa$%C|HGY3E!Dk8h;cKg9F2&s~+S>=kN zybSuLGDdVj=b-ZN6msQXC91V$Mnpp}dk(SPXmeIJdUQSP>b&8#x5I6>i&*Dd<~TmO z!vXs-^KBVM=iWy9F=sAaYtc+}we(!1MRKI+2g{4&HMVoz4c*11gK=Qpa@pY|E;J2X z%_Utx>%AA}7l_{Jcdh6+d_Dk5^qNT=wXXwR8+`Z??3GDX=CbcO*VZoMOA`tkgcP^xS5qwr#3YbL8aIWJ}nt2Ek@jO*-;vQCz{9=*<%3#JYXngExN)4uTp! z-C=t*m*Hx$+{|89z40}*){WN|{%X*BV`O`L;xcNY!xpd3$SKmOhJ;Mm`}hd0KlMql{HI%_`VNRv3y@5@}+C`#e+c0%sYKd*V{ZmRa$P>LpN>>HQJEh|6)`!k5IL4zs#I_5tJ3a|6=gF>a3JdaPsiBwX6F6VpfBg8r4GeqKi5MJn0~Nz|DWxu&Ajy zsUfM@@E~jP8DzS3pj8&;;ppV3j=Ye6z|H%;b+%O!+u6~>QLAgQc~OP;n{S8j>nI=% zkVf^r!~PVMHfDZJC0FED*{u5$yB6jT%xz?Sm{j9a{@LtMy(`ehMX!9cJDhb4K!*atinN;Z+$Z7kin%!i|Aapi^vpIrEYTxptxTtD* zq%pK#wVm@4Vn{EypNq3v6dYViWBOQ`B7r&aN}0Kr6U)@D%gj?7PHsqK)lJG}cdVl4 ztg3gcs+TyaNm;8A(Bro!k63=}GoBO0I|5>+`qju&U0E|~_?cdc%IP}zLkc@lyY>Dn|718m|_!8RleZ`I(F0JgTqu4 z*4ewbp=M+oLo5qKpiFN}&575gd4bw8BH%AxrgX4wS!h@SZFoX=L;`I@LPL)%ez&YV z7+;q_>3s{s$me&{{ ze4)8PBnM?ooFto{EsRz}Pd4pwmwC?&T?-}BC7u`Y7Tlx#=JHkWr^EsD=hiD#k#zotj_2F*V6 zeO>G@tfTIWL~iSNCYyj14zU@$5G7BHPVPz#Ye%X7%N?Qkl^VIMf4E#PD($<9KYlHT z>s@IsOw_MBw{QAkv%H_b0eQ^6yxvYmYu?)HW=*wuMhKPl+sxWWi7mP?@`K zqpm3uf{FYF6Maf6gS}&~y%X5#Jkw{4(BVKh5Hi#Htu@H3>mXsTeZU|)wHb5q<6iX= zRcC=ci`_>e2g_DU7P}}S2MgacZwfwuo{23S2d)U2XdP^otL=R5QB4P3%2i!#Z?M@v zXg%-+m3g;&i|y9s^EuOWtKJ^SdeB|ZoI~L=KOdIZ+i*6it=qp6F;t2KtR27iu{-v@ z0fjNFU{tnd6=sE>V!_gjOhvkcyR>Nz$VRRnjXr|BwOc&wKV9dd*(V#mF&|~hb4uNM zxq1F6n2^l*^Ya%ts}|jFM97?3Rz{Dr-tD&jxPMhP?Eul(Z_KUP8kq>09}n3A;oN156$#47IdHJeaVmn?8Jocf!(C5V&!Wq&82XY`8 z73Fm#1#)PZKHOgU8jk5ha-mqO%)V-Dvvb)|T;59ErkBl~Aw55j87uNLDCN1Y*q9%;z8cn@k5<3nz|U<9D!*3t z2chpqBq!Pkoe!FOgZ)Bb^T|u&JTPp3CX&8}P(6{iIh*&4v1eP-d$n(k40qdYymW_~ zs#`5g@UxN2YbC2zky@*mx*e5ktxb~tg&mAB z+-;V#k0Vz^vgJ$@qt3;4P{-x!q;{#=5!1uvip^!$I{C5bK@O5_Y3oz?M1j&>ZN<;g z8;uxMu>p=+FD?xat67!JDHEY{!GTVy42x6UQuM2F&B%_|L+>STle3KLTH+@DE$kP$q-5NcZO8CaAE8Z``#QNqxmlXg&jT8(I`Cl<;pD-ac*A5>uAS z!}=_Az60zN)jODhCkUMzY()Fgz^K%O!ctl%Xb4{1a^>cUS>~PfMJm(Dhe%9D(dJOI z_N(K9dBLI`%$)tmxJL3q@{U^Cb z0mm^uxscIn&q+|hzL*)1_BZKAIy7Rh*s?ag+?~r?7qz)+E3M274hNd1`q}-Y^H0X)y@BM6JFkOC^gy<3`P0Gs9q;fJ+YRk~PWCwlk_fiD~ zVG?_dty^3})YFm9YITXnG~48_$7G)(&H~RL&=(^N{Q^T$V zj6z7iE%CrfR#3)AsV)<$J6#+{Z!X0QlB6^q3@ealld|5J>nhh0BBYC_rIwhssF1A# zU&?HbNgeKb=2iFzB60VJ=cPx-zz+RRk&q(YgAp$|m3bxWzv3sFn=^zY;JW z{Qhzdi0{jbMX1UI%_gj4=YUa4>HMff3Gud4vZ0^ggf^e3fe)OLpR~Q@<1I4fD!{m> zim~$X7pb3qrvkdcgr|zf^6_Aj(~)0L2~HP_I53Ix?_Yq}i^@;GZ(cSv1#%k-*>f}d zr808W3fW*OV#e*suwnj&T+Zo&vgShQMboF>CAi%et=#dVDW3=fUk;lhOjyXPd1rEF zQL(H>Sk9|CSe(i!I*@qE@WwK6`JWe~xJ)TV9DoVVX+~pk_s#oPOHvo-x5Dy^ZMXO- zCZj^W;so#)IJKXkF}ybhO17##9W12a?If#!btLzE_#~7_`6&9caHBZ);{M_+;ON<~ zF~L8FcKSGh(oY05y)g6n&Rbu>L^b>3a!1}ol@EUKJE1Fk+hTTA?R0FcpRYL5@rb@_ ziLDFt{o>UnS_iS0&Lx&F$xTS>8t$x~cTl>5s#-j_F0!y{*dlSPPyDT)*iLsz%u`>^ zdDv@Mb}P8Uq?~ET<|I}RZADe}z@@YF3U~84*if0ytbCT(_D-%WJMee>Mpa$D-eW@7 zc|c-{!NuW8UB~!d|Nf1*nC_a?naPO6ODba#PBFx7jEQW)uXkwy$KSSd#^!=K{qy#+ zJ4LMaYBqB2O!j2PTdo592D_i=wu3O?q<7yR-7rTKZXFi_;P%tF6ce_Ze+%z$3DMlE z&kZ!Qvu=8iL}spsS6F$4CI-VV6TGAR@2<_4#gbBf9-RxRijGy?cGGIi)tBpcpC5&r zfzF=FpDk1n*B(J{Y;Q5V5`Ez*9JMq zU94XtZc?$mdDALM(g^WCxNUge%UP#Be#HPSzCh63D(s372Y@oCI3~`o$d?t@)v1pK zmvcQoW1$R0Y3IE{zx3o$$zqs51Qd7aM2kEMzY%^T5-c42@*qtuoFB2HLIufC8uj3- zT^8y8dhHGKPVo+)m|upislJt7-N}$kbZb0j-B{}??Xu~zep2<>cuhW_)g+eEIkA3x zoz-bozhuvwL8CmwU64qnQSgDGFp-Liiu_DHN)Adzr9s3X4Sf0S#72AsFla={F-X6Z zYk*&T1`?^10X9(|6P}k~6&vVAlDU;B$JbL2>)|t=*iQeURHkZ7Y6SFIGVmilaV)^T({@R_2kD1=hcLe() z`zGaBWhR>4d7?#6S$8dW*Za8pVkN3&CR#Zf&+2PMN3-;3>iCi6)9DI0I$Ab$p)CqC zg_R5Ic@C57We&4f^Sm~WGa@VqJpah!gbzomF+!Tb?X_|D4|wJlR|#TV**5i|K2|M# zMqI+#_Vr#xmGrA(`OLHbWzg(I_3NBQW1-IS2ZO0BJN=!*i z`G{tw@@lF`eBXiDJa3{F@P!D~U5;u3v=0JqRD7dtF?=-2)2lRAo-QDh2e;{UhHqBS zvEleiugTPWUi+OYzefKaKTi#C>~xauXgPD#R${mJY93@Ew+D4<`>`gz>s=jpcnMOZhK+3JuvAW z*uW&&<>vIaS1BG$Ee(QBHZhyiL_LK(frnebrs@9&WrQRx=o~l~Y1rpN*Zqo(uf86jNYkCRo(mL7eJJ}OC*{l4= zF9PrXmhfyY-UXR|4l>{Ft!3z~J>6V9`e$e!1))#wWJA)@K;OcB7nU`q}lF+fM? z5H41G*O+wn`tt-n?qgh)^DS1dn|6YMKReyO4mHC6xl#Ye|5NgT zpPl7D^~LQ)_}7Gx!%Jl+V3xzXVJASy5mlrj|1a<>Qt^2UasCAjnqB+=Dm}n12k2y~ z?qqt=E=Q#;5~+LqDd>&s_ct?JV}!#Ytvw-^$haOt_G%*9GLfd;eKkPZ8j~-J)VPb) z?2Fa>^RiRbZon_OhBa!Jn>~5DOf+Vdi4lz&RPzdvFG>()^#4bHQQkc989z%K&j4R1H^hLZHy-#dePhQ%*7^gN{q2IggpZU*7JzmUJn-l+Gw83%IBNiIG~fZrazd+2bAjW+v!y`up|t_jZl%)f&O28o~K( zNF;NWnT`klwr^$U-a*RVlgy26mVA37YdP31uRTh2XP?{^ zj_%!Fm(}Tp+T%#RMg=EHKPme+5G$SWK$HvOydn90Y2ioVm-xDmsMZfT*NW@$NlryK zoj>isu=euyZ7;U1qi@!p6+Twi+)K8J&F#vebPYF{5hxpYhAQ1Ar?KzI;GltPXPE?7 zF^RnIKJ6oIVrwFC{nefTVXsgh->#1f2T>e1SQfHqChU4N(V@)JkFWHyg9onr*D2gP zD(}^R2N`>SsX$w@Q-(la;7fnOP{n$R0q=AuJ)Tc5W$PE($<*~5CCtc|hG~7N&lxv!AX-BIwneo5!toYCt#>8~{Xdpt?TA^M2hZH^1@~+%h1Shi1B$*>!hv|>V z`N!j%xZH1#Mo=E!4Ypac+`*h2MwVv%4!`K)uF$07Y}nVyH@I=9-*iGtn~7|V+yV}eylZl z_m@Y->&_P;%xl{QoX44^Rf5qqqiQ%aoib+S?;;Z!ZyQ5(gMc{1as@RRz<2#HI%A>J ziOAM@fbT+#^JF*4lNn!Pq;Rw~M zwV-F|j_S4kgFBYfdSklmxkIF!NG~NUTRJ=PX_YB|86mBEy+iITJ`u@>LR=)VNH6(- z`D`{X@wSu*x;i8Jindazw`H=krLw|b#V@SI6RpL4ttqZ+lBW{xzf$T(g#C^BhfF;d zRXz4~E%^0m#QP}}zw7nyH+|oK^#PAAq`+ybhuA^nG#o*%j60FDJMgnRvS-EF!e|=R zMw|+0_vP>K$5=iYo!EnJs!%n!TtCv3rd4Az-;|VX;l3nNXx>bjhIJC%6wXr5^->qA zI=i1pBY9=K?obx#P=52jOx>aU0^AN|t``W)iwKLnc@Pw_ofY4|5CA@bfKL*@CuiVO zC-yB0_HDS@u_*9~1NdazAb}1I_z3Mrf_9TayNRIzJX8U1r~;78{0YpSZ2KR)`yY7w z9~Al@n9cl&&HVAq{4?yOqcAuE@XVen{zszu&qD0|hRpzKCN+92K3Xj?Y7(8=jmZ(f zV)i81|De+Upx&XAAhSb0;KO6np@ZA&!vk=7#Yg#ig8FqV*ntMv zfd_ya({Jqp zP0D?h+!P;d_ZPhiIO`zQT`m5?vz3znvQcEoN|<`@i{BzUuW%h610!&a7r15_(N+#{ zPx-gz*-EK@9sdQB9&}4~_E2^<>uo}c1mZvLAQg8Tdl?&A1Q_XT-t7)y*;2+UbsMiQC&q z+S^F|$CCDheP5fuGz?kT>6_K@u<(LCh-KPQ^4FrKzDe5?0__Q9?U&GME!p~$U%f#0 zExDN@o7o7vnIf8*qLA5$u$khUJOzS01*AL$;yeYKJOzC9LX3Z5`63hBW5kwlMtf3H z)d=xKkhw;Xl>fG5ZBgov*GgdW3lSY-jJw(n+``WR9atQHZGdJ1DIFOp`-nTV9 zDp(|TtlGi=`)hbb5F{ckA|WD2E<`R~E=(?4P6SFz^%#Nvi8JJv6IH(~!5~hWc!<~C z>qwcmI5F>BBjV^Kbmc<4Zu(rP$|EXhrX?+Kp_M=nY)Sw|qz_?WzoH})VC&WUemX#e zBPI5+bc^^7jub6B6(iNB+-4kS-1j(<0C~V~9Lm%5?0&{OQQ*tF572@h3INLB63SXo zK^cHWxM|WBtk7E^K7g_|%pVCl2b>2iiHF>v-#Gw1aF(Pj!~k0Ze`B!)R6@Kky>V#% zMy3=VQ%uVj0U;4#5zvUNh?EGqPZFOhb*Y#E$!O&vjgrwd@{5cJY>$M+=O2@dB)BT5 z#i1U5f}G@4kF={73@*R=30KXth7vcO)lCBTM63;JJ|CXvm0}A&?d<{ z)}^l&{a~}^H)@E;%sD8?x&u1)8;EPIz>z<%%erq-8JE#Vf z3Mv4BK^>rYP#Gu;)C9@~1%hfpX`n(-45$;74~ho0gHk}%x8HATZcA=MTE~3neb;@b zRxQNwb=$_aN(sBs^g64`#(88r za=U;7iUYNScL!e&_z!>w9}e6Om=6pOd=ID&G!9S?Y!3tvkPoa5cn?$#$PWAuC=UP! z&Ib$!ga-n4;f*tcOWeHqW8cn~fd+laO}qB)O)>^1EB~yRuCTAjt$bYZTKTl1xq`l8 zzaqTydc|yob46i=XvKR)W(9x6V}*6ac;(f~mlgGu_XZh<6^9*%d6gqoH3tZ*_L-w* zS%kdLV0QDuN(SN)@#atp@$)brVSb2iL#;!uIXs&jzw5}Sj@b78wweKx^I7HDhgMRcOs;^?ogURd#h~t$5XX6}C!xq=E&T@&c2!4;=tR-m5MroX>)Y zMEpeF{LdE#5p&^fkp$t-B3#1tBIm+r!qFll!b~D|!UrP6A_l@MBJILHA}GS)BC;ZM z!VcN>+2`5O*{s!l<>%?0D%Bgrr?j1fj_U@;4rf>Am=~C*nAeaq$fe4O%9YCb_{I1s zuMdHDidTw{4rsyKpd+Khpi`)$z4N{UrL%I~d_7@(X5Hf$>6nIm`}6IEX!*n;+MQWf zBHKavCC|;>&D}lnZP=a6jm-VvE$v;=P0_v8?cUwqJ^pR-o%W6P{roNO4ex!^t;gNf z&DA~TE#wAruW~znGkz=Ro8>=VeMzBP7x*58s zyDh%6zOlZC-4fgo+^5{?+%4QJ-1FTv-!$KQ-d^8f-C*6v-l^WKJXk-%9tj?eUP+4+ zu%l$Y3ZTG|L*@+h{UJK};V;3*j~{V9l6}PcNc@uJha?q0l`s|eD<(5K^Lu8j3e*aW zhPS*(O~@W^Jy5QYFp>4&485j%Q~c&I5G_zqg0=+pWf8m|LLbowgGx<#b&2iYUA@1; z!bHWyfV_iXLeNyuRo<&$jiZiZjAOB)vSL)dtHP{8`}Xb|<~Ot>^rQDjSY)VV@5!*T zQM2D?qj|g)k}{OT5H-7r-))3!)z^$h7*0V&bt{f%bPE%K|3N7$ax_x-_U z=4~5c&6^9gu zTZh8JVBrLzDPcMxI^heUd?9?{&7q!Q*CE&8SfQ~YvEizr6Co3!LVZ~P*1X7%)K?LF zR5CbFw@(D6(cCh3GRQz=*)VAtnL*&7EUk2rj1|yIc261~h%cKgtt~SToR{U5X#zIM zdPrZ%U;;5^Au=k!Wh!fG7&QU4k-D@d0gr5!dH^?$vJBUhZ-eOaheHC=kEA%HWTbec z#97!`Bw6@bgju)_5LPg2Bx`I{R8>q9kWac<#uMl%do7J6V~{_TN0(ome>jCUrN}{B z6a_b*PZh!k515te@@f;?MO;Q+#$rTa#Kc6zKw_em!OD@!v13tVF=MeTQ7kc)5tWe2 zXom;~h(q)t_%QM?mNbeqk~B6eDl0N8+Pz=@}7dmMEfLmoj6A&<$4Xdajt zoETyoY{!WTVf~`QkNX7t1XZ%Yxdr;=F-);>uycIk5awXy;N_s?5a3|p;Nqa0%G6EO zjn~cAP14QyDsQh~uZ)mGs2~(clp1IuG%B6GLX)gH3ri{PPeS^Ay>`6+WUHX`%^Dkq-9vpkv7D{s~xRWz$C zbv?fP>5w*b(=v3@8taR1AW;lJ+iChIKwo?SP;ksbVe-mNydJX!kDs*rP|}<6Y!zMe zH3ok=GA$IwyXpURKhPvdCgvgI`|C+$rC0SWWIHg?FcX&GE|T=qp7va^unW0Oy1?q+ zCpL-O(%v*qqE4v((RSND60W$@u@oX0vH`DR0O_;^Q(U(x-@~CO-mE6#MQ;`_RV;>H zIggD>!#h^r7Noopd-K45QeH>24soR^F(ldTh`4y{k#n0XjN4E4Blh0W++;RHCc>SrrVv4mnEwM>a?gI{uU8fz$~yBINUpZZNZC#( z&`o(D&}sQtgOR@RW`?st&Sn|ntI{U9Oy&E!Bwj^Ij$nKR@V9ZlL;JHR(8L+ z`E+uiQN8zd#qX`n1=G<&5APCBMe?rL_Xkfoni=nHCjx}pUpmQi8w#1X(a;f5w0>Q4 z4wogPo(%<-zFRfg&ax$qTQ|hyRBtE4W78s}#K6CBHfX?AeU+67MLWU=&4wb}S(9Yo zs|hk_v0J=b*W<#cr;%Tgbh-qWtO*jJAEp^B5LBL0mFb601SZ{6e&2eWcgeS@!}@jb zpWsP;s3@cX58nM+jPY`iD(~4fyg+-~#^lbibUn%(yRm;tTYSS@R>~Dq?r;ZtGd@0> zM2g5^_zONgca^N-4=8#z5QM#U7$`Gd~oY8w0t~a`0BJ?WfO1wM;7ZjWA@x;rMAY0 zc|S(l;e!L)B`f>=iJNBLQ#98$SKU=Qbr#h9&HXT-; zT`WlcQprQqm%8aWp<~SYScU;p1m0pdJ1CmtJk(j&Vl|vOzA&ScjRdt*;=jj9l)_PY z(n;G3)!+f>I;&!U!hDy=k9co31IxvGLFcv#F{J=inv3t!Vu#TSaWMU1#OJ)gOL}kW zh3~=@fvY(9(0g%pZ7b)hRu3hU;60N_oA;%${nNKwyn4}UWBz(=ALelC__{w+%aVyI zaa`rzB;X)Q_d-1#Ne5&K5*8x4&lnR5tD8dt2&P*v%{d<$(2r9Jzc_qlmbYFx7}Uk` zx_$|mAYuIpt;VGKx;?JTfXE+ZPR(qcSt$en30|dxEtHk zbr2IUu3 zcgfn1l)O&~weXj)1A!}lYe#D_AB>w>9_kowvGXGyU&47q>n9DM7>xQDlBp6_goU$Y zVni5CLc6;}Z!Qm#9=6l!^kg2~e*W_7>8#UqD&+>N$L!M+o5Yb7q4r}r)Mc{+CWaL4 zN@ev{T3-^fd`Ko7KtxIax@i^JB-+WXJwc^7^wBh7q1-i(_H}0n`|dXT47i1J5$wkV z^K8jpeLtzbQ8mVB4fpPm){zk$a!yn(L^mMUOJ4_Al92)LP$oB!3MMFe7zuLTeWx*J zSdk}0A0G49>Z5XXSJH;Lc?>>i>};9FFa%48&`SrRY^TPRDb4k;m#vqrd@SBqnR6P< z7tHq#X84??(>bPDA~=Uyq+h9lrqsFogO^L$Hf4G2LMwchp(v*ZO_&R)_MUMsKS+C$ zQwr&f+%?wp19+6Zmv%AL2PtLKEDVj1^5-g@CfeNSJ4&{lwENJE(2O*wWbkBU$S3v+V7^?YK|P(w{0@3 zt{y)~Mz4J@0ZOxr$!1rN@EDJ)iB*$xtZOXSN^9t<HqB_2_DFtD;2ZHZ*B-$t*Q)F2`6^qh3Fm$5o7Go)NJs3~#C!j|ECgz~M{$jE z^ywVOGuYfP58Tj_DB7NhRqXo}H!b3tu@^;Qw;`cO5fOe*$IQMy`!`o;7i7bxu}fAt|$Y%7(`YS?Z7`*)KP&^y$GiP zwE?xOz&=m>MRkSt>2ZH0xVrb^)bMxCQGY{1ox#W)@0>HytIwfq%r)Cd6Aafi&xH?J zXK(K}hIx1G5K_YnN!F1$7s++Oek~{Ns8_C`szf!hC16Hsq57Juw8sv{B88fIRFhX0 z-6d6O8$ZX@1C&Iv9--c0cQC~HK5Q<9Ut+Bk(6UYxY=!5UviEG`-}ll7R)C^}OcsZd z4kqmvgolh~g{y6L3C93qBOQ9@QF~Y&TCNJ`vg`Q*m7w5jye_Yy@J1_#5LH|A<+lNf zU!JwP)HCL_&pR7=mIa?M9Xgw^0*afeuQ2^fu6`~H-F{h){fcsWjd%57?|4D#Zr?Ix(6@EcE#YP22{bE%{6-Iq*ldN;B zyWM$@MOPUQd3`B|H`TV+wkDh1rGDx@5zmmTnx>@Zsw>OG;~Spk4ZDDe=N~7QLjHb# zMm&6@uiOt09%K%48b}{h-B^t>pIfUG7J7~sc=p3iWZk9Q^Kbav^WAZ86+@d_@od-Z zUnYVmHfuKPL+2}}M9N!QYdmANjMt3ULj~iV6>Xc{BJh6AJB<8-Rsy^nDya|C7*1hZp;9JM=Uvt**u! zDvc6e5n~sHFeS6*C_X;ghT15A_nnybOFocLhp5|7cbX`=kj}p94<-O(Y-2Uwm@htK z`;Ap6ynMBUykQ)ppE$$ixS*lHWNbYZ3p{8eP(Q++sxIjlCRKYRg4!icjtOcGRKXFb z)VI~O)V2G{Vb5vLgJ4JSBDhGn8;Br;Dnu&8%NPXcDPVN?H}Cwpzr4sX9OlERJo7}v zU_bCE0ADXzUt3q(U|x?`m)D?4&qM!8_sRfM526b(P|+LL9oG|N&e9$) zt0k)RC|_XI$DMEBv97G=)xXzA(M2%`*OS#B(j79O(<|1u*0nZ(=@IA>7^LXEMCs}- z81U&g>oyyB>Rsz&>0%kg>Z|ImR9IKSDhVo$cte$~xmGfHyIIT>mpPj{D%a;N4y=j4 z5}Of!Beo>A%P`Hb&#=m{$uPHTVrgKhWofRgt88psdpCP$dryQ5!kxs4 z#Dl~=)2TsVTyR{7Rj@4+wRqgdLomzVxWSYTeDS71qC zOkhS}XbEBX*Ko`5$Z*&2z~1?r%QyEUrz4LeS2DLI!B_!RK~09YX>AUF%>Bssz`uqBS^bhr6%bUxH z<-KM2^7itv;Ev#y;E~|2;I<%a-^smApn1^2ZDq~4`L9aL%u#0h_}bs21F}sr1lb-L zoNSxyID031Kl@MiVK&To(->jAXAC#qHa=eeyS}x4w7$E3Ai61v5ZxF3^UXEKJ;&3; z%@g#2ENcki?ER1(K?ncsb(Za|noyi${lhxKy2U!ty23ihy3RV?y2u(*yi`9~-(SC4 zKU_aQv$eFdw7>Lc>2L`q@Ym*&5|0agzAFs6)@OvblF< zXk|m_m(Z+GpU|?})4bR`+C1Gn*u366)jZI=);!X@;MwE3=sD}zx3DL4AavaR_u!1_L9l!2_~QN% z5HOu{3VXbKq74vx7JtTmc6z3N)_s2aZ1K$ftn^G0P#=&R5E;-KkQ7kaJ<$ETd#?Lu z_sUC8J-M+jwkHM`J9NA@IWa+Hf2Ac(UW2?EXi9-Ehg281EH3p!^+$lIn(0?lpsAaw zp{bdvf~mKuw&^!he^Yf+8&m0*5PBn1DN|Qd15;~LRnve?wN1HAuT9NOrA@;h)c-Dr zoc@F3E0%Y#89P7;#kIH1)V#*gN!-cFN!Q83Ny*9ANyEw3Nyf>;$=FH4$=ONI$F5lGO7 z{dh!7hD}C7hEGOFhD%1C{UMtu8<0(!P4Lo1kr?9}6B^?hldpeV$5|&^$6F^B#TF$I zB@zXEL(9R)!7@Sjl>PuP>L+oQd4S4&BK!?JgWkz~E-?FvP!3wFqXyY=O2A# zCyFl0Tl(tIK)Fn}EG9@V$Sp`EC@9D($RS80C?d!t$R{Y)M&HKWM%5H;d#NC|Sl-w-dgxu`hG~A5dWO}*!e({y}1^H_E zI&{!#p3aCmI(-X!E z#0ceS6Vfb1^>XYLt`sqqFy%2-Aqo&>6*(0Z6~%F-ad}=k0@{>MDReqC3$zCD8Sw@Q zLhd5U-1wEfh>`INu zCdRUo>xkC+D%@V2>Fv6Xz*5*4P4v6+eBE!`&M|Mw`v-dam?}YQ1I~cF!ONo(DI1#F!1p3Q1b}!ur*RN z@;5R!ayHU7iZ*gI(lm-RGBxtKQ@HcHbGuW`B@1Q<=Cq~mm#Jy~WgNvDM-7lJpwfeu z{?eJ%;nun+|ESARVCFSY5><&}-*UP~aWGt0FloHVZUzG`3V(u2z;odM_!Qh3 z9tmfF!{K`HR`@Mk8eRy;gU`X;;TZ5SxC1;3E&_jqOTnq(+wjkDF1RZk;$}^wQ(DTc zz0A~^WM-MiX_Qu8QEp#>FcA3R;>7&)XsRVO;#do2x>S3S{m#w4WB0wFtu|=fmzMR`MI8yJ|&D=aNa8U6*0`P zaj|oK;u7X!81K`d3Q zRIHb|2sl&9QW>?9x`y?4t5CHE$~3f=%9hK*%0#su%aOG(Dv8v2+H4Ky`pX!!X3DL! z#wycI8cS?#=Az2xv<}L6H65y!wHxbgRp*|{q_kwqAUauPf}h>1%JR#&Ml5;s%;&Q& ztp@C=GRF7n+?NLJHxSe#bFJFj^fGS$&s=`l zkhW?`wxLL+x7B6l{@#A*oMKsuPIZ~F!J0;AskhxFWPfe$z6?vdS)06ERL`%it@BRu zvXCU<^X`R!-FOz-o>{9VYexAP&(7V>9SnIlY)@uK1~#}$yH~VR1hd-R+uMWT?FkneL`sRa8|} zTjV(QJ-wIbr>)F9xRlU@tJKPN44l5ib8d@2%Uq?WU0-LVJa(5J!((9Ew16mEGI0H| z=QK8zj?3e~V{JFSU|0bkW;$!@5I7#aKZp8q=KO}8U)~n^c0cqy#66rmlsqgxggop# zG(3zxWcs@LfAN?12l;FHJ9N=>GrVLWq3#yyW(#27NEb^MOB2g-oG|%ivOjR~vgYb_ z-IdEVDn9Rr!*y*hsmD&!=KEorD%Dp@NNcJl?_24huwtWYF6IF8X%hyD>H^(KSF!yk z%w9|WJAQV($$I%6IF{xc41S$>sx#lWw+pZ8dl)Iko^dHu0Sju7d>Cp;DhnG1=2NoOQJ8=G>BqaiC~~ly~rS2<_UG@ZJp=VU+F|pisoxi zE*D-((!r@}N)~Zd=a0i3Auf}wh~^(dYqgz$Eh<-BJ=SXBR;wdAmX}Ug{zxL^xz^CT zH}{I0!9CJFf_mQ2*`n2%8$5^WoY!=Uok8c+kLnavF~vMrB0oqM)X;$4W~#5*@{G!$ zF#oSIzw|2!WuGzqi2d&=4in^Nu23mSrItg_U2f*crwp8o$-MWlez}^+o49{Cqo3yA zhptVL7XW(6CD!&Vd7O}GI-)LQ{%-dm8%_`=GHmJmHHwmMiGP;Kc9heRyw`I6Fk{Sz z0q5w^a^sc|!?*4SrD48r{Y@_ro-g)&PfGl23%Y_h`L=PKH-+kPb904iow&#e-s(Vp z!?WUcmTc@UdAPrjOOyO%&l8ZB5uWNt3jc5xKnNFHT6$(~M`poxmzL#=&F-0;55P|! zOqU9CV zMC77@cI!;RjNIswi6Q4ujoaNuDrdJ%K!2#(bIXl2?Ko2#e4+gpYqG6S`-Al?wetDQ zsY|%M{dB##p=+a?;XkEXzzK^P`fy0sGhMx=N2Xtg1!!^YS3Md$XPcgxtDS_U4&!d) zjZHMucXFBc?KCUW4zJtsJrEA1Y_*-vG`MPK#kql&=1kw+FeTp$TfMqM`ddoVAF0;>RmTQ zWxh3ZjOfDOBtJh1@_KclvxPUxQ(hoiuF@odTf+-&+$EMoy_^)Mj^QugKOEa19PaDl zGqGNE$L5DSRkezP`L7)1W^Soa3$lM_^c3E(G-@_fQqvQ{wpKNWIUKiC;9w=YJ#+r3 z`WeE&Lf${dI}eoOmpZ!Ry_4Il{9v?f{anz?PH#3|YXq3mUq}^-_K1W`dsB9z=!Vrd zznMyDnV?#uYQ)TPX#MBnM82fE_esqb$+j6J*hb!?zW;mDu8X+vQE#7%8^^|R zr<8zOpV$A(K?{Qhxs|6xLeiZp2i+m%cER*lW&GoBRB`L1_M`@EKiSmLzH@$YNJX3M zfz-}o)@x+vVf_;jNs3wEM}{9?sQvZ*;ZM1rPxX8w{z*N0lj*bBTqmbd*~p|BfcHyX zCFHkCF|A#TKkdGsgzGV3uhZUt@_uKf3Kbb+#|{8O~C>puBzK> z%%HH`aubQ;Zy>riMR04_ZK#r}-6hTHfJ2>6t6tcwPph;Co2op|&q+PJb!wr1-r4nN zzwZ1cbvRuOeJW?B(+>e5-N=?=mOlSPB*nSQ>tVx7rsTbkU66bfda4QLoxq$QKeW+w`aU1u>C_1pcX4zOL9#8ocHY;! zk>&EROQaJr?Y0cUu%$uoZNE) zCw%PePma*>U(oXT?EG!)gxyu{h`K#nPfKecmGT%7PUQPu9&?O&XUEHat+rEdhIaQrB5%LHt?vS z8b2;tIhk6h{!{&4rV{}6B=bkQ#KQBGzx?@m<;h@FIW;9(JAIy*)UJlz9$aLZjZWJA z(GFdqi@7Mj<)4M`Ppam+SA-AAchcM%MGya2c|Zn5YkJ&9>!Q~q(PJ(EOU``1AE@+m zxCO=i>co1~iMnTgDKglh3Hq=mRmDAGLa4@OS~XBGvSKIcqPvb9on@JvL`njhFyD1U zrK^jc*zFR=S*r<&05v%S>R|7y1AalR;h*ZFUq*cT=qzoP51KX&kIz=hVXetH-&H$f znT}6879v%L4_=wSHIx9@INnB~f1!gb^|KV!<6s|ZL~$3f4jyxNX-{Uq_XAk^;g!5a z%k8l@wwR{B>QeDF+;1MZumlyfo~_k$jjdMYg#=n+z3CX6?FaDJq zS?BitEYY2VTA6T@$yBxSy~xIA)i^bYB`&98;Y;@FmpLhFw2E{unXEwB*KX_Av61n- zj}0N*GW12epsr7{4YMiU(<54wGZc+`YZ}UX!YICP`w-WC{KW)u) zBKRS(*4dbDK4o9sO7)hMMxgXMo8b{}?$=pj;$RS(8EmuUHr<)Tc15bwFi{(rR-|$k z7+pbY6+V(3G`0ALw)M%+RJN3C7e&oK+-;C)u0~1K++f&IjW%4=u}&VYVZqQGD;MHY z|3K;z@?=-YqpjhXVq&NhpW0X=IhD0#G#9rw%KjchB zI%H5kFW1XX{;60&Jw2CoCUFmhCfCZt{teH@(bH976g#Xar<6u))md|$0e%Tk(7VJo@&~l#}?RDn1Ox zgNjOI(9Ar{#H|3WEeNM!q|cJfgU%N$Xv3R+|Hvu&bnE(dzvd0;T2uEO3Lf7UIYCc6 zWb4}IXhty%7EWBzdsWbx*o7+@tF0)P!&$!pbj($~5Ovckm^iX@wEK`_GhHljVMFa# z6n3o<<=CW@Fr7$a1<51REWrgj=!gR`F7$SiuxU0+`;)L`83??QLM#VA*OYfJsQX$6 zcL@b9RqC2w+)`)L)@-us3OnZ~=X}m3A!^<1%-_04KDlnGR*=hiavF*&a_084i|_{5 zz@)>-xon_sfFH!u#Ir?vo1L4>zG?B4ebc$ry8P@XH)nGBW$vFjzcR7%BwL9Ry!4Qj z5YfKZVdh6xUbI8(qspU|O8DiXj(uelf_o}f6s}xci4SW*jX4;jZ+5Dow;#EZ;bUNP zGOHs~EB5+SpES1kZs=(KsHDro%FglUQRFke>?OIUr)W^NK);eH=F6DgOsY=m1{YVF z7<)C;q+|Rc(#C4}_r|vFW$X9G8oeSUJK^hk2gJcBnjxOfK*ujF*SS&3s^oHWbniK zF>HT|3LO!~2f3TteU2~XC$4k8U#d@nYyof)pB6=3sApm+<>A^u9IF&iwqL1VzF+l| zm!`qKnL=omSa-4OK*k7XUSZ7r+YODliCW2GjsYlm3KQ)75@n zB1G7GkhOm|8f7)tsk2+WM96rcwP&pj99d%3gfHbI-Z#a3X-_}(gSFBuY6TT~e{IW2 z{_+{CJKp@%+9K*hxeID9ZjabMCae?!BWpU69?H25R88@l&;PL2)sIKL$|9EP=i@W2w zw26`0o*tcNp1zeEsy-a}Fo+88%rX7=)0XNW!k(fo?H4bVP$Yt~F6S2|m23nFolDd& zLMm8<8#dhHBQ?B71_MA15CX6PpmITS>F;X02L-8OfOj~A;uh@CFF+X_LMaPjs64O; zCr!eF7YYL6W9und5JHoH^VoW-7SvD{U=!|=v<2JCMU06nps@26%1dP(nMvmYeOLRQ z)(lsvpEfl@nH`W}O2yj?v=540e2e@4Z)k}8zit2LPXCvo)Tpqt*5i6`d5zf4)3IXh z|4^RUs@MFm?q!wliVp)W9S6uf`}YCQAfGRRLUG%9b~5P!f#`~{tjq#!HQ~Z8B4=Da zGzd7+lj?ENCB7|%rno4C`-Z4WL9&Sy9^cu-&(34`xTXDx?)Suj(tvnU~d-8E1(hP4BK8zkL-b+a-*7 zh4wv+o%ge2n2}xs{T3$Dboa0~QT~gvJou6&^JnPk_c-gNYcB38_IatUxK`-T01rch z`{MP`{0?dQ?Nv99{x9E!jJq56wFUSCY7=me)zG{K%{{;h-~k!FfIKQ$?KR0XtgJsc zC4CY9jq^+`X(MOi9mc}^$ zpi~3byVDx`I)3{v-)W6KiSzzjcUt2jsL397TH`8dFM=i|wN7!@wH?%s0kH!cSBCT- zQ6{x`VA$Dj%WO^x8ay+Q@7PAI4c)hm>yJDSN_Lok44R!XyL23-!4h)+CG{)z$IxKs zDEXdm^jGwbxI2*lywvA;^i^W*zkfL@Xy2o@Xq3$I&>Fz(%!Q?UDegd(m)&m``8NYG zvvZ%4^-r0KOXJP4$7 z(?02{SlEiveeGyH(>CJhHQWyjNwrj*Q=-WErmXE=mHGg?3@F$hdKf#+E4a^N$x z*CG7`@+**rZ_xbmx}ERNm>`~u1cvTe`|mf6ggkfyD08u)!^sE0EKzeRg-(|`sb ztTB5QNJr(*WqohCEN8u}2crI|FI0S%wpJRUMeisgL)tEgN_fl*EG-RInx`|!MPMxu zGc2`o+=H_7rX=gf`K3O_50lF0ZjoIr(rl}&htv8wEUTrjLVvwG4F;rEEAH0v5nRI@ zXk>F@(K3HX(idl2T4QMO;*3eXP+HFa`5g=C+$!I(kfkkXlIoE9DzqmQy_7FOPe&8= zM$XF88Ch*p%S^4b8hL&Xq$A>Q(#Yj&C6xO@mw7eFPyHflz1iJTAE3{eIZiqk^^@to zi^ZAlC+{q|c!juH_LtJpYu|B^+WBJ7r&a>Cx;TS;p!+fMuz1`zfPI0m4BQIbDJ&#= z1lNC;R5Ns+MmlrR-5Tk27VGUXIu|1?-?>rd4HoB3YKyi5X_Nsh#u2Dn8j;C&bnK?R zrKi0dX;gI$J36v2;=FIrJ_h}G$x;>Vm29U+YHy1>tiFtNKv?0H2_el1$v^OGsV-Lw2dr02cL-NKRk~j8{ys?MmjXfl9>>>FU&d0M$lXt%il#Jzo6gL&4r_1)hgl4T=FH3*9B>xrm#zY?a zj7+X6&50*y|JX$nY07NVCumcVmgDNHjhCKx+PwB(mGl|;(W(+naa>Dw@7?y~l=2jx z^2qn+r2IxtyKa`tk6tzBb?(^7{t9(V@f=G2U$%!QuKC})lP6`}KY%?sKbUglyKWYr z;ods({kC!SNY^zDMuT|nvc>(aeI<aR1H*pL^Vitmuj%;Zq*RgM^!^r_o#-c?o|y} zol%`tomc%ubwTx(szdd*s#EoMRhOz;&8S&5r{>iPwMwm4Yt&k`PA#YnYLnVr*hN$w zQj6-aI--uMW9qm%p)OM=)#d7xzzIr0EocOtU=U1#Rj>Qb*%~=%QRv=Xg{n69gg*&4=|51UtvZu zKP7+fwg$AY`txzD{`?_UfBuSXW6v=AxlD2OXP$Y9tL1KDe#_m)eVuuk`v$j)&2Zo2 zzR%Wi>$&ypEnExN#x`)L`2_nge;a>0yM@1lAHY7%-^Jg>KEvP54`X-o!}*cy9)1)* ziv1Nonjg*X=ReI)Vqf4V^OM;Z`6>Jq_7MMB{{pbL!A03YMqmvZvigxZnMVF$Bn~b%j4`D6o6y@#8zT6Du4&_d6rt&%EFSsu# zf2aHdH>a>qCW$-?Ye~P1wWMFcTGFp$73ue|esq0dS4{4Qg)d_LKId-6Bm@Xa2*^yB2a!ocKx8HiA_6jm5HJKx z00EI1#4w5&WS(aT^E}#G?0b(^q_!U&r0>0tXIpA51w=%Yx6ZmZ6fk^5p{4daUw;34 z&pl`Fwbxo_@3rp@2tbfVxuc<4v})HCF$2bAq@mrQjDas6LJOH%U$)Ry~-!bSnUI~J9ZhQ`cikC4K6T;Uyd}lP`PzlvhA5WnrI-(1Dp)ZCa6C?53EnAAhf`<|)g>tBg255p7 zXpioA9s`hu;TVO9C;}^~WBUX&?V8j!fzO7<5P;@SA`pWzD34mGgT{CgtI;VT3S- zS;r|WtRk!}Y$$9lY$Hr!)^&Oc`wCNpX~GQQXyN$Gk^M8BslqJbJYlwQsc^M$W9G== znNE&ykMNN2gz%*Bl<>?5_NsGMcusg;ctLnkcvX0VA8U)B$=L6q#IN$pgnKY5pDf7F zxXtsF<|p0b*~;+DR*;|hB0MAgFh8|;ZY!OKQkc>CW@NruEZ>Z~2aD&MWn@gb3Q@Wz zBl69%`J}~bLAmdx<#~<$?n=B)<(K&%ZOMGIM7~&=*Uw(O+NSaPITf?8086nJTd@a6 z@E%U#Bm55M@hPt01}Q2)Q4~w%D3R(@Q))+DsTU!Uu6 zZWuaSe5}+)RQ!BczX@rnt)b6LT@7h$uds&gi4EHwJ0q;~!V(?t>6YjS@W@9sFO%8ToH}+yb4&pG5<6UY_Pg4tONo}Yt=Sv6bNS&xNB~cg7 zoo<{xeJPW(XC#fHS7}$HD*O5w<{S z^^LlrzNQ^^gdJ&nc2PTM8@qsAP+e0uZP;X6cEDD)W4p9NeW|Xiuk1p0VY`TJ+nRRB ztU8n)r-sx@EE+_qG=yH_Tu!Hq+s8|9Q#S3O-L!}Ht4I~4qSZ(>N@a8X8hR=N{1kP? zJb6ddiWwVj`Tp(R)#?M@>-QeuBZ6z_EPn6Xghy;ou2sGrybs_ND(NA4D%7sUt+wNL zNe^MHx7$my=jgrBc+?IG{JO7Ohs?+H_R9{k7jmUq7~T-$Z$9r6%fNyq=gd(PVie{Jl+ zyZJQPcW3<*t;pM+c&>H*y}bWz#AL26vLA^>dE1u2Rk)v#!!edCpE-C3s~@p-dD~f* z_X?qG9*5~Xr!VIEEazXw(!6ah$Ge-{Ct(KWb4|IPD}zJ-f>z&czlCOqvx}+s)lbw( z^`SbWeyUEZ|4{#_{!5)w@6vkOKpSZjZKf@>jkc>FsUNHN)X&t<)d#ed{J6w%8{dD1 z56$nPT?^n>a~AixgUif!)fwI~KG^#4_f@TXxcvuQL45me^JP=Ss?XG?>MyjG)~Ua$ zFVsc#H+4x}R)402^bRee#k7R?2+L_Dt)kVmMqN>#tE;q(Ry<%<_&rNSc>j9v?rQKM z^!)v^aaSZ4yr@y znA)f|sm)wzPvZ*wRkcNJRohgK+RnZ0RJ+t}?kmW)rE*dZp)`Ll$GbVjHfFG6U#Dz1 zY~680`_|zxwl5mx#l{M1ky?XFe18(ZUPGyBsamF%s}+>4mgIY zqQe%Yu|?@LjIGF^>Cn=Dtn?qR)~d~1#U z19XrM(P275N9hi73O_i-NYKT^L`zrqr}{+$2E&r?61<@|5hJf184@74;-?<7$u#&uyy zl;Vmc0cCi8Er$x6mz7ZkRoU~^P!qNAI2xe|dgDc|pi+3nO~X(O<8^lgMshvnuf8+z z23J)xF-xA;eC}Mom05W|*&}3M$ys%473dUR1uFTgims>I>UO%l?x;KI&N@kV(bM!2 zy;LvPEA&de%8hmt-D++Px29Xmt?f>7-*B_sneHriwm(nn4{o)ZdRwcN@7Jo{ruXW7 zdcQuX59!1Dh(3B}Kf#z_TrfUZI#?!HHuzYuT(G>~n>&#+>NE!Gy7xS~-*rs=*0D9u zSo!pxfwf?9b=^`>1=b*FAG434sQsmV9T6PM zdWd3c`f%R^^*~hBFYA|)$Pt`|YGP9jj@vdo&NiLI6C9fl(N3)Cs6W%6;RSs|-#{*w>fiRS&6RQJXK!WY zzr(m5)%?_uefgbh5iF7KZNBsBuSQ7aPH_DSi>r)w9M2|v-_!iQzr?W#D3IeN8K$WN_HK1nHnk$SR)R$7YzRTeH zVm#LpSzI?{^X_Ri?z@Gjx{D(RsQ+7wIb9uq?~93RzKBjFn(juoAg{ z-@2M;F8U(6hz>wk(PZ8W`kG>&5FLabqN(U5I?h_>D_urUU)2crny+@8d(~I3r2BG@ea)5(KTZ>!Bfl^(S|tyZJEjF#!Rt~GY8>0W~%*j=1X{iInMr&`I@zo zciETmJS-mFMOZwx&tUP${>qF&3udhQH)b4KGUL&TSsKqU6VRGj2G26fx|f*ctyRnl z?iFT5Yb~>q`#H0+dzo3)TEk4VRx_*FKV#N%zhO4CKVUYpPcs+Z@vGdp`}{6JhdNMK>KV!+Okr=0V}Ip{_UBf89e`<~$<`KM>9TjoS3Azz z@2eN%Z5NI8c8JD#J4NHYJ))((U7`uzZqYK{UeU7NKG6!^0nv)yLD5RyVbRLo5z$2N zsAx4z@Z;w#mnUeV#BY+sZ?YdJYqK9AZ?hj8Z-XBdZ-pNfZ>1j<&-Zw|=li;}=X*B6 z^SxZgTjxi`Tkpri+vvx`+vLZ?+v3N=+v-Qc+vZ0?W?s&9)>csbL{~y>G-k{E|09Y* z9m%S?e)gcAZ;$-?R{z$kfqst3tI@a4)#4WV!{4Vj;GIVw`~tu6pLf+Ku*{z;&3?1P z>@>T~ZnMYiHTyj6d7kSzUO}&rSD0J$f5+{OGx#-rk3U$`c@CcBPUd;=R$cGTap$@> zJ$U33pX$HL^@o4?M;tPYu319IO-;rnubO;owP%csA*)oKa< z8%fpYE{loJ_GUZpuqd>%L^3~JgX~gXWhWx|KTaj5ij(M6cWOGdow`nar-9SZY3w}Z zeB%7k`NFyCeC}LvE<2Z;8_w6xH_lDXn`mw6fVQ1KIe&KkqN8SAtI9F1ZFtzmF`hA|kcrgF6gRQXSEjnDW$KzIOk?w;X=U1)jwZ=;H!qkz zrk_bRgUk>!)C@P7W|SFgUNaNT6f@n-H1C@C%=@yl?9VxwV#nBVPEn_nQ_-pHRCTI3 zHJn;b9jBi2xbuY5$Z6&@cUn4aopw%pr-Rec>Ev{FlAJD1SErlP-FeRG;XLpB!MWgk z>Ri*FE~pFZ;<|(`sbh309joJXJnvj4dL=o(YXol^%h<*>K~vB~m?#r%N|}nLnyG2( zm000040tKc3001BW3wWH>m}hiV zx3b42jkISp0^4*0w$HJ#P4B(;-g^sRO6Z~YP6C7wdJQ2Yq>>N@m@6-GC_Fh|iM$%bJ|E;5+Mk9m(k^HD^LW-m-!uMpd?fC%TLGL{HI2^b`HX05MFA6XV54VuJWsOq7je zRoPg+BLwEf0)lWj0i~kWG?zZ1Pw6w7M_-5nbeIm&5jtigZG?@oL0i){wvB8P+srn# zo9!n1tKA}-%8s&|>@J(jI`%(hzPk=Zj`^sO|l1%l-uMkxl>%0 z+r=a?nKO&LqL&`22g%KHhZ-Q)`IAveR+c4&!kn0g!bGI#Eo;hJvWzS%OUcr5wcKrQ z(nz^Xc9s=nMNv^Sm(65dSx%PMqcAs)z+5;Ahv9DAgZpq7g;1zTPbsM-y+bWT2eCw~ z5NpIbu|;eU+r(zET`cowP^THSZ8ZATm%nP&?2x&^*vG&?+!Iurjbca4c{x@G$Ts@Fo}*j0wgE^92h9O9aaV zD+SvGdk1F*R|VGxFGQQ@G|?HNgV8b3@zHsr3q;q6ZWBEwdT#XhF)AiBCUs1@m`pK& znCvk*W2(ipjd?eV$`Y0(I<{}@lQngCQ`+*D@KthQoTiuSGZ%11AF)0*?dFf+CpO*OE6_AXq$D%Gc65*elpCxFERpZ!PKn zp`~_o!{`s9r~a)am9HgZOw`|65@I?eYYE0C#NLU0`(IiX#qIrvmI1jEa`p4IWLOyV zwTL&tWG(+#rFz2uSkD93-z2?nX8q@ayq(v-bNz2i^>Vs@TiyRtd$rxAZkLt_ajEj9 z3b&qKntr*|zgt!&Zb@7t#Ff#>zj>WFH?eoJ6?Zw@@1NW!F-Kx_VpL-0#PGzk$^KHm zSNO$q7sD?+O7c$ylFAerl1guEvX0$y48~wA`eVc*_zo_&QAw?w&n@zMUP(DK<))Oo zLsExC{56V@*pP&f-67XP-h@(UuF!m;E`WfAtT2 z@*i!X_d*|pd13UI7nU~Z2}}RCmpaK$dMDfQ|NK&65n)mP<);tJ@tI6g*uiA=9K7Tg*qi-+P_*C1d2kRkXvCpj*vaZ;shl~ z>k)dSPpDizaq=Yd)A$4(hQodSjKW=i(MPaP)RajCqA*G&SBVH}k<6jiG+YG45TCPi zebUbJS^I_0!2&*M4=1xW!l$jzT2aEMZ6lwzO?=iildDB9pSPQnh-`cBd`agSO#&v=#e`VmL$;$I)~g-=`D!0i6^nL@69eNAVkai{Dy--&u(Z zt->Egf(R3Bajy;FejAMkY>Y@P+T%gd0dLz3c*o|)`?jFyg1_4m_{5eJ8ALa8*Q6Ec zMOTuxI%!*rl&!(1MJCaMQrqT~#qt13e zb+HH3Sgb@#u`(^g_OxELQRDD?3;56$G8fEc3ffL?lG$#y;UFAL2k{51Rf1|uo~?}q zX#uvQbyUa>!78){tI}$mMt5;K-N92fH=ee+DB2FD7(0l{*$GtMenegE3F>B#Q*}F; z>f1SPvicC0+A!5ljaTi}N2-IGfYs<{oIzJ8i|tIY-b;$JT`1mmrE&JY`dCd=lSC&q zSxv#}*o$`HQ);ZHs%dVfnvR{+yPN@M(p9`?^Qw+&hU#R;sLpDpTC9FjOVm=eO#Q5u zs}*XcTBTO2HM~=;RqITIT5p}&pf;*s)F!oA{c0llJ)6UeQ(M$lwM}hTJJe3KOYK&B z)Lyku?dMtQfI6rSsl)1sI;xJTa;qe&Z=|jyt<$+szh~3T~=4rRdr2W zS2xs6bxYk=chp_ps_v=#d{{kD57lq#k(=datHVQdaeFs z4I|j&lrR!T!Dvp+>D&))5uf5S{$4r`#=?g%o^SDO_y{KWam6zDSgi3LcxlXabH!XW z*ZloBSHyfTZ-k7lv?$t*ET%`z{mm)*Z zay#XWBgZZ!hPu=)y;$y5^eVYj^xsl?5cxbA-Y38|k!6(H%aUTowbsUR7;b9uhnYcR^!gs|ku^Y$G zOk6DX;30e<_TpC)vKn-Y=I7oxUA#oUw(EFU1t8)YH#$&`0aa0@^C&Wo{ zN}LvF#5r4BoEI0wMUiOV5tqdkaZOwm*ToHSQ`{DJ#9ecdKd`O%eVzl~z(Sbsmbj&` z7=D12@C7XKW2@!xIs60*U@3eBKkNLum@c4;>w>z3E~HE9!n%|$qD$+dx(s{|i)g3K z$Lru*_>M}!3heDin#(ozjPipTJ-cq#snDS0ig;`LHu5%C*# z6pzI3I8HnfPsKA{DV~cL_$Mx*4B|Bv!JgDm{3+hjU@4@MAhk5olPF2Dbo8YRm8oQE znU+q;bTYlnz`>Y+gZ7q;v6o~P87JdqR+&v^mpNoknOo+e({x7W z&S`@4+QJ3Ra8Wx*)G6SSP6?NF z2wc&je2DjfgA|YwLLd~vAQhyBG>{h3L3+pl;gAtBL1u`6NQi;}1R)w?APdC0IS>c& zkQK5)cE|xaAs6I^JdhXiL4GIz1)&fWh9XcDia~KG0VSanl(v6B87K?o>}&hRzJ>Bo z0V=YBN{nowGBZ?xs!)wna43gCb*RCqpeEFU+E54TLOl;XfBW*-b6yIl4-LGO(9qmA zcRb-qXyhpmJPnOK<9W~onnE*ozy!F59Rbau1#PDNbl;}1#Z1svwGHe@JKoN6Gwf-5 z)xM+^Zip)CWngZ9t?-i40P2|7a;=nCDS zJG=)y{Igy!=nZ|KuYXSJ4+CHz41&R&-aj)9g<&w_Wd_SK5SqXczXQ-PoV@-~ifdZkU@mkoMs$x`wmqI?kaR_zB&_xpWJ^ zrhB-^8eC>m;mk!$xWNkfSTc5JpZj{Y-r|kAU%3*s@Q9F!^+2K^dj-`rr996O( zQe`g-)wENomYqhm?R2VRXHZ=`lbYDM)YN`T&FnmCZa-69>_O^o57B$}F!iuUsHZ(j zz3fTqZBJ1jdxrYjv((?7rvdf?4YU_&h`mfh?G^gaKA>6l8O^rOX^wqi(|PeW(LQvQ z>})JbUtux&8jI66Sc1OAlJp&xqJ>zRzQ;231D2&lSdMvIjR&9%5L*W^0*DbB~w@C%%WpK~K_#!a{dH|FNt zlw0CTT#Ku5J+8uaxCS?HPwvaTxj*;fe%yx#;5kgh3wRmN<0ZU^S8Pw)$M&}UY%klF za#9}3P5CGn<>j&b5r4=Z^EjTs<9Q-|%%AXQ{3(CVb9p|`<1aXZgB-;%9Ldof;4EC6 zi*bFf$F2As9?C=P0NbCZ@l^hj7jPM_z~#6Sm*t9Fo-1QhY>CaW6*luvr!BBGCvXRD z#~ryXzsv2p6K=+BxCM9Muecqz;!ggCzvu6G5r4}+@IwBPvvN+(&bc`o=i(fkhf8ru zuF9pk3YXw&*ccmOLu`OeOchhz6f>nvW$walxHGrruJ|P`z+Z49ZZc&|X;YR*@Ngc) z19=z^#v6DYui;fw!IU%Qc_z=`$vlZi@o1jTQ)miJrb#rBN|;KfqAAHg@z=bVzv3lS zfbw%3$8x+WVTzlYrk1H~YM45vuBm70n+B$#X=DnRd?vqXV-jQyQ!pv(#23s%^C&s* zRL&Gi&Owzog=JIOOx7`N^{AwH&^%7cLzySCi22>LGwt;mHu|hSr_bvP`l3$M$Mp$) zQs35h#C$nNej?|}Pvt!MnVc^_mtV*Q@=N)Z{91k^zts=yD;DfHEzHwlI+aeX)9AFe znog(F>kK+vXOwqjXPrrB))6{VN9lkL>S!HfcA8ygx9lz3=`3o#IVOKL$K`T!%A7GL z%vp2NoHpmod2>{~=cdX%a-ZBQ_sb*ls5~eS$V2k5+$C4ax^joys$=C^9iNn|)7fc~{;uiMG7CM8#ECT5jjNwQ8>Frao2O z)jai?>Zv|gUznfGaWz1>}R=H3P&40J_UiPl7$v^dE&)sYCoBjLNH)LkSx34F3#3UP+BQ=(tUxJ8GeI*&6R0q z=r?{^&wa8@AW1vJlwo|&yE=MzzX};jkg*r|p%ATS#>`fW#&+%nblIZSFgg^yy?`>s z`0s*IFghK%Z`n2(AsL>m_YKqVBG(~Pk%$f*$|%tl^t?^Em3#eFbJFuW{`URAmbTRk z1hw0NO`D-5sLH4sh9XHxahF!18k_{J@$)riK5qvCPV{0ylkFgaM)0#qM(d2$BP$BS z&?2)OhLVhSa1e$LWtG4^xnc~5@?JZjymVWQHB){(pev%sJU&=>* zhq5IbdQbF34|gYP`69yF3Zk|ZZ-;>l@pN-1z$1%;8d!EHuV~yW_l-=NnlT)uE0JR9 z#+2DVB(nqilrK3nt^_+d<#nFrjD5j3&}I}eC8}#D3#vapWq7_@vPa3DP%kHcGQGtt z!vzl!N5b#PmQ7B({lK=Q z9hPi|rd5*3_|%Q-4$UYKg`hLuU49)vx*<*TX&a|$oE)0PHFG*80vYJQF3ot6=tY8N zkTi$pRBJa#a@~5kOw$MQi9>Iw)>hEkNtKoj{k+znRf#d{?FGr~tVd?-(rlTV6s_wf zXZU9tKV&YU64_!qNH}?j*6pFZY_?=eyf(yE`kY@u@3SUEBu)6=g!bi9ol?NWFyEg*-dywptRW8Y!=srw{`is-SG2z$foJ;1jbOq~G|qZs=}&|I)i-1{xnwRPqRWUM z4xj8V8au8!bVXIp)f`&?FDja_1Nv2z#8@hdifHoiB9(V~y{2qp+5@b0tVK-px@j&h zzPpIbaTkv>UTgtJyn|kSCx%N{%(8(RN?2$hE(mP} z_nlxwrrR!u0Y~ohXsGtRMbx3x1Dae7q(FH>zo4tO@3vN16f0AZfG?XFg!vu zWRs0?wQ4$L9Kax>#%@p%HGCV{++A^y`}z>ZA@HR7P?e-yC@04NDX8 z=lRtTho#(5QdBr=4J_tbSV=180tWEbNZmfF-h7#TBImZEYWc)VT}9W*Js9R@fw#vw zC`*MZpn9VY8)lcAOQO{)7?Sk5I+g}@_-nLc^Z)8TcAxi4O=5){ska>teDpaP!}uE< zzbyv|7{oCOxrvY$)8WL|9dkHeq05-Xk5AFx!Ok@o=IILXT}4+RTAVc>c@+(O%7%IR zL~%P(3-D9b$DRTB48UaYx$2u*(+1F*E#~+D+st9G!yE>?%we#{oZA3jFo(gH%wZ5P zhe60358xhi7~E$LgRhvw-~n?Q0ADkQ!8god5HW{A%p4bBpE(RV%wf=F4ub~j0b@SEcN1CxbKZvX)R0ssF14|trc zy$4`aRk}Dn=a!iylj$u}GreXqlbOs+dhb0XgcL{uApt@sp-XQ9Dp(Lu>;g7WRInGU zYk9WSRd?UI``mrIuDcdQjY{U`f6l!#$)th){!ccWDY@tC<$UKm=dcKtlf@!5wiN9`O5gm`uti1i)mo<`IE(tI5d6Oh%g|Jr9d~3E!q-z#uY&;LkUi*Y}jI zsB>tXzEl$_zhA^wIQ;HpZ>l-XtQHuB4KlM&t4XuSWR^6I)@PPc_v7CU^9%7s!-t8D zsrlB@x!IxmY^TL6?_OmIxGWC8$&|tu^0i@`#)lsBX|!o(narFa5agSrkSuB930vjK2a9}c8ZMXsF0~Y`W{I*AU8a_|Mdl*0Yo+*X9Bz*spxK!f@ zSSAo-M({uSR=>Z^KpDcHnN+|=eX6j+0pZvesgvYMdTej(*nBj4AUzlw2Lzb-xJ)Yd z`w)8+_^qQLKQZ)#=Ji*Wa3(^|NS9i5VyjV-B;b-_G8U8JC*|51g`r;O7(&0ab2TQr zTxTNKgpftk{vQ^LJq+<9SxE>#8aatUWCH(UN zUb^{h>@P$bX2hQLw_C$Q*lB9{yVQb@!F=iywSheG2M7aa-34{yeF!6wC1W{QEDIzr zke-T}3`$655UE8Vq6{2@RtbX$d%n6aSFJ1PEvGL0Vc)e|ufFchZ8^I9xy8U)w)>UM z;me<^|w+ZkKaX&oSVDwIl#W-_8(f> z!Q_7E<217-4%E5o$-Ew8L6Xl}!dscEi^6GSB&?@C}YZU^eSgYi2<*j`Q zU`H-Xi-^`ABwO-0En6kzuoQy~hKB4T2c`L=T_8aC&gQ)#h}!cR0-NAzF#$`ValnRA1dCzDt;;)>nR4qo;0o^qoWu(h%y z5!}i7qdXq{N6x3d3%60<0X}vT`6_H(_-gV*_y%kl)H5mcQzU!_XDQ%QkYI}`@)#6+ z0KSJmexf_vhMfe*4>JQDK8%I}{KG`zhaX=09*svN-WG=cjq(sYOpnQOKt#a92sU!t z@Vh?hB=`!x*2c;dfgC4G@Kr>XGXUQuSkUSj81J!+ zFlL|_@+j~{VYAOiY)xbmrH2691&lW2N8wvqq2X%<~xm?6paQEbqMBy$q?+b_RkB>lbB9WQ(4;~YB*u)~_N$;h;JKx`b9`Ns7_R`(k+C9`) z$m2p!UQnu7@~$ z!AgJ}&4O4k7LacBKvEglas`NbdB_(I%19(J5j>QKX9KLEYdr$&aj)}lEJvthW#F?H ztfcYneYCDd+hFT|d0;b*_44yGvU&2PWcgk|q@swh;QoRYIz7T{;9L>DZ$9Lx?ibdsePK^U z#UAu~cSYRCPj~e%e>KY2{_dxl01=JF#Qk(ER-1!&=pm>s1gzvKJ(VLsPv?<3l`HlmG}ZdIASfAH8Y)gyeHwlpL1eQ5Uw-wR~Q5kco(c~5S z9jv8hWu^K0Ll5DzFP0`#?};4t0Z9H+H~xN4fva(CjVeWq{b((o9a^@A(uWg*;9ZqG z{1$m4ciGX|mD~Fp6at5a_6eyY-x4gykK9Q78C5QJbkfAQ2py9`r?La|oJy|1?@3fk zWoacHc^S=_n#|61o7Z(_7H@lcUFq(POPuuyda*LAVR7}qX86@r@T>fFkF47INeyv_ zOp{t~a%l{ss3`@9FYRH}Vtu5EmY!{=Dqmsyc!v}d&M>8ZbYu&kki!IL^h zI_-{c!(08a?Fh!p0%HOzRp6xf$H0#z4GX#N28SiF7msVt-mQcXbLH)lG z>H!C3A4uo{192l&LtUh5h}Fa!mqNrFe@1_Y=D~NszZ1mdWdZs}hW#64Qm?}&UWdQw zr>JX=hD)$#kAlHJ{~11e0Oo0V@L6TVqrhh)vZi0^Fzlao8=KvL*L3S=`>*-z)+WGn z&)oQFdgtyYeBSWw+x~P%TiYFf+6G_W(X_iOotDo5>Nq{7FA`fgG3iV4SZ0%oM?f$M z2$@&3>G4$(qgptc&{*kACqHZ3I|plMxOE5@^2G4%gRkGxE9R;VRvDAxbfC<~-(}-; z-TwQlqR22v((!I|zAa|4;(>|wj-xRf_{nwQCohJd`~*&Q;k+uDpQsUmrZ|rg1yS;Z zQ9XQ}Ye7cF0vEnYVP)bc%roLFa6B6`o)t~8BjZX&$IS)^j9d{6p~^&@h04E3y~5+N z6FJoR@2P_SF?r&Cj1$DgNw`1*q17YsYMF>9{E?kT!^Z#HoUTlf44cUl2F>st`f7)> zN{`P~SRqPxt9DD!)q=R$<>c-(VW(8mxYy=O z=pf2Qu6We!am4UxC}q->(dr#$!fsi7J*2ZVZDyVsJC@|D_AeaZ1OEP{B`p~inVDbg z=;>dUzVx|VU0eUU+^TiW?n#8VonJF}lQr{!fmt^%%O?|MBJd8GoSI`OEzsr9FMT;} zcDZxc`a?JFSLs!XW^bWQIB#LF#;34WE-km!RTcPjxM@LuvN;(tps}&Fwt80a=EqlP zEV6hyci1p;fpC)VKz)Up8zGaXh|LMa(1Btmoj!{EV5PGsl-W^WT(PLU-I&akdn*RD(@Kr34W(z)}GG$4;N;iF03uv@$}%Px36!I7}Ip6Dmes4+e-1s z1^iw@%u1OU|FBqQ(`;tqTN_sGcDrN^u8YsL(1rt()p+Y@OxSnzV{`#G3M}U){X&{Iv~Lr8Io%7!AMp3iTvBiU4OS zEEV{@B@cG+I;%~EZ9zwcQ4T|_ktroLAMDSKU{p8_>PH)@<9(At>W;+5T~7`$n6^(M zCBi$-n`|Ac3%-fS2~Fu}!NC{NqJ&%l{n?agPh>8f9Yre3ehyijb8v3+_F3+smezt5 zz9F{39nu7w;EzWaP)XU{_Fli4yEm@F^$RD%QmEG|H!M*|$JGEvEGx`D><11*d;w zGcUPf8vUN0i&_-kL{XnESFmphUQ@mMz#^&U(FBPgLF#SDDO+4=NlD4_{yLqJ*(4&N zulI1@`~w|MAf~?dIOKYTIG)Rot9GXz-i76=RP%J2g2Dogy*!wlQrVrJvC?lyyMpTA zm~Domd}m)?R_BKN4<8AC=nZlcxm<3<2hhCP!Bob^sEH!XDY$wCXElz| z%-pvW`uHE9!xy3qbF?nO)Ji3gx1NaQMp+}mC}&S*Mtgx#8?5uzF7XZ>PUFe)?poY@ zO>Zb~@b2E04PI>6?{v=G(bm4H-c*oH-2RKt-BaFLw(FJ6t6n+S7)-^`($vTZf=$-b zb+8aq2gAKIPUSG>?WS?^Ou`A6ra&ry>ZE>|9~+@@%ZIqtdTW<@z@7s~(s@R-1rD1bh`?`wc{A@hu(jkOl;nwFj54^CiHkkU!(Kp{@_)`FJ zv6DyO+`X8YxrD~*$v}rkgD-;#R2&<}W)0@UJUtc9N4aW9A!lEtmCI{vgxI&~@S_WE{O4WG#hcF#%s#QHYIpyU%&m2b6n;vQjF4z; zNi#)x-jxk<2cM>+2+H{@7)#?=ZphQov8UO6p`$dik_UDS%qne zWatq3mJb9MKY4Xs$(APu=H9!eILU~u_0BA?Y*=xq07yW$zkZx(U{m?!a4oCib2Sqtc%3$O z?f%!d#-a~>kpmL(D)|B{nZ@#pY^fj@_#<-X@M)!B9PUePTGP=$&vk9(xg_8#bfT0} zuM%*nFkZoDYt_9qt=G&;mt4gc#p4oBZDz?M!%r}}=78~%P5y(GiB{0Sl-V6)3=AC8 zI2>Tm^oz#jheYj^$)9zmyz`DilZAerGOF3*+9;U{8KYer|tTIkC{SL8w@yvLF| z4T0zrQ=y)Xr5WfC7)qwWy#u|EkH1PQKyRBOSVr}k{UMZ5`b6BIKtxj|tzd$Z)0}SY z=qnhXj>c$Mte!vyhF_bMWyY{Cf>V44#HsE#Y0Y$4UWSQdS~3Coaq4kJg?RmP1ks#k z>Sn3r2Q2+WnqoyxG5e#khS9j@&mW|qCmP7 zGZ*(1M8=PWP1`nvMM}umSvnM-CsKqww2>W!%iv+PK|fC~Zun^mo%Ms&>J*tlk?mus zYdg-@^5=0AxC!$Ub%F=~_lpS3)ibuXdPvS539qJY4TBAFkjr0~z~?6{QX7z{8C(!5rhM!AdZc`Rrj~okf4hD$yZEKx(Cq8Q#hL7X1_ zd`ZmbPod8l8|7e7M;m{mj!tj1zg~5fQyOyRZ&2uIEPE{8LHm2175EjjO_uePG)y7J z-zX!R=SS!m>AkF9jBQe27OJLpho;(1?WUaMcuZxr_>y_kxxq_+FJ9B;k5AYo{uNQj+;W%7nvG@_fzf#;&P%y?*=+8LuFkj1^oI}F-$Yo1- zQ)QFPMC7uCxoNUXGz%F%HC^3pT$UM$5%JeUyqmAc|KCK&w9?4j`0_qa)0K%E%RZ-* z&TpeOCMFWqvYCgg@A)y%Yg)19;=d!9xMtiuP|5|r zRFH`nd((jHkp4TGNRFIS0qQPfBUO@6x?&3|b$Z8_IuBCa(l)DV<-a`!O(Emb>J}nYs+MH`+I{ z<*7A;53S0WRpaoA3_fFBTkg_Btwn=gOr=c8v(&V;)tK|#%J7pqt1N*e*or)d+GCW+ zEPlc@J0(FB$gkPh;$f3obFwxOPf!NuRF-U=pX;uk7pR!4m6c^G(!4H_^P0|@jk8kK zDpYHwZpD8fWUNG1UZk$cjx5tkM3Wj{^03?qML9(%=%=f%D|QYntXSY3LY+Rvt2%3S znOvPh;Rw}cL3eG`=a$xcyAChPMAcYteQ~CW$4kS)e#gBhP9Dk6!JZhd>bzs1P-^z5 zJ4IrZPGu`<^VJ#B^n&u8FRWYo+%*j%eTpX2&FJI?D7c?szABq~9m@|^j-NgcO|g*l z&dA8fjc6Q>9_B$^v@Se6(oOeEd{KHwjnsP5S)Vthk%m$C%!rY z?FMWa4K0&cb@b(zkJ7Ut2mu@;--`6r!qFyXreMQQK&5hJ8T6S>rP7(HH)Od~1a^rc zFyPW>pwBYkXXtkpQ@;dn!0{xkG!{!Tu3XB;Br(aDe|#tHaP069+(VI!tM(`PxJ-<= zAqJiS!T+Tq(rJs3n$#za)lKsop~(_vvL1aro%QH=NZ#3Fz_V$2|7l!;Ls%vYpVrm05H{ksWJ<^zq6s0cq!Yp^ z#%1h@a7Xn0vRMUKdD%pPd}sRb|4tMR#P$C#90H@(PXh;z4v-YEbr2%z2}3R$j>z;x z`$gC~4qMIi z9iYrB8Ff3OwhcViJ@8{4#fHOPfl!@YT$?&~Q*u&8%iOe?JKH@&Elt+KG|f*<4Z%5f z0&~~sd}i6AS^mmYdHVc=bC8Fc*P}|S@}gG@Is>U;(U{MJ@X@Z1@jw}$=Tm^W$)&Ze z=`nr}B7pBq4p?O4eIJAx@uM*Ip)s8?V@_;`4onBb)p1>8q=!0(p4W4U4j+ z(j{7PVtW_1dkj2=*5QdP2wQ@(KM+%8M^++Xb}7-J2rF3i%&v-xUC*o4%RWKNX4XBaac?L@z6jB}DT+ zOJr5m1DK%|F^jG+#d3ks(9JYCgLB#STlWbCb2Db_*l)mk@=FmG6g5|=*FSzDyW6_Xc=p8FI;^ndg|!Gdt;QqOh&b<;o?nk}%&Hcv1RMrG z$OHDxkOy3rlvRpW^2VqJ(>4)}TV#yw8cJESYSo%`t5y=6q_k+u(6Uftu2-SuSJEv* zOPpIB`X6P@Y_ieKio&JWV=a^51}4Lu2sQWCz9`Vv^`4=j z@gPqZ)Rpdhi3XV;q^ddE$htIjhR&6yS(g@#mkpg6Ip&XBmmbQ!r7yZD-M!t9lAv+x z(%1*TJPh71Y>2K)7iDCP4c( zbiGwa;tjJGB|jw=BqX^D9O0`8Ol@MuM7@I^sDH6N&+MsNo@wTeHVtF{Nsx=gj$o;$ zvdLB6J_kY#EIc|t&^xC-lJ^BGGg9&$5?6UgS4X+aH~0Fk{?l1_mXIe^O7naMw^6Nk z{YY{dGKzO(vU!|{p3pqJ@&8Cq{tsC@oqoAmr`NClBW_Qlk=x>@)yV%h0YD!$ z@-4BAe1Trqifl!P+$W~qKtZ5J*oeobQ<*#r+r9e4La!~mB-`ezYOV6+FFDYV+TK*9 z%SwP8a{3C~`L)4@u7;p9zcSyc@YRKO>=~-K`X%y(lD;+mtQmQ!PPf+JO---vubsKA z)jg(T)j6KLG*5neY37Uqe=yI9a_qZq9rog%^gp`2GE$4eUW2&9{7N#eoFN;n#=OiF zSK=_QKBdU5pzAF}DP3^bs)(1T)n{IMIZ~8h{Ht-~TkOwd4qE>t$JAw-;s|(;Zs9tf z&eUrrh+7!pyc#4;DrwMps{#7*`E=jXRU^#)y;2$nGsNL95C=$~#2=V|fovMJ&fY!_ z6EvxvsC?V8b2rA|bK?Wa?aKU&eIy6G3OHwiSFORX7py7-}y}+0Zhn z&^3nUlwB?u%S4?dKBVVwGbYbUCF2$}u0X^1IX1zGozuZN-b4DxB%3l%ENLy2YVHk? zYQ+}p_p)C*0iTjo4NxFb$E}AjvLJRrJupLA{0c&dT|<<4TFzs?zZ~eO?nBw@bqjdL6q>g&u%{D>`}UlGyCJRGmraieujx@uf- z1p=z4Ap1q6@1^;qH&WiDOUjp{X}nw*CNMU@is(J3o!0xMzgF*mGxg&wg1v7-dFJ6r z*{Pn&@Y)r6g(zOitB%xor!^7q5Tk`JNPe@W$bTi5#+whL8ypVQ=YnbN=ht$C!x@6a z{$}Z8FZ^~{L%dhOxbQWBMXHTsU8<29S}-KSzdoGC6XhRS&u#O5mb z53o(jr78>iI8VXlB^{1nkb*VpvUR##UHD82gN?hzEuH?)kycy`85bJW`i4z8blY`Yqpj;ow2(vvpwI?l%(V)CZ(hX49=1?wXylSB_6ji#i)}>lyO8c#*=A; zdZk(m`urYqVQV_Il`pqQlcfoASH8ngnqkG1K{sE_mn9$!HD89!f#VtRYr!w%8OYDH%kYyi>PenlVKCHGXtL9cn9yN_j!Vp= zX{^An#VXhbSVFX)Omf*;PGmpX_ad`YtWV-|B^t5HD$`c@?4^FKA*U(Lla+)MQsKZu zgiDafH)c3({$!q1zFMs}m(I`6>8o^_HAxa4_6u5vg}expr|Dg6G4n-vY{hM?o&(;F zG6|&6r^?LCRD0Ws?Z)Eyg$3O;x!LNBc~ve;$=uvvYk^6SMEr%XOAZTO*)+k{@j@C&(|wBGOI2t^?rfWKp3+c+zJWLTiIOcHI?)fNDv_J|6Wp$RKf-#zq#P-~UR%xa-fZI;QbS|PcI z;)Cz*mzgy}p$2|rL0?&DT^jiU`y3E(JbK+rGHLZ`;^-G8?&^@#C}9JxL@ZAvpBHLk zVQCO7m8~?OBgjrJkK`+*;2%=}X817|@=$ZwT;hHK?`*P!Z)C=1eGkXR84i8_ z5c@!wjo8P0hu1^fF-7FS)ZgjTV$!2kjF`oe&ol)-Pp(KkCv8smLwQ>BDXmdr5S&_~ ziz63nY+jqkzGyBIQHfcPei=*x9<>(}CDZfyN+fd#3nyM5`4Zw3wcQ%{*_Go>c1~}F z-Cog~lha#iw^#P&q@|{&`BGEK)0Xo2`31e@R%>~0LH_)53)NFnSy^0MSy{sPhYIWh zRte+7RK9pZJzvI@oqve>CW%_0w~K|z^_dZ8jQrB6B|x*U5`NkAWSugF2<)W9d zvwQ)B>w<7y5H6pt=STVwMqOfHQfVD*7Fi??Zz2rX8Y|R!Z8;MHpf~j9C`qo4l<*Ua z8mu%#upnIhsm2iXhI*w)8<8it6T*~_%9F#UYwGN1N&O$ne7i)$O(f*;dTz3XcWQx3 zLXyocUqakYIiXimuVW&yg7ItDf>)tz0*qfn47+^oi}7>E5~YdISS0~dAU9yrX3h+$ zLw>iw&XI})@+5tdA;}cX4VqMehG15Ymb6Ra6XNwEsYq%Jy6nYi>IAWZU(DrkVPr@Y zON3HOZkj32qjBgEPRS6bJK0&Zw!}_I@&Qa2Wzg?3!JkItPJNxTuF1|9HyhZ=?OV18 z1cC%^Ts(#-+}iq54&#~RVSD`r!H_rK#ynzJUITBk@4v{5Hc+6%OQzLbJKMKyPZ5oU6Kkes?-n{I6hv&j31fP z{vm79J`wC+6Sss+-1q@l zen`^~9R1YK|L~Z=rI-PkpD;t=5piwlnloT4_8gX0{sRpb(I z^wd{C5+`3xCPM8X2NiLM-(q47mQ22f&X|Mpq>o)R3;~UVTLal-s0FV(D@`s`t-&Ih52)IRE#G#$Px~#1GPSXb)H|X&`T4J zYS6oyoOJd*Vzoi&>nL~XEqbxWC`_AE?t(9w*q1}>#{N$4tF`@#9Rm%M+W&8oTl`uL zv-d`$^;_gu?CNLWrm|VscbtS@2{#LkuJV}WaTA$74({fMg$_I(P?z)9pI!BD)QOqZ$`73RPM#sc|vhM147ATKfb z(8M#2L(<3!A5^(B=G=x9_l!J?C2xj1r6Je6+mmAVdhID5(w$lp)aimXsqU(PRvV~t zTm62kGc66tz_zwV6g^X06jvm1$g?%8Z}Ne!x}k(`bCbzfJxDpAlD2!*^W)KFPqx{cr07WmbE6P_GY`+pT2*{W6!+>hV~eE-Z<9 zTWZog_9E?B*}LsUUX{vQWVaQjs#K|kHjBq&v8SejyFL)dz05dVjCC_{9lnzG=dxIj zZos4PFzM?;tEP7|-(d&Tu-K#>JQFXHX{4i$p8my?@R@T0cR`xns3D7&yuu^eqJO{4*o7Z(gZ8SJQG{? z$h6T`#7tD;&Sb{;nVpE)IH4)Wu)$}OwLwQxk|U^1hGVhs)CJJHfG#sXEU z8D@7)_EKl!SUHv+6DX*wu=tS^C{~c;V#QxIa5|@v^X>XszIGTY^!_TpMhKkn88dMJ zOCcYi`$bI>Klu5hrMD6X016wUXYP{l4Sld1krv)epSJt)B?o;_B3=6>yXo`3;VX-Q zN#-~}PPe6pfC1QWF7-4&nGgSmy{Z4@Q9TBO+DCY*XcopaUihm{>txOvTf>~|YKXK)+9F4r0YACs z3sVZ0dPt<_D~!~sIFIoStm2|cg%7wEWDc|rU(1|`j_kY!^6?OT?kR(a}J{yhv$qO9Xj3VY*>BM zV|^pH44t0Sd3xyR2uQ}t*4)wFe%snI3@clETYLK*YsxSp2kU#}UprgxJ+Nk`2fX+q zSn%+dyLSHTkv{BM#FG{li|vXzW0nKChYtOt>jelS_#WaYN)P(kuDVlLrnE{(0-WH@9-AXe)$?rhoKlGKdKP>NCMO6eJ~fg4Y@Ts&suvdinah z+S~71SDxOnzBK%m)B6w4Ja5}g{n<-j1o+K21N?<$+5I=QdFOimyw~CZ-o%;P@9SEA zd`U34CLYP^b};PM9smmZt%>FX(7T4gI(d!p}-?jayb z_oP(!Wma_tr01pX%0PdQeb)Z@aaX;5O;vv1_Tv6Ktdg>>wZ*M>uCM5(nvwo@LZ0T4 zPp|}04Dl$292?RCrc=-odpe9bTFzmEdcsoBnvp%X)atBRR?IDE%TVT*XZAJ(6Tqj1 zePx!0ea|eu>g<}#nMZ!VdG4-8(>$zi?a756Z}VVDX>SIpd0d%OTy4uOPha`imWueo z-d#0=&+IJke&nYkuK@Ski!xi6q_53k01jLFw90h5j zQ8{b*_L3o?-IrZ9!(&ZQdo4YOmsQAYMFBfM&aNb|mEV5zzkO5{c)acGeb+C^YnK?5 z{Jy8DpYJTc{qDP}QuI(}`6Cwz9r*~1y(MF32HO~qFm;pN_=8;(m^ai>WOkIar+He7 z?b@6UaFW#OL}jx&?M0zr>xwliT7$(~o*Z2L+rWdUwbEE^GJv9>*zLRey2C z^43zFB)esxCU5BsFHx+Q3Z+7uR+k>kt(vp$NY}!Lx0Y9Id1T>T|0q%h3+sKEU8OcQ zR}hbKV4TjHd-&EOV{{v$K1X?ck_|erCqg-EVC%E=+*^m z9>~t%Cy9jSKvkfvW8vK6$CvjgJ*6o*wIL@uRnA*r6{1b;&1;O3^z8iP%muZnWtm-a zo?Iy}N)MIXRhFj@*yYS=a!8hi)H8S$^l=&RjT{AglJ+u4$JmV4L3T&nEjl$k6@%U% z&&4^)G`qEr1@)(mQFNnGqvvVf`s%{GTvY&4rC>WX>WT9*CS>#z2S1quy+Exo1- zb~hr9 zK5WMSn`vanJ}fR^MQv{uw7rDL$=;0Zg(9c?a{y9onG}mXp&DA8y`(!gr>odb0Jfue zPF8kjiGvLi2bgB}fq`dtS61$R7Q1fq*?~}K;Oyr6);_o_J$>1OYq4#ePgDOndye|| zGhJQJ0NJ^-K>Bni%7swRO+5J+#G@Exo5;&U8lg}i^O2ipFn~fpBtvy#S{ozBR;Js= zlnWEx^90Y9QJ#{MkNsqI)?--V_SbhUylqjs!B;V(+TUJe?VgKD%=mSm9cgg4Y^;6a zf|t0dvV_R$EH-DqIyc#?&eT0fefesC-oU-R4+jGC^nPvevc`v3@66uy(JfgSm}|y{ z#+<%t=f{6!bZKDZ2P}ucP_83E<-_dJI1m^Z3g*u-1WQdtJ;g=>3#S&9RI6-izPoW* zA^mL9$oE7oq&t<4dy(i7UBIWaB}kiV>>xknzKL3))~QNqsVkK4O5oybe*EikM%{;C z|155j(POCP8G;Tc{8k2*iL$dEn5Qy`Ibu&^0q9YsNM$Ysg^4xzt>I*wBECanNa71! zRawJHeh;&+;tcULq{SYK51nDd+(^q5Vq@AQ;0xkunIqHetSj{Kg8N!?I?V~3jp>;~ ztt|~JjY9<)55f?o;3uWk_?tWQ$*vCDw*epVW%%wnD_R?{9btD#0nLXvn1`_=y&miY zz~;pCL@;iZt(~*(y1Jv0t_Z#&KBY8Z7m^O>Pq$NFQ$PH&i0MX1ndz)Lb?#iV4V7A0 z#n8@u(9R?0l|W0TTU}|d6Ui*5wE4(}NV?{1z)d2xNjxX3tHiQ>{rsc(9oZTfe(Q4@ z{qj`z3-MxM0$1a;)E!(_B=a`rRMu+JimaP5+}QhMf!vtHGv?0p&un}V&D2v%GJINj zdTzO+W_b_U!F)cC|NX&4Z08wS@th-_?%rFM#-`Li`I+etKnu8P$uS z60_uYWNGxJ5p1EaVz4zMY~|^#g^ex68&5BOTckFMdkZ@Al6S1@#csYLswwm4%urkQ z_IKVe&)^0`0z)pHjD$?IejA7< zY}PFtzFcdTyOW%umOa!b7of^+Ilf#e{cw>v;EPX7p9Wl!bK0RD=Ob} zek0m^5%N-P%sFwy$8e6xV`dm^nUGmV!E6>rQaTX366VMDpFS4ewvnIgHDGG4R4e`@ zzoLBSGXtxh*rc@FP^wBu&}L2_{?gqQpOA2Kd|E2y*1^#URbyBV9&nh!gwrRlu*~6+PbCTB!2$U zsx?h106D#UAxBD_8H0*P`4r+ML3g36Q#Vk_FLXxGjzj;dy5_vXk>}U z4-HkXYj*R+BAhE#Mm6iEx3(81P|tv3Zo`hpmSF<1MlYc1_TM5SzPcoebI;t~RkxzG zE+wjGfK>tWqJKl(E=PH)c+&h*96~5@7^yOw-2F2DM71aTGb^$dAMMQQs?C-wvTNsL zb{<)rRi1T*r<0S3@iv>zoLOpcW?4mW`ew~?8cH+GI-4~ z-m~aFh9dj`*b4E%S>M3yWCOEqJR$>I!D@PqOb+L#sUVbxS#8L5fp%-_=2`{8)wm@* ztE+w_w#uq{_galPayQC@(YsMBqZ9GbyHO(7m0?G#d-GJPy!qAt`Omd) zY{@}K`%-cEN8yYQ3|V#Vw1$w5YQ{F_Exx{~@5I^y^2B@8hG^Z3(2lD+YQr~B-{Duq z)V%1wVgGaNehQJF`77+9_n1Eeg~-S8sr%SQx`qZ*DT@dNZNPzEn@wM3LjUsT;VKX^ zhzLKmI?)j)n_B2>EZ!Q{kjf}(X# zf_O0hUzgCd143iP&4jQr$LfXjc4{=yVXB6CXpgHcdTBv6U|MD(msdf=V5S&1^RetE zCH0BA$bU3^)K{#cK2bJjJq|XQngS{LT5A7Cj#3%0s|y@k!do5r8eo%^IzOcLYxCT} zCX?R@-c2!wcVbtWQ>ZkjAM4Gn5Q}nCu~fU63Z`hV&hXuu6!50m9{wOTS0t{;g?KAQ zz9TZpbEu9udW+>)`D9}A1eCNbx-P+_8FkJ7yms|-JIm*E`kJy0mHXe^UUU7(c6i+E02qn|kyXy;M4`9*UA;C_FeHN2O-8bC?z-CvpiEs*#fMQja|RalBGzmb?l0 z=&b^?!?z|WeYeFv|BC#KF7xo+0-ZuYo)})^UzwlLZN@v%`zS1QznFehmJArfB!Q7j zzPI}2)Z2;bWSjCXbobBIjvN)pl?JW^V(VyAAw9rWUc$m10l;R`8+T9)8y9 zHfbJ4b%Hm$8r0w!Xss(W+Qs=VInfB*a1 zH@0S%?}4Vvo(BGu);t|j;Rl%91M)X+E{&IITD(U8vFmA1lG_{WNjTBF^8kNJ492e0 zV_=T0FQ9zFHD#TEkd0q&06pBw!P~mKj}2CGaemdn(K&OD4p#BOOU&xR_$3EyL(j1# znVCzD_57~$rUk*^f}1+AL1t}X!h%CYzkCyF`#$PI_!{av;`%W^H}W0S3k{=(@yr%< zX1b9NMz20$`rt`T_{rq5#yNqCqB@xHI>njcXNOHrK2Rzwe3jz|ZVGgRmrRAtUI`RP zTvCd85dYDr3V)r_;%=XbiRsHwz{mxN*LLy|7FzIUtR796IpeRb!T(~ualOf{ObE4G zsksv_uOWWFVksNu5+@g4x*>XhO=ji-7bAmQ7K@!o{wLU-g!m}mJQdK(c4 zhD5|k>cZ-epSfje4iIGR`qN$X&5*@fO+ujmo&oS@%GA6(J;8?E!{`v_)5-Traz6d( zcMvuk{=_kt2r-C5=rrDO_c8q~6KF>N;_icV|MYG2X~3UAdz60q3=#5$E93wHg9tx0 zRSrNc#EwtxHQxIJGFIk3MD{gsd?Vn{dLttK9Q7NK+(SLR-&rx8DIc&n=vHmZI)_j0(3d7Ru!cLveLm zsOiRm+QjfY>{fo&itA^#tf=BB`1dAW}>fmkR zN4vWp4c~U)tB02es9%sYgbVEj#w9p}vh(XL0ZM1@K!0)^m4RIKYx_DEP+hLcCz)b5cP?IyKVQrli#XO9K z+rcSARxQ+;jO5`@u$Fj*Ety*C^n>AUhpb}m+LAfPR^&rjL2V>ogYXTk(azw}rK!|N zG^4LX#Lq@GvZW;&)nI79NNp$FR43jLRm)Lb4R0sj|L7xX3!|gzkrDDlq~|ja&FoMj zlnU6KC;;rlz?%>5>GDzE*_Xb2%jme38VwhD5GoJ6+_XGB-V$DehNWfchPdB!g;*S* z2Z#Ug?NeIxJzx&tf%~ahQ`>dYt8cvV>hB;dRI6_#AA>&2GycRC2_NS~RtK20Gg7G! zS?JpmW^diRar5S#n|{~1YnGc(R(34T?Ynm%w{q9BtCl}=bxqdJKimeE@(8`-_`SE^ zcJHmX-18uzVCOD4Fw0ixQB~}GYQ^BwJIX5V2KY0#0sdQ8C2F=hGBJox;mAcoPy6DW zNo!R2w2M;)w7iRDq_-AY+|~1guDTqPCZ|)Lla}4Raofi3?227auUd0%WB#%0QtGk{ z-Z^__fp;9HQ`YL0HD&z`IVx#(Wx*yJ=6QJZ%Bb-A*QjX4&O`*|y8S&_?;@Y|nfwj>0)ZONs zlq8`w-@}=E?d%kht18pqoMR|ldZ3P)eSb}nCe19RzQUfQF3M~Hy~1sh-DNH62pGzX zfByFRUMRh1c?A;z48lm=fib2F33fTvLfL)a5|_3&9Da%U{_H$T&JGv>U(0R30s zW8!CO2Ku`prgwz8kN5yS6q%dB9DrjPKQr^?;bNGM;@05=o!z6xi)_iagkeH{OlvC2 z4W+=$^@&HYL)+fHd!36zWgG2qV)nHv1&fp9tb7hg&kvua@qzPPHrg{8otNP;^D><2 zOQq*!c%)iCIxmwjH_FjzKD+6`q7vy5Nxrl3n;DJ*$q{Ku(F5Nq3w)OJq;Fp~W(rSB z{LYeZ@|_{cXGrGgStjHe0B_yY1klJ6p(0vx7}09rdX`8Jwir zlJ&r*Gf_M2X*^+eq&LqzaskgJ#0Y1}Sld5mtkOzHq{y7iO1qlaDOq0DL+iS3>J5l& z1)k;wrK@hNOX=;KXD^4-8)v8{b53{9^1;Em3p?5ZRROb5l*Gqx%qVx)_5`*0IexMJ zs*dWxMyJqL=xtYMP1@%Cyt2DWGWYL{W3S<(|Ez-P!=YaSHsONAj_7d85-7%IM>s}{~FCxBd zo*{M=xX+zka?@-_de4E`RO3_-&omcl((MZBPvE2U)`9$r^|QQFAVKYn@QzF-2>Lz% zMrIQ(lODIvVSAk z#pD<0yf+`sGs84Iiw@%#5sx%CN$dsgC(bQ~yz(PnH83L&O~IZqNQf(ubHM1c(AX>< z9lv$-jp8O zQ_G+|w)O~3;dc^$UbV~MOp4bzv-s3s|4J?VFSUj9nkXqA&bUhR>)gUPZX&tIWE=hm zvjXYs^3ItLc~b!AIj9GY%@UzGGrdY+y?hD2{Lnr39Qvecpwa1U9H{#1#<#9-Xt@5Z zjbDtuxS#vzt+zhLW&2w<*4A#EW9x*BaSU@N!hn zY%;3%QIz52lKf@$5NLw`V>ZJx2;4G?Gcd1g=j1X|G#`#i+@m!r(n6G>*shPI=G zI8XMB zPj4x#+RP-zV*S@s3{gj6j!BiXUsU*@++q%tnPqqM5w+Vd+nzj}2! z3Y$%Go>(E~?cILg;C7i(CgjuW_>sFa-7)K#Y4s=DFMO*`q@l{2R2&!lsQvN8J1&oM3H;S}W?b6RQfN@!LM z53gD^JVYH6RIj4dT*T3uCW`o`Es1%t~${7d6L1IAd5RKNU-|McLQ9J z<|vz+qw{tjS%3wBHz6skEv*Bu!XbDIU#63cC`<}I7;q#D<0IuW-RTQv23TP19qLg+ zK)y=rDvZY{l3C7}apqNm3O{zgIlC$Hd~%6jjm}q5l#J7-zX#dWGk98h$ya}w|HiAo zZLe%TcmI>~EBXrz>8Yd3iL^)m=YJlh`4^5lqLz&Rg}DpXhDJ234|@gialZGZmj+|= zeEH?ebmr`<4aAbifPnhvV~mYL1+f`>C+gQmyMLrAC#_X7QC4}d&z@=!+^E$g&stSc zv1(SbMth^ckV3M>_8f1LHZUXIXiT3G&?b3v?6mLRO~fK>7g_#`F!!pBQuZdL!d}=B ziL@8mmCB85se$-}r*at`N_(bTsdQ)Bl@6mz#iQ{gN3eG|(*FZI*(-(CtYnWiP!mi@ z2-XC&p5!d65Vi68v2Ve7NIQ>-W((C#E0WOoG#?7EM=HEiD0QmbX(nSDvguDVn$p}V z@{ZAG+s=1)pKrsme)`0i=2EL&@J+;}Qn?~bzQJ$t3i2Y$i7WtR<70ym0jtvy3!Fw< zmri%vD7DmgF3M}#+n44ks4WSQsL)LmA_?OP1WLttWdyo<88ju%t(HHnl0U})EG5}%P(JnCBm~B;`uA`X}EsPVO`;q zjE_q?gg08@L>ObFDC5%y8;?%L1L6fNT`4tNW{1)mds_>*@rU&p>c{@PiIi}yEj1yz zBWzJ8@e;HIFiyh7gm5E<1wv=dvg#R&Ya*d+@6pl|HQ1bVDo$RMn3S2G@7JX`lw5_J znO|p7e+KJ-5$W+N+VKId6{bZ%;;fMJxqOo;fny5V6$(e#STuZ$Su0iHr@%tCnzpS= zMsg1AXb3SSx*YdgbS;(Da)PgLh@>{DSc9LcJ$J|9Y+t;CuW9I8mZ4AL!8&H*`@k|b z2SUwb$%yyqJyHl4dj!I@fGoPcEKo(4!*8*t;J4Q3x9~Th3;l++sd)&@0m<~>^cALO%hcIOL zTq_ncu_~58IA28JC{XN`T&R2@m(Fl50AGwj2z<#d1YwtiZ>q-Or*Pl?IMlz=r1{)Mf=o{9Mc4rA=m zpRi|MrQw{1%gpz&^Raj5@x+mLu=D5XcPlX#`Rv5Im1Ol#_s8CqQ6J##V{6bmQeh6^ z?IT}oJ9(19Z6E6t)Sn5&E7OJCzTy?fTU$@AC@x-cvbFX2iejw3_4vx7qLs&6TaK+L zDq3+2jVo{%yoQUe_WN1-K#|i`955IH#V%)2K#$FE76Sge1^fzXDc4T4(n8B-5pH06D{tz6Y zUWQ+jWAJx$Kc&NZlHhNO80$Rwlx;xTgfhA;WaKMS`9h3VGGT6M1z(m_2;v0_SGvuX z?oz=ijN`l0itN7j zuDOw_W_0?uFr{T}RZ3T9r!TvDZ*{h>qq8feYHe%EqIj8r{j)eHMGZhFu#4)1^d48# z){^-YX^>dbRFrrnGDrb1p$D=;eQFh&FHJJ@<{<^vI=hpdW zG$v=HbnojLIG>KaotT~C)ylJNp6pbQR+RxhF~~J?nc1T;`IB7Ua7lYs{brYaPVv;} z&P7?S46i*gP%^uq?pnKZuqtwE&;a!5qs+gz}EZg0;nD)r9#chwYqjtW(h{7E~mV zz0${Z<&ONOl;#^Vv9fO+K5cK;7dvO1T379{k)py^aY1!7p?A}VW`|&TDiS9Gu*l? z$ISC-eO84&CEsR9OUtxSL%F-lRJtu+&xJI#jfvRhWFO@B*^nkjY)wvEmar#GFQ>Q$ zhLw{Jq0xQ?G2sn8-U@Esu^Xh%l(CjTWo1WWR*mLf)?Wcb{GgG3sD?|cyOVO<1w?XQY zgD>58(?Dj|ePbsFAG@wLue2=3Q$0T?efh$!Qny;k>}f&$ovnrao5(7mTO;a^J+TkN znQDEG8pBRgN(UGs&?$U`DMt%KbRtg>TDhnp?e3+$w+`o&TzjT_@yT#LTOpPhlJWvs z9r+e(c4HtVH_1BE5SqRHwqN)4J$`!o>=3*^{diyBuWy6*+dFRkpY@HmY+qcHlvJ~L z`z?))N471jNyJ!^rqasNwP$RF zDRjgOELr}+!LI9Cl9F0?&F+5}xUQrE(RL-tG@jU-O1P#o!X+Q|d+?0EVNq`8!WpU5 zhxo?JZ(Me%tPFH4erpu5%Bc#hp56Il4j31w1PSo2?^b38Y zKA7HT#)}UKj?k1Gj5~OvN+#SS=941sR-r;pI+aj6)T(6)smfgt@>Hgq1WJRniYE}s zL}razEmgRS(`|)8qg|hh$nBxtfaJP6qvV?HQfri4l$Qh-VL#DvNS#-U;xSd47Kb|4 zmzS^a2#1+#=$zJ<>#*ngwD4+oz$?*Hy0$$OYF}Ggd@cIy+CqDtFCoE~XLscLbvi$7 z*Sv`JGNC0_z&az0zB0KE5cPKBIHNHYoe?Hfo+_fEl@~Tg1$Lq(n3Gw8Iq4;s{N}{& zaIh=!@HIDU^$D88YY!%MheKV7hoaBeDF^epBf4^3Z~P5O{M|GD@S+As}q1iH48Q>+IHT*aP56Xxk9H>?hY3FmfmOpPr3}$ zaty3<8mPB}A7;%- zx|7wePxThPTvk4-EqmzroJDbRJ}i%(ZJLR6_F@(na!U2MmyZ)?4)Bc8r> zm5f<;MWZ=F@ffAniLD%1n2=K7>`tpmRY9h7+*Gz_s3d3Ay-NhZu4|Jnf3>VC&MZ@= z<~5|*OLr|U%36NcB0gr*w}}Uiq-DkH8hceN{IMSCH$}j%OuJ;WoKkmZ0OIv9Myy zLTHH3S?s8%7)k>|qSY8f)Xxw?FFI7%oOP>v+Q2uZkN3r6Hi&=A;U&3+8y{a2k6ZO^ z^4bmI+&G0yXmF;OGD4*Rr(7?_8zmR^Z@XP@sjK4bS3BR1Z`k_a(89-e&m@njoPQA( zrZx$M@p3tLw2Ram)X_6=D20h`C=-!A2U^unQWPDurpS)*4zpwoFbgPi2nDII+TDqR z>BHxi)voU;Pw27cYGqKRH_z(>haubClagpFb6^!Bol8AZV9xRBp1{snQoiUsyS~C* z(iO>-5(cF`LAZU@m)&aD(*^T9TwcG_VU!)^>b==+fJ}KDrND%;rk;#T(WlYUN<}0FpV_yIn z^&5~&{pJVe0w0H8wR-s{TxMmg#UMSoARx2SOFG6zEWr4AVUNEOcm@1X%JqkO1J^su-1zsa zh9w3$kIZ;Elbh#URJGJ$;>JG_ct-|5S(44oa1K?!QoYEL%+AI;sV~5D^Bi{S3vZ-` z>KE(m3Xn=Y?N0=Uyy03Php#|^%R>!-gDH0EDMt6`9Q%$qPF#ES*may~D>&l#tOL(4 zS@PWe#>V~6Em`vXfm#0!HZF)n24)6>GY2A(1&u*0vi;qIb#({d-M-_!gSE8>-`g?& z#t>(d8SlKPRN? zx2Z|}0^mmL>jpR>{T|Mt7+6ozzG-7-{7w3K!x(x_81oZ82p0nzwdmP3X2eg!v5J9B zAED=ZI0wg*GvV{*IOe?{e}R6#oY!~%w(9C__xH_va9hnk?FAiaC>)|Kzb!4Tqri?uZv0?hS=qi1ZruOD z4W*?we6at@wi<#ozXNF!p;!dS>>?O#tbhc6XXMYo$$rd`FRcJapSl13`!P#y(H13J zI{+Lb#mu|`=WP4~*hYSIl1xX{0uw=nVtX1BNB0~ON@{$w%QvzVoJ*|<>(t&nm%rF= z;>W3VY$@mZ_|oBH-OX_L+Y8$x)Q{l-=LZ4H)*YbPT~S`?wq$uU3BD||T8&}qhU@z? zL!Fyyat3BMC%qCcWHB}jX8bLPPvN9f(Wx6^VWny!_>DC*9b0E#e96!)-5od0Pa7Ou zvm$5NnfbH#FR9ZFCuaynN$F*YfteX5Q`xe{%>HUmLTZuQUz{4l9{T~|6z*78K6t?8 zxNURQ-bDq8jq7Ko$`yKhj#q0)tM)}2LJ4PqCQuV`7kJeP$=Nh9^jHCqzZ9@92qt1K z3QtDI=0KAUM4j#wY>$wdgR9NjYcGwyE>J5(m>gUC2apPmDPtyiu%@YY-toam#g>Z;a))~xEhW-y zePBsZPFKEp^Qz=-|BZ{VTYV|iTx_j0d%^yu!Sm~iwVrg-9F16RO?8*e&04ThCQ8Ki zu5pD}(er8ohhsxF+0QG+&oU+q*p$=Zs1qAz&FsjtSo2#WnH~97b8b5(Q1TtEf$AHE zib~f1YQduO*W}mKgNU{``K^21r5&M+_B^w@u-TtByTpk-1l3HLJTUKYU*{cb%Zk@s z7@YIcLU79JV$OKs`206)7dbk=L&+y%b{=#XEd1Yb{Lz21)kcftA|{ZzRHHZOlZe6P z8o%oDCqk`UfPZ1l)LN}K(0Xhw9NVA5v5oSC7se=z@maF|`53E{JxcaVneRr)cT(Y{eGkejY_O>I7aysue zXVm%@4h=2z)n=G+$`~lNyDBrS*33$my*OZ`bnY`N+V;;&OPja9ZN(XP;-SInt#i`S z=4`DVILyfDGAN5agtA9MM@Ngre2FgCV3SPVaEcCPMnMQIT@Y!^Fj}%^rUqwZ7=aHG zo4mZFc>DbPqBVEV>p!zRSLMlfQ=iIn65qn!TfEeoJ;NWKnQpLT&!Cc2UZu^IGUvuQ zttVC$=PkRnJ9ovWCx8;&QJ+0=?A0|XDQjLm z7QHg#1}?3zwd9?QeI7H9AUiuWldSz7!|oJ192P-2IEA*I2_hk)-z$g*B4IO_$D+@0 zOW>UCfcRtJhM(y3Xh@Hne!h{JPvHB0@(g_5FGJ61V_)Mx!8slSH~kSkr^5Fd`uV`y z=o!xZ1c(0p!M~zDONH=e{Zji}F=x!G-}}ta&~NtC)$RGs(9kn`>&KF-d&8lgDzCSy zClv0jPX6zjhtA_o@L}6XCe0hs#tBFW{>UGI9ls>C8rAF?@W}5TdE^niGBtFski!=7 z2Eoe9bPQ<}chCdzpO`!7Q9oHAPnkQ=CJX*HoI6Yk6?iDplwmYPs{NkI3|E{a9M~k9 zweigC-aA$l_-Y3-s7HMriGTIlZ)(s)l;GjCzTSE1!P;S6|FkevGj@U z6*^zGWxmDaFnMYh=B?Q3@L*5O4;9ekt^?9k6peAs$Yn4|E)zxaxY7TSd@{Rg zv`S?m?-=xF$}b2ZEGKZAN2yOorHPheS$-<&# zY4EoVblKVQG6no@0sY&%#(!G?zbmK9?j9S9mgT{+F1qX-)H9f}8u;5by6m3u-xk8} zTIf3N9mlU2epgGEogbs3WesC%u?n!6g%eMYe>azvk40Ed!?I^4%EtbPMSu~OJv(0J zqYeT)wg{HJK3=aImKo`?H^xR$87<#_fNk~Vf2R*)1K#TXtgLxeNl8`nvaAIRnrWE{Kl>Cx*MTL<|2SrBK>B$<{AqH=;g zO`?hDSnCNonmvu zq_A3GvuN9OtRJ>DiFQ5cePEms zUTDW7D!jl-oOlU5AQffZM18DEAcUayZlJwWoo1juYmS$nI;9X-fj6lTqx=7WRX})2 z(`1)py6B4Oxp1gUWj0wxOO`RQY9OzCxjQJ+h!c!%qs*q01bymM)j&Sjm>jtc{0~l; zGwS_WJ!P&;cRAE@#R82>my#;r>cO@OtDi;3ll%eeg!S{0mBUou!K>)E%#I(J;mHc5 zq@;yw6=97w&u*>AaymFF~$S2WDi1I!hB> zW!;&Xiz4qyRLF)EBG3fuj_I=a6kQf;;*k`=mnJB70+v7{qFxqiu)lOkbb`?@;^dMz z@Gq59q86=*`J4OzWx$tozNCz4l*GS<@=NE`7OavOTI06UDz4$cmmEa_)4hM34Pvn6b$+^O-p*}47k?Hn30;^ zqEXdHk}4xcW27=EQqSnDrSQLch-Vy~y;eRRj9hkA+0JaYe%<8_hTZ;@LWxzZ@M-Lo z*$#X0oUH8Gg;t@)q24O+>rY_Z?o_`w5TG8D+vGg1E>s)v%qmQ@{f z8p(1TS!L38k?@=D=r=o~-z3oA+>N6enYr;!!b2ROeKw-Ik;qb;@KD#jNUZ~#UIbgP zBB~eM@(?&e^)bKMi51~v*yWgg-A;VP$aUCd#y@8v>jgqb^doq79&qwNga=e`cpj$i zq3+rYW>JrB0wthm3-uV7`4X5x-MtYsfs#$sqo8OL^%!*y@k=}Fb|Q&5Lg$T2V(I|X zPMIXrp4;))Mp8iSbhGE_&k#%S;#m9)9O!Rm73C9|N!UlO(L;{?E0()yFSWnqkTv+irD4j{o1>Y~au;?}HUuPfw z{PTy;KJ?K?55c-_0dw%b<9}iq>G;HG7h1&_57C;SlM%VHpDD+c#w@>;tCs~b^G%`o zeY2BHS*cczO%}{4vW5ocb|w9X_xJ{(Ld83#v8(w;hf$=^@DA!+T7l7Sq;C1SHw+)# z%z6XAKn&6Ls>s%rMA0Teh?WbINlFt0h5bz?6v|J<+vInGbv@vkJLR@`MwUDc zVSYFT=5*?wMljJol?lv7kf{?UC4%{V548yaIwcnhWycY0*iKu38@~+497)?QA@8`$ zZ;ZC#D}fs%ARg)%`<$&N?`H{UZ=0wt1Jwl(-BqVKXTp$0DOH(?S3*5|TATLuXW+b% z?{k))8QAs5SzCQ;Zh3m;z0}`-JCNGG<@D1F?+5V@bdZ=sYWYC9@lnG&*3s$v;LanO`B5hT<2?@DXZIOai zZJ|)xq!Msm>da0`%yvpONttF#CQ9&-X)(hqEKf{=7XOy{~L~jXL-3maN6cyO+Os)6C+0xl`J@z11sM%f)IW4_MS)_~-0yT0@T= zJLA!a7C4jckBR#Mo{BG?x1-KB!y1oqr3Ot#ZBWPF7+=)Cy*^rIWXg!Q=G{EUCzAHZ z%LJqw*)6T-S zW97}-km^mnSH|Uk6vvY#>)uj@wM~pJkxH;>NgPhxR3Z;N8~M4NZZWdf7_UWOkkz>ftO|d(QOj4osSBv`_my27$vn-Q!tM+s8UglYln)hl@nk+n zwJ-yK7bmtU5pOnAr=z^7aLVu-r!fBL#n`YY*jqNTK;}{+hHZp+JxI*PW{@8u-+g)? zK}n~_wT5UP``CQ*pg1{_W9siI2`X0vZ8|d)?Q$Mp$RSS)6hdxIR;X4r>mbLbQ0TaE zTmdq5X8nr%C)UmhF>qu4u2%s5m1%kYyoD%bnPf%K<21>P8U>FZ&tX$)V^vl{qFKca zF6JaiWNI#-E8s)<86ox&Y3v**KbcI5Q4D<)M!gc{cZ2fn3Oe@B{34B8_tv>b~QdWv^br6?y!o)G#%v z-%h3qCP5WOeTwq?K^pjo1{vynH0K*pO7AJP4eKisfBagmQ%HCnSmQK;$Q~On@neoq zE?7GgOp;{s33F0|Z`sk#_Aai6mg0=F* zNxX@h0r_1&CClfuTJR?7oZP0{{V1KA?tz|d^_Ju9-QDfSt@T^E8Pq2d9uNz~Tx|4r zi4}7*vT|~=GUiq!GPq;ku^+fP?)XH8)2X~e|r?ABRj-%mq5DVF^d#f*EKO=4ff zaG%J4%9~!zdvr$Br?=>B66!AS*fiuZo;aTRnlA*#X~?r!G5k3Mlm^N4uIa=m@PWw# zWIRH2v|i9KF6`kj@S2A5gVm{;l8|BrI0Xsp87G%*;MkOMJuRd2)kcLq)ex#v&7#vh z#z<%S3DR2lvv|bjh%4}@ojf-rPnt8pF-U&Tcw=ye+4Nk2Mr6LmP??pGWKwfNO4Jmw zW{I{38mG*e(X@t^{cKjzY5l84!}H+PhwjuK2S1@PapkyWeJOkhpuzy81;w^K z!cLnS$8LO`9!)YvC!v`dMv{p7xgmQ`+=UY4O-h)Dzslj5^1BPd>C=+y-3j97gd_3d z_=4hhN;adMc@w$w$ZlnpDQjVKp|tt671ILW4$T#$*7{eq47~eQEY~-V37r#-f*@}qB@%5(=1|*)~xm-rerM{`2PQQTnZxEJ&f461b4t7<_t3nV z8=Jk~H#MOsCWS>b9>fV)eZlhP2sx_qHssZ&_wSvB5=C^*OHalAdXAgx8b^VSn~V_~ z$XDT=7|pIKw0jrL5Kq?)kavm2H_d4(#Dr97Cb*Y>z|JLhM~1g9?Jw*1for$k>=()N zj?8V@*O!*N?DX7OEB#-7`Tg9(_?Fs;GEXYcSZls<>!XOAy;R`8B#0 zuSRcI7Zyn$La)Hc~Ue>v?@~(3mH%Ae9Mg&! zuTaL@h<(*2qT@i(Ewsr~Ra)vSThpBSoBPx*n?+{eszvcey*bq)DQ~D)5cujIxfR2A zB?Wcd^x5l6s9Vq7M{ot)1zHhXXiZN73#w<9eWy{||MKw+epwm#W6b z5$rj49}a6?h-$W^Ct>XqHD`LF=%IFK82dN=3B)D8DkT&*d7-+OpoC?Pq|zCa%D^1J%mfghnnJ%sJHYNIyI)EV#=LB|lE zNPJ8ONEuIl97t7xx9H@@5AGpNZ~Ya)@APYQqm;S?p`jSv61uXm?Aq0;s?F=5g>x@-Md?r2dZm^&qlA z$3=J##E(z=WlqlUO{?PUsi*2}&R57Y19@m*%a58vs)nSbnC}Lsz{X z^psTH&YkR+(Q!1$;AVqu5`=YzCcH8K3ujC)D%Qm7%!%4r{<4{6ep_*Go~67vTbagI z#*0l(zuE2em(3{iTMFjnl&o=)?DSf^$&Dke_lhk{6QSTj6o7fxpia4$;Zav$iVqY_=#r~?2 zQ6~%)PG^My%n{RP3ToK)Uqe{qyGAkJFB#4ZDHJ#;6X4j_zm_REJ1`Pk$5u)%eD=p* zOC{{<2rfCq*FN|c{D4gGFE*e2y+8)mgLyo`S8=kqXVugx)P`eU!#bXYb;uc8RX_u# z5suoKJp60wpLb~V+}V5?mn-GZ<``9X5_eOd0VTMkl0B*QDOJhZCq)SmUl)Y66v9G@ zMv(bk^h^VoLuPC#k4rrQsz!gqk#uAo65aH>?!fZh;vsirLx&+3CtrP3MH!z=tI$QoZW z2O!q=EA8W^?{Hww={4LuWtqsi4Zedlpm%f)RMFJk0>J8q{qqF*Ak*pwwBVey@&x-D zmz5gs;pZ>LTht}#1gU^Qmu0GVMD52k(hd(eQrNb!*AZuu62>79+jfC^92EK}@6lsNSyR6O$fG@=Fk{=OU!Ok@im1a!!J9|X zH^fS88@pn{E`WjZ9kCLGQB0~`5XPP;4BGw>xqOU{p1nXFJ$4L)sh6hVVr9-Jv2C|r zI0e3YnR*F8%ARit)2FR@2L2fjxq0g zsC8K9*cT|?FB!O+Lii*S2P<0z*3J@rIiW=gha4H7RV`e6!jLE9$w>5ktn1X>GkKkq~7wb zKp*7)3zP<1GKTUu8?Uz3nwYyT*s|+A-i92zJ*UCzsn51;PxiR{ewQbi`Xsq3Y(S|v zy%iz7K2+g#rlvX*Q&MPIMft#|5LXm?EGnzyw5Wn~xT%xaKgJ%X`w6x`>}@mlk2BQH zJF(}ell%4oJ^jr~^f#vQe0;GuBy{AZK$yO$QnLZ}4@0=ZqBX)l+Q^J_r7|DORVwp9zLJK0L#%!hDXfrJuz!qZ+zD0|Qf~pzi4(AWV!VVi zoT3P*%n~#B>X~Owj*epZvu6*0H)&eDP>z2-_82-#Cy^TB;8;+C8;8|_>^*1`1I%7M zAUcO9C1DqEw+BBb8mxlYrWMyVdc#*c=a!vSE4${O-ZOu|k5dAO`Evx8G z#EQP{z3HZ2a_+aNN8y%yt2MtRZ1wxC#Er&`hCrY` z-MH45l9G((FFR3+{lxbD%>2d7FpgM+B`iVd218DOx018u@SC@7yS<+Fux|!aqdTaF0SmN08G(C_nAx9p(srTD&d#QK!_I&#d zL(d5OreW;4Ni;Wn+k43OH$at#tcf!+Z8ZxYS$U z^gvFh=Ir0!^UXJ~4+@C`SeRW$w-qCrLNS2_3Q-%y+KZI={3*V5#*F$vpdo`^yDp%H z!5_x{flh45Ux@8STdGeE?iS7kDsWP$6(%I)d2)p+UR)DF@|427#9W>fWrbKDuMj!Pp=3Em zZNimfAJBVGk#V|c2Cz=Lw@)(0p1KW}1F#mYPNz-K>HZwO0w;2fRC^2DDJ2R;af-Vj zS))mYPsIvF3H5_srP1j$Dt+wwNrErOX3Oy<*o{W}I)A|J!cLY#Jtw#sOq zY3$&JwOSE3cVs=fZV+Y~U^;KVjh*T=7Af zi0pj(h*!CdY7Wz!>YZkC*0M!q^}KWMbs&`NO~ej2a`0R7rX6TM>P?y7Q7$G~V&tOemlD zljIZp%T+RR>BkN14KaCiaR`o`Mxq&Gu}k6iXh=ra)8R-g60l@EWEqphdeWgRm=E>J zIHg+ckW=0T*`Csrgi@uF%d_Psm(^%;1{;iewNb5>idAeg1k(Pc}{DoR=Ei!$bKpZ(M(pY6uvsxrlo24?VM#MH!`QXW0q-Kp! zsDVYyb)1%5NDHkKO^>%Mn|y9i9%)6c;;oTL8wym|7V#z~dXtlq*d>;{w)FJ&Jc}i- zJw3fG&qD3YDJaN6{}|qx1N%_R&OtgHnCP%6yZxAUj!?|uCgdhNvl5j@^*Xs-!p@;A z!gz(os7ony0w49d-Ygb^S_US>8~gzAcCjYKo*& z(+OlUOf_03j5p|P=G?aQaC?D6CjJ7^JV?yOtgvncYusN2*|LrAZ~?YD!{y9&E05|> z`yD;X*2p!e@u=5c}w}(8a753aER)$3g+qSACFYZ-HZ25v@FcXFL0Dr*!j|GJv*U(=~9CzKAs~Yh%E|LUBRbfQLbb_vvuM7 zCIOGf;Ftm1HUxQ8Ld$(TwjDy-dj+u2L)SmFQKG^lJRvENWngL{Vova}NbrcO(q2~g z2wx0gVh z$JT;<*KSurX&gfXuKAUtl+uwpp`WEXl!WqHu;*Ip?PztnC_bQfqJYMS-oNUn2-Z2M zM-;JGoS2C=bDkJg)d{pxLc*6>$H#U8LqRlRoyqtiV^Xp>UIk@=)t4MewkBHXuk!=y0UjEbZ{l3F0(#|tD$&V(kmM8xL`L>z$&Dhmoeo6Qj$4RWoNAIIm(cx;@* zvFg=YA&11-9KK8^H`tW%90AED01zuQ44-uqtFR}?-_m0^cDffkl@9@tB*84PWO=mr zq_l6FnFeJkxyj^Ga+FEAuA)`#AzjYgXwIFtpst-5)wL(k81c>YzS>a#f4zU80H16i(z5IFYpwPu~67&cc%I&utui^9PXoTcE3%pQF|1&#R>V zil49Ccvt7#d)JraLubGqiZ^Nv)OC4%ZKa;kf1)-wjD1b~nY>8nTuGhc*ge_uWNMbp zd*hXHbneWyQ!9$|mYtdt&6>$=ZT$D~6M+4A|D1~yb@Bmfta(5J8u>hwI^|C)y(|RVcBhKq($1s5mC&bGc-zRlvzkFQ?y#HL~<-R9J+oNA=gAb$It=C{eY zH_fo$#@q7h93~n#yCOGt#n}PsZ$NVz2%j1lc#8V=^yqt6uvXNnV{^#}o47RiB=zqT zC#ZivHSja+1aZn^v51QCe6W-9Z_=Svn5f<;4`BA^O!~;VmEZ@8i_+y}ZFuqe&qveV z0Ot&mx)g6shM9Qlr`Eiccl6D;VK4`5yF~XN>^J;f#&5t4LQDoD|0_h`4Ea*VV}^qVp(q(j+_)|RtYC* z^K^bx5nCf0u0LGc`N;k@dtq04Zc|uYzWc?EwcD4?ac4;t4vAossX2Z&fI9p@&D40XVH%rN>%V#|(B zXLiW1vA{v1VFn4lkGMq5e0TJNrW*${Nxq18olMTdNusljT>nlimd@AgZP9Uxf<8<* z8_{|%o0Xz_<+gbOIhYHcx|{`G z7=09wI;{}g0S@vLWB_|fsQ5M``9@(pI5B!NwgUG{azKv}s&(OI=V23C( zC(M+N08v_Dk0rg_Rl1aJJ7yT`JTGJhsvH1T7{{P>*gQ&oF!CV_$PVg>9C~ ztbKeS<{O7!X%Z%haRuko-NjXNM)V9cy;EQU#&<7B1h5e^z6B1P9RE1 zZ_Dqz*+<^-Q)lkp(98^@CATFlzb!MNeAn+b;Ri+rXRdEdN@`p`6W!OWYxZru9)E|$ z@cnYK7vhu@U5`0|QgKz@ACGP)A$zYgCCNwQ+4lO4?bfuwlwokaL?c7->>#5=1J)I! zjqGZ=aUgRF3z4_c0qoMOMS6Vk|6BR%F;+EoCuf+Bjgxs5d&6j6E!y62YSbKN?Sxih zX6&b~Lj!4P1BbezSNsL3HEc_6bY$gr-Zy&kBz0eB=Y7=49UnKAoLSJcwKbXg=8Ck? zc(*MlS!*}7|9LZ=7JBh-V@TGOmo$Xu?rZsJC5xFe$$!xE6PgdM8sGY=b0+>o#iBBs zt!z=nOE2B<)^!CXyWhC}CF;8?CQR%#dvQ;8MrVO_^hfO7qBVEToqv8^2>?$(u)l?0 zea1xjvs1`8x-T6ud>jx5*j5umO))7%jtZMqHB@f9;lMe({kswabxGoOEk(oY-2OMW z=Oxy!tkQU-nA1_%9$B=4GL6QC!E0J2b%eb5`|L%B+sii%)TxDT9X-afpk5|~b!Sh` zg*UMopq#WDz@F^-*kASDhT#jVa??9kty|TZzGhzKU|qUaW{j&%TyV{{;#H4sEX<%^ zWoSb+!JM|DRJmLyAPr@8MMF2$&e_(Hne2|#WOjAH2~j58m{gLQkhkIbBn9bIHTB)GoCd#~N8o^`kli9vWGp#7 zfOiltUXBniN^B8_+RGQH6%uli!UAFFpL&{C(fu*9-AH0QI6pPzOn7jpxF{rps0$mKTq0K{>;0sT~>5Jdv~L@Woda zv>#oP1LAe5rAe8qhkGlMc=}+H*dY>VVEdALWs0vp-bqoP{Caz3=ITe*<1dYbOXlVq zLv!~&@Ybs2nYj*v#CdWwZ;gEe+vzdLgN|`~Bs6zBVo6saF0`;WKt~;=z8n4KOKYMKaFteJyiG;CoY#`3LAu3ese%V^JkIAIy?yjmEEQj7 z(Ng-PO1q;nkDb(WIxJ3(g*R6SC zbMev@%f&>TTHkS5h}=h4`DJr$Dtr@=VjJO0xsvmC;({7ppZwt~&n16-$dZ zKe49n`oSVDXxFAFd)}cQhlngSXEvlndaJx@t4l18qs_D+PM)!EhysXHHnZn$#$$mK ziHQU7DJw=4Q-*DcCIK=N+JahYZ(D9;+jE=qlB)VvZp>@izjn~q5wD0-s?_OaZJG5$ zW#*)s1^L-)!-r1^^`car??11e>pC%BT6BM{hhB81i!>YkL+o}#8Aw>s6!*%MV)-Sl5x6Vo}rzk2$0q;uZ9 zf3-cPpjNMZbQ`IlI$CQ(s^?{@f4~p$`)fe+tErl%qOjJQu9RkT#heDY_|SktbeQ-{ z29>9p#fN)qPxw7!HSJ{k9qJDr1MD)Aod8X6bBEmnTf>Thldnwl+_JG|u8;T}Y6bU0 zso2>P7;m%|hq=;ROD6smJEv^&VC|#CrANA*D<9tZ#vHswbJt;OF6Hjq?%(vx&h7z* z1HEy?#IN=aDGOOM(hc9vb7aq))`Z?;qQrZ=Q~*y73Xt}l*N5&|e=^$b$|2ftuk`1?~6FRfYBI`|4EM zw&^1SV|Q){g*Mzd)_ZVSlSbVzw58cIriF@aFR_9b_}HKOy-jo0GkFq3y_I zfG=FB_(7#6SluBR^m}!9xMDPe-j&=y9a$xzKS;D6yqMq z9|96zChh8i*hNW0d&I;f+%qqxEQo2Ny4se$;*q;IRRyN5?krwD+H1tBT$H9T@bQ5? z@7>1TlA^(n3~(G;wZhG#E3VNzSd{J(y!^HY`LADL+*uV@x53?sk@9e z9orY`c%ZfyJ;U$VqxY61se$xeDVv34&>8x@(5BVL`*^2V(LAzlhD;o#Y;5|yPUBrp zWH?Xpi=16Zvkw`I^1wAxpY>0K)aKB7#bEF!gd^VyTA|G>l8cbdJa?B+48GDx=kE83 zb8R}pO5Ncz3vpZ`Pu?Nhnp%lU6Fe(w&D zd2adGGX!zxQ^Z{FO74H)zlC}N{$mOY48)v&Jp9L()?@qTevc`UA^jeB_&uzd@@vq# z$=){^vFDD~9ed5Nt>kNUR|Yo!7pQ|+=x=9mNpC|8r8u0%`I+d+@IV^JugxL?O*a)V>Q%}XBVFT48KV3n`L2~dtq@LnVCu?^Ux~S?5RSQu>7u- zOOC;<+j#e~?(MF*yYVjU65O*cv}diliXib*`*>Y%?V;CqZ-Cq8b$~Tg{{qeY7x+9K z?!(r(k5ktC{S0-y_`@# zydDJVg4Am2$gxMULTy3VB?UPIVH>!5%+m$WP|4%yw2?@kQg^dw{OZ2CGP+C2<~y7H zHBVf6zUSH%L3C_+xdX%aIGdrAFKg;OHdf3hd2Tzj;Y;8dqS}!}5o#i|&x^UPsMJ>; zqr|oB)|IPnUFPcUMa7k~r6)$0?C-HJX>aeOVRIY1uUYO#m6bp|G!-bClhNOvd!wY* zKXpwv@#pFB@o5sM5Z!wyudOs;29xX;AICB^CAxQ0fqyYrKXUixs#OD#O>S1j{cBsV z94jeZe&m*Wn`ckCI48^#+fQ_@Sy5SfS6y%6@Uem6)7NYpZ&47R(A(|Q`k-92LwW9q z`+F1bPvUjb@fKVqu-+k6a^|@v_3wyR^UXpn2Xy~NX=M{%vsJ2+S#s~YUGcrgcCZ8> zC=?L~>=KSyOtAS{DeI1~9kX-clzp)$8Ml#32#=hB({XS4E^zW|3NFS=jkG9~#=Z8J;jvs#u! z%7x;Wi_QW?wn$@BJ~SrN=4IwN+bh5(nM3Sw%>5%zfuF3cytdMTI@b52bRV9rF;H23 zZPlfZr3OhZst<2(#Eymd#MWIn&slvXrc~OC|DOjxpHAmKjV}-%NP%wntnU{37}d?XTNG1*y- z-ecTThbThc+p>n6HwGteYS|ehhsoS(C;N@lAa6Yd&rg?;z@CdvP62uI<8@nJANCt| zVf|RBxW&px@2FOzu=5BzQ>T0W6=LLK@iA9(*9bq0cHckLynnnR7c>hzTFSP@%ODM2R88SCP>w$i=^{kX(845>1&@LLl1Lpk@R0^& z5c$|ex%mCI4fXjye8XL7U{?gqW@NCaC3bs}vUx|h^ZxJ6O!p3)!89h>AI?o`OL*VU zaYe>TZ+cS9$P-Cf8Y8q=*5+_>=$g=QXzK}HZd*+#Ozw|s{-1aaq|KkP0NXj$Z)r?- z#ZfrVn}s&f@bMu>c*FHAlNZ|Sa)sGUVHVdB2pgR>cHznaW4Gp-&6%uBiOe9*!TzVb z@h{kZ47azhtLi({Yil2A=49t&vDGpj@)JZ_Sh*%J0oWoLYfWci8TC$vppNwy$d6g1 zXDil(Hv#v(FraS&O1ZbAWO_&5+<;}-+8OW47p`il+56ng=sjDi=qwQr+sQn+t+cnY zNTlL`W3H|W!}fLH*QBm@^sOsayl|wge9NP26$WAU_ij++D;{G04Quvq zV`B8C4Tr0Z0p{-q2E_KT-BDu~4`A3nN!R8Z`er->nYF#UgM2hV5HMDl^A78$6DJeJVMNk;Su0@uhuD`f|HeT2O9i>bt~u zc9!e(<(-bZs&#^DpS@ROJvP*|qsJkaEfve?JWr?zauR9a+r`!oaWkMWlnaMsNfN~zrVa{s7 zp`kWTKCKS)CSZrpO~N-~ZZ{=UmJlbgzma@Xkjgc9Dx0KmiHGL~bBHaJUK!svMY4fU zL9xMs!OUDno>?0aIixbhzkW)dy1-=ycD6iv(CrnLR;G|CXNuj%dTsF9K6)^!%bldJ zhw_byIvl0b5_Li@Mod!jaU4H@b|B8S%Yi;(g#JfD);5XlQkk5xT%h^D zQ-_;-i;?;AP728afuS@;vxq6r5fww41K0I}Zz!XNhS}TI9)l2>HE<19;w0{d`V|*5 zyB77PNYkKAX@-1y$Ck`REPFS8(K;4L787Yw1Nn+bxp2=!ac9^s$09Cgy5T>I+(rpa z+n6jduq6q-TV(O;n5R-*0#HyOd3c8L7>)OTSQlw1q^^l{=|aW)+ZXni_!91!Kud_P z^X_FsyNhxdN=dDQ4d|C&S1nq_Yvj5-PGSVSRoNUq_!_yY`qHpMfa-(`i8J^vct^V8 zbqpp4J?*(+EDHF*AZ25;F$elrd{<#-QK-A7%&035c)ebwpQ#dyE#8Kbf{=x8s~Z>| zsIwJ~UOPPfSfC_F#LKgI!_J0ITV4NPf1S8f+0Sf!5{7LZUW@?8v?5$dM|CXx4 zzMYM;ExUSMs?xq-Sznb~q~_qujO7Iq-?FQFnhve*l>QD3G99%e<*pW=no^)J$eVZ2 zzN85uZAEPa1k~kBNzsl> zH~2@JfR)8(M!@555nGx0`sZK!#|I~u{{q@Qt)Qnd%OHMZ@+$1WYd){SC;vY8(loSt z?!%0CeX7WNNq@Q7Og2BZJjLe3I*Q%!a>d^I#TtsW94dP`1N9XD1P{Y^hU$Kv zgk|DQ76j3Pm&C&YE*3TRHWmd}o*eLPTs5ezXRAd;<*gn^*dbQB$|}lS$|->|@u=V` zN2$|UGtu0Bc-$wllp6a*3avs?5Y$@&1$tvad1s(7^Ip){C*ar!h=rHt2;{rdqg6WILigVr=y0lsX4Tox3MhgCjmii|32m_4sKpw; zD`Es!&nByPQ7;AHGbQ)Uf!r!4-4*D`18t5X6t!YyV;>XCKYU;5SE}h)mQawz$>MRj z+UjN1RU;vlqPU?T#8? zN+WaVVzvOjar989!BW*>_Er6k9eC2b~``$j$+;r@D1rUvA5Sr&%Bb)YUh@I&(ANAN$pxe*@ps$`p_1R*?j5x#g<2VNov#b z`C6M)>c|%e@*UE&@4@PKdHnCo{e^$Tt+wU!dNmS9FW{eCQ1!=jfN z-J94Yer+-O9sP%TVs|@VFz9Wx^GQa7>!sZphvK?C`Q&xy^2Y$rn7HofYCW5F&of8K zGl_iXI?}Jrw_N^jJ&fogwk69065Q(FIg9u*7D|W=N=9Vf2W5mOBb3pZG4+4qvxL}4 z2N+8iF#k6H{T)e!$qmlMrRCKfwdY46{i3gY>SDaWbP~7XG z%f)-JclnFsH{uP+5vOQKDymASJlYh!nFEmCKIBzWFHUlt;_qC=!o_5&5^}JOC~=v^ z8Zj?hz>1J-Ax18{I`FUu84K9?yu>13N|KAwC5oaeTx7-3XdsZLuN&RTwb0IagY*d& zNAo%;BOqyk(XeGQdMMdycX-vcy~d_c(^^k&XK7ooP$knd3!eD8|M-}DtY|rZL~E=j&>hhXd=E25Heg zS~z9H+ZM%jNOg;$>`AX1n@jQ^wXAYd2`_i9T5@cn1exrv)@r{D8tvGe+mhrK`tNUu zWCs^dQ=stM>09UX=*Sf2}??9K;>b_G^py9Qjczwg}*ALb9)Q#C`m_44ag<|i) ze=}F=KZ(C5GN=CSD10=FYC)O>ygx>GUROarD#*x4i_K789VbZLu=UBgQ~Ii*K(L`m zFIJPeQ){T)sXZ@ln|U<+el%5TcWcL<hH+c@H8p~8z`7UKHpFnb|2VpH%o){OA0H8%ajE@2YNJ$ z++4cFG{WXqt!}cS6t9`b!uJL3YBSGV?Zyt01i$d$)FETX$_kmGvbQKW*<`~jTUC5I zXWNisV8_k-AVG`LSNcKc3T9dJ)OctB2^w+uZct!CZ(m)h<%mJY~Q??>WfZ` z+d308W~Q}|P4nLPu)p(mtSss9%J1WeSoEqb_l(Xwx3{L{suxyzXVxyW)NxdzqRQUV z(((EN2DWA0c0)y%>twdjpji9pmh!g4FRZxot)q2ZQ>Ck44278?GSmA1qZl%l5rpUV z0C^vfcb*=NuG3>2m6_W5*AOEnc1^`Tu}B#upFG9Si2@+^w0bLsLmKQ^WtYFY*DVav za7gHe4fn70O0?Lx=D=WSPgS7^-Qr2Okmh5Xm#TgzVr2{SWl9ATu^;`O{2HIm-o3rW z$&nRQG^%ic%%ebSXxe&Rtyac-r@srWfxP2}hE;XV4yDR3v1syGd;}zsQ9J(yz80=4 zn30Mz6a+$DK4Y=;&EyM?E7=krSMO=`^bIT@otarXE_H_Offk>YOxqltoU(V`yfHk~ zZ1L-Po)x!FZGI?-7mHXTsi>;hS94cwxyEA_Q9`J~$VGP9lFeGaCm2%urI$V3Yc_5io$BxNHWnMWJPEr*Ro}CseEigM&n-Atp)QeF)qJ?8 z_0eOf=Qu+xj>e5`7Ot@Z@-$qd$n4RS*WOv*{mI+Pp}ou9&}wzfWT!DFxNs^VXj-HC@S{rt5-%W_SV%;a@i*({40p&KymBw^XoUf zdbCAoa4T0!bNP7^4#T-*OMTm}?t%<#{zQi>Xy1)E8R;z6KjPzRIaGTrM^XLwW2^##ya8*{wdsh zA&C_bJNpE18~!QjrjK`IprTinjIx;d-|kNlH&JK%O>w5Nnz^rPx&e8 zdQm!LEN26IiJ}zo3TkFH2X(PrG9xkO<%Szep){weU~aH7lcyA!j9w?WaO-TKVme~c z23j2E3hC^vc&3*n73AuqYVBil_hWsU(%uqxyH6$JgI~`1qx*n84CfNW-!V^$UiWY` z&^Fsh#@19>#QA6?(8FK*sUTW3)^dt=D;&rDo%vBH5<)roQ8Wbi4P4P{tBNH_1#*;P zF_|PaUPC5HT_a)woN&#~l6g|UV~0j|MTQ>Q*PO_cGS)3C_jH$On*}Bwn7s57{cWO{ z%9hHY`U)|4G}7mjz}Ya8FdN3$O3RZOm%+QKkj0e;t6S`2yHt|;o{_?bpPTLOG*lHT zW|y>imzq)R!rr7R(hH}0-Stl4k6uCyJvJ^aYILEmmJb%&v46n1*AowrbDN@fByHve z6VJ+gp?WJd>uBM_&(1zbPTJW{PWts}@FRswCrF<3!h$*BIWXk#Ei8-YvZi#wSis8c zG^{{qI*z0)zUyGWGwG3GTa`tQ?oMN6q2gbiZQemM%BjH*Cw8NF;>2J&Ymbe~3L9PM zI!+CF>~maXR%U?to#+liTCGX-t8rQul8a~?jc4yrcVFMM2~y_bQzb1$c0|mR5N#O-nb(Nuy(AQ*~z-J;iW_MNsYX~4~|@O z&5`{FuDa>~_(9`UuWw6k+y&)R<@`nZTk!qola==Am?$U`jQ)7i@GiANtfXwDN~fzD zDJvgEpGPq#s3Kkl_s(5adfVWtGrPj!U1wGe-d2ijecsW%Jrdd0<#cv!i$u0}JFw#) zJ@?mhQ{K|H z?#}-KuLdXTEyl?DNY9l6F4w>n-I4XpMoaxf@Xa@|4%d=(dyiHRKX#~9W=C-Gc3In@ z$A+tq>|59ABIQ!%{3qBt$OEa^r%5HqJ|4F2TBC~2aUJZhv+-zrE+?q4RJct%#0PTS zrlr&B7x?TPiM_&tZB2{`W$^!DO#0hj7p0C#tD(k(cXSP;(-^-eWeZ15dNA-cE_h2e zHRFsh|{Cy(Fw4jb4RI`+{ffp3gZbt*M3)AOuM3=!Y?DoTj z8fchYw=rqfxqfmXgQc{5OzC;gh6YOr5!JHod9~yE0zE#U%BW`G3JNEYuhv zie!+eE8*!tQ6!?#aq^T|^4Noo-80}kwXk$fl zKn#B13fly|OGmKYpO?xWW~vmWpMsXPw~afd$HitYrj^+I+Nwt4y}94mfl7ZXPJ&=yluR4U5Ar~5r=tvV5Dlle2`x~P!6`F+T~PM99*O@ z{g}(ZWs>T!FLFdYzQt4PXpH5;d6wTi(O7NqQNo^I*j~`S9twz@)O5O`fjV2^*oook z$NhL9JqfOH*MK|ERnw5*ki(bFphM?gLEH@Wv!_T*-ZaixV~njs~GFWRmE4M*g@Li{#-uAiP!af z^C8KX(0t0;2aZa!}}=h##`)Jsq^urUX@jE zK9jy)xvbC@(VBS-7Gv;WcqAYLK;i2wu}1XZ9kWXyG0T(&+Skd-`K6}b>jKqH#iATJ zQ^agFSGJkV&1D85pCxA_{>qyF9D9vkPUaL*m3w4`_QF~(B&LMeYgCFA@hQl2nUe~W zB2~+44a)^e(5fK*ED(X}C$IuCV3L!&)$TAguBe)OO@?}^*`VC|F};+^6JJp3pPu#g zV!Cib;TuSScn?bQawH2Td?Kkpi;@jR^Z%gT2JdPXX?JL&J_MSb;t$nOrx2k%rzDNTsm57Y&rbWnl&$7)ncq2D>b*9b{FWtPD?|H))raj_b+R-X-gW-V3*E@ zS7gz}EtA`;M;_eW(6IZ#k?QS}En<4sHjRb2$Z)q$2W!SFHJZxtn&5Q1n*o>>&9*2u z@BHWZB^r;+!AlKyK>83vl66DKxg<h7cCUM|3Lm@nxx zv`hw9<}BBv=D2wpyIiSf@-%e(OD-$C{@TdRpFhxFvhMyhk!Pm7n=8yR_qb#9bf|W$ zT11n?dJfzr;45L$lkvt=4Y)-1`ElRDc=nJ+`iX zij;!6CzL^@GN{5@qjeGhu1`wuK-g6a*GD37(4?`dyDUEQtt_MH4a~{Z>7Rc^k%tN8 zUb(_2pZi20qbp@{g6hpdhi}p^qxpH!9%m_@A#B+v#PN63`rK>tR7|FVcOu)UdKVld zc7lW0Zk3q$l`f=Khjc*4&yUq|&}yk#j`%f6OZgKf%!u0PvoZI2QW~=qd|~w}t?VQl zLY|Tf_&4&&pzdk$d=+gQoG+z^FH~W43HQDYBi1L*m#I)V zDNN60pl}lWMC2ut_Oi>aF>{R}*XZ7e%23f=Sh~E~rU{!=0y@XJ#FSoaf@-DiBx|K? zX}$n&qB{TEE2V@MvQTR0@x{xePVcDaYoYnCgVz6{UFkJaScU?=D@)+~ZZhgml^w$4 zg|A0UjKv<0g_IPms|4qa;vq;l1 z`soKpo|rv#<3FDm9ev`TH=de(Vq`YB`u4H0+tvhwYi=7GyM1+#_(EzeQ7gR`iNxYn zs!Oa=?A;W+(hKX>y+M3_$F>VcBax#Qwr#&~BoaAtVY|wMe#4_u`_N|}ydU-RpV3O< z@shMaNdl7@PlU-6(JSzwv&zC3yE_7%8|$^&hArJC%}!xg$L%{0zk4DQx&HmD-~M2@ z$rjXeos)NgH$|pmmBwolIs5i?cI@dX;A;z{-txP!NX)Hp%Z*F-<#P-D7j+nqDcOvNJ_>a)}N+-){@TV*sG7|HpQ?ip}L7bIUCEC|1BujScO^+@z8Ie_6g`HRUY~KvG>>l;ti1q z?6%4{CJFeQFC}(}+2H4t4-DGl7Fcl4uuI>kVrFOPt~lPqcgOqF z*a4eQMe0e4_H%TaNMtsifO7Z5z%J{zh5El<3Eqk2C0yNJ=B9cfgy%oYWYXV;^oyu$ zbO7Iw%(T3TXw%b0YUg-b{34!32Y)5#Y1L&k7O4(=b!l`#Lc%OAx+gQ2fgNs0p>`Gd z^1hs297hyWHAts2E6BW#B@6b^u$ZGh`Au9TjUwi^Pfw@7UV|2|W1$~^*Rl8;&Rdvb z0av6Dq;CE*DW%YZJU)Enk0&1aOD`>4C-v^r;F(lqnaLVgR1Mgdq8rh@3(tps8GY%p ziw2C>T&Xgfky15xe39h~Qxq&&Zf@G)ZdhFBT4WEB zYJF8Crf_M7IHNi4pJl)U)seWj3)~_!65$}tn54iE@Rdyig`8-Kpy*Xqu-lJ~#7hL1 z*y{R+`s-{gL&el}<3GRYrRBOrrRq^#yL0-nz_Wa{k*~3;WZHt7k#L!tVCw<}66`?S zFQS!etfAg=b8CIMUFKf8yAgbz$c|*P!hUK^`B2CHivAR|cM$GVG-RSRe5XsKY;ju| zJQ=V%2X&}zajIyzG2IpC-Vv#qsx>4QCIap}E-6T`ZSue~(&~n+y4LIFpm5uT)mt+e8F9zygV_$YnKBSR5AO6r+)TKBGP( ztylYE0oO(Inek{obCDQ7qY1b479;;d`U#RQido{5*(9tiz!s}`WX|%Fg)IDlCKjW) zF&Q}vyMl`1B;_SjC|Wz&ylkAr+9L5|HbCKna_6ehn+dO25PVmCE_vl>9v)bs3ikMa z7NIU#lH<^~!1u_~S5Cr9w(Q20HAW8ot#6K?dz5myLhHNSVSoSPH%nYl*3?%-+k)tw zf%KyIGKD)sJyEf^ZxE1p&~vCL4L(92bsy|=%$E8k@TCH{jD($mZ;diM(?z@Yn<2jk zyYd`)KSv>h|A53IOsfQQ{7)99XH(Q0G{WatWgG|D;@k z%eWqsa|`Tl1?lb*6jDKlM5@6{R0;r|N&37ds502OTy&t=pU62+(LSN#|LN(Cm!CK( z&O!Sm8V&q5N~m;4wl;3lU-@lR#UmhSKeOQ(2}xfZLhX)uJ*bijZ6@W1!EPC3N|^A! zrPzt*)yAA4u{D@wR=og@eE|*wwxY4X9#Ifq5?fT_M;{ev;b_?Wmk8JeenlfsABWl< zKz$;`@Q*1vu2zU$gJ6%82t~;^xU{6M9&rSupai&)iqruMqxg;+A==9rg-(s zWvbrkE#-|{m)KDvIJmoLpw4<|+ewqN)~jWCZSC#7&5@q!-A}Jm z7(`h&9FeJIq9w@k8(Z#eDiRwTR@VkLkA!HHE(nDHegW<&H$#rb;e&()?VGuGD_|o_ltfD+-|lxr9n* zKEH8ID|Q$04NF~Yst!J3svYq+Z_`QF^j5Cxbb*XD*bOoJ34esfBK`pP%onEeVd*nyiiEC6&DvK43AjCfhra4K(x0 z(U#`2wM@21F1B@SZEo4xVUroSRLqAahx?HW-#MyYO-lxqGO5@P+76n$>FDcQi4EZD zt*;+#`rOpGs^*S6YF0IxFtGOQ;bt1va`^0;2t2B}t@b5bDNJ6PiQHpt@(%Oh4##_2 z#CB9rvoc~bMON0_@%iU>pz*1>Hf=fw$BLj)=Q9owb9fj{f~Etn90KPOxkzl%x0Vr) zWTRd`E67OoeRHd@8}J&$_K4+?FJ=AriNC#OKR?{D-U%l z^OYjFXT3xxxB;$(>8 ziqpuUkv-aCzFjf^iQ<9Dwc0e!&&)>lpL0!`z^9)YJ)(~VF5TP2Pc;U)jV~5~5dn{A zp<%>$K4_GSi17k`j-HGo2jN+w{2Lx+V`h4aLy%#3KB0gEgg9^R)N1LHPiN&Hy#6{E z@SavM3&0{)*F9GTTbRVm=@Murh9Z~%bSk9wsq@;qs`4nFKpfV+OeiD zOpPmR!jPvScZX|MlDz%O@%Hv;0t5WKCbFf|ZtvUzd9tIRpkphf*#z(Ib#P8ALPiiL z*IJ}Q31U%tr7+hO@#&xu5 zI6gw$E%qgV6{vnEBtlqn4Lb?nf-mJ7)utu;2L|>pF>4H2*^KNB;rhlSuWjE3=dTaX zWHEqDkY`@%2~9Pa%?(o_&r)-iASaubIaT-U#?5CBgu@5UZr=E8-BczI-h{gOS=v`L z9jT`v%m->kAwb>AOb~yNQ1T337Q-V#)QI7&2Fs04-?z7Ywfw2mtDA7~FTxjgq4jIj z6?`ct^Vi{*Hlb~i%K`!gFB3Zz=sR%CIOU7%JEoY!?x<-*`_Xi;#F;CUszuxGEvrNu zRlD75W9dv5K6*>4=09VcB=hA3sLIligpOfI&f<^5Z!T6ii!GBSY;OL6R!_>)7jts1<-u={il=gr9(P-K~|2Ozu;A2DB zqtTQ!S`8I0x!O|$t`u=p?y$+$9L)Dk-#R{i>k6N)w9Rg*^Qw8WM`c1LJzL?bFsMC7 zQ5Kykv^>tymlhcOE)ze`>&k~4d}5KO zs>7`-vznxAgIH5!(Ls4^E7s)c*)lUF3p+7DYlP>-i{)b^PzdnIj=lSL&LiB@nU@aM zW8m~-kKebAx-Hu>$o_br(IOZie>b)PZYm#`7O6k@61qAK^E>zN-GKqL$LO}*_vj<1 zWBC+&Nxe`U&2=}Xc6ZY8z#j%Xy83tSTy@)ot8ntx>7AcqtnQYYF5)$Cv3OudUCZ93 zZsHL#?uVhCwD@Q|AA}dHU5NYs7&gGCu&dDWu$ke(UV$y_0xh4GDpbseWu-rVpKB3M ztgw&Yz82F03zeY(e)|mpwr~Z+`*tuY)90FQnLw!;>GQ?Q|d0?RuQ1HfYh-ltPu3iR4?Zo?h9@ql+nv3EnN!Sty zQ?s1-@KfSL+<}KKy^4okBhPa+3=KZi6Qz7{<+Q6`7;l80r|4$yFW2WfCF zr&1ILk&!9KpF3H|;%RE4M(o9&-ii%Hlzv&A5v2c>9MhgrNk!%t8P~9&Nq1V(-!Exc zeBv%N@lrIgg7{~w!LO3)r>ji+eo@MpkunYZ-i)<)N-IMtMZ5izs zWNaoHi9`R7(d|fH0SViWe}HmHSM<0W9HJk+h{zlrlNQxe*`rH~9dmhb8Tdtcu%_8Q zwo6SV=stU~dx@c{NO5sVyLZU^C8U?sSD=0&pkm|MK$jNgb<+gI#Cyc#d6g;W4Yq=r zBV}L6GAWVzL&H?!xj*ZBT&^BHCKizS?oc?>KZawO$+4p0@aUMLc;q;B2KvXu>%Vw~ z4rLMZ_4kO^-&9*NkFj$Z-0af~tEyIIWZs+2$zcU$C$;7;qRipO>tz_ML|%b8QUQ^E-qw>f8DgIR@<=URP)%2%}aBI znYkh%Q)Tw)oi#S0z*gtJoy|W_TuH$SHjlUp`)e!|jB>G6B2+R-8~{;3uD@kl^Qy|4UcZ*ToWYiu)UIF* zN!i-8JXG1~QRgntsdNf$)Kc{(U+>FAc-Z3#B0+|q*2&zWkIXBIN z37q!PpNvoZWCRs!7}Rx5t;XV>a-DDbds9=lPy2M`J;lb>raJWl1E|=d-0v?(MHvHh zjzZ#Ey=6~T{kGnsqTX%wReQFqc1aW*dWyY5kI6TjO$_`U8YxYeo+d>+{22zk2mH(D zi16Q1o3h_z%b7V6_8VDd8l7-j#Pwf4bt1mEODbR<5sE#`KmR(Zi7ajC%Ru<50A>`A=oEb;f3H&u#6!W)_H6=#9s zE%-LE@RK-$u_NkpF_F8(0jWM0@W+xYes&f=s|5VwI*BUFKzwGPYs5DI#jCWZ9~1`i z^Mk?%h~G-`)~(~p$O0E^{t_JbUN|nDw488qP%$)Ik>kari#c7uuMA8PvlA5M{pRgF zKqCh7K5=I2WmkhqtcvzD2;>K(7eL_+CvLp)mUVnF_R)>x+c1Ei#L(Eea0jdzNgW@B zJmF>i4&X|SNyx|&n^bFBrB)Tso`|EcUBYiJM%mAUD0?8W2V9`GFC_zw@XADs;NrmpKB zI%fB=EMk#CZxGq*+;Ww-u|VY#R`B?AHF3_S4@@3u?>M^5Uux|Z2Pfgb#dbeG$u)q~DR5F98m$VH;S3Dp!?%Frw49@zE??egVJSO zpJx#fH=E61QfT23yRnb5M8rKJhty*Q1EQ>?a}X}51rbrDAlTo=MM^gD3><%4BIbY= z3`Zk#c;I@GHIKLh`-sUWmP?!hFo4!q56AmOd^|)y3FU~CSO$r1i2VZ6Ogzh0iN;Rj z7-->$DN0B4tYTsnj{^_fP1 zbjMzu92%OM8XB5}x9rGNFgSIjwe{#E`FV0?W^!s~299rnci}LkmycqV;QweRf|#Ay zE3xGZ1bUZTVpj14`8J?tGf_3G%3~3mTQ)Q_Y-lk{tUfi;aC7pG2)S7}El*>UTA(_V z#naHV*%Gr_V$#T2xeBdOqBcviv3^OhFyC9C=j0Xm8yxPg^8EbrF1NkLYvyr{u7E*Y zpi&F6MI514Az_MqHl`?Bs3vVIbhbBy!c$>KO~?S`FvQB=0%= z17+FjAD;Um)=K|y?inm{E5d$+=k{Kd&la(lzzr33XYHM&x3%DGEv>Mn9z0Dng=dhF zJrjmsH#eXZ{R}C7lGY2yLEVIKT}(3}L9bGBGL!XeH?8;gkL;mk(cpjkANu1R5-q)- zo=vCcX0D`bB|fP#YnsKRXVLp<`C^i{AIMekc#2%27yC%eCms|yWiohQdbl!49`T^Q zSX#gbJv=E@OO7AKWc0_NTy&Ej-6#%?FfDMA0z^Z?+Gqa7=2bJLGMPn~ua;}&asf}8 zr7qlBQ`q8Dwo0T~IRd@OCXaN>!<+kQ?_o?XpDE(gTchL;y_+MosIgq0kXi7*7E>;V z#n1IyEk=z-Z>S#fn`MPoCX2}_RT%`CR;R<-QL89*>*D*Xhi9IJA}0J;a!fi_M$%$T zZ=ecsb3qpIyewE6l$VS*+6*;gWuCqY9aju=SpkR4pptQfOxjYmO2V~TFRBduOnu#S zt!KF2stpYU%rdW&#mVJH^#Sl6oZp*Tvl4@n5G{fv5pS#j?#kgZnRybmSef4x3>IjW z8mU$);)t?~WPZO}U}`QiI&@Zzs-)dr(XXK!x!Kvd**t-Dtw<~_4h>Qv@R8x6#f4^Bs{gqH?P;j{l1Ets0 zV}HP$aGj<^pYX-<5E3P_AFFEIwraaXQrr>HI2C+4KQ||rrBRlNP5eh!shRW{dA{1) zXd`|F`4?XACP6MuZvrLNJPvU+##53q_Bi+gp1C9Pj% zla8W72knm7?=@6cBd~*vQv3m|i+(lv3dRk96sHd+iEh{#(5lJL;}9p{F3~4F#S^n(s0>&C|o6jd-FeUxPjw6$-GKnoEvfgL&YdSrRd?gsGpnh_R~? z1egb~)GGIw-9F}4saZfMuhf|AYG1S6-t1G`O`1x%5dR5FoR_1J$rL$xVpb@Z=UCyh zRJ-JISGC2r!oka>eCYMqmsmSve})`ID)@<5P|8&knoROV$qsw^L_EbsP8tj@}s{IVWTxZqKmi_hX~Z4#Y3%XC@UZl^+s)@+7+7GmtpV3C;_ z(HwCSE`uKvjlv`x?3gg5rU%8gVy;{-%r7qZCoT}=nw^CLjU(J1cAzU#K3;2Rh!_f| zmx+A-5)qACUZQduR4iUysJI?{BILk#n8%juUE!e$&(dm>zH*=>vQ8&1E2`{cC+OWi_ z@RY6$<4)$4xzbrxTI!9y%F4cD=^kA3pqM#JiMA5k${8q zL$3M;j69b=!Z+-35_t--VHD{G-3<-}=59h-qNkKmZ8<*4(Mi3$et! z99P9&o;vq9n@1c+u~TU5L_jIjS)h+|(j=uEW}P);>i1$p0}pU*H8yYX@m$iVT|`T1{- zk>`YPA9j-XSIA>dO^h6!$!}>~QHg^vAn_qg3art;C--*vR_^4{83py@rKP=WwUs1R))opM>tyRp#1IFPn(SLTkpMtx zt(@2d{+ios?fx}g?Ie+JT>OGYPExHzhS(goz>twxK2jW~03numuzc^b z(b1yrp2~HF`1OYm&XV8$%WHc2_`#c8>;zmvu>m{9u@u-iH=xX;-kY8k5kCh3HvAhd zVFrI=chukfoB;GEunSJJ+v_QLD4hQX?GU7|FI87j(Zm#wIg6J{;AT$$YFhY~M z9EZCdgTvaJNO#kCYg^k5T4k|4PjLj}7DP&M@A8``Jj(`KRnbb@#*%`NnXmQLw{;qf zYWRclqae@TUV*1q-73v$sZ_zwwrV&E*I-*IM<77;w^8hnXwj|Os*y^RLZ(H-RTPf2 zm$D@CSotl~Fa*RY{6m@`gOi~nJ76WFONnr_?nE3Lk1uFp1JbA^8`qu4qAX0C)b8r6 zzPxjA%xQJYgF`jpiAvQnvb&YaFL(Nfw(j0K^@|H#Hm>d1Q1kX4heEbgBx6MNBWMra2H#uCSLD$_yVWgpd$8Ni zy?^f9`{)(@@sBayGtZE@$8f*SkU1A*Zy(Z5jhXXk2gomJi`es2pMOXKby_Vs$Cs11^brw1%q3j-LdBGl^*|!Q$remf%Nv{u3_^>C3f8Rg1RJP zZ(C)|b62(%>dKsQS{GlM$D|oMA|bxm;cu9@qPOja4K?0@O`(bnBTW)szR|9TJUz}} zxNZHUuVelq?F<=P)lyM5lBLr-w8x5H1H{S|qodPc%aK@I@W_!*!O2gKfVZsETehsU zSYqKp%j4h*Vmtbv-gOteLvNEgMvjdCkF)mxY~slN$343%$?CoLZp)S|TbAVBd#||R z0tVB2@4YwELP-M>2nhs23Z#U8lC0f% zGdr)&d!ILiSrLqnbWj@_20FtI)Q}NM0Ux+u=POIFSLS+R$u``+lh?N4cuU`1)6>?j zy$bG&)p0SNOv8I1R>bGx+rh%5@)WJMU`E4=N9U&nC-%3uP$bkGtWy}Jv8m&FdXnLD z<&g96PR1jYCZp8WjkWPev4+jxQJL1zhO1iEPSwH-%tN*CHi^(Q9nq9NN6QM8E5njoRO8Un z9S4zp2K~meh+i%pq2r>O+K#|w{ih_(B+^JZ0+mT3vx&v(OmA{ymRavBjtf*7`CQ|) zX+|!QE0gn$K8GvaEZ_+zLkU&Umz6uA#O^d%^vHccb_njlFv@2Q#tip`2u6uyL3>qc|fPf!SIi}QMkYR#khcDItMrvmNhP0j%rzN+=pHQUZ##?8YxTqJM zQpuMECnR=SIcxzT;#+c3be7Dx>}>Eie}DJw_geG2v)qlj4wcdpRA#4%^lY5TjI(62 z&Fa)Np+1)Ob$5anp`9NX_5q{p>5)~7w68mSKIx1zwHKt+r5VgFYmy_o#wqiqWoUeC z=!L6HDy!a=$t z@{UXvu@KCqVz&oC74twiUu;yRn-r=Ef0(|O>N* zK!oiay>Qgrs5N6&{MR*OR)nsNUb9l{ZP3i@r%otuXaJmzj(fzQSsI_8q;~803^`;w zu2it-G@;mOE=)CZc_mN;s5Lt5_t3_O%>eepXE1cm0``-S948E0FfqB9j=A8qkl%b^ zev3o~ZxMKj0E0yWFq&*nQkGZ;-T59>YGZ~mNiSo_cx;})sLu&|_f#Ne0rKv>&Z#}* z=iY`a3zt_VBy~=NTvAVS1PVx8s>{Xh$@^`raNyIQmA}SX}ncL z0SrEjeT8{P#hR?)*wRfQ&%Q&kCd7&;xTNxGtdWpbB!Kg} z(}wfH*n5x@+MX@4bskriq#KQUW z+onzXo4s^GZr;RF2Xv$JawnA9sr$!aSMVI>a;nd5d_4os-P!^H2N{VjHlEXrK!-rPPOXOn}d3tNXFN2 zd1@9Z?xF^Wj(=F;^&IaG55bLl!5HG?^Ku_EoEdLIIacm<}O<#-jw9 z)TjVTSEdaBvA9IKK)ZYCKcUd3Y#RsMlXKwSrm=FuqvRr$G7>8XDHlq??AU42LvH#i z2zi!`0-KPh-R{#n9}E&RRYt2=nDH^qMCA#p`7gm=^xjCscVm;GzCv-GaJ(xFj02|^ z1taT(775ks+u@{*7HAVpD2>bVD_l~KLH&x>lbMv1>CwKbGPq?fg+Dv4v=`rP&1&#w zb!%{U&iXQml}lbfrcs9FDi-6y1K47!*3LU@`?LN4{AGv+@S?%a;j4EE zEb(5g-ES2kTVIAVFkGuE#27e9aw7B)YD^}L<>z>_Z34N?t23u3s0Btb};;B!e^`I-`iPGLl}R#LQe|L4O0i2?Hvy!1yLWbW z?dtJ*dvGo(1mLW=8@w5^mIi^w4`oDG}MPjnEFTQ?k+&l?M?Vf&iq-xG3?7 zAOOWyliI2Kgsm656P1CM+>6I~d;ue!9e03G800GZ?0?C0vC3MnCEKIL#P`Q?7b6_3 z$MI*dBxw60yB=kxP|1x_@K=>hj4#@6aJTmG|lx#xTQIA6FV<*BK=e z-J)2N`YdQzgPT@cQN8L%JVvF_YR*>(O zVH=bZ@;~NGeOf+<6|3NVjuQvL7-lo&llsKg45_<>oCIEA%_ocSrbV`>}I)4vKF`?aEtpsn`Nk z3O-wA(dhNjO(zaxA54jA%MorNfn}gIO~k&&#zHyA4`)?G;qBkh8emA{51okxK{kgi z;=(_%%$WiSmmzUxxm;OJXf#R%>KAv4b<7F|n;qQKIL1yJil<>DnD#+72 z3|f&nBT<8jD@7WkQz+^YzC4ToRJyxHvAt@XJs75IT{-^d;pDy&0qlz z6|-5KilOca>VmSGeQT#!%v09xt0^m}_D$@9ZU%V;y0Be+Db2pm z^+|Khs*8g$C&`sy?MV=GaaE0(UJC-*zY1zCh72taKzYU}IruE_R`+GAah^(1jpdY+ zpOC-d{lq(DlQw-!24ANX1{|SB7$-hNJ)$7pC6I1ubjEfhsf#tLcmS@~%gvj+Q&PG& zH;>tb{@;``|Ecw*ohN_l@BiuK*s}Fc&nK^7d~e6vhK98WiJJcZ6ItJF7pEE_}KkASg8>xyFK$PWzC^)|Y7p*8;&D9N9K3h7&*vfe!2mjQ6C>FI@P^#Q0Q2OXdDMPj;OJ zyz^c9yuR}L)Mh?MY^p0svef&@<#VtVa$9H(-ua`+C01)v12SM(>nTlAjem;#_4JrW zo_M-PX-kkfmfrdFWXzal`1(9pkmo12P&8JM_YlXJ97^(ppQ@6seR9%Gi=F5hO9D2^ zWQ{y&T-tMVeqQD32f8OL$(MQD&$1;VPOPOgcg^?brc8bYuyL1YIgS693$kZ zuEAf49L5E>3;#^Vyas>87ZDP45@nC>GD9P&g_SW2N^SahgF3BUWUZ+#)h&H#TV>(a z_xG67gXtzABhe@{IenI;TczL!QYzlF)SKnh3Y`w7Q6T0LrJGTkv>kN>Tfpv%QxQyJ z?fjE#w=h@?gOj!gARUuwI;0~r@1oMopf@v=gXeHon$ptJ&AUI?T8QB8bfwj`76H>9 zC)7H#l9ufekuvbTbjvbJiqj-AxEc7*aA=}#$MbVmzP!1V;EDz9P6Hf&%i5Fk*Ft(! zag@xl3|?li8IQpA`Gle?Yw%}c1|g$*-Gq-U;I2cR;+;8IxI79`2R}g&U`hc7DJ5nE zi?XLw#S>{+hD;U7y)(Pq$T0fNne@ku^ekhh3jF(yoHF=vzCt z)#@WZ9G{dSM;``z4*q42yGD)aRv(2QrpqaNK|Xky`8!TRxmX@E0`uN!9xjeTnD>A> zX^%R@7|tNHQjeL45j!$m=Hhf4SEA$&yv|ifxVH3Svn#_PzKUIQI`(QT8Pg7SWpr0( zDwJ7OU1{A1r)5~QpYT)`1$ZuVLRp-?X46zhLtTZ@SXtZPn7XM(A6GUZ^NlyKocX52 zs>78FU+J&cxN~i`T(_pa|CNQ6w^vRU7&YkpY&toM@DkD(35E1Gvex~EB$0?+5G8pn z^a&E^b^A)xSlsH!*E5*`s z-D3h%&nznfDVaWJ!-_F2OKYswqKWxaPAx7d-SF(rg$2L1e0tjAr`DHk$rCW# z22)RZO?RsJZ>8PoDx9m7m0+1gA6~_<^{=ci5KAGq3X)n@)w-1_RRNw>A@JEkx6^iO zAzX(Hs#e`HvQk|+T8CM&yw%H=tzNrg1*2_eZvd4>qn;Ci2|HV_o;`g66-Xa{@L@^o zhBH%8j|l`0Ipys7Rtfninp-S+mS98sm`~gB!}@M=G*9HEC z6J8fdWAiSBG`<(cqNRHY1;hR>I$jPZ%?}%YxQ}@6GaQNqa!~5FSQ2IAAQ8*NKmV6l zEfaIk@#GwiQt%K*B2!as7_eG(dRCT}yjN?2{`FXGR#v)tU_7H9XNv{ji46jQLH0Gm zilSqs1CW+Zf{%2U^hVtkUaM%;B?Oe}`Us@@Cb;9e0?ild<5LvnxvSQ1tM30~Z-qXi zExTW1;{3_Nwvq~=&EXVF ztwuFhnvhX5ZF@)W1ItQmDU`lyNKu$`$D(~^Cl3)W#s@KinA|9SbKI=`=y0k=4hYAe zQF0Wt|4|3hV0uTMW%iWPsotCeNYrVTE$9X1J+aS+QH}9kcc2O?sa+TDM43+xstVF$HBvw|sxRFN2PS?i;)YzQPvY z>j%%cpp zEJ+dih^;o*q?dpIy;Wjy@U2yLi6u$Y_-azM+SD4KCef2+6$q?Zp5LDdeGFRht-jg0 zY2CJgV?u*c$T%^u&^ISHt;dFUq4(G0Df*!w!O%dNO7-1}!WbHfFXX3Df$-SMi8&fg z&V76tJo%nEqsE3 z3`Zcg(Ka{*-7luGi_CJkTjBNOZ$JKsFDE`C=e`zNg{^rF>wG)x3z7$kSK)Q8(ed-B zhAfdB6v{C%gR_|{%cs7ux23lKwIzWm=|W7e69-*o3z|I1ZA;6`x}DHdSsvPhTXg!& zEuS6R|MT%yzTl`_EAaFlnm+GPhr_A}9bue!n~s%}Cu1Ll@Er;rN-5Nke^EDOJPMXt8~us7dUD$b z@x^iwr_GCB6AXvFm+un?A=KXtZ8?n{-%Rpw;IBZztM9>#^mwL^9ds!zN~z zNyOP6%oArL1Bp6>)u2lRmuzvN_dMBRNm({Im0HV_jPr0V&QWurH>LSTf*I$%_G6_E zpMv}oPiu6lkCImae{+1624u?uj&I0C>VmkeMn{CKI4Aflr5?0S@rKDK7N1 zBSj!C&m(6H`Sy&*APrW^7efo_MAia5KB|=lBS>I8_RmT?`7fEzad8G3e8xphycqgk z>5k9IgUW1sR+FU`d}BA@*9YiPfr0#nq0@(lP8NvD3#f6?UjG!18yBt#kIZ^_gO8p) zEBFWlH=&Np*He2Ai(Yeg78Dc7Kb*&h1`S9gi?ZfUaWV+ zd@DCcUCw$pw3qxXayev|>+!>v4)Ja*$}jNVz`G-0w8EAoD{^Z_O6H1T2A-Ubvj|)l z&BC^fgE5JL-BC2F zwOEt$#B6tGWzvd)s}hOPYO&6I35br~1B5TmU_cLVqRgQeLwBxt-7`y;UR+y@V|8B~ zoO*IzcIna+UAum0XW;w<^c)T3Nn$Tt1%#hL6~`uoLt%34Z*N1f^fg&UEFfMVVA8vQ zc>S}_X!!^ECJ|nzqcTLz^p5pMJkoCw4!tpc7!37CAB z<(JT}SoW*rRlMS z+>4H8FBJzZzQYoyoLYhIJZ&i#q>vvn#a!&3A(>3PMaTR>z($9*QaylHsNn1w zVEE*fSw4<4)X6wO`$rteU#l2T#c&WR1_-nDa1nxH zs4syt;*}2_eP>1&fH9UPcWr8E-QJhWW5yOQxM$LsRpZLdauc^cYuBN>s(1b8nFSmI zS$tCYE`ySn6ClJh9{PFr=C4n5vLr?&-rKNkVw%5q`iRo6a`^IXh0BZCe~f#wHXhQ3k1H>j_J#b$_lDAe!nj%-mGTg2i`{Z zEwmIblk>=boEc};s88~o6)Vm|Sylfrt+U93j0tcIbTBwN$t;KB8u~Y5Le`>l3+WkZ z#c8hemQ4MyLc8{tIghR^r01i_>Mh4&hP4~5TeIO9!l8K#E7ojex<3@9SrNsf^lAQr znVEQ+IZr##&NzX^N`wQSnTl-oViRr_N@6j}y@0$_I(V5ejp8NmaNI699Jt1q#El?+ zQ0P}CcWp+TlgAriW$!$6clB*>PtNFhWH9C^%^e06eo_4Mn=Pw)D2~F)8@ElMSOwcu z+#XQ$zDWN4nZ4w|^Rpp0+~M>Yc>nl@;vcv^=E2{HhA>Y=7{Yc77^tBxIoQ61_fPkY zJNnM-UF2Z*6oE2UpjL^zMI9McbE_Pd%Ec`&h!mhYbQJ%yK!b0LEtg+r;zd`_BnEAr7HSI}Lo+E!delPjk^HZlj54Yda z-aDqJr%%75_qDEllLCQB`?|3CzRnHzJ~wqlFO^qj(R+u`Q~uxx8$k}vzKu*p5qG8FxbAUQNyhe65B9${D;^;8s{6 zDU(1w`Fzyqt6s%=;P5~3)qL=&J#^$%>I@j_@f7O$X@{`}DR4t`n9Wch6Z>lwGs|qY zvY8d&12SRv`&$c2w!gRIwbwA2vur|kMo*E0`21RX(bD@TPC2u(n1a+o_a6Kw(@NzQ zWDcM5(BhOatXPI|88WFjNB9gHMSQSMG_0kdJ3GBK%ZPo!9X#9eSyyA%Fd!?5A;nrvjUQL z{n^gOzOlg$t%J%75J8!98S+z6Omq(>nx&o5CFfBnYjoWMl#6tn4N=Q@p8@IfLHgSF zO-VNvOf2~mcxuJ=4J*p0RQu&J9j~DAyB!Oj-cUNWbKx|BG0E&mH44O#>Uj||{V5X; zPORw5(f*~ktFhN)H_2qH%j(i5Zfl%)+?V{yZOKJ$HB*yP<_VJyX%|BNdmYm5jj|vA z8{yFICSHeL`nSfsiN$Z;oW`E+)aEQx*vbUUt0(8(NYteJe2V<$=>_j19Xc};`nW~O{!pwi8HA@}0qpf-C_`of+w?DHy6Rp#np>;~`+&BhbbqjU=aA$So;X?TY z=_(7K$Bv+D=yx-#M0-Rx_)p@6 zu)LLzm~iIEHSrU>$?EW2w??l7S;aW<*}!c>lN_-O_|(s6Io1UAxsP`_QLM;+?IfpBA+R6v0_1W@b%qFH_5NtC|z4cTUe&CS=*C z7=(JO-ry^=caDE9F1OCa(O@ceeE)v;u+}FjSU!ir{ zq73RhR?Js7F?HGP@;Cwu-48!WHeo4s6aC9>S2zbAqifut(efWc4eb?kbbsSfA!8qP z3WzOeYLv$1xi6fbzHe-NYVWSGWap_<-+%DIxuybLYMhe%6nv1{Ixn|uNsAZzCpzhy zN$ou}#@6up7rGIZl7;LCaOu*etEWz37x2m}XUP_D|5@YUDc>q5Tukp})F)G}I z-y~RU730Zdo_k7u`iX_Rxayon4Y87$jI#oG!p6`=og%UFGt3U@u+w)ooGqNizBd4 zL-As11pmzdjDUH@X*}#GD3TqN=DO;CX^7909+VXoJaAc^mts#*A96qD=Q?YAsI^Tf>-^(e(IkoDfYl_BTn6^@U&5Xl%{q7vqeF?fGTu z1F~FK=hdrqE}sN{UT;Gq2!wD1nzY1tnlu7KB!qLTVu*$GxI?&|RB)IY2W~2~K6r#4 zC9&{qBiuXhPLsj=b|JwJz!38=y?aFdGVcaJ6?U@fm)YOdPbUK zdGWH!kJf;zFv{ua!F}D`efAJqWO@nEB8PLiV&S-^QM~{n@!;qI8L_9r%Q^NxL23)gc zU<1YW^s`|+9_C4N)b(b@<7D1d`f9|N1CI?~8|F)9b{Kp2e_~1+X7xYrsd*8;bk!ta zI6?EJ1@dKzPUkD5_!16_uf!B)>mPF_qKd|b#Zdka@fvl8UmwXbrt$P{?9W1_6yVk< z{ILvhv*>RSMSlz3p5&y&L@#JHGikttE{Usk2ymWME#&G2`Q!6V zaaFTQ85~Adfv0I->5)HbZ^@PfiKeKkuP6OzX)D(*R3is4LPKzMd4@+AI!7%O>Htate{afaLfOzy?s z!z)A6>4%M1UbsN#$&u%%9y~J2d$>uT;4N3l`EP1%v9E|!v23;YjaaMt#WHdVID|j0 zm6B|Cb7Eq%8(fuX=sg1+8$wO@yRZ*sh4^o{Ex>lX{r1(j-@ftQV`6j=uds z33Y!0?(2HG4{@}tjX?df>5&3d+h!mo>f;QD8?|Qc#|(b#b6k_^Gtfhx`58J|A8}<5 zDy;uUp8YPo{dE#BQEcFoA3;w`41N`g$pkc+`=a8+__3?1B<1n?bzQ!z z{`BJt57hz%>}7C>mmdX|s--RH&ZTvHARvE3JsV#P^FRIx-CG3mF&#^yW5fuYbj}7u zqze&w6`N^BNq(X-=AE_?&2(3vW&{V9}4yga5x1o_o9nKH<8}eYwp4ney@qKKVP` z22G-xr6(r;7y2prOJTyNM9@h*Sd`+9(lVpPGB!3MY5$Mb;k3pP+Z2cH%$>P^q*Q*) zR=;X&!>j^bM4!_-NFOH7eSa}_UshWzE?yga#7d{~w zemmn#M5!W@N2pZDt58NC3-=ZpivRjYN&x)WpW*g+dPo3Jt%`oL#9_j}nqqTCNPq}E zjBf}6`N#H%H!&*sJ5utB8Q;KV-p`69-&1%sUIqCUi~YAhX?)_}L^>W%E4nO6(fo;` z9?P<}Izk^NBw%hwyDjt*K`6{*ouSZTDbj<7Eb;-AL7F@GE7UuPSKN_!Z@7EQ$m+Bx zU`e3Y1{%_)E|Y{h;wM5bp7zA%nxfSg=8d~&Q2~W3wVb4__ZdN)6 z3c1S{&R@m>{AIJ}E$0uQyuGpwPt8R=O3F7p4PM*2YuDDb>o#v*2VRRbbw+K0P#zzA z2205Ma4*#h4B1J;$`|*NdC$P7`93m|pythhEZi2xnU5n6QvQx5?C-$8H$x;C_JN*> zil7RhpX&N7;uQV%?g+m$;vs<;26>RErR}g=#ZGUjIBQ3_#jZA;nG@Ec>c4_+^6XDK zHPWJI6xJ`17JYYA&~#XviokCpwJD+vN-DwwX){M`;UTboltmg%3tSw+^V5jYB8`Hvf=lJ-}atO!KzFTYU=x z#m>B>rb!XYD9@N|k=#g8ZkA7CTHY}q>7Kz~nRd9>0;6JxH>#kK51Yx31cV#5PDs0% zVoEO>e!`1}9w`-D{PqTI6&gG0$x`xr@CxG}kT%x{+Oom0S{X?b<4wlUL+nipE1T$z zHj<3V5e0PP;2#BCVwjys%ca0%i z_#zks*U^$+iR81R9&Z0iTcR-0X22#&yai43#zi1OeUQ7LNsrAS7iBrzHot* zbXHFs8=3InU`)y26?_)lk66ry)ckQMAAcsOGnAXk$D7$GKbuNs*Sn+6l>T~CgJq;N zyp`#K>S&;iR?K(^^;rStp=ON#rJH3Cy5PlRN2Fb&Hp95!396^%oOust)}x-5X4KQN zx5SxH(VLbTkL|N^W$W zUt`*1)e51>ky6l-jxxfMTb7irb?BM=gy|*FHvN-C$WbQb#F6iClU$I*c{Aom62M-X zF}Vp&K&&>X#VGx&@8rrx3AS5jozd2Z;A#;PC{Y#8>k$w2_Kcjx#(9s!>@3~G$h_K{C-r9# zm_QHA_)2mzIOsHzXOa^t%CQQe&Z!#6H|KbD&ph*t)37*g?&r4RhNdA*Rl4NPa)izb!TVxO+%RIGV&S#4Pte2d}U?;CLJ;X}e;EyDJPu@e#wq zZ5<9un#CiLPj7{F8WB-gZPlC#+n)U!HthTJrrd=3MOB(a2}r$CZ2DasA6G?QVRo}+ zBC*w#YDw{@kC`|oJ+WnVldHM9P!-_l6mm;^z-36#@-kZbS~BA5m)5uKb7TK@6pjtf zTu7R*hq7lL8e6`0YMoLTuM2%20B>s)p*I*O2L4aT6N-g)lhLX-`I`!JCRMr+Tv&%l zEQPv8t`V5+I#b%%Dg;TNl@!B5`z6*u?H3-^&qoi}V+_4#SXL$NC&6ta1d%sRU(jl& zTQ)FQW@;1RX8O0^?4)-P9nv=sHF2O{;XXMt;~T?i?R-8*FNl?K$OrX@4WBOLapi2j zp0oa}{#(o(tK)KYvAEp~gigbcJIK$Mlb2VLpYI^w0wVJ-afZ#a-m|7KYJju3&B>Eo&H~KBh$A)ZTMtN3==1I!kwr^J#@_oqKtwfgS$X%4kLppd}i^J zSmz6m{JpH2Tt`d^-9xW5qd}%26 zJCa2o7D!@WBndiPeyL=<^t0C^Cf7+*lA6gYufGoX%|Sibr4G8jBMVI?&`<8tCo8lX zOr=$X)?zDP!+JtTm=18=qz?TpUhx{wWuo;e9G7?&j*En%+%9LxDGe_~Lo@t#KZEM{ zMp+p+4+Xt|fGw2qJ|wS@A(ZfKR$U^ii220pgPV_UTCr&=SEG_Lr-uf>_O-{?u3S4+ zk;>}>3#oirJSK}g$KFNds1(MuBHl6p35$smc+BV+Zz$kG9g+rUMNV6J;X)tCRJ2DT z413Nj8oC*`;)(tM)1D>& zefQnuzn`1B7)u(vts9U9xuG?a?()^{dUesFcW!Uj+w=(0aQF2Exxu9Fo!z~g8f^B8 z*;S(Gg1rAEpDyG zEMZFY4!O*(6ECd{cv_2H!Hxwv`E#3+m2p9%t2W2(s_4z=HUwRos&rRFk&kZNXZfN|jPQuyiw+^>t}T( zw3@3L+dYjZS}N8|u8@E>@=7xHU<^U^<6ci;x(H$vsQWc4xXJ=fvs^ktTq|TqLqb1w zSZ@1=WjC$>0FdjtX0Ftchrv`{VnJJa7xw)s`046>^2QbSPwgVN!CzqPoHHwGCA;wX z0=v{2Gz9_SENvAIFyl#{noi}a+<4VPAT^E%xgO&HVI{f zDc8KcyL$Y2fF0!lo4!M`{k@tRafU@3%q{m!;L5pmE3y`8^u(Lo`gP}~b{|>MrUsWo z7wRhk*sFAYXIT5h_nYnnvCq$AFIPD(3dWbAJO`0cD`Q;01}u8Oq_P~SK5tM~Y!Az3 z8eU_3V^@Ep*Y0w^m@5WW%ru!@h8A!3*k4ar#ZE8(w zPDfFS45jN-{blvshZg5LEqg8B=yOe=+DxiZL~_aG%4v1!8i|Qh>zcl7WAWlA*A$j# zp0WV5rN~6iB($4M4FPjTg4zfzCHbndy4)$-t19Ov+E=7Yjl#y2OQnf{B3ENYd`i4j zuqL4-MVm48wy|C7lM_~yi;coQv~OzRzEM#7CS!Qt4BPiN+cRN%9!H>8O6t5P1kn+mqrR$8oy}4SBo0rSJ>WK_78Dnxnj95Vi)%KzukX5L-$ceLq3YTyksQkv z@C714u12raCe`HlI|`iwjZHq5BakR1R*Om}6-o`>a(_ZYt~1dFif__wk$u|87v{`8zoz)8XUy{I z>SZmSBiOd?2Ub;9u6m$5v;f;yzPQ=rXZODLd+HjaC5`i|$mHto-56&-}JERUnxOIrd=qXVi5=eNCBykoO2a8)FaP z#O-wM{9EYy@OQ$UosWdP_-y!b=q_{*G&a2d5H<}{FwlPlyYDXI_5qxxjT(Ol-v-Ya z=*Qk+-g|xGU3iGLmG+TyS;&W~AIhB%S7${BglN2la7zh1l7u&u5E_07RSD}KS$ltf zCVq8)f3R|_PXbD0N-nNzJh05Ye%ngt%sYDBrpk^Pg_|GoSbJtI$y)Nrf^;Bo6nAH2 zPb_l+fi|Nfzw1B}yR28eX72po4FPu8NGqY3(`Yb+ht2GPUK~ z-dKz8ADGs(syQK{c~uj7U9++^X~Pcu!x*ZEFmZ_S5anZ0buN-5jK<~*uCNUx4BeZjc2H?hTd7|*dZ#WLoeFsf}8Y3PpreACE4?S=@cwq#(!X<3k#}br~j(B&j9~Y^k3e;KYTCb5LLE%Y>bdYe=JW7zE6l zDXAQ0q}z^+R%-9Ydy}W!GiU12>A^tjoP~2*14t>=W~ik`?yyn{w#{2KuPxZo8lRh> zWOLb4IX=ZZudHx&Z&qO3#@g=9y(MX>*>&mNox`dqZ{E@IO^e&|0;zdTS;h4Vd$Lxd zSIXEjEe~N&d<qmewDMjqEOHI09zAU^#LK5`ic`IC)FCcuPKku&uj9@HR_X+ zgkqnRvSV8Ye_`}7u0i{+e7HtBjMoODj*ciE8Bv^%$_SBA3MWKjUq?`l&OV#cy$S1+ zDY&@0XmOXdrL9iaxS~CcpML4C{_l^sk3IQQ{~cHEYZZGMH$1b()HJrkky;cd0`Dg@ zEUl|uF~)uSzUB>MlNkpM$udGlFjp-fTR*0D=SvF~zp=jw8fe5l6P`V_Yf1+E zSuErkY7apFhp1&7r)o~9Ku|PaX95&uC2GlOIV>+6QTJ7%1yGEX7ZH5voM;qwrZ{2oho^J} zg@yW(7Ow=9q6IQG^v}^`WoN3#F0V3aGYhKS8a6q~HO(O2P7yzvz3NAt2erNWC|Ozuo| zW0%qTl#wU#UkDN1%h@^UqR!;$ z=pxHXyMuJJWz^XeVgm4cZg-rux4@oi77ERNEKi(jOHA@j+&@0KJUzkTP)IBWIq@PV zsiH4Gy|%bCDIwb_73Li5Y+Tu#kl3=mt>b6`i^UP^wb*%=+vOH%3__t%Edo`+`RSz( zPUt4TT?8H5DI z4sRuIZV)%p3(vEwQ|F zTxWS=u|H72k&Cf4riz5Pwn}ee_2lfl&f;XJ#o@L1@-+sHbq4Bu?rvOIo;fDhEQR28!lAvhwPzFN~8-oBK5!PgWPo4>zDUot8X=;0kx5tq?q1?mvpIXsz zY-w5f#wX{jeP(G!!px_4yL$r`w}uDKCbujqE}m8EO01fgM&8SC@gxeir^KsfxhLPh zynbB8x<{u>eQJ9{`+Yy`c?cwZzLLe@$wlGXgmd^aL$bp*&{KUq|z79=seYWjsbzuu=~JphC6L z)!}rx*f3z2SSF!_f?14$I1;~Ts8t5>Xy!c&cD%YWqrCt9ZL8lM)BNu0Z6EZPXRLf} z$NYOU(*!E9$l}gP*mT>S_tmZo0AXNl?R|IMwka{&Z4rr80){WWeD2HS)!WXH|9D|? zYkhs|0xjbDR8J zY;I^5*WWz1lwL13kE$ih{$J@uB^2S+Ll-a{qsac);$d%&BHNx+9Eg`}rO1}n_(MNZ z6*`wm;r~i}K`KT3*U42Hs?c~JHZ3v%N@mHS{jG$1f9z0}2aUTPm2`aT`~zlG8}6{Z z7lp@W#gnnD5|tw%;Jp0hsoQhQ)o^%mIl&|>MyXE9 z;g~Y&ynMBsA4B2!Rgvd76XBdKFOD<9Q|^eracgB z)$I8Cp4PTwU+>Vg1_SMyZC@U3`J1S5^#hY9Kd`DnWOg{s!iLqSCr>%OszGRWI>7t= z*PmM{b)_V`BrBe~zGwHqb1NjS6rW4B{JCq8{xMJ<%UH`}q%jFGb7QEU0CY=5^e6}) zNJWJ)LAq%P^<>f0aVq~%WmE|n-YJua{DnM%W>Y|mv zjENIxL@NLgQ%#;^0J?sSfu{TiXV-`)peCnIwZ^Mc#79W-vGEiTCpx8Os}(|{Bc-4< z9l>@ME;!nqUYKA~R5^`@nHZS<0^r~5Od3IwaQK{1$U@iu$4rEDyaN3N8rdw20Otq? zc99%G1@LrZ9F#yi;&mkLGlzZ55WRL^XUd zrrMh8)$@gXjhevP?y8&j(y9GL0&&Le9qqSgiUk>44jgL)k0ffzv&&yBv$Rf_l>rXI zcaP6|tJc~vZ^xMI);zaFW~K9T{>7*v_*6Y4as?8#LVfMH9ms2JId}eIly#))7 zjU(#`jO^^WYff%;HkF^DTsZTg%(fgOQ=pbWYjyA%v|D#l{riyKjE-WC(3?K&ksO|e z&((0Vu_vB0IN9qf{$8>^HqP)I_{&!qXNRHDo7`yF9{RUI2|VPTpqG44W{%`+FNJz* z5;cb955|y&QfTI}`gUIA2@E7k#Wgd z4j}8mLx8JIc9M|DlGK(0HxHaAD|zmM7Jp=oSTc&%tUsXD8bvHpmDGaKG~>UIqWO7! zeC$}7W;Uc5Sp6=OpgT4W63tI@klTOx1rv}5A>lhx>+}DZaE>-Pjw0NeDkE#*0*?U? z3=t1vWaMN#iJ_omYxopyC>K1s8~cqgq*1}E8@i!WdNk-9*;xd#32N}p!s0SJvP~#) zud6e4LVt&=Qe}4Jq{-8=GS%fh2$K_GmS&cE$9YPZwx^o&$K@FcwFw1o<%F5@=Z~Az z-WI4xwIkt~ma?hi-5pw+pgL9%D-agSavhpDnM7me6EQ-6QLT&0{Ijm9ESlHsjnx<& z7N}!seJSIoI62nh2?f5ETpLU2NYNFSM@P* zJb&erOXfXToX?fZq_&h|AF2kk7IbA=JVptt3u;n67Af|sC~g;slzJsq>$SSY&EauK z8>K`+j2P_13|KaGjvzPtF+=DImVNdtoqs@V#J*x4qq@W(JdshUoQzTLQC=6QQ#gJ4 z|Btut0BoyB8rJT6Pm(QLvaD*^lGSC)-LfS2-n*UNoVdkFNbijhLV6$xp(G&$2!s^U z$N@uFJ3AAbVN>JH zSG~)j2DhtiE`3}khGfR+T{gAvMmW;<5EBuXVO6QD83<-qtL-RF|7WmdH=@CdX!uI_ z9iqX8Ps#^c*n7G71M0r;1DXLTp2b9j5HA)MymuayobhExIN|m9@E_e{JMLIT_50M zv2w}iX`7?#7Ve$C{E6C(Fq2M|T0E|NY`ca%3EJZeE1J?LZl9KoP4_dJ%W`y*$c*hv z*sacvoH?uYIW6w0p7h3|o|=RrPkVH%&Y<(A?cAxeX(V}b_fPM5Xhn6D-Wijg(pv*h zCt0>^sp%?=^|-L?C}L-bR|*dcEQ}ql5@HF_(A>oPe#E|e5_`;BIJM}1nqxymNA>TV_JOBQvq3chb zxMKcf>iH|aPo*Be;`=1($Q9owTqS=R_3{*1y51c21`4^ejf6qh!G){*5f1oRg&k1~OWYB(cz}9X+Fb)`=>1@w#-LycL7Ddxuh$;Y^!R+Hp*mC8<% ztLf_2)e|x^C#-HAzP`=nYFj@%w=rF%N^i`~u1i%aQ|rJi&IknzM+sf7p%T{Pg!QN| zEnts>y-4TbqLJcTg)V%U4f=WhPldapW&34v_JSrM+ZdmnsMRKB#~ZT~H0*Jx8h5Ot zy%gU_He4^goKZchx`onFVMDdW@lNty$ciceFI z(%i}%BWbQDX$}h1Jf1|}2Ub0MKh;Fz9*~E3Qvy(egV91qX>&zdY%cV)9|1>sYepytya4|wb&uI+a+?QWP&z4or#cWI=AL_ z;HZurxjF4s33$e>Suw%wp0J{Z|E6y-Ycz(LC!>u?G4_HeCQ5RXswa%u2ySN0&YI5b zoUWRrq?)dr?9Lh|>~K$5URk+(yvH*he@}38V`Bjv4wq480R*+wMD%d`G8Jv(fW-W+EELn^B9LM&pCQ zR&g%5!lf8AmmN3mH?hAA9FH&`OlNQRJ;xXZ4?ALe`vcWV#+_ThN3RWujNYe};`yR4 zaE%xIhH;0K1#$wjMNVwR!tthqu|>06(__=i94U2$SsHphoY|1s+L5^S#v9tKnSIdzj;g zEaOZEYbR{$%xXV&@y(E3rq$ zw%;bo#O+q&rK}8CNYi>10c&Kl9W}ASLN32?7XKy%iQqydvKL)I3_eqcGTfb6o9#w% z#NQg`$PKD6CXf9!FRa)xqkf*vYsl8s|FV86i|#%!cgjB%{iH8LrAWG47hVtNSh|;QX;}a6J)O!Yj{ge-|NeNdNY7{oBi3Z&HwiaMhu-!{Ak!INd!ebs6r*FXzve z8_0*r4CM09!f+~K;6`P|Iqx*PZV7Mzj7VKq> z-yYBeZ>PFKE!bhx=vtM{Wtiy9HcKnK>l0e)O44I>zULXd9f}?9s!Z-eeCe`0F)=@_>+YHB9?7hZ)JI3_G&*ah zWnw2-onT;}Nlb7KO9r3!4lAhI3}ek1ox^u6s=jeycDPItXNptIozp#Do6u4+)hUrY zduK#z{We5PHtMHh)K5d_3C^(;_Koo&*vF0qTK3C}M~+Yy>H+rGlMk#ueR?(JdNpznkbdw>{5%GYmzU6Zf%Lu~@$*DfA2n)U zNbip&XEoT~71a-dSt(@wh@Ru|GkriqAB;-|~Lqcl>5N_2O6Qk*4Ds?>yS_oVC1diJnPIS^{qbLaO<1Z~vQ zG>$?q0Qjg|WbsjLXPB)r^( z+G`!1k9a8+2)y{@LKw`v3x4ZUf|ZGBnRYPUr-a|0JPFUp!y}>|_yA1p1U-L4`5#94 zca!`wK0nHe1Jl_ZHuuBuJ6x_$0j4Wcv>6HP?Fhp=o$U4x9uP}~lBfs&M(TeS(S8Kc zj{W=axsimixv3*Krv@LwYS`Q1tS)xR2T!3Yh~$zdK15}sAxC{h*M*kd*M(ZB9lcYi z9f59i@+8HaVxI?jr$8n91kZQy3H3DG9*8MTdJx=xio9DSc$Yej-r+ky+`W*~Z~8V- zmG6SEQ~3RO!7}Ot>Kn{&TNrSJ0dE-4gaK+a`yBi1O`wo{>qd|Ul2@~Dfr9HnKKsln zPzX|2p~vKv>|5+}cz$X@tJ*JVJ^H1==SrA{fomrDfaex!d+$`>)i^xHcn@CKc;by7 zhi2e2ss%V~;9eMv9=sCr_*Ml0?gX_ufjeh+pg;5B7x;vUo3Cu4^OcB9QQUOp9Xwr$ zTwan6EUc5)f+#6twrS*PI+ZYNlBq=#FI3g4g-NjuCYw$z3>zh%L=tG2L|v1q&eRYa zPiw%w$)DH6>L#1)o@br<sG-;SPQ!c#R;!HdGlkB z-Fy;Qo_p@bbLV(l7+^uGzrBGr?FMhLsbKGoq^{k9XQ3B@{__Tx0)NU@g2I&;M~%M+ z(1OSC9Vm^RbI}|yTqaAWi4oDL7B**w6Nj#on=?%-!lYp;ol(iSY?gF6nsQ_F3v;!^ z{@wpO5FuQMb}xVQD@2T}_Ba!~-UO#-RHECRnBXRM18A;=6)*;utKc`6xqITA7f)BF z=6hppc2aqY_HevGlb|>>&KL>K8=di+=A~O3dSIwwW4wp0(&KV zTulcm-yw2%QO&##FFAzPcr_wKm`DTa^$7|3*o1^<>YW)W35_G_)r!VZ4QTMDCNz#} zR4bc6RH8o4>5S7SK8oJekL1(Ug-eu;qv{jWQ92@f-Tu2^8&!q$E*bH6&7Ix{RY{6d zCGklv(Iz>o@W2&jFIFCcTAAGeI-RMBMyuYU5IIeqmNK`=Qr=n2#3+j-o(@x%OcSm~ z%#XHIcudxcF78EURZLR2Oe(X+trjL)?8@>3Skk zV=Qs`JL1%Q}ih06j(6i{g?+QmIU@(ko(B$_PaS*cMh& zr#l$8T-OzrTs|(_JFz;MDwXNxg;{m^l5m-b{ho@943pt|0f@ls;CI*_P2n0M^s*lN z_(IK#sS7w6!FpOwrKx06QA$;|Q&uifgiF;iMr~r!Yp=z{dgHzdSH{ZOc$1+L+}@Ku zx->y)bH%3!#d3w*o!m34FegbQu8GvCBClg?WhN$inoIB+mvgxm7_I0-1q@dL zC)D7P>u18H=i_s=#yJfgJOqsz~~H7FL$mltso# zA)@JKR2K$~R6TcN#iDY%@S>U_DyoWin~cr}m&PD=xZc)VA>#h6U?$=h` z6jlf(CA!8RO1C~RWyZh2Q%&#B>p}H(`hSN@P<@L6>*x@J3K8e8MX1D;#=k-?tbxE1 znk=B5)e-Lcj=Y+=@r7ZLQZ)6MbY1!%V^pt#S9Ge|wVeiwHd-o{2?!2uMmexqoj-N(l~LXSZkBUu82}Z(W1({yoBoRf<`TZa&4OAUkprCGuD9= zXlSX0GC(F>?D`WCeJ;r^lSvzDOG|4Tq%xU333Ro;I4sT}PMiDl+BN@~lNufuH{yBh zUkBka^LWsNWA_vhlSrY+k&0#3Ey;FSl&qn;w6wYb{jev4u8!wN#KncD&iT)pwLi~I z6C2`&y@>Qw2elf`$LAt65-j|=NGtUZSj&8cV9x|$-SmFwWfBnV*$`M2f~`TY=Yp_W z_zhs_90WsD@~|pu1rQS03w}Qj%cPdWY2=J%Uofv4(K3Ua(L5wzcvvY)S3_Wjf_aM( zY$Aaj4wlh?@{T32Bf;~XGL()x8#)>+qXMOCBCunAmWQ=aAHjO&T}0nY!SkXl$^a(_ zUqP@x2g@Bz>0zCaL9myD1()OVXVWrn6Hk-~y8F4Sz2WONG6_DtsHk-VD~)iC{(odn;Hshu?to9*S#UzkzEb zb`4+g1sn+=3y=VMX(;s=6J=!ve;8_0@7OuuXxyK z_9UzW_j0`AVc7`ZG$`SC#ly4+wwloQYOvf21e-`;ulaxDVYvu4o#cHzm>1()OVS}; z@i4nz3m1@dh*vz!37>(BnEiwY6nuv7<0jO{9b6yhVcpah&`VF|`gjnw2Em@?`Zy1( zfr)^o77_jhU{&xbASAFC$oU|KO+w{X(jO510UnkKpMcYtV_d)IVRa~7KBkX9TO{ZA z2sVzSJ0M_qSQg6LNMHy3EDuBP;CPbvA^*=jtQ4iIA+SS1d_@S>Mqr17$(N8ApTZs!_UD0y`G0M>7=*>lh{J2LYHHj)!f+Fx(GLU7PFmS$>{{Ff;L(jJWpP3jmvUk$Ny)sLbMnKVzyEN= zh(%+|%@N-Dn-0&u3$0{hFO2kMu@9lyo_bfQP93{?BuGwuKjP=!OKrK2eem&@)+ ziXAQNJ15ASrCl58?2c8nHLE6NXHQyHQ@g4o8$OFrH8&&V6)R_tFSRzWKS_-`F|Xo* zrjEs3>)FpYh2P80Thy|Nomsh~nSGagv!ru9&~FUC2i%O_fZHn2o1)sAI_X z?3iS3jgUg!LV1NZAs)mJWf>5({q|7a?8#e3kJ>spJA3lhQKPp^&OSG}t*xi0t!*+R zZra$Bm)EngscF+>@;!OpyvaTD=K1}XexP^Ka^`n59+NLUz?}zP`hht^%SG`V43Kjl z|9{vWu$cE*Z|N604qpz(YBKr{7OyckUO(27A0I~PY_`n!$Xjo{xCU%yo5~iBafOAi zK}#Z&CjlHk2A*g0Nd3^t2Np4}@bw#T7OMz^ltKT2d}EF?CdQd#H037gbV<3Nt+|M? z)7xU4*$9T;<(iDy&Y0d_b}rZ)C<4bALS?LB_Hk?dK0jt~&1v?>)2D&#G~DW&4Y%G6 zm->i*(+reeLqk4&kOHV#_QNvtKX{rg0Z(rPkF)&!wNdN>n1bdo?d5!uy5um0Hvv@! zeUM%}`4eZo*{N4VR97@HumAoP*X9-MeM}m2LJ&o45<>kRd%W_{?Qhch^1&9G1MI#b z%R4~Udm7Ulrl%*3+uY$Ekr6A_M@y~7y1IepoQlFd*A2h9+spez4)udvoCkj!wQXvi zLUkRYdhEnYcZOPiR*kJ1-RBpXv$tpOqdy%GOF$GPG?Y%x1HY-yWq;80R71&lxBS#z zp2V!FuIo;%Z!Evzo#hT1vwW?Ru!~Y9YA-`>K5)y8J#d}=lqJchQu7J+&y(y&%%ee zOT|`qt$WP4Ded#-&FYLvt4PUh^g1<$z6u1|1g(;sP4nx9FElCKc}4L#Jq@XqITOj1 zveGPX`JT!`yaT7V=mRwg8ua3`&tFKq9&8O2uCp!(?h6?PQ z`Q(O1du4mRqs6fz$qJSy)?}NKYP)lCy6cim-r5AP%$l^q(UO2;05-0FN>a1p;H0vp z-HlqIXt61g{h7&XnVMJLRbn)jbd~2#ZOLLlM51Z2NT_Y>URpNk;EEdVZVq)8(HKrv z`aw^ZecmlCaYEw3xcF9V0eCFbh6O;tB^(G zfc!xaMW~~5)W__70~;JRIAbFVTv-L4y!5Qh%#4i8+Y-DcX~yW~^$pjL$&i{oiF4A1 z%`GjR-I{hnVNB9`^YgtK6>yn1HMyuTCDqHmBTvgMvsKJ)N=j;)U12NBO_LYio;SJH z>8zcccN_5ufclUe(TROS<4$bi7(sEwB3`G31UZo5t4{E=BgI#)i222sov6)7*Jp=I zveH*cO4}EgV0T)M{94Pl#3s|1sn$DNwH^(SS_|{?j7c7Aa(s-~*f6)wmfAeM&^>-w zgX4awjLaQ~S0AA^!oKkE7Kq3b+A{q-n<1h^4uuJxDrr2TvOB70)j6`-RyDfDG!)0y zN5;!FW^1Z7v(!`OP21iAzNQwtvu_q9H_j|=SUt(3c4X?O$z^Jtx+KqC9+M1JoGfZU z<$sHKkc;c*GZ-AX$X z19p84)<142v$5yaDdOIGORrf8$NTp2HZkyHgfANJ9V!EXWbx%e;-T?lML7GfsJzTa zfK_hSu)EYI>a*)Ia#X&trVMzqB`3zLdWh&LpRr2?24QW$R?(23FRcAFozr0o(YqH! zlkwc4K&t>WeIWfGsr_EfuzAg+^M|#}pWiZXezWlY`OTw#tq`3Y);xcH^SpV@n7&<5 zK<$Rd0_PXIDA>!wW1O$Va%v0c5(>#VA=wo}v#SB(oid0PS;;Xnxm6*vt5BuH;f-}; z;>_vHtKuYm?)=Haw8E%pxiGC@=l(-YWG#nq!G{qpGehay(ZisPIZtlRa(CW@!7Fe4 zxB|)QIJ=#aL|QWpktO+7k6jU8&{jmRmPHH2CJQBxvnyRCF-iH>wB{Tm!8roqd<$C@ z0%7R&Ig1lGaQ%S_N{iYG;_IsOOCk*!R$&Cg*sO7CdL*zF4Nt3XEOjaEadKcZi-plL zLT3p*0X8zv354i@vmpZ|IXf-dhdJugCQ*_nf0 zXspTXPA*+5y%)a8>>>I#8Xm3?4+oaO9j8kM^PTaYx)f`nCrzn0?TpW^OSTqyQkf=G zQueqK3wEmGL_e(P2X2Q=h?nOHFHOWkWN2<;+AWIvhvX@^fNC^%bIxUW3+AATeh=DF zS&L9vPh71mn}x7ovnJMIry?S(8S#;&s4SbpP}o)klef%4jM;ISvZ8?8%CC`Tqq4pi zev8WTT%nf?!9hInT&DMcXNTgf(qO&}IdB`{czhqnO-@YPdeqncO!}Jf^1Y4cIk*vb zy4vde(#Uw!=_Cwov&CvaB<@9s=RA~$=;8P!2y~2luYT21c$djJu#>QJuSWj= zi5w7g(`Vq5%=qBBKDjzO{vI;_cF+K7K$X86;2CBgwznj^60X1+33Ci=9XYSca73cd zbRacMa>P(IpWcwtI3?GRZikj(75RT8H~%l%)#(48*~y$FIt|5$Y?MP`^D^Y4 zLC@4u z*++lF*YX8oq~FJgw+TxHa)AZSvQ>gHg6jm=3%1}D2O`(PEsO9-QVe(o1D;L)%kSyw zW!+__BaZBB#}RW`S6RO&pA$jM!AIc&^wxYNAv@cC#8lSx`$IzqgmRUFogX zUe=bK<#J_Zx0Tt2PJ20eLjSVc%I&@1guV;?%@*M&S5}rQ@Fwt^T6MWRi1#jby0~4q zLtsFw&@qAqf^C9_1+NRfL#?dFTQX7#t#gQXnpErn1&4y6G{B=FjvF-nm&gu<9d|ZY zA>}1MNbkjYQD4CeB%nfB&=0keM@M-9c3gyG1N3u~2t^9+ESQwuZ}|&wbQNsJ;UGUq zXc}A&B?3YRaV_B(6u@a3C1aG~(xgncR;d7LRdh;vno6r+;?(h@rY>SdDw!E>t=mUO+v zWtPXf>e8VjLMCQ}0O3NScZxGQ8Yop-j4nRY7$E}HQe}Wdl{HfzpfRZ((MbQMj^wFO zre~(Ba9(AMJ3xx>RXGUf%EYv!p)yUFmUN#Nmq{{4CH6Q6WMf_dsOpMf)oopgJjIGS-Ff-k$TD z=pTr0dMR29$6y5Zi#^|xq>s<`jnZ=kI!)%iYAqT#IjYVmtqg~>~-J{{QVZN<~Jv&)@A7dI~p8dN7FRh2JUCu zC0!GHCW+q==60?h?wZh2swwl2yK8nS+@o=P!tC3mwFlPQ5Q^Fny#jz%)5Olx;f3&A z!)W%cd@yBXgYdp{b)zr-Dy|q=F91Fkug|&kIEW}(hI=(4lOdmdYjnf8a}6WG6n3dt zJi6}Ox%!d#e&G^!2RI-cDd29RqBXMSDwdd6dtNf|qT3&RelwoC%^T0Zgv|pk$PEUx z49J4|b^$v>yh3<5;14vq5L#WCv;h(~ZV(6FLVCqOzn}$m8_#|Nq}#Ru={M&#*41r1 z_YHet+cx&XH)l82%_?7Z_^k^!t-A2m;pJuJOOL#DVbx9O_p)+$GfMw8m;P&#{wJKC z;EKErr8%;!ynNXaJ}>@_@Q}MvK^l>sJCHUvp_!gABrP1B!ox$AxQ(ZV)29RX{&D*T zqYn4&8V{V^smsv8e0kN~<;_>16z&V`I0ts1`5otWeg~R*@QPJ|!FovXeq0#d|M3)I zb40mIemR=yeD-{CxY=%%Rzdjlfh&+l-^u>aER_LCM5*2z>wARy6soV0o@8?Vg;pls zzUzk~joQPVt&zEdk^-{NYqwmsmH%yOO5A3t&3EA72qlZ#OC_t)vn1i!`t%HKVz%*@ z7zKPP#lik`g*t%UGU@$}hGFB~h0~i;ZFO@SjN+L1WUD91n3q>*WiMzv+SWU*sf_F@ zou;pDxg>&>I^bFgX%G$-uS{e0BozdLSL6AzFNTTea@C|B(#A!Fi)8tR^t6@<-D9M> zgqRqIUL}$iB+XLiwp>@;vTS%#U1NE*t#)Qj$=tE|65zQ)m8r2bB~e5qS~HUJa=`J_ zB5h)Pv^>@*i;I${m35b!(}&L~8QHDV&1lbeGJ-ilMK zqi0>Yf%@9VNjwXikP;ZMuO^G+zE&Xyk6yBabh&YTBdc!Np5`s{lxA8}t!9lpKC(Wx zxM7T|aaCKEqi$BU!>&5gSi*jErQx&P_f2w4xjU~!ty9b7)6kMr?U}T?p>$?rvgqb) zH@xB6=P3z4PxZOr6jBP}E*sk(hnkGwaLbn&PQyLHqoAr?CLC>ui((C~(1Wr}YS68*%h?Yf$;^uaG2sgKt}F8XA(c5M$KsoxVS@Wq zIT_bM)s?BEgS2sHWuy9WTZ%*gZ>x_$3QymaYEAz`*vrnk9eJLDELTBftkaN=&(Jcn zewv-uI=i%V?y$5ui5{~wW6bpp^~*ZC3l|siVe>ch@c(lj&_+R#88r z(iAO{is%hj>1=dA8SfFaUR}!fm!Fp#MxxlO%KY9fp(6I5{}T-WZ25ySm2wRnIBq#-d97PHvJ)u;SW+T2%$eYFbc0ti@3JdWBzkZIz?~(wYK23Dj4v$ zKg@~{UgQdDuwUQ*LhHCTw$O+FunxkmxmFha7YYfm{84VvL0(}U#YSTD4XveIBS$_S zq_bRl;hKl_5DE+&^FJ61PBfB7T&q@NyQT^XCtsV6(_3?`wZ59dGxfi3Q%P_RzZMPX z8mEHESJ8)j&DT5$TwOZ?3;rkLKU!cSQ33{QOw6_Q=9oeHQ?Kya+jXEa1^#$lm|$Hv z{i;?l`M=Y!uCZ~){{elgcgi(4^nas$fp7mHyF&YYVB}wuMs|(7QC)+6=F7R}>HX^3 z8l3lsJ4_!Bu>Lk&F#GEI+qG&6m(}d%UtP2N@|x6#RsR!}kG=DMY0CoJN+L#%p@Vmv z7ee1$Z)T`)H&`cu0!- zurCmt>>i-y@JtpgqHF1~+?~7ryP%UB*FDzLb7FmCtZQss$33C9 zsH|C_3%*Ug$k}%e#NZupKVnw;uvx{$v$41P*~P`PhNbV)BzO$*+#UCL?6V8rQN+D2 zLa)=(hRrGoyyd?U&6mEXccLlkckB~iZl=*la(Jw!JN$yLKbc$dCKQ5Prd*R$oOu7J zDO?=|yzMBc4b^m_`2Q89e{;V0y=76o6<0_tbx19G>OllgcD9t(Nu zXOwHhjZ5>3u3xngAz?l^^0++KsyL@ih(|aOA6x0Ylu~$65KE%1UCt7T_|w9}#Y7Zo^u54!ITS}d$& zpHf=m9(gNVsnIJZsZFZz?Xm8LOjli@D^_DvhVP8SPxbj(;u-8`@-Pr3jS@rF6CG=c z${bhaG}?^OaptIu2~|nxCwH%(K7;E0CTg2Ve2N^bpGjq+l)StXn zyXhXXKY{HEf_a0UsEIEIdqRS2^UZoo^hF1kmG>r1vSOckLNm2OoGP#gjv#&gD})XE zj)49zgl6~@f=jR^fr5BRBDdHv(l3<;jY9JNBYKmPJ$C~hPhuqDqNMDPA~`U!t2Uz% zS4Z!KKMUWxjO|B|lLKeNLB=VUYv1()O;f-fYP%~gVEPf~va5$`cQ#<@5yx42#0_}n z?N-jf&k^naC%)2!4Obz7{plV=Ln`9`1<_B}N&|yw$i*e;(yVH=HBE<02B%brngD)8 zoys>CH$_d2y&C+{E8OK*i=3BN^kwGY0N!%&t1*X~_l zGro31uHoe2t2ucf_lqw%SMYd`hVuo_{E6J%$w`WdNy;(dyF3xtFI>22785BV&fg`t z>?C0%{6$s zZxx*bX=c1s8S%1ADwE!DL*L&&OVrrxUoZ#AU>m->id#?wKs2b|!#+wa^0AX4MDO2b z_rp$s5!1i~LtsOTHzcTo*8}8?M5a}wq=e~GZHl7Fm3FenXcIn33+Zf!(r$=0 z8nVjmi4~c8y?PwyTQXHh!QaKjXl^-yNbw+UbACEY>CIG+?|y ze~eBu5AVGrIxB8Cy*bYO``$PcO8X030>@F_U~GhOzPl*znKL|{0yNg%MRa1fICezm zi2$6MF20V;jR_&}e0nXV5dMnbhXskC6u}=O@Fau>_a%$qcqktK^B6zDbIAW{2%aus z1e#-MzTDvm&fiO>??ChUeF%OM!OIc+9GR1sp}x9XWJL8<^v(0AqXcGr8#tJd8MSdi zoLO=H?Sw4l$<=X*O4cVb#>ITBkbke&ejFYBJ!?mMFQc-|y%eFy!mrazTk|xWIO8+tzX60!j0>?{nz% zzev)M19))f?I=kX`|g&`3qN*}G`%QItN#U(hFHnN)(c&C+|k9p^JB-BEggjJ<7_yb z?cc-QI~=SZ_T5Q1ZY^j|PH8Q)*$P`zlA8;xYtxbw($f=?)7ZbH)_V*FPkm}ity`~m z*QPi!Gab$h>=aON8@&jw71s8}35RRhr;dT2m?P}V;4fT#Z=)9m(-419aP7nFY48)h z5O{av_lVH7C~+`mJi-xqZ1-;P7xrbGe=B;wo_o*535V-hF{nnbQ+A`_P0FZdSJHR+ zpTMod;7gBatkHK}I=YzZsAOLNxx06Vq`_^2%TbXO|JaRQ6CCfbkyJ6_74fI0vZZ2k z7DNzL%zn+Dk4FDM22it0XWSJY8>b7qa}MV3b#yblT{xB8-5n$?z1R!>0bO#gsqao_ zvhLe^n9;#!?)wMdzhDe$ulwmFDnhtnXnYKC0PwLcDHLCl4y3ZHXM^R;H+@Kn@abk( z&jQO4&YS4jaJTSI9_IjAqrpB@w-~uB7$5r1{m%DKsAI;*Bl} z_WX=F5o`}P{LD8B{KlMM&)&V4w08pixo{nsA8jg&8{gt!=+D{8^S_;^Tj*CNAO0|h z-3%xCaa#Wj`g6Dnr?shUsO>dwmz@6m(lM0QdD;)v?4q21vS0J_QxE*B@Q}d5Wc%j` zK1AQSf(-)f&FrM$ApibJ{{2|;K2PxSfcJkD9!2n+E9B?iw+@lNgU&?xKSlE6alt{3 z3J@)zFcuKazdzIO{b=$&PjEi?{#oJY!S^}-34Hzq z>7PsPNCgGJ6}Xy7_BOCb$U#?>P4Z{Q=q)?(CCb=jl}VGA371)9nR+YwQ)%*qc#_lKZr1@27S0X z9z1VX2;O?9|vjFvj=JS!v|{9R}GxQ%||~WS(?V2 zC$es!U3nT(9ZjLCB$F{<=#u;C{(bBYIGXr9?(t)NIuIP676+~FcAk)D&@P&xYour`@m~EKnbb|Iv>CC=P zby^&!TVunp{fHJ3o=rJ_adPZq&^?lFVcXcB*fzT5(lNU9quyOqH!S(+BeEAFpc7FZ zE1rLm>g!TjNZ4@=z8%Yjz~)2hkl!Xckv*K59r5uenvJvL-6}Bcr*b3vhCDIhsTbyM zh-1y*bM2;uFH_IZUm1sGoSCpSL7HmxeeD6~b?Or%E6>ynd{HeWlPoicY`!o9Q;G>2+(f=Tl`uEloiIF$W z-tt&tL_POdm4M zVM-d3renx7N2#!oG$V$L6>^A@gru1{WSXPFm?Om~&3eA9?Ig`Zf;2u&S_q!o`83y& zG=~IXJk6evG#iFYbCgQw(~LuD6g+=_A!&{X^7M)&QS-JZ3r7fDcmeS0&1kr-$ zfcUO^f$W7@t_f@Qo}G5+%l%h{npf&!fY8kKcp-fygJ(zmGo#C(evI1NFXtps)A1v4!KTDiMx24hOgP z!NK0iz~UA~4mqvtJs$nI!BdwEBGn38;$ybbah}+ik3WW|q7z*sOPnH@>f01%PR?m7 zvkKWs9M4PHeRK{Tjb?2e7d&Kr5W?^N!4QaB$^f@Zmakg5Y}v|H%fb7`&g_n9#d%X7 zT2fN8=Bat}o?Kn+oqX$9g*8rYHz~9-31%{Q@W|nP`;H##bz$bZ+7d<08=jiK^HKTpyIcRk?^7o#n4cWjX+B<2P8X@THDwhW9UttiL?a?69q zkF#aC5AX5)$~;KqGaiW)qy_K(whQ|j^ZiQwf_*(gW1kbZ_c=4^X#cr z)6xsKw~yJ3!Q}0un>?K?=vyDkpwm`qAm?U*{{t7Dc0< z+MBz%!JQK%E;>+0{S~8)=GA1{GzQtuidw0zB`rW&pkkK`K#EM+5%%s}~?wF63w&{;yjWoL*fup)GS*o+)SMy*)1PVBW^p-Fnm9lqN~MLRUC?$%u8gC)7?Y zeib}%{Vi)&)J$z~tCVpOjG?+YyL;2H$q%};B~9bAM(tcOOr~p2?Z<1qOB$D1>AX>@ zNX$%}zc{1OqkpfnZ5S%dsN`bJHn0yOnSBCVt6!m?^oipkBf67HYZyht`?sZJ46csh z&L0nqn{pZmNsxDOj9O;2XO@o2Y2P!yxMJabhlW66CpI}4p zE&>|^W`Z1wK|K)7KfZ7R8wF+nFGVBR8Uza?ZIH^Yr?w*cN<#deaE&lT1XI_5wIA2B z9I1(udS-gaki6lEC5|f7KqpL~-x#%)w&kKRYSqNcsA=gXj;N}2ct~z;4iguKx?p-} z3_n0uG_~Hq4Nz`=u^`4cknW9^wWfgla=8cW8c_VM0a9qN6b$Gwc846q8cdJdOUJnb z8wFJb42hmhwhAPyj}bGxI1@`n;5}$fK*GTGG}#`gC))$drSdQeZxEC}%>Ek$1Q}qL zkhVl?6w$kgrx5~;pq5Bs4L=N3w!m+ph*1(x;;Fz9{7Vj}y>jdfi*pgowTK>g-1L%R z4^0|5%wCca=X^Ri?>##$UF19|mZp-#`SyXIZSwm|3_3_&3 zk?k2HR*y}qfJr(V{a{C@E~7R*nKo;qd)nNoBUT@=vQL5(%A{d;fRnL_3@ZSCcTQP% z)C?x1)EhFbs;Q$~HL2>XuB{WUPnsy8{EOJ*w3AjL86873=zw++uzdGmU&#&?6(Xuo zGayw$WpVRz8b_){YTX=XXKwb`A|#_5GLVc$+Jjh^s){VSZ~E{}-QI%PdpeoKk`bAx zA&_JyLOL8(4Qm$8kyu1GT1)bJzc(jGnv`3q<5)yLyJGG$TZX~R)|`0IeToy))K@7) zzx@a`N*$s*lbo*v_LNA2h*Y5}5B6CXN~l@`UP)g)wkj!#QAEk|;u4Ep4tbz&&|>-` z;8lo-TkQshY92o|{_$v8xHhFY@lL)^u&;r&ywdP$tcBCJA3|c~6BgTb)#GRI{faX20c$oSN>DL`b-JF#w;nQ!mgE&!#pUZU=j$ zvWFNis5N-shU_@0U3~@)b_ci({MP$rRMZzLS%h9IKWi0yImsQ)$7o1qQK+pthe6yWWPcYY#P_md1S{s4FGkMua~$7=9NJN#;hL;Zb&&+ri* zb{G80e;m!P0`5fA?htZbyc7t_gHpY;LlQ0t?}{+U4t?<@yDMBeC0r^EpAr!PutP3E z2fGuV@t?S6-y7`Cp?z<(vPa>Y{zLcPkT|f^`wtUB17=75--t3^o66GYM?6-vI7L zy^?}nf#CNuq&*j~cQak6f7;0T8a`qfplkEHG7hhWyk@%C3%)V+^0s`e zNKHnQsk$!R1Eg?2v+wt@aItTFfx0fs?6E5)k_L?|CR!gOxrN#1+XiQH>zk?UKjA-+ z+%*dp;QBM4(Hwj!yOa8r>}O2GJQJz~`v{#8=ph!t`Pd6Ce%UV%I@v*se0-W4ZAk#9 z?d9XW(u=g&4$eBt$9rfb1gUXmB3^tWq2HREJF(0LV7%`ZQl`rP1N=xh7L~c2-#`1C z;2G3@>GWnlgT^@}c&PX9+45WaUrMg%)HM7oEAFi9}o@gOXd-s?Zk?7=$-A^0f&`yw%dJsO0?(QEzq zTng1J2$Kp0{@V~k zei?HfuY5xI9N`yKl~ z!kqL?{u3mYYepZ8>GhuwMI)Fi0AuH~2mD!RYNkMy?>wLGFuU7-qyGi8*7`>f6q0SDe@c$W)ZDCAb z|6q3^*l`3?^|cAR(|-?|-_eNa>mTe<|8X=|Q$kH&8?*oP@4|bU%x6K^FZ3|f&k=4)p1bYj?a)Na>(G&cs%yak@IhgJsJ%K$zV0nZ4C6gb7U5CmzM#?A%!bTz3T?AGb zgf%1BdEvJRRuqIyL9`qsv=oP=8{xl`z)JhUxV$C7@%lX7DNqpl%7%cI_a7r9Z$+@a zXV|&^5B+%UT*FS`+K%k$y^Z<@j)8_PE|8*$MT?ty`$hII>^U$+n<#w@&wfUFskWZtK<9tuE?|>-1!uAozN-SH^9WJ<$IL&)b@x2Du5<1(^WIUamrE=wYHEuZlMfUO4&+?Uu zUw`OXE*-%y95PscpcCvPQ?V zt=vHt!0Y_}JXOdsPaixQXz=#2Tyt}2L-|St_!>sK*pbN8IMh+t9Y=wj<16(J`-W1d zQ^Lh#Srd4vatIuKZR5rCJ|VTMc^t`K5fs@ENTUb_-;b|>If8z44B0k(_Qn?p{foG~ zC*YF7`LItOlutwQJuVDmaK5hNgv+ymfr${}tXp?cxgmLnt*HwSlJD z_o#O{ddr9A@x4#%=Lg3FC2S2I8hlJwTuxL!9$NxTen9N87&9e+-T4HN@LWz|hv^+g z9rZ|wuM8fk7hD++AVeRG$S?%(=r0gf?PTB67&tW1-~d?FA5WmYgaI_9y-pg^0$4nM zBbD*(F%lfTZ=QiiLh?uUwUwo>u>zS}Pm|2~T-No}qy5Sb%oAKzzP+NwBxn0koHGl= z%ak~4+YWjm$y?Ho=k5T{?>@Vin^->0^gRt%3j%4c(68@fvK=LRJ?1-4c1;80}3jbPo?ao{H7aX7vpI40m0BRDSo z1h&C5gK@YAj4wR*@i+?3V;twu%*SDP@C5Z`Nd9o5bN7ub*3IV|ehTN~@(iPY5b!Yv zL;APK0r0&1%xX}{&8`ov2k~w$UFi6;py7vu5@RNR$o^?H=#iR~{EYlP`@wpUFNpwx zkbFE}Y+SyeXzOL)=koT6w=Y!XygtWo3J~(EWpiJV0bp(j-lSxEke+_=E912H>z7UW}{q+SRlmhw!5lVkV zUx15veSyfN0r|p06bANjoGGX>V3~yTVWnX=kx5sO`~7r=iV&3{Ad{{v_fbPm8q2=P z>lc@k`--4QLLGp;`zQ-EeFDj#fwRZ5rSPNrtLP4axsAgS&>c8"bt0}@AlIHaMn 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 literal 0 HcmV?d00001 diff --git a/auth0/v3/html/_static/css/fonts/lato-bold.woff2 b/auth0/v3/html/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bb195043cfc07fa52741c6144d7378b5ba8be4c5 GIT binary patch literal 184912 zcmbrlV{|0Z8U-4g6Wg{k$;7tpOzdRhOl;e>ZQHhO+vu0M_dc!n^L?xObl2*xbJkbu z!`}OJxyXq!0|5g80fEfP10jFEL(^aafy^EQfq*W5pZ$LfC-Tz^cg6%lAE=xZ%GU%s z83P##Ch}7_e3%!Q9fTBg>laFZ4+!iQKM)upcoi0;?}9Cy?@z6Ky%%>tw~NKKJ987+ zBV~BtSYfP`gDMdo{o&nFop4 z$oXL1NPsIf!3NQIe%V|P5t^GcXU(bIn+oI0I-(Pi^QdP;c44Z{(p8IrT9|(o@c+{e zgFiYyCq`u`THS?5MRLK*ACtv@7{O^c1iE!ygQLbBi~POQITE#|&AQRahOEN*6Bviu z#%`Bd5HLp>&z67^M|l0_dyNq$5JR2#J5fad3AW7A!t?I8)8oR9TY~KYyU3s)D_i@a z11yTUQ)MCg5_;oAoKd9dC}wRJky=DZ3=JvjJxLW!MJ5+ov)_-j=o48=R@V7<8*chuFk$gZVlS)hW+XSPcQ*yv+ z=dQ`KU~~{yCXCLFHNap)&|4zIBLxaPG_@r27@b>6$c;ER39AK`c+&{~)fCy+)Ig^PvF=n>)aNXs*}#Ju zC`&4U5IMy(qO#`8Y_#Ys?CTE^s`)AFmSH$sYFB_CNIC+A8b(OuA5gYTnteGD*Dim| zm`< zP-qKPZA-Z>wQx%4dq;`5MrqV1Adlz@(6rq4=p0eJHO(2$x)v2Xv>#SI=tgjq_mNM9 zSeMolu4dJTrum0spvic0|>+0s3Ne%cRrmsLmeIV24Ar2*cj6sSplOh!8 zG?K8l$+r+eJ3e#MsuF?ogYl|3*}@g6HCUr`vfyTs(`T%XWXiE)ciE_NXF^HEffX2? zI$||g1S7@f6e1;ke?#WV+Y?yfl`LJDJ^rTN`JFgSy+`z^1NpRMKtVR^P4P(gusxb< zBNolQ6$;!~r*uw}$^R~|`5ehLYe9|kOv$!e;!ly~cxQk%%-d3`>u)YOc~*SF*S!~6 zW)&%G9L!Y@BK^~0?R1zbEB7)rzc@PjTKxASy0iaM{fLMlNCXk6Do2sS+v>!#gUz|3 zru)rL)JLA&2MA~f9rT#M+j{u8Kk&>TA~~dg1NUKq=e4(HYcC>L>6Ce+_fGzr3!%8` zgw16sXLJy)>yov~W|G(|%lM_$=E6pSw_9#H?uyuLhjRp_`*G5STTn6z_|X$ZAB9uA zD?!>G)@d3rSBLjjf?2zi3M2`V8pT}v3`}~&@zRK+@AlIhWmu0GR0$^)KM{AN)D5p{ z(*(mCsm?v1wWC960!6B;-z5$swmZDRzj_256s6!zjU zKe^e=IL+RdZ9Q*kxKk;H!%=tziX$o0|hyWToE*?^U z#qZ5^`)PPeKeI+GpJpWz{$eb?OjW1cv0bvE0AEaWH)?UQ$in?tCw#irr)k1UPC0CUjx3q$d#}W_Qwj#)I`PN>ta=2vj+$Z7=E@r?z94qmL%Th^&Z}Rrs zEJQ=}m_OoZe>7$ztW)M6q=-5DWNp*UOhoZLngnSoX`K>k~HciGo)FP1fR z@m2nMjWP{ikro4YY_MZd&4={`p+u2}$j(dD$rV?U$avGHlCbAOYKcX(q)PC6 zOGH+&(_`3gxfAb%CsFTnpL44XUlp}PSJije9yXeu!IC$A$2$=JCUHz{=bXC%lC=ev zV=nBxe(@Pxt|Yg-SL+wrLlm|)E#uO@qNxd$%>1WM^;|3%7R6Iv_4IJ?j$Gj zXgOgvNu34|YteFA{4}KcU)EAdQE15(x%&aHOEG8;qijYzBu4O92IC%8WZMrs{aMD# zS!&g;4|EnHixxi|ao8_VolB35+rlsirm=WC1aqbPmKu{4Po})->pS##s;e*PvJw2) zEp!16e1E(nBC~cBG#mSj=b95%y5Qwz_v@m-xBj2nY{dkPZii*OvbGot3Y z6rX9(KwkC+*QwcaIUl*O^v-%J)13B6iV6Nwt4H8h%`!UlCAMXcn$&b9h?oQgReeRD zW*b3f7rJDBsRA_9g%GVPtaD{mZ`~L=2MC79GA6lnT{s>C?AhC5W#Hi69s;5mXmJ0a zbsr|GEjv%QB#Ds7gQ7t)TKcD{0(!3_GyF z%O&UZVGPG5wK?kAAnVvIYZ&1s2MX1bMm#$$@S z!*`2Ezhg#xH!A_eWEKb&bg=a=4Rx9!6D|7av*-4+=aVj!$oC}n7oUjebT2i&Zdn{B zZWT}Bl;4FZM9Jnx0SQ{@$Sv#Itzy%kSRO2l^O?!&wIDyA{-BGuyj+zIaH{V78Uy(j zQ5Ix?8Dua5s>5!{l}UaJs){W}uentCSLl}BQY`EZXvAUQ z6=y$NaKB@`4S3c%c0y_fZ?Fjde%KFv65<|}sYc$OFe@_<{5^kaNiE8iGO+dhGM#%n zollJY*0;_uolCuCz(~jw!6~5jYxt!5fJVV=Gu~k#0PLFNg;ZsirpB`emkXxBvJ>Xz zjvOmt9yQ6rEn`S4r&>V|Jq%rp#yc`%%tCy`sX^uz=d*he!2Q`>4dg{x4#8DX_>up` zcM7Qg0{`S&e1&oR;l%k6AliKbDF4bn1EhapoB`Uuyjibc$<1$2bn|#i0NHQP=YWVW zhI2s37snZ(>FfF2yZmeV6d)bX!a*hN;EMRL98~?Q;Gx2u1pOFc79jqad;$pn3V+Zm z`o1Lngiq@jZDyObXj5UV{ghzVTjUck<4u++v>>P2KEBYs0KoqQ%&v+p&siWWa=*mA zxww0LY!|0gt7-7emwV=ab-n?LodN)I(blMqG!|%oY}A{z#8=ub5NM~W_j)3#YunM(wy476!s+e2E#TWTr9oYk~bot zT~9|Ce-KLWULX$(*HB(CNAxc)TzLa!SNG#M4hYcr=vdBEo8wXoFGRk5zFNcZ-RT}r zE$&!tz>9P(8L|7t*gtpEX^DUV383e(&--e&PvjaztTt5C5y*MwH#*ZxOwg;NKfOv0 z$Ur>b#mMc6G&FzqV{Sebeo+G0`cQTkz9uiKNV%!vm4|RY48MQ{!oa9z4}EIvdQyg- zzWCSAw)ts9=`qE}_{&R#rx+Q9!$J&6MRP4Trm!#$pF~=pf727Y+hs)gzZ3y$9>2OSR|Wp4hF3i! zaZ!OvlmB_cSU4&_EPet^=zlbF*B&~wpDwDsEz=-D$A(DwiTNygcMfwaCI6ct92((D@~+`GwfPTw`fCxYPsQafqzQ%%AH@2@-|Ta z{L!Fh16HU_9kic;^qi5T4r2n3VhOgJB6betC@m~4G&k#|U_=h?lpDxmG9|xm>l{^H zmAhQ!^GNlP3qu=EECXC^?LrwoM#zwZ${CA@V(QCP040kJR^<7x<}&W2biGx~2{AU? z`0I+WVA7!Xh(?K*qM`^xE65`&Fv5bO)PUyedVYHEUwV7e5Lkyf{8*}+iZua+lHmcq zsNH=BeCqZ;T?2I@Wu_u+GNP%gD*~%I_Jr{htxC?T7{I{DN-nQ1D~3Vg?P37g*zMqp zD4>eWv*JB{2vvfwTwiToJXk@g*M~_K{yODM5|*t&zR25^ZHec+1}vL*&P!gB`ePAO zb12&=T)m>{&ymxO_JB0)rx+Vb483oC0?h!yARw*ngOY+7HB!#Ys+Bz*VKRL&_Finx z4SeBCWt3y4-jm$qwm&9z-9-Bl9J>eidFFP@10q(*7XnsEb8ar=quK0O{Mb7q+YwVN zt6Lw~;BRF9+B_+ThU0I6pR+NXz_Zwg#P_L8YADi1qUphN-D|dMb(V_e`%LXS!tnf;I5KgpwtDDa8QK1Yh?&%S-X z%vi(nD8uqjO8D>>ur26O5B8qB$$ok?;LxdScL39i_*UH9@GT$f@T*!j4}((KU1(`& z>?Q|RmC3`!OQ-WOh$F_A{77g0XkOFjTfe8EZ4-_upe9=pkU0T&R^qd^rO~@=_i7w7 z*n!Ew{X>P`=ZkQPvR9GWq7XXd7s$9`*Ao~16#S&VwryD$sLdd}YQ(0C>TBkzC<3iR zegk3u1;%(*v-7Zipb1@x-q@u{@LQj$2Zufa5SZ`my?w8UD)P?-?0?>TdqK(dA7}o3 z3Jdd2i7#9_0ENDLrmrXyMM@B$l(MVbP*}7%lJxX$H07gBzWj8o>e(6E)A zlpQr5h8TUA2k7Z5qeKxEW*8e*R^<>DVKY$ZZJ8cp**7djKEo1tz!AN&QDPsk zgDrv-$J+>c)Z_XZidYf&Yk6B<8#O%@5{oJU(Gg)WZys2?PywasRtyivz^=cB>)vWx zv%Er6VlW6t^RdHN6|7cn5slCUBQ_oX8bxb7k-h9g9SB-set@fZ(IwhAt>aWm^2pj4v zw?N+4U6tUdkmx&gZvfC9+@44#D($xyd}R*cBPA3B)lWX2f5qVY_-|B1iRS1odfA`*v$Se5O1;{)Qp73QF2i zyd3Yod&m&>0lynj$?z2cLsI%w$~V32)44cLU3?gh7ybZ$e&c>tBZwI|H^= z?YWn-hJX$Z+LZ?bzvXFs;*&=A7+@fODXm&1NtN)6kfU&c;U`43==iW3{g#zB80wxT zDI`IyE6;N9T`ljuF=Qo0sDBXh1KIQ}@lX!=C}CO;)9pkLDNt<%s&B(aE;9^31o6Y$ zqL4Jt?a%$qaSb95i+}9nV0(lVPt2;Jx6l3QiRr5Q{G}O5nuR21^DCL@eaQw(%lA`> zXAc=WH(G&`rD%8#9fO!8&%lhn&Rys7)|_Po7+12+TXZp0EaVI#$5%MvMu@l^b~1_r z68lC7v6wO=ld+1Z;4rYgGJkOKRLQ8A6J3|j9Kk3j5&UNhFpg!oWNTL5&r!2_<)YTO z+$Kq$kLXY3Li|Tjq+ndaKfPbT#HZyxW_a}d=T+c@7&0RBF1Vhh{OioXJz%}oWQWNQ z#7%#UWZc*eIGWJVadLUNG53UobuZI2yR0R$9p=Akr0CIlh*b1g#P|9l5FCBwM6}w> zw5um-detMc5CbW?<6eX$0|kB&ym6BT$mcw) ziZ`&-6E(9o8mRY$Qr^KlrT|_Y&jI8m8jHM8b zVaTAuoR3Z)qUydfi<*YW=f__`c}EAw+x^6$_4c+2asw$!K(~Q;%&@OeXS4@J*ZxHG z0UJ|vIz3#6yd}p697+h#ER0*x^R@LeHRSX4gjR2_z~leb_v|raG-q}aDpeH5QCG^P z=n=&P=yoC9$-jFPK=Vqz;=on>x&fIK{cu?}!oYSNh4sxaQM73s#WPb{0BLLjPMmGA$g>T-s*$FMm(F4PS z_XPmBdhs1=dSrWHx{~BDK&n6Gi}noqijlp65%A`_$YBQTE*Otp3H!TOHdW&V=#pkB zOKP537^&5+?8z1SF!t?Q7I3&n8c&h~&{%SyHZb@YJZIPy4cdSbBS ziJwDb$H(RDKx<+bGQ%W_77r6?9`_cr;CtCLa2kI-Bm1jY8b$<>Ug!@Wy4El`M`gZL z5}L8I48O+1)rY9vz!2|wB9rI}2!9-*b@XK!izkr*Oy2stLPM52Q0IjwxRI;%)69!P zExopn5Gz}cYl0Fpf-~@fY9GL*keEHT7st5*{~W!FVjtuMV4K2Uk9Q?w+CoVJZdCmGgT@f15ni zUz0)5q>$(RoFM+lbuD&9`t5UI0AC029KZdWNm2>wh|-x+O1$4(K{&-(?MElT(omZb z_~P5YdaUh|h7JXQeQ|JGM86lGXO)?6YgI%Qo@K>9uybQfeeg-=D@;(7^zBfmI@D@{ zmu2GYfnRYtIe?(>s&jN;mYK)5yD$I#0Tlv=l>Ws931-SD>7Y>^6*H^qOEX5B0R`SE zgotG77F|(y&hb52W*-P9D(uaS9_-c^Og|o??KY^dSx-Op34t}BJ`YUpPapWURWL)6 z>CU#q%z>7I(!#n*{NOn>OsZWDXG^knXM|rIOnD1T#Yk8eQbaEy+<ciatH!D%$#@mh07a$-mRg<)SS0wP z+lX>B2;URdY`n;sP6=2D5{KHBSS19Hc@f1h2>Mjn<2-F1|9NG26Gvt9b>PXV|Mb_c z!|HyG^Tg!8<*{GZpQJsK&kQ_Mv50cSQ_4cfXh4$ES^$F8g zg!lZuO+$t85HK+pNXhjJZuTA7HZy`bPy#eP6a@s8aEu@jaW7w&twzyxjY3M5RY)ZH z{&Z1&CE+=dDP=mf1X?%XOpVQ!uk)(3aN}6)GH1EF)Ovy!4LiRY!q-O6%0YbePb>4* zgqW{-BBk0nl^mr5xp;<*e-W)IyaUymJiRiKaM%F=FlXE@l6T(k3wEyX%2W86`z5cb zbU3NbH(NS3nGYl*8IUm+KQVY~PGB)c#!8s2+`Rxs0 zT)B;di($ww2xP{`Gm?}W=}Tql&~)n0@82$*rydb=YE}7-+%RzLa4>Xekb!mlnq?~W zl2vznNGY-rPSfKNDY4Y!dgh-IQ38BAXGzNQXS1hQ$K)YqA5&P^NNONHJ@KmPd_Y4!Rq?FTPJSnFQiMUW}4g!Gy!Mk zrf1CTFtLS>E|?jB?X~jFQTR)muAQfa6dy(rXX^S_p4Hdt2N#fcm%bHhW$~&ZWivv> zlCh?$A+@wOKxL;Uh=G*8qasQELiW2pvsCWt+!tXfYZ+_(YDRsxcwel7d7~xm&2y1v zA$;7N{E>~*P#R%^TN`2L*zNZF<|M$|n|~7?2~oMQUdMd~?3mUck=uWdh~S_$GaH zhLZAe&1D3uDEzn7ux^e{eRZsb1Y#`(#A7rSVJy%DDhq@Klp|u?26Xj+V-JkSu)^>T zA<>x`A4ZkN%ZRsJD;96m7r7W<*rHw{%2WaB<(}@wYBhTBP6R`u0W>2JKcC;5YO4+s~aF6G2j)ThX(O=f8NEsY9FP&21;aS8#=MR*k7Lw-ZI_CLPpjR z4-gIs2@&oH7ch!ZPr4F1pj^mQdDRLDmyn^%UHbUD8QW8d=YWDpbg;DC@5LR8v`3sF z72Fm0G|lbwMiK1#v5{heW(>B32h)HMW5aoJ$U`i=5PUv$GZ z+Lr@CkA`Bo7EfF8VPtLBdGDW_=(N4{FZ}%HG%|E@Ka<+gvqn$r0Md8Fvj4^=5heZk!jKp3ana@R%@W8BZtNg;pFk&MCPhY_V1Ow zAXUrU7&f(njp6?WgL73)lNUJ*D#P-mEiR$r)+bd#R&gacfuXL$J5{4!i1zX5?7^jk zI&|jYucUNf)XD7!+kkDkPu&aLDB299UNmXa-$}oa|Gd4U3%8n#u8_(RIzrpF!2%4q z+$2wGB7bg}4cJe3Y1QnSA7PxTHD+&bIOho!tHUTj5d{!O>~Th6r4^-WO-T)`g($7i z;ir@l;rq?r^qPJ!r+aoTO~}f2YiEK7auT8rV(!Cth$p!)2k%E?fW#DKFB?35(#8d~ zO(!4zNsvR<9@HEB zg#)4I^t4k=fE9#m?{OEHO}>5Se)ow%&i8I|R~}5-?c(zqA5EtPwy1;U|M&j*W7@}N znWr@@zv6`!hop<8c!`a$|$5N;u_T^H87cwNqg%CGJXo!g9b%1UjePWgQG{SvMA!mZ9O z(`J@9oS{p+_lXP*HZO9WCC7>_p4|NQ7uhcd6WMYPPm4csHN@;80U^?ei}WlC zsp!~v9}`H%C1k0Jb#>?A=N+tY z3j*g_i~qP4yL&UTD(TpUN&x-2U#wJBzotk})k$ngeQG5_7#^)!o`RtR!uLPOB$9|9PmSfSZ|<+u0b=}Lf_}%A^?-eaXIdPkEbjG(jl{QA z&5e5I@EGVlyP`|p@NC z^GEm%1QRGl2|E!wL-KRYce~<^SQfojoyu;S!$Sd`ZJtbTj7Qrk3|e(C>Wl*ydJZOk zGarQnZE|n47eX?$ZpRC&uH~K!!IFqGPI5z1N)c*oR*+zEy{Oe+MRb6krp*MzkLd-3yz`eXA821en>_z z<-VI)2T1xXqWG(#Vxe`BcS;0gt${F!bjIo1CFM^L`qNWm^dU3Vy<_bz5i&v?qndj-}JyxbRAV?nQ74bH;5Y$e|UuyO-d9AJ9AK7(j;+U`CMgzDGN*iCT*b@g}2#=Eq&Hn zT!xhIi#B)TEOnBgL4}M2iC}Up-V#=yc`GB4FNh6Oc z7Fe6|*F6q6gbZ4M@K*8GtLqp)H;|2qD3N1rf<(;`$2bGO6Qc@sq|7L@L%FVugTpPNs&KtAWCGvC{vGXsH1iJ3q+kjP3bhqSujQ!ghE=FpDN8ce%qH) zZPy1yvPy}Em+sJ^-$YASuW9g`BUt@>yV_R{5^2}cm>C2GA|TY~7T{D z&-hd_vQ|xg1CBcTuM%h^DO`W9Ciz(Z;(>-pgw$PmwQckpc<+Vql@e8~V_bC>?9p){ zFV*0npWS*K@_rr=3UY?r^{ccwVY11!iclO0b6YHvk`Z$)U zzzB6VdSebj)3qb%&s;K&>)J!Ec2B^=;#s_LR)zG`C_Nxz-p_0e?NvPvx$&bMjdZt+ zfBIK)K|MnlbERRUPiQxKczP^mc8EJQxK=d=>WnOHpn-1KrNi+Ddj@+NsaWFi!}4ep zc}A5O%s_Y4sB?G}Bq`*TIJF&g@r{z`GR(>kxI%c(um?$dx6?U=>{4&S5Ji!0Pkuqe zl~Nh4#Y*Mq%ZDSZti479UinxZIwX*4yE92OW=}+lMX}2>M;{#L>QmY_O&)fT_mR{> zU`EA-j7FGQHoi{PjrExO7rPwDh^ccH8V1B691f|ZSGCI$-xlI^le)s=8$HO3M%p&y zMcb)u>RkW!f4oN2vRA=(qm_J&Hjk91%wP?-Y4$AgdrpY|tg)_k{49 zK>iu>m4NS4(+e6i*BmjE5auddC|?j!i4t)nb(uR1_7R{U z;nbE&>+pkXwO{L$g*Z>15*5a{C_?FiCop=(-@7<8bXRfY7U_w1Zu!7uDbWU@H=|Qf zj@xcEnj`*dYKebVC3~x-I90e%p;+`>d%plVEwX74L^l78wvT2{*=prw5_;SGp);OB z^QhVBoQkmP^Q5z4SN9fGGq1`;^>M3?SAA0q*5kB#w*rpfw#PKY%B!}F*ph@OzrgkA zRKXLs9~9oL#h&jnTtr55Bf&${(L)OTN$2A;_e0t1@-Yjqvv>XZt29@SG) zEHhf(8Y2U&yJN_01D3ttE3=TeJQ)HDaSK1Gv~(jH#*%=C}OBpGW-<&teshW}a59S|g=bu;7<^Hx_ zo(s(;ip4&l9Gurv?+O|tqf#=P` zxUP~NeWJSpihREflZ@HRt(-L!*gg--Mvg>gVKrBke|ECc+h}!o2z*Sg>!J>B-R^B9 zR&U&QXUEAu0XjL~L&8EyNaeeKo_3_L7hAg)7#m61c{$v{gh`H3GgNcY_0T=7Nv^=! z8)3C7a%_b=APCRhKG$L#|1JGnnB64qBBhOk$KweqMDiO&iDgH3#nymn51;iJgdhV+ zG;fBFY}QsH0xnQ8pCyHsy;$2G-@6(enk9B1uG5`V4W_fhQBq=V;fiM84t8vl=hytz zFf`huhL2pOrral5J1%UexR#JYCYvP14#h_dTRa9cS%kvoBEFVHxj3$O#LBT|}W32_( z08#(o2=7yD1s#&k_s^}&+Wor&gLsdXLO9cU(Vvl2n9m)CqyC0tF64iw(=-Q-+!%VQ zSO^Zbi3Ay#Y!98dXJNFojI}xk@kFW`$W|n?-^37|`AsRTufw9_R%2oVU;HaVE=@Zl z>WMivD=_C1HvOe+e|bE_xW75z#}tchPt=*?L(5`7?lL_f zm!YsCU7OUU+C!tA@~euP=L*N7=T)t&j;$2G2=q96aSzyB1XYvp+V?1nGtovs(xb?a zJ`uFuQrJC1xDZ@$Z2BKN6lXq`IOWn=6;@;0jft$oJjn&?7OmvqnvX$^oo?Z69O$N* zw2QoTJ*PVvv`q+&n}jH`8iR?}&xf#+4`zn_9430~gPmACGs+NDJ^02Z_4jx~Ar$eC z`Z1beq`#20=Zkr!uc$6WOMMTJltUcZx+lV;6wfq@;@7ry@9B0QI zEz@)^j0l(z>Wp@Yx+4|5nyL`5{)kPxj=>2KF9_X+=dGK+eDwQ>&5QM$S;L#N>GolJ z8=9%u6p;#OOy?Fq**@GRaNW79RV*my5#-1s3!TFkY!l4l=rr^hWLh>Ecen$JaH#uC zv6^iz-wKRY4_yyMP+7?3n^K*(nL=bAoe#~y&acb6q$lKFfdyZ)qM=;u1z4*3H4m_)5mrY)j!reNKo8F^36iRWk%b8h95O(mUd+}2pUoYdRahdXH{i@sjp z$3B#jF?_9Izcxg$+8WmxdAO?N<)K%odz4!nRt|QC^?POpHXyPv)>s*FNqydOcZjPl z>p_)WKVN42h(<0mE0m#gbN(i3xaP>d+PtWV0@YevhrA8f7f}L3l~JB?m=FDmg#8%nx-Ee zfxg$1T}0PIR3y!&&kTAON9hVk zc?DIcdBFf^<8SN|dB`S1-qDUn%5|73p^vV?VZ3Q<($drxXe10NAY&l1m=LQ}y&@p4 zHw0_}5o#|K6uDx&ka8>2!Mj^fUZqjjaXvj2k%!gUYi9UUmr<*Nz5REx(pZv8|859V z*e;mFsaese@lRbO_zAxRA1r@#l;#tX4jS`6%uM@Z0|pq}VR?hDgixubPlmq{|E7vL zHSBZ0BR#P88#){=7y9(t8x@^r&P)uDlO-#J-7&vl^WE3}t{?rQM0)zI37D75-Mr-1 z)%Ic`(+#>Vv`?nAP-t?=2rbFBl`yeC!S8q2mW7_`vk24eaM1ONs`KQFWV?;r@7~Q` z!OF7EGE|0bMN{VG)t@v1Nh+{PSRHI`5OD(*b*uiu+`rfQeE2ODo~LZyW@}2NHzZ1H zaGjLIPqm$trC+(@HlN)v9-E%i;W0umqBBm>457&6Q25EnD&fn5!$A1hLP2~#)8zxv zt~8(p2?XQsE^iCeSjiuKs0Mw zdt}P?@^Iu>){76drYwi;l*@=6m5hO{oUU#S2+0rmJ02Zg*v>aS2E2iKirLr9KxY_;L?b`aTI5v(7SX5RuxuS0(yUR95BqDmgdfD%D7 zB~wi82&bo3O2m#t{|`a`hZ*Q|^IUhNZ2swU5<6k*ulC&ar zotBuZPRyZiIljGBx0dIu1-5R}bsC6J1iHww58)SqEz)0u%Mc>f)>k9kO;H=`vdnE% zoZ&Tc8Tn1}r?6jhLDp4Y;!yB5N6moEw0ypHkH5ShX7$`};!A-4BTW1cD-zQ4T;Qbs z(;=?x+Kj%blFRy#;+%BSFOYxrrZ8$R26xcTufUP@cdm=gE53E;3=vsdAhMJ9mR2*% zo4T=vGzZOe<;c~Ck1z1|gEHbf{ScJM1myz`6^XUB2bggz6GT7cT`dF{D}RHeGP9=U zd~YgJ#%j(zVTPbaoJvYvFs&7u8^UJQ!T-b(2aZbYMDff`;K!FsQ~nY_41iL_2y+lm zL2!}W10SW9@{IANwL3#POZ`t7bK)IHkm5OnBbKJz7o@hfva@lH-LK=XXiDGQs#+&R z!2A|n{0dGGFAlWLICg5g#H22)pO;IWEp;p7*xzR3Ua|ke^&%MvrrH=;Xp~oUOY;P1 z1Jfkmu73{xQhVO4iL z#t_woN!E*bR`goy5Xiq*pAmDxbMj$Lmx}(etN82Wcwr;!+}BS!7fpq!{72!KiZWTV zMgO8j$Gfy$TfrGRS~!z`2Itw2TXNMTu(@{gz{A>0s%FPDm0(3={6t~c*G0Y*e ztJxXH4s%Qc+8%owo2yDgs_ctLx}{g9q3fx954|BYwPOx&v1NWmv#a>E0*UQPJX!L@ zNq5SUljTH@*u@hIzeF}wb&Y@4J>>2f+z(@gs|_MZyjMx5$m|d{No9U4b(7%jpe(Ho zLKZqiTZ(k)K4E*RU+wXgI_PC!$;l~2Ni{cxpF>Hn90vnsvuRa z*vWU}FWFGX8cnjT1a7jHBBy-}+lc;JwcexC=y`a|CJyu;##O9@O&fv7* zevJK*cgvOe%P&8#U~1MA3$~tMTE|}o-})&yX*R6G2iZQCZO##{}&gB8U0DZ1JMhP_$n_Md)<6Iq$v=;p#IF7i`m)b83He`LY&f*VrEbla_U%K_Rlr_^HLXfSXxn6QM=8~ zu1@sxyIDD}kqKl)kz81fTUC5EC(|wRp0d)iB5%vU=o_iWF35{>^cWu{6@|&1gNky_U zKFP9!;aQ(>;D4Rwf5PLp>fx*_#_n;VuAM~!C3q~MAA$5EOZx58o{=N3h1YwFN)s^V zOd}Mqw63BvIkcg1WDVUkC@%PqQ(Cy!fz-5 z3d@4FVKeye19>=)npfSdJhGKSD$cco*GHgZ$(bLn)Gxo0Fhj4AJNn10>J zVgDzurpsiqat=;!4=zq_o*yJbEIxl?F(pD6`;W|2gi{3my}4t8gSz`)77ow<4aV9G zG@JI*o&`J)HBvuy5RrMP2EmEwCGXQYmus|(?aI;XZ^mWn#NqkdcN!6)J2Sm5AN4dT9qKD=~_EcnW##PoV2X8l5RLKWQwxK zyKwh@=QghH7b?Pyom6nHO+X|i#h4~ns7x4823`}Fn8%lPhv3wJ8ob4ML|34t{<}YV z9Neonvd5MS2dkE=VyJ!6w&MqD;6X4oG^E-A7W$_2jsWuwlJtRqb^<3s5&i=Je13w0 z0#W_@&)I*5Qna1_;sP&w^@Fa93sFl=Un`=bkmeP~P*eeV6o+KF1v|pY_Rv+9&6hN8eP=DPUTAZ_Y;}^ED%WQ-0KH6`>iWMqw`)#&{GaZ zl{>oy@G!R`VS_V2PMKd}LK%$9$Sf3`Lfl&+T-#_#Ip|GKz$rmS%%)4Z>|h{W4O)t; z^$l3Ed=g*=PBaP}Q*s4>`E+uSgl9!E)WafK6v7I$myej^R@0_^(_<$8((UQ`&><0X zVt|viK|=8RF^t+t#tl$uiEyv)vu37;7Y3QCE3NmteP>R}S=pDD5% z`uK-n2%Ep|p#NX-2mXJ@Uzg7YHvT0gTaRzg=W8w5p(#Q= zM`3K6(X?#fEn|6EYN2JtHC}26uLjd8zXp z|Cd&?bg9QmTQrYparfanm4Rx9x9OA1ofEj;!03^NFSwAYB)>7UmTJfk1f7Q>nVfAA zU!v#xVF4lCXSaQhzm9n7tEbcS7fr*u?-wpTy=@oUX#WzBOv9GZVYL6$!DH;iWPbH{@85$NYS`oRLue=i&6P* zU(U$s>Adc`EgatmuFHo#v4XbnpU@lgU%6nNKZxQM#GNVE^k z58{0UNns$-beINyKxX?;j{YBXeFan;UAAuH?jAI_1}C_?yM^HH?ry=|-AQnFcXtRb z!6kTb$ZO!Axijy+SF6#6Ue#5n&e{93qVo75D>NA*&7)2Zao&ff{$o`A*ExeQ5Mw4G z)Y!(>CQcU*GY(|eJ_9yIOu&w)>+~ISd!IJCGu}_z^k8<`&tp`SLG^$eRcwX+hqS_x z)Z4-CzL0&+`)?L&_2!vd6w*;16n z_4D05+06ad=0;7%FS9Ge6t+Q$BK&sJQ-wUKu%1*F&{aRQ!%K0Kd4d(CixP}PYc3IO zc_~c0JqWlo=>BH>at!-P*6k~7E%8A5C87K~wkFcH8qRJM7k^bJ_fnN|-`c(=(S}^s zQK4Jm&-QisYzDvDmKYHa_7LFQp5zH3_EB6iSNVq-WDMTFi|5@t*y}Lh5R*-QG(pbo zG@Exe%a1P1Ao#C=*kD7v2qcGw!%9G2S&dgPG9-OPW%l<=NpJrFEK{p~cqO57T0xwP zkUSE?j2(t`8o^eHA4fpcCm8Jz>3Vco-+o21bmQ}Y7et}rLdrfmc3F{M5eL-{lc@Nm zo{8q=$ken#0pO-uzM@$o*r__roXDFOiJB{ZU;`K0B)UU9S^A@f^_}NKMb(jE5`_sE zMRUrQTNlu!2*}n8#_3awV-5PMSOW3NZK@KMaVUktyHD`rB5l4Yip3DLP$={vGumBg zUr30kf)opjaQMyNTcEf+oTP0U-Os?Y#`*Qsy}ZfhNM~+l4DcV62JrHmMrUD0S|?1> zbWKVZww7xp8Q@_+ip4B@87qTUaWV3iR2BIwT|~e9d^%hMj__kh?T3QnT2Uj*|?^@ zuY-fpaCpqTBN2UQQa($4E5Xh>-+kTEe0Zymc?}oue$S%<0ARqG8WP}JAM;oM=J!9; z&D%6%vSV)UyIH~*P|`14QKCGKm8iV`lC`NbT}Z7$({c;1H}RGWcF3<3MAwgrgB*!`&lsQoKP4UUv#IXe_Bj-1`D^m*mSB^Y*Q8 z4u!F@L@P*qiTs~7`_C6ik1Pa~SJ)%-Dp{pRugXf4g?-Em%;QfQK5u zP=34qGg;jui9cy58Fd7`G}F#4?M_q}H4${>WK#=`HFvlmmaZ0;*&Msvrv=<(muBVA zuWCL(5#)-+$6_5#{(ImFsl+mb&nW5(s=>o<%Wilwkq{uzRbj_sWlKtVU(da=3bgz>6`)N`BIKiHD{9W+EpT z{O$3%srKNP{Y6SfkZQd;#QG=pKUsbBYX@}fFd$)6@PHh{JNm(FVpmyI%E`-c=YIsL@4Y4IP&>Be$9Trkz=!mRpu%4XAgiHEP(e`TG2|hE z*Cwk36mpt{5ESrE!e2OT2vI-kFAa>hIs!KTqEd7N7$7zQfUbi|j^voi+GvO|Ba49Z z+>)Q^H#Gp_&0yU=W-iw86%UdH5jpyapbA(T4W%hwz?^^SmaqFWyFX(F10pI$R*b+l z653`STOy|<*~konYlK>aIrDODb9`m8 zsOj^h2Xk@OAh%gun}@Mn!4r4RSuCKEFeC&Z54GF?08D|>)sdry*-AB@uul7Y0tccv zAOK%bmS3S83EhI@3tUCbV(I!OC^tvKiGP$>bwiS0EKsz@HeEZk@`cZ}L8bxxs357A z#;SoogEP2gTS~`}vWG49GgCI80<=8BC-)rHcN%tZePN7YY2?(<=L=X2>&{zLdB}tY zU_q_@L+#yrg8epAz_}%8)ISu_T1Rcb8wyLCWeqF%thnC?G8z`IQZGx!1b*jfyAkQ< z{6q$7h|1DmM0&vB7)Is1lF{VKNmnYpp-~3T=HR;fgStTdtD+)@(#QGsLbmE5^J?`4 zRFP$|y`e+S42%`fgfcv+ErMRxHh00*ctdl`786p-6u5&cV;nZ7^dz(3`|FU;8?=_* zI;IoMd;S;}3*ATz-?~xIwTDI_2G}0V&sP$sV{^mI&}(bNlh~~U$^)ueYotPGm#UhA zvJG*vzx3rSr6`}&DUnx%;1aOgJXT%Acda*panM{Ld)>4!V9@Oa)Rb{1K)M3_M$}k1 zq8~>1kG&n$$i$e$D(AU(ak3ghO)PioFfhLy2uShRd2uTdoJWLbIZ1^c3lKc_=eM!u z&!3APS)WDGHr31L^epTZt+jg7{cJd^;vPK>RkHA0m*~nmftIP&EX(RJ^sJ;8OX?Rw z`~?D{JYa?@e9Y3`f*q?TEBuo|aFyJ6H9(?KV~h9G9J7nrhTJOVQGx8YS!>Qwa{KJc z0{vkPRYvMHmQ=EyRZ7#GpJre43HIda8Xk$b-HhM~0sYhaHDwfBabe>3`pP1*VxdAo zd7*)6NOT|YD+57@AV_3>QbNTg6ZB}{N#RcixFW@SrES4{lI!Lnan?_Ao#p(KgB<-; zC;W-CN@D<>uO^ITI7d}5oIknAWtvzNKTci)!;l7O$pWEUDG#M=8OxbZE`;hZK~k@gy6({?ZjjK6^wzbP$fr+ntN-z-1uF6&`8)fK^&FE zSQ;fUnEIQ3GM+MrlHL!VZsO8q)V#vxx)Txm1(9mHE&-Zv0<{Et*Y#=y2JRVIwtex< zCI&?~CIH+J$aWLsh@;6MFFWstLfzSO!Xm zg1ds(+I6$-$>#>}P*xxmvagRhR3l7z@m<(dFn2`Zo9CmOcV~G6nD%HXxk@b}srU{e z-YI0OSp;qvZ8uu{u%RI17#)dYfM2MaB{}-=Hf+FvVS&vv5@P)AARGf~5xfn=eMw)_ zxY6~`oJoe~!<|u4X`0?J4xS9$ahXqW#AdzLxz=2=Q3o;w8H=*E>B#kia~;4VnM=$s zd7^zKFbq#8z1T5}I`X|19;O0MNyI2odAkTwPP(YC;j<)xbt+4{TkP_n)1Oe*NH_OO zE>UYY{??6B*2WKeM~;krd4=O&L&?~a`hH=)NUBOSYsEx$mBrjcGEp*Pv)nWs_Vx8g zq(e=t@QOaAcC9zxYM3jI@5OY*t_TH;vruR33!ACsBQ37(u8r;vK4=*{qu~0MfLxSo9j_4#ZmZ>>7GZik?pQT{$JMjZlupk)6zT6^}f!O#Gm>l3IbRbNg~* zm4H`+trv(QIupyk2Z~E0UJqh31(H@nH0iP7N`_PqI-XaTWBP42cS06gPCU=4#``mV zl(v~H%~z_tRZ{9t)Ud>=T+*N&unI69X}-Ij6+$=%8|^S|auRN$4Q6xUqhpL!17ax* zdOc?BDW)eKzl4V)gxW@pdQ|4&Rm&Hn@`V1#Dw%3XfxYdq3yrd)(5}2u%+J;{w*=Zy zB%@WJB;kdJ#(~H!LmV=_CD}8Kx zSRVB3?<#)j9la>EN2AFO6Mgin&Dh=XtO&~K$U$2`*#2aO=m~H=b8Qb^cb^X5>&HaR z31Y$D>VcPrp3oeoKm-s;)yA0JAPM#Nq#yUh*Lf%nCB>%B-b)V?9QN!aJFj&Bt4ODa^_$r7Acs{#8I`e1yZ)n{E~R1}B>@OGQlwhW z+k$pKN%8C!s+XqY;ev6rS z6&qJTkL})}{>%RQ@>v*WU=1+kg2K0g-(8{;pKfR8N-*)1{1&!ZwYOHYZ+AXETcJF0 zV%!=hHX!zc%ei=%o%fH)7xA$MB+f&|KR8U2YQOewt(ypsAv6iUp4OICDSMHXeprPK zVW{Q*tp9m%U@!AHAOSq~Kqj7h&GWZvf%trb-H$a&w~*ur#qtkjqcy@`U^NVuKc zOAxk~bw8$9K~hK3Eh+q>yw4XIvS$+H-Me;UIe27|;=c#V5{h~Bn0 zt8l=h(k!Z1PcHH*F2ZUGgy#B_`bQ9agyq>2oUu8hg(Br)Fgf^yf+vV&7q4Y-_?P2N zWwLHbrTlV*Z4-U5B#W0?1UnN+%?>){O}CD{{WWd!Zi~moArmijxK5$9Fz4uly}OCi z6VEBEE5T@!duw5TJI{3)f-@pS#wvH4=dJ582;dF?I6klvoTOv>6*zm01Z5G;{qmUX z;sT(gLLX2mJmUpL(o8bHwQm3Tk!I<{=#04S5npxjspDxD?BW+bZ=DayHOfO6Q6te2 zvP0_FnDibYF0Psyu7}5$FCO1=Ku$0KClG+AY`phw8Ia?7D?1N3{lrJW@%Ec0sW?Mp zOx;Ezy`A-TWI^Z)pD-|BKgr|)K!*(yL>XV(xg2_yi{1d2+xia174+w@j7O`g9Le~R zEv5M3u1cjYOkQJ`(($-8oAAuswjFop#qz?%U@VZNFE&g-R9O%+8GUAmC>+lfG*(!3 zNl65uMbu0(oG%Sa&i(jhToYo_?Qp+jaw2<9iFXoTc-z`ScMcKlly|6!;wov9aG2Q4 zePBlxYhsRz@uL!YLbpz`-7zUElKG8v1htnj?B8i_=uQ%7a$eYQ7S!47FV-?&j9g$; zTYk#1IQ4v@U-1lbdvSv1`8D=nIr1zjaHnCiS~VF7~e*> z;R1=Pg{k9d5~%A%;r=Z|JX&EsJ7PKD76c@f{9v6Q`FS`9GFs3jO)pu#c#=**)Ay!w zAQeg8(m(Tl*7a@ez{}#^WYgnD)yr?!zdxr|?U_&Z4rpV+NCnEmiZawZ zbIA+z6vHb#c$s3V{e9DIAq&YFGC~S4sDS;Y2(Z7D4$X*t5n%>I!YKDQr(Gy{@U8LzFnOZ?Ub5aWgweiSmwaN&mGBz@w)MQiq0RQSFd z7It77;Bdev`{DaQ_(#ZL)dOx3fZgoWeVF>mv^JeTel$Xtv{C3&5(B&J-DV~YrWls`}>4i<= ze`!$<+ItPl*n!Mq1k_riPIv|U>zM|_#N<)_X&)70Rf5@AuqG_%^MGF@^m|yRlxGYQ@eX367gP1Gy zq}js+?zJ5(=nrPNtr=VRIBnhrLLDBDN0|v5_428O>DkW=EKF>StYDa=gus8c1)m9T zhJcMUYv5^uNAeRVR{GAu8DM5+WMyDsa<(~Sj@z3nr~ZlC<_VEf5cOk{_-?ugSm6xN z^YLc-D2tZXB=|=I^iOfYl=dH5lE%R=8}KBz>RrK6jh%!j!SB8gOWJj5!^~;(rXo_H z&4Y=L3=>yn!PVHEW%L`$Xc&%7!bY6l7lw=>8tXQV+_bAd1b&T!8L1K}B;>K;0~fgE z6&{6);o<25KfVQ8za^~T*_5-{c189%3^R6 zDxhKTDYlQcF_AJFy%aB)ky0c>lE7)v<4mQEG9;3SD0Cny&=V7qNAS-aW^d1|dH-@f zW|cbpa&xQWt-L;HW^>Q_c?8O&jzIWp%&YOKBb*U!6*Jd8e`&|`2|+Z(dB>BW327W# zk;*MkX^}Q+X++t>nBv;!o4G5&hsv(i7z}+a@!1nDwBK6=(BM_hF56s))04Xw5Q1+* z2m|Pn%Ksnkkmn>8IhyBUj(M{Ee1@j7eD5dCUs;W>g3h(Wza?GaLk^H1{WDO41m_}5 zO>ZKYCJ?N`pyV_^oY#Hi76r%M7TVsv8HNY9A?Wq~rV~?{UTk=bVVz$?!h3pfLTc0s zqk%A5gPf#B|2IOfJi=PlR2Whe*sv$HPQA!WXX86A8(hFQ?-w>LJw>@LMc|Cg@Ny}q z@hSRIfx{tkgNJzLiWekG88XreJ+AR2=X-##%B3DO7Vjj z2E|bLNgOp*5aN}vw>*~_kK43$BNY*PvoJ|x|B$X=P$`-FP@X!mDrjR>RZG!LmOKsy z^kbosV$eNzT-Muo(xAT^O5Pbct0gbKL9jf~((+G#pXlRABVUr{En9uVuN3)^YP^O} zmZ^*WLpel}d03LYYzg3p)|P0Y#O8(gFPGQamLre}JG74e>~mCIShM2|>kC^53wvRN z-pi`_D!a=69B~n$rW$ky`rk|vkTyY0FS!j?CYk^??{>YzcM%kfh(V+ul&B7?*q`FO zTX7q%h|Uz1U@hdXntzG~I0Y$xK3kVURz64X^{E#6E|Wv1Pku$?;5l;hrz4D^Tt%4r z(ME;Ii(JZ7q6u}Qx({3Z8}gI{)(ukvbdEmORdU5!c;D5Xx2o@w0}i=MfXV3 znoQ0##T|&JJbpmm+^v*8XO)!$_Ru>P%18{LZ>|ba9vO{Vk)67|Sw;Wgo7~|e-CU_M zCPTGt1+HI&cWxUTh4e*0(6F5d;|!wl!(dRa7xJ?iQ`s%>aq`^sh}x*I#W2Qy&JDZh zF2#95HIuMIZK8*a5&L@wHukWwpkse15pUAz;(0rE@zJizRdtMWkz-+$JXLmy@8D?I zy@C6$39d(~vA|!Q7kYAc`l*6*4a3`Sm=ryP<)4n_ev7xq2A4jXT^5No8ts;i2knO0 zH+BS$@gy~pMQ02S*_=M*5H;JFs`=`DVXWOjAUG2R;SBGf7n7GP1YdYI~a(rxjRwSJ6zv$yMf_JdqyC|vOmBlEE)9<{*W|LGsx|_B~uzmtZ z3m@<8a69~54IXVp>_^%Z%tf>y!~i*}d3=V(*d&Mt%xtt^`e;>X{UJTexEk?~mG0_8 z0nD9AliPTyM7t2{?wJKm*7NVKQW{zqS8@NxRD$VnhsEB0)KmOi|1NFQx!a9{O2%!* z4H{eK!9at01EG_U)M^p~q`}Y8@q?Lz)7u3X*B6%;zqgAA&!Rii7TLQqx@68N;wUa% zKFh+GC>1q0u<6K8SMGSn5*QdvIuNckgA zPee*=l89DRwns!OWype*##leL5Ha^3_tzUOBWsWNZyxNA$AsKW3|5^`QbHqW8+Cn= zCT*rSo~w-O-bv7U*m#GVx!-racfB7|4{fqVIRT&S@FTyUseik;q3iyirpEe8t?z$$UPLC6Rq2C(m2&s# zh?67JEEAuxIg-2^L)4+xPf;|?^<@i?qDGSb?KQMB{aARJRKByHp-UTieEnAt(JLT( z7S;bzBAO4&}krZl=0w`0F; z)b={<3xC1>;O0_s$W)Z8JkZcjJ*uy$E?qdv>RkU(iIg_>C|Dks4$#PgVFx{+-)F_&Ap6!o(^4n=9b-6Qg#W)qHr)xO z?Cnm@3Ls`ukvh{JHw`Eu^u*cNbEw(Q*I$KwUmJyxV$7P+^k!6*FELbRmHh2}RM$5N zZ69zU^x&=NU-jE8gVMh~rm>2+cED9}9VJjWeh8iVt%kUBlWl~nnX^3o!r^Sa@ASP& z;MHg~eTgJE*!5~Md|wk9w%t!c#Zyk1W5qA)l3j4dQYrw%Cvzs*pJFJbXP*y>$FpM{ z4SfOss#hAR`g;0FfPw(S26d}#?RueAiBCJ9E|lvWR}=NrKyW#El|7-2wym`N4U5DL z7DL5pV@GxX-{n;kP30#FAc45gPt#BZNl}hyw*M>(X_IMa@%5gm#H(Tu>qYgU@u0=O zyYz1M9R+dt2tG3i~moPoLlXmdyFqje?mSZ<>|w zpVKuxUd6FAX5=5@{oWgce|ek#XVufe89RRUW1USXGl`U>jFuXvGI>AWn^39Ou8ka_ z|A8d&*PrI@w~b69qQW0PKrm?QkyyR;*g0uuWdSxH)ysfZuz&C3?j88{yLEG-w{A-7 zzY9|!>Xn`u5$y2Q&62}~d5r4I8OTTPxzVfg`{mj52m_q z7u|x~OFSKlgT(W&p;x>ez1VDp&`sNNjFj2H*>_2XU?lW>@Ra=?n?;FuAawTGzz?6*Bs3a2tZ7-X-&uN; zCunhhdD@n`;<-sI|6wrRl=(L+Z{r5c37PmYbsZ{6kU`wZLB`lnz4yhS)T(!RM}$tR zffMa>!o7&|-i|BnkPhD0oXT)(>(;5APfpplT|&_nOSB4^{hf%9BuklVljz< z@~A;jmhovJM>-#tJCVJl;cGz2n%vjttG<2#aD%{W3uPs25q4*Ay^r6kSR8U(*T@dH z^$p(bu9y}!u+Wemi2s^RftW*hqIlCj`VadNvPSN^p+Vk@ACs5&^`0MfE>$|#FJ&(2 zHtyGJ<3%(-WRAm;`w6^44R77~`Bi4tekyE)2s)WOE7Z{p%MJ9OkMI#b2KzUvR3QGZ z!3}w20SDNx!3_Vx3M#~;+BgU@ulM02Qq3C@3K8F*tA#hFeVg_7-S@=uQi>j@<l0znYo4E$sKR}f#eX>u!qo&Jj^{z6s1!f}%^?#u(ZRHjyVd<3> z(GOK7hvE;aDGf&6pL^Yt$fOjhd&<8ugVDT$Q$Wi+(478eZ%rD-FcwwsghQn*5Gv2Y z_6zV0eCT2)$vcW6=fYesW=l(fz&WgW7_25_diYkPAOm-ZFs(Un#xoer`Bbnx8RQLC zUsk^D@^2$9po++e0US1fBu0CTPTo|y*2$p_mvflc@%2ZvQ&kJKbu&hiY)<<9=NRWYVJjw^06ZQ@k&G&fjLqfapsr&-#P0_>VzQ zHpjN-c4+B5hF4?m;YLG#zhfR{xnTrFXTl=|a*p5+|DzLSgpDVk8YrezOR0P^aY->| z_kauIG*`RuZHTLyJ_^Q*Cm(v#XJc>{B^y69LuhVqe=9ssP`fAc*}P-z%8ze$V6YR! z|J3YZqXT8KnV(#EB4D2({zJC;uDq&tz_BY)Wo|fO|L-M(gZu6If8@1}S1PTH!cDJP z0T?P^Z=RBrq~A?fx8@$ZtDA5MXMwmh1y*&d1nqbb)vL}`gFo#3el_%i?U!?TE?E

%B(P!1;3@XzqXU{_LB)TXZF4iD`l?3CZEtLuvNHIQ2hi|&y5k8&`(n}qnxXZ0S!L03&J1g*ZL~eOVj{& z_o{a=Qng^nx*y{b2)ZC zJ`JL|;3Nhe@P_kl!etFnDkznZ#XHX)3!6;)XHz`z_&r4eR-ItJFA-0?CN-(WLHW6P ztymg4D=5AsNax%DP{|neCjbQajPEQ}o2N1=eRD`uuUPNR<+>2_ZUDCV^!M)X7pFlN zmU{)U#G%rH;FJZ!e+xnd6O4ztQh3Cq%^H4EWk%k#1p64gMynabSVxo)!F*>g?^wmJEyq7WJLe61j9nT{;I^mr2R*c zWO?(fp_d0TRHLjgA_RP!EVQ_dG7DG^M+E#z_^3b8rk$&MF#1h!zA;y$)<}DyMrWNjA5VC!wNZ==VB|S5M@8>>dX~FhdX1bv}y;&C?etHCd z#WS&LVh_@S;!ZcN(oCLtMPyreR-7zS)5rwvs61y76d3?W0PaT;00$oa6&0&e=kpS7 zw!*?l6!{XBRbw^@=izpO>~6a-whJSSihEzi6g{LsLjR+Av*>cl_5Kb5{7?{HuLvAv z+9C8RvQPQIAW5a7oG2sU5{6d(Z#d@%0rl?2R%FH4cEEIEN)8UWKQ?k6B^hXZE+f1B6_H10>=KvR#3{0u+q` zs^DI~dEMsl0d2r91fCUe2|7QWzW)4k@5wuP#r^&WL=FVfSBWLS4fgHN0Xc7D?EO^% z#ycplMg`x0)RM0k5&+IvVPhHds)Mec{jPxAe6)!H#;iLe|0#v`|D zdczT^WgD{5e5VxE*)WfgsPH473!PvZcC|45?^8STZ0h4fyWg5rfe*!WbLRn8j9xCQm_vORFSu+dT4XjRe=! zU9%IDb7x;TZ>`qo+Ls1+?~l~3a%Q3KMsao_Ogv``w5dR7qMjt!9x?^JA1Hjf@zYfv zz9zJ<@^wGbHI1JFkB1FV5$KNv`0h^)$bnS}tH-YOdAT=#+2(a)>|Cf0A-qs4h4n_| z5#_Kz!2X{K9avQV6Up$F3dF@{hzOI?G?UdoLLtGRYIx)Z{`LDmRWT>oL{k*gwo$C7_%Z?oEXztDT2oNWGI zle^*Ps}Up>XA!qfTN{`BZ`vD;B=YRrr$j}FPZ=xT0$@JWcDPhWM;g4AXqA&H(HmJj zM%{HhBYTS{PKzAH8Wdx5R(->v*IdmVCxSh2pM_|y1Vn|2!h_;I;S3W)c}GJU7k%6S zx>Fq^XA&^y`=$07i=G`%d)FJ*yo#NWWG&nWALa*74rXw_GWt(T!%*lmRAC;5TovDy zz_-(6Wm+wCxXe(i;OorgbFnZIuHsrBa(~Za_&c!q5bK8BrVa<1jB?Dc|G{jb?&hQ1 zB91brlCy6f;XsM=r#=%`32{$Uz(eXJg$8qujkOUq)xpW*KAp@#)>cNVM;y> zlKwxlM=JdZU!-srp5ZlL#kH&7^Vw3_fQ|@{=rtaQn^y(9Of;7R31Rc4?v~?$;`z*T zkNKpcNuqm#J^kOnKR0}doR5dm4g~hF-r&pVLa{hsh4GW@jW+jzBWLGBuDLEbH1IX7 z4sn(HBA#?FvZ0#7EO~G!>msAF1k`bips}XOp<@|vjp`T;G9wVFW4_|&Rj0Hf9peo@ zW0iz6>F^zWvRzlOn0h0x;Qxz2@K~S$dA2><{mxgRye$Q_h>T%@IU-ybH4_{Jg6#j+ zir$@8e2bleA59G;>sSze=7>muJ!mjC?n4(77GWscm3dSMh6jHger9j!Bd>ni-a5{& z-ob^LPm=C^SJ?Gy*Hab`mo~X>%-|6)EDk5t0%K@e6k>SnCE8n6^pnr8#5=aQidhSHk$7zqDuAz`8*GJ8lhX{OQ4WCt?;lzKK}XmjBtciCOxC?5 zSqgI5brI|!KZ4s5*5-8rkRH8uN1&brU<>OAH5S_kM_5YLix}ZYevh*vpUd0F=4`nS z1Jk*3YMG!!^ori)bT<8SFF>+zj;LW;K*jQGV{l*K+_81*r8&}-ptIJC)4S_v);MUk zPaCsmB2ps{54NG_#2$o{R!`1j&by|@zfDZ6u&XUwz17aPbhms z202cD76XEBs;9Y9<_RRrN^Nqzb#-^9ud0S-2Ap>9C)D3mG8*HsF!%nu>}>6)wNR4o z;*a0^C_D6O(L*B$A$(DlGtKcn_;OT^GXt7qB*EZp*te!Am;>Ozf^mpo&?Y!sn6N?Q zH3kK6Dh6!xxjEdYb8m0lp7~0b4$J0hiEz{vsU#q|sM1dL zTP*t$;m~wk{&Wzs7)+^whh+u&^noCZX_{%)+<6M2al z4fx}RiW*T^1D-)>z0O+O5DrP}=C#oV_YzmKx8lthgjUXFM8PD}4G~}vh-C8(X;F}V zNv~IBgm{k#DXO0azVK_n+`s*j6dVEn_Kc{xR8w(92iV9@y($UF)c`q)g$o6{Q-`dT zkO2c(b?LQOYe3lIUT&3S2O!!~v8R`tl%$o{efL2VIs*{~C) zn=rt(fTqCd9RLT~Vh!KVKipmD2Ap>yZ0BEbx*Gu0D;0P+{owmgT;8iI6xav6^>Zgc zB+#9p<>zN#Ea2P`R1arFJgl(nOAtz?_^O49sr~SZ+93n!ANPRiK47F>N64gB^%DN4 z=A?U;KqlJcuH;~1s@(*&j~H^mms-@X=W^y(q+DyT@@SK9uv+=&@m4zl0IxspAp&R< z-hK{{2LP~(orkKe6Pa|0LX#UMk%jf&`d7^8bNngdVnT`ImF)g zTsI0Z*!RBdze1fxfxOx6-QN{00swy|CGaKa08=;TO5@TZiJ*1!55_T7oH-rFeCQ3a z??zL=T>}Sg(%a$Md8^{iJ?ly3<4hxzC8+;u&n>kALpwa@nCe_oJtAQ?Fty{fm0$}c zy`qn7f`;{5G8I0Q)9OnDguHz0Fn6 z+)P<{C13&on(lWx%bKN9R;s|#6giIc^?9OynSMxNUJp9}0JK2GkV?3BLtDG-=HX`X z$Fab@{>cnfIc1r%Mg=_hclnZ>Id7P6cU1q3D5cb0SG_Scc7?J%;DFj^N~2+WWVcom z;sf4~>Bqczy=M8e>704*YaQ;p$ME4R08rqa@`+qYy02$uW(Jie7|VB?J!)H?Jjk3G zx>qBC4R!m<_F?-HT8a#B5+ucRW5c4)lvF{7Uc`gLx&!ua%fc`LJ2nHm6b4EzIFUL7 zHd&y}KUc#rbB1bp)ru91uyCDLHm&`s&vX0lZ>4W<4EU*`Tp95Fy{Om41_hiO6S#(0 z`a{3&SY;kko#cBl-}NQ*)%(K#+EKi3Q|mx85^&?De-X}Mzw0qE25yi5*Jy(2u`yB! zQtKx~X)PXVd{i*`o-OeKok6z-UDlK>3L@ zB86r@%s!z@$l~ol$BS)BhN28b&p!a~)?`YeMU;UF9;*nF7QjGV z&W3_wXMf_c*LtJ-HT8&GmMwpyBM2)*9-Cm^3+O(joE81cr$>Dmt9q?O>qT$qYqv7z zQ12*HzMN8j+%(viY9X^>m44`~wy6U-7<47U3}|meGl?VZ?X|Av^5-gdxqkGV?_7Km zFaJhwiB+aMLTlK@FpWR6W^rQw;AHegI=S43MTb3)&g=>A=^BmhLHTEpo{@+0L`Qml zFfRG%;xzp+!EBlz%zGR0UpkXdK>TQ9H^1s7hi=@W?P6gND&+~3k}q5l0{{p@S5f&x zUwk%@`K`GH!uN~>6aLlj#`1pBU&sBwwl26Huf=d1$Cje!mThbx!Z297GInw?{Wee+eBnDNE^Hj zrKjV7Jn@Ykdvb~rX$NDM4V7$oYP$`Gl&%;vojC`2!WwfMWOS#xcb9w>Rvs_j7T@W3 zba$|V%n!5rh=;P+k862J>NYvDzXKB(Yg=&8S?hPL9#Rt~|MXjWtF?S*n<$BNFyC%l zZpvZ%R7$ob7I#e|aUTorP0GO+*G4GO9c`%e5~Nt!-|*zwv(dP1$prCHwsNz9$Y~HeCK}uNL}5j7MtpeDcQd0I+bsrI zVHLrWmmG{zgH4a(N?odseN;M&0t>L&mKB*eytd}Q{#6EN^a~?f1d|m&%N>B7eiz= zVLioMY0_ayTwuf&^ulXS3oyfqnYOX5^bscHUYm&m8s4vG^J7`6IJ$2y8nG->Xr#1W zv;%7M4;F1+ZxDeN2BpA!R?T+C+H##TwtpmF5e=8Y7_VuI#iIy%49GaIF9A&o8`=Hq z92^L6<<1buS26~UNM)pYoX`UyVlE`T?gh)t1C1Z&X7B{3yiio@38So z?mW2C;Wa3dY9wgqH1=WEe?n>by7^l)TH9+rdKDxfIB9F`^8gg$CSQxfb z3?c7J3DGD2k2ZG37UrfHEeut57qU|4;?+YilAa!f?HL# zO=0q4!Rr%$T~rihns5A@VN&4mzlNt;Q4a&}PEXS(syDSMW4a=DZ3@Q-=uF=1>qzf> z7hAF7&c#68K9gC?wX;!g_sG^(h<~;rBeh=JizIPip)+dJu9m7jjRM5w3*n-g5*7^uFgCzt!NB?q2Z_ zKM-d@c&v%uE8ISpnVtOO{t{3^h8{{^y`BifH8klUCv>n7~lR>Nw zjE2)-DjnyI!p*_DLaG`4+qY@MN!rD^AC)N|SYSk>TCOqqaT$@z{v*NyOmU~iS|}sWYgNweh}W*e(FOtc_}9K ztBI%`F@8NaaEqw$9(w3wF=0V4M*8&eE#RMT3l)h5>#?LHnECxE6FipCg(s?8uRsEF zusb{=p+J^KSeE}YQ~TmPu7dLs$p!*=Uyh~A(~hT+H_So$9ADiK9Pg;#Cmu)c%y*<*J=Cziu|km+}+ z3Uqh3!|!!cO09BRws0;;lamGxh7-*wV5>tzbbur{F0JWL)X_j9=q>**@wJHp5+B>w z9ygC#10=LprJ0_j64|x%VKZQaFnSfcQl;Y^czLY#n00qawPU?@?w-5KUq$|sfbMVVH*UgDgkSIJ>VEYnuXi;5eo9!q z&3E&;yFA<48?wJ-GOrw#T$2ZJS9+H#*v~Byk^pI|uI>B;Gk!UJ-s%8J|9fZ=S zAVdh^Cqjk>2lW&0|MYw~G$ILYuhMD%asI*7i0ECm5&xP?4aBtGG#jruxjZWhC#Isn z{9RzO?wjg$aW_HHXjkyf`chAsVU*_$y8c6?JO%Xv@?e-}OrmQ(ZjOa);@)B zeYfS>9FN>k2I`+=s1IXKl5=P)5$RJmdQ8h4QQJ*6ty~p;DZ}o!B_7TjU~=4lP6nhA z{wkjuj(-IO#gN26*AIKm73Tc#AthV|7Oh;J<*5>){4NLz874xgSveu$8iuNaoUkDUsqEBRu4>wKLYLKMN8-$Q1_(x=wVS)1j3H ziCX12fLRd&I5LpDJ~T<;kAxntFi)fhpE(H@yrk43VI_r-g+q@LA*FW6h5Kb}N|Ey{ z4Yiq>6nOyN73V8dW^X8qmFh|xf1m}3lU+k*F%_Kg%ae-c1q+U_js(MOA@7=F2KjvLk>>t!;?(X`#XkxH2};WO`_SdHh*RBaR~WznRNf2}&( zgJ8wg(T^~oKMD&Am-{!QVZAH_b$0uxnYk48uI<{+8L!Qu9I8z*AI46_y0X%JUd()7 zh~9yt9($|bxQuVA@_$K5Z-qeHVLeC*e=|2{PPHUXHIE=Jnkw{fN6q~8`8!SbSY^Hw zVm5GBI{YR5_u|QMKCjm=?v08D&`j+;<$mz(=zUWvu*ijjDFdRDAPDgTYV1$Z4Yz9% z)XbVIgS1G&Mr(!4FjHD~Nq79M=F2tO#uD@t8BQxcGHx8FkJULzadf2BxIhZ0=Ks+3 zj^UYhTh?}L+qPY?ZQHhO+qP|1#kTEKtg2M(q>}HhdiL(_-Cw`!&T-^V{v^4swdR_0 zjB{|A9ibYk3icBfdi1<`$NpXj2m3#IqqhYIC&!&Vb+1tHc{010vvc&kMEiR0&-c0^$5 z7Y4H(zlTTVunsG}>aqKloin zWg`j4sb(V*b!pG~W49f%-tA}lPjFVN1iqS$4-ay zLNkhhV;MVID$=YB941`fn5wn zu(TK#6b7w`llzN#%?!?$8pJtOH(a%(`w!&qI{`vnb6HXpxpBp$DG_2$={czQo7Z@p zhWX8D5?1ku=csTgP21x2_WY3AI(LE2pz<0Wm$i9rE@EVYM2N6xDqST}R1rF-KM@T8 zE>vleg=#qgU5)!!8WtLihqU4kZCY=vP-yjaJ_H5=e=sBzvF zGj#8NI|%-fabzVpAYc41IUGbL&yvGg3-1TWYN$$B4%Rt+y@!AiExXdJ%7C(!MA{1u zm@igB!Xg-sSV}yAkG9F`-NL-Ju>{6uW4FJdxjOtvg)Uly6r-(BAXS`>fg(im`bQT;lZ`>1guI&3>pZTNnyBW z6^M_w$JEX%qsK1(+VZ1jx1Q-?#=S0x$m9E{WePFn*5>(Pe(oc&bSx(rS(KzuDi}_= z^i2v@4O{deR!cC7a7R=0aB}fv6->3bT1{4Fqtc**l@vzuQ?*F69R!s&_MD+FhB!Nc zlkjTFc|Jys)dAdMxK@z=PHnJFkB)&b6j`KHZW5u!+p5jL^DhEs*Y`zNMtNpC|qnBOgJCc z=rQ#6V_-aod+5=*PjoOcgh9MP#DX6E`d_+(SA%&_TD4GlrBKjiESZ{3xUQKUQ#chmRqR7yrWeXh5O$o7f)0;NAE`AmjCEtm zuY`>p&huONV%i8x@|9xgE{Tyzh>@wEXre3)vsE%oHRq!4s-MeUsYTM;M1|8^G)FXH zMrcIDR+6fEzLUh1!%9d+*0yF$XKlOGrx@n|?=MVpT2_rM@i}Owv{NG3WOE)C!?S|m zTkIH@=zrLC{jSgRpHm9hi?H3KpV37Ld+tc9;T#U8#n4p_g&d%{&?C6vL@G`#XG-Ek z(CRM#NZv5Sl#!tsA9nF??aJ2~tdV*3)pDReZSf0cC~J?`#+w#t>e{GcXSf>q_2HR) z-PA2w;Bhd=|7~639>*gw=2TCgwVZA$1S~-}9zqL;PqoUqgqf*!eXx{$1p@I7DgmS0 zGS)F4BQ6LyK1hgCoJn&*4q~q4T%}ZiOKUm^Sh)~ht0*3;0xvqplWSsId2`WygfATM z9KnGki^J(ZgsbSz;K)+MXa(m!&SN=`rCt%z8@f+!v=7%uhD5=nj%3FqjP2ws%gh8= z{miR0WM@;hpmv_&?$h+hVtC1C9NzX39_M-zOu?0$xM!l0YPz6xes5UOI zlB<@Viawh!$IYj3EO@UNap;x^F}(m~gZ(7R4rg-DSa28NBQF0b`ypih!A{P&w=pJDvs7$?!8*~PwQjIl``%dfFyK06ZP9RUc}vbV z=*eJd4_2RVd2FZUKwa090x?i*h+?Rt43zqXmlxOzI;|PGf7o>Y^5Cc8La0e-fKTc; z*=E$zunHMtRaR@xbVf%;ce-zQ@;e>X6jep#@JdGzR9U&w?xkSKSOn#~eqqn?L;Yp> zTnV9t=Wi_@6F!qZ-I~wl@1%?$EeE;#dV9YI5QjrgRbCjGxwRF1g8F)lRajkIF}(*a z;uQxInXhn)*K^AGT`e5-5&9gsf;UPMRj$#|R*(T7^yrl%cD3wI*`;y>l?JPRHtS83 zO$TmMZaFTA4t$gg7?%(|Q@n)ftAtrhj1tVy4za@#ni2XDgA>T-_1I)mX47f3yRk_d z8k?`n-O|Tvy^3#S52sWLm=%{Htrb?ExOjrt+>WhG8igzIWPc!kHp9b~v{07qOU_t~RK$Kz8jBvFAJ-@NV<+ zCUkkkw&U*WUXUV05walXcP3x~f=q8=y*W2{kROz*7>m3%?$B{6^cZgYzJ#opdj=vS zsT!Gmaom)RKn@l;5m`aixgjB0iH2vB)p~S(XQ$MDQYWk)8^#;z{Q_g|Tf9|!OWKx# z58;}y8Dedq3Kx`WIjK$#4PUO(IbxsFqQN_%YGIcscw7jG+AhVBu`^C`8${Vjr(qET zHY+fC(26zho+B$aS%-x(>6tn8*uBpu4(K=aLs^Tx#L(Q0VW?PX(iWP{c5^i9gv9&{ z&?2z5T(+pR-?sYS=Y=A=8jS(m0MO-!nyS1Jr*wZ0YeRf_jHJtN$ioNlxGug$j4 z!C$f$b)NQLC|!0Ran${6o#t?Ytj%esnumDo3keDbFu&Z7$e|JQ^M@Cz2t+uq+M(4E zdn0|(3MkqNR6KCByPfoM9kOq68#Zxp{h8KBDgYw(dQ)yd9l9<%n#N93bZbkKTaVK= z9<4QP4m}vHZUI!ljuQgXjK!GKK?!s5B_p?USP6-mfs~6Qb*Ja=l z5->?M~GI^~W0ArYXk^D~(@pUsh z2ONUSrf*DkKw`5|o)Q(-(5AI&>24q*hJ@-4oJlTYBlfP-0m_XloQ3SSZpfzG6`P1k z+7eC2m75hEUfpMhspd(=QC*Q^6uFb^T&=i!YgDv8?kHGHp0H9$bU8WB@6(p=l-O)+ zY>ca7HD%!&`C#Am+sZq22vC;;SX<0R0-gAcxTYj1^5`yH8&>R{I_2_V?;V5kC#Ieq z85YDar+$gamf&^35?xl!Pii)9DV4v<-d9gHc5eFX`V}Y&5T&zrtMq0Wg=3p%8buO^ zV}XoaANo!v#p{~+s>hcX$LRLFv8vj~wKvn@KC}ntH=_YlQ_E^K5VHZ< zRfQmf#e?CH=d1&wo1&tjaU4E~8P2KM)4(K=wUwt`Ipn|1$bYRU^(!7W#v=xiB#%tZ zlLny=&lHZ?8D%S!9j%3iR<^GtNv*2vWN*u88uzw^-du#ED@g{OwxJGX$sc&B#ai)f zkjhLqQXm@5WP@i*aX@yw68mL!tocS8ft6Bn8n(`zb4f*1LUG^jYpA{ zZbXJ;lDohr!Fp5?(feYKfpfy^qORDostGyEbh`%zjoaMQFB!64^c7}fk;K2M$GX^E zV;6-^1_opHnl=O44GnqP@j{eRLbqpo4|ojMPw@Ty0=T{f1%Y_2!uV{{3wZVM2LZ;V z__#=Pp>4gk$czcj<#IT8bMFcq4lp#T)KkearT(x_AeB_{ffV3(_DUZb>;HAYd;YjR zqz6N5MWe8u`Zf30ox5V}tqw34l2B~|^l14S&8}imrCC!JTgR7|(fug=MgVO4nPYJwTow}A;V8~keCI-bInAEs7rsVWHpEI`vZ=+=GD>P9c?x>g>>?jf*q^Zyd3V0RXghshB=G#%HIUc z*U{wCZsz#ipQ@ZUv8raxFG`{)uo$zflR5PnF`0fJ&KqoOJ8bV{ibEeWk08DTSAV%_ zMwW(9LDahhdvu)ds$SAu@4B%EwUmSGonp*oqMB=zDA63XX`i3UxYnjj`e9Djou`@V zl+I2hROW;Z_byB;bZO1}tRDPo%e0B;ma*H6dvU4naQK^H_KNxiv`o;$4fs_*RKA8w z-Dn$l|8;*Cj!RSUw}3QLnD)<4r$@UA-A0;%AOThE0py2}!iL9;Lk9cOIx(9s+<26w z^LNY#%Ch+$Mbo*AeoCDQK0OMad|yZ%Xg)#K!Y+Ex5>r1^LXQL>assUeib$5Ir95KR zQV&9Ty`Az6qWz@rEs8`{-Iy>xqlC4Q$f;McDT(#7qP57OO}&uO8Px1FW4kHNA6)l- z<_**vpcN=DR0HW_j!=iLaw~|N0aIjA(p&U-iJoKq9!6ps!&11*1dE_RSOg1shkNTl zPL!20kg>{4wq%(KMGpd=$HL69LWGb{Y$V=-H5|OauV6^U{g#t-jlu~&3OZJZ)2K&C z1CqCjik*vPQD7+H5PDiyJcsj|k}?ZX!R-iXvx}{Q3+pHz? zp|d-yw3OyrHEA`GU_jf-Aeu@g-2}gU2=0)bm^sf`GPt-gXyJU2^`;3(D z)HM_fB)Ylt>PnNqjX;4hW_&jXv0M}Z>vLeY3G%q-;YDp0GLlP7b3QTrwC4))+Y`5u>MT@m1myl2VWzS?}9zsBg+q&9cxOE9B`&wf#Vru`x5Pkf4;3>xsX> znT%$kMw1&I^ZVMxH8rP%TLE|90@O0m%BKfgBi*dC?FXhG!Gf-BA1&*VJJFY-8$37MJiD&T0#;I(~Yfl73K_+lJ zXZqmGmRHpmh0kU{Z>F1{SDdHE0q%rG30;8DqgsehCxxZ~^SMAJS06y0b*8hP6a_RNR@y7vKpH zn}eY7-;j*CL_DUXxW7>f@}bY^Mih2vtE^;JX&3%DOE_3jED<+n*Xt|&6J!3UbjC|0&WBo9e^fZ2!^UErEXK#`v9tU=R#XF6FQwjNCoY@~dRDVT@IL&TYs$J~ zjRR|#{nlkJUUZD7@h$-V;4I<0ku{-rOiRw0f%Jyqd-;=q@NOFdfgo80ahCI$PCNp- zf*1B@#dAIeuc7Pt=Hp3(2B*YbPsWSj$HDG9$U$VzBs-!D?dzmVE=UjiX`T)&%_q2i zd3jy0F@=ras?!Sl8tfuLCVFztmW!P+B(qH(R<-q+T0#xy)ee<*I=EB6$#P6F*rbpE z)Cn<{C!b?+43@RX8ZdlW5HQR(pn-}yJi{g3&~3G+w!WvseO>$ zrV-(SxxG;=v5{5+s2HMKWL%Y{M66Zxl)(i02jDFU-yKJPooeH?)(MK&7eDxMj6vYo zy#N_iz(VxSLG>#2*3yi*&hVAYwR0kb+sv{JZCkGhrs;(PC?vi$OSIz0B^^G#no}~B zS`&l#uFZ;)yF(}(0s;cVyS$_UN7Zxk-eOBe1VfoFPDd+tst0jm%l0AfFH7zpbFP6H zQ$`@%w|H))KurvEvNVOtQH;4VyiCG~-73&+&VVIgul@|6uNGa1)J>W=B52K($5)|k zqrgDy8FyQrI5V{uUh_i%m5+4$XnpY%9WdZGZg^#->wS%YHCtCUI;Ao0El!kn&gS>A z<$*s`G+AI?KbQu{e%CDZ>!6MQ2u(pMkO8?wU+*=V;`xvLloqa+g(<;D@d|t*y@GQI z73qmM&bdOeDAyg?1O$*GIZ2w@-WSl;r*2-jIt~!5z4$TXzVP2r5)Hh?UEMK#>HPv5 zU|{C&4t+C0f~TG!N~?^=Lij8I1r1$C&Svf;IU<8S2KyvPy6RBreCY9Siql`eV@mFS zxgys03=3rb2n7NprIzV^*&I@WVS!Yum$O@e^7uhBoFvlw#pLDnukh-K6Znwu{}rSP zC(z}BmqDaL@1T1T;4hXS9|%cYwV@Z&sjg?YVvjEeqVjIjTpRZNWKrJ1px&)-<#>N0 zb^S&$@-DYAlIwDqO2{C3FsMEGEaNbPfq^91)QJ;F9Tb|wLW<=J7MVwGepMvbLo@QDdtPhm9%rlF z{${NSK>q~wWJ8TH42UGgSG7)Y z>2%yW2)f&JTGI#?9=s$@5$roEl`?Yjw8}CKD(ZtIQviqe%m9Il1V6@@wGL z{bowt{yb>B2i`Exe?@-xknib~_Ju;|K!Hubs-#boAc61;e7lGbmpzLANai?!Fj)NH z#Q#ctu+v$g4|vX9U^X~wimUrUIL)=ssKbC^Ark^ao0U5jXH$StVR0cd0uwWH4@zic z&7n@1?l>^jasQ~;Uh{!_ZR#RQN|lfj$NutOzERMx>e*eHixoyVM%gUYxM^ z8?h5${T@XBeq{<8ks&{7+YH9_g7ysXVVaw$ShXAFT&WEDtv3HWa#7edu7eKKtGbg^ zlL?R#HPx>(hDhY0k&O`c^gsR?-5q&-FQ#a!uU*p%7hOx%XIK>yVj*GxFXmAe`07pN zoQw%BNT4s4+VIg-Cxvp{^HAdeva7O)mwAwI!F)1~tu{!h=}@izKo$VJ%lUvA44vO< z?i05i6*Iil^Il}Q<;4F5IU)U|u=VzKV6Lk8N`i`9OAL7u zba<+yTu9pd7s^x+F!)WPsXsA9N4BY|tN?2rAZ&Z){{86NTDSEwn{uLkW7bXqECCuIJr+yJlEhUMlcSzOrH1zX{&-mvPbOu3pOh|Kl~>(FwM zpy45;dK*@sla}+a==vsK5>||OC!sZiMQ*8yNYw1+(fWiwI;MdvZts) zVE#UIe!jFwL$_4oc=R5-Pc8{;{(V6zeItSqfW1x_hvBoqPUgpCojo1cbRH)nS)|nT z^~Vqi5mC(Un`@<|uoO{@pya{DoGStt;h-4_SvMOw=rLC-nAH3h8>}|1DqI6+ViHYa zY=0475Etq($;q zur*C#B(EcfN(XR|pvK)0OCDNRrFk81IzJI2<;%E#cC7y$L8A|d<8tfVCJ?p<{_p+# zd>GaSlAWoJBO+%u_?P?h=(pax9zyr5N~6papYjjKq7BcssS@lV5u)VvakNK0@xK!I zTu#JiXCycE0O1a({{YHbPuUkP(*#2C*cJG-laZxbaj(1vDfs?i#i(J$yCQBdV!W)v@w8+aw2y_h6lAgo42` zz%kQYbhVJ@pjTg}8DQ1qR;V;FV}!+-z+yCMBgK=wz*J6i?O$0{z!j$~?aZbE8XUFm z+8S(breAye@rDVPfz2J2NP+DtykZULT%!rbDEJ)Xb!n_Em(m$;5bvGf_^^?O*i&9( zIvQrA9MCd%Z1zCFRbdV@3D(wD5m|{k1iGnOaL(Jza{a8zLVm?U+5Ss>4g@6I=8y_h zC|U*FX!oiPn7cU+jex4yV?vk|Yk&d#pno)`Kv?GeH%6+!qU%;ax8H@SmhQJ&^H-V| zYc}TY7&B((o-{u9z=;A+Oyq{W2-DOt?TAZI0t4PVf03`s&&$&U+Esq(JLxbG= zI#G3`ySFP%>_ccwJQpwDAVsotNi%0a4$Z2i5CCrWkGlqu?{*zkf$we`ma%70H=qu@ z>_9l|l3UP&aM@{!3ox>FV-*tU{*V$BwPAr-i(x2^$Zyr4s*jQUjoZ}BrO{=Y#*((I zvqDz>@UK{mj5NBw0*gM266FL}*{QO?w5jIKA{YYa<1GO#I2454a1ekz=xQwJbmLmO|FY}{#tI+9}J>DUgLYi8vn}o?4#cECT zT&4poN^7&kz1sWMd62C0JKwp`ZG>uzHZ z5$6)+4u>Y_^=}-)*7CGD9)M{ip0WX`Qu6+WrpvA6PZqB7K!R@;0;Mt(O?gqdDQpGk8;WVIgL{BV@i*xKh9PT)sb@^c4^?-WTtQ z*B^5GKO(0Ibp1A=(!K?K1wIS}g+##PblmIjAdF`izIVhfggulD%?)FfGE8wl;*)np zQ#^r%PBbR)Fe*?y;L0IGvWN|WNY6HlQPA@_VC7pg_27rU92(n*;4+T?iiiWJ>G*Q7 zhqO*zW#pLIb1&V39m>oSWom9@W`fD?@-8=X{u}h<`flpk1=|CDv{lJjtaN4SdZ$tI zf+g%&-U$9rP;;*CcJWB$aS{G(#Kj0loC!RtCCLceJ}JOB!+6p0<55a{PHv;|6aw6B9`k+ zy*t`Ae|%jwndks4^o_hxP2TU>Zl(jfYp|_T*nJli;ckFC$#(xR%Uyuv`w&-xCEgAh z;Jlfd=I7ZRmYF?O_us{6ADCjS+OJc>ibGGeqz0T^AI$6~qhdVVcEDAx69^+uM z7On-fOHk#uRNmthWX^tl@n%XbJ=ebx=8u4`*FB)ZeyYG+2HIxAfl?4c_h}YLI;OEZ z@E!*Sa)whzXpJ)1!UdG5Ktsf*QepK^h+(F<3@EgoCXfGBHp2H(kNop+{!bUR?bt*7 z0HV4hV0*e{uVY98<1$?CA;q0}9#It84`n?Fh%o-g9FPuu73S?ULw}!$z6V*! z#)3W2qFDekt~n5|Gax*GVVg3p)ST~nQp8NIo3BCj#GcNvREH_vjl}- z1J5f#Hw{x+kPoW7h>UEXRoE-qVL*d8aZtuM31rgQq1;e2MG3%pgG_XJvlako5efyq zQJi|-5QQFh0_syjOnYg)C(<>#1Utet=oqIW)K_PJQ+RUSoI*`U)TaQQEOt*|!(UTC zpdYF<$iLNHC_x~?A%8$Hyj3#>w-?PoRnyTr5FE_9P&6-GPX(B1(VSQCU4hZa5IouR{-DCyF3>7Yf(!z7;5ke}Q&sUVM3e>pOh-!AsYXG+1 zHKYfG{IHF4{O}hPB!Z1ebe40TX=%`dYSeP^PUie|@E~27AxROB4Qe5Rr8Y zD@_FILHbB|oeY@86w4Zo>UmL#jhV4d_}Q4&b!-UWZWgX6VJ}Pm)|vsw2#G~4Mf)|3 zF`OMw^yrpm)}%g;`WoyT<&uKeijGtGRJd2rV@ogg&v)3eEDSq{&-=44j2PQ8ha_US zOn4H9_qP9iXmXeSyp+8*Z6UKm5MOw9Sr$a zS@>|Lzh;Gt3@Y6q2wJj+fMA*=p5OdkK=O+?&U(^Beg3je!D8;Ag%h$$HpBp0xotg` zYRX#T{NoSBzLmgHAZS!*>{QNy!?46s&fEn>Q6eC)K^U9FYkt=VkhUhoo77!4=H1Q% z+nA0S1Ty(Xx9T7(+X!VgPz)Y2Ta&q|D3OXY54>^dVwHPDhcMMr&d33Dqgo*%SJ&E` zMl$QLu@SN*mRK;9SebLHhB>yo`%1unk4BnUJ;k4lq8~X0TleqOS5OaB2j4zIxm@4e zs;PC@J?5Dk&3$bKaUl5b^jnkZ1u*@V9$uM(2XwthgrIHRf7D7xj62e*wlX~uJ-6#; zeh0rP5-U;eh{rRgA2p!B+D0K-Xk$;r{}y@EemLe1rE}+Xhs%prwH5=jv{sr^_9lU+g;{AccFtdY`qq%JczUKok?;6~vFOp&59XrQ=r!7v_ob3xqR#5cBw+{mU zr@II^*Tr=_hhY98fpXY+K0_!aS65q$brt;S8~)+w{rgCb{f}$v%?YhO#DDlMHOaO| zFiX8|%H3m^HA$t+v{MESpyZRK6RFGnXS5T?4}tDWfUYZ1KHjIEL zPsu5y$)`+%gUcg8(UoiVA^7tYaHPE|?GT}}i5ZYf1RjLpZ3ifVU6hE5afho>DnxzF zMZJ_oN9NPX;2AUd2Nl`M!_V-n&qfhXDBq!@imt)&KpBEerHsnm@i8DzY(jX!NG6VC z=n#tA$7%k_q22uVB@U27i%Ryd99oAb(p>#WIHy=5(2Z6>qz!?PL?ZRw@(M-o9r?^Z zRr|kI%d5isN!}cgvQ8Y@k!F*Mn2q2JwKdS=QHj}zSm+fWOV9TF96eEN4es~K=am;< z{MP*?`@~`UKJnB_xI`SyGKwdm01C^ZP&O*jB1bV~Ik=|b0l)yE;-V}$JYOlxyYV6) zB}fV)gqgKGoa62~Eyrl5>)ZOaRUshfK`VX_Bc}mPQMs)|I*g*J0-jOS*x$|&<0Yr9 z2^w~d*Xato-Fmx3r@B%^c z?eeWUuq*Bxj0R>WSp2kK$*S@<^E5)+%M=(38a|!lDC-WKgw^VrwWYm%@y{GrHEFkB zE3soOY91dA6Ff654t>|rADaDG_MkSTTV!c75A^XZD`F(cl9>B9RM?_ZKnr<@lnUKh zP=jQfv=gfTI*d)NnnS8AJX2-wP0J=2ma)Eqi)U3>-W4MeQ|R|(XL>$Z8!N|i{>VH$ zUa5(S(rB2=5xmZ~-S9U1$xq6G>At|o4=?6XGkfym3D02BG2 zP5{W5O>5_UC*0qb3h;k0f1u69{u;#nW}0foj>1~@3GQqbeG{2QWy9Zk@SU7T6J$uN zw*F}R0bi2;`cBq~)?g5x028^N6)M^Wk?5&MRLR4AS19{XdX4t1{8?J=#$8KtY?CBv zGI~#yST-wzZ!kS?&vU8l3Eg&>F(UaGp{MV?nKT{+mPh`a3=zhJR!>zNMV!w02e6ge zqq;cHN~409Zqc}0Af{|^e9b!VuZSkj4K}lE0@zrESev#upTQ0|<;ul8z9l6^rKQEk zu}cCQgWQdca*EyE4GXCo1PpLCQM{d6MOEBsg+~KU$nq27=SYSHp4NL^&GGjvaeeuE zPOW#5i9u=H<=nO2+a%q;&2j-H@+$` zEsfOM-U{S!U#((-KP8hxFG{(oDLJJOu$1*l((_@m*HH0mH~(t5UtzLmy$>>U68DuL zx3GY)wCD73>!j;_Qv}ycRdp|BtSQ4IzDc-~I%R6SJLvOQsMMFE?|xwAC)#}_2DgND zs+bK3xIr4YA8d#PLav(+l5VAk{7UUe#o}KB(DTh=o)kamglA<+ZUedt1YHHpF&>fm z@%rFC^BQ0147a3;j&PhQU*OSF-qVE3S+3|_QXv;weV%yA56`3SwO$RV0)(C${S^teuyIn!|YM;D!@wey_ z+!M#V@x&=p6{+J`MpH6bcySR`2M)zGh&#+-{WQw*IT_+>T)y+g<)@0J~@ z#su+#&&&|(f;&-iO6Bw+0YBEGG&=Lma4LDS1)P-DphF`FuOaENG&w!N{?H_2Wl6HM zG&k18v|5~MORvd((7|{5-9hA2zAlKQGJY*rPM7Bpfl7A+4Ia@(%e2YxgYimzXOh`y z4_yaBuemzvD2Yio=KfwS?`yTq$j1q+0RQ}%(udV{($cNkCH;kn=XWa6c%Cx<_}&=8 zVX$YjL@_rfuWw98qo?fa%G1S)ba30P0w_8MEl zGZ)BboH2WjC#kl1knzA&_WIXRNomFy-*|BUOPGZC_T#tNvRGQbj8E|!;mxHGP!Go~ z=fn-|_59&Mb*{g>`tUtM6p=a4n9~X(b#?V+}Hso1ZLt~N1g(Cr^&gqd8UR*F7>am!Ix^>GfrRh(=t?w5u%v4u7wsjxa0e?zgK%Ew&{f z;B&j4&1+@pzyE1-pAJ=Q{jWCnkOy=gcq5=8OV9ncF$?(V4J*6FS+t=SESx)@eTJ7` z^b^ifDWaIc_GL|$9EF(Ti5rc>J+)D;SRu(%anme~Az%yl(2#3o!qoG5tPjl;TgxMs zS(o`FJANr=m*m85j8i*u-0W!Jk5Mq_WmrN{%EvUy&|+=-*6iQUN#^s=ycy`UYpdYn z4~Jn&PbL#Osi#V41wML|Cq`OEPp5G@4JOKFrzg2G(u>)l)Q6z}!_sL`DU?M2tA3s(W^ZN7phrc&HY}7y8 z0qE;ONMH-Ei^)V##pIj*{7#>>C}RDh$yT^Q%aY;5(5yh5uohvMP6%YqOX2J4rNMNL zTBth2v+&@X6mr<6$HZw@-)PI^C%0O;U)a`vZ@N~9fP`f-NnR6!e=H#J*qb;U5(!?T z^!7$WjGkE+&GeCufsV>; zW0@VnYaB)mPzkTe*zHJ`aC~A$L%)kyWg?Wyw%8k^7)Znzs|#F#1F|dvca$l#>J^99 zS_Xp&7LIN<7AH@AEWwLU1FJUTY-9Ug7o-2hfR3zeTi#DfT&Ni>5U~>vWr3oco{|1| zKMTE2($kp_2m~lY1_eL`WRY8%roQ2?$STKXEw>s3wEX+IQzQFC>BfFyWCb-cF)=Th z$<1hxlIca7CORBuSkZ=TPQq=$8$g!e60??S`sGlD*&=q}fvI9W>EUgrmsH-Mg#unt zHQajj!-k*1#XA0Up>UA^{!@Aq7QapMBXdK418G{2c7Eodw-mHG;++7?tU;^YC|rKq zZ-3ZWW}wQG7MHpqBd|a3a3IJ5KukQ7PyV9+CG9F(aHoHbKEE@stOKW7SbHbU21u#c zEuaRnyuBl|Zjv1P$h6%pew>MB){~K8{M|t;3{v^hfe#$SI+z<02a?M02MIWiTIm=OBg=A-GlsiYb;hEW%#gqK;_F1Kk8)sllean$fd4^Q zZ2;*IUolT_wF|7nIzWl_82Kv`=cIro^*H6MrN&Z;UQ0%+M>L=Y+nHcmoeK_@3+F5; z_C6|9GjzIVN}eQ6eP7=$-654jvJxK7dfwNUNvC__a%0EOwpmR};nloiO&A$vh2duf zK_HqYlg*5aT!e<8JQR;KSaebjSz-^LcKZ4;`n(7BS$UBJN2k2)dSCUzGnGR^z`3=O z?N0e`H$*M|ZRM7Hd0hhEmtGTUIn+;o-3;29cS@;{uk)d;!XS0b@N^5n1bb^@Mhc|& zVe_iEgZ*QLSN^*MMT+C?P07@T&U_;VT42r|c3E!OoLuwjm*?mSQY0Vs`t)a6W4V?3 zOsd_+SHwTmrS>qZ-{eYm$y=PxH`ve+qEGNS-10X`+BcF0?M1e-_fmoOk$Qvm-HOwx zl!}Kx(<^17?Zp6h!xb7;8mV)Ol*Q!ZeIG!a@1*6+?I(Xx=5q`N_Ey(x`tS?etw^$` zb56HFklQn=bgCxOt;~T>l+(0yZj_`irPJ*d zcC01=V3HtRw-Eea7)u-)ZDl&0Kl>d=4ih_RPUQ$$N}Dz7i0TptkLHZwve#2qu`BeN zosf6_y7U2+w5dA=vs5y@_II_p6g~C8Le8Jb!r3sasg*S4&bc?h0;D@b5} zo+|N^_mE@h)$hqM;)pB}#IJTwLRlc1R=k*@pR9J4xT}``6F-zRo7q^pt(3qIuS32Y^NAl z!}gr*>jUpa!kgzN(@8EjbKVRM7&5GI1skjrU)muiELKqr{_4SXeagBQaLFPmLE-cT(6ru~$zLsdlmJW--EM0pZW%4Q2`&Iy8HEC;D zRfTxXz=Z%n_{ux&onV{w%FS@NjJ?mEl$w~EYK{A!-A7Q3x`BUl)K-t}AxQ=A5_d&! z$3ADmWr4Mwv&TLi&NlTjLXC_D-)=K24Bm7X3}y#9Ot?r`FbwQ(4bjBVT>i52m?R;! ztLM4gQ2v+LC=3N0#=&-bUn5m;MciEJ9N$<I^=MOjzNu@*khGbrNjTTd^b;@8885dOTvyvf<~ z)Z6zlsVP3P$`?O-F4&N=_N&Cll>e#q?wtR}PA@H{e~$;o&*H#KVZTKIk~DpKH2!B= zTj?m3ugCk}PG*I3?ZCtfy1Onq6VaB19To)2&oN^F)yMrrXbrrOM`lZ(HQl_knZ-qt_)J}xP6el zPTiS+P?pb1W)}Uy7pl0;a#HC}!hE43Q#LeQX?dcR?W?*!6(BJD-2dkdQH3!wm?D&` zm|B~)**|L4Ow({M<)^^Pe2dGm-LFWgF&uRJygtAgb}XVELp>fyxQT_;(~zvo;_|c( zEcCH~Y{A_Y%f_V%HFu_8CkVf;S z;s|1Jj!?QhB+qc{HJ@Xl5v@|n*`HD{E9!~_OJ0>MRj5EF%r9iB0EhIy4Ht+bH?_4I~tRYcZuyB{Nvq8uy3Q6M1` zXBilWi*Trrq*E)SsnWHKAmd6TLQzrxQ?)7_(@nHO69l4foEFGa6FqbF7P3ZZXfjay zHH~pO2HnB_U7)}e^A7jxZwi}^Rx?pmiVm98XmK?{&gI|LM^RsXeW2H2*A6*C&+xRt zSwErG-VZ!u6&n@5Z5;PiSg5dmQzF&;#izH%nr}f1c(MPbi$EOq|K!meiKJ|YpZm$$zp5Ha+ ze%~d)j{kAkFj*V7m^F~7&}UzdOqk`pofN=O5yZz}Fn_t*1~o)#$;?^-99J$k`6iVq?}YrBR`*_o&uw4Bpa(+8Sb>i#s#X!N}{^Hn(*hd{U!BoNVTVJSrB*J z646OYKIu`I19w^M@dG}<8DYTn7Jp*yjDA_#YmI(wY@@ETirBOCK^_zo^>g_(xfY~s z8?^5z_wzDJKetW&lk^k0WiKjCJpcCVV`f3$z4LujsfsT+#VzdXra z+s?eORFuPdU4(VkOh<9wnW_&D1}w1X#JU}8TI^|G4rs2|28A7asC$;HyMEeM7+sNv zp0)yt{99`%W@D(CLsYi40$(*)s2pkCklbpy!IjexiE$LiuSds+glJAI0S=7;456=r za}9cxg-|O%iV;o6pof`%^Bn*AORz1%H{;^M7LVkI z49Rm?pz6;}Z2x7YbQL&Q6}yOHw%xx>cyIpesIAU`zc@)@0mf{C3JZ+XH~ZtkK@Gv? zm5UvmC33HvweHm;_pQ@bdvwlg>?NL1ByczM~@IWg!C;cRrvOl(*BnkF1^(q)nsyA41}dBTT`KiBvQ0u z;UqDx_k99?ja{BA9Pi&mU@yJbeZk->V5ASv@&xj$c$H4a9`nt{1xf=9r<#5JtA!C3-5#1q`Z*G!G1iuWIt3`)n+mhy2f#R-a%b5*M&-ml55DwsRa-sVp6=Xi?Xoh6|dWCKj1}MafBlNEA6?i zEbueqKR*NiCrZsfjijCsikl=kqPTb-toqw`_YdSSJB|Aa{2RKZfkE&wh59_M}5o4SnQ7P&d%a6U^ z9Kqyzgks;bzW@SK9a)EKGV!7W=C{m9Oex`gWPi>~uz@&l-y-uS`5Uk@FsQWCLmREq z&;Ce}GEtxGv0g-`bHfU5B!Jb!>RHbT>~*K#`-^_06M=JLf@Bo5C9pHZ-ELtz!t^PX4eXpGb4864gpVq z2vwW6OwPaaO8-EVzd5VltnzPKHj>6aul#%S+}imP^`%sW`WG_~P=6}AAsZJ;twF|a zLS*mwAXyfDF-46zArix_o3T8b#562k>*g;gDp~DLd2m8YD1g(+y>r63gA1 zxNMYyPL3vVXlPs(whU}b(z?7*9q!?#iv?W-RYd~|p@?2!%fsVfxHhduol=AI{DLE_*PEw_n)jrD>Mqy_FHoP zw-7o_%*hn(_7Es0%-O7APKCL}hZ%g&uvXt+XZ*vk8*y%oB3lGw)P=pn<(nuFHambc z1&ZlPq_eY$;dZ~pOdW3Ll?BGCwHiBquGTj=9R<=Tu}7`$4i@Rs=&Hv*r!P_`vk!yN z3EXlR6>%_!n{g@xx&z-zEu6$c+16vVpO6r!ZIB{0qNd4IYE&n>O+{1ROOMfN=*i>kv?i#Goyg9 z)FUtIL}J>S2jj7R>s9&YBOE>;6_%)R*NBm9V)NB+Tp)nc>UsX=`xT6&sM_B05nM0W z0WSJ`cx(XBEhL@U|IZs5sq^*$!!%)`V17$DNl{c$sto$mO??#~WR1J1B! ze9sp#3hKD1a52fydMq|UCTe#Bi^WZVU)wH5f(D`x zTMY-qDlD>_b5|if*6tFjvi8ZbJ8{44;LbdNv!%~L)pBtAwR;-(^6Pht{}0hG*>sQD zVB}$UM`>8kjER_+TlIu0wYKifMqBFf9oRZPVz!=Cna!7oMjQ4g$Dj0_Q!VBbZp#_A z8~T1~mp~BBs8*2yZi6C}6#?Lu5aryAgKEf#i4X3#%XC6av}}C>Xz#LeXupd|(1()V z1ZclU{-@kh+CgnZ~dLtq(R1 zu>`Vcvd@GAo#QsJj5B`c#M~7qG&FCKw2tgrjoNNXm1>Jc#)fOi44`3V=9ZFTWtps~ zrC5SE#>J?z8(jic>^cc^2RZ@Cp~K^2&^a3TJl?1}R9UB1t&WIpr>`4$J^Bk$a#lf- zG$eA`AmswsJ-o*bZ)3Z7F!WHwMgqgqT!tA1u@GiFA7;Sa{6{)oS^!VF#cyg1s5v4E zDjf6L(3&&EBfI20b-a;MeJM=JLh{UxJ3-pW62J96ex(m@xS~%sGrOV#o3Nu*O8B+} z1QPv-Y$|T5$*t;*WTF_l-+eJO!epwck0`jVg{SAJ(TW3lMerjrjIlP}%pPVnf_iLI z+|&1;FY0-gY|}V*<%dC>&>F4rs8LqVdMTs!kQ1p}F%6Skg)HH23;ibuWLfWpq{^pPhH_FR(SVJoO?bdFMi!P(}X((a-bX91$)32_pR%NdgvJv-WCfS z^IxZx30!D`wT;=qvVspN2$Q4(2vV$LnKm*TzY7~rvZoD)!z7@$ESm4$N}cBoZ>-aM zq&JyjbdfS4G3`SyxyGCN^uO8QP^dmmu3>|I-LWBig#~Hx>F^Qp=Hx(XV$D&K7BE0Sb*>HEpvT^&R(3k5-G2oc4$k{dYjuS|sBNnahpLD}! z7VKvUJ#$i@)&zm9${1}dUrbZp4+KDU=uhCBkcXoM(nSi9$rRjzCKzl&EiJ48R%i|N zV(@aBqQ@(39Zth28)S#RZsJ;Q3uet-)YY?je1$@|J#5#Jm0kPhG1-j1k;UM;m{4EA zJWjHy@}g{46*-~JHhLjE1^HT6Q=nw(HbKpp@t{dzDRw>(LKJaSYm_&N8l>v#Q!3Z( zYtRO*?aznMxB&+olBPa#a(7sD?uWK>`z$3gi(mhnEfIx|`kn8Xf6+fa`s`s(w1bW< zpc6h&5q3gIm7FZu3%%`-hRHCzCEktJnGU*lcSM3_+$xD-p2n(+EyYs*R>H2XU0XBR zM%XJw|JN2nDe{lKU`k&r%+Q@{@-KG=ZhMMXje9Kas4g9q&5$$(ng$ECgTfr^_O6SG z9i+}~TnrqBVVcW2FjC+@O))L|YNsIzJb!B25uh9q;Iqw5Y1tq~a5gHKhZMz^^GOV^ z4WM^*$~&i{20z;6<>>6l7Bh5?cTrIE#p6}Fqp-e3hU^r5zu-9}x9v=H-cX8aBSmA7 zQY}*9+kLe8%%9|9^r%~o2f1Fp=q-tn)?u98vXCj|OQP za<&Im{Sh=0KLon~q8)Isoy3;QZ(lo$=|pI*MAkWXoQZsFI9Z*x{Gq}q5@{$Lb%&-A zCCM0v)uYtXIM&C7$gXOQ#*R}FvsN=To&dZ9qx4p{3kXs$fvR^Kh}77QMxE_&R4rvZ zfD5w>p?1trB*o&G^i>XNI}nZ|oizqNJ+GOjMK=JPi8`dsNU8UMi_iYU%W^uy@)oAO+KvqH-r z{V^0%A*d)gPNeS)0?YtG3a;;XU%)z`#+pDqzaM}ij*#Oxf=nq5;XW2v#RG&0f)HYL zpl%96ih2QYQ9s7u?PoNofWOjpRa}@sAecmE%e@&=74A=ynm|iq66Hr2gG$T8ZC;eV zQPCt4>LpH@@J7N+u}}sz)C}pVVy$>%$7JiDr)VQ8Whfk20MR&9<8(7v&P|m-@ghMw zSfwI~B%F}99^ELNo!LTb&wj(e$rem`rJCR6wEv_Ea2D+jN9>M=VQ^jqV@nabi!#dJ zcZu}0H2>7SSn;UiS_ll8FD%V0tF-jfDX#fC$qYeiU6eJa1bthL~#hfdisXYE|eJzN-3Ju z-&?&N46ParBktkGwO^yQwzgS-f862SJ*%6#F9QWjP9k-+5-1Pp<7qKC4ke=qTh935 z%pbopKJ076J*~TkMB-Nlk*Cm33qB0jGlr#GNgMLp!iqpu1AYR}e8{obu;?Fe^2~3D z?ow&lU$r#r11}-HA(u*r*5T`qEe%x9)1v=gb+4~Mwdtxj_AqV3%!U+-3Hdp^CiqNt zo&fYMtIr)`*pnBk{D|G*p7~K_dwm*oVnc{Q02At(wFsNCXRhWz2c{pDRkUxHD`t=;n?HVa}<{TTmWjB@*t(Z2$ z&;*t7cvzju)|AD?X@ycbDO@8rjObAhevesZ|TyD2$#P5M+jaD;oK!P~ObZ3o8D~u!3%f6xPV+9^171Ct4Zdyu5 z>+)WR_Vp|8%IL;p-sl`@25AXhDOX!nR3>mNu6yA7D@J&Kfm%Nr60z<1%)0Nsv|_HW z5mRf`$r2XpMz5E#f&T&swYN-K-R7oR+PXj+@-pxfL=jAppO72mSprxo4naWJB-{W} z!WK9+0`Ne)5?D_h=QCA zL5TS#!Cm|CS(KB~Lf>M|b*_EUTHD1ye%kwG3;(eC)q>RXc&An|zU_m#y+u@NyjDW1C8iMM< zpprX`0aU;hZv|As2H+Z?)(1Vry2ApR&&i-=X9yf9DA-K}74VY*3l0GtgaCnLjf{@&Uf+tG z$psd;YL_*>!rL9@F_(rogKKjvAPuC~8|5C#q9t3Qio%Ot*NyqgCf!LdI7A#!2?wGC zhiGQ6U5TEKK#?>JbEb|G8j!+iAyabyNG@!fvx18xVUgsl!8MI}{@`!D`~2BmY=kua zq6&o`5*l1*LX^;unvhgX$m4o$;j;)5L!roaCA4FSiER9mb1pF=4We{jC1e4AgnR`z z3XKg#f^~VAN9X}JBCbcNS3a%q%cP&J%F${7L~ks`7yRkovl(t`r+nLV5_=4wtJD>5 zum0BCItCj#k4L6QAs2ME=!P#TZx@J}0+6{W1==0QEl|Jl*pVHpdh=SJyt%=mb*D`9 z7CzC}U2$Bh?Df;T2r*?X9j;1++R$jSKmlqH^2hl}go)bP=BZ;5<8O!=8L@I{)Tg6xb=eSxE2IW6^ahUb z2Z_Bas71)6MC;AM1a4;%)QK>EfgsqT;<$z!Jg3eCk4QW$4fn{zr+E{pb%T+{RH)tIyEyN2}?)=4aa>{lRxZ*P79H8Re>dCcusrx4yBdRf@&BigTNgzK-mp zl;%?So`Ua4vqdguS`&C%PkCQ52Y9Jm>mJ5)%83V~m5Yx!Y}@VZn71H}tx=?RW~yv< zP(e~?1sK{y6Ft6K@r_MBna-ebhIX`u@Zra3;XP$ZYO+o?2F{wZzB51#NTqDDu3Ozf zfes<>lb%%A5lJ!vUOg*;n*m?KJbKy2T6KKn4yK)FeqZ^pr7GfPzspwTf<1+Gx{s@H zGP>)auuEgCl}UBeIIM6y4tvbBAjG=#hGl8P4rfZFdeJ-q5S>f_$t@ed8vHhtIA2-kxQ{iOcuw^V!5qit5`Ea%WvQQ$O+)j9UBkxS@Gaad+zK zML09dR)V!W!d-g%ajpz_#sp`hb(&-lW@{@Arld|)= z7izK2fzIkycsBen)|>5VqJFNg{+X2T=Y15vnL4uciy5?bDEhS|fxXf1E5y?<=e3QN zDPL$+D77;F0fY4~@kdN0q6G*0K0F&Z1vNBdv)4ZJ3NHS@B?|1Pk2R(AsnP34IPe|g1!00ascC}3gawIdQL2s~x{fI-8% z*QG(~s$<;0fer*APEX>PCX+D$LIAJr2E#=>ZU>XBd&v3qdS|_yvYz(w^kceLxoj65 z&eMB(vrT$TkFf$#Vd)zHJ42y+Mk=J7W5H7=!2;LF>Gwx11|qfO?$y^!lBgmCb?m2$pXGsw z*bP3^l#t=>X90rI<`mRS68Tng}<(XYur21K~ID*WZgCKzu`jiql z;>?>PAVm=wDB%R!!jSZf3~``I|1_Wrj0s6HU>hzHZCgo`JrX;qwjG{%|o%L22>#Q1C*FT+c5ss4bYEVJiITc9?f@-1oGc zgzxE%?XC8}4AgPpJqn!Vh|oa$#y^^uYmIw_xvF}40g{*vc+#6LrXJYTpCC?MRwqnY z+4q&uRQWNjzIytSaMKp`H1UPY2Y&=&>-+}|yTr(nq^vT{D994Lk@$Jj1zG_5`fWrDN4?PNvSR_l=_TVp&@-D zJdxb@jHx`Sx+^9nL+4P{<-)4_VRW<1=(E)YL%c(BwTD;eM6rh4P`r}9;bg*GdZ zx5AT&hY4(IXQCuqYuLN@mOMY;FIq0&%BF9qS!j5O$mj?eDLZ7ZX6vuR$Lzn}0-D62 z(N7o`@JZPx;X7-h~$j0Oav$D()?{2kJ+FX&`h*BM$~NYP3)R z%SpnHI&GsUvcx%e(Gu_J*`lPEDUcxCNH7v11IUf=r}PK(UNr(h0@z{nA7AQHzta27 zHK=v83##|2Qx-qHGY|_8BCLS15R7Bjegf=hi4X>MFo3RK^JDSs;Sl6jm@tZwP{GCl zg>g+J6qpB?4*+JuzaFFC1%SHJ+Unl%MWoN@y?4R$RRU;V# zQ?+E}v{@2JK-MH`3xXCUW|}_B$%7Y0zT=i~k-idZc#*!y;3YOOi%B+Uiit3xuu8?I z1T;<>YY7apVE!zf7f|Ql4b=K7rpljinqI~N=jO(hQ`EEIk%|Jx+KNPusR^7L0U!W$ z-KGL6?>-)~edQ-QmzYjtWJGDHohoq|{_(|wpzy3p;}RiUfpW24{OOe_5AB zSQU63&n=MmosBJuh(ZKokK*A+{|+*<=cPY|HQu||`P=MJ;5L>jOAp+d4U`t)Y*M}7 zd{K-wUi0_`*hyE2yckqg4N$9z)+I@GqtiDPogL6o!D-vE_vx=Sd(=i1&hc)HO1>w# z$@=@(BpoaE{%@BazmM8dJ5I98h8Pcrs3%u&0?gx0AT@&u;zc z%s*@g7<8Dd0vRUVN&%*l;)`e;PqjkyTTO%~D?&BX38T?V<@13Mupa}u&G@3;qPTm* zbfl_5C_!#|yx(hdjWMM30I+*`Rd;-NzTU~#Opz{>5<%(cw>(#1_l@RS7B@}Dg9ca` z05!RS1A9Q23sOMN!}D1*WI*)2#4fyqWKY}JP2b)DG;bnNiO(NIt@BT5?j@*o%inR@ zGE-ja{0XdJBx>Ziys{0BpElcojK_&AGu4AAN55Ri{8g7_JRYJNpF@an zzo9I1gt!XsPRer(B2Qny9QD3|z2)y4Fxvv;6M)=d^y`R#+>Mz$QIKb=V)RdV!^|ls z4HTVgWY0pA-T;I?@NJ{v_ulvOs0 zva*^bHdd)3VkkKn4zdV^=RaRG6 zSz23M-zOj=EN@XMtybIFY6dc7Wxr`?4#dw$=KhrU$7 zKW4NW&GcHkl+6UZ_i}tdP?=b;0s=;g&S<U*bg4mb%KYg!Q` zqka0fMKc$EJfnxNFdDjkIt*g`6VJ^!ct~%4rNGM22rycbn!w&WaZ)}t*DN;Xl*{}e zLWE|jpaBFiNz80i|T9PRFZ10rBi!Z!c}|5#zam9GDog>Xh@gW@$; zIomxjz26BizW;9lNJN3Z!6X);2kw6(;f}?1(j<`~LEp*YsX^-h#(DmR&Qyz*PX4tH zrSx7I2m}vef*4U0grVkMg9i{gfM5lYBM2&B-~bvpx&tAGjO-W?g~VncMft0<$TW-~ z{_uvDp)JWxanr(=vomrQpH8vjZp-b?%I0lO>^E^;^>T5FU_Q8Wk$qrIX<1Rd`ng{* z=oB-KkfxrBLrBT|i;0R%__1Rjb1ah@17A{ZLSB05UNOcE#u)F6V}!R?beQx2b&2%> zHb%6>^Z+$vz4JA6r1CVg)5%!c>-UAN1p z+Ipv(D=p^4(13xZsjV?~@IOyUR{i@(vo5~TcuA|?g=H1v^wZVu$-%{+GxP7m$i16y z<=d$EKS@29g+|hJx#nk`fdM;QR&Q)rD>h_)V{F%Qs6+6FJ^ubVnm4lBIFZ z%B6sJWr?k%hp4MX3LdNV)B`|85&4(A}#=) zXsLUyE6t`WXiszTx$q7|4=QK;B8i7(8r$)hn+^7wlO;N$#=tnQ_d8$jG+M>^Ai}&; z3Zui#x;)+7+l=$FX`W9gJJVca8nVrMp0ta)NshA$-(6@veO(tH76yq#Qnn1U03Tiu-5Sdcc%4g z@5ahHgAi8@TQGDXbsW2_KT=3QJSM5F@6A4lH7ja3N0TdTht5({p{8)YFVw*|;K|~Q zr7^S8Y(l-yz@33mUWswXnI?jl&ohZK1om-an=Bz(!bI2CzB(x4G&?4n83WhSmh^is zHW0Ab5S(~Obd&IgtK7k-87x{G5HpBA@7o{`ws^dC_ljBcGDBGB=%}1(2hu4E@%6gj z@4&4jxz?>w^R0GsFFR3tVF(ggPi(-H(JqrIteEf_lvRSD+wJ=4d!s%{7QUf0O$P6V zMeMb+Hd2R!l@L7bMv-)I? zp<;f(&_pCx7rLRmkR}E$0{wWTU;4T*qd_b&pv`?*tw6SK&fd^{a+u9b;Y<9(BY!%w zq++m}euYCOphpZ^2DqeEdPr5YunZ(*iR*(0LKkR=@V8{*@AA#!g+36F6%^ ze0KeW6_1QZmzY5VzGpggQh26RZZo8O6B$r*>q_PRQ(1GfF?E!OF{WK{Cr;I?HyZPy zOR{UJV{ajqgPsEW%5-U&@^P1;rz~4OolaL+I>ymIwJ*kVEp^6ViR#P@>=Vs<&)7-< zn7VEA%Jj;$m2$b(`3AQ==ap}diUz-dJ7jNe+D8pfhu$7!Uc-cqw=G{>!GSj)9h}vY znfONMWq8;?9`Dn_yoj9#HvKD^*fQ?0!)n1`rT>FHEbGjF+Jqxx2_bi`L84KQ>I+*6 z*mjBAczb4>+1FxLyl^fy>ohz~8`b|~;|kcGpm5hzN34GwPT-Y6jN9k2#jyZKt-OG$2R(*n za2)HD`hl{Co__%`<&KG_RyHfQ%HRS}Jah(+3-YAHiN*#nvLH~ZPCuFtj^qTcP7{8` z{u&SF_O)$)lVLO0%_YM;6sPte(Mp?mhx#)Tb@+EdA69Bw*mcpdw332wJQ3kleB%9H zAG!N^FFL;CNj#nRTRZpqRq{Oa{ga=N2jNA0R=?H$+Tkxc0Kl9EiswWSwUqetE}qer z!Axbwat*~LM9*Dpc@tgo?Do*2A;JV>+qf`Eg&3RWHr-WK=q-vrO#v>m09LePKsP~; zBr*9+X0$~6A?pV8;>Al_g)E0s@+>;TP#%C!EV6bZ58@QyaFO*Qz%Rjy>924-`o0yL?fyzX7nAsAvMi_(rB#4m{!Z<4dwjVk&=N-CB$^tw4#C&vvW=~ z%|Q4yBtlgZb5>X^#vU<2XF+4Drfe~=el(Kcpv)_v{ z<+U=S`E^e$fM(8oEC>^|vYxwU@|j}ie0$RSbh5c*9$P>6F=!1g0{7fEZ90wh;2bfc z$=wn0>7~POw8HO3>;l`|vq-Kk-EIK!6A#a-nBOIah2&}7wdx+_-mKc8Sp|VdXLi^d z8LeCFltVwpTJfHc+kRlf{5YI>>e1%TVQnhnMz3_nt9+W!8Qgp?nad*>q2XjSm^bs7 zl+4pNo*MZT&FmpKK>4aDsLYrWQEFwCD6_yqo@cv|;N%8UVV0KU>6@ibm7U9hDtq4rT;F)F_@0CG36Dd$eJ%2KTRM+&OYbp4p4#%Y} zDtA=nw~M7`EZK%>pP2dny5R4VXC=!`8lM&pkI&*=O1Hk-02kEQM#T!`e&<^ z;tS_a>BE#D%RrzrFu%7Pbdcpo2-Lb4N0{}(HosrH-WE`v;+&VoG|lIT%i%SB>m9KC z2@k((*Bc58h1MnFgt|M?k)CbrgMzcoDGdMR+DDc!oFKW4EFVq9yj*Y*l9z{P<`CkG?)r%}T3 zs|D}A(rP!W>=)1Um4T_-Lc%C2?v>0FWzO_Acm&7SS054XyZP0I{uB1XkXQdGnJX{OYm|juJ3r>QFAiK2gJ%Y{8+~;ZFpZd0Dwh;GQb`~ z#>;TYb0|BmPcb}lQ`AJ@h`I4gBEAqsK?xZwU=TxO63c|?+?>}%`Kd16=-tD2dRC@m zad}iHVX5h;7hjXttIunFT;uICW~$~Q=Qppy^!Wp#sgA!ZpNN9okGjnUBfU{?`LP&H zz25f%2NJ9(@<0LjUSs8%ss1}Ku>u-yE=(dQJcqNEtK zu1A5Hbe2w%eU!!K@0Ilbwoxnu4HUN3cmCf^i-!IRKzMMVfTXCbF!X;`ll--J*5knc zO~A{YpHLA-AIJ-^A({bhJ!XjSC)4 z3=12b43$Xz+1ZMc?_ZK$q&CZ1eCmTLaQVQ>)LQ52^!y7)5vx*u_&y6rlQ6#jy)F@f z^xIIbiXffkxcpKNO6AI!eZaSV9vx&O@(+o9Ac3|6BWW zeu|ZSw6}YGfBSd?`mI*QL{|btio!bMA!sP?IR8oq72(K{q$o}F)H;#$L%;wM&u9GZ zc0fY<5dr>ks=gEaaAZoy>68sH-ll(&|9-1&KNpowH7&~?cK6BHe(dX1d=npjb^Tfs zrpElnNS}<$0ue%zrm2~AOt5R{;htq$jXhYMgsZSwW{k5mU(GXHTtMAPb}ZL5O|LXX zj%ZocRq;LWW62*zJ(&4%#FjR_7_DADhW)YXS(_T2@agjrFD(aiYdODPw8FM+`+xKS zuTROV3*s+ZGr;8Vyid#KeQ*EoRzO}@SfX#I+8B+PnVOrNogSiyL}-IQ$c7cs!HclC1Cg&qIjjSai|7Fwi} zv526gGPyiXY>3c-1Phv6iPFHoBQ$C1;NOv|+}lMRJdY~%Jq(skz6UCct@;~5^d8C7 zZDF<0-*M|q{e!|a&i#UM`{n)p?}7Ax9yb>@IZ`CDjg?|CR%xvHjI!UT;|?oE-4d3u zlM>Oea4Fg5Exw*RpOfYc)RJ%bGaw?v0qJkY)ov7ZS}1UKO9(? zSee@xR@c|KIkYr4Rx@yQH*M|hXV&pC^U`y1C#SLwO@BWcXRq)ct{-*gJ-v$babVZ{IZa$(b_Q6J=(n&@1+eEjGB!upEWU1s94as$uvvL&wfjhlssiI0(& zxv!psg^P`kF+C?sUn4s+Hv^l#wt8mcq}`13Y;DSs&N=JI8?XI-yyyp?$L}?-O_z<` z3452jq_VoMi=0c}lSA%lJl%GehY`h%%ctJ==jWHRr@X$fKmWF9M`s*$Zyx;H+h2e0 z`@TNBu%s+~zGA0qFLSqg3#(5{7cN>p=tzFT6*`q@Rk3H*{M~o)+6m6Kstpbo@)Oa5 zMyM#S!q@%(+QR?fQ^)n${CfNHL3=Ul&zx-{$L!L;Js;}cU6Yg6n`_--c#1u4BSxMUeQ52SWwx5q{aiI-jKSmzIy!5Zh4U z7uK?elbXM-sAyH;NImq0*M$G18!ft)k;^4<87%Z>c&xvHaYdb}B53x<+>TnIZYaNa zBGo2xpO-^A*c>E`D*J z*HtTZ6rtc?f2@P8dFvhCPO;W&0((&5$?`k{Tb$jNKYHgqzi!%1KqCO0K<}>J4 zSwO-Dnca(2pDpR+nfNMq5DnJs6KpmiHP!<#&r0@B%yQL@=2@TI_U?I=r!V0d=_X>GX`a$KY zD^PKW_f#w-zQVA2a*G~J?3LQSE8uby>iF1_*hPTD-)tCgiorj)`hfOnE7qh~kLP*z zMDE@tQD`tsUW+Q%Sqp}h;M3zxKDf}En-$!=HY++V`Ap$4_*i=WqOvyGiUpOE$I+FW zSvMc)>wvT3O(1f#&eDXjMSPhANUXBSvn)F(roAh|26!<_?}hF!7i#bB0fCO;6NRUi)o|sk@MA^ z&|TAxjvEKk_zolZDBq$VTnrVjv9+m^0%K@dxSV+`Efu5`!oAc;x;A*+7(#X=d05^} zv_&ay?hjP3HoVw6-(1)4wrym$Fk&4-Z#go#kc4yK;XG*H-dfTA?Qia)4ilL=(`jOn z2-#6Su^FY;$E`GGxyt&umtQhxFueNJ!@P_iA|@y}PdkyrSQ&yW+sAtDjnCxsc&>s% zC7SkFJ>2n0J<1|H<0Ow#R{*DzvO&`Qv)S^8gZ$jj_;k6#;u9^cPdcT_`3D{gD)1jY zDS^yFIZV*Cc2dSmz3{ZGk>wV(TVwL?XBvK}3MK8{>vpG@O{dx}q8!52i3>&-_#bMt z(-O4xi%2}p6v#!r742Wz39aMx)Vjahz2;UMU7qTHEa(6X%?W&6HWNxF3-0f@07*eh)V_RAs zO}vn`EkDcQ{4xn;stWX(%|Dk?!p8Jtc+(_E;hWgaWeFQ(MT-^mZB?Ep2eOoFx1Gt( zf>X^0s*i6=pC5FLg6#~!l=Z)y8zt25AN+J5tB_98qVJVUJjKN#dj}q(%&=+B-Vs-- zMQ)Y&gA!X?i~72Jb>Vo0*C6b=4yrokoRMC$I7tU>%VLi9g#C_w7WxLYq`8@rZaB@7ftP&BQcV$o z)zcE|a@#ixTyZd4+k9B-3f{AbpIcIhWJT{gasbz`5Jg|EK_ph%-S;${V3p5hkbkey zY$uO_AptU}J!XcV`KYLIP*hWLj+P|HY_D0>viOZ4kVcgwPV~#2GMiR+FnQGP8_7!V zkvmOaz#nfjPJS~|rh?LkrZjBWKgLW;WZHRQ-z7ofC%%Be>|(v*!Xi@-&;5$XMlJ#! z5fQONIPjXDv@g0Nyub#_(3FC77t7(%yz?{?+>VKUA$Ym{foTrBCG1(iYt7wMlT}a4dR^=e#Mvb+y44@nFyaBtBsACD%vCLp=jn@h}?IY$WUhV@8bLQ$v z7DG)l7&+cVO^>hyF&MIN+egGgjfL&+=qWbUQo+y!QhNbPTDr{@TWnm|rGR}QWo1Ju z9$T+^=8O(R`zA9tV$JLkw&Z8xhDi1#V=DE;fMgDHyMtxu;qmdri7CN9u`-Nu8xobep7&vNN&Se2)Tw1dbebm)%JHVyG-N^?7zQIDCMX z&|9f25a%QP*yWjTgaq3&Jl1B zZoQheJ0MWFFXk16=7d!jjKeH>d%l(!iVhe8gC7yTRJ!_B+CDruE6KD-e9^E1@;zRt z%4QX2;4?BG2USAsA?i?m5flq$C|I~+k;yzZBZ~k4n?bSg2y6D{>V7=}uT%W&ubE#y z@5lHl{=wCBZ)>8-E%WTK{qkjg+Sr_%v&?F`BA4og$NVXYxq8Cx{EW&eT3a6`Q(^xuKK zDxeaZF9rBiyBIB#&(7azp&6xK^tB`^7!WC~d2QpGD=Ke;v=5(d`b}Y|1*Uaujx4J)XUnRTVxmWLl zzu24%TxRvsp;LO*Vd?Ohyy{1nj`;nfBR~E}=6$KaPkw8E>zw%8n9j+Uy-wBtDC8&N zYXZ?T<6j`axlIS;55NK-4SVUd{7|_o4qy>r1z;Uu3t$&uKj0|f9>7C@Cjid@UICm0yaV_M@CD#Iz%PKm0-OmbKq>&B z@&TyIK-C1QK2VK;YKc^F<<-_)XKQM2R`XiYs@Auq?d|PwCwtde(|zk_YaqF!!XJxr zczgJ-V7plRPLvqzFj)Rr@7!ZmM)CG!KT&}vUO4k-Fz$F1-1G^j^dXk@*os9q5!+Yw zI3!{iS~xn+V(Z1}-*JfDhp>|mR|P_yIVi#N^#UgAfn@v&N*Ig07I&up`FY>LFNx}V z=KGcg1QI`BpuoHyo_*eX_2@!#0Wf^mKDx8c65=+5rGA z%aj1)-G9b*2OW2xM?B>PuQ}~KpZLlTe)CV6fQgEfw?}ViYH91}>X}%!V%3^;8}{rw zaOfOBgb8I_Nae}17q8yD`!M&}f7yZ`zedI;re@|AmR1N8%D4cjw6%?`oxOvjle3Gf zo4bdnm-hnw&pZI|+3<-E-PrEf?5OJ;!M?g&n?}P*!$vt+%>ip}Pd4Dw5!pDLS(3SJ z)_CuV37d5N&$a)*k+eAR{uZ9P5;Hiwqtx!euK#2S**KR}>sFt_ezBW_S1-T9fn z^%lDG>g+$x;(ADpJqNJKL$KkQ&ee544?UY&X%PC|$5RL%qk%KPPx&?~#P@oH+nd&F zjSzGD80N}8S-V_4Ou@P;F3(bi75hvGYu+!&PMg1t7Iv7guQ_!^4!ifU`C;0Qd(G@x z1{u=bO%$`JFm+}PTVQ%oK6M$v(yZ66!n5&TP9W=8`2^8MEt$J2i(JRfq};n>@mT`h zfpde&sia_BYum>8`!xuKl}R~7_lywiG!9CV&OUydk+wzuP57umJa+b!aHH8&(t9+( z`@fX3)@~mAcj4jk^e@JDjOd6a@qA&eZE=XWM&FFLWo{#-ZZbLmlHf1&2H6D|Jk#2w zG~i$7%C-e)a5s731DeElgR?asNwu#R2+YsCHyw~S9rRwClRK5^_e%eXF?&XK$?Q(5 zBky?!6Y*oyr(E6FRJPWvKI0|dWRVljkhOk?JjaTS)kpo!hVq7Afg^oF2D;#!;3;$N z>>-mA$z~rMYRB-~Ogn{G@j1EP?q%cGd=g??*L}rS{M$l2Q}H_2j-fT1ba0P?zG;oJ zfe3j@{uirhlk+5nXMWzepQ-)}Ajfv4tn0+tPXmz`6r0m8xSGiT5QOHs&*vgfgF7~2 zvhCW!E%h>|6oK5J+Nij}Z2}L%Czw!5-0oNpIe#f-&;%p4 zNiDZIzSy{YxK-KA)^?^Q;`nKH;0H12;%1m#{!0@XOsH7Jq6T$C)AZ9Y|;Q>uk~zcCVR z5gIR|cUC$r*<(8_#;&ZO0yVKzSv^M;@`>}Su?PwnjmTOcHNr&+87EciY^aT4At-HUA700cU&k~B{D-J`B>Rn%bVZ znKG0*iN?VcKtI7EvIub)<|Ug`u`}3ih)n4H8sKEGwerbwR+es_7F z(zuLJKegWl0lIssIAK?C5Wi^YK) z(9+Mskzdy8U?CzhDmo@MEMy?^dz^8{8-IccCz^PYmCB@`X2WV1rw2SD0RBEP@9~-_zo?{gf(cf0L5HNnvB({D zB35DPWN#-*=jxO|m+Nu`U8!GEb+v&BbiKiWZZs^=N+a%}n|+c(-Rg_9YJPy!Qc*@n zK>{a99q$?>VEnNfI7W($nVAzian7H3Adx(hnDkfT7@0Q71}VrAtdU)#qh4L_X1FJb znB?1J3K?}D?Co|NF<8oXwzt3qBFK=3d=#Lp09QKOy-!*h)E?0#eI(OqR|bm@>= z95RiejFHA1@Ev{5(q1mej^uHF?MboE0RoVg33tRN-wzR7Uh?wS-~f44P=yEy&1f-W z2O~s;EIIN_v%qm|Py}-2SD1v>BVU5RMnE+UsL|05PLL!i1{h_EB`CJ{7|yq`S{gw= zrGBsDg&9oo)DjCjsk0(Ksk&nK95RpefA)1 z`<(k`SX#v6(;9T5P&%3p$?R1vT*MN z^TwYMtlj3soo@#II5$1X3>PUbF+VOW&fkjYW*vGB7_}$&|L5*pA9A~Y8HuL06O`Rt z{(r8|7pW#!ahAVV-V`;OwCXZobbb1hw<{*iyzf?Rp`71+?{|h#g3w~di7(-OcZ{VZ zd8$Y2gI~{>xWWX>q-ORw0bRi zKZ>7w-@lF$s8HCV&d(AqDJ>HRZ>7wyk{pG~)fj6+wv62Gs|2aC;XGH~YTB$xt1bgZ zecF>>ZZ&VdTeXGaccxz1XY6)BD3$h0NB)eYn@*q=%KwSW!Qcoa3P5A9I6RT`pr_#J zz%P;9TjOYr+#36IysdHeg7abBLa3N@t+BO2f8Tuqch1sEg*98e8L? z_$0Q2K}fuCzj-lTX8*DDLx6D0AMKU)e)XR!5hphI@-yfm21bS z>eN;3>}sR_tGBTx*LA;MvRC(iNiOOEb6@`tvGt&9${RkfgZKU8+a7Xd6+x+}HFejK zHv{$yewM%M*w?I%{jce9m*Ps?fqU>6o|4=<$GZ@MhmHQ(J%;D4e~!9_ij|o7!rtzo z5)eY70%{BmE7fcCTC-L}9lG=w@C@z1Kq~hL2ul%rOR3I5fid1RRE0R&M zOj)w!$dxC*Fxv{(S!P-L|67LQV;}jF?&`TZ4VnHXi6)gLn@o;edGZw~RHRsmQqRPRmmpD65tXdVzyH-8ZX4B?a6dci9AViPw;`_5 zhPphL@5Nwh~~cu4<;r#j;b4m@u@=-6tq$H9+AZ^5$s5xDy&nr{IrjFmgSIN6sRJqcbyXJf@qnk;UTc<~b?jDet9jaqf; zHG17p%)p>TiBU8ii844WEq8zN4=h{Zz+X>|{RjiBA0?Z--obUW=o)E_=dQTM`}kMp zx$5>hXPt1W+7F4+L5Cf+?X^Nhij{corBY?eRdn1*zrFB^2-m7N3@T32N%vI~Dca7z zcNn#)YFGHG1vD~5XXOvjU$g{CwbomI169@@v5vaysk5&7s;Ra*@e(~&&}0oY*3|1b z+R>X@1|%JW#19bHNgk>gu`sCvi7{;qG#0`Qb=<3exEy0Akv8Hq!4r~fX%!<)T`@i0 ztmEDGUi7k89@clrC|_Dx<$`@tna?;Xh(WkO+$3$FE7t0v5$36@UA}(ns~cg5CbzB@ zRm!8emmD`dL5gL_^m_B!5Vh;jsY|yWz54XelvmlsF42>Es)hqH-D0}xp^cTW3)t~# zrbSsyVtV;=jmI9Z9GI%vqH!Zf>Wx*ohlT_cOUB0`;e$CT& z)G}hf{P&XEkF0Xu9vA5Sal=0P~8;p+#Qpyj3^aWV0={X0*c)Mm-q5t0SJ(2GALJ-E!MK6j3o~) zy>CfJm+8uyH*AZBJ$bFJuHlue@v{;X+%nt|=w7f~AYtYTLxj_qh(%x-N{FjpKjzx~ zMOUenNY>R_8cVdB$g=VaiH&X`iP?R%Vp#@^=K=3b<$J-eK+21Km4GwCMnoV!Nm@UR zmCJdAVaP+i6cQmwCM{rsgh^YEo?%)hWzV4W6MFH{^B2= zx=Z_a5Q2dc2$FbySQK-D_HzgjEdMhDpoFTK&14a?FKsMO-F^pFpkn!kL*;_L-@)L9DH@g-*ka-E zz}@c=j5P@NM?_;i;{6H9{(x+(Lq67`n7^UfKQYZKM9!QsJftKKE6*cQVI>3#EuS48Srt3vtJUeUXG?TU_S&iJw-KTI zobn6GFDbWEent5;bX$2&2Hf^-ziq#7JGWii z?k7RzB?$~h0RnJ<2Ld#ygnO`za$TW+6hG@91rx1B2Y>(wKmi7D-~=P$2KY?71_%vf zsTcw|(WMZBZjs&86cV#A%k)b2tsU3S1sMIych&&|M!8ts85OGh0oug%!IYPl(Sw!J z{^zs^NGNC+SU7kDMC3jZauhO&NT6$ujuWLQbS*ZX6v><6SyC#k^fJoq{(GzV@-Rv# z0b6F_BxweLIH>aAxz@b> zn|B$585$+^n%hS)YH9P$*Thttclnf4B%-A(b!kgq#xnQHoBHv7)KB&QdZ~m;SZG9m zz=LSoT?;!GzmTY6r7Bdb)2Ky$gVD=NSGnzV$qxy2ImsO+?`TK<;wFwdcuXUvstljgXzMjaYU20SzezFkP`WhX7MI ztt(;NfsrmIE|-OSv`Wj~>Tq3wKbvZU}|>frDaF z5HUrfPTggp$z{o+Yy}s)_mBb1_-i+9Xv5{mQxf^~P)IS)DdAN*auqRBYc&{2D8+uo8Xtv|j-9PG+g%G4k#0R&N{iFp@6aFOACR zr}t^^TBk>N7bPmp2N!~dvZdT;3}cG)9g$?qoTa^;JL@~96IGV+wNjFuH3V8cVWB<#$g5};0_Sf%S6H55TJWtuf$?3(Vy=W^cbQECP$caO=WatT~2m&KKEW!zY9AveZb%tP}y{967~0T6%$Z~)>c_~!2R z|9qafiY0mXM_A4Oj$LOCuNv!p6W#*(4StbR7tnu^Z<*ZhT#m)6f6POf;RTF8G%x+X z6lIB9-i61MUJu&6KOzwde|Yk3j(^iQ3(tl0&94J6Wp9Bh2VWDw?w|V5k<~c%;6B73 z^1+@@KO7#k%@p?iAAQytS^o1yZB@sIem&n}@`0|Vtmty7n(4|U8t7@k&OCL|tf!G%s_5&LL!{sD6Z5B@ zjolKmE|2vTnO)XT(4Cw}a_YC#YpeI#yiQzO)=6E~ zlY2@}Jv%WjXI|DP_Le@mpE-G)&;zBo(`OV)98&C|(PxlQ{+P&b$z3u&JZ166k_4v# zz9JD|4JcrB0GuXq26JS^UUNZrOy2JDp#}Zd)5oVhV|)gadS;B{edajPXOF=?Yn<#0 zv^z_*Kl$TkUp;R1HRCo`r?YZg>)VG#QeU&^X~z3vr*N2lA)x>82ZII_45*t_voAJZ960kCH3z7< zXLnTi*^0hX(6bFw8!)qxBxWVpL=^j+63awIBGK^v-f+y*9Cwiup5dftlaORW{fE0g z;~s4uk>?4y9%pLPi@DPcYG5;qEw0iPG^qGyHM_wjlvq+_C705iQvZ-mY@WVtEWM1& zY{>KMY3qR&l-a_DHM~Vvw+kCxR!ho$oo+IualLwPN4d~tPZWeXZ{|GE0U zxicUC6MlmA@4rSUQ!L0Hmc5%b7?$OTy~tTFan8$}_X=@dEoLT656#T(bEM9#UX5V# zu`B9F?zH@F#n<#l`eW|;^0>AlA;{Rquo(=V3q5n=FzPlA&-~1oTMpZM#@19W+)YE_ z*nqJUKwFQYb@+OVi{2#Z-7CM$ChxVZEpBb^x32E3-xc;Pk7WX^#Pt1wgjJYZO|`qt zZF(~@u+7cd)unTGZtU9HoG-t*^Q!pjYym5Cy13=tS}!Z>-HtZ2u}ytlLYu$AbGK`2 z+e&Qv9c@iJ{{(ta2INqC+S|VNci``rJ3{MM&=Up9ELc|A<&;}q`4v=nU-olF6<1Pe zWtD%qCsDXV-?PqFQ*CwC*HB}d+wvu!0cxqWw%XhJMW005clrhDZ0D7{(k+J5NK*jF&oH&dfZq=h@5t!almz!FTS}ob;1)5>N8M zyc@6MWS>-$;Y~hiy2E?+fs7do*7NXWaPBTl=E*wQC+EU($9eP?J#cc-Jb5o|x_r9I zZ{x{7*n>L-r|=Y=VsldYeghAlYHFzUK7#?pZ7|^KsHcHOns^Q2vhPr`+IuNVb*!>< z7yfz*S9CTktvjWa*sTu)c2N!r+RbyA5EeELF5be%>O1c~BUp}rkXV`|%MSiu{FdkB3>~Cb)n3Zp~a*mbaaqbn@4bmq)y=oFCTP zGy(U)DCcAtWyW%Pui({o#|4OOhHPtoO-E_-scl@c)U$ytQBKQ2$EB=FR zd*Hr@9w}C;O!<4S*5s&atM`vlNseOOnsV`BPl+e54f<%j^~O^vJZ%x_GNmsvL*~M= zWXyVPy6T?McgZ<$RbBW8b?v%?uEC3N)oiO zw$p_w>^i@#=Nu3>X^zR1zjaP&dww@P+>?14_o#iVb zg@11FLqs~~eUE~M{^m1$o1Qa%f1mpEeIS6~31&&el!%9d^11nFEIxxm-`OwE%YT)q z7%%Z$KK$1qkZoTwRcT*TlmerMjTSC?K{3J?a`euk`9DIF8||8>4Gd+=Vqv-j#fdY>D@ z^+4>8#TC}>;&3CdUGj7vXj|WSH-otCnK0cOJru_hZz92@fLlTB3G8+-F2T8m;I^0C z4ap-E&j4Pbd57T>mTx$I;rU0f=U%|z2}BYZ1{Mw;0TBrq1r-e)0}~4y2Nw_jw|M`Q zkcgOsl#HB$l8Ty!mX4l57^83zOd^?C?(2Spjs1RQR*Mt}TREyKSVP?{G=dSTVw250 zNYxOBf{KQY@f4(%Mq25lrxp4j^z(Ac9y9<9Pfj8W##6XV&+ zV@)~ii@DG%x!R7Oqs8w2#i#!qeBC|V;q~nAPz&Z)fm`tk-u>Qh6Nv5x=E}1m5=%@X zPP_z(k|ax!Dowf!nWVC0lgW`QuP}`Y6e=Oz`XxTPI+k~-8IfKx-Z=9)OrI-<=FPGB zaD2WjESU34;=+=-xD+ncf&ORRyT;|cWOc6~?=@?C!}{K`F)TYH2_=7%Z98P&PB~t# z`0aYdcgr7l+j)B{V(--0do}mJx*Jk&pVi+N4faQq{apf(DntPcK@ki^2@GQk7>y-$j3T=M}peZ(#QBhx)z`Wu|56!=HjEA+nIUxc00 zWbL$AH*MArN$+&nFccf7%ckkEdHQUb0h2Ri&y1K_3g4E)!g5*MLzec4@5|%I9`kcg z_%($=`_msFTY#R0=v#z=#lS5AVJS$k_Ox{yn{)JwVaOTM)A z?!}(()k^mA+Fs6OUG5FP5tn@H9jz?I&Nn|;%7*3G=K{j=s7W}1F2 zGtTT)GtDr|bfws!M1dMPCqIYLsYo~)hC*PDW^h!pW)g6v$U7Z^8V9MU^O0s!&X^vaaANUAuJKpE>8YrCYl;T{?Q4Eo+u- znQU^iWE>U%B;k)g?$~4Q$9z*x=sK}Rq`U9eLP_D)I~1;IBQ|a+OI^~^mcEP)+0bQf z*gCIzHCwRJNb4dF<*aS@euH9RUsqN(QR^lX2W?|2{j2?}+e1dM`-R4SShp2*_l&n6 zq)VTHE=1FT5W#5S*-kgaFJ#s$NmCO8@4W*DNN?$?*Ya4u?if+1oZi^9BQ|{(#dGJ= zj}|>f%viDG#N9K?S+01(Onz4Gl(L;h+qu=Oavug(Q*XOpx z*h6g3u=n7HYdu-;Ka1)xFlm$O+|^=afj`*iK!2OY(sVMOm9?!;4|aWP{K+tJ z*^2n&5KYt^HIl-6>8ZbRpcBxY7Fl}pkJ98Dg2Sgo=K<)koNDY&sMr5diU(sycIdnZ zdI7ij1Oj-80fb1-rvV0aEFO$aK26Qj1YaC2c0MO>-i=w2*h(HxcEU2AZ8>JOz7)Y; zk7>TE-m(bO(u4^MJcuQL+x{wwwyEstB*nU-cS#56FqW(s2ZEdpNTidT1564+1k3BO zU~4PkED~50-901c0E;G*vyPj)Mir_Uqi1*Ad2xgZUz8_};oi88X39rY6538>%hjEn zELT`OyXj2l6jF0-Ex;yR-I;)47QoSR>9`4y$BJH0ksETxMSx2QSgBY?|7>bh#6|Qh zx!hdl`Hk^7ajSqY;%#r}Meu2OeGz~KffZH8deLG`E>57WWP*B2T4*>BP_rtBajSFs z4Joe6(wJZY>eZ@t0R%{yUYhbMOd@$_KHv6%5;jJLps3CRr35)k2=uxx^;TjrQ*H~U zV2Nv>jH28eSlZ(;o;MriRWuHZQi~QS=bOFM?0ufEQu44LfeOCaPH%P(u+E=Lt1?!y zK^eZUtuURDOQZq<)Cu+2@}FQi2huj_VBJd1a1N};(Y1)BCA`(qeCk~lLN}{l;j9H- z$&ObAUfkr1^FlNLHb(@m36b{GnfO2z*IF3FUZR3UEy%M-+F+lf3Uc{fv9*p$0gK~p zt#Tp3>K%6_2ddei>Q11B4SA)u80;w~!eSvRHg(0JzPL0LkH+G^sHq<0BcNIFeQ5c4 zw3us*A)lHgmZYK0kJN!4S&zI&(WC5X?osuiee3RkmN5IH|6Qnf*37=%nJc!XRXNi- z*8bcWh#u%8V5GE?7phhtSQ{3+l7!K0z~q{}q>V8eJ6*F#Z4fBe(P9;!vbk33uB>lB z8`rR8uss6CP?Uk%|5)pvpZC-rwAM7c9WYaaRlP{Kqng` zReMdnRv?e+Gq1)aD@(pAwdo&cMl4QU)41mB?SO?qEi8Y)@;yoE&dJ!;q+x^!S<7to znqa5=tZCS8Nqq9XIXzBN0s2m$i)#I{? zs=7~Jx*t#c=4ukG#FqYJ23}dB{(>Ba7A+0y=<+O;*9vT}kDdqw473q00C_gHIyeWP zY7W@+pOQ1MldQpp2Lbz`3OtL&Q%ismcuF|T1;VS=Y$lz04d&gRcFrY-W^Oa^t&Ud% zFLjb{^r~JV^34RC+*5K3FMYG8dYT)TTr~9-`)JFZq#^gskfwJ6?nB3HMR+j%t8ee^ zuz+F>)?vlS6as}v>XW|+EcF-=z@tmEECkk~X;7aal-8TKuWP)VGKS%QidE!+=+L#8 zgS8({UuS)mj}wN_bRY9)y{%LobafK}qb4y=?S7&O-sMb>IRa$SBG@%Ro|?2ThoO$n z7lbdNc46wZ93{xDeWVM;CKq09M7s$|Gn4{he$4Nc}^oP?I zSe)na=$80{<3>{bWM5xE0N4MgxBM&bUxcE@Um*Pf%4&jq{S5#61T=d;$3 zG_&XE(+aqLB}eTwjnTqlH5)nnU!=@C>QoGy@2Wtl_M3PiSz2d_P$x!w1vJU_OQA)J zUIW>KaIJ|q0hXw(4WViqa-^bfHIyD`xrwO8cLV?+Uux$zYC6cNkqIPN`VA0gI z$VrYf+v|@$_!Mh80^#8pxc`SJ+r(jVC)PVHc;wK79oE9gcpTn`76Vg(lzbHlSq|B; z7oxd%k86tV7N7a{xS-&bfSlAM{1pBoUQAX}#+&d4PzfWT9w%6t^~5;{$qVy zewYHaL0llUHw`aFB}_wA=|G}vh}<2QnTP8b6`G(o1q0<{^ErpgNzy>LH>^Bgx{O2h z3K$bA#Ycqak!uF)Y)ceX6j&f(?KTi+WpW7swYV)1RktPQ-s`PF>!)^n^i{onUv{NB zWg@+KScB-~IrG-D;!%{ts@Pm41DQ_y7eXok<&5GIyR6CmnW(UD!5G($R$MRpJ)J;o zzU%k#6JXfIPFohX$5I|eeN%XJ>JaDQ(i3UIBiPlTS%oyB@oh`dz2P3%RP_1=JsY^` z3>l_j}stx)8?}T79?yZ+m)O zwAZbd|J$Y6zcgwW1i>S(;*)SxP}MJoz0ynMl~dAXlU;PBn^q1cT47-4rJ*=gDIU6~ zsR)`BjPQzrdaa}dx^F^ktJ62SQ)775S{jkWC=ib2a?Qt1!yV&#;P8TsGH#479VxCH zEJ1vY?!pjkdr5v0Any{gM-syTSTrIQ&^RsCyA?pWv=q$1iUNgAb|{?!$Grxk9^gw|oDN=3kErB!oGvv$SBi{Vs%*(ArxdNU}Jy zR2#Mda;PyCu8^4X{eXe-@BLNucuWm z5%c@}a*ufW-D&vt_{ZYz_FE6HVi#ltv13~tcrtI5^azYL@UV;4r;U4Q|FTE_cg~Pi z{SBX*r$6D}UW9{Qo6v&=0(GF3(OibCGT14afrq2GovC`f1n-broH)nW<1B#INa_k&XM1#%{==0YSF%v9L)@R z&Xddb+jxv9g|sM*t`EgD5se732Xs2A>W1qgXd#8W-Qz@l3C~*|8bjFFA@(^cl+q>*J$9BL8sj*hKesGiz3-?DhX?Ps zy-9?d7!kB7G&^U=&Z)n>@%eSUzP43kcL)(6AtywE=nbDndWo6uVWA2{7f}r_Be~LB zZa0_18K!6|;f<+PhcrK%$336q&sGR*A;D{A$F2(wrD1`*xe$Brz zSFQI;-}NMRqUPo?jc=P-I1GDf>ky|J2p8qX{&p3#N@PRyK9IyIeJP9w6S~e{)hd z`xKmP#HYW(Tu$;{>Q``-t?by0HSlu#bDoH&t=BoXV0ICqf9Si%zKcDbXWOo_s=>W|nM6w{!UkM)DG!*bSU7-*F+OvkP-Z znmKQhhs!RZ!&icFst|jG6{Rh(0dGn%mx-MQNmAHLdhQOdJ4@3xVveN+*OG;T0jz-p zsZ|C60$$PYE;Lv`Cu0f^tU6x^c5|hoYGIPXS-^ZNeRe12fAjDj)Q-ha9iL>(HqPQ~ z0t7|Ca8$8%n0B2%8sV5FUz$CeY=eWU=)C0&o2X?G2-KG=OQ{Gg0b-o_+fK49+JqQ7 zv;BFq*;X?>=(K~-S?UpJ|!TaH+m7W;&#|^}5$Z~J8;O)S9AgZAh zuIxV#$JtPQ-IxUroy|+z&Zl+k@Wu64Aa-YGcE2~37rTyf5L(2hhtI>g-!!WoA3uMo zd?6OG78VV7awY6u{CMX$bunlkkIbSKKNFVyf^Y3Rn;H|M^Jrv60U@!z-F{bZzI<%d zW%9H2o?n=$+)a%6dSQwsVkw4y76nFMhv(x?+Cpsq8`+ZYn?_(%cnRBK==%qk81%6C ziXO}zzKw!NScGWxOnD)vN{uZ1K~9XF#{FL1QHtaQgcyTBH~|4ctU^R`fYca4I*^Xp zdAuAdb+IhNirUr$vAhI zWSp3sMSK8eJrfdmNt8@bEei8AGYDt-l7yU)altuez)(+Zxn^bVjU`QQz!=TLVjwTH zxW?U(1Kg)s(ltE>M3Z(avAe?VDtBc>4~Mp`l(C_(iA{hUrdt;y0kk^yjAU?SvJn+q zcP51A5^4dG`!beoZ@yq3X+ufVg&bT3DXg&LL)?QL{_r^y#B74^C7bQnx7~7SYZ(|L z147!&7FjCw1PD>j69TA|p0h_~R!+r>s*)}yk-DUM$d{vz$QO16Nj?SfOs%MzUW!@a zP#{6&)H4Nu)`hmA6n@VuYvTyVF@`y@eYE3I1$ACVvSjcl|88<6?zmiMpqRiunjyA#K9_O>?N3pwi z`?k#pVhm3@bZ}cIz}4%XY!DC#^y8DaTrPDoT|fTew*H8#6@LG&@5~TZ(2gb;y3w3V zGPKbL8MP9ty7pG7q=SAdB%izSW

x{o9f|7gEmo2*wv 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 z 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≶M9Zv|5`G?V+t`dH%WEMXqpk;_3Hk#c)5bow}^>GHdOg=@5pYx=49b13Ly zrJynzDRebu8rnRSaDCBo@|9g53n?-Toj%;)7@=UY|Noy}Ma{<^CTZW`I9PGat{6t2 zaDw4J3oUfqrNwG{*q4kXjQO#)d%E?I`6unq0@g?R`EPa45Y|xpiRX?D^@^QqfPjrp z`1!tA9;wNGs_VH%HtUBo8*1_;v~g)avtfdTTKYQ+w|_T@R1|@!z4MWbhw@XQ#{r8n zFBZwGL~*S&Epds65DN=S9LDmC%OD``N?Ja3mq@-KYHmwkg<5GJXlu`C1U~hF;}GUt zEV_svDDRB0pxY;h0iVB6!+t9MoPjoUN2{tnNvmp71!_;3|F6OefCDX3EgVYSHa&Y~ zU}M_~aPglu-?Am;VW9ar%IVbGkq@`{Tq5wAt!;iU^4x0?c1udN{X&%ux4V&|KJ4W8 z^-G%6%-Mk6r|NGgPt?6Gz6|&!zRxhaV4(F`GZ8rK4j__!PX?Q7^;*CQ1mh5%DvR6C z?e!IxGMT8~xw^^9NiPO6=pQ@SRODn~Fsq8jD|VmScW#=CFmzog>dWa9ISWyD>bX6* zxnZ#2TwN0;af`pj^X|5h-UR+^#wtJ!B@tKiK!pf5VjK5!fZLt zzX!?qwZ#;g@k9fI%Zc#zkaZg@VAO57d!5O3Ue&0UhOx8iALeb!OI zRvYFgz{G^aMMxIXA9Q8%Ks(ns{Ng8LwsDMRXV9_!HbeTZg#-D*^A&&kWc>8s7s|rI z=ynSoO>Z_is~m>%blt}gX#It_>e2=$ntV|mjceXzzfgYM^uWLH4|qn@T1Vx$y+(mB zr_oTl_0pJ8ZR}4L)pN;gX0*r7gHMr7oprWF%6?*dA?da-61JtJNHWwP^#36TIN#Kl zHX65H`VqI9GB?_ee-?H!Yb?FpyYadu!+UaImNKBnpF_sZf6ay)B7}^R1hodXNP?eK z4UhCNG=>^Ra(w)t-DekO(;#W^pCZ0-I00f84I3?O?7O zB%x)J$UIIl{lRxlFHDbkes}4Xh27aeZ@lufb-e26$_f|NxU&YtVUJG#2x>BxrM_VU z1LCx!(BL?8gDF{Vq$J)xNc>yL)$=)7I*g|%)(&0-;j8CsUSvGa_^S6DVMpH zb8v0T>G{!ohHICj*>1fftNM+zZtws0KCZLv(IK>C_QT1EH@fD(8$2iPv~!>Y4cV!P zSZxtr!>L43HPE+4<>ftO;-5eywKK$aj&E__@NZF$Ub2O545&GURXRcHZf+@4Q*sxY zWp376swn?@b?YH5czxG41HZOjt)n5ymnfWVn}~l0v!W9f09Qb$zl@4>j!2BD$PIWy zG%tHq1co&qIS~ddbB3;u@9Dn~xdsYnr5s8^`W*i3m@VDEnOB&F?o#)Rs5v1eUah$w>#9 z(>0sd(bH1S1!0KMO_Fm9-(30B*tAvEi!I8bj@kN6Z10~`=5`eh*Oh@TSgc~GARo=W z<9@k$y19A1xpq3jbDRG4LD38!4XW&4?>FThiiaoIiVSTRo?|YzPPb-muv!>myEIOW zt#-bt4&U((ZdDWewL`sy(~|m2`BN@QF+Q{|G9ZCrd6ta$KC*E*TQ_G)_3NXw*H*CY zbEL^@$wN>XGaLNe4bu&0*GJMUg5zS=CN)LQyqHShcMq=mcw_4h9+%ozHC=V~`$%?N z`DWW#&TppMgR}4%!g!nK9J8-_y1Mk=F&oUrC@E68`W@5@I(HpHbiw(p1ld9~Keub^ z`qq-^lE(GMES@?`16xSt_yAA?b$A0;omip zd;&xiYAZP+=TTDO@|)ZHN*1!_{_wQ@i@zy5-UG{`HCbB7dqN5AgmRL@R~5 z-KAmZe7J3gow^U;9@e_R+QBj&j{H=={FCM3!&hwmwI9#NDh>OjBmRdo%0A!wRKaXY zbuUwpVCIg-{dzkrjjQ8pNL>HpYAi|XN#kSQd4ykQvE)e`+)FFE<}jMLyY|V|AnYCx zC+xXrSnN5`U5RSpm2-UeeXHm-H>h}SKrB6FW-egyq$71QyHCe-$COfBK3#rRZEW#G zF)vL$H8*V?-iF|5Y9#BVeO=G32P;?ztcA|&_azD#1Kjlo=2HHOV$EqYO?6Jy&P_Zjir zSdU~Vo!0G#WNhdh*fC9kX!bmpEigT3bCmsT^V+Og{llt8`p6Fh+R_24Vk8CUe^Wjh7e|u`=lR zCR5v7KdxbaP+|1~gU5n3ZBhfJ43hx3ubK?1htyj%2W@aOypyz5c}TfBm`#{%2?&l1 zZZmYR##n&F%-Qfx&sY;4a$xlRz#dZN+7h5ijee`#r1GmqH4-ylG$FAT_I;^i1HQ~2 zJG;n>lwSl@tAq%N=HRD}vJUEBW6Iqp&!ox26MMF1RE<$|1g>ZF_515YMLmDRzD*nN z^mG!YT)lBFM(;6*iW;P+uLea~R6%W zla;~AQz^3wrCk}9YR#oOvEY(#dm7uNdN(2T(O<;NYTQeo>VEBFU=lPQknB(Lf)A85 zj;zF-jU#8q%^)|r7$FVpjF|~4a_ap{o%zuB1wymd&9i%nd>ZTlZZkpUvFK;uOEifT zzuP{nXj0I)Z{e)f;F_(RtMhn1Qk@oONX^N0X-j$rYFiUaYRta zhs7&gd}`D`d3sP^M>uhaDRg@}EK~y{1`HC3a%H%v_W0Ux9aBW>c>X%ai@s1A3tk#H zf~(H=G5PWSa4)F>bw7UVjfuuF}szWvDi%FGNcf``VoAsr{>^YC= zxDx5wKj+;I5(2jpzB#BMK_GFD2#y^T5h{7Y-($R)ZI;v7w&rSu>o9~L!GWrT^))5l zlG?|bHe39tvt_N<5pA~S`m*Djmbp`XHmUkNW;vzctXK7f9J@?!Pc>VG)3N=s?Q=Mf z`c~_7?$^YrK7PLl`Ez!WhZQoR-FGaj@1u$u+TB@_R!QVIF0ilwc7WqhsU`Q1gY8ugrk?Ec!ur_1 zC~)NA{gs$vPweo2I@9@V*yDrpSTy4aZ2_{b%&~PfU-6^Hf=->RR7b!L!21o=yJhRV zzZ05#JH}&i&O&r5ie8D_&ixzz`J#P?p{}1 zv=uW_4ySGUXe6rE=P~UX*oO-+>YRizT!B$s>7{{d;nRd1xNu%PWZBliJm&x@VN)aC z*85lCh(&Tq+9_Oh4!*7PHHMd+oL_j6g2rJY5?7K6N={KKaV`C{WLPdq4B@eZY$?I>gMjY{35q9M-=AE$Vg^3hRH zUMeKud~}B1xQjqX*!LjV5BR(PVD&&w{s=pFTmk4>$2S28!Zfj&Dk>nx?@_5yj8gKVe(t*m`yQbo(4Lo+}Y;YoXO9=FMKS z0nDydZfjENPaM}L&X*Of!F2^TOg6KpZKe7m1^q7TV2Mmr~2jDhK zfd*xVG?pwB{&ILLF$yoVCiXbdh(1i1LKGIXE1P`dK_34tYLx_2@~Jz74ckbx^Of2i z+!A&)fSd(JNpgwA^Nsw>eM{|b)+(np-eo>Xg|ZbobaYAve`x~W5c)mrYYugE0HI%*m9=blCCU~)E^6utf- zQ~WN?lTJSACGf&MgqvaGA_*QhVHajuOnc$2(P$TvAVrTl;| zA&XK#2u10n^D}DhWGyLOi)(QQ0)iN=TrDSrs09SCdBX!xfEWS*LswM!Il(A5%E1zL zsTcs|@OGDQAAevRlUCAX_BEokjiR+pC0gWBP}X>tS(D|uJcVsO>@H})%-?6{2K%x9 zG}xcSD#Xh6&Km1+VTMRpxu~3|wDKPk59**S`PPVqaG@R$~r{NHkq1k z$1bA&KAK(b^vs9K{nj#kzp)0>gmqM@#H8AWYXaZ$u|Dsp3;+6TH}-H@SrZtd zIwq(d-CG8LdM$!ax{kT=m}xX3jY@1xrJac_Hxe`B>6|ZauWE5ncHT`s$zihPCYh`b zU`;lMWV>zbbf%FYAJDyBn1)W+U&IgJF4K34-*Juo(U|k5P}L{GfAOo&rv_YyYEDxv zRCo7AKKB>Q41)P}EN_*Opn6+qTPJvQ)oQ%SHNL{(H~ACk@w*rN!;k$*-THe|w?Xu{ z4f{5-Ip%hosBr3WCN`(%qPCwCvnCtoM|RGgzICnjvU$tE2{?>!1jkXED03>_GH`<3 z2%XItMM4X0bev%Hf@{2aKdZLFu}`Lbk@%hCPt<!8g2Y z%uUv_gM5^f-psHm_O!Qo_Facm{{naabgx)qV{7`ChODfRNJ@@<`zk42Fyt6p9ml_m z@q(C&0|xE`K%A$5!fX6|U{BCvD#5awUGvKHk|Kg!zIVNA$miHZzhK=KpG$krCLWEg z(Ryu!A|^R{y)Td65aydVh3?$Ed3_jIYdU9H!TH^^BT!;~=O;hDM5L#PV%Ry zM7!<+V*UmU+PfM_$aH}KuS)ywniTN7);P;w?AiNhdXUN@r0qi`dq)_oib|RRx@we> zY9IWbsL^|!xaELpywU;VnZC%=#|2ov1BlU7Pvy}JV#~~5ljKiw32Lm!u1R`5D3PwbbtY>YCj`YbI6+c0!*aYB)?e}JNA~3tc7rV-Fc)@Tj z?qio}(T1c0MVB6Z286C@M9#td4;n;4i{`*X)Uz^G+?Y=VJpQNh#QBGD^%3bC05|T*-z6;5$ zDyG9~y}YTbPi@KK6}8N$#XbUVt-yCRnN>B#%ZGQ>sco^>e@j%A&NKt|UW5)>Jw7xn zsyR#*xSZ>O`EiUN1qLi!0CWHIiBxPv5)~SB*ou9T5{DvvFnjoqmSn|z&*>7+*?PY7 zir@G}O8Pg}b-#z*pWw2)S}F9PkI2h8$e#_<(a!V3FvRQ4mKrFNq5CEJLey&7rtX>t z>WTWzh}y0Jt`V*wE)vlB#ykD^UbQ?W9UC3pxsh;xJ&2KTuj%OG>49vB;Y0s}QEg9C z<6(CA;jmCi%nzWzK#ev%XRffogMk<2VM{XJAMG;ZpvzISQ%Tsxpje1%5r!f77SEka z!f`)AvVu+acG<)Ztj)pwSz&z1oxors<~^ih!*?jqpu;wge=F>-B;@?(an8-117F*^ zTCpveGSi&qdt4QAX9ef+8^1`&aHb~SmWKT;Q#ZBrFZ)H5XQO)uR%wEy^iHf1P3xDY zZZ#Ox6SeETYv2!z=$t09zR=KFDU4L>iV(}nz9QtA&uX<|yAaiyX_`sQeOH8MGtQ89_P*V4iI40COTuNhUmWV=>hV*e!lSLGwvFDC=foz0f4hDdNmpynIX}0l-H@xH9`{LH>+lHL|y7OOC zSQf$QKYPi)YlwV(OW9hMe)(j$^y8g`eouPZQOe5wsC}G@x>bRCqJBL@ZPy^=8sQq^ zBKcK1E6lv^W!RrgAO?5-vbza?1Z^Ho*eDW~Jf7sxXqPDnJ3H9=$43l_T}V`NkVsiO zoQ>{sddijcRQ8W$?|4iZS)|H7jw*W4yX2h_BFYH1pNK-9q7svY9IEBLmE$N+s&^^s zrA~&NM7cy>la&h1{b#f39bdVECfNn91!?~}*Pud!4%;o`=PqzoGH0UoZxw~wPWxP) z*$Te%;5UAel8#Mvmu@2pe@l&9Rw~EH?!QK-kea~WzU<#>O8LT8%a!e<@M===n$no0 zzo~8V{yTwbqU|+Zb&RN6y{IQ@FP3ZIyGFRk(9LvK@$M3RDOgUy)a+%bW*j*&0mWps zxxcQ&39*;8khm3Tge3Idmiqpdg_a{#U2#tGYgP><=6ZuG?JY}3+z#w}L~MAP7cC`C zcNd~+s7RFXHnVu!W~<$On+qV0l*))-pS`9Hrbgt|P)u@cmq!N%2@kDp2GWFm3sh*( zVJr6KwlnTav2Dej4)J0&sh%CBigUDniJ875cI2%hmLA`VfwBow>@G|ao`jXqLXz4k zZ79Ph@sunXk>fG(Tp~@ZPXwvhXeyd<)RevLN)n1f>hBb0Eel3b$h6Lnf>dlcgJztw zWvA=cXYZwxdRd;JT^{y4QLh`Zg(};pE z7NY7(<1~ItGT*X$m**$|D0Tmzc)~MY@|w52kMss`13~g*!#o0Tz-bvU;|5s<_Sotx7DszbhT=&xZUo6fLqXJ+cg2e=u zsf8faBgtpBV)riR8k&TiAVVGmS6fmT#~Ix6NE^L)ln;q@oY;Xq%q5%7BE_10NRS~% zjTSwIP1Y6Kk~vIsiUWZ3obi3<1i$hNlni5P;w`4Gx5>!4l|vIG2hU}#j*9pJcSo0o zEaQK0+*A|eJVTkNk_l4b_3}8zL`6`X>QuxWvM)=Ra1l@TZkRF?q^%b%4ta0PbLyQk zSz%qioIF5blOMe213%(9Pni8+K42K_jQ&7|0X=dgfn^1v@V-J2#(8>J=Jo8-1BTj%<)yMte7GpKFa=0|2XQT1eDNQf@-I2n zsrzUPFW$6Ti|FycB=q^0j4lMfFZHekeFi1>k3`uJ}#L> z>3qMs1W-=FyNXTf9aKo(Pj*%!NZJPHOTAqVdk4lk$8|qpHBBPZ2ExOV?WYl|WgiDQ zN-=J_n8A{Y>(c>88xMZ5T&NMiKbNH2CphS(G z1CP%wKI}`_cP%k-t~Z;gn1&ckMpM*9J=8{nO&ZN_#?{%ASirlzq|y7V&+IRa1r*Zl zao!LXt{CU$)unS@;MM*}kCE*g=!Wb_mE0f4?5qCQj~>u~VUL|&+Vvf1c*gTcs%Zsp zujENg-=xf*1?CqwE5zb{88r=?FT6_g<^f+xJ^tyT-3tN*K4ks1cN*E{od@<0t$^8~ zJVW+S&-DNXqOrciLjDexphf9=c)pS}PD#V^|1_>#S~Bk>^l9BWU8xugc(<3uv~g;4 zsfj+Cs_!uIcM#W>pme?1JhYgkZyl98$V&CQNIJjX=cLD})JRlJB7@pbJ$o-mkfBD4 zo_cTXP`iAy5=l8EsVMO1+i9wYHfL zB*;L=RT0Q`_()%zVhdQGz-D`)YUACE&6x!#g{q${JNyE76Vx?3aRHl4-Ola0hz zmH?_e;}NCLH$Hgq#*@z(^tKJ}T&>Hp)qlt^t9L&KNu^sB8zOn!wehcE2(vJTWthUs zj6P!oJv`gJm~VYV8S{+~-gwTC-_&DX9K69KxoQ}D9j-sbMkNM=2ujyVMC!ye;$>(n zI)AF~lWXpu$tda2=;%(3=#Gu(&W%jBntBi;dLScV`k8pjw4d~#M)bfXK6nN&%I`C4 z1Cw#a*f0=iNX*TuF%EHr1s$p{OW^Yh)W2@D1eQN&X3haMOvV{w!$6=RF;O_cA&#)1 zLygM@o_&QZzj4OcFc4@+OcWM$toP6Qm69HfPIwECaD-bp!!umrCETB@HtC}8;FW3T z<50El3uv<&)BTh^0V)0u)l?!Q@H<5s*ZE{%Lp>@w^rM2M!KpY((R9a0%4z;5?UUM3U6k&IDehve?Z2PpD02I>nq2JkfT}6X@>_+FX$PQh%t85YKgtt=jE~*{`i(|J^b(6x_xWOrvA5hrHtc5QHZ<7x%QhwIXjjg z4I>c0y#`g8>@{UZ!ahR6UQWXLK%!DFQPC&dR=a|3G&Vuql+lYeU=hoFAZH~7tq*ft zsY(L5)Ajx|go5O)*Ns60?|c=blV3*tY~Zn$Jc#9YVx#`g4F(_p%+lhwobZuYz(xAX zpQggN0K9wAXdlD>Y|UkcVcrc-K~sAISqNs)0|fsZf|w+xt;}{;at_wMNd)|2Lpk z`eQP0WcZ&D`1OCW%vU~}KV`|#{h5({DJU!8)cvWUAJe98RzLOEANtWieaHP5KAjVOb|c;b7(a|Z z0iYN#zs&^V@U@^G(@nb90QRqWi%;Zp4L4y12J4o~uoGDenEx)gO+Y`b(bB`&ou?Bt zwjHJk=Bz56_h=wkHltRbRV&vEGe?-BZOQze+FXXx&aSLOL&Rl$_~_cpK6%>vv}da9 z^|584MN|OdyeVh(^o&XY=F|NIcJ6L!JGcJ);VA8g&~s;%J4x~gVRBdTwSVZ{lDmVC z$C2y&zArnHAFxe_$a}cRkb3S7nrfCS{x^87sRio~hVB6;&yD&v1Br8oh7HC}ZWD{g zS`GhT3;AfNvr*S7-UME0dN>y+H!Wet2d7y-q}~{AW{%d>nU?1E zuRogDJ9U=jGj`ief+Nq~_8&a-iMC!LY0veF7s6;%yYDpVbgzJLB(&P|#hd-&y+f0Qw@Op;e5V@~$ozDK*B-J@d&u>QCAUAq zgc9~gaeqW_Y)AKoA(te&`P^)n&NLe8M^i0jkr^#g7bah9&kH9$VGj#RrXXfwF4VJ2 z8II0P_kvb+b>h4hwvC!*|%we}5N0OG-`9r$^n6#Xn7wBh$?)qeQ>7`xXH^4%EDtel z&xvq0h-k6O(L9B%dPSMs6IUDG6PfEnqJAQ~ZS+$gZXxbuz60#pFg0?tK1{N!GJly{ zf!(~0kf6taL6#3wU{1?{FQ<+y^c13BOsSetg!MX^F^Q))OL^q#-8FcH!+CGYT=sP2 z#bMx>0CRg!3q7hiWsp04d}!wyd(ZY|&|>=tqq*aUcjeY35g2EQ9aJb>d9B2#j{Pf}_*T^vFWWOuT=s;frYkUHkLE@1mwn@s(6NqO?x(Q4Hf^vZ*5+%J zqJC=CRehRTR`Nw>ttCynClH%LTaut1-|2|Nv5H5!wULLY85#RU;A?zKU@^3GjN5s= zOF%7U3+##$$~)J;kvXL*NT_BN#?JI5xQp#hXlZ(WZ288%WuMy7xsxq>6dBv2f9?;H zUGZ#DRrINObkEPv3_Uo?r~95>L}s)29yOvKA#)`4h? zyDmqER|V*Zhj<9~-NlYe)o$VDa_mtd?s_mezkI&;q62}f>@WS@lHFh(!Z%pe6Lu z1Oz|Cmwqh_M$KRZJ|_@BEvYMgL4j+Ow|d$aDJtWLioZ88iwfc?_*)-jyn+en^hiGX zK_<%wfKqZXsWYU{AWZP6Ot6Iu(CLvj%p$G=i03Xo6f|tv>7|eQyfrU$3id2S%SQr& zXhFX0`WV5O5b|s5M@oTx(e1&{MyOcOD(ip@=fTwy)A=YQcAnsMEPZ9!T~rp`9-Pp- zy~Qfa&m^K}UjR1ji9tiYOilu3q3>CebW|7A=A(h_-B$3N5+w1DWQn-&RAy#Ke1dCI zGB6!t2iyQ*;M5_iIWudCf_cA@(nU?QJN~Mig=e^>^&hg#rHAac2{ku|FTd6aW@uMd zXM62yMk6axU8?5qU9=;ZPb>IxYQin;^n03HW3U@{q6shXCFhwo8k)meBjY!b?}b?H z_fCG>c=GN;=6J4H(TJ2w(tEzLxIG}jtJcuL@7cjb;=fnIe-F$4D~>R4IBV(nIRaDg zBkyjQW2%?hD<_@U!oJx@fw@1AeslscE zcTl`rQ$`jT20iDrEmXP1od^*qR=xRj6bP(Xm!{_`mmJy8naOEdkXiwR9xhA2CxU)O za`b&&mMPS6G*6E>tHA8VhEfIy(b5WTBvLveImBE{B(cpNjnJ68y1q!>!d1T{&I7Ng zC`@G5Qof{TN7{qlq5%%HgkG9};HSzrY6RoeQXy)PS^4!-g{k!-STjs-jmJ__3-{Qe z>gcZG+&yNc3UNy;IsqK$HH5`-6?icLs%0JO>HX1;1Q!kP2KwBKBaC7h3COCVE|R!t0A7VqBN+B9&tH?CwUlyFAaW1Npit$I zBma$cF@h-#OkY@SURtjfld0CT5j2=i==CVCA>Ecp>vJq5;whAiQcpGB6Yq6bn`%ZX zwheD@UZ(-GLrgUtMD<`~8TW%xV_0ka3fuybCE>kso98)2Bqwg1AB-9!5!OhFWpLNg zuk_R4BKo?Zn) ze`V`U)j}itmo$4vpUKqFI|m0v8J_J=hO>|>>w)-`6k+@!N;i^T1@r<@zYq7R_nAIg zv|3VdF7|Y)!nmqVfG8YhFX{yFs&UH!V(d`tD~IwFoRvVtm{+D>4RIptrr{Kx*L+k3 z=JR}{_NDjH2M0G#mcSloM1IU9+tA|94nnp_<*hy z^J_b<4#+p-!1xc_Eiu-rMA_D$dcd=)jfhI*C@|JsK@>)zk`4{>=oP0GiQ9m=Cn{18)`)l3`q*@+17i?W_( zzMkWZ=iYp_DWT-B&>Wh+n&+eVxdM+e6dvc0^XSg{`Cul)ZVSI{c|(gYS??DsN5OkF zsLkbe@0kGwrQAF$SL6JE)|xa6A!{?`Bgk**k)aOCvP8e@WVU z^hMSwF6F30nQlp_m15i}zvPJJl7>Km@v4=Q<13X(@hNBuZ73WRTM0s@k0K6fdbug8 z#GvGaeE*TQ{oX2ItQoFiE4t!xH@#p3y2Et4=uXh>Wf6q#I3@=DvZFH0O?95hrY0c3 z8`WV?9~d226mv!}r5U5pAzhfj3!U0fn6wg^UaCrJNFxySK`NE*@k~BIxG7^?Ec#Ca zqOw>uh#TOcP#d>c(c-jO z_?`g1YTO#ZpiFemntZ}n3zpWsP?v2vy*m+CFxUI{2S3$a;?r>gOnEM!UH@Ef@1(O= z-3ey$fgT5Ix`4UfZ^JC&Dww)Cb_R&oXM}itmZT>yl3|kc8bE?F;eduW5=;kX*RF_N zi`fj5;^kB%g0fe|l65*W-kC{WayChoX&zPUNGHancgQe_m*X{f&0Lul91goOD#1!c zuv8K+ry}vGGVSfjgJQkKTU^4vjmNtK%;&zumfq2LvYWL2g76w_&$UZ;#h}nn#)O?I*QZ%22s)VH5n?i4!vTi43Rla*F4;Bd_F&;ikI%A`h}n zE1eKaJINr!%c(%L0wck6#@MwgVwWNE~HF`MO z3N@^|VoWFntEF>#*aHMqvHi6);kBU0g>d@US~0*L*g6<2W0CT3*}2I74!Akq z_gfu?s2m8c96VMpq&U2Fk5Z>*IY$nF2oAV60a)*Ff&k3k*Msiz=+&&|(l6xzw(Sr{ zcK(taV5c7%2Ay5SH2c!|)KgRKM_H+eV#SmoxcQ1oXrlLc_WI%eR1rx7ghq=qxrZn4 z!p6;wQ}#Sj^cfgOWW>b)JDs1P)g}<%V(EeRywq zM$6y24|j810Q3jk3*(^jM=w;5%9Z}VAOLFK{iQ}->(KkC|AG2z0>G*7uB`p}d(WpY zPrZyz&fNup4`VZ${r!C(gY*Oc`OyElTk4-uHk-TTo!F){Z=(GMxZ#oO7xB6lx)SKx zh?bfN!4A;7(R&+>et=|7_Xsa^l%}UzRumcXzNfZII%-x2C7baQqK_cLjCl&q9U_|9 zV3uB6BBc%+kzox+AkKT5es<(RU8h60hKlN9x{49g4fUxO3b8iY5`Z!Z?$Hpp4sl(| zw-Vr~F+)(GK!JquL>~6YpwHCTb>h_&Tf2fL;M1i_GY!cvZLBrVXl*qt^|g-xTH;lX zJnyDhP&b+JW>FltmYnjuQI+RtIyq;CD`Ioul*xTI5Y9`)j;84ZqUJPnN}7 zfgg?^^ivs59NQow%tmH?m$ZnW74%EzC~gQ+{M4z?=_Wg+TYTeq;b7!wv5t0dJt~JT z(z$bvKtYAg;!rt4Xs2;J@*&v_Xo?+^I>ZcBEjQ&t#1s`8!zBz)+3;e5O1Vy1Te=pI z%7)Zy=)eZx1RRH>&<}5tJqVwL=fP7Azr=%|fmhk$c4hHxfv!{~UwP^qF-sx~O%%Dv zu{Eq4C$rAF(^h-;eTgv`Cvsu;9o_ww;Z3>9J#mATCX=$gxlWi)R5G zlez8mX}uR!r_fdMe>6AzUgcZ_`n5Yj?0$m2?^oJOjhCW4H%IrRthVTFhiNO0pX$5q z(mwjUEVaDXyC`2JV~*f`Wdcs5NG2+JN^8IjHn47UX+z|$BX22fBp`&jf#V+F$?UT- z5khPX`L3i@5cMPL4_1!RSnxF=+$pekCX!(Fh6|xPXX~U?ZM#sw|3zn7MuJuaW@Z*- zmd5bu6v;~)iXvlrT6qod2(3@13eG}73RcM`dM=Z?EB}VuvK)*X*4MhLkj-*bW=C5j z1ZC+|$egp3S?;XiYuQ>p7)dwp%XWyj@E92yEs)zlnTKFErMh9(`iQ^_ zIO?KB5D>>}KqXY+($VO(TTlB+#eK0h<;{x?g%gG`zJUs@gOV71Ru(POv@rc0@ zQVDux;^^FDOv5=5RvlS!lsiN8{ej_m!un079nvY=j?HKP-+gkC^YhL3T<2lAi{+G+ z%v+wat%~bQ7N56({eYx#{IwToj?^__IKFhgi!Oo6tmO?oL+{y*a$D59S(b914XQ3v zXoLC$^CA-7qi3OtCU{hMKRS}f@FuU2Icycqb5~GkGrAW%dYxDv+f8G5mXtU|^@c(A za`sEH9u#I%Y*Gl-5>91MAp7!YtQFu2HoZ}Qb80Y36vt})3+8b)`8%+OW2N^P<;FOq z`sx)OgL?h$ik1wFNg(8u3;>Sr4cymYCGb_03bWX>ao;fK7XLBIJ@--3RhG}1-bW~F z-MS+=PI7uCsc<8b46CPfCCsd!nwz)s^NC$9Yb45kJ0aoiwgG+DIeRzxBAfyA>+V>NK1cY2k9bx~NHJ zG&d9K{39L-t=6En0%{rX;MH8T0zwpoB`!X-n1B*>)Vf-K(CiJ&LwQpQ+j@5A@#i~P z9>c~Z{>brsH?&R)Hx}CHsFhmeAzHQ9%gMW<+}grjrIez` z^`k}e0?OaMe3;JJPS0-1GaIynrytX1LTlOtVqi4Fcvv;65X5|pZPw#}YF@!v8uT-D z6jAu=_lH>+gZ(I&$H=Jh9_P9-@~J7M27La@3~@a{+$L$K5ya6V>pA&$eP<%MFIU^% z$QZc~^F@eG0N)ixT1%cVVek}h9BLt^!geU)f6j-awXOPp!Ug9Ea98of>BCP?3GXf(@6%Yg_OQ3%74cBdDCO1)vVgt$~< zOG_r0NGOx3!^oCE2SV*dEs0W& zRJB%-{zjbd^x0!lo+5KM11dvVOEC1z?g=LdM@PdZglc^FMpJNN zbWUng`zb*JgJ*UQI+tP!$(8f^#|VwmvU9rDo^E>QDv1g-3ri=7Vehg@9U`8qOq%&? z8>q36MX5%HNH`y6#8~MP-ktGs=bY9**?OGbD!i=Qp0i4Qj-vK2~7!w zajp z?eNM((?MJXh#Q9yp0BZWVn|Gst7y+EBGwfbMtzN9XzE$W%wBIm8bN)nBOMSKJ#_Yv zH4(#Y)tV`~wXj7{d9h{T*D!m9%sYP)EPV?n<%nHSnjUb_Yd*mXZomv0ppGc3a6yD$edWlJ&OM%r_KI~)F2Tul;rQm@+V$x48v*ZJ4bSA1 zv+PsSmmx|Q^G0&N)chseM|Y}o>djafIzhVXnRpxYBu>+&S&A<*&Uj`KYXU+f$Cy99 zf`Fq1ZXey(BXqx!QA%l`ck&x+r!t*nHLqPo5Ny=jS0;Z%S7@T)s3fPdE|G@B4{L9+ zAE~}y!pjR=enI2m0F^8#?9{h@>dl>eIlzW6S~_^|Uhdy9u7`aNYz9oPKek??60oZ0 z9Ozv(-Z8=Ui@FOU&J=lNA`18md+O7HReQt5qU37a=_h)(amR_m7#|yslJJbKIqYsR zAthQmp&YlQ<9Z4!33xM~*qSgsF_@=fDb`c5EX_vdnmynu>&Tf;Tk7?@^npytgrU(zdAjq zvL6H?86r-5=&>O|Xi2c+l4ed?Ur!f<(8kMvjS1J*I~hM#zrYQMbxwC zIPD#6cy!Wax(Lj7V9V7lpX)xy#lS9Nea`^S0Kjx0MwXdYa5_ouuL5_vHfFvA;74cb zp}bAm3ks@@?3-*5J<1vCu;&}?rmq!(9-COB3g#y*0%hL{5yxd1R)6TBq4dncSyOXtVt%I`{$vvWx(d{Z}@MzZz*U!N(RA(XBoyY6Y`7M(q|K>>_ z;OhZKE(^Z(jL%z77k(~C#fja6cR-|N)~!Xe;a=tGN@jtRCzy-eS_n%yr(&fsYN;f$ zR?MyZYzc-~qkcs9#FgO^3CP;NqoB~1#e6mT-K`9l@%>Ma3w6Yu^Ctz z%0T8Tklh8cTR?CJ2ZmJL6Tl43gb_(ON`>>tsTfAI;@wU#WP_OtCDE`F2juMI!y=7R zKwRTwF>@lw+V>KEiCfGP>Aevj&Wu1_cgXb}7Md!0XE3~pj1nPlA|!m?L`ZnOiI5ob zrGJz;1UmXJ0t!^)e|)5JQBLwOa+*EmLXNItzd~y~LT3V6Y ziN3H@UnQ`K+#A+`OlJ>ea*zP}aUj#cTx;URu8GWLGxa~tRD*Rzf;uqsA z={QE(mZ;F0Y>S>guL!k)m5xy2_QZeh+mN_5{4Zr(_(ucQ!}ioIg58R#Xd1$H1api+4kg}Z7IhJ>}I!ls1Q{txnOX97;U6<*`@?;MAP3(IyE7)(?KE_;W zRy4zxzkZCa@>#U4j>!nH*M0RZ!@|1d;(@EiS&}TTBgGq^G2Dvx3;}OP4^95K_Uwg) zA6!rUW+Q6ar^zahMG-Koo=gD+cAzdoE-L0Z-(v+rIBH$IeE)ILP%G=oGF?m&l)_FE zB)-Af4j+e@$|+6~S_&-mNnyWR%w`x87H*q^ zu_@hr!^(Iy8FJw<^_f~5Ol7KtXn~%%iahO;45edt-{KJzRFYojKy$U{_$cojrzn12 z96XE+3ug(EaY-8Ft0yzooI6<*;2=d?sb(wZyoPS=32DVuFOwFg{DexsU32z4L9s%F z1n1qacq>6F{wXH&sX21iOT-w(C+0wR+>{|9mzK2yA(>XFD(#_Xb2F@;9b$E>+=R1v z-GWLPlxq>SS3L6UWt5g5Q`K#xMD+a`qLLlC4J-q!tHPGZ*@CI5F2z#HA4;IClfS&K za-!Cv@&%a@5F@eie@8;d$dQ(Q>_x~`KsHN_G*d-Ml?3Yvy$AGWWLK)DQs~*Uq!QAY z=n3`I=(Ncu z*ZFZZGza}`Rwp&eeN4-=L(9*rOQgGwCRc}hq8V3hL=!Jt2i4i(7*eHduRSdyQc%EF zVp=d}2uM$4I=~jVM1N{oP6PX)t#q!^E+c0sd{j7FJkVrKP1O$DpkZ$pxj7i*ty;)! zx)67(7La9UP^4|T+)hdrT|;b*7KjHf&^v*!c}+l1L)nTWgy3n;V>G#e!^sdibDJUg z>?W6vK{GQrDxty%#m6e`Ra@o+$?G?olyQ~hc9bRHftP(2bO=Y-xz5PCXi%-D&13kq zg)5*9r|Q@&Eg-by-UBr536I7Av;la~JAjn;yaQzRSN;V+18YqbXJ-j7T3SANC%~fs zCEL(eg^k^%04aJ8ko|KjMnHQt0hvJedq8Hd`!yg_D@s85TU#W0G*;D{fb-< zLk=Z$L)pfe$j0eRLs-H(z_ke+VYQ;qt}&wV_r)%?cl`7(W<5*L<}>i!woxokk$k2+ z76dQkfp|v$e_udEA9OO7BIK}DQNg#Jq%7cXW!!*xG?v7uD`<#)=15q2wjAo{@DSM{l z_cX)7FrAR&;kt%cNre1OaS?D+VOdZ{>n}NAX%4w(ANHsFK)DxP^w5vRW$Z1|5uD;~ z;qvHtx7|!{sr;trUEN}ZpbOA3^qj*9o!}twZ?SMHsA+7mgWe%>YUJ!LJzXuv66|_A zr=lzAZRmBk3(X-nZ5S(5RsfCt_hj{Z$spL86>8EUawoW++q|y@0RICkU5qy_iT84>|&h5lKN- zQQGp1C3rcJmy9D5Aq4M6Ot+0FA4gyNBocWE((_1#IYe5hj$mTu7x2#q78%ElZG_`CreF#Vg~gm9-#( zCx?6rMJb}BJS+EeyK}+!@EVRdocA-j9t80Sh*J)6jv4BP3m7^IHWt>QeGY1f7D7HKHIyO3X79dvqzm|n(ttPYP7-liUm&Bx&#$`a7C@srw;yegS zELxe|J>SELo(Z`!|C+~%^xP?dyK|>~IR8L^-q^|>xG%ywWGF#naCicVOrg@~3?_@sS*4&= ziAY1PxVd}GXT3{~n1B2`|Eu@J-z!j|@M1IXjlFeT9y_ow{NV2HPI31_p=fb;FYZop zx8knFwYa-`ad#+CoKoEFd!X$(=e_s-@y!o*v)Lp&$w($Md3N*LcJvdE4MH+{y5Mri zp(Ol?rKqMwpO1c#CSTJWjE&OeUrEq1hQ#7iA^0(6OW{58@?o6oL`{t-m{-&~W4+vo z4|=V0OzPtF=`ZkKTsIXrx=EQCf0Kd2OCPz^8~Jg&rOJ7jipJ+eR|Ma&0A+u$RMqMWanp&ji>A z8wfQ801&MpL7fktQL(Hse41<#@>R(Vsj{TgAajI03gw-o$9ZNKS6S6z{lrqa&v>oL za=q2dpR<}Ht{@`Aq*IAHKmO%G zuLt~EKLdk%)AC^A-)(FjFTZvqmOMr2Pjmh5OEQdL18_NPXEwSmKA-BHR*VxB-18Iu zpJtQx;9pv>{r;GFxsvcXBqSscqZkOQ%ufrtEe=e%b2u*gHjJORRoaIMA`_PJN<5Q} z?M)2oj&U0<9Xfnt@Wq}!bv_TwO0kQ z!dyU#ld}X$fccU8qM+xpCev|#X{OI;;Fv4n9~ui$(r&+dOb$aFJVKBE%0tEuH*H&I zWhizhV_*wTPMP;jf#oy{o*SA%{z2*p_hXZ8a0d9(yqcKAuOZ8`cug0sj|9`^hZyA< zPEkt+bMJ&d<1ohBij&CCgw({6(laF-@P>^B)ClXuUNxo^RXdEJ_G*coJ@tTM#?jDQ zs4SL+%uXr4waH0*)}SCPv5B>Ih!Y*E-SXT~2@aJ4iP$M1_fI5zCVg6OG~T>h5NFv2 z0lsqOjcJOLBu@VE1;};!soR6(#^r@tQzTqtr70r5A54ou9OeawopsIO?8o3m$zFRa zi%%AN%@IS|OwKMC6wNu-tl921~Q14(o`Emv`LvMeaQdMm;@c+%9fe4~OU3G1(a+xyC{c-2>)(f&<#& zat4w5B3IsPpF6SA!g>0!b4(-hk25>SdNxi5sVwawQpb%m&2xCJbRCm=V&3zfL^B-9;^P z7@6rb|B>%x`F7&K%__eO)J_M}IZUwi9%Hi=9MIn$BfN!vJ;{Cd?$>SFiTf?SQyJhJ zjc&>0a$H*s7$VQF07aRKxBaCp5A$GXYe~_T^gzFc=sZ zYJ3H*JljDOohbPyetOm)!70a6j3=HN@3(%cGLP2*-^6ob@UX)2S?lW9ALr5&Yd5nc zz&punsL6v3Rq%yYow6#|-e2aLTl0`0p$;X?(v$2B?;VQ=O2W>5%=iJdK}g8ca%2Cv zkq78@Oim)SI)LtK-tQD!1#JqxPp8uv>VS46)>tQ(!+0qN1d zgEeNOFd&OKMfolZ9Y+%T6@4R`z|Mn&9m>=}U`D{pVZ%RcJ%+OBSSY1%cPgFZxB8Ai z+;fJE5GBHDQH>>MXZyp0QWDy8^-ppNCX5GA&)MN<)*G2TXrtbnM7n1%jERh5rdjAZ zUQD(jBJXJ7cVW;drIJsS4P`K}d1Em#=<&f8gzHTu?Xm)5wrbtn@I|9d3i9V7*ci#a zv+O_hmG!N8X}}H0u|ZWCf@7QNkoEYEkvB_z5>9Bm20#TA2_F#7NuGz zs}zR4xV4@FU;{GT-|J>YWnQ6V3-EbMfIetXOzR>=*>D|1OzYXEJ2l`t%o$kg? z5p2XWl3MiIRJH-1E(&J(sYYyK>3GaV=`T>esA2KneyaC;z6#Jvndgm4dA~IGoS-@H!9exx#+&ReUGdYv;VzpUA+KsZLdSoO zFW7&?f!lK7LEU3>m2Gm-fnZ{iHvsDE|j$nKNOR zce5E4FBKHef*6y&yTu&e=RS0}Q{4f-8ihS8IeIlZvDx)ve0-OiXS7sCri?e+_GMRo zofcn5#RuhwhZjp5HkS@^eoWM=ZGp>x$0gG+r_javI)r>ISpNH$I=R==I~9`D2rm<^ zeYs-uABfD9^*O3hPF0sUN>I^3rr?&t1=kl$;kdgkD`Zay0D{M(RNwLifW6UhZ7p-zUHJoR(AH=GK%~I^35(ZHr*E*ZnC;F893g6NNTkkk6jZ~W z2AI@Q>^`@y!Z?|*dD45-Vt#HL#FRj#iKze8ui!oS=~xUPYat}-ZORxm%OwCUOB}1= zJW$;a>X(Nuk&tQ(_$&ksq{5pIp~h;F-^XO)4Mm)qS3Vv6JoC$-wMBlx%FQ2Tp=aOT z-P+;9xLMQc`-$uh6RWj_6kt53JatPlT1q!NrQ*ISj5%6o zEle6gN)~DeI(uIr?4M{n!WzjBiyLR0a)o^Wy7Yz5$BFgeQD$DbX?3<@^-!(J97L9G z2@0_*t~RT@@5mYBi=5O2HPMFOd9($mcQ$KAm`Qok!1rBufbL?32HYz@jO4zafQJby z+~t9*Rt>eqzd3)-DjWbk!$0ZHAxPTgA)u{SSq%aJFp&dj@m}tfS^~nC1c^ejvN$h3 z*IMKT@fS!>WoO{wu%Lpg1(XP)7*OM*h%2GfCv$De>*;@l*dL*5B=lYZy_qi~@JAQm zz41viH*7CVzz9aMv{Pi&UYE<44m9WJmi#CyE8Ze0V6&GXm30@(>4sNBhx1ALMwgNm zgPA}`MBtp?fFq*)*TvL)`i4{KjkvErMHfj?rMt`&;~d9^s`&%Ws#M?r;lSsB7 zAe<+0YRHz%bppGRvEb*pL)d;+YbAPYd_DzxuM+|jq3zMn&9TX z^E=d<*g9Bw-Z_}2t7_uL6o);`3CMj*Sx$J3l+;fAfoGb;5wWe9qh05A9|#t=ToN`d zpWgg~;YeF!m#iX|?i*}wiX!uS#DzAl^{VnbOkd7JpMhpa12nbGWn_JHXklsRBXnE; z`EyLy$wCMSfOS5cBHT1M7$^X_57dY2bd#VE@Tq-Rk1)APm^9`Cc{dXP5^`rSO_sr9 zd&(S&>{ZNYGj>m>d?qw~jI8WkXTLYd;#)AYc)q|n$Fz*mqSdLP4S_FW z8(cm%K|alp@wXnwJ`~j-9cJyjV!rHvNK{Y#k5akaZTo&(n{x2(MN!p0&Yll-G^t1} zrm{#X0`=Qp^`!E+efumW&p$U8|EIR^6frc~Q0)QZanCLDtKP!Bec0!%Os~1z!8@7_ zrWz?ZUus1JoFgI!QVaW13E01^mZ*_|x=y9Opb`?j2PSrEavR46Z(HtwPqz{%3P9ky z3Ss@tC;wI1&;J7F_U(_0hB{2m7485k@JQkiR=eTjXR=}7VuxA|U1X9?dOC6Y)t>L! zIO(}Y=y+FteW$WZl=`D^!ect7lQ3Uux^I?|QiT3S+r}ECZ-$J0bD#Ud8k`b^w4SFrkP0_v)YX0x(yTWyay- zO>EI#V=)yZa7L8mZ#}U4r^Nr8@Udx1m}XaXnD(@8nbpmZ+me5FU3h+)_f#byMY