From d06c21ea99e5fb9e4479e655e48217193fa6acfc Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 12 Apr 2024 11:42:46 +0100 Subject: [PATCH 01/19] HIA-697 - Gateway created + new upstream API --- Dockerfile.setup-manage-pom-case-api | 8 ++ docker-compose.yml | 12 +++ localstack/cache/machine.json | 1 + localstack/cache/server.test.pem.crt | 91 ++++++++++++++++++ .../cache/service-catalog-3_0_2-1_32_5.pickle | Bin 0 -> 368617 bytes .../gateways/ManagePOMCaseGateway.kt | 52 ++++++++++ .../models/hmpps/PrisonOffenderManager.kt | 6 ++ .../models/hmpps/UpstreamApi.kt | 1 + .../models/managePOMCase/AllocationManager.kt | 7 ++ .../managePOMCase/AllocationPrimaryPOM.kt | 14 +++ .../models/managePOMCase/AllocationPrison.kt | 5 + src/main/resources/application-dev.yml | 2 + .../resources/application-local-docker.yml | 2 + src/main/resources/application-local.yml | 2 + src/main/resources/application-preprod.yml | 2 + src/main/resources/application-prod.yml | 2 + src/main/resources/application-test.yml | 2 + src/main/resources/application.yml | 2 + .../managePOMcase/ManagePOMCaseGatewayTest.kt | 82 ++++++++++++++++ .../mockservers/ManagePOMCaseApiMockServer.kt | 30 ++++++ 20 files changed, 323 insertions(+) create mode 100644 Dockerfile.setup-manage-pom-case-api create mode 100644 localstack/cache/machine.json create mode 100644 localstack/cache/server.test.pem.crt create mode 100644 localstack/cache/service-catalog-3_0_2-1_32_5.pickle create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOffenderManager.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationManager.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrison.kt create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/managePOMcase/ManagePOMCaseGatewayTest.kt create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/ManagePOMCaseApiMockServer.kt diff --git a/Dockerfile.setup-manage-pom-case-api b/Dockerfile.setup-manage-pom-case-api new file mode 100644 index 000000000..96e5ee543 --- /dev/null +++ b/Dockerfile.setup-manage-pom-case-api @@ -0,0 +1,8 @@ +FROM node:current-alpine3.17 + +RUN apk update && apk add bash curl + +RUN curl https://allocation-manager-staging.apps.live.cloud-platform.service.justice.gov.uk/v3/api-docs.json > manage-pom-case-api.json && \ + npm install -g @stoplight/prism-cli + +CMD prism mock -p 4010 -h 0.0.0.0 /manage-pom-case-api.json diff --git a/docker-compose.yml b/docker-compose.yml index a067aec51..9a288d7f6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,6 +17,8 @@ services: condition: service_healthy probation-integration-epf-api: condition: service_healthy + manage-pom-case-api: + condition: service_healthy environment: - SERVER_PORT=8080 - SPRING_PROFILES_ACTIVE=local-docker @@ -124,6 +126,16 @@ services: ports: - '4080:4010' + manage-pom-case-api: + build: + context: . + dockerfile: Dockerfile.setup-manage-pom-case-api + container_name: manage-pom-case-api + healthcheck: + test: 'wget --header="Authorization: Bearer abc" http://127.0.0.1:4010/api/allocation/X1234YZ/primary_pom -O /dev/null' + ports: + - '4090:4010' + local-stack-aws: image: localstack/localstack:3.0 container_name: local-stack-aws diff --git a/localstack/cache/machine.json b/localstack/cache/machine.json new file mode 100644 index 000000000..22efc5605 --- /dev/null +++ b/localstack/cache/machine.json @@ -0,0 +1 @@ +{"machine_id": "dkr_f88a0859f471"} \ No newline at end of file diff --git a/localstack/cache/server.test.pem.crt b/localstack/cache/server.test.pem.crt new file mode 100644 index 000000000..f0372edb4 --- /dev/null +++ b/localstack/cache/server.test.pem.crt @@ -0,0 +1,91 @@ +-----BEGIN CERTIFICATE----- +MIILCzCCCfOgAwIBAgISBIVWexzWmz28L0Tuwgnyi5jAMA0GCSqGSIb3DQEBCwUA +MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD +EwJSMzAeFw0yNDA0MDEwNTA3NTNaFw0yNDA2MzAwNTA3NTJaMCUxIzAhBgNVBAMT +GmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3VkMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEApf3YbHC/LbmnZLEow717o2cdLA9w+z6ivclosN9cjK8l58sE +1+MXG3XQsGRpRT+1B59AB91XjVyXQDu3cf3PQtIlqfwvlPB/bM0oTchxGqs1PiAy +i6ljPlqyW0VgElqAzo0E5JZBSSngXsTgc9pN/w/k3tk54d6+Cv+vbf/op7g+8sT7 +r4R643upVHwcjt9EXyKPk048p4OS6UHLSixzVUD8ieu6EngxhT6cyAVw1AiDcHIz +wTIltnnnfs511jUkwZFypEiFiWhVGt330ils+xb90C4yTBCd6S6yUsD99fgPOEvU +mGEafPdtCsiM0RRixQ8APDGW1lKpFtlDcMYVCQIDAQABo4IIJjCCCCIwDgYDVR0P +AQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB +Af8EAjAAMB0GA1UdDgQWBBSniWd2PpKOrKEfsxUaIuZe/RBJYTAfBgNVHSMEGDAW +gBQULrMXt1hWy65QCUDmH6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUH +MAGGFWh0dHA6Ly9yMy5vLmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3Iz +LmkubGVuY3Iub3JnLzCCBi4GA1UdEQSCBiUwggYhgicqLmFtcGxpZnlhcHAubG9j +YWxob3N0LmxvY2Fsc3RhY2suY2xvdWSCJyouY2xvdWRmcm9udC5sb2NhbGhvc3Qu +bG9jYWxzdGFjay5jbG91ZIIxKi5ka3IuZWNyLmV1LWNlbnRyYWwtMS5sb2NhbGhv +c3QubG9jYWxzdGFjay5jbG91ZIIuKi5ka3IuZWNyLmV1LXdlc3QtMS5sb2NhbGhv +c3QubG9jYWxzdGFjay5jbG91ZIIuKi5ka3IuZWNyLnVzLWVhc3QtMS5sb2NhbGhv +c3QubG9jYWxzdGFjay5jbG91ZIIuKi5ka3IuZWNyLnVzLWVhc3QtMi5sb2NhbGhv +c3QubG9jYWxzdGFjay5jbG91ZIIuKi5ka3IuZWNyLnVzLXdlc3QtMS5sb2NhbGhv +c3QubG9jYWxzdGFjay5jbG91ZIIuKi5ka3IuZWNyLnVzLXdlc3QtMi5sb2NhbGhv +c3QubG9jYWxzdGFjay5jbG91ZIIgKi5lbGIubG9jYWxob3N0LmxvY2Fsc3RhY2su +Y2xvdWSCNCouZXUtY2VudHJhbC0xLm9wZW5zZWFyY2gubG9jYWxob3N0LmxvY2Fs +c3RhY2suY2xvdWSCMSouZXUtd2VzdC0xLm9wZW5zZWFyY2gubG9jYWxob3N0Lmxv +Y2Fsc3RhY2suY2xvdWSCKCouZXhlY3V0ZS1hcGkubG9jYWxob3N0LmxvY2Fsc3Rh +Y2suY2xvdWSCNCoubGFtYmRhLXVybC5ldS1jZW50cmFsLTEubG9jYWxob3N0Lmxv +Y2Fsc3RhY2suY2xvdWSCMSoubGFtYmRhLXVybC5ldS13ZXN0LTEubG9jYWxob3N0 +LmxvY2Fsc3RhY2suY2xvdWSCMSoubGFtYmRhLXVybC51cy1lYXN0LTEubG9jYWxo +b3N0LmxvY2Fsc3RhY2suY2xvdWSCMSoubGFtYmRhLXVybC51cy1lYXN0LTIubG9j +YWxob3N0LmxvY2Fsc3RhY2suY2xvdWSCMSoubGFtYmRhLXVybC51cy13ZXN0LTEu +bG9jYWxob3N0LmxvY2Fsc3RhY2suY2xvdWSCMSoubGFtYmRhLXVybC51cy13ZXN0 +LTIubG9jYWxob3N0LmxvY2Fsc3RhY2suY2xvdWSCHCoubG9jYWxob3N0LmxvY2Fs +c3RhY2suY2xvdWSCJyoub3BlbnNlYXJjaC5sb2NhbGhvc3QubG9jYWxzdGFjay5j +bG91ZIInKi5zMy13ZWJzaXRlLmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3Vkgh8q +LnMzLmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3VkgiAqLnNjbS5sb2NhbGhvc3Qu +bG9jYWxzdGFjay5jbG91ZIImKi5zbm93Zmxha2UubG9jYWxob3N0LmxvY2Fsc3Rh +Y2suY2xvdWSCMSoudXMtZWFzdC0xLm9wZW5zZWFyY2gubG9jYWxob3N0LmxvY2Fs +c3RhY2suY2xvdWSCMSoudXMtZWFzdC0yLm9wZW5zZWFyY2gubG9jYWxob3N0Lmxv +Y2Fsc3RhY2suY2xvdWSCMSoudXMtd2VzdC0xLm9wZW5zZWFyY2gubG9jYWxob3N0 +LmxvY2Fsc3RhY2suY2xvdWSCMSoudXMtd2VzdC0yLm9wZW5zZWFyY2gubG9jYWxo +b3N0LmxvY2Fsc3RhY2suY2xvdWSCGmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3Vk +gitzcXMuZXUtY2VudHJhbC0xLmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3Vkgihz +cXMuZXUtd2VzdC0xLmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3VkgihzcXMudXMt +ZWFzdC0xLmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3VkgihzcXMudXMtZWFzdC0y +LmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3VkgihzcXMudXMtd2VzdC0xLmxvY2Fs +aG9zdC5sb2NhbHN0YWNrLmNsb3VkgihzcXMudXMtd2VzdC0yLmxvY2FsaG9zdC5s +b2NhbHN0YWNrLmNsb3VkMBMGA1UdIAQMMAowCAYGZ4EMAQIBMIIBAwYKKwYBBAHW +eQIEAgSB9ASB8QDvAHUAouK/1h7eLy8HoNZObTen3GVDsMa1LqLat4r4mm31F9gA +AAGOmEV4BQAABAMARjBEAiBSnRBkciS/1wFaxlzCNtuN5ps6DmgQmCA3liV33I3U +mAIgCiXzRhDMyer6tnL/aftjaRZEDtchBQtIuaAfbQUpvyUAdgB2/4g/Crb7lVHC +Ycz1h7o0tKTNuyncaEIKn+ZnTFo6dAAAAY6YRXgNAAAEAwBHMEUCIFouiSzvnHWS +Rx+Mz68Gyl1fmNBx+T8jWnvlpCVRE9jWAiEA7ZjgdMuYfhiQZURRSgC9LQQcH4x5 +pfjYYYust25xHqIwDQYJKoZIhvcNAQELBQADggEBAJSfCwKRizqEdo0BKmV4AvPD +HGMiYSRAhy/Ct0p4lSkK3h0VElm0YjWd9WLJwi3sdZZwFtCvyCfpeptbrzG2a2HJ +ueysDQ+qNUWWt9EwQWZ0aO2zmoHx2frq0LOqc4qWTT7HH4C5bEAvwt890VTgD+mh +nAJV0TjKtBFxFqMM2YCR++Xqi7e5w9L02T6MDNNOB3Y8+DxkoGK0jaTf83LnHN6X +EWCjRJeRSiW0+8pIiRF4YZBVB1tw9fPR1OO7UBJQcUysOfh9XBhyz8a8x2kPulbL +rcoTbdXMOz29dRQfvCCMLHeypYpQxNvSYmUqBDSa9hgR1N7yiX3C/3GEfC4iQN4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw +WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP +R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx +sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm +NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg +Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG +/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB +Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA +FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw +AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw +Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB +gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W +PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl +ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz +CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm +lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 +avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 +yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O +yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids +hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ +HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv +MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX +nLRbwHOoq7hHwg== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/localstack/cache/service-catalog-3_0_2-1_32_5.pickle b/localstack/cache/service-catalog-3_0_2-1_32_5.pickle new file mode 100644 index 0000000000000000000000000000000000000000..61d541c47b0f55cebd5a492187af81559253bf6c GIT binary patch literal 368617 zcmeFad6;F%RUZf{sk`=l>3wf?O08_Fsuy)@L1blBb(K`vRjRD&mO-MqneS%C%X*nF z`z=+SVvJz~*x&@yrokAn4VoE@J;s0;K;T(ygJ3XYK!9MdS&WTkgE1IJvH>BO-|sAO zBksK~tMNDU`5#N)SDo*i6A>p)oH%jf#EH0H`ucA;@>!q#S^VGTp*eCBn}_Dh!S(K9Ia`d1UVr)gTBm&Z)vtf`O<(rvpMP~~bI(w*FRm4<n?4)irVzA1#nfaby!9LXbgNV%FpRyJn9c2!R{JrJe*>>Ys2nx7}W|a_J^bOL4T>+Qz@;lLxe#a zAB@-52qlxl(V#3uZuom+4J_>|28+`l>_fuS!_ZxVWN#@(pgF33iqRtYyLF-L4El@Lz=!=c4R%M} zRnY8T==LZ82(~j`L`gOVVTpl+L=PmtI{nq6yXNGhLD2<6`-DJ#Osj@!Z8vm8b}#lj zsA|+*Di*=d4*rzc!Jgr7C@3c55U8Ea_yVRMS^GC^R#Ktt6<{kcx*FLu`p>H}%0NTa?;aT`QOPR7uQ)p9Uxf{bXT%PGeO*V` z-hjF9lWJeb{!}9c=8v<)A0)(0;Wjhcd zI{W7c%i3Y_I)<4L3c~F*X_{rsUclCqP*t0yq z%G`nUw2M2I$Hk!28Pf#c63U`Cf_2)dfAnC*(d_`$+n{K{S(nSw9=F(D&u@001Wzp<&mib!I>W2P+t6;tF`7TmTf01-g!(`|(o?6rJncAsgQT zkdHmv(Z8+XT>vcguo#6gbd8nCuNz&CI~x@HS&q1>tAD@}!!CRlAz_81z?BT+v<{iG ziqVbk+A4&O#z}nxiln-^t$STqzCMJl#u&*mdMkji9uUwQt`$qy=nBYxP zz52&A=EyZ!C3j%a67@x`w*piSsi=3^U(?j{{xnxA*qF|=tjAbzbF@K^}~@JQ&5R(oK1VEo5|{YORrd6=%A}WjMo;!^o{NZ zq1R9__?y$PTxAcXcJW8_Tz2Ev^^*~~M}J22J}42^gmOB%Ru9%7)9B~;<>}#gVYoQx zV!06y@qs$k7*?iEw4*2Pp)B>=>4ocTd_DYa@VUR&?_cX<5qoLeg^S1)X0L%(%MpB3 zk$}=bS=CmpLRR}$VJI=2@OTDmG6=T-(k+2Hpxx*!ptWmI8+sha8n9_INrzU80bDqE zj5OnPCi-x3L0>_|T=vA-hUz33EXr8)7Ga~|g6QnpEy@xVGya6}rG*e|Pu4RHebo=2sR9{6)ST3Uhodk}nT6R2+}PF zfF`|x#;q=6e&Sz9?C#aB?FFVW@i7_cfAulETnjKNha#S6bXYbUx24cNrWKqeGv0?& zlt9a6n&Q`(jPDLxI<^;Q{$}cuCk&tb+H$>%|5&dU|oNu|DdH@k4)aZv)!^?#Is2 zT?vS~fDY_h#~RMv5d1rs+vL}@TkJzAFiz^%aa*_@d%E>L78}UN|C}!2ghOBlBVf2X zgu=-d;z$!XP0f1){WbLO4eR|Ly@FfUF*il2_TjJV*r1yDL30b1o)Mjj*T2-GuI=W3 zrr}cR^xcW6zIaVGjTjrq3WS3NPSR}y@xbt}$z%JV?ARu7kN;_?L-BVyaJvTOHF2WF zP@v4P+w0Q5lC=wEhW#<->oitu%n=wXbZuXR(qULf2X1qS0!GC$=a1~OcW?!^g=-Jo z;1aQbjT-?@9Atvxqw>keS%LnAS)*>~^kNSlGFQ8Mn<#at;}p81L4k#^!<7rH?KPzC zqyX4w0J7YJk)agF5b5iN;A6+|aZF6z_w5`$Ua9F0Y$Blsvi=^4e@_=DyVatxw}O}0 z+rGMaPX$;i3(Qm92v#KyR|LytABJMom3>MDjyC;31&bQHdstkDoQJk~-+?8+?2I*l zz`s`u^mp5kDzz6r#{k>yIN5jkCQh9c|D}E%sNMM;lv}atoBU>|yraLMMTPvUk{B70Y>}EOeAG={P{u z)H^y{>)$X}&Q@Yw5VsQnR~U14+mQRTZNrzO>`Oym#I_B&3*U`@)$

