/// <summary>
        /// Preenche os dados do upload, atualmente temos 2 formas: upload e base64
        /// </summary>
        /// <param name="clientCreditAnalysisModel"></param>
        private void FillFileByte(ClientCreditAnalysisModel clientCreditAnalysisModel)
        {
            /// Verifico se o arquivo de upload foi informado
            if (clientCreditAnalysisModel.FileUploadByte == null && clientCreditAnalysisModel.FileUpload != null)
            {
                /// Caso tenha sido informado, converto uploado para byte
                clientCreditAnalysisModel.FileUploadByte = clientCreditAnalysisModel.FileUpload.ToFileBytes();
                return;
            }

            /// Verifico se o arquivo base64 foi informado
            if (!string.IsNullOrEmpty(clientCreditAnalysisModel.ImageFileUploadBase64))
            {
                /// Pego as informacoes do arquivo Base64
                var base64 = clientCreditAnalysisModel.ImageFileUploadBase64;

                /// O sistema pode aceistar um base64 de 2 formas, um apenas com o base64 e outro com todo o html, por isso, fazemos esse tratamento
                if (base64.Contains(","))
                {
                    ///Caso for um base64 com dados do html, consideramos apenas o base64
                    base64 = base64.Split(',')[1];
                }

                /// Atualizamos as informacoes do base64 tratado
                clientCreditAnalysisModel.ImageFileUploadBase64 = base64;

                /// Convertemos o base64 para byte
                clientCreditAnalysisModel.FileUploadByte = Helper.ImageBase64ToByte(clientCreditAnalysisModel.ImageFileUploadBase64);
            }
        }
        private string GetImageFileName(ClientCreditAnalysisModel clientCreditAnalysisModel, string fileName = "imageSend.jpg")
        {
            if (clientCreditAnalysisModel.FileUpload != null)
            {
                fileName = clientCreditAnalysisModel.FileUpload.FileName;
            }

            return(fileName);
        }
Exemplo n.º 3
0
        public void DoCreditAnalysisDenied(ClientCreditAnalysisModel clientCreditAnalysisModel)
        {
            var imagePathNua02 = @$ "{DataSourceFolderPath}explicitas\MulherNua02.jpeg";

            clientCreditAnalysisModel.FileUploadByte = Helper.ToFileBytes(imagePathNua02);

            var services = this.ServiceProvider.GetService <ICreditAnalysisService>();

            services.DoCreditAnalysisAsync(clientCreditAnalysisModel);

            Assert.False(services.IsValid());
        }
Exemplo n.º 4
0
        public async Task DoCreditAnalysisSuccessWithFileBase64Async(ClientCreditAnalysisModel clientCreditAnalysisModel)
        {
            var imagePath = @$ "{DataSourceFolderPath}coringa-joaquin-phoenix-01.jpg";

            clientCreditAnalysisModel.Age    = 35;
            clientCreditAnalysisModel.Gender = GenderEnum.Male;
            clientCreditAnalysisModel.ImageFileUploadBase64 = Helper.ImageToBase64(imagePath);
            clientCreditAnalysisModel.ModelType             = CreditAnalysisModelTypeEnum.Modelo02;

            var services = this.ServiceProvider.GetService <ICreditAnalysisService>();
            await services.DoCreditAnalysisAsync(clientCreditAnalysisModel);

            Assert.True(services.IsValid());
        }
Exemplo n.º 5
0
        public async Task DoCreditAnalysisDeniedBySalary(ClientCreditAnalysisModel clientCreditAnalysisModel)
        {
            var imagePath = @$ "{DataSourceFolderPath}coringa-joaquin-phoenix-01.jpg";

            clientCreditAnalysisModel.FileUploadByte = Helper.ToFileBytes(imagePath);
            clientCreditAnalysisModel.Salary         = 200;
            clientCreditAnalysisModel.Gender         = GenderEnum.Male;
            clientCreditAnalysisModel.ModelType      = CreditAnalysisModelTypeEnum.Modelo01;

            var services = this.ServiceProvider.GetService <ICreditAnalysisService>();
            await services.DoCreditAnalysisAsync(clientCreditAnalysisModel);

            Assert.False(services.IsValid());
        }
Exemplo n.º 6
0
        public async Task ClassifyPersonalDataFailMultiPeople()
        {
            var imageFace = @$ "{DataSourceFolderPath}face_varias.jpg";
            var clientCreditAnalysisModel = new ClientCreditAnalysisModel()
            {
                ImagePath = imageFace,
                Age       = 22,
                Gender    = GenderEnum.Female
            };

            var services = this.ServiceProvider.GetService <ICreditAnalysisService>();
            await services.ClassifyPersonalDataAsync(clientCreditAnalysisModel);

            Assert.True(services.IsValid());
        }
Exemplo n.º 7
0
        public async Task ClassifyPersonalDataSuccess()
        {
            var imageFace = @$ "{DataSourceFolderPath}face_unica.jpg";
            var clientCreditAnalysisModel = new ClientCreditAnalysisModel()
            {
                Age            = 22,
                Gender         = GenderEnum.Female,
                FileUploadByte = Helper.ToFileBytes(imageFace)
            };

            var services = this.ServiceProvider.GetService <ICreditAnalysisService>();
            await services.ClassifyPersonalDataAsync(clientCreditAnalysisModel);

            Assert.True(services.IsValid());
            Assert.True(clientCreditAnalysisModel.ImageFile.Length > 0);
        }
        public void DoLogOnBegin(ClientCreditAnalysisModel clientCreditAnalysisModel)
        {
            var pathLog = this.GetLogPath(clientCreditAnalysisModel);

            Directory.CreateDirectory(pathLog);

            var filePath = this.GetLogPathFile(clientCreditAnalysisModel, "ClientCreditAnalysisModel01Begin.json");

            JsonHelper.SerializeToFile(filePath, clientCreditAnalysisModel, true, true);

            var fileName = this.GetImageFileName(clientCreditAnalysisModel);

            var filePathImage = this.GetLogPathFile(clientCreditAnalysisModel, fileName);

            Helper.SaveFile(filePathImage, clientCreditAnalysisModel.FileUploadByte);
        }
 /// <summary>
 /// Faz a conversao do objeto para ToCreditAnalysisMLModel
 /// </summary>
 private CreditAnalysisMLModel ToCreditAnalysisMLModel(ClientCreditAnalysisModel clientCreditAnalysisModel)
 {
     return(new CreditAnalysisMLModel()
     {
         Casapropria = clientCreditAnalysisModel.OwnHome ? 1 : 0,
         Escolaridade = clientCreditAnalysisModel.Schooling,
         Estadocivil = clientCreditAnalysisModel.MaritalStatus,
         Etnia = clientCreditAnalysisModel.Ethnicity,
         Idade = clientCreditAnalysisModel.Age,
         Nome = clientCreditAnalysisModel.Name,
         Outrasrendas = clientCreditAnalysisModel.ExtraSalary ? 1 : 0,
         Sexo = clientCreditAnalysisModel.Gender == Model.Enums.GenderEnum.Male ? 0 : 1,
         Renda = clientCreditAnalysisModel.Salary,
         ModelType = (CreditAnalysisModelTypeEnum)clientCreditAnalysisModel.ModelType.ToInteger()
     });
 }
        public void DoLogOnEnd(ClientCreditAnalysisModel clientCreditAnalysisModel, ClassifyPersonalResultModel classifyPersonalResultModel)
        {
            var filePath = this.GetLogPathFile(clientCreditAnalysisModel, "ClientCreditAnalysisModel03End.json");

            JsonHelper.SerializeToFile(filePath, clientCreditAnalysisModel, true, true);

            var fileclassifyPersonalResultModelPath = this.GetLogPathFile(clientCreditAnalysisModel, "ClassifyPersonalResultModel.json");

            JsonHelper.SerializeToFile(fileclassifyPersonalResultModelPath, classifyPersonalResultModel, true, true);

            if (clientCreditAnalysisModel.ImageFile != null)
            {
                var fileName      = this.GetImageFileName(clientCreditAnalysisModel, "FaceLandmarksPoint.jpg");
                var filePathImage = this.GetLogPathFile(clientCreditAnalysisModel, fileName);
                Helper.SaveFile(filePathImage, clientCreditAnalysisModel.ImageFile);
            }
        }
        public async Task <List <VisionFaceResultModel> > ClassifyPersonalDataAsync(ClientCreditAnalysisModel clientCreditAnalysisModel, bool saveFaceLandmarksPointOnImage = true)
        {
            var personalDataList = await this._azureVisualRecognitionService.Classify(clientCreditAnalysisModel.FileUploadByte);

            if (personalDataList.Count == 0)
            {
                this.AddError("Não foi encontrada nenhuma pessoa na imagem, por favor envie uma foto sua.");
                return(personalDataList);
            }

            if (personalDataList.Count > 1)
            {
                this.AddError("Foi encontrada mais de uma pessoa na imagem, por favor envie apenas a sua foto.");
                return(personalDataList);
            }

            var personalData = personalDataList.FirstOrDefault();

            if (!personalData.FaceAttributes.Gender.ToLower().Equals(clientCreditAnalysisModel.Gender.ToDescription().ToLower()))
            {
                this.AddError("Genero incompativel com o informado no cadastro.");
                return(personalDataList);
            }

            if (personalData.FaceAttributes.Age > clientCreditAnalysisModel.Age + 5)
            {
                this.AddError("Idade superior incompativel com o informado no cadastro.");
                return(personalDataList);
            }

            if (personalData.FaceAttributes.Age < clientCreditAnalysisModel.Age - 5)
            {
                this.AddError("Idade inferior incompativel com o informado no cadastro.");
                return(personalDataList);
            }

            if (saveFaceLandmarksPointOnImage)
            {
                clientCreditAnalysisModel.ImageFile       = this._azureVisualRecognitionService.GetFaceLandmarksPointOnImage(personalData, clientCreditAnalysisModel.FileUploadByte, "");
                clientCreditAnalysisModel.ImageFileBase64 = Convert.ToBase64String(clientCreditAnalysisModel.ImageFile);
            }

            base.MessageSuccess = "Crédito aprovado";

            return(personalDataList);
        }
