Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug with Korean mode #1282

Open
fujiwarat opened this Issue May 23, 2015 · 25 comments

Comments

Projects
None yet
2 participants
@fujiwarat
Copy link
Member

commented May 23, 2015

What version of the product are you using? On what operating system?
OS (Linux distributions, UNIX or ...): Ubuntu 10.04 LTS 
Architecture (i386, x86_64): x86_64
IBus version: 1.2.0.20091215-1ubuntu4
Input method name and version: IBus-Hangul 1.2.0.20100102-1
Python version: 2.6.5-0ubuntu1
dbus version: 1.2.16-2ubuntu4.2
dbus-python version: don't know
gtk version (if bug is about gtk applications):
qt version (if bug is about qt applications):

What steps will reproduce the problem?
1. make an empty text file
2. in Hangul mode(Korean mode), just type two words, like "철수가 학교에" in the text file
(don't press enter !!)
3. After you typed last character(in this case, "에"), just click anywhere among first
word("철수가")
4. Then, whole sentence will become just like this: "철수에가 학교"
5. You see? "에" moved to first word. 

Conclusion: When I click somewhere among first word, "에" must not move. But, because
of bug of IBus, last character moved. "에" moved to between "철수" and "가".


Original issue reported on code.google.com by virtuachoi on 2011-07-13 09:48:09

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

I just tested this on Ubuntu 12.10 (64 bit) using gedit and the 에 moved. Ibus version
1.4.1-7ubuntu1

Original issue reported on code.google.com by vialick on 2013-01-20 02:06:03

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

It may be a bug of gedit or GtkTextView.
They should call reset method before moving caret.
But they don't, I guess.

Original issue reported on code.google.com by choe.hwanjin on 2013-01-20 03:59:02

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

Not sure if they all use a particular framework, but I just checked and found the same
behaviour in LibreOffice writer, firefox, chromium, GVim and idle.

Original issue reported on code.google.com by vialick on 2013-01-20 05:48:03

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

If so, they are all have the same kind of a bug.
How about to check other ibus engines ?

Original issue reported on code.google.com by choe.hwanjin on 2013-01-20 11:18:32

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015



This is a bug in ibus.

I have tested GtkTextView with modification.

in gtktextview.c

static void gtk_text_view_multipress_gesture_pressed(...)
{
...
  if (n_press == 1) {
    priv->need_im_reset = TRUE; /* added */
    gtk_text_view_commit_text (text_view, "["); /* added */
    gtk_text_view_reset_im_context (text_view);
    gtk_text_view_commit_text (text_view, "]"); /* added */
  }
...
}

1. We type "가나다라마" in gedit, "마" is preedit string.
2. We click between 나 and 다.
3. We want 가나다라[마], but the result is 가나마다라[]
4. If we click other line, [] is printed before moving caret, then caret moves.
 ex) When caret is placed in line 2, if we click in line 1, "[]" is printed line 2,
then caret is placed in line 1.

I have confirmed that GtkTextView works properly.
I am sure that it is a bug in ibus.

Environment:

debian jessie
gtk 3.14.5-1
ibus 1.5.9-1 with --disable-key-snooper

Original issue reported on code.google.com by cogniti on 2015-01-05 15:39:42

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

I downgraded from Debian Jessie to Debian Wheezy because ibus-pinyin, ibus-anthy does
not work in Debian Jessie. So, I tested on Debian wheezy(not jessie), ibus 1.4.1-9

This bug also appears in ibus-pinyin 1.4.0-1, ibus-anthy 1.2.6-2.
but it doesn't appear in imhangul 3.1.0-2, uim-byeoru 1.8.1-4.

This bug is due to asynchronous operation of ibus.

https://code.google.com/p/chromium/issues/detail?id=354495#c6

in Korean
http://www.cogno.org/node/121

Original issue reported on code.google.com by cogniti on 2015-01-10 13:03:52

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

I tried to debug, but failed.

when clicking mouse

im-ibus.so: reset function start
  proxy call: ibus_hangul_engine_reset
                ...
                dbus signal: ibus_service_emit_signal: CommitText
im-ibus.so: reset function done
...
GtkTextView: change cursor location
...
bus_engine_proxy_g_signal: CommitText
...
im-ibus.so: _ibus_context_commit_text_cb

GtkTextView: commit


-- detailed information -----------------------------------

ibus_im_context_reset
ibus_input_context_reset
bus_engine_proxy_reset
ibus_hangul_engine_reset
ibus_hangul_engine_flush
ibus_engine_commit_text
ibus_engine_emit_signal: CommitText
ibus_service_emit_signal: CommitText
ibus_engine_update_preedit_text
ibus_engine_update_preedit_text_with_mode
ibus_engine_emit_signal: UpdatePreeditText
ibus_service_emit_signal: UpdatePreeditText
ibus_engine_reset

