如何从multipart/form-data请求中提取二进制数据?(Python)(由AWS API Gateway编码的multipart请求base64)

vcudknz3  于 2023-04-22  发布在  Python
关注(0)|答案(2)|浏览(282)

我的python 3 lambda函数从API网关接收以下事件(主体是base64编码的):

event = {"resource":"/upload","path":"/upload","httpMethod":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","content-type":"multipart/form-data; boundary=----WebKitFormBoundary1Amo2IuBc9PdBoS0","Host":"txx5ugl783.execute-api.ap-south-1.amazonaws.com","origin":"http://127.0.0.1:5500","referer":"http://127.0.0.1:5500/index.html","sec-fetch-dest":"empty","sec-fetch-mode":"cors","sec-fetch-site":"cross-site","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.58","X-Amzn-Trace-Id":"Root=1-5f367cec-1d96a95fdd51ba8831fb718e","X-Forwarded-For":"223.226.79.62","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},"multiValueHeaders":{"accept":["*/*"],"accept-encoding":["gzip, deflate, br"],"accept-language":["en-US,en;q=0.9"],"content-type":["multipart/form-data; boundary=----WebKitFormBoundary1Amo2IuBc9PdBoS0"],"Host":["txx5ugl783.execute-api.ap-south-1.amazonaws.com"],"origin":["http://127.0.0.1:5500"],"referer":["http://127.0.0.1:5500/index.html"],"sec-fetch-dest":["empty"],"sec-fetch-mode":["cors"],"sec-fetch-site":["cross-site"],"User-Agent":["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.58"],"X-Amzn-Trace-Id":["Root=1-5f367cec-1d96a95fdd51ba8831fb718e"],"X-Forwarded-For":["223.226.79.62"],"X-Forwarded-Port":["443"],"X-Forwarded-Proto":["https"]},"queryStringParameters":None,"multiValueQueryStringParameters":None,"pathParameters":None,"stageVariables":None,"requestContext":{"resourceId":"fdi0bs","resourcePath":"/upload","httpMethod":"POST","extendedRequestId":"RQh06FwxBcwFuyw=","requestTime":"14/Aug/2020:12:00:44 +0000","path":"/test/upload","accountId":"981394008632","protocol":"HTTP/1.1","stage":"test","domainPrefix":"txx5ugl783","requestTimeEpoch":1597406444179,"requestId":"7060c4c5-de34-494a-9abd-3de8ae9bc624","identity":{"cognitoIdentityPoolId":None,"accountId":None,"cognitoIdentityId":None,"caller":None,"sourceIp":"223.226.79.62","principalOrgId":None,"accessKey":None,"cognitoAuthenticationType":None,"cognitoAuthenticationProvider":None,"userArn":None,"userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.58","user":None},"domainName":"txx5ugl783.execute-api.ap-south-1.amazonaws.com","apiId":"txx5ugl783"},"body":"LS0tLS0tV2ViS2l0Rm9ybUJvdW5kYXJ5MUFtbzJJdUJjOVBkQm9TMA0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJ1cGxvYWRfZmlsZXBhdGgiOyBmaWxlbmFtZT0iaW1nMDAxICgzKS5qcGciDQpDb250ZW50LVR5cGU6IGltYWdlL2pwZWcNCg0K/9j/4AAQSkZJRgABAQEBLAEsAAD/4RyyRXhpZgAATU0AKgAAAAgABgALAAIAAAAmAAAIYgESAAMAAAABAAEAAAExAAIAAAAmAAAIiAEyAAIAAAAUAAAIrodpAAQAAAABAAAIwuocAAcAAAgMAAAAVgAAEUYc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFdpbmRvd3MgUGhvdG8gRWRpdG9yIDEwLjAuMTAwMTEuMTYzODQAV2luZG93cyBQaG90byBFZGl0b3IgMTAuMC4xMDAxMS4xNjM4NAAyMDIwOjA0OjA5IDE2OjQ0OjMwAAAGkAMAAgAAABQAABEckAQAAgAAABQAABEwkpEAAgAAAAMwMAAAkpIAAgAAAAMwMAAAoAEAAwAAAAEAAQAA6hwABwAACAwAAAkQAAAAABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAyMDowNDowOSAxNjo0MTo1OAAyMDIwOjA0OjA5IDE2OjQxOjU4AAAAAAYBAwADAAAAAQAGAAABGgAFAAAAAQAAEZQBGwAFAAAAAQAAEZwBKAADAAAAAQACAAACAQAEAAAAAQAAEaQCAgAEAAAAAQAACwUAAAAAAAAAYAAAAAEAAABgAAAAAf/Y/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAKwEAAwEhAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A96uLiG1t5Li4lSKGNS7ySMFVVHJJJ6AVxFx8XfCsE6qsl9NbkZN3FZSNCOcfexyMg8gEcUAdnYahaapYxXtjcxXNtKMpLE2Vbt/OrNABRQAUUAFFAHF+KNd1XQvG3hoefH/YmoSmylhCDf57fcYsQfl9hjnqTkCu0oAinuoLUI1xPHErusaGRgu5mOAoz1JPQVLQAUUAFFABRQBwHxG+I8vgd7OC30g3k110kll8mGPnHLkYz+IxwTVjT/G2pw6np1p4h0VbKHUisVtdQzeYnnlcmJh26HDDIOO3YA7eigCrf6nY6XbG5v723tYF6yTyhFH4k1jJ498JSBiniPTGVTgsLlcD8c4oA3re5gu4I57aaOaGRQySRsGVgehBHUVxPxS8Vav4W0Wwk0gWscl5epavdXX+rtwwPzHt26ngYoAh8P3+u6H4i0XSNe1sau+s2ssyuIkQRSRqrHaVAypDH8s+1d9NNHbwvNNIsccalndjgKB1JPpQBxt7431eSOSbQPB+panax8m6d0gSRcZ3Rqx3SD0wOe1a2heJv7UumsL2xl0/UkiExt5OQyHHzI3GQCQDkAg8YoA5zV4JPGvxAm8PTvjQdFiiuL2FQR9ouXy0at/eRVAbHqRnPbtLnR9NvLOS1ubKCWCWLyXR0BDJ/d+ntQB538LLKPQfF/jXw3ZNcf2ZY3ED28cz58verEge3Tn0Ar1KgAooAKKACigDzX40u9r4a0fUIn2y2WtW06cZyRuGP1z+FekjpQB5Z8f7eST4dx3MUjo1pfRS5UkdmX+bCvQPDk9xc+HLCa5YvM8KlnZSC/oxBAwSOce9AGpRQAmR60ZHqKAFooAZJFHLG0cqK8bAqysMgg9QRXnPia5bxd470Tw7pQEkGi30epancL9yFkz5cWf7x5yO34HAB6TXnfxfudSm8OWPh3R5BHf67eLZhixUCPBL5I5A4APXgmgCx4S+GOh6Po1kuq2MWp6lHAI5J739+Fx/DGr5CqO2AOK6S58K6DdQrHJpNmAhBRkhVWQjGCCBx0H5UAeaaNoOsfDT4ix29vdz3PhfWJQCHiXCzsSADt4VuhyAAwJGPl49flijmiaOVFkjcbWVwCCD2I9KAOB8L/8AFV/EHU/FYKyaXYRnTNMJXIdgczSrnpz8oYdRkVZ+J9idU0bTNOlLiyutUghugjld6EnAJHbOM8+lAHbxoscSoudqgAZOT+dc/wCKLVA+lanG2y7s76FY27lJXWORce6nP4UAc/4VurbQ/H3i3SdQlEV3eXa6hbSzuB9ohdAMJnqEKke34V1+tapa6fp0jy6hFaO4xG5Adif9lP4j6CgDzH4cw6h4f+KOt6bqMs8r6zYJqavduPO+WQoA2ABnDMcDoAB2r2GgDmfGPjvRPA1pBcaxLKDcMVhihTc74xkgcDAyM5PequneOLvWrJbnS/CWtOjqrxtdCK3VwfQlz29uaANGDUfE0x+bw/ZQDg/vdSPHr92I8j/JrRtZNTJ/0uC0XP8AzymY4/NRmgC8OlFAHm3xwjlb4e+ZEkjtDfW77UGSfmx/MitnS77xprVm002n2OhrIT5Szlp5lQ4wSoIAbHYng9RQBznxR8OTt8NdYudS1i9v54IleNTtiiUh1OdiAAnry2a7/wANT/avC2k3Gd3m2cL5z1ygNAGpXmmjfBvRbO/uL7WLi51e/lneVbqaRlIVv4Su7B6nnvntQB01p4A8L2UnmRaPAz9jKTJj6BiQPwrZXSdNQoUsLVTGcoRCo2nrkccUAXKKAPP9e8T6j4h1afwp4PYfaIzs1PVv+WdgD1Vf70vXgdD7g7el8LeFdN8I6Oun6cjHJ3zTyHMk7nq7nuaANuuA+Ju3TZfDPiZ1Yw6TqifaGA4jhlBR3P0O2gDvIpEmiSWN1eN1DKynIIPQg1DfajZ6bbm4vrqG2hBxvmcKPpz3oA5e3eXxjrVlqCRzQ6Jp8hlhMiFDdzchXAPOwAkg8ZJqH4q+Ip/Dnga4ktWMd1eSLZxTYJEJfOXOORhQxB9cUAL4W8Q+CtF8N6fpmneItNNtbRiJGe4VWZu5IJzktk4962tQXSfFmj3FhDqEMqyqGWS2lVmjYHKuMHqCAaAKGn63runRCz1zRbq6niBAvdPQPHOAThtucqSMZGOv4VMbS78R6hYXV9YGzsbOUXMUUxHnPKAQpO04UAE8Z570AaWs+HdI8Q2y2+r6fBeRqcqJUyVPseo/CodL8JaBokvm6bpNpbygYEiRjcB06nmgDjNe/d/H7wmygZl065jfBwSAHIz6jNemUAZeseHNH8QfZxq2nW94Ld/MiEybgrVft7eO1t44ItwjjUKoZixwBgcnmgCWigAooAQjNL0oA5v4gWZv/h94gtlXczWErKPUqpI/UVB8M7tr34aeHpm6iySP/vgbf/ZaAOrooAKKACormE3FrNCJXhMiFBJHjcmRjIzkZFAHm2h/CvVvDsCW+m+ONQt4BvLRpbR4ZmOSxBzk+5yfcDiuh/4QeSaTfe+KNfn6fLHeGFT+CYoAZ/wryzVAItc8Qow/iGpyc/rXTJp8I0xLCfddQiIQv9pPmGRcY+cn7xPcnrQBzdj8P7XSj5el63rllZjOyzjuw0Uf+6HViB+NX7XwZolvOlzLam8u05FxeuZ3z65YnH4YoA3xwMUySKOaNo5UV0YYKsMgigCmNF0tTldNs1PqIFH9KtJawRhAkMaiMkoFQDb16enU/nQBLRQAUUAedzILr9oK2V8kWfh5pYx2DNNtJ/I4/CvRKACigAooAKKACigBsiJLG0ciqyMCrKwyCD2IqK0s7XT7VLWzt4re3j4SKFAir34A4FAE9FABRQAUUAFFABRQAUUAFFABRQAUUAFFAHBxRonx3ndVwz+HgWPricCu8oAKKACigBMZP0PFLQAUUAFFABRQAUUAFFABRQAUUAFFABRQAUUAFFAH/9kA/+Ex5Gh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPjx4bXA6Q3JlYXRvclRvb2w+V2luZG93cyBQaG90byBFZGl0b3IgMTAuMC4xMDAxMS4xNjM4NDwveG1wOkNyZWF0b3JUb29sPjx4bXA6Q3JlYXRlRGF0ZT4yMDIwLTA0LTA5VDE2OjQxOjU4PC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48L3JkZjpSREY+PC94OnhtcG1ldGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\"data removed\"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","isBase64Encoded":True}

我提交了一个带有图像和json字符串的表单作为multipart/form-data POST请求。我使用以下代码在服务器端处理它:

from requests_toolbelt.multipart import decoder
content_type_header = event['headers']['content-type']
postdata = base64.b64decode(event['body']).decode('iso-8859-1')
head = []
cont = []
for part in decoder.MultipartDecoder(postdata.encode('utf-8'), content_type_header).parts:
        head.append(part.headers)
        cont.append(part.content)  # content in binary format
print("\nJSON Part:-")
print(head[1])
print(cont[1])
print("\n")
print("File Part:-")
print(head[0])
print(cont[0])
print("\n")

with open("t.jpg", 'wb') as w:
        w.write(cont[0])

输出:-

JSON Part:-
{b'Content-Disposition': b'form-data; name="upload_json_string"'}
b'{ "data": "test"}'

File Part:-
{b'Content-Disposition': b'form-data; name="upload_filepath"; filename="img001 (3).jpg"', b'Content-Type': b'image/jpeg'}
b'\xc3\xbf\xc3\x98\xc3\xbf\xc3\xa0\x00\x10JFIF\x00\x01\x01\x01\x01,\x01,\x00\x00\xc3\xbf\xc3\xa1\x1c\xc2\xb2Exif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x06\x00\x0b\x00\x02\x00\x00\x00&\x00\x00\x08b\x01\x12\x00\x03\x00\x00\x00\x01\x00\x01\x00\x00\x011\x00\x02\x00\x00\x00&\x00\x00\x08\xc2\x88\x012\x00\x02\x00\x00\x00\x14\x00\x00\x08\xc2\xae\xc2\x87i\x00\x04\x00\x00\x00\x01\x00\x00\x08\xc3\x82\xc3\xaa\x1c\x00\x07\x00\x00\x0

但是输出的t.jpg(34 kb)不可读(损坏)并且比原始文件(29 kb)大。我在哪里犯了错误?我如何正确提取上传的文件(二进制数据)?

j5fpnvbx

j5fpnvbx1#

好吧,我得到了这个问题。这是由于不同的编码和解码。我用iso-8859-1解码,但用utf-8编码,这可能会导致二进制数据的错误,但不是文本数据。此外,这个额外的解码和编码步骤是不必要的,可以删除。然后,我能够复制确切的文件。

postdata = base64.b64decode(event['body'])

decoder.MultipartDecoder(postdata, content_type_header).parts

有了这个,我们就有了javascript客户端(或任何客户端)发送的multipart/form-data请求的代码,由AWS转换为base64,并由python后端处理。干杯。

wi3ka0sx

wi3ka0sx2#

我们遇到了同样的问题和效果。问题是postdata.encode('utf-8')进行转换,并尝试转换不可打印的字节。因此,Multipart-Headers不会转换,但二进制内容会被破坏。
在我们的例子中,AWS没有进行base64转换,所以base64.b64decode(event ['body'])没有帮助。
解决方案是配置API网关集成以使用正确的contentHandling我们在openapi定义上进行集成,它看起来像这样:

/contents:
    post:
      operationId: uploadContent
      description: "Upload content"
      tags:
        - Content
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/ContentCreateCommand'
      responses:
        "201":
          description: "content uploaded"
       
      x-amazon-apigateway-integration: # API Gateway extension
        uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:NameYourFunction/invocations"
        passthroughBehavior: when_no_match
        httpMethod: "POST"
        contentHandling: "CONVERT_TO_TEXT"
        type: "aws_proxy"

关于集成的文档可以在这里找到https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-swagger-extensions-integration.html
也许这个设置可以在cdk/cloudformation或web控制台中找到
通过正确的内容处理,base64.b64decode(event ['body'])是最后剩下的和平。

相关问题