From e2b53af27c4c59fa646ab184101b98225f147472 Mon Sep 17 00:00:00 2001 From: kizzy Date: Wed, 25 Feb 2026 15:54:41 +0700 Subject: [PATCH 001/101] added master CAPK --- .../baselib/viewModel/EmvBaseViewModel.java | 4 +- baselib/src/main/res/raw/paypass_config.json | 39 ++++- baselib/src/main/res/raw/rid_config.json | 148 +++++++++++++++++- .../utsmyanmar/baselib/ExampleUnitTest.java | 2 +- 4 files changed, 179 insertions(+), 14 deletions(-) diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index da353a5..3b10e31 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -74,7 +74,7 @@ import java.util.Locale; import com.utsmyanmar.paylibs.utils.LogUtil; -public abstract class EmvBaseViewModel extends BaseViewModel { +public abstract class EmvBaseViewModel extends BaseViewModel { private static final String TAG = EmvBaseViewModel.class.getSimpleName(); @@ -1210,7 +1210,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x1B}, new byte[]{(byte) 0x30}); //EMV MODE :amount >contactless cvm limit, set 60 = online pin and signature , set 20 = signature - emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x18}, new byte[]{(byte) 0x28}); + emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x18}, new byte[]{(byte) 0xF8}); //EMV mode :amount < contactless cvm limit, set 08 = no cvm emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x19}, new byte[]{(byte) 0x08}); //08 diff --git a/baselib/src/main/res/raw/paypass_config.json b/baselib/src/main/res/raw/paypass_config.json index e5c1ed1..09ef9aa 100644 --- a/baselib/src/main/res/raw/paypass_config.json +++ b/baselib/src/main/res/raw/paypass_config.json @@ -1,9 +1,9 @@ [ { "aidEnable": true, - "aid": "A0000000041010", + "aid": "A00000000410", "cardLabel": "MASTERCARD", - "applicationVersion": "0020", + "applicationVersion": "0002", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -17,7 +17,32 @@ "cvmLimit": 75000, "transLimit": "999999999999", "transLimitCDV": "999999999999", - "terminalCapability": "E0F8F8", + "terminalCapability": "E0F8C8", + "riskManageData": "6C7A800000000000", + "kernelType": "02", + "ttq": "36804000", + "cateCode": "2701", + "currencyCode": "0104" + }, + { + "aidEnable": true, + "aid": "A0000000041010", + "cardLabel": "MASTERCARD", + "applicationVersion": "0002", + "emvDDOL": "9F3704", + "emvTDOL": "9F3704", + "partialAidSelection": false, + "targetPercent": "00", + "maxTargetPercent": "00", + "threshold": "00000040", + "tacDefault": "D84000A800", + "tacOnline": "DC4004F800", + "tacDenial": "0000000000", + "floorLimit": "000000000000", + "cvmLimit": 75000, + "transLimit": "999999999999", + "transLimitCDV": "999999999999", + "terminalCapability": "E0F8C8", "riskManageData": "6C7A800000000000", "kernelType": "02", "ttq": "36804000", @@ -29,7 +54,7 @@ "aidEnable": true, "aid": "A0000000041010C123456789", "cardLabel": "MASTERCARD", - "applicationVersion": "0020", + "applicationVersion": "0002", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -52,9 +77,9 @@ }, { "aidEnable": true, - "aid": "A0000000043060", + "aid": "A00000000430", "cardLabel": "MASTERCARD", - "applicationVersion": "0020", + "applicationVersion": "0002", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -68,7 +93,7 @@ "cvmLimit": 75000, "transLimit": "999999999999", "transLimitCDV": "999999999999", - "terminalCapability": "E0F8F8", + "terminalCapability": "E0F8C8", "riskManageData": "6C7A800000000000", "kernelType": "02", "ttq": "36804000", diff --git a/baselib/src/main/res/raw/rid_config.json b/baselib/src/main/res/raw/rid_config.json index 6ba056b..1782291 100644 --- a/baselib/src/main/res/raw/rid_config.json +++ b/baselib/src/main/res/raw/rid_config.json @@ -140,25 +140,165 @@ "expDate": "3230333031323331", "checkSum": "43A3151513B7ADCEB92DBEA2A262CEB336D26C83" }, + { + "rid": "A000000004", + "indx": "00", + "hashInd": "01", + "arithInd": "01", + "modul": "9c6be5adb10b4be3dce2099b4b210672b89656eba091204f613ecc623bedc9c6d77b660e8baeea7f7ce30f1b153879a4e36459343d1fe47acdbd41fcd710030c2ba1d9461597982c6e1bdd08554b726f5eff7913ce59e79e357295c321e26d0b8be270a9442345c753e2aa2acfc9d30850602fe6cac00c6ddf6b8d9d9b4879b2826b042a07f0e5ae526a3d3c4d22c72b9eaa52eed8893866f866387ac05a1399", + "exponent": "03", + "expDate": "20201231", + "checkSum": "ec0a59d35d19f031e9e8cbec56db80e22b1de130" + }, + { + "rid": "A000000004", + "indx": "01", + "hashInd": "01", + "arithInd": "01", + "modul": "a99a6d3e071889ed9e3a0c391c69b0b804fc160b2b4bdd570c92dd5a0f45f53e8621f7c96c40224266735e1ee1b3c06238ae35046320fd8e81f8ceb3f8b4c97b940930a3ac5e790086dad41a6a4f5117ba1ce2438a51ac053eb002aed866d2c458fd73359021a12029a0c043045c11664fe0219ec63c10bf2155bb2784609a106421d45163799738c1c30909bb6c6fe52bbb76397b9740ce064a613ff8411185f08842a423ead20edffbff1cd6c3fe0c9821479199c26d8572cc8afff087a9c3", + "exponent": "03", + "expDate": "20201231", + "checkSum": "33408b96c814742ad73536c72f0926e4471e8e47" + }, + { + "rid": "A000000004", + "indx": "03", + "hashInd": "01", + "arithInd": "01", + "modul": "c2490747fe17eb0584c88d47b1602704150adc88c5b998bd59ce043edebf0ffee3093ac7956ad3b6ad4554c6de19a178d6da295be15d5220645e3c8131666fa4be5b84fe131ea44b039307638b9e74a8c42564f892a64df1cb15712b736e3374f1bbb6819371602d8970e97b900793c7c2a89a4a1649a59be680574dd0b60145", + "exponent": "03", + "expDate": "20201231", + "checkSum": "5addf21d09278661141179cbeff272ea384b13bb" + }, + { + "rid": "A000000004", + "indx": "04", + "hashInd": "01", + "arithInd": "01", + "modul": "a6da428387a502d7ddfb7a74d3f412be762627197b25435b7a81716a700157ddd06f7cc99d6ca28c2470527e2c03616b9c59217357c2674f583b3ba5c7dcf2838692d023e3562420b4615c439ca97c44dc9a249cfce7b3bfb22f68228c3af13329aa4a613cf8dd853502373d62e49ab256d2bc17120e54aedced6d96a4287acc5c04677d4a5a320db8bee2f775e5fec5", + "exponent": "03", + "expDate": "20201231", + "checkSum": "381a035da58b482ee2af75f4c3f2ca469ba4aa6c" + }, + { + "rid": "A000000004", + "indx": "05", + "hashInd": "01", + "arithInd": "01", + "modul": "b8048abc30c90d976336543e3fd7091c8fe4800df820ed55e7e94813ed00555b573feca3d84af6131a651d66cff4284fb13b635edd0ee40176d8bf04b7fd1c7bacf9ac7327dfaa8aa72d10db3b8e70b2ddd811cb4196525ea386acc33c0d9d4575916469c4e4f53e8e1c912cc618cb22dde7c3568e90022e6bba770202e4522a2dd623d180e215bd1d1507fe3dc90ca310d27b3efccd8f83de3052cad1e48938c68d095aac91b5f37e28bb49ec7ed597", + "exponent": "03", + "expDate": "20201231", + "checkSum": "ebfa0d5d06d8ce702da3eae890701d45e274c845" + }, + { + "rid": "A000000004", + "indx": "06", + "hashInd": "01", + "arithInd": "01", + "modul": "cb26fc830b43785b2bce37c81ed334622f9622f4c89aae641046b2353433883f307fb7c974162da72f7a4ec75d9d657336865b8d3023d3d645667625c9a07a6b7a137cf0c64198ae38fc238006fb2603f41f4f3bb9da1347270f2f5d8c606e420958c5f7d50a71de30142f70de468889b5e3a08695b938a50fc980393a9cbce44ad2d64f630bb33ad3f5f5fd495d31f37818c1d94071342e07f1bec2194f6035ba5ded3936500eb82dfda6e8afb655b1ef3d0d7ebf86b66dd9f29f6b1d324fe8b26ce38ab2013dd13f611e7a594d675c4432350ea244cc34f3873cba06592987a1d7e852adc22ef5a2ee28132031e48f74037e3b34ab747f", + "exponent": "03", + "expDate": "20201231", + "checkSum": "f910a1504d5ffb793d94f3b500765e1abcad72d9" + }, { "rid": "A000000004", "indx": "F1", "hashInd": "01", "arithInd": "01", - "modul": "A0DCF4BDE19C3546B4B6F0414D174DDE294AABBB828C5A834D73AAE27C99B0B053A90278007239B6459FF0BBCD7B4B9C6C50AC02CE91368DA1BD21AAEADBC65347337D89B68F5C99A09D05BE02DD1F8C5BA20E2F13FB2A27C41D3F85CAD5CF6668E75851EC66EDBF98851FD4E42C44C1D59F5984703B27D5B9F21B8FA0D93279FBBF69E090642909C9EA27F898959541AA6757F5F624104F6E1D3A9532F2A6E51515AEAD1B43B3D7835088A2FAFA7BE7", + "modul": "a0dcf4bde19c3546b4b6f0414d174dde294aabbb828c5a834d73aae27c99b0b053a90278007239b6459ff0bbcd7b4b9c6c50ac02ce91368da1bd21aaeadbc65347337d89b68f5c99a09d05be02dd1f8c5ba20e2f13fb2a27c41d3f85cad5cf6668e75851ec66edbf98851fd4e42c44c1d59f5984703b27d5b9f21b8fa0d93279fbbf69e090642909c9ea27f898959541aa6757f5f624104f6e1d3a9532f2a6e51515aead1b43b3d7835088a2fafa7be7", "exponent": "03", "expDate": "20201231", - "checkSum": "D8E68DA167AB5A85D8C3D55ECB9B0517A1A5B4BB" + "checkSum": "d8e68da167ab5a85d8c3d55ecb9b0517a1a5b4bb" + }, + { + "rid": "A000000004", + "indx": "F3", + "hashInd": "01", + "arithInd": "01", + "modul": "98f0c770f23864c2e766df02d1e833dff4ffe92d696e1642f0a88c5694c6479d16db1537bfe29e4fdc6e6e8afd1b0eb7ea0124723c333179bf19e93f10658b2f776e829e87daeda9c94a8b3382199a350c077977c97aff08fd11310ac950a72c3ca5002ef513fccc286e646e3c5387535d509514b3b326e1234f9cb48c36ddd44b416d23654034a66f403ba511c5efa3", + "exponent": "03", + "expDate": "20201231", + "checkSum": "a69ac7603daf566e972dedc2cb433e07e8b01a9a" + }, + { + "rid": "A000000004", + "indx": "F5", + "hashInd": "01", + "arithInd": "01", + "modul": "a6e6fb72179506f860ccca8c27f99cecd94c7d4f3191d303bbee37481c7aa15f233ba755e9e4376345a9a67e7994bdc1c680bb3522d8c93eb0ccc91ad31ad450da30d337662d19ac03e2b4ef5f6ec18282d491e19767d7b24542dfdeff6f62185503532069bbb369e3bb9fb19ac6f1c30b97d249eee764e0bac97f25c873d973953e5153a42064bbfabfd06a4bb486860bf6637406c9fc36813a4a75f75c31cca9f69f8de59adecef6bde7e07800fcbe035d3176af8473e23e9aa3dfee221196d1148302677c720cfe2544a03db553e7f1b8427ba1cc72b0f29b12dfef4c081d076d353e71880aadff386352af0ab7b28ed49e1e672d11f9", + "exponent": "010001", + "expDate": "20201231", + "checkSum": "c2239804c8098170be52d6d5d4159e81ce8466bf" + }, + { + "rid": "A000000004", + "indx": "F6", + "hashInd": "01", + "arithInd": "01", + "modul": "a25a6bd783a5ef6b8fb6f83055c260f5f99ea16678f3b9053e0f6498e82c3f5d1e8c38f13588017e2b12b3d8ff6f50167f46442910729e9e4d1b3739e5067c0ac7a1f4487e35f675bc16e233315165cb142bfdb25e301a632a54a3371ebab6572deebaf370f337f057ee73b4ae46d1a8bc4da853ec3cc12c8cbc2da18322d68530c70b22bdac351dd36068ae321e11abf264f4d3569bb71214545005558de26083c735db776368172fe8c2f5c85e8b5b890cc682911d2de71fa626b8817fccc08922b703869f3baeac1459d77cd85376bc36182f4238314d6c4212fbdd7f23d3", + "exponent": "03", + "expDate": "20201231", + "checkSum": "502909ed545e3c8dbd00ea582d0617fee9f6f684" + }, + { + "rid": "A000000004", + "indx": "F7", + "hashInd": "01", + "arithInd": "01", + "modul": "94ea62f6d58320e354c022addcf0559d8cf206cd92e869564905ce21d720f971b7aea374830ebe1757115a85e088d41c6b77cf5ec821f30b1d890417bf2fa31e5908ded5fa677f8c7b184ad09028fdde96b6a6109850aa800175eabcdbbb684a96c2eb6379dfea08d32fe2331fe103233ad58dcdb1e6e077cb9f24eaec5c25af", + "exponent": "010001", + "expDate": "20201231", + "checkSum": "eeb0dd9b2477bee3209a914cdba94c1c4a9bded9" + }, + { + "rid": "A000000004", + "indx": "F8", + "hashInd": "01", + "arithInd": "01", + "modul": "a1f5e1c9bd8650bd43ab6ee56b891ef7459c0a24fa84f9127d1a6c79d4930f6db1852e2510f18b61cd354db83a356bd190b88ab8df04284d02a4204a7b6cb7c5551977a9b36379ca3de1a08e69f301c95cc1c20506959275f41723dd5d2925290579e5a95b0df6323fc8e9273d6f849198c4996209166d9bfc973c361cc826e1", + "exponent": "03", + "expDate": "20201231", + "checkSum": "f06ecc6d2aaebf259b7e755a38d9a9b24e2ff3dd" + }, + { + "rid": "A000000004", + "indx": "F9", + "hashInd": "01", + "arithInd": "01", + "modul": "a99a6d3e071889ed9e3a0c391c69b0b804fc160b2b4bdd570c92dd5a0f45f53e8621f7c96c40224266735e1ee1b3c06238ae35046320fd8e81f8ceb3f8b4c97b940930a3ac5e790086dad41a6a4f5117ba1ce2438a51ac053eb002aed866d2c458fd73359021a12029a0c043045c11664fe0219ec63c10bf2155bb2784609a106421d45163799738c1c30909bb6c6fe52bbb76397b9740ce064a613ff8411185f08842a423ead20edffbff1cd6c3fe0c9821479199c26d8572cc8afff087a9c3", + "exponent": "03", + "expDate": "20201231", + "checkSum": "336712dcc28554809c6aa9b02358de6f755164db" + }, + { + "rid": "A000000004", + "indx": "FA", + "hashInd": "01", + "arithInd": "01", + "modul": "a90fcd55aa2d5d9963e35ed0f440177699832f49c6bab15cdae5794be93f934d4462d5d12762e48c38ba83d8445deaa74195a301a102b2f114eada0d180ee5e7a5c73e0c4e11f67a43ddab5d55683b1474cc0627f44b8d3088a492ffaadad4f42422d0e7013536c3c49ad3d0fae96459b0f6b1b6056538a3d6d44640f94467b108867dec40faaecd740c00e2b7a8852d", + "exponent": "03", + "expDate": "20201231", + "checkSum": "5bed4068d96ea16d2d77e03d6036fc7a160ea99c" + }, + { + "rid": "A000000004", + "indx": "FE", + "hashInd": "01", + "arithInd": "01", + "modul": "a653eac1c0f786c8724f737f172997d63d1c3251c44402049b865bae877d0f398cbfbe8a6035e24afa086befde9351e54b95708ee672f0968bcd50dce40f783322b2aba04ef137ef18abf03c7dbc5813aeaef3aa7797ba15df7d5ba1cbaf7fd520b5a482d8d3fee105077871113e23a49af3926554a70fe10ed728cf793b62a1", + "exponent": "03", + "expDate": "20201231", + "checkSum": "9a295b05fb390ef7923f57618a9fda2941fc34e0" }, { "rid": "A000000004", "indx": "EF", "hashInd": "01", "arithInd": "01", - "modul": "A191CB87473F29349B5D60A88B3EAEE0973AA6F1A082F358D849FDDFF9C091F899EDA9792CAF09EF28F5D22404B88A2293EEBBC1949C43BEA4D60CFD879A1539544E09E0F09F60F065B2BF2A13ECC705F3D468B9D33AE77AD9D3F19CA40F23DCF5EB7C04DC8F69EBA565B1EBCB4686CD274785530FF6F6E9EE43AA43FDB02CE00DAEC15C7B8FD6A9B394BABA419D3F6DC85E16569BE8E76989688EFEA2DF22FF7D35C043338DEAA982A02B866DE5328519EBBCD6F03CDD686673847F84DB651AB86C28CF1462562C577B853564A290C8556D818531268D25CC98A4CC6A0BDFFFDA2DCCA3A94C998559E307FDDF915006D9A987B07DDAEB3B", + "modul": "a191cb87473f29349b5d60a88b3eaee0973aa6f1a082f358d849fddff9c091f899eda9792caf09ef28f5d22404b88a2293eebbc1949c43bea4d60cfd879a1539544e09e0f09f60f065b2bf2a13ecc705f3d468b9d33ae77ad9d3f19ca40f23dcf5eb7c04dc8f69eba565b1ebcb4686cd274785530ff6f6e9ee43aa43fdb02ce00daec15c7b8fd6a9b394baba419d3f6dc85e16569be8e76989688efea2df22ff7d35c043338deaa982a02b866de5328519ebbcd6f03cdd686673847f84db651ab86c28cf1462562c577b853564a290c8556d818531268d25cc98a4cc6a0bdfffda2dcca3a94c998559e307fddf915006d9a987b07ddaeb3b", "exponent": "03", "expDate": "20201231", - "checkSum": "21766EBB0EE122AFB65D7845B73DB46BAB65427A" + "checkSum": "21766ebb0ee122afb65d7845b73db46bab65427a" } ] \ No newline at end of file diff --git a/baselib/src/test/java/com/utsmyanmar/baselib/ExampleUnitTest.java b/baselib/src/test/java/com/utsmyanmar/baselib/ExampleUnitTest.java index 8147a3e..d4c6913 100644 --- a/baselib/src/test/java/com/utsmyanmar/baselib/ExampleUnitTest.java +++ b/baselib/src/test/java/com/utsmyanmar/baselib/ExampleUnitTest.java @@ -21,7 +21,7 @@ public class ExampleUnitTest { @Test public void testCAPKIndex() { - String index = "99"; + String index = "F1"; int data = Integer.parseInt(index,16); System.out.println("Data: "+data); From 3d619d370fb56e8fcdd31a69d4d396666301e587 Mon Sep 17 00:00:00 2001 From: kizzy Date: Wed, 25 Feb 2026 21:23:30 +0700 Subject: [PATCH 002/101] fixed for visa --- .../ui/core_ui/EmvTransactionFragment.java | 1 + .../baselib/viewModel/EmvBaseViewModel.java | 6 +++-- baselib/src/main/res/raw/paywave_config.json | 25 ------------------- 3 files changed, 5 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java index 913470f..d6b9f27 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java @@ -231,6 +231,7 @@ public class EmvTransactionFragment extends DataBindingFragment { navigateToRRNScreen(); break; case READ_CARD_RETRY: + LogUtil.d(TAG,"Card type :"+cardReadViewModel.cardTypeData.getValue()); if(cardReadViewModel.cardTypeData.getValue()!= null && cardReadViewModel.cardTypeData.getValue() == CardTypeX.IC.value) { isCardInserted(new CardDetectCallback() { @Override diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index 3b10e31..09de8bf 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -827,10 +827,12 @@ public abstract class EmvBaseViewModel extends BaseViewModel { case SdkResult.Emv_Candidatelist_Empty:// Application have no aid list case SdkResult.Emv_FallBack:// FallBack ,chip card reset failed //fallback process - emvResultStatus.postValue(EmvResultStatus.READ_CARD_RETRY); + mHandler.sendEmptyMessage(EMV_TRY_AGAIN); + break; case SdkResult.Emv_Declined: case SdkResult.Emv_Arpc_Fail: // + mHandler.obtainMessage(EMV_ERROR, retCode, retCode, "Emv Declined!").sendToTarget(); //// case SdkResult.Emv_Declined: // //online decline ,if it is in second gac, application should decide if it is need reversal the transaction break; @@ -1239,7 +1241,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { LogUtil.d(TAG, "configPaywaveParameters, TTQ" + ByteUtils.byteArray2HexString(kernelTTQ)); //default TTQ value - TTQ = ByteUtils.hexString2ByteArray("36A04000"); + TTQ = ByteUtils.hexString2ByteArray("32A04000"); // 36A04000 kernelTTQ[0] = TTQ[0]; kernelTTQ[1] = TTQ[1]; kernelTTQ[2] = TTQ[2]; diff --git a/baselib/src/main/res/raw/paywave_config.json b/baselib/src/main/res/raw/paywave_config.json index f0fbdaf..f3e6f43 100644 --- a/baselib/src/main/res/raw/paywave_config.json +++ b/baselib/src/main/res/raw/paywave_config.json @@ -173,30 +173,5 @@ "ttq": "32A04000", "cateCode": "2701", "currencyCode": "0104" - }, - { - "aidEnable": true, - "aid": "325041592E5359532E4444463031", - "cardLabel": "VISA", - "applicationVersion": "0030", - "emvDDOL": "9F3704", - "emvTDOL": "9F3704", - "partialAidSelection": false, - "targetPercent": "00", - "maxTargetPercent": "00", - "threshold": "00000000", - "tacDefault": "DC4000A800", - "tacOnline": "DC4004F800", - "tacDenial": "0010000000", - "floorLimit": "000000000000", - "cvmLimit": 70000, - "transLimit": "999999999999", - "transLimitCDV": "999999999999", - "terminalCapability": "0000000000000000", - "riskManageData": "01", - "kernelType": "03", - "ttq": "32A04000", - "cateCode": "2701", - "currencyCode": "0104" } ] \ No newline at end of file From 11d868210f12cd6d8b5c08192eed0f40adf47dc9 Mon Sep 17 00:00:00 2001 From: kizzy Date: Wed, 25 Feb 2026 21:32:23 +0700 Subject: [PATCH 003/101] retry fixed for visa --- .../kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java | 2 +- .../java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java index 7e13cb6..f67347e 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java @@ -162,7 +162,7 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements handleTransactionFail(msg.arg1, msg.obj.toString()); break; case EMV_TRY_AGAIN: - emvResultStatus.postValue(EmvResultStatus.READ_CARD); + emvResultStatus.postValue(EmvResultStatus.READ_CARD_RETRY); break; case EMV_CONFIRM_CODE_VERIFY: emvResultStatus.postValue(EmvResultStatus.CONFIRM_CODE_VERIFY); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index 09de8bf..0e1ae37 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -153,6 +153,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { protected static final int EMV_ONLINE_PROCESS = 11; protected static final int EMV_ERROR = 12; protected static final int EMV_TRY_AGAIN = 13; + protected static final int EMV_CTLS_TRY_AGAIN = 13; protected static final int EMV_CONFIRM_CODE_VERIFY = 14; protected static final int EMV_SUCCESS_ONLINE = 15; From 66f4396e6952ab89541ae4dcddd891d7be76a2d2 Mon Sep 17 00:00:00 2001 From: kizzy Date: Thu, 26 Feb 2026 16:56:37 +0700 Subject: [PATCH 004/101] rid reorder --- .../kbz/ui/core_ui/ProcessingFragment.java | 1 + .../baselib/viewModel/EmvBaseViewModel.java | 3 +- baselib/src/main/res/raw/rid_config.json | 181 +++++++++--------- 3 files changed, 93 insertions(+), 92 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java index 07d3038..6cc28be 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java @@ -288,6 +288,7 @@ public class ProcessingFragment extends DataBindingFragment { break; case OFFLINE_FAILURE: + sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, false, "FAILED")); sharedViewModel.dismissLoadingMsg(); sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_offline_failure)); navigateToError(); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index 0e1ae37..ba2d0f2 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -833,7 +833,8 @@ public abstract class EmvBaseViewModel extends BaseViewModel { break; case SdkResult.Emv_Declined: case SdkResult.Emv_Arpc_Fail: // - mHandler.obtainMessage(EMV_ERROR, retCode, retCode, "Emv Declined!").sendToTarget(); + offlineDenial(); +// mHandler.obtainMessage(EMV_ERROR, retCode, retCode, "Emv Declined!").sendToTarget(); //// case SdkResult.Emv_Declined: // //online decline ,if it is in second gac, application should decide if it is need reversal the transaction break; diff --git a/baselib/src/main/res/raw/rid_config.json b/baselib/src/main/res/raw/rid_config.json index 1782291..e623be6 100644 --- a/baselib/src/main/res/raw/rid_config.json +++ b/baselib/src/main/res/raw/rid_config.json @@ -50,96 +50,7 @@ "expDate": "20201231", "checkSum": "1FF80A40173F52D7D27E0F26A146A1C8CCB29046" }, - { - "rid": "A000000333", - "indx": "0A", - "hashInd": "01", - "arithInd": "01", - "modul": "B2AB1B6E9AC55A75ADFD5BBC34490E53C4C3381F34E60E7FAC21CC2B26DD34462B64A6FAE2495ED1DD383B8138BEA100FF9B7A111817E7B9869A9742B19E5C9DAC56F8B8827F11B05A08ECCF9E8D5E85B0F7CFA644EFF3E9B796688F38E006DEB21E101C01028903A06023AC5AAB8635F8E307A53AC742BDCE6A283F585F48EF", - "exponent": "03", - "expDate": "3230333031323331", - "checkSum": "C88BE6B2417C4F941C9371EA35A377158767E4E3" - }, - { - "rid": "A000000333", - "indx": "08", - "hashInd": "01", - "arithInd": "01", - "modul": "B61645EDFD5498FB246444037A0FA18C0F101EBD8EFA54573CE6E6A7FBF63ED21D66340852B0211CF5EEF6A1CD989F66AF21A8EB19DBD8DBC3706D135363A0D683D046304F5A836BC1BC632821AFE7A2F75DA3C50AC74C545A754562204137169663CFCC0B06E67E2109EBA41BC67FF20CC8AC80D7B6EE1A95465B3B2657533EA56D92D539E5064360EA4850FED2D1BF", - "exponent": "03", - "expDate": "3230333031323331", - "checkSum": "EE23B616C95C02652AD18860E48787C079E8E85A" - }, - { - "rid": "A000000333", - "indx": "09", - "hashInd": "01", - "arithInd": "01", - "modul": "EB374DFC5A96B71D2863875EDA2EAFB96B1B439D3ECE0B1826A2672EEEFA7990286776F8BD989A15141A75C384DFC14FEF9243AAB32707659BE9E4797A247C2F0B6D99372F384AF62FE23BC54BCDC57A9ACD1D5585C303F201EF4E8B806AFB809DB1A3DB1CD112AC884F164A67B99C7D6E5A8A6DF1D3CAE6D7ED3D5BE725B2DE4ADE23FA679BF4EB15A93D8A6E29C7FFA1A70DE2E54F593D908A3BF9EBBD760BBFDC8DB8B54497E6C5BE0E4A4DAC29E5", - "exponent": "03", - "expDate": "3230333031323331", - "checkSum": "A075306EAB0045BAF72CDD33B3B678779DE1F527" - }, - { - "rid": "A000000333", - "indx": "0B", - "hashInd": "01", - "arithInd": "01", - "modul": "CF9FDF46B356378E9AF311B0F981B21A1F22F250FB11F55C958709E3C7241918293483289EAE688A094C02C344E2999F315A72841F489E24B1BA0056CFAB3B479D0E826452375DCDBB67E97EC2AA66F4601D774FEAEF775ACCC621BFEB65FB0053FC5F392AA5E1D4C41A4DE9FFDFDF1327C4BB874F1F63A599EE3902FE95E729FD78D4234DC7E6CF1ABABAA3F6DB29B7F05D1D901D2E76A606A8CBFFFFECBD918FA2D278BDB43B0434F5D45134BE1C2781D157D501FF43E5F1C470967CD57CE53B64D82974C8275937C5D8502A1252A8A5D6088A259B694F98648D9AF2CB0EFD9D943C69F896D49FA39702162ACB5AF29B90BADE005BC157", - "exponent": "03", - "expDate": "3230333031323331", - "checkSum": "BD331F9996A490B33C13441066A09AD3FEB5F66C" - }, - { - "rid": "A000000065", - "indx": "08", - "hashInd": "01", - "arithInd": "00", - "modul": "B74670DAD1DC8983652000E5A7F2F8B35DFD083EE593E5BA895C95729F2BADE9C8ABF3DD9CE240C451C6CEFFC768D83CBAC76ABB8FEA58F013C647007CFF7617BAC2AE3981816F25CC7E5238EF34C4F02D0B01C24F80C2C65E7E7743A4FA8E23206A23ECE290C26EA56DB085C5C5EAE26292451FC8292F9957BE8FF20FAD53E5", - "exponent": "03", - "expDate": "3230333031323331", - "checkSum": "DD36D5896228C8C4900742F107E2F91FE50BC7EE" - }, - { - "rid": "A000000065", - "indx": "09", - "hashInd": "01", - "arithInd": "00", - "modul": "B72A8FEF5B27F2B550398FDCC256F714BAD497FF56094B7408328CB626AA6F0E6A9DF8388EB9887BC930170BCC1213E90FC070D52C8DCD0FF9E10FAD36801FE93FC998A721705091F18BC7C98241CADC15A2B9DA7FB963142C0AB640D5D0135E77EBAE95AF1B4FEFADCF9C012366BDDA0455C1564A68810D7127676D493890BD", - "exponent": "03", - "expDate": "3230333031323331", - "checkSum": "4410C6D51C2F83ADFD92528FA6E38A32DF048D0A" - }, - { - "rid": "A000000065", - "indx": "10", - "hashInd": "01", - "arithInd": "00", - "modul": "99B63464EE0B4957E4FD23BF923D12B61469B8FFF8814346B2ED6A780F8988EA9CF0433BC1E655F05EFA66D0C98098F25B659D7A25B8478A36E489760D071F54CDF7416948ED733D816349DA2AADDA227EE45936203CBF628CD033AABA5E5A6E4AE37FBACB4611B4113ED427529C636F6C3304F8ABDD6D9AD660516AE87F7F2DDF1D2FA44C164727E56BBC9BA23C0285", - "exponent": "03", - "expDate": "3230333031323331", - "checkSum": "C75E5210CBE6E8F0594A0F1911B07418CADB5BAB" - }, - { - "rid": "A000000065", - "indx": "11", - "hashInd": "01", - "arithInd": "00", - "modul": "A2583AA40746E3A63C22478F576D1EFC5FB046135A6FC739E82B55035F71B09BEB566EDB9968DD649B94B6DEDC033899884E908C27BE1CD291E5436F762553297763DAA3B890D778C0F01E3344CECDFB3BA70D7E055B8C760D0179A403D6B55F2B3B083912B183ADB7927441BED3395A199EEFE0DEBD1F5FC3264033DA856F4A8B93916885BD42F9C1F456AAB8CFA83AC574833EB5E87BB9D4C006A4B5346BD9E17E139AB6552D9C58BC041195336485", - "exponent": "03", - "expDate": "3230333031323331", - "checkSum": "D9FD62C9DD4E6DE7741E9A17FB1FF2C5DB948BCB" - }, - { - "rid": "A000000065", - "indx": "14", - "hashInd": "01", - "arithInd": "00", - "modul": "AEED55B9EE00E1ECEB045F61D2DA9A66AB637B43FB5CDBDB22A2FBB25BE061E937E38244EE5132F530144A3F268907D8FD648863F5A96FED7E42089E93457ADC0E1BC89C58A0DB72675FBC47FEE9FF33C16ADE6D341936B06B6A6F5EF6F66A4EDD981DF75DA8399C3053F430ECA342437C23AF423A211AC9F58EAF09B0F837DE9D86C7109DB1646561AA5AF0289AF5514AC64BC2D9D36A179BB8A7971E2BFA03A9E4B847FD3D63524D43A0E8003547B94A8A75E519DF3177D0A60BC0B4BAB1EA59A2CBB4D2D62354E926E9C7D3BE4181E81BA60F8285A896D17DA8C3242481B6C405769A39D547C74ED9FF95A70A796046B5EFF36682DC29", - "exponent": "03", - "expDate": "3230333031323331", - "checkSum": "43A3151513B7ADCEB92DBEA2A262CEB336D26C83" - }, + { "rid": "A000000004", "indx": "00", @@ -299,6 +210,94 @@ "exponent": "03", "expDate": "20201231", "checkSum": "21766ebb0ee122afb65d7845b73db46bab65427a" + },{ + "rid": "A000000333", + "indx": "0A", + "hashInd": "01", + "arithInd": "01", + "modul": "B2AB1B6E9AC55A75ADFD5BBC34490E53C4C3381F34E60E7FAC21CC2B26DD34462B64A6FAE2495ED1DD383B8138BEA100FF9B7A111817E7B9869A9742B19E5C9DAC56F8B8827F11B05A08ECCF9E8D5E85B0F7CFA644EFF3E9B796688F38E006DEB21E101C01028903A06023AC5AAB8635F8E307A53AC742BDCE6A283F585F48EF", + "exponent": "03", + "expDate": "3230333031323331", + "checkSum": "C88BE6B2417C4F941C9371EA35A377158767E4E3" +}, + { + "rid": "A000000333", + "indx": "08", + "hashInd": "01", + "arithInd": "01", + "modul": "B61645EDFD5498FB246444037A0FA18C0F101EBD8EFA54573CE6E6A7FBF63ED21D66340852B0211CF5EEF6A1CD989F66AF21A8EB19DBD8DBC3706D135363A0D683D046304F5A836BC1BC632821AFE7A2F75DA3C50AC74C545A754562204137169663CFCC0B06E67E2109EBA41BC67FF20CC8AC80D7B6EE1A95465B3B2657533EA56D92D539E5064360EA4850FED2D1BF", + "exponent": "03", + "expDate": "3230333031323331", + "checkSum": "EE23B616C95C02652AD18860E48787C079E8E85A" + }, + { + "rid": "A000000333", + "indx": "09", + "hashInd": "01", + "arithInd": "01", + "modul": "EB374DFC5A96B71D2863875EDA2EAFB96B1B439D3ECE0B1826A2672EEEFA7990286776F8BD989A15141A75C384DFC14FEF9243AAB32707659BE9E4797A247C2F0B6D99372F384AF62FE23BC54BCDC57A9ACD1D5585C303F201EF4E8B806AFB809DB1A3DB1CD112AC884F164A67B99C7D6E5A8A6DF1D3CAE6D7ED3D5BE725B2DE4ADE23FA679BF4EB15A93D8A6E29C7FFA1A70DE2E54F593D908A3BF9EBBD760BBFDC8DB8B54497E6C5BE0E4A4DAC29E5", + "exponent": "03", + "expDate": "3230333031323331", + "checkSum": "A075306EAB0045BAF72CDD33B3B678779DE1F527" + }, + { + "rid": "A000000333", + "indx": "0B", + "hashInd": "01", + "arithInd": "01", + "modul": "CF9FDF46B356378E9AF311B0F981B21A1F22F250FB11F55C958709E3C7241918293483289EAE688A094C02C344E2999F315A72841F489E24B1BA0056CFAB3B479D0E826452375DCDBB67E97EC2AA66F4601D774FEAEF775ACCC621BFEB65FB0053FC5F392AA5E1D4C41A4DE9FFDFDF1327C4BB874F1F63A599EE3902FE95E729FD78D4234DC7E6CF1ABABAA3F6DB29B7F05D1D901D2E76A606A8CBFFFFECBD918FA2D278BDB43B0434F5D45134BE1C2781D157D501FF43E5F1C470967CD57CE53B64D82974C8275937C5D8502A1252A8A5D6088A259B694F98648D9AF2CB0EFD9D943C69F896D49FA39702162ACB5AF29B90BADE005BC157", + "exponent": "03", + "expDate": "3230333031323331", + "checkSum": "BD331F9996A490B33C13441066A09AD3FEB5F66C" + }, + { + "rid": "A000000065", + "indx": "08", + "hashInd": "01", + "arithInd": "00", + "modul": "B74670DAD1DC8983652000E5A7F2F8B35DFD083EE593E5BA895C95729F2BADE9C8ABF3DD9CE240C451C6CEFFC768D83CBAC76ABB8FEA58F013C647007CFF7617BAC2AE3981816F25CC7E5238EF34C4F02D0B01C24F80C2C65E7E7743A4FA8E23206A23ECE290C26EA56DB085C5C5EAE26292451FC8292F9957BE8FF20FAD53E5", + "exponent": "03", + "expDate": "3230333031323331", + "checkSum": "DD36D5896228C8C4900742F107E2F91FE50BC7EE" + }, + { + "rid": "A000000065", + "indx": "09", + "hashInd": "01", + "arithInd": "00", + "modul": "B72A8FEF5B27F2B550398FDCC256F714BAD497FF56094B7408328CB626AA6F0E6A9DF8388EB9887BC930170BCC1213E90FC070D52C8DCD0FF9E10FAD36801FE93FC998A721705091F18BC7C98241CADC15A2B9DA7FB963142C0AB640D5D0135E77EBAE95AF1B4FEFADCF9C012366BDDA0455C1564A68810D7127676D493890BD", + "exponent": "03", + "expDate": "3230333031323331", + "checkSum": "4410C6D51C2F83ADFD92528FA6E38A32DF048D0A" + }, + { + "rid": "A000000065", + "indx": "10", + "hashInd": "01", + "arithInd": "00", + "modul": "99B63464EE0B4957E4FD23BF923D12B61469B8FFF8814346B2ED6A780F8988EA9CF0433BC1E655F05EFA66D0C98098F25B659D7A25B8478A36E489760D071F54CDF7416948ED733D816349DA2AADDA227EE45936203CBF628CD033AABA5E5A6E4AE37FBACB4611B4113ED427529C636F6C3304F8ABDD6D9AD660516AE87F7F2DDF1D2FA44C164727E56BBC9BA23C0285", + "exponent": "03", + "expDate": "3230333031323331", + "checkSum": "C75E5210CBE6E8F0594A0F1911B07418CADB5BAB" + }, + { + "rid": "A000000065", + "indx": "11", + "hashInd": "01", + "arithInd": "00", + "modul": "A2583AA40746E3A63C22478F576D1EFC5FB046135A6FC739E82B55035F71B09BEB566EDB9968DD649B94B6DEDC033899884E908C27BE1CD291E5436F762553297763DAA3B890D778C0F01E3344CECDFB3BA70D7E055B8C760D0179A403D6B55F2B3B083912B183ADB7927441BED3395A199EEFE0DEBD1F5FC3264033DA856F4A8B93916885BD42F9C1F456AAB8CFA83AC574833EB5E87BB9D4C006A4B5346BD9E17E139AB6552D9C58BC041195336485", + "exponent": "03", + "expDate": "3230333031323331", + "checkSum": "D9FD62C9DD4E6DE7741E9A17FB1FF2C5DB948BCB" + }, + { + "rid": "A000000065", + "indx": "14", + "hashInd": "01", + "arithInd": "00", + "modul": "AEED55B9EE00E1ECEB045F61D2DA9A66AB637B43FB5CDBDB22A2FBB25BE061E937E38244EE5132F530144A3F268907D8FD648863F5A96FED7E42089E93457ADC0E1BC89C58A0DB72675FBC47FEE9FF33C16ADE6D341936B06B6A6F5EF6F66A4EDD981DF75DA8399C3053F430ECA342437C23AF423A211AC9F58EAF09B0F837DE9D86C7109DB1646561AA5AF0289AF5514AC64BC2D9D36A179BB8A7971E2BFA03A9E4B847FD3D63524D43A0E8003547B94A8A75E519DF3177D0A60BC0B4BAB1EA59A2CBB4D2D62354E926E9C7D3BE4181E81BA60F8285A896D17DA8C3242481B6C405769A39D547C74ED9FF95A70A796046B5EFF36682DC29", + "exponent": "03", + "expDate": "3230333031323331", + "checkSum": "43A3151513B7ADCEB92DBEA2A262CEB336D26C83" } - ] \ No newline at end of file From 546893e80603676398096127f63b209a4623750e Mon Sep 17 00:00:00 2001 From: kizzy Date: Thu, 26 Feb 2026 17:14:35 +0700 Subject: [PATCH 005/101] rid fixed --- app/src/main/java/com/utsmm/kbz/MainFragment.java | 2 +- baselib/src/main/res/raw/rid_config.json | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/MainFragment.java b/app/src/main/java/com/utsmm/kbz/MainFragment.java index 55bd380..1d0b7d9 100644 --- a/app/src/main/java/com/utsmm/kbz/MainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/MainFragment.java @@ -266,7 +266,7 @@ public class MainFragment extends DataBindingFragment { LogUtil.d(TAG, "Total CAPK :" + noCAPK); for (CapkEntity capkEntity : capkList) { LogUtil.d(TAG, "CAPK Entity :" + capkEntity.getRid()); - if(capkEntity.getRid().equals("A000000003")) { + if(capkEntity.getRid().equals("A000000004")) { LogUtil.d(TAG, "CAPK Entity check sum:" + capkEntity.getCheckSum()); LogUtil.d(TAG, "CAPK Entity modulus:" + capkEntity.getModulus()); LogUtil.d(TAG, "CAPK Entity index:" + capkEntity.getCapkIdx()); diff --git a/baselib/src/main/res/raw/rid_config.json b/baselib/src/main/res/raw/rid_config.json index e623be6..3673d0b 100644 --- a/baselib/src/main/res/raw/rid_config.json +++ b/baselib/src/main/res/raw/rid_config.json @@ -50,7 +50,6 @@ "expDate": "20201231", "checkSum": "1FF80A40173F52D7D27E0F26A146A1C8CCB29046" }, - { "rid": "A000000004", "indx": "00", @@ -66,10 +65,10 @@ "indx": "01", "hashInd": "01", "arithInd": "01", - "modul": "a99a6d3e071889ed9e3a0c391c69b0b804fc160b2b4bdd570c92dd5a0f45f53e8621f7c96c40224266735e1ee1b3c06238ae35046320fd8e81f8ceb3f8b4c97b940930a3ac5e790086dad41a6a4f5117ba1ce2438a51ac053eb002aed866d2c458fd73359021a12029a0c043045c11664fe0219ec63c10bf2155bb2784609a106421d45163799738c1c30909bb6c6fe52bbb76397b9740ce064a613ff8411185f08842a423ead20edffbff1cd6c3fe0c9821479199c26d8572cc8afff087a9c3", + "modul": "C696034213D7D8546984579D1D0F0EA519CFF8DEFFC429354CF3A871A6F7183F1228DA5C7470C055387100CB935A712C4E2864DF5D64BA93FE7E63E71F25B1E5F5298575EBE1C63AA617706917911DC2A75AC28B251C7EF40F2365912490B939BCA2124A30A28F54402C34AECA331AB67E1E79B285DD5771B5D9FF79EA630B75", "exponent": "03", "expDate": "20201231", - "checkSum": "33408b96c814742ad73536c72f0926e4471e8e47" + "checkSum": "8C05A64127485B923C94B63D264AF0BF85CB45D9" }, { "rid": "A000000004", @@ -210,7 +209,8 @@ "exponent": "03", "expDate": "20201231", "checkSum": "21766ebb0ee122afb65d7845b73db46bab65427a" - },{ + }, + { "rid": "A000000333", "indx": "0A", "hashInd": "01", From 84311f4dc8635daf39c37660122427a61e2f84b5 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:51:34 +0630 Subject: [PATCH 006/101] emv receipt design changes --- .../src/main/assets/fonts/firaCode_bold.ttf | Bin 0 -> 189148 bytes .../paylibs/print/printx/BaseXPrint.java | 19 +++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 paylibs/src/main/assets/fonts/firaCode_bold.ttf diff --git a/paylibs/src/main/assets/fonts/firaCode_bold.ttf b/paylibs/src/main/assets/fonts/firaCode_bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..82a931f0f91b85ac0a6dceb7c33a33cfe7a34678 GIT binary patch literal 189148 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⁡N;7KaROvM6Y^VI$MGlaxPkq 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�_q6Q8nxx zb; zB~*dZ9mo}oAEGE+qp#1!%;~yppKUnRrGZpE#a+xmac0{!e%Fu+%GXQP_kfETdf+*! z=!xf~qDP*Sik_*PTH8Y|X6T`MsrsIBF+)$)P1Wdo!NttNgc`DrPTPx-hLuKJ7LU9x zwEai4mt`nzy_~m$wjrqXgNC3sQyYTXh8Uofr&zg~Dq91T_OT3o!l3f%f#NH#9@_S! zdFw*kpEf`#zH;6UY;4JS4N&Xf8_H|LeCq1vwPouX24%e=m)kM6wgfg_WT;)cS|}SY z463QJFhFVBWatwkDD5e^1Xlx;jR6Y97^s0gzP8Q!GB5@#o|o#KFsD^;78>pj5&bXjd10CH`tb#l2K?F~@cDj90W z&Y8-X(ec8dnks`GfXPG|`osuIc}gz9)d)&uu$)&kK$#4d^Q!J*QLbQCj8zYfbnn5e ze^?PfUxVrhZ?@Xs7BCuG)U#^yzR?2*Mu!g?Bn^lhI509|(4c+9tX#S3(!;~etykV0v7<5e;5^yRL%E;oR+s@IDd*LNw%==jQtp@Yc4*uX)cRUOP#b31 zlFK!eV9TVs45b{+%B4|6YjL0wPKG{VP-gAcP<(%o@y(=p>q6VJ5h&ZcXkOW}CAY0E zRBoFLrI^Wi<+jy@%5AF)mD^SqDz}Y6*~pg5?dVJKm7#QG%TPN_EtJg`464vUE|=0l zhRSr1p>$-+C19PYFIPiHwwzZqK-tKa^MY^~*)k6Lk?r&RkxgWqD;@UKLI&oQZPt8T z!{eKKP|ueA%n>f;KFi4cpI}Kx`?IhlLmC|Ooc~K9Nk_fZ@`X6+B|!9lDgi8>L0dBF z<>bJ=L)3G%qH!HR-L6qKR0zK)1N z3pkrqX>Mp)`1|Zs?3C9_)l(5#R^;ZuAXtMT(vLEY!P3o1V+71XYqT1$0k zS-$mC_0)%!rKy+7v@DrcP_hgqlYD6ypH#C~&|nn@NoD#Bt6qpIS{SQ##xGd2`w(Jb z?i?ZnRA0PL3f0cyYH=aoLmK=gm2pZ=A%>qL98{^!sKTf;YmYzg!$X~(RO`g_6l!OK zqdf!_E)-zD{0P0-lEM^wm@P+7hVcgj3!>miUfH!@l-8%9M4C%x7Uhum^yNnfiK*PW zoY!Y2cxU*Bj7!p8B5kBUu;rKLBrSNwC5D@v8Yi9ZC7G3P%5+f|Ii}3d?=z{_D~+QU z@I9YCLR%D{XIK}gmjUXsFx@*{UhK}aSP}OWig(3z{36|0`T_ohpejy!F`Kt) zFmHj=9*BqTi~Va@kI6qfy`i$jVpC? za=FYd!?RYb>tEDGx_RLOziI8K!{{Xsqp$SUjpUd95L^(3fQ~&1$x$N45XukX(k|fv zJld)K+>XX}2*+tfdSa2#?Fj5tsy%B>#n8rD0RzP()x`lPZ6Z*JYi#X9@lr?U&jJk#mpW#pm1^QeiHHH z4HA8X9$k}e|1L^@(8x@b3Qs`=de+wxRB!}N^c=?vXu)L?Us5bp5{Kv0gtPDy-+mEc zIQ>~ZoJoNZp$|P8$>W?ELU?(T)%l zekiaX0_$iJC`(WCc0?OsB5TQ<(wMh_xh0DS#r%V?8?5CrszkBsX?69}qFf8l-XSsl zJ3IC3l_D)3pstjrORvLgW-^&c`jK=p_1B-Je>Ywz=``rO2i+w-O-~+m_MkGk=`YRP%Ay#UxFwRoC`}AO&|B$zSn*pwP0LPPW0s0hUD*= z6d^tJADitOVxON^kS(oq%Z!Tj>fJjjO|Tujs7Lhaam6Rbj(od#{6X)?$}#;b^L)Jr z%@xg}(tFsqkID2;A70A+&@Dcwz1QHN_(5ruw*6|(V{}v+?hWBI0(BkjjjYL?)4TZxG51aj~x^mHz9Un-SZ?5zB z-ecy8X~iqfuhOJqMv_KlD}UfYL5X|4HFh&*HV_H zbPvtwlooS(G1~s~XToUjor&Y`9C+=|No98qMwf(m7p24&2m1{3>MQNf6c(+N9=`dO zbbswy((&wMh$i=^Al7pPNZlzGJOX0?DzD5Mym^*jCFIjlY5md9$%P#EU){~1N zi!YCC8#?;%G_H+b@!GcVW@MR|ien zQF-_~m4|Uu9tOIkdt4JH{3!hZdHDXE`QJhwZVl-*8La{EO;7IfCEa|8o+tGW5S95hYRR1s;$+729B6T~KSCoL(Rh z-;x$c--VN=q_c%05o05bB%-ir;os|PRMM93LcWXq>_Ewa;{zv67&U|m#Nnqa7G0n8 zKSeTNZDlQu=2wzt8Z#b#RnindhDcNR1cdc6;}0tk2S6%Wo;MXp3%rGp)5!ByEo2J6 z8Nsd0_#+C$26 zY;w+k)P&sPRf&nKiifRAPFkfRWC$jz1a1Z-0%8uBX>rplH|*76#Ptl>m9k`$I0fU8 zV7HgAMBP?wu7}4r)e~8~cV?|ct$dkxMJe%ZC%(UYv8S7hOAp7&@-vH;l2d^L`gYs7 zA~`$EzN4#cr@~p77YS*BwyZ~aS|(#L8_4Q|iE^lyfr>$x%bU9_DmuN-;kB7>giQBH z^Yij?3n*&e+gY3B)!S=S&rRIoyk0>OEt*G04Jh^s8E)Ufu4DU-(>hrCwzV7Oi=7hG zidJmqR>Bukm5)%|2<&Ucd;23icWXZGGilBJ(-&si9!MWKa^y_1HB36RdGjjzmJM)S z0s6oUkk4jlgZ@fU!-^3XbTHkJU$Jj(_WHod+GKC9uAQ7abhTW=wXl-Dw(-&C&bd}F z$tB>UrO{o6y?D#?{q{{Mfj0kC={jI3*HO9MXGHR>796 zHtnUeZuXvta^>0)ZS$$Q%TJN}K1wTVdvRBB`@{||-ZG7B+CE#wlUIP>HrDqJOrJOE zEWM^jt@SV=Xz5fA{CIdj>6JWwT2yFq+TI=8wDqHWqoe)2y7?aL)TLub z7Z(>Na?3B+qHSW&v@yf`g~qk+(8Dh(KTle1W7pDFYh&GkbZyn)m6lemTDG$SwJd9H z@f(2+yYC<$=S?(JY0{IZwWXl8z^;K_u_I|SHu?MX?G~CJ(r@L!EnB2JQq9HoUE7e( zU0gifXSV1b)uEkRdU$+Mz`AkAPC1d;Et>~;J2^VpP#M8}&#zRMV{Ai4a5%?BhH$s| z1a%=GkP#g2<0KA%RN_RV84nr3AT79W`1K3|8KFRK@tf5Xkq0t@L2Qs`1uF+Kf5oLx5KAtSiksOuHv*~aofMzB1V+$DY^gFr?wh&5LPoMA#@IF~V; z%lHJL3J{7jg*b3!z?tTuI8#UqytSS|D9$pZ3^+GI9*Q%C*dWgeRu09PLRtf|fxSg> zrVt-4m!HD&P@E~`73A5*@=%;9#FEPb&a`%lGw%Bm&yZ{`jDLvP0Wl|FC$a1+c&3u< zHJoY<^c6M9MuZf4rv}!xeW)LyETg8-T)M%spkkTJYvmPR^A&WsuavhSyNupr#*O;o ztB@5J$BN@g!=lWj7U_C@!N%8oT=PJ)uOYPonD)Qe6F_mSDe2_*|iL zI}V> z7d5WU^Jwr?XN)jk^EUYIu|f}=i8SInbg=2HYC2_gW$4Mnh|hS=^i_vo_Zyzg_?kuF zF-L{R^pvC4pZY`Y1(@YB)=F)VwfKk^V%h*(Re#?g(tOP!P_IVm?fCz&x1UemP)6R3 zFX(;Y#e{!8J5=XBqh(vs8!glmG2&a%h=+_XOb5sddLe`LLO%m{a^Js@^o@*oQ=HZy zW&&=ee;}MtI95yV1UBYbHhr7DPzfqx)Gd$)cf?C5M5YqF`UUC{Zdfv4=>We4*rzF$ z&d=|2>OYS`_CoB3GSYtgJaQg+**0Z2L}l^h3mT}dxr|=W&sPqxJ_efh!+)mg^<~}B zN1j7lyjbls>5UrIODlnhyZ9OKzNw7Z2w3bhWxQWnM*mkDw(A9>n1B3|O@97Z){TB? zLa1wg10620QRIMmDoT~|avb`fHNPig)W4p?s9e%ZHoaj!J^LTD_z$!gF@2amXw0$l z>IKrQR>gXW#R(J7BCo7?IN>E*v4Aa&MDo&TW2H5r=6l|sY=kXVl@Aj$U8l>2d>0oo zA!KNGtWZMoL%RQK*a z6=dV&tl+X-={R}KCOcpN*4P}GjT$=%ey|s`Wp$!T+3ZRW`P4p;*^@FdCQQi4m=riD zNd9psZQ{hV^vRR?#(_COlhe{FDp1-~X&fu9IXn4jzywsb&=-u~z^Z?_o9n_$xmgqY z>&qnz#`pIhpM~R$>w`yUlyQ4mp=l@`3v&2UTo+c5F2K`@?)Z(@JBC4Rael^coBZgQ zyu6s`e6qCuuUXOg`O(oshep@=rZm|OnlxwJgMJ9d%@@YF^D5VxPJ0rE4NHtKE>;)m zR`Mm)-xtT@0U!3ZG?Z`7*8pewHubAFYB_h!UE1Gis`5JdK{uD5z}c0=#}yUD#g||u zGZNN#YwSbF>wMP#ukfw09pw{>Q(kP&(E6DWlS^KAsUTrQX@c}a#E{&G%;?DJeizgK z9F|a2l#p0hsIDBiuK(akePT1CJ9!t(?As&4%ReY2bYuSL>JznSbE=8(+SdZ>rp&%z zgs}xZo+Pi>4ROGMi!V1(so{s7xkGyPkBOY>_fgtko7P+|NGL5$;A`}a5^shT%;+1+ zstsA6H%3M$J}15t^ViILEX`m>_Irqrk$MR}(7>3x9$i7UZ0pw0j^KSEKs- z#EHLaRAk&hX}6oORhqj=`Z+=RZ9j>Xj_oJy5{S(vGJ$$Wd@Szae>H0)Xf@t7uz9J> zG~TMG_{MD=(E8Ew%C0T%-J0G*$3D1D5t027*qeP?6FlNGg()`eG4WUM9ZF ziR7WiObAviw}-@c`2Yq9VU}B>`cS&S&(^$&Sc%vvg=2*o0y|*$wiPa|;JL;w8OuwK zZMr>W%I!_Z@|R}0aVIN2JOA;xUGs=18T#$FWGL~Rw`;_Q7q4LixuK-rl#+aC42m|b z=++vC{Y;+Q?UuDPUtdzm@(dT0bnW7YBX-S`u1f2_{Z?8pU7fdU+{foX0}VfyZu2`e zOPNe)jZHW!i#BYJ-i+5^Q?j*#Cys8?{ZVr`oM?F$xCrg+-p@_lv02=z{Nk07%{r>x zGC~%d8ROQ(wo$~4w7xSU8`(B>8*^5(^hRrcZ|Uoi3*uU|jGZ@H`r0d?^$pj4mHEUr zG2M}<9Mcntb;06(F#QtJ6j*$xV1d12xpH$E9XKNS%9X>)r$>i0MV;50-Ww8|T;1H6cK)O?EC{86}H$G5L5IbamRRnK>xy>C_zl%j&Mh)+$|$VI1y*T7)LUj+aYp<4`2{* zB!z$@4}l{$Ycv9{x{G(*@cbKl7U(m$;|p*{1=7_ly(yl*W6v7)93VXc#WIm@#-3Z^ zxtu*WqR)CNARTUbC{JlMo?*oU6?T)yLSybvHi99#cJsO9@uNqS%CC^eur{-laHPP3 zxRNCil^@=jXn4m@h*aLeYmbG4a!Lx`5f0J>)au8@2ow44sMT7Pj9SAuUKq($>1z!W zx^nzOc0NHV0Xebji#JW4@n)X1NJy-irGGPzzb!4Qs-km7o|GyiqD|C`N;Q}|m*68L z>e}+Rb!}mA{%6Y;l(!q0G-jBz$K5y7E*iscW6vGvvni&ue&j#M(rsA!Zn7KndKLJ! zrxK8?kyi5UNKdwtp_gH@Vo0_QPfjVac3gHi!>My+Qek0|`@k6KE0Wtj0oWdpRtki@ zhj!L#TJoE<%9i|iY(($mVr!?xZ)P~*VpaCwxP(5K7V2eM1+9ax5QwHTaHBiuY^_XH zaYVgu(*`Hqq1M$ta?T|w$-_E0EO|5Cu`~I6cyeuxLN}^Nxn;+YPSU1!iC!j8l7_J9VyuE9GM2H%)OPn~mO7k5k&EbP(EAsB#cuh5ne=;eD2G2G2HJ*CBs# zqmN2^N#CQtaqk{Qyx{bszpWZW-o8kVjgc~>eziX-bxcYL$HJpE4tgkGj=vox>C)>* z|NQL;Nt50O$O{H#rjz7yebQi})G+ z&~ne>@lTc;+B)+6=0e<+EEpw)stVBRO^k|es!Wq-FZvApD}X;u_pbBo1B(G6Wi>rG zksptU@91ASQWRan(7U9#bk_u*38@o%_MDhH!6(6$49J>4C2@G_)}v#_y}dc5IC1iP zir=A{9(;gO0`+t9SKMadUc_b468cQ&*%N$X=H_c}M^%>2<$5`2D-*)~rMO!TlIDhrRqz`F}x?^U(lY^aJ8lQElq!{%gA zrFQN{U1BmHD&FNRxkTw3WezvXtJ-Lm2WsjDVJ80`|$ND#RV&)A^HZOtL$X!=L=!5Uipl&;?) zX8A48T}+c${gPRTdWmHPkP zSJB$Rf**SEry49~(2GCmV7&o_S|cS;PI1p zSabDQp(o`T64S5gO6OS#{5wzAtA{>aulu>4fk=0=9!TFH=}x^>lDMrNNF|6W)lR`y z@K>;<9=3Y=)kjFNTY-`#!piCru?*Fhm&0TgFeo@U+n@f@*S}e*i|Yw5G(~L021S+gkotW!(JA=&7#SjTGvWPj7OdlESSH_tmi;k-E1UR3+G|zhM-ka{#p%C^VDi-{QaenVfxmzEQ~I z^HS9qP3cG}RUUUL;jx#=o78rNch&kaj&EHz`o7TaU(059<&Rv(*N-3Tjz4-tc2ZrJ z7i~e2H~xQ&Me;}?iP-nQbu0?Hd5~b#f137Etg0{TDJmNTWBVFH5Ami3wwID1WFC<9 z>zmWpPj7~E=$kd5({O_!P8{^y<}f>5N@=gqu;gHaq0Z7f6St@s+v;9Q@CZ8i*7NV6 ztyF_@qW4W> z^UhW@J|3?n&i-mGzg{;K5zflQEYi|}oK2BDiRU-fKYjymkuJRnUKTI>B)&(w;!@So zq>*H`|LIt1^JX$1MnKZH{OMufccsRT|4ft1@K_6~neq2(uxkW4-a@g?&@qmE$OzsZ z7q>QK_rq!wc0YAp3r?;VH%i0>^bJ}9ImhacUsoo9uO6IzmI;XAD_d?TzOgUH z7dM=~gmov^i#OAK_pC-7ul7MB)E~W+1?c%L<1Jp^K7_teEHjFx_M*Olrbf?SwSJi{ z;RnhVp68=mU8xv=1Rai(z)MQL;l+{ZjbIZqd~jXNb1lVOD>BbdDsRvJO1Z{LWJ6|S zVVpGOk~D?8{#@&^jE}V`J}^*2eSIN5d!*0Gh{rbR4HuFo_IeRMwJir|7ky>_M0HiKW%$TGYp6IvUDT4`#)Zh z&X6$rx$@&xdaW7#T>bIKW0x*TldfFBDy#*yNdXHR>W?1-#&2+|!jX1?GiZHF?e%1L zMnjtwtH1$LKajDaid!Ys->di(dly)P=12?pv#>qW`uwokvbS=6evOKxG%|KSEozjM z^T^}*STy>+YvG>qH!7}e&6G{z1KcZ~a?ixC`o26XE$9l`r2y`XofmduE`nM|8Y4)wm4y(Xd$@#Kpi2~gqkA#x>0;hblJ!?) z3fKAR47xFcndDErYoU}0e@V=A_cqd*ZYyS(12UY=Y+C-FGSl5-nmW;K0^j7K$FOJ9 zhtO-G$VG0wv{l4^(pGLGyLQi~`jWZ`m@9cPrxxHE$D%OR8Pq|_xK5m?8LZfLsZZ)5 z#GVe&-(B*zaGs-a5$Ro&=9a>B@;Bim3HA!r*M_t{Nc)<14!p;I z#r=yKOKR=Tnwq=N)6YXsZ;CsoXwN&dh?URO(bc|irp5=Cgv#G@>+9-L{>qgr`GfdF z%ImA^QI8%;nb0|R$={%F&0WZq^NOUS+Bmy&Dneg_{=1I;ZK3r=}UANAw zVh0T67uCu3I-gmmvHVi@I!)>{owi=8M!x1QRv||W>lbS2AoxJV!_{G*iyq_wT)V&e zS>HqA7jzYaTYKqy=j*>m=zGHTYFFX9&ZdDE@n*H@o8d~0^iA$MxhtA;e>M23P#q#w z@qgCVNmoop*iwwEL--B4eC{Me`K|iZKUvJM*U*xTu&2CB&rs+w(SM^v<5GpTIF}m7 zzg^`^OExK9KQ3hQDAi!@wWw2%p$?SITHI1DvpS8I`J~x1afSpj>~_#zvJ?i%yB%`M zd3hg1PPwk6upJU5g<3K5^zZOuQ|SozP-6>u)KP^!(g@mCW{-r$5Oz|<7|E=z&w|g< zaZRgI1}!NY6%krFuEQa>9bb$ZxOn{7h|rb9!j3a$bNWF`1Y4cwYCZ&iq^qlS=Xv^v z+f8Z9pD~p*y6+iBnAKa2Q;wh~dT2ixt;vml%j@%MbDcH+i_W@Hq3O4>-cL8JPtPc@ zQaehY^Sd>>=)4ofwh{=x`v%o0Zb-*|O5kT-+RFc3}>fs-FV@RXjNa z4gWi}nUI6BmrFEl%}!kpUC^~Wz@WTu`aW(cc5W3I!rZqA#> zP7j>#m+M_HYTRJo{((z^rp5kp=F^~AO=FP)1o!mb13~DA_BVApH z!?mTqZ)i_&n4D9Esum*_^+k9Jb-^r(VyK5Vy{MQs|r$xr0y4-MaF2{JO}c{l9)E z_ejOo3a>legFE%s9F)Flk{-InqpKio_bA;~UV3bTImqMGba?c^plA)*5_4{G$?k&Y zq;qw-w99&4P(N;GlY}l_5zfHyODT%~md&7c)W@n1Vi^#a0cDdQa}f7sN0DVeq}Jxx zYx$CBsz@U-bJg0Fn?uH=_z$pc9qjBM6zCP?;Yu_!ag5^?-9Od8bECE$KDuY<_H3`N zo4a)#oIk2>!C3Kq;SKUV<%}@Q+;d>7pjP(UxE|COyfr>@fUnjX)bFIl6*<26_^J4A z6V^qH^Y0&?H`j)|+F2?mMefpPR+C4jE)0%enQ}|I<9@93#BH6IdJ#k~2=X}ZVmo2M zj>Ws?P4aQoIl0u_+qHPdEyDP67CfI2o0#gyhT2=V#!VRJ2y;S(kFPnVI@%-Lg8>`D z`gx~mQ-XC)*F#6HA6Och>$77=|0C)@oozp{GVhU;dPDS`bz*vk!>@L+qX%=p-WWJ^ z#~{$QC-j99(6%}Dkzm08T*4G!Rabt1j>~)9$Qwjoxq$19nGDUnL|sfLa(_v zIvyu^qyzC=P_-jg3gxbeow=rQ-f@Ki0i}H$)J5OlTzWoFYIbAiPSW<$rAu84`z8+Z zL@kx5#Rs)m!b{Lr(q-Qc2*j}(ehD@2j$S!nXy99N00$!#%{;(Y17sumRh%Wa5+2(t3jZG2*4l#-0H6TQCEbv=^cEllRF3X_{0; z9zS@%RaSo^xM1&ekm|OOjF`bO0yZ4g*~)rD@584^e$_+O$3lQ$gOZU;=mN(D)YuBg)yEl5l(%tr5~8OoxY77KLgRx{ z^ugwwi_}Z1nkQAMk9#~>?!oQVV@ol{+eIj6Mr}E)6kaKX&!Hvk=4a{d*MA-CQ1gW< zTezjrMaIFXe#Y%p+&ys)tDbY>?s4xwctB3kis?tU>A?d!7g?$baQ6y5*G$hKfw8o- z$MLNXYCwOwxD*K1)xY#v{&*FaA|6Pclbk#!mHt}wcscjo^^(HRH6hndW|$3qW}%32hX=G9x<)7R|N$N$WDEfvzbO{=ijM(x3gmVb^B(@%{ss^+@ZQstxv$K73Pi!pY{7))tZRkFGX$IC6=;`#yZrb~L&T z`Ach-ed2u0xj%9SEI3}$rP1xj0}{P&X!}(TZL|b}Ry({@cfd1_)(#6UD-2F}I|k%P zH@cJ@hnt;uV$~S4amlJ{$x2yVb0erDJghfNft-id@iYW)4+#26ZCw;j|ShgkRgNJ@Uv=*L;Dod#iTr%Gx!gfPVZ^UZJBz+_v(dC33(A`I@UBp1 zWBRjA8=j6MR?mUuk5-EZxD5! zR1MVhBVBToRR1EBHdK+kLJ-GXzg}WeQ^U2;7)cFFGFD6V;b+RT+Is3rH9@r;J#K5% z<4j%?BRRu;M`bowZICu{PphL1G6%L2x~7+@LS-&!!h95{pj86N(4Q_YGNw5Vb*_S> znMubsR5Jf;O1FCsmCZ~^j2X{#rc!1+J+ITT!iUqg&zI+`mHe!_JkEvZrx&k`D*3a?a6}QE^_ClXQ^+M#eD!mW;x2)j zm#bP}ruq<6ZKP@j9H?yrq+sTCK7F&8w}n)bBAJPV5Bpbd9>^yv8{ug6LRCk>8E<1H z98O^MB?N=&6=w4l%Y+XlYuVaMM%T%UYh|DW^BWe3O80vKH(FfGPta{pw~!7>ze~q%-4k`E@87TcUbvN7 zZH9O89)BobT+EHm*Zszq(D!cC+`Ua=iIvz5ui?F2sIQ4Yqp4C}qS6~LQBI&QbKemU z>2v9k^f~e1{B;|Jfztbbef8B}BuKX$ao;#qnMx-F@!vs4Vz)C~b_Js@Z?cmZv&mRA z2qi}&bK=6Cef`_+w@okai{*^`&@pX7pJ%3U1D!mbx_b=lK040P(-A*HN5_+Cfc21J z9**7J2Xr43PxVGOvQwB1uQiP9hVde+70)zRgXdaMiuO>ayjgq}bxuoE9M<~A_U^kh zgO<5V^(jWcBgNku<3(s9Rf}7>N8&fc`(K))7x*bxvsUH_dmj6F+-)*Zx^(?h=^~k^ zSu4&Vi>1*VlqVjy&;KO6FEqpKBF8;r`&Y73LJ3$Khr%k9tF=2&=XENbSnLigtoUh@ z7IzO_I=N`Ew{5SI_=$@{x-XktxY*aGSFvOt5bPh|9_VV`s!c~!F)zU}ON7V!g)!*RSn!U&X-BQVm zmBuG{%Oy;8hW1sEiWAC&FPN4^+k$lzUHj5z(4W-na^!_oeIG%^#!UOD@2U&J7x*($ zOyu5Dre6G_S!f+WxGl6y*pE6sMI8r~I-qefoza?dVXZN%uI}k$tUwy8p$1j*X@x-@ zRnIzd$)Mxn+BK~1(H={e+#i2VUiFk%B63lr_vYY>Y{s3{;=2hvp@In z#wuWn7o{n4q>1-_A)k_~zhGbJGPLSF znlB(XseHvc-r0hv_dtyGlh#QGiPJSQS@XsHr`G)X{-TrmUDT!AO)B3kh?p+8?@ckU zVcWJfMOKa;=Wi~weWj`NvsnwZ+nAVuICn=E=}QvS%+tp=!$EKn`wV?I-P$JEGbX*0 zf6TPOZ`rADiaYv_3Jmq8(GNM*P*{mV)fdsL&cLmWP#Z2zAJ)an#Ys!_c050SU!0lj z_%-QzDr58yI~RXFDR=+qthwFXq^iG2QCMz9YR?2a(m73i(PPW+(&aPjr6*g)U0*rx z^YYlxvwsANCramxoz=H8EjHLk)`RKV6=Q}W_D_eavcrN=h?IG#9hCwEE@rRt5!VI7UTqFIl{J}I4@P@?{v4+~&17g+3>Pkl{H+s*ydt)qjdm#wW>sQmEiKQ%IPYX8h> zk&)B5Ge!^Uwb4(1XaIU+)bhb0_R$71M>BmX=vv&(}Ysb>V2Lh)W)_+Q(J2r>&A_(Z6+;Q zGHL3PCERgao5oFSY-~C-Zrs79qO!7L%HqXRqzwfc<(#~1nP9n4S~Fkz**;jS4RNp! zaqSdjw{FAq*{fI2uGq4!K`8gBLx_?Yu`SnboIZQan%R@L(3Mu2^bJ2ibrS2Ua%H8J z#$DwH2ye*{c7{hew+0&v1P8{9CFHBD6J*bC*B1J}a2j)pnF#04}r#4s{sMOWlZK%Il zgH*F@h+y0(Q*zPuW-R*P6ZC-@U2oD}pvK;YS0t<_IE!1P{m;608!G?WwPRz*=OejY zrq!@sDG)XalhEF+`u3VY@9Cky!~-~OYyhVQ*D^*pk*J22G_^R@S<`TcH4q>a3(2hQ zjM~nib`);=9EGjZtOpMqbno!dz|s@F5-rRE?tj)|$*CM`tocWpg?JkpEaJ>s5qqt@ z;%0A8aAc3$FG)X$KiKmNbmO=P$&TFoWq_IG04e#8r>pOf+*^2akm@^FEX$w;vvcE^ zt7~P0@v6k+cWcD~l`N_IgNxDoe{)^*zr@egoRbb?9hN9naYK#m zt9rvBur}sWSWM_%DdkhT3RHL%>pxS2i9v6GrH$xqW1y|l2cRt!Sz#X4Uua(91sydD zlHw9O^;S^xkB}qWS3&Dy-j#$D@Kw4-+)*)JxGz5ZN&Ji0kzB%VA4x&pIN?4@)aiQ* z_4HIV!@AQCCB92fpVeS%N4Toar>D=tapW0V0a^eB*9@_&xrs*+lhR(gVI3E`P2o(v!;AYqH@>ewIa=OO5o^1YD8fArrL}0PaMv{V!s8QfD^G=E}a`F zZojf9WNdex$ZI=uVq-+1B*(EMIXd$@dpNK-q{aV z2!6{QZD}dAAno0C`Q{`rA=6uo5Guv2kdkcDtd%a$9h(Y#(`MWrN{gD0L5r@87Kjk- zk083lpI$@=Rl+_xwDPDpN1StXNobt4x~ncdxL@dkbK*X(&$&gR8Gig8nHsftV7|t! zoWO#2#&KLT{>uwu1js=G&2{ zY*toggv-3Ls8g?AZoEb(hK>nYbVb~*_By=QJt@3{By}1VvGy>xrB1KpAtJrHR~y-(eQ*$0T+ zFEScL#)@{4zj~i|?#l4c(cN_?yN~H!dPO|L1$Iu%<>)UU zSbmtB#+4r)Nin9KH}Wv0yA&W?)jVcvMTG}VsBg-Srai$}Q}bA1&8Kf0_ey_Xb(CKQ z7!`cqShWOqUZe>zYIFT)z&v9E=x!kmV;QS`dSgLjjt+ms0c|8ziNBI3l9{xQ6bNa$ zApV5pD!C$bI}QP>d}>Y$%V5`UP2+Kd*IEi4&9MtBYhLyi=7jVh$2&)L>J-&^?wnEY zl$O3TN{U5zc=A)H=+1x>0gzEAN;yZ}JBVh1H4MgLoO(TQ#B8SDw^0=US_WtfHBQ5- zv(HeCAqa7><*|@G&knH)AKjaO|u#T&BIv9h}&` z>wZq&xYD3i>(-5W9+sMjPxq02vtp*~%+B65IVNWEuI!bP?tE$Kd0YX$lJFNwdCOCv z;I%W-$Bn8o}~)M)fG5z3UeTC9?Vnz&bI=i%?~!QUibNOP*+5u#xcJg91~RtX=; zrNyC_X-U{MxA&)7P;0{N<@$DGcIEhRYJ`(qcd&nSv58~?KKj(Yt%=cu9 zj9Vo7;)a47W-E#m)(3vxYFt2p)iC$e1GmAmw^Q+Uymasy9NMQ`Q{V9S(AkNojKAsO zpHcmeG>5<%Q3t&(@Teu7| zMVcYa_@1B-v2Vwj3G1-^K+mS5|KKH+A)Yx(7LbKUaci^fIcXIsJ_jqv5$=*ut&YYB zFr#uW0(y@#J}|^l>q!DBgQw`H^zW+%JBm8`5Bz7arC=Vb?JLusGVLPcuAw-pYV=g3 zt8)VlO^IhpGQ4NhmvmKDODSSZBvaC0IMwXMIC_eiPR(wEVEg-+@dyN)a#w~0zUc=@ zZ`&q5lA7$jc`r$Y05Y?h)Z_PO2Db{r{ zY6sNv4V}GV)eNq=+Spm$idk;7^#10$wi~{V?S@BB!+F(c2IRNQx^-a4kOQ}7>A#1) zF?8q~!wUBf9lF<=N-2JC?HpP4p;-`{Bbyk%Kwl)>(7lDVZ}NMqHwstlO{0(p3dU%M zORYR0dT9OmS#z;|-Rf5L3O1AgOS684uQ!tz75213ncTR6@_eUWAkY1VvX#k>+ak|? zvLay8f=;z9z-_lmPf#vbc4DcaRib{w83Vxsw(J5Q^}eY*UHWAN=nKVJGWMG z@BlmbfWOO{*1Jt7i%0$XJ+gFd(;K}!xaMl38uYSUHkFvvii3}7>CRR-R@;KJqWT18 zaeAi0Vq7)mc-j99d*)U35IB6ecNIwooZ5#XKg(OuBY^1@vUiHvSGU(#c7?-p}MfJ z`Wm0}49d$b8Uo6jQ>#`VXSj~xe^f;`K+LrIkwpEqw87+5%H>Zkf0Dwj6|bJakIN^d zy_%0@_U%32?wjH%o^#_kjp4dedF<^MzF2PxFDBNnpvYq zThQ-F<1&PUb<^~?sBhFyGqhZ_T7It&Ounn}TVEn(U3Wu?G%$)u+Bu`Nb5f{r8kb>6 z!<@IrB<-G2+C8zAaT-6%kOo6Tg>jnD-jF7=ufC;Eqve~n&QPDw-Z%|DLI?HDlc`Ck zMm;rYIr`p{%QU132MuYI()HV?r?gU^9E}E?MDtcBn>DIVu1=QwNy%X*b0Hm;G!NBM zkSn#i7qh__`nt9xiUZ42x1@SG9&M4!pyk%548s(fT`gr4ObEk-LiKIMC`c9d8}Xe{ zP1VVi21-p`ReAJ1&1le)${X1$n|j~V(>!jlL3(564MxPz2>8h-;HIQLut*M2<*0^0 zvo2PZs>Z0st0t+Ys%EO@Vo!02Y6W6dZ%}PkZCCA9y`egwdQV)bvmFtd>>yB96 zJNojxs1>PO3mois~=xljsJ-IYWNl!zPSv;v$#iw>tXbnpS61R|1LPiO<$KWo+{NK z6W;w_$!+hcK2UwEx}y4A^_A*d)eowlRllk3sQyy@t9q=eR@D$1NTw-iK`dZz>p(hU z|4mEWNEbK*`y)1A4-!FQpuP7deXwF3Kyt_sQb3AHDH%h?lSyRi|NY$TuZ%eRI$W+F zY4qEe`;FoH-}-d@v;O4@&ID&|6*b0R4dDT5i7bo zPWeWu;&9S8MU{q|_6Dj3tMXODRKr!HRO3_=RFhTHRkKy|;bXoG`_}7Jud24HcB)=e z?Nc369Z?-uy{kIQWJ+rsQGMpe(bo~9pw7qK0x$UE!{ehi`X)xt^fyia?}i!INpZla zeCB@_^YY|>WGVYazr;P5+2ltqgF*khAgD?y7{AOK(K)l>{~8af%0&t}r~kv3#GL#1`3}$*^tPsE~af;swbuprTDDcvFZ&lyEtKJ(q^8BhkeO8?p0*oF;(nM-8 zGnC*6KB-ei-P`Nxl{s?Q-hzU?!wUBm6zr>C{+5D$g|!*}kJZI|Ok|%NJ#DOL#7%ns zqJD#()fBOj+)h)P)s_uYcx~bOjd8i~g?E;=QF=h3mQ1J>_g84pE36|FLOr8w*=>yW zDeDjW2Jr@+xvFP%0vh$gvWdNNO<_Hn;1s9Q`1)Ne{=zz#S`EQTSX%@zi@mvl3H8iZ zeNo?9MDWZ|__m1=&l&19RAY*@;^+W?LF_|@Xc+BQ~larmqOF$^#b2yZYZ{FyQRdm=C%#h zY(Y1aEWkn7TVj`g)n`#V=|)=wI2^E{*n*r-o7cOcP8U}W-(tnx?>#RKXcli6KpEi0 ztyUPSni> zvXedj*rKs-U})Oa(z2Blx`jBk-BQ2q*MV229!H9vNzINb#A17qj5E{k6tNhZ4U<4G z@(M%pLhx_E^x(YuxR^-4Ey&hAFL?R@e8VZl04 zou3*MaIEXe(&<>y`WKCuZnRwEuFld9*SO2am6_V8tB>2jg&-K#%!Q7$*chlgv~Co7 zdzdvm;?`E^?XtF%eF#X^G z7ibuvgoX*B<+Au%*?Qt7Wwb8%2rmg;p|_690uMh0QOcnr;p6<&`6+c1ao6Y@j2#p! zG7U8wC4}DU%UC?^Ym{Vt)mP~WYK+7PG8ucbWW<)Rc7bKSP~0?-XB8DTUfqi=B6qP_ zdn~6;Sx(_};V{~pDm?XXwZGbroxuJP8ves6I6N|)5u;BdE5z&vY2x83> z5y>OY^BtmJ$1nSp3-n%?D;+VP;_vw>B4M8pMZS$rvgIPMMs#hPltf|*q^?y z!+Box`^8Ub=%Dw)Tw$LJ0+ua>ea>1T$b9PZt`6zA4uQ8p=Zkn71cl0>rSpJAh0z=^ zYVfRqHiFY)*LZ-n7Y$}-sSc2U=^OxlMk&ysx2(6?<7tCRqm+T4 zj@yN54KYqD=O**9@i>A1!!d+vfK=PHzT)gP zuo3qgC4mY4@jj*Q5cmH)mt%reVgnCaJH;*?f{QgS9X5DP*odP$Km}_P=KiuD_2j99 z5IPftm;^Rcr-W;sffvV0CPBC!e`sQwjQ$WH*4FNIbLWg>kw?kZFuX8Txb%>){ zzlqh31Hxk*EAy#e9KcD(hxZ?^!?{E?^6-z!v$hWKluK-9sV=qbb>5>!S-sB)9j(g% zns=Coj2RM6%Z$KAlQS;mkhPCc{BjLMg7bxIgmzX_*9q!1v6{81?I`GyP0k|JV6W?X zYP11~pjM#4j{*O)tj&3zQ=mv_2_)#PxVXwOV*Dp`skTELjfTYi9l!XQx2Z>gnbJUg z?rKNxb7}*%(C@@A!jGsY9iwjNWJ$-tI2W6_+(1jT-XyueB}#{p(8 zZ<%*08wgdxnM6p9POF9kuP;)4PO)BJBU!Jn%N-|NlMRl6CU=BAKBTSGBxr^hp(%+Z z+{M*EekQ>aS5C24n`*m8wpZJ_;Bz6Xa84NX2-TW6^zp=bns%SDuH4X09*B96I1DYum_{z5S|-g0ZsEf}@oL944zbo;6q z3yftmbsMW`0csc+IS%MTO6tWmMzH9zW0d7u;L-saQ%D79|FdqDbt^>WI4)%4iNPe6 zq$}oagn>SS5mXn(I=*gfF_yV{ll&eJopS5Bu3Kb7T^gn|=;Mw{?{%3lpy;>(3jOoc zX$@IE*brftYYY=^jPq_EfJSlM2XIG4bgKwY7eeM9=RL-6cUddnm32h~McVyaSKKu+Dr)3iD^_f;i;Ak-F7@?%NrgM`bcJUrk2wwD zr^zD6P}Kbu%^T@Zt6hj<7gjZU+GFOS)#PJ_Mx7Os&+u_mIo2_ql7hNnwC>oUp4zeF zx1b>H2V#MNd2T2>v`Q{0qX?$B6FJ9RvmgT(EpHQOAZ{Cwj2yaGKonxS;ip6XmyV@; z75F4|9D0!%>oEzeKt{e%H{`~-j+1kQ#4~ER#GK`4TsVi$6$|G&ve=jJ?fskZJjOs{ z{^rKq1(`NlBgv4DkjLDB9gmAea~vlh7G6-pou9KW&N$26zzO!rEaCb0)G#5Oec>Er z!tTKnLDDI>`NEw_XvCy~<)%@atu<1DkV*T~%E@p&BJM7oSwd-Ml+i zqV=$=eS}3gVD>ugmC$~=s$m-tJbKT%K6Jx`(PP+)sMi*EV3$e0@H3(#fTGu@Kk(=s zZwO`s0@bCDcl%CQbOVBOn+8D5|1BI~pk1uFf&%t>2j30jmcC!1fG8*YyKz7Rh|$B< z)7VvjJ)$(B)66TK3Dlu0iu@S%*Lam3DoBg9xgizzD*Jf%vh|FWYP_Qw-f+qTx%Sa( zh~=-ogZc0Njx&eqb$f$sl6q@+<%M%O4u`+ZU#-wc6;`LB+HQ6fa71DAyQF(5Q~xifDOuE`Zt1Crsx!-pZFKhltc z%hR1|UY0nidDMFIMg?}3&!0?n@TgirkIPDN%3IZHjJ_i9U}x#WXIknG(Dk#sB;&BP zB0`g6pm#48BGuy`=4HGKjIK~)gAsZ< zbT>3qFp5}}Q^ys}|L_jnWNj7Qbp-D0qN?wk`(6xdjnC8zk)z(V5X8l}-NF!)o zi+-V|NT+#R33wVaTHgDbCO8ggZIQ;f;CNxn=fl84_tJI$)aVjz{!Ef+VC~jts>3n& zkZsK>QdtVXxbf%nFt2hncTi&uoi<`dyc{2ed0sNT6JT|;;<_cp?0_bTnpW$$Lmspl z4WH8(^9tAj5@D@0w`e+-47-{8fdlKI&1Sb%|a8s zMxSC2{*%s|rA~8(k}Q8}g4Zv9hVunoT}QO1*wOx(bjV~nY8ptqq_P*y8PFPju3DOY zduQDp=8Pd1@2f`4w+=JiR*b8ft;Jj=f#xf^t@VTWcEHXGIAkO2vuK*f#~3T58~xqU zA^hBlaYyc;pIqzpxG9%jUPd>v#2<>8^0vr=AtnHefF=wsLpC(oBOaqaoV7I7q~73I zz_tO`X*#aDZKE9F?hos3+c*JQZJh>Bs|JgR;o9{e;*AL(`-ld&-SaRXD0?;Qp_SEa_HS7a_ZZ-zvlOP6y)BtbXMqQFmSmRWLq3q( zGLX(*m1fOOx$C&p+;IOieetl!Hlqc7Y=T8FtPZ#D+(L2d!J!(yoi_MTQ4ONUD8|ca z9N{rwl+b)$S1)obwfL;=+i43H`dCIffwIv2avpgi9`muxV-AOZBJ+7_c%1dhNHJ;-)$JMa(DC5=- zmu{H1am~=Y8yD>y9%6Vr+NZ|SINohE04MQ}bKDpt`Dox?0OB>gMrvN#7}bsC7>_>E zIK&|vn!rcKU-r9JV7$3c9#;2}(UbWa*4)-`*hYDb&!mwqXTg{yfPPmm8F7CXr#KD* zR*1OWq%+qxkAydQ(vj_0{Oq7*SquVLGNp{@`syn2j*k>{#+jmj&@fu2PAJ$yC8+dv z(T}Q9B?6<#wy+O-|LJ630pDnX{-fnqUspp2o737XlCSfI;G>cRYjw(Lp_OW2(KXK| zCAu0C=2Amci8q8X)7JIAbdNMiA2Y#G9?86?bEUY+*(S70lR8&Q>%Vjkqo@NfE6*@d zjxFK=t~sHrSM*9k?fWcAeMMdMH0vvDG5`qiVpZpj$OpE{0Hnh~n>6lGjMgLfnG4tt zckkSJ_s-pS@5cW^g#k^hH=f}od&mGur)f=@IKfbeyb`I{6FCH@1!kHSn>GNtwqL_+ zGn?b=cBHMLl&~Tl>Oz*4g8U*o-^Y=MEJGqbp*Fkr9H+>sBz7>EZAGD|X7|`q!L*#$ zlfKxuS|zkf+|>7I;)xSX80gba0E zZD2r@Ej%tetXD|+X&mOpR=|91s7_p?c&$bb)ZZH4>mcKh5 zB%1~XG-4Uwb!-es^xG4opMU;6I1ychlLm$O;tfTe0HppSPMkZ07jW`~)Ey_n$Z_QN zKy<~^b=)+l8gx%888Z4!B)%zE;Tz6sdUDQy$+6Wj^@Mu`wi;{^X(y>)w0K}4-&d4{ z6G6jCtG##Ru>_ui%$z_8)7Sv<#(qnEzh0=vyDRoavGykG#KtibgPVM6R*oFG zvPK<}R#=#Z&zs9%m_Pr8kL9M z9aH#y24+lxl5sW_7aG`+4ZV=kbRyM70d``#_t|You8e-5`hi@(k3aUy++Dr9Y((p* ze)w&RQScKq;#|- zTajR<$c}_0P%6?YK8Dhe$?S^vz$Ywa`$L+1MIT8$lVBgab=^vQko zDIEdv%@DOgdO0UcP*11L=r?Z5s8L(S0g1>^mMMv%Mcw7XhMBein?z2xshrdvDA=uW zp>fy=s_QtmVYa`yV0QDix>(k?&M~u&^^L9D);xQ`n^NITuN`V`ZCj`Quy!r;U)R>! zeCRdA=M9)CoRffQ=GRzU4LA|XNfw&suB%A3=Vr7{S=zjLghx{wnwL&#&B(Q zTUtjo#|8Gde%{0-MypFE&bz)xU|jR4))urq74+1A9vWZB7zu)zU(iK&K|rj;sqAC#sPD19tiP0TdAm4;A}+tM7o^9; z`=l(?GqIC4$^+-mZs*?uOnt>z`bMY60dooECsW45gv}m^*bJV2%U%%Q;trfvPj znQ&o1`{_Hz+VeK7E*?`7uUJAxTwA@gz3iJE$!OpJ_*>m?_Qy=VEHcNgEVk=g7c ziv!b>GBSfDYrK4G&F!yunYKIBy-)P1nc6pZOy2Uh)?8u<=^4&_!^S4}Uw>xjy+1zO zSU>H~<@22x+m4QJE66C1VNdyD8YP&9BSYdkc{B1O@?FBNtd!(rQ>e?J17?9vSQHjA zK1HC{u-iiB%4bIZDWkSz$cU_lBB95+)Ef>j+x`B62XC#NRWSEimb|2HMoz}qfqAuI z^5(%~@61XYQ=MO*b<%mUPhH-^msURXRJ_Gjx2$f`_9my_;Q3{PruB^uM^7cGgQd;r zVZKt2yp_mZskNRbZB{Qmq+V)2+Pd)U!}9E(e+W@(e|a@Te68oT|F!alWAlloU0vg( zVDw7?PT7(yy0481(VSQ9P8ZTL{bB_=6@jb^pijHprBKw;{6TK{fr(Y~PSh?aTT?lB zXzVr9Zo7ZNpu&FhUfHnx#bI*?t{F0{K4#kN+wN*)S@$5J!$@i;rK&&D;4tJ3m0DN;=?^qLE!`)73ofKlHlFfai3Ci-r6%Z!phT-DWz-wE5QlsJu;Jaj1EKjD zCT`rQI-hx7?OeZ^DJO@`%bpUMA75Nk-9NQFyg75(@O%Gj?2b`)Jk!+l%pJEs-8A-T z`P;|U)6X7JPai(aGLJmVG9OpJ%gk9B5;|@9vZ=8lH>DT9`TTW4(u!p4^fORiZtSN)vVd36e4i4+*IWz&{+%?CNp$bi~!{P^qVhNpY2@#ri zUAq1DOS|svyrX{m$)$^)m@(stMQw+tO*_1c`3=guXYUP}w?Ee>Gq*_o_V!)jG4D^-G(Vl#*nS*_B>h+`6yds-SF9B1)Y1nGE4`k|_oz{K&zW=A$fuI4va^QR8;1rWGQzrLXMy+JIf z{kaK(Sd-po=)lyPxSGNp@qa%ey!e;%ySL0g($QX#x$=ew$3J{%`hr2j9ES%MS$qDq zcN&c*NN6M#%C-8AAyI@KPqATgt@_U{$0;$pi^X`XrV8;9jl3+^f`V!faS0a~KoF)x8WrBOGNLlkVpTmv=FQM^fJjNg} z;mLp9XmfNF?3l6XMBbE=ua52iYD1Xq#((|S@wq}{<~{Pt)$goQFE}rz=gkV7 ztY(f?@2swEP=nYv$=T37jB(OIv`2UDq?qzK{$fJ3NZ}b=M?>)wnytWcbe9>o!*`q7 z`JTmW3-0+P3p{D*(K}dhs9_go%uCIh-#T+%O6t5B3Bkb$@wQ-ot7K8~x;=**)ZVyl z=#_rYeX@vs(>d?V8R>zgZ``#0%|&f*Y*_Q=vg6A(Z&|u@%jRVmQIpt7>2~o>jK_#{ z^Kmo_x4IbPafvn_gN~{ErnoaCRrS;d;QLfuGtt2k)h(=M$`thpxQ$(pL84kAQHZ|q z+ozBt6Blt~$OU;c65Da0D9NhdI)s52yjL28eWO3ky>-;aM@LV7e$&IP$S}%EcQs5& z9iCgzkPtmgy#Fp%b(i|rLA9G4kM2>s?p)g{zaDq_Z}&XD?vCO?#p=MUT-rxz+9F*i z_k9320xsXi^>vN6jv2C|CUE12YsPGUWnufb+x^*lYR5A| z<`FhoSU=*r>W22lk?Wd#zYe(j>n&|B-_@}8k%RI8TCGJE(D&;Chm(MN~Lp- zxj0wu@?<`S&+>&{&hS|pb)SWq!i1ZpyLsLz_)e5>3Y%2QpHi2oODUz|xnsCx=?|2l zE*|}~k@r)utF;nWYhkX|sGQcH9_9323~==TgXbH8IZP(>ZUFAj9))wulTEWsZOG?w6HY4MW$GXspy!~b zQC!bjCo1qqLX$;01c#wJIa$U*IDF3yLChSFis;~G9)E+BmgYFuH`kXqOp=hUo7ZQ& zF8s7Of&zdn9#KJpM__F@W5y_(B>6k>1P(9g8Lx|{Lep**^!Ab^Z>#5b->ZI0-X6F|(YGZ+s`YhBPjlt9NhQ}g7Z#SwOcEn( zc@xFfxJi9y9~wd&}Nd zzX7UWzrAeP+stF`+NZ^QVd&oGfM78!C`>qAxr!ZEZx^k-n)ePB)KA0Hg9dIIHtiYK*new% zpgnBFT*xq!*-7yX*QYSoOk$v>m5}iM(4t55w}x&{c4^x(mqhl5Cfv^@H_WA#LtN!1 zdz3pV-TkZZdU}*=l8$wQSMGv0#-rQ|(%x?6nqB4mjdI8UV$7G~T~zAxCGa2sJb0aB z<$fFQ;=$isbrZVRg{42z^%v=)d@pij<{&o!)?{sB5~3Nhj0;ARtOylYWdt&kk`Tg> zMJufoz|;J-TM5|rr=nQGi8-&UFR`i@XP!|19(5{OJ@?w|V{C}}gUcTJ z)562cPP4V0&o}RW3pIB)8^3ohe16elg0Ohe^SJBT^c8sVKIcV>i`vP$mByMstYs@^ zz!Kk!!QdS*`hg6zzMbC-in?C-St?X>ojZh?IFR}X-MEReM&3gOzIU*eCzX3GjOPE8 zVzPh^Zi$}xDxDY917eGowUQk`vi`b#?!=YO(?X`x_bbZu_*KIL@=ivIO^!XBBGXlyajtSM|1EkXQ*_rm(pEVF9-<%miu_C# zC%bq^y@YFEF*28QZjt5;&v3M73>Q0`@xsUI9s6069O0~9tIo|BK0JeMJGM?7gi9uT zx@Mbd&%FhqsZ(M^i1DiBN2k{zmRt{&)BH-ToH4 z{oNg2_xEu|c`hkhvsf;aqq%S#qMs~wTd%ONUfTjgL&Yq|4*D+6#2=1HuIKD7*VoCe zZ&!b~<~afo7#h}VE?`JMAkAq!@34=NoD}gGqq_Q(`@68){axMf{>~cQ-+%2nFA*B3 zI;dIpWnd_JR*xvbgT>l^gygDO-m~+O>n|j&8)j6d-@;R#f4Pde!413e8Ck32rfBIKWD*SIvwp)`kx9+dljLHli50|28%Rc+ zw^KsgHzAUPajnuSp568|Py0F@!m~$c5E}8*5BYMP?H}_Tx5oIcjcp|^d+r|F$V+~V zTYHRMSNQJkC?t&vuj=It-@U{&LXsb>`PyzM(_N#mF?SL%_j?aM{!Z>|W0plXJ<`7< z?(e5at(_h85wcy5|IV+rf3@Cl{=qR*7#pcWK#-8?V) zcory6!LzNdXP>&bI^D%LH&-Dgx*xI7_15qsa3-VcJ2?PeQ-Ud5iy-oOznP{P2(Y*= zwdR3OEx@X+v(UT& zuyIGr>qCkY`VCCWXe}$QaIVg{rgZdFdlFeX1LsIYFtnI7#VU}a)~-cNC`kKza248q zFOtqpzZW~9>jOll-;?K?1|u&O&!FrM^^=+O2=xmvrF0A~h=+T$*sM0=0L5Kt;xu@v4k9ZN}$v$dVcoE)|~WVeP%tr;BU^P6z8RZ zBjOuYt;zU`**Did;5_&*_5IDZkatp2SAECo-#x`f{d?`I@6<=%NxkiXJ12?>MQau; zooz3UU^n<+6AEKvOcTWMxLJyJiSc||+R~ix=iR$c?%pj7xPQ;R_wKo$N|u`(;(T^D z`jM}di}RhQ+1>ZvYZCD0I&r=b$E}iU9i868$viE@?cJ+7AAHaxb#_6kV)Ye?CS?60 ze=pR`7s4?x(W*q;e^`}3NYuN+e_F#fs34NSn&pAgaC6|9<|7Pb*;xC_cVa(*veBkeDunaht-@hn@ zbO+)Mz$7?l0KySK&~6wo>Z%hxD|%Ow9CzR*?Ihf!odzpXOdGAsZP7v~){*Ri2#6x; zOv~T=FFe(}7%Y8j`G+*ahbfE=DJ_|Ldi45DW9R(w`qXLrS67!Td2IRp*WBDTxasyA z`n`W-%9GdMpE|l|=GXoErH&MuanAGpY3wWKQsvMO=9sc#_2mI$GDY>l_{l488`bdm zy|a4kYBxvZrm~Wpl1PdDFyvVK++%BdUg%t|*7*z=o6#^=*y}qyE4LzvZFinH=lqJz zW>Iu&WamZG1l-NIp3fHG`cXtw|3^Mxpn98jPbaeoXPHI2x07AcFYKgW`t_YAcIgpl z^Fx3{b2kHq8yY>)AmZLLXRIgG?vTBpyIT-Cw|2cOz9`3<6jKoV2XHZvuCm}z32!@{ zh7~qBm#Q;?q7Rzr!G4lsiQbo3Hm)XUW0H!^Ka6!A0oz z(s9vshv%i--@0x3$6&v2w2$YGACu_ZtDY0?llOAyB%heOiu5VMN~?3PG-^iYqlwb! z8J+tdnkLoHz^!+mpH*$@-`N-cP=n;Zf3609A_B*Mn$pD=r6)l%`COpc&KNH1q+k7! z!g<+zx);Z>#r0KsQq4Z6rhGv+bd_VcbB%DLV}VjFZgtEP);d?cs(v7cs;AY>>YeHvKsc@5vo2XzV<(~m7>;nKm1->sRoy+0(I>F+)~a~_v2`>CITk; z=PXb&(Sw>H;MITM_UrUOMra7|{cn?H-uAyZ7I;!9a9J}329u^k^SBPd+8R3KX>K)% zR{DAvTQ99Kdl=hp+Ctd}y|l#x?v<+IWzW5u@X`-Y;|{%;4EsA?-V43hsLMLhbPyv* z5k`E>Ku4hySb>iyzUU}(l!-42hn*vxb#jsOz&V<$pH|^fC>aCG`xnVB9ltcw1iwgnsSAgt z;W<6%+((|%CDwIXdIGhED0>W8u>BvZd&Psw6lf;GmF4goaHlg2f2jI3?sXP7ws&5T zMqd)wX}3E&zxk)I?ri6=h31-t#BJ1_$m?>gHmtoH$cIv2evh=H#xdI)oV><4Rl8SO zNK41P(VmdOi%7OX{F_)N1xRHYg~0SWea})8-Q@K9_bkC%;{Vg;CPawLb}hJ0Q^Nrw z{ttu)rA3bTWaf8nXNsNN)|Q(&xF|Gj>bh~&*EWsL(C=Js)^1}SZ4b^Y8k}Cf^PWxC z_)ufh)9>B!BnIc@^jW_#e`5P6+~BNT+{~|Xwzu7|D7Al8tfg}*ZG+OcM8W-aT!-F` z#T_1f;4$L9SkN*+#3BMd14KB9{s?Sl;zPf&fTmrkLK8Q;-8m_2TxNW3LG`tx>*rP% zvr7bC?r785W7v)F6A(EqW z@)FX^%F^lCu$!BN3EeOMFfqp%wpaXoR=O~kKaToYC68xHgbxugr6-+XiW&8%GioCgMaF>3= z&hp!aI78Wui8Q=*%)zHc@ z=Xg>so)hOwH{!_(h_Lo#vN&Hh;|cb@2%npj&eE<-={P(GgoRIa{(;g z9;Flc7nf_lg^Rc{dbaw3aPs0swfW*j_K@~l+C=UHcOk^CZ@gN-`5qlEUw?y?#`;{gT?t3l{AG^ngZl9o8aFckC3WJ2Sm8^T0^Df@arThv{@m z#~nMJm5!atQ#zC%Rh8USCJ4{EC=<8) z7?{74+pduZPGC=tAw^mbgB$2wr-?RusatSyPy8=*BVE@wNDO>jJgUvt3|Y|Szz`$7 z97d?_<;1TYHt}nZa;En^;qjYIArbF)FK0%dp9Y57?N@XTOS^Z)%_BNff{*uISlF;t z1k1yaf$bAVl=z9f*J&5tciJ8Euec0LUa#&@H@_wLJAZhKEio_@c4-QMOgOE$4Ak>R zE_F8B{+QF^eEKoA9jn;ic;M%8n#3C)q(_6gbfyT(742(RZ(Y22m6i}W1NGw9I`yG+ zZ?K^^aAnD`8dr-Y5w##!n%{YcH2=hvtt{h@*vo2(L85s63eq0qPuO{O9vh||0Unf* zA4Az@-Q4y;s#4Bl(6&>W-nrAU+SP=7vnNlxQApsucqo}(@MuXpW3IQ8o5f`z-CGlaV@UBRl~;166bFL|WBV%&Z}X%G(K(E*R~ zZh7YuQjJ{dT&6zlVvX|!{&kCfC77m;Fi$Zq)@z-x!+j?h*(*Z_5Vs?H<>{ty9b^x9 zf#oLbip#}JqK7>B(7O954HiW;Jn*LUbgcciQ2s4+O`?b7Xjv6KTVV`Fdb>FL=LlB= z;#t>M;>Q)hxj+gYQiAzIxdBr;t|qX*J5K%@2yT;HT10WrZu}Et9j}Y|>O2m>vtM*P z+&#fZ1KtxD+m2|~n_FS+*%0Mf!wPF9#eZW~FLisTotVt*8+xqziXuGypL=L9J0?mPx7(+^OTBfm^ z-cV0{dT`tD0WJBt*U!7@*=ufb96qjI8vD?QBlD|fmSkQ#`GFJTZash7+E*Vt@)^tO zeB$!u%VOL)bu^px)Qtz`^$Uq9&FE8FkdQKe-|96lFIY6@>58E#HHCSD`$pw1-#zQb zCnkmDkKg!$*h{^Iv6a8HsXN(p#BnfNd`{el_(Wfv&>D!`J^B$o7ox`Mg*Q=|LSmx5 zfQfPlLZMcj5H{Bn(fcnp-!u4u22Xm%{^^-_Rj2ymD`KxCHF-Dd`N@&Hmiz;Roc6|a zV&h}|ioNLxE1Gc2)634XN7PgQYS=h?L~fY;u{R}{yK0dZ@+*fyTXd|fT3&lse|Vuz zi(Pc6!bL9nCDiCjwFszf|BnRp@ud3Jf1WsTmW4jayYznb^50)Mt{n0}R9eYm`gwNL zm4tcoB5J^tO;0S;`nlzv74@lDf#_kHC;TLhM$EhjJ*LfqJ*HT+pz1G(zw(@Ax8AmN zVa0%3mqZ>;-}BDGiS5f4R}7e58*w=Gh64+KLa8S?Z^~QJ2H1@zlyz)~`RNRC z^cFvL^tR0O{@oq0s{v;E0B5`QNYQ-lK|hRR&&T{3o1dV#6kq16sKTC>=4x9&Np@vs z*@B^y7v3=|p$Kw6pmcU!#>m*PWo_xvPAR3ncu3XoS^j=vFYFl4#$NkuX|0wm(i<9W zt@4B}WxIi@Y3}dRTE{9EP+{IuXRiCNS20^LZN%DSu{2as*gF&rVk^Y{VzE41QIvDq z-|9uNm?a>lbWVCqYK7rtI1Q64e1e@jlv{v@(aq)rY_tWX!r+SL*s$vRl6ohPm%nN3 zpIDoD%kI#!^nv54t)~F{GESt~m2+MFO%#JVN4FXQVv<}YZd4**TQNQr#EBc7yM(E7 z*@yH_$B4hPVz1wd2UzrZvA>Yv{3~GMc4hHXr9@JciyYtG(gPya*75fx;Yrl4lKw6( zQP%U?%$&rIvM0x?c4fVKspDCKUW)f~^!K5%UHJYwHD#=_{`|8Ygz*>Bc0`e90@`JQ zX8ODI2k~9tsQ^zvlkH4+mPIVY_P&dYSZ^gl?OgrGKdxpnAfxO~l#StKL$NcwNEW9q zR6jqae!7VHDluzR2b0!3LM6LU^00g!-o2@uqA)z5z|~J^nzwbN@4?_vRaK*{2Yp7~ zDebJ^GA6dHq@*l%%$9oeSEV#loUbechN|!+F#b^bNqj@e!QWk+A9m@CxDk7=6dXGs z3T~0kNU8D@2B)P|M~nD?bmk+C+JA!D$1#>(HpV?bJSk;i6*WgPD?fAvD37DfZFq7D zPlhNzNSl?%c`To?XPwszm%3JwR8)17isp*u@X#r{3n3M2n<^3;GLC)Dg#xffIDZhY zF~tBs@B#R}A>@mn3Fi&`#LpaGieW-N+zrcX3VIm!PrL<_K~<)xtU{}RK&z6HRU??g!IvK->Ntj|CREARb$|H*ec^RQBJb?MtS z(sD4UzN)G|=%A(UPU)3t_cujXH#b*DH{CzYB(Oo!U!e8 zT~2@obh#vIqjR?~MNasL-i>hnC|+ZV<$G|kH?SxVTUQ__WLb4B6mFa_q4%L#Gls1n zKjga9VNrwPviqtZr$lzG_M0`Ta%R8eusZ^*Sb$@!L6yZ2#Go-xoQ9E;wj2UioK(;T zfkNTOgo)QAmlee3g@;AMkxRsb47w;7laMqJ- zp)A^k02aLSgnVn9niB(k(X|Zv{R8Q@={@-;@w_=7+IbO?`pYQsko<+%+gyVum*@!~ zj+8$Zmze1WS3rcwyvz>PsLAHG3myAhZxOf0Te5)aGBs(qdEwXlxCQ)9{!sj@`B6Z- ztU)t;8Mh5Iw|LsX57F{p%~L&Xpe}{5f##`e)J`VrHV`Ebn{%%&h2Az$ z{R3D!VF0GJHh{a}Y7Z8rqYj4eW?^IvL{q!DI z_ZtptnmS7y(Y2qCkgz`mdA49faObVPuaR`_W99CcRvf~vB*fPf9reMo|KVzdcU zb{jpu4-wig8efu&Q@>g?Kh#Kyrrd_Y@+s?WKP;5TvFP> zO~{DXMVyl#qyKrM zD#v1OYWiN<| zrel!GC(PGkeLMmD;kl0BPI8Q_SGA1n{oZ584Xzv)5u00nbsM>9WmeX4N@EqksVy#+NzGPoH((vqP6u=W?rtIkiRqJ)%eY> zSN}AJVX^mj!xy2~Y+6N23s;Lim6Ik_qK(-7>Pt(n2L567i#Y`Sb!or&sd*yDp4P2A z{0&dvL%e!#UEz`Z*VS3L-|$b2-)xCDBcYYLuZywaGj4@8z+y1nVnDNmCu>d~l>ey4 zCL%`OWq7_Q{WI7azpc6PE8R?(;BB)=9m-#`Md&qQ8t1W-ExzTwj=08#ZikY%e9!$KvN(-6!|H=O>T7aq!H704cCACa*Tq z(jzNmyCq_5(pO5<)Uv!0qhpoWma(B#caHRbc@!f2snkiR7|+#*R9!8cf9 zVscPGVR~ewl0PWe;@>ni)^ESEdh{zt`Um9&Sga)(HlN6T8D>jRMMaQBi5IN(VSZWt zLu%!etoY#YhPJBU=IJBM2}@=NN0o=C6wesfbWNxt6om`ciXd}dzw{8r*Ed;?iS(JR zOfB!&yQ8FdNnMb?zv3%0zo0%*QP!=~T5s)VX_7YI8K34SNxg&nrUiwB#U}UKDcM?< zEJ)6c@byVat$DiIPmJy<#BHb=d)u6HU)C7enlnJiEwdF0`9tFbYrapRl2sKuXhOR= zb<()RKEBggxZ-CkiYX9leFLKWQ--D{&K6%!SW{EcJ~=WmQVt!_8flFjWlzVpNuR<} zYj#ec@365|iXZK5?JQ4*7EfquPXV=IyrOJYH&MF1Nk@J^Y)8X<%x`C9zqD_h4}p9@R(QQ|E=K2oK{)+fONF|tfie0=<# z3#+g2_0Jcpa>FA73X6TSm-kYnq&Oi3>k#Z>*Idg*d9CT+*j{I6Ik3B=S4a#9oq?9p z*91+k%%P-9P&m>~s2=PO`Q}Isg~#|G?mnrxRzMqDbD(n2c{{XNJ6>QXQ)3I}MlF{e!7WjZ)WCu}lHW3w)Q)Dl|J6N(DGXMc9e&Mwp){RpEP-Q|kNT)h>G)InS zkucM@e9moSt2V?5J)=dx>ZfZ`Q+#|Qa+4PuoJUBipMXn9$pXC=;ZxxUVh^xLiqhF+tEu+M03CIiT zf8>?XtCjtJu~VD;Ey08GmB`5S!hoP;kx9Y60-2WZNQ?iV5&`yxwM-ZkTa~30`s7=M zxS{z%p{*=e7?9H%xw0Up$mXYnv+2Hl630zSHH*sZ#MGfF{!szG(qik_*2;K4i*Hh> z5K)>Q&?_n>$>JN)r`Q^i8DvihkSt=an24O=zO#j#hPcGSh@j{gYe< z5ZmuzC9Njyj-FBMWAlZ=`{xAM%7ZN#MRl9fd__N>=lpzplqpad$&%2=W~r2Xd@S*b zPkPvaY~SL-fXMLNDly;Rx1v65Wr`4&Bq>+|@{vDhPgvfRwqhq5oghoV3I8I*?T4Eh zp+^|#=(It0vYeMobKx92Msx@hWESEFdCx8k%_seWa3?1tgC-YkAHxv(Nya1mOeUAd63cB_c$a*(2B|Na+*Q;%A8opDoLZJs_|kSTyIzC7DQT zHrN`H)m3e&xnd_5IzR(~x2R3!c+W>;BJkN}Rn) zD3xLY%rYyL#o$ORdp;5z>>qnU2uh4?7e${WF;@0dPl^miJgP)U@CgWIX7zZlXn!$A zS{)n`VF~cD1pS};_5X$Yr7rdj>Z1ht1dk~Q46rM*JUcwb;+LzG$T{YmfIvSn*+)=X z{0i-6pB|ZFMxvh|B2z-O%#y+_N=#LZ)vvcN>@dxpam}-Ql;`2eSV^NjYM*+0q#{ zMILr}%BJ9ctwY%{HE8x-*N)4W8ecGCu$socTzcPX(cEQviJeljU!wR^*DmqTN*#7( zW7b=b^fcx;OzgDmQg9h@o;vRP&)FBD&S8HRe9SMgqBq5WSJV?qo%4xzz6qVSdZ3DI zJ zOIzQzEqmq$&t-90an1#lj#{`qE=!$Nfz^)6mX;llJR&YewUJrQk32vmW{m_0_Ga6b zEp2KpdvWeuwagh4myr?2&e2cx?MYRYO^VV~Sv9Eyd!rC9b?y_tM865NlbwlQI>NyB zI@&(Y-${q?4x?v15=G&}lX%!MlK;>OA^-Ow#1~$5?xS+j5OcQ2Y7-#qPjif?fY~Lz ziZzPJt4D|Ltg{^SA6r$`)DvqI+oV^=wU3M{9yqW#YGnI3w9_RYM`Sq^kzXYGFggAo DhWrub literal 0 HcmV?d00001 diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index 40f49b0..1450ed6 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -122,7 +122,7 @@ public abstract class BaseXPrint { returnText[1] = 0x33; returnText[2] = (byte) height; Resources resources = PayLibNex.getInstance().context.getResources(); - printer.setTypeface(Typeface.createFromAsset(PayLibNex.getInstance().context.getAssets(), "fonts/fira_code_medium.ttf")); + printer.setTypeface(Typeface.createFromAsset(PayLibNex.getInstance().context.getAssets(), "fonts/firaCode_bold.ttf")); printer.setGray(getGrayLevel()); } @@ -449,12 +449,11 @@ public abstract class BaseXPrint { printer.appendPrnStr("BTH NO:" + batchNum + " TRACE NO:" + traceNo, fontNormal, AlignEnum.LEFT,false); } - - printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false); +// printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr(transType.replace("_", " "), fontNormal, AlignEnum.CENTER,true); - printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false); - printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false); +// printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false); +// printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false); } @@ -516,7 +515,7 @@ public abstract class BaseXPrint { print2ColumnsStringNoSpace("AID :", payDetail.getAID()); - lineBreak(); + dotBreak(); // check is pin change if (payDetail.getTradeAnswerCode().equals("00") || payDetail.getTradeAnswerCode().equals("000")) { @@ -525,17 +524,17 @@ public abstract class BaseXPrint { if (payDetail.getTransactionType() == TransactionType.BALANCE_INQUIRY) { printer.appendPrnStr("MMK " + PrintUtils.getInstance().getBalanceInquiryNumberFormat(payDetail.getAmount()), fontNormal, AlignEnum.LEFT,true); } else { - print2SideString("AMOUNT:" + currencySign, PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount())); + print2SideString("AMT:" + currencySign, PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount())); // printer.appendPrnStr("AMOUNT:" + currencySign + " " + PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount()), fontNormal, AlignEnum.LEFT,true); } - lineBreak(); + dotBreak(); } else { // lineBreak(); emptyLine(1); printer.appendPrnStr(BaseErrorCode.getCode(payDetail.getTradeAnswerCode()), fontNormal, AlignEnum.CENTER,true); emptyLine(1); - lineBreak(); + dotBreak(); } emptyLine(1); @@ -777,7 +776,7 @@ public abstract class BaseXPrint { } protected void dotBreak(){ - printer.appendPrnStr(new String(new char[29]).replace("\0", "."), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr(new String(new char[29]).replace("\0", "."), fontNormal, AlignEnum.CENTER, false); } protected void printTransDetailReport(List lists, HostType hostType) { From 8791e6de4c54d548bf3ab65fce1835e98fb54276 Mon Sep 17 00:00:00 2001 From: kizzy Date: Wed, 4 Mar 2026 14:34:03 +0700 Subject: [PATCH 007/101] backup --- .../utsmyanmar/baselib/viewModel/EmvBaseViewModel.java | 5 +++-- baselib/src/main/res/raw/paypass_config.json | 8 ++++---- .../paylibs/transactions/TransactionsOperation.java | 3 +++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index ba2d0f2..31ea53d 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -652,6 +652,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { byte[] aid = emvHandler.getTlv(new byte[]{0x4F}, EmvDataSourceEnum.FROM_KERNEL); LogUtil.d(TAG, "onTransInitBeforeGPO :"); String terminalCapability = SystemParamsOperation.getInstance().getTerminalCapability(); + LogUtil.d(TAG,"Terminal capability :"+terminalCapability); // emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, new byte[]{(byte) 0xE0, (byte) 0x28, (byte) 0xC8}); emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, ByteUtil.hexStr2Bytes(terminalCapability)); if (mPayDetail.getCardType() == CardTypeX.NFC.value) { @@ -1214,11 +1215,11 @@ public abstract class EmvBaseViewModel extends BaseViewModel { emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x1B}, new byte[]{(byte) 0x30}); //EMV MODE :amount >contactless cvm limit, set 60 = online pin and signature , set 20 = signature - emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x18}, new byte[]{(byte) 0xF8}); + emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x18}, new byte[]{(byte) 0xF0}); //F8 //EMV mode :amount < contactless cvm limit, set 08 = no cvm emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x19}, new byte[]{(byte) 0x08}); //08 - emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x25}, ByteUtils.hexString2ByteArray("000999999999")); + emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x25}, ByteUtils.hexString2ByteArray("999999999999")); if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A0000000043060")) { Log.d("nexgo", "======maestro===== "); diff --git a/baselib/src/main/res/raw/paypass_config.json b/baselib/src/main/res/raw/paypass_config.json index 09ef9aa..a628b31 100644 --- a/baselib/src/main/res/raw/paypass_config.json +++ b/baselib/src/main/res/raw/paypass_config.json @@ -7,8 +7,8 @@ "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, - "targetPercent": "00", - "maxTargetPercent": "00", + "targetPercent": "99", + "maxTargetPercent": "99", "threshold": "00000040", "tacDefault": "D84000A800", "tacOnline": "DC4004F800", @@ -32,8 +32,8 @@ "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, - "targetPercent": "00", - "maxTargetPercent": "00", + "targetPercent": "99", + "maxTargetPercent": "99", "threshold": "00000040", "tacDefault": "D84000A800", "tacOnline": "DC4004F800", diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java index 6ea2400..9951dd2 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java @@ -434,6 +434,7 @@ public class TransactionsOperation { } else { boolean equals = TextUtils.equals(resultStr, Constant.ANSWER_CODE_ACCEPT) || TextUtils.equals(resultStr, Constant.ANSWER_CODE_APPROVED); EmvOnlineResultEntity emvOnlineResult = new EmvOnlineResultEntity(); + emvOnlineResult.setRejCode("00"); // MsgField field38,field39,field55; // if (resp != null) { // field38 = resp.get("F038"); @@ -456,6 +457,8 @@ public class TransactionsOperation { // // } if(equals) { + emvOnlineResult.setRejCode("00"); + emvOnlineResult.setRecvField55(null); importOnlineProcessStatus(SdkResult.Success,emvOnlineResult); } else { importOnlineProcessStatus(SdkResult.Fail,emvOnlineResult); From b7822a2736180223b32c81cd1481bbb0eb10e3b3 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 5 Mar 2026 09:37:04 +0630 Subject: [PATCH 008/101] master tran error fix --- app/build.gradle | 6 ++--- .../baselib/viewModel/EmvBaseViewModel.java | 8 ++++--- baselib/src/main/res/raw/paypass_config.json | 24 +++++++++---------- .../transactions/TransactionsOperation.java | 3 +++ 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 274ea31..66c899c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId "com.utsmm.kbz" minSdk 24 targetSdk 33 - versionCode 21 - versionName "2.1" + versionCode 24 + versionName "2.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -49,7 +49,7 @@ android { buildTypes { release { - minifyEnabled true + minifyEnabled false shrinkResources false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index ba2d0f2..2ea4b1d 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -652,6 +652,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { byte[] aid = emvHandler.getTlv(new byte[]{0x4F}, EmvDataSourceEnum.FROM_KERNEL); LogUtil.d(TAG, "onTransInitBeforeGPO :"); String terminalCapability = SystemParamsOperation.getInstance().getTerminalCapability(); + LogUtil.d(TAG,"Terminal capability : " + terminalCapability ); // emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, new byte[]{(byte) 0xE0, (byte) 0x28, (byte) 0xC8}); emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, ByteUtil.hexStr2Bytes(terminalCapability)); if (mPayDetail.getCardType() == CardTypeX.NFC.value) { @@ -674,7 +675,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { } else { //contact terminal capability ; if different card brand(depend on aid) have different terminal capability if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000004")) { - emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, new byte[]{(byte) 0xE0, (byte) 0x28, (byte) 0xC8}); + emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, new byte[]{(byte) 0xE0, (byte) 0xF0, (byte) 0xC8}); emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x1D}, ByteUtils.hexString2ByteArray("6C00800000000000"));//terminal risk } @@ -1214,7 +1215,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x1B}, new byte[]{(byte) 0x30}); //EMV MODE :amount >contactless cvm limit, set 60 = online pin and signature , set 20 = signature - emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x18}, new byte[]{(byte) 0xF8}); + emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x18}, new byte[]{(byte) 0xF0}); //EMV mode :amount < contactless cvm limit, set 08 = no cvm emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x19}, new byte[]{(byte) 0x08}); //08 @@ -1231,7 +1232,8 @@ public abstract class EmvBaseViewModel extends BaseViewModel { emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x1d}, ByteUtils.hexString2ByteArray("4C00800000000000")); } else { //set 9F1D terminal risk management - MasterCard. it should be same with the MTIP configuration for 9F1D - emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x1d}, ByteUtils.hexString2ByteArray("6C00800000000000")); +// emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x1d}, ByteUtils.hexString2ByteArray("6C00800000000000")); + emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x1d}, ByteUtils.hexString2ByteArray("6C7A800000000000")); } diff --git a/baselib/src/main/res/raw/paypass_config.json b/baselib/src/main/res/raw/paypass_config.json index 09ef9aa..47dc7cb 100644 --- a/baselib/src/main/res/raw/paypass_config.json +++ b/baselib/src/main/res/raw/paypass_config.json @@ -7,11 +7,11 @@ "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, - "targetPercent": "00", - "maxTargetPercent": "00", + "targetPercent": "99", + "maxTargetPercent": "99", "threshold": "00000040", - "tacDefault": "D84000A800", - "tacOnline": "DC4004F800", + "tacDefault": "F45084800C", + "tacOnline": "F45084800C", "tacDenial": "0000000000", "floorLimit": "000000000000", "cvmLimit": 75000, @@ -32,11 +32,11 @@ "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, - "targetPercent": "00", - "maxTargetPercent": "00", + "targetPercent": "99", + "maxTargetPercent": "99", "threshold": "00000040", - "tacDefault": "D84000A800", - "tacOnline": "DC4004F800", + "tacDefault": "F45084800C", + "tacOnline": "F45084800C", "tacDenial": "0000000000", "floorLimit": "000000000000", "cvmLimit": 75000, @@ -61,8 +61,8 @@ "targetPercent": "99", "maxTargetPercent": "99", "threshold": "00000040", - "tacDefault": "D84000A800", - "tacOnline": "DC4004F800", + "tacDefault": "F45084800C", + "tacOnline": "F45084800C", "tacDenial": "0000000000", "floorLimit": "000000000000", "cvmLimit": 75000, @@ -86,8 +86,8 @@ "targetPercent": "99", "maxTargetPercent": "99", "threshold": "00000040", - "tacDefault": "D84000A800", - "tacOnline": "DC4004F800", + "tacDefault": "F45084800C", + "tacOnline": "F45084800C", "tacDenial": "0000000000", "floorLimit": "000000000000", "cvmLimit": 75000, diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java index 6ea2400..2f5ac8f 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/transactions/TransactionsOperation.java @@ -455,7 +455,10 @@ public class TransactionsOperation { // } // // } + if(equals) { + emvOnlineResult.setRejCode("00"); + emvOnlineResult.setRecvField55(null); importOnlineProcessStatus(SdkResult.Success,emvOnlineResult); } else { importOnlineProcessStatus(SdkResult.Fail,emvOnlineResult); From 9e2dd24f3d1ff7f9418f6c8269b38127632716ee Mon Sep 17 00:00:00 2001 From: kizzy Date: Thu, 5 Mar 2026 14:16:54 +0700 Subject: [PATCH 009/101] fixed for DE 52 --- app/src/main/java/com/utsmm/kbz/MainActivity.java | 8 ++++---- .../java/com/utsmm/kbz/service/AutoSettleService.java | 2 +- .../java/com/utsmyanmar/baselib/di/NetworkModule.java | 4 ++-- .../utsmyanmar/paylibs/utils/iso_utils/FieldConfig.java | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/MainActivity.java b/app/src/main/java/com/utsmm/kbz/MainActivity.java index 189f63a..c20fa1d 100644 --- a/app/src/main/java/com/utsmm/kbz/MainActivity.java +++ b/app/src/main/java/com/utsmm/kbz/MainActivity.java @@ -157,10 +157,10 @@ public class MainActivity extends AppCompatActivity implements } private void initKey(){ - SystemParamsOperation.getInstance().setTmsAddress("https://api-tms-uat.kbzbank.com:8443/sirius"); -// SystemParamsOperation.getInstance().setTmsAddress("https://sirius-nest.utsmyanmar.com"); - SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms-uat.kbzbank.com:8443/receipt"); -// SystemParamsOperation.getInstance().setEReceiptAddress("http://receipt-nest.utsmyanmar.com"); +// SystemParamsOperation.getInstance().setTmsAddress("https://api-tms-uat.kbzbank.com:8443/sirius"); + SystemParamsOperation.getInstance().setTmsAddress("https://sirius-nest.utsmyanmar.com"); +// SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms-uat.kbzbank.com:8443/receipt"); + SystemParamsOperation.getInstance().setEReceiptAddress("http://receipt-nest.utsmyanmar.com"); PinPad pinPad = MyApplication.getInstance().deviceEngine.getPinPad(); byte[] encryptedPIK = SystemParamsOperation.getInstance().getPIK(); diff --git a/app/src/main/java/com/utsmm/kbz/service/AutoSettleService.java b/app/src/main/java/com/utsmm/kbz/service/AutoSettleService.java index e397ac3..2e6563f 100644 --- a/app/src/main/java/com/utsmm/kbz/service/AutoSettleService.java +++ b/app/src/main/java/com/utsmm/kbz/service/AutoSettleService.java @@ -448,7 +448,7 @@ public class AutoSettleService extends Service { stopSelf(); } } - + @Override public void onCreate() { super.onCreate(); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java b/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java index c8732f3..6eecfb1 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java @@ -287,8 +287,8 @@ public class NetworkModule { tmsAddress = getTMSUrlFromNative(); } -// String baseUrl = tmsAddress.trim() + "/api/v1/"; //for on prim - String baseUrl = tmsAddress.trim() + "/"; //for uat and prod + String baseUrl = tmsAddress.trim() + "/api/v1/"; //for on prim +// String baseUrl = tmsAddress.trim() + "/"; //for uat and prod final Gson gson = new GsonBuilder().create(); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldConfig.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldConfig.java index be8b436..41223a6 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldConfig.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/iso_utils/FieldConfig.java @@ -103,8 +103,8 @@ public class FieldConfig { /* FLD 49 */ {0, SDK_8583_LEN_BCD, 3, SDK_8583_DATA_ASC, SDK_8583_ALIGN_R, ' '}, /* FLD 50 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 51 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, - /* FLD 52 */ {0, SDK_8583_LEN_BCD, 8, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, 0}, -// /* FLD 52 */ {0, SDK_8583_LEN_BCD, 8, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '}, + /* FLD 52 */ {2, SDK_8583_LEN_ASC, 8, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, '0'}, +// /* FLD 52 */ {0, SDK_8583_LEN_BCD, 8, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, 0}, /* FLD 53 */ {2, SDK_8583_LEN_ASC, 32, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'}, /* FLD 54 */ {3, SDK_8583_LEN_BCD, 40, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '}, From 900ca456dd9383518490ad137b21643ce5b0d7ce Mon Sep 17 00:00:00 2001 From: kizzy Date: Thu, 5 Mar 2026 16:40:25 +0700 Subject: [PATCH 010/101] fixed for key issues --- .../main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java index f2880e8..7826b42 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java @@ -22,11 +22,13 @@ public final class TerminalKeyUtil { public static final String TAG = TerminalKeyUtil.class.getSimpleName(); -// private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); // KBZ UAT - private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // MPU + private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); // KBZ UAT +// private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // MPU private static final byte[] work_key_data = new byte[16]; + + public static void initNexKey() { byte[] IPEKByte = ByteUtil.hexStr2Bytes("5A4CFF6DE93F0488926166F3317EFD2F"); // IPEK byte[] IPEKKCVByte = ByteUtil.hexStr2Bytes("1F0C18"); From 89252a673267316d755b5331fe95906881ccd9d5 Mon Sep 17 00:00:00 2001 From: kizzy Date: Fri, 6 Mar 2026 11:21:54 +0700 Subject: [PATCH 011/101] fixed com2 --- baselib/src/main/res/raw/paypass_config.json | 26 -------------------- 1 file changed, 26 deletions(-) diff --git a/baselib/src/main/res/raw/paypass_config.json b/baselib/src/main/res/raw/paypass_config.json index a628b31..d55b33f 100644 --- a/baselib/src/main/res/raw/paypass_config.json +++ b/baselib/src/main/res/raw/paypass_config.json @@ -49,7 +49,6 @@ "cateCode": "2701", "currencyCode": "0104" }, - { "aidEnable": true, "aid": "A0000000041010C123456789", @@ -74,30 +73,5 @@ "ttq": "36804000", "cateCode": "2701", "currencyCode": "0104" - }, - { - "aidEnable": true, - "aid": "A00000000430", - "cardLabel": "MASTERCARD", - "applicationVersion": "0002", - "emvDDOL": "9F3704", - "emvTDOL": "9F3704", - "partialAidSelection": false, - "targetPercent": "99", - "maxTargetPercent": "99", - "threshold": "00000040", - "tacDefault": "D84000A800", - "tacOnline": "DC4004F800", - "tacDenial": "0000000000", - "floorLimit": "000000000000", - "cvmLimit": 75000, - "transLimit": "999999999999", - "transLimitCDV": "999999999999", - "terminalCapability": "E0F8C8", - "riskManageData": "6C7A800000000000", - "kernelType": "02", - "ttq": "36804000", - "cateCode": "2701", - "currencyCode": "0104" } ] \ No newline at end of file From d8d1a5c1d5ecdf72737ad1b869f6db968451e696 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Fri, 6 Mar 2026 15:25:14 +0630 Subject: [PATCH 012/101] amount fix --- .../core_viewmodel/InputAmountViewModel.java | 127 +++++++++--------- .../baselib/viewModel/EmvBaseViewModel.java | 4 +- 2 files changed, 64 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/InputAmountViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/InputAmountViewModel.java index a291968..8c31a80 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/InputAmountViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/InputAmountViewModel.java @@ -13,112 +13,109 @@ import java.util.Objects; public class InputAmountViewModel extends ViewModel { - private static final String TAG = InputAmountViewModel.class.getSimpleName(); - public MutableLiveData inputAmountView = new MutableLiveData<>(); - public SingleLiveEvent invalidAmountMsg = new SingleLiveEvent<>(); - public SingleLiveEvent availableAmount = new SingleLiveEvent<>(); + private static final int MAX_INT_DIGITS = 10; + private static final int MAX_DECIMAL_DIGITS = 2; public InputAmountViewModel() { inputAmountView.setValue("0"); } - private int countDecimalDigits(double number) { - String numberStr = Double.toString(number); - int decimalIndex = numberStr.indexOf('.'); - return decimalIndex >= 0 ? numberStr.length() - decimalIndex - 1 : 0; + private String formatInteger(String value) { + if (TextUtils.isEmpty(value)) return "0"; + double amt = Double.parseDouble(value); + DecimalFormat formatter = new DecimalFormat("#,###"); + return formatter.format(amt); } - - - public NumberKeyboard.KeyClickCallback onKeyClick() { return new NumberKeyboard.KeyClickCallback() { + @Override public void onNumClick(int keyNum) { - if (inputAmountView.getValue().length() == 15) { - return; - } + String current = inputAmountView.getValue(); + if (current == null) return; - if (TextUtils.equals(inputAmountView.getValue(), "0")) { - inputAmountView.setValue(keyNum + ""); - } else if (inputAmountView.getValue().contains(".")) { - StringBuilder inputAmount = new StringBuilder(); - inputAmount.append(inputAmountView.getValue()); + String raw = current.replace(",", ""); - int dotIndex = inputAmount.indexOf("."); + if (raw.contains(".")) { - if(inputAmount.substring(dotIndex).length() > 0 && inputAmount.substring(dotIndex+1).length() == 2) { + String[] parts = raw.split("\\."); + String intPart = parts[0]; + String decimalPart = parts.length > 1 ? parts[1] : ""; + + if (decimalPart.length() >= MAX_DECIMAL_DIGITS) { return; } - if (inputAmountView.getValue().contains(",")) { - inputAmountView.setValue(inputAmountView.getValue().replace(",", "")); - } - double amt = Double.parseDouble(inputAmountView.getValue()); - if (countDecimalDigits(amt) < 2) { - inputAmountView.setValue(inputAmountView.getValue() + keyNum); - } + raw = raw + keyNum; } else { - if (inputAmountView.getValue().contains(",")) { - inputAmountView.setValue(inputAmountView.getValue().replace(",", "")); + + if (raw.length() >= MAX_INT_DIGITS) { + return; } - inputAmountView.setValue(inputAmountView.getValue() + keyNum); - double amt = Double.parseDouble(inputAmountView.getValue()); - DecimalFormat formatter = new DecimalFormat("#,###"); - inputAmountView.setValue(formatter.format(amt)); + + if (TextUtils.equals(raw, "0")) { + raw = String.valueOf(keyNum); + } else { + raw = raw + keyNum; + } + } + + if (raw.contains(".")) { + String[] parts = raw.split("\\."); + String formattedInt = formatInteger(parts[0]); + String decimal = parts.length > 1 ? parts[1] : ""; + inputAmountView.setValue(formattedInt + "." + decimal); + } else { + inputAmountView.setValue(formatInteger(raw)); } } @Override public void onDelClick() { - if (Objects.requireNonNull(inputAmountView.getValue()).contains(".")) { - return; - } - if (inputAmountView.getValue().length() == 15) { - return; - } - if (TextUtils.equals(inputAmountView.getValue(), "0")) { + + String current = inputAmountView.getValue(); + if (current == null) return; + + if (current.contains(".")) return; + + if (TextUtils.equals(current, "0")) { inputAmountView.setValue("0."); } else { - - inputAmountView.setValue(inputAmountView.getValue() + "."); + inputAmountView.setValue(current + "."); } - } @Override public void onCleanClick() { - if (inputAmountView.getValue() != null) { - if (inputAmountView.getValue().contains(".")) { - StringBuilder inputAmount = new StringBuilder(); - inputAmount.append(inputAmountView.getValue()); - inputAmount.deleteCharAt(inputAmount.length() - 1); - inputAmountView.setValue(inputAmount.toString()); - } else if (!inputAmountView.getValue().equals("0")) { - String currentValue = inputAmountView.getValue(); - String rawNumber = currentValue.replace(",", ""); + String current = inputAmountView.getValue(); + if (current == null) return; - if (rawNumber.length() > 1) { - rawNumber = rawNumber.substring(0, rawNumber.length() - 1); + String raw = current.replace(",", ""); - double amt = Double.parseDouble(rawNumber); - DecimalFormat formatter = new DecimalFormat("#,###"); - inputAmountView.setValue(formatter.format(amt)); - } else { - inputAmountView.setValue("0"); - } - } + if (raw.length() <= 1) { + inputAmountView.setValue("0"); + return; + } + + raw = raw.substring(0, raw.length() - 1); + + if (raw.contains(".")) { + String[] parts = raw.split("\\."); + String formattedInt = formatInteger(parts[0]); + String decimal = parts.length > 1 ? parts[1] : ""; + inputAmountView.setValue(formattedInt + "." + decimal); + } else { + inputAmountView.setValue(formatInteger(raw)); } } }; } - - -} +} \ No newline at end of file diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index 31ea53d..cc4b8d0 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -675,8 +675,8 @@ public abstract class EmvBaseViewModel extends BaseViewModel { } else { //contact terminal capability ; if different card brand(depend on aid) have different terminal capability if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000004")) { - emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, new byte[]{(byte) 0xE0, (byte) 0x28, (byte) 0xC8}); - emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x1D}, ByteUtils.hexString2ByteArray("6C00800000000000"));//terminal risk + emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, ByteUtil.hexStr2Bytes(terminalCapability)); + emvHandler.setTlv(new byte[]{(byte) 0xE0, (byte) 0x1D}, ByteUtils.hexString2ByteArray("6C00800000000000"));//terminal risk } } From 620620e1389341846139dba2a1f7e967fbf5c74a Mon Sep 17 00:00:00 2001 From: kizzy Date: Fri, 6 Mar 2026 16:40:43 +0700 Subject: [PATCH 013/101] fixed for magstripe not allowed --- .../kbz/ui/core_ui/CardWaitingFragment.java | 3 +++ .../ui/core_ui/EmvTransactionFragment.java | 20 ++++++++++++++++++- .../EmvTransactionProcessViewModel.java | 3 +++ .../ui/core_viewmodel/SharedViewModel.java | 5 +++++ .../baselib/util/enums/EmvResultStatus.java | 3 ++- .../baselib/viewModel/EmvBaseViewModel.java | 16 ++++++++++----- 6 files changed, 43 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java index 66b3966..c128548 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java @@ -151,6 +151,9 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind }else if(sharedViewModel.getIsSeePhone().getValue() != null && sharedViewModel.getIsSeePhone().getValue()) { cardReadViewModel.setCheckCardAlertMsg("Please Tap!",false); setupCardReadProcess(true); + } else if(sharedViewModel.getIsCardAppBlock().getValue() != null && sharedViewModel.getIsCardAppBlock().getValue()) { + cardReadViewModel.setCheckCardAlertMsg("Magstripe not allowed!",false); + setupCardReadProcess(true); } else { setupCardReadProcess(false); } diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java index d6b9f27..693cc73 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java @@ -249,7 +249,25 @@ public class EmvTransactionFragment extends DataBindingFragment { } }); } - + break; + case CARD_APP_BLOCKED: + if(cardReadViewModel.cardTypeData.getValue()!= null && cardReadViewModel.cardTypeData.getValue() == CardTypeX.IC.value) { + isCardInserted(new CardDetectCallback() { + @Override + public void onComplete() { + sharedViewModel.setIsCardAppBlock(true); + navigateToCheckCard(); + } + }); + } else if(cardReadViewModel.cardTypeData.getValue() != null && cardReadViewModel.cardTypeData.getValue() == CardTypeX.NFC.value) { + isCardTaped("Please try again",new CardDetectCallback() { + @Override + public void onComplete() { + sharedViewModel.setIsCardAppBlock(true); + navigateToCheckCard(); + } + }); + } // sharedViewModel.set_errorFragmentMsg("Interface not found!"); // navigateToError(); break; diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java index f67347e..ef790eb 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java @@ -164,6 +164,9 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements case EMV_TRY_AGAIN: emvResultStatus.postValue(EmvResultStatus.READ_CARD_RETRY); break; + case EMV_CARD_BLOCK: + emvResultStatus.postValue(EmvResultStatus.CARD_APP_BLOCKED); + break; case EMV_CONFIRM_CODE_VERIFY: emvResultStatus.postValue(EmvResultStatus.CONFIRM_CODE_VERIFY); break; diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java index 822858e..64b189f 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java @@ -164,6 +164,7 @@ public class SharedViewModel extends ViewModel { private SingleLiveEvent isFallback = new SingleLiveEvent<>(); private SingleLiveEvent isSeePhone = new SingleLiveEvent<>(); + private SingleLiveEvent isCardAppBlock = new SingleLiveEvent<>(); private SingleLiveEvent _isCardDataExist = new SingleLiveEvent<>(); @@ -233,6 +234,10 @@ public class SharedViewModel extends ViewModel { public SingleLiveEvent getIsFallback() { return isFallback;} + public void setIsCardAppBlock(boolean status) { isCardAppBlock.setValue(status);} + + public SingleLiveEvent getIsCardAppBlock() {return isCardAppBlock;} + public void setIsSeePhone(boolean status) { isSeePhone.setValue(status);} public SingleLiveEvent getIsSeePhone() { return isSeePhone;} diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/util/enums/EmvResultStatus.java b/baselib/src/main/java/com/utsmyanmar/baselib/util/enums/EmvResultStatus.java index beac357..fd9d20c 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/util/enums/EmvResultStatus.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/util/enums/EmvResultStatus.java @@ -30,5 +30,6 @@ public enum EmvResultStatus { CONFIRM_CODE_VERIFY, MPU_CARD, SEE_PHONE, - OTHER_INTERFACE + OTHER_INTERFACE, + CARD_APP_BLOCKED } diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index 31ea53d..aa1bded 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -153,6 +153,8 @@ public abstract class EmvBaseViewModel extends BaseViewModel { protected static final int EMV_ONLINE_PROCESS = 11; protected static final int EMV_ERROR = 12; protected static final int EMV_TRY_AGAIN = 13; + + protected static final int EMV_CARD_BLOCK = 23; protected static final int EMV_CTLS_TRY_AGAIN = 13; protected static final int EMV_CONFIRM_CODE_VERIFY = 14; @@ -674,11 +676,11 @@ public abstract class EmvBaseViewModel extends BaseViewModel { } } else { //contact terminal capability ; if different card brand(depend on aid) have different terminal capability - if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000004")) { - emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, new byte[]{(byte) 0xE0, (byte) 0x28, (byte) 0xC8}); - emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x1D}, ByteUtils.hexString2ByteArray("6C00800000000000"));//terminal risk - - } +// if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000004")) { +// emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, new byte[]{(byte) 0xE0, (byte) 0x28, (byte) 0xC8}); +// emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x1D}, ByteUtils.hexString2ByteArray("6C00800000000000"));//terminal risk +// +// } } emvHandler.onSetTransInitBeforeGPOResponse(true); @@ -825,6 +827,10 @@ public abstract class EmvBaseViewModel extends BaseViewModel { case SdkResult.Emv_Qpboc_Online://EMV Contactless: Online Process for union pay //union pay online contactless--application should go online break; + case SdkResult.Emv_Card_Block: + case SdkResult.Emv_App_Block: + mHandler.sendEmptyMessage(EMV_CARD_BLOCK); + break; case SdkResult.Emv_Candidatelist_Empty:// Application have no aid list case SdkResult.Emv_FallBack:// FallBack ,chip card reset failed From 80a1229d0f635dc2aa0ee724e156f36a810e294b Mon Sep 17 00:00:00 2001 From: kizzy Date: Fri, 6 Mar 2026 16:43:56 +0700 Subject: [PATCH 014/101] fixed for magstripe not allowed and 12 digit pin --- .../core_viewmodel/EmvTransactionProcessViewModel.java | 2 +- .../utsmyanmar/baselib/viewModel/EmvBaseViewModel.java | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java index ef790eb..ceff41c 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java @@ -164,7 +164,7 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements case EMV_TRY_AGAIN: emvResultStatus.postValue(EmvResultStatus.READ_CARD_RETRY); break; - case EMV_CARD_BLOCK: + case EMV_CARD_APP_BLOCK: emvResultStatus.postValue(EmvResultStatus.CARD_APP_BLOCKED); break; case EMV_CONFIRM_CODE_VERIFY: diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index cc4b8d0..6b36192 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -153,6 +153,8 @@ public abstract class EmvBaseViewModel extends BaseViewModel { protected static final int EMV_ONLINE_PROCESS = 11; protected static final int EMV_ERROR = 12; protected static final int EMV_TRY_AGAIN = 13; + + protected static final int EMV_CARD_APP_BLOCK = 23; protected static final int EMV_CTLS_TRY_AGAIN = 13; protected static final int EMV_CONFIRM_CODE_VERIFY = 14; @@ -599,7 +601,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { // customPinPadKeyboard.setKeyBoard(ByteUtil.bytes2HexStr(number)); LogUtil.d(TAG, "PinPad: " + ByteUtil.bytes2HexStr(number)); - int[] supperLen = new int[]{0x00, 0x04, 0x06}; + int[] supperLen = new int[]{0x00, 0x04, 0x06,0x12}; pinPad.setPinKeyboardViewMode(PinKeyboardViewModeEnum.DEFAULT); @@ -826,6 +828,11 @@ public abstract class EmvBaseViewModel extends BaseViewModel { //union pay online contactless--application should go online break; + case SdkResult.Emv_App_Block: + case SdkResult.Emv_Card_Block: + mHandler.sendEmptyMessage(EMV_CARD_APP_BLOCK); + break; + case SdkResult.Emv_Candidatelist_Empty:// Application have no aid list case SdkResult.Emv_FallBack:// FallBack ,chip card reset failed //fallback process From 83bc15a7ab7a07f9775aaa40f73edd901d6ff3c5 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Fri, 6 Mar 2026 23:06:11 +0630 Subject: [PATCH 015/101] pinpad fix --- .../java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index 6b36192..dac35b2 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -601,7 +601,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { // customPinPadKeyboard.setKeyBoard(ByteUtil.bytes2HexStr(number)); LogUtil.d(TAG, "PinPad: " + ByteUtil.bytes2HexStr(number)); - int[] supperLen = new int[]{0x00, 0x04, 0x06,0x12}; + int[] supperLen = new int[]{0x00, 0x04, 0x06, 0x0c}; pinPad.setPinKeyboardViewMode(PinKeyboardViewModeEnum.DEFAULT); From 5ee9745762af8b6f679df60040e9a9824dfb28c1 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Fri, 6 Mar 2026 23:42:24 +0630 Subject: [PATCH 016/101] server address --- app/src/main/java/com/utsmm/kbz/MainActivity.java | 2 +- .../paylibs/utils/core_utils/SystemParamsSettings.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/MainActivity.java b/app/src/main/java/com/utsmm/kbz/MainActivity.java index c20fa1d..390c62f 100644 --- a/app/src/main/java/com/utsmm/kbz/MainActivity.java +++ b/app/src/main/java/com/utsmm/kbz/MainActivity.java @@ -160,7 +160,7 @@ public class MainActivity extends AppCompatActivity implements // SystemParamsOperation.getInstance().setTmsAddress("https://api-tms-uat.kbzbank.com:8443/sirius"); SystemParamsOperation.getInstance().setTmsAddress("https://sirius-nest.utsmyanmar.com"); // SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms-uat.kbzbank.com:8443/receipt"); - SystemParamsOperation.getInstance().setEReceiptAddress("http://receipt-nest.utsmyanmar.com"); + SystemParamsOperation.getInstance().setEReceiptAddress("https://receipt-nest.utsmyanmar.com"); PinPad pinPad = MyApplication.getInstance().deviceEngine.getPinPad(); byte[] encryptedPIK = SystemParamsOperation.getInstance().getPIK(); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java index 229d8de..2531c0e 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java @@ -42,10 +42,10 @@ public class SystemParamsSettings implements Serializable { // private String tmsAddress = "https://tms.smile-mm.com"; // private String tmsAddress = "http://128.199.170.203"; -// private String tmsAddress = "https://sirius-nest.utsmyanmar.com"; - private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius"; //for uat -// private String ereceiptAddress = "https://receipt-nest.utsmyanmar.com"; //for on prime - private String ereceiptAddress = "https://api-tms-uat.kbzbank.com:8443/receipt"; //for uat + private String tmsAddress = "https://sirius-nest.utsmyanmar.com"; +// private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius"; //for uat + private String ereceiptAddress = "https://receipt-nest.utsmyanmar.com"; //for on prime +// private String ereceiptAddress = "https://api-tms-uat.kbzbank.com:8443/receipt"; //for uat private String binValues = ""; From c251583f46a0481e9a4e80e066100615d11783c8 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:16:06 +0630 Subject: [PATCH 017/101] sec host --- .../kbz/ui/settings/HostConfigViewModel.java | 68 +++++- .../com/utsmm/kbz/util/tms/TMSSetupsImpl.java | 198 ++++++++--------- .../main/res/layout/fragment_host_config.xml | 200 ++++++++++++------ .../network/model/sirius/SiriusHost.java | 12 ++ .../paylibs/print/printx/BaseXPrint.java | 45 +++- .../core_utils/SystemParamsOperation.java | 81 ++++++- .../core_utils/SystemParamsSettings.java | 37 ++++ 7 files changed, 465 insertions(+), 176 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java index 18cc318..d690c53 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java @@ -40,6 +40,16 @@ public class HostConfigViewModel extends ViewModel { public MutableLiveData secHostPrimaryPort = new MutableLiveData<>(); public MutableLiveData secHostSecondaryIp = new MutableLiveData<>(); public MutableLiveData secHostSecondaryPort = new MutableLiveData<>(); + public MutableLiveData secHostCurrency = new MutableLiveData<>(); + + // Third Host + public MutableLiveData thirdHostName = new MutableLiveData<>(); + public MutableLiveData thirdHostShortCode = new MutableLiveData<>(); + public MutableLiveData thirdHostPrimaryIp = new MutableLiveData<>(); + public MutableLiveData thirdHostPrimaryPort = new MutableLiveData<>(); + public MutableLiveData thirdHostSecondaryIp = new MutableLiveData<>(); + public MutableLiveData thirdHostSecondaryPort = new MutableLiveData<>(); + public MutableLiveData thirdHostCurrency = new MutableLiveData<>(); public MutableLiveData terminalName = new MutableLiveData<>(); @@ -49,7 +59,7 @@ public class HostConfigViewModel extends ViewModel { merchantName.setValue(sp.getMerchantName()); merchantPhone.setValue(sp.getMerchantPhoneNo()); merchantAddress1.setValue(wrapMerchantAddress(sp.getMerchantAddress())); - terminalName.setValue(sp.getTerminalName()); + terminalName.setValue(wrapTerminalName(sp.getTerminalName())); // PRIMARY HOST hostName.setValue(sp.getHostName()); @@ -64,7 +74,7 @@ public class HostConfigViewModel extends ViewModel { secondaryIp.setValue(sec[0]); secondaryPort.setValue(sec[1]); - currencyCode.setValue(sp.getCurrencyType() != null ? sp.getCurrencyType().toString() : ""); + currencyCode.setValue(normalizeCurrency(sp.getCurrencyType() != null ? sp.getCurrencyType().toString() : "")); if (sp.getSecHostName() != null && !sp.getSecHostName().isEmpty()) { @@ -81,6 +91,46 @@ public class HostConfigViewModel extends ViewModel { String[] shs = split(sp.getSecHostSecIpAddress()); secHostSecondaryIp.setValue(shs[0]); secHostSecondaryPort.setValue(shs[1]); + secHostCurrency.setValue(normalizeCurrency(sp.getSecHostCurrency())); + } + + if (sp.getThirdHostName() != null && !sp.getThirdHostName().isEmpty()) { + thirdHostName.setValue(sp.getThirdHostName()); + thirdHostShortCode.setValue(sp.getThirdHostShortCode()); + + String[] thp = split(sp.getThirdHostIpAddress()); + thirdHostPrimaryIp.setValue(thp[0]); + thirdHostPrimaryPort.setValue(thp[1]); + + String[] ths = split(sp.getThirdHostSecIpAddress()); + thirdHostSecondaryIp.setValue(ths[0]); + thirdHostSecondaryPort.setValue(ths[1]); + thirdHostCurrency.setValue(normalizeCurrency(sp.getThirdHostCurrency())); + } + } + + private String normalizeCurrency(String raw) { + if (TextUtils.isEmpty(raw)) return ""; + String value = raw.trim().toUpperCase(); + switch (value) { + case "104": + case "MMK": + return "MMK"; + case "840": + case "USD": + return "USD"; + case "156": + case "CNY": + case "RMB": + return "CNY"; + case "764": + case "THB": + return "THB"; + case "643": + case "RUB": + return "RUB"; + default: + return value; } } @@ -100,6 +150,20 @@ public class HostConfigViewModel extends ViewModel { return TextUtils.join("\n", lines); } + private String wrapTerminalName(String name) { + if (TextUtils.isEmpty(name)) return ""; + + String formattedName = name + .replace("\\r\\n", "\n") + .replace("\\n", "\n") + .replace("\r\n", "\n") + .trim(); + + List lines = wrapAddressText(formattedName, 29); + + return TextUtils.join("\n", lines); + } + private String[] split(String raw) { if (raw == null || raw.trim().isEmpty()) { return new String[]{"", ""}; diff --git a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java index e3d9e11..d2a8606 100644 --- a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java +++ b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java @@ -103,6 +103,14 @@ public class TMSSetupsImpl implements TMSSetups{ SystemParamsOperation.getInstance().setIpAddress(""); SystemParamsOperation.getInstance().setSecIpAddress(""); + SystemParamsOperation.getInstance().setThirdHostName(""); + SystemParamsOperation.getInstance().setThirdHostTerminalId(""); + SystemParamsOperation.getInstance().setThirdHostMerchantId(""); + SystemParamsOperation.getInstance().setThirdHostIpAddress(""); + SystemParamsOperation.getInstance().setThirdHostSecIpAddress(""); + SystemParamsOperation.getInstance().setThirdHostShortCode(""); + SystemParamsOperation.getInstance().setThirdHostCurrency(""); + SystemParamsOperation.getInstance().setSecHostName(""); SystemParamsOperation.getInstance().setSecHostTerminalId(""); SystemParamsOperation.getInstance().setSecHostMerchantId(""); @@ -187,120 +195,96 @@ public class TMSSetupsImpl implements TMSSetups{ } if(!siriusHosts.isEmpty()) { + SiriusHost qrHost = null; + ArrayList cardHosts = new ArrayList<>(); for (SiriusHost siriusHost: siriusHosts) { - - if( siriusHost.getTyp().equals("QR")) { - - SystemParamsOperation.getInstance().setSecHostId(siriusHost.getId()); - SystemParamsOperation.getInstance().setSecHostName(siriusHost.getName()); - SystemParamsOperation.getInstance().setSecHostTerminalId(siriusHost.getTid()); - SystemParamsOperation.getInstance().setSecHostMerchantId(extractDigits(siriusHost.getMid())); - SystemParamsOperation.getInstance().setShortCode(siriusHost.getShortCode()); - - - if (siriusHost.getPrimaryIP().contains(":")) { - - SystemParamsOperation.getInstance().setSecHostIpAddress(siriusHost.getPrimaryIP().trim()+"/"); - - } else if(siriusHost.getPrimaryIP().trim().isEmpty()) { - SystemParamsOperation.getInstance().setSecHostIpAddress(""); - } - - if (siriusHost.getSecondaryIP().contains(":")) { - - SystemParamsOperation.getInstance().setSecHostSecIpAddress(siriusHost.getSecondaryIP().trim()+"/"); - - } else if(siriusHost.getSecondaryIP().trim().isEmpty()) { - SystemParamsOperation.getInstance().setSecHostSecIpAddress(""); - } - - - - if (!siriusHost.getCurrency().isEmpty()) { - SystemParamsOperation.getInstance().setSecHostCurrency(currencyTextToCode(siriusHost.getCurrency())); -// if(tmsUpdate == TMSUpdate.CHECK){ -// if(SystemParamsOperation.getInstance().getSecHostCurrency() != null) { -// if(!currencyCodeToText(SystemParamsOperation.getInstance().getSecHostCurrency()).equals(siriusHost.getCurrency())) { -// SystemParamsOperation.getInstance().setNeedSettlement(true); -// } else { -//// SystemParamsOperation.getInstance().setCurrencyType(currencyTextToCurrencyType(siriusHost.getCurrency())); -// SystemParamsOperation.getInstance().setSecHostCurrency(currencyTextToCode(siriusHost.getCurrency())); -// } -// } -// -// } else if(tmsUpdate == TMSUpdate.UPDATE){ -// -// SystemParamsOperation.getInstance().setSecHostCurrency(currencyTextToCode(siriusHost.getCurrency())); -// } - } - if (siriusHost.getShortCode() == null || siriusHost.getShortCode().isEmpty()) { - SystemParamsOperation.getInstance().setShortCode(""); - } - + if ("QR".equalsIgnoreCase(siriusHost.getTyp())) { + if (qrHost == null) qrHost = siriusHost; } else { - - SystemParamsOperation.getInstance().setHostName(siriusHost.getName()); - SystemParamsOperation.getInstance().setTerminalId(siriusHost.getTid()); - SystemParamsOperation.getInstance().setMerchantId(siriusHost.getMid()); - - if (siriusHost.getPrimaryIP().contains(":")) { - - SystemParamsOperation.getInstance().setIpAddress(siriusHost.getPrimaryIP().trim()); - - } else if(siriusHost.getPrimaryIP().trim().isEmpty()) { - SystemParamsOperation.getInstance().setIpAddress(""); - } - String secondaryIp = siriusHost.getSecondaryIP(); - if(secondaryIp == null || secondaryIp.trim().isEmpty()){ - SystemParamsOperation.getInstance().setSecIpAddress(""); - }else if(secondaryIp.contains(":")){ - SystemParamsOperation.getInstance().setSecIpAddress(secondaryIp.trim()); - } - -// if (siriusHost.getSecondaryIP().contains(":")) { -// -// SystemParamsOperation.getInstance().setSecIpAddress(siriusHost.getSecondaryIP().trim()); -// -// } else if(siriusHost.getSecondaryIP().trim().isEmpty()){ -// SystemParamsOperation.getInstance().setSecIpAddress(""); -// } - - - if (!siriusHost.getCurrency().isEmpty()) { - SystemParamsOperation.getInstance().setCurrencyType(currencyTextToCurrencyType(siriusHost.getCurrency())); -// if(tmsUpdate == TMSUpdate.CHECK){ -// if(SystemParamsOperation.getInstance().getCurrencyCode() != null) { -// if(!currencyCodeToText(SystemParamsOperation.getInstance().getCurrencyCode()).equals(siriusHost.getCurrency())) { -// SystemParamsOperation.getInstance().setNeedSettlement(true); -// } else { -// -// SystemParamsOperation.getInstance().setCurrencyType(currencyTextToCurrencyType(siriusHost.getCurrency())); -//// SystemParamsOperation.getInstance().setCurrencyCode(currencyTextToCode(siriusHost.getCurrency())); -// } -// } -// -// } else if(tmsUpdate == TMSUpdate.UPDATE){ -// SystemParamsOperation.getInstance().setCurrencyType(currencyTextToCurrencyType(siriusHost.getCurrency())); -//// SystemParamsOperation.getInstance().setCurrencyCode(currencyTextToCode(siriusHost.getCurrency())); -// } - } - - if (siriusHost.getTid().isEmpty() || siriusHost.getMid().isEmpty() ) { - if(siriusHost.getTid().isEmpty()) { - SystemParamsOperation.getInstance().setTerminalId(""); - } - if(siriusHost.getMid().isEmpty()) { - SystemParamsOperation.getInstance().setMerchantId(""); - } - - } - + cardHosts.add(siriusHost); } - } + // For dual-currency card flow, prefer MMK as PRIMARY HOST. + if (cardHosts.size() >= 2) { + SiriusHost first = cardHosts.get(0); + SiriusHost second = cardHosts.get(1); + boolean firstIsMMK = "MMK".equalsIgnoreCase(first.getCurrency()); + boolean secondIsMMK = "MMK".equalsIgnoreCase(second.getCurrency()); + if (!firstIsMMK && secondIsMMK) { + cardHosts.set(0, second); + cardHosts.set(1, first); + } + } + // PRIMARY HOST (Card #1) + if (!cardHosts.isEmpty()) { + SiriusHost primaryCard = cardHosts.get(0); + SystemParamsOperation.getInstance().setHostName(primaryCard.getName() == null ? "" : primaryCard.getName()); + SystemParamsOperation.getInstance().setTerminalId(primaryCard.getTid() == null ? "" : primaryCard.getTid()); + SystemParamsOperation.getInstance().setMerchantId(primaryCard.getMid() == null ? "" : primaryCard.getMid()); + + String primaryIp = primaryCard.getPrimaryIP(); + SystemParamsOperation.getInstance().setIpAddress(primaryIp != null && primaryIp.contains(":") ? primaryIp.trim() : ""); + + String secondaryIp = primaryCard.getSecondaryIP(); + SystemParamsOperation.getInstance().setSecIpAddress(secondaryIp != null && secondaryIp.contains(":") ? secondaryIp.trim() : ""); + + if (!TextUtils.isEmpty(primaryCard.getCurrency())) { + SystemParamsOperation.getInstance().setCurrencyType(currencyTextToCurrencyType(primaryCard.getCurrency())); + } + } + + // SECONDARY HOST (Card #2) + if (cardHosts.size() > 1) { + SiriusHost secondaryCard = cardHosts.get(1); + SystemParamsOperation.getInstance().setThirdHostName(secondaryCard.getName() == null ? "" : secondaryCard.getName()); + SystemParamsOperation.getInstance().setThirdHostTerminalId(secondaryCard.getTid() == null ? "" : secondaryCard.getTid()); + SystemParamsOperation.getInstance().setThirdHostMerchantId(secondaryCard.getMid() == null ? "" : secondaryCard.getMid()); + SystemParamsOperation.getInstance().setThirdHostShortCode(secondaryCard.getShortCode() == null ? "" : secondaryCard.getShortCode()); + + String thirdPrimaryIp = secondaryCard.getPrimaryIP(); + SystemParamsOperation.getInstance().setThirdHostIpAddress(thirdPrimaryIp != null && thirdPrimaryIp.contains(":") ? thirdPrimaryIp.trim() : ""); + + String thirdSecondaryIp = secondaryCard.getSecondaryIP(); + SystemParamsOperation.getInstance().setThirdHostSecIpAddress(thirdSecondaryIp != null && thirdSecondaryIp.contains(":") ? thirdSecondaryIp.trim() : ""); + + if (!TextUtils.isEmpty(secondaryCard.getCurrency())) { + SystemParamsOperation.getInstance().setThirdHostCurrency(currencyTextToCode(secondaryCard.getCurrency())); + } + } + + // QR HOST + if (qrHost != null) { + SystemParamsOperation.getInstance().setSecHostId(qrHost.getId()); + SystemParamsOperation.getInstance().setSecHostName(qrHost.getName()); + SystemParamsOperation.getInstance().setSecHostTerminalId(qrHost.getTid() == null ? "" : qrHost.getTid()); + SystemParamsOperation.getInstance().setSecHostMerchantId(qrHost.getMid() == null ? "" : extractDigits(qrHost.getMid())); + SystemParamsOperation.getInstance().setShortCode(qrHost.getShortCode()); + + String qrPrimaryIp = qrHost.getPrimaryIP(); + if (qrPrimaryIp != null && qrPrimaryIp.contains(":")) { + SystemParamsOperation.getInstance().setSecHostIpAddress(qrPrimaryIp.trim()+"/"); + } else { + SystemParamsOperation.getInstance().setSecHostIpAddress(""); + } + + String qrSecondaryIp = qrHost.getSecondaryIP(); + if (qrSecondaryIp != null && qrSecondaryIp.contains(":")) { + SystemParamsOperation.getInstance().setSecHostSecIpAddress(qrSecondaryIp.trim()+"/"); + } else { + SystemParamsOperation.getInstance().setSecHostSecIpAddress(""); + } + + if (!TextUtils.isEmpty(qrHost.getCurrency())) { + SystemParamsOperation.getInstance().setSecHostCurrency(currencyTextToCode(qrHost.getCurrency())); + } + + if (qrHost.getShortCode() == null || qrHost.getShortCode().isEmpty()) { + SystemParamsOperation.getInstance().setShortCode(""); + } + } } diff --git a/app/src/main/res/layout/fragment_host_config.xml b/app/src/main/res/layout/fragment_host_config.xml index d9c26d1..6f5a56c 100644 --- a/app/src/main/res/layout/fragment_host_config.xml +++ b/app/src/main/res/layout/fragment_host_config.xml @@ -96,65 +96,73 @@ android:layout_width="match_parent"/> - - - + android:orientation="vertical" + android:visibility='@{!TextUtils.isEmpty(viewModel.hostName) ? View.VISIBLE : View.GONE}' + tools:visibility="visible"> - - - - + - - - - + - - - - + + + + - - - - - - - - + + + + - - - - + + + + - - - - + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + android:visibility='@{!TextUtils.isEmpty(viewModel.thirdHostName) ? View.VISIBLE : View.GONE}' + tools:visibility="gone"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + + android:text='@{": " + viewModel.secHostCurrency}'/> diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/network/model/sirius/SiriusHost.java b/baselib/src/main/java/com/utsmyanmar/baselib/network/model/sirius/SiriusHost.java index cca6cb1..89d1a7e 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/network/model/sirius/SiriusHost.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/network/model/sirius/SiriusHost.java @@ -1,5 +1,7 @@ package com.utsmyanmar.baselib.network.model.sirius; +import com.google.gson.annotations.SerializedName; + public class SiriusHost { private String id; @@ -9,6 +11,8 @@ public class SiriusHost { private String primaryIP; private String secondaryIP; + @SerializedName(value = "thirdIP", alternate = {"thirdIp", "tertiaryIP", "tertiaryIp"}) + private String thirdIP; private String currency; @@ -53,6 +57,10 @@ public class SiriusHost { this.secondaryIP = secondaryIP; } + public void setThirdIP(String thirdIP) { + this.thirdIP = thirdIP; + } + public void setCurrency(String currency) { this.currency = currency; } @@ -89,6 +97,10 @@ public class SiriusHost { return secondaryIP; } + public String getThirdIP() { + return thirdIP; + } + public String getCurrency() { return currency; } diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index 1450ed6..c3abb26 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -1068,15 +1068,28 @@ public abstract class BaseXPrint { receiptHeader = SystemParamsOperation.getInstance().getReceiptHeader(); merchantAddress = SystemParamsOperation.getInstance().getMerchantAddress(); - if(merchantAddress != null){ - //this step is needed for manually line break with \n in the Address - merchantAddress = merchantAddress.replace("\\n", "\n"); + if (merchantAddress != null) { + // Support manual line breaks entered as escaped/newline sequences. + merchantAddress = merchantAddress + .replace("\\r\\n", "\n") + .replace("\\n", "\n") + .replace("\r\n", "\n"); } terminalName = SystemParamsOperation.getInstance().getTerminalName(); + if (terminalName != null) { + // Keep behavior aligned with address wrapping for printed slips. + terminalName = terminalName + .replace("\\r\\n", "\n") + .replace("\\n", "\n") + .replace("\r\n", "\n"); + } assert merchantAddress != null; List result = wrapAddressText(merchantAddress, 29); + List terminalLines = TextUtils.isEmpty(terminalName) + ? new ArrayList<>() + : wrapAddressText(terminalName.trim(), 29); if (receiptHeader == null || TextUtils.equals(receiptHeader, "") || receiptHeader.trim().isEmpty()) { receiptHeader = merchantName; @@ -1084,11 +1097,13 @@ public abstract class BaseXPrint { if (TextUtils.equals(merchantAddress, "")) { merchantAddress = ""; } - if(TextUtils.equals(terminalName, "") || terminalName == null){ + if (TextUtils.equals(terminalName, "") || terminalName == null) { terminalName = ""; } - printer.appendPrnStr(terminalName, fontNormal, AlignEnum.CENTER, true); + for (String line : terminalLines) { + printer.appendPrnStr(line, fontNormal, AlignEnum.CENTER, true); + } for (String line : result) { //result get the List of text from auto/manually break the address @@ -1315,7 +1330,7 @@ public abstract class BaseXPrint { dotBreak(); // ---------- SECONDARY HOST (optional) ---------- if (!TextUtils.isEmpty(sp.getSecHostName())) { - printer.appendPrnStr("SECONDARY HOST", fontNormal, AlignEnum.LEFT, true); + printer.appendPrnStr("QR HOST", fontNormal, AlignEnum.LEFT, true); printer.appendPrnStr("Name : " + sp.getSecHostName(), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("SHORT CODE : " + sp.getShortCode(), fontNormal, AlignEnum.LEFT, false); String[] secHostIp = splitIpAndPort(sp.getSecHostIpAddress()); @@ -1324,10 +1339,26 @@ public abstract class BaseXPrint { String[] secHostSecIp = splitIpAndPort(sp.getSecHostSecIpAddress()); printer.appendPrnStr("Secondary Ip : " + secHostSecIp[0], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Secondary Port: " + secHostSecIp[1], fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("Currency Code : " + sp.getCurrencyType(), fontNormal, AlignEnum.LEFT, false); + String qrHostCurrency = TextUtils.isEmpty(sp.getSecHostCurrency()) ? String.valueOf(sp.getCurrencyType()) : sp.getSecHostCurrency(); + printer.appendPrnStr("Currency Code : " + qrHostCurrency, fontNormal, AlignEnum.LEFT, false); dotBreak(); printer.appendPrnStr("App Version : " + getAppVersion(), fontNormal, AlignEnum.LEFT, false); } + + // ---------- THIRD HOST (optional) ---------- + if (!TextUtils.isEmpty(sp.getThirdHostName())) { + printer.appendPrnStr("SECONDARY HOST", fontNormal, AlignEnum.LEFT, true); + printer.appendPrnStr("Name : " + sp.getThirdHostName(), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("SHORT CODE : " + sp.getThirdHostShortCode(), fontNormal, AlignEnum.LEFT, false); + String[] thirdHostIp = splitIpAndPort(sp.getThirdHostIpAddress()); + printer.appendPrnStr("Primary Ip : " + thirdHostIp[0], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Primary Port : " + thirdHostIp[1], fontNormal, AlignEnum.LEFT, false); + String[] thirdHostSecIp = splitIpAndPort(sp.getThirdHostSecIpAddress()); + printer.appendPrnStr("Secondary Ip : " + thirdHostSecIp[0], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Secondary Port: " + thirdHostSecIp[1], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Currency Code : " + sp.getThirdHostCurrency(), fontNormal, AlignEnum.LEFT, false); + dotBreak(); + } } private String getAppVersion() { diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java index 89b2073..6112ccf 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java @@ -1014,6 +1014,7 @@ public class SystemParamsOperation { saveSystemParamsSettings(params); } + public void setTmsAddress(String tmsAddress){ SystemParamsSettings params = getSystemParamsSettings(); params.setTmsAddress(tmsAddress); @@ -1036,6 +1037,7 @@ public class SystemParamsOperation { return params.getSecIpAddress(); } + public int getPortAddress(){ SystemParamsSettings params = getSystemParamsSettings(); return params.getPortAddress(); @@ -1344,22 +1346,44 @@ public class SystemParamsOperation { saveSystemParamsSettings(params); } + public void setThirdHostName(String hostName) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostName(hostName); + saveSystemParamsSettings(params); + } + public String getSecHostName() { SystemParamsSettings params = getSystemParamsSettings(); return params.getSecHostName(); } + public String getThirdHostName() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostName(); + } + public void setSecHostIpAddress(String ipAddress) { SystemParamsSettings params = getSystemParamsSettings(); params.setSecHostIpAddress(ipAddress); saveSystemParamsSettings(params); } + public void setThirdHostIpAddress(String ipAddress) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostIpAddress(ipAddress); + saveSystemParamsSettings(params); + } + public String getSecHostIpAddress() { SystemParamsSettings params = getSystemParamsSettings(); return params.getSecHostIpAddress(); } + public String getThirdHostIpAddress() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostIpAddress(); + } + public void setTokenHostAddress(String tokenHostAddress) { SystemParamsSettings params = getSystemParamsSettings(); params.setTokenHostAddress(tokenHostAddress); @@ -1387,39 +1411,78 @@ public class SystemParamsOperation { saveSystemParamsSettings(params); } + public void setThirdHostSecIpAddress(String ipAddress) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostSecIpAddress(ipAddress); + saveSystemParamsSettings(params); + } + public String getSecHostSecIpAddress() { SystemParamsSettings params = getSystemParamsSettings(); return params.getSecHostSecIpAddress(); } + public String getThirdHostSecIpAddress() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostSecIpAddress(); + } + public void setSecHostTerminalId(String terminalId) { SystemParamsSettings params = getSystemParamsSettings(); params.setSecHostTerminalId(terminalId); saveSystemParamsSettings(params); } + public void setThirdHostTerminalId(String terminalId) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostTerminalId(terminalId); + saveSystemParamsSettings(params); + } + public String getSecHostTerminalId() { SystemParamsSettings params = getSystemParamsSettings(); return params.getSecHostTerminalId(); } + public String getThirdHostTerminalId() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostTerminalId(); + } + public void setSecHostMerchantId(String merchantId) { SystemParamsSettings params = getSystemParamsSettings(); params.setSecHostMerchantId(merchantId); saveSystemParamsSettings(params); } + public void setThirdHostMerchantId(String merchantId) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostMerchantId(merchantId); + saveSystemParamsSettings(params); + } + public void setShortCode(String shortCode) { SystemParamsSettings params = getSystemParamsSettings(); params.setShortCode(shortCode); saveSystemParamsSettings(params); } + public void setThirdHostShortCode(String shortCode) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostShortCode(shortCode); + saveSystemParamsSettings(params); + } + public String getShortCode() { SystemParamsSettings params = getSystemParamsSettings(); return params.getShortCode(); } + public String getThirdHostShortCode() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostShortCode(); + } + public void setBinValue(String value) { SystemParamsSettings params = getSystemParamsSettings(); params.setBinValues(value); @@ -1437,6 +1500,11 @@ public class SystemParamsOperation { return params.getSecHostMerchantId(); } + public String getThirdHostMerchantId() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostMerchantId(); + } + public void setLastSuccessTrnx(String lastSuccessTrnx) { SystemParamsSettings params = getSystemParamsSettings(); params.setLastSuccessTranx(lastSuccessTrnx); @@ -1454,11 +1522,22 @@ public class SystemParamsOperation { saveSystemParamsSettings(params); } + public void setThirdHostCurrency(String currency) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostCurrency(currency); + saveSystemParamsSettings(params); + } + public String getSecHostCurrency() { SystemParamsSettings params = getSystemParamsSettings(); return params.getSecHostCurrency(); } + public String getThirdHostCurrency() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostCurrency(); + } + public String getCurrentSerialNum() { SystemParamsSettings params = getSystemParamsSettings(); return params.getCurrentSerialNum(); @@ -1761,4 +1840,4 @@ public class SystemParamsOperation { SystemParamsSettings paramsSettings = getSystemParamsSettings(); return paramsSettings.getPrinterEnabled(); } -} \ No newline at end of file +} diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java index 2531c0e..9e3e39e 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java @@ -102,22 +102,29 @@ public class SystemParamsSettings implements Serializable { private String secHostId = ""; private String secHostName = ""; + private String thirdHostName = ""; private String secHostIpAddress = ""; + private String thirdHostIpAddress = ""; private String tokenHostAddress = ""; private String grantType = ""; private String secHostSecIpAddress = ""; + private String thirdHostSecIpAddress = ""; private String secHostTerminalId = ""; + private String thirdHostTerminalId = ""; private String secHostMerchantId = ""; + private String thirdHostMerchantId = ""; private String shortCode = ""; + private String thirdHostShortCode = ""; private String secHostCurrency = ""; + private String thirdHostCurrency = ""; private String disabledMessage = ""; @@ -278,26 +285,38 @@ public class SystemParamsSettings implements Serializable { return secHostName; } + protected String getThirdHostName() { return thirdHostName; } + protected String getSecHostIpAddress() { return secHostIpAddress; } + protected String getThirdHostIpAddress() { return thirdHostIpAddress; } + protected String getSecHostSecIpAddress() { return secHostSecIpAddress; } + protected String getThirdHostSecIpAddress() { return thirdHostSecIpAddress; } + protected String getSecHostTerminalId() { return secHostTerminalId; } + protected String getThirdHostTerminalId() { return thirdHostTerminalId; } + protected String getSecHostMerchantId() { return secHostMerchantId; } + protected String getThirdHostMerchantId() { return thirdHostMerchantId; } + protected String getSecHostCurrency() { return secHostCurrency; } + protected String getThirdHostCurrency() { return thirdHostCurrency; } + protected String getAuthToken() { return authToken;} protected String getEreceiptAddress() { return ereceiptAddress; } @@ -323,10 +342,14 @@ public class SystemParamsSettings implements Serializable { this.secHostName = secHostName; } + protected void setThirdHostName(String thirdHostName) { this.thirdHostName = thirdHostName; } + protected void setSecHostIpAddress(String secHostIpAddress) { this.secHostIpAddress = secHostIpAddress; } + protected void setThirdHostIpAddress(String thirdHostIpAddress) { this.thirdHostIpAddress = thirdHostIpAddress; } + protected void setBinValues(String binValues) { this.binValues = binValues; } @@ -379,10 +402,14 @@ public class SystemParamsSettings implements Serializable { this.shortCode = shortCode; } + protected void setThirdHostShortCode(String thirdHostShortCode) { this.thirdHostShortCode = thirdHostShortCode; } + protected String getShortCode() { return this.shortCode; } + protected String getThirdHostShortCode() { return this.thirdHostShortCode; } + protected long getuPiCvMLimit() { return this.uPiCvMLimit; } @@ -415,10 +442,14 @@ public class SystemParamsSettings implements Serializable { this.secHostSecIpAddress = secHostSecIpAddress; } + protected void setThirdHostSecIpAddress(String thirdHostSecIpAddress) { this.thirdHostSecIpAddress = thirdHostSecIpAddress; } + protected void setSecHostTerminalId(String secHostTerminalId) { this.secHostTerminalId = secHostTerminalId; } + protected void setThirdHostTerminalId(String thirdHostTerminalId) { this.thirdHostTerminalId = thirdHostTerminalId; } + protected void setLastSuccessTranx(String lastSuccessTranx) { this.lastSuccessTranx = lastSuccessTranx; } @@ -431,10 +462,14 @@ public class SystemParamsSettings implements Serializable { this.secHostMerchantId = secHostMerchantId; } + protected void setThirdHostMerchantId(String thirdHostMerchantId) { this.thirdHostMerchantId = thirdHostMerchantId; } + protected void setSecHostCurrency(String secHostCurrency) { this.secHostCurrency = secHostCurrency; } + protected void setThirdHostCurrency(String thirdHostCurrency) { this.thirdHostCurrency = thirdHostCurrency; } + protected void setNeedSettlement(boolean needSettlement) { this.isNeedSettlement = needSettlement; } @@ -670,6 +705,7 @@ public class SystemParamsSettings implements Serializable { protected void setSecIpAddress(String secIpAddress){ this.secIpAddress = secIpAddress;} + protected void setHostReadTimeout(String hostReadTimeout){ this.hostReadTimeout = hostReadTimeout;} protected void setReversalDelay(String reversalDelay) { this.reversalDelay = reversalDelay; } @@ -684,6 +720,7 @@ public class SystemParamsSettings implements Serializable { protected String getSecIpAddress(){ return secIpAddress;} + protected String getComp1() { return comp1; } From df025bce3429faffb5857c48520908951d0b18ef Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:33:40 +0630 Subject: [PATCH 018/101] duel currency select in sale --- .../main/java/com/utsmm/kbz/MainFragment.java | 220 ++++++++++++++++- .../ui/dashboard/DashboardTransFragment.java | 222 +++++++++++++++++- 2 files changed, 426 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/MainFragment.java b/app/src/main/java/com/utsmm/kbz/MainFragment.java index 1d0b7d9..09462d7 100644 --- a/app/src/main/java/com/utsmm/kbz/MainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/MainFragment.java @@ -4,18 +4,25 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; +import androidx.appcompat.app.AlertDialog; import android.os.RemoteException; import android.text.TextUtils; import android.util.Log; +import android.util.TypedValue; import android.view.View; +import android.view.Gravity; import android.widget.Toast; +import android.widget.LinearLayout; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.Observer; +import androidx.appcompat.widget.AppCompatButton; +import androidx.core.content.ContextCompat; import com.denzcoskun.imageslider.ImageSlider; import com.denzcoskun.imageslider.constants.ScaleTypes; @@ -68,6 +75,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Date; +import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -97,6 +105,13 @@ public class MainFragment extends DataBindingFragment { private final ArrayList imgList = new ArrayList<>(); private Observer observeLastTrans; private PayDetail lastPay; + private boolean cardPrimaryHostCached = false; + private String cardPrimaryHostName = ""; + private String cardPrimaryTid = ""; + private String cardPrimaryMid = ""; + private String cardPrimaryIp = ""; + private String cardPrimarySecIp = ""; + private CurrencyType cardPrimaryCurrency = CurrencyType.MMK; @Inject EmvParamOperation emvParamOperation; @@ -420,6 +435,200 @@ public class MainFragment extends DataBindingFragment { } + private void startCardSaleFlow() { + processBatch(); + sharedViewModel.transactionsType.setValue(TransactionsType.SALE); + sharedViewModel.setTransMenu(TransMenu.SALE); + sharedViewModel.processCode.postValue(ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT); + navigateToAmount(); + } + + private void showCurrencyChooserForCardSale() { + List currencies = getAvailableCardSaleCurrencies(); + if (currencies.isEmpty()) { + applyCardCurrencyAndHost("MMK"); + startCardSaleFlow(); + return; + } + + if (currencies.size() == 1) { + applyCardCurrencyAndHost(currencies.get(0)); + startCardSaleFlow(); + return; + } + + showCurrencyPickerDialog("Choose Currency", currencies, currency -> { + applyCardCurrencyAndHost(currency); + startCardSaleFlow(); + }); + } + + private List getAvailableCardSaleCurrencies() { + cachePrimaryCardHostIfNeeded(); + LinkedHashSet values = new LinkedHashSet<>(); + + if (cardPrimaryCurrency != null && !TextUtils.isEmpty(cardPrimaryCurrency.name)) { + values.add(normalizeCurrency(cardPrimaryCurrency.name)); + } + + String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency()); + if (!TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName()) && !TextUtils.isEmpty(secondaryCurrency)) { + values.add(secondaryCurrency); + } + + return new ArrayList<>(values); + } + + private void applyCardCurrencyAndHost(String selectedCurrency) { + cachePrimaryCardHostIfNeeded(); + + String selected = normalizeCurrency(selectedCurrency); + String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency()); + + boolean useSecondaryCardHost = !TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName()) + && !TextUtils.isEmpty(secondaryCurrency) + && secondaryCurrency.equals(selected); + + if (useSecondaryCardHost) { + SystemParamsOperation.getInstance().setHostName(SystemParamsOperation.getInstance().getThirdHostName()); + SystemParamsOperation.getInstance().setTerminalId(SystemParamsOperation.getInstance().getThirdHostTerminalId()); + SystemParamsOperation.getInstance().setMerchantId(SystemParamsOperation.getInstance().getThirdHostMerchantId()); + SystemParamsOperation.getInstance().setIpAddress(SystemParamsOperation.getInstance().getThirdHostIpAddress()); + SystemParamsOperation.getInstance().setSecIpAddress(SystemParamsOperation.getInstance().getThirdHostSecIpAddress()); + } else { + SystemParamsOperation.getInstance().setHostName(cardPrimaryHostName); + SystemParamsOperation.getInstance().setTerminalId(cardPrimaryTid); + SystemParamsOperation.getInstance().setMerchantId(cardPrimaryMid); + SystemParamsOperation.getInstance().setIpAddress(cardPrimaryIp); + SystemParamsOperation.getInstance().setSecIpAddress(cardPrimarySecIp); + } + + CurrencyType currencyType = useSecondaryCardHost ? toCurrencyType(selected) : cardPrimaryCurrency; + SystemParamsOperation.getInstance().setCurrencyType(currencyType); + sharedViewModel.set_currencyText(currencyType.name); + } + + private void cachePrimaryCardHostIfNeeded() { + if (cardPrimaryHostCached) { + return; + } + + cardPrimaryHostName = SystemParamsOperation.getInstance().getHostName(); + cardPrimaryTid = SystemParamsOperation.getInstance().getTerminalId(); + cardPrimaryMid = SystemParamsOperation.getInstance().getMerchantId(); + cardPrimaryIp = SystemParamsOperation.getInstance().getIpAddress(); + cardPrimarySecIp = SystemParamsOperation.getInstance().getSecIpAddress(); + CurrencyType activeCurrency = SystemParamsOperation.getInstance().getCurrencyType(); + cardPrimaryCurrency = activeCurrency == null ? CurrencyType.MMK : activeCurrency; + cardPrimaryHostCached = true; + } + + private void showCurrencyPickerDialog(String title, List currencies, CurrencySelectCallback callback) { + LinearLayout root = new LinearLayout(requireContext()); + root.setOrientation(LinearLayout.VERTICAL); + root.setPadding(dp(20), dp(20), dp(20), dp(12)); + + TextView tvTitle = new TextView(requireContext()); + tvTitle.setText(title); + tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + tvTitle.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorTextTitle)); + tvTitle.setPadding(0, 0, 0, dp(16)); + root.addView(tvTitle); + + final AlertDialog[] dialogHolder = new AlertDialog[1]; + for (String currency : currencies) { + AppCompatButton button = new AppCompatButton(requireContext()); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + dp(56) + ); + lp.bottomMargin = dp(10); + button.setLayoutParams(lp); + button.setAllCaps(false); + button.setText(currency); + button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); + button.setGravity(Gravity.CENTER); + button.setBackgroundResource(R.drawable.bg_rounded_btn_cv); + button.setTextColor(ContextCompat.getColor(requireContext(), R.color.white)); + button.setOnClickListener(v -> { + if (dialogHolder[0] != null) { + dialogHolder[0].dismiss(); + } + callback.onSelected(currency); + }); + root.addView(button); + } + + AppCompatButton cancel = new AppCompatButton(requireContext()); + LinearLayout.LayoutParams cancelLp = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + dp(52) + ); + cancel.setLayoutParams(cancelLp); + cancel.setAllCaps(false); + cancel.setText("Cancel"); + cancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); + cancel.setBackgroundResource(R.drawable.bg_rounded_btn_cancel_cv); + cancel.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)); + cancel.setOnClickListener(v -> { + if (dialogHolder[0] != null) { + dialogHolder[0].dismiss(); + } + }); + root.addView(cancel); + + AlertDialog dialog = new AlertDialog.Builder(requireContext()) + .setView(root) + .create(); + dialogHolder[0] = dialog; + dialog.show(); + } + + private int dp(int value) { + return Math.round(value * requireContext().getResources().getDisplayMetrics().density); + } + + private interface CurrencySelectCallback { + void onSelected(String currency); + } + + private CurrencyType toCurrencyType(String value) { + String normalized = normalizeCurrency(value); + try { + return CurrencyType.valueOf(normalized); + } catch (Exception ignored) { + return CurrencyType.MMK; + } + } + + private String normalizeCurrency(String raw) { + if (TextUtils.isEmpty(raw)) { + return ""; + } + + String value = raw.trim().toUpperCase(); + switch (value) { + case "104": + case "MMK": + return "MMK"; + case "840": + case "USD": + return "USD"; + case "156": + case "CNY": + case "RMB": + return "CNY"; + case "764": + case "THB": + return "THB"; + case "643": + case "RUB": + return "RUB"; + default: + return value; + } + } + private void processBatch() { calculateLastTransaction(); @@ -722,18 +931,11 @@ public class MainFragment extends DataBindingFragment { showSingleInfoDialog(getResourceString(R.string.txt_please_enable_internet)); } else if (SystemParamsOperation.getInstance().isNeedSettlement()) { AlertXDialog.getInstance().showDialog(requireContext(), getResourceString(R.string.title_need_settle), getResourceString(R.string.txt_do_you_want_to_continue), () -> { - processBatch(); - sharedViewModel.transactionsType.setValue(TransactionsType.SALE); - sharedViewModel.processCode.postValue(ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT); - navigateToAmount(); + showCurrencyChooserForCardSale(); }); } else { - processBatch(); - sharedViewModel.transactionsType.setValue(TransactionsType.SALE); - sharedViewModel.setTransMenu(TransMenu.SALE); - sharedViewModel.processCode.postValue(ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT); - navigateToAmount(); + showCurrencyChooserForCardSale(); } } diff --git a/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java b/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java index 62e3e3f..89b1983 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java @@ -2,16 +2,25 @@ package com.utsmm.kbz.ui.dashboard; import android.os.Bundle; +import android.text.TextUtils; +import android.util.TypedValue; import android.view.View; +import android.view.Gravity; +import android.widget.LinearLayout; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.AppCompatButton; +import androidx.core.content.ContextCompat; import com.utsmm.kbz.util.enums.SettlementType; import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; +import com.utsmyanmar.paylibs.utils.enums.CurrencyType; import com.utsmyanmar.paylibs.utils.enums.TransMenu; import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType; import com.utsmm.kbz.BR; @@ -24,6 +33,8 @@ import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel; import com.utsmm.kbz.util.tms.TMSUtil; import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; public class DashboardTransFragment extends DataBindingFragment { @@ -34,6 +45,13 @@ public class DashboardTransFragment extends DataBindingFragment { private ArrayList featuresList = new ArrayList<>(); MainAdapter mainAdapter; + private boolean cardPrimaryHostCached = false; + private String cardPrimaryHostName = ""; + private String cardPrimaryTid = ""; + private String cardPrimaryMid = ""; + private String cardPrimaryIp = ""; + private String cardPrimarySecIp = ""; + private CurrencyType cardPrimaryCurrency = CurrencyType.MMK; private static final int hostId = Constants.NAV_HOST_ID; private int routeId; @@ -220,9 +238,11 @@ public class DashboardTransFragment extends DataBindingFragment { } else if (checkTid()) { showDeclineDialog("Please Download Config!"); } else { - sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_SALE); - routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; - safeRouteTo(currentId,routeId,hostId); + showCurrencyChooserForCardFlow(() -> { + sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_SALE); + routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; + safeRouteTo(currentId, routeId, hostId); + }); } } @@ -253,10 +273,12 @@ public class DashboardTransFragment extends DataBindingFragment { public void onClickCashAdvance() { - sharedViewModel.setTransactionsType(TransactionsType.CASH_OUT); - sharedViewModel.setTransMenu(TransMenu.CASH_OUT); - routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; - safeRouteTo(currentId,routeId,hostId); + showCurrencyChooserForCardFlow(() -> { + sharedViewModel.setTransactionsType(TransactionsType.CASH_OUT); + sharedViewModel.setTransMenu(TransMenu.CASH_OUT); + routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; + safeRouteTo(currentId, routeId, hostId); + }); } public void onClickDeviceConfig(){ @@ -265,4 +287,190 @@ public class DashboardTransFragment extends DataBindingFragment { } } + private void showCurrencyChooserForCardFlow(Runnable onSelected) { + List currencies = getAvailableCardSaleCurrencies(); + if (currencies.isEmpty()) { + applyCardCurrencyAndHost("MMK"); + onSelected.run(); + return; + } + + if (currencies.size() == 1) { + applyCardCurrencyAndHost(currencies.get(0)); + onSelected.run(); + return; + } + + showCurrencyPickerDialog("Choose Currency", currencies, currency -> { + applyCardCurrencyAndHost(currency); + onSelected.run(); + }); + } + + private List getAvailableCardSaleCurrencies() { + cachePrimaryCardHostIfNeeded(); + LinkedHashSet values = new LinkedHashSet<>(); + + if (cardPrimaryCurrency != null && !TextUtils.isEmpty(cardPrimaryCurrency.name)) { + values.add(normalizeCurrency(cardPrimaryCurrency.name)); + } + + String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency()); + if (!TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName()) && !TextUtils.isEmpty(secondaryCurrency)) { + values.add(secondaryCurrency); + } + + return new ArrayList<>(values); + } + + private void applyCardCurrencyAndHost(String selectedCurrency) { + cachePrimaryCardHostIfNeeded(); + + String selected = normalizeCurrency(selectedCurrency); + String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency()); + + boolean useSecondaryCardHost = !TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName()) + && !TextUtils.isEmpty(secondaryCurrency) + && secondaryCurrency.equals(selected); + + if (useSecondaryCardHost) { + SystemParamsOperation.getInstance().setHostName(SystemParamsOperation.getInstance().getThirdHostName()); + SystemParamsOperation.getInstance().setTerminalId(SystemParamsOperation.getInstance().getThirdHostTerminalId()); + SystemParamsOperation.getInstance().setMerchantId(SystemParamsOperation.getInstance().getThirdHostMerchantId()); + SystemParamsOperation.getInstance().setIpAddress(SystemParamsOperation.getInstance().getThirdHostIpAddress()); + SystemParamsOperation.getInstance().setSecIpAddress(SystemParamsOperation.getInstance().getThirdHostSecIpAddress()); + } else { + SystemParamsOperation.getInstance().setHostName(cardPrimaryHostName); + SystemParamsOperation.getInstance().setTerminalId(cardPrimaryTid); + SystemParamsOperation.getInstance().setMerchantId(cardPrimaryMid); + SystemParamsOperation.getInstance().setIpAddress(cardPrimaryIp); + SystemParamsOperation.getInstance().setSecIpAddress(cardPrimarySecIp); + } + + CurrencyType currencyType = useSecondaryCardHost ? toCurrencyType(selected) : cardPrimaryCurrency; + SystemParamsOperation.getInstance().setCurrencyType(currencyType); + sharedViewModel.set_currencyText(currencyType.name); + } + + private void cachePrimaryCardHostIfNeeded() { + if (cardPrimaryHostCached) { + return; + } + + cardPrimaryHostName = SystemParamsOperation.getInstance().getHostName(); + cardPrimaryTid = SystemParamsOperation.getInstance().getTerminalId(); + cardPrimaryMid = SystemParamsOperation.getInstance().getMerchantId(); + cardPrimaryIp = SystemParamsOperation.getInstance().getIpAddress(); + cardPrimarySecIp = SystemParamsOperation.getInstance().getSecIpAddress(); + CurrencyType activeCurrency = SystemParamsOperation.getInstance().getCurrencyType(); + cardPrimaryCurrency = activeCurrency == null ? CurrencyType.MMK : activeCurrency; + cardPrimaryHostCached = true; + } + + private CurrencyType toCurrencyType(String value) { + String normalized = normalizeCurrency(value); + try { + return CurrencyType.valueOf(normalized); + } catch (Exception ignored) { + return CurrencyType.MMK; + } + } + + private String normalizeCurrency(String raw) { + if (TextUtils.isEmpty(raw)) { + return ""; + } + + String value = raw.trim().toUpperCase(); + switch (value) { + case "104": + case "MMK": + return "MMK"; + case "840": + case "USD": + return "USD"; + case "156": + case "CNY": + case "RMB": + return "CNY"; + case "764": + case "THB": + return "THB"; + case "643": + case "RUB": + return "RUB"; + default: + return value; + } + } + + private void showCurrencyPickerDialog(String title, List currencies, CurrencySelectCallback callback) { + LinearLayout root = new LinearLayout(requireContext()); + root.setOrientation(LinearLayout.VERTICAL); + root.setPadding(dp(20), dp(20), dp(20), dp(12)); + + TextView tvTitle = new TextView(requireContext()); + tvTitle.setText(title); + tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + tvTitle.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorTextTitle)); + tvTitle.setPadding(0, 0, 0, dp(16)); + root.addView(tvTitle); + + final AlertDialog[] dialogHolder = new AlertDialog[1]; + for (String currency : currencies) { + AppCompatButton button = new AppCompatButton(requireContext()); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + dp(56) + ); + lp.bottomMargin = dp(10); + button.setLayoutParams(lp); + button.setAllCaps(false); + button.setText(currency); + button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); + button.setGravity(Gravity.CENTER); + button.setBackgroundResource(R.drawable.bg_rounded_btn_cv); + button.setTextColor(ContextCompat.getColor(requireContext(), R.color.white)); + button.setOnClickListener(v -> { + if (dialogHolder[0] != null) { + dialogHolder[0].dismiss(); + } + callback.onSelected(currency); + }); + root.addView(button); + } + + AppCompatButton cancel = new AppCompatButton(requireContext()); + LinearLayout.LayoutParams cancelLp = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + dp(52) + ); + cancel.setLayoutParams(cancelLp); + cancel.setAllCaps(false); + cancel.setText("Cancel"); + cancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); + cancel.setBackgroundResource(R.drawable.bg_rounded_btn_cancel_cv); + cancel.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)); + cancel.setOnClickListener(v -> { + if (dialogHolder[0] != null) { + dialogHolder[0].dismiss(); + } + }); + root.addView(cancel); + + AlertDialog dialog = new AlertDialog.Builder(requireContext()) + .setView(root) + .create(); + dialogHolder[0] = dialog; + dialog.show(); + } + + private int dp(int value) { + return Math.round(value * requireContext().getResources().getDisplayMetrics().density); + } + + private interface CurrencySelectCallback { + void onSelected(String currency); + } + } From 2c87ee58289db0b1397f15184960bedddc6a81fc Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Mon, 9 Mar 2026 10:31:21 +0630 Subject: [PATCH 019/101] fix receipt for duel host --- .../kbz/ui/settings/HostConfigViewModel.java | 4 + .../main/res/layout/fragment_host_config.xml | 64 ++++++------ .../paylibs/print/printx/BaseXPrint.java | 98 ++++++++++++------- 3 files changed, 97 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java index d690c53..37009f8 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java @@ -44,6 +44,8 @@ public class HostConfigViewModel extends ViewModel { // Third Host public MutableLiveData thirdHostName = new MutableLiveData<>(); + public MutableLiveData thirdHostTid = new MutableLiveData<>(); + public MutableLiveData thirdHostMid = new MutableLiveData<>(); public MutableLiveData thirdHostShortCode = new MutableLiveData<>(); public MutableLiveData thirdHostPrimaryIp = new MutableLiveData<>(); public MutableLiveData thirdHostPrimaryPort = new MutableLiveData<>(); @@ -96,6 +98,8 @@ public class HostConfigViewModel extends ViewModel { if (sp.getThirdHostName() != null && !sp.getThirdHostName().isEmpty()) { thirdHostName.setValue(sp.getThirdHostName()); + thirdHostTid.setValue(sp.getThirdHostTerminalId()); + thirdHostMid.setValue(sp.getThirdHostMerchantId()); thirdHostShortCode.setValue(sp.getThirdHostShortCode()); String[] thp = split(sp.getThirdHostIpAddress()); diff --git a/app/src/main/res/layout/fragment_host_config.xml b/app/src/main/res/layout/fragment_host_config.xml index 6f5a56c..9466ee8 100644 --- a/app/src/main/res/layout/fragment_host_config.xml +++ b/app/src/main/res/layout/fragment_host_config.xml @@ -4,9 +4,6 @@ xmlns:tools="http://schemas.android.com/tools"> - - - @@ -99,9 +96,7 @@ + android:orientation="vertical"> - + - + - + - + - + - + - + @@ -175,9 +170,7 @@ + android:orientation="vertical"> - - + + + android:text='@{": " + viewModel.thirdHostTid}'/> - + + + + + + - + - + - + - + @@ -249,9 +248,7 @@ + android:orientation="vertical"> - + - + - + - + - + - + @@ -339,7 +336,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:visibility="@{sharedViewModel.printerDisabled ? View.GONE : View.VISIBLE}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent"> diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index c3abb26..108bcf8 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -1315,49 +1315,77 @@ public abstract class BaseXPrint { protected void printTerminalConfiguration() { SystemParamsOperation sp = SystemParamsOperation.getInstance(); + // ---------- PRIMARY HOST ---------- printer.appendPrnStr("PRIMARY HOST", fontNormal, AlignEnum.LEFT, true); - printer.appendPrnStr("Name : " + sp.getHostName(), fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("TID : " + sp.getTerminalId(), fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("MID : " + sp.getMerchantId(), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Name : " + safe(sp.getHostName()), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("TID : " + safe(sp.getTerminalId()), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("MID : " + safe(sp.getMerchantId()), fontNormal, AlignEnum.LEFT, false); String[] ipPort = splitIpAndPort(sp.getIpAddress()); - printer.appendPrnStr("Primary Ip : " + ipPort[0], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Primary IP : " + ipPort[0], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Primary Port : " + ipPort[1], fontNormal, AlignEnum.LEFT, false); String[] secIpPort = splitIpAndPort(sp.getSecIpAddress()); - printer.appendPrnStr("Secondary Ip : " + secIpPort[0], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Secondary IP : " + secIpPort[0], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Secondary Port: " + secIpPort[1], fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("Currency Code : " + sp.getCurrencyType(), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Currency : " + normalizeHostCurrency(sp.getCurrencyType() == null ? "" : sp.getCurrencyType().toString()), fontNormal, AlignEnum.LEFT, false); dotBreak(); - // ---------- SECONDARY HOST (optional) ---------- - if (!TextUtils.isEmpty(sp.getSecHostName())) { - printer.appendPrnStr("QR HOST", fontNormal, AlignEnum.LEFT, true); - printer.appendPrnStr("Name : " + sp.getSecHostName(), fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("SHORT CODE : " + sp.getShortCode(), fontNormal, AlignEnum.LEFT, false); - String[] secHostIp = splitIpAndPort(sp.getSecHostIpAddress()); - printer.appendPrnStr("Primary Ip : " + secHostIp[0], fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("Primary Port : " + secHostIp[1], fontNormal, AlignEnum.LEFT, false); - String[] secHostSecIp = splitIpAndPort(sp.getSecHostSecIpAddress()); - printer.appendPrnStr("Secondary Ip : " + secHostSecIp[0], fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("Secondary Port: " + secHostSecIp[1], fontNormal, AlignEnum.LEFT, false); - String qrHostCurrency = TextUtils.isEmpty(sp.getSecHostCurrency()) ? String.valueOf(sp.getCurrencyType()) : sp.getSecHostCurrency(); - printer.appendPrnStr("Currency Code : " + qrHostCurrency, fontNormal, AlignEnum.LEFT, false); - dotBreak(); - printer.appendPrnStr("App Version : " + getAppVersion(), fontNormal, AlignEnum.LEFT, false); - } - // ---------- THIRD HOST (optional) ---------- - if (!TextUtils.isEmpty(sp.getThirdHostName())) { - printer.appendPrnStr("SECONDARY HOST", fontNormal, AlignEnum.LEFT, true); - printer.appendPrnStr("Name : " + sp.getThirdHostName(), fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("SHORT CODE : " + sp.getThirdHostShortCode(), fontNormal, AlignEnum.LEFT, false); - String[] thirdHostIp = splitIpAndPort(sp.getThirdHostIpAddress()); - printer.appendPrnStr("Primary Ip : " + thirdHostIp[0], fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("Primary Port : " + thirdHostIp[1], fontNormal, AlignEnum.LEFT, false); - String[] thirdHostSecIp = splitIpAndPort(sp.getThirdHostSecIpAddress()); - printer.appendPrnStr("Secondary Ip : " + thirdHostSecIp[0], fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("Secondary Port: " + thirdHostSecIp[1], fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("Currency Code : " + sp.getThirdHostCurrency(), fontNormal, AlignEnum.LEFT, false); - dotBreak(); + // ---------- SECONDARY HOST ---------- + printer.appendPrnStr("SECONDARY HOST", fontNormal, AlignEnum.LEFT, true); + printer.appendPrnStr("Name : " + safe(sp.getThirdHostName()), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("TID : " + safe(sp.getThirdHostTerminalId()), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("MID : " + safe(sp.getThirdHostMerchantId()), fontNormal, AlignEnum.LEFT, false); + String[] thirdHostIp = splitIpAndPort(sp.getThirdHostIpAddress()); + printer.appendPrnStr("Primary IP : " + thirdHostIp[0], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Primary Port : " + thirdHostIp[1], fontNormal, AlignEnum.LEFT, false); + String[] thirdHostSecIp = splitIpAndPort(sp.getThirdHostSecIpAddress()); + printer.appendPrnStr("Secondary IP : " + thirdHostSecIp[0], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Secondary Port: " + thirdHostSecIp[1], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Currency : " + normalizeHostCurrency(safe(sp.getThirdHostCurrency())), fontNormal, AlignEnum.LEFT, false); + dotBreak(); + + // ---------- QR HOST ---------- + printer.appendPrnStr("QR HOST", fontNormal, AlignEnum.LEFT, true); + printer.appendPrnStr("Name : " + safe(sp.getSecHostName()), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Short Code : " + safe(sp.getShortCode()), fontNormal, AlignEnum.LEFT, false); + String[] qrHostIp = splitIpAndPort(sp.getSecHostIpAddress()); + printer.appendPrnStr("Primary IP : " + qrHostIp[0], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Primary Port : " + qrHostIp[1], fontNormal, AlignEnum.LEFT, false); + String[] qrHostSecIp = splitIpAndPort(sp.getSecHostSecIpAddress()); + printer.appendPrnStr("Secondary IP : " + qrHostSecIp[0], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Secondary Port: " + qrHostSecIp[1], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Currency : " + normalizeHostCurrency(safe(sp.getSecHostCurrency())), fontNormal, AlignEnum.LEFT, false); + dotBreak(); + + printer.appendPrnStr("App Version : " + getAppVersion(), fontNormal, AlignEnum.LEFT, false); + } + + private String safe(String value) { + return value == null ? "" : value; + } + + private String normalizeHostCurrency(String raw) { + if (TextUtils.isEmpty(raw)) return ""; + String value = raw.trim().toUpperCase(); + switch (value) { + case "104": + case "MMK": + return "MMK"; + case "840": + case "USD": + return "USD"; + case "156": + case "CNY": + case "RMB": + return "CNY"; + case "764": + case "THB": + return "THB"; + case "643": + case "RUB": + return "RUB"; + default: + return value; } } From 898c8edea4557c23327f9cec36e7c74ced9738b7 Mon Sep 17 00:00:00 2001 From: kizzy Date: Mon, 9 Mar 2026 13:03:15 +0700 Subject: [PATCH 020/101] fixed for de 61 SF 11 --- .idea/gradle.xml | 1 - app/build.gradle | 2 +- .../main/java/com/utsmm/kbz/MainFragment.java | 8 +-- .../baselib/viewModel/EmvBaseViewModel.java | 4 +- .../core_utils/KernelDataProcessUtil.java | 52 ++++++++++--------- settings.gradle | 2 +- 6 files changed, 36 insertions(+), 33 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index d0d4139..8e60dc8 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - - + android:text="@{settleViewModel.pre_breakdown}" + android:textColor="@color/colorTextContent" + android:textSize="12sp" + tools:text="MMK 1 / 8,000.00 USD 1 / 15.00" /> @@ -170,42 +200,56 @@ android:layout_marginTop="19dp" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" + android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - + android:orientation="horizontal"> + + + + + + + - - + android:text="@{settleViewModel.refund_breakdown}" + android:textColor="@color/colorTextContent" + android:textSize="12sp" + tools:text="MMK 0 / 0.00 USD 1 / 10.00" /> @@ -219,43 +263,57 @@ android:layout_marginTop="19dp" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" + android:orientation="vertical" android:visibility="@{settleViewModel.ca_count > 0 ? 0 : 8}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - + android:orientation="horizontal"> + + + + + + + - - + android:text="@{settleViewModel.ca_breakdown}" + android:textColor="@color/colorTextContent" + android:textSize="12sp" + tools:text="MMK 1 / 5,000.00 USD 0 / 0.00" /> diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/model/CardSettleData.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/model/CardSettleData.java index 29105c7..c06a2f5 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/model/CardSettleData.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/model/CardSettleData.java @@ -11,6 +11,7 @@ public class CardSettleData implements Serializable { private String expDate; private String invoiceNum; private String transType; + private String currencyCode; private long amount; @@ -22,12 +23,13 @@ public class CardSettleData implements Serializable { public CardSettleData() { } - public CardSettleData(String cardType, String cardNum, String expDate, String invoiceNum, String transType, long amount, String transDate, String transTime, String approvalCode) { + public CardSettleData(String cardType, String cardNum, String expDate, String invoiceNum, String transType, String currencyCode, long amount, String transDate, String transTime, String approvalCode) { this.cardType = cardType; this.cardNum = cardNum; this.expDate = expDate; this.invoiceNum = invoiceNum; this.transType = transType; + this.currencyCode = currencyCode; this.amount = amount; this.transDate = transDate; this.transTime = transTime; @@ -54,6 +56,10 @@ public class CardSettleData implements Serializable { this.transType = transType; } + public void setCurrencyCode(String currencyCode) { + this.currencyCode = currencyCode; + } + public void setAmount(long amount) { this.amount = amount; } @@ -86,6 +92,10 @@ public class CardSettleData implements Serializable { return transType; } + public String getCurrencyCode() { + return currencyCode; + } + public long getAmount() { return amount; } @@ -115,6 +125,7 @@ public class CardSettleData implements Serializable { cardSettleData.setExpDate(pay.getEXPDate()); cardSettleData.setInvoiceNum(pay.getInvoiceNo()); cardSettleData.setTransType(pay.getTransType()); + cardSettleData.setCurrencyCode(pay.getCurrencyCode()); cardSettleData.setAmount(pay.getAmount()); cardSettleData.setTransDate(pay.getTransDate()); cardSettleData.setTransTime(pay.getTransTime()); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index a37416d..5c1d487 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -212,23 +212,34 @@ public abstract class BaseXPrint { } protected void printTransDetailSettlement(PayDetail payDetail) { - - SettleData settleData = payDetail.getSettleDataObj(); - int totalCount = settleData.getSaleCount() + settleData.getPreAuthCompCount() + settleData.getRefundCount() + settleData.getCashAdvanceCount(); - long totalAmount = settleData.getSaleAmount() + settleData.getPreAuthCompAmount() + settleData.getCashAdvanceAmount(); + List cardSettleDataList = payDetail.getCardSettleData(); + CurrencySettlementSummary mmkSummary = new CurrencySettlementSummary(); + CurrencySettlementSummary usdSummary = new CurrencySettlementSummary(); - print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); - print3ColumnsString("SALE ", countStringFormat(settleData.getSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getSaleAmount())); - print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount())); - if (settleData.getCashAdvanceCount() != 0) - print3ColumnsString("CASH ADVANCE ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount())); - print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount())); - print3ColumnsString("TOTAL"+ "(" + "MMK" +")" + " ", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount)); + if (cardSettleDataList != null && !cardSettleDataList.isEmpty()) { + for (CardSettleData cardSettleData : cardSettleDataList) { + CurrencySettlementSummary summary = "USD".equals(normalizeSettlementCurrency(cardSettleData.getCurrencyCode())) ? usdSummary : mmkSummary; + applyCardSettlementSummary(summary, cardSettleData); + } + } else { + mmkSummary.saleCount = settleData.getSaleCount(); + mmkSummary.saleAmount = settleData.getSaleAmount(); + mmkSummary.preAuthCompCount = settleData.getPreAuthCompCount(); + mmkSummary.preAuthCompAmount = settleData.getPreAuthCompAmount(); + mmkSummary.refundCount = settleData.getRefundCount(); + mmkSummary.refundAmount = settleData.getRefundAmount(); + mmkSummary.cashAdvanceCount = settleData.getCashAdvanceCount(); + mmkSummary.cashAdvanceAmount = settleData.getCashAdvanceAmount(); + } + + printSettlementCurrencySection("MMK", mmkSummary); + if (usdSummary.hasAnyValue()) { + emptyLine(1); + printSettlementCurrencySection("USD", usdSummary); + } emptyLine(2); - - } protected void printTransDetailSettlement(PayDetail payDetail, List cardSettleDataList) { @@ -276,6 +287,72 @@ public abstract class BaseXPrint { } + private void printSettlementCurrencySection(String currencyLabel, CurrencySettlementSummary summary) { + if (!summary.hasAnyValue()) { + return; + } + + int totalCount = summary.saleCount + summary.preAuthCompCount + summary.refundCount + summary.cashAdvanceCount; + long totalAmount = summary.saleAmount + summary.preAuthCompAmount + summary.cashAdvanceAmount - summary.refundAmount; + + printString("CURRENCY : " + currencyLabel, true); + print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); + print3ColumnsString("SALE ", countStringFormat(summary.saleCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.saleAmount)); + print3ColumnsString("PREAUTH COMP ", countStringFormat(summary.preAuthCompCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.preAuthCompAmount)); + if (summary.cashAdvanceCount != 0) { + print3ColumnsString("CASH ADVANCE ", countStringFormat(summary.cashAdvanceCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.cashAdvanceAmount)); + } + print3ColumnsString("REFUND ", countStringFormat(summary.refundCount), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(summary.refundAmount)); + print3ColumnsString("TOTAL(" + currencyLabel + ")", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount)); + } + + private void applyCardSettlementSummary(CurrencySettlementSummary summary, CardSettleData cardSettleData) { + String transType = cardSettleData.getTransType() == null ? "" : cardSettleData.getTransType().trim().toUpperCase(Locale.getDefault()); + long amount = cardSettleData.getAmount(); + + if ("SALE".equals(transType)) { + summary.saleCount++; + summary.saleAmount += amount; + } else if ("PREAUTH COMPLETION".equals(transType) || "PRE_AUTH_COMPLETE".equals(transType)) { + summary.preAuthCompCount++; + summary.preAuthCompAmount += amount; + } else if ("REFUND".equals(transType)) { + summary.refundCount++; + summary.refundAmount += amount; + } else if ("CASH_OUT".equals(transType) || "CASH_ADVANCE".equals(transType)) { + summary.cashAdvanceCount++; + summary.cashAdvanceAmount += amount; + } + } + + private String normalizeSettlementCurrency(String currencyCode) { + if (currencyCode == null) { + return "MMK"; + } + + String value = currencyCode.trim().toUpperCase(Locale.getDefault()); + if ("840".equals(value) || "USD".equals(value)) { + return "USD"; + } + return "MMK"; + } + + private static class CurrencySettlementSummary { + int saleCount; + long saleAmount; + int preAuthCompCount; + long preAuthCompAmount; + int refundCount; + long refundAmount; + int cashAdvanceCount; + long cashAdvanceAmount; + + boolean hasAnyValue() { + return saleCount > 0 || preAuthCompCount > 0 || refundCount > 0 || cashAdvanceCount > 0 + || saleAmount > 0 || preAuthCompAmount > 0 || refundAmount > 0 || cashAdvanceAmount > 0; + } + } + private String currencyCodeToText(String currencyCode) { String currencyText = "MMK"; From 175ebab148bb8fc2b5efcb357b0cdaec52edd6b0 Mon Sep 17 00:00:00 2001 From: kizzy Date: Tue, 31 Mar 2026 18:55:22 +0700 Subject: [PATCH 050/101] settlement finished for dual currency --- .../main/java/com/utsmm/kbz/MainFragment.java | 2 +- .../ui/core_ui/ProcessingCardFragment.java | 2 + .../SettlementTransactionFragment.java | 57 +++++--- .../ui/settlement/SettlementViewModel.java | 134 +++++++++++------- .../ui/settlement/model/CurrencyBucket.java | 89 ++++++++++++ .../kbz/util/CurrencySelectionHelper.java | 2 +- .../kbz/util/enums/TransactionStatus.java | 2 + .../utsmyanmar/baselib/TerminalKeyUtil.java | 1 + 8 files changed, 216 insertions(+), 73 deletions(-) create mode 100644 app/src/main/java/com/utsmm/kbz/ui/settlement/model/CurrencyBucket.java diff --git a/app/src/main/java/com/utsmm/kbz/MainFragment.java b/app/src/main/java/com/utsmm/kbz/MainFragment.java index 8fe1679..91be9b5 100644 --- a/app/src/main/java/com/utsmm/kbz/MainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/MainFragment.java @@ -252,7 +252,7 @@ public class MainFragment extends DataBindingFragment { sharedViewModel.setManualEntryStatus(SystemParamsOperation.getInstance().getManualEntryStatus()); // queryAidCAPKList(); - queryAidCAPKList(); +// queryAidCAPKList(); // generateMockQR(); } diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingCardFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingCardFragment.java index 0ae0646..672ebb9 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingCardFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingCardFragment.java @@ -131,6 +131,7 @@ public class ProcessingCardFragment extends DataBindingFragment { } private void mockMPUCard() { LogUtil.d(TAG,"initialize mock card data..."); + sharedViewModel.isEmv.setValue(false); routeId = R.id.action_processingCardFragment_to_pinPadFragment; transProcessViewModel.transType.setValue(sharedViewModel.transactionsType.getValue()); pinPadViewModel.transType.setValue(sharedViewModel.transactionsType.getValue()); @@ -159,6 +160,7 @@ public class ProcessingCardFragment extends DataBindingFragment { return; } } + sharedViewModel.isEmv.setValue(false); routeId = R.id.action_processingCardFragment_to_pinPadFragment; transProcessViewModel.transType.setValue(sharedViewModel.transactionsType.getValue()); diff --git a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java index 81b9759..30e0d1f 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java @@ -9,10 +9,13 @@ import androidx.annotation.Nullable; import androidx.lifecycle.Observer; import com.utsmm.kbz.ui.management.ManagementViewModel; +import com.utsmm.kbz.ui.settlement.model.CurrencyBucket; +import com.utsmm.kbz.util.CurrencySelectionHelper; import com.utsmm.kbz.util.EReceiptUtil; import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest; import com.utsmyanmar.baselib.util.DataBindingConfig; +import com.utsmyanmar.paylibs.model.CardSettleData; import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.TradeData; import com.utsmyanmar.paylibs.print.printx.PrintXStatus; @@ -43,7 +46,7 @@ public class SettlementTransactionFragment extends DataBindingFragment implement private SharedViewModel sharedViewModel; private ManagementViewModel managementViewModel; - + private CurrencySelectionHelper currencySelectionHelper; private int routeId; int saleCount = 0; @@ -55,17 +58,6 @@ public class SettlementTransactionFragment extends DataBindingFragment implement long refundAmount = 0; long caAmount = 0; - private static class CurrencyBucket { - int saleCount; - long saleAmount; - int preCount; - long preAmount; - int refundCount; - long refundAmount; - int caCount; - long caAmount; - } - private final CurrencyBucket mmkBucket = new CurrencyBucket(); private final CurrencyBucket usdBucket = new CurrencyBucket(); @@ -74,6 +66,8 @@ public class SettlementTransactionFragment extends DataBindingFragment implement settlementViewModel = getFragmentScopeViewModel(SettlementViewModel.class); sharedViewModel = getFragmentScopeViewModel(SharedViewModel.class); managementViewModel = getFragmentScopeViewModel(ManagementViewModel.class); + + currencySelectionHelper = new CurrencySelectionHelper(this, sharedViewModel); } @Override @@ -337,6 +331,8 @@ public class SettlementTransactionFragment extends DataBindingFragment implement CASH_ADVANCE } + + private void resetCurrencyBucket(CurrencyBucket bucket) { bucket.saleCount = 0; bucket.saleAmount = 0L; @@ -379,9 +375,9 @@ public class SettlementTransactionFragment extends DataBindingFragment implement resetCurrencyBucket(mmkBucket); resetCurrencyBucket(usdBucket); - List cardSettleDataList = payDetail.getCardSettleData(); + List cardSettleDataList = payDetail.getCardSettleData(); if (cardSettleDataList != null && !cardSettleDataList.isEmpty()) { - for (com.utsmyanmar.paylibs.model.CardSettleData item : cardSettleDataList) { + for (CardSettleData item : cardSettleDataList) { applyStoredCardSettle(item); } return; @@ -399,7 +395,7 @@ public class SettlementTransactionFragment extends DataBindingFragment implement bucket.caAmount = caAmount; } - private void applyStoredCardSettle(com.utsmyanmar.paylibs.model.CardSettleData item) { + private void applyStoredCardSettle(CardSettleData item) { CurrencyBucket bucket = getCurrencyBucket(item.getCurrencyCode()); String transType = item.getTransType() == null ? "" : item.getTransType().trim().toUpperCase(Locale.getDefault()); @@ -451,13 +447,21 @@ public class SettlementTransactionFragment extends DataBindingFragment implement safeNavigateToRouteId(); } + private boolean isUSDSettleNeeded() { + return (usdBucket.saleCount != 0 || usdBucket.preCount != 0 || usdBucket.refundCount != 0 || usdBucket.caCount != 0); + } private void networkCutOver() { EchoTestProcess.getInstance().enqueueCutOver().startSignOn(new SignOnListener() { @Override public void onSuccessSignOn() { -// showSuccessDialog("Approved!"); - navigateToNext(); + if(isUSDSettleNeeded()) { + currencySelectionHelper.applyCardCurrencyAndHost("MMK"); + settlementViewModel.startSettlementProcess(mmkBucket,true); + } else { + navigateToNext(); + } + } @Override @@ -485,12 +489,14 @@ public class SettlementTransactionFragment extends DataBindingFragment implement showLoadingDialog("Sending Batch Upload..."); break; case ON_SUCCESS: + dismissLoadingDialog(); + networkCutOver(); + break; + case ON_FINAL_SUCCESS: dismissLoadingDialog(); updateData(); if (!SystemParamsOperation.getInstance().getDemoStatus()) { - networkCutOver(); // bpc - navigateToNext(); } else { navigateToNext(); } @@ -555,11 +561,22 @@ public class SettlementTransactionFragment extends DataBindingFragment implement } + + public void onConfirm(){ if(sharedViewModel.getTransMenu().getValue() == TransMenu.SETTLEMENT) { /* April 10 , 2024 Smile requested not to send to host even settlement button was clicked */ - settlementViewModel.startSettlementProcess(); + + if(isUSDSettleNeeded()) { + currencySelectionHelper.applyCardCurrencyAndHost("USD"); + settlementViewModel.startSettlementProcess(usdBucket,false); + } else { + currencySelectionHelper.applyCardCurrencyAndHost("MMK"); + settlementViewModel.startSettlementProcess(mmkBucket,true); + } + + showLoadingDialog("Sending ..."); } else if(sharedViewModel.getTransMenu().getValue() == TransMenu.REVIEW_BATCH) { sharedViewModel.startPrintSettlement(new PrintXStatus() { diff --git a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java index d0746f1..0a17577 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java @@ -7,6 +7,7 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; +import com.utsmm.kbz.ui.settlement.model.CurrencyBucket; import com.utsmm.kbz.util.EReceiptUtil; import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest; import com.utsmyanmar.baselib.repo.Repository; @@ -115,6 +116,10 @@ public class SettlementViewModel extends ViewModel { private ISOMsgX isoMsgX; + public CurrencyBucket currentBucket= new CurrencyBucket(); + + private boolean isLast = true; + @Inject public SettlementViewModel(Repository repository) { this.repository = repository; @@ -265,22 +270,22 @@ public class SettlementViewModel extends ViewModel { @SuppressWarnings("ConstantConditions") - public void startSettlementProcess() { - saleCount = sale_count.getValue(); - saleAmount = sale_amount.getValue(); - preAuthCount = pre_count.getValue(); - preAuthAmount = pre_amount.getValue(); - refundCount = refund_count.getValue(); - refundAmount = refund_amount.getValue(); - caCount = ca_count.getValue(); - caAmount = ca_amount.getValue(); - + public void startSettlementProcess(CurrencyBucket currencyBucket,boolean isLast) { +// saleCount = sale_count.getValue(); +// saleAmount = sale_amount.getValue(); +// preAuthCount = pre_count.getValue(); +// preAuthAmount = pre_amount.getValue(); +// refundCount = refund_count.getValue(); +// refundAmount = refund_amount.getValue(); +// caCount = ca_count.getValue(); +// caAmount = ca_amount.getValue(); + this.isLast = isLast; SystemParamsOperation.getInstance().getIncrementBatchNo(); if(SystemParamsOperation.getInstance().getDemoStatus()) { - requestDemoProcessSettlement(); + requestDemoProcessSettlement(currencyBucket); } else { - requestOnlineProcessSettlement(); + requestOnlineProcessSettlement(currencyBucket); } } @@ -299,7 +304,7 @@ public class SettlementViewModel extends ViewModel { - private void requestDemoProcessSettlement() { + private void requestDemoProcessSettlement(CurrencyBucket currencyBucket) { TradeData tradeData = Params.newTrade(true); @@ -321,18 +326,18 @@ public class SettlementViewModel extends ViewModel { payDetail.setBatchNo(SystemParamsOperation.getInstance().getCurrentBatchNum()); //for print receipt /*POS*/ - payDetail.setSettleList(sale_count.getValue() + ":" + sale_amount.getValue() + "-" + ca_count.getValue() + ":" + ca_amount.getValue() + "-" + refund_count.getValue() + ":" + refund_amount.getValue() + "-" + pre_count.getValue() + ":" + pre_amount.getValue()); // for print receipt + payDetail.setSettleList(currencyBucket.saleCount+ ":" + currencyBucket.saleAmount + "-" + currencyBucket.caCount + ":" + currencyBucket.caAmount + "-" + currencyBucket.refundCount + ":" + currencyBucket.refundAmount + "-" + currencyBucket.preCount + ":" + currencyBucket.preAmount); // for print receipt /*POS*/ - SettleData settleData = new SettleData(saleCount,saleAmount,preAuthCount,preAuthAmount,refundCount,refundAmount,caCount,caAmount); + SettleData settleData = new SettleData(currencyBucket.saleCount, currencyBucket.saleAmount, currencyBucket.preCount, currencyBucket.preAmount, currencyBucket.refundCount, currencyBucket.refundAmount, currencyBucket.caCount, currencyBucket.caAmount); payDetail.setSettleDataObj(settleData); - long totalAmount = saleAmount + preAuthAmount + refundAmount + caAmount; + long totalAmount = currencyBucket.saleAmount + currencyBucket.preAmount + currencyBucket.refundAmount + currencyBucket.caAmount; String settlementData = ""; - if(refundAmount != 0L) { + if(currencyBucket.refundAmount != 0L) { - long creditTotal = saleAmount + preAuthAmount + caAmount; - long subTotal = creditTotal - refundAmount; + long creditTotal = currencyBucket.saleAmount + currencyBucket.preAmount + currencyBucket.caAmount; + long subTotal = creditTotal - currencyBucket.refundAmount; if(subTotal < 0L) { settlementData = "D"+ String.format(Locale.getDefault(), "%012d", Math.abs(subTotal)); @@ -354,24 +359,24 @@ public class SettlementViewModel extends ViewModel { resultString.postValue(TransactionStatus.ON_SUCCESS); } - private void requestOnlineProcessSettlement() { - + private void requestOnlineProcessSettlement(CurrencyBucket currencyBucket) { + currentBucket = currencyBucket; HostName hostName = HostName.BPC; String field60 = SystemParamsOperation.getInstance().getCurrentBatchNum(); - int sale2Count = saleCount + preAuthCount; - long sale2Amount = saleAmount + preAuthAmount; + int sale2Count = currencyBucket.saleCount + currencyBucket.preCount; + long sale2Amount = currencyBucket.saleAmount + currencyBucket.preAmount; String totalSaleCount = String.format(Locale.getDefault(), "%03d", sale2Count); String totalSaleAmount = String.format(Locale.getDefault(), "%010d00", sale2Amount); - String totalRefundCount = String.format(Locale.getDefault(), "%03d", refundCount); - String totalRefundAmount = String.format(Locale.getDefault(), "%010d00", refundAmount == 0L ? 0 : refundAmount); - String totalDebitSaleCount = String.format(Locale.getDefault(), "%03d", caCount); - String totalDebitSaleAmount = String.format(Locale.getDefault(), "%010d00", caAmount == 0L ? 0 : caAmount); + String totalRefundCount = String.format(Locale.getDefault(), "%03d", currencyBucket.refundCount); + String totalRefundAmount = String.format(Locale.getDefault(), "%010d00", currencyBucket.refundAmount == 0L ? 0 : currencyBucket.refundAmount); + String totalDebitSaleCount = String.format(Locale.getDefault(), "%03d", currencyBucket.caCount); + String totalDebitSaleAmount = String.format(Locale.getDefault(), "%010d00", currencyBucket.caAmount == 0L ? 0 : currencyBucket.caAmount); String totalERefundCount = String.format(Locale.getDefault(), "%03d", 0); String totalERefundAmount = String.format(Locale.getDefault(), "%010d00", 0); @@ -406,22 +411,22 @@ public class SettlementViewModel extends ViewModel { payDetail.setBatchNo(SystemParamsOperation.getInstance().getCurrentBatchNum()); //for print receipt /*POS*/ - payDetail.setSettleList(sale_count.getValue() + ":" + sale_amount.getValue() + "-" + ca_count.getValue() + ":" + ca_amount.getValue() + "-" + refund_count.getValue() + ":" + refund_amount.getValue() + "-" + pre_count.getValue() + ":" + pre_amount.getValue()); // for print receipt + payDetail.setSettleList(currencyBucket.saleCount+ ":" + currencyBucket.saleAmount + "-" + currencyBucket.caCount + ":" + currencyBucket.caAmount + "-" + currencyBucket.refundCount + ":" + currencyBucket.refundAmount + "-" + currencyBucket.preCount + ":" + currencyBucket.preAmount); // for print receipt /*POS*/ - SettleData settleData = new SettleData(saleCount,saleAmount,preAuthCount,preAuthAmount,refundCount,refundAmount,caCount,caAmount); + SettleData settleData = new SettleData(currencyBucket.saleCount, currencyBucket.saleAmount, currencyBucket.preCount, currencyBucket.preAmount, currencyBucket.refundCount, currencyBucket.refundAmount, currencyBucket.caCount, currencyBucket.caAmount); payDetail.setSettleDataObj(settleData); if(payDetails != null) payDetail.setCardSettleData(CardSettleData.convertFromPayDetail(payDetails)); if(hostName == HostName.BPC) { - long totalAmount = saleAmount + preAuthAmount + refundAmount + caAmount; + long totalAmount = currencyBucket.saleAmount + currencyBucket.preAmount + currencyBucket.refundAmount + currencyBucket.caAmount; String settlementData = ""; - if(refundAmount != 0L) { + if(currencyBucket.refundAmount != 0L) { - long creditTotal = saleAmount + preAuthAmount + caAmount; - long subTotal = creditTotal - refundAmount; + long creditTotal = currencyBucket.saleAmount + currencyBucket.preAmount + currencyBucket.caAmount; + long subTotal = creditTotal - currencyBucket.refundAmount; if(subTotal < 0L) { settlementData = "D"+ String.format(Locale.getDefault(), "%012d", Math.abs(subTotal)); @@ -484,7 +489,7 @@ public class SettlementViewModel extends ViewModel { if (!isSecondCall) { ISOSocket.getInstance().switchIp(); resultString.postValue(TransactionStatus.ON_SECONDARY); - requestOnlineProcessSettlement(); + requestOnlineProcessSettlement(currencyBucket); isSecondCall = true; } else { resultString.postValue(TransactionStatus.ON_ERROR); @@ -505,7 +510,7 @@ public class SettlementViewModel extends ViewModel { /* Batch Upload Start Here*/ flag = true; - batchUploadProcess(); + batchUploadProcess(isLast); } else { /* this flag is to send batch upload again when host response 95 next time */ @@ -516,19 +521,21 @@ public class SettlementViewModel extends ViewModel { // to leave data for testing // if (settlementType.getValue() == SettlementType.NORMAL) { - updateDB(); - - -// } - - + if(isLast) { + updateDB(); + } insertPayDetail(payDetail); if (errorFlag) { resultString.postValue(TransactionStatus.ON_ERROR); } else { - resultString.postValue(TransactionStatus.ON_SUCCESS); + if(isLast) { + resultString.postValue(TransactionStatus.ON_FINAL_SUCCESS); + } else { + resultString.postValue(TransactionStatus.ON_SUCCESS); + } + } @@ -537,31 +544,56 @@ public class SettlementViewModel extends ViewModel { }); } - private void batchUploadProcess() { + private void batchUploadProcess(boolean isLast) { resultString.postValue(TransactionStatus.ON_BATCH_UPLOAD); - if(payDetails == null || payDetails.size() == 0){ - requestOnlineProcessSettlement(); + if (payDetails == null || payDetails.isEmpty()) { + requestOnlineProcessSettlement(currentBucket); + return; + } + + // Advance index, skipping entries that don't belong to this pass + while (i < payDetails.size()) { + PayDetail payDetail = payDetails.get(i); + boolean isMMK = payDetail.getCurrencyCode().equals("104"); + + if (isLast && !isMMK) { + // isLast = true → MMK pass, skip USD + LogUtil.d(TAG, "Skipping USD transaction at index: " + i); + i++; + continue; + } else if (!isLast && isMMK) { + // isLast = false → USD pass, skip MMK + LogUtil.d(TAG, "Skipping MMK transaction at index: " + i); + i++; + continue; + } + + break; + } + + if (i >= payDetails.size()) { + requestOnlineProcessSettlement(currentBucket); return; } PayDetail payDetail = payDetails.get(i); + TradeData tradeData = new TradeData(); tradeData.setPayDetail(payDetail); BatchUploadProcess.getInstance().enqueue(tradeData).startBatchUpload(new BatchListener() { @Override public void onSuccessBatch() { + LogUtil.e(TAG, "Batch Upload Success"); + LogUtil.d(TAG, "Pay detail Size: " + payDetails.size()); + LogUtil.d(TAG, "Count value: " + i); if (i < payDetails.size() - 1) { - LogUtil.d(TAG, "Pay detail Size:" + payDetails.size()); - LogUtil.d(TAG, "Count value:" + i); i++; - batchUploadProcess(); + batchUploadProcess(isLast); } else { - requestOnlineProcessSettlement(); + requestOnlineProcessSettlement(currentBucket); } - - LogUtil.e(TAG, "Batch Upload Success"); } @Override diff --git a/app/src/main/java/com/utsmm/kbz/ui/settlement/model/CurrencyBucket.java b/app/src/main/java/com/utsmm/kbz/ui/settlement/model/CurrencyBucket.java new file mode 100644 index 0000000..1baee36 --- /dev/null +++ b/app/src/main/java/com/utsmm/kbz/ui/settlement/model/CurrencyBucket.java @@ -0,0 +1,89 @@ +package com.utsmm.kbz.ui.settlement.model; + +public class CurrencyBucket { + public int saleCount; + public long saleAmount; + public int preCount; + public long preAmount; + public int refundCount; + public long refundAmount; + public int caCount; + public long caAmount; + + public CurrencyBucket(){} + + public CurrencyBucket(int saleCount, long saleAmount, int preCount, long preAmount, int refundCount, long refundAmount, int caCount, long caAmount) { + this.saleCount = saleCount; + this.saleAmount = saleAmount; + this.preCount = preCount; + this.preAmount = preAmount; + this.refundCount = refundCount; + this.refundAmount = refundAmount; + this.caCount = caCount; + this.caAmount = caAmount; + } + + public void setSaleCount(int saleCount) { + this.saleCount = saleCount; + } + + public void setSaleAmount(long saleAmount) { + this.saleAmount = saleAmount; + } + + public void setPreCount(int preCount) { + this.preCount = preCount; + } + + public void setPreAmount(long preAmount) { + this.preAmount = preAmount; + } + + public void setRefundCount(int refundCount) { + this.refundCount = refundCount; + } + + public void setRefundAmount(long refundAmount) { + this.refundAmount = refundAmount; + } + + public void setCaCount(int caCount) { + this.caCount = caCount; + } + + public void setCaAmount(long caAmount) { + this.caAmount = caAmount; + } + + public int getSaleCount() { + return saleCount; + } + + public long getSaleAmount() { + return saleAmount; + } + + public int getPreCount() { + return preCount; + } + + public long getPreAmount() { + return preAmount; + } + + public int getRefundCount() { + return refundCount; + } + + public long getRefundAmount() { + return refundAmount; + } + + public int getCaCount() { + return caCount; + } + + public long getCaAmount() { + return caAmount; + } +} diff --git a/app/src/main/java/com/utsmm/kbz/util/CurrencySelectionHelper.java b/app/src/main/java/com/utsmm/kbz/util/CurrencySelectionHelper.java index f93197b..8b82825 100644 --- a/app/src/main/java/com/utsmm/kbz/util/CurrencySelectionHelper.java +++ b/app/src/main/java/com/utsmm/kbz/util/CurrencySelectionHelper.java @@ -88,7 +88,7 @@ public class CurrencySelectionHelper { return new ArrayList<>(values); } - private void applyCardCurrencyAndHost(String selectedCurrency) { + public void applyCardCurrencyAndHost(String selectedCurrency) { cachePrimaryCardHostIfNeeded(); String selected = normalizeCurrency(selectedCurrency); diff --git a/app/src/main/java/com/utsmm/kbz/util/enums/TransactionStatus.java b/app/src/main/java/com/utsmm/kbz/util/enums/TransactionStatus.java index 43e2319..546e524 100644 --- a/app/src/main/java/com/utsmm/kbz/util/enums/TransactionStatus.java +++ b/app/src/main/java/com/utsmm/kbz/util/enums/TransactionStatus.java @@ -3,6 +3,8 @@ package com.utsmm.kbz.util.enums; public enum TransactionStatus { ON_SUCCESS, + + ON_FINAL_SUCCESS, ON_REVERSAL, ON_BATCH_UPLOAD, ON_FAIL, diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java index 0f449eb..8ffc84a 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java @@ -23,6 +23,7 @@ public final class TerminalKeyUtil { public static final String TAG = TerminalKeyUtil.class.getSimpleName(); private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); // KBZ UAT +// private static final byte[] main_key_usd_data = ByteUtil.hexStr2Bytes("3f4bcac6cc559ab12bbbc5a51118f3f5".toUpperCase()); // KBZ UAT // private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); // private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // MPU private static final byte[] work_key_data = new byte[16]; From ddd64fb48d2a1d39cfd7039aad4c4b72aa68a631 Mon Sep 17 00:00:00 2001 From: kizzy Date: Tue, 31 Mar 2026 21:49:43 +0700 Subject: [PATCH 051/101] fixed for settlement --- .../SettlementTransactionFragment.java | 4 +++- .../kbz/ui/settlement/SettlementViewModel.java | 17 +---------------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java index 30e0d1f..0ad6730 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java @@ -12,6 +12,7 @@ import com.utsmm.kbz.ui.management.ManagementViewModel; import com.utsmm.kbz.ui.settlement.model.CurrencyBucket; import com.utsmm.kbz.util.CurrencySelectionHelper; import com.utsmm.kbz.util.EReceiptUtil; +import com.utsmm.kbz.util.enums.TransactionStatus; import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest; import com.utsmyanmar.baselib.util.DataBindingConfig; @@ -455,13 +456,14 @@ public class SettlementTransactionFragment extends DataBindingFragment implement @Override public void onSuccessSignOn() { - if(isUSDSettleNeeded()) { + if(settlementViewModel.resultString.getValue() != TransactionStatus.ON_FINAL_SUCCESS) { currencySelectionHelper.applyCardCurrencyAndHost("MMK"); settlementViewModel.startSettlementProcess(mmkBucket,true); } else { navigateToNext(); } + } @Override diff --git a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java index 0a17577..8a3f5bb 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java @@ -234,14 +234,7 @@ public class SettlementViewModel extends ViewModel { if(payDetails != null && payDetails.size() > 0) { for (PayDetail pay:payDetails) { -// if(paydetail.getTransactionType() == TransactionsType.SALE.value) { -// paydetail.setIsSettle(true); -// updatePayDetail(paydetail); -// } else { deletePayDetail(pay); -// repository.deletePayDetail(paydetail); -// } - } } @@ -271,14 +264,6 @@ public class SettlementViewModel extends ViewModel { @SuppressWarnings("ConstantConditions") public void startSettlementProcess(CurrencyBucket currencyBucket,boolean isLast) { -// saleCount = sale_count.getValue(); -// saleAmount = sale_amount.getValue(); -// preAuthCount = pre_count.getValue(); -// preAuthAmount = pre_amount.getValue(); -// refundCount = refund_count.getValue(); -// refundAmount = refund_amount.getValue(); -// caCount = ca_count.getValue(); -// caAmount = ca_amount.getValue(); this.isLast = isLast; SystemParamsOperation.getInstance().getIncrementBatchNo(); @@ -356,7 +341,7 @@ public class SettlementViewModel extends ViewModel { updateDB(); insertPayDetail(payDetail); - resultString.postValue(TransactionStatus.ON_SUCCESS); + resultString.postValue(TransactionStatus.ON_FINAL_SUCCESS); } private void requestOnlineProcessSettlement(CurrencyBucket currencyBucket) { From 1aac919c47a40d93433bed772e3916019f0c3867 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Tue, 31 Mar 2026 21:24:58 +0630 Subject: [PATCH 052/101] duel currency fix for detail report --- .../res/layout/item_view_detail_report.xml | 29 ++++ .../paylibs/print/printx/BaseXPrint.java | 139 +++++++++++------- 2 files changed, 114 insertions(+), 54 deletions(-) diff --git a/app/src/main/res/layout/item_view_detail_report.xml b/app/src/main/res/layout/item_view_detail_report.xml index ca3e691..80a1ec1 100644 --- a/app/src/main/res/layout/item_view_detail_report.xml +++ b/app/src/main/res/layout/item_view_detail_report.xml @@ -77,6 +77,35 @@ tools:text="000045" /> + + + + + + + lists, HostType hostType) { - - if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) { - // Use the same line-by-line style as QR detail report - } else if (hostType == HostType.QR) { -// print2ColumnsString("PAYMENT NAME", ""); -// print2ColumnsString("DATE", "TIME"); -// print2ColumnsString("TRANSACTION", "TRACE NO"); -// print2ColumnsString("TRXN ID", ""); -// print2ColumnsString("AMOUNT", ""); + // ✅ Summary holder (total + count per currency) + class CurrencySummary { + long total = 0; + int count = 0; } - -// breakingLine(); - - long totalAmount = 0; + Map currencyMap = new HashMap<>(); for (PayDetail pay : lists) { - boolean isNeedMinusSign = pay.getTransactionType() == TransactionsType.VOID.value || pay.getTransactionType() == TransactionsType.REFUND.value || pay.getTransactionType() == TransactionsType.MMQR_REFUND.value; - boolean isDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable(); + boolean isNeedMinusSign = + pay.getTransactionType() == TransactionsType.VOID.value || + pay.getTransactionType() == TransactionsType.REFUND.value || + pay.getTransactionType() == TransactionsType.MMQR_REFUND.value; + + boolean isDecimalEnabledQr = SystemParamsOperation.getInstance().isQrDecimalEnable(); + String currency = currencyCodeToText(pay.getCurrencyCode()); + + // ============================= + // PRINT DETAIL + // ============================= if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) { + boolean isDecimalEnabledCard = SystemParamsOperation.getInstance().getDecimalEnable(); + printString("CARD TYPE:" + pay.getAccountType()); printString("CARD NO :" + PrintUtils.getInstance().maskCardNumberPciDss(pay.getCardNo())); printString("TRACE NO :" + pay.getVoucherNo()); @@ -887,12 +895,11 @@ public abstract class BaseXPrint { printString("DATE :" + POSUtil.getInstance().formatDisplayDate(pay.getTransDate()) + " " + pay.getTransTime()); printString("TYPE :" + pay.getTransType().replace("_", " ")); printString("AMOUNT :" + - (isNeedMinusSign - ? "-" + PrintUtils.getInstance() - .getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledCard) - : PrintUtils.getInstance() - .getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledCard)) - + " " + "MMK"); + (isNeedMinusSign + ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledCard) + : PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledCard)) + + " " + currency); + dotBreak(); } else if (hostType == HostType.QR) { @@ -900,64 +907,88 @@ public abstract class BaseXPrint { printString("TRANS ID:" + pay.getQrTransId()); printString("STATUS :" + pay.getTC()); printString("SOURCE :" + - (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value - ? "QR PAYMENT" - : pay.getCustomerMobile()) - ); -// printString("TXN NAME:" + pay.getTransType().replace("_", " ")); + (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value + ? "QR PAYMENT" + : pay.getCustomerMobile())); printString("DATE :" + POSUtil.getInstance().formatDisplayDate(pay.getTransDate()) + " " + pay.getTransTime()); printString("TRACE NO:" + pay.getVoucherNo()); + if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) { printString("RRN :" + pay.getReferNo()); } + printString("AMOUNT :" + - (isNeedMinusSign - ? "-" + PrintUtils.getInstance() - .getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) - : PrintUtils.getInstance() - .getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled)) - + " " +"MMK"); + (isNeedMinusSign + ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledQr) + : PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledQr)) + + " " + currency); + dotBreak(); - -// if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) { -// print2ColumnsString("QR PAYMENT", ""); -// } else { -// print2ColumnsString(pay.getCustomerMobile(), ""); -// } -// print2ColumnsString(pay.getTransDate(), pay.getTransTime()); -// print2ColumnsString(pay.getTransType().replace("_", " "), pay.getVoucherNo()); -// if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) { -// print2ColumnsString(pay.getReferNo() + "(RRN)", ""); -// print2ColumnsString(isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled), ""); -// } else { -// print2ColumnsString(pay.getQrTransId(), ""); -// print2ColumnsString(isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) , ""); -// } - } emptyLine(1); + // ============================= + // ✅ ACCUMULATE TOTAL + COUNT PER CURRENCY + // ============================= + CurrencySummary summary = currencyMap.getOrDefault(currency, new CurrencySummary()); + if (isNeedMinusSign) { - totalAmount -= pay.getAmount(); + summary.total -= pay.getAmount(); } else { - totalAmount += pay.getAmount(); + summary.total += pay.getAmount(); } + + summary.count++; // ✅ count per currency + + currencyMap.put(currency, summary); } + // ============================= + // PRINT SUMMARY + // ============================= if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) { + boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); + print2ColumnsString("CARD", ""); print3ColumnsString("TYPE ", "COUNT", "AMOUNT"); - print3ColumnsString("CARD", " " + countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled), true); + + for (Map.Entry entry : currencyMap.entrySet()) { + + String currency = entry.getKey(); + CurrencySummary summary = entry.getValue(); + + print3ColumnsString( + "CARD", + " " + countStringFormat(summary.count), + currency + " " + PrintUtils.getInstance() + .getSeparatorNumberFormat(summary.total, isDecimalEnabled), + true + ); + } + } else if (hostType == HostType.QR) { + boolean isDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable(); + print2ColumnsString("PAYMENT", ""); print3ColumnsString("TYPE ", "COUNT", "AMOUNT"); -// emptyLine(1); - print3ColumnsString("QR PAY", " "+ countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled), true); + + for (Map.Entry entry : currencyMap.entrySet()) { + + String currency = entry.getKey(); + CurrencySummary summary = entry.getValue(); + + print3ColumnsString( + "QR PAY", + " " + countStringFormat(summary.count), + currency + " " + PrintUtils.getInstance() + .getSeparatorNumberFormat(summary.total, isDecimalEnabled), + true + ); + } } -// emptyLine(2); } protected void printQRSettlementTransDetail(List lists) { From d145cf321f97a7f9cac782478f1e5e59b5f84df7 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Wed, 1 Apr 2026 00:56:59 +0630 Subject: [PATCH 053/101] summary report fixed for Duel currency --- .../TransactionSummaryFragment.java | 11 +- .../paylibs/print/printx/BaseXPrint.java | 153 ++++++++++++++++++ .../paylibs/print/printx/PrintX.java | 2 + .../paylibs/print/printx/PrintXImpl.java | 18 ++- .../paylibs/print/printx/PrintXReceipt.java | 3 + 5 files changed, 181 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/management/TransactionSummaryFragment.java b/app/src/main/java/com/utsmm/kbz/ui/management/TransactionSummaryFragment.java index 9b618f6..3ba9106 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/management/TransactionSummaryFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/management/TransactionSummaryFragment.java @@ -51,6 +51,8 @@ public class TransactionSummaryFragment extends DataBindingFragment { final Calendar myCalendar = Calendar.getInstance(); final Calendar myCalendar2 = Calendar.getInstance(); + ArrayList filteredLists = new ArrayList<>(); + @Override protected void initViewModel() { managementViewModel = getFragmentScopeViewModel(ManagementViewModel.class); @@ -251,13 +253,12 @@ public class TransactionSummaryFragment extends DataBindingFragment { Counter refund = new Counter(); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy HH:mm", Locale.getDefault()); - ArrayList filteredLists = new ArrayList<>(); - - // Filter transactions by date + for (PayDetail pay : payDetailList) { try { Date transDate = formatter.parse(pay.getTransDate()); - if (yesterday.compareTo(transDate) <= 0) { + if ((transDate.after(start) || transDate.equals(start)) && + (transDate.before(end) || transDate.equals(end))) { filteredLists.add(pay); } } catch (ParseException e) { @@ -366,7 +367,7 @@ public class TransactionSummaryFragment extends DataBindingFragment { private void printReceipt(PayDetail payDetail) { try { LogUtil.d(TAG, "Starting receipt print"); - PrintXReceipt.getInstance().printSmileSummaryReport(payDetail, sharedViewModel.hostType.getValue(), new PrintXStatus() { + PrintXReceipt.getInstance().printSmileSummaryReport(payDetail, filteredLists, sharedViewModel.hostType.getValue(), new PrintXStatus() { @Override public void onSuccess() { LogUtil.d(TAG, "Receipt printed successfully"); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index 6f98e9e..57c48f7 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -760,6 +760,159 @@ public abstract class BaseXPrint { } + class TempSummary { + int saleCount, voidSaleCount, refundCount, cashOutCount; + int qrPayCount, qrRefundCount; + int preAuthCompCount, preAuthCompVoidCount; + + long saleAmount, voidSaleAmount, refundAmount, cashOutAmount; + long qrPayAmount, qrRefundAmount; + long preAuthCompAmount, preAuthCompVoidAmount; + } + + protected void printTransDetailSummary(PayDetail payDetail, List list) { + + if (list == null || list.isEmpty()) { + printErrorBlock("NO TRANSACTION FOUND"); + printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false); + return; + } + + Map currencyMap = new HashMap<>(); + + for (PayDetail item : list) { + + if (item == null) continue; + + String currency = item.getCurrencyCode(); + TempSummary s = currencyMap.get(currency); + + if (s == null) { + s = new TempSummary(); + currencyMap.put(currency, s); + } + + String transType = item.getTransType(); + long amount = item.getAmount(); + + switch (transType) { + + case "SALE": + s.saleCount++; + s.saleAmount += amount; + break; + + case "VOID_SALE": + s.voidSaleCount++; + s.voidSaleAmount += amount; + break; + + case "REFUND": + s.refundCount++; + s.refundAmount += amount; + break; + + case "CASH_OUT": + s.cashOutCount++; + s.cashOutAmount += amount; + break; + + case "QR_PAY": + s.qrPayCount++; + s.qrPayAmount += amount; + break; + + case "QR_REFUND": + s.qrRefundCount++; + s.qrRefundAmount += amount; + break; + + case "PREAUTH_COMP": + s.preAuthCompCount++; + s.preAuthCompAmount += amount; + break; + + case "PREAUTH_COMP_VOID": + s.preAuthCompVoidCount++; + s.preAuthCompVoidAmount += amount; + break; + } + } + + boolean isQrDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable(); + boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); + + for (String currency : currencyMap.keySet()) { + + TempSummary data = currencyMap.get(currency); + + printer.appendPrnStr( currencyCodeToText(currency) + " " +"Transactions", fontNormal, AlignEnum.LEFT, false); + emptyLine(1); + + printer.appendPrnStr("(COUNT)TRANS", "AMOUNT(" + currencyCodeToText(currency) + ")", fontNormal, false); + + if (data.saleCount > 0) { + printer.appendPrnStr("(" + data.saleCount + ")SALES", + PrintUtils.getInstance().getSeparatorNumberFormat(data.saleAmount, isDecimalEnabled), + fontNormal, false); + } + + if (data.voidSaleCount > 0) { + printer.appendPrnStr("(" + data.voidSaleCount + ")VOID SALES", + "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.voidSaleAmount, isDecimalEnabled), + fontNormal, false); + } + + if (data.cashOutCount > 0) { + printer.appendPrnStr("(" + data.cashOutCount + ")CASH OUT", + PrintUtils.getInstance().getSeparatorNumberFormat(data.cashOutAmount, isDecimalEnabled), + fontNormal, false); + } + + if (data.refundCount > 0) { + printer.appendPrnStr("(" + data.refundCount + ")REFUND", + "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.refundAmount, isDecimalEnabled), + fontNormal, false); + } + + if (data.preAuthCompCount > 0) { + printer.appendPrnStr("(" + data.preAuthCompCount + ")PREAUTH COMP", + PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthCompAmount, isDecimalEnabled), + fontNormal, false); + } + + if (data.preAuthCompVoidCount > 0) { + printer.appendPrnStr("(" + data.preAuthCompVoidCount + ")VOID PREAUTH COMPLETE", + "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthCompVoidAmount, isDecimalEnabled), + fontNormal, false); + } + + if (data.qrPayCount > 0) { + printer.appendPrnStr("(" + data.qrPayCount + ")QR PAY", + PrintUtils.getInstance().getSeparatorNumberFormat(data.qrPayAmount, isQrDecimalEnabled), + fontNormal, false); + } + + if (data.qrRefundCount > 0) { + printer.appendPrnStr("(" + data.qrRefundCount + ")QR REFUND", + "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.qrRefundAmount, isQrDecimalEnabled), + fontNormal, false); + } + + dotBreak(); + + long totalAmount = + (data.saleAmount + data.cashOutAmount + data.preAuthCompAmount + data.qrPayAmount) + - (data.voidSaleAmount + data.refundAmount + data.preAuthCompVoidAmount + data.qrRefundAmount); + + printer.appendPrnStr(currencyCodeToText(currency) + " " + "TOTAL", + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled), + fontNormal, false); + + emptyLine(2); + } + } + /* private void backup(){ SettleData settleData = payDetail.getSettleDataObj(); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintX.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintX.java index 97c8e5a..871de4e 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintX.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintX.java @@ -20,6 +20,8 @@ public interface PrintX { void printSmileSummaryReport(PayDetail payDetail, HostType hostType, PrintXStatus printXStatus); + void printSmileSummaryReport(PayDetail payDetail, List list, HostType hostType, PrintXStatus printXStatus); + void printSmileSettlementReport(PayDetail payDetail,PrintXStatus printXStatus); void printQRSettlementReport(PayDetail payDetail, List list, PrintXStatus printXStatus); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java index 44c43d0..b521e8c 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java @@ -222,6 +222,8 @@ public class PrintXImpl extends BaseXPrint implements PrintX { e.printStackTrace(); } } + + @Override public void printDetailReport(PayDetail payDetail, List lists, HostType hostType,PrintXStatus printXStatus) { @@ -431,7 +433,6 @@ public class PrintXImpl extends BaseXPrint implements PrintX { this.callbackStatus = printXStatus; try { // LogUtil.d(TAG, payDetail.getSettleDataObj().toString()); - setHeight(0x12); printLogo(); printMerchantHeader(); @@ -447,6 +448,21 @@ public class PrintXImpl extends BaseXPrint implements PrintX { } } + @Override + public void printSmileSummaryReport(PayDetail payDetail, List list, HostType hostType, PrintXStatus printXStatus) { + this.callbackStatus = printXStatus; + try { + setHeight(0x12); + printLogo(); + printMerchantHeader(); + printTranHeader("SUMMARY REPORT"); + printTransDetailSummary(payDetail, list); + startPrintNex(); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + @Override public void printTerminalConfig(PrintXStatus printXStatus) { this.callbackStatus = printXStatus; diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXReceipt.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXReceipt.java index 8db6d73..4f13d7b 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXReceipt.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXReceipt.java @@ -59,6 +59,9 @@ public class PrintXReceipt { public void printSmileSummaryReport(PayDetail payDetail, HostType hostType, PrintXStatus printXStatus) { printX.printSmileSummaryReport(payDetail, hostType, printXStatus); } + public void printSmileSummaryReport(PayDetail payDetail,List list, HostType hostType, PrintXStatus printXStatus) { + printX.printSmileSummaryReport(payDetail, list, hostType, printXStatus); + } public void printTerminalHostConfig(PrintXStatus printXStatus){ printX.printTerminalConfig(printXStatus); From 6cd27b64820a765ab3dc930b17d37c69e4d589cf Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:32:26 +0630 Subject: [PATCH 054/101] new fields in e-receipt --- .../kbz/ui/core_ui/ProcessingFragment.java | 60 +++++++++++++++++-- .../model/e_receipt/EReceiptCardRequest.java | 33 +++++++++- 2 files changed, 86 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java index 18b2c6a..a1656be 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java @@ -20,8 +20,10 @@ import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest; import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.baselib.util.TimeoutCallback; import com.utsmyanmar.paylibs.model.TradeData; +import com.utsmyanmar.paylibs.print.PrintUtils; import com.utsmyanmar.paylibs.reversal.ReversalAction; import com.utsmyanmar.paylibs.reversal.ReversalListener; +import com.utsmyanmar.paylibs.system.BaseErrorCode; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; import com.utsmm.kbz.BR; import com.utsmm.kbz.R; @@ -316,6 +318,18 @@ public class ProcessingFragment extends DataBindingFragment { safeNavigateToRouteId(); } + private void handleAfterTransaction() { + if (SystemParamsOperation.getInstance().getDemoStatus()) { + delayFunctionCall(() -> { + sharedViewModel.dismissLoadingMsg(); + callNextScreen(); + }, 1500); + } else { + sharedViewModel.dismissLoadingMsg(); + callNextScreen(); + } + } + private void observeData(ProcessingTransaction processingTransaction) { processingTransaction.getTransStatus().observe(getViewLifecycleOwner(), transResultStatus -> { @@ -327,9 +341,13 @@ public class ProcessingFragment extends DataBindingFragment { switch (transResultStatus) { case FAIL: - sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, false, "FAILED")); + sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, false, BaseErrorCode.getCode(payDetail.getTradeAnswerCode()))); + handleAfterTransaction(); + break; case SUCCESS: - sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, true, "SUCCESS")); + sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, true, BaseErrorCode.getCode(payDetail.getTradeAnswerCode()))); + handleAfterTransaction(); + break; case OFFLINE_SUCCESS: if(SystemParamsOperation.getInstance().getDemoStatus()) { delayFunctionCall(()->{ @@ -346,7 +364,7 @@ public class ProcessingFragment extends DataBindingFragment { break; case OFFLINE_FAILURE: - sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, false, "FAILED")); + sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, false, BaseErrorCode.getCode(payDetail.getTradeAnswerCode()))); sharedViewModel.dismissLoadingMsg(); sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_offline_failure)); navigateToError(); @@ -509,6 +527,16 @@ public class ProcessingFragment extends DataBindingFragment { default: return currency; // Already alphabetic? return as-is } } + + private String formatDE43(String value) { + if (value == null) value = ""; + + if (value.length() > 40) { + return value.substring(0, 40); + } + + return String.format("%-40s", value); // right pad with space + } private EReceiptCardRequest buildEReceiptCardReceipt(PayDetail payDetail, boolean isSuccess, String reason){ //current timestamp String currentTimestamp = new java.text.SimpleDateFormat( @@ -526,16 +554,30 @@ public class ProcessingFragment extends DataBindingFragment { double realAmount = payDetail.getAmount() / 100.0; DecimalFormat df = new DecimalFormat("0.00"); String amount = df.format(realAmount); + + String rawName = PrintUtils.getInstance() + .getCardHolderName(payDetail.getCardHolderName()); + String secondLine = PrintUtils.getInstance() + .processNameSpaceSecondLine(rawName); + + String firstLine = PrintUtils.getInstance() + .processNameSpaceFirstLine(rawName, secondLine); + + + String cardHolderName = firstLine + + (secondLine.isEmpty() ? "" : " " + secondLine); + EReceiptCardRequest request = new EReceiptCardRequest(); - request.setDE2(payDetail.getCardNo()); + request.setDE2(PrintUtils.getInstance().maskCardNumberPciDss(payDetail.getCardNo())); request.setDE3(mapDE3ToShortCode(payDetail.getProcessCode())); request.setDE4(amount); request.setDE7(currentTimestamp); request.setDE11(payDetail.getVoucherNo()); - request.setDE22(mapTransactionType(payDetail.getTransactionType())); +// request.setDE22(mapTransactionType(payDetail.getTransactionType())); + request.setDE22(PrintUtils.getInstance().getEntryType(payDetail.getCardType())); request.setDE37(payDetail.getReferNo()); - request.setDE38(payDetail.getAuthNo()); + request.setDE38(payDetail.getApprovalCode()); request.setDE39(isSuccess ? "A" : "E"); request.setDE41(terminalId); request.setDE42(merchantId); @@ -544,6 +586,12 @@ public class ProcessingFragment extends DataBindingFragment { request.setInvoiceNumber(payDetail.getInvoiceNo()); request.setAppId(appId); request.setDescription(reason); + request.setBatchNumber(payDetail.batchNo); + request.setDE55(payDetail.getAppLabel()); + request.setCardLabel(payDetail.getAccountType()); + request.setDE14(PrintUtils.getInstance().getFormatExpDate(payDetail.getEXPDate())); + request.setDE43(formatDE43(cardHolderName)); + request.setDE48(payDetail.getAID()); return request; } diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/network/model/e_receipt/EReceiptCardRequest.java b/baselib/src/main/java/com/utsmyanmar/baselib/network/model/e_receipt/EReceiptCardRequest.java index 8d8fd39..be05387 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/network/model/e_receipt/EReceiptCardRequest.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/network/model/e_receipt/EReceiptCardRequest.java @@ -18,10 +18,19 @@ public class EReceiptCardRequest { private String DE11; private String description; private String DE38; - + private String batchNumber; + private String DE55; + private String DE14; + private String cardLabel; + private String DE43; + private String DE48; + public EReceiptCardRequest() {} // GETTERS + public String getDE14(){ return DE14;} + public String getCardLabel(){ return cardLabel;} + public String getDE43(){return DE43;} public String getDE3() { return DE3; } @@ -61,6 +70,8 @@ public class EReceiptCardRequest { public String getAppId(){ return appId; } + + public String getDE55(){return DE55;} public String getInvoiceNumber(){ return invoiceNumber; @@ -75,6 +86,7 @@ public class EReceiptCardRequest { public String getDE2(){ return DE2; } public String getDE38(){ return DE38; } public String getDE22(){ return DE22; } + public String getBatchNumber(){ return batchNumber; } // SETTERS public void setDE3(String DE3) { this.DE3 = DE3; @@ -132,4 +144,23 @@ public class EReceiptCardRequest { public void setDE38(String DE38){ this.DE38 = DE38; } public void setDE22(String DE22){ this.DE22 = DE22; } + + public void setBatchNumber(String batchNumber) { + this.batchNumber = batchNumber; + } + public void setDE55(String DE55){ + this.DE55 = DE55; + } + public void setDE14(String DE14){ + this.DE14 = DE14; + } + public void setCardLabel(String cardLabel){ + this.cardLabel = cardLabel; + } + public void setDE43(String DE43){ + this.DE43 = DE43; + } + public void setDE48(String DE48){ + this.DE48 = DE48; + } } From 18eda34bff24191c327e26c444d22e978fdb566c Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:44:51 +0630 Subject: [PATCH 055/101] Update BaseXPrint.java --- .../java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index 57c48f7..d2c3beb 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -524,7 +524,7 @@ public abstract class BaseXPrint { printer.appendPrnStr("BTH NO:" + batchNum, fontNormal, AlignEnum.LEFT,false); } else { // printer.printColumnsString(new String[]{"BATCH NO :" + batchNum, "INV NO: " + invoiceNo}, new int[]{2, 2}, new int[]{0, 2}, null); - printer.appendPrnStr("BTH NO:" + batchNum + " TRACE NO:" + traceNo, fontNormal, AlignEnum.LEFT,false); + printer.appendPrnStr("BTH NO:" + batchNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false); } // printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false); From cb96ccb7ca92db17fbc7694b05e2d927b3d1c7aa Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:49:47 +0630 Subject: [PATCH 056/101] Update TransactionSummaryFragment.java --- .../TransactionSummaryFragment.java | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/management/TransactionSummaryFragment.java b/app/src/main/java/com/utsmm/kbz/ui/management/TransactionSummaryFragment.java index 3ba9106..3fc4a4e 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/management/TransactionSummaryFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/management/TransactionSummaryFragment.java @@ -226,10 +226,15 @@ public class TransactionSummaryFragment extends DataBindingFragment { } } - private SettleData processTransactionData(List payDetailList, SimpleDateFormat formatter, - Date yesterday, Date start, Date end) { + private SettleData processTransactionData(List payDetailList, + SimpleDateFormat formatter, + Date yesterday, + Date start, + Date end) { try { - // Create a local helper class for readable mutability + // ✅ IMPORTANT: clear old data + filteredLists.clear(); + class Counter { int count = 0; long amount = 0L; @@ -252,37 +257,32 @@ public class TransactionSummaryFragment extends DataBindingFragment { Counter preAuthCompVoid = new Counter(); Counter refund = new Counter(); + // ✅ Use ONE consistent format SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy HH:mm", Locale.getDefault()); - + for (PayDetail pay : payDetailList) { try { - Date transDate = formatter.parse(pay.getTransDate()); - if ((transDate.after(start) || transDate.equals(start)) && - (transDate.before(end) || transDate.equals(end))) { - filteredLists.add(pay); - } - } catch (ParseException e) { - LogUtil.e(TAG, "Error parsing transaction date: " + e.getMessage()); - } - } - - LogUtil.d(TAG, "Filtered transactions count: " + filteredLists.size()); - - // Process filtered transactions - for (PayDetail pay : filteredLists) { - try { + // ✅ Combine date + time correctly Date currentDate = sdf.parse(pay.transDate + " " + pay.transTime); - if ((currentDate.after(start) || currentDate.equals(start)) && - (currentDate.before(end) || currentDate.equals(end))) { + if (currentDate == null) continue; + + // ✅ Correct inclusive range check + if (!currentDate.before(start) && !currentDate.after(end)) { + + // ✅ Keep filtered list for printing + filteredLists.add(pay); if (sharedViewModel.hostType.getValue() == HostType.QR) { + if (pay.getTransactionType() == TransactionsType.MMQR.value && pay.getQrTransStatus() == 1) { wave.inc(pay.amount); } else if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value && pay.getQrTransStatus() == 1) { waveRefund.inc(pay.amount); } + } else if (sharedViewModel.hostType.getValue() == HostType.MPU) { + if (pay.getTransactionType() == TransactionsType.VOID.value) { voidTran.inc(pay.amount); } else if (pay.getTransactionType() == TransactionsType.SALE.value) { @@ -302,11 +302,14 @@ public class TransactionSummaryFragment extends DataBindingFragment { } } } + } catch (ParseException e) { LogUtil.e(TAG, "Error parsing transaction datetime: " + e.getMessage()); } } + LogUtil.d(TAG, "Filtered transactions count: " + filteredLists.size()); + return new SettleData( sale.count, sale.amount, wave.count, wave.amount, @@ -319,6 +322,7 @@ public class TransactionSummaryFragment extends DataBindingFragment { refund.count, refund.amount, waveRefund.count, waveRefund.amount ); + } catch (Exception e) { LogUtil.e(TAG, "Error processing transaction data: " + e.getMessage()); return null; From 4a2a7fca67e10c01bee5d1606bd01a200f08c497 Mon Sep 17 00:00:00 2001 From: kizzy Date: Wed, 1 Apr 2026 14:36:17 +0700 Subject: [PATCH 057/101] settlement fixed for e-receipt --- .../SettlementTransactionFragment.java | 1 + .../ui/settlement/SettlementViewModel.java | 6 +++ .../java/com/utsmm/kbz/util/EReceiptUtil.java | 54 ++++++++++++++----- .../test/java/com/utsmm/kbz/GeneralTest.java | 14 +++++ baselib/src/main/res/raw/contacts_config.json | 23 ++++++++ 5 files changed, 85 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java index 0ad6730..fae2aac 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java @@ -491,6 +491,7 @@ public class SettlementTransactionFragment extends DataBindingFragment implement showLoadingDialog("Sending Batch Upload..."); break; case ON_SUCCESS: + updateData(); dismissLoadingDialog(); networkCutOver(); break; diff --git a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java index 8a3f5bb..951443f 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java @@ -392,6 +392,12 @@ public class SettlementViewModel extends ViewModel { } + if(isLast) { + payDetail.setCurrencyCode("104"); + } else { + payDetail.setCurrencyCode("840"); + } + // CA:CA - CD - FT payDetail.setBatchNo(SystemParamsOperation.getInstance().getCurrentBatchNum()); //for print receipt diff --git a/app/src/main/java/com/utsmm/kbz/util/EReceiptUtil.java b/app/src/main/java/com/utsmm/kbz/util/EReceiptUtil.java index 49f329c..6c6ab26 100644 --- a/app/src/main/java/com/utsmm/kbz/util/EReceiptUtil.java +++ b/app/src/main/java/com/utsmm/kbz/util/EReceiptUtil.java @@ -160,11 +160,16 @@ public class EReceiptUtil { return request; } + private String getDecimalAmount(long amount) { + double realAmount = amount / 100.0; + DecimalFormat df = new DecimalFormat("0.00"); + return df.format(realAmount); + } + public EReceiptRequest generateMPUReceipt(PayDetail payDetail) { - double realAmount = payDetail.getAmount() / 100.0; - DecimalFormat df = new DecimalFormat("0.00"); - String amount = df.format(realAmount); + + String amount = getDecimalAmount(payDetail.getAmount()); String currentTimeStamp = new java.text.SimpleDateFormat("MMddHHmmss", java.util.Locale.getDefault()) .format(new java.util.Date()); @@ -178,26 +183,27 @@ public class EReceiptUtil { SettleData settleData = payDetail.getSettleDataObj(); long totalAmt = settleData.getSaleAmount() + settleData.getRefundAmount() + settleData.getPreAuthCompAmount() + settleData.getCashAdvanceAmount(); - double realTotalAmount = totalAmt / 100.0; - String totalAmount = df.format(realTotalAmount); - request.setDE4(totalAmount); + + request.setDE4(getDecimalAmount(totalAmt)); request.setDE63_01(settleData.getSaleCount() + ""); - request.setDE63_02(settleData.getSaleAmount() + ""); + request.setDE63_02(getDecimalAmount(settleData.getSaleAmount())); request.setDE63_03(settleData.getRefundCount() + ""); - request.setDE63_04(settleData.getRefundAmount() + ""); + request.setDE63_04(getDecimalAmount(settleData.getRefundAmount())); request.setDE63_05(settleData.getPreAuthCompCount() + ""); - request.setDE63_06(settleData.getPreAuthCompAmount() + ""); + request.setDE63_06(getDecimalAmount(settleData.getPreAuthCompAmount())); request.setDE63_07(settleData.getCashAdvanceCount() + ""); - request.setDE63_08(settleData.getCashAdvanceAmount() + ""); + request.setDE63_08(getDecimalAmount(settleData.getCashAdvanceAmount())); invoiceNo = SystemParamsOperation.getInstance().getIncrementInvoiceNum(); request.setBatchNumber(batchNumber); request.setInvoiceNumber(invoiceNo); request.setDescription("success"); request.setDE39("A"); request.setDE37("0000"); - request.setDE49("MMK"); + request.setDE49(currencyCodeToText(payDetail.getCurrencyCode())); + + } else { request.setDE2(POSUtil.getInstance().getCardNumMasking(payDetail.getCardNo())); @@ -207,9 +213,9 @@ public class EReceiptUtil { request.setDE37(payDetail.getReferNo()); request.setDE38(payDetail.getApprovalCode()); // will check it later for currency code - request.setDE49("MMK"); + request.setDE49(currencyCodeToText(payDetail.getCurrencyCode())); request.setInvoiceNumber(payDetail.getInvoiceNo()); - request.setCardLabel("MPU"); + request.setCardLabel(payDetail.getAccountType()); if (payDetail.getTradeAnswerCode().equals("000") || payDetail.getTradeAnswerCode().equals("00")) { @@ -279,6 +285,28 @@ public class EReceiptUtil { return request; } + private String currencyCodeToText(String currencyCode) { + String currencyText = "MMK"; + switch (currencyCode) { + case "840": + currencyCode = "USD"; + break; + case "156": + currencyCode = "RMB"; + break; + case "764": + currencyCode = "THB"; + break; + case "643": + currencyCode = "RUB"; + break; + default: + currencyCode = "MMK"; + break; + } + return currencyCode; + } + private static List buildTransactions(List qrSettleData) { List list = new ArrayList<>(); diff --git a/app/src/test/java/com/utsmm/kbz/GeneralTest.java b/app/src/test/java/com/utsmm/kbz/GeneralTest.java index 74c314a..33550d7 100644 --- a/app/src/test/java/com/utsmm/kbz/GeneralTest.java +++ b/app/src/test/java/com/utsmm/kbz/GeneralTest.java @@ -4,6 +4,7 @@ import com.utsmyanmar.baselib.util.EReceiptHelper; import org.junit.Test; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -21,6 +22,19 @@ public class GeneralTest { } + @Test + public void testDecimalAmount() { + long amount = 0L; + String decimalAmount = getDecimalAmount(amount); + System.out.println("amount :"+decimalAmount); + } + + private String getDecimalAmount(long amount) { + double realAmount = amount / 100.0; + DecimalFormat df = new DecimalFormat("0.00"); + return df.format(realAmount); + } + private static String generateSignature(String timestamp) { String secret = "y812J21lhha11OS"; String bodyString = "{}"; diff --git a/baselib/src/main/res/raw/contacts_config.json b/baselib/src/main/res/raw/contacts_config.json index f147bdb..10f0e00 100644 --- a/baselib/src/main/res/raw/contacts_config.json +++ b/baselib/src/main/res/raw/contacts_config.json @@ -1,4 +1,27 @@ [ + { + "aidEnable": true, + "aid": "A000000003", + "cardScheme": "VISA", + "applicationVersion": "0020", + "emvDDOL": "9F3704", + "emvTDOL": "9F3704", + "partialAidSelection": false, + "targetPercent": "99", + "maxTargetPercent": "99", + "threshold": "00000040", + "tacDefault": "D84000A800", + "tacOnline": "DC4004F800", + "tacDenial": "0010000000", + "floorLimit": "000000000000", + "cvmLimit": 75000, + "transLimit": "999999999999", + "transLimitCDV": "999999999999", + "terminalCapability": "0000000000000000", + "riskManageData": "01", + "cateCode": "2701", + "currencyCode": "0104" + }, { "aidEnable": true, "aid": "A0000000031010", From ac7bff26b93dfd84df5cad3db8ed1213093b484b Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Wed, 1 Apr 2026 14:38:37 +0630 Subject: [PATCH 058/101] Update BaseXPrint.java --- .../java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index d2c3beb..6a7a8f7 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -1422,6 +1422,7 @@ public abstract class BaseXPrint { String transType = payDetail.getTransType(); String batchNum = ""; String traceNum = payDetail.getVoucherNo(); + boolean isDuelCurrency = SystemParamsOperation.getInstance().getDuelCurrencyStatus(); String currencySign = currencyCodeToText(payDetail.getCurrencyCode()); boolean isSettlement = payDetail.getTransactionType() == TransactionsType.SETTLEMENT.value; @@ -1448,6 +1449,10 @@ public abstract class BaseXPrint { }else{ printer.appendPrnStr("MID :" + payDetail.getMerchantNo(), fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr("TID :" + payDetail.getTerminalNo(), fontNormal, AlignEnum.LEFT,false); + if(isDuelCurrency){ + printer.appendPrnStr("MID :" + safe(SystemParamsOperation.getInstance().getThirdHostMerchantId()), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("TID :" + safe(SystemParamsOperation.getInstance().getThirdHostTerminalId()), fontNormal, AlignEnum.LEFT, false); + } } if(isSettlement) { From 1f01c40a416196df42cebe3246989d6e15d4fee4 Mon Sep 17 00:00:00 2001 From: kizzy Date: Wed, 1 Apr 2026 16:40:24 +0700 Subject: [PATCH 059/101] visa added aid --- baselib/src/main/res/raw/contacts_config.json | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/baselib/src/main/res/raw/contacts_config.json b/baselib/src/main/res/raw/contacts_config.json index 10f0e00..3a2aca1 100644 --- a/baselib/src/main/res/raw/contacts_config.json +++ b/baselib/src/main/res/raw/contacts_config.json @@ -68,6 +68,52 @@ "cateCode": "2701", "currencyCode": "0104" }, + { + "aidEnable": true, + "aid": "A0000000030000", + "cardScheme": "VISA", + "applicationVersion": "0020", + "emvDDOL": "9F3704", + "emvTDOL": "9F3704", + "partialAidSelection": false, + "targetPercent": "99", + "maxTargetPercent": "99", + "threshold": "00000040", + "tacDefault": "D84000A800", + "tacOnline": "DC4004F800", + "tacDenial": "0010000000", + "floorLimit": "000000000000", + "cvmLimit": 75000, + "transLimit": "999999999999", + "transLimitCDV": "999999999999", + "terminalCapability": "0000000000000000", + "riskManageData": "01", + "cateCode": "2701", + "currencyCode": "0104" + }, + { + "aidEnable": true, + "aid": "A000000003000000", + "cardScheme": "VISA", + "applicationVersion": "0020", + "emvDDOL": "9F3704", + "emvTDOL": "9F3704", + "partialAidSelection": false, + "targetPercent": "99", + "maxTargetPercent": "99", + "threshold": "00000040", + "tacDefault": "D84000A800", + "tacOnline": "DC4004F800", + "tacDenial": "0010000000", + "floorLimit": "000000000000", + "cvmLimit": 75000, + "transLimit": "999999999999", + "transLimitCDV": "999999999999", + "terminalCapability": "0000000000000000", + "riskManageData": "01", + "cateCode": "2701", + "currencyCode": "0104" + }, { "aidEnable": true, "aid": "A000000003101001", From e2fc293e6b82e6b210c36dfee715d5eb9b867b8e Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Wed, 1 Apr 2026 20:52:09 +0630 Subject: [PATCH 060/101] toast show when e-receipt success and failed --- app/build.gradle | 4 ++-- .../main/java/com/utsmm/kbz/MainActivity.java | 3 ++- .../ui/core_viewmodel/SharedViewModel.java | 19 ++++++++++++++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6c38b39..9abc76d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId "com.utsmm.kbz" minSdk 24 targetSdk 33 - versionCode 25 - versionName "2.5" + versionCode 28 + versionName "2.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/utsmm/kbz/MainActivity.java b/app/src/main/java/com/utsmm/kbz/MainActivity.java index 27cebfc..2c87574 100644 --- a/app/src/main/java/com/utsmm/kbz/MainActivity.java +++ b/app/src/main/java/com/utsmm/kbz/MainActivity.java @@ -178,6 +178,7 @@ public class MainActivity extends AppCompatActivity implements private void initViewModels() { sharedViewModel = new ViewModelProvider(this).get(SharedViewModel.class); + sharedViewModel.getToastMsg().observe(this, this::showToast); } private void setupUI() { @@ -674,4 +675,4 @@ public class MainActivity extends AppCompatActivity implements private void showToast(String message) { Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java index 903af51..0a4cc12 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java @@ -1,5 +1,6 @@ package com.utsmm.kbz.ui.core_viewmodel; +import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.util.Log; import android.widget.ListView; @@ -163,6 +164,7 @@ public class SharedViewModel extends ViewModel { public MutableLiveData loadingView = new MutableLiveData<>(8); public SingleLiveEvent loadingMsg = new SingleLiveEvent<>(); + private final SingleLiveEvent toastMsg = new SingleLiveEvent<>(); private SingleLiveEvent isFallback = new SingleLiveEvent<>(); private SingleLiveEvent isSeePhone = new SingleLiveEvent<>(); @@ -295,6 +297,14 @@ public class SharedViewModel extends ViewModel { loadingMsg.setValue(""); } + public SingleLiveEvent getToastMsg() { + return toastMsg; + } + + public void postToastMsg(String msg) { + toastMsg.postValue(msg); + } + public Observable getParams(SiriusRequest siriusRequest) { return repository.getParams(siriusRequest); } @@ -471,13 +481,17 @@ public class SharedViewModel extends ViewModel { } + @SuppressLint("CheckResult") public void pushReceipt(Object body){ Log.d("push receipt", new Gson().toJson(body)); repository.sendReceipt(body) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( - response -> Log.d("E-Receipt", "Success =>"+ response.getMessage()), + response -> { + Log.d("E-Receipt", "Success =>"+ response.getMessage()); + postToastMsg("E-Receipt saved successfully"); + }, error -> { if (error instanceof HttpException) { HttpException httpEx = (HttpException) error; @@ -489,11 +503,14 @@ public class SharedViewModel extends ViewModel { // Parse JSON to model EReceiptResponse res = new Gson().fromJson(errorJson, EReceiptResponse.class); Log.e("E-Receipt", "Parsed Error => " + res.getMessage()); + postToastMsg("E-Receipt save failed!"); } catch (Exception e) { e.printStackTrace(); + postToastMsg("E-Receipt save failed!"); } } else { Log.e("E-Receipt", "Unexpected error => " + error.getMessage()); + postToastMsg("E-Receipt save failed!"); } } ); From f646c62362df7461da4076c7eb7541df106d8944 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:17:23 +0630 Subject: [PATCH 061/101] Update BaseXPrint.java --- .../utsmyanmar/paylibs/print/printx/BaseXPrint.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index 6a7a8f7..d3a1545 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -1447,11 +1447,15 @@ public abstract class BaseXPrint { if (payDetail.getTransactionType() == TransactionsType.MMQR.value || payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value){ printer.appendPrnStr("SHORT CODE :" + payDetail.getMerchantNo(), fontNormal, AlignEnum.LEFT,false); }else{ - printer.appendPrnStr("MID :" + payDetail.getMerchantNo(), fontNormal, AlignEnum.LEFT,false); - printer.appendPrnStr("TID :" + payDetail.getTerminalNo(), fontNormal, AlignEnum.LEFT,false); - if(isDuelCurrency){ + + if(isSettlement && isDuelCurrency){ + printer.appendPrnStr("MID :" + safe(SystemParamsOperation.getInstance().getMerchantId()), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("TID :" + safe(SystemParamsOperation.getInstance().getTerminalId()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("MID :" + safe(SystemParamsOperation.getInstance().getThirdHostMerchantId()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("TID :" + safe(SystemParamsOperation.getInstance().getThirdHostTerminalId()), fontNormal, AlignEnum.LEFT, false); + }else{ + printer.appendPrnStr("MID :" + payDetail.getMerchantNo(), fontNormal, AlignEnum.LEFT,false); + printer.appendPrnStr("TID :" + payDetail.getTerminalNo(), fontNormal, AlignEnum.LEFT,false); } } From e6851cba3b594d8006869cda36e1b918aa39e89c Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Sun, 5 Apr 2026 19:09:52 +0630 Subject: [PATCH 062/101] decimal toggel in card Receipt --- app/build.gradle | 4 +- .../paylibs/print/printx/BaseXPrint.java | 53 ++++++++++--------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9abc76d..f441132 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId "com.utsmm.kbz" minSdk 24 targetSdk 33 - versionCode 28 - versionName "2.8" + versionCode 26 + versionName "2.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index d3a1545..cbce4b2 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -244,6 +244,7 @@ public abstract class BaseXPrint { } protected void printTransDetailSettlement(PayDetail payDetail, List cardSettleDataList) { + boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); lineBreak(); print2SideStringMargin("CARD TYPE ","CARD NUMBER"); @@ -255,7 +256,7 @@ public abstract class BaseXPrint { for (CardSettleData cardSettleData:cardSettleDataList) { print2SideStringMargin(cardSettleData.getCardType(),PrintUtils.getInstance().maskCardNumberPciDss(cardSettleData.getCardNum())); print2SideStringMargin("XX/XX",cardSettleData.getInvoiceNum()); - print2SideStringMargin(cardSettleData.getTransType(),"MMK "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(),true)); + print2SideStringMargin(cardSettleData.getTransType(),"MMK "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isDecimalEnabled)); print2SideStringMargin(cardSettleData.getApprovalCode(),cardSettleData.getTransDate() + " " + cardSettleData.getTransTime() ); emptyLine(1); } @@ -266,23 +267,23 @@ public abstract class BaseXPrint { long totalAmount = settleData.getSaleAmount() + settleData.getPreAuthCompAmount() + settleData.getCashAdvanceAmount(); print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); - print3ColumnsString("SALE ", countStringFormat(settleData.getSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getSaleAmount())); - print3ColumnsString("VOID SALE ", countStringFormat(settleData.getVoidSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getVoidSaleAmount())); - print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount())); + print3ColumnsString("SALE ", countStringFormat(settleData.getSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getSaleAmount(), isDecimalEnabled)); + print3ColumnsString("VOID SALE ", countStringFormat(settleData.getVoidSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getVoidSaleAmount(), isDecimalEnabled)); + print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount(), isDecimalEnabled)); if (settleData.getCashAdvanceCount() != 0) - print3ColumnsString("CASH ADV ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount())); - print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount())); + print3ColumnsString("CASH ADV ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount(), isDecimalEnabled)); + print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount(), isDecimalEnabled)); emptyLine(1); printer.appendPrnStr("GRAND TOTAL", fontLarge, AlignEnum.LEFT,true); emptyLine(1); // print3ColumnsString("TOTAL(MMK) ", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount)); print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); - print3ColumnsString("SALE ", countStringFormat(settleData.getSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getSaleAmount())); - print3ColumnsString("VOID SALE ", countStringFormat(settleData.getVoidSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getVoidSaleAmount())); - print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount())); + print3ColumnsString("SALE ", countStringFormat(settleData.getSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getSaleAmount(), isDecimalEnabled)); + print3ColumnsString("VOID SALE ", countStringFormat(settleData.getVoidSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getVoidSaleAmount(), isDecimalEnabled)); + print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount(), isDecimalEnabled)); if (settleData.getCashAdvanceCount() != 0) - print3ColumnsString("CASH ADV ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount())); - print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount())); + print3ColumnsString("CASH ADV ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount(), isDecimalEnabled)); + print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount(), isDecimalEnabled)); emptyLine(2); @@ -292,19 +293,20 @@ public abstract class BaseXPrint { if (!summary.hasAnyValue()) { return; } + boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); int totalCount = summary.saleCount + summary.preAuthCompCount + summary.refundCount + summary.cashAdvanceCount; long totalAmount = summary.saleAmount + summary.preAuthCompAmount + summary.cashAdvanceAmount - summary.refundAmount; printString("CURRENCY : " + currencyLabel, true); print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); - print3ColumnsString("SALE ", countStringFormat(summary.saleCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.saleAmount)); - print3ColumnsString("PREAUTH COMP ", countStringFormat(summary.preAuthCompCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.preAuthCompAmount)); + print3ColumnsString("SALE ", countStringFormat(summary.saleCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.saleAmount, isDecimalEnabled)); + print3ColumnsString("PREAUTH COMP ", countStringFormat(summary.preAuthCompCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.preAuthCompAmount, isDecimalEnabled)); if (summary.cashAdvanceCount != 0) { - print3ColumnsString("CASH ADVANCE ", countStringFormat(summary.cashAdvanceCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.cashAdvanceAmount)); + print3ColumnsString("CASH ADVANCE ", countStringFormat(summary.cashAdvanceCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.cashAdvanceAmount, isDecimalEnabled)); } - print3ColumnsString("REFUND ", countStringFormat(summary.refundCount), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(summary.refundAmount)); - print3ColumnsString("TOTAL(" + currencyLabel + ")", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount)); + print3ColumnsString("REFUND ", countStringFormat(summary.refundCount), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(summary.refundAmount, isDecimalEnabled)); + print3ColumnsString("TOTAL(" + currencyLabel + ")", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled)); } private void applyCardSettlementSummary(CurrencySettlementSummary summary, CardSettleData cardSettleData) { @@ -428,10 +430,11 @@ public abstract class BaseXPrint { + boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); if (payDetail.getTradeAnswerCode().equals("00") || payDetail.getTradeAnswerCode().equals("000")) { if (payDetail.getTransactionType() == TransactionType.CASH_ADVANCE) { - print2ColumnsStringNoSpace("TXN AMOUNT", ":" + PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount())); - print2ColumnsStringNoSpace("TXN FEES", ":" + PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAdditionalAmount())); + print2ColumnsStringNoSpace("TXN AMOUNT", ":" + PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isDecimalEnabled)); + print2ColumnsStringNoSpace("TXN FEES", ":" + PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAdditionalAmount(), isDecimalEnabled)); } } dotBreak(); @@ -442,12 +445,12 @@ public abstract class BaseXPrint { printer.appendPrnStr("MMK " + PrintUtils.getInstance().getBalanceInquiryNumberFormat(payDetail.getAmount()), fontNormal, AlignEnum.LEFT,false); } else if (payDetail.getTransactionType() == TransactionType.VOID || payDetail.getTransactionType() == TransactionType.REFUND || payDetail.getTransactionType() == TransactionType.PRE_SALE_CANCEL || payDetail.getTransactionType() == TransactionType.PRE_SALE_COMPLETE_VOID) { - print2SideString("AMT:" + currencySign, "- " + PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount())); + print2SideString("AMT:" + currencySign, "- " + PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isDecimalEnabled)); } else if (payDetail.getTransactionType() == TransactionType.CASH_ADVANCE) { long totalAmount = payDetail.getAmount() + payDetail.getAdditionalAmount(); - print2SideString("AMT:" + currencySign, PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount)); + print2SideString("AMT:" + currencySign, PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled)); } else { - print2SideString("AMT:" + currencySign, PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount())); + print2SideString("AMT:" + currencySign, PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isDecimalEnabled)); } dotBreak(); } else { @@ -596,13 +599,14 @@ public abstract class BaseXPrint { dotBreak(); // check is pin change if (payDetail.getTradeAnswerCode().equals("00") || payDetail.getTradeAnswerCode().equals("000")) { + boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); String currencySign = currencyCodeToText(payDetail.getCurrencyCode()); // CurrencyType currencySign = currencyTextToCurrencyType(payDetail.getCurrencyCode()); if (payDetail.getTransactionType() == TransactionType.BALANCE_INQUIRY) { printer.appendPrnStr("MMK " + PrintUtils.getInstance().getBalanceInquiryNumberFormat(payDetail.getAmount()), fontNormal, AlignEnum.LEFT,true); } else { - print2SideString("AMT:" + currencySign, PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount())); + print2SideString("AMT:" + currencySign, PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isDecimalEnabled)); // printer.appendPrnStr("AMOUNT:" + currencySign + " " + PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount()), fontNormal, AlignEnum.LEFT,true); } dotBreak(); @@ -622,11 +626,12 @@ public abstract class BaseXPrint { private void printColumnString(String label, int count, long amount, boolean isNegative) { if (count > 0) { - String amountString = PrintUtils.getInstance().getSeparatorNumberFormat(amount); + boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); + String amountString = PrintUtils.getInstance().getSeparatorNumberFormat(amount, isDecimalEnabled); if (isNegative) { amountString = "-" + amountString; } - printer.appendPrnStr(label + countStringFormat(count) + MMK + " " + PrintUtils.getInstance().getSeparatorNumberFormat(amount), fontNormal, AlignEnum.LEFT,false); + printer.appendPrnStr(label + countStringFormat(count) + MMK + " " + amountString, fontNormal, AlignEnum.LEFT,false); } } From 2238988846d06de9a780f3ecf1d0d2852ef2ce01 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Sun, 5 Apr 2026 20:00:54 +0630 Subject: [PATCH 063/101] align col in summary report --- .../paylibs/print/printx/BaseXPrint.java | 47 ++++++++----------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index cbce4b2..172cd81 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -854,63 +854,51 @@ public abstract class BaseXPrint { printer.appendPrnStr( currencyCodeToText(currency) + " " +"Transactions", fontNormal, AlignEnum.LEFT, false); emptyLine(1); - printer.appendPrnStr("(COUNT)TRANS", "AMOUNT(" + currencyCodeToText(currency) + ")", fontNormal, false); +// printer.appendPrnStr("(COUNT)TRANS", "AMOUNT(" + currencyCodeToText(currency) + ")", fontNormal, false); + print3ColumnsStringWithAlign("COUNT", "TRANS", "AMOUNT" + "(" + currencyCodeToText(currency) + ")", fontNormal, false); if (data.saleCount > 0) { - printer.appendPrnStr("(" + data.saleCount + ")SALES", + print3ColumnsStringWithAlign("(" + data.saleCount + ")", + "SALES", PrintUtils.getInstance().getSeparatorNumberFormat(data.saleAmount, isDecimalEnabled), fontNormal, false); } if (data.voidSaleCount > 0) { - printer.appendPrnStr("(" + data.voidSaleCount + ")VOID SALES", + print3ColumnsStringWithAlign("(" + data.voidSaleCount + ")", + "VOID", "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.voidSaleAmount, isDecimalEnabled), fontNormal, false); } if (data.cashOutCount > 0) { - printer.appendPrnStr("(" + data.cashOutCount + ")CASH OUT", + print3ColumnsStringWithAlign("(" + data.cashOutCount + ")", + "CASH ADV", PrintUtils.getInstance().getSeparatorNumberFormat(data.cashOutAmount, isDecimalEnabled), fontNormal, false); } if (data.refundCount > 0) { - printer.appendPrnStr("(" + data.refundCount + ")REFUND", + print3ColumnsStringWithAlign("(" + data.refundCount + ")", + "REFUND", "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.refundAmount, isDecimalEnabled), fontNormal, false); } if (data.preAuthCompCount > 0) { - printer.appendPrnStr("(" + data.preAuthCompCount + ")PREAUTH COMP", + print3ColumnsStringWithAlign("(" + data.preAuthCompCount + ")", + "PREAUTH COMP", PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthCompAmount, isDecimalEnabled), fontNormal, false); } - if (data.preAuthCompVoidCount > 0) { - printer.appendPrnStr("(" + data.preAuthCompVoidCount + ")VOID PREAUTH COMPLETE", - "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthCompVoidAmount, isDecimalEnabled), - fontNormal, false); - } - - if (data.qrPayCount > 0) { - printer.appendPrnStr("(" + data.qrPayCount + ")QR PAY", - PrintUtils.getInstance().getSeparatorNumberFormat(data.qrPayAmount, isQrDecimalEnabled), - fontNormal, false); - } - - if (data.qrRefundCount > 0) { - printer.appendPrnStr("(" + data.qrRefundCount + ")QR REFUND", - "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.qrRefundAmount, isQrDecimalEnabled), - fontNormal, false); - } - dotBreak(); long totalAmount = - (data.saleAmount + data.cashOutAmount + data.preAuthCompAmount + data.qrPayAmount) - - (data.voidSaleAmount + data.refundAmount + data.preAuthCompVoidAmount + data.qrRefundAmount); + (data.saleAmount + data.cashOutAmount + data.preAuthCompAmount) + - (data.voidSaleAmount + data.refundAmount + data.preAuthCompVoidAmount); - printer.appendPrnStr(currencyCodeToText(currency) + " " + "TOTAL", + printer.appendPrnStr( "TOTAL"+ " " + currencyCodeToText(currency), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled), fontNormal, false); @@ -1010,6 +998,11 @@ public abstract class BaseXPrint { // printer.appendPrnStr(first + " " + second + " " + third, fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr(first + " " + second + " " + third, fontNormal, AlignEnum.LEFT,isBold); } + + protected void print3ColumnsStringWithAlign(String first, String second, String third, int font, boolean isBold){ + String fixedSizeString = String.format("%-5s", first); + printer.appendPrnStr(fixedSizeString + " " + second, third, font, isBold); + } protected void dotBreak(){ printer.appendPrnStr(new String(new char[29]).replace("\0", "."), fontNormal, AlignEnum.CENTER, false); From 820dcf9aa672b134f27a19d2c1843ef4641078b8 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Mon, 6 Apr 2026 00:13:41 +0630 Subject: [PATCH 064/101] fix of summary report bug --- .../paylibs/print/printx/BaseXPrint.java | 303 +++++++++++++----- .../paylibs/print/printx/PrintXImpl.java | 2 +- 2 files changed, 227 insertions(+), 78 deletions(-) diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index 172cd81..f069caf 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -767,15 +767,169 @@ public abstract class BaseXPrint { class TempSummary { int saleCount, voidSaleCount, refundCount, cashOutCount; + int preAuthSaleCount, preAuthVoidCount; int qrPayCount, qrRefundCount; int preAuthCompCount, preAuthCompVoidCount; long saleAmount, voidSaleAmount, refundAmount, cashOutAmount; + long preAuthSaleAmount, preAuthVoidAmount; long qrPayAmount, qrRefundAmount; long preAuthCompAmount, preAuthCompVoidAmount; } + private void applyTempSummary(TempSummary summary, PayDetail item) { + int transactionType = item.getTransactionType(); + long amount = item.getAmount(); + + if (transactionType == TransactionsType.SALE.value) { + summary.saleCount++; + summary.saleAmount += amount; + return; + } + + if (transactionType == TransactionsType.VOID.value) { + summary.voidSaleCount++; + summary.voidSaleAmount += amount; + return; + } + + if (transactionType == TransactionsType.REFUND.value) { + summary.refundCount++; + summary.refundAmount += amount; + return; + } + + if (transactionType == TransactionsType.CASH_OUT.value) { + summary.cashOutCount++; + summary.cashOutAmount += amount; + return; + } + + if (transactionType == TransactionsType.PRE_AUTH_SALE.value) { + summary.preAuthSaleCount++; + summary.preAuthSaleAmount += amount; + return; + } + + if (transactionType == TransactionsType.PRE_AUTH_VOID.value) { + summary.preAuthVoidCount++; + summary.preAuthVoidAmount += amount; + return; + } + + if (transactionType == TransactionsType.MMQR.value) { + summary.qrPayCount++; + summary.qrPayAmount += amount; + return; + } + + if (transactionType == TransactionsType.MMQR_REFUND.value) { + summary.qrRefundCount++; + summary.qrRefundAmount += amount; + return; + } + + if (transactionType == TransactionsType.PRE_AUTH_COMPLETE.value) { + summary.preAuthCompCount++; + summary.preAuthCompAmount += amount; + return; + } + + if (transactionType == TransactionsType.PRE_AUTH_COMPLETE_VOID.value) { + summary.preAuthCompVoidCount++; + summary.preAuthCompVoidAmount += amount; + return; + } + + String transType = item.getTransType() == null ? "" : item.getTransType().trim().toUpperCase(Locale.getDefault()); + + switch (transType) { + case "SALE": + summary.saleCount++; + summary.saleAmount += amount; + break; + + case "VOID SALE": + case "VOID_SALE": + summary.voidSaleCount++; + summary.voidSaleAmount += amount; + break; + + case "REFUND": + summary.refundCount++; + summary.refundAmount += amount; + break; + + case "PRE-AUTH": + case "PRE_AUTH_SALE": + summary.preAuthSaleCount++; + summary.preAuthSaleAmount += amount; + break; + + case "PREAUTH CANCELLATION": + case "PRE_AUTH_VOID": + summary.preAuthVoidCount++; + summary.preAuthVoidAmount += amount; + break; + + case "CASH OUT": + case "CASH_OUT": + case "CASH_ADVANCE": + summary.cashOutCount++; + summary.cashOutAmount += amount; + break; + + case "QR_PAY": + summary.qrPayCount++; + summary.qrPayAmount += amount; + break; + + case "QR_REFUND": + summary.qrRefundCount++; + summary.qrRefundAmount += amount; + break; + + case "PREAUTH COMPLETION": + case "PRE_AUTH_COMPLETE": + case "PREAUTH_COMP": + summary.preAuthCompCount++; + summary.preAuthCompAmount += amount; + break; + + case "VOID PREAUTH COMPLETE": + case "PRE_AUTH_COMPLETE_VOID": + case "PREAUTH_COMP_VOID": + summary.preAuthCompVoidCount++; + summary.preAuthCompVoidAmount += amount; + break; + } + } + + private boolean matchesSummaryHostType(PayDetail item, HostType hostType) { + if (hostType == null || item == null) { + return true; + } + + int transactionType = item.getTransactionType(); + + if (hostType == HostType.QR) { + return transactionType == TransactionsType.MMQR.value + || transactionType == TransactionsType.MMQR_REFUND.value; + } + + if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) { + return transactionType != TransactionsType.MMQR.value + && transactionType != TransactionsType.MMQR_REFUND.value; + } + + return true; + } + protected void printTransDetailSummary(PayDetail payDetail, List list) { + printTransDetailSummary(payDetail, list, null); + } + + protected void printTransDetailSummary(PayDetail payDetail, List list, HostType hostType) { if (list == null || list.isEmpty()) { printErrorBlock("NO TRANSACTION FOUND"); @@ -788,6 +942,7 @@ public abstract class BaseXPrint { for (PayDetail item : list) { if (item == null) continue; + if (!matchesSummaryHostType(item, hostType)) continue; String currency = item.getCurrencyCode(); TempSummary s = currencyMap.get(currency); @@ -796,52 +951,14 @@ public abstract class BaseXPrint { s = new TempSummary(); currencyMap.put(currency, s); } - - String transType = item.getTransType(); - long amount = item.getAmount(); - switch (transType) { + applyTempSummary(s, item); + } - case "SALE": - s.saleCount++; - s.saleAmount += amount; - break; - - case "VOID_SALE": - s.voidSaleCount++; - s.voidSaleAmount += amount; - break; - - case "REFUND": - s.refundCount++; - s.refundAmount += amount; - break; - - case "CASH_OUT": - s.cashOutCount++; - s.cashOutAmount += amount; - break; - - case "QR_PAY": - s.qrPayCount++; - s.qrPayAmount += amount; - break; - - case "QR_REFUND": - s.qrRefundCount++; - s.qrRefundAmount += amount; - break; - - case "PREAUTH_COMP": - s.preAuthCompCount++; - s.preAuthCompAmount += amount; - break; - - case "PREAUTH_COMP_VOID": - s.preAuthCompVoidCount++; - s.preAuthCompVoidAmount += amount; - break; - } + if (currencyMap.isEmpty()) { + printErrorBlock("NO TRANSACTION FOUND"); + printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false); + return; } boolean isQrDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable(); @@ -850,6 +967,7 @@ public abstract class BaseXPrint { for (String currency : currencyMap.keySet()) { TempSummary data = currencyMap.get(currency); + boolean isQrHost = hostType == HostType.QR; printer.appendPrnStr( currencyCodeToText(currency) + " " +"Transactions", fontNormal, AlignEnum.LEFT, false); emptyLine(1); @@ -857,49 +975,80 @@ public abstract class BaseXPrint { // printer.appendPrnStr("(COUNT)TRANS", "AMOUNT(" + currencyCodeToText(currency) + ")", fontNormal, false); print3ColumnsStringWithAlign("COUNT", "TRANS", "AMOUNT" + "(" + currencyCodeToText(currency) + ")", fontNormal, false); - if (data.saleCount > 0) { - print3ColumnsStringWithAlign("(" + data.saleCount + ")", - "SALES", - PrintUtils.getInstance().getSeparatorNumberFormat(data.saleAmount, isDecimalEnabled), - fontNormal, false); - } + if (isQrHost) { + if (data.qrPayCount > 0) { + print3ColumnsStringWithAlign("(" + data.qrPayCount + ")", + "QR PAY", + PrintUtils.getInstance().getSeparatorNumberFormat(data.qrPayAmount, isQrDecimalEnabled), + fontNormal, false); + } - if (data.voidSaleCount > 0) { - print3ColumnsStringWithAlign("(" + data.voidSaleCount + ")", - "VOID", - "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.voidSaleAmount, isDecimalEnabled), - fontNormal, false); - } + if (data.qrRefundCount > 0) { + print3ColumnsStringWithAlign("(" + data.qrRefundCount + ")", + "QR REFUND", + "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.qrRefundAmount, isQrDecimalEnabled), + fontNormal, false); + } + } else { + if (data.saleCount > 0) { + print3ColumnsStringWithAlign("(" + data.saleCount + ")", + "SALES", + PrintUtils.getInstance().getSeparatorNumberFormat(data.saleAmount, isDecimalEnabled), + fontNormal, false); + } - if (data.cashOutCount > 0) { - print3ColumnsStringWithAlign("(" + data.cashOutCount + ")", - "CASH ADV", - PrintUtils.getInstance().getSeparatorNumberFormat(data.cashOutAmount, isDecimalEnabled), - fontNormal, false); - } + if (data.voidSaleCount > 0) { + print3ColumnsStringWithAlign("(" + data.voidSaleCount + ")", + "VOID", + "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.voidSaleAmount, isDecimalEnabled), + fontNormal, false); + } - if (data.refundCount > 0) { - print3ColumnsStringWithAlign("(" + data.refundCount + ")", - "REFUND", - "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.refundAmount, isDecimalEnabled), - fontNormal, false); - } + if (data.cashOutCount > 0) { + print3ColumnsStringWithAlign("(" + data.cashOutCount + ")", + "CASH ADV", + PrintUtils.getInstance().getSeparatorNumberFormat(data.cashOutAmount, isDecimalEnabled), + fontNormal, false); + } - if (data.preAuthCompCount > 0) { - print3ColumnsStringWithAlign("(" + data.preAuthCompCount + ")", - "PREAUTH COMP", - PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthCompAmount, isDecimalEnabled), - fontNormal, false); + if (data.preAuthSaleCount > 0) { + print3ColumnsStringWithAlign("(" + data.preAuthSaleCount + ")", + "PRE-AUTH", + PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthSaleAmount, isDecimalEnabled), + fontNormal, false); + } + + if (data.preAuthVoidCount > 0) { + print3ColumnsStringWithAlign("(" + data.preAuthVoidCount + ")", + "PREAUTH VOID", + "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthVoidAmount, isDecimalEnabled), + fontNormal, false); + } + + if (data.refundCount > 0) { + print3ColumnsStringWithAlign("(" + data.refundCount + ")", + "REFUND", + "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.refundAmount, isDecimalEnabled), + fontNormal, false); + } + + if (data.preAuthCompCount > 0) { + print3ColumnsStringWithAlign("(" + data.preAuthCompCount + ")", + "PREAUTH COMP", + PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthCompAmount, isDecimalEnabled), + fontNormal, false); + } } dotBreak(); - long totalAmount = - (data.saleAmount + data.cashOutAmount + data.preAuthCompAmount) - - (data.voidSaleAmount + data.refundAmount + data.preAuthCompVoidAmount); + long totalAmount = isQrHost + ? data.qrPayAmount - data.qrRefundAmount + : (data.saleAmount + data.cashOutAmount + data.preAuthSaleAmount + data.preAuthCompAmount) + - (data.voidSaleAmount + data.preAuthVoidAmount + data.refundAmount + data.preAuthCompVoidAmount); printer.appendPrnStr( "TOTAL"+ " " + currencyCodeToText(currency), - PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled), + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isQrHost ? isQrDecimalEnabled : isDecimalEnabled), fontNormal, false); emptyLine(2); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java index b521e8c..4acbb91 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java @@ -456,7 +456,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX { printLogo(); printMerchantHeader(); printTranHeader("SUMMARY REPORT"); - printTransDetailSummary(payDetail, list); + printTransDetailSummary(payDetail, list, hostType); startPrintNex(); } catch (RemoteException e) { e.printStackTrace(); From 71b4403adc6c3c4187cb344b57dc9b2c6d0f208f Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Mon, 6 Apr 2026 00:29:27 +0630 Subject: [PATCH 065/101] Update BaseXPrint.java --- .../com/utsmyanmar/paylibs/print/printx/BaseXPrint.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index f069caf..6001bed 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -1192,7 +1192,8 @@ public abstract class BaseXPrint { printString("CARD NO :" + PrintUtils.getInstance().maskCardNumberPciDss(pay.getCardNo())); printString("TRACE NO :" + pay.getVoucherNo()); printString("RRN :" + pay.getReferNo()); - printString("DATE :" + POSUtil.getInstance().formatDisplayDate(pay.getTransDate()) + " " + pay.getTransTime()); + printString("DATE :" + POSUtil.getInstance().formatDisplayDate(pay.getTransDate())); + printString(" " + pay.getTransTime()); printString("TYPE :" + pay.getTransType().replace("_", " ")); printString("AMOUNT :" + (isNeedMinusSign @@ -1210,7 +1211,8 @@ public abstract class BaseXPrint { (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value ? "QR PAYMENT" : pay.getCustomerMobile())); - printString("DATE :" + POSUtil.getInstance().formatDisplayDate(pay.getTransDate()) + " " + pay.getTransTime()); + printString("DATE :" + POSUtil.getInstance().formatDisplayDate(pay.getTransDate())); + printString(" " + pay.getTransTime()); printString("TRACE NO:" + pay.getVoucherNo()); if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) { From 833d4b823e8fe9b6991633eee82b7b30884c68f2 Mon Sep 17 00:00:00 2001 From: kizzy Date: Mon, 6 Apr 2026 12:14:56 +0700 Subject: [PATCH 066/101] fixed refund for MPU --- .../utsmm/kbz/ui/core_ui/InputRRNFragment.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java index 6e40d14..7c195ce 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java @@ -551,16 +551,16 @@ public class InputRRNFragment extends DataBindingFragment { // } } else { - terminatedTransRefund(isECR); +// terminatedTransRefund(isECR); -// PayDetail newPay = transProcessViewModel.getPayDetail(); -// newPay.setReferNo(rrnNo); -// -// transProcessViewModel.setPayDetail(newPay); -// -// sharedViewModel.rrNNo.setValue(rrnNo); -// -// callNextScreen(); + PayDetail newPay = transProcessViewModel.getPayDetail(); + newPay.setReferNo(rrnNo); + + transProcessViewModel.setPayDetail(newPay); + + sharedViewModel.rrNNo.setValue(rrnNo); + + callNextScreen(); } } From cda1901d53b1d99b6c115df6eaad518420e646b1 Mon Sep 17 00:00:00 2001 From: kizzy Date: Mon, 6 Apr 2026 16:53:44 +0700 Subject: [PATCH 067/101] fix 1 for 8 digit bin visa --- .../main/java/com/utsmm/kbz/MainFragment.java | 11 ++- .../utsmyanmar/baselib/TerminalKeyUtil.java | 4 +- .../baselib/emv/EmvParamHelper.java | 3 +- baselib/src/main/res/raw/contacts_config.json | 92 +++---------------- baselib/src/main/res/raw/paywave_config.json | 26 +----- 5 files changed, 26 insertions(+), 110 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/MainFragment.java b/app/src/main/java/com/utsmm/kbz/MainFragment.java index 91be9b5..d359d3e 100644 --- a/app/src/main/java/com/utsmm/kbz/MainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/MainFragment.java @@ -278,9 +278,14 @@ public class MainFragment extends DataBindingFragment { } } -// for (AidEntity aidEntity : aidList) { -// LogUtil.d(TAG, "AID Entity :" + aidEntity.getAid()); -// } + for (AidEntity aidEntity : aidList) { + LogUtil.d(TAG, "AID Entity :" + aidEntity.getAid()); +// if(aidEntity.getAid().startsWith("A000000003")) { + LogUtil.d(TAG, "AID Entity AID:" + aidEntity.getAid()); + LogUtil.d(TAG, "AID Entity ASI:" + aidEntity.getAsi()); + LogUtil.d(TAG, "AID Entity Version:" + aidEntity.getAppVerNum()); +// } + } } diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java index 8ffc84a..8566f02 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java @@ -41,7 +41,8 @@ public final class TerminalKeyUtil { Arrays.fill(work_key_data, (byte) 0x31); PinPad pinPad = BaseApplication.getInstance().deviceEngine.getPinPad(); int result = pinPad.writeMKey(9, main_key_data, main_key_data.length); - + +// byte[] kcv = pinPad.calcWKeyKCV(9,WorkKeyTypeEnum.TDKEY); // // int resultPINKEY = pinPad.writeWKey(0, WorkKeyTypeEnum.PINKEY, work_key_data, work_key_data.length); @@ -54,6 +55,7 @@ public final class TerminalKeyUtil { // int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.BDK,IPEKByte,16,ksn); LogUtil.d(TAG, "save tmk key result: "+result); +// LogUtil.d(TAG, "save tmk kcv: "+ByteUtil.bytes2HexStr(kcv)); // byte[] encryptedPIK = SystemParamsOperation.getInstance().getKeyPIK().get(0); // diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvParamHelper.java b/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvParamHelper.java index bafad5f..405bd70 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvParamHelper.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvParamHelper.java @@ -412,7 +412,7 @@ public class EmvParamHelper { aidV2.setTransType("FF"); aidV2.setOnlinePinCap(1); - aidV2.setAsi(0); //1 + aidV2.setAsi(1); //1 // aidV2.setThreshold(99); if (!(contactAid.getCvmLimit() < 0)) { @@ -475,6 +475,7 @@ public class EmvParamHelper { private CapkEntity convertRidNex(RidEntity ridEntity) { CapkEntity capkV2 = new CapkEntity(); + if (ridEntity.getRid() != null && !ridEntity.getRid().isEmpty()) { capkV2.setRid(ridEntity.getRid()); } diff --git a/baselib/src/main/res/raw/contacts_config.json b/baselib/src/main/res/raw/contacts_config.json index 3a2aca1..ec4fcce 100644 --- a/baselib/src/main/res/raw/contacts_config.json +++ b/baselib/src/main/res/raw/contacts_config.json @@ -1,32 +1,10 @@ [ - { - "aidEnable": true, - "aid": "A000000003", - "cardScheme": "VISA", - "applicationVersion": "0020", - "emvDDOL": "9F3704", - "emvTDOL": "9F3704", - "partialAidSelection": false, - "targetPercent": "99", - "maxTargetPercent": "99", - "threshold": "00000040", - "tacDefault": "D84000A800", - "tacOnline": "DC4004F800", - "tacDenial": "0010000000", - "floorLimit": "000000000000", - "cvmLimit": 75000, - "transLimit": "999999999999", - "transLimitCDV": "999999999999", - "terminalCapability": "0000000000000000", - "riskManageData": "01", - "cateCode": "2701", - "currencyCode": "0104" - }, + { "aidEnable": true, "aid": "A0000000031010", "cardScheme": "VISA", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -49,53 +27,7 @@ "aidEnable": true, "aid": "A0000000032010", "cardScheme": "VISA", - "applicationVersion": "0020", - "emvDDOL": "9F3704", - "emvTDOL": "9F3704", - "partialAidSelection": false, - "targetPercent": "99", - "maxTargetPercent": "99", - "threshold": "00000040", - "tacDefault": "D84000A800", - "tacOnline": "DC4004F800", - "tacDenial": "0010000000", - "floorLimit": "000000000000", - "cvmLimit": 75000, - "transLimit": "999999999999", - "transLimitCDV": "999999999999", - "terminalCapability": "0000000000000000", - "riskManageData": "01", - "cateCode": "2701", - "currencyCode": "0104" - }, - { - "aidEnable": true, - "aid": "A0000000030000", - "cardScheme": "VISA", - "applicationVersion": "0020", - "emvDDOL": "9F3704", - "emvTDOL": "9F3704", - "partialAidSelection": false, - "targetPercent": "99", - "maxTargetPercent": "99", - "threshold": "00000040", - "tacDefault": "D84000A800", - "tacOnline": "DC4004F800", - "tacDenial": "0010000000", - "floorLimit": "000000000000", - "cvmLimit": 75000, - "transLimit": "999999999999", - "transLimitCDV": "999999999999", - "terminalCapability": "0000000000000000", - "riskManageData": "01", - "cateCode": "2701", - "currencyCode": "0104" - }, - { - "aidEnable": true, - "aid": "A000000003000000", - "cardScheme": "VISA", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -118,7 +50,7 @@ "aidEnable": true, "aid": "A000000003101001", "cardScheme": "VISA", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -141,7 +73,7 @@ "aidEnable": true, "aid": "A000000003101002", "cardScheme": "VISA", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -164,7 +96,7 @@ "aidEnable": true, "aid": "A000000003101003", "cardScheme": "VISA", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -187,7 +119,7 @@ "aidEnable": true, "aid": "A000000003101004", "cardScheme": "VISA", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -210,7 +142,7 @@ "aidEnable": true, "aid": "A000000003101005", "cardScheme": "VISA", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -233,7 +165,7 @@ "aidEnable": true, "aid": "A0000000033010", "cardScheme": "VISA", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -256,7 +188,7 @@ "aidEnable": true, "aid": "A0000000038010", "cardScheme": "VISA", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -279,7 +211,7 @@ "aidEnable": true, "aid": "A000000003101008", "cardScheme": "VISA", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -302,7 +234,7 @@ "aidEnable": true, "aid": "A000000003101009", "cardScheme": "VISA", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, diff --git a/baselib/src/main/res/raw/paywave_config.json b/baselib/src/main/res/raw/paywave_config.json index f3e6f43..a15cf97 100644 --- a/baselib/src/main/res/raw/paywave_config.json +++ b/baselib/src/main/res/raw/paywave_config.json @@ -1,29 +1,5 @@ [ - { - "aidEnable": true, - "aid": "A000000003", - "cardLabel": "VISA", - "applicationVersion": "0030", - "emvDDOL": "9F3704", - "emvTDOL": "9F3704", - "partialAidSelection": false, - "targetPercent": "00", - "maxTargetPercent": "00", - "threshold": "00000000", - "tacDefault": "DC4000A800", - "tacOnline": "DC4004F800", - "tacDenial": "0010000000", - "floorLimit": "000000000000", - "cvmLimit": 70000, - "transLimit": "999999999999", - "transLimitCDV": "999999999999", - "terminalCapability": "0000000000000000", - "riskManageData": "01", - "kernelType": "03", - "ttq": "32A04000", - "cateCode": "2701", - "currencyCode": "0104" - }, + { "aidEnable": true, "aid": "A0000000031010", From d0002fa92854f1e8deb95d996a8da2b193a81337 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Wed, 8 Apr 2026 12:05:48 +0630 Subject: [PATCH 068/101] amount hide if zero --- app/build.gradle | 4 ++-- app/src/main/res/layout/fragment_capture_card_screen.xml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f441132..21c9881 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId "com.utsmm.kbz" minSdk 24 targetSdk 33 - versionCode 26 - versionName "2.6" + versionCode 31 + versionName "2.11" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/res/layout/fragment_capture_card_screen.xml b/app/src/main/res/layout/fragment_capture_card_screen.xml index a479148..72c9d20 100644 --- a/app/src/main/res/layout/fragment_capture_card_screen.xml +++ b/app/src/main/res/layout/fragment_capture_card_screen.xml @@ -39,6 +39,7 @@ app:layout_constraintEnd_toEndOf="parent"> Date: Wed, 8 Apr 2026 12:19:34 +0630 Subject: [PATCH 069/101] fix amount --- .../java/com/utsmm/kbz/ui/core_ui/ProcessingCardFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingCardFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingCardFragment.java index 672ebb9..414b05a 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingCardFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingCardFragment.java @@ -202,7 +202,9 @@ public class ProcessingCardFragment extends DataBindingFragment { sharedViewModel.setCardDataExist(true); - if(sharedViewModel.getAmountExist().getValue() != null && !sharedViewModel.getAmountExist().getValue()) { + if(sharedViewModel.getTransMenu().getValue() != TransMenu.PRE_AUTH_FULL_VOID + && sharedViewModel.getAmountExist().getValue() != null + && !sharedViewModel.getAmountExist().getValue()) { routeId = R.id.action_processingCardFragment_to_inputAmountFragment; } From 56187a6639cc15de2fb0faac3b5c1879358eca29 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:04:17 +0630 Subject: [PATCH 070/101] 3 terminal capability --- .../com/utsmm/kbz/util/tms/TMSSetupsImpl.java | 19 ++-- .../baselib/viewModel/EmvBaseViewModel.java | 98 +++++++++++++++---- .../core_utils/SystemParamsOperation.java | 39 +++++++- .../core_utils/SystemParamsSettings.java | 31 +++++- 4 files changed, 154 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java index ead28dd..43a563f 100644 --- a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java +++ b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java @@ -582,13 +582,20 @@ public class TMSSetupsImpl implements TMSSetups{ emvParamOperation.updatePayPassCurrencyCode(data); - } else if (TextUtils.equals(name,"terminal_capability")) { - - if(!data.isEmpty()) { - SystemParamsOperation.getInstance().setTerminalCapability(data); + } else if (TextUtils.equals(name, "visa_terminal_capability")) { + if(!data.isEmpty()){ + SystemParamsOperation.getInstance().setVisaTerminalCapability(data); } - - } else if (TextUtils.equals(name,"upi_ttq")) { + }else if (TextUtils.equals(name, "master_terminal_capability")) { + if(!data.isEmpty()){ + SystemParamsOperation.getInstance().setMasterTerminalCapability(data); + } + } + else if (TextUtils.equals(name, "upi_terminal_capability")) { + if(!data.isEmpty()){ + SystemParamsOperation.getInstance().setUpiTerminalCapability(data); + } + }else if (TextUtils.equals(name,"upi_ttq")) { emvParamOperation.updateQuickPassTTQ(data); } else if (TextUtils.equals(name, "upi_tc_enabled")) { SystemParamsOperation.getInstance().setUpiTCEnabled(parseBoolean(data)); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index 755a890..be19874 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -590,39 +590,97 @@ public abstract class EmvBaseViewModel extends BaseViewModel { public void onTransInitBeforeGPO() { byte[] aid = emvHandler.getTlv(new byte[]{0x4F}, EmvDataSourceEnum.FROM_KERNEL); LogUtil.d(TAG, "onTransInitBeforeGPO :"); - String terminalCapability = SystemParamsOperation.getInstance().getTerminalCapability(); - LogUtil.d(TAG,"Terminal capability :"+terminalCapability); -// emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, new byte[]{(byte) 0xE0, (byte) 0x28, (byte) 0xC8}); - emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, ByteUtil.hexStr2Bytes(terminalCapability)); + + String visaTerminalCapability = SystemParamsOperation.getInstance().getVisaTerminalCapability(); + String masterTerminalCapability = SystemParamsOperation.getInstance().getMasterTerminalCapability(); + String upiTerminalCapability = SystemParamsOperation.getInstance().getUpiTerminalCapability(); + + String selectedTerminalCapability = ""; + + if (aid != null) { + String aidStr = ByteUtils.byteArray2HexString(aid).toUpperCase(); + + if (aidStr.contains("A000000003")) { + // VISA + selectedTerminalCapability = visaTerminalCapability; + } else if (aidStr.contains("A000000004")) { + // MasterCard + selectedTerminalCapability = masterTerminalCapability; + } else if (aidStr.contains("A000000333") || aidStr.contains("A000000025")) { + // UPI + selectedTerminalCapability = upiTerminalCapability; + } + } + + + //9F33 + emvHandler.setTlv( + new byte[]{(byte) 0x9F, (byte) 0x33}, + ByteUtil.hexStr2Bytes(selectedTerminalCapability) + ); + + // -------- Contactless -------- if (mPayDetail.getCardType() == CardTypeX.NFC.value) { if (aid != null) { - if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000004")) { - //Paypass + String aidStr = ByteUtils.byteArray2HexString(aid).toUpperCase(); + + if (aidStr.contains("A000000004")) { configPaypassParameter(aid); - } else if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000003")) { - //Paywave + } else if (aidStr.contains("A000000003")) { configPaywaveParameters(); - } else if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000025")) { - //ExpressPay -// configExpressPayParameter(); - } else if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000541")) { + } else if (aidStr.contains("A000000025")) { +// //imp + } else if (aidStr.contains("A000000541")) { configPureContactlessParameter(); - } else if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000065")) { + } else if (aidStr.contains("A000000065")) { configJcbContactlessParameter(); } } - } else { - //contact terminal capability ; if different card brand(depend on aid) have different terminal capability -// if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000004")) { -// emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, ByteUtil.hexStr2Bytes(terminalCapability)); -// emvHandler.setTlv(new byte[]{(byte) 0xE0, (byte) 0x1D}, ByteUtils.hexString2ByteArray("6C00800000000000"));//terminal risk -// -// } } emvHandler.onSetTransInitBeforeGPOResponse(true); } +// @Override +// public void onTransInitBeforeGPO() { +// byte[] aid = emvHandler.getTlv(new byte[]{0x4F}, EmvDataSourceEnum.FROM_KERNEL); +// LogUtil.d(TAG, "onTransInitBeforeGPO :"); +//// String terminalCapability = SystemParamsOperation.getInstance().getTerminalCapability(); +// String visaTerminalCapability = SystemParamsOperation.getInstance().getVisaTerminalCapability(); +// String masterTerminalCapability = SystemParamsOperation.getInstance().getMasterTerminalCapability(); +// String upiTerminalCapability = SystemParamsOperation.getInstance().getUpiTerminalCapability(); +//// LogUtil.d(TAG,"Terminal capability :"+terminalCapability); +//// emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, new byte[]{(byte) 0xE0, (byte) 0x28, (byte) 0xC8}); +// emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, ByteUtil.hexStr2Bytes(terminalCapability)); +// if (mPayDetail.getCardType() == CardTypeX.NFC.value) { +// if (aid != null) { +// if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000004")) { +// //Paypass +// configPaypassParameter(aid); +// } else if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000003")) { +// //Paywave +// configPaywaveParameters(); +// } else if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000025")) { +// //ExpressPay +//// configExpressPayParameter(); +// } else if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000541")) { +// configPureContactlessParameter(); +// } else if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000065")) { +// configJcbContactlessParameter(); +// } +// } +// } else { +// //contact terminal capability ; if different card brand(depend on aid) have different terminal capability +//// if (ByteUtils.byteArray2HexString(aid).toUpperCase().contains("A000000004")) { +//// emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x33}, ByteUtil.hexStr2Bytes(terminalCapability)); +//// emvHandler.setTlv(new byte[]{(byte) 0xE0, (byte) 0x1D}, ByteUtils.hexString2ByteArray("6C00800000000000"));//terminal risk +//// +//// } +// } +// +// emvHandler.onSetTransInitBeforeGPOResponse(true); +// } + @Override public void onConfirmCardNo(CardInfoEntity cardInfoEntity) { LogUtil.d(TAG, "onConfirmCardNo"); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java index 7ab2b9e..17d444b 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java @@ -653,15 +653,45 @@ public class SystemParamsOperation { return CurrencyType.valueOf(params.getCurrencyType()); } - public void setTerminalCapability(String terminalCapability) { +// public void setTerminalCapability(String terminalCapability) { +// SystemParamsSettings params = getSystemParamsSettings(); +// params.setTerminalCapability(terminalCapability); +// saveSystemParamsSettings(params); +// } +// +// public String getTerminalCapability() { +// SystemParamsSettings params = getSystemParamsSettings(); +// return params.getTerminalCapability(); +// } + public void setVisaTerminalCapability(String visaTerminalCapability){ SystemParamsSettings params = getSystemParamsSettings(); - params.setTerminalCapability(terminalCapability); + params.setVisaTerminalCapability(visaTerminalCapability); + saveSystemParamsSettings(params); + } + + public void setMasterTerminalCapability(String masterTerminalCapability){ + SystemParamsSettings params = getSystemParamsSettings(); + params.setMasterTerminalCapability(masterTerminalCapability); saveSystemParamsSettings(params); } - public String getTerminalCapability() { + public void setUpiTerminalCapability(String upiTerminalCapability){ SystemParamsSettings params = getSystemParamsSettings(); - return params.getTerminalCapability(); + params.setUpiTerminalCapability(upiTerminalCapability); + saveSystemParamsSettings(params); + } + + public String getVisaTerminalCapability(){ + SystemParamsSettings params = getSystemParamsSettings(); + return params.getVisaTerminalCapability(); + } + public String getMasterTerminalCapability(){ + SystemParamsSettings params = getSystemParamsSettings(); + return params.getMasterTerminalCapability(); + } + public String getUpiTerminalCapability(){ + SystemParamsSettings params = getSystemParamsSettings(); + return params.getUpiTerminalCapability(); } public void setAuthToken(String authToken) { @@ -1885,4 +1915,5 @@ public class SystemParamsOperation { return params.getPreAuthManual(); } + } diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java index 9816503..8de07b8 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java @@ -51,7 +51,10 @@ public class SystemParamsSettings implements Serializable { private String terminalName = ""; - private String terminalCapability = "E0E8C8"; +// private String terminalCapability = "E0E8C8"; + private String visaTerminalCapability = "E028C8"; + private String masterTerminalCapability = "E068C8"; + private String upiTerminalCapability = "E068C8"; private String ipAddress = ""; @@ -499,9 +502,31 @@ public class SystemParamsSettings implements Serializable { this.qrpay_inquiry_status = status; } - protected String getTerminalCapability() { return terminalCapability;} +// protected String getTerminalCapability() { return terminalCapability;} + protected String getVisaTerminalCapability(){ + return visaTerminalCapability; + } - protected void setTerminalCapability(String terminalCapability) { this.terminalCapability = terminalCapability; } + protected String getMasterTerminalCapability(){ + return masterTerminalCapability; + } + + protected String getUpiTerminalCapability(){ + return upiTerminalCapability; + } +// protected void setTerminalCapability(String terminalCapability) { this.terminalCapability = terminalCapability; } + + protected void setVisaTerminalCapability(String visaTerminalCapability){ + this.visaTerminalCapability = visaTerminalCapability; + } + + protected void setMasterTerminalCapability(String masterTerminalCapability){ + this.masterTerminalCapability = masterTerminalCapability; + } + + protected void setUpiTerminalCapability(String upiTerminalCapability){ + this.upiTerminalCapability = upiTerminalCapability; + } protected void setLastTransTime(String lastTransTime) { this.lastTransTime = lastTransTime; } From a8d0e9d182ffadd206f838c879379b184be5fc35 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:10:50 +0630 Subject: [PATCH 071/101] amount fix --- .../kbz/ui/core_ui/ConfirmTransactionFragment.java | 1 - .../com/utsmm/kbz/ui/core_ui/InputTraceNoFragment.java | 1 + .../main/res/layout/fragment_print_receipt_screen.xml | 2 +- .../utsmyanmar/paylibs/print/printx/BaseXPrint.java | 10 +++++----- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ConfirmTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ConfirmTransactionFragment.java index 109f350..42a19ce 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ConfirmTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ConfirmTransactionFragment.java @@ -246,7 +246,6 @@ public class ConfirmTransactionFragment extends DataBindingFragment implements D public void onConfirm(){ if (sharedViewModel.transactionsType.getValue() == TransactionsType.TIP_ADJUSTMENT) { - routeId = R.id.action_confirmTransactionFragment_to_inputTipAmountFragment; safeNavigateToRouteId(); diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputTraceNoFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputTraceNoFragment.java index 6fee0b4..54c2863 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputTraceNoFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputTraceNoFragment.java @@ -173,6 +173,7 @@ public class InputTraceNoFragment extends DataBindingFragment { } sharedViewModel.payDetail.setValue(payDetail); + sharedViewModel.setAmount(POSUtil.getInstance().getDecimalAmountSeparatorFormat(payDetail.getAmount())); if(sharedViewModel.hostType.getValue() == HostType.MPU) { boolean isMpu = "MPU".equals(payDetail.getAccountType()); diff --git a/app/src/main/res/layout/fragment_print_receipt_screen.xml b/app/src/main/res/layout/fragment_print_receipt_screen.xml index 4123609..5246a3f 100644 --- a/app/src/main/res/layout/fragment_print_receipt_screen.xml +++ b/app/src/main/res/layout/fragment_print_receipt_screen.xml @@ -187,7 +187,7 @@ Date: Thu, 9 Apr 2026 14:30:29 +0630 Subject: [PATCH 072/101] minify enabled --- app/build.gradle | 4 ++-- app/proguard-rules.pro | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 21c9881..4880dfd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,8 +49,8 @@ android { buildTypes { release { - minifyEnabled false - shrinkResources false + minifyEnabled true + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 91cbd61..700ec22 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -265,4 +265,5 @@ -dontshrink -dontwarn com.xgd.smartpos.manager.app.UsageInfo --dontwarn com.xgd.smartpos.manager.app.UsageStats \ No newline at end of file +-dontwarn com.xgd.smartpos.manager.app.UsageStats +-dontwarn javax.lang.model.element.Modifier \ No newline at end of file From ec7f04eb85635949c6344ea076b6c8ed1ee5b563 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:43:08 +0630 Subject: [PATCH 073/101] detail report with align column 3 --- .../paylibs/print/printx/BaseXPrint.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index 97a2b69..43093d6 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -1254,19 +1254,20 @@ public abstract class BaseXPrint { boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); print2ColumnsString("CARD", ""); - print3ColumnsString("TYPE ", "COUNT", "AMOUNT"); + print3ColumnsStringWithAlign("TYPE ", "COUNT", "AMOUNT", fontNormal, true); for (Map.Entry entry : currencyMap.entrySet()) { String currency = entry.getKey(); CurrencySummary summary = entry.getValue(); - print3ColumnsString( + print3ColumnsStringWithAlign( "CARD", " " + countStringFormat(summary.count), currency + " " + PrintUtils.getInstance() .getSeparatorNumberFormat(summary.total, isDecimalEnabled), - true + fontNormal, + false ); } @@ -1275,19 +1276,20 @@ public abstract class BaseXPrint { boolean isDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable(); print2ColumnsString("PAYMENT", ""); - print3ColumnsString("TYPE ", "COUNT", "AMOUNT"); + print3ColumnsStringWithAlign("TYPE ", "COUNT", "AMOUNT", fontNormal, true); for (Map.Entry entry : currencyMap.entrySet()) { String currency = entry.getKey(); CurrencySummary summary = entry.getValue(); - print3ColumnsString( + print3ColumnsStringWithAlign( "QR PAY", " " + countStringFormat(summary.count), currency + " " + PrintUtils.getInstance() .getSeparatorNumberFormat(summary.total, isDecimalEnabled), - true + fontNormal, + false ); } } From e45f61b4c24756f6c1ec032635687267cd3552ec Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:00:53 +0630 Subject: [PATCH 074/101] change trace num to inv num --- app/src/main/res/layout/fragment_input_invoice_screen.xml | 4 ++-- app/src/main/res/layout/fragment_trans_info_screen.xml | 4 ++-- .../java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/layout/fragment_input_invoice_screen.xml b/app/src/main/res/layout/fragment_input_invoice_screen.xml index 29f194a..f352d10 100644 --- a/app/src/main/res/layout/fragment_input_invoice_screen.xml +++ b/app/src/main/res/layout/fragment_input_invoice_screen.xml @@ -53,7 +53,7 @@ Date: Thu, 9 Apr 2026 15:09:34 +0630 Subject: [PATCH 075/101] fixTransactionType --- .../utsmm/kbz/ui/core_ui/ProcessingFragment.java | 16 +--------------- .../kbz/ui/core_viewmodel/SharedViewModel.java | 6 +++--- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java index a1656be..1b962f8 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java @@ -462,20 +462,6 @@ public class ProcessingFragment extends DataBindingFragment { }); } - - private String mapDE3ToShortCode(String de3) { - if (de3 == null) return "UNK"; - - switch (de3) { - case "000000": return "S"; // Sale - case "020000": return "V"; // Void - case "200000": return "R"; // Refund - case "030000": return "P"; // Preauth - case "310000": return "PC"; // Preauth Complete - } - return "UNK"; // Unknown - } - public static String mapTransactionType(int type) { switch (type) { case 1: // SALE @@ -570,7 +556,7 @@ public class ProcessingFragment extends DataBindingFragment { EReceiptCardRequest request = new EReceiptCardRequest(); request.setDE2(PrintUtils.getInstance().maskCardNumberPciDss(payDetail.getCardNo())); - request.setDE3(mapDE3ToShortCode(payDetail.getProcessCode())); + request.setDE3(mapTransactionType(payDetail.getTransactionType())); request.setDE4(amount); request.setDE7(currentTimestamp); request.setDE11(payDetail.getVoucherNo()); diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java index 0a4cc12..669fb1c 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java @@ -503,14 +503,14 @@ public class SharedViewModel extends ViewModel { // Parse JSON to model EReceiptResponse res = new Gson().fromJson(errorJson, EReceiptResponse.class); Log.e("E-Receipt", "Parsed Error => " + res.getMessage()); - postToastMsg("E-Receipt save failed!"); + postToastMsg("E-Receipt could not save!"); } catch (Exception e) { e.printStackTrace(); - postToastMsg("E-Receipt save failed!"); + postToastMsg("E-Receipt could not save!"); } } else { Log.e("E-Receipt", "Unexpected error => " + error.getMessage()); - postToastMsg("E-Receipt save failed!"); + postToastMsg("E-Receipt could not save!"); } } ); From 9b9d827d47fc992f76b3e270e5c4135d1884577f Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:30:30 +0630 Subject: [PATCH 076/101] clear reversal moved into "See More" --- .../kbz/ui/dashboard/DashboardTransFragment.java | 11 +++++++++++ .../java/com/utsmm/kbz/util/enums/FeaturesType.java | 5 +++-- app/src/main/java/com/utsmm/kbz/util/tms/TMSUtil.java | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java b/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java index 30be713..2302283 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java @@ -160,6 +160,9 @@ public class DashboardTransFragment extends DataBindingFragment { case CASH_ADVANCE: new DashboardTransFragment.ClickEvent().onClickCashAdvance(); break; + case CLEAR_REVERSAL: + new DashboardTransFragment.ClickEvent().onClickClearReversal(); + break; case DEVICE_CONFIG: new DashboardTransFragment.ClickEvent().onClickDeviceConfig(); break; @@ -272,6 +275,14 @@ public class DashboardTransFragment extends DataBindingFragment { }); } + + public void onClickClearReversal() { + sharedViewModel.transactionsType.postValue(TransactionsType.CLEAR_REVERSAL); + sharedViewModel.setTransMenu(TransMenu.CLEAR_REVERSAL); + routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment; + safeRouteTo(currentId, routeId, hostId); + } + public void onClickDeviceConfig(){ routeId = R.id.action_dashboardTransFragment_to_deviceConfig; safeRouteTo(currentId, routeId, hostId); diff --git a/app/src/main/java/com/utsmm/kbz/util/enums/FeaturesType.java b/app/src/main/java/com/utsmm/kbz/util/enums/FeaturesType.java index 7c92e7a..e1980f2 100644 --- a/app/src/main/java/com/utsmm/kbz/util/enums/FeaturesType.java +++ b/app/src/main/java/com/utsmm/kbz/util/enums/FeaturesType.java @@ -22,5 +22,6 @@ public enum FeaturesType { QR_INQUIRY, QR_REFUND, LOG_OUT, - DEVICE_CONFIG -} \ No newline at end of file + DEVICE_CONFIG, + CLEAR_REVERSAL +} diff --git a/app/src/main/java/com/utsmm/kbz/util/tms/TMSUtil.java b/app/src/main/java/com/utsmm/kbz/util/tms/TMSUtil.java index 9e27af4..bb85203 100644 --- a/app/src/main/java/com/utsmm/kbz/util/tms/TMSUtil.java +++ b/app/src/main/java/com/utsmm/kbz/util/tms/TMSUtil.java @@ -223,6 +223,7 @@ public class TMSUtil { // featuresList.add(new Features(5, fragmentActivity.getString(R.string.menu_wavepay_inquiry), R.drawable.ic_wave_status_dash, FeaturesType.WAVE_PAY_INQUIRY, wavePayInquiryStatus)); featuresList.add(new Features(1, fragmentActivity.getString(R.string.menu_cash_advance), R.drawable.ic_cash_advance, FeaturesType.CASH_ADVANCE, cashAdvanceStatus)); // featuresList.add(new Features(9, fragmentActivity.getString(R.string.menu_history), R.drawable.ic_history, FeaturesType.HISTORY, true)); + featuresList.add(new Features(11, "Clear Reversal", R.drawable.ic_clear_all, FeaturesType.CLEAR_REVERSAL, true)); featuresList.add(new Features(10, "Configs", R.drawable.ic_host, FeaturesType.DEVICE_CONFIG, true)); } From c9032de30d14151ed1bd30bdc77b560a8009a0fb Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 9 Apr 2026 16:13:19 +0630 Subject: [PATCH 077/101] hide/show auto-reversal --- .../main/java/com/utsmm/kbz/ui/SettingsFragment.java | 4 ++++ .../java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java | 2 ++ app/src/main/res/layout/fragment_settings_modern.xml | 4 +++- .../utils/core_utils/SystemParamsOperation.java | 12 +++++++++++- .../utils/core_utils/SystemParamsSettings.java | 9 +++++++++ 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/SettingsFragment.java b/app/src/main/java/com/utsmm/kbz/ui/SettingsFragment.java index 0b87604..43c422e 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/SettingsFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/SettingsFragment.java @@ -163,6 +163,10 @@ public class SettingsFragment extends DataBindingFragment { } private void updateReversalSettings() { + boolean isVisible = SystemParamsOperation.getInstance().getAutoReversalEnable(); + LogUtil.d("SettingsFragment", "isVisible " + isVisible); + binding.reversalCard.setVisibility(isVisible ? View.VISIBLE : View.GONE); + boolean isEnabled = SystemParamsOperation.getInstance().isReversalOn(); binding.reversalSwitch.setChecked(isEnabled); binding.reversalSummary.setText(isEnabled ? diff --git a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java index 43a563f..25069fc 100644 --- a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java +++ b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java @@ -654,6 +654,8 @@ public class TMSSetupsImpl implements TMSSetups{ } else if(TextUtils.equals(name, "pre_auth_manual_enabled")) { SystemParamsOperation.getInstance().setPreAuthManualEnabled(parseBoolean(data)); + }else if(TextUtils.equals(name, "auto_reversal_enable")) { + SystemParamsOperation.getInstance().setAutoReversalEnable(parseBoolean(data)); } } diff --git a/app/src/main/res/layout/fragment_settings_modern.xml b/app/src/main/res/layout/fragment_settings_modern.xml index 8796b87..a3d0d32 100644 --- a/app/src/main/res/layout/fragment_settings_modern.xml +++ b/app/src/main/res/layout/fragment_settings_modern.xml @@ -729,7 +729,9 @@ android:onClick="@{()->click.onReversalClick()}" app:cardBackgroundColor="@color/white" app:cardCornerRadius="16dp" - app:cardElevation="2dp"> + app:cardElevation="2dp" + + > Date: Thu, 9 Apr 2026 16:19:34 +0630 Subject: [PATCH 078/101] hide nav --- app/src/main/java/com/utsmm/kbz/MainActivity.java | 2 +- app/src/main/java/com/utsmm/kbz/MainFragment.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/MainActivity.java b/app/src/main/java/com/utsmm/kbz/MainActivity.java index 2c87574..b1ff9d9 100644 --- a/app/src/main/java/com/utsmm/kbz/MainActivity.java +++ b/app/src/main/java/com/utsmm/kbz/MainActivity.java @@ -441,7 +441,7 @@ public class MainActivity extends AppCompatActivity implements @Override public void onStop(){ super.onStop(); -// BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); + BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); // BaseApplication.getInstance().deviceEngine.getPlatform().enableHomeButton(); // BaseApplication.getInstance().deviceEngine.getPlatform().enableTaskButton(); } diff --git a/app/src/main/java/com/utsmm/kbz/MainFragment.java b/app/src/main/java/com/utsmm/kbz/MainFragment.java index d359d3e..4f2fc8c 100644 --- a/app/src/main/java/com/utsmm/kbz/MainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/MainFragment.java @@ -162,7 +162,7 @@ public class MainFragment extends DataBindingFragment { enableHomeButton(); // disableTaskButton(); // BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); - BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); +// BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); }); } From 9fdb22f5f5862f9be533c2122af8dda15241a2da Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Mon, 27 Apr 2026 11:19:02 +0630 Subject: [PATCH 079/101] tmk key changed --- .../kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java | 2 +- .../src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java index ceff41c..5b25285 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java @@ -83,7 +83,7 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements } else if (isOfflinePinEntered) { emvHandler.onSetPinInputResponse(true, false); } else { - emvHandler.onSetPinInputResponse(true, false); + emvHandler.onSetPinInputResponse(true, true); } if (transType.getValue() == TransactionsType.PRE_AUTH_COMPLETE || transType.getValue() == TransactionsType.PRE_AUTH_VOID || transType.getValue() == TransactionsType.REFUND) { emvResultStatus.postValue(EmvResultStatus.ON_NEXT_SCREEN); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java index 8566f02..0f166d7 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java @@ -22,7 +22,7 @@ public final class TerminalKeyUtil { public static final String TAG = TerminalKeyUtil.class.getSimpleName(); - private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); // KBZ UAT + private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("B4D74774CC846CAFF6D1AAAC2EB79CFF".toUpperCase()); // KBZ UAT // private static final byte[] main_key_usd_data = ByteUtil.hexStr2Bytes("3f4bcac6cc559ab12bbbc5a51118f3f5".toUpperCase()); // KBZ UAT // private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); // private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // MPU From 1f6031ae9e8b7d446a6b15f7c4bff779c7c0bdc4 Mon Sep 17 00:00:00 2001 From: kizzy Date: Mon, 27 Apr 2026 12:23:51 +0700 Subject: [PATCH 080/101] fixed for preAuth cancel, not allowing preauth cancel after partial pre comp was done. --- .../kbz/ui/core_ui/InputRRNFragment.java | 2 +- .../EmvTransactionProcessViewModel.java | 2 +- .../ui/core_viewmodel/InputRRNViewModel.java | 6 +++++ .../core_viewmodel/TransProcessViewModel.java | 3 +++ .../utsmyanmar/baselib/TerminalKeyUtil.java | 4 +-- .../baselib/db/dao/PayDetailDao.java | 4 +++ .../utsmyanmar/baselib/repo/Repository.java | 4 +++ .../baselib/viewModel/EmvBaseViewModel.java | 2 ++ baselib/src/main/res/raw/paywave_config.json | 26 ++++++++++++++++++- 9 files changed, 48 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java index 7c195ce..909c19a 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java @@ -201,7 +201,7 @@ public class InputRRNFragment extends DataBindingFragment { private void checkRRNPreAuthVoid(boolean isECR) { - rrnViewModel.searchPayDetail(cardNo,rrnNo).observe(getViewLifecycleOwner(), new Observer() { + rrnViewModel.searchPayDetailPreCancel(cardNo,rrnNo).observe(getViewLifecycleOwner(), new Observer() { @Override public void onChanged(PayDetail payDetail) { if(payDetail != null) { diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java index ceff41c..5b25285 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java @@ -83,7 +83,7 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements } else if (isOfflinePinEntered) { emvHandler.onSetPinInputResponse(true, false); } else { - emvHandler.onSetPinInputResponse(true, false); + emvHandler.onSetPinInputResponse(true, true); } if (transType.getValue() == TransactionsType.PRE_AUTH_COMPLETE || transType.getValue() == TransactionsType.PRE_AUTH_VOID || transType.getValue() == TransactionsType.REFUND) { emvResultStatus.postValue(EmvResultStatus.ON_NEXT_SCREEN); diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/InputRRNViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/InputRRNViewModel.java index b7f918d..afa3826 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/InputRRNViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/InputRRNViewModel.java @@ -41,6 +41,12 @@ public class InputRRNViewModel extends ViewModel { return repository.searchPayDetail(cardNo,rrn); } + public LiveData searchPayDetailPreCancel(String cardNo,String rrn) { + return repository.searchPayDetailPreCancel(cardNo,rrn); + } + + + public NumberKeyboard.KeyClickCallback onKeyClick(){ return new NumberKeyboard.KeyClickCallback() { diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/TransProcessViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/TransProcessViewModel.java index 3af3b10..7e0709a 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/TransProcessViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/TransProcessViewModel.java @@ -304,13 +304,16 @@ public class TransProcessViewModel extends ViewModel implements ProcessingTransa } @Override + public void processPreCompDb(PayDetail payResult) { if(oldTransPayDetail.getAmount() == payResult.getAmount()) { oldTransPayDetail.setIsCanceled(true); + oldTransPayDetail.setAdjust(true); updatePayDetail(oldTransPayDetail); } else { oldTransPayDetail.setIsCanceled(false); + oldTransPayDetail.setAdjust(true); updatePayDetail(oldTransPayDetail); } repository.insertPayDetail(updateCurrentDateAndTime(payResult)); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java index 8566f02..d405eac 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java @@ -42,7 +42,7 @@ public final class TerminalKeyUtil { PinPad pinPad = BaseApplication.getInstance().deviceEngine.getPinPad(); int result = pinPad.writeMKey(9, main_key_data, main_key_data.length); -// byte[] kcv = pinPad.calcWKeyKCV(9,WorkKeyTypeEnum.TDKEY); + byte[] kcv = pinPad.calcWKeyKCV(9,WorkKeyTypeEnum.ENCRYPTIONKEY); // // int resultPINKEY = pinPad.writeWKey(0, WorkKeyTypeEnum.PINKEY, work_key_data, work_key_data.length); @@ -55,7 +55,7 @@ public final class TerminalKeyUtil { // int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.BDK,IPEKByte,16,ksn); LogUtil.d(TAG, "save tmk key result: "+result); -// LogUtil.d(TAG, "save tmk kcv: "+ByteUtil.bytes2HexStr(kcv)); + LogUtil.d(TAG, "save tmk kcv: "+ByteUtil.bytes2HexStr(kcv)); // byte[] encryptedPIK = SystemParamsOperation.getInstance().getKeyPIK().get(0); // diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/db/dao/PayDetailDao.java b/baselib/src/main/java/com/utsmyanmar/baselib/db/dao/PayDetailDao.java index f1458af..60d6882 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/db/dao/PayDetailDao.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/db/dao/PayDetailDao.java @@ -143,6 +143,10 @@ public interface PayDetailDao { @Query(("SELECT * FROM paydetail WHERE isCanceled = 0 AND CardNo IN(:cardNo) AND referNo IN(:referNo)")) LiveData searchPayDetail(String cardNo,String referNo); + @Query(("SELECT * FROM paydetail WHERE isCanceled = 0 and isAdjust = 0 AND CardNo IN(:cardNo) AND referNo IN(:referNo)")) + LiveData searchPayDetailPreCancel(String cardNo,String referNo); + + @Query("SELECT * FROM paydetail WHERE isCanceled = 0 AND transactionType = 5") LiveData> getPreAuthCompData(); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java b/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java index 791cbac..f1de488 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java @@ -198,6 +198,10 @@ public class Repository { return payDetailDao.searchPayDetail(cardNo,referNo); } + public LiveData searchPayDetailPreCancel(String cardNo,String referNo) { + return payDetailDao.searchPayDetailPreCancel(cardNo,referNo); + } + public Flowable searchPayDetailByRefNum(String refNum) { return payDetailDao.searchPayDetailByRefNum(refNum); } diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index be19874..7def545 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -259,6 +259,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { + //for UPI UnionPayTransDataEntity unionPayTransDataEntity = new UnionPayTransDataEntity(); unionPayTransDataEntity.setQpbocForGlobal(true); @@ -271,6 +272,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { + // emvHandler.contactlessConfigKernelId(EmvCardBrandEnum.EMV_CARD_BRAND_JCB,(byte) 0x01,ByteUtils.hexString2ByteArray("06")); emvHandler.contactlessAppendAidIntoKernel(EmvCardBrandEnum.EMV_CARD_BRAND_MASTER, (byte) 0x08, ByteUtils.hexString2ByteArray("A000000732100123")); LogUtil.d(TAG, "TransData :" + transData.getTransAmount()); diff --git a/baselib/src/main/res/raw/paywave_config.json b/baselib/src/main/res/raw/paywave_config.json index a15cf97..f3e6f43 100644 --- a/baselib/src/main/res/raw/paywave_config.json +++ b/baselib/src/main/res/raw/paywave_config.json @@ -1,5 +1,29 @@ [ - + { + "aidEnable": true, + "aid": "A000000003", + "cardLabel": "VISA", + "applicationVersion": "0030", + "emvDDOL": "9F3704", + "emvTDOL": "9F3704", + "partialAidSelection": false, + "targetPercent": "00", + "maxTargetPercent": "00", + "threshold": "00000000", + "tacDefault": "DC4000A800", + "tacOnline": "DC4004F800", + "tacDenial": "0010000000", + "floorLimit": "000000000000", + "cvmLimit": 70000, + "transLimit": "999999999999", + "transLimitCDV": "999999999999", + "terminalCapability": "0000000000000000", + "riskManageData": "01", + "kernelType": "03", + "ttq": "32A04000", + "cateCode": "2701", + "currencyCode": "0104" + }, { "aidEnable": true, "aid": "A0000000031010", From 20be06c7db2873d4084fab7ffa0b01b025261d5f Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Tue, 5 May 2026 19:05:22 +0630 Subject: [PATCH 081/101] modification for upi certification cases --- app/src/main/java/com/utsmm/kbz/MainActivity.java | 1 + .../utsmm/kbz/ui/core_ui/CardWaitingFragment.java | 11 +++++++++++ .../EmvTransactionProcessViewModel.java | 14 +++++++++++--- .../baselib/viewModel/EmvBaseViewModel.java | 15 ++++++++++++--- .../paylibs/utils/AuthorizationProcessUtil.java | 6 +++++- 5 files changed, 40 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/MainActivity.java b/app/src/main/java/com/utsmm/kbz/MainActivity.java index b1ff9d9..d814cce 100644 --- a/app/src/main/java/com/utsmm/kbz/MainActivity.java +++ b/app/src/main/java/com/utsmm/kbz/MainActivity.java @@ -495,6 +495,7 @@ public class MainActivity extends AppCompatActivity implements navigateToQRSettlementAfterPOS(intent); } } else { + // POS had no data, go straight to QR if available if (hasQR) { handleQRSettlement(intent); diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java index c8a9668..d3943aa 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java @@ -256,9 +256,20 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind HashSet allType = new HashSet<>(); allType.clear(); +// if(sharedViewModel.getIsSeePhone().getValue() != null && sharedViewModel.getIsSeePhone().getValue()) { +// allType.add(CardSlotTypeEnum.RF); +// waitTimeout = 20; +// } else { +// allType.add(CardSlotTypeEnum.ICC1); +// allType.add(CardSlotTypeEnum.RF); +// allType.add(CardSlotTypeEnum.SWIPE); +// } if(sharedViewModel.getIsSeePhone().getValue() != null && sharedViewModel.getIsSeePhone().getValue()) { allType.add(CardSlotTypeEnum.RF); waitTimeout = 20; + } else if(!SystemParamsOperation.getInstance().isNfcEnabled()) { + allType.add(CardSlotTypeEnum.ICC1); + allType.add(CardSlotTypeEnum.SWIPE); } else { allType.add(CardSlotTypeEnum.ICC1); allType.add(CardSlotTypeEnum.RF); diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java index 5b25285..32d8364 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java @@ -78,13 +78,21 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements break; } try { - if (mPayDetail.PINCipher != null && !mPayDetail.PINCipher.isEmpty()) { + LogUtil.d("EmvTransactionProcessViewModel", "mPayDetail" + mPayDetail.PINCipher); + LogUtil.d("EmvTransactionProcessViewModel", "is offline pin entered " + isOfflinePinEntered); + + if ((mPayDetail.PINCipher != null && !mPayDetail.PINCipher.isEmpty())) { + LogUtil.d("EmvTransactionProcessViewModel", "condition 1"); emvHandler.onSetPinInputResponse(true, false); - } else if (isOfflinePinEntered) { + } else if(isOfflinePinEntered){ + LogUtil.d("EmvTransactionProcessViewModel", "condition 2"); emvHandler.onSetPinInputResponse(true, false); - } else { + }else { + LogUtil.d("EmvTransactionProcessViewModel", "condition 3"); + emvHandler.onSetPinInputResponse(true, true); } + if (transType.getValue() == TransactionsType.PRE_AUTH_COMPLETE || transType.getValue() == TransactionsType.PRE_AUTH_VOID || transType.getValue() == TransactionsType.REFUND) { emvResultStatus.postValue(EmvResultStatus.ON_NEXT_SCREEN); } diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index 7def545..bc1b774 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -212,6 +212,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { } public void startProcess() { + isOfflinePinEntered = false; initData(); // Check if initialization was successful @@ -489,7 +490,14 @@ public abstract class EmvBaseViewModel extends BaseViewModel { if (retCode == SdkResult.Success) { LogUtil.d(TAG, "Success"); if(isOnlinePin) { - mPayDetail.setPINCipher(ByteUtil.bytes2HexStr(data)); + if(ByteUtil.bytes2HexStr(data).equals("0000000000000000")) { + mPayDetail.setPINCipher(""); + } else { + mPayDetail.setPINCipher(ByteUtil.bytes2HexStr(data)); + } +// mPayDetail.setPINCipher(ByteUtil.bytes2HexStr(data)); + } else { + isOfflinePinEntered = true; } mHandler.obtainMessage(PIN_CLICK_CONFIRM).sendToTarget(); } else if (retCode == SdkResult.Fail) { @@ -519,8 +527,9 @@ public abstract class EmvBaseViewModel extends BaseViewModel { LogUtil.d(TAG, "on click cancel"); mHandler.obtainMessage(PIN_CLICK_CANCEL).sendToTarget(); } else if (keyCode == PinPadKeyCode.KEYCODE_CONFIRM) { - LogUtil.d(TAG, "on click confirm"); - mHandler.obtainMessage(PIN_CLICK_CONFIRM).sendToTarget(); + // Wait for onInputResult() so the PIN cipher / offline PIN state is ready + // before EmvTransactionProcessViewModel handles PIN confirmation. + LogUtil.d(TAG, "on click confirm - waiting for input result"); } else { LogUtil.d(TAG, "on click number"); mHandler.obtainMessage(PIN_CLICK_NUMBER, pinEnterCount, 0).sendToTarget(); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/AuthorizationProcessUtil.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/AuthorizationProcessUtil.java index f267b98..fce4236 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/AuthorizationProcessUtil.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/AuthorizationProcessUtil.java @@ -52,7 +52,11 @@ public class AuthorizationProcessUtil { if(field39 != null && field39.getDataStr() != null ) { LogUtil.d(TAG,"Field 39:"+field39.getDataStr()); - emvOnlineResult.setRejCode(field39.getDataStr()); + if(field39.getDataStr().equals("000")){ + emvOnlineResult.setRejCode("00"); + }else{ + emvOnlineResult.setRejCode(field39.getDataStr()); + } } if(field55 != null && field55.getDataStr() != null) { From fb21ca1a51d6b1c1c6b1aebddc7d980f5157870a Mon Sep 17 00:00:00 2001 From: kizzy Date: Wed, 6 May 2026 14:37:36 +0700 Subject: [PATCH 082/101] enable/disable beep, not yet bind with tms --- .../main/java/com/utsmm/kbz/MainFragment.java | 6 ++++++ .../kbz/ui/core_ui/CardWaitingFragment.java | 14 +++++--------- .../baselib/viewModel/EmvBaseViewModel.java | 1 + nexsdk-lib/build.gradle | 2 +- .../nexgo-smartpos-sdk-v3.08.013_20260416.aar | Bin 0 -> 6167951 bytes .../paylibs/utils/iso_utils/FieldUtils.java | 6 +++++- 6 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 nexsdk-lib/nexgo-smartpos-sdk-v3.08.013_20260416.aar diff --git a/app/src/main/java/com/utsmm/kbz/MainFragment.java b/app/src/main/java/com/utsmm/kbz/MainFragment.java index 4f2fc8c..6ddcb05 100644 --- a/app/src/main/java/com/utsmm/kbz/MainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/MainFragment.java @@ -160,12 +160,18 @@ public class MainFragment extends DataBindingFragment { NexGoSDK.getInstance().cancelCheckCard(); NexGoSDK.getInstance().closeReader(); enableHomeButton(); + enablePinPadSound(false); // disableTaskButton(); // BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); // BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); }); } + private void enablePinPadSound(boolean flag) { + int result = BaseApplication.getInstance().deviceEngine.getPlatform().enablePinpadBeep(flag); + LogUtil.d(TAG, "Pin Pad Beep Result:" + result); + } + private void disableHomeButton() { int result = BaseApplication.getInstance().deviceEngine.getPlatform().disableHomeButton(); LogUtil.d(TAG, "Disable Home Button Result:" + result); diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java index d3943aa..759f8b3 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java @@ -256,14 +256,6 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind HashSet allType = new HashSet<>(); allType.clear(); -// if(sharedViewModel.getIsSeePhone().getValue() != null && sharedViewModel.getIsSeePhone().getValue()) { -// allType.add(CardSlotTypeEnum.RF); -// waitTimeout = 20; -// } else { -// allType.add(CardSlotTypeEnum.ICC1); -// allType.add(CardSlotTypeEnum.RF); -// allType.add(CardSlotTypeEnum.SWIPE); -// } if(sharedViewModel.getIsSeePhone().getValue() != null && sharedViewModel.getIsSeePhone().getValue()) { allType.add(CardSlotTypeEnum.RF); waitTimeout = 20; @@ -273,7 +265,11 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind } else { allType.add(CardSlotTypeEnum.ICC1); allType.add(CardSlotTypeEnum.RF); - allType.add(CardSlotTypeEnum.SWIPE); + + if(SystemParamsOperation.getInstance().isMagStripeEnabled()) { + allType.add(CardSlotTypeEnum.SWIPE); + } + } // int allType = AidlConstants.CardType.IC.getValue() | AidlConstants.CardType.MAGNETIC.getValue(); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index bc1b774..d613ee9 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -558,6 +558,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { byte[] panBytes = cardNo.substring( length- 13).getBytes(StandardCharsets.US_ASCII); LogUtil.d(TAG,"card num :"+cardNo); LogUtil.d(TAG,"Is Online Pin:"+isOnlinePin); + // pinPad.inputOnlinePin(supperLen, 60, pan, 0, PinAlgorithmModeEnum.ISO9564FMT0, pinPadInputListener); if (isOnlinePin) { diff --git a/nexsdk-lib/build.gradle b/nexsdk-lib/build.gradle index c48aa82..2e99dd9 100644 --- a/nexsdk-lib/build.gradle +++ b/nexsdk-lib/build.gradle @@ -1,2 +1,2 @@ configurations.maybeCreate("default") -artifacts.add("default", file('nexgo-smartpos-sdk-v3.08.006_20241216.aar')) \ No newline at end of file +artifacts.add("default", file('nexgo-smartpos-sdk-v3.08.013_20260416.aar')) \ No newline at end of file diff --git a/nexsdk-lib/nexgo-smartpos-sdk-v3.08.013_20260416.aar b/nexsdk-lib/nexgo-smartpos-sdk-v3.08.013_20260416.aar new file mode 100644 index 0000000000000000000000000000000000000000..f920be75ef687211c477f7f4b8a19decb887b046 GIT binary patch literal 6167951 zcmV(*K;FMlO9KQ7000OG02N!1T*Ic?ki7r^06qZ#022TJ06}hKa&Kv5O<`_nW@U49 zE_iKhZIDk3!Y~ZQ?*qR>$=!A;f{y(;c=sZB4{MxdwjE6sKfXn)>|kzr@0UlCx_jE2 zcu-*DT>~pwf*{v>ZQRhnJzkbO=-Q&T=*)#UiiA6^(COffZr~c@R4K*%l`OK%y6nAG zIE^Y0tE|DI5UD2YM;xeugh)rv!ArIn;^a9KnXmFv2d@*o|8E}ACUYapoh(-y5bdJ) zaP^&um#oK6J0G>io%DGAo&1fSGZDi;agMFGAk;g)R^Ml|FHlPZ1PTBE2nYZbTaa9% zY1w+VxDNo^dJzB%0001EY+-YAWpgfSVRD?iV{m5O*03AfcE`4zj%~Z+q+{E*&5o@* zwr$(GV<#P+XYcRNcdFjKPrYaT95riIt#QqDjT#e5vfvOHATTg6ARr(lApiHn1A+-+ zVsFc2XXasH&tzg`YvyERYGz_@YQ|(_WopAD`tOL?za!+TF0RJpN>273o{T0oM$XRa zYKS1v|M%OzCO|-PHEf;H)iM0+8plh4V76A#kcO3oA(U24Fql!qwiSq!wk4^p#uw&* zlu(yeJ5D7D3!hx!&w`>Ekgp)WyWlBHOrbHVzk7!Fkon#KM4Bt^1G($&)14gWYo1xp z8F|0&_jE(h%ixkj2Q*uc639&l^1veL;=9V6xN$4)NYt1XW0cWjH#vp6<^zzCl9cpC zSi-ss>N9G%vuLU-ai)4mUieboXMwVuhsySk`olC^e<@ru|^fAqKRrx ztB?FI|NeU{=i2VBy<>Xk`RD0I+q<+JU~>S^S3jq9W&Ofo znnBYBQnIVqH1H~$ntAwdBW?z=FQ3_4ntmee)cdnaD2z=elH7&Uyq-!uFk_B|CV{`l zW?eS$uw9){6^voI?@?V247}o_w~!OKf=b7|+~;O?bzd!XQ?)`H7?9A}r`^6j zPBHgwY2e!R=a5`L4cxwhNSmF)QCh*9!<^?t%4Q?mdX1?cYfMmO8qwvTAP~t0TWY@1 zQ2Uun_gQxG%Ul+GF@xonQURAcmW_7?k2_o&{PZp@kO$~sprH6?wQuu`^;Z!6_KVOO z_1trSXmW{c3+58|r(#^h9F$iA8#4cl-eY&wQ{2XSvG&aglq>{myb6EI<%j|aO}EM~ zUYC{To>aW*ZNFuAu+Di|wjDEFEBi}Q>5!o;PQySogS;ktOAO9{g{-?3C&TZr5KX!Z zvAt}&<&@Xbb#VMmIPOGM4Sv9nG*P=v&LM_ z#lRmfIETDXY{ueok#gZJQ66tZ8*CVlE|eWnLvUzL%VrKbl=$7jX*dcNnu$l2(+<@I zR|zdG!1?Q)(r*a=>M)=;PSNk!%C@jbMu$Kc2Bkp~JG-f)GnDm*wWpNFN~YjD|5~d--L0-G`zTNU6~vZj3hhY)L{bpe8?I zbrG1Mrvre?eHOhNsipF3rF$l{x9(@b@KjBd#>599BmoU{$6fbc^2qN*mg+&y+>%_2 zk9UO0pS$L@dZkg=W79DhML1?lvAAmov&g|EFj+So3ZT8w125$X;zMaXr+AB|uDn)e zZoUOg4X}DdN3^AI5uLkEwqYUM42c7GMG$83HDq=AbQG%zMne5U*B#BDw;qv-t`)%1oJ ze~5p+MZ9j$TBWq7b_cs|N2nY}s1VrgS>X{7$^?#@5 z{~+dEjm>|gjPspq+L>JnPZRnG1{S2gz%CDG8Hz<`yYZX2sU%WdiKZ;uc0K7jZ5k?y z>ozEkZH8NrCvJvW@D2odIh>gHa4&l1m5L|k&|P7nqa^STWwP^(dvD&&QJufvU&KBm zpIQ=h2|fi&Zd?)07-9vEKqI}ukg#!P5pKc}3@799=;K%kG3Mh2QV(OKKO&7&^K*FsNkfB2>^oENQ*p|{!vMiwy|Y~OYX5X!hYhso);}!W`2gT zXu8b$o(4m(qtd|1oJ(wv7Kb?&TO%&b<+@i79U8e6?w z!hi{avJm`uN0KB8I0D}adTxojPJ*xiB?b~Jgo*y*k=F)I!m!jzfYM-M zEe|;37`#LfZ`Q8wKvaYvXLhGBEtGayvLb{ zi!t{=mX#h6G7N=DeHd5AME_|yjF9ifsdET1{tsW;owK~tDswcrt5RmI^AbGUR_=}2 z+O-7^<7Q~#t)vPvD|voKAZ#a|?+UGFDTBa*xgJ1`F^MmVO=5U+lfjd zUZYX%*l9(~evme+p7pr19wIpbkv``X#cZMZ60@Yk3{CP`28B%Tv|&K8rSW-UtkuFD z7!vcNO{Fl7@lbxshqREt$}QFB2k(iaa(HNH<(w+65qB4jKkxB0<{!NUrKJWK-Egur z3cZ#6fkg-LQFVG%15OOJQI4*vLji)hJHa=0pYkH;RoAUPNnXJbDqca%rgX<6)H@w; ziHm0j(TAd5>)T0+%@jhA%``;cAJjXBjQ^cVBGS) z-=)5FmH%qlYPi9bau&L#{v?}bQS=HxENQw_;4~p%mS&p6Gw>JBDl0@;nMC-}(DH&< zA(q8j=bc8x`>wVL&YVNC(F?lgSPO~5NyY_zEw3-J#%YJ^U%mVceP%?(n10v6E)ER~ zys=kPtPw&(hHP=46tK~}x>BV<3j}B`Hm2X2wnzR5ySznZj#u+W++qL+)q_G265L|? zOti^}deJJy#_srV+pYHyVs1Bwe!PrO1^rM$4n%DER# z&!+4N5*4D*XOwO{i6#ML)H#&D*(#_cnk2ejF)3Y?bPv4EapjF76YMV3v8Mb|h?u2& zlhhTlkJzu^f#2BwvOaa_%Vx+w);ER!Z`No0Us(S?2tQUyUKX4MBWJaC+pnT#gNWaI zjflNqbf+2)J~RmO#_CyHrA2zZcwzUX|HocD+9Jc)fiQnaI_}QY?a9N%CwL!W7|R>W zjB(Cr8?l&kuRcmg1&f}X6Oe#UL=yk%ROVWGfH_kp8B@bzfY-5?Lwn|M9{$f~n`+nH z1|GJ_PfH%AXcfse`Gtx`Ya@@=CXsOtY*rI9HY^p3_KeJMH2LNS0^^aQlsT6jJES)+ z70Rir7Nw73XUa#al1X8AK$3k@!bhs|Hr3-ZT%s%h127zwN`*k{UQ%(V*Cm6gQTKh} zEf&UKqi(Ux+*FxTC{C9GpBXX7=n0Qm;#orqbP zg#Nt#5h{2}9?}%cw&Gao{j9fhDsc18ceDOD8{Yegw8w4GI{!nQpiFl@jE#XCUz`a_ z%~^rtRNdJK8j7XZYp@bmdAd9{nsdbF2w^Qc*=ZiWI54iuLAK{KrO|*Q8{cIs=}{3s zBF9mW3WvF#YI&-_dL)47DD`YFvg>f-?s(V}s2Kg1)dJ14j(UP^zZqDy-@D2h>g`_Kp5nOdp~7jo$k7x=r~t~ zm`14Bhj2j!v%zq(TwJYE8ShNal|!-4Ss03kE8#1q@s0gM_U!k5bQp-nRW@= z>0}9OW|KT*p~pp|)&j9@m(5{PY**mf*l%S<$hcDt8$Hf?XOkGoI9w@?=tj>i^ZJ&d zf*MR^gEZY-LazGOOu)J@1=2Lq2KRVEX_wiE(0MufZuj3VRvFv9vzA%zFo+S8wMaMc zZZ(T0-o^46YFBdrZx~%h#6B&hNydN+0;JqVM&v%8LFB&r@ngqt^Si7-)$fL9m*F{f%BV7pX?XIV#W?cPHTc4sG6t zvE}KTwVOTYV{fS$&vw$b+g(~ZMA`s56&?aBy;1+7Rz|v^*`pi!5=4NDO4=Yt2xX2SIWMr3c;T7+9JmT`p(oy(Ih0}I682*ZV z0CFwDIuj;7ez~pzcU+sw1EyRS5Wb@{;8&CMVk^xhvu0l`Z(7fbil0Wo-)zl(`aZ6Q zFTN43+&v~EDp6*N>v$Y>4#Dh*pb4s!D*=K`+G3NnN`6D0uKzIqCS7qsqQap$tX3r$ zbmlI8z#Dwvp7NF7=>2JE^d=O}_$=q*?E6E+f4;=5Xu5vhq$u707uR+e!m7NN@<;rh zWondTfcLr{jU{QNQBs!dg4(a7QqpAhMGiqdd7XF=ZMcLIhm0(xLZN$)j2KHX<*pD^ zJLZ8$iSr037)X!o>|W7mcWv?;mhBg9${)<@$ba8IQC-~~uzoyHy`j_I5YK+8KbPHA zjIbBP1C&P9%1vldZjAJ!Aia2}1Q_Hje^I)376)qMtqDWgKqT_kOPJpwPATjSU$I5g zm?wTGuUl+=IP3Tbn;Wve)MX5=PJQ5;zcIMFk6#jHZkOFNW^R)K-c6skTQYLDkN~RR zee^>PON3V@$5nMQQvTM@S?5Bme(|WE|Mp^U^C)Q!#6O<;uU!e({~s^@2P3BbyE7s9 zQfM3xbFq@O`a?ras_ta1TJA&_WV`U2xtJmnQmm$Iyv0V^ebT(DfbBe4F%Fr3ziNhi zW{f*Eob^1Wh>7-Y659UdT?b3xQ4iQStSXiE>-8@xsoCKD(R8g&f>FTAMdy-l|$y*C!X=d-M+&8w_ z0yMv9oM*-d`@^%^?y5_imCa}&`?r0V9$v!f}U&1|;$@)$O7TYJ>bW8wM4 z%y%0Dr!s{y`gq)iLP%H7;W9_t^|$%BP4%h(Xd?2$4-$vl@$!a4ICKwQb3LOVuzf(9 zt>-C3(A^M!?l>ChoNB!dpslCFvIDbSiz^kVpuTciVolTGTH(3M@WyLU&Rd1M+0}e$ zTIsaxVm7Urny68emuXAGsD(Id8WE=6b>^OKb7VW~l5Uz>=yVshJPmxHPe~0+0lOTbN@y*XBHJ@!i_ckz!bf296EEiKjKD#9d zL#^sn0j5M`UE8PB#H`JW&ULKw2BXS?&K_$j+fTIVSqN99(sNxKXS8U2!TG?sD<_iM z{kG)6nGPcQ8Y~o=erE9(3C>#b&6XeFZjYPn>33P|`O>rFez&p)CePYz*6$WgG$Xr6 zfk&6)l~)W8B?X%4as4tH?n5MCQ5vlT#g7Z**kb2aH9%ck#Hy&_#XZw90PE)S&ac^l zV#utDv#=|R7N8bLJAC4V1-_!oyxcVudU@VVyDoNLz1U_asC9wAMKUz>I_u5|oqGWY z))#)Xr&-u}a?MGj^LWd9kCTXID|c8=;92=29BY?G?IbPEj$ANvb-K@t_}X;O!1)5A z6m%WD-Q(l}J*b{%z`QG)X4%T@yibZRWS;Y}6wA}LY25UF)hDl6t44ZWG53;ven0`| zm_vkzJcv}1vmc3(_VzeG34o`YXQIW1mPN?PqUA`(yi?iEDfDglMlVto7pBIg`yfiI!7Rh%4M7i(tTQ-7L<8Abo&5JurN; z|0w$s53pBQ=lbz#`bR5sKMyZ5loNINx@37LbtlA;bjtMwSAYj44w!vLv@WJt=I$T+ zTCQb^-mTbwWi|N3;W!QsOa#3GecstbIztmJ1}kL|FhN*>4ZFZFagH-Mk<#yzPVr!i zUu+9nKls@DM;}M;vlKT!>g++h&O+7@8?cRq zh5~;w-w$gQpyG@El`qX9qnc|vNo$g~l&T%;`dNnmQg$vrE|(ce@Ry$>xhfet@XW3j zxL&r>hGHAIVtD_dQqUQvf1^?A4HkZJHhN)pmB`>E|6(NpcGb_dp_ofWbYde6oAaA5 zIqU?Tt~pD&HtCqIVu3u_ER659h66`Y`r*>nENQDWvPog2;VwmpW*U>}>(J+;`LqbL zj%2#JEdO&E0)p13@TO4JVzX=HM}obxj)#y z7va`Sj`03z0YJe18w%3@Hwt@OTYEbuVOx7wI~R2qD;wwkka|}oc_wgW41u~Dg;?d3 z%DOixdh-b!7Ya;Lw5m6$C`gjbxOA2U&p{Un@>fYtP6{l)fFBgsQ!rRhST8&7&a*r( zdGWKY?jY(@EC_b(2Gl`CeOArswNtvuMicjXqPKjTY~@Y@Mjx4p38YHwmQ8X-`0vwn zc93YS2G zSDKj@y6CF-jne0WbN%-R9%_V=47%cOg#68q8E)p_fOip*JmJFQx?C)axz5Oy@BS4G z1Y@ZY5V)cJtUy;>27}MZ24AZ;L_c&VqdP{qPS}VH38k0}iO%Xb0dk{D$x=dH_rhOb z$*dzR!wKupjAucC9b_H{`+wGB?2_;e&UAgkk%kBsOkEyTekI;ulmRtMr>I}l4CdbD zAO{hKZMMwMLSuSvlm)`TK107W5j1(JU6uUa0*|Cg_7za+<(F*=pCSJRltkn_*x?_b zvi}t*&Ho70)x}=g&cw;g$k|N9)!h6){!+HeMvCadD88GW&l`sUDoR6G5U7@|1HNI&bvDJZJ6KZSU^JTF0&b+P)i>2SSKy99)%d z3O2T0j1Isfo*~3gYo+$^iW>J0BS;qUVXYtUb@oDKiBnhk=T3<)y=B4$b%FNxq~ zB6P=UOZ6x0v;|JZ3i5R;Q0qY1v6*fWJ9y{$FPQ8NWBXfss(j8SpZh?oQc^mmQ=iwq z)H)w{1(D!J#KDaF!QlN#V5LLLi87s0DQq)LdNg9!;(Msrnt@RK$d5+puiAEM9-HlKsfqg`U)wel1Oq z&F9B;I|PtW{S}8n0hFXXn=4I`>?F&EN`5cyl$#guvM@!=%M}jpC$jI zgTe+<2(KJ?`o&$Ey&<#Q0X4*GVfO(Tbnx1Xneyzsv3-~CfPGB z&YU!kG!H=DvzUQRx>)r28Rg)%mGB-#NYZ8%KKhBMt z-3|oPInOvChnTviXDK6Pn!VzuR@NCj4Rcb`0%Zxu z7el_B&n@(8QB3RduSHYy9=4Y)=Q6|HANe4)juO;M0)sgmHW%v|n%HmA3e<{MC8m+9 z?F@HTR=O(Xl#wvmA0p#RHSJ5e^g~PXq!JNax=-^0fq8{ngdsUw7Zoz1M6}y8T2^RL z=e>@5ykQ)@`{o2HhzFIujx;uC3r~rKoTG!I2GI#FAvBMvQY4a6P3qbg&#+QP(FyZ9 zpMgK-&N$msFobeMyd?d83FuTAl+@2Y>khJR@oCI3H6h4w%aO&AiKP8#b8?+rc3DIZ z(HhLVOVdP@b?G`5;}-QbZcHLt%VWc|9mFUnnXn`7k42NZFQSt}C8`NQEMC2YHWSUU zU<_#+>x#|gxM95sy+(c&`>O9E0;s^^L>TrIePDfDCI3QrdshI*{{;CLw&GC57>$3d zbn#zTn~48MY@RM=|E3VylENA-9ZdtIBha&_sC;tQqy_Gj64lE~^NCLrwEtmm8 zT1z5fOR&s{OpXL=UV`u5h+fjET7mDEVQM;HfDM}8ak0Iyvv1ipSaGvnHfY&!Yqe&` z`0PIAbCzb+dXB#Wyz@sZp7Ndg-0+;b@4S2WJmT96ut;|8!4z{hR)*)c0nrv((O*)As zo$U*`wn@iyx;>K9w~p=-a-$%oqmW!)p6|VCD%4yQeRbXCIG9VktTzv8Y=b5!6GIj% zc7_y$*)j{*T3dN`j!Mvyh#D7MgnRN{?VQ^L`SPh0azk^wj*4*k8xY8oVK<=MFC)rw z*e6Ag)sD!iKqTJZ4B&c;Rv~Un6cPy|NM>3kVTB++?b37J~-o%RRP_FaRiR9Ms`LozL8zM znSq0Id81gmaJP0Y=FS?XUFGgR`o7pb9+EuMf8OanqSqvra972&b2pI)ZHVW4v`iJ> z^^y1|T_Rse%AoyQ!r<$8Grq^k=ethG@w5tA;Hc26Ad=F!!qmRn4kb%? zKpYZ6<);{-!S7;cfu@`pbhU-}eiv%Os~+B*D7Vq>rl8cyxU72gou$_1x{1Tc?ha9! z#p()?^Q-6vQ>Mo`nU%4q^PoaCHJLP9Ihbxr>>4aJU8&3+w=Z%2Z{x4Pgh@DgO{~VW zqOhobXP_2zEcl zbW}*5hL>P$_qBERF(`EwtO5qZc7$(C@i#`^s*ZExZWLBS?~3%H2!a9bzn*Hp*dfrz z49mKyvfzg6aAT-C4&|d;Ju0$|i8d70X6IwwYq)C=@2y@I6wZw-yMwv{M$kE!bzS)m z+p^wpMj6|f(DkiJvCabx2EqRRc`EGkvMx{Hf(cYsXY7zjpu)Vl2@Yz0euCw_nPP87 zVS=Wf4uGc0I?fAp@kvjv4gOgeQ_i=JtS0frS*mDzPR+d3U)dP`>}AQ-9Ze`YCVevk zHPLnPFl*(dnlsTVaG}IF6R{+Vlp({=%1{B=v`paW*2B-RkbM&b5yTnm7f*Iv6w7~ngcqzk{sX8QdcHYV z!rq>ptPfNees+wX<=Di9PVsL@yF8J#;O|=3@PdgzdQtcT(VuXbTKM;4*<+FfO7}1{ z;q1Qmd>#`j9BJ^{x#JgF%qI}L#p&2D*O%k+z_?=`fp&p9UF7jwT3g#_zLbpR#bNK2 zmwURh@mVCgd2ZOO(i}^>24GZU4Hv5X)p%r+5=2<56x9Q4_amh0h~!$y)_~U&g-y5E zxAVL*GlZVKqN|0`Uh#0}K}GHzKMZ5ng0wK~m}u}ORre)xZWj|Y4U=2!ft*Z#%7LBK z&~*2P+L?b0kp)e@l8F~G@-vLPoerk_pow~Z=J7*UrsrYR!DoesJH~udB!}C1OwGxc z;=HEEcO6`oen2^y?2~J$m&9BU4UhK4FW&XUGlk(I@H@Gdd*sqiwUZA-WC6+DkfS=; zr^b9Wya2A*MWOp_e`6JaTSB7O+QwaesLe{uu$x8rk2mN&b9StY%c--7bjAWKiI>?i zTMY{6)|X*EZ)nPLr4vh9P-YH%49dmd@IBTu79~1>iV_;d5%h}ON2UOtxlZi$zF8iH z9;x1pJ-ca&oJU!Oqyr$0p!B;s(`S^y$$DJ?Gz*7?YLh*4t??}_(`T07;h*%g)~RH5 zO84(rXg_3zkY#EertTRSgF+!<;F$J3dEC^PkZT<7adLQeYfFVQ8}$+OF#0YpP{{Mt zg&$L%O7$`V>vZ~N?vQ)M@NAmYEBFh}pXI4LSwZ;SyAb>WwQ^Y*HDI(K)JqnIfa6aX zRcQ@w7;IHNORhk$eD`rMFQkguY4cPPA|G)}BvCL8^Ckm7(LNe?CMGWjP5YcTNNfgW zRG?wXEs0;h5K2O}EiY9bXWeZiZkG-&Jd<5%J+p~Jxlk5f1Ra-FIYhw4LzEK>ew@tf zAI>q+LSJw~KJ;<5E{tQ_ciS}_WrtPF6#6mm$z>osC95Rq>qDL8WN=L~uzEjb0x zz$7#}a7X{H>*WE|!Id^uPW`DYY5Oh^)JCnjh-(MiITAo=2Cb^E+(wn!#W+z~sHRH) z7y${k+_yzA{?@O*d04?QzEo?;Yj21F&Gy){hhd+k6vBu)^cV+GyoO&T^P;aCjP2{I zPAoTKtZp83j@G;u!M4(9gJTcAiI-l%3wHS+PYp8Vt`HbBg1U+^@d8LkMKsQoT#7zc z)zro0vLcjeajfH>B^St7|HG%TJE4w_6H(1vS3M<0cGdvLa{vZtUZP-Bt0}>;=Fr8l zK3!2M)wOM5c1!%tq949Ku%^?LR{6A&$q-|!#8BEfWn)A?#L&DW0SIlFt{iqj1%$Gg zZuHcsmRw-m^hLIuhAzG3=@}n0b1c(!h_PH4J+fz2E_G%v<5Oxlhq=m@hG6n3iNRc+ zh%NVdLTSb`-MVR#s0>_$s#pK~t(tN{oPJkcOqru*eyVg2`5xs|lyl?2zw^i31%a5^ zaH&OOw2WbI>e>|UDUUF|B=+n&>X}llR=wOI2wn=Q(eP$!36P#;Mmli7$endDWXE-d zb=x&?g?2L$k{Ict5J<35doEk&fegpeptuzfT$R`pqPZ0!gKom*Jk8*?nMlXJv3s zG_w+gF$j;5IpMxL>jK?vjK4hsPh|WjI}C=j&a%*$$S*;bpk>;N<4xQ7Wj50a8jd&o z6%3hRKk4>rVm;s$&H6ypU};ycDIy$_L1hX2?ppYW)BC)stb;u(>N<+7}HEE)pq^JGm0n*d8oY-P8&77ymc)yyvkG#EM&IyTiBYI-! zhhF3#^_lR&2NCiEyZZzb#RAR9yuL-dn1mN2_7Ltk!*D$F0V}m?=_>Y$Nt}`eF~08iH9!PUXt;~jcZ9{azt<-^8M&~%CvJ#ft%=%bXPCJr*7m%0= z{x%V%&^1ou%(h!yyI_o8f-u(&VC#x)q^MOKHh?haDS9g1I~pAb&Pc}sqnzUq_Qi^V z83+Pua*&lX|5W)d(pkzARB&BO}xP-Y3Ta_?Z20-io0$bWVZY78$h!CAGKvcj>W3q|ly7JW*8&tk#I; zHR{saC@~!e^0s6)VN-`_Ao-9UPar*LWa&m*)0%pCJ|gfQG}Shvxu&f|EY*W9sYZi} zi_{dP(|#YE+wzO@(jH(l+h4WdlGT!p4l-lsM9|dHN+<-{BMpU^My`ufV2_eL)XZg@Xx8>LKMkZf28X7 zPlRo9(&&Eq%Et)^H^z#tHjTsrTtbZJ1xX#`BXRFlKC1-)iZsJHnI0V2<(16>bxO}4 zL>EYJQ7e(guZsjtU>!^dLXF8fe>V~C1Xdbb=Sx-3VF%c7xmm-p~E)_x=D#8KCc zQ|Fj6x7@haN#nFp_$$`(#jsy`czn3)y1<7WYsOo?N%=+w2shN zY3$8XsJn5#wslEa|5G08=B-#fA9=UIdP?TvY#IufYOpa0re9w@t9PB&5ICM4iAzSU zApG+}$e^EWqR6q{MUM_0LN2zFTcgs^--AFnlJW2hci5a~CFs&PMi0rT8~unc1=`#H zImG>J%mr0ptyXc(v|fGyw>3^5#J3Ws5P*VJy7=0o{3c}@8q44ggU5wm6E`i>?*~QY zG!C&gXMUr5Qb^$8E-D^ryU#vYMKt^ zIgF7|1Nn2toOF(QwD1<}6i%1f*qBM)O!4+H1$}CouV0#1vK@W*$b=qZPGq!vl!aH= zi|6$dX|C<>m-3HOy{jP$+`y=xQ!B%M?pGPE_z1XmCx`7)dGr2p$bu!`KZ-UVNte$6 zU*0Tc=3>)50$htl)q|ylRoQ}`VY>e3S1mos*9*~GWy1}AQ7{@fsgtv65S|+k)d#+5 zcc2O^rSf~7T!Sw(xFa@KiCAC@p}*cJWZbVy6|L)anzW!ukoXr z?UR*gN*n#CVK&erG~N8rp6u&T`l+i~O~x$CmZ$^2Bj~O~TV1Uy(`~Fg>WwLtQqAsf zdwP@Q$+aE7%;0si+EpukKsPSDqY@m#d{UN-e*vp`w6x}|L9;>eJf(my^u+C^f5H68 zmcID~n5Gs*Pcn7`aY*YJg4s^U{MNQULX4U?Po~p+|q(~ zlnfICnULI=0nQ|x1||Fa1^fI_f~V;EVa+6+@+|HiMT19Tfc3Gf)u}eHn5y+Oq5e`z z_B#mO!H{4%s0i}b4{{NoY3?#s(qtgsg!mdN6@kODLJB(L?GoZwMO|?d7Nt9G*9PU- zdTi5!urCOB6|;~mE|@7y*FtmW<82RqoE-H}`UyF~{To?M5d+96iSW}rX{GBZNQ(CexS~;qGml}f1I$4R+z+a zBUx7kqAud+552}Q+Ebf0VlBoAeZnsLi!3oA^C`-nLN2HWD)4PP9hYzpeHJjav14!& z$F!1X=ti?fvT8WKK(g8oNrF70wzOSejAlK#S9sQddL`F`?1e9eWrMNE`%qPN&3GoX zy3MwnZH!KV*hz6fR|EUc(ho-+Pw)5Av`c{3!6mV^CLCZ{4azKdY&khc;)n7+vg?^PWyLU2NofN2} zi_n^8YhqAhdj_FW$X0R`z}9A}k~q_SQSmNFLys_eEq0JgZ*MzP5kwKt|yBqQX<+$n1=k%Ec*dqckr z3n&4?+&krQ6IXI)>UlIA*Jp@d<$9~6W-VPz40{;Ruz9C|L+l|Ka}-z-q0AyzCn(Q^ zxOgLR)@<}v6n7~!tx9neR;zl%>T0#0GH17nH&dYjQbF-ulNRb1)*v+BYt6k2LCAJZ zTddC{u@X0zA3rZGoZD|QK$?)JUbK&*Gzj3?TZuu8?ft!^#u)>5!$QJfTB_5_5(gWC zE9bePgt})L|i7!7KUv5w6i#GnzZy9C!c*c=s_FN@&a;LEj`KXYZ4zEfHHl08 zL@c$hF{Tm%Oi&*8{2XtgX^T_-&C(lGC(}$9Hm*YRKeVFcz5!r3Oo!%EJIOB{^Kp-A z-4h68*_h5Z1iRiDl`BNp@T7u{Ei9y!`3t#t%N5#2*|vPY<8s(Y&+~$8PWy>^h!LK; zG^a$9REpj{j=orbtNZ#neH+772nx0LLLP&^{2l+a#nAjG=#QMlaQ%?{{(fe@d`k6V zU!wT0G4>OH(1O?!9|or+jRVJ|b7B!8-4fNQ3l})>RODkIRNO`r>x5e8 z_~h3xgizMx{a=2izZXGG=9|WcgAEO*oTLtJl}px}qv~>AYj;9u`5nM)AQkad1f?TJ zG_$^WYXs-f8vhPWBy3Y{h#=)_VLH7HWhG2fF(OGnGQmnCxP*~Qtb`YDQZXV*$1Ca) zC5a27B1zXN+Q5xl2|9{PVZ9HfCD7kR(up!RuslpOJHd>onp;Pl(IN0tp$ zX)1H|@pSBPKW8){XY#K*=*wfRGaTmA1}-6v=&&VoQJUR%_T|46x+Zk9_&d#!`lzg8 zXb$o{;*?m24L^5UW@qL+?N(f4u(^+w28Z=pE^v*{kYs6EsTFiZtaZF@C=KPBai)-V zcIsekVF#y{Yln-^o_u0$?%&nj=URT{8e{T&RI<`xmyOXS+%WAWq;(@Tn~6`^&DQ1a z$PgH@{Txk=@MhC2JOCNd9kVnB#Hf#3j?z7p)wa8-Qf4H$guz{7t&vNiDFH+P=<;GGW+S|_yfB}uhA z!TQ6)Tzme&hQXn((7byXM+BK>@R~D+RKLu76Gz0_lRLeKml0}{JiqWH1!$6TZrU3ItksY|TH z&2B0<)6S2NKE%4ohr+=?A?wR-4W#YUb`6ezFHpVdfjaBzu0$XM~``=G$E^B zP@W1bfG<{{bHEa|47@{e2@a1Y?)A@>ybc4ZCHXLyT!$L(Fgzu-Wn7a5R}|nXj%MUf zR_KxOY20&Xoq9C&oQl7_RpT!-V-E@o1m(@17lLfw4R;bdi16NG&un_`o#GuRXgr{i z?1^IpXn%zQO_lVlNgH;Gu6f6G7_dcx>vG=gYt#j?TE>OKuI{~!!ufIBCVqtJ-$NS# z6UdB!DgL3x!D1c9=>rR7y{Kv8_xtsa6QV{u@`9*o!}sq-+NAynx(U08lfe52Bkic+ zVnshbdW&1FOn#y?wqr}JnIwOtNvC#xdJB^uz|&Z;`| zHLaOs6C)nOFM4|HvD3kOdI?ufdjrkapXTgeyP#d#xT(@wDBf z)q6a7Ku5(IFQW7I!HNysldbx1bl0qk;7quO(}CZNAp5Dh2~umFtm;a~f(k)|g9iaJ zF8)LLWh;=r2Q8>~4=8qV{kDv1v%{~)7GxarzxkPlZq6?S;)UZ> zKfddEbj5OArtT@z(}quMaSh*NvMan8S*FNm^h#&v18Yz_Yc*#6#(mFLesNi-=TFe? zqWZSFLi)?}Ml()+(e#P?fO61Y<6*tjijSQv*!)4&qDlJiT6j&*?Vz`?YHVHcN+?Szz&z5>yzpke3HLL={tO z?t>o1zE2s{P2qW!ytv55$|iu0nxC7Nn3#}@#eA}4wf88qCyne;$aRab3{X>K^Nj*V zKN=Liuyz9;XOy~sKJhP}X7q?YF)qK$?V7xyE|04HVEqgL;y>;bzi@W9o^?w+@h(@% z85+F_bpJT}6uXi1>Q(uac!FQd&-{|VVeN+V(meZ=e!^bbrDy=iFO*#U9lP#NWnwplvoTjE{d4L&&DLIpJ&pl!o!=tDCnwX-DLjq(Gk(%0Bom7W(BN+ zl68B)ec%PdN8N|dWT$2uCS@k;!j!#@E#!1%iaMEpKkzu2-gPB)efU9!{w+my8$>h& zJ-ibF+X_{Da`56F)Ft9jkNfFi&UL1_@k&a$p!RuVX&Hze#&KwfHk%VMHG%j2?Td&A zp{G>U?oe~>bEl#&Rp*3?#(iAPWMnoI))WRn{heDwD!3&D+h0?8V8a2+HKU>F`b=8` zv_XU|<+W~31CTB=SE&#JI5;NObyUCs$~v3t8#<%wyiSdF~KKG`G@f-@%(>|r8 zsDBG%_5l`4nWx44#+J=GEXky zH0QI1x9GI&0_cnHyCr8ibXo@iXh<#3{xIZTRn+8MQD7lfY;3IWEFb}_7Ki}AjgfW1 zq>%NVjg@u3tTP*b;6KSvLf{hJ#(kKv4;m`KYCZ#prKr3qUdcmg54UU5lHmTbGOYAjH+lrP$T= zB{?uCY#a@lOHwswdYNeEL>g?1W@B;P$0{_eVgU_tu_+y}h^ZXd6v`)xwm-A9GlM0A z&px%lZV}DCy>4t3+pxYdy3VtJ0iakw05~_-0ZJCY01r+1fQRN@0DLizIkt>RTeM36 zAev)vonisvT7~fJlGQ3C?05kMki&F=VRv zpa5c@C@yEW9Jy!P7-HKxY1~4%B)vz-i`%7|#?~&Y!Q8Iv+$Y)?WBX#s=uvkP_%g22 zLbyV+he~ri^T`^|hiobMT0p-yBg%{Eqg56tX(s3%Ck>k{>B8%w2j3@Y#+Z!G3+^L# zQh!xEWxjdHi_T9m*ygMQ-%sU&^;(Q@I-{xsA;>`1{ty$hHv`Z?5G(`qpPI2Jv$2Ma z!}CJ>C`&Y4Q80kcp6lJ3jhk-L>A>~S9=1PZ$?eTt@FM$&QaYZ>=OXu%!1uM9k-G0B zI?C-VhwgcI!1x$8X8IIF_ajq8+x{5WYVoa>?NfB2@lb$b{;S5Ck+W*HXTcg_n}6YS z3$G7qkPv9oNiCY`Q$g@0qZwovZE_!53&u2#(&9@O%yXMt3)P!0xb;_fH9+WG=avdM znVauQ_!|9qI#ah0&({m|x^>?M`698B`$}=4^ao1Z+5@LsCOcre3bXs+q~%@rsYp8@ zBX55;{=j$dV~@GF9XjAt_M2QQHZeb?ono->q+K^W^n|9H5r;1F`7$czXQl!0bJMWR z2~d6nRA3Uu^k>s$S|dm>iHBSKGi0zRxSw1ODv8+(C*3Gx9UO_XAI?7-05U+$zc$pN z+nWS{NJWv?~vgw@4{cbG?43B@%FMmsIh3M;eo zS2jr&JtQ4aWuv&SQ1gqzERqdxy7p6fI_lw;E*qIyvQ8=Sh=^`1`%=Ek zWjsJ+m9=`c63x!_5a2Hkd>LG?N+SCnnq(ei{mNvv-syDJ)tC9M-kjXikIwy zh5RZOFI}K0sc)z^lyl7Hf5^$htir(ddIEz(g#mEqJT7;*G?g0+I#((UYHi*-O*iw| z>Pxm=ru*kg)i)h=Cef7c2g_va&fKa_Ta2pJ$YqjvpT<78>0sklXS~0r$lBzN-@?N% zM4?mTK?j8dJszUEI0a9rPUIL~)8Py8z>-qK*+sQ9-$vm;zM7QZLa|EYeop_s#f&-r zAU>1Dr$P-6BW?XKilm%*NIQVH=IN(f%O4>b$6q|diB~`2oC8yh&VkSm03w65p&{fE z^K(%0i~LBGJ-Y(yaGJ-+Lpy0j*lUI3GRMYau*HiA4>?#8jNXcFY81O6YGf!hmEntW zL2p1GhTmP${fp-w3%fisAOL{ge=Vt_{QuyoY++;a-{4gAlUtNW=CRw}s7Zk#&4Wfp z33kCx##1te`a?EC5=4S39!6Z0=|XY7VayknJ2aag7dCJHwh3p_b&FyWIdm1f^C{~! z>vNj3ncLg*15g*mE!2SiR{f&8`K$>w`Vu}(uLFfya@$o4Mw*QoV5gfbecJ(JHtV(t zNeEqOGDFX^S(~ZlTdF|*Dl}cY*c`4~5{N$d=C=lk4Eihw1?thMOq)s_n*MWR99LCM zIDEYTEA*sda?28cmI($OWt!u&XovMa^uj3{**}Kvli&<(NDd1z2pNiQ$U=9A6S^NY zf2>#Rd9~zzO|!K^AHe`BqOIaFT9TKTD&ofpw=W<4nro@nE zgbxfwiO7japspOh6c61GX;X#XMKYUUvg+o_8C|is)m(|&9j;}&-MX1gn*E$`%O%4= zxEp5*l5INeaqc-YLf9OCo}0=x(uU~Y;F}Ic>vX_K=7B5ySdBmw!LHZ_5lR+}D{q?A ztQ6%f`TNKCR-_Cnjw$QMkol56`!bPHqEc3>43Ou z@Xx2=15(1|p-8Yy8mg_O$rz++qzth#F4iucOD|ZMZoK*|$IhQe`UcDX&K{Vs;FNNH zWbJy)9COSbU)}zGJy0PGmyORaN13>0MHn%2#iwpiMHh0pRFY(T{N#`bT56QI8!}1* zVe1&V8Y(fp4mEG5dTwKs2*i-iIApFdYkCed>vIgn|Aw(=aL<;PwNig}_H2s80Fq73 z4@;hF`1_hRJAzEXT?z^2&0Iq)*jSU~ zPm3yvePM<|F+_f@_%P(F3Li%_t|+a~^+Cbv1QKJrLOeB=uPz4>TTU_7m~T8Q2glyA zz&2^dbRKQZ+^+y=B_eFPc=eViA6O|$r+J+ zh9gn`i}zbE{4pvG3$k?nrZ{&1j_1>G3>rrDm%(9HU{Jt)nYJ3URNqtTiX)n)nH+Htly z%t$l-kV!%%UOT;gsyu?*DQS-zs)~nt+`uCyxy>KU*PUgBL-LVZ%M5$e2fwj0+rJXo zWVK;K9D*Ih_31SIjUwc=U4L(#Z{+eYq*Oq1QPH1PKC}>wOs?0^wd1G$uWa7Lyidq;BX9D$$IlqsOwGnC z^_G@WGZ?IDWEfbO6toX225N_O^9#73CV^uB9}#nGf!is19uX+9x+mLFOII8p9VcCT z=Rg|U9t}(<;!=N|3=NsqK{-TRY268S_Ao z#ieU$rAy~0*c|Egiw&1-6zM~7mp?q8q|psyaiZstIwEX4LEQc$ypnhx?!eyLgKT|l zJl;^=pHaV~xVXc&WVk&*J(v4({ka}*xbD!GoCmZ0dhTz$?hAw5>UVd{>__|H>QDB_ z)L!hcvhMDvSx~4{JLYCj5QCVrRf@C z_p?WJ{R}G%z0Q+F?RHci{`^my2u3KF_sTzxSqc8%Todzub4_8B|74fj$=ga;|MvC| zlCH~u*A=fVphno#p8%43%jOXg;-4{Tc(^FTe3fjfBeAQIt5zHGn%Q{eZaj0c z!Js$o9^-H)xOlucE91B9IA`|b{GmzqO&UTUK?*Yz#Me#T9*x<(1TK=fK5}(D&)%Xa zv8=@!Yl(SeZt>Z@;m|E5i<3~9ajZ?&YgAEv?GAu~klruoi)vVF9l+wL+>DPAIg?qh zd{7uA2_UBcjZ#Bwi^5=B9OzRCSXY`+Ie%l!vl@2=oV`7FSJH1H2x{1bv0jY_q$=lA zrPq0%B)5{#9*qXBG0@fTBG5VC48T^0*un(8k~EvO1ML<775d_XnNDN7Z;42kBn0Jw zg~14TEUkK+o z!j4j2yC>cmrEz)dhqtnKbJ&f~&O2}CR0SdBB!;L6xb}XYYsE<)%E&0(R5#mR#$Gxzu!;5I`n67 znji$QGPmEd?2NmW3{d7|37jyHB!MQ;BPe{wWFTbj zWQI=?_Zw}T?;~3~$sIMnHkYL|7fXx4m(&Z=PfKg5!Dr!B<`GMKVyOv)rf_8=&>{mA zuSbM&P{xTY=LtL8s4S+Yvp~Wz%&Z32h>v7u7)QzuqhYuhtZzQh68FcF? z#cQkeh9*>S6$_KruZ}0EEB_R;HxL~;G)f)=XtFuFQa0D^8+`ye3Q`TruN=$osO^P< zgtO_QsRLSallU}-!1JUn#%~6G;VC5oIRz;Ue>$$IovwqWn!s$#;)7681i7AFa4f<5 zOD|^?b=fl#mOY5I&FZr|&q8My@gPt!@5`MRZ{?!k$}Poe^0r*wFC*nQBZ6JX71owF zBbFBpyxXQi9G@cMMVvKdoKSNUxq1L?2gha+X7qS^ylzmeRn?3?ekhs^!==4UI7A%5 zvxy$r0py6{06w5tG(aWD9b0;f;v3GQRU{=odTA%lgW#_~p&v7Nq#Z~l)PmYk4#@)d zis=HQi;{4SE3=3#ZYA)Bi?w*&Fd0Nk@HB|EMMME~CrP%e7VCA4_l6BdOP~%!3+3R= zA%AG~M4jgy_0|8(HgMK&jZOLk0ALUF-xMeQPm0Ugn>ZRcTiE?4*{3zVyp@-mb*a*i zq(k>vfW*bY@$(Ew$CvW*_6?A9Lxc4t@MFpx5;%y7#-+2w@LQh4!y+`RRSH{FwXhV* z5V{ii;WstQi|H)8o8hdg5r=kOT3V}DJ)28*H%_OF5lQ`jbsn8w)-S8NUp>7q>tk`> zkNOA*GiFEAu&IEmKQ>%>t|CDN`xC6Zad=AtOXM@j%Is`lJ?@rJAw5GKERy<}1=M+} zd-NO4Yz|pGm6VB~7OO1v=I~%azHs&E(IY5bj5tLN_*0Pi^MeEeq zJq&9WF6Wc#QJq93GO?=e7p znoLkm3q{Pfw3ejJi{=Hjq7O-q{XbL)9^;ywwJ{n(ZXR@nIOlhDj>&QuPv%P_BC|Ay5_V*# zglU~3ZE?3ifC)ci`b1h=md;`hBr#dg8&Vw^XK*|mB^tCGF;kZYWjlp+b7Q}_OkhT< zZkQ+ckyhF?^1-(#6%%Y(mQf{)!$L+pvcmFh%Pu#GvRnCwAlx!{Amf4yL%XbEaIG*N z$57^pUfMJX9Kk0py=~OpFaojbmM|a?(FV^jbKpemmqj~=Tsa(rXJJX~F|*sjGwZ^% zc~mX2JLdsx%K91^>D1YWgaHF^jadZs0^QY&YgL0~l0Z|3Boj`XS|*Fw)P2&2M$AOa zkT;D{ZmAP^6Ii14Sf!7^xRr_q>gMk92_6RX^1DQFj>spq@bB>(d*DNRl5bg*$_^f^ zu3KQxpfU6U)DwzRx_0EyCXuk=V*)8iWaiT^CJiW4t7JH%pOAKFwAo>#sK8uWI8!A& zjaM>vz{pzPi&#EYD{yVg<}fq`-S`98dpjGa&?na~%63S--GuUFDovY|(n&6vnFjyVABZuwQ&#ol{Y-JT!nov#OnObXWPJBKIt3?#wnWi8yoMeO1Ms>g>2 zUKgu+qN9VaohuN9u+P%a?%iEk<55aCFvkkswfkoo$&%MBQfh<0|BZ^(j`>FHt{XYeQnDqrt>PDBEM^{AK@3mr@@m%bdk4W;ge z*g`at;G}GwkVIP}LU#0M0J=1fxu^N!7jyvzzKujl6TcEY5qaDjy=!EM=hAB&Z=h&p zKDid|zhPwYR)N(o%o1GoRe$by+0TkE?{xNF4mHkdo}-0tCy~0)?9ZW=Q(}ITIa+W% z3CcXM*wjFMX6((b7RO;1>-~8t9SQq`*eR&azC>!5#$BqJSfUS95H5%v;jRkI1-LI? zCj&=__YJ#@G^SpUl8^h;yh6C)GtDU+EjY0YCAm}73jbw;2+vvZv8njCHu_zY$dywR zhjl|1NZPpAjlk3jptNNOFq;7{>IJtUYrX;dveQa`R>yxzH;yz3F|r9O{E=}&-TvZ=?x z^DiLT<)tdBo_Vn!WBURgi>CZnZZvOREI?qs$w<%1r{DUS&j+vs8w+X@1ALG%3Rt1Z z@^u!0s9!Eqh+nxmaMld_ik}-H$xS?rEtmaQrCiVF9V^k-WK|VR&@Ox$$LI*_`S{2R zZEpJ%+6&f6O9Kur`h=F~cZP$cHU#`B_O8cgUk;eumV;9TrXNQe6AO7Yw?Ib`9+Qlm z4S}WLSYdr0p9p(tG?@ha8c`4IwjNrA5QhL1%ivfz&}Jv7txp3&0fr^))fod4aUswQ z7e>ptBLowfq+&zszP9M;C+R81ci2P_x6U(>cAxPh^FaYTOh^HZY7WJtc@qOXb+~P` z=DT%?1(}AZbqlTuV*$feCY@siZq*Z_PvxKJ5B{d&7MwqH$LJ8`GE~#2ckQe>lOYK+ zt!^YwPW!q^_H7uP6JtC;-(ZN`BH@}g73z2?7qt!$XG9wllPI9?Osp?=9{lg92F;J& zO}u$ov3LR+6=-{x^`hU_=F!Z3@Txs=7B?2yiTX4`-S_B;h$8Ayo2u@S$qo}&2o2GQ z@?RQ9=Co)8o5vOyiwgrsA+;32*2qzwDdTM{9pvwXWnw&+g8@$(_Fv$%(P{%%075oO zkui*usQ|ED5e{UFQ%F_XAoLgzwGABTke8F*@$;A~lh<9LR&j_PG*Mf7uOdFGKiG^{ zNzI$_QINSJ7ayD$KECpBBJybTL7Dskxe5Tfyn~BJuWutDvJu% zx)!4dUyWF2M3N+>=5w4CgR}fCSD|{O8Z&plwlUboiwmG1(r}gtWFt znbzJwyHSwXVNueXCnJvW;+^hTyAfD$c5E50tF%F~iOMh#d z0e-U;xic$lZ=F8j&$u zpJp_&W#dcTQ=>cIEf%}Sz(t>!SbQLpvK4wHp<=eX#Ii!DmfrY{qi^8eLb2D4*dI9B z$nYI(Ot#V?tRqH*63S1`@G)Ay85ORmd=gf?S1f13 zApI_pckl_lsOW?hHLEv~1mhMj&eUSsIdo@4_EZifRSUBzi4Tbrko*X*G%(U?KPqY< zSqe)g+^0*DA!VVd~+FQDGZm>2Y<+X@zyG;m_0!hteVjQ1oE@7Msgk z2{qg&)$t_H5J^u8VT==CeYXrJ%kcKf39V+N-`Shc-jYk~?q(ilV3B>VVb6{xkafa2Wqnd`@X4CFESP;> z^sYtgqzzMAH@wbs!K2xcitJYLpnYbG2d(X8>&&+eeCB*k3mJtNDFlgCiXNQ`?O@m0 zl5xdWoEOnZ?|gKP#Qg&MiYbkXrI-k6b2JS@lzc!e%M4$ao}1}U{7dc3EA5EjTtOC% z*}o0i9XLk{x`X{55ek!UAlk`@dGAx>t9e{~Q!JG?F=#xzuku_oMUpOc*wiwW(2j5A zs9JM8ht!3?%E(d4EbF4<+})YW>R#JcK&@r|-oDi0%4O z&?-Htt-meD#^@8h)xP1oF``^DKA0`7!|c+al5=bD0c#Vs=%Yqg=L(05#8a=hb8LF3 zhaFcbprxc#mXKtxMS5HOX#yATtcB|4_YlDqkPU{9XncXV#|^mWUCn!ca_P?GvzD1t zv`9yCZIn?oUm=jksZ|Kb&1e;TlEGWh$(xTE-D1@QR7akdwe*??CHW(P1`7y>sz@ij z;rJ{r|N@7rpPEP zm5<1fH&3E%R(7P?5mJxe?A|bA0!@ilZH~F7fV(H*!2?Q$EyxkX)t5U!5JM#^8)VU= z5>6?`i!cA8W3SFLE>!wYTCCCn7d}n;LM+(2L`qV2Zg3K1Ak&UNYaiP;&usE6OF9%a zSha~pj2NP+-vs!H89n>U9vK|1J+~FWsQs*yy*I0Rj@yuzg zF`nn6kI~^Lbm|0`bPm2&&T#H-LtjGX_4M?_bdGg9i!5K%qTJm}DfqkRXl2YQaqf}n zv-9Fw#X-ZBZASDi`!^@sC%w$XG;ex66kAf#)eX zVVwA4XuFY^f}3|+{-Xaz_7gj&;SA_4B!&F2xWcC|kLTwvOl7$e2x125N%7-Hcu=^+ z-^(KrA0SpH&_tG)_TvasSwG>fcT5U76yw7;;o>%uMwBQ}-9eW^_EaOZt*Rh5nFGvo zBO%rdTC*DY!)CB7?QYUG%FO z*K_g6=0jTGmifO1I-~`$X<<7i zgdbu5F%X9=IBe3JhWoSlmw`{RcR&wt9&84Bo|&?MNe-}S<3I^8gO?{S+OPp&uZfT% zR)|oSKT&^rylxL!{hS)Wld>uvieD~>WVl%p?4r?xAuu~?d6Zwvx1o{UHyFrTD*A`N5*SXC0ot`Pu~73+C&Ai!&1W5Ci&dS za&tgv;jykz`>_I5slB}IEWj2mq_5U#*2L zCf6}~bj4!)=DpMiK;<>$Rs?qpNN^MTGG_HL|2ho*Fnt>` z|2i1eZlKbgXcrD{5Q|BGeqj)jf=%pLb`Q&e$w7vuTG8HeOonM-(4I*o)jTz}?1_jUeZlpc&H2$m#<+5x__2iUkP0`}O& znH*>g&JPgqCjj`?nA4p=LE(<;WBmL>it-op;OO`TucRH1}=a$>5P zJnYmI1%)c=koVFd^Ne@&`uRi?c@Jfxa!DuEFQ(I0E_qTXWP+nVyU0PV844*iBM)B_ z{}b6*B#^|k+yNFdM2a4j=v*&>`PXm(bUv^?9Z>`0$x=nJ364UH+{pSK?Yv6NTQ%{QI?i{v zR#a=AX(M7cs^vheu-cvI8Sg|WuoqTxFuDIWEL{M_K1zuO zy{|r=U2w(kf360``$UaKPyhgKss7L7n*L1`|F@EgW=$yX#8nr*RZoqEuRb__Uw;NV zEkRdz4Ej+2=s!UWu%J=?01Y(!{V7q@U|bTJ%!L#>EmazeE^{n!3(H>ak&8Bf7r|8) zLM^UVnZ-66F4rq28mq<@EiSQr31z=dw`AvyU*qiKDPISl+pF!TU$c+8$CtN0@01AD z$ghwSo0wNnSCOEfpjNkcyXR=i8%Q^`P#~dl!IyW-c(BVPYHQ?D@_*HG6pAHg4CR$SfxO%bIE%I`1ZLx%Y%44C-gx3RHdW;UsYo*0Rk6F1M#*^6~6lmGgm-^** z7M4%XQGS&0D`K+uB!|C%sH){SD?-e;&NIv)8Y?fgB}xsFOlLB)j|0;T4GNm?hc57+ zp{8_>3qOI#P~l0J%b_Wi%+Uep0>UKNiw+NI3Y*oS9z(?5LX2X!DA&}aAs36`SJ)p5 zOWd+71|vomlYOWtZvG-6v+Fd0@|Fe38r~yOA%uNg>{cL%Fy_ z-|kj-l9$JEo?(p%`SJ`($hvWz2kQ!$nUn+5z)sMrdoQ~olm(WJ?xO zp54s2SEO?Rm9UoVTSOw7yb_AIW+kj81SC}V$Gme_)C^i%d?W$^3}#Vh?@XGwtjf@e zcx!hfTs>K0m2;rVk!)KC&j6H{ax8yMam6|J;L<3N@+o*@aK3s!U%qz6*l$?CY@OAH zXFmX8EQwRQma-6?!2G9)bo`2k|1>RDPO=&%iu?puIjA>O=yTAG5+6^|s5c;ly9AZD z3e*oNB@WTHj)mBbyFmC0no&&g)lqWJ5C{U+l9VerOmj69Caks6tf9uCK^d#wPQaz( zv3SvS!R#Ec@s&eh(ynD=FWA|PjeAdlcduTUI>9NE2;mo;u5KO)wquM|FCoJQ_Vtsf#oA5C5L#9e)vpX9t1ILTrE!e*u-ld-whw0yh55!M~!!rp!NwLuSs zxq(b7WQKjNr)_M{^d7RZdmnwfyp9&Q`fY&HYdm-|AjS8fKYm50MHLpt8{hek3%!RE zzfWwba~93=G< z4HvmMPnh4#C^HPzyA>#Ud`@$fPaSzxLNcr$YCZzBwcEb5V^MTPa9Yp#B`Yf#s$}0- z-=TJrOn}Gx znpdPxnP)0(5vtauR|%Ifr$~?2XB?M_)lIq>M>d0Rj{%Xrq4X(7$KhiRd2Y3d5ZOj9 zhZ!lsN^W1fg++Hgs0s{k0HN{m!+;iK_y7FymDMl=2*~eKu>i!1Xw_hDbk_n-F2;)D zm5!{2t(RGHveuf_t0paICA~ZCX8##Npp)6ma5ar|9oqHD*OzN!i=*MpTk-K~^-Nu5 zYc`JL2@BrR%A|RLbhI3(pJ3{aZ^qQV3^?|6@Yi?=fJ-Md?sAJ5G@i`AJaFAw6u?SX z?qLlpEC^S_6B^$<#fxeQ^#mI1jO7w(Jrk5f;R&=4fx45LkbliHHED!#0dA5FOYEWm zH^ltCh*P?V<3%N2oPocE4r;SC^J+6;#{`EtfIUJkMM2ndoLbHT?Kez%h2D3pxt_1) zEmVawa$%YaZKO}S7W&=}7}K3G3_E#sA`|>MlLy|7nYoiM5<9`y^j9_~ z_%VY*Oi#8Z9@05$XMlAlpY;j9LP|QMn(7t?nKcj&>%3nLSO)yfnBREkP}*D#ZXYP*oQFVvk5Tg}9|#I>D2Y36+vA^o?8k<(e^VNTV?1*I;# zwr*NwVFr@~tY<~qq+j+V0n3<0Ccw*vloT^6O+C|?u&lbqwO1TljgJ1q9@mQno`>Fi=O z2W^~FvQ}FD@2t-g;x=lb55t2`xb5gJI*!#TL~MU>ZU0rY!k)Ke=wFRpw6qN}ZqAjU zo|Z~1ndcNlsbP@^4@qh&Zx~hA4^XT{*K`zz+)2#BxPoYX{C#qJ4V{*UN#_s1frr7im=aLoKc8*&`BK>pPy*|VJHo~?@W)SU;}s>^V|{0YydB^&tv}BK)HeYea)D1e z?59rh-)I7U*i>X=61zjVV0^Y#BX@u=_)3ZZ6=$jy>_u~1gQx`aTQ~7Q@3`R-tQjq| zu`}G>=JeBDc~8@6S#8&v2~5{OFk z=ud6>x+MSt8%;?rxWf*E%TVB#fhb%3uSLT){wT!j6C43OLC6$|Xr{R}u(=nBeO1JZ zar2)x;XF$0B#oWC@CWygN6Ih~a#-63>VrO%Mvw6^Nn4BN`y@sx`L2QkJ{@X31KvTPi+d*-Zo)!5S8RFU_J zPx7GL88kAFYNNGv`~pq~_+=FPO~i90J7w%;?VhBiJP4z$SFNw#Dx)r5v=V{m_ ziaeZ$df8u5`dibgYoM@eL*866bRfVs;~+ZgPb;t|W#3E^zkiD+?4~AliD>cQ*{aoi z*`!4DWzlSwlvG$VZsV^mNk5B|g8EK|1&Ad;YY*7Qtp6oabUzJIKlH^MP1n8t`Ee z#Uk*9I@$E^%;uHqg=wH30-R2}rgmI6`N+O^PLH?j1IkX_q&44+8Jmb3Q*zZUcz$cE z!jP99w^w5nK=WZl1~@2V;-j1W0=k}J zzUI!EDOcHi{_D6}xKYDU4fqn!|1AN!xiz&fJB-&k%IO-bBJpb9ne3;XPiLZ#dV=z9 z>l!&)JC|!9{V_~s+pSI8kas{s(ilx^$*Bpwy*1ZXb&v(3a#WZNgiDnlF>D{O3_gh! zr_`dDL)wpSYGkda7)UAJ_dZN;2-9#POp2qE@>yg4*%PXx+SDyh>dFSV>{L}$Lk!wU zYEXBH$wCbTTAAul!j_sAe{PkMoE8u$Li&6fUz-y<52d}|Mh%I6l;RAZ688+s;drP# z0)ffyOqRDt9JS>gFCH6);(clb3N=mSu3ipHZZoo_+hCQzLqyVPYTTq)$IOqt(Sml| zV%BW4y9xjS6xu@!y?su9Ws2^4roZOSgszRMvaIjlJ`WvS@8OHcira7^19F0+N&VgC zPRV~YkNV?hs88smPnc|!nN{?c(@Dq~sLdTRotyfy8Ty_1~vGodL zvkQeO84$eQHDv09AFk%bse6f0>xrXlD~DJY4J~s9*=<-r;riHpetlvBlS7hzRRYXE z6}mkYz%v!H-KNi0yaWvRS*DG2ovGM#YgU(;x`0qV*YeG8`m4Tebw)R)f}E+oeZ zixV{{iv!!bgZy_q^f6(^zK1b-zblJ5i)0aNh8v$5?@jq&7lb~Ga;p(_K~|YQ`)pfQ zirL{8wbCzbzSB2}Vylb1_1n*VmCqRTTZQDwjdP@jz{>BO+$`R8O{EWMd7Q(E)S%B0l0BfUij1}oAV^+sE{O1_4 zn_*IV*7)|RP3A3Zp3WPq0k@Dlb=`(CcK$bN#Lv_trRLL{RIYU00ry%*yd>$Uy($3c7j zR+e%f+!n7)QM)RH&E^S}PqAy_l__<~C;Z2z?R3QCd&r0zczH;xNnu;E2mW?g85<$C zNsV|V6KT>^2naV$Jp@LkuN8$WM##=>tP*II;}v}2jxXGUb_Eys=M?z|Psxr-TXt(V zd107#MX>WT0bYbqssf*s8u3S)u8^*(@IKeeXdowWF;m{(NaK^dJ*8PLa5poihwV=f zjOkJQo|6~w)$)K4T>k7e_($sieETfTD^Oc<3~@iNFb7AJ>z`C?J4#|bqq@k%zJg9Q zq2(bV?g4qb_#na7nE0C{@l&#R-9K5`V|*fSTxjp5kng3ak5mpvq(`|nV|-i;SbgCF zz(-DV;X3TXvY>Pb9-z7dy(Si#2ZC|kLvS=W3Yr%SUg6~asqT9q$EibAY2=JdB_+;a zX@%JQd={9CujpP->N>%f;*Hj;h`X051*ldj*SHpETE>-iw)xhf9f~}q8^Qs=)HU0G zntEmeT_QP&D`to*E=X&x+z?vSjNVQ6<^%7E>hwCvXON?Yv!MIclg4ajNfUc3W^rtl z;_VIe-j96BI+}c(JaWtCUTB7RQ^>@0!6v$uSPyzCY_iDMQYxYk(Dt%-3v>1-YY6_{Kg~MQ5x++T zHlu{v7)wTXhr?T0e^;=~8|UnH@PQzBu`$gH8DA&(T~@xv6#UTuyfy4NW3m+Ms)7QP zDz$cw`==6r7Mi#CYGiP~b#T=;+%~aAaa?sig&xub(Mlf?_r=MC@non<%#P7?+8DCC zE#xy|i1X_jGrITYd3Xp^itgYwG;IyJ(CDKLz{r6%5y5yp2|R%r1w{ZJ_`2_$pe$q4 z3Elu!km$9YhYZQA^Xi{tyY9U?Jhh9U2!h4g{(J0Lh1`E%!^2GSwr=^Q;l@`p7JnPJ z_DJcT&5Ghsb~jKsiz}sJrG7{;0V_>FYeHKSnE*9E7?48!(M1uhY%&`NV#f#9LXWT2 zg8hKL|6Mr^7G#Sg9b`kEH!S*@F3?c&10r|o!eC_)d^F623m_;zyJn~_#P>q)*l?&) z$fr{xlf`KC4Ue2Gj!TT^N%Wt2x$%XzC-Js&h&i}$*GW~@}(;_pX>3Zn!&P%P>Xt;23 zndFsyk|BMSOqpC}gV?C3(PA8cmKb$@>AwmZmAwz9Rj=oaQRq8IK7E4*#=In?nSsM< zRdy+$7E-E)l5-GO<$W@4*!^Yr1>+X(VG?lY(2#>7xUy%5PFZ3cVK_pXZ~K>exFPDu zHTNk;(RkBz{Y4@i^`AfL(|}x_`j4mirNvw{!IS)bd3Y!hM4h)!sS*GIf-^TAE-trd z?Bos0Sdz~OeWRVg%m|uJe$$LL(rhAoHcI0H(%>8aRZA!-N2oSbkMKA1<$Nbsr^ExP zjo#mhOvc ztlI%bV$ZPWR=R@q^MMLw&Mt5d}hw>2$XIv*%kX;y1E#v)g-3TiLRXZUR&>n~GcSkd{UV zGosPsF!~K`(hd=VHPGsT^Neps4j$=ML0LDBj|{kYr*Pm2oE=$J@P*KZ_%h%GS>-T=!4}dn0aE|3T>4ax-16yk` z_Y!b4QkKJN5{-mRsdHG1K#w^RVVvH}c zIf})x1qPtFU~ytm^OgWDKR&PRMv0qDo{$t>8GCS2AUZ6Rvz_E^3AM6hVvBB_I7tN! zQvntj*L*->&qzaGT}vj%_C$K&bORR3B4bfz9|Xv^G=^Tiw3e>K0dn?pG>k>!Y@y9M zoXxQ^w0_)lw!%C_2oDd{TW6?MOap;4&l+`;hqF>}NiB%Wznr8Ri z+Chj5>e2Gp!#2SYJ4kHXuUsvcY?_)lU|Wi|X%FKIQFA~bP0w2}#rRRZD(_T@25Cka zlI}{hC*T_hZQI2|Rf)*MfWS}pu~OcXbR`FTcP2^2SX-3Oz*yj!<~=Kg zM30+j6A&qNgt4pY$K(004RpK6yylMC54c9&d_tz{QdpMO@&foa!D+n5K4lg zon(#D15}b#2GDaCBW4>z4J&k;N$TA#xn^|*1Ow|tBZwc+}0`4B74;FrI1XRtBdAE4pz>u7{@32f9n z-?-mWb`Fd#9iez`^vXdg6LaxuFh;eRQNrFt>vLn!JYZ6zj8eJNUjrTUk1Suf=w%0p zyN)W_$KRePLecOY=L$qkvIG$Z4b9P5Y2Y?|gc`vw&Nzv53`rOsv71BorJ?1VrWa|| zMm-V3INBTihB$t7J@?z2PfoBND9Elc$7W7d| z_jXLfb85&86F%78PuD~ZHfNtOL*{&OHe=rnRlabM?RqKCw+8hulLt++gnRGu_YnU& zfRj|uL=g}GK;M6DHX-@n96;XMz`|D9(ZI+`*u=p4Kls41@~#q=3i1!_d;MfX5)Dm= zp*d6&CTl=bakWkVk2t_EfJk5yax?8Xs*+FwL?kQRM_$kSQ6y6g-1QR(-aOdE8f@*% zTkacKS@YX=XFk73wu7iy7DSfUY>v~7+sy0s=i%Zl8^F_HOJBfvU?QEYTGrL4P>s@A z=b`r=IQDc3Dw4?SjUYw;vSE4J8cs>RY+pisc%YKDxOQgmp(ziHz@Pr7llp5pjM@YM zLqNR0I$CIOY;4RK;!vgWA!E*D4zBYf$EVA=bVjmMr}1{VoqoS< zZNAf7z3ox*`dm#_Rv=iAkBu0b~Z_r0;LTcm4oF1EyfovjhBazA(e1ni9vRZ zwrsj3(+Xm5m_$(0yU_5}cvg31(Y*QI@|e@HO-lW;kMYciVEPf`H5VkbIcl{=(wEOl z4y3}L3mc@0vOXVr-d3^`0|XYPy-uWDBz%e!0Q}n=Ojf7txX? z?ePwx_rOTm70CPb@*vt{h(BW2|7^_lO6De{>+p+DP7bU(@BdNuPEne5+0t;OZQHh; zm9}l$wr$(CZQHhDaK(+SFXZ{gldBodi`|9ZvOd=yzF1}Jp;gO7 z6GLhB4qJ_*+J@8KKkI)R-m`^}Q=Zql)5lV5-h{O)e{h=5T z`T=TynGfJAl?Tp_*0ha(b_|`{YpD6;w3!D#1oAe zA5nOU^kVSI*VA_9z_vOH3t&U6Z>jZBEV&U<+2q$zaYM8;rMNF^@{7-fugk6-9C8j3b>qp%j>4RW4 z2tmRY-8m*Ty_M%tBOfvcrVW$?VPR_4t|xn=w7EiijSmp6*B6gZ?y{iQdqwYa{IRX! z*Afo===rJqV+uOW4EPP8Q8Bz?Yj|mO{HtNSI=U&Psvy&E-w$Z5Bj}}D0q<^Yy-JFW zad?hZx^3b^b)8t-CfUZ_PqIA&NwJK~&(6yun-8wN=_gnw$0!q>vo{Q`Oz5)*rpdRI z%eN%^gY}tOb?E!Z&Us$0&B{25nLUphhzK7%j2gvbNY(Pg$#P7O{-neX<^Td~0 zG?!bf`#ESA%l+Nk8aP1yVl7`FxnE$ZZ54>>Z|!;M1Pd22>03F6b!ionYcrwVqq-_m zzyHb3ve>m?A_V*O%lyB_E|UD)f3T~Ojis@ysf&fZ$$z@^r?hK_tcds*oKkwd6s)8c zO!0~#<+AFTgH1MJL;~0N8NIg*Z$oeC*mDw;qe=Y_T;PY{^|OF`b$0`2$K-G z&{m#;@2BUP0QZ(akikmU?8ovJJkk0WoW<3E>NlNTm*>^XX>RxH?QaiCZaMWAB?+XY zc%73=TcIAE%~pfMlt?a(kkCFAW<)JHC`joOu@ln06MyIUVLf?paAxu*q-7P`3f=iV zq^c_f*c|r6cq#C^N*pN^jH|q%9LUICY0(tTNuo=_RPlsAq*$vIFAKE0AZ{nh` zlg~b({Hv0#cPfg{fqwm({;wf}|F)8pOwCH&?V4#d=F;!O=Ez9-kDxIK|A608z1!&0#Rzgv zcRQV2T(3Dh?+<^r-G8Y!&M`iSaNEj<$djyZ>u;jeg9#5pXO%G^BO+|0eDW2#`0QohmzX);th`o$bY8W!nktc%k?p{`j|5O5(RN&;=?h*3)UeP zM8TgCSjE!95>9}Y2*1ZCFgs=vYQWn}FzY+}u5aw5S$Qu_t`Zyc_>pV>YF9$sEF`_^ z$Q$94w0yjg4jkqSc!uhMby*f;vh^8Uv!KC}pQyCYGJ=Cy5q#uPBD?f6dbGWuy}NtZ z;R3G5GhE_`#S_ar<^Vr`^>t3y952U}ObQpXu zqjXAV61C*2sy?Fqbb?6bUo_1n^pjL7SLl+fc%HUMy|;CDt@)Dsf&Nu-2uY{}i2qcZ z+JC*e`fv54vW20OsfmJdO@###gzI}~h`b7&KVC&@ z?>Q}59sBaXzy9Q8czMnWl327tcJ%bwp-ndq1?!|hp~7FObt5&he$Xsj&rY3Wr;Cm% zrJxRkLZg*xkgHqsei20@$FzXWMwtG2<+>|FZ+uiFJ1B(V83rWOVF8=!`7^TtO~Yaj z%lh{5qj3~z1=$*O5Ou6YzA*PmLh^NOMxW~fKS9^(La<%tFRVo0`E;CH_?nv zTvuKpNMFiK;q}3z)ozfby2BhRchaG*H3_u8Z>d}l>Q(O2AFO%if?oE(L`Z$LJz{ zgq-qS4j?~BxA|uHH~-H69Sb$h$H&z$$fX@BE#@TG?aF5pOh2uPq(wT{K-K*XPKMVl z#D8&GQ$_1z8-0i)rtpa8{y2S`YtsDru1Ci#REf8H3X3!A48DUUD@)hrDVfz6#5i9$ zEs3UlL!4sZF3NG1v-jl((E71@sg8Z;bc z7Mrb8eG^ugT}woVoM=3O0vVqT;-$@4QXKV%EwW@gK2n;~0 zs6!SGN*%fl?zElPL794YrGN!dTOt#5x}H+!F7CMej*5Z19Sdb&eY9m2d*!{7UiTY) zl&(_lYyehquE@8|E?5i&$eAGjoPv>}MqC7s@!r))*p6>#6-yCmZm5+YI;J36Ea%rATyyRXs7xs3vdGTS@<1T8OXsA=opmaRa|&s^V~q~vFcWs>|x8MT%} zH#1|HsI44XQ$aP)6_}Zko21h>noh3>&fJvjWXs*iiaYc@n_y`cx4txfZJpHMge!udqE#C%Ef5GSa;Q2Wuu*l;60{Q)9aUACX;MCJV5441TjZH=_iR>` zl0Mm|jM)Gms|jrPV`*(8A-J(o=c9FuJ+W2#gBr#8JMDnhdymU)P&($jzU6PS?>)nz zujQxl{g1j^d6Ey<{W02t8&uT$*VY>1&;PKG4;FboHu$e!{qXsR}E zyR?`81$)E++RHr6GvZkN_K)jc()sSOhZp<8| z@tRU9gzOk^7F)|gbO?hu^K}q@9s-LG;3(F1R{mpefvy`qtSoz_S)IVfY|KLzoPG#A zh(~$2PS*=ROwnMjsb76Tkc>kC19sCTV4n?gJ{P`w{%C~p1^l^Pp%b+&rT63k7{L!5 z=8^lY*)$W9NPVuQ7@wY&_7oHq5P&SVa@##0t#^%qi6GAxZkw%*GTak_n1c8L#!c6J zVkEU8hB*ZDm=g?KXB}EonjB^w7Jgr}!$qrl6=W|lI1L;p?TBXRC38i^GTWSipx3Bd zVO4}&jGMjoXbc?rQ_J?3mn*lR{=Wlii{EGz?&nmqEz#4S#d1Kcz_M~Mua=*4IRxt5o)ZiI>XN+Rf z#6Q}e>Tatx8iG=3^u6+0TvAubK|NnMrb12>C}GoTy~UJnLE2<h`xn*E5t~@CkgbOryh~s)Y0nFx)(~W*wNyz$FU3~(cj1Cxrt;AZE+#0 zUSq~l?c~^bQNyB@-lc_+@7G##8WkC1g!!O?M+y|^4&HwN=pLI;s)4%M%SS^eH?A*T znA_m6iELL>x)8?`n+scGE`MyvOlE0DWs{NU^7f`J{ZU(ERY~D2&5pv53QN^p)PAXF z+A4o7)JW1%+Pc?E0vty89pZ?zGH-y{Afq_OIx=>mwR9s5L#o-n(>rW?d7qiv~CAT=y9f_X`*=u@Jh8X5-T!yQ{cv zPg(u9c%^b4;}e(4neluu-4l88a$;eHzX6Ib8ZM==K$pWox(_!IZ(BV+rO0JKc#&S+ z=Y(YcVAuZdBz1}M;(TFGOy8uOj$maX9Azv9*J3XM-$aFxA3v=6H$DzZjUT#noO9@R z`#lP;AG)SQ3(}R1qRruQ&L9OHRaikq&#ovz@bc!V*Um2q4+e$v)AneW0K#xcyOjGm zMmear2~kRCi3+38oNV@!2#>0K1;{xqV$3QIM&IpHnZVky4)+bzu7SaR+;Y1S31Lth_| zZfk8NW_$%;dQ(F~5x_|)iMEF}k~lF?X@1b(@x0@b=Kdg-mB{;J@eHR!BLS@K3VM9Y zQ*xNrD88?KGEBr&dxgIIxZ&ESKi0s5lwj2{K`D`CHB$v0S}R$|i^QIjbLBVd@DGss zvGmOK+nMx(VCl6?{j{|Ao7NX0*#8WY^M9dwKQP~E4a#Qw1*wkRsb;6EJk~c;k}*^s zmp`=4N>jg2YqWSulI4$~{p;0Lhv}arslOm*;*bA4+^_ZnI_SfyLvvZeN&oADV|as%R`;FliX8t zbl2Lqt~;Rn2C+TYsQ9BEB%inT%Z{@z#Z|x5o8nq>GsC_68tC0xTlN2oD2Um8oICx8 zLjkb=XAae}bog%^TB{C|p<;^V_tTlXySWL5j*e+ZPkrrV#t;a}OgLCqP2a8KB!~-X zyTLbbemleMEH(f=E7Kfp$q}jqGfTG}MQetkE-*dNBC||yhQR`3Z(3dJ?HcD>igsF+5h@8PcnYX^XmXskzS#Xex+Ls!F3#)9!?Jl_1;a)3wwC0Z8lM? z?^$FhmI@4vJ#bN}x{(KSZ>PiQs8p-GZh+`O3l%#2X%zTnOB2KEAm}g*g$$St>zNIp z(bLX>yxLlq+N;G{5l#$9v(442_fb4JU3<8kGw2YjhYvOOVyp=d>QdV+W@BYd86Z(m z-OhVhD-;(7%)-p>Qtwa>QwAo{2=|_ab+u*$%>M(_LP69^e+*dNSe4FW2cN4ANN+p*3NH%VK zs$(xlow6v*3niznfl*ub&T1yGvDF`7Rso$WF*q|vXy)q8w6wJOSgZ;ZOm$j3FgVN^{qnhpByjql<9CEiQ{h37&M; z)<{;g?Zd(Mqyn>o)Lx03jUBv5%fVRY3U=}>D*v`R)C`60zFvWGi!rB~1ZRQV#!O#z z`$)02EW15%4s;?@0l%+IT?e78QRSNf?99th;O6Kxr{l!y0nsIHLWik{HRdU(cl@lw z!dv>-1J8aO9Mb3Rpx$1s4(S3v4<)J=3Jv-}h!PlJBOk^cwAhd?Y}cS_N46i0mDS0m zFe5s?-Ve9H$<4pn?V!bYTPKcmJC#_HmK(=n80;`9V=a3HY*?wGM4pI4rKK8C)8{!o z9mE^OCm`IlTfq(4RY-B!_)MkvI`pA90mNGBbPz#}xT&@uehVsRe0fVMx#!So3s9AiC{t=2hO+vcpE z572k0Ro$RD+r=cKFW9pDq4d)X_r}hT04u$N!90w*a|7xd)h!#ryBZ9o?oKO_G0w!= z!#9Zr={hX)v(0igT`;0e+cx1es4N^GT~Mj^h(cZ^d`+s+>=4E&{>nnu{2!)gPX;RS zwQ!TZ(Rz`PANEH)O1=n=BOd8?F``{ZT}agsuUQM<_~C@PhRZMPwx4SfDXZE}O(Th5 ziEc&N8r#t!HERI_?{{g_kGaq~PySA-4#zMx9|X$uhfX$P#+IzuJM^olJ9lG#lCi2_ z%BFc?5W5}%MS1`YG2tZA9xe(GY0f?4-5kwRf`f3SpF&)JO=@WP#vk6sbnzlB>2~t) zTu6V7yv^_jVO0zoItY^GH3l-a*}_EYG*Q!>(x)l?2ps(joa^ZRY)FYx|ks6_8^ zmn3`_ThkU(oEx&=7@d)e*P367X7{*fB=k$MQV z--s`G@@bsyV;Q<1qIzCDn}<$Z>B3ol#Ii_wGe=(CIrK(bsd!V?)JDA8 ztQ1wBFx)K!=cdykyl7e9#!2vQRZ8Av%pr3U{m2H$`qc|ZApcdO zI!nbxyZj{;u7F-aOE7RAoC2vh)o*7tjm`B&d%~eZW)rqc)zbV>S;5Z~@$hX4f{}Wm z)bVaNtTAknW9mY!e!WzAi8Hd&C8%QZIMI?Ia8e|lB$ zh5d|J_lOr(jj*k<$R2_fh$dVC^#(qWbM*><4PQMg!|I`e_>+N(cC z^zsLq#(i5LY+UhxH&*Q@GFT{Ye;!z=tFI6UneG+c74+sisxa2k#h78!^d-)F&9LN| z18j~gQB1$Q@ujAcG9bf;;wixXpy_Equ5gne9gS0iVUT8KCiI6q43DYyWn76Xdah8% zO`WPb*kZ4K)2gDd&7F*^Lrk}%S@%*N$*u-hE7+mkv(~v7w1UO%RMpd2G#2)ZDdicq zw&|Ff*WT7mvmt?pa5wZ-{J4VYvZXLIrQEf5b>{5qn7K7~N^sQH!L8>+eT{9zjLnoE zS(P#J>_)Hvj7ZE%uIS^mU!qhtX=3eoBE%@nnA1&H9H#A+SWvc~Q@S%QIrkCSL4DF; z4-P@u+YpSV`?x+McROr-*1Jaa9VdPeT|>5*+H-a>1;#I2{Hg=2bt@Dh zcMw#=EPTR2`BWhcdI8*F0b>FCTp`)OHMg@MZ#{tVbaPVMF-`}6$?WyYt@pHnx&h*C zJj#0In`D%ZUWRugyxgqSS8mgHyl-EH9{7G1ZI6W1P8jb{ktID|%19^#0MpTXNRQn8 zK8wei2mYY-*s{&WGG^+C2^Xg{nvH=x>gK9@iGd$->*G6-b3sh#&j6W->e4UOG|ouu z4KzK1nn9XoTr;Ybp;R@6w_3qO?Wn#ClE*1@a~QEng=EmSX+lFP*};iSnufDV%z~}} zTxtpn_-71-(nv>!;*(L8+rmq@oGWck#%|0RU0831vyWd>p5xU90I^1k;s@Z#2i2iJ zt}$rF7xgLo{8Zfe^quMRO2L^B534>#bL3AvOCvp-%-OS*HjL#;%ogm$YNc4Id3Rf> zK9hTQ=k2fMI2`csa#=9!O8C}v;+9IM=MVQkF}Okdxu@mJwX=LwQ-wc1V~M2CY&*7^ zJ7ZImk#^NKdi)`!$jiQKjC2YJJ8_*aqsprw-HPRMxyb{3JWQ(|fH&Xi@gFFkbP}tG zzWy&Qp0mr!F1`zqDnofAC2)&Bk#ky+jNR8{jm9Btk%5x8w8rO0Z|tK+QKKo-$4bYX z>%`-V;9T(dK|*>CCabc6H%AN1&t-j(BnY>X>*Yg`!5k99w5otlSPZD; z&>K1KGMyO}gvjNXmnbUX4FV0O01#mhLPSDIxPw7ZKho{*2%A@JSD(+y>sNSWap3rO zU2tU;&-X8`Xbp4JM+~0ic<R2QBZe;f8-pAYe5>7_(_uV1=BZSpT^~2M?`pg}dXu&;JzX$2+qm?pb( z5|>J{4(K*~M41$#0%WMm0-hca-#KY zT?TWm-8SFfsQOa*pzM&-e%(%k%1qL0%I{6rFzy*) zP8tSb7?m6(UmP4!VD&iUsN92E``tgfC8rK-4{7#%jE6}INXR@~%`|Zje;`+~q9lA7 zB}$X?T6HYN=~UK(5&bsf6(cKup$VQ^8&C!gHyaLM5#cun5Tt}Mv@^r(8<>oB4F9;&Vu;0IcDE(g+E1yi7TK(} zGRdQbGAoq!QA?WX2iRpl*Rr4QIho%d%kh81=15&~X#!&t*+?x8<`((AZ(8TMz4N`F z;^%+sfi8r7B42}eu~xl5?KzNEj2d~BTqL<^CM%pmLF5vBS20{4Q)0q%v4MFaOO3R! z6omTB6;?`jQIrkP3KAb0=>7zE0yIVl9`W+d{a3ynzP%Wrw((nC$G?H<@f8g;g){S1 z3{n#a7KHmYT0oU`d$+-H+B6g+h~;n}!oM2jpia5nzp-$n6s$ynrbv%<{U?KJkx~68 zs`c@@C<}?D=j@Q`fVV|DZjfmk9lV5w*1BjXx9>@*!30x7f-HQfvmEOxoV%O5?gU~X zb*E)oGqL!NQx`JGVxKo+$YCGQu90K9$x_S}H3so-CsvNsIP8S+E^8SDTZw-2StTf_ zo=wSal2Ya(OTm?U%n&%>FBdI?Y{dkj8{@z>Zr50h@Q5}zCe zOk7(|9cQi)>oz`xb=h!62nz|M#lB8E<4zLqcu7+z6WLSZLuw2pHN8D$&=iOktN6(> zVTw&X(RS4&EYcOeB}#(v6+IT|CPuJZPmIQ%k2YGqm`hJA)k87@>96^JV zUVHdNL_V;ZNC?P5O0)+lcM|PdPDBLcpd+RSE$$$yV>6Qz9sx7g9O&3hIAA;J3G`7D z+JR}=Mex8qKt`wwe4y&gz+FfSmw}Bi5cWdn&BI;D3I_orBPZa4v2+sgSxSfqXb|Oc z>2PcSJ0e{+RZ!;9pCB-jEGOQh*-{tKWaxSe%!wI$DGa)*W#C8N`^b+!hv!mc2*g;P zYbAt!Aor;SU_3NgSh-ni*PkMs?`@?H*VXl{5p?0cSTOl>s!acml_y!;x*y%zxQ@}| zF&yO3SiFu9q^sC=5XKD_f1u0bOGfuGC);nGf$kHZiD3k-sN&lm98c{JyVHK4_8VZ& zk_={>|3iW_E1X9VMRJPmM+)D+NALc#m>1qe{s#y7NtW_Q6h4g3IstkwN#PtS+$ife zDqr0^e^X!Tsp~Dq8yCIE(qc8FIv*_ML!U^g!Vi5H`f zW_kk!j&~d8ouS^y8``p^l~vP$?*ljH{5Q8m#MFDO!^~rr_r?PV;H}W%div(g8}J4J z*vQ^?6y)4PisS3V`ys{snE}~Bdr^v~6T@;W7ZbT^X#4mk@@2%&St7xb9&FghSTcHm z9A5)C@E$IDZ(>-O;Y=as6Y~!CsSpxDN!Skz*$?=y_6w(>+8ek+0I1A9O?} zj}e z;vYE;(~_mhvuuyCVbNvv{-NoNf=JH^@Ah#U%wq75bCMJcY>BbTK()pEqLqKd69bI^k%90-R_P3}w|*dMUGg6N z&fC2qbc6T{W%MlsBi_Fl^~W&h=Fls7k6?_6iC96A3u4nnyB2i|mx{|Brs=)y;^mV0 zF)_X0WCX?dmhY!MdRmcO&YL{0SIG~d)T%UxF9y~U>ZDo`nzJn`8n#@twS_TCvL?e- zsUnS!B&GLAVkkAlI}TkO`Wvd}<_!njzDUCL3oV!`N9I6PD~u%#fI3I&keb$vHNA;S zj@%(JZ8FB3ITQ*iW|29iQKqzja$Yu?-uR}}ks`oC7Z^j9AjBDn*V2>F*pnbc3zUs{ zYbybm%3TdbFJ4gVdVEjGCQ0*w*6vi*rYg=oR4oACZb&aiZ<`U^OVZtWIjR`4Oq(RF zALRE6QH<8S9-+BjTkrU`H{#eERQ4e7ZV-6l3vL=tXk=){Vo)+CG7guzse?vBvA|Kl z;U8KTJ=z_mG2Jg=qq}bBqW+{Opxq|blRq3cwa4ya!6fwK(3!5O{N?!#T}L-)SyL87 z>q$$NDXIXQ+Mk9?8w^g8?BON+Kx97J=+HMcf-EX z=Znwvsk-i0v)Z(K>4T}(a+5wbV%?>Hi}QYS#qYq}@+Y~rnkv5 z^+MeaAM+16LUi&>e#Z>*wK3iL4n3W8=99T&jPD-1C3cS=@b@#_erIdHDmuM7ec^V- zCvMw1c(ae~ws76@I}x09#mOgqqIQPE-5!i}WGBB_ zpzM$w^UpqDImIV^)(qlpV!BHs`)`82Vs?&mi$Hj-M3ZSBw>p zg~%?K03%rxVf+c8;8)r%K|NZ3G&vkZI0$E!yIM<5pZuJi@o(#SjbG>ZHNGKB684PB zuCzf)O1-M|86?0FGTC$m>kD{GYY=B1+a#1h!+~3-#LyP&b+cB1p&54D3SujlZU z=lVv0^Aze@VV{|@z3Nh2Z4i~n%NDKnD>ckcXslA7EfDC`t8`)^p_D`Nul1O$!c)to z7JoMn+1Tq7jY!|kBbCXXN^D&e7WblCY&2yI-9~F8<3+n~XSv<4CL*$T+lAOol=oFn zm+yPRHM}ZKZ1V0o$i2+JZ;*9Ac0K8YHrbS@L8MI|#65+=`AIhf?2}#Q23~*gVpu~L zmfaTENmzO5XCWt9fC>Iki>&_CCivfGT35%oU%NLhp%=(Z!7Np*Q)P`$X<^Kiktl(Ik2hguy z0{@2@xBnkn;eX_wlBu(+&40>6^G%$V8Wune`?;XoimrXuYK`J?HAJUJD}<#2^-5&D zX_L89P<9GrP3((707y9iK;9&RR#_AoY0Mon?(%BU32nx(WpX~wPx+@Mng?sX$hKY!))Cm!4~vy zEa;xqBeBCDgNg^gd3JAMV;ig;M)9zv{0Y~iH#wK-1U?>uMKs=yblBCnqiMZsSrd!s zNNK5F6q!&SFT@pt;pa0oi z^#BP2srCx zoMCljHWM!6@khK-`r}mG@%R*8PY6FxxN$7}cfEmaEnQC~cb`4;uj8M*o`2T-^|~Po zu#W6#htd0X=F@9^HpkK-cq;_sArOqZBjQyLjy3>-940_(`pFQz5)l$!3Q(cRAJhp# z{ShsAl<4ok7;aG>6Tz@e_!SGhm;=M~=lI74_riHN8z(~~^sruxA>yLEr-MR1K@8pR zP2-{Cx*OAj6mO3uF!G)EtPrn}ZzU1(Oe)t&EYD)x)fS$?fuoqb>x_-0MC^~J?&WQONiS#mC=%2wHFvq{KjQ!QESYAicAw94ddg}ARpg>~xikGm+)0rpEl+ z)#tlT_F;^D9cc+H+9rIn^JFE#-tvLYzSm1LBzC_J0lYD3>uylUNo|n1m9=OE9B;4ippaAfIrZ< zCaZ}p#D4G7xR4c=xKml13Y*=h$(cQ&TWx-N`{ZV;3tU}IQ<*%L(F@D*t`H$)ydy5k zag<6=UqPAbW}Tg#W-9Iv9ukvF0T<023rRKoBEiH|hwX zWRdMeB1m<>Sc~w|0Jv}sGJZ!7>-d&u!XiPC`GAL$`k?2dJa|HdJB9$(e)6@U^arq^ z^heS~a8n&%=UHg;=$Oa~WR;!6YLxJMQa%Q%1da}p#>oHVDcJc#%S4^4BD0MK#_GqzWIpXa^vE$;TPJ=z@(>dW;%rVGDU;?r_z#PvFz z4o-eG>crb?7Whs{4r$h1Wa}uKYL9OPj2e*@GVg7&gAoC=JyKQDH}O|ok|nQas;gFA zq^FR}r!!TKXI7-~V_rmxPh^5LDA{WRbcIC-V^t%2>S(GKWrG_?awqTi%GXLAJI=pb zmogSsCTXN}QDdGnSjI^xkfq|v3`k}N9Xf^So(5P6x<6eny)NH%#1t*~IfHOIZn;3b zwAg0YZ`Mvim@RF&+S@v9teYQ@sIA>{H)VZG`dnWgXG}~S$YyjL@^c6CDl-2}O?ngw zgEK`wg(j-AKQGe3i3vYk9Isu7GE*+0Qe7=S)yTZ}@?iESZf&9TH_~Yfvvgv9B?~%m zu(2VpE4^Y}z^dvL3>GSK1)E-$Q>(}l@KX8VSOqmI_<-lxz(|&I$Om?q>ZXSyZw(}P z(wI@k%?3p|TDQ+Qt?Z6?~ins#DBeDeo*d8Aoay@DY#fTfme}Or22&v9JLL53f;I)=&Te>8bJkYEu zX&qZZAE5Tx@Ua7v!Fhs<@@^PwI>03QMkD2=)N`;kp^Lk(Zh$kE1R@r6^Q&t5srAqI z@xavM=IXg?{Nu3gm=!wQNI0S#=26w&+1USV)LwA39#Mm)+r%0 z1oT@#E+p8SZ#$<TkY@N7w zb}Dqz$aL5wD=)s%&f!r>D50+t7ybjR-(fM)20su0BWtB?WqFjdoSG?emtD-UvW1bC z0++^1W%+l1&S4{^W0!jw?;Dc40V{Q89=$>INqWF;@3>k+_KJw}oR8!X5`9^kOb8)W z47W7f8}{m+R}wz?8itfFNY2Y(Cm!Xz7-CE=M3@iLadWLp%^l&v<-qWh#-7h?&@JNDAe)UK2kX? zw__%pF^OcvhDg?npReHkY*4q{16K^mwUI{a4&wLgyf8!7 zoWHSZL7iFE4tk*q`lRAI${REDLWee$w!O(Yee1Y(x#vZ@f+P?8e~dgRM@-k|Cw_qc zr7>0))-B%tQ3H|xbsmuBf2%S6lfuxr(ndW)`|0iG;puJ$fvFBK4kDsPLIfMN0AY$G zTr0I!8Gs?e7&i@A-QB#oHYgA)wv?%<%xc-f&i0xPZ7Hp^BtD4UQ`#<@Up~7C{|h49 z`jDLeQR++0XYPgusj>LH`zMd<_0@fj=jyDTA@*0rVE(s8l%1XtbkIhj0mUH@slk*4 z^}SJe4646>GDdVdD+4GrXbSG!}7PC zflCU;+kI4!{gJAh=Ro-S#^F^D?(qo^Kdw=>{oB1RSh%CepkmLY{NCY-H^0w*xUmd= z`U42oZ%|w_&T*_VGxRDAHmtpJuyJk9syTvd_nfH*a};+S&bI5HPa>vXl4rTJrXdi zS+Q$+<2x?AFnoRE3n=4OyDMNROM>fd7;s&mqG}ve;gg)gJ2hlpp%)@eA}vA!L3) z`AIo+`90NUf4=N@IXS)J2MubhuG{Ym;+uZSjQ;YYKO#ZvAMivYI7$Z|RpvbT%8GT7 z&)M+}k_S8e`jJy~1gchnZR!;OeR6y_~eL#;|6l-rTn1j zs4@ao2QzDFvHLdK|2wu;OZJ1w|1}?oP}lFNFk0`BCnh9zH}>#{1KwXn$jPLqtG&g` z(%w|^s3SK&3=uZU3ElNeTG%Fl;`Tw988fcvkj|K+TEoDUY7a(*#}R`XzCXe|h^pC;ySZr}%QYD||iF_12F9^+zdN-91o4fL3W{s*x zWH*C!zth-D$E3=BGen5F*^W4_=^uMTUK=9!x@x>kyRR}{>?SJ!9gfjhq>@y}ld#FT zi-l*GH3xSzP;cQgGRs#s`I_zAhb${SJvRIlhEc-7jPYHnc%#5td$A28*!zK5+uEXi zC-G}Ail~ET2jieh!vpBhSiCT94UxCybQwD&->owva6D2uLvdJ&7tr$o_CVTMD2*#` zsJiyXoP>1UG$b50ZbKbsM?~r+ZK7=@Mr|!!fDeZSlLwM8$)O`ZrS8-E*U&?)B9riU zXa}UEL1+8GC%Xk!2dw=z;_;RaojP`i{^sY!{DraU6NcgHGhk?)7O>bcQ0Xt z>)q=2(k!2t+ue2@`U9ENh2TxX)I>v6=ag?3UK?$qHQlQvt~P2EYaC0ki5_%^>EVoG zDv`;!mz)J*P3=INAss3@#*n0~0(9Jw;Uz3;cqHfE@H^ zyrmhj;|~gJ1awl43#k}D)zTwYiq;OUc05FCOV4%SS4DW+g?)oP@WZ1NdXUY!r5;!n z^>$FRsXkm+vSbhSQ-m}8wj}GcY)Gf#wT(csB9%m_OqYdJennj=wiuzXeF&|~*o>hc zD~ahF(I^VGD01Er`lmqWlNeVfP}%<#Z(PLSj8bIIkQkpRm-+a}mD>1h1%hfS3vfuQ-3mbvDPD1tteHngAq6BFUs;SXO-=&lIcA2M{xY*+En>Ohd*Fs*z@34 z_sBKlvcp?UD20XS1RhhFGWyS}df8d-+?J?w00V2_Xyy;_`~S3L(*On}%uv66S^d|R zEaU%1n~6CY+M0?Oy8Ne8+gKHCWo=bV-OpnkAwmey5=NH(k|Fh8h^8V~u$cHgaq|fzb5zyBpWsgbevf1Z+@b_-1~&us zb~%?9AhFz3x~g1pd##Z=J5v_WWyzHm;1pf%Ri#43C9_b}zI1fOt5adO1^m6KG^)3` zyV+oEy(X5Kr_iR=Fm}r>O35=qdCa-ecTWdA6=X|X-N==bAeIS z*P^Ofr^)j|j5CiY)7VPX)1*tZ5F?;J*9g6@+kV^83K!ymnVRrKx2>5(+L4-YwWk(a zrajKpnf?!pE;ZjL)ocFDuN_!6w`1b~J3z$0rDJ10rwOM`twE0@7Za;_?KhUDbn^iB z%Bk9&S+iN^2d)|=Y61u9xVEb`q)RKs0+cEBH{1H!WpYLus+sBh7n*bMzH0M5>GwbSPKDhQwQn7ONQln0$rV&qeS}$l%W>iB7 zO6nc?XLOTT9QYVhz0in!aaQ~e@xqM$OqwqU@o{9sdb$f;2@dW^!xcC>7~j;;Im<+k z#u?W73;Dr<*~lr&{T)twJk0f1|I`}@sKRDzx{Vws&vckl9tCp*R&ShmZW*|+``0-a zLdO~+3#hR;;vi#Sd`GKDuqi4?FZf=8a1-XU25BdBU6zUCc~UARu+AVhbv3Nl3f8eJ z^0m((O@al62lUU88_=$6oSUp43`XxUm)NwJ7wuuBL({kDsg4s(j(QtMFOWYxg5~a8BpgATErR@=_1;MhC87aMFOdFnH&)EQ-BE59$3Uf z3CP51oq*BJgC7*>oZt;8^Ki}zl>qn-7V2a1LJb-0T;*W1t-h4dJIFVE$XRK=4Hi}lb2F0*s z2of(DRWn_Nw-4I5zGDc1_-u5N10(DM*YE*Xs7D}ZUM`|Plh}h|?~A&am>*`9q~!Hu#~1M@?Mrr>RT-n{=)`TW)N|lC z@XH0y&rZ*eecqwTl3OkGEVQk_9t@t*Ib(8a!ZiqEyE${cPqn=aNJ zkBt9PY&Oq3ME(1hFXsQ%FNg9!Q0)I}{P*)~pth415dDM0Mpzh$eu|AlN-9@KM3RoI zQQb(3D8}ed0a+y0&~Qc%Qf?mr37_THjXBqD1nYSCZh5K{8~4dm9_ve0ch3hz_8C`{ zbv989hcw}mS7l?j%d+(^^V`wQO>g8a?v2LXl`la*l4L{~>K#*^dO}Z;m^zq4@LH$~ zwUO3_2wK<9CFY_$pf?8m2p;#g-+vFhpd=T=@?f4zvLIZP%?pZH6uLX5_bP`p%Ze9L zsHH)DlVPQrQLbb|$PMKdAyS#MHk9L~J~g}^_~9Z~8KmBzs#_T<3y)!X#Og{DDHzb} zgUi2+it1TO(R+(gX++0F2kn&ye|@J(ld@v41=~r6Jz-9h_LtpSJFlzC4mi9sd?eP` zmb*Z!Y>(4gky4eu@K-S*WeofA~TIBR@Y__`R(x8in}>AWFK`n zLZNrnJy>JT365=EzVo@Lh~ROZ`gnb!mkBKbJSj~~(k()dDdr!7PfPm78@ib08chO84*6jw9`(k$Ga{_cqJ;M(QrE!4q|+;4Ed1Y?nVo>9(j zjkC9SshgM|*k3A_lK+q*c*6#t_7NtnoaE5Hp?@&kM;Bi?mv&zo&gE-#``^MG(%mu! zJHH1+YtKlzsgJ(Lf!7_ACz9ePP;bu(#d)(BB2J%2bIj2tvou$m;B6yp&meaXDV>yV zE6lu__gmbt?Ff6t_~CzM`)6+o25b(zzF{^!+n!zVSX{L;JwfpAJYG?EM^CyV=wER? zc%TYgq5nRRc}f)MvG>NAbcgb}q071j9vpbMrdGQRfjcU%TT}grOwChB&heo>{IbP@ zDT5)<`jN^QOq309SsR>$JEOix-E=$t#pnO{AJHl>jE-Ub+m|l^(EsO_3I9uk{0D%X zd%C%+&Obb~KLA*rSW*K_`o2TJ1{6^T5E;b42nokd1x|_jN~Huy!W9|(P?|Cj5j!); zr4sKbG4L&c!TesW%NW)0mo+>|E zV`dRYwt>p}{u2&L0@PfbR8C1k=D2g4IbWgnrDDG!a*yT+*^LzU_KMs22VpOnPAO8G zr3jgiG6&(QZWW=hDZAp4|IFVvju0|N#Kk&$jT1V=X47*`Au3k4m=g7;z+qd?p@x!6 z#5f!Qv-wZNw{hw77mXINnphR7`sx>jnP}Du)$jE|)D?*GOCzSy7X!_vAaD4(Y}@e((e~oBLiwEh%h;-~d8ZSw-o+ z`hxsT@**Ugngk8;f(@sM;&u*>2sk>qaM|^;H$T|HzOuFT8S8?OCLXc%%3N5v#6hPw z<)1GQ2nAep3~PGzgpEx6{g`(tFtu17QM4o$kO}ZLllgc~+rQaD!s7i3o zs_BptZapXVVSy3I=#zLl%+?x>-6Vosrm7&In5$_{R|5@?qCQ?p)m^eVawBTl_z$1T zPg!aU#cTZX`1ZV*Rjt&eFj(IaO;;67qF@;7?GkJqppp<*V_|Je35oUsma3yvXg61n zKj1YPm^6QY!ZIUYr|?4N$KPUwiM(i~s%dHA5AIzhgn1RVUhk@`4cNo|I^ zUs*P_xs|6>{)6vdjHZImkEu|-G*gm90d|?ZS6}>IF?diI+14X4nXRj-mY6Bf%@L!o zu8dm3f4euAq1SVpR@iVvr%V9bg}GlVbRZ>)shXr(8&rNO0ZFsmSLY*VYrsG`>h9Ty zk%2l(7DYMt5`Gx*FbOPon+7uQ_Lr3*p+k=xKnfSl&%*7Ig~XR0^z46(%-A$OowT(! z`f7@thJSOi9xbEsK+}zV20xhh13thLrZA+ z;!fKFOXZn$1ga_=GklUl@y%Bnyyt1k$O2fC>3G%e>C02k7|RKMmTd2Hhn1huctF{C z<*_rgrN#UpcG3XeTlg^N+KwK?DH}_dmC^P&tg~QhGv&=S*OwI(h|^FCNykQ#a0!cz z?P6Ma)<#)D3_30tR<2tKQI&%{r8Ec%|O1Iv%0X<7E%Pp;~vp8#^`EVVQeFn__?RUcd26}y}xt@s{l#zTywM1y!z#$bOs01v`UAy zev!*#5g4vE@|elcHY(ya%SWgsR?gQDWcM(o_1u!2@+_tgFQ)qc6-@+5M> zyKB?)us3)S-~Gvz_A(do?nnNO3BpmYRt0FfpU^Xa!_xwdPx{Eg2>Cb{Tr(^d?R5m( zv7I~ac%Z$PA6n%$9Z%>Pmh~{DW~6{WDkO38fwyq&?4*L_a8@@ivU;qE%qJlOYx}_G zblYWJ#R+_yuUviPbNPJKRT%?fV8|Nz+Y}CD5{_< z60yK^RPste%hgTH)hoC8B+;ED9?c%7VsAh!5po+5a`QMMFG6}(;nypACHHArU264} zW|w*FG9B&KYFN_wT_J4mkyF>;+N71Yy0S8NR6SKr=ozVJUX82T(wz`HOftTlZ6*yW zUr$kDWCc-#^amCtCIb^nVJ9ogsN->Cj*UKbd_bD#-l
XS+$UBuHjMLPE}eapUc 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

|jA1v4|A1 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%0DH2DGUQF*pO<<>lq4zd-l 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