From d805b3bcaf876c522b1e9f725b251ee0396723b8 Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Wed, 23 Apr 2025 16:49:08 +0530 Subject: [PATCH 1/9] get base test setup working --- pom.xml | 42 ++ src/.DS_Store | Bin 0 -> 6148 bytes src/test/.DS_Store | Bin 0 -> 6148 bytes src/test/java/.DS_Store | Bin 0 -> 6148 bytes .../LambdaIntegrationTest.java | 172 +++++++ .../LocalStackSetupConfigurations.java | 441 ++++++++++++++++++ .../MessageReceiverIntegrationTest.java | 98 ++++ .../ShipmentServiceIntegrationTest.java | 207 ++++++++ src/test/java/resources/cat.jpg | Bin 0 -> 164387 bytes src/test/java/resources/lambdaConfig.json | 11 + src/test/java/resources/shipment.json | 25 + src/test/java/resources/shipmentToUpload.json | 25 + 12 files changed, 1021 insertions(+) create mode 100644 src/.DS_Store create mode 100644 src/test/.DS_Store create mode 100644 src/test/java/.DS_Store create mode 100644 src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LambdaIntegrationTest.java create mode 100644 src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LocalStackSetupConfigurations.java create mode 100644 src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/MessageReceiverIntegrationTest.java create mode 100644 src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java create mode 100644 src/test/java/resources/cat.jpg create mode 100644 src/test/java/resources/lambdaConfig.json create mode 100644 src/test/java/resources/shipment.json create mode 100644 src/test/java/resources/shipmentToUpload.json diff --git a/pom.xml b/pom.xml index f771a10..072dfa2 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ 17 17 3.2.0 + 1.19.7 UTF-8 @@ -69,16 +70,57 @@ spring-boot-starter-test test + + org.testcontainers + testcontainers + ${testcontainers.version} + test + org.json json 20231013 + + + org.testcontainers + localstack + ${testcontainers.version} + test + + + org.testcontainers + junit-jupiter + ${testcontainers.version} + test + + + + + software.amazon.awssdk + lambda + + + software.amazon.awssdk + iam + + + software.amazon.awssdk + sns + + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + software.amazon.awssdk bom diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..14c21289a31c10d8b139f3a9af7e7e9def0f010b GIT binary patch literal 6148 zcmeHKyKciU3?x$z0kU|^s4pncKTrc_$ebT&(=G+vX3Fj<-<3a0jt>-Yg)RlU1V?~8 ziQ?Jt4W=j}x;ec+iS#0}gd57)LTh$z-q<2D3WWEv8;@^?@p!=AAJ{P3gmF9hlvnwX zuOIwpoIPIMS|T%4fC^9nDnJFOz@HSb-V0l<0vV|Q6`%s&3fTXlzzu8S6zIPW1Rnu_ z9nx-C`_&&WZy#UK6K4rz7ulATI-^3yli=w*ohwiy907 literal 0 HcmV?d00001 diff --git a/src/test/.DS_Store b/src/test/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..63b728b450e912f8fa3bc98e04a9fc67ff4fcf03 GIT binary patch literal 6148 zcmeH~K?=e^3`G;|qTr@Wm$UHz-e4$t0xzH-2qF~(yPl)_lL>;=wTS#c@+X-IrEk$` zL`3`haV^q`NDDWWm4%5Z@&JhP8{Tj3ht;B=96)--iS@&7q~Le>xC+1b{XuyJ79K1T}(S!u1*@b}wNMJ%>Uh~fG|1JE}{6A@7N&+PC zX9Tp_>^41KD(=>|*R%RQs6f}oy1+fgU zMbokU1qJBa~Ag-RgGPsk-j4>%dB-0El#rREEB~{3ANlf#?~`G-3~$&{RZC6(+?HCU+2;j^mz* z&opW}2=!!~$2?h>3`LmKLpUlNgr|{fR)7^4S0JyOB|85Pzs~>1N!(%uSb=|~fGE`c zdJUIk&en;=(OK(Yxxzw5ahb*s3Oed2##lOvSFk9 requestBody = new LinkedMultiValueMap<>(); + requestBody.add("file", resource); + HttpEntity> requestEntity = new HttpEntity<>(requestBody, + headers); + + ResponseEntity postResponse = restTemplate.exchange(BASE_URL + postUrl, + HttpMethod.POST, requestEntity, String.class); + + assertEquals(HttpStatus.OK, postResponse.getStatusCode()); + + // give the Lambda time to start up and process the image + try { + Thread.sleep(15000); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + + ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + getUrl, + HttpMethod.GET, null, byte[].class); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + + var watermarkHash = applyHash(responseEntity.getBody()); + + assertNotEquals(originalHash, watermarkHash); + + } + + @Test + @Order(2) + void testFileProcessedInLambdaHasMetadata() { + var getItemRequest = GetItemRequest.builder() + .tableName("shipment") + .key(Map.of( + "shipmentId", + AttributeValue.builder().s("3317ac4f-1f9b-4bab-a974-4aa9876d5547").build())).build(); + + var getItemResponse = dynamoDbClient.getItem(getItemRequest); + + dynamoDbClient.getItem(getItemRequest); + GetObjectRequest getObjectRequest = GetObjectRequest.builder() + .bucket(BUCKET_NAME) + .key(getItemResponse.item().get("imageLink").s()) + .build(); + try { + // already processed objects have a metadata field added, not be processed again + var s3ObjectResponse = s3Client.getObject(getObjectRequest); + assertTrue(s3ObjectResponse.response().metadata().entrySet().stream().anyMatch( + entry -> entry.getKey().equals("exclude-lambda") && entry.getValue().equals("true"))); + } catch (NoSuchKeyException noSuchKeyException) { + noSuchKeyException.printStackTrace(); + } + dynamoDbClient.close(); + s3Client.close(); + + + } + + private String applyHash(byte[] data) { + String hashValue = null; + try { + var digest = MessageDigest.getInstance("SHA-256"); + + // get the hash of the byte array + var hash = digest.digest(data); + + // convert the hash bytes to a hexadecimal representation + var hexString = new StringBuilder(); + for (byte b : hash) { + var hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + hashValue = hexString.toString(); + System.out.println("Hash value: " + hashValue); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return hashValue; + } +} diff --git a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LocalStackSetupConfigurations.java b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LocalStackSetupConfigurations.java new file mode 100644 index 0000000..581f427 --- /dev/null +++ b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LocalStackSetupConfigurations.java @@ -0,0 +1,441 @@ +package dev.ancaghenade.shipmentlistdemo.integrationtests; + +import java.io.IOException; +import java.net.URI; +import java.nio.ByteBuffer; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import org.json.JSONObject; +import org.junit.jupiter.api.BeforeAll; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.testcontainers.containers.Container.ExecResult; +import org.testcontainers.containers.localstack.LocalStackContainer; +import org.testcontainers.containers.localstack.LocalStackContainer.Service; +import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper; +import org.testcontainers.utility.DockerImageName; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.core.SdkBytes; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; +import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition; +import software.amazon.awssdk.services.dynamodb.model.AttributeValue; +import software.amazon.awssdk.services.dynamodb.model.BillingMode; +import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest; +import software.amazon.awssdk.services.dynamodb.model.KeySchemaElement; +import software.amazon.awssdk.services.dynamodb.model.KeyType; +import software.amazon.awssdk.services.dynamodb.model.PutItemRequest; +import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType; +import software.amazon.awssdk.services.iam.IamClient; +import software.amazon.awssdk.services.iam.model.AttachRolePolicyRequest; +import software.amazon.awssdk.services.iam.model.CreateRoleRequest; +import software.amazon.awssdk.services.iam.model.GetRoleRequest; +import software.amazon.awssdk.services.lambda.LambdaClient; +import software.amazon.awssdk.services.lambda.model.AddPermissionRequest; +import software.amazon.awssdk.services.lambda.model.CreateFunctionRequest; +import software.amazon.awssdk.services.lambda.model.Environment; +import software.amazon.awssdk.services.lambda.model.FunctionCode; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.CreateBucketRequest; +import software.amazon.awssdk.services.s3.model.Event; +import software.amazon.awssdk.services.s3.model.LambdaFunctionConfiguration; +import software.amazon.awssdk.services.s3.model.NotificationConfiguration; +import software.amazon.awssdk.services.s3.model.PutBucketNotificationConfigurationRequest; +import software.amazon.awssdk.services.s3.model.PutBucketPolicyRequest; +import software.amazon.awssdk.services.sns.SnsClient; +import software.amazon.awssdk.services.sns.model.CreateTopicRequest; +import software.amazon.awssdk.services.sns.model.SubscribeRequest; +import software.amazon.awssdk.services.sqs.SqsClient; +import software.amazon.awssdk.services.sqs.model.CreateQueueRequest; +import software.amazon.awssdk.services.sqs.model.GetQueueAttributesRequest; +import software.amazon.awssdk.services.sqs.model.QueueAttributeName; + +@Testcontainers +@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT) +public class LocalStackSetupConfigurations { + + @Container + protected static LocalStackContainer localStack = + new LocalStackContainer(DockerImageName.parse("localstack/localstack:latest")) + .withEnv("LOCALSTACK_HOST", "localhost.localstack.cloud") + .withEnv("LAMBDA_RUNTIME_ENVIRONMENT_TIMEOUT", "60") + .withEnv("DEBUG", "1"); + + private static final Logger LOGGER = LoggerFactory.getLogger(LocalStackSetupConfigurations.class); + protected static Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(LOGGER); + protected TestRestTemplate restTemplate = new TestRestTemplate(); + + protected static final String BUCKET_NAME = "shipment-picture-bucket"; + protected static String BASE_URL = "http://localhost:8081"; + protected static Region region = Region.of(localStack.getRegion()); + protected static S3Client s3Client; + protected static DynamoDbClient dynamoDbClient; + protected static LambdaClient lambdaClient; + protected static SqsClient sqsClient; + protected static SnsClient snsClient; + protected static IamClient iamClient; + protected static Logger logger = LoggerFactory.getLogger(LocalStackSetupConfigurations.class); + protected static ObjectMapper objectMapper = new ObjectMapper(); + protected static URI localStackEndpoint; + + @BeforeAll() + protected static void setupConfig() { + localStackEndpoint = localStack.getEndpoint(); + } + + @DynamicPropertySource + static void overrideConfigs(DynamicPropertyRegistry registry) { + registry.add("aws.s3.endpoint", + () -> localStackEndpoint); + registry.add( + "aws.dynamodb.endpoint", () -> localStackEndpoint); + registry.add( + "aws.sqs.endpoint", () -> localStackEndpoint); + registry.add( + "aws.sns.endpoint", () -> localStackEndpoint); + registry.add("aws.credentials.secret-key", localStack::getSecretKey); + registry.add("aws.credentials.access-key", localStack::getAccessKey); + registry.add("aws.region", localStack::getRegion); + registry.add("shipment-picture-bucket", () -> BUCKET_NAME); + } + + protected static void createClients() { + s3Client = S3Client.builder() + .region(region) + .endpointOverride(localStack.getEndpointOverride(LocalStackContainer.Service.S3)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); + dynamoDbClient = DynamoDbClient.builder() + .region(region) + .endpointOverride(localStack.getEndpointOverride(Service.DYNAMODB)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); + lambdaClient = LambdaClient.builder() + .region(region) + .endpointOverride(localStack.getEndpointOverride(Service.LAMBDA)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); + sqsClient = SqsClient.builder() + .region(region) + .endpointOverride(localStack.getEndpointOverride(Service.SQS)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); + snsClient = SnsClient.builder() + .region(region) + .endpointOverride(localStack.getEndpointOverride(Service.SNS)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); + iamClient = IamClient.builder() + .region(Region.AWS_GLOBAL) + .endpointOverride(localStack.getEndpointOverride(Service.IAM)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); + } + + protected static void createIAMRole() { + var roleName = "lambda_exec_role"; + // assume role policy document + var assumeRolePolicyDocument = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"; + + // call createRole API with request using name and policy + iamClient.createRole(CreateRoleRequest.builder() + .roleName(roleName) + .assumeRolePolicyDocument(assumeRolePolicyDocument) + .build()); + + var policyArn = "arn:aws:iam::aws:policy/AmazonS3FullAccess"; + + // attach s3 full access policy to role + iamClient.attachRolePolicy( + AttachRolePolicyRequest.builder() + .roleName(roleName) + .policyArn(policyArn) + .build()); + + } + + private static String getQueueUrl(SqsClient sqsClient, String queueName) { + return sqsClient.getQueueUrl(r -> r.queueName(queueName)).queueUrl(); + } + + protected static void createSNSSubscription() { + String topicArn = snsClient.listTopics().topics().get(0).topicArn(); + // get the queue URL + String queueName = "update_shipment_picture_queue"; + + // create get queue attributes request + var request = GetQueueAttributesRequest.builder() + .queueUrl(getQueueUrl(sqsClient, queueName)) + .attributeNames(QueueAttributeName.QUEUE_ARN) + .build(); + + // call API with the request and get the attributes + var response = sqsClient.getQueueAttributes(request); + // extract queue arn + String queueArn = response.attributes().get(QueueAttributeName.QUEUE_ARN); + + // create the queue subscribe to topic request + var subscribeRequest = SubscribeRequest.builder() + .topicArn(topicArn) + .protocol("sqs") + .endpoint(queueArn) + .build(); + + // call subscribe API with request + snsClient.subscribe(subscribeRequest); + } + + protected static void createSQS() { + // queue name + var queueName = "update_shipment_picture_queue"; + + // request to create queue + var request = CreateQueueRequest.builder() + .queueName(queueName) + .build(); + + // call createQueue API with the request + sqsClient.createQueue(request); + } + + protected static void createSNS() { + // topic name + var topicName = "update_shipment_picture_topic"; + + // create topic request + var request = CreateTopicRequest.builder() + .name(topicName) + .build(); + + // call createTopic API with request + snsClient.createTopic(request); + } + + protected static void createBucketNotificationConfiguration() + throws IOException, InterruptedException, org.json.JSONException { + + try { + // lambda needs to be in state "Active" in order to proceed with adding permissions + // this can take 2-3 seconds to reach + var result = localStack.execInContainer(formatCommand( + "awslocal lambda get-function --function-name shipment-picture-lambda-validator")); + var obj = new JSONObject(result.getStdout()).getJSONObject("Configuration"); + var state = obj.getString("State"); + while (!state.equals("Active")) { + result = localStack.execInContainer(formatCommand( + "awslocal lambda get-function --function-name shipment-picture-lambda-validator")); + obj = new JSONObject(result.getStdout()).getJSONObject("Configuration"); + state = obj.getString("State"); + } + + // create notification configuration + var notificationConfiguration = NotificationConfiguration.builder() + .lambdaFunctionConfigurations( + LambdaFunctionConfiguration.builder().id("shipment-picture-lambda-validator") + .lambdaFunctionArn( + "arn:aws:lambda:" + region + + ":000000000000:function:shipment-picture-lambda-validator") + .events(Event.S3_OBJECT_CREATED).build()).build(); + + // create the request for trigger + var request = PutBucketNotificationConfigurationRequest.builder() + .bucket(BUCKET_NAME) + .notificationConfiguration(notificationConfiguration) + .build(); + + // call the PutBucketNotificationConfiguration API with the request + s3Client.putBucketNotificationConfiguration(request); + + } catch (Exception e) { + System.err.println("Error creating bucket notification configuration: " + e.getMessage()); + } + } + + protected static void createLambdaResources() { + var functionName = "shipment-picture-lambda-validator"; + var runtime = "java17"; + var handler = "dev.ancaghenade.shipmentpicturelambdavalidator.ServiceHandler::handleRequest"; + var zipFilePath = "shipment-picture-lambda-validator/target/shipment-picture-lambda-validator.jar"; + var sourceArn = "arn:aws:s3:000000000000:" + BUCKET_NAME; + var statementId = "AllowExecutionFromS3Bucket"; + var action = "lambda:InvokeFunction"; + var principal = "s3.amazonaws.com"; + + var getRoleResponse = iamClient.getRole(GetRoleRequest.builder() + .roleName("lambda_exec_role") + .build()); + + var roleArn = getRoleResponse.role().arn(); + + try { + var zipFileBytes = Files.readAllBytes(Paths.get(zipFilePath)); + var zipFileBuffer = ByteBuffer.wrap(zipFileBytes); + + var createFunctionRequest = CreateFunctionRequest.builder() + .functionName(functionName) + .runtime(runtime) + .handler(handler) + .code(FunctionCode.builder().zipFile(SdkBytes.fromByteBuffer(zipFileBuffer)).build()) + .role(roleArn) + .timeout(60) + .memorySize(512) + // bucket name that is being passed as env var because it's randomly generated + .environment( + Environment.builder().variables(Collections.singletonMap("BUCKET", BUCKET_NAME)) + .build()) + .build(); + + lambdaClient.createFunction( + createFunctionRequest); + + var request = AddPermissionRequest.builder() + .functionName(functionName) + .statementId(statementId) + .action(action) + .principal(principal) + .sourceArn(sourceArn) + .sourceAccount("000000000000") + .build(); + + // call the addPermission API with the request + lambdaClient.addPermission(request); + + } catch (Exception e) { + System.err.println("Error creating Lambda function: " + e.getMessage()); + } + } + + protected static void createDynamoDBResources() { + + // table name + var tableName = "shipment"; + + // attribute definitions + var attributeDefinition = AttributeDefinition.builder() + .attributeName("shipmentId") + .attributeType(ScalarAttributeType.S) + .build(); + + // create key schema + var keySchemaElement = KeySchemaElement.builder() + .attributeName("shipmentId") + .keyType(KeyType.HASH) + .build(); + + // CreateTableRequest with table name, attribute definitions, key schema, and billing mode + var createTableRequest = CreateTableRequest.builder() + .tableName(tableName) + .attributeDefinitions(attributeDefinition) + .keySchema(keySchemaElement) + .billingMode(BillingMode.PAY_PER_REQUEST) + .build(); + + // createTable operation to create the table + dynamoDbClient.createTable(createTableRequest); + + // create attribute values for the item + var shipmentId = AttributeValue.builder().s("3317ac4f-1f9b-4bab-a974-4aa9876d5547") + .build(); + var recipientName = AttributeValue.builder().s("Harry Potter").build(); + // add other attributes as needed + + // create a map to hold the item attribute values + var item = new HashMap(); + item.put("shipmentId", shipmentId); + item.put("recipient", AttributeValue.builder() + .m(Map.of( + "name", recipientName, + "address", AttributeValue.builder() + .m(Map.of( + "postalCode", AttributeValue.builder().s("LNDNGB").build(), + "street", AttributeValue.builder().s("Privet Drive").build(), + "number", AttributeValue.builder().s("4").build(), + "city", AttributeValue.builder().s("Little Whinging").build(), + "additionalInfo", AttributeValue.builder().s("").build() + )) + .build() + )) + .build()); + + var senderName = AttributeValue.builder().s("Warehouse of Unicorns").build(); + + item.put("sender", AttributeValue.builder() + .m(Map.of( + "name", senderName, + "address", AttributeValue.builder() + .m(Map.of( + "postalCode", AttributeValue.builder().s("98653").build(), + "street", AttributeValue.builder().s("47th Street").build(), + "number", AttributeValue.builder().s("5").build(), + "city", AttributeValue.builder().s("Townsville").build(), + "additionalInfo", AttributeValue.builder().s("").build() + )) + .build() + )) + .build()); + item.put("weight", AttributeValue.builder().s("2.3").build()); + + // create a PutItemRequest with the table name and item + var putItemRequest = PutItemRequest.builder() + .tableName(tableName) + .item(item) + .build(); + + // call the putItem operation to add the item to the table + dynamoDbClient.putItem(putItemRequest); + } + + protected static void createS3Bucket() { + // bucket name + var bucketName = BUCKET_NAME; + // CreateBucketRequest with the bucket name + var createBucketRequest = CreateBucketRequest.builder() + .bucket(bucketName) + .build(); + // createBucket operation to create the bucket + s3Client.createBucket(createBucketRequest); + + var putBucketPolicyRequest = PutBucketPolicyRequest.builder() + .bucket(bucketName) + .policy( + "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"AllowLambdaInvoke\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::" + + BUCKET_NAME + "/*\"}]}") + .build(); + + s3Client.putBucketPolicy(putBucketPolicyRequest); + } + + + protected static ExecResult executeInContainer(String command) throws Exception { + + final var execResult = localStack.execInContainer(formatCommand(command)); + // assertEquals(0, execResult.getExitCode()); + + final var logs = execResult.getStdout() + execResult.getStderr(); + logger.info(logs); + logger.error(execResult.getExitCode() != 0 ? execResult + " - DOES NOT WORK" : ""); + return execResult; + } + + private static String[] formatCommand(String command) { + return command.split(" "); + } +} diff --git a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/MessageReceiverIntegrationTest.java b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/MessageReceiverIntegrationTest.java new file mode 100644 index 0000000..cd937ab --- /dev/null +++ b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/MessageReceiverIntegrationTest.java @@ -0,0 +1,98 @@ +package dev.ancaghenade.shipmentlistdemo.integrationtests; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +public class MessageReceiverIntegrationTest extends LocalStackSetupConfigurations { + + @BeforeAll + public static void setup() throws IOException, InterruptedException, org.json.JSONException { + LocalStackSetupConfigurations.setupConfig(); + + localStack.followOutput(logConsumer); + + createClients(); + + createS3Bucket(); + createDynamoDBResources(); + createIAMRole(); + createLambdaResources(); + createBucketNotificationConfiguration(); + createSNS(); + createSQS(); + createSNSSubscription(); + + lambdaClient.close(); + snsClient.close(); + sqsClient.close(); + iamClient.close(); + + } + + @Test + void testSNSSQSMessageReceiver() { + var imageData = new byte[0]; + try { + imageData = Files.readAllBytes(Path.of("src/test/java/resources/cat.jpg")); + } catch (IOException e) { + e.printStackTrace(); + } + var resource = new ByteArrayResource(imageData) { + @Override + public String getFilename() { + return "cat.jpg"; + } + }; + + var shipmentId = "3317ac4f-1f9b-4bab-a974-4aa9876d5547"; + // build the URL with the id as a path variable + var url = "/api/shipment/" + shipmentId + "/image/upload"; + // set the request headers + var headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + // request body with the file resource and headers + MultiValueMap requestBody = new LinkedMultiValueMap<>(); + requestBody.add("file", resource); + HttpEntity> requestEntity = new HttpEntity<>(requestBody, + headers); + + ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.POST, requestEntity, String.class); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + + // give the Lambda time to start up and process the image + send the message to SQS + try { + Thread.sleep(20000); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + + var sseUrl = "/push-endpoint"; + + ResponseEntity sseEndpointResponse = restTemplate.getForEntity(BASE_URL + sseUrl, + String.class); + assertEquals(HttpStatus.OK, sseEndpointResponse.getStatusCode()); + assertNotNull(sseEndpointResponse.getBody()); + assertTrue(sseEndpointResponse.getBody().contains(shipmentId)); + + } +} diff --git a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java new file mode 100644 index 0000000..2fa96e5 --- /dev/null +++ b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java @@ -0,0 +1,207 @@ +package dev.ancaghenade.shipmentlistdemo.integrationtests; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import dev.ancaghenade.shipmentlistdemo.entity.Shipment; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.testcontainers.containers.localstack.LocalStackContainer; +import org.testcontainers.containers.localstack.LocalStackContainer.Service; +import software.amazon.awssdk.services.dynamodb.DynamoDbClient; +import software.amazon.awssdk.services.s3.S3Client; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@ActiveProfiles("dev") +class ShipmentServiceIntegrationTest extends LocalStackSetupConfigurations { + + @BeforeAll + public static void setup() { + LocalStackSetupConfigurations.setupConfig(); + + localStack.followOutput(logConsumer); + + s3Client = S3Client.builder() + .region(region) + .endpointOverride(localStack.getEndpointOverride(LocalStackContainer.Service.S3)) + .build(); + dynamoDbClient = DynamoDbClient.builder() + .region(region) + .endpointOverride(localStack.getEndpointOverride(Service.DYNAMODB)) + .build(); + + createS3Bucket(); + createDynamoDBResources(); + + } + + @Test + @Order(1) + void testFileUploadToS3() throws Exception { + // Prepare the file to upload + var imageData = new byte[0]; + try { + imageData = Files.readAllBytes(Path.of("src/test/java/resources/cat.jpg")); + } catch (IOException e) { + e.printStackTrace(); + } + var resource = new ByteArrayResource(imageData) { + @Override + public String getFilename() { + return "cat.jpg"; + } + }; + var shipmentId = "3317ac4f-1f9b-4bab-a974-4aa9876d5547"; + // build the URL with the id as a path variable + var url = "/api/shipment/" + shipmentId + "/image/upload"; + // set the request headers + var headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + // request body with the file resource and headers + MultiValueMap requestBody = new LinkedMultiValueMap<>(); + requestBody.add("file", resource); + HttpEntity> requestEntity = new HttpEntity<>(requestBody, + headers); + + ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.POST, requestEntity, String.class); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + var execResult = executeInContainer( + "awslocal s3api list-objects --bucket shipment-picture-bucket --query length(Contents[])"); + assertEquals(String.valueOf(1), execResult.getStdout().trim()); + } + + @Test + @Order(2) + void testFileDownloadFromS3() { + + var shipmentId = "3317ac4f-1f9b-4bab-a974-4aa9876d5547"; + // build the URL with the id as a path variable + var url = "/api/shipment/" + shipmentId + "/image/download"; + + ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.GET, null, byte[].class); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + // object is not empty + assertNotNull(responseEntity.getBody()); + } + + @Test + @Order(3) + void testFileDownloadFromS3FailsOnWrongId() { + + var shipmentId = "3317ac4f-1f9b-4bab-a974-4aa987wrong"; + // build the URL with the id as a path variable + var url = "/api/shipment/" + shipmentId + "/image/download"; + ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.GET, null, byte[].class); + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode()); + } + + @Test + @Order(4) + void testGetShipmentFromDynamoDB() throws IOException { + + var url = "/api/shipment"; + // set the request headers + ResponseEntity> responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.GET, null, new ParameterizedTypeReference<>() { + }); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + assertNotNull(responseEntity.getBody()); + + if (responseEntity.getStatusCode().is2xxSuccessful()) { + var json = new File("src/test/java/resources/shipment.json"); + var shipment = objectMapper.readValue(json, Shipment.class); + List shipmentList = responseEntity.getBody(); + var shipmentWithoutLink = shipmentList.get(0); + shipmentWithoutLink.setImageLink(null); + assertEquals(shipment, shipmentWithoutLink); + } + } + + @Test + @Order(5) + void testAddShipmentToDynamoDB() throws IOException { + + var url = "/api/shipment"; + // set the request headers + + var json = new File("src/test/java/resources/shipmentToUpload.json"); + var shipment = objectMapper.readValue(json, Shipment.class); + + var headers = new HttpHeaders(); + headers.setContentType(MediaType.valueOf(MediaType.APPLICATION_JSON_VALUE)); + + HttpEntity requestEntity = new HttpEntity<>(shipment, + headers); + + ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.POST, requestEntity, String.class); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + + } + + @Test + @Order(6) + void testGetTwoShipmentsFromDynamoDB() { + + var url = "/api/shipment"; + // set the request headers + ResponseEntity> responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.GET, null, new ParameterizedTypeReference<>() { + }); + + if (responseEntity.getStatusCode().is2xxSuccessful()) { + List shipmentList = responseEntity.getBody(); + assertEquals(2, shipmentList.size()); + } + } + + @Test + @Order(7) + void testDeleteShipmentFromDynamoDB() { + + var url = "/api/shipment"; + var shipmentId = "/3317ac4f-1f9b-4bab-a974-4aa9876d5547"; + + // set the request headers + ResponseEntity deleteResponseEntity = restTemplate.exchange(BASE_URL + url + shipmentId, + HttpMethod.DELETE, null, String.class); + + assertEquals(HttpStatus.OK, deleteResponseEntity.getStatusCode()); + assertEquals("Shipment has been deleted", deleteResponseEntity.getBody()); + + ResponseEntity> getResponseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.GET, null, new ParameterizedTypeReference<>() { + }); + + if (getResponseEntity.getStatusCode().is2xxSuccessful()) { + List shipmentList = getResponseEntity.getBody(); + assertEquals(1, shipmentList.size()); + } + } +} diff --git a/src/test/java/resources/cat.jpg b/src/test/java/resources/cat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1444a8390911b5e41c83082f06f0de672b87d76f GIT binary patch literal 164387 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 z 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

