Jump to content

Alex40

Members
  • Content Count

    24
  • Joined

  • Last visited

Posts posted by Alex40


  1. Hi everyone,

     

    I am currently looking for a good OCR library for converting images with text.

     

    Can you suggest any other than Winsoft's which is up to date with the latest Rad Studios?

     

    I also noticed that the Winsoft's OCR library doesn't seem to support Cyrillic alphabet recognition.

     

    Thank you in advance.


  2. 2 hours ago, programmerdelphi2k said:

    you can use PopUp (it is a FORM behind scene) with any other control into it, including your TListBox!

    Yeah, I got that, thanks,

     

    I chose to use buttons directly (as your example) instead of listbox with items. So far TPopUp does work really nice for the purpose I need it. For now I definetely stay with it.

    • Like 1

  3. Thank you all for your replies! 

     

    I really wanted to make sure that I am not wasting time in dublicating my logic into alternative components for no reason and that TPopupMenu could work on Android and iOS somehow.

     

    From what I concluded I should continue using alternatives.

     

    I started with TListbox, but I will give a try to the TPopUp component and will see how it handles all the processes. To me it looks like it is more flexible than the TListBox which is a good sign.


  4. Hello,

     

    I am using Rad Studio 10.3

     

    I am currently developing and adapting FMX Android version of already developed FMX Windows Application. In the Application we use TPopupMenu for hidden right click menus on many places. For some reason when MyPopupMenu.PopUp is called the app crashes on Android (Andriud 12 and Android 13). As far as I know it is the same situation with the iOS version which is also in progress.

     

    My question is: Is it possible to use TPopMenu for Android and iOS or there si an alternative?

     

    Has anybody used this Libray TRichView ? --> https://www.trichview.com/forums/viewtopic.php?p=41518

     

    This what I've read there:

     

    image.thumb.png.760f0ec2447e481c13acfcd2e52ab6db.png

     

    Thank you for your time in advance!


  5. On 10/15/2022 at 10:28 PM, Dave Nottage said:

    Are you using TLocationSensor? That's where it was fixed. If you're attempting to use JLocationListener on its own, you'll need to modify the class that implements it, such as in the Unit14.pas attachment, here: https://quality.embarcadero.com/browse/RSP-39566

    I am using JLocationListener.

     

    Your modifications definitely fixed my issue, as described in the Embarcadero Thread. 

     

    Thank you very much!

    • Thanks 1

  6. 21 hours ago, Dave Nottage said:

    Yes, the issue is fixed in 11.1, so 11.2 also has the fix.

    I am already with Rad Studio 11.1, but I am still getting this error:

     

    com.embarcadero.rtl.NativeDispatchException: Invoke error: method 'onLocationChanged(Ljava/util/List;)V' not found

     

    image.thumb.png.22c92f4b1af5a9af902611622e4bb9fb.png

     


  7. I am trying to use my App with Android Service for Location running in the background. App crashes after service is being started, I see the following error in the Log cat:

     

    10-14 11:12:45.861: E/AndroidRuntime(30933): com.embarcadero.rtl.NativeDispatchException: Invoke error: method 'onLocationChanged(Ljava/util/List;)V' not found
    10-14 11:12:45.861: E/AndroidRuntime(30933):     at com.embarcadero.services.LocationServiceProxyInterface.dispatchToNative2(Native Method)
    10-14 11:12:45.861: E/AndroidRuntime(30933):     at com.embarcadero.services.LocationServiceProxyInterface.invoke(LocationServiceProxyInterface.java:26)

     

    image.thumb.png.58cee204c788cf6480852a77f4932b32.png

     

    I found out that another person was struggling with the same issue after upgrading from Rad Studio 11 to 11.1 and after regenerated the new .java files:

     

    https://stackoverflow.com/questions/72807321/android-12-on-locationchanged-has-invalid-location

     

    Unfortunately there is no answer / fix to his report about this error.

     

    I tried a lot ot things but nothing helped fixing this issue.

     

    This issue is happening on Android 12.

     

    Android 10 is working fine (not tested on Android 11).

     

    If I upgrade to Rad Studio 11.2 is it possible to fix this issue?

     

    ------------------------------------------------------------

     

    Another question: 

     

    Is it mandatory to target sdk version 31 (with exported=true) in the android manifest template if I want to run fully compatible app on Android 12?

     

    Because after I put 31 in the target sdk version (with exported=true), my app is built but can't be installed on the device after that.

     

    The error that the .apk file throws is: Error parsing the file. (Same thing happens on Android 10 device)

     

    Any help would be higly appreciated!

     

    Thank you in advance !


  8. I've managed to fix it by myself. What I did was to:

     

    1) Download archive file, containing the customized units and libraries of the Midas library from here:

     

    https://www.4shared.com/rar/rGEOSrkNea/Arquivos_Delphi_Rio_1033.html

     

    and follow the instructions to replace the libmidas.a libraries for Android / Android 64 from the video below:
     

     

    My libmidas.a files are located by default:

     

    - for Android 64 Release in: C:\Program Files (x86)\Embarcadero\Studio\21.0\lib\android64\release

    - for Android Release in: C:\Program Files (x86)\Embarcadero\Studio\21.0\lib\android\release

     

     

    2) Added in Rad Studio - Tools / Options / Library the following paths for:

     

    - Android 64-bit: C:\Program Files (x86)\Embarcadero\Studio\21.0\lib\android64\release

    - Android 32-bit: C:\Program Files (x86)\Embarcadero\Studio\21.0\lib\android\release

     

    image.thumb.png.b95e6a20a08f8ebc6dea5578a20ee98a.png

     

    I am not saying this is the only fix of my problem, but this is my workaround to FIX it and it's WORKING !

    • Like 1

  9. Rad Studio 10.4.2

    As the topic says, I am facing issues with linking one library, which I am not sure why it is trying to link. You will find the full error below:

     

    [DCC Error] E2597 C:\Users\Public\Documents\Embarcadero\Studio\21.0\CatalogRepository\AndroidNDK-21-21.0.40680.4203\android-ndk-r21\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\aarch64-linux-android\bin\ld.exe: cannot find -lmidas
    [DCC Fatal Error] F2588 Linker error code: 1 ($00000001)

     

    From what I've read on the internet 'lmidas" is the libmidas or MIDAS library that contains the routines a ClientDataSet needs. Our app is using TFDMemtable and I am not sure why it is searching for this ClientDataSet library. 

    Does anybody have an idea how to solve this linker error? 

     

    P.S. - I've also added MIDAS library through the Add Featured Files in the Deployment options, but that didn't help.

     

    Thank you in advance !

    Untitled.png


  10. On 2/27/2021 at 8:24 PM, at3s said:

    Probably I have similar issue - application is freezing on splash screen in devices with the 64-bit system.

    I'm using libssl.so v 1.0.2r.

    The path is defined in an application in this way:

    
    IdOpenSSLSetLibPath(TPath.Combine(TPath.GetDocumentsPath, 'lib/arm64'));

    And file deployes in .\assets\internal\lib\arm64 folder.

    Where can I find that "SERVICENAME.template.java" file?

    It seems, I have not it.

    The SERVICENAME.template.java that I mentioned above is used only when the Project uses a backround service. You don't need it for the ssl libraries.


    To be sure you have an issue with the openSSL, do the following:

     

    1) After setting the lib path, call the following code:

     

    IdSSLOpenSSLHeaders.Load() 

     

    2) Then use a Logcat to see what these two functions return:

     

    OpenSSLVersion

     

    IdSSLOpenSSLHeaders.WhichFailedToLoad()

     

    You can see how I do it in the screenshot bellow:

     

    image.thumb.png.5ae24a74768efb239279eeb72d639baa.png

     

    Of course you can keep your folders lib\arm64. Ignore my folders 64 and 32. 

     

    And one more thing - I am using OpenSSL 1.0.2q and you said you use 1.0.2r. I am not sure if they are fully compatible with 64 bit Android. PM me your email if you want me to send you my files.


  11. I am glad to tell you that we finally managed to fix the issue with the missing libs for the Android Service. 

     

    The Service.template.java file was causing this problem. It is generated when service is built.

     

    The file was outdated, below you will find the difference in the files:

     

    NEW:

    @Override
    public void onCreate() {
    libraryName = "lib" + baseLibraryName + ".so";
    super.onCreate();
    ProxyService.onCreate(this, libraryName);

     

    OLD:

    @Override
    public void onCreate() {
    libraryName = getApplicationInfo().nativeLibraryDir + "/lib" + baseLibraryName + ".so";
    super.onCreate();
    ProxyService.onCreate(this, libraryName);

     

    To be sure you have the latest version of the template java file, named "SERVICENAME.template.java" - when you upgrade to higher version of Delphi, just delete the file from the Service project folder and build the Service again, so the Delphi Compiler generates the latest one. If you have custom settings there, you will have to include them again in the new file!

     

    Regarding the OpenSSL libraries issue - I haven't tried to set their lib path the same way as the service does, but as far as they work in the Document path, I am fine with that.

     

    You can see as well the difference between the old and the new file in the screenshot below:
     

    image_2021_02_15T08_41_58_434Z.png


  12. 4 hours ago, Rollo62 said:

    library\lib\arm64-v8a
    lib\arm64-v8a a

     

    So what you think the issue is, the missing library,  or the added .a ?

     

    I have no idea where are you seeing this 'added .a'. I wrote:

    "It changes to lib\arm64-v8a and I think this could cause the issue", please read carefully !

    And I said that all other paths are generated the same way - assets, res and the rest, except the library\lib - it is only lib. I am just guessing.

     

    I have no clue what is going on and why nobody has faced similar problem until now.


  13. 14 hours ago, Rollo62 said:

    Do you have a simple test app, to be able to verify that it doesn't deploy ?

    Did you add the deployment manually in the deploymment manager (I remember there is also an automatic addition somewhere for default libraries, but SSL shouldn't be in there) ?

    It does deploy the files, but in deployment we set remote path: library\lib\arm64-v8a, but in the generated .aab file the path with the libraries is not library\lib\arm64-v8a. It changes to lib\arm64-v8a and I think this could cause the issue. All other paths are following the same order, except the library path.

     

    I added the deployment manually. I moved the ssl libraries to assets\internal and I load them with Tpath.GetDocumentsPath , so I don't have an issue with them anymore.

     

    But there are still two more libraries that I need for my service I use:

    1) libMyService.so 

    2) libProxyAndroidService.so

     

    They strongly want to be in library\lib\arm64-v8a and changing their remote path is causing build errors or crashes when I try to start my service.


    Successfully found and loaded the libraries on:

     

    1) Lenovo with Android v.7 and arm64 (64 bit version)
    2) Alcatel with Android v.8 and arm (32 bit version)

     

    Failed to find the libraries:

     

    1) Samsung Galaxy Note 9 with Android v.9 and arm64 (64 bit version);

    2) Xiaomi Pocophone with Android v.10 and arm64 (64 bit version);

    3) Refering to the support feedback from the users - most of the phones from this rank do not find the libraries in the lib folder

    I get confused why some phones found the libraries, but most don't.


  14. 22 hours ago, Remy Lebeau said:

    Sounds like an issue that needs to be reported to Embarcadero.

     

    I decided to check with FileExists if the .so files are located in the lib path after installation:

     

    1) When built with Development configuration(no matter Debug or Release) and installed directly with APK from Delphi, the .so files exist and there are no issues;

    2) When built with Aplication Store configuration and installed with apk from the AppBundle file using bundletool, the .so files do not exist.

     

    This is tested on Samsung, Xiaomi, Huawei with Android 9 to 11.

     

    Very interesting is that on Lenovo with Android 7 (arm64) the files exist in all the cases and there are no issues. I guess all phones with Android version > 7 face the above problem.

     

    I am surprised that still nobody has faced this issue for so long time, at least I couldn't find any information about it.


  15. The problem is not with the SSL libraries actually (this is what I've thought from the first place). It's with the delpoyment of all the .so files with remote path library\lib\arm64-v8a.

     

    I managed to run the ssl libraries when setting the remote path to .\assets\internal\ and calling in my code the DocumentPath instead of the LibPath, but this is not a fix for me. I have several more libraries, which are set to be deployed in library\lib\arm64-v8a and now they are not found (for example for the location service - libProxyAndroidService.so).

     

    Thanks to bundletool I can install (simulate) app same as downloaded from Play Store and the result was the same before setting the ssl libraries remote path to .\assets\internal\

     

    When I open the App Bundle package, I can find all the .so files, which I've set to be deployed, but they are in external base\lib direcrtoty and I think because of that they now are not found inside of the .apk. 

     

    Untitled.png

     

    Do you have any suggestions how this could be handled? Is it a setting or something?

     

    Does anybody managed to load .so files throudh App Bundle with 64 bit Android?

     

    Edited: I found a similiar issue with another .so library, a fix is provided for the Android Studio, but not for Delphi:
    https://stackoverflow.com/questions/63931010/delphi-10-3-android-remote-service-crash-when-binding


  16.  

    Quote

    And?  Did you try using a newer version of OpenSSL?  1.0.2q is not the latest (I'm guessing you are using the libraries from Indy's GitHub repo?).  The last version in the 1.0.2 series was 1.0.2u.  I don't have Android binaries for that version, but I'm sure you can find them if you search around.  For supporting the OpenSSL 1.1.x series, there is this SSLIOHandler instead, but I don't know if it works on Android or not.

    I got my ssl libraries from a member of the forum and I didn't know about the Indy's Github repo with 1.0.2u for latest version. I will try to find the Android binaries for 1.0.2u and let you know if there is any difference ! I hope this fixes my problem.
    Meanwhile if you manage to find them, please send me a download link.

    Quote

    Do you have libssl.so in the same folder?  Are they from the same OpenSSL version?  Are you calling Indy's IdOpenSSLSetLibPath() function at program startup?

    1) Yes, I do have libssl in the same folder.

    2) Yes, they are from the same OpenSSL version. 

    3) Yes, I am calling Indy's IdOpenSSLSetLibPath() function at program startup

    If some of these 3 points are not set, I would not be able to run my app with Indys at all.

    As I said at the beginning - I have no issues with Debug / Release - Development configuration, as well as Release - Application Store configuration, where .aab file is generated. The issue comes only when I download the app from the Play Store.

     

    Thank you for your time, Remy!


  17. Then why the only moment ssl libraries are not loaded, is when the app is installed from the Play Store?! In all other cases it works?! I've tested on many phones, including mine, which now throws the same error, when I install the app from the Play Store. And I've also found on StackOverflow a similar issue as mine, which was solved by deploying "newer version of openssl libraries":
    https://stackoverflow.com/questions/59602114/android-fmx-indy-ssl-works-on-debugging-but-not-from-playstore-download

    37 minutes ago, Remy Lebeau said:

    Modern Android versions simply don't support OpenSSL anymore.  They use BoringSSL instead, which Indy does not support.  And on some (not all) Android devices, BoringSSL gets used even if the app tries to use OpenSSL dynamically.  So, unless you statically build OpenSSL directly into your app binary, using OpenSSL on Android is a hit-or-miss endeavour.

     

    1) OpenSSLVersion() does not report anything (returns empty result)

    2) WhichFailedToload() returns: Failed to load /data/app/com.myapp.app/lib/arm64/libcrypto.so.

    37 minutes ago, Remy Lebeau said:

     

    What does Indy's WhichFailedToLoad() function report when the error occurs?  Also, does Indy's OpenSSLVersion() function report anything?


  18. If you are talking about the post "Loading OpenSSL dynamic libraries arm & x86 (FMX, C++)", it is not related with my case at all. I am aware how to deploy the SSL and all other type of librarties. The problem occurs when the app is published to the Play Store. In all other cases my app runs as it should be, except when downloaded from the Play Store.

    2 hours ago, Keesver said:

    I can remember that Remy Lebeau posted some messages on this.  Searching for "openssl android remy" will bring you to StackOverflow.


  19. Yes, of course. As I said. I've even exctracted the .aab file, which contains all together the 32 and 64 bit apks, and my 64 bit apk runs fine. I also test on Release, Development configuration, it's working. It's an issue with the Play Store hanging my libraries, but I am not sure what exactly it is.

    2 hours ago, TurboMagic said:

    Have you made sure these files are in release config of 64 bit platform in deployment manager as well?


  20. Hello, I am having a weird issue which I don't know how to handle and your help would be appreciated ! I use Rad Studio 10.4.1, SSL libraries version: OpenSSL 1.0.2q  20 Nov 2018 ( I am not sure if there is a newer version, which is compatible) 

     

    After a long time of searching the correct libcrypso.so and libssl.so files for the Android 64 build, I've finally managed to make my app working in Debug/Release - Development configuration and Release - Application Store.

    Unfortunately, after we published the Release in the Play Store and downloaded the app, all users with 64 bit smartpfones are facing the problem - Could not load SSL library, same version in Debug/Release, installed from the Rad Studio works fine.

    To be sure I am doing it right from my side I extracted an 64 bit .apk file from the .aab package to be sure I am installing the same build as in the Play Store and the app loaded the SSL libraries without any issues, it fails only when downloaded from the Store.

     

    Smartphone brands tested with 64 bit Android, which failed: Samsung, Huawei, Xiaomi with Android versions from 9 to 11.

     

    Smartphone brands tested with 32 bit Android, which succeeded: Lenovo.

     

    Has anybody faced the same problem and if yes, how did he solve it? Do I need new version of SSL libraries and if yes, where can I download them from ? 

     

    Thank you in advance for your help !


  21. This worked great on my application with Rad Studio Sydney 10.4.1, iOS 14.3 and Xcode 12.3.

    I had some issues of firing the OpenURL event, but now everything works as it should be. Thank you very much ! 

    On 2/9/2020 at 5:35 PM, vfbb said:

     

    On 2/9/2020 at 5:35 PM, vfbb said:

    @Dave Nottage

    Hi Dave, I tested and works perfectly!! Thanks you so much, you are the man!!

     

    Just to register here the complete solution. (I preferred to patch the delphi source files because I already have others patchs in that files)

     

     

    iOS - Handle incoming url (custom schemes or universal links)

     

    In the file iOSapi.Foundation.pas put the code:

    
      // Dave Nottage code (https://www.delphiworlds.com/)
      NSUserActivityPersistentIdentifier = NSString;
    
      TNSUserActivityBlockMethod1 = procedure(inputStream: NSInputStream; outputStream: NSOutputStream; error: NSError) of object;
      TNSUserActivityBlockMethod2 = procedure of object;
    
      NSUserActivityClass = interface(NSObjectClass)
        ['{412EAEBF-5927-4D01-B83F-69D3B5DFE7B5}']
        {class} procedure deleteAllSavedUserActivitiesWithCompletionHandler(handler: TNSUserActivityBlockMethod2); cdecl;
        [MethodName('deleteSavedUserActivitiesWithPersistentIdentifiers:completionHandler:')]
        {class} procedure deleteSavedUserActivitiesWithPersistentIdentifiers(persistentIdentifiers: NSArray; handler: TNSUserActivityBlockMethod2); cdecl;
      end;
    
      NSUserActivity = interface(NSObject)
        ['{B8C2F6C9-31FE-4282-B7CA-98C96E163033}']
        function activityType: NSString; cdecl;
        procedure addUserInfoEntriesFromDictionary(otherDictionary: NSDictionary); cdecl;
        procedure becomeCurrent; cdecl;
        function delegate: Pointer; cdecl;
        function expirationDate: NSDate; cdecl;
        procedure getContinuationStreamsWithCompletionHandler(completionHandler: TNSUserActivityBlockMethod1); cdecl;
        function initWithActivityType(activityType: NSString): Pointer; cdecl;
        procedure invalidate; cdecl;
        function isEligibleForHandoff: Boolean; cdecl;
        function isEligibleForPrediction: Boolean; cdecl;
        function isEligibleForPublicIndexing: Boolean; cdecl;
        function isEligibleForSearch: Boolean; cdecl;
        function keywords: NSSet; cdecl;
        function needsSave: Boolean; cdecl;
        function persistentIdentifier: NSUserActivityPersistentIdentifier; cdecl;
        function referrerURL: NSURL; cdecl;
        function requiredUserInfoKeys: NSSet; cdecl;
        procedure resignCurrent; cdecl;
        procedure setDelegate(delegate: Pointer); cdecl;
        procedure setEligibleForHandoff(eligibleForHandoff: Boolean); cdecl;
        procedure setEligibleForPrediction(eligibleForPrediction: Boolean); cdecl;
        procedure setEligibleForPublicIndexing(eligibleForPublicIndexing: Boolean); cdecl;
        procedure setEligibleForSearch(eligibleForSearch: Boolean); cdecl;
        procedure setExpirationDate(expirationDate: NSDate); cdecl;
        procedure setKeywords(keywords: NSSet); cdecl;
        procedure setNeedsSave(needsSave: Boolean); cdecl;
        procedure setPersistentIdentifier(persistentIdentifier: NSUserActivityPersistentIdentifier); cdecl;
        procedure setReferrerURL(referrerURL: NSURL); cdecl;
        procedure setRequiredUserInfoKeys(requiredUserInfoKeys: NSSet); cdecl;
        procedure setSupportsContinuationStreams(supportsContinuationStreams: Boolean); cdecl;
        procedure setTargetContentIdentifier(targetContentIdentifier: NSString); cdecl;
        procedure setTitle(title: NSString); cdecl;
        procedure setUserInfo(userInfo: NSDictionary); cdecl;
        procedure setWebpageURL(webpageURL: NSURL); cdecl;
        function supportsContinuationStreams: Boolean; cdecl;
        function targetContentIdentifier: NSString; cdecl;
        function title: NSString; cdecl;
        function userInfo: NSDictionary; cdecl;
        function webpageURL: NSURL; cdecl;
      end;
      TNSUserActivity = class(TOCGenericImport<NSUserActivityClass, NSUserActivity>) end;
      
    ...  
    function NSUserActivityTypeBrowsingWeb: NSString;
    ...
    implementation
    ...
    function NSUserActivityTypeBrowsingWeb: NSString;
    begin
      result := CocoaNSStringConst(FoundationFwk, 'NSUserActivityTypeBrowsingWeb');
    end;

     

    In the file FMX.Platform.iOS.pas, in the TApplicationDelegate class, in the private section, put the code:

    
        class function applicationContinueUserActivityRestorationHandler(self: id; _cmd: SEL; application: PUIApplication;
          userActivity: Pointer; restorationHandler: Pointer; restorableObjects: Pointer): Boolean; cdecl; static;

     

    In the file FMX.Platform.iOS.pas, in the implementation of the method TApplicationDelegate.CreateDelegateMetaClass, before the line "objc_registerClassPair(DelegateClass);", put the code:

    
      class_addMethod(DelegateClass, sel_getUid('application:continueUserActivity:restorationHandler:'),
          @applicationContinueUserActivityRestorationHandler, 'B@:@@@@');

     

    In the file FMX.Platform.iOS.pas, in the TApplicationDelegate implementation, put the code:

    
    class function TApplicationDelegate.applicationContinueUserActivityRestorationHandler(
      self: id; _cmd: SEL; application: PUIApplication; userActivity,
      restorationHandler, restorableObjects: Pointer): Boolean;
    var
      LUserActivity: NSUserActivity;
      LURLString: string;
    begin
      Result := False;
      if Assigned(userActivity) then
      begin
        LUserActivity := TNSUserActivity.Wrap(userActivity);
        if NSStrToStr(LUserActivity.activityType) = NSStrToStr(NSUserActivityTypeBrowsingWeb) then
        begin
          if Assigned(LUserActivity.webpageURL) then
            LURLString := NSStrToStr(LUserActivity.webpageURL.absoluteString)
          else
            LURLString := string.Empty;
    
          Result := PlatformCocoaTouch.HandleApplicationEvent(TApplicationEvent.OpenURL,
            TiOSOpenApplicationContext.Create(string.Empty, LURLString, nil));
        end;
      end;
    end;

     

     

    Usage

     

    
    uses
      System.Messaging,
      FMX.Platform,
      FMX.Platform.iOS,
      FMX.Dialogs;
    
    constructor TipUrlHandler.Create;
    begin
      inherited Create;
      TMessageManager.DefaultManager.SubscribeToMessage(TApplicationEventMessage, ApplicationEventMessageHandler);
    end;
    
    destructor TipUrlHandler.Destroy;
    begin
      TMessageManager.DefaultManager.Unsubscribe(TApplicationEventMessage, ApplicationEventMessageHandler, True);
      inherited;
    end;
    
    procedure TipUrlHandler.ApplicationEventMessageHandler(const ASender: TObject;
      const AMessage: TMessage);
    begin
      case TApplicationEventData(TApplicationEventMessage(AMessage).Value).Event of
        TApplicationEvent.OpenUrl:
          begin
            Showmessage(TiOSOpenApplicationContext(TApplicationEventData(TApplicationEventMessage(AMessage).Value).Context).URL);
          end;
      else
      end;
    end;

     

     

    • Like 1
×