bus_engine_proxy_g_signal: CommitText
inputcontext.c: _engine_commit_text_cb
inputcontext.c: bus_input_context_commit_text
inputcontext.c: bus_input_context_emit_signal: CommitText
ibus_im_context_set_cursor_location
ibus_input_context_set_cursor_location
bus_engine_proxy_g_signal: UpdatePreeditText
inputcontext.c: bus_input_context_emit_signal: UpdatePreeditText
bus_engine_proxy_set_cursor_location
ibus_engine_set_cursor_location
_ibus_context_commit_text_cb:글

Original issue reported on code.google.com by cogniti on 2015-01-19 13:32:52

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

I still don't get time to see your problem.

Original issue reported on code.google.com by takao.fujiwara1 on 2015-01-20 07:44:59

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

That's all right.
I solved the problem using workaround because it is very difficult to re-design ibus
with sync mode.

I made patches using ibus-1.4.1, ibus-hangul-1.4.1 on Debian Wheezy
NOTE: This workaround affects other ibus-*.
If someone does not want to commit pre-edit string, you may have the option to commit
or not to commit by preference configuration.

Changes are:

client/gtk3/ibusimcontext.c in ibus-1.4.1

  removed key snooper
  added commit procedure in reset() in client/gtk3/ibusimcontext.c

engine.c in ibus-hangul-1.4.1

  removed commit procedure in reset() in engine.c

I believe that these patches also solve https://code.google.com/p/ibus/issues/detail?id=1420

diff --git a/client/gtk3/ibusimcontext.c b/client/gtk3/ibusimcontext.c
index 72db581..26bcc8d 100644
--- a/client/gtk3/ibusimcontext.c
+++ b/client/gtk3/ibusimcontext.c
@@ -80,7 +80,9 @@ static guint    _signal_delete_surrounding_id = 0;
 static guint    _signal_retrieve_surrounding_id = 0;

 static const gchar *_no_snooper_apps = NO_SNOOPER_APPS;
-static gboolean _use_key_snooper = ENABLE_SNOOPER;
+/* static gboolean _use_key_snooper = ENABLE_SNOOPER; */
+static gboolean _use_key_snooper = FALSE;
+
 static guint    _key_snooper_id = 0;

 static gboolean _use_sync_mode = FALSE;
@@ -478,9 +480,11 @@ ibus_im_context_class_init (IBusIMContextClass *class)
     _signal_retrieve_surrounding_id =
         g_signal_lookup ("retrieve-surrounding", G_TYPE_FROM_CLASS (class));
     g_assert (_signal_retrieve_surrounding_id != 0);
-
+/*
     _use_key_snooper = !_get_boolean_env ("IBUS_DISABLE_SNOOPER",
                                           !(ENABLE_SNOOPER));
+*/
+    _use_key_snooper = FALSE;
     _use_sync_mode = _get_boolean_env ("IBUS_ENABLE_SYNC_MODE", FALSE);

     /* env IBUS_DISABLE_SNOOPER does not exist */
@@ -516,18 +520,22 @@ ibus_im_context_class_init (IBusIMContextClass *class)


     /* always install snooper */
+/*
     if (_key_snooper_id == 0)
         _key_snooper_id = gtk_key_snooper_install (_key_snooper_cb, NULL);
+*/
 }

 static void
 ibus_im_context_class_fini (IBusIMContextClass *class)
 {
+/*
     if (_key_snooper_id != 0) {
         IDEBUG ("snooper is terminated.");
         gtk_key_snooper_remove (_key_snooper_id);
         _key_snooper_id = 0;
     }
+*/
 }

 /* Copied from gtk+2.0-2.20.1/modules/input/imcedilla.c to fix crosbug.com/11421.
@@ -824,6 +832,24 @@ ibus_im_context_reset (GtkIMContext *context)
     IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (context);

     if (ibusimcontext->ibuscontext) {
+       if (ibusimcontext->preedit_string && g_strcmp0 (ibusimcontext->preedit_string, ""))
{
+           gchar *str = g_strdup (ibusimcontext->preedit_string);
+           /* clear preedit_string */
+           g_free (ibusimcontext->preedit_string);
+           ibusimcontext->preedit_string = NULL;
+           /* clear preedit_cursor_pos */
+            ibusimcontext->preedit_cursor_pos = 0;
+           /* clear preedit_attrs */
+           if (ibusimcontext->preedit_attrs) {
+               pango_attr_list_unref (ibusimcontext->preedit_attrs);
+               ibusimcontext->preedit_attrs = NULL;
+           }
+           /* preedit changed */
+           g_signal_emit (ibusimcontext, _signal_preedit_changed_id, 0);
+           /* commit text */
+           g_signal_emit (ibusimcontext, _signal_commit_id, 0, str);
+           /* g_free (preedit_string); */
+       }
         ibus_input_context_reset (ibusimcontext->ibuscontext);
     }
     gtk_im_context_reset (ibusimcontext->slave);


