ECDSAVerifier: Failing to verify signature for JWS json

Issue #295 closed
Stefan Norberg created an issue

I am told the following key should be able to verify the signature of the JWS.

Any ideas?

public class JWSUtilTest {

    String KEYS = "{\n" +
            "    \"keys\": [\n" +
            "        {\n" +
            "            \"x\": \"4q3e-3D0CQb8srsLXLCvJTM7fYhv9xr7JHIOEeoW128\",\n" +
            "            \"kid\": \"metadata_signature\",\n" +
            "            \"y\": \"YREppCNr_gtGCwSS5inOKSJ0MlPMi4tYTGvVfRIQNUY\",\n" +
            "            \"crv\": \"P-256\",\n" +
            "            \"kty\": \"EC\"\n" +
            "        }\n" +
            "    ]\n" +
            "}";

    String KEY_ID = "metadata_signature";

    String METADATA = "{\"signatures\": [{\"protected\": \"eyJjcml0IjpbImV4cCJdLCJuYmYiOjE1NDUzMDcxMDcsImV4cCI6MTU0NTM5MzUwNywia2lkIjoibWV0YWRhdGFfc2lnbmF0dXJlIiwiYWxnIjoiRVMyNTYiLCJpYXQiOjE1NDUzMDcxMDd9\", \"signature\": \"Iy7wAIdqMzLW3tE8t2T_MsEH79OC9Xha5L31XbSeVhvjMCV1ytGbHtkeAqMhj3ErKBAt1xfr7DTbYqifQFjWuA\"}], \"payload\": \"eyJlbnRpdGllcyI6IFt7ImNsaWVudHMiOiBbeyJuYW1lIjogInh5enp5LmV4YW1wbGUuY29tIiwgInBpbnMiOiBbeyJuYW1lIjogInNoYTI1NiIsICJ2YWx1ZSI6ICIraGNtQ2pKRXRMcTRCUlBocklMeWhnbjk4TGh5NkRhV2RwbXNCQWdPTENRPSJ9XX1dLCAiZW50aXR5X2lkIjogImV4YW1wbGUuY29tIiwgImlzc3VlcnMiOiBbeyJ4NTA5Y2VydGlmaWNhdGUiOiAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlERERDQ0FmU2dBd0lCQWdJSkFJT3NmSkJTdEpRaE1BMEdDU3FHU0liM0RRRUJDd1VBTUJzeEdUQVhCZ05WXG5CQU1NRUhOamFXMHVaWGhoYlhCc1pTNWpiMjB3SGhjTk1UY3dOREEyTURjMU16RTNXaGNOTVRjd05UQTJNRGMxXG5NekUzV2pBYk1Sa3dGd1lEVlFRRERCQnpZMmx0TG1WNFlXMXdiR1V1WTI5dE1JSUJJakFOQmdrcWhraUc5dzBCXG5BUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF5ciszZFhUQzhZWG9pMExESlRIMGxUZnY4b21RaXZXRk9yMysvUEJFXG42aG1wTFNOWEsvRVpKQkQ2WlQ0USt0WThkUGh5aHpUNVJGWkNWbHJEc2Uva1kwMEY0eW9mbEtpcXg5V1N1Q3JxXG5aRnIxQVV0SWZHUi9MdlJVdkRGdHVIbzFNekZ0dGlLOFdyd3NrTVlacncxekxIVElWd0JrZk13MXFyMlh6eEZLXG5qdDBDY0RtRnhOZFk1UThrdUJvakg5K3h0NXNaYnJKOUFWSC9PSThKYW1TcURqazlPRHlHZytHckVaRkNsUC9CXG54YTRGc2wwNEVuLzlHZmFKbkNVMU5wVTBjcXZXYlZVbExPeThEYVFNTjE0SElka1RkbWVnRXNnMkxSL1hySmt0XG5obzE2ZGlBWHJnUzI1M3hia2REM1Q1ZDZsSGlaQ0w2VXhrQmg0WkhSY29mdFN3SURBUUFCbzFNd1VUQWRCZ05WXG5IUTRFRmdRVXMxZFh1aEdoR2MyVU5iN2lrbjN0NmNCdVUzNHdId1lEVlIwakJCZ3dGb0FVczFkWHVoR2hHYzJVXG5OYjdpa24zdDZjQnVVMzR3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBXG5yUjl3eFBoVWEyWGZRMGFnQUMwb0M4VEZmOHdiVFliMEVsUDVFajgzNHhNTVcvd1dUU0FOOC8zV3FPV05RSjIzXG5mMHZFZVlRd2Z2YkQyZmpMdllUeU0ydFNQT1dydFFwS3V2dWxJcnhWN1p6OEE2MU5JamJsRTNyZmVhMWVDOG15XG5Ua0RPbE1LVit3bFhYZ1V4aXJyaWRlKzZ1Yk9XUkdmOTJmZ3plREdKV2ttbS9hOXRqMEwvM2UweElYZXVqeEM3XG5NSXQzcDk5dGVIanZuWlE3RmlJQmx2R2MxbzhGRDFGS21GWWQ3NHM3UnhyQXVzQkVBQW1CbzN4eUI4OWNGVTBkXG5LQjJma0gybGtxaXFreU90anJsSFBveTZ3czZnMVM2VS9KeDluME5FZUVxQ2Z6WG5oOWpFcHhpc1NPK2ZCWkVSXG5wQ3dqMkxNTlBReFpCcUJGb3hiRlB3PT1cbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0ifV0sICJzZXJ2ZXJzIjogW3siYmFzZV91cmkiOiAiaHR0cHM6Ly9zY2ltLmV4YW1wbGUuY29tLyIsICJuYW1lIjogInNjaW0uZXhhbXBsZS5jb20iLCAicGlucyI6IFt7Im5hbWUiOiAic2hhMjU2IiwgInZhbHVlIjogIitoY21DakpFdExxNEJSUGhySUx5aGduOThMaHk2RGFXZHBtc0JBZ09MQ1E9In1dfV19LCB7ImNsaWVudHMiOiBbeyJuYW1lIjogInNjaW0tdGVzdC1jbGllbnQuc3R1ZGkuc2UiLCAicGlucyI6IFt7Im5hbWUiOiAic2hhMjU2IiwgInZhbHVlIjogImN1VEFkdGdUYUkrSlRKeXJzTms0cHpSaFBNRGdINk5BUFFSTGhYUTdWbHc9In1dfV0sICJlbnRpdHlfaWQiOiAic2NpbS1xYS5zdHVkaS5zZSIsICJpc3N1ZXJzIjogW3sieDUwOWNlcnRpZmljYXRlIjogIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJRnB6Q0NBNCtnQXdJQkFnSUpBSXVkaVNmV0NlTXRNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GOHhDekFKQmdOVlxuQkFZVEFsTkZNUXN3Q1FZRFZRUUlEQUpCUWpFU01CQUdBMVVFQnd3SlUzUnZZMnRvYjJ4dE1Sd3dHZ1lEVlFRS1xuREJOTGIyMXdiR1Z0Wlc1MGMydHZiR0Z1SUVGQ01SRXdEd1lEVlFRRERBaFRkSFZrYVNCRFFUQWVGdzB4TnpFd1xuTWpReE1qRTNNVGRhRncweU56RXdNakl4TWpFM01UZGFNRjh4Q3pBSkJnTlZCQVlUQWxORk1Rc3dDUVlEVlFRSVxuREFKQlFqRVNNQkFHQTFVRUJ3d0pVM1J2WTJ0b2IyeHRNUnd3R2dZRFZRUUtEQk5MYjIxd2JHVnRaVzUwYzJ0dlxuYkdGdUlFRkNNUkV3RHdZRFZRUUREQWhUZEhWa2FTQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUFxuQURDQ0Fnb0NnZ0lCQU5FQ25YRmdkcVpPbWRZTlFRclVEYWJuNHpKMUNFQkN6SDhCNG9VTytJTGdNbnNONmZyOFxuaWNEYmJPckwxZ09TcjJJaUV6RzlBd0MxYXhaS0sxaXFrUXg2dW1JY3pFZldqazlTU1lxdmk3MEF4M3QrSzNsY1xuUXUxWG93aHZrSmV1ZWh2YjlEaUh5TzFvTzlmNWV1YUZ3ZDhqOUpRSjAyMFN3SDd0bEtJbzcxZkwxQVNWby9MSlxuMHA0bXM4bUgyWTJQVEJRZlpLVWdDckhyWFgwZVdUNUZ3dXBGazhMUkg5QzlBU0RDN29iUEoxVk1DSDNmNGhMZVxudzZSNGtnb0F4YUpqSVRhMDVFZy83Y3MyeTBXRGxzdmkvVmpRTXUyNHoxUzE2RU5FeVdhN0tXZEVBUXdhalZGSFxuL3kwRzRMSG50d3ViU0FuNHB0QUVqaHluR0x3MTU1VWF3VEhkUE96QWhlbi9Vb1QxWFltWHJwNGJrL3FHWTVHbFxuL3lGQWhINW8yV0xyQjN5M2dOUnFmSW9lUVVjVFJFd1pUY0pZN3FESGllYUZ5eVorZGtmeldaTlhqanVpaTFzWVxueS96OXVUcVh6dS9ibGk1VGtBSGNmOFdHVTlHeFI3SHdJalUraDFRTUhEa1hsR294SC9ZRkErazFaWnhzSGNrSVxuRm1FREV0aVVVSHUzR214azJtT1B5M0NZakJOYnVJNi9lY1VkSGpxT3N2UnJNakdCUUROUWFOcmlKZjFPWjZTbFxuMTBteWRKTjV1YW5yN0E3cmZxVGVmWWFOd2s4bDc2L3psRzROazhJaXFieWJpbnhRREpJSnUvMWp2T3VFRHQ5dlxuVFJ1cXNHdkpsQ3ErTHhqaVhKN3hQdVVDL2N0QlFiSXRoTG4rUGplNmhnTmlRWjMwMWIvVDNYVy9BZ01CQUFHalxuWmpCa01CMEdBMVVkRGdRV0JCVCtvbXRtZlpkV1dHb0NmL0syanIwdE1uQ0lNREFmQmdOVkhTTUVHREFXZ0JUK1xub210bWZaZFdXR29DZi9LMmpyMHRNbkNJTURBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFQU1BNEdBMVVkRHdFQlxuL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBWks4VzZWUTNJdjJidkc4eE9QQVZ4MFptZDVIaVxuYmM0UVJoV1pMTDg1bHFKUDFyZzNQNy9Kb1Y5elVYbWhpVS9kbDM1ZW5WUlJZU3Q5a1BWTStZMTdoejdDSW9ZNlxudnUrVnJ3YWhvT0VwckxxeTQrQ3pyYy84OS9KZFB2eHFVcDlLZkdTWjAyanY5SWZlSUxVMWpQaTkwMFJKWlFvUVxudkVLOWNJdG9wbjAzckZvZkNOZmYzelRETStYeE1GQkF2S1U2WlFMcHZ5MWtzUFFqL01JNVdyN2Nzekphc1BpQlxuMTVKZnY2aC9WTUcyTTNWbjRIenVLTUJLdzM1RGhBV3pmMVI2MThEb3NmTGZOUkVlb090dXRtZlFQSEN5alRFUlxuMmVxYVlqd3dpaDRRNVJTREtETFJRS2hYeEwvdVFMMHhHdHZMNHZIZ1AxclVTL3d0V3JhUjN5bFhubkx5Qjh1OVxuRmJOazFzVTA0U2dXMDBzSXI5RVF5OFZXb25ZNDFmTjAzellNSjJVeHRVa0hxTlo0TTFkT2lQZ1pGaWJmK1BSWFxuU1c2WUNxOUNkWVhnRFJzUVdRYXdMQjhPamc1Zi9vNVhiOGJEQnhBSCt6VWswL2tocUU1bzRRcVdjQjNQZFExeFxueWlpOGVQM2MyL1c5Z2F3M2k1UFVycEQxbmM0RDhrUVpvL2JlNmlKeTZ1a013ZWNJVmQ1SURpd0tsRngvVlI0R1xuZzN2U2tCREtoYm82ZW5UdENXc0F4MjR4UEtTWWZoZTVmRkRHNXVWUmNsWDFvdUlwU05qeTdBKzArU296UXZIM1xuMHRxcDI3L2RaTVpuT3NnZFVzRHlqSS8zM0JLRksxU084bGVqME5jNXFKajlXQzJMQVpmbGMybnVkS29QM0RkMFxuRnB1ZU84UkE2c2Yrak4wPVxuLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSJ9XSwgInNlcnZlcnMiOiBbeyJiYXNlX3VyaSI6ICJodHRwczovL3NjaW0tcWEuc3R1ZGkuc2UvIiwgIm5hbWUiOiAic2NpbS1xYS5zdHVkaS5zZSIsICJwaW5zIjogW3sibmFtZSI6ICJzaGEyNTYiLCAidmFsdWUiOiAiOElnK3lXdVMxYUc5QkdVaGNmNVova25aWXdzalhKdWFiMEhmUUZnY3dMWT0ifV19XX0sIHsiY2xpZW50cyI6IFt7Im5hbWUiOiAic2NpbS5za29sYS5lbmdlbGhvbG0uc2UiLCAicGlucyI6IFt7Im5hbWUiOiAic2hhMjU2IiwgInZhbHVlIjogImtlV29KWHBaa2svOU52enZ5WHVpSjU5cXRjWDIxdGRlUUZTdzAzOC92bUk9In1dfV0sICJlbnRpdHlfaWQiOiAic2NpbS5za29sYS5lbmdlbGhvbG0uc2UiLCAiaXNzdWVycyI6IFt7Ing1MDljZXJ0aWZpY2F0ZSI6ICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbk1JSUdJakNDQkFxZ0F3SUJBZ0lKQUl6T3JRWWwyMmZrTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdsTVFzd0NRWURcblZRUUdFd0pUUlRFVE1CRUdBMVVFQ0F3S1UyOXRaUzFUZEdGMFpURVZNQk1HQTFVRUJ3d013NFBDaEc1blpXeG9cbmIyeHRNUjB3R3dZRFZRUUtEQlREZzhLRWJtZGxiR2h2YkcxeklHdHZiVzExYmpFZ01CNEdBMVVFQXd3WGMyTnBcbmJTNXphMjlzWVM1bGJtZGxiR2h2YkcwdWMyVXhLVEFuQmdrcWhraUc5dzBCQ1FFV0duTmxjblpwWTJWQWMydHZcbmJHRXVaVzVuWld4b2IyeHRMbk5sTUI0WERURTRNVEV4TlRBM01UTXpOMW9YRFRJNE1URXhNakEzTVRNek4xb3dcbmdhVXhDekFKQmdOVkJBWVRBbE5GTVJNd0VRWURWUVFJREFwVGIyMWxMVk4wWVhSbE1SVXdFd1lEVlFRSERBekRcbmc4S0VibWRsYkdodmJHMHhIVEFiQmdOVkJBb01GTU9Ed29SdVoyVnNhRzlzYlhNZ2EyOXRiWFZ1TVNBd0hnWURcblZRUUREQmR6WTJsdExuTnJiMnhoTG1WdVoyVnNhRzlzYlM1elpURXBNQ2NHQ1NxR1NJYjNEUUVKQVJZYWMyVnlcbmRtbGpaVUJ6YTI5c1lTNWxibWRsYkdodmJHMHVjMlV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdcbmdnSUtBb0lDQVFEbkhxbDhQR0ZDRi8vNm5JVzJhQlZ0d3FrcFdZTHgycThoRzlYRjYvMSsrMzBoTVg5dmdQSHVcbmhrc2doWWhBM0wwZ2JFUkpmMzZBMnhIZ095SWFqRTRYNzh6NDBRK1BxaDhqR1RKMWh5c2ZtMEhXTTlXYmVpZ2FcbjE4QnRUaWhYZFBlUnF2YXdoZXNYL2ZDSzY4Z3FWeUlNektDRTIwY0FsYW9Laktyd2puL3Yybmw1YVdkdjFSSUFcbkNVNjRNdWd0emMvY20xZklYVkl5UmFhZVVoR0lTRTliK0EreFFUMk5kQU5DQVdXakZOZDZ5bFd2djlEYm5IaXJcbkZmUDRQVUZ2VVNuYVNqUi93KzhKemd0RTBpNGl6WUs5S2I0L2VWbFZCQ0hJSUUzcmErYkhmaGNTdC90bzVISlpcbnJtcGVMNnVDbUFCUkVNVDU2b0lBbEhNQm1EdEpja1lHbXZ3Q1hGVDVHUEZ3N3BTdFVNelN1MHorM1pkWC95K01cbkFjODZ5emFIK3Frb3hSQzQvS2U0NWFpNEpMc3ZncHc0cmpFMmRHUGF4V0RROC9scGFDc0JXdk9SbndDcGFRL3NcbjR4Ly9NR3p3WnF1bnRRM2VnSUNDTWp3c2FXMVpGYXVKUlpRRDdZZ1dodzFTcXJUWWtBWHRZdGVlT2pzR3pDWlRcbjdHZWgyY3MzV2FQaGpSbGFnQnJCV25LdWFUM05RN2Z3UHo3U0c3bDlsTUtPVkhzV0JaM29tUTVYSWVtSXNZRnlcbjh2Y2twbkgvWWl0aVUvUXd3RDVrbXo1ZzF3N3Z2anluY1p3NlBNQU1BYUR6VHpyMjd0aHpDMFVEVGZCY1VUTUxcblBUOXVNTjlzRmZxM1crTit1RE1JMVlTNFB1NXI3UWtWQWEzclpubzNaaThSdG42YVpRL3daUUlEQVFBQm8xTXdcblVUQWRCZ05WSFE0RUZnUVVZc0lBdnRpZFg2WHpZZ29qSmEzdkU3TUY0eEl3SHdZRFZSMGpCQmd3Rm9BVVlzSUFcbnZ0aWRYNlh6WWdvakphM3ZFN01GNHhJd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRc0ZcbkFBT0NBZ0VBMVpvU1VNQWNURzNVSjRCeGx4dVNtUG0wMklMU1hZaUhCOUV6b0xTQ29RWjJsbjJMRnZtQnAwWTVcbnIrZFlsY0Y4dThMVDhwRDF5REZpajRGajV2ZVNUczR1dWV6Wm4wS3IrS1lnSStGWHl1WnA0TWdJakRwVUc0M2pcblh0Mi9WdjlWTjdndUJYUkJEYmc0YzhRL3hDUTJwRnIxK0Z4Vno1aVNPUHZoeEhQR2lQUzhadFpVaUZlM055aFlcblBVKzEwY09ucFdiTWM0OGxLcXFrMlRPSjRmVjFoelBBY0ZFU0JMNTlQcnkwdXJBYnhSTURVQzdKdDlpMDdRd09cbkRzYmdCeGVZc3lvUW05c3BMN1JuUlYrOGoxdDRrREdmWlY3dGVvRHNxWTc2L0w4ZW5CWjgvUjlvOWQzUWZiRWRcbkZkK2lmNmNVb2tyQWVIWjEyRkdqSS9zVThuSVNNZWpVcDFLV0RqQUtvZUdibG1sUnRDckVJeWlQYmZGQ2dScnVcbk9mSm9zWUZXODRSaVhmU2R2QUIzYVpqSEFWakY5Zk40Tmg1WUVFS09WNEpYaEsxaFBZRW9UMW5tbGF5Um9Zbk5cblpIMzk3aHE1T2RzU0wzOVlLcm91TGR0WU00OUhOQ0RRYkpvMXdKYmVNNnZIUXdEVUI4WXRrQjZLbVNHQ2NidWhcbndrd0oxRUMrbkFuUVhmT0xxaE5YSlVvM3RRMjJFdWk0VnB5OTYrM2xqSmU0KzFUcEtKYTZIck1uWFNuTmgxSVVcbk1BVllSbHUxaFVkaEFRMnRLQ2psMlpYc0VUYXFEOFNMeVJuNkpDZXRza1NrMk1xUDBxVmNDQm1vcnZta0VwanJcbkhmYVBMQWZ2VWQrbStHeEtiOVBGQWl3N2tRdEZEb3B5cVluZXN3Zko0NENzK1ovOEVGdz1cbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0ifV19LCB7ImNsaWVudHMiOiBbeyJuYW1lIjogImNsaWVudC5zY2ltX3Rlc3Rfc2tvbGFuXzEuc2UiLCAicGlucyI6IFt7Im5hbWUiOiAic2hhMjU2IiwgInZhbHVlIjogIjRYUExxelR4Qm14d3IvY1hYc3ptQUpoUXh1OWlQTGkvbEtGc254bm96Wk09In1dfV0sICJlbnRpdHlfaWQiOiAic2NpbV90ZXN0X3Nrb2xhbl8xLnNlIiwgImlzc3VlcnMiOiBbeyJ4NTA5Y2VydGlmaWNhdGUiOiAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlGT1RDQ0F5R2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQmhqRUxNQWtHQTFVRUJoTUNVMFV4XG5qQU1CZ05WQkFnTUJWTnJZVzVsTVJJd0VBWURWUVFIREFsTllYSnBaV2h2YkcweER6QU5CZ05WQkFvTUJrRndjXG5FOXNZVEVRTUE0R0ExVUVDd3dIU0dGamEybHVaekVTTUJBR0ExVUVBd3dKUVhCd1QyeGhJRU5CTVJ3d0dnWUpLXG5vWklodmNOQVFrQkZnMXZiR0ZBWVhCd2IyeGhMbk5sTUI0WERURTRNVEF5TWpFNE5UVTBOVm9YRFRJeE1EY3hPXG5ERTROVFUwTlZvd1V6RUxNQWtHQTFVRUJoTUNVMFV4RGpBTUJnTlZCQWdNQlZOcllXNWxNUkl3RUFZRFZRUUhEXG5BbE5ZWEpwWldodmJHMHhEekFOQmdOVkJBb01Ca0Z3Y0U5c1lURVBNQTBHQTFVRUF3d0dRWEJ3VDJ4aE1JSUJJXG5qQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFuMnhmY0I4UFVBdUNieXhDbGx6dGo2UzZFXG4xTnRBaGlwM2d3b0d2amZSV2UwVDhRRndkMXF4ajZsZWxTU3N3amc2a1NVZTQvVFZ5MWNvTDJRMGVUaTFPcTFaXG43YmwxMXJCY3lpcFFrOUpyc3RxZUIwcjRxVytVaUVwZ1BhTHB3NlU1eXJvM0dlWitxV0N5K0w4WnhFQjNncFV3XG4wUVNXWHJrWjhHZjNzOVd6ZjBhTjlvOStOOTRSYVViRzBYNmFmMXlLL01CdU1qanhSeWRlU1g1NGpSWW1uTkk0XG5OYVUzaEhLaS9YWXhsTEI2OXk0ZFdlV0FMSjQxcVR4Ty9Ic08rVkxPRWRnaFFmdC8yaXFFL2s3Qkx6R3JIY3BWXG5KM1BFbWxoTm1LR2ovWjJISUZnK2o0eEV6OGJYR2ppNEFBMlo1VXBDNEdqNUNCSXBEbEQxSnFCVWk5OE1RSURBXG5RQUJvNEhqTUlIZ01CMEdBMVVkRGdRV0JCUm5Id2lWcnFmeHpQOTJYNFNRalRWaWlJcCt1akFmQmdOVkhTTUVHXG5EQVdnQlFvZXlsaVU0WnJiNWtBS2JSbDhrV0EzREVueURBSkJnTlZIUk1FQWpBQU1Bc0dBMVVkRHdRRUF3SUZvXG5EQllCZ05WSFJFRVVUQlBnZ3RsZUdGdGNHeGxMbU52YllJUGQzZDNMbVY0WVcxd2JHVXVZMjl0Z2dsc2IyTmhiXG5HaHZjM1NDREcxMVoyZGxiaTVzYjJOaGJJY0Vmd0FBQVljUUFBQUFBQUFBQUFBQUFBQUFBQUFBQVRBc0JnbGdoXG5rZ0JodmhDQVEwRUh4WWRUM0JsYmxOVFRDQkhaVzVsY21GMFpXUWdRMlZ5ZEdsbWFXTmhkR1V3RFFZSktvWkloXG52Y05BUUVMQlFBRGdnSUJBQlpTQlY5dDh1R1NERU4zWThPMU92ZkduRlNOeEFXQWRqOE9YSnRpQ1FGVE9tY2lsXG5jTldFalV0NjdjYUJsdXNwOG1yaVRqRU5RRzFZejJiYVdwN1dObjZGa0h5UHEyVzVsQktPYjZnakY0NVNkWGZDXG5JRXlEV2kzV2lXa2NhNjFIb0tIdEJiRlplT1pEcXBuN01QcUl6cGg3eWwzWWJGd05VNHlORjJBSnRLWkpxd2R2XG5pd21MbDNTancvMmpQT0Q1UzQwb2lwZEJnVEpGSGo5VERRWHR6Qmt4bHMrNS95dE9TZ044V3dDdDlWcVozb2JnXG4zS01DWGtCaUM1UTBSbjZBS2ZBQzZXZHVCWlpPQlNXWStHU1JZWHZsMm5jMzMzSmEzYVQyWmxIaWxNSGVOL3dSXG5meFZiVDVyL3loYVZXUEJuZTdsVTVOL0JzZlVST0cxZTR4MVFJQ1hkemg1aHcyc2JVUHRCSU9lVnNGREdVNksvXG5wL1ZXcHFra0pnZGluMDJJWThoRFI4bGlqdXdhcyt3cE9uTXE3a3JXOGV3YVp2YmhiZ2kxbTVzOFRjQVp0ZHpwXG5Ob1VKSTNTL3lIK243aUpFenU1aGw5WGxlcktDR21TeDVUbEc4bS9YOTUwZW9VK3BPMU9qZ2hhd0taYTBxdUQ4XG53d0ZUd2lsSHY5My9pZ0xUYTdoOHk4QWVhR3JSb0hGTlFvMlFPU3JTMnBIUEJma29PR3Ryck92SlM0dnZ6Mk1pXG5FeE5ZangxVktMa0U5a3BoU1l5amYrTG9vU0h5STYxSld3eDFEenhxSE5PMFM2OUtIUXpydUM5emlZcWsrSXV2XG5KWFdlM01meFRmOURyT0kxb05vYU53OU11L2RmNTRFVlgrZTcxTzV1T0dQd09DbXRsemg0U0xwL0RJWFxuLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSJ9XSwgInNlcnZlcnMiOiBbeyJiYXNlX3VyaSI6ICJodHRwczovL3NjaW1fdGVzdF9za29sYW5fMS5zZS8iLCAibmFtZSI6ICJzY2ltLnNjaW1fdGVzdF9za29sYW5fMS5zZSIsICJwaW5zIjogW3sibmFtZSI6ICJzaGEyNTYiLCAidmFsdWUiOiAiNFhQTHF6VHhCbXh3ci9jWFhzem1BSmhReHU5aVBMaS9sS0Zzbnhub3paTT0ifV19XX0sIHsiY2xpZW50cyI6IFt7Im5hbWUiOiAic2tvbGFuIiwgInBpbnMiOiBbeyJuYW1lIjogInNoYTI1NiIsICJ2YWx1ZSI6ICIveVFKNE5HVmIrMnVZZFQzM0psbVFob3doMk1zQkRyODBVL3NXSFFxbHNFPSJ9XX1dLCAiZW50aXR5X2lkIjogInNjaW1fdGVzdF9za29sYW5fMi5zZSIsICJpc3N1ZXJzIjogW3sieDUwOWNlcnRpZmljYXRlIjogIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJRGZUQ0NBbVdnQXdJQkFnSUpBSXFzZU9MUko1eTBNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GVXhDekFKQmdOVlxuQkFZVEFsTkZNUTR3REFZRFZRUUlEQVZUYTJGdVpURVdNQlFHQTFVRUNnd05TVlFnYVc1bWIzSnRZU0JCUWpFZVxuTUJ3R0ExVUVBd3dWYzJOcGJWOTBaWE4wWDNOcmIyeGhibDh5TG5ObE1CNFhEVEU0TVRFek1EQTBNelV3TkZvWFxuRFRJNE1URXlOekEwTXpVd05Gb3dWVEVMTUFrR0ExVUVCaE1DVTBVeERqQU1CZ05WQkFnTUJWTnJZVzVsTVJZd1xuRkFZRFZRUUtEQTFKVkNCcGJtWnZjbTFoSUVGQ01SNHdIQVlEVlFRRERCVnpZMmx0WDNSbGMzUmZjMnR2YkdGdVxuWHpJdWMyVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEQmh6b2I4Wm0rYXhGWFxuUnBmMHZpc0M5am1yVU54R2xjTHg2UDRNUWszRTBmd0k3eFhweWdDTmRpVUtINmI1eEhjbjd6MzZEZXcwYVpsaVxuVklCa2plbmlyejBoTUovZjcxRVU2MzIxNFd4cTBjOW9NQlJvcnF6aDZJRDUrZEdRYXVER3JhTERvV0pqa3pidVxuVUNRcFlyYnJGRHcraUM2RjRqUlhxeSs4Q1o0Tno2N2l1bnZhZjA0UGp6dkJkS3Rwdml3SmRibE4xZDZYdHF5K1xuL0FLZVdmMU5XZUQ4N1VjemJRcm41MUZZYjNoRHpKc3RsYlYzR0hERlFscUpLQ2VxYnh5ZHFVam8wMW5zVjdTUVxudzFPeUJnTFVmcGpwMStMZFAvcXl0U1cvMk94KzlLMDI1UGZUV05tc1l4VmFOaXpoaldkRzdDNU9tSTlwMUgvYlxuTnJnQWNCOTlBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlJEQjI4RUZtdC83ZWRodU9GcVdXbmZjWWVpZERBZlxuQmdOVkhTTUVHREFXZ0JSREIyOEVGbXQvN2VkaHVPRnFXV25mY1llaWREQU1CZ05WSFJNRUJUQURBUUgvTUEwR1xuQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNXRUJCWFMwdHRkTVRhMzFoSTBqWGowRFR1cVp5WTBHN0NRYy9pbU9CMFxuTmpZa0lUd3NlUGdrbWs4L3FLUGRXZytWQlF0cURVMzEwK2k5RUpvWHM2b1djbHRqMndDZ0FMcHpsd1NENVFFZlxudEFYYlF6LysvaVErMWRDcVBDdjhjKzNYQmNVWFlpa1hBU1RpcmtKN0YwRCtnTzFSckt2T0hRNFpVai9DRFRmbFxuaWw2NGVPYURXSXJxY3JYTWQ3R0QyMnJ0L0s4OWFZSTRFRTZJeWU5eUdQRDNjR3dlZFc4b3ZSeHcwY0NWcC9qWFxuZ2kvK3JRZDNpYit4ZHhNNkVVL24zOFZhNVVVYjFwTUZsUlJ5bVk2dEpsbGV3YXdhWnkyRGFISFpTVk9jS2Q1NFxuQVUydVZaZ2pQWWkyRTRpRFlENWRVUndTS3FFMDlyZGVmcHNtYUtGNWg3WXFcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0ifV0sICJzZXJ2ZXJzIjogW3siYmFzZV91cmkiOiAiaHR0cHM6Ly9zY2ltX3Rlc3Rfc2tvbGFuXzIuc2UvIiwgIm5hbWUiOiAic2NpbV90ZXN0X3Nrb2xhbl8yLnNlIiwgInBpbnMiOiBbeyJuYW1lIjogInNoYTI1NiIsICJ2YWx1ZSI6ICJrVTNnSHUrbjM3emhQV0p2TnJyYks0R3dwWS9aem1ScDhvTmVnMUdNTmtBPSJ9XX1dfSwgeyJjbGllbnRzIjogW3sibmFtZSI6ICJvbGEucGxhbnRza29sYW5fMS5zZSIsICJwaW5zIjogW3sibmFtZSI6ICJzaGEyNTYiLCAidmFsdWUiOiAiWk1LU2MrWW1vZTFKTEhaQWJpQkdMTGRxYlAxZE1NMHg5N3VUc1ZqVHhiVT0ifV19XSwgImVudGl0eV9pZCI6ICJwbGFudHNrb2xhbl8xLnNlIiwgImlzc3VlcnMiOiBbeyJ4NTA5Y2VydGlmaWNhdGUiOiAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlHR1RDQ0JBR2dBd0lCQWdJSkFJTFBlVS9kRTErN01BMEdDU3FHU0liM0RRRUJDd1VBTUlHaU1Rc3dDUVlEXG5WUVFHRXdKVFJURU9NQXdHQTFVRUNBd0ZVMnRoYm1VeERUQUxCZ05WQkFjTUJFeDFibVF4R1RBWEJnTlZCQW9NXG5FRkJzWVc1MGMydHZiR0Z1SUV4MWJtUXhFREFPQmdOVkJBc01CMjUxY25ObGNua3hIVEFiQmdOVkJBTU1GRzlzXG5ZUzV3YkdGdWRITnJiMnhoYmw4eExuTmxNU2d3SmdZSktvWklodmNOQVFrQkZobHZiR0V1YldGMGRITnpiMjVBXG5hWFJwYm1admNtMWhMbk5sTUI0WERURTRNVEV5TXpFME1UTXpOMW9YRFRFNU1URXlNekUwTVRNek4xb3dnYUl4XG5DekFKQmdOVkJBWVRBbE5GTVE0d0RBWURWUVFJREFWVGEyRnVaVEVOTUFzR0ExVUVCd3dFVEhWdVpERVpNQmNHXG5BMVVFQ2d3UVVHeGhiblJ6YTI5c1lXNGdUSFZ1WkRFUU1BNEdBMVVFQ3d3SGJuVnljMlZ5ZVRFZE1Cc0dBMVVFXG5Bd3dVYjJ4aExuQnNZVzUwYzJ0dmJHRnVYekV1YzJVeEtEQW1CZ2txaGtpRzl3MEJDUUVXR1c5c1lTNXRZWFIwXG5jM052YmtCcGRHbHVabTl5YldFdWMyVXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDXG5BUUNXYkF1eWoxbXVRYVNyenNpU2JTU3FpckluaEdpUVgwc1NiTlEzU2FkT0xaUERsOGN4QU1vbWFETzhmLzJxXG4yK1hCcW5IeGVYWFRidDJCVWJnaVFYUGtpUkg5eFFuczRhaGoyUUFJQVF2d2MrQjVwY0Y5RG5jL1NBL3VlNS9oXG5zVmp3N0tUVEdXVm1rZld5RXhZQmJscWdtV3ZhdzlOQjJ6Rkt6b2RqOHd0M3piWURaY0tRcTV2TTRaR2ZyRVkyXG5EMjlLbUNRTkxMV0E2RWRwWlgxemlSeDJCWXdlbUlsQ0g0a3VjekFUYk1GMlMvWDRiNW1hQWc5NHBsMjZrdmlsXG5obXpXaGt4WS9VRmJ2WWQyd05qRDAwUnl2d1ZWU3lwaDkveW5aaldLMVBiaFpyeW94ejBwZmdJU3RrZDRzeitCXG5nalFMcXhyYXV6azVrUnMzZmE5K25Fc3FCNlhwT2lNZHU3b0R4VFlmWEJpclpMaSs3N0dGdWtMWjVlQkZES21GXG5xL2M5Y2dtVlhmU0V1QVUzMVZqSW1FN3QyM0tUY0Y0SkNmemNvanM3UzVyUWZiR2kzNm0zVGFNU0ZkZVVCNGdnXG5aL3gyclkxWGtRd1JwNkc1eU9SMTFmSnkreGpzVWFlcVBPZDFpRkl0UVhIYlZqblFsSnV1VzRtL0J0YWdJWDMwXG4yTzBFby9PNXBRZGNtWDJHN1dBVTdPZERtZTRINnFlTVIzc0lSa0xNTWZMY1RVUDIwM2IrUjQyTm1YVmNBNlJDXG5ZQW5nZHUvVUxhV0c0cmhuN3JsWEpoL3dMWlJNY2dGRGx5ZEw4ZU9wbkJBT2FNWTNhV2k0YUxocnQyZ3c3OEs4XG5uNTVTejZEbEVZeEVJVnZycC8wTkU0MHdIT0UyOHo1d0tjQUQ5K2cvT2NDM09RSURBUUFCbzFBd1RqQWRCZ05WXG5IUTRFRmdRVVU4T3lxNDZEb0pOYmhBWlpwYmtkQ3FXMmE4c3dId1lEVlIwakJCZ3dGb0FVVThPeXE0NkRvSk5iXG5oQVpacGJrZENxVzJhOHN3REFZRFZSMFRCQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFldHpEXG5VVXVEalNheisxUXBaVnRpMVFZL0VSanhnMkxKTzFRZHhvQ0RDYkV0b1VFNzZUSy9WNE9lN2dUcWl4OEZMMGhqXG5kYTBIeG4xZlh6dllCUDJOR3BtVGU0bzR1WEJZZEpXdkc5Q0ExVWFURkhFajQwcDZFVmVaTlRCOFh6cFdVL0dIXG5Oc2JmVXo3alZudGNYeW1KaE4wYzBGZko5ZWJVTUlUdVNHRGZkSHpQOTNWdnNjemtJUmpBeVBvNXpWcEtPUldTXG5JZFNrdmVudGg1NnZmRDhlWWVSM1lwOTVtbVZscjRsNUxFZi9RTWw3SXZvbkdIbDk0c0xueFRKWUErakh0dmZaXG5IZk9HT0pRa25kREVsMXhPaE9lNmhqY2RlalhWQVJIaXh5RFFOVVJ4aTQ4SHVsNHF5RkR5a3RiNEdBaVdqczVJXG5VT1BLOWpCRFJnZ3ZQcGJ1ODRNUWthUzRLL1lPOGQwSm92cnp4aEJUa0hqQjdUU2NRM3cxRi9RUlkwWGdlZFhDXG5ZWTVVMm96a0paY0VWTlJGRHo2M2loMFk2QnpiREZRUTl2UXhic2tlNDBLYU5jdllRLzFyT2JzMVNsUjhGVDJzXG5IZ25CVTB1ZmhhZ1FVY2xCMGtSeGgzZ04xZXdUdWd4dlE2LzBQMGk5RyszRUpSU0o5YzcvVlY1cDBsZ3V0bnRiXG5FWmdqNFEvQlBxUVNpbnRIY2hoY2xxemtKazBRYlZHbHVEWXR4TFF6Rk5Gc2FDay93RlY3U0pEWEd0ZjljWkcwXG5vQmNUSzhEczZobHY3WEFabHZ6MzM3RkVUZmJxd2hnejhWQjQrd0NVV0ZORGVPM2NqQ3NwQ3BaWlNxdlFjNkFrXG5kQnZFTlVWWmNHa0Z3VVErQWFBYi9mWG05Rll5NmhzYmZqaFJUOHM9XG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIn1dfSwgeyJjbGllbnRzIjogW3sibmFtZSI6ICJza29sc3luay5zZSIsICJwaW5zIjogW3sibmFtZSI6ICJzaGEyNTYiLCAidmFsdWUiOiAiZFRicHhSc3kyVDNvUHRvODlDZFJDMVQ1a002aHZBbC9mV0szYy9STVdHQT0ifV19XSwgImVudGl0eV9pZCI6ICJza29sc3luay5zZSIsICJpc3N1ZXJzIjogW3sieDUwOWNlcnRpZmljYXRlIjogIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJRlRqQ0NCRGFnQXdJQkFnSVNBODh2amZ5Qzl0YXkxS24vQWVxTGF3SUtNQTBHQ1NxR1NJYjNEUUVCQ3dVQVxuTUVveEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFNWlhRbmN5QkZibU55ZVhCME1TTXdJUVlEVlFRRFxuRXhwTVpYUW5jeUJGYm1OeWVYQjBJRUYxZEdodmNtbDBlU0JZTXpBZUZ3MHhPREV5TVRneE1qRTNNVGRhRncweFxuT1RBek1UZ3hNakUzTVRkYU1CWXhGREFTQmdOVkJBTVRDM05yYjJ4emVXNXJMbk5sTUlJQklqQU5CZ2txaGtpR1xuOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTZYSE1GSjVkckp2VVc5Z09ZRnV4cDJLMjI5a3RqTjg2Q25CNlxuN0NGd1VYODBITFVZN25obE9LS1JZdjBIUjgzaDVyc3RaQ05UUEZ3TVZIT3hsM1dmUDdKNTZqMno1NVBMU1JkclxuRjNqVWFNdC9HUnBXY3lyQjhaV1h4Qk1MRkFVSTdBcnZIalJ4SE9yeWJ2M29sK3ZBamVReHJvcm5vK05Vb2pmMVxuMm9Yc3NHZ1BNTVNzRk05eU14Qm9QM1NNVWlrSnVxSFhhbU9MT1dxY25obHA5NXMydGYzOUZ2NUtBQVZ2SEtLdlxuNTI4dG5BODJsUkUwWlBkMTEwa3J5NHZvNVo2VTlBTjFKcm5FQ1NnaEZlT0RDdU9RVHhoaXlYYnBjakVudlZONlxuRGJ0QzBhV0lxVTQvSW5hSTJ2cTBHMTJlNFM3UldQWml6VlpZZFlpRUpXWFFaMktCTlFJREFRQUJvNElDWURDQ1xuQWx3d0RnWURWUjBQQVFIL0JBUURBZ1dnTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjRFxuQWpBTUJnTlZIUk1CQWY4RUFqQUFNQjBHQTFVZERnUVdCQlF3a2h2WmFnUlpabTBIM1hyYitaMHVMSnVycHpBZlxuQmdOVkhTTUVHREFXZ0JTb1NtcGpCSDNkdXViUk9iZW1SV1h2ODZqc29UQnZCZ2dyQmdFRkJRY0JBUVJqTUdFd1xuTGdZSUt3WUJCUVVITUFHR0ltaDBkSEE2THk5dlkzTndMbWx1ZEMxNE15NXNaWFJ6Wlc1amNubHdkQzV2Y21jd1xuTHdZSUt3WUJCUVVITUFLR0kyaDBkSEE2THk5alpYSjBMbWx1ZEMxNE15NXNaWFJ6Wlc1amNubHdkQzV2Y21jdlxuTUJZR0ExVWRFUVFQTUEyQ0MzTnJiMnh6ZVc1ckxuTmxNRXdHQTFVZElBUkZNRU13Q0FZR1o0RU1BUUlCTURjR1xuQ3lzR0FRUUJndDhUQVFFQk1DZ3dKZ1lJS3dZQkJRVUhBZ0VXR21oMGRIQTZMeTlqY0hNdWJHVjBjMlZ1WTNKNVxuY0hRdWIzSm5NSUlCQkFZS0t3WUJCQUhXZVFJRUFnU0I5UVNCOGdEd0FIWUFkSDdhZ3pHdE14Q1JJWnpPSlU5Q1xuY01LLy9WNUNJQWpHTnpWNTVoQjd6RllBQUFGbndYYW01UUFBQkFNQVJ6QkZBaUVBdituNHJpOTNxTVlLWm81SVxubi96VFVFTG1HUjRDTXdpblhaQ2RxMGhDenJnQ0lBa2thaEpXYXg1a0h1bzNXcXlOOTZFZ09Ld1htSVN1djNUa1xuWW5zRnZGYUdBSFlBS1R4UmxsVElPV1c2cWxEOFdBZlV0MisvV0hvcGN0eWt3d3owNVVWSDlIZ0FBQUZud1hhblxuS3dBQUJBTUFSekJGQWlFQTIxSXBuT0VGU3BqWURpYUpBREpoM0wrTnVpQkZDbGFLSlMvblowRUZTSzRDSUFxY1xuTllSVUZ2UWxhTzR6U3RlOTBrdHUyaVZUUGtlU3FESlFScGNyOEt2bU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQlxuQVFCbCs1bVpJMGhYd0g3ajBkRGxINjZ3Uk5GaUhTMXduNURqeDkyUXdBcXFuWTBDUGxTQ2FPRlBQTC9KMWJBRFxuZ3hYdWV3S1Iwa3NoYnJUbkhmbUFaUjN0RVBET3ZsdU41aWNZTnhsZUo0cHZkL0ZUREJKQ25JejZBRkcwS05oNlxuN2tnRVE4NmxRWi9HaW83aWtLMTF0VWZzQkpnS0JkYXlXT2dSNXpaVStWaUd0OUJwd1RJc2Myc3dnTzR5bU0zSFxuOVUrcE9XVDBSQUV6aFhmbjVENGdoNk1PaVIwSFJUdE5MU25LWXNnVUQyc3FmTEc1SVhqbWUxc2dweUhJS0JHS1xuaFExa3NCMkpneFlOSlBJNTRzdnBWMTlaOHA2ZTYrNHV5Qm4vM0hmbkNpeG5CZmU2amZkdS9rTUE2bzVpdlBUSFxuQnZubitmckprVmRwUU9sSHc5dXJBdFNqXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIn1dfSwgeyJlbnRpdHlfaWQiOiAic2NpbS50ZXN0c2VydmVyLml0aW5mb3JtYS5zZSIsICJpc3N1ZXJzIjogW3sieDUwOWNlcnRpZmljYXRlIjogIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJRmhqQ0NBMjZnQXdJQkFnSUpBTklOYXptbHVtQi9NQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GZ3hDekFKQmdOVlxuQkFZVEFsTkZNUk13RVFZRFZRUUtEQXBKVkNCcGJtWnZjbTFoTVEwd0N3WURWUVFMREFSelkybHRNU1V3SXdZRFxuVlFRRERCeHpZMmx0TG5SbGMzUnpaWEoyWlhJdWFYUnBibVp2Y20xaExuTmxNQjRYRFRFNE1USXhNVEUzTlRBd1xuTlZvWERURTVNVEl4TVRFM05UQXdOVm93V0RFTE1Ba0dBMVVFQmhNQ1UwVXhFekFSQmdOVkJBb01Da2xVSUdsdVxuWm05eWJXRXhEVEFMQmdOVkJBc01CSE5qYVcweEpUQWpCZ05WQkFNTUhITmphVzB1ZEdWemRITmxjblpsY2k1cFxuZEdsdVptOXliV0V1YzJVd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMxdkEveFxuNG5zV0M0bmszdDk1UXE1QUFXOE1CMVMwbnh0UVdTOVVvNVhaa3NXZDdiMkFKbCtJbnpJUy9GQTM1djBUYk96QVxuSUR1QTJlS3E5TEN4d25HSGROaGNSV3Z2THhNdUVpLzlPR2ppVmpNUlg1bnBkL3BabFQ2SW42ZTJyRSt0Um9hSlxuZGN2NGZwdEMvcWJRdEU4Nm5hMnpMUDY2RkpaNG5MeXFkZlJvLzZjRGJpVHJwYkFzT0dveWFjenpsQ0s5RTVKcFxubVVmVENTUG0vYmwzSTdXc09LdFFQRXlYQU54aWNhRWFmdjhLUkRSVEc5dFBLQzRDam5sUGtHWFd6aWRvRTBkY1xucVo2RE9XK1d4RjVEUVRwekN5V1QvTXdGaWJLcXIxSENiR2xsd0ZGdVNtUVlBTzNXcUZQb2I2T3IwaTJNQmRCcFxuYTN0b0NXeEc2K0hqNzNzdmhWQUh0N2JuUWwyWUpaQUJIdkFlV3p6UXB1N2ZIK01DTEwwN3NaR3pScGR3K0xIT1xuQ3J1SUxpKytBckRHWHRYMjVuVGNTcEt1dWYzcVBqZitHNGM5aXJJNldGUHBzNmt0MTlYSmJEbUxZMGthWWdOMlxuWWFPTS93RXlVTjZTZzdpRlhuNlRzaWMxZ0RwK0x4Y1FBUStaTTVzdGY2aExqeHVKVlZQNk1qMFJRbHlJY3BIRlxucVIzMnBZYU9lbFd4cVlRU1FZeC9RdWJrVkpIekNNRFZCaEdhYi9kaVdsOUlOTkM0K3hoSDFMOFMrM3g4L0JvRVxuZzFKN3hwN29EN01rdGtqcFo3WmIrd0R0N01OSEUrQ215VkJodlBXM25FMmM5RjZOcGo3WU11VGQyOG94NE41VFxudmNrT2psVzRndVVCeUh3YkJBZGRZWWZJbTRHZ252T01xUFd6UlFJREFRQUJvMU13VVRBZEJnTlZIUTRFRmdRVVxuYyswU3A4aWRhVEN0T0YrNFZxNFdjRXV2eW5Rd0h3WURWUjBqQkJnd0ZvQVVjKzBTcDhpZGFUQ3RPRis0VnE0V1xuY0V1dnluUXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFGNXkzUmhGZlxuSVVJZjk2M0wvZmplV1RGWUgwMEVQMmF1dEVXeTRNajhtMGwwZUNEbXJnVHRTampqQk93WS9RVUs1NXc0YlM4SFxub1ZleU15MmFCc0hnRzZualNjU1d5TE44TEo2cEVOU1k1QkZMb3FoQ1NJdjMxaUd1c0VjcGNINnl1c0JTc2NYN1xub3hXM3QzOFM1VnYwTUVGdjBWdlVyc0o0eUVTV3FQUENpUmoveVVLRWlISGxzWVduckgyZTEwM2tPVE44cS9NVlxubzd3eTRhTUExVnhGcXg4MTd2SHVyVEpUNkRpYjdhOHRHZmtYcnR0S2Z4QkJTVGdvT2Rjb21veFlqd3F1eHAxK1xuaTNxNUZ2QWtNUFRxTUhRdEE0WndiSkUwU0VmL2piTklUbUEveEx4YzkzZXFIdy92ZU1Bemk1OGQ1Z20zRWxiNlxuN1BiWEJ4QkQvSVZHbmxkbzFhajVhT1JMTmhYUm1FQ0pFdmorUE5DenU0bFVhekFXSGxZQnFpRk0wY3Fhd3RuWVxuVy94azVwOUo4ekdFaFRQUmtQVFl2QWxITmJiY1h4RnVqbmI4eGZnZEVGMEtvbllOZ2ptejRtWnNVVkIyVVYvUFxuZ3phMFY2WkxqZzA2dFNmQ2dwYXBQbDNmaCtZZS82R2k5dVNJZnlEQk42eERhQmJzS3B3K3VId3hHVUtxbEJXbVxudWJKbjBVZ1pXZXYyN0pzTHZneVhITnFRcVhoL2xCUHMvTTFCNlE0MVRxc3pOMkpqTjROVzlSTldsb3NOUkNtVVxuWmtlZHdtRTBSZDJ3RFFyb3BEbzNqdG00cnlMcUhMd0pVcWkxU0hzTWdCNHF0N0o2YWkrb3FGZ05SWVF4dXlFQlxuajQxYWZxTjc2bEZ1Zk9pSnk4UFB4Ly9ZMkV4alpsK3dHVHc9XG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIn1dLCAic2VydmVycyI6IFt7ImJhc2VfdXJpIjogImh0dHBzOi8vc2NpbS5jaXJydXNzdXJmZXIuY29tLyIsICJuYW1lIjogInRlc3RzZXJ2ZXIuaXRpbmZvcm1hLnNlIiwgInBpbnMiOiBbeyJuYW1lIjogInNoYTI1NiIsICJ2YWx1ZSI6ICJyUzBtR0U4dVoxZUl5NVMxaWN6TWVoamxhcmJkVDZEWWl1RHgrR3RxTDFNPSJ9XX1dfSwgeyJlbnRpdHlfaWQiOiAic2NpbS50ZXN0c2VydmVyLmNpcnJ1c3N1cmZlci5jb20iLCAiaXNzdWVycyI6IFt7Ing1MDljZXJ0aWZpY2F0ZSI6ICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbk1JSUZlVENDQkdHZ0F3SUJBZ0lTQktKbUNRWTEyQ2plN1krOVYxSDR4c251TUEwR0NTcUdTSWIzRFFFQkN3VUFcbk1Fb3hDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxTVpYUW5jeUJGYm1OeWVYQjBNU013SVFZRFZRUURcbkV4cE1aWFFuY3lCRmJtTnllWEIwSUVGMWRHaHZjbWwwZVNCWU16QWVGdzB4T0RFeU1URXhPVEF3TlRKYUZ3MHhcbk9UQXpNVEV4T1RBd05USmFNQ0F4SGpBY0JnTlZCQU1URlhOamFXMHVZMmx5Y25WemMzVnlabVZ5TG1OdmJUQ0NcbkFTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTFp1YVEzaWVYdWxCY1QyWHJlNUFsWnRcbi9na2VVa3dUMFA5cjNGdzFxYTdKVmVUN1hyNTU4RlJqT0pPT285SFhEcWJvb24waURzK1lPV2M0eGk0MnVHY2dcbmQyRVJFYTc1ZklBZEcyRzJYR0Z5U0pWamN1WVkwdlU4OVpyeFNkbE9QcnZXdU9TZmNrcHZsZlltZUZaQ3pmMWJcbmNucUIyMW5pTEJ6aDhWSmlWWUF5REpLRDQxMTU4VVh3MVFhZVg2YkgweEZYd0NYYnIyOFFCM2pyKzRNL2ZYSDVcbmo4NzZYODA0YzdUdEdac0VpQmdDRThxMVZqcVVuNGhXT09lT3FOYXhxUllTUlN1ZDlwaDFLSDZ1NGpGN0hGTFpcbmh4OUROQmpUMU5rYlEwSURCemZqemdVdkFWaU5kK2dNOWplOGtmK3VPMzBRMGVSWlVSUThEdklvM2ZtL0dWMENcbkF3RUFBYU9DQW9Fd2dnSjlNQTRHQTFVZER3RUIvd1FFQXdJRm9EQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RcbkFRWUlLd1lCQlFVSEF3SXdEQVlEVlIwVEFRSC9CQUl3QURBZEJnTlZIUTRFRmdRVW9HbHNPU2JSaFN2SUlLRW1cbnF3MTZzZFpWZDl3d0h3WURWUjBqQkJnd0ZvQVVxRXBxWXdSOTNicm0wVG0zcGtWbDcvT283S0V3YndZSUt3WUJcbkJRVUhBUUVFWXpCaE1DNEdDQ3NHQVFVRkJ6QUJoaUpvZEhSd09pOHZiMk56Y0M1cGJuUXRlRE11YkdWMGMyVnVcblkzSjVjSFF1YjNKbk1DOEdDQ3NHQVFVRkJ6QUNoaU5vZEhSd09pOHZZMlZ5ZEM1cGJuUXRlRE11YkdWMGMyVnVcblkzSjVjSFF1YjNKbkx6QTJCZ05WSFJFRUx6QXRnaFZ6WTJsdExtTnBjbkoxYzNOMWNtWmxjaTVqYjIyQ0ZIZDNcbmR5NWphWEp5ZFhOemRYSm1aWEl1WTI5dE1Fd0dBMVVkSUFSRk1FTXdDQVlHWjRFTUFRSUJNRGNHQ3lzR0FRUUJcbmd0OFRBUUVCTUNnd0pnWUlLd1lCQlFVSEFnRVdHbWgwZEhBNkx5OWpjSE11YkdWMGMyVnVZM0o1Y0hRdWIzSm5cbk1JSUJCUVlLS3dZQkJBSFdlUUlFQWdTQjlnU0I4d0R4QUhZQVZZSFV3aGFRTmdGSzZndWJWenhUOE1Ea09IaHdcbkpRZ1hMNk9xSFFjVDB3d0FBQUZubnR1ZkNRQUFCQU1BUnpCRkFpQXlpSmVmTVJORmlNYnlRdi9kRzRNWCtvTXZcblV5NXVocTM3Qlo1TERWQmZkQUloQUxONXlDcUdBUGlYcFQ1R3BJQVRPQlVqb21Kd1kwZmZUTXA4WURpUzdDb0FcbkFIY0FZL0xiemVnN3pDelBDM0tFSjFkck02U05ZWGVQdlhXbU9MSEhhRlJMMkkwQUFBRm5udHVnRndBQUJBTUFcblNEQkdBaUVBODZCWHY5VkNJektYSngxL2NDV3FuZEEwYjlMQ1VnRTBYUzFIeU9YL1hMQUNJUURTYXBtRjByR2RcbmVCdWhQZkVVekMxVVg2bjFNQnpXdmZnQ0x0Q0h1a0o2TXpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVhVTS9cbmFuNUw2LzZaZ2t6T2ZLQ3Q1VFNDdGJzZ0JlcTRFVEVITmVvS08wZHlZQzdNUFNnTTdPMGwxMGd6ZFBqcjB0VGJcbjRwY2puM1F6RnQzN1ZLMzZIZmhiSWtXaVJzcDJTN05Kb1ZHTnQwdjc4V2VlbnphcVZ0U1o0a05iTy8yZlFRVjdcbjFtWUtyNmt5OXd2bld2OWdDNGhlTURhcTMzSVNHdGxOczBIS0l1MmJhSWVYRUxuYVFOMDN2N1YwUWs2VkJSZU1cbnRWdTZucFpqRFdLZzF6N1ppcUp2cWREeUJ3MnJ6MlBBd0N2azdycUdPYUs3b0FvU1ExM2F3Wk1sc09yODZmN3JcbnNVYkdCVkVFYmx1L0gwQXVUSWt0WHhwcmpmSUYwdDIwbkdpdGZYWnowTkgxNTJTdVhMQVBEVXU0ZWxoLzZ4K0lcbkx4TDJGdFRrSzBVdW1rWXhYUT09XG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIn1dLCAic2VydmVycyI6IFt7ImJhc2VfdXJpIjogImh0dHBzOi8vc2NpbS5jaXJydXNzdXJmZXIuY29tLyIsICJuYW1lIjogInNjaW0uY2lycnVzc3VyZmVyLmNvbSIsICJwaW5zIjogW3sibmFtZSI6ICJzaGEyNTYiLCAidmFsdWUiOiAiakFMRFhha1NWM0dmU0VGK2NYa1ljSTMxRm11YU0rNTJ2bmdEeHE1SnB3WT0ifV19XX0sIHsiY2xpZW50cyI6IFt7Im5hbWUiOiAic2NpbS50ZXN0LnNrb2xzeW5rLnNlIiwgInBpbnMiOiBbeyJuYW1lIjogInNoYTI1NiIsICJ2YWx1ZSI6ICJkVGJweFJzeTJUM29QdG84OUNkUkMxVDVrTTZodkFsL2ZXSzNjL1JNV0dBPSJ9XX1dLCAiZW50aXR5X2lkIjogInNjaW0udGVzdC5za29sc3luay5zZSIsICJpc3N1ZXJzIjogW3sieDUwOWNlcnRpZmljYXRlIjogIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJRlRqQ0NCRGFnQXdJQkFnSVNBODh2amZ5Qzl0YXkxS24vQWVxTGF3SUtNQTBHQ1NxR1NJYjNEUUVCQ3dVQVxuTUVveEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFNWlhRbmN5QkZibU55ZVhCME1TTXdJUVlEVlFRRFxuRXhwTVpYUW5jeUJGYm1OeWVYQjBJRUYxZEdodmNtbDBlU0JZTXpBZUZ3MHhPREV5TVRneE1qRTNNVGRhRncweFxuT1RBek1UZ3hNakUzTVRkYU1CWXhGREFTQmdOVkJBTVRDM05yYjJ4emVXNXJMbk5sTUlJQklqQU5CZ2txaGtpR1xuOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTZYSE1GSjVkckp2VVc5Z09ZRnV4cDJLMjI5a3RqTjg2Q25CNlxuN0NGd1VYODBITFVZN25obE9LS1JZdjBIUjgzaDVyc3RaQ05UUEZ3TVZIT3hsM1dmUDdKNTZqMno1NVBMU1JkclxuRjNqVWFNdC9HUnBXY3lyQjhaV1h4Qk1MRkFVSTdBcnZIalJ4SE9yeWJ2M29sK3ZBamVReHJvcm5vK05Vb2pmMVxuMm9Yc3NHZ1BNTVNzRk05eU14Qm9QM1NNVWlrSnVxSFhhbU9MT1dxY25obHA5NXMydGYzOUZ2NUtBQVZ2SEtLdlxuNTI4dG5BODJsUkUwWlBkMTEwa3J5NHZvNVo2VTlBTjFKcm5FQ1NnaEZlT0RDdU9RVHhoaXlYYnBjakVudlZONlxuRGJ0QzBhV0lxVTQvSW5hSTJ2cTBHMTJlNFM3UldQWml6VlpZZFlpRUpXWFFaMktCTlFJREFRQUJvNElDWURDQ1xuQWx3d0RnWURWUjBQQVFIL0JBUURBZ1dnTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjRFxuQWpBTUJnTlZIUk1CQWY4RUFqQUFNQjBHQTFVZERnUVdCQlF3a2h2WmFnUlpabTBIM1hyYitaMHVMSnVycHpBZlxuQmdOVkhTTUVHREFXZ0JTb1NtcGpCSDNkdXViUk9iZW1SV1h2ODZqc29UQnZCZ2dyQmdFRkJRY0JBUVJqTUdFd1xuTGdZSUt3WUJCUVVITUFHR0ltaDBkSEE2THk5dlkzTndMbWx1ZEMxNE15NXNaWFJ6Wlc1amNubHdkQzV2Y21jd1xuTHdZSUt3WUJCUVVITUFLR0kyaDBkSEE2THk5alpYSjBMbWx1ZEMxNE15NXNaWFJ6Wlc1amNubHdkQzV2Y21jdlxuTUJZR0ExVWRFUVFQTUEyQ0MzTnJiMnh6ZVc1ckxuTmxNRXdHQTFVZElBUkZNRU13Q0FZR1o0RU1BUUlCTURjR1xuQ3lzR0FRUUJndDhUQVFFQk1DZ3dKZ1lJS3dZQkJRVUhBZ0VXR21oMGRIQTZMeTlqY0hNdWJHVjBjMlZ1WTNKNVxuY0hRdWIzSm5NSUlCQkFZS0t3WUJCQUhXZVFJRUFnU0I5UVNCOGdEd0FIWUFkSDdhZ3pHdE14Q1JJWnpPSlU5Q1xuY01LLy9WNUNJQWpHTnpWNTVoQjd6RllBQUFGbndYYW01UUFBQkFNQVJ6QkZBaUVBdituNHJpOTNxTVlLWm81SVxubi96VFVFTG1HUjRDTXdpblhaQ2RxMGhDenJnQ0lBa2thaEpXYXg1a0h1bzNXcXlOOTZFZ09Ld1htSVN1djNUa1xuWW5zRnZGYUdBSFlBS1R4UmxsVElPV1c2cWxEOFdBZlV0MisvV0hvcGN0eWt3d3owNVVWSDlIZ0FBQUZud1hhblxuS3dBQUJBTUFSekJGQWlFQTIxSXBuT0VGU3BqWURpYUpBREpoM0wrTnVpQkZDbGFLSlMvblowRUZTSzRDSUFxY1xuTllSVUZ2UWxhTzR6U3RlOTBrdHUyaVZUUGtlU3FESlFScGNyOEt2bU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQlxuQVFCbCs1bVpJMGhYd0g3ajBkRGxINjZ3Uk5GaUhTMXduNURqeDkyUXdBcXFuWTBDUGxTQ2FPRlBQTC9KMWJBRFxuZ3hYdWV3S1Iwa3NoYnJUbkhmbUFaUjN0RVBET3ZsdU41aWNZTnhsZUo0cHZkL0ZUREJKQ25JejZBRkcwS05oNlxuN2tnRVE4NmxRWi9HaW83aWtLMTF0VWZzQkpnS0JkYXlXT2dSNXpaVStWaUd0OUJwd1RJc2Myc3dnTzR5bU0zSFxuOVUrcE9XVDBSQUV6aFhmbjVENGdoNk1PaVIwSFJUdE5MU25LWXNnVUQyc3FmTEc1SVhqbWUxc2dweUhJS0JHS1xuaFExa3NCMkpneFlOSlBJNTRzdnBWMTlaOHA2ZTYrNHV5Qm4vM0hmbkNpeG5CZmU2amZkdS9rTUE2bzVpdlBUSFxuQnZubitmckprVmRwUU9sSHc5dXJBdFNqXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIn1dfSwgeyJjbGllbnRzIjogW3sibmFtZSI6ICJub21wLXRlc3RjbGllbnQiLCAicGlucyI6IFt7Im5hbWUiOiAic2hhMjU2IiwgInZhbHVlIjogImMzMXhobWJMWWd0OUpxcTJ5ekJuaytBcWRwbDVFbjR3YTZnWVFPM3V4c289In1dfV0sICJlbnRpdHlfaWQiOiAibm9tcC5zZSIsICJpc3N1ZXJzIjogW3sieDUwOWNlcnRpZmljYXRlIjogIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJRGZ6Q0NBbWVnQXdJQkFnSUVMdmdicGpBTkJna3Foa2lHOXcwQkFRc0ZBREJ3TVFzd0NRWURWUVFHRXdKVFxuUlRFUU1BNEdBMVVFQ0JNSFZXNXJibTkzYmpFVE1CRUdBMVVFQnhNS1UzVnVaR0o1WW1WeVp6RVVNQklHQTFVRVxuQ2hNTFUyVnNaWE56YVdFZ1FVSXhEVEFMQmdOVkJBc1RCRTVQVFZBeEZUQVRCZ05WQkFNVERITmphVzB1Ym05dFxuY0M1elpUQWVGdzB4T0RFeU1Ua3hNakl6TlRCYUZ3MHlPREV5TVRZeE1qSXpOVEJhTUhBeEN6QUpCZ05WQkFZVFxuQWxORk1SQXdEZ1lEVlFRSUV3ZFZibXR1YjNkdU1STXdFUVlEVlFRSEV3cFRkVzVrWW5saVpYSm5NUlF3RWdZRFxuVlFRS0V3dFRaV3hsYzNOcFlTQkJRakVOTUFzR0ExVUVDeE1FVGs5TlVERVZNQk1HQTFVRUF4TU1jMk5wYlM1dVxuYjIxd0xuTmxNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWptNTNSUVF3NUpTb1xuSlEveUpmMWhIKzdSbndVVXdmWENUTk8vcElzdTV1ZXVzTWN4b2pPRVJrb2o0K1RQbGN6TjdDdllTai9PQjV2T1xuUFR4WXpkd2xmUVovQlpLVm5UcFNrR1BiR3lsM2U1SnRyYkg2eElGTXlnOCtiKzJSaHBUMEVlN3ZwT09VZUp5YlxuSjdWSG8wVFhDNlJMQ0d1VXREbHZVRFM4dTNNQkZhZVA1a3lSZG9ZTkVjSXllU0EzQ0ppSm5KR3BKS1VMbVhTMFxuUStnT1Z1MytUeFM4VEUxeFpVNEczUUYza1BRZzBpOGFQaXNyQjZjc0RnbjNocTJSMzhsSTZMeG9TTWt2SGRYNlxuSE5GSFQzNi8yQUlOZ0tBWmNXNmI1eEZTUEhvSVE5WnJhK3kvNmlVWlF1QlRqOWxoYUtjZGIvUTRtK1ZkWnVCNVxueWNZRUF0RlJBd0lEQVFBQm95RXdIekFkQmdOVkhRNEVGZ1FVb2RXMmQ5eFU4WUd1QmNMTGRhSDU3L01Xc1NVd1xuRFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUdjTlpHS1hxZGxHNnZjc2tVUitNYWU4TkNDalNPWXgrY2EyK0xBZVxuSk1YTGtBUnY5WTZlVVljcnczZ2hST1dVQm9zM0k3QU96VmdSK1dLUjJibUZ6QVlUWjVrelZjTVhwOFdpdjYwdVxueG0yd0JyaVZ6RVZYaGloa0hXWm01a1h4N2YwLzdBT3Z2YnZCUExTN0FocGc5bjAvSUUwenJvcXJsNk9ZN1B0T1xuOHVaRkJoZ0RxQTJ1cmUrL3N4NURJc3FReWZEc2RHRjhCMnc4WDF4MkQ4YlFGZjJxcGZVUUt2SytNaWV4V0tkSlxuNElreDFKdUxyeHRXeUQ0UlJsVHlGTWlaRXZJclFUMFFhN2RIcFVlOGRCa2EwakNoc0xnY2VHT2JjWmlYOFA3T1xuY01JTm5kb3RIRmRVMXBWalljbSsrZWVnN2VNMnVJaHV1K3ZQdzhHYW9qNTdUc0E9XG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIn0sIHsieDUwOWNlcnRpZmljYXRlIjogIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJRGV6Q0NBbU9nQXdJQkFnSUVYdWpBMlRBTkJna3Foa2lHOXcwQkFRc0ZBREJ1TVFzd0NRWURWUVFHRXdKVFxuUlRFUU1BNEdBMVVFQ0JNSFZXNXJibTkzYmpFVE1CRUdBMVVFQnhNS1UzVnVaR0o1WW1WeVp6RVVNQklHQTFVRVxuQ2hNTFUyVnNaWE56YVdFZ1FVSXhEVEFMQmdOVkJBc1RCRTVQVFZBeEV6QVJCZ05WQkFNVENtNXZiWEJqYkdsbFxuYm5Rd0hoY05NVGd4TWpFNU1USXlORFEzV2hjTk1Ua3dNekU1TVRJeU5EUTNXakJ1TVFzd0NRWURWUVFHRXdKVFxuUlRFUU1BNEdBMVVFQ0JNSFZXNXJibTkzYmpFVE1CRUdBMVVFQnhNS1UzVnVaR0o1WW1WeVp6RVVNQklHQTFVRVxuQ2hNTFUyVnNaWE56YVdFZ1FVSXhEVEFMQmdOVkJBc1RCRTVQVFZBeEV6QVJCZ05WQkFNVENtNXZiWEJqYkdsbFxuYm5Rd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNGTkFxZExsNzZiS2VqZHFQc1xuVVErc2tQRDJVU2lXZitnbEhuQnhiSXMvTXczaVhkamxLc1Y2eWtEanppSzRtaUVZQTZEWGhTakQ2REMxMXgzYlxuWFRnVjd5L3hvczNFMi84ejlNYTRwaXFUdWV0azhxcUsvRWpKNktVRllvYkVOMmRPUHBYdkVqN1ozSEJKQUpLM1xueHMvd1llSEJxM3kza0NkOFc2ZytENUxXbVZjQ1puNlJNTEFobGFXY2ttWGRDREQyQU1jbVdlNDlGc0FiaVF5Q1xuOUpDajlISlI5TlRPL2MxUktZVXk4b0hJS0I4c0U0MFo0NkwvRFQ2c3lNemNoNVQxWUVNc3JKSDFBREUwZ2d0K1xuOHlqaHdMQXRlV0xHT2FBcWcrYkFDN1dYTFRPbTJGOE1XTFV3T0pILytyNnN2VGRmamJvU2dYSTBjSDJjY003TVxuVEs1SkFnTUJBQUdqSVRBZk1CMEdBMVVkRGdRV0JCUTNUTGFsNlZ1YmxEcFh1QVFDZXFzQ0lEWmhOakFOQmdrcVxuaGtpRzl3MEJBUXNGQUFPQ0FRRUFGV2tmNFVNQjRuek04WWlIaHNOSU5nZGx2c29lMDR3Z1U3NTh4amR1aWZ6RVxucXBHS0JKRHFqYjNocHIwbkw2RUdSQXhDMkpxbXNsc3ZUZEdReUFOcnhvazhsbHl1bk1KVUV6bzdYZkNlblRBblxuc2g0aFVBWWloV0tQcHN3b3hxNjdCNk5NRHdSRHBaSW5qakJMSkd2U0FoNGJpZUQxaWx1aldBc3ZvK2JwOXNuaFxuTEdxeWcwYmVjNUd3SlBXbHJpdjVVM0lVVTNlZzlqekJoSWRiZm1kdlJJUFlVY3RiTzR3T2hxY3NMS3pNTWFCZVxud3BQNU9tZWxZOFlyMVQzOWJaZ2Q3SENGSmZIalBtcitaUnc1NkJuK3ErWWpOUkc2VG1rTWdpYlVBbVh4NWNjUlxuQTBEWExRZ3pmdWdtYVFndjB0ZWpOTWRtNk16N0lncUZQcllLbU9CdHd3PT1cbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0ifV0sICJzZXJ2ZXJzIjogW3siYmFzZV91cmkiOiAiaHR0cHM6Ly9zY2ltLm5vbXAuc2Uvc2NpbS92MiIsICJuYW1lIjogInNjaW0ubm9tcC5zZSIsICJwaW5zIjogW3sibmFtZSI6ICJzaGEyNTYiLCAidmFsdWUiOiAicXRpSFFuZktwOHZuK1pOQVBUVTlSSm1nQ1UzZmJKbk1QTjlUd0pwMUdTcz0ifV19XX1dfQ\"}";