Exemplo n.º 12
0
        public async Task DoCreditAnalysisSuccessWithFileBase64FromSiteAsync(ClientCreditAnalysisModel clientCreditAnalysisModel)
        {
            var imageBase = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAFKAbgDASIAAhEBAxEB/8QAHQAAAgICAwEAAAAAAAAAAAAAAwQCBQYHAAEICf/EAEMQAAIBAgUDAwIDBgQEBAYDAAECEQADBAUSITEGQVETImEHcRQygQgjQlKRoRUWctEkYrHBFzOC4QklNXODkjRD8P/EABoBAAMBAQEBAAAAAAAAAAAAAAECAwAEBQb/xAApEQACAgICAgIDAAICAwAAAAAAAQIRITEDEiJBBBMyUWFCcQUUI1KB/9oADAMBAAIRAxEAPwDzumBt24Uw28/rRfwel/bKMN+djT3tZoInwsV0iut4fuxHzTSl2X8PRbjHERJA924A06x8804tsAAOpAB2B7GjNptMrGAR2FGvNrH5QV+eall4aBFR22KrbgrtCzXAoMWt4BkCmlW66hlAEcg80f0VRA0gvMnVQnGH5NaBGdtpCNy2/Akgdya4VdkhWIERFOoS54/tXaWbgaYCkcTQbqIEqfb2V2Gw4AAcHY86qZbDQBO/96MMKyy0bk+aOLRCa3ffjSBzSRu7SKcc6TisCK4b07g1L7aOiy2oJIpo4fXbImCOBFRt4S2EbcyeYp3TfkTfHG7jtCttzLagZ7A12g9w1jnxvTViwTPEDzTPpKVBQHbkVqishxKrFPSAUkjUo8UFrJENqBVtgKfeyO4jvBFCuW9SgBfnxTQSWjozFJx9C64YskEgKe1TUKQYcpRlVVGwg9zUzbVV1Ehie3FRcI9nNrJoW9C62wihg3f7129trrSVknuTRhoJ3Gw8CiawBsoE8UJpOnR0umqkL28MyQpJC9q41sKW2J+KZZLpiVgV2yksdO/ala7vyJdKxYtqb0wqiFB77VxnLDSNz/ajllb2ldJqKWASZkDtvQ+vX8EV9rawBs2mCtMAnsOakMKCDqB34PimtHpk6hII5Fd+42SJ0+PNdXI+ySKtoBbQJHBXz3qNywt658Efaj2rbD+Hb70b8OQZG58xXOmm7aK12jT0I4fDC08EaRU2wgumRqn+xpp7RBAc6j4o9m2CYAMD4ou2+1HLGCTcaF7eFKAjuBxQkwu/7wfberL0mVi0cCu1trdAYpGn4pYS66RV8btNFfcwcQwMH+9ESyHUhjp+1PthXMaQBNdCyS8CFPmKnNJ+tlFGCsS/DjSQpJ8V16G2pW3UbDzT5wD+pyCAN6nbwykEsCO1NlK0B08FTcw/4iJLAntRbtsIFRVnb801YDDBWKhSWI5PFct2dOrVbmf61SM1JUxYuS9lX+FBedJMeOTXBhFaQUMdpq3TDKZBtx+tROD0HuD/ANq2IqkGS9lO+FhIK6if7UL8MvpmSPsausRhrekxAPfelFw66SHI/XvQvxaF6pJJoqfwwEc7bx2qNxFdQCfb/cU3dtaGJHAPFdNGmBb78CjKDpNCyjBx6UIhCxOxftv3qNxQACfsRTly3JgDSI4oRwqKDBJI7Glqk79jNOlXoUZbejQgAXuBQktG7c0/wATv2p1MKSPU0wD2NBug2zAtSfCnkVaLqNIEn3XkLYm1bCjYbcc0C3bBPB+8VYraGIsMQNDDtSi29NwqxgAbiaPWLXisnO+NdreQK3GTUGB+9L3sOpA2kseTTVxGKkI2/eDSbgskJLOD37VGHFGLtAcbwwTWESLakwfzGNjUbqLHpLu/YkcUYteUABYHzzUvT1NqIJY8ya60/aOj/FV6Fjbs2wS0kxFcrtrAtufZJ7ajXK6IzSWTmbheS5IZDuhBn8wHNTCNdBhZP/MYing4a2oIMVwqWhfT0/NScWlnBywpq0J2cIjXTcufnH5SBtTP4fSdWzD+XijJhghhuPiiqq3DuogceajdbNlYoX9EskgBW+DUfwrK6zupq1Wyj25UFSP4YqAslSI5PeKOLMo2hFLDWnkSqnjajXOwVfd5NNegyEhiWHg0W1ZGkFkO3atWCsVTK61YZrm4JbsBxTZtFBqZC28gdhTFhD6hKjTPem/Q1gDYA71OCfbI0knrZW6PX3Ye0eKnZw2k+0SD5po2DblSp/SiGyFA0sQaFe6BiLuytVIxDAww7QNhRRhQ0tqB/wCWnvwrDaP1qJwhnWBPaBTSimgXWRVQSNToTOwgV1dsyCsAVZjD3AgUKVqF2wbSmVlj/WjFVhFoO11Kc4dolBPmTU2thxqZdLVYva9MbDTG5EVC5bNxQYWPile8loxUY28iT2UAiZPM8Vw2CTCrqI3E0VcNoc77jsTRSjapEn7VpXGDaNC9i/oFiSxM+K42GhZQjV3FN3EVUUxqPea6YAyUXStLCLcVKRnTk1Yn6eoK2nXBjbtUTaa5dMzA7U46+iSd966hgC4bntFBvrhCuNtKxUw+xABB7Gi21RmMvMcbUxatiC+kQeTXUQ4lRB7xS70WglGWUBOH1E6FBNSs2Xt7GacS3ocMsHyTRrduVl4g9xTqMkij3gWbCMzqTyB+lTRCsApv5qytWEYaVbbnep28Mdzv94opKCom3eivs2XZu8fy0e3htTgEMIq2t4UsgJEH4plMNoEjeudvywNB3gqHtRCtIPmK7sYHSxcNM9jVx+ClgxST5mirli6oLbHzTvRWSeikbBWy0wQfnvUFwpVm1J7e0Cr1sKkN4FdDBFlEbD4pYN9aJdb2Uxw7EbCR5iuvwh0htImrf0mSEncf3qDWmB2XtvNJSu0w09MqPwiyZEz4ro4Ugw4gGrH07aCAP0moXLYMAHRJ2ql4ZOm1RUX7CW3YKBBpK6EeYJVhVxibKJuxg+aQu2VkkgsO1LFFHayypvW/UaZEDkUtetem3tgjmeKtT7dQa3G21LaddvUwBPaTXRTRPxuxNgFSQVYnzUC0Lv38UyllRcbVAJ4HxUL6gABU280EuzyTt0KaDcTTBP61BrIs25OxplWVVJIMjgDvQyPYCI37TuKEsPxGXV72KvddFOpAAeCKgthG/NGr70W9aYGGJE7xFACEHUAxPhuKospNCwb9i94W7U6ZmPzChW7SemWAIY/FN6NRI0aR8d66YFFJOwA4pXe0ZS7T/hWENJ32PFSCXLQDKJPPEiKYNsKVg6bbcjvQ7zFSqA6geI8VXunsfsncUsC1y4LzDUIM9prlTaygvSgOkcsa5VFSIuk6ksmX2sM9hiZ1qe0cVL0TdulmbYVNrnohW1Eg9q7uMoUsTAPY7U0W3s81txWTsWfUGgAj7VxcvUmAfePNcGKhVKAij28Tbc+4Eng1pJJ4NGXbB2uF90KI25nmp+gqLIMkdqKt1UtwAW7A+KgLiqRDjV4NJhmbcMHf4b1boeJK7g0e2jQwKhZHHmpIdMmeB2qQxBKiNj5PNCqZVTbIYewWJPKzwNqcbBJpnTpPaopddLerkfamjfDBdoHf4oNMZTdiv4PaSZFS/CBlVVUavIFMFlfcbD7UZLiLHn4qkU2sBTsSt4VrVw6jqY9qOuGJEhR+pptlZjqIH3ArikAyQQPtUkm9mcktifoFSZB1fFBOEYBiQSTwGNWokk96HiClpCR+biO9OqvIFNN5KF0a23vEr4oKINTtEA8CaexTEhhoJH3pZAflSeRNLJpZOj7HpPAO2hu3AREDtG9Fa2CTA28CooxtvHNSF1hcMD+tJKKkrF+ymdC3CEaTv3Fdeittdjv4NGW2z7glR3BNRW2A8kf3oxWOo6nFMWuDVGpSRFDw9kqS0z20mm39Nm08nwDUAFR4CxPxQUbeSraT7EGWDA9qjnaiempUEd+9TUqRBiO5qbwq7BiD/CKm41oL5V6JWkAT3CaNatqYIAAHNdYe0BqYfljuaYtgMyjzTdm9A7PrdjOGsKYJBI7RtNODCqBup+BQLSsp0gR9+9OW2QQpYyfnapPDoaFLbOW7RTcCTGwA4o6IWILKDG5rigKmzVIsVmN57Vqxaywxfld4C6FB+ImTRQiaVmGJ8UO24upo1bjmiWrYDhgSAO5oK3llHK9EWwpiZB8RUrWF517DxTCvBOkajXJbSRP6GlqthUksMQuWkFyV3PzSjo7M3tE/IqyZAuoyAaUuoxBOoUFhkm6lSZXG0QSXEUFmg7KIncmmncAHb3z5oTopT3RFN1ehu1OiuvqHYkkRVfdBFwgj29qs8RbW5OkEsP0FK3LSenuDq+KsvWBVNxTorcRbGkkliexHf4qFqypHuEKNxJpz2hBMg8Sa69NIYnnmaq3WiN2sCDpLOVXjiaVYFgVgR3FWTMuqRv5pdiXY+3b7UU3WUMpJSK5LQT8skzULtkoRpQae7HtT7INXcfpXLqqEEbr3rNiTm3oqnYOyhSXjtXHtsViAgPM805fVQFa0FHmoALploY1OUnF0gVJK2VjBbaQXHPHNDa0jAlZI8U/dtSpdQsdwKBdsxodPzDkxvVL6i5ksFe2HGowurbaBxUQnpe4gkjue1N2EBukPJniKi4NnUrSEPasoKSxoyn19iLkC25I0p371ymksJbsPuDPYma5XNyNxdJj90vQW1mCqqgkkjy1M/wCLB4/i7QDNY2+Z6lG4M/HFSs5jbsg8b12qVaPGfZL9mRXcxJYFVITxRLOMZwWDDTOxJisXGan1gFaQf4eKO2ae6ARHxRccWho/wy18YgIOsifiu/XWZLTPBmsROasCFEsaJazdlYSdI8EcUIpMdp/5GZWMUGJKsON6dW8EALn+1YfZzG3cX84UDuNqZt5sBw2qjKNCxizK0zFXaFgRTKYwD826nxzWHWM5DuQIWOacGcAWx+9U1KWMGWzKTi0VQQPaO4oiYlW90EDtWJNnBUaC5C8xNM2c6m3DEGOKdWloClUsGUjFETJ1D4PFdjEu1v2krP8AEd6xm3mgF38xE0z/AIrsJb7UKso5KRkIxulQBDNUL13WZTk8gisfOY6mJLBt9oov+J6p98fA5o50I2r6hcXiylzjf4pY4vVqUGTztSeLxisNJII5nikUzJQjCBqAj70iirLt9XguLWIBeJJY/wBqkLxLgHYDuDVTZxmlAQu47zXb5gJBBBJ5nYVk6Y3Z+y2vYzSR7vYe9cF03FAkT81WJibZkv7gfBqbYuYEQvYeKZp7RlNSVjYurrI3DDxUrd5mY+7So8mq849Q8BQPmaj/AIgsmCCJ5regppaLW3fTSVkT5pizcMCfd8TVOMTbcNqEDs3zXYxa2yCXBbzNL1p2mKpOGy9S8FQmSo7A0e3iQB7mAPaKolzFDsdz5JoqY5ChWQD99jSNteivfFmSpiGZAdoHfvRji5EDfwaxtM007dhTC5gjKsMOZ3qcl22VU+zpGSLfOhdRIqbYkN8fJrH1zRWkFhA+a6fM1IHuZVplH9BxVGS27qjuBPem7WKkbtqHxWJDMlZBDk0axmQP5nJHellFPKDHlrBlP4kgkA+2pa5A0OAD81jS5utsgAgijf4wh4cA/FGH9J9u2y5uXo1EtuPIqvxmNAVSCSZ7VWXM1UO0vLN4pW5mdsn/AMyCOxotJATcfxLVscrW9+fFKPjhHtOozwRVXiMxVjIbT2maVuY5GIAuAnyNqak9h+xz2XP4jUjS0NQGd39xMHwKqhjArEuQK6fHrcAIOw8GhCHVk3NosXeJDNt/0qC6Rw1IfjUeR3oBvgkfvI+Kq1aGV/kixumLkhSR3FQulUtlgRq7DxVZcxhLE+74mu7eO1W9JYH4rVZpSS1saa56q7mD8cUu7SNDGPEnauJjla0Rc9rE7R4pXEXk0sZ1AUGrED3IRAsEnyaAEF6QARHfzQRiFuq25UDiajYxBCPqkKR2/wC9FtJaHVy2GuYhbdsqBPzyBXRtF0G/PcCkdZJlWlO4ptSwWQ4VfNMqayM26pYFB7GAn8p5maCXKXHdhrTstAx19bF03AwA7wOarL+aCdQB0nfiKVSa8Yomo4yWouoxBGwmQorlVH+KKGELMdztXKaPHKatoZxaxYrc6fzWN8HcY9oFL/5dzsKf/l97fjat+nDBwPUUSOADRBhx6cqoG+0UuDg+y8nnmx05n3qkNgbwAGximbOSZ4cQq3MBe0zyRXoBLWkhdEmJo2nVMINI+Kkm8pB+zszQ7dM54l/WmEum0e4FHw+Q5xAZ8DcMHjTW9fSBUAQEoiYdRwQ3xT3VYGc1pmjLfTWa3GOrA3dJ42pqx0zmtlWC4O5B8it328Mjbt/apjCoSdKwtNVqhfsr2aS/y/mhELgrjE80X/KebqoP4NwO3at2WcOp2ChQPiptZBY8/AoVoT7E8M0ynTWcel7sE7EcAVy307nJO2Bup963UFUQIArtEBbaYHarJ9sMVy6/iaaHTWc2wGXCXGbx2rgyHP3JAwLg+ZFbpXCq3NESyAxB7djUeru0zKdqmaWHS/UJAP4N5HyBUv8ALPUDGRg3nv7xW7DYluYH2rhsaR2g9xVopyXUs5R9mj36Tz8oSME0/LCl06I6iuav+GKg9tQrfKpCwVMGifhNI3SpLj6eyUprSNDDofqU7LhtI/1rU16H6iJAOFUjv7xW9SiwWK8cb81y3hpYEiAadK9D90lRo7/I/UBIUWRo8BxtR/8AJHUJEjDgx3Fyt3HDJJVVCt8UO5bW2R7dzzFJ0s3dJWaMXofPw5LWFG/89EPQfUDn/wAi2B4Lit1+kSwIBFEuYZpgCPvTuChoH2WrNJt0Fn8AenbA7DXxUx0LnmkTbtlv9dbqGH1CCoBHilGtK1waTI7zQj5YC+VKmzUR6Dzy4PcltSO+qoHojPg8KtqPlorcvoKAfdv/AGqPoatyAI4NNKIfsTNQp0fntkSVsx3h5olvpbPNM6bcdpatq3cOAOP1ob2VZYA0/ag+OkMuXqrNW/5Vzq4p9iBh/K3NcXpzPAsMtv8AVq2ebSJsCTXT4YM4ABCxvNBx/YV8j+GtBkOcptpT+tFTp3OAhYaD8aq2HcwwcFQYI70Mro9o480iXbBVcyeTALeR5rbaYUz4M0S9k2benHsBjaTFZ1oUAgcEcjmhegpBUsTtW+ttg+zBr5sozVl0lVB/mBoNzJc0Db21cedVZ8VKIw0xHmhBGumCBHND60T727TMCfJ8zOyop+Jpa5kmYI4YqNXgGs8dDcZ1tQsck0A2mV99x5pqpE1yWzCruW5iFaRue1QXA41AdgSRx81mNyyXaOw7igYkhfaqxFV449tlFJ3bMSt5ZmCtqMfbVXd3AY0iVWCeZNZBeuAKNZI+KXa+CwKk6fmp1mhnzpYsoLtnGhQCo45BoNnD40mdgs/rV5i2ULqUaQO5NLBmtrv7E7GtKLrBpcl1WyuuDFKpHpw1LFcaiHWvtNWV66LimCQexPegBxcT3ElfvtWfG/QXyUJI91zp0wfk81BziEOhBsf4QaZuMkaUAn4O9chl3XSD/MTvWr0b7AIs4gAcK3MUVb7veS08am48UYXGZBO58zVbmWKbBG1cKSVMSBSylTqh3JJ2hXq1nwtjXJKgwQBtvWD3M7IJT1DbI8b1nvU4bG9O4i6iQ+jXNaLfN7XqsHYq3g1KM7k4tFe/j/DNrXUNgW5ZizjzxXKwK9m6KpGqQRvXK74yjFVIK52tUe4VxVm4pBcfrUzibZIhthyaqjkyptbLfajWsmBUklie4DVzuL2jx3JIs0vWLgJR+O5pm3dW37NQM+DVbbylbaTEfE0wuXW7jABjPzW0LFuT0Pq6LMiTUtVsLqAVjxA7UsMuRE7lj81OxliIrMSR8Ucodph7boSuo7DsKYYgbo0A870imXJdYbmm0ypQeNv+WjSSBG0wltggLMQe3NGtuTsu5Pc0C3l/vJdfb2mj28vRTIJE7R2op4oL3gNh7SkajEkxRSiLMEAfehjLypBkkdwDRhlwuwSu33oJoMsnaBSPzQKkFVW/MGPia6OACaYjSPNHXALHGsHetFIVfwgFBkkiR2ru4AVB2n5o4wKJ7Qu9dDLzdYwNl7U7jWUH+CV3HYfCW2u3LiW0XkuaWfrDJmWDjbXidQqg+qWEtWMhuSgCkE/2rzq+GRUm5pad5p3FNYAkk8nqN+tcitrpOOsH41ioHrzIlWFzGxP+sV5eXC4ZQCFVppm3Yw6x+7UfcUeqS2ZqvxPSw67yNTJzGyfs4qB+oOQlt8fZgeWE15wSzZRo9NYY8kU2uDwbEEW1cjfYc031qk/2a3R6C/8AEXpwHfH2if8AUK431F6ffnMbO3YOK0D+DwoInD2hPHtopy/DKQRZQ/AAoShmrNHGje4+ofT6yfx9ont7hUP/ABG6egg4+zq+GFaNfB2CgBsJqPYDio28HYU721X/AFUIxp0O1apm8v8AxK6etj/+fb/rQW+pnT1xoOOtfcMK0w+FwoUF7aEHgFdq7/C4N7UDDoG7ELVnCtkmqNz/APiTkAEHHWo/1CgH6kZFqIGNSPJIrT/4LDJa3tofmK7FhHhRaQz3I4pZRopHywbdP1G6fb2tjrX/AOwqFz6hZExEZhbMdtVapbCYbDsiNbttq7kCj2cvwriRbTn+Wk637EUas2fa+oeQPcVBjrIYnYaxNW4xljFKt20wKsJBG4Neb+rsrtYfOMpugAL6pBgccbVv/pGwlzJMNAOmO9D60horsWAxFrcMYPzQmxNvbQ4JG1MNh0k6VP8ASgNhVmabr/RO77UBvOhuiXABHNAYhdR1yKM+GLkyoMb+IoYtIiatBPalUFEpvQqCvvYuN+BQLzLsSwg04cOm+0GlL9sBxABEVnGLzEyfXLFbhEhQwVfvS127bIcSCR3NNX8P6qjYHT27Um+HUAqRufFTUVeR/tTdCphjJC6fvSxuDDOSQG2gGadewiJpCz+nBpa/atKsnZgO4mjGPsDSnlFfjsQotBdYk7mlhFwCXDKO00y1uxdBC/n8xFKtYFosA33p+o0XSyCuyV2OkTxNJ3TpaWKqPE1ZNaQWmKnWSO/akjYUyGSR5IqbhT/g/wCStMWa5bZ4V1DxtQtkbdlUckzRr1q0RCWzPgbV02BS7IIiBHNCKjeR4/6EX6hwJKpbxVuAYMmlM7xlq5hAfUDI0FWBmTWt+p8lNjNA9vazqII8b1lmDtnH9M23eAbHzvtRmoxXZiu2ZfhvVxGQC3GoG0ZmvMmfucDneKw7KQyXGie29em+lyLmWoNQZiP4jua0B9XsqtZf1bifcE9X3BSIqHHU3cS6Uo4awYXexzWnBDTPIrlKi0rcsB9zXK61lZEnxu8H0gDQRqIeduIoyKFJAHPiu7NkagQqmD3pvV6jBiACO4HFcz8mcM4tvsDS2LduWmW7kVIWhIYD9amqsXKswkbgiaPoBiCT9qVoHZLRFbW0sNQ+aYW0rKSBIFcggg6SfIIotsajASB807G7uWyNtRbIMbnuBRkXTwNx81yBMRx2o4CkQfb425pFbWQvDIWbT3HMk70w1plXSBt/1olm2CJB0keKOCWA7fpTuloaOrQrbsMILEknzTQBmNwPip6CpHBFHtKDqkATvWWBGnYFUkRGoeIqdtVR408cbUZQs+4/aKlp7qIPmtvBKTe0DCl2Y+2P71xFKhoMT8Uc2jIIGx7xRdAZCFg+fmqpNDRdbNW/WvErhun7vGyMSTXm5Mab1hSeD3it9ftD31w2Q39yP3cQK8fYz6iNl91rKgOF71WFMpGmmjZNpkUhiFHyamuI0XCWdSp4BNYRk/XmGzHDxeK2Lw8/9ar8+6xtCyRYva3/AC7dvmrJKSGjH0zZ6422xHuBHgb0QYz0ANFuNR5FefcF1lmGDxyub1xlVvysdjWx8k6yTO/ap0Op4NHj6yXW6BJNaNgnGx37cGjW8wIQTbAHEgVjaY83QGYx8ijLmDX1K6vy8Ueqi6IvrZfDGG5dhT7hwfNHu4nVbCudL1jtrHDUN9PYmjpiQSdY1AHYg1uquyiz7Lq1fF2EJHtNFfEC2YVdh2Jqit3GLFwYC+DXGxusQSSaLaWWJ424l42MFyzLKAPjepJeS6gKnRG8mqIYkqhAcCBO4qNvHkIS/tb4qTabwVio1nZc3cRDEsNRnkGpHMXRCQwiqVMdqIm57e+1K4vGpZVgTJ7Gj1ti/irMox1n8bgMHfeW03OK3R0c7rkNtQQBMAc1pjAM2J6VsOoDMLk+7itzfT8i5kYZh7tXH6VOSbaQqe6MgRItx380sygHjb4p9ztuCD4FLOwtkgrt3pmqwwp+6FLoWJmY8UsSLqyRxTzaVWQvNDuW0Knk/FJJBv2hJyUsuQgFJlQE1RFWIbV8DwRQbiavcoAHiKnVexerloqr9py3ifHahNaUoY2I7Dk08UMmFn70rctAyGPuHat3rZlh5EmPo291/rvVZeDsxBX2n+UTVpiVKIBJ0zvNLXYtKHkaftWWbsq1ikVnoBZlZ/5Yikr6AN+RWntxFWt8pcM6v6UmVts277dxVo4i4oX617YkzbaQhT7UFlZbZI2Hgim7rDcBV280vdIRdUn+m1cjbHjaFEsubpB908RXSg2mYN7o5+K7uOzN7RE8ztUbYVrjKzknx4rKTUtD9ktmvessP6OLaE9jEMAOJo3Tdw4zBYuwVIMSO1WPXeBUWbRQHVpME8VRdIXrlrMhbLx6iwfG1GUld0PFNezL+ib4KOjCHTia17+0DlNu4+CxmgK0lNfY/FZt089vB51et7kzsCaB9YsvGY9I3pta3tEXFAH9anVOy9286PMj2SLk6ZA2HiuV1i3YNwAoPFcqrm1opHqvZ9KwvqEFTueJFFsKZIuNB/60C08gD+lHFsyHYgN/1qbtq0eM8y2MqAomJFTRiV1IIX+lL2398MQf0pu0lslQGP2opWrNJK8B0J06tWqeAaJaOoSy7+BUTJgKQB81MoxuASIrDOaRMKHYACG8RRkt7y4+KiiFiQN251CjKjggz7vtWwgyfZWcsAI+0mnlBKmBE0qtlf4iSfg02lstMCF+aPXAinTqzluwpXVJ10zbtpEk7dwaDZtEflbc0eNP5tz8VkrQ2Ns6GHVmkR8AUxbs61lgVjsO9cRlT+GSfIo6sVXUCNJp4r9mWSEFLHtED5rtVLqQFK7TM80UjWGYkDtXAhCkA7fIplHIJNLB5s/atxTYTIbo3nZZrwxdui5ednMEnea9mftf4o2sqhZk3Nv0rxZfX1bxc9+fvVIxvFnRxUk2whuos6JMVFbx1A8T81FU9MFo0mK6tltJYAauBU26dJl1SasZusLzSSCRtWY/TwWkvXzsXK7T2rCBakyZB5NZn9O8FdxmNui2CAqj5rRts3M4uLaNh23CL7oEcGa6/F2LWkG4BvJFY71fjbmR2lZ3AnsKwHF9SYvEEkP323iuhp4s4uGKnr0bkGaWWcgOAncURc0sLstwQPNaPGb4xWkXnM9geKmmc4w6lF1vmljPqmh/qXa7N5Wcbbb3C8GHgGBXb4xSdSsAfg1pbD9Q4u0qqbjMB81ZYbrG/hhqddacQexqkJxWKwBRaZto4saRPuJ8cVFr6oV1MY7DxWCWeuEbCq5EAfwzVzkuatnCi6mn0e8mN6XtGxXFp9jI2vWrQJLbeKRxt61esyPaeRUbrojBS6EH5odyyt6wwTTIGx1VeMf1sWTbWTYXTzfiOjQqsDoYRNbo+nIZ8mLTDSDHzFaR6Qslej8ShJ1IwMg7Gt0/S8scrYB+YO32qDVSLVGMLRlzMzzIl/NDNo3AZaIHAo9xJbeJ80PREiCRU2yKFvRHcihXUKgFVB+9MsADxE1B0EiTDfNC37CqeBNwCrACCd96AyvZhjDL870zeUKrdm7GkrguemZO/kVpIaKXsi7+oDpQR58UliFVJaJP2piIUBgZ7kVF7a2xJYg9hRrNpDJxboqbtrUAwBC+KE4QWyjrB5mJpq5b/fEqSQeRMUpiUZCQI37U6r2jNUyvfD+vq0nSO4Bpa5gVtj2Ar5k81ZsynYCDEbUpiIGxEn5pHfookmJMqQZU77AxSRtBTpJKD7SasWA0Fd2jtSeKTVciSPJFIsrJmkhG6q3PzAt8mhBfSaLcA+TTb20HuB1HiZ4pVbPpXiwae+/FSjbvArWqKDrbBnEZcLjMSyntWD5UwwmY4eEKprGpvFbNz60L+WX9RAIUmTWsYC3pJ3BlaROmqRpxcnaZlZvDD9R2yvuW6RvHFZT1BgEzHKMRZWfehFYlmJa4mXY1LMEMFJXbb5rOMJafEYMNqBBG4mtNpS2UUqaR48znBNgcfet3F0sjkEfrXKyP6t5R/hPV2IgMqXDrBnzXKvFWjuikz3/oCtO360csrKDpilkLp+b95HimC3qLxpXxUnqzypON9kFS5Cjj70ddIOrR7qVVQRHBHmmbfsAgSe5FImIneWM+nOnfY/HFFjQ8TI8ig2ZcGDJHNHVVWSef5Z5rYZowcvyVBD+7YOpJPijW/wB7Dbr/AN6iEV0HAA8Gi2oggmQBt5p4k34qgyWp35HimlDECdh4pSypaSSZHAFOICQAZNO1pIaFNHLaHVsGUUzatwTJk0NSxk9vBpqzZXdtpPBFHr1zY7q6OxaJO/8AWilVlQD/AErqyhcsFaY3oyWdK6iB+veipXsi31eiOhW9qyT2kUQ/u7W4olsQ41KJ+KhiNSW2ZQBtsKbWx00zxX+2RjwVsWVOxuMdq8kFyA2rafPavTH7YOL1Z1hbUwx1Ej9a81snYsB96EVjB1cTpYOws8mVAoI2vBRIHma7dyrQKi4JInitVaKuV7ChiXImfFZh0fn9vIsO4A/eMfzGsNS42qApK8CKYsYsWTpaD5op08GcVPDHep8+vZ1mUu2u2mwXsKqxb9s8d4ouLsKf3iuCT2ApcIVUaTv/AGpZScmT+tRwggRmM6v0qLW2JJ1n9DXJOnUxg8bV0bh0wDt8UttUiiaeCZcDTCsQfmuPdkhd9PcdqEh1PIJMdjUmcLIJ27xRTsL1gM7agAs/oasmxr4LDIuFvtHddUVW2gFX2jnuK6YSQZgDei3+hoda8kNPm2JfdsQ8/c0zhc8x1n2rimIJ4JkVXFgRuAAKPhLTX7koo0Abk96ZTaYslBrR6K+keLuY3pHMEvMSdIIMTW9/pHdZctuKwPb9a8+/RV/U6dzHfS1pN1Het+/SfETYJY7lAIJ2FNF3khJJOrwbDjUNkobERBY0YHQZEb7RQm95GwA77VacsZWTnWdCxt6mO+3zQ2QhxMHxNOOmkgAypG1LXbeoe6Fg1BWso2gOIaQRE/FLuwt2yYHwImmbgYcSQfilbvtcDeY71WCsPZgXbUsnYkd6SvpqjUZpu/peEJnfkdqWv2xBloFRmmsofqkrihW4AjSW3PAFI34R9xq1d1FPNbEcgfJNLFBLS4po3JC2xL0yN9JJ+TSmJiSzCCdtqda20SFg/eKSuqZeUiODU+9f6KXgUZStshBBPc0tGn3OxHmnmX91tHmQKUuuhXdtXwBVElIlKTrIm1oQWAOn+9ANttcqw0nsw3pq7KEapg9poV62WiCVB7Ul0FTaVMUxuH9W06BdQZSCDvWp83wvpY42w8FTvHitu62kpb5HMitfdU2GwmPvOwBbnao3TKcbj2uxnBsuK6Ulp/dbSe0Hmsk6SxBxeXhEfWV2M1ifSVxL+CxmHh9hq0k7GrvoTEm2L9gyCDP6VPli/wAkjpVSVpmvf2gsmf1MLjQoIgoYrlZt9ZMlGa9IYm4klrBFw/auVuL5MVGmK6s9LBGFvVsw5EcmpqStrVE/E8V0qkKIWKmqaVJY8/E1qbOWVbJrae4QTEc0cWlOwBB/tULBZhKwV45otsspMzFH/QI+KC27JgQZY9qnocHcQK4dN07c/FFtWZcBnIgd6ZRpZA8aC4dSGCiCDyO9NW1Ctus/9qHatoF9MDeZ1LTltIHG480Y/wAGTjpkrcm4IcD4FMW0P8wnsKBbAKltJkHiab0zpcD9BTNPaM1TpBFtal1Hf5o1sgLGmaHZJJYdu/zRrUKSNIAo05C9lYSzyeJ7GiG3qbcmPt3qCLJ2IU+R3pgMDCapP2qqi0JJdlR1ZQq8ldo5IqGPQJhbr7nSpO1NDYR4pLOVKZdiW1AnQTvSSG6NUfPX9rDFviOr7KmQFSdxyZrQL22kkSw+a3d+00t3F9bvoUlVUD27xWm3wGJdSAjz/poQk0dsEqEtKqxJG/bvXBraCBsad/w3EaYNh5/0mgjLsTcaBYfxwaMk3kZqsAAWjbmYO9dnSkg+5viinKsXr0/h7g+dJozZTf0CbN0HzpNIrXoZWxVLTXryhZaeBT9/BmyoRhrbmaLgsBiLbAjDu3bdTtVmcsxLrIsvJ7QalOcrpIvw8UeT2Ytctut0nt4NSWyxXVqO3Aq6xOVXw8Lh3PklTSbZbiVLILLj/wBJplcticvEuN0mV7XGR/BPJoqCQQSCasbeQ4m+m1p9Xf2GojJ74BVrF1G7HQadJ3SJqD2V4tnSSCTHaospgEiPvVg+T4qyJ9G5v/ymoNlmJZQBYu//AKk0ziBRuxIAP/CaZsYh7CsFErxxRsPk+NDF/Qcf+kim1yHGOQz2nQH/AJamrUsoCTlhG3P2fr5fDZmjb6klhNei/pS6B39MbaYMjkzXnD6H4K9hc8xdpA4snDMSSvJkV6K+lZBvsiE6t96t2yiE4tPyRtFnKHcSe69q69WVMGAdo8V3dJLBR7j3qBInYQa6JNNEW1VEGX2wGk9qXuILjDU3FHdGVwTHxvULi7Sqie5qdNK2JmWEDuqygFTC8b0C9bLL7SNQ80YKRbJaGJ3ApYyZPFZOkPHGWLXRuAVCn+alrwOoydUU5eVSPcJNLXtNtJUEn53rdfdjJ4YilgM0sSDSmMsKikk/71ZG8bkiCGA8bUrfIfhSW7zSt0xapWVhZtEsoP2oNy2jW2cGD4Y03jLQkFDEjgUvCrEgsCN5o1ayPnTK8Wwlpjq1z2pZ7CyCQFUbx3p3EbowI07dqr2b0F1QWHlt4rQSpoCTYG8qs5MEjtQWRn33A8CmL5VtLHaBOxpdFZ13MTSqHibq7yAuWxbf3AkEcCsM67wp9W2dOtWTc8EVm76xMQY7GsZ61RjgLdw2mDBuaSVSaphjGCwY10rcFjNbajYXEKkGrjLB+E6huoIClpAPzWL5TiXweY2GEudYEE7VkOb3BgM8sX2/Ncjae9S5E3pHTfUzPOcCM1ym/hYLi6hXfg1ym1xM4RCYBjtXK5VxpLRaHJGCqjbqayZaDTFqybjMOAN6EPcYUgHuImi2VgmT3iumMcnlvAzh7SqjAkHeYNSQAAgACaEiw87z5qYUlt2jwRTuPoZYSwNW7TABtSgRzR7ADt5MckRSygo28uvkUyrqp1Qw2gVnSx7JuSWBmwZcQQIpm1quMSxgD+9KWF9Qggn7U/YUQQy7+aKiVUuukdFgpAJAnsKbso6gRwfNCs4cE6iNhxJpi3b7GdNU0sEotdr9h1WI1QT8UZVUsA3tUUNTpiNx4o1sAzB1eRRS6os+th7dtQTo2/vNEt2QxJiPmg2QGM7hh/SjLbY8H9KybTwTdJ2TOgFYMmN6q+okcZViDqgFY3q1tAJJaYHmqLrLEg5HfiQCKLzkKk5LKPM2YYjALnGMN7LcPi2W4RquoCdqNY6iyqxschwRbz6S/wC1UuY3Q2YYzz6jcnnek/zLIgeRVowTjaLRyqszO11TldsajkGAP/4V/wBqOOscntwT0/gAP+W0v+1YM7oFEEgx2FCu3TYgElp70HHrkW+ujYdvq/K3O3T2Xj59If7VJus8stkj/L+XmPFof7Vrq3jt4ZyRPI2oi4jU7AHbsaEPNWZ/pGwB1rlgGo5Bl6//AIh/tUB1jl9w6lyLBAf/AGh/tWAm+bYEk7mu/wAULDBXJE8AGl6KTyIlLraZnzdX4BjLZFgVHkWh/tUT1hlrnSMiwRP/ANpf9qwm3ieQ8weDNBuX2UDfjuBUlFPXoeM28MzhessCshMjwSn4tCgN1phGeDkmB/W0P9qwpcVLGX2+Nq4b2tgUb2fNPFe2UbdUZpd6wwQ4yfAlf/tCop1fhLpIGSYAf/jH+1Ya19XYkOCfAobXgAdJIn9KsqqhW2lZmw6swc//AErBKfHoipf5owjrP+EYIj5tisIuXnAUzH35ru5jh7Yk/auZycm6A7/IzdM1s5gLiWMHh8M2nm2gBpj6bThszYBgfzDasY6cuK164Q/uK1efT9ymdM7HZbh9s00sxsm5uVZNsm4NQZf+lRV1O5H9aiXBJMEA8CK7ZlZIIH9ayWMCvBIsGI237UMkuCIgihMxUyAT9qg5P5ip1HtT22sj17R2zqQVJg/zUJdP5TBPkVwWXgsdwPNQADKSDpHmkdPFBU0lTA4lRvB/tSt0sU0txTdy42idU0pd/ISWO/8ACKeLoSTpWBuW2Cyoj70pccWmOsCT2mmSxF0AnUp4E0tibYuOSFA+TSLLZotNCdzS7TEjwKXaONwZ8046BbJWQDG5jc0iYuIOVjmq9uuCy8mmL4lS4gQY3oDgGyEffwAKauo1i3qI1TuJpW85ZBtE963XtlMKajgTvWIWVXfzS9yyxIhgI+eae9YA6SBIHPmk2g3pIgTzU22L+TaiBxFvQFDyATM1TdUYQYzLrihiSomBV3i3YnTb3X5pW7bX8NdDw1xhsKSNSv0VUEnk1NdS3YvqCTqUgwN4rKM7tNiMDgsXCFlj3ESOKpMZhScRcMEEkwKvcMzYrpprRBFyyPEzQ9Am+zqjMcmvjH5fbB0klN9q5Vb0ViVuYVVJGsCJH/SuVyNSbwdUeOLWzfhZmlgukHtRLOgiCRP96CiEKDHB5Y7US0hNwlhIPirpJnkJtbGpYj823zRbSSQTGrzQ1U2QTpmfJqaXXcg9x2op5tD27yHP7t9ySCO3FEFzUdIB34moq7MhLKI+albWSCCFigvJ5HlGsoatBlII3NN2LZbkbzO1LIuoRA27zTOHWAY2bvvT3WKJSnTURu2QSIMR2NMKzMCsD4NJWUIYk/1p5XMCBP27VnnQ1pEralSDO55mmrSmZAk95oCly2wP3NHsyiuS0x81RrFBpPLCknYgQO5o9tnZDqAB80O24a3IB+BRlYuE1CFpTOkdG6xGnSCTWN9eXPSyRw3tk9qyJSA5G+ntWHfUo+lkxB/KZJn7VTrgW+34nlzEsb2PvS0kuxJP3ppsOty2NJBHfakzhCt1mAbSSYJO9XOU4N3dVFskHY+atBtKh6rPsSuYN9KwBA42pPEYV7hlmKgcR3rMmyK+3GHePmlLmRYi3Iay2nxFZyerETtbMTfDKVKhdLDfYVG1Zcuw1AVkL5HdDT6TkfywaDcyi8WYLZYfJBrRu+oy1bZS3EZdjJnvXNCt7nEkVZ3MoxCqC1lgvmKgMrusNrRn5BoZi6oCv0yt/FO35dlG21DJDljoMnc+KsP8CupqItMpHO1cTLr9mCtosTyIqSw2PFdive56aQf6ClyzXH0sdC8+KsLmW4m3e1tZLKx4Imo3Mvu37g1WmC+IilkpWN+LyKgRspC/JNdyyIZOphxU/wABfDMPTYRx7Zpe+l4CDbaexitBPIiy6YNsUWJmVbxUDinmRtHMVA2rxIBtEMedqlcwl23Di20+Y2oNZora9GR9M3RexJYkgAd/NZP0Y/pZ7+UMDc3E8ViOQWmt4hWb2gjvxWR9K+nZzohi290cGlzdGSjV1k3IQACZiKgVBWWHt7EVDUGUmdu8Go+pAG8CqRb2hev7JOUfTpWI4NcOhm3aSKkrEA6gAPilr27Qq/1oexcReCV2SSEaQeQKXZjb9sAz5rt2IYBR3jah3rZLckRW94Nd5ZC5cZhBED+9Af8A5l1femLih134+aVYBJncHwaIvVtZAtbUP7SBPxQnlGI3NMMsLqmB/WlrrDSW1b06unQIwUXkBjEkCCR5FIXlNvYgim3eQC0c7bTS9yWJ1EFDStWrLSdZQhiJdRLGOwjagKhMhjpXtFOXEYN7RrEUrcQOnvGgfyqKentCR8stCtxNTQCCB5FBv8BNS8SZo15It+wQT4O9KsmlAXADHzzUndlG0lhZFmwz6iWiPFSKrCKywBwFE11duamELsOT2oWFvA4h9RDp23qcuyYOyWzXXVCvhc7cARvIXgRTWQu15L9gS2v3BaZ6ys6sR6hI4kCdwKrensV6GboWg23WAPJo6VlO1tZLrorWt7E4fVoa2xme1cpXD4u3l+f3liA7TNcrknJXo61KP7PTasGMHfwo4ppWfb2AD4pZZR9h7v7Uf1oEuw/SuiK9M8m37D+tqWWUz4NTVgqrIP2pf1PUUaP60S05JgAkd/ii/wBDxdqhoAXBqMx2FGtoqQXG3mhBvTIBXUDxNTBNxv8Ay/aPBqSbbHlhUxtHX8swp702lgmIaR8UhZWJ9m1P2LjEQOY4PFVdogmm6CgkEST8QKdthWKSxU/FKAspgiDTS3Z3AEinTRnFUNLcdSdzBoqohUmTPcUujGR3Pee1HURMGCaMpezJBwGQRqAntUwIUe4xxSyqwA33HY0W2wjYb/FHDRB2sBl0ru0/c1gX1XxMZNcYb6VOxrOi54uJp+a1r9YcWLWUXY3QWzx3oN0WX7NHeqFcEKpFZj0sq38VaJQKJ5A5rXi5j6l2AF0+BWWdK5sMNi7QILT88U0ZtMeVXs2jesrbQsoA24qsxBV/4YPzWP5l1thsHizauMRcgEgCaEer8JfURdUE/NVnJ7ZLq1bRdXtBJA3ApeEQnVsPETSFvNrd4kowPwK7OPksJEfJoqV02OvIZvJbcBgp38UCFIMCJobY0oCVjbgeaBdzACNQIZvA4oSnWUM2lsOGDtGkEd5qJVLak6B9qVDsAXDCTQr2Ka2ASf60kq69hoP/AOBn0sSY0jsO9BOgH8u/mgLjLZWARPkUhi8ztYdS926qAGIJFZckZRtjSdJJ7LY6ApGkH9Kq8QLbKwAGrwRtWPY76mZZg3Nv8UrmN9PaqhPqPl2MxPo2bwLtxq2qblTqIYwbVmUO9r1BqCrHxxQ8a1t7L6CAO5qkuZ1h77St1S3lTzRruLD2WKsAW2gU0XeSck4lplcOfzABdxTvTjqM8uMCGBYGfBqkyq+wvBNUydhG1XWSN6OasVVbckTHczU3yL/FFVFp3I2zauXFQGABRA6kDclvEUtZul0DEahU2bggwT4rRdhbSwEuXv3giQf7VEu6NMaTQXUm4CD/AFru4PUbZpPes9krjbJj94xJ9u0zUC7EGSI+a4oIHM/BqGsBiSBFNBtvI6t/icc7NpZfmk2BGw3B801cIcHT7Y8UqdTKZE/Jqjebokk0BN0sYk6Rt4ocTsSJ+1FVCwJXgc7UC+Qo1AH7TNFZ0Ub/APYDc0klSd52I4pa5aZAQG1A9qOzSfcJEfal3BYE7wNpoxaWwOMquxW5acWyDJ+AaUunSPc0R2PNN3LvpJpUk95pO8Tdhl3J5MUjk4vRkmtsDdvWlAcbeYpIul66xXj5FN3RpYOyDxEUC8qLLBeTuKzirtFf4hS6hRio9w8ClWVbQlVKmYAp3EBBqZdgRwKRuELAkMD/AGpotLYrikqMb6xsrdw1toCvOknvWL5XbGExth/U0aG0hm3FZ7nOFt3cCzqFke4Fq13irmm5dVjKapg1zq26KKk0y7zy1cTNsM/838cVyi5pGIyjD3gxXQBuTsRXKjyRSdSY644SzJnqJ3DEEQD27V2VVjpjf5oIAiBGr5qdtyh9xn9Kds4JZyHtSCFEAeIqQLlyukKvnzQkuBju0UcXkApVJpmSbjaYdFZE/NxweRR7VzRbMGWbkilFxBRwgWQfHFMgaTOnc9hTNJrAzbWdjtmUXaQPJp21wCCGPgUlpZEAVTxU8PrXSWEN4oXWgpJ7RYD3QSY+KPbKk9xHelBd07mJo9tyXgcMN6pHLsW8tDtsgyNRBNGCQkgyRQLQAEE6Z70eRbUAb/JrRV4sCclglhwCfeZ+TTisAsAx9qSDb7kD7Ue3cLJtu01TQH+6Ort4iFjUfJrUH17xowvTl+4GIJ0rtzua286uz7EGPPatFftJYtbeSED85uKJ7TSYeYgW6ejz8uaekQQfdPJrIOn89tW7ty9cePTUtudhWAX8cbx4Bjma7xOH/wASyDHYaxeNi46Egg7sfH2qvHJM6ko0ZR1Nnr56Q+AxtkXFH5keCaoVx+b4Oyz3cQbrrvoMNq/WtR5Tl2OvX2tB7lu4W0jVIprMMvzzBYj0hduxAM6jSTk5ul6D1X7Nk2fqhmWALLcwzgcfmIirTD/WlVQC6l1SeSTNaYxmLx2GUC7cdSe5JIqTY27YsB/VW4RyCKWLauI6462egMB9W8BiCurGQRwrCKvMH9S8HirkC6rxv7SDXnPLOockxAVcdhri3eNVk7VZ4rCZSNF3CX76l99DiIFZzlHAkuJPR6Fbr3Arac3r2gfK9qxbPfq7gLINnCA3yD+ZthWksVmly1bNr12uWl3AJqovY03VLxtwTNF9mjPjrBtDNvqTmTfvMNfWyjk+1e1YXmvVuOzJ2Y4m62oySzHmsYTFl7y2pLNP5RvWVLcs2LK+raDMBEUjWKL/AFqCyhDB4Y3m/eu0ESWFWmG/D4RH90P2NJKVvk+mCjD+EGnMN05iMf8AvCpVhtpXn71zrteTojFpX6Yg2YYh72pL7qJ4UkVaYLqjMMEd8W7D5M102SnDXSHDQvO0E0ezkaYu1c9NSzdviqK/Rz8kEsoyLJ/qDewY1XHW5332rZn0/wCpF6jxrOi6CACyzMb1qPCdEXWy3UU3BMkmrPp4Zz0fiFvZepxBP50iZX7Ud4BKNxPXeCKjDWwT2gbUW7aAKwd61D019fMmxWEtYfH27uExq+022XmPFbE6f6ry/qPDergr6XIMFCYYfpTvx1s5XGsMuCI2Ikng0J2NuI2ou7+5fbtUQgWIG57mnjHGTRi/RAFtiZYxvHFDdyFMKFHzzR2Uqp1mR8UAaTtEA95rLDpFJYINJC+PiospQ7EmfNSjRdUT7DXd2ADA/Wao2kcvWXa0xZ2KncAH7UqzsJmCTTLaWWD3oGIthbYJIHzNJF3krNSpMSZhq7moXbyopgncc0ViEP5SfkCl76FzAQFftxVJOOzcfZ7F7kBdchh9qTuvqaAAAPFPlEVYOxNK3nAtF9URztSJuWiraSyK3EUkkmRHMVW3QCGgknx5pq9iTeuKFX2kRJG1Bu6FuEeOYETRuUXVAStCoQuQLhJTwNopTFW29WEuERwIFOXn02yAIDGk/aGbUZPxvU3bSTHxJVsWxN12s3UO5jtWvb6lcQQwVw071sbWtxIUafk1r/M8KMPmd/fUuv8A/wBtS4WUQTbaxZY4Vjjenntpbk25G/euVHpvfE4qw7wn5hXKnKCk7o7Uk/Z6iko35ZjvRUaW92/3oSCFO+3YVEsAQdUN99qo/wCI83q4xxkYDBGgLzR7KoWk6iaUVxK6p+4olpktuffJPkUEoy/2WjKlTLArbG8T8UW3clp4HzQAA0SePAqQVTsDJniisAevFFgtx193bwTRrbllnTBpHDqxEmduKbW7qPYfHeqR0KnasZt3CWHtAHxTQIC8e6kwwIEyNqbtEG3Cg7+a1pKmEPbuGRqECmtQYSpkUpaLbqTt80xbfQgkgfagsO4it2HQIg/SjW2QIHMjfgUtbuKR80wiza32HaKdXJUNVL+EgRckJIPzXnL9prEBMrXU2kC/vA8A16KPtHt2JrQH10ySx1Jew2Cv4wYRdbMXO8/FScGjRy79HkC91Nb/ABg0qfTBgia5d6ntqx9JLiNBBM1tQfs65Feul/8AMDSTPApq1+zXldwkDqLSPOgGsotHqwXA4U1RpQdRN+MtXLqEhGBDEVlVzqnLcxsK7EBl2hjWyR+zPlyrB6lQj/mQUF/2XstuCF6itD/0/wDvVE6WSUuLjjmDNJ9Q2kzVVu2WUDfYeO1Y1+AYsUBOo7fevRbfss4YGV6otqP9P/vWs+rek8H0fmt3B2MeuYi2Ya7pjfvFaLybaZh2Cye1gE9S4NVz7bCmbuJuXIUsSBxFNXmYxbWCzcA9qpc3uHD3VIPuH5qdqkrRNO3gaa3qRmKmeB81z/A7gy5sW7DSTCrNK4a7dx5S0pIHMVd4bKcRiCLT3CqngTsKm5W8sasWI5bhLeFY3dPvYbVY4LK7uPGoKxJMARWfdIfSbMMww3r28K97sHjatmdH/Q3McRjVW7bFm0ASTEmkcmlY9Wsmpss6Mu4J7Vw2WvXP5FWd6ymxkGaI37jBMrPAJ+a9JfT36OXXxN3Dmz6r6wqsRvFeiumf2fMtWzbTEWB6ijkjk1zPlSVHVx8bksHzgzHo7M1uziME8t/ERAJrIck+lOaYy2r2rC2bbDkDvX0txX7N+UZnlRH4dfWI2UDasfvfs5Xcmsxg7YUE/lbda5Zc3V4Kvgt0jxdY+juLw+UlWst65HKqSP1rC1yLMej82VswwLG27aFu6JWvo5gvpVew+HBxVtbl0CAiCBWMdZfSCxnVi5au4VdJHDDipL5iUvI6P+l2jSwfNj6vdC5q2L/x2xhVuYUgE+gN1+YFYdlHW+KyXMcMcJeuWrqndjsQfkd69o9VfTzG9Fu82mxWU3CVKus6P/avLf16+m1np+8ucZXb/wCHv7uqj8pr1+KcOVXZ5M4Sg+skbp+nH1ZsdVWUwmJZbONVfzT7bn2+a2D6nBAn714L6W6rfK76pdutatzIcGCp+K9LfS/6tjMLyZVmVwM5H7jFTs/gE+as41lHPJusG2xd0gkrz5PFDe4dMADfiN6kGDpIWD3Hmu3cMdMANECgs6OZK2CFvVuAdX/N2qL3TblWQkHvXGJtjeWbv4oRf1F1SNXYGtLWQ01og+ojjTPG9LG6WQhhP3qd3EXdURtQiouBuRH9a0V6GtrYFyrCAYgUrdWYa2xAHInmmsR7ECBIkbGN6VZwirCliRuapdYoVO7oFeJKyxPECBVXdtXZ50r3HY0/flV2J+1KsNQ3bc/w1opx0Oov2LMXB08L2NJ4twpGsnWTzHNOYpCgEyF8xVZiLTXo1ST2+KDabobKjghfZAu8/BpPV6RLapU8iJo1y4LSlXYvHnalbl1FTUokH+1TcW3ZNKN2CLaHkDjeOKxfqizGKLsoSdweYFZPBvuSSQewJql6otTaRidTDYsBxU5xtWyilS/2UGVYr0ceoDArcETx/euUJkTCG1eDyA2+1cqsHS0GfHJu1Kj1it31DtyKmoKAsYJPmkWBtopErv24pj1fV0q4kjeZqU3TIRtPIzbc6tgJ81L0yrE8meBQEZNQAYgDtRASL0zK9gaSNxdoErvxHF2I3NNqNKiSAaQGI3gQftRrRDidUN96ZP0LFZbLCzeLLoUnX5olqQwJhnFIjFJh3A1CT3p+3iLTLsQDzM1aVJZMsj1swgNwgHtFH3ZQF2Hkneq5biSS7L+hpq3iLawfVWPvU1T8kFFjhh7DEQPJpgFTyVPwarkxltVJ1rJ/pRExFpivvUA9qenJWC8ljCgQIB+KIt5go07jzSCYtA5AcEH+1Es4y2jEM0r96ytDP+Dl25sxHNeefrQHxGcYUGAFUmZ7zW/buMsKCwdZHFaB+qSti+p1NtZVbe57c08E1JNGSTVmu19RLgWSw81d5Xh7joz6yq8BQeajbyW7iAyrpQkcz/0rLenej8Q+XAkByD+Ynmq2pMeD64kzF8TcuWmNrSd+G8Uo927GnfUePNZviujcSLpI0gHtNVeN6Uv2hcdgFCCdU9qScbK2lk151TnxyzAuBcPrHYb8Vpx/XxV+5ibwVlLES5rKet81OYZrew6kqAYB+1Ybm+a28Dosu+3YAd6TjuLyapetC2PxlvBMy7a2G0f71j2Jw5a2bzPqk7SaPmDuYYbg+RVn06uHxmEu2cTED3Jt3p+Xk7Ki6ilVoR6ewty/iwYKSIBFeh/pD9GsX1Vi7N+9Z/4edtXLVT9BfTJcbYw9/QA4hwfIr2j9G8owWFwGHWyhW4B7gw4rzp8iSs64cd4aLDoz6WLhcHYwy2/TRFgqBxW1elvpfhrGq+yhpEaWFXuVYe21tVUjYdhzWZZRhzbwZDrzsAa4vupbO+Hx4sxfpTpbDZZm3qpYA9Q6SQODPNbVw+V21dIULPxVXlGXqGDFfaD3HJrLcFhg1sNFTVMeT+hE7OGCAaRJFHOGW8sOs/FGCBV2FFAgDan69tnjT523aKq/k1u5+VQKr8T0wpX2qpPyKyWuEA1Gfxuw8Pm8sPZpb6hfSq3nGBuhbKywOqBtXg/68/T5OncgzrAY5B6Ghrlpm2P6V9VL+HS9bZWWQe1eUv2w/oknXHQ+PGFQjF21N22V2JI7VLic/iyp6Z2y5V8yDteSPi3mmHT8UQhDFdpq66Xzy7hcXYwx9qjg8EH4pnqLKr/TOaX7WJsyVYoQy7gjzVE7i7ihesrpAG8cg170G07Wjy2k8M9o/S3rxeqMoTDXSPx2FULcB21Ds1Zu0Pxs/wAV5I+mPV1/J81wmLtyRbbReWeVPNetsKfxdm3eUAW3UMGBmZqjb2znnCN4B3WPDDfmhhQ4OkhfvU79oISSSRSoxCqxMRHmn9WBKzl9WAEMFXtS5Z0XkRPeoYrF2wxZidIpR80wo9yszfEUe1UL1t0MXDrPIHxStxvaQrQRyar8Xn2DW5upn+aKXudR4ED3kj5imcq0FQSxQ5iLy3EIJ3GwMd6UF5bACvMmq291bgbQIGsgd4pG91hgMSJDuSPC0W+yFtLBcY24zuAN7Z3pBndGg/l8jtVYerMFJAe4SO2mlD1tggSHW4T3pFjY3ZVVlpet6g7QGPjgUogRmCuukEd+1V1zrbCMNKLcPn280tiur8Lp06HBj+Wl7OWEOuNey19hvQrEINpApPPrSXcDcWQ2riOarbfVOGDDQjl+4K1HEZ/ZvWbgW0xZ9pjg1zuXTJRR9IxvF2mGFuDVsg1R3rlMXB6hZSv5xvtXKe/dlOkHs9SowQid/wBa7Ih5gEfG1LpcJ/Ns3kcVNgVIGxnuKVKzzuN4uQybltpDQQOIotojjeT54pMQIAUKJ3phHK3faogCg206rA9qxrQog9zzTC4a3GzED70pr1EaR+lFFzseaesYF0MLhLZJkEnyaZt5am7BoA+aFYYm3uZHaaYRiqlWispemGLTdoNZy60YaWJ+9NnK7LIGMj9aBYvFdjpA7RTVq+Q4BYEeCNqdbwaSUdhEyywyREgeDREyzD2xLyP1riFUYgGJ7ijKrBdzqHYmj6M3g6GAw4gqp3+aPay20D+UlqjYZT335plboWNLS1OrWGhY3JWyGIy20LRLAgKJBnatCfUG446nvgLKqBuDzW/cReb8O8ma87dd4x7nU+LLErDaRB7CqKLTtDRWcCuW4ib0swHwa2jkN9TlK7BROxrUGHuKL6QCIO/zWysjxPp5WrAkz5FWuMVQORPVFxiL4ZyBE9zWC/UvPlybp+/qcWmuewGdzNZQ2LgzEHuTWrfrbgsNmXTgvXLrepYcFNDdz5qdq7DA0U84rNLuIEFVkkkTWD5jg7mYZkzaPYCSOwis/u3FwuTOiOqXHEQTvVFhnTABxcVbu/8AFzSOq/p2RcWUmZf8Uy2bVsDSvuI70501lH/G4cEmC41L2Aq7t2Ldy411bSqzbRPFW+QZebOZrKDcjfkVCTCqiux6y+k/StnFZJh1CSNPt+K3v0T06cqQhgEESu1a++iWWlMmwl3URC7A8VvHL8CLqh9o8V53ycHscOVZlHTdn1NGlpA2PxWwMvw2ixAkg+RWLdOZemERXA1M2+nxWwciw/qMGbb715tOTSZ3uSjGxrKcuFy3vz9qyCzZW0iqBxXLVpba7Cp16MOJRR85z875XS0crlcrlVSo5DlcrlcpjHKxjqzKlzHBXrTrqVgZ2rJ6FiLC3rbLHIrj+RxucfH0dPx+X6eRSPkF+2T9Fv8AL/WV/MLOGIwOM3YxAV68tYvoz8MZtgw4gfevsZ+1R9PMvzvpPF28Su7CV23B7EV8xs/yX/DmxuCIm5aJZJ+DXf8ABn3h1ltHT8mNT7x08mrMkVsE4uQUAOhgK9TfSDqG5mXTjYS6+tsKQoMz7Tx/3rQ6ZP6+FvXhoIuqT7Rwavfoj1G+V9QW7N0bYmbLmdgRxXZ2/wAWjg5MZPR7wxCMpK/Heg3URSY/L4o3qHYk6l8VAgAEjffk0tXshHdor8RbRmClef5qVuYdQzKEEDwKdvMi/nJmZ4oNwm1DSSp4NZWnQ7kkVj4Ozqh0VmI4ilv8Pwt6SbaiOxFN4i4bl2VOmO9BvszISPtW6SWWQ7U9iF3LMNrb91b0xO45qvfBYdfy4dVH80bVZSShIJFLYkXLiaUcIvfancu2C8cq3or2y2w5Ba2hH2pTEZdhlDlbFskf8omrE31tyjbmKTvANcBJ07eK3Ztm6qm2V9zA2ran2Ag/wwKVvYPDaQVtLJ8rvTdxpuawSUBgmurzwNWhXWO+1K1A0PJUytWwiAj0rc8bippaw6SGtgT4EVJ5RtTj0w24UbzQbuJJ2X8g5nc1z8lWXjcTF8xLYXGFzPpBtpPauVLPrFs3QHkht4rlVhKKVSG2elrlxJB334BqFq68xAQDueKWb2SxDR8miqqXrIJLMQf5opE7ycM4paDjFpcVkY+4cECiLduTLGBHIFCtFVSNP6eKmL6kKoMRtTX6JLjt3Idt4mQJGo9jNMMxG8QPNVwZQu41CeadFwsihCYjikbY+Et5GcLeEST9pFPIRcUMO/c1XWL8R+7G3MHamvxIue0CAe9Oo2rFg1FZHrOlXBnUe+9ME21dd5PnxVZaI0bGRPHFNawdwpFKn1dFF5YLEMAd2AFHXEGAJJWq5LhInaftTKX9VtoIkd4q16ozx4pDyuqnaZI5iird9MTsZqvw99oIMmPNGS7vsOO1NKrwJFUqHb7M2HdgxgbkGvM/VmNOI6jx9xysC8wHmJr0dcxP/DXAToMV5Sz3GI+cY8lvUPrOSw+9ZPqysY+2WFrGj1AQBArZeT44tl9ldtOgVpC3mBa6RBUCPb5rYGW51ctYa2nAUAQabMl2QZVJZMwx2Ji2ZIkcRWgPrfm944W6Lb6FLgQDAIFbRzfqvDYGzD3FBcQNRrR/1UxjXDYtvBtsmoHnvQ7YEUfI17czG5jbVkkK+kQWneg43ENdQMjQ3HMxVrgruVYLB31xJKX3WEIEgGqo2fVdijAsePEUkpU7OveC06Vxht34xDyCPaT2rPMpv68TY9uwYGeJrVeCDriOFUBuSaz/ACPHrh7ii7dUBYgeaVUzdbVHt/6K52MVgcLZuXNIWBA716HyS2obVrBXnmvGP0Qz1sUUWy0gbFjwB8V636TzNMVhlUtG0BRya4uePd2mer8Z9VRuDp++LxTYFYrP8rs+0BV01qbp+9dwxWCPgfFbS6fxnrWtRMmuLqr2dXPmDoyFNlruoI4+1Trsjo+bZyuVyuUxjlcrlcrGOVW571DgenME+Kxt9bNtRO/JqyrQP7RvU+DwGDa1cvlr1waEtJz/AEoN1svw8X2y6mCfWH6s4Tr7EjKsrLXrzyAirMfevD/1k6Yu9I9XacRM3ocyJA8169yDoDMb/TGJzrJ2tWL1tZurdWLg+N61t9X/AKdX+teiDj2/fZlhPfCruR3FSUo8XIvR7E+LtxNRWjyJgQmGOPwarqa03qKSdmU+KxRscen+oFuL+7TWLifBmsixVu5hszwt4nQrE2bs9j2ppemsHnmYC1jFLKBAbjevTcW0nZ4Uqqz0JluNt43K8LirbSty2G5+KK9wwSGH/WqDoq8lvIrWGDa/QPpAk7wOKvTctSwAhzU02tkYON0tgbgItFmh3HAPakbjlkMqSO9OFgu4WSeZpR7ysTogTtHNV7J4Y01kWuOht7KAw+aUdxeZgDpEfoaYYndQPdO/ilHIQNqI27RTOUap5I9Xdi11fT23+ADQHItCTOo8g8US47XRJDD4pTE3hd0qJWPnmilF6KXQvfJv3ST7QvaKX3ZyxIMDaR2qd686SrEg+Y5pfTeUnVAFK62GKTeQGLvEW4EDf8oG1KPe0kDVBjjtTV99Ns7h5pd7bKssunUI2pOq629Fln8RO/iCWn83zQDLugKlWf8AiJ2pi4lsNp1BSKD6gVyr+5T42oyUZK0TfHO7eSvzqwC1piwBG09q5UM+RruG0qZAM7HgVykcG9FVOjfkEj3MQBxNBS434glZZftxXRureQhSS09+a7W6yOJECoxvRxTQyGhiCD8mmEfTpXSI/vSouhzspYfHFdsS/v0sPkGqRX7H/GrHiq24n3A+DTFnQhktA7VWW7jMwIMD52po3GMb7DxvTXbqhmk8pFnaYByVCwfFMIdiAZPMRVXhmLkaFII7ntT+Gt3HJ1kk1l2QuKqg9r1VXbY8xTJv3VCgsCPEUpaAmSdhzvR7lwlgFA34k023TQv+g1qbj6p28Ua0G1wp27xSK32nQVCHzTFtnQah7q3ajUnks0uaZ2579qmjGSCRPilLd4tBZgPKmpq2k65Db/lmjDzeRnHFhcwvlMBiGB0lbbGf0rxNmWb3xmOLuLeDarrHcb817I6lxItdPZhc4IsPEc8V4YzDFTiLwSQdR3/WjJNRpGh2YTF9WPgGF0vqYGaI31VzPEgW8Oqox7xNa+z7Hl8cttW1RsVO9Zf0tg8vwVg38TiLIuMOGI2p4YR6Xxvi/wDYl1Y9gc2zXO87s28ddLWrX7yIpvrPF2cyxCqiqFVQCO9Q6bxtrH5xi3sMLltEjUtR6zwd/BZhbuWU9txBMjtUpO2Hm4Y8Emk8Ixi7klrMHBKawu3MUhmWHOWsFW2VA7HeKzfCWsM+FN1g1oLuQawrqXMLV3EM9i7I4Ns8ipTcotKjcXHxOHfs+36KW7jXtEsHME8EVa4DHLicRZR3EMQCDVKuGe6wuySp7RxT9rAqLikLDnjTVYp1YrlSR6/+juYWMuwdqzZOi2FDu3x2Fer/AKbYpcZbtXA0h9xvuK8EfRbq42sSMuxCEFwFDNXur6YMRlCMp07ASK55XRfilckbly/EM11bYJnzNZ/09mLYSF1Fu+9aksZh+HcMragayfKepRh23MyN68trrI9ZJPZtxc6hhI2+asLGcWSPcwHxWl8060XB2XuvdMgHSAeaw3A/VnE4vGMlp2Yg7gdhVYym3/Di5PjcbdXTPTt7OsHYEveVf1rD86+sWTYC82Hw1w4m+pKtp4FaTzTNuqc/uXLeV2Lj3H/jJgKPma5gvp3fyiyMxzG6MVfQa7ltCYB+9dc6hG2Qh8RdqZ6M6Zz27nGFW9dAhxKx4q+BkVonIev8U+E04eybS2hA93as06c+oDX8OpvsGloJ8VFc0ZKzc/wpwdxRmOf45suyy9eQSVU/pXkTruxmHVXVP4vK/WvXwCtz1FBAM9p2r1ji80wWbZdcSdSOsGtJZxlr5BmxS2CmGdgRc8feoT5Gp4eDs/4/gUovsnZS9LYbOMr6dxtjHM17E4kBSI2UDgVzIek2bDXkZSztMzwa2jlHTrZhYt3BeFxSJkHb+tXGH6VTCEQoJ5nvXmfL5OSbV6PVi+LhX12fJ/8AaV+m176f9V5hbW2LWGvH8TYgQDvuK1Tfzq7h8FZxtrYkah8xzX0E/b/6Gtt0fhM69Ia8M5R4G5VhB/7V8x7OdpoOGYkC250ia+h+HzLk4lbyj535XD0m3HR6C+i2PxuY5djcZirLJauXALcjc7bkVsZ1AJdZn5qo6Ne3/lnLmtoBqsqQFEdqtbl06SNgfBrrn/DymnYC6GVdXqAT2mkVUtd/PH/NTN23tPfyaSvzbEIfvNGGMjbefR1dJSNJJPnxVbIJYkzTVwuVmQB4JpW+i20JIILcCtVGuT9AfULqZOjfakcSrKWOnUvYijm68wwEDjalMTeLj2SX+KlHunTBJ3sWvh23baOJoGJZ0Un1Ff2ztRL99ydBaWjg0iLiqjE7kczT+VZJxXkBmE1MfeewFCe/cYiJVe58Uw95bgBVQrCk7t2+PcVXxWq8HT09grgAI16m3qDkl9IPu8bTXGuq4cNz4oJZIk7MO5p6pVYzj2SbYPE4dHwrK7MrbkFa5U/xZBBt25cCAT3rlZRl6EUVLNm5A+pg4gE1IXQbTeowJntSxtlAJaAOw4olv0ywJhpqTUfWziUqdDFq+qAkSNtlHc01YJC+8f8ApWkNSICQYP8AWjWr4T3KSf0rNN6G2NXlF4jaIoti7KnYz3jikvTZrgYXeTJim59OAphvim/FWtjqvbHcA+lyYP2FO272r+IkzVVh2uJcDBiPmrC2wVtQifg06aatkba0OW/bMcHzUXdnbjcDkGgNcA3Ly3jxUWLqNKvt8UkXTK+rHVcyrNE9hNFS5qTaZ8TVYuob+p7h2NSsX2FwmZJ5jtVm4yQvZR2W1p2cncQPPIoyOLiCeQeaSwxVFPJmjoPVGwINQcqwh7c1VC3Xd9LHRGa3gf8A+kivDOb3RZW6STyeexr2n9T7jJ9P8wtrJLJpUA8nxXjHHdFZ9mV46MLqtluCeatC2V4IboxOxlTOLuOuQRB07VSlcTiGJtI7qDvAra6dC9TYKyltcnN1COSR/vU7fQ/VthG9LINJbuCsUZN6SPYhxcbhXeio+mCfh8LjLlwFSWUbiDW2MPkJ6l6nyPAWgWOJuJbG08mK1/lWTZ7kFy5ZzTBjDeudXujetndM5n/h+bZBmqEI2FxVskA8QwNCCXdd9HFyurV2I/tNfSbO/pAcv/F4K9gbOKB0vcWFcjmvNN+2cbcLkS5PbvX2N/8AiK9G2fqD+zblXUmHtC9cwTWr4KifZcTf+8V8pco6X/GIz2resho2G4NdjjCawc0W/wBmP5Npa4lu8sLPA7VmmHyNWIdRqA32FTv9F4nIMywuKxmGKYO4AruV2/rWWJlyi56YUgfwnsRU1wt2mTlyNmPYcNlOOtYvD67bKw1GvfH0g6nsZh0Xgb9u6Gb0wCCe9eJcwwBW0UHHx3rdf7M/VJL4jI77Qye9Ax7fFcvyONKGNnX8fkuVI9fZZjDirZaRsYFWCYx7VwtwDVL07ZaFKt7YgA9qu2wdy+GXQdP8wFeA4xjKme5bSoqc0tX+oSLW9q2h3C/xVkOQZJkHSGC/F5i/pKBqYvyTTGDyhsNhVu6ZaP6VjHWPTd7PLOprjsicW49tda5YwwW4+CU/NlN1j+0LiM4xdzLMg/8AlGDTdsV6ctcjx4rfv0q6qwuO+mty49x8UbS6RexCjVdcjcR960lk308y/MxaXGYPSg5ZTprYuAsYXp3KUwWBQwv5UXj70/aPRtml8afJNO8IxzN8dewWYYnFXSLeoQtpBpAq56a9Zcq9W7y51KKpc0wV3Msxs2HBa5cYFjzArZOGylcHhbSsAiKvtDV5sI5o7ppuXZAznV3K8JbLEqp2gmhXMVazywXPuMQa139Q+sVXHLl2GYPcBliD3q06Bu4m4AbjlJPuBPam5IrVnT8dpywZVkOLxWV4n0Q7IhOx7GtmZRmuwW4C23J71ieKy1b+EFy0JZfdIHNXuQ3LeLwwZT7gIK9xXDOMoywcnyePjcWzVX7YWRr1L9Hs/VUDNbwzOu24gTXxt6I6GzHrDPzZsWm9NX/eORsonzX3E+pWXrm/TeYYN0JW9ZdNJ7yK+ZnRFnC5NmOc5LZwyYXE4XEsjgcvBif7V6n/AB/IpOR5HykuLjiZNluDOUZXhsJbQE2lCgzXd92AJedZpm3ci5723444pbFXBpYsQuoxIM163a3g+fmrTYuLnqgqTvSt9ttzEcE1KA1wqhOwkGOaXe6wZgwDN3k8U3SSyjn7tK2DtuLry3ak8XiCxIJB+1FZmklQB96WbYF7m++y80+2dKleAFy5bVVY7nvtxSuKYKvqJvvEjii3rihuAoPYjY0piQAPbEHfSDRS/ZNuV2Li4HdjqAMfrShY27x9qlTtzNTxIYlNO08igvbKXJtKXkRvU76ukBS7SoXxisLkrOg8gbRQWuaDtdDjxFFdnX2lSZ7E8UneUqY0BZ71pf1jrkafUXxl4WrgIDFm509q7TFLcWCpP+oV0xKIS3uI/i+K7QWriC0rTq7Hmi5YXUftKKytkrKkMzk7kyAe1cqF23pcAEqo2aSJrlRcmxsG3/VNx+Qy+DQ1dQSG2IO1BLHfc1y2Tr5qsVizkrs0HW6S/tgjx3plLgiIiexNJ2Pz1Jf46bqOlTtFnZJUKrNBH6VM3FVySx+BS3MTvtUbO7vO+9T7XhoE8Fhau3CpOshRvAFGt4hBGgld5PzVZbYhjuefNON/5H6VrrQqyuzG0xJuMQZjij+v6SxJmqvBElxTt78w+1B+h346DriFZdQAnwa7t3oYshBjkCq+yfcaJYJF8/ajF0RlTqy1XElV19z4phMc9sLpBk81SuT6y700CfwxM70ySdMdR7OkxH6n3bj9G31S7ous6gMOK0bhbGdo+m3j4+Qg/wC9bn+oJJ6YTf8AiFawy4zac966oRWisZSi6TO8Ng+o73t/xeP9VoU+uXdTAaWz4iO3pCmcATB371cN+SaT+FpN0zWnXVjMcEll8wx64tiCF9mkiscyfNSgKs0jVMTEGs9+rij/AAWwYE+a1DgyTjBvU6XYTUUfXb6P4iz9fP2ObuSswv4y3gHwTA7kOglP+1fNP6QYXD4H6j43p7M7YtlbzWtLCIcNEf2r3l/8MG679C9TozsUGIQhSdhs1eH/AKyqMP8AtO5+LQFoDNWjQIj3/Fd/DickI90ejfqF9Pcj6g6CxGWtbRLwTXaZV9ysOK8pZUj3LWKwl9WTGZc2kq3LJ5r1vfYnCWJJMgd/ivLfUQCfVvMVUaVKGVHB2qnK23ROOytuXlvAllgjgUX6f9R3OmOr8Jjk/J6mh5/lO1KXDAuf6qquMcn3rlfHGmdMF1eD6R9I4/8AG5bZxKMNLqCNo7VnuWYtLQAumZPFae+jDs/Q+XlmLH0V3JntWxbZOlf0rwOaKyz3eObao2Kb+GOXMTbCgDkUhbe3esaWUMCOdqGN8muf6KVyzeyleapuz2uN/wDjQFsNfa5psWhbSY5q0tYa3gLLs59W9p2NP2QA3Apm2itd3UH7is27opbQl0d0xdfF3MdfRnZjIJFU/wBWeuGyfB3cPZBV1ELB3mtv5AoGAWABt2rzf9ef/qt4dtq6OPxXY51LvJp+jCelcFdzHNPWvk3GuHUWO9b96Z6SH7u6rCGFaa6PAUWY29vat8dIsf8ADbG57VT8nk7oeMW0bDwHT9u3gVDPq9u9YzkQt4XqS8lhvYxKsDWTWXb/AA4+4/lPesbyzbMkPck70Pl1FRdHi8E5cj5VN2N9bYJbmDcrxB2r5gfUjIG6X+vGdaP3drEn1kAGzT/7zX1K6k3wRnfavnJ+0eAPrPl0CJtgH+prk+DydefrWGc3Mu/xLl6McbEBfzQWO5ApS4xn2gAc71ly4ayVB9JJ86RS92xbDNFtR/6RX0dqMsI+cjpmNlvZrBCk1V4tma4Qie0c71lGIRfSPtH9Kpgo32FNbcgOKVIpzeLztP2pe+To2aPvT2OULYJAAM9qq8X/AOetOnZTqqB3nViV0kkDckTSd29/KAQtSxzEHk81Su7Q3uPPmknyOMWN1TfVlhfu6QjxBPilcVjANxpVx8b0piHb8J+Y/wBapMa7Fl9x48/NGLbXZl3BQyi3xOLAQMPzHuKSv3zctr7Y7RMyaxzEXX9aNbRPE0vi71xQIdh9jTRS2cijcrMm1FrZRiBHEUst/wDD3NRIKxzG9Y7cuvo/O39aBh71w3bkux280rymizbjoyu1iWuMdSaQdwWNcrGb";

            if (imageBase.Contains(","))
            {
                var xxx = imageBase.Split(',')[1];
            }

            clientCreditAnalysisModel.Age    = 35;
            clientCreditAnalysisModel.Gender = GenderEnum.Male;
            clientCreditAnalysisModel.ImageFileUploadBase64 = imageBase;
            clientCreditAnalysisModel.ModelType             = CreditAnalysisModelTypeEnum.Modelo01;

            var services = this.ServiceProvider.GetService <ICreditAnalysisService>();
            await services.DoCreditAnalysisAsync(clientCreditAnalysisModel);

            Assert.True(services.IsValid());
        }
        /// <summary>
        /// Verifique se a imagem apresenta conteúdo explícito
        /// </summary>
        /// <param name="clientCreditAnalysisModel"></param>
        /// <returns></returns>
        private DetailedResponse <ClassifiedImages> ClassifyExplicitSex(ClientCreditAnalysisModel clientCreditAnalysisModel)
        {
            var classifyPerson = this._ibmVisualRecognitionService.Classify(clientCreditAnalysisModel.FileUploadByte, IBMImageClassifierEnum.ExplicitSex);

            var classifierClassPersonResult = classifyPerson.GetClassifierClassResult(IBMImageClassifierEnum.ExplicitSex);

            ////Quando ele nao encontra, verifico a inversa
            if (classifierClassPersonResult == null || classifierClassPersonResult.Score == null)
            {
                this.ClassifyNotExplicitSex(classifyPerson);
                return(classifyPerson);
            }

            var scoreRiskPerson = AnalysisHelper.GetScoreRisk(classifierClassPersonResult.Score.Value);

            if (scoreRiskPerson == ScoreRiskEnum.VeryHigh || scoreRiskPerson == ScoreRiskEnum.High)
            {
                this.AddError("Possivel conteúdo explícito na imagem.");
            }

            return(classifyPerson);
        }
        /// <summary>
        /// Verifique se na imagem possui uma pessoa
        /// </summary>
        /// <param name="clientCreditAnalysisModel"></param>
        /// <returns></returns>
        private DetailedResponse <ClassifiedImages> ClassifyPerson(ClientCreditAnalysisModel clientCreditAnalysisModel)
        {
            var classifyPerson = this._ibmVisualRecognitionService.Classify(clientCreditAnalysisModel.FileUploadByte, IBMImageClassifierEnum.Default);

            var classifierClassPersonResult = classifyPerson.GetClassifierClassResult(IBMImageClassifierEnum.Person);

            if (classifierClassPersonResult == null || classifierClassPersonResult.Score == null)
            {
                this.AddError("Não foi possivel classificar como pessoa.");
                return(classifyPerson);
            }

            var scoreRiskPerson = AnalysisHelper.GetScoreRisk(classifierClassPersonResult.Score.Value);

            if (scoreRiskPerson == ScoreRiskEnum.VeryLow || scoreRiskPerson == ScoreRiskEnum.Low)
            {
                this.AddError("Não foi possivel identificar a pessoa na imagem.");
                return(classifyPerson);
            }

            return(classifyPerson);
        }
        /// <summary>
        /// Responsavel por fazer a analise dos dados do cliente.
        /// </summary>
        public async Task <bool> DoCreditAnalysisAsync(ClientCreditAnalysisModel clientCreditAnalysisModel)
        {
            /// Validamos se um modelo foi informado pelo cliente,
            if (clientCreditAnalysisModel.ModelType.ToInteger() == 0)
            {
                /// Em caso de negativa, informamos ao cliente que o modelo nao foi informado
                this.AddError("Modelo não selecionado");
                return(false);
            }

            /// Preenche os dados do upload
            this.FillFileByte(clientCreditAnalysisModel);

            /// Gero um ID para o cliente com base na data e hora do envio
            clientCreditAnalysisModel.Id = DateTime.Now.ToFileName();

            /// Faz o log dos dados de entrada para possivel analse posterior em casos de erro ou melhora do modelo
            this.DoLogOnBegin(clientCreditAnalysisModel);

            /// COnverto os dados do request do frontEnd para ToCreditAnalysisMLModel
            var creditAnalysisMLModel = this.ToCreditAnalysisMLModel(clientCreditAnalysisModel);

            /// Crio o objeto de container de resultado da analise de credito
            var classifyPersonalResultModel = new ClassifyPersonalResultModel()
            {
            };

            /// Faco a analise de risco de credito, e pego o score
            classifyPersonalResultModel.CreditAnalysisScore = await this._creditAnalysisMLService.ClassifyAsync(creditAnalysisMLModel);

            /// Crio uma faixa de risco do score
            classifyPersonalResultModel.CreditAnalysisScoreRisk = AnalysisHelper.GetScoreRisk(classifyPersonalResultModel.CreditAnalysisScore);

            /// Faco a analise de nivel de não pagamento, caso tenho um indice alto de nao pagamento, nego o pedido do cliente
            if (classifyPersonalResultModel.CreditAnalysisScoreRisk == ScoreRiskEnum.High || classifyPersonalResultModel.CreditAnalysisScoreRisk == ScoreRiskEnum.VeryHigh)
            {
                /// Adiciono uma mensagem ao usuario e para o processamento
                this.AddError("Analise de pagamento em dia baixo.");
                clientCreditAnalysisModel.MessageError = this.GetFirstError();
                return(false);
            }

            /// Faco uma analise da self do cliente, onde analise se existe uma pessoa
            classifyPersonalResultModel.ClassifyPerson = this.ClassifyPerson(clientCreditAnalysisModel);
            /// Faco uma analise da self do cliente, onde analise se existe conteudo explicito
            classifyPersonalResultModel.ClassifyExplicitSex = this.ClassifyExplicitSex(clientCreditAnalysisModel);

            /// Apos a analise da foto, verificamos se ela e valida
            if (!this.IsValid())
            {
                /// Caso nao seja valido, retorno a primeria mensagem de erro ao usuario e para o processamento
                clientCreditAnalysisModel.MessageError = this.GetFirstError();
                return(this.IsValid());
            }

            /// Continuamos com a analise
            /// Fazermos a analise dos dados informados pelo usuario em relacao a self informada por ele
            classifyPersonalResultModel.VisionFaceResul = await this.ClassifyPersonalDataAsync(clientCreditAnalysisModel);

            /// apos a analise,salvo os dados processados por ela
            classifyPersonalResultModel.Status       = this.IsValid();
            classifyPersonalResultModel.MessageError = this.GetFirstError();

            ///Caso o processamento de imagem tenha retornado dados
            if (classifyPersonalResultModel.VisionFaceResul.Any())
            {
                /// Pego a idade e genero do processamento
                clientCreditAnalysisModel.VisionFaceAge    = classifyPersonalResultModel.VisionFaceResul.FirstOrDefault().FaceAttributes.Age;
                clientCreditAnalysisModel.VisionFaceGender = classifyPersonalResultModel.VisionFaceResul.FirstOrDefault().FaceAttributes.Gender;
            }

            /// Faco o log do pos processamento
            this.DoLogOnEnd(clientCreditAnalysisModel, classifyPersonalResultModel);

            /// retorno o status do processamento
            return(this.IsValid());
        }
Exemplo n.º 16
0
        public async Task <ActionResult> IndexAsync(ClientCreditAnalysisModel clientCreditAnalysisModel)
        {
            await this._creditAnalysisService.DoCreditAnalysisAsync(clientCreditAnalysisModel);

            return(base.ApiResponse(clientCreditAnalysisModel, this._creditAnalysisService));
        }
 private string GetLogPath(ClientCreditAnalysisModel clientCreditAnalysisModel)
 {
     return(@$ "{InfrastructureEnvironment.ContentRoot}\LogDataX\{clientCreditAnalysisModel.Id}");