From 5159a0efbc137bc4f8cb903cd42edb5011690d5a Mon Sep 17 00:00:00 2001 From: Sanath Kumar Ramesh Date: Thu, 6 Jun 2019 13:57:24 -0700 Subject: [PATCH 01/11] AppVeyor to run unit tests & linters (#1207) --- appveyor.yml | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 appveyor.yml diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000000..18e6af57e5 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,48 @@ +version: 1.0.{build} +image: Visual Studio 2017 +build: off + +environment: + AWS_DEFAULT_REGION: us-east-1 + SAM_CLI_DEV: 1 + + matrix: + - PYTHON_HOME: "C:\\Python27-x64" + PYTHON_VERSION: '2.7' + PYTHON_ARCH: '32' + + - PYTHON_HOME: "C:\\Python36-x64" + PYTHON_VERSION: '3.6' + PYTHON_ARCH: '64' + + # Testing on both 32bit and 64bit Windows only for Latest Python version, + # because MSIs installers use Latest Python version + - PYTHON_HOME: "C:\\Python37" + PYTHON_VERSION: '3.7' + PYTHON_ARCH: '32' + + - PYTHON_HOME: "C:\\Python37-x64" + PYTHON_VERSION: '3.7' + PYTHON_ARCH: '64' + +install: + + # Upgrade setuptools, wheel and virtualenv + - "python -m pip install --upgrade setuptools wheel virtualenv" + + # Create new virtual environment and activate it + - "rm -rf venv" + - "python -m virtualenv venv" + - "venv\\Scripts\\activate" + - "python -c \"import sys; print(sys.executable)\"" + + # Actually install SAM CLI's dependencies + - "pip install -e \".[dev]\"" + +test_script: + - "pytest --cov samcli --cov-report term-missing --cov-fail-under 95 tests\\unit" + - "flake8 samcli" + - "flake8 tests\\unit tests\\integration" + - "pylint --rcfile .pylintrc samcli" + + From 5171db2a15405427df470b49a1609edc71efc9bf Mon Sep 17 00:00:00 2001 From: medinarrior Date: Thu, 6 Jun 2019 18:21:25 -0400 Subject: [PATCH 02/11] Support for Multi-Value Headers and Query String Parameters (#741) --- .pylintrc | 2 +- .../events/apigateway/AwsProxy.json | 61 +++++++++++++++++++ samcli/local/apigw/local_apigw_service.py | 55 +++++++++++++---- samcli/local/events/api_event.py | 16 +++++ .../local/start_api/test_start_api.py | 15 +++++ .../local/apigw/test_local_apigw_service.py | 42 +++++++++++-- tests/unit/local/events/test_api_event.py | 48 +++++++++++++++ 7 files changed, 223 insertions(+), 16 deletions(-) diff --git a/.pylintrc b/.pylintrc index 1d864729c6..82e54ec0c3 100644 --- a/.pylintrc +++ b/.pylintrc @@ -315,7 +315,7 @@ max-args=5 ignored-argument-names=_.* # Maximum number of locals for function / method body -max-locals=15 +max-locals=17 # Maximum number of return / yield for function / method body max-returns=6 diff --git a/samcli/commands/local/lib/generated_sample_events/events/apigateway/AwsProxy.json b/samcli/commands/local/lib/generated_sample_events/events/apigateway/AwsProxy.json index de198eec72..81fb8ad60a 100644 --- a/samcli/commands/local/lib/generated_sample_events/events/apigateway/AwsProxy.json +++ b/samcli/commands/local/lib/generated_sample_events/events/apigateway/AwsProxy.json @@ -7,6 +7,11 @@ "queryStringParameters": { "foo": "bar" }, + "multiValueQueryStringParameters": { + "foo": [ + "bar" + ] + }, "pathParameters": { "proxy": "/{{{path}}}" }, @@ -33,6 +38,62 @@ "X-Forwarded-Port": "443", "X-Forwarded-Proto": "https" }, + "multiValueHeaders": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" + ], + "Accept-Encoding": [ + "gzip, deflate, sdch" + ], + "Accept-Language": [ + "en-US,en;q=0.8" + ], + "Cache-Control": [ + "max-age=0" + ], + "CloudFront-Forwarded-Proto": [ + "https" + ], + "CloudFront-Is-Desktop-Viewer": [ + "true" + ], + "CloudFront-Is-Mobile-Viewer": [ + "false" + ], + "CloudFront-Is-SmartTV-Viewer": [ + "false" + ], + "CloudFront-Is-Tablet-Viewer": [ + "false" + ], + "CloudFront-Viewer-Country": [ + "US" + ], + "Host": [ + "0123456789.execute-api.{{dns_suffix}}" + ], + "Upgrade-Insecure-Requests": [ + "1" + ], + "User-Agent": [ + "Custom User Agent String" + ], + "Via": [ + "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)" + ], + "X-Amz-Cf-Id": [ + "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==" + ], + "X-Forwarded-For": [ + "127.0.0.1, 127.0.0.2" + ], + "X-Forwarded-Port": [ + "443" + ], + "X-Forwarded-Proto": [ + "https" + ] + }, "requestContext": { "accountId": "{{{account_id}}}", "resourceId": "123456", diff --git a/samcli/local/apigw/local_apigw_service.py b/samcli/local/apigw/local_apigw_service.py index 755502670f..c40d57158e 100644 --- a/samcli/local/apigw/local_apigw_service.py +++ b/samcli/local/apigw/local_apigw_service.py @@ -346,21 +346,18 @@ def _construct_event(flask_request, port, binary_types): identity=identity, path=endpoint) - event_headers = dict(flask_request.headers) - event_headers["X-Forwarded-Proto"] = flask_request.scheme - event_headers["X-Forwarded-Port"] = str(port) + headers_dict, multi_value_headers_dict = LocalApigwService._event_headers(flask_request, port) - # APIGW does not support duplicate query parameters. Flask gives query params as a list so - # we need to convert only grab the first item unless many were given, were we grab the last to be consistent - # with APIGW - query_string_dict = LocalApigwService._query_string_params(flask_request) + query_string_dict, multi_value_query_string_dict = LocalApigwService._query_string_params(flask_request) event = ApiGatewayLambdaEvent(http_method=method, body=request_data, resource=endpoint, request_context=context, query_string_params=query_string_dict, - headers=event_headers, + multi_value_query_string_params=multi_value_query_string_dict, + headers=headers_dict, + multi_value_headers=multi_value_headers_dict, path_parameters=flask_request.view_args, path=flask_request.path, is_base_64_encoded=is_base_64) @@ -379,12 +376,13 @@ def _query_string_params(flask_request): flask_request request Request from Flask - Returns dict (str: str) + Returns dict (str: str), dict (str: list of str) ------- Empty dict if no query params where in the request otherwise returns a dictionary of key to value """ query_string_dict = {} + multi_value_query_string_dict = {} # Flask returns an ImmutableMultiDict so convert to a dictionary that becomes # a dict(str: list) then iterate over @@ -394,11 +392,46 @@ def _query_string_params(flask_request): # if the list is empty, default to empty string if not query_string_value_length: query_string_dict[query_string_key] = "" + multi_value_query_string_dict[query_string_key] = [""] else: - # APIGW doesn't handle duplicate query string keys, picking the last one in the list query_string_dict[query_string_key] = query_string_list[-1] + multi_value_query_string_dict[query_string_key] = query_string_list - return query_string_dict + return query_string_dict, multi_value_query_string_dict + + @staticmethod + def _event_headers(flask_request, port): + """ + Constructs an APIGW equivalent headers dictionary + + Parameters + ---------- + flask_request request + Request from Flask + int port + Forwarded Port + + Returns dict (str: str), dict (str: list of str) + ------- + Returns a dictionary of key to list of strings + + """ + headers_dict = {} + multi_value_headers_dict = {} + + # Multi-value request headers is not really supported by Flask. + # See https://github.com/pallets/flask/issues/850 + for header_key in flask_request.headers.keys(): + headers_dict[header_key] = flask_request.headers.get(header_key) + multi_value_headers_dict[header_key] = flask_request.headers.getlist(header_key) + + headers_dict["X-Forwarded-Proto"] = flask_request.scheme + multi_value_headers_dict["X-Forwarded-Proto"] = [flask_request.scheme] + + headers_dict["X-Forwarded-Port"] = str(port) + multi_value_headers_dict["X-Forwarded-Port"] = [str(port)] + + return headers_dict, multi_value_headers_dict @staticmethod def _should_base64_encode(binary_types, request_mimetype): diff --git a/samcli/local/events/api_event.py b/samcli/local/events/api_event.py index 83ee88845a..c542e6e75e 100644 --- a/samcli/local/events/api_event.py +++ b/samcli/local/events/api_event.py @@ -132,7 +132,9 @@ def __init__(self, resource=None, request_context=None, query_string_params=None, + multi_value_query_string_params=None, headers=None, + multi_value_headers=None, path_parameters=None, stage_variables=None, path=None, @@ -145,7 +147,9 @@ def __init__(self, :param str resource: Resource for the reqeust :param RequestContext request_context: RequestContext for the request :param dict query_string_params: Query String parameters + :param dict multi_value_query_string_params: Multi-value Query String parameters :param dict headers: dict of the request Headers + :param dict multi_value_headers: dict of the multi-value request Headers :param dict path_parameters: Path Parameters :param dict stage_variables: API Gateway Stage Variables :param str path: Path of the request @@ -156,9 +160,16 @@ def __init__(self, query_string_params is not None: raise TypeError("'query_string_params' must be of type dict or None") + if not isinstance(multi_value_query_string_params, dict) and \ + multi_value_query_string_params is not None: + raise TypeError("'multi_value_query_string_params' must be of type dict or None") + if not isinstance(headers, dict) and headers is not None: raise TypeError("'headers' must be of type dict or None") + if not isinstance(multi_value_headers, dict) and multi_value_headers is not None: + raise TypeError("'multi_value_headers' must be of type dict or None") + if not isinstance(path_parameters, dict) and path_parameters is not None: raise TypeError("'path_parameters' must be of type dict or None") @@ -170,7 +181,9 @@ def __init__(self, self.resource = resource self.request_context = request_context self.query_string_params = query_string_params + self.multi_value_query_string_params = multi_value_query_string_params self.headers = headers + self.multi_value_headers = multi_value_headers self.path_parameters = path_parameters self.stage_variables = stage_variables self.path = path @@ -191,7 +204,10 @@ def to_dict(self): "resource": self.resource, "requestContext": request_context_dict, "queryStringParameters": dict(self.query_string_params) if self.query_string_params else None, + "multiValueQueryStringParameters": dict(self.multi_value_query_string_params) + if self.multi_value_query_string_params else None, "headers": dict(self.headers) if self.headers else None, + "multiValueHeaders": dict(self.multi_value_headers) if self.multi_value_headers else None, "pathParameters": dict(self.path_parameters) if self.path_parameters else None, "stageVariables": dict(self.stage_variables) if self.stage_variables else None, "path": self.path, diff --git a/tests/integration/local/start_api/test_start_api.py b/tests/integration/local/start_api/test_start_api.py index 168eadfd5c..1c83d17218 100644 --- a/tests/integration/local/start_api/test_start_api.py +++ b/tests/integration/local/start_api/test_start_api.py @@ -421,6 +421,17 @@ def test_request_to_an_endpoint_with_two_different_handlers(self): self.assertEquals(response_data.get("handler"), 'echo_event_handler_2') + def test_request_with_multi_value_headers(self): + response = requests.get(self.url + "/echoeventbody", + headers={"Content-Type": "application/x-www-form-urlencoded, image/gif"}) + + self.assertEquals(response.status_code, 200) + response_data = response.json() + self.assertEquals(response_data.get("multiValueHeaders").get("Content-Type"), + ["application/x-www-form-urlencoded, image/gif"]) + self.assertEquals(response_data.get("headers").get("Content-Type"), + "application/x-www-form-urlencoded, image/gif") + def test_request_with_query_params(self): """ Query params given should be put into the Event to Lambda @@ -433,6 +444,7 @@ def test_request_with_query_params(self): response_data = response.json() self.assertEquals(response_data.get("queryStringParameters"), {"key": "value"}) + self.assertEquals(response_data.get("multiValueQueryStringParameters"), {"key": ["value"]}) def test_request_with_list_of_query_params(self): """ @@ -446,6 +458,7 @@ def test_request_with_list_of_query_params(self): response_data = response.json() self.assertEquals(response_data.get("queryStringParameters"), {"key": "value2"}) + self.assertEquals(response_data.get("multiValueQueryStringParameters"), {"key": ["value", "value2"]}) def test_request_with_path_params(self): """ @@ -480,4 +493,6 @@ def test_forward_headers_are_added_to_event(self): response_data = response.json() self.assertEquals(response_data.get("headers").get("X-Forwarded-Proto"), "http") + self.assertEquals(response_data.get("multiValueHeaders").get("X-Forwarded-Proto"), ["http"]) self.assertEquals(response_data.get("headers").get("X-Forwarded-Port"), self.port) + self.assertEquals(response_data.get("multiValueHeaders").get("X-Forwarded-Port"), [self.port]) diff --git a/tests/unit/local/apigw/test_local_apigw_service.py b/tests/unit/local/apigw/test_local_apigw_service.py index 50702c8bf2..fc07aa9ce5 100644 --- a/tests/unit/local/apigw/test_local_apigw_service.py +++ b/tests/unit/local/apigw/test_local_apigw_service.py @@ -465,11 +465,16 @@ def setUp(self): query_param_args_mock = Mock() query_param_args_mock.lists.return_value = {"query": ["params"]}.items() self.request_mock.args = query_param_args_mock - self.request_mock.headers = {"Content-Type": "application/json", "X-Test": "Value"} + headers_mock = Mock() + headers_mock.keys.return_value = ["Content-Type", "X-Test"] + headers_mock.get.side_effect = ["application/json", "Value"] + headers_mock.getlist.side_effect = [["application/json"], ["Value"]] + self.request_mock.headers = headers_mock self.request_mock.view_args = {"path": "params"} self.request_mock.scheme = "http" expected = '{"body": "DATA!!!!", "httpMethod": "GET", ' \ + '"multiValueQueryStringParameters": {"query": ["params"]}, ' \ '"queryStringParameters": {"query": "params"}, "resource": ' \ '"endpoint", "requestContext": {"httpMethod": "GET", "requestId": ' \ '"c6af9ac6-7b61-11e6-9a41-93e8deadbeef", "path": "endpoint", "extendedRequestId": null, ' \ @@ -479,6 +484,8 @@ def setUp(self): '"Custom User Agent String", "caller": null, "cognitoAuthenticationType": null, "sourceIp": ' \ '"190.0.0.0", "user": null}, "accountId": "123456789012"}, "headers": {"Content-Type": ' \ '"application/json", "X-Test": "Value", "X-Forwarded-Port": "3000", "X-Forwarded-Proto": "http"}, ' \ + '"multiValueHeaders": {"Content-Type": ["application/json"], "X-Test": ["Value"], '\ + '"X-Forwarded-Port": ["3000"], "X-Forwarded-Proto": ["http"]}, ' \ '"stageVariables": null, "path": "path", "pathParameters": {"path": "params"}, ' \ '"isBase64Encoded": false}' @@ -505,10 +512,37 @@ def test_construct_event_with_binary_data(self, should_base64_encode_patch): self.request_mock.get_data.return_value = binary_body self.expected_dict["body"] = base64_body self.expected_dict["isBase64Encoded"] = True + self.maxDiff = None actual_event_str = LocalApigwService._construct_event(self.request_mock, 3000, binary_types=[]) self.assertEquals(json.loads(actual_event_str), self.expected_dict) + def test_event_headers_with_empty_list(self): + request_mock = Mock() + headers_mock = Mock() + headers_mock.keys.return_value = [] + request_mock.headers = headers_mock + request_mock.scheme = "http" + + actual_query_string = LocalApigwService._event_headers(request_mock, "3000") + self.assertEquals(actual_query_string, ({"X-Forwarded-Proto": "http", "X-Forwarded-Port": "3000"}, + {"X-Forwarded-Proto": ["http"], "X-Forwarded-Port": ["3000"]})) + + def test_event_headers_with_non_empty_list(self): + request_mock = Mock() + headers_mock = Mock() + headers_mock.keys.return_value = ["Content-Type", "X-Test"] + headers_mock.get.side_effect = ["application/json", "Value"] + headers_mock.getlist.side_effect = [["application/json"], ["Value"]] + request_mock.headers = headers_mock + request_mock.scheme = "http" + + actual_query_string = LocalApigwService._event_headers(request_mock, "3000") + self.assertEquals(actual_query_string, ({"Content-Type": "application/json", "X-Test": "Value", + "X-Forwarded-Proto": "http", "X-Forwarded-Port": "3000"}, + {"Content-Type": ["application/json"], "X-Test": ["Value"], + "X-Forwarded-Proto": ["http"], "X-Forwarded-Port": ["3000"]})) + def test_query_string_params_with_empty_params(self): request_mock = Mock() query_param_args_mock = Mock() @@ -516,7 +550,7 @@ def test_query_string_params_with_empty_params(self): request_mock.args = query_param_args_mock actual_query_string = LocalApigwService._query_string_params(request_mock) - self.assertEquals(actual_query_string, {}) + self.assertEquals(actual_query_string, ({}, {})) def test_query_string_params_with_param_value_being_empty_list(self): request_mock = Mock() @@ -525,7 +559,7 @@ def test_query_string_params_with_param_value_being_empty_list(self): request_mock.args = query_param_args_mock actual_query_string = LocalApigwService._query_string_params(request_mock) - self.assertEquals(actual_query_string, {"param": ""}) + self.assertEquals(actual_query_string, ({"param": ""}, {"param": [""]})) def test_query_string_params_with_param_value_being_non_empty_list(self): request_mock = Mock() @@ -534,7 +568,7 @@ def test_query_string_params_with_param_value_being_non_empty_list(self): request_mock.args = query_param_args_mock actual_query_string = LocalApigwService._query_string_params(request_mock) - self.assertEquals(actual_query_string, {"param": "b"}) + self.assertEquals(actual_query_string, ({"param": "b"}, {"param": ["a", "b"]})) class TestService_should_base64_encode(TestCase): diff --git a/tests/unit/local/events/test_api_event.py b/tests/unit/local/events/test_api_event.py index e47c9e48c2..ddbc553890 100644 --- a/tests/unit/local/events/test_api_event.py +++ b/tests/unit/local/events/test_api_event.py @@ -159,7 +159,9 @@ def test_class_initialized(self): 'resource', 'request_context', {"query": "some query"}, + {"query": ["some query"]}, {"header_key": "value"}, + {"header_key": ["value"]}, {"param": "some param"}, {"stage_vars": "some vars"}, 'request_path', @@ -186,7 +188,9 @@ def test_to_dict(self): 'resource', request_context_mock, {"query": "some query"}, + {"query": ["first query", "some query"]}, {"header_key": "value"}, + {"header_key": ["value"]}, {"param": "some param"}, {"stagevars": "some vars"}, 'request_path', @@ -198,7 +202,9 @@ def test_to_dict(self): "resource": "resource", "requestContext": {"request_context": "the request context"}, "queryStringParameters": {"query": "some query"}, + "multiValueQueryStringParameters": {"query": ["first query", "some query"]}, "headers": {"header_key": "value"}, + "multiValueHeaders": {"header_key": ["value"]}, "pathParameters": {"param": "some param"}, "stageVariables": {"stagevars": "some vars"}, "path": "request_path", @@ -215,7 +221,9 @@ def test_to_dict_with_defaults(self): "resource": None, "requestContext": {}, "queryStringParameters": None, + "multiValueQueryStringParameters": None, "headers": None, + "multiValueHeaders": None, "pathParameters": None, "stageVariables": None, "path": None, @@ -231,7 +239,25 @@ def test_init_with_invalid_query_string_params(self): 'resource', 'request_context', "not a dict", + {"query": ["first query", "some query"]}, {"header_key": "value"}, + {"header_key": ["value"]}, + {"param": "some param"}, + {"stage_vars": "some vars"}, + 'request_path', + False + ) + + def test_init_with_invalid_multi_value_query_string_params(self): + with self.assertRaises(TypeError): + ApiGatewayLambdaEvent('request_method', + 'request_data', + 'resource', + 'request_context', + {"query": "some query"}, + "not a dict", + {"header_key": "value"}, + {"header_key": ["value"]}, {"param": "some param"}, {"stage_vars": "some vars"}, 'request_path', @@ -245,6 +271,24 @@ def test_init_with_invalid_headers(self): 'resource', 'request_context', {"query": "some query"}, + {"query": ["first query", "some query"]}, + "not EnvironHeaders", + {"header_key": ["value"]}, + {"param": "some param"}, + {"stage_vars": "some vars"}, + 'request_path', + False + ) + + def test_init_with_invalid_multi_value_headers(self): + with self.assertRaises(TypeError): + ApiGatewayLambdaEvent('request_method', + 'request_data', + 'resource', + 'request_context', + {"query": "some query"}, + {"query": ["first query", "some query"]}, + {"header_key": "value"}, "not EnvironHeaders", {"param": "some param"}, {"stage_vars": "some vars"}, @@ -259,7 +303,9 @@ def test_init_with_invalid_path_parameters(self): 'resource', 'request_context', {"query": "some query"}, + {"query": ["first query", "some query"]}, {"header_key": "value"}, + {"header_key": ["value"]}, "Not a dict", {"stage_vars": "some vars"}, 'request_path', @@ -274,7 +320,9 @@ def test_init_with_invalid_stage_variables(self): 'resource', 'request_context', {"query": "some query"}, + {"query": ["first query", "some query"]}, {"header_key": "value"}, + {"header_key": ["value"]}, {"param": "some param"}, "Not a dict", 'request_path', From 7741af4826a8b0d0460846148cfb618e1d490d82 Mon Sep 17 00:00:00 2001 From: Sanath Kumar Ramesh Date: Thu, 6 Jun 2019 15:45:01 -0700 Subject: [PATCH 03/11] docs: Readme improvements (#1210) --- README.md | 199 +++++++++++++++-------------------- docs/get-started-youtube.png | Bin 0 -> 113149 bytes 2 files changed, 86 insertions(+), 113 deletions(-) create mode 100644 docs/get-started-youtube.png diff --git a/README.md b/README.md index b4f254d42c..9be8d2f4db 100644 --- a/README.md +++ b/README.md @@ -1,119 +1,92 @@

-SAM CLI (Beta) -============== +# AWS SAM (Beta) -![Build -Status](https://travis-ci.org/awslabs/aws-sam-cli.svg?branch=develop) ![Apache-2.0](https://img.shields.io/npm/l/aws-sam-local.svg) -![Contributors](https://img.shields.io/github/contributors/awslabs/aws-sam-cli.svg) -![GitHub-release](https://img.shields.io/github/release/awslabs/aws-sam-cli.svg) -![PyPI version](https://badge.fury.io/py/aws-sam-cli.svg) - -[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/aws-sam-cli) - -[Join the SAM developers channel (\#samdev) on -Slack](https://join.slack.com/t/awsdevelopers/shared_invite/enQtMzg3NTc5OTM2MzcxLTdjYTdhYWE3OTQyYTU4Njk1ZWY4Y2ZjYjBhMTUxNGYzNDg5MWQ1ZTc5MTRlOGY0OTI4NTdlZTMwNmI5YTgwOGM/) -to collaborate with fellow community members and the AWS SAM team. - -`sam` is the AWS CLI tool for managing Serverless applications written -with [AWS Serverless Application Model -(SAM)](https://github.com/awslabs/serverless-application-model). SAM CLI -can be used to test functions locally, start a local API Gateway from a -SAM template, validate a SAM template, fetch logs, generate sample -payloads for various event sources, and generate a SAM project in your -favorite Lambda Runtime. - -Main features -------------- - -- Develop and test your Lambda functions locally with `sam local` and - Docker -- Invoke functions from known event sources such as Amazon S3, Amazon - DynamoDB, Amazon Kinesis Streams, etc. -- Start local API Gateway from a SAM template, and quickly iterate - over your functions with hot-reloading -- Validate SAM templates -- Get started with boilerplate Serverless Service in your chosen - Lambda Runtime `sam init` - -Get Started ------------ - -Learn how to get started using the SAM CLI with these guides: - -- [Installation](https://aws.amazon.com/serverless/sam/): Set up your macOS, Linux or - Windows Machine to run serverless projects with SAM CLI. -- [Introduction to SAM and SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-quick-start.html) What is - SAM and SAM CLI, and how can you use it to make a simple hello-world - app. -- [Running and debugging serverless applications - locally](docs/usage.md): Describes how to use SAM CLI for invoking - Lambda functions locally, running automated tests, fetching logs, - and debugging applications -- [Packaging and deploying your - application](docs/deploying_serverless_applications.md): Deploy - your local application using an S3 bucket, and AWS CloudFormation. -- [Advanced](docs/advanced_usage.md): Learn how to work with compiled - languages (such as Java and .NET), configure IAM credentials, - provide environment variables, and more. -- [Examples](https://github.com/awslabs/serverless-application-model/tree/master/examples/apps) - -Project Status --------------- - -- \[x\] Python Versions support - - \[x\] Python 2.7 - - \[x\] Python 3.6 - - \[x\] Python 3.7 -- \[ \] Supported AWS Lambda Runtimes - - \[x\] `nodejs` - - \[x\] `nodejs4.3` - - \[x\] `nodejs6.10` - - \[x\] `nodejs8.10` - - \[x\] `nodejs10.x` - - \[x\] `java8` - - \[x\] `python2.7` - - \[x\] `python3.6` - - \[x\] `python3.7` - - \[x\] `go1.x` - - \[ \] `dotnetcore1.0` - - \[x\] `dotnetcore2.0` - - \[x\] `dotnetcore2.1` - - \[x\] `ruby2.5` - - \[x\] `Provided` -- \[x\] AWS credential support -- \[x\] Debugging support -- \[x\] Inline Swagger support within SAM templates -- \[x\] Validating SAM templates locally -- \[x\] Generating boilerplate templates - - \[x\] `nodejs` - - \[x\] `nodejs4.3` - - \[x\] `nodejs6.10` - - \[x\] `nodejs8.10` - - \[x\] `nodejs10.x` - - \[x\] `java8` - - \[x\] `python2.7` - - \[x\] `python3.6` - - \[x\] `python3.7` - - \[x\] `go1.x` - - \[x\] `dotnetcore1.0` - - \[x\] `dotnetcore2.0` - - \[x\] `ruby2.5` - - \[ \] `Provided` - -Contributing ------------- - -Contributions and feedback are welcome! Proposals and pull requests will -be considered and responded to. For more information, see the -[CONTRIBUTING](CONTRIBUTING.md) file. - -A special thank you -------------------- - -SAM CLI uses the open source -[docker-lambda](https://github.com/lambci/docker-lambda) Docker images -created by [@mhart](https://github.com/mhart). +![SAM CLI Version](https://img.shields.io/github/release/awslabs/aws-sam-cli.svg?label=CLI%20Version) + + +The AWS Serverless Application Model (SAM) is an open-source framework for building serverless applications. +It provides shorthand syntax to express functions, APIs, databases, and event source mappings. +With just a few lines of configuration, you can define the application you want and model it. + +[![Getting Started with AWS SAM](./docs/get-started-youtube.png)](https://www.youtube.com/watch?v=1dzihtC5LJ0) + +## Get Started + +To get started with building SAM-based applications, use the SAM CLI. SAM CLI provides a Lambda-like execution +environment that lets you locally build, test, debug, and deploy applications defined by SAM templates. + +* [Install SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) +* [Build & Deploy a "Hello World" Web App](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-quick-start.html) +* [Install AWS Toolkit](https://aws.amazon.com/getting-started/tools-sdks/#IDE_and_IDE_Toolkits) to use SAM with your favorite IDEs. + + +**Next Steps:** Learn to build a more complex serverless application. +* [Extract text from images and store in a database](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-example-s3.html) using Amazon S3 and Amazon Rekognition services. +* [Detect when records are added to a database](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-example-ddb.html) using Amazon DynamoDB database and asynchronous stream processing. + + +**Detailed References:** Explains SAM commands and usage in depth. +* [CLI Commands](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html) +* [SAM Template Specification](https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md) +* [Policy Templates](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html) + +## Why SAM + ++ **Single\-deployment configuration**\. SAM makes it easy to organize related components and resources, and operate on a single stack\. You can use SAM to share configuration \(such as memory and timeouts\) between resources, and deploy all related resources together as a single, versioned entity\. + ++ **Local debugging and testing**\. Use SAM CLI to locally build, test, and debug SAM applications on a Lambda-like execution environment. It tightens the development loop by helping you find & troubleshoot issues locally that you might otherwise identify only after deploying to the cloud. + ++ **Deep integration with development tools**. You can use SAM with a suite of tools you love and use. + + IDEs: [PyCharm](https://aws.amazon.com/pycharm/), [IntelliJ](https://aws.amazon.com/intellij/), [Visual Studio Code](https://aws.amazon.com/visualstudiocode/), [Visual Studio](https://aws.amazon.com/visualstudio/), [AWS Cloud9](https://aws.amazon.com/cloud9/) + + Build: [CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/) + + Deploy: [CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/), [Jenkins](https://wiki.jenkins.io/display/JENKINS/AWS+SAM+Plugin) + + Continuous Delivery Pipelines: [CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/) + + Discover Serverless Apps & Patterns: [AWS Serverless Application Repository](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/) + ++ **Built\-in best practices**\. You can use SAM to define and deploy your infrastructure as configuration. This makes it possible for you to use and enforce best practices through code reviews. Also, with a few lines of configuration, you can enable safe deployments through CodeDeploy, and can enable tracing using AWS X\-Ray\. + ++ **Extension of AWS CloudFormation**\. Because SAM is an extension of AWS CloudFormation, you get the reliable deployment capabilities of AWS CloudFormation\. You can define resources by using CloudFormation in your SAM template\. Also, you can use the full suite of resources, intrinsic functions, and other template features that are available in CloudFormation\. + +## What is this Github repository? 💻 +This Github Repository contains source code for SAM CLI. Here is the development team talking about this code: + +> SAM CLI code is written in Python. Source code is well documented, very modular, with 95% unit test coverage. +It uses this awesome Python library called Click to manage the command line interaction and uses Docker to run Lambda functions locally. +We think you'll like the code base. Clone it and run `make pr`! + +## Contribute to SAM + +We love our contributors ❤️ We have over 100 contributors who have built various parts of the product. +Read this [testimonial from @ndobryanskyy](https://www.lohika.com/aws-sam-my-exciting-first-open-source-experience/) to learn +more about what it was like contributing to SAM. + +Depending on your interest and skill, you can help build the different parts of the SAM project; + +**Enhance the SAM Specification** + +Make pull requests, report bugs, and share ideas to improve the full SAM template specification. +Source code is located on Github at [awslabs/serverless-application-model](https://github.com/awslabs/serverless-application-model). +Read the [SAM Specification Contributing Guide](https://github.com/awslabs/serverless-application-model/blob/master/CONTRIBUTING.md) +to get started. + +**Strengthen SAM CLI** + +Add new commands or enhance existing ones, report bugs, or request new features for the SAM CLI. +Source code is located on Github at [awslabs/aws-sam-cli](https://github.com/awslabs/aws-sam-cli). Read the [SAM CLI Contributing Guide](https://github.com/awslabs/aws-sam-cli/blob/develop/CONTRIBUTING.md) to +get started. + +**Update SAM Developer Guide** + +[SAM Developer Guide](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/index.html) provides comprehensive getting started guide and reference documentation. +Source code is located on Github at [awsdocs/aws-sam-developer-guide](https://github.com/awsdocs/aws-sam-developer-guide). +Read the [SAM Documentation Contribution Guide](https://github.com/awsdocs/aws-sam-developer-guide/blob/master/CONTRIBUTING.md) to get +started. + +### Join the SAM Community on Slack +[Join the SAM developers channel (#samdev)](https://join.slack.com/t/awsdevelopers/shared_invite/enQtMzg3NTc5OTM2MzcxLTdjYTdhYWE3OTQyYTU4Njk1ZWY4Y2ZjYjBhMTUxNGYzNDg5MWQ1ZTc5MTRlOGY0OTI4NTdlZTMwNmI5YTgwOGM/) on Slack to collaborate with fellow community members and the AWS SAM team. + + diff --git a/docs/get-started-youtube.png b/docs/get-started-youtube.png new file mode 100644 index 0000000000000000000000000000000000000000..a28b0a7f43ffbfe14516a65af6338d11e6f0e8e4 GIT binary patch literal 113149 zcmZU4V|*t~7H*P>ZQHhO+qV9(?PQWntch*gb|$tbwr$MKyt{XI@9*}f?&{Jxb@)`( z4@G$iIB0BWARr((DM?XfARrI{ARu5#Nbs+c9+RATARy>kfQX2ql!yqSqLaNjz{U&+ zNb<+eWC&Fi0QyMJ(;N;cvT)c;#y$L;HPDHks<1E=S%{!w9T77ph>4IGD4I|hF?5V{ zypkyG3bN#Cc9tMRv~mv4gjrZAvojA#L@ ze#wk0<3F*m&?X0?fgnpkKxTjsZRCr4$rxu42(?>3)d=3=twf(-ExbS8uKuVg|9+N* z2T~;Lcl<3YkKJz(cf1W5q6L&22ZUYG0NS7%%BU9(8-9JGC7*dTr4^HL^ybW#*JlSA z3mibvu-Y#QBuNm*%aV~8eor)y#J=O~=@YVn$mV+P`cl{q2oGfI6?sda*nHUj4Lo5`Kd_&f<dK{0 zyRh-Qo~<{R_`AFUvbqevoY0<73&H89a!$#nEX>2guO@}{Yr*8r-$3afp-`_793b#} z5ndRDFc~4xdr>t(Oc%9otj)Io+sX8rH2Y-aW=wim%DZ>43D8zX?tnOaN|xa&^DuHiVEMn@=CjG#FqCf+hsO z?*~H90JZlbrUKI#B4oz@@D&7t1XD63+YTU&0}nA|(?nno22lic3+l?nRShD^h0g>k z5v1XSpbx6pCU5=r+DpO+D&9xK2+SV@fDCd#1j`q?jiW9E!xA))gWHGn6!cSML4`jk?$VH1-%_oFU%_sVuq0wzAL!9mogQ0-pEW7hdtER5Mu=c z{<}u+4+rqfZ$|^`JIt-v{O~Qk7&{pb1iYX_rV!}*{R+J)1aAR<20TJS4xgn*| zrNXLI<=BhiRuZlSmwBOzHA*?Nnyhe>qB!{%vzy0^tPoj&o8k20DFtUUbjRbz-p5Aw zpszfkK}!9YhUbj5vZUll4cICHR6`4f=}a1ozNtzR613>!y{Cp%b(<@cHq35#&6wVZ z>me6|kH!+UiJZ9d_!a@qy$tQyFOD8_Bjp<~gZ3wmHTV7OnJ31viqBII;bUeQhU-7vLAZ@4~aioGSTLT1gj4 zUSniqDq|E-=^^o;GC?$TQu)I9V!PFYI8s4{$%T>o(xbSe%A@lMEo25NP^z}&I6vh! zB&%|>i{KS0iY%3jm4TH3%0tQ{h1D|AQhS9>MSO*Ab1!oeg$z=$Gm5Nm={V6M>%u(J z9l|(8CMVo3=zMAVq5?u!c?!QI$2EV2j912&#c?sP3<@$eV$q6In?UTL7UbNBscS8X zvFp2K*c6=Wtx|D`aapu^vQ=(I6EBlm!(wxwM(Nw8$=ex)Nl(ocGWwdfT4PFv%tyT@PESpbW}?( zFQ8U%jXechOp(PZhGF@sHQYIosi>lSr;bvlR`yUTS8-MvR(4dzQ6?};XtiQVYI#0; zJeNA7x~N;+rr#iRmxnGiE>0t5oul5el++yK7V@Zmp?<-H$AyCUSe0dwRng!&`E+a>{Zs>AcK8*&moDS!_9cEsE`jnJO4N?B$uB zShq|!%|Dm=dx9IfTfG|#>*ePegY5X>;nux`fG z(O8#jKC%&5*IG4O&8mN!-<;te`b_;;QO+v5k%^_pb5wLU z%PP;x=CbB=&a%!lXgzKt?Z9>S+_T!HcCmHKa%ym1-(EV2ae8uMaJjmPdxX5BeDXLg zyG%P?-R9acJ87D#n8(?>IO`hs4k((~tv%I3;a}p%@u7c9@D=eH_sw}Zd4u{`OX(Z; zNxsm3Trn8Wx!S@80?`ES_?8WN3Th7ei5&t54OQr1$=}Kof?iL(ulZ|4ad`$W zFSg%hK-5TYCt-(a=V3<$=@N+yNhE$a9*5XooJ#a2e=Xl}c4wAtHgTLU`AUx;+XPDm zalS{`VkjMLS%bP#R?pM#=RWmg`FvgKO8AONoxv*bxz(d7F3qLjZ_ttGhSORgD8Dhg|)uFx+`Hg8ky`&mdT^#UNXd; zyPVG0Q8-F$KIx`OYe=sKlEdjPUdCS9UPuHyK4ugNl?Z7uSFC!PZYAzxI|;m-)9lxK zF1(3auEpb}lmN5K#_~7OIkNuLZvb=e{>N-QbsqSO!OQ)t^R0u%ifYkv(h^hCr}_;# z?^JK-C!duLtE&g)$hk4!LEn5|5i>tC+c&nStKWZ`c*{C#`kV4k0_Fm3A&TLh5H|Vt zeM;+;+v-bi$Bj03`lxHlldUdJ=SWsaRwc3t-~`q_8YZV7*r3_O*tV=*nnYatTvN`f z&dy?~@YZL6IKr`qV@Gg%ocljSbqb73)KCh_j!8MGxLRf5%H0WJCUQG62e`tHlU+4~brrq&yhvU8Av0ymS%ep~x z8yLuTa?UlCpUoEil6hi)(7SBg^*&fro32P{*K23cb#8ULY~Ofj;IOf4+-z)LbsE1_ zzq3#7VSCbiX#CyWz2P?UDDQnWw;9tR@6NF4+~fYhfA%@a|EGKNv-YzuFf}kw=yH1{ zcmcwmz+52HFX;{QuJsz~LFz=MsARF{>|>MFl+DF&#rJusA{ndPVR z*xejPIm7A5#PC$Kcg&V&+xx*WO<%>yGMInj>v|wZyZzMr$@@{&k6%A#Tl!mAt|GR^ zdul!mZ}O~}9d1uX8e`{GzUS-_Oh{&V^EaU;7n5fwmZ zI;{naitHc^0(51Cl!FKcbO8?}`olApm%?&$c^c_if%mH5$P`S_m10*v4pK0G4hzVZ zRBjZE5OGJ*0w^ORa*tq4mXRalO3X^EQtD)4!h4Wx=N{;posorQgPY~93LNW^XxD^) z%KJ`B3F(i2>+oRz@)f=-Gsb)5C;X-i1m#;C3f5O3n*~tSbkUTPAocFzAM>x)2!zke8*=ouOQ)Av_X-oK^XiU1EY8%XnTtmPx~!&5Qh z(Ol&!I%vWL$Wc+C!%as!GcP+F%|EXyvePfCt53e3w3D`$)6ML!FK*Y5_vT= zD~H`okzS&0Lfut6(w#pP?AK1&fYEiTE2w!&Jy)F7MI1Y=pY0E2K;fkq-f-#SGU+f zduOs_G*`Ve@x(Qb>a8FX{e9m@uy76SQ#H~QXsTJOMRK^H*S3lsqxEdktf}1E_wL>* zx!v<k7jc!4jec2GvzbRAqP>qy4M0W?T5gbq!nsY?-}0sx2=`k8 zFZW>zn;ru>8uIk0`xD91oK2A$+yMi=CQtn3*JuEZ?bSuFBP zl8U2pzxZNa2;w#B;o&+qbiUmyfL@2S@m1)uy#Nim7_n>V!j*xEiK$fR&uWZtWzqF~ zJG5xvag9RyW=NZC`h4L|`wwA!56N_aU=8$GIGy0QaF+)m^2~oR`V2q3g>8$}fA!XL^ zjRu_EIfOMqBDAmyr$PduP~1+(vm9!ceTpBg^8AfIGdnm*6I1{UrjzDGSUTkRzItm_ z$_)uM5)mw)QIX5klaJYNu9a)0Z?sTLJpA+aP-oO1&wTyXeme6k3e{MvEi%cs<7J^6p$PM$anoy2Irt@EI~tn=Bn!ixCX&L&ua<7gIbCc;K*JK@vsQB(A=RB)OBOEOzyAkBD3%M=%sA zf4O`Blr@yPzt)@Xvq1oN)SpTn4f3fC=@K26g87LiQQNa$zVtq6TTf@7KSy*%nJ1a} zZL>-&vwp;4_?}vGO3iy$yw~7=BrBm{e|*l&vos;)dHLhi1iJU_AaQ5Q>JUHVekvZ7 z?i|rG3kjykkq=^vx^xLf-!R}PV4R9IUi=`A*SJ9BVq5>TvkrRyq>E6Qq1a^Pw%xL{ zcJ$FM&T6(gn`p-`*nqm-I&p10xJb&66hJ^y)UyflS@hlqCF;N+r9zMzaE+ZePwJSj zW0#qH;rU0uzlRB`>`1_vG}8dXt+H;YSlK%!mQC`6Xm>{RUaA)iEmugNf3zfrJU0;jY)r0@;dcfA+y(u zRX{aCk{}@vZjstSn9Zp^&qnxD*U75icV%bw-qVOvy5%all9gGFMTuF+^c8d83Aenh z$JQMC6|U0Lb9XjLYYj`ag$mPX)E}QV(2S~=wY>4B6ZHH(Wy3A8EHypRyn*(kTNo`Y zs%blB?JnM%x*(cy{Y~du)MwPCf9lq{W3SJMyE$qHO|hRxMnG<0yGfBQgd3(o*ky-V z4)Kek{eC^|dHa*m)2Fpj0p%v}HBnEGqKJ{ryY6Mcl-qtoQ>Z=C7lj3Y;^yM^d-dOT zbB-`hbz5?wugIu($Pp5j6GVl_FB01=nE_>>C(}8+) zull^h(toV|mu3IQ_#dMNI!W>}iSa6i9l-lVLA=6nC3%G_e@G!;#0c?-HuP|?k9PFn z4i(y2ZU%8Tr)uVF9LB&TrdS+;WRAX2KN~njpB6JXETz2mS6+>xoLc`PwbwDgIyc&F zUMdY6J)$lXWoKcJ(dmTnT!vj;YZlck_2Iw;wtVm$o`ltkYmrPRn~D&JB7iy&)w z-1r4~(t04nKjerbthwfscb_xboCL@dv8)slCGz((ze>n&AP`q7j%yQ z`X@dCG}}iRT^p*Oja8GKMmeXeam##6LC&CH?9C)NWsEs~&Z<6sq5{QnYIv)6nBX5I z#&v7Ig2r@x0n00=g>wwgMxUq$-y(pq{Z7R?Hc`fN{!8g8(Ey@>RIzH4R*R59$tami zC-;(1Y#?cSAv>2t-#_;4@9NIr0{0|Z;SckrQ9vplLqYL(jcQbIt2bZJp_)e*6dp6qjNVs2NHO-^@Q=~dGOv|vBpHm(}Bnx(yVf8i?!54ZYIp3FF zLGAN~HoMcB1YgIUS@x(U;a8e_2B$^D9Tk@18h6YZV2&e2lLo+kdSLWdY2@6sAM zg}`Zo{%!6ekm&};ZNCeJ2;;8{X!7K95gt{!PnxIM@nZdYY^K-b35`NXO@^f!d7%=| z34C)_o(&8(Izy8svW1~VGmoTs9t|MU^M%w@r^%4{gifg)pn(t;=Q| zigPl?aT9K|7uT8^Tk#fhFB;ff}W80!HvEtGGfBtLwN#>n`|N?va295lWh=)cT|10*dFC~QVfE3V3% z6+I1^UK9iUchcz~acy#r)32o(^hpkJt6;=MkYoP*t-ECNQ}`+;!=$t8sJH0&E23!> zCaeQ5M9U+eR`X87aJ56hUw>!@pshrv(O)%;LO+lxmcFpOu{HhiiM4eK@~s`NUtc54 zlE2QB6+w+c>b4VkHWJlYghFv~|DPFgg5E{}h2-Q4qI6ENtm7|#JS$2imd zM(^nA#P!{sNdUv*OUIam34Q}^Cit-y)Cea>Qp9hdxfV(qfg;lw!<>-3nLDtBWLZYc zA%Wc=TPA6p6(pC1iJq@L9}Z)rQnA|KGTjy(v7w;GY%+9E__Z2DnOTWT-S{<=FkCUh zgV*%*4iOf5Y|V|=d$0*~xtt7Pf-s;fp`?Hb`f0Kf*K&ewq5a1U@Btp`_p0*5`aJ{5c zNiEC3e-RS04reZvl#V}NgqOi~LfVZWQjov;EG^4mCJ2K=MWvM==pk@xx-;nccdE9; zah833A*_kCYpJd}NzE5^2RzB@+eQhzEB&C7l%iP0HXd`KqmAE~gFK3iPVPD(y4i<^ zgW(fLwa5$$69(5hg9n3G*%NO=2r86of>HPKu{~p9)~YO;2#Fs=C!kGqRPuD*E!)`- z$}fuMcRF0<=O|qhnt!-bH0tVpaVggw()8t${1iIQFy8@+NOC<}`_A@60^2440N+OX z5zyS!#;!lY3!^lPt-E21y2^e_*b>+HCHe;HMho7nCL?zzh3$CmcmyXG+$!+*q| z6Vw>-+D3_xU5l(FH5}$7UT*CaN&kS;Bu{?4m-}Oqu)G8x`5O+r`1N25djSI;7XuAr zM;d6m=n>DF%_4mVB#HIhxYnP+)P z&I4-WO2%^oT1Mf=g$II+J!4) zZ2KnZqzWUSeo6F5E1QXt!7D(ciXl4{T|};Aah2Oxb+Q{`O!k?HMO1wfgnhu&FQ+!~ z(rsroqU=m_1$h$JP-5nv>BBOD0MkSmP|+B6FrNf_V{G2aQQ^6RCdwAE78gPPC+@ptR_oc-VfI|&V~TW|X__6j&4 zU6dhoDV8&s$4sc<26S~w)+9okj2dk&-IX%7K%s;B3}6tz*}Cu|W|8gsN?1A!#99P{?fUOgQzYx` zsLzsKH4s+_Ta!*W0b?Wi41~u&=}E5CzI|s8svi|Kx~a_s3nzowfg&@KnMP_{&2?7B z8ZVJ%n|v<+O6C7$oo66GwXOVqCBC5LgH6J+DlE}voCE?}a~_=_N=6D6#uSn5?{a}U zg$S;Bbt$rmb5XY^RT{2!=Cxaiyu>q49?q&NRK1<)vjh!Jih=H)y2|W~JTe1z!Vq1= zXlJ+CMpphwuKywjQHX{-1j|aMNl_$;Y#`?WlQ%h)!+mqt+E*Pvb!V)1!rs$Cq!cxo zZudgFU zi*HOT2;IAQW+hWGS^2xWL0W<)_{5*qUY>v1Mi+#@!mC}MdBj!3CV+W@m9))$`-ufj zi(hiQer0R3r#k%M6NVQ!uo~6|2-8PAJ zw0+1#39S0~xieU&<<}}S;%GAFhaG@lmCRg{p%d+@hcBzeL0LyyQ?8GV(A*P+ZOL9x z=%I&i6D^+fxK#}9+mkLx`eNl&(fo3An+fgaGU#wkalQ$idmp%NC+e%I9Vm*FlGK=~ zykuCy1yMPLZ_G!0ICUDM$P; z!32h$*5^yDH%L^v^rid$A5@Afo93@+J8MTBcbM$>`S030Qa?R_wF^~|FlO>B6C~&F>9+EduwgP@7@jPN;<&jEUDGDItErJ?O(6A_uz0uD z9aiVd3lX7y+05xNn_VpBO>@MBl6?!}af7**!Kxkh-MdgslFG?aQWPitHl5{?btXY z{aK@z-UVxKY&6iF@(ydP-P~@E;n(^5#3)E;;>_oWtJ! zAyN8SN^lv>5t7#7OC<>M)+0NIkYd4N_O{Kp%sULxtR|KS;C$-;#@LAV9N zdV|CXe_pHnnsRaw3eG8+fKVHUJ89o!Y2aZu7lY1Nk<7>{fqlqIDMdsXTroj_Os8gh zAjEFDT6Kgq4H9gGzs^|NQtG<--KAUS!Ql`ARkU80O4#OS3J+DMR?CjTHzsD{4!#Z| z#J4Lnjt?ECZ4u;0y;CCb;xhVgY%@?WVai7cXovX(@fZn&?t2dJdAmHVRq-jX9{_DY z3f)vXqK7JrB043-AzmCK2cvwVFZc6#A0v$F9KowQl5M=-!xmk7R+(Z?QuSx|1Z;dE z`g*s6%}qi`!*?c6D>wV%QS5wcsRqufce!-fEvQ(>lQe*9LW~p*{l>G!qHt0ydxbhl zpfH_{6v} z#YIW2c;)Huk15INbiyhJz^Bc5`C-^ixGS+@j3#!lGICEMfzyT`L0tnSNK8 z%b%A;dEBXv>CghfX?P<|UtTB99W){4?udqHdF3<)71Q(G#j%kbug z7&UK0`7)q`E_2v#V4e%h032=UA?>lHM)1=prZiFm2*-oWp7%BI3TcRp=%}Z9xZNg1P%;*cV>p@F_kc4$QLuSm^>N}F;##EI=5U$%8k^>zvKih zgZ0RGvEPq?v*_|Xy<44%lOaz^FTa_Cv<%q{T!8rTkp1Li+Lu#aC9Wr{qfx(YF#|Ym zPK&e3DDc}ZdztYNzDq1Ln(NzGC5lr4)n%Ik^feBsYtGb-Oy~$D65#LiLH&8uJ(%MF zYP#eszdYki5j#kg4id~2CTYcalnzRRNkjqNOS7%i@9G!!#Zxqk1ScGJ8*UdO0KBQ?&f7+=yX=O72_8 z=On99pfYGRyp6WbK{(7+6!OH7VKkF}mI|HA+KhGMZ&NlH&FweX&oQtHJ=9l)uM{wDKhZo;Fn-$RHgbUXb`;=M{fyM>Ti-8%^t40b3k}0jtmSU= z^dS@`!<0LbcY{TM7ysw=Qq1Z31O6KgYS^~b2O!<%dFA~zSgTtFuBT?_X|>pF+}%#w z`RG*4I_efTUw}?F8_BWrZ|sdn*h^mYAmqxy#y=!1^|@zlknm;gUVd9lC!+4)S5TX~$DyJjJILympHg%RG}3_j$%doN`F- z6GNr4Pv4;d17TNuW6TaKca<_c9?fAB1@>{)zF89dqluRY4_aN8P^pVA(Ag-W4dAl? z4!%SM>xt5mU5LPpQRX#+5n79)*E%erlaqMvI{7J6-e?&tIyq&$5u*Xdl_~X%)6nr> z>C4e<<2$)YNqz?z2PEEqrpm>VTbm68utae1>fL$^vCx2N>@X^B2Pyc~@m(ioZ!3>F zC8aj%hRe>3D)f=l( zM7w3HWojY6E1cHcHXj_uRA-fK15RuDbDVstxet#%B?dls09P5Cc1Z?!D{jHljnS{KqSo+tc&y*nItYwij*u|wmEy?g8eJ= z=G-Z9*OX9(E)TFZ5RZraw!eeJ;4MCWqn!ghra4@h?%L~?06sC}Qxbh7}^*WlW=p zXp|pFchJecfac@&VU6FOsit4HEd73l!XCGjh|?cBXCnc=aZfh7FqzcX?GsaGE_pih z&hzDTxtmhKV|U)vEqOY%$L@#;%GYVt?&EQcUyH?XYiDzS`FUMx1Ca8^uzjO5rklj? zZMR59hZ^4qBO1eR^Mj{8DFmi!6w;gs!A)qN;>ShIXD$@6RX1CNI-_9NvR9Z#bmFV# zXm<$dY<^&9^0)CXbkuiq?u@7&Puy@+=*RG zN6pe-GcY!J`udWueRwaxrqFO}6 z8I$+VwDg#3ren_IPPTCfoIYlLv=lo0pA5b?x-ajZ25}viYq_8~)V+$>L?JuNq&?|U zHTnE!mPD#aiTZ!YSDmN%4i;;?(&k{v(jI1`Qu=O=lo4k_!QcrKiQWo_ihCC0jS{dD zKxmVnAVrF2FhgTuQCtfT@j&FCPlV&aap-(EzMFbU&)H=jV^KXO#b;6!k7pc}7UXz} ziX3c6;1JzbI?qRaZAYhSn`!gk?jZcyaNnZYYP~j26CveunQFkMF0Hw)I-&HZ4dB$k zORx}lB6B*A`~-Ux@b2YI-}0-{i<9u(;8xETMnv;R9MaCZ9kf&M%yYoxKOfELM{MUI z(=32zo9a!~DQmq@Jx4s8(C8W0!tCeSp|JRVw(_+rMGVrebUR4I0P(vtUp*}zgZGHb zX%I=GbccTGX|5V5Py*^lAQm60Ei0YAGo;O1^@h{VcZ^Yu?sqXNqdgVxf`jkout&Hc zH;}FE$g$J?9@?D8r6$HYFlIoDL(?%K1WxgDzakwQK41j;?PL(#pdQ7$%v2YDziowA z4YWWTVPiH!Z*3g`lw`))dN}8Y4W-oKk#4Hm=6X~_nSpaTQK}!E6ec8w* zc$`eQCPXkPOPhF~%{0By{Sg`RMXgDidOzbp4)qUhskO)qsH97(uKV*<9F_IGrB=N# z9Q+@@H0_2I8il)!CZ^>oejSBQLIkPwL!3YN&O`d+>;uVAM=5+DuTA?EtCxMPQ(pi| zU;uJ@ZdTxoa!}yZ5QZM1K*#x?Q3n4P?}SM`TBFkJG5|0+;(?vG?HPAB zYD8sK9VD^-qLkx6Xv{@p1`Uaxi|6&=$dE!7nKJga`G<)rmNqDP_>JCLLUUO~w`?;l zGc!4*=d|hekfTdUo!+3h`<4?jdEc4=fd3GubDha*$KSuI9p~e)WKGX0G{f_iaR)DM zfUV>DZdk)Y5b<^YDTlLcAi}I%V}vAQGUPo?q4vP9r8S+ZrXXCnP+~6GvB;EOYB;{B&y-QM7w?E$fRya9n(KhG8h>_@oQwVs=w#LRtso9I@GaC{PVIU zv)?(L6?}5%`bJPiY$ZT)M;>ZWOuKc>WY4_nCLR=IxE`+;0xXoP^t8Ue3?*O-av1b? zC)*8lB^8xuThdj1O5n=*HkjbE<+sy1-t%jyFTAQS?$iM~x=UxpTj?9AfE6bu4T;}# zK~56dc*=M~_9Ll{f1c=~!#$^Wk%OfBUznR#5mcClw}PR*cOtTq$*7@Zao4f2!_FBq z#bctu#bA^PRE3uq0RXp?Nz{Pg@mjCiv_i3PAED=pyu5LR0KXN2cgeRXv(hoZlO>IH z(zOjXow5^8^zzgo5LtGbd57jO15Gso`O1C0;#L+X$|_Ezjb`)1ag547{%-26QulM* zV0;O$!xUbjldTvFktqREP}-!BtEH&&W1{}Na3W!tZGNG%(f_dV+I-4hCR_xWw*TGP zQyRLtO4oncg4iEFcF4GNT*XF(2Fq=5^ByKl(z#?Em*DQP%o4jVHERZD?qq*$$s)te zr;^+pu3<=KJnXfW8F?F|d{VcSoCD_I-8oqBr#A@a5#ld65dD(TE##0Nb#+Kw4|Fvt z?%j8?kW`wras9Eggz>KIyI>RV)P~2>9LL!?9KTCHuvbCh#vBX359J-aX4w5Sc)!)S zeVO*trn4=7iKq&W)M0mh9+G31yC#+%FHa<- z?G@M$Ds-fV*u!Er0-%o&C#uhoaL4!# zhR!ZU4<&L?^xDb8#V_^dFMm5ZdeucJQxN*XycpX3eXk%)AI8vb_eTgwL{Re;Gr_EU z5-fdLXF)CK!4Uc5=tv9TuTOUrgw1`W1v{sO-rWaLgg?CXYCzt?cIUsC&ooY3EsJQ55Om@%R2^nikbtZ?2Yb=W=x= zTnuW?a7r?K(qkoQ1$z8y_`zaR^}FW*E*xr45DWdZOIx&??#c0r$q<&aS316Tr;Tq% zhD7;3$&|Sy3eQ|67^YNuCztjFs*r-9xM+dXtVYabQ2~JomZ7&s0?BI`7 z-~rdMDSysb^6!tA@gPMxxh5rsts(5E;VnJx`q&2o*_SZ1$L%{@TwEyo{KcoOe}V78k@}JG=8iHBY0s`-M5& zM^sYjJ!xNYzQQnb*vBb*ipnsC$UepQg!?jy*7LLDYBe{sbVcnZGA8V$$YM^?sfJyU z&11GRP^M__Wh+OIoTXv@wtYDZXyAy;Vc0c*;cpWjz(|od5=M$a5T$L#yb@ ziVFgR7>NA%+iOLHAPP%^<{+!22O>yb%=OWTQk#S6T%K3Wy|w{H1@N2d2e^QhP5+(Q zJNDxz_l;}GugDnRz$C(WPp=$tTK9M)keMT3oxR@vWZmEO9|IT(dm&gKvN=3REzCiE z@o5l{jdp3s=FHRs5+qK?zj^cXUiT6&FyxXw!-;t$JBuaySsP*fMj&eDOX6tFQU92h zznU)C<~=jv@e(u0U6a)#SuQiArgk^a89FQV8z{-y)~Hjb+I{-HtWfX=Klrqczs99+ zR;xRQnn!@hMPrx8&3k}@;(3v|7XGN+6iT%6i*{z$(z?SoHu z{Y673rhi0tSqb8HMX~O#aa6s?)$#tka>fjFA$g00pp)C2s(cb;Q+s;X{x&u4*!o+s zCP{iedHT|Mf%-dRjc46QTKOuJKq*NjLf=3#Qw=qkKCTYo5r!b)j8raH z2{mWU&-FQI@Y~r z4US)qTh$=lw`B)hHz9jw%Y%jQ#}p}s;jlPz$6_#QeQeg+E--OX96FS@k%J4~+eY8g zPkRXMc`jhJdbYZq_L0Jbvi1@D<74P@igW0?Xg`9;N^0ikmr=E|=1UBR7m6^r3us&0 z?XGjXG|mR*pOqxpV3zlZ+lZ+Wkk>RBaDG@2IMH>pNL-f(3_n%2ys+8n%*4Awx9lrjMz&wP z6)gpH8VbOB5M^_^Fem+jRRMnn*!(12?Yz{dKF%@rO$b77Sl-7rPKlsGJy}hbUfctK zzLy$y)h%Yh|LQ1(K?l}IM7NneqS^aQ`T3bYjp4tsD~_{s!s2*b{>|5xwsP9sOFIB6 z8z*Pgum)0xp!&pldE;qJZpCb4zCEO8qHQw+Y#NCv{>;0Fm`lP5+4&K1jea&RW^mzz08 z1#V{j3NruhvVnu3qS`>9Es};5s*EI?SErJ?vCcZ#56chS5_SU(HK`U}z8Q zxtj?Yjdz6Rg8xiZKna5V&XEu}qf~L_EYZ_Wk?maVEhX>2oOau+vIQcC7IyOf&RFgo z`~%23${9Ye5;5G)F(bf<_y^R5l0J>~a!)mip(O&c*iw6M7M~M_uj^By7;>XU-RupI z(E9w;d;Puu7RBfooR3(&oB)mBC^EaSQpbGtow@#Zli9Tvt3r=BO+wq1^%_#at3 zgysPnYPp%Z_=g#fLN;JYd|?q6A8{md(@*ft==#Rm*FTI0HDzHSf|op1%1C-pM?Ry} zayaZai79#>MY*0}4C1wDlQaWs3vUcxn|)4?WQo4OMH+h9Ig9xApj-R;Y7^xI@m5k- z!tfrXu8VcSyoJ5B&6o75>*XHKRD{oO2T&vZYo*=V^qEcYxlki&{e zW4CG+P+3`?f@VY$6d@~Lafz^lKm<-BaTq<T}Y55B5WqUbx1*tXSxsn51f4*!>PE zGg7NIF*Ub*8kIAKTgAJL80E%`>PIc9@unh~4`UZ76djcA86v^bz;e5!q7d)@F*8!c z2nuW~n29|Gb3LYuT=255nOq!csszS#C#Nt!T{!qg>8n#}$*IGekrNG(k;A8Uv~B>3 zo^);Ez4{9C=Uss>f(s`;+|J|k+iWl{IbJ-DZus2nI5 z9KfP^7DjWLlw=NJW({jLBU}=KFXwJ`ew73?kSi(j=8Ud|HGgzOy+Q*k49~{(J5mBh zDIKqPAY2VnXHAXzlTBlfE@h0FPok&%yv@Am{h9}3lw$g&^E^GXavFDzX``(N^7&wC zn}is#Onc7bTrant@|))X&ukT!>S7fCyyXEV$9dyze81mjR*MtcW`fO#=3Vv$xWBoa zC9eaHtl5P2K!DPy8LtC_*O|6B~!KBk>yv6}5g2Uk$H~93b>inQ9Y3={laRE3`XbApeCZ(IEn^t;*kx)obc>R33iQw}J zoJ&IMm)7FnSfB0TnEa2?vo6ez@9<|EW3t@(^Ueb)MDN12F=G6hwos|VnazxN&t^q0 zL@=z}rro8UJ5gm_kJ=;{`qyZlzfp2x7{n|MC?^zI3Z9F;BH|!8df~-%ZBl2*Fr@_8 zoscc~pNjPa(GA!U6=Q2^;|FhBZ^gJTxf0{o&#lOFzfvYwn6*G26}7O1B+SQ7c)=3b z-OJ#4Pj}7iwI3WlB;R75LYF;iZ?Z*KN)Zl*CC_DWVxT(24fN*mU#TnP?v`R;D=6w+smWYv9|Y5OW{5j5fp|D-AghcbiaeI@?`Uy5{JV!L1pV5yh%(Vcsp0O6c+gneI$3k zge<2I*%r$q7euj^F*b0lm)B?sO5m=LP>&rKM2lF_=v#D;**M1d$ECY~Cj=|Sd@4Kq zVl2h)g^^C1M_#Sl_*C`MntOXnAkQ=Sp9i+~0(#l+g%m;lrXo`IrxcFJ^toSKTa5mQ zkZ|5*3uG@SN)83<_0re9KbLW#X*y>a4>AN(RnrK_xZ71LofxOLIlbRq5j8R z8Uqgc_%Gilsa^`5pF-tkK5ddyaNj^)hQ+pm5ZE-0Xt|k)*~g{e@CZL-Gqr^YC#(l4 zv7uH^t=Z;>SC{k)Yrv}N@-C9Gs819%YdqOr_W44?No<}sss$!_4a8@(y(@}YO;x|! z9-E$&B;|wmwU!f5p_5d1xPD>rU(ocq^$KH@;lsWK@5iXq?WlbcQDv5hgg@OgW$f=y z50F^&Y|4FAMzBxct3S1w*QXjnIDP$U5^VHgXTkzlT`%F@P!F_gie7M$?*` zevvt2F%9uLm6CFZaAO@*;4#}^;@=%hjP4Ic+5E260!X$JJ6nxRKlSFRyB|hX^v0*V z$%^V3aNR|ofqcB2TAP`hi{sy1hxI;Eti7K&P3NDht>Kcx;xbjjUl-(V7u0m5;aLUW z2XYU39b}5+%7NzF`)7daI{ekWPoiG5q%Eh@jDyVS911qefL1L_ieQ{>#JSD}XlUWn zcAPBjDq0KwS6t5{o=qa>hD|r@yPA95n7^TrI%MG&p!9Vqy+yi=V%qr~EVu3y3VuUU z6oJGgm>pmhu={mkW4&jt&>RN2kOWd|K_mYz-P`mSB^ORa9J`orq*0ZmUb|d*}(^&xod}jLm=-6 z47Bj0H9mO<+41KP$U6f30#y^g(Wk%o*yqD2cvhySXQfi5rbkV9wPb->s-Qt{^RH;F zMTt9G5{P(()AQ2yG*PB7V!4MvroXv4b$|Qzo$}0QJ{1Zr3U-_i){fJZ^f_5vJO9bz zW*N#Xhd7O3mg#njmhKA%Js;h|$I*=a^b8v!+*2?3ypjVo%i@~Y!r zA*a0gtRkPGJ!a0tu;1j@lzK6pJ3^46m)_>HPguwXMF&<}fdPG6ecU%=4h&AiVR zB-OX4C7I!3g*Fx!lE(8BCbt_rZI0$2yEXyl|{pvrLADhvfPjZ&fBt3`*gr z9T%H^451|P)WU%V4O={0I7UW^hd|QBRyJp34-Qjcbv`EZw$jzXi@^`HKH{qR8Nf5)4Ik`Y%)kC*EX-Gbc(A3~YrgcFApY6L zRn(7scG*$b2_6|F7eqHXIjn;NiQtWIc!T`m&sWO~rh&7WrIsY<3RvY?8)OIl^)-i6 zg6ZpP{k+|?j<3(8A94C&@Ei$54~lmb^dS6z4yW(`_3G>7GoSustldwLta)usCikAY z6Ahlb&9sRe@3VBB5Hc_>Oe&Ws!0f)eX zK>+I?WB2x&JnUf)k#k@S%tZl14lS}8=8A0BK=FtNJDUGiWc;<$7OEIb5^7B2q)Q1zydym4E^lwcmtIRyHFfHq=nH*E?&f_=R9+jmcN z{x!MzAGax6ABr^UT~kxt>-CzSPYoBmZg?iT;K*>=(P5oWeYPj4g))7%gaQxSckYtO z$tii{BOWTnlBcz@gly`idC)@wO#|lsfyRmF`Qmh*($~}Zf<%`2(EabA*ZF}HezGh? zN6R7L5b$O>aYFmQo^_`D_P2jf>)?cSAYp-?@;!Zc)}6mTC&9Cs&=XE22_-L#PCIyx z4$ZM6WGCn!^eLBza#O0jLE2j$cY&!jn&-G#ZLebBHXOkB1$y@LsEv6AXaBDak+VQBNN79E8q{G`F zPx`t;lCjaFix+YXJ&~hFV>U8fr!(F^8NYpxrM zBGRvZL}O&(quYbvISaZT4ZrO89(e6sGU`Eo^mVeBS%%W(;nQUO(|wQc+s`YFv5g1) z9_zF1?a|MI=OnZk#*|AE*|!IXvt*rf2si{5I08o;akvZ*7v;9w?xM&5G@?xd`+hcd zbo#7rI{XPXis+*(DYu^hX_7}Z4DB&)CxRApW@b*dZQCaIz3(B2gLoX~3mo={&etK} z5Ex_xqAlDY=cW(5>volAyHm}u<&pL`&t_2bIqywp3u6ms#`Euk6ntNIHOL4g6;Mjp z#PsBoPL!Yi^l}(Imj$;W;l{5UY%cVjMn>QBoXlx$4eg8g#ivH1a3a6_dQN&y53l4L#?5@VUND5RR~!wCLB48yMjyuMLXki|42#yt>2C*IhcB zwW#s+9!xLFq4wbyw?4F=I}bJjN!H__08&ETJ>u~D$l0Gc4;}Xq4(fhbpS`-{4INS4 zPCtFFwLHa5{3|mgI45==K`K<8oJ3- zf)i=0B!kVM@(BGj8@l1Z7x@t6`ND602bwPqdy$sishrk@8#9FB0DKa2eVAeTejjWj zk}%WQ-wyaA-#nb_B?7u$+tSqUpY2)i{cJ-}ntOfLA2q?S`dRQCe6Fv9&v|X5)o!lK z?M86n9Rd!4!9c(+kcWAvkh9;ud#f&g*RGxF%r$U4;U^rn^&JHjUm#&4MFEErN)fZk zN;p6Mv5%COzT{ZhbM0CzrZ|cY70-2_$_Q}WQDf)MopSAU*U4#ToQa8OH5nQjQHI!6 zsHM;qW4vFBKWqjy0ex0vn*MOJ)EZYggyS!1PGf^pZsqZyBOf4tyy|NBQwx=ho+9La z90Cr3fkMCuKOGkr8{Z@@Nw_3oY-ynhXRp)3(de(c&ifAUZW>|gG|o)rBCDsSqS7>y zG8S(7w7U=DgdRTA8X@)Vi2nV>Fa8(#%U`ZVhfj?RJA7WX)A4)d?g>7gAu+$rDA=rA zu}sc-&*{)C9VTT27=kAkQ>;LMQ6~Hd!>zSginK{)9PXvMeAN;;`VkM7UtRhWP=dGv zDeA3nJsk@${ux3_QRZqx^o0=Qaq3lVzb^2LG3=6kg{BMICrD;L zyYvz{<#i{@YhL?CsUXZO(qVW{xbkU}uEtnn$>g*jpVL*L1xo88^{1{;N=q*i&#eCn zz$W|#o)v)?9ka$-lD+fj`*fK`cIiahK)w%tYR#`qz8ErXd)+)0+mm1$SB+L|Ta=#r zVd>LInr8h_2qwUq>ut4iOf5;cI66-Fi9^Rda|jF=0%iwnvd_-i>sZmkKWh4l!u^YK}&_b)Ma9> zB)_;~Qm(y)m4ST#06+jqL_t)oCbw=zVC*eXfB;g(;1&fTHjYs8$Z%;^#)@-t*!o5C z@S_&Xf%_C>s4^v={McF8Z>%I&{N@kxo`3z2Ojl-*w$~|BI#SGbWI_D7RKLX~vLP10i z?*zH4LFg%BdNsuc4)-itG$hwvdp(pPo>nL*05M*i;G>>13`B@xVNTZVvxj``%jZd{ z>=_d8o~_AOzIlWEV`EWf3rirP(9Q;$AN9G-Y3ST?Vh(Y^4X*i>J5wvm%-pd2?&h-m z{^s2>T-znfhj+-a&puf8-@7Oef8>MZXFvVETy^zT@|qJ*mEqAPWJ9?mB9I@J+8@5Z zik<}S7k4mEiRH;8AD;%Jd45)WfP`bh7C`7sOfv)L=lq(Quv}rr_iB~WHH+hMU92lTIkqj*>YG*A3BVGt_wbBKUt3tIN$*J&u@Jj z0tSbp{7~i<1qD8)nKBPfORvsN$#b9iL^=EHk4X)Z!qqod<^7+zMef`-3ZVx>QJA4s zz`8*tXnnYGs8?nXbf^V_pi_q48J9``D$sfnnjQ`(a|Dc%mKs{FVn|G=A)1A_Re^?v zdZwCeml65Ok9NujKYJBye?$()RQ*dY`2hs7Ih8Mz1mcljk8iKT2oH*R?H%%s3l7`S z0_y5(u8~zMm&@#21*z4wQh3tL>37R41BTaSWtLYnS_9!Re)r+S0Lk zK{(jSlwsd<*1O*(Z+gocWE#HbeC<}b;0L>8y0ioW4@3`0OEjjY28CK5rRkxz2iHtW z4T0gJjIipuuKnTjVGN;-Al@PfMx*FtOAvr~6fqSYIvS);@v9^gvPABhJy72B>A%aS z?U+dhzJ77p4@KrCmDa}7>}cVqdFE6Hq69zau^>rp-L^ySkJ)LSz=TtbP}rQRd*Tpq z2;>=oBrRT^`FFfI1Qs*`HjP6oKs+Ppnmqg=560FGTtkP($rNmwJ8DTN&TwYd%xqQ8 zIO9F?*e5*}wmb!S-#Pz~n>WLlxwu0Xm$u0PE4IqPtG38q~hM=>gFeUqp?T~}kY{0QuR*g(5e}O**paKLS>S&O_kJ1293k16wUSp`Mh-Zt+lXAe?O|t)*J7mwXt+IA(v)q5( zR@rySE?EpQq=X?C8cG*AMV>R(z!=x#nT9~NwKgta`=6p*d0kb8;Q#YWz7Mg5f)Z?b zR7eU!o~YyJCwj%D0RH#?E&(==M|e+oY8@*|$N4w}90K`9AfLhyTN@l{zG}M(w^HS+ z9)g{PKDwDAY1hFBos*=g`3s(t#7i0`Enms#E9$BaupW3vvY7KPR1oQ4?$W&<)WYCE zwYcwLhsl5c_UIFo7pd{BAc7!;e0Y{YtYhR0>j?e!4;T(CLnxf7(+|f8wgj_!1$p9iKb*-!zxe1!-aAV(m%S_ z{&wBDI1egl$E3(&;-Lh;1+8=0ODErW`nMTj#iH@hm!#ic|vYL#+@Oe>TQVvA?wJSJ1 z9>ZP58CkPJ?*-;9%!u`u>pC4zw?ljB3N%9#g=O-wuiuHO_Ei~QG%6oB^Hi8dL-)hJ zEs-n9u8Aqd)PDQzg&56^olSCaWfb?!q|@p?OIm(fEDQ7SpT=DU-%;;6E_9k_CSSbI z(s_ap>tVf0CM4c%zLKy(9@vcsk0kM27$WAJL%<=hKoDS4S;er?0sF6$Su8+U!L_Y> zr$$5_2+t0o0wdz@eES<%VOiwbo2qi}W=wRaO-!*Oi;CN2?Go7cz%FOS*sSceydXaz=i-W|8!DUW{C(aI(%7)N(CLBGzg$yci*vGmqCJC1@w zU;!ZDgr5aa$S#Wu8v&(ZsejVarlpKI=0_fJxZH8a9TXix;3!QG1t0k8g9{Tr>>&@7 z)qAX#IkXtx{Qf_n>ls$-0hJM9Yy<*M2}4_jS!ip<)DRX0l%b)DEFB-g{fw+zF#&s^ z?efnDY?6Q4f1@0^ZiD>Oz8mDB`)`p)9C(Wyvd093q*+-!hVZlnLOMgmS!j`lAXLra zn2;4qFyo6uWKbWKFU&NZ8kIfsBlAPWR22-PZc z^0>!6My|g4ZxC?8!VlA67&Z**KyP1yF!G^~{u@?XF31Nyb(K_y#;~pr!a?vU!*9tr z1(F(unToLWp$*6oY=TBG{k$quSoE+AVPXiwVblQO3G9bxl+1Z!bMWWD*_0A=xE9b1 zq>sBdO~}OT5Yionre{u8FBz5*YKO3N5Li)b2ElAd*$PqfQ=>*l2{#agAlwzOgZvz9 zfUdq}Otw!AV@iJ+8>=3wo-u#ToJOLG_?P{^%Vpnv_d!rB2dOkm;aClP;2pUJW)vcm zy9fmfRn1*;sxG8Mz#-5a0lsz4#UP*;)8iTKd`=yCGmo6I+I6;2Na*-NN5*ODDaZP( zD@In;Be*youWfXdHYY*8$fM?u!94{?O%6I}yJW3N&t4%23hZ>?vaagv_j>;X|DzbAL+8HoUQhayRVt-_Sk^%kH zly~G0X{ZGaajrm6+KmCQdv;XhANTHp;WB2JE%LNG#p1NGH&XmD4kaK6DwH#*jq!Go z<{hs}m<2X2pZwZw5QIwd*|R?`qg+^#yw`E?u)vLS)E|K<@2OmO-3_v2@raC!VxdMv zp!SCcHBWSLgH(EzY!%S>(Pf*o{EXQ%`jGu)w6_yR$Yo3_O9WTvWzTC0u7@E%rm|t7-Ij{ZA z8>W17u|Twso40PW4(WJ80W^saELJQXl_G3}wnFQ(dwLYZRnVzG^`e9rv>p^h<|>>< zUXuwd^}KU8G%?tJi_!|yP}^0guTxKGQD1`)V3dr5=ajv)K*MLA{)Jjhh%_*$o~@3` zrcFDjdV!_~)9O_mrcYZO>@UVM^e}A5!i^b>xsih*>@D`C|GHX9I_I4I32(>@VM*V2 zLBYr4hbv&;d+#PW=)eO&B^cI>>r-)84uSk3z`7f*zxm^_KOBYIi~jK7QgsM81bT!3 z?N|2RYcJWcV<&_ltdtzEXQ4KR2SovDLQ0s)_1^cLiG>73zWu{{AmCt=QnaHKd?S!J+qbI7OWJGJekzqY`_%th3 zBI8^W1e6^@lV{G`AuwnNuqov6$cH~fHgDdn?z9F(2^)1w7K%S!hhLEg-2Z+sOBT8D z4h#c%5{W0AP)I=^S7KPMxD0`To1Idl;|(E^yf-XHADs@hJQQGf(2wt!zUDnGa(LF^ z)tEgR@FFxxvokZ4wp1o+2t$2OO?9;71qc3u4I0=}Hb*luCV#zQ8d|Q3JnuPAQwuI~ zsEtn952-8vhg)Y*Nc{WXua`p(IoN;Tt{egmfq8>Ku&wAzrgTFWJokl>NTO^yjW51P z80X;-=ph1ip+E};NmHg$g^K{HnNXuez!}w)(Rdb<>doHi)w`^x=?F` zEijY^c)%G{)sPym)~uYytS_d(2p;ofn_`gK_JVvd4aUbmhf=H1IL$(Xb;&Pp1cfPi z{_~!VGv93fB8)})At!wLyDP7h)vMMJ3MCAw@c3aKk~p1jFP}+b%)c<&7}qPU`IoeZ{{dJO4MuSr3vApj|%f)qSq<_)L3No^c@{cT$i za214xu!O+7v7zm-p~33Oh=UbQe`GWltX06Tg zqK}S3ApcuATM!kuRm7yvflF&w$21TyNvuHd++F%MV)3jgK|K@%?^5W#7dO!q`F61N3mxY1OugQLNi~)OtQJjt+Hj)?GR|@WYvll(6~%v7TB!px&9C-4UfSN z2i-Ake=uam*<%!HZoBz9S%lS{S1es3+qUkMt=lGLbn$9gvU)EFAZ*NOU|o}C;}ci} zagj2@Rvis!6(Q7A3&Uy+ANI}V>V%wplt2p~ zEiASO7J1x9>>|9R@Q4aENr~8MSJJp?!$m6!HK2Tl`t9;m4J=Jszu|G|FEj-D|4J?# z#7mqq4(-RzUArKFU@jI_Axa1eW56a`eJw%?sMM%UVLUS|_VpT5sub0%a>eFt8*h^_ zY)pFegAd07f!>mW6flYT!FTy4B?|(o0NUltdN8Ed;pX%5Jn(j zU_Kg-VY&0(ZF1G$Zjd$m9E@!>IEYoi3eppJwhAH}g*Nbn&VFfiryM-?S6PaE#fF9# zLlZS8drkgQ#*2H(^Y(-gRl(wjGXWFNWX)Z5Ajsx+Zk$?AMvTay)_d zuASIxY~OX5`So{rxSHyL<9;0igO7j{epDHiBEP7zqbnMU}5PE z55@D`$yW_EGR>Sh+|(=_{cU_I#R;C#j%M+gXT!qPar`o6+9vnjJ!OFk)gTa7l&vwN zDWL)D`(Su#Xm~dkKE#Za!sKc((w$DXOQNctX(xCM?d6nxpl)dv@qbIKp|`rX9!6!jOLcC z+)@67!@eg6F1k(%Ln|R#W;j48YNRV zQ^SB3(t(jR^+>esp{8g39@uXSLd%*ZLoz-D?GHk!=986nD@pV4tuWhOxj3rtcpC z`H8}omq(CPu5n+-r3wLO>(=dZ*rA6;!s=1AW3?>3j_=znyHuO#d6bq4iI8X>I z#q{-Qj6YSOWzj-Lw2phTwJ2=NDw(G)4Irlt0Rh+is+z099*6=5?01$gg`u(%d0=c@ zg-)hYmd)FC%G4a+A#e5-te`QVH6?48V8{1SZ~%d*f?=>Z*zD}sU6p&cY)3qZO;A^< zAt{6($NpM0pa#Q=Rkgkk?Tm20y||C;s4kJ2;c=vZbhy(yVph2VV|50}LEtK3dkhFN z6oizCk_SrQe-rc^YIX1Vbu?6IpZ{) z`GidO1-6=CV20J3-+H#3 z`qs0Q5CS;|L?F~aW3+s{3^QbSKx@QpEOyTplepc@AgT9u;PH%Jl9#rC7mzb(fT8cgWQC zjVj)zEttAbt&l<}lx=n6%Q6MI^Uk|v#q#CRK+dO41QuFb$~R9RZ9?UO_XGiF^V1Y& zR@}TgHYCnD1eznDnq9va_X5Im)#}x^)6jiEInA$!fqwwXMI)&?%&;Np~c;0`?l7D)!viliE8pGgs$(jRj zU&P{tlc4EMvIoU53iVs=amKb_!=}x$Xw)+j4+jMQ2+ITPwREiiO1QFw%=Wz?H#i{F zLVooo^I6jDpBH&!LE;!t7gv_~$Wpxy@NGmLP?I$C!C0=ih;IRN#j0b*A>a_`6oD03 zcZXUZE_N6v*w4b&riL)eR;G%n;?x8|P=IMOv?m;j;_A+GFj&S0sPN+&JQKTSWONBP zA4R;>f;&oE74XQ1o;GO) z5i8R(paH{W*b5EAK4_*e3PA_qYTOP3f()b(ZoE1SVQAB(?~+yj{5p~QzDQ=TxCjCO z%&sxCwrc%hN}IJED>u`5at?pVh23r2wjDFtxIJssHIEey>wFvn4uO0jkUzCXzVLC} zCO-iF zsj96jX7Ope3oAl%vBX-rCObE5kh`w=0i>IyGXAhJeWTHGzP z0j^*#t_tjjY7ls+-Qji-d~dk^4-eY*%waJ@+6PhDGz;Nm)tc3^5q30HSOx8#nv)&S z0`0Z;zA7HIKNOg_t;8(oRv@S-6%aH*6pj!HrXtYxOisw;4?dq_V1 zAHPK08QD6rzs!xT6S?!xa@Xab#6m%&Qn7ak}J`EeUA*X=Rj92KA`HN$_3M*NunmU1+v~=k_QBLlZT91pTwV_S;!~{VdPtpwN?flNrc(uu%!76HGr4 zJaFl+=G;1LAX*!jL4MkZW(!)M`J^baMec#~1@35KopPXSvYwSxgb+d@h}s|3PqZi! zYJaA&75bt@!x$vmjUlF`IF~S09$Q5~E*Zl+Q-QXofGJcIc1lbL9U^2HC9`lysR&HD zvb46k9>uWRf%_jQfBe%`vUK@UIpThYscG#>XaaAvMWVS6hsbCo&22C!cTxCJqjh*l z>!Dh4SgyYMUaac86r)>v$VcDyU}iT{4I!(l;?f_(R-iXq8kOC( zr80#fE~d|IOJ|OH4UC}6vg!XmBs;(Od|6!CEMv11GI8na<<@VXAhj{9>Wt@i-OaUr zC|D&zAQYBU=D7lOHw2&L+_;bq0f#^q2sq&<3lw`mgI{l4m@e#iuaEE(cb63c{L1Gs zA6yN_#h8&bGHS^T1tNV=NI|Yq=RW$Wvz4agp+}Zv95yp_GqB6~!{4{d=H1w#y@&(w zsNpS6N5`D^IS46Sh>$`I1)n(xHe0r1r}kZwvSG)xR2Hq0;pO|uqGkJFw|AK4V3yd% z&D)glq=cxt0EDP&3jG|IpM*dI=H=SHV<$kXE<^C(
qar z@EA+of2eJTe4nhZ=2IPRg$>KbwTZ1za?jl-jH?3~7F~j8FLR!40&Qv@c+^oc zy2uoM*jYqlF>VpVOS71E#TfV9kCWOV)L_QcWNoed;;LOTU0RLF=W0!52rAx+%M}PI zp5O!Fg#r+Shw{*^p11NIM$fRpR`IzL1_dArPmDJQ0u-pY zx$5qjicFN3$nMfQxqS;~Yn5bW`A&Jn5fH#?!}7hE*T@I9eqAn|c$S(9zgZ5IuTQ>N z_B!&}Fp{pw39o+>qQHeUQ8wezCe@_(XbSNK={0I?=);qePaKZTWY~Fo z5YdlDrI>sKlV`%lf#d=k8Fb$25TN;2#cYEF`{%iJoK=K9WB5A!>{DU&l#1!d}0c_xntk1 z+L&ys>?;>vzFGEMx?JvmNKuv)w_-L{QHHQCP#LtjP$8$+6V?J|WvyDhMmBBSA~#=i zjqKXF3+v~UWcA7=vd7xh*l-m?XqeeW8zKr(OqWyLX<$8BTO?bi_mFFDugb04v6onR zH}X@IHH+?)=N^L%Ofds&Y8IL!425ket&#t(yj_02{UtI2A?lDrc1acM^laX`Qw^_i zb{Ld7N;lx;7B?XbfCq#sHT53v+lm#-6#u{Y#joY7Uph}-^wL*in2(Fcshz|W30
fhpe7?9_sNC54R0>1N$Qc*I*ctT9_r6;${`P;V z6_jaM?5zlG#`IeW@2x1nFnO8Wa`TOHz##|A3!bo4F8=v$nSoFVp%gfC5y^j>=5*kKBtSb0ba9qt*qW-tukV!Wi;h43OLiKR$Lvr zhJ_5dQuJ;ZT5p{$$@O;)%Rja*!*CaLPY}9lg;`lKv{4>>Xju+iSCY}nB;prj=LGf& zgO;iQ!38puY>@qAtah`U^~@vHJcbv(_;{>AjEe)A%^{r21Cm%qM3p8K3U0l3#f zt)F{pDcGrV=5t@L_bL zvU;o__t|e4TVPDdip8^7vS(TuVk3r{dA6&tUVYthpD}*rEyA`MZ+!8g2sbB}|N2id zIRoAjRbfO{YZ~DMK3A3*C;a517~+`Fol-wPf7rn5M&9gV<9P4EGp&ZlFvvo7tR=xxA{HFR<8Aa_R}=^06=MlpPq3 zsvs_hw768n5{N|mu9=c5rkqnank{ikbv}K!o{elbS%U?QQ zp7Qi(0}~F9Q3ML(7E3zeLr$%ys}daNa*BX%o3k(foMw1lvE@o_UKOXy%)&;1S{|>n zq*wtR3v6mu$O*?EC&!=oS}brljBO>bua$c1*|~f3p1e5rrhwWX3K+D*`P$bm!mO?W zR&_4O3C~+BOAB{nZq;rXf&f|=s>)$|Z?s3nMpI`P9Ib>Z?PI=)< zxp&Kq?3kFA4fk%v_7gCq#;{d+s33c-fdMmwj#&sG1RxQ5Rz?5#CAhCSQK2ZqjQ=*;0f&cdShXm@2u?%lB$ z7Cs!2VZ<0O-Xm{6tbpM&YPYD#VZNC!PotvC-9th1q{6|Ao4PI@ zABRBcJ)gq`!@T^J$IDOt`}=aA`y3=!UvnKEk|_D|@wC+>Etq=L;(kfTqs1keJi6qX zM>dYIlb+6VHdMPqMZY&ee4{DZ5RZoHwh!wLonO|ra_b+j-aFv&=xuJ?ZA9$!qd3{a zb?R#~bk;PT@S~A%XNSN%K!AN3N3jYJ5Kce+Z89@GC1-#7T&2080))%-(a=~meC%2M z{<>-IRS<-wFjFiJ$;&X~=^Gb*RrXsu2BYQ)*|2dFrkwAVZJV))DFpzwt+4;$PVeJG z*o<`VaR@#TdX$g}J0A!(YNHGc8&M5agb{P4GKED8$K?7uu<-KLpv!;xTWEc*l`nts3ozowEHwhH*e>q90~vjbT{suyxBYG&V^+4<2Ll(`}nE zY&I#ASomkMvO@lH>%Q`{zl_S(xgl(_IxP>{f18~3h9e+g)#UHj{!L!|vXf=5Jc`&b z#D*UarqRq%@S)B~9b)Ndn=PRLP(fBfX z^kW_)D_25rfrf-r%@1C?l=>3N3`$}sLQtZR;Waw+q(D*^N@%kMO%FHoD%Ez&A^R+X zhKP1I7;eL|&oelt3v1-Ne_kzryK5YD7R!plE;;VmOXa1{!0;P{r}Mw?b$Rn!&Oir= z6mU<2Z!a~b=%tE_h@)Ub!A@%wh#`d^9y8E5{r-=CZU{!o7vZ_q^(=Tg8LLL0aKbB< zkc9Q05yv@)fJ0yq5NO^a3jvBlKUKbu)OZ|r(n2?nhJL8x=ZHluBzO4Ol{Z2mjOIvV1W`2WnI(O4RveT(ClW zBu`B6N&}_ml^@RJk2ASejB?RJY;A!E5Qo$rVU?L(a_E{l*!E1wqwc$1-v6fca>V{+ z87VE57ajX@`R0WeLm**lz=C;VMdO-1>VS4h)lrQ*&&?d_5HK6TIz&T5Wh~-|8FI=# ziIg$Z40%wo;dk@Rx5#(D{ayLV55EO}*cM?pPuDk%t3DUVkJSZv;&nJ2dC`JdFuLtM z3O;Xrjrvi42Rv z&LmDcRX~p)t#NF;dZ}n-7l}50=8+xs{8Fk<^i(re^|j`r8c7f-FbqGv#17{>!Pa}{H z`!U4_#UcpWmEE#pY)Gx`L&NDY?5nj3t42Tds0sP-8<)$Ap1fK{A*|ha-A(c&2wxjE z?tq|#-Q@`evf~Rn6zE7?|EkN_A0;9}09%D+0w^3z!PY3KAtNa_`3IcAnS65(lMDu`v?$TAqWqg8B!;sFg%k#QD z)yt+Ml2I%#56Y$m`TNYLKPlH?%55y$MCsMB^kNQGr|UNu+QP|tP3u&b1%Nc4*ckc z>?=nf?MGTP43?&8$T&$7tEEa=COhWUwrcreTeDgQ+3hlhmJm^`a@267MSXACBh}fs z4M*9ydad7*u)}WDt&)gdlYsS&Z+*w+yrmUj@+aq2>HxLJVsK@IwD>s}s>53l`r2)` zU3amS()w_+eAo@UI2w6oN)cgg#j2Hd{P8E*DJTEh_TT?wI%qWrVL@~(j`#lC`xtm1 z1MfTr{;hVK_HOTEAItz+HzcIE0d@|Gqfw{fG_Q!+t?Z*1)Co7**NDrwbHt;CA* zj)zkKca_x?p?z8>Cv-5yMxNSQ*4h+!0@tc1w0q$|T`}BV>Hec~y9$jHRv=R#v#uP^FNHeIk^Mm?^IqvN(R}8#qlx zEe%x8r-DSXU}r_k^2>@_E-Tsook8gAdp6Xr`^I!AWqj^Bl>aL+-ge<9&72DM2XSFKJO+FG#iP1|vYZS0nR+@)z9QGpu+D@N`+v4e}aBX+TKn;$_9)-Ot# zJjLlVQd3mgUyYWXfB(n72ttM4Yh@?2*Iv8W#v5@fsO0lP7F>)>dn4M2wfcB%}^r_#T80y_C3sxljfSw2PbsE-;h;jzDq0 z<=SLVR9jnbk39Cc1T(^<;(DY|W*$9{(nKBm?fU0@Uzm)`*oDVo=G8}R0j{S-0+30x=Tl;o}KXh54~5CzaC1eESR@l_$ix{ z_dmRkf%h>`F$St+GsC_; z6=0XxwKv>kue?4_pk$Gx`pA{86F~2O?hXc$LSJ_UwC<$)Zj6%_EO?IsZ8E>TW#Uw9yOEpXpCYZbG^xmKyYkSq#`_-t?W4)GJXcoZ3ITMB1DlS(I@&7N> z>i@wqLKpFh#mC;oZC>>4-_22^K25#sU>O!4`nkijteviva;n!>PrzTnp)Cnl^u6lu z*VuO3ZKpOSy+lsyQwZPlPY4uTE7Lr8ckpC?i}|}?&v2OIOvMy4;0N30NKK+&ugr!)6}@OZAe}9(!lba zaL{Iq56`5pjs0y8<@8+#rt?<)4rCb-#kH8?@a#Mb^Q+e=tU*FfV`GE$?$yhB_wMbL z*-OuLs$8F<(&^D_b*2!bFVTVf-|f?|M^n8_@duw7w4s-$W&eD{RH06>xi7U()1R)IJ+8r0kP`Nn8ULkPex8p-G69M%I z&JOzc$J}%ED%PbXjNCNzv7zs4=^Vyu6!`#UcDPzg8;40%TCL_^b{O6=RGNmm~mG+=;sjty5I`St7D z$Li}F#Avjf)cF!Hf@(QznGY|O?SqH{;b!@Y6)ya+vn|)_bLQC!EunpD$r9aHgcTi1 zJNyZf2#UPKymv5JI^yAi88=@XO_!R1r zDLu-XbXhhzUUCncm1=;S^#!!JA&WQx8n4A^38EkLDI?g-_`Vs zsi`=2c@9z>ZhgN+JkUlVBieYcUO}+ws|5su1`e>{!-h#I&`Zw)eJcxAbfWEHTG?F^ zkMaU%^pUNt5_BY-(;qHcv`CwJF4y9MMQ(GqXz@~eYZ2Du63I!>Ze5 z0|A?&ekpL33?pl_be2(azkW^5*oO=r;PJF8n;TXxQN_Oe$}2W+-kUaW!J9!-)Y4)t z(jK)ljgVuWS(u9*Mb@{T@uMU?>pCKYo=xeUgjONmDhyUxNh$*d?UuSq;)?EJVA9yM zwzS&T+iYdqZo9SZx8H{~Wh8H(y5SyNVCEq$Od3m_a-yl6H{O_I+ikmz-FExkt_3X( z7k$*ea%~}MWAa}jcp6$}`C`aQ?-5`};fwKDmC;TSKstt0?yGPtE%B&PBkiw$y;^(& z#)FQya|cAyC1IXdtFC_V{h!#$C;ZYrxc`T2#cIws150UB+)~)ZB?O*BFAZ3U4^caH z9R=#>Tc?26IY1g0Spd76!;WBg7iL!ey6Z=?B9H9eUMoSSw=_Eanwo6*@L_%p9z4i4 z*kGjhb!-zsztpB9VuC}Nz#v|nfx(SncvJB(>{K2~-_THJRgHDl)Tft?8aXV`n$kr< z@cQd>#3$ydk6dUA7A(|`?khysnn}@N#C|ZcV6OkZu)Ek(u{)^5cU1TR`So>GHn49$ zoeVw9#%Q0C4abbpW@de4#Hr2K{6uD#dW7Iwn?HA+J^#XsHsi$?v|8mYTefUPKs=SH zT4ltBkc5JPFRF>I)9AVxMq@SB^*+Q7lXgphXY-@mV}KDOc54aDr$sB-7q?AdR) zF!aW}dD0fG^wAqDHBkS(n=82cr15^t_X-BEMS)i}Xr%C)lTWbYe|duT)`8}Os6#m- zBaioTWdjb=P50gRfc?iuKVr9P#aBLZK2j8=@*e)sE{$qrn)xqzo1qRkO+Ii>Jfwt? zjyPNwl8az!WjDyc=eB>`rr2FCQxt%xhkNgRz#e(@QM=&0bL_L9KhlLG_6K_3y^n#; zFaQnKqT$hkhJG^h7$EIV^SBMQ;pZ65gbb3oN4-EWNDrGrtXb1ybJa(__~J}^L;cwc zGhgz-lH1SuDony^Ad}-7E+{FDp@KD3ih=RX%{F0tvkj0yMIYJJ)MyhYj@PA~+9k-p z`Q}1c9Z{2LuO?1liXzl3Q;2IY=F~(L1BUfJacd6o*tHN?DUD}+m=^6W(hzTn9#TuG? zag-V2NaD?pw2*?^tVx=rVM7Ml2S2!{jT<-Cd3Oiv002M$NklFjA$@=Gtx zvKL-_(PqE?hK>nXCP}v?H^MHYMgDr)t#9J#e7sq{MC&_mmT_8-y!7g1YPHdW!Xkb7`Nnc8gfrsM65(@(KI z_xcFKDeo-G!pMCnNefuIh+U(Ov2)MA(Eh9?{7f-+)ltT*a&{F?PlZ=@#ZeArPb7CpcvZ9Rl*0lij!n+yYkGSG3}mzwV%CVjvrOlWoq zcZLpud`&{oTbd$UC1bEPg7tP)T)NV_`<^EC5;z6qm3)dGw4(}w#o+JXa~MeDz8Ht$ zE1hI?t~H1+xqGdUPnZwM4rR0$(&0ya$qy|}?%x8<$F#BH5s_TgUXN{zS8`7#i^!wXkQfv^*O(H`^AIH**`FTCF~eGZ3?9 z&$d7OQHS`dzeIcwlUx!^#3%Aff_#cji21kd2XI2a<~PYXHJa9Hvzf2HVW*t+TSaO2 z?KBSk)Im0S)F>@FYP3n4ZE6!X-dGDKX4^B`U+g7mgcfU$u2#*u0Ec|N+ueE>eh?H8 zdg`UI>EE}>n#XQvlQ;W-=F~^Y7^_YKjcNL7nO%3?&0-KQ3vsGUF$=^SMzF56QN6lM z=>jbkF624^Q?Xpda;>AC%Jh&-SwR@Qb7L$Poy1%HFI=+B&b#muF}$_5)fSuChd;Eh zHfA#kKx3`Bd5nahm+aZ+UXaRfwk?){^cw9L2Mki~$ttdrB%gM^iY?_?ZWNNG*#RPX zjo&~U`Hs$|ba}YH?$|ovlG1xS(;E7B+|dyy0YpFnpU_|XFgj3V6ol2aKea?ArX8_SLMhWgt?>gU&An{BPyF&R6b0)5BY4H}}( zP(wV=Nlm>iS-jYG-D!Kf`L=&LOyW|#0Nej(Z!G z2dZ`qk;?f1N%v}XgnR9=r`>h;y*ieoR#V^pxywJ~5!f);R@q=ooG`&o`psz?(W9>> zO_?F*(yjz}SHe~TZ(YNLb{#7EoyZ$0Q^(PP%2=29@yYuSWwbbdfx2V7aF<_h)Dg9& z_=lBj93FJO>uj{ymLq-+1(*Oa5dHvK5@N<>t1JW=-lP zq+v=jdh`bN^2@K<<2p0&mDk?z1xBnu!xSa$it8f%_3eFM@4^r2yT*nZ8$Du}Z8LQ% zsqe;0WyjL=TAyM%N2=h((yGAh9qGbZ!k39C2J^sWK8exyL&wuU^?L1p&AJ}AqDtVkn%G2$sXP&h;bvDvcI-s1I@9nL! zuBR582Ia(X4$k1(1R)gMAz<+h!UP8py$g&=D)_Z{0}Ns(4K=U=pK9^2h4`@n1tJI2 zG4-zJ`@IkY#uHW`sk4QKg%8ROy|N;M&G{PCi84!ysv1G3K}%1YG!W<~l{P|8ozB>5 zk`W{OarDw^4TKZIIwKYefeUk7^43C46OXWVjjn36N{fkKKb5`9hzi0x9q^t1yvIIy z@Ify8B*DZoCH*>k4#F5U{@$%~>SC~_#Q*rmKl{L}vod$|-P@P~Y_iD*B+%Bl;4@*u zM!w>-wWUqlZmjmvJe{_$Or`C4I~1|VPu2du69%GS&>1plbJ4|)SK@*5F8C5x7+4UB zwj){l{rjEmL6ib6VkyoR-({tdET4$`<RE!HAi+BPASUf|v6x+XPrp#+d&wT4~;`}MUCj31}vo?F`B z!2?yPHEv*h(eEy?*WZ|{`V>-ySf?>Xa%nrCjy$}xR>v$q>RBY~Ut=em54x@o4wj~Z zn!3$qzc$x?b;56KqvmnmIk2>T>Xa=s?>fvLe_TS)v(IT7OhSPOg6i#w{3MAalv3qQ zdd4#9WBBe^abFiUat$GT3k|(iOt(%rZdCs3)M3`kNUpJ7?^0dXYYLL3kaV7)C zSn`Ma8VRRM+_-j)%DPI^BP(0Pv{@dh5iLgP+n!M63*zZi$qiPT4nu8fy zT$ez;rvuXwQRXqDM~ar$+7nMcqxRB^CQ;%djpsjjh2`J;fi@A_(rP`L-S!h=bHv}lBl_*Z(|HfP73+d8& zUm(;VJP2K3a4b*4!|Up`dWk`HFWHf@HynGx!Q-mc*Qi-~UqZX%y;XKdC)B&|j zFQK_$WhFMBECYwvvoMBs3C|~e?l^vV$8qPq5`hhV0srmar>~}vnr-t*oB0Z7C8F7d zRy+TK-`PCT2b9TFRD0|vozsQ{A&p?y=RGJ{kgHTr6+(CROBx81w2x3$o~qP;&$s_Q z?s(gF>Xur0x{nqR^|x)end(#X4?Xgj&3bjV(>RA7Bj9K8{m#-}*YC0EIJQD{sb?Ol~G1PL6s?F zLv)eC^4ag12XI1X4R{zE2M3TY(@@X8@Us2#*QeTleB=O|v?uA5jI#B@=r+3 zw?O*_Aq)^Xh1)J?E>;u~DL*cgV3Zd51Z&8KI66h_6naUh>6_Cmpq9j7Zjdbb2MrwL z#&S*iR;x%HYKc~EZK9Qu79BQ8^XzFWQ*;KcvUj4KtHqq(d~1=dSiVwaUt}va&&#U2 zrOTIVb1ZEWpiQ$_ZAVAGh61S|z=^`4!}J^%ekek|yt(qk@P$zC&L{H8E~)j>?yw1G zuf`f1ASN(;_;3lzq7$v07${XXLT4PxLn*DOlo|0Up3vhsg6V=s+){On;F8KG>;wd}&n>lNicMKy(43Y7o4i1%{*HNw>DuI>` zldj|ULS0f^DF1VxJyd&~ER^ut-~xX<^DJG)_#W#nz9;W4Bnj|NJMX9|^OwDCH8u5- zmamUS$wNITb@)5K`gV!`}lj*%v&#``! zdCT%!*ZcvKG`MrIl?g&kZw)Be-v(aC3Z*{U8xAc5ypW~gy?XWbun0P8N@|8`GlCN| z_o3zkOifX0#T2%tt*VnYtz^Qu_pP_yvgHz3+5cv_RyZxv`w~5)xnnU5TO;7eo4UA) z970178o?K-zh-y@%mt;Viw1lI>QY z$eZC9oDm3HXTb0MvChAH_=#uiu_vFFarAz+#paV-L9o{zySh!`^k-kNxmqQL@JO5r z(bKJbW<^S-M@=VPkFWNk0$EKpdV>+RqxKMK*0MaNxab&t`VUmvlg?3 zU-0+2&FHN=1WE;DxukCv)T}ri`2o+Fmj?>M*oa|+?aN<0!bb*toiSsEJ@BtbZO(jc zny6_oh_t6%LMABz$#j!e=xR8I`lMCpkhVg9;NO zX8t&tORTH>7!Z{QfzPKGJ;jJcH9kE?#)j`&HC%ARXrNjG;tDZ{MT-{O-1+l0CAd(` zVzC(a5?dlhu|{}VBMlL7BMb)*9995 z9#Z2r+|Wjh8YW>U2%3Zp!cDZ{saB`9L~7xu?SY3LQir!h?P9fX$q1C+Aav)ac5{Ue z8w3hB(z0#7`6hPquTQjnKYXB%1gV=O*(Fu~x#*cUKlL4LUF&N5$L zaejWV1*oJ;mOR-ul3~ar1AyMW>+Oc?uCkqW*+bdky_cp4HnN>{Vmty+#7(>tkHN+= z4Ju~Mdf8r`J=?e8pe?aeJ$nb?2p6ZJlj**b&&hg8mZw~vk~}W9`xusQbh0=|k*Rq0 zu|ad{LXGe^bjV=uXa@}%D0|X=+9IW|wMKC z6!(y0>YA^?{s%#oO#xfIPUg*jQ-Z2iJ88qvMVgXcCVSA;>gRmw8{tU_dtAj&x;hOo z*@=1lM&oSTt*5w&1^k)8>d$_Df(umijSNIxZN7--Z%ftr@NqmXP=!R!RRS_W%lc~N_dMa!XnJK>rOpHmKIlgl@)%F@Ng71 z_ZU3N{K7=gDD>~sXyeC?lM&^PzLyTuT#r5elwEoCbpj?7p;`xEr0hJrNTKnb)e#ag z-3{ddtk(xp#Q?NMqlUvidx&o=#i`G10(JMj_q(+_9T~aL7V3(#M@3YES7I?*iH^<| zHSVDP{oFR8dF(jt(J)N7?x&H2Hmjob3U<`!sI5BFWW%aCbLMKw?g=&Ac|pSfgK!mY zPQwP5ke^o%4cDKsKdG~UzRUJN**{IRu`vLc`iU(^@4kUgh9L!0tWF@-DNaOq4eaCQ?(z)#o8a7nb{rcDjS{*n> ztFOk68zcPm56ns#N01@^D~0nJnghS_=6^`*i7K5b!qQF)*imTlVh2>_iy0d&cxYL< z#O}ZE9{bqApO%2B)fIx7g`Ws74TY zUco>V7TvLnOfzXvnvCT|hBy)q77=|YBOQ`*l?V|Z3k{@r+B|+QzDI!v--tW3yp4_3 zcKx+i*`bFW<n>$MR)K4#L8eNX%8ZhrEU7 z*!G+jii7p&8)X4kNr(2so%;tKq-s{3(?-M=1px}`-0lv4DEZfT3Q+gVf05en(hzU8bl-4b$XpZUey{^ zu90Djrz1YM(b%z`u4`{49V39z$pTuDdB7&`hF+C%hNfA?S_ z!A8Z1T%JQs&mVR8=WNvIQJ(B;GJ?MEfd|z`zUKSq#r6k2BK@te{6)T#gx{mW4-5pu z&fc0|-CQfVcG_+m>!Z#Q!o2LVzuHS$G6yq8>MK-Jte`^GCNs!$91TPU6;K=Fr9-dZ zcPh1ponF;~YecL&Y`?YbxyK&f;h_$_>+bt(`g1c}1H@{zLOHYZMTZ8=axO9kPglzv z5qJhm0Kq73lserF$BY(J=&g=cs$7_=H~e;6s?o>v>CdS#J?Hxs@jY}J;7z!O;`HwX z$XyK+W(gbM1N8*Hne!$F%!g4&FcegT5X|qWondO@H`++66DHXQCQfkX!6AF@1gBlQ zWiMT-owQ$m%^5hGNxr3b-%=fVQ2O92Is`qKAIu`ULj6ad^>;^bNjf@3Ml}fbeWX4g zq20r-EYsedms3hops)YRJ*4e;t(?6vMa(*Q)8{&a>LcO=e{5IscA~g z;iE8)&fvUvg&*()&I7&6id>}_BB+JD+U2XL+z76Api)JvvQ6?+>(3N+$nGsUwxg&L>Y}`A|LkkS+WuRS__)gSJCEq70OkrQK{o z%RX@9G5~eB z(_~wd_@e;?X+p~!w98kfB8gKE438ClFcsKH!q=wi=UDDdJ{2>3R9s*!))eOJ>hKX( z=g(WD;~|#$xmob(KGIlCmTk}OJ5Q6%pXyZFSM2VddG19Q1jt9h1rvnMsjv{^oq1BZ zg)332IEU~jzFsAqZ@bMD+mmf0)CVzbc-P(c+jI$|OEpsvocQB<&ak(uR2rQMKY>hg zOg9xd{ff0WJ5X*hX;a&I$L(DMftKe7KmM6UF^wWXF;gKY!VK|wlb`CEr$AyMOmR4f z9QF`hk~pH@`oEJZyIvx+&{*jd1`gP>bIu0g_I@EfIpI`YWRyIquz ztcWLk!1(9Rov*C}W(L~^oqoMcxN6Zz3l*vhS%8%bEGRse$5i~@^?P}S0pwW49B ze|kyVw!z3zzOThZ33&aa^&t$*n)0FD`O9A}*K@!t`%>Y;yC_>L>Rc7>-o+^=>&7E> z@B=faG4H$g?soLiN7^BWe%@9CPX6AI$c^$#JyqgBb)dsGyZq08uv1Sv!|u8NA=MR~ zK)^$%uoNuVDs-G;WI{n$3SpC&AT{!mY%h^F6d)JVT)|)UAo@`+SMciKDbjPG-w+3; zeZ}7{(}3Y6`{s9k=(HMYuoO@%i?^jzo?~d*LA5%S$0D;5_}P;XtM0_@|<`0FS|w;ttvKR^7b@h0!fTS zd;=XVCQhJ&b3TxNi@rT}55h+=xWLz`H?=nj6)eu^t8*I%4eBqA>IffTuuz~jH^{1y z;KO;2GiE$*S6_3T8z;jvd;llVjx{eNPb#0cPs*r2@t#O~2%-2z7irF?n~5qH28?FX zr90f<8-C;94tV^rFV9D`86dkM(`*<&ktZ(fw`R$%4&z^@EjMazw(Yi_s)I-C-F)KL zC!eCJZ)xxpkMIZzfhSPca2JZ9XMHEfF|RQ{w3*6Wto>x@By}YHyZ#KV0*xtpQ0SL_ zkPUwL-S0>P77kFoUG~1yH9%acS(4Qf+Sj)$w5dW$oeDpNpxIAeA*vjhV?V82*>0;X zY{%`kRs&@-rnUBq<4;m$iKWoUs62065tcf;TxC|N)b`Hd6z%LTJM=8%Ue7 zvG25r0Va*jjq#+`WrMmKZn{-Fan@^dNVd5OBb*2;*Z;;>zsE+zOKda6^%8;;4wojJ z7*;%3E`*^R;Du?@xUUMGi|-92e~uaXh>XQ2OE88})u?e3mjh*Iz5I%H(tgSJhFGG* z^HAjn{fKUPM>-*`yjKrAWHq}mT32dHj+G(3R1agM-I*kzbNt2|%U+|mrwl2R-%I}R z2RBr0k=h&FU<<|W;{hXuOnN)eD-0rZxP@;K*9D*QPf_^k-?x`tcg+>H`=0w~xx0_G z6p2~@?_CpqNDb}Q7mxb9?Y7&_#s-RQs!ZQQMDX5L;fE3^FVRIF5#K`@vzU0UQ*fg1 zoK_0LPa!Qf+PLMWYwerg{Ej{G^o+c~Ur4*~6x&5w_#tH%!W4k#jkO2Ld1swzd+vRJ zvL1LCMxR_sm*gw>CwT*T4IOv84}?DR=}*{*;iFu`N?0@pbgpQ6Uw!p8TO>O&rfo=p zxWJAs(mZ*K!cY7b+IDfi;6ev}p0ji6@^X0e}SPA0yO&6J8x> z`COC#N^%n66yMkCtjn~k%57Pa_V3O+LOr>QdxJSQqVHGT4QT469qGU7W0MsU((k?h zU-pEQ1k1Ftj!hBQr;BYhnMRKYKLBi!HT{;8H?_TX-PtAg)f#>L`ouF-QDP@Z#$K_Z zW+O98XNakWpsvkkY;V8tlc&Ta&hkwPPbxYxDURy+-gmzxrqd?7mZf&<9e4S;Dx42i z($I1cV_b(N9J#hf#4=>aKx@{N)@Iu4f$hb?Ur@`|y1;YGEw{UYF%7}njdF!h}X>>@QrwB7sEwZgeSkz!BS9GZo6HhHMDGqGJz#Qxq*j*4Xy$$V-AS(jxphnU&J-f zow+Fdumb7wKmFd$Jo6m8@W_x__L&860 z0h&sks6U{^I1#d^mn4q(A$5QsvV;Bf ze}81tcHT!@snp4*GRJ5=I#Lc(IP#Ni;Lm>iBX!~p_CMeMiP|vqLz_VJQ%uPSA~Dx| zk8R4QYzR*q#XrYSMM$>&cH7!M`|PQB-t7v0yHB}3HGR78y1PsU((sMYzC*38MI|AJ z=Hl%ZemvpikMPzYzRAFOwAvcyM=^a~CoKx)rCq%C+G}==1Rjo1C}Ea<3!yuqs1t+x=&BLuQqeZZc3{&{U0yh^x9a)JWPo_LCUCkd-!;m66T(7v6)^GXFZY5sE4 zjW@ErcH70bzt$kcjywKDl@`^VDmGtN0f5KLRUnmGCBj2PP|X(bWo#kHbP#^hgblO+ zmoPo+sEm$b$D*;}A7sh(!|#9FnGma;Zu`fbHdCEC2C2RWPK=PtD3t;;WAxLIGoWPy zNbF`d+;9U5?HvL0#OMF^cYaV^Xq3X0GsDo3fRCyav?g<$#ugvR0#~74a+$$j>EXy% z`a5vLR}T{4Boa%03n9X9B1kTN2#FEqE>h#~q2-WOxkLG22pC8|F5~#wue~nAxMf-$ z0BxWWX8H*sP@RV2GIEajEzVgo^^Ttl9f4q}9uO?pWRRm*sDrJxoNWDMw+2(99Bk@! zja2RJFfZjH2s$AR8aVIC^75sS#}KY3e!(Dh`{gejE@RrA?ej-SQ zy|hWEo_3nu!fwwZf=CBR0SHFiktLRKp4A@si6topMOvYK zk~x);^m8;hRC~US)ShXRHr>QHU$IIWV#=o`E)CE1vRj;?Lo-_x2hNHMzrabhJ^xhZ zCs{W|K@!LYYJ^M}oBw}?T+^{D>eD@IEAcOEj_R0xB??&M#q7wpw)|m?8_>QlC?HF|& zZJLLlXSd#VhrO;-c2`THsls_Ao+)$_T@?EjdJ#b`zcDB7Bdu z33CPK?76Xt1bMcVALZN1tJM1T#1l{3Raaf3=Yr6KmJ6Ij2VRr!(LdrezW3Cf^oB`D zyZXw%*e-kQqr9;sHeExi?=A>G)aS=P_8~j)!2htrj`*VR%zz}6s#y5RDruo)<;oms zsylR3fL{ER76yvHmcEq=KVj_4W~?_}f3^L;|970-C!43zZlV-c^htKGp(_z(iO}iX z|91JGY}zh+X)GxF4(En3R=CG>f_+ut8wc3NwiN#L zSIb_h)vmkgW_#lCC&M5Ip-1s(=FZ#lElm6))&3%m()TpJ(%*Sk5+yZ5uG6h4ExZyp ziVegw@D>UewZgzFb)n?ZKb9xbP4utqUK(qC3P0c`+CDl@ z01uJ@2KKGDuYKhhuh&;!n`5{9<1Tw`-kTBz*U$7i7A%e(=bXybnerYjx`C*o1n_?`Bj5>R-0h` z@>eHm*W!)rQ=dFo8pK|j^80{|88gbBWEIDZ=WVVGqt|GE6Sp5j{jYeUGzSaryW?a! zDWvJlIZbg57cFzh?p9k&c1>K{npPPqF0u1f|?Wc6w$({dD*1Ps%T{u#-kVW2bXX%`uP zkHZz#w%d9u*RnqNuZO+EEoNL@PZ7i9owb^W0T4#IPCE&pv~yg3+%5V^I^NPgM7^QZ$$pOsnG;-We@(E_pK-vph9Hc!>ww=0#Y$7HqYL#7m z^^H3De6H1K4%g|~edAAn9^u4$@KtaTI4FvSX3;-=FUL^H&$>9G!-QbhJgYhAw{jP{ zafL^^R|PNE&d2?=>D_QG(Ht^lu&t5?XO7g*t*TfW5Gxu6YQ@&14@{8OOw4KQXy4)- zLFZ3m0#{#iW7y&zkQ6T0ksvU61I#F|Xeuy99x}em*IoWo2S_7KmOzn@n}e0bh;yGh zyn$zU4Ts3W+qA~Rh2{m?Rrg-)m&B@-jb&WiASN+JBSiMkL0`B;(_pQ#sY3fhEd?6@ zXon(m50@w2LHTHaFug|6YG00C(F%>-W#~IWS|66P(|P~q)HCgY2Od_V6+2b}K3%|y z6aB%A+fwk;xbZx!#~<1Y>huZYn{5+K8{8=)d-6c_gJ14A%9_cv!{?%3?`PEWeC$6y zVoN2g&zSL|B1cGtpaEXMI+#yiOl7-fGxY@sZ#SMuGwE_eiM*GWMXLB;9``fZoz3zE z1mrSJ|Bi+-nFq(g@t{i;!1fM5`u=zAiYue-cEc;X1khrg z+RcD|O*UC{y4$Y1*hb?w7Qf>_>$Ucm%dfD%UvsU!skRRUZ0=wVlobb`;JKJ1hwu2W z>jhtN82WL(M4DX64EG}V=`eg(xS}xf!zbzIUiyKr0F`p0*Nd7^r2r)7?$9e& zF+PgJlz$`TVwdl`65geu5+5siOhTZ{fq(i#c-8((3q%(>?{oAh-wA)|(iMJMz#7@j z^znv&~-^pipAw?zvZSzc{x%RpneHT~u;n{ZEsa~-&X1?gh z6mT}!w%W{$l^~1)U|j!t_%XZT##=ppp;3fPBlHB9!)6+(`bgd(8WCQy;0EnYowgC69$104l~yTY zGR0Koy_)j4<<>h@hbl4JHZLpiLXKmJ;(1;%g=7h1nD{Mu_hKeIvf4xZoP-(u3U@^G zYCHSf-`ct7p5+FE1Su7Il)U96V!mJtu8NB<46X zF60YP3HsyJK}P@~WXEMIKr4<_{8k9X6GCh8cNc7m0}(3c6X=1hD_Ci?q4tsam24GR zc^c{{h6};72WINPFlNX@^jwIL)DA^sBRANUyAQEAWaGb ztkX|F*G5Zwde~u~70<4RPaa$6=cOm|J5w7CYLO}72EQ;b=Y7i9m_B0^rD2GGf}6bV0I6vQT7vNNui z#6Du^P@B5tmcC?}-J1V;<+WlU5OuDgX#h!J8PALqD{%#D@(?;Odm3ydvCD^v(a8mk zIL?EH8S?V+;uq$!lMYe`)|qFWC+qfa=&YGuI=f{HF`5>C-gTFqw6dnR8b0SYEw?ky zJXf7L(lMifn41K|9D`+wqf?R>GD0~7F9)KSaU|fz?-@y^vq9RC&%=jEBiqGPlV39u z$bF{jbu?-Qz_oVK#g}NmkAZgdQHM)NtkD$fmfBHynB9Hf1G1x!0w zRe8o>jA(}vP6c9AiD`O+rWcuFn>KA**UW*_HjRc){LL9!!6masNkZ(E;!QQD`H7?* zOOl_iNF>1{-(#56Cw~pKllTHI%Mh?vcOq!|5d+K_+9sf`zR@<+2nr){a-CHJ9p?(j zA=lLLKkvTRzW=@N$quSc!jCp1Q)gOm#ib+bY5Icx`O7;GlX%w$-q;8&?GQNAF2*eC z|5Aa-M^T#kPFqep?DBk{9Oy;m!eIE5pZK_T&2H76IWKq|Xx~{{`>tP$Wfz4>E7F#$8D&CM44V(YAxCvj8Ot} z%5E&LgvkR_kRdOj3v|IpIOnXh&9xKtZoBQII?;5R>gkCmr`x&ODY?zLkHRZDr>F}^ z2_pziIh3y)&SIFX??rY(2|Q(mt)xS2l;E?|4qN;FFONO;gajWjU+hACb(E_RKE{OU zY^VLYw$?^$cgS8X4-&+7eCkD;=)%o!TZ31(ywr zFhMwAH7W*}$N%EzcITaU>oCa&MB`vR)O#9U0djm&nu#PqgVUTIzIp7|Wwbxb?z-o` z{K~N~Ek)c!qzI~_yYdzpfmaI1&w@o)9)$m}iJ;jtPd{zXOW4_Z$`q^9j?rx6(4al6 zmMmTBhjX$R!#gO1eLWYnh+es=+!d#p8_z3@+Kx0%bz0IqKvUIIWXrMr_SWIq69WH&v#0%`4SU zWj`f@T~=)|nyJ^Y6E*uX*#!OMxZ~~dC!Z0ngb+rA`VIri!VOHbz&N{B#8O7mwfN*a zjKomohbuHanqRyE%#H-H?tG(Hg|`c3cH@mV+qvibR+@;l8YT46RN~gM)7eFa%7dKQ zdRVdn^Oi6K!RIf*;efz_(jraM^7`GhJRD<7aC6SN7s}?~dNFOSIFVk6d{R#AiNZiV zyCH`Xm;RC_VpF-xmoU@OB(8E{OQDzgw8^&Q(#!s6`|kU}lBLw8p)2ztZ>OJrhVY~v zg(V#NZnpVOHnerxd$XBXiWk9QrJi#`Fs49yq8Nm z;g9H>yr{iA%ub#YV7l~3d*TWyM|ue$zyX^@Mn}8w9q)ym=~}F@MEm}bL1sus4j<;` zAu;UwyhFB~IyzrYuHH;Wx~MeC{PpUPXebZ}st1%t$Gpgv5PC3)59Tvh8Wn7Tc%Oo#`%%*ncJ9I{(>iiC_A-b+O!V@olsa~nu zeBajrFv1YFr!E$6V-yXBP!ppPJziTWU>pbCjUV4^`|bBZLle|XyKFO#2v^8tVCJ&# zQ3pOsEAOUF+s?Mp;gL+|)av@*pZ?O`n5!cPd_E6B3-L$Cun3MDI?D#A%gnC>{Pg%I z;hHw^;DZlodT@}nN=vq`F3?Q1J*O3R9MZe@Ub_j`VUC{q4WdJ+7wQJS;O!6`DlaZ5 zIh!RX^2hC_3TVJ@~k!ICL3>Ev5a<<|ZVMRk^7s}0^!L4?%wBwcrniLx9wI(EZ@Yzo zMKWx;3?#$kG@eQ-PzY27)aH^Ly{Po7-@5hFH=OKhFme&$N=_ z3xTOhf={gkH(4TC!BDiEmP+faT)75)_XF|e~0IMIaQc)&oI=&Uyec) z*oC0vT`(fm#5*|h6~p;~DL#BniaYof9AAs6B>SCk>&rod&=Zb!jMiO^(5F7nk>(xV zz#*>_HC5VMQ>JeReH2rC$Xm%To4;)!!!?X=5|HeQC)FrB#)c+R`vLKTV{iVm$?VJ8-tkUQ055`)n@_qCH-Y3LkU zGvcYU%{L&?e+M+2pOO%G7|N>EE$YnX+aaGh*e<{FYQfPos{Hkzz+Og@39s1psBdVO zuK(l{PqzR1uW#5kQ@3#;1S48EFjqVTc?2KQf)VqFbAQo1DN~*{jr0*To0|H_HVZ98 z4!$zSiXZ9+Cdj@gt=e7yN4N%QCh&Loq?3bRz>&(X?{wg#Nw~;NfkEElJ4Xrlq5%dF z$`^T{EQ;cJd|kFut5-`qEA1cg=t2;LW17Ira_N0vzyO=s9sG#{ZNZ!DNUXBt2`S(Q zIB_Z}3ucFY4uV=uyEIj48aS66d4NWk8peyd!r1h@^DojlffKc-(?@OikRi6Gw5Y7U zc|ptJmuY{X=)#^_#7n1<58-%hlJ;zq2@`Dh-FMY=S~!O1)?07aipdAPoe6>q#_W%! zhmb$$ETcGil*J@Eq2jVxQ+yS>TdtT7lW9bY(#)2C_wpr@qyloTe47qXVjGO%%iUv| zVbDgX=u<96@DII1$6+X8X(>C7Q~EWVR(zj7(LuC#^1%z~i4NAveBoK0YR?uYTj+Y} z#hLcfs@b-(wWUk>0ow(Pm*y<()2Z+SLtr$sadWdX2bj&1Pfr&CYju}WqNquxRGdIp zvQiwgvbU_NswBEuk4h4i7d7TFBka_en6%jg+9^w7^}DenMn^S_tf zr)Bal=)kM(HGWR+Z~3SRXs3|d=T zeT0V)i$;e%t%%c0BfU{t9W{K|P_MVeix=5F_uMO>HDRg*@WRy^7oY%nK!(2pvkz$n zczonsIQ)VGeh_rXD;G<=Ta-7ZrI>!9^{tk%?*-?dZJ$57IH7 zM<3j0Z@cLCmuMQYPzM20N$q!*K(p(n-d(j)c=GxVU1qYR&g=EfB^OCAeVUqViuNk=6X>;f87ZD}%IPxp zUMW7O_(+*@YsB;zEGJ#eThgyMMEsKN8^4ynXQfa+bXUJ*<;n%T1R!z%20+=mItP(i zq|SkNCd|jYbq*m;5!0|enp z8B-dX=T+(4c;hX0w5D)cHBze4=pMaeTtGm7Q+{w#43V&`-q~rV?Q9DzPyWz{J}RO` zo2r|T2rUQ4)R%ItEBZu8Rjy%accF8d1WyEyH*{v(-FM&TXHK~mLIQ}!1hN^d(Gep3 zYzNiTzySk&kD8@2!ae)!b6t>;?vBhy&_#DTa)gaa9QkCbCNCT1A~CEv>d0g450_kI zcincU&X${>gINLGjE=m&4Dv?|A89vScavyNDN2P3%QDCav)m@rO@gPQF{X@8b3U#|AE{xZ;EKSzc4(^BmTS2 z?b1y&{hfD&t9YfqqjE+Cn7qve$Sjyr5;Q>JcilO}Is zyY9ZTjnM{@jB>Bk@e~g{@Q|hk=}r~VJ1)9_@Q1AGmq0_>UA=+`Kr2mLd0Q>gD|31H zAo|eO!bLZ&>6|iG3|GM6TI~kD$UB*>r)WzBvLIL7Hz)Fy%wzsp`2#PynwlEyXFvO? z{pA1sSi5RVVF^HiX{M{_aspRAm?~$f`>#(tMRlfKn6(gK4^1Oa)Rb7G4!RX!x#F4!9&Lql@1|?GvZ+4aQ z9XhSNMjOQ8V6HUfbaPI>d*F5ap>g!A%Mp;H9D?e;6JJqB6^sd4)e*X~VtAy6bDV)U zzhDxHE6rp=lrH^(B}VR*Fovu!l%rBi$GY#%y{J&?|<@dM$<94sJF=IB=)W~+yj0~3m#LmNmZS&2y@O@wqbY{(( zW#>ravqtm(fi`1jDKSvJcgdv^GBwR#<((&;X5k8yx7N-+>l~l1J5Hy%tM|^)1v*0L zBgrcY&-u1X7}~M^KJw9z+Fk#=E8xrP0AKM0@vr>Fd$%vIUBwUgO6w#mobw>z9RY|o z^s8T<=mP~7X&}&Sf&ipFvD{854?uhPs2y?m?-cFzw$t|8>%G>O%%6DDZ?u>|0+WPT zgx12JUi0y@9=bwZS@GW+esM6%ecfDa!|MiR-C~o6LR$#W-Gj)O$sy^^RtaytwZsQc z9LoZoLFwy?v2r;p?dx(WA#rH|q)&M@$^el$^tJ@MnqkZlS!V$mFpJnERfruHn+hHYva7TP0vgj)A7;^!M zkW)3Fk^9$!k4OXb4@Irfvg!?e525Df4QO|8gzT!@q z5A+~Ibd1qc*V-Zk73VAD69hswYF+UXL9WeRz{ZFb+(B1|ANB>?T7vV|Iu;@nQ;|Uu z<<4-d8k2bDbjck$-csfH(_jAP^&VEkF&L4+khqd*B7Q5}!@!0%70zx= z82|u407*naRIefwP}~YHibQ=fC5PcQ?FZg@q6QHNt&N&K-a&$DbMrXu3sk4_K$E&e zCj+JN*>clOZAak>9IRZi%8!FtBRsYWXe&6;y--eg026d9r!QPJdJfwFK!0orz@0LH zj{<*!R?`=@L*zesDNu<^3LNpdBv6J&T0_s7f@qD?R}$YDV9I*MymT%I6_=fUA`Sv- z#1FaPziAf-1<89l%(}gkFA|1sG>}`(o76%~wh!3fh-38xa zJeqe|*S~)sZvZrmB}ZVZ;we}Su! zvv?ICy#KWRFc8~mDbW=-^1$pu6msBztIou>5n$8`2Dpp-H(3w z-}dD%9V0C-;d=mUxokYFBTF8TCJ7$d+}tc%q5~uZsq>Ve!!GBSUh*gZhSo?~soasp z4zek5`Pn#sR&c;mIv0r4d9=GtQ=L|2w%Bn$|CRmXSH~$|pb%EfU$%pW!5vE&=&Wm{ zb;RI$?%a8TEiI$2Wapgq4D67f6o*oe7Qd~JyHkU3;~kFfSVRi5hJ(x>^TXpCaidEaYfcoAkr2g=_^cxgxg>?LU+} zR~riLxpDy`8cEC3T{50OD=M9S@`_>KzrPI_@XA$v#n7RHeQy8CzhCQ(JrShhM{u>SE-sPl8XSbR z(6E#DuEBUebaycT0jm!PBWZOE)w&qr;@A_aTC1DuC9KqGvpy|$*1gs0+ghz*jSP2n z97v7cYbC(?UbH6d#A2DT9!v1dE7p8$ftcTE(D?E6i@OwbWK8`00X;POzgt*&X(cyZQ3&6HE%E) zWA+Tnlt8VB;9ecRI%CH3F5ED6g3Zs06)SZN%sDPJgv`)Naop()D{+*dYmOLRZWR%& zM!2f%UhT;IlukfD^Ndr3L&At&A+^jul}q_VD5%r*`OkhfUp_C3rw~&rbN31mbhVS@ zh03m=6NZQN?B%(Ms1`23v~Mwj#!2;Z)>-Geq54pbyr*q9)rP4Lz#eF<&OqCGdkH?; zS8LVkl`@t-$pzRd4K_q=KI2tgr?bU`6vUz8YmMkpQ;KTS+5^FP0kzhyj*jwrp7i6m zPG}PFcXA-Vxy!@qHF+mk+9idf_zYF2uOu9v(dZQU={=Er{yClA`hNGk#r!Knu6fdX za#n-qq(-W%&lQ!yks&N<@KB1)j{G`@PSxLc|G(64RO`_1v091PPi=#e_q+=RJQ;AA z#~z?#8G7kRfL0OrtDGIAh7r`}lpYr|MSH}oAzr!SZP~jO%h@zjvHiSM-H&Y+U3@}rp*R5 zNd?}z%!TasYK3E(LQUGmnw-?%t~y)U*5Io3#jE<*D+{V@=ImBmvV4uTs>QdW4N`Yh zEp__6I{&Lm9jvSKX*kM5RyiXM-tG6!8b1P1tw!RPYggeP|M-VmYJ6snfunusScm}A zU;WB4Zp-nTlTPt|TgnhQ)c|+=u^NdaN5+dUU&6%HteXwY~bJl0$-(7 zUFUgci$p}{&q;3u*KxiJ;doM)3C$>-@KgM?+?#i_38H0_#vgqDhdOlgO8fZ7{==@g z@+yxS?3hwe)Tkcv+-3fD}1wXf09HQFNKt=2yF+OkG_X-Lg|*PW!Q## z-P=eHR$Mpn|Bggs_Azib=D!nMvzxgon)B^K&E}b=(p|S)pdFxosnF2bz|uK}!+XJ; z%7m|J`Ot-NeMdnb@}OsRzz8i3ZA+}dmfEm}WwzsH!)(m(CJ8_~B(q%xl>DvLJ|b1G zXcS1HrJrdPZNXk7?ThWXQistXwimIXkw%}IRT65}+UWY_HmRSqI?Z*`7b#5%OlX+q zuIg=1yt=|3e?h8K#4N2sY13$vWx1>l!?9%h-^o!gxoWbfo_bRD8g)89u2xeL+5@M9 zvQnpLgGR|PoR0qUpFiC9y3BGQp zYIT)r(8Hp^B0j9f`3q^}+81})Nr0b%o6AJlI56belhz|N9AGgO!yZMlZ%I|X59AUc z3D0V!uYL8u?A&wDwp(ww*_LX*nnaLXiiI0xVn^CK9slzW8F$CB2mGyD>nx zTC0B3fz;SC(V^;D17#ROi`rZPZ`6&ffZApKQzh+BO^XISYR~lxZA_mw+j+P?ZzVn= zRdA~|fnD6**Y1C2u08)oi!EyHEs?mXkWoEBfdZr}*sdi%7MC>n<-Pw5J|j+Jo2R_d zFP1QDHxb|By>nVj!-+B9?mK&O(XP-!4%Re&L&GaNd|3TQ54%#~Czk*kpTUDP<)utq zf78ujOcwE%!xH2dTsgF*{R=T-%yqwaMDF2R>_BPsm?;*Ki}&i}Go3g5=-3No2to(p z!ne{m`c&3seXR77L zek|42s5iPOVL^nL>}b8?QW(^%&WzS9v55oQY)W%4YaY?)Q&@DaYczeOI3|iIBAhuG~MyfJMV-d zT)3ibad~(}VNeihjQVmY-q}hRiMB}cJYe5_^Wcf^8x+bvD_!cD^VYn_7A)Y0frCT$ zDVjVmM+RX6vqEdbQ5r`bb&Sn=`PD+O)Kl1xCI|&HUwXy(b6gBB?Z z7mobaP!=V@^H#EfS-EPJcqJ_*a14xQvt4N`M>AI9QmO>%ME_lOV90l9kGU7_&<3ti zqhUcy6*f;2I9e%=0#|EbGP?J2o7&u96NXH;VcPqsPoKVm0{>{S*{{58YnCr_m~D(W z6feKAA9a-LQJ{$Ec&gGM1QFDIa|K}%+}754n*P94u&{ zoa0NHH~8-0F-kr=rFo5?oF$Yb;4NR&=F0<$zLxd{)VXR9vjgRsfj~??88N1p^jo** zLK{etb0*kmdj=0!ra?#V-t}4?I@B8LYju#da-66;aGEYdRyzW#z|C@Hg&#COefsus z&CfI14Kzo!f{_I&osF1OmVZ|K7{2H4NlSDmQW{GUHIYZIbiSg0&*!NpA!g;gGWZZC z(+rRYqu1Vc#Nmh8L}MDA4*5I55jZG^$aTx}Ew4d-Sn~ zY_&T3^UgibkFbd0&=S+$XlKbCmSZR3kj20dT)=s@Nsu^`7l7Ph?F?@tmSJi60+g`T)Hj`FpGfj!rkI*z(yWR1? zEL&DJSR4$h540b0!&@2(e(xTaMHkt*3uO!6f;J?yCCV4^Mtw>E(kq%?j*Y3#wE^PM z7F#vNSR+2}?MvaJ43QUFLjt0Q+`~J3BO5p0e5-xzV+UyS%|6y!ikOAk1B@ovlP**E zsTTr=XkNadkwuEKwb0I;EFZ>&^J;oH7Y_No@I&Vq8&Zza-u=3Ixo~9IL-vpiw}k z&?J&s-P%=F+qT+v9#&)9?Ne_{v?}GFk1Vn0<_)wJ?UYZ;d8;)tRk#9E=`5x7^WEz* za;FNCi1a}`Xyb zl$U2o#KFkMTKbA$QZ&8mu+Y3^3z}JVTwPt~GzFET z9ViXsdMG#g#_*dw`Z;7RYm~>I*p1g;FB*k*vRY3pLZmI?hfd?upE=a7x%vvb?2mu6 zm!u7f8Ui|5G^uRJ+9KXKzPZ`H_O)Y`yEwt5?@G_{7Qx4ROeVfpcxOt<0VcxdHE9XI z^rPp20x7bug4GkKuUESsQoGu=nYi3GAJ<21d!RmO#o%h;sJ&jHG)<*w*xJ4L;deUXrdCEZm_kq1|xfO?KNq@3#4i-g3AdAtWuVQ>VEhKv6Vw_Q|>n zgQcP%6~EAOo}2N48`Jmi*Vp>X_W1R=^TPln2Zem3iwj+4VW3>A&lG+*aF7JU#&GIF zWbcDgu{~lUD}{=S_Ra=u*NC^68B-W2DvcufgW)2Vd?#M=y(nOhz4QdC=?q+WQ4v4< z;r;ECpZ=sZ$VP$9@zj#+=_jAI+wZtj=U(066t!Bd#0?WA7}QB9XcW$Rw=c1+$D8di zX@oUs{>v`QiFAG9jXuuBF!Dpf@It1z^a%5) zZC_zSY`J}W3r*ovEwP!4>+RZm7TDst(aP=mug{($j4ZmKjDGHx1ks(Q?V!yH?^ANA zkaP|z=cy;3r2Tx33qr1Nm3DD->aq3X%m(xbrwivTkXm}F_UW0TjSL?bw177^I(8dD zV#Ra=EhOOw;U#`gehKhXK0%OC9p+s|)Fh3CY=-I7K{{vb;)^a;ZYX0%^_%<_aI|9O zGW*r9PLN^t>9+p?I_g6~pf7iHutL)4G3+9)^TRZ#NV|+|rh`=eu5^=SBx1};M?lB} z;x57{Hg>(+7uiO`+imx)$5<1>ew(^7v^)xkNXNcMv|TzEevtE72kGtTH}%_ZHl{4(>9>B$Ujq{v)E!l7njr5ByqYp=g1 zItqx4LCe5W%y+*FHXd2|OqD7YHY;ck_&NAglG$L>fhx-wp`3x`>h4G1{~z08^T~dC zGb7lCA9=*iI`bTxrw!)%_3y7vlR8FIBC-(V`|h$#Rr zh~)f|IisDD?^|`O#K%8=p#Af%`>4u1lK?bRLua0Gs=YLGrrmYNJ^H8^5?(_Yg{wsP zWU|CXhz1_1T>jU~?Z-d)p;XfcC4wa*$DDB|cCkyV*a_uiQyi@1EkZ5%knkWiv>cz% z3anMDR@jP_GJu!%sACr)6FcO$x~k6ZxbrSM^pH>4IcJ@2M<4TL&m?wD2nGxY57H^_ z&pb0-tDt)6xD}m;m7taEl6Rboa$h}1k%n`DpzY{Fj>B89Ym9*qRx~JCw!n6r)MPtM z9HIe=M*M9uRK^a+VFHOZ9pVHH0xv2jH08-C1rJ+DGnazClX@}-h44Ao#lLZ?fxU zkpJ48xh{OOASrM<%B!j2oD}I(%&6$#dzuD@NB7ds-F~Eu(n+T6=}Nc_^{>SA5x-;@ zF9V(#u8em^$d0|(OcJ_l)s#GouX<^dljMsUuz?A#-K2_S~198 zI?WjbK0ST9N-uSr2MD3tqLzffc~^p>{FlN5VbbA}FbW~Fp0GKH&iAE=FI~99oJvO? z%2U2Yb_6V$_vCX&ak9TrlI&)l4j*tH2$FB5Bg|wBAFM$j@~joX9ChT8w%49}3hisP zugVJh#mT?1haY}a7WA^mk?Y&1zYpe6Z$}2vAf`A#jA_cm*|yC_Lo{Wik)ddS5`!kf z@fLD|uNswZ*bqb*z{VA7EWDTd1xk@~r;O(hEAx(<)OU*gNC` z=&pg2)|1SzZ|qZJ%d7j_rFX82i#srK!9eCo!Wpw7Ha7pLEQhv$r@j1Z)qL&g> zL;&!S8>JDw9w-6uxS##ZH8d=>=39}Ad`zC9-9QUT%!}S`j z(+N{{w16txci(;Nhu{CPPk$jSJK5$Eahw(<*!>q;Tr&FsRkDeaC-`)nQV!LF8(pgn z&>kCPq`bw5S+>j88(Hm|6_R%rDgUZP;Ya!eV&pPKy++=WgPub+wOMdHC*MUu2|UJd zL8vOAJQ*WC2ab}&xAIZ}?UP0!7FY=bnpSyY4t>yegKecW2Dd!8*j`-NOUviA&_U${ zG?s`#6CQIxM;me-%-X|q`Zs8|ihTo@RqBa~iRF$VL+;{RxQF&p@QXQdA2CwSNvl<+ zzIe+Hx!P{H^&fVD4i@*-P&tBKtLZ>iXi_q@KGlqi2l;As8l-Iso^MjD z#9CIYw)=F*GnA&#cG`J4OT0@w($O;C z{ZM8BT&~^2`)j#78*bLB4%t$|QJtZw&IHtnXUVizAdqT5AsZrDuyBz;&?r3FPQbnY zxu-D@u^#VP@RQ#lHzeoXciF{`(TD*8U%X_AI)R_tte0MLgSZAwcR{}l4xG?nnC`LK zn%WoGRulT$j+^$gI@vSSwCb!Cj6kyze$V0q)(|uG*5t5FsDD8^Hqx9Fx-(x;0Q=mzN7!_0lmo`a6y)?bM z$%sX^uLObG*5OvQdbuMY*L{>ER4U-a6iR}=D?Pw8LN5z3swMFCX|1!5Zmm6w)(*4F z@0w`~)(kK#`mj}U8UkH%L0Ea`%j&Bcp%-=V2Os!R`{bt%mX@~GmdeE7e}DG>?1dL+ zDzC~k(u@l`p8W)cxtK$VbnzS=+8#aU1cvZjzPw-g@|Sb~@o2mB_ZPbv#F=Mb5CP@y zNhL(|^nN71tiwIjV;EdN|KdwFWsA-HxD}@O5bT{#tONXH)Dq!`kBz+=ef19`98j_KX;7eDr`81f$^9w&}q6Hf>vNDPFZ&hL0?LrnEAA)I(f8*_KdM z=lF+0g~kTV?l{*nqzmdGlK{oqG|!z3M*3l&qC%?Z_2Su9(U-il)VAQ%xUdUIxG-wM z=7AMPt88%f%l731`r3?nb#~poD{OVG_8W1ggLqN7C`bt+{rFUz-l?zk;lh45K_kbJ z5}*Ctq1t%wR3)V@Pj!9qg%@Z8v3u-^C!Um_^5Fkr911R}=RAHhvWOSwPPO|;vdTX9 z*~9G0zh7ZzoN=~r7RSK=$wMKAt}w#XL*BJxoLWfD{VSoLaL93S=Aw`h4vD~~ug1P~ z%ol9BrlUOlTyIw#izJhsgl9o0N#;HH(Q&-;@@%{Qnj7qjzexl1A0P7)P1QMIOdGG& zQurWt=ECQ1r732mnGfED2d|4I1Dt zz#Sb(X}LqvKuWr-aHO0p7x)S|OY@~9r1HTKU`M(5=9Vsh2p(h39|?=XzHc?^L9hdLfs$`6kMd;q+cOyAzblO0YtT(bn2OQp;kJc zckWrX_g;J1j?;FsqrUW?+R9)LQ;U;vE|GvMJkWn$+SYUp# zlUTJ_yVx$YFMn)+P3*TsxY7zZbuir`^GHJL^{(z;@R5W6r~?8&D3v)(oV{*7p(!A? zGx)_XP6+uIb3ugT$}W#O2E|KWLX6W7JOT#Tq7{KHvOgF%ZX>5JB`aXvyR!38nzt}8}Bhb$Hr8%!+BMM?J;4#9kqWyYigUVL5&0- zu_R~$tpRlX@7j`C=FK0xYK`bXC;aIRAx2Y3+F5>F{Tp`dhx^*j8?Ka)C_X0p5$FWk ziTLdJURuBD`Yybe)>Rrd^%*Y==J(laSNqc?7r8KYx}8e`!pN(HbQD&|(-Z#`!=Go%``A5{WJ1$FIR*4iz zUW+oI*Q`7w^GN<&gQ1G-ii;zf5G^fLR|cshMfXVimX;ufh?*BtBOlKARARo@$wuqj z-}$bjW zMjpPrzjdA+G_AM2vV5@p^&c~BWp!Vlhi9-EXoC*6yhHHBN!;{%1x596UHJiKfGei2 zI-dUQb6%o)9X!>)??7#7@Hw4aew1uebn-m}q^uO0LCDwtXYV@zEGw$CPruji_3PX{ z-90@KCNnd@48xFf7!(vF2q=O9117{Zt^Vt}i(>wD)qh?8-BlM*jH_Z85R@cHM$!;w z#+hMq?l99i|KE4&*3Iwrece3+>rZvxck5O-b?VfqQ>QZ1^W)~Z8cZ}A9L?$z@?HvC z>whnw`1nWUL+`&9-%zN)D3D!h6h8Qj^_e>WjU&^5-Jg*0374AV>VL6}q7gZgrdLov zUa>rCusxQGxVPa-9$k;bD zul0-!I*N%)ag-?P9mu&7mWnH&AxTd2G^h5+Th5t=Y3oW{AJGRMC`UZfiuKqSy9n0# z47_ZZfMd)@To$cthzWjRoPcZ?Uqce+*BJVm8p% zI=Trwl+d<@TiE1kgQ0aX?>IUH-C|=ojy<^hkLl&GK$~lRG>KsJU~)x%1(Y8fmkILW zkeX3`f+)Hb*hg&0w=o&7YI@P##>aDtwM8l-a0t^T5{8h9#??Y)#G)f>3@;X8F^8TD zQ8LD+W4{qH>ZD~u9%N6T9GdwzzWH@&Xv7BYj{R69cdg#VX0DC^9E4+oK*lx;9NA>y z!1$7GdHd;UsV|+1GR7_y05pmOmrGjaM&d*hh3leW3px%l5AC9CgdInXFp#i7qJLER zaWQqH$MaY;90)~-%&s=rR984!#uKDVad_jb>`U^2^Bd)dcWjdO)KpNB%YSL0{IEcL z#yx|Du$)j{keIZ6amQ+9853u|SZ_CN+9(%a_Q(+(+a`H~&!1d(Am|SYj#eW}+`g7s%fu7^CJNJ5+X;rKYch&@m_YcqW{_=VNVv z>Jia8B0a8IGuTlf{nvl{ru_Cdzt!#MY|uC=VAdX4zP3?aNoF1Lyp3|p*n=49`t0XE zCtv#VmoYUlh^@xFs>LngQ2fzz6pE1dlPPdrh{->iYoy63-|S$!oPA_kj+!wEje8ph zfnn&cY@l|R7Zti!div@7Xthp&Zd{PK`sIf`@pfPl&PFU>Fl7&8j-aG*Y)5lyhg^4V zwfyeM5m~z{i+bD#AB1xj0H-h_6wQ+d$L1&MVtqX17>1AGJla?{SdQq50_Sgi>zgut z>U6BFZI^ex`~AALo2OoT+3{i$I;D3$6U8}S$o%dWbFOiuA&>3E)GoWw`VIF%&?gPu zz@!IvjTFXx+Mylt-g9$u#v znKcBr{_0k_`t7)$0rT}g{_#(-Mb^LWX(Es-LE}G&1=gMN`tvU^f(rbpYc4qA2u*|s zP4d@_DWmz(-Zj4=JkjF%9}|zNlILe=%RU+o-b16HBRqtN9ZS5oO%)rCQnU5O!@q|5 z1{}ipW5h9rYuw@tmHcFn6Pv;qX+8SzW3pl0dU^5r=d}T&;uThYmKjHXxSmaW zJ_nczb~fcd|L=F?kQviu)vD*@UGMpTN{>N3C+h$sP%L<#zQO^KU;gYC9Ds}k$QYV3 zy|eFJgh@%K~v&O7hKC88ga_rCuFTA%Yx&BVhG zBo_O@UK`g=+;sB~LBO+8|vIut65r<>_TfcPU z%pEi3>(R+fBLF3L_{&LLQ#C*NXrXn&L6&vv!`J;CPQh;gFs95=Rl_kpP_fp0@M8n} z9JPmxB)C;OgNA!TYOkxZkcg|45LD?D2GKo@0=%7&t%k1KF+ z1S?o}N$~Q@on-}S33AM?*d^~fdy@R*Po1)>uiWT9C}$%-!QU>gBtt#lf?Sq>E<>OU zL7;E{pKoHczCnKb+m&+TO+O^F8$nZKddaYwm{4T@B}k2O$}@IjJ{wcg}OLY;9VlV_-*F`)shl-I(?M^#0YbYSky zAI|i~Y&^q+L4WHvws-sriXgKaVh1ZTaR}q#tw8W_35W4~4xY_cu3(DcJi^z9EPb^B zhTDxdeh-aAN>;AC9XkYmraeyzd(P{tpk!UrH4sb*i^gz5^W`ViNJCYZWN`NuE28#$ zsVRjFd0@g!5?D#X=K~Q7Aq5 zz=QI!4_}9=wI5?~X*=XNhxHMP063LEZH4qB5iJrJwIMIlxPr|RTU|{Q#X;c_COnua z#)DGbS20C~yIPU{CGF|FU5U~IFkN=E1;B*BP4O`os^qh1NSW{B4YRmsa98GAV zzy_>D+V(>6;9_d5&}5yn{`sLO=7qfT`VltI*{?}=%aR#Aa?)blyV$=6y=tV7#C0bZ z=w}WXb<#1}%?mT&L6RQG3x zZ2N8B76<>kke@$XA-lF6z5qUyfL@6_^VBo)1st35sZV`e{`*Ha%0-vI89IaRSM$Y! z)gRIIA%;n?G?8;S+)x*#o4MRXG2NsRSOOzIM2pF~!{cz!d1kofL)q1g!&FO<_{0Yx zmO)H|S6NJailad!J^4h3#XVf}^%g8_u9sk#6a+iT{H<^N3r^wAX|LfYKl%wgsOhjN z!LY4XTvJt<0;^R`|7Lm1Yi3DZsvRwgGtiI5f&L!7%$GVve&`qUH|*&Iv{FeON742H zCVVIw#sVVn4df6kZ9$zh?Tc+;pr%2k0}cF!O8r<(iP3u8=-y$FzzyWi^z4xLy*4Yq zeYjuN?!&qZIHqu+D#a%cjbpj#dKWa-Nk#{VDn}ChhPzn8CK$r_>Tw4?4=Q4Ryz_1% zfQJejM6CMz0wF483)A$Ije?r|WJ`c0L^`HX)?5dW!qoz~fi9Vp>yoL5G|Izw|5(mk zHcQ&>{sIEplY<${nqZp7)$eb^`QMBa4a4;=T!=n=_P3?w`P*dmUwDZt^2Z&j_&W|~ zQ>Jk%`T8w5;|k^1Uy_AVfZTJP1xGsp)Szb2(-<(V>+hPInq=d~E%Nnm{+nJiq>4`{S{Npy z$LAOvpOB|QNkl#sJ}U=|J4)ssxkmu{KJ)Z*IP&2)av?4r{oh~wXZh$S{}FYo3^X$% z^E|qQ;o{^LVf&5dGn6r2y36!SNnh~&uDyGtyRR4dM?fd9ZimSatVnx6`LS_(aIjJr zMtiENs-zwVg>_&E`QVx`i!${vI~-h$Uar)bYYGX9bt|6D7nY#2mc@fHwQFzge0Pi%~n&W2n%5ifr z6jW9#>$i8yW9zzPZ&x`EtHh#g#s?6>GfIPLeu}LPjGt(mo;{HUXb$U|jixxDeh z^Yzf#PkizpB%8^iY#o^$%3~gI2i!T9Mxj*Mw*2B(zmsE+J6h(%lZ} z=_SH75t66_m)oHg(kv;2M{P8cq#^KAC0$aEp7EK>r^wuC(`2{@yT%6h;?&?_;U&1oU;Ot{ zvgZlO_EEvsX5xSqvY{gm?Sr6|J&#Ly!*#$CN&wc8=?SD- ztZC{7swf*00booC8F(%~`;{K`A|H;e&QH{cLO$ZyhBDyqS1=rp@Gei2??9|Ee|U9^ z1ceeb*eOR(86S?q`QR2CXi2{QELanOUkx>enmg7rcyCy9&Y~r_jE(b``-J0 zy-QImI+8W2w<$*tdQuzXjWuqeG%QT}HevZS1VNU|70VX_i>NIG@%nW*S zz|3UICgLH$5d}V;iw*PYd#n^7BT(^SIh5n##Ls>9pP`fv$UCln7uNf5o|R3M=~-~7 zkX4kEE2R)1O&syLXr81xc4?!VSf-B^S;W(|5MYAf!o+a^9Ai|{%l}L?Q+kJ)f%<5P zST}fJBv05qa{+Feo)0Am^p(c!tO|E6QYcO_vPgf=t1Mi=0Lq#B|b7)m)h| z??~Bx9}Yremrz?~g?2!Gs6ev8;>b-}Ix+22DH+~V2fj1>Z|JRMg6!zIC>W0CXjB^8 z(&yy1$u(yU$-7sias30QB|#tcCA!9DWL+VulT4&*;U|s&$^(cu+MCmJr6`B$!7cKR z*EUElg$3N?HSPw|$_yowqzRwh&+ zLM)V5j-xJ(0k6ILnrkq1S0+EZ5 zijwgfrV=si>5XEHDqwLlfzAGqU_`TRIq3Gv{X#DmW8gR3aJ}Bs^&uRB#qH@-G%cmU z6Ivo{5I9{?-@irPdfp)z{_j8!86|?Ss+ejxKYjf6@lzlvw4~w2kCA~8mtLIP*wSPF z+*ElEi>Gj!?D4ZQSoTsS4{wAY3Wo>((IiQeVZ!0^xhc??AIld^Hl`yTi9rF*fqgD- z%3=hoa$vihwS1b)X@n3OF2^$f{$V~H%mA2wLnCE!%*CIQ(yb5TUbHT>$=VbsoNzAK z*pFtkA@}vJDNCr1c!sGOEQkruW9e*t35N~hoRl4FjZUEc20tAo(HJZrQw|)-!b)K& z$B_l+%`cS|i<;!Q&3*FNnr<9kiN!*kUSJ&a8>}@gp-3FkA!K}?%np?jYxo^rFv&_tVLyHP44HxvxQ!b(NlROs z(SS*JhYNJeI_wmhl@RLhykHit?&a;xoa!>o2P-(|PLmk+e1nFF`jAym%|ReoAeNET ziYo(Y%400UKq6!K&|&is`k_yS%AQ5>21)?8?h_yiR2OrD&c`npkik?=9$Js-V{Aia z-+|Xc_zl18(7#_faFq-vF!?K7QQ6aUjbqn^xNvm&irJx`KU>8l`*Z@9wo1DF8{VJ)SxlCGit<&B+Lu#JXVtz<=V#M>WObx)9 zL2%*1?ef7EIeL1jES`~-?cI}P_Rk9SM?| zDJvE9hhL)`ul$fR9IAQI>9taev$%%2NkQc=>F7ycCxsZmMI`FP26&j_sjSHaERm#x%~xP3=4$mSAy-` z+PFx!EFN;FwZ2_R)V)51ceP znl&E78pSbE8n3O0f$8g@0B=B$zmN`J`^GoqCqKAZKK`+f$Yobvh1`&jFw*Me({dF% z4O}En!`T5^NoO_mLm8R%g|K6WgR>koyK&<65Xwd6l)6mJ56AN&h84aQjVy(*PGtZo zCQLFA)zQab9FQ@vBZr?H}DDmzeg$V8MpAJO?)~6@M(XyAC#C8w#HEYQBgDk+e>8vZ5A!0lNsugOHb&L#tiP{gXYCXmd&H-Sh6m= znVC2Qf<&4)xWz)6(7ahX;avdk2VLj^$Dm*oNes4Xv(vyZ}^X|H>|Ogr)f@JkNI zZKkB9rB&{~{~>w&@h9~f6%H7%=6R5qr3r#z4f^cOe z&W5S4lij%8orq~`94KM~*JjXsjqi7?unLve_%IrO>|${qJG2JHFen1Q>5pSFRNl;NBwL(KUQ(dPqdCRX1IgnvWy>`YuB}9 z9UEm*<5_THd>ThNAis@bRPjN06qJq%QAL&BZdounEwi!4>4^>9@|R6)l(0h#VQAv= zq8>3nY)BQn&(Ez7J~umv#QK~b=#|qJwo6m4id|tWtPHj*+UPVD^1NfM+*0(rLs9piSCk2$2J)#pM!(O)7TN# zh^^ii$i)|5sEzcq&#aO!e(9?i$}nrOI3+~b|NKv%RUY`<4W9=};7#x)`7SV?Nd`dj zwhsAmf2G^Wj_f+z|KNl2u6MmdKJec6$%7BQ6C=l_9u7h&%x1INhLOUgGyka0b8^gd zC!Cxk06Q35H+bIbR_Msjew-fP*#p@Gy~IB{J`r@$Lk@`o4HZy|0v1|FSC_QxZISBg zDx6Jlv3%!yH>n>*0mFoi+v{^Y48(A#WZ%i+GE@?FNd_$mW^s_{W-Cr17*U#;nEB$A zLhEIRe8-*X>wn{hQ~6AuAUR@sqWdEN0fGC7NN7rd<)%t$4gj7eitvfsw_ z;Qv}0IA|Sw1P)S)%pb>7IEb9VNXk{GPnPf9(TQ~fm`1iOor8;|$wZ+RPg~0Ys4=kS za4K*^db?b7!I6^b#WX5*a&a`CiVx3>V*S@|IB8>#Z{;UPPEbV|%+y0rrKD#Q=J>Ve z>c|ep!4ohsj2GjCDB=1HNS=lt0I45nNK(VCQdW&Eu_{jSasWqgh{iT}A|UgqjUEew zFae`NI^>i&gL35I3*}cUS4n588TATlxfDL3CrBZ#aAPvgMc3R9n1Moic;g;9diEq4 zz#@}j2mlN|s9`ii<^<`QCeTH0p^*dzo;)Qb4P2a_Zw||sdaQ0dW zhB(S|8JRJC8U_;fOCQ$JnvRYcY_Ocpx<=GSLoZ2~(V-+MMT<%Joj)$?P9HW&-L~=$ zx!{5eq^=rAGBh>Hd*1yXnT%su%F8SCp1l+{>GWb3`91gCi_3w3t6Tnc)D6R~T$>6o zN(qjHai>=)j)C8cDX;wQsKz3i=>fW)c<6sa@P1L6-q+E#rk|ht4`w zZ&hWlj0Hwb&61@cWc3VV%9x|aCLI!)2q?=^UhGH^&#P!#QnZQ&9E!jOiiQ39^IwOa z$FO|*)1OgB7{*DqLHaSjgR)>+Mh@jp9IV6Ov>3Pi`t$9#hmsoC=YfJdE~H)|k+pB5 zjT)3wTqSbp*;D1m_wLsopIHuQ5KSWNW7kH+fT#1J0E(|+ zxuH(zY-wlG0Ml4Vi&In(n*%h5O@7>WQ^vcM&5aLwQTLIkd;q# zOBWV-kCb5A8UD6h2qRH?Ov(vp$GF%a4go+8={65KmbWZK~zZEC5DBJa1@Jcg>L-O&yfG~<=?;a z9psmF$mDf^%QVnbajhILL|t+AS#r*bv*3V^I*4)eEkBYwK}W8!<4P*-x?{&`2<_Rf zJ$o<$gx#eW3?R*t$jhX}E7b}Nh^jUqK{ZII2iyJH_P3)V_DNY;IS^yz<2r#N3?;AM z@Dr7NG(*B$Au(FmpuZIg}zCdLzhLke4rN4V$=(<;sBy>iatdg?&%CF>Z)M|%_w5&2@}9vuS*L(JjQ zcoj2FxU-b_BsAbL8`=*yVeFSJ80k2w0aJvz%y1%HL3s9Vnq<42xuj9tct!KncvVVD~@i$g3Uhg3it$hvs3nX3FphZy+5rg>&*P9Tm$`MZU z4k&L^abXnY_h^oS>FF1{a+QYr94&CXtX6DWz1@A6`$v7NBIfO)fmMNxJ$__ka@HNfXjW4}MwKB=1B#oCMG- zB#c*L9zt={NxT3Ug7@g7k4FnWB764klyz&dbC3Y_kVCxjk;W0vJU=bdzeC=!VyfKo z0FNF(-N6XY2pZ{L%#>XB!4J#Dmt7(kyx{`9aJnB0c1zNwvU=Tmlqnh0;H$DZgm8%S zy^J|FMvcq lg%jss3-AB(}^9>8x%w(Z;{Pd)XN{PC{4Wd{aNOoe2d1z*r9jq}ek zm^Pe0XO3Kc*`>1JuzB*%tFMxGUHx{s2-u_)HPIW!@j-vxIEJ*uQSQUX-`ih!dx`|z{* zG4JZ?Ivh02TkUxmDwXbu%!!k4o22uZ@72@Zs>&pffFMaV-?3UH>0O*LvH-n*z^fkF zC6}CBB^z6-*;+yq8LIe9YICLlH%oAh9pyy28;bTFZmQqChxRAFK4 zgairWGRA0OFbCy(jJU={vphZ;-bXH7j>Ac_vSsr|*}7#DXzz3eEKt0`S}1Aq)}YkN zUO9QuRC)Y`-O`JrAlN2qP`rQni(ks0?tcJx>U|yRzzB9K?a~fT3GdK=TsKgn7=;gV zOv+PHNH33zvMuuXcOU9k#>Gq5Hy?6+oCgbf z2q&agS61M>pD9vTTPu$~@fV6z6)~ zn@9U*kPLbhvuBja+6}y`30$bk&*;4xKL@i+Ou0C%BwhvJEhjRN4+>1HH{m@r%Y}@;_>0*V8psggBOm zebVq#FzrHkjl<6`jPluumpSKRL~=OMdGqE?P=r|AWG2&SaTfs(oja_)RccCmw9+Xh z$5|{fB#$k=SHs0tm(gj3BINoFu2H%2_02edlIpM#bp>idQ5u=w@`)^oJzvbLMN3o(XZCqX+8F>nYFVb(z z+9%}56>pJV;Dd_7+Jf?cV1?FTaDXaQB+PL5LG(Tek5kL(p>CXhy<4tWQ6bH_4yCsl zEy!21J@;WupHK+1C(Oey8%DOuNrzSH2#}5hvWLt+R(an;MzFMh^*u4PsH(;}N_F+p zhczYJwr$4wcDz)9yut@%6nMx>91$u-xuJ%k(|O_9v$04T>rq%)6 zDi1yUi0s>kx|iT@i2UF@X0(yhPoq6x3c%)L+eR~j9-z_W8w7z@3D)}z$?iQZ=vD1ihIr#87wK>oM@Z}_i9*Ty<3pNAXeROo ze%U=NwsDBq!i)OZSl-))weM&gx)?2=&0nAiM5MzGTc8WWZo-ro2m8z^!3>3kcX+A> zHptn_>fnP04YBPB!h|}J#^z`uVgCOLO9dc=Bjrx6XSK|qhUq7+^DUuR=!i71rb4Hd;&*7<% z=}lEqgS$ppb2u$%8;3|93nZfg8?uWE9u*Y5Lkz;2H-TS#a*ZrIqzg@Aw?lpG=tF8O z2bN|y=S+q@V#2Aw(EcT-PQr8-v>d=QWK-3x05-3BO$-G}WagoB0IEcueEboR9%TjP z!*Dl?BKXIGR3#sERxg!>l9cP)Dd#S4LTTe5O2i~Pvm9B^(m2@k-~au)*fEA(UW`17 zvC4~mYn2Mb33JluFayyGeCVN_P)7Kk5QEC)ZKHg#)c;OGS0ZmVBm%HFiMaYe>Cwy|3XxYUGqcml#^WSw;ywE8#Zi`MqF@Ois=~k zt62GyEn0Q6rWg|uaFE*V4~KwXDMpz$1{o5bCv*lew*kraL1Ps|Q<;K(_KS_4Y51%Q z-w?3qeO!L|rFx>}nl)=6uz3?ZnlEa|5Spd9Z|Tevrl3>MkL`iHkA}k7#O1GRVvtQ% zW`N)j!qZimezcrol5mqxVqv3VO=8?^gjdoV`S5aL5DVvr{_Guc6tV=Z=t=W&$>z3w z(wnN%hS1s3tkQrZ12i5CA9R#?oMBzX*@T#u>5%h}FO%l-0qO7QM?-6>xam!r6I4wt z1{@YC;`xh~ylZ-HYzRDKlT|K2n0@U$L7a8M;o_*Y_C=2Jj!E1LGFBTYQ;mh!J^OY_ zWmz?rAZ>$$!ZZYSMpk7@WhzccZf?qg?ip$69+0j3(RgvxjU7(J<>NO#mUNv}`SFF+ zV+^>SfwUd$mSbiQ%M5Jkz5U^K87QpD6JGJE>D1&vwY}fqF;bbruI9Ri?o+gKT|{MZ|IRl1EC&43i4hbh-o( z(3l~XaG<>cUW%&80avTiP_~3~z_v{dzX>gN?-{f8M!$1VimDYopvz#$w8qO`q$*e;TmFL$utKoyN z{BU0}_OYU<3J(j54{}4ok&w}cTVsRnHuHrvepaq9Zv5tjrEj_7&6o=vl;7YigcNpp z5d;2ZG2PW9Yvs7ZD)7Z~4-BIuV*`s-f;aLLG{7~CY%sv9Ux_FHB7(LY?#-ZqY@A## z8@Ki0$aioT7>$oJDFSE+s5EC`P>ArM-9BD{kTZaOQ)R*7^Q8NQKdP`&cX$(C^fBo~-Q&WJ;s&h3 zaCl(jj-C6Ydhto}=)%hCTuLTYWTmSYiXqx4GmXJF z^X23hc77FlOlg?#(6Vr!TSh9%dSvdQlV$w|+-#4jYHpDp(FNFqWQ>8ycq39bvQy4m zj@#%l9jVE)EKtVe4gI!}{BIAGx*AOV0Sw+jmsj3b9Ny!_GLB{;a=A%R(OGcV5mHfE zDXX4-LTT=L!eU_Mi|vKvh2XKl(}hfD|Mi@;i)ixL zqmQ|xO?odE&K5}xw8Bn_q56m>>z4K>2U;wyRbM)KqUz3j8<}gju_i-=m(`6jcf)2qoRK+u0$x4x)cNi z_`@t1F<}^vBew2C26GGtA^6F~&}C4l%dns~JJK&%@EfibRGu^(W@DH)@7iHQZ4B`z z=6N1W>+ooX33-r;|4-=!m&SdMO5LneWl%?!xdV-N0hLHM)-JZ-nzFUK`()$pUOgh8 zCpb4&axV@Q4g4Yw-^Ciz4WtJO+_5zz4YEfr#&-BBo;}1efZ>R#{~@t6*sSpS6KjAU z`@{@q(#}gihJa_Jj=(Ka?;U6bVZ97t{J2MOj?2dZbmP5rl{MAU-NQ~o3=I>zAs~3C zYGA9JIJXYE`?#L;{FzVvJsMRk{D92ioqT*O{6cSk zAiLJc5+gXaZCyj}Zp>S5+PFnmWwS6Z$5{r{)U;Tc@;FQ!;^P1}p;1)5 zH^|j1s-?bcP+>D&ZBxOlR=~M$co}6G0tCoZqy}Z~WZcu$oW_o$GC5*uIo>&0GzFJ^ zPRq)oX=O6ArbKG8NQ+ayPQJ>@u;&GNFt851@@>-%zuEY3$4g(jUs|?qkfwzzpa9`$ z2viBy5h@-$xRoc!whg4^rS0v~hq^SQ4tdY9EU18Ru`1|N#6x-l3?58t=qL{ei>oQ> zM>fkvXH1q-Ooyogi!ip*u%pNeW2dDyOG6H8K`80rre%XSN7?D5^~`vAIC)?!xL4mk zn!uXakSDk#p{-@FE;C3RF)korWl;~8&*{fa@V#*%B5ppGh%LiN1a)96D$1ih!C8p# ztc3qNKAnkowfT*M%oc@Z@!E6G!EDE{Y~8wDwr$^~^&pKil4!p3o&V6oC$GHX@;DG< zb~DgNiOxOyds_TT znLlg_CCSjH*(c)#ja`JL8h$7((;sGd6OWpvg+-cCvQgntA<1BvA6~lbCupdZ|&)mI^6GBQ-P!Dhf1*qutz!}{`> zc7ToLKO}?vI9)L0drY-0?ii4w7H- zVVRnmsA)TCkW>7I>bGZDcfD`g2#PFhAUU~W!m%daot=S*8B3lcK=L>c4F?sQU!q`H zmPxA}??pK1FoUy!SSDQO+J@^u*s-8to*#eu8SDV-k=L#`Q-1#QU%)Y~>s^&FCYb&z zJSU${bhm!`g1J^sQo0}cETl8d|y#MIC1WA zWfHEeaq$wnjh;ONsz5k;d37ro(7Hp+f|SP3x~V*5TxJqNk#Buavb-~`wifqsH84H z+6iTfsuy}-Mwl}O_-#LXvRs$aC(sjQN`uJcNoCRi{@m7pg}vQSxDbxQh{mL)R{imE z>A6{(^|Rl68_YeI(ZX2X=N92oAfDa-EOL>Ril(VDw120Qb3arlKltP_lRiyUF8&01lzq@}27V_ahNL6n} zWLABQTRpA`SSqL2!s-6lIe}T<6@M6*mt|OFxW@<^5=_Nr?MF2o{zHCP{<85rxPU=yujw zr{gsu8*#MD)*U-^>Y5!vH3*&t-Tw7o|Bw9Lbsv&bPC8K@c;Inlo5KfTISFT{k#J%I zgl97Vy^{UnbNE`wO)MT>*eRaxK)O6Ts0SaB>+LMFuY(>P_c4^xbk99b-Url!P^ zrQG0dS+=klXC9a{BRJ(~VjLK(4-8c1vUu}9g{Q(fOM*8Q2TmQ8$tIc8&?p;PxGh$T zKLCz`&cHKD21f$Z=xJVbS~(ihPBfz2LqSaSR}u0uFraZoBTk~3{mIYxUhyu4Rr zR}a=G;E$ab?X4o!VH~^%HOW9iqJzSFc~Y_)=d`tN?~@8#g*?5nLJplWOZIL4i>9k1 zOaY9|howOftDv7hS~#4I?+-(}4F|HQF+!Gis13;8b@$8Z7hWfK-Tc3_{`g^#7L3i~ zB6vD;2X?Yn)|5kzQo-ZYBXe$yKVEFF*$HP~o*?E(EL0tgp4FFb$H~o8#0sSauWP7;@~JgjPFm&!VABXgh>i3411!#lj1s&>DqGh!&E*YGGr9UOir&*x#uCW z?6j*+LVwFp{>a7JS>~96K6z=A-1!8Qsu-9|>g6)AX~#NFAcmvBC;hL!`fXYk`!U+H z1{JI*v{snN*Tiugnm-EuRxpg~E zTwJr}ud;B_0===dwzk^bx~dBrgOJE1OX9vi?wEK8Sw$@5ZS!M0Oa8JtNJ(21#`U)N7XkwD3vVbN*e!JG z;t|<$KTo4E`@Q_}un`x+l!_0P5{zx&e3^4ks+a0gC_Z`#Ch8dq&8kQ?F6qUxOk-zR zU5-7|3h5jum6vvPNgouZ66ab9Ggd&=fa4RvI?FFM6ofqhbUUF7t=-loho6Xhs9xG7 zmA*ppmzBkV?>K%6cR)xlA1F6^!EjCls%tb{1lhCd=h8D97fC|78NyVUp^1^ECOEMi zph|~r@4Yg=9NXcmakW7UT^O46%fzzya71i0qj^XAZZ5ck4+}P{Q#<9vCH3;?3%$4& zVY}o6H_!vHjtWEwBUpcD7r389GE$m#jLAk4o^vT~~Ha4)O8QhTwLQE7b$ip*oTcr%6h}|h1T&W`y z{#s#EvTwt2-WO@Wub>NEElu4~q?j-aSBx=SUQCSQ!iICfJm`oOEVM5_`Y6d|QBTnU zT)lb?c6ni~k1`6&&Pz+rw?kcicGYvTaN$DHi&8No;tOH|!@ac*I5OhL5r8ba@wGwp+P=>!)GDr(67cY_pQJFwcK;}y?Sj3D6)Y7;&3b*C8EP zNPYy42}zf5)W@hY7Cz-e&`>S}UE-)gDHArf{QU0WP*K=`9uDLOFcy0R|FHnc7bgmw zcV``i%SmA5kcF&Q3+1>89Qujv7)IStsJ+k*xX!BQLvLeS{i5np~Ru(-Dkrb*g#t)mwq z>cXiJHnK?D^>i&>L@RB4F2!1HBZ?F?YCvGbB^gct*-8>D9Icq|_=+Bc5QjsQuTh>( z7l$0RV&Q(d_#KRAG0u+3Tl_;pCVjt>haTof-wd z=D<@8RcPo3GO`JRe~_1Pg0H-_TddoL)~1phzVK8q0>i_C(854}7S_^i1@5KFfnSZE zTOaTlHp6j3Dvm(mi2M$P(*@Sya0tV`0>`H^B~X64cFEL5$I0$( Z4#0vuA7Y{4k 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 mV7CQ!TVS^Zc3XfJ`2PTJ3*lWv>?I$Q7n literal 0 HcmV?d00001 From 1fa05c561a31e8543ec38d7f21b77867b6394078 Mon Sep 17 00:00:00 2001 From: Sanath Kumar Ramesh Date: Fri, 7 Jun 2019 15:43:27 -0700 Subject: [PATCH 04/11] chore: Docker SDK minimum version should be 3.7.0 (#1214) --- requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/base.txt b/requirements/base.txt index 59cdc5d42c..b6ea5d6ee5 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -7,7 +7,7 @@ boto3~=1.9, >=1.9.56 PyYAML~=3.12 cookiecutter~=1.6.0 aws-sam-translator==1.10.0 -docker>=3.3.0 +docker~=3.7.0 dateparser~=0.7 python-dateutil~=2.6 pathlib2~=2.3.2; python_version<"3.4" From ee06566ea3eff8b4f4655e19348f35f4cedd3562 Mon Sep 17 00:00:00 2001 From: Kyle Cooper Date: Fri, 7 Jun 2019 18:47:29 -0400 Subject: [PATCH 05/11] fix: Support passing docker proxy config (#1196) --- samcli/local/docker/container.py | 4 +++- samcli/local/docker/utils.py | 2 +- tests/unit/local/docker/test_container.py | 7 ++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/samcli/local/docker/container.py b/samcli/local/docker/container.py index 97e7a8613e..75174d58cc 100644 --- a/samcli/local/docker/container.py +++ b/samcli/local/docker/container.py @@ -99,7 +99,9 @@ def create(self): } }, # We are not running an interactive shell here. - "tty": False + "tty": False, + # Set proxy configuration from global Docker config file + "use_config_proxy": True } if self._container_opts: diff --git a/samcli/local/docker/utils.py b/samcli/local/docker/utils.py index 44ece9d68d..3e1379fd80 100644 --- a/samcli/local/docker/utils.py +++ b/samcli/local/docker/utils.py @@ -3,8 +3,8 @@ """ import os -import posixpath import re +import posixpath try: import pathlib except ImportError: diff --git a/tests/unit/local/docker/test_container.py b/tests/unit/local/docker/test_container.py index 19ff4033e2..2b8fe440b7 100644 --- a/tests/unit/local/docker/test_container.py +++ b/tests/unit/local/docker/test_container.py @@ -97,7 +97,8 @@ def test_must_create_container_with_required_values(self): command=self.cmd, working_dir=self.working_dir, volumes=expected_volumes, - tty=False) + tty=False, + use_config_proxy=True) self.mock_docker_client.networks.get.assert_not_called() def test_must_create_container_including_all_optional_values(self): @@ -141,6 +142,7 @@ def test_must_create_container_including_all_optional_values(self): working_dir=self.working_dir, volumes=expected_volumes, tty=False, + use_config_proxy=True, environment=self.env_vars, ports=self.exposed_ports, entrypoint=self.entrypoint, @@ -206,6 +208,7 @@ def test_must_create_container_translate_volume_path(self, os_mock): working_dir=self.working_dir, volumes=translated_volumes, tty=False, + use_config_proxy=True, environment=self.env_vars, ports=self.exposed_ports, entrypoint=self.entrypoint, @@ -250,6 +253,7 @@ def test_must_connect_to_network_on_create(self): command=self.cmd, working_dir=self.working_dir, tty=False, + use_config_proxy=True, volumes=expected_volumes ) @@ -292,6 +296,7 @@ def test_must_connect_to_host_network_on_create(self): command=self.cmd, working_dir=self.working_dir, tty=False, + use_config_proxy=True, volumes=expected_volumes, network_mode='host' ) From 98fc37086d2b973ecc79493818401ea3019fa40d Mon Sep 17 00:00:00 2001 From: Mark Sergienko Date: Wed, 12 Jun 2019 13:16:31 -0400 Subject: [PATCH 06/11] feat(AppSync): Allow build to recognize AppSync resources for path replacement (#898) --- samcli/commands/_utils/template.py | 1 + 1 file changed, 1 insertion(+) diff --git a/samcli/commands/_utils/template.py b/samcli/commands/_utils/template.py index c520f4d49e..e268d44fcd 100644 --- a/samcli/commands/_utils/template.py +++ b/samcli/commands/_utils/template.py @@ -23,6 +23,7 @@ "AWS::Serverless::Api": ["DefinitionUri"], "AWS::AppSync::GraphQLSchema": ["DefinitionS3Location"], "AWS::AppSync::Resolver": ["RequestMappingTemplateS3Location", "ResponseMappingTemplateS3Location"], + "AWS::AppSync::FunctionConfiguration": ["RequestMappingTemplateS3Location", "ResponseMappingTemplateS3Location"], "AWS::Lambda::Function": ["Code"], "AWS::ApiGateway::RestApi": ["BodyS3Location"], "AWS::ElasticBeanstalk::ApplicationVersion": ["SourceBundle"], From 5af52295fc4db4f3a4eb08043522d015d91eff9a Mon Sep 17 00:00:00 2001 From: Jacob Fuss <32497805+jfuss@users.noreply.github.com> Date: Wed, 12 Jun 2019 17:03:11 -0700 Subject: [PATCH 07/11] chore(python3.8): Add Python3.8 to Travis builds (#1222) --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index 86e9e56e6a..98aac4ffab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,11 @@ python: - "2.7" - "3.6" - "3.7" + - "3.8-dev" + +matrix: + allow_failures: + - python: 3.8-dev addons: apt: From 81e7e134842da5ad0dfe4c7b442209c44ab1644c Mon Sep 17 00:00:00 2001 From: Jacob Fuss <32497805+jfuss@users.noreply.github.com> Date: Wed, 12 Jun 2019 17:05:48 -0700 Subject: [PATCH 08/11] remove(docs): Remove docs folder within the repo (#1221) With the updated README, we include instructions on how to update our docs in its repo: awsdocs/aws-sam-developer-guide and provide links to our dedicated docs page for getting started. --- docs/.gitkeep | 0 docs/advanced_usage.md | 265 ------- docs/deploying_serverless_applications.md | 80 -- docs/get-started-youtube.png | Bin 113149 -> 0 bytes ...bugging_serverless_applications_locally.md | 142 ---- docs/usage.md | 747 ------------------ 6 files changed, 1234 deletions(-) delete mode 100644 docs/.gitkeep delete mode 100644 docs/advanced_usage.md delete mode 100644 docs/deploying_serverless_applications.md delete mode 100644 docs/get-started-youtube.png delete mode 100644 docs/running_and_debugging_serverless_applications_locally.md delete mode 100644 docs/usage.md diff --git a/docs/.gitkeep b/docs/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/advanced_usage.md b/docs/advanced_usage.md deleted file mode 100644 index 4fa33fd076..0000000000 --- a/docs/advanced_usage.md +++ /dev/null @@ -1,265 +0,0 @@ -Advanced Usage -============== - -- [Compiled Languages](#compiled-languages) -- [IAM Credentials](#iam-credentials) -- [Lambda Environment Variables](#lambda-environment-variables) - - [Environment Variable file](#environment-variable-file) - - [Shell environment](#shell-environment) - - [Combination of Shell and Environment Variable - file](#combination-of-shell-and-environment-variable-file) -- [Identifying local execution from Lambda function - code](#identifying-local-execution-from-lambda-function-code) -- [Static Assets](#static-assets) -- [Local Logging](#local-logging) -- [Remote Docker](#remote-docker) - -Compiled Languages ------------------- - -**Java** - -To use SAM CLI with compiled languages, such as Java that require a -packaged artifact (e.g. a JAR, or ZIP), you can specify the location of -the artifact with the `AWS::Serverless::Function` `CodeUri` property in -your SAM template. - -For example: - -``` {.sourceCode .yaml} -AWSTemplateFormatVersion: 2010-09-09 -Transform: AWS::Serverless-2016-10-31 - -Resources: - ExampleJavaFunction: - Type: AWS::Serverless::Function - Properties: - Handler: com.example.HelloWorldHandler - CodeUri: ./target/HelloWorld-1.0.jar - Runtime: java8 -``` - -You should then build your JAR file using your normal build process. -Please note that JAR files used with AWS Lambda should be a shaded JAR -file (or uber jar) containing all of the function dependencies. - -``` {.sourceCode .bash} -// Build the JAR file -$ mvn package shade:shade - -// Invoke with SAM Local -$ echo '{ "some": "input" }' | sam local invoke - -// Or start local API Gateway simulator -$ sam local start-api -``` - -**.NET Core** - -To use SAM Local with compiled languages, such as .NET Core that require -a packaged artifact (e.g. a ZIP), you can specify the location of the -artifact with the `AWS::Serverless::Function` `CodeUri` property in your -SAM template. - -For example: - -``` {.sourceCode .yaml} -AWSTemplateFormatVersion: 2010-09-09 -Transform: AWS::Serverless-2016-10-31 - -Resources: - ExampleDotNetFunction: - Type: AWS::Serverless::Function - Properties: - Handler: HelloWorld::HelloWorld.Function::Handler - CodeUri: ./artifacts/HelloWorld.zip - Runtime: dotnetcore2.0 -``` - -You should then build your ZIP file using your normal build process. - -You can generate a .NET Core example by using the -`sam init --runtime dotnetcore` command. - -IAM Credentials ---------------- - -SAM CLI will invoke functions with your locally configured IAM -credentials. - -As with the AWS CLI and SDKs, SAM CLI will look for credentials in the -following order: - -1. Environment Variables (`AWS_ACCESS_KEY_ID`, - `AWS_SECRET_ACCESS_KEY`). -2. The AWS credentials file (located at `~/.aws/credentials` on Linux, - macOS, or Unix, or at `C:\Users\USERNAME \.aws\credentials` on - Windows). -3. Instance profile credentials (if running on Amazon EC2 with an - assigned instance role). - -In order to test API Gateway with a non-default profile from your AWS -credentials file append `--profile ` to the `start-api` -command: - -``` {.sourceCode .bash} -// Test API Gateway locally with a credential profile. -$ sam local start-api --profile some_profile -``` - -See this [Configuring the AWS -CLI](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#config-settings-and-precedence) -for more details. - -Lambda Environment Variables ----------------------------- - -If your Lambda function uses environment variables, you can provide -values for them will passed to the Docker container. Here is how you -would do it: - -For example, consider the SAM template snippet: - -``` {.sourceCode .yaml} -Resources: - MyFunction1: - Type: AWS::Serverless::Function - Properties: - Handler: index.handler - Runtime: nodejs4.3 - Environment: - Variables: - TABLE_NAME: prodtable - BUCKET_NAME: prodbucket - - MyFunction2: - Type: AWS::Serverless::Function - Properties: - Handler: app.handler - Runtime: nodejs4.3 - Environment: - Variables: - STAGE: prod - TABLE_NAME: prodtable -``` - -Environment Variable file -------------------------- - -Use the `--env-vars` argument of the `invoke` or `start-api` commands to -provide a JSON file that contains values to override the environment -variables already defined in your function template. The file should be -structured as follows: - -``` {.sourceCode .json} -{ - "MyFunction1": { - "TABLE_NAME": "localtable", - "BUCKET_NAME": "testBucket" - }, - "MyFunction2": { - "TABLE_NAME": "localtable", - "STAGE": "dev" - }, -} -``` - -``` {.sourceCode .bash} -$ sam local start-api --env-vars env.json -``` - -Shell environment ------------------ - -Variables defined in your Shell's environment will be passed to the -Docker container, if they map to a Variable in your Lambda function. -Shell variables are globally applicable to functions ie. If two -functions have a variable called `TABLE_NAME`, then the value for -`TABLE_NAME` provided through Shell's environment will be availabe to -both functions. - -Following command will make value of `mytable` available to both -`MyFunction1` and `MyFunction2` - -``` {.sourceCode .bash} -$ TABLE_NAME=mytable sam local start-api -``` - -Combination of Shell and Environment Variable file --------------------------------------------------- - -For greater control, you can use a combination shell variables and -external environment variable file. If a variable is defined in both -places, the one from the file will override the shell. Here is the order -of priority, highest to lowest. Higher priority ones will override the -lower. - -1. Environment Variable file -2. Shell's environment -3. Hard-coded values from the template - -Identifying local execution from Lambda function code ------------------------------------------------------ - -When your Lambda function is invoked using SAM CLI, it sets an -environment variable `AWS_SAM_LOCAL=true` in the Docker container. Your -Lambda function can use this property to enable or disable functionality -that would not make sense in local development. For example: Disable -emitting metrics to CloudWatch (or) Enable verbose logging etc. - -Static Assets -------------- - -Often, it's useful to serve up static assets (e.g CSS/HTML/Javascript -etc) when developing a Serverless application. On AWS, this would -normally be done with CloudFront/S3. SAM CLI by default looks for a -`./public/` directory in your SAM project directory and will serve up -all files from it at the root of the HTTP server when using -`sam local start-api`. You can override the default static asset -directory by using the `-s` or `--static-dir` command line flag. You can -also disable this behaviour completely by setting `--static-dir ""`. - -Local Logging -------------- - -Both `invoke` and `start-api` command allow you to pipe logs from the -function's invocation into a file. This will be useful if you are -running automated tests against SAM CLI and want to capture logs for -analysis. - -Example: - -``` {.sourceCode .bash} -$ sam local invoke --log-file ./output.log -``` - -Remote Docker -------------- - -Sam CLI loads function code by mounting filesystem to a Docker Volume. -As a result, The project directory must be pre-mounted on the remote -host where the Docker is running. - -If mounted, you can use the remote docker normally using -`--docker-volume-basedir` or environment variable -`SAM_DOCKER_VOLUME_BASEDIR`. - -Example - Docker Toolbox (Windows): - -When you install and run Docker Toolbox, the Linux VM with Docker is -automatically installed in the virtual box. - -The /c/ path for this Linux VM is automatically shared with C: on the -host machine. - -``` {.sourceCode .powershell} -$ sam local invoke --docker-volume-basedir /c/Users/shlee322/projects/test "Ratings" -``` - -### Learn More - -- [Project Overview](../README.md) -- [Getting started with SAM and the SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-quick-start.html) -- [Usage](usage.md) -- [Packaging and deploying your - application](deploying_serverless_applications.md) diff --git a/docs/deploying_serverless_applications.md b/docs/deploying_serverless_applications.md deleted file mode 100644 index ca65d54a99..0000000000 --- a/docs/deploying_serverless_applications.md +++ /dev/null @@ -1,80 +0,0 @@ -Once you have created a Lambda function and a template.yaml file, you -can use the AWS CLI to package and deploy your serverless application. - -Packaging and deploying your application -======================================== - -In order to complete the procedures below, you need to first complete -the following: - -> [Set up an AWS -> Account](https://docs.aws.amazon.com/lambda/latest/dg/setup.html). -> -> [Set up the AWS -> CLI](https://docs.aws.amazon.com/lambda/latest/dg/setup-awscli.html) . - -Packaging your application -========================== - -To package your application, create an Amazon S3 bucket that the package -command will use to upload your ZIP deployment package (if you haven\'t -specified one in your example.yaml file). You can use the following -command to create the Amazon S3 bucket: - -``` {.sourceCode .bash} -aws s3 mb s3://bucket-name --region -``` - -Next, open a command prompt and type the following: - -``` {.sourceCode .bash} -sam package \ - --template-file path/template.yaml \ - --output-template-file serverless-output.yaml \ - --s3-bucket s3-bucket-name -``` - -The package command returns an AWS SAM template named -serverless-output.yaml that contains the CodeUri that points to the -deployment zip in the Amazon S3 bucket that you specified. This template -represents your serverless application. You are now ready to deploy it. - -Deploying your application -========================== - -To deploy the application, run the following command: - -``` {.sourceCode .bash} -sam deploy \ - --template-file serverless-output.yaml \ - --stack-name new-stack-name \ - --capabilities CAPABILITY_IAM -``` - -Note that the value you specify for the \--template-file parameter is -the name of the SAM template that was returned by the package command. -In addition, the `--capabilities` parameter is optional. The -AWS::Serverless::Function resource will implicitly create a role to -execute the Lambda function if one is not specified in the template. You -use the `--capabilities` parameter to explicitly acknowledge that AWS -CloudFormation is allowed to create roles on your behalf. - -When you run the aws sam deploy command, it creates an AWS -CloudFormation ChangeSet, which is a list of changes to the AWS -CloudFormation stack, and then deploys it. Some stack templates might -include resources that can affect permissions in your AWS account, for -example, by creating new AWS Identity and Access Management (IAM) users. -For those stacks, you must explicitly acknowledge their capabilities by -specifying the `--capabilities` parameter. - -To verify your results, open the AWS CloudFormation console to view the -newly created AWS CloudFormation stack and the Lambda console to view -your function. - -Learn More ----------- - -- [Project Overview](../README.md) -- [Getting started with SAM and the SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-quick-start.html) -- [Usage](usage.md) -- [Advanced](advanced_usage.md) diff --git a/docs/get-started-youtube.png b/docs/get-started-youtube.png deleted file mode 100644 index a28b0a7f43ffbfe14516a65af6338d11e6f0e8e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113149 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
qar z@EA+of2eJTe4nhZ=2IPRg$>KbwTZ1za?jl-jH?3~7F~j8FLR!40&Qv@c+^oc zy2uoM*jYqlF>VpVOS71E#TfV9kCWOV)L_QcWNoed;;LOTU0RLF=W0!52rAx+%M}PI zp5O!Fg#r+Shw{*^p11NIM$fRpR`IzL1_dArPmDJQ0u-pY zx$5qjicFN3$nMfQxqS;~Yn5bW`A&Jn5fH#?!}7hE*T@I9eqAn|c$S(9zgZ5IuTQ>N z_B!&}Fp{pw39o+>qQHeUQ8wezCe@_(XbSNK={0I?=);qePaKZTWY~Fo z5YdlDrI>sKlV`%lf#d=k8Fb$25TN;2#cYEF`{%iJoK=K9WB5A!>{DU&l#1!d}0c_xntk1 z+L&ys>?;>vzFGEMx?JvmNKuv)w_-L{QHHQCP#LtjP$8$+6V?J|WvyDhMmBBSA~#=i zjqKXF3+v~UWcA7=vd7xh*l-m?XqeeW8zKr(OqWyLX<$8BTO?bi_mFFDugb04v6onR zH}X@IHH+?)=N^L%Ofds&Y8IL!425ket&#t(yj_02{UtI2A?lDrc1acM^laX`Qw^_i zb{Ld7N;lx;7B?XbfCq#sHT53v+lm#-6#u{Y#joY7Uph}-^wL*in2(Fcshz|W30
fhpe7?9_sNC54R0>1N$Qc*I*ctT9_r6;${`P;V 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 Z4#0vuA7Y{4k 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 mV7CQ!TVS^Zc3XfJ`2PTJ3*lWv>?I$Q7n diff --git a/docs/running_and_debugging_serverless_applications_locally.md b/docs/running_and_debugging_serverless_applications_locally.md deleted file mode 100644 index 099cb12ccc..0000000000 --- a/docs/running_and_debugging_serverless_applications_locally.md +++ /dev/null @@ -1,142 +0,0 @@ -Running and debugging serverless applications locally -===================================================== - -SAM CLI works with AWS SAM, allowing you to invoke functions defined in -SAM templates, whether directly or through API Gateway endpoints. By -using SAM CLI, you can analyze your SAM application\'s performance in -your own testing environment and update accordingly. - -Invoking Lambda functions locally ---------------------------------- - -``` {.sourceCode .bash} -# Invoking function with event file - -$ echo '{"message": "Hey, are you there?" }' | sam local invoke "Ratings" - -# For more options - -$ sam local invoke --help -``` - -Running API Gateway Locally ---------------------------- - -start-api: Creates a local HTTP server hosting all of your Lambda -functions. When accessed by using a browser or the CLI, this operation -launches a Docker container locally to invoke your function. It reads -the CodeUri property of the AWS::Serverless::Function resource to find -the path in your file system containing the Lambda function code. This -path can be the project's root directory for interpreted languages like -Node.js or Python, a build directory that stores your compiled -artifacts, or for Java, a .jar file. - -If you use an interpreted language, local changes are made available -without rebuilding. This approach means you can reinvoke your Lambda -function with no need to restart the CLI. - -invoke: Invokes a local Lambda function once and terminates after -invocation completes. - -``` {.sourceCode .} -$ sam local start-api - -2018-05-08 08:48:38 Mounting HelloWorld at http://127.0.0.1:3000/ [GET] -2018-05-08 08:48:38 Mounting HelloWorld at http://127.0.0.1:3000/thumbnail [GET] -2018-05-08 08:48:38 You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template -2018-05-08 08:48:38 * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit) -``` - -Debugging With SAM CLI ----------------------- - -Both sam local invoke and sam local start-api support local debugging of -your functions. To run SAM CLI with debugging support enabled, specify -\--debug-port or -d on the command line. - -``` {.sourceCode .bash} -# Invoke a function locally in debug mode on port 5858 - -$ sam local invoke -d 5858 function logical id - -# Start local API Gateway in debug mode on port 5858 - -$ sam local start-api -d 5858 -``` - -If you use sam local start-api, the local API Gateway exposes all of -your Lambda functions. But because you can specify only one debug port, -you can only debug one function at a time. - -Connecting a Debugger to your IDE ---------------------------------- - -For compiled languages or projects requiring complex packing support, we -recommend that you run your own build solution and point AWS SAM to the -directory that contains the build dependency files needed. You can use -the following IDEs or one of your choosing. - -- Cloud9 -- Eclipse -- Visual Studio Code - -Integrating other services --------------------------- - -You can use the AWS Serverless Application Model to integrate other -services as event sources to your application. For example, assume you -have an application that requires a Dynamo DB table. The following shows -an example: - -``` {.sourceCode .yaml} -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Resources: - ProcessDynamoDBStream: - Type: AWS::Serverless::Function - Properties: - Handler: handler - Runtime: runtime - Policies: AWSLambdaDynamoDBExecutionRole - Events: - Stream: - Type: DynamoDB - Properties: - Stream: !GetAtt DynamoDBTable.StreamArn - BatchSize: 100 - StartingPosition: TRIM_HORIZON - - DynamoDBTable: - Type: AWS::DynamoDB::Table - Properties: - AttributeDefinitions: - - AttributeName: id - AttributeType: S - KeySchema: - - AttributeName: id - KeyType: HASH - ProvisionedThroughput: - ReadCapacityUnits: 5 - WriteCapacityUnits: 5 - StreamSpecification: - StreamViewType: NEW_IMAGE -``` - -Validate your SAM template --------------------------- - -You can use SAM CLI to validate your template against the official AWS -Serverless Application Model specification. The following is an example -if you specify either an unsupported runtime or deprecated runtime -version. - -``` {.sourceCode .} -$ sam validate - -Error: Invalid Serverless Application Specification document. Number of errors found: 1. Resource with id [SkillFunction] is invalid. property Runtim not defined for resource of type AWS::Serverless::Function - -$ sed -i 's/Runtim/Runtime/g` template.yaml - -$ sam validate -template.yaml is a valid SAM Template -``` diff --git a/docs/usage.md b/docs/usage.md deleted file mode 100644 index 59548cf95c..0000000000 --- a/docs/usage.md +++ /dev/null @@ -1,747 +0,0 @@ -Usage -===== - -**Create a sample app with sam init command**: `sam init` or -`sam init --runtime ` - -`sam` requires a SAM template in order to know how to invoke your -function locally, and it's also true for spawning API Gateway locally --If no template is specified `template.yaml` will be used instead. - -Alternatively, you can find other sample SAM Templates by visiting -[SAM](https://github.com/awslabs/serverless-application-model) official -repository. - -- [Invoke functions locally](#invoke-functions-locally) -- [Run automated tests for your Lambda functions - locally](#run-automated-tests-for-your-lambda-functions-locally) -- [Generate sample event source - payloads](#generate-sample-event-payloads) -- [Run API Gateway locally](#run-api-gateway-locally) -- [Debugging Applications](#debugging-applications) - - [Debugging Python functions](#debugging-python-functions) -- [Fetch, tail, and filter Lambda function - logs](#fetch-tail-and-filter-lambda-function-logs) -- [Validate SAM templates](#validate-sam-templates) -- [Package and Deploy to Lambda](#package-and-deploy-to-lambda) - -Invoke functions locally ------------------------- - -![SAM CLI Invoke Sample](../media/sam-invoke.gif) - -You can invoke your function locally by passing its \--SAM logical -ID\--and an event file. Alternatively, `sam local invoke` accepts stdin -as an event too. - -``` {.sourceCode .yaml} -Resources: - Ratings: # <-- Logical ID - Type: 'AWS::Serverless::Function' - ... -``` - -**Syntax** - -``` {.sourceCode .bash} -# Invoking function with event file -$ sam local invoke "Ratings" -e event.json - -# Invoking function with event via stdin -$ echo '{"message": "Hey, are you there?" }' | sam local invoke "Ratings" - -# For more options -$ sam local invoke --help -``` - -Run automated tests for your Lambda functions locally ------------------------------------------------------ - -You can use the `sam local invoke` command to manually test your code by -running Lambda function locally. With SAM CLI, you can easily author -automated integration tests by first running tests against local Lambda -functions before deploying to the cloud. The `sam local start-lambda` -command starts a local endpoint that emulates the AWS Lambda service's -invoke endpoint, and you can invoke it from your automated tests. -Because this endpoint emulates the Lambda service\'s invoke endpoint, -you can write tests once and run them (without any modifications) -against the local Lambda function or against a deployed Lambda function. -You can also run the same tests against a deployed SAM stack in your -CI/CD pipeline. - -Here is how this works: - -**1. Start the Local Lambda Endpoint** - -Start the local Lambda endpoint by running the following command in the -directory that contains your AWS SAM template: - -``` {.sourceCode .bash} -sam local start-lambda -``` - -This command starts a local endpoint at that -emulates the AWS Lambda service, and you can run your automated tests -against this local Lambda endpoint. When you send an invoke to this -endpoint using the AWS CLI or SDK, it will locally execute the Lambda -function specified in the request and return a response. - -**2. Run integration test against local Lambda endpoint** - -In your integration test, you can use AWS SDK to invoke your Lambda -function with test data, wait for response, and assert that the response -what you expect. To run the integration test locally, you should -configure AWS SDK to send Lambda Invoke API call to local Lambda -endpoint started in previous step. - -Here is an Python example (AWS SDK for other languages have similar -configurations): - -``` {.sourceCode .python} -import boto3 -import botocore - -# Set "running_locally" flag if you are running the integration test locally -running_locally = True - -if running_locally: - - # Create Lambda SDK client to connect to appropriate Lambda endpoint - lambda_client = boto3.client('lambda', - region_name="us-west-2", - endpoint_url="http://127.0.0.1:3001", - use_ssl=False, - verify=False, - config=botocore.client.Config( - signature_version=botocore.UNSIGNED, - read_timeout=0, - retries={'max_attempts': 0}, - ) - ) -else: - lambda_client = boto3.client('lambda') - - -# Invoke your Lambda function as you normally usually do. The function will run -# locally if it is configured to do so -response = lambda_client.invoke(FunctionName="HelloWorldFunction") - -# Verify the response -assert response == "Hello World" -``` - -This code can run without modifications against a Lambda function which -is deployed. To do so, set the `running_locally` flag to `False` . This -will setup AWS SDK to connect to AWS Lambda service on the cloud. - -Connecting to docker network ----------------------------- - -Both `sam local invoke` and `sam local start-api` support connecting the -create lambda docker containers to an existing docker network. - -To connect the containers to an existing docker network, you can use the -`--docker-network` command-line argument or the `SAM_DOCKER_NETWORK` -environment variable along with the name or id of the docker network you -wish to connect to. - -``` {.sourceCode .bash} -# Invoke a function locally and connect to a docker network -$ sam local invoke --docker-network my-custom-network - -# Start local API Gateway and connect all containers to a docker network -$ sam local start-api --docker-network b91847306671 -d 5858 -``` - -Generate sample event payloads ------------------------------- - -To make local development and testing of Lambda functions easier, you -can generate and customize event payloads for the following services: - -- Amazon Alexa -- Amazon API Gateway -- AWS Batch -- AWS CloudFormation -- Amazon CloudFront -- AWS CodeCommit -- AWS CodePipeline -- Amazon Cognito -- AWS Config -- Amazon DynamoDB -- Amazon Kinesis -- Amazon Lex -- Amazon Rekognition -- Amazon S3 -- Amazon SES -- Amazon SNS -- Amazon SQS -- AWS Step Functions - -**Syntax** - -``` {.sourceCode .bash} -$ sam local generate-event -``` - -You can generate multiple types of events from each service. For -example, to generate the event from S3 when a new object is created, -use: - -``` {.sourceCode .bash} -$ sam local generate-event s3 put -``` - -To generate the event from S3 when an object is deleted, you can use: - -``` {.sourceCode .bash} -$ sam local generate-event s3 delete -``` - -For more options, see `sam local generate-event --help`. - -Run API Gateway locally ------------------------ - -`sam local start-api` spawns a local API Gateway to test HTTP -request/response functionality. Features hot-reloading to allow you to -quickly develop and iterate over your functions. - -![SAM CLI Start API](../media/sam-start-api.gif) - -**Syntax** - -``` {.sourceCode .bash} -$ sam local start-api -``` - -`sam` will automatically find any functions within your SAM template -that have `Api` event sources defined, and mount them at the defined -HTTP paths. - -In the example below, the `Ratings` function would mount -`ratings.py:handler()` at `/ratings` for `GET` requests. - -``` {.sourceCode .yaml} -Ratings: - Type: AWS::Serverless::Function - Properties: - Handler: ratings.handler - Runtime: python3.6 - Events: - Api: - Type: Api - Properties: - Path: /ratings - Method: get -``` - -By default, SAM uses [Proxy -Integration](http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html) -and expects the response from your Lambda function to include one or -more of the following: `statusCode`, `headers` and/or `body`. - -For example: - -``` {.sourceCode .javascript} -// Example of a Proxy Integration response -exports.handler = (event, context, callback) => { - callback(null, { - statusCode: 200, - headers: { "x-custom-header" : "my custom header value" }, - body: "hello world" - }); -} -``` - -For examples in other AWS Lambda languages, see [this -page](http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html). - -If your function does not return a valid [Proxy -Integration](http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html) -response then you will get a HTTP 500 (Internal Server Error) when -accessing your function. SAM CLI will also print the following error log -message to help you diagnose the problem: - - ERROR: Function ExampleFunction returned an invalid response (must include one of: body, headers or statusCode in the response object) - -Debugging Applications ----------------------- - -Both `sam local invoke` and `sam local start-api` support local -debugging of your functions. - -To run SAM Local with debugging support enabled, just specify -`--debug-port` or `-d` on the command line. SAM CLI debug port option -`--debug-port` or `-d` will map that port to the local Lambda container -execution your IDE needs to connect to. - -``` {.sourceCode .bash} -# Invoke a function locally in debug mode on port 5858 -$ sam local invoke -d 5858 - -# Start local API Gateway in debug mode on port 5858 -$ sam local start-api -d 5858 -``` - -Note: If using `sam local start-api`, the local API Gateway will expose -all of your Lambda functions but, since you can specify a single debug -port, you can only debug one function at a time. You will need to hit -your API before SAM CLI binds to the port allowing the debugger to -connect. - -Here is an example showing how to debug a NodeJS function with Microsoft -Visual Studio Code: - -![SAM Local debugging example](../media/sam-debug.gif) - -In order to setup Visual Studio Code for debugging with AWS SAM CLI, use -the following launch configuration after setting directory where the -template.yaml is present as workspace root in Visual Studio Code: - -``` {.sourceCode .json} -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Attach to SAM CLI", - "type": "node", - "request": "attach", - "address": "localhost", - "port": 5858, - // From the sam init example, it would be "${workspaceRoot}/hello_world" - "localRoot": "${workspaceRoot}/{directory of node app}", - "remoteRoot": "/var/task", - "protocol": "inspector", - "stopOnEntry": false - } - ] - } -``` - -Note: localRoot is set based on what the CodeUri points at -template.yaml, if there are nested directories within the CodeUri, that -needs to be reflected in localRoot. - -Note: Node.js versions \--below\-- 7 (e.g. Node.js 4.3 and Node.js 6.10) -use the `legacy` protocol, while Node.js versions including and above 7 -(e.g. Node.js 8.10) use the `inspector` protocol. Be sure to specify the -corresponding protocol in the `protocol` entry of your launch -configuration. This was tested with VS code version 1.26, 1.27 and 1.28 -for `legacy` and `inspector` protocol. - -Debugging Python functions --------------------------- - -Python debugging requires you to enable remote debugging in your Lambda -function code, therefore it\'s a 2-step process: - -1. Install [ptvsd](https://pypi.org/project/ptvsd/) library and enable - within your code -2. Configure your IDE to connect to the debugger you configured for - your function - -As this may be your first time using SAM CLI, let\'s start with a -boilerplate Python app and install both app\'s dependencies and ptvsd: - -``` {.sourceCode .bash} -sam init --runtime python3.6 --name python-debugging -cd python-debugging/ - -# Install dependencies of our boilerplate app -pip install -r requirements.txt -t hello_world/build/ - -# Install ptvsd library for step through debugging -pip install ptvsd -t hello_world/build/ - -cp hello_world/app.py hello_world/build/ -``` - -### Ptvsd configuration - -As we installed ptvsd library in the previous step, we need to enable -ptvsd within our code, therefore open up `hello_world/build/app.py` and -add the following ptvsd specifics. - -``` {.sourceCode .python} -import ptvsd - -# Enable ptvsd on 0.0.0.0 address and on port 5890 that we'll connect later with our IDE -ptvsd.enable_attach(address=('0.0.0.0', 5890), redirect_output=True) -ptvsd.wait_for_attach() -``` - -**0.0.0.0** instead of **localhost** for listening across all network -interfaces and **5890** is the debugging port of your preference. - -### Visual Studio Code - -Now that we have both dependencies and ptvsd enabled within our code we -configure Visual Studio Code (VS Code) Debugging - Assuming you\'re -still in the application folder and have code command in your path, -let\'s open up VS Code: - -``` {.sourceCode .bash} -code . -``` - -`NOTE`: If you don\'t have code in your Path, please open up a new -instance of VS Code from `python-debugging/` folder we created earlier. - -In order to setup VS Code for debugging with AWS SAM CLI, use the -following launch configuration: - -``` {.sourceCode .json} -{ - "version": "0.2.0", - "configurations": [ - { - "name": "SAM CLI Python Hello World", - "type": "python", - "request": "attach", - "port": 5890, - "host": "localhost", - "pathMappings": [ - { - "localRoot": "${workspaceFolder}/hello_world/build", - "remoteRoot": "/var/task" - } - ] - } - ] - } -``` - -For VS Code, the property **localRoot** under **pathMappings** key is -really important and there are 2 aspects you should know as to why this -is setup this way: - -1. **localRoot**: This path will be mounted in the Docker Container and - needs to have both application and dependencies at the root level -2. **workspaceFolder**: This path is the absolute path where VS Code - instance was opened - -If you opened VS Code in a different location other than -`python-debugging/` you need to replace it with the absolute path where -`python-debugging/` is. - -Once complete with VS Code Debugger configuration, make sure to add a -breakpoint anywhere you like in `hello_world/build/app.py` and then -proceed as follows: - -1. Run SAM CLI to invoke your function -2. Hit the URL to invoke the function and initialize ptvsd code - execution -3. Start the debugger within VS Code - -``` {.sourceCode .bash} -# Remember to hit the URL before starting the debugger in VS Code - -sam local start-api -d 5890 - -# OR - -# Change HelloWorldFunction to reflect the logical name found in template.yaml - -sam local generate-event apigateway aws-proxy | sam local invoke HelloWorldFunction -d 5890 -``` - -Debugging Golang functions --------------------------- - -Golang function debugging is slightly different when compared to -Node.JS, Java, and Python. We require -[delve](https://github.com/go-delve/delve) as the debugger, and wrap -your function with it at runtime. The debugger is run in headless mode, -listening on the debug port. - -When debugging, you must compile your function in debug mode: - -`GOARCH=amd64 GOOS=linux go build -gcflags='-N -l' -o ` - -You must compile [delve]{.title-ref} to run in the container and provide -its local path via the [\--debugger-path]{.title-ref} argument. Build -delve locally as follows: - -`GOARCH=amd64 GOOS=linux go build -o /dlv github.com/go-delve/delve/cmd/dlv` - -NOTE: The output path needs to end in [/dlv]{.title-ref}. The docker -container will expect the dlv binary to be in the \ -and will cause mounting issue otherwise. - -Then invoke [sam]{.title-ref} similar to the following: - -`sam local start-api -d 5986 --debugger-path ` - -NOTE: The `--debugger-path` is the path to the directory that contains -the [dlv]{.title-ref} binary compiled from the above. - -The following is an example launch configuration for Visual Studio Code -to attach to a debug session. - -``` {.sourceCode .json} -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Connect to Lambda container", - "type": "go", - "request": "launch", - "mode": "remote", - "remotePath": "", - "port": , - "host": "127.0.0.1", - "program": "${workspaceRoot}", - "env": {}, - "args": [], - }, - ] -} -``` - -Debugging .NET Core 2.1 / 2.0 Functions ---------------------------------------- - -.NET Core function debugging is similiar to golang function debugging -and requires you to have `vsdbg` available on your machine to later -provide it to SAM CLI. VS Code will launch debugger inside Lambda -container and talk to it using `pipeTransport` configuration. - -When debugging, you must compile your function in debug mode: - -Either locally using .NET SDK - -``` {.sourceCode .bash} -dotnet publish -c Debug -o -``` - -Or via Docker - -``` {.sourceCode .bash} -docker run --rm --mount type=bind,src=$PWD,dst=/var/task lambci/lambda:build-dotnetcore dotnet publish -c Debug -o -``` - -**NOTE: both of these commands should be run from the directory with -.csproj file** - -You must get `vsdbg` built for AWS Lambda runtime container on your host -machine and provide its local path via the `--debugger-path` argument. -Get compatible debugger version as follows: - -``` {.sourceCode .bash} -# Create directory to store vsdbg -mkdir - -# Get and install vsdbg on runtime container. Mounted folder will let you have it under on your machine too -docker run --rm --mount type=bind,src=,dst=/vsdbg --entrypoint bash lambci/lambda:dotnetcore2.0 -c "curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l /vsdbg" -``` - -Then invoke `sam` similar to the following: - -`sam local start-api -d --debugger-path ` - -NOTE: The `--debugger-path` is the path to the directory that contains -the `vsdbg` binary installed from the above. - -The following is an example launch configuration for Visual Studio Code -to attach to a debug session. - -``` {.sourceCode .json} -{ - "version": "0.2.0", - "configurations": [ - { - "name": ".NET Core Docker Attach", - "type": "coreclr", - "request": "attach", - "processId": "1", - - "pipeTransport": { - "pipeProgram": "sh", - "pipeArgs": [ - "-c", - "docker exec -i $(docker ps -q -f publish=) ${debuggerCommand}" - ], - "debuggerPath": "/tmp/lambci_debug_files/vsdbg", - "pipeCwd": "${workspaceFolder}", - }, - - "windows": { - "pipeTransport": { - "pipeProgram": "powershell", - "pipeArgs": [ - "-c", - "docker exec -i $(docker ps -q -f publish=) ${debuggerCommand}" - ], - "debuggerPath": "/tmp/lambci_debug_files/vsdbg", - "pipeCwd": "${workspaceFolder}", - } - }, - - "sourceFileMap": { - "/var/task": "${workspaceFolder}" - } - } - ] -} -``` - -Passing Additional Runtime Debug Arguments ------------------------------------------- - -To pass additional runtime arguments when debugging your function, use -the environment variable `DEBUGGER_ARGS`. This will pass a string of -arguments directly into the run command SAM CLI uses to start your -function. - -For example, if you want to load a debugger like iKPdb at runtime of -your Python function, you could pass the following as `DEBUGGER_ARGS`: -`-m ikpdb --ikpdb-port=5858 --ikpdb-working-directory=/var/task/ --ikpdb-client-working-directory=/myApp --ikpdb-address=0.0.0.0`. -This would load iKPdb at runtime with the other arguments you've -specified. In this case, your full SAM CLI command would be: - -``` {.sourceCode .bash} -$ DEBUGGER_ARGS="-m ikpdb --ikpdb-port=5858 --ikpdb-working-directory=/var/task/ --ikpdb-client-working-directory=/myApp --ikpdb-address=0.0.0.0" echo {} | sam local invoke -d 5858 myFunction -``` - -You may pass debugger arguments to functions of all runtimes. - -To simplify troubleshooting, we added a new command called `sam logs` to -SAM CLI. `sam logs` lets you fetch logs generated by your Lambda -function from the command line. In addition to printing the logs on the -terminal, this command has several nifty features to help you quickly -find the bug. Note: This command works for all AWS Lambda functions; not -just the ones you deploy using SAM. - -Fetch, tail, and filter Lambda function logs --------------------------------------------- - -To simplify troubleshooting, SAM CLI has a command called `sam logs`. -`sam logs` lets you fetch logs generated by your Lambda function from -the command line. In addition to printing the logs on the terminal, this -command has several nifty features to help you quickly find the bug. - -Note: This command works for all AWS Lambda functions; not just the ones -you deploy using SAM. - -**Basic Usage: Using CloudFormation Stack** - -When your function is a part of a CloudFormation stack, you can fetch -logs using the function\'s LogicalID: - -``` {.sourceCode .bash} -sam logs -n HelloWorldFunction --stack-name mystack -``` - -**Basic Usage: Using Lambda Function name** - -Or, you can fetch logs using the function\'s name - -``` {.sourceCode .bash} -sam logs -n mystack-HelloWorldFunction-1FJ8PD -``` - -**Tail Logs** - -Add `--tail` option to wait for new logs and see them as they arrive. -This is very handy during deployment or when troubleshooting a -production issue. - -``` {.sourceCode .bash} -sam logs -n HelloWorldFunction --stack-name mystack --tail -``` - -**View logs for specific time range** You can view logs for specific -time range using the `-s` and `-e` options - -``` {.sourceCode .bash} -sam logs -n HelloWorldFunction --stack-name mystack -s '10min ago' -e '2min ago' -``` - -**Filter Logs** - -Use the `--filter` option to quickly find logs that match terms, phrases -or values in your log events - -``` {.sourceCode .bash} -sam logs -n HelloWorldFunction --stack-name mystack --filter "error" -``` - -In the output, SAM CLI will underline all occurrences of the word -"error" so you can easily locate the filter keyword within the log -output. - -**Error Highlighting** - -When your Lambda function crashes or times out, SAM CLI will highlight -the timeout message in red. This will help you easily locate specific -executions that are timing out within a giant stream of log output. - -![](https://user-images.githubusercontent.com/22755571/42301038-3363a366-7fc8-11e8-9d0e-308b209cb92b.png) - -**JSON pretty printing** - -If your log messages print JSON strings, SAM CLI will automatically -pretty print the JSON to help you visually parse and understand the -JSON. - -![](https://user-images.githubusercontent.com/22755571/42301064-50c6cffa-7fc8-11e8-8f31-04ef117a9c5a.png) - -Validate SAM templates ----------------------- - -Validate your templates with `$ sam validate`. Currently this command -will validate that the template provided is valid JSON / YAML. As with -most SAM CLI commands, it will look for a `template.[yaml|yml]` file in -your current working directory by default. You can specify a different -template file/location with the `-t` or `--template` option. - -**Syntax** - -``` {.sourceCode .bash} -$ sam validate -/template.yml is a valid SAM Template -``` - -Note: The validate command requires AWS credentials to be configured. -See [IAM Credentials](#iam-credentials). - -Package and Deploy to Lambda ----------------------------- - -Once you have developed and tested your Serverless application locally, -you can deploy to Lambda using `sam package` and `sam deploy` command. - -`sam package` command will zip your code artifacts, upload to S3 and -produce a SAM file that is ready to be deployed to Lambda using AWS -CloudFormation. - -`sam deploy` command will deploy the packaged SAM template to -CloudFormation. - -Both `sam package` and `sam deploy` are identical to their AWS CLI -equivalents commands [aws cloudformation -package](http://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) -and [aws cloudformation -deploy](http://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/index.html) -respectively - Please consult the AWS CLI command documentation for -usage. - -Example: - -``` {.sourceCode .bash} -# Package SAM template -$ sam package --template-file sam.yaml --s3-bucket mybucket --output-template-file packaged.yaml - -# Deploy packaged SAM template -$ sam deploy --template-file ./packaged.yaml --stack-name mystack --capabilities CAPABILITY_IAM -``` - -Learn More ----------- - -- [Project Overview](../README.md) -- [Getting started with SAM and the SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-quick-start.html) -- [Packaging and deploying your - application](deploying_serverless_applications.md) -- [Advanced](advanced_usage.md) From 513fe03b26e5799bbdd0e76ba6f06a19b5ee2051 Mon Sep 17 00:00:00 2001 From: Vikranth Srivatsa <51216482+viksrivat@users.noreply.github.com> Date: Mon, 24 Jun 2019 11:51:42 -0700 Subject: [PATCH 09/11] feat(start-api) Support stage name and stage variables (#1203) --- .../commands/local/lib/local_api_service.py | 14 +- samcli/commands/local/lib/provider.py | 12 +- samcli/commands/local/lib/sam_api_provider.py | 67 ++- samcli/commands/local/lib/swagger/parser.py | 1 - samcli/local/apigw/local_apigw_service.py | 16 +- .../local/start_api/test_start_api.py | 54 +++ .../testdata/start_api/swagger-template.yaml | 28 +- .../testdata/start_api/template.yaml | 3 +- .../local/lib/test_local_api_service.py | 42 +- .../local/lib/test_sam_api_provider.py | 390 +++++++++++++----- .../local/apigw/test_local_apigw_service.py | 18 +- 11 files changed, 509 insertions(+), 136 deletions(-) diff --git a/samcli/commands/local/lib/local_api_service.py b/samcli/commands/local/lib/local_api_service.py index df15675191..d0ebbbd975 100644 --- a/samcli/commands/local/lib/local_api_service.py +++ b/samcli/commands/local/lib/local_api_service.py @@ -100,9 +100,9 @@ def _make_routing_list(api_provider): routes = [] for api in api_provider.get_all(): route = Route(methods=[api.method], function_name=api.function_name, path=api.path, - binary_types=api.binary_media_types) + binary_types=api.binary_media_types, stage_name=api.stage_name, + stage_variables=api.stage_variables) routes.append(route) - return routes @staticmethod @@ -139,11 +139,11 @@ def _print_routes(api_provider, host, port): for _, config in grouped_api_configs.items(): methods_str = "[{}]".format(', '.join(config["methods"])) output = "Mounting {} at http://{}:{}{} {}".format( - config["function_name"], - host, - port, - config["path"], - methods_str) + config["function_name"], + host, + port, + config["path"], + methods_str) print_lines.append(output) LOG.info(output) diff --git a/samcli/commands/local/lib/provider.py b/samcli/commands/local/lib/provider.py index c8265c81e6..eead981089 100644 --- a/samcli/commands/local/lib/provider.py +++ b/samcli/commands/local/lib/provider.py @@ -216,10 +216,16 @@ def get_all(self): "cors", # List(Str). List of the binary media types the API - "binary_media_types" + "binary_media_types", + # The Api stage name + "stage_name", + # The variables for that stage + "stage_variables" ]) -_ApiTuple.__new__.__defaults__ = (None, # Cors is optional and defaults to None - [] # binary_media_types is optional and defaults to empty +_ApiTuple.__new__.__defaults__ = (None, # Cors is optional and defaults to None + [], # binary_media_types is optional and defaults to empty, + None, # Stage name is optional with default None + None # Stage variables is optional with default None ) diff --git a/samcli/commands/local/lib/sam_api_provider.py b/samcli/commands/local/lib/sam_api_provider.py index 19b0559a3b..84336a8d2d 100644 --- a/samcli/commands/local/lib/sam_api_provider.py +++ b/samcli/commands/local/lib/sam_api_provider.py @@ -15,7 +15,6 @@ class SamApiProvider(ApiProvider): - _IMPLICIT_API_RESOURCE_ID = "ServerlessRestApi" _SERVERLESS_FUNCTION = "AWS::Serverless::Function" _SERVERLESS_API = "AWS::Serverless::Api" @@ -127,6 +126,8 @@ def _extract_from_serverless_api(self, logical_id, api_resource, collector): body = properties.get("DefinitionBody") uri = properties.get("DefinitionUri") binary_media = properties.get("BinaryMediaTypes", []) + stage_name = properties.get("StageName") + stage_variables = properties.get("Variables") if not body and not uri: # Swagger is not found anywhere. @@ -146,6 +147,9 @@ def _extract_from_serverless_api(self, logical_id, api_resource, collector): collector.add_binary_media_types(logical_id, parser.get_binary_media_types()) # Binary media from swagger collector.add_binary_media_types(logical_id, binary_media) # Binary media specified on resource in template + collector.add_stage_name(logical_id, stage_name) + collector.add_stage_variables(logical_id, stage_variables) + @staticmethod def _merge_apis(collector): """ @@ -324,7 +328,7 @@ class ApiCollector(object): # This is intentional because it allows us to easily extend this class to support future properties on the API. # We will store properties of Implicit APIs also in this format which converges the handling of implicit & explicit # APIs. - Properties = namedtuple("Properties", ["apis", "binary_media_types", "cors"]) + Properties = namedtuple("Properties", ["apis", "binary_media_types", "cors", "stage_name", "stage_variables"]) def __init__(self): # API properties stored per resource. Key is the LogicalId of the AWS::Serverless::Api resource and @@ -387,6 +391,40 @@ def add_binary_media_types(self, logical_id, binary_media_types): else: LOG.debug("Unsupported data type of binary media type value of resource '%s'", logical_id) + def add_stage_name(self, logical_id, stage_name): + """ + Stores the stage name for the API with the given local ID + + Parameters + ---------- + logical_id : str + LogicalId of the AWS::Serverless::Api resource + + stage_name : str + The stage_name string + + """ + properties = self._get_properties(logical_id) + properties = properties._replace(stage_name=stage_name) + self._set_properties(logical_id, properties) + + def add_stage_variables(self, logical_id, stage_variables): + """ + Stores the stage variables for the API with the given local ID + + Parameters + ---------- + logical_id : str + LogicalId of the AWS::Serverless::Api resource + + stage_variables : dict + A dictionary containing stage variables. + + """ + properties = self._get_properties(logical_id) + properties = properties._replace(stage_variables=stage_variables) + self._set_properties(logical_id, properties) + def _get_apis_with_config(self, logical_id): """ Returns the list of APIs in this resource along with other extra configuration such as binary media types, @@ -410,12 +448,16 @@ def _get_apis_with_config(self, logical_id): # These configs need to be applied to each API binary_media = sorted(list(properties.binary_media_types)) # Also sort the list to keep the ordering stable cors = properties.cors + stage_name = properties.stage_name + stage_variables = properties.stage_variables result = [] for api in properties.apis: # Create a copy of the API with updated configuration updated_api = api._replace(binary_media_types=binary_media, - cors=cors) + cors=cors, + stage_name=stage_name, + stage_variables=stage_variables) result.append(updated_api) return result @@ -440,10 +482,27 @@ def _get_properties(self, logical_id): self.by_resource[logical_id] = self.Properties(apis=[], # Use a set() to be able to easily de-dupe binary_media_types=set(), - cors=None) + cors=None, + stage_name=None, + stage_variables=None) return self.by_resource[logical_id] + def _set_properties(self, logical_id, properties): + """ + Sets the properties of resource with given logical ID. If a resource is not found, it does nothing + + Parameters + ---------- + logical_id : str + Logical ID of the resource + properties : samcli.commands.local.lib.sam_api_provider.ApiCollector.Properties + Properties object for this resource. + """ + + if logical_id in self.by_resource: + self.by_resource[logical_id] = properties + @staticmethod def _normalize_binary_media_type(value): """ diff --git a/samcli/commands/local/lib/swagger/parser.py b/samcli/commands/local/lib/swagger/parser.py index f475eb2cee..076161993c 100644 --- a/samcli/commands/local/lib/swagger/parser.py +++ b/samcli/commands/local/lib/swagger/parser.py @@ -9,7 +9,6 @@ class SwaggerParser(object): - _INTEGRATION_KEY = "x-amazon-apigateway-integration" _ANY_METHOD_EXTENSION_KEY = "x-amazon-apigateway-any-method" _BINARY_MEDIA_TYPES_EXTENSION_KEY = "x-amazon-apigateway-binary-media-types" # pylint: disable=C0103 diff --git a/samcli/local/apigw/local_apigw_service.py b/samcli/local/apigw/local_apigw_service.py index c40d57158e..7aef82dc06 100644 --- a/samcli/local/apigw/local_apigw_service.py +++ b/samcli/local/apigw/local_apigw_service.py @@ -19,7 +19,7 @@ class Route(object): - def __init__(self, methods, function_name, path, binary_types=None): + def __init__(self, methods, function_name, path, binary_types=None, stage_name=None, stage_variables=None): """ Creates an ApiGatewayRoute @@ -31,10 +31,11 @@ def __init__(self, methods, function_name, path, binary_types=None): self.function_name = function_name self.path = path self.binary_types = binary_types or [] + self.stage_name = stage_name + self.stage_variables = stage_variables class LocalApigwService(BaseLocalService): - _DEFAULT_PORT = 3000 _DEFAULT_HOST = '127.0.0.1' @@ -143,7 +144,8 @@ def _request_handler(self, **kwargs): route = self._get_current_route(request) try: - event = self._construct_event(request, self.port, route.binary_types) + event = self._construct_event(request, self.port, route.binary_types, route.stage_name, + route.stage_variables) except UnicodeDecodeError: return ServiceErrorResponses.lambda_failure_response() @@ -313,13 +315,14 @@ def _merge_response_headers(headers, multi_headers): return processed_headers @staticmethod - def _construct_event(flask_request, port, binary_types): + def _construct_event(flask_request, port, binary_types, stage_name=None, stage_variables=None): """ Helper method that constructs the Event to be passed to Lambda :param request flask_request: Flask Request :return: String representing the event """ + # pylint: disable-msg=too-many-locals identity = ContextIdentity(source_ip=flask_request.remote_addr) @@ -342,7 +345,7 @@ def _construct_event(flask_request, port, binary_types): context = RequestContext(resource_path=endpoint, http_method=method, - stage="prod", + stage=stage_name, identity=identity, path=endpoint) @@ -360,7 +363,8 @@ def _construct_event(flask_request, port, binary_types): multi_value_headers=multi_value_headers_dict, path_parameters=flask_request.view_args, path=flask_request.path, - is_base_64_encoded=is_base_64) + is_base_64_encoded=is_base_64, + stage_variables=stage_variables) event_str = json.dumps(event.to_dict()) LOG.debug("Constructed String representation of Event to invoke Lambda. Event: %s", event_str) diff --git a/tests/integration/local/start_api/test_start_api.py b/tests/integration/local/start_api/test_start_api.py index 1c83d17218..700491260d 100644 --- a/tests/integration/local/start_api/test_start_api.py +++ b/tests/integration/local/start_api/test_start_api.py @@ -496,3 +496,57 @@ def test_forward_headers_are_added_to_event(self): self.assertEquals(response_data.get("multiValueHeaders").get("X-Forwarded-Proto"), ["http"]) self.assertEquals(response_data.get("headers").get("X-Forwarded-Port"), self.port) self.assertEquals(response_data.get("multiValueHeaders").get("X-Forwarded-Port"), [self.port]) + + +class TestStartApiWithStage(StartApiIntegBaseClass): + """ + Test Class centered around the different responses that can happen in Lambda and pass through start-api + """ + template_path = "/testdata/start_api/template.yaml" + + def setUp(self): + self.url = "http://127.0.0.1:{}".format(self.port) + + def test_default_stage_name(self): + response = requests.get(self.url + "/echoeventbody") + + self.assertEquals(response.status_code, 200) + + response_data = response.json() + + self.assertEquals(response_data.get("requestContext", {}).get("stage"), "Prod") + + def test_global_stage_variables(self): + response = requests.get(self.url + "/echoeventbody") + + self.assertEquals(response.status_code, 200) + + response_data = response.json() + + self.assertEquals(response_data.get("stageVariables"), {'VarName': 'varValue'}) + + +class TestStartApiWithStageAndSwagger(StartApiIntegBaseClass): + """ + Test Class centered around the different responses that can happen in Lambda and pass through start-api + """ + template_path = "/testdata/start_api/swagger-template.yaml" + + def setUp(self): + self.url = "http://127.0.0.1:{}".format(self.port) + + def test_swagger_stage_name(self): + response = requests.get(self.url + "/echoeventbody") + + self.assertEquals(response.status_code, 200) + + response_data = response.json() + self.assertEquals(response_data.get("requestContext", {}).get("stage"), "dev") + + def test_swagger_stage_variable(self): + response = requests.get(self.url + "/echoeventbody") + + self.assertEquals(response.status_code, 200) + + response_data = response.json() + self.assertEquals(response_data.get("stageVariables"), {'VarName': 'varValue'}) diff --git a/tests/integration/testdata/start_api/swagger-template.yaml b/tests/integration/testdata/start_api/swagger-template.yaml index bee44de7cf..9f987c0d8c 100644 --- a/tests/integration/testdata/start_api/swagger-template.yaml +++ b/tests/integration/testdata/start_api/swagger-template.yaml @@ -11,7 +11,9 @@ Resources: MyApi: Type: AWS::Serverless::Api Properties: - StageName: prod + StageName: dev + Variables: + VarName: varValue DefinitionBody: swagger: "2.0" info: @@ -67,6 +69,15 @@ Resources: uri: Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${EchoBase64EventBodyFunction.Arn}/invocations + "/echoeventbody": + post: + x-amazon-apigateway-integration: + httpMethod: POST + type: aws_proxy + uri: + Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${EchoEventHandlerFunction.Arn}/invocations + + MyLambdaFunction: Type: AWS::Serverless::Function Properties: @@ -109,3 +120,18 @@ Resources: Handler: main.echo_base64_event_body Runtime: python3.6 CodeUri: . + + EchoEventHandlerFunction: + Type: AWS::Serverless::Function + Properties: + Handler: main.echo_event_handler + Runtime: python3.6 + CodeUri: . + Events: + GetApi: + Type: Api + Properties: + Path: /{proxy+} + Method: GET + RestApiId: + Ref: MyApi \ No newline at end of file diff --git a/tests/integration/testdata/start_api/template.yaml b/tests/integration/testdata/start_api/template.yaml index c18cee2079..d9786fb52f 100644 --- a/tests/integration/testdata/start_api/template.yaml +++ b/tests/integration/testdata/start_api/template.yaml @@ -7,7 +7,8 @@ Globals: # These are equivalent to image/gif and image/png when deployed - image~1gif - image~1png - + Variables: + VarName: varValue Resources: HelloWorldFunction: Type: AWS::Serverless::Function diff --git a/tests/unit/commands/local/lib/test_local_api_service.py b/tests/unit/commands/local/lib/test_local_api_service.py index dae11f6ddc..3cc5d2c4c3 100644 --- a/tests/unit/commands/local/lib/test_local_api_service.py +++ b/tests/unit/commands/local/lib/test_local_api_service.py @@ -3,10 +3,12 @@ """ from unittest import TestCase + from mock import Mock, patch -from samcli.commands.local.lib.local_api_service import LocalApiService +from samcli.commands.local.lib import provider from samcli.commands.local.lib.exceptions import NoApisDefined +from samcli.commands.local.lib.local_api_service import LocalApiService from samcli.commands.local.lib.provider import Api from samcli.local.apigw.local_apigw_service import Route @@ -43,7 +45,6 @@ def test_must_start_service(self, make_static_dir_mock, SamApiProviderMock, ApiGwServiceMock): - routing_list = [1, 2, 3] # something static_dir_path = "/foo/bar" @@ -86,7 +87,6 @@ def test_must_raise_if_route_not_available(self, make_static_dir_mock, SamApiProviderMock, ApiGwServiceMock): - routing_list = [] # Empty make_routing_list_mock.return_value = routing_list @@ -181,3 +181,39 @@ def test_must_return_none_if_path_not_exists(self, os_mock): result = LocalApiService._make_static_dir_path(cwd, static_dir) self.assertIsNone(result) + + +class TestRoutingList(TestCase): + + def setUp(self): + self.function_name = "routingTest" + apis = [ + provider.Api(path="/get", method="GET", function_name=self.function_name, cors="cors"), + provider.Api(path="/get", method="GET", function_name=self.function_name, cors="cors", stage_name="Dev"), + provider.Api(path="/post", method="POST", function_name=self.function_name, cors="cors", stage_name="Prod"), + provider.Api(path="/get", method="GET", function_name=self.function_name, cors="cors", + stage_variables={"test": "data"}), + provider.Api(path="/post", method="POST", function_name=self.function_name, cors="cors", stage_name="Prod", + stage_variables={"data": "more data"}), + ] + self.api_provider_mock = Mock() + self.api_provider_mock.get_all.return_value = apis + + def test_make_routing_list(self): + routing_list = LocalApiService._make_routing_list(self.api_provider_mock) + + expected_routes = [ + Route(function_name=self.function_name, methods=['GET'], path='/get', stage_name=None, + stage_variables=None), + Route(function_name=self.function_name, methods=['GET'], path='/get', stage_name='Dev', + stage_variables=None), + Route(function_name=self.function_name, methods=['POST'], path='/post', stage_name='Prod', + stage_variables=None), + Route(function_name=self.function_name, methods=['GET'], path='/get', stage_name=None, + stage_variables={'test': 'data'}), + Route(function_name=self.function_name, methods=['POST'], path='/post', stage_name='Prod', + stage_variables={'data': 'more data'}), + ] + self.assertEquals(len(routing_list), len(expected_routes)) + for index, r in enumerate(routing_list): + self.assertEquals(r.__dict__, expected_routes[index].__dict__) diff --git a/tests/unit/commands/local/lib/test_sam_api_provider.py b/tests/unit/commands/local/lib/test_sam_api_provider.py index 3f2a486142..3ac01956be 100644 --- a/tests/unit/commands/local/lib/test_sam_api_provider.py +++ b/tests/unit/commands/local/lib/test_sam_api_provider.py @@ -11,9 +11,6 @@ from samcli.commands.local.lib.provider import Api from samcli.commands.validate.lib.exceptions import InvalidSamDocumentException -import logging -logging.basicConfig(level=logging.INFO) - class TestSamApiProvider_init(TestCase): @@ -78,7 +75,8 @@ def test_provider_has_correct_api(self, method): provider = SamApiProvider(template) self.assertEquals(len(provider.apis), 1) - self.assertEquals(list(provider.apis)[0], Api(path="/path", method="GET", function_name="SamFunc1", cors=None)) + self.assertEquals(list(provider.apis)[0], Api(path="/path", method="GET", function_name="SamFunc1", cors=None, + stage_name="Prod")) def test_provider_creates_api_for_all_events(self): template = { @@ -113,8 +111,8 @@ def test_provider_creates_api_for_all_events(self): provider = SamApiProvider(template) - api_event1 = Api(path="/path", method="GET", function_name="SamFunc1", cors=None) - api_event2 = Api(path="/path", method="POST", function_name="SamFunc1", cors=None) + api_event1 = Api(path="/path", method="GET", function_name="SamFunc1", cors=None, stage_name="Prod") + api_event2 = Api(path="/path", method="POST", function_name="SamFunc1", cors=None, stage_name="Prod") self.assertIn(api_event1, provider.apis) self.assertIn(api_event2, provider.apis) @@ -163,8 +161,8 @@ def test_provider_has_correct_template(self): provider = SamApiProvider(template) - api1 = Api(path="/path", method="GET", function_name="SamFunc1", cors=None) - api2 = Api(path="/path", method="POST", function_name="SamFunc2", cors=None) + api1 = Api(path="/path", method="GET", function_name="SamFunc1", cors=None, stage_name="Prod") + api2 = Api(path="/path", method="POST", function_name="SamFunc2", cors=None, stage_name="Prod") self.assertIn(api1, provider.apis) self.assertIn(api2, provider.apis) @@ -260,8 +258,8 @@ def test_provider_get_all(self): result = [f for f in provider.get_all()] - api1 = Api(path="/path", method="GET", function_name="SamFunc1") - api2 = Api(path="/path", method="POST", function_name="SamFunc2") + api1 = Api(path="/path", method="GET", function_name="SamFunc1", stage_name="Prod") + api2 = Api(path="/path", method="POST", function_name="SamFunc2", stage_name="Prod") self.assertIn(api1, result) self.assertIn(api2, result) @@ -302,13 +300,13 @@ def test_provider_with_any_method(self, method): provider = SamApiProvider(template) - api_get = Api(path="/path", method="GET", function_name="SamFunc1", cors=None) - api_post = Api(path="/path", method="POST", function_name="SamFunc1", cors=None) - api_put = Api(path="/path", method="PUT", function_name="SamFunc1", cors=None) - api_delete = Api(path="/path", method="DELETE", function_name="SamFunc1", cors=None) - api_patch = Api(path="/path", method="PATCH", function_name="SamFunc1", cors=None) - api_head = Api(path="/path", method="HEAD", function_name="SamFunc1", cors=None) - api_options = Api(path="/path", method="OPTIONS", function_name="SamFunc1", cors=None) + api_get = Api(path="/path", method="GET", function_name="SamFunc1", cors=None, stage_name="Prod") + api_post = Api(path="/path", method="POST", function_name="SamFunc1", cors=None, stage_name="Prod") + api_put = Api(path="/path", method="PUT", function_name="SamFunc1", cors=None, stage_name="Prod") + api_delete = Api(path="/path", method="DELETE", function_name="SamFunc1", cors=None, stage_name="Prod") + api_patch = Api(path="/path", method="PATCH", function_name="SamFunc1", cors=None, stage_name="Prod") + api_head = Api(path="/path", method="HEAD", function_name="SamFunc1", cors=None, stage_name="Prod") + api_options = Api(path="/path", method="OPTIONS", function_name="SamFunc1", cors=None, stage_name="Prod") self.assertEquals(len(provider.apis), 7) self.assertIn(api_get, provider.apis) @@ -357,7 +355,8 @@ def test_provider_must_support_binary_media_types(self): self.assertEquals(len(provider.apis), 1) self.assertEquals(list(provider.apis)[0], Api(path="/path", method="GET", function_name="SamFunc1", - binary_media_types=["image/gif", "image/png"], cors=None)) + binary_media_types=["image/gif", "image/png"], cors=None, + stage_name="Prod")) def test_provider_must_support_binary_media_types_with_any_method(self): template = { @@ -395,13 +394,13 @@ def test_provider_must_support_binary_media_types_with_any_method(self): binary = ["image/gif", "image/png", "text/html"] expected_apis = [ - Api(path="/path", method="GET", function_name="SamFunc1", binary_media_types=binary), - Api(path="/path", method="POST", function_name="SamFunc1", binary_media_types=binary), - Api(path="/path", method="PUT", function_name="SamFunc1", binary_media_types=binary), - Api(path="/path", method="DELETE", function_name="SamFunc1", binary_media_types=binary), - Api(path="/path", method="HEAD", function_name="SamFunc1", binary_media_types=binary), - Api(path="/path", method="OPTIONS", function_name="SamFunc1", binary_media_types=binary), - Api(path="/path", method="PATCH", function_name="SamFunc1", binary_media_types=binary) + Api(path="/path", method="GET", function_name="SamFunc1", binary_media_types=binary, stage_name="Prod"), + Api(path="/path", method="POST", function_name="SamFunc1", binary_media_types=binary, stage_name="Prod"), + Api(path="/path", method="PUT", function_name="SamFunc1", binary_media_types=binary, stage_name="Prod"), + Api(path="/path", method="DELETE", function_name="SamFunc1", binary_media_types=binary, stage_name="Prod"), + Api(path="/path", method="HEAD", function_name="SamFunc1", binary_media_types=binary, stage_name="Prod"), + Api(path="/path", method="OPTIONS", function_name="SamFunc1", binary_media_types=binary, stage_name="Prod"), + Api(path="/path", method="PATCH", function_name="SamFunc1", binary_media_types=binary, stage_name="Prod") ] provider = SamApiProvider(template) @@ -427,13 +426,13 @@ class TestSamApiProviderWithExplicitApis(TestCase): def setUp(self): self.binary_types = ["image/png", "image/jpg"] self.input_apis = [ - Api(path="/path1", method="GET", function_name="SamFunc1", cors=None), - Api(path="/path1", method="POST", function_name="SamFunc1", cors=None), + Api(path="/path1", method="GET", function_name="SamFunc1", cors=None, stage_name="Prod"), + Api(path="/path1", method="POST", function_name="SamFunc1", cors=None, stage_name="Prod"), - Api(path="/path2", method="PUT", function_name="SamFunc1", cors=None), - Api(path="/path2", method="GET", function_name="SamFunc1", cors=None), + Api(path="/path2", method="PUT", function_name="SamFunc1", cors=None, stage_name="Prod"), + Api(path="/path2", method="GET", function_name="SamFunc1", cors=None, stage_name="Prod"), - Api(path="/path3", method="DELETE", function_name="SamFunc1", cors=None) + Api(path="/path3", method="DELETE", function_name="SamFunc1", cors=None, stage_name="Prod") ] def test_with_no_apis(self): @@ -455,7 +454,6 @@ def test_with_no_apis(self): self.assertEquals(provider.apis, []) def test_with_inline_swagger_apis(self): - template = { "Resources": { @@ -473,7 +471,6 @@ def test_with_inline_swagger_apis(self): assertCountEqual(self, self.input_apis, provider.apis) def test_with_swagger_as_local_file(self): - with tempfile.NamedTemporaryFile(mode='w') as fp: filename = fp.name @@ -499,7 +496,6 @@ def test_with_swagger_as_local_file(self): @patch("samcli.commands.local.lib.sam_api_provider.SamSwaggerReader") def test_with_swagger_as_both_body_and_uri(self, SamSwaggerReaderMock): - body = {"some": "body"} filename = "somefile.txt" @@ -525,19 +521,18 @@ def test_with_swagger_as_both_body_and_uri(self, SamSwaggerReaderMock): SamSwaggerReaderMock.assert_called_with(definition_body=body, definition_uri=filename, working_dir=cwd) def test_swagger_with_any_method(self): - apis = [ Api(path="/path", method="any", function_name="SamFunc1", cors=None) ] expected_apis = [ - Api(path="/path", method="GET", function_name="SamFunc1", cors=None), - Api(path="/path", method="POST", function_name="SamFunc1", cors=None), - Api(path="/path", method="PUT", function_name="SamFunc1", cors=None), - Api(path="/path", method="DELETE", function_name="SamFunc1", cors=None), - Api(path="/path", method="HEAD", function_name="SamFunc1", cors=None), - Api(path="/path", method="OPTIONS", function_name="SamFunc1", cors=None), - Api(path="/path", method="PATCH", function_name="SamFunc1", cors=None) + Api(path="/path", method="GET", function_name="SamFunc1", cors=None, stage_name="Prod"), + Api(path="/path", method="POST", function_name="SamFunc1", cors=None, stage_name="Prod"), + Api(path="/path", method="PUT", function_name="SamFunc1", cors=None, stage_name="Prod"), + Api(path="/path", method="DELETE", function_name="SamFunc1", cors=None, stage_name="Prod"), + Api(path="/path", method="HEAD", function_name="SamFunc1", cors=None, stage_name="Prod"), + Api(path="/path", method="OPTIONS", function_name="SamFunc1", cors=None, stage_name="Prod"), + Api(path="/path", method="PATCH", function_name="SamFunc1", cors=None, stage_name="Prod") ] template = { @@ -556,7 +551,6 @@ def test_swagger_with_any_method(self): assertCountEqual(self, expected_apis, provider.apis) def test_with_binary_media_types(self): - template = { "Resources": { @@ -573,26 +567,25 @@ def test_with_binary_media_types(self): expected_binary_types = sorted(self.binary_types) expected_apis = [ Api(path="/path1", method="GET", function_name="SamFunc1", cors=None, - binary_media_types=expected_binary_types), + binary_media_types=expected_binary_types, stage_name="Prod"), Api(path="/path1", method="POST", function_name="SamFunc1", cors=None, - binary_media_types=expected_binary_types), + binary_media_types=expected_binary_types, stage_name="Prod"), Api(path="/path2", method="PUT", function_name="SamFunc1", cors=None, - binary_media_types=expected_binary_types), + binary_media_types=expected_binary_types, stage_name="Prod"), Api(path="/path2", method="GET", function_name="SamFunc1", cors=None, - binary_media_types=expected_binary_types), + binary_media_types=expected_binary_types, stage_name="Prod"), Api(path="/path3", method="DELETE", function_name="SamFunc1", cors=None, - binary_media_types=expected_binary_types) + binary_media_types=expected_binary_types, stage_name="Prod") ] provider = SamApiProvider(template) assertCountEqual(self, expected_apis, provider.apis) def test_with_binary_media_types_in_swagger_and_on_resource(self): - input_apis = [ - Api(path="/path", method="OPTIONS", function_name="SamFunc1"), + Api(path="/path", method="OPTIONS", function_name="SamFunc1", stage_name="Prod"), ] extra_binary_types = ["text/html"] @@ -612,7 +605,8 @@ def test_with_binary_media_types_in_swagger_and_on_resource(self): expected_binary_types = sorted(self.binary_types + extra_binary_types) expected_apis = [ - Api(path="/path", method="OPTIONS", function_name="SamFunc1", binary_media_types=expected_binary_types), + Api(path="/path", method="OPTIONS", function_name="SamFunc1", binary_media_types=expected_binary_types, + stage_name="Prod"), ] provider = SamApiProvider(template) @@ -623,9 +617,9 @@ class TestSamApiProviderWithExplicitAndImplicitApis(TestCase): def setUp(self): self.explicit_apis = [ - Api(path="/path1", method="GET", function_name="explicitfunction", cors=None), - Api(path="/path2", method="GET", function_name="explicitfunction", cors=None), - Api(path="/path3", method="GET", function_name="explicitfunction", cors=None) + Api(path="/path1", method="GET", function_name="explicitfunction", cors=None, stage_name="Prod"), + Api(path="/path2", method="GET", function_name="explicitfunction", cors=None, stage_name="Prod"), + Api(path="/path3", method="GET", function_name="explicitfunction", cors=None, stage_name="Prod") ] self.swagger = make_swagger(self.explicit_apis) @@ -652,7 +646,6 @@ def setUp(self): } def test_must_union_implicit_and_explicit(self): - events = { "Event1": { "Type": "Api", @@ -684,20 +677,19 @@ def test_must_union_implicit_and_explicit(self): expected_apis = [ # From Explicit APIs - Api(path="/path1", method="GET", function_name="explicitfunction", cors=None), - Api(path="/path2", method="GET", function_name="explicitfunction", cors=None), - Api(path="/path3", method="GET", function_name="explicitfunction", cors=None), + Api(path="/path1", method="GET", function_name="explicitfunction", cors=None, stage_name="Prod"), + Api(path="/path2", method="GET", function_name="explicitfunction", cors=None, stage_name="Prod"), + Api(path="/path3", method="GET", function_name="explicitfunction", cors=None, stage_name="Prod"), # From Implicit APIs - Api(path="/path1", method="POST", function_name="ImplicitFunc", cors=None), - Api(path="/path2", method="POST", function_name="ImplicitFunc", cors=None), - Api(path="/path3", method="POST", function_name="ImplicitFunc", cors=None) + Api(path="/path1", method="POST", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path2", method="POST", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path3", method="POST", function_name="ImplicitFunc", cors=None, stage_name="Prod") ] provider = SamApiProvider(self.template) assertCountEqual(self, expected_apis, provider.apis) def test_must_prefer_implicit_api_over_explicit(self): - implicit_apis = { "Event1": { "Type": "Api", @@ -721,19 +713,20 @@ def test_must_prefer_implicit_api_over_explicit(self): self.template["Resources"]["ImplicitFunc"]["Properties"]["Events"] = implicit_apis expected_apis = [ - Api(path="/path1", method="GET", function_name="ImplicitFunc", cors=None), # Comes from Implicit + Api(path="/path1", method="GET", function_name="ImplicitFunc", stage_name="Prod"), + # Comes from Implicit - Api(path="/path2", method="GET", function_name="explicitfunction", cors=None), - Api(path="/path2", method="POST", function_name="ImplicitFunc", cors=None), # Comes from implicit + Api(path="/path2", method="GET", function_name="explicitfunction", cors=None, stage_name="Prod"), + Api(path="/path2", method="POST", function_name="ImplicitFunc", stage_name="Prod"), + # Comes from implicit - Api(path="/path3", method="GET", function_name="explicitfunction", cors=None), + Api(path="/path3", method="GET", function_name="explicitfunction", cors=None, stage_name="Prod"), ] provider = SamApiProvider(self.template) assertCountEqual(self, expected_apis, provider.apis) def test_must_prefer_implicit_with_any_method(self): - implicit_apis = { "Event1": { "Type": "Api", @@ -755,20 +748,19 @@ def test_must_prefer_implicit_with_any_method(self): self.template["Resources"]["ImplicitFunc"]["Properties"]["Events"] = implicit_apis expected_apis = [ - Api(path="/path", method="GET", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="POST", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="PUT", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="DELETE", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="HEAD", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="OPTIONS", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="PATCH", function_name="ImplicitFunc", cors=None) + Api(path="/path", method="GET", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="POST", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="PUT", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="DELETE", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="HEAD", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="OPTIONS", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="PATCH", function_name="ImplicitFunc", cors=None, stage_name="Prod") ] provider = SamApiProvider(self.template) assertCountEqual(self, expected_apis, provider.apis) def test_with_any_method_on_both(self): - implicit_apis = { "Event1": { "Type": "Api", @@ -798,23 +790,23 @@ def test_with_any_method_on_both(self): self.template["Resources"]["ImplicitFunc"]["Properties"]["Events"] = implicit_apis expected_apis = [ - Api(path="/path", method="GET", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="POST", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="PUT", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="DELETE", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="HEAD", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="OPTIONS", function_name="ImplicitFunc", cors=None), - Api(path="/path", method="PATCH", function_name="ImplicitFunc", cors=None), - - Api(path="/path2", method="GET", function_name="ImplicitFunc", cors=None), - Api(path="/path2", method="POST", function_name="explicitfunction", cors=None) + Api(path="/path", method="GET", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="POST", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="PUT", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="DELETE", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="HEAD", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="OPTIONS", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path", method="PATCH", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + + Api(path="/path2", method="GET", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/path2", method="POST", function_name="explicitfunction", cors=None, stage_name="Prod") ] provider = SamApiProvider(self.template) + print(provider.apis) assertCountEqual(self, expected_apis, provider.apis) def test_must_add_explicit_api_when_ref_with_rest_api_id(self): - events = { "Event1": { "Type": "Api", @@ -840,19 +832,18 @@ def test_must_add_explicit_api_when_ref_with_rest_api_id(self): expected_apis = [ # From Explicit APIs - Api(path="/path1", method="GET", function_name="explicitfunction", cors=None), - Api(path="/path2", method="GET", function_name="explicitfunction", cors=None), - Api(path="/path3", method="GET", function_name="explicitfunction", cors=None), + Api(path="/path1", method="GET", function_name="explicitfunction", cors=None, stage_name="Prod"), + Api(path="/path2", method="GET", function_name="explicitfunction", cors=None, stage_name="Prod"), + Api(path="/path3", method="GET", function_name="explicitfunction", cors=None, stage_name="Prod"), # From Implicit APIs - Api(path="/newpath1", method="POST", function_name="ImplicitFunc", cors=None), - Api(path="/newpath2", method="POST", function_name="ImplicitFunc", cors=None) + Api(path="/newpath1", method="POST", function_name="ImplicitFunc", cors=None, stage_name="Prod"), + Api(path="/newpath2", method="POST", function_name="ImplicitFunc", cors=None, stage_name="Prod") ] provider = SamApiProvider(self.template) assertCountEqual(self, expected_apis, provider.apis) def test_both_apis_must_get_binary_media_types(self): - events = { "Event1": { "Type": "Api", @@ -890,23 +881,24 @@ def test_both_apis_must_get_binary_media_types(self): expected_apis = [ # From Explicit APIs Api(path="/path1", method="GET", function_name="explicitfunction", - binary_media_types=expected_explicit_binary_types), + binary_media_types=expected_explicit_binary_types, stage_name="Prod"), Api(path="/path2", method="GET", function_name="explicitfunction", - binary_media_types=expected_explicit_binary_types), + binary_media_types=expected_explicit_binary_types, stage_name="Prod"), Api(path="/path3", method="GET", function_name="explicitfunction", - binary_media_types=expected_explicit_binary_types), + binary_media_types=expected_explicit_binary_types, stage_name="Prod"), # From Implicit APIs Api(path="/newpath1", method="POST", function_name="ImplicitFunc", - binary_media_types=expected_implicit_binary_types), + binary_media_types=expected_implicit_binary_types, + stage_name="Prod"), Api(path="/newpath2", method="POST", function_name="ImplicitFunc", - binary_media_types=expected_implicit_binary_types) + binary_media_types=expected_implicit_binary_types, + stage_name="Prod") ] provider = SamApiProvider(self.template) assertCountEqual(self, expected_apis, provider.apis) def test_binary_media_types_with_rest_api_id_reference(self): - events = { "Event1": { "Type": "Api", @@ -945,26 +937,216 @@ def test_binary_media_types_with_rest_api_id_reference(self): expected_apis = [ # From Explicit APIs Api(path="/path1", method="GET", function_name="explicitfunction", - binary_media_types=expected_explicit_binary_types), + binary_media_types=expected_explicit_binary_types, stage_name="Prod"), Api(path="/path2", method="GET", function_name="explicitfunction", - binary_media_types=expected_explicit_binary_types), + binary_media_types=expected_explicit_binary_types, stage_name="Prod"), Api(path="/path3", method="GET", function_name="explicitfunction", - binary_media_types=expected_explicit_binary_types), + binary_media_types=expected_explicit_binary_types, stage_name="Prod"), # Because of the RestApiId, Implicit APIs will also get the binary media types inherited from # the corresponding Explicit API Api(path="/connected-to-explicit-path", method="POST", function_name="ImplicitFunc", - binary_media_types=expected_explicit_binary_types), + binary_media_types=expected_explicit_binary_types, + stage_name="Prod"), # This is still just a true implicit API because it does not have RestApiId property Api(path="/true-implicit-path", method="POST", function_name="ImplicitFunc", - binary_media_types=expected_implicit_binary_types) + binary_media_types=expected_implicit_binary_types, + stage_name="Prod") ] provider = SamApiProvider(self.template) assertCountEqual(self, expected_apis, provider.apis) +class TestSamStageValues(TestCase): + + def test_provider_parse_stage_name(self): + template = { + "Resources": { + + "TestApi": { + "Type": "AWS::Serverless::Api", + "Properties": { + "StageName": "dev", + "DefinitionBody": { + "paths": { + "/path": { + "get": { + "x-amazon-apigateway-integration": { + "httpMethod": "POST", + "type": "aws_proxy", + "uri": { + "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31" + "/functions/${NoApiEventFunction.Arn}/invocations", + }, + "responses": {}, + }, + } + } + + } + } + } + } + } + } + provider = SamApiProvider(template) + api1 = Api(path='/path', method='GET', function_name='NoApiEventFunction', cors=None, binary_media_types=[], + stage_name='dev', + stage_variables=None) + + self.assertIn(api1, provider.apis) + + def test_provider_stage_variables(self): + template = { + "Resources": { + + "TestApi": { + "Type": "AWS::Serverless::Api", + "Properties": { + "StageName": "dev", + "Variables": { + "vis": "data", + "random": "test", + "foo": "bar" + }, + "DefinitionBody": { + "paths": { + "/path": { + "get": { + "x-amazon-apigateway-integration": { + "httpMethod": "POST", + "type": "aws_proxy", + "uri": { + "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31" + "/functions/${NoApiEventFunction.Arn}/invocations", + }, + "responses": {}, + }, + } + } + + } + } + } + } + } + } + provider = SamApiProvider(template) + api1 = Api(path='/path', method='GET', function_name='NoApiEventFunction', cors=None, binary_media_types=[], + stage_name='dev', + stage_variables={ + "vis": "data", + "random": "test", + "foo": "bar" + }) + + self.assertIn(api1, provider.apis) + + def test_multi_stage_get_all(self): + template = { + "Resources": { + "TestApi": { + "Type": "AWS::Serverless::Api", + "Properties": { + "StageName": "dev", + "Variables": { + "vis": "data", + "random": "test", + "foo": "bar" + }, + "DefinitionBody": { + "paths": { + "/path2": { + "get": { + "x-amazon-apigateway-integration": { + "httpMethod": "POST", + "type": "aws_proxy", + "uri": { + "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31" + "/functions/${NoApiEventFunction.Arn}/invocations", + }, + "responses": {}, + }, + } + } + } + } + } + }, + "ProductionApi": { + "Type": "AWS::Serverless::Api", + "Properties": { + "StageName": "Production", + "Variables": { + "vis": "prod data", + "random": "test", + "foo": "bar" + }, + "DefinitionBody": { + "paths": { + "/path": { + "get": { + "x-amazon-apigateway-integration": { + "httpMethod": "POST", + "type": "aws_proxy", + "uri": { + "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31" + "/functions/${NoApiEventFunction.Arn}/invocations", + }, + "responses": {}, + }, + } + }, + "/anotherpath": { + "post": { + "x-amazon-apigateway-integration": { + "httpMethod": "POST", + "type": "aws_proxy", + "uri": { + "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31" + "/functions/${NoApiEventFunction.Arn}/invocations", + }, + "responses": {}, + }, + } + } + + } + } + } + } + } + } + + provider = SamApiProvider(template) + + result = [f for f in provider.get_all()] + + api1 = Api(path='/path2', method='GET', function_name='NoApiEventFunction', cors=None, binary_media_types=[], + stage_name='dev', + stage_variables={ + "vis": "data", + "random": "test", + "foo": "bar" + }) + api2 = Api(path='/path', method='GET', function_name='NoApiEventFunction', cors=None, binary_media_types=[], + stage_name='Production', stage_variables={'vis': 'prod data', 'random': 'test', 'foo': 'bar'}) + api3 = Api(path='/anotherpath', method='POST', function_name='NoApiEventFunction', cors=None, + binary_media_types=[], + stage_name='Production', + stage_variables={ + "vis": "prod data", + "random": "test", + "foo": "bar" + }) + self.assertEquals(len(result), 3) + self.assertIn(api1, result) + self.assertIn(api2, result) + self.assertIn(api3, result) + + def make_swagger(apis, binary_media_types=None): """ Given a list of API configurations named tuples, returns a Swagger document @@ -991,7 +1173,9 @@ def make_swagger(apis, binary_media_types=None): integration = { "x-amazon-apigateway-integration": { "type": "aws_proxy", - "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:{}/invocations".format(api.function_name) # NOQA + "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1" + ":123456789012:function:{}/invocations".format( + api.function_name) # NOQA } } diff --git a/tests/unit/local/apigw/test_local_apigw_service.py b/tests/unit/local/apigw/test_local_apigw_service.py index fc07aa9ce5..ba2d6316b5 100644 --- a/tests/unit/local/apigw/test_local_apigw_service.py +++ b/tests/unit/local/apigw/test_local_apigw_service.py @@ -52,7 +52,6 @@ def test_request_must_invoke_lambda(self): @patch('samcli.local.apigw.local_apigw_service.LambdaOutputParser') def test_request_handler_returns_process_stdout_when_making_response(self, lambda_output_parser_mock): - make_response_mock = Mock() self.service.service_response = make_response_mock @@ -151,7 +150,6 @@ def test_initalize_with_values(self): @patch('samcli.local.apigw.local_apigw_service.ServiceErrorResponses') def test_request_handles_error_when_invoke_cant_find_function(self, service_error_responses_patch): - not_found_response_mock = Mock() self.service._construct_event = Mock() self.service._get_current_route = Mock() @@ -213,7 +211,6 @@ def test_request_handler_errors_when_unable_to_read_binary_data(self, service_er @patch('samcli.local.apigw.local_apigw_service.request') def test_get_current_route(self, request_patch): - request_mock = Mock() request_mock.endpoint = "path" request_mock.method = "method" @@ -253,12 +250,19 @@ class TestApiGatewayModel(TestCase): def setUp(self): self.function_name = "name" - self.api_gateway = Route(['POST'], self.function_name, '/') + self.stage_name = "Dev" + self.stage_variables = { + "test": "sample" + } + self.api_gateway = Route(['POST'], self.function_name, '/', stage_name=self.stage_name, + stage_variables=self.stage_variables) def test_class_initialization(self): self.assertEquals(self.api_gateway.methods, ['POST']) self.assertEquals(self.api_gateway.function_name, self.function_name) self.assertEquals(self.api_gateway.path, '/') + self.assertEqual(self.api_gateway.stage_name, "Dev") + self.assertEqual(self.api_gateway.stage_variables, {"test": "sample"}) class TestLambdaHeaderDictionaryMerge(TestCase): @@ -410,7 +414,7 @@ def test_status_code_int_str(self): def test_status_code_negative_int(self): lambda_output = '{"statusCode": -1, "headers": {}, "body": "{\\"message\\":\\"Hello from Lambda\\"}", ' \ - '"isBase64Encoded": false}' + '"isBase64Encoded": false}' with self.assertRaises(TypeError): LocalApigwService._parse_lambda_output(lambda_output, @@ -419,7 +423,7 @@ def test_status_code_negative_int(self): def test_status_code_negative_int_str(self): lambda_output = '{"statusCode": "-1", "headers": {}, "body": "{\\"message\\":\\"Hello from Lambda\\"}", ' \ - '"isBase64Encoded": false}' + '"isBase64Encoded": false}' with self.assertRaises(TypeError): LocalApigwService._parse_lambda_output(lambda_output, @@ -478,7 +482,7 @@ def setUp(self): '"queryStringParameters": {"query": "params"}, "resource": ' \ '"endpoint", "requestContext": {"httpMethod": "GET", "requestId": ' \ '"c6af9ac6-7b61-11e6-9a41-93e8deadbeef", "path": "endpoint", "extendedRequestId": null, ' \ - '"resourceId": "123456", "apiId": "1234567890", "stage": "prod", "resourcePath": "endpoint", ' \ + '"resourceId": "123456", "apiId": "1234567890", "stage": null, "resourcePath": "endpoint", ' \ '"identity": {"accountId": null, "apiKey": null, "userArn": null, ' \ '"cognitoAuthenticationProvider": null, "cognitoIdentityPoolId": null, "userAgent": ' \ '"Custom User Agent String", "caller": null, "cognitoAuthenticationType": null, "sourceIp": ' \ From bbb9e136a98621e31d1cc313765db18aa8d61b6c Mon Sep 17 00:00:00 2001 From: Sriram Madapusi Vasudevan <3770774+TheSriram@users.noreply.github.com> Date: Tue, 9 Jul 2019 08:46:18 -0700 Subject: [PATCH 10/11] chore: bump version to 0.18.0 (#1256) --- samcli/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samcli/__init__.py b/samcli/__init__.py index 6e3087f5e9..8232907343 100644 --- a/samcli/__init__.py +++ b/samcli/__init__.py @@ -2,4 +2,4 @@ SAM CLI version """ -__version__ = '0.17.0' +__version__ = '0.18.0' From 3e24678f8973db3ffcec54e099117398f2012305 Mon Sep 17 00:00:00 2001 From: Sriram Madapusi Vasudevan <3770774+TheSriram@users.noreply.github.com> Date: Wed, 10 Jul 2019 14:45:44 -0700 Subject: [PATCH 11/11] fix: encoding on files read for publish integ tests (#1264) --- tests/integration/publish/publish_app_integ_base.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/integration/publish/publish_app_integ_base.py b/tests/integration/publish/publish_app_integ_base.py index d2c689fb0d..7557b2ec2a 100644 --- a/tests/integration/publish/publish_app_integ_base.py +++ b/tests/integration/publish/publish_app_integ_base.py @@ -31,20 +31,20 @@ def setUpClass(cls): cls.s3_bucket.create() # Grant serverlessrepo read access to the bucket - bucket_policy_template = cls.test_data_path.joinpath("s3_bucket_policy.json").read_text() + bucket_policy_template = cls.test_data_path.joinpath("s3_bucket_policy.json").read_text(encoding="utf-8") bucket_policy = bucket_policy_template.replace(cls.bucket_name_placeholder, cls.bucket_name) cls.s3_bucket.Policy().put(Policy=bucket_policy) # Upload test files to S3 root_path = Path(__file__).resolve().parents[3] - license_body = root_path.joinpath("LICENSE").read_text() + license_body = root_path.joinpath("LICENSE").read_text(encoding="utf-8") cls.s3_bucket.put_object(Key="LICENSE", Body=license_body) - readme_body = root_path.joinpath("README.md").read_text() + readme_body = root_path.joinpath("README.md").read_text(encoding="utf-8") cls.s3_bucket.put_object(Key="README.md", Body=readme_body) cls.s3_bucket.put_object(Key="README_UPDATE.md", Body=readme_body) - code_body = cls.test_data_path.joinpath("main.py").read_text() + code_body = cls.test_data_path.joinpath("main.py").read_text(encoding="utf-8") cls.s3_bucket.put_object(Key="main.py", Body=code_body) @classmethod @@ -61,7 +61,7 @@ def tearDownClass(cls): def replace_template_placeholder(cls, placeholder, replace_text): for f in cls.temp_dir.iterdir(): if f.suffix == ".yaml" or f.suffix == ".json": - content = f.read_text() + content = f.read_text(encoding="utf-8") f.write_text(content.replace(placeholder, replace_text)) def setUp(self):