    private static ObjectMapper mapper = new ObjectMapper();

    @Test
    public void parse() throws Exception {
        JWSObject jwsObject = parseJSONSerialization(METADATA);
        JWKSet publicKeys = JWKSet.load(new ByteArrayInputStream(KEYS.getBytes()));
        ECKey metadataKey = (ECKey) publicKeys.getKeyByKeyId(KEY_ID);
        ECDSAVerifier jwsVerifier = new ECDSAVerifier(metadataKey);
        Assert.assertTrue("Verification failed", jwsVerifier.verify(jwsObject.getHeader(), jwsObject.getSigningInput(), jwsObject.getSignature()));
    }


    /**
     * Utility to convert JSON serialization to compact, as nimbus-jose-jwt doesnt seem to support it.
     *
     * @param json
     * @return
     */
    static JWSObject parseJSONSerialization(String json) {
        try {
            JsonNode root = mapper.readTree(json);
            JsonNode payload = root.get("payload");
            JsonNode signatures = root.get("signatures");
            JsonNode signature = signatures.get(0);
            String protectedString = signature.get("protected").asText();
            String signaturePart = signature.get("signature").asText();
            return JWSObject.parse(protectedString + "." + payload + "." + signaturePart);
        } catch (Exception e) {
            throw new RuntimeException("Could not parse jws json");
        }
    }

}

Comments (2)

  1. Log in to comment