Zx4TV*A~Tx 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 GAOAo8hQB%h literal 0 HcmV?d00001 diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt new file mode 100644 index 000000000..86363d768 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt @@ -0,0 +1,52 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Value +import org.springframework.http.HttpMethod +import org.springframework.stereotype.Component +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.WebClientWrapper +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOffenderManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.managePOMCase.AllocationPrimaryPOM + +@Component +class ManagePOMCaseGateway( + @Value("\${services.manage-pom-case-api.base-url}") baseUrl: String, +) { + private val webClient = WebClientWrapper(baseUrl) + + @Autowired + lateinit var hmppsAuthGateway: HmppsAuthGateway + + fun getPrimaryPOMForNomisNumber(id: String): Response { + val result = + webClient.request( + HttpMethod.GET, + "/allocation/$id/primary_pom", + authenticationHeader(), + UpstreamApi.MANAGE_POM_CASE, + ) + + return when (result) { + is WebClientWrapper.WebClientWrapperResponse.Success -> { + Response(data = result.data.toPrisonOffenderManager()) + } + + is WebClientWrapper.WebClientWrapperResponse.Error -> { + Response( + data = PrisonOffenderManager(), + errors = result.errors, + ) + } + } + } + + private fun authenticationHeader(): Map { + val token = hmppsAuthGateway.getClientToken("ManagePOMCase") + + return mapOf( + "Authorization" to "Bearer $token", + ) + } +} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOffenderManager.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOffenderManager.kt new file mode 100644 index 000000000..afb1f2e5e --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOffenderManager.kt @@ -0,0 +1,6 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps + +data class PrisonOffenderManager( + val forename: String? = null, + val surname: String? = null, +) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/UpstreamApi.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/UpstreamApi.kt index 34ee1c7df..00fc8c25b 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/UpstreamApi.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/UpstreamApi.kt @@ -9,5 +9,6 @@ enum class UpstreamApi { ADJUDICATIONS, CVL, CASE_NOTES, + MANAGE_POM_CASE, TEST, } diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationManager.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationManager.kt new file mode 100644 index 000000000..9b8b7f942 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationManager.kt @@ -0,0 +1,7 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.managePOMCase + +data class AllocationManager( + val code: Int? = null, + val forename: String? = null, + val surname: String? = null, +) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt new file mode 100644 index 000000000..18a97f2cb --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt @@ -0,0 +1,14 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.managePOMCase + +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOffenderManager + +data class AllocationPrimaryPOM( + val manager: AllocationManager = AllocationManager(), + val prison: AllocationPrison = AllocationPrison(), +) { + fun toPrisonOffenderManager(): PrisonOffenderManager = + PrisonOffenderManager( + forename = this.manager.forename, + surname = this.manager.surname, + ) +} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrison.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrison.kt new file mode 100644 index 000000000..2ccecdf0b --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrison.kt @@ -0,0 +1,5 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.managePOMCase + +data class AllocationPrison( + val code: String? = null, +) diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 1bdc8d57c..c6aff8c28 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -17,6 +17,8 @@ services: base-url: https://create-and-vary-a-licence-api-dev.hmpps.service.justice.gov.uk case-notes: base-url: https://dev.offender-case-notes.service.justice.gov.uk + manage-pom-case-api: + base-url: https://dev.moic.service.justice.gov.uk hmpps-auth: base-url: https://sign-in-dev.hmpps.service.justice.gov.uk username: ${CLIENT_ID} diff --git a/src/main/resources/application-local-docker.yml b/src/main/resources/application-local-docker.yml index 4678e37ba..a86d27ed6 100644 --- a/src/main/resources/application-local-docker.yml +++ b/src/main/resources/application-local-docker.yml @@ -17,6 +17,8 @@ services: base-url: http://create-and-vary-licence-api:4010 case-notes: base-url: http://case-notes-api:4010 + manage-pom-case-api: + base-url: http://manage-pom-case-api:4010 hmpps-auth: base-url: http://hmpps-auth:8080 diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 93f1b6343..9fd40b353 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -19,6 +19,8 @@ services: base-url: http://localhost:4070 case-notes: base-url: http://localhost:4080 + manage-pom-case-api: + base-url: http://localhost:4090 hmpps.sqs: provider: localstack diff --git a/src/main/resources/application-preprod.yml b/src/main/resources/application-preprod.yml index b36e6eadd..44db9a64e 100644 --- a/src/main/resources/application-preprod.yml +++ b/src/main/resources/application-preprod.yml @@ -17,6 +17,8 @@ services: base-url: https://create-and-vary-a-licence-api-preprod.hmpps.service.justice.gov.uk case-notes: base-url: https://preprod.offender-case-notes.service.justice.gov.uk + manage-pom-case-api: + base-url: https://preprod.moic.service.justice.gov.uk hmpps-auth: base-url: https://sign-in-preprod.hmpps.service.justice.gov.uk username: ${CLIENT_ID} diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index ec6ca7dff..5cad6f114 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -17,6 +17,8 @@ services: base-url: https://create-and-vary-a-licence-api-prod.hmpps.service.justice.gov.uk case-notes: base-url: https://prod.offender-case-notes.service.justice.gov.uk + manage-pom-case-api: + base-url: https://moic.service.justice.gov.uk hmpps-auth: base-url: https://sign-in.hmpps.service.justice.gov.uk username: ${CLIENT_ID} diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index b9c50a71f..491b7ef26 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -28,6 +28,8 @@ services: base-url: http://localhost:4007 case-notes: base-url: http://localhost:4008 + manage-pom-case-api: + base-url: http://localhost:4009 hmpps.sqs: provider: localstack diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 1765d3fb8..9c929cb2b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -73,6 +73,8 @@ services: base-url: http://localhost:4070 case-notes: base-url: http://localhost:4080 + manage-pom-case-api: + base-url: http://localhost:4090 sentry: traces-sample-rate: "0.05" diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/managePOMcase/ManagePOMCaseGatewayTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/managePOMcase/ManagePOMCaseGatewayTest.kt new file mode 100644 index 000000000..cb96f4680 --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/managePOMcase/ManagePOMCaseGatewayTest.kt @@ -0,0 +1,82 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.managePOMcase + +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.DescribeSpec +import io.kotest.matchers.shouldBe +import org.mockito.Mockito +import org.mockito.internal.verification.VerificationModeFactory +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer +import org.springframework.boot.test.mock.mockito.MockBean +import org.springframework.http.HttpStatus +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.context.ContextConfiguration +import org.springframework.web.reactive.function.client.WebClientResponseException +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.HmppsAuthGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.ManagePOMCaseGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.HmppsAuthMockServer +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.ManagePOMCaseApiMockServer + +@ActiveProfiles("test") +@ContextConfiguration( + initializers = [ConfigDataApplicationContextInitializer::class], + classes = [ManagePOMCaseGateway::class], +) +class ManagePOMCaseGatewayTest( + @MockBean val hmppsAuthGateway: HmppsAuthGateway, + val managePOMCaseGateway: ManagePOMCaseGateway, +) : DescribeSpec( + { + val managePOMCaseApiMockServer = ManagePOMCaseApiMockServer() + beforeEach { + managePOMCaseApiMockServer.start() + + Mockito.reset(hmppsAuthGateway) + whenever(hmppsAuthGateway.getClientToken("ManagePOMCase")).thenReturn( + HmppsAuthMockServer.TOKEN, + ) + } + afterTest { + managePOMCaseApiMockServer.stop() + } + + it("authenticates using HMPPS Auth with credentials") { + managePOMCaseGateway.getPrimaryPOMForNomisNumber(id = "X1234YZ") + + verify(hmppsAuthGateway, VerificationModeFactory.times(1)).getClientToken("ManagePOMCase") + } + + it("upstream API returns an error, throw exception") { + managePOMCaseApiMockServer.stubGetPrimaryPOMForNomisNumber("X1234YZ", "", HttpStatus.BAD_REQUEST) + val response = + shouldThrow { + managePOMCaseGateway.getPrimaryPOMForNomisNumber(id = "X1234YZ") + } + response.statusCode.shouldBe(HttpStatus.BAD_REQUEST) + } + + it("returns primary offender officer") { + managePOMCaseApiMockServer.stubGetPrimaryPOMForNomisNumber( + "X1234YZ", + """ + { + "manager": { + "code": 0, + "forename": "string", + "surname": "string" + }, + "prison": { + "code": "string" + } + } + """, + HttpStatus.OK, + ) + + val response = managePOMCaseGateway.getPrimaryPOMForNomisNumber(id = "X1234YZ") + response.data.forename.shouldBe("string") + response.data.surname.shouldBe("string") + } + }, + ) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/ManagePOMCaseApiMockServer.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/ManagePOMCaseApiMockServer.kt new file mode 100644 index 000000000..8dbe0057d --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/ManagePOMCaseApiMockServer.kt @@ -0,0 +1,30 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers + +import com.github.tomakehurst.wiremock.WireMockServer +import com.github.tomakehurst.wiremock.client.WireMock +import org.springframework.http.HttpStatus + +class ManagePOMCaseApiMockServer : WireMockServer(WIREMOCK_PORT) { + companion object { + private const val WIREMOCK_PORT = 4009 + } + + fun stubGetPrimaryPOMForNomisNumber( + id: String, + body: String, + status: HttpStatus = HttpStatus.OK, + ) { + stubFor( + WireMock.get("/allocation/$id/primary_pom") + .withHeader( + "Authorization", + WireMock.matching("Bearer ${HmppsAuthMockServer.TOKEN}"), + ).willReturn( + WireMock.aResponse() + .withHeader("Content-Type", "application/json") + .withStatus(status.value()) + .withBody(body.trimIndent()), + ), + ) + } +} From 6aa1d686dbaac09c9a1be66cf56f6cd51ff1bc29 Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 12 Apr 2024 13:49:34 +0100 Subject: [PATCH 02/19] HIA-697 Added Service for Prison Officer Manager API --- .../gateways/ManagePOMCaseGateway.kt | 8 +- .../models/hmpps/Prison.kt | 5 ++ ...nderManager.kt => PrisonOfficerManager.kt} | 3 +- .../managePOMCase/AllocationPrimaryPOM.kt | 11 ++- ...GetPrisonOfficerManagerForPersonService.kt | 28 +++++++ ...risonOfficerManagerForPersonServiceTest.kt | 78 +++++++++++++++++++ 6 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/Prison.kt rename src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/{PrisonOffenderManager.kt => PrisonOfficerManager.kt} (67%) create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonService.kt create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonServiceTest.kt diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt index 86363d768..e2732158c 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt @@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Value import org.springframework.http.HttpMethod import org.springframework.stereotype.Component import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.WebClientWrapper -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOffenderManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOfficerManager import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.managePOMCase.AllocationPrimaryPOM @@ -19,7 +19,7 @@ class ManagePOMCaseGateway( @Autowired lateinit var hmppsAuthGateway: HmppsAuthGateway - fun getPrimaryPOMForNomisNumber(id: String): Response { + fun getPrimaryPOMForNomisNumber(id: String): Response { val result = webClient.request( HttpMethod.GET, @@ -30,12 +30,12 @@ class ManagePOMCaseGateway( return when (result) { is WebClientWrapper.WebClientWrapperResponse.Success -> { - Response(data = result.data.toPrisonOffenderManager()) + Response(data = result.data.toPrisonOfficerManager()) } is WebClientWrapper.WebClientWrapperResponse.Error -> { Response( - data = PrisonOffenderManager(), + data = PrisonOfficerManager(), errors = result.errors, ) } diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/Prison.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/Prison.kt new file mode 100644 index 000000000..538bfd5f6 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/Prison.kt @@ -0,0 +1,5 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps + +data class Prison( + val code: String? = null, +) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOffenderManager.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOfficerManager.kt similarity index 67% rename from src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOffenderManager.kt rename to src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOfficerManager.kt index afb1f2e5e..ee9a543b1 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOffenderManager.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOfficerManager.kt @@ -1,6 +1,7 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps -data class PrisonOffenderManager( +data class PrisonOfficerManager( val forename: String? = null, val surname: String? = null, + val prison: Prison = Prison(), ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt index 18a97f2cb..7c6349787 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt @@ -1,14 +1,19 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.managePOMCase -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOffenderManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Prison +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOfficerManager data class AllocationPrimaryPOM( val manager: AllocationManager = AllocationManager(), val prison: AllocationPrison = AllocationPrison(), ) { - fun toPrisonOffenderManager(): PrisonOffenderManager = - PrisonOffenderManager( + fun toPrisonOfficerManager(): PrisonOfficerManager = + PrisonOfficerManager( forename = this.manager.forename, surname = this.manager.surname, + prison = + Prison( + code = this.prison.code, + ), ) } diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonService.kt new file mode 100644 index 000000000..0002f4a82 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonService.kt @@ -0,0 +1,28 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.services + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.ManagePOMCaseGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOfficerManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response + +@Service +class GetPrisonOfficerManagerForPersonService( + @Autowired val getPersonService: GetPersonService, + @Autowired val managePOMCaseGateway: ManagePOMCaseGateway, +) { + fun execute(hmppsId: String): Response { + val personResponse = getPersonService.execute(hmppsId = hmppsId) + val nomisNumber = personResponse.data?.identifiers?.nomisNumber + var prisonOfficeManager: Response = Response(data = PrisonOfficerManager()) + + if (nomisNumber != null) { + prisonOfficeManager = managePOMCaseGateway.getPrimaryPOMForNomisNumber(nomisNumber) + } + + return Response( + data = prisonOfficeManager.data, + errors = personResponse.errors + prisonOfficeManager.errors, + ) + } +} diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonServiceTest.kt new file mode 100644 index 000000000..892d114ba --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonServiceTest.kt @@ -0,0 +1,78 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.services + +import io.kotest.core.spec.style.DescribeSpec +import io.kotest.matchers.shouldBe +import org.mockito.Mockito +import org.mockito.internal.verification.VerificationModeFactory +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer +import org.springframework.boot.test.mock.mockito.MockBean +import org.springframework.test.context.ContextConfiguration +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.ManagePOMCaseGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Identifiers +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Prison +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOfficerManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError + +@ContextConfiguration( + initializers = [ConfigDataApplicationContextInitializer::class], + classes = [GetPrisonOfficerManagerForPersonService::class], +) +class GetPrisonOfficerManagerForPersonServiceTest( + @MockBean val managePOMCaseGateway: ManagePOMCaseGateway, + @MockBean val getPersonService: GetPersonService, + private val getPrisonOfficerManagerForPersonService: GetPrisonOfficerManagerForPersonService, +) : DescribeSpec( + { + val hmppsId = "1234/56789B" + val nomisNumber = "Z99999ZZ" + val person = Person(firstName = "Julianna", lastName = "Blake", identifiers = Identifiers(nomisNumber = nomisNumber)) + + val prisonOfficerManager = PrisonOfficerManager(forename = "Paul", surname = "Smith", prison = Prison(code = "RED")) + + beforeEach { + Mockito.reset(getPersonService) + Mockito.reset(managePOMCaseGateway) + + whenever(getPersonService.execute(hmppsId = hmppsId)).thenReturn(Response(person)) + whenever(managePOMCaseGateway.getPrimaryPOMForNomisNumber(id = nomisNumber)).thenReturn(Response(prisonOfficerManager)) + } + + it("performs a search according to hmpps Id") { + getPrisonOfficerManagerForPersonService.execute(hmppsId) + verify(getPersonService, VerificationModeFactory.times(1)).execute(hmppsId = hmppsId) + } + + it("Returns a prison offender manager for person given a hmppsId") { + whenever(getPersonService.execute(hmppsId = hmppsId)).thenReturn( + Response( + data = person, + ), + ) + val result = getPrisonOfficerManagerForPersonService.execute(hmppsId) + result.shouldBe(Response(data = prisonOfficerManager)) + } + + it("should return a list of errors if person not found") { + whenever(getPersonService.execute(hmppsId = "NOT_FOUND")).thenReturn( + Response( + data = null, + errors = + listOf( + UpstreamApiError( + causedBy = UpstreamApi.MANAGE_POM_CASE, + type = UpstreamApiError.Type.ENTITY_NOT_FOUND, + ), + ), + ), + ) + val result = getPrisonOfficerManagerForPersonService.execute("NOT_FOUND") + result.data.shouldBe(PrisonOfficerManager()) + result.errors.first().type.shouldBe(UpstreamApiError.Type.ENTITY_NOT_FOUND) + } + }, + ) From 28d0f1e484411ccaaef95c9b929b32c35bcf1425 Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 12 Apr 2024 14:11:37 +0100 Subject: [PATCH 03/19] HIA-697 - Added additional models required --- .../PersonResponsibleOfficerController.kt | 37 +++++++++++++++++++ .../models/hmpps/CommunityOffenderManager.kt | 8 ++++ .../models/hmpps/PersonResponsibleOfficer.kt | 6 +++ .../hmpps/PersonResponsibleOfficerName.kt | 6 +++ .../hmpps/PersonResponsibleOfficerTeam.kt | 8 ++++ .../PersonResponsibleOfficerControllerTest.kt | 3 ++ 6 files changed, 68 insertions(+) create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CommunityOffenderManager.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficer.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerName.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerTeam.kt create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt new file mode 100644 index 000000000..054ab9fad --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt @@ -0,0 +1,37 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1.person + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.exception.EntityNotFoundException +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.decodeUrlCharacters +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficer +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetPrisonOfficerManagerForPersonService +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.internal.AuditService + +@RestController +@RequestMapping("/v1/persons") +class PersonResponsibleOfficerController( + @Autowired val auditService: AuditService, + @Autowired val getPrisonOfficerManagerForPersonService: GetPrisonOfficerManagerForPersonService, +) { + @GetMapping("{encodedHmppsId}/person-responsible-officer") + fun getPersonResponsibleOfficer( + @PathVariable encodedHmppsId: String, + ): Map { + val hmppsId = encodedHmppsId.decodeUrlCharacters() + val prisonOfficerManager = getPrisonOfficerManagerForPersonService.execute(hmppsId) +// val communityOfficerManager = getCommunityOfficerManagerForPersonService.execute(hmppsId) + + if (prisonOfficerManager.hasError(UpstreamApiError.Type.ENTITY_NOT_FOUND)) { + throw EntityNotFoundException("Could not find prison officer manager related to id: $hmppsId") + } + + auditService.createEvent("GET_PERSON_RESPONSIBLE_OFFICER", mapOf("hmppsId" to hmppsId)) +// return mapOf("data" to response.data) + return mapOf("data" to PersonResponsibleOfficer()) + } +} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CommunityOffenderManager.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CommunityOffenderManager.kt new file mode 100644 index 000000000..6e99c3287 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CommunityOffenderManager.kt @@ -0,0 +1,8 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps + +data class CommunityOffenderManager( + val name: PersonResponsibleOfficerName = PersonResponsibleOfficerName(), + val email: String? = null, + val telephoneNumber: String? = null, + val team: PersonResponsibleOfficerTeam = PersonResponsibleOfficerTeam(), +) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficer.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficer.kt new file mode 100644 index 000000000..40a49712a --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficer.kt @@ -0,0 +1,6 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps + +data class PersonResponsibleOfficer( + val prisonOfficerManager: PrisonOfficerManager = PrisonOfficerManager(), + val communityOffenderManager: CommunityOffenderManager = CommunityOffenderManager(), +) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerName.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerName.kt new file mode 100644 index 000000000..2b07d0552 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerName.kt @@ -0,0 +1,6 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps + +data class PersonResponsibleOfficerName( + val forename: String? = null, + val surname: String? = null, +) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerTeam.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerTeam.kt new file mode 100644 index 000000000..0ec19ec31 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerTeam.kt @@ -0,0 +1,8 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps + +class PersonResponsibleOfficerTeam( + val code: String? = null, + val description: String? = null, + val teamEmail: String? = null, + val teamTelephoneNumber: String? = null, +) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt new file mode 100644 index 000000000..e7b352102 --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt @@ -0,0 +1,3 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1.person + +class PersonResponsibleOfficerControllerTest From dac5b8e107c572c5af7425e94171266ce7a4e5d5 Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 12 Apr 2024 14:29:00 +0100 Subject: [PATCH 04/19] Renamed according to acronym --- .../gateways/ManagePOMCaseGateway.kt | 8 +++---- .../models/hmpps/PersonResponsibleOfficer.kt | 2 +- ...cerManager.kt => PrisonOffenderManager.kt} | 2 +- .../managePOMCase/AllocationPrimaryPOM.kt | 6 ++--- ...tPrisonOffenderManagerForPersonService.kt} | 14 ++++++------ ...sonOffenderManagerForPersonServiceTest.kt} | 22 +++++++++---------- 6 files changed, 27 insertions(+), 27 deletions(-) rename src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/{PrisonOfficerManager.kt => PrisonOffenderManager.kt} (83%) rename src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/{GetPrisonOfficerManagerForPersonService.kt => GetPrisonOffenderManagerForPersonService.kt} (62%) rename src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/{GetPrisonOfficerManagerForPersonServiceTest.kt => GetPrisonOffenderManagerForPersonServiceTest.kt} (78%) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt index e2732158c..86363d768 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt @@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Value import org.springframework.http.HttpMethod import org.springframework.stereotype.Component import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.WebClientWrapper -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOfficerManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOffenderManager import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.managePOMCase.AllocationPrimaryPOM @@ -19,7 +19,7 @@ class ManagePOMCaseGateway( @Autowired lateinit var hmppsAuthGateway: HmppsAuthGateway - fun getPrimaryPOMForNomisNumber(id: String): Response { + fun getPrimaryPOMForNomisNumber(id: String): Response { val result = webClient.request( HttpMethod.GET, @@ -30,12 +30,12 @@ class ManagePOMCaseGateway( return when (result) { is WebClientWrapper.WebClientWrapperResponse.Success -> { - Response(data = result.data.toPrisonOfficerManager()) + Response(data = result.data.toPrisonOffenderManager()) } is WebClientWrapper.WebClientWrapperResponse.Error -> { Response( - data = PrisonOfficerManager(), + data = PrisonOffenderManager(), errors = result.errors, ) } diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficer.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficer.kt index 40a49712a..a0431645e 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficer.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficer.kt @@ -1,6 +1,6 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps data class PersonResponsibleOfficer( - val prisonOfficerManager: PrisonOfficerManager = PrisonOfficerManager(), + val prisonOffenderManager: PrisonOffenderManager = PrisonOffenderManager(), val communityOffenderManager: CommunityOffenderManager = CommunityOffenderManager(), ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOfficerManager.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOffenderManager.kt similarity index 83% rename from src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOfficerManager.kt rename to src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOffenderManager.kt index ee9a543b1..222bd4e2c 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOfficerManager.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PrisonOffenderManager.kt @@ -1,6 +1,6 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps -data class PrisonOfficerManager( +data class PrisonOffenderManager( val forename: String? = null, val surname: String? = null, val prison: Prison = Prison(), diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt index 7c6349787..c6b80a1d0 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/managePOMCase/AllocationPrimaryPOM.kt @@ -1,14 +1,14 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.managePOMCase import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Prison -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOfficerManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOffenderManager data class AllocationPrimaryPOM( val manager: AllocationManager = AllocationManager(), val prison: AllocationPrison = AllocationPrison(), ) { - fun toPrisonOfficerManager(): PrisonOfficerManager = - PrisonOfficerManager( + fun toPrisonOffenderManager(): PrisonOffenderManager = + PrisonOffenderManager( forename = this.manager.forename, surname = this.manager.surname, prison = diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOffenderManagerForPersonService.kt similarity index 62% rename from src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonService.kt rename to src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOffenderManagerForPersonService.kt index 0002f4a82..3204b2beb 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOffenderManagerForPersonService.kt @@ -3,26 +3,26 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.services import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.ManagePOMCaseGateway -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOfficerManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOffenderManager import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response @Service -class GetPrisonOfficerManagerForPersonService( +class GetPrisonOffenderManagerForPersonService( @Autowired val getPersonService: GetPersonService, @Autowired val managePOMCaseGateway: ManagePOMCaseGateway, ) { - fun execute(hmppsId: String): Response { + fun execute(hmppsId: String): Response { val personResponse = getPersonService.execute(hmppsId = hmppsId) val nomisNumber = personResponse.data?.identifiers?.nomisNumber - var prisonOfficeManager: Response = Response(data = PrisonOfficerManager()) + var prisonOffenderManager: Response = Response(data = PrisonOffenderManager()) if (nomisNumber != null) { - prisonOfficeManager = managePOMCaseGateway.getPrimaryPOMForNomisNumber(nomisNumber) + prisonOffenderManager = managePOMCaseGateway.getPrimaryPOMForNomisNumber(nomisNumber) } return Response( - data = prisonOfficeManager.data, - errors = personResponse.errors + prisonOfficeManager.errors, + data = prisonOffenderManager.data, + errors = personResponse.errors + prisonOffenderManager.errors, ) } } diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOffenderManagerForPersonServiceTest.kt similarity index 78% rename from src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonServiceTest.kt rename to src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOffenderManagerForPersonServiceTest.kt index 892d114ba..81fc46348 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOfficerManagerForPersonServiceTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPrisonOffenderManagerForPersonServiceTest.kt @@ -13,37 +13,37 @@ import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.ManagePOMCaseGa import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Identifiers import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Prison -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOfficerManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOffenderManager import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError @ContextConfiguration( initializers = [ConfigDataApplicationContextInitializer::class], - classes = [GetPrisonOfficerManagerForPersonService::class], + classes = [GetPrisonOffenderManagerForPersonService::class], ) -class GetPrisonOfficerManagerForPersonServiceTest( +class GetPrisonOffenderManagerForPersonServiceTest( @MockBean val managePOMCaseGateway: ManagePOMCaseGateway, @MockBean val getPersonService: GetPersonService, - private val getPrisonOfficerManagerForPersonService: GetPrisonOfficerManagerForPersonService, + private val getPrisonOffenderManagerForPersonService: GetPrisonOffenderManagerForPersonService, ) : DescribeSpec( { val hmppsId = "1234/56789B" val nomisNumber = "Z99999ZZ" val person = Person(firstName = "Julianna", lastName = "Blake", identifiers = Identifiers(nomisNumber = nomisNumber)) - val prisonOfficerManager = PrisonOfficerManager(forename = "Paul", surname = "Smith", prison = Prison(code = "RED")) + val prisonOffenderManager = PrisonOffenderManager(forename = "Paul", surname = "Smith", prison = Prison(code = "RED")) beforeEach { Mockito.reset(getPersonService) Mockito.reset(managePOMCaseGateway) whenever(getPersonService.execute(hmppsId = hmppsId)).thenReturn(Response(person)) - whenever(managePOMCaseGateway.getPrimaryPOMForNomisNumber(id = nomisNumber)).thenReturn(Response(prisonOfficerManager)) + whenever(managePOMCaseGateway.getPrimaryPOMForNomisNumber(id = nomisNumber)).thenReturn(Response(prisonOffenderManager)) } it("performs a search according to hmpps Id") { - getPrisonOfficerManagerForPersonService.execute(hmppsId) + getPrisonOffenderManagerForPersonService.execute(hmppsId) verify(getPersonService, VerificationModeFactory.times(1)).execute(hmppsId = hmppsId) } @@ -53,8 +53,8 @@ class GetPrisonOfficerManagerForPersonServiceTest( data = person, ), ) - val result = getPrisonOfficerManagerForPersonService.execute(hmppsId) - result.shouldBe(Response(data = prisonOfficerManager)) + val result = getPrisonOffenderManagerForPersonService.execute(hmppsId) + result.shouldBe(Response(data = prisonOffenderManager)) } it("should return a list of errors if person not found") { @@ -70,8 +70,8 @@ class GetPrisonOfficerManagerForPersonServiceTest( ), ), ) - val result = getPrisonOfficerManagerForPersonService.execute("NOT_FOUND") - result.data.shouldBe(PrisonOfficerManager()) + val result = getPrisonOffenderManagerForPersonService.execute("NOT_FOUND") + result.data.shouldBe(PrisonOffenderManager()) result.errors.first().type.shouldBe(UpstreamApiError.Type.ENTITY_NOT_FOUND) } }, From f3b007f9ca5343de0b084e1fc0a1df56626a3110 Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 12 Apr 2024 14:50:40 +0100 Subject: [PATCH 05/19] Committed wrong file, controller-side of things not ready yet --- .../PersonResponsibleOfficerController.kt | 37 ------------------- 1 file changed, 37 deletions(-) delete mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt deleted file mode 100644 index 054ab9fad..000000000 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt +++ /dev/null @@ -1,37 +0,0 @@ -package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1.person - -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.exception.EntityNotFoundException -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.decodeUrlCharacters -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficer -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetPrisonOfficerManagerForPersonService -import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.internal.AuditService - -@RestController -@RequestMapping("/v1/persons") -class PersonResponsibleOfficerController( - @Autowired val auditService: AuditService, - @Autowired val getPrisonOfficerManagerForPersonService: GetPrisonOfficerManagerForPersonService, -) { - @GetMapping("{encodedHmppsId}/person-responsible-officer") - fun getPersonResponsibleOfficer( - @PathVariable encodedHmppsId: String, - ): Map { - val hmppsId = encodedHmppsId.decodeUrlCharacters() - val prisonOfficerManager = getPrisonOfficerManagerForPersonService.execute(hmppsId) -// val communityOfficerManager = getCommunityOfficerManagerForPersonService.execute(hmppsId) - - if (prisonOfficerManager.hasError(UpstreamApiError.Type.ENTITY_NOT_FOUND)) { - throw EntityNotFoundException("Could not find prison officer manager related to id: $hmppsId") - } - - auditService.createEvent("GET_PERSON_RESPONSIBLE_OFFICER", mapOf("hmppsId" to hmppsId)) -// return mapOf("data" to response.data) - return mapOf("data" to PersonResponsibleOfficer()) - } -} From fa2e0d7c548dc70be4d391ca3343e5fc250d0506 Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 15 Apr 2024 10:18:37 +0100 Subject: [PATCH 06/19] HIA-697 - NDelius retrieve community-manager related data --- .../gateways/NDeliusGateway.kt | 23 ++++ .../hmpps/PersonResponsibleOfficerTeam.kt | 6 +- .../models/ndelius/NDeliusCommunityManager.kt | 25 ++++ .../models/ndelius/NDeliusName.kt | 6 + .../models/ndelius/NDeliusProvider.kt | 6 + .../models/ndelius/NDeliusSupervisions.kt | 1 + .../models/ndelius/NDeliusTeam.kt | 8 ++ ...etCommunityOffenderManagerForPersonTest.kt | 109 ++++++++++++++++++ .../fixtures/GetSupervisionsResponse.json | 17 +++ .../models/ndelius/SupervisionsTest.kt | 2 + 10 files changed, 200 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusCommunityManager.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusName.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusProvider.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusTeam.kt create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetCommunityOffenderManagerForPersonTest.kt diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NDeliusGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NDeliusGateway.kt index 879eeb711..1a9676d17 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NDeliusGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NDeliusGateway.kt @@ -6,6 +6,7 @@ import org.springframework.http.HttpMethod import org.springframework.stereotype.Component import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.WebClientWrapper import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.WebClientWrapper.WebClientWrapperResponse +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.CommunityOffenderManager import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.MappaDetail import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Offence import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response @@ -91,6 +92,28 @@ class NDeliusGateway( } } + fun getCommunityOffenderManagerForPerson(id: String): Response { + val result = + webClient.request( + HttpMethod.GET, + "/case/$id/supervisions", + authenticationHeader(), + UpstreamApi.NDELIUS, + ) + return when (result) { + is WebClientWrapperResponse.Success -> { + Response(data = result.data.communityManager?.toCommunityOffenderManager()) + } + + is WebClientWrapperResponse.Error -> { + Response( + data = null, + errors = result.errors, + ) + } + } + } + private fun authenticationHeader(): Map { val token = hmppsAuthGateway.getClientToken("nDelius") diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerTeam.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerTeam.kt index 0ec19ec31..eb27202f4 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerTeam.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/PersonResponsibleOfficerTeam.kt @@ -1,8 +1,8 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps -class PersonResponsibleOfficerTeam( +data class PersonResponsibleOfficerTeam( val code: String? = null, val description: String? = null, - val teamEmail: String? = null, - val teamTelephoneNumber: String? = null, + val email: String? = null, + val telephoneNumber: String? = null, ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusCommunityManager.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusCommunityManager.kt new file mode 100644 index 000000000..698905a48 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusCommunityManager.kt @@ -0,0 +1,25 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.ndelius + +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.CommunityOffenderManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficerName +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficerTeam + +data class NDeliusCommunityManager( + val code: String? = null, + val name: NDeliusName = NDeliusName(), + val username: String? = null, + val email: String? = null, + val telephoneNumber: String? = null, + val team: NDeliusTeam = NDeliusTeam(), + val allocated: Boolean? = null, +) { + fun toCommunityOffenderManager(): CommunityOffenderManager = + ( + CommunityOffenderManager( + name = PersonResponsibleOfficerName(forename = this.name.forename, surname = this.name.surname), + email = this.email, + telephoneNumber = this.telephoneNumber, + team = PersonResponsibleOfficerTeam(code = this.team.code, description = this.team.description, email = this.team.email, telephoneNumber = this.team.telephoneNumber), + ) + ) +} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusName.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusName.kt new file mode 100644 index 000000000..5b889f70c --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusName.kt @@ -0,0 +1,6 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.ndelius + +data class NDeliusName( + val forename: String? = null, + val surname: String? = null, +) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusProvider.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusProvider.kt new file mode 100644 index 000000000..bece8787d --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusProvider.kt @@ -0,0 +1,6 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.ndelius + +data class NDeliusProvider( + val code: String? = null, + val description: String? = null, +) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusSupervisions.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusSupervisions.kt index 1e9ca5496..e1cd81c10 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusSupervisions.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusSupervisions.kt @@ -1,6 +1,7 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.ndelius data class NDeliusSupervisions( + val communityManager: NDeliusCommunityManager? = null, val mappaDetail: NDeliusMappaDetail? = null, val supervisions: List, ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusTeam.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusTeam.kt new file mode 100644 index 000000000..208301217 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusTeam.kt @@ -0,0 +1,8 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.ndelius + +data class NDeliusTeam( + val code: String? = null, + val description: String? = null, + val email: String? = null, + val telephoneNumber: String? = null, +) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetCommunityOffenderManagerForPersonTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetCommunityOffenderManagerForPersonTest.kt new file mode 100644 index 000000000..7ea68c6c4 --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetCommunityOffenderManagerForPersonTest.kt @@ -0,0 +1,109 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.ndelius + +import io.kotest.core.spec.style.DescribeSpec +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.shouldBe +import org.mockito.Mockito +import org.mockito.internal.verification.VerificationModeFactory +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer +import org.springframework.boot.test.mock.mockito.MockBean +import org.springframework.http.HttpStatus +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.context.ContextConfiguration +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.HmppsAuthGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.NDeliusGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.HmppsAuthMockServer +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.NDeliusApiMockServer +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.CommunityOffenderManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficerName +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficerTeam +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError +import java.io.File + +@ActiveProfiles("test") +@ContextConfiguration( + initializers = [ConfigDataApplicationContextInitializer::class], + classes = [NDeliusGateway::class], +) +class GetCommunityOffenderManagerForPersonTest( + @MockBean + val hmppsAuthGateway: HmppsAuthGateway, + val nDeliusGateway: NDeliusGateway, +) : DescribeSpec( + { + val nDeliusApiMockServer = NDeliusApiMockServer() + val deliusCrn = "X777776" + + beforeEach { + nDeliusApiMockServer.start() + nDeliusApiMockServer.stubGetSupervisionsForPerson( + deliusCrn, + File( + "src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/fixtures/GetSupervisionsResponse.json", + ).readText(), + ) + + Mockito.reset(hmppsAuthGateway) + whenever(hmppsAuthGateway.getClientToken("nDelius")).thenReturn(HmppsAuthMockServer.TOKEN) + } + + afterTest { + nDeliusApiMockServer.stop() + } + + it("authenticates using HMPPS Auth with credentials") { + nDeliusGateway.getCommunityOffenderManagerForPerson(deliusCrn) + + verify(hmppsAuthGateway, VerificationModeFactory.times(1)).getClientToken("nDelius") + } + + it("returns community offender manager related to the matching CRN") { + val response = nDeliusGateway.getCommunityOffenderManagerForPerson(deliusCrn) + + response.data.shouldBe( + CommunityOffenderManager( + name = PersonResponsibleOfficerName(forename = "John", surname = "Smith"), + email = "johnsmith@email.com", + telephoneNumber = "077777777", + team = + PersonResponsibleOfficerTeam( + code = "Code1", + description = "Description", + email = "team@email.com", + telephoneNumber = "07888888", + ), + ), + ) + } + + it("returns an empty object if no community offender manager is found") { + nDeliusApiMockServer.stubGetSupervisionsForPerson( + deliusCrn, + """ + { + "communityManager": {}, + "mappaDetail": {}, + "supervisions": [] + } + """, + ) + + val response = nDeliusGateway.getCommunityOffenderManagerForPerson(deliusCrn) + + response.data.shouldBe(CommunityOffenderManager()) + } + + it("returns an error when 404 Not Found is returned because no person is found") { + nDeliusApiMockServer.stubGetSupervisionsForPerson(deliusCrn, "", HttpStatus.NOT_FOUND) + + val response = nDeliusGateway.getCommunityOffenderManagerForPerson(deliusCrn) + + response.errors.shouldHaveSize(1) + response.errors.first().causedBy.shouldBe(UpstreamApi.NDELIUS) + response.errors.first().type.shouldBe(UpstreamApiError.Type.ENTITY_NOT_FOUND) + } + }, + ) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/fixtures/GetSupervisionsResponse.json b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/fixtures/GetSupervisionsResponse.json index 121848853..9c6c5c1dc 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/fixtures/GetSupervisionsResponse.json +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/fixtures/GetSupervisionsResponse.json @@ -1,4 +1,21 @@ { + "communityManager": { + "code": "Code1", + "name": { + "forename": "John", + "surname": "Smith" + }, + "username": "JohnSmithUsername", + "email": "johnsmith@email.com", + "telephoneNumber": "077777777", + "team": { + "code": "Code1", + "description": "Description", + "email": "team@email.com", + "telephoneNumber": "07888888" + }, + "allocated": true + }, "mappaDetail": { "level": 1, "levelDescription": "string", diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/SupervisionsTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/SupervisionsTest.kt index db553fa19..fc85252f0 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/SupervisionsTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/SupervisionsTest.kt @@ -213,6 +213,7 @@ class SupervisionsTest : DescribeSpec( it("maps one-to-one attributes to integration API sentence attributes") { val supervisions = NDeliusSupervisions( + communityManager = NDeliusCommunityManager(), mappaDetail = NDeliusMappaDetail(), listOf( NDeliusSupervision( @@ -276,6 +277,7 @@ class SupervisionsTest : DescribeSpec( it("can be constructed with NULL values") { val supervisions = NDeliusSupervisions( + communityManager = NDeliusCommunityManager(), mappaDetail = NDeliusMappaDetail(), listOf( NDeliusSupervision(custodial = true), From 0fc61cb9b129b47b830282022f51fde7945a040a Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 15 Apr 2024 10:42:42 +0100 Subject: [PATCH 07/19] HIA-697: Adding the service related to community manager --- ...ommunityOffenderManagerForPersonService.kt | 27 +++++++ ...nityOffenderManagerForPersonServiceTest.kt | 80 +++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonService.kt create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonServiceTest.kt diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonService.kt new file mode 100644 index 000000000..d650e37ac --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonService.kt @@ -0,0 +1,27 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.services + +import org.springframework.beans.factory.annotation.Autowired +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.NDeliusGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.CommunityOffenderManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response + +class GetCommunityOffenderManagerForPersonService( + @Autowired val getPersonService: GetPersonService, + @Autowired val nDeliusGateway: NDeliusGateway, +) { + fun execute(hmppsId: String): Response { + val personResponse = getPersonService.execute(hmppsId = hmppsId) + + val deliusCrn = personResponse.data?.identifiers?.deliusCrn + var nDeliusMappaDetailResponse: Response = Response(data = CommunityOffenderManager()) + + if (deliusCrn != null) { + nDeliusMappaDetailResponse = nDeliusGateway.getCommunityOffenderManagerForPerson(id = deliusCrn) + } + + return Response( + data = nDeliusMappaDetailResponse.data, + errors = personResponse.errors + nDeliusMappaDetailResponse.errors, + ) + } +} diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonServiceTest.kt new file mode 100644 index 000000000..5a5da37a1 --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonServiceTest.kt @@ -0,0 +1,80 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.services + +import io.kotest.core.spec.style.DescribeSpec +import io.kotest.matchers.shouldBe +import org.mockito.Mockito +import org.mockito.internal.verification.VerificationModeFactory +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer +import org.springframework.boot.test.mock.mockito.MockBean +import org.springframework.test.context.ContextConfiguration +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.NDeliusGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.CommunityOffenderManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Identifiers +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficerName +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficerTeam +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError + +@ContextConfiguration( + initializers = [ConfigDataApplicationContextInitializer::class], + classes = [GetCommunityOffenderManagerForPersonService::class], +) +class GetCommunityOffenderManagerForPersonServiceTest( + @MockBean val nDeliusGateway: NDeliusGateway, + @MockBean val getPersonService: GetPersonService, + private val getCommunityOffenderManagerForPersonService: GetCommunityOffenderManagerForPersonService, +) : DescribeSpec( + { + val hmppsId = "1234/56789B" + val deliusCrn = "X224466" + + val person = Person(firstName = "Sam", lastName = "Smith", identifiers = Identifiers(deliusCrn = deliusCrn)) + + val communityOffenderManager = CommunityOffenderManager(name = PersonResponsibleOfficerName(forename = "Michael", surname = "Green"), email = "email@email.com", telephoneNumber = "07471234567", team = PersonResponsibleOfficerTeam(code = "Code2", description = "Service description", email = "email2@email2.com", telephoneNumber = "07170987654")) + + beforeEach { + Mockito.reset(getPersonService) + Mockito.reset(nDeliusGateway) + + whenever(getPersonService.execute(hmppsId = hmppsId)).thenReturn(Response(person)) + whenever(nDeliusGateway.getCommunityOffenderManagerForPerson(id = deliusCrn)).thenReturn(Response(communityOffenderManager)) + } + + it("performs a search according to hmpps Id") { + getCommunityOffenderManagerForPersonService.execute(hmppsId) + verify(getPersonService, VerificationModeFactory.times(1)).execute(hmppsId = hmppsId) + } + + it("Returns a community offender manager for person given a hmppsId") { + whenever(getPersonService.execute(hmppsId = hmppsId)).thenReturn( + Response( + data = person, + ), + ) + val result = getCommunityOffenderManagerForPersonService.execute(hmppsId) + result.shouldBe(Response(data = communityOffenderManager)) + } + + it("should return a list of errors if person not found") { + whenever(getPersonService.execute(hmppsId = "NOT_FOUND")).thenReturn( + Response( + data = null, + errors = + listOf( + UpstreamApiError( + causedBy = UpstreamApi.NDELIUS, + type = UpstreamApiError.Type.ENTITY_NOT_FOUND, + ), + ), + ), + ) + val result = getCommunityOffenderManagerForPersonService.execute("NOT_FOUND") + result.data.shouldBe(CommunityOffenderManager()) + result.errors.first().type.shouldBe(UpstreamApiError.Type.ENTITY_NOT_FOUND) + } + }, + ) From 66388cb769ef84770b168a5cc680b7ae67a01d5a Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 15 Apr 2024 12:32:31 +0100 Subject: [PATCH 08/19] HIA-697 - Adding controller and initial test --- .../PersonResponsibleOfficerController.kt | 48 ++++++++++++ .../gateways/NDeliusGateway.kt | 6 +- .../models/ndelius/NDeliusSupervisions.kt | 2 +- ...ommunityOffenderManagerForPersonService.kt | 6 +- .../PersonResponsibleOfficerControllerTest.kt | 78 ++++++++++++++++++- .../ndelius/GetMappaDetailForPersonTest.kt | 1 + .../ndelius/GetOffencesForPersonTest.kt | 1 + .../ndelius/GetSentencesForPersonTest.kt | 1 + .../models/ndelius/SupervisionsTest.kt | 4 + 9 files changed, 140 insertions(+), 7 deletions(-) create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt new file mode 100644 index 000000000..63481e357 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerController.kt @@ -0,0 +1,48 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1.person + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.exception.EntityNotFoundException +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.decodeUrlCharacters +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficer +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetCommunityOffenderManagerForPersonService +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetPrisonOffenderManagerForPersonService +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.internal.AuditService + +@RestController +@RequestMapping("/v1/persons") +class PersonResponsibleOfficerController( + @Autowired val auditService: AuditService, + @Autowired val getPrisonOffenderManagerForPersonService: GetPrisonOffenderManagerForPersonService, + @Autowired val getCommunityOffenderManagerForPersonService: GetCommunityOffenderManagerForPersonService, +) { + @GetMapping("{encodedHmppsId}/person-responsible-officer") + fun getPersonResponsibleOfficer( + @PathVariable encodedHmppsId: String, + ): Map { + val hmppsId = encodedHmppsId.decodeUrlCharacters() + val prisonOffenderManager = getPrisonOffenderManagerForPersonService.execute(hmppsId) + val communityOffenderManager = getCommunityOffenderManagerForPersonService.execute(hmppsId) + + if (prisonOffenderManager.hasError(UpstreamApiError.Type.ENTITY_NOT_FOUND)) { + throw EntityNotFoundException("Could not find prison offender manager related to id: $hmppsId") + } + + if (communityOffenderManager.hasError(UpstreamApiError.Type.ENTITY_NOT_FOUND)) { + throw EntityNotFoundException("Could not find community offender manager related to id: $hmppsId") + } + + val mergedData = + PersonResponsibleOfficer( + prisonOffenderManager = prisonOffenderManager.data, + communityOffenderManager = communityOffenderManager.data, + ) + + auditService.createEvent("GET_PERSON_RESPONSIBLE_OFFICER", mapOf("hmppsId" to hmppsId)) + return mapOf("data" to mergedData) + } +} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NDeliusGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NDeliusGateway.kt index 1a9676d17..a4e33d00c 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NDeliusGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NDeliusGateway.kt @@ -92,7 +92,7 @@ class NDeliusGateway( } } - fun getCommunityOffenderManagerForPerson(id: String): Response { + fun getCommunityOffenderManagerForPerson(id: String): Response { val result = webClient.request( HttpMethod.GET, @@ -102,12 +102,12 @@ class NDeliusGateway( ) return when (result) { is WebClientWrapperResponse.Success -> { - Response(data = result.data.communityManager?.toCommunityOffenderManager()) + Response(data = result.data.communityManager.toCommunityOffenderManager()) } is WebClientWrapperResponse.Error -> { Response( - data = null, + data = CommunityOffenderManager(), errors = result.errors, ) } diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusSupervisions.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusSupervisions.kt index e1cd81c10..daaddd4af 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusSupervisions.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/NDeliusSupervisions.kt @@ -1,7 +1,7 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.ndelius data class NDeliusSupervisions( - val communityManager: NDeliusCommunityManager? = null, + val communityManager: NDeliusCommunityManager, val mappaDetail: NDeliusMappaDetail? = null, val supervisions: List, ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonService.kt index d650e37ac..50021aeb2 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetCommunityOffenderManagerForPersonService.kt @@ -1,19 +1,21 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.services import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.NDeliusGateway import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.CommunityOffenderManager import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response +@Service class GetCommunityOffenderManagerForPersonService( @Autowired val getPersonService: GetPersonService, @Autowired val nDeliusGateway: NDeliusGateway, ) { - fun execute(hmppsId: String): Response { + fun execute(hmppsId: String): Response { val personResponse = getPersonService.execute(hmppsId = hmppsId) val deliusCrn = personResponse.data?.identifiers?.deliusCrn - var nDeliusMappaDetailResponse: Response = Response(data = CommunityOffenderManager()) + var nDeliusMappaDetailResponse: Response = Response(data = CommunityOffenderManager()) if (deliusCrn != null) { nDeliusMappaDetailResponse = nDeliusGateway.getCommunityOffenderManagerForPerson(id = deliusCrn) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt index e7b352102..e573d0ee8 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt @@ -1,3 +1,79 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1.person -class PersonResponsibleOfficerControllerTest +import io.kotest.core.spec.style.DescribeSpec +import io.kotest.matchers.shouldBe +import org.mockito.Mockito +import org.mockito.kotlin.whenever +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest +import org.springframework.boot.test.mock.mockito.MockBean +import org.springframework.http.HttpStatus +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.web.servlet.MockMvc +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.helpers.IntegrationAPIMockMvc +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.CommunityOffenderManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficerName +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Prison +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOffenderManager +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetCommunityOffenderManagerForPersonService +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetPrisonOffenderManagerForPersonService +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.internal.AuditService +import java.net.URLEncoder +import java.nio.charset.StandardCharsets + +@WebMvcTest(controllers = [PersonResponsibleOfficerController::class]) +@ActiveProfiles("test") +internal class PersonResponsibleOfficerControllerTest( + @Autowired var springMockMvc: MockMvc, + @MockBean val auditService: AuditService, + @MockBean val getCommunityOffenderManagerForPersonService: GetCommunityOffenderManagerForPersonService, + @MockBean val getPrisonOffenderManagerForPersonService: GetPrisonOffenderManagerForPersonService, +) : DescribeSpec() { + init { + val hmppsId = "9999/11111A" + val encodedHmppsId = URLEncoder.encode(hmppsId, StandardCharsets.UTF_8) + val path = "/v1/persons/$encodedHmppsId/person-responsible-officer" + val mockMvc = IntegrationAPIMockMvc(springMockMvc) + + describe("GET $path") { + beforeTest { + Mockito.reset(getPrisonOffenderManagerForPersonService) + Mockito.reset(getCommunityOffenderManagerForPersonService) + whenever(getPrisonOffenderManagerForPersonService.execute(hmppsId)).thenReturn( + Response( + PrisonOffenderManager( + forename = "Paul", + surname = "Reds", + prison = Prison(code = "PrisonCode1"), + ), + ), + ) + + whenever(getCommunityOffenderManagerForPersonService.execute(hmppsId)).thenReturn( + Response( + CommunityOffenderManager( + name = PersonResponsibleOfficerName("Helen", surname = "Miller"), + email = "helenemail@email.com", + telephoneNumber = "0987654321", + team = + PersonResponsibleOfficerTeam( + code = "PrisonCode2", + description = "Description", + email = "email_again@email.com", + telephoneNumber = "01234567890", + ), + ), + ), + ) + Mockito.reset(auditService) + } + + it("returns a 200 OK status code") { + val result = mockMvc.performAuthorised(path) + + result.response.status.shouldBe(HttpStatus.OK.value()) + } + } + } +} diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetMappaDetailForPersonTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetMappaDetailForPersonTest.kt index c2c1b20a5..38018e7a8 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetMappaDetailForPersonTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetMappaDetailForPersonTest.kt @@ -79,6 +79,7 @@ class GetMappaDetailForPersonTest( deliusCrn, """ { + "communityManager": {}, "mappaDetail": {}, "supervisions": [] } diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetOffencesForPersonTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetOffencesForPersonTest.kt index 3ab0b8be2..02ddcb1bf 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetOffencesForPersonTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetOffencesForPersonTest.kt @@ -139,6 +139,7 @@ class GetOffencesForPersonTest( deliusCrn, """ { + "communityManager": {}, "mappaDetail": null, "supervisions": [] } """, diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetSentencesForPersonTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetSentencesForPersonTest.kt index e7e4733e2..c8736792e 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetSentencesForPersonTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ndelius/GetSentencesForPersonTest.kt @@ -104,6 +104,7 @@ class GetSentencesForPersonTest( deliusCrn, """ { + "communityManager": {}, "mappaDetail": {}, "supervisions": [] } """, diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/SupervisionsTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/SupervisionsTest.kt index fc85252f0..a49c21ca0 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/SupervisionsTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/ndelius/SupervisionsTest.kt @@ -17,6 +17,7 @@ class SupervisionsTest : DescribeSpec( it("maps one-to-one attributes to integration API attributes") { val supervisions = NDeliusSupervisions( + communityManager = NDeliusCommunityManager(), mappaDetail = NDeliusMappaDetail(), supervisions = listOf( @@ -83,6 +84,7 @@ class SupervisionsTest : DescribeSpec( it("does not local date parse additional offence date if no date is provided") { val supervisions = NDeliusSupervisions( + communityManager = NDeliusCommunityManager(), mappaDetail = NDeliusMappaDetail(), supervisions = listOf( @@ -122,6 +124,7 @@ class SupervisionsTest : DescribeSpec( it("does local date parse additional offence date if a date is provided") { val supervisions = NDeliusSupervisions( + communityManager = NDeliusCommunityManager(), mappaDetail = NDeliusMappaDetail(), supervisions = listOf( @@ -166,6 +169,7 @@ class SupervisionsTest : DescribeSpec( it("maps one-to-one attributes to integration API attributes") { val supervisions = NDeliusSupervisions( + communityManager = NDeliusCommunityManager(), mappaDetail = NDeliusMappaDetail(), supervisions = listOf( From 1c9afdd9b1ca35febe0d0e9c03030950a261c66e Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 15 Apr 2024 12:33:11 +0100 Subject: [PATCH 09/19] Missed one import --- .../v1/person/PersonResponsibleOfficerControllerTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt index e573d0ee8..07ea330b0 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt @@ -13,6 +13,7 @@ import org.springframework.test.web.servlet.MockMvc import uk.gov.justice.digital.hmpps.hmppsintegrationapi.helpers.IntegrationAPIMockMvc import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.CommunityOffenderManager import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficerName +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficerTeam import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Prison import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PrisonOffenderManager import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response From a2b6e664a6d18f37509964d3a2882afa9f30af92 Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 15 Apr 2024 13:47:15 +0100 Subject: [PATCH 10/19] HIA-697 - Added unit test for controller. --- .../PersonResponsibleOfficerControllerTest.kt | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt index 07ea330b0..e4f666948 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonResponsibleOfficerControllerTest.kt @@ -2,7 +2,10 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1.person import io.kotest.core.spec.style.DescribeSpec import io.kotest.matchers.shouldBe +import io.kotest.matchers.string.shouldContain import org.mockito.Mockito +import org.mockito.internal.verification.VerificationModeFactory +import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest @@ -10,6 +13,7 @@ import org.springframework.boot.test.mock.mockito.MockBean import org.springframework.http.HttpStatus import org.springframework.test.context.ActiveProfiles import org.springframework.test.web.servlet.MockMvc +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.removeWhitespaceAndNewlines import uk.gov.justice.digital.hmpps.hmppsintegrationapi.helpers.IntegrationAPIMockMvc import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.CommunityOffenderManager import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonResponsibleOfficerName @@ -75,6 +79,52 @@ internal class PersonResponsibleOfficerControllerTest( result.response.status.shouldBe(HttpStatus.OK.value()) } + + it("gets the person responsible officer for a person with the matching ID") { + mockMvc.performAuthorised(path) + verify(getCommunityOffenderManagerForPersonService, VerificationModeFactory.times(1)).execute(hmppsId) + } + + it("logs audit") { + mockMvc.performAuthorised(path) + + verify( + auditService, + VerificationModeFactory.times(1), + ).createEvent("GET_PERSON_RESPONSIBLE_OFFICER", mapOf("hmppsId" to hmppsId)) + } + + it("returns the person responsible officer for a person with the matching ID") { + val result = mockMvc.performAuthorised(path) + + result.response.contentAsString.shouldContain( + """ + "data": { + "prisonOffenderManager": { + "forename": "Paul", + "surname": "Reds", + "prison": { + "code": "PrisonCode1" + } + }, + "communityOffenderManager": { + "name": { + "forename": "Helen", + "surname": "Miller" + }, + "email": "helenemail@email.com", + "telephoneNumber": "0987654321", + "team": { + "code": "PrisonCode2", + "description": "Description", + "email": "email_again@email.com", + "telephoneNumber": "01234567890" + } + } + } + """.removeWhitespaceAndNewlines(), + ) + } } } } From 4037eb5ceaa2c01a53b3ec4d75e8cb36bbb6340f Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 15 Apr 2024 14:31:44 +0100 Subject: [PATCH 11/19] HIA-697 - WIP Smoke test --- src/main/resources/application-dev.yml | 1 + .../resources/application-local-docker.yml | 1 + src/main/resources/application-local.yml | 1 + src/main/resources/application-test.yml | 1 + .../PersonResponsibleOfficerSmokeTest.kt | 51 +++++++++++++++++++ 5 files changed, 55 insertions(+) create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 307490b16..a46848f0c 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -62,3 +62,4 @@ authorisation: - "/v1/persons/.*/risks/scores" - "/v1/persons/.*/risks" - "/v1/persons/.*/licences/conditions" + - "/v1/persons/.*/person-responsible-officer" diff --git a/src/main/resources/application-local-docker.yml b/src/main/resources/application-local-docker.yml index a86d27ed6..bb3f2fd10 100644 --- a/src/main/resources/application-local-docker.yml +++ b/src/main/resources/application-local-docker.yml @@ -39,6 +39,7 @@ authorisation: - "/v1/persons/.*/risks" - "/v1/persons/.*/reported-adjudications" - "/v1/persons/.*/case-notes" + - "/v1/persons/.*/person-responsible-officer" - "/v1/epf/person-details/.*/.*" - "/health" - "/health/ping" diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 9fd40b353..3dec6146d 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -46,6 +46,7 @@ authorisation: - "/v1/persons/.*/risks" - "/v1/persons/.*/reported-adjudications" - "/v1/persons/.*/case-notes" + - "/v1/persons/.*/person-responsible-officer" - "/v1/epf/person-details/.*/.*" - "/health" - "/health/ping" diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 491b7ef26..7b8828032 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -57,6 +57,7 @@ authorisation: - "/v1/persons/.*/adjudications" - "/v1/persons/.*/licences/conditions" - "/v1/persons/.*/case-notes" + - "/v1/persons/.*/person-responsible-officer" - "/health" - "/health/ping" - "/health/readiness" diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt new file mode 100644 index 000000000..0c59d0bc2 --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt @@ -0,0 +1,51 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.smoke.person + +import io.kotest.assertions.json.shouldEqualJson +import io.kotest.core.spec.style.DescribeSpec +import io.kotest.matchers.shouldBe +import org.springframework.http.HttpStatus +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.helpers.IntegrationAPIHttpClient +import java.net.URLEncoder +import java.nio.charset.StandardCharsets + +class PersonResponsibleOfficerSmokeTest : DescribeSpec( + { + val hmppsId = "A1234AA" + val encodedHmppsId = URLEncoder.encode(hmppsId, StandardCharsets.UTF_8) + + val basePath = "v1/persons/$encodedHmppsId/person-responsible-officer" + val httpClient = IntegrationAPIHttpClient() + + it("returns the person responsible officer for a person") { + val response = httpClient.performAuthorised(basePath) + response.statusCode().shouldBe(HttpStatus.OK.value()) + response.body().shouldEqualJson( + """ + "data": { + "prisonOffenderManager": { + "forename": "Paul", + "surname": "Reds", + "prison": { + "code": "PrisonCode1" + } + }, + "communityOffenderManager": { + "name": { + "forename": "Helen", + "surname": "Miller" + }, + "email": "helenemail@email.com", + "telephoneNumber": "0987654321", + "team": { + "code": "PrisonCode2", + "description": "Description", + "email": "email_again@email.com", + "telephoneNumber": "01234567890" + } + } + } + """.trimIndent(), + ) + } + }, +) From b375e7d8aa5d3011b979e9b5b9653ddd24e03661 Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 15 Apr 2024 14:59:52 +0100 Subject: [PATCH 12/19] WIO - Adding actual data in smoke --- .../PersonResponsibleOfficerSmokeTest.kt | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt index 0c59d0bc2..82f714887 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt @@ -22,25 +22,26 @@ class PersonResponsibleOfficerSmokeTest : DescribeSpec( response.body().shouldEqualJson( """ "data": { - "prisonOffenderManager": { - "forename": "Paul", - "surname": "Reds", + "manager": { + "code": 0, + "forename": "string", + "surname": "string", "prison": { - "code": "PrisonCode1" + "code": "string" } }, - "communityOffenderManager": { + "communityManager": { "name": { - "forename": "Helen", - "surname": "Miller" + "forename": "string", + "surname": "string" }, - "email": "helenemail@email.com", - "telephoneNumber": "0987654321", + "email": "string", + "telephoneNumber": "string", "team": { - "code": "PrisonCode2", - "description": "Description", - "email": "email_again@email.com", - "telephoneNumber": "01234567890" + "code": "string", + "description": "string", + "email": "string", + "telephoneNumber": "string" } } } From 838d0aebdd81447b0cecc2835e6f0c34e47c73db Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 15 Apr 2024 17:47:28 +0100 Subject: [PATCH 13/19] Smoke test ok --- openapi.yml | 93 ++++++++++++++++++- .../gateways/ManagePOMCaseGateway.kt | 2 +- .../mockservers/ManagePOMCaseApiMockServer.kt | 2 +- .../PersonResponsibleOfficerSmokeTest.kt | 41 ++++---- 4 files changed, 115 insertions(+), 23 deletions(-) diff --git a/openapi.yml b/openapi.yml index 4b9626117..0202c3dee 100644 --- a/openapi.yml +++ b/openapi.yml @@ -722,6 +722,37 @@ paths: NoQueryParametersBadRequestError: $ref: "#/components/examples/InternalServerError" + /v1/persons/{Id}/person-responsible-officer: + get: + summary: Returns the person responsible officer associated with a person. + parameters: + - $ref: "#/components/parameters/HmppsId" + responses: + "200": + description: Successfully found the person responsible officer for a person with the provided HMPPS ID. + content: + application/json: + schema: + $ref: "#/components/schemas/PersonResponsibleOfficer" + "404": + description: Failed to find licenses for a person with the provided HMPPS ID. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + examples: + PersonNotFoundError: + $ref: "#/components/examples/PersonNotFoundError" + "500": + description: An upstream service was not responding, so we cannot verify the accuracy of any data we did get. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + examples: + NoQueryParametersBadRequestError: + $ref: "#/components/examples/InternalServerError" + /v1/persons/{HmppsId}/licences/conditions: get: summary: Returns license conditions associated with a person. @@ -1269,6 +1300,19 @@ components: releaseDate: type: string format: date + CommunityOffenderManager: + type: object + properties: + name: + $ref: "#/components/schemas/PersonResponsibleOfficerName" + email: + type: string + nullable: true + telephoneNumber: + type: string + nullable: true + team: + $ref: "#/components/schemas/PersonResponsibleOfficerTeam" ContactDetails: properties: phoneNumbers: @@ -1755,6 +1799,30 @@ components: description: Currently a hmppsId is a CRN identifier however this will change in the future to be a new unique Hmpps identifier contactDetails: $ref: "#/components/schemas/ContactDetails" + PersonResponsibleOfficerName: + type: object + properties: + forename: + type: string + nullable: true + surname: + type: string + nullable: true + PersonResponsibleOfficerTeam: + type: object + properties: + code: + type: string + nullable: true + description: + type: string + nullable: true + email: + type: string + nullable: true + telephoneNumber: + type: string + nullable: true PhoneNumbers: type: array items: @@ -1768,6 +1836,13 @@ components: type: string example: "TELEPHONE" description: "The type of number" + PersonResponsibleOfficer: + type: object + properties: + prisonOffenderOfficer: + $ref: "#/components/schemas/PrisonOffenderOfficer" + communityOffenderManager: + $ref: "#/components/schemas/CommunityOffenderManager" PersonLicencesData: type: object properties: @@ -1839,7 +1914,23 @@ components: minItems: 0 items: $ref: "#/components/schemas/ReasonableAdjustment" - + Prison: + type: object + properties: + code: + type: string + nullable: true + PrisonOffenderOfficer: + type: object + properties: + forename: + type: string + nullable: true + surname: + type: string + nullable: true + prison: + $ref: "#/components/schemas/Prison" Punishment: type: object diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt index 86363d768..bba085a76 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ManagePOMCaseGateway.kt @@ -23,7 +23,7 @@ class ManagePOMCaseGateway( val result = webClient.request( HttpMethod.GET, - "/allocation/$id/primary_pom", + "/api/allocation/$id/primary_pom", authenticationHeader(), UpstreamApi.MANAGE_POM_CASE, ) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/ManagePOMCaseApiMockServer.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/ManagePOMCaseApiMockServer.kt index 8dbe0057d..d51c5383e 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/ManagePOMCaseApiMockServer.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/ManagePOMCaseApiMockServer.kt @@ -15,7 +15,7 @@ class ManagePOMCaseApiMockServer : WireMockServer(WIREMOCK_PORT) { status: HttpStatus = HttpStatus.OK, ) { stubFor( - WireMock.get("/allocation/$id/primary_pom") + WireMock.get("/api/allocation/$id/primary_pom") .withHeader( "Authorization", WireMock.matching("Bearer ${HmppsAuthMockServer.TOKEN}"), diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt index 82f714887..2bf7eefb7 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonResponsibleOfficerSmokeTest.kt @@ -21,29 +21,30 @@ class PersonResponsibleOfficerSmokeTest : DescribeSpec( response.statusCode().shouldBe(HttpStatus.OK.value()) response.body().shouldEqualJson( """ - "data": { - "manager": { - "code": 0, - "forename": "string", - "surname": "string", - "prison": { - "code": "string" - } + { + "data": { + "prisonOffenderManager": { + "forename": "string", + "surname": "string", + "prison": { + "code": "string" + } }, - "communityManager": { - "name": { - "forename": "string", - "surname": "string" - }, + "communityOffenderManager": { + "name": { + "forename": "string", + "surname": "string" + }, + "email": "string", + "telephoneNumber": "string", + "team": { + "code": "string", + "description": "string", "email": "string", - "telephoneNumber": "string", - "team": { - "code": "string", - "description": "string", - "email": "string", - "telephoneNumber": "string" - } + "telephoneNumber": "string" + } } + } } """.trimIndent(), ) From 119013a2dc6de5aba5143a22c2ec3a7cf2289933 Mon Sep 17 00:00:00 2001 From: Bingjie Liu Date: Tue, 16 Apr 2024 10:09:26 +0100 Subject: [PATCH 14/19] Delete localstack/cache directory --- localstack/cache/machine.json | 1 - localstack/cache/server.test.pem.crt | 91 ------------------ .../cache/service-catalog-3_0_2-1_32_5.pickle | Bin 368617 -> 0 bytes 3 files changed, 92 deletions(-) delete mode 100644 localstack/cache/machine.json delete mode 100644 localstack/cache/server.test.pem.crt delete mode 100644 localstack/cache/service-catalog-3_0_2-1_32_5.pickle diff --git a/localstack/cache/machine.json b/localstack/cache/machine.json deleted file mode 100644 index 22efc5605..000000000 --- a/localstack/cache/machine.json +++ /dev/null @@ -1 +0,0 @@ -{"machine_id": "dkr_f88a0859f471"} \ No newline at end of file diff --git a/localstack/cache/server.test.pem.crt b/localstack/cache/server.test.pem.crt deleted file mode 100644 index f0372edb4..000000000 --- a/localstack/cache/server.test.pem.crt +++ /dev/null @@ -1,91 +0,0 @@ ------BEGIN CERTIFICATE----- -MIILCzCCCfOgAwIBAgISBIVWexzWmz28L0Tuwgnyi5jAMA0GCSqGSIb3DQEBCwUA -MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD -EwJSMzAeFw0yNDA0MDEwNTA3NTNaFw0yNDA2MzAwNTA3NTJaMCUxIzAhBgNVBAMT -GmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3VkMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEApf3YbHC/LbmnZLEow717o2cdLA9w+z6ivclosN9cjK8l58sE -1+MXG3XQsGRpRT+1B59AB91XjVyXQDu3cf3PQtIlqfwvlPB/bM0oTchxGqs1PiAy -i6ljPlqyW0VgElqAzo0E5JZBSSngXsTgc9pN/w/k3tk54d6+Cv+vbf/op7g+8sT7 -r4R643upVHwcjt9EXyKPk048p4OS6UHLSixzVUD8ieu6EngxhT6cyAVw1AiDcHIz -wTIltnnnfs511jUkwZFypEiFiWhVGt330ils+xb90C4yTBCd6S6yUsD99fgPOEvU -mGEafPdtCsiM0RRixQ8APDGW1lKpFtlDcMYVCQIDAQABo4IIJjCCCCIwDgYDVR0P -AQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB -Af8EAjAAMB0GA1UdDgQWBBSniWd2PpKOrKEfsxUaIuZe/RBJYTAfBgNVHSMEGDAW -gBQULrMXt1hWy65QCUDmH6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUH -MAGGFWh0dHA6Ly9yMy5vLmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3Iz -LmkubGVuY3Iub3JnLzCCBi4GA1UdEQSCBiUwggYhgicqLmFtcGxpZnlhcHAubG9j -YWxob3N0LmxvY2Fsc3RhY2suY2xvdWSCJyouY2xvdWRmcm9udC5sb2NhbGhvc3Qu -bG9jYWxzdGFjay5jbG91ZIIxKi5ka3IuZWNyLmV1LWNlbnRyYWwtMS5sb2NhbGhv -c3QubG9jYWxzdGFjay5jbG91ZIIuKi5ka3IuZWNyLmV1LXdlc3QtMS5sb2NhbGhv -c3QubG9jYWxzdGFjay5jbG91ZIIuKi5ka3IuZWNyLnVzLWVhc3QtMS5sb2NhbGhv -c3QubG9jYWxzdGFjay5jbG91ZIIuKi5ka3IuZWNyLnVzLWVhc3QtMi5sb2NhbGhv -c3QubG9jYWxzdGFjay5jbG91ZIIuKi5ka3IuZWNyLnVzLXdlc3QtMS5sb2NhbGhv -c3QubG9jYWxzdGFjay5jbG91ZIIuKi5ka3IuZWNyLnVzLXdlc3QtMi5sb2NhbGhv -c3QubG9jYWxzdGFjay5jbG91ZIIgKi5lbGIubG9jYWxob3N0LmxvY2Fsc3RhY2su -Y2xvdWSCNCouZXUtY2VudHJhbC0xLm9wZW5zZWFyY2gubG9jYWxob3N0LmxvY2Fs -c3RhY2suY2xvdWSCMSouZXUtd2VzdC0xLm9wZW5zZWFyY2gubG9jYWxob3N0Lmxv -Y2Fsc3RhY2suY2xvdWSCKCouZXhlY3V0ZS1hcGkubG9jYWxob3N0LmxvY2Fsc3Rh -Y2suY2xvdWSCNCoubGFtYmRhLXVybC5ldS1jZW50cmFsLTEubG9jYWxob3N0Lmxv -Y2Fsc3RhY2suY2xvdWSCMSoubGFtYmRhLXVybC5ldS13ZXN0LTEubG9jYWxob3N0 -LmxvY2Fsc3RhY2suY2xvdWSCMSoubGFtYmRhLXVybC51cy1lYXN0LTEubG9jYWxo -b3N0LmxvY2Fsc3RhY2suY2xvdWSCMSoubGFtYmRhLXVybC51cy1lYXN0LTIubG9j -YWxob3N0LmxvY2Fsc3RhY2suY2xvdWSCMSoubGFtYmRhLXVybC51cy13ZXN0LTEu -bG9jYWxob3N0LmxvY2Fsc3RhY2suY2xvdWSCMSoubGFtYmRhLXVybC51cy13ZXN0 -LTIubG9jYWxob3N0LmxvY2Fsc3RhY2suY2xvdWSCHCoubG9jYWxob3N0LmxvY2Fs -c3RhY2suY2xvdWSCJyoub3BlbnNlYXJjaC5sb2NhbGhvc3QubG9jYWxzdGFjay5j -bG91ZIInKi5zMy13ZWJzaXRlLmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3Vkgh8q -LnMzLmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3VkgiAqLnNjbS5sb2NhbGhvc3Qu -bG9jYWxzdGFjay5jbG91ZIImKi5zbm93Zmxha2UubG9jYWxob3N0LmxvY2Fsc3Rh -Y2suY2xvdWSCMSoudXMtZWFzdC0xLm9wZW5zZWFyY2gubG9jYWxob3N0LmxvY2Fs -c3RhY2suY2xvdWSCMSoudXMtZWFzdC0yLm9wZW5zZWFyY2gubG9jYWxob3N0Lmxv -Y2Fsc3RhY2suY2xvdWSCMSoudXMtd2VzdC0xLm9wZW5zZWFyY2gubG9jYWxob3N0 -LmxvY2Fsc3RhY2suY2xvdWSCMSoudXMtd2VzdC0yLm9wZW5zZWFyY2gubG9jYWxo -b3N0LmxvY2Fsc3RhY2suY2xvdWSCGmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3Vk -gitzcXMuZXUtY2VudHJhbC0xLmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3Vkgihz -cXMuZXUtd2VzdC0xLmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3VkgihzcXMudXMt -ZWFzdC0xLmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3VkgihzcXMudXMtZWFzdC0y -LmxvY2FsaG9zdC5sb2NhbHN0YWNrLmNsb3VkgihzcXMudXMtd2VzdC0xLmxvY2Fs -aG9zdC5sb2NhbHN0YWNrLmNsb3VkgihzcXMudXMtd2VzdC0yLmxvY2FsaG9zdC5s -b2NhbHN0YWNrLmNsb3VkMBMGA1UdIAQMMAowCAYGZ4EMAQIBMIIBAwYKKwYBBAHW -eQIEAgSB9ASB8QDvAHUAouK/1h7eLy8HoNZObTen3GVDsMa1LqLat4r4mm31F9gA -AAGOmEV4BQAABAMARjBEAiBSnRBkciS/1wFaxlzCNtuN5ps6DmgQmCA3liV33I3U -mAIgCiXzRhDMyer6tnL/aftjaRZEDtchBQtIuaAfbQUpvyUAdgB2/4g/Crb7lVHC -Ycz1h7o0tKTNuyncaEIKn+ZnTFo6dAAAAY6YRXgNAAAEAwBHMEUCIFouiSzvnHWS -Rx+Mz68Gyl1fmNBx+T8jWnvlpCVRE9jWAiEA7ZjgdMuYfhiQZURRSgC9LQQcH4x5 -pfjYYYust25xHqIwDQYJKoZIhvcNAQELBQADggEBAJSfCwKRizqEdo0BKmV4AvPD -HGMiYSRAhy/Ct0p4lSkK3h0VElm0YjWd9WLJwi3sdZZwFtCvyCfpeptbrzG2a2HJ -ueysDQ+qNUWWt9EwQWZ0aO2zmoHx2frq0LOqc4qWTT7HH4C5bEAvwt890VTgD+mh -nAJV0TjKtBFxFqMM2YCR++Xqi7e5w9L02T6MDNNOB3Y8+DxkoGK0jaTf83LnHN6X -EWCjRJeRSiW0+8pIiRF4YZBVB1tw9fPR1OO7UBJQcUysOfh9XBhyz8a8x2kPulbL -rcoTbdXMOz29dRQfvCCMLHeypYpQxNvSYmUqBDSa9hgR1N7yiX3C/3GEfC4iQN4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw -WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg -RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP -R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx -sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm -NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg -Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG -/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB -Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA -FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw -AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw -Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB -gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W -PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl -ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz -CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm -lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 -avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 -yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O -yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids -hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ -HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv -MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX -nLRbwHOoq7hHwg== ------END CERTIFICATE----- \ No newline at end of file diff --git a/localstack/cache/service-catalog-3_0_2-1_32_5.pickle b/localstack/cache/service-catalog-3_0_2-1_32_5.pickle deleted file mode 100644 index 61d541c47b0f55cebd5a492187af81559253bf6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368617 zcmeFad6;F%RUZf{sk`=l>3wf?O08_Fsuy)@L1blBb(K`vRjRD&mO-MqneS%C%X*nF z`z=+SVvJz~*x&@yrokAn4VoE@J;s0;K;T(ygJ3XYK!9MdS&WTkgE1IJvH>BO-|sAO zBksK~tMNDU`5#N)SDo*i6A>p)oH%jf#EH0H`ucA;@>!q#S^VGTp*eCBn}_Dh!S(K9Ia`d1UVr)gTBm&Z)vtf`O<(rvpMP~~bI(w*FRm4<n?4)irVzA1#nfaby!9LXbgNV%FpRyJn9c2!R{JrJe*>>Ys2nx7}W|a_J^bOL4T>+Qz@;lLxe#a zAB@-52qlxl(V#3uZuom+4J_>|28+`l>_fuS!_ZxVWN#@(pgF33iqRtYyLF-L4El@Lz=!=c4R%M} zRnY8T==LZ82(~j`L`gOVVTpl+L=PmtI{nq6yXNGhLD2<6`-DJ#Osj@!Z8vm8b}#lj zsA|+*Di*=d4*rzc!Jgr7C@3c55U8Ea_yVRMS^GC^R#Ktt6<{kcx*FLu`p>H}%0NTa?;aT`QOPR7uQ)p9Uxf{bXT%PGeO*V` z-hjF9lWJeb{!}9c=8v<)A0)(0;Wjhcd zI{W7c%i3Y_I)<4L3c~F*X_{rsUclCqP*t0yq z%G`nUw2M2I$Hk!28Pf#c63U`Cf_2)dfAnC*(d_`$+n{K{S(nSw9=F(D&u@001Wzp<&mib!I>W2P+t6;tF`7TmTf01-g!(`|(o?6rJncAsgQT zkdHmv(Z8+XT>vcguo#6gbd8nCuNz&CI~x@HS&q1>tAD@}!!CRlAz_81z?BT+v<{iG ziqVbk+A4&O#z}nxiln-^t$STqzCMJl#u&*mdMkji9uUwQt`$qy=nBYxP zz52&A=EyZ!C3j%a67@x`w*piSsi=3^U(?j{{xnxA*qF|=tjAbzbF@K^}~@JQ&5R(oK1VEo5|{YORrd6=%A}WjMo;!^o{NZ zq1R9__?y$PTxAcXcJW8_Tz2Ev^^*~~M}J22J}42^gmOB%Ru9%7)9B~;<>}#gVYoQx zV!06y@qs$k7*?iEw4*2Pp)B>=>4ocTd_DYa@VUR&?_cX<5qoLeg^S1)X0L%(%MpB3 zk$}=bS=CmpLRR}$VJI=2@OTDmG6=T-(k+2Hpxx*!ptWmI8+sha8n9_INrzU80bDqE zj5OnPCi-x3L0>_|T=vA-hUz33EXr8)7Ga~|g6QnpEy@xVGya6}rG*e|Pu4RHebo=2sR9{6)ST3Uhodk}nT6R2+}PF zfF`|x#;q=6e&Sz9?C#aB?FFVW@i7_cfAulETnjKNha#S6bXYbUx24cNrWKqeGv0?& zlt9a6n&Q`(jPDLxI<^;Q{$}cuCk&tb+H$>%|5&dU|oNu|DdH@k4)aZv)!^?#Is2 zT?vS~fDY_h#~RMv5d1rs+vL}@TkJzAFiz^%aa*_@d%E>L78}UN|C}!2ghOBlBVf2X zgu=-d;z$!XP0f1){WbLO4eR|Ly@FfUF*il2_TjJV*r1yDL30b1o)Mjj*T2-GuI=W3 zrr}cR^xcW6zIaVGjTjrq3WS3NPSR}y@xbt}$z%JV?ARu7kN;_?L-BVyaJvTOHF2WF zP@v4P+w0Q5lC=wEhW#<->oitu%n=wXbZuXR(qULf2X1qS0!GC$=a1~OcW?!^g=-Jo z;1aQbjT-?@9Atvxqw>keS%LnAS)*>~^kNSlGFQ8Mn<#at;}p81L4k#^!<7rH?KPzC zqyX4w0J7YJk)agF5b5iN;A6+|aZF6z_w5`$Ua9F0Y$Blsvi=^4e@_=DyVatxw}O}0 z+rGMaPX$;i3(Qm92v#KyR|LytABJMom3>MDjyC;31&bQHdstkDoQJk~-+?8+?2I*l zz`s`u^mp5kDzz6r#{k>yIN5jkCQh9c|D}E%sNMM;lv}atoBU>|yraLMMTPvUk{B70Y>}EOeAG={P{u z)H^y{>)$X}&Q@Yw5VsQnR~U14+mQRTZNrzO>`Oym#I_B&3*U`@)$

