Adyen Android implementation guide
payment_processor_type_id: 11
This is integration where user is entering PAN data in our custom form where afterwards those data will be validated and encrypted with help of AdyenSDK.
Import the SDK
Add the SDK to your project using gradle:
- implementation "com.adyen.checkout:3ds2:{version}"
- implementation "com.adyen.checkout:redirect:{version}"
- implementation "com.adyen.checkout:card:{version}"
- implementation "com.adyen.checkout:cse:{version} -> needed for encrypting card data (tokenization)"
Note: Examples below use 4.12.0 version of Adyen SDK.
Card tokenization flow
Tokenization flow begins when user chooses to add a payment method. First request to be called is generate-tokens.
GET {{MENU_API_URL}}/api/payment-processors/generate-tokens
Response example
{
"status": "OK",
"code": 200,
"data": {
"tokens": [
{
"payment_processor_id": "5bab16ce-bb27-4e62-aff4-124266647eaf",
"payment_processor_type_id": 11,
"token": "mt-card-20230213093937-a0870ae0d544",
"additional_info": {
"client_encryption_public_key": "10001|D3F992441535CA28785D3F85D2483B836CF1835EAAD3C8A3526EC17A1A69A787AE6C8C83B560A2E7680875C07C7198496C9A929C1D697B15986549EF8C2D77EC2376BF238186D3B1AB0726F355D134FBD53C21E0A4F537D61404643ECE40056890BC16934F56BB02AC38F4A51FAC84CBD9BBEA99FB8AB799143A69577DEBD48CE5217CC5CED536EC5276CEB2786D9786576D00E0825BBED137FA6B0C203827CB4B5AE7AEEF41AA18B85EC9119D8137BF5470092AE49362B2794E87CD776857FFBDA57E07297295D950721DCEC21BA383260A8BA1C9D0D1D969B8E8732A8D2B528436EFDAE6E88BAF73644D0D854FA8F100CEA4AA0BA70958A3D01C0C5369757F",
"client_authentication_public_key": "test_5ENNDFPVCFCQFHYQN4G7M2NYKIK4ZVT7",
"reference": "mt-card-20230213093937-a0870ae0d544"
}
}
]
}
}
At this point user will be prompted with our custom form. After collecting PAN data, we need to validate and encrypt them with help of AdyenSDK. Those data will be sent in the request payload of store payment method.
@Override
public void tokenize(Context context, CreditCard creditCard, CountDownLatch latch) {
super.tokenize(context, creditCard, latch);
if (CardValidationUtils.INSTANCE.validateCardNumber(creditCard.getNumber(), true, true) == CardNumberValidation.VALID
&& CardValidationUtils.INSTANCE.validateExpiryDate(new ExpiryDate(Integer.parseInt(creditCard.getMonth()), Integer.parseInt(creditCard.getYear()), true), Brand.FieldPolicy.REQUIRED).getValidation().isValid()
&& CardValidationUtils.INSTANCE.validateSecurityCode(creditCard.getVerificationValue(), getDetectedCardType(creditCard)).getValidation().isValid()) {
UnencryptedCard unencryptedCard = new UnencryptedCard.Builder()
.setNumber(creditCard.getNumber())
.setExpiryMonth(creditCard.getMonth())
.setExpiryYear(creditCard.getYear())
.setCvc(creditCard.getVerificationValue())
.build();
try {
EncryptedCard encryptedCard = CardEncrypter.encryptFields(unencryptedCard, clientEncryptionKey);
properties.setEncryptedCardNumber(encryptedCard.getEncryptedCardNumber());
properties.setEncryptedExpiryMonth(encryptedCard.getEncryptedExpiryMonth());
properties.setEncryptedExpiryYear(encryptedCard.getEncryptedExpiryYear());
properties.setEncryptedSecurityCode(encryptedCard.getEncryptedSecurityCode());
status = PaymentProcessorStatus.SUCCESS;
} catch (Exception e) {
status = PaymentProcessorStatus.TOKENIZATION_ERROR;
latch.countDown();
}
} else {
status = PaymentProcessorStatus.TOKENIZATION_ERROR;
}
latch.countDown();
}
private DetectedCardType getDetectedCardType(CreditCard creditCard) {
CardBrand cardBrand = new CardBrand(getAdyenCardType(creditCard.getPaymentMethodType()));
return new DetectedCardType(cardBrand, true, true, Brand.FieldPolicy.REQUIRED, Brand.FieldPolicy.REQUIRED, true, null, false);
}
private CardType getAdyenCardType(PaymentMethod.Type type) {
switch (type) {
case AMEX:
return CardType.AMERICAN_EXPRESS;
case MAESTRO:
return CardType.MAESTRO;
case VISA:
return CardType.VISA;
case MASTER_CARD:
return CardType.MASTERCARD;
default:
return null;
}
}
clientEncryptionKey value is from generate-tokens response additional_info.client_encryption_public_key.
Encrypted card data alongside with token from generate-token response are sent to MENU backend in form of properties object to store a payment method.
POST {{MENU_API_URL}}/api/customers/{customer_id}/stored-payment-methods
Request payload
{
"payment_method_id" : "27fba64a-68cf-11ee-8c99-0242ac120002",
"payment_processors": [
{
"id": "5692b6e8-68ce-11ee-8c99-0242ac120002",
"properties": {
"token": "15955073795f1982b37de39",
"encrypted_card_number": "adyenjs_0_1_25$LErvTHwlFs3ghKKBvpaHSI4AW9dXmKHI7uFvi1wOmgX0aYKs+qH+aE4af4NxeM4VvthsL2QP4ASpgA6n/2k7Fews4x2Ot0RaHXMmPC/XQA6Dm5wLS4y/t/o4Tryoh0jM+tLYshEmDFxCypb/O2qiQ0BIkjlXCJ+3pRt1Uj+HNrgWZ0ZHz+VW3iHXyRiBbm2HOdCr86D0WDzmaMASc2aanoLEqnB19zm2ZX0KL98CIdQsVUGE3n6qVCnDFYY5nyQl6sA0hmKCMa9oBFJRlOyhcOiSnutvCSRhkbnhpH1pf40ETGojYSZ3pJTMev+WlPbtPTrDThh+QRGbqrHnL0ldIg==$PK5Y4o3B+2yH2D/EbaHcPpOU7MfQatjCiRg2CT9BI6TbjeVOAXDFQQ108bEXVEMDwdj/fh8rAbKlPlDrf3K+OVIGFg6u6FUA7RFG7pdh+fMNTgDF3To3T/M3N+XhGPGvz3AYFZI8Rjis06zwCEwE9fdxV5WXdb+JtTHmWgXbFbZn8VRIzFW/M0T6U0elIuqaa6wHSNO1Zr69XFYaTJrsdPZ7/sdAMarYGXLn/Pr59QPQHJzDGnfEELPHVcVsdrKOAtriDwIaITJcYzdpQHOCKCrZsKOOiLlfX9b71xK+GwoDUVRNgWJaswp6ekyMp9fKQg+6AHlbLCwNzPE0adNVw1hghMW0CpAgKv/imjmfU1YJdgqR49DQ5+BTmiEmCPgpgIg87bqddnZRo4Bq/2PWV7TVZTph1S/+15P5u9Ntn6abxoRsB05Dhnao6+1KLxwAPiVMXAFeFJTdPZKZ+WnYdp3okMVpQYH+j+iPmiYJ1zkWwoAelsAZXdxC70Fhh6h4VObZa/M2RggXlo5kQJu0O/Tv9bw2YW1E+oxgYoJOVS815vcU6/7XWtodhtS1/Ww4+KHWrDxXg6J+hHNEpJsQXoA7SbFYHTXcKmMHIaMFsjcm8TC2xN+Om5hzTWCnuFgUVGgPOhmeFGj4mZm/VWnRSEW6z4+yQ2Fql6N7gZANWSIHaltiScP3HMHd/bR7fz8fRBX4tkYJ4WYVAvyUuvscma7YHndIyge9BMN5uxQTt0Yd7XNXRheEUnXQqq+l5CAV3Glx2dM/PEryIa1jrEBCGbbIVfkpHRuQo6YVDahQ297j9oDuhqSxrJueypEI86xUt//ZXpJ/dxcSbyWtEE9evxfYsX14S9rKV6PzhdPM2IASDTrsdFJSNp0Olo6H1MR30uRrEw3rJyO8XRz265xSaqnfsZtdwxpzdzbp8GPHonzKPIEM4bQdo2aIb5z1onEmUs1AbiJJWwUwq0ZC7VgWMpuJoKh0WArFJi5e1udBtQ2D0BgbW4DuSWvflZBCwFEWWkeT7H8QAbREmYvIYnAEuUPewXUAsNUnrpaf0RYxP4oOeXONxWZMC9HOs0O5s7pBm+fhDinJXCJsrok9soXW3AsG13qhWR+fHNjyaGZI/fKidmUd9YD0U17qv6zxeYmumJgJwYNSaEWHtVZTZMyRgN1yzVMQX1I73+ZOmBhq9vNIY8nNUg+e9nV3QkHbaLfGgkwU",
"encrypted_expiry_year": "adyenjs_0_1_25$EqFO2ebNPKxopCkwL5zF+4uuu5Qd9ftr3a0bhFJTlY+xtjOAKV0EGZom9e9xbAQE9AnSHWzo9JRb3rPQJhSwEnP/kqVrYwmIzJ41XFq6ilQuw5/YivfS8W+5euKssIbGCtfETmVy3dyzrvrRDwhEOqM6BBvbH9kMhIOvaCcuYJIh0VIr0Q2I2QWd354L2gjxIkuVU2iFhyzG5Z9fOlQHFq29AK4TNgdI90QxWlRTUln8bckqdH6OflqyEiDNcb/mrc5xGJhw/4yJjynfdf0urL8XDV/PfxkeFxAbpiwmrOMnxGwPNj6IHScj1MxHBDXEF4MFrJAi8bHEZDBtqe78Iw==$Puh84mZjXh0Fo5H9ZnRF3Q97Sv/3NEIFNGJEmZZKKENW020WIfJCRIeU43v/AVDKpk6kJikSf5DgvJuk9HCvginDtnMcLeK+sqdRYgRVSeCgB44WX/tVXJaZ05xircOtwJl+A2WGCxlTeZFr28Jz35/G7FPPnkbNvHUTH94n6CiqArh3TSYyFlxs2nayLfM6y5wOF8N6LczNVx6kWxC2/XQRZDIZBYM8USktpeUzuaEhr9T3BAMAF8XM+kQnyR9z+qwo1/KsbwhF3KCZIEpnvdSo6UEzeoDF6NA44JBW+PCcPxiaCCG2xgIwBC4iJqwpadP8vrgv7g5hm22lPtz2hK8TbFVYctPunHoLp4MCP7tg1LTdBOcKf/8JtteX/s9l9EWfcdJYfjXjINDv4HDU0F0iqDzTZrDdZ7wasxtpv238BXvnzXa3B104O+aOxeR9OdTvKEFbHShgpA==",
"encrypted_expiry_month": "adyenjs_0_1_25$jNa72datXROYRMlsw0+9QU1r46U1RemKcFdp5tTkkhSHvPrVh000hypYC4Xbm2oyTHCoEDkITA3SvD3KTCrR/QuP8BSnHXmUQTKGq0QOxd3nXxVyV8zXMhso7p3ro115UIIhudHL0EIahuJNIAJCHIiD15dnSVMlG58rpAq/3maCsqTqh0ur6Rv0KMbOQwnIhUcSzGnYARk9MRpcyaaclREuvWkv5PfRIVLTp75GGUmAHDMaApIpd/VlgSZGQhpHGRiN8t1U9bmBDEnEB2qGUJsVEHG55hBmGs8k3yhDguvS1BhZUcMaG8l2IPoBSkWFF6wlbj1cKvVj0rMypIv79A==$HTpVDsHsBvkAYiXmxURNKf4Yla5lLnutiWzcZ8hl3MacoY3LTe9WwVoIlFRWOJgO8Wq4c3L1cKvJSxw3deQtN9tBlp7sh1s6zcZw7I6lH/Mr13HPeU6jgWvuyh2ycSu/kCjaxqQoi2AricAOqTjAjbOh9oudznqvCLjClyzgWjQjcBy3MPMd2MNa5ZDf0rCDcR83mMUqT8EnrdlHJ3DR5M9g0M/0raXFJ2TeLnm12EuBcNpwFjLqj+gj+LstbauyeeWSLCbVy6h5m9AwE3P0WoyZJG5nEe0hkCaXDRYrfCzTW7H3rujfaw/vuUZiiMKzeZOh8NWftynCNviXTpS724GB7OWLBZs86S9THln1wrEAvHEO1yHmyuYCddMZlNCqZhWsL2mCIQ9nUVGNlWLBTpH+10Mu1H4Zz8WXZes7Rk2DM10GnjGkSix5UZQ0tj15FCYB702RrFoA",
"encrypted_security_code": "adyenjs_0_1_25$jxb5fZTXLsu057nmeytyPyDb43l8gej4kZs1fJkZkm7TOkAEk/W6uMchGREaNTplaLS0rOm9RrlvisGnw2NwvfYFVmiyY0BsW2StsB0WNis+Tsr9MyHvQkOnwbFgGi6RNot0X7P/6CkTN96ZmU5a5sCFUpZiMPwCnkg58a/pj237Mz6Ux5Dy8+EX2A7BhVg3l7ENZGYR65ySRVjp5B/m8PrAfSxukn+i6OfgmaVg0sEgY61uAYyg78/HQU3QxinTzUdHXOgFQRhZo1elbTkEGQTNSa5zp95PEwSovxWceQ2dj98X333fcVarcX2ZkxgPb3rtVww8KNM/NVBwGsl4IQ==$SOiuQ2Ld9az0RyKhFEu9ccIzbIG4gL8VrGQ3Gfy3gysGZM+ts0Jq4hRb/AtdpXsEzvicuIdXAmzAhgwgB60Zpm+tksMtMP3elkZSJCRDztNozSoCTWlZAwLnp0GaKkjFCl+wFH/yy0smlyZc6hegzBhPaAkhtz7UICqgerQMupWG2mf6hBfKsRFg5pwL2DvagA7SH/JzDmhml9rluFtPdhZIwRSdSJkeiH3+ksWu68kfn6jDZuuzhM+/Ps80X1Rlu5r3JAcsDa0MAjayCWI7b8RS7Uw3mibVjzRJOyNDLlxVH50PbYZ6jzbWbHdIrYK4DtQkelJ8Et+E/59CSV/6VXUn6jK7rf7zhr82d7YMDrvkVRiSp06JtZRoYPU4zXwsTgnfP5vSmF66xYdmTfGmOiquc47hhH5u3xlDJHxRGhbdgFtcrZaI8YEcCgzIRBYRpEA="
}
}
]
}
In the response of stored-payment-methods request, we receive a fresh state of all stored payment methods, which we use to update the UI. [ common for all our integrations ]
Initialization of Adyen SDK components
In onCreate() callback method of you Activity/Fragment that will host Checkout views it is needed to initialize SDK components like Adyen3DS2Component threeDComponent and RedirectComponent redirectThreeDComponent.
private void initateAdyenSDK() {
if (coreModule.isPaymentProcessorAvailable(PaymentProcessorType.ADYEN)) {
threeDComponent = Adyen3DS2Component.PROVIDER.get(this, requireActivity().getApplication(), new Adyen3DS2Configuration.Builder(getApplicationContext(), coreModule.getClientAuthenticationKey()).build());
redirectThreeDComponent = RedirectComponent.PROVIDER.get(this, requireActivity().getApplication(), new RedirectConfiguration.Builder(getApplicationContext(), coreModule.getClientAuthenticationKey()).build());
}
}
While initializing these components it is needed to pass client_public_authentication_key (this info is available in payment_processor object inside init-application reponse) value to Builder constructor.
After components are initialized, next step is to register observers on those components.
private void observeThreeDComponent() {
if (threeDComponent == null || redirectThreeDComponent == null) return;
threeDComponent.observe(getViewLifecycleOwner(), actionComponentData -> paymentViewModel.handleActionComponentData(actionComponentData));
threeDComponent.observeErrors(getViewLifecycleOwner(), componentError -> paymentViewModel.handleActionComponentError());
redirectThreeDComponent.observe(this, actionComponentData -> paymentViewModel.handleActionRedirectComponentData(actionComponentData));
redirectThreeDComponent.observeErrors(this, componentError -> paymentViewModel.handleActionRedirectComponentError());
}
Vault Payment flow
Vault payment flow starts with payment initialization request.
In the payment_info object, you should include the stored_payment_method_id(id of the card used to make the transaction. Ids of tokenized cards are received in stored-payment-method request) and the order amount.
POST {{MENU_API_URL}}/api/payment-processors/init-payment
{
"order_info": {
"menu_items": [
{
"id": "5dd314ba-68cf-11ee-8c99-0242ac120002",
"price_level_id": "65b5643a-68cf-11ee-8c99-0242ac120002",
"quantity": 1,
"type_id": 0
}
],
"order_type": {
"customer_cash_amount": 0,
"customer_phone_number": "+3814865482",
"foodspot_id": 0,
"id": 6,
"pickup_asap": true,
"serving_time_id": 0,
"tip_default": 0,
"tip_max": 0,
"trigger_type": "1",
"type_id": "6"
},
"singular_point_id": "76f423da-68cf-11ee-8c99-0242ac120002",
"tip": {
"percentage": 0
}
},
"payment_info": {
"amount": 245.0,
"stored_payment_method_id": "83155ec2-68cf-11ee-8c99-0242ac120002"
},
"venue_id": "5336c182-68cf-11ee-8c99-0242ac120002"
}
Before
init-payment, we don't know if webhooks are even supported, so we need to sendorder_infoviainit-paymentrequest always. If webhooks are supported,order_infowould be used to create an order by the backend side, if webhooks are faster than the client side.
Currently we don’t have webhooks supported for Adyen.
From here on, based on the response of init-payment, we have different flows:
- If
init-paymentresponse containsadditional_info.approval_urlandadditional_info.approval_actionset to null, we will skip all validations and proceed to the order creation.
Response example
{
"status": "OK",
"code": 200,
"data": {
"payment_processor_type_id": 11,
"payment_init_hash": "06c4f95d386f00046cff8ded5baa296a",
"allows_webhooks": false,
"expires_in": 899,
"status_polling_interval": 5,
"additional_info": {
"approval_url": null,
"approval_action": null,
"client_encryption_public_key": "10001|A3795C2E0A78E5FF639AB006428D5EC19166AF82C402828476442E44476AE3DB9BE22468C15D8744574080DE5697FB81FBC4A0E0AB27B3B33A2739F20B1A514C6DCCBA3414E36F8056D4E1C007B6BF9ED5579A47313BDB651A3A984864E927B3A5D47CDA068E6A5C3AD76FB88A4173BC57EE672D421B13B3434F2D4B03FC250AAD86D64121A1760C83289EE7097A4643E493333ADE8373E9FB36A24F156C4B42D404879BBD8896705E0E91CD4F8BEC0E02A3F38D6EE275B6440F40B40E88B3D1B3292ABB331F9CB10E11D5AC81977ADCD0C22B7ECF009D608C651CC1FD7D4AA114B2130C6E82272224248B29CE4529DE93E5D010BD3976557067FD48E090B653",
"client_authentication_public_key": "test_YTPZMKLO2JGCHJWC2CFBULMURAULV7DG"
}
}
}
- If
init-paymentresponse containsadditional_info.approval_actionwe are processing payment further through AdyenSDK.
Response example
{
"status": "OK",
"code": 200,
"data": {
"payment_processor_type_id": 11,
"payment_init_hash": "18ee368683448ceabfe089b918218de6",
"allows_webhooks": false,
"expires_in": 899,
"status_polling_interval": 5,
"additional_info": {
"approval_url": null,
"approval_action": "eyJwYXltZW50RGF0YSI6IkFiMDJiNGMwIUJRQUJBZ0FLTklkTFBIQWZQVnVZSUFxNmRLd3lYVGRvSFZsRnFXXC9IMFwvXC9BXC9XOFwva3N2S2VKR3V0NXA0TGhaUkw2TTBWTEoxXC9OUVBPZDRyUHhyMTc0Y2ZjSEJtXC8renpkcjdQTXBPXC9Ra3dzXC92b2pZcTlCeHRhWFNxVkdTUjk4VzZ6cTZwK0ZxaGlrNmFxUndpRjhESDA4UlYzWG4yNVMxdDNMU1RcLzcyQ2hOOG5na3VtQjY2M01EektRRU9UQWYzbUVWbVAwbVBpXC9ZTzM4cnJuRlVMcStSSmZCSlBCcTkzOElBc1lTMjUrMWtSbVRUdGVDMGoyOXVpdURNRzJvdlQzcHZmUmQ2b2lWTmpkbWlJekZ6V0hSSWhkRnNSbFRGXC9pVDlFNmVKTG11aFArVlwvaW5HQXJqVzI3UGJvempsT1l2MmJkSG9raEVWMG5peDhkbHNSM05JMGU5MW92UERxdnQ4NFN5M0pHQUNuWjltOHE0bk80cTB1TlRXWmlWVU1KZlhBXC9WSkhzNzA5SmpwXC82QzN0aGx2Y0U2Q1ZjMWduZnFrWERDOXZObDNjT2FMNHVVNFh6cjJhS1l0UWlNdVFiVFA3OGgwUHFOUmxXeWQxRmlQZEhnRlhaNXBWS0RoUmVyRW9pVnRoc0l3dkZiN1k1RHVneFNwYUk1SHZVdXJvNFVJTXRSQVhTVzZBTjNmSVBWWnc0eFI5S2JmcHJRK3RBb2JkYzVNV2JwQ3hkWm12U0JvdVV0VzVzWElvdnV2OVlVck50Q0p4ZG55N3ZDNzBReHFzUStTZ0c2WHRHWE9TUHJDVzhhd05iZU4xTVFtTUwwXC9JVmduOFduTlVUcGpuT2FnbmJnZHliRVN6MzdYd0ZCWThMbHl3dTIrOUxyMFVaSm1pVVA0dmFldjJJQmFiQnd5aHpMNWk5YjFWUlhxenZGSUFTbnNpYTJWNUlqb2lRVVl3UVVGQk1UQXpRMEUxTXpkRlFVVkVPRGRETWpSRVJEVXpPVEE1UWpnd1FUYzRRVGt5TTBVek9ESXpSRFk0UkVGRFF6azBRamxHUmpnek1EVkVReUo5STd2OGVkcUU4WFFmZVdyakx2ZVluMUhNNDg4SWM3RDBTems5eXJscVFCMU9zU2FXY2sxMlc2TExYaTIwQk9wRCtDTGkwVUpcL2hFdEYyTlhpaFl5dWhoQzdUVXBibGlIejRmQTBZWFJJQjdpa0ZyejBrUmpVenhCZ05SXC9HczZSSHlLbUtxc2RqamZDbEhDU08wZGJ6RTRXdnhLbDEwUGZwRDh2ZjlaZDFtNE51Y2o0OEJcL1RDN215MUpcL3JBRE9NUXY0RURUVXBNeXNmcUR2SGhKOU9qdjJDU3FDdDhwR09kYWcxT3luM1gyelwvZFVuWlpUb05GXC9FNDhKUDhPNHg1aXpnOUR0WVRPT1VpRXBcL0NvMFplbEZIaU9cL3o5VU9zNGoxVVZmamJYcGlqQ1VOXC9Ic25jd2trNWZzQXJNczBsN25DNUg2TURSQ29NN0dxbzNQRTFydVRXR1FNK2k1akpDR1EzT3ErVnhiTDh6N3F5REFMbzU1MWJSVzF0ZVVzZ1RhazlHZTVldTBnMm9BTjhPV1wvUmpVdms1OEZCd3FhaHpqdlQ1K1JQdkpNbGg0K2hzXC9iV3AxQWdZeVwvOGJUaTFpb1NOdytZSHR4cFBcL2UxbHQ4Yk83WmNZT2pIdDFSdU1ReEg1TTl4NHJRbmx5SFpMUHcxazlMWGc4Y1pUNkNwblFjVnNsRVB4SHBkRGdcL2o3XC9SaHpcL2xRdkxnbklWR0g0c0JmSDZ3N01QUTJNYTYrV0ZjUEhwblp3TW5pbXBwMERONUpGMWZRTW1lRlVpMHRPWXBmSVwvOEE3NDdzS2EzWXNFeGl6Z0c4WlZVb1BaQytUVklkNTlqaWUyRnpZMTZIekU0Q3JMN0NES2hnQmsrWUxcL21VUW9RSHdzUmNQU3BSQmZyZEc3eWUxXC8xcjdkMHJvalA2cEtSaTh4MGc3eEZNZG9JN0l3MTVXcHlNb1JVXC9SakMzbFE0N0tyYkd1RDA2ZjNWaEZURGpPTXVaejNEQmxJbXM4SWdmOEl6SXEyMkV3VHlsOU9XWUQwc1IyTGVUMm9cLzl5UGRsc2toWG44cXJwbzRncTg1TkVNN2tuWE5lTlwvSkxaQUkweHpXb1JcL3dDemhycHpyVERTb2JucXhEdHRtQ3BTd2J3alByWlZwWWY3eVJ3RFg4bmQ0bHdtSk9GdHZVSGdmaXJkRmNcL2xrQkVXZnk3K3dLXC9pT2tTYndoUUR5dEhVTmtVQnNKc0tMYXJwbHpjYXdock8zQnI3MHpWbWFhY1RRMDkxVG83c2J0c2ZKdVBKUDBibFwvTTVqbGxyNFVnVHhCblBDdVhlZ0pOK3hjK0Z6TE9SWTBhYlIyMTYwMUZCSWxsR2luSlJmZ2NHa0t0R1VBR2hveE5GSHJTb2NPcFVJYUFcL0YrZU9LSXBaeitzWUcrenk1YUQ2YUZLdFwvaDl3aFZlTXpDbVVnYnlET1UrdldqTm1jSUMxVmxibjVtc0YrWGI5T01MNHIwRzQ4UGNPU2RlY05pZVdWQzBqQjJ0RkluWVNCNDQ0MkVGdEd2Tk9LT1RTK3dCVElKeTJydFRjZXE4NlNidDMwMkczMTJMY1UrTmRuRDhVa0crdEp5dmliaFc4aFE1eTltN2liN2NxemdOYVF5c0tpZU5CRTlJREFIUlNqQ09lRG9vUyt4eHJmQTFvTE1EenFpb0paKzcyNzVHOStYWUZBdVVKMldqTitEQXpGVkJZWEJIWnNPRjhEY1l0V2RjVFwvaWRTZFwvdkNjVm5hM1hMTVVBUExEQmtvYUFxcEpLb0lMTDBURTBGZysyTW1WdXNpNTVhcFNwZTUzamtJVWpcL0FtRkVRNUkzY21KVmxBZWg0QmxjNThYZWNQSGloNnlUK3hvSUd6azdOaEloXC90SWtOQzlKcWo5U0tGamlveHFSeWcxbFwvcGQ5a1pMSHBVMk5ib3hMMEV6Zys5d25zbmdERkZBSTQ0SFJYaFFtMDRtaDhtSDZTMTBRSitFYlJNTjhzMjFRcjVubllWWDI4QmxkcVUyUVBMaVFzcWlrbmxoTk05U0tWZzloSERFZ0dSdm9KVk1mNmRxS1hlNDVpc24yWURBaFRmck50YXNnanRwUHNCNmpMUW80UXRpXC9EQnFZVHM1NVhGaG9jSmtUMGpsUjV1YnNqOHdYSzdrdzBLR2ZrWDBMbDBPeXVuS2JGS01jMjFvV1ZBT2VCa1JobW0wd09DWmdENEpGM2s2XC9uUURhSzlFOEpnY0JTc0xsT1wvcCtrZDRCc2Exd1wvYUoxNTNhaE1iSlZmWkUrZVBkdkR3MEdVTVY2Mnp0S3VMZWZCY3hZYVJyMHJHcWMzNU90K2hRWUpuTkFnWTNUaXZmOGFNZVpTTVU9IiwicGF5bWVudE1ldGhvZFR5cGUiOiJzY2hlbWUiLCJ1cmwiOiJodHRwczpcL1wvY2hlY2tvdXRzaG9wcGVyLXRlc3QuYWR5ZW4uY29tXC9jaGVja291dHNob3BwZXJcL3RocmVlRFNcL3JlZGlyZWN0P01EPU0yUnpNaTR6Wm1Sak0ySXdPREZpWkRSak5qWXdPR000TVRRM00yWTNNVE0zT1RjMk5EUmlaVGhrWm1Fd05EWmtPV1JsT1dRMlpUZG1PRGhrTkdJNE1HWXpZemd4TGpJdUg0c0lBQUFBQUFBQV8wMVBXMHZETUJULUwzbndTYnFjSmcxSllVanQyb0Z1N3NKOEVBYWxsOVJHMmpRdXFWREVfMjQyZlBEeGZPZTdmaU5BTWRwbUw2OG5XWGQ2N01kM0pXMnlwaUN5ZExkRjl3aW9Kd3hTVDBGcFRIeGVuQmVtblAzdEhnWlhlS2hYZGVuVXFBdlZMQUhUTzRfLUVRcWxsU3U2MG5aTDRGSVN4aGtubFBKYWxsVXJNUmVWQUI0Q2J5VDdyektYc1piV2pwZkN6VWJlYk1IM0NIME5NMVhCVnhod0RKSEFCSXNJZkNLSWdMU1B6YkZxMDFtNmFjZmU2dU9USG1pXy1qVFB2UDNJOS1Sa1Z3bzJHMzFJN1hVUnZrNWE3MFZFU2NaNGxKQThaMG1PYnktQ1lqMzFfYzh2WVo1cDF4a0JBQUEmUGFSZXE9QlFBQkFnQ2U1S0RkRVhBQ3d3NC1tU2tBWWRTRU95X0cyWlA5dkdZN29GR1JSb3VCY0dRS0Riam5DME14YzVHR0xJUVF0WTZKV0xwTUdmZUFXOEREX0pEYnkzRXB5RjdMZ2NTbTNCZGQ1R0dLWmJydWhJclJubjZEdVl4cTl3TDNacHN1by1tLUVmSUVEOXYzU1dZRmhNTWxDUFp0ek92T1NWUHFmNDl4QWJyWTh5OThtYk1EWV8xZ2h2WUU5MEZBM3BFMElLV0hfa3JjSjYtaXFhX3NBaTZpdnZKcHZnWVBmYWJ3RUF4bVQ4MTRGcHdVQnJhTkZfb01fVm1aSWJiTW44UEdyeFI4WWpNYlU1TUIyN1BXV202OXFoRGlBZjE1YnA4TWpEUnF2c0FkQUlVWHZpUHFkeFAtRzlKQmpBUXZ1ZHJNWVVLZU5VNzVzblpnem1sVDhNa29FNzNSRUV6UEpTbkljZ19CZGFFUk1feWVFVzAtQkxxNWpPSzRLYTg5c2NJTmJCT296V0hNd3BxRDZsVjBJbW4zN2VyUXBEQ0FFcHJKZmZsbzBIVGRvZmJzOWhuWjFqSER1bDlQY2J0LUZ4OTVkZ2pORlNjRDlwdEdyWUFaeExFa29TSERhRG1OZ1JEMGFxbEV1YUdpTHNJRjN2TDN3LUV6OElyUUFfcXRDZVBTVWp3alJ0NS1VS080OW5kYjdLb0dyaXB6blRqd080c3U5cVZTdVEwdkZpNnRPUE5PN0c3UjBlS1RzQndoOVA2SWhLZXdTcjI3RFVBZGpseEU1VGFfUHhjTEw4c1pxdzJEOWZOTzFsZ2dCYUhxR2tUbnZ1dzlVc3pMSlpZaTR1akJDbDRmWFFRcFlwUERlcHBfcUxlMmdHZTAwTmNJUFFBVTlpLXFvTjlfTEg1am9Bd2NzdXpVMW44U28yNm5vQXdBU25zaWEyVjVJam9pUVVZd1FVRkJNVEF6UTBFMU16ZEZRVVZFT0RkRE1qUkVSRFV6T1RBNVFqZ3dRVGM0UVRreU0wVXpPREl6UkRZNFJFRkRRemswUWpsR1JqZ3pNRFZFUXlKOVBMaGFCMkFrSkVodzd1bUtMUWo3cHptSHJqNzVGS0NHMzNRSHJ0S3pXQVROdmRYOGFUV1ozMmhUc0VNNHUyczhfclcxaUs4V0hlbVRDbFpHMnNxMllFMl9BTldPSEdfTHlLb2c5MG9PdVVIVXNLcTBtOUJuZHZseFpPWHVRajVXQTFORUQ2Snl5T0tBWU1sb0d4d1Y3eXd1Q1FKWWFzb0RRSEowM010Mll5UmJKMGZfaHR5ek1nZ1RjNHZQM2F2ak1MbGk3akFnOTJ5TEFCdVlLVy1IMjBMd21vVzViTVNLS0kteENkeTR3TnBCVWp0V002c0Y5SmlqeDlIZVZmQ1A5bG1WUERZWXlRUHVFcGlaSm95dEFTWUZVOEpDUl9qcm9nSnc4TEoyUHo1TDlnOVBkNGlrNGdDVjdWVWFrRTdUUzhJNUszVWdkRGVwdE5xMWZNZlNIdnRPUEZDY0JwSk14UEY1UUM5bXRmWFhnZGtoRUlhQXdQaXh5am4yRlJPV21UQ2F6TzJrSTFVV1Q1QUt5SUpfVlo3aG1qcTB2eVlEbnJ6bFItdk1Lb2Nod2xjaV96b0xBV0ROMG1sZUZMWDhEMy1hSlYtN29vMkc0QjV0TW9raUJOYjZiQ2prMnY2SVhHazc5bkxGVm9udE1LX0xWOGh3bDlpMzN0aXZxY19SQVpTVWV2QUh6MnBSdWZEMjBpeENTNktvdUs3a3FOUkhXZThWVXZaYnZROTVpMGdrY28zVG9YUC13cU1iTjFHaE5uU0U5dG91TWk0RkFBRUJBTFBHRXBIazhEc1JSQlBXaXBJLU53WWk4bkRWU2tzSTE2ejlPY3pwUmliemVqMlY1S0pMM0sxMTBRczl0TVFqM3U1a1czN1R2a0N5T2FnR3ZKNFQ3alBKc0pUa012VktJZTJiY2V3dTUtLWZTSExfa0pjWXlzblpRVjd1UDlNRVZlU0wya2p1ZWY5Sjdsc1lQRHhvbkFEQ3JDcmRqVUNXZnB4X3ZVamJycnVZNzFmODl0UlNBcnY1RnVwT2VNRkkwc001OV82TndtYm52N28yaXhGX0FuMFUyNFpicTBCUmlVeThjZW51cGFjTFAwWVZoU21fRnhORjV0TjI2Nkkzel9XblRhYkxEenJMM0JvdkVzUjBqVjI3SC1GMHh6bW1CdHdYU0NRNnFFV2JZZFRuaGRxbFVmMHlwdk52a2VvWGwzUU1yYVJ4M0tEMWZCSlJNSVJrNHZBTURmbW9LN3pvY0dBWDhXQmdBQUR5R1pxYXhGSXVsM2FKeG9tdVptTnFxQ01MZHZrSGFTVEtIZHAxQ2pRbi1aQ3hVZ1E0Y3FHbkVFUmZ5UzQ2bFJmbU85eGFiZkc5ZG9TckhZZXp0WXV0amZhTXJTTXZTTU5RRmU4NHMwQzV1UXAxRWluUExYRlVBRVJVMXlYQ3Y2d0dZSExMd1BieUFWVEc1ZlFfMFhJZEtxYlp5eExtQ256emxadDVOa2paRmRFeHNaS01FU2ZaNmx2Qzl3Q0kxYjBJWktkYlNIV3lmQzlPcmJhbnY3ZF9zU00zNkhRM2E5dk1TQmRac2ZDU0I3S0ZBcHJLQzBCajBTLUNZclM0c2VDaDhWXzhXQU9KbGxsOFVhakE4OVZZeVJRSlFEOFNFQUc4WnZYMGxiNy11UldFZ0phMDhPRDNmelFnSnVNNUVTTERwTlJzZldqMVgtZkpmdzM2RFhLRk5EVEdiQTl0dTd1WTN4aWV1a2wzdzlUbldWeFdTS2pUckpGQ19PY1RzVGllOS0tSGZVdTlHM2Z6QXNudEhxLTFmWHdnczQ2VmdOUlFYY2Q3dEV1akRnUURYbFRFTmRuTjVxN1htRHdiQXhQUFYxNTN2LWtZQXJnNHFFZ3NZc0RwbFdodTdSNVk3MmczeTVQZTJfTDlWWEJ1cnJfeVB2elFEZXU3MHNsM1dvdTlkSDBhR0JkQlZIWFU0eWtVME1qbDE2WmVKalkxMkJRMmVsQmZHMmNMX0YwbTNDdV9oZWpITmJsRjFzVFdUM0hWUzRXLWRWMkQ1bGFxTmtMNFQ5RVpieE9IWnZxU3JYelZ6T1BYTzM4SGYwVHFFUVZWQ3NlLUx5TEF4Mnl4ME1wS0JsUk1qNi05MEc3cWFFc3ViSFd2ejg5cVBiTWFBRXNrQjJFck81U0p6Wk1RSGRuV25tU0hKZFN2QVludTBTaDlGajNwQW5oeTNldmVPOGkycHdLWWFIMlpwVG1Fa0taczQyWjI0NnFjeUdic1dxTHFkeWxJNWVaelFPOXgxdWtLSUZFSUNTSmNJem1aR1hJMjNTUkRPTGRfd1ZrWGlrTkZoN3g1Umc3aW5MSXA5WnZyLWRaSm5lZzRkdUxUVXF3dFNzNXlGSFU2cFdzRnoyQ3gzUnFEaG1OQXpOX2FzV3FCS2JNUFk3M3ZwSk9SMElfcEhzREt0a25DRTZBbFhhMDlKOUpaMHpTdDVnODd3U09nX0tweDJuWUY4dGNHQndNdkt2cC1pYko0bTBtd0U0Z0FsWDlOZWQwTEJnSWI0dUhxbXFLak1nRFdoWnlRaWREU0ZEaEdXYXBJS3Vlc3FCS3VPVTNQU2hYTDNNbGRYemNaakVWV0NNVjE4bHZGYnI3UVMzNWpRNW5HODRwUWJoaHk0RXJUMTd4d0s5dktka0dfNGhWZ3lwY0o1akNNY3E0dUN0OHRDRk1KOU1tM3FhNkJoUVFESU5BeUNyZEpWNkFXRlRuQ21uS0s1SkQ0ejZ0d3lmMEVZc0xqZTZSY3I0RjZxRFR0ajNXZWZOcHRya2wtOHFGcC1GNVdFUzRQS054YWM2cjdnd1Ita29LOXJNYno4Q1kzYlpCV0F3WHFJVVoyRE44X2pDZVF0U25lS0p6ZFJKUTBJMGJPRkNvUmJWeXA3Vjcwc3FCc0l5bTdlWXRDb0R3cnc3WU1RUG12LWVpMDh6SnJxUkpJT19GS2pGRmJCT0xmay1oRlZQTUZxdlI1Vkswamp5d0I3dVgxMG54TTVpSHVuaTM4X2ZaV3F4Qm9HN3c0RHZ1NkNtUHVlczAwV1dQWE1XM29xaGczQmtNdWQydG1SdWVLX1N6azdCUGpUdWR3eE1EV3QyczVDU2xmZ0xld211Y19UeEpidVY2SFdNRWVjWi1Cc0FPM1kwNE1RbURRSDczcTFMUTBtb0p2X1NtNzJqWjdaLWRtY2dxczNsZXFuM0YwVTJ4X203LV9jSU1LaXFmeS1VSE01dW03MW0tNmhZMHJXWW1laW43QXI3S3pUUDR1Sk9WTEhjamVCcEdaUGw4c3Bycm8zQXNlZDRFTDhZRGQ0dEJISUZiSU1nSGEtUDJsc2RURTV3aU1NcjBjM0I2dnppVzF2V0NILW01NUlrREpGdXdBYUFVaktUdXp0YTMxbHpZUWpDclp6T2hLd0VkZ09FRmw2VURuYnJldC1nS1RvZDczamg0eEJqSWtULWhJMV8tUkhHcF8yTmVkRXhCS2xTTW1fN1c4R29TUHZFOHVETUpHUng0cndOZzBYVkxSYk5RMUR1SWRXT1BwOUJsUlN1SlZraGM3VDlNM3ZHNTg4S091QUFsTG53Z0NRRXNvanFXVXBZajF4bm9HaGdkdVZud0dYYUExVDhreHNDQmFDZlE1SW01Ym1oSXZsODIxOGFoUXBBUm9MeTZ3SU9aM29HTF9nNmVFcnVnZ1gyYlJKMkV2SUZER2x4UWhvbXBhdEJPclZRSzNpX0I2SldSaktPenRSU2p0VTdrTU9UQjVlQUo2c21YN3BCbVdKa3VjQ3NQdmNZay1yX3NBbzl4NVNpLUZBbXY4Ry01TjNKZk94ZDZzQnNISU12cWY4Z29wRk90YXNwSXRLcm1uTm9fbmdrYzRad210UkF3c0drMEF6bDd1akRXeXFrUzRaOTdnaUVUaXN5bWJfd0dpN3pCWlV4UTRYNWtrV3FmZFFDV0ROUGxjTUdlT24xc2pKOGw1WE83T2ZuQnl5cnRvMnUtT3ljNUxNSnhvV21UTWdJekJ0TXRuaFQ5dllzMWxyX2o0RDdrQThKd0pKb2JjclktcFZ5d0NSTWl2c2Q3RERkczJNc3ZDRnNNMkNsakFVMm95V0laRENKTHNpUjJaQVZvNzBCQTZ0TW1maHlETE9jLXJ6cmlJTkVZQlNPVjQ2YWtUQ3pWNGJRSTNKLUV3WmdzVG9QMnpSU2lINUlYMUF4VE1xMC05T3B2UlJsY2Q1X21sTWcmaW50ZWdyYXRpb249YXBpJmlzc3VlclVybD1odHRwcyUzQSUyRiUyRmNoZWNrb3V0c2hvcHBlci10ZXN0LmFkeWVuLmNvbSUyRmNoZWNrb3V0c2hvcHBlciUyRnRocmVlRFMyLnNodG1sJTNGcHNwUmVmZXJlbmNlJTNEUURHRkJWS1FYR05HNVM4MiZwc3BSZWZlcmVuY2U9UURHRkJWS1FYR05HNVM4MiZzaWc9WDhUaUc3akQ1UGJpQUlrUjR2V0VTY0VjdjZ3d1NkbzFqRzJhazJ2ZlAtUSIsIm1ldGhvZCI6IkdFVCIsInR5cGUiOiJyZWRpcmVjdCJ9",
"client_encryption_public_key": "10001|A3795C2E0A78E5FF639AB006428D5EC19166AF82C402828476442E44476AE3DB9BE22468C15D8744574080DE5697FB81FBC4A0E0AB27B3B33A2739F20B1A514C6DCCBA3414E36F8056D4E1C007B6BF9ED5579A47313BDB651A3A984864E927B3A5D47CDA068E6A5C3AD76FB88A4173BC57EE672D421B13B3434F2D4B03FC250AAD86D64121A1760C83289EE7097A4643E493333ADE8373E9FB36A24F156C4B42D404879BBD8896705E0E91CD4F8BEC0E02A3F38D6EE275B6440F40B40E88B3D1B3292ABB331F9CB10E11D5AC81977ADCD0C22B7ECF009D608C651CC1FD7D4AA114B2130C6E82272224248B29CE4529DE93E5D010BD3976557067FD48E090B653",
"client_authentication_public_key": "test_YTPZMKLO2JGCHJWC2CFBULMURAULV7DG"
}
}
}
where approval_action is actually base64 encoded string that contains JSON action object returned in Adyen server response:
Decoded example
{
"paymentData": "Ab02b4c0!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",
"paymentMethodType": "scheme",
"token": "eyJ0aHJlZURTTWV0aG9kTm90aWZpY2F0aW9uVVJMIjoiaHR0cHM6XC9cL2NoZWNrb3V0c2hvcHBlci10ZXN0LmFkeWVuLmNvbVwvY2hlY2tvdXRzaG9wcGVyXC90aHJlZURTTWV0aG9kTm90aWZpY2F0aW9uLnNodG1sP29yaWdpbktleT1wdWIudjIuNzgxNDI4NjYyOTUyMDUzNC5hSFIwY0hNNkx5OTViM1Z5TFdOdmJYQmhibmt1WTI5dC5KM2VYVWxaZW5vUWNqdkVOY0dMRVhRNW9ubjU1QXNpZXZueVM2VVdVXzlBIiwidGhyZWVEU01ldGhvZFVybCI6Imh0dHBzOlwvXC9wYWwtdGVzdC5hZHllbi5jb21cL3RocmVlZHMyc2ltdWxhdG9yXC9hY3NcL3N0YXJ0TWV0aG9kLnNodG1sIiwidGhyZWVEU1NlcnZlclRyYW5zSUQiOiIyNjIyYTJmMC1hMjQ0LTQyYjAtOTY5Mi1iMDVjZTU5NjM5OTEifQ==",
"type": "threeDS2Fingerprint"
}
Inside method for handling init-payment response we have following code
if (additionalInfo != null && !TextUtils.isEmpty(additionalInfo.getApprovalAction()) && paymentProcessor.getType() == PaymentProcessorType.ADYEN) {
approvalAction = additionalInfo.getApprovalAction();
Preferences.setThreeDSecureFlowStartedTime(getApplicationContext(), System.currentTimeMillis());
threeDSecurityChallenge(additionalInfo.getApprovalAction());
}
threeDSecurityChallenge(String approvalActionResponse) method is responsible for navigating user inside AdyenSDK. Approval action is getting decoded and depending on type (action) Adyen is navigating user to appropriate screens:
- REDIRECT ACTION
- FINGERPRINT ACTION
- CHALLENGE ACTION
private void threeDSecurityChallenge(String approvalActionResponse) {
isErrorEventTriggered = false;
String approvalActionJson = new String(Base64.decode(approvalActionResponse, Base64.DEFAULT), StandardCharsets.UTF_8);
ThreeDSecureApprovalAction approvalAction = new Gson().fromJson(approvalActionJson, ThreeDSecureApprovalAction.class);
// start 3ds overlay only if action is not fingerprint and overlay is not visited
if (approvalAction.getType() != FINGERPRINT_ACTION && !Preferences.isThreeDSecureVisited(getApplicationContext())) {
_toThreeDSecureOverlay.postValue(helper.getTotal());
actionRedirectJson = "";
return;
}
// use redirectComponent if action is Redirect
if (approvalAction.getType() == REDIRECT_ACTION) {
_handleActionRedirectThreeDComponent.postValue(getThreeDSecureActionModel(approvalAction));
} else {
isRedirectFlowTriggered = true;
_handleActionThreeDComponent.postValue(getThreeDSecureActionModel(approvalAction));
}
}
In case of FINGERPRINT ACTION we are posting value of total that user need to pay to LiveData object and handling flow from fragment.
paymentViewModel.toThreeDSecureOverlay.observe(getViewLifecycleOwner(), total -> orderCoordinator.startThreeDSecureOverlay(total));
startThreeDSecureOverlay(total) method will prompt user with challange required to authenticate payment.
public void startThreeDSecureOverlay(double total) {
Intent intent = new Intent(this, PopupActivity.class);
intent.putExtra(INTENT_SUMMARY_TOTAL, total);
PopupFlow.THREE_D_SECURE.attachTo(intent);
startActivityForResult(intent, BaseFragment.REQUEST_THREE_D_SECURE);
}
Further in onActivityResult() method we are checking if requestCode == REQUEST_THREE_D_SECURE if that is case we are checking if again approvalAction has some value, if thats the case (meaning further authentication of user is requested by Adyen) we are again calling threeDSecurityChallenge(approvalAction) method with new approval action where again flow will be decided by AdyenSDK until approvalAction is null.
if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_THREE_D_SECURE) {
if (approvalAction != null && !approvalAction.isEmpty()) {
Preferences.setThreeDSecureFlowStartedTime(getApplicationContext(), System.currentTimeMillis());
threeDSecurityChallenge(approvalAction);
}
}
In case of REDIRECT ACTION we are passing Adyen Action object to Adyen redirect component (wrapped with LiveData) with getThreeDSecureActionModel(approvalAction) method. Value of decoded approval action is passed to getThreeDSecureActionModel(approvalAction) method where depending on type appropriate Adyen Action object will be created, as seen below in code sample in case of REDIRECT ACTION we are setting url and method for RedirectAction object before returning it.
if (approvalAction.getType() == REDIRECT_ACTION) {
_handleActionRedirectThreeDComponent.postValue(getThreeDSecureActionModel(approvalAction));
}
private Action getThreeDSecureActionModel(ThreeDSecureApprovalAction threeDSecureApprovalAction) {
Action threeDSecureAction = null;
switch (threeDSecureApprovalAction.getType()) {
case CHALLENGE_ACTION:
threeDSecureAction = new Threeds2ChallengeAction(threeDSecureApprovalAction.getToken());
break;
case FINGERPRINT_ACTION:
threeDSecureAction = new Threeds2FingerprintAction(threeDSecureApprovalAction.getToken());
break;
case REDIRECT_ACTION:
threeDSecureAction = new RedirectAction();
((RedirectAction) threeDSecureAction).setUrl(threeDSecureApprovalAction.getUrl());
((RedirectAction) threeDSecureAction).setMethod(threeDSecureApprovalAction.getMethod());
break;
}
setThreeDSecureActionData(threeDSecureAction, threeDSecureApprovalAction);
return threeDSecureAction;
}
When object is passed to LiveData it will trigger observer (described above in Initialization of Adyen SDK components section), from there we are calling redirectThreeDComponent.handleAction() method (AdyenSDK).
paymentViewModel.handleActionRedirectThreeDComponent.observe(getViewLifecycleOwner(), action -> redirectThreeDComponent.handleAction(requireActivity(), action));
This will trigger Adyen redirectThreeDComponent that we observe and from there handleActionRedirectComponentData(actionComponentData) method will be called.
Inside handleActionRedirectComponentData(actionComponentData) it is needed to encode back data we received, build request body for auth-payment and call postAdditionalInfo(authPaymentRequestBody) method.
public void handleActionRedirectComponentData(ActionComponentData actionComponentData) {
if (actionRedirectJson.equalsIgnoreCase(ActionComponentData.SERIALIZER.serialize(actionComponentData).toString()))
return;
actionRedirectJson = ActionComponentData.SERIALIZER.serialize(actionComponentData).toString();
String encodedActionRedirect = Base64.encodeToString(actionRedirectJson.getBytes(), Base64.DEFAULT);
AuthPaymentRequestBody authPaymentRequestBody = new AuthPaymentRequestBody(initPaymentHash, new AuthInfo(encodedActionRedirect));
postAdditionalInfo(authPaymentRequestBody);
}
POST {{MENU_API_URL}}/api/payment-processors/auth-payment
Request payload
{
"auth_info": {
"action_result": "eyJwYXltZW50RGF0YSI6IkFiMDJiNGMwIUJRQUJBZ0NZaE9wNHRRTWoydDhvVkFRbzdyT1QyaUJD\nSk9wQVwvODcydWtnbmpSUk92clBiUWk1eERWdTRCczVUSDNpQ3FDMGpCb2hqMURcL3VvQ2ZxckxQ\nRzhMbk13dU05SEJqdDE2ZkM3TUl0VW5sNGJEXC9KUVozRVBLMGhEaVp3TmRoZmttcFNxK05QamNj\nXC9VUEp5SFBQRWxEaEVEZmdQemoxUjkwVHVkbFM1MlFlUnQxMEtEWUxZeGlBWWxYbE03SFl0a2Yy\nU2tReVM1ZU9XdytmZGVWNDNadzVkeWEwbEo2eEJFOU84UytyN2NDRTNCR3lHWHNkVGhWVG1WMEdo\ncmF0TTZVZnA1YlBpcUxwRE5XeHhDV2o5aXBKN1lWTGc2OUVEcWZ0QlwvTkF1NTh4R05TVkltRXEw\nYTFuWHBNVkNQcGs3MDhrTGdQWWhUVWgxS2FRXC8ranRrM1gzR2ZTc0NTaE5PN3BjbnRjaTN6d0My\nZTV5d0NmbDVpWk1JaVhqWDJrR3RDTmNycmRsVGk0N2hHanYxNmxmRzhYM0JjZEZrcEhhWExPMENh\nXC9WNnkyUFVCbXhhRlo5MnNNa3NzdmtFUE1nYVlJcWZuRHUzdmVBOER0UW1CRGh4TjJyYThtRERB\nNVhCNzk3N3REdWMza1ZMZUhFWCtMTjFqcmRuZWpXN3pXdm9KSER2ZzRVWHhHRXA3cTV5VlZoMnRY\neExXTE52cHNRaU1MSWdJYkNaak5YTTVHUlwvUDVIZGp1amRvZDdMeU95RDBRb3VpcjNJa1g5RFdl\nK1lHclVtRTlQXC96MkpRU2pKMUhIZXBZMmJFc2tJbDlRMHZkWXBQcm1FQ0FRU2MwK0dZOXBsSWhJ\nQlRaN0xnM21YNmk5VlNaRm9ad015ZmZTcVFPVFBjSHZrbXI0U2tBZ3hIdlErR01rY09hY2lVMThJ\nQVNuc2lhMlY1SWpvaVFVWXdRVUZCTVRBelEwRTFNemRGUVVWRU9EZERNalJFUkRVek9UQTVRamd3\nUVRjNFFUa3lNMFV6T0RJelJEWTRSRUZEUXprMFFqbEdSamd6TURWRVF5SjlKdFdLckhhVER4UUZC\nUEN0citXTHhaeEc5WnhRZ3J2MUxIcWhqUXZtXC9LQ1ZYZTB3b1lMWERaM05obVVPQWhKM0NOa0ky\nSzhXVDAyOFR0QVhMQk1KRU9GaEtJTk9BUlhYVG5QcUJpMEV3V25salwvU0U4Tk5uVkR5aDRGd0pY\nZmRhUVVkRW92cFpBZUU0UkpSYVJnbjV0SVhSQ1pvc2pZZ3Fna3VPdVM1b2JFUXh6bGNId0UxZFN6\nUHlmUmFkZkNURCs3T09FTmZRS0JWMSs1OEMwcjh6K0s1d3VyMmNcL3NYaFFDXC81WHREK3htcnBB\nZU1IeVhzSUFnR21JOGViMzMyS0NVa0liSGFHeFlPWUp5NmV4Wm5SS1RVN0ErbnRGd2E1RkxzMldS\nM2RidkF5dHRGZjliWUZxTko3OXhRQmdORk9CREdxTjljWTQraVNTek1PQjdKMUFocGdBdEh2ejZ0\nSTRzWjdlMWkrRW1cL3h0TU5wMU1jZ2VUK3pIQlwvVFlPTnJkdFZ2QWp3UUdyYTQrSzZWWlFzODZo\ndFwvbFFraEZ5NGRMSEJVSHJkUXVHeVBCMTM2eXdMMUVQR0w1NGJTXC9ENzhTemZKTExkT1wvNW5C\nVDBpOURFR2NickZKOW1JQUtpYXZJQ3gxTEZDUUxrc1wvMDNDTWRUSTlMZklhWDZ5NmVMZ3lqRU1G\nS1huQXpxRzM1UWdDRlAzZ1hCT1hGb0NPSFhWWnRFK2VidFNSMGFHY1wvVDlGRkoxZjY1T2prcGtU\nRmUrY0RYYXNvS3ZUV0lISWpDSXdxTlI5NzA5MlpnYXg3WGpreEJjRmFnOUpLVXArdzlsV2VMb0ZN\nS1BEMWdcL3pRUDJRODlSN3BSS1pOWDc1UDhHMUo4N3Z0eDlHenBQckpSXC9sc1FiQVI2ZGxPQTBX\nM3pKZnFVQnhrTXU1dXRrdnpaVmMrMlc2b3l6QkNYWWhEOTdsQUVOZllWY1wvdTZnelpmM2hDTkRo\nUGNkU0ZKckdPVVc5UFplSmIwdEpOWTJBVlJtZmhoeTJzcDBIOGQ0UTE2UHdXRytSeXBFMEFSYTZP\nMkpKVU5yN2N2TzBVQ09MNGN3QmdcL0dtbjlSUW84QjBQXC9jbmlRR2w0ZVF1NGVxQmhSSWhMUU5L\neGtyU2dtbTlUMWtBbk1GRVwvUFFaaE1WbG93b0M5VVRHdUk4ekRiUHl6UVFTSEhCZUlKRXhaVnJI\nY3BpZ1NRWWpuVnVSSG1GZEt2M0puZDMyT0VmWmxWYXhmU2x3TFNQTUNkcGZDdUIydWwzTEZhb014\ncTJVdWh2WDFWd0lXVDJMUytqUVVMNEZldWVKVVBGU2xTRXBCeHhZeHpmdllaRGk0TWNwSUwyOGI2\nOE4zNWtsNm1ZeWJWXC9zSGQxMTZFOVYyMUU5b0lvMmJzYitSMEk4Zng3bHZTYWc4ZlFteWZQcUZV\nT1JcL0k4Q1wvQVBDcHluQVwvSnpVZWpITXRoZVZVNG1UXC9YbFpZV3B3NFFJUFhKUlZuVHFUcWFm\nVFpSNEI5NUlBMjdJbUxOOVRuT25kOXU5QzFjenBuXC9NQkRPQkFnRGpXeTdaV1E3ZHk5SzViR0Nw\nd0M5RE9hdVQrOWNidzhiTW1GQzFUZVZOZVVaUXlOa05BWVlaWjIzWHBlVlNpN3orWmZEeDVhZ01M\ndVJzWlZsSVwvVWJkZXpDVnc4RFwvSCtCMmlKUGpRbFFMZFowRkRkYVMrNDFZN1Y4WlpzdzNiWmlT\nbXJBXC9VYysyaFpzcWVPT2JJZFpkWUJwRUFpT09ZUG16NVl6RUJCY25TSXByYnFVMTRQNVdLMnk1\nQVB4RjFlblBNeGhXaXBhVHNMM3lhak1STGFpMVNuOVVNTkxyaDZxZUhKdFFrQ1ZlXC82QmxDVzRF\nUVhreGFHU2dKdU16TjFUSGc3dnZscDZaWE5CK0p0V0VUejBVVWdteUR5c3FOS3RvbFBhakpYQ3Vt\nektlSkJydEt0SDJTUjRIYzczUFFZaUtSc25TM3FucXpHNjlBdEU0VUNFeUlMcmdhdGJ4SEZwaHEr\nSEJHZFJUUmZPeUZtRHJwc0ZESVEwVkRPazBiSTdDK2ZqTjkxU2w3dWRtNGlxbVBRZGtETWJGK0ZN\nRmhMNU9uWlZHdE9QRWs1WGdaUEZJWDdNUFF4XC9wWE9zT3NaM2NHK2R3WXJzYVpmYlp5RmN0QUlW\nR2pGYm5oeG5pc25FMXdNTENNMjNGeWl3S2JQNDlNdFc0ZFNyZnY0U051aUNnZml6WkRja2RIZkJc\nLzFDZVhta0VNTmNVeHhZV3R0UWwyY0FJVTRWVWUyVVpKZWh4UkJqZVJtdWlXMVEyZUd3NnZnUkgy\nY2dLTUNqODk5WnZcLzRGeTdlVnNNM1JRPT0iLCJkZXRhaWxzIjp7Ik1EIjoiTTJSek1pNDBNRFF4\nTjJWak5UWXhOekEyWVRkak1UWTFNakEwWmpJd05EQXlNelZqWlRFMU56TXhaV00wWlRVeVpUSXha\nR00xTURBellUazBNemcwWVRjd1lURTEiLCJQYVJlcyI6IkJRQUJBZ0NiM1plOXlOdTRjSW9yRVpY\nVHRfX1ZFd2VWOEw0ZktrcWo5OU1FV1FBdEkxYnFHWGdkNVA0RHBUNlU1YUhtWWN5WkNVeXI1eTdQ\naktjYVhXYUktYUFfN0ZDY1ZKWlNTUktaTUJzOHNxTnhqZjV1X0ZqeWpGWWZ1UUNqWnp1RkpJZWli\nMUVteTJPcVFmS0F1UWQtQlJKeG5YX1VtMUIwWHVBS2hoVHBxQ09nQXpta1pYaks5WjVUaEdWRHJZ\nMXpkTFp6ajR2dkI3NENXTFpRS3lpRDJpZmRid202SEhOT0x4ZkpFeWxGR1JUczRjRkxaN0tYMEJj\nQ2VyV2M3VjRpbmItTXFfS3JPa0Eyc2N6bVVTQTd6Q1F4LUN3bEptYTJKZ2tCQkJVTTZNTzEtZDVQ\nYUFkbll3UWJsS09odXF0ZTRXWEZscjBobG9VSW1xV3gzc3NQVVRyaGcweEpROTV6TDRxckgtNkEw\nM2VZSG9ZZkZoTVc2VHhxNHV3RG16aXFYMHV1dmdWV2FlOE1MLVR2ODY2N0Y0U3prWHA2bTloUUh4\nSHBIWXhFdEREQmZETDVDV3pQMnE3TVJIVG55eTVNU1lqUHZxTW56TkkxZ1IxUmtIdkFURGhtSTBu\nYXJhamcyRVFhVjQzcnVRZGlNYndDQmdHY3JMTko4b1Niam1GVElRTHllbzZfRjVnMnR6Sm9EYWF5\nRzdobk02NU9KSzhaaHQwdW9hbmNUa19NR1FOQm1Rd2R1UXNHTzY0Q0NYUkN3aThBaGdmeFppaFI1\nQl9mUm4yQzZGNEotT1lCQlJPLUxJci1NdnZlYUNZSjc2RnpIbjVDUGl3NEpHbFJsQmVPeFNSc1JB\nNzI2WGhkbWF5Tk5NRGFJak9TOC1iVFdNdTRwQTRGRnVuQlZheWV5d3lfWEZqcU5Fd01tMXhXX0VB\nQVNuc2lhMlY1SWpvaVFVWXdRVUZCTVRBelEwRTFNemRGUVVWRU9EZERNalJFUkRVek9UQTVRamd3\nUVRjNFFUa3lNMFV6T0RJelJEWTRSRUZEUXprMFFqbEdSamd6TURWRVF5SjlmRVlSdFk0S3ZBOTRN\nSkZ0ZzdWdzNpRk5tdlBXWWFEVkRQZ2I3eWRLajYxSFNmTGpBdnpSQkU0WW5nYmE3UmtFMmlKdmJW\nUFBDeUpvb3JPSHZXdnp2QXo4MG5qSE5tRTFCc2pSYlBmUEZXV09WS09JV0VVa1JHbVRCNmFGZkR4\nXy1qMDVLNUlTRGpSc0JBQ3p0SEhjNlg4NXMyckhGa2Y1c2ZvTThBUFB2LXRYSllMa0lKNDRwZmw5\nUjR3bkVTUXNkZ01KN2NCTkNGbjQySXRjVW9zYXo2UU82YTBmWWZkMWNSeG1OQzR5TGdVQUFRRUF0\nb21hckhzQVlwSzVuOV9VX2U5bzdJMldvT21JU0JMT29ReE92RHRmblhmejd6a2NyM181dUJuTjNQ\nZ0JKN1pWdFZ2QVU3U3I2OHcyZ0kzSzZnU2tzbEJIUE9fOHJpWmNPM2RxZHNqcFZSM05WUUlCeFJw\nNzUtaDlOMXNiTjBDelFsbjlsbGZDQVpRcnRaaDYwQ0QzV3ZfZDFKNHl3clZJdTFlRUVCa3haYW54\nZm1IRFZWcTV6SXNmSGlUcDhXWldsS3BNTW1YVU1ILUE4VmRjaTFYc2tzYms1V1VtSXRlVldvcjdZ\nUjE3Yi1IUEpUaXJQbUFIdzJHMXVTbUdtYlJHMG9fMjl2SGNvV184WUJfaGJpRnZZOEc1alp6S3Nk\nNlJfRXF3Qk9rRm8ycThudnpsN0lpVDBYcjdCOWJxU2FzMC1tVllVa0QtMDZKcW1fclFIY0c4YWd5\nN0MxbWhabEJSaUlQdlNPa0FBR2Z2U2lJelZvZUEyc2dSeUttcE1qdlBvcy1EVklKakdCOTM3NF9u\nNFkwcHJiLVUyOHczTzU1bEhQVWdVODZ1Y05fMW1lMm8yeG9HTFlnUUFQTHpKeUlqVlUtZERmVE1P\nSGlkNTA5QVJsR3hJSE1oeW93S1REVmhLc2h0YnVFWTEyWTZXenVZSUxmRUtxRnpJbHJfT2NZWnZZ\ndDFfZjBuWE80U0RZcC1YeC1jYURudjJlZ0d6NGtvZW9pTUFNZFRXV1Q5TGRzOUJ0XzBxMUVrRmNP\nbjBxUGNQNjBlT3VZajdENXVFSzBielNPcVZMQ0xKYVJ6UlYxVk56SWtJdzBSOGxCV3RHYmtWX1dw\nb3AyeHpmck5fMkREWi10UlFFRHlCb3VBbk1abDYxc3VPRXRlNUMxM2ttYUdacE5aWEdvYnpoQmQz\ncGVZV2FidFhOTThnRUtpSFRTTkNfVFZMY2hTRW1rQng0ejhLdlRBbV85Ynl2cHIwWUlaZDdiak9D\nUUlJNmRhQlg2NjFxS3FrSml0RTctZHAzeFY2WDVGeGVuSTUwbFdpbE9yS0NsV0V6c0s5akszMllV\nNm1EYXplVmdTRldhQXNuOHV6WHJINEtLcml1VnJyMS14ZzJFUmNZVHJ2T0F3NFVmd1Qwejk3ZmFy\ndmY2S1dmY0VwVGtJV3M5SHkxZUZWN3liLUVhUkxqUFNGOWtzV0NOWjVlYUpmbWdNc1RaOUxEaGEy\nQmRuSW03d3RBRTlJVG5LN3lxVGxMNHhHejltYUxjQi1UeDZUUG44bFV5MUxSaEVQM0hscmVyczIy\nY2pwUEhKSEJqWVdDRGdDeGpRTUpXaFVwbnk0RkhTYlR6aHlkNF9jOHZkLXloOC1OcDVGVzJKQ0tU\nM2RvSWNWOXdxNmFRcElkRlM2cTlCZmF1YzhzOWFRSTNtb2JyenA5alZaYnJTb3lmZ0lZXzJyN0Vp\nXzhPTXY1MEtJN1hKVlZmMEdkQ1NTNnViUmJFYlFocUlxcWgxd1R5OU1QcHVoanNSTXJoTVoxN3ll\nckc4XzBlcUpjVjFhNHpMNlQ5YTNGZ2pHdk1abnJJSEdmcG9yVFNjNXFrdklxZ2FpdjJzNFZjbkJD\ncW1KTUNURnpJb0VHc2RUNm42b0stRW43ekFGZ296YkZ0VDdHbzEtb0I1bzNSbVk5UVI5SjN4Uzlw\ndm53UFhySHFPT2N5UGlaUEU5bkRRR2pfRnVrQWZUUDR2TkRoSHlLWE96ck5oVXVPbmhIeDhrLVlS\nMW1HN2lkVUUta1NoaHgxb1lNUktZMlQ0RDU3b0toUk0wOUtLcnhGdkhuMW5PMmEweFFRbXByZ3Vi\nUWZackhsdk4xTVg2eWlCZnFBZE1aS1JDR1lHSnl6SXVGT1NaZXdaUzRUTW5pVDQtTUw0V19feTlr\nNmJwRWdhalMzR2JHMVFTLUFuRVNSRExhdTlSeGw1Qy1iQ3BCV1dpR1NFZlZ5djUxQmdvWEd3QWpF\nV2pkcFhNbHN3Vk9KeE5SdmhZNWFkSFdySUdidjFuQ0o4Sjd3djNrWFV6c2FzQnNRazIwVFFtaVZT\nazV5YU9OalVUaTdzeUs5NEw5TFNXUjNydjFfZGdXb0JKdG1ObjZkRk5ZYUgwUFFmcUZ0QmtZRGwy\nanlHYWJuRkgwR19POEJIS19wV3I3OC1JOVRSMkZKMm1uU0VnZ2FVZFQ5MFFzRl94ZzgzTG9GWjVC\nSjRWcnRQbXk1cHp5Q2xmN2h1S0JoTU9oaFNSUGdtQ0xkU3RDSkg0V1NMQ0wwZnpIR0VTdjJoRjc1\nNy10SW12QWlDWlhHa1F4bFYxQkpjSmZ6SU9yejN2Nno5WEgycTFfVWNrQWVkd2ZGZmNtVE9mbEZf\nUGJFcVlGTWlzSUppNlBXbTNaMjV2UDhaVl9wQzQxSzJOSnNNUUdYNF9ZSDZfSlVuTVh4WjFVbEM3\ncTI1SXU3dDNINHBqdFZwSWhXM25qUGdFMUVIdk04aXJZUXc2blpKOC01LXVNR1RpTGFERlM1YXU1\ndWlVeDNONjQtQ3pBVDk0bXVieFBfN0tCQVkxWnR6ejNLQWZGWUVfbERWQ1M5WG1fSzNvVTJuclEz\ndVN5WktSZS1sQkRDU1BPNmZLNTR3YzJ4c0VuSlUxTkVmSEY4SHJ3QjRkeERTcVpKamQyLUN2bk15\nbVpNQm9FWlRlN0NxMmlpellVQXJlSFVmRGJraWp6TlcwSDRKOWxkNkdGNWNGMjRHWE8yMFRtX0lF\nTWpEUjFxYVFxa0tPREp5akZ1dnB5U0w3dE95RDc1NTdzUVFnU1hSWDFVY3h5ZGtDblZPbVhTUTA0\nRGQ5YktIV0VyWDlhb2NBNDFqVGZHZkEtaHZTTHdjQ0ZDWHFkX3BlaDRzY0dUUFhSVnVZN3VudDNi\nazlRLVhsOW9NcnF4eFQ3WXI2ME5SRXktblVGVW40eHJ4Nnh1Rkl0SEcySkd2bGhMNDlZWi1kQWpn\nWW9GM2VJdWE0QjRnZzZVd3RsOXRqcExadW5taEdOTzk3UUJ2N2VHSDlUOHhrcUdtNUY5Y09vMG56\nYjNrYUx4cWFXcUY0STNfWHJiM3VDd3BSN3RYZU9GTjFJQ1E2Q3pXNXRNaFhZWlZCTGZmUGRhcVdN\nazQ0clZkVTdpc3REVUd2YW5zU2h5ekpsNi1zMVR0ZXlWcjNRYlBuNjgtbVZBOE1UY1lya2ZGVDJu\nWEItWFN4RWFZSm1PNUVDMmxYWElHaHc4MjJrU0c2bjhxX3k5b1JscGE2LWQxZVd2bFVrdGI4dEU1\nMThoTjZhUnJaQWVHajZVQ2hyZzBBa1RvWHBiM2ltanYtb0VvcmVpa19GOGpzNnQ0UE1tXzhIdjBY\nQnZTZGhLRTVhLXdWNkowd1NPUEYxUTk1eG5neVdIa2poNUhVZmtYekZtaHlSXzBHdVNCY1l2WExF\nTC1icEF4QTY5ZWJGQ1A2UG9mRnk3YVZSNkZiZXpYb2pYc2dXN2dEQnVQMmg5MUI2bXVLeXc0TWFC\nNy1Tc1h0TlVBQkZpSHBSUFlvRE94M0dKbkRRM3VvY2tEeFZ3MTRuS0lDR25hU0ZrT29QaXUifX0=\n"
},
"payment_init_hash": "41880b605ed0bfc7b3d17db9bd942e9f"
}
action_result representing encoded value that we sent.
Response example
{
"status": "OK",
"code": 200,
"data": {
"payment_processor_type_id": 11,
"payment_processor_id": "d533b5d2-68cf-11ee-8c99-0242ac120002",
"payment_init_hash": "41880b605ed0bfc7b3d17db9bd942e9f",
"additional_info": {
"approval_url": null,
"approval_action": null,
"client_encryption_public_key": "10001|A3795C2E0A78E5FF639AB006428D5EC19166AF82C402828476442E44476AE3DB9BE22468C15D8744574080DE5697FB81FBC4A0E0AB27B3B33A2739F20B1A514C6DCCBA3414E36F8056D4E1C007B6BF9ED5579A47313BDB651A3A984864E927B3A5D47CDA068E6A5C3AD76FB88A4173BC57EE672D421B13B3434F2D4B03FC250AAD86D64121A1760C83289EE7097A4643E493333ADE8373E9FB36A24F156C4B42D404879BBD8896705E0E91CD4F8BEC0E02A3F38D6EE275B6440F40B40E88B3D1B3292ABB331F9CB10E11D5AC81977ADCD0C22B7ECF009D608C651CC1FD7D4AA114B2130C6E82272224248B29CE4529DE93E5D010BD3976557067FD48E090B653"
}
}
}
Response example with approval_action
{
"status": "OK",
"code": 200,
"data": {
"payment_processor_type_id": 11,
"payment_processor_id": "c709db3a-68cf-11ee-8c99-0242ac120002",
"payment_init_hash": "ed627252ed7b047cd8c1bbd82ba02ab7",
"additional_info": {
"approval_url": null,
"approval_action": "eyJwYXltZW50RGF0YSI6IkFiMDJiNGMwIUJRQUJBZ0N6VnZIR25MbWwxNUliVk5NN3pxV042aXpnYTJLa2tzU2x4ZEdqNm9GaTA5M2JJdlVhU1FpMHo1K1BcL1ZFRmNiaW1nbzVjQmlsdnBkMzdKUlVlZWN5U2tJTmVOTkZTVkFzUGRiUit2RDdhS2ZRcmM1MjJFRm9lVHVScWx4V1wvWkdMQkRUa2lSd1JvVVwvbXl1TUpYSFJ5eFRXOFwvQTdcL3NZWlZVTnd0NGVvVVp5UjEwcDlQRFNXMGhyazVuMnB0TTNQXC9La0JpOUhUaDg4QlVxeVVYTGFJODRDZSthZUJlMmw4XC8zVmZXZGh5dWtTXC91dXpIRW8rQ1Z3bmpTcEZYZ2UzMGVnNGE5OXQrclBxMWNSMDBWRzVPb2J1UkV3UUk0QUlKeHFQNHp3S2xnaWZaM0xHY09WSVBlOWhHM0RGU0s4XC9Fd3RLem1JdXZ2a3hOM1VMYithUEQ5K2R5S0FxNDUwQzdLcTI0TSs3M2JYVng0NE1HbTZscVY0UGYrcHVKRVF5djlVZzhBVmV5QkdNMFVlaW56ZlBPYjBmV01VNW10UE42UGtPcHZMQ29oV2Q1T3crc1BMaXlHWnpnY2MxaGJka2FMQWlQV3BXcDAzT3B4TnpucHNMZ0tSclpRb0JLemxDakF5WCtmaDFzVElEMnNUUVwvcjVzV0JkVzFWUGJ0enZOVEFNVzJza3B3UEJqVkJDQWxKY00xaHM0amdEUUZrUGhkKzN4NVJJdFpRb3JmdzFCYzgrNlNaT1g5NEgzTmtiTDBydXRPRTZDOTFPeVFFalQ5RmZlQkZjNG1KbzJOMUNxUnBwZ2JPT1VYVUZ3MWVMdnBtdzlEaENGb0Z6S0VKdWxabitRTkJUZHpvSndwWHJMSzhESkhTQVJ5czY1S1grMUk2YXo2WFdYcjJyZHd5VDVuSmQrTDF6TklqeHhyRUFTbnNpYTJWNUlqb2lRVVl3UVVGQk1UQXpRMEUxTXpkRlFVVkVPRGRETWpSRVJEVXpPVEE1UWpnd1FUYzRRVGt5TTBVek9ESXpSRFk0UkVGRFF6azBRamxHUmpnek1EVkVReUo5aDRZUUt2KzlNZGpvcXJwVFcyayt0YkppNnkzWFRcL0JZUVVaY1BxUjNhTDhudis2MmVQODZtNDNTdWh6Mk9QdnNZbFU5cnBMVkFPTDVEb3J5anlwYlZWYjJleFJHWVwva1FnZitcL3JTelBVdldMTUpZOFczTFdzYVU1dXZvbEpkYWlCSWYwS2JNUllHUW13MFwvNnlEdDdWU1ZycDJvM2pCNk1yK2UrQTFYdnNERnp0SjF6cVVMSVhDbkZwcWk4NGtqWTF6emJnSEJZQUl3RlQxUmxxT0ZIVVMxSlZrUTJVT3l6WDErekd6UVFkcVBxSnY2Y2d3bURcL2s1ZDJ3bkZQNVpkd2xKNHp6U3RQbzZTK3NMcUFWeFVaaGo0VWVjMGpXSkRZSzVkSzV3UktYeUVGQkZVQ2lrQzMzZHF5XC9KZG5mM0ZtaUlGYVdyTGpvNjU0UGd5a25Pd1F2bmxEOXZUcWZsY1Y0RXREXC9ueHZQRmVqM3BxaXlsRGJ1NmlOS2hMTWhKbWpTN3hBMTFmaTJ0djQ2TFYrQldvQWxsUk10clpyYmhTc25zWWR1TU45YkdXZnZnNWp0S3RRYWorK0ZXT0pVYVFWOGowcTRVeEEydnRSbzIydk40M0pFblMyUFhZT3lYRFRuUUFaY3NQOWd5VVM5eUhiSU05MVQ0Z1g3QVo3VzJGXC94YmVmcG9EUkxRd0ZPRXNnUmVLWEpIYXVIZkNYSUViZkVzUmNuK0VGSDNMMVNkaHo5TmQ1MEUwMFRuZmFhZkxBYnZcLzBrUjFOdkh2YVwvcTNRMXptdmEwQWhQdGRQemJoUXBpRGY4eFdQaG55aVZXRkJSUTI2ZlRVMjZqRmJNWEEwT0NxN1hnUFYycTlRVFwvNWVcLytjSDhSYTdkU2luM1pNYnFrYzFVYllXYWs3XC9IUUNsaUVoNkpUXC9DcHlZdEhXc2ZVR1NySEtJdEo4WDR2SnpjXC85bXM2SkgwQ0M1ZTVzSGJsY2RXRklvS0liNHkydnA1NGZtN0prb051VnpQZWRwanpwT0NyenB1U25YVXBXcHBwMThzYnArTkMzNytcL3JGWjQ5RUpUWnJaTGFrVjFjcFwvNHhEcXpUYnVtTnRtVWxTMVN4Z0x4aHlvNEtVaUFwU2RPUWVjNG1DcHoxY3g3eW5Cc0VHQlwvNVlUeTNkN0dKZDNIcDJwQ01LYjZjd3hUZkpMZ2VySURhSVAxXC9oSnF6dSsweE5sMXRFVDdWOEh2VkNZV2x0M3V0NzlFTXQ5R0srenFOYjl4U0lIdUFqYm1acWd5NnhVNVd6ZGdKTktac2tkMWo2VWt6SjZXUmxhb1wvbXdIVW5Db0J6WjFwVzR4NXE3ZGc2WVIycDIwODZJeXVHeThSOWhcL0JteEpnZ3o2R2FJM2EwQ1lxU3NWWXFINEtpS2dZOFBKVzVzNG9sZVRHS05tWkFWUkRwSkVwbFdFcDVObmNCMjF6bVFPXC9CXC9PMTN3Y00wb3p4dzRcL3laMm9NZ3pJV1pldFZjRTRIc2JVN2Rzcmk5dTdCWlFKTWl3emw3N2xIYUF1cklEUWxcL205a1dMMnFWeTFqY2hUQkxZUGRkQjZMN0Jwa1ZhMEVFQm1rWUYwM0VHOFVEWmhvSHZBTTNqY04xYTVVOFNTZVpReU9SOE5VYnVuUnJzQ21NU3ZsbmtlanFYTzhRc2pPN1hldUU4M2hoMThrV0c5RzMzcHFrcmJESWNRbEJKWHJ5RUtXZUJwbE9SS1FzS2xzbVZvakpEdUJxdGFXYnE1RUFpZ1AwU2FZNnRiYVduTlh0VHJvZXR4QkdWQndmU0diSUwxWkVHWjBoRXp2OHZrcmV1T2VTenJUOE1SUVVcLzJHYVl1Qm5DajlRS3ArQ0NnckI4TUJ4RTVteFlGZXBDN3dRRnpnUmc0blwvaGoxYXBkOU5JS0pRTkNhZFwvSmZRM1ZneHh4ZENtRGVnaHVLS2pWSks2b0hlU2NJK2lka21CbXJSK3RLYkZISEtmVXdySk9wMjBWN3FuZVVlUmgwbjJJNlpJb3hkSEhxMTVEMHhyZERMMVU4XC9DWkpuMFJtc29oeUdwVUY5T2ZPMEVhME1KU1lDZHR3Q3dmYXhwVkxzSDRsTGpTaWJ1NldyejdhZzlpWTkyc1VwUEtSZ1k1czlGam15Znd3XC9LNzhVZ1FqNEwzZzRxdnlrOGdmN3hER1JrUmN2UTVobFQxUkJTcTByY05mU0FFYlhzaVJuQ09YXC9cLzlKXC9lcHZyUGJSVU5QREVpNFNJRVdCcThiWWxCV1dvNGx2cVwvK2R0bDhqbGNLZ3luc0g5b3pSOVdlU0taS1g0N1k0STc5TW1UMkhOMERIRndoZXRYd0tBU0dUbzJCdkZGUXBcL2hHalMzcklEZFVSUDR2VDFDMDlIekNWRElTWXA5V2p5WlUxTTZFd0EwbGtEbTNkRE9SdlpxcUdhNlpIYk55d3JZQjJaNjBCdXp2cHBoSGp0b004VXk3aFdZdXFybjZTeFVXamowZlRxNU1QT01JcXQyTkNjdDI1MXhCcW1VVzIxaWtcL1ZXRDlJakY0RGJPaDJSNmxOWXhKb2I4bDBZUW1mUFB4b0lZMzJvbjdOVVRlQVwvdzJSWGN6T09OR0ticHhtblwvTlJrUlJ6MjRKdU1jRGlGTnc5QjM4NDVmRlo3TkRybm5qVFFRcDlIckRTUDJuNkFcL0ZxdmNMdlJDaXNpMTg0eXZBeHFLTGlMMkFqWXA4K1pINnBCYmQ1N2o5dUFpYW5VZGpobGlqTTlKczdGSkVsMEQ0cll3VndUUEZLVzBndFF2NVEwSVl5dmZLdnJrNVdUajBNbnhJcTRnZkt2aFh4T0ZWSURYcSt4cmdlWHU2WEdKVXFqb3hjUDdIQ25cLzR4QXpxbVlieVR0bXRlWjA0RUJsUWFhXC9yUnF1NHpOdG1kSUR1MUJoWkp3SlYxd3RGV2hUeTh1bDdvT09CQVJnRGFjQ1wvRWtFM3FWOEdWMkh1QXdqNzFwK2VuclQwMmN0bFFDeHFFWWVxcXdIY0ZQTjZWa0pmSnlUZTNIWWpsS0dsdmN4anBkN3lnOEZSbVdBZlU2dXp6VnExSXBaWVwvTnZmQ3hMZnh5SUNDenRoaWpvbW0xTXJpWTVocU0xSTliUTZQaVwvSEg3R3BXZXVsSldIV2YrU1k3QmZOZ1UybzNvMG9pcHI5NlQwb0RUd3MxZmlFN1prRHl0N01mTU5nWUVGQ1A5Rkx0cjNYOUxNcUxnM1E3ZWJrTGtnSkpWZ0ZWN2pRNzFIXC9ac1dOUzhnSTBhbXZwS1JzNU1aRjN2VWxRMEE1Z3RLNlc2VGFJZFlPeG9rNWhYaE9qNFhkSzh1a25cL0ZaaU5BWjZjQnZDNGdaYzNOUlhrQUFuTFJNaDlxcXNpNjlvWGpxSkNIMlVkQVNFQzNYM3A4RUhpcUFIV0gxYmZwRU5zZDF5WlwvVmFPWVwvVjJSOGduZ0VtSnN4clpPSENwXC9CeUM1Zll3UklEZzVhcFlsSDRvN0pNREZSc0xSN3NKd1RoZGNHYXJVSFhzZ01nWnZMT044bUI1bDJ2djloTnR2MmRyXC9MaGZTYXBQSkVvb0NcLzkrOHRrUGlKSkxJTVlQdzNudEJ0aEJqZUhNcnlkY0Z4VjQ2S3hlMUkzcW5CMEUwS05JR1BjSkZOYms2eCtvd0R2TmFoeUdvZ2tvcFlQSXVSaWZNR0ppVzYxZDVWRDNEV1ViTzJQSGlTYlVQbjlxbk5YV2dmc3FzT2VyOVNsbUVQYUZlXC9YMHozbVg1T1hzMEpKQlwvV29kMFpHUjdBYVwvREVpQVVkM25TaGhOY0orYWhUOUk2cUZjd2s1N1JlNEVibkFUck1vU2NsUWsxWElZdWpGQndNRGhEY3hyWEkwOUM2QUs1THdvSkNjQm1NeXVjU2xxUU9OQWphWHBmYktzbFdKa0c4ZVV6M3p2MnU4VXlpVmp2VE4wV3YwbGhablcwQ05nVDZpVmdjQmdZcVdjRVNJM1lTdUoyN09UK3V5OXN1YVlKb0hvQThLaEhUNm0wdysyZ1hMcVlMOHRPWktJQjNPRlROYWtlVTlNY1lsXC9QZ0FKWUwzd293YW1YdHVTSHROQTU4M2o4cTU3Z0hPUjMxYWg3T0c2Sjl2K2dzZFo2ZWRid21wV28rWlRxMTdadXhIWEhVOFBcL3orYmN5SEdteWh2NVFMbnJpalB1WlZya2k1N2hMS0d3T1ViYkc0SE9xdTltMkIyNGpBU0JHcGNzVWdKdkpCWXdOV3I3Y3JOZnduM2dZTjdOMnBtQWk2VnFFOHRFcjNvN2FwdGx5XC9LU1c0UksrNEJkVVVGdGZmSWdXbXF3aGpsMENkZjVibWdyV01MdnpDSkxDR3U1R3ViN0s3K3JQVG9yQmRja1JLNUI3cjc2MXFCXC9qeXY3S25rWUJyandXd2grUmw0M0lGQ2dodE9VWE1Pd2swTWg5bWFRWHJjUXpvTW96VjZZMXMwZ0tOem9lY3RcL2IrampHVG1EVmtaUTlzRnpKWTRHcEVoSU1jYm5FTnBYeFJ0TGtaRmJGdFI1d2F6M3BFWm0xZzAzYmNXQ29Kd0wxN3R0MzhGYXdYWWJMRCtzaWdlaEFFbnFZeW5RdmE2S3Y5YlpZTFdLSUE4NUZHdVcxZklJeU1vNDNDc3lQeEo4QWQyKzZ5RXpYRkpVeFFaY2VhOVpHVU8xUG04OElKVXRJZGVrUk0reW1NYXJHRVNZdTY0WjlcL0lldmJMcW44eHFmZGZxenJIYmNyRjd4TGJGdDFKckV0eHZKQWZhZ0R2TjAyQ0FLV2pxNjhNS1g2YzhINHo1XC93OW83c1dzY3IxOFpCckxjZ2NiS05HcVgzSXRWK3ZrQVVKcGcxQlZMUWt6S1wvaHlvRFVKQVBFbmNXcmxzZlJ6VWR4NmRkdStDanRWSEJhVnFPK3RJbFhwb1d2VGRcL0lKWXNybkdjZ3FFTE5qcDFCSUR0ckg3NDF3Y3FiSTRkdXBnREprZFBHaWN4NUlmMmdVNEhaS01DaHRxMmwrY1JlMVBDYzNCUFlQMlBYN0VkRTZNYUJCcGIrOERISkRWRDdcL0grek9KNTdPYkRKdWt2aDRsdXB0clQycHBjSVd5STFPZVA3WTBjY2g1aHUzc1dMK0NQNnpKWE1hbDNJWFhiTWpQODd2bEEzaFpIVEIxSFRzaEhXMEx4Q2w3ZHE1NDEydmV5T21qUktxd244blBqbzM5RXJKVHN4NFJTOTlzQ0tsd0drdDdXOUhlbWZRXC9pbExqN3dFN1RURVJVNlhIdEdnWG9mWDdEbVRxU09JaHZaeGRcL2pVU21UTTIzaVhaQUNMbTd6VGJwZ1ZoNjN0S3RnSkhnc2VXRlpoYnNBSkVXVjlUQWJxZXBaZm1hQ1diQ3lBdzJSbStRM0pWZWxxS001RGlZeTUzMW5UaDg2byt3dHoyNEdXek5KUVFSU0QxZVh1eVU5Yno4NkpzclRrVkVIdUFJalwvN1wvZkZwMzRsSnZicWZCUEtXbW9ackVrSjY2aTVySDE0bzFaaTJTUG1VXC9GWlU5dXFzZFp3WUh3eFlZYk5vbytMdnRaUERkcUdhMEFRUXIwK3ZEUitYUTd5VGxMRHppTW1tTUI4TW5CcXJickY0YzlIWjd2RnpTUTBGSmt3Ujl3c0xCZXQ3NGhXb3RaZzBMZU1OUFd2TElnXC9JTVFkdmtBeFQzN2VCdXAyVGlTMXJUa3YzVEJYQzBabzdadU9aWEt6RFp4Z1M0SlwvaFdFYjVzVEQyOTh4UE9YU3BBRGpvb1ZEbEN1d1JwM2JJOG5JcjdtNzlreWc2bURjVStvMnQwakx4azNMUnMxZlJPY21pMm1Ob1lxK21uWUE2RDl6bHlrVGdCUERGbzQrd1U5N3RDTk1wVmxOVUtNazZyZ3Z3N0srQmh5YU1xRHlxazhrRlM5S2FneGo3ZktlY2xZak1MVVUzZGpsRmVqRElTaGdIY1BDY1c5RjNTVDg1dzVBUDM0dFV2bHNlVHVLTXJ6a2pjU1g0K0pGbEk2NWdrQndUWDk3V1hpM1hGdkRqQ2dmU3hPSFh4cDg2eWdLaXNLaDBuTmFCSFZUZXNMWGt0bGNcL0dDVCtycFVnSUZyRUxlZUtLWlprakhjcUY3UE1cL2FIQkwwNEZYZkFodCt6RjUzMXJJSTRtRjlNc1wvT3pcL3RRYWd6TzZTQ202dldGMFdiU1BNYmpRc2Rrc2FxK2VZK29oeDBhOEpGYlpMVjJ2R2NIcThBTnlKRzVzU1c4a2ZDT2JQR3JUWVBKRXgrZ3h1a3lGalVubTkwME94VVRkM2Y2bFRPblBrMGh2YTM1dDBJNEJ3cUEzT1NzY1wvbjR3S1pwdDVZT1NBekVla3hmRUZxUnNocENZdG94Qk9ia0RpOUQ5Q1kwWXh3c0pEekRmbFd1XC9SMjJxa2NTUWtEc3dHVGRrcXNUeGswblFcL1dNXC9jeEFyYmJZN1FYbVZxcHNrMUlSVGdVUEdRY2VsZDByYWQ0aEh6VFRVV0NqWFl0Sm1OS0VQXC9rbVU4MFJNRTYxQTV3WUtSbnJlRFU5ZFhWOFwvdmJ0MmtrR3ZQRHdwb1JDc01CelJ5dVFQTENlWUhFRmR6U0xoUno4RVNiMVpDRWhFVU5jTkNDQm5FY3J3S3RXYnVoRkx5WDBWSVRkeXBzck8ya3pJcGlyemJSbEs5eHlJSlBcL0szQ1pFRm9YVllodzdcLzdsSVlWVUZpcUI0Q0QzWmlkQU1TRDlsaXltZ3RtaGJtTWVhTXYyME0yUDBKK3JOMmo3aWtJQXlkZkR1TFdKNWxHYit3Y0Rmd0kzKzNnTDVwYXc0UXZENDNwcE0xTjdJWXdMc29jTGdxMVgyakhYSE9sUHdhVEt4b1JCY1gwYlc2Wnd0a3h0UFFtZk5hMHRFRytvS0NMbWxJbjNSYk51ZDlkTElVamVuRmREM1lNYVJqZGU0SWZEUWVJTHRKVWVMMHBFWjFBblpLbTdORjZIVzVteGRvS1wva2wrbUtvY000Rit1TTdwSWZDM1N6NTdsZTAzR0hYdjdjNWRwSzNwa2VuRDdLXC96SENrT1Bvd0hcL09HUjBMT1Yzbjh3NXRqMWhFZWNnd2dmSDJUajdoem5BenBtME9cL3lOWlwvKzQ0M0pnQWV3dnF2NElGbEZzNjRDeWd5VkFPVGZFVkRwcFwvWjVQK3lFYXlZcTh2Y2JsYVFLYThveHQ0NXBVZzdhbEp1SzNWcUdMaEZVSDg2Mk5Ebno2WnZhR0NYMmplU0NVK2dcL3hBZlhieXEzeFQ0ZVdhUkhuNUlHYkJ4SVQwekxyemZOVit4empSXC9oQlJKMHFWTE1lK0tJcGVXQ0FSZTZPcE9VYXVNenlleHlFWG55eEpZamhrUFNObnZndnIramc3V0s4OWhCR2Q3VWFmeVpmaUJzSzk0UzMwUyt2U2hkQ2U1NkN6dlwvVHJcL1dKeU0ySnliSm9NVXU5YUxQRnlaTit6TjVxSFpsdmlvTkVmUzRPWFNVR2RJUXdRQzVcLzZDV1JLdmdXWUQzcTN5Z0xnS3BzcXgySFJuY3grTzg5N05vdTQxVXFtR1lNQmpTTUNhMzQwR3E3R0IxS3ZMM2xsb1RGUHlNVnQ2dE1BaFp4Tm1iaHNPVXpaN2x3OWRtUnJyQlkrOW5XeklUOW55dVEzM3ZpVG1LdDZlVXhrUU44eDJ6WTB3QVwvMGNhaE1rQTRLZU5aOGozZXJVQ2hNeGRnSVwvQ0xiQ3dMQmRuVUNQVm1CaG5cL0lnOWFNQllVNmdWQ3FGMDRsVDZsTkwweHlMeFhoVHdKMEs0WDVtVnJXS1h1Uldqa0JZSkVzdXhvdnFkdEd6YjJvZTdteUtCSWh5QUY3bWtzMFcyOXJpOW8xOXhPQ2h2ZDc5aTdQZkhQMWI5MXpGWlM3MEg2UlBNSHVWYUoxdWpNajdwNjR5SXBnTVF1dnd3YWR0bTJRUTN1cERoWm05QmkrdUtBVzVKU1AwdnhjNWxRTGR2VGVpSWNGNDY0bjhOZjJLZXM0bDhTOUFISFdoMFBXM2JGNndha2tKbXlyUWhhRVllSUNaYUxnWVFPZ3ZyWnFSTFJGSGNuY3VLXC9zc1N6UUozek11aTBmMTVrMjlJRUpGVStzSW9YT0Z5MnNLZEJOMVhtNzZEMmlPMTZadEtWR3N0bVpxMldkQUxSak9DRStSOHJXSkxBQVllRkZJQkdWTThwUGxsUGIxZ3VnR1l2cXo3SWhwNDJEa3pSSStkT0xacGRwYldWV2UwQnBkZFhza0dHSGs0MDFNVzBaZ3pQUnYwZ0JWTVlRXC9IbGVRWW5aTWZQQjNZSjFaRnEwN2Y4MkRBZFBzSHduSE5jb2xuMUZINWdOR3JHREJ2MGVkYjR3dTllait5dk0zN0dPU2dIdnllc1FpYVpBSEhiUUszR1wvaGlcL1IxS0paQTJZNGVleW1FY1Rua3ZCOUhwbEwzWVhFSUowSWQ5WWdFTlNXOXJ2ZDNucFErV28zV3l0MXVNYytjNWp0c1FmZmhzNDF3MVk4R1YyK05JTUd4eXhoNWgrbWNEVlkwSkJQZU5PTG9pMzZDeDEwXC9iR3BMcWdZc1E2TGZ5N2xPY3I2T0tTM1lEOHlaaE1GWWVBKytKd0laU1B0OUVpREV1bUYyK01RODlMTXV5aFhmajJiQlZxeHY4dTMzZU5Qa1pSS1B3SElhRWJBd29FT2lYcFJtbzBFOFwvTGVBVkJYVWg4Q0hBTWpzWHFtb2hpTTdjYlZqUVdjMm9lVE40RkNaSlZ3b1BEa3VJK2lJdXh3UFZxOG9IVm5BSlwvUXF0dlwvdUFEcG5NNzJQVERDVzhEMlF3QU5JN01PeVA4Qzh3dVlJaDd6cjdcL0laSjVYaEpMSFRYMmJHeTk0Q2Y2STA3Y1daOXVOc1RYV2NNd0lkNGdjdTZWcmpLczZQRlNNSDVReThCVlBcL1NkenJ2OHloY3p0a1Q3OFVqZHR0RHlSdzZ0Mzd2OVRnS2k0SURYa2VpeE5XSzhmRTUxSWNhckpZS0VcL0ltc2VhREx5ZU9ueWpcL0l0WnBLcEo4VTdQRGlwaFwvaE15K3E4SFRNZ3hKd3VrWCtWaXNcL1IxazZ2UW1ReWdqbFNlSHpUVjlMbjBWUFczRUZcL0t3RnAxRjV2TmZSVVFcL2xHNkRycmlhTitVdXNPc3JUV1VTdndHUmxmeEt4V05iVVlqYkQ5N1NPeW44a0RCc1FVYWEzbWViNlNlNjZKUk5NN0xIZTVPaVhVOEZVOFJ5ZjZ3anFLb0NHcFkwQkVpZXRjUlgyWTVvOHpcL0w3QkxidnRvaERXSGdNejdZVmxBcTMydm9ZMXBSTWpnXC9qZ25FM25VUjc2NU9ZbkVidTlMQW91V1BXTFU5d2JvaGVjMlBLTHhnZCs0bUk5WUQ0akEwSXVXK3BQUGZEcHVIRlNkenBXSjJCcExXYURSXC8yZ2hlOTBCaWpjdDBFRjFUM2xrWmdFUVMyNCtjWjdrYnpuOStiSmxlMmtYSkNtdkh0U0VOeVZBakRcL1o4T3lBM0swbFUzelVLOVp1NkluVnFNTGdyclwvZ21oM21ycXFIQ0MxUW1wN3M1SFNSR1NpTDdBc2xqalNwdVRNVDlZQkpUMTJXNjZQcElBM1NxbmtUeldKOEYwOUtqOTJoOXVreVwvaEI5aURISXZ1NHk5eFhJYjZEYTZEOGJ4eEd0TFwvTVpERUxZRXhRS3dlNk93Wm5SMDNpUjN4MDJNYzZka3lVZTlMbFI2N1I2SlwvdENlcHFZS1E1Y3JmQlpiV0dyb2U3Q1ArbTRFd0hjczdvdHNkU2RWRHFcLzBYRTRBOVdRNHU3a1JkUTRqSUVpOFZoZlZ6dVJwU3Z2Y2dzdmhDbVwvTWs3cTg0Rmd5a3diUmpnUHJTTWkyeHhDOTNZa2R2U2VaV0l4amtqdmlkSFhWU01TTnZ0K0x5RnJubDQydXk0WVc1QlY3SGVZUmZmZWJyY28rb2VxXC9IWVlZZHkrWFNwYUJOZmkrYzV6RUZycWpZb3Yrd3VZc0lIaFhcL052bGhYejQ3SVFxeFlpVEpUZjZWS21kSFlBdUF0VGNXUGQrXC9vcVwvbXZDNU1FTzUrYkZFNGx2WElyN3dSaVAxWXA0dE5cL21qclgyMDZqS21OVUpDZWNJcHduTWo1ZkIzSm4rU29GZ0pZNzBJcDFlR1VtOU9icUxNXC9KNWdocGNCQlFZOE1KaGhhZUxNallHc1B5MHJ0VWRuQmdiRitGQWw1Tk9mRFNJSUtYaGp4YSsweHlIeXhkcDRpN1Y1SFE2blg5aFBLVVdia2RaM1wvR3NidFwvMnpyR2NHOWtURFpDK2RQYjZiNUp0VW5MRlVYK0N4VEN2amcxV3BSdFdlMWlGVDgrZTJleGNjTE9oMjhDM0FFVGZzMmpvREE0eDQ4cURQaHlCUEZjdWZtYXZpTTM0Q0E1SjA4aTd2U01GTjVUbU00dDViQ3lIZEZHd0tVTTZlbmcwZEZiNzVqVFpjRU9BNVhlMnk0Qjk1R1BJSTB5ZGdXNG1PV0RtZ01xc2pLMkF2U1Qwc2pMN0RUS1haczhpSmE5bGlNMHpVS0VndURiMTZZdGlHYzBYdmhsTDQ1bGEzb0tPb1lyZGJWV3lzb2ZqbnlpT1U4bktmNnhKd3p2UUJXTk5qclwvVjhpRENJTTFmbjFvbzZ2a25wT2Q2UzYrTiswcERXa2dyc1FGWXRrYUEzaTU3bzhoa0JKWWN5TE90U3BjWmUwaWJHXC9HeERVYXVOSncybU00UUFqZEFxUWpYd3ZIK21nY2l5cDh1MjI4XC9kUG1uMlBZZlRKb0p5Z1hFTzJKakpvYXZRc0JaQkh6cjZCaGpPa0NnZ2t0QlNvcHdjelVpVnIrajJyTUxua2FUXC9rWHZGQ1VHOWJjK29YbFQrV2Z3dHBHcUtKTGRcL2xMMW92TjFkN2QwMGJHQ05QZDhQYnBaUzErOWQxcHdXYVZtc1hvUmZ5cWUxT1ByTWsra0RLM3dFSGs4UVpWMHBJaHYzanJtTlc1OEtrNGpQcWQ4K3BZb1hTa0JTTzFkVTh6TGVnbkJNNmdPMUM1cFVqRGZQNkpUSm92TzlsYUxqa3NHVmJBbnI1TEViYjVZMkMxa3lUeDFrOWhjTDQ4TkY4eDV4VUtvNURxY2hFcmJjaFpZNFZpcHp2YTJoNUJ3M2thVXBYbngzM0hvRWZZQ0g3ejRmRVdiUXBTNUp5Vm9BUDFsN1hwV3BXKzZcLzNUNmdvd2ltbEc1eTlGTFwvaHUrTDhBVzJYN1NCTGMzV1BVTU5vM3NOaWdKbHhpYUZCZGczQ2lYMGNWTGtpMStyN3ZQOFNnSUpmcWFacHR4bzBIZXcxOUpMWStTc21mTkxcLzFwMUtTOTlvNG5IdUxDNWhLVkt0cG04b2dTRG5QbmhFell3Wk1pWVBxVVBRdm80dEw0MTVUZHdlOFpsMk1PVmRcL2swdE00ZlwvZGN4NmVFZ3NBNkYzZmhEV24xNURNOUY0cXdrSkI3SlpMVFRpQ1JHSWhzXC8waStWUllYRkhPejNVc3RySjM4Z3Y2RTVUMHNkallJUXNlQzVTdEIyRjFDYzdBQnlCVGVjaGVXcEpCTVIxUUdSd2Z0RDV4Rkw1eklFVnpPQTFaUklDN1FBSkFRbXdXOEN1Tm5xUCtqbk5xOGtRZ0d3c1pVdUFuTmhaeVNPXC9KSUNWNWd5QWtzZkJkOTU1dDNBK2RQaUJuMGo2ZzZcLzNtQTkzUnNNYjJabGJSNHZScTZaZG9nd1VLZm5qd0cxVXR6dWVVbFI2c1wveEE0dDlOWWtUdDV3bkdrS1NGeDNhNmVRenJCTWhUU3o0cklNTzBoSXZYWXpUeVhtKzdxdVMzNkZCRTRBVThTZG9hRGFBZEpMaUMzQlwvNVwvVHd3VyttV1gzWFVGWW9iMkJXaGx3TUV2TTBRSUhUTlFoR0NPQU5zTXVVN0kxVmVYQ0ZNOTZcL2JhazBrQnRYUWtpNklvTmpDQ2ZDbVA3NEVNdER2d3dJbWVra01FbkpjR3dtNEtiUDd0dnR0NlBpTERlcm9FRjBMTGEzcXg5UzMrYU1NM01XQ2ZsZmloUVpHc3J5Y0hlT1F0UlQ0T0pVVlVmRXlidWJEUk1Zd0xhYUxuMWxua21SejlIRE5oNXVYY3cxMXJzbTh1SW4rMkRYZk1jZk1EMUxDcEZjUWNaUEhHVlhsXC9HZitTOUh2RHZKcWh6dUw1eW9LQlpGeXBwMERrWUIzNG96SHFcLzZtNk1laTNyYWNJd21vN05Mc2lSdld0XC9PQ1M5QWJBbzM1TGQ2dkRXSUNqWndWMUhHUlpEV094TlZab0dweGw1eVl0VmtKSHI0Tm1xVjhwdmx2ZWJTRmlDNEQyWGlFdGgyeUQzOElDZEpTSHBzdUUrU3pYRHo2WVA5UVVcL3AzcnJrRkRtdndINmhkWnREUGFLQTc3eEEzdWRaY2wyTkhYUE42bUc2cWhiNmJrYWtJcmFzT2tYOE1BVUV1cWFVVGp4aGpmRW1HRGs2Mlp1U2swSmZNeU1RMFpPc3Y0SGlyMjhuVEZxTVNkM3FHMHNZZFB5bzViRlZ4RGNKZTFXQ0dcL3MyOVwvQ25mSURrMG5xZUIzVVA0V2tqNGJaT3JDcnpYVjM4eDN0YVhsejV5R1ExNG9iV0E0WHJyOStrbnZEZmdVcEdvTk5hUWgwMEJ0UmxMWDZFbnFRRGVBTDEweVJIMW1tSVA1TDhETldcL3VSbUNUb0lWbkJDOVN3RHhFWk56YWNwRWhMMEQ5MXVKbytFdFdIR2ZHcWNNcnhDYXVhVW44aloxQTA5cEl3cDd4OHFqbDJBb1o0Q3U4cmdiQTNXYkljeTduU1oyTGwrdjRoK3ZraDVUYytza2FBZzl1ZG1TT0NERllTclhHZmg3TFZlT2V2dSt3Q2hGR1orZ2RVNHZ1dlp2cXNEOHBRSzIwbTBXNThIMVFwOFNRVk9ibzBXYVB3XC9sYmE0bEwyRW9FaWY0M3AwYUhDMWJ1VjBHUGJJUFk2Uk1LZlFjanBwWXJHUFwvNXNoRlZsc2lQbllabG42Y05MR0k4bWNCTElpZVZoZHVHOWJ0ck1FbnBQaWwzMnhDa3NwdVJrV0l0b21YSEdxY0hpbTkrdDFOYVFOcjEySUcyS0hoUit2YmYyQTQ3cEVVOUc3aGt2Qm8xalUxeWxxYzB2ZkRGTmwrc1dNTVVsVitDXC9seGRIS3ZlNlhtVjBIM0FVRkpvWnBwVTBXOE9pbThLZ1JqUVdkMjRyWVE2Q2Y0cFZMUE5EUGI1UnVzNWwzc0kzdGNWNVRsVVdRSFpvQ1BDOStvbWNMNE1PZFJhV1BQZ3dZTFlYV1ZDTHJRSkc3Q0RObW9EdkdBYndkSVFIdEM1blhvbUtpakt2XC92MExyazR3MUl5K2xXakpFUFwvdWgxZXhvSENTVjM5MFhJclhnRmg0R3grMWxNVmhmeGp3WkEwMjdYSUNTTVh5cER2Vm1saG5VcVZCSTAwZWFNTkNQUnVJWDNkQUtKaHFHTno2ZWlWdnhGVVorT21vYnMwXC9pRGxzbU5RTzg5RktQZmZjcVJ5TXZ0SjBITlZWQ1pXSjhyK1k0bEU2cFRLb3FYcjZISFFvblwvM1A3QXJMNGptNHdBMEJHYU84cnFYWkVJTk1zMThLS1dhV3ZsNUg0WFwvdEZqNHFPcTA1OUxRRzlhS0prb0gwbVBya1lcL1NLMXpDZGJkdmgxYm1rdXNwcnFcL0RsNzRqcW5QNE9PZ1pKaVhKUHRyZlgxZ2RZaWl4WVpQYXBZaDFNaHZCc29oSnlcL2llSDhRYVplM294ZE1ZTjdYTlNROGRWeml2a3lYTk1uanIxSkFcL0dwY1dtQVwvZEwyZ24xajREcHF2cVNsZWpmTnJkRGduSGtTd1dad1pPWmZHcFZVbERkTFwveUQ4TWZUOXNtQXlyRmk1RjM3WWk3a3Q0TXVBa21oN0FvM3hET1wvUnpMNGpLcmg2aHdmdmlSTTRiVUZZNlwvbk9YVkc4UGZuU3d6SmIxaUtEY1JoQTRYdTIzbGd1ZVpPZEZUVDgwOTk3YXhmT1hhdEpyaG9RZk5zeVA2dmRER3YyempBeExoRkhKbWxJNXlRcE5TdlJzaWZQZ21VTnNVU1ZvTEJZUXBhNnJcL29CTDdwK2RTbXd4dHRsRFBLOXNcL1BHdStPV2hFSHVwYzBIeEFuWTJRMnF4SU9LSGpqRXI5ZFhaaFwvNUN2WEpocThVbVgxMVg5dUZaRExGRFRMVjFYalVsSEN6Rlg5STNtSjJIVWpUYURBc2crWEhqU294MzFvYm83TG5BUTFWWjh1TVwvNjNMc1ZGZkJPZXlFR3ZBSmQzeFBuV0JiXC9MNlEyNjhGem1aNmhlVEdEXC9vRW9rcW9RYTNycEplWnhpTFwvMElBeEFLOXM1Z2lsd3lDZTlOc3VZQzN4cWhGQVdrWnJkT1RcL0NBU3I1RVppeTlURkpsMzNpXC9OaUpzeldtVXE1cmFZSDVzbjZGREJHM3RGSTRJOU9OWFlEZzU0UUYxXC9yNERlSjlleCsxXC8rdFMrQVRtVlRJZTV2TG8wSTRRZ04wcExGUElaZWFnYjlhUDN0QUZ5UStaSVUwa1dFTTNvWVZyN0lYVlpqRVBKa3BJNEhkbk44U0N3ajB0WG5IZXFhNnZnSlNlN2ZIT1lzMlIxSE8yU0VPSUxXbFB4Q0oyRGFnRWhzZndiVXBhYW5BSm54VUI4ZEtRdXhaK2w4QlVrbGlKUkFmSDBjXC9NR1VjeVFiNTBGMHZadnc3V2R0bTZrT1NoSmJYR3hUVHF2V281RXFyNnFLN3NcL3liTmpRZndTVE8rd1wvaG4yVzdFVVB6RlN3aG42VklkN0MzY0UrT0FKRDFVSlpqemd2eDZnSVVCUEZWaWdYcUlqTzRyNHVyWXpQUXpVZ0tSc1c0dURrS2s2K1lDSEozUmpRSjlsaFwvR1g3T0N4RXY1eVE1R2pMQjNtcnJsXC9pSWYra0poQVB5SVpkeFJQTkpmYmdFa0QrRG5qY3BiQXQ2aDFMYWNkWGo1V3NBZ0xxeFhkaExBZE1ad25JMEpLUmd2TDB6Y1wvNFQyRCtcLytTa0lIaHpMeGtBXC9FUnE2WGw3UjJxdk5BNnhsZUIyZHo1VGtKQkhmRElJOVZjMXc4R2lTaFlScEFodzcrS3RFYWN1bFByaU5Va3d5cno4N2pjZnNua2ZoRlFnWktaODBTSHdnc2lvNTk4Y2J4NTBLeTlSTVwvWWVsTlRSYlNlbnNLeEFWMkU3TFhEVHlaY3hONDlyZXYxdlwvWnZmakZZclVyTG44UEJJckJKSk0xbTVPY1NtQmczUTJJZ25MMlJsandrSjdrZUNDaGRTcllocWw3S29yZ2JDZTVZNDljNlwvTjRNMG1GYWswVmVGOXZIK2ZyUVNJMUJZdGlUZnhsTXdJaUtKUFlTbm9sNWdYMnFiRDJaRStKbW90ekpvdFB5bUdGNkZkK0NOWUZ2YVlzdGRJak04K2FuUE5Fem01dDkzQVFvMFhwWFwvbnllXC9aREFsN2hWNlJTektzS05GOGNtZlpsckpXNXhqZVZQRW9HZkJEM3FyU3VsbXdrXC84K2tKU1wvbzVsZDFZSFpXeDRVbnJ3emN4ZllaVEptYytWNUo1OEpPYmRqS0NXT1JTWkRUWGtyZGtIOU5cL3FwbjB2d0pVZjdIcWZzXC9VKzl6ZTJ3UDdlaEVpK1NiODBDcklYNThWSk9EY285WXgrXC9NamtSR1JrcThvTXdhQjREN1cwZTJqUU1CQm1CNTFXbEZVYUNnWkFIN3VDdSs0emYwU2pjSTZ6QWF5QThoNnJLRVNCdHhUYXk2ZnNzTURCTHJYaXVPeGdpbkdjK1AyME9lSWdHajdHVzR6U1BiM0lvb3JKdFJ6OVlvQmk2MEhmWjR3Q0FydUkyWnVHbHpcL1FwUjB4b1ZPckRYeTBONVp2azVIekhKc0dZYVZPYjJwemYwSDV4K3lvRFJqVmNKMzI3M1ZtNEkwVGl3aGppdTArenc4YU5tSmNRWkVhUmpBMlFvZFFMbzBKa0pOWXQxUkZEYWFDWnFTOU04RGxXQUFKOUc3R2paTnVoY0dCb2pUNVlhNlhveGg1d1N5Vksra1pEQzBEdG5ITUJ0RCtSRzg4S0d1TldlK0NXOEt1eUU1OWhkQzF2TmlLRzJmdFNqbEFBMGdsREg1UlwvdVZoWDFtR28xcTNVeklMQmF3NzJ3YmxuSWpzQ2VsNkxkRVk0TnAwN2REd25zb29xMXJ5SHVDcGJVRFpwVWlpbHJaY3dTRnpvR1pzVGdzSnB2VWlhY2JmaXNGZUdvd0lDT1wvaWtuZlwvcUNSaWtaWDhBanZtY3owd2tEcnBtZUZ4WmRzeHBsc1NYZmtGbnVUOFVmdmZLVzNVaDRvbW5GY2twUE13YXZCdUdkdWdob3pKRlBHRUpsMkx4Skpqb20xaHRuWWgyNTNwK0pwQXVTZ2YraXFIVk5UOW02OTgweGNkNkp0dzRDMEdFMXpZN1dCZVNBQXFQbVZwcTVyT2pwcmpXc3lEUnNacjJnZ2h1ZTM1REZYbkhQN1oxdEhEa2wreXNDNnBEZXRRUmRSQWhUb2ZQMGNlaFZJRGtHTHJHK2xQNTNzUkRTM0o2U050SmZGU2piTnZNSXNSVVFlTE9ZT1puOXp0d1FDZHlwMWJUNmx1d0lEZnJaQjg4S0JYY01VSmZscjNRNjU4dlpvRDlmUFpYUG1qSkw0ZkR1NmZYRG55dzJjS2VIcXN0N2VXRHFwRlwvc3E0MGdzQmg3YlFKUzN6dTdGWFFDOGF4SVVvVmJtOEhRVlpVT0hwVFV2OFBINFh0OE5VVmJNdm1jSDNvZStRRnJFKzdYTW56TFBHQWxwcjB2NjNmSTh5aUZ1RzZ6WWhsU0Z0Mmh5RHptRFVwTGM0YXV6amg1MnFYMHdtRGt3SDgzZ1BTcmdQMFJieXZJYTRUNTZzTnlJNlRpRWI4dzJsbjlEQU5KVENcL1dcL2RYbW5VVFk2WEE1THBDWGJGVWg2V1l3NGplQmU4ZWQyMnlTMlJrWXVjUk1mczFLMEcyTGE0UEJ0SWhJNFBieSs4bEpLZjVNNFgwQXBBclZTTWZ6YVRyM1wvTWxlZFp2XC9mUHowMzE1a1ZGXC8zREgrY2FoZnlveDRvcm53MWFwSVQwa3FHY1ZNRm13bkM0c3NRdmlQOFwveHg2NjRYcUMxV1I4c3ltR3JDZGQ4c2pzNUhiMndNNmpqV0ZiU0NSZWJkd3NFOGRNMW1heWlFbEdWTEFYdWNocFZ4VjErbUdnKzN2RjFmT0hvR2c3elMxNUxiT204QUFaNXVJMFNGQ1FyTHpQbTZsRExudFE5RkZ5UHByXC9tZ0x6WCs4NVlUQjFhOFluVENxUXlKeXpnMzRpcDhWUTNtdWxZZ3lhV3Z3OVEybTVTZTVPcXBTbE9YUnNISFlaNVoxbXRMTndnVEl6VWRwdSs2blZ2SmRGcXpSd09kSTNpVlJJYURHeHhJaHhFM3huYkFVQ0xGNUM0ckQ5aUUwSFBsdlA0eGRDaEtFTEpUcUltVUpBd00xMWR1SmJiMnFrSFBIMCtzZHVUZ1FZNFlIRzNOMDl1TWZQeFJ5SUhPaktyTEE1WlFjSUN0N2VGYmtYc1NvV3hxT3dTenliMGMzYmJ6TGd1eVI5Q2RtMWtabnNYc0xkUjQ2UXRFOWNPZVRlazNKUFwvYUlxK1Q4UDNmVGtHRE9MSFgzaFplRnpIVW80RnFXK0ZOVmt1eGZHV2dMZ3pua0FVck1GeWZQRVloUDNQNmpMT2NcL2xEYjBGbFQ5K2gxY1FadUo1NEZlc2ozb2ZhXC9jMFFPNWdxWnNKTFdkKzhPZTUybVMwNjhocDZQYXRMYjlObENOZGU0UWtWcTFIRDhPYTBEVmpnTDl3YkJMSStSR29kOTlXUGtRWkVmTCtodDlmZlZQZlZJbWdGVUNOSlNFcEI2eFM2RWVvVXFJaUo1a0hpblRjVVpXb1wvYU1hMUQ5d0NjQWlJVEZvMmw0SEJoTXRqNWtYVDA5bzZCbktYc2tYd1FUNGJvK3k5N09neTVxNGpaMjR6MFFaZTAxaHNyRDhSWkRVQzdnSzRWZFZIK25hVlVNVXY3eHFoZklGMzNiaWttYU5UVEdJSE8yZ0JGUmRycm9LenYyWndLa1JRd0RuRWJvbDBUVWJvVkxVTFlLeGJtcGNmd1hCWmhUWWRvenNYcDJnYVN6UG5KTjVKOUZ6OGQ2aHNHYjlIb1FFbmtXNzdpOU1qVUtOaUMrYzhNTVwvcmROeEQ3NHE2NVRvbDZrSnpTbjZVMnhlNG8yUDFJSitBbmpkMUtRNnhlRUZzXC9wOVwvdkhnQWZrZTljWjFWY1psRktHVXF5ZzFPZEJDZzFBaHVMODdHSFwvZ1VEcVhyWEZnZEpiTnlYNjA1dFdOQ2szNytwekg0b2dyTWhEWFhaTERIbEN4UlhoYUszR1BHUWlTYVI2NDVpVCtIUGUzUTl1WjY5cUFnMnpVSEhlQTFwUlRWY0ZGb2FrUFBWVmhlR282SnJ5NW1aZTFvdTFvaGFFRmpFWTFXeHZYbzJxMWRjRmRwREFBbzRnWk5KRWZhZ1k1Z2hMTTJXejRKV291OXV0N1ZJYXczdG9zdU5FcnRXSEppdkZteGtwQkNEQkxoOWlnXC9sZTFxM2E1U28xSDA3cTVnZ01LdXliRDM1bVUyWldBb2V0ZEZkQkxJU21XUHJUMkZlbDBjSXJqd2g5ZVJlSnpNblFvUDlSN1wvUG0zeHV4VnM2WXdROWR0RDMwRkJQVEJndWhqUjJ2UTdFMTFUTmNsVmhKbGJOMWc5Q0NvZTlnWnRPMjdrUXBGeGg5T29MSENkQkhmdXoyUlVWMDcyRGxLZjZYNlIwdnE1a3dWSUlaZmwzQWl0SlZXWDV6UXd1Z3VMZjgrRVJOWXVybFM3VWhycWRcL1VCa2M3WTFEQkdJT09lS3Y2SnRhQTJCNVh5OW1LajRRSjZlVnVhMm1Wa2d1bWFRcVlhb01CTGNxQXJyN0ZjdTJCVE9XZDVUV0F2eVI1Q3JId0FKR1krWEVFY3k0U0h0MngxaWQ5dEVIeTFCU21CckRmY0o0Sm1cL1NDaVppSHRKakJXam5KMEx6RHFXbjRzQTdCR05CYnBNT0JcL2RVYnQ3a0lcL3F6emZNcVg5Z1NRTWFjWUhIczRlakZ6YWxqSjEyVU56TmVhRWY1NW8zMGExdEdjaVwvRkdaT083cDZNNkYzWm1OeklFdVU1dW9wYXJTT0RaM0F1bXhVNWZtM1dHazBRTTN0WXMwbG9NdnlJTnV2dnpJK3g5V0x0K3k2R1l5V1BSd01DaUtIWVRtRUhteHkydVA2NjZMNnZDcUNPUGtoeHBvcW5zR21TNHp6TFdtUnpMbThZRXpCZk5sY2hKTUlVcUQ0bUtRRWhSSTk4eld6YVo2N21kdHNYYlkwZDk1NDlLZU9sOWc0ZUlYOUZTaEoxTjBvd0pjTGEzTEF6OFwvNDlycXI0VTBQVWJwdjFneGx1RmVRVnpHRkpYMUkyWk54Z1drdVRpMTFrZFwvVnliTThSM1FGZmQrWWc5VEZvRXI0cndDdDByRjk4VVpINVhyS2x5MHFOZ2ZMSkt5b2ptdjRNNjRBUTVZYVpGVFwvc2JTTEVwOUFoKzVUMVI5TGJSeU0yMTZlYjJpcGc3eGJEQm5LNzVzVkUwSTVydU9JMmo4UVV1XC9nOG9BaFRoOWQxV1dqenZCMGZKYU1WbEJqMGlZbzhKRTJDVW4rOEp1Q2taK08wXC8zYkxDclppQVNZUkxHbWFyY3k3b3pxRjc1QU13WlVCdkljNjRLajNzVzI5MnZpankzdFdvZU5WUFVadk9xYzdGM1NQeWJVXC9GXC9GbzRIUXdqSjdlSGpBVW04c1NKVXJQTUhrenV1SzhrMmFJemdrSmwxTDI5ZEJGV2tqaWZ6YWF2dGtFTTc3eGh0dXRTSmZRR2dhMlphU0VaVm12ak5vcGdHNlk1UkYzbHRXUHRHc2JwMFJSM0MwZTVjWmlja0dTRWtDN1lENU9HYm1zaFo3U3RVXC8yeDhYSmJPWHM0aTdidjl5VUNETzY3U2RzeVhNYXpLM01ZdDhuUjVBRnEwTmFKYlJuNHpsMjh4WDdwUHNHSDN5WnRaRXBTQ2ZCSDNhVldCYWE3T2VURUVJK2d3N293KzU2TFhWaDM2WnlhZDdoOFN1aWs1MThwQzlKMEtMT1dQaExZRnNJcG1HS250Ym9JRFVlakxoTVwvSldIczhnM2FJanRpM2VESmI3cW15Ym5aOWRYRGpKU1ZWMFliQ3QyZGtXclN1Z0t3dXkzT2tKeVY5NncyeitiUFVycXB3YW5TZ0liVmhlT2h2Wm15b3BseCtaNU5td2VTdTNWV3V0Z2NERzV1SFBuWHJQZENUcm1ZbTE3VXVYa2I3ektvMGdGTm1Zd256Vkh6aldDQ3B2RUVOUkRQeEJmeHRkMndVWHZmMHdCVDhha0VHZWRReDdPNWhkWGg3SUE1YVUrUHZseG1XSllSSXFDZW9QRFFUdUI1T29zRmhLMXNwRzRDSXBwS01pYmdRYk9tWnJKN2N5RFFKcWpZMGVxVU9xVUhlenhcL0pXc0RQbGRsVVFDTHBJY0ozeTA4SGVJM25LcGdHaExCVWN2SzNQNTZGUXhmK0JwWlJPdUM2SnpYK0ZsR0RieG51d3lkN0ZJUUNhalRjS2tUM2JWN21XN1Y4dkJud2Exdzdqd2k5QXpqNGVEOFBHOEw5Y2F6NTN6Q01uQkdZOVd5V1JMVFZLTk43VUxuRXNVbjlEcGJGd2ZXTkpNMVF3MGxkZUlsbFBhQXNDaHgxWmZjUkJHRk5qUWpBRkFlK3JRdUFDVXYzTDVyT3hmckFwcm1tZ2lqSmZTSnpNaHBBcEZJSUZaSitSZGFQbEFxWlhVU2h4UWc2bmk2ZzJcL3hBbW9hTEx2d053UW5Rb2dDVEdcL2hcLzdPQ3drdVBPQ0Q4Q0YyZlJwb2pYbXpzTmVuUVlkOE5IV3Z4NGJGOEpENGxUODY1aHZRazhBaW1SMmRyUVhyVjJ2UGtmbGlZclFYN2xHYmttQ1NCTXdxMkc4RW9pNERJSTdpaTFKV0ZsNFoxcnhoVENadUxwWURRQzF3TE1jQ1V4RjQ5ZHBYWmpoKytGTDFnZEl4S2VWdVViMGl6bWV3Ym9xZ1NFZUtRMnlWNW5qY1JvMURwZ1diNWlEd1RcL3NMWEtvOEx1cDBPUk1panEzNFdVUGFNWUFjeGxsQldnRzhTZ1BhNmZXdFNXUUFtZHlBb0hRc1d5U2xYaWRJNEw0RWpQVnZGSGhsR1wvRXl3NE15VUlEa3ZqY0FZV3VzQ2daa0hOcEs1VFdnOGZhaG53ZWZrWFwvU0pVWDFabzhhNGhrZTNlclBmN3UrZmZDZ2xwSURmY1BIQ2JjOVlLVDVRQ2dtR1FLRjkwa2V0UzB0VlFuelFHbEFtUVF3dVpHM2NZdXpycnF6d3ZHeWZYYVRheFc3Mkc2QXVsOFRQbzRJZ0dUcCtzZW52YmI5T3BTdG11Q0xEZW1kT1BoZkZkZE5GVVZhQ2d4RHBFUVNISjRzbzYyZ0VTTHdDNUxlQUd2NE1nUWFGZDlDVXlvT2lWdnNLbXpQSmFNWXVmQVUrWG9sSXhoaEU5S01iSTVZb2VhQkxwZ1VEOEZLQk1YODVYTStwMzFEaEI1bVBkVWFRYW9FQ0l3TnlMQ1VkQ3pjbXJ2Q0gxY1I1WnI3MHZhaXJYSldQelE0enpBUTBaUXhDOVdmc3dBN3FHWElHdmFudzFZSjRvbTRaTE96a2NoTWlMemFMSDNUaXJTbFZ4SzVlaz0iLCJwYXltZW50TWV0aG9kVHlwZSI6InNjaGVtZSIsInRva2VuIjoiZXlKaFkzTlNaV1psY21WdVkyVk9kVzFpWlhJaU9pSkJSRmxGVGkxQlExTXRVMGxOVlV4QlZFOVNJaXdpWVdOelUybG5ibVZrUTI5dWRHVnVkQ0k2SW1WNVNtaGlSMk5wVDJsS1VWVjZTVEZPYVVselNXNW5NVmw1U1RaWGVVcE9VMVZzUm1OWGNFUlJNRVozVTFWT1JGVlZVa0pSTTBFeldtMW9RMVZ0TVUxaGEwWlBVVzFrY21OWGFISmhWV00xWkhwQ1ExRldSbnBTYTBaRlVUQktkRkpGVmsxVVZVWnlVakJGZUZaVlZrTmhSVEZFVmtkME0yVkZXbkZSVmxaRFdqQTFWMUZyUm01VVZWSldUbGhhYVUwd2NISlVSbFp2WkcxS1NHVkhhR2xpVmtZMFVsZHdRbFZWU201VWJGcERVVmRPVGxFeFZrZGtSMDE2VlcxNGFtSldTbTlaYkZKR1ZXc3hRazlGWkVKTlZsWkdVVEprTTFOV1JsaFZhbFpoVm5wU2JsWkhlRnBsUld4RlVWZFdRMW93TlZkUmEwWjZWRlZhTmxSclZrcFNhelZ6VjFST1YyVldjRlJSV0d4TllXdEdibFpVU25Oa1IxSllaVWRvYTFKNmJEVlVWazV1WkRCd2JsZFZVbGRWVmtaRlVrVkpOR1ZzU2tSUmJGSmhWakEwZUZreU1WWmFNREZ3VGtoa1NsSnJOWGRaYkdoWFl6RnNXVlZ1V21waFZVcFVXV3BKTlUxRmJFWlVhMHBPVVdwU1dWSkdVa1pPVlRGRlYxaGtUMkZyUlRGVVZsSkdaVlV4UjJJeGFFVldSV3N4VkZWU1dtUXdNVFpSVkZaT1ZrVldOVlJWV25aa01tUmhWVmhvUkdWclJrdFJiV1JQVm10S1FsZFdVa0poZWxaT1ZGWktXbVF3V2tKWFZWSlhWVlpHU2xKRlJYaFVNa2w1VDFoc1lWRjZSa3BaYWtvMFl6RnNXRTVYZEU1VmEyd3pVbFZHV2xKR1dsSlZWV2hGVVZkNFExbHNhRTlOUm5CWlUyMTBXbFo2UWpSU1ZsSkNWVVZLYmxSc1drTlJWemxPVVRCV1IyRXlWbGhXYmxaS1VsUldXRlJXVGtKa01HaHVWMVZTVjFWV1JrMVNSVXBxWld4S1JGRnNVbUZXTURSNFdUSXhWbG93TVhCT1NHUktVbXMxZDFsc2FGZGpNV3haVlc1YWFtRnJWbkpVVlU1S1VqQkZlRlpWVmtKa00yUnBWRlJDVWxveFZYbFdiWEJyVjBWd2MxTlZVa3BrVlRGRVVXeFNhRlo2UlhoWmEyUkhUVWRKZWxOWFpGSldWVFZWVkZWc1NsRnJiSEZSVlRWRFdqSjBlR0ZIZEhCU2Vtd3pUVVZLUWxWVlZrZFJWVVpRVVRCR1VrOUZSazVUVld4RFVUSmtURkV3UmxKU1ZVWjNZVEIzTUU1R1pHaFpiRXBSVkZWV1RGbHVjRlJVTW5SV1dXNXdOVkpHYUZkUlZXUnRaVWhzUTFScmFHNU5hMHBIWVdwQ1VVNXNRazlVUjJ4WVRVZDNORmRxU25GaU1qbFVWRlJaTldGRVFqRk5iR2hUWkVVeFRXRnVWbmRoVlVwWFdWZG9kMWRVU2pWVVYyeFpXVEpTZGsxSGNGVmFiVnBGWVRKU2VtRllhSFZSYlVwMFpFWndVMU5XVWpSV1dHUk5aVWhLTldKRlpIZFhiRnBXVmpJd2VWbFdXazVTTWtwcVZtMVNjRlJFYkhKaU1FNVdXa04wVEdRd2NFOVNhVGxVWTBaSmVFNVlVVE5UU0ZwV1dsVndNMVpHWkZWUmFYTXdVV3RXYmxKclRrZGhSR1JQVjFVMWNtUXdTbTlqTTNCdVlXdG5OVmxWWkdoV1ZGSXlUVzVuTUZKWVVqVmhWMnd4Vm14ak1GRnNWbE5oTTBwVlpHMTRjbHBxUmxwV01FNXJWMGRXZEdKSFRYaGtWRlpMVDFac2VWbFlhSFJsUkVFeFdUTldjRk50T1ZoalZGcGhaRlprVVZveFFrNWhhbGt3Vkc1U2RtUXpaRlJQVXpreFUycGtWMkpWY0VOVFZUVlFZbXRyTUdKcVRtNVZWM0JDWTNwV1NXUXdiSEZhYlhoc1RVY3hlazVYZDNoYU1VcFlXVzVTU2xreWREVlNSVkpyVlZkMFVtRkhjR3RaTW5NelpHeHNUVlJJVFhsWk1qbHhWVmhvYWxSc1JUUlJlbVJJVTJwc1RsWXdNVVpTU0dSS1VrVkdVbEZWU2s1UlZFSklVVEZPZUZJeFRrcFphazVGVlZWV1ExRXpaRlpSVlVVd1UxVk9RbFZWUlhKaWFsSTBXbFYwWVdGdVNuRldSRVpDV1ZSYU1sVnNVblZXVlU0d1kxaGFlbVZGU25GYU1rWk5WVlZhYVU1Vk5IbFZWWFJUVTFWV01GTjVkRkJqYmxKSldqRndhbFJJVm5GWldHeEpWMFpDY1dWWWFFOVBWWGgwV1RCYU5GcFlXbEpUVlhBd1RXczFVRmw2YkV0a1JFcFVWMFZPUjJOVmFESldNSFJ6V1d4a05WVXdNV2hTV0ZaYVVsVnNhVTFZY0hsaGJGSnFVMjFyTlZSc1FqRk5WazUwVmpOS1IyTXlhRzlqZWs1T1pGUm9iMDV1UW5oVE1IZDZUMVpDVTFWV2JIbFdSV2h6Vm1wa1QxZHBPWGhXVm1NellXc3dNbUZVYkV4a1JVcDFVbXR3TmxGWFZrbGFNbFpYV2xSb2FsUldRbFpOTTBKdVZHMDFiV1Z0VWt4UlV6bFlZVEJHVlZWVVZraGphMmhDVmpBMU1HVnJaRFZUYTFwVFdsUmFVV0ZGYUZCWGJFMHpZa2R3V1dOWGRGcFBSMFV4VlcweFdsVkZPWFpYVkZKUlkzcEdUMXA2U25SalYyaFNZV3hTVjJSVVFuaGphM2N3V2tSbk1sTkVhRU5aVlRoMlQwVnNOV0pJVWxSbFJXUTJWbWs1U1ZGc1VsWldWVTVaWW14c1dFd3pTVE5OYm5CWlUxYzFkRk42UW5wak1HeHpaRVpLVlZGV1NsZE5WMDVSVFZoV2RHRXdSbk5TUlhReFZIcEtkbUZ1UW05VE1GRTFZMms1TUU0eFRtbFNNbFpNVmtaQ1JrNUhNVnBQUlU1UlV6QTFRazlZVmxsVVYzaHpVekpLV1ZWWWJITlNWR3gyVkVoV2FWcHBkRkZaZWsxM1ducHJlRlZGTlZOalJVWnVUbnBHV0dSR1RrUmFWbWhOVW5wb05rNXFUa0phVlRGeVZGVk9VMUZYVWtKVFZUVjNZMFZHZEdReWREWlhiVGd6VG14Q1ZWUldSblZOU0ZGMlpXazVVbEl5Vm05aFZrSlBVMjB4V2xKc2IzcFJhbWhKWlVaa00ySnNVbmRPTVZwNlYxZFpkbFpYT0RWaU0yeHdXVzVHV0U0eWJIaGFWM1J1Vm5wa1dFOVZXa3RrUmtvellXeEZOVk5yV21sVGEwWlJWVzAxUjFaSVJuaE9WVlY1WWtkR01sRldRbmRPZWtKT1kwZGFRMk5VVmpSWlZYZDJZV3RXVmxwclNtdGhNRTUyVDFab1EyVlZUa1ZSYWtKdlRsZDBURko2VVRGaWVsWnZVbXBHTVZwSWNFTmFNR3hZWVdwT2RGWldZekZhVlRGdFkxWkNiV1ZXUm5GaWJHeExUWHBhZWxFeVkzWmFSMmhIU3pCV1FsRnJaSGxWUlZaVVZteGtXR0ZGYUVkT1ZGWnhZbTFzV21OR1VuWmpWbXhIVGtaSk1WZFVXbWhhUm1nd1YyMTBSMDFxVW1oTk1VNVVWRlV4Y0dWVldYSlRlbXhNV1RKYVQyVkhkM2hrYlRGWFpFZEtNRmRXVGtSUmFrWlRXbTFPUkU5Rk1YRkxNMnhZVDFkSmVGTXpielJVUkVKcFlWZFpOVmRxU2taV2VsWjVaVVY0TUZGVU1EbEphWGRwVkZWc1NsSXdTbFZSTUU1Q1MzcEtibEZZWkVwUmEwWnVVMVZ3UWxNd09XNWhSR2g2WkZWV2VGcFZPVTVSVkVKSVVURk9lRkl4VGtwWmFrNUZWVlZXUTFFelpGWlJWVEZLVWpGc1RsVllUak5STVVaYVVrWmFVbFZWWkVaa01IQlFWa1ZTUmxZd01VTlZWV1JDVFZaV1JsRXdSak5VYkZKMFQxaGFhbUpXUmpCVk1HTTFZekpLU0ZKdVZtRlNSVlpVVkZWS1FsSXdSWGhXVlZaRFpETmtTMVZXWTNobGJWSklWbTVzWVZJd1dqQlVWa3BHWkRCU00xZFZVbGRWVmtaTVVrVkdiMUZzY0VsaVIzaHBZVlZLVUZadGNFWmFNREZEVGtWa1FrMVdWa1pSTTJRelYwVXdkMVZYWkZaTmJGcHhXa1pvUzJKRmJFVlRXRlpPVVRCS1ZWbFdZM2hOVjBwSVVtcENhVTB3YkRSVE1GSkNZbFZLYmxSc1drTlJWVEZPVTBod1QxSlZiRWRVYlhoYVRURmFOVmRzVGtKbFZYaHhVVmRrVmsxdGVEQmFSbVEwWVVkU1NFOVliRXBTYTNBeVdXcE9VbG94UlhkU1dHUkpZVWRPVDFSV1VuSmtNRFZ4VVZSS1RsSkhkRE5VYm5CS1pXeGtiMWt3TlU1aGJYUXpWRzF3UW1Wck1VVmhNMlJQWld0c05sWXljRVJSYlRGRlVsVjRUbEZYZEVoUlZFWldVbFZLYjFSVlRsVmhNMlEwVW0xd1FsWlZTbTVVYkZwRFVWZGtUbEpHVlRGa2JVbDZVMjEwVFZaWGFESlphMlEwWVVkS2RGVllhRVpoYTBaU1VXMWtUMVpyU2tKWk1ERkVWbFZhTUZsNlRsTmlSMDUwVlcxb2FWWkZWbE5VVlVVMFVqQkZlRlpWVmtSYU0yUktWVlprVTA1V2NGaE9SMlJWWWtac05GTlZVa0phVlVwdVZHeGFRMUZZVGs1U2JuQlBVbFZzUjFSdGVGcE5NVm8xVjJ4T1FtVlZlSEZSVjJSV1RXMTRNRnBHWkRSaFIxSklUMWhzVGxVeVpETlRiV1JhVWtaYVVsVlZVa1ZSYW1nMlZXdE9RMVpHY0ZoVWFrWnFZbFpXYmxSWGF6QmtNR3hIVkc1Q2FWZEdXbnBYVm1oVFpHMU9jRkZzVG1sTmFtdDNVMVZXVDFGck1VcFRWVTVLWVd0R1QxRnRaSEpqVjJoeVlWVmpOV1I2UWtOUlZrWkdVbXRHUWxRd1RrSmFlbWhDVkZWc1NsRXdUbTVUTUU1Q1dqQldRbUpVUm5SaFJrNUZVbXhvV2xONlFqUlNWM0F5VEhwU1FsZFZkRXBUUm1SNVpVWkpjbUpIYUZWYVZuQnBaVWM1YldNd2NFTmlhMmhwVVROc2JHSlhWWGhrZWs1WlZVaGFWbFJIY0ZWbGJYUTFaRlJrTVZac2JFWlhiRTE1V2tWd1dWbHJlSGRpTVVaNlpGVndjbU5zYkVST1ZUbE1WMFZaTTAxclJsaE9ia3A2VW5wS2VGTnJVVEZWVm1oQ1pGUmtWR0ZFU25abFdGbzFVMVV4TTA1dGFFSmhhMDU1V2pKV1ZsTlhNSGRUTWxKMVQxVmtVVlpXVGpOV2JYaEpWakZzZDJOdFVrMU5ibFpoWlVWR1JFNXNTa0pXTTBaR1dqTm9lR0ZEZEhwaFZ6Z3hVMVZTZUVzelVrTk1NbTgxV1ZWU01sbFdRbk5YYXpWaFZsUm9hRlV4V201aWF6bE5WR3RaTlZFeGJHcFpXRUY0VjBWb2FWUlZUbk5rUldkM1ZsaGplVlJIWkZsbFJ6bFFaREIwVlZwVlpGSmxSRXBhVmxjMVJVNXRiekZOVm1kM1ltMW5NRTlWY0dsWGJWVjZXVEpHVVdOcmFIcFRSVkY1WVVoS00xSlhXbEJUYTFWNFlWVndNR05ZUm5WVlZuQnhXakJzVVZReVkzbGhiVTUzVERGc1dWVkhkRVJqUkZwTVZVWnNUVnBWV201UFJVNURWbFZOZWxORmJHNVpNMWw2VFZkS2FsbDZTVEpXYTNCRFQwZGFNMU5xV21oaVNHUnZZa1ZLVGxOdWEzcFRlazV1VkZWdmQyRnVhRlprTWxaUlYwZFdiVkZ0TldwaFZ6ZzFUakJPVGsxdWFIWlNSazVMVmtkYVdVNVlSa3BpTWxVd1lsWktSMVF5WjNkUlZGSlVWbTVDU2xWR1VqRlRWMFY2VFVkV2MxZFhTWHBhTVZGNFpWZFJkbUpYV2toTlIwNVpUMFZ3YVZsc2JIbFRiVGwwV1ZSQ00wMUhVbnBWYm14NVdsUkplbEp1WnpSYVYzQktXa2hSTVZWNlNtOVdWMHBEWW0xemVsVlVTbmhVYlZaTlRucFJjbGRYVlRKbFNHeHFUMWRrY1ZZeWRIaFBWM0J6VG5wa05WSnRaR3BoYW1oT1lsZHNVMUZWVGtsbFZrRjZaRVpHVldGck5WcFBWelZDWkdzMVlVMHlVbkJPTUU1R1ZsYzFiVnBJUlRCT2JYQlZZa1ZXY1UxVk5IZFJlbFV4VkVoWk5XSXlTbGRPUlVaR1ltazVWMUp1YkV0YWEzY3haRzF3Y1U0eVJrbFVSVkY1WWpKb2NsUkhSa2RSTUdRMlV6SmFUMUV6VGtOalJrWkRWV3RqTUZWdE5YRmhiWGh1VjBaT1dHUkdhR3hoVjBwUlRqQmtUVkpyYUVWWmFteDNWRlJzYTJWcVNrdE5hWFJHVlcxMFFrNXFUblJWV0ZwRFZqQTRNbFV6UW01TE1VNXVXbTVXVFZsdFJrNWlhbWcyWVd4R1QxTkdRVFJWUkVvd1YyNWFNMVpWT1ZsTE0wa3daREpHVGxkVmVGbFhSR1JxVVRCb2ExWXhiRTFYYWxFd1YydFNkbEZVUVhKUlZVWnhVVEJXUkZGWVpFWlJWVVpvVkd4R1RsSlVVak5UUmtaYVVrWmFVMDFGT1VOUmJHeEdVbXRvYkdOWWFFTmFWRlpUVkZWb1JrNHlhRFZXVmtwSVdXNXNTMlZJVmt4amJYZDVaVlV4UTA5RlpFSk5WbFpyVTFoa1VsZFZNVU5aVlVaSFUwZFdlR1ZGU214T1ZrcE9VMFZWTTJGSWJGWlZhMlJwWlZWd05HUlZkSGxpUkVvMVZGVkdNMUl3UlhoV1YxSkdaREZHUjFSVlJrNVJhMFp0VDBoa1JWVldiRXRUTWpsaFUxZG9NbGt3TlVKVlZWWk5VV3hHUWxKSFpHNVRWVXBDVW1wc2JXUjZTak5XV0VKNVZqSkdNa3N4YkVoVVIzaENWVVZzVEZrd1ozWlNSa0pFVFVjd2QyVkhOWE5XUjA1c1RqSndjRlpGVWtSaVdFbHlZVlUwTkUweWEzSlNlbGswVGxkd2QyRXlXbHBWYldoT1ZrVXhkR05EYzNoTmFrNW9XbWx6Y2xadWNGaFJiWGd3V1cxT1RGcFZhM2xoTVVaV1YxZG9XVmt4YkhKV1IyTXlXbFZTY2xwclNqRlZWVFZYVmtWd1RsWnRiRk5aTTJjeVZqSmpOR0ZyUmxGaU1EUTBVMnhhYmxWdGNHMWxWR2hQWTFoTk5GbFdVWFpUVTNSTFRsZEtTazVzV1RWaFJWVXdZV3RzU0ZVelFUQlJhMlJyWTBWYWRGbHVUalJpUlRGUllXNUdkRTVFV20xT2JFSkVUbFZ3VW1WWFdURlVWMmgxVW1wQmNtUnVXbk5pUjBad1lXeG9OV1JzVmt0TGVrazFXVEZzVVZRelJsUmxiR1JQVVZoYWFtUkVVblZXTTFaaFlrZFNSV0V3ZHpCa2VtUnNUa1pPUjFWR1ZtbFNhbXQ1VjBSb1dWa3hhRE5PTW5Bd1RERm9hMUo2VmxsVFNHeHdXak5vYms1WVJuSlRSbG95VVRKU2RsVkZlRFpQUldoWlkwYzFSMUpIVG5GaWJHaHRaRzFzZVZRd01WSmhSemxQWWxSYVdWSlhXblpOTTFaNVZEQnNjVlJFVWsxak1rcDJVbnBCTkdNd2VFcFpiR2d4VjBkR05GSnNWazVqVjA1MFRqTktNMUV3UmxGVVZWSkVZMFZPVEdKdFRrZFZTRUUwWTBjeFZtSnJkSGhoVkd4RlpVZGFUMUpZYURSVmJteGhWa1JTYmxkWE9YRlhSMk55WTFWNFEyTnFiR3BSVms0d1lqTnNjRlpyU2tSa2Exa3pZVE5LYm1GNlRsQlRNVUpTV1cxd1IxRXlhM0pOUlVwVVl6TkdVVmt6WXpCbFZGcG9UVmR3VVdWdVFYbGFNSFJ6VjJ4b1EySnNVblJaYlhoMFZsaE9kbE5ZYkdsUFNFWXdaVVpDV0UxcmJGSk9WekZzVkVkYVMxZHJVbXhUTUZKYVkzbDBVMXBYWkhaVFYyOTZZa2RLZG1Fd2FHdFNNMmN4VFdsemRrMUZaRUpTYTNCcFZraHNhR0l6U2pGTlZURnpVMjF3ZGxsVmFHNVdSM2hhVVcwMWFWSlVVWEpaYmxVMVRVUkpNVlJGVmtoak1sWjVUV3BvYWt4NlFtNVdNamxoVXpKVmVWVnVRbWxTYkc5eVdtc3hRbVZyTVRaYWFteFVWR3BrZVZFd2R6VlVlbVI0WW1wQ1RXVnJNV3hPU0VKT1VWVndTVTFWV2tWUlZFVTFVVmhrVUZsV2JFMWpXR1JyWVVSbk5XVkZSakJVV0dodFZUSm5NRmRWYUZoUk1HZzJWREZWTTFZeWJIVlphemxGVjBjNU1GTXdaSEZXVmxKR1VtbDBNVmRYU1RCV1JFWndaRWhPZVV4NmF6VmpSVXB2V1ZoTmVGRnFhRmxOVm5CWFVqTndibVZxVmtsT1UzUlFaV3RXY2xVeVRsaFdWVXBPVTFSS1JtRjZhSHBSV0VWcFdGZ3dMbVY1U21oWk0wNUdZMGRvYkdKV1FqRlphM1JzWlZOSk5tVjVTbXBqYmxscFQybEtVVXhVU1RGT2FVbHpTVzEwTUdWVFNUWkphMVpFU1dsM2FXVkRTVFpKYldSS1RVVmtRbE5WZUVOYVNGVXpWa1JWZWxsWGRIbFNiVEZPWlZWa2FtTXdXWHBpYWxaclZIcGtUbUpZWkU5UmEyaE1WbnBXVkZacVFXbE1RMG8xU1dwdmFWVXdlRmhZTTJoVVdtMWFObUpHUWxoamEyaEdWbXRyZWsxRlVrbFVWamd3V2xka1YyUXpVWHBVYkVaNFdsWldSVTR5TlU1U2JrSjNZM2xLT1V4RFNucGFSM1JHWTBkb2JHSldRakZaYTNSc1pWTkpObVY1U21wamJsbHBUMmxLVVV4VVNURk9hVWx6U1cxME1HVlRTVFpKYTFaRVNXbDNhV1ZEU1RaSmJrSjRXVEo0TVZSc09XMU9SbTk2VG10R1NXTXdNVU5qZWxKRlVrYzRkMDVVVW1aVk1uQnNVMjVhVUdOV1pFVk9hemxLVWpOa1ptVkdWV2xNUTBvMVNXcHZhV0ZzVG5aaVIyeDFWRzFPUkZreU9VNVBWekZRVWxob2QxVklUa2RVYld4VFZqRndkRnBIVGxkUFZHTjBaRzEzTVdRd1NreGlXR2cxVTFOS09VeERTbWhaTTA1V1ZXdDNhVTlwU205a1NGSjNZM3B3WTB3eGQzWmpSMFp6VEZoU2JHTXpVWFZaVjFJMVdsYzBkVmt5T1hSWVF6a3dZVWhLYkZwWFVucE5iazV3WWxoV2MxbFlVblpqYkhkMll6SldlV1J0YkdwYVdFNWpUREZTYjJOdFZteFNSazE1VlRKc2RHUlhlR2hrUnpsNVdFTTVNazFXZDNaaFIwWjFXa2Q0YkZoRE9EQlBWMWt6VDFSU2FWbFRNV2hQVkdob1RGUlNiRTR5U1hSUFYxSnRXa013ZVU5RVJtMU9WMHBvVFVSSmVFMVVTV2xtVVM1VlEyWjNNRzkxVGpOck9FNXNlREUwVVhCUE9FUXdNWEZVVDNwMmVVWXllalY0UkV4MFdqTmFaa1ZmYXpCZlNGOXNaMjlCUkRSaVRWaE1OV3BzU2tObkxWaEJlUzFXWTNCRk5HRjFVa1k0TWs5VWF5MW9jVmx0U1VWNlVuZDVVMUl4U2pVM1NVZHFNWEZKWTJsa1RVbHdOekJaUTJkME0weFJhR1ozVFVSTGVqSnFWRE14ZEdkMlJFSlRkV1ZaTFdKclVsZFlZVEJqVld4VGIwVnFaRE5PTnpsWFoyWkxUMXBaWWpWTmJsazFWazVZUm5sTlRXUm1RWG8yVUZobWNsRjBjRE5qZFdKdmJITXhYMUpPUmxJelFVdGpZMncxVjJ0a1lYaGhVa05NVlZwQlQzbDFlbU50Wkd4ME9VNDFSemRsY0V4ZlIyeHRORW81YW5SZlYyVmxZamszVURaVWRXVkVXREo2VUU5amRUaFNVbWRWUjBKcFUzSmFlRU5rV2xWVVVWaFRiVlJzTnpkVk1ISkJiMncyZEhKSmRrbExablJLTWpGUWVsY3hjWGs1VlRVMFkwOVhXbWhITW1GS1RFVnRaVEZyU0djaUxDSmhZM05VY21GdWMwbEVJam9pTkRsbU56azBZbUV0WVRrNFlTMDBaVGRpTFRsa1ptUXRNamd4WmpWaVlUQXlNVEV5SWl3aVlXTnpWVkpNSWpvaWFIUjBjSE02WEM5Y0wzQmhiQzEwWlhOMExtRmtlV1Z1TG1OdmJWd3ZkR2h5WldWa2N6SnphVzExYkdGMGIzSmNMM05sY25acFkyVnpYQzlVYUhKbFpVUlRNbE5wYlhWc1lYUnZjbHd2ZGpGY0wyaGhibVJzWlZ3dk5EbG1OemswWW1FdFlUazRZUzAwWlRkaUxUbGtabVF0TWpneFpqVmlZVEF5TVRFeUlpd2liV1Z6YzJGblpWWmxjbk5wYjI0aU9pSXlMakV1TUNJc0luUm9jbVZsUkZOVFpYSjJaWEpVY21GdWMwbEVJam9pTW1Rek5qUmpNRFl0Wm1SaE55MDBNVEpsTFdFNE5UQXRNbVU1WldZelpEWTNOMlprSW4wPSIsInR5cGUiOiJ0aHJlZURTMkNoYWxsZW5nZSJ9",
"client_encryption_public_key": "10001|A3795C2E0A78E5FF639AB006428D5EC19166AF82C402828476442E44476AE3DB9BE22468C15D8744574080DE5697FB81FBC4A0E0AB27B3B33A2739F20B1A514C6DCCBA3414E36F8056D4E1C007B6BF9ED5579A47313BDB651A3A984864E927B3A5D47CDA068E6A5C3AD76FB88A4173BC57EE672D421B13B3434F2D4B03FC250AAD86D64121A1760C83289EE7097A4643E493333ADE8373E9FB36A24F156C4B42D404879BBD8896705E0E91CD4F8BEC0E02A3F38D6EE275B6440F40B40E88B3D1B3292ABB331F9CB10E11D5AC81977ADCD0C22B7ECF009D608C651CC1FD7D4AA114B2130C6E82272224248B29CE4529DE93E5D010BD3976557067FD48E090B653"
}
}
}
Depending on approval_action field we are either calling again threeDSecurityChallenge(response.getAdditionalInfo().getApprovalAction()) (required further authentication from Adyen) or go straight to order creation (calling orders request).
if (response.getAdditionalInfo().getApprovalAction() != null && !response.getAdditionalInfo().getApprovalAction().isEmpty()) {
approvalAction = response.getAdditionalInfo().getApprovalAction();
threeDSecurityChallenge(response.getAdditionalInfo().getApprovalAction());
} else {
_progressVisibility.postValue(false);
_backgroundProcessing.postValue(false);
prepareCreateOrder();
}
In case of CHALLANGE ACTION we are passing Adyen Action object to Adyen threeDcomponent (wrapped with LiveData) with getThreeDSecureActionModel(approvalAction) method. Value of decoded approval action is passed to getThreeDSecureActionModel(approvalAction) method where depending on type appropriate Adyen Action object will be created.
{
isRedirectFlowTriggered = true;
_handleActionThreeDComponent.postValue(getThreeDSecureActionModel(approvalAction));
}
When object is passed to LiveData it will trigger observer, from there we are calling threeDComponent.handleAction() method (AdyenSDK).
paymentViewModel.handleActionThreeDComponent.observe(getViewLifecycleOwner(), action -> threeDComponent.handleAction(requireActivity(), action));
This will trigger Adyen ThreeDComponent that we observe and from there handleActionComponentData(actionComponentData) method will be called.
Inside handleActionComponentData(actionComponentData) it is needed to encode back data we received, build request body for auth-payment and call postAdditionalInfo(authPaymentRequestBody) method.
public void handleActionComponentData(ActionComponentData actionComponentData) {
if (actionComponentJson.equals(ActionComponentData.SERIALIZER.serialize(actionComponentData).toString()))
return;
actionComponentJson = ActionComponentData.SERIALIZER.serialize(actionComponentData).toString();
String encodedActionComponentJson = Base64.encodeToString(actionComponentJson.getBytes(), Base64.DEFAULT);
AuthPaymentRequestBody authPaymentRequestBody = new AuthPaymentRequestBody(initPaymentHash, new AuthInfo(encodedActionComponentJson));
postAdditionalInfo(authPaymentRequestBody);
}
From auth-payment request logic is same for both cases like previously described above, continue authentication of customer if approval_action have some value otherwise proceed to orders request.
If the process was successful, orders request will be sent. It doesn’t differ much from the large number of other processors, payment_init_hash should be included in payment_info object.
POST {{MENU_API_URL}}/api/orders
Request payload
{
"menu_items" : [
{
"quantity" : 2,
"price_level_id" : "5d13b5d2-68cf-11ee-8c99-0242ac120002",
"id" : "fc54eadc-68cf-11ee-8c99-0242ac120002",
"subcategory_is_served" : true,
"modifiers" : [
],
"comment" : "",
"subcategory_serving_times" : [
]
}
],
"order_type" : {
"id" : 6,
"pickup_asap" : true,
"customer_phone_number" : "+3811",
"trigger_type" : 1
},
"payment_info" : {
"payment_init_hash" : "ed627252ed7b047cd8c1bbd82ba02ab7"
},
"is_reorder" : false,
"combo_meals" : [
],
"singular_point_id" : "c784eadc-68cf-11ee-8c99-0242ac120007"
}
Depending on result we are presenting to user either successful order screen or error dialog.