diff --git a/src/engine.c b/src/engine.c
index 602f073..4af256b 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -1136,7 +1136,29 @@ ibus_hangul_engine_reset (IBusEngine *engine)
 {
     IBusHangulEngine *hangul = (IBusHangulEngine *) engine;

-    ibus_hangul_engine_flush (hangul);
+    /* const gunichar *str; */
+    /* IBusText *text; */
+
+    ibus_hangul_engine_hide_lookup_table (hangul);
+
+    /* str = */ hangul_ic_flush (hangul->context);
+
+    /* ustring_append_ucs4 (hangul->preedit, str, -1); */
+
+    if (ustring_length (hangul->preedit) != 0) {
+        /* clear preedit text before commit */
+        ibus_hangul_engine_clear_preedit_text (hangul);
+
+       /* str = ustring_begin (hangul->preedit); */
+       /* text = ibus_text_new_from_ucs4 (str); */
+
+       /* ibus_engine_commit_text ((IBusEngine *) hangul, text); */
+
+       ustring_clear(hangul->preedit);
+    }
+
+    ibus_hangul_engine_update_preedit_text (hangul);
+
     parent_class->reset (engine);
 }

Original issue reported on code.google.com by cogniti on 2015-01-20 15:19:13

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

How about using IBusPreeditFocusMode?
I think that committing preedit text unconditionally is not a good idea.
I recommend committing according to IBusPreeditFocusMode.

Preedit mode is not implemented on client side now,
but it is not difficult to implement it, I think.

IBusPreeditFocusMode is not intended to use on reset method.
However, I think extending its usage would not be a problem.

Original issue reported on code.google.com by choe.hwanjin on 2015-01-21 06:03:49

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