03D@tdTyGZ%Q&21Rnj00uHiI2h?%mBp-H zA-K5LqP&Alnp@|F%~m+h*kU^X<1EFWCu?=|#dY>7hUxAk5k32rNu`c2C1xrxq<{bi z7~pUXe3mwZBX!jKEWWg))97^($&@K?KFF8m^BCnp9=$7_*Dm!NSl#DgASdK#n{ym@ zz!||EhHAmmd{wHs{?GpaM=<2CmV1se!;pU*)}E)}zZ+ax7_M}@$Ro*;*P{$}PK)#v z=BjB~p1Y{o#b_QR6VB1w-H@PRk=WzgDtQEcRqGmNqbxE9+GS91Q|^)o>(jM-Z?EZ| zD)4r?x`w5u-9VAI&mcl$D0n-tNXOS0uc`b2uED6-Slo%CmMOA`%tEkn&fa^}<``8? zDaU3!E+d_|z0vKESXye9t0YOdI_@gR1y7*%u5(qDXb-rK6C+d!km1EKDFmlsN=EQB$@Hfx!@GNQ*xH~Pz}Iub_GwTLQg*8 zxw}6C>DF#;=1FFF&gDh~DL&(zjPt=9*V#8-9!U|rrP{dt;3q0^&r0I;Zw{(kvqAC| z9Bm*EsUJ$(7|A8dWhxN8&!7JQw&t|d7AA$GNpPFMBMpu-?0R&p{XmUM)uVCcPQ3$k zKaMkz+MDAmy<)~}%^Bbj0bBxk!5`yPV7+0cTHiYTrRPx~Ry#=yNvN;%Ozh!i5Y#Z2Z{h zGC1cITSs{9H6OGXlgx0bxDS|uanD>)R+^k$$fr@pNcxLT`yQ^a%3Qc#nL=l8zE8Gm ztuos}V-;rKCJ}VxKo|hS^Y8KZw&_k&-7T#GBt*Xi;kf_c+P)lbcxU63kYw3S!cc$B- zlWz~1b#d3rcVFGazwLVZ3aKTgm8M9oDUJ*2Q+r{SSrG@_%Z@Yc&{ZoFrM08MWfX$k z$>uz={ppyFTPLUky?S&alex!Qe(Oif8W+QDX7>L8`*!+ine5~8Qi(Z2an3V{{Z2qiLT~fDaZ`CAy=G*=z9K~SI=?kmKX4kvnh=3 z-m1gq2dTmCzsT35cmm?mVD}L|9ye@|cCxYS$A5a8yQ`5=Cl+je)n5>AEF#fkmj3`! zw9vJCQERBfXk&P;wvmAY6Tw;zzodP?!(K4fWVh00XroI@JA0#T zZz$ZT5Jcn5EIxgVa7TLjR@+e2d|RNdlcEc2OUSP60#4Ax{#pq^oZ;27%!7cqJaw;K zO&`P)>FsTx3s_|n`NHB$NH-}Ce6(`TjM3zBLWUi))cvIlLiSN;_>5K&x{b5rZ8zZ$ zfi1laU^(0gR12PmAouTDLbRsZXF9{i z8y%*ebPYM}^!y!G^HLJ}x!_9edd#PTmD{8G3y|0;d zBB&=UA_3dyTztV!Fi#ohg|{9$)iqOZs9yb_OtPNZ`W;%@`V{+Cj@4lQftcK>+kWE;zu*KJ}xgYC1e(-%m;5v%0-s zGAJdKH2pD<9ObrWfyfl)D??H8E^D0dwbQOHjne5eUZ35hR}uv=x673w-M(S;3PJX) z*)BBgM$=HY)%3N~qarAh>gk~(L^DaUcM4LdtjEE3Ab&bO8|~X3<)aO zC$9tYtVo_K7K--%WNGD9j$q6cCXgH_P^B@OC{CXqqkC-v zvPh=ZbP*EDc=`Os-HuPn2R%(y{{Vz$>;8k9ul@u@{{Y5o*EMZm*}}8O<^1oo?qRfG z9{#4VKjABv*5Cg6TBy$I_8+r9|JCb!LE-y95PVG3G_5OHyw&cT)Xo&LEvpa=+0x-P@ z@73M-lf_rx6NLKDh%_B$X>HkU-qu*|{EeYm(D@e1pq9f70&&-;JV(WSSK=)EDq!)DpbU4-a~}_6(e+Oe-Ve8G7g0wNi=h||GCSNxn<5a#lU+sUgPe&En2#e!#E@OHgUGKk@U7mhqImaEx6^g2F{<22 zpRsB0Joa!#LD)RsD8^+Akk5iowQ8ekGO*LNShjlBvNSshZM5A!+6k?uS6i8HJka|T zlZEmZ=Om61$QiC0bK%bwq>fQ@mvLP4j&WTy-YM~J zq|#f<;tLtwcHmlGiOsNlf+SzE5Ut1EJGkc}wJpbpw2KW#P_)Yel}kytnfel(}#8L|yDj1o^6{ zaJV(oENP|b%PgYiNMjPj5uz}}9AtzI36bB&vZdz@AuhzaVWnIFB^JkJN zSx4{{JA(2~dGhZXTiD!VRo47MZsGw_XhpkQOcG9vRisd(x6B7{Ij!*g*Rh>TBzuSK z$>9qrzA5XsvRh&FDH26Mr$j=yAWCr`G# zne=#7EN<Y|PZu$-6U9}fH+aU;OSdkM z?`gl8_1QEzaFI)Quik!Ne$~GXMdXjKLv0+=+opE1f*5nd5)TA%$T&DP@vevBZEhH3 zgHN`b&AW->LnN^Tj4lf9YgnUm89e}E-nboqS-v>v=Klc0*K(N4v@x`bsmb|AZ(ciB zRC`IpZ8DIQ2E&{{U{->FUy7 zUqZ15&z6xnkdk;+2M0X=0C($wUQ6b+zNR&G(UKNJABg@R&|F^49nHiAGE93{ z40*vF@%mQXx9v0G>z^_|4c}ZxDyb}&HoPkisy_O+*MVF_8YY;~EOOc`gf2qJxykjw z<25F;pv!$|wwCa%yja=tfQq>tNE{!_n(ocoW5fZ7ar*M`?8G zQEp;VB9L_G0or}N>%^z~7K3$hX{Ld7rAp1cOE=1T2SP{6N2V}q(Ualkjig&PqS71N zv|OTy_M}+!CnS^CCm5=lH-_ys=xz+`Vs&TQyb{3_5`Qy_tJ02+M}T#5zBUH1*Up8;AC|*`Jj9k zsNc2I>8QY3osYGCV#lByewFW^2Rtd`UkBR%0B&AtE2de@#oE&7WHOGJ2Owv!TI9!J zsVMWpUn8pxQclrm`nu-hRI?2vspYq311f(p&mC*bwcT@4XiCkcGe^ktZO@np&sJQ5 z4SGhE;>i3_Y$FRK{#e9|1ZCp@_cC+?@y%xHKiRNIOfvnRW0e7b`H!F{y?H9h-*c?_ zU&Y5!o(WP*CTn+0qhxMVk?;OEuNtxPmgeTx{z*(~hFIh1#FNT{?0=noUE-k~Y$p*R)jVd`Bp(T!ED&T|nm{DFY) zo`XE}t9m_&)Ml7OPAy83PIBzr#P`7K?de?~hcxuF zo@;3fD<~2Y$M0vk{Q0eFKXtMpA9)@2hpuVb4XaIk`;DCB=V=4~0IyNoT=wUqCn* z>?_j4LzZdoa@UtNHnu$LK-4T(SJONlZz{!Srdln`$j51E=lO(^o`sl_RWt5Ib)OI} zw5>|}MDTW(6C1{N)EaDUQ7YwBsXXot`TZ-(J{a8T*Jn|=Htln$-(N=e6Eh5KRXF*W zlhB?k(^}_7xABwssUp%)s3y2HrO?3JE<)uIl<#Z?VNoT1(98d?~J6 z>Y7P|S084&u$8SY7z__FKZve4&N%|Q8@u4l_Yalc09^L$aoYs;t~*P#->OaGSa%3D zmw9E0+wMG{bYr0yz^>$5!x|(`n}d^;=s-Qid8*D%+a1d3YIAow#-to9L+8NB>Hz73 z{SU1^E7>n1lS$R0#JkQ3=-hDMhp4UC?Bk8{#Y}xzoMaE@{VM&{rIo~L@r{=jtQlW9 z&N^e%8Y*s)HZt_RFxyP3AuNP0SZ6Df*Xf${O&dnHw$vijVt*~VOjPjPagpomis!U& zm$OL@9VSv3WA2gP{{XLDR-dOur%554nU(XNaKw6k6_ahqEUlr?J;k)2X}6vuEMy!c zZqe=}aM@GVy>sDbjde%TS3+A@?JunzRwA;id62{hmL>D&SvN6XnU^ZPF<&~`i?e?u zZp>|@AObpr=zpDY_IH}+g#1e$vmBQw!r%vKET_io*lK5S+&!wB~^IsuBDLMMRZh>l5JE5Hg)G{A1_gn#dzarZ>>fD02LOU zeXQF{YiiKg+FVUyA$alfVkz5t4hUg`*C6J)OB)>yK@5-KKxK7UnkUuo0LoyenIUbl zqT?9kn&XsLJ(20qo8`MbGsYUuqiJJikv5)nJGPD!wqUWyI+QYq9!43@I30P$b6J+Y zF}u@l&Y^QRhVAYb?^*fxGD#A)N6ua#6et-WGLzc8_58hN>9rf}Itv?_X7cBP&rp`~ zFp-=B&ln?q2qy}>bu~2lHRh7bIlY1O`SG&sU72mn%1*@~5~Qv^VBLPTQm1EWYE4Ry zbbDupwLNE7yuY|>>ly6jc$&y*(=?Gn0^#D2$sXYBPV8rnI#%7Bx{bc5&`o@jN)ycT zh74hMkT4o7mJ5x<5OeKZde5gdq_SzYc9&A!#T#7tQxR<=#y)M>EJn~W2wr>FF8=@% zt}XRh^u23Fh{0~FG%{MxEbJvygbuz^oHj-=p84aN#Zr{6qHQX$jk($EfAEr9A2{i5 zlghH}n_@7*86DMgoOKx-Q-9$l)IaB!{yJ+XPt&xWD!|-mS}Vc!`4-}M#l*4Y*-y-V zX8f={>VLG|f6yvV{0*1K)5^8t31vH{2> zj!$~o_<7*nLqoLI67BB1hSe_ZqMhPZd!kD#No_G~$&I@)lAr=t7_Q4#@Q;W5HwnAH zxVnia5goo(n%D5J7*#tOMOSPC&Q3Yzyp^j)vVwH%(XMq%yL}BTqSE}!+qY>Wy`J`F z5h>u|VFaq}0FRrdea(EG`#9zkVq zm#!<;J|pV-N5d}(H;nWstR~iOU9{_Y?~SO61-M2pn1IC6s2JUVK|Yo7{{Zae@dH)x zpT!F}67Fa%wL6Ws32ADVQoh{nSkcw?f=?wtIIfiBsY)jln)cDV*!?!w^$RAxiri`M zWrq^O4VBHqDODSJlgrvO{7bYbTyvb7<8_@<$4Z-Ew$<(~W@%<gs?dWI2-^tt!Z@qdtK8dms5@x zF~VV)EaAd!ak%c44+|j1;BtE4*9|=*sp=)oCu7TX4KKtVB=E(B=Y(uxwRs?w=d{&z z4N4%evK-1%1_DJR)4o7jI_<{?aL8i1>5LwG}1h7V@YZg^71qA;9 z6E^^IbDH%XF6!ltv>IKN-RLry+TtnvkC{kSR5NT6Dh!S|80NYCTI0l;M~g4oJqq&l zBtpsNj`PdJ5@5fVtxRA%FLMD%6wfn4r*>Q#< zP&TL^F=sg(dRE1)hle$bBX>WCKG^o`>SUT|rb)blBU2b_f`AfmiZk+pTCVH5MgAkX zfzR1q*{$R^H`nG=jzR-$Dp>C)AhQ4z4l9qj(Z0)}+exRuE-u(AOXW*=@dZ=BkIa}5 zpndjW3Fimb)^S|7M<&k0S5LFL)uGVl@cpfox(vrOcAi9Tf=m=y;gjTi`T#uv992&n zTEnK>&7n4-r)jFT?QFJ*2K+^Wz&wq-${dq|ag*s-_d1TgmkKPS`yIs7DBY7FxaS1M zA9L-DFWt^C!_?Lfjx0a6Yz*3-o2TCDu`3X7U{`IYp~v@+yH(-$S2L>gXWU=2R+kO0 zfwb*HHWCT!qGLACFL`EmW3cj^lk)bjqNS1v(Y&b(ZwX{jUWJ^2U6tC}TIkTQyd7*`{Ol$xnAd}NR+4Qf-Pm1=pdKbh^LKvplmodC$ zq{}gE0x){?I48KT)w~F=Y<#KT;)~PJ@_330(UIiW_E76rhSouSa|FQ{!6LxXz)#+O zUx!nJfs%TTb6vie^XX8FIc8gjh-^pN>aUD&&J~pL(+&Ao0ix(yR2sF$rKve0Ndq1K z06VS}1GEw_0OuJ4t#;7fPZ1g<((JYX`6?m-WJdXeZc=hUIOmblzoc_0rj8u4c6uG; zJ}NN=v$NCu&D%t?2gxhn7|0^JlX%z2qT0gZSHln`#ARY0YL139(q-^_>HgM+#Mb?ju@hejf^T^#? zkeirnEyHpZQGCe`KCCcDrF8xg@c4^T)HVByMA-z*ZD?`HApFmQao39Ftwko=mZtQo zxkfftKGcG1x3>n`B)7Ky1xG(OxKYJWyU^BTlJ;n~+~DkTG7$05di&P};Qs&?Ltqx) ze3z0I!N(g&KXhlXJ!{miyiaoQGkH-0M?ua9uf1_UGgg`Nw~TBJg0!+cs$|acWMj$p z9C2Sb>keeOa#)5^Hn(*?we}vnW;MHk9N;W?<%b8H{{UL~tH*jgP+T{W9@UR3a8E(b zbL;49vkN87V=AiX;R`BnHiZEUzq=fu z;OCB@^s2gb{w>PhCe;TDo z)!KN*!^3mOX*5CBRVEfZ1jkh;`E;*EvemWSZrDAQoxQwLAN7wWRF9@J^s4qg8PK(0 zZf3K!m;<}YkwG50=Z|qquK0HT7zP5<+-_isiu)^ zQsNbng6(IE5r9X2e@gJrh?=GDy`fxAmN!=LMZlI;QY2qR8QgL1Ij-u~??Sed%hwd` zQV*J2gSWAa1NG}ik8W(WUklFmF_S3H_Av|sEhKdCP3tq!8Pq)79g~=(sX?+n9@th+Ib@%#TuLj z_8B~S*CG2qLjEPwFLWub7TVgv?HJ0VE>*JNpHtM1D?h}#?7lSknRj^#h12b2TRU;d z2^=S9&T-X_SoQ?hWoDgeKF2j1dl)6u_NTDAgTgVJTuHH^C3Eu;*spE}=Zd$c-!#xi za~?Ow0FoBtIqFBK{d-o6N+8qXvnpNt=b;_2YcA&23_HSjb;uy?W%lQ<;a+7Zv(%9! zno?bp9P=98VOV1zt~=+y{{XI|veaXlp;8Q23-YrOp8o*O zyUjL7yP4pApp5z){{SkQ(s5)c+{4jrZerA7mR+oe8;Rgx@yC8^()D`;wzf;PVs?YO zZ*27yO507dHzG!5LI)t8KhA1>Zb;$NrYSM=SA|f1_ixAPT37(2xhsM5 zE`Ql4pgk(>#5NZChMTP1Cz>HSSz^GJKSR5M2R!!muYWH1(?`wb%iVV!;SY)0cfqe3 z-02$n>bFtfuh~V+Y~#s^%84aqjY~@+fwgw2Wl%C|e~TU?@NdQ`?eu>F+$0t--F>d+ zX)P`i?pDUp8nwizq&sy%k6%is@pHji-l1a$i98uC(7Uq8o;x`sIrA6-@ia1SG6HhT zjFHGV2EJ?Xwas@YdT?(Y!Skmb2#1XB;uTvNVPpxL{@bj>SVCMdXYx1k#C9P|&U|?X66*3Gy~U6bTKO>l0HcKEUwoxo%OstE ze7u}?uBzTksO6GdF9=;F*jUyXr7)zsL;FZc<2W21$BOWs-B!HMrKKh8v^^%$3k^HN z(Chl{nQt}qm@PHR+oC)p02WkMk&pXa@&KZxrXFV4D5?@BcQ-G z`&Cuge7ul-YT59{tE}o1#i-kAnsb?%#nqME2^G7P-dR-@go?)i%(uvolQ7+t~zVDo0dUq**h{$&=_tD)~L@vL!2|tZH8Px_dO1<|r;4st~C@*!L5| zAxvZy>^cM5yt025#ihN@qhR-|CZQTbB$r`iV8ODP%)5SGfMEd5bsC?C^_wjnwHPj8 zzq_2W>^BJ&%*T=k?wA%kyX0hbHRie<=C$H)58O@T8Go~G#Ghm~Zn8xRv}`vd%IhIv z(Sb<;Ipfy4s8WKvN1u(WR_PwO;GJXQebkq*PaKi*t^}=aBf$Aa$jpos9=sAg>(D&^ z0Eqtp^vnMMCBOKp^IJa&YZlsdwYHgcX{boy<(G7m%d>M6kM$oXB;iTO9=&RR_(gnU z{{TMrU-!)a0Q_RPCZTs@dUYx&r0#$J*ZRvr*EDYoXg7nycNW^rw-QHj6HMWvNVhYE z^E0`MZ$CENb^|2VE8Tdv#Ij5Mp_3fL_aAFmR@s%XO12>mSEe{P>zvmp`mcw)C1nJD zJJqbCiaU6w-vzjb3CymTEU;$TcHGKob+H^M-)9M=5lqOK{*~cZJot>}? zNtT@>40E08fDS?Ee27^)9f`hMA257-v+*6@g```{ad8w9F+&VySRx8>=6Rb#0KTn) zb6-6C67cQrspI`R-UmhdGaHMia)H()<+0|n4a9T>g?^*>i$c>Ov9<81wZGM^=DcK_ zOl946$i>MU`I$qIs5fjObMIIdUKP>pFD_(@!FIZ2c52i8u*V+zj0~1wGUsNffzgzmDnnd5ex(mmoQB=ZCTI$aKmxWvRZ_r`ae*5g zdXQ^#L``(;k0kOKoyUyyrs(qNk;!uxiZsbCC25^mEL!U6Tgy06 z!T}Q?`@tNmV4hDE92ed=m_3G$ zgHO4dcA1f*m2BmXCY8bDJ1mKe{SO|s$l~tq&1CM+3cRrRofYF>Ybm8qYjW;1$ZYQQ z7@9I$_ir-B7@R2D2>@lXaa}I2Z5@r`{kF>J-C9HCypgoY2?^DarDjsB+-^TMFlt>^ z_UlHsg^77(lJri`_V=Df^8Qe+!3M~pI2%E1o_Wnw*R>sC^ySpF?P6U*;(gQ4Z*wiw z&=s0Y1%VRX4#iP|yFkY|#d_&p2;!2ndYt8sq45qS^VZF9eujjbuOB^#+P@0dLW4DV6(Zo zp3c=g&$@*gHQ=cy^;F%?(Dv9fLj zhyx4;dCh*kc#%#(10aGA;a`=Xwc^`YYF0Xx%VH>gX)(~@SYxlNes%14F^QBj>QTOq z=vn-4g;MlBNscQqsqeU7FYU>_51ivFfmB8rTLUEE5!B|oi(4NISg_R6Yi7N=nNXnS zUUe`%4QZTm;*vk;(%Hc*A^2zkC>+E7qGSvCp4DBVM?79w*XRHAmeCd(LVh21ALteH# z6!)7Wxl;^07Awb20)hT`uPX4R_1=wRve+cIE;n!K)N~w^$Gvt9tZPZInO;kYPi}VS zoB^NAp0)8^Dy}XFS8@Oz9_yK`g7CLk`x0~HYTjd0O z+;z`2a`o<-d1koW*HRu@Lz9!9xa>Otz^LzT<$+{L(6hvfcLSUfIr>&on|qrmqOXR` zo*LD)wS_>2Sr$lh(afvK$Ee0DqSEy^<>-}qzS7wbKb*x-1ykt#0n^!xJAbh<}ezoNq?bOAHnrJ)>n!wE-Y2i2q>7&;na8I`d3v5^2sN; z&gIOmj}7u3RcMoNj$wx9qaRFk{hDjq`z5vb3wMIi@pv`)TuBSAYW7fPEtxIpC+uX>2yCL4He)-QQpS$#} z?O)To$o~6UqZ1mCrqTgI%QG33WYO`Bx7N zSs3|Saa{G}`qu<$)8_Y$WjXR_a1eY&@C4V-I%#*hjnDw?^A$oV>ymJzr>U%scj7*w z<5m94(KLyzZD9pB%eUoRWbFft9FA+)CHQ&Z?*r+^J$C9Wk(WPySpf7=$vuubR}FdM zj|QdOQF(JLDKKv$IDnF1IYG(D41Ks2=+SiJtYY1c2`RN{I}&^)(yqK2;g1pDI|jYn zWx|~Ak~oPxbs!eUrxoV^01AvV>bEU)F(u2igzcc}1Y3>eNttAi_iQ&S^&t8YT)&F-2=w@ot^o;>?p1zZ ztBzOK86Nf6*!kN^9JHzkRXtdW^6wSuAKNeXXUq)-V`Lz1R_+gOM}GAYTLG3NgI2z` zip%F#`S&Tt(f!1|`b@UrW+^SBa1W44!b9G({8l?DQm4p#@?74PKtb-fRs&lm1l zmGD*kO?%+ktUOTgT0$KyEg`h~JSft|kg^TM%(AkBoDxoQ25ZEADf||nH=3V>Wz;S& z9zi6_E!0Y+70GpNsu}VK3xIoac&}>lPMKq)X__tmh2V?vFNaKbnsU!|rd!6Ba_@~K zWl2l6S%&S;jlgl&7PSxUKZzDvcDG?-_L{ZD^UHl{9m+*8YjEO4`B;KkfP5$+vBzxv zeL2b%xuSekSSeCbdye>Jr`u?L1pe06t#zF$?@yK;G~T4otw$`5i1`t~tF{;1cMZE^ zY=$`%^sT<1sx(&bZpIr4P_LT6%)}AFC1yBpVmf=)o{^>BYEoGzh+`L#TBJ<`dx$pE z#y4ysBSW4;9mh3mUeNq?c=D#3cq}4mB5)v%Eu;cD1>$KDa6Vu&*Ql>5oZPB5dvT}9 z3nR_6T{P)4!K6(Tu}y4Se9$pLHNN6R(g1LP^=_Cr8RnzbJU^#HESHxrZJVrxxVu-H z8C8fZ?d7>qv>%m-2DvX7Y5pPb_OUh1zlUMf9_|*Bdx<8uidfq?F{s#gsT|`T*fr63 zK0gviV>0VDwh>!M#YAs+=51huZXpU3g&5#tJv!G*P3m(+>uVl~;tMSr&%E#%oVq!al!(K|SfU|TAqpeH#ekVXx9 zJenq%KA3Oe`y{tE;aW9VQ_E&>H^0mPP%+n>U=Fq5UmB$Nm*M>+_=dvr!qE~1i6OX> zM)P;>;5svmoa2lFdXZaU)47H|&Npc9G*1pe;%zeC=T5e^k!_H`&eG2kpO}$@9GrpB zZUBrCTHo-k?*9Pi(#!t<0`C6+_~m?A;2S@T(df4J!$;GsEN&6*ZEw8U{{YfIcvaIe zOfpf4&QuYcS9$%L@pt}uY2Wwu^Zx*j)>4~}S1Plv+#Wd2^2r`XzC6j3>X)uU&PGvz2Tj42%DjsV4c;qlv0 z@wS_#=+o&gjUBb>vi{}r>rW>z7)wo;SF7=eGU%K|7hGEEFl+n30Yf zIKVwR3fkAT4HEv(PkmBrfYzneB>OeMeXRh?Ks3M9k(3*K12H%iz+dV&qRd>Zhf!NB z1h_^|i~ zgX>B%yf!nvosV~#%fhx+7VTv<<;xUQjEH24FiFndjgsF&eZ_R%7}Ofu_ZHgv=_1}? za`xA8p)R|A>#If_4DtwXsjmvt<(e-e#FJ_oNscL{D3<9YiZ>6L?n+9)mC3*aXVeO{ zs%p~slHX>RuGMZ5qiOyNOWmyaKB3INWiJTB~NtRNZUi7>1sbB2*v zCO`!T-y9w?Y0_W3(8{~fGw4 z#DL_TyyF~`S`8icpBlB*t;-$L+wVt-96A>L;8HMRCmfzgJab%fcn?YU zbIQdQ-Hc<)hnC+SRI@0@%zKPiZ)ahBYp20sf2zZ&NXSLJme9&(l(7r<{NbFkfsA~- zfr|dmuMTNF50Asm#iOzC#L?y%s_oP?pCQg3Xv}WiIUtPvdQ@6w zrzW3g4EN24R*hyLbG#6s{W5v3n_9M8IAaO{id^+xRgbr&a`!e*EwuLQ^DNPn49k)8 z3=Ta(!L8d;R_Ih?XLY&i`d+OSrlk|k!!AksDvqH0)!kECyw|lq>?U0z4hv(P6OJ>_HMyW&NV>clgsq6gav;xEaz;M@Gh8m4-7{x2 z)sJh7P_po)pY}DY1(#@+SK*i_?e$|`SK=LR>sF2K*q<#&-C>TT_8esPs4eE7Sn*b= zJH?n5+7yaHc-&azW48k}ov&S67!oUH-EM;{agFRdgWL+*g+5t%nR9bS=a}lcoU&Zz zRVbig5l$2V@9KNi?+@xW)9MOt!}&3|&eOo_*Rig1R=I}eV(ObAIVv&r_xf z<;RTe86Ph|eK_mVy?Ihj2b`+4GwN+W#acDIW-CTm<5D+>`E&l!C*Q6GL#%v9)Aajw ze=NFWf?2@%e?Il&2`RL*^6agQl98Rj<8yiff5xSQN4V5sNj0d2xo^1wo$hnS81Oyw zTvYJUio4j_rDOcds<~n{glf zCN?o!<^*|TF~A1KSoZ*O0Qqt_0Qy&4X9=fHo}OnSjG^yT)c0rp&DCNyOCXljVPqjk zX%jqy(;a<{a=r;S3#5N%-hyVeZGlf;EPd7F4KaUQ8|!HsTzWj~F-{_2#|X#SnOB!%usrXx|O>9aeh+hRGtGl-#HRo62JTWPfG{ zWcRE30$BKm!*W_)i^-y8nGWQV%2kP&5sj=EoT&M?XSYr(fY;&h?6TR|HL^>g zv~nfIoVQZPa?-8@ep_z)xyT{7$sMcA!?n)svF%Fng7iEe!@m&xN#hTQT85dZ=&cpz zm2~SQ0ur|N(k}SRGRO|}ln|jqe7|@T*1HWx>hNnTr}(DQYYWi~@&wZayU{KeaKgsY zhD@j-a-?8a%lcn~ymjNRi5mP?y5nha+ua~KUDd#j;_BDTBtlsy0YaeUs<%JG&3!AS zd_B_qHZS$R4cxSn+pn2*Yj1RJoe%;8F8Kl4yr~3aXVSe)ML5Q3MDg&|XEk{%>UzD6 zrS6Jt?(`Ub-Dr>_-az6BWtSj>F4rnU0zqMpqPzp*8~EnO#mHmQ)Y)CaEtBU-5@u&_ zHKq$Umk=P4fZa!K{>Nc0j*$oaRtcp^Wh89K=Xy@Aq!YcB8BYY^hXf949cIHw(_mZA z2w2!Aji|9DW4D^+WS1L>@}t3KBalu7Wlg*4bmC&A6P(c(z`AvnwZ5gI3;6Bhcz@Nj z@kcJ~x0IpeWLF&a1pb?U+CK{a0O(Xt`~s8wE7N=Wv06D>9it0Yee znWc{2TxWR*xMEHYNCk289+mWNhij)kljh#uNpMmmj(drrCm|OF);26KdY@eSRlO3% z!f|h{YjMvGpdtuiw<|4@gksx@7)T`KU<_~v6?<5NL%T`lxBk+;zPUz*3#++qe7F^W zJTLCi&POA+ZkVqRn_C@`k1nj{w5@8(RJzjjKM!kiC9ay%K#6H+u!(2hO0Fz)S5n8L&1a1b^*rRaz{f`3v2Yz*5mAU(OOx`yRpgJ9FdT{z#C82yW340LDH;X((P9AH-b5f-xh_Mcas|-lgf!pqHW6` zk$LAQn#7OdUxPHQPUpeaam{aYa(>R1@@ZxxHNZLZ0FbOfM?iNFM)yLKH2(kx_=ew7 zxU#dbzA?%ny_3q=Bnk_paZA2D62KkUCyK?t(=G2bi%FyrrS06_eY8nrW=8Uk$mE|n z46w0cs_nNRHB>FjqateSRCzawJRc5=r?>V!z<}AD#3Egb0ytG5FU^v8VoB(D#yRr; z02}GnR>^Ov%Pg1f_Tn46gA>Xca5I?xQL!UY)Mp;G>KA%Gk)XgVwQHGm5xWNRc0Wi=>-{5B@r}NPVLix~RlBr_Q6qH`#?v6$rc@Z<64(S|oYwN1 zqY2lR(M|o@oYh}7qL13|hWdZ@XM*&LQg;}v;7!=Z?UAbI@y34|>#m;=HzaY^srY|l z=(f8KL4|NfLI~|r>I4gS&M;K)M-}`Hjhku7yG=D#|= zJ4tDG;&ijRWsVqeypk1uQ@D-CftDZ-diw7RaPppWMPKbNy5@P^SM_%m&!1%Qt?sX7 zadn}**D}UX#d?z~lJB(nY^xv&8wE(%NL(D|x?9^gE#$S+t|w15pi6~RhxeXhWGpeL zcRV)*_ypwhitBtm8bPDYtm)+~{L92yXKov0L@NYR4qG6AaguXbT9&W|rf!w(7)G0& zu4W~WCgxqjDEAg8J3$}=&TIP;uCsPNLzTrvv&s$Dzh`lMJn^Y(h~{@qvL@)F$s~qc zIb4m{Bi6G#CF4k}FWt2(g#F`y+m6r)=tgtppBOx7cPI9S*eV{?XM z)P)1L*Vd@&5hV9p?a%-hEJrvaj&tg3;_rn&5icxn*Gsyaco<#pl2i`ffqy#t62nxr z)Y0y39bPq33G7Jw$Lrd@OBsWyLVU8-A7z8Z!x0X6km`02No*my1mNxuk$_0;?TYj3 zjWO0~ZPoAx%@=Ta2d_>mti04-VzP4aZ2;%g^yysB3pbuJLh-e#VBL;}lV)g+;oET@ zTOk|NV<*=?&XP-6A_D7v^+qIo-SLm>SD1^3^MM0zPf>D1)P`7EKKE4DP+$;6ld#KwMfz#q6!xq zLasR^=bWD8))dmo6m2Xdp&8>ncMNpz_}6V7=)zhfh`EfcO+Mvfjz`PWIX$vZ*ELqw zNm0kz2`2#L9-mD16}N7%MubkFh6gN1LTd!c5q2Yp!OlH8{vy3N#_>Ff%FgF&Yp6TL zg(Zq%cPK1*H;cLl>Cav1n03C>0Bj-wLDHCNjEDV2>=Bc?fCVtP0{Uj zEmB2m$8~{5J0^eK?V9JS9!06q2`TJ)N88$HRK+QjLUI*B5k|w)BMg1UYk-%+vuc{m zdadg$()ppBpSq~Lg&D6vjvU7wye<_JfTI`ybtn7Ge=2O(>1zziFuB0oah^^9$GNTu zRB=y~>~y03BI899vms-J9Bl)?Pt&zT1Ry5%*|?vZ(Dn!GRO~HY-VZIqJcXIE$L3}y zsp-M(R)O7fbL|D+lFvXd9Ft9&Im)2%H@b&ydDV0@~(SW zyQ>_*ous^Y9~+1azS;Hsd(`Qs{if|^jah$*lc?vZ$A5ZyM3IovuI{QB3^obQ4lAM2 zr$IXIQpFD7arcz5FZ0p3VZRNn_IDR@4UrE~D>XsABs%Y~hGDi%U$tFb@ z$tV=(aP9qT;@CWE@i$e~ucW%Y@fE~UrP@E)WjnV>Hvac0z^223xEb}Yvf;{Ca+BzM zClKPF@cW-p{5kNKfOHQCU0zFRs$N~{HjdWw=`q|(Wg|(S-7nd^#Eph>g~!T3=OBvd zbf(kvZwqg<@uT>ARI~^FCKu4dy5%;2vCkCm#?#A{Ahv7ekA@!_z9eXR2BYBb3^e+b z)6EpniJ4f(_I=y;7GbcQ{KT*r7$DO%d!HA4O^!QX5z9NnV$sL4*6?{IOtg{9B8DRo z50?NCZ~?D=q#rwM@RfL|q_;msH0@)>ZFS-8KI&=YMt~z;M{Z(C7IjuK2v&8IZyzaf zh0SpP02ef?EoH5=+lIVYq`Wcdx{MG=E-j^ut1w3e@gYt@*z5S#KZ11KLr1aj--oAbZlcPrB`seiiWW zMi`U#h{3_n72R5Rro+ct{{V=5AqJ~|Y1d zmC!MC<;DmE^Ina3E^cPeHw#kg(N;c+(qYE?-?80T*_I0{EO1JX8-^RU#0x1n!2p~N zwQBLMBku z+%~fxES@p9f@;r!ylr>myDd>|um1qEj13$TM;MA&XL(m3vOGnQsKyTOdg4p%BhhnG zT#s|3@W!RB$!ho35#2{L@;P>bNa9Hp9;On@f)082Bbw?zwR~mkfByh~WB&l-m5-)) zlE=fAsc)}eX|{mw3HG~~?b2)?^@tQkagR~o^U(hQg^%Fx`V4q`{{RLf{{V}kaFcD= zxI0BFpa0VO8Vw79p^pF4P_ZnKbmuWDRPJkd(7GPqcdWFG&4%>A9Ngg_pVP< zlTo9K`eiXyv9%%{{VOr4+6D!QLviS&+zMN zQ6`b8c(%?NwVg6j)=Og2U2P5kMNc&EMmQUWN*`*y<7*EP{gzF8QqdmX+&H*d&EZBz z-OEfjfWx^NBehn%g5umt_KoGwAS8!Id0^f#yUb+-7w@$2dFPtt^tZgWm9*(4yVVxw zd`8wqNf;;q1#-+tMIg5-0X=h7y^vITSij;K^)aI?dR)aW(MOW^(Z_TlGJM8YiGD_B z7{X^eP7Pq*c&_CvmrQ9UTX^k|H1b-pX(Uy{s(C-^P_Smf7+meEJ|x!ISWRIxP)7&_ zV`-&jk&ex!nU`n|&76Nq@%v3K!$z^5=TW^TOSbaL%{-S5m^^uE%*6=@9sP4x3U@J- ztgdFu;yZm}?n}91x_gk#BxM?52FSor3WN!=F#P6wSCnCGBab0Ahy7cmt%jIie=PBGH6wSO3Bx^mfDx@?|!*ckk^ z-bQ|QX_@4Im;wOfj(XRW_|8pM>c{OD+HLKuasZM2>7wPOth<)t0wZ|{7*Yo8ayoSB zn)fdVc)w7zgZnmB*%GcWrwrWZBiq`%a>{QmQ)_Uo6q(9ke65q;t#;8^eV}hHPXzpj zYYc)rAA0lg6ys4^XQPFyDq6t$Gft7N>=tz;k1g{aFn^UtKGGUF0n0Bz-{^aa@w+b> zH-!=;)X4iTL?&Vgz+!rgk=DHe&iV~Vx7co0VBiv&ELU*-0k52?gq=Ay_CA`1G8H3e z@6_lmjA;u(8={kQ5L8w@>k|QskIpX@MIUo^nP=>In6z zd`WdIaQwLp4tjCdKaXDZ=5YAIl35btCwTr2M)Akw-=VK=jX84NA3KPz9&S_7^vhS& zrBsEQGrKzz^d}yk)$bl27Fs=-eMaH-sQH<)IPb@%Yv%12#dBE^C55tsFH*;G85Qn6 z6t>j-RVcXCWJqlzKO(2!bLpJdE;2e^dmWfLC!{w!TR#&^;t$V2xX zjoIf-+$qYH{{Uovjb5;pIV2hRFhB>U3GZ3oLqoXJG~YQqh#i!J`?m)r9eMu%IIl{A z!bh=;T#zmlZY__Lk>4Kmz<6%tEQKX-yqpt(pL+ELBH;i`obku4bElx@VqV*Ma482Q zoafZn8Le9Fju~9IA2Glf9A>+HQC=;jhu!0!Z(8TIYom2$A&e5y?O~7Bw5PhcjNXSK zX(AF&+9OP^z$6=T2TUJPR<1P!(v@VpnIjGhL|dz4s9##4cNj=ngQm^jszr-PYeod|bq>#aOZ;|+UUx`V?n zJ**H~Npmatf4g|&BX`Y={BCyEDK28_`k?w2Y9Y@4Eou$^V zpjbs5c2_qZbcq~>O@I=7ypl7t=Y|BS=xgk<)lO1sn$aWSvk6pI_K#M54XFGi_>TmZ zej?Qx_W89{d#y$(RR-CfJOYkceAx<;0x0=$&%YU_TH9#4w09mGi&{l#V@DUS9D-fM z0~SPSjNp=a1Gi3o#PA|$elqY5ho;@i*Rjn7s!9^-d0ibha-mdta)JOkVZiQd=dX%3 zULmmYcl;x|9gdTwU%@-Iyq2=u+g-GHEewv#?Ga|d=)i{^Fl(tzIXJVDRP7ZseT(q! z?^V_{W8te?Bcy$fDCbF1^4dwZ%rIgRyllb~(2fWrBN(qE{j2;L;uO;~nRH8whzX8) zCyHH4B{Glz3lw7n<2>h+)OV_11TQtoHJwuS{`B2kSix%xzR>e-Z0^LYNs)QyZzR^w z#%)ILPq1mOCbGVfB9Nwuv;yjNeGVb|Ca_Ruj1Eq0Ml2y^@)t5FF?D>1)*TR@u z1ee4b^`sWJF$=FE&iJ_wzj#i8Hz{6ns&Y@YeWT!?1^9DJ@bixZn`_DUZG_CsCPyRv zU|9y@3G0K!cqhPEHJvNNf7_{MZ*=>~mEs{0-Bs8I1-7(-R~cZufnQi#UFp$_{YK*c zDc08#BZz#zvd7deRS{n#{JHtL>s?rnja=rzrO4k?$?g0L@h?Zy^*vX|9wyVTY~yLf zI#jZeYa&XxLm*)*vVqRV+B4T2SD$IRV`=(7i8VbJPq5N7o4bXME1=N`BzV&%Qwx=u zRfcvJ1Ti2Cj90X4FMqG;X3p7TfiFILZ?-_}^15KOQUnf+z-6)BM_w~uF8oCB*NnU+ z;sI(dtkXxlMRr-lk}Qc55$2Q|R29$4zjzUq9;%EK)}6;*e$8E6^37|d=Ja;n4+n2cw=NB;l`yx;T!(fkKrE%SQ}k` z!cgjW68y^Y+s50FoQB&vllbw+YVE(_etb3m0HS+m{{Vn?fBZ#yv9-Pvg*5eYUy1+I z`cqGnTGRB^l-|T~DPn%k6@+d8Cu+I*nCFJ}rN58GcXqMfPZT!x%_h|Ivm{Uc&e)