Zx4TV*A~Tx zMS)xSdstwn335nb2mXbPS>@E*&cFNJ4z??Mps4Fha4pQp?KM9p#!j}0rMq=FURSqw zm;FT{vF;m7Fq_!WA!?&*;&yn*SOvI!-%p1QQbf?lc~3z%un(uj9<5=Jcj``O&|Ls% zyZpdz34F_+J=h$`bu{3_>O@!e5TuJ;ciDkaTIZyn1;&;Gx+iVQND8X5aJ66CcOxiTk5|2VpqbFj7T1wg%_bQ zg>nu~$1=q6fmg$hVsrP*?A#?a#IrMm?JPF;&%n^7j!%$|G!ZT4>rPZiiPZY1d2i_IM~>+6>_f(QD$Kz}LF+|N*vE)DuG zr}TG|v(*Ay`WcPkp~!v3=EKeb*}#;)gm4|ENee#@7MpjRk|5qiR9<34%i)XHPaZ#c z;yC_Kjvr=+UYI{6@i$}jSqqo~{T4-^wkRTz?UF)c$}y+hB_@l zF`}OEQfG_JBP?~v0+Cwot;e5XxpxjTKJ-yS?>{x7!) zkHxYHko7!s0{^gq3&rN`90QGhowqn?BI4(Y&HI}K&^2z91_|Ls>7ob9gxM1(PQI0m zycdcDp;$m|PGe}Kc>2Wg$B&cZG6xbASi>)RKrN|z9(7X$)YsF9EhVTc#pb=>@8STF z`c>Br)4_!73osc@V}s#RW}`0_o4d}g4u%QY7XhSm=Jd?_o|mCpK-;G!`gIo3FLM3l z@uyA-sssJH$jt?o+{p0<66_{>(|yo?)?hbRI7KVypca6`Kz@wck=__|{AR`lRm zM%hr}6{^Pz^XDX1#y&lD+`9VLip`x0zQD*CXupZ;%?tB!_R0|f;NJo`23o^n$q@fd z%(nCWD>FD(S}4LA2N~`(7Xqp7yP)wv&oeY%cCN(O5^DVW#pd1T`=cuoQhJslB{92a zvUTixpoL)PJrWjbG0PuOlcM;`h%ZXGsD0* zK2dBQ2K#fD<}7-VH2iOM_RV?J;vAxtDDv;L$0>MjjIbi+0MBic3jRGz=G+xTA1)&p zg-I7z7Mclgd_vZd{|Lo;PJ<6L0*pO?aZo_+Z10m`@gmI8yhIpSy+z%D`yu^7NDs^=GjDT+(2}Y!Yjz&8d~o##wkA z)k{fO;RCO(yk2m30lLJ4Kv+}vnAE16lvQ-)Rv|lh$)XDLbMwzLZty(2zOqY@hcH0! zL>FOqqTwQTueE+-h=m*eB87JRttYu=tn3%uuJ>LzeQF-=GB@vl9u(+qm|}?maOouY zb^#xBa3qmb+~61FItb6_43%#L|D?{l&N2kb2Z zt8Z$7c&i|eS|8pkyHyVTGg$s192Occ*QHL z#Emx(GN3}u#UX8(?2PyEoNzdtmPkBL!eMT2g*OARr03x0_Cj-X@FzCRz^qE54t`>< zysdabmWy5d6EQ$Qcauo-arko&R-{_K4xoGC1~ig(0N)1(sY=N~`Kho!94v9l`!ZY_ zoY^y)Na%s^=gKr)hpHb z%W|@hpZ8#WMl2;u?E(1SBIftt7h(f>k`G|_V?R_R=|=!PfMqNJS-KAp2p4$H4}Lv_ zA*&_+0E&QtLoKpJ_TN}|4iJ7k0@ghdhyyYe-c+`v|A6w%Y*2H6@as{QvqT{LMC^gt zK=^AKwM)8=jQL~XbHed(BAg75W2PrbJD_|56-p>Tw%Ck0$gf59k5y{|Vh;5*9u$46 zLuCnUpah9*iCOOnt7$TM(ZDo8D>2l%&P;~;pZ_OSbJ5AT5H3djyl2z_VxT;U#x zKM2U-L;*z+m}sQ)0Q`C2!A`m{cS$&dfnG$kASU(zb_yCqm}d6?fMA9YNmQ08K7gHO zcR;kLc|L$3t|1Uh_5lRpj4Hb)X8Zv0Y>Mz0F>5`SB5-`6d22wNHx^>L3SbC`RB1r? z{T{e{WQmavKfPh(gB2sTF)1Mk*f~sNPx_H4EwhjSe-0{N!Pf~wXallH@`C`oBt7?- z2B{F`Xvq`;0>KSI(DYR4LO>v_;Wh)Isbp(<4fq%TmV3x>V% z<9))NY~eI92(ZtGDP?vL{`>+|Yf|OU_d|d@$CK z)qCs1pqy)svkXo9l1keVwxRI^|_y?;xU?4na35YLdCp6U3>lYnn z`QVg748v6T@4}yltu^#&fq-2SiK*u{p|ZaKtH+F|VYb!!Qt~AEmU1wrSx%t-GKgGM zb}Ib$;SbB0@&wd}FwRxp698Y1LGg?y%H%7clK$J)@9>pEV_8t3`HK)CQ=#zZU*eyt z8wdeaNl_f$uMU41x{)VCp~xnSAR`KYehrGmv?%=kT1+9&jl$2r0@*ebq=5LkVpFrE z@HgT&F;xmb|0h@#4t0^l2AB``afGKF7%4HfAxIbQ?h zn^2%io&w;nqbJOu!k^!aN#(|k3$9GZZ-FecTq+QLtH6?kD!~2*Du%9GRuuq<8`V>* z0R3CwD3ZxU`8KRX^p4UbD-eD=`9h`@{`@ecgFk6_`15}tn_0>gfd8Wcle8-U|0nX~ zxmPGU6}}_*ce>bIrwf!Q!*It)|cABBGmTgqfARPiH_b)HcL;E#egORK`K zkD?XLt+LcAzb1;yr zGJ}2|GpL?q1%i)5R+ednU%vo5gm4iy&}q6A5Wk3>NCRO+p0f{Qgt?jyYS1PVmAI+>^E>E!00HLDZGk ziEr1;)7SKh#XZjrLg&H}Z@Q}<~K9JUWQ^;bV=WxLd~P5tYsl^rbl zF8=d*Qa(u>Vf8zSVf=OFjG!%D3oY!%Z^%>Aw(xt8{Eq2cfM{TLzol_a+dxs^EBl1l z^SJ=fK&|F=vE2h8kT@-Nf=OBzC=W?dN$LBmOM;Vt_m#kjZ&tAknDvP4mY<`H)n$RUR3L9u}f{ zJ{b@ex;Ey-eTFq<7d3P(`DOSuB^5BwjGFK!{91W4{(&JJK0cjHv6V-KFiANhJwx6r z)BNW#{_{Ef=LG*biGRw?_Ea*odK_q&@GMmf;Kv1=q>KUfgurg~)GO&$LIcKzf<=yxP%NJA8K%v3yv(*U273S){IAkPV8H@pPorg2w* z)GUB63Rp7O@Jr+SlF8ObM3Bqq%6o<47Hp75vemOle?5;4lp5fdd^Y^LVk}r*8z36u z-#JtWf|;!Td1C-+Zuq59{xsbU!1oDBmG%aZhW>Z*gkRI&P&kYDOU@ez-!Em;+&2I< z{$J(50i=QdBo_`ajqvZS<-`H;MN(;NZXB={`j;Fzq{soHq5mvZ4$wvIIaB8FOAi6^ z)H#4P@NX$}_-*0-dMX_-%Tk@E)Bz9#P^H!Z)U800Vh7Ml1(H-dfb`&?HRTT2o)kz^ z?*NqZgw1*i9uR9nt*LnU+2_yk=KenN2{r9IId#}SgIN2Fqok z&KR+hG$xcEQW|OmjyWQj8n2GrlOQ$1hPw6(u;SN=cN3npI~8sX-x&U8__pv1<)$=K zA3iU6h$V4sJUrV+PLjF?V4M}~4tsEVb0i!M$HHyl_HbvoE8HFK3HOEj!^7bb93;Fs zJQ}7$asm*Z2v3H$hG!6Ep9!bJnQ%5d8_tFE;oadvm#Dg!hHd4_^@8 zA3hMiFnm!c!eZ!z5V{CAUJJdj8ioOPw8HgpBfK0o!Uw}&2wxh$EPN<@dH9O(m%>*e z>a-cYCVXx9y6{&S`3c{E4u4bl>)~6a+ut5O%s@u?&hU4_-wl5+d{_AU;k(24gzpXi zfZP4>{ox0~N5T(8O{|0euq_^t5U;rGJthfju2h5r=(bNGYsN8yjdXTqO^KNXK#-D>*I>M7GN z78h6@U-4||$%;oRUZ}dB^fJYplyIx~e&XthUnlOH_+a92iH{||kvKBqzlg^oK81J? z;xdSrAgjHs?Xq6Wsx0fT_}{Yd%3>=Et1OqYB+9BMYn&`-vWCeTC2NqZH?m^L3L$Gk zb?7UWUo5@Yb}{B+h{f)TxfSCo7FCR=7)-H;Vgbc;iNS&b&to?+s%x-KuLFW~)kO}j z>^Cu2c0sEhY#O~wbQ))u6ZQI`n`-tu{>+-aAiBK-?WSh0Wtu%%t6yp8^|ysTt5*L= z_^4_2PfgJ6RI@)3bvxDUPyc_X+uS&*f^%OpS-0u(i%b7nbemZv|D_5}|E*QG=?MM* zuGV|5A{X?(spx-GQRo^sKdmV!p`hKWLf*4Bc{R*xI7;Y zKP9UqF3X%QHBYKZwi-TcLo~gVZ0H<@h9au2-N>@I zBkaVn_<6bf-^6vTQSm$zG)2WqE4Gd%o@7F3-9JW=w(~~TZ@-Mp*z2V@qJ#cwv;6+c z*m>M&!jU>DQQaoy2o`^2Oq((yhvAIvu-M*hs=rAoUX!pq2jK6}T}pzV!G^pqFRNfY zcjDU5WQrNS>~k5H^E7M^;{8foWvPkuc1kF*+`OZq8uiBZE5(HJyA3NlG_5&202le2 zp;^BYJ|kOV97D9|R=u4^wxVfv>w#RIVr_}oIQ$U69g`@BvJ(Tv4p2mcF%@=V)1W>0 zX!sTD!NUzD-J-?)=ZC{_*}@6cGy!`RT}}P~C;LcIiCQ&%C)}|gwei~Snr^b*6&?!j z2=59DIEMdd_(b^K@Q2~k5)?${8}vTw)>nmJDL3zgZu0cFg%3H|02c=?<58GvDTRsh z7$(UUc7@mKzRe5(EUi9!gAU3aF2nDMcs^7F;8fV98!oQt zB`&>5m4EZL`F=}_y_)CCwE26VO-qSA1=Y8PU}w+qos zpDLU2{VCanW80`@6?c{QR!>`c1cv^gBHN^|n2FL?^i8F&WOeD^R)J*%E){q)fcHOa z=nXG8o0j@OgW+u$Aj05!5)fUfH#yGxjiLtP>F0NEJ6JGlV1&ubU_F1A@j1_V)j6CiiismYr0~^d58x&6A%}7> z^Za~NJnG1<%OzjTl7ePC0Fs+K$#jKRO(&z`&PWgHjjzN4xJdUZ#%6#+_b603@UeN6 zkvq9LmMg0lvZ_p5z0~`0=BlO0r_&x#kaR~TizAHIO$T-2s;pC3>E_}7&#bLsKeVXt z9jR}DcGo(MF7J~#qV`~(k9R8ZeFAQdJ=k;WEalO?dJ2~ z^h&h^SHntq1;J|Brv&jJc3Uv^No+g3G9K@>3kcqvMj#s8l$*EFTDBCGxria!OMEP+6WU~ZJB-+tJvd4e zIFT#cvux43?+@soDQ{$92F`#pw?juB9)gVd9_-MVmZXO(Z{c4|BtR#Xj_-89Oq{_& zjH@Q{b`A7!53)53k0fxs2+N7FC!C3HwZ2DTt$l3*kG$MOv>QSPgclJ&%KkImH|_(?VO5;;>Md$FxMFThJ(?ZF#8% zz_fq&Y!9!Qng~g|H_ntCXuDej>J?`a+fLu%np{JKdX8Vn%QKHg8|9UJGB@Or?kCjc15j zQ{_d?&Y7ZbUlAJ_1MC$rtAX>30i*rKjVLbg^} z8@2wacJTopsQsD-kMU2w+vW^mXQKRsyC#Xbp&bq?O%%VP3Q_g_6FHuf}LW&SN+6&(+qOulu z(43~-k)3DkOd@+YHO|Y~ULlu7*{RFr65^&I6`tDSiYd-UvZ{&|xpJm_p703(?F;hyNX_}ZvDHc5X{yKr?zuSNRm2osbZQ1 zJTt6SA6BLmmK2d;HXN76*kGnuN-#;W9NVr~5t}NO0-K7Z@Tft?yhWxXI8iJu&`_*9 z&f-DVAoW*TG@O;k_f;VKDvA_*ySogNRER!F5+2mItGjw8nJMyC=;}}EgG6)dQ^X6By_N}b2zxe6lJN63 zO~`FU7P*yle{4I6onQvpdIRUJGY*|0a{~#Ft`+UYg?V|fr#|t7--wC)!ed93y7t<5 z{&**jmg@=bQwA~X#0Yw>G1gdPiW^+!nALAPf;jCAY|7J^c;*CROKM+r5`iB;D*uJBgxs?a zAzs9T0?f|_%?0586pDt2SFvZ$(BS~4hv5dFmcemJgp}| zC!@!D%`=x5-?Sv|BD@rS3%1=h0la%yD`cK+j5^MjcqN-(AX8prJT)?}&Q*hXt7o=9 z80x;hN~#myv{(yo2)6S$K`^E(+2JZWhIGG#r1Fkys5%|nN=_MC-vS1FZm(mPZc-QsOnHH972YoQdCwL?+^1-TF#__Hzx7}3O=`1 zpz*Ijv%eL7&%9UL!SY2xJd&m-YN)|@h~U~`1SsxP9?oI@mz|8)#Hy1QpF8ofHWP@7 z$=JA+wAtNC#%FPkX$sf!H`$b8HK4S33+J>r7jYBf>8_5I@OP@Mp#oAcLRM>N$730 zYL;;RQbRdSD2?_BLaE3#BdqHTv}LlfzKbOQmvSQ6&%{n&4G+hE6#1@1z5nEMi6@# z3FPpd2Dz?OukVuJ*eQO36Lm0EM7@G5#ZVszJHlwDdPoqld(;xqWc5H>v~dE~3@osx z@R2^vaYZ2mpI=)B(`t98!V!zhoAr%IoV&w6$=XzdGpWsp&D&IPtk(Fq6!Qpfw#IGp zgr;a8>U|?D)@F^Ui(s8?wxHKtYw{J|t7HZKx$I$|NK?g#C12Yg(+cA}G@KRBbG_l5F<4}@WB=+q2@03pj7 zfp-uwZ^h&s#e9`aDwpvPCcm1ct%|xtj)fsJ>}XNOJtB47kA@!%zbS9lShw_?2GVmp z#1|9hVqt5JDfw{^)E{6^C`U*!T#80_i0b4$!8v(nF6*4aTm9zdift)h#s5|Ph}0-S;gotiaX*@{$R%xjTCKqcg8A9cm7 zJp(5NMI$IXFIkhR_{UkF&SCOcVl&y~T&h?^puuYt&$+@lSTc!>4~I$Gg*Qy#6#V-i zvs);8HOs=$Hl~&o+b&Qacb$b54+gJNP!k#1ebl5GFkvj%im8`)vb@r%a7Xw8KOx|C zy$l=ffc5lHLsYRCivw0nOub$a3y{1-TE~fSq|F#aY;E?SZoEAbYOx8vQ*J)N9MT6U z4?rwU>G>``n^g3yh~X?qV7TXS=4l8EoEbu*D{^$+sBd0he6nJ8Hrd9P&eD`Gg|zdP z;ZnXbM9x=+%K5^9ug;tn&Y}yF@P>3nrI!}0bI=n7wz3?}O;eayM6-e!+x1#=#t(1; zrc8_WaGZ%C$C@AG5UE<{*qsspC0Wj|*C3nPgjt8noHw{~>KJ(o#xTaFqw<9DRBGmt zB*L|*dd`(Aq)zIDEmz14kx4MGFPGmDU-<2_CYnsbI`6_4aC8=7Ki9VfEHi~hWoanp zlleAHX#?UVPyfPn)+@Wtkrpi&KcRj}i0P&zJ^ZJd@{7uxu)4h}K)Pnz#a< zZCeNowiE+guFUw7Ug`UN6aLa!HiCjn=l%XTuEDB^ zVzdH#&qc`@K<)U7C}LTuI@T$6%=Xte&f{C@dZuxAcnOa`m^sY5Vw*?rp!L`Kd4FES zkcbT8legGZT)lk32z?9cUs+V^Xvla}5x=o!2s_yGo=@TM0^3gG%W7Cu8L`V@k#aFC7Oj6}vuRC}ORGkG1lBF`Tk`lNJRx zw7lsCQxLJVDqd9PMO>>V45f320oOi7)6*i@=x3A2o7o7Tuym)(cofwGFDdOfs{I}W~V+zl(V`ANAZ}n$w>nml;D*M zqwK^nCo?siOe2@5Y}SpVPE8Y~tb`wH0x`CC3NGbW-^EMy%193}V%c5`0-OwHR?FCa z0$S>@@L78;9$Ra-W@=WOg11x`Z=F-`yJD`*gc(q!&E&Ryca***1l*G@*>mLpFZ|2L zR$uD15zI@{UxOg7pWPS~M!lZJjtHujgP5oAN@fv0VkbRT&cD}Z_-DdLF-vtpnbZ^< zBmdMQKRIT5e@_(zB(60%OKOW5+^n+{KJHA};$a^V%$QPClPQJQnNn!N)V_2IRr1Z| z>Vz@KXeJE9?laem-WUggyevVTh8&JL%o2~1+)$$TNcuBaNe7PkCIGpr=*ExK@=R<_ zE19-Uaef^46i`ds$g)I3f|eOO=*u@?&>};ptMYLWYqus`o~S8}C<;r&r_0!FqD5I- zJ0i)TmRHL9Wq(p-X9J|?!x2t2jn724R!o}#UnUS5uQsDIAE)36)ttH4feG)EXF5GRAVV68P+yoeGdHMj*B zYdYlVj8TH1w#i@3G_`n1uSoF>Cch#oDdkPML=0-1mo`Bdg+*eLnYdq%9zUNSw8R%R z_0!q+BJ2yj(R=pU6Uo5H`cy-SoPm=ut?G(kkyr&MH=wrOHQ)#R9G*Gro%fDQeP!c5 zSZK%K8R_)`UrL~^$A=q0aMTH;R6I;&gDkF{oh|U;6U1jAz9hUpg;$H=Z`u0*ThiEW zh1SzPK5Gq_v2O5f_Wim3s9dm@u)vO8kDAmMi}L`@kARjPFKzdoQGsO-Fr*zHXka(h z-nMsva}ox8o7o9MkU$D7QMwW^7UcE>LYjO1hgA? zbc*>#Z8cCu^d(0S$#Zlz{FwBRD^sG>O;55mK}kbAS%S=(YKo7Rp3nu{hC{!oQLosA zKpOjoSa}NSa`4k+lLzk|OcE@YrB?lBhNU2&*$9cKvAYk?&V76M8EAII;`K+o%TK|; z1a|c+dFV3J@+&`8xW}iT{;52>tVx-M%|y!Nv@3McYdv84M`P^uti=25W3Q`D+*h5x zbaftAfy8=%EwS!xBkKfugw>qXj@Orjs>$kbS!#T|2t=3VYb!El_GMy;g`Zi&iz20E zG#X|2dE`WsbJbNO|5|sXxj5FAkbr)O;qRLQ9Ae40#Xy+@;6rTu z*)g6&YXfiBB^twPg)Nmo4vK*vafhYEACMW1m`0n<@O?o%W^}gS>&T9o-xGeLtco`+ z!^%N@zfkM8gBE^SEV4LB)>KBQi@=tIZ;~1_pML_|R0nOely815Lz8I~jlR`UEe2>) zE)T>mg6%1M3F1G%*(QC2$F6&?Gpu&myd0}@HWWya#6iDUB>=fr<#LcEIjXDEaY=R! zvexKJIOx=d|CM!**D50dFOpux`zJ-GVu>qo#HTauo(5vrGI1W>nkw%XdvLz`aybNQ zk7#QyrGC=9r4e@XCgV;ge_l`Thv%`=#7AFDMr<^_Qv!*F%? zT#;p^ty)=m4UzGJ3zM)v9ezrM>xypGtdJa;VVUSIb@g-hEXny(SeD8@&zGuZFVTpB z-RGE_4EWu$%2sm92gLZW<*lMJxGhx`+&XCJ`*gW%prJ;YiLiCIqKiyeMfcPziUgUZ ztW#x;*l}OZp{>t}UQ>Ll<>vjKR9-Qq>ZPfD_LXwz^S+r8qTvC9KZ;L?K7cF&1z&)T zI3*uae1&42mTTzG{Wz>?BWCkCr?-lzu>#*EG#eWh1S} z>_W0|L^r_BzdbTy{2{*`*QIeE?Lv2{T-;df;ge1Nx*p248H>+6JyvY??vSnoYoNcgC^SxR&ol|YB?NqXODf$82 z&Uy*o75X^7>+`#k;wUF#cFJP`)fbAv>ZQK=AZRKc)7ad+&|U4?2J8WxCgLmK^1aF= z>vE>EG9HfTxp`oU!ib5Rb#b^l#59D2z{k^Rs)Ma+uu>tkHt3a@Qt0*z9K{A(hQJ%d z-2px6$wnb_Hc~Grb-XrLm_-nTdHK zsZcV_aK_>pS&|&fVTuWtp7uKE^Xq15BQdEg(W@oXEU=2;A3ykMN)^*geaixl^-cJ+ z$|%HELlJqcsV3qutwu}1sU+KsR+GwQgX2ur+scb1!e~qYqks%09|pHIdQ_%^)I{&b z;ZMnYhPBRu?5-ek9HfE^U0U-j?{%w&Y%* z7!#H=MKreV0(_!Q7|q?U#nA2oQEeFR(Yp(=Sv9Wb@cQj&0pG{7+Oftn(*^mn)TcNJ zk6nfY7jO_;o26FjAl5WYK^&)bd_QX#yoyWjQI;#TWnZ+12=MN1M4+{i&Jru7H(r+R5d2Wwn(_&^@wz_^ z1$cZmi|~1@?Qx|A(gdJ|o@a8C)n@VD=nv)KdfN}`79N`>_>(<+x3N2Twpd>;;iItC zv|`&qtJ9OP36nyHpvis;Z?K;t(^f12BxxRtCA7Sn(dayEbJe7jzJMI7%s5-OZAYC{ zmrh+7ThwP!=(^0zYv7!`j`M{}{qCAe**e`2M$9A87VQN(G!gTD6IOg^d|_m=RaGKZ zRc9+&_-A|l1)Ru~)r$mZC^`o=Vax1n1_W_^Z0lF7o0|n36XtbCmbBj$ukoHjLm&xe z$hXt0GPkDzg*INY1dfb=&-ddI1h_>e!rSz`KxIqaOiymnXNDXqq!sd)V0F^5&UepW ze9n*zgjXeqtW~KGOtno-zPz7|a*O_Q+nrFfsU#!g^~riKV3{0XgecQATu2Q7*}Q(9 zw;KHDB7i`G#o9iGV}87f?;cnP8d!<&MyyYf`1q_!%Z1_Sq)LiEiGtI@$8=?>T{Up2X zai!1ToJR2jcjENsl?aXo(k77z+}uynFSfqmG)AdXHEQ5OOC; zC`I6aNJ^2?5`=oK&ck9JHWcNdC#z;VWSh3fr`9sooUvUZ_J|@2JJb_b<1&ShQ1j{b zFSZxY^|AB#U9Q!2Y$)^hD#9aJCUvHv3Y;sBWkdnB0GO%1UznBcDX>Vzr2yHH_Bs_` zuT!BD>ckD*fn5Sdx%}oKnv6k+W}_l~^6dU+R^GAE=X0(c5n~rX=%_t{hy3w~e+=~0 zI5ro9Epknph{ZcpdZ{_%hog?7JLbm=h?)UqfZcIRS;69mP$tP)rvVCNW9R#}P z`q8%|*E3;;&;yXvM1+bv-p39C{)!)rXz>9DTZfT@_Ry0-{|<)#3h%9 zo3bblU&5oP8M-JAUyV!0-9bHS< z?b6pBr7D8ng!MK7$(IW4wPU?tVnhd`7hsWO>BpO~w~L5N2&qAZ`7IPjK9ZmCyAR3F z%!(%Bnd$O8GUeC^>UvA#Kt7hB1JGK=0{Ex!!ACUi0h_7tWm(b zw}i%>P!PP+&m|YR?K*v(35!VWjvn77FC}3M9#xl{Rd!}p9S;m>F~1* zirc4*fPE;(Uc&b>0#ckA0m+}W0WBkxNljNrcnYEVJ}n5?vCG}%FdBA0NH3akCTmPo~J(VxpW3 zYi%fGnt42bKHjO<1=6I^YM%RVdVaC?vJ^9^uItZzrfbM5#XI$M^V z1)K*N_Jr)G)4spPYHd-@XMk1e89!EqH>C**iSy4onGDwP(&A8#u8q6TK_+PfCkd?;LG@aJ7q%8zIV$iwnhgQlW96s%8vlAM z`~)Ja+M3DR8aas@72g@Y57|M#7JfbaM!chGR0uCRVf>ck76WD-athp7#3RnKY?5J& zsNDmaLrMd#8?BGVgYr^$y~Hlewc~hXbPgADVKuFNXpJq&20z^`dKWcT0ZoV%OBqf8 z*E$**Q#)fX8Ps0nucxZ8rqPCPXtc3@Gws#lt=gNRGE-v8X&#wtFHZCQK@rhilZB(3 z%58VmhAGK_* za8?exj5(|1}QE`#Yt;zBCCq#&28Ma zt8!JSl?9LUs+(dRYOOw@glWcAmk~^wn=4HCn2XUmHRF333AQ#l5OZF$PB$d{Y)mW@CE_hLr|7+D zh%8wL7%5B^^Xw8yLN+8_u5pz%e9nZrTME@w`O&mwn}5Y-bE7R=w8ce4#Yai<3$?8i zJ{tZ=AA`C_0wPSuNMv>yn@(t2mNdh1u=d_cto91E1TH zeVw~_b&Cq($<~r3TaK?~E#wYqYctAAH4P7f2`zZK4|W}ng)Q)B);jB!F-0*z_ZaC) z2E7_#-f>M3HRpl*&IDT<7R+bvWG9$tVA{q-d|cqRw9jvDCzx;?V+Kj?$JRXzzMzoU zhl}AW!#6A2gytPuSrg@wGw%sojmJ=3K3QI)`KKiFg0%@lMa>De?k)G}IeqIw(QLQ2 zN<7l2r+to8D${H^vHBGmvo>=E6SA1=YGcRanC?iP5%S3>DMe->dy=+uD zT(U?w5oW!dTqV<pQ47 zCR`19X2uWMY_)F5&8{|U=1pKvBvLYamPlF{GBBxWFr*WSArdp?RlyADF-YY`MpU?J z7phYu6|p9}+>P`$2VMj%5PAUrKsvVA7RYu6LFLXp=!& zPF40|xJtVfz6JMP4q*bU+{u5wkpJi>$%L>*d>oU+~Guq|0FKs=G3U87qZR z-3Xskoe#F*?yr*Rk~M_=NOm)W5;m``1uiO+T z(dcj-hgTXi7dp&$IqIvCOl?6@4{x!`wCM}D)dw0qqp8*Vrlej+y$5mfVR!gE-bLx_ zy5-k)QLzPpg;zsXp>?)wvD((ov~gUa$0+JtilRBn!rrlf!rWp5cL0_GKQiBr0*QPK*j|3RQ%BdfBHO!)8?^c@o0Bu6PrPF_N7Vv~I>j?oR{bfA&V;&7ir54 zMQ0>+v{{b~CD4)=nxY*sje+?ycg0+`v_6-dPWcp*b?9NSALueK@D~ex^*^HFFY#Uo zyZ~1A1a3_@F|+^m$yz}Dyxtd!yo`NhD68J8vvYhOo3bNM))~^iI#5G8W9H(LDf1la zgm%+P&zneR`H|J6u!j6FcLMunz*6Zr`;O8h%^Lfy$Ts%d2^;KN0;jSM4yM8r;TOU$ zB52u!+qrVl`g8 zan|S*1M4sVe9IttHx{GI?}JCJq--rJV!iWZeYa=f+5mnk_P+Lq3rxceZ z6R2b4218vS)z~_j-HXi>$#HVM$^>EKz8JnSd>cpK-U+iXXc`Nq#!Ic4v@CxRIH^?y z#)ed4ujeN4cK-9E$WC8#%xaL!P$=&YJk(@oYGB_@&qQJvpX7f z!b-AMp=Gl+^vL$GtzEP2XL4!m%oKRI> z2?%0dbwZ$n`DFNDxoKY#O^^*ys$RU;7Ifs?Zi z$0<)wh4+LXT{%qc(unhZZ2Zp_i{&1)o9b74qY)F82$co0$kkRcFzzc{D%A&`Ty5o#r z`~V@F!lPpTnf(!a7I(@0)GCQdo0TkW(RV3DpK*KizjkPSakeS3YuNaXj?w(bl%MOH(^i}6q4#-ZI*UMgiosW!J z^Ho_{7F--=`n^h#NY+pGLf>1UKJ)2YZ%9rY&#xgB9QgsUH;$E~rc^DYKlXflgC{W> zEmCIdvWzNjHgtQ43c47jO2z2QA^19Ma0bMcPLYmC>JxpeL?Asvn&dK49GX3n)>MO4 z@|3PuDt`T?@j|bQ&oY`4CgUZczbK=2DN7YOO)Bo)7x2Cv9_r{LSyGl;h-QzqsPZ)B zI>4=h%mU8LMC)(|cNNL;(mGKp94qDDSV^pwt%j|$!WMe1qMm;(J2Fz@iZawmj z8WU)7c~BrnJ)O&jLyLl|3E8lB^41H!m|La~VGeP~uOZ~{G*=5FVbd%I*u7%cJ&Ztv z`wp^+meB>7T@+K!vD#_cJP=1gj=bA39*V_<+tMHFvf6Ep;AVIkPf^QifI?=yr5-;Q z@s=z}S#VVeT!+Hp*G>Ajw<1b<2m>qklIuJuxSfXtSMh-A2X==$sUDG>D)r1eIfaK0 ze@XITYdAj9=sk^>*e8!ztlY<3GSVSIg!Hv$;s5jipRd3=qHk#dWLF137$ZbNsAs)4 zIPuA(Oa`q;_gD-WIhT@-6fV4T@hBl9aV+*`3Hz0ZqiZLn0FPgCw3g%b{A2`TA|GLT zBA~lPpW%G2x*y zU>G0f#d#&DfQs|J@Y^ff=nlS1{3C8EokE|r5#xul_Wfn46!)E7X2yrCS&<1!-n3G- zIQq1dL)XGj@Qnk(=<6enc~>x;?AW9UpRt+Dd}L*9$;g@*FX$Lq8=U(%;-IoGInYkY z%G99o8pN%3tOMmm4goqu7O=XOI8p+XM4Id5a6D)zi&~;_SVtE7gU&fT4$~_K*euD% zXie@oXxE1x>T`CtBa)i-xWN=YedM5R@;lR%!+^46W}mGDpEM*6m!gbbFa2 zTJ&7%u?WNcwB#rog>K00e3~U;(-uM@_u+T>_}ju(mDOOItR$yv{@@9$WUscVV?UudH z1v;o_))ogFaurlZl@b7*#rWFjAVrTHSNtHuujqC4!3(RxmQlRA?MKY4*n*CL${k3Y z_~`rlK-nc!ySmDR*V@-RL1SlzsUW%h+xH0S1h#9=1ZWO{OpQgbVcgpHfUw`}@%t=D z?#bj~=c>@)bp(=2WH=&CE_pl=EgOlRWP6#rB4+VhaDw6ziQbDE}h znOE_ew99DKQ`$nilrCePR$H{o9z|)>iA+}T4CwB((dD`WcZP&@4T;dEhA3)l4N;mc zG$bWx)et3UXo!L*YKWt^&=4hQ9d%Q~=$0hkBjdD*o>G0{aBSYDDd6(;yiC`5qMShU zQ6lcO=niv;wf)hzEEwJN?>vQOF_hT3|B*WrfghgE5kJ@25>HdCaBG%~a01aUvCIzDQj0#0Y= z>Z!V!T;K;ks12q_dR5pwR1dxxZ`NL$I%IR-&cE8|@)f~0Bd#9Sj2*jW`e7)`%4|`P zHiB&G8G*g18a2eg_RW}vei+*JM{Nq?LN=0C1+iLos855A0WcNb7Jho=vn6Q2i**rd zuB;){2q_~Z_(g(kCA|}nfJ#@oLSPdKD_g9WG zV8PGU*_)j9Ip%Z4IO=2jZweOOorM0Jd zX@xaP#~@KsewRm_v<5O1@2WN`;GuccKeGA_SU@SgnBjsix9Y0FjuFGAWYz*8f<`<3 zTh1G*MjX5ow|%-x8wry;3?d>Ti~AK&l{Hx&)j&4KgmLWGJSqpdiPkrPIhM@JVU6!V zAl-M%tB+xQ~9jW5FMd{y_$EjdCvFVg|Ni9uzXWL+d` zZd{b$h?B%e(UgDBUeAf5Mk$dh%{#*%CO71(o_NhMOkQ=yQB_QO5o)%!jDt3u0VXOC zxtiAx%4vj2wt}|Sqj%BRM5%cFd!@Ut{Bmy{JdId8>7VO82?YMg34<)(wDfwUt9^cvpClpDGGpf)AvB+~x+e z1^8@SPrhTSWGkPqQ$?qioLTTgBr#g`E`-e$hcEDSMxi5t>n;)GCSssC@WQ6J<@D-xq#eugtf0n)_Hm=w}G* zGrg#Y%bP~|tsY#w=OMpcS*Vk!R3f9GaFZ7`qypkmi2R06Xh&6G zOOEvOo_N<~@l}@3V#LR=k6@jmk|PVs&ZZjW#Pv9noShs?-CmG~#I4df1jHms05w4p z)S>@E4SK-O1#YS=JF8{iMy{Grux~h)kaa7Up$Y0P$asAJaM`yBdki3nF`r<6lxT{u4;rVQTpw(K1@vzh0n{)P^mDpel zn}@I^V@{E@$6Nr*$_6ivYAJP4Gmcsc8K$L-1aKy*6gUk-Hmq#syXD?DZbcGn z={YT3l6XYgpi5jVkRlv(kh<7VFX|Aj4&SWr50OYGA~gx@1|qU%u)TmKoEY>dpp)5T z8D%D|9ceNKHTjYk1Q*&QxCiHfQkKS9TvO2EQ{%86ZQVb>ncIfA(^Hq>IKo?k&xb7) z@2;7>ImP2BY)3BP2ohtIp1J~+e3uKN>JM~-dn%j>!!VNfYD#>?L;O;8fp9~4wW}X| zkIQ>NMYb8SRz$T{$Pl3914o9hlauKymqKeDKP-Fz+;3Qi&#oWzcOMBR6X;pfcFq(E99i{ zkeRD2vRmX_Hf}4mT~K{!B&3+LCXBmm?x7{g@i#)@j#OhYB(D(MDo z+ykP>!p5W#uq{Z=$dHC-?7~dG85CzAJ8{4g*SOP^t+^DK#R?z@D1boahc48>#fv&w z34QjH>Ne=}BQTAc*pa~~KKl_+lfLU|YG%*c18iXwt4Ne;Hk?L=_XiLU=!7p1e>;44 z__^>q`pgJ7+Hl}?FOxLFp+IG}@2>h`a5rhn?Q3hq93gGQ>aoM^X2bA7WCJguK5&;j zHb=hVap-KngLIVZ@?f$HEvBq7Mm>wSk{!XdJZb6*vRLIf1Qi}rUr@jP+-&b?JO<#` zK{-Nlrs7iKY^!7x+mq;e3WqCIjSKrB8-=I|Q`iZ9Edn&LI=&2)7m!4ySt@$jNv;ow zkKx_aiCZZWt8G&N9s4+yYw9JYNu}i#%Rz;Kz*!JXV+2G-p`Mkqc*H3CMsgAPMVw>JXP`s}5PY5>{<`8yVj zutDbGR`anoZahFiLuVgE&*$K zGqAinzb;*{5sN?(aKafZKC1sy|o(*C#2Fntrkk1 z?mGL%I1ixfC>$)Ul~)J)961EQ&AziianVt)Jx}Cc=nt+f z_3Q&)rx8qjCH!{y11;gW%VWl_S=B4{N>w6H(QQ;FMj-FLJ>=&UvJB@Gj*^o`*?(eZ z>Oh@Kb}h)p-WGMVr>TrNc0X`=ziqkcky;e}6qMYt_nY068YF)wb_Bi50d~d)Jam1beUxz>!E^ z)1z@Cfvk9Zg$k*R*gtyGAdeRF*>I-VJSmpswU@I2M9Dj)r0?42`2H;28>S1$c!1lJFqp-Lu8N=Zo1j)xl4QFS3XYC$5 zIa3R_HD___(>gXWSf5lPGuQ?FSi1LV<2)NTSwO(qeP^I`V=VhgwP|6m-L7FZl+?P+ z7c)=c^TsX#{4~)Rgg%l%u-U01G+=?I*HCm!@aH;LdV=DBFhMDyNtm_z^m#Ah6+YCO6q{g_Z6kKmwheiW7m`}-Z4ca0HO-9+<1nRQp z&Oq%bO7eNugytgr&;g#h5gO|+<4SQxX$ZkLN!-9zs4K_~Uba&`R4u-iH=0@-AL!%s z5~F?Tw33>WR(S`gSbQytR>v&~2m&b!K++>`%swGi*%H*;)}nR#4iUdEI;S?y7DyK9 z5AaP)@wdrEjbi?#F@kkg{8$Z%5B-(p3-Z}j+M2rsop9OKz->*UtPN!`tEASg8D0bodx~)Nk(#|fU#8%19j*pRx$!_K2|@uhe#aJYkn06R2I~0yP*mW zN_@(|u=bQmg^jlnSk!kre%B%|TF0hEaSXx;#k1Yfx$y%0e!lb?H&T?C;{C7=A1e1C zwB{><ys8sc_D&7p>KsYn)_2Hb*F4>BSgG_03*+^?VC3eqUVN zINqPs`*k=)sEhzd+)q(k#9&go!%3Pg8pZw90W1B$CY^Kk0A5d8f1&7(_}y!)J1&?j zJcWo~l;HfZcReZ@rpjp`D|75A`=vnz4n%E%U(ODVBx9oY$#Vgk7plWB%YNYlBD@7h+_yt=lIq* zBN0jQsc;VO%lv}9Eu(%ek1U7DtxVKM=Q*if`s}qN$AqAi#6glebN&vU+B2P{Ral+v z|0>QYu^^@2C$yKwq>l5LQofd)Wtx&U=!bql@AX>C8NB){doe)mLN>xdOGvw_zHu9f zQ&ZZCi<_}lEZ>;(o>PeiBeT?rz|a7F{j5Xw0+I|XhYd8er)`RJe&rUbO%S!oM6C_F zRMfTByK|hf4woW1^NtdyP=us-ahkvi&r+-N4AGYJ;X`Y+EPBL22-Kxfzhc@ zuK};ideRgw76jONxr!ILr6PbCu}sKefbCx{k^g~LR{cO3*dv;&(2nG0u+cdJA&4Xd ziE23UYu)`5$UT9^HOScF%VA!E%aSMyYGObjlX%{cEWOH8tWoq2Ma9Zi{5n|TkKR;P z2r{+NkcgqvuwYZ%yKqR}!@}jC;-&Bml=17$GI2qfNu3~+5`@R)nqn)_ z%PXo|lh}!7HMCZ}-Cgj)fO6QTt}&cmnX4%rJQm^8eiERw zuu0+sRmwqfvdE)LKeW^{tC%a>s3{tQ#CvFPD#uikxt<-bp%0?*6}_k)z+$_Twp5|t zV~z1Gcl4OYT_y^BwmpZL%&W>>Y-&rB+C}WC*!(7gz3^}WK7s|DjsWNR+&j3!|1EVtSophV0In@~n_pTvcxWf#6sO8obF2}jBqWaZLN zg*nN4#l!S=oU=f73FguTcZna!w2y3O2-~06+p)gdoqE5K?@v@ehk;i)8^!|SfO{gI z-QmwmXu6%(#x_s_K1>cz%1F?(I^(7@ZxvhNH(+pe*T|aW2RtVvr?V2g-=NY2j-gDv zq_B3r6Sty(@?$*-6!qgwgl|)o^@b#%Ip`uuWWDG?t>dkQxq_cLWk+NfGl5Kn=j@>n zy)l;vMFtXuj_JcmlbY3FT^(DA`!Ev1TqN}_<3kTPMBI|)V^`PUQeLaqFEKXuNYUPa z_0ukxIW!rrLvVl1&Bz`qyND2nBvu2@>3pRhH(Ed)6qNYBgH^tVaaAM=%s#~+g;2kd zLIeoR(ni%2CINTa=~!vy@Cx+vVwbQHy@A(OjAa!tu(*_rdB)nY z1M2lka3H}&NZmYwbHoDCF}3BfTZw~C#nH|y zjS7wapvEeJR^F;rr=dXFdvb1HvxBnQhig&%sPBc#`To)fA^kF%8esS8b3aLsrou&j zlx>e`ex@l$3`o`LBcm%5vzN%`iru>K!D8iK&u=H`my`I#la=@JAHHL0*CTA5ixb&q z1O@`7{lgjRyI@S^;CvnzQsQK>7fUD)O%k$Qi}W^5TDK2?+E$hY2(7LaHgQ!_9B`IE z@n`B=wmxn66w3RiG_8HZs>C2BS#78Raz!1Nb}onJoy&1q=c0GeG7ePQxQ}n;Gajm5 z?hdbc{2=bmQ9LGuwG9(iab0_TNNf_uHXWYzrh(1+v%Ae4w(2o6(P!tM*C%7FWoD?< z#(AYuUcJ`C*hO7fr#2L_)Q#%NB^${h5Iw%lG1zDo4oEnQU`J-l!Kk~$0|GZyjB8vy zuj`p5(i)TZ5tC|$q(<1`0)uZxM~B2EIJZHVxe%Gp#%()-&Gb|yDz8T1zdM5nS9(2{?A z4B8fvbp6n!vaUj^q`rPAO{?v)U>SSRw6WDPoZ8qNnpvf!HkQb2(jl3k8*S^dp)w{+ zzPnD1d)F)V`LJ@Me&y@|&fuBTU&)(tJDO~L>CWa@ zJ7j14x?;~0&G^J5^azJWYoiNzCUuOsCKchmeq;+dgX9c%oVF(e>WJo`2?`H2TnYov zv<6a-nzh_Kx2jCOvN}C&US77`z(?=oA#fDZGi)uSn|{3FTPwVOwg)c}33`6b*BQmA zB878pc&Xd1F=`3%l|ZJ_q0N=~HuVF&a%;>MTd-(>=;W>kE9-_2tvu=r6<%f0N`#FK ziX3D8L0zw_D$e#cZXg~nSBC+$)8xqwt83NL@OCyFTem=n1;Zz?pq15Fh!48fnb2$k z^LoK6lJ3-qb8PUu^fILSIMI5330?j&uSL5R3ATGmndipS#&ymDTz19sAxX{tUB$V=}c6M*&^wuj4?mg#xT?VJWa%s2K?|d|B?Y5>W}q&43n2#9;`;fWVwr%jNreji5Q}l+`(;ydX z-7eu4JeX~luT`Ko@+ZjGXf%7jRlY{?fHbtFe2r53)0D5F?~`2rnkSMDlhMg1cefB5 z#+w2%R)L-9HEb@N9)>4tn2U`gRO3+__Ei!>lfe^2VaC=@?t+=9Mq$;ZVL^ZM4 z>0NytT@epK56+ClRmKX&6|5oC=TF)~eOVIPbQwNBd-}xj**SbJL%-Blk;In+E}c7H zA2-wx*O<#MKi40uwp0+8`uXQB&Yd|ud!>a23pK5}^ZNWr_5!uzB{IU%v;h!i0Efn{ z!FCBu+c(hvOWC`}+LKIX-F&+P2p*@t9Ej$i~v9Fjxs5=+idb2(f+ ztc?%vJ>)reF7LT}ADrRZdc<;UNg2ItOO7o$kz~t}Whg?NL@=y>5*tPyKm;c+tbbx5 zFc2XD3g(>WzjLYigLBVU)z#hA)z#J2)zzo$Q&gyrrkkRQ?256& zlmY6qh_?e7L_ar1fSde_NfP$B$)o4_6dH@;7$7k^LaXM zpTMrSdhHW}O|iADLk-BkF)2v6O|;tYx6LN^WYbJFtZ5m{Fgi8sK%T)nZ~WcFZHq9S zYD8phLI@G$J@DT2FK|Jul;g;p3U#SKe%X;PU);R4+C9G4G$OEG71pJ1j)=ZKwO0af zbJNo&_0isNv}?0_x3_1J#IcY1qEK(TnV!HH_9D`?Q@3PXUIemdIv6F>KBP2;ak9$aYF^SVeU748H)}>axd>8A^9%% zyqIJ2hz6n1@1P^whSgAODg9MCadjB#5glJ%eAePgO zm37%w#cfwe?D>ITJ|c?pbr1#17;}d)eSj(#5KVA@d0Au-M!%J}(bwas5TAXo1r0QbiQB z(d>!k&ldyTW(f%CEU7zg>KFo>FefIe(3NCpeuP3qPN!fudFk!i+?(wmE>^aaL#-R3 zsiT9u*Mut&92I0fwm?pbK(z7;C*l{Jj6&%eiAvCgO7H?PEvbGZ#LTpEO03|Ua9)pg z4qX_eX3#3&Kn6n%n9-ci*F;7l?-!|yY!@JxOP`Y)l?mE!bZN&-sajZY#oy61F$>fn zm`rBH#UKn!5^K`=(I8fJrbDPfirSJ$Gg13Q8l)hCr?TB7ZfE22E@jSXrRb##sE-{) zKQ~3R;7LO{{cSDfqDYWW!J1SIftdp`r5ge!2+Tl#f?9-SqkVeCp+8yG z3{}1swdOkwC_j$o=%oMC)@FcC;3@~XodrJ5-XI()q)DbhZqbWz?v~-fd{qWXhLHie zZEX2StLxIjCx)usF!LklLbaPG(L&RJ!+5^&f@nGZQ*_1*2?=|Hey>LV6(b9qCUuiL zEJp%MN*jxtiyvD2pGr>`VlcEgYO~Z!|cM$VPo+9w`4f zT7-o0T#FHFir{{GwpvXJNTbvRVfwmp=Xkv~?(Ypy72#E&N+8ne5CT(CwFrfj3CnHl zG_b0!2b0<3N`Y?8hy29gHDlpph@3#t#=brk0{cCTUI^ezo{BYwuWz%TbEIy)?misG z_He|#5<>&s45RxSs%~rDP}}9NQ1sTQ26NU`>})D{hLP}mxpF9qU700xe4p`jaSsg_ z`w%@g-}aUuAz zs-H|E*XAD$wZD>|Z!C}*=bd9dKMuNhAMNOh=d@wNhxCZBwvXrEcD&qTY!wqEnz#Yw zrKI%U3JWz-Px}QXD-cNM5@{2|g7=vpz`LpzzL_w%IPW0v2-*rec0BG2O<=wfh9n4i zxHyJJMnT|3Z*6M`F;!RenMcCQdqq$6Ju)ltlG&j1(J2AO4AC241po&`(nlz#xW2B8 z=*;&^2p>Fr_fGYg9ZKrhI7S)`+*rJiTM;)bfkynpSJnD438iSk2;SSb-4jYHoYICF^&y z#zb)Xs8fDQ-j{H;KRei33~$tdD{B8Ozw(Oq>z!~70>2~DCeq`hfKr84lbprA+xm#D z2qxYd{o=cR4cs7JYOVIgg;WY4XF>s}#ns6U^a_=x_<$*K^^%Ra{`w%W0be7qx*<|a zo0prGwtx?cNL>xzLZyTR(_NTK+J0bC-n@!wd2@JA-UOLYV`_{NBR2BpMW^M>;bVCl zzBlqFK)I+4@|F&P3nSH+_p2l{Xf>xN9v8_lhbb{ks)f9%(`{LA1dh<+eQfAX*bAm3+3MhzT&QC9Xd*>|G@mKi|qaKkqHySc2u<6jLFpzfq zcz%{T-DGusm_$7Dy!=C z5>m*>cs^9wjZHYp1vJd2S4(=eL|B=?d$z<2As8&IjS@U10UB{KnH^-BYJM8DfQc?P zoBEP-C>p^SZ=@YX##E)?W;mUuKO@KmBhdzO1-V<@s)>6d)KoW3(uNG`EaWG-Xd-V! z`%H@jNBBtGj#_30=T5KHG~1IFYS8z)pk}e#wK*SMjR*Q@Ef4yt2OacWKrO_(5QzA0 z@iqGXUUm9{w)oy#?id(%JK#9 z*?KrR1MMC`&NVi^GJZ{XdNbFvTUWM7QsG3h4%IU{8f5o!so?p6HU5Cx#cz^ht#NG9 zRLuAw;t!!~uZ0dHW5&G5ITL6W(H6ypHspN>EDKX;u%dA=z>Nvzyo+)c!`7L3xv2|8 z3qYGf3?vJ{hW5yG%`q>iQEDSSiWqkaTRgrSi}{@&sB8FS5OM|T-PBs=(ecD8stw|q z_izk{?Lr}CBK4S&I*rU8mShVLPaRqsE`T}kysLqO{ha7LHN>V_&}aQAqp8`5R}Z)o zsRj6P|5%Gxd>agm=sPZNkVbf7c*k9p<9&96R8kwjXB^m(0$VX0n#=W|nmlhSuKdNi z5qtnU58~UPn6fDa)IBi+laRe&D4Guss-!!D-aS6L4M+O+trgC_>*4eUQC#cqcvfb$ zUw=ARd}q${WY}7e`51D9R@RstEmzB6OC6)g`r%ZeI&-kyw$^>1}zw=!LZLUSuXK{GNo>4vxLsjD*Y#! zDVM&gU^Z${Kt=7J^`6%2pGkK4lpIqah2Kx@txKRrI1^!TZiO##qeoc&)##>mM(kBL zYO+N`mFud88-d`jl4cAWvI!@aH>^>gXa#35omdVpS5Y-lV$)e2g`h;3)hZ~E(pFX= zTYQTy_Hf#5nnsg!;`$Ln4p*v0laf#q?n)5EVFGI|s<1drc*C6Fuw;K~qb!>Zks^0^dW*^E-Hp>>j+z=+uZNW3jAilH;88mrMf6)|Y} z)akd!l{WO;J{B3I0h7a6F6NEJx9_}f!X@{5Nk(4yYqJNdV_Sn!Tz+L(of!CS#PQq7 z6976lC_LY!{cnS|J8k}y)xy+2;oU|d%O(Ts)vgVAzjUldwgQ34wDaC52>MI0NUDSH zRl95-V-`6UTTtRm6Ad%Idz|2rvwgQ2j@o<+XWflYCUMazm$+|V{44L51*@A!$~(ui zRW@O=H;=h>YRy#R(h5#~M$J;_1-En;xEdlCv5FN6oR3DMqTWb6XQ%57P&@*!7F0!^ z)R7JQ4yXwo)(nP(rmqgUfbullGh05V3wy)r`;NtbjR}cC8mNmdKbm2=b+Gia9Z-4% z*AuplZ7Tio;=e(PB!0b)$9-pZ$#Y}z9p!nCTi*lys`XFM(}aXElmx`LvhMGM`tWoy z^+${0aJ1?y4EW4i=|#*&9tgP?V~;fi#D)!J(#Pv5746YsOS)$W--V4AY*JhbZNY3J zpr??KNBdv-&HglkS9~lm`L}Q`%QsOYna@C;<$Bc_M2H?QT$bmN3@NE_7j=aBsV7$H!V*(H1@=bA5J%9fJu3 zzF4M2_l!7CijFhzX2g_YW^>5t)7)I%TjIoCs6m-4b?|KSXucoc&5Nh(qJ=;N*zTaM z<=07=dJKxr9n;GR3B;i~u*7*?{=N`E)55EY4+x38*@_hYXEDAgY$ao~+_nbm5)B8hf}_udeBa{xv3KJ4sV3L(^h)Sq(^Cha{KsJ*j zY7KN}C|rQIcbA87nsIMfuP_85xb{!VetlEwG)9VmYYsV=HQ_ULey z;Xo@d15ZC9(FT)F{9^11T$ac3<=?9o%NO9^P>Je{%nx)q5Ax;ZgC9U0XxL%nKE9qT3lO}Q(F zA6+{>Jo0mVfEC*on~g*pD-ALr3{9ZD+}* zz3(JI+o&kwqbc@@6^h6Tl+AC^_lD-?J=2qDhPLpMqm9L%v4mq-mt5_XY?k31v_To@ ze7IAQNTR{cWr#>wK0`!ot9KvrD0Phjxzh>i7n(uLD3w4MhH+H39mou{iL%X5X5dE& zuLiS+Q4eQ!E@%`3I%@kcqNU!61H=aM~(V zH9blgq-s<^>?oCxpmVHQffVKU5C~n7iy3CVzOrQkc!syC9zk$whc_N|`Jk8#v8u&0 z5!4o1(#FU-=82xS^F{>&Tu7ys!hj4isgt1q^dzz=J4l`U_B{s42SrAx|3dDu<}_av z-Nz;fmov@&w4s?nQ8+;P!0Zk{@yH?&&iK+%BCt9@V&zD?Ojel^othC*nj|Qq&5MCz zuZ7Rj?ZpGNGF4TR_AyrwvQm`NS7e5S7s>MSy?8 zQ_s3V$$n~CLlIi>o~!mlYL70$i@V43ePpnvFCV9Kg|imTfX*hBX%;)YWwCz^W(FhcuLX-`kaMr4 zqj)mN(I@%m;IjV}|Hj~ke`AD-f6SZOGLOy|GiUvMTYG=kh8o`s79~g3ald%~a15up zS&*s)&fepxrJ0`^J~LD;J{3&1&j+jH{hFrbbD!P20TXn#i^QEs?`%&1v0rp-)q_Ip zDV8&zLJ1SUi<@{L$^Ml{70ix}buVY%x&|s0DnLP;oZkR&@z?rUuy7>Jm)A z23$>Fvb`AJ7%SS{XM-dep-1dMXFYI0SxY_Lu*>0IvqTWhvwnh7>ep!b6AqFH##bG= zP^HHw9k~>;GeC~8XQ~81_3HGv=z1-7I&+Dcq*7YQ<7+X$0y3UrFS*rF_T9#J*rh>G zbrxSD)f`lNON46j#1mFCK6`b9?CER>TD`Hjz4)#4o}l<%nf%#cFx|JX{4wi_N0wpx zdu6tT8)5AAZ3`M)xGr$dGx*c z?bQmec6l0VbVJ^bOS{;+T4)J-@xkJF@mum_Ds^r)sU4pbk}(hA|DYLm6^k|w=iN84 zvDhjeV|zKyj3HS23pX|>^uCi|&lX#_PZwB&H8Mt$eP)DIPEI+MvJpb%dIwHh)C%9_ zp^J|WFo6pU?0t=mob7dKOjX;MU(W)#^J>fTWSY3MA4*?&Vnw{~? zd6Ut_Waz(X_JNJe#WK6=nh7jdvTzJa41zuKGYn;tTm19IZ-}K9vpUtZqJYrxs2a8M zKvTT<4de{A?T}(mVOu#L!~1{0gaa4I|0jqE3C&~CG%ly`j zOPAaJup;H}8TY}ZIzmQzeQ=EFJ|IaP^=KSqY%l&bhRDA~)9Zd=KhFYn^ZnaY^LfJU zZI70UM?9tqhK~#&fP%S=HxQ33?hWkVS!7VE`;1XzW$*I!bja4QoS_siMojbJ zj}mI;GshoHpd)?rcTJj7${5(AYuOCW4lR)|pbX;fiwB(`JMMX6L~H zt4^~5!}6@Q75vvqnr2Jv`CVdx4eExp|$bv(S{~-34dx1|GNl6J~a$ z6H<#d4m5WCEhdypyH3D&;hVmX08Ek1Bb^I-t9vtlq8_EvCv4`UQcAg6SHV2?EgvdE z$s{8TfsND6hC zYWWhL-@6Ql%Du1{**R{%$JABIV@Qm4Y@l`Na+^ zMZ#tiz8MXfBST`MfSPtH&ll-a+neuJ@RFeo^~bQ4Ee08KxA=} z(z|Soz2klO&w3&!_#~%eFE=%QU!VcBk0{pzhzW$5F}7cXd;Y^&`4%+hF;reU~ z@!pEHtBOw4ej1hDSsvUQ>JC-~0GqlMZVX(&@hmbGx|fzb5PUtSUJ9&rj0#fg`J|oL z#V_8tF}GbN2lTuf*F9-bKi-_i2(Cd|g#3kvLT-dlUhuksk$lNNtmm1sl2~xe zlx&I62^@24x#5_9T*t9#j1I>h3c2N&7wU1$Ap^&hFJnS_b5R|{_u9&CM?*I9XmS8j zn{F)bESB?OCtg7NIwO`dPmP9Gn2Kv!sOFCayvNdlVZj5_=qQ)@GfyZN_&C0hH>sx@ zGweCg^IW$_K9KU@x>YQJkcLS)Rs)NZ|0Oue=7B6mGrnci+dv}&Q{uQUaB=&?JIos{ zan+zWqX7@Id6Ew;6hR@o*NRUdyhP7RDAz#{_>9jWf(#5#q*lS&jo_9%t<56k92$Dg zoDmoA?(<1&oZlW0MM}p~Zudbld54xset!Vb!oQ1r5pgCvUMofW&1sB6G==<#BM&{- zwT-rW8Lu5|+z47+e}{uK-lsUkGoAbCS!G3c5f5X|IG^gn**XC6w2>Ln_ZR_04~?W7K1`&5vdS@ zehM3)ILkYRq3CJ710ii^|J)^#I?HibIg5K||Ealxv3ZV(;cuw~5;^;YQdX-PY%nO; z1#86EbL$!es~I#co#ulgT_ozVon}=>H1$^(zpX7k&Gh-fJ9BJ@Zm-OL$X5D09S_0r z;ZAbNP&NA{n^P2!VN-GOfsO7}e+dj#J!wb-H=UVcqyq;o20yqbZAVcsdk*4+I_2@Z zwnXCc2U|rZ&5gxk@iUA6CmmmXj6>l3OJdP$Q={kt_`+RNHH=OxR$#?Zg(mZKBVM8; zJWw*)>v#qOmjD^`#)Cw&h&Jpf;&;TX=WV=$Uo^DT7OX7A}p+LJQ(rT=r}~-XjgXUII!ME+$1kc+5XaxZ$MCi z3fGr+JrxS-3kSeZUD0HhXSF6Bv#G$alghLMC@)j3C|?|^h=`=2zzLNC0#a8!PPig_ zSWY^Wr@OSZ^OT18j8$vDpSmIXwi|HStD@EtPw(oStFc+Sx96|-Ci_cO2ASV z%b!xMSQP88;e74)cbHV7JYGu^OF9zXv#ZGA4gtj`a1i8RSDvI5Z@an*grsWLWJ+c5 z3Yw77wa&G|kOAk@kSZl1>dENA%X*Irkv5DL33wI`c%Bb~a++5Gj27-8=gN1I0pDc{ zXD)7+_YepX*DV4WCyQxonMhv3ZuBnF|C{WTib7K}9W^5X4wB7W&XX}FdxigOwa4S6 zFf8yhdYjRJr6lLH53DqQORQGjb8t$eYlpMA)T|ktVo{>e(|K>E(6k|SFgTue>li&+ zmm?Ze1ZpXL;2@Fiu-I$hmfgG~fqlF|)S|w$aw>YhDjr@q+|1jHsCzB$&DC)54%{?p zD!RU)M%_6VTeT7h`C8t)2TWLnNmtD9U{D~Zm`tr(L@ed8*y+{F)-_x*^CRV;of2Ln z1~@y5JW>bq!-Y#gk;5MhNwF`w;PXAGWcL07BRWZS2Ipd+78Q;bpukBHF31&XHPDJ2 z@JZ?>S&jAlh_Po|ftlOVf?%U&hnF+Z;~c$dd_Pm+@}92Y26>&9&AHN)i3X<@F5m%6 zKext86FLXF&w`hHVpK9cXn)ao$uGVRbFHV=&p1-4)Kwfwk$7)5lyWpoU(LCCqWSZ* zV~6xehlrFe=C+fruBc#{H(%iAopJ$=N`&y@2%!)<;i!29kzy@BdmX#rJ_vU|7+_KW zo62!{r<{P%CEVg)&5-fG7Vr>-#~o}V9^cNxBrTQnSoQlJV`@nXW|&dDUR?aazY1p% z9nrxndy#U@@@% zQey)f%^u$YPGSvP1#Ho9J~)hN*$i`>6tJQdPtd;t1`qCiG+vjh<<)?|(!JzK+;95J z)fW+6;ZHC_S-r-qK^E@nH=yqzWAV*ZSEAyK2J z&E{rca~dO~A}#TZ8cfUvK{a> zvh64p*Vx(!~h9fdG;ac_)mrt1`w$UCQ zFDu9Or55+*>c$G5u&aAalh*X`30wA(Yy(BACETTo7B)aRfh4{$poa8;cFfqtQ<1Gh zVI=0DQ5PS$8*p5L5DOY=K%57JS$KkAJ~tSx`yn#O{_4)B=o0V*1n0#ZVK!_eq2VD5 zA5TSeflvM_-)^4JnhCXyH-KzGb+<5E1B}<=l=OISYf)Lzk^aK?WR}OL9k*EYPbi=T zt7@L=mGAA^jP<6|(^}+1;gAz5kk5=(6#P36iYZ7+&|;0t>I8DopDeJZy$uI9+$2lA ziyN)jLYlXKU|a6#*L2AR!ML1T_O@3hKlzvw*wa_{aH$8^*uOqk%u_+Z?(w+4jC=WFZUx&;6QvaK09XVjCMxp_$x9lbClO0j z7Ey=J;T5BU2i(gRtsWY~Yc6nbmYX^i^k|}Bn^P9Z^V7wE>7(bTt45;1@NHRxk^4T8 zu_Sg;tG?Os%?ahs-^2~b}ZFYGNbD)Yh~fJIC^~u9jLsp zYigC~sF_oUg=nk5(;j=ZxtQVBtH%wj{F>-J#CBpkbamg(;*AgZ^awt^H^1wrMGJg* zT327qH=4U<@*cpaz#Q(!Muc6bU%=C$B)qY>xA@V;KVJNkoj=T_$X`a#%~b|zGZsJ; z75xLc+m@7UwtHoD@ZpSZL}A2H-0E&)T(CikoWH)@I#?a9?i^isTcuQ6C^a?eYq*v3 zBe>IYp3S<%e>U+CqJ+KuHxCdg6%Er`zNTSXV!92(QMD}srOk2=XBI>KnI5666)F<% z`(nN$SYpl?;w3}k)Fimc0%$Jzo2&ihmSDL&T-sgYppFl$;(siSp)C&^z_fI%_qZN{ zk*iURwGJ*(K9>$p{sbyaX@^vjqq0LY1C(pPwYM+az{}CYDF_Isug@hiL{p|5+~)`&bV6zizIozl1W zX4}i-sOnLD+&r|rv7mllX#qP!DMF7qMoIf||5TBF#J>%cdEp@YV(#;31%qybM-{*W zVQZ~nmMLtMaz+LrgSoRd)knaP`k*J=)E7+k8_+>))ZM3bL9?sX;7jDLrBQ5f7V@i0 zlE~l!D7GMW&vJHnh>Hu`0I>4Eh*$?%%8iK(sA&rZ;g_fpRi5rO`NMSY-kF+%3XHGBK{+8xh4a`g+Gl6!v z5HX`0i@lv^sWhKArTMr;6F_Wesj}gFh|sZbU%@+e^Wv+nFSc#OHXTS`#_=wmtjqNJD1bg>sC-Ey z=Q3&hnxzl(ki3FfHlSi|o<;zHM}vdp|hucFl;Bc z@io^@CnG*}vM`%U z`J$vS1$RQxb=8M1v>O{H0oYZ1Ta}xlR$ns4avf0cEigl{Z~#4rZz9FK?4say#l<*y0K=e@?3v3q-5DaEgfQyp^ehmQ!zUzR1F<5XrH(Pkf z9Cu*u;(1hDixuuSIj&Jy#=Vg1xLXfn^-#IB+n5nl@n)|WuMu$bo1xRHj6SS|N2Ew{;-4Ve2sjw7JBX(HCC z%&GXyxb3LwTztH`&!i@+U6CS>KWDLi@f3jHUb?w*1N7GZo(FZvd#5_if{#eue|7)< zx2kfF69cv99HeUuSNB^upV&oF!QYw1K-HaiDh6s^e;*#vUE99l@!Pi-Tl<6Cp51*t zNnhUE+MV5>7yF^BvwM6*M7b~!c*q&H;@$^#TOjUJp?yy$9n7V+@#lQr;jLi^)z-D;-UmQZQ=fL2(PQoi zYJ!KPh7-nObk*y%&1h5f6Bcu4vRx^e1FBi zUz+XDws6Va6|UKR76g%cL}(eXSdb9uu!<~^8dX(kfj&OYkHw0{4nJ7@I#bK&E#xVdih%OdT$&vqVDg|A79Gr|s*9zhDQdfU2$D@L z!O|&~s|Iyn@inqg;AL2>8#1#aRK1+W zXvSyP(tzEi#ce2|hF_oULCqi?%KXmqBdUp7W`~8e`R-{aE^OKDVKhLatAzsJFT*Dp ztH`U~x?Dx=D);&TNadj5Ak)kY(Xn@yL8zJ3Rv9$7B`DFB?}r-7b628j$!q5X4z`V zeCXF$h141K4^FT?1AvDh$}gkKoZM zeQuZZVmphPxYqvp#qaStnue-?4|~}%bA{R`X(`Zker*O=nQRqOsObXa-Zq(yK$dSQ z5m-S(#i~pTcm*oOLV5}C+Va7v7~Ld&%S^B^y_!Lcq5&?egQLgD4*Pkt%!aRpW{$X@ zu4RT3C=%+JSq?bK%u*7q%Dz|QTGPu3wx$=3``CbxJu$vv1>E5!(%8OIA1CZ5l`ib3 z;Y-0NIKQoyb@tPMQm)NPvOBh)9KCBl;qnD*t6`XIw4Y*)Qtau-LXuDhiLP-ZoIj~* zx;PJOK&_?GHK4r2qygpNu>qy;BLk}aUKvmo5Q4q3$xAYg38mBUlytW!47AaMPtAZTg8mDU@39&Me z&RC^oGH62f{86!#JSAKFr1C_c;k zX=X<`1Q5Lg9=+$eMNz1h|D4VyV?*-Zrlxg;Jg6{6E3ZrFXv0ckD--aHEGmyqVCF{T zbsXX+IQt?o%m{=Fci}a@3&;1>Z3Mp|H@Zq7>N33gi zNCR6R+!{MrZk0RkD3`HagMT?dd9I&=5|F&K9iCD={=}z1%$T5Vj+K2?XypNOQLhS{{(B^7a z5#S83NCMTtU7)3KUBdo@b1nb_`O3E+;1t@(bfvvgz;oos+mXCcGr1ud5xES$A zvvJB%&8<^AS94kLck3E^VoyW1>>U7$%{xzSyiNXi>s8Rz(Jt>(OAv{idfv$?&@y1oUtzY zXeJ!*J+vZ`v9Kjl@FF!p00}TJ%Hsb;Cgg!WwmW-yZW^UiUPlZ1Ko?7WsaaAp^-ebw zPz%1~wU8cKncuV96x-4VBt@R2;$zXi``=o&FQr>PfGCjb(nP2Ag3^v$N|h%2fz>D#aH}M zfKz{tyb*zs1dua;0XrT=lqx-!rNLhjB?nNtECQ4qX?z34$&Nc5vYxaCrb`6z9F-Q; zyc0<=RY`+J|3r{Vn<#PQqG(m^xOqYxycIz+jmMT|ASB0Yk4Au#t;0SvKuH?GKYMuA z7s+#LyL2F3IYgp-PRQ;_RbXW;zGfCdW72cKSEYSv{3?nl2x7TTj)>W%SY3k%?6h=7 z*sX?6E)BcuAd-`dvESP`HOi>B3x%~V(=sQ>2sy~5xK-gK=^6;Mfl%o(Dy`UD%qv1s zKDi!KxD~;n0?qN82zRKKzFf>ta7_)ABG98;$+#^W`WzSv^r&sRq0J3ibSmc{TNITv zF(bKP5(k34HLoj4D+YbVHN29$QB8_{eN-9Xyu9MhxcHon!~U^#wgpaF3l)xBX@S%y zvnSOChk~fbpfQ#vZxZ z0)L{l#ZhEn<^o((9;R>U_KHFiTpJ1nV%n!Qb+~%Q98PJeaf4LRr81hXW7X#@sl8zB zzB9$6Ml)|nRQfH!_Zlar45D~=l@vlSB!G>g6Rn7%ftDPqYp7gyftwuiFosqWUzvNsgf@D7qnGwyEGS+c(#z5gD zI8#fbt{`5pzVLnqG#BH+!5JX5iW;sME>P7-z_2B(e{hK!32coh6@_9Tbd4+v5uGu_ z!u=cprh>Gm*7m*^u9!5=MbZ04T?u?hzn)52Ds0faeESeF(+3YMFVe*a%DW<@(;_`M zU<8OOjcYtFai!6G08OR#&0K=+2X-S|NYAQLL!!%g?iW)9ej~ux2bND-G%uvlW?+s0 zOL~XEf8-{@K`sKptGZqdjPjC1r%j&~Uag-8rGEqOQ_SF%9b(p^?pt?1G_)~>7+)E<2Zrp z;W}>YtK)>%s;U5m32wKX@VyGAuhO~?yTY0uRb9i#slg`D(cmFmtczf<4h65H6>}DReST1?Al}@9O(c#y z@8q%IPAH#Ogm8lHdCSpi0UBgttXNd>wB~ujDY`v$^pV{HHgl%r&Z5~_~ zUj>ZsQAftKu@_tf?7i*Vhr;{vy+im$ukunmm&)fsVeQ;~83=I_Li0%Z)g#heWL^Q5 z?;>zG*sCc5mNqKt5Hvn4$?7P8 zy6aa2qfveWT9%@m@OzIUdsq9ki>|ZrBcE(cg`#50_6Uy=V1wWP3qVOTc`~r;$`W~8 zl-3+$&9~#H3qkaeCp-k6FTCG?;ls2HMHeVnBR^g5Ug@(yto=5SS75M4n zPhCY}pLFn<6>Ac|mV`IQsN-PoX#2RU!!p-t#ya#4XQ-R%-C68Oy|=~K*J!5DDx9}S zstil^M=Jg4P)O?F5)o0(nNERB+z;`m4hPE3V_YfTl{cJ9s}j0z^mEfc;0pVgmnyBN zC-g~LQ_Vc(Uq^wn!VYm4_T!H2W`w@ktA|$6;nh7{Z|8d`7ngB2_IWP*L8XWAIM0j% zAxL_zN@?WQ^YenBg&&4~FBHC_1t;Iw#Wc5mKg;b^f|MUwbxi7pSW)Q!*-DO@V9Jp2LX zv6LX6;1Z<{ei;_sAzFt;Yc%WiR_*;v zmM$WqheO&t5fr+nTulmA4|LwF>ED`Ksh}lR9fXRG6hVy^ zGgV#uW4%@dPVdaZ%N=igEaueItFs7I@wlo8|1I^81jm=cR&XSZ&gkm+;Iv2$8AViw z1{Otv>#!=6YNQN#75bYaIz2bPkfo~&+CsiDdoXAG|2`b0OAjDbkvFF3kB`c=!_Wf>M? zF5~K?eEi(G`=8CFVpffN*C&Q@ECXgj6ujkVhD4Y)>`a%LH1E`;lopdb1 zr4RGj05-dCk$)|~BfT8K4njO1h?6l2PkQ?Bn0mp;Q<1i>G)6y{A7wwB9F>)?4084@;D%8ppf+d(G;dy&GM&)oq> z)eR`B?g_k$GRGTmwR4=WrSNNMLgHN(`$h?^T@WJmDeY3mrvL>{go`BYb`xDoB`)2M zah@6Ba4#8p0ZlXtrMVJRyW2$743=2AdJs!0PYEM+f=VI*G7o7(gsY7h%6#n@p~h)Q z3}y0r6pX<^VoGF`oY==8oj!n*y8;JK?f{sO5^f)+VQE(%aFrma zEe*DfG1uxD^GwZ{yJr{x16%9pnHy~jUlD{k8U6OF+#Xn<@tFW@7M&Rhe1Eyn^cm|ZO&&0TZ@r39);guLfg2PZbs(r!6A}nQgr)FBDKYzet(a0+Ru4*K7iWA zjI*A-+F(o_JU;RM-tO3|apwKKdwpBuEzjp#2_kn49xLJR7gd7!*@q}l3+m~wERPo3 z2eS{;biw#BDg!C#o}!p+ZhpxP47h?gveR2M>l_3Q8kN#9`6Y zgsO`fyJKDC+7p?#^U?swWFVtqvAd{R8G&H-=Ik*g!y=7m16r8z3-AbX1!>U`ZY{1Yqqr8r~Ee&-z0N zys{5LYe(6VryA?X3U(+mNPUvIQMphKBJomuTGtxb)m{!6SFax*=@?kdI0InA43Ynr zNL&nH^tWb20a#b{3x=0+(v|s5@^p$<((UXu>rta$Fh$%nyBw?V)& zJzPyBJ}=%v4q!OX)=i}00teg1T(%^8G#gR|i*Y(z0)$c-+`I(W94^wt2@s&qRWdV% zKU1)L41LZSEgdt4D;ZMktZXy3?Y^bsOxwlFOc)Jz1Rtd;5Ou_ZLVV{-zJg(PQdOiq z<)V7L^Q|^JrAQ_!L!=tZvNHIQmwYrti7MEV0XVb-0ec6LQ5}bAcmRBU5KE#Oguv%O zsR;|7N~vv>4I3)XIBv*jT|;1`Mk>5z8;j$eCz#jx{ph$Neyh$6OdFu+T@Xf}hwt(6 zT)0dz?{>qLB0^6n3p7@Xd$T<|2uBa7wb*xz?GbiT3g`mB9#E-=F=}~&#~Rfra^&qO zWRee-6gqft@c})ghse`tN7`g0N!DXv52lsIS0aoa}*#R;|RJz4c_;Dnzrv})d0+hwkLm=(p zGjwHRaewEtHu01-3E9u)n-9<@y0QRe_NaI}g-UEl%5k4*Jdu&QdZZoQs?R@x1wC(? z&a$p{Dt2(MVrjtvG_0Tl-Rt9KImN=d>NP73pn@YdfFPZ!Of!jYb!bQ2l@E+8?U~c7 zhUFEKiH2u<@&G4UaXU@KT%3EY&#MSU_p4pQsG$X7z>>%ms{&C@`hrBaE}BV`9OFw< z9cG=y=YbCuAD;(kEfbV`eJDO~@%eBu&4&nQ=Ob_yAL33?BE*SktmqY*(viZwu`<&M zC6yEK@&|_(_8xq=fLuV0aQU(AnaC@l-<8<`^EH6<9ZW32lm+pf)ixrjR{mZG=<02X zsw$V{6ROe#>Q?2jwkk}?SnH+N)wEnl%T^4tfm|3#BbuIfLamrQHzqs)<{gZos*Ujj zgn4gdeP^K(e5LPlHs{XTF-^m>WlQGlcl{}zRKe713ERfQSP*@GkxThRj{?UQ^SV0$ zdV$6JRR)ULAK8)kY7Yi@FX9uN@>-#N%~J350zx_7XT4yo_@>f@9V?rYC|q=$7hY_l zw<7SgBV~iD$)+VYfi?ZSuS126N2K^fLL5z4CqF9EN)$L5Xajhv?E)TUUyp-zcjl9@H2dD2;YCS6{aG9uEFIwK@K5Ap?PLr}o$=&Nq;q?SO`j-Oaza6Aow zsGqgfV065MnsJFsd+^6KS&u&jq|cuMp&HfTPYECM$DwN*KKOmYpHngd3Xld+%b!%5 zWuHtKF)De(%7CM1m^th@9}K1Ld63Dgb2UzY>sl(_1WK{(tHmb}2F1OHOM&oI-kITz zj%*ImHjqO7cXpmJJ2TPy3=OJTZ7Y$1kc$!zG5D5<^^l?#7Q&pi?jkMw ze4C7;qO?=?@)|t2qZkHbaHE?1P`(zfQuKA=ZU`OK&vuzdYjbyXbdrk0({;Czkh{an=U9^ia`Kd{ z#6g*zV4biwxx24iT{!#xd)%YEiIcjJGPV5_zm>SuE6-fGjg!yId-sJS!uHpM0u zKw9$H776QMD{L&jzVq*zu2JUfN)XCR3m~L?@Cf5Ox`T9R0~IzvKrH14@KExkE__04 zf@}3|6Id9!m0EvY*;jQEtwQ*cUW54-~2flx__m zrA{sy{H6J9*VEnu0r@N4I4=+?@hGlT06n*#Q|O}}6o{BDb{{Zsa-~a$O4YOk_u1H7 zgG_nr%B)%Cl2^XOyn9Tsfd6L86Ir2a_O@kIb@2e&Vd3ji3zNV_FQ^`lm%F&ClueKn zz<*}J1qI~l-W_`g6f_Z%aLBM&NCB5H*KYWZ<9XiAxL?XxQS9l>4`=%Y#Y^v8xPCd> zaxM=~3kUjXTaiC(+u#Lr^UHl8XT5dC|`D_oN;cfN9iw|xr_vd)b(01;B7HsB<=@7c>Jj)lp z+jh&TlY1in3EUan1~xeXBm}X{wi|+v+PA2mSf8Xy4h4zd;!l(-0|0HHfTB%Vpj0h; zje6lhZQ0=!Mx5$h^hL|o!9Rz3+?QHHZmxXEwt9eaE?7MGsb#90odZly0HC%@tJMcf zJO{em`T&eOJRDp)K$FMt+Qqe4+6$F!F|Pi(#rG`m6pGY(3Ff%Wai$SX)%sAPRPBJt z#*r`KRSjeCsD?30RRgTgaIvIDV$e!cC3%QJ}K!0rl{oOlJiyHAPye#pl zsMUn_d-64>z%YUQp2d&vY?(15FT6Y8!!X=fe2>8JU718{BD94aI#syv2RaIyG|)~9 zBAV7|d^*(vCwi4G#f;%cSJMR!{s(u-B!JQsDH>Z1J(1FnQy@i!4Q!Z9WU=o!qK&Fj zyMhP<0iJ@h3+h7E^@aj4YFj$m9I0j{A`~vTE|Dv2r!pMaOWvdj>(eujJ_8niti>}Rset}0l*^0`@fq<^Zoez zm|kBiKE;DO%83=LMHtN+i|<|h1QuO)bZs6TZ!c-S@bmvYk5@tbvu;6LpY8AK#2gKg zK^^^^BJYwuB42*)lF!3wbv8PhRxg%b?%h7{qhlQoqg^R)ikZDOyFIt(rT|M}o@(_1 zNSWb={N=#m8>X|H(%BJyWrPE~l&i4J&D1pG`fVG3|YHO+)FAU%*(Ujs_BT$bb20(L9TtSHJ zQAw`~%K$^q0e%bF>S2W3T;Y~Hoj5T_&%g{mI2s9zC_hd2{1otX)H!cd!Q;LW$tf8l zUw-aRhR0o5f*ks2BJ+KV@6UsEd@go88;kG5Gttsc@M_U|zKs6X0`0p0~3{N>zye6S~((vlG*0-;$4nDYp<(0DeA7VS;LwlXkv{1SYG+x((L*d@6 zSRhdlL%?yLq#Fa@r|VFLtG9HSa3P6;6Kba=o0#asqc)(Z$dinqaZkh-bZMZ$Y#b9E zJp)i2$K648th6$eMT2C8%1-jKe<^Ur)vZgLGwb zyZRuuZLaPdeK_&&P<0{vHDDCdp4%jRXwKr8lm-3(9g%)7xE*}v(|xIkbw!Ql;;}ykqOr*BoMU*@ z9Hv@4NiDQ=El;y#@ZgqA5!s9z09Ufg4lSD;z!|*9C9$xUXh>aKBIYm9KOYwILkMw{ z`9hR=7;ZVud;qWY}KVUt(?{UOv1B3&5noFJOUM z-ZyIiAN9JpQNQROd3==v7$>Pma0`#C#-ZA5vRwqmnpUrbY@qAwegg%|25u~VVDV#f z?&fW6xsM%o(MJC|*~YY)yLDw)UCoXRMi@0b^;pBIwCl%Q${>r$Hm0AV8pOxs8V-*d z*!HNqe~T|3R9}s=={z7mPMx8C#WxFdi>CWw8Zd2I7Yz?=(>mi;V=^(OD6lLLe~cAi z+vt18;*+TvcEW=8FCr-W;I17hQ9jK8mDlg$gQBaCV0UeeBpJxW&L4rvvGYl@JDvip zY(muZ34AX|Jc^%#L(yh~Z@TM`kC}y84aQSEQL@_c*2EDWf#JkNYjteY6)vfRTC~nt z*xTj%v)yA%=PTHM9v|2&{0kTd-?ShjBW?*Qo5;rEFYJ8Y`lyLp7m*{-Q`N9dAS1-h z`Q3ts_@p^BQG-L98vJ8jgMaJQ@MOPhr?B?5{aXCs{A2EahVNL*5%y$*hkkJXQ@4e? z$f_Yk>9)ew%j~5~%wJgipjc^BL!_fN`{u-bVxR>ksG^^_V5$NF#y6A0gB4QFi0xHxq6icq|gK{)13RFnE804TMsT^7pqaXB(<_M%4loiW#KVBG;+lqNF=T@7;dUG}8 z*@;uX#a~Prtwa}}Weu_Mx0Z8rDdB5GIq}LoZoRMeN=mSHXq@z`v5f1n|6qG~4%|nj zjJ3^q4BwizQ19{6p-(ro?p1ub{1I2C*=``a)yre(r5{KD&pbliE|7w4U}w0_hsXmj zjaghCX@~-yB#`qmnhOwi*jm2MD{MybpnJw@{0?eEc`b)OT)RcysJ3>N+iPioIIH%F58byWA zzK>g}eUP>|^@f9O{)NTg#}j(3X%n7j68^yq1RR#D22SlbL`R|k74IZAfo{^lqOi@9 z&VX5!skh-QZDa9+i(k>QXr}C#s*M*)8hA`Mz*2tW^6KN$sgv5L7Ji7KL!lsUE|v$| zG-e-MLE7aHXS;R|3KZR#2)yVTsRR1FNdor_6A0Qr!J~f285zYe&QM%9#>qz?IcbnW zRS4MGm}bMd(P|4%qZVc5LyLysAPHqQ7C*G}rU_}4L%-AI>LrB9Uej^jDa^IiK4;=a z@PL}K=^vfrc3ou2=wjD}>KQM>ujx0SP=~t1oDLhZnoBrAEk9^BOflorfQ|bYgYKb^ ziiJZBZ1t_>3IVl%6bc+54>;exx7>?;82l_{68#uh4wP}|(9Uw8u2nz?rk8_TCc~g^ zdU@bi)orsFJSA9EEmCGX7a=H+fyLjz0o=dYnVBS5$%-_SvBrR-MGH!27YPZ9q#B^FOf5AGzw~et zFl6aKg78L+>jZq&*;;({5;{)-So=$5`m+J~;l|F7K#w0E%(fo*>-90)%mr5tiEG_ZOXd}6 z$D>BEWuzJm#o2*1eoE09im2XBnxjL>?||B}70~!-MKl6(Kw;qws4Y)|@*4z)`sx*~ z9@E1RrEOP}Xz|sSv~pzJX%zkI@jZ&#j-W;e5RywC9^XS=tRXxf6d$L_-h4ab8=P{K zH1?;y?HKNv;1ECl$5@5zV_j*0%y4uieGBjJFdUhnk74K-h_*=m{hXgU7_?lLSmwC` zCaz&9q}u?ODxWB80XYWimDLs;1`(W5cy9t5K+slWAN4M9Q1wOYE5cRhyEU%Xy|!Df z&H7C%V7;bE&qveHf{n$;i=VPvk5tY9sM`UxL*Qk^3?4m*JqnnlGzR8FRA=PzvQGu3 zRucC%UVPAkWxa=Iz*r%Isv{yT+1&qS{_&&UqLPdLrNc!nQ#c3STHOno5hEJbrhW}R zh(UkP800HNS%XaoFoH^|9*=;~dLIi)KKS6S4uxUj1lf#$UY`NA+iIcep&E*i;0L9~I(eH2Ia^6v1I5Ae8`;pfAqAw(|+MD61aOXD4c*?pd|#BVY#MnAs!dcb}S zJP8=>?_hLr0iOmw>*M467_8AZn&K5_^qmP&CK$u?bs_WAS3DD{C0I_PXj3f~O3=^% z8|LZ0QG-+oUijzPp{hBq*US0mUpj*!heHXe>d+d&!D$*OXAL2B_nz>|V*JF;^RZ8z z4{2g9>@MMcv_brl)cRbGaBimjZ_KMi3V=U)X|?}=mX2p?!53Y2s!K#Y(&|RomV_Fu zAgoOX+hzBGRi8EmLv!hJt?G|Jd%u^ekjCq{u%nx5s9XClPf9-`fNMae*sCs&J0QK? zHZTJ5*HoXTV%_YgGp|G8vr;Bqa>Og}B;#ICWn_k;+EUSfy!a`HOH#pX~E5mQ=S%J-IT&tw3@7Uh~ zL}~2D12A+;;{sz(8+mb%)#b;MX}Kk?iKm{qeCeAb(rXAt1hEXdGU6Dzv7We2~0CdjAM{CBI$@TlUrPZouIN*=OR?XjJ+& z3}H+l)%9o`l1l@mob0(24B%jP)SUrIj$#@Crb-+Vg4O9UDKIc0x6E=B$FqwCj;W8R z2Eyb5Qy>H^hpP~7(amt!0#wb8ppiW-5H&#pC7mQ)ZIZpjeUc-@+f=ovHQ3E~C#qSN zVlXk!qJA3JngrDR7R$|P6NeI*d5rtMiC{(B#R9~Dn1W$=aR-^B)fnyrVlXRuex#KK z8P#IyHUSgPfE+SW-`b&v*0i9yvhwkEKSZ@@++>UM>JI*LyF zoS}_sys8_%m&2v)Nx_onvbUoElord&4lOvSu^S5idwm_o{tn61@(G4K4&R^ z>~V>G7^p=;^&i`L%VyIPhH;Cjy=d{WPd^4b3wMJV1aNa@5Pf}?bA?O!I)a%9ucayT zu_P$#ru-z|k$rM~GTe(q!<3xIz~yO}O&!2<@h@pw&U@PuSJpYHNkxeHNSYcKiQ_oBB{L`j%eny@oCISvj22|jb;bXycombX?a#L0-&23>NK;WCCFe{P+lOEP8oO*9o%%~yBVu^1g;(K?9Co-R zy=P!@_bltzaT(Ol1XXkszz=BNtkxQcpLQxvg$D<9S@$| zkq))CBaYJR2(-oCgQ|{t#M0y&H!w}_0#w`Q9JH{+)^a2*v#KQpU5yAXjJaJmg*U1{ zy)jjZ9w)Lp6=uW9+|BeTq_?~&WU8a+OiUp=qROXe;;W_D>T@elUS$O(N}MvGl8o^O z^X<&8hZlriGC~t_7)W;DRxzdOe4tr$UxgNI2#j%Uv^;c?H;_I%YEp@G@c|^Dyc&aE z+L>OrNp|R1wqhew%HRn#YT&B9K_i+11DH7NXPG(0fJ!>$VJZM4aeUEjopMaZdQLbK z!=lPI)?7>1frFh%CB?F~5yV!?3F0-35I1m_+pLFEw*XZCLeKu!s-hBCqo#)N=K7WZhGW{C2 z#@Q@-*=6XAP7-poC3w29;7{`1(L=~UR}_>)K*;i_w&O3TyrKWrJ zkO^A2m%yiNSJYHYf~IQH4g zR?-i+!+VHu)|7Xw-DXSi#bM@{Ji@BC-13{YwXTq7_R<*BdZ+g5;JX=nRbtw9nENWC z&D8YRd+Gkz3pVHk5tZ@S8GA30gDiZws zl`F;r3?GBgEBrbZpyav+kz zr}B3H7}#4?C_*v)qTiGieq&~tFCqokLi`|4$EuhDS9}d3M8>j-JYFB*2_kd*p!4Lu zFQ$R_3I7s5*`9WZqZH=1KqUQ+3aGyZGOH~z-k>3@rxpO>S)zCM|Hz}#u3(QC_Y#wpGwL7Wntyz14K7MXN7u14<>#o5!8`Un zK5*1(jYt;jOCY_BPw(R_b{Dt6=5~X`tl%>A1I?y(>R?szKR~1E8PKdT4I%2wX@$(p zb{%N6l_L_XJ5)0qT>EpZ#3^NDSOJe>XI(Q(vD{pJ5vIAu(D%Ttscvt_OsLQxYT==c zb~9(3eG4p$dTkB609yQMsb)--1@uksc1mbZnFaEvI>@aZ9JuCbYzPB4z~(OKC?xw{ zXpF!&7HZ!5P;h#>`Dc6MYT~if0JpL^MFQrww{gcrDCY&nJZd%eH=_J1g0k4JlU5L> z?yDNr$SC237>&g2JdO|e7B2I3NpCb1aIEBqR27nBPAU5;P*a{s#e3@iH1~b?=0)Q~ zlW$-rALE-z1*jI z$gK#AFpj=ZsRwym7~ElP-#FZ7{WSdgwP8W8%fDgtuV1sWa6WJ1bd`=-+kV!lh_Xgg zYAuTwUROxQU2hxeVz|H$l*)`cTYPF5Y1o6U%yq;*)z#X8-&iyhtCV9d9_ol~FhuoT z`Q_W@UtxZsX4fMZP}5Oh+N>2l<+G^!s&hPjYAU zHp^;QueZ$nBi__n^{GN}vmSV*Tj(sDDy8;>Y={Hc7$cox1h*l@*VcT`Gb{Y%j16NE zdmt6LN)#qcpl_`Dz>J(3z=&2r!0M2%aRD0XnNPIQu`967mRD2j7TO9BW}9{CFBeIZ zhRfQf`anu!mDQ=pe~CyiXLv#wT`_8}T&IcDYwfvYCezZv(17O@>+2oH`*y5qyWPz|UHvSn);Ju$A_z_p;7F1O5+!_MU9V_;2yI48|z`hr@Vk-`Q0 zx#86oDArTe_a=uiL2~;cVYi` zqY=TR*SI&VW!M8Z=i7{N_dpa*YP(`sBiiB#kRQU1MOm#0G`pDJk?DZ@A#HEf2@GpP zE!P3EUHOD?29Dn{ZC0fKT4uUQ@eC~69*?mCY@BFiGu9%xBET@a4O@z4l($|?NMPVt zFIt=cS}(=|+KhztVvH3;UZ+f~6|lgxcz`};p!jZeP&V-$I~r^mYJrmOLm1?0zYB@S z-(A+0W2Gum8Y4&f}A#AQ~mv)y}!@U1|u*bO+DZc;e?BmZFez~}oMYwp5iae!b*jysnLXe7c zO~fRw_E2k~x&YNJ))6&7oT!Ujz|QjyvWAMV9jllYDH{G3MY?S3VRm}E+f(<=HH|ab zMe8h1d1zaFHU)S2&K;QMNcYr;Jc`-0vuNwxU4-2Q@hFa`7%T)i0pQ&BavS%M0^^kP z5+a50Gwbh9!r7jC0^FG)5AaPUJa@r7XNYrulTD%MEcfz09975-X;q-4HU_v0#e2~3 zZo&C$<_>F0ld-7DzpbswQARcS=Wb1z>!2;f_4mSEh|6eNp?zFi*EPgWHI{n_k$?Yi zW~tK2D;iPVMwo{l+}}k^MXY%j&EQXv4Pr3+??C-p5) zEFssCHfUa%#RGEX^6|t`;<2c4OJ*6F)>leBatZNsynJf2%c3_VWIPCKi8NH+)mJpuY&Bf^V{=0_GWi<&va)k`~iwPHYxfN2Y<3i$zH&< zp_3*EG*+j8r{CY3dD8Jhldx2{snvhgq+22>Xk;!}C37)IT$#_eZ{vE93hCm_I(d^- zJS|Uhx%Wjz(V6S!y_SNSuWDbuA92AfqxrVf0Ar=vBy)ewoJX#M0{t>GnP~3>_=sG< zPatP#4=&urYZ`aMq$WK&CrZ3Uy^WK=ssNYp!-)bLo;LoW@pWC{%9pObM+@zc*YPPI z{|UYL=7{WpGNS!NVCHlZ(W+#XPY5-dWmS>1F)ATRZv;tV2?1jdjz}&GsS$pikB}@R zNEw!FM>+4UJ~VoN9R`T+v5YBwn44o$Fc@_n=~2+k`?*$#BT%&nwQ|?AxrOy$k5D!f zAD@9%$3;^A4mZZ?p4p*->edm&#?J$z0~Xodw(bc#7H_{kYrLCm)a$(HV|&u8Z{J+u z(eJ&hZ^JU>*@xX<+BO?-@i(9~fazx@ahtW+x&Y1_aXbPmj$QEew8yvGwrIFi2EbDe zAjRHyQmVddGvzZzM`0jy#*IZOyu4aEK;QvbmYXa7n!A6xCGZG=J@CMq0 zVOMQPh|u#Ug%f*d%I1aZ*BYkAfrKAPU0d#b0H>h5-zcbKjZiQ9^DX9k1$|wurI-Ls z8~sS}api*h7X-!Z$5z%JBDvmx6p=e(s_Tn}sp#I$Ew}M2_>I}&;fKg}oXldAWJiz3 z9g3HSBE4a8$hu*XBJ-NYjCTSB|DelRnF(2DoIbqB4d2X@;iIW?gcy>IsQ9Lqc1A5A zn_sdOdutF!UC!iy%@2yhGLbC6IJX-Qw>S5s;nv~L=JGBr%yBL1wN0UudOezFIyst< zB@8RC<&B3GOeA2$M13Ds^Q5nCtw6%RU~wL}K^HRaK5{V-&%8RkG;0oBek(*okUFB6 zc?}Dqqs_MqqXEOuc-EW%L_=FGdkbI;&Wl;#$DN)qqNYHnh_L!|VSsNQBTaiso=%{S z<{uqFglGqNs9H6XUPWm-5C$YXg1oo2+%IqGqOEom*5?|%GUFlR;Z0{6S_EsOC)mSv z^ODCPCyfX#0op)lD!$XLC+nO7;r(AIg3shLqBfSD!KiJP^!N8VJeF z33xVVfSY$V`UuIaWO6uNvCl)P0YGUc+0cC4qBe#D?>`G{ryLEK6bh*@(y1?svc|du z1Vy`T*p=C$sBLDuNI}L9@1m0kCdW>R@o09s=)#j32 z=I-S8f{@)>=eKB>U34!eM1gFqDq&H`0mXC)fQb{kRjpbDNs9&@Aw+RI6BAc9M^;K; znR9-;Y6aNX(UC-B2fr81G3jjAs36357KSNd@hO-P=ke8;J-H;F3XIYUU@>dd+G5%4 zsO>YlU@Fs^j=HX#NqSy#bheME%}fxI(gv_DB3Ty&dYPW)qsb8v7H+g2KG@sJxuVa{ z!u5qX7iPGqL=|93>g&LWP5Ab*1w_*qU7eLly}?K}{S6v+HQeV@;2^jrLd!P+*T zx3BA3{g`1??S8~Q6)lIy3-xx|{)_`ATJLm<_A4MS7aetLxW-JMY1g2Uw+!cdOnVHT zRt;7H%Z_RBrf;je47j;CzIWR$?5Z7)I&#r*xzPB4!X9)k@ADB-TCE@=37X3 zl5p|ZPVjKr<-X|<6xQ|}p1q@kmfHs{ymp{v@O3@o#wWp7^|vH+$%oBZ~<#l*hroM z&UTL72qIY$u+5`6o*JwL^+|U(Ca2ZwQ~vqZJ!`f;Dhy099+pq6uueHGY~nQ|V3QIs zGxjFAA6RBETBSYuW{5i1am<22ieetX!C{M;Vpst-d)musA_c^(M}zo?#dk}VV&8ex zsso-lRfrRR^vW#C7Oy5UE$V@1!D-{+Wz-3hLe-rdqXiXfN`g(ue22BM_!+)DY^)7g zNI8hoHn;(;BqcD;z@$w%sbrWpubNS>;Iyor`{i6Y7hj$8RSDe1f$QGOXvDI`p@I!1 zc!VDa9*u)yTk4;|Y_x_unmz@psi{<$6ES%lg zT$|RPBMDp_9Fop|nhseQNI2eM(DKcEEEiA(vlq}gA|cRim6lWZ@<&^EwUQzVGyA@t zG(>SNC&4gV9#vBQ(Sb6;Qlm+(uLn@wq!F}kQs(3w%Ex6uv?#NR4p66V5(k9L`dJ{T zfDK^9TQ_UOa)Y|=uYS@U{vN4Fe@V06G*(MpHxnaDA;Zvf&LCHtd(%Agj#;J?;Uqm{J| zj`N435o@tx*16Ql6(a6!9Xzl-st$f*QOAAic>55;)V>b2oBP6h`R4@HSv0FS;%{qS?1 z0YtG#6f1lop5I7M3jtrv9xaL+WAXhFDl0=r@r}jLE&eISS2J<7w?x#2$UaZU%>Gev zyyv;1-2e3R7-HBU7JYtmbrETdVX~wt0O+{^YDgvQ+0zLEymSLF zyn#gwfK_T)JFUVj&i(-Qs_(Qf9B(fX41Bc2goavD`exqF7M}8i8D8=Ec`rWAj@KLk zDiaECT?J0U052Wdh@-S(8Te~n!S?;y7 zhdh@h`Sydo*}dh~NDkzEuq@D3eQGHWB`@r47Y$Z>6mZaTxo+*dH!rwc>$4UF8ClwJ z3Z{lybObxdb8SAcA+R2XDZydn2t)po9!6c0;z(#yX0!-66*0-mps;O2DBAIWMLaFN zfk#q*ZSju~Na;=*{YKfKKx#1XA0D zOBco?tPqEuEOOnz(`chrWL3SmkX9XysrwWK#)y~valI&>t3{<$lKh~Z+_dO{Rp zHjPn>nHaAW1g7d}?um@zZbm}r)FU55Erf!Nh0p<&5Eh?Gy{~FVLMZfB2%FDib%$6? z^6S<&!`F`}tGn0c_x%NGDl=TpIl%k0NAtG2d@JH4;muG_6JHr4;$SBBHCQVGmXAc3 zh?en<;lw1!i!cT+Rvh#o3ffKgVI|0hb=KY7QTAq47VONc+(b{UKN;P6@)DPQYG-L~ z#HZJcL@}$UQYvP{U~Hi`wAbF9(_SrBsyt1IEQM5-|G?4;dXZ)x6a2U5A7}KWy?Q<0 z23Disa~RvP)-dP0AZuoCa)k+(J2jIrnhNa(4Aqe$ zr0DI{7S1UBl}CK#)e9*rX0`GQUzEXLo?A-2cD3NSmX->&i5ob5=~c@Lx@!yDgKZje zyx`p-_XMLo4B9G(y;vh`(}x`e_F+ot2z&--wIje5<+rhtW)-QShfdQxG%r6b@cVck zZsqUR#~gQ0rLcXLGJqS~(zo+QC$Ih_1zog@;EkUC?-2UrTizg*-o8f44E}terxv(c3}P zI+RK~zFI6-M`H)v_L_y|6yNQl4<-p>P5DWx*tYhi8m6-iztv$21!}>jDPjiDH89rG zQK>b?*97Eh#)CjAW&_zO?*LlAbMnPk>o=Yqxx3;dFUChCZQNYzr51~_R$YE=1lX=9 zCD1w-r%6gdz;&$xa=ynnx zocb}nwZjL@8HFk-2meM#=L5K*RyNHTWb0PcZ!%PTX4SmxsZzQEh7ZZ)C~5pP+*0px z#=BQB@XSTk#S09R8Nw&o48+yZ1Kk zfbRJouCV6L8x`YAI{{Q4ZeOKv)+nG z_-Q--0;TAyD~6&`>UYIpmFuWzDhe&vykLU6jyj8;5EQ#L<=WDH%;`Oh8eFWJBCPng zb+)Cr)GlTspbUd+j6~h#?AnP@Iv$V0L~3?I;#jU1s#Zkn^+K?C8?AI6(0}DjHdzy< z(o&A*t@t^7x7DUl`D%C0>#-sFYCOi)tTeHE2qlR94!sIi)#hThz50-C`&%=M7kUp{ z9)t^RUx#NEK_Y_CxE|x1;(rH^^lm$us>z^d=0ii!8UffRbQc#DY%KoP&X+8jPBJsD z$u1TseFB`{^?(_Do=rUJ&`}Nkxvru7R@T7b>5!j)%!?ld zWwe|JU=>l89kQkj^n#7@? zD~>*EzH7gP$GrqS*|D?xJJ_0{;m9v|8wUu=pR=*}J3D^}BDQ1ieqP~U{*>ogc)hSA z{<=`pCk`q+VRQm8wil~y>j1u=ji>P(=tX|=-y(VZham^f8NYQ}7H87|IraYD7Mq(* z<41MWznM)U>=*MO$zilJsuwr^^K@~KKD)5ApVQgV0$wT4dA&9o7%dvT3=TcKy4M2D zRLhUXFgDPKHovoP{A>s6Fvtc~v$6Qa1@b4H_XDH|P=iHtu;M*#%zl>r#XL>0d)T_Y zO4C;0rk<~ZZ>(+4tdNu+wRzWv>uPukMJSk~zx22sEY zs-Tl7KKZVPasz;^NDUd|EMRu$J4)q8TUp|(s30fyYQOoW*!hOG3h2=4!tU(gp84?j z{gL_*SMEK5A`{Tw{;}s(`K85gnmmzrV?vT%^OiJ(9CWoNlrGZ|sr0Y+T9y9P z3U~o3^ueL$-$Jj_N88lNHx|0(uzSbV7-Kn#d)!5`N^awTy6-8W@!58f74fE=Ij1Uw zDC(iIWRITW41niqA%I^tFrzU7zP+djHQkqmH)5=e`>JRRwrj|SUmoOiVe5mv72Z?Z zzU#xzB7YB}W7@MGc7go8GI^P;83OnVZ62gkes@i5p(W*KN8j9At-ju=+M67`Q4Klt zB^~3VeK5|V@lWTnc5A*^;#NQ!Grx?r(|YDJLts)*h*w-gq;QbD3Lf$U_|94~nUo?v*l9tU>oaZtA&2i5gFS1!f^l{})FyoB^#Gc+9S z-N5_ggPQDffr(*I zR1}`}p!#k{@T{TUJLz%L-wCP3;GOx=hcMKc>FfYW7Tx`ab}C4#8cL^WataJvE}B+U zFk=_DJ$1iKg;lJ32XYxDO%+wpfLOVzTcdInG|DMeyiKL}<_8dW)psE)!;d&GMu}izF!}-l)8Yaa1FAD3v`f583|6&{f z;-kC=S0O$79)jtx^EGl1UD%X%+ftN=U{mNPJs9&VvyWd-ZFLhd8Mv*6gPNNwLxF#q zFZ9@@RA9bfsw>d}rNgfx_Ok2kBBrv3^@?F(c2u>*v7Sp3>O0>>vr_?f2^gc7HvN!Fr^GMRetgWZHfg}i$AlclPu5M{$d&c8M_OXq%2{kyxpg^{d zKj@r`stZ&V3w5h+p+MIB27dMLkYrnyyj#}3Si3cnElVRymMz)xDp|G`%g+<>L}p~Z z`QF0xIbFnkBQi2FGBYwVGBPrgy67s|#g=^Czmr!c!os24tlw3?9+ftt_TBD9oWL&3 zSklnUm)j)u0bj+MKiRv#!T~1eZteX}-M%YXWY&n06y(UwMc1k`%nCSRw*Nk4RzV)u z7ekJm1mD!{IKo!Iye?%3NkW%mi_r1P-YXkfkK$7cxraqeV=2dGIB4%zm+e&mzlPF_ zyBdGJ1j<9v=X6*x5}VPY78T&AKhth%B)?ChRSMGBpr$xD0{cgp)n6|-4KXt*( zLPrq3Hh-T%v1gN&FUz^~8>L?&9$@Y>$>OMF5oJ{kl0p+VZDKOL1iIhPi+e4{-S$YF zFZf~SvWx-p_PjpUK-b^7hnGIM$Tu`5Dues?1|v^#Ui+H@TSdV<9JZ7m^FSLR;~Ybw z2aQ;?(=S_?mQBZl>>wx%J7BZ21GNwo%)wZZREy5ZAqC$IltCQDZ0XB<)e^qBU<)9a+?FSUKe9&!f4-eTu`(3u69lS{c>t8qZj%C5TB*Tg`tg9I1_>jl;s2mit zLIwwX;TpPtUbdrK^!A8xyy^p;rupFlE{Bs6mOFN88cfKRsf7lNaC?zI--Q#`Zs~~< zbzEV>B%y;`-++Lyxqn6isDQ3@q}evRua(RyT|n9Epepk_klPZGB5$T?0U%uPb5|3J z)DXU2@~=(7D1n1i-sH$42#_v$w4FNyM*9Nzyc4xSAK#G9Vt0P9=)5Ge5#!!xWGgSh zaB9eu3O)v^>#tO4<|uT~biw%D5T^Tm;cmApeR0^T&>0}ePAqq8BhVWlnSx$1nK616 z)jv;9PPT0XjoC>T%EW`-NaK>~^$9nu*FjCa&uM;Uvij7J<@R?(lV>yyLCd5(D;0}; z!(9fr$KhkQ%MfS?i8oS~Q0yp8+ZJ1{)AEjDbOK~~aMQlsaLo`o9?69EqNHsVY?@*{ z4v1|{tua3OxAuPb-d|pN_N+n2L@_@}Xx={sFUSm5R< zcA^or(BS@Le+|ula#9a`dfXorx>MY?CNc8fh5}_71QXw%;Azz*$8F>R+xPw^^i20H z&Fe-A>A6SHDxPp2*kRZ{(31@SX$RO#L96eu!5{c~F2|4gXAxXJvEM;F)^KEqnN%!T zD`bgO4#$Ai{Rai3YeO9{^|szP8z5Absfu)k#79FX7}qHi!T9H~U>x=|f^kgjFHTD^ zfK4z8&0)&h(=sJkG|l-|TW|%PHcboj4Sy02tdxw^iFOD~r4fQYC{2WkXc6(gRw!4? zlGxqK`?NaW?NoF$-8>185p7emdwo*y{%6z_;7QXJV$>xLY3^v&UE@W z4^dCi))j?zvDx zECWzfA&?!dx&ll`uT*4aFOO6s0nz2n6laIDfXV!xqR{tWqwrBLISMN6{HGW?$aG|W zJVm;>zkbB$KzN~lT~mOgF8Vw=iW7cle|0!X<-9kBPV|i#NzE(>h589YnH|Ezgs95D zOay4L!P7Ai#LRRm6D7WyPoy300kV8U9q8&=p`cM>i8?pUhahJ)wKF0>cH$DFubBXW zVKN#nI!3l#a-xv=lIDaKNLIc@3eX1>e}FXJ+7%-(%@fpN28_9VhHZ-(2zbokZgL{3 z7e1#ehlf2pXd@umTvo%WeR&%}Z;aZww`zM)6(@MG-ptvb!+7^+>?Q`C$F^J z1i`7Z!u=!oi$p;W5+kn`^6O(nH9AQ++JE$Q$V|nK`;0Hypz=G5eakce2K2!1X1Z>v z_H?=SjfwiZM;kb$-@wUs0Pfx)Aifv_BgO;4AG}Je zha6Doc<|YK8)~F>^Y5{UHEtSnAnNZqxJ76DZ#QTB1uSnn{%A|&_eCjo5VSfk=Jz9O zYw!0=9`>@fjPTi(VF6QbWli4RSuY+Tw0~`&p( zsa#GM0FfOv11#z)*V}t|5lT6fo_3X`Kq`@q4LnW(tcMJ*9QaP!RcaWu?0eRi*-Dyr zCwFgGSF6V-kJpRit81tsdsL2M=J^CiGuAG=RrKSTZI}dni5H}itlzb z><=q7@(#EyE<*^6ZM%kNnd2J_&7YUB`iw;R{N3e!bdUE;9T5uN_s{VTB0Ejzr49&R zGrr3W?cb%`RCQeAN{>SeqU%56s}a92bc0A3S@uE@KlPzMeUG%?(g>LMk@gPE%4&=& zMJl3%S}pT3l)xL+hbfk=z2Cd{w-0^;HRSxpsNHUDSJ= zksy=eH_&c)#d^nlKfezaRzX67gOkd=4 z>(${zv?T6$lU6_D-)}B{s@jw^Yqkx_7T&XS^>DTG6?ga|qhWe)Z+WsfUHhRi+4Z4w zKD&-LW!Jw~c6ACEH*UA~e&4~{HV2ftsNCHCY+?Cu#hwyRo!bhpu5U$6+hcJz8^m4~ zGI|cSEqyXLAeWxmzQ89fMZ{9lC%*7yO=eO#keKGk86wS;i`7UmgLNz`K&FELbCt?zzSGft81IqC+-xDID zRkI3B-}NfRR7!%!o3@Ct_(q>}M|@T&Li?V(WO}q_d}~?hN4NH?Q15UP)VCI}bGK#o zKP>yz4HzZtaRZL+Wkzu8S5)&e0#5ZKuuWWznwW6EkZ~5ZxZDG(`_v!8J zc?5dvESbK^3pD9Z_-whmzktARBH);5wZd)z*oJs~k1`C`u`;anKgGg8qC32#@Fe_Q zg#2e1oIEACa=83v@i{Vnt#MX>coZMHfL{FVNC5;f+GFz7b@ZPj?=>^=AEQ6qaf*?(Oc?JFV9il) zCkiwCl&x1n?PwL-GNH)%A$B}Wymo02ut@@T&77H*CU|S__wW6MgWqO$`76lyaY$c& zLRAev@bxPJK0}ratPxb!{ivmcs2q$@Te{^Cjr-)1T=dxDvk(wWUkoTCyT z9tIHfC3+O$rv_SzX<{0bA1ke+TOa$zsK%K}3@Lap=gTF1;e3Gk&jVLCC zuyv^S6n!MK@jS5$?L49DAg^z^xO&+`^q@|ngT*%L5wYH@5eo6m9L2qr%qfOu|?tYonMsjI#TnIf>Mp)!L8E8EdN zTQE&JI_}`tTNmNv$pLqfe#>9#00Z3Xg461J#y92{O;W2qCBPU{gTo7(#?_kpcFH`tCST*+_1h>!lufB6>zTLj*JEV{stNnxShQw}%cYZlE zcbOoIV~0;d3Pta-@EKq1oF3s$2&y-kqrCeVc?SR0atf8^v7rA&IekL0mvQj%X#a5w z*xLJp2d~>`jH~~cDA$&UhbK4p4`tS(tdx&6NG!^Wczf~H5`)e|!C=GQGQp#W&hE*AqA=(GIP6*Rb`hOcfFVb+6>NXaE;y+ z&q5Ay_V5Ls2mvpVj|3E`*y!LVB*gNP&FJYMHnlPqvZ<`5b!L`M$6?gr2|B5sWNUG! z^$4k|{8SK}nQ}`V&5{@+dw&VLFetH^E=7h&&tDlLmsBtNhTK`?mb`<%JU4UkyfH5< zvAX;4pdi4hX{PQvncREWMcdZfP@#{C&r*mRKiE%=)AvX`FrJ>S{H%K6>qKoZij;@Y zAiacD_zfz<#Tm}lA#@C{+Tld_L)eo8q4~JA_lGQ(U5*~m+Z)&5OrV12ZorPqMMDb7 zLMPl0pAH02hl<}kJu$oAP&ykU>Rnd-iPS<>x+LjY=+0n83 zJPF!}+o01o2Ktcu#w>G52?ra5VAt)p0hha=8$2{sP#Il0++X-?_(QTQX^PA>j(4JG z1;qH^V0VrHZJCNw*oqErq3xa=qRTbR$&Kts4ZYB)B?l5?k^K4U*_E{|a;TCm&ai5= zu`2<53OO?-0V%hjla`*Wn*OS$C%)qYKw@~#e_c7j&8(1&f1(iqWpfNuLH<|4?J#2^ zbW@Pv)AZ-G-vVq05FxXPTm#Fh2&^L6fLb!;fHKqI%p5jfX%=V@aIH@j5??HidXsnq z(KwUhLDj*9L<0qX|8W0gFIOrM9uYN=%IfR)up$JFxn{i9;Pm4-Q<%t8wJ^c*rp5`4 z8E7_-9ld3ko7X5>YG0+OookIwXr?1XOvDXWDOQpZL`y>zR~t#iy0zO5lsS2b#Xu_q zOcn7YgSG|l%;MA5-XA`AXa=4IT;fJHu5xo)8F?ERe^@7LQL5s=9)scQ);6$otbTRH zgx6fWjQ$_l`(rQ;eDlpL4o3;P_eZ$Rw{Xbq!_{L(tkj|eKI1wVBrB~8{jh~F~;zQ3c&WljU5^d+^ zdlaBiFF-UsKz8zAosZTAkw&J0$=kmUh%dB;Kihv;qwge^@+}Z4zNlE$kfr$4wbo9` zHRyr@n^rr9f!w0=9cT}TM!y&=j9J3t;b7yQSFaGKcuLebJ5&v-GFw% z-uOlQmXncRf^sQ~FlH%688^06a^51hMXx z`wEa*3CaONQe=RX%uT&WavVMTBC2RQ9Rl-;Q!5MiUB8ucY_`9oy-<_UT~4SKPT}sH z-Yx%d{hShq7y8w;=zxD9zKL;g>I^ z&?yt2jd%ZyIr6cjjI)|Sfw^ey&-K^aq zSx+O5k5RkjOKSQS^AdiTECQ>e!HLoZ0$q~A5Kxha7`c`SZ1b&@fiY^0^;E%V+w+z? zJi?$^y0gt3u~C5sCQSxTh|1g^O*;hfa)h8AlhJPhO>;yQsS9vf3ekE63gK(BbjU89 zqoqVjtpfE`$_Itmm6y6zpn^rB_o_D|mRKV}c#0)fo8u$<5WbRMhL-j9_>V*Tm5-%k zhzqbXm7cLY@oN1@Btf6Qoz?&?JG`8uCCVW z)z>ZX#Q?USFZxPn#FI7#HD!@$(G{GfkG@l`u?}S76DL?P*c>Q7UPgt-HN-5Il|@3> zz6S>m*Efxvl|?3juoiWpw!A7%HH%0KoX}OB?lD#7T1N(IQSODOVd%1ZsVgzWQI%s1 zkfKfOp?T#x7QWK8lli21+A?W(a=c?l0;a8A>rB#B8|f{68urcQ;?>wA-6~EevaTp6 zKl;|*pV<48%WuEW1txR`I+bT$m6wSy?R*+m5p?$bQ!HcFZc{H1#Ltq}&BgxV>3TUw zr`(Z=LVf{hAe=xjtyoz~;t349DZNoZfoX|&g}Hsa+$m2kk=fN((`4c#j+jp?|rk1<22|dmwh?^{$wc57?ND^-(kizAPBQ%BYGu z%=KfVHyD49y=LQObJyb_k%vWjq$_|@?2Lx?hw^=U|8CRq$XG<89-l%d9nQBWNAw4zp_x(I2^lWr#g?%%(a9- zW6n2V*i)L3cP^DQQw6xYr#pBDpfY9Ep`3L;@uON!N72MFh#!y4)Op#KngMZ@e;sED z$May_hVF?cbzu!dE&$$ChC39)cITFb9sVioD*fg7l=9-0FK9sB^!u7e-ub6f|z>etaa%Ib-pDJu$9v#3N&DnHHzV>{9CdKnTQ5h}@- zT+|H3XkjwhlSjBDZb_g7)%BGgTK#Rp(<}wzsPp^PYo7Ln+9*0xc*hDN4f*bJn(gd(G}UdPq~{zli3P`yEE;XJ z(DKZ;IDr?0Xq^Uo9)x(_jzitg?W7EYI%^3Jf15TxZs8r`el&B@mgEX`q3*ThmPg(5E-InG{i)CVSDISMJ;b zXO{j`GNMggz&2x|pm7uP1$tHm7_w3dXc|?m9fghOC@idrOz67rN!?i?pGZ*Q8EcOa zFlP@gvXsaRa-d&74On9FXE$Ehf%$U~jC}e$ zm*%GgOKfH)GLeJ0DYZoH93ie};tMxe?F48?0Z#>Da-zRz19-k;77Tz7XHL<&X7R*2 z;1m8bkR}J`wLA9EI*$1$*-4q**Mp)ZY;%D{7!%0xq$0itF6GcEhWaIt*wX`5MB(Sp zlg4p8XN1-y3+gv#0fmeHlN9XSVt7>ucmDg}tQS+pL{;qtrqPjsoZf+n&JE%yeLJ6oH=CxZ9 zJF(NJf_Cc!_dM<_5!4tBejUREPVf`k3{E!%KSN}cQG>pV6Sr)lF(6^S@C8rE5D1_F zeX{qDkX_gT)Ap#Eax<;y?re&^h;n`vu-SW|5L9N?lcq?cD|o%i$c51dPeyTi2|5>=mMR2c1y6J3f;)UZc4|4nbZAGIH`TWVPcsr;g{56 zm@2#@D?{vP-OtuCFe?t--k8ECbM$if7?ucTghj?IROQm>pT?#;9Ta=UyvVJV5_1DD zXL$J0a`gbQceY;w$OEfyJXsu`V%-a%wYESpy<6&RD4->^Llo2ZH;gTp=CI&}Ym37j zoO^z7IrX=nfKh>K-)^ z6{KSIMt$z;22ied30stK(}*Xw^Hn=MRqY?9RcnjGCQqw&U|V&$zBXHVIXSM?mvi0; z1LaQ3xb^k?)d!o}{}yHv79xMZWIPUOpAS2lYkdo72PW5sXq&3z+JMIV=G&}sdeL{yK5TiYYQF==AdTX0~oRfk%D z?MO1f@zK&CpvL&^3CzmqbBhvexc9gn0#U|borDACCz0MU@r{uw!AEqKA1~If$08BU z6UsXSlr94c_*7taLnw~Z0G5)C+N+RM$umCt<%L55eW=4!m!)e3Dj6AtS`i5t=Y7op ztxvE0_|b`K{4+eOvv4%bE9{)z$%U^qV+?HlNW@#QVWa(My*f25g0J#t70Zom;IsT4 zScaLzzlOO0q?0agj^W6C>`JP^P_S9Ymx83@D+V;8waT#r2rEc>fY4BvpD55uau%?S z*AG>9-%4OZ!}YC{o5&5!dNl^TC@jum@7q+x6p7WTIG{*11mNTp`?dPBb`sw`pc zMo>f1aB5|Rl>8IX{v=16H7H$(2ad}qzz`sH2_FD2T@bJmd=ml;K;fv!Fd!x3C5thD zMdMPEwH4)VYbW3+R^VX|nuu%paxr=;;2_bwFxE_)7riIYkh-Oz)Sy0R1~vQjQ`_%R zorhF4Rm{ntDVQWGD0gL1AVJHJ;bim0#V2td&bFKG*(7pw&dvShp(m>V6)r0PxJN;? z`yCiu?28idojZxa+~xyV=gNTFjzN>6!DDFK;DpmO7{S>fT}GuyUTVKKq<9~(7txFO zmItHAT*T*Yyd}t{+59R>PDh#wKZompy?D7D7;u2+?Gb9!A1jzV&DN!W-zj1Aw}k?3AS|7NW#QJ5 zlAY;|AaGXfyxFP|RpAt@a>^FPs@Cb7TF~RA%&omYyZ7hybo`~DWk4O8i)2w9^HO@j zFV=D*$PGwV{NsS4$0Bs?HZ_D|W`vbSSA_$R8DSOl&2s0oWQd!9OHT%23u~(#6`ysb z0s|wySYTXcI{=1i0Dj5xvlHThe4?b8aoEzIF!v3Xa7>$vFH`eN0D%u z#hCl0(*>U~^|HYT7wwzN^VlPJhd5EOjn5WoBqhm{REKOq3%_Nyl111~Xd3e< zjdbL2&Ka0|;EP9hP6`P63>|P8UD1^r7i2;oa-oEDNw67_cfUc)5#LXCIj20!{>hP#y(m`{zX=HoNZKleY||jiL$t#>u0 z(#|b|Dj!j*+(!^A@tp_6T}2WdRbZu~kLFcsg!VJ)R3S*gj7e&VoKTfhqm`0p-USmL z)z3lTabFMib%gvEi+h3rUx+&PEVcL?m&Om_wkyX7Qdj^hmUu*%%>af%esAs{@nMUU z76UMa4<&=>SlS)@RE{_bn=HYws`a{R(n(dw2Id%1^S12`@NgqHLT~)B#v1 zy87Bo(<4d)nM?M~?TkW-!^oewS?n3++tm!OK$zHa7cSAA6}?Kn`ld*15Uha`t@#HK zvrn|V`GNO{40p~g?)J{=IJmaRhtm`A(+-X3K@^tcCQMMX4yB4bKn38(ZPvjf=4fb` z#OfV44jj&>;*_W_F#_UegioMcM&v9l7c6ExcKyU`j?Z^=Ki?gvAi%>?8r36|D^GCR zuQ%Ey07hd6I!qoMSs{>^!<7j=c=8}T2G>|v?L9oI>AM0{W)?*m0j4e32F|gzOE9Yf zYU@J_wGIn-x}(!}Ss>VEsO^{lnGNJ|x%OJqR2A3_m`?Op;(n9bYPoki95-IlG`2A9 zjgkwdKEl4gZSVYG{t&p)wDX3R`=^6X)&^B_@D8k|gMBldE^|MyL38NdO6fl}|6@1s zo^BGy{qPw@QWEB86`SX$?5}8Zb#G!E>11;-f0TjAb!a=a!Y{6TRB$do(BTFs>PC6U zOu$Lsmd)7QJX9d~#_o@aorBN^8E&q0J1#v;P!ZR z;+fa@RSSj%pBBQ3VoasEZ|Q31`aG(daZ_E%u2MVG32HXL!HJ!@h@KC_Xp4Cbg2b0_ z^G6Y*6M*=r)9tb{vhBLzl(@P;I-eg!Vae!{*%IL2ZUZRjny|m*Q8_pv_AoLWiI}a1 z?^MnMbgDX>E*+h4tLvG)fNcAehKjKbh&3|P34pnD5~b?5VdcK9;KhBuBxF4OW$RV9 z+prgcKDLqZmvtO~Py=js`Vwq~As^ZeVXOSVvBuR5bfW*?LN^1C+ zfix_XM`JjiY2BGVh4{5ZjB8K8G^(SuzBEpyP`@`Uh*;NuB6bPd#G?gLyf0z@9kwPp zm|zN~ih@a%Z8Q{Os54UyyE4HCp5^1L;?x?B-;&6*q(t5nmR~5Be}kHzdHjxfz{1zO zO}pX9fo%U(3~bZFK0Ed4S^H#KM_-=NmzA9!qm+l;xCq0UE8I6+OKzwUmeu|vXGUep zQ3$wk~I&YJ2RUg)ZrZVHsoZFO*K`cX+%EtGIMxkXp-P<^sXpgcn}C9$d2Qapj~?VUcl ze}tWZaMCHuj0CIGwUc4-O3XB?oWztmO_zaZ+ZAM{xBz2d1>E#wg2#6qfAow7*p}d) znE=}1M*;eZ16E#+kjFC0B^bSGmAL4JKcfD$Kp)vD+t%J+rSsSG?4@F&_r9U0?UUJ3rE_)@DPZ`&79k`kE~ zDMufDXQ-gI8$A zSM&LLA8zU7v}3Wq4hOwYxH)hcxD&dV$8J_kin3N4VzrEoJbbn-Y+E3j0A4Oz;^Jk< zzRkCZ((gLlPsXAtXm(D^$riil+G->y)FQWO@zjSr!;sng)grWlQ}h~OP$g7R1vV_- z;pFn=k)e$gig*iFreW`*7D&T^i5hI0s0)e}4v+-Y0y$hzO!{7ZQ0n~afOwk*5QRGl zQUVON_WnAxfIN9^cNC;OP^Kk6Aj?YyGc@UWV9O1-&SYlM)@-^42=Js2^G z_AYaLFPa0$5nKX4WwnU$T~-z>%?C>yAZ2q8P#w6WB>*4gWp^^nuoAm+z%;hLTcYgfX&O^nMfn`2N4t=fiU&_9kDbXd<|Sx+V`7MFc1grWzBwUkjlsfT0P=W{1& zh8%B_1HJPzLhzuGB3m2v5Q8~iha>~Ttg)VG08LT1tqYLNveLBpdKq(RSe?degjy6v z^wDqfi441-yK0kkLb$n)*TI62&ABt11`)X&jx2}EunI8|!C;>VTQ0Rm? ziH9EWjq1nB;~k<$wsXTrI`KN9cIWO9a!#RkXr^+X6WAuo>rI6wG=R*X5R`Pv9IzMN zqa4uq{EC^WEjfw+)MUFwiH?nnw$XDdL{Fx&+}|qK5UyOar1t#a)1-bV+0yXI7y(j= z5p`>Dxl6Agfm?fj>)^6EPm58}poH@#2))3xEST5JWa%D$ z--Dxcy$s`)@NOJ$kiq{czjPX>b9iPz-g2Sn&38YnMUE)1AdBHPrE;UXxQBEc)0&U%cy_xPUKXWVN*lpa%=43=4kA-MquH zFJr8pJ{qthH%TL6I5XfnsfQ7031YSIiD#I>%soDif!iK-zgy}pROo3-tFc#0*^YAt^b*BVcT=hfs5yEf?)JPfW}1yimLXyOn3bN z%is3nrFmxmm%>hllm!i7ZM!myQvs6sXE5F<q>Ir2dEcO)-Lhck%7}Ggw&bG0Pq*N)w2*V0|gY2|cEtC%poIaf_bv z0;>ir0fsdC`@{g!3&C6w4_1f!E3^CUZi0yiVB2B@*uz;Z#}Yt(p+0Bl^`wg}`}B;s zHfz6=uz#O4#8-VN`LkbU8XCt6hCIf$K5|&376{tz+of7917Ow+f}wP51lBsX_WtgH zze!JL$_B~!74<4njt~mWG~%$P4-Ld?J2jzklc!QA*`Q)K)+e;%t>!`NeSa?=LTB3g z-$07lWD6HO>lcE&ku|%{5E&t=60| zOO%`A-Z+8>Wl7a-y$MoCP3^8*M~L&{bdeoMI;$lIQ4Yb3t49bzAmil7*NTRtH|d=@ z#^D>Ri3eJU?=F9Os>SSo$Be@4#6v4fbOZu%BN7;Z_wdD!1)I`*z=MM*m-6MZM)Sd78L0%Soh=mMT^0MF~YieN%lx+A(MHTAk+}ZQvQL~n- z!ituKSweNySgtdn53|+Rl%@^Wh=rO;Hdl%QK?Aw;RS}6pY7lC)FYpS)VplH<1Nl4n zUIj)a*VKv#CV!Zbg6n}vGOle(54Zhd%f{8!(do&Zg}p#w;|mn+jx=hI-xjmR-{{tc zjZ~AVt_G;#7DQ|bYY? zM6&+}Rso;*KUv;~S9t#@gW_2lI1u9M2nt+;j^IOr$YXi6`eC;A{?CKg%pSc&N7nVL zC9Ou-5fvjYIYjX|bOJ{eDPrt567m^d_!tukqzxPuQ+Gm&{Zg4Ki$LGL77Z?3UkVah zi&0+u{SqpD_xjaXEpRoUX!y3otKnt((c$Vo;&~4dhHToqa`(EGhU^6#izARWh~q6S zNw}2&XO8Xt3eiR$ult6L!-1-EjD$!a_^^^FrX%8_2WI?ey?k`Ie`FV8IXwR_y5yPf z^pKffmTS2>@mY}^pWUXv6Wr=K@``ZT%PG7cC)0NKw89GkyNux{*T_a%5ngoyOons~ zNimktmC9#;>UAFR+3h4^a;uYq$#*?l0Y;B;mF*0XAjf;0_Bb-poh%gAS;6-4V*S&@ z3G^kuDzv-__pS+40(w*5B|GRGJ|3Hy?J&RuV^}lBD=m!-dRw3>hd~XmO^`APZqM9Y zs+tbXVVMzOYw{uyZNS`&$4g{w+Hwu(CEf0Z)8zyl(r&p&K3~W^I z*`B5u6{nB*46MKw*?;{eqW>^n8i;L5#v_IDjzN^Fvh_9zT-!19gzZC$w5fJDmMw;6 zAnAa6yi1t@@!4EbQ)vfSR44KdxY;;$uyGt!M&EWX*f|1sq>w;2$vpU_G&b6bPQ}H) zS#9EXgr}|QiceZ4`0K?8zq!ALxpR0}k7oZKv_=8rLjTdy(}m)@7VIcPV)$CF2@NRe z0Q2rCUr6?ZDqDMh?_ihSq9y-4uq9e)fA8Jit~WF$$F5|+m(HGn_G{A=9mAi?fRi|v zff6v=u~59a@x5W9oL^=(D7vzI7eGE^0z$b+d@g6NxW+cz&GqS1#|E$Uj=|(0&#qvV<{70sKxP;{L4isWQxgz&y&Vx z3S+cuK4mM9F)lj93Ba%#c0G8tX!^U4XECNB-@TqDsR~CU@hAU zr`;a1r1M(`HWl(FC`BsXIo}%Y^qqRT`JT?z=@7H9!*!K44(BpMG17GK2->iJd^%BFPXNX9HG`xwvc2*6j z>B@)=jlq^@pN8G+FBx&a|-VfWV&#pWZS4tR@a{O!~gcEq9Ay z0)P#y$p@CV{sG1d?0}x$TUYMm6y7i3z^OtXGHfkB5@SpLAI6Z`c_!l}?bs8aJi61{ zqas3vRLw& zMXeYOg;{Cu%8~)o!U(Q}v#}DbA9oSG?r9cN9diDlRpH5@76r9;2Wfkf)_pr9xlri~1K<3%b{%0{O9b}Ngdu3ep-N?Y1)^qLcM+)MOrLi7 z)|29nrT{x)TmcI#%Yi}R-DtCxpW0)ls+LRlXz-cUpSp=6n3;cE;RfAjt5)rY(xez~ zwg6SQao!C{TVpzurucX=28tbekGeGwY=P@Lb_AR-Z^z{->6#FyZ@$B0|C;~L^<iaIE}G4Y)difh#31Bp`T&C_^WhJ+Wq)NZaw(BPPi;2POEQVaN)a%+KxP# za%kn#KVn0Frt7Mf&^j8}LaJ`YYwP`hOAr?#rPz zl-sKZkH5ycTX$wa(It1}Vi=Q9q|L3PF&IuQE~vA`>v_06|KT{BMf+Y=0% z9G#tF}Ad3igyua?mnkyopMQu&91NI9-U9#E&kUkZElPlfW#z<692pdZUF+m9~bZNad zBW;^d*e!27AhwHBq1_Y(4%mDB9hANSk|)mj8Cy4zrof&CX2M`}2HJubzTBTN9DW+} zPM{ebVGy_Mi!iQU;Us-`>E-m%4M~%Cey!vm#=9+m+<5SS6XXf{8~@;igK7{156N$F zmk@Yku;-Tm82*EN{Ew0f3uxYD*xLJt$~_w10%dim?L^5A*6<@g_Z-zQpFCGYOSOeH zRJjbhbE)~v1>Qd3%!*^s1{oN%jq`}}3}`5s_pCBaLRA*N(`@KPO+H=)3RYCu!(DY1 zuhM4MQ;4q9B1=ariWb&zdI4@oL`}xnC$)csRoTCOxjMwP1AV&~4$I{Y?6=E1zrcRO zcToDw^X2?hFA$!^dy7ZB+2Z+r@kIvv?Zug&Eb)_fSpEe47zYM7c1~*84_SnMEU=Cr zIAa2o+O@U!kMw#UGoqv_k~dO!&sGUuz}Yn`>Ydu!DhfEP=t*IowE2EYKkxcnIacv ze!hx(iUYZn@<}Q|8*WItln4Ex$;7);i-=Ax9U4IBAwFt*1cvK7IRZY1fS4m`ub7#4 z^$2(!G=kvbkUtOJSAir{dN*9FHVV`Uf~YlzHXR_E7XsK!4!quDK}$2jdI8`%1Vo8t zHVD`=QfIA!drWjoRW&fFHV8D5 z+6zT{MgqQn45i^d3JzpbgIjz5ShpG!n?Hb*P3i;N}^E?3{3fDKE0ZVo^b zA2`!w5<5rsa5bp(`otWH;@<2D9WI5VJ<>y^aCaf*?(y=7epz-bzAKKu;MR6U_=2^# zt0}mA(M|eKsWJB!Um4MVQlcUI&(C9RIpI+e&kb2WQ02h-(dvmk^xFb2y3q5n4T^2; z{gZeqXbN8(egSv8h+}!!fqGo_jOYkpp02NN8Q#!Ee)F}a9Wfu`+R*NmT^y~z{)K8? znQxYI2o+bGMdlybcrAvzH$o_NY@j?=KVN-{DOe2xfJ*>T-@c;natj*Cm7Pb%Xxdm- zp{7bZ+2>2vKiTGxDJOpt_{-Fl0DGAT>ISQ?={@V2VuBtX-dtj8V22bP=zs~iw=BbS z45fRk+=^i3_7c}d2LL<5?DYMFx=KIr} zL*o$>Ew=Eff+88S?mC1xZOjc-x_t__L*52HXr5hE$lrYcOj_z!3a#zIrb))S1qL{{ z^Sh~%f_dccu2yc9gWKmm{^{yM<|FqcRpQlf{*M!|a^5ojs1fF7g+K(2Of;jZU)k7x0 zAxA)^OElKe9$%O7s`zi5+Vr~F+CK{d~R(R07gyPz;>&*mzvFvWVhT4$wVDwx! zBmE*%$`0CEiG0FWO>h-*+Q1ok$OGZbq=Oep_Zhb_{k6=4UuT1!$5wS;hJo)mWWo`s zA3S+G%C*T`h4GAcdqehF*{aP)*PQqiiC;v(l;`v_yb(L=vt!FCM1Fp~F^rcR24CUC z^aRn@7VBNPm$=j2Ft_B#kn>mk{fEM|!>2TY2*1@FWDgEMT__jF(H8kvnW ztK#;uV{PK<1xJ}y;P%FKgzWQatTSI&Jy@iv zT&?t^(^Po;Q!}cVZu2ac*W9!Y{6-r``OTv3HTpo_y48 z;>j__JUML2Q(0`U96nqjeexa+vMpmsPcfEjARD@)><|rS)FEZgu2 zLz^?xbq{b0G2+=I#j<0>-EzP4DL`q+1{uOf>|5PADLRz-{2ozNOH#jJiUIq4fhS#G z1Qb0m?R?I4m2(Dd!ufzS6MrKAgkZ-2o$wRbEQ4P132vv)S?mdBH{d5C8?!h;OLWW# zPhw3VKg4LKMFQJte8?t!cV|)}S?4FL_0{nZ@|Jl7+q!JMY38>shfms5YmkjUtmC_g z^y1#ec>PVLu=t5?-}K3B8GK>>2&BE*y}LO2%AM#3-?1|9`Z@?Ns10*?%Obwqvx|_K zpK(l|-cNy9eBsyOr^ZV~t0P!4#*|YcQyG-3b4TEF$WKv^NA-AsKBO2K62-6G)U4sg zx-TD%F{|32OFBd@GYw5=*&cbEq*MRxxY%&CG!uuU7m*VA&gseCw9q?V zC=EqF%&Sj+iMm#;?MEk5B5`$S#g_%@`%@~ZQ&l)e=z{PJ>p|4V-j(B{lL-u3pXL-{ z+i=d_Uwtz{!GH{uFIW31r@F{1)ip^FK1W7t=T)2xolfeAg_Zp}0Yc@IfsLK6=KpAC z+I$tC>rW>>?N9$c)1MAJzdywm`g77M-QF5^wbQ3MiX(ZO1R81%g|K%b4LTK#1Jzms zPDhEQc^M25dS!;=gOMJa28YEVs^=$7v{1xzh6STV(uNdEARI4850^ha-mi_aSjf6- z#TirN2~n#V7z`>&NQ?&o7cFp`;|4wwQH zTej5@@${L&iV|P?$~M@jpGcNr4IAeJ>zUPn90diK>f`s(3?i`^b$PI7I+rC2MxsbQ zZQ^}~y&+s!BhYk|GEQ?cAvp&0aoj81X$isa^I_>!|E9-^HDEaGdgQb$c~|n*m5>mV zbw1Iz$M_SvoNbkEk_kI}ta13Z;rZ%@OaB~Js)o*NZ2?BZAc04H>Jc)wqniwV&J0l& zELF=vE@1k~p)=Bt<|rPmgB(*cnvwDwt3?)?(TV0uR(B-6%;b%+nHnQof$j!8b9HAA zQ82%VCt{ZC@XlAYg@i+%Q^~JgRDj-#ij8ZY7SA&o({#36;OEcp-4UdcdYJ%<3B)}7fs@dtsAR$ z0mnL1C;1!IrW~GS(X|a*6}IF!(vhM*XJxn;G|DPLF|6-A)8)~)bd-Q&g`m6$bF;lt z(fNlaUj44NjHX_kj*MpCTi%kG7^YzJp@VBqu|A%Q64lIfd-*uvY|K0Ng{lTCUDRGQ?-0t^w-*Q zr*clqv!y=Q6z)5(9>Sk@h@%;o2(@l265!0Y)kR{jAm`g|7zur&5@8z}EU5v(gwfe^OGDf7sX`!E zWZ@bQwqiKWb&olsdfBJu_fx`_$s{RGh=lIavM7VLDYfwv?Dy$j*wp+<3BOLt&7+#- z27M#{kFgjlJ|MCClg0Yc>2b3VH>KXHrMS?-`!kRG0dRZCsnKVXK~dzm{MMd8?nW|t z@04A+I+~Q!031{%4rfY?*fYmE8Z}dd*YK0DZXFHPU5j*{L=mIk&4X^{^n?2y6tG1* zhV1pP_8)ETg$DiRa=CjS`sUYA1mSOoJd~d=Vo5Zun#ykK(ocMq>_knZ zu)o|*ZFKv*V#?`tefeO4G_I1Zg3wfJkB=}E{8<@2jxOQK{ z{A9!eE|-wtkaP*W&zx|Y46#dmea6-#OmT-=fqV^=hV+lw#uUSuA-I&B13#+F@Die*>^g zwhn-bgBOtwmpE(>!Bz-fy~h3flgDXDS0IWRa9ZqRe!`%N&6C_9+`e&pgkg0JVOEI} z@ss+fkXK>5OVtjw@x=FAiP@h`QAPXX{PiCo3x;+wO&#tLT>eK3M zT~3&`9`m&X+hg#5R7-{m1} z`zhMe(9<$^d-=`&j)z~oU_6yGeiOG<<^cM3C)o7uqTiNy^6>2F@!k>%y7Y?1ftNBL zor)!57IHTzm{2&CCiVH1?Lk2b%4>WnIQiwJ<5iHIdBj}`TO_T%3)XOMZxJ=MgUgsF zo;-ie_h}9sN*5?%{B}=wEaq8X?TULTl!)Ob^jAl#uW`@yA&fhiAaM6Ak=K$0U$p8j zn*#>E2#?Wov+u#aN4q%6D}kacQjBe_1TMugs?=O}R=D|5!8(u}7RB9wg{OJJH1hV$*A_*E>9o-0{y>xVQwz`~wouR=0WyOeAn+mTIRi;YNx6X-W0(vEMB zsz=_m+0;?;?LbA6hbM(c!u&vclBaCS8kas0S6SK} zPRQC6Wda`HB;D<;j#w|hof7S-q!ePNKs#uI9iJ%`qopuqCX%9g4FR7pqGSaDAJqiY zh9+`q)}}6>AP4EnIxZ%41OsQn9!z4QZjwWT5rk@G+Fyu5z$X=HR~GP*9OxH&Iw5dH zNti*jGR3pH0m6hUo(9vEcCycySu#Zzo4s$L>5~I#PU@XgLH$I`Za_`P7|-h@mH>`w zNN5Dx+b_%Yq$)qRv#LhIOPox_VL9K<8K^uskCLMbdU!7=Q?W%8@j}L_uYx`y&Fxpf zB@({AziB!*;im4JOoxPPp?L{+Qn6hrNC=y&wu@H@J0zl!lPWgrWPq7aY~RohuWobY z?X|$*Zlp}w@qL;c9n$8uSdVli5_h@QP~#hG4W!MrdhWg9U`v%}-a^I+{E5z4FnUI6qN>I0o1~?Oa6B$D0mZcUR z0{?4J?48L1%nXhbdi9Cx|Om4UBY2N%(!2S3Ii25OpZdJ7X3 zJ_O%AGOU8n=$fe)Q}h(q)F0KfsCLz(UcvM0qS&p|!4^6Hg`-ISh{`2jUW10z&DEh_ zn%wgHBm2gfT;&c_j!vYeuBGLUzIEj@zi|vNPJO0MH7E>~7iUh67yjI-SMsJ+BI^;! zyVlE-z4ZRP%11IqyhSu(L8rzsx2_!SFRW9&dGh7oLlFG311U|*z18vlj`avj9DHg# zN$v)lWh~-Q?_6s)9O^osl;?C^gEZ51!odu~9n91=Ww&RrJlr{A6D!Vfxu7WtD&fLR zA3OOCee4Ju`&g$0v!cQdnYJ_Elk%+Vb)MA0B)312h8^uR<~mx?QAZ0j?C1oW~ycs-Qii-?q6y1Aq5BLV+KzF}bAHw*$a$a{Y!3Bed69(dJDOg~7-vRxH}O(so{_d$lY3}P z2Afe?%H}MtgFS;xFb0|m%>+LhiK${sh+#OXRc^dlqbUcw@0-e43fyMsCLjZx&R5RQ z#~5wpjI%+Q=Ie6nt#&fvl^5%sz3B)JTqjmkM%*L-Vw}AUEIwNp5)4_$2%C&2 z#8LBmFAGn`3wwRT+C9N3GoZH5aY`$O3$0$b-E95nFfa_0RD%Fg0e;2S%f&0i=u{F5$cof z4XrAwimEf23Q9xRYt!bmp_Iz|wr5j$$CxSqMvfYp!D(J&Z*Xe0m817OahZlFUje`J z^-0c9RZ)3SW<yCA8XErcNEp)9ELy1k){Di-N6%qlpR8{Kl2l zF+ZLZtN4xba_FqYskkQ~N#rfL1)SyxB43Vc;Zx~VaCQkf*tEe{OC_?lGzVIwtkNL< z0RDwXcyqEAbPv@oqeR^YRO|a#$U)1h+<=edWz0t1pjY`;y1?7e=8E?gG##vX#x_=d zr!&Qug{Ia@gBL3KZY92K9lT1bX@`Hx%d5+8zk7SN^OaBx137`eI69nsd?mfF9*114 zhp($IzI~VZZjjdEmzUSCMxtX|v$368djfP}A`$k^R|qBD`6@rlE#L)zq&=45O8-Ry z5H*FlU}P&qK0Kyl!z;qeqxO8-xzhuX?z_2u)stH$Nj6yZ)pMq_XI~)-s@A8A<9IiG zz52#3j(h32Q{vxm9PJ)Q1V#sM#8c_Y)d%ruvtL09-WWDt?!|jcB>6N0@IFGrYEf*a z>ABi09mhFGI^nL1SKOJ67#Ts9NGPp0r(!5Lxhlq4OvRK;MHv)K!~;m*@=j>Qdr@XUC!&N~w(JGB%%6l+eL+`aZqAb| z`}pfuZ?7IAd5dpsya~k*;=Q7%M~9V-x_T^nCNYxOwa#-9RqNdel`PUCG!bN~sp;cX zQ;~I@F-@4iMq`q7Osuwp6Uh>nT1h5o@j=`|N?j!Qr!Gq1;($qG%m0~>3XO!6z(sn{ z<~TS+@O$abgq0$TCs_G~2T7oKJ+{rj;|{Q4ym+r><#PG@>T9eB3$UXBa|bDjL8a=M zOE@lK)-%SD?LR)NCx71I7ag3^#HIGUBjD+p*;dOqzqY_}3ux6!-U>vXBh9Mu7aVJ< zRhsWHb}RME4Ll9pit~52Nis=*dl`^>BIiHj5KUw zKvYuL?B7SO)*|N$Dai?Er==$+~_O&zO@T`TM)KsK+-9w~8 zr}eauRJOyox3a*;TSrV@Ub*_--Q|u1Y z<;W6-F{IQr#Or1uKC8!>w|{DJwEpoG45dR}>KYb#vusUG88W%$jc;~JM95{Q3%it$ z4#6GEmiWgvW3RF_4+r8zI4w3>edv&W2;TCYi^2-p}MQKVXtqHeaC`-Ic0PnaOMl6tQCe zp?LJPtQr!=^dXM(@#aLl-B8SO^?+}bqAtCg(jh5iGLTO1A0ctcdSx$|sy1CflW}VA zEk)n@@Y*uO13!$HH9YBq21%#mpPoFrcDRp*rd6rRLa_rx%2zroLb>sVO!)f`9^cyC zNm&mnS_GF)UJ8m~;c|*G!TzyVBq{}Q5*Ybd!$qx~gC$S3TU;pHG#FOLB8K{4?855c z9^t%hZwBUUw>MbLgsLrqb;k-fcDqn4WW?_fZ|Zi(KBwCq>6~t_NaJqTo@JtOV2)ad zz;g3&&{=$R=BT@!P++9)R-bM|?JfBd4(prmbnMssv~Jk1Nud zYC>xJKOvUW+a59Dlq2F80a-gFys`@jyn!~1Rt8GdA&F2ifrW+DX2)KOjY-&1$xbYv zW90yRMiHgT>h_9}EnIpMur$5QLk5aX*QPNZbTO`+RwKWl?w=O{G*}84A4;O*m!8qc`08y_MHk`VZR=*cT6LL~_?VG!YtoopxZ3 zTJBleJsiGWA(2fm%VE6cdg8hexjUTh3A1d>u@X;=n7$cBuo*cF_(ZgXPV~!rnaZI( zihfC@OSc44sF;LP!bMh4m-J<1LY@Z7L(NZCkN^^}NT(4!&h%u4$e0fI4d zU!iYjr+t||)2Z`|iKt9<&Hd7?v80jn~~WyzYC<;_k>dJ$%8oH3x-Vn^c9 zCHRz{IP%!$;rr_!{Pg_E|~MW^91=C$#pww*7Pi$SyPd~&9FrWd`m zh4IWa(11-NQb|wGosD3pXh*Q)_1F>Yv6I@8MA8mtOIs4)a++ohKUJuKQYP7S^t|nd zlQTl8q`G{4b&808CzE?#gGDhHwQZHAo)j#Ns}Me{y4u;tjJb)UXKVCZHrSu%vJZp3 z`+Sj_7q&OmnYIQb=4EvL$Rf9qCk_{1PPXxX`Mw-SZizV(;UlmM96+MuXl0HnFRtfT zJFXP8Eu!`CT2=b&oUKy3%(*JdCZ>7KR!uG^1}*g@$Z9*g)Dox^_A`P(b5ZwWNZJR@ z?Zy42+gU{x1a`8(6#;(jk+J3BXDp5O0_y6hM}RF%1Tew>p!;t8^mP9?^r+W}v`r?rKh>DMR9(z|wQ#G3i2ef&8_A?|@TtuXs zg4MmjED4hZDfn&gjXhkY%92WJIiSntQ1%1Rv$v4W>6>mSSonwJ-gmcU&FJtg1h!{9 z$-)9iHPGV$yvn=ZZfs{!D*O_nGILp5*j*y93aoEo;;6Tq5rPX>77y7fC?rrRU$36s zdZewHQxuS)ohK8Z2RcSoup{{Uwi*Vl^& z%!RHtVUF7I?PrVQW6T~KW8bqy>s>oGh$x^Pyl1^U+BKIAxYrGL$CS&u62-r`;vx01 z8;*`9uY5&|y4fcUC61z6T?9u~G`X%(exIK99hjMVlTmcEhM_7f$yoJ5^Lj1tTbpD0 z`1sZlcH@42U8&3ETKSx5PNC9?azg3c<~XJK=3t?g&-IwM47aS6_PWo(HT2c8KG;3e z;b|jNuax#O`Sq zckjG_-}92unv;90u8JxxyNGb*5P3n{ZcQ`CG8I5Zb?k9A;07ihfVqzBSDw|t$D$eL z4Q?W2H{o+%R5}UE?mc9zS;lP50cINZiB8m}Udt2{mPL62*7faFf7lzgQ^Z8dwht8} zL5!8Q88I9ZmhDfvPSs-P!Zn2L^o~#su5knto!(owL=st_G^DIGo|HE0ro@e1+5Q5D z!N+`98xJ{8WR#GRtj(hAD^eX{Z}Q4TtEHpy73pISndtCh08e{^?hW2$s}%-r;>y=y zpwy9DYt)vg5~v{E_pc!Qi$k?v0DLj2Xu(3Iq=0q+a!;6fBi&v0SUQ>ba)0?X%fIbA zEnBo;+O?nUx#=*ghXp@G8Eg;vqWJCQljY&ICs>&HI=vdt4s9W{ZAHA^Z`NaFiJ`JB zlHG7JEZ-zLO*0tv6=yfP>s#q~wv8BFA-WQX>_oIVH8PR0)FDdG)^b8mh55%O?R>|? zNrTIfm5$)<>i){M$xb#5 zKz@ZfVI*}#1vx_G7w!yBg5d)voDk9}%XK z8^I?PVvCMRH+6V|+kH}lr;ol86?HQ%>A5!x5`=0(^A#^~*2pzgVzz24w*)nFY$~*b zVa;yDl7QAM1E!BSvSBuIWYOfPs=Wx0$_f1w4W||SI`$hKup1sPGqX|C1GRJ*JhKB? zR~2jJN!*o;j&qv!R;Vs|+*{-P@yZb*Hq8nAzAYlp_{_iNX-NGWj(@m89^yZ%!}MI> zbnDwVe1}&e!up)nMd1&LJ>zHRnbx;DXP*#y*>Q(-zJn>y5aEK2lURDzDF$bSR@<<+ zUKDRAe3u!R@Wlp*m$ysv;)|cRjPAkjfE*7V;?MG1!%)4cpkMf|(odk*VGUWTGA&{G z7OL0!28JI_r&fkAMah;TkhDUJ}0f<#S!0Hpl6ycFO?aPiuG{gxUwaq;qLPEgr|I* zEDzl==8KneplaZket>+})kEb_(P*F%j$UhugiD!5GB}*n`+k&)o{C;WKQIh~_vVUS zVQ=$zB>}E+>s%RND%J$Oy+F2WghHLJ z5!sq~c~=9+T&Z9)_ojW8DhOYo?xIcC8Z%mleU_*g8{Kk5@RkjogO6>I zH>u`+k)zPZtJRaCIERJ#2-k0_=Mx$iW2CERRSZ=C=3JaB(623?C?*d(tr>}f_sGEp z9hXpFpxYDb=*rQ_*Gsb;y`@T0o`yo@S4li-Q{WDaLm0^^%#*Y{PLO2$4jW!8V>0Kv zE1WAFJ>((ddUZ%8Vx#LrGiR*FS`6=1f)75jUR5TJ7OSIE5`IkTGI4oj7kxPvCwCTl zYn!z!zSZ`>t%WUdu&kEt#e?PJv$#C(AROUvS(+iM)v*ymBJ1E0SuFSNJ{l7)JJ>mn z%gNG+xF3Xs-*uNXmcQ`xX~3A+ynU{Xy!%XO31)hwR*)ciNOH`)qJQRCj~6Zn!qz() zIM%jHWt{iOMWBvduTD<15>Kow$BbUaJ%47bJt?-SgG&+;kC8KnB|FQZvTDN`hQ(ZA zddj2YOC#ec_|h<$<14^JzTUwsyMmNScphTsv905igAi{39o{X6iaj~R((eLE4pudq zQ#hcVxM)hWup*ms5babv8G9CbwI&>c3o>^iPvFk(6@n;l?O$DApk(&p<=6LZ!otK=WYx0mJ2v_0l3#@X^VG z<(l>@a@XM|-x`@{G!01a6PqLN#}*{-im<_4u5qMlx9lqJ_vM+k&q4p*Y6JDxZDi=$ z))SbMdOWq#d^2GL$qAA+BU#b zAE%Wzh$afku&?!1xBq7=y`16EvbIjUDgXtF4IYN>&Ys#`r+~B1jf7W&U>nG=GEGa| zAvzMpKGH^?7o<`B`LQD2`m*Lxvo~r|3DfB_V#dQeCwsjVE`$rN0Jdyk9sI=B=pQKb zyAk|3Bl0=xy+TjplsCK)&cb!06IVRiC`8=wCSqy#MB}?`aK)XWcuzDah!u}pIl_hL zv!0XpTfoNguet0b#Cz?&$o6K^5fnZ0WU*u3VCO@InUk=saOVf4O5)$=XkLKu8(M3B_F3% zU8^fXx%2B{nQN)oj0##db@?^e95&O}_dsdO!!tztG6VZ&I>vl69UkmO=cZ=12(!&> z(ONbef64}CKh6rcXK66rJ{aN8amYyAqTPdd%O?XLJ ztIx|p@DHrFWUzgPtBd=%m-YAyJbJjWORo;sdwN$-cfNu|_}l}s)|~iEIrR)}tih4h z9gci$<)*ZQ;60;F<)C^IvzA4$bVXo}0@&3L5j1}fFLb&$6Q=H@#)ds)0!0D5JvYN1 zqDN{KxAz|`cg}Wv$~upF>d$#pN6e5yOid;A`PbOgBSj4YJCHUktxlIjN;2bf`0WB3b#1MZ z#=n!8QF23g&s8Y7g1kw|6{N9}yHwztlvqNVQDOySPKgzS4N9!wOqCcwKD=8cRz8oE zSOsoSVg+fW#0s#sO2Vhy&ec@RGQy-Ky`yRm!|esAce~wolyFonXw8Y>e{R z`7Y|(Gax8B^}D3u6`v;!rA^0m;E={-5<9(*o!%Vcq<-yL5`HJ zUByB}e>61cFdYlMmZi}>#_0v{@i~}%>*gt2T!+~TE(bm(lEzQdt(8;S+jCfxQArau zA$LR4qSaFOBwqY-tZm?|pBZR8Rzv3R8;dT{lS`Ai&KHN?aS3Wq?Iu2(rYAgeRwg`a zPlEpt%0IQIAv4k;}ouD>6J3T;3ma0rS}XwUfWBUINU0qaM(9EOSUZmhYL?B^vX42}0Blkmyzv!`AOwV$72f0R-r^9jdX7QC0 zhwq=2Y3s`2LkeN<5oPZXg(<=1XBj`dhblN8M@CBi2RJ0JfS`!bh|g|Ah83dNB^-Y{ z#CHl!Z9Ep|T7R!_skNp%BMA2m9zoJZfVM zjb7k!4825pjdeZsbK)v{^KkX`sCm!096mjr_Qt2Dj}}Mw7AIeQv0ufl3zDCnA)o_> zAcApm@#)?vxBd;w;>iYx4C_iH-nl+PU=Y%9Ad5PvAwj+yo6fgxCmMwgzEuo5}+ui`Q5nQqqDv>9@3u{M{3Gonr|kmk0kqkQ5*G!%djky}zhG&8kH zI^+4Mz<~@by2R^KM4@499=(NmI}3npaw0}2rqPFeAM+-D6;a2vw?6jP^$4A ze{KMKl+9|5hwRe~iO0^Vb!)3M)#h|@N?rJ1g{SRmL1|3f!u#qmGW1k{o*JL1X1C2p zs#%aZ)hzHtHS6YHtS24~u;r;@er%rixZg9QhUE~S>RGSxDfFxmhkDjwtrG3@>G%3J}5~8o%7Q4vHnZ>`8U{(A4cnnp4?6r_#%X_pDm$d@Y&xGq`JCd9TiJHf!C~jCs9VCQq+e zD__M^*rUwqUaVLy+&lZnON1C>I~Kt<@KpFqPl|B#VOE+R1qL`Jf5wdES%z?Dd)5>p zo0ozjE_f%L``xJpSO(|NNG%;aHd70S-Evd3)7*kn2J2wSDT~9D+3z#H6*nBVF;5;X zzFMx84GVXJ7l*5de5LOJGA>$nS?`B8b42VMH=p<&hNq`W7j9DTbQ}1Qg;&b+^E{h- zJA+Q!$&~1k=(IhLqv|B`is?Gt-hsElE*#bnomM;5iNJPvhSlz3g_C>9gGEPb+OGDN z{Xts$&C}Gb`w8j}QQbemgdwQe1vuSU`cp}Z=EB9C-F>V?OL|L-Gbgo&N7>EtuPd9WH}MJ*2ril$E{g0yZYkcFepEZPapT9Q}h1hd3FWx=gx zO+xvI{a;YpQBTLr_T%MoLbtod8_*M~H7%{*31t5H48qu)sxE6;Rth}@QwWpwJz?1> zGAu6cWdTnZHi`mT6?iIWFOwT!!?K_7tucl_Fb&xU2FshVVPPR8m|a%1!Xrx{ zA(}c+;3c%(6-2l_{uC9ru3Kj%Yz0F~G;Bas8fAq}D3W0$E&A2BCd38l<+?MrJlv57&h$%DcT^dB+1Xp66>K?3Zv?5Gnn?*w1(D{q(jS_svyjyLjtDKK0`^*-UZ2tIc#S~VNn|1RkijOlt+S$>h2X_2WAB(Yyb zEI#<0iqP6JFTs~tzR?erw$+-ZV1>NIQhA)=~)bpCRp2pY{X9VweqYP|v?oz+z(trpa|X{%?2Uv_RQ zd^+%SWIaFhK6V;C!t5?wcZ4U(ta7DZ9}Zc`*HnBhq2bjo3l*Fm)p^jJsW|ho2BaeH zGBrE+_G-n%_y<30$LVF)JAm0rQ@-1Z;)O1lrY(?4%~apuJ9nQxw0%9P_d8T=dDD0ABSP#yuS;w7rap0$L0y%KFPfW( z7{*2#FWL~JiDWm{tRerr4T=j0XvTx}p?X>E&l%vA7I5VRDN8H#y%x%_mxu%P$4Dxw z&SJM0Pq0d!#Npo0TO~R|f?0OD+#O;RuVRAUr6YnBIFaHjODG9k9Gw{)uM2jhs)w&~ zdlI;brcSOy^%mFazu=1B9DVWxm>BpR4;qH+p%**~#FHJ*;^ z7mN)ZQ^FB90m1o5bwQ$!7AcCu3l`TT*Z!;faQ%2{2ZxqZgc0HAT{k#kc9EB%zbg@| z53Hy{fD5(VzOcDM3fQmHdASQ1(TQxW52}{W7da)9mKT6sg^5&Y)e_M5tK$(s*9}LY zR~3UrQC@lcc)fog>8z}_f6+SNV$8Y`@PbEAWD~_p*=5WDweNTcH(3^WPnYAbI^qTN z_0krVf63}r?APS8I=;ic5N`G!->&<^`L}v>XK`}!wbmi8f>FGVZyE2&m;-EcD~R78 zy5(8w9c-6P9Bjf8HOBoJTOBndTzQ1_Odbe+!sIUPy#ZBV5qbTknOAmuG zQxy>$?+BIO=f@(1ZstoNP8F0$(SD?oZj1B;WuvJ%E`qX2^X9&WR+>jOoB(yN>Ijj` z-v$@_vX5**FE_<`qPO@~BT&wHBo*9+hss*)@JluVGg zB<+3V(@S-HR8XP<;iQ<8g#L=5M>Yi0EeYzacB#%X&CI_9ZZy68I8 zgK_RH)(?FmNrVD665m-*=V$Sp&oxGM02N?)^D7B+Ir?OQ#sN$Z-cDM{4}e&_`Q zaN`^1v4cvNi`4#IvA^G9f4+XWI8x&5Nwb{3Vo{67b&aic$J(q?3oDq_q9xp@qP^xb?2WxOVUnXa{}1o?#4 z$*)CL^3z4_mFo|E?ggOmt!lfmt(UnfPveoQXz*)?tJ7WRF1HOlr?~Qu{x+MD8u%?< zc9uID^)MWe@hnfZbsWrlOy`lX)4oIlartnkAjn+KK~)4RG9mR9UBq*2dw6#_p-_-s z_U$lOU_q{VDd3k*@nCvx%)e@F{#nh3gmmj@XN@f8FjDQZDvi`>x%aqiMheKyRZt*T zezFa1zrf0qamlW;!I*>K7^)1tl<}t3GhM6r!(KZvUsJ_9VP+}F@LDCW=Vi!KHQPIG z*ch7+Ua7J%nfONRrS)08V2&J@_l5#j&#V_y8(3~bBTjA|O=b6TUnp_Tt63Z9;g0!g zO7Jc9#He89^%8Gy9X~GNHFlAR;D5~q;#<-ENGO9VCXeNXu`|VrRTC%T+7qVB@#2t( zg=odB6F_Fm4Bl@o^@@ErCk%VNda|#K5m!=-sWbe}|KHh{z+0MJb;WEm)7$hqGd=s7 zbe7j-W=IHuEWOUWq&w5;*E16WB>CRE-|Kt7zVF_fd*AJz7XvCFM!aqq5D~=%6)_?r zDk4TiR76BXj2bZ_ZipKq?uh=+`Jbvf^)2_kA-`XG-u=$0Q>RW1+q87cY$KmCJJG-;eD1e**u`#6;;{@&FacyC8;l&tZUD5%)UFOh zNUaNPbKneTO3L(VWV7rUO7Nc%&7K2^XmHdtr5>DBobr@GYL&4bJ0wBOf7IGus=(N) zR0z&EF-9V!-d+Q9Pm+pRXnSl(S9@deCA}A%TOI8siI(<8$5va5@j;I z?yF+!vj$oqV~CYg$<#^22;fLU(Nx{Ak{By(10q!sgZ~V2W~OFWLWq7nLkLel+E@xc zpk^l|5-}>aiIk5_bf~p==}c?V!w^o96{+Irp-LwoWIOJIGbND<#^~A%9?$FB>Wcl? zGDtMtDE7WsoxK?@Vk@(B%sWE-4wb8qv2 z8}&1@CT^;gMvbn{P*tI$>T^{$6zu%^dseJV$s~0nNRe2oOm`8Nia8!?yHafToifnN z?0y`^()IDEE{jg6ZeSwRRiH;<2_XE{RW~E2f@#sw1Z`+jprSKeZJGcyV!6f4;k-di zu~wX90oT_!HQ%T>oE^z7h)G8!5=*#`<2`i%Phk9dQfDX|oGOE*YVY-GPa@NJyp@@i ziK|~?L3=2&=Bj_AZs2yJMDT~0Ef+?}j8|#|6>hfCgO#Ygm4&XAQ|!yJL64M_!#Y4)Nf}2s^-u9MD)BPewQ`i#Fo- zEso4pJ7{Q%BvH25nkEXq;Bxl1ZJ$l|)q2!T z!9>yW!DmB0L9LB(s3u5CY7o!E;=$=VbwhI`TKwTu1f@?^0<^cH&7AHcVAf|BIJ=b4 zg>>96eqDS>tVd+F=dhI7VxgH+!y#U+l^WQd3g>+2kfk&pR20z&dex{9bFhK%cT*={K)w@-$cB4P*NgyCB zYvTsyGPm3+q#S=f!}%ZL0HV)YAH8sHi&K>psNREr%7yi!G)gv(ciN}3k$;aE&C zo4yW~v(LTR-q|<&m&ZP~60${Ih4XORlE9F2(;fkkoQDM4zOt*?r0SaHn%#h9&BlE( zVTkfCdn$YP{sn7~8!9nwES{YDG6%B|}%hxr~QuWJAIziZ<*=9JY6Ix8ceuVxX+u zZmS|i? z4yQqq(tU!^A*H%-4hZhm;+D>&MB=D??xKG;2Kn--1r}qQWr#M0{o@YdVp;aqp>?s~ z-a<@9+blWd&?Uhv;zU+Qex%MCHNZ-ZEaWpFweo(4a+q+uCB%Em!> zu9*l&<&{U?e+V*5mDoFsyXb+_T+iyN2w^mHnFr&Mg(EiF`FMLl>AyBfT0C>Tp6+GO z$iKXG!(yDB(2_h3>x9{%Hj=@SK*v2O%$Wo}N^rZqr z$>=b~<5`R^A+|t6TJqGD>_k(kkkx7n>NQlD)Z`TI3tw$KIT}Zxk8LvYAvOn- z41Hmu8W~7BU%c3Qd3)Y4U+C4AU}8K0475G%6QFE@yg<|$n8cSf#dUm;Zs18S!t;5j z+I{LaKIO*abCZH0vOtdLAod+WXpU!I}}P3st=8qt3iim zUP3N>p?%aH^RAP|z`NT+TgTq(X$ZUw&QG$$QpPpe0yA+i=nJ-o#)h%+8jj3fPrbBI z`#SZHjxh&TmwW;{h(_%NcL@x-gj5@+ucs06G8$`9cDoL-h20_RtokUcZXZ9#vGqjB zO?KjXL$1rNOfH2`MuSi=}OeHFg=QZgj0uS5S9KfhWquL1od+fr;O{8MWTv zDq-N(vD~~70-D}4LEr@skhbRTmm*h+o$y4FwGrZ+26i&3+d2N)U~7&RnvOoFo#}e3 z2{fq%fHs`PZr8dna)oDp+NYo3oT5_YM_#vRtN1pFtBypdYQ@i?~ zcsk*gBq|u`ZM_7?Jis$cP+(aw9@~REM1%$FGZoW-vR%ZX?|JV<7MgH<4}y^UdJt|B z7|&W0R}zRB+oYOKtEV)l~h)UL#uyi_Lr6KNPw7WYx;|>lV6ihsy zSYo>vO6N7yk)MLK9rR8N44LM&%{Q73e zeLgFf>xKY4KN5v4SLjlmdJ}OpzO{}=o1d3mastV`TpMq0!=qKwgislhq%IdG9gubq zU1TLE1XdrtHUgp!tXIM~|;jqih3rvd; z2c0Nbu4cqTsNHj6)SHYg!jMEl-s8(_YnZ?5o}*Bv_yiAe*ZWjqk2+24)|y*jb!t~VW$((z3P^U;k<;T*#LVAeMTh2@}32}MM7(P+g zQ7|g?ZhO}HjEdX_R}^MO&tN)6&f{d@5}XL-l=oN^S;k0)sw%c7g$9!5PSWy-&S*gQ zU75pkq2N08L+bOs8QNM0V;GEjOXYx$R>IwKIIi|dtp)XpZU^734DNd#zU+2T3X*?r zGF#m)aeEjO6P{!I3Hp^JK`$0zamPypP_OCx!#2Jo+`AkVII?;X7f#2wys=>*u6u zhx-UL+<@koY0}kH(zp%&4LNd<@Q{RHo6R#VQm}LP^Qj@Hw29R~Cn;6QF=!z5Y%UhM zB;7DhEs9y29W+iLGVN%^92{-f4le~n#H-nns6&gM+2H@gtxx1&YeP*w;F~!95+AAx zoVF^ZjiJGYx>0QNH0@Swfal(`*jp@rVG|E8i*r2;0M}Z_{i#r2#5b10XlPDRygSD# z+9-?tOWTV4#BD@CMoO!2-7j@u1524uTe^+cK+9nTc58z-I=izXUf@xxQ7`Bm3wAzR z@nmRnW8BAX7PCNd*0>!6%f_74%gefU#^Kyu!ePhsGYxFXP7;#9ke4`C8@P>G5-(1) zpw4c%`lA3Fhz_Z{NsNewVW8U`vKc3V>03uAMh|JE7EDCY+aRzq&Rs}5!o@t&ne{&Whl*S zjF(ha9DogQoN5VA0;jt1g0qKJzG+w7HbKjIf1`$+u($*phJiRn@UdwXh)WWHwK@8h zuaS{GkzzCmQVXS{<7aobfQ5uugt|eTm68o9ZgnJ@GVD6Wg$OTqxxsq%5=j{5q3aq#*R4>%YBH~zpa6E&Yq2;XE+ETIR<~Xuv0-%KCOk>5sB&&F zr)eC9`o>zvo8I6F2IJD!D}w>EX?Wj*bdrNjL?CgS&}Mwd+tjIwn)u-@Nctd+2KgMv zO8ShXOd(~iUQy2mWkP#2pk?rmLHk%h=3*x|gBw#jk$xm$&u;93dkkWOJAxN@8WTd& zLSbvQh6DX9w^)}KAno10#-z4*6US|mq@{gvu=;`(a!+*Z+$^U=7<#s}HFz*@Y(NVWxWUMh zPJe*@+6D$kOrm7ri7j|MUtkYepiONj7NTW{V>fSXcBdLlpsjP-?hIsOK9w{vbkAfv zD(M=o`y}>cf=Nlw{3Z2Y+-2Lc5>|&q^~snTl{#99U?-+sU~@8PA~c%>MwkIU0r1?- zaylLGxPS=QG@(9md34v!ZExev-EB}-!$ zCu;CffGOaL)WpIHLP&MULLR<0*|YV|cZjYDq^N5`V%$MA!ce%jP*VruX^4Vm<6%6l zvL~f( zg`Qd2Z;pbcPCtE>M_&jlV6!I%aQ8BZ|! zMI@KKvb7JCH;yB??#Xg;@VcqvuhI8yr}6}5PRP&EdHrD3#+ zZI+}&g?YsR%%HDY#RPU#EK{YcR)M+0+^kATAOrQLL1uYH;IJ!?=irvi1J7 z;H>u6G>_3U$;Yy7!nb89Yms9-juXuvliQE)*CCF`%c+@twUb4Iv){YR!f!P9IkD^fs;6~v*}&hY7cmNtoe2yT3PM{VA8>|?2q*jhwQ;A zC8q-p|CwpQ^gTp?`-?{pqJ7!T;ur7eUw9jdJwy7;jq>G*nq@mEzp)OT$u%i>pLUk8 z0|QLhS=K+%$Jyv19W@Xc=9c+|DUt3HT3btr6UC=$I3xL(Z{v8CM}9ERl?(UQyWWq5+^@WK2sb^&@HBK>4efG zacv#ap$g>Yrt28&I+x5Vv3?zLZBj{MmerA)Q8>S9*D$XGW&))#-&x=>S=0ACmfNwr z#<4oL8nkt_;Ly})k|u&UH9``Uq|h|chauNfe6$OLnPps;sU}xF>6p;a04Mu2(;SlK z)N4m-=T>i``T{N8@967pz@h5^aBvM@aquwB9m-SElgrmxiJ@;7mG*?6E%4ZNBI_u~ z2rZlM+)4Rr9n&h;jFit6bZu1ao9q(J>L+`ry(71xz>ByJOfv{4kKb%h(!xs8VSCrquT`5=vrK%FYerXtUI0xHfsl4bj4gQCKgG| zGT7P@;3+4@V$wYiuCW%+Og#?NTjoe*ZL%*7%!M-|LS!Y21>A`Op&A`*1?^CP0KGcI zHn~pF+3vYfj=AArImY$5J~m-GBDyj4L>vrn-DzN-2RFOpYT290<-M0IsyT`EPQ3?@ z19A5d9T__kAh@2Do+%5dwFMIAWR=Ay6Cu2@q-l>N83$-|ZQ*`cMgXmYmd5 zi_C@X1yUO(cWVD(Ry~9N-zqd+!J1CF+YwuR4pU7h8b95MPtQ-}e$ClA;xyDQCFBSo zl2l7g#PQU8u!J3=!o5~Zu!rEKWCD%>Fy0uTVx(dy*LJXv($F(2#t^eJc&`LrRCU=B zU^loC;EkiG3}T8vx$X_t&aJJ!0B7KqYk}#J_g`GoDkbN!NQ;DnlDT}g1!yT`;&C(f zK_o7I3V45au7tp35{pV{j9qstFQ)98avHBsz3DIDe#Q1N~P!Yxd!MN<2yHl_X~ zTU zAlB3vWv(w`G)JfSVw_4E`e8O;r{ze+`fP&M0+GmUjQMgWJE~*EsgsDb&~)Tx!dwg{vhlelj3zusCp}A>eHCIi%Qog5z?Ggrq}Tdl4IMc3P<}EK)sS&d%B--3NE7#3*H}7u=}2VjvVgj;kc?lOCE4 ztAr!Da8yj#IN+EGVUX$VC-QR)7?>Q-%%Po{&^y=q^KC>)j~XN7ex0qms<{J-)+qf5 zP4;jWzFhSax2XbCGc9{t6Qwz!?M8K{nzIAv)&ZC*yq7#JS6*i5c-56C1S`nttpp5j zJ2+r=*TI(maK3!`toE_S;JI;Vr{b#m_~sK{^uxM&-Pugx85fI5Ys$;c8lrl+w&NGc zeVCpwSHemAHEw;cA=N>U!Ir{ zAud2`$Qpwb$7SylZpX~!csa2Mmo;~AwvRs3Lz2buRPW81&JwG9p79@JVp|KzV@s(5 zI7K@v$YR9EbhHp!NISOgHQrjVQq}wAuxfY{@3Z?Jdx$b!8zO&*g;_NGD=%p0!>kiq za1WSf(<-K{x-&_a*+G@NSk1o|_c*MN4@PzIrL8C8!?H##sm!6?DQ+KT`>WOVMDTy) zgs}DY38_VzCJidTJxJq$bCO&Txd4zGDr7K@8%5>qMV0S;iuWAefmw!iQn9WemJ6FU zzx{WVG90K8%@Zmv0*3>m5&5cc!h{na#Jga^1f@o9uu(90GH?hm0*lswkp21YdgBGX9O?$wJGEInJMh@XK zZdizR9cx1zWfMyxWT7|I{39BSwg#FwZ#+&QWeo#gx3SUm-a2B)lic+xHMxayhhjRyiL3hum^1VU^^*BT@P3tkofy)qAUjIE zt<!4eCBK-Z=2x zI04?#E?%?kY#G5d_LEdB7`D+BHYCC}0LgFRCzN6z(qU&^-vy5ThAxB?RImD6 zwOp8L&{uQDZc{1HCOE4p37+6^VDRPIr07BFfJc2J zf%@xaKeDJEEoQ~ElL?eab?l5Xun3aS124i(S6`65^2^UBp#e6^;o5lk{&M>k%ttK1 z*s9HW!wA*X#p6&k zG9$6ttmS^}RRFII@P>%)Bib&4Opkq}Dnr}Tga|KvH)?G|skJ_#gyXAv?+l75SJ#ne z&X>2O0SN>*nVA$MVPSu`Yq^XK3**bMklIItWPDO5Q6^h@3D9VJaDI$glxUpo2_X z*kI$Rr88`8GWQkg`=-am>X#`Q8>@qq0L8Z|+-KyE8b!C9q|y-ou50iS-G^WpAS4+& z*1{)9lAGIlLv?do|9D&uzJnt^L=GkiSd>V;_w4nl*ql_r_AX74aUjaoNx1%pA&LG+ zbd=f{gM7OA`vvAr* zPh_F8HFrRmyv$oB{YS86pQ0Yr0Eq;%qJ&*5;RrR|Vw9=UJ1G;~PT9knlw~}0k(Jrl zN>d7Tv3j6gHYfaNIp>VWiEJV7x!L(6C8zyPD5vrmQNTMYI0xd*Pz8n7Ip`g-=YgkV zOJ4{vVRCqMwc2htw>I34kh|J`G`cr0PK$XD@owrrT=y&gi;`e$h^0q5-yrOwmNK@) zuT9G0Mn;PzT4=>(yoFi}8I3R=3D9R^Dmt>n6~9q+JZLn?g%NIA4do0tBM|v$;W5kg z9C>l_xPYj?IVONhO+dEv3Bg#R#=Uks@fa=>`oID7vTqyb4oBC2!*QRLW^9cE9K;bb z(xNsb^#Bcmz(tMQ)ZCMb*Tz)BvGqMx?;xs>IHcuWJb`TJfD0Gs)bhbqKcAK|VFe#1 zlSJ6QIe}kir@k53uIPu+ZVorr`e<8$7bY96$l>1Gau#6_stX-4<(zqmz2IWa*h}Eo zv83^9ja$lnTY)a_Ww%O0tW&zOTa=}u&bM5vm(^AhmnU{bujafam^=cP!_}dG>dn9eQ>VM3YoQa{+cvN>OQ8xpduC63JmJIaZ2c1LbJU`=5B%&Dq}$y=59 zr(BrD@Ju=G!Y~(=#P>?lv7Tvwj7q>Mua_@%(Xo(Z=&14~TGwjRPxjVOC)c;u5`&JPI1SLagVrKQDDn^$#9nTlEc}pmx#KyYcCnz zUV4eBOM1z6hD$^*Tfb#;7i}cLMb~l792c(hu~05F{aga0|9N}YiM(70jU^o??!7(r znuN?P?J_x;$PnyK9vm*BjWVW`*s{LWOZqtddOt=~xFJz4H0YW= zQzK%msjOVz)Ue8hypD&}5{cojL*ZwM6kJV4O|DDsX?B@6!*^qS&e-bd`mv5-;kH>v zcH#J*tm9aibFC|LENfsmv#R%Hj*R8cj@er}vyN&$y(QDfB;k6gPUFsCUzd)ISP{nd zQGZ3D9Yyp3A&5f@ZWXP^(b0h%fO50Doz_7OggsYGiVeHxDaJ#w2ww3ktLByFXNwrU zIGEy&+HgocI*kfIhNQNmSVRZonSdsbcJ<~PbU{UO+`XDY4j5;5UVukztQI#h9y(B(0*=a*}}8%R-8!q{TwdgDu!E+WvTJMu`znOgJ2u6Gq!q%=8@<)}_M zRsJxbadgXar-uec%hnm=fbY3!%}!owpxeEJAq-7Tz8zcXBf7|r#?p4;JHl$6J9=o8 zgX&3Ey;%+}*ShnfJkP1ovh8*!|D@W*zuAvX{&PUB&P;O& z!#u=c(~o<#*6iGU7$=C}&)Y7h%9+vZ7I)sHBS9>(n}Ht@9&<6Aq+F8MZGh)gWM?m5 zD2s$C^ErL5(-D_}Ky5&sAILRZ$*PnHh=JEOuJG9!804GEh=S?r6tUoPSiSLT$7Vw^ zH6Ycok4G>9N*}3oRG99oniRSMNM@G-FIU*~5Zg^b*(C-7)#Z@tMukX_qZ-c<*ZhGA z$wAaZClDP$4xk4c0`Nmev7?|JwwhKZYX6Y9Ls1LVQ0kSb4c8`cS6-E8j^m(eRw`NK z>0!{K3V@Y^wWl4;~B8T12lJO>8bE52e&sOj=paViI6Ngb!l zSt3${B_qpOZ@ztFhb6k0CA5QC(QYlAijs<-TO}v4&gANN`3WX4Jzm@(sk5AbemekzG2XQM=h3%w^{9BGViWGRgR zT-(@!3e74Hs^j_TAR*#OZ=@mUHza(V-@6z*M6eyyIL?^@!^rVoZ>o%mGg?NL1uHbT zFcq?UGfYKf?529}J+qEgJ%oyz7D&v=dpy{p=&cPH0ng89A@H-@Xbk(Fw87OD6CqA* zId)gQ!0%@BG1-$({%qBml_`0w9kmDf*{?tK^Ba~&7)@c0lbm5YJCv)EIX^bvk=76o z=3sq>!K0_6q=yha(HS)%i43hdgkKyFk+{x}b!!g6nrq)Tho5(E4$Mz(-R$m+g=Ua= zj100yxeDS&uEw}Si4jR%yvK;7=t;3Q$9tPy{JUCWp1-AoC1zT3(hc$=>F64l)L4PK(SR>NnQxC(0Y---rMylfh$&`MX=>w+NgVo z*2GDp2hT%e*iGvdy0)7U5L(%2OWNh7yHk};+$X}iAuf;^E)0Yi4K<*!^v7I_#DBbw zf3BQv4>sk(awy7c)bZ^ri42d{4_vYZD! zL0m>$#}cLCaa*XGZXvGRK;g*T!hu$buOsv*EJGYfu+4R#K1_}XfG}5C#MZ3cM~h{5 z*wa{np(^{+J&Y8y+{tlspx8p$F^nF|Lu7UtMCqwP(el^9-?ed20y6b)==8iRPPfaY zJScl@9F8yy;cg({4iL-&D8n&dAq}Y#j07+IAdkclFTrweZ;Ly?_wK&~_xQM)@ z1(pTM#8op|CFp#AQ&7pjsN9AZ1#M*e) zceZrI*s$PRc1aR)WzrrEL2?=__Sh=MQ)KI9amp|0V!7|o0N3l0<-bkTbW7`8a()^L zOngGkuC7zo2eH&G?k7ld?1bd9DL1za8r9US&bys83s^R79U@QmrsMg9a(5tgs?c=9 zxx@vClgl@2P!<}Za>doJl*Hs9bY|C-j)N;{8(6KgOaok-(hPEPq%^>_iCL4Dx}SV_ ztD~UIh9MhKb|C2yW9NrE%h5-~|%vvKC$NfCS<1L1Ei+ya!A>Hni#9))2#J3{lrquFA&t z2j+NhBmpf6Qd6FJ|5}zKq->UV-n6H&v7KUKCQ_nvt`@f}hma^Q+dvL=A(s)f1bk0i z=TUORz@L~xWlJff^O)61+G`Q^KrAlZsR?0RZeL-Nc!z^^U#=pzswoqKj-DG&c4Fz( zExYYYpj`+y-k8G{5?Iws@I}tZaZN>X!=wh7!LU>|G#I*NLwG|r=2nPI zHQK~-5ngK(cGbvBnq=yRglis*fnZuhLg#U&yaB^rFGx{-(Pn@il*c|pJPF1_X|^hi;2bHsAC^d;t`8!>=!PM@ZJQJuKVf^<>>|f_%!66$rJ52Z z$(UuQhRoHuhNHdG-n{6WX_?Z2>)0vnB%+ZP@hDH%wAghKCG>A5r?{n#Xv%r30Ae1L z9M@GEyEkHl444inI<6v;1I8Xnz$ES%#b%l1uwERF=LWs$RSD#CVmQpm%`(zTOdRAhjy5CH_s99&?cO!c zRl|E*CdgfeuBpk}X3%jWAUeW(6W8Hz zQ>=&QHk(Tpm+8nxeaSKhPlVT0OsXeYL}#btTNqbzf&Nb)=~G1BUUgQPLbp76Epp@H|*@te(*(~Zv7NyJUv-7S;Pri4H{=adlcY^ekaUBSx8DgY z-Mu1V@7Lf;-$DxV9SPU4L}ey1foiqob+L^dry;Sm+}EfNllkHV!j&iT?!-rsVs&%y z(nkiPUis3ezUot_7Izlv#9Ki`uOvN`nCAX%#o{)6mOZWfyuGMC{>oRp0)O36RG;8q z`-VsXfRuH%9gc#yA$ip633Iv=Pd$x81ms!uA# zQ~ksJqquNT>VqidN->f6lKzomaYr$kY=m*#KUORb#t#;J&_7PB&0>8z*pOl;gr~`5 zb2z>wKkt&-CzBP(qC_ZH2#M?8T`ca#_wYW{N`ZX(vyDPzDaGz77RMZTz(K8zK3ObI zI?&1n@~Es#81|~tyq6qo@vY7NedKUDhf_=8_ZN$OAb=ZiI0=4AYI}esW_b8Tem;nF zFF1`@`8W=JfR8-%=E_k?D9Kb#C!SQ3it0NFeY98{am`slP5=!9 z>_1jipC-!V=qc%<`D8_o-T1ys{|N|~U&UUh_pAT9qWWGIdOf(rm67RK@6Pp4flK?j zg2qXrPvP{ypZx26pIsENWWC9Oa>Eu_;;3oZ$XhQ9Brdo_w`Beh<=zAatS3NKUFOD z-yCC;mOed=PC;Ua0=Lq~TiVZGSX4hucHRmq8^iIuhX%c{xk7Z;0r6mxS53M)6t9l5B^U6IJ_9YysM#QYLv16B2BTQ_xVd}&erBw_DF zzbciPhFtZ=TR3o*;_oV|pCZb;1E+Gka<~#E$$N_GvqU(9kt0dpvAY^hpwND5{_3Ul)ZFP`N&z&R3=y0nDNOj0emtfsfSjtOxkXvRYI> zPonQFs$bw=?<*F^h5QVgKuoXT4Ax$`R4nd_u+iA!F3e-rzg$$mNE+`is$b$?&lS}# z^RFu+Ttrq(OS~DOy6FSTR`?==3o1bPy=s8@cDXV}&a*9C+tF#ZR#d-2YS%Cwj5#Us zyvk1BE?*fk*17+JQc?a_HlPCwJXWi%c(GW#W&>A2^v4IGYbMem8v_J=Y@c>Szs!hY z&~1+yc;5dI^e-|aNu6H~7EGA(^DBzQ?b7AzxD6w}zY?Y8clpwW-hGsBA1V5(@ zi|RrCbsc>7hVqb8zh6|3^5Xy>x#XSdSN&hA?t%?eE)Mp_8@=_Fa)`{r)ao~+u!cJI zheh>97TzkVH}kI%ln(Xj>~wEuRBVlVlIN~JE~?YSm=x7p_}9mZ>M8y;Rkb@fjq5jp zJi~m()Rvzs6L~RAmGO2_y`AXuqIw7ax(RMdO?K121*N2g$Sc;F6qw(Csi@w=5<5k8 zmVbS`sLu1RUtd%g^{-R?PxQa4te)lPuLc|CmJWQxz+=tOLGl~yD@EnqHDfjeiK@c=NP8F-dqoO``=ttH%asNf(Qofa2uoR zhDzdFfZWGS*b!wTrGFnxAtHY(S{PO*b!-Xv_d{|6IWck;&bJlS*RaSRD5|gHUw;t& zC<52Bg%wyFs=>b<^~bNO_Wuwxx!5ezQMtW^Cw5H?e;DE$j8)Ko#Af$Ou{}F&-~K3A zlNo=yLjJ$-@jHayF%~Wau|^~0k3rCwv{(Zb@5v1e_Z!lXKVB@3LZ`^h`x@j=NE2~( zD2AgXz7*{5gsPU|kME>b@I4EG{Yi)r-|)h@{8c+jtZ5`V50ZH!A(_A=T|$ zgVC1d#_9iA$l4ll3rl&JT;D6QzNyXpb3*>+3R#rbm%)gHAmQjpJxE06#j}+C95d1g5+ps`ReKAA{w?+WtR&;~iwpC#o|3@nZ349d!!~|M!aO zr}^LurivGz=aV|A*+ZEnGw` zbw+*`V~Zf|9DfWdn$n zzXtwXvAExTg6XnVPB&nqx(WDC(Vc1(yP@_o?i&^h9iRUULrd|7wtjy;AVK$AUhDop z$5d1#`?hjZpM~%LEad3F(=z=RGHS#gk4o_8Fp+eE=b!(j%`g2b_qwRk{}n#VCzxC- zqB?C7{A=ZO3n#BDT*UtkbPT!=dw0xtClBeie_K?)%Fgk*>=_2X>d+g~l&=_|bV1LHt=Re5a!VH5Bjkj!^|IcFa>S9bo;eW#nBP;(0GaIIw)P#+a zmiiT#V+8)+qI#Tv{VJAqOq&Tdw<^5Jf-gc0{tpEKg609T~Vg`p%GG0_U#GYa%E(xb_)0}QJlQCM*^dq^^uEfg6tsWB5YHjZafqjSwSGP7zOKaO zrh1J6k9lC)r&h03=quINP~E0KZl4TB>NOG4x9g|Zl-Oj+j^I>v2R>BqmVe%Zf6B$t z+13mb1j_BSD|f2eCny&b<&KCV6!+sB`bRdeBGT%B{I1@i@~#dlaK9`=6DTUqh3b%g zJ&Z3mu}xpGk)WmTRM2a&RO248kUOj&Uj4D5&YJ3o{ycy^hN!sH;qy`XT%Bj7$MnZV z{y5I^({LnQu?qTL}@Pgv-y zhxOY*4A>HD?9Qz|!ajuLBUeb{rKqSZuKVp3g6k_G&~^~(UueN&HDXB@zfwVaB}#H!Vk&4!W?i~0S|5>Bk>&l z05w~-Q}_Z!JRWOZ!D0=Cj3oNX?pqXm#Mb7#jwcBVMo1(f&3sB=)lCZGX+^vPmRKo| zUC36h`a=D7n|#~id*5%>BA;N9w<-7#928SzA4rO|`XUAF51tDfk8jtnm`Y4YY+Hot zivyLgBg3;9`aIq{1W-rM?@k##pQY~_?%n9fXvkI`$f=fcq(HU&?PA%~bEb%V= zvEYw0TKu(e*jxIyv-;uCY_O%v+^w>}dM^Svr^UXJ#m+0%T{Bz~U7?k3wwP#Z!M>>2 z-%RXh^vAdG$Fut5TlL4OY8Ah#_u`+j`ZmJfC-B9A*=$RPA(mWKPM7raLHRrwZRlo6 zzhBnxx5@WeF_Eg@uV3~_AW1Pijl*pD_?&)xmHoP+zg|5a^khTM*W|13V*UD{cJ*og z(5E)5@8%DE2eJAd{@`18`(}KY5Aqg5`pjDOeZ=6qQTyNw+3v%OsJoj=Ul^*spBQ|K z=CImzr)3vFhl5b!yD3MYwDGY9e$3K8-=UvE zN>^s{J+wU)J=9AZt%{jwkD=>v3#sg3!P^?B)>oM`dFgGsQVn!1WvgR~1Cnj@j GAOAo8hQB%h From b07c0c17384be80d1bb6e1caf172e1dcf948a1a6 Mon Sep 17 00:00:00 2001 From: Bingjie Liu Date: Tue, 16 Apr 2024 10:13:41 +0100 Subject: [PATCH 15/19] update openapi.yml --- openapi.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openapi.yml b/openapi.yml index 0202c3dee..0d57586cd 100644 --- a/openapi.yml +++ b/openapi.yml @@ -733,7 +733,10 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/PersonResponsibleOfficer" + type: object + properties: + data: + $ref: "#/components/schemas/PersonResponsibleOfficer" "404": description: Failed to find licenses for a person with the provided HMPPS ID. content: From 0a873b76b2332bf74a5fb7ec90e83e972e574bd2 Mon Sep 17 00:00:00 2001 From: Bingjie Liu Date: Tue, 16 Apr 2024 10:31:22 +0100 Subject: [PATCH 16/19] update CaseSentence as per update stream open api --- .../hmpps/hmppsintegrationapi/models/hmpps/CaseDetail.kt | 2 +- .../models/probationintegrationepf/EPFCaseDetail.kt | 2 +- .../hmpps/hmppsintegrationapi/helpers/CaseDetailsHelper.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CaseDetail.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CaseDetail.kt index 8c14e697d..833d5115c 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CaseDetail.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CaseDetail.kt @@ -19,7 +19,7 @@ data class Name( ) data class CaseSentence( - val date: String? = null, + val sentenceDate: String? = null, val sentencingCourt: SentencingCourt? = null, val releaseDate: String? = null, ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/probationintegrationepf/EPFCaseDetail.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/probationintegrationepf/EPFCaseDetail.kt index 4b5c2bb13..5a2258b7c 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/probationintegrationepf/EPFCaseDetail.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/probationintegrationepf/EPFCaseDetail.kt @@ -25,7 +25,7 @@ data class EPFCaseDetail( gender = this.gender, sentence = CaseSentence( - date = this.sentence?.date, + sentenceDate = this.sentence?.sentenceDate, sentencingCourt = SentencingCourt(this.sentence?.sentencingCourt?.name), releaseDate = this.sentence?.releaseDate, ), diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/CaseDetailsHelper.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/CaseDetailsHelper.kt index d096a9bdb..6e1ed1431 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/CaseDetailsHelper.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/CaseDetailsHelper.kt @@ -17,7 +17,7 @@ fun generateCaseDetail(): CaseDetail { ), dateOfBirth = "2000-03-01", gender = null, - sentence = CaseSentence(date = "2021-03-03", sentencingCourt = SentencingCourt("Fakecourt"), releaseDate = "2021-10-10"), + sentence = CaseSentence(sentenceDate = "2021-03-03", sentencingCourt = SentencingCourt("Fakecourt"), releaseDate = "2021-10-10"), responsibleProvider = ResponsibleProvider( code = "999000ABC", From a1c7921939abf0d2486e5aad94e682b1e73c5756 Mon Sep 17 00:00:00 2001 From: Bingjie Liu Date: Tue, 16 Apr 2024 10:32:44 +0100 Subject: [PATCH 17/19] Undo changes --- .../hmpps/hmppsintegrationapi/models/hmpps/CaseDetail.kt | 2 +- .../models/probationintegrationepf/EPFCaseDetail.kt | 2 +- .../hmpps/hmppsintegrationapi/helpers/CaseDetailsHelper.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CaseDetail.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CaseDetail.kt index 833d5115c..8c14e697d 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CaseDetail.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/CaseDetail.kt @@ -19,7 +19,7 @@ data class Name( ) data class CaseSentence( - val sentenceDate: String? = null, + val date: String? = null, val sentencingCourt: SentencingCourt? = null, val releaseDate: String? = null, ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/probationintegrationepf/EPFCaseDetail.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/probationintegrationepf/EPFCaseDetail.kt index 5a2258b7c..4b5c2bb13 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/probationintegrationepf/EPFCaseDetail.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/probationintegrationepf/EPFCaseDetail.kt @@ -25,7 +25,7 @@ data class EPFCaseDetail( gender = this.gender, sentence = CaseSentence( - sentenceDate = this.sentence?.sentenceDate, + date = this.sentence?.date, sentencingCourt = SentencingCourt(this.sentence?.sentencingCourt?.name), releaseDate = this.sentence?.releaseDate, ), diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/CaseDetailsHelper.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/CaseDetailsHelper.kt index 6e1ed1431..d096a9bdb 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/CaseDetailsHelper.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/helpers/CaseDetailsHelper.kt @@ -17,7 +17,7 @@ fun generateCaseDetail(): CaseDetail { ), dateOfBirth = "2000-03-01", gender = null, - sentence = CaseSentence(sentenceDate = "2021-03-03", sentencingCourt = SentencingCourt("Fakecourt"), releaseDate = "2021-10-10"), + sentence = CaseSentence(date = "2021-03-03", sentencingCourt = SentencingCourt("Fakecourt"), releaseDate = "2021-10-10"), responsibleProvider = ResponsibleProvider( code = "999000ABC", From a90c6763b1ebe816082a7cc6f477fb54dcc8ea91 Mon Sep 17 00:00:00 2001 From: Bingjie Liu Date: Tue, 16 Apr 2024 10:49:02 +0100 Subject: [PATCH 18/19] update open api parameter name --- openapi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openapi.yml b/openapi.yml index 0d57586cd..a9ccb6fb3 100644 --- a/openapi.yml +++ b/openapi.yml @@ -722,7 +722,7 @@ paths: NoQueryParametersBadRequestError: $ref: "#/components/examples/InternalServerError" - /v1/persons/{Id}/person-responsible-officer: + /v1/persons/{HmppsId}/person-responsible-officer: get: summary: Returns the person responsible officer associated with a person. parameters: From b02fffa47ebbf49387c4c55bc67bbdfc255c7194 Mon Sep 17 00:00:00 2001 From: Bingjie Liu Date: Tue, 16 Apr 2024 10:51:28 +0100 Subject: [PATCH 19/19] Temporary fix for epf smoke test --- .../hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt index b2cf06e16..5aaf2a95f 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/EPFPersonDetailSmokeTest.kt @@ -32,7 +32,7 @@ class EPFPersonDetailSmokeTest : DescribeSpec( "dateOfBirth":"2019-08-24", "gender": "string", "sentence": { - "date": "2019-08-24", + "date": null, "sentencingCourt": { "name": "string" },