IBusPreeditFocusMode is related to ibus_engine_update_preedit_text_with_mode() that
has no relation with commit, and besides, ibus_engine_* methods run asynchronously.
I try to make detail patches including ibus preferences( [v] "commit preedit string
before resetting input method corresponding gtk2, gtk3, qt ...").

For further information on this workflow, see below.

Gtk application(gedit) loading im-ibus.so is a process.
ibus-hangul(ibus-engine-hangul) is a process.
ibus-daemon is a process

hodong@debian:~/projects/ibus-1.4.1$ ps x | grep ibus
 2834 ?        Ssl    1:11 /usr/bin/ibus-daemon --daemonize --xim
 2845 ?        Sl     0:00 /usr/lib/ibus/ibus-gconf
 2849 ?        S      0:26 /usr/bin/python /usr/share/ibus/ui/gtk/main.py
 2851 ?        Sl     0:00 /usr/lib/ibus/ibus-x11 --kill-daemon
 2864 ?        Sl     0:03 /usr/lib/ibus/ibus-engine-hangul --ibus
 3573 pts/0    S+     0:00 grep --color=auto ibus

ibus_service_emit_signal(): g_dbus_connection_emit_signal() does not wait client/gtk3/ibusimcontext.c:
_ibus_context_*_cb() methods.

+-- client side ---------------------------------------------------+
| GtkTextVeiw reset() starts when we click mouse.                  |
|   ibus_im_context_reset() starts.                                |
|                                                                  |
|     ibus_engine_commit_text()                                    |
|        |                                                         |
|        v                                                         |
|     ibus_engine_emit_signal(): CommitText                        |
|        |                                                         |
|        v 
|     ibus_service_emit_signal(): g_dbus_connection_emit_signal() -----+
|                                                                      |
|   ibus_im_context_reset() ends.                                  |   |
| GtkTextVeiw reset() ends.                                        |   |
| GtkTextVeiw changes cursor location                              |   |
+------------------------------------------------------------------+   |
                                                                       |
                                                                       |
                                                                       v
+-- server side ----------------------------------------------------------+
|                bus_engine_proxy_g_signal: CommitText                    |
+-------------------------------------------------------------------------+
                                      |
                                      v
+-- client side ------------------------------------------------+
|  client/gtk3/ibusimcontext.c: _ibus_context_commit_text_cb()  |
+---------------------------------------------------------------+

Original issue reported on code.google.com by cogniti on 2015-01-21 13:29:42

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

It takes a long time to make detailed patches for applying to latest source code because
I should upgrade to Debian jessie and test for gtk, qt.

Original issue reported on code.google.com by cogniti on 2015-01-21 14:12:47

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

If you extend the update-preedit-text signal of BusInputContext,
you can receive preedit_mode when the preedit string is updated,

After that, on reset method of gtk input method module client code,
you can determine with preedit_mode value whether to commit the preedit string
or not.

Original issue reported on code.google.com by choe.hwanjin on 2015-01-22 06:35:48

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

I understand what you mean. Okay, I will try it.

Although I use a workaround, fundamental solutions are:

solution 1. thread for synchronous and non-blocking call such as general function call.


ultimate solution 2. /usr/lib/ibus/ibus-engine-* to be a module(or plugin, .so) to
gtk(or qt) im module

Original issue reported on code.google.com by cogniti on 2015-01-22 12:13:22

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

Sorry for typo error, /usr/lib/ibus/ibus-engine-* to be modules (or plugins, *.so)

Original issue reported on code.google.com by cogniti on 2015-01-22 12:20:38

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

Thank you for the patch. I understood your problem from the patch.
We talked about your patch.
The patch is special for the Korean input method.
We'd suggest to modify ibus-hangul always commits the text before any mouse events.
Maybe using a timeout method to commit the preedit.
Otherwise, it is very difficult to find out a perfect solution.

Your patch is a panel setting but I think actually it's an engine setting.

Original issue reported on code.google.com by takao.fujiwara1 on 2015-01-28 10:01:05

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

> We'd suggest to modify ibus-hangul always commits the text before any mouse events.

If it's possible, I would do it.
But current input method framework doesn't send any mouse events.
And that's the goal of reset method.
Input method clients should call reset method before moving caret.
But many of them don't handle reset method correctly.

And committing preedit string by timeout is not feasible to korean users.

> Your patch is a panel setting but I think actually it's an engine setting.

I agree with you. So I've suggested to use IBusPreeditFocusMode.
I think we don't need the panel setting.

ibus-hangul already send preedit string with IBUS_ENGINE_PREEDIT_COMMIT option.
So if IBusPreeditFocusMode is available on ibus clients(gtk2, gtk3, xim etc),
we can implement the clients commit the preedit string without any user preference.

Original issue reported on code.google.com by choe.hwanjin on 2015-01-28 11:06:16

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

ibus should commit preedit text when reset. otherwise, reset() is wrong.

Reason:

1. char *XmbResetIC(XIC ic);
http://www.x.org/archive/X11R7.5/doc/man/man3/XwcResetIC.3.html

The return value of XmbResetIC is its current preedit string as a multibyte string.
The return value of XwcResetIC is its current preedit string as a wide character string.
The return value of Xutf8ResetIC is its current preedit string as an UTF-8 string.

2. gtk_im_context_xim_reset()
https://git.gnome.org/browse/gtk+/tree/modules/input/gtkimcontextxim.c?id=3.14.5#n813
gtk_im_context_xim_reset() commits preedit text when reset() using XmbResetIC()


takao.fujiwara1, What about this ?

static void
ibus_im_context_reset (GtkIMContext *context)
{
    IDEBUG ("%s", __FUNCTION__);

    IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (context);

    if (ibusimcontext->ibuscontext) {
        if (ibusimcontext->preedit_mode == IBUS_ENGINE_PREEDIT_COMMIT)
        {
            /* TODO: commit preedit text */
        }
        ibus_input_context_reset (ibusimcontext->ibuscontext);
    }
    gtk_im_context_reset (ibusimcontext->slave);
}

Original issue reported on code.google.com by cogniti on 2015-01-28 11:56:40

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

> And committing preedit string by timeout is not feasible to korean users.

It's strange for me that preedit is not committed until Enter or space key is pressed
or the cursor is moved while the actual people have already commit the characters.
The timeout is one of the ideas.
Japanese thumb shift mode uses the thumb for the combination keys.
E.g. The default thumb key is Menu key and Menu + 'r' + 'k' outputs '가' and this way
can inform IME of the interval of preedit.

The current implementation is similar with the surrounding text feature but we'd suggest
to use preedit feature instead and users recognize the difference between preedit and
committed text.

> I agree with you. So I've suggested to use IBusPreeditFocusMode.

This way might not be relative with this timing issue.

> I think we don't need the panel setting.

Right. I meant the each engine setting instead of the setting in ibus-setup.
But probably the setting itself is not needed since all engines can use the same setting.


> ibus should commit preedit text when reset. otherwise, reset() is wrong.

However I think the reset APIs do not ensure the cursor position as the specification.
We expect the preedit text is also moved when cursor is moved in Japanese and Chinese.

> ibus_im_context_reset (GtkIMContext *context)

Currently ibus-daemon handles preedit, i.e. bus/inputcontext.c. If we use this suggestion,
I think we need to move the logic of the preedit in ibus-daemon to all clients; im-ibus.so,
ibus-x11 and maybe QT5 later so that the time lag is deleted.

However myself feel the change is still a workaround.
To fix every thing might be to prepare sync version for all APIs.
E.g. it's a bit complicated for me to change ibus_engine_commit_text() for sync mode.
And async mode is still needed and that's why there is no perfect solution and we suggest
preedit text is always commited before any mouse events.

Original issue reported on code.google.com by takao.fujiwara1 on 2015-01-30 09:44:04

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

> It's strange for me that preedit is not committed until Enter or space key is pressed
or the cursor is moved while the actual people have already commit the characters.

Sorry, the sentence is not accurate.
It's strange for me that users do not recognize the preedit and committed text.
I think it's not difficult for users to commit the preedit.

Original issue reported on code.google.com by takao.fujiwara1 on 2015-01-30 09:55:08

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

> It's strange for me that users do not recognize the preedit and committed text.
> I think it's not difficult for users to commit the preedit.

I recommend you to see for yourself how korean people input korean.

There is no such commit key or commit action.
In korean input method, preedit text is handled implicitly.
Korean users usually stroke hangul jamo continuously, and the input method
automatically commits preedit text when the syllable is completed.
Korean users may be unaware of the preedit state, and never commit last preedit
text explicitly. The program should ensure that the input is completed.
This is achieved by reset method.

> However I think the reset APIs do not ensure the cursor position as the specification.
> We expect the preedit text is also moved when cursor is moved in Japanese and Chinese.

This means that committing preedit on reset should be part of the engine logic.
So this feature have to be selected in engine.
This is why I've suggested IBusPreeditFocusMode.

Under the present condition, async mode, the engine cannot make the preedit text
commit on reset inside engine. So by using IBusPreeditFocusMode, the engine can
delegate the client to commit or clear preedit text.

Then engine may commit or not on reset method.
Japanese and chinese engines may ignore reset, and korean engine may commit.

I want to solve this problem in async mode, too.
If possible, the engine may register key filter function or something that return bool
value
for that key event without asking over the process.

Or sync mode can be a last resort.
I think it can be a user preference.

Original issue reported on code.google.com by choe.hwanjin on 2015-01-30 10:51:35

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

I agree with choe.hwanjin.

Original issue reported on code.google.com by cogniti on 2015-01-30 11:49:00

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

After solving this problem in async mode,
I suggest that in the future ibus2 have modular architecture as a last resort.

              +-------------------+
              |    Application    |
              | +---------------+ |
              | | gtk-im, qt-im | calls APIs of libibus.so.
    a process | +---------------+ |
              |         |         |
              |  +------------+   |
              |  | libibus.so | has ibus-engine-*.so as modules (or plugins).
              |  +------------+   |
              +-------------------+
                      ^    |
ibus-daemon           |    |    libibus.so notifies ibus-daemon
notifies libibus.so  IPC  IPC   that the engine has been changed.
to change the engine. |    |
                      |    v
                 +-------------+
       a process | ibus-daemon | has ibus-ui-*.so as modules.
                 +-------------+

Original issue reported on code.google.com by cogniti on 2015-01-30 13:10:42

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

In most Japanese and Chinese IMs, a preedit string is a sort of search key to look up
more complex combinations. Users know this and they have to look up the final string.
But in Korean IM, a preedit string is a prefix of a Hangul syllable or word. Users
recognize the preedit as a part of the final string, not an intermediate form. (Optionally
that Hangul string can be used to lookup Hanja character or word, but it is rare nowadays.)
So conventionally users don't think about commiting explicitly with Korean IMs. We
can't change this way of Hangul input; it has been used since the beginning of PC and
quite universal among different OSes or IMs. 

Original issue reported on code.google.com by ryu.changwoo on 2015-02-01 18:10:00

@fujiwarat

This comment has been minimized.

Copy link
Member Author

commented May 23, 2015

> I want to solve this problem in async mode, too.

OK, I see.

> After solving this problem in async mode,

The solution would be to move the logic in ibus-daemon to each client.

Original issue reported on code.google.com by takao.fujiwara1 on 2015-02-02 03:24:15

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.