FFuri-2SA%S5KJk6L@xa^Ht#I0wrK?<9!Ec+`h?X%U4N_Q` zq>OT=Ll$M21M-9*anBXqUkxim4>k6WbFM`?szn5zR7(_xI0^>T0Y_4D$DV?`;_Fgv zKnAwb8qzq`m>7zf*<)-1ra71vUd_Pc1XhX)>c$mh`E@vd9QZO(t^Jx!XI{8yU1j50 zk%hq+*?_j-js{BP zv;;rD68)AWEEVM{z%Uu!Q!K%U0dtOP#QbM-Y&7{2YZaK^Oy*lwk)htw90l5gb`E+B z3hj(EyE$bfm5yIY(x>rmrEB5+F5>R$JDC+^d3>VVI-%7-dm_q$nFlvVaHSUk!f9e+U-Z(0J=xwvOFnj3t~(KX!#i4$^w64mWjX z$?adHcCjFh8Gi23w+D=N`q%RZiJVg$<1th)&-YYrmz`F*ie-Cn4ipTWa7nHY#hT0-E}L_Ia={W9+5ThHfx!H0 z^11%@qDc23xg&Obar;Pk%<1adUAbvYXk}!KWu3Yzk8*hQuatZ}b#Z-RaXsrx2)Tej zsdAAGq!!#rjy2>Shuf`pz9GNVyk+9)bs}L)WRNqQf;nx~N7~=* zF&LOJ;G!vZ1P@$io-tiFi~MQf4eO_BZwZxl6^$H{HUhq8@Vy34x#?bCHTIcwFD>-+ zTbQD7yS`;Iql|(#46mT|ufD9k)Zasc3#8gdlfj8KIh{)RXC=aqx;rofrEe{?F(Mf- z=uZr%kDL7T^{!`7@U7j(ptIR1g}zg}qLJU8bJDu43rO)CkhEI-Ee~+PKm#P_ z9D4SyS+teYJ$iR~ShH%7HOxDJZ#75*uFx`gphWE#BdZFRnM*jd(mf&2*LdWwKKPxv-taH;is4i8|0E8nj>IlF+f&4kF z9|^^Fb-hzizLki%2@DdbDHAGu-!6DOk_XV5@MTIWo02}0+e_NUC$ZSerCfQIx7)WI zykvD=+ndyOs=A@kV1&hSCd?`Mh#OhEu>Pa9aT>H&l4}-M){=Q<-NNXMVL8rvoO=4!bST}XhhG!R7j$I!+T%}cGVAP;myd5R83P#gJoWn5&U$Tv ztGvwHjGU(KNEzfFIn8(ayi#1FSXnO9G0Sbwpdj?O!%LffR;q zs-yq_B;~L<`d6uZHr6z~BJJn9m`G+AV&`wm-yi3i^Ro(k)b4uN8oad>dLK_8GCNT` zjew*R+W>RG=qfm_M39->@Ei=Dr1AbWLObgnQW1Y|A(|{8K+S$RaBPA@1BR(t$TKtFordcjlf{~=jtoW zw5UM15|tSHym8n1*KuV2Rltq#5O5riU+^`O*qVasF`qD(U^fzeW5r@`v~0yQsN8$< z2<^||UB&f{mBb7C!dQ}91aLh@I@g`*KiQFPi6)LyjuDwdXYN zwWirM#+z#qytr6=+{J z#{`B4w@ULL4BKk<-x0MN4N4{Z9QLM7vJWsax5|uHrVyS9<3EjKc#q?sjlLWBmr&9? zCp%B2j9Wde&=Uqg04S#l0BoLvj@9-UJQH?=7OfuoA!dYv7Q&^z1T30P>i6I=a( zH7h+Xcphm~i9S^Mp?6#y6&M3?$8MGQ`8002z4VrvY?mt&JHM75K?*x^U6dRFkT*9R ziv1nmYKp-0SGT1mNLG(Oa#(eypmD6J!4aIso zfH8yX-nuDKw7HITTikTyk9qx{<#i67STpUs>SOw*TLmIVbq&cZ=6C4e39|jUA;3} ztP$&aey8RJ`yI{1FK+}zK~)O?FTZyrY?8(7Ex0EB0E( z>@9!hi#5^kMfB)3_+95T< zMPYgNXl|q@WNM7T&h5zx^Sf&CxSv9Js(1Qku8nhbGkMIif@4_xlttB=dKBDs2dBk43@y! z22Lv7lzKj&4c3>ZYnnxzns5@_O>uCI9ieQT5V;IV7$5`Iyy->mf#Lh8n^B%gyoo%! zxguA%V)zKV+ENumV|Q#0b6%a`_%9-~v1oO;>~5~@B}<#Lry&zA{5O!qGT;Np1-Sfa zM}5hL+Z?s+=Bch+H}+P!rCpN>x{vJ$k)Ac>*&A8|qQRm` zg~LpU>N=M!U?=7tj0O+mT3#veui2-DUkA$8uXhZQ-Ab{@5YDO)Pr4;0KQ%})AmeZy zvrL8yZ93WucA70lOK6b@j%T?qaT@&XAYINBHcki}@x@ism5H6wxq+#8@4>MECcd(| zyIkR6zKi#0MsP`#5?lR{aopy(ZF1{Ky_(wQ>f=v=B+SvQhjTasoq#FG9q>RsYoWcp z)!u1aPV#LcKxH>G*=1E#Ny?_&0?m<{p(j%y9=FcTK3k|rD$;w7u<1RN7 zlaAbH71d2yoON4h@sALAt4D^ybklXQZ2tgyD@B-?n;8V`3Q7(!!2-5^1N>F918Q_CxntWs$AtVFs{Cix)5HD|lwRoY%vW62;tFk% zmmlc1?i7h19d_^u1kZ68IuvN5krF%o(* z`uDGiem(g9JBcCi-Grxf&R6$fGZWo_<2!xNTJ|4|pAzhRH)HlVXCG|3b%hleZrtQ9 z0QTGoKf*cmug~36!QMC4wY^I7Q)nixaZ-TXrH$j3ud>ff&zj;KDWdb0| zM!#oB1G213jm3b;E!MI;W8tZ6XG@JB0|`cX*#ldwVHa~S!Ot6Ug2#@Y{{Ygy**;aV z^X`*Sx;`@T?XHojU)!4%vySKN>bFnlNi35{21^7Gj7m;P8;`wm8f-)vwL3y)jyy*w zD$BU1OcFbK_Qor{@m+?uFN$Bp7r$hd{@UId;JdN9c@#!Cjy#~>=K^rb0Oa-KHQN=} zbse(Lacy*Gw^?rC2+GknLy;zOPOeLd1{iWYad7ThfQj2_?N}j+CQGeUu3hAK@VI0s2?2 zX&xS%>@Y)ep`Jh*Mmgo1B#iqWD-*=;Z3MT*vN;+`kEOIw3&YYRNbAs0Nqp&8E}rn>JI%;_{v@(}q89BRZDCyasIW2rn< z?+xfiIMQqA((3SonTRT?gzyG(Mn9c)QIe+xCVAM1y0YX)JK^67-Akt=x6B%OhUR2B z;P3`|pGvc<_&MTD*k#y0QgU(Y+r4`v5&fN3X%RpScVKbQf1j;T*R|%B)s;Y3Yyd)y zxIOsjezlx2l^sNu#*YI@LtW39FCp?IA^B9vW7P53d)0e;x$W+R$rqX>b;kbyn0-j} z80WQhT85O{r@U;8HdS-U^~m5>9MNMe=V0=*v2Shp80ySN8D1J{#ZDEv9pbe%IxLD?Tmfy8@Se8*PPN~l#1WI4gcLCthJM6x=j@J8X#@Btl0 ze?QK=;#-HOWc{ z?qySBt<@}2D>sVS#Bw^2Hje)QPWAb{%-m`ywp+|jK=B!(In7q!zY~)Y#e790F3et zeJ(`WaMo*(hvk~FcYwXUZUv&(lfq`~)jj-U{87SYh)dz$r2{{V(R z54F8ZQ1L~+nz#Cc-1&--%G)Dn^uhAU3)ki2sIQd18EThW*Tq{~9UDuNL%K(37kVy4D8eLI_)WdKN|a=#CIBpg!~gep(VAinQXIOq;}VF$8|dHK5E8+QCW@-)#UI- zYv_}4lw%jE^O3aUCf0>r8tptU;O#@~S|PoSEv_ElPL#TRcv4by&zCU;+;APd?T4pMzw?R=y?C^trU#O->uM zp3e69?q!XXg09fE0;yxc1cB3<^M8k*4Xo0JmJ+rP?Lp+O#h@#7?Ui zV!K>`P;D7Kd9KVP`8k_0#8c@+=JOpC(ScRG->ON&QXp4i5d4qcEsZ~(wPLlM@#jqy&M6d+x+ z+I-SlVgRf1xGVMn-wZt$FUTsOgsX$jT(uuifCc`$R~>7-Nedh~(b6F%olt z2>{}vokpF_E7D0?$lyO_9|l}}G}SJz{6l?VZ6>LwE6Zbbkvc@KSqYPS0-*DdH+u12 z(?5%+*4-@ieKx~WTL+Rz$VqMhGLi#rfyZQ;NT*Xm@LIZ>mRgZ+`@l6;Qfc z#c;c1Es-%U&Y&E8!v~&~%j*{YBag+GI*x}W%fT|qXqM{-mlR7N`O3!7susZHyRdGa zm4s!@TbUhd9JG{K=hvP9zVU{UsCW|c>1-O-XO!HS3zwA090yX}l;H@@7uvpR)&3l4 zo*&n4?eq^7Y4_K*kZ+3C@-4$JDYv_`)n>dOWw;Ofu*|A{a9nl4 z{t`l**S|)i_HDOg!Nfsx*&c5fi}fh{TMntJ$7*#SlOJcZia4Yw4${dIg*oJIU`g(4 z=}&);5@6jl3R*106G7$KXE#Y1djr7W#CyvcnC+c~>jy!okg@hLI={mjq60tE$Xc16jJCw#Fl!B*#OLpmAd;b6nns53SJVE~e ze2@M|uS=H0NU@q*8;xR39p;hl{=*dSGoW*{ZIBS9pTP=#QDFftgD)uRx8l2p=m9oZ;U# zuN*LavrQL~ND&_8l=-oe0m(pzZ#g?d9E#o6t}pK3^Wk{jWI2#D;yvg0=PUoq=x`wB;cIaa-Y~b#rzW9LoC5#Z?nm5F2s!h`^Zp*0l(P;AlEr( zZQ_|U=^(qeiq*G_!=`z6AObP4G_c3ll6H>0YngkEdrF7MwS@&Ku(cpUxTUOL%(VB51CC%K>BgBI_AcEvO;~+0%lU#M_)Ts&6 zr9M{r_4~q6S5lUyzK{Dh*=lyk)9bz>y0)0^-4?HOBVY~*Wn=Pz?g6gfP5q8O4@gw& zR?nz_3WdGBmgDbocy|LN^YyPi(fmcG_=4@A&^$nO2^Dv=CS8!I?pc~OG6U7JTk@_4 z#kLwd>MtItZueJEgmk(yhqsFIQ@AQ5Au_4}BNz%uuaU38`1-Hj%qG1r{{YD&cV3mQ zsU!4@;ZMUK2mCnF#)shxWV6$v{{U5Q9z3KZlEh;_G4GOk3idN>fqDx3oYwp`qFid1 zLrB&2J6%FK%Sg7Dvs?cA82#7`RTCuc2!x+n%31zAXtNsu@h`*%);JbRg|d}y?$Ug= zAyv7Is;Zz-lH<7}CcMaaWTPogb$z6z_N1NuZtmeMTbtU}?0&aNd%3mv{5XY~zw94HR>pFwQao9mij%QS-luJY(W75ZSCAAl5G~l2}KZ zZLDr6R{#^_+d3wA85wSQHRAL9G}Y|&8!r$#MEXaXuN{n5S>G&~-7oKDJT7_pzK4p_ zF7Uez8tSe(e9=z)saZc)yIs|nsS?IY%}4JwuXR5aYI>wsm#qe~sz(W#R?hA_eaty3 zcgjk}oHHC@x#PWh{rl;Y7`3a-V#`jwHvV^)cXW)&AshCl-P{wvZ*T>2_8Lsuf?w*E z+Cshky}Xvz>v3vx^OYDy44|$v!6zcSuM}xoF0ZBO+CHmgr4w=ybr+5=H)^3!Oy)2O zDgbunxFewhpVBH*g(xaiQjAu~DdS8@{O>7 zGws;bZF|G%{i6-;xHj5KhDC-F=*=1E#mbx<_S=f=<8KMWrHJ&sR>tPcC@~l|#|sPv zEw~h7LiHqPtzl|{o!;PEck(PFg0EP25IRqS@ z+??jUU*cu1t*GhJrI@sf?4&Y&_^f*ul7IsHi+Zoq72v)evez|xxoo^&svBmxMR+YO zox>FbZ}S+&yG94f0XgS2(>g7}O*7ApRI4M+yk8cm$t>{3-b<-f-P8e$XW!KKJ*&ZP zq_~nzlD_!^1po}TdJg{pg?@+l>%zVcm&5ll>9#kqJ+elIL<|Pz$IrE#9jrPKG0%GW zN5cLJO+(@)pI~5Sw_CKC^1s0w208lU9`(yYT(D{MJ%8dfc zF8*oRfL2x`g(D|{-?6Qm_$0JP^AxaCz*F-B>-g8MT4|zol%NXA0NH>rJ!^^8wAoVn zOF3H#=LZLp8>f7l^LgCl+?n(WDiBE;{tfWk>UR-eE;qrA!NFHjPf8h49 zv7b~3B8J^sSsl*RL>*3fHPHMl@U7%vEWkWk_VO8`B5u_BQfWY4p*M!bgYl~SrFXX{{UuqXG)gU*bpwJVJnU} zb;quHXEj0?EiGGgyS&sGU8)aXr>l8Cv{Vu#mK+|q3@c6?DRF1`_5Y$dG4X%>yjSn6KW_J8SY3Q z{c&GJ+i1RYW=su$<98c|F~A=F^_i||Yh$P7S8BWR7#2{Ylat#66;Z{?Iv#c+5UPC2 z`c2if{{WgvU$ee9VC47X+xb_u>H4&KmY9tMl9q&Qo4?JD2tMMuFB?F@Ft#vA?;?Wx zS8?0ao(}_UC&OJ*)_aL`@4YL6Q8x7oIqUSUj7>jjN7|U>^*x<;N25JQ!k5o~Gr;*i zK)@jN^yAjON(o;~9&9U+SZ?|r)#tiKn)W)sodWFy6n-(DbJD#+$wZ-qfNDQc0Zn%8oF)J1gCArS_YpmELdM#Ssnif}@=KW4NvDf5MXK{sz^T zQ`6sAx0y*9ZjI>r5qX+9vZzF05q9$k<-`Ka8Dxr}2D zK;$vTFkNipET@ug1S8Z>n$#XZFTHbB8(iY33c}X8k95z|G>?`f?nSZj1k@@Z` zG*x9N*yR2O+GzGa5z)1K8^e1!FvlFD%JP?%X(im@i*(3r_0A1@rnjT`&*BG+A-;)z z(cw)tb{6s4O5h8~h`^RM3RovO3NS%9Cb_=`{5#V{hl%9W-pgJ7%hM&e1~r*(VwtyR zX!$ps4o*t#BL^nCZv^R5)U+Ax^jldZy1Iw^NyL`-u-xA4wv7o5=C)CcZIO?gpf%u} zcAIIa>UxyHq-m~UdsDH)f|5+A<7+NS!39Qh+P&*W@GiK}#|6F2_mkbCPpM0E&g&w` zqdrqM@ZMsdloi0}Nw3Xch&Q(oc*jv&D}>Q5?A%zLI^7-;L?_EaHs>22 zE;5@;-xB3cF=yV|w}>?x{{Rmy*tf7cl#p(?w78SYw0+r9qTr^&(YO1gfxzavy)Rp^ zi$t>UuZi^wOHEmfO9hpMw9E$eKk7gTrSrxY9Zy>Lm&3j<_?6*1C^XAUb=7V4DLmb` zkV|q%RoYZ3BqD+dI0GiSO#wygTs!8*T-CGjlQdPVe8>Cq^244Qq!*Ov2-mPHQisAFtpf7&M^y;sCK zzN;>uGzR7^BXTXK+o2&^sfe5T1fJ&(@i{fkt-@ji6D`N_*ko_L0@s6%ZGjEvBEax2Rod5p472hD&<#|O1=-aPx+9<)@IF6TF| zPvNtm-}(3Ut!XmL8@%%~LhctT%)8Zh1A+h}k&M^QzY(-K{3~f^8p$Qy$DO&J+EiO~ zj${Q@Vo78yUxU2u0C8VUYyJwdyU?{sH5*$W?5N~$*4B4Ufjr%+WR_XKh;hzvI@iwL zIQVU)co#{1Qau)JHAKpr?6v!2Ayxy*GAhRGV?5+GKo~vi*~86pJ3F2hE)sIp94+^c zJWb(`3tf0uPq??dd+mb2TSzCJHvyPk2Rl^fr+$_7PwdfQVX62NQnJ(hy+c<>huZ|R zG-`~_TYK(S^4KuW0`tXuMIV7L?)+JMad~m0q}pY~Z1UXe@!P^9m3N5NL@La?avhKY z4+6fO@K28X58(Ye`%%zaLb82lNZF`b{{U)F3oX0&wlR;q{ zQs$P&tldxI9TMT@(_&VZ;O0=Wypd#ZN|5l3=N+@_P=CTx2NvsPm8rXQB z!WKRwu$N1%{@`x8K6b@MDB<8oH*S^8x2z5KV*(Z3^Dzk2uG)Egld3&~`jzC{uK~_JtV9nK( zmeKvD?bwM>x)wj&$|GzCzDVu|rF`_h8?)7a5tHHjmV3MFchcmF#@$5Lb6s3YB$7AW zyZnR!)8-s*1pL5*TH2NM@pw!cjmDpdB9c_QFoZ(jERaOfD3dwP);ykaYJ1&MJvAaS zF3F+_rHFFP8P4!Cg$RIrpyMYMiw?6qmr;F>Qq!Zfxs9$z+HJplf>_SN(n~C83b_mc z2PckdA@JP_S1oHd+C{dUd`NsV4zF}133Bgdm(L}tkM+utv1Zr-47td_|Z-FQRA zwl|LUT09nObW=~Z)O3reH|m%=$k@Pb!yIO->qgT1SJL#^wAG60d+6?` zidf~00TPLwf)TeH7ou^K*1C;1#Xd~8PjJ_hTnNj;h#+|U!Pm?lepOr&a7S!rxScau zl3h;Y#G2AcKBGKMZj8wz$7u;Ab|R;k7jPKH8Aq?_2 zoM(#dt=>JycH*O94bRKC4aTVGcRG%%Z#25<{hH?7hgeP6Hxhw%Qh%Wp}LUaOtt$xj}Jp za3Ob;?gdd+CL|1DUv@yru9(Z-U5r$G&gVgg!hR;uZ(CT>u#>5zf8-cuVc!r3v0@>Wi`#JMC9(~9)lU2{p*d@CNO;k)~7XG${XHs~GQ zorxCB2uY+0h%#IS4UNEznyWassP3e$j{g9|@n7k>ZP2*8ycbg}YNJy&;o*&j2|s7Sf2SU^}JArL)ZLCkeUp{!CSk~Eh z0T^K@7|6g~xyc0My?Sc+g8N-dNwr&e^!P2J%uLpZWRWBQd2S}Rhy(mXXHMp*_<~uc zu$V_Qaz$?(OvyE+sw9j-0hIt?&aK>@gz?(7i+8p3Ih-PwGe^%lr-n5>NZsff7OG;p zj$N0c0W`9rMfYJ0VP#ZE{_#=(J?k?;@RinysYPja(M_lb-Ihq@^B9K6S8bpwoDPJa zucx3~>-tLACYuGdwwn?wN2uJ`X~AwTvPYQPm4Vvaq3SWudh0E{~qXTo}4(UP+yKWmnFkRMV`?uo)Mb6C2M^Ncz^y{t-*x7DcLW zSzwk3S^@?@;|>p|7-G8}J4Bi6{L5rwF}c28qrG}3!>u0PJI8HODIF2FM0V$#<(J!< z<&5JMc_ZGa+_Xoa_+!GtG>#B~R3_qEj0|M{UHz-_pZ1yYYJ6Jwi7Lf8Z3DyQtu*-g zQ0|BKlOJ8|4hQ#fU!xxuJ~`Xk$Eo-u!8R}Uvjf{*YAkRfByDKdrVk_%GwENJ+U9|C zqujgPw>ikb>7H}kWY#c;EcxTOrCCZmjN|Myt6K;}aPuOJryc&B{~C7YC1)fa?KMVkYP8RZeLa72C=Ot)aa*H zJ0p^sIn~xE13c2WP}$)@>P~B_x3HE7mevqdg}}}*-TweHTAmf~T z1!^|O?UJF15N^ri0Qdft?|vKjYc7#yw}w5_l`WS0v4O!k>FhIEy6p1Y_;UVxB6SI4 z0zb1`yhN1ac?x+i+zgJD=wWEadd;4GGZy0Q1BkQHPSCI^ldgducNcR)Zn)l>1`2_W4SFlC{o)Q5f0`6 zVaUK1kRx_rfJ4E22T2j9; z@h^s-gfNAW#}i|ozZ>grf>2qm|B=bk?r zMv-l1xl23NaXV+rRUuFwN|3{^(AL+7V4m~E+FjMiDq)0cFAin~8Zg!DZ-OTHJg1^@&EZs+DxUbSOy9o!{Vc#TQj{3HR_ z{Amy-Yct(PUBB|yEI#C zXrPTDdsUE!beUoi0+RLJh9ejRb6z12ggh&2tZLe|ibs7GjyK!QbQNYrVZ+A@FlRxL z^X((orEzcLeShWFrqrTYVnG5$1aZeSkmmyiFat2oGQ%UTXtHj|%~j={~ITjVGGSy&OaqPN^Dk_J8MXe6ZC+~~(ko)K*Ner*?B@h^a8 z@aKsoy3n^jQ$Q&K{oM3_4y6tOUw$LXBR4Bp$>}{6o@y&v&CwrQAGM8{}ya zNUYdpcXeismns_>U`HMCUj+PZYpX9CCWUb>nP+r~3?6=)6GIGnE?BL=ti_V7$mMdw)CT~FtwwB}1_<}kue zFn&WWGRvk1&xe$ZxmBY9C~fKv#?;w9ob8wfzYQWzT~j*vfe`W zQw=&>s6(ia&QNBCF^ufOw&BJ{Lti8K_u&Smf3AOO&7mI*iJ}wCl1(g;Tt*oF@l0{Z zp|H7l#|klubny00HQ5Lmu~*Lo2L`1Dx#$=-I(MF+6kw z2BH4|hM)2O0R00jKkv+6{A#>n{{X{wI(UxtB@J(O()mY_0FAIlNE!Ax9CfV!0I}GA z&q4nHeHzYGsi&$rmL{#YKmXVDmz!CGTego+7M8{}X{V0j-ENa|fK{Q#%)5Ec82Sv< zz8W%KE%Iup+in+lyFwv&ixar=0Uo0VzpZ1~zt|Ea)r1RkYFlLYjzsK1z#DVW1I_^V zuBcqV-|1RXKB?vcLfWxJFaH2N3dk2bPa~6)iuv83&spwZPd>A1k!XWZhDEgva_rVu zcOPg|l}H`ZW^&<3Vye05X?#Dc%c`y1b`Tp&^(PCf+Wn5&b{*G zp4wDV&3v8`LdgpV<+-|nB}Z=fJnm!lCa-E27B|+TPMT|bYqAq%y2+Me4niP9xl|rl zjx*HMsa`0qUCKIsqj_ziOKEfVcrNYRV%^!v3AVca^Pm7aF(VsUM;#4Cq_(}S>Pf2I zZMU;%*&(-UpR=3s5Zk$c;Gz?pg(Z((Dw^neifU^NdXSEJ6hsxSrB-J>cJ6bvJ#q>4 ztBa@G+FROOzM*S(G%*yFZgmN5#8IvlR7D8qc1GSiWY$laOHGQ3k1o5HH7zvQ%oYpV zmuF1P8Dy0(PY5uigiO{2`(NBL#dIF>&N2e;D4;1Hd-sV5IXq*NPm(VZ%?y*+>6Q}B zAP|W~^~0{x*$P|9#!d%3@z$fg({&pwp{ZVtIy+A-VU=XmC12mherJt>2J6=(U=9a* z!m@X|Dqjh=d!<=SmTPlwb3UCKV6C*$MzNET{{Sr60c>>zurLk{CZh(C;w$)}RnzBa z5fU34ci%7(@f$wy{{V9*gdk;!V^_4HuS$t+ZfuM#^C6bv>S>*OxLG%0PH?|AXL_p_x`s{4-M(O`Jg^Bpfjz}7&aG|XO)l&H5=~;-`JzRYe3T$TG6Gsg49rBX zI2?hFn68ObdoroQHY`Qqi>qBU!{kD+-OPq%mKAc&2q>BJo8?k6c|AMyu4`L|PqcYn z`%{NZdsH`3jmruq-mb$9oPQ2M998cN-FSCavXXBS>T3ux`HoKZ>Gx{{SC>{6jSR0n@w1JQ zXI2GvHY98!_3OCcax2h9kAw8PXwoPzZRIeucKhsP!3+RNBb2cv!;l6E1bYgY$$Lbi zFJ{~w+407Stm@t%*6yz(w{*9H5Yj6|xQ+w!FyA9_oPE_{wQw<-^~+m*QpZkav6|k_ z*8CY{9#5AjLViW^)z>Azgy5c)O5WDjP4Nq8`lY_HAz|jl1>?tX)60@`T>E$YkOg+THHx+##ePRT(qZ^Br5Jy zk&bbN-8c+-orj)XEwnq@R`5TmlA1JcI3DPU=4ydh9s@g|`{y1p*NbvQ*x3re|S(M3n5tcom zV=^IQ8OAn}M(%KW*PM9Q!P@tSB9l?^HT~WF>-kR{sE>IY9OG=079Lv<;U700t5-@B zijOUK2-k-N&R{SX^A%Ng}1W zf3v7FN}E@5 zhYN85e3mM~04E0o=O9(nglAJ#p~nicj9K~dtl0s5CZDKBe`e`&t2>C)CU-DAkb7eT z9c#4sYoh7!>vJu=!{4My^3HPJUgjfc1OPt_gIp(#^x5>yMp+<^=JwnxO4m;rF&)P_ z41|nx)Zm)-zkymky!r*stN~v>V4&chgFVj#SE-w~3O5Xv9@7yNy-!Y##9Q4)9^^Dg zjUybK{Jk+-c2mapQBJH{CMrS_dK`oN>b=F7l1B1L85>ld{+MS z+BoydiBNag`Sm^?Shdy8rQ^*_?(S!XH&X??v2XG+nGqPnI8ZRnjAZmUHD}>JhV8s} zX{yPl-|N~MLn(^d-%PoVDGVxxJi0n(djpQ3V4f;J0DLGOHM4Dg4MzGao4claC@vve zc;$s$I!5QrA$O=|C5h?Nn)9DJU8^cWMw_cBRu1c`a5x=O7Q%a9{7 z1~H&@!vb={wRHN2z@H9Ju3Y$vIcL-L9Zqkw$@WBm+rw~)_u@x~CnRKp!99g%^{R1~ zEV`m)fT=6W9U0^w3^XK7KUbSp(y#2S?yVXat=embib-FG`-I4Ft(GbUe6Qp03Ek=6 z5GC;XYAbc4v`cem90F$uvXVqjtiE6b*Oax zDYXQK=J{c{w7pE@Vf0g+>vk0~d*NfZ6#?d2V;A z&vu<2S_@O;jSpFS4MP1U(CqK;ZfBNTNQ}!J+C*hvIwk$)2--=@s*ZqWw=~}l>ac5i zo~16Cc?N^6+$_<`_wn4^+Q}p;jun-+rp8~C0ox;>tZNU3mwpKGE}^bm>Du<6sp>B4 z3u(8uY>#g)A8d*Xy0IMO^&F0C)ATrRY~-}FxV^bH*OHl~TbU8&4lq7eb@K^6#P>bx zzuH=C@f2SwO!V&(Uw9n&Iqvk$M%sN>MUER=m%ngkf+_22(0Udh_{4KuK6*Co2mP)DGYp`hFjVmbN}9Zxwic*y)XT7y4UB1mf|S zWB1XsY&kzLCy+&WpNbpAkK)OWfvRb8vA9TQzE+i;5;nb)05 zT<|@t_CNp7^tFm#54K^pL2(>KL{~;g#Bh`MREU=a&rSh7&1fc_;&@EgI?b|+R&eWS zr#@v;akf43$cXAWEO2qg53U`zhkPBWTu))+o7j9=Y?~g|=Ixpn;0QOaMuvY40eS9FSL1u3n{?LmK+-Sh)UG2Ee~CiVskqZuaBRV-u>$O#3+^QrkHT;PS=r+`K?T_J)kBGOXYJ-c~v<|!=T zjw`m@!#R{m$pB=YGtgCU1huxj$5gnM-YD5hq6wCDK*uVw6;RuV0J4xea4TRwkQ)m7b+2|31aI?`Fit29?Ha}Jv#ODlQn8z^qWkuhm7oj_G2n#%Fsv#HOi!>Ij= z%U738jV%BDFy&;bO6!+Z9ws9xwgP_(w1@;mKDbn|18?PZD&F~8-Q z4amShDLkBHfl~B~awSB|`+VA2n$AcjTS%8HG$Gz3R_p{y4&&*LmD1_6!FH?tpZ0mC zAPw?vIgf%8F|?0%VscN?xoiIb7WkUhG;L1O(QVO$A)}uxtoaPvBZ-M8fTWHGy;ep26>Eagl^S0gKNEmG#Ffu~9VtTFs$9m>!>gMvYS{+H$ygg-c6{Ww}ms4;Un~TQW zirL)ml1fO<2m>EV<6)NC<5#`YOj<;ds1FQ_F}rCIkIbPk3buL;-8roZyjiVC_RpwA zV|sqkEyCk4O(mtiGBF&3K2STIh$?f^x|^R7Y5JAFo1jUiPK@on%&fBo96O>$tgdnQ z0g(r(t(&t=97%I6&o%KK#n;0t)G=vS>2Y+PYi zUs-E9{kD@DYC7Y`9I$dV^YXc*9+=wM%O+59$`ts3Okp=36^R z2*G29X>J&nKkSoRek9h?#^%#i@V)7_xVo{4HGuXk&eAB~wGWqqRGd4i_V3$zwH3AM zRTw^9N9oYt>2`LJ+S{aRP#B;~Yi9c}7*2N*S(uEImCkXBzj%C68ksGnwpUpo4zuaW zAe9LqhE-)DM_i0x*9!O%k^DQJXHq|U;d=gM&f;#$fOXGL(z1E#) zExo0+n@4c7-R2o?ZX$?{q(Wg}8)?r`fN*jEtzQaho+H#?xwV!FRRc)qM#Tz^%rUO? zL%p&IIKqr^Sw189bK<##u zB>8W7<5*&m+Y~dc;ib8kc%h)ugpf)0QCU#T&Ibz z^%n7%@ci-3smFU{F5%VM8&*l-+^dX956BQ5rX_9|5^{O0?~Hmihl6}0Wo@EeTC7)- zTcz#2yfHgN6RQv-`2jLW4qs{PG18VDC89Q~UR;f{$R+qz`t9^@u4)$Eb=tMe`=Ggd zouPpL09WPx#>fgmI3VYxcfJ$wXTk3Xc#+~ur?{FGi)+sW+x*}OkPJiyRPn(h^{+(m z7L}yw>uusFtt5hJPzzbE%lyumEH{DyDl&GFj{F+kPY(D8T(`LKBzl#l*OPSjR`#Sx zDCx&>AN)+`WVu!nzs`{=2RqlMbAgU})BG6%+iBWPT z@i)q>s&>MP2h6C%agLSe)WNwst&zPvSF?Wl^ggV;yzu4Zq8Q+Y0TK{dk~tXjwMI&= zGm=~rT(6J3OX2M&MmD;g{i|9}8;>IGHoz)bl=ZCyLz9(I9ww-ZrFtw4)2^^$+rC2Ts z{{RWWCpphy=wa~iRUs&x5w9*uMn}WbUbruABykL%yDR1pyFCcW759(9jTx;z80khd z23vzH?i66LW-7To_*(d49X>5rP_xtamy&s-goPjT(SZEx^+!R`AH%TP=}_?noI)(0 z;==9e>0EqAH5zb&>d&Czntat|Q?j?-akJ^yjWP3hA9N1mJoEIfhfMIimzL`BNJ}d= z6!jo-K=d`SdE~X>Xxqt9K_HFXpIYlQeOe@vJ5w3X>?Z(Zk?r)aj+~z{_Hc^odZ)tg z2Tv^ait17@LX(c3hPy9_9u*!j*HcW1EvNp>GDp7R0VkGKK^SZ?Qd^OMjybPV_*ZDM z+eYZ4aa{7a_pclH-Qqic1M0UDUfiAYnT!_kn2giNztuPnAjV*=h$zA&Vm@sqUi%XSs?H^jf%E5g1L zu!74$y|cO0uC5VPo>gU$N#!>}vXOz4ouPe5ug>2E_~tJHUES+Cb@UeZah{;{*d#J{IbpDZJA3oddv@2IcJb zwy8YcTE+7px{i6Zm_=_b=f802m~;@H}vCv$LAo=60JW0o`%CgOEOKbJDtF7NVC^o>ebZ z&iWr}Xc|X}{v2wrs~dSQ?DYU1;wM;>F2^N8v#?C}B>gj7uf|Un>Rua*{u7y_Nv*D8 zCS8*QByzXQ6krdTz&%OZfzTSI@Q+qld@E)4`&j1JukBRa&2w<~GDy-Bw8;}bMotHLE*jifEzT72llcnA|ap;osCAr#S+sX)JJ|q7Cp8ALV@ZbDy zy>3hEbB?2?(t0q7gToQW$T_uI~r>N@FLek1@t)o;HtCWf+Z{UxG z$02Ng!)C-_B3%y z^A=GmjPk7-%NFiW0glxJB#P;x(~mL|_h!>)C8%lolo#5TruwCxsUMP!VHT?-cD_ou z`O%kjpzj|txmdz+MoDZ|Ny4dp45 zpg9DQOPcVN%-ngTtjuXH?lk3S?qjgDyMTyus>Uasyph5t(}GtcIXws?HAhg@Z}h1n zy}F-Fvec$VxrTowS}5ZKK4#!csOys7L0KL-w1-X9S6$H;RCXI=yts}#d6kkiB!DDl z+niwSP-^5_#pb1=*=yRSsU^LtELHVV_P*OTAtx?jsj6!xO7KWx;S4s74>ca8Ir)*l%b9rfhdkiElZmk7@WLG)eH=Tgl#xgk-npX1K z3E`T~E2DJ6RW|oeY|f(_OR~bwQAo=C*z_Ii&yDYoKGd3=dMvtB7VILoxwzC|k!Nh2 z{_<2MoPvH{yGAivRBFmZ)6rPDp?Hqx$6g?_)9p2lLi#(2SIcv23^T_fgS&b1fZNvgS8O*Zo1NwC)Cl6Q~^8c(zqjX}YcoFG%k+L>&6W{m>-$G1AXk=$vBmeNDM z=ILgQqw5K?IyHnmcfqrVT}o6^AY9}g#5Tu z*bXX`qpqV|$sEPruW4a;x{_RKH~5L*WxE%bF-#Ydp~51e&-Ykhb*$}H<57cCOzpzvR(>*ZoMxk* z9U9zP*+CJO>0Ls@aKRI{dF12MxyNeSoZ}U1T*9Pe-PJWe<`STpyGlTvvCeU-&P@@oEuTX-jyL z+05#0U}Z_&TWcz#Iy5BpUW`|BaOcTw8ATq)tFPbs&@wBQA9oq4OmK1!C}=2)3?Qf~G>fA~4^ z2gNaXzTZWkRJgmfzAff0%X!RNPrWD12;5kc^6km%Uu#9;jb0rRH@DLxODX)#@_B6> z!c=xea8Z;U!9gP+bBuSdkUk3d9_wB49lpCZ=pnXYv;_|GxyAzV)REi~-1M)uwc9Cf zETgj27Dcv*tD^+BiZ_!ZKQiniVf)y|Ppw`iFjYO$@ROghJoCWc5VhS$#}DBxe@iyc zHfi@R?q%RSnQq#X(bia@1X0AmE>7_Otm8hxepyg3?ns~i!^ zB5T`8W@tepcnU`J!CW2A7m`kEqCB=u5jQSNNP|uBj*)xex$hu&?R2}S<+YpT8&Q-T z;Z!pui-U*G2TY3jV%J3YSN(^t-AZOli+i_SJ$%KIU`k;yRsR6K2qi(sJB@v5;5#;E zL#ydJVAHQ6EE3)pf)|MLLquJobR(e0UU{z*_?h4hFT;&vd8gRgTKI2IGThucEK4f0 z4T`L|4x4{yeFi!wzBdM zCs4J!l@Uif!M8Dm8-_9iU{szg@SlxzTU!lN#d5)Pm&mIf#Bwy-i-5p0l^lRT#!e3c zoT%MhvjtV9WRI)19Y@g?QLXt&X;i+xVzytrFG50=+c-iVx>Mj4RcU^w|f+s7FI`&Za{5A5Ob7sZ-wgpgj3BIrD#7nVS_$PPdw zm1ZNKmpHDESomhX7x2CInJtvI$)%BbeRB)OhWaE2?z6sMYJx&=N2M$xROP+Os^vd> zmdEEWfqXM}d*dwzLbnhx)NR{yLPSi8*=(`?FG1Iw*XkAeJt7CB z{9N#qQ$um3SluMH()o&$Ost>-^6erqw44m{fzrPB_*1Xhd`s}u9wD=dRLV-r2>G@; z92L(WhqZYb{{TGHXC-8hrQwRoE^u#GV>TFAjHqk;E5!pFRo$OVe>8))b; z&3z^CZG01dqy3{;*1$=18K8k4C{ReVM9ewE{`Zu~z6&x|-XOUm58fT3(j}d4yTiQts zP|pnBRn3qxGBSPDkrX-DPeuoC(!VA3zYcib&%_tAYLJ~T&z@Ohd2HlR##bbVlV}WB z9tLs;t$I0R?1xsjs-$pE{M3X-ZijO5qX z-U`>?_>*X7)b4a|2}vs(yNej?r+Ew|cqt>yV-hzj!ekyZU4^HH62sw|rk2v1r?ymG zu@+Q$1{zWT$VEK~@81>kzk)R{7koDHoE{zVRI*K?UrDm!S4Y__1QC>F0Of~H!naa& zB;_85Bq{qVDQwTA{tjsRPMzYL?N3*{SyBrK?QI>QcvfFAj|%b+FMcqjWVcLpuT#`z z)n}IC=S;S@`zyZE@<>u=*nU`u5(1-+PTbcy@as^}UMa0%)FZxYnAloDE!?uqsR`N% ziHHXUd0@HpHQQQQOLw;3=IBp9ISz+nPk>OXSl-=J`(Wln`0I@C3fuWH0aVU+=#403a zD}dX`1QX5}9Ok_42Yo0=BAlRkGUi!}%af81&PzDs1oR#H*RE;WewBG@Bc9r3IbGld zV-E3=x!C8E_dp$b;&nq>+ zAbtIdAUMza1m?a~H7K6NE2nf^wD7*OrD_-2xzuhod&`KHG-hKWL=m@b7$lGn9GcgP zeOVAJ`i0~VBcZsr^Cc0?I)!v#!ITl{SytMnw#9hNh_Jb}-yfFQB<((6 z1ZSM}rs@_tmE>tX?Y+&ty_6CKxH3c{ok7pe<(TeLe~S!yS9LpblR0WtxEG!y)Zb6l zS(i_VB}Pc(DqccP)$RVQ{NIqO+C9Fx;rqMij94TWB^KabUB)Am%LHVPB(?xN^VEA+ zDXZA(I)(C$M)y1rNHm~ae|Y-C)HydQeZ@ehKu{{Remn#QTEc&d4=V)NsU zTZohG5i*eKj<&212L%oZ&PO7-xxLnqLsoiqwv((|+P1rGZ)JOIvbQUHhzJZ6g(+)> z`MBU3&GAj=iR4)Hesz_hc(+N_d>M71=+WLh zpK4iCNm%4EBsU#CX#$2o!za@<+iBh$)nP=r)MRZY>f+u=-EOz<9fr+=A+hh*r93-M zlQxrTOH(6H@b0lKqNruHw6k9^;z^h+b2A2PfI{SRv^GY07_8qL+r9q)i009>?M?|T z?xL`nWNksMkt4g3HM&QL$NsQ0l}=9M&H$JM^&l2@ApPIs zINhGLY8@KDNcR)VZzNJ~XOx_%Ju~wSz!A{?RmmHvGL&@Dn6C%Ln{NL^*SsyRX}30hHM{#QrL>5WLwhl_7mRY>xKr#Sfa+cPqaH}&alG|CEc2850&rUN}HBSrp!V6z2_r=9-%+(LiQ~PnAT20fflJkl>6lKZSRrP4PvX zj}&?p^tR6oBGUQp&L)Q^c|K_Y3X#AaLCtY0&NI;+62qqx$YMGS}u$WxDcx1#vg!aY*XY4sg5OjK-1r>Z>n5~PH) zNI>}sYybl|3OZI*B>9w)%Lg4}(E6j{{*k75M$QRdB$vriv(20;g&+)-!l5VIn&T~R zyg75@`K;sB@2=Y232Os(T@eHBNOl%vi3taLo=Oa0_Ta2OJ_e3+Z7dq3ONimNw6_TB zF*`$+%%xT#oyEA$Iqh8Uj&*C@8s2SxO4N;oq;M)tYKi5~b33+K*_lRJLBIrH_NPvi z<0j^I)WktkN*xbf@zkCc(qWF%OVVMBP`s5b((_D)DU#I8H)WfsR9uD6LyjuF!+2v{ zvDJJ(V>GW3k<8NqVv()Ya`-ziT(LWW&rU}*^X13w1hQMgiv`WKrLM@#7jlVYn~$56 zRRbrSfstN?rTEGGaiXV+wCkJ853;iemKQ!~48wYp@`o;??_iQZuBdyuwqZJvnzA%} z8{=isd^0`lmJ(mKhi=xem|4-T3|K^qap7H8mTm?|YWc^)Ul_hH_=-{By(&FBSBYNW z!kW4)(Wq4}cQm9UvH(J7t9qLHF3;h9k$a$BXt!^A(OX~}k3JuGhVtV=TT8nuYmi`bbs1z1p@D6zydc11(>2*jbh#Vqa@JLJPh-wJ zA>of7-)lc^gHHv_<=Zx)VMZ)+IE|J(oP&ip9jm4IyKCcX3*8@2@pN{^d%Ja((%RnR zbWD8DFD^o% zd{^-r+gG@RO&#{3=QJ+B1rEi5Vg@h{3jjIAIP*=lHDqHY6qhT#&%HDVuVMIfH#vdQ z1x=Qh46(+)-e9U3v!9rOki1uyPvAxPjjl955oFS)(rs;}p5ALmmI(al(|e(J-JP+6 zjpS}VoL2|&TJOep9zW5vJx+MwDI74O*+$8>DR8CRbZPTA0P&IDy))u;J|=&LU)i1u zxG;GRkTspOWnM^?2$V=jA((~Tob&kC6(~wG<%`_wooLEBtr79Z#;=6l1Mr@sV;6>R zEU%%|RzmPYAeu{c1O-#EyX2A9zJUFid>i5)hpQ{!xsOfMh?H8-8$|FG&L3-bWgLtH z(~9GM5opO8YB$>5oYLL6S5RUNAXGUeRFAxI^5Y!WA+CH+@kF%f*~iSAxCgEePfGJ>WOIUC z(nq~hi781tMW3Kw9zHpIE%9!U;`!jz?BUFIc2fC@vPqnmafKn2fJZ!6=8gT;v=_f_ zg59mtpCn`FQP}kAM{`$npAN~W_@c)}WEV0tuN#GLlr%@>89WtkNh6F7de_48Csiw0`SRPqej@QV zgY0}mu4?vh?n!P{wJmNF7_>~PMIERuAe0=ExC4<+iZ2P>_)5$^yJMn%X2{UY@-@tj zcO=YNS%CQi05%{1WDb?)-X!q*Xu8C@Tbnq*ljr*^>o`RRlwySJKE&i#(q0d=_)cfi zw8^ft=v5F&cO%D}Z?wf2@*R;MFDq^#%j0PT<2=_-J(6b~uB>ri2JSTbpBy9FT*#kc zG8p4%pKZ$QK7f@3WsXO0diLKH{6O%QpFG|Pj@IW!nt9^;ZN;oeq$f-yg;{eTBOSme zBbvwfYo*!S{7QJd8>?B{+{Je)EycVhYded1hSMB7j^M*2{KFpoGxlxQfa8zD(Ocg{ zmvLAF<;vFa7mT^XNbEzhwh1{WRMsa(Rgwz9;^ zB!y*YWL)y7nA)SD3!L*`o_`!>@rQuCYd(W>smH2WN~2J!QHFU`C+`4U=_Rf`d8N4zN>E5k+fF&blRFEjI-X`w2LZ%z{1F(8yM##aqnL;{1W(i zsA#vQ%S?|?onrH)Kp=lV?5aj2xO2F9kDenc4^6|ZeGh4&$88ft$gKpPWU{jsSMy!7 zh1e7TeEel`pxt<%ltE*VAq)5XHTQd|}Fk2usqgJv@RXFbFma9BdzbBPZJz91g?G8Tn;|Yga(Cy1 z#DVw&raPR~>-Unz1=O_%x3`9KBt#jaxFDe;%3@T5{?-Rt;+azM;xW%HoCV720Lsy; zTkXzx40{c`N}Tr`)uX67J-7Y#)%J&o zJPYuvShzPrS-&;J0zu=sQT06ee%0PpM9&{D_J++Ck#^}foSav*vSC-FMxv^Pwy9*15F9(|s+7d_kW5aN}(~*u%VgCSQ_*YYQOT97w0Jb7i zBFwhQ8r}utVR!iwLHs0~A7faz+6w48mA1cSZ#|+pFh!gh8H+0R}bvvyJN&eHPx0oaIm6ZtdQ?@cm$?Z!AiQC57Ojeqmozs>9IV50XrAIf2w9?Yb_jWTF8*6zErP-Gp7Fh}tk4$^i{t<)2x9N4LY4)+CH*V8T z$|Q)hMV?%VOECnTWwFj{hoiC4O$n^tYwM}Ur0LpotP2qT07;4w3~Ge`0IDFO$iS~G z#PUyWD#QZ&PjhuVvm&}?D`s%<$Bya%4p%)gPu8sHULx73&u^`1`mN%~0E%cVr)zjr z6S6($dpFl4d)AJpt6N*#e`(r8tg)%{A(Aum0mc9%XCGR+E-DsGn)goa982nYrNz~j zm7zZANf!546F_a!7|9PQ^D=i9Jr}v)@m-r(X_F<-+U{QZNLOk!C(7JcsPaMwLdW=Mp(kNJcQ*DcDsLGC!-$f)+D--5SW4A!Zrq*)pxQ;pG`&W_cQEC1-@lF1h zsNUVhtBYuU&2Jk=Izp_>3ravgf1ulg$2Ig`x8n^Se+^kfcc)s!42v+H;Ffh{0hH~? zIL{@CJoc_n!v6r-I+e>`=}}n2d34R@+(jNzP^PKUX-RniCEsSEhr)RN;@NZ1< zKZUPuyc%?ERtsC{{?awHF-v0{5Fzs%f~B_*HmYz-5zkumPZ?V37kXGv56Eop#0xFW z#P({l7w2&S*eL~g+v+ouTOJ(N(?qiSdN}PsE>zKM^f2G(Q69{zr$` zYF?xh<*ooEs?WR+Fc0p66n0Ts+TVwKL#ZG5O8z39Ic1rGq&Cruc_j>UpOH~n$>3mQ zj&ol?_%FaZMvn724-7?*h+dzB8u05^PdiuLHqoN0UC70(W$t2b!r6U)9B z_`}9p`v@*bn@lDo?k9YgplnbFu*AUaBws9=Dwhq+22bA%UsPoj~-#Q{?(S; zV;?krP-3Pv$pm1GRCZn#gGjTymK{zQ(c&_&e=N%?kvys61Kwt6(7D8VUec2itiOAK0F=9ZDdu#vHEr^lAK z^4W13kCcuvk(%XW&~(oh>NhgZ%VP{vMhB3BYowUx=LNu71`bX~2d!*KmYTi1aNSs4 zUfHvijb^xLl*rxD7Yxgh(107#xAd8;bj;aFZ7-PdF(l;@HEuJzIWEV6#(2$3sVLbd zY3!7rypI;~e}yz_%^piz$Pwqd)UIT>c8)NGB66`f;FyLocB%QBk}H<*?}Yq27J&0; z?DH15c;$2fgu!xxMQmV30N}A0&rH{`T`kt5sZVOQ&`YQJ20<(`B=SRyXU>f6b=prX zHv&k;d9OPcI#-7E7_6tbxVehynC_Ms;?8&=qjE7>&96~UrMVKV6d0A$mziLo~qaio4gCvtx6*gnZHN|FdY@y2<} z?}-jbx_ykL2P2*pDaF|md|3F;@pj+EGkATq zI4pFt5`@#>+T}>#VVO53f4UDG^HS*kHt?s3Z0x4-)~Dgy4ioO)N$`qzVWZyNX-;@#C z&@OaMGJQm2?O)seQA}hM^1vaZD!jK+dy43%R+OO|D>Ew4sn73gbDr?e!k+G~m)^tmsAL#mw`uNq3SeU~_JPGD5 z(JM(Cd5GNSC+_yGUx@a;FwneVqFcqRYH;Y+7Yn)rBu{4Ks;<~bQz6~XcNXe#it|r_ zo*wabm#^JLq}s`GJ*J8um5rs~f~)b-6b>|)~H;jN{B z`K~|JGKP%pQT$`L=xgR#+T!+Eu4I*`mPRh}%G;h+W0K^a=dF8p#vKkl7sofcUx};* zo~nm3{gL;>CP&^v%aX112R&;G!M+vIH5;u$Tegx7CeF%xnHok0L*=K+tM`8MkO1rT zu8LIs)N#s9$)Ya^K9dr#k?&cUR;#(N4_LCWMUCHVj9-Zse zwQq$m!|?KdA9!C`g4X8SbQe~>ODoOVL`e%c$PNb5iVs}UaY{-_nnAZ7TOL#3ZwYC7 zh1QvSsA^g??9Vd2oRiM-h|vo(x_ki^cCM`=z)3oagYkf}I=goVW=9P`aY%wBAr{ySk;11a4zf62H zXLYOxxx2X$UYOQM-oo5X3q<28M3?~Q(}JgrSC5)IzEpdeR93FXoZkE`@Ll!&&Be0Y z*;u+1C+wER<#sA%B#6h$v=k5bfh2=oQ0w7u4C&I^E#mlRN`p|GK{WRE&jj+h$~I>q z%A%+Qs6TiElf`>?igX=+#8$VORhF}Kmodm~=47)-hfg5azZ%tfRqOLHqMjkYj5^NjS(dU$?mQjaq@^A1=`-HG?cmv`aKQ{tb8 zu5{ZQnC6ziNb@TFjf9%7i0v-GxGH6`yjk5wa06ol1oaumy?c*^ygjGuI?su< zpAuMUUL}?plG-@qxCP)0uZ~?=Oh`(p^2s?Q4C1iG(~Fvu=xcz)$~4>()w8(qKZyJn z9;>GKl{M*2{-bjxs}_{WXpjj10CYqn&?%Hw0ln)Tzo>g*R(rps7`Dl zyt{b!2SOThR5z4HPRs-ASHIz1>7E4Cp}oCl)LT(lB!)??)=1&GWFhUsmH9%PY&bav zy!3d2>f7Uc>JnN)mvhG*r;{WIs0fW$D;~yFEEEnGHQATPNpe1h7@6I#Xu6+4=+ncZ z=~~9UqxgeFiVOQ&X#!l#&W1=8vK8A7l^JAHgjm)s zs_G9tMC~1G^H$?{YD_w?R}sB1qQL>Gt}BvcK<4ak3(n zjfgk}uoN)_@qjCy@YjVF@++J6*X5b5*wj}Io1aVEiXk~EUY>JyBy z3nC7z+zp^&yDt)0_+sxxj%!ydsa`djN3eAWMbeT^AUoK_Z2sv z;=lRnt^WYuyMO*aNmgiU3m(V+)b=T5*X%Abxl2!yLw=-a#K~j30 z8tJUy)UIqH(;(7yGi(aHGRYK=76*9|PP$H|gu z5@F^9%T9*c#o}dGiJ1gySPW&IzH$IKUZ7^K9_>9lkzVM%64>dZ zP>OBKCFGBDH=QePl15x861+@fPypH#5?J*Dxnbe&9O~sx770Aq#DPI#|P)jr!}qiOSM7nYbycS$9hBPdi}12UvU1^|P#j!#;n;Qb!z)5Bu( zNV{EH&f@9Jb4aZKi+TS5RUB#w!6Sfuc*SptY16v3&U`z3)++0E`lJ>ySZicG;Dtk7 z#wCu~mNmleAG~JWfxC{q1!UWJZ(6<4;JMSSid~pK({rgC=fsx^08c71sK|PNK*lR*K9^%(oNUMfUvI&$Drr{&MT&b;*;!o)gvbu*yp@Tb?I&HH2o=_%JR_W zJInZHnim9o&j~=ufKG5ouRrjYaY{w*U{zSQp{w_?tXZf#?^R&o`Q7%vV_$XEl8 zPZjUlgj%$kI%&%=0WE}6HMCb2{%QfWoU@Q}dX@v}T*kL;q+Q1qmZvS$n&UihTEL3) zNiNZpAJ5IIlU>PU^>?pzj}e*Vg<}-W{=@R@Ned&c@y~k>P1st{J%46U&T_ zdJ-Fsxvw|y_r|*`j}SJL+I+^^`bB#=?j>Y&iNH7^lQIBHZGGH<>t1K^n^@K~>nJ=k zduJt(xkDsvAn z4aUAC(%|qKc*@&P){@oq#G7oBE<|r83G)2Rju`#oJ5*ue7Z=Xo$mYjgRY@Mv@gv7R z8`Q;*hODl1=CZw5&D4`!1PLB@1rDW~*93w;8u~-P9ux4Dyhl#cEq7aMmg3$YDk&Fp z1p&zAu=vw? zE{ha8O`X)QrG$xOc$ODQ8A$nlY>-BIJx5VlQ>pH_(%9Of<(=yuyYVOEM}Yhn1YQL2 z?v`K)I2%k%j>;IS@8y$;menp`5~+kmtr0W0RUHG zGo0jC8{vtqJX`S&EnCFHPqc-1$j49~d_)9b3xwa6{^$emVD_s1H-_WDx`mI4ej7$5 zwvyv)2Ikq>eAZF{5y}yYu*d|i4SHB#-$kgqGm3M66WH{P7suWO_CW@iFS;tkVqfTHT3S4`!;xTUk@ei z_lY%`?`}wtd0Kf9+@hWpN~CUY8x-s*rBDp5Ua|cFKZ6~a_8Y!&isy8n24DDtUDfsf z0E=23%t+8DkeYnL&KT8BcO&j_eo>5M^(ML{SvMBeh7OdIX+1}L5b^e}rVVD}QoR~v z;xe$b*Br>>q(GHzpyvSNj@9fsFT}qYYTg^V@twW3-KLckO(&Sw(lka*%(6K0*fxG% z0|g&S@y`~2!aJ(?<44dmXw9aJrle-!Ey~?6Wn6(Qk%inr;fW`p_pfyE4vXRWyc>OE zr)motUc)3Vu-cGJlPM-bBgw)O$j4AkI=;?w*yzKmij0-?N5!5u@zv*z_33r{uQExt zi1$2<R*;(4?_p;wwk1{<-yA6%V*ub1HY!SyN9V^A!#%~Gg zqH`oVirHMQBvIzu$nlWs3c8KTNcohHQCH&Dr)^r}#Vd$zWtryLZlXBD$afH^K2=@E z?u-H2x~bhl$nw+ouFqb5BgLmyo5ec!&Mwa8xtQ+rCU1NXP6wc`LGfOvs>|^D(@WCx zac^-u`TjzKi=zg-Z_z8Qg5svlxKOe-M4#w+F)9>x4(%V#mH@5R*Xl>2JpLs~z zfsVd}cdyPXIc~g1szIk)Y17MY&mgygYo=v`es=P>cX7eU3Jy8+uCra%Ep(~QfvfmR z6}_~QGb2x_-EZ>tWY?4(rQfy9?_;07$%cS^fd#zIU z4-AiH1S<@!!?aS%84vStNFR-Se+H4_Xf7=Ee-guOC7+09SfG2`sHF24uw@bg#guf( zU;rM~#m{?VV(WDjFg?<xH1?Z2|%nmck|%81IS8Hfzr z6SOu4PaP}Kl?cH`FgYt?tvX4hlBMLZLnb>^|g za>hwBY%epri`eKizldHN_@fj$Rqc+arAAgMr8z@PsRI%3JbkuetU9k@klX~amVHg{G5J<_Zw;vVS*I%-^x)V*NSUb#Z?Bz(Ol1US3 zM{=!{^;5^?UMukzT)6RXhz_kit5}(#LbmcY=UCW$gq$wmz;JO(4+%n7zLpj$yk!ku zx7_;f!}fvjKZ*P*b$bMdO4fAsSsm`2MlN4&3|}$c_|5_94slpEJ~Xx0EYni)Ux=;k zrdXK^EYr;JDfxn@?&QWg4!-sA-QR^Z+Yb&87Q}({vp?C(#&Tnvg1|7x0OQ}9lE=lm z_K+dB((f)U#n6mT4$a9i2O(G$B!4qbo*Ej>GN+B4l2S+9J`L61#LK45dv^C0mKL(K zhhwNEUjj*HbwuP5j^`(e_5C&tHVMV{ool3_yK?hgN{=U)0N?_LIRk;74SebF^H%Zo z%V}Da*XHuh>&*{r$76yV?#i=al=KGxcFlXLc%7}Unj7mOY@TPzZJ*9mOpI@2MO?2_ zj@7}8U%Xa5JOq@W?r|RywC!%oRnp36$*QU|%@S$I@ktqAGX7l0W3UVtJBQ8b)MLlv z$JF#y*=KpB#SwVqmi6t_mPXj?EKtuT(ueqn+I@Jbek*8ee71VU&ZB2-4U;h2GEAc7 zSQ0bkGe2A&I#(y~(?am{Ru>w?;>gD&&4;jpL`FRNTA_LD<>x+D!MBFPzX{3)D{JCR*9BF_1y({481vPMP3L`KntVT?Kx(YYAG z2Dtqq{?qJ{BuS?%v7OPat zX-nR==d7g_70h<_ma#=?3PLTkg+NtNOB0Onr*9k%YR8rT08xlP@+En7zr=YXj0mr7 zWS{upiWhMbo>wJ{636H&$NVhKNB(+4{{Vo;{{V@r_DiUhSldJY)%Od{YTDH$ztyy< zV`U7<1QEq?C{n-z93~%VR0oP zIbe@WS9S%hH62b?xr~#N582lNNayAOdSq3v6I$I^z?PmKk~l@R$1u*av_Ks0+qPkh zKIGRB-#X7UKoYtv5tWC@5O06JvmdKHt6%}V(P-AQa;J?Vbv}rU0Xp}G~Xlr7FM_k z7?82b4YD(W#I_S+oBvKs~F3 z_pp1oyfv{Yopb`*Stky`ivJIQ_RssuQIH5^OKNT5*u+R zy5QHFX%>1{g@xX;Y}3tsZ8JU0@)E~>aElNwc;hTsXUI?wKLe^-FDGAk*NMBJd%*`#r?V z3vOm|88%1822adM;0ojXJ3gT{mkzyV73`WP^=gUm;tIs$C zG^x_%jHPla)lJ4WK8DjZ+nr}dwA6e_sL!S|%*ze55;0-48o+pp{%g!6GPfuFa)3m#p8W<+H3MPrCR8?kJqfvqtx2tYp!R%@_ z@OSopyK?usq?6gp0^Eoe*#L~G7)8U3sL1=olg)5D-$S|_uGdGy9}{gXbYB(Q>X$k- zf?B9i{hF^ih0I^`*;#`IaCzAHCcWqOeTg*-n~xfvN`RJ|)x+m!`^6HAbH9D-O9Mnh)3EJEhOtL|~rk0vW^8TEF%qTG1KSTCWzkZIOMkC%6A1;EQ5 zODwWrl0X<9p7rx>-^1&B4~fufIyLpis2WpysFP`HZ*L1RAgnROO0T-@810((9X>N} zX?b9E8>trdc=rD07{pRGNH|fJ0Q-#f>s(%);OjjTUz=BoX{2%ICdr&mGa&_=b0{R_ zank_exGA?7OH%Ps=A3lucb+!!uY>*_=r{0d7t&uX)1wVNXN~3`b{8m-KbS_O59Bxh#93%TDpUB5yro%kE#I3n?WmTjz3Wu9q-kz6i&4Zjbr)<}D0;+LwdK}Y>YUt1L zPsUFS+Ue3-Xr?>Z?brw{hwh4(C+5l%xyU@6a(dNW7sTHcd_knaX`$(2#&@BEm0`A#ri{9Lz~)sQ`)$Q(U;fb^ zJ=UyVXfDN?l8EUXF#tk>7Z_2DWc0>sDwO#l%DS;eqI0`{arGyKye$TS3|gM41Yg=J zNs{96q4OeV$YQ0N3%nD^9XPIY$G;qP2yd=DF{8u%p>h~mvt0RBq#v%!xlXD zuN?4Khj0EQSWTeWgO3{Ea6Lu08A6f18F%Pp0)JP!Jh>9cKYJt=6xd0^|alpVY)72 zm1HWrk5jyJgIJgycv1oZ#pKohRb+o`&G@t#3e=Ss!u1=AXmEo z0K%F0c^nt8{f)H+iF_v{kExd65Pow zt06K!n(~0#N!y%|IskE;abCsohvGDvwfw#in@)&Z*i0o!ceebF0Ry1UPDdiXcf0W} zzoF{$%i+1>v{sM?MvNR_e8o>t$FZ+N4&^9mx#!{|1yRO39j>wA8MTjyQh0vW$!%n~ zzrtBSNJU0HIV?sLWUfvQdkXe#bKqzEBDQz;+7IJuHM z1u8)}a0ocZ=TP|PL(w!i^m#?ThYgml8+5lXaVy$+Ob5=3CeU0QovK0gt&bU7h&4Sn z`u_k|zP*~^%$5-~yb;9?!W(Oq!C)ASWmw}m_v$=H1N>9)dqd*2j#;#~o@KefX;*K| z!3Ybq5HYvz`%=YT@l5Nb1@GB>kCW~EAvM>E=eF>K(dstF=WV+Igp?jm6!HM{$-u8? z_~+sKOPK7hbj>_i-Dx&y72M5)ieLc!+CM_!zUp7OaK1_O3*Sxy%i&3uXB{dVt0)J5I15LB-09-)s+SLj!Quk1b} z=wD^l)upky2F^$&h)IUvmqHyv6VRL!k4ooJl{%i%{^;Pqcij}XDjry(McmFrnOtzJMtWD$dX|%SuRwI<ILV9c8q-j!A7XB6V2| z7%dZj5|w2n4lBZZJMfOq+s8V_y?K1LmhfLJu<5#WuayLe7$}PFB|?M_>ZFrilsrSD zxi!(rRYVaZdR#0z6@Gm?^q9$aqXHckT}1dtW8$O5#) zb2S_GGNQkKBcrgr@ny||YFg#3u7sXr`7lPYv57(2UENm)CxAe~11AEwUllAivq2`K ztXk<7*OCV}w+1+#O}zY!$|(hrDo%c)y5I$1!2 mY-_n#072se9k2#!@BA}_-}D$?`}bXwQ|3HaRF%EmkN??M$7%Zj literal 0 HcmV?d00001 diff --git a/src/test/java/resources/lambdaConfig.json b/src/test/java/resources/lambdaConfig.json new file mode 100644 index 0000000..37a88c4 --- /dev/null +++ b/src/test/java/resources/lambdaConfig.json @@ -0,0 +1,11 @@ +{ + "LambdaFunctionConfigurations": [ + { + "Id": "shipment-picture-lambda-validator", + "LambdaFunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:shipment-picture-lambda-validator", + "Events": [ + "s3:ObjectCreated:*" + ] + } + ] + } diff --git a/src/test/java/resources/shipment.json b/src/test/java/resources/shipment.json new file mode 100644 index 0000000..6740e8d --- /dev/null +++ b/src/test/java/resources/shipment.json @@ -0,0 +1,25 @@ +{ + "shipmentId": "3317ac4f-1f9b-4bab-a974-4aa9876d5547", + "recipient": { + "name": "Harry Potter", + "address": { + "postalCode": "LNDNGB", + "street": "Privet Drive", + "number": "4", + "city": "Little Whinging", + "additionalInfo": "" + } + }, + "sender": { + "name": "Warehouse of Unicorns", + "address": { + "postalCode": "98653", + "street": "47th Street", + "number": "5", + "city": "Townsville", + "additionalInfo": "" + } + }, + "weight": 2.3, + "imageLink": null + } diff --git a/src/test/java/resources/shipmentToUpload.json b/src/test/java/resources/shipmentToUpload.json new file mode 100644 index 0000000..859451f --- /dev/null +++ b/src/test/java/resources/shipmentToUpload.json @@ -0,0 +1,25 @@ +{ + "shipmentId": "a7ba93a2-bc88-463f-a27e-3dbcc8ef436e", + "recipient": { + "name": "Home Sweet Home", + "address": { + "postalCode": "98653", + "street": "47th Street", + "number": "4", + "city": "Springfield", + "additionalInfo": null + } + }, + "sender": { + "name": "Warehouse of Unicorns", + "address": { + "postalCode": "98653", + "street": "47th Street", + "number": "4", + "city": "Townsville", + "additionalInfo": null + } + }, + "weight": 2.3, + "imageLink": null + } From 38631bc84d0879bed1bc335bbd669754903cf683 Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Wed, 23 Apr 2025 17:34:12 +0530 Subject: [PATCH 2/9] get tests to a working stage --- .../ShipmentServiceIntegrationTest.java | 39 +------------------ 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java index 2fa96e5..7d85c3e 100644 --- a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java +++ b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java @@ -109,41 +109,6 @@ void testFileDownloadFromS3() { @Test @Order(3) - void testFileDownloadFromS3FailsOnWrongId() { - - var shipmentId = "3317ac4f-1f9b-4bab-a974-4aa987wrong"; - // build the URL with the id as a path variable - var url = "/api/shipment/" + shipmentId + "/image/download"; - ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + url, - HttpMethod.GET, null, byte[].class); - assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode()); - } - - @Test - @Order(4) - void testGetShipmentFromDynamoDB() throws IOException { - - var url = "/api/shipment"; - // set the request headers - ResponseEntity> responseEntity = restTemplate.exchange(BASE_URL + url, - HttpMethod.GET, null, new ParameterizedTypeReference<>() { - }); - - assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - assertNotNull(responseEntity.getBody()); - - if (responseEntity.getStatusCode().is2xxSuccessful()) { - var json = new File("src/test/java/resources/shipment.json"); - var shipment = objectMapper.readValue(json, Shipment.class); - List shipmentList = responseEntity.getBody(); - var shipmentWithoutLink = shipmentList.get(0); - shipmentWithoutLink.setImageLink(null); - assertEquals(shipment, shipmentWithoutLink); - } - } - - @Test - @Order(5) void testAddShipmentToDynamoDB() throws IOException { var url = "/api/shipment"; @@ -166,7 +131,7 @@ void testAddShipmentToDynamoDB() throws IOException { } @Test - @Order(6) + @Order(4) void testGetTwoShipmentsFromDynamoDB() { var url = "/api/shipment"; @@ -182,7 +147,7 @@ void testGetTwoShipmentsFromDynamoDB() { } @Test - @Order(7) + @Order(5) void testDeleteShipmentFromDynamoDB() { var url = "/api/shipment"; From a969dd4668a3795518f4ebd702709609693f42ad Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Wed, 23 Apr 2025 17:40:44 +0530 Subject: [PATCH 3/9] format the code --- .../ShipmentListDemoApplicationTests.java | 3 +- .../LambdaIntegrationTest.java | 34 +-- .../LocalStackSetupConfigurations.java | 278 +++++++++--------- .../MessageReceiverIntegrationTest.java | 14 +- .../ShipmentServiceIntegrationTest.java | 54 ++-- 5 files changed, 190 insertions(+), 193 deletions(-) diff --git a/src/test/java/dev/ancaghenade/shipmentlistdemo/ShipmentListDemoApplicationTests.java b/src/test/java/dev/ancaghenade/shipmentlistdemo/ShipmentListDemoApplicationTests.java index 63ce740..ed5408b 100644 --- a/src/test/java/dev/ancaghenade/shipmentlistdemo/ShipmentListDemoApplicationTests.java +++ b/src/test/java/dev/ancaghenade/shipmentlistdemo/ShipmentListDemoApplicationTests.java @@ -7,7 +7,6 @@ class ShipmentListDemoApplicationTests { @Test - void contextLoads() { - } + void contextLoads() {} } diff --git a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LambdaIntegrationTest.java b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LambdaIntegrationTest.java index 7a4ca47..69d63bb 100644 --- a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LambdaIntegrationTest.java +++ b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LambdaIntegrationTest.java @@ -30,7 +30,6 @@ import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.NoSuchKeyException; - @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class LambdaIntegrationTest extends LocalStackSetupConfigurations { @@ -86,13 +85,13 @@ public String getFilename() { var headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); // request body with the file resource and headers - MultiValueMap requestBody = new LinkedMultiValueMap<>(); + MultiValueMap < String, Object > requestBody = new LinkedMultiValueMap < > (); requestBody.add("file", resource); - HttpEntity> requestEntity = new HttpEntity<>(requestBody, - headers); + HttpEntity < MultiValueMap < String, Object >> requestEntity = new HttpEntity < > (requestBody, + headers); - ResponseEntity postResponse = restTemplate.exchange(BASE_URL + postUrl, - HttpMethod.POST, requestEntity, String.class); + ResponseEntity < String > postResponse = restTemplate.exchange(BASE_URL + postUrl, + HttpMethod.POST, requestEntity, String.class); assertEquals(HttpStatus.OK, postResponse.getStatusCode()); @@ -104,8 +103,8 @@ public String getFilename() { e.printStackTrace(); } - ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + getUrl, - HttpMethod.GET, null, byte[].class); + ResponseEntity < byte[] > responseEntity = restTemplate.exchange(BASE_URL + getUrl, + HttpMethod.GET, null, byte[].class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); @@ -119,30 +118,29 @@ public String getFilename() { @Order(2) void testFileProcessedInLambdaHasMetadata() { var getItemRequest = GetItemRequest.builder() - .tableName("shipment") - .key(Map.of( - "shipmentId", - AttributeValue.builder().s("3317ac4f-1f9b-4bab-a974-4aa9876d5547").build())).build(); + .tableName("shipment") + .key(Map.of( + "shipmentId", + AttributeValue.builder().s("3317ac4f-1f9b-4bab-a974-4aa9876d5547").build())).build(); var getItemResponse = dynamoDbClient.getItem(getItemRequest); dynamoDbClient.getItem(getItemRequest); GetObjectRequest getObjectRequest = GetObjectRequest.builder() - .bucket(BUCKET_NAME) - .key(getItemResponse.item().get("imageLink").s()) - .build(); + .bucket(BUCKET_NAME) + .key(getItemResponse.item().get("imageLink").s()) + .build(); try { // already processed objects have a metadata field added, not be processed again var s3ObjectResponse = s3Client.getObject(getObjectRequest); assertTrue(s3ObjectResponse.response().metadata().entrySet().stream().anyMatch( - entry -> entry.getKey().equals("exclude-lambda") && entry.getValue().equals("true"))); + entry -> entry.getKey().equals("exclude-lambda") && entry.getValue().equals("true"))); } catch (NoSuchKeyException noSuchKeyException) { noSuchKeyException.printStackTrace(); } dynamoDbClient.close(); s3Client.close(); - } private String applyHash(byte[] data) { @@ -155,7 +153,7 @@ private String applyHash(byte[] data) { // convert the hash bytes to a hexadecimal representation var hexString = new StringBuilder(); - for (byte b : hash) { + for (byte b: hash) { var hex = Integer.toHexString(0xff & b); if (hex.length() == 1) { hexString.append('0'); diff --git a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LocalStackSetupConfigurations.java b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LocalStackSetupConfigurations.java index 581f427..bd30b12 100644 --- a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LocalStackSetupConfigurations.java +++ b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/LocalStackSetupConfigurations.java @@ -68,10 +68,10 @@ public class LocalStackSetupConfigurations { @Container protected static LocalStackContainer localStack = - new LocalStackContainer(DockerImageName.parse("localstack/localstack:latest")) - .withEnv("LOCALSTACK_HOST", "localhost.localstack.cloud") - .withEnv("LAMBDA_RUNTIME_ENVIRONMENT_TIMEOUT", "60") - .withEnv("DEBUG", "1"); + new LocalStackContainer(DockerImageName.parse("localstack/localstack:latest")) + .withEnv("LOCALSTACK_HOST", "localhost.localstack.cloud") + .withEnv("LAMBDA_RUNTIME_ENVIRONMENT_TIMEOUT", "60") + .withEnv("DEBUG", "1"); private static final Logger LOGGER = LoggerFactory.getLogger(LocalStackSetupConfigurations.class); protected static Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(LOGGER); @@ -98,13 +98,13 @@ protected static void setupConfig() { @DynamicPropertySource static void overrideConfigs(DynamicPropertyRegistry registry) { registry.add("aws.s3.endpoint", - () -> localStackEndpoint); + () -> localStackEndpoint); registry.add( - "aws.dynamodb.endpoint", () -> localStackEndpoint); + "aws.dynamodb.endpoint", () -> localStackEndpoint); registry.add( - "aws.sqs.endpoint", () -> localStackEndpoint); + "aws.sqs.endpoint", () -> localStackEndpoint); registry.add( - "aws.sns.endpoint", () -> localStackEndpoint); + "aws.sns.endpoint", () -> localStackEndpoint); registry.add("aws.credentials.secret-key", localStack::getSecretKey); registry.add("aws.credentials.access-key", localStack::getAccessKey); registry.add("aws.region", localStack::getRegion); @@ -113,41 +113,41 @@ static void overrideConfigs(DynamicPropertyRegistry registry) { protected static void createClients() { s3Client = S3Client.builder() - .region(region) - .endpointOverride(localStack.getEndpointOverride(LocalStackContainer.Service.S3)) - .credentialsProvider(StaticCredentialsProvider.create( - AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) - .build(); + .region(region) + .endpointOverride(localStack.getEndpointOverride(LocalStackContainer.Service.S3)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); dynamoDbClient = DynamoDbClient.builder() - .region(region) - .endpointOverride(localStack.getEndpointOverride(Service.DYNAMODB)) - .credentialsProvider(StaticCredentialsProvider.create( - AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) - .build(); + .region(region) + .endpointOverride(localStack.getEndpointOverride(Service.DYNAMODB)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); lambdaClient = LambdaClient.builder() - .region(region) - .endpointOverride(localStack.getEndpointOverride(Service.LAMBDA)) - .credentialsProvider(StaticCredentialsProvider.create( - AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) - .build(); + .region(region) + .endpointOverride(localStack.getEndpointOverride(Service.LAMBDA)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); sqsClient = SqsClient.builder() - .region(region) - .endpointOverride(localStack.getEndpointOverride(Service.SQS)) - .credentialsProvider(StaticCredentialsProvider.create( - AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) - .build(); + .region(region) + .endpointOverride(localStack.getEndpointOverride(Service.SQS)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); snsClient = SnsClient.builder() - .region(region) - .endpointOverride(localStack.getEndpointOverride(Service.SNS)) - .credentialsProvider(StaticCredentialsProvider.create( - AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) - .build(); + .region(region) + .endpointOverride(localStack.getEndpointOverride(Service.SNS)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); iamClient = IamClient.builder() - .region(Region.AWS_GLOBAL) - .endpointOverride(localStack.getEndpointOverride(Service.IAM)) - .credentialsProvider(StaticCredentialsProvider.create( - AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) - .build(); + .region(Region.AWS_GLOBAL) + .endpointOverride(localStack.getEndpointOverride(Service.IAM)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create(localStack.getAccessKey(), localStack.getSecretKey()))) + .build(); } protected static void createIAMRole() { @@ -157,18 +157,18 @@ protected static void createIAMRole() { // call createRole API with request using name and policy iamClient.createRole(CreateRoleRequest.builder() - .roleName(roleName) - .assumeRolePolicyDocument(assumeRolePolicyDocument) - .build()); + .roleName(roleName) + .assumeRolePolicyDocument(assumeRolePolicyDocument) + .build()); var policyArn = "arn:aws:iam::aws:policy/AmazonS3FullAccess"; // attach s3 full access policy to role iamClient.attachRolePolicy( - AttachRolePolicyRequest.builder() - .roleName(roleName) - .policyArn(policyArn) - .build()); + AttachRolePolicyRequest.builder() + .roleName(roleName) + .policyArn(policyArn) + .build()); } @@ -183,9 +183,9 @@ protected static void createSNSSubscription() { // create get queue attributes request var request = GetQueueAttributesRequest.builder() - .queueUrl(getQueueUrl(sqsClient, queueName)) - .attributeNames(QueueAttributeName.QUEUE_ARN) - .build(); + .queueUrl(getQueueUrl(sqsClient, queueName)) + .attributeNames(QueueAttributeName.QUEUE_ARN) + .build(); // call API with the request and get the attributes var response = sqsClient.getQueueAttributes(request); @@ -194,10 +194,10 @@ protected static void createSNSSubscription() { // create the queue subscribe to topic request var subscribeRequest = SubscribeRequest.builder() - .topicArn(topicArn) - .protocol("sqs") - .endpoint(queueArn) - .build(); + .topicArn(topicArn) + .protocol("sqs") + .endpoint(queueArn) + .build(); // call subscribe API with request snsClient.subscribe(subscribeRequest); @@ -209,8 +209,8 @@ protected static void createSQS() { // request to create queue var request = CreateQueueRequest.builder() - .queueName(queueName) - .build(); + .queueName(queueName) + .build(); // call createQueue API with the request sqsClient.createQueue(request); @@ -222,44 +222,44 @@ protected static void createSNS() { // create topic request var request = CreateTopicRequest.builder() - .name(topicName) - .build(); + .name(topicName) + .build(); // call createTopic API with request snsClient.createTopic(request); } protected static void createBucketNotificationConfiguration() - throws IOException, InterruptedException, org.json.JSONException { + throws IOException, InterruptedException, org.json.JSONException { try { // lambda needs to be in state "Active" in order to proceed with adding permissions // this can take 2-3 seconds to reach var result = localStack.execInContainer(formatCommand( - "awslocal lambda get-function --function-name shipment-picture-lambda-validator")); + "awslocal lambda get-function --function-name shipment-picture-lambda-validator")); var obj = new JSONObject(result.getStdout()).getJSONObject("Configuration"); var state = obj.getString("State"); while (!state.equals("Active")) { result = localStack.execInContainer(formatCommand( - "awslocal lambda get-function --function-name shipment-picture-lambda-validator")); + "awslocal lambda get-function --function-name shipment-picture-lambda-validator")); obj = new JSONObject(result.getStdout()).getJSONObject("Configuration"); state = obj.getString("State"); } // create notification configuration var notificationConfiguration = NotificationConfiguration.builder() - .lambdaFunctionConfigurations( - LambdaFunctionConfiguration.builder().id("shipment-picture-lambda-validator") - .lambdaFunctionArn( - "arn:aws:lambda:" + region - + ":000000000000:function:shipment-picture-lambda-validator") - .events(Event.S3_OBJECT_CREATED).build()).build(); + .lambdaFunctionConfigurations( + LambdaFunctionConfiguration.builder().id("shipment-picture-lambda-validator") + .lambdaFunctionArn( + "arn:aws:lambda:" + region + + ":000000000000:function:shipment-picture-lambda-validator") + .events(Event.S3_OBJECT_CREATED).build()).build(); // create the request for trigger var request = PutBucketNotificationConfigurationRequest.builder() - .bucket(BUCKET_NAME) - .notificationConfiguration(notificationConfiguration) - .build(); + .bucket(BUCKET_NAME) + .notificationConfiguration(notificationConfiguration) + .build(); // call the PutBucketNotificationConfiguration API with the request s3Client.putBucketNotificationConfiguration(request); @@ -280,8 +280,8 @@ protected static void createLambdaResources() { var principal = "s3.amazonaws.com"; var getRoleResponse = iamClient.getRole(GetRoleRequest.builder() - .roleName("lambda_exec_role") - .build()); + .roleName("lambda_exec_role") + .build()); var roleArn = getRoleResponse.role().arn(); @@ -290,30 +290,30 @@ protected static void createLambdaResources() { var zipFileBuffer = ByteBuffer.wrap(zipFileBytes); var createFunctionRequest = CreateFunctionRequest.builder() - .functionName(functionName) - .runtime(runtime) - .handler(handler) - .code(FunctionCode.builder().zipFile(SdkBytes.fromByteBuffer(zipFileBuffer)).build()) - .role(roleArn) - .timeout(60) - .memorySize(512) - // bucket name that is being passed as env var because it's randomly generated - .environment( - Environment.builder().variables(Collections.singletonMap("BUCKET", BUCKET_NAME)) - .build()) - .build(); + .functionName(functionName) + .runtime(runtime) + .handler(handler) + .code(FunctionCode.builder().zipFile(SdkBytes.fromByteBuffer(zipFileBuffer)).build()) + .role(roleArn) + .timeout(60) + .memorySize(512) + // bucket name that is being passed as env var because it's randomly generated + .environment( + Environment.builder().variables(Collections.singletonMap("BUCKET", BUCKET_NAME)) + .build()) + .build(); lambdaClient.createFunction( - createFunctionRequest); + createFunctionRequest); var request = AddPermissionRequest.builder() - .functionName(functionName) - .statementId(statementId) - .action(action) - .principal(principal) - .sourceArn(sourceArn) - .sourceAccount("000000000000") - .build(); + .functionName(functionName) + .statementId(statementId) + .action(action) + .principal(principal) + .sourceArn(sourceArn) + .sourceAccount("000000000000") + .build(); // call the addPermission API with the request lambdaClient.addPermission(request); @@ -330,74 +330,75 @@ protected static void createDynamoDBResources() { // attribute definitions var attributeDefinition = AttributeDefinition.builder() - .attributeName("shipmentId") - .attributeType(ScalarAttributeType.S) - .build(); + .attributeName("shipmentId") + .attributeType(ScalarAttributeType.S) + .build(); // create key schema var keySchemaElement = KeySchemaElement.builder() - .attributeName("shipmentId") - .keyType(KeyType.HASH) - .build(); + .attributeName("shipmentId") + .keyType(KeyType.HASH) + .build(); // CreateTableRequest with table name, attribute definitions, key schema, and billing mode var createTableRequest = CreateTableRequest.builder() - .tableName(tableName) - .attributeDefinitions(attributeDefinition) - .keySchema(keySchemaElement) - .billingMode(BillingMode.PAY_PER_REQUEST) - .build(); + .tableName(tableName) + .attributeDefinitions(attributeDefinition) + .keySchema(keySchemaElement) + .billingMode(BillingMode.PAY_PER_REQUEST) + .build(); // createTable operation to create the table dynamoDbClient.createTable(createTableRequest); // create attribute values for the item var shipmentId = AttributeValue.builder().s("3317ac4f-1f9b-4bab-a974-4aa9876d5547") - .build(); + .build(); var recipientName = AttributeValue.builder().s("Harry Potter").build(); // add other attributes as needed // create a map to hold the item attribute values - var item = new HashMap(); + var item = new HashMap < String, + AttributeValue > (); item.put("shipmentId", shipmentId); item.put("recipient", AttributeValue.builder() + .m(Map.of( + "name", recipientName, + "address", AttributeValue.builder() .m(Map.of( - "name", recipientName, - "address", AttributeValue.builder() - .m(Map.of( - "postalCode", AttributeValue.builder().s("LNDNGB").build(), - "street", AttributeValue.builder().s("Privet Drive").build(), - "number", AttributeValue.builder().s("4").build(), - "city", AttributeValue.builder().s("Little Whinging").build(), - "additionalInfo", AttributeValue.builder().s("").build() - )) - .build() + "postalCode", AttributeValue.builder().s("LNDNGB").build(), + "street", AttributeValue.builder().s("Privet Drive").build(), + "number", AttributeValue.builder().s("4").build(), + "city", AttributeValue.builder().s("Little Whinging").build(), + "additionalInfo", AttributeValue.builder().s("").build() )) - .build()); + .build() + )) + .build()); var senderName = AttributeValue.builder().s("Warehouse of Unicorns").build(); item.put("sender", AttributeValue.builder() + .m(Map.of( + "name", senderName, + "address", AttributeValue.builder() .m(Map.of( - "name", senderName, - "address", AttributeValue.builder() - .m(Map.of( - "postalCode", AttributeValue.builder().s("98653").build(), - "street", AttributeValue.builder().s("47th Street").build(), - "number", AttributeValue.builder().s("5").build(), - "city", AttributeValue.builder().s("Townsville").build(), - "additionalInfo", AttributeValue.builder().s("").build() - )) - .build() + "postalCode", AttributeValue.builder().s("98653").build(), + "street", AttributeValue.builder().s("47th Street").build(), + "number", AttributeValue.builder().s("5").build(), + "city", AttributeValue.builder().s("Townsville").build(), + "additionalInfo", AttributeValue.builder().s("").build() )) - .build()); + .build() + )) + .build()); item.put("weight", AttributeValue.builder().s("2.3").build()); // create a PutItemRequest with the table name and item var putItemRequest = PutItemRequest.builder() - .tableName(tableName) - .item(item) - .build(); + .tableName(tableName) + .item(item) + .build(); // call the putItem operation to add the item to the table dynamoDbClient.putItem(putItemRequest); @@ -408,28 +409,29 @@ protected static void createS3Bucket() { var bucketName = BUCKET_NAME; // CreateBucketRequest with the bucket name var createBucketRequest = CreateBucketRequest.builder() - .bucket(bucketName) - .build(); + .bucket(bucketName) + .build(); // createBucket operation to create the bucket s3Client.createBucket(createBucketRequest); var putBucketPolicyRequest = PutBucketPolicyRequest.builder() - .bucket(bucketName) - .policy( - "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"AllowLambdaInvoke\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::" - + BUCKET_NAME + "/*\"}]}") - .build(); + .bucket(bucketName) + .policy( + "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"AllowLambdaInvoke\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::" + + BUCKET_NAME + "/*\"}]}") + .build(); s3Client.putBucketPolicy(putBucketPolicyRequest); } - protected static ExecResult executeInContainer(String command) throws Exception { - final var execResult = localStack.execInContainer(formatCommand(command)); + final + var execResult = localStack.execInContainer(formatCommand(command)); // assertEquals(0, execResult.getExitCode()); - final var logs = execResult.getStdout() + execResult.getStderr(); + final + var logs = execResult.getStdout() + execResult.getStderr(); logger.info(logs); logger.error(execResult.getExitCode() != 0 ? execResult + " - DOES NOT WORK" : ""); return execResult; diff --git a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/MessageReceiverIntegrationTest.java b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/MessageReceiverIntegrationTest.java index cd937ab..8b3eb65 100644 --- a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/MessageReceiverIntegrationTest.java +++ b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/MessageReceiverIntegrationTest.java @@ -68,13 +68,13 @@ public String getFilename() { var headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); // request body with the file resource and headers - MultiValueMap requestBody = new LinkedMultiValueMap<>(); + MultiValueMap < String, Object > requestBody = new LinkedMultiValueMap < > (); requestBody.add("file", resource); - HttpEntity> requestEntity = new HttpEntity<>(requestBody, - headers); + HttpEntity < MultiValueMap < String, Object >> requestEntity = new HttpEntity < > (requestBody, + headers); - ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + url, - HttpMethod.POST, requestEntity, String.class); + ResponseEntity < String > responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.POST, requestEntity, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); @@ -88,8 +88,8 @@ public String getFilename() { var sseUrl = "/push-endpoint"; - ResponseEntity sseEndpointResponse = restTemplate.getForEntity(BASE_URL + sseUrl, - String.class); + ResponseEntity < String > sseEndpointResponse = restTemplate.getForEntity(BASE_URL + sseUrl, + String.class); assertEquals(HttpStatus.OK, sseEndpointResponse.getStatusCode()); assertNotNull(sseEndpointResponse.getBody()); assertTrue(sseEndpointResponse.getBody().contains(shipmentId)); diff --git a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java index 7d85c3e..76e214e 100644 --- a/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java +++ b/src/test/java/dev/ancaghenade/shipmentlistdemo/integrationtests/ShipmentServiceIntegrationTest.java @@ -41,13 +41,13 @@ public static void setup() { localStack.followOutput(logConsumer); s3Client = S3Client.builder() - .region(region) - .endpointOverride(localStack.getEndpointOverride(LocalStackContainer.Service.S3)) - .build(); + .region(region) + .endpointOverride(localStack.getEndpointOverride(LocalStackContainer.Service.S3)) + .build(); dynamoDbClient = DynamoDbClient.builder() - .region(region) - .endpointOverride(localStack.getEndpointOverride(Service.DYNAMODB)) - .build(); + .region(region) + .endpointOverride(localStack.getEndpointOverride(Service.DYNAMODB)) + .build(); createS3Bucket(); createDynamoDBResources(); @@ -77,17 +77,17 @@ public String getFilename() { var headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); // request body with the file resource and headers - MultiValueMap requestBody = new LinkedMultiValueMap<>(); + MultiValueMap < String, Object > requestBody = new LinkedMultiValueMap < > (); requestBody.add("file", resource); - HttpEntity> requestEntity = new HttpEntity<>(requestBody, - headers); + HttpEntity < MultiValueMap < String, Object >> requestEntity = new HttpEntity < > (requestBody, + headers); - ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + url, - HttpMethod.POST, requestEntity, String.class); + ResponseEntity < String > responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.POST, requestEntity, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); var execResult = executeInContainer( - "awslocal s3api list-objects --bucket shipment-picture-bucket --query length(Contents[])"); + "awslocal s3api list-objects --bucket shipment-picture-bucket --query length(Contents[])"); assertEquals(String.valueOf(1), execResult.getStdout().trim()); } @@ -99,8 +99,8 @@ void testFileDownloadFromS3() { // build the URL with the id as a path variable var url = "/api/shipment/" + shipmentId + "/image/download"; - ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + url, - HttpMethod.GET, null, byte[].class); + ResponseEntity < byte[] > responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.GET, null, byte[].class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); // object is not empty @@ -120,11 +120,11 @@ void testAddShipmentToDynamoDB() throws IOException { var headers = new HttpHeaders(); headers.setContentType(MediaType.valueOf(MediaType.APPLICATION_JSON_VALUE)); - HttpEntity requestEntity = new HttpEntity<>(shipment, - headers); + HttpEntity < Shipment > requestEntity = new HttpEntity < > (shipment, + headers); - ResponseEntity responseEntity = restTemplate.exchange(BASE_URL + url, - HttpMethod.POST, requestEntity, String.class); + ResponseEntity < String > responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.POST, requestEntity, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); @@ -136,12 +136,11 @@ void testGetTwoShipmentsFromDynamoDB() { var url = "/api/shipment"; // set the request headers - ResponseEntity> responseEntity = restTemplate.exchange(BASE_URL + url, - HttpMethod.GET, null, new ParameterizedTypeReference<>() { - }); + ResponseEntity < List < Shipment >> responseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.GET, null, new ParameterizedTypeReference < > () {}); if (responseEntity.getStatusCode().is2xxSuccessful()) { - List shipmentList = responseEntity.getBody(); + List < Shipment > shipmentList = responseEntity.getBody(); assertEquals(2, shipmentList.size()); } } @@ -154,18 +153,17 @@ void testDeleteShipmentFromDynamoDB() { var shipmentId = "/3317ac4f-1f9b-4bab-a974-4aa9876d5547"; // set the request headers - ResponseEntity deleteResponseEntity = restTemplate.exchange(BASE_URL + url + shipmentId, - HttpMethod.DELETE, null, String.class); + ResponseEntity < String > deleteResponseEntity = restTemplate.exchange(BASE_URL + url + shipmentId, + HttpMethod.DELETE, null, String.class); assertEquals(HttpStatus.OK, deleteResponseEntity.getStatusCode()); assertEquals("Shipment has been deleted", deleteResponseEntity.getBody()); - ResponseEntity> getResponseEntity = restTemplate.exchange(BASE_URL + url, - HttpMethod.GET, null, new ParameterizedTypeReference<>() { - }); + ResponseEntity < List < Shipment >> getResponseEntity = restTemplate.exchange(BASE_URL + url, + HttpMethod.GET, null, new ParameterizedTypeReference < > () {}); if (getResponseEntity.getStatusCode().is2xxSuccessful()) { - List shipmentList = getResponseEntity.getBody(); + List < Shipment > shipmentList = getResponseEntity.getBody(); assertEquals(1, shipmentList.size()); } } From eb6dd4040348181eb428e8266d74598e9b33a018 Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Wed, 23 Apr 2025 17:41:30 +0530 Subject: [PATCH 4/9] run tests on gha ci --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e4201c..17b392e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,6 +76,10 @@ jobs: npm install CI=false npm run build + - name: Run Testcontainers tests + run: | + mvn test -Dtest=dev.ancaghenade.shipmentlistdemo.integrationtests.ShipmentServiceIntegrationTest + - name: Show LocalStack logs if: always() run: | From 96f24a76ad10dd4c2026ff68088cee136f3e41dd Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Wed, 23 Apr 2025 17:43:15 +0530 Subject: [PATCH 5/9] remove .DS_Store --- .gitignore | 1 + src/.DS_Store | Bin 6148 -> 0 bytes src/test/.DS_Store | Bin 6148 -> 0 bytes src/test/java/.DS_Store | Bin 6148 -> 0 bytes 4 files changed, 1 insertion(+) delete mode 100644 src/.DS_Store delete mode 100644 src/test/.DS_Store delete mode 100644 src/test/java/.DS_Store diff --git a/.gitignore b/.gitignore index 27ff1f9..38e54db 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ +.DS_Store ### STS ### .apt_generated diff --git a/src/.DS_Store b/src/.DS_Store deleted file mode 100644 index 14c21289a31c10d8b139f3a9af7e7e9def0f010b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKyKciU3?x$z0kU|^s4pncKTrc_$ebT&(=G+vX3Fj<-<3a0jt>-Yg)RlU1V?~8 ziQ?Jt4W=j}x;ec+iS#0}gd57)LTh$z-q<2D3WWEv8;@^?@p!=AAJ{P3gmF9hlvnwX zuOIwpoIPIMS|T%4fC^9nDnJFOz@HSb-V0l<0vV|Q6`%s&3fTXlzzu8S6zIPW1Rnu_ z9nx-C`_&&WZy#UK6K4rz7ulATI-^3yli=w*ohwiy907 diff --git a/src/test/.DS_Store b/src/test/.DS_Store deleted file mode 100644 index 63b728b450e912f8fa3bc98e04a9fc67ff4fcf03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~K?=e^3`G;|qTr@Wm$UHz-e4$t0xzH-2qF~(yPl)_lL>;=wTS#c@+X-IrEk$` zL`3`haV^q`NDDWWm4%5Z@&JhP8{Tj3ht;B=96)--iS@&7q~Le>xC+1b{XuyJ79K1T}(S!u1*@b}wNMJ%>Uh~fG|1JE}{6A@7N&+PC zX9Tp_>^41KD(=>|*R%RQs6f}oy1+fgU zMbokU1qJBa~Ag-RgGPsk-j4>%dB-0El#rREEB~{3ANlf#?~`G-3~$&{RZC6(+?HCU+2;j^mz* z&opW}2=!!~$2?h>3`LmKLpUlNgr|{fR)7^4S0JyOB|85Pzs~>1N!(%uSb=|~fGE`c zdJUIk&en;=(OK(Yxxzw5ahb*s3Oed2##lOvSFk9 Date: Wed, 23 Apr 2025 17:54:13 +0530 Subject: [PATCH 6/9] try fixing the tests --- .github/workflows/ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 17b392e..a04a219 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,7 +76,15 @@ jobs: npm install CI=false npm run build + - name: Stop LocalStack + run: | + localstack stop + - name: Run Testcontainers tests + env: + AWS_ACCESS_KEY_ID: test + AWS_SECRET_ACCESS_KEY: test + AWS_REGION: us-east-1 run: | mvn test -Dtest=dev.ancaghenade.shipmentlistdemo.integrationtests.ShipmentServiceIntegrationTest From d74c8fe9e54f153102cd7179fbe6d8b54ac63a09 Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Wed, 23 Apr 2025 18:06:34 +0530 Subject: [PATCH 7/9] shift logs step to higher up --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a04a219..1aa53fe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,6 +76,11 @@ jobs: npm install CI=false npm run build + - name: Show LocalStack logs + if: always() + run: | + localstack logs + - name: Stop LocalStack run: | localstack stop @@ -86,12 +91,7 @@ jobs: AWS_SECRET_ACCESS_KEY: test AWS_REGION: us-east-1 run: | - mvn test -Dtest=dev.ancaghenade.shipmentlistdemo.integrationtests.ShipmentServiceIntegrationTest - - - name: Show LocalStack logs - if: always() - run: | - localstack logs + mvn test -Dtest=dev.ancaghenade.shipmentlistdemo.integrationtests.ShipmentServiceIntegrationTest - name: Send a Slack notification if: failure() || github.event_name != 'pull_request' From 79a22426ccae9f748b785c81b333a79b01e5a96c Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Wed, 23 Apr 2025 18:12:45 +0530 Subject: [PATCH 8/9] rename the ci job --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1aa53fe..2d0dce0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Create Infra on LocalStack +name: Deploy with Terraform & run tests on: push: @@ -15,8 +15,8 @@ on: workflow_dispatch: jobs: - infrastructure-check: - name: Setup infrastructure using Terraform + test: + name: Run Integration Tests runs-on: ubuntu-latest steps: - name: Checkout From 29e947531edf0313798b6088dcf0597d642d2feb Mon Sep 17 00:00:00 2001 From: Harsh Mishra Date: Wed, 23 Apr 2025 18:14:55 +0530 Subject: [PATCH 9/9] rename the ci job --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d0dce0..facf2f5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Deploy with Terraform & run tests +name: Deploy with Terraform on: push: