From 25d746e2c729b2b0d12e25a1439218a6d7867717 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 19 Mar 2022 23:35:23 +0800
Subject: [PATCH 001/113] change: rewrite login.py

---
 cai/api/base.py  |  19 ++++
 cai/api/login.py | 243 +++++++++++++++++------------------------------
 2 files changed, 106 insertions(+), 156 deletions(-)
 create mode 100644 cai/api/base.py

diff --git a/cai/api/base.py b/cai/api/base.py
new file mode 100644
index 00000000..6273fe8f
--- /dev/null
+++ b/cai/api/base.py
@@ -0,0 +1,19 @@
+from typing import Callable
+
+from cai.client.client import Client as client_t
+from cai.exceptions import LoginException
+
+
+class BaseAPI:
+    client: client_t
+
+    async def _executor(self, func_name: str, *args, **kwargs):
+        if not hasattr(self.client, func_name):
+            raise AttributeError(f"client has no attribute '{func_name}'")
+        try:
+            await getattr(self.client, func_name)(*args, **kwargs)
+        except LoginException:
+            raise
+        except Exception:
+            await self.client.close()
+            raise
diff --git a/cai/api/login.py b/cai/api/login.py
index b6a71ea4..e2c71d37 100644
--- a/cai/api/login.py
+++ b/cai/api/login.py
@@ -6,165 +6,96 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
+import hashlib
+from typing import Optional, Union
 
-from typing import Optional
-
+from .base import BaseAPI
 from cai.client import Client
-from cai.exceptions import LoginException
-
-from . import _clients
-from .client import get_client
-
-
-async def login(uin: int, password_md5: Optional[bytes] = None) -> Client:
-    """Create a new client (or use an existing one) and login.
-
-    Password md5 should be provided when login a new account.
-
-    This function wraps the :meth:`~cai.client.client.Client.login` method of the client.
-
-    Args:
-        uin (int): QQ account number.
-        password_md5 (Optional[bytes], optional): md5 bytes of the password. Defaults to None.
-
-    Raises:
-        RuntimeError: Client already exists and is running.
-        RuntimeError: Password not provided when login a new account.
-        LoginSliderException: Need slider ticket.
-        LoginCaptchaException: Need captcha image.
-    """
-    if uin in _clients:
-        client = _clients[uin]
-        if client.connected:
-            raise RuntimeError(f"Client {uin} already connected!")
-        client._password_md5 = password_md5 or client._password_md5
-    else:
-        if not password_md5:
-            raise RuntimeError(f"Password md5 needed for creating new client!")
-        client = Client(uin, password_md5)
-        _clients[uin] = client
-
-    await client.reconnect()
-    try:
-        await client.login()
-    except LoginException:
-        raise
-    except Exception:
-        await client.close()
-        raise
-    return client
-
-
-async def submit_captcha(
-    captcha: str, captcha_sign: bytes, uin: Optional[int] = None
-) -> bool:
-    """Submit captcha data to login.
-
-    This function wraps the :meth:`~cai.client.client.Client.submit_captcha`
-    method of the client.
-
-    Args:
-        captcha (str): Captcha data to submit.
-        captcha_sign (bytes): Captcha sign received when login.
-        uin (Optional[int], optional): Account of the client want to login.
-            Defaults to None.
-
-    Raises:
-        RuntimeError: Client already exists and is running.
-        RuntimeError: Password not provided when login a new account.
-        LoginSliderException: Need slider ticket.
-        LoginCaptchaException: Need captcha image.
-    """
-    client = get_client(uin)
-    try:
-        await client.submit_captcha(captcha, captcha_sign)
-    except LoginException:
-        raise
-    except Exception:
-        await client.close()
-        raise
-    return True
-
-
-async def submit_slider_ticket(ticket: str, uin: Optional[int] = None) -> bool:
-    """Submit slider ticket to login.
-
-    This function wraps the :meth:`~cai.client.client.Client.submit_slider_ticket`
-    method of the client.
-
-    Args:
-        ticket (str): Slider ticket to submit.
-        uin (Optional[int], optional): Account of the client want to login.
-            Defaults to None.
-
-    Raises:
-        RuntimeError: Client already exists and is running.
-        RuntimeError: Password not provided when login a new account.
-        LoginSliderException: Need slider ticket.
-        LoginCaptchaException: Need captcha image.
-    """
-    client = get_client(uin)
-    try:
-        await client.submit_slider_ticket(ticket)
-    except LoginException:
-        raise
-    except Exception:
-        await client.close()
-        raise
-    return True
-
-
-async def request_sms(uin: Optional[int] = None) -> bool:
-    """Request sms code message to login.
-
-    This function wraps the :meth:`~cai.client.client.Client.request_sms`
-    method of the client.
-
-    Args:
-        uin (Optional[int], optional): Account of the client want to login.
-            Defaults to None.
-
-    Raises:
-        RuntimeError: Client already exists and is running.
-        RuntimeError: Password not provided when login a new account.
-        LoginSMSRequestError: Too many SMS messages were sent.
-    """
-    client = get_client(uin)
-    return await client.request_sms()
-
-
-async def submit_sms(sms_code: str, uin: Optional[int] = None) -> bool:
-    """Submit sms code to login.
-
-    This function wraps the :meth:`~cai.client.client.Client.submit_sms`
-    method of the client.
-
-    Args:
-        sms_code (str): SMS code to submit.
-        uin (Optional[int], optional): Account of the client want to login.
-            Defaults to None.
-
-    Raises:
-        RuntimeError: Client already exists and is running.
-        RuntimeError: Password not provided when login a new account.
-        LoginSliderException: Need slider ticket.
-        LoginCaptchaException: Need captcha image.
-    """
-    client = get_client(uin)
-    try:
-        await client.submit_sms(sms_code)
-    except LoginException:
-        raise
-    except Exception:
-        await client.close()
-        raise
-    return True
+
+
+class Login(BaseAPI):
+    def __init__(self, client: Client):
+        self.client = client
+
+    async def login(self):
+        """Create a new client (or use an existing one) and login.
+
+        This function wraps the :meth:`~cai.client.client.Client.login` method of the client.
+
+        Raises:
+            LoginSliderException: Need slider ticket.
+            LoginCaptchaException: Need captcha image.
+        """
+        await self.client.reconnect()
+        await self._executor("login")
+
+    async def submit_captcha(
+        self, captcha: str, captcha_sign: bytes
+    ) -> bool:
+        """Submit captcha data to login.
+
+        This function wraps the :meth:`~cai.client.client.Client.submit_captcha`
+        method of the client.
+
+        Args:
+            captcha (str): Captcha data to submit.
+            captcha_sign (bytes): Captcha sign received when login.
+
+        Raises:
+            LoginSliderException: Need slider ticket.
+            LoginCaptchaException: Need captcha image.
+        """
+        await self._executor("submit_captcha", captcha, captcha_sign)
+        return True
+
+    async def submit_slider_ticket(self, ticket: str, uin: Optional[int] = None) -> bool:
+        """Submit slider ticket to login.
+
+        This function wraps the :meth:`~cai.client.client.Client.submit_slider_ticket`
+        method of the client.
+
+        Args:
+            ticket (str): Slider ticket to submit.
+
+        Raises:
+            LoginSliderException: Need slider ticket.
+            LoginCaptchaException: Need captcha image.
+        """
+        await self._executor("submit_slider_ticket", ticket)
+        return True
+
+    async def request_sms(self) -> bool:
+        """Request sms code message to login.
+
+        This function wraps the :meth:`~cai.client.client.Client.request_sms`
+        method of the client.
+
+        Args:
+            uin (Optional[int], optional): Account of the client want to login.
+                Defaults to None.
+
+        Raises:
+            LoginSMSRequestError: Too many SMS messages were sent.
+        """
+        return await self.client.request_sms()
+
+    async def submit_sms(self, sms_code: str) -> bool:
+        """Submit sms code to login.
+
+        This function wraps the :meth:`~cai.client.client.Client.submit_sms`
+        method of the client.
+
+        Args:
+            sms_code (str): SMS code to submit.
+
+        Raises:
+            LoginSliderException: Need slider ticket.
+            LoginCaptchaException: Need captcha image.
+        """
+        await self._executor("submit_sms", sms_code)
+        return True
 
 
 __all__ = [
-    "login",
-    "submit_captcha",
-    "submit_slider_ticket",
-    "request_sms",
-    "submit_sms",
+    "Login"
 ]

From 1c037d546b95a85dfbbd0c5df7663d1dbd7fb33c Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 19 Mar 2022 23:51:51 +0800
Subject: [PATCH 002/113] fix: logical of login.py

---
 cai/api/login.py | 33 +++++++++++++++++++++++++++------
 1 file changed, 27 insertions(+), 6 deletions(-)

diff --git a/cai/api/login.py b/cai/api/login.py
index e2c71d37..ebe2ee1f 100644
--- a/cai/api/login.py
+++ b/cai/api/login.py
@@ -11,6 +11,7 @@
 
 from .base import BaseAPI
 from cai.client import Client
+from cai.exceptions import LoginException
 
 
 class Login(BaseAPI):
@@ -27,7 +28,11 @@ async def login(self):
             LoginCaptchaException: Need captcha image.
         """
         await self.client.reconnect()
-        await self._executor("login")
+        try:
+            await self._executor("login")
+        except not LoginException:
+            await self.client.close()
+            raise
 
     async def submit_captcha(
         self, captcha: str, captcha_sign: bytes
@@ -45,10 +50,14 @@ async def submit_captcha(
             LoginSliderException: Need slider ticket.
             LoginCaptchaException: Need captcha image.
         """
-        await self._executor("submit_captcha", captcha, captcha_sign)
+        try:
+            await self._executor("submit_captcha", captcha, captcha_sign)
+        except not LoginException:
+            await self.client.close()
+            raise
         return True
 
-    async def submit_slider_ticket(self, ticket: str, uin: Optional[int] = None) -> bool:
+    async def submit_slider_ticket(self, ticket: str) -> bool:
         """Submit slider ticket to login.
 
         This function wraps the :meth:`~cai.client.client.Client.submit_slider_ticket`
@@ -61,7 +70,11 @@ async def submit_slider_ticket(self, ticket: str, uin: Optional[int] = None) ->
             LoginSliderException: Need slider ticket.
             LoginCaptchaException: Need captcha image.
         """
-        await self._executor("submit_slider_ticket", ticket)
+        try:
+            await self._executor("submit_slider_ticket", ticket)
+        except not LoginException:
+            await self.client.close()
+            raise
         return True
 
     async def request_sms(self) -> bool:
@@ -77,7 +90,11 @@ async def request_sms(self) -> bool:
         Raises:
             LoginSMSRequestError: Too many SMS messages were sent.
         """
-        return await self.client.request_sms()
+        try:
+            return await self.client.request_sms()
+        except not LoginException:
+            await self.client.close()
+            raise
 
     async def submit_sms(self, sms_code: str) -> bool:
         """Submit sms code to login.
@@ -92,7 +109,11 @@ async def submit_sms(self, sms_code: str) -> bool:
             LoginSliderException: Need slider ticket.
             LoginCaptchaException: Need captcha image.
         """
-        await self._executor("submit_sms", sms_code)
+        try:
+            await self._executor("submit_sms", sms_code)
+        except not LoginException:
+            await self.client.close()
+            raise
         return True
 
 

From d776777fadfd7b912449697f597e88ea9b65845c Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 19 Mar 2022 23:56:19 +0800
Subject: [PATCH 003/113] change: rewrite group.py

---
 cai/api/group.py | 123 +++++++++++++++++++++--------------------------
 1 file changed, 56 insertions(+), 67 deletions(-)

diff --git a/cai/api/group.py b/cai/api/group.py
index c6b700fc..b2d87e2b 100644
--- a/cai/api/group.py
+++ b/cai/api/group.py
@@ -9,88 +9,77 @@
 
 from typing import List, Union, Optional
 
-from cai.client import Group, GroupMember
+from .base import BaseAPI
+from cai.client import GroupMember, Group as group_t
 
-from .client import get_client
+class Group(BaseAPI):
+    async def get_group(
+        self, group_id: int, cache: bool = True
+    ) -> Optional[group_t]:
+        """Get Group.
 
+        This function wraps the :meth:`~cai.client.client.Client.get_group`
+        method of the client.
 
-async def get_group(
-    group_id: int, cache: bool = True, uin: Optional[int] = None
-) -> Optional[Group]:
-    """Get Group.
+        Args:
+            group_id (int): Group id.
+            cache (bool, optional):  Use cached friend group list. Defaults to True.
 
-    This function wraps the :meth:`~cai.client.client.Client.get_group`
-    method of the client.
+        Returns:
+            Group: Group object.
+            None: Group not exists.
 
-    Args:
-        group_id (int): Group id.
-        cache (bool, optional):  Use cached friend group list. Defaults to True.
-        uin (Optional[int], optional): Account of the client want to use.
-            Defaults to None.
+        Raises:
+            RuntimeError: Error response type got. This should not happen.
+            ApiResponseError: Get friend list failed.
+            FriendListException: Get friend list returned non-zero ret code.
+        """
+        return await self._executor("get_group", group_id, cache)
 
-    Returns:
-        Group: Group object.
-        None: Group not exists.
 
-    Raises:
-        RuntimeError: Error response type got. This should not happen.
-        ApiResponseError: Get friend list failed.
-        FriendListException: Get friend list returned non-zero ret code.
-    """
-    client = get_client(uin)
-    return await client.get_group(group_id, cache)
+    async def get_group_list(
+        self, cache: bool = True
+    ) -> List[group_t]:
+        """Get account group list.
 
+        This function wraps the :meth:`~cai.client.client.Client.get_group_list`
+        method of the client.
 
-async def get_group_list(
-    cache: bool = True, uin: Optional[int] = None
-) -> List[Group]:
-    """Get account group list.
+        Args:
+            cache (bool, optional): Use cached group list. Defaults to True.
 
-    This function wraps the :meth:`~cai.client.client.Client.get_group_list`
-    method of the client.
+        Returns:
+            List[Group]: Group list.
 
-    Args:
-        cache (bool, optional): Use cached group list. Defaults to True.
-        uin (Optional[int], optional): Account of the client want to use.
-            Defaults to None.
+        Raises:
+            RuntimeError: Error response type got. This should not happen.
+            ApiResponseError: Get group list failed.
+            GroupListException: Get group list returned non-zero ret code.
+        """
+        return await self._executor("get_group_list", cache)
 
-    Returns:
-        List[Group]: Group list.
+    async def get_group_member_list(
+        self, group: Union[int, group_t], cache: bool = True
+    ) -> Optional[List[GroupMember]]:
+        """Get account group member list.
 
-    Raises:
-        RuntimeError: Error response type got. This should not happen.
-        ApiResponseError: Get group list failed.
-        GroupListException: Get group list returned non-zero ret code.
-    """
-    client = get_client(uin)
-    return await client.get_group_list(cache)
+        This function wraps the :meth:`~cai.client.client.Client.get_group_member_list`
+        method of the client.
 
+        Args:
+            group (Union[int, Group]): Group id or group object want to get members.
+            cache (bool, optional): Use cached group list. Defaults to True.
 
-async def get_group_member_list(
-    group: Union[int, Group], cache: bool = True, uin: Optional[int] = None
-) -> Optional[List[GroupMember]]:
-    """Get account group member list.
+        Returns:
+            List[GroupMember]: Group member list.
+            None: Group not exists.
 
-    This function wraps the :meth:`~cai.client.client.Client.get_group_member_list`
-    method of the client.
+        Raises:
+            RuntimeError: Error response type got. This should not happen.
+            ApiResponseError: Get group list failed.
+            GroupMemberListException: Get group member list returned non-zero ret code.
+        """
+        return await self._executor("get_group_member_list", group, cache)
 
-    Args:
-        group (Union[int, Group]): Group id or group object want to get members.
-        cache (bool, optional): Use cached group list. Defaults to True.
-        uin (Optional[int], optional): Account of the client want to use.
-            Defaults to None.
 
-    Returns:
-        List[GroupMember]: Group member list.
-        None: Group not exists.
-
-    Raises:
-        RuntimeError: Error response type got. This should not happen.
-        ApiResponseError: Get group list failed.
-        GroupMemberListException: Get group member list returned non-zero ret code.
-    """
-    client = get_client(uin)
-    return await client.get_group_member_list(group, cache)
-
-
-__all__ = ["get_group", "get_group_list", "get_group_member_list"]
+__all__ = ["Group"]

From 346fd7a387ad878751c21fc73935e2d39802f9ea Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 00:00:18 +0800
Subject: [PATCH 004/113] change: rewrite friend.py

---
 cai/api/friend.py | 162 +++++++++++++++++++++-------------------------
 1 file changed, 72 insertions(+), 90 deletions(-)

diff --git a/cai/api/friend.py b/cai/api/friend.py
index 6e35eb3d..6c7820f4 100644
--- a/cai/api/friend.py
+++ b/cai/api/friend.py
@@ -9,118 +9,100 @@
 
 from typing import List, Optional
 
-from cai.client import Friend, FriendGroup
+from .base import BaseAPI
+from cai.client import FriendGroup, Friend as friend_t
 
-from .client import get_client
-
-
-async def get_friend(
-    friend_uin: int, cache: bool = True, uin: Optional[int] = None
-) -> Optional[Friend]:
-    """Get account friend.
 
-    This function wraps the :meth:`~cai.client.client.Client.get_friend`
-    method of the client.
+class Friend(BaseAPI):
+    async def get_friend(
+        self, friend_uin: int, cache: bool = True
+    ) -> Optional[friend_t]:
+        """Get account friend.
 
-    Args:
-        friend_uin (int): Friend account uin.
-        cache (bool, optional):  Use cached friend list. Defaults to True.
-        uin (Optional[int], optional): Account of the client want to use.
-            Defaults to None.
+        This function wraps the :meth:`~cai.client.client.Client.get_friend`
+        method of the client.
 
-    Returns:
-        Friend: Friend object.
-        None: Friend not exists.
+        Args:
+            friend_uin (int): Friend account uin.
+            cache (bool, optional):  Use cached friend list. Defaults to True.
 
-    Raises:
-        RuntimeError: Error response type got. This should not happen.
-        ApiResponseError: Get friend list failed.
-        FriendListException: Get friend list returned non-zero ret code.
-    """
-    client = get_client(uin)
-    return await client.get_friend(friend_uin, cache)
+        Returns:
+            Friend: Friend object.
+            None: Friend not exists.
 
+        Raises:
+            RuntimeError: Error response type got. This should not happen.
+            ApiResponseError: Get friend list failed.
+            FriendListException: Get friend list returned non-zero ret code.
+        """
+        return await self.client.get_friend(friend_uin, cache)
 
-async def get_friend_list(
-    cache: bool = True, uin: Optional[int] = None
-) -> List[Friend]:
-    """Get account friend list.
+    async def get_friend_list(
+        self, cache: bool = True
+    ) -> List[friend_t]:
+        """Get account friend list.
 
-    This function wraps the :meth:`~cai.client.client.Client.get_friend_list`
-    method of the client.
+        This function wraps the :meth:`~cai.client.client.Client.get_friend_list`
+        method of the client.
 
-    Args:
-        cache (bool, optional):  Use cached friend list. Defaults to True.
-        uin (Optional[int], optional): Account of the client want to use.
-            Defaults to None.
+        Args:
+            cache (bool, optional):  Use cached friend list. Defaults to True.
 
-    Returns:
-        List of :obj:`~cai.client.models.Friend`
+        Returns:
+            List of :obj:`~cai.client.models.Friend`
 
-    Raises:
-        RuntimeError: Error response type got. This should not happen.
-        ApiResponseError: Get friend list failed.
-        FriendListException: Get friend list returned non-zero ret code.
-    """
-    client = get_client(uin)
-    return await client.get_friend_list(cache)
+        Raises:
+            RuntimeError: Error response type got. This should not happen.
+            ApiResponseError: Get friend list failed.
+            FriendListException: Get friend list returned non-zero ret code.
+        """
+        return await self._executor("get_friend_list", cache)
 
+    async def get_friend_group(
+        self, group_id: int, cache: bool = True
+    ) -> Optional[FriendGroup]:
+        """Get Friend Group.
 
-async def get_friend_group(
-    group_id: int, cache: bool = True, uin: Optional[int] = None
-) -> Optional[FriendGroup]:
-    """Get Friend Group.
+        This function wraps the :meth:`~cai.client.client.Client.get_friend_group`
+        method of the client.
 
-    This function wraps the :meth:`~cai.client.client.Client.get_friend_group`
-    method of the client.
+        Args:
+            group_id (int): Friend group id.
+            cache (bool, optional):  Use cached friend group list. Defaults to True.
 
-    Args:
-        group_id (int): Friend group id.
-        cache (bool, optional):  Use cached friend group list. Defaults to True.
-        uin (Optional[int], optional): Account of the client want to use.
-            Defaults to None.
+        Returns:
+            FriendGroup: Friend group object.
+            None: Friend group not exists.
 
-    Returns:
-        FriendGroup: Friend group object.
-        None: Friend group not exists.
+        Raises:
+            RuntimeError: Error response type got. This should not happen.
+            ApiResponseError: Get friend list failed.
+            FriendListException: Get friend list returned non-zero ret code.
+        """
+        return await self._executor("get_friend_group", group_id, cache)
 
-    Raises:
-        RuntimeError: Error response type got. This should not happen.
-        ApiResponseError: Get friend list failed.
-        FriendListException: Get friend list returned non-zero ret code.
-    """
-    client = get_client(uin)
-    return await client.get_friend_group(group_id, cache)
+    async def get_friend_group_list(
+        self, cache: bool = True
+    ) -> List[FriendGroup]:
+        """Get account friend group list.
 
+        This function wraps the :meth:`~cai.client.client.Client.get_friend_group_list`
+        method of the client.
 
-async def get_friend_group_list(
-    cache: bool = True, uin: Optional[int] = None
-) -> List[FriendGroup]:
-    """Get account friend group list.
+        Args:
+            cache (bool, optional):  Use cached friend group list. Defaults to True.
 
-    This function wraps the :meth:`~cai.client.client.Client.get_friend_group_list`
-    method of the client.
+        Returns:
+            List[FriendGroup]: Friend group list.
 
-    Args:
-        cache (bool, optional):  Use cached friend group list. Defaults to True.
-        uin (Optional[int], optional): Account of the client want to use.
-            Defaults to None.
-
-    Returns:
-        List[FriendGroup]: Friend group list.
-
-    Raises:
-        RuntimeError: Error response type got. This should not happen.
-        ApiResponseError: Get friend group list failed.
-        FriendListException: Get friend group list returned non-zero ret code.
-    """
-    client = get_client(uin)
-    return await client.get_friend_group_list(cache)
+        Raises:
+            RuntimeError: Error response type got. This should not happen.
+            ApiResponseError: Get friend group list failed.
+            FriendListException: Get friend group list returned non-zero ret code.
+        """
+        return await self._executor("get_friend_group_list", cache)
 
 
 __all__ = [
-    "get_friend",
-    "get_friend_list",
-    "get_friend_group",
-    "get_friend_group_list",
+    "Friend"
 ]

From 8337fc0ea2ee58437d77747d845b03719b837bea Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 00:01:21 +0800
Subject: [PATCH 005/113] change: rewrite client.py

---
 cai/api/client.py | 150 +++++++++++++++++++---------------------------
 1 file changed, 63 insertions(+), 87 deletions(-)

diff --git a/cai/api/client.py b/cai/api/client.py
index d4b4f2de..8809d655 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -7,92 +7,68 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 
-import asyncio
+import hashlib
 from typing import Union, Optional
 
-from cai.client import Client, OnlineStatus
-from cai.exceptions import ClientNotAvailable
-
-from . import _clients
-
-
-def get_client(uin: Optional[int] = None) -> Client:
-    """Get the specific client or existing client.
-
-    Args:
-        uin (Optional[int], optional): Specific account client to get. Defaults to None.
-
-    Raises:
-        ClientNotAvailable: Client not exists.
-        ClientNotAvailable: No client available.
-        ClientNotAvailable: Multiple clients found and not specify which one to get.
-
-    Returns:
-        Client: Current client to use.
-    """
-    if not _clients:
-        raise ClientNotAvailable(uin, f"No client available!")
-    elif len(_clients) == 1 and not uin:
-        return list(_clients.values())[0]
-    else:
-        if not uin:
-            raise ClientNotAvailable(
-                None, f"Multiple clients found! Specify uin to choose."
-            )
-        if uin not in _clients:
-            raise ClientNotAvailable(None, f"Client {uin} not exists!")
-        return _clients[uin]
-
-
-async def close(uin: Optional[int] = None) -> None:
-    """Close an existing client and delete it from clients.
-
-    Args:
-        uin (Optional[int], optional): Account of the client want to close. Defaults to None.
-    """
-    client = get_client(uin)
-    await client.close()
-    del _clients[client.uin]
-
-
-async def close_all() -> None:
-    """Close all existing clients and delete them."""
-    tasks = [close(uin) for uin in _clients.keys()]
-    await asyncio.gather(*tasks)
-
-
-async def set_status(
-    status: Union[int, OnlineStatus],
-    battery_status: Optional[int] = None,
-    is_power_connected: bool = False,
-    uin: Optional[int] = None,
-) -> None:
-    """Change client status.
-
-    This function wraps the :meth:`~cai.client.client.Client.register`
-    method of the client.
-
-    Args:
-        status (OnlineStatus): Status want to change.
-        battery_status (Optional[int], optional): Battery capacity.
-            Defaults to None.
-        is_power_connected (bool, optional): Is power connected to phone.
-            Defaults to False.
-        uin (Optional[int], optional): Account of the client want to change.
-            Defaults to None.
-
-    Raises:
-        RuntimeError: Client already exists and is running.
-        RuntimeError: Password not provided when login a new account.
-        ApiResponseError: Invalid API request.
-        RegisterException: Register Failed.
-    """
-    client = get_client(uin)
-    await client.set_status(
-        status,
-        battery_status,
-        is_power_connected,
-    )
-
-
-__all__ = ["get_client", "close", "close_all", "set_status"]
+from .login import Login as _Login
+from .friend import Friend as _Friend
+from .group import Group as _Group
+from cai.client import OnlineStatus, Client as client_t
+
+
+def make_client(uin: int, passwd: Union[str, bytes]) -> client_t:
+    if not (isinstance(passwd, bytes) and len(passwd) == 16):
+        # not a vailed md5 passwd
+        if isinstance(passwd, bytes):
+            passwd = hashlib.md5(passwd).digest()
+        else:
+            passwd = hashlib.md5(passwd.encode()).digest()
+    return client_t(uin, passwd)
+
+
+class Client(_Login, _Friend, _Group):
+    def __init__(self, client: client_t):
+        self.client = client
+
+    @property
+    def connected(self) -> bool:
+        return self.client.connected
+
+    async def close(self):
+        """Stop Client"""
+        await self.client.close()
+
+    async def set_status(
+        self,
+        status: Union[int, OnlineStatus],
+        battery_status: Optional[int] = None,
+        is_power_connected: bool = False
+    ) -> None:
+        """Change client status.
+
+        This function wraps the :meth:`~cai.client.client.Client.register`
+        method of the client.
+
+        Args:
+            status (OnlineStatus): Status want to change.
+            battery_status (Optional[int], optional): Battery capacity.
+                Defaults to None.
+            is_power_connected (bool, optional): Is power connected to phone.
+                Defaults to False.
+            uin (Optional[int], optional): Account of the client want to change.
+                Defaults to None.
+
+        Raises:
+            RuntimeError: Client already exists and is running.
+            RuntimeError: Password not provided when login a new account.
+            ApiResponseError: Invalid API request.
+            RegisterException: Register Failed.
+        """
+        await self.client.set_status(
+            status,
+            battery_status,
+            is_power_connected,
+        )
+
+
+__all__ = ["Client"]

From 80e00eb515fb399a8201dee15b40b5ba7a99b2d0 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 00:03:26 +0800
Subject: [PATCH 006/113] update: cai/api

---
 cai/api/__init__.py | 12 ++----------
 cai/api/base.py     |  9 ++++-----
 cai/api/group.py    |  2 +-
 cai/api/login.py    |  7 -------
 4 files changed, 7 insertions(+), 23 deletions(-)

diff --git a/cai/api/__init__.py b/cai/api/__init__.py
index d0714f2a..d3e70dae 100644
--- a/cai/api/__init__.py
+++ b/cai/api/__init__.py
@@ -9,15 +9,7 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 
-from typing import Dict
+from .client import Client, make_client
 
-from cai.client import Client
 
-_clients: Dict[int, Client] = {}
-
-
-from .flow import *
-from .group import *
-from .login import *
-from .client import *
-from .friend import *
+__all__ = ["Client", "make_client"]
diff --git a/cai/api/base.py b/cai/api/base.py
index 6273fe8f..9316635b 100644
--- a/cai/api/base.py
+++ b/cai/api/base.py
@@ -7,13 +7,12 @@
 class BaseAPI:
     client: client_t
 
-    async def _executor(self, func_name: str, *args, **kwargs):
+    async def _executor(self, func_name: str, *args, uncaught_error=False, **kwargs):
         if not hasattr(self.client, func_name):
             raise AttributeError(f"client has no attribute '{func_name}'")
         try:
-            await getattr(self.client, func_name)(*args, **kwargs)
-        except LoginException:
-            raise
+            return await getattr(self.client, func_name)(*args, **kwargs)
         except Exception:
-            await self.client.close()
+            if uncaught_error:
+                await self.client.close()
             raise
diff --git a/cai/api/group.py b/cai/api/group.py
index b2d87e2b..65dd0836 100644
--- a/cai/api/group.py
+++ b/cai/api/group.py
@@ -12,6 +12,7 @@
 from .base import BaseAPI
 from cai.client import GroupMember, Group as group_t
 
+
 class Group(BaseAPI):
     async def get_group(
         self, group_id: int, cache: bool = True
@@ -36,7 +37,6 @@ async def get_group(
         """
         return await self._executor("get_group", group_id, cache)
 
-
     async def get_group_list(
         self, cache: bool = True
     ) -> List[group_t]:
diff --git a/cai/api/login.py b/cai/api/login.py
index ebe2ee1f..64ea60a5 100644
--- a/cai/api/login.py
+++ b/cai/api/login.py
@@ -6,18 +6,11 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-import hashlib
-from typing import Optional, Union
-
 from .base import BaseAPI
-from cai.client import Client
 from cai.exceptions import LoginException
 
 
 class Login(BaseAPI):
-    def __init__(self, client: Client):
-        self.client = client
-
     async def login(self):
         """Create a new client (or use an existing one) and login.
 

From 71b581193ad2e8dc1ed203899d31f8c3d8bce97e Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 00:25:46 +0800
Subject: [PATCH 007/113] update: examples/login.py

---
 examples/login.py | 64 +++++++++++++++++++++++++----------------------
 1 file changed, 34 insertions(+), 30 deletions(-)

diff --git a/examples/login.py b/examples/login.py
index e6e9bc55..d02cdff9 100644
--- a/examples/login.py
+++ b/examples/login.py
@@ -7,15 +7,16 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 import os
+import asyncio
 import signal
 import asyncio
+import sys
 import traceback
 from io import BytesIO
-from hashlib import md5
 
 from PIL import Image
 
-import cai
+from cai.api import Client, make_client
 from cai.exceptions import (
     LoginException,
     ApiResponseError,
@@ -26,46 +27,45 @@
 )
 
 
-async def run():
+async def run(closed: asyncio.Event):
     account = os.getenv("ACCOUNT", "")
     password = os.getenv("PASSWORD")
     try:
+        assert password and account, ValueError("account or password not set")
+
         account = int(account)
-        assert password
-    except Exception:
-        print(
-            f"Error: account '{account}', password '{password}'"  # type: ignore
-        )
-        return
+        ci = Client(make_client(account, password))
 
-    try:
-        client = await cai.login(account, md5(password.encode()).digest())
-        print(f"Login Success! Client status: {client.status!r}")
-    except Exception as e:
-        await handle_failure(e)
+        try:
+            await ci.login()
+            print(f"Login Success! Client status: {ci.client.status!r}")
+        except Exception as e:
+            await handle_failure(ci, e)
+    finally:
+        closed.set()
 
 
-async def handle_failure(exception: Exception):
+async def handle_failure(client: Client, exception: Exception):
     if isinstance(exception, LoginSliderNeeded):
         print("Verify url:", exception.verify_url)
         ticket = input("Please enter the ticket: ").strip()
         try:
-            await cai.submit_slider_ticket(ticket)
+            await client.submit_slider_ticket(ticket)
             print("Login Success!")
             await asyncio.sleep(3)
         except Exception as e:
-            await handle_failure(e)
+            await handle_failure(client, e)
     elif isinstance(exception, LoginCaptchaNeeded):
         print("Captcha:")
         image = Image.open(BytesIO(exception.captcha_image))
         image.show()
         captcha = input("Please enter the captcha: ").strip()
         try:
-            await cai.submit_captcha(captcha, exception.captcha_sign)
+            await client.submit_captcha(captcha, exception.captcha_sign)
             print("Login Success!")
             await asyncio.sleep(3)
         except Exception as e:
-            await handle_failure(e)
+            await handle_failure(client, e)
     elif isinstance(exception, LoginAccountFrozen):
         print("Account is frozen!")
     elif isinstance(exception, LoginDeviceLocked):
@@ -93,21 +93,21 @@ async def handle_failure(exception: Exception):
         if not way:
             print("No way to verify device...")
         elif way == "sms":
-            await cai.request_sms()
+            await client.request_sms()
             print(f"SMS was sent to {exception.sms_phone}!")
             sms_code = input("Please enter the sms_code: ").strip()
             try:
-                await cai.submit_sms(sms_code)
+                await client.submit_sms(sms_code)
             except Exception as e:
-                await handle_failure(e)
+                await handle_failure(client, e)
         elif way == "url":
-            await cai.close()
+            await client.close()
             print(f"Go to {exception.verify_url} to verify device!")
             input("Press ENTER after verification to continue login...")
             try:
-                await cai.login(exception.uin)
+                await client.login()
             except Exception as e:
-                await handle_failure(e)
+                await handle_failure(client, e)
     elif isinstance(exception, LoginException):
         print("Login Error:", repr(exception))
     elif isinstance(exception, ApiResponseError):
@@ -122,10 +122,14 @@ async def handle_failure(exception: Exception):
 
     async def wait_cleanup():
         await close.wait()
-        await cai.close_all()
 
     loop = asyncio.get_event_loop()
-    loop.add_signal_handler(signal.SIGINT, close.set)
-    loop.add_signal_handler(signal.SIGTERM, close.set)
-    loop.create_task(run())
-    loop.run_until_complete(wait_cleanup())
+    loop.create_task(run(close))
+    if sys.platform != "win32":
+        loop.add_signal_handler(signal.SIGINT, close.set)
+        loop.add_signal_handler(signal.SIGTERM, close.set)
+    else:
+        try:
+            loop.run_until_complete(wait_cleanup())
+        except KeyboardInterrupt:
+            close.set()

From 3ac1fc8021b07cf17ed9ed0dcc31a49e741cdca3 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 00:26:45 +0800
Subject: [PATCH 008/113] update: remove unused code

---
 examples/login.py | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/examples/login.py b/examples/login.py
index d02cdff9..bc0252c1 100644
--- a/examples/login.py
+++ b/examples/login.py
@@ -125,11 +125,7 @@ async def wait_cleanup():
 
     loop = asyncio.get_event_loop()
     loop.create_task(run(close))
-    if sys.platform != "win32":
-        loop.add_signal_handler(signal.SIGINT, close.set)
-        loop.add_signal_handler(signal.SIGTERM, close.set)
-    else:
-        try:
-            loop.run_until_complete(wait_cleanup())
-        except KeyboardInterrupt:
-            close.set()
+    try:
+        loop.run_until_complete(wait_cleanup())
+    except KeyboardInterrupt:
+        close.set()

From 259cc943b3cf9a833ace3b69ba498908919df4d6 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 02:35:02 +0800
Subject: [PATCH 009/113] remove: strong dependency on cai/settings

---
 cai/api/base.py                        |   3 -
 cai/api/client.py                      |  16 +-
 cai/client/client.py                   |  44 +++--
 cai/client/command.py                  |   2 +-
 cai/client/config_push/__init__.py     |   2 +-
 cai/client/friendlist/__init__.py      |   6 +-
 cai/client/heartbeat/__init__.py       |  15 +-
 cai/client/message_service/__init__.py |   6 +-
 cai/client/online_push/__init__.py     |  25 +--
 cai/client/sso_server/__init__.py      |  10 +-
 cai/client/status_service/__init__.py  |  57 +++---
 cai/client/wtlogin/__init__.py         | 255 ++++++++++++++-----------
 cai/client/wtlogin/oicq.py             |   5 +-
 cai/client/wtlogin/tlv.py              |  14 +-
 cai/settings/protocol.py               |  14 +-
 examples/login.py                      |  15 +-
 16 files changed, 275 insertions(+), 214 deletions(-)

diff --git a/cai/api/base.py b/cai/api/base.py
index 9316635b..fea30b33 100644
--- a/cai/api/base.py
+++ b/cai/api/base.py
@@ -1,7 +1,4 @@
-from typing import Callable
-
 from cai.client.client import Client as client_t
-from cai.exceptions import LoginException
 
 
 class BaseAPI:
diff --git a/cai/api/client.py b/cai/api/client.py
index 8809d655..418d68ce 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -14,16 +14,26 @@
 from .friend import Friend as _Friend
 from .group import Group as _Group
 from cai.client import OnlineStatus, Client as client_t
+from cai.settings.device import DeviceInfo, new_device
+from cai.settings.protocol import ApkInfo
 
 
-def make_client(uin: int, passwd: Union[str, bytes]) -> client_t:
+def make_client(
+    uin: int,
+    passwd: Union[str, bytes],
+    apk_info: ApkInfo,
+    device: Optional[DeviceInfo] = None
+) -> client_t:
     if not (isinstance(passwd, bytes) and len(passwd) == 16):
         # not a vailed md5 passwd
         if isinstance(passwd, bytes):
             passwd = hashlib.md5(passwd).digest()
         else:
             passwd = hashlib.md5(passwd.encode()).digest()
-    return client_t(uin, passwd)
+    if not device:
+        device = new_device()
+    print(device)
+    return client_t(uin, passwd, device, apk_info)
 
 
 class Client(_Login, _Friend, _Group):
@@ -55,8 +65,6 @@ async def set_status(
                 Defaults to None.
             is_power_connected (bool, optional): Is power connected to phone.
                 Defaults to False.
-            uin (Optional[int], optional): Account of the client want to change.
-                Defaults to None.
 
         Raises:
             RuntimeError: Client already exists and is running.
diff --git a/cai/client/client.py b/cai/client/client.py
index cf39f064..32769cf6 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -21,7 +21,7 @@
     Callable,
     Optional,
     Awaitable,
-    overload,
+    overload, Tuple,
 )
 
 from cachetools import TTLCache
@@ -29,9 +29,9 @@
 from cai.log import logger
 from cai.utils.binary import Packet
 from cai.utils.future import FutureStore
-from cai.settings.device import get_device
+from cai.settings.device import DeviceInfo
+from cai.settings.protocol import ApkInfo
 from cai.connection import Connection, connect
-from cai.settings.protocol import get_protocol
 from cai.exceptions import (
     LoginException,
     ApiResponseError,
@@ -109,11 +109,9 @@
     encode_login_request2_captcha,
 )
 
-HT = Callable[["Client", IncomingPacket], Awaitable[Command]]
+HT = Callable[["Client", IncomingPacket, Tuple[DeviceInfo, ApkInfo]], Awaitable[Command]]
 LT = Callable[["Client", Event], Awaitable[None]]
 
-DEVICE = get_device()
-APK_INFO = get_protocol()
 HANDLERS: Dict[str, HT] = {
     "wtlogin.login": handle_oicq_response,
     "wtlogin.exchange_emp": handle_oicq_response,
@@ -139,7 +137,7 @@
 class Client:
     LISTENERS: Set[LT] = set()
 
-    def __init__(self, uin: int, password_md5: bytes):
+    def __init__(self, uin: int, password_md5: bytes, device: DeviceInfo, apk_info: ApkInfo):
         # account info
         self._uin: int = uin
         self._password_md5: bytes = password_md5
@@ -163,7 +161,7 @@ def __init__(self, uin: int, password_md5: bytes):
         self._file_storage_info: Optional[FileServerPushList] = None
 
         self._ip_address: bytes = bytes()
-        self._ksid: bytes = f"|{DEVICE.imei}|A8.2.7.27f6ea96".encode()
+        self._ksid: bytes = f"|{device.imei}|A8.2.7.27f6ea96".encode()
         self._pwd_flag: bool = False
         self._rollback_sig: bytes = bytes()
 
@@ -183,6 +181,9 @@ def __init__(self, uin: int, password_md5: bytes):
         self._msg_cache: TTLCache = TTLCache(maxsize=1024, ttl=3600)
         self._receive_store: FutureStore[int, Command] = FutureStore()
 
+        self.device_info: DeviceInfo = device
+        self.apk_info: ApkInfo = apk_info
+
     def __str__(self) -> str:
         return f"<cai client object for {self.uin}>"
 
@@ -383,7 +384,7 @@ async def send_and_wait(
     async def _handle_incoming_packet(self, in_packet: IncomingPacket) -> None:
         try:
             handler = HANDLERS.get(in_packet.command_name, _packet_to_command)
-            packet = await handler(self, in_packet)
+            packet = await handler(self, in_packet, (self.device_info, self.apk_info))
             self._receive_store.store_result(packet.seq, packet)
         except Exception as e:
             # TODO: handle exception
@@ -505,6 +506,8 @@ async def _handle_login_response(
                     self.uin,
                     self._t104,
                     self._siginfo.g,
+                    self.device_info.imei,
+                    self.apk_info
                 )
                 response = await self.send_and_wait(
                     seq, "wtlogin.login", packet
@@ -575,6 +578,8 @@ async def login(self) -> LoginSuccess:
             self._ksid,
             self.uin,
             self._password_md5,
+            self.device_info,
+            self.apk_info
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
         return await self._handle_login_response(response)
@@ -609,6 +614,8 @@ async def submit_captcha(
             captcha,
             captcha_sign,
             self._t104,
+            self.device_info.imei,
+            self.apk_info
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
         return await self._handle_login_response(response)
@@ -640,6 +647,8 @@ async def submit_slider_ticket(self, ticket: str) -> LoginSuccess:
             self.uin,
             ticket,
             self._t104,
+            self.device_info.imei,
+            self.apk_info
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
         return await self._handle_login_response(response)
@@ -671,6 +680,8 @@ async def request_sms(self) -> bool:
             self.uin,
             self._t104,
             self._t174,
+            self.device_info.imei,
+            self.apk_info
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
 
@@ -711,6 +722,8 @@ async def submit_sms(self, sms_code: str) -> LoginSuccess:
             self._t104,
             self._t174,
             self._siginfo.g,
+            self.device_info.imei,
+            self.apk_info
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
         return await self._handle_login_response(response)
@@ -749,6 +762,8 @@ async def _handle_refresh_response(
                     self.uin,
                     self._t104,
                     self._siginfo.g,
+                    self.device_info.imei,
+                    self.apk_info
                 )
                 response = await self.send_and_wait(
                     seq, "wtlogin.login", packet
@@ -795,6 +810,8 @@ async def refresh_siginfo(self) -> LoginSuccess:
             self._siginfo.rand_seed,
             self._siginfo.wt_session_ticket,
             self._siginfo.wt_session_ticket_key,
+            self.device_info,
+            self.apk_info
         )
         response = await self.send_and_wait(seq, "wtlogin.exchange_emp", packet)
 
@@ -833,6 +850,8 @@ async def register(
             self._siginfo.d2key,
             status,
             register_reason,
+            self.apk_info.sub_app_id,
+            self.device_info
         )
         response = await self.send_and_wait(seq, "StatSvc.register", packet)
 
@@ -864,8 +883,6 @@ async def set_status(
         Args:
             status (OnlineStatus, optional): Client status. Defaults to
                 :attr:`~cai.client.status_service.OnlineStatus.Online`.
-            register_reason (RegPushReason, optional): Register reason. Defaults to
-                :attr:`~cai.client.status_service.RegPushReason.AppRegister`.
             battery_status (Optional[int], optional): Battery capacity.
                 Only works when status is :obj:`.OnlineStatus.Battery`. Defaults to None.
             is_power_connected (bool, optional): Is power connected to phone.
@@ -884,9 +901,10 @@ async def set_status(
             self._session_id,
             self.uin,
             self._siginfo.d2key,
+            self.device_info,
             status,
             battery_status,
-            is_power_connected,
+            is_power_connected
         )
         response = await self.send_and_wait(
             seq, "StatSvc.SetStatusFromClient", packet
@@ -927,7 +945,7 @@ async def heartbeat(self) -> None:
         while self._heartbeat_enabled and self.connected:
             seq = self.next_seq()
             packet = encode_heartbeat(
-                seq, self._session_id, self._ksid, self.uin
+                seq, self._session_id, self.device_info.imei, self._ksid, self.uin, self.apk_info.sub_app_id
             )
             try:
                 response = await self.send_and_wait(
diff --git a/cai/client/command.py b/cai/client/command.py
index e930b111..1e7d726e 100644
--- a/cai/client/command.py
+++ b/cai/client/command.py
@@ -31,7 +31,7 @@ class UnhandledCommand(Command):
 
 
 async def _packet_to_command(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, _device
 ) -> UnhandledCommand:
     return UnhandledCommand(
         packet.uin,
diff --git a/cai/client/config_push/__init__.py b/cai/client/config_push/__init__.py
index 4a089534..bc99ebbe 100644
--- a/cai/client/config_push/__init__.py
+++ b/cai/client/config_push/__init__.py
@@ -75,7 +75,7 @@ def encode_config_push_response(
 
 # ConfigPushSvc.PushReq
 async def handle_config_push_request(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, _device
 ) -> ConfigPushCommand:
     command = ConfigPushCommand.decode_push_req(
         packet.uin,
diff --git a/cai/client/friendlist/__init__.py b/cai/client/friendlist/__init__.py
index 9a71ddf2..0dd9c983 100644
--- a/cai/client/friendlist/__init__.py
+++ b/cai/client/friendlist/__init__.py
@@ -104,7 +104,7 @@ def encode_get_friend_list(
 
 
 async def handle_friend_list(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, _device
 ) -> "FriendListCommand":
     return FriendListCommand.decode_response(
         packet.uin,
@@ -167,7 +167,7 @@ def encode_get_troop_list(
 
 
 async def handle_troop_list(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, _device
 ) -> TroopListCommand:
     return TroopListCommand.decode_response(
         packet.uin,
@@ -230,7 +230,7 @@ def encode_get_troop_member_list(
 
 
 async def handle_troop_member_list(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, _device
 ) -> TroopMemberListCommand:
     return TroopMemberListCommand.decode_response(
         packet.uin,
diff --git a/cai/client/heartbeat/__init__.py b/cai/client/heartbeat/__init__.py
index 6126e88d..37c1d872 100644
--- a/cai/client/heartbeat/__init__.py
+++ b/cai/client/heartbeat/__init__.py
@@ -14,19 +14,14 @@
 
 from cai.utils.binary import Packet
 from cai.client.command import Command
-from cai.settings.device import get_device
-from cai.settings.protocol import get_protocol
 from cai.client.packet import CSsoBodyPacket, CSsoDataPacket, IncomingPacket
 
 if TYPE_CHECKING:
     from cai.client import Client
 
-DEVICE = get_device()
-APK_INFO = get_protocol()
-
 
 def encode_heartbeat(
-    seq: int, session_id: bytes, ksid: bytes, uin: int
+    seq: int, session_id: bytes, imei: str, ksid: bytes, uin: int, sub_app_id: int
 ) -> Packet:
     """Build heartbeat alive packet.
 
@@ -41,17 +36,19 @@ def encode_heartbeat(
         seq (int): Packet sequence.
         session_id (bytes): Session ID.
         ksid (bytes): KSID of client.
+        imei (str): Device imei.
         uin (int): User QQ number.
+        sub_app_id (int): apkinfo
 
     Returns:
         Packet: Login packet.
     """
     COMMAND_NAME = "Heartbeat.Alive"
 
-    SUB_APP_ID = APK_INFO.sub_app_id
+    SUB_APP_ID = sub_app_id
 
     sso_packet = CSsoBodyPacket.build(
-        seq, SUB_APP_ID, COMMAND_NAME, DEVICE.imei, session_id, ksid, bytes()
+        seq, SUB_APP_ID, COMMAND_NAME, imei, session_id, ksid, bytes()
     )
     packet = CSsoDataPacket.build(uin, 0, sso_packet, key=None)
     return packet
@@ -63,7 +60,7 @@ class Heartbeat(Command):
 
 
 async def handle_heartbeat(
-    client: "Client", packet: IncomingPacket
+    _client: "Client", packet: IncomingPacket, _device
 ) -> Heartbeat:
     return Heartbeat(
         packet.uin, packet.seq, packet.ret_code, packet.command_name
diff --git a/cai/client/message_service/__init__.py b/cai/client/message_service/__init__.py
index 68de760f..e6ccd6e6 100644
--- a/cai/client/message_service/__init__.py
+++ b/cai/client/message_service/__init__.py
@@ -102,7 +102,7 @@ def encode_get_message(
 
 
 async def handle_get_message(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, _device
 ) -> "GetMessageCommand":
     """Handle Pb Get Message response.
 
@@ -247,7 +247,7 @@ def encode_delete_message(
 
 
 async def handle_push_notify(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, _device
 ) -> PushNotifyCommand:
     """Handle Push Notify Command.
 
@@ -304,7 +304,7 @@ async def handle_push_notify(
 
 # MessageSvc.PushForceOffline
 async def handle_force_offline(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, _device
 ) -> PushForceOfflineCommand:
     client._status = OnlineStatus.Offline
     await client.close()
diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index c736d488..b0bf150f 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -9,32 +9,31 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 
-from typing import TYPE_CHECKING, List, Union, Optional
+from typing import TYPE_CHECKING, List, Optional, Tuple
 
 from jce import types
 
 from cai.log import logger
 from cai.utils.binary import Packet
-from cai.settings.device import get_device
+from cai.settings.device import DeviceInfo as _DeviceInfo_t
 from cai.utils.jce import RequestPacketVersion3
 from cai.client.message_service import MESSAGE_DECODERS
 from cai.client.packet import UniPacket, IncomingPacket
 
-from .jce import DelMsgInfo, DeviceInfo, SvcRespPushMsg
+from .jce import DelMsgInfo, SvcRespPushMsg, DeviceInfo
 from .command import PushMsg, PushMsgError, PushMsgCommand
+from ...settings.protocol import ApkInfo
 
 if TYPE_CHECKING:
     from cai.client import Client
 
-DEVICE = get_device()
-
 
 def encode_push_response(
     seq: int,
     session_id: bytes,
     uin: int,
     d2key: bytes,
-    resp_uin: int,
+    resp_uin: int,  # warn: unused var
     svrip: int,
     delete_messages: List[DelMsgInfo] = [],
     push_token: Optional[bytes] = None,
@@ -88,7 +87,7 @@ def encode_push_response(
 
 
 async def handle_c2c_sync(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, _device
 ) -> PushMsgCommand:
     """Handle C2C Message Sync.
 
@@ -137,7 +136,7 @@ async def handle_c2c_sync(
 
 
 async def handle_push_msg(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, device: Tuple[_DeviceInfo_t, ApkInfo]
 ) -> PushMsgCommand:
     """Handle Push Message Command.
 
@@ -146,6 +145,8 @@ async def handle_push_msg(
 
         com.tencent.mobileqq.app.MessageHandler.b
     """
+    device = device[0]
+
     push = PushMsgCommand.decode_response(
         packet.uin,
         packet.seq,
@@ -172,10 +173,10 @@ async def handle_push_msg(
                     service_type=1,
                     device_info=DeviceInfo(
                         net_type=1,
-                        dev_type=DEVICE.model,
-                        os_ver=DEVICE.version.release,
-                        vendor_name=DEVICE.vendor_name,
-                        vendor_os_name=DEVICE.vendor_os_name,
+                        dev_type=device.model,
+                        os_ver=device.version.release,
+                        vendor_name=device.vendor_name,
+                        vendor_os_name=device.vendor_os_name,
                     ),
                 )
                 await client.send(push.seq, "OnlinePush.RespPush", resp_packet)
diff --git a/cai/client/sso_server/__init__.py b/cai/client/sso_server/__init__.py
index 03e51d87..1f891baa 100644
--- a/cai/client/sso_server/__init__.py
+++ b/cai/client/sso_server/__init__.py
@@ -16,9 +16,9 @@
 from rtea import qqtea_decrypt, qqtea_encrypt
 
 from cai.connection import connect
-from cai.settings.device import get_device
+from cai.settings.device import new_device
 from cai.exceptions import SsoServerException
-from cai.settings.protocol import get_protocol
+from cai.settings.protocol import get_apk_info
 from cai.utils.jce import RequestPacketVersion3
 from cai.connection.utils import tcp_latency_test
 
@@ -57,8 +57,8 @@ async def get_sso_list() -> SsoServerResponse:
     Raises:
         SsoServerException: Get sso server list failed.
     """
-    device = get_device()
-    protocol = get_protocol()
+    device = new_device()
+    protocol = get_apk_info()
     key = bytes(
         [
             0xF0,
@@ -151,7 +151,7 @@ async def quality_test(
 async def get_sso_server(
     cache: bool = True,
     cache_server_list: bool = True,
-    exclude: Optional[Container[str]] = None,
+    exclude: Optional[Container[str]] = None
 ) -> SsoServer:
     """Get the best sso server
 
diff --git a/cai/client/status_service/__init__.py b/cai/client/status_service/__init__.py
index b516163d..146956f2 100644
--- a/cai/client/status_service/__init__.py
+++ b/cai/client/status_service/__init__.py
@@ -11,14 +11,14 @@
 
 import time
 from enum import Enum, IntEnum
-from typing import TYPE_CHECKING, Union, Optional
+from typing import TYPE_CHECKING, Union, Optional, Tuple
 
 from jce import types
 
 from cai.log import logger
 from cai.utils.binary import Packet
-from cai.settings.device import get_device
-from cai.settings.protocol import get_protocol
+from cai.settings.device import DeviceInfo
+from cai.settings.protocol import ApkInfo
 from cai.utils.jce import RequestPacketVersion3
 from cai.pb.im.oidb.cmd0x769 import ReqBody, ConfigSeq
 from cai.client.packet import (
@@ -41,9 +41,6 @@
 if TYPE_CHECKING:
     from cai.client import Client
 
-DEVICE = get_device()
-APK_INFO = get_protocol()
-
 
 class OnlineStatus(IntEnum):
     """
@@ -134,6 +131,7 @@ def _encode_svc_request(
     uin: int,
     status: Union[int, OnlineStatus],
     reg_push_reason: Union[str, RegPushReason],
+    device: DeviceInfo,
     battery_status: Optional[int] = None,
     is_power_connected: bool = False,
 ) -> SvcReqRegister:
@@ -146,7 +144,7 @@ def _encode_svc_request(
         bid=0 if status == OnlineStatus.Offline else 7,
         status=status if status < 1000 else OnlineStatus.Online,
         timestamp=int(time.time()),
-        ios_version=DEVICE.version.sdk,
+        ios_version=device.version.sdk,
         nettype=bytes([1]),
         reg_type=bytes(1)
         if reg_push_reason
@@ -157,13 +155,13 @@ def _encode_svc_request(
             RegPushReason.SetOnlineStatus,
         )
         else bytes([1]),
-        guid=DEVICE.guid,
-        dev_name=DEVICE.model,
-        dev_type=DEVICE.model,
-        os_version=DEVICE.version.release,
+        guid=device.guid,
+        dev_name=device.model,
+        dev_type=device.model,
+        os_version=device.version.release,
         large_seq=0,
-        vendor_name=DEVICE.vendor_name,
-        vendor_os_name=DEVICE.vendor_os_name,
+        vendor_name=device.vendor_name,
+        vendor_os_name=device.vendor_os_name,
         b769_req=ReqBody(
             config_list=[
                 ConfigSeq(type=46, version=0),
@@ -188,6 +186,8 @@ def encode_register(
     d2key: bytes,
     status: Union[int, OnlineStatus],
     reg_push_reason: Union[str, RegPushReason],
+    sub_app_id: int,
+    device: DeviceInfo
 ) -> Packet:
     """Build status service register packet.
 
@@ -208,18 +208,16 @@ def encode_register(
         d2key (bytes): Siginfo d2 key.
         status (Union[int, OnlineStatus]): Online status.
         reg_push_reason (Union[str, RegPushReason]): Reg push reason.
-        battery_status (Optional[int], optional): Battery capacity.
-            Defaults to None.
-        is_power_connected (bool, optional): Is power connected to phone.
-            Defaults to False.
+        device (DeviceInfo): your device info
+        sub_app_id (int): ApkInfo
 
     Returns:
         Packet: Register packet.
     """
     COMMAND_NAME = "StatSvc.register"
-    SUB_APP_ID = APK_INFO.sub_app_id
+    SUB_APP_ID = sub_app_id
 
-    svc = _encode_svc_request(uin, status, reg_push_reason)
+    svc = _encode_svc_request(uin, status, reg_push_reason, device)
     payload = SvcReqRegister.to_bytes(0, svc)
     req_packet = RequestPacketVersion3(
         servant_name="PushService",
@@ -230,7 +228,7 @@ def encode_register(
         seq,
         SUB_APP_ID,
         COMMAND_NAME,
-        DEVICE.imei,
+        device.imei,
         session_id,
         ksid,
         body=req_packet,
@@ -246,6 +244,7 @@ def encode_set_status(
     session_id: bytes,
     uin: int,
     d2key: bytes,
+    device: DeviceInfo,
     status: Union[int, OnlineStatus],
     battery_status: Optional[int] = None,
     is_power_connected: bool = False,
@@ -265,7 +264,7 @@ def encode_set_status(
         uin (int): User QQ number.
         d2key (bytes): Siginfo d2 key.
         status (Union[int, OnlineStatus]): Online status.
-        reg_push_reason (Union[str, RegPushReason]): Reg push reason.
+        device (DeviceInfo): your device info
         battery_status (Optional[int], optional): Battery capacity.
             Only works when status is :obj:`.OnlineStatus.Battery`. Defaults to None.
         is_power_connected (bool, optional): Is power connected to phone.
@@ -275,12 +274,12 @@ def encode_set_status(
         Packet: Register packet.
     """
     COMMAND_NAME = "StatSvc.SetStatusFromClient"
-    SUB_APP_ID = APK_INFO.sub_app_id
 
     svc = _encode_svc_request(
         uin,
         status,
         RegPushReason.SetOnlineStatus,
+        device,
         ((status == OnlineStatus.Battery) or None) and battery_status,
         (status == OnlineStatus.Battery) and is_power_connected,
     )
@@ -297,7 +296,7 @@ def encode_set_status(
 
 
 async def handle_register_response(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, _device
 ) -> SvcRegisterResponse:
     response = SvcRegisterResponse.decode_response(
         packet.uin,
@@ -324,6 +323,8 @@ def encode_force_offline_response(
     d2key: bytes,
     req_uin: int,
     seq_no: int,
+    sub_app_id: int,
+    device: DeviceInfo
 ) -> Packet:
     """Build status service msf offline response packet.
 
@@ -344,12 +345,14 @@ def encode_force_offline_response(
         d2key (bytes): Siginfo d2 key.
         req_uin (int): Request offline uin.
         seq_no (int): Request sequence number.
+        sub_app_id (int): ApkInfo
+        device (DeviceInfo): your device info
 
     Returns:
         Packet: msf force offline response packet.
     """
     COMMAND_NAME = "StatSvc.RspMSFForceOffline"
-    SUB_APP_ID = APK_INFO.sub_app_id
+    SUB_APP_ID = sub_app_id
 
     resp = ResponseMSFForceOffline(uin=req_uin, seq_no=seq_no, c=bytes(1))
     payload = ResponseMSFForceOffline.to_bytes(0, resp)
@@ -364,7 +367,7 @@ def encode_force_offline_response(
         seq,
         SUB_APP_ID,
         COMMAND_NAME,
-        DEVICE.imei,
+        device.imei,
         session_id,
         ksid,
         body=resp_packet,
@@ -375,7 +378,7 @@ def encode_force_offline_response(
 
 
 async def handle_request_offline(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, device: Tuple[DeviceInfo, ApkInfo]
 ) -> MSFForceOfflineCommand:
     request = MSFForceOfflineCommand.decode_response(
         packet.uin,
@@ -401,6 +404,8 @@ async def handle_request_offline(
             client._siginfo.d2key,
             request.request.uin,
             request.request.seq_no,
+            device[1].sub_app_id,
+            device[0]
         )
         await client.send(seq, "StatSvc.RspMSFForceOffline", resp_packet)
     client._status = OnlineStatus.Offline
diff --git a/cai/client/wtlogin/__init__.py b/cai/client/wtlogin/__init__.py
index 0bbeb81a..e0975368 100644
--- a/cai/client/wtlogin/__init__.py
+++ b/cai/client/wtlogin/__init__.py
@@ -8,28 +8,26 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-import time
+import ipaddress
+import secrets
 import string
 import struct
-import secrets
-import ipaddress
+import time
 from hashlib import md5
-from typing import TYPE_CHECKING
+from typing import TYPE_CHECKING, Tuple
 
 from rtea import qqtea_decrypt
 
-from cai.utils.binary import Packet
-from cai.settings.device import get_device
-from cai.settings.protocol import get_protocol
-from cai.utils.crypto import ECDH, EncryptSession
 from cai.client.packet import (
     UniPacket,
     CSsoBodyPacket,
     CSsoDataPacket,
     IncomingPacket,
 )
-
-from .tlv import TlvEncoder
+from cai.settings.device import DeviceInfo
+from cai.settings.protocol import ApkInfo
+from cai.utils.binary import Packet
+from cai.utils.crypto import ECDH, EncryptSession
 from .oicq import (
     NeedCaptcha,
     OICQRequest,
@@ -41,13 +39,11 @@
     TooManySMSRequest,
     UnknownLoginStatus,
 )
+from .tlv import TlvEncoder
 
 if TYPE_CHECKING:
     from cai.client import Client
 
-DEVICE = get_device()
-APK_INFO = get_protocol()
-
 
 # submit captcha
 def encode_login_request2_captcha(
@@ -59,6 +55,8 @@ def encode_login_request2_captcha(
     captcha: str,
     sign: bytes,
     t104: bytes,
+    imei: str,
+    apk_info: ApkInfo
 ) -> Packet:
     """Build submit captcha request packet.
 
@@ -82,6 +80,8 @@ def encode_login_request2_captcha(
         captcha (str): Captcha image result.
         sign (bytes): Signature of the captcha.
         t104 (bytes): TLV 104 data.
+        apk_info (ApkInfo): ApkInfo
+        imei (str): device imei
 
     Returns:
         Packet: Login packet.
@@ -90,9 +90,9 @@ def encode_login_request2_captcha(
     SUB_COMMAND_ID = 2
     COMMAND_NAME = "wtlogin.login"
 
-    SUB_APP_ID = APK_INFO.sub_app_id
-    BITMAP = APK_INFO.bitmap
-    SUB_SIGMAP = APK_INFO.sub_sigmap
+    SUB_APP_ID = apk_info.sub_app_id
+    BITMAP = apk_info.bitmap
+    SUB_SIGMAP = apk_info.sub_sigmap
 
     LOCAL_ID = 2052  # oicq.wlogin_sdk.request.t.v
 
@@ -110,7 +110,7 @@ def encode_login_request2_captcha(
         seq,
         SUB_APP_ID,
         COMMAND_NAME,
-        DEVICE.imei,
+        imei,
         session_id,
         ksid,
         oicq_packet,
@@ -129,6 +129,8 @@ def encode_login_request2_slider(
     uin: int,
     ticket: str,
     t104: bytes,
+    imei: str,
+    apk_info: ApkInfo
 ) -> Packet:
     """Build slider ticket request packet.
 
@@ -151,6 +153,8 @@ def encode_login_request2_slider(
         uin (int): User QQ number.
         ticket (str): Captcha image result.
         t104 (bytes): TLV 104 data.
+        apk_info (ApkInfo): ApkInfo
+        imei (str): device imei
 
     Returns:
         Packet: Login packet.
@@ -159,9 +163,9 @@ def encode_login_request2_slider(
     SUB_COMMAND_ID = 2
     COMMAND_NAME = "wtlogin.login"
 
-    SUB_APP_ID = APK_INFO.sub_app_id
-    BITMAP = APK_INFO.bitmap
-    SUB_SIGMAP = APK_INFO.sub_sigmap
+    SUB_APP_ID = apk_info.sub_app_id
+    BITMAP = apk_info.bitmap
+    SUB_SIGMAP = apk_info.sub_sigmap
 
     LOCAL_ID = 2052  # oicq.wlogin_sdk.request.t.v
 
@@ -179,7 +183,7 @@ def encode_login_request2_slider(
         seq,
         SUB_APP_ID,
         COMMAND_NAME,
-        DEVICE.imei,
+        imei,
         session_id,
         ksid,
         oicq_packet,
@@ -200,6 +204,8 @@ def encode_login_request7(
     t104: bytes,
     t174: bytes,
     g: bytes,
+    imei: str,
+    apk_info: ApkInfo
 ) -> Packet:
     """Build sms submit packet.
 
@@ -224,6 +230,8 @@ def encode_login_request7(
         t104 (bytes): TLV 104 data.
         t174 (bytes): TLV 174 data.
         g (bytes): G data of client.
+        apk_info (ApkInfo): ApkInfo
+        imei (str): device imei
 
     Returns:
         Packet: Login packet.
@@ -232,9 +240,9 @@ def encode_login_request7(
     SUB_COMMAND_ID = 7
     COMMAND_NAME = "wtlogin.login"
 
-    SUB_APP_ID = APK_INFO.sub_app_id
-    BITMAP = APK_INFO.bitmap
-    SUB_SIGMAP = APK_INFO.sub_sigmap
+    SUB_APP_ID = apk_info.sub_app_id
+    BITMAP = apk_info.bitmap
+    SUB_SIGMAP = apk_info.sub_sigmap
 
     GUID_SRC = 1
     GUID_CHANGE = 0
@@ -260,7 +268,7 @@ def encode_login_request7(
         seq,
         SUB_APP_ID,
         COMMAND_NAME,
-        DEVICE.imei,
+        imei,
         session_id,
         ksid,
         oicq_packet,
@@ -279,6 +287,8 @@ def encode_login_request8(
     uin: int,
     t104: bytes,
     t174: bytes,
+    imei: str,
+    apk_info: ApkInfo
 ) -> Packet:
     """Build sms request packet.
 
@@ -301,6 +311,8 @@ def encode_login_request8(
         uin (int): User QQ number.
         t104 (bytes): TLV 104 data.
         t174 (bytes): TLV 174 data.
+        apk_info (ApkInfo): ApkInfo
+        imei (str): device imei
 
     Returns:
         Packet: Login packet.
@@ -310,9 +322,9 @@ def encode_login_request8(
     COMMAND_NAME = "wtlogin.login"
 
     SMS_APP_ID = 9
-    SUB_APP_ID = APK_INFO.sub_app_id
-    BITMAP = APK_INFO.bitmap
-    SUB_SIGMAP = APK_INFO.sub_sigmap
+    SUB_APP_ID = apk_info.sub_app_id
+    BITMAP = apk_info.bitmap
+    SUB_SIGMAP = apk_info.sub_sigmap
 
     GUID_SRC = 1
     GUID_CHANGE = 0
@@ -337,7 +349,7 @@ def encode_login_request8(
         seq,
         SUB_APP_ID,
         COMMAND_NAME,
-        DEVICE.imei,
+        imei,
         session_id,
         ksid,
         oicq_packet,
@@ -355,6 +367,8 @@ def encode_login_request9(
     ksid: bytes,
     uin: int,
     password_md5: bytes,
+    device: DeviceInfo,
+    apk_info: ApkInfo
 ) -> Packet:
     """Build main login request packet.
 
@@ -376,6 +390,8 @@ def encode_login_request9(
         ksid (bytes): KSID of client.
         uin (int): User QQ number.
         password_md5 (bytes): User QQ password md5 hash.
+        device (DeviceInfo): your device info
+        apk_info (ApkInfo): ApkInfo
 
     Returns:
         Packet: Login packet.
@@ -384,18 +400,18 @@ def encode_login_request9(
     SUB_COMMAND_ID = 9
     COMMAND_NAME = "wtlogin.login"
 
-    APK_ID = APK_INFO.apk_id
-    APK_VERSION = APK_INFO.version
-    APK_SIGN = APK_INFO.apk_sign
-    APK_BUILD_TIME = APK_INFO.build_time
-    APP_ID = APK_INFO.app_id
-    SUB_APP_ID = APK_INFO.sub_app_id
+    APK_ID = apk_info.apk_id
+    APK_VERSION = apk_info.version
+    APK_SIGN = apk_info.apk_sign
+    APK_BUILD_TIME = apk_info.build_time
+    APP_ID = apk_info.app_id
+    SUB_APP_ID = apk_info.sub_app_id
     APP_CLIENT_VERSION = 0
-    SDK_VERSION = APK_INFO.sdk_version
-    SSO_VERSION = APK_INFO.sso_version
-    BITMAP = APK_INFO.bitmap
-    MAIN_SIGMAP = APK_INFO.main_sigmap
-    SUB_SIGMAP = APK_INFO.sub_sigmap
+    SDK_VERSION = apk_info.sdk_version
+    SSO_VERSION = apk_info.sso_version
+    BITMAP = apk_info.bitmap
+    MAIN_SIGMAP = apk_info.main_sigmap
+    SUB_SIGMAP = apk_info.sub_sigmap
 
     GUID_SRC = 1
     GUID_CHANGE = 0
@@ -404,8 +420,8 @@ def encode_login_request9(
     GUID_FLAG |= GUID_CHANGE << 8 & 0xFF00
     CAN_WEB_VERIFY = 130  # oicq.wlogin_sdk.request.k.K
     LOCAL_ID = 2052  # oicq.wlogin_sdk.request.t.v
-    IP_BYTES: bytes = ipaddress.ip_address(DEVICE.ip_address).packed
-    NETWORK_TYPE = (DEVICE.apn == "wifi") + 1
+    IP_BYTES: bytes = ipaddress.ip_address(device.ip_address).packed
+    NETWORK_TYPE = (device.apn == "wifi") + 1
 
     data = Packet.build(
         struct.pack(">HH", SUB_COMMAND_ID, 23),  # packet num
@@ -419,8 +435,8 @@ def encode_login_request9(
             uin,
             0,
             password_md5,
-            DEVICE.guid,
-            DEVICE.tgtgt,
+            device.guid,
+            device.tgtgt,
         ),
         TlvEncoder.t116(BITMAP, SUB_SIGMAP),
         TlvEncoder.t100(
@@ -431,36 +447,36 @@ def encode_login_request9(
         # TlvEncoder.t104(),
         TlvEncoder.t142(APK_ID),
         TlvEncoder.t144(
-            DEVICE.imei.encode(),
-            DEVICE.bootloader,
-            DEVICE.proc_version,
-            DEVICE.version.codename,
-            DEVICE.version.incremental,
-            DEVICE.fingerprint,
-            DEVICE.boot_id,
-            DEVICE.android_id,
-            DEVICE.baseband,
-            DEVICE.version.incremental,
-            DEVICE.os_type.encode(),
-            DEVICE.version.release.encode(),
+            device.imei.encode(),
+            device.bootloader,
+            device.proc_version,
+            device.version.codename,
+            device.version.incremental,
+            device.fingerprint,
+            device.boot_id,
+            device.android_id,
+            device.baseband,
+            device.version.incremental,
+            device.os_type.encode(),
+            device.version.release.encode(),
             NETWORK_TYPE,
-            DEVICE.sim.encode(),
-            DEVICE.apn.encode(),
+            device.sim.encode(),
+            device.apn.encode(),
             False,
             True,
             False,
             GUID_FLAG,
-            DEVICE.model.encode(),
-            DEVICE.guid,
-            DEVICE.brand.encode(),
-            DEVICE.tgtgt,
+            device.model.encode(),
+            device.guid,
+            device.brand.encode(),
+            device.tgtgt,
         ),
-        TlvEncoder.t145(DEVICE.guid),
+        TlvEncoder.t145(device.guid),
         TlvEncoder.t147(APP_ID, APK_VERSION.encode(), APK_SIGN),
         # TlvEncoder.t166(1),
         # TlvEncoder.t16a(),
         TlvEncoder.t154(seq),
-        TlvEncoder.t141(DEVICE.sim.encode(), NETWORK_TYPE, DEVICE.apn.encode()),
+        TlvEncoder.t141(device.sim.encode(), NETWORK_TYPE, device.apn.encode()),
         TlvEncoder.t8(LOCAL_ID),
         TlvEncoder.t511(
             [
@@ -483,12 +499,12 @@ def encode_login_request9(
         # TlvEncoder.t172(),
         # TlvEncoder.t185(1),  # when sms login, is_password_login == 3
         # TlvEncoder.t400(),  # null when first time login
-        TlvEncoder.t187(DEVICE.mac_address.encode()),
-        TlvEncoder.t188(DEVICE.android_id.encode()),
-        TlvEncoder.t194(DEVICE.imsi_md5) if DEVICE.imsi_md5 else b"",
+        TlvEncoder.t187(device.mac_address.encode()),
+        TlvEncoder.t188(device.android_id.encode()),
+        TlvEncoder.t194(device.imsi_md5) if device.imsi_md5 else b"",
         TlvEncoder.t191(CAN_WEB_VERIFY),
         # TlvEncoder.t201(),
-        TlvEncoder.t202(DEVICE.wifi_bssid.encode(), DEVICE.wifi_ssid.encode()),
+        TlvEncoder.t202(device.wifi_bssid.encode(), device.wifi_ssid.encode()),
         TlvEncoder.t177(APK_BUILD_TIME, SDK_VERSION),
         TlvEncoder.t516(),
         TlvEncoder.t521(),
@@ -502,7 +518,7 @@ def encode_login_request9(
         seq,
         SUB_APP_ID,
         COMMAND_NAME,
-        DEVICE.imei,
+        device.imei,
         session_id,
         ksid,
         oicq_packet,
@@ -521,6 +537,8 @@ def encode_login_request20(
     uin: int,
     t104: bytes,
     g: bytes,
+    imei: str,
+    apk_info: ApkInfo
 ) -> Packet:
     """Build device lock login request packet.
 
@@ -543,6 +561,8 @@ def encode_login_request20(
         uin (int): User QQ number.
         t104 (bytes): T104 response data.
         g (bytes): md5 of (guid + dpwd + t402).
+        imei (str): device imei
+        apk_info (ApkInfo): ApkInfo
 
     Returns:
         Packet: Login packet.
@@ -551,9 +571,9 @@ def encode_login_request20(
     SUB_COMMAND_ID = 20
     COMMAND_NAME = "wtlogin.login"
 
-    SUB_APP_ID = APK_INFO.sub_app_id
-    BITMAP = APK_INFO.bitmap
-    SUB_SIGMAP = APK_INFO.sub_sigmap
+    SUB_APP_ID = apk_info.sub_app_id
+    BITMAP = apk_info.bitmap
+    SUB_SIGMAP = apk_info.sub_sigmap
 
     LOCAL_ID = 2052  # oicq.wlogin_sdk.request.t.v
 
@@ -571,7 +591,7 @@ def encode_login_request20(
         seq,
         SUB_APP_ID,
         COMMAND_NAME,
-        DEVICE.imei,
+        imei,
         session_id,
         ksid,
         oicq_packet,
@@ -599,6 +619,8 @@ def encode_exchange_emp_15(
     rand_seed: bytes,
     wt_session_ticket: bytes,
     wt_session_ticket_key: bytes,
+    device: DeviceInfo,
+    apk_info: ApkInfo
 ) -> Packet:
     """Build exchange emp request packet.
 
@@ -623,6 +645,8 @@ def encode_exchange_emp_15(
         rand_seed (bytes): Siginfo random seed.
         wt_session_ticket (bytes): Siginfo session ticket.
         wt_session_ticket_key (bytes): Siginfo session ticket key.
+        device (DeviceInfo): your device info
+        apk_info (ApkInfo): ApkInfo
 
     Returns:
         Packet: Exchange emp packet.
@@ -631,28 +655,28 @@ def encode_exchange_emp_15(
     SUB_COMMAND_ID = 15
     COMMAND_NAME = "wtlogin.exchange_emp"
 
-    APK_ID = APK_INFO.apk_id
-    APK_VERSION = APK_INFO.version
-    APK_SIGN = APK_INFO.apk_sign
-    APK_BUILD_TIME = APK_INFO.build_time
-    APP_ID = APK_INFO.app_id
-    SUB_APP_ID = APK_INFO.sub_app_id
+    APK_ID = apk_info.apk_id
+    APK_VERSION = apk_info.version
+    APK_SIGN = apk_info.apk_sign
+    APK_BUILD_TIME = apk_info.build_time
+    APP_ID = apk_info.app_id
+    SUB_APP_ID = apk_info.sub_app_id
     APP_CLIENT_VERSION = 0
-    SDK_VERSION = APK_INFO.sdk_version
-    SSO_VERSION = APK_INFO.sso_version
-    BITMAP = APK_INFO.bitmap
-    MAIN_SIGMAP = APK_INFO.main_sigmap
-    SUB_SIGMAP = APK_INFO.sub_sigmap
+    SDK_VERSION = apk_info.sdk_version
+    SSO_VERSION = apk_info.sso_version
+    BITMAP = apk_info.bitmap
+    MAIN_SIGMAP = apk_info.main_sigmap
+    SUB_SIGMAP = apk_info.sub_sigmap
 
-    GUID = DEVICE.guid
+    GUID = device.guid
     GUID_SRC = 1
     GUID_CHANGE = 0
     GUID_FLAG = 0
     GUID_FLAG |= GUID_SRC << 24 & 0xFF000000
     GUID_FLAG |= GUID_CHANGE << 8 & 0xFF00
     LOCAL_ID = 2052  # oicq.wlogin_sdk.request.t.v
-    IP_BYTES: bytes = ipaddress.ip_address(DEVICE.ip_address).packed
-    NETWORK_TYPE = (DEVICE.apn == "wifi") + 1
+    IP_BYTES: bytes = ipaddress.ip_address(device.ip_address).packed
+    NETWORK_TYPE = (device.apn == "wifi") + 1
 
     data = Packet.build(
         struct.pack(">HH", SUB_COMMAND_ID, 24),
@@ -666,37 +690,37 @@ def encode_exchange_emp_15(
         TlvEncoder.t107(),
         # TlvEncoder.t108(KSID),  # null when first time login
         TlvEncoder.t144(
-            DEVICE.imei.encode(),
-            DEVICE.bootloader,
-            DEVICE.proc_version,
-            DEVICE.version.codename,
-            DEVICE.version.incremental,
-            DEVICE.fingerprint,
-            DEVICE.boot_id,
-            DEVICE.android_id,
-            DEVICE.baseband,
-            DEVICE.version.incremental,
-            DEVICE.os_type.encode(),
-            DEVICE.version.release.encode(),
+            device.imei.encode(),
+            device.bootloader,
+            device.proc_version,
+            device.version.codename,
+            device.version.incremental,
+            device.fingerprint,
+            device.boot_id,
+            device.android_id,
+            device.baseband,
+            device.version.incremental,
+            device.os_type.encode(),
+            device.version.release.encode(),
             NETWORK_TYPE,
-            DEVICE.sim.encode(),
-            DEVICE.apn.encode(),
+            device.sim.encode(),
+            device.apn.encode(),
             False,
             True,
             False,
             GUID_FLAG,
-            DEVICE.model.encode(),
-            DEVICE.guid,
-            DEVICE.brand.encode(),
-            DEVICE.tgtgt,
+            device.model.encode(),
+            device.guid,
+            device.brand.encode(),
+            device.tgtgt,
         ),
         TlvEncoder.t142(APK_ID),
         # TlvEncoder.t112(),
-        TlvEncoder.t145(DEVICE.guid),
+        TlvEncoder.t145(device.guid),
         # TlvEncoder.t166(1),
         TlvEncoder.t16a(no_pic_sig),
         TlvEncoder.t154(seq),
-        TlvEncoder.t141(DEVICE.sim.encode(), NETWORK_TYPE, DEVICE.apn.encode()),
+        TlvEncoder.t141(device.sim.encode(), NETWORK_TYPE, device.apn.encode()),
         TlvEncoder.t8(LOCAL_ID),
         TlvEncoder.t511(
             [
@@ -720,11 +744,11 @@ def encode_exchange_emp_15(
         # TlvEncoder.t172(),
         TlvEncoder.t177(APK_BUILD_TIME, SDK_VERSION),
         TlvEncoder.t400(g, uin, GUID, dpwd, 1, APP_ID, rand_seed),
-        TlvEncoder.t187(DEVICE.mac_address.encode()),
-        TlvEncoder.t188(DEVICE.android_id.encode()),
-        TlvEncoder.t194(DEVICE.imsi_md5) if DEVICE.imsi_md5 else b"",
+        TlvEncoder.t187(device.mac_address.encode()),
+        TlvEncoder.t188(device.android_id.encode()),
+        TlvEncoder.t194(device.imsi_md5) if device.imsi_md5 else b"",
         # TlvEncoder.t201(),
-        TlvEncoder.t202(DEVICE.wifi_bssid.encode(), DEVICE.wifi_ssid.encode()),
+        TlvEncoder.t202(device.wifi_bssid.encode(), device.wifi_ssid.encode()),
         TlvEncoder.t516(),
         TlvEncoder.t521(),
         TlvEncoder.t525(TlvEncoder.t536([])),
@@ -743,14 +767,17 @@ def encode_exchange_emp_15(
 
 
 async def handle_oicq_response(
-    client: "Client", packet: IncomingPacket
+    client: "Client", packet: IncomingPacket, dev: Tuple[DeviceInfo, ApkInfo]
 ) -> OICQResponse:
+    device, apk_info = dev
+
     response = OICQResponse.decode_response(
         packet.uin,
         packet.seq,
         packet.ret_code,
         packet.command_name,
         packet.data,
+        device.tgtgt
     )
     if not isinstance(response, UnknownLoginStatus):
         return response
@@ -764,7 +791,7 @@ async def handle_oicq_response(
         ).encode()
         client._t402 = response.t402
         client._siginfo.g = md5(
-            DEVICE.guid + client._siginfo.dpwd + client._t402
+            device.guid + client._siginfo.dpwd + client._t402
         ).digest()
 
     if isinstance(response, LoginSuccess):
@@ -821,7 +848,7 @@ async def handle_oicq_response(
             client._password_md5 + bytes(4) + struct.pack(">I", client._uin)
         ).digest()
         decrypted = qqtea_decrypt(response.encrypted_a1, key)
-        DEVICE.tgtgt = decrypted[51:67]
+        device.tgtgt = decrypted[51:67]
     elif isinstance(response, NeedCaptcha):
         client._t104 = response.t104 or client._t104
     elif isinstance(response, DeviceLocked):
diff --git a/cai/client/wtlogin/oicq.py b/cai/client/wtlogin/oicq.py
index 56260260..a17ac00f 100644
--- a/cai/client/wtlogin/oicq.py
+++ b/cai/client/wtlogin/oicq.py
@@ -58,7 +58,7 @@ def build_encoded(
 class OICQResponse(Command):
     @classmethod
     def decode_response(
-        cls, uin: int, seq: int, ret_code: int, command_name: str, data: bytes
+        cls, uin: int, seq: int, ret_code: int, command_name: str, data: bytes, tgtgt: bytes
     ) -> "OICQResponse":
         """Decode login response and wrap main info of the response.
 
@@ -71,6 +71,7 @@ def decode_response(
             ret_code (int): Return code of the response.
             command_name (str): Command name of the response.
             data (bytes): Payload data of the response.
+            tgtgt (bytes): decode key for t119
 
         Returns:
             LoginSuccess: Login success.
@@ -91,7 +92,7 @@ def decode_response(
             data_.start().uint16().uint8().offset(2).remain().execute()
         )
 
-        _tlv_map = TlvDecoder.decode(_tlv_bytes)
+        _tlv_map = TlvDecoder.decode(_tlv_bytes, tgtgt)
 
         if status == 0:
             return LoginSuccess(
diff --git a/cai/client/wtlogin/tlv.py b/cai/client/wtlogin/tlv.py
index bf94bcb0..03f9b437 100644
--- a/cai/client/wtlogin/tlv.py
+++ b/cai/client/wtlogin/tlv.py
@@ -18,9 +18,6 @@
 
 from cai.utils.binary import Packet
 from cai.pb.wtlogin import DeviceReport
-from cai.settings.device import get_device
-
-DEVICE = get_device()
 
 
 class TlvEncoder:
@@ -608,8 +605,9 @@ class TlvDecoder:
     def decode(
         cls,
         data: Union[bytes, bytearray],
+        tgtgt: bytes = None,
         offset: int = 0,
-        tag_size: int = 2,
+        tag_size: int = 2
     ) -> Dict[int, Any]:
         if not isinstance(data, Packet):
             data = Packet(data)
@@ -639,7 +637,9 @@ def decode(
             value = data.read_bytes(length, offset)
             offset += length
             futher_decode = getattr(cls, f"t{tag:x}", None)
-            if futher_decode:
+            if futher_decode and tag == 0x119:
+                value = futher_decode(value, tgtgt)
+            elif futher_decode:
                 value = futher_decode(value)
             result[tag] = value
 
@@ -658,7 +658,7 @@ def t113(cls, data: bytes) -> Dict[str, Any]:
         return {"uin": struct.unpack_from(">I", data)[0]}
 
     @classmethod
-    def t119(cls, data: bytes) -> Dict[int, Any]:
+    def t119(cls, data: bytes, tgtgt: bytes) -> Dict[int, Any]:
         """Tea decrypt tlv 119 data.
 
         Tlv list:
@@ -712,7 +712,7 @@ def t119(cls, data: bytes) -> Dict[int, Any]:
         Note:
             Source: oicq.wlogin_sdk.request.oicq_request.d
         """
-        data = qqtea_decrypt(data, DEVICE.tgtgt)
+        data = qqtea_decrypt(data, tgtgt)
         result = cls.decode(data, offset=2)
         return result
 
diff --git a/cai/settings/protocol.py b/cai/settings/protocol.py
index f5780878..035652fd 100644
--- a/cai/settings/protocol.py
+++ b/cai/settings/protocol.py
@@ -164,11 +164,11 @@ class ApkInfo(NamedTuple):
 )
 
 
-def get_apk_info(type_: str = "0") -> ApkInfo:
-    info = {"0": IPAD, "1": ANDROID_PHONE, "2": ANDROID_WATCH, "3": MACOS}
-    if type_ not in info:
-        raise ValueError(f"Invalid Protocol Type: {type_}")
-    return info[type_]
+def get_apk_info(_type: str = "IPAD") -> ApkInfo:
+    info = {"IPAD": IPAD, "ANDROID_PHONE": ANDROID_PHONE, "ANDROID_WATCH": ANDROID_WATCH, "MACOS": MACOS}
+    if _type not in info:
+        raise ValueError(f"Invalid Protocol Type: {_type}")
+    return info[_type]
 
 
 def get_protocol(cache: bool = True) -> ApkInfo:
@@ -181,8 +181,8 @@ def get_protocol(cache: bool = True) -> ApkInfo:
         with open(Storage.protocol_file, "r") as f:
             type_ = f.read()
     elif type_ is MISSING:
-        type_ = "0"
+        type_ = "IPAD"
         with open(Storage.protocol_file, "w") as f:
-            f.write("0")
+            f.write("IPAD")
     _protocol = get_apk_info(type_)
     return _protocol
diff --git a/examples/login.py b/examples/login.py
index bc0252c1..d64df97d 100644
--- a/examples/login.py
+++ b/examples/login.py
@@ -8,15 +8,15 @@
 """
 import os
 import asyncio
-import signal
-import asyncio
-import sys
 import traceback
 from io import BytesIO
 
 from PIL import Image
 
 from cai.api import Client, make_client
+from cai.client import OnlineStatus
+from cai.settings.device import get_device
+from cai.settings.protocol import get_apk_info
 from cai.exceptions import (
     LoginException,
     ApiResponseError,
@@ -34,13 +34,20 @@ async def run(closed: asyncio.Event):
         assert password and account, ValueError("account or password not set")
 
         account = int(account)
-        ci = Client(make_client(account, password))
+        ci = Client(make_client(account, password, get_apk_info(), device=get_device()))
 
         try:
             await ci.login()
             print(f"Login Success! Client status: {ci.client.status!r}")
         except Exception as e:
             await handle_failure(ci, e)
+        while True:
+            for status in OnlineStatus:
+                if status == OnlineStatus.Offline:
+                    continue
+                print(status, "Changed")
+                await ci.set_status(status, 67, True)
+                await asyncio.sleep(10)
     finally:
         closed.set()
 

From c134a6dcd20c70145f330c2fc3214b45fd51c78f Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 03:02:31 +0800
Subject: [PATCH 010/113] update: named logger

---
 cai/client/client.py                   | 32 +++++++++++++-------------
 cai/client/config_push/__init__.py     |  4 ++--
 cai/client/message_service/__init__.py |  6 ++---
 cai/log.py                             |  8 +++++--
 4 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 32769cf6..03c23cd3 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -26,7 +26,7 @@
 
 from cachetools import TTLCache
 
-from cai.log import logger
+from cai import log
 from cai.utils.binary import Packet
 from cai.utils.future import FutureStore
 from cai.settings.device import DeviceInfo
@@ -271,7 +271,7 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
             raise RuntimeError("Already connected to the server")
 
         _server = server or await get_sso_server()
-        logger.info(f"Connecting to server: {_server.host}:{_server.port}")
+        log.logger.info(f"Connecting to server: {_server.host}:{_server.port}")
         try:
             self._connection = await connect(
                 _server.host, _server.port, ssl=False, timeout=3.0
@@ -357,7 +357,7 @@ async def send(
         Returns:
             None.
         """
-        logger.debug(f"--> {seq}: {command_name}")
+        log.network.debug(f"--> {seq}: {command_name}")
         await self.connection.awrite(packet)
 
     async def send_and_wait(
@@ -388,7 +388,7 @@ async def _handle_incoming_packet(self, in_packet: IncomingPacket) -> None:
             self._receive_store.store_result(packet.seq, packet)
         except Exception as e:
             # TODO: handle exception
-            logger.exception(e)
+            log.logger.exception(e)
 
     async def receive(self):
         """Receive data from connection reader and store it in sequence future.
@@ -410,15 +410,15 @@ async def receive(self):
                     self._siginfo.d2key,
                     self._siginfo.wt_session_ticket_key,
                 )
-                logger.debug(
+                log.network.debug(
                     f"<-- {packet.seq} ({packet.ret_code}): {packet.command_name}"
                 )
                 # do not block receive
                 asyncio.create_task(self._handle_incoming_packet(packet))
             except ConnectionAbortedError:
-                logger.debug(f"Client {self.uin} connection closed")
+                log.logger.debug(f"Client {self.uin} connection closed")
             except Exception as e:
-                logger.exception(e)
+                log.logger.exception(e)
 
     @property
     def listeners(self) -> Set[LT]:
@@ -428,7 +428,7 @@ async def _run_listener(self, listener: LT, event: Event) -> None:
         try:
             await listener(self, event)
         except Exception as e:
-            logger.exception(e)
+            log.logger.exception(e)
 
     def dispatch_event(self, event: Event) -> None:
         for listener in self.listeners:
@@ -457,15 +457,15 @@ async def _handle_login_response(
             )
 
         if isinstance(response, LoginSuccess):
-            logger.info(f"{self.nick}({self.uin}) 登录成功!")
+            log.logger.info(f"{self.nick}({self.uin}) 登录成功!")
             await self._init()
             return response
         elif isinstance(response, NeedCaptcha):
             if response.verify_url:
-                logger.info(f"登录失败!请前往 {response.verify_url} 获取 ticket")
+                log.logger.info(f"登录失败!请前往 {response.verify_url} 获取 ticket")
                 raise LoginSliderNeeded(response.uin, response.verify_url)
             elif response.captcha_image:
-                logger.info(f"登录失败!需要根据图片输入验证码")
+                log.logger.info(f"登录失败!需要根据图片输入验证码")
                 raise LoginCaptchaNeeded(
                     response.uin, response.captcha_image, response.captcha_sign
                 )
@@ -476,7 +476,7 @@ async def _handle_login_response(
                     "Cannot get verify_url or captcha_image from the response!",
                 )
         elif isinstance(response, AccountFrozen):
-            logger.info("账号已被冻结!")
+            log.logger.info("账号已被冻结!")
             raise LoginAccountFrozen(response.uin)
         elif isinstance(response, DeviceLocked):
             msg = "账号已开启设备锁!"
@@ -484,7 +484,7 @@ async def _handle_login_response(
                 msg += f"向手机{response.sms_phone}发送验证码"
             if response.verify_url:
                 msg += f"或前往 {response.verify_url} 扫码验证"
-            logger.info(msg + "。" + str(response.message))
+            log.logger.info(msg + "。" + str(response.message))
 
             raise LoginDeviceLocked(
                 response.uin,
@@ -493,7 +493,7 @@ async def _handle_login_response(
                 response.message,
             )
         elif isinstance(response, TooManySMSRequest):
-            logger.info("验证码发送频繁!")
+            log.logger.info("验证码发送过于频繁!")
             raise LoginSMSRequestError(response.uin)
         elif isinstance(response, DeviceLockLogin):
             if try_times:
@@ -532,7 +532,7 @@ async def _handle_login_response(
                 msg = packet_.start(2).string(2).execute()[0]
             else:
                 msg = ""
-            logger.info(f"未知的登录返回码 {response.status}! {msg}")
+            log.logger.info(f"未知的登录返回码 {response.status}! {msg}")
             raise LoginException(
                 response.uin, response.status, "Unknown login status."
             )
@@ -954,7 +954,7 @@ async def heartbeat(self) -> None:
                 if not isinstance(response, Heartbeat):
                     raise RuntimeError("Invalid heartbeat response type!")
             except Exception:
-                logger.exception("Heartbeat.Alive: Failed")
+                log.network.exception("Heartbeat.Alive: Failed")
                 break
             await asyncio.sleep(self._heartbeat_interval)
 
diff --git a/cai/client/config_push/__init__.py b/cai/client/config_push/__init__.py
index bc99ebbe..c1b9bf27 100644
--- a/cai/client/config_push/__init__.py
+++ b/cai/client/config_push/__init__.py
@@ -13,7 +13,7 @@
 
 from jce import types
 
-from cai.log import logger
+from cai import log
 from cai.utils.binary import Packet
 from cai.utils.jce import RequestPacketVersion3
 from cai.client.packet import UniPacket, IncomingPacket
@@ -85,7 +85,7 @@ async def handle_config_push_request(
         packet.data,
     )
     if isinstance(command, SsoServerPushCommand):
-        logger.debug(f"ConfigPush: Got new server addresses.")
+        log.network.debug(f"ConfigPush: Got new server addresses.")
     elif isinstance(command, FileServerPushCommand):
         client._file_storage_info = command.list
 
diff --git a/cai/client/message_service/__init__.py b/cai/client/message_service/__init__.py
index e6ccd6e6..def447ed 100644
--- a/cai/client/message_service/__init__.py
+++ b/cai/client/message_service/__init__.py
@@ -12,7 +12,7 @@
 from enum import IntEnum
 from typing import TYPE_CHECKING, List, Union, Optional
 
-from cai.log import logger
+from cai import log
 from cai.utils.binary import Packet
 from cai.client.status_service import OnlineStatus
 from cai.client.packet import UniPacket, IncomingPacket
@@ -169,7 +169,7 @@ async def handle_get_message(
                 msg_type = message.head.type
                 Decoder = MESSAGE_DECODERS.get(msg_type, None)
                 if not Decoder:
-                    logger.debug(
+                    log.network.debug(
                         "MessageSvc.PbGetMsg: "
                         f"Received unknown message type {msg_type}."
                     )
@@ -315,7 +315,7 @@ async def handle_force_offline(
         packet.command_name,
         packet.data,
     )
-    logger.error(
+    log.network.error(
         f"Client {client.uin} force offline: " + request.request.tips
         if isinstance(request, PushForceOffline)
         else "Unknown reason."
diff --git a/cai/log.py b/cai/log.py
index d205509f..a2f39d54 100644
--- a/cai/log.py
+++ b/cai/log.py
@@ -11,6 +11,10 @@
 import sys
 import logging
 
+logging.basicConfig(
+    level=logging.DEBUG,
+    handlers=[logging.StreamHandler(sys.stdout)]
+)
+
 logger = logging.getLogger("cai")
-logger.setLevel(logging.DEBUG)
-logger.addHandler(logging.StreamHandler(sys.stdout))
+network = logging.getLogger("cai.network")

From 876b02fa07980a764fee957ba63da142d9d9f8a4 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 03:56:27 +0800
Subject: [PATCH 011/113] update: logger

---
 cai/client/client.py | 9 ++++++---
 cai/log.py           | 3 ++-
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 03c23cd3..6ede43b3 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -8,6 +8,7 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
+import logging
 import time
 import struct
 import asyncio
@@ -269,7 +270,7 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
         """
         if self.connected:
             raise RuntimeError("Already connected to the server")
-
+        log.network.debug("Getting Sso server")
         _server = server or await get_sso_server()
         log.logger.info(f"Connecting to server: {_server.host}:{_server.port}")
         try:
@@ -318,6 +319,7 @@ async def reconnect(
 
     async def close(self) -> None:
         """Close the client and logout."""
+        log.logger.warning("closing client")
         if (
             self.connected
             and self.status
@@ -357,7 +359,7 @@ async def send(
         Returns:
             None.
         """
-        log.network.debug(f"--> {seq}: {command_name}")
+        log.network.debug(f"(send:{seq}): {command_name}")
         await self.connection.awrite(packet)
 
     async def send_and_wait(
@@ -410,8 +412,9 @@ async def receive(self):
                     self._siginfo.d2key,
                     self._siginfo.wt_session_ticket_key,
                 )
+                #
                 log.network.debug(
-                    f"<-- {packet.seq} ({packet.ret_code}): {packet.command_name}"
+                    f"(receive:{packet.ret_code}): {packet.command_name}"
                 )
                 # do not block receive
                 asyncio.create_task(self._handle_incoming_packet(packet))
diff --git a/cai/log.py b/cai/log.py
index a2f39d54..37c06818 100644
--- a/cai/log.py
+++ b/cai/log.py
@@ -13,7 +13,8 @@
 
 logging.basicConfig(
     level=logging.DEBUG,
-    handlers=[logging.StreamHandler(sys.stdout)]
+    handlers=[logging.StreamHandler(sys.stdout)],
+    format="%(asctime)s %(name)s[%(levelname)s]: %(message)s"
 )
 
 logger = logging.getLogger("cai")

From 68ac10d96fd8ff5b7303f5c2d09f11d4335fc7f9 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 04:12:56 +0800
Subject: [PATCH 012/113] add: Client.status

---
 cai/api/client.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/cai/api/client.py b/cai/api/client.py
index 418d68ce..6f8fec19 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -32,7 +32,6 @@ def make_client(
             passwd = hashlib.md5(passwd.encode()).digest()
     if not device:
         device = new_device()
-    print(device)
     return client_t(uin, passwd, device, apk_info)
 
 
@@ -44,6 +43,10 @@ def __init__(self, client: client_t):
     def connected(self) -> bool:
         return self.client.connected
 
+    @property
+    def status(self) -> Optional[OnlineStatus]:
+        return self.client.status
+
     async def close(self):
         """Stop Client"""
         await self.client.close()

From 06d03d6ed355ace275737c42917e2e4826da6cd4 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 04:46:23 +0800
Subject: [PATCH 013/113] add: more debug message

---
 cai/client/client.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/cai/client/client.py b/cai/client/client.py
index 6ede43b3..5af25328 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -302,6 +302,7 @@ async def reconnect(
             change_server (bool, optional): True if you want to change the server. Defaults to False.
             server (Optional[SsoServer], optional): Which server you want to connect to. Defaults to None.
         """
+        log.network.debug("reconnecting...")
         if not change_server and self._connection:
             await self._connection.reconnect()
             return
@@ -316,6 +317,7 @@ async def reconnect(
         )
         await self.disconnect()
         await self.connect(_server)
+        log.network.debug("reconnected")
 
     async def close(self) -> None:
         """Close the client and logout."""
@@ -961,6 +963,7 @@ async def heartbeat(self) -> None:
                 break
             await asyncio.sleep(self._heartbeat_interval)
 
+        log.network.debug("heartbeat stopped")
         self._heartbeat_enabled = False
 
     async def _refresh_friend_list(self):

From 40974150b60b8b310375182d2101aadaba0d1221 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 14:45:30 +0800
Subject: [PATCH 014/113] add: basic send group message[see example/login.py]

---
 cai/api/client.py                      | 21 ++++++++--
 cai/client/message_service/encoders.py | 53 ++++++++++++++++++++++++++
 cai/log.py                             |  7 ----
 examples/login.py                      | 32 +++++++++++++++-
 4 files changed, 100 insertions(+), 13 deletions(-)
 create mode 100644 cai/client/message_service/encoders.py

diff --git a/cai/api/client.py b/cai/api/client.py
index 6f8fec19..c5bc9291 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -8,14 +8,16 @@
 """
 
 import hashlib
-from typing import Union, Optional
+from typing import Union, Optional, Sequence
 
-from .login import Login as _Login
-from .friend import Friend as _Friend
-from .group import Group as _Group
 from cai.client import OnlineStatus, Client as client_t
+from cai.client.message_service.encoders import make_group_msg_pkg, build_msg
 from cai.settings.device import DeviceInfo, new_device
 from cai.settings.protocol import ApkInfo
+from .friend import Friend as _Friend
+from .group import Group as _Group
+from .login import Login as _Login
+from cai.client.message_service.models import Element
 
 
 def make_client(
@@ -47,6 +49,17 @@ def connected(self) -> bool:
     def status(self) -> Optional[OnlineStatus]:
         return self.client.status
 
+    async def send_group_msg(self, gid: int, msg: Sequence[Element]):
+        seq = self.client.next_seq()
+
+        return await self.client.send_and_wait(
+            seq,
+            "MessageSvc.PbSendMsg",
+            make_group_msg_pkg(
+                seq, gid, self.client, build_msg(msg)
+            )
+        )
+
     async def close(self):
         """Stop Client"""
         await self.client.close()
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
new file mode 100644
index 00000000..07c3b4ba
--- /dev/null
+++ b/cai/client/message_service/encoders.py
@@ -0,0 +1,53 @@
+import random
+
+from typing import Sequence, TYPE_CHECKING, Dict, Type
+from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, Elem
+from cai.pb.msf.msg.svc.svc_pb2 import PbSendMsgReq, RoutingHead, Grp
+from cai.pb.msf.msg.comm.comm_pb2 import ContentHead
+from cai.client.packet import UniPacket
+
+from . import models
+
+
+if TYPE_CHECKING:
+    from cai.client.client import Client
+
+
+# todo: https://github.com/mamoe/mirai/blob/7d3971259de59cede94b7a55650c8a6ad4346a59/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbSendMsg.kt#L103
+# https://github.com/mamoe/mirai/blob/74fc5a50376ed0330b984af51e0fabc2147afdbb/mirai-core/src/commonMain/kotlin/contact/SendMessageHandler.kt
+
+def build_msg(elements: Sequence[models.Element]) -> MsgBody:
+    ret = []
+    for e in elements:  # todo: support more element
+        if isinstance(e, models.TextElement):
+            ret.append(PlainText(str=e.content.encode()))
+        else:
+            raise NotImplementedError(e)
+
+    return MsgBody(
+        rich_text=RichText(
+            elems=[Elem(text=e) for e in ret],
+            ptt=None
+        )
+    )
+
+
+def encode_send_group_msg_req(
+    seq: int, session_id: bytes, uin: int, group: int, body: MsgBody, head: ContentHead, d2key: bytes
+):
+    return UniPacket.build(uin, seq, "MessageSvc.PbSendMsg", session_id, 1, PbSendMsgReq(
+        routing_head=RoutingHead(grp=Grp(group_code=group)),
+        content_head=head,
+        body=body,
+        seq=seq,
+        rand=random.randrange(3000, 30000),
+        via=0
+    ).SerializeToString(), d2key)
+
+
+def make_group_msg_pkg(seq: int, gid: int, client: "Client", body: MsgBody) -> UniPacket:
+    return encode_send_group_msg_req(
+        seq, client._session_id, client.uin,
+        gid, body, ContentHead(pkg_num=1, pkg_index=0, div_seq=0),
+        client._siginfo.d2key
+    )
diff --git a/cai/log.py b/cai/log.py
index 37c06818..1ca89ad1 100644
--- a/cai/log.py
+++ b/cai/log.py
@@ -8,14 +8,7 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-import sys
 import logging
 
-logging.basicConfig(
-    level=logging.DEBUG,
-    handlers=[logging.StreamHandler(sys.stdout)],
-    format="%(asctime)s %(name)s[%(levelname)s]: %(message)s"
-)
-
 logger = logging.getLogger("cai")
 network = logging.getLogger("cai.network")
diff --git a/examples/login.py b/examples/login.py
index d64df97d..fc533dd1 100644
--- a/examples/login.py
+++ b/examples/login.py
@@ -6,15 +6,19 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
+import functools
+import logging
 import os
 import asyncio
+import sys
 import traceback
 from io import BytesIO
 
 from PIL import Image
 
 from cai.api import Client, make_client
-from cai.client import OnlineStatus
+from cai.client import OnlineStatus, PrivateMessage, GroupMessage, Event
+from cai.client.message_service.models import TextElement
 from cai.settings.device import get_device
 from cai.settings.protocol import get_apk_info
 from cai.exceptions import (
@@ -41,17 +45,34 @@ async def run(closed: asyncio.Event):
             print(f"Login Success! Client status: {ci.client.status!r}")
         except Exception as e:
             await handle_failure(ci, e)
+        ci.client.add_event_listener(functools.partial(listen_message, ci))
         while True:
             for status in OnlineStatus:
                 if status == OnlineStatus.Offline:
                     continue
                 print(status, "Changed")
                 await ci.set_status(status, 67, True)
-                await asyncio.sleep(10)
+                await asyncio.sleep(360)
     finally:
         closed.set()
 
 
+async def listen_message(client: Client, _, event: Event):
+    if isinstance(event, PrivateMessage):
+        print(f"{event.from_nick}(f{event.from_uin}) -> {event.message}")
+    elif isinstance(event, GroupMessage):
+        print(f"{event.group_name}({event.group_id}:{event.from_uin}) -> {event.message}")
+        if event.message and hasattr(event.message[0], "content"):
+            if event.message[0].content == "0x114514":
+                await client.send_group_msg(
+                    event.group_id, [
+                        TextElement("Hello\n"),
+                        TextElement("Multiple element "),
+                        TextElement("Supported.")
+                    ]
+                )
+
+
 async def handle_failure(client: Client, exception: Exception):
     if isinstance(exception, LoginSliderNeeded):
         print("Verify url:", exception.verify_url)
@@ -125,6 +146,13 @@ async def handle_failure(client: Client, exception: Exception):
 
 
 if __name__ == "__main__":
+
+    logging.basicConfig(
+        level=logging.DEBUG,
+        handlers=[logging.StreamHandler(sys.stdout)],
+        format="%(asctime)s %(name)s[%(levelname)s]: %(message)s"
+    )
+
     close = asyncio.Event()
 
     async def wait_cleanup():

From 6cb910325f821223cc09aceec464146200c4aadc Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 16:06:17 +0800
Subject: [PATCH 015/113] add: highway pb file

---
 cai/pb/highway/__init__.py                   |   0
 cai/pb/highway/protocol/__init__.py          |   0
 cai/pb/highway/protocol/highway_head.proto   | 132 ++++++
 cai/pb/highway/protocol/highway_head_pb2.py  | 210 +++++++++
 cai/pb/highway/protocol/highway_head_pb2.pyi | 421 +++++++++++++++++++
 5 files changed, 763 insertions(+)
 create mode 100644 cai/pb/highway/__init__.py
 create mode 100644 cai/pb/highway/protocol/__init__.py
 create mode 100644 cai/pb/highway/protocol/highway_head.proto
 create mode 100644 cai/pb/highway/protocol/highway_head_pb2.py
 create mode 100644 cai/pb/highway/protocol/highway_head_pb2.pyi

diff --git a/cai/pb/highway/__init__.py b/cai/pb/highway/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/cai/pb/highway/protocol/__init__.py b/cai/pb/highway/protocol/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/cai/pb/highway/protocol/highway_head.proto b/cai/pb/highway/protocol/highway_head.proto
new file mode 100644
index 00000000..cfddbdd8
--- /dev/null
+++ b/cai/pb/highway/protocol/highway_head.proto
@@ -0,0 +1,132 @@
+syntax = "proto2";
+// origin name: CSDataHighwayHead
+message highway_head {
+  message C2CCommonExtendinfo {
+    optional uint32 infoId = 1;
+    optional FilterExtendinfo filterExtendinfo = 2;
+  }
+
+  message DataHighwayHead {
+    optional uint32 version = 1;
+    optional bytes uin = 2;
+    optional bytes command = 3;
+    optional uint32 seq = 4;
+    optional uint32 retryTimes = 5;
+    optional uint32 appid = 6;
+    optional uint32 dataflag = 7;
+    optional uint32 commandId = 8;
+    optional bytes buildVer = 9;
+    optional uint32 localeId = 10;
+    optional uint32 envId = 11;
+  }
+
+  message DataHole {
+    optional uint64 begin = 1;
+    optional uint64 end = 2;
+  }
+
+  message FilterExtendinfo {
+    optional uint32 filterFlag = 1;
+    optional ImageFilterRequest imageFilterRequest = 2;
+  }
+
+  message FilterStyle {
+    optional uint32 styleId = 1;
+    optional bytes styleName = 2;
+  }
+
+  message ImageFilterRequest {
+    optional bytes sessionId = 1;
+    optional uint32 clientIp = 2;
+    optional uint64 uin = 3;
+    optional FilterStyle style = 4;
+    optional uint32 width = 5;
+    optional uint32 height = 6;
+    optional bytes imageData = 7;
+  }
+
+  message ImageFilterResponse {
+    optional int32 retCode = 1;
+    optional bytes imageData = 2;
+    optional uint32 costTime = 3;
+  }
+
+  message LoginSigHead {
+    optional uint32 loginsigType = 1;
+    optional bytes loginsig = 2;
+  }
+
+  message NewServiceTicket {
+    optional bytes signature = 1;
+    optional bytes ukey = 2;
+  }
+
+  message PicInfoExt {
+    optional uint32 picWidth = 1;
+    optional uint32 picHeight = 2;
+    optional uint32 picFlag = 3;
+    optional uint32 busiType = 4;
+    optional uint32 srcTerm = 5;
+    optional uint32 platType = 6;
+    optional uint32 netType = 7;
+    optional uint32 imgType = 8;
+    optional uint32 appPicType = 9;
+    optional bytes echoCreatedByServer = 10;
+    optional uint64 qqmeetGuildId = 11;
+    optional uint64 qqmeetChannelId = 12;
+  }
+
+  message PicRspExtInfo {
+    optional bytes skey = 1;
+    optional uint32 clientIp = 2;
+    optional uint64 upOffset = 3;
+    optional uint64 blockSize = 4;
+  }
+
+  message QueryHoleRsp {
+    optional uint32 result = 1;
+    repeated DataHole dataHole = 2;
+    optional bool compFlag = 3;
+  }
+
+  message ReqDataHighwayHead {
+    optional DataHighwayHead basehead = 1;
+    optional SegHead seghead = 2;
+    optional bytes reqExtendinfo = 3;
+    optional uint64 timestamp = 4;
+    optional LoginSigHead loginSigHead = 5;
+  }
+
+  message RspBody {
+    optional QueryHoleRsp queryHoleRsp = 1;
+  }
+
+  message RspDataHighwayHead {
+    optional DataHighwayHead basehead = 1;
+    optional SegHead seghead = 2;
+    optional uint32 errorCode = 3;
+    optional uint32 allowRetry = 4;
+    optional uint32 cachecost = 5;
+    optional uint32 htcost = 6;
+    optional bytes rspExtendinfo = 7;
+    optional uint64 timestamp = 8;
+    optional uint64 range = 9;
+    optional uint32 isReset = 10;
+  }
+
+  message SegHead {
+    optional uint32 serviceid = 1;
+    optional uint64 filesize = 2;
+    optional uint64 dataoffset = 3;
+    optional uint32 datalength = 4;
+    optional uint32 rtcode = 5;
+    optional bytes serviceticket = 6;
+    optional uint32 flag = 7;
+    optional bytes md5 = 8;
+    optional bytes fileMd5 = 9;
+    optional uint32 cacheAddr = 10;
+    optional uint32 queryTimes = 11;
+    optional uint32 updateCacheip = 12;
+    optional uint32 cachePort = 13;
+  }
+}
diff --git a/cai/pb/highway/protocol/highway_head_pb2.py b/cai/pb/highway/protocol/highway_head_pb2.py
new file mode 100644
index 00000000..ee212b00
--- /dev/null
+++ b/cai/pb/highway/protocol/highway_head_pb2.py
@@ -0,0 +1,210 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: highway_head.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12highway_head.proto\"\x93\x10\n\x0chighway_head\x1a_\n\x13\x43\x32\x43\x43ommonExtendinfo\x12\x0e\n\x06infoId\x18\x01 \x01(\r\x12\x38\n\x10\x66ilterExtendinfo\x18\x02 \x01(\x0b\x32\x1e.highway_head.FilterExtendinfo\x1a\xc8\x01\n\x0f\x44\x61taHighwayHead\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x0b\n\x03uin\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ommand\x18\x03 \x01(\x0c\x12\x0b\n\x03seq\x18\x04 \x01(\r\x12\x12\n\nretryTimes\x18\x05 \x01(\r\x12\r\n\x05\x61ppid\x18\x06 \x01(\r\x12\x10\n\x08\x64\x61taflag\x18\x07 \x01(\r\x12\x11\n\tcommandId\x18\x08 \x01(\r\x12\x10\n\x08\x62uildVer\x18\t \x01(\x0c\x12\x10\n\x08localeId\x18\n \x01(\r\x12\r\n\x05\x65nvId\x18\x0b \x01(\r\x1a&\n\x08\x44\x61taHole\x12\r\n\x05\x62\x65gin\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04\x1a\x64\n\x10\x46ilterExtendinfo\x12\x12\n\nfilterFlag\x18\x01 \x01(\r\x12<\n\x12imageFilterRequest\x18\x02 \x01(\x0b\x32 .highway_head.ImageFilterRequest\x1a\x31\n\x0b\x46ilterStyle\x12\x0f\n\x07styleId\x18\x01 \x01(\r\x12\x11\n\tstyleName\x18\x02 \x01(\x0c\x1a\xa2\x01\n\x12ImageFilterRequest\x12\x11\n\tsessionId\x18\x01 \x01(\x0c\x12\x10\n\x08\x63lientIp\x18\x02 \x01(\r\x12\x0b\n\x03uin\x18\x03 \x01(\x04\x12(\n\x05style\x18\x04 \x01(\x0b\x32\x19.highway_head.FilterStyle\x12\r\n\x05width\x18\x05 \x01(\r\x12\x0e\n\x06height\x18\x06 \x01(\r\x12\x11\n\timageData\x18\x07 \x01(\x0c\x1aK\n\x13ImageFilterResponse\x12\x0f\n\x07retCode\x18\x01 \x01(\x05\x12\x11\n\timageData\x18\x02 \x01(\x0c\x12\x10\n\x08\x63ostTime\x18\x03 \x01(\r\x1a\x36\n\x0cLoginSigHead\x12\x14\n\x0cloginsigType\x18\x01 \x01(\r\x12\x10\n\x08loginsig\x18\x02 \x01(\x0c\x1a\x33\n\x10NewServiceTicket\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\x0c\n\x04ukey\x18\x02 \x01(\x0c\x1a\xfa\x01\n\nPicInfoExt\x12\x10\n\x08picWidth\x18\x01 \x01(\r\x12\x11\n\tpicHeight\x18\x02 \x01(\r\x12\x0f\n\x07picFlag\x18\x03 \x01(\r\x12\x10\n\x08\x62usiType\x18\x04 \x01(\r\x12\x0f\n\x07srcTerm\x18\x05 \x01(\r\x12\x10\n\x08platType\x18\x06 \x01(\r\x12\x0f\n\x07netType\x18\x07 \x01(\r\x12\x0f\n\x07imgType\x18\x08 \x01(\r\x12\x12\n\nappPicType\x18\t \x01(\r\x12\x1b\n\x13\x65\x63hoCreatedByServer\x18\n \x01(\x0c\x12\x15\n\rqqmeetGuildId\x18\x0b \x01(\x04\x12\x17\n\x0fqqmeetChannelId\x18\x0c \x01(\x04\x1aT\n\rPicRspExtInfo\x12\x0c\n\x04skey\x18\x01 \x01(\x0c\x12\x10\n\x08\x63lientIp\x18\x02 \x01(\r\x12\x10\n\x08upOffset\x18\x03 \x01(\x04\x12\x11\n\tblockSize\x18\x04 \x01(\x04\x1aZ\n\x0cQueryHoleRsp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12(\n\x08\x64\x61taHole\x18\x02 \x03(\x0b\x32\x16.highway_head.DataHole\x12\x10\n\x08\x63ompFlag\x18\x03 \x01(\x08\x1a\xc9\x01\n\x12ReqDataHighwayHead\x12/\n\x08\x62\x61sehead\x18\x01 \x01(\x0b\x32\x1d.highway_head.DataHighwayHead\x12&\n\x07seghead\x18\x02 \x01(\x0b\x32\x15.highway_head.SegHead\x12\x15\n\rreqExtendinfo\x18\x03 \x01(\x0c\x12\x11\n\ttimestamp\x18\x04 \x01(\x04\x12\x30\n\x0cloginSigHead\x18\x05 \x01(\x0b\x32\x1a.highway_head.LoginSigHead\x1a;\n\x07RspBody\x12\x30\n\x0cqueryHoleRsp\x18\x01 \x01(\x0b\x32\x1a.highway_head.QueryHoleRsp\x1a\x81\x02\n\x12RspDataHighwayHead\x12/\n\x08\x62\x61sehead\x18\x01 \x01(\x0b\x32\x1d.highway_head.DataHighwayHead\x12&\n\x07seghead\x18\x02 \x01(\x0b\x32\x15.highway_head.SegHead\x12\x11\n\terrorCode\x18\x03 \x01(\r\x12\x12\n\nallowRetry\x18\x04 \x01(\r\x12\x11\n\tcachecost\x18\x05 \x01(\r\x12\x0e\n\x06htcost\x18\x06 \x01(\r\x12\x15\n\rrspExtendinfo\x18\x07 \x01(\x0c\x12\x11\n\ttimestamp\x18\x08 \x01(\x04\x12\r\n\x05range\x18\t \x01(\x04\x12\x0f\n\x07isReset\x18\n \x01(\r\x1a\xfa\x01\n\x07SegHead\x12\x11\n\tserviceid\x18\x01 \x01(\r\x12\x10\n\x08\x66ilesize\x18\x02 \x01(\x04\x12\x12\n\ndataoffset\x18\x03 \x01(\x04\x12\x12\n\ndatalength\x18\x04 \x01(\r\x12\x0e\n\x06rtcode\x18\x05 \x01(\r\x12\x15\n\rserviceticket\x18\x06 \x01(\x0c\x12\x0c\n\x04\x66lag\x18\x07 \x01(\r\x12\x0b\n\x03md5\x18\x08 \x01(\x0c\x12\x0f\n\x07\x66ileMd5\x18\t \x01(\x0c\x12\x11\n\tcacheAddr\x18\n \x01(\r\x12\x12\n\nqueryTimes\x18\x0b \x01(\r\x12\x15\n\rupdateCacheip\x18\x0c \x01(\r\x12\x11\n\tcachePort\x18\r \x01(\r')
+
+
+
+_HIGHWAY_HEAD = DESCRIPTOR.message_types_by_name['highway_head']
+_HIGHWAY_HEAD_C2CCOMMONEXTENDINFO = _HIGHWAY_HEAD.nested_types_by_name['C2CCommonExtendinfo']
+_HIGHWAY_HEAD_DATAHIGHWAYHEAD = _HIGHWAY_HEAD.nested_types_by_name['DataHighwayHead']
+_HIGHWAY_HEAD_DATAHOLE = _HIGHWAY_HEAD.nested_types_by_name['DataHole']
+_HIGHWAY_HEAD_FILTEREXTENDINFO = _HIGHWAY_HEAD.nested_types_by_name['FilterExtendinfo']
+_HIGHWAY_HEAD_FILTERSTYLE = _HIGHWAY_HEAD.nested_types_by_name['FilterStyle']
+_HIGHWAY_HEAD_IMAGEFILTERREQUEST = _HIGHWAY_HEAD.nested_types_by_name['ImageFilterRequest']
+_HIGHWAY_HEAD_IMAGEFILTERRESPONSE = _HIGHWAY_HEAD.nested_types_by_name['ImageFilterResponse']
+_HIGHWAY_HEAD_LOGINSIGHEAD = _HIGHWAY_HEAD.nested_types_by_name['LoginSigHead']
+_HIGHWAY_HEAD_NEWSERVICETICKET = _HIGHWAY_HEAD.nested_types_by_name['NewServiceTicket']
+_HIGHWAY_HEAD_PICINFOEXT = _HIGHWAY_HEAD.nested_types_by_name['PicInfoExt']
+_HIGHWAY_HEAD_PICRSPEXTINFO = _HIGHWAY_HEAD.nested_types_by_name['PicRspExtInfo']
+_HIGHWAY_HEAD_QUERYHOLERSP = _HIGHWAY_HEAD.nested_types_by_name['QueryHoleRsp']
+_HIGHWAY_HEAD_REQDATAHIGHWAYHEAD = _HIGHWAY_HEAD.nested_types_by_name['ReqDataHighwayHead']
+_HIGHWAY_HEAD_RSPBODY = _HIGHWAY_HEAD.nested_types_by_name['RspBody']
+_HIGHWAY_HEAD_RSPDATAHIGHWAYHEAD = _HIGHWAY_HEAD.nested_types_by_name['RspDataHighwayHead']
+_HIGHWAY_HEAD_SEGHEAD = _HIGHWAY_HEAD.nested_types_by_name['SegHead']
+highway_head = _reflection.GeneratedProtocolMessageType('highway_head', (_message.Message,), {
+
+  'C2CCommonExtendinfo' : _reflection.GeneratedProtocolMessageType('C2CCommonExtendinfo', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_C2CCOMMONEXTENDINFO,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.C2CCommonExtendinfo)
+    })
+  ,
+
+  'DataHighwayHead' : _reflection.GeneratedProtocolMessageType('DataHighwayHead', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_DATAHIGHWAYHEAD,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.DataHighwayHead)
+    })
+  ,
+
+  'DataHole' : _reflection.GeneratedProtocolMessageType('DataHole', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_DATAHOLE,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.DataHole)
+    })
+  ,
+
+  'FilterExtendinfo' : _reflection.GeneratedProtocolMessageType('FilterExtendinfo', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_FILTEREXTENDINFO,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.FilterExtendinfo)
+    })
+  ,
+
+  'FilterStyle' : _reflection.GeneratedProtocolMessageType('FilterStyle', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_FILTERSTYLE,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.FilterStyle)
+    })
+  ,
+
+  'ImageFilterRequest' : _reflection.GeneratedProtocolMessageType('ImageFilterRequest', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_IMAGEFILTERREQUEST,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.ImageFilterRequest)
+    })
+  ,
+
+  'ImageFilterResponse' : _reflection.GeneratedProtocolMessageType('ImageFilterResponse', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_IMAGEFILTERRESPONSE,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.ImageFilterResponse)
+    })
+  ,
+
+  'LoginSigHead' : _reflection.GeneratedProtocolMessageType('LoginSigHead', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_LOGINSIGHEAD,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.LoginSigHead)
+    })
+  ,
+
+  'NewServiceTicket' : _reflection.GeneratedProtocolMessageType('NewServiceTicket', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_NEWSERVICETICKET,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.NewServiceTicket)
+    })
+  ,
+
+  'PicInfoExt' : _reflection.GeneratedProtocolMessageType('PicInfoExt', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_PICINFOEXT,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.PicInfoExt)
+    })
+  ,
+
+  'PicRspExtInfo' : _reflection.GeneratedProtocolMessageType('PicRspExtInfo', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_PICRSPEXTINFO,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.PicRspExtInfo)
+    })
+  ,
+
+  'QueryHoleRsp' : _reflection.GeneratedProtocolMessageType('QueryHoleRsp', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_QUERYHOLERSP,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.QueryHoleRsp)
+    })
+  ,
+
+  'ReqDataHighwayHead' : _reflection.GeneratedProtocolMessageType('ReqDataHighwayHead', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_REQDATAHIGHWAYHEAD,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.ReqDataHighwayHead)
+    })
+  ,
+
+  'RspBody' : _reflection.GeneratedProtocolMessageType('RspBody', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_RSPBODY,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.RspBody)
+    })
+  ,
+
+  'RspDataHighwayHead' : _reflection.GeneratedProtocolMessageType('RspDataHighwayHead', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_RSPDATAHIGHWAYHEAD,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.RspDataHighwayHead)
+    })
+  ,
+
+  'SegHead' : _reflection.GeneratedProtocolMessageType('SegHead', (_message.Message,), {
+    'DESCRIPTOR' : _HIGHWAY_HEAD_SEGHEAD,
+    '__module__' : 'highway_head_pb2'
+    # @@protoc_insertion_point(class_scope:highway_head.SegHead)
+    })
+  ,
+  'DESCRIPTOR' : _HIGHWAY_HEAD,
+  '__module__' : 'highway_head_pb2'
+  # @@protoc_insertion_point(class_scope:highway_head)
+  })
+_sym_db.RegisterMessage(highway_head)
+_sym_db.RegisterMessage(highway_head.C2CCommonExtendinfo)
+_sym_db.RegisterMessage(highway_head.DataHighwayHead)
+_sym_db.RegisterMessage(highway_head.DataHole)
+_sym_db.RegisterMessage(highway_head.FilterExtendinfo)
+_sym_db.RegisterMessage(highway_head.FilterStyle)
+_sym_db.RegisterMessage(highway_head.ImageFilterRequest)
+_sym_db.RegisterMessage(highway_head.ImageFilterResponse)
+_sym_db.RegisterMessage(highway_head.LoginSigHead)
+_sym_db.RegisterMessage(highway_head.NewServiceTicket)
+_sym_db.RegisterMessage(highway_head.PicInfoExt)
+_sym_db.RegisterMessage(highway_head.PicRspExtInfo)
+_sym_db.RegisterMessage(highway_head.QueryHoleRsp)
+_sym_db.RegisterMessage(highway_head.ReqDataHighwayHead)
+_sym_db.RegisterMessage(highway_head.RspBody)
+_sym_db.RegisterMessage(highway_head.RspDataHighwayHead)
+_sym_db.RegisterMessage(highway_head.SegHead)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _HIGHWAY_HEAD._serialized_start=23
+  _HIGHWAY_HEAD._serialized_end=2090
+  _HIGHWAY_HEAD_C2CCOMMONEXTENDINFO._serialized_start=39
+  _HIGHWAY_HEAD_C2CCOMMONEXTENDINFO._serialized_end=134
+  _HIGHWAY_HEAD_DATAHIGHWAYHEAD._serialized_start=137
+  _HIGHWAY_HEAD_DATAHIGHWAYHEAD._serialized_end=337
+  _HIGHWAY_HEAD_DATAHOLE._serialized_start=339
+  _HIGHWAY_HEAD_DATAHOLE._serialized_end=377
+  _HIGHWAY_HEAD_FILTEREXTENDINFO._serialized_start=379
+  _HIGHWAY_HEAD_FILTEREXTENDINFO._serialized_end=479
+  _HIGHWAY_HEAD_FILTERSTYLE._serialized_start=481
+  _HIGHWAY_HEAD_FILTERSTYLE._serialized_end=530
+  _HIGHWAY_HEAD_IMAGEFILTERREQUEST._serialized_start=533
+  _HIGHWAY_HEAD_IMAGEFILTERREQUEST._serialized_end=695
+  _HIGHWAY_HEAD_IMAGEFILTERRESPONSE._serialized_start=697
+  _HIGHWAY_HEAD_IMAGEFILTERRESPONSE._serialized_end=772
+  _HIGHWAY_HEAD_LOGINSIGHEAD._serialized_start=774
+  _HIGHWAY_HEAD_LOGINSIGHEAD._serialized_end=828
+  _HIGHWAY_HEAD_NEWSERVICETICKET._serialized_start=830
+  _HIGHWAY_HEAD_NEWSERVICETICKET._serialized_end=881
+  _HIGHWAY_HEAD_PICINFOEXT._serialized_start=884
+  _HIGHWAY_HEAD_PICINFOEXT._serialized_end=1134
+  _HIGHWAY_HEAD_PICRSPEXTINFO._serialized_start=1136
+  _HIGHWAY_HEAD_PICRSPEXTINFO._serialized_end=1220
+  _HIGHWAY_HEAD_QUERYHOLERSP._serialized_start=1222
+  _HIGHWAY_HEAD_QUERYHOLERSP._serialized_end=1312
+  _HIGHWAY_HEAD_REQDATAHIGHWAYHEAD._serialized_start=1315
+  _HIGHWAY_HEAD_REQDATAHIGHWAYHEAD._serialized_end=1516
+  _HIGHWAY_HEAD_RSPBODY._serialized_start=1518
+  _HIGHWAY_HEAD_RSPBODY._serialized_end=1577
+  _HIGHWAY_HEAD_RSPDATAHIGHWAYHEAD._serialized_start=1580
+  _HIGHWAY_HEAD_RSPDATAHIGHWAYHEAD._serialized_end=1837
+  _HIGHWAY_HEAD_SEGHEAD._serialized_start=1840
+  _HIGHWAY_HEAD_SEGHEAD._serialized_end=2090
+# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/highway/protocol/highway_head_pb2.pyi b/cai/pb/highway/protocol/highway_head_pb2.pyi
new file mode 100644
index 00000000..fa8e49aa
--- /dev/null
+++ b/cai/pb/highway/protocol/highway_head_pb2.pyi
@@ -0,0 +1,421 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+from builtins import (
+    bool,
+    bytes,
+    int,
+)
+
+from google.protobuf.descriptor import (
+    Descriptor,
+    FileDescriptor,
+)
+
+from google.protobuf.internal.containers import (
+    RepeatedCompositeFieldContainer,
+)
+
+from google.protobuf.message import (
+    Message,
+)
+
+from typing import (
+    Iterable,
+    Optional,
+)
+
+from typing_extensions import (
+    Literal,
+)
+
+
+DESCRIPTOR: FileDescriptor
+
+class highway_head(Message):
+    """origin name: CSDataHighwayHead"""
+    DESCRIPTOR: Descriptor
+    class C2CCommonExtendinfo(Message):
+        DESCRIPTOR: Descriptor
+        INFOID_FIELD_NUMBER: int
+        FILTEREXTENDINFO_FIELD_NUMBER: int
+        infoId: int
+        @property
+        def filterExtendinfo(self) -> highway_head.FilterExtendinfo: ...
+        def __init__(self,
+            *,
+            infoId: Optional[int] = ...,
+            filterExtendinfo: Optional[highway_head.FilterExtendinfo] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["filterExtendinfo",b"filterExtendinfo","infoId",b"infoId"]) -> bool: ...
+        def ClearField(self, field_name: Literal["filterExtendinfo",b"filterExtendinfo","infoId",b"infoId"]) -> None: ...
+
+    class DataHighwayHead(Message):
+        DESCRIPTOR: Descriptor
+        VERSION_FIELD_NUMBER: int
+        UIN_FIELD_NUMBER: int
+        COMMAND_FIELD_NUMBER: int
+        SEQ_FIELD_NUMBER: int
+        RETRYTIMES_FIELD_NUMBER: int
+        APPID_FIELD_NUMBER: int
+        DATAFLAG_FIELD_NUMBER: int
+        COMMANDID_FIELD_NUMBER: int
+        BUILDVER_FIELD_NUMBER: int
+        LOCALEID_FIELD_NUMBER: int
+        ENVID_FIELD_NUMBER: int
+        version: int
+        uin: bytes
+        command: bytes
+        seq: int
+        retryTimes: int
+        appid: int
+        dataflag: int
+        commandId: int
+        buildVer: bytes
+        localeId: int
+        envId: int
+        def __init__(self,
+            *,
+            version: Optional[int] = ...,
+            uin: Optional[bytes] = ...,
+            command: Optional[bytes] = ...,
+            seq: Optional[int] = ...,
+            retryTimes: Optional[int] = ...,
+            appid: Optional[int] = ...,
+            dataflag: Optional[int] = ...,
+            commandId: Optional[int] = ...,
+            buildVer: Optional[bytes] = ...,
+            localeId: Optional[int] = ...,
+            envId: Optional[int] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["appid",b"appid","buildVer",b"buildVer","command",b"command","commandId",b"commandId","dataflag",b"dataflag","envId",b"envId","localeId",b"localeId","retryTimes",b"retryTimes","seq",b"seq","uin",b"uin","version",b"version"]) -> bool: ...
+        def ClearField(self, field_name: Literal["appid",b"appid","buildVer",b"buildVer","command",b"command","commandId",b"commandId","dataflag",b"dataflag","envId",b"envId","localeId",b"localeId","retryTimes",b"retryTimes","seq",b"seq","uin",b"uin","version",b"version"]) -> None: ...
+
+    class DataHole(Message):
+        DESCRIPTOR: Descriptor
+        BEGIN_FIELD_NUMBER: int
+        END_FIELD_NUMBER: int
+        begin: int
+        end: int
+        def __init__(self,
+            *,
+            begin: Optional[int] = ...,
+            end: Optional[int] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["begin",b"begin","end",b"end"]) -> bool: ...
+        def ClearField(self, field_name: Literal["begin",b"begin","end",b"end"]) -> None: ...
+
+    class FilterExtendinfo(Message):
+        DESCRIPTOR: Descriptor
+        FILTERFLAG_FIELD_NUMBER: int
+        IMAGEFILTERREQUEST_FIELD_NUMBER: int
+        filterFlag: int
+        @property
+        def imageFilterRequest(self) -> highway_head.ImageFilterRequest: ...
+        def __init__(self,
+            *,
+            filterFlag: Optional[int] = ...,
+            imageFilterRequest: Optional[highway_head.ImageFilterRequest] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["filterFlag",b"filterFlag","imageFilterRequest",b"imageFilterRequest"]) -> bool: ...
+        def ClearField(self, field_name: Literal["filterFlag",b"filterFlag","imageFilterRequest",b"imageFilterRequest"]) -> None: ...
+
+    class FilterStyle(Message):
+        DESCRIPTOR: Descriptor
+        STYLEID_FIELD_NUMBER: int
+        STYLENAME_FIELD_NUMBER: int
+        styleId: int
+        styleName: bytes
+        def __init__(self,
+            *,
+            styleId: Optional[int] = ...,
+            styleName: Optional[bytes] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["styleId",b"styleId","styleName",b"styleName"]) -> bool: ...
+        def ClearField(self, field_name: Literal["styleId",b"styleId","styleName",b"styleName"]) -> None: ...
+
+    class ImageFilterRequest(Message):
+        DESCRIPTOR: Descriptor
+        SESSIONID_FIELD_NUMBER: int
+        CLIENTIP_FIELD_NUMBER: int
+        UIN_FIELD_NUMBER: int
+        STYLE_FIELD_NUMBER: int
+        WIDTH_FIELD_NUMBER: int
+        HEIGHT_FIELD_NUMBER: int
+        IMAGEDATA_FIELD_NUMBER: int
+        sessionId: bytes
+        clientIp: int
+        uin: int
+        @property
+        def style(self) -> highway_head.FilterStyle: ...
+        width: int
+        height: int
+        imageData: bytes
+        def __init__(self,
+            *,
+            sessionId: Optional[bytes] = ...,
+            clientIp: Optional[int] = ...,
+            uin: Optional[int] = ...,
+            style: Optional[highway_head.FilterStyle] = ...,
+            width: Optional[int] = ...,
+            height: Optional[int] = ...,
+            imageData: Optional[bytes] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["clientIp",b"clientIp","height",b"height","imageData",b"imageData","sessionId",b"sessionId","style",b"style","uin",b"uin","width",b"width"]) -> bool: ...
+        def ClearField(self, field_name: Literal["clientIp",b"clientIp","height",b"height","imageData",b"imageData","sessionId",b"sessionId","style",b"style","uin",b"uin","width",b"width"]) -> None: ...
+
+    class ImageFilterResponse(Message):
+        DESCRIPTOR: Descriptor
+        RETCODE_FIELD_NUMBER: int
+        IMAGEDATA_FIELD_NUMBER: int
+        COSTTIME_FIELD_NUMBER: int
+        retCode: int
+        imageData: bytes
+        costTime: int
+        def __init__(self,
+            *,
+            retCode: Optional[int] = ...,
+            imageData: Optional[bytes] = ...,
+            costTime: Optional[int] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["costTime",b"costTime","imageData",b"imageData","retCode",b"retCode"]) -> bool: ...
+        def ClearField(self, field_name: Literal["costTime",b"costTime","imageData",b"imageData","retCode",b"retCode"]) -> None: ...
+
+    class LoginSigHead(Message):
+        DESCRIPTOR: Descriptor
+        LOGINSIGTYPE_FIELD_NUMBER: int
+        LOGINSIG_FIELD_NUMBER: int
+        loginsigType: int
+        loginsig: bytes
+        def __init__(self,
+            *,
+            loginsigType: Optional[int] = ...,
+            loginsig: Optional[bytes] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["loginsig",b"loginsig","loginsigType",b"loginsigType"]) -> bool: ...
+        def ClearField(self, field_name: Literal["loginsig",b"loginsig","loginsigType",b"loginsigType"]) -> None: ...
+
+    class NewServiceTicket(Message):
+        DESCRIPTOR: Descriptor
+        SIGNATURE_FIELD_NUMBER: int
+        UKEY_FIELD_NUMBER: int
+        signature: bytes
+        ukey: bytes
+        def __init__(self,
+            *,
+            signature: Optional[bytes] = ...,
+            ukey: Optional[bytes] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["signature",b"signature","ukey",b"ukey"]) -> bool: ...
+        def ClearField(self, field_name: Literal["signature",b"signature","ukey",b"ukey"]) -> None: ...
+
+    class PicInfoExt(Message):
+        DESCRIPTOR: Descriptor
+        PICWIDTH_FIELD_NUMBER: int
+        PICHEIGHT_FIELD_NUMBER: int
+        PICFLAG_FIELD_NUMBER: int
+        BUSITYPE_FIELD_NUMBER: int
+        SRCTERM_FIELD_NUMBER: int
+        PLATTYPE_FIELD_NUMBER: int
+        NETTYPE_FIELD_NUMBER: int
+        IMGTYPE_FIELD_NUMBER: int
+        APPPICTYPE_FIELD_NUMBER: int
+        ECHOCREATEDBYSERVER_FIELD_NUMBER: int
+        QQMEETGUILDID_FIELD_NUMBER: int
+        QQMEETCHANNELID_FIELD_NUMBER: int
+        picWidth: int
+        picHeight: int
+        picFlag: int
+        busiType: int
+        srcTerm: int
+        platType: int
+        netType: int
+        imgType: int
+        appPicType: int
+        echoCreatedByServer: bytes
+        qqmeetGuildId: int
+        qqmeetChannelId: int
+        def __init__(self,
+            *,
+            picWidth: Optional[int] = ...,
+            picHeight: Optional[int] = ...,
+            picFlag: Optional[int] = ...,
+            busiType: Optional[int] = ...,
+            srcTerm: Optional[int] = ...,
+            platType: Optional[int] = ...,
+            netType: Optional[int] = ...,
+            imgType: Optional[int] = ...,
+            appPicType: Optional[int] = ...,
+            echoCreatedByServer: Optional[bytes] = ...,
+            qqmeetGuildId: Optional[int] = ...,
+            qqmeetChannelId: Optional[int] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["appPicType",b"appPicType","busiType",b"busiType","echoCreatedByServer",b"echoCreatedByServer","imgType",b"imgType","netType",b"netType","picFlag",b"picFlag","picHeight",b"picHeight","picWidth",b"picWidth","platType",b"platType","qqmeetChannelId",b"qqmeetChannelId","qqmeetGuildId",b"qqmeetGuildId","srcTerm",b"srcTerm"]) -> bool: ...
+        def ClearField(self, field_name: Literal["appPicType",b"appPicType","busiType",b"busiType","echoCreatedByServer",b"echoCreatedByServer","imgType",b"imgType","netType",b"netType","picFlag",b"picFlag","picHeight",b"picHeight","picWidth",b"picWidth","platType",b"platType","qqmeetChannelId",b"qqmeetChannelId","qqmeetGuildId",b"qqmeetGuildId","srcTerm",b"srcTerm"]) -> None: ...
+
+    class PicRspExtInfo(Message):
+        DESCRIPTOR: Descriptor
+        SKEY_FIELD_NUMBER: int
+        CLIENTIP_FIELD_NUMBER: int
+        UPOFFSET_FIELD_NUMBER: int
+        BLOCKSIZE_FIELD_NUMBER: int
+        skey: bytes
+        clientIp: int
+        upOffset: int
+        blockSize: int
+        def __init__(self,
+            *,
+            skey: Optional[bytes] = ...,
+            clientIp: Optional[int] = ...,
+            upOffset: Optional[int] = ...,
+            blockSize: Optional[int] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["blockSize",b"blockSize","clientIp",b"clientIp","skey",b"skey","upOffset",b"upOffset"]) -> bool: ...
+        def ClearField(self, field_name: Literal["blockSize",b"blockSize","clientIp",b"clientIp","skey",b"skey","upOffset",b"upOffset"]) -> None: ...
+
+    class QueryHoleRsp(Message):
+        DESCRIPTOR: Descriptor
+        RESULT_FIELD_NUMBER: int
+        DATAHOLE_FIELD_NUMBER: int
+        COMPFLAG_FIELD_NUMBER: int
+        result: int
+        @property
+        def dataHole(self) -> RepeatedCompositeFieldContainer[highway_head.DataHole]: ...
+        compFlag: bool
+        def __init__(self,
+            *,
+            result: Optional[int] = ...,
+            dataHole: Optional[Iterable[highway_head.DataHole]] = ...,
+            compFlag: Optional[bool] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["compFlag",b"compFlag","result",b"result"]) -> bool: ...
+        def ClearField(self, field_name: Literal["compFlag",b"compFlag","dataHole",b"dataHole","result",b"result"]) -> None: ...
+
+    class ReqDataHighwayHead(Message):
+        DESCRIPTOR: Descriptor
+        BASEHEAD_FIELD_NUMBER: int
+        SEGHEAD_FIELD_NUMBER: int
+        REQEXTENDINFO_FIELD_NUMBER: int
+        TIMESTAMP_FIELD_NUMBER: int
+        LOGINSIGHEAD_FIELD_NUMBER: int
+        @property
+        def basehead(self) -> highway_head.DataHighwayHead: ...
+        @property
+        def seghead(self) -> highway_head.SegHead: ...
+        reqExtendinfo: bytes
+        timestamp: int
+        @property
+        def loginSigHead(self) -> highway_head.LoginSigHead: ...
+        def __init__(self,
+            *,
+            basehead: Optional[highway_head.DataHighwayHead] = ...,
+            seghead: Optional[highway_head.SegHead] = ...,
+            reqExtendinfo: Optional[bytes] = ...,
+            timestamp: Optional[int] = ...,
+            loginSigHead: Optional[highway_head.LoginSigHead] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["basehead",b"basehead","loginSigHead",b"loginSigHead","reqExtendinfo",b"reqExtendinfo","seghead",b"seghead","timestamp",b"timestamp"]) -> bool: ...
+        def ClearField(self, field_name: Literal["basehead",b"basehead","loginSigHead",b"loginSigHead","reqExtendinfo",b"reqExtendinfo","seghead",b"seghead","timestamp",b"timestamp"]) -> None: ...
+
+    class RspBody(Message):
+        DESCRIPTOR: Descriptor
+        QUERYHOLERSP_FIELD_NUMBER: int
+        @property
+        def queryHoleRsp(self) -> highway_head.QueryHoleRsp: ...
+        def __init__(self,
+            *,
+            queryHoleRsp: Optional[highway_head.QueryHoleRsp] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["queryHoleRsp",b"queryHoleRsp"]) -> bool: ...
+        def ClearField(self, field_name: Literal["queryHoleRsp",b"queryHoleRsp"]) -> None: ...
+
+    class RspDataHighwayHead(Message):
+        DESCRIPTOR: Descriptor
+        BASEHEAD_FIELD_NUMBER: int
+        SEGHEAD_FIELD_NUMBER: int
+        ERRORCODE_FIELD_NUMBER: int
+        ALLOWRETRY_FIELD_NUMBER: int
+        CACHECOST_FIELD_NUMBER: int
+        HTCOST_FIELD_NUMBER: int
+        RSPEXTENDINFO_FIELD_NUMBER: int
+        TIMESTAMP_FIELD_NUMBER: int
+        RANGE_FIELD_NUMBER: int
+        ISRESET_FIELD_NUMBER: int
+        @property
+        def basehead(self) -> highway_head.DataHighwayHead: ...
+        @property
+        def seghead(self) -> highway_head.SegHead: ...
+        errorCode: int
+        allowRetry: int
+        cachecost: int
+        htcost: int
+        rspExtendinfo: bytes
+        timestamp: int
+        range: int
+        isReset: int
+        def __init__(self,
+            *,
+            basehead: Optional[highway_head.DataHighwayHead] = ...,
+            seghead: Optional[highway_head.SegHead] = ...,
+            errorCode: Optional[int] = ...,
+            allowRetry: Optional[int] = ...,
+            cachecost: Optional[int] = ...,
+            htcost: Optional[int] = ...,
+            rspExtendinfo: Optional[bytes] = ...,
+            timestamp: Optional[int] = ...,
+            range: Optional[int] = ...,
+            isReset: Optional[int] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["allowRetry",b"allowRetry","basehead",b"basehead","cachecost",b"cachecost","errorCode",b"errorCode","htcost",b"htcost","isReset",b"isReset","range",b"range","rspExtendinfo",b"rspExtendinfo","seghead",b"seghead","timestamp",b"timestamp"]) -> bool: ...
+        def ClearField(self, field_name: Literal["allowRetry",b"allowRetry","basehead",b"basehead","cachecost",b"cachecost","errorCode",b"errorCode","htcost",b"htcost","isReset",b"isReset","range",b"range","rspExtendinfo",b"rspExtendinfo","seghead",b"seghead","timestamp",b"timestamp"]) -> None: ...
+
+    class SegHead(Message):
+        DESCRIPTOR: Descriptor
+        SERVICEID_FIELD_NUMBER: int
+        FILESIZE_FIELD_NUMBER: int
+        DATAOFFSET_FIELD_NUMBER: int
+        DATALENGTH_FIELD_NUMBER: int
+        RTCODE_FIELD_NUMBER: int
+        SERVICETICKET_FIELD_NUMBER: int
+        FLAG_FIELD_NUMBER: int
+        MD5_FIELD_NUMBER: int
+        FILEMD5_FIELD_NUMBER: int
+        CACHEADDR_FIELD_NUMBER: int
+        QUERYTIMES_FIELD_NUMBER: int
+        UPDATECACHEIP_FIELD_NUMBER: int
+        CACHEPORT_FIELD_NUMBER: int
+        serviceid: int
+        filesize: int
+        dataoffset: int
+        datalength: int
+        rtcode: int
+        serviceticket: bytes
+        flag: int
+        md5: bytes
+        fileMd5: bytes
+        cacheAddr: int
+        queryTimes: int
+        updateCacheip: int
+        cachePort: int
+        def __init__(self,
+            *,
+            serviceid: Optional[int] = ...,
+            filesize: Optional[int] = ...,
+            dataoffset: Optional[int] = ...,
+            datalength: Optional[int] = ...,
+            rtcode: Optional[int] = ...,
+            serviceticket: Optional[bytes] = ...,
+            flag: Optional[int] = ...,
+            md5: Optional[bytes] = ...,
+            fileMd5: Optional[bytes] = ...,
+            cacheAddr: Optional[int] = ...,
+            queryTimes: Optional[int] = ...,
+            updateCacheip: Optional[int] = ...,
+            cachePort: Optional[int] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["cacheAddr",b"cacheAddr","cachePort",b"cachePort","datalength",b"datalength","dataoffset",b"dataoffset","fileMd5",b"fileMd5","filesize",b"filesize","flag",b"flag","md5",b"md5","queryTimes",b"queryTimes","rtcode",b"rtcode","serviceid",b"serviceid","serviceticket",b"serviceticket","updateCacheip",b"updateCacheip"]) -> bool: ...
+        def ClearField(self, field_name: Literal["cacheAddr",b"cacheAddr","cachePort",b"cachePort","datalength",b"datalength","dataoffset",b"dataoffset","fileMd5",b"fileMd5","filesize",b"filesize","flag",b"flag","md5",b"md5","queryTimes",b"queryTimes","rtcode",b"rtcode","serviceid",b"serviceid","serviceticket",b"serviceticket","updateCacheip",b"updateCacheip"]) -> None: ...
+
+    def __init__(self,
+        ) -> None: ...

From 9a824056282ee110a2da927b6c2b34f621920782 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 16:06:27 +0800
Subject: [PATCH 016/113] update: todo

---
 cai/api/client.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cai/api/client.py b/cai/api/client.py
index c5bc9291..2ab50a3c 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -51,7 +51,7 @@ def status(self) -> Optional[OnlineStatus]:
 
     async def send_group_msg(self, gid: int, msg: Sequence[Element]):
         seq = self.client.next_seq()
-
+        # todo: split long msg
         return await self.client.send_and_wait(
             seq,
             "MessageSvc.PbSendMsg",

From 28def19aee3fcc36afac4e60b1e457c2abb622ac Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 17:08:15 +0800
Subject: [PATCH 017/113] add: longmsg.proto

---
 cai/pb/highway/longmsg/__init__.py     |   0
 cai/pb/highway/longmsg/longmsg.proto   |  61 +++++++
 cai/pb/highway/longmsg/longmsg_pb2.py  |  95 ++++++++++
 cai/pb/highway/longmsg/longmsg_pb2.pyi | 230 +++++++++++++++++++++++++
 4 files changed, 386 insertions(+)
 create mode 100644 cai/pb/highway/longmsg/__init__.py
 create mode 100644 cai/pb/highway/longmsg/longmsg.proto
 create mode 100644 cai/pb/highway/longmsg/longmsg_pb2.py
 create mode 100644 cai/pb/highway/longmsg/longmsg_pb2.pyi

diff --git a/cai/pb/highway/longmsg/__init__.py b/cai/pb/highway/longmsg/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/cai/pb/highway/longmsg/longmsg.proto b/cai/pb/highway/longmsg/longmsg.proto
new file mode 100644
index 00000000..6a6de669
--- /dev/null
+++ b/cai/pb/highway/longmsg/longmsg.proto
@@ -0,0 +1,61 @@
+syntax = "proto3";
+
+option go_package = "github.com/Mrs4s/MiraiGo/client/pb/multimsg";
+
+message ExternMsg {
+  int32 channelType = 1;
+}
+message MultiMsgApplyDownReq {
+  bytes msgResid = 1;
+  int32 msgType = 2;
+  int64 srcUin = 3;
+}
+message MultiMsgApplyDownRsp {
+  int32 result = 1;
+  bytes thumbDownPara = 2;
+  bytes msgKey = 3;
+  repeated int32 uint32DownIp = 4;
+  repeated int32 uint32DownPort = 5;
+  bytes msgResid = 6;
+  ExternMsg msgExternInfo = 7;
+  repeated bytes bytesDownIpV6 = 8;
+  repeated int32 uint32DownV6Port = 9;
+}
+message MultiMsgApplyUpReq {
+  int64 dstUin = 1;
+  int64 msgSize = 2;
+  bytes msgMd5 = 3;
+  int32 msgType = 4;
+  int32 applyId = 5;
+}
+message MultiMsgApplyUpRsp {
+  int32 result = 1;
+  string msgResid = 2;
+  bytes msgUkey = 3;
+  repeated int32 uint32UpIp = 4;
+  repeated int32 uint32UpPort = 5;
+  int64 blockSize = 6;
+  int64 upOffset = 7;
+  int32 applyId = 8;
+  bytes msgKey = 9;
+  bytes msgSig = 10;
+  ExternMsg msgExternInfo = 11;
+  repeated bytes bytesUpIpV6 = 12;
+  repeated int32 uint32UpV6Port = 13;
+}
+message MultiReqBody {
+  int32 subcmd = 1;
+  int32 termType = 2;
+  int32 platformType = 3;
+  int32 netType = 4;
+  string buildVer = 5;
+  repeated MultiMsgApplyUpReq multimsgApplyupReq = 6;
+  repeated MultiMsgApplyDownReq multimsgApplydownReq = 7;
+  int32 buType = 8;
+  int32 reqChannelType = 9;
+}
+message MultiRspBody {
+  int32 subcmd = 1;
+  repeated MultiMsgApplyUpRsp multimsgApplyupRsp = 2;
+  repeated MultiMsgApplyDownRsp multimsgApplydownRsp = 3;
+}
diff --git a/cai/pb/highway/longmsg/longmsg_pb2.py b/cai/pb/highway/longmsg/longmsg_pb2.py
new file mode 100644
index 00000000..e3f37fc5
--- /dev/null
+++ b/cai/pb/highway/longmsg/longmsg_pb2.py
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: longmsg.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rlongmsg.proto\" \n\tExternMsg\x12\x13\n\x0b\x63hannelType\x18\x01 \x01(\x05\"I\n\x14MultiMsgApplyDownReq\x12\x10\n\x08msgResid\x18\x01 \x01(\x0c\x12\x0f\n\x07msgType\x18\x02 \x01(\x05\x12\x0e\n\x06srcUin\x18\x03 \x01(\x03\"\xe1\x01\n\x14MultiMsgApplyDownRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x15\n\rthumbDownPara\x18\x02 \x01(\x0c\x12\x0e\n\x06msgKey\x18\x03 \x01(\x0c\x12\x14\n\x0cuint32DownIp\x18\x04 \x03(\x05\x12\x16\n\x0euint32DownPort\x18\x05 \x03(\x05\x12\x10\n\x08msgResid\x18\x06 \x01(\x0c\x12!\n\rmsgExternInfo\x18\x07 \x01(\x0b\x32\n.ExternMsg\x12\x15\n\rbytesDownIpV6\x18\x08 \x03(\x0c\x12\x18\n\x10uint32DownV6Port\x18\t \x03(\x05\"g\n\x12MultiMsgApplyUpReq\x12\x0e\n\x06\x64stUin\x18\x01 \x01(\x03\x12\x0f\n\x07msgSize\x18\x02 \x01(\x03\x12\x0e\n\x06msgMd5\x18\x03 \x01(\x0c\x12\x0f\n\x07msgType\x18\x04 \x01(\x05\x12\x0f\n\x07\x61pplyId\x18\x05 \x01(\x05\"\x97\x02\n\x12MultiMsgApplyUpRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\t\x12\x0f\n\x07msgUkey\x18\x03 \x01(\x0c\x12\x12\n\nuint32UpIp\x18\x04 \x03(\x05\x12\x14\n\x0cuint32UpPort\x18\x05 \x03(\x05\x12\x11\n\tblockSize\x18\x06 \x01(\x03\x12\x10\n\x08upOffset\x18\x07 \x01(\x03\x12\x0f\n\x07\x61pplyId\x18\x08 \x01(\x05\x12\x0e\n\x06msgKey\x18\t \x01(\x0c\x12\x0e\n\x06msgSig\x18\n \x01(\x0c\x12!\n\rmsgExternInfo\x18\x0b \x01(\x0b\x32\n.ExternMsg\x12\x13\n\x0b\x62ytesUpIpV6\x18\x0c \x03(\x0c\x12\x16\n\x0euint32UpV6Port\x18\r \x03(\x05\"\xf7\x01\n\x0cMultiReqBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12\x10\n\x08termType\x18\x02 \x01(\x05\x12\x14\n\x0cplatformType\x18\x03 \x01(\x05\x12\x0f\n\x07netType\x18\x04 \x01(\x05\x12\x10\n\x08\x62uildVer\x18\x05 \x01(\t\x12/\n\x12multimsgApplyupReq\x18\x06 \x03(\x0b\x32\x13.MultiMsgApplyUpReq\x12\x33\n\x14multimsgApplydownReq\x18\x07 \x03(\x0b\x32\x15.MultiMsgApplyDownReq\x12\x0e\n\x06\x62uType\x18\x08 \x01(\x05\x12\x16\n\x0ereqChannelType\x18\t \x01(\x05\"\x84\x01\n\x0cMultiRspBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12/\n\x12multimsgApplyupRsp\x18\x02 \x03(\x0b\x32\x13.MultiMsgApplyUpRsp\x12\x33\n\x14multimsgApplydownRsp\x18\x03 \x03(\x0b\x32\x15.MultiMsgApplyDownRspB-Z+github.com/Mrs4s/MiraiGo/client/pb/multimsgb\x06proto3')
+
+
+
+_EXTERNMSG = DESCRIPTOR.message_types_by_name['ExternMsg']
+_MULTIMSGAPPLYDOWNREQ = DESCRIPTOR.message_types_by_name['MultiMsgApplyDownReq']
+_MULTIMSGAPPLYDOWNRSP = DESCRIPTOR.message_types_by_name['MultiMsgApplyDownRsp']
+_MULTIMSGAPPLYUPREQ = DESCRIPTOR.message_types_by_name['MultiMsgApplyUpReq']
+_MULTIMSGAPPLYUPRSP = DESCRIPTOR.message_types_by_name['MultiMsgApplyUpRsp']
+_MULTIREQBODY = DESCRIPTOR.message_types_by_name['MultiReqBody']
+_MULTIRSPBODY = DESCRIPTOR.message_types_by_name['MultiRspBody']
+ExternMsg = _reflection.GeneratedProtocolMessageType('ExternMsg', (_message.Message,), {
+  'DESCRIPTOR' : _EXTERNMSG,
+  '__module__' : 'longmsg_pb2'
+  # @@protoc_insertion_point(class_scope:ExternMsg)
+  })
+_sym_db.RegisterMessage(ExternMsg)
+
+MultiMsgApplyDownReq = _reflection.GeneratedProtocolMessageType('MultiMsgApplyDownReq', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIMSGAPPLYDOWNREQ,
+  '__module__' : 'longmsg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiMsgApplyDownReq)
+  })
+_sym_db.RegisterMessage(MultiMsgApplyDownReq)
+
+MultiMsgApplyDownRsp = _reflection.GeneratedProtocolMessageType('MultiMsgApplyDownRsp', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIMSGAPPLYDOWNRSP,
+  '__module__' : 'longmsg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiMsgApplyDownRsp)
+  })
+_sym_db.RegisterMessage(MultiMsgApplyDownRsp)
+
+MultiMsgApplyUpReq = _reflection.GeneratedProtocolMessageType('MultiMsgApplyUpReq', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIMSGAPPLYUPREQ,
+  '__module__' : 'longmsg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiMsgApplyUpReq)
+  })
+_sym_db.RegisterMessage(MultiMsgApplyUpReq)
+
+MultiMsgApplyUpRsp = _reflection.GeneratedProtocolMessageType('MultiMsgApplyUpRsp', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIMSGAPPLYUPRSP,
+  '__module__' : 'longmsg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiMsgApplyUpRsp)
+  })
+_sym_db.RegisterMessage(MultiMsgApplyUpRsp)
+
+MultiReqBody = _reflection.GeneratedProtocolMessageType('MultiReqBody', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIREQBODY,
+  '__module__' : 'longmsg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiReqBody)
+  })
+_sym_db.RegisterMessage(MultiReqBody)
+
+MultiRspBody = _reflection.GeneratedProtocolMessageType('MultiRspBody', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIRSPBODY,
+  '__module__' : 'longmsg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiRspBody)
+  })
+_sym_db.RegisterMessage(MultiRspBody)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z+github.com/Mrs4s/MiraiGo/client/pb/multimsg'
+  _EXTERNMSG._serialized_start=17
+  _EXTERNMSG._serialized_end=49
+  _MULTIMSGAPPLYDOWNREQ._serialized_start=51
+  _MULTIMSGAPPLYDOWNREQ._serialized_end=124
+  _MULTIMSGAPPLYDOWNRSP._serialized_start=127
+  _MULTIMSGAPPLYDOWNRSP._serialized_end=352
+  _MULTIMSGAPPLYUPREQ._serialized_start=354
+  _MULTIMSGAPPLYUPREQ._serialized_end=457
+  _MULTIMSGAPPLYUPRSP._serialized_start=460
+  _MULTIMSGAPPLYUPRSP._serialized_end=739
+  _MULTIREQBODY._serialized_start=742
+  _MULTIREQBODY._serialized_end=989
+  _MULTIRSPBODY._serialized_start=992
+  _MULTIRSPBODY._serialized_end=1124
+# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/highway/longmsg/longmsg_pb2.pyi b/cai/pb/highway/longmsg/longmsg_pb2.pyi
new file mode 100644
index 00000000..4bdb72de
--- /dev/null
+++ b/cai/pb/highway/longmsg/longmsg_pb2.pyi
@@ -0,0 +1,230 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+from builtins import (
+    bool,
+    bytes,
+    int,
+)
+
+from google.protobuf.descriptor import (
+    Descriptor,
+    FileDescriptor,
+)
+
+from google.protobuf.internal.containers import (
+    RepeatedCompositeFieldContainer,
+    RepeatedScalarFieldContainer,
+)
+
+from google.protobuf.message import (
+    Message,
+)
+
+from typing import (
+    Iterable,
+    Optional,
+    Text,
+)
+
+from typing_extensions import (
+    Literal,
+)
+
+
+DESCRIPTOR: FileDescriptor
+
+class ExternMsg(Message):
+    DESCRIPTOR: Descriptor
+    CHANNELTYPE_FIELD_NUMBER: int
+    channelType: int
+    def __init__(self,
+        *,
+        channelType: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["channelType",b"channelType"]) -> None: ...
+
+class MultiMsgApplyDownReq(Message):
+    DESCRIPTOR: Descriptor
+    MSGRESID_FIELD_NUMBER: int
+    MSGTYPE_FIELD_NUMBER: int
+    SRCUIN_FIELD_NUMBER: int
+    msgResid: bytes
+    msgType: int
+    srcUin: int
+    def __init__(self,
+        *,
+        msgResid: bytes = ...,
+        msgType: int = ...,
+        srcUin: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["msgResid",b"msgResid","msgType",b"msgType","srcUin",b"srcUin"]) -> None: ...
+
+class MultiMsgApplyDownRsp(Message):
+    DESCRIPTOR: Descriptor
+    RESULT_FIELD_NUMBER: int
+    THUMBDOWNPARA_FIELD_NUMBER: int
+    MSGKEY_FIELD_NUMBER: int
+    UINT32DOWNIP_FIELD_NUMBER: int
+    UINT32DOWNPORT_FIELD_NUMBER: int
+    MSGRESID_FIELD_NUMBER: int
+    MSGEXTERNINFO_FIELD_NUMBER: int
+    BYTESDOWNIPV6_FIELD_NUMBER: int
+    UINT32DOWNV6PORT_FIELD_NUMBER: int
+    result: int
+    thumbDownPara: bytes
+    msgKey: bytes
+    @property
+    def uint32DownIp(self) -> RepeatedScalarFieldContainer[int]: ...
+    @property
+    def uint32DownPort(self) -> RepeatedScalarFieldContainer[int]: ...
+    msgResid: bytes
+    @property
+    def msgExternInfo(self) -> ExternMsg: ...
+    @property
+    def bytesDownIpV6(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    @property
+    def uint32DownV6Port(self) -> RepeatedScalarFieldContainer[int]: ...
+    def __init__(self,
+        *,
+        result: int = ...,
+        thumbDownPara: bytes = ...,
+        msgKey: bytes = ...,
+        uint32DownIp: Optional[Iterable[int]] = ...,
+        uint32DownPort: Optional[Iterable[int]] = ...,
+        msgResid: bytes = ...,
+        msgExternInfo: Optional[ExternMsg] = ...,
+        bytesDownIpV6: Optional[Iterable[bytes]] = ...,
+        uint32DownV6Port: Optional[Iterable[int]] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["msgExternInfo",b"msgExternInfo"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bytesDownIpV6",b"bytesDownIpV6","msgExternInfo",b"msgExternInfo","msgKey",b"msgKey","msgResid",b"msgResid","result",b"result","thumbDownPara",b"thumbDownPara","uint32DownIp",b"uint32DownIp","uint32DownPort",b"uint32DownPort","uint32DownV6Port",b"uint32DownV6Port"]) -> None: ...
+
+class MultiMsgApplyUpReq(Message):
+    DESCRIPTOR: Descriptor
+    DSTUIN_FIELD_NUMBER: int
+    MSGSIZE_FIELD_NUMBER: int
+    MSGMD5_FIELD_NUMBER: int
+    MSGTYPE_FIELD_NUMBER: int
+    APPLYID_FIELD_NUMBER: int
+    dstUin: int
+    msgSize: int
+    msgMd5: bytes
+    msgType: int
+    applyId: int
+    def __init__(self,
+        *,
+        dstUin: int = ...,
+        msgSize: int = ...,
+        msgMd5: bytes = ...,
+        msgType: int = ...,
+        applyId: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["applyId",b"applyId","dstUin",b"dstUin","msgMd5",b"msgMd5","msgSize",b"msgSize","msgType",b"msgType"]) -> None: ...
+
+class MultiMsgApplyUpRsp(Message):
+    DESCRIPTOR: Descriptor
+    RESULT_FIELD_NUMBER: int
+    MSGRESID_FIELD_NUMBER: int
+    MSGUKEY_FIELD_NUMBER: int
+    UINT32UPIP_FIELD_NUMBER: int
+    UINT32UPPORT_FIELD_NUMBER: int
+    BLOCKSIZE_FIELD_NUMBER: int
+    UPOFFSET_FIELD_NUMBER: int
+    APPLYID_FIELD_NUMBER: int
+    MSGKEY_FIELD_NUMBER: int
+    MSGSIG_FIELD_NUMBER: int
+    MSGEXTERNINFO_FIELD_NUMBER: int
+    BYTESUPIPV6_FIELD_NUMBER: int
+    UINT32UPV6PORT_FIELD_NUMBER: int
+    result: int
+    msgResid: Text
+    msgUkey: bytes
+    @property
+    def uint32UpIp(self) -> RepeatedScalarFieldContainer[int]: ...
+    @property
+    def uint32UpPort(self) -> RepeatedScalarFieldContainer[int]: ...
+    blockSize: int
+    upOffset: int
+    applyId: int
+    msgKey: bytes
+    msgSig: bytes
+    @property
+    def msgExternInfo(self) -> ExternMsg: ...
+    @property
+    def bytesUpIpV6(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    @property
+    def uint32UpV6Port(self) -> RepeatedScalarFieldContainer[int]: ...
+    def __init__(self,
+        *,
+        result: int = ...,
+        msgResid: Text = ...,
+        msgUkey: bytes = ...,
+        uint32UpIp: Optional[Iterable[int]] = ...,
+        uint32UpPort: Optional[Iterable[int]] = ...,
+        blockSize: int = ...,
+        upOffset: int = ...,
+        applyId: int = ...,
+        msgKey: bytes = ...,
+        msgSig: bytes = ...,
+        msgExternInfo: Optional[ExternMsg] = ...,
+        bytesUpIpV6: Optional[Iterable[bytes]] = ...,
+        uint32UpV6Port: Optional[Iterable[int]] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["msgExternInfo",b"msgExternInfo"]) -> bool: ...
+    def ClearField(self, field_name: Literal["applyId",b"applyId","blockSize",b"blockSize","bytesUpIpV6",b"bytesUpIpV6","msgExternInfo",b"msgExternInfo","msgKey",b"msgKey","msgResid",b"msgResid","msgSig",b"msgSig","msgUkey",b"msgUkey","result",b"result","uint32UpIp",b"uint32UpIp","uint32UpPort",b"uint32UpPort","uint32UpV6Port",b"uint32UpV6Port","upOffset",b"upOffset"]) -> None: ...
+
+class MultiReqBody(Message):
+    DESCRIPTOR: Descriptor
+    SUBCMD_FIELD_NUMBER: int
+    TERMTYPE_FIELD_NUMBER: int
+    PLATFORMTYPE_FIELD_NUMBER: int
+    NETTYPE_FIELD_NUMBER: int
+    BUILDVER_FIELD_NUMBER: int
+    MULTIMSGAPPLYUPREQ_FIELD_NUMBER: int
+    MULTIMSGAPPLYDOWNREQ_FIELD_NUMBER: int
+    BUTYPE_FIELD_NUMBER: int
+    REQCHANNELTYPE_FIELD_NUMBER: int
+    subcmd: int
+    termType: int
+    platformType: int
+    netType: int
+    buildVer: Text
+    @property
+    def multimsgApplyupReq(self) -> RepeatedCompositeFieldContainer[MultiMsgApplyUpReq]: ...
+    @property
+    def multimsgApplydownReq(self) -> RepeatedCompositeFieldContainer[MultiMsgApplyDownReq]: ...
+    buType: int
+    reqChannelType: int
+    def __init__(self,
+        *,
+        subcmd: int = ...,
+        termType: int = ...,
+        platformType: int = ...,
+        netType: int = ...,
+        buildVer: Text = ...,
+        multimsgApplyupReq: Optional[Iterable[MultiMsgApplyUpReq]] = ...,
+        multimsgApplydownReq: Optional[Iterable[MultiMsgApplyDownReq]] = ...,
+        buType: int = ...,
+        reqChannelType: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["buType",b"buType","buildVer",b"buildVer","multimsgApplydownReq",b"multimsgApplydownReq","multimsgApplyupReq",b"multimsgApplyupReq","netType",b"netType","platformType",b"platformType","reqChannelType",b"reqChannelType","subcmd",b"subcmd","termType",b"termType"]) -> None: ...
+
+class MultiRspBody(Message):
+    DESCRIPTOR: Descriptor
+    SUBCMD_FIELD_NUMBER: int
+    MULTIMSGAPPLYUPRSP_FIELD_NUMBER: int
+    MULTIMSGAPPLYDOWNRSP_FIELD_NUMBER: int
+    subcmd: int
+    @property
+    def multimsgApplyupRsp(self) -> RepeatedCompositeFieldContainer[MultiMsgApplyUpRsp]: ...
+    @property
+    def multimsgApplydownRsp(self) -> RepeatedCompositeFieldContainer[MultiMsgApplyDownRsp]: ...
+    def __init__(self,
+        *,
+        subcmd: int = ...,
+        multimsgApplyupRsp: Optional[Iterable[MultiMsgApplyUpRsp]] = ...,
+        multimsgApplydownRsp: Optional[Iterable[MultiMsgApplyDownRsp]] = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["multimsgApplydownRsp",b"multimsgApplydownRsp","multimsgApplyupRsp",b"multimsgApplyupRsp","subcmd",b"subcmd"]) -> None: ...

From a98a1445a9d88768e2109134a19eed8ea4f632c7 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 17:43:26 +0800
Subject: [PATCH 018/113] add: Client.send_unipkg_and_wait & optimized code

---
 cai/api/client.py                      |  6 +++---
 cai/client/message_service/encoders.py | 16 +++++++---------
 cai/client/multi_msg/__init__.py       |  0
 3 files changed, 10 insertions(+), 12 deletions(-)
 create mode 100644 cai/client/multi_msg/__init__.py

diff --git a/cai/api/client.py b/cai/api/client.py
index 2ab50a3c..af0f4831 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -52,12 +52,12 @@ def status(self) -> Optional[OnlineStatus]:
     async def send_group_msg(self, gid: int, msg: Sequence[Element]):
         seq = self.client.next_seq()
         # todo: split long msg
-        return await self.client.send_and_wait(
+        return await self.client.send_unipkg_and_wait(
             seq,
             "MessageSvc.PbSendMsg",
             make_group_msg_pkg(
-                seq, gid, self.client, build_msg(msg)
-            )
+                seq, gid, build_msg(msg)
+            ).SerializeToString()
         )
 
     async def close(self):
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index 07c3b4ba..d65efc86 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -7,7 +7,7 @@
 from cai.client.packet import UniPacket
 
 from . import models
-
+from ...pb.msf.msg.svc import PbSendMsgReq
 
 if TYPE_CHECKING:
     from cai.client.client import Client
@@ -33,21 +33,19 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
 
 
 def encode_send_group_msg_req(
-    seq: int, session_id: bytes, uin: int, group: int, body: MsgBody, head: ContentHead, d2key: bytes
-):
-    return UniPacket.build(uin, seq, "MessageSvc.PbSendMsg", session_id, 1, PbSendMsgReq(
+    seq: int, group: int, body: MsgBody, head: ContentHead
+) -> PbSendMsgReq:
+    return PbSendMsgReq(
         routing_head=RoutingHead(grp=Grp(group_code=group)),
         content_head=head,
         body=body,
         seq=seq,
         rand=random.randrange(3000, 30000),
         via=0
-    ).SerializeToString(), d2key)
+    )
 
 
-def make_group_msg_pkg(seq: int, gid: int, client: "Client", body: MsgBody) -> UniPacket:
+def make_group_msg_pkg(seq: int, gid: int, body: MsgBody) -> PbSendMsgReq:
     return encode_send_group_msg_req(
-        seq, client._session_id, client.uin,
-        gid, body, ContentHead(pkg_num=1, pkg_index=0, div_seq=0),
-        client._siginfo.d2key
+        seq, gid, body, ContentHead(pkg_num=1, pkg_index=0, div_seq=0)
     )
diff --git a/cai/client/multi_msg/__init__.py b/cai/client/multi_msg/__init__.py
new file mode 100644
index 00000000..e69de29b

From ff083daeee7d4301198b9bf54d2ecd9f63b8a487 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 17:44:04 +0800
Subject: [PATCH 019/113] add: multi_apply_up_pkg handle

---
 cai/client/client.py                  | 13 +++++-
 cai/client/highway.py                 | 64 +++++++++++++++++++++++++++
 cai/client/multi_msg/long_msg.py      | 41 +++++++++++++++++
 cai/pb/highway/longmsg/longmsg.proto  |  2 +-
 cai/pb/highway/longmsg/longmsg_pb2.py |  2 +-
 5 files changed, 119 insertions(+), 3 deletions(-)
 create mode 100644 cai/client/highway.py
 create mode 100644 cai/client/multi_msg/long_msg.py

diff --git a/cai/client/client.py b/cai/client/client.py
index 5af25328..47590200 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -48,7 +48,8 @@
 )
 
 from .event import Event
-from .packet import IncomingPacket
+from .multi_msg.long_msg import handle_multi_apply_up_resp
+from .packet import IncomingPacket, UniPacket
 from .command import Command, _packet_to_command
 from .sso_server import SsoServer, get_sso_server
 from .online_push import handle_c2c_sync, handle_push_msg
@@ -132,6 +133,9 @@
     "OnlinePush.PbC2CMsgSync": handle_c2c_sync,
     "OnlinePush.PbPushC2CMsg": handle_push_msg,
     # "OnlinePush.PbPushBindUinGroupMsg": handle_push_msg,  # sub account
+
+    # new
+    "MultiMsg.ApplyUp": handle_multi_apply_up_resp
 }
 
 
@@ -385,6 +389,13 @@ async def send_and_wait(
         await self.send(seq, command_name, packet)
         return await self._receive_store.fetch(seq, timeout)
 
+    async def send_unipkg_and_wait(self, seq: int, command_name: str, enc_packet: bytes, timeout=10.0):
+        await self.send_and_wait(
+            seq, command_name,
+            UniPacket.build(self.uin, seq, command_name, self._session_id, 1, enc_packet, self._siginfo.d2key),
+            timeout
+        )
+
     async def _handle_incoming_packet(self, in_packet: IncomingPacket) -> None:
         try:
             handler = HANDLERS.get(in_packet.command_name, _packet_to_command)
diff --git a/cai/client/highway.py b/cai/client/highway.py
new file mode 100644
index 00000000..d1bb18ea
--- /dev/null
+++ b/cai/client/highway.py
@@ -0,0 +1,64 @@
+import asyncio
+from hashlib import md5
+from typing import Tuple, BinaryIO, TYPE_CHECKING
+
+from cai.pb.highway.protocol.highway_head_pb2 import highway_head
+
+if TYPE_CHECKING:
+    from cai.client.client import Client
+
+# https://github.com/Mrs4s/MiraiGo/blob/master/client/internal/highway/highway.go#L79
+
+
+def calc_file_md5(file: BinaryIO, bs=4096) -> str:
+    try:
+        fm = md5()
+        while True:
+            bl = file.read(bs)
+            fm.update(bl)
+            if len(bl) != bs:
+                break
+        return fm.hexdigest()
+    finally:
+        file.seek(0)
+
+
+def create_highway_header(
+    cmd: bytes,
+    flag: int,
+    cmd_id: int,
+    client: "Client",
+    locale=2052
+) -> highway_head.DataHighwayHead:
+    return highway_head.DataHighwayHead(
+        version=1,
+        uin=bytes(str(client.uin)),
+        command=cmd,
+        commandId=cmd_id,
+        seq=client.next_seq(),
+        appid=client.apk_info.app_id,
+        localeId=locale,
+        dataflag=flag
+    )
+
+
+async def upload_file(addr: Tuple[str, int], file: BinaryIO, cmd_id: int, client: Client, *, block_size=65535):
+    fmd5, fl = calc_file_md5(file), len(file.read())
+    file.seek(0)
+    reader, writer = await asyncio.open_connection(*addr)
+    bc = 0
+    while True:
+        bl = file.read(block_size)
+        if not bl:
+            break
+        highway_head.ReqDataHighwayHead(
+            basehead=create_highway_header(b"PicUp.DataUp", 4096, cmd_id, client),
+            seghead=highway_head.SegHead(
+                filesize=fl,
+                dataoffset=bc * block_size,
+                datalength=len(bl),
+                serviceticket=None,  #todo: https://github.com/Mrs4s/MiraiGo/blob/38990f6e1cf9ca0785709d03b66237a713338d0b/client/group_msg.go#L216
+
+            )
+        )
+        bc += 1
diff --git a/cai/client/multi_msg/long_msg.py b/cai/client/multi_msg/long_msg.py
new file mode 100644
index 00000000..57df3113
--- /dev/null
+++ b/cai/client/multi_msg/long_msg.py
@@ -0,0 +1,41 @@
+from cai.client import Command
+from cai.pb.highway.longmsg.longmsg_pb2 import MultiReqBody, MultiMsgApplyUpReq, MultiMsgApplyUpRsp
+from typing import TYPE_CHECKING
+
+from dataclasses import dataclass
+
+if TYPE_CHECKING:
+    from cai.client.packet import IncomingPacket
+    from cai.client.client import Client
+
+
+def encode_multi_apply_up_pkg(group_id: int, data_len: int, data_md5: bytes, bu_type: int) -> bytes:
+    return MultiReqBody(
+        subcmd=1,
+        termType=5,
+        platformType=9,
+        netType=3,
+        buildVer="8.2.0.1297",  # modify
+        multimsgApplyupReq=[MultiMsgApplyUpReq(
+            dstUin=group_id,
+            msgSize=data_len,
+            msgMd5=data_md5,
+            msgType=3
+        )],
+        buType=bu_type
+    ).SerializeToString()
+
+
+@dataclass
+class MultiApplyUpResp(Command):
+    data: MultiMsgApplyUpRsp
+
+
+async def handle_multi_apply_up_resp(client: "Client", pkg: "IncomingPacket", _device):
+    return MultiApplyUpResp(
+        uin=pkg.uin,
+        seq=pkg.seq,
+        ret_code=pkg.ret_code,
+        command_name=pkg.command_name,
+        data=MultiMsgApplyUpRsp.FromString(pkg.data)
+    )
diff --git a/cai/pb/highway/longmsg/longmsg.proto b/cai/pb/highway/longmsg/longmsg.proto
index 6a6de669..b40e4b9f 100644
--- a/cai/pb/highway/longmsg/longmsg.proto
+++ b/cai/pb/highway/longmsg/longmsg.proto
@@ -1,6 +1,6 @@
 syntax = "proto3";
 
-option go_package = "github.com/Mrs4s/MiraiGo/client/pb/multimsg";
+option go_package = "github.com/Mrs4s/MiraiGo/client/pb/multi_msg";
 
 message ExternMsg {
   int32 channelType = 1;
diff --git a/cai/pb/highway/longmsg/longmsg_pb2.py b/cai/pb/highway/longmsg/longmsg_pb2.py
index e3f37fc5..e8b3a316 100644
--- a/cai/pb/highway/longmsg/longmsg_pb2.py
+++ b/cai/pb/highway/longmsg/longmsg_pb2.py
@@ -77,7 +77,7 @@
 if _descriptor._USE_C_DESCRIPTORS == False:
 
   DESCRIPTOR._options = None
-  DESCRIPTOR._serialized_options = b'Z+github.com/Mrs4s/MiraiGo/client/pb/multimsg'
+  DESCRIPTOR._serialized_options = b'Z+github.com/Mrs4s/MiraiGo/client/pb/multi_msg'
   _EXTERNMSG._serialized_start=17
   _EXTERNMSG._serialized_end=49
   _MULTIMSGAPPLYDOWNREQ._serialized_start=51

From aa06c4ef1c6d0364cb31fec6a24407d3a5dfe3b9 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 18:10:20 +0800
Subject: [PATCH 020/113] add: GroupIdConverter

---
 cai/utils/gcode.py | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
 create mode 100644 cai/utils/gcode.py

diff --git a/cai/utils/gcode.py b/cai/utils/gcode.py
new file mode 100644
index 00000000..688d9a92
--- /dev/null
+++ b/cai/utils/gcode.py
@@ -0,0 +1,38 @@
+class GroupIdConvertor:
+    @staticmethod
+    def to_group_code(group_id: int) -> int:
+        left = group_id / 1000000
+        if 0 + 202 <= left <= 10 + 202:
+            left -= 202
+        elif 11 + 480 - 11 <= left <= 19 + 480 - 11:
+            left -= 480 - 11
+        elif 20 + 2100 - 20 <= left <= 66 + 2100 - 20:
+            left -= 2100 - 20
+        elif 67 + 2010 - 67 <= left <= 156 + 2010 - 67:
+            left -= 2010 - 67
+        elif 157 + 2147 - 157 <= left <= 209 + 2147 - 157:
+            left -= 2147 - 157
+        elif 210 + 4100 - 210 <= left <= 309 + 4100 - 210:
+            left -= 4100 - 210
+        elif 310 + 3800 - 310 <= left <= 499 + 3800 - 310:
+            left -= 3800 - 310
+        return int(left * 1000000 + group_id % 1000000)
+
+    @staticmethod
+    def to_group_uin(group_code: int) -> int:
+        left = group_code / 1000000
+        if 0 <= left <= 10:
+            left += 202
+        elif 11 <= left <= 19:
+            left += 480 - 11
+        elif 20 <= left <= 66:
+            left += 2100 - 20
+        elif 67 <= left <= 156:
+            left += 2010 - 67
+        elif 157 <= left <= 209:
+            left += 2147 - 157
+        elif 210 <= left <= 309:
+            left += 4100 - 210
+        elif 310 <= left <= 499:
+            left += 3800 - 310
+        return int(left * 1000000 + group_code % 1000000)

From b7b376834d10be8aaa813f8ae03b469de70c4e06 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 20 Mar 2022 18:10:36 +0800
Subject: [PATCH 021/113] fix: some bugs

---
 cai/client/client.py             |  4 ++--
 cai/client/multi_msg/long_msg.py | 30 ++++++++++++++++++++++--------
 2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 47590200..572beeb1 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -48,7 +48,7 @@
 )
 
 from .event import Event
-from .multi_msg.long_msg import handle_multi_apply_up_resp
+from .multi_msg.long_msg import handle_multi_resp_body
 from .packet import IncomingPacket, UniPacket
 from .command import Command, _packet_to_command
 from .sso_server import SsoServer, get_sso_server
@@ -135,7 +135,7 @@
     # "OnlinePush.PbPushBindUinGroupMsg": handle_push_msg,  # sub account
 
     # new
-    "MultiMsg.ApplyUp": handle_multi_apply_up_resp
+    "MultiMsg.ApplyUp": handle_multi_resp_body
 }
 
 
diff --git a/cai/client/multi_msg/long_msg.py b/cai/client/multi_msg/long_msg.py
index 57df3113..67025bfd 100644
--- a/cai/client/multi_msg/long_msg.py
+++ b/cai/client/multi_msg/long_msg.py
@@ -1,5 +1,5 @@
 from cai.client import Command
-from cai.pb.highway.longmsg.longmsg_pb2 import MultiReqBody, MultiMsgApplyUpReq, MultiMsgApplyUpRsp
+from cai.pb.highway.longmsg.longmsg_pb2 import MultiReqBody, MultiMsgApplyUpReq, MultiMsgApplyUpRsp, MultiRspBody
 from typing import TYPE_CHECKING
 
 from dataclasses import dataclass
@@ -9,7 +9,7 @@
     from cai.client.client import Client
 
 
-def encode_multi_apply_up_pkg(group_id: int, data_len: int, data_md5: bytes, bu_type: int) -> bytes:
+def _encode_multi_req_body(group_id: int, data_len: int, data_md5: bytes, bu_type: int) -> MultiReqBody:
     return MultiReqBody(
         subcmd=1,
         termType=5,
@@ -23,19 +23,33 @@ def encode_multi_apply_up_pkg(group_id: int, data_len: int, data_md5: bytes, bu_
             msgType=3
         )],
         buType=bu_type
-    ).SerializeToString()
+    )
 
 
 @dataclass
-class MultiApplyUpResp(Command):
-    data: MultiMsgApplyUpRsp
+class MultiApplyResp(Command):
+    data: MultiRspBody
+
+
+async def build_multi_apply_up_pkg(client: "Client", group_id: int, data_len: int, data_md5: bytes, bu_type: int):
+    body: MultiApplyResp = await client.send_unipkg_and_wait(
+        client.next_seq(),
+        "MultiMsg.ApplyUp",
+        _encode_multi_req_body(
+            group_id, data_len, data_md5, bu_type
+        ).SerializeToString()
+    )
+    
+
+
+
 
 
-async def handle_multi_apply_up_resp(client: "Client", pkg: "IncomingPacket", _device):
-    return MultiApplyUpResp(
+async def handle_multi_resp_body(client: "Client", pkg: "IncomingPacket", _device) -> MultiApplyResp:
+    return MultiApplyResp(
         uin=pkg.uin,
         seq=pkg.seq,
         ret_code=pkg.ret_code,
         command_name=pkg.command_name,
-        data=MultiMsgApplyUpRsp.FromString(pkg.data)
+        data=MultiRspBody.FromString(pkg.data)
     )

From 46c42c50e7115e085d36975eb70c15390b30b941 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Mon, 21 Mar 2022 01:19:19 +0800
Subject: [PATCH 022/113] fix: some bugs

---
 cai/client/client.py                          |   4 +-
 cai/client/multi_msg/long_msg.py              |  25 ++-
 .../highway/{longmsg => long_msg}/__init__.py |   0
 cai/pb/highway/long_msg/long_msg.proto        |  52 +++++
 cai/pb/highway/long_msg/long_msg_pb2.py       | 105 ++++++++++
 cai/pb/highway/long_msg/long_msg_pb2.pyi      | 191 ++++++++++++++++++
 cai/pb/highway/longmsg/longmsg_pb2.py         |  95 ---------
 cai/pb/highway/multi_msg/__init__.py          |   0
 .../multi_msg.proto}                          |   0
 cai/pb/highway/multi_msg/multi_msg_pb2.py     |  95 +++++++++
 .../multi_msg_pb2.pyi}                        |   0
 11 files changed, 465 insertions(+), 102 deletions(-)
 rename cai/pb/highway/{longmsg => long_msg}/__init__.py (100%)
 create mode 100644 cai/pb/highway/long_msg/long_msg.proto
 create mode 100644 cai/pb/highway/long_msg/long_msg_pb2.py
 create mode 100644 cai/pb/highway/long_msg/long_msg_pb2.pyi
 delete mode 100644 cai/pb/highway/longmsg/longmsg_pb2.py
 create mode 100644 cai/pb/highway/multi_msg/__init__.py
 rename cai/pb/highway/{longmsg/longmsg.proto => multi_msg/multi_msg.proto} (100%)
 create mode 100644 cai/pb/highway/multi_msg/multi_msg_pb2.py
 rename cai/pb/highway/{longmsg/longmsg_pb2.pyi => multi_msg/multi_msg_pb2.pyi} (100%)

diff --git a/cai/client/client.py b/cai/client/client.py
index 572beeb1..2aeeda14 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -48,7 +48,7 @@
 )
 
 from .event import Event
-from .multi_msg.long_msg import handle_multi_resp_body
+from .multi_msg.long_msg import _handle_multi_resp_body
 from .packet import IncomingPacket, UniPacket
 from .command import Command, _packet_to_command
 from .sso_server import SsoServer, get_sso_server
@@ -135,7 +135,7 @@
     # "OnlinePush.PbPushBindUinGroupMsg": handle_push_msg,  # sub account
 
     # new
-    "MultiMsg.ApplyUp": handle_multi_resp_body
+    "MultiMsg.ApplyUp": _handle_multi_resp_body
 }
 
 
diff --git a/cai/client/multi_msg/long_msg.py b/cai/client/multi_msg/long_msg.py
index 67025bfd..5fc2fca2 100644
--- a/cai/client/multi_msg/long_msg.py
+++ b/cai/client/multi_msg/long_msg.py
@@ -1,5 +1,6 @@
 from cai.client import Command
-from cai.pb.highway.longmsg.longmsg_pb2 import MultiReqBody, MultiMsgApplyUpReq, MultiMsgApplyUpRsp, MultiRspBody
+from cai.pb.highway.multi_msg.multi_msg_pb2 import MultiReqBody, MultiMsgApplyUpReq, MultiMsgApplyUpRsp, MultiRspBody
+from cai.pb.highway.long_msg.long_msg_pb2 import LongReqBody, LongMsgUpReq
 from typing import TYPE_CHECKING
 
 from dataclasses import dataclass
@@ -28,7 +29,7 @@ def _encode_multi_req_body(group_id: int, data_len: int, data_md5: bytes, bu_typ
 
 @dataclass
 class MultiApplyResp(Command):
-    data: MultiRspBody
+    data: MultiMsgApplyUpRsp
 
 
 async def build_multi_apply_up_pkg(client: "Client", group_id: int, data_len: int, data_md5: bytes, bu_type: int):
@@ -39,17 +40,31 @@ async def build_multi_apply_up_pkg(client: "Client", group_id: int, data_len: in
             group_id, data_len, data_md5, bu_type
         ).SerializeToString()
     )
-    
+    LongReqBody(
+        subcmd=1,
+        termType=5,
+        platformType=9,
+        msgUpReq=[LongMsgUpReq(
+            msgType=3,
+            dstUin=client.uin,
+            msgContent=bytes(),  # todo:
+            storeType=2,
+            msgUkey=body.data.msgUkey
+        )]
+    )
 
 
 
 
 
-async def handle_multi_resp_body(client: "Client", pkg: "IncomingPacket", _device) -> MultiApplyResp:
+async def _handle_multi_resp_body(client: "Client", pkg: "IncomingPacket", _device) -> MultiApplyResp:
+    mrb = MultiRspBody.FromString(pkg.data).multimsgApplyupRsp
+    if not mrb:
+        raise ConnectionError("no MultiMsgApplyUpRsp Found")
     return MultiApplyResp(
         uin=pkg.uin,
         seq=pkg.seq,
         ret_code=pkg.ret_code,
         command_name=pkg.command_name,
-        data=MultiRspBody.FromString(pkg.data)
+        data=mrb[0]
     )
diff --git a/cai/pb/highway/longmsg/__init__.py b/cai/pb/highway/long_msg/__init__.py
similarity index 100%
rename from cai/pb/highway/longmsg/__init__.py
rename to cai/pb/highway/long_msg/__init__.py
diff --git a/cai/pb/highway/long_msg/long_msg.proto b/cai/pb/highway/long_msg/long_msg.proto
new file mode 100644
index 00000000..ade6631a
--- /dev/null
+++ b/cai/pb/highway/long_msg/long_msg.proto
@@ -0,0 +1,52 @@
+syntax = "proto3";
+
+option go_package = "github.com/Mrs4s/MiraiGo/client/pb/longmsg";
+
+message LongMsgDeleteReq {
+  bytes msgResid = 1;
+  int32 msgType = 2;
+}
+message LongMsgDeleteRsp {
+  int32 result = 1;
+  bytes msgResid = 2;
+}
+message LongMsgDownReq {
+  int32 srcUin = 1;
+  bytes msgResid = 2;
+  int32 msgType = 3;
+  int32 needCache = 4;
+}
+message LongMsgDownRsp {
+  int32 result = 1;
+  bytes msgResid = 2;
+  bytes msgContent = 3;
+}
+message LongMsgUpReq {
+  int32 msgType = 1;
+  int64 dstUin = 2;
+  int32 msgId = 3;
+  bytes msgContent = 4;
+  int32 storeType = 5;
+  bytes msgUkey = 6;
+  int32 needCache = 7;
+}
+message LongMsgUpRsp {
+  int32 result = 1;
+  int32 msgId = 2;
+  bytes msgResid = 3;
+}
+message LongReqBody {
+  int32 subcmd = 1;
+  int32 termType = 2;
+  int32 platformType = 3;
+  repeated LongMsgUpReq msgUpReq = 4;
+  repeated LongMsgDownReq msgDownReq = 5;
+  repeated LongMsgDeleteReq msgDelReq = 6;
+  int32 agentType = 10;
+}
+message LongRspBody {
+  int32 subcmd = 1;
+  repeated LongMsgUpRsp msgUpRsp = 2;
+  repeated LongMsgDownRsp msgDownRsp = 3;
+  repeated LongMsgDeleteRsp msgDelRsp = 4;
+}
diff --git a/cai/pb/highway/long_msg/long_msg_pb2.py b/cai/pb/highway/long_msg/long_msg_pb2.py
new file mode 100644
index 00000000..aac6da9d
--- /dev/null
+++ b/cai/pb/highway/long_msg/long_msg_pb2.py
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: long_msg.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0elong_msg.proto\"5\n\x10LongMsgDeleteReq\x12\x10\n\x08msgResid\x18\x01 \x01(\x0c\x12\x0f\n\x07msgType\x18\x02 \x01(\x05\"4\n\x10LongMsgDeleteRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\x0c\"V\n\x0eLongMsgDownReq\x12\x0e\n\x06srcUin\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\x0c\x12\x0f\n\x07msgType\x18\x03 \x01(\x05\x12\x11\n\tneedCache\x18\x04 \x01(\x05\"F\n\x0eLongMsgDownRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\x0c\x12\x12\n\nmsgContent\x18\x03 \x01(\x0c\"\x89\x01\n\x0cLongMsgUpReq\x12\x0f\n\x07msgType\x18\x01 \x01(\x05\x12\x0e\n\x06\x64stUin\x18\x02 \x01(\x03\x12\r\n\x05msgId\x18\x03 \x01(\x05\x12\x12\n\nmsgContent\x18\x04 \x01(\x0c\x12\x11\n\tstoreType\x18\x05 \x01(\x05\x12\x0f\n\x07msgUkey\x18\x06 \x01(\x0c\x12\x11\n\tneedCache\x18\x07 \x01(\x05\"?\n\x0cLongMsgUpRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\r\n\x05msgId\x18\x02 \x01(\x05\x12\x10\n\x08msgResid\x18\x03 \x01(\x0c\"\xc4\x01\n\x0bLongReqBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12\x10\n\x08termType\x18\x02 \x01(\x05\x12\x14\n\x0cplatformType\x18\x03 \x01(\x05\x12\x1f\n\x08msgUpReq\x18\x04 \x03(\x0b\x32\r.LongMsgUpReq\x12#\n\nmsgDownReq\x18\x05 \x03(\x0b\x32\x0f.LongMsgDownReq\x12$\n\tmsgDelReq\x18\x06 \x03(\x0b\x32\x11.LongMsgDeleteReq\x12\x11\n\tagentType\x18\n \x01(\x05\"\x89\x01\n\x0bLongRspBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12\x1f\n\x08msgUpRsp\x18\x02 \x03(\x0b\x32\r.LongMsgUpRsp\x12#\n\nmsgDownRsp\x18\x03 \x03(\x0b\x32\x0f.LongMsgDownRsp\x12$\n\tmsgDelRsp\x18\x04 \x03(\x0b\x32\x11.LongMsgDeleteRspB,Z*github.com/Mrs4s/MiraiGo/client/pb/longmsgb\x06proto3')
+
+
+
+_LONGMSGDELETEREQ = DESCRIPTOR.message_types_by_name['LongMsgDeleteReq']
+_LONGMSGDELETERSP = DESCRIPTOR.message_types_by_name['LongMsgDeleteRsp']
+_LONGMSGDOWNREQ = DESCRIPTOR.message_types_by_name['LongMsgDownReq']
+_LONGMSGDOWNRSP = DESCRIPTOR.message_types_by_name['LongMsgDownRsp']
+_LONGMSGUPREQ = DESCRIPTOR.message_types_by_name['LongMsgUpReq']
+_LONGMSGUPRSP = DESCRIPTOR.message_types_by_name['LongMsgUpRsp']
+_LONGREQBODY = DESCRIPTOR.message_types_by_name['LongReqBody']
+_LONGRSPBODY = DESCRIPTOR.message_types_by_name['LongRspBody']
+LongMsgDeleteReq = _reflection.GeneratedProtocolMessageType('LongMsgDeleteReq', (_message.Message,), {
+  'DESCRIPTOR' : _LONGMSGDELETEREQ,
+  '__module__' : 'long_msg_pb2'
+  # @@protoc_insertion_point(class_scope:LongMsgDeleteReq)
+  })
+_sym_db.RegisterMessage(LongMsgDeleteReq)
+
+LongMsgDeleteRsp = _reflection.GeneratedProtocolMessageType('LongMsgDeleteRsp', (_message.Message,), {
+  'DESCRIPTOR' : _LONGMSGDELETERSP,
+  '__module__' : 'long_msg_pb2'
+  # @@protoc_insertion_point(class_scope:LongMsgDeleteRsp)
+  })
+_sym_db.RegisterMessage(LongMsgDeleteRsp)
+
+LongMsgDownReq = _reflection.GeneratedProtocolMessageType('LongMsgDownReq', (_message.Message,), {
+  'DESCRIPTOR' : _LONGMSGDOWNREQ,
+  '__module__' : 'long_msg_pb2'
+  # @@protoc_insertion_point(class_scope:LongMsgDownReq)
+  })
+_sym_db.RegisterMessage(LongMsgDownReq)
+
+LongMsgDownRsp = _reflection.GeneratedProtocolMessageType('LongMsgDownRsp', (_message.Message,), {
+  'DESCRIPTOR' : _LONGMSGDOWNRSP,
+  '__module__' : 'long_msg_pb2'
+  # @@protoc_insertion_point(class_scope:LongMsgDownRsp)
+  })
+_sym_db.RegisterMessage(LongMsgDownRsp)
+
+LongMsgUpReq = _reflection.GeneratedProtocolMessageType('LongMsgUpReq', (_message.Message,), {
+  'DESCRIPTOR' : _LONGMSGUPREQ,
+  '__module__' : 'long_msg_pb2'
+  # @@protoc_insertion_point(class_scope:LongMsgUpReq)
+  })
+_sym_db.RegisterMessage(LongMsgUpReq)
+
+LongMsgUpRsp = _reflection.GeneratedProtocolMessageType('LongMsgUpRsp', (_message.Message,), {
+  'DESCRIPTOR' : _LONGMSGUPRSP,
+  '__module__' : 'long_msg_pb2'
+  # @@protoc_insertion_point(class_scope:LongMsgUpRsp)
+  })
+_sym_db.RegisterMessage(LongMsgUpRsp)
+
+LongReqBody = _reflection.GeneratedProtocolMessageType('LongReqBody', (_message.Message,), {
+  'DESCRIPTOR' : _LONGREQBODY,
+  '__module__' : 'long_msg_pb2'
+  # @@protoc_insertion_point(class_scope:LongReqBody)
+  })
+_sym_db.RegisterMessage(LongReqBody)
+
+LongRspBody = _reflection.GeneratedProtocolMessageType('LongRspBody', (_message.Message,), {
+  'DESCRIPTOR' : _LONGRSPBODY,
+  '__module__' : 'long_msg_pb2'
+  # @@protoc_insertion_point(class_scope:LongRspBody)
+  })
+_sym_db.RegisterMessage(LongRspBody)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z*github.com/Mrs4s/MiraiGo/client/pb/longmsg'
+  _LONGMSGDELETEREQ._serialized_start=18
+  _LONGMSGDELETEREQ._serialized_end=71
+  _LONGMSGDELETERSP._serialized_start=73
+  _LONGMSGDELETERSP._serialized_end=125
+  _LONGMSGDOWNREQ._serialized_start=127
+  _LONGMSGDOWNREQ._serialized_end=213
+  _LONGMSGDOWNRSP._serialized_start=215
+  _LONGMSGDOWNRSP._serialized_end=285
+  _LONGMSGUPREQ._serialized_start=288
+  _LONGMSGUPREQ._serialized_end=425
+  _LONGMSGUPRSP._serialized_start=427
+  _LONGMSGUPRSP._serialized_end=490
+  _LONGREQBODY._serialized_start=493
+  _LONGREQBODY._serialized_end=689
+  _LONGRSPBODY._serialized_start=692
+  _LONGRSPBODY._serialized_end=829
+# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/highway/long_msg/long_msg_pb2.pyi b/cai/pb/highway/long_msg/long_msg_pb2.pyi
new file mode 100644
index 00000000..8346339e
--- /dev/null
+++ b/cai/pb/highway/long_msg/long_msg_pb2.pyi
@@ -0,0 +1,191 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+from builtins import (
+    bytes,
+    int,
+)
+
+from google.protobuf.descriptor import (
+    Descriptor,
+    FileDescriptor,
+)
+
+from google.protobuf.internal.containers import (
+    RepeatedCompositeFieldContainer,
+)
+
+from google.protobuf.message import (
+    Message,
+)
+
+from typing import (
+    Iterable,
+    Optional,
+)
+
+from typing_extensions import (
+    Literal,
+)
+
+
+DESCRIPTOR: FileDescriptor
+
+class LongMsgDeleteReq(Message):
+    DESCRIPTOR: Descriptor
+    MSGRESID_FIELD_NUMBER: int
+    MSGTYPE_FIELD_NUMBER: int
+    msgResid: bytes
+    msgType: int
+    def __init__(self,
+        *,
+        msgResid: bytes = ...,
+        msgType: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["msgResid",b"msgResid","msgType",b"msgType"]) -> None: ...
+
+class LongMsgDeleteRsp(Message):
+    DESCRIPTOR: Descriptor
+    RESULT_FIELD_NUMBER: int
+    MSGRESID_FIELD_NUMBER: int
+    result: int
+    msgResid: bytes
+    def __init__(self,
+        *,
+        result: int = ...,
+        msgResid: bytes = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["msgResid",b"msgResid","result",b"result"]) -> None: ...
+
+class LongMsgDownReq(Message):
+    DESCRIPTOR: Descriptor
+    SRCUIN_FIELD_NUMBER: int
+    MSGRESID_FIELD_NUMBER: int
+    MSGTYPE_FIELD_NUMBER: int
+    NEEDCACHE_FIELD_NUMBER: int
+    srcUin: int
+    msgResid: bytes
+    msgType: int
+    needCache: int
+    def __init__(self,
+        *,
+        srcUin: int = ...,
+        msgResid: bytes = ...,
+        msgType: int = ...,
+        needCache: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["msgResid",b"msgResid","msgType",b"msgType","needCache",b"needCache","srcUin",b"srcUin"]) -> None: ...
+
+class LongMsgDownRsp(Message):
+    DESCRIPTOR: Descriptor
+    RESULT_FIELD_NUMBER: int
+    MSGRESID_FIELD_NUMBER: int
+    MSGCONTENT_FIELD_NUMBER: int
+    result: int
+    msgResid: bytes
+    msgContent: bytes
+    def __init__(self,
+        *,
+        result: int = ...,
+        msgResid: bytes = ...,
+        msgContent: bytes = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["msgContent",b"msgContent","msgResid",b"msgResid","result",b"result"]) -> None: ...
+
+class LongMsgUpReq(Message):
+    DESCRIPTOR: Descriptor
+    MSGTYPE_FIELD_NUMBER: int
+    DSTUIN_FIELD_NUMBER: int
+    MSGID_FIELD_NUMBER: int
+    MSGCONTENT_FIELD_NUMBER: int
+    STORETYPE_FIELD_NUMBER: int
+    MSGUKEY_FIELD_NUMBER: int
+    NEEDCACHE_FIELD_NUMBER: int
+    msgType: int
+    dstUin: int
+    msgId: int
+    msgContent: bytes
+    storeType: int
+    msgUkey: bytes
+    needCache: int
+    def __init__(self,
+        *,
+        msgType: int = ...,
+        dstUin: int = ...,
+        msgId: int = ...,
+        msgContent: bytes = ...,
+        storeType: int = ...,
+        msgUkey: bytes = ...,
+        needCache: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["dstUin",b"dstUin","msgContent",b"msgContent","msgId",b"msgId","msgType",b"msgType","msgUkey",b"msgUkey","needCache",b"needCache","storeType",b"storeType"]) -> None: ...
+
+class LongMsgUpRsp(Message):
+    DESCRIPTOR: Descriptor
+    RESULT_FIELD_NUMBER: int
+    MSGID_FIELD_NUMBER: int
+    MSGRESID_FIELD_NUMBER: int
+    result: int
+    msgId: int
+    msgResid: bytes
+    def __init__(self,
+        *,
+        result: int = ...,
+        msgId: int = ...,
+        msgResid: bytes = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["msgId",b"msgId","msgResid",b"msgResid","result",b"result"]) -> None: ...
+
+class LongReqBody(Message):
+    DESCRIPTOR: Descriptor
+    SUBCMD_FIELD_NUMBER: int
+    TERMTYPE_FIELD_NUMBER: int
+    PLATFORMTYPE_FIELD_NUMBER: int
+    MSGUPREQ_FIELD_NUMBER: int
+    MSGDOWNREQ_FIELD_NUMBER: int
+    MSGDELREQ_FIELD_NUMBER: int
+    AGENTTYPE_FIELD_NUMBER: int
+    subcmd: int
+    termType: int
+    platformType: int
+    @property
+    def msgUpReq(self) -> RepeatedCompositeFieldContainer[LongMsgUpReq]: ...
+    @property
+    def msgDownReq(self) -> RepeatedCompositeFieldContainer[LongMsgDownReq]: ...
+    @property
+    def msgDelReq(self) -> RepeatedCompositeFieldContainer[LongMsgDeleteReq]: ...
+    agentType: int
+    def __init__(self,
+        *,
+        subcmd: int = ...,
+        termType: int = ...,
+        platformType: int = ...,
+        msgUpReq: Optional[Iterable[LongMsgUpReq]] = ...,
+        msgDownReq: Optional[Iterable[LongMsgDownReq]] = ...,
+        msgDelReq: Optional[Iterable[LongMsgDeleteReq]] = ...,
+        agentType: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["agentType",b"agentType","msgDelReq",b"msgDelReq","msgDownReq",b"msgDownReq","msgUpReq",b"msgUpReq","platformType",b"platformType","subcmd",b"subcmd","termType",b"termType"]) -> None: ...
+
+class LongRspBody(Message):
+    DESCRIPTOR: Descriptor
+    SUBCMD_FIELD_NUMBER: int
+    MSGUPRSP_FIELD_NUMBER: int
+    MSGDOWNRSP_FIELD_NUMBER: int
+    MSGDELRSP_FIELD_NUMBER: int
+    subcmd: int
+    @property
+    def msgUpRsp(self) -> RepeatedCompositeFieldContainer[LongMsgUpRsp]: ...
+    @property
+    def msgDownRsp(self) -> RepeatedCompositeFieldContainer[LongMsgDownRsp]: ...
+    @property
+    def msgDelRsp(self) -> RepeatedCompositeFieldContainer[LongMsgDeleteRsp]: ...
+    def __init__(self,
+        *,
+        subcmd: int = ...,
+        msgUpRsp: Optional[Iterable[LongMsgUpRsp]] = ...,
+        msgDownRsp: Optional[Iterable[LongMsgDownRsp]] = ...,
+        msgDelRsp: Optional[Iterable[LongMsgDeleteRsp]] = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["msgDelRsp",b"msgDelRsp","msgDownRsp",b"msgDownRsp","msgUpRsp",b"msgUpRsp","subcmd",b"subcmd"]) -> None: ...
diff --git a/cai/pb/highway/longmsg/longmsg_pb2.py b/cai/pb/highway/longmsg/longmsg_pb2.py
deleted file mode 100644
index e8b3a316..00000000
--- a/cai/pb/highway/longmsg/longmsg_pb2.py
+++ /dev/null
@@ -1,95 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: longmsg.proto
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rlongmsg.proto\" \n\tExternMsg\x12\x13\n\x0b\x63hannelType\x18\x01 \x01(\x05\"I\n\x14MultiMsgApplyDownReq\x12\x10\n\x08msgResid\x18\x01 \x01(\x0c\x12\x0f\n\x07msgType\x18\x02 \x01(\x05\x12\x0e\n\x06srcUin\x18\x03 \x01(\x03\"\xe1\x01\n\x14MultiMsgApplyDownRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x15\n\rthumbDownPara\x18\x02 \x01(\x0c\x12\x0e\n\x06msgKey\x18\x03 \x01(\x0c\x12\x14\n\x0cuint32DownIp\x18\x04 \x03(\x05\x12\x16\n\x0euint32DownPort\x18\x05 \x03(\x05\x12\x10\n\x08msgResid\x18\x06 \x01(\x0c\x12!\n\rmsgExternInfo\x18\x07 \x01(\x0b\x32\n.ExternMsg\x12\x15\n\rbytesDownIpV6\x18\x08 \x03(\x0c\x12\x18\n\x10uint32DownV6Port\x18\t \x03(\x05\"g\n\x12MultiMsgApplyUpReq\x12\x0e\n\x06\x64stUin\x18\x01 \x01(\x03\x12\x0f\n\x07msgSize\x18\x02 \x01(\x03\x12\x0e\n\x06msgMd5\x18\x03 \x01(\x0c\x12\x0f\n\x07msgType\x18\x04 \x01(\x05\x12\x0f\n\x07\x61pplyId\x18\x05 \x01(\x05\"\x97\x02\n\x12MultiMsgApplyUpRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\t\x12\x0f\n\x07msgUkey\x18\x03 \x01(\x0c\x12\x12\n\nuint32UpIp\x18\x04 \x03(\x05\x12\x14\n\x0cuint32UpPort\x18\x05 \x03(\x05\x12\x11\n\tblockSize\x18\x06 \x01(\x03\x12\x10\n\x08upOffset\x18\x07 \x01(\x03\x12\x0f\n\x07\x61pplyId\x18\x08 \x01(\x05\x12\x0e\n\x06msgKey\x18\t \x01(\x0c\x12\x0e\n\x06msgSig\x18\n \x01(\x0c\x12!\n\rmsgExternInfo\x18\x0b \x01(\x0b\x32\n.ExternMsg\x12\x13\n\x0b\x62ytesUpIpV6\x18\x0c \x03(\x0c\x12\x16\n\x0euint32UpV6Port\x18\r \x03(\x05\"\xf7\x01\n\x0cMultiReqBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12\x10\n\x08termType\x18\x02 \x01(\x05\x12\x14\n\x0cplatformType\x18\x03 \x01(\x05\x12\x0f\n\x07netType\x18\x04 \x01(\x05\x12\x10\n\x08\x62uildVer\x18\x05 \x01(\t\x12/\n\x12multimsgApplyupReq\x18\x06 \x03(\x0b\x32\x13.MultiMsgApplyUpReq\x12\x33\n\x14multimsgApplydownReq\x18\x07 \x03(\x0b\x32\x15.MultiMsgApplyDownReq\x12\x0e\n\x06\x62uType\x18\x08 \x01(\x05\x12\x16\n\x0ereqChannelType\x18\t \x01(\x05\"\x84\x01\n\x0cMultiRspBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12/\n\x12multimsgApplyupRsp\x18\x02 \x03(\x0b\x32\x13.MultiMsgApplyUpRsp\x12\x33\n\x14multimsgApplydownRsp\x18\x03 \x03(\x0b\x32\x15.MultiMsgApplyDownRspB-Z+github.com/Mrs4s/MiraiGo/client/pb/multimsgb\x06proto3')
-
-
-
-_EXTERNMSG = DESCRIPTOR.message_types_by_name['ExternMsg']
-_MULTIMSGAPPLYDOWNREQ = DESCRIPTOR.message_types_by_name['MultiMsgApplyDownReq']
-_MULTIMSGAPPLYDOWNRSP = DESCRIPTOR.message_types_by_name['MultiMsgApplyDownRsp']
-_MULTIMSGAPPLYUPREQ = DESCRIPTOR.message_types_by_name['MultiMsgApplyUpReq']
-_MULTIMSGAPPLYUPRSP = DESCRIPTOR.message_types_by_name['MultiMsgApplyUpRsp']
-_MULTIREQBODY = DESCRIPTOR.message_types_by_name['MultiReqBody']
-_MULTIRSPBODY = DESCRIPTOR.message_types_by_name['MultiRspBody']
-ExternMsg = _reflection.GeneratedProtocolMessageType('ExternMsg', (_message.Message,), {
-  'DESCRIPTOR' : _EXTERNMSG,
-  '__module__' : 'longmsg_pb2'
-  # @@protoc_insertion_point(class_scope:ExternMsg)
-  })
-_sym_db.RegisterMessage(ExternMsg)
-
-MultiMsgApplyDownReq = _reflection.GeneratedProtocolMessageType('MultiMsgApplyDownReq', (_message.Message,), {
-  'DESCRIPTOR' : _MULTIMSGAPPLYDOWNREQ,
-  '__module__' : 'longmsg_pb2'
-  # @@protoc_insertion_point(class_scope:MultiMsgApplyDownReq)
-  })
-_sym_db.RegisterMessage(MultiMsgApplyDownReq)
-
-MultiMsgApplyDownRsp = _reflection.GeneratedProtocolMessageType('MultiMsgApplyDownRsp', (_message.Message,), {
-  'DESCRIPTOR' : _MULTIMSGAPPLYDOWNRSP,
-  '__module__' : 'longmsg_pb2'
-  # @@protoc_insertion_point(class_scope:MultiMsgApplyDownRsp)
-  })
-_sym_db.RegisterMessage(MultiMsgApplyDownRsp)
-
-MultiMsgApplyUpReq = _reflection.GeneratedProtocolMessageType('MultiMsgApplyUpReq', (_message.Message,), {
-  'DESCRIPTOR' : _MULTIMSGAPPLYUPREQ,
-  '__module__' : 'longmsg_pb2'
-  # @@protoc_insertion_point(class_scope:MultiMsgApplyUpReq)
-  })
-_sym_db.RegisterMessage(MultiMsgApplyUpReq)
-
-MultiMsgApplyUpRsp = _reflection.GeneratedProtocolMessageType('MultiMsgApplyUpRsp', (_message.Message,), {
-  'DESCRIPTOR' : _MULTIMSGAPPLYUPRSP,
-  '__module__' : 'longmsg_pb2'
-  # @@protoc_insertion_point(class_scope:MultiMsgApplyUpRsp)
-  })
-_sym_db.RegisterMessage(MultiMsgApplyUpRsp)
-
-MultiReqBody = _reflection.GeneratedProtocolMessageType('MultiReqBody', (_message.Message,), {
-  'DESCRIPTOR' : _MULTIREQBODY,
-  '__module__' : 'longmsg_pb2'
-  # @@protoc_insertion_point(class_scope:MultiReqBody)
-  })
-_sym_db.RegisterMessage(MultiReqBody)
-
-MultiRspBody = _reflection.GeneratedProtocolMessageType('MultiRspBody', (_message.Message,), {
-  'DESCRIPTOR' : _MULTIRSPBODY,
-  '__module__' : 'longmsg_pb2'
-  # @@protoc_insertion_point(class_scope:MultiRspBody)
-  })
-_sym_db.RegisterMessage(MultiRspBody)
-
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  DESCRIPTOR._serialized_options = b'Z+github.com/Mrs4s/MiraiGo/client/pb/multi_msg'
-  _EXTERNMSG._serialized_start=17
-  _EXTERNMSG._serialized_end=49
-  _MULTIMSGAPPLYDOWNREQ._serialized_start=51
-  _MULTIMSGAPPLYDOWNREQ._serialized_end=124
-  _MULTIMSGAPPLYDOWNRSP._serialized_start=127
-  _MULTIMSGAPPLYDOWNRSP._serialized_end=352
-  _MULTIMSGAPPLYUPREQ._serialized_start=354
-  _MULTIMSGAPPLYUPREQ._serialized_end=457
-  _MULTIMSGAPPLYUPRSP._serialized_start=460
-  _MULTIMSGAPPLYUPRSP._serialized_end=739
-  _MULTIREQBODY._serialized_start=742
-  _MULTIREQBODY._serialized_end=989
-  _MULTIRSPBODY._serialized_start=992
-  _MULTIRSPBODY._serialized_end=1124
-# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/highway/multi_msg/__init__.py b/cai/pb/highway/multi_msg/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/cai/pb/highway/longmsg/longmsg.proto b/cai/pb/highway/multi_msg/multi_msg.proto
similarity index 100%
rename from cai/pb/highway/longmsg/longmsg.proto
rename to cai/pb/highway/multi_msg/multi_msg.proto
diff --git a/cai/pb/highway/multi_msg/multi_msg_pb2.py b/cai/pb/highway/multi_msg/multi_msg_pb2.py
new file mode 100644
index 00000000..73455d32
--- /dev/null
+++ b/cai/pb/highway/multi_msg/multi_msg_pb2.py
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: multi_msg.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0fmulti_msg.proto\" \n\tExternMsg\x12\x13\n\x0b\x63hannelType\x18\x01 \x01(\x05\"I\n\x14MultiMsgApplyDownReq\x12\x10\n\x08msgResid\x18\x01 \x01(\x0c\x12\x0f\n\x07msgType\x18\x02 \x01(\x05\x12\x0e\n\x06srcUin\x18\x03 \x01(\x03\"\xe1\x01\n\x14MultiMsgApplyDownRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x15\n\rthumbDownPara\x18\x02 \x01(\x0c\x12\x0e\n\x06msgKey\x18\x03 \x01(\x0c\x12\x14\n\x0cuint32DownIp\x18\x04 \x03(\x05\x12\x16\n\x0euint32DownPort\x18\x05 \x03(\x05\x12\x10\n\x08msgResid\x18\x06 \x01(\x0c\x12!\n\rmsgExternInfo\x18\x07 \x01(\x0b\x32\n.ExternMsg\x12\x15\n\rbytesDownIpV6\x18\x08 \x03(\x0c\x12\x18\n\x10uint32DownV6Port\x18\t \x03(\x05\"g\n\x12MultiMsgApplyUpReq\x12\x0e\n\x06\x64stUin\x18\x01 \x01(\x03\x12\x0f\n\x07msgSize\x18\x02 \x01(\x03\x12\x0e\n\x06msgMd5\x18\x03 \x01(\x0c\x12\x0f\n\x07msgType\x18\x04 \x01(\x05\x12\x0f\n\x07\x61pplyId\x18\x05 \x01(\x05\"\x97\x02\n\x12MultiMsgApplyUpRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\t\x12\x0f\n\x07msgUkey\x18\x03 \x01(\x0c\x12\x12\n\nuint32UpIp\x18\x04 \x03(\x05\x12\x14\n\x0cuint32UpPort\x18\x05 \x03(\x05\x12\x11\n\tblockSize\x18\x06 \x01(\x03\x12\x10\n\x08upOffset\x18\x07 \x01(\x03\x12\x0f\n\x07\x61pplyId\x18\x08 \x01(\x05\x12\x0e\n\x06msgKey\x18\t \x01(\x0c\x12\x0e\n\x06msgSig\x18\n \x01(\x0c\x12!\n\rmsgExternInfo\x18\x0b \x01(\x0b\x32\n.ExternMsg\x12\x13\n\x0b\x62ytesUpIpV6\x18\x0c \x03(\x0c\x12\x16\n\x0euint32UpV6Port\x18\r \x03(\x05\"\xf7\x01\n\x0cMultiReqBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12\x10\n\x08termType\x18\x02 \x01(\x05\x12\x14\n\x0cplatformType\x18\x03 \x01(\x05\x12\x0f\n\x07netType\x18\x04 \x01(\x05\x12\x10\n\x08\x62uildVer\x18\x05 \x01(\t\x12/\n\x12multimsgApplyupReq\x18\x06 \x03(\x0b\x32\x13.MultiMsgApplyUpReq\x12\x33\n\x14multimsgApplydownReq\x18\x07 \x03(\x0b\x32\x15.MultiMsgApplyDownReq\x12\x0e\n\x06\x62uType\x18\x08 \x01(\x05\x12\x16\n\x0ereqChannelType\x18\t \x01(\x05\"\x84\x01\n\x0cMultiRspBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12/\n\x12multimsgApplyupRsp\x18\x02 \x03(\x0b\x32\x13.MultiMsgApplyUpRsp\x12\x33\n\x14multimsgApplydownRsp\x18\x03 \x03(\x0b\x32\x15.MultiMsgApplyDownRspB.Z,github.com/Mrs4s/MiraiGo/client/pb/multi_msgb\x06proto3')
+
+
+
+_EXTERNMSG = DESCRIPTOR.message_types_by_name['ExternMsg']
+_MULTIMSGAPPLYDOWNREQ = DESCRIPTOR.message_types_by_name['MultiMsgApplyDownReq']
+_MULTIMSGAPPLYDOWNRSP = DESCRIPTOR.message_types_by_name['MultiMsgApplyDownRsp']
+_MULTIMSGAPPLYUPREQ = DESCRIPTOR.message_types_by_name['MultiMsgApplyUpReq']
+_MULTIMSGAPPLYUPRSP = DESCRIPTOR.message_types_by_name['MultiMsgApplyUpRsp']
+_MULTIREQBODY = DESCRIPTOR.message_types_by_name['MultiReqBody']
+_MULTIRSPBODY = DESCRIPTOR.message_types_by_name['MultiRspBody']
+ExternMsg = _reflection.GeneratedProtocolMessageType('ExternMsg', (_message.Message,), {
+  'DESCRIPTOR' : _EXTERNMSG,
+  '__module__' : 'multi_msg_pb2'
+  # @@protoc_insertion_point(class_scope:ExternMsg)
+  })
+_sym_db.RegisterMessage(ExternMsg)
+
+MultiMsgApplyDownReq = _reflection.GeneratedProtocolMessageType('MultiMsgApplyDownReq', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIMSGAPPLYDOWNREQ,
+  '__module__' : 'multi_msg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiMsgApplyDownReq)
+  })
+_sym_db.RegisterMessage(MultiMsgApplyDownReq)
+
+MultiMsgApplyDownRsp = _reflection.GeneratedProtocolMessageType('MultiMsgApplyDownRsp', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIMSGAPPLYDOWNRSP,
+  '__module__' : 'multi_msg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiMsgApplyDownRsp)
+  })
+_sym_db.RegisterMessage(MultiMsgApplyDownRsp)
+
+MultiMsgApplyUpReq = _reflection.GeneratedProtocolMessageType('MultiMsgApplyUpReq', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIMSGAPPLYUPREQ,
+  '__module__' : 'multi_msg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiMsgApplyUpReq)
+  })
+_sym_db.RegisterMessage(MultiMsgApplyUpReq)
+
+MultiMsgApplyUpRsp = _reflection.GeneratedProtocolMessageType('MultiMsgApplyUpRsp', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIMSGAPPLYUPRSP,
+  '__module__' : 'multi_msg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiMsgApplyUpRsp)
+  })
+_sym_db.RegisterMessage(MultiMsgApplyUpRsp)
+
+MultiReqBody = _reflection.GeneratedProtocolMessageType('MultiReqBody', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIREQBODY,
+  '__module__' : 'multi_msg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiReqBody)
+  })
+_sym_db.RegisterMessage(MultiReqBody)
+
+MultiRspBody = _reflection.GeneratedProtocolMessageType('MultiRspBody', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIRSPBODY,
+  '__module__' : 'multi_msg_pb2'
+  # @@protoc_insertion_point(class_scope:MultiRspBody)
+  })
+_sym_db.RegisterMessage(MultiRspBody)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z,github.com/Mrs4s/MiraiGo/client/pb/multi_msg'
+  _EXTERNMSG._serialized_start=19
+  _EXTERNMSG._serialized_end=51
+  _MULTIMSGAPPLYDOWNREQ._serialized_start=53
+  _MULTIMSGAPPLYDOWNREQ._serialized_end=126
+  _MULTIMSGAPPLYDOWNRSP._serialized_start=129
+  _MULTIMSGAPPLYDOWNRSP._serialized_end=354
+  _MULTIMSGAPPLYUPREQ._serialized_start=356
+  _MULTIMSGAPPLYUPREQ._serialized_end=459
+  _MULTIMSGAPPLYUPRSP._serialized_start=462
+  _MULTIMSGAPPLYUPRSP._serialized_end=741
+  _MULTIREQBODY._serialized_start=744
+  _MULTIREQBODY._serialized_end=991
+  _MULTIRSPBODY._serialized_start=994
+  _MULTIRSPBODY._serialized_end=1126
+# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/highway/longmsg/longmsg_pb2.pyi b/cai/pb/highway/multi_msg/multi_msg_pb2.pyi
similarity index 100%
rename from cai/pb/highway/longmsg/longmsg_pb2.pyi
rename to cai/pb/highway/multi_msg/multi_msg_pb2.pyi

From 88064e48017303a4c12f65738a6802fcdfbe2721 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Mon, 21 Mar 2022 01:22:08 +0800
Subject: [PATCH 023/113] add: cmd0x388

---
 cai/pb/im/oidb/cmd0x388/__init__.py      |   0
 cai/pb/im/oidb/cmd0x388/cmd0x388.proto   | 255 ++++++++
 cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.py  | 225 +++++++
 cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.pyi | 799 +++++++++++++++++++++++
 4 files changed, 1279 insertions(+)
 create mode 100644 cai/pb/im/oidb/cmd0x388/__init__.py
 create mode 100644 cai/pb/im/oidb/cmd0x388/cmd0x388.proto
 create mode 100644 cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.py
 create mode 100644 cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.pyi

diff --git a/cai/pb/im/oidb/cmd0x388/__init__.py b/cai/pb/im/oidb/cmd0x388/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/cai/pb/im/oidb/cmd0x388/cmd0x388.proto b/cai/pb/im/oidb/cmd0x388/cmd0x388.proto
new file mode 100644
index 00000000..f5cef756
--- /dev/null
+++ b/cai/pb/im/oidb/cmd0x388/cmd0x388.proto
@@ -0,0 +1,255 @@
+syntax = "proto2";
+
+option go_package = "github.com/Mrs4s/MiraiGo/client/pb/cmd0x388";
+
+  message DelImgReq {
+    optional uint64 srcUin = 1;
+    optional uint64 dstUin = 2;
+    optional uint32 reqTerm = 3;
+    optional uint32 reqPlatformType = 4;
+    optional uint32 buType = 5;
+    optional bytes buildVer = 6;
+    optional bytes fileResid = 7;
+    optional uint32 picWidth = 8;
+    optional uint32 picHeight = 9;
+  }
+
+  message DelImgRsp {
+    optional uint32 result = 1;
+    optional bytes failMsg = 2;
+    optional bytes fileResid = 3;
+  }
+
+  message ExpRoamExtendInfo {
+    optional bytes resid = 1;
+  }
+
+  message ExpRoamPicInfo {
+    optional uint32 shopFlag = 1;
+    optional uint32 pkgId = 2;
+    optional bytes picId = 3;
+  }
+
+  message ExtensionCommPicTryUp {
+    repeated bytes extinfo = 1;
+  }
+
+  message ExtensionExpRoamTryUp {
+    repeated ExpRoamPicInfo exproamPicInfo = 1;
+  }
+
+  message GetImgUrlReq {
+    optional uint64 groupCode = 1;
+    optional uint64 dstUin = 2;
+    optional uint64 fileid = 3;
+    optional bytes fileMd5 = 4;
+    optional uint32 urlFlag = 5;
+    optional uint32 urlType = 6;
+    optional uint32 reqTerm = 7;
+    optional uint32 reqPlatformType = 8;
+    optional uint32 innerIp = 9;
+    optional uint32 buType = 10;
+    optional bytes buildVer = 11;
+    optional uint64 fileId = 12;
+    optional uint64 fileSize = 13;
+    optional uint32 originalPic = 14;
+    optional uint32 retryReq = 15;
+    optional uint32 fileHeight = 16;
+    optional uint32 fileWidth = 17;
+    optional uint32 picType = 18;
+    optional uint32 picUpTimestamp = 19;
+    optional uint32 reqTransferType = 20;
+    optional uint64 qqmeetGuildId = 21;
+    optional uint64 qqmeetChannelId = 22;
+    optional bytes downloadIndex = 23;
+  }
+
+  message GetImgUrlRsp {
+    optional uint64 fileid = 1;
+    optional bytes fileMd5 = 2;
+    optional uint32 result = 3;
+    optional bytes failMsg = 4;
+    optional ImgInfo imgInfo = 5;
+    repeated bytes thumbDownUrl = 6;
+    repeated bytes originalDownUrl = 7;
+    repeated bytes bigDownUrl = 8;
+    repeated uint32 downIp = 9;
+    repeated uint32 downPort = 10;
+    optional bytes downDomain = 11;
+    optional bytes thumbDownPara = 12;
+    optional bytes originalDownPara = 13;
+    optional bytes bigDownPara = 14;
+    optional uint64 fileId = 15;
+    optional uint32 autoDownType = 16;
+    repeated uint32 orderDownType = 17;
+    optional bytes bigThumbDownPara = 19;
+    optional uint32 httpsUrlFlag = 20;
+    repeated IPv6Info downIp6 = 26;
+    optional bytes clientIp6 = 27;
+  }
+
+  message GetPttUrlReq {
+    optional uint64 groupCode = 1;
+    optional uint64 dstUin = 2;
+    optional uint64 fileid = 3;
+    optional bytes fileMd5 = 4;
+    optional uint32 reqTerm = 5;
+    optional uint32 reqPlatformType = 6;
+    optional uint32 innerIp = 7;
+    optional uint32 buType = 8;
+    optional bytes buildVer = 9;
+    optional uint64 fileId = 10;
+    optional bytes fileKey = 11;
+    optional uint32 codec = 12;
+    optional uint32 buId = 13;
+    optional uint32 reqTransferType = 14;
+    optional uint32 isAuto = 15;
+  }
+
+  message GetPttUrlRsp {
+    optional uint64 fileid = 1;
+    optional bytes fileMd5 = 2;
+    optional uint32 result = 3;
+    optional bytes failMsg = 4;
+    repeated bytes downUrl = 5;
+    repeated uint32 downIp = 6;
+    repeated uint32 downPort = 7;
+    optional bytes downDomain = 8;
+    optional bytes downPara = 9;
+    optional uint64 fileId = 10;
+    optional uint32 transferType = 11;
+    optional uint32 allowRetry = 12;
+    repeated IPv6Info downIp6 = 26;
+    optional bytes clientIp6 = 27;
+    optional string domain = 28;
+  }
+
+  message IPv6Info {
+    optional bytes ip6 = 1;
+    optional uint32 port = 2;
+  }
+
+  message ImgInfo {
+    optional bytes fileMd5 = 1;
+    optional uint32 fileType = 2;
+    optional uint64 fileSize = 3;
+    optional uint32 fileWidth = 4;
+    optional uint32 fileHeight = 5;
+  }
+
+  message PicSize {
+    optional uint32 original = 1;
+    optional uint32 thumb = 2;
+    optional uint32 high = 3;
+  }
+
+  message D388ReqBody {
+    optional uint32 netType = 1;
+    optional uint32 subcmd = 2;
+    repeated TryUpImgReq tryupImgReq = 3;
+    repeated GetImgUrlReq getimgUrlReq = 4;
+    repeated TryUpPttReq tryupPttReq = 5;
+    repeated GetPttUrlReq getpttUrlReq = 6;
+    optional uint32 commandId = 7;
+    repeated DelImgReq delImgReq = 8;
+    optional bytes extension = 1001;
+  }
+
+  message D388RspBody {
+    optional uint32 clientIp = 1;
+    optional uint32 subcmd = 2;
+    repeated D388TryUpImgRsp tryupImgRsp = 3;
+    repeated GetImgUrlRsp getimgUrlRsp = 4;
+    repeated TryUpPttRsp tryupPttRsp = 5;
+    repeated GetPttUrlRsp getpttUrlRsp = 6;
+    repeated DelImgRsp delImgRsp = 7;
+  }
+
+  message TryUpImgReq {
+    optional uint64 groupCode = 1;
+    optional uint64 srcUin = 2;
+    optional uint64 fileId = 3;
+    optional bytes fileMd5 = 4;
+    optional uint64 fileSize = 5;
+    optional bytes fileName = 6;
+    optional uint32 srcTerm = 7;
+    optional uint32 platformType = 8;
+    optional uint32 buType = 9;
+    optional uint32 picWidth = 10;
+    optional uint32 picHeight = 11;
+    optional uint32 picType = 12;
+    optional bytes buildVer = 13;
+    optional uint32 innerIp = 14;
+    optional uint32 appPicType = 15;
+    optional uint32 originalPic = 16;
+    optional bytes fileIndex = 17;
+    optional uint64 dstUin = 18;
+    optional uint32 srvUpload = 19;
+    optional bytes transferUrl = 20;
+    optional uint64 qqmeetGuildId = 21;
+    optional uint64 qqmeetChannelId = 22;
+  }
+
+  message D388TryUpImgRsp {
+    optional uint64 fileId = 1;
+    optional uint32 result = 2;
+    optional bytes failMsg = 3;
+    optional bool fileExit = 4;
+    optional ImgInfo imgInfo = 5;
+    repeated uint32 upIp = 6;
+    repeated uint32 upPort = 7;
+    optional bytes upUkey = 8;
+    optional uint64 fileid = 9;
+    optional uint64 upOffset = 10;
+    optional uint64 blockSize = 11;
+    optional bool newBigChan = 12;
+    repeated IPv6Info upIp6 = 26;
+    optional bytes clientIp6 = 27;
+    optional bytes downloadIndex = 28;
+    optional TryUpInfo4Busi info4Busi = 1001;
+  }
+
+  message TryUpInfo4Busi {
+    optional bytes downDomain = 1;
+    optional bytes thumbDownUrl = 2;
+    optional bytes originalDownUrl = 3;
+    optional bytes bigDownUrl = 4;
+    optional bytes fileResid = 5;
+  }
+
+  message TryUpPttReq {
+    optional uint64 groupCode = 1;
+    optional uint64 srcUin = 2;
+    optional uint64 fileId = 3;
+    optional bytes fileMd5 = 4;
+    optional uint64 fileSize = 5;
+    optional bytes fileName = 6;
+    optional uint32 srcTerm = 7;
+    optional uint32 platformType = 8;
+    optional uint32 buType = 9;
+    optional bytes buildVer = 10;
+    optional uint32 innerIp = 11;
+    optional uint32 voiceLength = 12;
+    optional bool newUpChan = 13;
+    optional uint32 codec = 14;
+    optional uint32 voiceType = 15;
+    optional uint32 buId = 16;
+  }
+
+  message TryUpPttRsp {
+    optional uint64 fileId = 1;
+    optional uint32 result = 2;
+    optional bytes failMsg = 3;
+    optional bool fileExit = 4;
+    repeated uint32 upIp = 5;
+    repeated uint32 upPort = 6;
+    optional bytes upUkey = 7;
+    optional uint64 fileid = 8;
+    optional uint64 upOffset = 9;
+    optional uint64 blockSize = 10;
+    optional bytes fileKey = 11;
+    optional uint32 channelType = 12;
+    repeated IPv6Info upIp6 = 26;
+    optional bytes clientIp6 = 27;
+  }
+
diff --git a/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.py b/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.py
new file mode 100644
index 00000000..4f02ceba
--- /dev/null
+++ b/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.py
@@ -0,0 +1,225 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: cmd0x388.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0e\x63md0x388.proto\"\xaf\x01\n\tDelImgReq\x12\x0e\n\x06srcUin\x18\x01 \x01(\x04\x12\x0e\n\x06\x64stUin\x18\x02 \x01(\x04\x12\x0f\n\x07reqTerm\x18\x03 \x01(\r\x12\x17\n\x0freqPlatformType\x18\x04 \x01(\r\x12\x0e\n\x06\x62uType\x18\x05 \x01(\r\x12\x10\n\x08\x62uildVer\x18\x06 \x01(\x0c\x12\x11\n\tfileResid\x18\x07 \x01(\x0c\x12\x10\n\x08picWidth\x18\x08 \x01(\r\x12\x11\n\tpicHeight\x18\t \x01(\r\"?\n\tDelImgRsp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x61ilMsg\x18\x02 \x01(\x0c\x12\x11\n\tfileResid\x18\x03 \x01(\x0c\"\"\n\x11\x45xpRoamExtendInfo\x12\r\n\x05resid\x18\x01 \x01(\x0c\"@\n\x0e\x45xpRoamPicInfo\x12\x10\n\x08shopFlag\x18\x01 \x01(\r\x12\r\n\x05pkgId\x18\x02 \x01(\r\x12\r\n\x05picId\x18\x03 \x01(\x0c\"(\n\x15\x45xtensionCommPicTryUp\x12\x0f\n\x07\x65xtinfo\x18\x01 \x03(\x0c\"@\n\x15\x45xtensionExpRoamTryUp\x12\'\n\x0e\x65xproamPicInfo\x18\x01 \x03(\x0b\x32\x0f.ExpRoamPicInfo\"\xca\x03\n\x0cGetImgUrlReq\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0e\n\x06\x64stUin\x18\x02 \x01(\x04\x12\x0e\n\x06\x66ileid\x18\x03 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x04 \x01(\x0c\x12\x0f\n\x07urlFlag\x18\x05 \x01(\r\x12\x0f\n\x07urlType\x18\x06 \x01(\r\x12\x0f\n\x07reqTerm\x18\x07 \x01(\r\x12\x17\n\x0freqPlatformType\x18\x08 \x01(\r\x12\x0f\n\x07innerIp\x18\t \x01(\r\x12\x0e\n\x06\x62uType\x18\n \x01(\r\x12\x10\n\x08\x62uildVer\x18\x0b \x01(\x0c\x12\x0e\n\x06\x66ileId\x18\x0c \x01(\x04\x12\x10\n\x08\x66ileSize\x18\r \x01(\x04\x12\x13\n\x0boriginalPic\x18\x0e \x01(\r\x12\x10\n\x08retryReq\x18\x0f \x01(\r\x12\x12\n\nfileHeight\x18\x10 \x01(\r\x12\x11\n\tfileWidth\x18\x11 \x01(\r\x12\x0f\n\x07picType\x18\x12 \x01(\r\x12\x16\n\x0epicUpTimestamp\x18\x13 \x01(\r\x12\x17\n\x0freqTransferType\x18\x14 \x01(\r\x12\x15\n\rqqmeetGuildId\x18\x15 \x01(\x04\x12\x17\n\x0fqqmeetChannelId\x18\x16 \x01(\x04\x12\x15\n\rdownloadIndex\x18\x17 \x01(\x0c\"\xc6\x03\n\x0cGetImgUrlRsp\x12\x0e\n\x06\x66ileid\x18\x01 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x02 \x01(\x0c\x12\x0e\n\x06result\x18\x03 \x01(\r\x12\x0f\n\x07\x66\x61ilMsg\x18\x04 \x01(\x0c\x12\x19\n\x07imgInfo\x18\x05 \x01(\x0b\x32\x08.ImgInfo\x12\x14\n\x0cthumbDownUrl\x18\x06 \x03(\x0c\x12\x17\n\x0foriginalDownUrl\x18\x07 \x03(\x0c\x12\x12\n\nbigDownUrl\x18\x08 \x03(\x0c\x12\x0e\n\x06\x64ownIp\x18\t \x03(\r\x12\x10\n\x08\x64ownPort\x18\n \x03(\r\x12\x12\n\ndownDomain\x18\x0b \x01(\x0c\x12\x15\n\rthumbDownPara\x18\x0c \x01(\x0c\x12\x18\n\x10originalDownPara\x18\r \x01(\x0c\x12\x13\n\x0b\x62igDownPara\x18\x0e \x01(\x0c\x12\x0e\n\x06\x66ileId\x18\x0f \x01(\x04\x12\x14\n\x0c\x61utoDownType\x18\x10 \x01(\r\x12\x15\n\rorderDownType\x18\x11 \x03(\r\x12\x18\n\x10\x62igThumbDownPara\x18\x13 \x01(\x0c\x12\x14\n\x0chttpsUrlFlag\x18\x14 \x01(\r\x12\x1a\n\x07\x64ownIp6\x18\x1a \x03(\x0b\x32\t.IPv6Info\x12\x11\n\tclientIp6\x18\x1b \x01(\x0c\"\x96\x02\n\x0cGetPttUrlReq\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0e\n\x06\x64stUin\x18\x02 \x01(\x04\x12\x0e\n\x06\x66ileid\x18\x03 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x04 \x01(\x0c\x12\x0f\n\x07reqTerm\x18\x05 \x01(\r\x12\x17\n\x0freqPlatformType\x18\x06 \x01(\r\x12\x0f\n\x07innerIp\x18\x07 \x01(\r\x12\x0e\n\x06\x62uType\x18\x08 \x01(\r\x12\x10\n\x08\x62uildVer\x18\t \x01(\x0c\x12\x0e\n\x06\x66ileId\x18\n \x01(\x04\x12\x0f\n\x07\x66ileKey\x18\x0b \x01(\x0c\x12\r\n\x05\x63odec\x18\x0c \x01(\r\x12\x0c\n\x04\x62uId\x18\r \x01(\r\x12\x17\n\x0freqTransferType\x18\x0e \x01(\r\x12\x0e\n\x06isAuto\x18\x0f \x01(\r\"\xa2\x02\n\x0cGetPttUrlRsp\x12\x0e\n\x06\x66ileid\x18\x01 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x02 \x01(\x0c\x12\x0e\n\x06result\x18\x03 \x01(\r\x12\x0f\n\x07\x66\x61ilMsg\x18\x04 \x01(\x0c\x12\x0f\n\x07\x64ownUrl\x18\x05 \x03(\x0c\x12\x0e\n\x06\x64ownIp\x18\x06 \x03(\r\x12\x10\n\x08\x64ownPort\x18\x07 \x03(\r\x12\x12\n\ndownDomain\x18\x08 \x01(\x0c\x12\x10\n\x08\x64ownPara\x18\t \x01(\x0c\x12\x0e\n\x06\x66ileId\x18\n \x01(\x04\x12\x14\n\x0ctransferType\x18\x0b \x01(\r\x12\x12\n\nallowRetry\x18\x0c \x01(\r\x12\x1a\n\x07\x64ownIp6\x18\x1a \x03(\x0b\x32\t.IPv6Info\x12\x11\n\tclientIp6\x18\x1b \x01(\x0c\x12\x0e\n\x06\x64omain\x18\x1c \x01(\t\"%\n\x08IPv6Info\x12\x0b\n\x03ip6\x18\x01 \x01(\x0c\x12\x0c\n\x04port\x18\x02 \x01(\r\"e\n\x07ImgInfo\x12\x0f\n\x07\x66ileMd5\x18\x01 \x01(\x0c\x12\x10\n\x08\x66ileType\x18\x02 \x01(\r\x12\x10\n\x08\x66ileSize\x18\x03 \x01(\x04\x12\x11\n\tfileWidth\x18\x04 \x01(\r\x12\x12\n\nfileHeight\x18\x05 \x01(\r\"8\n\x07PicSize\x12\x10\n\x08original\x18\x01 \x01(\r\x12\r\n\x05thumb\x18\x02 \x01(\r\x12\x0c\n\x04high\x18\x03 \x01(\r\"\x84\x02\n\x0b\x44\x33\x38\x38ReqBody\x12\x0f\n\x07netType\x18\x01 \x01(\r\x12\x0e\n\x06subcmd\x18\x02 \x01(\r\x12!\n\x0btryupImgReq\x18\x03 \x03(\x0b\x32\x0c.TryUpImgReq\x12#\n\x0cgetimgUrlReq\x18\x04 \x03(\x0b\x32\r.GetImgUrlReq\x12!\n\x0btryupPttReq\x18\x05 \x03(\x0b\x32\x0c.TryUpPttReq\x12#\n\x0cgetpttUrlReq\x18\x06 \x03(\x0b\x32\r.GetPttUrlReq\x12\x11\n\tcommandId\x18\x07 \x01(\r\x12\x1d\n\tdelImgReq\x18\x08 \x03(\x0b\x32\n.DelImgReq\x12\x12\n\textension\x18\xe9\x07 \x01(\x0c\"\xe2\x01\n\x0b\x44\x33\x38\x38RspBody\x12\x10\n\x08\x63lientIp\x18\x01 \x01(\r\x12\x0e\n\x06subcmd\x18\x02 \x01(\r\x12%\n\x0btryupImgRsp\x18\x03 \x03(\x0b\x32\x10.D388TryUpImgRsp\x12#\n\x0cgetimgUrlRsp\x18\x04 \x03(\x0b\x32\r.GetImgUrlRsp\x12!\n\x0btryupPttRsp\x18\x05 \x03(\x0b\x32\x0c.TryUpPttRsp\x12#\n\x0cgetpttUrlRsp\x18\x06 \x03(\x0b\x32\r.GetPttUrlRsp\x12\x1d\n\tdelImgRsp\x18\x07 \x03(\x0b\x32\n.DelImgRsp\"\xa9\x03\n\x0bTryUpImgReq\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0e\n\x06srcUin\x18\x02 \x01(\x04\x12\x0e\n\x06\x66ileId\x18\x03 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x04 \x01(\x0c\x12\x10\n\x08\x66ileSize\x18\x05 \x01(\x04\x12\x10\n\x08\x66ileName\x18\x06 \x01(\x0c\x12\x0f\n\x07srcTerm\x18\x07 \x01(\r\x12\x14\n\x0cplatformType\x18\x08 \x01(\r\x12\x0e\n\x06\x62uType\x18\t \x01(\r\x12\x10\n\x08picWidth\x18\n \x01(\r\x12\x11\n\tpicHeight\x18\x0b \x01(\r\x12\x0f\n\x07picType\x18\x0c \x01(\r\x12\x10\n\x08\x62uildVer\x18\r \x01(\x0c\x12\x0f\n\x07innerIp\x18\x0e \x01(\r\x12\x12\n\nappPicType\x18\x0f \x01(\r\x12\x13\n\x0boriginalPic\x18\x10 \x01(\r\x12\x11\n\tfileIndex\x18\x11 \x01(\x0c\x12\x0e\n\x06\x64stUin\x18\x12 \x01(\x04\x12\x11\n\tsrvUpload\x18\x13 \x01(\r\x12\x13\n\x0btransferUrl\x18\x14 \x01(\x0c\x12\x15\n\rqqmeetGuildId\x18\x15 \x01(\x04\x12\x17\n\x0fqqmeetChannelId\x18\x16 \x01(\x04\"\xcf\x02\n\x0f\x44\x33\x38\x38TryUpImgRsp\x12\x0e\n\x06\x66ileId\x18\x01 \x01(\x04\x12\x0e\n\x06result\x18\x02 \x01(\r\x12\x0f\n\x07\x66\x61ilMsg\x18\x03 \x01(\x0c\x12\x10\n\x08\x66ileExit\x18\x04 \x01(\x08\x12\x19\n\x07imgInfo\x18\x05 \x01(\x0b\x32\x08.ImgInfo\x12\x0c\n\x04upIp\x18\x06 \x03(\r\x12\x0e\n\x06upPort\x18\x07 \x03(\r\x12\x0e\n\x06upUkey\x18\x08 \x01(\x0c\x12\x0e\n\x06\x66ileid\x18\t \x01(\x04\x12\x10\n\x08upOffset\x18\n \x01(\x04\x12\x11\n\tblockSize\x18\x0b \x01(\x04\x12\x12\n\nnewBigChan\x18\x0c \x01(\x08\x12\x18\n\x05upIp6\x18\x1a \x03(\x0b\x32\t.IPv6Info\x12\x11\n\tclientIp6\x18\x1b \x01(\x0c\x12\x15\n\rdownloadIndex\x18\x1c \x01(\x0c\x12#\n\tinfo4Busi\x18\xe9\x07 \x01(\x0b\x32\x0f.TryUpInfo4Busi\"z\n\x0eTryUpInfo4Busi\x12\x12\n\ndownDomain\x18\x01 \x01(\x0c\x12\x14\n\x0cthumbDownUrl\x18\x02 \x01(\x0c\x12\x17\n\x0foriginalDownUrl\x18\x03 \x01(\x0c\x12\x12\n\nbigDownUrl\x18\x04 \x01(\x0c\x12\x11\n\tfileResid\x18\x05 \x01(\x0c\"\xa7\x02\n\x0bTryUpPttReq\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0e\n\x06srcUin\x18\x02 \x01(\x04\x12\x0e\n\x06\x66ileId\x18\x03 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x04 \x01(\x0c\x12\x10\n\x08\x66ileSize\x18\x05 \x01(\x04\x12\x10\n\x08\x66ileName\x18\x06 \x01(\x0c\x12\x0f\n\x07srcTerm\x18\x07 \x01(\r\x12\x14\n\x0cplatformType\x18\x08 \x01(\r\x12\x0e\n\x06\x62uType\x18\t \x01(\r\x12\x10\n\x08\x62uildVer\x18\n \x01(\x0c\x12\x0f\n\x07innerIp\x18\x0b \x01(\r\x12\x13\n\x0bvoiceLength\x18\x0c \x01(\r\x12\x11\n\tnewUpChan\x18\r \x01(\x08\x12\r\n\x05\x63odec\x18\x0e \x01(\r\x12\x11\n\tvoiceType\x18\x0f \x01(\r\x12\x0c\n\x04\x62uId\x18\x10 \x01(\r\"\x86\x02\n\x0bTryUpPttRsp\x12\x0e\n\x06\x66ileId\x18\x01 \x01(\x04\x12\x0e\n\x06result\x18\x02 \x01(\r\x12\x0f\n\x07\x66\x61ilMsg\x18\x03 \x01(\x0c\x12\x10\n\x08\x66ileExit\x18\x04 \x01(\x08\x12\x0c\n\x04upIp\x18\x05 \x03(\r\x12\x0e\n\x06upPort\x18\x06 \x03(\r\x12\x0e\n\x06upUkey\x18\x07 \x01(\x0c\x12\x0e\n\x06\x66ileid\x18\x08 \x01(\x04\x12\x10\n\x08upOffset\x18\t \x01(\x04\x12\x11\n\tblockSize\x18\n \x01(\x04\x12\x0f\n\x07\x66ileKey\x18\x0b \x01(\x0c\x12\x13\n\x0b\x63hannelType\x18\x0c \x01(\r\x12\x18\n\x05upIp6\x18\x1a \x03(\x0b\x32\t.IPv6Info\x12\x11\n\tclientIp6\x18\x1b \x01(\x0c\x42-Z+github.com/Mrs4s/MiraiGo/client/pb/cmd0x388')
+
+
+
+_DELIMGREQ = DESCRIPTOR.message_types_by_name['DelImgReq']
+_DELIMGRSP = DESCRIPTOR.message_types_by_name['DelImgRsp']
+_EXPROAMEXTENDINFO = DESCRIPTOR.message_types_by_name['ExpRoamExtendInfo']
+_EXPROAMPICINFO = DESCRIPTOR.message_types_by_name['ExpRoamPicInfo']
+_EXTENSIONCOMMPICTRYUP = DESCRIPTOR.message_types_by_name['ExtensionCommPicTryUp']
+_EXTENSIONEXPROAMTRYUP = DESCRIPTOR.message_types_by_name['ExtensionExpRoamTryUp']
+_GETIMGURLREQ = DESCRIPTOR.message_types_by_name['GetImgUrlReq']
+_GETIMGURLRSP = DESCRIPTOR.message_types_by_name['GetImgUrlRsp']
+_GETPTTURLREQ = DESCRIPTOR.message_types_by_name['GetPttUrlReq']
+_GETPTTURLRSP = DESCRIPTOR.message_types_by_name['GetPttUrlRsp']
+_IPV6INFO = DESCRIPTOR.message_types_by_name['IPv6Info']
+_IMGINFO = DESCRIPTOR.message_types_by_name['ImgInfo']
+_PICSIZE = DESCRIPTOR.message_types_by_name['PicSize']
+_D388REQBODY = DESCRIPTOR.message_types_by_name['D388ReqBody']
+_D388RSPBODY = DESCRIPTOR.message_types_by_name['D388RspBody']
+_TRYUPIMGREQ = DESCRIPTOR.message_types_by_name['TryUpImgReq']
+_D388TRYUPIMGRSP = DESCRIPTOR.message_types_by_name['D388TryUpImgRsp']
+_TRYUPINFO4BUSI = DESCRIPTOR.message_types_by_name['TryUpInfo4Busi']
+_TRYUPPTTREQ = DESCRIPTOR.message_types_by_name['TryUpPttReq']
+_TRYUPPTTRSP = DESCRIPTOR.message_types_by_name['TryUpPttRsp']
+DelImgReq = _reflection.GeneratedProtocolMessageType('DelImgReq', (_message.Message,), {
+  'DESCRIPTOR' : _DELIMGREQ,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:DelImgReq)
+  })
+_sym_db.RegisterMessage(DelImgReq)
+
+DelImgRsp = _reflection.GeneratedProtocolMessageType('DelImgRsp', (_message.Message,), {
+  'DESCRIPTOR' : _DELIMGRSP,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:DelImgRsp)
+  })
+_sym_db.RegisterMessage(DelImgRsp)
+
+ExpRoamExtendInfo = _reflection.GeneratedProtocolMessageType('ExpRoamExtendInfo', (_message.Message,), {
+  'DESCRIPTOR' : _EXPROAMEXTENDINFO,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:ExpRoamExtendInfo)
+  })
+_sym_db.RegisterMessage(ExpRoamExtendInfo)
+
+ExpRoamPicInfo = _reflection.GeneratedProtocolMessageType('ExpRoamPicInfo', (_message.Message,), {
+  'DESCRIPTOR' : _EXPROAMPICINFO,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:ExpRoamPicInfo)
+  })
+_sym_db.RegisterMessage(ExpRoamPicInfo)
+
+ExtensionCommPicTryUp = _reflection.GeneratedProtocolMessageType('ExtensionCommPicTryUp', (_message.Message,), {
+  'DESCRIPTOR' : _EXTENSIONCOMMPICTRYUP,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:ExtensionCommPicTryUp)
+  })
+_sym_db.RegisterMessage(ExtensionCommPicTryUp)
+
+ExtensionExpRoamTryUp = _reflection.GeneratedProtocolMessageType('ExtensionExpRoamTryUp', (_message.Message,), {
+  'DESCRIPTOR' : _EXTENSIONEXPROAMTRYUP,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:ExtensionExpRoamTryUp)
+  })
+_sym_db.RegisterMessage(ExtensionExpRoamTryUp)
+
+GetImgUrlReq = _reflection.GeneratedProtocolMessageType('GetImgUrlReq', (_message.Message,), {
+  'DESCRIPTOR' : _GETIMGURLREQ,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:GetImgUrlReq)
+  })
+_sym_db.RegisterMessage(GetImgUrlReq)
+
+GetImgUrlRsp = _reflection.GeneratedProtocolMessageType('GetImgUrlRsp', (_message.Message,), {
+  'DESCRIPTOR' : _GETIMGURLRSP,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:GetImgUrlRsp)
+  })
+_sym_db.RegisterMessage(GetImgUrlRsp)
+
+GetPttUrlReq = _reflection.GeneratedProtocolMessageType('GetPttUrlReq', (_message.Message,), {
+  'DESCRIPTOR' : _GETPTTURLREQ,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:GetPttUrlReq)
+  })
+_sym_db.RegisterMessage(GetPttUrlReq)
+
+GetPttUrlRsp = _reflection.GeneratedProtocolMessageType('GetPttUrlRsp', (_message.Message,), {
+  'DESCRIPTOR' : _GETPTTURLRSP,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:GetPttUrlRsp)
+  })
+_sym_db.RegisterMessage(GetPttUrlRsp)
+
+IPv6Info = _reflection.GeneratedProtocolMessageType('IPv6Info', (_message.Message,), {
+  'DESCRIPTOR' : _IPV6INFO,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:IPv6Info)
+  })
+_sym_db.RegisterMessage(IPv6Info)
+
+ImgInfo = _reflection.GeneratedProtocolMessageType('ImgInfo', (_message.Message,), {
+  'DESCRIPTOR' : _IMGINFO,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:ImgInfo)
+  })
+_sym_db.RegisterMessage(ImgInfo)
+
+PicSize = _reflection.GeneratedProtocolMessageType('PicSize', (_message.Message,), {
+  'DESCRIPTOR' : _PICSIZE,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:PicSize)
+  })
+_sym_db.RegisterMessage(PicSize)
+
+D388ReqBody = _reflection.GeneratedProtocolMessageType('D388ReqBody', (_message.Message,), {
+  'DESCRIPTOR' : _D388REQBODY,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:D388ReqBody)
+  })
+_sym_db.RegisterMessage(D388ReqBody)
+
+D388RspBody = _reflection.GeneratedProtocolMessageType('D388RspBody', (_message.Message,), {
+  'DESCRIPTOR' : _D388RSPBODY,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:D388RspBody)
+  })
+_sym_db.RegisterMessage(D388RspBody)
+
+TryUpImgReq = _reflection.GeneratedProtocolMessageType('TryUpImgReq', (_message.Message,), {
+  'DESCRIPTOR' : _TRYUPIMGREQ,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:TryUpImgReq)
+  })
+_sym_db.RegisterMessage(TryUpImgReq)
+
+D388TryUpImgRsp = _reflection.GeneratedProtocolMessageType('D388TryUpImgRsp', (_message.Message,), {
+  'DESCRIPTOR' : _D388TRYUPIMGRSP,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:D388TryUpImgRsp)
+  })
+_sym_db.RegisterMessage(D388TryUpImgRsp)
+
+TryUpInfo4Busi = _reflection.GeneratedProtocolMessageType('TryUpInfo4Busi', (_message.Message,), {
+  'DESCRIPTOR' : _TRYUPINFO4BUSI,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:TryUpInfo4Busi)
+  })
+_sym_db.RegisterMessage(TryUpInfo4Busi)
+
+TryUpPttReq = _reflection.GeneratedProtocolMessageType('TryUpPttReq', (_message.Message,), {
+  'DESCRIPTOR' : _TRYUPPTTREQ,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:TryUpPttReq)
+  })
+_sym_db.RegisterMessage(TryUpPttReq)
+
+TryUpPttRsp = _reflection.GeneratedProtocolMessageType('TryUpPttRsp', (_message.Message,), {
+  'DESCRIPTOR' : _TRYUPPTTRSP,
+  '__module__' : 'cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:TryUpPttRsp)
+  })
+_sym_db.RegisterMessage(TryUpPttRsp)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z+github.com/Mrs4s/MiraiGo/client/pb/cmd0x388'
+  _DELIMGREQ._serialized_start=19
+  _DELIMGREQ._serialized_end=194
+  _DELIMGRSP._serialized_start=196
+  _DELIMGRSP._serialized_end=259
+  _EXPROAMEXTENDINFO._serialized_start=261
+  _EXPROAMEXTENDINFO._serialized_end=295
+  _EXPROAMPICINFO._serialized_start=297
+  _EXPROAMPICINFO._serialized_end=361
+  _EXTENSIONCOMMPICTRYUP._serialized_start=363
+  _EXTENSIONCOMMPICTRYUP._serialized_end=403
+  _EXTENSIONEXPROAMTRYUP._serialized_start=405
+  _EXTENSIONEXPROAMTRYUP._serialized_end=469
+  _GETIMGURLREQ._serialized_start=472
+  _GETIMGURLREQ._serialized_end=930
+  _GETIMGURLRSP._serialized_start=933
+  _GETIMGURLRSP._serialized_end=1387
+  _GETPTTURLREQ._serialized_start=1390
+  _GETPTTURLREQ._serialized_end=1668
+  _GETPTTURLRSP._serialized_start=1671
+  _GETPTTURLRSP._serialized_end=1961
+  _IPV6INFO._serialized_start=1963
+  _IPV6INFO._serialized_end=2000
+  _IMGINFO._serialized_start=2002
+  _IMGINFO._serialized_end=2103
+  _PICSIZE._serialized_start=2105
+  _PICSIZE._serialized_end=2161
+  _D388REQBODY._serialized_start=2164
+  _D388REQBODY._serialized_end=2424
+  _D388RSPBODY._serialized_start=2427
+  _D388RSPBODY._serialized_end=2653
+  _TRYUPIMGREQ._serialized_start=2656
+  _TRYUPIMGREQ._serialized_end=3081
+  _D388TRYUPIMGRSP._serialized_start=3084
+  _D388TRYUPIMGRSP._serialized_end=3419
+  _TRYUPINFO4BUSI._serialized_start=3421
+  _TRYUPINFO4BUSI._serialized_end=3543
+  _TRYUPPTTREQ._serialized_start=3546
+  _TRYUPPTTREQ._serialized_end=3841
+  _TRYUPPTTRSP._serialized_start=3844
+  _TRYUPPTTRSP._serialized_end=4106
+# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.pyi b/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.pyi
new file mode 100644
index 00000000..49ccf026
--- /dev/null
+++ b/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.pyi
@@ -0,0 +1,799 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+from builtins import (
+    bool,
+    bytes,
+    int,
+)
+
+from google.protobuf.descriptor import (
+    Descriptor,
+    FileDescriptor,
+)
+
+from google.protobuf.internal.containers import (
+    RepeatedCompositeFieldContainer,
+    RepeatedScalarFieldContainer,
+)
+
+from google.protobuf.message import (
+    Message,
+)
+
+from typing import (
+    Iterable,
+    Optional,
+    Text,
+)
+
+from typing_extensions import (
+    Literal,
+)
+
+
+DESCRIPTOR: FileDescriptor
+
+class DelImgReq(Message):
+    DESCRIPTOR: Descriptor
+    SRCUIN_FIELD_NUMBER: int
+    DSTUIN_FIELD_NUMBER: int
+    REQTERM_FIELD_NUMBER: int
+    REQPLATFORMTYPE_FIELD_NUMBER: int
+    BUTYPE_FIELD_NUMBER: int
+    BUILDVER_FIELD_NUMBER: int
+    FILERESID_FIELD_NUMBER: int
+    PICWIDTH_FIELD_NUMBER: int
+    PICHEIGHT_FIELD_NUMBER: int
+    srcUin: int
+    dstUin: int
+    reqTerm: int
+    reqPlatformType: int
+    buType: int
+    buildVer: bytes
+    fileResid: bytes
+    picWidth: int
+    picHeight: int
+    def __init__(self,
+        *,
+        srcUin: Optional[int] = ...,
+        dstUin: Optional[int] = ...,
+        reqTerm: Optional[int] = ...,
+        reqPlatformType: Optional[int] = ...,
+        buType: Optional[int] = ...,
+        buildVer: Optional[bytes] = ...,
+        fileResid: Optional[bytes] = ...,
+        picWidth: Optional[int] = ...,
+        picHeight: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["buType",b"buType","buildVer",b"buildVer","dstUin",b"dstUin","fileResid",b"fileResid","picHeight",b"picHeight","picWidth",b"picWidth","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","srcUin",b"srcUin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["buType",b"buType","buildVer",b"buildVer","dstUin",b"dstUin","fileResid",b"fileResid","picHeight",b"picHeight","picWidth",b"picWidth","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","srcUin",b"srcUin"]) -> None: ...
+
+class DelImgRsp(Message):
+    DESCRIPTOR: Descriptor
+    RESULT_FIELD_NUMBER: int
+    FAILMSG_FIELD_NUMBER: int
+    FILERESID_FIELD_NUMBER: int
+    result: int
+    failMsg: bytes
+    fileResid: bytes
+    def __init__(self,
+        *,
+        result: Optional[int] = ...,
+        failMsg: Optional[bytes] = ...,
+        fileResid: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["failMsg",b"failMsg","fileResid",b"fileResid","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["failMsg",b"failMsg","fileResid",b"fileResid","result",b"result"]) -> None: ...
+
+class ExpRoamExtendInfo(Message):
+    DESCRIPTOR: Descriptor
+    RESID_FIELD_NUMBER: int
+    resid: bytes
+    def __init__(self,
+        *,
+        resid: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["resid",b"resid"]) -> bool: ...
+    def ClearField(self, field_name: Literal["resid",b"resid"]) -> None: ...
+
+class ExpRoamPicInfo(Message):
+    DESCRIPTOR: Descriptor
+    SHOPFLAG_FIELD_NUMBER: int
+    PKGID_FIELD_NUMBER: int
+    PICID_FIELD_NUMBER: int
+    shopFlag: int
+    pkgId: int
+    picId: bytes
+    def __init__(self,
+        *,
+        shopFlag: Optional[int] = ...,
+        pkgId: Optional[int] = ...,
+        picId: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["picId",b"picId","pkgId",b"pkgId","shopFlag",b"shopFlag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["picId",b"picId","pkgId",b"pkgId","shopFlag",b"shopFlag"]) -> None: ...
+
+class ExtensionCommPicTryUp(Message):
+    DESCRIPTOR: Descriptor
+    EXTINFO_FIELD_NUMBER: int
+    @property
+    def extinfo(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    def __init__(self,
+        *,
+        extinfo: Optional[Iterable[bytes]] = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["extinfo",b"extinfo"]) -> None: ...
+
+class ExtensionExpRoamTryUp(Message):
+    DESCRIPTOR: Descriptor
+    EXPROAMPICINFO_FIELD_NUMBER: int
+    @property
+    def exproamPicInfo(self) -> RepeatedCompositeFieldContainer[ExpRoamPicInfo]: ...
+    def __init__(self,
+        *,
+        exproamPicInfo: Optional[Iterable[ExpRoamPicInfo]] = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["exproamPicInfo",b"exproamPicInfo"]) -> None: ...
+
+class GetImgUrlReq(Message):
+    DESCRIPTOR: Descriptor
+    GROUPCODE_FIELD_NUMBER: int
+    DSTUIN_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    FILEMD5_FIELD_NUMBER: int
+    URLFLAG_FIELD_NUMBER: int
+    URLTYPE_FIELD_NUMBER: int
+    REQTERM_FIELD_NUMBER: int
+    REQPLATFORMTYPE_FIELD_NUMBER: int
+    INNERIP_FIELD_NUMBER: int
+    BUTYPE_FIELD_NUMBER: int
+    BUILDVER_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    FILESIZE_FIELD_NUMBER: int
+    ORIGINALPIC_FIELD_NUMBER: int
+    RETRYREQ_FIELD_NUMBER: int
+    FILEHEIGHT_FIELD_NUMBER: int
+    FILEWIDTH_FIELD_NUMBER: int
+    PICTYPE_FIELD_NUMBER: int
+    PICUPTIMESTAMP_FIELD_NUMBER: int
+    REQTRANSFERTYPE_FIELD_NUMBER: int
+    QQMEETGUILDID_FIELD_NUMBER: int
+    QQMEETCHANNELID_FIELD_NUMBER: int
+    DOWNLOADINDEX_FIELD_NUMBER: int
+    groupCode: int
+    dstUin: int
+    fileid: int
+    fileMd5: bytes
+    urlFlag: int
+    urlType: int
+    reqTerm: int
+    reqPlatformType: int
+    innerIp: int
+    buType: int
+    buildVer: bytes
+    fileId: int
+    fileSize: int
+    originalPic: int
+    retryReq: int
+    fileHeight: int
+    fileWidth: int
+    picType: int
+    picUpTimestamp: int
+    reqTransferType: int
+    qqmeetGuildId: int
+    qqmeetChannelId: int
+    downloadIndex: bytes
+    def __init__(self,
+        *,
+        groupCode: Optional[int] = ...,
+        dstUin: Optional[int] = ...,
+        fileid: Optional[int] = ...,
+        fileMd5: Optional[bytes] = ...,
+        urlFlag: Optional[int] = ...,
+        urlType: Optional[int] = ...,
+        reqTerm: Optional[int] = ...,
+        reqPlatformType: Optional[int] = ...,
+        innerIp: Optional[int] = ...,
+        buType: Optional[int] = ...,
+        buildVer: Optional[bytes] = ...,
+        fileId: Optional[int] = ...,
+        fileSize: Optional[int] = ...,
+        originalPic: Optional[int] = ...,
+        retryReq: Optional[int] = ...,
+        fileHeight: Optional[int] = ...,
+        fileWidth: Optional[int] = ...,
+        picType: Optional[int] = ...,
+        picUpTimestamp: Optional[int] = ...,
+        reqTransferType: Optional[int] = ...,
+        qqmeetGuildId: Optional[int] = ...,
+        qqmeetChannelId: Optional[int] = ...,
+        downloadIndex: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["buType",b"buType","buildVer",b"buildVer","downloadIndex",b"downloadIndex","dstUin",b"dstUin","fileHeight",b"fileHeight","fileId",b"fileId","fileMd5",b"fileMd5","fileSize",b"fileSize","fileWidth",b"fileWidth","fileid",b"fileid","groupCode",b"groupCode","innerIp",b"innerIp","originalPic",b"originalPic","picType",b"picType","picUpTimestamp",b"picUpTimestamp","qqmeetChannelId",b"qqmeetChannelId","qqmeetGuildId",b"qqmeetGuildId","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","reqTransferType",b"reqTransferType","retryReq",b"retryReq","urlFlag",b"urlFlag","urlType",b"urlType"]) -> bool: ...
+    def ClearField(self, field_name: Literal["buType",b"buType","buildVer",b"buildVer","downloadIndex",b"downloadIndex","dstUin",b"dstUin","fileHeight",b"fileHeight","fileId",b"fileId","fileMd5",b"fileMd5","fileSize",b"fileSize","fileWidth",b"fileWidth","fileid",b"fileid","groupCode",b"groupCode","innerIp",b"innerIp","originalPic",b"originalPic","picType",b"picType","picUpTimestamp",b"picUpTimestamp","qqmeetChannelId",b"qqmeetChannelId","qqmeetGuildId",b"qqmeetGuildId","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","reqTransferType",b"reqTransferType","retryReq",b"retryReq","urlFlag",b"urlFlag","urlType",b"urlType"]) -> None: ...
+
+class GetImgUrlRsp(Message):
+    DESCRIPTOR: Descriptor
+    FILEID_FIELD_NUMBER: int
+    FILEMD5_FIELD_NUMBER: int
+    RESULT_FIELD_NUMBER: int
+    FAILMSG_FIELD_NUMBER: int
+    IMGINFO_FIELD_NUMBER: int
+    THUMBDOWNURL_FIELD_NUMBER: int
+    ORIGINALDOWNURL_FIELD_NUMBER: int
+    BIGDOWNURL_FIELD_NUMBER: int
+    DOWNIP_FIELD_NUMBER: int
+    DOWNPORT_FIELD_NUMBER: int
+    DOWNDOMAIN_FIELD_NUMBER: int
+    THUMBDOWNPARA_FIELD_NUMBER: int
+    ORIGINALDOWNPARA_FIELD_NUMBER: int
+    BIGDOWNPARA_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    AUTODOWNTYPE_FIELD_NUMBER: int
+    ORDERDOWNTYPE_FIELD_NUMBER: int
+    BIGTHUMBDOWNPARA_FIELD_NUMBER: int
+    HTTPSURLFLAG_FIELD_NUMBER: int
+    DOWNIP6_FIELD_NUMBER: int
+    CLIENTIP6_FIELD_NUMBER: int
+    fileid: int
+    fileMd5: bytes
+    result: int
+    failMsg: bytes
+    @property
+    def imgInfo(self) -> ImgInfo: ...
+    @property
+    def thumbDownUrl(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    @property
+    def originalDownUrl(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    @property
+    def bigDownUrl(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    @property
+    def downIp(self) -> RepeatedScalarFieldContainer[int]: ...
+    @property
+    def downPort(self) -> RepeatedScalarFieldContainer[int]: ...
+    downDomain: bytes
+    thumbDownPara: bytes
+    originalDownPara: bytes
+    bigDownPara: bytes
+    fileId: int
+    autoDownType: int
+    @property
+    def orderDownType(self) -> RepeatedScalarFieldContainer[int]: ...
+    bigThumbDownPara: bytes
+    httpsUrlFlag: int
+    @property
+    def downIp6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
+    clientIp6: bytes
+    def __init__(self,
+        *,
+        fileid: Optional[int] = ...,
+        fileMd5: Optional[bytes] = ...,
+        result: Optional[int] = ...,
+        failMsg: Optional[bytes] = ...,
+        imgInfo: Optional[ImgInfo] = ...,
+        thumbDownUrl: Optional[Iterable[bytes]] = ...,
+        originalDownUrl: Optional[Iterable[bytes]] = ...,
+        bigDownUrl: Optional[Iterable[bytes]] = ...,
+        downIp: Optional[Iterable[int]] = ...,
+        downPort: Optional[Iterable[int]] = ...,
+        downDomain: Optional[bytes] = ...,
+        thumbDownPara: Optional[bytes] = ...,
+        originalDownPara: Optional[bytes] = ...,
+        bigDownPara: Optional[bytes] = ...,
+        fileId: Optional[int] = ...,
+        autoDownType: Optional[int] = ...,
+        orderDownType: Optional[Iterable[int]] = ...,
+        bigThumbDownPara: Optional[bytes] = ...,
+        httpsUrlFlag: Optional[int] = ...,
+        downIp6: Optional[Iterable[IPv6Info]] = ...,
+        clientIp6: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["autoDownType",b"autoDownType","bigDownPara",b"bigDownPara","bigThumbDownPara",b"bigThumbDownPara","clientIp6",b"clientIp6","downDomain",b"downDomain","failMsg",b"failMsg","fileId",b"fileId","fileMd5",b"fileMd5","fileid",b"fileid","httpsUrlFlag",b"httpsUrlFlag","imgInfo",b"imgInfo","originalDownPara",b"originalDownPara","result",b"result","thumbDownPara",b"thumbDownPara"]) -> bool: ...
+    def ClearField(self, field_name: Literal["autoDownType",b"autoDownType","bigDownPara",b"bigDownPara","bigDownUrl",b"bigDownUrl","bigThumbDownPara",b"bigThumbDownPara","clientIp6",b"clientIp6","downDomain",b"downDomain","downIp",b"downIp","downIp6",b"downIp6","downPort",b"downPort","failMsg",b"failMsg","fileId",b"fileId","fileMd5",b"fileMd5","fileid",b"fileid","httpsUrlFlag",b"httpsUrlFlag","imgInfo",b"imgInfo","orderDownType",b"orderDownType","originalDownPara",b"originalDownPara","originalDownUrl",b"originalDownUrl","result",b"result","thumbDownPara",b"thumbDownPara","thumbDownUrl",b"thumbDownUrl"]) -> None: ...
+
+class GetPttUrlReq(Message):
+    DESCRIPTOR: Descriptor
+    GROUPCODE_FIELD_NUMBER: int
+    DSTUIN_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    FILEMD5_FIELD_NUMBER: int
+    REQTERM_FIELD_NUMBER: int
+    REQPLATFORMTYPE_FIELD_NUMBER: int
+    INNERIP_FIELD_NUMBER: int
+    BUTYPE_FIELD_NUMBER: int
+    BUILDVER_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    FILEKEY_FIELD_NUMBER: int
+    CODEC_FIELD_NUMBER: int
+    BUID_FIELD_NUMBER: int
+    REQTRANSFERTYPE_FIELD_NUMBER: int
+    ISAUTO_FIELD_NUMBER: int
+    groupCode: int
+    dstUin: int
+    fileid: int
+    fileMd5: bytes
+    reqTerm: int
+    reqPlatformType: int
+    innerIp: int
+    buType: int
+    buildVer: bytes
+    fileId: int
+    fileKey: bytes
+    codec: int
+    buId: int
+    reqTransferType: int
+    isAuto: int
+    def __init__(self,
+        *,
+        groupCode: Optional[int] = ...,
+        dstUin: Optional[int] = ...,
+        fileid: Optional[int] = ...,
+        fileMd5: Optional[bytes] = ...,
+        reqTerm: Optional[int] = ...,
+        reqPlatformType: Optional[int] = ...,
+        innerIp: Optional[int] = ...,
+        buType: Optional[int] = ...,
+        buildVer: Optional[bytes] = ...,
+        fileId: Optional[int] = ...,
+        fileKey: Optional[bytes] = ...,
+        codec: Optional[int] = ...,
+        buId: Optional[int] = ...,
+        reqTransferType: Optional[int] = ...,
+        isAuto: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["buId",b"buId","buType",b"buType","buildVer",b"buildVer","codec",b"codec","dstUin",b"dstUin","fileId",b"fileId","fileKey",b"fileKey","fileMd5",b"fileMd5","fileid",b"fileid","groupCode",b"groupCode","innerIp",b"innerIp","isAuto",b"isAuto","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","reqTransferType",b"reqTransferType"]) -> bool: ...
+    def ClearField(self, field_name: Literal["buId",b"buId","buType",b"buType","buildVer",b"buildVer","codec",b"codec","dstUin",b"dstUin","fileId",b"fileId","fileKey",b"fileKey","fileMd5",b"fileMd5","fileid",b"fileid","groupCode",b"groupCode","innerIp",b"innerIp","isAuto",b"isAuto","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","reqTransferType",b"reqTransferType"]) -> None: ...
+
+class GetPttUrlRsp(Message):
+    DESCRIPTOR: Descriptor
+    FILEID_FIELD_NUMBER: int
+    FILEMD5_FIELD_NUMBER: int
+    RESULT_FIELD_NUMBER: int
+    FAILMSG_FIELD_NUMBER: int
+    DOWNURL_FIELD_NUMBER: int
+    DOWNIP_FIELD_NUMBER: int
+    DOWNPORT_FIELD_NUMBER: int
+    DOWNDOMAIN_FIELD_NUMBER: int
+    DOWNPARA_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    TRANSFERTYPE_FIELD_NUMBER: int
+    ALLOWRETRY_FIELD_NUMBER: int
+    DOWNIP6_FIELD_NUMBER: int
+    CLIENTIP6_FIELD_NUMBER: int
+    DOMAIN_FIELD_NUMBER: int
+    fileid: int
+    fileMd5: bytes
+    result: int
+    failMsg: bytes
+    @property
+    def downUrl(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    @property
+    def downIp(self) -> RepeatedScalarFieldContainer[int]: ...
+    @property
+    def downPort(self) -> RepeatedScalarFieldContainer[int]: ...
+    downDomain: bytes
+    downPara: bytes
+    fileId: int
+    transferType: int
+    allowRetry: int
+    @property
+    def downIp6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
+    clientIp6: bytes
+    domain: Text
+    def __init__(self,
+        *,
+        fileid: Optional[int] = ...,
+        fileMd5: Optional[bytes] = ...,
+        result: Optional[int] = ...,
+        failMsg: Optional[bytes] = ...,
+        downUrl: Optional[Iterable[bytes]] = ...,
+        downIp: Optional[Iterable[int]] = ...,
+        downPort: Optional[Iterable[int]] = ...,
+        downDomain: Optional[bytes] = ...,
+        downPara: Optional[bytes] = ...,
+        fileId: Optional[int] = ...,
+        transferType: Optional[int] = ...,
+        allowRetry: Optional[int] = ...,
+        downIp6: Optional[Iterable[IPv6Info]] = ...,
+        clientIp6: Optional[bytes] = ...,
+        domain: Optional[Text] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["allowRetry",b"allowRetry","clientIp6",b"clientIp6","domain",b"domain","downDomain",b"downDomain","downPara",b"downPara","failMsg",b"failMsg","fileId",b"fileId","fileMd5",b"fileMd5","fileid",b"fileid","result",b"result","transferType",b"transferType"]) -> bool: ...
+    def ClearField(self, field_name: Literal["allowRetry",b"allowRetry","clientIp6",b"clientIp6","domain",b"domain","downDomain",b"downDomain","downIp",b"downIp","downIp6",b"downIp6","downPara",b"downPara","downPort",b"downPort","downUrl",b"downUrl","failMsg",b"failMsg","fileId",b"fileId","fileMd5",b"fileMd5","fileid",b"fileid","result",b"result","transferType",b"transferType"]) -> None: ...
+
+class IPv6Info(Message):
+    DESCRIPTOR: Descriptor
+    IP6_FIELD_NUMBER: int
+    PORT_FIELD_NUMBER: int
+    ip6: bytes
+    port: int
+    def __init__(self,
+        *,
+        ip6: Optional[bytes] = ...,
+        port: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["ip6",b"ip6","port",b"port"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ip6",b"ip6","port",b"port"]) -> None: ...
+
+class ImgInfo(Message):
+    DESCRIPTOR: Descriptor
+    FILEMD5_FIELD_NUMBER: int
+    FILETYPE_FIELD_NUMBER: int
+    FILESIZE_FIELD_NUMBER: int
+    FILEWIDTH_FIELD_NUMBER: int
+    FILEHEIGHT_FIELD_NUMBER: int
+    fileMd5: bytes
+    fileType: int
+    fileSize: int
+    fileWidth: int
+    fileHeight: int
+    def __init__(self,
+        *,
+        fileMd5: Optional[bytes] = ...,
+        fileType: Optional[int] = ...,
+        fileSize: Optional[int] = ...,
+        fileWidth: Optional[int] = ...,
+        fileHeight: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["fileHeight",b"fileHeight","fileMd5",b"fileMd5","fileSize",b"fileSize","fileType",b"fileType","fileWidth",b"fileWidth"]) -> bool: ...
+    def ClearField(self, field_name: Literal["fileHeight",b"fileHeight","fileMd5",b"fileMd5","fileSize",b"fileSize","fileType",b"fileType","fileWidth",b"fileWidth"]) -> None: ...
+
+class PicSize(Message):
+    DESCRIPTOR: Descriptor
+    ORIGINAL_FIELD_NUMBER: int
+    THUMB_FIELD_NUMBER: int
+    HIGH_FIELD_NUMBER: int
+    original: int
+    thumb: int
+    high: int
+    def __init__(self,
+        *,
+        original: Optional[int] = ...,
+        thumb: Optional[int] = ...,
+        high: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["high",b"high","original",b"original","thumb",b"thumb"]) -> bool: ...
+    def ClearField(self, field_name: Literal["high",b"high","original",b"original","thumb",b"thumb"]) -> None: ...
+
+class D388ReqBody(Message):
+    DESCRIPTOR: Descriptor
+    NETTYPE_FIELD_NUMBER: int
+    SUBCMD_FIELD_NUMBER: int
+    TRYUPIMGREQ_FIELD_NUMBER: int
+    GETIMGURLREQ_FIELD_NUMBER: int
+    TRYUPPTTREQ_FIELD_NUMBER: int
+    GETPTTURLREQ_FIELD_NUMBER: int
+    COMMANDID_FIELD_NUMBER: int
+    DELIMGREQ_FIELD_NUMBER: int
+    EXTENSION_FIELD_NUMBER: int
+    netType: int
+    subcmd: int
+    @property
+    def tryupImgReq(self) -> RepeatedCompositeFieldContainer[TryUpImgReq]: ...
+    @property
+    def getimgUrlReq(self) -> RepeatedCompositeFieldContainer[GetImgUrlReq]: ...
+    @property
+    def tryupPttReq(self) -> RepeatedCompositeFieldContainer[TryUpPttReq]: ...
+    @property
+    def getpttUrlReq(self) -> RepeatedCompositeFieldContainer[GetPttUrlReq]: ...
+    commandId: int
+    @property
+    def delImgReq(self) -> RepeatedCompositeFieldContainer[DelImgReq]: ...
+    extension: bytes
+    def __init__(self,
+        *,
+        netType: Optional[int] = ...,
+        subcmd: Optional[int] = ...,
+        tryupImgReq: Optional[Iterable[TryUpImgReq]] = ...,
+        getimgUrlReq: Optional[Iterable[GetImgUrlReq]] = ...,
+        tryupPttReq: Optional[Iterable[TryUpPttReq]] = ...,
+        getpttUrlReq: Optional[Iterable[GetPttUrlReq]] = ...,
+        commandId: Optional[int] = ...,
+        delImgReq: Optional[Iterable[DelImgReq]] = ...,
+        extension: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["commandId",b"commandId","extension",b"extension","netType",b"netType","subcmd",b"subcmd"]) -> bool: ...
+    def ClearField(self, field_name: Literal["commandId",b"commandId","delImgReq",b"delImgReq","extension",b"extension","getimgUrlReq",b"getimgUrlReq","getpttUrlReq",b"getpttUrlReq","netType",b"netType","subcmd",b"subcmd","tryupImgReq",b"tryupImgReq","tryupPttReq",b"tryupPttReq"]) -> None: ...
+
+class D388RspBody(Message):
+    DESCRIPTOR: Descriptor
+    CLIENTIP_FIELD_NUMBER: int
+    SUBCMD_FIELD_NUMBER: int
+    TRYUPIMGRSP_FIELD_NUMBER: int
+    GETIMGURLRSP_FIELD_NUMBER: int
+    TRYUPPTTRSP_FIELD_NUMBER: int
+    GETPTTURLRSP_FIELD_NUMBER: int
+    DELIMGRSP_FIELD_NUMBER: int
+    clientIp: int
+    subcmd: int
+    @property
+    def tryupImgRsp(self) -> RepeatedCompositeFieldContainer[D388TryUpImgRsp]: ...
+    @property
+    def getimgUrlRsp(self) -> RepeatedCompositeFieldContainer[GetImgUrlRsp]: ...
+    @property
+    def tryupPttRsp(self) -> RepeatedCompositeFieldContainer[TryUpPttRsp]: ...
+    @property
+    def getpttUrlRsp(self) -> RepeatedCompositeFieldContainer[GetPttUrlRsp]: ...
+    @property
+    def delImgRsp(self) -> RepeatedCompositeFieldContainer[DelImgRsp]: ...
+    def __init__(self,
+        *,
+        clientIp: Optional[int] = ...,
+        subcmd: Optional[int] = ...,
+        tryupImgRsp: Optional[Iterable[D388TryUpImgRsp]] = ...,
+        getimgUrlRsp: Optional[Iterable[GetImgUrlRsp]] = ...,
+        tryupPttRsp: Optional[Iterable[TryUpPttRsp]] = ...,
+        getpttUrlRsp: Optional[Iterable[GetPttUrlRsp]] = ...,
+        delImgRsp: Optional[Iterable[DelImgRsp]] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["clientIp",b"clientIp","subcmd",b"subcmd"]) -> bool: ...
+    def ClearField(self, field_name: Literal["clientIp",b"clientIp","delImgRsp",b"delImgRsp","getimgUrlRsp",b"getimgUrlRsp","getpttUrlRsp",b"getpttUrlRsp","subcmd",b"subcmd","tryupImgRsp",b"tryupImgRsp","tryupPttRsp",b"tryupPttRsp"]) -> None: ...
+
+class TryUpImgReq(Message):
+    DESCRIPTOR: Descriptor
+    GROUPCODE_FIELD_NUMBER: int
+    SRCUIN_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    FILEMD5_FIELD_NUMBER: int
+    FILESIZE_FIELD_NUMBER: int
+    FILENAME_FIELD_NUMBER: int
+    SRCTERM_FIELD_NUMBER: int
+    PLATFORMTYPE_FIELD_NUMBER: int
+    BUTYPE_FIELD_NUMBER: int
+    PICWIDTH_FIELD_NUMBER: int
+    PICHEIGHT_FIELD_NUMBER: int
+    PICTYPE_FIELD_NUMBER: int
+    BUILDVER_FIELD_NUMBER: int
+    INNERIP_FIELD_NUMBER: int
+    APPPICTYPE_FIELD_NUMBER: int
+    ORIGINALPIC_FIELD_NUMBER: int
+    FILEINDEX_FIELD_NUMBER: int
+    DSTUIN_FIELD_NUMBER: int
+    SRVUPLOAD_FIELD_NUMBER: int
+    TRANSFERURL_FIELD_NUMBER: int
+    QQMEETGUILDID_FIELD_NUMBER: int
+    QQMEETCHANNELID_FIELD_NUMBER: int
+    groupCode: int
+    srcUin: int
+    fileId: int
+    fileMd5: bytes
+    fileSize: int
+    fileName: bytes
+    srcTerm: int
+    platformType: int
+    buType: int
+    picWidth: int
+    picHeight: int
+    picType: int
+    buildVer: bytes
+    innerIp: int
+    appPicType: int
+    originalPic: int
+    fileIndex: bytes
+    dstUin: int
+    srvUpload: int
+    transferUrl: bytes
+    qqmeetGuildId: int
+    qqmeetChannelId: int
+    def __init__(self,
+        *,
+        groupCode: Optional[int] = ...,
+        srcUin: Optional[int] = ...,
+        fileId: Optional[int] = ...,
+        fileMd5: Optional[bytes] = ...,
+        fileSize: Optional[int] = ...,
+        fileName: Optional[bytes] = ...,
+        srcTerm: Optional[int] = ...,
+        platformType: Optional[int] = ...,
+        buType: Optional[int] = ...,
+        picWidth: Optional[int] = ...,
+        picHeight: Optional[int] = ...,
+        picType: Optional[int] = ...,
+        buildVer: Optional[bytes] = ...,
+        innerIp: Optional[int] = ...,
+        appPicType: Optional[int] = ...,
+        originalPic: Optional[int] = ...,
+        fileIndex: Optional[bytes] = ...,
+        dstUin: Optional[int] = ...,
+        srvUpload: Optional[int] = ...,
+        transferUrl: Optional[bytes] = ...,
+        qqmeetGuildId: Optional[int] = ...,
+        qqmeetChannelId: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["appPicType",b"appPicType","buType",b"buType","buildVer",b"buildVer","dstUin",b"dstUin","fileId",b"fileId","fileIndex",b"fileIndex","fileMd5",b"fileMd5","fileName",b"fileName","fileSize",b"fileSize","groupCode",b"groupCode","innerIp",b"innerIp","originalPic",b"originalPic","picHeight",b"picHeight","picType",b"picType","picWidth",b"picWidth","platformType",b"platformType","qqmeetChannelId",b"qqmeetChannelId","qqmeetGuildId",b"qqmeetGuildId","srcTerm",b"srcTerm","srcUin",b"srcUin","srvUpload",b"srvUpload","transferUrl",b"transferUrl"]) -> bool: ...
+    def ClearField(self, field_name: Literal["appPicType",b"appPicType","buType",b"buType","buildVer",b"buildVer","dstUin",b"dstUin","fileId",b"fileId","fileIndex",b"fileIndex","fileMd5",b"fileMd5","fileName",b"fileName","fileSize",b"fileSize","groupCode",b"groupCode","innerIp",b"innerIp","originalPic",b"originalPic","picHeight",b"picHeight","picType",b"picType","picWidth",b"picWidth","platformType",b"platformType","qqmeetChannelId",b"qqmeetChannelId","qqmeetGuildId",b"qqmeetGuildId","srcTerm",b"srcTerm","srcUin",b"srcUin","srvUpload",b"srvUpload","transferUrl",b"transferUrl"]) -> None: ...
+
+class D388TryUpImgRsp(Message):
+    DESCRIPTOR: Descriptor
+    FILEID_FIELD_NUMBER: int
+    RESULT_FIELD_NUMBER: int
+    FAILMSG_FIELD_NUMBER: int
+    FILEEXIT_FIELD_NUMBER: int
+    IMGINFO_FIELD_NUMBER: int
+    UPIP_FIELD_NUMBER: int
+    UPPORT_FIELD_NUMBER: int
+    UPUKEY_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    UPOFFSET_FIELD_NUMBER: int
+    BLOCKSIZE_FIELD_NUMBER: int
+    NEWBIGCHAN_FIELD_NUMBER: int
+    UPIP6_FIELD_NUMBER: int
+    CLIENTIP6_FIELD_NUMBER: int
+    DOWNLOADINDEX_FIELD_NUMBER: int
+    INFO4BUSI_FIELD_NUMBER: int
+    fileId: int
+    result: int
+    failMsg: bytes
+    fileExit: bool
+    @property
+    def imgInfo(self) -> ImgInfo: ...
+    @property
+    def upIp(self) -> RepeatedScalarFieldContainer[int]: ...
+    @property
+    def upPort(self) -> RepeatedScalarFieldContainer[int]: ...
+    upUkey: bytes
+    fileid: int
+    upOffset: int
+    blockSize: int
+    newBigChan: bool
+    @property
+    def upIp6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
+    clientIp6: bytes
+    downloadIndex: bytes
+    @property
+    def info4Busi(self) -> TryUpInfo4Busi: ...
+    def __init__(self,
+        *,
+        fileId: Optional[int] = ...,
+        result: Optional[int] = ...,
+        failMsg: Optional[bytes] = ...,
+        fileExit: Optional[bool] = ...,
+        imgInfo: Optional[ImgInfo] = ...,
+        upIp: Optional[Iterable[int]] = ...,
+        upPort: Optional[Iterable[int]] = ...,
+        upUkey: Optional[bytes] = ...,
+        fileid: Optional[int] = ...,
+        upOffset: Optional[int] = ...,
+        blockSize: Optional[int] = ...,
+        newBigChan: Optional[bool] = ...,
+        upIp6: Optional[Iterable[IPv6Info]] = ...,
+        clientIp6: Optional[bytes] = ...,
+        downloadIndex: Optional[bytes] = ...,
+        info4Busi: Optional[TryUpInfo4Busi] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["blockSize",b"blockSize","clientIp6",b"clientIp6","downloadIndex",b"downloadIndex","failMsg",b"failMsg","fileExit",b"fileExit","fileId",b"fileId","fileid",b"fileid","imgInfo",b"imgInfo","info4Busi",b"info4Busi","newBigChan",b"newBigChan","result",b"result","upOffset",b"upOffset","upUkey",b"upUkey"]) -> bool: ...
+    def ClearField(self, field_name: Literal["blockSize",b"blockSize","clientIp6",b"clientIp6","downloadIndex",b"downloadIndex","failMsg",b"failMsg","fileExit",b"fileExit","fileId",b"fileId","fileid",b"fileid","imgInfo",b"imgInfo","info4Busi",b"info4Busi","newBigChan",b"newBigChan","result",b"result","upIp",b"upIp","upIp6",b"upIp6","upOffset",b"upOffset","upPort",b"upPort","upUkey",b"upUkey"]) -> None: ...
+
+class TryUpInfo4Busi(Message):
+    DESCRIPTOR: Descriptor
+    DOWNDOMAIN_FIELD_NUMBER: int
+    THUMBDOWNURL_FIELD_NUMBER: int
+    ORIGINALDOWNURL_FIELD_NUMBER: int
+    BIGDOWNURL_FIELD_NUMBER: int
+    FILERESID_FIELD_NUMBER: int
+    downDomain: bytes
+    thumbDownUrl: bytes
+    originalDownUrl: bytes
+    bigDownUrl: bytes
+    fileResid: bytes
+    def __init__(self,
+        *,
+        downDomain: Optional[bytes] = ...,
+        thumbDownUrl: Optional[bytes] = ...,
+        originalDownUrl: Optional[bytes] = ...,
+        bigDownUrl: Optional[bytes] = ...,
+        fileResid: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["bigDownUrl",b"bigDownUrl","downDomain",b"downDomain","fileResid",b"fileResid","originalDownUrl",b"originalDownUrl","thumbDownUrl",b"thumbDownUrl"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bigDownUrl",b"bigDownUrl","downDomain",b"downDomain","fileResid",b"fileResid","originalDownUrl",b"originalDownUrl","thumbDownUrl",b"thumbDownUrl"]) -> None: ...
+
+class TryUpPttReq(Message):
+    DESCRIPTOR: Descriptor
+    GROUPCODE_FIELD_NUMBER: int
+    SRCUIN_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    FILEMD5_FIELD_NUMBER: int
+    FILESIZE_FIELD_NUMBER: int
+    FILENAME_FIELD_NUMBER: int
+    SRCTERM_FIELD_NUMBER: int
+    PLATFORMTYPE_FIELD_NUMBER: int
+    BUTYPE_FIELD_NUMBER: int
+    BUILDVER_FIELD_NUMBER: int
+    INNERIP_FIELD_NUMBER: int
+    VOICELENGTH_FIELD_NUMBER: int
+    NEWUPCHAN_FIELD_NUMBER: int
+    CODEC_FIELD_NUMBER: int
+    VOICETYPE_FIELD_NUMBER: int
+    BUID_FIELD_NUMBER: int
+    groupCode: int
+    srcUin: int
+    fileId: int
+    fileMd5: bytes
+    fileSize: int
+    fileName: bytes
+    srcTerm: int
+    platformType: int
+    buType: int
+    buildVer: bytes
+    innerIp: int
+    voiceLength: int
+    newUpChan: bool
+    codec: int
+    voiceType: int
+    buId: int
+    def __init__(self,
+        *,
+        groupCode: Optional[int] = ...,
+        srcUin: Optional[int] = ...,
+        fileId: Optional[int] = ...,
+        fileMd5: Optional[bytes] = ...,
+        fileSize: Optional[int] = ...,
+        fileName: Optional[bytes] = ...,
+        srcTerm: Optional[int] = ...,
+        platformType: Optional[int] = ...,
+        buType: Optional[int] = ...,
+        buildVer: Optional[bytes] = ...,
+        innerIp: Optional[int] = ...,
+        voiceLength: Optional[int] = ...,
+        newUpChan: Optional[bool] = ...,
+        codec: Optional[int] = ...,
+        voiceType: Optional[int] = ...,
+        buId: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["buId",b"buId","buType",b"buType","buildVer",b"buildVer","codec",b"codec","fileId",b"fileId","fileMd5",b"fileMd5","fileName",b"fileName","fileSize",b"fileSize","groupCode",b"groupCode","innerIp",b"innerIp","newUpChan",b"newUpChan","platformType",b"platformType","srcTerm",b"srcTerm","srcUin",b"srcUin","voiceLength",b"voiceLength","voiceType",b"voiceType"]) -> bool: ...
+    def ClearField(self, field_name: Literal["buId",b"buId","buType",b"buType","buildVer",b"buildVer","codec",b"codec","fileId",b"fileId","fileMd5",b"fileMd5","fileName",b"fileName","fileSize",b"fileSize","groupCode",b"groupCode","innerIp",b"innerIp","newUpChan",b"newUpChan","platformType",b"platformType","srcTerm",b"srcTerm","srcUin",b"srcUin","voiceLength",b"voiceLength","voiceType",b"voiceType"]) -> None: ...
+
+class TryUpPttRsp(Message):
+    DESCRIPTOR: Descriptor
+    FILEID_FIELD_NUMBER: int
+    RESULT_FIELD_NUMBER: int
+    FAILMSG_FIELD_NUMBER: int
+    FILEEXIT_FIELD_NUMBER: int
+    UPIP_FIELD_NUMBER: int
+    UPPORT_FIELD_NUMBER: int
+    UPUKEY_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    UPOFFSET_FIELD_NUMBER: int
+    BLOCKSIZE_FIELD_NUMBER: int
+    FILEKEY_FIELD_NUMBER: int
+    CHANNELTYPE_FIELD_NUMBER: int
+    UPIP6_FIELD_NUMBER: int
+    CLIENTIP6_FIELD_NUMBER: int
+    fileId: int
+    result: int
+    failMsg: bytes
+    fileExit: bool
+    @property
+    def upIp(self) -> RepeatedScalarFieldContainer[int]: ...
+    @property
+    def upPort(self) -> RepeatedScalarFieldContainer[int]: ...
+    upUkey: bytes
+    fileid: int
+    upOffset: int
+    blockSize: int
+    fileKey: bytes
+    channelType: int
+    @property
+    def upIp6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
+    clientIp6: bytes
+    def __init__(self,
+        *,
+        fileId: Optional[int] = ...,
+        result: Optional[int] = ...,
+        failMsg: Optional[bytes] = ...,
+        fileExit: Optional[bool] = ...,
+        upIp: Optional[Iterable[int]] = ...,
+        upPort: Optional[Iterable[int]] = ...,
+        upUkey: Optional[bytes] = ...,
+        fileid: Optional[int] = ...,
+        upOffset: Optional[int] = ...,
+        blockSize: Optional[int] = ...,
+        fileKey: Optional[bytes] = ...,
+        channelType: Optional[int] = ...,
+        upIp6: Optional[Iterable[IPv6Info]] = ...,
+        clientIp6: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["blockSize",b"blockSize","channelType",b"channelType","clientIp6",b"clientIp6","failMsg",b"failMsg","fileExit",b"fileExit","fileId",b"fileId","fileKey",b"fileKey","fileid",b"fileid","result",b"result","upOffset",b"upOffset","upUkey",b"upUkey"]) -> bool: ...
+    def ClearField(self, field_name: Literal["blockSize",b"blockSize","channelType",b"channelType","clientIp6",b"clientIp6","failMsg",b"failMsg","fileExit",b"fileExit","fileId",b"fileId","fileKey",b"fileKey","fileid",b"fileid","result",b"result","upIp",b"upIp","upIp6",b"upIp6","upOffset",b"upOffset","upPort",b"upPort","upUkey",b"upUkey"]) -> None: ...

From 0d452b51ef64cd056242f06ca9b26857a427b384 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Mon, 21 Mar 2022 23:57:45 +0800
Subject: [PATCH 024/113] sync changes

---
 cai/api/client.py                    |  11 +-
 cai/client/client.py                 |   6 +-
 cai/client/highway.py                | 162 +++++++++++++++++++++++++--
 cai/client/message_service/models.py |   4 +-
 cai/client/message_service/upload.py |  29 +++++
 cai/client/multi_msg/long_msg.py     |   5 +-
 examples/login.py                    |   2 +
 7 files changed, 199 insertions(+), 20 deletions(-)
 create mode 100644 cai/client/message_service/upload.py

diff --git a/cai/api/client.py b/cai/api/client.py
index af0f4831..85a9a580 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -8,7 +8,7 @@
 """
 
 import hashlib
-from typing import Union, Optional, Sequence
+from typing import Union, Optional, Sequence, BinaryIO
 
 from cai.client import OnlineStatus, Client as client_t
 from cai.client.message_service.encoders import make_group_msg_pkg, build_msg
@@ -17,7 +17,10 @@
 from .friend import Friend as _Friend
 from .group import Group as _Group
 from .login import Login as _Login
+from cai.utils.gcode import GroupIdConvertor
 from cai.client.message_service.models import Element
+from cai.client.message_service.upload import encode_d388_req
+from ..client.highway import calc_file_md5_and_length, upload_image
 
 
 def make_client(
@@ -53,13 +56,17 @@ async def send_group_msg(self, gid: int, msg: Sequence[Element]):
         seq = self.client.next_seq()
         # todo: split long msg
         return await self.client.send_unipkg_and_wait(
-            seq,
             "MessageSvc.PbSendMsg",
             make_group_msg_pkg(
                 seq, gid, build_msg(msg)
             ).SerializeToString()
         )
 
+    async def upload_image(self, group_id: int, file: BinaryIO):
+        await upload_image(file, group_id, self.client)
+        "todo: https://github.com/Mrs4s/MiraiGo/blob/714961d68f3dcd6956771d7b8bdea70d96ad65fd/client/image.go#L98"
+
+
     async def close(self):
         """Stop Client"""
         await self.client.close()
diff --git a/cai/client/client.py b/cai/client/client.py
index 2aeeda14..a3a26529 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -389,8 +389,10 @@ async def send_and_wait(
         await self.send(seq, command_name, packet)
         return await self._receive_store.fetch(seq, timeout)
 
-    async def send_unipkg_and_wait(self, seq: int, command_name: str, enc_packet: bytes, timeout=10.0):
-        await self.send_and_wait(
+    async def send_unipkg_and_wait(self, command_name: str, enc_packet: bytes, seq=-1, timeout=10.0):
+        if seq == -1:
+            seq = self.next_seq()
+        return await self.send_and_wait(
             seq, command_name,
             UniPacket.build(self.uin, seq, command_name, self._session_id, 1, enc_packet, self._siginfo.d2key),
             timeout
diff --git a/cai/client/highway.py b/cai/client/highway.py
index d1bb18ea..303125d3 100644
--- a/cai/client/highway.py
+++ b/cai/client/highway.py
@@ -1,24 +1,34 @@
 import asyncio
+import ipaddress
+import struct
+import uuid
+from dataclasses import dataclass
 from hashlib import md5
-from typing import Tuple, BinaryIO, TYPE_CHECKING
+from typing import Tuple, BinaryIO, TYPE_CHECKING, Optional
 
+from cai.client.message_service.models import ImageElement
+from cai.utils.gcode import GroupIdConvertor
+from cai.client.message_service.upload import encode_d388_req, decode_d388_rsp
 from cai.pb.highway.protocol.highway_head_pb2 import highway_head
 
 if TYPE_CHECKING:
     from cai.client.client import Client
 
+
 # https://github.com/Mrs4s/MiraiGo/blob/master/client/internal/highway/highway.go#L79
 
 
-def calc_file_md5(file: BinaryIO, bs=4096) -> str:
+def calc_file_md5_and_length(file: BinaryIO, bs=4096) -> Tuple[bytes, int]:
     try:
-        fm = md5()
+        fm, length = md5(), 0
         while True:
             bl = file.read(bs)
             fm.update(bl)
             if len(bl) != bs:
                 break
-        return fm.hexdigest()
+            else:
+                length += len(bl)
+        return fm.digest(), length
     finally:
         file.seek(0)
 
@@ -32,7 +42,7 @@ def create_highway_header(
 ) -> highway_head.DataHighwayHead:
     return highway_head.DataHighwayHead(
         version=1,
-        uin=bytes(str(client.uin)),
+        uin=str(client.uin).encode(),
         command=cmd,
         commandId=cmd_id,
         seq=client.next_seq(),
@@ -42,23 +52,151 @@ def create_highway_header(
     )
 
 
-async def upload_file(addr: Tuple[str, int], file: BinaryIO, cmd_id: int, client: Client, *, block_size=65535):
-    fmd5, fl = calc_file_md5(file), len(file.read())
+def itoa(i: int) -> str:  # int to address(str)
+    return ipaddress.IPv4Address(i).compressed
+
+
+def to_img_id(i_uuid: int) -> str:
+    return "{%s}.png" % uuid.UUID(int=i_uuid)
+
+
+def write_frame(head: bytes, body: bytes) -> bytes:
+    buf = bytearray()
+    buf.append(0x28)
+    buf += struct.pack("!II", len(head), len(body))
+    buf += head
+    buf += body
+    buf.append(0x29)
+    return buf
+
+
+async def read_frame(reader: asyncio.StreamReader) -> Tuple[highway_head.RspDataHighwayHead, bytes]:
+    head = await reader.read(9)
+    if len(head) != 9:
+        raise ValueError("Invalid frame head", head)
+    _, hl, bl = struct.unpack("!cII", head)
+    return (
+        highway_head.RspDataHighwayHead.FromString(await reader.readexactly(hl)),
+        await reader.readexactly(bl)
+    )
+
+
+@dataclass
+class ImageUploadResponse:
+    uploadKey: Optional[bytes] = None
+    uploadIp: Optional[int] = None
+    uploadPort: Optional[int] = None
+    width: Optional[int] = None
+    height: Optional[int] = None
+    message: Optional[str] = None
+    downloadIndex: Optional[str] = None
+    resourceId: Optional[int] = None
+    fileId: Optional[int] = None
+    fileType: Optional[int] = None
+    resultCode: Optional[int] = 0
+    isExists: bool = False
+    hasMetaData: bool = False
+
+
+def decode_upload_image_resp(data: bytes) -> ImageUploadResponse:
+    pkg = decode_d388_rsp(data).tryupImgRsp[0]
+    if pkg.result != 0:
+        return ImageUploadResponse(resultCode=pkg.result, message=pkg.failMsg.decode())
+
+    if pkg.fileExit:
+        if pkg.imgInfo:
+            info = pkg.imgInfo
+            return ImageUploadResponse(
+                isExists=True, fileId=pkg.fileId, hasMetaData=True,
+                fileType=info.fileType, width=info.fileWidth, height=info.fileHeight
+            )
+        else:
+            return ImageUploadResponse(isExists=True, fileId=pkg.fileId)
+    return ImageUploadResponse(
+        isExists=False,
+        uploadIp=pkg.upIp[0],  # todo: parse
+        uploadPort=pkg.upPort[0],
+        uploadKey=pkg.upUkey
+    )
+
+
+async def upload_image(file: BinaryIO, gid: int, client: "Client") -> ImageElement:
+    fmd5, fl = calc_file_md5_and_length(file)
+    ret = decode_upload_image_resp(
+        (await client.send_unipkg_and_wait(
+            "ImgStore.GroupPicUp",
+            encode_d388_req(GroupIdConvertor.to_group_code(gid), client.uin, fmd5, fl).SerializeToString()
+        )).data
+    )
+    print(ret)
+    if ret.resultCode != 0:
+        raise ConnectionError(ret.resultCode)
+    elif not ret.isExists:
+        print("not exists")
+        #raise ValueError("Upload Error")
+
+    await bdh_uploader(
+        b"PicUp.DataUp",
+        (itoa(ret.uploadIp), ret.uploadPort),
+        file,
+        2,
+        ret.uploadKey,
+        client
+    )
     file.seek(0)
+
+    if ret.hasMetaData:
+        image_type = ret.fileType
+        w, h = ret.width, ret.height
+    else:
+        image_type = 1000
+        w, h = (800, 600)
+
+    return ImageElement(
+        id=ret.fileId,
+        filename=to_img_id(ret.fileId),
+        size=fl,
+        width=w,
+        height=h,
+        md5=fmd5,
+        filetype=image_type,
+        url=f"https://gchat.qpic.cn/gchatpic_new/1/0-0-{fmd5:x}/0?term=2"
+    )
+
+
+async def bdh_uploader(
+    cmd: bytes,
+    addr: Tuple[str, int],
+    file: BinaryIO,
+    cmd_id: int,
+    ticket: bytes,
+    client: "Client", *,
+    block_size=65535
+):
+    fmd5, fl = calc_file_md5_and_length(file)
+    print(addr)
     reader, writer = await asyncio.open_connection(*addr)
     bc = 0
     while True:
         bl = file.read(block_size)
         if not bl:
             break
-        highway_head.ReqDataHighwayHead(
-            basehead=create_highway_header(b"PicUp.DataUp", 4096, cmd_id, client),
+        head = highway_head.ReqDataHighwayHead(
+            basehead=create_highway_header(cmd, 4096, cmd_id, client),
             seghead=highway_head.SegHead(
                 filesize=fl,
                 dataoffset=bc * block_size,
                 datalength=len(bl),
-                serviceticket=None,  #todo: https://github.com/Mrs4s/MiraiGo/blob/38990f6e1cf9ca0785709d03b66237a713338d0b/client/group_msg.go#L216
-
+                serviceticket=ticket,
+                # todo: https://github.com/Mrs4s/MiraiGo/blob/38990f6e1cf9ca0785709d03b66237a713338d0b/client/group_msg.go#L216
+                md5=md5(bl).digest(),
+                fileMd5=fmd5
             )
-        )
+        ).SerializeToString()
+
+        writer.write(write_frame(head, bl))
+        await writer.drain()
+
+        resp, _ = await read_frame(reader)
+
         bc += 1
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index baa32edc..40e0c771 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -101,12 +101,14 @@ def type(self) -> str:
 
 @dataclass
 class ImageElement(Element):
+    id: int
     filename: str
     size: int
     width: int
     height: int
     md5: bytes
-    url: str
+    url: Optional[str] = None
+    filetype: Optional[int] = 1000
 
     @property
     def type(self) -> str:
diff --git a/cai/client/message_service/upload.py b/cai/client/message_service/upload.py
new file mode 100644
index 00000000..52e5d7a5
--- /dev/null
+++ b/cai/client/message_service/upload.py
@@ -0,0 +1,29 @@
+import os
+
+from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388ReqBody, TryUpImgReq, D388RspBody
+
+
+def encode_d388_req(group_code: int, uin: int, md5: bytes, size: int) -> D388ReqBody:
+    fn = os.urandom(16).hex() + ".gif"
+    return D388ReqBody(
+        netType=3,
+        subcmd=1,
+        tryupImgReq=[TryUpImgReq(
+            groupCode=group_code,
+            srcUin=uin,
+            fileName=fn.encode(),
+            fileMd5=md5,
+            fileIndex=None,
+            fileSize=size,
+            srcTerm=5,
+            platformType=9,
+            buType=1,
+            picType=1000,
+            buildVer="8.2.7.4410".encode(),
+            appPicType=1006
+        )]
+    )
+
+
+def decode_d388_rsp(data: bytes) -> D388RspBody:
+    return D388RspBody.FromString(data)
diff --git a/cai/client/multi_msg/long_msg.py b/cai/client/multi_msg/long_msg.py
index 5fc2fca2..345b4186 100644
--- a/cai/client/multi_msg/long_msg.py
+++ b/cai/client/multi_msg/long_msg.py
@@ -1,7 +1,7 @@
 from cai.client import Command
 from cai.pb.highway.multi_msg.multi_msg_pb2 import MultiReqBody, MultiMsgApplyUpReq, MultiMsgApplyUpRsp, MultiRspBody
 from cai.pb.highway.long_msg.long_msg_pb2 import LongReqBody, LongMsgUpReq
-from typing import TYPE_CHECKING
+from typing import TYPE_CHECKING, Tuple
 
 from dataclasses import dataclass
 
@@ -32,9 +32,8 @@ class MultiApplyResp(Command):
     data: MultiMsgApplyUpRsp
 
 
-async def build_multi_apply_up_pkg(client: "Client", group_id: int, data_len: int, data_md5: bytes, bu_type: int):
+async def build_multi_apply_up_pkg(client: "Client", group_id: int, data_len: int, data_md5: bytes, bu_type: int) -> Tuple[LongReqBody, MultiMsgApplyUpRsp]:
     body: MultiApplyResp = await client.send_unipkg_and_wait(
-        client.next_seq(),
         "MultiMsg.ApplyUp",
         _encode_multi_req_body(
             group_id, data_len, data_md5, bu_type
diff --git a/examples/login.py b/examples/login.py
index fc533dd1..71fe5cf7 100644
--- a/examples/login.py
+++ b/examples/login.py
@@ -71,6 +71,8 @@ async def listen_message(client: Client, _, event: Event):
                         TextElement("Supported.")
                     ]
                 )
+            elif event.message[0].content == "1919":
+                print(await client.upload_image(event.group_id, open("test.jpg", "rb")))
 
 
 async def handle_failure(client: Client, exception: Exception):

From 8e41ae59ec267e1c8de6b005952dae256c274fc4 Mon Sep 17 00:00:00 2001
From: yitaoguanggao <a1025952421@outlook.com>
Date: Tue, 22 Mar 2022 13:43:37 +0800
Subject: [PATCH 025/113] fix: struct parse error

---
 cai/client/wtlogin/oicq.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/cai/client/wtlogin/oicq.py b/cai/client/wtlogin/oicq.py
index a17ac00f..6b7afda0 100644
--- a/cai/client/wtlogin/oicq.py
+++ b/cai/client/wtlogin/oicq.py
@@ -307,7 +307,10 @@ def __init__(
         self.t174 = _tlv_map.get(0x174)
         if self.t174:
             t178 = Packet(_tlv_map[0x178])
-            self.sms_phone = t178.start().string(4).execute()[0]
+            try:
+                self.sms_phone = t178.start().string(4).execute()[0]
+            except struct.error:
+                self.sms_phone = None
 
 
 @dataclass

From c87d7024b6b85aeb440945b830f27317ea6992c7 Mon Sep 17 00:00:00 2001
From: yitaoguanggao <a1025952421@outlook.com>
Date: Tue, 22 Mar 2022 14:14:15 +0800
Subject: [PATCH 026/113] sync changes

---
 cai/api/login.py                     | 10 ++++------
 cai/client/highway.py                |  2 +-
 cai/client/message_service/upload.py | 11 ++++++-----
 cai/utils/gcode.py                   |  4 ++--
 examples/login.py                    |  9 +++++----
 5 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/cai/api/login.py b/cai/api/login.py
index 64ea60a5..55e967da 100644
--- a/cai/api/login.py
+++ b/cai/api/login.py
@@ -23,7 +23,9 @@ async def login(self):
         await self.client.reconnect()
         try:
             await self._executor("login")
-        except not LoginException:
+        except LoginException:
+            raise  # user handle required
+        except Exception:
             await self.client.close()
             raise
 
@@ -63,11 +65,7 @@ async def submit_slider_ticket(self, ticket: str) -> bool:
             LoginSliderException: Need slider ticket.
             LoginCaptchaException: Need captcha image.
         """
-        try:
-            await self._executor("submit_slider_ticket", ticket)
-        except not LoginException:
-            await self.client.close()
-            raise
+        await self._executor("submit_slider_ticket", ticket)
         return True
 
     async def request_sms(self) -> bool:
diff --git a/cai/client/highway.py b/cai/client/highway.py
index 303125d3..a5a58775 100644
--- a/cai/client/highway.py
+++ b/cai/client/highway.py
@@ -125,7 +125,7 @@ async def upload_image(file: BinaryIO, gid: int, client: "Client") -> ImageEleme
     ret = decode_upload_image_resp(
         (await client.send_unipkg_and_wait(
             "ImgStore.GroupPicUp",
-            encode_d388_req(GroupIdConvertor.to_group_code(gid), client.uin, fmd5, fl).SerializeToString()
+            encode_d388_req(GroupIdConvertor.to_group_code(gid), client.uin, fmd5, fl, client.apk_info.version.encode()).SerializeToString()
         )).data
     )
     print(ret)
diff --git a/cai/client/message_service/upload.py b/cai/client/message_service/upload.py
index 52e5d7a5..994654cd 100644
--- a/cai/client/message_service/upload.py
+++ b/cai/client/message_service/upload.py
@@ -3,8 +3,8 @@
 from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388ReqBody, TryUpImgReq, D388RspBody
 
 
-def encode_d388_req(group_code: int, uin: int, md5: bytes, size: int) -> D388ReqBody:
-    fn = os.urandom(16).hex() + ".gif"
+def encode_d388_req(group_code: int, uin: int, md5: bytes, size: int, build_ver: bytes) -> D388ReqBody:
+    fn = md5.hex() + ".gif"
     return D388ReqBody(
         netType=3,
         subcmd=1,
@@ -13,14 +13,15 @@ def encode_d388_req(group_code: int, uin: int, md5: bytes, size: int) -> D388Req
             srcUin=uin,
             fileName=fn.encode(),
             fileMd5=md5,
-            fileIndex=None,
             fileSize=size,
+            fileId=0,
             srcTerm=5,
             platformType=9,
             buType=1,
             picType=1000,
-            buildVer="8.2.7.4410".encode(),
-            appPicType=1006
+            buildVer=build_ver,
+            appPicType=1006,
+            originalPic=0,
         )]
     )
 
diff --git a/cai/utils/gcode.py b/cai/utils/gcode.py
index 688d9a92..53b5714a 100644
--- a/cai/utils/gcode.py
+++ b/cai/utils/gcode.py
@@ -1,7 +1,7 @@
 class GroupIdConvertor:
     @staticmethod
     def to_group_code(group_id: int) -> int:
-        left = group_id / 1000000
+        left = group_id // 1000000
         if 0 + 202 <= left <= 10 + 202:
             left -= 202
         elif 11 + 480 - 11 <= left <= 19 + 480 - 11:
@@ -20,7 +20,7 @@ def to_group_code(group_id: int) -> int:
 
     @staticmethod
     def to_group_uin(group_code: int) -> int:
-        left = group_code / 1000000
+        left = group_code // 1000000
         if 0 <= left <= 10:
             left += 202
         elif 11 <= left <= 19:
diff --git a/examples/login.py b/examples/login.py
index 71fe5cf7..67c9a1e7 100644
--- a/examples/login.py
+++ b/examples/login.py
@@ -45,13 +45,14 @@ async def run(closed: asyncio.Event):
             print(f"Login Success! Client status: {ci.client.status!r}")
         except Exception as e:
             await handle_failure(ci, e)
-        ci.client.add_event_listener(functools.partial(listen_message, ci))
+        #ci.client.add_event_listener(functools.partial(listen_message, ci))
+        print(await ci.upload_image(478399804, open("test.png", "rb")))
         while True:
             for status in OnlineStatus:
                 if status == OnlineStatus.Offline:
                     continue
                 print(status, "Changed")
-                await ci.set_status(status, 67, True)
+                #await ci.set_status(status, 67, True)
                 await asyncio.sleep(360)
     finally:
         closed.set()
@@ -72,12 +73,12 @@ async def listen_message(client: Client, _, event: Event):
                     ]
                 )
             elif event.message[0].content == "1919":
-                print(await client.upload_image(event.group_id, open("test.jpg", "rb")))
+                print(await client.upload_image(event.group_id, open("test.png", "rb")))
 
 
 async def handle_failure(client: Client, exception: Exception):
     if isinstance(exception, LoginSliderNeeded):
-        print("Verify url:", exception.verify_url)
+        print("Verify url:", exception.verify_url.replace("ssl.captcha.qq.com", "txhelper.glitch.me"))
         ticket = input("Please enter the ticket: ").strip()
         try:
             await client.submit_slider_ticket(ticket)

From 6411f298c192977032caefd5be9c02510ca30f97 Mon Sep 17 00:00:00 2001
From: yitaoguanggao <a1025952421@outlook.com>
Date: Wed, 23 Mar 2022 13:53:54 +0800
Subject: [PATCH 027/113] add: highway & upload image

---
 cai/api/client.py                      |   3 +-
 cai/client/highway.py                  | 136 ++++++++++++++-----------
 cai/client/message_service/encoders.py |  32 +++++-
 cai/client/message_service/upload.py   |  17 ++--
 cai/log.py                             |   1 +
 examples/login.py                      |  11 +-
 6 files changed, 126 insertions(+), 74 deletions(-)

diff --git a/cai/api/client.py b/cai/api/client.py
index 85a9a580..b7764d86 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -63,8 +63,7 @@ async def send_group_msg(self, gid: int, msg: Sequence[Element]):
         )
 
     async def upload_image(self, group_id: int, file: BinaryIO):
-        await upload_image(file, group_id, self.client)
-        "todo: https://github.com/Mrs4s/MiraiGo/blob/714961d68f3dcd6956771d7b8bdea70d96ad65fd/client/image.go#L98"
+        return await upload_image(file, group_id, self.client)
 
 
     async def close(self):
diff --git a/cai/client/highway.py b/cai/client/highway.py
index a5a58775..1c02922b 100644
--- a/cai/client/highway.py
+++ b/cai/client/highway.py
@@ -1,13 +1,13 @@
 import asyncio
-import ipaddress
 import struct
+import time
 import uuid
 from dataclasses import dataclass
 from hashlib import md5
-from typing import Tuple, BinaryIO, TYPE_CHECKING, Optional
+from typing import Tuple, BinaryIO, TYPE_CHECKING, Optional, List, Any, Callable, Awaitable
 
+from cai.log import highway as highway_logger
 from cai.client.message_service.models import ImageElement
-from cai.utils.gcode import GroupIdConvertor
 from cai.client.message_service.upload import encode_d388_req, decode_d388_rsp
 from cai.pb.highway.protocol.highway_head_pb2 import highway_head
 
@@ -24,10 +24,9 @@ def calc_file_md5_and_length(file: BinaryIO, bs=4096) -> Tuple[bytes, int]:
         while True:
             bl = file.read(bs)
             fm.update(bl)
+            length += len(bl)
             if len(bl) != bs:
                 break
-            else:
-                length += len(bl)
         return fm.digest(), length
     finally:
         file.seek(0)
@@ -53,11 +52,11 @@ def create_highway_header(
 
 
 def itoa(i: int) -> str:  # int to address(str)
-    return ipaddress.IPv4Address(i).compressed
+    return ".".join([str(p) for p in i.to_bytes(4, "little")])
 
 
-def to_img_id(i_uuid: int) -> str:
-    return "{%s}.png" % uuid.UUID(int=i_uuid)
+def to_img_id(b_uuid: bytes) -> str:
+    return "{%s}.png" % uuid.UUID(bytes=b_uuid)
 
 
 def write_frame(head: bytes, body: bytes) -> bytes:
@@ -71,21 +70,29 @@ def write_frame(head: bytes, body: bytes) -> bytes:
 
 
 async def read_frame(reader: asyncio.StreamReader) -> Tuple[highway_head.RspDataHighwayHead, bytes]:
-    head = await reader.read(9)
-    if len(head) != 9:
+    head = await reader.readexactly(9)
+    if len(head) != 9 and head[0] != 0x28:
         raise ValueError("Invalid frame head", head)
-    _, hl, bl = struct.unpack("!cII", head)
-    return (
-        highway_head.RspDataHighwayHead.FromString(await reader.readexactly(hl)),
-        await reader.readexactly(bl)
-    )
+    hl, bl = struct.unpack("!II", head[1:])
+    try:
+        return (
+            highway_head.RspDataHighwayHead.FromString(await reader.readexactly(hl)),
+            await reader.readexactly(bl)
+        )
+    finally:
+        await reader.read(1) # flush end byte
+
+
+async def timeit(func: Awaitable) -> Tuple[float, Any]:
+    start = time.time()
+    result = await func
+    return time.time() - start, result
 
 
 @dataclass
 class ImageUploadResponse:
     uploadKey: Optional[bytes] = None
-    uploadIp: Optional[int] = None
-    uploadPort: Optional[int] = None
+    uploadAddr: Optional[List[Tuple[str, int]]] = None
     width: Optional[int] = None
     height: Optional[int] = None
     message: Optional[str] = None
@@ -93,7 +100,7 @@ class ImageUploadResponse:
     resourceId: Optional[int] = None
     fileId: Optional[int] = None
     fileType: Optional[int] = None
-    resultCode: Optional[int] = 0
+    resultCode: int = 0
     isExists: bool = False
     hasMetaData: bool = False
 
@@ -114,36 +121,47 @@ def decode_upload_image_resp(data: bytes) -> ImageUploadResponse:
             return ImageUploadResponse(isExists=True, fileId=pkg.fileId)
     return ImageUploadResponse(
         isExists=False,
-        uploadIp=pkg.upIp[0],  # todo: parse
-        uploadPort=pkg.upPort[0],
+        uploadAddr=[(itoa(a), p) for a, p in zip(pkg.upIp, pkg.upPort)],
         uploadKey=pkg.upUkey
     )
 
 
 async def upload_image(file: BinaryIO, gid: int, client: "Client") -> ImageElement:
     fmd5, fl = calc_file_md5_and_length(file)
+    print(encode_d388_req(gid, client.uin, fmd5, fl).SerializeToString().hex())
     ret = decode_upload_image_resp(
         (await client.send_unipkg_and_wait(
             "ImgStore.GroupPicUp",
-            encode_d388_req(GroupIdConvertor.to_group_code(gid), client.uin, fmd5, fl, client.apk_info.version.encode()).SerializeToString()
+            encode_d388_req(gid, client.uin, fmd5, fl).SerializeToString()
         )).data
     )
     print(ret)
     if ret.resultCode != 0:
         raise ConnectionError(ret.resultCode)
     elif not ret.isExists:
-        print("not exists")
-        #raise ValueError("Upload Error")
-
-    await bdh_uploader(
-        b"PicUp.DataUp",
-        (itoa(ret.uploadIp), ret.uploadPort),
-        file,
-        2,
-        ret.uploadKey,
-        client
-    )
-    file.seek(0)
+        highway_logger.debug("file not found, uploading...")
+
+        for addr in ret.uploadAddr:
+            try:
+                t, _ = await timeit(
+                    bdh_uploader(
+                        b"PicUp.DataUp",
+                        addr,
+                        file,
+                        2,
+                        ret.uploadKey,
+                        client
+                    )
+                )
+                highway_logger.info("upload complete, use %fs in %d bytes" % (t * 1000, fl))
+            except TimeoutError:
+                highway_logger.error(f"server {addr[0]}:{addr[1]} timeout")
+                continue
+            finally:
+                file.seek(0)
+            break
+        else:
+            raise ConnectionError("cannot upload image, all server failure")
 
     if ret.hasMetaData:
         image_type = ret.fileType
@@ -154,13 +172,13 @@ async def upload_image(file: BinaryIO, gid: int, client: "Client") -> ImageEleme
 
     return ImageElement(
         id=ret.fileId,
-        filename=to_img_id(ret.fileId),
+        filename=to_img_id(fmd5),
         size=fl,
         width=w,
         height=h,
         md5=fmd5,
         filetype=image_type,
-        url=f"https://gchat.qpic.cn/gchatpic_new/1/0-0-{fmd5:x}/0?term=2"
+        url=f"https://gchat.qpic.cn/gchatpic_new/1/0-0-{fmd5.hex().upper()}/0?term=2"
     )
 
 
@@ -177,26 +195,28 @@ async def bdh_uploader(
     print(addr)
     reader, writer = await asyncio.open_connection(*addr)
     bc = 0
-    while True:
-        bl = file.read(block_size)
-        if not bl:
-            break
-        head = highway_head.ReqDataHighwayHead(
-            basehead=create_highway_header(cmd, 4096, cmd_id, client),
-            seghead=highway_head.SegHead(
-                filesize=fl,
-                dataoffset=bc * block_size,
-                datalength=len(bl),
-                serviceticket=ticket,
-                # todo: https://github.com/Mrs4s/MiraiGo/blob/38990f6e1cf9ca0785709d03b66237a713338d0b/client/group_msg.go#L216
-                md5=md5(bl).digest(),
-                fileMd5=fmd5
-            )
-        ).SerializeToString()
-
-        writer.write(write_frame(head, bl))
-        await writer.drain()
-
-        resp, _ = await read_frame(reader)
-
-        bc += 1
+    try:
+        while True:
+            bl = file.read(block_size)
+            if not bl:
+                break
+            head = highway_head.ReqDataHighwayHead(
+                basehead=create_highway_header(cmd, 4096, cmd_id, client),
+                seghead=highway_head.SegHead(
+                    filesize=fl,
+                    dataoffset=bc * block_size,
+                    datalength=len(bl),
+                    serviceticket=ticket,
+                    md5=md5(bl).digest(),
+                    fileMd5=fmd5
+                )
+            ).SerializeToString()
+
+            writer.write(write_frame(head, bl))
+            await writer.drain()
+
+            resp, _ = await read_frame(reader)
+
+            bc += 1
+    finally:
+        writer.close()
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index d65efc86..5f613403 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -1,7 +1,7 @@
 import random
 
 from typing import Sequence, TYPE_CHECKING, Dict, Type
-from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, Elem
+from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, CustomFace, Elem
 from cai.pb.msf.msg.svc.svc_pb2 import PbSendMsgReq, RoutingHead, Grp
 from cai.pb.msf.msg.comm.comm_pb2 import ContentHead
 from cai.client.packet import UniPacket
@@ -20,16 +20,40 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
     ret = []
     for e in elements:  # todo: support more element
         if isinstance(e, models.TextElement):
-            ret.append(PlainText(str=e.content.encode()))
+            ret.append(
+                Elem(text=PlainText(str=e.content.encode()))
+            )
+        elif isinstance(e, models.ImageElement):
+            ret.append(
+                Elem(
+                    custom_face=CustomFace(
+                        file_type=66,
+                        useful=1,
+                        biz_type=0, #5
+                        width=e.width,
+                        height=e.height,
+                        file_id=e.id,
+                        file_path=e.filename,
+                        image_type=e.filetype,
+                        origin=1,
+                        size=e.size,
+                        md5=e.md5,
+                        flag=b"\x00\x00\x00\x00"
+                    )
+                )
+            )
         else:
             raise NotImplementedError(e)
 
-    return MsgBody(
+    d = MsgBody(
         rich_text=RichText(
-            elems=[Elem(text=e) for e in ret],
+            #elems=[Elem(text=e) for e in ret],
+            elems=ret,
             ptt=None
         )
     )
+    print(d.SerializeToString().hex())
+    return d
 
 
 def encode_send_group_msg_req(
diff --git a/cai/client/message_service/upload.py b/cai/client/message_service/upload.py
index 994654cd..d38afe6a 100644
--- a/cai/client/message_service/upload.py
+++ b/cai/client/message_service/upload.py
@@ -3,10 +3,10 @@
 from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388ReqBody, TryUpImgReq, D388RspBody
 
 
-def encode_d388_req(group_code: int, uin: int, md5: bytes, size: int, build_ver: bytes) -> D388ReqBody:
-    fn = md5.hex() + ".gif"
+def encode_d388_req(group_code: int, uin: int, md5: bytes, size: int) -> D388ReqBody:
+    fn = md5.hex().upper() + ".jpg"
     return D388ReqBody(
-        netType=3,
+        netType=8,
         subcmd=1,
         tryupImgReq=[TryUpImgReq(
             groupCode=group_code,
@@ -18,10 +18,13 @@ def encode_d388_req(group_code: int, uin: int, md5: bytes, size: int, build_ver:
             srcTerm=5,
             platformType=9,
             buType=1,
-            picType=1000,
-            buildVer=build_ver,
-            appPicType=1006,
-            originalPic=0,
+            picType=1003,
+            picWidth=1920,
+            picHeight=903,
+            buildVer=b"8.8.50.2324",
+            appPicType=1052,
+            originalPic=1,
+            srvUpload=0
         )]
     )
 
diff --git a/cai/log.py b/cai/log.py
index 1ca89ad1..64ed0a9e 100644
--- a/cai/log.py
+++ b/cai/log.py
@@ -12,3 +12,4 @@
 
 logger = logging.getLogger("cai")
 network = logging.getLogger("cai.network")
+highway = logging.getLogger("cai.highway")
diff --git a/examples/login.py b/examples/login.py
index 67c9a1e7..de030378 100644
--- a/examples/login.py
+++ b/examples/login.py
@@ -45,8 +45,7 @@ async def run(closed: asyncio.Event):
             print(f"Login Success! Client status: {ci.client.status!r}")
         except Exception as e:
             await handle_failure(ci, e)
-        #ci.client.add_event_listener(functools.partial(listen_message, ci))
-        print(await ci.upload_image(478399804, open("test.png", "rb")))
+        ci.client.add_event_listener(functools.partial(listen_message, ci))
         while True:
             for status in OnlineStatus:
                 if status == OnlineStatus.Offline:
@@ -73,7 +72,13 @@ async def listen_message(client: Client, _, event: Event):
                     ]
                 )
             elif event.message[0].content == "1919":
-                print(await client.upload_image(event.group_id, open("test.png", "rb")))
+                await client.send_group_msg(
+                    event.group_id,
+                    [
+                        await client.upload_image(event.group_id, open("test.png", "rb")),
+                        TextElement("1234")
+                    ]
+                )
 
 
 async def handle_failure(client: Client, exception: Exception):

From 1a97045fbb64079374f12f86b3353fe603d1de54 Mon Sep 17 00:00:00 2001
From: yitaoguanggao <a1025952421@outlook.com>
Date: Thu, 24 Mar 2022 21:26:49 +0800
Subject: [PATCH 028/113] fix: send image to group

---
 cai/api/client.py                      |  1 -
 cai/client/highway.py                  |  7 +++----
 cai/client/message_service/encoders.py | 11 +++++++----
 3 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/cai/api/client.py b/cai/api/client.py
index b7764d86..32ec17f6 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -65,7 +65,6 @@ async def send_group_msg(self, gid: int, msg: Sequence[Element]):
     async def upload_image(self, group_id: int, file: BinaryIO):
         return await upload_image(file, group_id, self.client)
 
-
     async def close(self):
         """Stop Client"""
         await self.client.close()
diff --git a/cai/client/highway.py b/cai/client/highway.py
index 1c02922b..3be5904a 100644
--- a/cai/client/highway.py
+++ b/cai/client/highway.py
@@ -113,12 +113,13 @@ def decode_upload_image_resp(data: bytes) -> ImageUploadResponse:
     if pkg.fileExit:
         if pkg.imgInfo:
             info = pkg.imgInfo
+            # fuck: pkg.fileId != pkg.fileid
             return ImageUploadResponse(
-                isExists=True, fileId=pkg.fileId, hasMetaData=True,
+                isExists=True, fileId=pkg.fileid, hasMetaData=True,
                 fileType=info.fileType, width=info.fileWidth, height=info.fileHeight
             )
         else:
-            return ImageUploadResponse(isExists=True, fileId=pkg.fileId)
+            return ImageUploadResponse(isExists=True, fileId=pkg.fileid)
     return ImageUploadResponse(
         isExists=False,
         uploadAddr=[(itoa(a), p) for a, p in zip(pkg.upIp, pkg.upPort)],
@@ -128,14 +129,12 @@ def decode_upload_image_resp(data: bytes) -> ImageUploadResponse:
 
 async def upload_image(file: BinaryIO, gid: int, client: "Client") -> ImageElement:
     fmd5, fl = calc_file_md5_and_length(file)
-    print(encode_d388_req(gid, client.uin, fmd5, fl).SerializeToString().hex())
     ret = decode_upload_image_resp(
         (await client.send_unipkg_and_wait(
             "ImgStore.GroupPicUp",
             encode_d388_req(gid, client.uin, fmd5, fl).SerializeToString()
         )).data
     )
-    print(ret)
     if ret.resultCode != 0:
         raise ConnectionError(ret.resultCode)
     elif not ret.isExists:
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index 5f613403..c55373ef 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -29,16 +29,19 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
                     custom_face=CustomFace(
                         file_type=66,
                         useful=1,
-                        biz_type=0, #5
+                        biz_type=0,
                         width=e.width,
                         height=e.height,
                         file_id=e.id,
                         file_path=e.filename,
                         image_type=e.filetype,
+                        source=200,
                         origin=1,
                         size=e.size,
                         md5=e.md5,
-                        flag=b"\x00\x00\x00\x00"
+                        show_len=0,
+                        download_len=0
+                        #flag=b"\x00\x00\x00\x00"
                     )
                 )
             )
@@ -64,8 +67,8 @@ def encode_send_group_msg_req(
         content_head=head,
         body=body,
         seq=seq,
-        rand=random.randrange(3000, 30000),
-        via=0
+        rand=random.randrange(300000, 3000000),
+        via=1,
     )
 
 

From c318dcc672bc5e77bb06b58b7db902a7a85d7926 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 3 Apr 2022 13:19:38 +0800
Subject: [PATCH 029/113] sync changes

---
 cai/api/client.py                      |  4 ++-
 cai/client/client.py                   | 31 ++++++++++------
 cai/client/message_service/decoders.py | 49 +++++++++++++-------------
 cai/client/message_service/models.py   |  2 +-
 cai/connection/__init__.py             | 10 +++++-
 5 files changed, 57 insertions(+), 39 deletions(-)

diff --git a/cai/api/client.py b/cai/api/client.py
index 32ec17f6..85a9a580 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -63,7 +63,9 @@ async def send_group_msg(self, gid: int, msg: Sequence[Element]):
         )
 
     async def upload_image(self, group_id: int, file: BinaryIO):
-        return await upload_image(file, group_id, self.client)
+        await upload_image(file, group_id, self.client)
+        "todo: https://github.com/Mrs4s/MiraiGo/blob/714961d68f3dcd6956771d7b8bdea70d96ad65fd/client/image.go#L98"
+
 
     async def close(self):
         """Stop Client"""
diff --git a/cai/client/client.py b/cai/client/client.py
index a3a26529..c88a29ba 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -142,7 +142,7 @@
 class Client:
     LISTENERS: Set[LT] = set()
 
-    def __init__(self, uin: int, password_md5: bytes, device: DeviceInfo, apk_info: ApkInfo):
+    def __init__(self, uin: int, password_md5: bytes, device: DeviceInfo, apk_info: ApkInfo, *, loop=None):
         # account info
         self._uin: int = uin
         self._password_md5: bytes = password_md5
@@ -188,9 +188,13 @@ def __init__(self, uin: int, password_md5: bytes, device: DeviceInfo, apk_info:
 
         self.device_info: DeviceInfo = device
         self.apk_info: ApkInfo = apk_info
+        
+        if not loop:
+            loop = asyncio.get_event_loop()
+        self._loop = loop
 
     def __str__(self) -> str:
-        return f"<cai client object for {self.uin}>"
+        return f"<cai client object {self.uin}(connected={self.connected})>"
 
     @property
     def uin(self) -> int:
@@ -281,7 +285,7 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
             self._connection = await connect(
                 _server.host, _server.port, ssl=False, timeout=3.0
             )
-            asyncio.create_task(self.receive())
+            self._loop.create_task(self.receive()).add_done_callback(self._recv_done_cb)
         except ConnectionError as e:
             raise
         except Exception as e:
@@ -290,6 +294,10 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
                 f"server({_server.host}:{_server.port}): " + repr(e)
             )
 
+    def _recv_done_cb(self, task):
+        log.network.warning("receiver stopped, try to reconnect")
+        self._loop.create_task(self.reconnect())
+
     async def disconnect(self) -> None:
         """Disconnect if already connected to the server."""
         if self._connection:
@@ -309,6 +317,7 @@ async def reconnect(
         log.network.debug("reconnecting...")
         if not change_server and self._connection:
             await self._connection.reconnect()
+            await self.register()
             return
 
         exclude = (
@@ -415,10 +424,8 @@ async def receive(self):
         """
         while self.connected:
             try:
-                length: int = (
-                    struct.unpack(">i", await self.connection.read_bytes(4))[0]
-                    - 4
-                )
+                length: int = int.from_bytes(await self.connection.read_bytes(4), "big") - 4
+
                 # FIXME: length < 0 ?
                 data = await self.connection.read_bytes(length)
                 packet = IncomingPacket.parse(
@@ -432,9 +439,11 @@ async def receive(self):
                     f"(receive:{packet.ret_code}): {packet.command_name}"
                 )
                 # do not block receive
-                asyncio.create_task(self._handle_incoming_packet(packet))
-            except ConnectionAbortedError:
-                log.logger.debug(f"Client {self.uin} connection closed")
+                self._loop.create_task(self._handle_incoming_packet(packet))
+            except ConnectionError:  #ConnectionAbortedError:
+                log.logger.exception(f"Client {self.uin} connection closed")
+                break
+                #await self.reconnect(change_server=True)
             except Exception as e:
                 log.logger.exception(e)
 
@@ -960,7 +969,7 @@ async def heartbeat(self) -> None:
 
         self._heartbeat_enabled = True
 
-        while self._heartbeat_enabled and self.connected:
+        while self._heartbeat_enabled and not self._connection.closed:
             seq = self.next_seq()
             packet = encode_heartbeat(
                 seq, self._session_id, self.device_info.imei, self._ksid, self.uin, self.apk_info.sub_app_id
diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index 26f02974..e5b2983d 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -96,23 +96,23 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
             if elem.custom_face.md5 and elem.custom_face.orig_url:
                 res.append(
                     ImageElement(
-                        elem.custom_face.file_path,
-                        elem.custom_face.size,
-                        elem.custom_face.width,
-                        elem.custom_face.height,
-                        elem.custom_face.md5,
-                        "https://gchat.qpic.cn" + elem.custom_face.orig_url,
+                        filename=elem.custom_face.file_path,
+                        size=elem.custom_face.size,
+                        width=elem.custom_face.width,
+                        height=elem.custom_face.height,
+                        md5=elem.custom_face.md5,
+                        url="https://gchat.qpic.cn" + elem.custom_face.orig_url,
                     )
                 )
             elif elem.custom_face.md5:
                 res.append(
                     ImageElement(
-                        elem.custom_face.file_path,
-                        elem.custom_face.size,
-                        elem.custom_face.width,
-                        elem.custom_face.height,
-                        elem.custom_face.md5,
-                        "https://gchat.qpic.cn/gchatpic_new/0/0-0-"
+                        filename=elem.custom_face.file_path,
+                        size=elem.custom_face.size,
+                        width=elem.custom_face.width,
+                        height=elem.custom_face.height,
+                        md5=elem.custom_face.md5,
+                        url="https://gchat.qpic.cn/gchatpic_new/0/0-0-"
                         + elem.custom_face.md5.decode().upper()
                         + "/0",
                     )
@@ -122,13 +122,12 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
             if elem.not_online_image.orig_url:
                 res.append(
                     ImageElement(
-                        elem.not_online_image.file_path.decode("utf-8"),
-                        elem.not_online_image.file_len,
-                        elem.not_online_image.pic_width,
-                        elem.not_online_image.pic_height,
-                        elem.not_online_image.pic_md5,
-                        "https://c2cpicdw.qpic.cn"
-                        + elem.not_online_image.orig_url,
+                        filename=elem.not_online_image.file_path.decode("utf-8"),
+                        size=elem.not_online_image.file_len,
+                        width=elem.not_online_image.pic_width,
+                        height=elem.not_online_image.pic_height,
+                        md5=elem.not_online_image.pic_md5,
+                        url="https://c2cpicdw.qpic.cn" + elem.not_online_image.orig_url,
                     )
                 )
             elif (
@@ -137,12 +136,12 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
             ):
                 res.append(
                     ImageElement(
-                        elem.not_online_image.file_path.decode("utf-8"),
-                        elem.not_online_image.file_len,
-                        elem.not_online_image.pic_width,
-                        elem.not_online_image.pic_height,
-                        elem.not_online_image.pic_md5,
-                        "https://c2cpicdw.qpic.cn/offpic_new/0/"
+                        filename=elem.not_online_image.file_path.decode("utf-8"),
+                        size=elem.not_online_image.file_len,
+                        width=elem.not_online_image.pic_width,
+                        height=elem.not_online_image.pic_height,
+                        md5=elem.not_online_image.pic_md5,
+                        url="https://c2cpicdw.qpic.cn/offpic_new/0/"
                         + (
                             elem.not_online_image.res_id
                             or elem.not_online_image.download_path
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 40e0c771..7dd10ed9 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -101,12 +101,12 @@ def type(self) -> str:
 
 @dataclass
 class ImageElement(Element):
-    id: int
     filename: str
     size: int
     width: int
     height: int
     md5: bytes
+    id: Optional[int] = -1
     url: Optional[str] = None
     filetype: Optional[int] = 1000
 
diff --git a/cai/connection/__init__.py b/cai/connection/__init__.py
index 977f3784..3365a1ab 100644
--- a/cai/connection/__init__.py
+++ b/cai/connection/__init__.py
@@ -27,6 +27,7 @@ def __init__(
         self._host = host
         self._port = port
         self._ssl = ssl
+        self._closed = asyncio.Event()
         self.timeout = timeout
 
         self._reader: Optional[asyncio.StreamReader] = None
@@ -58,7 +59,12 @@ def reader(self) -> asyncio.StreamReader:
 
     @property
     def closed(self) -> bool:
-        return self._writer is None
+        #return self._writer is None
+        return self._closed.is_set()
+
+    @property
+    async def wait_closed(self):
+        await self._closed.wait()
 
     async def __aenter__(self):
         await self._connect()
@@ -87,8 +93,10 @@ async def _connect(self):
             raise ConnectionError(
                 f"Open connection to {self._host}:{self._port} failed"
             ) from e
+        self._closed.clear()
 
     async def close(self):
+        self._closed.set()
         if self._writer:
             self._writer.close()
             await self._writer.wait_closed()

From 646bc7b9eaf28c8993eb64d0d0628977843a30c0 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 3 Apr 2022 14:16:30 +0800
Subject: [PATCH 030/113] add: reconnect & Client.closed

---
 cai/api/login.py           |  2 +-
 cai/client/client.py       | 33 ++++++++++++++++++++-------------
 cai/connection/__init__.py |  2 +-
 3 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/cai/api/login.py b/cai/api/login.py
index 55e967da..01d6ff73 100644
--- a/cai/api/login.py
+++ b/cai/api/login.py
@@ -20,7 +20,7 @@ async def login(self):
             LoginSliderException: Need slider ticket.
             LoginCaptchaException: Need captcha image.
         """
-        await self.client.reconnect()
+        await self.client.connect()
         try:
             await self._executor("login")
         except LoginException:
diff --git a/cai/client/client.py b/cai/client/client.py
index c88a29ba..81ce7437 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -188,7 +188,9 @@ def __init__(self, uin: int, password_md5: bytes, device: DeviceInfo, apk_info:
 
         self.device_info: DeviceInfo = device
         self.apk_info: ApkInfo = apk_info
-        
+        self._reconnect: bool = True
+        self.closed: asyncio.Event = asyncio.Event()
+
         if not loop:
             loop = asyncio.get_event_loop()
         self._loop = loop
@@ -294,9 +296,13 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
                 f"server({_server.host}:{_server.port}): " + repr(e)
             )
 
-    def _recv_done_cb(self, task):
-        log.network.warning("receiver stopped, try to reconnect")
-        self._loop.create_task(self.reconnect())
+    def _recv_done_cb(self, _task):
+        if self._reconnect:
+            log.network.warning("receiver stopped, try to reconnect")
+            self._loop.create_task(self.reconnect())
+        else:
+            log.network.warning("receiver stopped")
+            await self.close()
 
     async def disconnect(self) -> None:
         """Disconnect if already connected to the server."""
@@ -314,10 +320,13 @@ async def reconnect(
             change_server (bool, optional): True if you want to change the server. Defaults to False.
             server (Optional[SsoServer], optional): Which server you want to connect to. Defaults to None.
         """
-        log.network.debug("reconnecting...")
+
         if not change_server and self._connection:
-            await self._connection.reconnect()
-            await self.register()
+            log.network.debug("reconnecting...")
+            await self.connect()
+            await self.login()
+            await self.register(register_reason=RegPushReason.MsfByNetChange)
+            log.network.debug("reconnected")
             return
 
         exclude = (
@@ -330,7 +339,6 @@ async def reconnect(
         )
         await self.disconnect()
         await self.connect(_server)
-        log.network.debug("reconnected")
 
     async def close(self) -> None:
         """Close the client and logout."""
@@ -343,6 +351,7 @@ async def close(self) -> None:
             await self.register(OnlineStatus.Offline)
         self._receive_store.cancel_all()
         await self.disconnect()
+        self.closed.set()
 
     @property
     def seq(self) -> int:
@@ -424,9 +433,8 @@ async def receive(self):
         """
         while self.connected:
             try:
-                length: int = int.from_bytes(await self.connection.read_bytes(4), "big") - 4
+                length: int = int.from_bytes(await self.connection.read_bytes(4), "big", signed=False) - 4
 
-                # FIXME: length < 0 ?
                 data = await self.connection.read_bytes(length)
                 packet = IncomingPacket.parse(
                     data,
@@ -440,10 +448,9 @@ async def receive(self):
                 )
                 # do not block receive
                 self._loop.create_task(self._handle_incoming_packet(packet))
-            except ConnectionError:  #ConnectionAbortedError:
-                log.logger.exception(f"Client {self.uin} connection closed")
+            except ConnectionAbortedError as e:
+                log.logger.error(f"{self.uin} connection lost: {str(e)}")
                 break
-                #await self.reconnect(change_server=True)
             except Exception as e:
                 log.logger.exception(e)
 
diff --git a/cai/connection/__init__.py b/cai/connection/__init__.py
index 3365a1ab..dcc8b7b3 100644
--- a/cai/connection/__init__.py
+++ b/cai/connection/__init__.py
@@ -64,7 +64,7 @@ def closed(self) -> bool:
 
     @property
     async def wait_closed(self):
-        await self._closed.wait()
+        return self._closed.wait
 
     async def __aenter__(self):
         await self._connect()

From de9228947dfa3d9367ca12f8315f9c7858589df3 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 3 Apr 2022 14:32:09 +0800
Subject: [PATCH 031/113] revert change

---
 cai/client/message_service/encoders.py | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index c55373ef..a088c324 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -48,15 +48,13 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
         else:
             raise NotImplementedError(e)
 
-    d = MsgBody(
+    return MsgBody(
         rich_text=RichText(
             #elems=[Elem(text=e) for e in ret],
             elems=ret,
             ptt=None
         )
     )
-    print(d.SerializeToString().hex())
-    return d
 
 
 def encode_send_group_msg_req(

From 93279cff4784388c9fef28d5d41bebb44bd4c98d Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 3 Apr 2022 15:17:36 +0800
Subject: [PATCH 032/113] update: split highway.py

---
 cai/api/client.py                             |  15 +-
 cai/client/client.py                          |   4 +-
 cai/client/highway.py                         | 221 ------------------
 cai/client/highway/__init__.py                |   4 +
 cai/client/highway/decoders.py                |  29 +++
 .../upload.py => highway/encoders.py}         |   7 +-
 cai/client/highway/frame.py                   |  29 +++
 cai/client/highway/highway.py                 | 131 +++++++++++
 cai/client/highway/models.py                  |  18 ++
 cai/client/highway/utils.py                   |  32 +++
 10 files changed, 252 insertions(+), 238 deletions(-)
 delete mode 100644 cai/client/highway.py
 create mode 100644 cai/client/highway/__init__.py
 create mode 100644 cai/client/highway/decoders.py
 rename cai/client/{message_service/upload.py => highway/encoders.py} (85%)
 create mode 100644 cai/client/highway/frame.py
 create mode 100644 cai/client/highway/highway.py
 create mode 100644 cai/client/highway/models.py
 create mode 100644 cai/client/highway/utils.py

diff --git a/cai/api/client.py b/cai/api/client.py
index 85a9a580..be42e96a 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -10,17 +10,17 @@
 import hashlib
 from typing import Union, Optional, Sequence, BinaryIO
 
+from cai import log
 from cai.client import OnlineStatus, Client as client_t
+from cai.client.highway import HighWaySession
+from cai.client.message_service.models import Element, ImageElement
 from cai.client.message_service.encoders import make_group_msg_pkg, build_msg
 from cai.settings.device import DeviceInfo, new_device
 from cai.settings.protocol import ApkInfo
+
 from .friend import Friend as _Friend
 from .group import Group as _Group
 from .login import Login as _Login
-from cai.utils.gcode import GroupIdConvertor
-from cai.client.message_service.models import Element
-from cai.client.message_service.upload import encode_d388_req
-from ..client.highway import calc_file_md5_and_length, upload_image
 
 
 def make_client(
@@ -43,6 +43,7 @@ def make_client(
 class Client(_Login, _Friend, _Group):
     def __init__(self, client: client_t):
         self.client = client
+        self._highway_session = HighWaySession(client, logger=log.highway)
 
     @property
     def connected(self) -> bool:
@@ -62,10 +63,8 @@ async def send_group_msg(self, gid: int, msg: Sequence[Element]):
             ).SerializeToString()
         )
 
-    async def upload_image(self, group_id: int, file: BinaryIO):
-        await upload_image(file, group_id, self.client)
-        "todo: https://github.com/Mrs4s/MiraiGo/blob/714961d68f3dcd6956771d7b8bdea70d96ad65fd/client/image.go#L98"
-
+    async def upload_image(self, group_id: int, file: BinaryIO) -> ImageElement:
+        return await self._highway_session.upload_image(file, group_id)
 
     async def close(self):
         """Stop Client"""
diff --git a/cai/client/client.py b/cai/client/client.py
index 81ce7437..471310d5 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -8,9 +8,7 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-import logging
 import time
-import struct
 import asyncio
 import secrets
 from typing import (
@@ -302,7 +300,7 @@ def _recv_done_cb(self, _task):
             self._loop.create_task(self.reconnect())
         else:
             log.network.warning("receiver stopped")
-            await self.close()
+            self._loop.create_task(self.close())
 
     async def disconnect(self) -> None:
         """Disconnect if already connected to the server."""
diff --git a/cai/client/highway.py b/cai/client/highway.py
deleted file mode 100644
index 3be5904a..00000000
--- a/cai/client/highway.py
+++ /dev/null
@@ -1,221 +0,0 @@
-import asyncio
-import struct
-import time
-import uuid
-from dataclasses import dataclass
-from hashlib import md5
-from typing import Tuple, BinaryIO, TYPE_CHECKING, Optional, List, Any, Callable, Awaitable
-
-from cai.log import highway as highway_logger
-from cai.client.message_service.models import ImageElement
-from cai.client.message_service.upload import encode_d388_req, decode_d388_rsp
-from cai.pb.highway.protocol.highway_head_pb2 import highway_head
-
-if TYPE_CHECKING:
-    from cai.client.client import Client
-
-
-# https://github.com/Mrs4s/MiraiGo/blob/master/client/internal/highway/highway.go#L79
-
-
-def calc_file_md5_and_length(file: BinaryIO, bs=4096) -> Tuple[bytes, int]:
-    try:
-        fm, length = md5(), 0
-        while True:
-            bl = file.read(bs)
-            fm.update(bl)
-            length += len(bl)
-            if len(bl) != bs:
-                break
-        return fm.digest(), length
-    finally:
-        file.seek(0)
-
-
-def create_highway_header(
-    cmd: bytes,
-    flag: int,
-    cmd_id: int,
-    client: "Client",
-    locale=2052
-) -> highway_head.DataHighwayHead:
-    return highway_head.DataHighwayHead(
-        version=1,
-        uin=str(client.uin).encode(),
-        command=cmd,
-        commandId=cmd_id,
-        seq=client.next_seq(),
-        appid=client.apk_info.app_id,
-        localeId=locale,
-        dataflag=flag
-    )
-
-
-def itoa(i: int) -> str:  # int to address(str)
-    return ".".join([str(p) for p in i.to_bytes(4, "little")])
-
-
-def to_img_id(b_uuid: bytes) -> str:
-    return "{%s}.png" % uuid.UUID(bytes=b_uuid)
-
-
-def write_frame(head: bytes, body: bytes) -> bytes:
-    buf = bytearray()
-    buf.append(0x28)
-    buf += struct.pack("!II", len(head), len(body))
-    buf += head
-    buf += body
-    buf.append(0x29)
-    return buf
-
-
-async def read_frame(reader: asyncio.StreamReader) -> Tuple[highway_head.RspDataHighwayHead, bytes]:
-    head = await reader.readexactly(9)
-    if len(head) != 9 and head[0] != 0x28:
-        raise ValueError("Invalid frame head", head)
-    hl, bl = struct.unpack("!II", head[1:])
-    try:
-        return (
-            highway_head.RspDataHighwayHead.FromString(await reader.readexactly(hl)),
-            await reader.readexactly(bl)
-        )
-    finally:
-        await reader.read(1) # flush end byte
-
-
-async def timeit(func: Awaitable) -> Tuple[float, Any]:
-    start = time.time()
-    result = await func
-    return time.time() - start, result
-
-
-@dataclass
-class ImageUploadResponse:
-    uploadKey: Optional[bytes] = None
-    uploadAddr: Optional[List[Tuple[str, int]]] = None
-    width: Optional[int] = None
-    height: Optional[int] = None
-    message: Optional[str] = None
-    downloadIndex: Optional[str] = None
-    resourceId: Optional[int] = None
-    fileId: Optional[int] = None
-    fileType: Optional[int] = None
-    resultCode: int = 0
-    isExists: bool = False
-    hasMetaData: bool = False
-
-
-def decode_upload_image_resp(data: bytes) -> ImageUploadResponse:
-    pkg = decode_d388_rsp(data).tryupImgRsp[0]
-    if pkg.result != 0:
-        return ImageUploadResponse(resultCode=pkg.result, message=pkg.failMsg.decode())
-
-    if pkg.fileExit:
-        if pkg.imgInfo:
-            info = pkg.imgInfo
-            # fuck: pkg.fileId != pkg.fileid
-            return ImageUploadResponse(
-                isExists=True, fileId=pkg.fileid, hasMetaData=True,
-                fileType=info.fileType, width=info.fileWidth, height=info.fileHeight
-            )
-        else:
-            return ImageUploadResponse(isExists=True, fileId=pkg.fileid)
-    return ImageUploadResponse(
-        isExists=False,
-        uploadAddr=[(itoa(a), p) for a, p in zip(pkg.upIp, pkg.upPort)],
-        uploadKey=pkg.upUkey
-    )
-
-
-async def upload_image(file: BinaryIO, gid: int, client: "Client") -> ImageElement:
-    fmd5, fl = calc_file_md5_and_length(file)
-    ret = decode_upload_image_resp(
-        (await client.send_unipkg_and_wait(
-            "ImgStore.GroupPicUp",
-            encode_d388_req(gid, client.uin, fmd5, fl).SerializeToString()
-        )).data
-    )
-    if ret.resultCode != 0:
-        raise ConnectionError(ret.resultCode)
-    elif not ret.isExists:
-        highway_logger.debug("file not found, uploading...")
-
-        for addr in ret.uploadAddr:
-            try:
-                t, _ = await timeit(
-                    bdh_uploader(
-                        b"PicUp.DataUp",
-                        addr,
-                        file,
-                        2,
-                        ret.uploadKey,
-                        client
-                    )
-                )
-                highway_logger.info("upload complete, use %fs in %d bytes" % (t * 1000, fl))
-            except TimeoutError:
-                highway_logger.error(f"server {addr[0]}:{addr[1]} timeout")
-                continue
-            finally:
-                file.seek(0)
-            break
-        else:
-            raise ConnectionError("cannot upload image, all server failure")
-
-    if ret.hasMetaData:
-        image_type = ret.fileType
-        w, h = ret.width, ret.height
-    else:
-        image_type = 1000
-        w, h = (800, 600)
-
-    return ImageElement(
-        id=ret.fileId,
-        filename=to_img_id(fmd5),
-        size=fl,
-        width=w,
-        height=h,
-        md5=fmd5,
-        filetype=image_type,
-        url=f"https://gchat.qpic.cn/gchatpic_new/1/0-0-{fmd5.hex().upper()}/0?term=2"
-    )
-
-
-async def bdh_uploader(
-    cmd: bytes,
-    addr: Tuple[str, int],
-    file: BinaryIO,
-    cmd_id: int,
-    ticket: bytes,
-    client: "Client", *,
-    block_size=65535
-):
-    fmd5, fl = calc_file_md5_and_length(file)
-    print(addr)
-    reader, writer = await asyncio.open_connection(*addr)
-    bc = 0
-    try:
-        while True:
-            bl = file.read(block_size)
-            if not bl:
-                break
-            head = highway_head.ReqDataHighwayHead(
-                basehead=create_highway_header(cmd, 4096, cmd_id, client),
-                seghead=highway_head.SegHead(
-                    filesize=fl,
-                    dataoffset=bc * block_size,
-                    datalength=len(bl),
-                    serviceticket=ticket,
-                    md5=md5(bl).digest(),
-                    fileMd5=fmd5
-                )
-            ).SerializeToString()
-
-            writer.write(write_frame(head, bl))
-            await writer.drain()
-
-            resp, _ = await read_frame(reader)
-
-            bc += 1
-    finally:
-        writer.close()
diff --git a/cai/client/highway/__init__.py b/cai/client/highway/__init__.py
new file mode 100644
index 00000000..b53b1834
--- /dev/null
+++ b/cai/client/highway/__init__.py
@@ -0,0 +1,4 @@
+from .highway import HighWaySession
+
+
+__all__ = ["HighWaySession"]
diff --git a/cai/client/highway/decoders.py b/cai/client/highway/decoders.py
new file mode 100644
index 00000000..41ff971f
--- /dev/null
+++ b/cai/client/highway/decoders.py
@@ -0,0 +1,29 @@
+from .models import ImageUploadResponse
+from .utils import itoa
+from ...pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388RspBody
+
+
+def decode_upload_image_resp(data: bytes) -> ImageUploadResponse:
+    pkg = decode_d388_rsp(data).tryupImgRsp[0]
+    if pkg.result != 0:
+        return ImageUploadResponse(resultCode=pkg.result, message=pkg.failMsg.decode())
+
+    if pkg.fileExit:
+        if pkg.imgInfo:
+            info = pkg.imgInfo
+            # fuck: pkg.fileId != pkg.fileid
+            return ImageUploadResponse(
+                isExists=True, fileId=pkg.fileid, hasMetaData=True,
+                fileType=info.fileType, width=info.fileWidth, height=info.fileHeight
+            )
+        else:
+            return ImageUploadResponse(isExists=True, fileId=pkg.fileid)
+    return ImageUploadResponse(
+        isExists=False,
+        uploadAddr=[(itoa(a), p) for a, p in zip(pkg.upIp, pkg.upPort)],
+        uploadKey=pkg.upUkey
+    )
+
+
+def decode_d388_rsp(data: bytes) -> D388RspBody:
+    return D388RspBody.FromString(data)
diff --git a/cai/client/message_service/upload.py b/cai/client/highway/encoders.py
similarity index 85%
rename from cai/client/message_service/upload.py
rename to cai/client/highway/encoders.py
index d38afe6a..ab733119 100644
--- a/cai/client/message_service/upload.py
+++ b/cai/client/highway/encoders.py
@@ -1,6 +1,4 @@
-import os
-
-from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388ReqBody, TryUpImgReq, D388RspBody
+from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388ReqBody, TryUpImgReq
 
 
 def encode_d388_req(group_code: int, uin: int, md5: bytes, size: int) -> D388ReqBody:
@@ -28,6 +26,3 @@ def encode_d388_req(group_code: int, uin: int, md5: bytes, size: int) -> D388Req
         )]
     )
 
-
-def decode_d388_rsp(data: bytes) -> D388RspBody:
-    return D388RspBody.FromString(data)
diff --git a/cai/client/highway/frame.py b/cai/client/highway/frame.py
new file mode 100644
index 00000000..4c557930
--- /dev/null
+++ b/cai/client/highway/frame.py
@@ -0,0 +1,29 @@
+import asyncio
+import struct
+from typing import Tuple
+
+from cai.pb.highway.protocol.highway_head_pb2 import highway_head
+
+
+def write_frame(head: bytes, body: bytes) -> bytes:
+    buf = bytearray()
+    buf.append(0x28)
+    buf += struct.pack("!II", len(head), len(body))
+    buf += head
+    buf += body
+    buf.append(0x29)
+    return buf
+
+
+async def read_frame(reader: asyncio.StreamReader) -> Tuple[highway_head.RspDataHighwayHead, bytes]:
+    head = await reader.readexactly(9)
+    if len(head) != 9 and head[0] != 0x28:
+        raise ValueError("Invalid frame head", head)
+    hl, bl = struct.unpack("!II", head[1:])
+    try:
+        return (
+            highway_head.RspDataHighwayHead.FromString(await reader.readexactly(hl)),
+            await reader.readexactly(bl)
+        )
+    finally:
+        await reader.read(1)  # flush end byte
diff --git a/cai/client/highway/highway.py b/cai/client/highway/highway.py
new file mode 100644
index 00000000..2dc1c711
--- /dev/null
+++ b/cai/client/highway/highway.py
@@ -0,0 +1,131 @@
+import asyncio
+import logging
+from hashlib import md5
+from typing import Tuple, BinaryIO, TYPE_CHECKING
+
+from .decoders import decode_upload_image_resp
+from .encoders import encode_d388_req
+from .utils import calc_file_md5_and_length, timeit, to_img_id
+from .frame import read_frame, write_frame
+from cai.pb.highway.protocol.highway_head_pb2 import highway_head
+from ..message_service.models import ImageElement
+
+if TYPE_CHECKING:
+    from cai.client.client import Client
+
+
+def _create_highway_header(
+    cmd: bytes,
+    flag: int,
+    cmd_id: int,
+    client: "Client",
+    locale=2052
+) -> highway_head.DataHighwayHead:
+    return highway_head.DataHighwayHead(
+        version=1,
+        uin=str(client.uin).encode(),
+        command=cmd,
+        commandId=cmd_id,
+        seq=client.next_seq(),
+        appid=client.apk_info.app_id,
+        localeId=locale,
+        dataflag=flag
+    )
+
+
+class HighWaySession:
+    def __init__(self, client: "Client", logger: logging.Logger = None):
+        if not logger:
+            logger = logging.getLogger(__name__)
+        self.logger = logger
+        self._client = client
+
+    async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
+        fmd5, fl = calc_file_md5_and_length(file)
+        ret = decode_upload_image_resp(
+            (await self._client.send_unipkg_and_wait(
+                "ImgStore.GroupPicUp",
+                encode_d388_req(gid, self._client.uin, fmd5, fl).SerializeToString()
+            )).data
+        )
+        if ret.resultCode != 0:
+            raise ConnectionError(ret.resultCode)
+        elif not ret.isExists:
+            self.logger.debug("file not found, uploading...")
+
+            for addr in ret.uploadAddr:
+                try:
+                    t, _ = await timeit(
+                        self.bdh_uploader(
+                            b"PicUp.DataUp",
+                            addr,
+                            file,
+                            2,
+                            ret.uploadKey
+                        )
+                    )
+                    self.logger.info("upload complete, use %fs in %d bytes" % (t * 1000, fl))
+                except TimeoutError:
+                    self.logger.error(f"server {addr[0]}:{addr[1]} timeout")
+                    continue
+                finally:
+                    file.seek(0)
+                break
+            else:
+                raise ConnectionError("cannot upload image, all server failure")
+
+        if ret.hasMetaData:
+            image_type = ret.fileType
+            w, h = ret.width, ret.height
+        else:
+            image_type = 1000
+            w, h = (800, 600)
+
+        return ImageElement(
+            id=ret.fileId,
+            filename=to_img_id(fmd5),
+            size=fl,
+            width=w,
+            height=h,
+            md5=fmd5,
+            filetype=image_type,
+            url=f"https://gchat.qpic.cn/gchatpic_new/1/0-0-{fmd5.hex().upper()}/0?term=2"
+        )
+
+    async def bdh_uploader(
+        self,
+        cmd: bytes,
+        addr: Tuple[str, int],
+        file: BinaryIO,
+        cmd_id: int,
+        ticket: bytes, *,
+        block_size=65535
+    ):
+        fmd5, fl = calc_file_md5_and_length(file)
+        reader, writer = await asyncio.open_connection(*addr)
+        bc = 0
+        try:
+            while True:
+                bl = file.read(block_size)
+                if not bl:
+                    break
+                head = highway_head.ReqDataHighwayHead(
+                    basehead=_create_highway_header(cmd, 4096, cmd_id, self._client),
+                    seghead=highway_head.SegHead(
+                        filesize=fl,
+                        dataoffset=bc * block_size,
+                        datalength=len(bl),
+                        serviceticket=ticket,
+                        md5=md5(bl).digest(),
+                        fileMd5=fmd5
+                    )
+                ).SerializeToString()
+
+                writer.write(write_frame(head, bl))
+                await writer.drain()
+
+                resp, _ = await read_frame(reader)
+
+                bc += 1
+        finally:
+            writer.close()
diff --git a/cai/client/highway/models.py b/cai/client/highway/models.py
new file mode 100644
index 00000000..b598217d
--- /dev/null
+++ b/cai/client/highway/models.py
@@ -0,0 +1,18 @@
+from dataclasses import dataclass
+from typing import Optional, List, Tuple
+
+
+@dataclass
+class ImageUploadResponse:
+    uploadKey: Optional[bytes] = None
+    uploadAddr: Optional[List[Tuple[str, int]]] = None
+    width: Optional[int] = None
+    height: Optional[int] = None
+    message: Optional[str] = None
+    downloadIndex: Optional[str] = None
+    resourceId: Optional[int] = None
+    fileId: Optional[int] = None
+    fileType: Optional[int] = None
+    resultCode: int = 0
+    isExists: bool = False
+    hasMetaData: bool = False
diff --git a/cai/client/highway/utils.py b/cai/client/highway/utils.py
new file mode 100644
index 00000000..5958499d
--- /dev/null
+++ b/cai/client/highway/utils.py
@@ -0,0 +1,32 @@
+import time
+import uuid
+from hashlib import md5
+from typing import BinaryIO, Tuple, Awaitable, Any
+
+
+def calc_file_md5_and_length(file: BinaryIO, bs=4096) -> Tuple[bytes, int]:
+    try:
+        fm, length = md5(), 0
+        while True:
+            bl = file.read(bs)
+            fm.update(bl)
+            length += len(bl)
+            if len(bl) != bs:
+                break
+        return fm.digest(), length
+    finally:
+        file.seek(0)
+
+
+def itoa(i: int) -> str:  # int to address(str)
+    return ".".join([str(p) for p in i.to_bytes(4, "little")])
+
+
+def to_img_id(b_uuid: bytes) -> str:
+    return "{%s}.png" % uuid.UUID(bytes=b_uuid)
+
+
+async def timeit(func: Awaitable) -> Tuple[float, Any]:
+    start = time.time()
+    result = await func
+    return time.time() - start, result

From 270ed93cd15012864e3a63088743468be9bea98d Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 3 Apr 2022 16:21:49 +0800
Subject: [PATCH 033/113] update: reconnect method

---
 cai/client/client.py | 1 -
 1 file changed, 1 deletion(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 471310d5..dd6eceea 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -322,7 +322,6 @@ async def reconnect(
         if not change_server and self._connection:
             log.network.debug("reconnecting...")
             await self.connect()
-            await self.login()
             await self.register(register_reason=RegPushReason.MsfByNetChange)
             log.network.debug("reconnected")
             return

From 43ee0a4baf142f6219e6c715c9bad5f843f38ef6 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 3 Apr 2022 16:21:59 +0800
Subject: [PATCH 034/113] remove: unused code

---
 cai/client/message_service/encoders.py | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index a088c324..be0371ad 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -1,16 +1,12 @@
 import random
 
-from typing import Sequence, TYPE_CHECKING, Dict, Type
+from typing import Sequence
 from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, CustomFace, Elem
-from cai.pb.msf.msg.svc.svc_pb2 import PbSendMsgReq, RoutingHead, Grp
+from cai.pb.msf.msg.svc.svc_pb2 import RoutingHead, Grp
 from cai.pb.msf.msg.comm.comm_pb2 import ContentHead
-from cai.client.packet import UniPacket
 
 from . import models
-from ...pb.msf.msg.svc import PbSendMsgReq
-
-if TYPE_CHECKING:
-    from cai.client.client import Client
+from cai.pb.msf.msg.svc import PbSendMsgReq
 
 
 # todo: https://github.com/mamoe/mirai/blob/7d3971259de59cede94b7a55650c8a6ad4346a59/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbSendMsg.kt#L103

From 79059158d1f567f6f1c1f17150d2ff73bd4cc2a5 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 3 Apr 2022 17:42:00 +0800
Subject: [PATCH 035/113] fix: login failfast

---
 cai/client/client.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/cai/client/client.py b/cai/client/client.py
index dd6eceea..8d1dab09 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -8,9 +8,11 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
+import sys
 import time
 import asyncio
 import secrets
+import traceback
 from typing import (
     Any,
     Set,
@@ -340,6 +342,7 @@ async def reconnect(
     async def close(self) -> None:
         """Close the client and logout."""
         log.logger.warning("closing client")
+        self._reconnect = False
         if (
             self.connected
             and self.status

From 97ca3a4bddd71463d92f45b5aef7277cbabf802a Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 3 Apr 2022 17:58:04 +0800
Subject: [PATCH 036/113] add: FlashImage At RichMsg parse

---
 cai/client/message_service/decoders.py | 55 +++++++++++++++++++++++++-
 cai/client/message_service/models.py   | 36 +++++++++++++++++
 2 files changed, 89 insertions(+), 2 deletions(-)

diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index e5b2983d..8a3b49fb 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -8,7 +8,7 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-
+import zlib
 from itertools import chain
 from typing import Dict, List, Callable, Optional, Sequence
 
@@ -18,19 +18,23 @@
 from cai.pb.im.msg.msg_body import Elem
 from cai.pb.im.msg.service.comm_elem import (
     MsgElemInfo_servtype2,
+    MsgElemInfo_servtype3,
     MsgElemInfo_servtype33,
 )
 
 from .models import (
     Element,
+    AtElement,
     FaceElement,
     PokeElement,
     TextElement,
     GroupMessage,
     ImageElement,
     ReplyElement,
+    RichMsgElement,
     PrivateMessage,
     SmallEmojiElement,
+    FlashImageElement
 )
 
 
@@ -67,7 +71,39 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                 )
         # TextElemDecoder
         if elem.HasField("text"):
-            res.append(TextElement(elem.text.str.decode("utf-8")))
+            if elem.text.attr_6_buf:
+                res.append(
+                    AtElement(
+                        int.from_bytes(elem.text.attr_6_buf[7:11], "big", signed=False),
+                        elem.text.str.decode("utf-8")
+                    )
+                )
+            else:
+                res.append(TextElement(elem.text.str.decode("utf-8")))
+        if elem.HasField("rich_msg"):
+            if elem.rich_msg.template_1[0]:
+                content = zlib.decompress(elem.rich_msg.template_1[1:])
+            else:
+                content = elem.rich_msg.template_1[1:]
+            res.append(
+                RichMsgElement(
+                    content,
+                    elem.rich_msg.service_id if content[1] == 60 else -1
+                )
+            )
+            break
+        if elem.HasField("light_app"):
+            if elem.light_app.data[0]:
+                content = zlib.decompress(elem.light_app.data[1:])
+            else:
+                content = elem.light_app.data[1:]
+            res.append(
+                RichMsgElement(
+                    content,
+                    -2
+                )
+            )
+            break
         # TextElemDecoder
         if elem.HasField("face"):
             res.append(FaceElement(elem.face.index))
@@ -167,6 +203,21 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                     )
                 ]
                 break
+            elif service_type == 3:
+                flash = MsgElemInfo_servtype3.FromString(elem.common_elem.pb_elem)
+                if flash.flash_troop_pic:
+                    res.append(
+                        FlashImageElement(
+                            id=flash.flash_troop_pic.file_id,
+                            filename=flash.flash_troop_pic.file_path,
+                            filetype=flash.flash_troop_pic.file_type,
+                            size=flash.flash_troop_pic.size,
+                            md5=flash.flash_troop_pic.md5,
+                            width=flash.flash_troop_pic.width,
+                            height=flash.flash_troop_pic.height
+                        )
+                    )
+                break
             # TextElemDecoder
             elif service_type == 33:
                 info = MsgElemInfo_servtype33.FromString(
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 7dd10ed9..f2df2f4a 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -115,6 +115,13 @@ def type(self) -> str:
         return "image"
 
 
+@dataclass
+class FlashImageElement(ImageElement):
+    @property
+    def type(self) -> str:
+        return "flash_image"
+
+
 @dataclass
 class PokeElement(Element):
     id: int
@@ -125,3 +132,32 @@ class PokeElement(Element):
     @property
     def type(self) -> str:
         return "poke"
+
+
+@dataclass
+class AtElement(Element):
+    target: int
+    display: Optional[str] = ""
+
+    @property
+    def type(self) -> str:
+        return "at"
+
+
+@dataclass
+class RichMsgElement(Element):
+    """
+    service_id:
+      case -1:
+        json
+      case -2:
+        light_app
+      default:
+        xml
+    """
+    content: bytes
+    service_id: Optional[int] = -1
+
+    @property
+    def type(self) -> str:
+        return "rich_msg"

From 398b92bd0a2349cbf599aa7369f981e719a98506 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 3 Apr 2022 22:44:44 +0800
Subject: [PATCH 037/113] add: raise send_group_msg error

---
 cai/api/client.py    | 26 ++++++++++++++++++++------
 cai/api/error.py     | 18 ++++++++++++++++++
 cai/client/client.py |  2 --
 3 files changed, 38 insertions(+), 8 deletions(-)
 create mode 100644 cai/api/error.py

diff --git a/cai/api/client.py b/cai/api/client.py
index be42e96a..c86a661e 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -18,10 +18,13 @@
 from cai.settings.device import DeviceInfo, new_device
 from cai.settings.protocol import ApkInfo
 
+from .error import BotMutedException, AtAllLimitException, GroupMsgLimitException
 from .friend import Friend as _Friend
 from .group import Group as _Group
 from .login import Login as _Login
 
+from cai.pb.msf.msg.svc import PbSendMsgResp
+
 
 def make_client(
     uin: int,
@@ -54,15 +57,26 @@ def status(self) -> Optional[OnlineStatus]:
         return self.client.status
 
     async def send_group_msg(self, gid: int, msg: Sequence[Element]):
-        seq = self.client.next_seq()
         # todo: split long msg
-        return await self.client.send_unipkg_and_wait(
-            "MessageSvc.PbSendMsg",
-            make_group_msg_pkg(
-                seq, gid, build_msg(msg)
-            ).SerializeToString()
+        resp: PbSendMsgResp = PbSendMsgResp.FromString(
+            (await self.client.send_unipkg_and_wait(
+                "MessageSvc.PbSendMsg",
+                make_group_msg_pkg(
+                    self.client.next_seq(), gid, build_msg(msg)
+                ).SerializeToString()
+            )).data
         )
 
+        if resp.result == 120:
+            raise BotMutedException
+        elif resp.result == 121:
+            raise AtAllLimitException
+        elif resp.result == 299:
+            raise GroupMsgLimitException
+        else:
+            # todo: store msg
+            return resp
+
     async def upload_image(self, group_id: int, file: BinaryIO) -> ImageElement:
         return await self._highway_session.upload_image(file, group_id)
 
diff --git a/cai/api/error.py b/cai/api/error.py
new file mode 100644
index 00000000..569a4d44
--- /dev/null
+++ b/cai/api/error.py
@@ -0,0 +1,18 @@
+class BotException(Exception):
+    pass
+
+
+class BotMutedException(BotException):
+    pass
+
+
+class LimitException(Exception):
+    pass
+
+
+class AtAllLimitException(LimitException):
+    pass
+
+
+class GroupMsgLimitException(LimitException):
+    pass
diff --git a/cai/client/client.py b/cai/client/client.py
index 8d1dab09..888ed6cf 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -8,11 +8,9 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-import sys
 import time
 import asyncio
 import secrets
-import traceback
 from typing import (
     Any,
     Set,

From f73d8682b1615da94e63713c28d8efe4ceb9c482 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sun, 3 Apr 2022 23:39:11 +0800
Subject: [PATCH 038/113] add: send At & FlashImage

---
 cai/client/message_service/encoders.py | 63 ++++++++++++++++++--------
 1 file changed, 44 insertions(+), 19 deletions(-)

diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index be0371ad..416c5e97 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -1,7 +1,7 @@
 import random
 
-from typing import Sequence
-from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, CustomFace, Elem
+from typing import Sequence, Union
+from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, CustomFace, Elem, CommonElem
 from cai.pb.msf.msg.svc.svc_pb2 import RoutingHead, Grp
 from cai.pb.msf.msg.comm.comm_pb2 import ContentHead
 
@@ -12,6 +12,27 @@
 # todo: https://github.com/mamoe/mirai/blob/7d3971259de59cede94b7a55650c8a6ad4346a59/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbSendMsg.kt#L103
 # https://github.com/mamoe/mirai/blob/74fc5a50376ed0330b984af51e0fabc2147afdbb/mirai-core/src/commonMain/kotlin/contact/SendMessageHandler.kt
 
+
+def _build_image_elem(e: Union[models.ImageElement, models.FlashImageElement]) -> CustomFace:
+    return CustomFace(
+        file_type=66,
+        useful=1,
+        biz_type=0,
+        width=e.width,
+        height=e.height,
+        file_id=e.id,
+        file_path=e.filename,
+        image_type=e.filetype,
+        source=200,
+        origin=1,
+        size=e.size,
+        md5=e.md5,
+        show_len=0,
+        download_len=0
+        #flag=b"\x00\x00\x00\x00"
+    )
+
+
 def build_msg(elements: Sequence[models.Element]) -> MsgBody:
     ret = []
     for e in elements:  # todo: support more element
@@ -22,22 +43,27 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
         elif isinstance(e, models.ImageElement):
             ret.append(
                 Elem(
-                    custom_face=CustomFace(
-                        file_type=66,
-                        useful=1,
-                        biz_type=0,
-                        width=e.width,
-                        height=e.height,
-                        file_id=e.id,
-                        file_path=e.filename,
-                        image_type=e.filetype,
-                        source=200,
-                        origin=1,
-                        size=e.size,
-                        md5=e.md5,
-                        show_len=0,
-                        download_len=0
-                        #flag=b"\x00\x00\x00\x00"
+                    custom_face=_build_image_elem(e)
+                )
+            )
+        elif isinstance(e, models.FlashImageElement):
+            ret.append(
+                Elem(
+                    common_elem=CommonElem(
+                        service_type=3,
+                        pb_elem=_build_image_elem(e).SerializeToString()
+                    )
+                )
+            )
+            ret.append(  # fallback info
+                Elem(text=PlainText(str="[闪照]请使用新版手机QQ查看".encode()))
+            )
+        elif isinstance(e, models.AtElement):
+            ret.append(
+                Elem(
+                    text=PlainText(
+                        str=e.display.encode(),
+                        attr_6_buf=b"\x00\x01\x00\x00\x00\x03\x00"+e.target.to_bytes(4, "big", signed=False)+b"\x00\x00"
                     )
                 )
             )
@@ -46,7 +72,6 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
 
     return MsgBody(
         rich_text=RichText(
-            #elems=[Elem(text=e) for e in ret],
             elems=ret,
             ptt=None
         )

From 9afe29884d39cc80cb77a4392a5d98881a2c2725 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Mon, 4 Apr 2022 00:11:11 +0800
Subject: [PATCH 039/113] add: send RichMsg

---
 cai/client/message_service/decoders.py | 10 ++++------
 cai/client/message_service/encoders.py | 18 +++++++++++++++++-
 cai/client/message_service/models.py   |  2 +-
 3 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index 8a3b49fb..bd0a67a6 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -85,25 +85,23 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                 content = zlib.decompress(elem.rich_msg.template_1[1:])
             else:
                 content = elem.rich_msg.template_1[1:]
-            res.append(
+            return [
                 RichMsgElement(
                     content,
                     elem.rich_msg.service_id if content[1] == 60 else -1
                 )
-            )
-            break
+            ]
         if elem.HasField("light_app"):
             if elem.light_app.data[0]:
                 content = zlib.decompress(elem.light_app.data[1:])
             else:
                 content = elem.light_app.data[1:]
-            res.append(
+            return [
                 RichMsgElement(
                     content,
                     -2
                 )
-            )
-            break
+            ]
         # TextElemDecoder
         if elem.HasField("face"):
             res.append(FaceElement(elem.face.index))
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index 416c5e97..79cb8d66 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -1,7 +1,8 @@
 import random
+import zlib
 
 from typing import Sequence, Union
-from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, CustomFace, Elem, CommonElem
+from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, CustomFace, Elem, CommonElem, LightAppElem, RichMsg
 from cai.pb.msf.msg.svc.svc_pb2 import RoutingHead, Grp
 from cai.pb.msf.msg.comm.comm_pb2 import ContentHead
 
@@ -67,6 +68,21 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
                     )
                 )
             )
+        elif isinstance(e, models.RichMsgElement):
+            if len(e.content) > 256:  # compress require
+                content = b"\x01" + zlib.compress(e.content, level=6)
+            else:
+                content = b"\x00" + e.content
+            if e.service_id == -2:  # LightApp
+                ret_elem = Elem(light_app=LightAppElem(
+                    data=content
+                ))
+            else:  # Json & Xml
+                ret_elem = Elem(rich_msg=RichMsg(
+                    template_1=content,
+                    service_id=0 if e.service_id < 0 else e.service_id
+                ))
+            ret.append(ret_elem)
         else:
             raise NotImplementedError(e)
 
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index f2df2f4a..5dbb2bb8 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -156,7 +156,7 @@ class RichMsgElement(Element):
         xml
     """
     content: bytes
-    service_id: Optional[int] = -1
+    service_id: Optional[int] = -2
 
     @property
     def type(self) -> str:

From 5cbafe85d41a2b3e4b620f3aafdc85d17498c490 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Mon, 4 Apr 2022 10:46:45 +0800
Subject: [PATCH 040/113] fix: remove redundancy data of Reply

---
 cai/client/message_service/decoders.py | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index bd0a67a6..dfdf3ad3 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -60,6 +60,12 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
         # SrcElemDecoder
         if elem.HasField("src_msg"):
             if len(elem.src_msg.orig_seqs) > 0:
+                # preprocess
+                # Delete redundancy data
+                if index == 2:  # Sent by PC
+                    res = []
+                else:
+                    index += 1  # pass
                 res.append(
                     ReplyElement(
                         elem.src_msg.orig_seqs[0],

From 77cd27aff299553c8cfe26439622bf7256f27cf6 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 00:07:48 +0800
Subject: [PATCH 041/113] fix: rich_msg parse

---
 cai/client/message_service/decoders.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index dfdf3ad3..13fe98ec 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -94,7 +94,7 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
             return [
                 RichMsgElement(
                     content,
-                    elem.rich_msg.service_id if content[1] == 60 else -1
+                    elem.rich_msg.service_id if content[0] == 60 else -1
                 )
             ]
         if elem.HasField("light_app"):

From ab243e0c6719620e7f90ca8c2af7ca9fe3374d12 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 00:09:25 +0800
Subject: [PATCH 042/113] change: heartbeat err

---
 cai/client/client.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 888ed6cf..460a7919 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -985,8 +985,8 @@ async def heartbeat(self) -> None:
                 )
                 if not isinstance(response, Heartbeat):
                     raise RuntimeError("Invalid heartbeat response type!")
-            except Exception:
-                log.network.exception("Heartbeat.Alive: Failed")
+            except (ConnectionError, TimeoutError) as e:
+                log.network.error(f"Heartbeat.Alive: failed by {str(e)}")
                 break
             await asyncio.sleep(self._heartbeat_interval)
 

From 95d6d51609105a8f170e6c543b1889efd1f763b7 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 00:29:34 +0800
Subject: [PATCH 043/113] change: log level

---
 cai/client/client.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 460a7919..83217373 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -320,10 +320,10 @@ async def reconnect(
         """
 
         if not change_server and self._connection:
-            log.network.debug("reconnecting...")
+            log.network.warning("reconnecting...")
             await self.connect()
             await self.register(register_reason=RegPushReason.MsfByNetChange)
-            log.network.debug("reconnected")
+            log.network.info("reconnected")
             return
 
         exclude = (

From d5fbcd865759517463325986b7b70aa07428ad53 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 01:43:28 +0800
Subject: [PATCH 044/113] add: AtAll recv/send

---
 cai/client/message_service/decoders.py | 14 +++++++++-----
 cai/client/message_service/encoders.py |  9 +++++++++
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index 13fe98ec..95aca362 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -31,6 +31,7 @@
     GroupMessage,
     ImageElement,
     ReplyElement,
+    AtAllElement,
     RichMsgElement,
     PrivateMessage,
     SmallEmojiElement,
@@ -78,12 +79,15 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
         # TextElemDecoder
         if elem.HasField("text"):
             if elem.text.attr_6_buf:
-                res.append(
-                    AtElement(
-                        int.from_bytes(elem.text.attr_6_buf[7:11], "big", signed=False),
-                        elem.text.str.decode("utf-8")
+                if elem.text.attr_6_buf[6]:  # AtAll
+                    res.append(AtAllElement())
+                else:
+                    res.append(
+                        AtElement(
+                            int.from_bytes(elem.text.attr_6_buf[7:11], "big", signed=False),
+                            elem.text.str.decode("utf-8")
+                        )
                     )
-                )
             else:
                 res.append(TextElement(elem.text.str.decode("utf-8")))
         if elem.HasField("rich_msg"):
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index 79cb8d66..e81f686e 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -68,6 +68,15 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
                     )
                 )
             )
+        elif isinstance(e, models.AtAllElement):
+            ret.append(
+                Elem(
+                    text=PlainText(
+                        str="@全体成员".encode(),
+                        attr_6_buf=b"\x00\x01\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00"
+                    )
+                )
+            )
         elif isinstance(e, models.RichMsgElement):
             if len(e.content) > 256:  # compress require
                 content = b"\x01" + zlib.compress(e.content, level=6)

From 325e0abadd2a77099817c0a365f0ccf25e7a9e85 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 01:43:46 +0800
Subject: [PATCH 045/113] add: AtAll recv/send

---
 cai/client/message_service/models.py | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 5dbb2bb8..40f447e6 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -99,6 +99,13 @@ def type(self) -> str:
         return "small_emoji"
 
 
+@dataclass
+class AtAllElement(Element):
+    @property
+    def type(self) -> str:
+        return "at_all"
+
+
 @dataclass
 class ImageElement(Element):
     filename: str

From 18be327194837e044d0df22bffc140801f3169fb Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 01:46:57 +0800
Subject: [PATCH 046/113] add: Image.to_flash

---
 cai/client/message_service/models.py | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 40f447e6..55a766be 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -121,6 +121,18 @@ class ImageElement(Element):
     def type(self) -> str:
         return "image"
 
+    def to_flash(self) -> "FlashImageElement":
+        return FlashImageElement(
+            filename=self.filename,
+            filetype=self.filetype,
+            size=self.size,
+            width=self.width,
+            height=self.height,
+            md5=self.md5,
+            id=self.id,
+            url=self.url
+        )
+
 
 @dataclass
 class FlashImageElement(ImageElement):

From 446f383bba3ff3af60284bd4bc6b2c6f7d16d7d4 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 01:54:31 +0800
Subject: [PATCH 047/113] fix: flash_image build err

---
 cai/client/message_service/encoders.py | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index e81f686e..4cd61b25 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -12,6 +12,7 @@
 
 # todo: https://github.com/mamoe/mirai/blob/7d3971259de59cede94b7a55650c8a6ad4346a59/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbSendMsg.kt#L103
 # https://github.com/mamoe/mirai/blob/74fc5a50376ed0330b984af51e0fabc2147afdbb/mirai-core/src/commonMain/kotlin/contact/SendMessageHandler.kt
+from ...pb.im.msg.service.comm_elem import MsgElemInfo_servtype3
 
 
 def _build_image_elem(e: Union[models.ImageElement, models.FlashImageElement]) -> CustomFace:
@@ -41,24 +42,24 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
             ret.append(
                 Elem(text=PlainText(str=e.content.encode()))
             )
-        elif isinstance(e, models.ImageElement):
-            ret.append(
-                Elem(
-                    custom_face=_build_image_elem(e)
-                )
-            )
         elif isinstance(e, models.FlashImageElement):
             ret.append(
                 Elem(
                     common_elem=CommonElem(
                         service_type=3,
-                        pb_elem=_build_image_elem(e).SerializeToString()
+                        pb_elem=MsgElemInfo_servtype3(flash_troop_pic=_build_image_elem(e)).SerializeToString()
                     )
                 )
             )
             ret.append(  # fallback info
                 Elem(text=PlainText(str="[闪照]请使用新版手机QQ查看".encode()))
             )
+        elif isinstance(e, models.ImageElement):
+            ret.append(
+                Elem(
+                    custom_face=_build_image_elem(e)
+                )
+            )
         elif isinstance(e, models.AtElement):
             ret.append(
                 Elem(

From 897e78c54ce82dfbc69e6f90fbd9ed7ac71ff052 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 02:03:55 +0800
Subject: [PATCH 048/113] fix: flash_image no url

---
 cai/client/message_service/decoders.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index 95aca362..5ff29670 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -222,7 +222,8 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                             size=flash.flash_troop_pic.size,
                             md5=flash.flash_troop_pic.md5,
                             width=flash.flash_troop_pic.width,
-                            height=flash.flash_troop_pic.height
+                            height=flash.flash_troop_pic.height,
+                            url=f"https://gchat.qpic.cn/gchatpic_new/0/0-0-{flash.flash_troop_pic.md5.hex().upper()}/0"
                         )
                     )
                 break

From 0054da13bf0f70a212318e2e1643f3ad9c9e325c Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 02:26:47 +0800
Subject: [PATCH 049/113] add: shake_window & improve parser

---
 cai/client/message_service/decoders.py | 21 +++++++++++----------
 cai/client/message_service/encoders.py | 12 +++++++++++-
 cai/client/message_service/models.py   | 10 ++++++++++
 3 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index 5ff29670..907f06b2 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -35,7 +35,7 @@
     RichMsgElement,
     PrivateMessage,
     SmallEmojiElement,
-    FlashImageElement
+    FlashImageElement, ShakeElement
 )
 
 
@@ -77,7 +77,7 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                     )
                 )
         # TextElemDecoder
-        if elem.HasField("text"):
+        elif elem.HasField("text"):
             if elem.text.attr_6_buf:
                 if elem.text.attr_6_buf[6]:  # AtAll
                     res.append(AtAllElement())
@@ -90,7 +90,7 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                     )
             else:
                 res.append(TextElement(elem.text.str.decode("utf-8")))
-        if elem.HasField("rich_msg"):
+        elif elem.HasField("rich_msg"):
             if elem.rich_msg.template_1[0]:
                 content = zlib.decompress(elem.rich_msg.template_1[1:])
             else:
@@ -101,7 +101,7 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                     elem.rich_msg.service_id if content[0] == 60 else -1
                 )
             ]
-        if elem.HasField("light_app"):
+        elif elem.HasField("light_app"):
             if elem.light_app.data[0]:
                 content = zlib.decompress(elem.light_app.data[1:])
             else:
@@ -113,10 +113,10 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                 )
             ]
         # TextElemDecoder
-        if elem.HasField("face"):
+        elif elem.HasField("face"):
             res.append(FaceElement(elem.face.index))
         # TextElemDecoder
-        if elem.HasField("small_emoji"):
+        elif elem.HasField("small_emoji"):
             index += 1
             text = elems[index].text.str.decode("utf-8")
             res.append(
@@ -136,7 +136,7 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                 )
             )
         # PictureElemDecoder
-        if elem.HasField("custom_face"):
+        elif elem.HasField("custom_face"):
             if elem.custom_face.md5 and elem.custom_face.orig_url:
                 res.append(
                     ImageElement(
@@ -162,7 +162,7 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                     )
                 )
         # PictureElemDecoder
-        if elem.HasField("not_online_image"):
+        elif elem.HasField("not_online_image"):
             if elem.not_online_image.orig_url:
                 res.append(
                     ImageElement(
@@ -193,7 +193,7 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                         + "/0",
                     )
                 )
-        if elem.HasField("common_elem"):
+        elif elem.HasField("common_elem"):
             service_type = elem.common_elem.service_type
             # PokeMsgElemDecoder
             if service_type == 2:
@@ -233,7 +233,8 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                     elem.common_elem.pb_elem
                 )
                 res.append(FaceElement(info.index))
-
+        elif elem.HasField("shake_window"):
+            res.append(ShakeElement(stype=elem.shake_window.type, uin=elem.shake_window.uin))
         index += 1
     return res
 
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index 4cd61b25..c0e8d89b 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -2,7 +2,8 @@
 import zlib
 
 from typing import Sequence, Union
-from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, CustomFace, Elem, CommonElem, LightAppElem, RichMsg
+from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, CustomFace, Elem, CommonElem, LightAppElem, RichMsg, \
+    ShakeWindow
 from cai.pb.msf.msg.svc.svc_pb2 import RoutingHead, Grp
 from cai.pb.msf.msg.comm.comm_pb2 import ContentHead
 
@@ -93,6 +94,15 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
                     service_id=0 if e.service_id < 0 else e.service_id
                 ))
             ret.append(ret_elem)
+        elif isinstance(e, models.ShakeElement):
+            ret.append(
+                Elem(
+                    shake_window=ShakeWindow(type=e.stype, uin=e.uin)
+                )
+            )
+            ret.append(  # fallback info
+                Elem(text=PlainText(str="[窗口抖动]请使用新版手机QQ查看".encode()))
+            )
         else:
             raise NotImplementedError(e)
 
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 55a766be..b5796572 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -180,3 +180,13 @@ class RichMsgElement(Element):
     @property
     def type(self) -> str:
         return "rich_msg"
+
+
+@dataclass
+class ShakeElement(Element):
+    stype: int = 0
+    uin: int = 0
+
+    @property
+    def type(self) -> str:
+        return "shake"

From e7d37e09141ca2d8f4b78f85d0084d53640cdf1e Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 03:00:58 +0800
Subject: [PATCH 050/113] add: poke send

---
 cai/client/message_service/decoders.py |  3 ++-
 cai/client/message_service/encoders.py | 19 ++++++++++++++++++-
 cai/client/message_service/models.py   |  8 ++++----
 3 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index 907f06b2..f815c3bd 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -200,6 +200,7 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                 poke = MsgElemInfo_servtype2.FromString(
                     elem.common_elem.pb_elem
                 )
+                print(poke)
                 res = [
                     PokeElement(
                         poke.poke_type
@@ -207,7 +208,7 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                         else poke.vaspoke_id,
                         poke.vaspoke_name.decode("utf-8"),
                         poke.poke_strength,
-                        poke.double_hit,
+                        poke.double_hit
                     )
                 ]
                 break
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index c0e8d89b..41a5034d 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -9,11 +9,11 @@
 
 from . import models
 from cai.pb.msf.msg.svc import PbSendMsgReq
+from cai.pb.im.msg.service.comm_elem import MsgElemInfo_servtype3, MsgElemInfo_servtype2
 
 
 # todo: https://github.com/mamoe/mirai/blob/7d3971259de59cede94b7a55650c8a6ad4346a59/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbSendMsg.kt#L103
 # https://github.com/mamoe/mirai/blob/74fc5a50376ed0330b984af51e0fabc2147afdbb/mirai-core/src/commonMain/kotlin/contact/SendMessageHandler.kt
-from ...pb.im.msg.service.comm_elem import MsgElemInfo_servtype3
 
 
 def _build_image_elem(e: Union[models.ImageElement, models.FlashImageElement]) -> CustomFace:
@@ -103,6 +103,23 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
             ret.append(  # fallback info
                 Elem(text=PlainText(str="[窗口抖动]请使用新版手机QQ查看".encode()))
             )
+        elif isinstance(e, models.PokeElement):
+            ret.append(
+                Elem(
+                    common_elem=CommonElem(
+                        service_type=2,
+                        pb_elem=MsgElemInfo_servtype2(
+                            vaspoke_id=0xFFFFFFFF,
+                            vaspoke_name=e.name.encode(),
+                            poke_type=e.id,
+                            poke_strength=e.strength,
+                            double_hit=e.double_hit,
+                            poke_flag=0
+                        ).SerializeToString()
+                    )
+                )
+            )
+
         else:
             raise NotImplementedError(e)
 
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index b5796572..6eb8e41e 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -143,10 +143,10 @@ def type(self) -> str:
 
 @dataclass
 class PokeElement(Element):
-    id: int
-    name: str
-    strength: int
-    double_hit: int
+    id: int = 0
+    name: str = ""
+    strength: int = 0
+    double_hit: int = 0
 
     @property
     def type(self) -> str:

From 1d3f731b6eaeb36392949f755f46d13d9d84c4ba Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 15:03:48 +0800
Subject: [PATCH 051/113] fix: highway bug & support send voice

---
 cai/api/client.py                      |   5 +-
 cai/client/highway/decoders.py         |  18 +++-
 cai/client/highway/encoders.py         |  43 ++++++--
 cai/client/highway/highway.py          | 139 +++++++++++++++++++------
 cai/client/highway/models.py           |  10 +-
 cai/client/highway/utils.py            |   4 +-
 cai/client/message_service/decoders.py |   1 -
 cai/client/message_service/encoders.py |   9 +-
 cai/client/message_service/models.py   |  30 ++++++
 9 files changed, 206 insertions(+), 53 deletions(-)

diff --git a/cai/api/client.py b/cai/api/client.py
index c86a661e..d90609a5 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -13,7 +13,7 @@
 from cai import log
 from cai.client import OnlineStatus, Client as client_t
 from cai.client.highway import HighWaySession
-from cai.client.message_service.models import Element, ImageElement
+from cai.client.message_service.models import Element, ImageElement, VoiceElement
 from cai.client.message_service.encoders import make_group_msg_pkg, build_msg
 from cai.settings.device import DeviceInfo, new_device
 from cai.settings.protocol import ApkInfo
@@ -80,6 +80,9 @@ async def send_group_msg(self, gid: int, msg: Sequence[Element]):
     async def upload_image(self, group_id: int, file: BinaryIO) -> ImageElement:
         return await self._highway_session.upload_image(file, group_id)
 
+    async def upload_voice(self, group_id: int, file: BinaryIO) -> VoiceElement:
+        return await self._highway_session.upload_voice(file, group_id)
+
     async def close(self):
         """Stop Client"""
         await self.client.close()
diff --git a/cai/client/highway/decoders.py b/cai/client/highway/decoders.py
index 41ff971f..006e4d7f 100644
--- a/cai/client/highway/decoders.py
+++ b/cai/client/highway/decoders.py
@@ -1,6 +1,6 @@
-from .models import ImageUploadResponse
+from .models import ImageUploadResponse, UploadResponse
 from .utils import itoa
-from ...pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388RspBody
+from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388RspBody
 
 
 def decode_upload_image_resp(data: bytes) -> ImageUploadResponse:
@@ -25,5 +25,19 @@ def decode_upload_image_resp(data: bytes) -> ImageUploadResponse:
     )
 
 
+def decode_upload_ptt_resp(data: bytes) -> UploadResponse:
+    pkg = decode_d388_rsp(data).tryupPttRsp[0]
+    if pkg.result != 0:
+        return UploadResponse(resultCode=pkg.result, message=pkg.failMsg.decode())
+
+    if pkg.fileExit:
+        return UploadResponse(isExists=True, fileId=pkg.fileid)
+    return UploadResponse(
+        isExists=False,
+        uploadAddr=[(itoa(a), p) for a, p in zip(pkg.upIp, pkg.upPort)],
+        uploadKey=pkg.upUkey
+    )
+
+
 def decode_d388_rsp(data: bytes) -> D388RspBody:
     return D388RspBody.FromString(data)
diff --git a/cai/client/highway/encoders.py b/cai/client/highway/encoders.py
index ab733119..663fd656 100644
--- a/cai/client/highway/encoders.py
+++ b/cai/client/highway/encoders.py
@@ -1,12 +1,17 @@
-from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388ReqBody, TryUpImgReq
+from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388ReqBody, TryUpImgReq, TryUpPttReq
 
 
-def encode_d388_req(group_code: int, uin: int, md5: bytes, size: int) -> D388ReqBody:
-    fn = md5.hex().upper() + ".jpg"
-    return D388ReqBody(
-        netType=8,
-        subcmd=1,
-        tryupImgReq=[TryUpImgReq(
+def encode_d388_req(
+    group_code: int,
+    uin: int,
+    md5: bytes,
+    size: int,
+    subcmd: int
+) -> D388ReqBody:
+    img, ptt = None, None
+    if subcmd == 1:  # upload img
+        fn = md5.hex().upper() + ".jpg"
+        img = [TryUpImgReq(
             groupCode=group_code,
             srcUin=uin,
             fileName=fn.encode(),
@@ -24,5 +29,29 @@ def encode_d388_req(group_code: int, uin: int, md5: bytes, size: int) -> D388Req
             originalPic=1,
             srvUpload=0
         )]
+    elif subcmd == 3:  # voice
+        ptt = [TryUpPttReq(
+            groupCode=group_code,
+            srcUin=uin,
+            fileMd5=md5,
+            fileName=(md5.hex().upper() + ".amr").encode(),
+            fileSize=size,
+            voiceLength=size,
+            voiceType=1,
+            codec=0,
+            srcTerm=5,
+            platformType=9,
+            buType=4,
+            innerIp=0,
+            buildVer=b"8.8.50.2324",
+            newUpChan=True
+        )]
+    else:
+        ValueError("unsupported subcmd:", subcmd)
+    return D388ReqBody(
+        netType=8,
+        subcmd=subcmd,
+        tryupImgReq=img,
+        tryupPttReq=ptt
     )
 
diff --git a/cai/client/highway/highway.py b/cai/client/highway/highway.py
index 2dc1c711..21e32f5f 100644
--- a/cai/client/highway/highway.py
+++ b/cai/client/highway/highway.py
@@ -1,14 +1,14 @@
 import asyncio
 import logging
 from hashlib import md5
-from typing import Tuple, BinaryIO, TYPE_CHECKING
+from typing import Tuple, BinaryIO, TYPE_CHECKING, Optional, List
 
-from .decoders import decode_upload_image_resp
+from .decoders import decode_upload_image_resp, decode_upload_ptt_resp
 from .encoders import encode_d388_req
-from .utils import calc_file_md5_and_length, timeit, to_img_id
+from .utils import calc_file_md5_and_length, timeit, to_id
 from .frame import read_frame, write_frame
 from cai.pb.highway.protocol.highway_head_pb2 import highway_head
-from ..message_service.models import ImageElement
+from ..message_service.models import ImageElement, VoiceElement
 
 if TYPE_CHECKING:
     from cai.client.client import Client
@@ -27,7 +27,7 @@ def _create_highway_header(
         command=cmd,
         commandId=cmd_id,
         seq=client.next_seq(),
-        appid=client.apk_info.app_id,
+        appid=client.apk_info.sub_app_id,
         localeId=locale,
         dataflag=flag
     )
@@ -39,13 +39,56 @@ def __init__(self, client: "Client", logger: logging.Logger = None):
             logger = logging.getLogger(__name__)
         self.logger = logger
         self._client = client
+        self._session_sig: Optional[bytes] = None
+        self._session_key: Optional[bytes] = None
+        self._session_addr_list: Optional[List[Tuple[str, int]]] = []
+
+    def _decode_bdh_session(self):
+        info = self._client._file_storage_info
+        if not info:
+            raise ValueError("info not found, try again later")
+        self._session_sig = info.big_data_channel.bigdata_sig_session
+        self._session_key = info.big_data_channel.bigdata_key_session
+        for iplist in info.big_data_channel.bigdata_iplists:
+            for ip in iplist.ip_list:
+                self._session_addr_list.append((ip.ip, ip.port))
+
+    async def _upload_controller(
+        self,
+        addrs: List[Tuple[str, int]],
+        file: BinaryIO,
+        cmd_id: int,
+        ticket: bytes,
+        ext=None
+    ) -> Optional[bytes]:
+        for addr in addrs:
+            try:
+                t, d = await timeit(
+                    self.bdh_uploader(
+                        b"PicUp.DataUp",
+                        addr,
+                        file,
+                        cmd_id,
+                        ticket,
+                        ext
+                    )
+                )
+                self.logger.info("upload complete, use %fms" % (t * 1000))
+                return d
+            except TimeoutError:
+                self.logger.error(f"server {addr[0]}:{addr[1]} timeout")
+                continue
+            finally:
+                file.seek(0)
+        else:
+            raise ConnectionError("cannot upload, all server failure")
 
     async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
         fmd5, fl = calc_file_md5_and_length(file)
         ret = decode_upload_image_resp(
             (await self._client.send_unipkg_and_wait(
                 "ImgStore.GroupPicUp",
-                encode_d388_req(gid, self._client.uin, fmd5, fl).SerializeToString()
+                encode_d388_req(gid, self._client.uin, fmd5, fl, 1).SerializeToString()
             )).data
         )
         if ret.resultCode != 0:
@@ -53,26 +96,19 @@ async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
         elif not ret.isExists:
             self.logger.debug("file not found, uploading...")
 
-            for addr in ret.uploadAddr:
-                try:
-                    t, _ = await timeit(
-                        self.bdh_uploader(
-                            b"PicUp.DataUp",
-                            addr,
-                            file,
-                            2,
-                            ret.uploadKey
-                        )
-                    )
-                    self.logger.info("upload complete, use %fs in %d bytes" % (t * 1000, fl))
-                except TimeoutError:
-                    self.logger.error(f"server {addr[0]}:{addr[1]} timeout")
-                    continue
-                finally:
-                    file.seek(0)
-                break
-            else:
-                raise ConnectionError("cannot upload image, all server failure")
+            await self._upload_controller(
+                ret.uploadAddr,
+                file,
+                2,  # send to group
+                ret.uploadKey
+            )
+
+            ret = decode_upload_image_resp(
+                (await self._client.send_unipkg_and_wait(
+                    "ImgStore.GroupPicUp",
+                    encode_d388_req(gid, self._client.uin, fmd5, fl, 1).SerializeToString()
+                )).data
+            )
 
         if ret.hasMetaData:
             image_type = ret.fileType
@@ -83,7 +119,7 @@ async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
 
         return ImageElement(
             id=ret.fileId,
-            filename=to_img_id(fmd5),
+            filename=to_id(fmd5) + ".png",
             size=fl,
             width=w,
             height=h,
@@ -92,15 +128,41 @@ async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
             url=f"https://gchat.qpic.cn/gchatpic_new/1/0-0-{fmd5.hex().upper()}/0?term=2"
         )
 
+    async def upload_voice(self, file: BinaryIO, gid: int) -> VoiceElement:
+        fmd5, fl = calc_file_md5_and_length(file)
+        ext = encode_d388_req(gid, self._client.uin, fmd5, fl, 3).SerializeToString()
+        if not (self._session_key and self._session_sig):
+            self._decode_bdh_session()
+        ret = decode_upload_ptt_resp(
+            await self._upload_controller(
+                self._session_addr_list,
+                file,
+                29,  # send to group
+                self._session_sig,
+                ext
+            )
+        )
+        if ret.resultCode:
+            raise ConnectionError(ret.resultCode, ret.message)
+        return VoiceElement(
+            to_id(fmd5) + ".amr",
+            file_type=ret.fileId,
+            from_uin=self._client.uin,
+            md5=fmd5,
+            size=fl,
+            group_file_key=ret.uploadKey
+        )
+
     async def bdh_uploader(
         self,
         cmd: bytes,
         addr: Tuple[str, int],
         file: BinaryIO,
         cmd_id: int,
-        ticket: bytes, *,
+        ticket: bytes,
+        ext: bytes = None, *,
         block_size=65535
-    ):
+    ) -> Optional[bytes]:
         fmd5, fl = calc_file_md5_and_length(file)
         reader, writer = await asyncio.open_connection(*addr)
         bc = 0
@@ -108,7 +170,7 @@ async def bdh_uploader(
             while True:
                 bl = file.read(block_size)
                 if not bl:
-                    break
+                    return ext
                 head = highway_head.ReqDataHighwayHead(
                     basehead=_create_highway_header(cmd, 4096, cmd_id, self._client),
                     seghead=highway_head.SegHead(
@@ -118,13 +180,22 @@ async def bdh_uploader(
                         serviceticket=ticket,
                         md5=md5(bl).digest(),
                         fileMd5=fmd5
-                    )
-                ).SerializeToString()
+                    ),
+                    reqExtendinfo=ext
+                )
 
-                writer.write(write_frame(head, bl))
+                writer.write(write_frame(head.SerializeToString(), bl))
                 await writer.drain()
 
-                resp, _ = await read_frame(reader)
+                resp, data = await read_frame(reader)
+                if resp.errorCode:
+                    raise ConnectionError(resp.errorCode, "upload error", resp)
+                if resp and ext:
+                    if resp.rspExtendinfo:
+                        ext = resp.rspExtendinfo
+                    if resp.seghead:
+                        if resp.seghead.serviceticket:
+                            self._session_key = resp.seghead.serviceticket
 
                 bc += 1
         finally:
diff --git a/cai/client/highway/models.py b/cai/client/highway/models.py
index b598217d..4a09e76e 100644
--- a/cai/client/highway/models.py
+++ b/cai/client/highway/models.py
@@ -3,11 +3,9 @@
 
 
 @dataclass
-class ImageUploadResponse:
+class UploadResponse:
     uploadKey: Optional[bytes] = None
     uploadAddr: Optional[List[Tuple[str, int]]] = None
-    width: Optional[int] = None
-    height: Optional[int] = None
     message: Optional[str] = None
     downloadIndex: Optional[str] = None
     resourceId: Optional[int] = None
@@ -16,3 +14,9 @@ class ImageUploadResponse:
     resultCode: int = 0
     isExists: bool = False
     hasMetaData: bool = False
+
+
+@dataclass
+class ImageUploadResponse(UploadResponse):
+    width: Optional[int] = None
+    height: Optional[int] = None
diff --git a/cai/client/highway/utils.py b/cai/client/highway/utils.py
index 5958499d..9e3b6bd8 100644
--- a/cai/client/highway/utils.py
+++ b/cai/client/highway/utils.py
@@ -22,8 +22,8 @@ def itoa(i: int) -> str:  # int to address(str)
     return ".".join([str(p) for p in i.to_bytes(4, "little")])
 
 
-def to_img_id(b_uuid: bytes) -> str:
-    return "{%s}.png" % uuid.UUID(bytes=b_uuid)
+def to_id(b_uuid: bytes) -> str:
+    return "{%s}" % uuid.UUID(bytes=b_uuid)
 
 
 async def timeit(func: Awaitable) -> Tuple[float, Any]:
diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index f815c3bd..99b189d9 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -200,7 +200,6 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                 poke = MsgElemInfo_servtype2.FromString(
                     elem.common_elem.pb_elem
                 )
-                print(poke)
                 res = [
                     PokeElement(
                         poke.poke_type
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index 41a5034d..22f40f97 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -3,7 +3,7 @@
 
 from typing import Sequence, Union
 from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, CustomFace, Elem, CommonElem, LightAppElem, RichMsg, \
-    ShakeWindow
+    ShakeWindow, Ptt
 from cai.pb.msf.msg.svc.svc_pb2 import RoutingHead, Grp
 from cai.pb.msf.msg.comm.comm_pb2 import ContentHead
 
@@ -38,6 +38,7 @@ def _build_image_elem(e: Union[models.ImageElement, models.FlashImageElement]) -
 
 def build_msg(elements: Sequence[models.Element]) -> MsgBody:
     ret = []
+    ptt = None
     for e in elements:  # todo: support more element
         if isinstance(e, models.TextElement):
             ret.append(
@@ -119,14 +120,16 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
                     )
                 )
             )
-
+        elif isinstance(e, models.VoiceElement):
+            ptt = e.to_ptt()
+            break
         else:
             raise NotImplementedError(e)
 
     return MsgBody(
         rich_text=RichText(
             elems=ret,
-            ptt=None
+            ptt=ptt
         )
     )
 
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 6eb8e41e..7cfb23de 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -14,6 +14,7 @@
 from typing import List, Optional
 
 from cai.client.event import Event
+from cai.pb.im.msg.msg_body import Ptt
 from cai.pb.msf.msg.comm import Msg
 
 
@@ -141,6 +142,35 @@ def type(self) -> str:
         return "flash_image"
 
 
+@dataclass
+class VoiceElement(Element):
+    file_name: str
+    file_type: int
+    from_uin: int
+    md5: bytes
+    size: int
+    group_file_key: bytes
+
+    @property
+    def type(self) -> str:
+        return "voice"
+
+    @property
+    def _pb_reserve(self) -> bytes:
+        return bytes([8, 0, 40, 0, 56, 0])
+
+    def to_ptt(self) -> Ptt:
+        return Ptt(
+            file_type=self.file_type,
+            src_uin=self.from_uin,
+            file_md5=self.md5,
+            file_name=self.file_name.encode(),
+            file_size=self.size,
+            pb_reserve=self._pb_reserve,
+            valid=True
+        )
+
+
 @dataclass
 class PokeElement(Element):
     id: int = 0

From ef0865fdab1bac755e0b55167b89839c82e279fb Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Tue, 5 Apr 2022 15:51:45 +0800
Subject: [PATCH 052/113] add: parse voice.url

---
 cai/client/highway/highway.py          |  5 +++--
 cai/client/message_service/decoders.py | 30 ++++++++++++++++++++------
 cai/client/message_service/models.py   |  1 +
 3 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/cai/client/highway/highway.py b/cai/client/highway/highway.py
index 21e32f5f..14d9e218 100644
--- a/cai/client/highway/highway.py
+++ b/cai/client/highway/highway.py
@@ -146,11 +146,12 @@ async def upload_voice(self, file: BinaryIO, gid: int) -> VoiceElement:
             raise ConnectionError(ret.resultCode, ret.message)
         return VoiceElement(
             to_id(fmd5) + ".amr",
-            file_type=ret.fileId,
+            file_type=4,
             from_uin=self._client.uin,
             md5=fmd5,
             size=fl,
-            group_file_key=ret.uploadKey
+            group_file_key=ret.uploadKey,
+            url=f"https://grouptalk.c2c.qq.com/?ver=0&rkey={ret.uploadKey.hex()}&filetype=4%voice_codec=0"
         )
 
     async def bdh_uploader(
diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index 99b189d9..cbbc2f25 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -15,7 +15,7 @@
 from cai.log import logger
 from cai.client.event import Event
 from cai.pb.msf.msg.comm import Msg
-from cai.pb.im.msg.msg_body import Elem
+from cai.pb.im.msg.msg_body import Elem, Ptt
 from cai.pb.im.msg.service.comm_elem import (
     MsgElemInfo_servtype2,
     MsgElemInfo_servtype3,
@@ -35,11 +35,11 @@
     RichMsgElement,
     PrivateMessage,
     SmallEmojiElement,
-    FlashImageElement, ShakeElement
+    FlashImageElement, ShakeElement, VoiceElement
 )
 
 
-def parse_elements(elems: Sequence[Elem]) -> List[Element]:
+def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
     """Parse message rich text elements.
 
     Only parse ``text``, ``face``, ``small_smoji``, ``common_elem service 33``
@@ -50,10 +50,26 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
 
     Args:
         elems (Sequence[Elem]): Sequence of rich text elements.
+        ptt (Ptt)
 
     Returns:
         List[Element]: List of decoded message elements.
     """
+    if ptt:
+        if ptt.file_name.endswith(b".amr"):
+            info = {}
+            for bl in ptt.down_para.decode().split("&")[1:]:
+                k, v = bl.split("=", 1)
+                info[k] = v
+            return [VoiceElement(
+                ptt.file_name.decode(),
+                info["filetype"],
+                ptt.src_uin,
+                ptt.file_md5,
+                ptt.file_size,
+                bytes.fromhex(info["rkey"]),
+                "https://grouptalk.c2c.qq.com" + ptt.down_para.decode()
+            )]
     res: List[Element] = []
     index = 0
     while index < len(elems):
@@ -72,7 +88,7 @@ def parse_elements(elems: Sequence[Elem]) -> List[Element]:
                         elem.src_msg.orig_seqs[0],
                         elem.src_msg.time,
                         elem.src_msg.sender_uin,
-                        parse_elements(elem.src_msg.elems),
+                        parse_elements(elem.src_msg.elems, None),
                         elem.src_msg.troop_name.decode("utf-8") or None,
                     )
                 )
@@ -294,6 +310,7 @@ def decode_normal_buddy(cls, message: Msg) -> Optional[Event]:
         from_nick = message.head.from_nick
         to_uin = message.head.to_uin
         elems = message.body.rich_text.elems
+        ptt = message.body.rich_text.ptt
 
         return PrivateMessage(
             message,
@@ -303,7 +320,7 @@ def decode_normal_buddy(cls, message: Msg) -> Optional[Event]:
             from_uin,
             from_nick,
             to_uin,
-            parse_elements(elems),
+            parse_elements(elems, ptt),
         )
 
 
@@ -321,6 +338,7 @@ def decode(cls, message: Msg) -> Optional[Event]:
         troop = message.head.group_info
         content_head = message.content_head
         elems = message.body.rich_text.elems
+        ptt = message.body.rich_text.ptt
 
         # long msg fragment
         if content_head.pkg_num > 1:
@@ -350,7 +368,7 @@ def decode(cls, message: Msg) -> Optional[Event]:
             troop.group_level,
             from_uin,
             troop.group_card.decode("utf-8"),
-            parse_elements(elems),
+            parse_elements(elems, ptt),
         )
 
 
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 7cfb23de..d45d562f 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -150,6 +150,7 @@ class VoiceElement(Element):
     md5: bytes
     size: int
     group_file_key: bytes
+    url: str = None
 
     @property
     def type(self) -> str:

From 57617ee7f835c4c99a33ad824a45ed8bbbf90eb0 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Thu, 7 Apr 2022 11:02:42 +0800
Subject: [PATCH 053/113] :arrow_up: upgrade dependencies

---
 poetry.lock    | 618 ++++++++++++++++++++++++-------------------------
 pyproject.toml |  18 +-
 2 files changed, 315 insertions(+), 321 deletions(-)

diff --git a/poetry.lock b/poetry.lock
index 0f327f50..e0b0de90 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -19,38 +19,34 @@ pytz = ">=2015.7"
 
 [[package]]
 name = "black"
-version = "21.12b0"
+version = "22.3.0"
 description = "The uncompromising code formatter."
 category = "dev"
 optional = false
 python-versions = ">=3.6.2"
 
 [package.dependencies]
-click = ">=7.1.2"
+click = ">=8.0.0"
 mypy-extensions = ">=0.4.3"
-pathspec = ">=0.9.0,<1"
+pathspec = ">=0.9.0"
 platformdirs = ">=2"
-tomli = ">=0.2.6,<2.0.0"
+tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
 typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""}
-typing-extensions = [
-    {version = ">=3.10.0.0", markers = "python_version < \"3.10\""},
-    {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""},
-]
+typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
 
 [package.extras]
 colorama = ["colorama (>=0.4.3)"]
 d = ["aiohttp (>=3.7.4)"]
 jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-python2 = ["typed-ast (>=1.4.3)"]
 uvloop = ["uvloop (>=0.15.2)"]
 
 [[package]]
 name = "cachetools"
-version = "4.2.4"
+version = "5.0.0"
 description = "Extensible memoizing collections and decorators"
 category = "main"
 optional = false
-python-versions = "~=3.5"
+python-versions = "~=3.7"
 
 [[package]]
 name = "certifi"
@@ -73,7 +69,7 @@ pycparser = "*"
 
 [[package]]
 name = "charset-normalizer"
-version = "2.0.9"
+version = "2.0.12"
 description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
 category = "dev"
 optional = false
@@ -84,11 +80,11 @@ unicode_backport = ["unicodedata2"]
 
 [[package]]
 name = "click"
-version = "8.0.3"
+version = "8.1.2"
 description = "Composable command line interface toolkit"
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [package.dependencies]
 colorama = {version = "*", markers = "platform_system == \"Windows\""}
@@ -104,7 +100,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
 [[package]]
 name = "cryptography"
-version = "3.4.8"
+version = "36.0.2"
 description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
 category = "main"
 optional = false
@@ -115,15 +111,15 @@ cffi = ">=1.12"
 
 [package.extras]
 docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"]
-docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
+docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
 pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"]
-sdist = ["setuptools-rust (>=0.11.4)"]
+sdist = ["setuptools_rust (>=0.11.4)"]
 ssh = ["bcrypt (>=3.1.5)"]
-test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
+test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
 
 [[package]]
 name = "docutils"
-version = "0.16"
+version = "0.17.1"
 description = "Docutils -- Python Documentation Utilities"
 category = "dev"
 optional = false
@@ -147,20 +143,20 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
 name = "importlib-metadata"
-version = "4.8.2"
+version = "4.11.3"
 description = "Read metadata from Python packages"
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [package.dependencies]
 typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
 zipp = ">=0.5"
 
 [package.extras]
-docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
 perf = ["ipython"]
-testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"]
 
 [[package]]
 name = "isort"
@@ -190,11 +186,11 @@ typing-extensions = ">=3.7.4,<5.0.0"
 
 [[package]]
 name = "jinja2"
-version = "3.0.3"
+version = "3.1.1"
 description = "A very fast and expressive template engine."
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [package.dependencies]
 MarkupSafe = ">=2.0"
@@ -204,11 +200,11 @@ i18n = ["Babel (>=2.7)"]
 
 [[package]]
 name = "markupsafe"
-version = "2.0.1"
+version = "2.1.1"
 description = "Safely add untrusted strings to HTML/XML markup."
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [[package]]
 name = "mypy-extensions"
@@ -220,15 +216,15 @@ python-versions = "*"
 
 [[package]]
 name = "mypy-protobuf"
-version = "2.10"
+version = "3.2.0"
 description = "Generate mypy stub files from protobuf specs"
 category = "dev"
 optional = false
 python-versions = ">=3.6"
 
 [package.dependencies]
-protobuf = ">=3.17.3"
-types-protobuf = ">=3.17.4"
+protobuf = ">=3.19.3"
+types-protobuf = ">=3.19.5"
 
 [[package]]
 name = "packaging"
@@ -251,19 +247,23 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
 
 [[package]]
 name = "pillow"
-version = "8.4.0"
+version = "9.1.0"
 description = "Python Imaging Library (Fork)"
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinx-rtd-theme (>=1.0)", "sphinxext-opengraph"]
+tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
 
 [[package]]
 name = "platformdirs"
-version = "2.4.0"
+version = "2.5.1"
 description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [package.extras]
 docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"]
@@ -282,11 +282,11 @@ six = ">=1.5.2"
 
 [[package]]
 name = "protobuf"
-version = "3.19.1"
+version = "3.20.0"
 description = "Protocol Buffers"
 category = "main"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.7"
 
 [[package]]
 name = "pycparser"
@@ -298,7 +298,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
 name = "pydantic"
-version = "1.8.2"
+version = "1.9.0"
 description = "Data validation and settings management using python 3.6 type hinting"
 category = "main"
 optional = false
@@ -313,7 +313,7 @@ email = ["email-validator (>=1.0.3)"]
 
 [[package]]
 name = "pygments"
-version = "2.10.0"
+version = "2.11.2"
 description = "Pygments is a syntax highlighting package written in Python."
 category = "dev"
 optional = false
@@ -321,7 +321,7 @@ python-versions = ">=3.5"
 
 [[package]]
 name = "pyparsing"
-version = "3.0.6"
+version = "3.0.7"
 description = "Python parsing module"
 category = "dev"
 optional = false
@@ -332,7 +332,7 @@ diagrams = ["jinja2", "railroad-diagrams"]
 
 [[package]]
 name = "pytz"
-version = "2021.3"
+version = "2022.1"
 description = "World timezone definitions, modern and historical"
 category = "dev"
 optional = false
@@ -340,7 +340,7 @@ python-versions = "*"
 
 [[package]]
 name = "requests"
-version = "2.26.0"
+version = "2.27.1"
 description = "Python HTTP for Humans."
 category = "dev"
 optional = false
@@ -382,7 +382,7 @@ python-versions = "*"
 
 [[package]]
 name = "sphinx"
-version = "4.3.1"
+version = "4.5.0"
 description = "Python documentation generator"
 category = "dev"
 optional = false
@@ -394,6 +394,7 @@ babel = ">=1.3"
 colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""}
 docutils = ">=0.14,<0.18"
 imagesize = "*"
+importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
 Jinja2 = ">=2.3"
 packaging = "*"
 Pygments = ">=2.0"
@@ -408,12 +409,12 @@ sphinxcontrib-serializinghtml = ">=1.1.5"
 
 [package.extras]
 docs = ["sphinxcontrib-websupport"]
-lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.900)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"]
+lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "docutils-stubs", "types-typed-ast", "types-requests"]
 test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"]
 
 [[package]]
 name = "sphinx-copybutton"
-version = "0.4.0"
+version = "0.5.0"
 description = "Add a copy button to each of your code cells."
 category = "dev"
 optional = false
@@ -424,19 +425,19 @@ sphinx = ">=1.8"
 
 [package.extras]
 code_style = ["pre-commit (==2.12.1)"]
-rtd = ["sphinx", "ipython", "sphinx-book-theme"]
+rtd = ["sphinx", "ipython", "myst-nb", "sphinx-book-theme"]
 
 [[package]]
 name = "sphinx-rtd-theme"
-version = "0.5.2"
+version = "1.0.0"
 description = "Read the Docs theme for Sphinx"
 category = "dev"
 optional = false
-python-versions = "*"
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
 
 [package.dependencies]
-docutils = "<0.17"
-sphinx = "*"
+docutils = "<0.18"
+sphinx = ">=1.6"
 
 [package.extras]
 dev = ["transifex-client", "sphinxcontrib-httpdomain", "bump2version"]
@@ -526,42 +527,31 @@ test = ["pytest"]
 
 [[package]]
 name = "tomli"
-version = "1.2.2"
+version = "2.0.1"
 description = "A lil' TOML parser"
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [[package]]
 name = "typed-ast"
-version = "1.5.1"
+version = "1.5.2"
 description = "a fork of Python 2 and 3 ast modules with type comment support"
 category = "dev"
 optional = false
 python-versions = ">=3.6"
 
-[[package]]
-name = "types-futures"
-version = "3.3.1"
-description = "Typing stubs for futures"
-category = "dev"
-optional = false
-python-versions = "*"
-
 [[package]]
 name = "types-protobuf"
-version = "3.18.2"
+version = "3.19.15"
 description = "Typing stubs for protobuf"
 category = "dev"
 optional = false
 python-versions = "*"
 
-[package.dependencies]
-types-futures = "*"
-
 [[package]]
 name = "typing-extensions"
-version = "4.0.1"
+version = "4.1.1"
 description = "Backported and Experimental Type Hints for Python 3.6+"
 category = "main"
 optional = false
@@ -569,33 +559,33 @@ python-versions = ">=3.6"
 
 [[package]]
 name = "urllib3"
-version = "1.26.7"
+version = "1.26.9"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
 category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
 
 [package.extras]
-brotli = ["brotlipy (>=0.6.0)"]
+brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"]
 secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
 socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
 
 [[package]]
 name = "zipp"
-version = "3.6.0"
+version = "3.8.0"
 description = "Backport of pathlib-compatible object wrapper for zip files"
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [package.extras]
-docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"]
 
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.7"
-content-hash = "581c5d9e6a5eff6418922c6632469be265c318fb0ba8d418ca8b752a8f90a7ae"
+content-hash = "0c909b96166d323dfe34fb02f03a3decc50a45281238be69b02b5de72c445503"
 
 [metadata.files]
 alabaster = [
@@ -607,12 +597,33 @@ babel = [
     {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"},
 ]
 black = [
-    {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"},
-    {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"},
+    {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"},
+    {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"},
+    {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"},
+    {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"},
+    {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"},
+    {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"},
+    {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"},
+    {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"},
+    {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"},
+    {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"},
+    {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"},
+    {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"},
+    {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"},
+    {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"},
+    {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"},
+    {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"},
+    {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"},
+    {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"},
+    {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"},
+    {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"},
+    {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"},
+    {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"},
+    {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"},
 ]
 cachetools = [
-    {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"},
-    {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"},
+    {file = "cachetools-5.0.0-py3-none-any.whl", hash = "sha256:8fecd4203a38af17928be7b90689d8083603073622229ca7077b72d8e5a976e4"},
+    {file = "cachetools-5.0.0.tar.gz", hash = "sha256:486471dfa8799eb7ec503a8059e263db000cdda20075ce5e48903087f79d5fd6"},
 ]
 certifi = [
     {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
@@ -671,41 +682,42 @@ cffi = [
     {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"},
 ]
 charset-normalizer = [
-    {file = "charset-normalizer-2.0.9.tar.gz", hash = "sha256:b0b883e8e874edfdece9c28f314e3dd5badf067342e42fb162203335ae61aa2c"},
-    {file = "charset_normalizer-2.0.9-py3-none-any.whl", hash = "sha256:1eecaa09422db5be9e29d7fc65664e6c33bd06f9ced7838578ba40d58bdf3721"},
+    {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"},
+    {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"},
 ]
 click = [
-    {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"},
-    {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"},
+    {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"},
+    {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"},
 ]
 colorama = [
     {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
     {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
 ]
 cryptography = [
-    {file = "cryptography-3.4.8-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a00cf305f07b26c351d8d4e1af84ad7501eca8a342dedf24a7acb0e7b7406e14"},
-    {file = "cryptography-3.4.8-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:f44d141b8c4ea5eb4dbc9b3ad992d45580c1d22bf5e24363f2fbf50c2d7ae8a7"},
-    {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a7dcbcd3f1913f664aca35d47c1331fce738d44ec34b7be8b9d332151b0b01e"},
-    {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34dae04a0dce5730d8eb7894eab617d8a70d0c97da76b905de9efb7128ad7085"},
-    {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b"},
-    {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:9965c46c674ba8cc572bc09a03f4c649292ee73e1b683adb1ce81e82e9a6a0fb"},
-    {file = "cryptography-3.4.8-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3c4129fc3fdc0fa8e40861b5ac0c673315b3c902bbdc05fc176764815b43dd1d"},
-    {file = "cryptography-3.4.8-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:695104a9223a7239d155d7627ad912953b540929ef97ae0c34c7b8bf30857e89"},
-    {file = "cryptography-3.4.8-cp36-abi3-win32.whl", hash = "sha256:21ca464b3a4b8d8e86ba0ee5045e103a1fcfac3b39319727bc0fc58c09c6aff7"},
-    {file = "cryptography-3.4.8-cp36-abi3-win_amd64.whl", hash = "sha256:3520667fda779eb788ea00080124875be18f2d8f0848ec00733c0ec3bb8219fc"},
-    {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d2a6e5ef66503da51d2110edf6c403dc6b494cc0082f85db12f54e9c5d4c3ec5"},
-    {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a305600e7a6b7b855cd798e00278161b681ad6e9b7eca94c721d5f588ab212af"},
-    {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3fa3a7ccf96e826affdf1a0a9432be74dc73423125c8f96a909e3835a5ef194a"},
-    {file = "cryptography-3.4.8-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9ec0e67a14f9d1d48dd87a2531009a9b251c02ea42851c060b25c782516ff06"},
-    {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b0fbfae7ff7febdb74b574055c7466da334a5371f253732d7e2e7525d570498"},
-    {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94fff993ee9bc1b2440d3b7243d488c6a3d9724cc2b09cdb297f6a886d040ef7"},
-    {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:8695456444f277af73a4877db9fc979849cd3ee74c198d04fc0776ebc3db52b9"},
-    {file = "cryptography-3.4.8-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:cd65b60cfe004790c795cc35f272e41a3df4631e2fb6b35aa7ac6ef2859d554e"},
-    {file = "cryptography-3.4.8.tar.gz", hash = "sha256:94cc5ed4ceaefcbe5bf38c8fba6a21fc1d365bb8fb826ea1688e3370b2e24a1c"},
+    {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6"},
+    {file = "cryptography-36.0.2-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d"},
+    {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84"},
+    {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815"},
+    {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf"},
+    {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf"},
+    {file = "cryptography-36.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86"},
+    {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2"},
+    {file = "cryptography-36.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb"},
+    {file = "cryptography-36.0.2-cp36-abi3-win32.whl", hash = "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"},
+    {file = "cryptography-36.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29"},
+    {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7"},
+    {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e"},
+    {file = "cryptography-36.0.2-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0"},
+    {file = "cryptography-36.0.2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b"},
+    {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77"},
+    {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85"},
+    {file = "cryptography-36.0.2-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51"},
+    {file = "cryptography-36.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3"},
+    {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"},
 ]
 docutils = [
-    {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
-    {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"},
+    {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"},
+    {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"},
 ]
 idna = [
     {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
@@ -716,8 +728,8 @@ imagesize = [
     {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"},
 ]
 importlib-metadata = [
-    {file = "importlib_metadata-4.8.2-py3-none-any.whl", hash = "sha256:53ccfd5c134223e497627b9815d5030edf77d2ed573922f7a0b8f8bb81a1c100"},
-    {file = "importlib_metadata-4.8.2.tar.gz", hash = "sha256:75bdec14c397f528724c1bfd9709d660b33a4d2e77387a3358f20b848bb5e5fb"},
+    {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"},
+    {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"},
 ]
 isort = [
     {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"},
@@ -728,87 +740,58 @@ jcestruct = [
     {file = "JceStruct-0.1.5.tar.gz", hash = "sha256:c465d3ed91c64a0ca23b34c4f1fee66987d9fb7346934a4b160d3a5222ef7e0e"},
 ]
 jinja2 = [
-    {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"},
-    {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"},
+    {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"},
+    {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"},
 ]
 markupsafe = [
-    {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"},
-    {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
-    {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
-    {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
-    {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
-    {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
-    {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"},
+    {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"},
+    {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"},
+    {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"},
+    {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"},
+    {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"},
 ]
 mypy-extensions = [
     {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
     {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
 ]
 mypy-protobuf = [
-    {file = "mypy-protobuf-2.10.tar.gz", hash = "sha256:1fed214e16351b09946770794a321a818abb744078b1d863a479da070028684c"},
-    {file = "mypy_protobuf-2.10-py3-none-any.whl", hash = "sha256:8f85a7e12908ca2f59bdacb59f81bd64fd40b946a22844a748fbaf9e1e82d3cd"},
+    {file = "mypy-protobuf-3.2.0.tar.gz", hash = "sha256:730aa15337c38f0446fbe08f6c6c2370ee01d395125369d4b70e08b1e2ee30ee"},
+    {file = "mypy_protobuf-3.2.0-py3-none-any.whl", hash = "sha256:65fc0492165f4a3c0aff69b03e34096fc1453e4dac8f14b4e9c2306cdde06010"},
 ]
 packaging = [
     {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
@@ -819,125 +802,135 @@ pathspec = [
     {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
 ]
 pillow = [
-    {file = "Pillow-8.4.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d"},
-    {file = "Pillow-8.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6"},
-    {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78"},
-    {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649"},
-    {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f"},
-    {file = "Pillow-8.4.0-cp310-cp310-win32.whl", hash = "sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a"},
-    {file = "Pillow-8.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39"},
-    {file = "Pillow-8.4.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55"},
-    {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c"},
-    {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a"},
-    {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645"},
-    {file = "Pillow-8.4.0-cp36-cp36m-win32.whl", hash = "sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9"},
-    {file = "Pillow-8.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff"},
-    {file = "Pillow-8.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153"},
-    {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29"},
-    {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8"},
-    {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488"},
-    {file = "Pillow-8.4.0-cp37-cp37m-win32.whl", hash = "sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b"},
-    {file = "Pillow-8.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b"},
-    {file = "Pillow-8.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49"},
-    {file = "Pillow-8.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585"},
-    {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779"},
-    {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409"},
-    {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df"},
-    {file = "Pillow-8.4.0-cp38-cp38-win32.whl", hash = "sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09"},
-    {file = "Pillow-8.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76"},
-    {file = "Pillow-8.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a"},
-    {file = "Pillow-8.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e"},
-    {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b"},
-    {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20"},
-    {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed"},
-    {file = "Pillow-8.4.0-cp39-cp39-win32.whl", hash = "sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02"},
-    {file = "Pillow-8.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b"},
-    {file = "Pillow-8.4.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2"},
-    {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad"},
-    {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698"},
-    {file = "Pillow-8.4.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc"},
-    {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df"},
-    {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b"},
-    {file = "Pillow-8.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc"},
-    {file = "Pillow-8.4.0.tar.gz", hash = "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed"},
+    {file = "Pillow-9.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea"},
+    {file = "Pillow-9.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652"},
+    {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a"},
+    {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7"},
+    {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e"},
+    {file = "Pillow-9.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3"},
+    {file = "Pillow-9.1.0-cp310-cp310-win32.whl", hash = "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160"},
+    {file = "Pillow-9.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033"},
+    {file = "Pillow-9.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c"},
+    {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165"},
+    {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a"},
+    {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2"},
+    {file = "Pillow-9.1.0-cp37-cp37m-win32.whl", hash = "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244"},
+    {file = "Pillow-9.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef"},
+    {file = "Pillow-9.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512"},
+    {file = "Pillow-9.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477"},
+    {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b"},
+    {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378"},
+    {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e"},
+    {file = "Pillow-9.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5"},
+    {file = "Pillow-9.1.0-cp38-cp38-win32.whl", hash = "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a"},
+    {file = "Pillow-9.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34"},
+    {file = "Pillow-9.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717"},
+    {file = "Pillow-9.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581"},
+    {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6"},
+    {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4"},
+    {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331"},
+    {file = "Pillow-9.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8"},
+    {file = "Pillow-9.1.0-cp39-cp39-win32.whl", hash = "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58"},
+    {file = "Pillow-9.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595"},
+    {file = "Pillow-9.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481"},
+    {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0"},
+    {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a"},
+    {file = "Pillow-9.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7"},
+    {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3"},
+    {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8"},
+    {file = "Pillow-9.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458"},
+    {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"},
 ]
 platformdirs = [
-    {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"},
-    {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"},
+    {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"},
+    {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"},
 ]
 pockets = [
     {file = "pockets-0.9.1-py2.py3-none-any.whl", hash = "sha256:68597934193c08a08eb2bf6a1d85593f627c22f9b065cc727a4f03f669d96d86"},
     {file = "pockets-0.9.1.tar.gz", hash = "sha256:9320f1a3c6f7a9133fe3b571f283bcf3353cd70249025ae8d618e40e9f7e92b3"},
 ]
 protobuf = [
-    {file = "protobuf-3.19.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d80f80eb175bf5f1169139c2e0c5ada98b1c098e2b3c3736667f28cbbea39fc8"},
-    {file = "protobuf-3.19.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a529e7df52204565bcd33738a7a5f288f3d2d37d86caa5d78c458fa5fabbd54d"},
-    {file = "protobuf-3.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28ccea56d4dc38d35cd70c43c2da2f40ac0be0a355ef882242e8586c6d66666f"},
-    {file = "protobuf-3.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b30a7de128c46b5ecb343917d9fa737612a6e8280f440874e5cc2ba0d79b8f6"},
-    {file = "protobuf-3.19.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5935c8ce02e3d89c7900140a8a42b35bc037ec07a6aeb61cc108be8d3c9438a6"},
-    {file = "protobuf-3.19.1-cp36-cp36m-win32.whl", hash = "sha256:74f33edeb4f3b7ed13d567881da8e5a92a72b36495d57d696c2ea1ae0cfee80c"},
-    {file = "protobuf-3.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:038daf4fa38a7e818dd61f51f22588d61755160a98db087a046f80d66b855942"},
-    {file = "protobuf-3.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e51561d72efd5bd5c91490af1f13e32bcba8dab4643761eb7de3ce18e64a853"},
-    {file = "protobuf-3.19.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:6e8ea9173403219239cdfd8d946ed101f2ab6ecc025b0fda0c6c713c35c9981d"},
-    {file = "protobuf-3.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db3532d9f7a6ebbe2392041350437953b6d7a792de10e629c1e4f5a6b1fe1ac6"},
-    {file = "protobuf-3.19.1-cp37-cp37m-win32.whl", hash = "sha256:615b426a177780ce381ecd212edc1e0f70db8557ed72560b82096bd36b01bc04"},
-    {file = "protobuf-3.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d8919368410110633717c406ab5c97e8df5ce93020cfcf3012834f28b1fab1ea"},
-    {file = "protobuf-3.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:71b0250b0cfb738442d60cab68abc166de43411f2a4f791d31378590bfb71bd7"},
-    {file = "protobuf-3.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3cd0458870ea7d1c58e948ac8078f6ba8a7ecc44a57e03032ed066c5bb318089"},
-    {file = "protobuf-3.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655264ed0d0efe47a523e2255fc1106a22f6faab7cc46cfe99b5bae085c2a13e"},
-    {file = "protobuf-3.19.1-cp38-cp38-win32.whl", hash = "sha256:b691d996c6d0984947c4cf8b7ae2fe372d99b32821d0584f0b90277aa36982d3"},
-    {file = "protobuf-3.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:e7e8d2c20921f8da0dea277dfefc6abac05903ceac8e72839b2da519db69206b"},
-    {file = "protobuf-3.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd390367fc211cc0ffcf3a9e149dfeca78fecc62adb911371db0cec5c8b7472d"},
-    {file = "protobuf-3.19.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d83e1ef8cb74009bebee3e61cc84b1c9cd04935b72bca0cbc83217d140424995"},
-    {file = "protobuf-3.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36d90676d6f426718463fe382ec6274909337ca6319d375eebd2044e6c6ac560"},
-    {file = "protobuf-3.19.1-cp39-cp39-win32.whl", hash = "sha256:e7b24c11df36ee8e0c085e5b0dc560289e4b58804746fb487287dda51410f1e2"},
-    {file = "protobuf-3.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:77d2fadcf369b3f22859ab25bd12bb8e98fb11e05d9ff9b7cd45b711c719c002"},
-    {file = "protobuf-3.19.1-py2.py3-none-any.whl", hash = "sha256:e813b1c9006b6399308e917ac5d298f345d95bb31f46f02b60cd92970a9afa17"},
-    {file = "protobuf-3.19.1.tar.gz", hash = "sha256:62a8e4baa9cb9e064eb62d1002eca820857ab2138440cb4b3ea4243830f94ca7"},
+    {file = "protobuf-3.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9d0f3aca8ca51c8b5e204ab92bd8afdb2a8e3df46bd0ce0bd39065d79aabcaa4"},
+    {file = "protobuf-3.20.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:001c2160c03b6349c04de39cf1a58e342750da3632f6978a1634a3dcca1ec10e"},
+    {file = "protobuf-3.20.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b5860b790498f233cdc8d635a17fc08de62e59d4dcd8cdb6c6c0d38a31edf2b"},
+    {file = "protobuf-3.20.0-cp310-cp310-win32.whl", hash = "sha256:0b250c60256c8824219352dc2a228a6b49987e5bf94d3ffcf4c46585efcbd499"},
+    {file = "protobuf-3.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:a1eebb6eb0653e594cb86cd8e536b9b083373fca9aba761ade6cd412d46fb2ab"},
+    {file = "protobuf-3.20.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bc14037281db66aa60856cd4ce4541a942040686d290e3f3224dd3978f88f554"},
+    {file = "protobuf-3.20.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:47257d932de14a7b6c4ae1b7dbf592388153ee35ec7cae216b87ae6490ed39a3"},
+    {file = "protobuf-3.20.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbcbb068ebe67c4ff6483d2e2aa87079c325f8470b24b098d6bf7d4d21d57a69"},
+    {file = "protobuf-3.20.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:542f25a4adf3691a306dcc00bf9a73176554938ec9b98f20f929a044f80acf1b"},
+    {file = "protobuf-3.20.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fd7133b885e356fa4920ead8289bb45dc6f185a164e99e10279f33732ed5ce15"},
+    {file = "protobuf-3.20.0-cp37-cp37m-win32.whl", hash = "sha256:8d84453422312f8275455d1cb52d850d6a4d7d714b784e41b573c6f5bfc2a029"},
+    {file = "protobuf-3.20.0-cp37-cp37m-win_amd64.whl", hash = "sha256:52bae32a147c375522ce09bd6af4d2949aca32a0415bc62df1456b3ad17c6001"},
+    {file = "protobuf-3.20.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25d2fcd6eef340082718ec9ad2c58d734429f2b1f7335d989523852f2bba220b"},
+    {file = "protobuf-3.20.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:88c8be0558bdfc35e68c42ae5bf785eb9390d25915d4863bbc7583d23da77074"},
+    {file = "protobuf-3.20.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:38fd9eb74b852e4ee14b16e9670cd401d147ee3f3ec0d4f7652e0c921d6227f8"},
+    {file = "protobuf-3.20.0-cp38-cp38-win32.whl", hash = "sha256:7dcd84dc31ebb35ade755e06d1561d1bd3b85e85dbdbf6278011fc97b22810db"},
+    {file = "protobuf-3.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:1eb13f5a5a59ca4973bcfa2fc8fff644bd39f2109c3f7a60bd5860cb6a49b679"},
+    {file = "protobuf-3.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d24c81c2310f0063b8fc1c20c8ed01f3331be9374b4b5c2de846f69e11e21fb"},
+    {file = "protobuf-3.20.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8be43a91ab66fe995e85ccdbdd1046d9f0443d59e060c0840319290de25b7d33"},
+    {file = "protobuf-3.20.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a53d4035427b9dbfbb397f46642754d294f131e93c661d056366f2a31438263"},
+    {file = "protobuf-3.20.0-cp39-cp39-win32.whl", hash = "sha256:32bf4a90c207a0b4e70ca6dd09d43de3cb9898f7d5b69c2e9e3b966a7f342820"},
+    {file = "protobuf-3.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:6efe066a7135233f97ce51a1aa007d4fb0be28ef093b4f88dac4ad1b3a2b7b6f"},
+    {file = "protobuf-3.20.0-py2.py3-none-any.whl", hash = "sha256:4eda68bd9e2a4879385e6b1ea528c976f59cd9728382005cc54c28bcce8db983"},
+    {file = "protobuf-3.20.0.tar.gz", hash = "sha256:71b2c3d1cd26ed1ec7c8196834143258b2ad7f444efff26fdc366c6f5e752702"},
 ]
 pycparser = [
     {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
     {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
 ]
 pydantic = [
-    {file = "pydantic-1.8.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739"},
-    {file = "pydantic-1.8.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4"},
-    {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e"},
-    {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840"},
-    {file = "pydantic-1.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b"},
-    {file = "pydantic-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20"},
-    {file = "pydantic-1.8.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb"},
-    {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1"},
-    {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23"},
-    {file = "pydantic-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287"},
-    {file = "pydantic-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd"},
-    {file = "pydantic-1.8.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505"},
-    {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e"},
-    {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820"},
-    {file = "pydantic-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3"},
-    {file = "pydantic-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316"},
-    {file = "pydantic-1.8.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62"},
-    {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f"},
-    {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b"},
-    {file = "pydantic-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3"},
-    {file = "pydantic-1.8.2-py3-none-any.whl", hash = "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"},
-    {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"},
+    {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"},
+    {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"},
+    {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"},
+    {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"},
+    {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"},
+    {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"},
+    {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"},
+    {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"},
+    {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"},
+    {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"},
+    {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"},
+    {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"},
+    {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"},
+    {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"},
+    {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"},
+    {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"},
+    {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"},
+    {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"},
+    {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"},
+    {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"},
+    {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"},
+    {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"},
+    {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"},
+    {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"},
+    {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"},
+    {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"},
+    {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"},
+    {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"},
+    {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"},
+    {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"},
+    {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"},
+    {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"},
+    {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"},
+    {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"},
+    {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"},
 ]
 pygments = [
-    {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"},
-    {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"},
+    {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"},
+    {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"},
 ]
 pyparsing = [
-    {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"},
-    {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"},
+    {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"},
+    {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"},
 ]
 pytz = [
-    {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"},
-    {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
+    {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"},
+    {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"},
 ]
 requests = [
-    {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
-    {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"},
+    {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"},
+    {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"},
 ]
 rtea = [
     {file = "rtea-0.3.2-cp36-cp36m-macosx_10_7_x86_64.whl", hash = "sha256:10aa8b0684fcaa03cbe9398bc29ece6fafbdf86df0838fa123e8880b1fe00239"},
@@ -963,16 +956,16 @@ snowballstemmer = [
     {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
 ]
 sphinx = [
-    {file = "Sphinx-4.3.1-py3-none-any.whl", hash = "sha256:048dac56039a5713f47a554589dc98a442b39226a2b9ed7f82797fcb2fe9253f"},
-    {file = "Sphinx-4.3.1.tar.gz", hash = "sha256:32a5b3e9a1b176cc25ed048557d4d3d01af635e6b76c5bc7a43b0a34447fbd45"},
+    {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"},
+    {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"},
 ]
 sphinx-copybutton = [
-    {file = "sphinx-copybutton-0.4.0.tar.gz", hash = "sha256:8daed13a87afd5013c3a9af3575cc4d5bec052075ccd3db243f895c07a689386"},
-    {file = "sphinx_copybutton-0.4.0-py3-none-any.whl", hash = "sha256:4340d33c169dac6dd82dce2c83333412aa786a42dd01a81a8decac3b130dc8b0"},
+    {file = "sphinx-copybutton-0.5.0.tar.gz", hash = "sha256:a0c059daadd03c27ba750da534a92a63e7a36a7736dcf684f26ee346199787f6"},
+    {file = "sphinx_copybutton-0.5.0-py3-none-any.whl", hash = "sha256:9684dec7434bd73f0eea58dda93f9bb879d24bff2d8b187b1f2ec08dfe7b5f48"},
 ]
 sphinx-rtd-theme = [
-    {file = "sphinx_rtd_theme-0.5.2-py2.py3-none-any.whl", hash = "sha256:4a05bdbe8b1446d77a01e20a23ebc6777c74f43237035e76be89699308987d6f"},
-    {file = "sphinx_rtd_theme-0.5.2.tar.gz", hash = "sha256:32bd3b5d13dc8186d7a42fc816a23d32e83a4827d7d9882948e7b837c232da5a"},
+    {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"},
+    {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"},
 ]
 sphinxcontrib-applehelp = [
     {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"},
@@ -1003,47 +996,48 @@ sphinxcontrib-serializinghtml = [
     {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"},
 ]
 tomli = [
-    {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"},
-    {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"},
+    {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
+    {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
 ]
 typed-ast = [
-    {file = "typed_ast-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d8314c92414ce7481eee7ad42b353943679cf6f30237b5ecbf7d835519e1212"},
-    {file = "typed_ast-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b53ae5de5500529c76225d18eeb060efbcec90ad5e030713fe8dab0fb4531631"},
-    {file = "typed_ast-1.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:24058827d8f5d633f97223f5148a7d22628099a3d2efe06654ce872f46f07cdb"},
-    {file = "typed_ast-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a6d495c1ef572519a7bac9534dbf6d94c40e5b6a608ef41136133377bba4aa08"},
-    {file = "typed_ast-1.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:de4ecae89c7d8b56169473e08f6bfd2df7f95015591f43126e4ea7865928677e"},
-    {file = "typed_ast-1.5.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:256115a5bc7ea9e665c6314ed6671ee2c08ca380f9d5f130bd4d2c1f5848d695"},
-    {file = "typed_ast-1.5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:7c42707ab981b6cf4b73490c16e9d17fcd5227039720ca14abe415d39a173a30"},
-    {file = "typed_ast-1.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:71dcda943a471d826ea930dd449ac7e76db7be778fcd722deb63642bab32ea3f"},
-    {file = "typed_ast-1.5.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4f30a2bcd8e68adbb791ce1567fdb897357506f7ea6716f6bbdd3053ac4d9471"},
-    {file = "typed_ast-1.5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ca9e8300d8ba0b66d140820cf463438c8e7b4cdc6fd710c059bfcfb1531d03fb"},
-    {file = "typed_ast-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9caaf2b440efb39ecbc45e2fabde809cbe56272719131a6318fd9bf08b58e2cb"},
-    {file = "typed_ast-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c9bcad65d66d594bffab8575f39420fe0ee96f66e23c4d927ebb4e24354ec1af"},
-    {file = "typed_ast-1.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:591bc04e507595887160ed7aa8d6785867fb86c5793911be79ccede61ae96f4d"},
-    {file = "typed_ast-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:a80d84f535642420dd17e16ae25bb46c7f4c16ee231105e7f3eb43976a89670a"},
-    {file = "typed_ast-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:38cf5c642fa808300bae1281460d4f9b7617cf864d4e383054a5ef336e344d32"},
-    {file = "typed_ast-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b6ab14c56bc9c7e3c30228a0a0b54b915b1579613f6e463ba6f4eb1382e7fd4"},
-    {file = "typed_ast-1.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2b8d7007f6280e36fa42652df47087ac7b0a7d7f09f9468f07792ba646aac2d"},
-    {file = "typed_ast-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:b6d17f37f6edd879141e64a5db17b67488cfeffeedad8c5cec0392305e9bc775"},
-    {file = "typed_ast-1.5.1.tar.gz", hash = "sha256:484137cab8ecf47e137260daa20bafbba5f4e3ec7fda1c1e69ab299b75fa81c5"},
-]
-types-futures = [
-    {file = "types-futures-3.3.1.tar.gz", hash = "sha256:bbdad92cec642693bac10fbbecf834776009db7782d91dc293bdd123be73186d"},
-    {file = "types_futures-3.3.1-py3-none-any.whl", hash = "sha256:b4bb97d1a028679929a8da2e9e63a5caccc6f68d0d6a456c41fd00e32764f144"},
+    {file = "typed_ast-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266"},
+    {file = "typed_ast-1.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596"},
+    {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc2542e83ac8399752bc16e0b35e038bdb659ba237f4222616b4e83fb9654985"},
+    {file = "typed_ast-1.5.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76"},
+    {file = "typed_ast-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a"},
+    {file = "typed_ast-1.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837"},
+    {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:963a0ccc9a4188524e6e6d39b12c9ca24cc2d45a71cfdd04a26d883c922b4b78"},
+    {file = "typed_ast-1.5.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e"},
+    {file = "typed_ast-1.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d"},
+    {file = "typed_ast-1.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd"},
+    {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7407cfcad702f0b6c0e0f3e7ab876cd1d2c13b14ce770e412c0c4b9728a0f88"},
+    {file = "typed_ast-1.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f30ddd110634c2d7534b2d4e0e22967e88366b0d356b24de87419cc4410c41b7"},
+    {file = "typed_ast-1.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30"},
+    {file = "typed_ast-1.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:90904d889ab8e81a956f2c0935a523cc4e077c7847a836abee832f868d5c26a4"},
+    {file = "typed_ast-1.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bbebc31bf11762b63bf61aaae232becb41c5bf6b3461b80a4df7e791fabb3aca"},
+    {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29dd9a3a9d259c9fa19d19738d021632d673f6ed9b35a739f48e5f807f264fb"},
+    {file = "typed_ast-1.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b"},
+    {file = "typed_ast-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:da0a98d458010bf4fe535f2d1e367a2e2060e105978873c04c04212fb20543f7"},
+    {file = "typed_ast-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098"},
+    {file = "typed_ast-1.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344"},
+    {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e"},
+    {file = "typed_ast-1.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f290617f74a610849bd8f5514e34ae3d09eafd521dceaa6cf68b3f4414266d4e"},
+    {file = "typed_ast-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:df05aa5b241e2e8045f5f4367a9f6187b09c4cdf8578bb219861c4e27c443db5"},
+    {file = "typed_ast-1.5.2.tar.gz", hash = "sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27"},
 ]
 types-protobuf = [
-    {file = "types-protobuf-3.18.2.tar.gz", hash = "sha256:ca21dedfe7759acbeb0cd8f5c72a74ff3c409ae0c07bc1d94eff5123ac0fa23c"},
-    {file = "types_protobuf-3.18.2-py3-none-any.whl", hash = "sha256:bcf3176ca59b42145fd60530f918b74fba01903a6cd96b94fa488791e3af0586"},
+    {file = "types-protobuf-3.19.15.tar.gz", hash = "sha256:d371d0a5b32e78c2d684329a5d4491d385e6eadcab497b37c41172ded328c5d9"},
+    {file = "types_protobuf-3.19.15-py3-none-any.whl", hash = "sha256:4673a4e56495886590c36cd87f2d855299a699a598eacb2e27d82b57eb4afb05"},
 ]
 typing-extensions = [
-    {file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"},
-    {file = "typing_extensions-4.0.1.tar.gz", hash = "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e"},
+    {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"},
+    {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"},
 ]
 urllib3 = [
-    {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"},
-    {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
+    {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"},
+    {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"},
 ]
 zipp = [
-    {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"},
-    {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"},
+    {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"},
+    {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"},
 ]
diff --git a/pyproject.toml b/pyproject.toml
index 7458fd90..4363882d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -8,7 +8,7 @@ readme = "README.md"
 homepage = "https://github.com/cscs181/CAI"
 repository = "https://github.com/cscs181/CAI"
 documentation = "https://github.com/cscs181/CAI#readme"
-keywords = ["qq", "mirai", "cqhttp"]
+keywords = ["qq", "mirai", "cqhttp", "onebot"]
 classifiers = ["Framework :: Robot Framework", "Programming Language :: Python :: 3"]
 include = ["cai/py.typed"]
 
@@ -17,18 +17,18 @@ python = "^3.7"
 rtea = "^0.3.0"
 jcestruct = "^0.1.0"
 protobuf = "^3.14.0"
-cachetools = "^4.2.2"
-cryptography = "^3.4.1"
-typing-extensions = ">=3.10.0,<5.0.0"
+cachetools = "^5.0.0"
+cryptography = "^36.0.2"
+typing-extensions = "^4.1.0"
 
 [tool.poetry.dev-dependencies]
 isort = "^5.9.3"
-black = "^21.7b0"
-pillow = "^8.1.0"
+black = "^22.3.0"
+pillow = "^9.1.0"
 sphinx = "^4.1.0"
-mypy-protobuf = "^2.4"
-sphinx-rtd-theme = "^0.5.1"
-sphinx-copybutton = "^0.4.0"
+mypy-protobuf = "^3.2.0"
+sphinx-rtd-theme = "^1.0.0"
+sphinx-copybutton = "^0.5.0"
 sphinxcontrib-napoleon = "^0.7"
 
 # [[tool.poetry.source]]

From 0f8c52484e7931c228de21b23e6e5be761bdd25e Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Thu, 7 Apr 2022 11:25:14 +0800
Subject: [PATCH 054/113] :label: update typing for pep646

---
 cai/utils/binary.py  |  99 +++++++++++++++++++++++----------------
 cai/utils/binary.pyi | 109 -------------------------------------------
 2 files changed, 58 insertions(+), 150 deletions(-)
 delete mode 100644 cai/utils/binary.pyi

diff --git a/cai/utils/binary.py b/cai/utils/binary.py
index c26aaeb6..e8016416 100644
--- a/cai/utils/binary.py
+++ b/cai/utils/binary.py
@@ -9,19 +9,22 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 import struct
+from typing_extensions import Unpack, TypeVarTuple
 from typing import (
+    TYPE_CHECKING,
     Any,
     List,
     Type,
     Tuple,
     Union,
+    Generic,
     NewType,
     TypeVar,
     Callable,
-    Optional,
 )
 
 P = TypeVar("P", bound="BasePacket")
+Ts = TypeVarTuple("Ts")
 
 BOOL = NewType("BOOL", bool)
 INT8 = NewType("INT8", int)
@@ -147,7 +150,7 @@ def read_string(self, offset: int = 0) -> STRING:
         return STRING(self.read_bytes(length, offset + 4).decode())
 
 
-class Packet(BasePacket):
+class Packet(BasePacket, Generic[Unpack[Ts]]):
     """Packet Class for extracting data more efficiently.
 
     Support `PEP646`_ typing hints. Using ``pyright`` or ``pylance`` for type checking.
@@ -162,7 +165,12 @@ class Packet(BasePacket):
 
     """
 
-    def __init__(self, *args, **kwargs):
+    if TYPE_CHECKING:
+
+        def __new__(cls, *args, **kwargs) -> "Packet[()]":
+            ...
+
+    def __init__(self: "Packet[Unpack[Ts]]", *args, **kwargs):
         super(Packet, self).__init__(*args, **kwargs)
         self.start()
 
@@ -172,107 +180,116 @@ def _add_filter(self, filter: Callable[[Any], Any]):
     def _get_position(self) -> int:
         return struct.calcsize(self._query) + self._offset
 
-    def start(self, offset: int = 0):
+    def start(self: "Packet[Unpack[Ts]]", offset: int = 0) -> "Packet[()]":
         self._query: str = ">"
         self._offset: int = offset
         self._executed: bool = False
         self._filters: List[Callable[[Any], Any]] = []
-        return self
+        return self  # type: ignore
 
-    def bool(self):
+    def bool(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], BOOL]":
         self._query += "?"
         self._add_filter(BOOL)
-        return self
+        return self  # type: ignore
 
-    def int8(self):
+    def int8(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], INT8]":
         self._query += "b"
         self._add_filter(INT8)
-        return self
+        return self  # type: ignore
 
-    def uint8(self):
+    def uint8(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], UINT8]":
         self._query += "B"
         self._add_filter(UINT8)
-        return self
+        return self  # type: ignore
 
-    def int16(self):
+    def int16(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], INT16]":
         self._query += "h"
         self._add_filter(INT16)
-        return self
+        return self  # type: ignore
 
-    def uint16(self):
+    def uint16(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], UINT16]":
         self._query += "H"
         self._add_filter(UINT16)
-        return self
+        return self  # type: ignore
 
-    def int32(self):
+    def int32(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], INT32]":
         self._query += "i"
         self._add_filter(INT32)
-        return self
+        return self  # type: ignore
 
-    def uint32(self):
+    def uint32(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], UINT32]":
         self._query += "I"
         self._add_filter(UINT32)
-        return self
+        return self  # type: ignore
 
-    def int64(self):
+    def int64(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], INT64]":
         self._query += "q"
         self._add_filter(INT64)
-        return self
+        return self  # type: ignore
 
-    def uint64(self):
+    def uint64(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], UINT64]":
         self._query += "Q"
         self._add_filter(UINT64)
-        return self
+        return self  # type: ignore
 
-    def float(self):
+    def float(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], FLOAT]":
         self._query += "f"
         self._add_filter(FLOAT)
-        return self
+        return self  # type: ignore
 
-    def double(self):
+    def double(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], DOUBLE]":
         self._query += "d"
         self._add_filter(DOUBLE)
-        return self
+        return self  # type: ignore
 
-    def byte(self):
+    def byte(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], BYTE]":
         self._query += "c"
         self._add_filter(BYTE)
-        return self
+        return self  # type: ignore
 
-    def bytes(self, length: int):
+    def bytes(
+        self: "Packet[Unpack[Ts]]", length: int
+    ) -> "Packet[Unpack[Ts], BYTES]":
         self._query += f"{length}s"
         self._add_filter(BYTES)
-        return self
+        return self  # type: ignore
 
-    def bytes_with_length(self, head_bytes: int, offset: int = 0):
+    def bytes_with_length(
+        self: "Packet[Unpack[Ts]]", head_bytes: int, offset: int = 0
+    ) -> "Packet[Unpack[Ts], BYTES]":
         length = int.from_bytes(
             self.read_bytes(head_bytes, self._get_position()),
             "big",
         )
         self._query += f"{head_bytes}x{length - offset}s"
         self._add_filter(BYTES)
-        return self
-
-    def string(self, head_bytes: int, offset: int = 0, encoding: str = "utf-8"):
+        return self  # type: ignore
+
+    def string(
+        self: "Packet[Unpack[Ts]]",
+        head_bytes: int,
+        offset: int = 0,
+        encoding: str = "utf-8",
+    ) -> "Packet[Unpack[Ts], STRING]":
         length = int.from_bytes(
             self.read_bytes(head_bytes, self._get_position()),
             "big",
         )
         self._query += f"{head_bytes}x{length - offset}s"
         self._add_filter(lambda x: STRING(x.decode(encoding)))
-        return self
+        return self  # type: ignore
 
-    def offset(self, offset: int):
+    def offset(self: "Packet[Unpack[Ts]]", offset: int) -> "Packet[Unpack[Ts]]":
         self._query += f"{offset}x"
         return self
 
-    def remain(self):
+    def remain(self: "Packet[Unpack[Ts]]") -> "Packet[Unpack[Ts], Packet[()]]":
         length = struct.calcsize(self._query)
         self._query += f"{len(self) - length}s"
         self._add_filter(Packet)
-        return self
+        return self  # type: ignore
 
-    def execute(self):
+    def execute(self: "Packet[Unpack[Ts]]") -> Tuple[Unpack[Ts]]:
         if self._executed:
             raise RuntimeError("Cannot re-execute query. Call `start()` first.")
         query = self._query
@@ -286,4 +303,4 @@ def execute(self):
                 filters,
                 self.unpack_from(query, self._offset),
             )
-        )
+        )  # type: ignore
diff --git a/cai/utils/binary.pyi b/cai/utils/binary.pyi
deleted file mode 100644
index f68b440f..00000000
--- a/cai/utils/binary.pyi
+++ /dev/null
@@ -1,109 +0,0 @@
-# type: ignore
-"""Binary Tools Stub File.
-
-Type hints in this file needs python>=3.10 or using ``pyright`` or ``pylance``...
-
-:Copyright: Copyright (C) 2021-2021  cscs181
-:License: AGPL-3.0 or later. See `LICENSE`_ for detail.
-
-.. _LICENSE:
-    https://github.com/cscs181/CAI/blob/master/LICENSE
-"""
-
-from typing_extensions import Unpack, TypeVarTuple
-from typing import (
-    Any,
-    List,
-    Type,
-    Tuple,
-    Union,
-    Generic,
-    NewType,
-    TypeVar,
-    Callable,
-    Optional,
-)
-
-P = TypeVar("P", bound="BasePacket")
-Ts = TypeVarTuple("Ts")
-
-BOOL = NewType("BOOL", bool)
-INT8 = NewType("INT8", int)
-UINT8 = NewType("UINT8", int)
-INT16 = NewType("INT16", int)
-UINT16 = NewType("UINT16", int)
-INT32 = NewType("INT32", int)
-UINT32 = NewType("UINT32", int)
-INT64 = NewType("INT64", int)
-UINT64 = NewType("UINT64", int)
-FLOAT = NewType("FLOAT", float)
-DOUBLE = NewType("DOUBLE", float)
-BYTE = NewType("BYTE", bytes)
-BYTES = NewType("BYTES", bytes)
-STRING = NewType("STRING", str)
-
-class BasePacket(bytearray):
-    @classmethod
-    def build(cls: Type[P], *data: Union[bytes, "BasePacket"]) -> P: ...
-    def write(self: P, *data: Union[bytes, "BasePacket"]) -> P: ...
-    def write_with_length(
-        self: P, *data: Union[bytes, "BasePacket"], offset: int = ...
-    ) -> P: ...
-    def unpack(self, format: Union[bytes, str]) -> Tuple[Any, ...]: ...
-    def unpack_from(
-        self, format: Union[bytes, str], offset: int = ...
-    ) -> Tuple[Any, ...]: ...
-    def read_int8(self, offset: int = ...) -> INT8: ...
-    def read_uint8(self, offset: int = ...) -> UINT8: ...
-    def read_int16(self, offset: int = ...) -> INT16: ...
-    def read_uint16(self, offset: int = ...) -> UINT16: ...
-    def read_int32(self, offset: int = ...) -> INT32: ...
-    def read_uint32(self, offset: int = ...) -> UINT32: ...
-    def read_int64(self, offset: int = ...) -> INT64: ...
-    def read_uint64(self, offset: int = ...) -> UINT64: ...
-    def read_byte(self, offset: int = ...) -> BYTE: ...
-    def read_bytes(self, n: int, offset: int = ...) -> BYTES: ...
-    def read_string(self, offset: int = ...) -> STRING: ...
-
-_bool = bool
-
-class Packet(BasePacket, Generic[Unpack[Ts]]):
-    _query: str = ...
-    _offset: int = ...
-    _executed: _bool = ...
-    _filters: List[Callable[[Any], Any]] = ...
-    def __init__(
-        self, *args, cache: Optional[Tuple[Any, ...]] = None, **kwargs
-    ) -> Packet[()]: ...
-    def __new__(cls, *args, **kwargs) -> Packet[()]: ...
-    def start(self: Packet[Unpack[Ts]], offset: int = ...) -> Packet[()]: ...
-    def bool(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], BOOL]: ...
-    def int8(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], INT8]: ...
-    def uint8(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], UINT8]: ...
-    def int16(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], INT16]: ...
-    def uint16(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], UINT16]: ...
-    def int32(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], INT32]: ...
-    def uint32(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], UINT32]: ...
-    def int64(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], INT64]: ...
-    def uint64(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], UINT64]: ...
-    def float(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], FLOAT]: ...
-    def double(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], DOUBLE]: ...
-    def byte(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts], BYTE]: ...
-    def bytes(
-        self: Packet[Unpack[Ts]], length: int
-    ) -> Packet[Unpack[Ts], BYTES]: ...
-    def bytes_with_length(
-        self: Packet[Unpack[Ts]], head_bytes: int, offset: int = ...
-    ) -> Packet[Unpack[Ts], BYTES]: ...
-    def string(
-        self: Packet[Unpack[Ts]],
-        head_bytes: int,
-        offset: int = ...,
-        encoding: str = ...,
-    ) -> Packet[Unpack[Ts], STRING]: ...
-    def offset(self: Packet[Unpack[Ts]], offset: int) -> Packet[Unpack[Ts]]: ...
-    def remain(
-        self: Packet[Unpack[Ts]],
-    ) -> Packet[Unpack[Ts], Packet[()]]: ...
-    def _exec_cache(self: Packet[Unpack[Ts]]) -> Packet[Unpack[Ts]]: ...
-    def execute(self: Packet[Unpack[Ts]]) -> Tuple[Unpack[Ts]]: ...

From 05eb52b242b968710147676aa9f6392138940803 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Thu, 7 Apr 2022 15:06:19 +0800
Subject: [PATCH 055/113] :art: format code

---
 cai/api/__init__.py                    |   1 -
 cai/api/base.py                        |   4 +-
 cai/api/client.py                      |  44 +++++---
 cai/api/friend.py                      |  12 +--
 cai/api/group.py                       |   8 +-
 cai/api/login.py                       |  17 ++-
 cai/client/client.py                   | 137 ++++++++++++++++++-------
 cai/client/heartbeat/__init__.py       |   7 +-
 cai/client/highway/__init__.py         |   1 -
 cai/client/highway/decoders.py         |  25 +++--
 cai/client/highway/encoders.py         |  90 ++++++++--------
 cai/client/highway/frame.py            |  12 ++-
 cai/client/highway/highway.py          |  78 +++++++-------
 cai/client/highway/models.py           |   2 +-
 cai/client/highway/utils.py            |   2 +-
 cai/client/message_service/decoders.py |  70 +++++++------
 cai/client/message_service/encoders.py |  85 +++++++--------
 cai/client/message_service/models.py   |   7 +-
 cai/client/multi_msg/long_msg.py       |  67 +++++++-----
 cai/client/online_push/__init__.py     |  12 ++-
 cai/client/sso_server/__init__.py      |   2 +-
 cai/client/status_service/__init__.py  |  10 +-
 cai/client/wtlogin/__init__.py         |  33 +++---
 cai/client/wtlogin/oicq.py             |   8 +-
 cai/client/wtlogin/tlv.py              |   2 +-
 cai/connection/__init__.py             |   2 +-
 cai/settings/protocol.py               |   7 +-
 cai/utils/coroutine.py                 |   2 +-
 examples/login.py                      |  44 +++++---
 29 files changed, 467 insertions(+), 324 deletions(-)

diff --git a/cai/api/__init__.py b/cai/api/__init__.py
index d3e70dae..2ff5d805 100644
--- a/cai/api/__init__.py
+++ b/cai/api/__init__.py
@@ -11,5 +11,4 @@
 
 from .client import Client, make_client
 
-
 __all__ = ["Client", "make_client"]
diff --git a/cai/api/base.py b/cai/api/base.py
index fea30b33..d642c757 100644
--- a/cai/api/base.py
+++ b/cai/api/base.py
@@ -4,7 +4,9 @@
 class BaseAPI:
     client: client_t
 
-    async def _executor(self, func_name: str, *args, uncaught_error=False, **kwargs):
+    async def _executor(
+        self, func_name: str, *args, uncaught_error=False, **kwargs
+    ):
         if not hasattr(self.client, func_name):
             raise AttributeError(f"client has no attribute '{func_name}'")
         try:
diff --git a/cai/api/client.py b/cai/api/client.py
index d90609a5..e03e6570 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -8,29 +8,37 @@
 """
 
 import hashlib
-from typing import Union, Optional, Sequence, BinaryIO
+from typing import Union, BinaryIO, Optional, Sequence
 
 from cai import log
-from cai.client import OnlineStatus, Client as client_t
+from cai.client import OnlineStatus
+from cai.client import Client as client_t
+from cai.settings.protocol import ApkInfo
+from cai.pb.msf.msg.svc import PbSendMsgResp
 from cai.client.highway import HighWaySession
-from cai.client.message_service.models import Element, ImageElement, VoiceElement
-from cai.client.message_service.encoders import make_group_msg_pkg, build_msg
 from cai.settings.device import DeviceInfo, new_device
-from cai.settings.protocol import ApkInfo
+from cai.client.message_service.encoders import build_msg, make_group_msg_pkg
+from cai.client.message_service.models import (
+    Element,
+    ImageElement,
+    VoiceElement,
+)
 
-from .error import BotMutedException, AtAllLimitException, GroupMsgLimitException
-from .friend import Friend as _Friend
 from .group import Group as _Group
 from .login import Login as _Login
-
-from cai.pb.msf.msg.svc import PbSendMsgResp
+from .friend import Friend as _Friend
+from .error import (
+    BotMutedException,
+    AtAllLimitException,
+    GroupMsgLimitException,
+)
 
 
 def make_client(
     uin: int,
     passwd: Union[str, bytes],
     apk_info: ApkInfo,
-    device: Optional[DeviceInfo] = None
+    device: Optional[DeviceInfo] = None,
 ) -> client_t:
     if not (isinstance(passwd, bytes) and len(passwd) == 16):
         # not a vailed md5 passwd
@@ -59,12 +67,14 @@ def status(self) -> Optional[OnlineStatus]:
     async def send_group_msg(self, gid: int, msg: Sequence[Element]):
         # todo: split long msg
         resp: PbSendMsgResp = PbSendMsgResp.FromString(
-            (await self.client.send_unipkg_and_wait(
-                "MessageSvc.PbSendMsg",
-                make_group_msg_pkg(
-                    self.client.next_seq(), gid, build_msg(msg)
-                ).SerializeToString()
-            )).data
+            (
+                await self.client.send_unipkg_and_wait(
+                    "MessageSvc.PbSendMsg",
+                    make_group_msg_pkg(
+                        self.client.next_seq(), gid, build_msg(msg)
+                    ).SerializeToString(),
+                )
+            ).data
         )
 
         if resp.result == 120:
@@ -91,7 +101,7 @@ async def set_status(
         self,
         status: Union[int, OnlineStatus],
         battery_status: Optional[int] = None,
-        is_power_connected: bool = False
+        is_power_connected: bool = False,
     ) -> None:
         """Change client status.
 
diff --git a/cai/api/friend.py b/cai/api/friend.py
index 6c7820f4..6aabf8bb 100644
--- a/cai/api/friend.py
+++ b/cai/api/friend.py
@@ -9,8 +9,10 @@
 
 from typing import List, Optional
 
+from cai.client import FriendGroup
+from cai.client import Friend as friend_t
+
 from .base import BaseAPI
-from cai.client import FriendGroup, Friend as friend_t
 
 
 class Friend(BaseAPI):
@@ -37,9 +39,7 @@ async def get_friend(
         """
         return await self.client.get_friend(friend_uin, cache)
 
-    async def get_friend_list(
-        self, cache: bool = True
-    ) -> List[friend_t]:
+    async def get_friend_list(self, cache: bool = True) -> List[friend_t]:
         """Get account friend list.
 
         This function wraps the :meth:`~cai.client.client.Client.get_friend_list`
@@ -103,6 +103,4 @@ async def get_friend_group_list(
         return await self._executor("get_friend_group_list", cache)
 
 
-__all__ = [
-    "Friend"
-]
+__all__ = ["Friend"]
diff --git a/cai/api/group.py b/cai/api/group.py
index 65dd0836..b16536c7 100644
--- a/cai/api/group.py
+++ b/cai/api/group.py
@@ -9,8 +9,10 @@
 
 from typing import List, Union, Optional
 
+from cai.client import GroupMember
+from cai.client import Group as group_t
+
 from .base import BaseAPI
-from cai.client import GroupMember, Group as group_t
 
 
 class Group(BaseAPI):
@@ -37,9 +39,7 @@ async def get_group(
         """
         return await self._executor("get_group", group_id, cache)
 
-    async def get_group_list(
-        self, cache: bool = True
-    ) -> List[group_t]:
+    async def get_group_list(self, cache: bool = True) -> List[group_t]:
         """Get account group list.
 
         This function wraps the :meth:`~cai.client.client.Client.get_group_list`
diff --git a/cai/api/login.py b/cai/api/login.py
index 01d6ff73..7c736b88 100644
--- a/cai/api/login.py
+++ b/cai/api/login.py
@@ -6,9 +6,10 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-from .base import BaseAPI
 from cai.exceptions import LoginException
 
+from .base import BaseAPI
+
 
 class Login(BaseAPI):
     async def login(self):
@@ -29,9 +30,7 @@ async def login(self):
             await self.client.close()
             raise
 
-    async def submit_captcha(
-        self, captcha: str, captcha_sign: bytes
-    ) -> bool:
+    async def submit_captcha(self, captcha: str, captcha_sign: bytes) -> bool:
         """Submit captcha data to login.
 
         This function wraps the :meth:`~cai.client.client.Client.submit_captcha`
@@ -47,7 +46,7 @@ async def submit_captcha(
         """
         try:
             await self._executor("submit_captcha", captcha, captcha_sign)
-        except not LoginException:
+        except LoginException:
             await self.client.close()
             raise
         return True
@@ -83,7 +82,7 @@ async def request_sms(self) -> bool:
         """
         try:
             return await self.client.request_sms()
-        except not LoginException:
+        except LoginException:
             await self.client.close()
             raise
 
@@ -102,12 +101,10 @@ async def submit_sms(self, sms_code: str) -> bool:
         """
         try:
             await self._executor("submit_sms", sms_code)
-        except not LoginException:
+        except LoginException:
             await self.client.close()
             raise
         return True
 
 
-__all__ = [
-    "Login"
-]
+__all__ = ["Login"]
diff --git a/cai/client/client.py b/cai/client/client.py
index 83217373..5ad34d5e 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -16,11 +16,12 @@
     Set,
     Dict,
     List,
+    Tuple,
     Union,
     Callable,
     Optional,
     Awaitable,
-    overload, Tuple,
+    overload,
 )
 
 from cachetools import TTLCache
@@ -28,8 +29,8 @@
 from cai import log
 from cai.utils.binary import Packet
 from cai.utils.future import FutureStore
-from cai.settings.device import DeviceInfo
 from cai.settings.protocol import ApkInfo
+from cai.settings.device import DeviceInfo
 from cai.connection import Connection, connect
 from cai.exceptions import (
     LoginException,
@@ -46,10 +47,10 @@
 )
 
 from .event import Event
-from .multi_msg.long_msg import _handle_multi_resp_body
-from .packet import IncomingPacket, UniPacket
+from .packet import UniPacket, IncomingPacket
 from .command import Command, _packet_to_command
 from .sso_server import SsoServer, get_sso_server
+from .multi_msg.long_msg import _handle_multi_resp_body
 from .online_push import handle_c2c_sync, handle_push_msg
 from .heartbeat import Heartbeat, encode_heartbeat, handle_heartbeat
 from .models import Group, Friend, SigInfo, FriendGroup, GroupMember
@@ -109,7 +110,9 @@
     encode_login_request2_captcha,
 )
 
-HT = Callable[["Client", IncomingPacket, Tuple[DeviceInfo, ApkInfo]], Awaitable[Command]]
+HT = Callable[
+    ["Client", IncomingPacket, Tuple[DeviceInfo, ApkInfo]], Awaitable[Command]
+]
 LT = Callable[["Client", Event], Awaitable[None]]
 
 HANDLERS: Dict[str, HT] = {
@@ -131,16 +134,28 @@
     "OnlinePush.PbC2CMsgSync": handle_c2c_sync,
     "OnlinePush.PbPushC2CMsg": handle_push_msg,
     # "OnlinePush.PbPushBindUinGroupMsg": handle_push_msg,  # sub account
-
     # new
-    "MultiMsg.ApplyUp": _handle_multi_resp_body
+    "MultiMsg.ApplyUp": _handle_multi_resp_body,
 }
 
 
 class Client:
     LISTENERS: Set[LT] = set()
 
-    def __init__(self, uin: int, password_md5: bytes, device: DeviceInfo, apk_info: ApkInfo, *, loop=None):
+    def __init__(
+        self,
+        uin: int,
+        password_md5: bytes,
+        device: DeviceInfo,
+        apk_info: ApkInfo,
+        *,
+        auto_reconnect: bool = True,
+        max_reconnections: Optional[int] = 3,
+    ):
+        # client info
+        self._device: DeviceInfo = device
+        self._apk_info: ApkInfo = apk_info
+
         # account info
         self._uin: int = uin
         self._password_md5: bytes = password_md5
@@ -184,18 +199,30 @@ def __init__(self, uin: int, password_md5: bytes, device: DeviceInfo, apk_info:
         self._msg_cache: TTLCache = TTLCache(maxsize=1024, ttl=3600)
         self._receive_store: FutureStore[int, Command] = FutureStore()
 
-        self.device_info: DeviceInfo = device
-        self.apk_info: ApkInfo = apk_info
-        self._reconnect: bool = True
-        self.closed: asyncio.Event = asyncio.Event()
-
-        if not loop:
-            loop = asyncio.get_event_loop()
-        self._loop = loop
+        # connection info
+        self._reconnect: bool = auto_reconnect
+        self._max_reconnections: Optional[int] = max_reconnections
+        self._closed: asyncio.Event = asyncio.Event()
 
     def __str__(self) -> str:
         return f"<cai client object {self.uin}(connected={self.connected})>"
 
+    @property
+    def device(self) -> DeviceInfo:
+        """
+        Returns:
+            DeviceInfo: client device info
+        """
+        return self._device
+
+    @property
+    def apk_info(self) -> ApkInfo:
+        """
+        Returns:
+            ApkInfo: client apk(protocol) info
+        """
+        return self._apk_info
+
     @property
     def uin(self) -> int:
         """
@@ -264,6 +291,10 @@ def connected(self) -> bool:
         """
         return bool(self._connection and not self._connection.closed)
 
+    @property
+    def closed(self) -> bool:
+        return self._closed.is_set()
+
     async def connect(self, server: Optional[SsoServer] = None) -> None:
         """Connect to the server.
 
@@ -278,6 +309,8 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
         """
         if self.connected:
             raise RuntimeError("Already connected to the server")
+        if self.closed:
+            raise RuntimeError("Client is closed")
         log.network.debug("Getting Sso server")
         _server = server or await get_sso_server()
         log.logger.info(f"Connecting to server: {_server.host}:{_server.port}")
@@ -285,7 +318,9 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
             self._connection = await connect(
                 _server.host, _server.port, ssl=False, timeout=3.0
             )
-            self._loop.create_task(self.receive()).add_done_callback(self._recv_done_cb)
+            asyncio.create_task(self.receive()).add_done_callback(
+                self._recv_done_cb
+            )
         except ConnectionError as e:
             raise
         except Exception as e:
@@ -297,10 +332,10 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
     def _recv_done_cb(self, _task):
         if self._reconnect:
             log.network.warning("receiver stopped, try to reconnect")
-            self._loop.create_task(self.reconnect())
+            asyncio.create_task(self.reconnect())
         else:
             log.network.warning("receiver stopped")
-            self._loop.create_task(self.close())
+            asyncio.create_task(self.close())
 
     async def disconnect(self) -> None:
         """Disconnect if already connected to the server."""
@@ -340,14 +375,19 @@ async def reconnect(
     async def close(self) -> None:
         """Close the client and logout."""
         log.logger.warning("closing client")
+        # disable reconnection
         self._reconnect = False
+        # logout
         if (
             self.connected
             and self.status
             and self.status != OnlineStatus.Offline
         ):
             await self.register(OnlineStatus.Offline)
+
+        # clear waiting packet
         self._receive_store.cancel_all()
+        # disconnect server
         await self.disconnect()
         self.closed.set()
 
@@ -405,19 +445,32 @@ async def send_and_wait(
         await self.send(seq, command_name, packet)
         return await self._receive_store.fetch(seq, timeout)
 
-    async def send_unipkg_and_wait(self, command_name: str, enc_packet: bytes, seq=-1, timeout=10.0):
+    async def send_unipkg_and_wait(
+        self, command_name: str, enc_packet: bytes, seq=-1, timeout=10.0
+    ):
         if seq == -1:
             seq = self.next_seq()
         return await self.send_and_wait(
-            seq, command_name,
-            UniPacket.build(self.uin, seq, command_name, self._session_id, 1, enc_packet, self._siginfo.d2key),
-            timeout
+            seq,
+            command_name,
+            UniPacket.build(
+                self.uin,
+                seq,
+                command_name,
+                self._session_id,
+                1,
+                enc_packet,
+                self._siginfo.d2key,
+            ),
+            timeout,
         )
 
     async def _handle_incoming_packet(self, in_packet: IncomingPacket) -> None:
         try:
             handler = HANDLERS.get(in_packet.command_name, _packet_to_command)
-            packet = await handler(self, in_packet, (self.device_info, self.apk_info))
+            packet = await handler(
+                self, in_packet, (self.device_info, self.apk_info)
+            )
             self._receive_store.store_result(packet.seq, packet)
         except Exception as e:
             # TODO: handle exception
@@ -431,7 +484,12 @@ async def receive(self):
         """
         while self.connected:
             try:
-                length: int = int.from_bytes(await self.connection.read_bytes(4), "big", signed=False) - 4
+                length: int = (
+                    int.from_bytes(
+                        await self.connection.read_bytes(4), "big", signed=False
+                    )
+                    - 4
+                )
 
                 data = await self.connection.read_bytes(length)
                 packet = IncomingPacket.parse(
@@ -445,7 +503,7 @@ async def receive(self):
                     f"(receive:{packet.ret_code}): {packet.command_name}"
                 )
                 # do not block receive
-                self._loop.create_task(self._handle_incoming_packet(packet))
+                asyncio.create_task(self._handle_incoming_packet(packet))
             except ConnectionAbortedError as e:
                 log.logger.error(f"{self.uin} connection lost: {str(e)}")
                 break
@@ -539,7 +597,7 @@ async def _handle_login_response(
                     self._t104,
                     self._siginfo.g,
                     self.device_info.imei,
-                    self.apk_info
+                    self.apk_info,
                 )
                 response = await self.send_and_wait(
                     seq, "wtlogin.login", packet
@@ -611,7 +669,7 @@ async def login(self) -> LoginSuccess:
             self.uin,
             self._password_md5,
             self.device_info,
-            self.apk_info
+            self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
         return await self._handle_login_response(response)
@@ -647,7 +705,7 @@ async def submit_captcha(
             captcha_sign,
             self._t104,
             self.device_info.imei,
-            self.apk_info
+            self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
         return await self._handle_login_response(response)
@@ -680,7 +738,7 @@ async def submit_slider_ticket(self, ticket: str) -> LoginSuccess:
             ticket,
             self._t104,
             self.device_info.imei,
-            self.apk_info
+            self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
         return await self._handle_login_response(response)
@@ -713,7 +771,7 @@ async def request_sms(self) -> bool:
             self._t104,
             self._t174,
             self.device_info.imei,
-            self.apk_info
+            self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
 
@@ -755,7 +813,7 @@ async def submit_sms(self, sms_code: str) -> LoginSuccess:
             self._t174,
             self._siginfo.g,
             self.device_info.imei,
-            self.apk_info
+            self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
         return await self._handle_login_response(response)
@@ -795,7 +853,7 @@ async def _handle_refresh_response(
                     self._t104,
                     self._siginfo.g,
                     self.device_info.imei,
-                    self.apk_info
+                    self.apk_info,
                 )
                 response = await self.send_and_wait(
                     seq, "wtlogin.login", packet
@@ -843,7 +901,7 @@ async def refresh_siginfo(self) -> LoginSuccess:
             self._siginfo.wt_session_ticket,
             self._siginfo.wt_session_ticket_key,
             self.device_info,
-            self.apk_info
+            self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.exchange_emp", packet)
 
@@ -883,7 +941,7 @@ async def register(
             status,
             register_reason,
             self.apk_info.sub_app_id,
-            self.device_info
+            self.device_info,
         )
         response = await self.send_and_wait(seq, "StatSvc.register", packet)
 
@@ -936,7 +994,7 @@ async def set_status(
             self.device_info,
             status,
             battery_status,
-            is_power_connected
+            is_power_connected,
         )
         response = await self.send_and_wait(
             seq, "StatSvc.SetStatusFromClient", packet
@@ -977,7 +1035,12 @@ async def heartbeat(self) -> None:
         while self._heartbeat_enabled and not self._connection.closed:
             seq = self.next_seq()
             packet = encode_heartbeat(
-                seq, self._session_id, self.device_info.imei, self._ksid, self.uin, self.apk_info.sub_app_id
+                seq,
+                self._session_id,
+                self.device_info.imei,
+                self._ksid,
+                self.uin,
+                self.apk_info.sub_app_id,
             )
             try:
                 response = await self.send_and_wait(
diff --git a/cai/client/heartbeat/__init__.py b/cai/client/heartbeat/__init__.py
index 37c1d872..b2b516fd 100644
--- a/cai/client/heartbeat/__init__.py
+++ b/cai/client/heartbeat/__init__.py
@@ -21,7 +21,12 @@
 
 
 def encode_heartbeat(
-    seq: int, session_id: bytes, imei: str, ksid: bytes, uin: int, sub_app_id: int
+    seq: int,
+    session_id: bytes,
+    imei: str,
+    ksid: bytes,
+    uin: int,
+    sub_app_id: int,
 ) -> Packet:
     """Build heartbeat alive packet.
 
diff --git a/cai/client/highway/__init__.py b/cai/client/highway/__init__.py
index b53b1834..cb227ebb 100644
--- a/cai/client/highway/__init__.py
+++ b/cai/client/highway/__init__.py
@@ -1,4 +1,3 @@
 from .highway import HighWaySession
 
-
 __all__ = ["HighWaySession"]
diff --git a/cai/client/highway/decoders.py b/cai/client/highway/decoders.py
index 006e4d7f..da5e6734 100644
--- a/cai/client/highway/decoders.py
+++ b/cai/client/highway/decoders.py
@@ -1,41 +1,50 @@
-from .models import ImageUploadResponse, UploadResponse
-from .utils import itoa
 from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388RspBody
 
+from .utils import itoa
+from .models import UploadResponse, ImageUploadResponse
+
 
 def decode_upload_image_resp(data: bytes) -> ImageUploadResponse:
     pkg = decode_d388_rsp(data).tryupImgRsp[0]
     if pkg.result != 0:
-        return ImageUploadResponse(resultCode=pkg.result, message=pkg.failMsg.decode())
+        return ImageUploadResponse(
+            resultCode=pkg.result, message=pkg.failMsg.decode()
+        )
 
     if pkg.fileExit:
         if pkg.imgInfo:
             info = pkg.imgInfo
             # fuck: pkg.fileId != pkg.fileid
             return ImageUploadResponse(
-                isExists=True, fileId=pkg.fileid, hasMetaData=True,
-                fileType=info.fileType, width=info.fileWidth, height=info.fileHeight
+                isExists=True,
+                fileId=pkg.fileid,
+                hasMetaData=True,
+                fileType=info.fileType,
+                width=info.fileWidth,
+                height=info.fileHeight,
             )
         else:
             return ImageUploadResponse(isExists=True, fileId=pkg.fileid)
     return ImageUploadResponse(
         isExists=False,
         uploadAddr=[(itoa(a), p) for a, p in zip(pkg.upIp, pkg.upPort)],
-        uploadKey=pkg.upUkey
+        uploadKey=pkg.upUkey,
     )
 
 
 def decode_upload_ptt_resp(data: bytes) -> UploadResponse:
     pkg = decode_d388_rsp(data).tryupPttRsp[0]
     if pkg.result != 0:
-        return UploadResponse(resultCode=pkg.result, message=pkg.failMsg.decode())
+        return UploadResponse(
+            resultCode=pkg.result, message=pkg.failMsg.decode()
+        )
 
     if pkg.fileExit:
         return UploadResponse(isExists=True, fileId=pkg.fileid)
     return UploadResponse(
         isExists=False,
         uploadAddr=[(itoa(a), p) for a, p in zip(pkg.upIp, pkg.upPort)],
-        uploadKey=pkg.upUkey
+        uploadKey=pkg.upUkey,
     )
 
 
diff --git a/cai/client/highway/encoders.py b/cai/client/highway/encoders.py
index 663fd656..d96c5859 100644
--- a/cai/client/highway/encoders.py
+++ b/cai/client/highway/encoders.py
@@ -1,57 +1,57 @@
-from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388ReqBody, TryUpImgReq, TryUpPttReq
+from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import (
+    D388ReqBody,
+    TryUpImgReq,
+    TryUpPttReq,
+)
 
 
 def encode_d388_req(
-    group_code: int,
-    uin: int,
-    md5: bytes,
-    size: int,
-    subcmd: int
+    group_code: int, uin: int, md5: bytes, size: int, subcmd: int
 ) -> D388ReqBody:
     img, ptt = None, None
     if subcmd == 1:  # upload img
         fn = md5.hex().upper() + ".jpg"
-        img = [TryUpImgReq(
-            groupCode=group_code,
-            srcUin=uin,
-            fileName=fn.encode(),
-            fileMd5=md5,
-            fileSize=size,
-            fileId=0,
-            srcTerm=5,
-            platformType=9,
-            buType=1,
-            picType=1003,
-            picWidth=1920,
-            picHeight=903,
-            buildVer=b"8.8.50.2324",
-            appPicType=1052,
-            originalPic=1,
-            srvUpload=0
-        )]
+        img = [
+            TryUpImgReq(
+                groupCode=group_code,
+                srcUin=uin,
+                fileName=fn.encode(),
+                fileMd5=md5,
+                fileSize=size,
+                fileId=0,
+                srcTerm=5,
+                platformType=9,
+                buType=1,
+                picType=1003,
+                picWidth=1920,
+                picHeight=903,
+                buildVer=b"8.8.50.2324",
+                appPicType=1052,
+                originalPic=1,
+                srvUpload=0,
+            )
+        ]
     elif subcmd == 3:  # voice
-        ptt = [TryUpPttReq(
-            groupCode=group_code,
-            srcUin=uin,
-            fileMd5=md5,
-            fileName=(md5.hex().upper() + ".amr").encode(),
-            fileSize=size,
-            voiceLength=size,
-            voiceType=1,
-            codec=0,
-            srcTerm=5,
-            platformType=9,
-            buType=4,
-            innerIp=0,
-            buildVer=b"8.8.50.2324",
-            newUpChan=True
-        )]
+        ptt = [
+            TryUpPttReq(
+                groupCode=group_code,
+                srcUin=uin,
+                fileMd5=md5,
+                fileName=(md5.hex().upper() + ".amr").encode(),
+                fileSize=size,
+                voiceLength=size,
+                voiceType=1,
+                codec=0,
+                srcTerm=5,
+                platformType=9,
+                buType=4,
+                innerIp=0,
+                buildVer=b"8.8.50.2324",
+                newUpChan=True,
+            )
+        ]
     else:
         ValueError("unsupported subcmd:", subcmd)
     return D388ReqBody(
-        netType=8,
-        subcmd=subcmd,
-        tryupImgReq=img,
-        tryupPttReq=ptt
+        netType=8, subcmd=subcmd, tryupImgReq=img, tryupPttReq=ptt
     )
-
diff --git a/cai/client/highway/frame.py b/cai/client/highway/frame.py
index 4c557930..42191b1a 100644
--- a/cai/client/highway/frame.py
+++ b/cai/client/highway/frame.py
@@ -1,5 +1,5 @@
-import asyncio
 import struct
+import asyncio
 from typing import Tuple
 
 from cai.pb.highway.protocol.highway_head_pb2 import highway_head
@@ -15,15 +15,19 @@ def write_frame(head: bytes, body: bytes) -> bytes:
     return buf
 
 
-async def read_frame(reader: asyncio.StreamReader) -> Tuple[highway_head.RspDataHighwayHead, bytes]:
+async def read_frame(
+    reader: asyncio.StreamReader,
+) -> Tuple[highway_head.RspDataHighwayHead, bytes]:
     head = await reader.readexactly(9)
     if len(head) != 9 and head[0] != 0x28:
         raise ValueError("Invalid frame head", head)
     hl, bl = struct.unpack("!II", head[1:])
     try:
         return (
-            highway_head.RspDataHighwayHead.FromString(await reader.readexactly(hl)),
-            await reader.readexactly(bl)
+            highway_head.RspDataHighwayHead.FromString(
+                await reader.readexactly(hl)
+            ),
+            await reader.readexactly(bl),
         )
     finally:
         await reader.read(1)  # flush end byte
diff --git a/cai/client/highway/highway.py b/cai/client/highway/highway.py
index 14d9e218..13a77d5c 100644
--- a/cai/client/highway/highway.py
+++ b/cai/client/highway/highway.py
@@ -1,25 +1,22 @@
 import asyncio
 import logging
 from hashlib import md5
-from typing import Tuple, BinaryIO, TYPE_CHECKING, Optional, List
+from typing import TYPE_CHECKING, List, Tuple, BinaryIO, Optional
+
+from cai.pb.highway.protocol.highway_head_pb2 import highway_head
 
-from .decoders import decode_upload_image_resp, decode_upload_ptt_resp
 from .encoders import encode_d388_req
-from .utils import calc_file_md5_and_length, timeit, to_id
 from .frame import read_frame, write_frame
-from cai.pb.highway.protocol.highway_head_pb2 import highway_head
+from .utils import to_id, timeit, calc_file_md5_and_length
 from ..message_service.models import ImageElement, VoiceElement
+from .decoders import decode_upload_ptt_resp, decode_upload_image_resp
 
 if TYPE_CHECKING:
     from cai.client.client import Client
 
 
 def _create_highway_header(
-    cmd: bytes,
-    flag: int,
-    cmd_id: int,
-    client: "Client",
-    locale=2052
+    cmd: bytes, flag: int, cmd_id: int, client: "Client", locale=2052
 ) -> highway_head.DataHighwayHead:
     return highway_head.DataHighwayHead(
         version=1,
@@ -29,7 +26,7 @@ def _create_highway_header(
         seq=client.next_seq(),
         appid=client.apk_info.sub_app_id,
         localeId=locale,
-        dataflag=flag
+        dataflag=flag,
     )
 
 
@@ -59,18 +56,13 @@ async def _upload_controller(
         file: BinaryIO,
         cmd_id: int,
         ticket: bytes,
-        ext=None
+        ext=None,
     ) -> Optional[bytes]:
         for addr in addrs:
             try:
                 t, d = await timeit(
                     self.bdh_uploader(
-                        b"PicUp.DataUp",
-                        addr,
-                        file,
-                        cmd_id,
-                        ticket,
-                        ext
+                        b"PicUp.DataUp", addr, file, cmd_id, ticket, ext
                     )
                 )
                 self.logger.info("upload complete, use %fms" % (t * 1000))
@@ -86,10 +78,14 @@ async def _upload_controller(
     async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
         fmd5, fl = calc_file_md5_and_length(file)
         ret = decode_upload_image_resp(
-            (await self._client.send_unipkg_and_wait(
-                "ImgStore.GroupPicUp",
-                encode_d388_req(gid, self._client.uin, fmd5, fl, 1).SerializeToString()
-            )).data
+            (
+                await self._client.send_unipkg_and_wait(
+                    "ImgStore.GroupPicUp",
+                    encode_d388_req(
+                        gid, self._client.uin, fmd5, fl, 1
+                    ).SerializeToString(),
+                )
+            ).data
         )
         if ret.resultCode != 0:
             raise ConnectionError(ret.resultCode)
@@ -97,17 +93,18 @@ async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
             self.logger.debug("file not found, uploading...")
 
             await self._upload_controller(
-                ret.uploadAddr,
-                file,
-                2,  # send to group
-                ret.uploadKey
+                ret.uploadAddr, file, 2, ret.uploadKey  # send to group
             )
 
             ret = decode_upload_image_resp(
-                (await self._client.send_unipkg_and_wait(
-                    "ImgStore.GroupPicUp",
-                    encode_d388_req(gid, self._client.uin, fmd5, fl, 1).SerializeToString()
-                )).data
+                (
+                    await self._client.send_unipkg_and_wait(
+                        "ImgStore.GroupPicUp",
+                        encode_d388_req(
+                            gid, self._client.uin, fmd5, fl, 1
+                        ).SerializeToString(),
+                    )
+                ).data
             )
 
         if ret.hasMetaData:
@@ -125,12 +122,14 @@ async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
             height=h,
             md5=fmd5,
             filetype=image_type,
-            url=f"https://gchat.qpic.cn/gchatpic_new/1/0-0-{fmd5.hex().upper()}/0?term=2"
+            url=f"https://gchat.qpic.cn/gchatpic_new/1/0-0-{fmd5.hex().upper()}/0?term=2",
         )
 
     async def upload_voice(self, file: BinaryIO, gid: int) -> VoiceElement:
         fmd5, fl = calc_file_md5_and_length(file)
-        ext = encode_d388_req(gid, self._client.uin, fmd5, fl, 3).SerializeToString()
+        ext = encode_d388_req(
+            gid, self._client.uin, fmd5, fl, 3
+        ).SerializeToString()
         if not (self._session_key and self._session_sig):
             self._decode_bdh_session()
         ret = decode_upload_ptt_resp(
@@ -139,7 +138,7 @@ async def upload_voice(self, file: BinaryIO, gid: int) -> VoiceElement:
                 file,
                 29,  # send to group
                 self._session_sig,
-                ext
+                ext,
             )
         )
         if ret.resultCode:
@@ -151,7 +150,7 @@ async def upload_voice(self, file: BinaryIO, gid: int) -> VoiceElement:
             md5=fmd5,
             size=fl,
             group_file_key=ret.uploadKey,
-            url=f"https://grouptalk.c2c.qq.com/?ver=0&rkey={ret.uploadKey.hex()}&filetype=4%voice_codec=0"
+            url=f"https://grouptalk.c2c.qq.com/?ver=0&rkey={ret.uploadKey.hex()}&filetype=4%voice_codec=0",
         )
 
     async def bdh_uploader(
@@ -161,8 +160,9 @@ async def bdh_uploader(
         file: BinaryIO,
         cmd_id: int,
         ticket: bytes,
-        ext: bytes = None, *,
-        block_size=65535
+        ext: bytes = None,
+        *,
+        block_size=65535,
     ) -> Optional[bytes]:
         fmd5, fl = calc_file_md5_and_length(file)
         reader, writer = await asyncio.open_connection(*addr)
@@ -173,16 +173,18 @@ async def bdh_uploader(
                 if not bl:
                     return ext
                 head = highway_head.ReqDataHighwayHead(
-                    basehead=_create_highway_header(cmd, 4096, cmd_id, self._client),
+                    basehead=_create_highway_header(
+                        cmd, 4096, cmd_id, self._client
+                    ),
                     seghead=highway_head.SegHead(
                         filesize=fl,
                         dataoffset=bc * block_size,
                         datalength=len(bl),
                         serviceticket=ticket,
                         md5=md5(bl).digest(),
-                        fileMd5=fmd5
+                        fileMd5=fmd5,
                     ),
-                    reqExtendinfo=ext
+                    reqExtendinfo=ext,
                 )
 
                 writer.write(write_frame(head.SerializeToString(), bl))
diff --git a/cai/client/highway/models.py b/cai/client/highway/models.py
index 4a09e76e..8bd5875b 100644
--- a/cai/client/highway/models.py
+++ b/cai/client/highway/models.py
@@ -1,5 +1,5 @@
 from dataclasses import dataclass
-from typing import Optional, List, Tuple
+from typing import List, Tuple, Optional
 
 
 @dataclass
diff --git a/cai/client/highway/utils.py b/cai/client/highway/utils.py
index 9e3b6bd8..3eb68bfa 100644
--- a/cai/client/highway/utils.py
+++ b/cai/client/highway/utils.py
@@ -1,7 +1,7 @@
 import time
 import uuid
 from hashlib import md5
-from typing import BinaryIO, Tuple, Awaitable, Any
+from typing import Any, Tuple, BinaryIO, Awaitable
 
 
 def calc_file_md5_and_length(file: BinaryIO, bs=4096) -> Tuple[bytes, int]:
diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index cbbc2f25..2e52367f 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -15,7 +15,7 @@
 from cai.log import logger
 from cai.client.event import Event
 from cai.pb.msf.msg.comm import Msg
-from cai.pb.im.msg.msg_body import Elem, Ptt
+from cai.pb.im.msg.msg_body import Ptt, Elem
 from cai.pb.im.msg.service.comm_elem import (
     MsgElemInfo_servtype2,
     MsgElemInfo_servtype3,
@@ -28,14 +28,16 @@
     FaceElement,
     PokeElement,
     TextElement,
+    AtAllElement,
     GroupMessage,
     ImageElement,
     ReplyElement,
-    AtAllElement,
-    RichMsgElement,
+    ShakeElement,
+    VoiceElement,
     PrivateMessage,
+    RichMsgElement,
+    FlashImageElement,
     SmallEmojiElement,
-    FlashImageElement, ShakeElement, VoiceElement
 )
 
 
@@ -61,15 +63,17 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
             for bl in ptt.down_para.decode().split("&")[1:]:
                 k, v = bl.split("=", 1)
                 info[k] = v
-            return [VoiceElement(
-                ptt.file_name.decode(),
-                info["filetype"],
-                ptt.src_uin,
-                ptt.file_md5,
-                ptt.file_size,
-                bytes.fromhex(info["rkey"]),
-                "https://grouptalk.c2c.qq.com" + ptt.down_para.decode()
-            )]
+            return [
+                VoiceElement(
+                    ptt.file_name.decode(),
+                    info["filetype"],
+                    ptt.src_uin,
+                    ptt.file_md5,
+                    ptt.file_size,
+                    bytes.fromhex(info["rkey"]),
+                    "https://grouptalk.c2c.qq.com" + ptt.down_para.decode(),
+                )
+            ]
     res: List[Element] = []
     index = 0
     while index < len(elems):
@@ -100,8 +104,10 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
                 else:
                     res.append(
                         AtElement(
-                            int.from_bytes(elem.text.attr_6_buf[7:11], "big", signed=False),
-                            elem.text.str.decode("utf-8")
+                            int.from_bytes(
+                                elem.text.attr_6_buf[7:11], "big", signed=False
+                            ),
+                            elem.text.str.decode("utf-8"),
                         )
                     )
             else:
@@ -114,7 +120,7 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
             return [
                 RichMsgElement(
                     content,
-                    elem.rich_msg.service_id if content[0] == 60 else -1
+                    elem.rich_msg.service_id if content[0] == 60 else -1,
                 )
             ]
         elif elem.HasField("light_app"):
@@ -122,12 +128,7 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
                 content = zlib.decompress(elem.light_app.data[1:])
             else:
                 content = elem.light_app.data[1:]
-            return [
-                RichMsgElement(
-                    content,
-                    -2
-                )
-            ]
+            return [RichMsgElement(content, -2)]
         # TextElemDecoder
         elif elem.HasField("face"):
             res.append(FaceElement(elem.face.index))
@@ -182,12 +183,15 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
             if elem.not_online_image.orig_url:
                 res.append(
                     ImageElement(
-                        filename=elem.not_online_image.file_path.decode("utf-8"),
+                        filename=elem.not_online_image.file_path.decode(
+                            "utf-8"
+                        ),
                         size=elem.not_online_image.file_len,
                         width=elem.not_online_image.pic_width,
                         height=elem.not_online_image.pic_height,
                         md5=elem.not_online_image.pic_md5,
-                        url="https://c2cpicdw.qpic.cn" + elem.not_online_image.orig_url,
+                        url="https://c2cpicdw.qpic.cn"
+                        + elem.not_online_image.orig_url,
                     )
                 )
             elif (
@@ -196,7 +200,9 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
             ):
                 res.append(
                     ImageElement(
-                        filename=elem.not_online_image.file_path.decode("utf-8"),
+                        filename=elem.not_online_image.file_path.decode(
+                            "utf-8"
+                        ),
                         size=elem.not_online_image.file_len,
                         width=elem.not_online_image.pic_width,
                         height=elem.not_online_image.pic_height,
@@ -223,12 +229,14 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
                         else poke.vaspoke_id,
                         poke.vaspoke_name.decode("utf-8"),
                         poke.poke_strength,
-                        poke.double_hit
+                        poke.double_hit,
                     )
                 ]
                 break
             elif service_type == 3:
-                flash = MsgElemInfo_servtype3.FromString(elem.common_elem.pb_elem)
+                flash = MsgElemInfo_servtype3.FromString(
+                    elem.common_elem.pb_elem
+                )
                 if flash.flash_troop_pic:
                     res.append(
                         FlashImageElement(
@@ -239,7 +247,7 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
                             md5=flash.flash_troop_pic.md5,
                             width=flash.flash_troop_pic.width,
                             height=flash.flash_troop_pic.height,
-                            url=f"https://gchat.qpic.cn/gchatpic_new/0/0-0-{flash.flash_troop_pic.md5.hex().upper()}/0"
+                            url=f"https://gchat.qpic.cn/gchatpic_new/0/0-0-{flash.flash_troop_pic.md5.hex().upper()}/0",
                         )
                     )
                 break
@@ -250,7 +258,11 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
                 )
                 res.append(FaceElement(info.index))
         elif elem.HasField("shake_window"):
-            res.append(ShakeElement(stype=elem.shake_window.type, uin=elem.shake_window.uin))
+            res.append(
+                ShakeElement(
+                    stype=elem.shake_window.type, uin=elem.shake_window.uin
+                )
+            )
         index += 1
     return res
 
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index 22f40f97..9c58b97f 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -1,22 +1,36 @@
-import random
 import zlib
+import random
+from typing import Union, Sequence
 
-from typing import Sequence, Union
-from cai.pb.im.msg.msg_body import MsgBody, PlainText, RichText, CustomFace, Elem, CommonElem, LightAppElem, RichMsg, \
-    ShakeWindow, Ptt
-from cai.pb.msf.msg.svc.svc_pb2 import RoutingHead, Grp
+from cai.pb.msf.msg.svc import PbSendMsgReq
 from cai.pb.msf.msg.comm.comm_pb2 import ContentHead
+from cai.pb.msf.msg.svc.svc_pb2 import Grp, RoutingHead
+from cai.pb.im.msg.service.comm_elem import (
+    MsgElemInfo_servtype2,
+    MsgElemInfo_servtype3,
+)
+from cai.pb.im.msg.msg_body import (
+    Ptt,
+    Elem,
+    MsgBody,
+    RichMsg,
+    RichText,
+    PlainText,
+    CommonElem,
+    CustomFace,
+    ShakeWindow,
+    LightAppElem,
+)
 
 from . import models
-from cai.pb.msf.msg.svc import PbSendMsgReq
-from cai.pb.im.msg.service.comm_elem import MsgElemInfo_servtype3, MsgElemInfo_servtype2
-
 
 # todo: https://github.com/mamoe/mirai/blob/7d3971259de59cede94b7a55650c8a6ad4346a59/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbSendMsg.kt#L103
 # https://github.com/mamoe/mirai/blob/74fc5a50376ed0330b984af51e0fabc2147afdbb/mirai-core/src/commonMain/kotlin/contact/SendMessageHandler.kt
 
 
-def _build_image_elem(e: Union[models.ImageElement, models.FlashImageElement]) -> CustomFace:
+def _build_image_elem(
+    e: Union[models.ImageElement, models.FlashImageElement]
+) -> CustomFace:
     return CustomFace(
         file_type=66,
         useful=1,
@@ -32,7 +46,7 @@ def _build_image_elem(e: Union[models.ImageElement, models.FlashImageElement]) -
         md5=e.md5,
         show_len=0,
         download_len=0
-        #flag=b"\x00\x00\x00\x00"
+        # flag=b"\x00\x00\x00\x00"
     )
 
 
@@ -41,15 +55,15 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
     ptt = None
     for e in elements:  # todo: support more element
         if isinstance(e, models.TextElement):
-            ret.append(
-                Elem(text=PlainText(str=e.content.encode()))
-            )
+            ret.append(Elem(text=PlainText(str=e.content.encode())))
         elif isinstance(e, models.FlashImageElement):
             ret.append(
                 Elem(
                     common_elem=CommonElem(
                         service_type=3,
-                        pb_elem=MsgElemInfo_servtype3(flash_troop_pic=_build_image_elem(e)).SerializeToString()
+                        pb_elem=MsgElemInfo_servtype3(
+                            flash_troop_pic=_build_image_elem(e)
+                        ).SerializeToString(),
                     )
                 )
             )
@@ -57,17 +71,15 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
                 Elem(text=PlainText(str="[闪照]请使用新版手机QQ查看".encode()))
             )
         elif isinstance(e, models.ImageElement):
-            ret.append(
-                Elem(
-                    custom_face=_build_image_elem(e)
-                )
-            )
+            ret.append(Elem(custom_face=_build_image_elem(e)))
         elif isinstance(e, models.AtElement):
             ret.append(
                 Elem(
                     text=PlainText(
                         str=e.display.encode(),
-                        attr_6_buf=b"\x00\x01\x00\x00\x00\x03\x00"+e.target.to_bytes(4, "big", signed=False)+b"\x00\x00"
+                        attr_6_buf=b"\x00\x01\x00\x00\x00\x03\x00"
+                        + e.target.to_bytes(4, "big", signed=False)
+                        + b"\x00\x00",
                     )
                 )
             )
@@ -76,7 +88,7 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
                 Elem(
                     text=PlainText(
                         str="@全体成员".encode(),
-                        attr_6_buf=b"\x00\x01\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00"
+                        attr_6_buf=b"\x00\x01\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00",
                     )
                 )
             )
@@ -86,21 +98,17 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
             else:
                 content = b"\x00" + e.content
             if e.service_id == -2:  # LightApp
-                ret_elem = Elem(light_app=LightAppElem(
-                    data=content
-                ))
+                ret_elem = Elem(light_app=LightAppElem(data=content))
             else:  # Json & Xml
-                ret_elem = Elem(rich_msg=RichMsg(
-                    template_1=content,
-                    service_id=0 if e.service_id < 0 else e.service_id
-                ))
+                ret_elem = Elem(
+                    rich_msg=RichMsg(
+                        template_1=content,
+                        service_id=0 if e.service_id < 0 else e.service_id,
+                    )
+                )
             ret.append(ret_elem)
         elif isinstance(e, models.ShakeElement):
-            ret.append(
-                Elem(
-                    shake_window=ShakeWindow(type=e.stype, uin=e.uin)
-                )
-            )
+            ret.append(Elem(shake_window=ShakeWindow(type=e.stype, uin=e.uin)))
             ret.append(  # fallback info
                 Elem(text=PlainText(str="[窗口抖动]请使用新版手机QQ查看".encode()))
             )
@@ -115,8 +123,8 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
                             poke_type=e.id,
                             poke_strength=e.strength,
                             double_hit=e.double_hit,
-                            poke_flag=0
-                        ).SerializeToString()
+                            poke_flag=0,
+                        ).SerializeToString(),
                     )
                 )
             )
@@ -126,12 +134,7 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
         else:
             raise NotImplementedError(e)
 
-    return MsgBody(
-        rich_text=RichText(
-            elems=ret,
-            ptt=ptt
-        )
-    )
+    return MsgBody(rich_text=RichText(elems=ret, ptt=ptt))
 
 
 def encode_send_group_msg_req(
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index d45d562f..df9ee92d 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -14,8 +14,8 @@
 from typing import List, Optional
 
 from cai.client.event import Event
-from cai.pb.im.msg.msg_body import Ptt
 from cai.pb.msf.msg.comm import Msg
+from cai.pb.im.msg.msg_body import Ptt
 
 
 @dataclass
@@ -131,7 +131,7 @@ def to_flash(self) -> "FlashImageElement":
             height=self.height,
             md5=self.md5,
             id=self.id,
-            url=self.url
+            url=self.url,
         )
 
 
@@ -168,7 +168,7 @@ def to_ptt(self) -> Ptt:
             file_name=self.file_name.encode(),
             file_size=self.size,
             pb_reserve=self._pb_reserve,
-            valid=True
+            valid=True,
         )
 
 
@@ -205,6 +205,7 @@ class RichMsgElement(Element):
       default:
         xml
     """
+
     content: bytes
     service_id: Optional[int] = -2
 
diff --git a/cai/client/multi_msg/long_msg.py b/cai/client/multi_msg/long_msg.py
index 345b4186..0f635148 100644
--- a/cai/client/multi_msg/long_msg.py
+++ b/cai/client/multi_msg/long_msg.py
@@ -1,29 +1,35 @@
-from cai.client import Command
-from cai.pb.highway.multi_msg.multi_msg_pb2 import MultiReqBody, MultiMsgApplyUpReq, MultiMsgApplyUpRsp, MultiRspBody
-from cai.pb.highway.long_msg.long_msg_pb2 import LongReqBody, LongMsgUpReq
+from dataclasses import dataclass
 from typing import TYPE_CHECKING, Tuple
 
-from dataclasses import dataclass
+from cai.client import Command
+from cai.pb.highway.long_msg.long_msg_pb2 import LongReqBody, LongMsgUpReq
+from cai.pb.highway.multi_msg.multi_msg_pb2 import (
+    MultiReqBody,
+    MultiRspBody,
+    MultiMsgApplyUpReq,
+    MultiMsgApplyUpRsp,
+)
 
 if TYPE_CHECKING:
-    from cai.client.packet import IncomingPacket
     from cai.client.client import Client
+    from cai.client.packet import IncomingPacket
 
 
-def _encode_multi_req_body(group_id: int, data_len: int, data_md5: bytes, bu_type: int) -> MultiReqBody:
+def _encode_multi_req_body(
+    group_id: int, data_len: int, data_md5: bytes, bu_type: int
+) -> MultiReqBody:
     return MultiReqBody(
         subcmd=1,
         termType=5,
         platformType=9,
         netType=3,
         buildVer="8.2.0.1297",  # modify
-        multimsgApplyupReq=[MultiMsgApplyUpReq(
-            dstUin=group_id,
-            msgSize=data_len,
-            msgMd5=data_md5,
-            msgType=3
-        )],
-        buType=bu_type
+        multimsgApplyupReq=[
+            MultiMsgApplyUpReq(
+                dstUin=group_id, msgSize=data_len, msgMd5=data_md5, msgType=3
+            )
+        ],
+        buType=bu_type,
     )
 
 
@@ -32,31 +38,38 @@ class MultiApplyResp(Command):
     data: MultiMsgApplyUpRsp
 
 
-async def build_multi_apply_up_pkg(client: "Client", group_id: int, data_len: int, data_md5: bytes, bu_type: int) -> Tuple[LongReqBody, MultiMsgApplyUpRsp]:
+async def build_multi_apply_up_pkg(
+    client: "Client",
+    group_id: int,
+    data_len: int,
+    data_md5: bytes,
+    bu_type: int,
+) -> Tuple[LongReqBody, MultiMsgApplyUpRsp]:
     body: MultiApplyResp = await client.send_unipkg_and_wait(
         "MultiMsg.ApplyUp",
         _encode_multi_req_body(
             group_id, data_len, data_md5, bu_type
-        ).SerializeToString()
+        ).SerializeToString(),
     )
     LongReqBody(
         subcmd=1,
         termType=5,
         platformType=9,
-        msgUpReq=[LongMsgUpReq(
-            msgType=3,
-            dstUin=client.uin,
-            msgContent=bytes(),  # todo:
-            storeType=2,
-            msgUkey=body.data.msgUkey
-        )]
+        msgUpReq=[
+            LongMsgUpReq(
+                msgType=3,
+                dstUin=client.uin,
+                msgContent=bytes(),  # todo:
+                storeType=2,
+                msgUkey=body.data.msgUkey,
+            )
+        ],
     )
 
 
-
-
-
-async def _handle_multi_resp_body(client: "Client", pkg: "IncomingPacket", _device) -> MultiApplyResp:
+async def _handle_multi_resp_body(
+    client: "Client", pkg: "IncomingPacket", _device
+) -> MultiApplyResp:
     mrb = MultiRspBody.FromString(pkg.data).multimsgApplyupRsp
     if not mrb:
         raise ConnectionError("no MultiMsgApplyUpRsp Found")
@@ -65,5 +78,5 @@ async def _handle_multi_resp_body(client: "Client", pkg: "IncomingPacket", _devi
         seq=pkg.seq,
         ret_code=pkg.ret_code,
         command_name=pkg.command_name,
-        data=mrb[0]
+        data=mrb[0],
     )
diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index b0bf150f..86cc96a0 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -9,20 +9,20 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 
-from typing import TYPE_CHECKING, List, Optional, Tuple
+from typing import TYPE_CHECKING, List, Tuple, Optional
 
 from jce import types
 
 from cai.log import logger
 from cai.utils.binary import Packet
-from cai.settings.device import DeviceInfo as _DeviceInfo_t
 from cai.utils.jce import RequestPacketVersion3
 from cai.client.message_service import MESSAGE_DECODERS
 from cai.client.packet import UniPacket, IncomingPacket
+from cai.settings.device import DeviceInfo as _DeviceInfo_t
 
-from .jce import DelMsgInfo, SvcRespPushMsg, DeviceInfo
-from .command import PushMsg, PushMsgError, PushMsgCommand
 from ...settings.protocol import ApkInfo
+from .jce import DelMsgInfo, DeviceInfo, SvcRespPushMsg
+from .command import PushMsg, PushMsgError, PushMsgCommand
 
 if TYPE_CHECKING:
     from cai.client import Client
@@ -136,7 +136,9 @@ async def handle_c2c_sync(
 
 
 async def handle_push_msg(
-    client: "Client", packet: IncomingPacket, device: Tuple[_DeviceInfo_t, ApkInfo]
+    client: "Client",
+    packet: IncomingPacket,
+    device: Tuple[_DeviceInfo_t, ApkInfo],
 ) -> PushMsgCommand:
     """Handle Push Message Command.
 
diff --git a/cai/client/sso_server/__init__.py b/cai/client/sso_server/__init__.py
index 1f891baa..b2b102e5 100644
--- a/cai/client/sso_server/__init__.py
+++ b/cai/client/sso_server/__init__.py
@@ -151,7 +151,7 @@ async def quality_test(
 async def get_sso_server(
     cache: bool = True,
     cache_server_list: bool = True,
-    exclude: Optional[Container[str]] = None
+    exclude: Optional[Container[str]] = None,
 ) -> SsoServer:
     """Get the best sso server
 
diff --git a/cai/client/status_service/__init__.py b/cai/client/status_service/__init__.py
index 146956f2..40889b9b 100644
--- a/cai/client/status_service/__init__.py
+++ b/cai/client/status_service/__init__.py
@@ -11,14 +11,14 @@
 
 import time
 from enum import Enum, IntEnum
-from typing import TYPE_CHECKING, Union, Optional, Tuple
+from typing import TYPE_CHECKING, Tuple, Union, Optional
 
 from jce import types
 
 from cai.log import logger
 from cai.utils.binary import Packet
-from cai.settings.device import DeviceInfo
 from cai.settings.protocol import ApkInfo
+from cai.settings.device import DeviceInfo
 from cai.utils.jce import RequestPacketVersion3
 from cai.pb.im.oidb.cmd0x769 import ReqBody, ConfigSeq
 from cai.client.packet import (
@@ -187,7 +187,7 @@ def encode_register(
     status: Union[int, OnlineStatus],
     reg_push_reason: Union[str, RegPushReason],
     sub_app_id: int,
-    device: DeviceInfo
+    device: DeviceInfo,
 ) -> Packet:
     """Build status service register packet.
 
@@ -324,7 +324,7 @@ def encode_force_offline_response(
     req_uin: int,
     seq_no: int,
     sub_app_id: int,
-    device: DeviceInfo
+    device: DeviceInfo,
 ) -> Packet:
     """Build status service msf offline response packet.
 
@@ -405,7 +405,7 @@ async def handle_request_offline(
             request.request.uin,
             request.request.seq_no,
             device[1].sub_app_id,
-            device[0]
+            device[0],
         )
         await client.send(seq, "StatSvc.RspMSFForceOffline", resp_packet)
     client._status = OnlineStatus.Offline
diff --git a/cai/client/wtlogin/__init__.py b/cai/client/wtlogin/__init__.py
index e0975368..e7d87742 100644
--- a/cai/client/wtlogin/__init__.py
+++ b/cai/client/wtlogin/__init__.py
@@ -8,26 +8,28 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-import ipaddress
-import secrets
+import time
 import string
 import struct
-import time
+import secrets
+import ipaddress
 from hashlib import md5
 from typing import TYPE_CHECKING, Tuple
 
 from rtea import qqtea_decrypt
 
+from cai.utils.binary import Packet
+from cai.settings.protocol import ApkInfo
+from cai.settings.device import DeviceInfo
+from cai.utils.crypto import ECDH, EncryptSession
 from cai.client.packet import (
     UniPacket,
     CSsoBodyPacket,
     CSsoDataPacket,
     IncomingPacket,
 )
-from cai.settings.device import DeviceInfo
-from cai.settings.protocol import ApkInfo
-from cai.utils.binary import Packet
-from cai.utils.crypto import ECDH, EncryptSession
+
+from .tlv import TlvEncoder
 from .oicq import (
     NeedCaptcha,
     OICQRequest,
@@ -39,7 +41,6 @@
     TooManySMSRequest,
     UnknownLoginStatus,
 )
-from .tlv import TlvEncoder
 
 if TYPE_CHECKING:
     from cai.client import Client
@@ -56,7 +57,7 @@ def encode_login_request2_captcha(
     sign: bytes,
     t104: bytes,
     imei: str,
-    apk_info: ApkInfo
+    apk_info: ApkInfo,
 ) -> Packet:
     """Build submit captcha request packet.
 
@@ -130,7 +131,7 @@ def encode_login_request2_slider(
     ticket: str,
     t104: bytes,
     imei: str,
-    apk_info: ApkInfo
+    apk_info: ApkInfo,
 ) -> Packet:
     """Build slider ticket request packet.
 
@@ -205,7 +206,7 @@ def encode_login_request7(
     t174: bytes,
     g: bytes,
     imei: str,
-    apk_info: ApkInfo
+    apk_info: ApkInfo,
 ) -> Packet:
     """Build sms submit packet.
 
@@ -288,7 +289,7 @@ def encode_login_request8(
     t104: bytes,
     t174: bytes,
     imei: str,
-    apk_info: ApkInfo
+    apk_info: ApkInfo,
 ) -> Packet:
     """Build sms request packet.
 
@@ -368,7 +369,7 @@ def encode_login_request9(
     uin: int,
     password_md5: bytes,
     device: DeviceInfo,
-    apk_info: ApkInfo
+    apk_info: ApkInfo,
 ) -> Packet:
     """Build main login request packet.
 
@@ -538,7 +539,7 @@ def encode_login_request20(
     t104: bytes,
     g: bytes,
     imei: str,
-    apk_info: ApkInfo
+    apk_info: ApkInfo,
 ) -> Packet:
     """Build device lock login request packet.
 
@@ -620,7 +621,7 @@ def encode_exchange_emp_15(
     wt_session_ticket: bytes,
     wt_session_ticket_key: bytes,
     device: DeviceInfo,
-    apk_info: ApkInfo
+    apk_info: ApkInfo,
 ) -> Packet:
     """Build exchange emp request packet.
 
@@ -777,7 +778,7 @@ async def handle_oicq_response(
         packet.ret_code,
         packet.command_name,
         packet.data,
-        device.tgtgt
+        device.tgtgt,
     )
     if not isinstance(response, UnknownLoginStatus):
         return response
diff --git a/cai/client/wtlogin/oicq.py b/cai/client/wtlogin/oicq.py
index 6b7afda0..bbf41eb3 100644
--- a/cai/client/wtlogin/oicq.py
+++ b/cai/client/wtlogin/oicq.py
@@ -58,7 +58,13 @@ def build_encoded(
 class OICQResponse(Command):
     @classmethod
     def decode_response(
-        cls, uin: int, seq: int, ret_code: int, command_name: str, data: bytes, tgtgt: bytes
+        cls,
+        uin: int,
+        seq: int,
+        ret_code: int,
+        command_name: str,
+        data: bytes,
+        tgtgt: bytes,
     ) -> "OICQResponse":
         """Decode login response and wrap main info of the response.
 
diff --git a/cai/client/wtlogin/tlv.py b/cai/client/wtlogin/tlv.py
index 03f9b437..4cbab73e 100644
--- a/cai/client/wtlogin/tlv.py
+++ b/cai/client/wtlogin/tlv.py
@@ -607,7 +607,7 @@ def decode(
         data: Union[bytes, bytearray],
         tgtgt: bytes = None,
         offset: int = 0,
-        tag_size: int = 2
+        tag_size: int = 2,
     ) -> Dict[int, Any]:
         if not isinstance(data, Packet):
             data = Packet(data)
diff --git a/cai/connection/__init__.py b/cai/connection/__init__.py
index dcc8b7b3..51fd42ab 100644
--- a/cai/connection/__init__.py
+++ b/cai/connection/__init__.py
@@ -59,7 +59,7 @@ def reader(self) -> asyncio.StreamReader:
 
     @property
     def closed(self) -> bool:
-        #return self._writer is None
+        # return self._writer is None
         return self._closed.is_set()
 
     @property
diff --git a/cai/settings/protocol.py b/cai/settings/protocol.py
index 035652fd..b7eaf766 100644
--- a/cai/settings/protocol.py
+++ b/cai/settings/protocol.py
@@ -165,7 +165,12 @@ class ApkInfo(NamedTuple):
 
 
 def get_apk_info(_type: str = "IPAD") -> ApkInfo:
-    info = {"IPAD": IPAD, "ANDROID_PHONE": ANDROID_PHONE, "ANDROID_WATCH": ANDROID_WATCH, "MACOS": MACOS}
+    info = {
+        "IPAD": IPAD,
+        "ANDROID_PHONE": ANDROID_PHONE,
+        "ANDROID_WATCH": ANDROID_WATCH,
+        "MACOS": MACOS,
+    }
     if _type not in info:
         raise ValueError(f"Invalid Protocol Type: {_type}")
     return info[_type]
diff --git a/cai/utils/coroutine.py b/cai/utils/coroutine.py
index cd602e31..3991be5a 100644
--- a/cai/utils/coroutine.py
+++ b/cai/utils/coroutine.py
@@ -42,7 +42,7 @@ def close(self):
         return self._coro.close()
 
     def __next__(self):
-        return self.send(None)
+        raise StopIteration
 
     def __iter__(self):
         return self._coro.__await__()
diff --git a/examples/login.py b/examples/login.py
index de030378..fd869e3a 100644
--- a/examples/login.py
+++ b/examples/login.py
@@ -6,21 +6,21 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-import functools
-import logging
 import os
-import asyncio
 import sys
+import asyncio
+import logging
+import functools
 import traceback
 from io import BytesIO
 
 from PIL import Image
 
 from cai.api import Client, make_client
-from cai.client import OnlineStatus, PrivateMessage, GroupMessage, Event
-from cai.client.message_service.models import TextElement
 from cai.settings.device import get_device
 from cai.settings.protocol import get_apk_info
+from cai.client.message_service.models import TextElement
+from cai.client import Event, GroupMessage, OnlineStatus, PrivateMessage
 from cai.exceptions import (
     LoginException,
     ApiResponseError,
@@ -38,7 +38,9 @@ async def run(closed: asyncio.Event):
         assert password and account, ValueError("account or password not set")
 
         account = int(account)
-        ci = Client(make_client(account, password, get_apk_info(), device=get_device()))
+        ci = Client(
+            make_client(account, password, get_apk_info(), device=get_device())
+        )
 
         try:
             await ci.login()
@@ -51,7 +53,7 @@ async def run(closed: asyncio.Event):
                 if status == OnlineStatus.Offline:
                     continue
                 print(status, "Changed")
-                #await ci.set_status(status, 67, True)
+                # await ci.set_status(status, 67, True)
                 await asyncio.sleep(360)
     finally:
         closed.set()
@@ -61,29 +63,39 @@ async def listen_message(client: Client, _, event: Event):
     if isinstance(event, PrivateMessage):
         print(f"{event.from_nick}(f{event.from_uin}) -> {event.message}")
     elif isinstance(event, GroupMessage):
-        print(f"{event.group_name}({event.group_id}:{event.from_uin}) -> {event.message}")
+        print(
+            f"{event.group_name}({event.group_id}:{event.from_uin}) -> {event.message}"
+        )
         if event.message and hasattr(event.message[0], "content"):
             if event.message[0].content == "0x114514":
                 await client.send_group_msg(
-                    event.group_id, [
+                    event.group_id,
+                    [
                         TextElement("Hello\n"),
                         TextElement("Multiple element "),
-                        TextElement("Supported.")
-                    ]
+                        TextElement("Supported."),
+                    ],
                 )
             elif event.message[0].content == "1919":
                 await client.send_group_msg(
                     event.group_id,
                     [
-                        await client.upload_image(event.group_id, open("test.png", "rb")),
-                        TextElement("1234")
-                    ]
+                        await client.upload_image(
+                            event.group_id, open("test.png", "rb")
+                        ),
+                        TextElement("1234"),
+                    ],
                 )
 
 
 async def handle_failure(client: Client, exception: Exception):
     if isinstance(exception, LoginSliderNeeded):
-        print("Verify url:", exception.verify_url.replace("ssl.captcha.qq.com", "txhelper.glitch.me"))
+        print(
+            "Verify url:",
+            exception.verify_url.replace(
+                "ssl.captcha.qq.com", "txhelper.glitch.me"
+            ),
+        )
         ticket = input("Please enter the ticket: ").strip()
         try:
             await client.submit_slider_ticket(ticket)
@@ -158,7 +170,7 @@ async def handle_failure(client: Client, exception: Exception):
     logging.basicConfig(
         level=logging.DEBUG,
         handlers=[logging.StreamHandler(sys.stdout)],
-        format="%(asctime)s %(name)s[%(levelname)s]: %(message)s"
+        format="%(asctime)s %(name)s[%(levelname)s]: %(message)s",
     )
 
     close = asyncio.Event()

From c61a84a82340c10238d19723f7fdaa990e87a273 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Thu, 7 Apr 2022 15:14:47 +0800
Subject: [PATCH 056/113] delete: unused file

---
 cai/api/flow.py | 61 -------------------------------------------------
 1 file changed, 61 deletions(-)
 delete mode 100644 cai/api/flow.py

diff --git a/cai/api/flow.py b/cai/api/flow.py
deleted file mode 100644
index f9f6f0cb..00000000
--- a/cai/api/flow.py
+++ /dev/null
@@ -1,61 +0,0 @@
-"""Application Flow APIs.
-
-:Copyright: Copyright (C) 2021-2021  cscs181
-:License: AGPL-3.0 or later. See `LICENSE`_ for detail.
-
-.. _LICENSE:
-    https://github.com/cscs181/CAI/blob/master/LICENSE
-"""
-
-from typing import Callable, Optional, Awaitable
-
-from cai.log import logger
-from cai.client import HANDLERS, Event, Client, Command, IncomingPacket
-
-from .client import get_client
-
-
-def add_event_listener(
-    listener: Callable[[Client, Event], Awaitable[None]],
-    uin: Optional[int] = None,
-):
-    """Add event listener.
-
-    If uin is ``None``, listener will receive events from all clients.
-
-    Args:
-        listener (Callable[[Client, Event], Awaitable[None]]): Event listener.
-        uin (Optional[int], optional): Account of the client want to listen.
-            Defaults to None.
-    """
-    if uin:
-        client = get_client(uin)
-        client.add_event_listener(listener)
-    else:
-        Client.LISTENERS.add(listener)
-
-
-def register_packet_handler(
-    cmd: str,
-    packet_handler: Callable[[Client, IncomingPacket], Awaitable[Command]],
-) -> None:
-    """Register custom packet handler.
-
-    Note:
-        This function is a low-level api to mock default behavior.
-        Be aware of what you are doing!
-
-    Args:
-        cmd (str): Command name of the packet.
-        packet_handler (Callable[[Client, IncomingPacket], Awaitable[Command]]):
-            Asynchronous packet handler. A :obj:`~cai.client.command.Command`
-            object should be returned.
-    """
-    if cmd in HANDLERS:
-        logger.warning(
-            f"You are overwriting an existing handler for command {cmd}!"
-        )
-    HANDLERS[cmd] = packet_handler
-
-
-__all__ = ["add_event_listener", "register_packet_handler"]

From 23f8692921a351aa111ed3af6b1e7e2e5de85630 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Thu, 7 Apr 2022 15:16:07 +0800
Subject: [PATCH 057/113] Revert "delete: unused file"

This reverts commit c61a84a82340c10238d19723f7fdaa990e87a273.
---
 cai/api/flow.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)
 create mode 100644 cai/api/flow.py

diff --git a/cai/api/flow.py b/cai/api/flow.py
new file mode 100644
index 00000000..f9f6f0cb
--- /dev/null
+++ b/cai/api/flow.py
@@ -0,0 +1,61 @@
+"""Application Flow APIs.
+
+:Copyright: Copyright (C) 2021-2021  cscs181
+:License: AGPL-3.0 or later. See `LICENSE`_ for detail.
+
+.. _LICENSE:
+    https://github.com/cscs181/CAI/blob/master/LICENSE
+"""
+
+from typing import Callable, Optional, Awaitable
+
+from cai.log import logger
+from cai.client import HANDLERS, Event, Client, Command, IncomingPacket
+
+from .client import get_client
+
+
+def add_event_listener(
+    listener: Callable[[Client, Event], Awaitable[None]],
+    uin: Optional[int] = None,
+):
+    """Add event listener.
+
+    If uin is ``None``, listener will receive events from all clients.
+
+    Args:
+        listener (Callable[[Client, Event], Awaitable[None]]): Event listener.
+        uin (Optional[int], optional): Account of the client want to listen.
+            Defaults to None.
+    """
+    if uin:
+        client = get_client(uin)
+        client.add_event_listener(listener)
+    else:
+        Client.LISTENERS.add(listener)
+
+
+def register_packet_handler(
+    cmd: str,
+    packet_handler: Callable[[Client, IncomingPacket], Awaitable[Command]],
+) -> None:
+    """Register custom packet handler.
+
+    Note:
+        This function is a low-level api to mock default behavior.
+        Be aware of what you are doing!
+
+    Args:
+        cmd (str): Command name of the packet.
+        packet_handler (Callable[[Client, IncomingPacket], Awaitable[Command]]):
+            Asynchronous packet handler. A :obj:`~cai.client.command.Command`
+            object should be returned.
+    """
+    if cmd in HANDLERS:
+        logger.warning(
+            f"You are overwriting an existing handler for command {cmd}!"
+        )
+    HANDLERS[cmd] = packet_handler
+
+
+__all__ = ["add_event_listener", "register_packet_handler"]

From 205a572839f3e93f8d7b8cb811709be2b790d29c Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Thu, 7 Apr 2022 15:22:01 +0800
Subject: [PATCH 058/113] fix: event register

---
 cai/api/client.py |  3 +-
 cai/api/flow.py   | 86 +++++++++++++++++++++--------------------------
 2 files changed, 40 insertions(+), 49 deletions(-)

diff --git a/cai/api/client.py b/cai/api/client.py
index e03e6570..6f280059 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -24,6 +24,7 @@
     VoiceElement,
 )
 
+from .flow import Events as _Events
 from .group import Group as _Group
 from .login import Login as _Login
 from .friend import Friend as _Friend
@@ -51,7 +52,7 @@ def make_client(
     return client_t(uin, passwd, device, apk_info)
 
 
-class Client(_Login, _Friend, _Group):
+class Client(_Login, _Friend, _Group, _Events):
     def __init__(self, client: client_t):
         self.client = client
         self._highway_session = HighWaySession(client, logger=log.highway)
diff --git a/cai/api/flow.py b/cai/api/flow.py
index f9f6f0cb..6c2faba1 100644
--- a/cai/api/flow.py
+++ b/cai/api/flow.py
@@ -7,55 +7,45 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 
-from typing import Callable, Optional, Awaitable
+from typing import Callable, Awaitable
 
 from cai.log import logger
 from cai.client import HANDLERS, Event, Client, Command, IncomingPacket
 
-from .client import get_client
-
-
-def add_event_listener(
-    listener: Callable[[Client, Event], Awaitable[None]],
-    uin: Optional[int] = None,
-):
-    """Add event listener.
-
-    If uin is ``None``, listener will receive events from all clients.
-
-    Args:
-        listener (Callable[[Client, Event], Awaitable[None]]): Event listener.
-        uin (Optional[int], optional): Account of the client want to listen.
-            Defaults to None.
-    """
-    if uin:
-        client = get_client(uin)
-        client.add_event_listener(listener)
-    else:
-        Client.LISTENERS.add(listener)
-
-
-def register_packet_handler(
-    cmd: str,
-    packet_handler: Callable[[Client, IncomingPacket], Awaitable[Command]],
-) -> None:
-    """Register custom packet handler.
-
-    Note:
-        This function is a low-level api to mock default behavior.
-        Be aware of what you are doing!
-
-    Args:
-        cmd (str): Command name of the packet.
-        packet_handler (Callable[[Client, IncomingPacket], Awaitable[Command]]):
-            Asynchronous packet handler. A :obj:`~cai.client.command.Command`
-            object should be returned.
-    """
-    if cmd in HANDLERS:
-        logger.warning(
-            f"You are overwriting an existing handler for command {cmd}!"
-        )
-    HANDLERS[cmd] = packet_handler
-
-
-__all__ = ["add_event_listener", "register_packet_handler"]
+from .base import BaseAPI
+
+
+class Events(BaseAPI):
+    def add_event_listener(
+        self,
+        listener: Callable[[Client, Event], Awaitable[None]]
+    ):
+        """Add event listener.
+
+        Args:
+            listener (Callable[[Client, Event], Awaitable[None]]): Event listener.
+        """
+        self.client.add_event_listener(listener)
+
+    def register_packet_handler(
+        self,
+        cmd: str,
+        packet_handler: Callable[[Client, IncomingPacket], Awaitable[Command]],
+    ) -> None:
+        """Register custom packet handler.
+
+        Note:
+            This function is a low-level api to mock default behavior.
+            Be aware of what you are doing!
+
+        Args:
+            cmd (str): Command name of the packet.
+            packet_handler (Callable[[Client, IncomingPacket], Awaitable[Command]]):
+                Asynchronous packet handler. A :obj:`~cai.client.command.Command`
+                object should be returned.
+        """
+        if cmd in HANDLERS:
+            logger.warning(
+                f"You are overwriting an existing handler for command {cmd}!"
+            )
+        HANDLERS[cmd] = packet_handler

From 7e225de8a76d01809bda3362c63e71bed8f3172e Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Thu, 7 Apr 2022 15:44:23 +0800
Subject: [PATCH 059/113] fix: unsync changes

---
 cai/client/client.py | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 5ad34d5e..150b8ac2 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -389,7 +389,7 @@ async def close(self) -> None:
         self._receive_store.cancel_all()
         # disconnect server
         await self.disconnect()
-        self.closed.set()
+        self._closed.set()
 
     @property
     def seq(self) -> int:
@@ -469,7 +469,7 @@ async def _handle_incoming_packet(self, in_packet: IncomingPacket) -> None:
         try:
             handler = HANDLERS.get(in_packet.command_name, _packet_to_command)
             packet = await handler(
-                self, in_packet, (self.device_info, self.apk_info)
+                self, in_packet, (self.device, self.apk_info)
             )
             self._receive_store.store_result(packet.seq, packet)
         except Exception as e:
@@ -596,7 +596,7 @@ async def _handle_login_response(
                     self.uin,
                     self._t104,
                     self._siginfo.g,
-                    self.device_info.imei,
+                    self.device.imei,
                     self.apk_info,
                 )
                 response = await self.send_and_wait(
@@ -668,7 +668,7 @@ async def login(self) -> LoginSuccess:
             self._ksid,
             self.uin,
             self._password_md5,
-            self.device_info,
+            self.device,
             self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
@@ -704,7 +704,7 @@ async def submit_captcha(
             captcha,
             captcha_sign,
             self._t104,
-            self.device_info.imei,
+            self.device.imei,
             self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
@@ -737,7 +737,7 @@ async def submit_slider_ticket(self, ticket: str) -> LoginSuccess:
             self.uin,
             ticket,
             self._t104,
-            self.device_info.imei,
+            self.device.imei,
             self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
@@ -770,7 +770,7 @@ async def request_sms(self) -> bool:
             self.uin,
             self._t104,
             self._t174,
-            self.device_info.imei,
+            self.device.imei,
             self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
@@ -812,7 +812,7 @@ async def submit_sms(self, sms_code: str) -> LoginSuccess:
             self._t104,
             self._t174,
             self._siginfo.g,
-            self.device_info.imei,
+            self.device.imei,
             self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.login", packet)
@@ -852,7 +852,7 @@ async def _handle_refresh_response(
                     self.uin,
                     self._t104,
                     self._siginfo.g,
-                    self.device_info.imei,
+                    self.device.imei,
                     self.apk_info,
                 )
                 response = await self.send_and_wait(
@@ -900,7 +900,7 @@ async def refresh_siginfo(self) -> LoginSuccess:
             self._siginfo.rand_seed,
             self._siginfo.wt_session_ticket,
             self._siginfo.wt_session_ticket_key,
-            self.device_info,
+            self.device,
             self.apk_info,
         )
         response = await self.send_and_wait(seq, "wtlogin.exchange_emp", packet)
@@ -941,7 +941,7 @@ async def register(
             status,
             register_reason,
             self.apk_info.sub_app_id,
-            self.device_info,
+            self.device,
         )
         response = await self.send_and_wait(seq, "StatSvc.register", packet)
 
@@ -991,7 +991,7 @@ async def set_status(
             self._session_id,
             self.uin,
             self._siginfo.d2key,
-            self.device_info,
+            self.device,
             status,
             battery_status,
             is_power_connected,
@@ -1037,7 +1037,7 @@ async def heartbeat(self) -> None:
             packet = encode_heartbeat(
                 seq,
                 self._session_id,
-                self.device_info.imei,
+                self.device.imei,
                 self._ksid,
                 self.uin,
                 self.apk_info.sub_app_id,

From fdef3f9d9e4794500e5573afeb6c1849765dd1d1 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Thu, 7 Apr 2022 15:54:50 +0800
Subject: [PATCH 060/113] fix: some bugs

---
 cai/api/flow.py      | 9 ++++++---
 cai/client/client.py | 3 +++
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/cai/api/flow.py b/cai/api/flow.py
index 6c2faba1..27a3cc9f 100644
--- a/cai/api/flow.py
+++ b/cai/api/flow.py
@@ -7,25 +7,28 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 
-from typing import Callable, Awaitable
+from typing import Callable, Awaitable, TYPE_CHECKING
 
 from cai.log import logger
 from cai.client import HANDLERS, Event, Client, Command, IncomingPacket
 
 from .base import BaseAPI
 
+if TYPE_CHECKING:
+    from .client import Client as Client_T
+
 
 class Events(BaseAPI):
     def add_event_listener(
         self,
-        listener: Callable[[Client, Event], Awaitable[None]]
+        listener: Callable[["Client_T", Event], Awaitable[None]]
     ):
         """Add event listener.
 
         Args:
             listener (Callable[[Client, Event], Awaitable[None]]): Event listener.
         """
-        self.client.add_event_listener(listener)
+        self.client.add_event_listener(lambda _, e: listener(self, e))  # type: ignore
 
     def register_packet_handler(
         self,
diff --git a/cai/client/client.py b/cai/client/client.py
index 150b8ac2..8441144e 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -295,6 +295,9 @@ def connected(self) -> bool:
     def closed(self) -> bool:
         return self._closed.is_set()
 
+    async def wait_closed(self):
+        await self._closed.wait()
+
     async def connect(self, server: Optional[SsoServer] = None) -> None:
         """Connect to the server.
 

From 3d1f2634c0b8f7091092fe906b465c6e898498b5 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Thu, 7 Apr 2022 16:44:08 +0800
Subject: [PATCH 061/113] add: more poke type

---
 cai/client/message_service/encoders.py |  4 ++--
 cai/client/message_service/models.py   | 13 +++++++++++--
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index 9c58b97f..98b454cd 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -10,7 +10,6 @@
     MsgElemInfo_servtype3,
 )
 from cai.pb.im.msg.msg_body import (
-    Ptt,
     Elem,
     MsgBody,
     RichMsg,
@@ -117,10 +116,11 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
                 Elem(
                     common_elem=CommonElem(
                         service_type=2,
+                        business_type=e.id,
                         pb_elem=MsgElemInfo_servtype2(
                             vaspoke_id=0xFFFFFFFF,
                             vaspoke_name=e.name.encode(),
-                            poke_type=e.id,
+                            poke_type=0,
                             poke_strength=e.strength,
                             double_hit=e.double_hit,
                             poke_flag=0,
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index df9ee92d..4fbe7cd4 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -11,7 +11,8 @@
 
 import abc
 from dataclasses import dataclass
-from typing import List, Optional
+from enum import IntEnum
+from typing import List, Optional, Union
 
 from cai.client.event import Event
 from cai.pb.msf.msg.comm import Msg
@@ -174,11 +175,19 @@ def to_ptt(self) -> Ptt:
 
 @dataclass
 class PokeElement(Element):
-    id: int = 0
+    id: Union[int, "PokeType"] = 0
     name: str = ""
     strength: int = 0
     double_hit: int = 0
 
+    class PokeType(IntEnum):
+        ChuoYiChuo = 0
+        BiXin = 2
+        DianZan = 3
+        XinSui = 4
+        SixSixSix = 5
+        FangDaZhao = 6
+
     @property
     def type(self) -> str:
         return "poke"

From 9f25e6b0734992ec65172847503aec8cfefd6287 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Thu, 7 Apr 2022 16:55:46 +0800
Subject: [PATCH 062/113] change: PokeType

---
 cai/client/message_service/models.py | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 4fbe7cd4..490b1a9d 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -10,8 +10,8 @@
 """
 
 import abc
-from dataclasses import dataclass
 from enum import IntEnum
+from dataclasses import dataclass
 from typing import List, Optional, Union
 
 from cai.client.event import Event
@@ -19,6 +19,15 @@
 from cai.pb.im.msg.msg_body import Ptt
 
 
+class PokeType(IntEnum):
+    ChuoYiChuo = 0
+    BiXin = 2
+    DianZan = 3
+    XinSui = 4
+    SixSixSix = 5
+    FangDaZhao = 6
+
+
 @dataclass
 class PrivateMessage(Event):
     _msg: Msg
@@ -175,19 +184,11 @@ def to_ptt(self) -> Ptt:
 
 @dataclass
 class PokeElement(Element):
-    id: Union[int, "PokeType"] = 0
+    id: Union[int, PokeType] = 0
     name: str = ""
     strength: int = 0
     double_hit: int = 0
 
-    class PokeType(IntEnum):
-        ChuoYiChuo = 0
-        BiXin = 2
-        DianZan = 3
-        XinSui = 4
-        SixSixSix = 5
-        FangDaZhao = 6
-
     @property
     def type(self) -> str:
         return "poke"

From e0487e3c74a4e468415fed9ffc8694d7b05b7617 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Thu, 7 Apr 2022 22:17:37 +0800
Subject: [PATCH 063/113] add: parse group mute/unmute,recall,nudge event

---
 cai/client/__init__.py                     |  2 +-
 cai/client/client.py                       |  7 +-
 cai/client/events/__init__.py              | 12 +++
 cai/client/{event.py => events/base.py}    |  0
 cai/client/events/common.py                | 16 ++++
 cai/client/events/friend.py                |  1 +
 cai/client/events/group.py                 | 37 ++++++++++
 cai/client/message_service/decoders.py     |  2 +-
 cai/client/message_service/models.py       |  2 +-
 cai/client/online_push/__init__.py         | 85 +++++++++++++++++++++-
 cai/pb/im/oidb/group0x857/__init__.py      |  0
 cai/pb/im/oidb/group0x857/group0x857.proto | 83 +++++++++++++++++++++
 12 files changed, 238 insertions(+), 9 deletions(-)
 create mode 100644 cai/client/events/__init__.py
 rename cai/client/{event.py => events/base.py} (100%)
 create mode 100644 cai/client/events/common.py
 create mode 100644 cai/client/events/friend.py
 create mode 100644 cai/client/events/group.py
 create mode 100644 cai/pb/im/oidb/group0x857/__init__.py
 create mode 100644 cai/pb/im/oidb/group0x857/group0x857.proto

diff --git a/cai/client/__init__.py b/cai/client/__init__.py
index 207f79e4..dbf1d67b 100644
--- a/cai/client/__init__.py
+++ b/cai/client/__init__.py
@@ -9,7 +9,7 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 
-from .event import Event
+from cai.client.events.base import Event
 from .command import Command
 from .packet import IncomingPacket
 from .client import HANDLERS, Client
diff --git a/cai/client/client.py b/cai/client/client.py
index 8441144e..25b0e292 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -46,12 +46,12 @@
     GroupMemberListException,
 )
 
-from .event import Event
+from cai.client.events.base import Event
 from .packet import UniPacket, IncomingPacket
 from .command import Command, _packet_to_command
 from .sso_server import SsoServer, get_sso_server
 from .multi_msg.long_msg import _handle_multi_resp_body
-from .online_push import handle_c2c_sync, handle_push_msg
+from .online_push import handle_c2c_sync, handle_push_msg, handle_req_push
 from .heartbeat import Heartbeat, encode_heartbeat, handle_heartbeat
 from .models import Group, Friend, SigInfo, FriendGroup, GroupMember
 from .config_push import FileServerPushList, handle_config_push_request
@@ -136,6 +136,7 @@
     # "OnlinePush.PbPushBindUinGroupMsg": handle_push_msg,  # sub account
     # new
     "MultiMsg.ApplyUp": _handle_multi_resp_body,
+    "OnlinePush.ReqPush": handle_req_push
 }
 
 
@@ -524,6 +525,8 @@ async def _run_listener(self, listener: LT, event: Event) -> None:
             log.logger.exception(e)
 
     def dispatch_event(self, event: Event) -> None:
+        if event.type not in ("group_message", "private_message"):  # log filter
+            log.logger.debug(f"Event {event.type} was triggered")
         for listener in self.listeners:
             asyncio.create_task(self._run_listener(listener, event))
 
diff --git a/cai/client/events/__init__.py b/cai/client/events/__init__.py
new file mode 100644
index 00000000..51d507c5
--- /dev/null
+++ b/cai/client/events/__init__.py
@@ -0,0 +1,12 @@
+from .common import NudgeEvent
+from .group import GroupEvent, MemberMutedEvent, MemberUnMutedEvent, MemberRecallMessageEvent
+# from .friend import *
+
+
+__all__ = [
+    "GroupEvent",
+    "MemberMutedEvent",
+    "MemberUnMutedEvent",
+    "MemberRecallMessageEvent",
+    "NudgeEvent"
+]
diff --git a/cai/client/event.py b/cai/client/events/base.py
similarity index 100%
rename from cai/client/event.py
rename to cai/client/events/base.py
diff --git a/cai/client/events/common.py b/cai/client/events/common.py
new file mode 100644
index 00000000..158847ac
--- /dev/null
+++ b/cai/client/events/common.py
@@ -0,0 +1,16 @@
+from typing import Optional
+from dataclasses import dataclass
+from .base import Event
+
+
+@dataclass
+class NudgeEvent(Event):
+    sender: int
+    target: int
+    action: str
+    suffix: Optional[str]
+    group: Optional[int] = None
+
+    @property
+    def type(self) -> str:
+        return "NudgeEvent"
diff --git a/cai/client/events/friend.py b/cai/client/events/friend.py
new file mode 100644
index 00000000..db4e5dd7
--- /dev/null
+++ b/cai/client/events/friend.py
@@ -0,0 +1 @@
+# TODO: PR Welcome
diff --git a/cai/client/events/group.py b/cai/client/events/group.py
new file mode 100644
index 00000000..d3e2bd29
--- /dev/null
+++ b/cai/client/events/group.py
@@ -0,0 +1,37 @@
+from dataclasses import dataclass
+
+from .base import Event
+
+
+class GroupEvent(Event):
+    @property
+    def type(self) -> str:
+        return self.__class__.__name__
+
+
+@dataclass
+class MemberMutedEvent(GroupEvent):
+    group: int
+    operator: int
+    target: int
+    duration: int
+
+
+@dataclass
+class MemberUnMutedEvent(GroupEvent):
+    group: int
+    operator: int
+    target: int
+
+
+@dataclass
+class MemberRecallMessageEvent(GroupEvent):
+    group: int
+    operator: int
+    operator_type: int
+    target: int
+
+    msg_rand: int
+    msg_seq: int
+    msg_time: int
+
diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index 2e52367f..da4f456a 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -13,7 +13,7 @@
 from typing import Dict, List, Callable, Optional, Sequence
 
 from cai.log import logger
-from cai.client.event import Event
+from cai.client.events.base import Event
 from cai.pb.msf.msg.comm import Msg
 from cai.pb.im.msg.msg_body import Ptt, Elem
 from cai.pb.im.msg.service.comm_elem import (
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 490b1a9d..3f1ad89e 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -14,7 +14,7 @@
 from dataclasses import dataclass
 from typing import List, Optional, Union
 
-from cai.client.event import Event
+from cai.client.events.base import Event
 from cai.pb.msf.msg.comm import Msg
 from cai.pb.im.msg.msg_body import Ptt
 
diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index 86cc96a0..c221165d 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -8,18 +8,21 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
+import struct
+import tkinter
+from typing import TYPE_CHECKING, List, Tuple, Optional, Sequence
 
-from typing import TYPE_CHECKING, List, Tuple, Optional
-
-from jce import types
+from jce import types, JceDecoder
 
 from cai.log import logger
 from cai.utils.binary import Packet
-from cai.utils.jce import RequestPacketVersion3
+from cai.utils.jce import RequestPacketVersion3, RequestPacket
 from cai.client.message_service import MESSAGE_DECODERS
 from cai.client.packet import UniPacket, IncomingPacket
 from cai.settings.device import DeviceInfo as _DeviceInfo_t
+from cai.pb.im.oidb.group0x857.group0x857_pb2 import NotifyMsgBody, TemplParam
 
+from .. import events
 from ...settings.protocol import ApkInfo
 from .jce import DelMsgInfo, DeviceInfo, SvcRespPushMsg
 from .command import PushMsg, PushMsgError, PushMsgCommand
@@ -218,6 +221,80 @@ async def handle_push_msg(
     return push
 
 
+def _parse_poke(params: Sequence[TemplParam]) -> dict:
+    res = {"target": None, "sender": None, "action": None, "suffix": None}
+    for p in params:
+        if p.name == "uin_str1":
+            res["sender"] = p.value
+        elif p.name == "uin_str2":
+            res["target"] = p.value
+        elif p.name == "suffix_str":
+            res["suffix"] = p.value
+        elif p.name == "action_str":
+            res["action"] = p.value
+    return res
+
+
+
+# OnlinePush.ReqPush
+async def handle_req_push(
+    client: "Client",
+    packet: IncomingPacket,
+    device: Tuple[_DeviceInfo_t, ApkInfo],
+) -> PushMsgCommand:
+    data = JceDecoder.decode_single(  # type: ignore
+        RequestPacket.decode(packet.data).buffer
+    )[1]["req"]["OnlinePushPack.SvcReqPushMsg"]
+    body = JceDecoder.decode_bytes(data)[0]
+    _, stime, content = body[0], body[1], body[2][0][6]
+    # TODO: Send OnlinePush.RespPush
+    if body[2][0][2] == 732:  # group
+        gid = int.from_bytes(content[0:4], "big")
+        dtype = content[4]
+        if dtype in (0x14, 0x11):
+            notify = NotifyMsgBody.FromString(content[7:])
+            if dtype == 0x14:  # nudge
+                client.dispatch_event(events.NudgeEvent(
+                    **_parse_poke(notify.optGeneralGrayTip.msgTemplParam),
+                    group=gid
+                ))
+            elif dtype == 0x11:  # recall
+                msg = notify.optMsgRecall.recalledMsgList[0]
+                client.dispatch_event(events.MemberRecallMessageEvent(
+                    gid,
+                    notify.optMsgRecall.uin,
+                    notify.optMsgRecall.opType,
+                    msg.authorUin,
+                    msg.msgRandom,
+                    msg.seq,
+                    msg.time
+                ))
+        elif dtype == 0x0c:  # mute event
+            operator = int.from_bytes(content[6:10], "big", signed=False)
+            target = int.from_bytes(content[16:20], "big", signed=False)
+            duration = int.from_bytes(content[20:24], "big", signed=False)
+            if duration > 0:  # muted
+                client.dispatch_event(events.MemberMutedEvent(
+                    gid,
+                    operator,
+                    target,
+                    duration
+                ))
+            else:
+                client.dispatch_event(events.MemberUnMutedEvent(
+                    gid,
+                    operator,
+                    target
+                ))
+    # TODO: parse friend event
+    return PushMsgCommand(
+        packet.uin,
+        packet.seq,
+        packet.ret_code,
+        packet.command_name
+    )
+
+
 __all__ = [
     "handle_c2c_sync",
     "handle_push_msg",
diff --git a/cai/pb/im/oidb/group0x857/__init__.py b/cai/pb/im/oidb/group0x857/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/cai/pb/im/oidb/group0x857/group0x857.proto b/cai/pb/im/oidb/group0x857/group0x857.proto
new file mode 100644
index 00000000..6989c805
--- /dev/null
+++ b/cai/pb/im/oidb/group0x857/group0x857.proto
@@ -0,0 +1,83 @@
+syntax = "proto3";
+
+option go_package = "github.com/Mrs4s/MiraiGo/client/pb/notify";
+
+message NotifyMsgBody {
+  AIOGrayTipsInfo optMsgGrayTips = 5;
+  RedGrayTipsInfo optMsgRedTips = 9;
+  MessageRecallReminder optMsgRecall = 11;
+  GeneralGrayTipInfo optGeneralGrayTip = 26;
+  QQGroupDigestMsg qqGroupDigestMsg = 33;
+  int32 serviceType = 13;
+}
+
+message AIOGrayTipsInfo{
+  uint32 showLatest = 1;
+  bytes content = 2;
+  uint32 remind = 3;
+  bytes brief = 4;
+  uint64 receiverUin = 5;
+  uint32 reliaoAdminOpt = 6;
+}
+
+message GeneralGrayTipInfo {
+  uint64 busiType = 1;
+  uint64 busiId = 2;
+  uint32 ctrlFlag = 3;
+  uint32 c2cType = 4;
+  uint32 serviceType = 5;
+  uint64 templId = 6;
+  repeated TemplParam msgTemplParam = 7;
+  string content = 8;
+}
+
+message TemplParam {
+  string name = 1;
+  string value = 2;
+}
+
+message MessageRecallReminder {
+  int64 uin = 1;
+  bytes nickname = 2;
+  repeated RecalledMessageMeta recalledMsgList = 3;
+  bytes reminderContent = 4;
+  bytes userdef = 5;
+  int32 groupType = 6;
+  int32 opType = 7;
+}
+
+message RecalledMessageMeta {
+  int32 seq = 1;
+  int32 time = 2;
+  int32 msgRandom = 3;
+  int32 msgType = 4;
+  int32 msgFlag = 5;
+  int64 authorUin = 6;
+}
+
+message RedGrayTipsInfo {
+  uint32 showLatest = 1;
+  uint64 senderUin = 2;
+  uint64 receiverUin = 3;
+  string senderRichContent = 4;
+  string receiverRichContent = 5;
+  bytes authKey = 6;
+  sint32 msgType = 7;
+  uint32 luckyFlag = 8;
+  uint32 hideFlag = 9;
+  uint64 luckyUin = 12;
+}
+
+message QQGroupDigestMsg {
+  uint64 groupCode = 1;
+  uint32 seq = 2;
+  uint32 random = 3;
+  int32 opType = 4;
+  uint64 sender = 5;
+  uint64 digestOper = 6;
+  uint32 opTime = 7;
+  uint32 lastestMsgSeq = 8;
+  bytes operNick = 9;
+  bytes senderNick = 10;
+  int32 extInfo = 11;
+}

From cff4e4c6d14bf778530e9bfad3de51c40e2ce2ad Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Thu, 7 Apr 2022 22:37:44 +0800
Subject: [PATCH 064/113] fix: type error

---
 cai/client/online_push/__init__.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index c221165d..aab0ff8c 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -225,9 +225,9 @@ def _parse_poke(params: Sequence[TemplParam]) -> dict:
     res = {"target": None, "sender": None, "action": None, "suffix": None}
     for p in params:
         if p.name == "uin_str1":
-            res["sender"] = p.value
+            res["sender"] = int(p.value)
         elif p.name == "uin_str2":
-            res["target"] = p.value
+            res["target"] = int(p.value)
         elif p.name == "suffix_str":
             res["suffix"] = p.value
         elif p.name == "action_str":

From eb17c61831d8e23a5774109c9a83b59a0e386d4d Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Thu, 7 Apr 2022 23:57:11 +0800
Subject: [PATCH 065/113] add: send OnlinePush.RespPush & optimized code

---
 cai/client/online_push/__init__.py | 67 +++++++++++++++++++++++-------
 1 file changed, 51 insertions(+), 16 deletions(-)

diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index aab0ff8c..5402986e 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -8,11 +8,9 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-import struct
-import tkinter
 from typing import TYPE_CHECKING, List, Tuple, Optional, Sequence
 
-from jce import types, JceDecoder
+from jce import types, JceDecoder, JceStruct, JceEncoder
 
 from cai.log import logger
 from cai.utils.binary import Packet
@@ -235,6 +233,20 @@ def _parse_poke(params: Sequence[TemplParam]) -> dict:
     return res
 
 
+"""def encode_resp_push_pkg(uin: int, svrip: int, seq: int, items: Sequence[DelMsgInfo]) -> bytes:
+    pkg = SvcRespPushMsg(
+        uin=uin,
+        del_infos=items,
+        svrip=svrip & 0xffffffff,
+        service_type=0
+    )
+    return RequestPacketVersion3(
+        servant_name="OnlinePush",
+        func_name="SvcRespPushMsg",
+        req_id=seq,
+        data=types.MAP({types.STRING("SvcRespPushMsg"): types.BYTES(SvcRespPushMsg.to_bytes(0, pkg))})
+    ).encode()
+"""
 
 # OnlinePush.ReqPush
 async def handle_req_push(
@@ -242,23 +254,25 @@ async def handle_req_push(
     packet: IncomingPacket,
     device: Tuple[_DeviceInfo_t, ApkInfo],
 ) -> PushMsgCommand:
-    data = JceDecoder.decode_single(  # type: ignore
-        RequestPacket.decode(packet.data).buffer
-    )[1]["req"]["OnlinePushPack.SvcReqPushMsg"]
-    body = JceDecoder.decode_bytes(data)[0]
-    _, stime, content = body[0], body[1], body[2][0][6]
-    # TODO: Send OnlinePush.RespPush
-    if body[2][0][2] == 732:  # group
+    body = JceDecoder.decode_bytes(
+        JceDecoder.decode_single(  # type: ignore
+            RequestPacket.decode(packet.data).buffer
+        )[1]["req"]["OnlinePushPack.SvcReqPushMsg"]
+    )[0]
+
+    _uin, stime, push_type, content = body[0], body[1], body[2][0][2], body[2][0][6]
+
+    if push_type == 732:  # group
         gid = int.from_bytes(content[0:4], "big")
-        dtype = content[4]
-        if dtype in (0x14, 0x11):
+        stype = content[4]
+        if stype in (0x14, 0x11):
             notify = NotifyMsgBody.FromString(content[7:])
-            if dtype == 0x14:  # nudge
+            if stype == 0x14:  # nudge
                 client.dispatch_event(events.NudgeEvent(
                     **_parse_poke(notify.optGeneralGrayTip.msgTemplParam),
                     group=gid
                 ))
-            elif dtype == 0x11:  # recall
+            elif stype == 0x11:  # recall
                 msg = notify.optMsgRecall.recalledMsgList[0]
                 client.dispatch_event(events.MemberRecallMessageEvent(
                     gid,
@@ -269,7 +283,7 @@ async def handle_req_push(
                     msg.seq,
                     msg.time
                 ))
-        elif dtype == 0x0c:  # mute event
+        elif stype == 0x0c:  # mute event
             operator = int.from_bytes(content[6:10], "big", signed=False)
             target = int.from_bytes(content[16:20], "big", signed=False)
             duration = int.from_bytes(content[20:24], "big", signed=False)
@@ -286,7 +300,28 @@ async def handle_req_push(
                     operator,
                     target
                 ))
-    # TODO: parse friend event
+    elif push_type == 528:
+        pass
+        # TODO: parse friend event
+
+    await client.send_and_wait(  # resp ack
+        seq=client.next_seq(),
+        command_name="OnlinePush.RespPush",
+        packet=encode_push_response(
+            body[1],
+            client._session_id,
+            _uin,
+            client._siginfo.d2key,
+            client.uin,
+            body[3] & 0xffffffff,
+            [DelMsgInfo(
+                from_uin=_uin,
+                msg_seq=body[1],
+                msg_time=stime
+            )]
+        )
+    )
+
     return PushMsgCommand(
         packet.uin,
         packet.seq,

From 473d8b28fea60f56430e8a7087627be6862fa458 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Fri, 8 Apr 2022 00:04:01 +0800
Subject: [PATCH 066/113] sync file

---
 cai/pb/im/oidb/group0x857/group0x857_pb2.py  | 105 ++++++++
 cai/pb/im/oidb/group0x857/group0x857_pb2.pyi | 267 +++++++++++++++++++
 2 files changed, 372 insertions(+)
 create mode 100644 cai/pb/im/oidb/group0x857/group0x857_pb2.py
 create mode 100644 cai/pb/im/oidb/group0x857/group0x857_pb2.pyi

diff --git a/cai/pb/im/oidb/group0x857/group0x857_pb2.py b/cai/pb/im/oidb/group0x857/group0x857_pb2.py
new file mode 100644
index 00000000..ef7632b0
--- /dev/null
+++ b/cai/pb/im/oidb/group0x857/group0x857_pb2.py
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: group0x857.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10group0x857.proto\"\x82\x02\n\rNotifyMsgBody\x12(\n\x0eoptMsgGrayTips\x18\x05 \x01(\x0b\x32\x10.AIOGrayTipsInfo\x12\'\n\roptMsgRedTips\x18\t \x01(\x0b\x32\x10.RedGrayTipsInfo\x12,\n\x0coptMsgRecall\x18\x0b \x01(\x0b\x32\x16.MessageRecallReminder\x12.\n\x11optGeneralGrayTip\x18\x1a \x01(\x0b\x32\x13.GeneralGrayTipInfo\x12+\n\x10qqGroupDigestMsg\x18! \x01(\x0b\x32\x11.QQGroupDigestMsg\x12\x13\n\x0bserviceType\x18\r \x01(\x05\"\x82\x01\n\x0f\x41IOGrayTipsInfo\x12\x12\n\nshowLatest\x18\x01 \x01(\r\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\x12\x0e\n\x06remind\x18\x03 \x01(\r\x12\r\n\x05\x62rief\x18\x04 \x01(\x0c\x12\x13\n\x0breceiverUin\x18\x05 \x01(\x04\x12\x16\n\x0ereliaoAdminOpt\x18\x06 \x01(\r\"\xb4\x01\n\x12GeneralGrayTipInfo\x12\x10\n\x08\x62usiType\x18\x01 \x01(\x04\x12\x0e\n\x06\x62usiId\x18\x02 \x01(\x04\x12\x10\n\x08\x63trlFlag\x18\x03 \x01(\r\x12\x0f\n\x07\x63\x32\x63Type\x18\x04 \x01(\r\x12\x13\n\x0bserviceType\x18\x05 \x01(\r\x12\x0f\n\x07templId\x18\x06 \x01(\x04\x12\"\n\rmsgTemplParam\x18\x07 \x03(\x0b\x32\x0b.TemplParam\x12\x0f\n\x07\x63ontent\x18\x08 \x01(\t\")\n\nTemplParam\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xb2\x01\n\x15MessageRecallReminder\x12\x0b\n\x03uin\x18\x01 \x01(\x03\x12\x10\n\x08nickname\x18\x02 \x01(\x0c\x12-\n\x0frecalledMsgList\x18\x03 \x03(\x0b\x32\x14.RecalledMessageMeta\x12\x17\n\x0freminderContent\x18\x04 \x01(\x0c\x12\x0f\n\x07userdef\x18\x05 \x01(\x0c\x12\x11\n\tgroupType\x18\x06 \x01(\x05\x12\x0e\n\x06opType\x18\x07 \x01(\x05\"x\n\x13RecalledMessageMeta\x12\x0b\n\x03seq\x18\x01 \x01(\x05\x12\x0c\n\x04time\x18\x02 \x01(\x05\x12\x11\n\tmsgRandom\x18\x03 \x01(\x05\x12\x0f\n\x07msgType\x18\x04 \x01(\x05\x12\x0f\n\x07msgFlag\x18\x05 \x01(\x05\x12\x11\n\tauthorUin\x18\x06 \x01(\x03\"\xde\x01\n\x0fRedGrayTipsInfo\x12\x12\n\nshowLatest\x18\x01 \x01(\r\x12\x11\n\tsenderUin\x18\x02 \x01(\x04\x12\x13\n\x0breceiverUin\x18\x03 \x01(\x04\x12\x19\n\x11senderRichContent\x18\x04 \x01(\t\x12\x1b\n\x13receiverRichContent\x18\x05 \x01(\t\x12\x0f\n\x07\x61uthKey\x18\x06 \x01(\x0c\x12\x0f\n\x07msgType\x18\x07 \x01(\x11\x12\x11\n\tluckyFlag\x18\x08 \x01(\r\x12\x10\n\x08hideFlag\x18\t \x01(\r\x12\x10\n\x08luckyUin\x18\x0c \x01(\x04\"\xd4\x01\n\x10QQGroupDigestMsg\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0b\n\x03seq\x18\x02 \x01(\r\x12\x0e\n\x06random\x18\x03 \x01(\r\x12\x0e\n\x06opType\x18\x04 \x01(\x05\x12\x0e\n\x06sender\x18\x05 \x01(\x04\x12\x12\n\ndigestOper\x18\x06 \x01(\x04\x12\x0e\n\x06opTime\x18\x07 \x01(\r\x12\x15\n\rlastestMsgSeq\x18\x08 \x01(\r\x12\x10\n\x08operNick\x18\t \x01(\x0c\x12\x12\n\nsenderNick\x18\n \x01(\x0c\x12\x0f\n\x07\x65xtInfo\x18\x0b \x01(\x05\x42+Z)github.com/Mrs4s/MiraiGo/client/pb/notifyb\x06proto3')
+
+
+
+_NOTIFYMSGBODY = DESCRIPTOR.message_types_by_name['NotifyMsgBody']
+_AIOGRAYTIPSINFO = DESCRIPTOR.message_types_by_name['AIOGrayTipsInfo']
+_GENERALGRAYTIPINFO = DESCRIPTOR.message_types_by_name['GeneralGrayTipInfo']
+_TEMPLPARAM = DESCRIPTOR.message_types_by_name['TemplParam']
+_MESSAGERECALLREMINDER = DESCRIPTOR.message_types_by_name['MessageRecallReminder']
+_RECALLEDMESSAGEMETA = DESCRIPTOR.message_types_by_name['RecalledMessageMeta']
+_REDGRAYTIPSINFO = DESCRIPTOR.message_types_by_name['RedGrayTipsInfo']
+_QQGROUPDIGESTMSG = DESCRIPTOR.message_types_by_name['QQGroupDigestMsg']
+NotifyMsgBody = _reflection.GeneratedProtocolMessageType('NotifyMsgBody', (_message.Message,), {
+  'DESCRIPTOR' : _NOTIFYMSGBODY,
+  '__module__' : 'group0x857_pb2'
+  # @@protoc_insertion_point(class_scope:NotifyMsgBody)
+  })
+_sym_db.RegisterMessage(NotifyMsgBody)
+
+AIOGrayTipsInfo = _reflection.GeneratedProtocolMessageType('AIOGrayTipsInfo', (_message.Message,), {
+  'DESCRIPTOR' : _AIOGRAYTIPSINFO,
+  '__module__' : 'group0x857_pb2'
+  # @@protoc_insertion_point(class_scope:AIOGrayTipsInfo)
+  })
+_sym_db.RegisterMessage(AIOGrayTipsInfo)
+
+GeneralGrayTipInfo = _reflection.GeneratedProtocolMessageType('GeneralGrayTipInfo', (_message.Message,), {
+  'DESCRIPTOR' : _GENERALGRAYTIPINFO,
+  '__module__' : 'group0x857_pb2'
+  # @@protoc_insertion_point(class_scope:GeneralGrayTipInfo)
+  })
+_sym_db.RegisterMessage(GeneralGrayTipInfo)
+
+TemplParam = _reflection.GeneratedProtocolMessageType('TemplParam', (_message.Message,), {
+  'DESCRIPTOR' : _TEMPLPARAM,
+  '__module__' : 'group0x857_pb2'
+  # @@protoc_insertion_point(class_scope:TemplParam)
+  })
+_sym_db.RegisterMessage(TemplParam)
+
+MessageRecallReminder = _reflection.GeneratedProtocolMessageType('MessageRecallReminder', (_message.Message,), {
+  'DESCRIPTOR' : _MESSAGERECALLREMINDER,
+  '__module__' : 'group0x857_pb2'
+  # @@protoc_insertion_point(class_scope:MessageRecallReminder)
+  })
+_sym_db.RegisterMessage(MessageRecallReminder)
+
+RecalledMessageMeta = _reflection.GeneratedProtocolMessageType('RecalledMessageMeta', (_message.Message,), {
+  'DESCRIPTOR' : _RECALLEDMESSAGEMETA,
+  '__module__' : 'group0x857_pb2'
+  # @@protoc_insertion_point(class_scope:RecalledMessageMeta)
+  })
+_sym_db.RegisterMessage(RecalledMessageMeta)
+
+RedGrayTipsInfo = _reflection.GeneratedProtocolMessageType('RedGrayTipsInfo', (_message.Message,), {
+  'DESCRIPTOR' : _REDGRAYTIPSINFO,
+  '__module__' : 'group0x857_pb2'
+  # @@protoc_insertion_point(class_scope:RedGrayTipsInfo)
+  })
+_sym_db.RegisterMessage(RedGrayTipsInfo)
+
+QQGroupDigestMsg = _reflection.GeneratedProtocolMessageType('QQGroupDigestMsg', (_message.Message,), {
+  'DESCRIPTOR' : _QQGROUPDIGESTMSG,
+  '__module__' : 'group0x857_pb2'
+  # @@protoc_insertion_point(class_scope:QQGroupDigestMsg)
+  })
+_sym_db.RegisterMessage(QQGroupDigestMsg)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'Z)github.com/Mrs4s/MiraiGo/client/pb/notify'
+  _NOTIFYMSGBODY._serialized_start=21
+  _NOTIFYMSGBODY._serialized_end=279
+  _AIOGRAYTIPSINFO._serialized_start=282
+  _AIOGRAYTIPSINFO._serialized_end=412
+  _GENERALGRAYTIPINFO._serialized_start=415
+  _GENERALGRAYTIPINFO._serialized_end=595
+  _TEMPLPARAM._serialized_start=597
+  _TEMPLPARAM._serialized_end=638
+  _MESSAGERECALLREMINDER._serialized_start=641
+  _MESSAGERECALLREMINDER._serialized_end=819
+  _RECALLEDMESSAGEMETA._serialized_start=821
+  _RECALLEDMESSAGEMETA._serialized_end=941
+  _REDGRAYTIPSINFO._serialized_start=944
+  _REDGRAYTIPSINFO._serialized_end=1166
+  _QQGROUPDIGESTMSG._serialized_start=1169
+  _QQGROUPDIGESTMSG._serialized_end=1381
+# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/oidb/group0x857/group0x857_pb2.pyi b/cai/pb/im/oidb/group0x857/group0x857_pb2.pyi
new file mode 100644
index 00000000..7fa6257b
--- /dev/null
+++ b/cai/pb/im/oidb/group0x857/group0x857_pb2.pyi
@@ -0,0 +1,267 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+from builtins import (
+    bool,
+    bytes,
+    int,
+)
+
+from google.protobuf.descriptor import (
+    Descriptor,
+    FileDescriptor,
+)
+
+from google.protobuf.internal.containers import (
+    RepeatedCompositeFieldContainer,
+)
+
+from google.protobuf.message import (
+    Message,
+)
+
+from typing import (
+    Iterable,
+    Optional,
+    Text,
+)
+
+from typing_extensions import (
+    Literal,
+)
+
+
+DESCRIPTOR: FileDescriptor
+
+class NotifyMsgBody(Message):
+    DESCRIPTOR: Descriptor
+    OPTMSGGRAYTIPS_FIELD_NUMBER: int
+    OPTMSGREDTIPS_FIELD_NUMBER: int
+    OPTMSGRECALL_FIELD_NUMBER: int
+    OPTGENERALGRAYTIP_FIELD_NUMBER: int
+    QQGROUPDIGESTMSG_FIELD_NUMBER: int
+    SERVICETYPE_FIELD_NUMBER: int
+    @property
+    def optMsgGrayTips(self) -> AIOGrayTipsInfo: ...
+    @property
+    def optMsgRedTips(self) -> RedGrayTipsInfo: ...
+    @property
+    def optMsgRecall(self) -> MessageRecallReminder: ...
+    @property
+    def optGeneralGrayTip(self) -> GeneralGrayTipInfo: ...
+    @property
+    def qqGroupDigestMsg(self) -> QQGroupDigestMsg: ...
+    serviceType: int
+    def __init__(self,
+        *,
+        optMsgGrayTips: Optional[AIOGrayTipsInfo] = ...,
+        optMsgRedTips: Optional[RedGrayTipsInfo] = ...,
+        optMsgRecall: Optional[MessageRecallReminder] = ...,
+        optGeneralGrayTip: Optional[GeneralGrayTipInfo] = ...,
+        qqGroupDigestMsg: Optional[QQGroupDigestMsg] = ...,
+        serviceType: int = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["optGeneralGrayTip",b"optGeneralGrayTip","optMsgGrayTips",b"optMsgGrayTips","optMsgRecall",b"optMsgRecall","optMsgRedTips",b"optMsgRedTips","qqGroupDigestMsg",b"qqGroupDigestMsg"]) -> bool: ...
+    def ClearField(self, field_name: Literal["optGeneralGrayTip",b"optGeneralGrayTip","optMsgGrayTips",b"optMsgGrayTips","optMsgRecall",b"optMsgRecall","optMsgRedTips",b"optMsgRedTips","qqGroupDigestMsg",b"qqGroupDigestMsg","serviceType",b"serviceType"]) -> None: ...
+
+class AIOGrayTipsInfo(Message):
+    DESCRIPTOR: Descriptor
+    SHOWLATEST_FIELD_NUMBER: int
+    CONTENT_FIELD_NUMBER: int
+    REMIND_FIELD_NUMBER: int
+    BRIEF_FIELD_NUMBER: int
+    RECEIVERUIN_FIELD_NUMBER: int
+    RELIAOADMINOPT_FIELD_NUMBER: int
+    showLatest: int
+    content: bytes
+    remind: int
+    brief: bytes
+    receiverUin: int
+    reliaoAdminOpt: int
+    def __init__(self,
+        *,
+        showLatest: int = ...,
+        content: bytes = ...,
+        remind: int = ...,
+        brief: bytes = ...,
+        receiverUin: int = ...,
+        reliaoAdminOpt: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["brief",b"brief","content",b"content","receiverUin",b"receiverUin","reliaoAdminOpt",b"reliaoAdminOpt","remind",b"remind","showLatest",b"showLatest"]) -> None: ...
+
+class GeneralGrayTipInfo(Message):
+    DESCRIPTOR: Descriptor
+    BUSITYPE_FIELD_NUMBER: int
+    BUSIID_FIELD_NUMBER: int
+    CTRLFLAG_FIELD_NUMBER: int
+    C2CTYPE_FIELD_NUMBER: int
+    SERVICETYPE_FIELD_NUMBER: int
+    TEMPLID_FIELD_NUMBER: int
+    MSGTEMPLPARAM_FIELD_NUMBER: int
+    CONTENT_FIELD_NUMBER: int
+    busiType: int
+    busiId: int
+    ctrlFlag: int
+    c2cType: int
+    serviceType: int
+    templId: int
+    @property
+    def msgTemplParam(self) -> RepeatedCompositeFieldContainer[TemplParam]: ...
+    content: Text
+    def __init__(self,
+        *,
+        busiType: int = ...,
+        busiId: int = ...,
+        ctrlFlag: int = ...,
+        c2cType: int = ...,
+        serviceType: int = ...,
+        templId: int = ...,
+        msgTemplParam: Optional[Iterable[TemplParam]] = ...,
+        content: Text = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["busiId",b"busiId","busiType",b"busiType","c2cType",b"c2cType","content",b"content","ctrlFlag",b"ctrlFlag","msgTemplParam",b"msgTemplParam","serviceType",b"serviceType","templId",b"templId"]) -> None: ...
+
+class TemplParam(Message):
+    DESCRIPTOR: Descriptor
+    NAME_FIELD_NUMBER: int
+    VALUE_FIELD_NUMBER: int
+    name: Text
+    value: Text
+    def __init__(self,
+        *,
+        name: Text = ...,
+        value: Text = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["name",b"name","value",b"value"]) -> None: ...
+
+class MessageRecallReminder(Message):
+    DESCRIPTOR: Descriptor
+    UIN_FIELD_NUMBER: int
+    NICKNAME_FIELD_NUMBER: int
+    RECALLEDMSGLIST_FIELD_NUMBER: int
+    REMINDERCONTENT_FIELD_NUMBER: int
+    USERDEF_FIELD_NUMBER: int
+    GROUPTYPE_FIELD_NUMBER: int
+    OPTYPE_FIELD_NUMBER: int
+    uin: int
+    nickname: bytes
+    @property
+    def recalledMsgList(self) -> RepeatedCompositeFieldContainer[RecalledMessageMeta]: ...
+    reminderContent: bytes
+    userdef: bytes
+    groupType: int
+    opType: int
+    def __init__(self,
+        *,
+        uin: int = ...,
+        nickname: bytes = ...,
+        recalledMsgList: Optional[Iterable[RecalledMessageMeta]] = ...,
+        reminderContent: bytes = ...,
+        userdef: bytes = ...,
+        groupType: int = ...,
+        opType: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["groupType",b"groupType","nickname",b"nickname","opType",b"opType","recalledMsgList",b"recalledMsgList","reminderContent",b"reminderContent","uin",b"uin","userdef",b"userdef"]) -> None: ...
+
+class RecalledMessageMeta(Message):
+    DESCRIPTOR: Descriptor
+    SEQ_FIELD_NUMBER: int
+    TIME_FIELD_NUMBER: int
+    MSGRANDOM_FIELD_NUMBER: int
+    MSGTYPE_FIELD_NUMBER: int
+    MSGFLAG_FIELD_NUMBER: int
+    AUTHORUIN_FIELD_NUMBER: int
+    seq: int
+    time: int
+    msgRandom: int
+    msgType: int
+    msgFlag: int
+    authorUin: int
+    def __init__(self,
+        *,
+        seq: int = ...,
+        time: int = ...,
+        msgRandom: int = ...,
+        msgType: int = ...,
+        msgFlag: int = ...,
+        authorUin: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["authorUin",b"authorUin","msgFlag",b"msgFlag","msgRandom",b"msgRandom","msgType",b"msgType","seq",b"seq","time",b"time"]) -> None: ...
+
+class RedGrayTipsInfo(Message):
+    DESCRIPTOR: Descriptor
+    SHOWLATEST_FIELD_NUMBER: int
+    SENDERUIN_FIELD_NUMBER: int
+    RECEIVERUIN_FIELD_NUMBER: int
+    SENDERRICHCONTENT_FIELD_NUMBER: int
+    RECEIVERRICHCONTENT_FIELD_NUMBER: int
+    AUTHKEY_FIELD_NUMBER: int
+    MSGTYPE_FIELD_NUMBER: int
+    LUCKYFLAG_FIELD_NUMBER: int
+    HIDEFLAG_FIELD_NUMBER: int
+    LUCKYUIN_FIELD_NUMBER: int
+    showLatest: int
+    senderUin: int
+    receiverUin: int
+    senderRichContent: Text
+    receiverRichContent: Text
+    authKey: bytes
+    msgType: int
+    luckyFlag: int
+    hideFlag: int
+    luckyUin: int
+    def __init__(self,
+        *,
+        showLatest: int = ...,
+        senderUin: int = ...,
+        receiverUin: int = ...,
+        senderRichContent: Text = ...,
+        receiverRichContent: Text = ...,
+        authKey: bytes = ...,
+        msgType: int = ...,
+        luckyFlag: int = ...,
+        hideFlag: int = ...,
+        luckyUin: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["authKey",b"authKey","hideFlag",b"hideFlag","luckyFlag",b"luckyFlag","luckyUin",b"luckyUin","msgType",b"msgType","receiverRichContent",b"receiverRichContent","receiverUin",b"receiverUin","senderRichContent",b"senderRichContent","senderUin",b"senderUin","showLatest",b"showLatest"]) -> None: ...
+
+class QQGroupDigestMsg(Message):
+    DESCRIPTOR: Descriptor
+    GROUPCODE_FIELD_NUMBER: int
+    SEQ_FIELD_NUMBER: int
+    RANDOM_FIELD_NUMBER: int
+    OPTYPE_FIELD_NUMBER: int
+    SENDER_FIELD_NUMBER: int
+    DIGESTOPER_FIELD_NUMBER: int
+    OPTIME_FIELD_NUMBER: int
+    LASTESTMSGSEQ_FIELD_NUMBER: int
+    OPERNICK_FIELD_NUMBER: int
+    SENDERNICK_FIELD_NUMBER: int
+    EXTINFO_FIELD_NUMBER: int
+    groupCode: int
+    seq: int
+    random: int
+    opType: int
+    sender: int
+    digestOper: int
+    opTime: int
+    lastestMsgSeq: int
+    operNick: bytes
+    senderNick: bytes
+    extInfo: int
+    def __init__(self,
+        *,
+        groupCode: int = ...,
+        seq: int = ...,
+        random: int = ...,
+        opType: int = ...,
+        sender: int = ...,
+        digestOper: int = ...,
+        opTime: int = ...,
+        lastestMsgSeq: int = ...,
+        operNick: bytes = ...,
+        senderNick: bytes = ...,
+        extInfo: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["digestOper",b"digestOper","extInfo",b"extInfo","groupCode",b"groupCode","lastestMsgSeq",b"lastestMsgSeq","opTime",b"opTime","opType",b"opType","operNick",b"operNick","random",b"random","sender",b"sender","senderNick",b"senderNick","seq",b"seq"]) -> None: ...

From cbb506e3c7354bc1bb04cbb0d977293298e30ab1 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Fri, 8 Apr 2022 11:11:19 +0800
Subject: [PATCH 067/113] :art: improve reconnect

---
 cai/client/client.py | 45 ++++++++++++++++++++++++++------------------
 1 file changed, 27 insertions(+), 18 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 25b0e292..6cf26073 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -9,6 +9,7 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 import time
+import struct
 import asyncio
 import secrets
 from typing import (
@@ -28,6 +29,7 @@
 
 from cai import log
 from cai.utils.binary import Packet
+from cai.client.events.base import Event
 from cai.utils.future import FutureStore
 from cai.settings.protocol import ApkInfo
 from cai.settings.device import DeviceInfo
@@ -46,15 +48,14 @@
     GroupMemberListException,
 )
 
-from cai.client.events.base import Event
 from .packet import UniPacket, IncomingPacket
 from .command import Command, _packet_to_command
 from .sso_server import SsoServer, get_sso_server
 from .multi_msg.long_msg import _handle_multi_resp_body
-from .online_push import handle_c2c_sync, handle_push_msg, handle_req_push
 from .heartbeat import Heartbeat, encode_heartbeat, handle_heartbeat
 from .models import Group, Friend, SigInfo, FriendGroup, GroupMember
 from .config_push import FileServerPushList, handle_config_push_request
+from .online_push import handle_c2c_sync, handle_push_msg, handle_req_push
 from .message_service import (
     SyncFlag,
     GetMessageCommand,
@@ -136,7 +137,7 @@
     # "OnlinePush.PbPushBindUinGroupMsg": handle_push_msg,  # sub account
     # new
     "MultiMsg.ApplyUp": _handle_multi_resp_body,
-    "OnlinePush.ReqPush": handle_req_push
+    "OnlinePush.ReqPush": handle_req_push,
 }
 
 
@@ -202,6 +203,7 @@ def __init__(
 
         # connection info
         self._reconnect: bool = auto_reconnect
+        self._reconnect_times: int = 0
         self._max_reconnections: Optional[int] = max_reconnections
         self._closed: asyncio.Event = asyncio.Event()
 
@@ -322,9 +324,8 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
             self._connection = await connect(
                 _server.host, _server.port, ssl=False, timeout=3.0
             )
-            asyncio.create_task(self.receive()).add_done_callback(
-                self._recv_done_cb
-            )
+            task = asyncio.create_task(self.receive())
+            task.add_done_callback(self._recv_done_cb)
         except ConnectionError as e:
             raise
         except Exception as e:
@@ -333,13 +334,23 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
                 f"server({_server.host}:{_server.port}): " + repr(e)
             )
 
-    def _recv_done_cb(self, _task):
+    def _recv_done_cb(self, task: asyncio.Task):
         if self._reconnect:
-            log.network.warning("receiver stopped, try to reconnect")
-            asyncio.create_task(self.reconnect())
+            if (
+                self._max_reconnections
+                and self._reconnect_times >= self._max_reconnections
+            ):
+                log.network.warning(
+                    "Max reconnections reached, stop reconnecting"
+                )
+                asyncio.create_task(self.disconnect())
+            else:
+                log.network.warning("receiver stopped, try to reconnect")
+                self._reconnect_times += 1
+                asyncio.create_task(self.reconnect())
         else:
             log.network.warning("receiver stopped")
-            asyncio.create_task(self.close())
+            asyncio.create_task(self.disconnect())
 
     async def disconnect(self) -> None:
         """Disconnect if already connected to the server."""
@@ -360,7 +371,7 @@ async def reconnect(
 
         if not change_server and self._connection:
             log.network.warning("reconnecting...")
-            await self.connect()
+            await self._connection.reconnect()
             await self.register(register_reason=RegPushReason.MsfByNetChange)
             log.network.info("reconnected")
             return
@@ -425,7 +436,7 @@ async def send(
         Returns:
             None.
         """
-        log.network.debug(f"(send:{seq}): {command_name}")
+        log.network.debug(f"(send: {seq}): {command_name}")
         await self.connection.awrite(packet)
 
     async def send_and_wait(
@@ -449,6 +460,7 @@ async def send_and_wait(
         await self.send(seq, command_name, packet)
         return await self._receive_store.fetch(seq, timeout)
 
+    # FIXME
     async def send_unipkg_and_wait(
         self, command_name: str, enc_packet: bytes, seq=-1, timeout=10.0
     ):
@@ -489,12 +501,10 @@ async def receive(self):
         while self.connected:
             try:
                 length: int = (
-                    int.from_bytes(
-                        await self.connection.read_bytes(4), "big", signed=False
-                    )
+                    struct.unpack(">i", await self.connection.read_bytes(4))[0]
                     - 4
                 )
-
+                # FIXME: length < 0 ?
                 data = await self.connection.read_bytes(length)
                 packet = IncomingPacket.parse(
                     data,
@@ -502,9 +512,8 @@ async def receive(self):
                     self._siginfo.d2key,
                     self._siginfo.wt_session_ticket_key,
                 )
-                #
                 log.network.debug(
-                    f"(receive:{packet.ret_code}): {packet.command_name}"
+                    f"(receive: {packet.ret_code}): {packet.command_name}"
                 )
                 # do not block receive
                 asyncio.create_task(self._handle_incoming_packet(packet))

From 21aa1eefe394adb5e39c3c0bfba9cb1781acb4fa Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Fri, 8 Apr 2022 11:30:59 +0800
Subject: [PATCH 068/113] :wheelchair: fix reconnect init

---
 cai/client/client.py | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 6cf26073..ddb2f067 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -372,7 +372,8 @@ async def reconnect(
         if not change_server and self._connection:
             log.network.warning("reconnecting...")
             await self._connection.reconnect()
-            await self.register(register_reason=RegPushReason.MsfByNetChange)
+            # FIXME: register reason msfByNetChange?
+            await self._init(drop_offline_msg=False)
             log.network.info("reconnected")
             return
 
@@ -642,13 +643,15 @@ async def _handle_login_response(
                 response.uin, response.status, "Unknown login status."
             )
 
-    async def _init(self) -> None:
+    async def _init(self, drop_offline_msg: bool = True) -> None:
         if not self.connected or self.status == OnlineStatus.Offline:
             raise RuntimeError("Client is offline.")
 
-        self._init_flag = True
+        self._init_flag = drop_offline_msg
+
+        previous_status = self._status or OnlineStatus.Online
         # register client online status
-        await self.register()
+        await self.register(status=previous_status)
         # force refresh group list
         await self._refresh_group_list()
         # force refresh friend list

From 55e9fac9bfdcbffd8e282f27c325ae1bcd5d7730 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Fri, 8 Apr 2022 12:32:03 +0800
Subject: [PATCH 069/113] :art: remove device handle param

---
 cai/api/client.py                      |   2 +-
 cai/api/flow.py                        |   5 +-
 cai/client/__init__.py                 |   1 +
 cai/client/client.py                   |  28 +++---
 cai/client/command.py                  |   2 +-
 cai/client/config_push/__init__.py     |   2 +-
 cai/client/events/__init__.py          |  10 +-
 cai/client/events/common.py            |   1 +
 cai/client/events/group.py             |   1 -
 cai/client/friendlist/__init__.py      |   6 +-
 cai/client/heartbeat/__init__.py       |   2 +-
 cai/client/message_service/__init__.py |   8 +-
 cai/client/message_service/decoders.py |   2 +-
 cai/client/message_service/models.py   |   4 +-
 cai/client/multi_msg/long_msg.py       |   2 +-
 cai/client/online_push/__init__.py     | 134 ++++++++++++-------------
 cai/client/status_service/__init__.py  |   8 +-
 cai/client/wtlogin/__init__.py         |  10 +-
 18 files changed, 114 insertions(+), 114 deletions(-)

diff --git a/cai/api/client.py b/cai/api/client.py
index 6f280059..76b917c4 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -24,9 +24,9 @@
     VoiceElement,
 )
 
-from .flow import Events as _Events
 from .group import Group as _Group
 from .login import Login as _Login
+from .flow import Events as _Events
 from .friend import Friend as _Friend
 from .error import (
     BotMutedException,
diff --git a/cai/api/flow.py b/cai/api/flow.py
index 27a3cc9f..1fea701b 100644
--- a/cai/api/flow.py
+++ b/cai/api/flow.py
@@ -7,7 +7,7 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 
-from typing import Callable, Awaitable, TYPE_CHECKING
+from typing import TYPE_CHECKING, Callable, Awaitable
 
 from cai.log import logger
 from cai.client import HANDLERS, Event, Client, Command, IncomingPacket
@@ -20,8 +20,7 @@
 
 class Events(BaseAPI):
     def add_event_listener(
-        self,
-        listener: Callable[["Client_T", Event], Awaitable[None]]
+        self, listener: Callable[["Client_T", Event], Awaitable[None]]
     ):
         """Add event listener.
 
diff --git a/cai/client/__init__.py b/cai/client/__init__.py
index dbf1d67b..6a5d5624 100644
--- a/cai/client/__init__.py
+++ b/cai/client/__init__.py
@@ -10,6 +10,7 @@
 """
 
 from cai.client.events.base import Event
+
 from .command import Command
 from .packet import IncomingPacket
 from .client import HANDLERS, Client
diff --git a/cai/client/client.py b/cai/client/client.py
index ddb2f067..e8d904f5 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -111,9 +111,7 @@
     encode_login_request2_captcha,
 )
 
-HT = Callable[
-    ["Client", IncomingPacket, Tuple[DeviceInfo, ApkInfo]], Awaitable[Command]
-]
+HT = Callable[["Client", IncomingPacket], Awaitable[Command]]
 LT = Callable[["Client", Event], Awaitable[None]]
 
 HANDLERS: Dict[str, HT] = {
@@ -135,7 +133,6 @@
     "OnlinePush.PbC2CMsgSync": handle_c2c_sync,
     "OnlinePush.PbPushC2CMsg": handle_push_msg,
     # "OnlinePush.PbPushBindUinGroupMsg": handle_push_msg,  # sub account
-    # new
     "MultiMsg.ApplyUp": _handle_multi_resp_body,
     "OnlinePush.ReqPush": handle_req_push,
 }
@@ -347,7 +344,7 @@ def _recv_done_cb(self, task: asyncio.Task):
             else:
                 log.network.warning("receiver stopped, try to reconnect")
                 self._reconnect_times += 1
-                asyncio.create_task(self.reconnect())
+                asyncio.create_task(self.reconnect_and_login())
         else:
             log.network.warning("receiver stopped")
             asyncio.create_task(self.disconnect())
@@ -372,8 +369,6 @@ async def reconnect(
         if not change_server and self._connection:
             log.network.warning("reconnecting...")
             await self._connection.reconnect()
-            # FIXME: register reason msfByNetChange?
-            await self._init(drop_offline_msg=False)
             log.network.info("reconnected")
             return
 
@@ -388,6 +383,13 @@ async def reconnect(
         await self.disconnect()
         await self.connect(_server)
 
+    async def reconnect_and_login(
+        self, change_server: bool = False, server: Optional[SsoServer] = None
+    ) -> None:
+        await self.reconnect(change_server=change_server, server=server)
+        # FIXME: register reason msfByNetChange?
+        await self._init(drop_offline_msg=False)
+
     async def close(self) -> None:
         """Close the client and logout."""
         log.logger.warning("closing client")
@@ -485,9 +487,7 @@ async def send_unipkg_and_wait(
     async def _handle_incoming_packet(self, in_packet: IncomingPacket) -> None:
         try:
             handler = HANDLERS.get(in_packet.command_name, _packet_to_command)
-            packet = await handler(
-                self, in_packet, (self.device, self.apk_info)
-            )
+            packet = await handler(self, in_packet)
             self._receive_store.store_result(packet.seq, packet)
         except Exception as e:
             # TODO: handle exception
@@ -644,12 +644,14 @@ async def _handle_login_response(
             )
 
     async def _init(self, drop_offline_msg: bool = True) -> None:
-        if not self.connected or self.status == OnlineStatus.Offline:
-            raise RuntimeError("Client is offline.")
+        if not self.connected:
+            raise RuntimeError("Client not connected.")
 
         self._init_flag = drop_offline_msg
 
         previous_status = self._status or OnlineStatus.Online
+        if previous_status in (OnlineStatus.Offline, OnlineStatus.Unknown):
+            previous_status = OnlineStatus.Online
         # register client online status
         await self.register(status=previous_status)
         # force refresh group list
@@ -1050,7 +1052,7 @@ async def heartbeat(self) -> None:
 
         self._heartbeat_enabled = True
 
-        while self._heartbeat_enabled and not self._connection.closed:
+        while self._heartbeat_enabled and self.connected:
             seq = self.next_seq()
             packet = encode_heartbeat(
                 seq,
diff --git a/cai/client/command.py b/cai/client/command.py
index 1e7d726e..e930b111 100644
--- a/cai/client/command.py
+++ b/cai/client/command.py
@@ -31,7 +31,7 @@ class UnhandledCommand(Command):
 
 
 async def _packet_to_command(
-    client: "Client", packet: IncomingPacket, _device
+    client: "Client", packet: IncomingPacket
 ) -> UnhandledCommand:
     return UnhandledCommand(
         packet.uin,
diff --git a/cai/client/config_push/__init__.py b/cai/client/config_push/__init__.py
index c1b9bf27..516a4ac8 100644
--- a/cai/client/config_push/__init__.py
+++ b/cai/client/config_push/__init__.py
@@ -75,7 +75,7 @@ def encode_config_push_response(
 
 # ConfigPushSvc.PushReq
 async def handle_config_push_request(
-    client: "Client", packet: IncomingPacket, _device
+    client: "Client", packet: IncomingPacket
 ) -> ConfigPushCommand:
     command = ConfigPushCommand.decode_push_req(
         packet.uin,
diff --git a/cai/client/events/__init__.py b/cai/client/events/__init__.py
index 51d507c5..183ef0b9 100644
--- a/cai/client/events/__init__.py
+++ b/cai/client/events/__init__.py
@@ -1,5 +1,11 @@
 from .common import NudgeEvent
-from .group import GroupEvent, MemberMutedEvent, MemberUnMutedEvent, MemberRecallMessageEvent
+from .group import (
+    GroupEvent,
+    MemberMutedEvent,
+    MemberUnMutedEvent,
+    MemberRecallMessageEvent,
+)
+
 # from .friend import *
 
 
@@ -8,5 +14,5 @@
     "MemberMutedEvent",
     "MemberUnMutedEvent",
     "MemberRecallMessageEvent",
-    "NudgeEvent"
+    "NudgeEvent",
 ]
diff --git a/cai/client/events/common.py b/cai/client/events/common.py
index 158847ac..5a4d1524 100644
--- a/cai/client/events/common.py
+++ b/cai/client/events/common.py
@@ -1,5 +1,6 @@
 from typing import Optional
 from dataclasses import dataclass
+
 from .base import Event
 
 
diff --git a/cai/client/events/group.py b/cai/client/events/group.py
index d3e2bd29..ff61ec8d 100644
--- a/cai/client/events/group.py
+++ b/cai/client/events/group.py
@@ -34,4 +34,3 @@ class MemberRecallMessageEvent(GroupEvent):
     msg_rand: int
     msg_seq: int
     msg_time: int
-
diff --git a/cai/client/friendlist/__init__.py b/cai/client/friendlist/__init__.py
index 0dd9c983..9a71ddf2 100644
--- a/cai/client/friendlist/__init__.py
+++ b/cai/client/friendlist/__init__.py
@@ -104,7 +104,7 @@ def encode_get_friend_list(
 
 
 async def handle_friend_list(
-    client: "Client", packet: IncomingPacket, _device
+    client: "Client", packet: IncomingPacket
 ) -> "FriendListCommand":
     return FriendListCommand.decode_response(
         packet.uin,
@@ -167,7 +167,7 @@ def encode_get_troop_list(
 
 
 async def handle_troop_list(
-    client: "Client", packet: IncomingPacket, _device
+    client: "Client", packet: IncomingPacket
 ) -> TroopListCommand:
     return TroopListCommand.decode_response(
         packet.uin,
@@ -230,7 +230,7 @@ def encode_get_troop_member_list(
 
 
 async def handle_troop_member_list(
-    client: "Client", packet: IncomingPacket, _device
+    client: "Client", packet: IncomingPacket
 ) -> TroopMemberListCommand:
     return TroopMemberListCommand.decode_response(
         packet.uin,
diff --git a/cai/client/heartbeat/__init__.py b/cai/client/heartbeat/__init__.py
index b2b516fd..e9af60f9 100644
--- a/cai/client/heartbeat/__init__.py
+++ b/cai/client/heartbeat/__init__.py
@@ -65,7 +65,7 @@ class Heartbeat(Command):
 
 
 async def handle_heartbeat(
-    _client: "Client", packet: IncomingPacket, _device
+    client: "Client", packet: IncomingPacket
 ) -> Heartbeat:
     return Heartbeat(
         packet.uin, packet.seq, packet.ret_code, packet.command_name
diff --git a/cai/client/message_service/__init__.py b/cai/client/message_service/__init__.py
index def447ed..515d4cf6 100644
--- a/cai/client/message_service/__init__.py
+++ b/cai/client/message_service/__init__.py
@@ -102,7 +102,7 @@ def encode_get_message(
 
 
 async def handle_get_message(
-    client: "Client", packet: IncomingPacket, _device
+    client: "Client", packet: IncomingPacket
 ) -> "GetMessageCommand":
     """Handle Pb Get Message response.
 
@@ -247,7 +247,7 @@ def encode_delete_message(
 
 
 async def handle_push_notify(
-    client: "Client", packet: IncomingPacket, _device
+    client: "Client", packet: IncomingPacket
 ) -> PushNotifyCommand:
     """Handle Push Notify Command.
 
@@ -304,10 +304,10 @@ async def handle_push_notify(
 
 # MessageSvc.PushForceOffline
 async def handle_force_offline(
-    client: "Client", packet: IncomingPacket, _device
+    client: "Client", packet: IncomingPacket
 ) -> PushForceOfflineCommand:
     client._status = OnlineStatus.Offline
-    await client.close()
+    await client.disconnect()
     request = PushForceOfflineCommand.decode_response(
         packet.uin,
         packet.seq,
diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index da4f456a..f17b2f50 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -13,8 +13,8 @@
 from typing import Dict, List, Callable, Optional, Sequence
 
 from cai.log import logger
-from cai.client.events.base import Event
 from cai.pb.msf.msg.comm import Msg
+from cai.client.events.base import Event
 from cai.pb.im.msg.msg_body import Ptt, Elem
 from cai.pb.im.msg.service.comm_elem import (
     MsgElemInfo_servtype2,
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 3f1ad89e..821bd3f6 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -12,11 +12,11 @@
 import abc
 from enum import IntEnum
 from dataclasses import dataclass
-from typing import List, Optional, Union
+from typing import List, Union, Optional
 
-from cai.client.events.base import Event
 from cai.pb.msf.msg.comm import Msg
 from cai.pb.im.msg.msg_body import Ptt
+from cai.client.events.base import Event
 
 
 class PokeType(IntEnum):
diff --git a/cai/client/multi_msg/long_msg.py b/cai/client/multi_msg/long_msg.py
index 0f635148..87a2aa5d 100644
--- a/cai/client/multi_msg/long_msg.py
+++ b/cai/client/multi_msg/long_msg.py
@@ -68,7 +68,7 @@ async def build_multi_apply_up_pkg(
 
 
 async def _handle_multi_resp_body(
-    client: "Client", pkg: "IncomingPacket", _device
+    client: "Client", pkg: "IncomingPacket"
 ) -> MultiApplyResp:
     mrb = MultiRspBody.FromString(pkg.data).multimsgApplyupRsp
     if not mrb:
diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index 5402986e..bec45a51 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -10,15 +10,15 @@
 """
 from typing import TYPE_CHECKING, List, Tuple, Optional, Sequence
 
-from jce import types, JceDecoder, JceStruct, JceEncoder
+from jce import JceStruct, JceDecoder, JceEncoder, types
 
 from cai.log import logger
 from cai.utils.binary import Packet
-from cai.utils.jce import RequestPacketVersion3, RequestPacket
 from cai.client.message_service import MESSAGE_DECODERS
 from cai.client.packet import UniPacket, IncomingPacket
 from cai.settings.device import DeviceInfo as _DeviceInfo_t
-from cai.pb.im.oidb.group0x857.group0x857_pb2 import NotifyMsgBody, TemplParam
+from cai.utils.jce import RequestPacket, RequestPacketVersion3
+from cai.pb.im.oidb.group0x857.group0x857_pb2 import TemplParam, NotifyMsgBody
 
 from .. import events
 from ...settings.protocol import ApkInfo
@@ -29,12 +29,12 @@
     from cai.client import Client
 
 
+# OnlinePush.RespPush
 def encode_push_response(
     seq: int,
     session_id: bytes,
     uin: int,
     d2key: bytes,
-    resp_uin: int,  # warn: unused var
     svrip: int,
     delete_messages: List[DelMsgInfo] = [],
     push_token: Optional[bytes] = None,
@@ -55,7 +55,6 @@ def encode_push_response(
         session_id (bytes): Session ID.
         uin (int): User QQ number.
         d2key (bytes): Siginfo d2 key.
-        resp_uin (int): Push response uin.
         svrip (int): Svrip from push packet.
         delete_messages (List[DelMsgInfo]): List of delete messages.
         push_token (Optional[bytes]): Push token from push packet.
@@ -88,7 +87,7 @@ def encode_push_response(
 
 
 async def handle_c2c_sync(
-    client: "Client", packet: IncomingPacket, _device
+    client: "Client", packet: IncomingPacket
 ) -> PushMsgCommand:
     """Handle C2C Message Sync.
 
@@ -116,7 +115,6 @@ async def handle_c2c_sync(
             client._session_id,
             client.uin,
             client._siginfo.d2key,
-            message.head.from_uin,
             push.push.svrip,
             push_token=push.push.push_token or None,
         )
@@ -139,7 +137,6 @@ async def handle_c2c_sync(
 async def handle_push_msg(
     client: "Client",
     packet: IncomingPacket,
-    device: Tuple[_DeviceInfo_t, ApkInfo],
 ) -> PushMsgCommand:
     """Handle Push Message Command.
 
@@ -148,7 +145,6 @@ async def handle_push_msg(
 
         com.tencent.mobileqq.app.MessageHandler.b
     """
-    device = device[0]
 
     push = PushMsgCommand.decode_response(
         packet.uin,
@@ -170,16 +166,15 @@ async def handle_push_msg(
                     client._session_id,
                     client.uin,
                     client._siginfo.d2key,
-                    client.uin,
                     push.push.svrip,
                     push_token=push.push.push_token or None,
                     service_type=1,
                     device_info=DeviceInfo(
                         net_type=1,
-                        dev_type=device.model,
-                        os_ver=device.version.release,
-                        vendor_name=device.vendor_name,
-                        vendor_os_name=device.vendor_os_name,
+                        dev_type=client.device.model,
+                        os_ver=client.device.version.release,
+                        vendor_name=client.device.vendor_name,
+                        vendor_os_name=client.device.vendor_os_name,
                     ),
                 )
                 await client.send(push.seq, "OnlinePush.RespPush", resp_packet)
@@ -195,7 +190,6 @@ async def handle_push_msg(
                 client._session_id,
                 client.uin,
                 client._siginfo.d2key,
-                message.head.from_uin,
                 push.push.svrip,
                 [delete_info],
                 push_token=push.push.push_token or None,
@@ -233,26 +227,30 @@ def _parse_poke(params: Sequence[TemplParam]) -> dict:
     return res
 
 
-"""def encode_resp_push_pkg(uin: int, svrip: int, seq: int, items: Sequence[DelMsgInfo]) -> bytes:
-    pkg = SvcRespPushMsg(
-        uin=uin,
-        del_infos=items,
-        svrip=svrip & 0xffffffff,
-        service_type=0
-    )
-    return RequestPacketVersion3(
-        servant_name="OnlinePush",
-        func_name="SvcRespPushMsg",
-        req_id=seq,
-        data=types.MAP({types.STRING("SvcRespPushMsg"): types.BYTES(SvcRespPushMsg.to_bytes(0, pkg))})
-    ).encode()
-"""
+# OnlinePush.SvcRespPushMsg
+# def encode_resp_push_pkg(
+#     uin: int, svrip: int, seq: int, items: Sequence[DelMsgInfo]
+# ) -> bytes:
+#     pkg = SvcRespPushMsg(
+#         uin=uin, del_infos=items, svrip=svrip & 0xFFFFFFFF, service_type=0
+#     )
+#     return RequestPacketVersion3(
+#         servant_name="OnlinePush",
+#         func_name="SvcRespPushMsg",
+#         req_id=seq,
+#         data=types.MAP(
+#             {
+#                 types.STRING("SvcRespPushMsg"): types.BYTES(
+#                     SvcRespPushMsg.to_bytes(0, pkg)
+#                 )
+#             }
+#         ),
+#     ).encode()
+
 
 # OnlinePush.ReqPush
 async def handle_req_push(
-    client: "Client",
-    packet: IncomingPacket,
-    device: Tuple[_DeviceInfo_t, ApkInfo],
+    client: "Client", packet: IncomingPacket
 ) -> PushMsgCommand:
     body = JceDecoder.decode_bytes(
         JceDecoder.decode_single(  # type: ignore
@@ -260,7 +258,12 @@ async def handle_req_push(
         )[1]["req"]["OnlinePushPack.SvcReqPushMsg"]
     )[0]
 
-    _uin, stime, push_type, content = body[0], body[1], body[2][0][2], body[2][0][6]
+    _uin, stime, push_type, content = (
+        body[0],
+        body[1],
+        body[2][0][2],
+        body[2][0][6],
+    )
 
     if push_type == 732:  # group
         gid = int.from_bytes(content[0:4], "big")
@@ -268,38 +271,37 @@ async def handle_req_push(
         if stype in (0x14, 0x11):
             notify = NotifyMsgBody.FromString(content[7:])
             if stype == 0x14:  # nudge
-                client.dispatch_event(events.NudgeEvent(
-                    **_parse_poke(notify.optGeneralGrayTip.msgTemplParam),
-                    group=gid
-                ))
+                client.dispatch_event(
+                    events.NudgeEvent(
+                        **_parse_poke(notify.optGeneralGrayTip.msgTemplParam),
+                        group=gid,
+                    )
+                )
             elif stype == 0x11:  # recall
                 msg = notify.optMsgRecall.recalledMsgList[0]
-                client.dispatch_event(events.MemberRecallMessageEvent(
-                    gid,
-                    notify.optMsgRecall.uin,
-                    notify.optMsgRecall.opType,
-                    msg.authorUin,
-                    msg.msgRandom,
-                    msg.seq,
-                    msg.time
-                ))
-        elif stype == 0x0c:  # mute event
+                client.dispatch_event(
+                    events.MemberRecallMessageEvent(
+                        gid,
+                        notify.optMsgRecall.uin,
+                        notify.optMsgRecall.opType,
+                        msg.authorUin,
+                        msg.msgRandom,
+                        msg.seq,
+                        msg.time,
+                    )
+                )
+        elif stype == 0x0C:  # mute event
             operator = int.from_bytes(content[6:10], "big", signed=False)
             target = int.from_bytes(content[16:20], "big", signed=False)
             duration = int.from_bytes(content[20:24], "big", signed=False)
             if duration > 0:  # muted
-                client.dispatch_event(events.MemberMutedEvent(
-                    gid,
-                    operator,
-                    target,
-                    duration
-                ))
+                client.dispatch_event(
+                    events.MemberMutedEvent(gid, operator, target, duration)
+                )
             else:
-                client.dispatch_event(events.MemberUnMutedEvent(
-                    gid,
-                    operator,
-                    target
-                ))
+                client.dispatch_event(
+                    events.MemberUnMutedEvent(gid, operator, target)
+                )
     elif push_type == 528:
         pass
         # TODO: parse friend event
@@ -312,21 +314,13 @@ async def handle_req_push(
             client._session_id,
             _uin,
             client._siginfo.d2key,
-            client.uin,
-            body[3] & 0xffffffff,
-            [DelMsgInfo(
-                from_uin=_uin,
-                msg_seq=body[1],
-                msg_time=stime
-            )]
-        )
+            body[3] & 0xFFFFFFFF,
+            [DelMsgInfo(from_uin=_uin, msg_seq=body[1], msg_time=stime)],
+        ),
     )
 
     return PushMsgCommand(
-        packet.uin,
-        packet.seq,
-        packet.ret_code,
-        packet.command_name
+        packet.uin, packet.seq, packet.ret_code, packet.command_name
     )
 
 
diff --git a/cai/client/status_service/__init__.py b/cai/client/status_service/__init__.py
index 40889b9b..b2768079 100644
--- a/cai/client/status_service/__init__.py
+++ b/cai/client/status_service/__init__.py
@@ -296,7 +296,7 @@ def encode_set_status(
 
 
 async def handle_register_response(
-    client: "Client", packet: IncomingPacket, _device
+    client: "Client", packet: IncomingPacket
 ) -> SvcRegisterResponse:
     response = SvcRegisterResponse.decode_response(
         packet.uin,
@@ -378,7 +378,7 @@ def encode_force_offline_response(
 
 
 async def handle_request_offline(
-    client: "Client", packet: IncomingPacket, device: Tuple[DeviceInfo, ApkInfo]
+    client: "Client", packet: IncomingPacket
 ) -> MSFForceOfflineCommand:
     request = MSFForceOfflineCommand.decode_response(
         packet.uin,
@@ -404,8 +404,8 @@ async def handle_request_offline(
             client._siginfo.d2key,
             request.request.uin,
             request.request.seq_no,
-            device[1].sub_app_id,
-            device[0],
+            client.apk_info.sub_app_id,
+            client.device,
         )
         await client.send(seq, "StatSvc.RspMSFForceOffline", resp_packet)
     client._status = OnlineStatus.Offline
diff --git a/cai/client/wtlogin/__init__.py b/cai/client/wtlogin/__init__.py
index e7d87742..65783cc9 100644
--- a/cai/client/wtlogin/__init__.py
+++ b/cai/client/wtlogin/__init__.py
@@ -768,17 +768,15 @@ def encode_exchange_emp_15(
 
 
 async def handle_oicq_response(
-    client: "Client", packet: IncomingPacket, dev: Tuple[DeviceInfo, ApkInfo]
+    client: "Client", packet: IncomingPacket
 ) -> OICQResponse:
-    device, apk_info = dev
-
     response = OICQResponse.decode_response(
         packet.uin,
         packet.seq,
         packet.ret_code,
         packet.command_name,
         packet.data,
-        device.tgtgt,
+        client.device.tgtgt,
     )
     if not isinstance(response, UnknownLoginStatus):
         return response
@@ -792,7 +790,7 @@ async def handle_oicq_response(
         ).encode()
         client._t402 = response.t402
         client._siginfo.g = md5(
-            device.guid + client._siginfo.dpwd + client._t402
+            client.device.guid + client._siginfo.dpwd + client._t402
         ).digest()
 
     if isinstance(response, LoginSuccess):
@@ -849,7 +847,7 @@ async def handle_oicq_response(
             client._password_md5 + bytes(4) + struct.pack(">I", client._uin)
         ).digest()
         decrypted = qqtea_decrypt(response.encrypted_a1, key)
-        device.tgtgt = decrypted[51:67]
+        client.device.tgtgt = decrypted[51:67]
     elif isinstance(response, NeedCaptcha):
         client._t104 = response.t104 or client._t104
     elif isinstance(response, DeviceLocked):

From 4220e75503f67dd1e80499796c60f8aabfafe4b6 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Fri, 8 Apr 2022 13:57:56 +0800
Subject: [PATCH 070/113] :arrow_up: upgrade protobuf gen

---
 cai/client/highway/decoders.py                |   36 +-
 cai/client/highway/encoders.py                |   70 +-
 cai/client/online_push/__init__.py            |    6 +-
 cai/client/wtlogin/tlv.py                     |    4 +-
 cai/connection/__init__.py                    |    5 +-
 cai/pb/highway/long_msg/long_msg_pb2.py       |   52 +-
 cai/pb/highway/multi_msg/multi_msg_pb2.py     |   46 +-
 cai/pb/highway/protocol/highway_head_pb2.py   |  106 +-
 cai/pb/im/cs/__init__.py                      |   16 +
 cai/pb/im/cs/cmd0x388/__init__.py             |    1 +
 cai/pb/im/cs/cmd0x388/cmd0x388.proto          |  255 +
 cai/pb/im/cs/cmd0x388/cmd0x388_pb2.py         |  224 +
 cai/pb/im/cs/cmd0x388/cmd0x388_pb2.pyi        |  802 +++
 cai/pb/im/msg/common/common_pb2.py            |  258 +-
 cai/pb/im/msg/common/common_pb2.pyi           |  105 +-
 cai/pb/im/msg/msg/msg_pb2.py                  |  510 +-
 cai/pb/im/msg/msg/msg_pb2.pyi                 |  170 +-
 cai/pb/im/msg/msg_body/msg_body_pb2.py        | 5696 +----------------
 cai/pb/im/msg/msg_body/msg_body_pb2.pyi       | 2641 ++++----
 cai/pb/im/msg/msg_head/msg_head_pb2.py        | 1091 +---
 cai/pb/im/msg/msg_head/msg_head_pb2.pyi       |  480 +-
 cai/pb/im/msg/obj_msg/obj_msg_pb2.py          |  275 +-
 cai/pb/im/msg/obj_msg/obj_msg_pb2.pyi         |  111 +-
 cai/pb/im/msg/receipt/receipt_pb2.py          |  197 +-
 cai/pb/im/msg/receipt/receipt_pb2.pyi         |   64 +-
 .../im/msg/service/comm_elem/comm_elem_pb2.py | 2105 +-----
 .../msg/service/comm_elem/comm_elem_pb2.pyi   |  925 ++-
 cai/pb/im/oidb/cmd0x388/__init__.py           |    0
 cai/pb/im/oidb/cmd0x388/cmd0x388.proto        |  255 -
 cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.py       |  225 -
 cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.pyi      |  799 ---
 cai/pb/im/oidb/cmd0x769/cmd0x769.proto        |    2 +-
 cai/pb/im/oidb/cmd0x769/cmd0x769_pb2.py       |  877 +--
 cai/pb/im/oidb/cmd0x769/cmd0x769_pb2.pyi      |  334 +-
 cai/pb/im/oidb/cmd0xd50/cmd0xd50_pb2.py       |  553 +-
 cai/pb/im/oidb/cmd0xd50/cmd0xd50_pb2.pyi      |  274 +-
 cai/pb/im/oidb/group0x857/group0x857_pb2.py   |   52 +-
 cai/pb/msf/msg/comm/comm_pb2.py               | 1071 +---
 cai/pb/msf/msg/comm/comm_pb2.pyi              |  461 +-
 cai/pb/msf/msg/ctrl/ctrl_pb2.py               |  143 +-
 cai/pb/msf/msg/ctrl/ctrl_pb2.pyi              |   58 +-
 cai/pb/msf/msg/onlinepush/onlinepush_pb2.py   |   87 +-
 cai/pb/msf/msg/onlinepush/onlinepush_pb2.pyi  |   32 +-
 cai/pb/msf/msg/svc/svc_pb2.py                 | 5401 +---------------
 cai/pb/msf/msg/svc/svc_pb2.pyi                | 2130 +++---
 cai/pb/wtlogin/data_pb2.py                    |  184 +-
 cai/pb/wtlogin/data_pb2.pyi                   |   82 +-
 47 files changed, 6050 insertions(+), 23221 deletions(-)
 create mode 100644 cai/pb/im/cs/__init__.py
 create mode 100644 cai/pb/im/cs/cmd0x388/__init__.py
 create mode 100644 cai/pb/im/cs/cmd0x388/cmd0x388.proto
 create mode 100644 cai/pb/im/cs/cmd0x388/cmd0x388_pb2.py
 create mode 100644 cai/pb/im/cs/cmd0x388/cmd0x388_pb2.pyi
 delete mode 100644 cai/pb/im/oidb/cmd0x388/__init__.py
 delete mode 100644 cai/pb/im/oidb/cmd0x388/cmd0x388.proto
 delete mode 100644 cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.py
 delete mode 100644 cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.pyi

diff --git a/cai/client/highway/decoders.py b/cai/client/highway/decoders.py
index da5e6734..0fd6ee01 100644
--- a/cai/client/highway/decoders.py
+++ b/cai/client/highway/decoders.py
@@ -1,52 +1,52 @@
-from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import D388RspBody
+from cai.pb.im.cs.cmd0x388 import RspBody
 
 from .utils import itoa
 from .models import UploadResponse, ImageUploadResponse
 
 
 def decode_upload_image_resp(data: bytes) -> ImageUploadResponse:
-    pkg = decode_d388_rsp(data).tryupImgRsp[0]
+    pkg = decode_d388_rsp(data).tryup_img_rsp[0]
     if pkg.result != 0:
         return ImageUploadResponse(
-            resultCode=pkg.result, message=pkg.failMsg.decode()
+            resultCode=pkg.result, message=pkg.fail_msg.decode()
         )
 
-    if pkg.fileExit:
-        if pkg.imgInfo:
-            info = pkg.imgInfo
+    if pkg.file_exit:
+        if pkg.img_info:
+            info = pkg.img_info
             # fuck: pkg.fileId != pkg.fileid
             return ImageUploadResponse(
                 isExists=True,
                 fileId=pkg.fileid,
                 hasMetaData=True,
-                fileType=info.fileType,
-                width=info.fileWidth,
-                height=info.fileHeight,
+                fileType=info.file_type,
+                width=info.file_width,
+                height=info.file_height,
             )
         else:
             return ImageUploadResponse(isExists=True, fileId=pkg.fileid)
     return ImageUploadResponse(
         isExists=False,
-        uploadAddr=[(itoa(a), p) for a, p in zip(pkg.upIp, pkg.upPort)],
-        uploadKey=pkg.upUkey,
+        uploadAddr=[(itoa(a), p) for a, p in zip(pkg.up_ip, pkg.up_port)],
+        uploadKey=pkg.up_ukey,
     )
 
 
 def decode_upload_ptt_resp(data: bytes) -> UploadResponse:
-    pkg = decode_d388_rsp(data).tryupPttRsp[0]
+    pkg = decode_d388_rsp(data).tryup_ptt_rsp[0]
     if pkg.result != 0:
         return UploadResponse(
-            resultCode=pkg.result, message=pkg.failMsg.decode()
+            resultCode=pkg.result, message=pkg.fail_msg.decode()
         )
 
-    if pkg.fileExit:
+    if pkg.file_exit:
         return UploadResponse(isExists=True, fileId=pkg.fileid)
     return UploadResponse(
         isExists=False,
-        uploadAddr=[(itoa(a), p) for a, p in zip(pkg.upIp, pkg.upPort)],
-        uploadKey=pkg.upUkey,
+        uploadAddr=[(itoa(a), p) for a, p in zip(pkg.up_ip, pkg.up_port)],
+        uploadKey=pkg.up_ukey,
     )
 
 
-def decode_d388_rsp(data: bytes) -> D388RspBody:
-    return D388RspBody.FromString(data)
+def decode_d388_rsp(data: bytes) -> RspBody:
+    return RspBody.FromString(data)
diff --git a/cai/client/highway/encoders.py b/cai/client/highway/encoders.py
index d96c5859..30425329 100644
--- a/cai/client/highway/encoders.py
+++ b/cai/client/highway/encoders.py
@@ -1,57 +1,53 @@
-from cai.pb.im.oidb.cmd0x388.cmd0x388_pb2 import (
-    D388ReqBody,
-    TryUpImgReq,
-    TryUpPttReq,
-)
+from cai.pb.im.cs.cmd0x388 import ReqBody, TryUpImgReq, TryUpPttReq
 
 
 def encode_d388_req(
     group_code: int, uin: int, md5: bytes, size: int, subcmd: int
-) -> D388ReqBody:
+) -> ReqBody:
     img, ptt = None, None
     if subcmd == 1:  # upload img
         fn = md5.hex().upper() + ".jpg"
         img = [
             TryUpImgReq(
-                groupCode=group_code,
-                srcUin=uin,
-                fileName=fn.encode(),
-                fileMd5=md5,
-                fileSize=size,
-                fileId=0,
-                srcTerm=5,
-                platformType=9,
-                buType=1,
-                picType=1003,
-                picWidth=1920,
-                picHeight=903,
-                buildVer=b"8.8.50.2324",
-                appPicType=1052,
-                originalPic=1,
-                srvUpload=0,
+                group_code=group_code,
+                src_uin=uin,
+                file_name=fn.encode(),
+                file_md5=md5,
+                file_size=size,
+                file_id=0,
+                src_term=5,
+                platform_type=9,
+                bu_type=1,
+                pic_type=1003,
+                pic_width=1920,
+                pic_height=903,
+                build_ver=b"8.8.50.2324",
+                app_pic_type=1052,
+                original_pic=1,
+                srv_upload=0,
             )
         ]
     elif subcmd == 3:  # voice
         ptt = [
             TryUpPttReq(
-                groupCode=group_code,
-                srcUin=uin,
-                fileMd5=md5,
-                fileName=(md5.hex().upper() + ".amr").encode(),
-                fileSize=size,
-                voiceLength=size,
-                voiceType=1,
+                group_code=group_code,
+                src_uin=uin,
+                file_md5=md5,
+                file_name=(md5.hex().upper() + ".amr").encode(),
+                file_size=size,
+                voice_length=size,
+                voice_type=1,
                 codec=0,
-                srcTerm=5,
-                platformType=9,
-                buType=4,
-                innerIp=0,
-                buildVer=b"8.8.50.2324",
-                newUpChan=True,
+                src_term=5,
+                platform_type=9,
+                bu_type=4,
+                inner_ip=0,
+                build_ver=b"8.8.50.2324",
+                new_up_chan=True,
             )
         ]
     else:
         ValueError("unsupported subcmd:", subcmd)
-    return D388ReqBody(
-        netType=8, subcmd=subcmd, tryupImgReq=img, tryupPttReq=ptt
+    return ReqBody(
+        net_type=8, subcmd=subcmd, tryup_img_req=img, tryup_ptt_req=ptt
     )
diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index bec45a51..785f700a 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -10,18 +10,16 @@
 """
 from typing import TYPE_CHECKING, List, Tuple, Optional, Sequence
 
-from jce import JceStruct, JceDecoder, JceEncoder, types
+from jce import JceStruct, JceDecoder, types
 
 from cai.log import logger
+from cai.client import events
 from cai.utils.binary import Packet
 from cai.client.message_service import MESSAGE_DECODERS
 from cai.client.packet import UniPacket, IncomingPacket
-from cai.settings.device import DeviceInfo as _DeviceInfo_t
 from cai.utils.jce import RequestPacket, RequestPacketVersion3
 from cai.pb.im.oidb.group0x857.group0x857_pb2 import TemplParam, NotifyMsgBody
 
-from .. import events
-from ...settings.protocol import ApkInfo
 from .jce import DelMsgInfo, DeviceInfo, SvcRespPushMsg
 from .command import PushMsg, PushMsgError, PushMsgCommand
 
diff --git a/cai/client/wtlogin/tlv.py b/cai/client/wtlogin/tlv.py
index 4cbab73e..a6ec6070 100644
--- a/cai/client/wtlogin/tlv.py
+++ b/cai/client/wtlogin/tlv.py
@@ -12,7 +12,7 @@
 import random
 import struct
 from hashlib import md5
-from typing import Any, Dict, List, Union
+from typing import Any, Dict, List, Union, Optional
 
 from rtea import qqtea_decrypt, qqtea_encrypt
 
@@ -605,7 +605,7 @@ class TlvDecoder:
     def decode(
         cls,
         data: Union[bytes, bytearray],
-        tgtgt: bytes = None,
+        tgtgt: Optional[bytes] = None,
         offset: int = 0,
         tag_size: int = 2,
     ) -> Dict[int, Any]:
diff --git a/cai/connection/__init__.py b/cai/connection/__init__.py
index 51fd42ab..750a9499 100644
--- a/cai/connection/__init__.py
+++ b/cai/connection/__init__.py
@@ -62,9 +62,8 @@ def closed(self) -> bool:
         # return self._writer is None
         return self._closed.is_set()
 
-    @property
     async def wait_closed(self):
-        return self._closed.wait
+        await self._closed.wait()
 
     async def __aenter__(self):
         await self._connect()
@@ -96,12 +95,12 @@ async def _connect(self):
         self._closed.clear()
 
     async def close(self):
-        self._closed.set()
         if self._writer:
             self._writer.close()
             await self._writer.wait_closed()
         self._writer = None
         self._reader = None
+        self._closed.set()
 
     async def reconnect(self) -> None:
         await self.close()
diff --git a/cai/pb/highway/long_msg/long_msg_pb2.py b/cai/pb/highway/long_msg/long_msg_pb2.py
index aac6da9d..dbff969d 100644
--- a/cai/pb/highway/long_msg/long_msg_pb2.py
+++ b/cai/pb/highway/long_msg/long_msg_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: long_msg.proto
+# source: cai/pb/highway/long_msg/long_msg.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -14,7 +14,7 @@
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0elong_msg.proto\"5\n\x10LongMsgDeleteReq\x12\x10\n\x08msgResid\x18\x01 \x01(\x0c\x12\x0f\n\x07msgType\x18\x02 \x01(\x05\"4\n\x10LongMsgDeleteRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\x0c\"V\n\x0eLongMsgDownReq\x12\x0e\n\x06srcUin\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\x0c\x12\x0f\n\x07msgType\x18\x03 \x01(\x05\x12\x11\n\tneedCache\x18\x04 \x01(\x05\"F\n\x0eLongMsgDownRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\x0c\x12\x12\n\nmsgContent\x18\x03 \x01(\x0c\"\x89\x01\n\x0cLongMsgUpReq\x12\x0f\n\x07msgType\x18\x01 \x01(\x05\x12\x0e\n\x06\x64stUin\x18\x02 \x01(\x03\x12\r\n\x05msgId\x18\x03 \x01(\x05\x12\x12\n\nmsgContent\x18\x04 \x01(\x0c\x12\x11\n\tstoreType\x18\x05 \x01(\x05\x12\x0f\n\x07msgUkey\x18\x06 \x01(\x0c\x12\x11\n\tneedCache\x18\x07 \x01(\x05\"?\n\x0cLongMsgUpRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\r\n\x05msgId\x18\x02 \x01(\x05\x12\x10\n\x08msgResid\x18\x03 \x01(\x0c\"\xc4\x01\n\x0bLongReqBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12\x10\n\x08termType\x18\x02 \x01(\x05\x12\x14\n\x0cplatformType\x18\x03 \x01(\x05\x12\x1f\n\x08msgUpReq\x18\x04 \x03(\x0b\x32\r.LongMsgUpReq\x12#\n\nmsgDownReq\x18\x05 \x03(\x0b\x32\x0f.LongMsgDownReq\x12$\n\tmsgDelReq\x18\x06 \x03(\x0b\x32\x11.LongMsgDeleteReq\x12\x11\n\tagentType\x18\n \x01(\x05\"\x89\x01\n\x0bLongRspBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12\x1f\n\x08msgUpRsp\x18\x02 \x03(\x0b\x32\r.LongMsgUpRsp\x12#\n\nmsgDownRsp\x18\x03 \x03(\x0b\x32\x0f.LongMsgDownRsp\x12$\n\tmsgDelRsp\x18\x04 \x03(\x0b\x32\x11.LongMsgDeleteRspB,Z*github.com/Mrs4s/MiraiGo/client/pb/longmsgb\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&cai/pb/highway/long_msg/long_msg.proto\"5\n\x10LongMsgDeleteReq\x12\x10\n\x08msgResid\x18\x01 \x01(\x0c\x12\x0f\n\x07msgType\x18\x02 \x01(\x05\"4\n\x10LongMsgDeleteRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\x0c\"V\n\x0eLongMsgDownReq\x12\x0e\n\x06srcUin\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\x0c\x12\x0f\n\x07msgType\x18\x03 \x01(\x05\x12\x11\n\tneedCache\x18\x04 \x01(\x05\"F\n\x0eLongMsgDownRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\x0c\x12\x12\n\nmsgContent\x18\x03 \x01(\x0c\"\x89\x01\n\x0cLongMsgUpReq\x12\x0f\n\x07msgType\x18\x01 \x01(\x05\x12\x0e\n\x06\x64stUin\x18\x02 \x01(\x03\x12\r\n\x05msgId\x18\x03 \x01(\x05\x12\x12\n\nmsgContent\x18\x04 \x01(\x0c\x12\x11\n\tstoreType\x18\x05 \x01(\x05\x12\x0f\n\x07msgUkey\x18\x06 \x01(\x0c\x12\x11\n\tneedCache\x18\x07 \x01(\x05\"?\n\x0cLongMsgUpRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\r\n\x05msgId\x18\x02 \x01(\x05\x12\x10\n\x08msgResid\x18\x03 \x01(\x0c\"\xc4\x01\n\x0bLongReqBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12\x10\n\x08termType\x18\x02 \x01(\x05\x12\x14\n\x0cplatformType\x18\x03 \x01(\x05\x12\x1f\n\x08msgUpReq\x18\x04 \x03(\x0b\x32\r.LongMsgUpReq\x12#\n\nmsgDownReq\x18\x05 \x03(\x0b\x32\x0f.LongMsgDownReq\x12$\n\tmsgDelReq\x18\x06 \x03(\x0b\x32\x11.LongMsgDeleteReq\x12\x11\n\tagentType\x18\n \x01(\x05\"\x89\x01\n\x0bLongRspBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12\x1f\n\x08msgUpRsp\x18\x02 \x03(\x0b\x32\r.LongMsgUpRsp\x12#\n\nmsgDownRsp\x18\x03 \x03(\x0b\x32\x0f.LongMsgDownRsp\x12$\n\tmsgDelRsp\x18\x04 \x03(\x0b\x32\x11.LongMsgDeleteRspB,Z*github.com/Mrs4s/MiraiGo/client/pb/longmsgb\x06proto3')
 
 
 
@@ -28,56 +28,56 @@
 _LONGRSPBODY = DESCRIPTOR.message_types_by_name['LongRspBody']
 LongMsgDeleteReq = _reflection.GeneratedProtocolMessageType('LongMsgDeleteReq', (_message.Message,), {
   'DESCRIPTOR' : _LONGMSGDELETEREQ,
-  '__module__' : 'long_msg_pb2'
+  '__module__' : 'cai.pb.highway.long_msg.long_msg_pb2'
   # @@protoc_insertion_point(class_scope:LongMsgDeleteReq)
   })
 _sym_db.RegisterMessage(LongMsgDeleteReq)
 
 LongMsgDeleteRsp = _reflection.GeneratedProtocolMessageType('LongMsgDeleteRsp', (_message.Message,), {
   'DESCRIPTOR' : _LONGMSGDELETERSP,
-  '__module__' : 'long_msg_pb2'
+  '__module__' : 'cai.pb.highway.long_msg.long_msg_pb2'
   # @@protoc_insertion_point(class_scope:LongMsgDeleteRsp)
   })
 _sym_db.RegisterMessage(LongMsgDeleteRsp)
 
 LongMsgDownReq = _reflection.GeneratedProtocolMessageType('LongMsgDownReq', (_message.Message,), {
   'DESCRIPTOR' : _LONGMSGDOWNREQ,
-  '__module__' : 'long_msg_pb2'
+  '__module__' : 'cai.pb.highway.long_msg.long_msg_pb2'
   # @@protoc_insertion_point(class_scope:LongMsgDownReq)
   })
 _sym_db.RegisterMessage(LongMsgDownReq)
 
 LongMsgDownRsp = _reflection.GeneratedProtocolMessageType('LongMsgDownRsp', (_message.Message,), {
   'DESCRIPTOR' : _LONGMSGDOWNRSP,
-  '__module__' : 'long_msg_pb2'
+  '__module__' : 'cai.pb.highway.long_msg.long_msg_pb2'
   # @@protoc_insertion_point(class_scope:LongMsgDownRsp)
   })
 _sym_db.RegisterMessage(LongMsgDownRsp)
 
 LongMsgUpReq = _reflection.GeneratedProtocolMessageType('LongMsgUpReq', (_message.Message,), {
   'DESCRIPTOR' : _LONGMSGUPREQ,
-  '__module__' : 'long_msg_pb2'
+  '__module__' : 'cai.pb.highway.long_msg.long_msg_pb2'
   # @@protoc_insertion_point(class_scope:LongMsgUpReq)
   })
 _sym_db.RegisterMessage(LongMsgUpReq)
 
 LongMsgUpRsp = _reflection.GeneratedProtocolMessageType('LongMsgUpRsp', (_message.Message,), {
   'DESCRIPTOR' : _LONGMSGUPRSP,
-  '__module__' : 'long_msg_pb2'
+  '__module__' : 'cai.pb.highway.long_msg.long_msg_pb2'
   # @@protoc_insertion_point(class_scope:LongMsgUpRsp)
   })
 _sym_db.RegisterMessage(LongMsgUpRsp)
 
 LongReqBody = _reflection.GeneratedProtocolMessageType('LongReqBody', (_message.Message,), {
   'DESCRIPTOR' : _LONGREQBODY,
-  '__module__' : 'long_msg_pb2'
+  '__module__' : 'cai.pb.highway.long_msg.long_msg_pb2'
   # @@protoc_insertion_point(class_scope:LongReqBody)
   })
 _sym_db.RegisterMessage(LongReqBody)
 
 LongRspBody = _reflection.GeneratedProtocolMessageType('LongRspBody', (_message.Message,), {
   'DESCRIPTOR' : _LONGRSPBODY,
-  '__module__' : 'long_msg_pb2'
+  '__module__' : 'cai.pb.highway.long_msg.long_msg_pb2'
   # @@protoc_insertion_point(class_scope:LongRspBody)
   })
 _sym_db.RegisterMessage(LongRspBody)
@@ -86,20 +86,20 @@
 
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = b'Z*github.com/Mrs4s/MiraiGo/client/pb/longmsg'
-  _LONGMSGDELETEREQ._serialized_start=18
-  _LONGMSGDELETEREQ._serialized_end=71
-  _LONGMSGDELETERSP._serialized_start=73
-  _LONGMSGDELETERSP._serialized_end=125
-  _LONGMSGDOWNREQ._serialized_start=127
-  _LONGMSGDOWNREQ._serialized_end=213
-  _LONGMSGDOWNRSP._serialized_start=215
-  _LONGMSGDOWNRSP._serialized_end=285
-  _LONGMSGUPREQ._serialized_start=288
-  _LONGMSGUPREQ._serialized_end=425
-  _LONGMSGUPRSP._serialized_start=427
-  _LONGMSGUPRSP._serialized_end=490
-  _LONGREQBODY._serialized_start=493
-  _LONGREQBODY._serialized_end=689
-  _LONGRSPBODY._serialized_start=692
-  _LONGRSPBODY._serialized_end=829
+  _LONGMSGDELETEREQ._serialized_start=42
+  _LONGMSGDELETEREQ._serialized_end=95
+  _LONGMSGDELETERSP._serialized_start=97
+  _LONGMSGDELETERSP._serialized_end=149
+  _LONGMSGDOWNREQ._serialized_start=151
+  _LONGMSGDOWNREQ._serialized_end=237
+  _LONGMSGDOWNRSP._serialized_start=239
+  _LONGMSGDOWNRSP._serialized_end=309
+  _LONGMSGUPREQ._serialized_start=312
+  _LONGMSGUPREQ._serialized_end=449
+  _LONGMSGUPRSP._serialized_start=451
+  _LONGMSGUPRSP._serialized_end=514
+  _LONGREQBODY._serialized_start=517
+  _LONGREQBODY._serialized_end=713
+  _LONGRSPBODY._serialized_start=716
+  _LONGRSPBODY._serialized_end=853
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/highway/multi_msg/multi_msg_pb2.py b/cai/pb/highway/multi_msg/multi_msg_pb2.py
index 73455d32..a5d6dba2 100644
--- a/cai/pb/highway/multi_msg/multi_msg_pb2.py
+++ b/cai/pb/highway/multi_msg/multi_msg_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: multi_msg.proto
+# source: cai/pb/highway/multi_msg/multi_msg.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -14,7 +14,7 @@
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0fmulti_msg.proto\" \n\tExternMsg\x12\x13\n\x0b\x63hannelType\x18\x01 \x01(\x05\"I\n\x14MultiMsgApplyDownReq\x12\x10\n\x08msgResid\x18\x01 \x01(\x0c\x12\x0f\n\x07msgType\x18\x02 \x01(\x05\x12\x0e\n\x06srcUin\x18\x03 \x01(\x03\"\xe1\x01\n\x14MultiMsgApplyDownRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x15\n\rthumbDownPara\x18\x02 \x01(\x0c\x12\x0e\n\x06msgKey\x18\x03 \x01(\x0c\x12\x14\n\x0cuint32DownIp\x18\x04 \x03(\x05\x12\x16\n\x0euint32DownPort\x18\x05 \x03(\x05\x12\x10\n\x08msgResid\x18\x06 \x01(\x0c\x12!\n\rmsgExternInfo\x18\x07 \x01(\x0b\x32\n.ExternMsg\x12\x15\n\rbytesDownIpV6\x18\x08 \x03(\x0c\x12\x18\n\x10uint32DownV6Port\x18\t \x03(\x05\"g\n\x12MultiMsgApplyUpReq\x12\x0e\n\x06\x64stUin\x18\x01 \x01(\x03\x12\x0f\n\x07msgSize\x18\x02 \x01(\x03\x12\x0e\n\x06msgMd5\x18\x03 \x01(\x0c\x12\x0f\n\x07msgType\x18\x04 \x01(\x05\x12\x0f\n\x07\x61pplyId\x18\x05 \x01(\x05\"\x97\x02\n\x12MultiMsgApplyUpRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\t\x12\x0f\n\x07msgUkey\x18\x03 \x01(\x0c\x12\x12\n\nuint32UpIp\x18\x04 \x03(\x05\x12\x14\n\x0cuint32UpPort\x18\x05 \x03(\x05\x12\x11\n\tblockSize\x18\x06 \x01(\x03\x12\x10\n\x08upOffset\x18\x07 \x01(\x03\x12\x0f\n\x07\x61pplyId\x18\x08 \x01(\x05\x12\x0e\n\x06msgKey\x18\t \x01(\x0c\x12\x0e\n\x06msgSig\x18\n \x01(\x0c\x12!\n\rmsgExternInfo\x18\x0b \x01(\x0b\x32\n.ExternMsg\x12\x13\n\x0b\x62ytesUpIpV6\x18\x0c \x03(\x0c\x12\x16\n\x0euint32UpV6Port\x18\r \x03(\x05\"\xf7\x01\n\x0cMultiReqBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12\x10\n\x08termType\x18\x02 \x01(\x05\x12\x14\n\x0cplatformType\x18\x03 \x01(\x05\x12\x0f\n\x07netType\x18\x04 \x01(\x05\x12\x10\n\x08\x62uildVer\x18\x05 \x01(\t\x12/\n\x12multimsgApplyupReq\x18\x06 \x03(\x0b\x32\x13.MultiMsgApplyUpReq\x12\x33\n\x14multimsgApplydownReq\x18\x07 \x03(\x0b\x32\x15.MultiMsgApplyDownReq\x12\x0e\n\x06\x62uType\x18\x08 \x01(\x05\x12\x16\n\x0ereqChannelType\x18\t \x01(\x05\"\x84\x01\n\x0cMultiRspBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12/\n\x12multimsgApplyupRsp\x18\x02 \x03(\x0b\x32\x13.MultiMsgApplyUpRsp\x12\x33\n\x14multimsgApplydownRsp\x18\x03 \x03(\x0b\x32\x15.MultiMsgApplyDownRspB.Z,github.com/Mrs4s/MiraiGo/client/pb/multi_msgb\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(cai/pb/highway/multi_msg/multi_msg.proto\" \n\tExternMsg\x12\x13\n\x0b\x63hannelType\x18\x01 \x01(\x05\"I\n\x14MultiMsgApplyDownReq\x12\x10\n\x08msgResid\x18\x01 \x01(\x0c\x12\x0f\n\x07msgType\x18\x02 \x01(\x05\x12\x0e\n\x06srcUin\x18\x03 \x01(\x03\"\xe1\x01\n\x14MultiMsgApplyDownRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x15\n\rthumbDownPara\x18\x02 \x01(\x0c\x12\x0e\n\x06msgKey\x18\x03 \x01(\x0c\x12\x14\n\x0cuint32DownIp\x18\x04 \x03(\x05\x12\x16\n\x0euint32DownPort\x18\x05 \x03(\x05\x12\x10\n\x08msgResid\x18\x06 \x01(\x0c\x12!\n\rmsgExternInfo\x18\x07 \x01(\x0b\x32\n.ExternMsg\x12\x15\n\rbytesDownIpV6\x18\x08 \x03(\x0c\x12\x18\n\x10uint32DownV6Port\x18\t \x03(\x05\"g\n\x12MultiMsgApplyUpReq\x12\x0e\n\x06\x64stUin\x18\x01 \x01(\x03\x12\x0f\n\x07msgSize\x18\x02 \x01(\x03\x12\x0e\n\x06msgMd5\x18\x03 \x01(\x0c\x12\x0f\n\x07msgType\x18\x04 \x01(\x05\x12\x0f\n\x07\x61pplyId\x18\x05 \x01(\x05\"\x97\x02\n\x12MultiMsgApplyUpRsp\x12\x0e\n\x06result\x18\x01 \x01(\x05\x12\x10\n\x08msgResid\x18\x02 \x01(\t\x12\x0f\n\x07msgUkey\x18\x03 \x01(\x0c\x12\x12\n\nuint32UpIp\x18\x04 \x03(\x05\x12\x14\n\x0cuint32UpPort\x18\x05 \x03(\x05\x12\x11\n\tblockSize\x18\x06 \x01(\x03\x12\x10\n\x08upOffset\x18\x07 \x01(\x03\x12\x0f\n\x07\x61pplyId\x18\x08 \x01(\x05\x12\x0e\n\x06msgKey\x18\t \x01(\x0c\x12\x0e\n\x06msgSig\x18\n \x01(\x0c\x12!\n\rmsgExternInfo\x18\x0b \x01(\x0b\x32\n.ExternMsg\x12\x13\n\x0b\x62ytesUpIpV6\x18\x0c \x03(\x0c\x12\x16\n\x0euint32UpV6Port\x18\r \x03(\x05\"\xf7\x01\n\x0cMultiReqBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12\x10\n\x08termType\x18\x02 \x01(\x05\x12\x14\n\x0cplatformType\x18\x03 \x01(\x05\x12\x0f\n\x07netType\x18\x04 \x01(\x05\x12\x10\n\x08\x62uildVer\x18\x05 \x01(\t\x12/\n\x12multimsgApplyupReq\x18\x06 \x03(\x0b\x32\x13.MultiMsgApplyUpReq\x12\x33\n\x14multimsgApplydownReq\x18\x07 \x03(\x0b\x32\x15.MultiMsgApplyDownReq\x12\x0e\n\x06\x62uType\x18\x08 \x01(\x05\x12\x16\n\x0ereqChannelType\x18\t \x01(\x05\"\x84\x01\n\x0cMultiRspBody\x12\x0e\n\x06subcmd\x18\x01 \x01(\x05\x12/\n\x12multimsgApplyupRsp\x18\x02 \x03(\x0b\x32\x13.MultiMsgApplyUpRsp\x12\x33\n\x14multimsgApplydownRsp\x18\x03 \x03(\x0b\x32\x15.MultiMsgApplyDownRspB.Z,github.com/Mrs4s/MiraiGo/client/pb/multi_msgb\x06proto3')
 
 
 
@@ -27,49 +27,49 @@
 _MULTIRSPBODY = DESCRIPTOR.message_types_by_name['MultiRspBody']
 ExternMsg = _reflection.GeneratedProtocolMessageType('ExternMsg', (_message.Message,), {
   'DESCRIPTOR' : _EXTERNMSG,
-  '__module__' : 'multi_msg_pb2'
+  '__module__' : 'cai.pb.highway.multi_msg.multi_msg_pb2'
   # @@protoc_insertion_point(class_scope:ExternMsg)
   })
 _sym_db.RegisterMessage(ExternMsg)
 
 MultiMsgApplyDownReq = _reflection.GeneratedProtocolMessageType('MultiMsgApplyDownReq', (_message.Message,), {
   'DESCRIPTOR' : _MULTIMSGAPPLYDOWNREQ,
-  '__module__' : 'multi_msg_pb2'
+  '__module__' : 'cai.pb.highway.multi_msg.multi_msg_pb2'
   # @@protoc_insertion_point(class_scope:MultiMsgApplyDownReq)
   })
 _sym_db.RegisterMessage(MultiMsgApplyDownReq)
 
 MultiMsgApplyDownRsp = _reflection.GeneratedProtocolMessageType('MultiMsgApplyDownRsp', (_message.Message,), {
   'DESCRIPTOR' : _MULTIMSGAPPLYDOWNRSP,
-  '__module__' : 'multi_msg_pb2'
+  '__module__' : 'cai.pb.highway.multi_msg.multi_msg_pb2'
   # @@protoc_insertion_point(class_scope:MultiMsgApplyDownRsp)
   })
 _sym_db.RegisterMessage(MultiMsgApplyDownRsp)
 
 MultiMsgApplyUpReq = _reflection.GeneratedProtocolMessageType('MultiMsgApplyUpReq', (_message.Message,), {
   'DESCRIPTOR' : _MULTIMSGAPPLYUPREQ,
-  '__module__' : 'multi_msg_pb2'
+  '__module__' : 'cai.pb.highway.multi_msg.multi_msg_pb2'
   # @@protoc_insertion_point(class_scope:MultiMsgApplyUpReq)
   })
 _sym_db.RegisterMessage(MultiMsgApplyUpReq)
 
 MultiMsgApplyUpRsp = _reflection.GeneratedProtocolMessageType('MultiMsgApplyUpRsp', (_message.Message,), {
   'DESCRIPTOR' : _MULTIMSGAPPLYUPRSP,
-  '__module__' : 'multi_msg_pb2'
+  '__module__' : 'cai.pb.highway.multi_msg.multi_msg_pb2'
   # @@protoc_insertion_point(class_scope:MultiMsgApplyUpRsp)
   })
 _sym_db.RegisterMessage(MultiMsgApplyUpRsp)
 
 MultiReqBody = _reflection.GeneratedProtocolMessageType('MultiReqBody', (_message.Message,), {
   'DESCRIPTOR' : _MULTIREQBODY,
-  '__module__' : 'multi_msg_pb2'
+  '__module__' : 'cai.pb.highway.multi_msg.multi_msg_pb2'
   # @@protoc_insertion_point(class_scope:MultiReqBody)
   })
 _sym_db.RegisterMessage(MultiReqBody)
 
 MultiRspBody = _reflection.GeneratedProtocolMessageType('MultiRspBody', (_message.Message,), {
   'DESCRIPTOR' : _MULTIRSPBODY,
-  '__module__' : 'multi_msg_pb2'
+  '__module__' : 'cai.pb.highway.multi_msg.multi_msg_pb2'
   # @@protoc_insertion_point(class_scope:MultiRspBody)
   })
 _sym_db.RegisterMessage(MultiRspBody)
@@ -78,18 +78,18 @@
 
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = b'Z,github.com/Mrs4s/MiraiGo/client/pb/multi_msg'
-  _EXTERNMSG._serialized_start=19
-  _EXTERNMSG._serialized_end=51
-  _MULTIMSGAPPLYDOWNREQ._serialized_start=53
-  _MULTIMSGAPPLYDOWNREQ._serialized_end=126
-  _MULTIMSGAPPLYDOWNRSP._serialized_start=129
-  _MULTIMSGAPPLYDOWNRSP._serialized_end=354
-  _MULTIMSGAPPLYUPREQ._serialized_start=356
-  _MULTIMSGAPPLYUPREQ._serialized_end=459
-  _MULTIMSGAPPLYUPRSP._serialized_start=462
-  _MULTIMSGAPPLYUPRSP._serialized_end=741
-  _MULTIREQBODY._serialized_start=744
-  _MULTIREQBODY._serialized_end=991
-  _MULTIRSPBODY._serialized_start=994
-  _MULTIRSPBODY._serialized_end=1126
+  _EXTERNMSG._serialized_start=44
+  _EXTERNMSG._serialized_end=76
+  _MULTIMSGAPPLYDOWNREQ._serialized_start=78
+  _MULTIMSGAPPLYDOWNREQ._serialized_end=151
+  _MULTIMSGAPPLYDOWNRSP._serialized_start=154
+  _MULTIMSGAPPLYDOWNRSP._serialized_end=379
+  _MULTIMSGAPPLYUPREQ._serialized_start=381
+  _MULTIMSGAPPLYUPREQ._serialized_end=484
+  _MULTIMSGAPPLYUPRSP._serialized_start=487
+  _MULTIMSGAPPLYUPRSP._serialized_end=766
+  _MULTIREQBODY._serialized_start=769
+  _MULTIREQBODY._serialized_end=1016
+  _MULTIRSPBODY._serialized_start=1019
+  _MULTIRSPBODY._serialized_end=1151
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/highway/protocol/highway_head_pb2.py b/cai/pb/highway/protocol/highway_head_pb2.py
index ee212b00..b6d3a24d 100644
--- a/cai/pb/highway/protocol/highway_head_pb2.py
+++ b/cai/pb/highway/protocol/highway_head_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: highway_head.proto
+# source: cai/pb/highway/protocol/highway_head.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -14,7 +14,7 @@
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12highway_head.proto\"\x93\x10\n\x0chighway_head\x1a_\n\x13\x43\x32\x43\x43ommonExtendinfo\x12\x0e\n\x06infoId\x18\x01 \x01(\r\x12\x38\n\x10\x66ilterExtendinfo\x18\x02 \x01(\x0b\x32\x1e.highway_head.FilterExtendinfo\x1a\xc8\x01\n\x0f\x44\x61taHighwayHead\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x0b\n\x03uin\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ommand\x18\x03 \x01(\x0c\x12\x0b\n\x03seq\x18\x04 \x01(\r\x12\x12\n\nretryTimes\x18\x05 \x01(\r\x12\r\n\x05\x61ppid\x18\x06 \x01(\r\x12\x10\n\x08\x64\x61taflag\x18\x07 \x01(\r\x12\x11\n\tcommandId\x18\x08 \x01(\r\x12\x10\n\x08\x62uildVer\x18\t \x01(\x0c\x12\x10\n\x08localeId\x18\n \x01(\r\x12\r\n\x05\x65nvId\x18\x0b \x01(\r\x1a&\n\x08\x44\x61taHole\x12\r\n\x05\x62\x65gin\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04\x1a\x64\n\x10\x46ilterExtendinfo\x12\x12\n\nfilterFlag\x18\x01 \x01(\r\x12<\n\x12imageFilterRequest\x18\x02 \x01(\x0b\x32 .highway_head.ImageFilterRequest\x1a\x31\n\x0b\x46ilterStyle\x12\x0f\n\x07styleId\x18\x01 \x01(\r\x12\x11\n\tstyleName\x18\x02 \x01(\x0c\x1a\xa2\x01\n\x12ImageFilterRequest\x12\x11\n\tsessionId\x18\x01 \x01(\x0c\x12\x10\n\x08\x63lientIp\x18\x02 \x01(\r\x12\x0b\n\x03uin\x18\x03 \x01(\x04\x12(\n\x05style\x18\x04 \x01(\x0b\x32\x19.highway_head.FilterStyle\x12\r\n\x05width\x18\x05 \x01(\r\x12\x0e\n\x06height\x18\x06 \x01(\r\x12\x11\n\timageData\x18\x07 \x01(\x0c\x1aK\n\x13ImageFilterResponse\x12\x0f\n\x07retCode\x18\x01 \x01(\x05\x12\x11\n\timageData\x18\x02 \x01(\x0c\x12\x10\n\x08\x63ostTime\x18\x03 \x01(\r\x1a\x36\n\x0cLoginSigHead\x12\x14\n\x0cloginsigType\x18\x01 \x01(\r\x12\x10\n\x08loginsig\x18\x02 \x01(\x0c\x1a\x33\n\x10NewServiceTicket\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\x0c\n\x04ukey\x18\x02 \x01(\x0c\x1a\xfa\x01\n\nPicInfoExt\x12\x10\n\x08picWidth\x18\x01 \x01(\r\x12\x11\n\tpicHeight\x18\x02 \x01(\r\x12\x0f\n\x07picFlag\x18\x03 \x01(\r\x12\x10\n\x08\x62usiType\x18\x04 \x01(\r\x12\x0f\n\x07srcTerm\x18\x05 \x01(\r\x12\x10\n\x08platType\x18\x06 \x01(\r\x12\x0f\n\x07netType\x18\x07 \x01(\r\x12\x0f\n\x07imgType\x18\x08 \x01(\r\x12\x12\n\nappPicType\x18\t \x01(\r\x12\x1b\n\x13\x65\x63hoCreatedByServer\x18\n \x01(\x0c\x12\x15\n\rqqmeetGuildId\x18\x0b \x01(\x04\x12\x17\n\x0fqqmeetChannelId\x18\x0c \x01(\x04\x1aT\n\rPicRspExtInfo\x12\x0c\n\x04skey\x18\x01 \x01(\x0c\x12\x10\n\x08\x63lientIp\x18\x02 \x01(\r\x12\x10\n\x08upOffset\x18\x03 \x01(\x04\x12\x11\n\tblockSize\x18\x04 \x01(\x04\x1aZ\n\x0cQueryHoleRsp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12(\n\x08\x64\x61taHole\x18\x02 \x03(\x0b\x32\x16.highway_head.DataHole\x12\x10\n\x08\x63ompFlag\x18\x03 \x01(\x08\x1a\xc9\x01\n\x12ReqDataHighwayHead\x12/\n\x08\x62\x61sehead\x18\x01 \x01(\x0b\x32\x1d.highway_head.DataHighwayHead\x12&\n\x07seghead\x18\x02 \x01(\x0b\x32\x15.highway_head.SegHead\x12\x15\n\rreqExtendinfo\x18\x03 \x01(\x0c\x12\x11\n\ttimestamp\x18\x04 \x01(\x04\x12\x30\n\x0cloginSigHead\x18\x05 \x01(\x0b\x32\x1a.highway_head.LoginSigHead\x1a;\n\x07RspBody\x12\x30\n\x0cqueryHoleRsp\x18\x01 \x01(\x0b\x32\x1a.highway_head.QueryHoleRsp\x1a\x81\x02\n\x12RspDataHighwayHead\x12/\n\x08\x62\x61sehead\x18\x01 \x01(\x0b\x32\x1d.highway_head.DataHighwayHead\x12&\n\x07seghead\x18\x02 \x01(\x0b\x32\x15.highway_head.SegHead\x12\x11\n\terrorCode\x18\x03 \x01(\r\x12\x12\n\nallowRetry\x18\x04 \x01(\r\x12\x11\n\tcachecost\x18\x05 \x01(\r\x12\x0e\n\x06htcost\x18\x06 \x01(\r\x12\x15\n\rrspExtendinfo\x18\x07 \x01(\x0c\x12\x11\n\ttimestamp\x18\x08 \x01(\x04\x12\r\n\x05range\x18\t \x01(\x04\x12\x0f\n\x07isReset\x18\n \x01(\r\x1a\xfa\x01\n\x07SegHead\x12\x11\n\tserviceid\x18\x01 \x01(\r\x12\x10\n\x08\x66ilesize\x18\x02 \x01(\x04\x12\x12\n\ndataoffset\x18\x03 \x01(\x04\x12\x12\n\ndatalength\x18\x04 \x01(\r\x12\x0e\n\x06rtcode\x18\x05 \x01(\r\x12\x15\n\rserviceticket\x18\x06 \x01(\x0c\x12\x0c\n\x04\x66lag\x18\x07 \x01(\r\x12\x0b\n\x03md5\x18\x08 \x01(\x0c\x12\x0f\n\x07\x66ileMd5\x18\t \x01(\x0c\x12\x11\n\tcacheAddr\x18\n \x01(\r\x12\x12\n\nqueryTimes\x18\x0b \x01(\r\x12\x15\n\rupdateCacheip\x18\x0c \x01(\r\x12\x11\n\tcachePort\x18\r \x01(\r')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*cai/pb/highway/protocol/highway_head.proto\"\x93\x10\n\x0chighway_head\x1a_\n\x13\x43\x32\x43\x43ommonExtendinfo\x12\x0e\n\x06infoId\x18\x01 \x01(\r\x12\x38\n\x10\x66ilterExtendinfo\x18\x02 \x01(\x0b\x32\x1e.highway_head.FilterExtendinfo\x1a\xc8\x01\n\x0f\x44\x61taHighwayHead\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x0b\n\x03uin\x18\x02 \x01(\x0c\x12\x0f\n\x07\x63ommand\x18\x03 \x01(\x0c\x12\x0b\n\x03seq\x18\x04 \x01(\r\x12\x12\n\nretryTimes\x18\x05 \x01(\r\x12\r\n\x05\x61ppid\x18\x06 \x01(\r\x12\x10\n\x08\x64\x61taflag\x18\x07 \x01(\r\x12\x11\n\tcommandId\x18\x08 \x01(\r\x12\x10\n\x08\x62uildVer\x18\t \x01(\x0c\x12\x10\n\x08localeId\x18\n \x01(\r\x12\r\n\x05\x65nvId\x18\x0b \x01(\r\x1a&\n\x08\x44\x61taHole\x12\r\n\x05\x62\x65gin\x18\x01 \x01(\x04\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x04\x1a\x64\n\x10\x46ilterExtendinfo\x12\x12\n\nfilterFlag\x18\x01 \x01(\r\x12<\n\x12imageFilterRequest\x18\x02 \x01(\x0b\x32 .highway_head.ImageFilterRequest\x1a\x31\n\x0b\x46ilterStyle\x12\x0f\n\x07styleId\x18\x01 \x01(\r\x12\x11\n\tstyleName\x18\x02 \x01(\x0c\x1a\xa2\x01\n\x12ImageFilterRequest\x12\x11\n\tsessionId\x18\x01 \x01(\x0c\x12\x10\n\x08\x63lientIp\x18\x02 \x01(\r\x12\x0b\n\x03uin\x18\x03 \x01(\x04\x12(\n\x05style\x18\x04 \x01(\x0b\x32\x19.highway_head.FilterStyle\x12\r\n\x05width\x18\x05 \x01(\r\x12\x0e\n\x06height\x18\x06 \x01(\r\x12\x11\n\timageData\x18\x07 \x01(\x0c\x1aK\n\x13ImageFilterResponse\x12\x0f\n\x07retCode\x18\x01 \x01(\x05\x12\x11\n\timageData\x18\x02 \x01(\x0c\x12\x10\n\x08\x63ostTime\x18\x03 \x01(\r\x1a\x36\n\x0cLoginSigHead\x12\x14\n\x0cloginsigType\x18\x01 \x01(\r\x12\x10\n\x08loginsig\x18\x02 \x01(\x0c\x1a\x33\n\x10NewServiceTicket\x12\x11\n\tsignature\x18\x01 \x01(\x0c\x12\x0c\n\x04ukey\x18\x02 \x01(\x0c\x1a\xfa\x01\n\nPicInfoExt\x12\x10\n\x08picWidth\x18\x01 \x01(\r\x12\x11\n\tpicHeight\x18\x02 \x01(\r\x12\x0f\n\x07picFlag\x18\x03 \x01(\r\x12\x10\n\x08\x62usiType\x18\x04 \x01(\r\x12\x0f\n\x07srcTerm\x18\x05 \x01(\r\x12\x10\n\x08platType\x18\x06 \x01(\r\x12\x0f\n\x07netType\x18\x07 \x01(\r\x12\x0f\n\x07imgType\x18\x08 \x01(\r\x12\x12\n\nappPicType\x18\t \x01(\r\x12\x1b\n\x13\x65\x63hoCreatedByServer\x18\n \x01(\x0c\x12\x15\n\rqqmeetGuildId\x18\x0b \x01(\x04\x12\x17\n\x0fqqmeetChannelId\x18\x0c \x01(\x04\x1aT\n\rPicRspExtInfo\x12\x0c\n\x04skey\x18\x01 \x01(\x0c\x12\x10\n\x08\x63lientIp\x18\x02 \x01(\r\x12\x10\n\x08upOffset\x18\x03 \x01(\x04\x12\x11\n\tblockSize\x18\x04 \x01(\x04\x1aZ\n\x0cQueryHoleRsp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12(\n\x08\x64\x61taHole\x18\x02 \x03(\x0b\x32\x16.highway_head.DataHole\x12\x10\n\x08\x63ompFlag\x18\x03 \x01(\x08\x1a\xc9\x01\n\x12ReqDataHighwayHead\x12/\n\x08\x62\x61sehead\x18\x01 \x01(\x0b\x32\x1d.highway_head.DataHighwayHead\x12&\n\x07seghead\x18\x02 \x01(\x0b\x32\x15.highway_head.SegHead\x12\x15\n\rreqExtendinfo\x18\x03 \x01(\x0c\x12\x11\n\ttimestamp\x18\x04 \x01(\x04\x12\x30\n\x0cloginSigHead\x18\x05 \x01(\x0b\x32\x1a.highway_head.LoginSigHead\x1a;\n\x07RspBody\x12\x30\n\x0cqueryHoleRsp\x18\x01 \x01(\x0b\x32\x1a.highway_head.QueryHoleRsp\x1a\x81\x02\n\x12RspDataHighwayHead\x12/\n\x08\x62\x61sehead\x18\x01 \x01(\x0b\x32\x1d.highway_head.DataHighwayHead\x12&\n\x07seghead\x18\x02 \x01(\x0b\x32\x15.highway_head.SegHead\x12\x11\n\terrorCode\x18\x03 \x01(\r\x12\x12\n\nallowRetry\x18\x04 \x01(\r\x12\x11\n\tcachecost\x18\x05 \x01(\r\x12\x0e\n\x06htcost\x18\x06 \x01(\r\x12\x15\n\rrspExtendinfo\x18\x07 \x01(\x0c\x12\x11\n\ttimestamp\x18\x08 \x01(\x04\x12\r\n\x05range\x18\t \x01(\x04\x12\x0f\n\x07isReset\x18\n \x01(\r\x1a\xfa\x01\n\x07SegHead\x12\x11\n\tserviceid\x18\x01 \x01(\r\x12\x10\n\x08\x66ilesize\x18\x02 \x01(\x04\x12\x12\n\ndataoffset\x18\x03 \x01(\x04\x12\x12\n\ndatalength\x18\x04 \x01(\r\x12\x0e\n\x06rtcode\x18\x05 \x01(\r\x12\x15\n\rserviceticket\x18\x06 \x01(\x0c\x12\x0c\n\x04\x66lag\x18\x07 \x01(\r\x12\x0b\n\x03md5\x18\x08 \x01(\x0c\x12\x0f\n\x07\x66ileMd5\x18\t \x01(\x0c\x12\x11\n\tcacheAddr\x18\n \x01(\r\x12\x12\n\nqueryTimes\x18\x0b \x01(\r\x12\x15\n\rupdateCacheip\x18\x0c \x01(\r\x12\x11\n\tcachePort\x18\r \x01(\r')
 
 
 
@@ -39,117 +39,117 @@
 
   'C2CCommonExtendinfo' : _reflection.GeneratedProtocolMessageType('C2CCommonExtendinfo', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_C2CCOMMONEXTENDINFO,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.C2CCommonExtendinfo)
     })
   ,
 
   'DataHighwayHead' : _reflection.GeneratedProtocolMessageType('DataHighwayHead', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_DATAHIGHWAYHEAD,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.DataHighwayHead)
     })
   ,
 
   'DataHole' : _reflection.GeneratedProtocolMessageType('DataHole', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_DATAHOLE,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.DataHole)
     })
   ,
 
   'FilterExtendinfo' : _reflection.GeneratedProtocolMessageType('FilterExtendinfo', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_FILTEREXTENDINFO,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.FilterExtendinfo)
     })
   ,
 
   'FilterStyle' : _reflection.GeneratedProtocolMessageType('FilterStyle', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_FILTERSTYLE,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.FilterStyle)
     })
   ,
 
   'ImageFilterRequest' : _reflection.GeneratedProtocolMessageType('ImageFilterRequest', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_IMAGEFILTERREQUEST,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.ImageFilterRequest)
     })
   ,
 
   'ImageFilterResponse' : _reflection.GeneratedProtocolMessageType('ImageFilterResponse', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_IMAGEFILTERRESPONSE,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.ImageFilterResponse)
     })
   ,
 
   'LoginSigHead' : _reflection.GeneratedProtocolMessageType('LoginSigHead', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_LOGINSIGHEAD,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.LoginSigHead)
     })
   ,
 
   'NewServiceTicket' : _reflection.GeneratedProtocolMessageType('NewServiceTicket', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_NEWSERVICETICKET,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.NewServiceTicket)
     })
   ,
 
   'PicInfoExt' : _reflection.GeneratedProtocolMessageType('PicInfoExt', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_PICINFOEXT,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.PicInfoExt)
     })
   ,
 
   'PicRspExtInfo' : _reflection.GeneratedProtocolMessageType('PicRspExtInfo', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_PICRSPEXTINFO,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.PicRspExtInfo)
     })
   ,
 
   'QueryHoleRsp' : _reflection.GeneratedProtocolMessageType('QueryHoleRsp', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_QUERYHOLERSP,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.QueryHoleRsp)
     })
   ,
 
   'ReqDataHighwayHead' : _reflection.GeneratedProtocolMessageType('ReqDataHighwayHead', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_REQDATAHIGHWAYHEAD,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.ReqDataHighwayHead)
     })
   ,
 
   'RspBody' : _reflection.GeneratedProtocolMessageType('RspBody', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_RSPBODY,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.RspBody)
     })
   ,
 
   'RspDataHighwayHead' : _reflection.GeneratedProtocolMessageType('RspDataHighwayHead', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_RSPDATAHIGHWAYHEAD,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.RspDataHighwayHead)
     })
   ,
 
   'SegHead' : _reflection.GeneratedProtocolMessageType('SegHead', (_message.Message,), {
     'DESCRIPTOR' : _HIGHWAY_HEAD_SEGHEAD,
-    '__module__' : 'highway_head_pb2'
+    '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
     # @@protoc_insertion_point(class_scope:highway_head.SegHead)
     })
   ,
   'DESCRIPTOR' : _HIGHWAY_HEAD,
-  '__module__' : 'highway_head_pb2'
+  '__module__' : 'cai.pb.highway.protocol.highway_head_pb2'
   # @@protoc_insertion_point(class_scope:highway_head)
   })
 _sym_db.RegisterMessage(highway_head)
@@ -173,38 +173,38 @@
 if _descriptor._USE_C_DESCRIPTORS == False:
 
   DESCRIPTOR._options = None
-  _HIGHWAY_HEAD._serialized_start=23
-  _HIGHWAY_HEAD._serialized_end=2090
-  _HIGHWAY_HEAD_C2CCOMMONEXTENDINFO._serialized_start=39
-  _HIGHWAY_HEAD_C2CCOMMONEXTENDINFO._serialized_end=134
-  _HIGHWAY_HEAD_DATAHIGHWAYHEAD._serialized_start=137
-  _HIGHWAY_HEAD_DATAHIGHWAYHEAD._serialized_end=337
-  _HIGHWAY_HEAD_DATAHOLE._serialized_start=339
-  _HIGHWAY_HEAD_DATAHOLE._serialized_end=377
-  _HIGHWAY_HEAD_FILTEREXTENDINFO._serialized_start=379
-  _HIGHWAY_HEAD_FILTEREXTENDINFO._serialized_end=479
-  _HIGHWAY_HEAD_FILTERSTYLE._serialized_start=481
-  _HIGHWAY_HEAD_FILTERSTYLE._serialized_end=530
-  _HIGHWAY_HEAD_IMAGEFILTERREQUEST._serialized_start=533
-  _HIGHWAY_HEAD_IMAGEFILTERREQUEST._serialized_end=695
-  _HIGHWAY_HEAD_IMAGEFILTERRESPONSE._serialized_start=697
-  _HIGHWAY_HEAD_IMAGEFILTERRESPONSE._serialized_end=772
-  _HIGHWAY_HEAD_LOGINSIGHEAD._serialized_start=774
-  _HIGHWAY_HEAD_LOGINSIGHEAD._serialized_end=828
-  _HIGHWAY_HEAD_NEWSERVICETICKET._serialized_start=830
-  _HIGHWAY_HEAD_NEWSERVICETICKET._serialized_end=881
-  _HIGHWAY_HEAD_PICINFOEXT._serialized_start=884
-  _HIGHWAY_HEAD_PICINFOEXT._serialized_end=1134
-  _HIGHWAY_HEAD_PICRSPEXTINFO._serialized_start=1136
-  _HIGHWAY_HEAD_PICRSPEXTINFO._serialized_end=1220
-  _HIGHWAY_HEAD_QUERYHOLERSP._serialized_start=1222
-  _HIGHWAY_HEAD_QUERYHOLERSP._serialized_end=1312
-  _HIGHWAY_HEAD_REQDATAHIGHWAYHEAD._serialized_start=1315
-  _HIGHWAY_HEAD_REQDATAHIGHWAYHEAD._serialized_end=1516
-  _HIGHWAY_HEAD_RSPBODY._serialized_start=1518
-  _HIGHWAY_HEAD_RSPBODY._serialized_end=1577
-  _HIGHWAY_HEAD_RSPDATAHIGHWAYHEAD._serialized_start=1580
-  _HIGHWAY_HEAD_RSPDATAHIGHWAYHEAD._serialized_end=1837
-  _HIGHWAY_HEAD_SEGHEAD._serialized_start=1840
-  _HIGHWAY_HEAD_SEGHEAD._serialized_end=2090
+  _HIGHWAY_HEAD._serialized_start=47
+  _HIGHWAY_HEAD._serialized_end=2114
+  _HIGHWAY_HEAD_C2CCOMMONEXTENDINFO._serialized_start=63
+  _HIGHWAY_HEAD_C2CCOMMONEXTENDINFO._serialized_end=158
+  _HIGHWAY_HEAD_DATAHIGHWAYHEAD._serialized_start=161
+  _HIGHWAY_HEAD_DATAHIGHWAYHEAD._serialized_end=361
+  _HIGHWAY_HEAD_DATAHOLE._serialized_start=363
+  _HIGHWAY_HEAD_DATAHOLE._serialized_end=401
+  _HIGHWAY_HEAD_FILTEREXTENDINFO._serialized_start=403
+  _HIGHWAY_HEAD_FILTEREXTENDINFO._serialized_end=503
+  _HIGHWAY_HEAD_FILTERSTYLE._serialized_start=505
+  _HIGHWAY_HEAD_FILTERSTYLE._serialized_end=554
+  _HIGHWAY_HEAD_IMAGEFILTERREQUEST._serialized_start=557
+  _HIGHWAY_HEAD_IMAGEFILTERREQUEST._serialized_end=719
+  _HIGHWAY_HEAD_IMAGEFILTERRESPONSE._serialized_start=721
+  _HIGHWAY_HEAD_IMAGEFILTERRESPONSE._serialized_end=796
+  _HIGHWAY_HEAD_LOGINSIGHEAD._serialized_start=798
+  _HIGHWAY_HEAD_LOGINSIGHEAD._serialized_end=852
+  _HIGHWAY_HEAD_NEWSERVICETICKET._serialized_start=854
+  _HIGHWAY_HEAD_NEWSERVICETICKET._serialized_end=905
+  _HIGHWAY_HEAD_PICINFOEXT._serialized_start=908
+  _HIGHWAY_HEAD_PICINFOEXT._serialized_end=1158
+  _HIGHWAY_HEAD_PICRSPEXTINFO._serialized_start=1160
+  _HIGHWAY_HEAD_PICRSPEXTINFO._serialized_end=1244
+  _HIGHWAY_HEAD_QUERYHOLERSP._serialized_start=1246
+  _HIGHWAY_HEAD_QUERYHOLERSP._serialized_end=1336
+  _HIGHWAY_HEAD_REQDATAHIGHWAYHEAD._serialized_start=1339
+  _HIGHWAY_HEAD_REQDATAHIGHWAYHEAD._serialized_end=1540
+  _HIGHWAY_HEAD_RSPBODY._serialized_start=1542
+  _HIGHWAY_HEAD_RSPBODY._serialized_end=1601
+  _HIGHWAY_HEAD_RSPDATAHIGHWAYHEAD._serialized_start=1604
+  _HIGHWAY_HEAD_RSPDATAHIGHWAYHEAD._serialized_end=1861
+  _HIGHWAY_HEAD_SEGHEAD._serialized_start=1864
+  _HIGHWAY_HEAD_SEGHEAD._serialized_end=2114
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/cs/__init__.py b/cai/pb/im/cs/__init__.py
new file mode 100644
index 00000000..2c6434f0
--- /dev/null
+++ b/cai/pb/im/cs/__init__.py
@@ -0,0 +1,16 @@
+"""IM CS Protocol Buffer Model Category.
+
+This module is used to store all cs protobuf files.
+
+Generate all protobuf file using:
+
+.. code-block:: bash
+
+    protoc cai/pb/**/*.proto --python_out=. --mypy_out=readable_stubs:.
+
+:Copyright: Copyright (C) 2021-2021  cscs181
+:License: AGPL-3.0 or later. See `LICENSE`_ for detail.
+
+.. _LICENSE:
+    https://github.com/cscs181/CAI/blob/master/LICENSE
+"""
diff --git a/cai/pb/im/cs/cmd0x388/__init__.py b/cai/pb/im/cs/cmd0x388/__init__.py
new file mode 100644
index 00000000..27330430
--- /dev/null
+++ b/cai/pb/im/cs/cmd0x388/__init__.py
@@ -0,0 +1 @@
+from .cmd0x388_pb2 import *
diff --git a/cai/pb/im/cs/cmd0x388/cmd0x388.proto b/cai/pb/im/cs/cmd0x388/cmd0x388.proto
new file mode 100644
index 00000000..f572218c
--- /dev/null
+++ b/cai/pb/im/cs/cmd0x388/cmd0x388.proto
@@ -0,0 +1,255 @@
+syntax = "proto2";
+package im.cs.cmd0x388;
+
+// tencent/im/cs/cmd0x388/cmd0x388.java
+
+message DelImgReq {
+  optional uint64 src_uin = 1;
+  optional uint64 dst_uin = 2;
+  optional uint32 req_term = 3;
+  optional uint32 req_platform_type = 4;
+  optional uint32 bu_type = 5;
+  optional bytes build_ver = 6;
+  optional bytes file_resid = 7;
+  optional uint32 pic_width = 8;
+  optional uint32 pic_height = 9;
+}
+
+message DelImgRsp {
+  optional uint32 result = 1;
+  optional bytes fail_msg = 2;
+  optional bytes file_resid = 3;
+}
+
+message ExpRoamExtendInfo {
+  optional bytes resid = 1;
+}
+
+message ExpRoamPicInfo {
+  optional uint32 shop_flag = 1;
+  optional uint32 pkg_id = 2;
+  optional bytes pic_id = 3;
+}
+
+message ExtensionCommPicTryUp {
+  repeated bytes extinfo = 1;
+}
+
+message ExtensionExpRoamTryUp {
+  repeated ExpRoamPicInfo exproam_pic_info = 1;
+}
+
+message GetImgUrlReq {
+  optional uint64 group_code = 1;
+  optional uint64 dst_uin = 2;
+  optional uint64 fileid = 3;
+  optional bytes file_md5 = 4;
+  optional uint32 url_flag = 5;
+  optional uint32 url_type = 6;
+  optional uint32 req_term = 7;
+  optional uint32 req_platform_type = 8;
+  optional uint32 inner_ip = 9;
+  optional uint32 bu_type = 10;
+  optional bytes build_ver = 11;
+  optional uint64 file_id = 12;
+  optional uint64 file_size = 13;
+  optional uint32 original_pic = 14;
+  optional uint32 retry_req = 15;
+  optional uint32 file_height = 16;
+  optional uint32 file_width = 17;
+  optional uint32 pic_type = 18;
+  optional uint32 pic_up_timestamp = 19;
+  optional uint32 req_transfer_type = 20;
+  optional uint64 qqmeet_guild_id = 21;
+  optional uint64 qqmeet_channel_id = 22;
+  optional bytes download_index = 23;
+}
+
+message GetImgUrlRsp {
+  optional uint64 fileid = 1;
+  optional bytes file_md5 = 2;
+  optional uint32 result = 3;
+  optional bytes fail_msg = 4;
+  optional ImgInfo img_info = 5;
+  repeated bytes thumb_down_url = 6;
+  repeated bytes original_down_url = 7;
+  repeated bytes big_down_url = 8;
+  repeated uint32 down_ip = 9;
+  repeated uint32 down_port = 10;
+  optional bytes down_domain = 11;
+  optional bytes thumb_down_para = 12;
+  optional bytes original_down_para = 13;
+  optional bytes big_down_para = 14;
+  optional uint64 file_id = 15;
+  optional uint32 auto_down_type = 16;
+  repeated uint32 order_down_type = 17;
+  optional bytes big_thumb_down_para = 19;
+  optional uint32 https_url_flag = 20;
+  repeated IPv6Info down_ip6 = 26;
+  optional bytes client_ip6 = 27;
+}
+
+message GetPttUrlReq {
+  optional uint64 group_code = 1;
+  optional uint64 dst_uin = 2;
+  optional uint64 fileid = 3;
+  optional bytes file_md5 = 4;
+  optional uint32 req_term = 5;
+  optional uint32 req_platform_type = 6;
+  optional uint32 inner_ip = 7;
+  optional uint32 bu_type = 8;
+  optional bytes build_ver = 9;
+  optional uint64 file_id = 10;
+  optional bytes file_key = 11;
+  optional uint32 codec = 12;
+  optional uint32 bu_id = 13;
+  optional uint32 req_transfer_type = 14;
+  optional uint32 is_auto = 15;
+}
+
+message GetPttUrlRsp {
+  optional uint64 fileid = 1;
+  optional bytes file_md5 = 2;
+  optional uint32 result = 3;
+  optional bytes fail_msg = 4;
+  repeated bytes down_url = 5;
+  repeated uint32 down_ip = 6;
+  repeated uint32 down_port = 7;
+  optional bytes down_domain = 8;
+  optional bytes down_para = 9;
+  optional uint64 file_id = 10;
+  optional uint32 transfer_type = 11;
+  optional uint32 allow_retry = 12;
+  repeated IPv6Info down_ip6 = 26;
+  optional bytes client_ip6 = 27;
+  optional string domain = 28;
+}
+
+message IPv6Info {
+  optional bytes ip6 = 1;
+  optional uint32 port = 2;
+}
+
+message ImgInfo {
+  optional bytes file_md5 = 1;
+  optional uint32 file_type = 2;
+  optional uint64 file_size = 3;
+  optional uint32 file_width = 4;
+  optional uint32 file_height = 5;
+}
+
+message PicSize {
+  optional uint32 original = 1;
+  optional uint32 thumb = 2;
+  optional uint32 high = 3;
+}
+
+message ReqBody {
+  optional uint32 net_type = 1;
+  optional uint32 subcmd = 2;
+  repeated TryUpImgReq tryup_img_req = 3;
+  repeated GetImgUrlReq getimg_url_req = 4;
+  repeated TryUpPttReq tryup_ptt_req = 5;
+  repeated GetPttUrlReq getptt_url_req = 6;
+  optional uint32 command_id = 7;
+  repeated DelImgReq del_img_req = 8;
+  optional bytes extension = 1001;
+}
+
+message RspBody {
+  optional uint32 client_ip = 1;
+  optional uint32 subcmd = 2;
+  repeated TryUpImgRsp tryup_img_rsp = 3;
+  repeated GetImgUrlRsp getimg_url_rsp = 4;
+  repeated TryUpPttRsp tryup_ptt_rsp = 5;
+  repeated GetPttUrlRsp getptt_url_rsp = 6;
+  repeated DelImgRsp del_img_rsp = 7;
+}
+
+message TryUpImgReq {
+  optional uint64 group_code = 1;
+  optional uint64 src_uin = 2;
+  optional uint64 file_id = 3;
+  optional bytes file_md5 = 4;
+  optional uint64 file_size = 5;
+  optional bytes file_name = 6;
+  optional uint32 src_term = 7;
+  optional uint32 platform_type = 8;
+  optional uint32 bu_type = 9;
+  optional uint32 pic_width = 10;
+  optional uint32 pic_height = 11;
+  optional uint32 pic_type = 12;
+  optional bytes build_ver = 13;
+  optional uint32 inner_ip = 14;
+  optional uint32 app_pic_type = 15;
+  optional uint32 original_pic = 16;
+  optional bytes file_index = 17;
+  optional uint64 dst_uin = 18;
+  optional uint32 srv_upload = 19;
+  optional bytes transfer_url = 20;
+  optional uint64 qqmeet_guild_id = 21;
+  optional uint64 qqmeet_channel_id = 22;
+}
+
+message TryUpImgRsp {
+  optional uint64 file_id = 1;
+  optional uint32 result = 2;
+  optional bytes fail_msg = 3;
+  optional bool file_exit = 4;
+  optional ImgInfo img_info = 5;
+  repeated uint32 up_ip = 6;
+  repeated uint32 up_port = 7;
+  optional bytes up_ukey = 8;
+  optional uint64 fileid = 9;
+  optional uint64 up_offset = 10;
+  optional uint64 block_size = 11;
+  optional bool new_big_chan = 12;
+  repeated IPv6Info up_ip6 = 26;
+  optional bytes client_ip6 = 27;
+  optional bytes download_index = 28;
+  optional TryUpInfo4Busi info4_busi = 1001;
+}
+
+message TryUpInfo4Busi {
+  optional bytes down_domain = 1;
+  optional bytes thumb_down_url = 2;
+  optional bytes original_down_url = 3;
+  optional bytes big_down_url = 4;
+  optional bytes file_resid = 5;
+}
+
+message TryUpPttReq {
+  optional uint64 group_code = 1;
+  optional uint64 src_uin = 2;
+  optional uint64 file_id = 3;
+  optional bytes file_md5 = 4;
+  optional uint64 file_size = 5;
+  optional bytes file_name = 6;
+  optional uint32 src_term = 7;
+  optional uint32 platform_type = 8;
+  optional uint32 bu_type = 9;
+  optional bytes build_ver = 10;
+  optional uint32 inner_ip = 11;
+  optional uint32 voice_length = 12;
+  optional bool new_up_chan = 13;
+  optional uint32 codec = 14;
+  optional uint32 voice_type = 15;
+  optional uint32 bu_id = 16;
+}
+
+message TryUpPttRsp {
+  optional uint64 file_id = 1;
+  optional uint32 result = 2;
+  optional bytes fail_msg = 3;
+  optional bool file_exit = 4;
+  repeated uint32 up_ip = 5;
+  repeated uint32 up_port = 6;
+  optional bytes up_ukey = 7;
+  optional uint64 fileid = 8;
+  optional uint64 up_offset = 9;
+  optional uint64 block_size = 10;
+  optional bytes file_key = 11;
+  optional uint32 channel_type = 12;
+  repeated IPv6Info up_ip6 = 26;
+  optional bytes client_ip6 = 27;
+}
diff --git a/cai/pb/im/cs/cmd0x388/cmd0x388_pb2.py b/cai/pb/im/cs/cmd0x388/cmd0x388_pb2.py
new file mode 100644
index 00000000..b1372a04
--- /dev/null
+++ b/cai/pb/im/cs/cmd0x388/cmd0x388_pb2.py
@@ -0,0 +1,224 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: cai/pb/im/cs/cmd0x388/cmd0x388.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$cai/pb/im/cs/cmd0x388/cmd0x388.proto\x12\x0eim.cs.cmd0x388\"\xb9\x01\n\tDelImgReq\x12\x0f\n\x07src_uin\x18\x01 \x01(\x04\x12\x0f\n\x07\x64st_uin\x18\x02 \x01(\x04\x12\x10\n\x08req_term\x18\x03 \x01(\r\x12\x19\n\x11req_platform_type\x18\x04 \x01(\r\x12\x0f\n\x07\x62u_type\x18\x05 \x01(\r\x12\x11\n\tbuild_ver\x18\x06 \x01(\x0c\x12\x12\n\nfile_resid\x18\x07 \x01(\x0c\x12\x11\n\tpic_width\x18\x08 \x01(\r\x12\x12\n\npic_height\x18\t \x01(\r\"A\n\tDelImgRsp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x10\n\x08\x66\x61il_msg\x18\x02 \x01(\x0c\x12\x12\n\nfile_resid\x18\x03 \x01(\x0c\"\"\n\x11\x45xpRoamExtendInfo\x12\r\n\x05resid\x18\x01 \x01(\x0c\"C\n\x0e\x45xpRoamPicInfo\x12\x11\n\tshop_flag\x18\x01 \x01(\r\x12\x0e\n\x06pkg_id\x18\x02 \x01(\r\x12\x0e\n\x06pic_id\x18\x03 \x01(\x0c\"(\n\x15\x45xtensionCommPicTryUp\x12\x0f\n\x07\x65xtinfo\x18\x01 \x03(\x0c\"Q\n\x15\x45xtensionExpRoamTryUp\x12\x38\n\x10\x65xproam_pic_info\x18\x01 \x03(\x0b\x32\x1e.im.cs.cmd0x388.ExpRoamPicInfo\"\xe5\x03\n\x0cGetImgUrlReq\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x0f\n\x07\x64st_uin\x18\x02 \x01(\x04\x12\x0e\n\x06\x66ileid\x18\x03 \x01(\x04\x12\x10\n\x08\x66ile_md5\x18\x04 \x01(\x0c\x12\x10\n\x08url_flag\x18\x05 \x01(\r\x12\x10\n\x08url_type\x18\x06 \x01(\r\x12\x10\n\x08req_term\x18\x07 \x01(\r\x12\x19\n\x11req_platform_type\x18\x08 \x01(\r\x12\x10\n\x08inner_ip\x18\t \x01(\r\x12\x0f\n\x07\x62u_type\x18\n \x01(\r\x12\x11\n\tbuild_ver\x18\x0b \x01(\x0c\x12\x0f\n\x07\x66ile_id\x18\x0c \x01(\x04\x12\x11\n\tfile_size\x18\r \x01(\x04\x12\x14\n\x0coriginal_pic\x18\x0e \x01(\r\x12\x11\n\tretry_req\x18\x0f \x01(\r\x12\x13\n\x0b\x66ile_height\x18\x10 \x01(\r\x12\x12\n\nfile_width\x18\x11 \x01(\r\x12\x10\n\x08pic_type\x18\x12 \x01(\r\x12\x18\n\x10pic_up_timestamp\x18\x13 \x01(\r\x12\x19\n\x11req_transfer_type\x18\x14 \x01(\r\x12\x17\n\x0fqqmeet_guild_id\x18\x15 \x01(\x04\x12\x19\n\x11qqmeet_channel_id\x18\x16 \x01(\x04\x12\x16\n\x0e\x64ownload_index\x18\x17 \x01(\x0c\"\x82\x04\n\x0cGetImgUrlRsp\x12\x0e\n\x06\x66ileid\x18\x01 \x01(\x04\x12\x10\n\x08\x66ile_md5\x18\x02 \x01(\x0c\x12\x0e\n\x06result\x18\x03 \x01(\r\x12\x10\n\x08\x66\x61il_msg\x18\x04 \x01(\x0c\x12)\n\x08img_info\x18\x05 \x01(\x0b\x32\x17.im.cs.cmd0x388.ImgInfo\x12\x16\n\x0ethumb_down_url\x18\x06 \x03(\x0c\x12\x19\n\x11original_down_url\x18\x07 \x03(\x0c\x12\x14\n\x0c\x62ig_down_url\x18\x08 \x03(\x0c\x12\x0f\n\x07\x64own_ip\x18\t \x03(\r\x12\x11\n\tdown_port\x18\n \x03(\r\x12\x13\n\x0b\x64own_domain\x18\x0b \x01(\x0c\x12\x17\n\x0fthumb_down_para\x18\x0c \x01(\x0c\x12\x1a\n\x12original_down_para\x18\r \x01(\x0c\x12\x15\n\rbig_down_para\x18\x0e \x01(\x0c\x12\x0f\n\x07\x66ile_id\x18\x0f \x01(\x04\x12\x16\n\x0e\x61uto_down_type\x18\x10 \x01(\r\x12\x17\n\x0forder_down_type\x18\x11 \x03(\r\x12\x1b\n\x13\x62ig_thumb_down_para\x18\x13 \x01(\x0c\x12\x16\n\x0ehttps_url_flag\x18\x14 \x01(\r\x12*\n\x08\x64own_ip6\x18\x1a \x03(\x0b\x32\x18.im.cs.cmd0x388.IPv6Info\x12\x12\n\nclient_ip6\x18\x1b \x01(\x0c\"\xa5\x02\n\x0cGetPttUrlReq\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x0f\n\x07\x64st_uin\x18\x02 \x01(\x04\x12\x0e\n\x06\x66ileid\x18\x03 \x01(\x04\x12\x10\n\x08\x66ile_md5\x18\x04 \x01(\x0c\x12\x10\n\x08req_term\x18\x05 \x01(\r\x12\x19\n\x11req_platform_type\x18\x06 \x01(\r\x12\x10\n\x08inner_ip\x18\x07 \x01(\r\x12\x0f\n\x07\x62u_type\x18\x08 \x01(\r\x12\x11\n\tbuild_ver\x18\t \x01(\x0c\x12\x0f\n\x07\x66ile_id\x18\n \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x0b \x01(\x0c\x12\r\n\x05\x63odec\x18\x0c \x01(\r\x12\r\n\x05\x62u_id\x18\r \x01(\r\x12\x19\n\x11req_transfer_type\x18\x0e \x01(\r\x12\x0f\n\x07is_auto\x18\x0f \x01(\r\"\xbd\x02\n\x0cGetPttUrlRsp\x12\x0e\n\x06\x66ileid\x18\x01 \x01(\x04\x12\x10\n\x08\x66ile_md5\x18\x02 \x01(\x0c\x12\x0e\n\x06result\x18\x03 \x01(\r\x12\x10\n\x08\x66\x61il_msg\x18\x04 \x01(\x0c\x12\x10\n\x08\x64own_url\x18\x05 \x03(\x0c\x12\x0f\n\x07\x64own_ip\x18\x06 \x03(\r\x12\x11\n\tdown_port\x18\x07 \x03(\r\x12\x13\n\x0b\x64own_domain\x18\x08 \x01(\x0c\x12\x11\n\tdown_para\x18\t \x01(\x0c\x12\x0f\n\x07\x66ile_id\x18\n \x01(\x04\x12\x15\n\rtransfer_type\x18\x0b \x01(\r\x12\x13\n\x0b\x61llow_retry\x18\x0c \x01(\r\x12*\n\x08\x64own_ip6\x18\x1a \x03(\x0b\x32\x18.im.cs.cmd0x388.IPv6Info\x12\x12\n\nclient_ip6\x18\x1b \x01(\x0c\x12\x0e\n\x06\x64omain\x18\x1c \x01(\t\"%\n\x08IPv6Info\x12\x0b\n\x03ip6\x18\x01 \x01(\x0c\x12\x0c\n\x04port\x18\x02 \x01(\r\"j\n\x07ImgInfo\x12\x10\n\x08\x66ile_md5\x18\x01 \x01(\x0c\x12\x11\n\tfile_type\x18\x02 \x01(\r\x12\x11\n\tfile_size\x18\x03 \x01(\x04\x12\x12\n\nfile_width\x18\x04 \x01(\r\x12\x13\n\x0b\x66ile_height\x18\x05 \x01(\r\"8\n\x07PicSize\x12\x10\n\x08original\x18\x01 \x01(\r\x12\r\n\x05thumb\x18\x02 \x01(\r\x12\x0c\n\x04high\x18\x03 \x01(\r\"\xd7\x02\n\x07ReqBody\x12\x10\n\x08net_type\x18\x01 \x01(\r\x12\x0e\n\x06subcmd\x18\x02 \x01(\r\x12\x32\n\rtryup_img_req\x18\x03 \x03(\x0b\x32\x1b.im.cs.cmd0x388.TryUpImgReq\x12\x34\n\x0egetimg_url_req\x18\x04 \x03(\x0b\x32\x1c.im.cs.cmd0x388.GetImgUrlReq\x12\x32\n\rtryup_ptt_req\x18\x05 \x03(\x0b\x32\x1b.im.cs.cmd0x388.TryUpPttReq\x12\x34\n\x0egetptt_url_req\x18\x06 \x03(\x0b\x32\x1c.im.cs.cmd0x388.GetPttUrlReq\x12\x12\n\ncommand_id\x18\x07 \x01(\r\x12.\n\x0b\x64\x65l_img_req\x18\x08 \x03(\x0b\x32\x19.im.cs.cmd0x388.DelImgReq\x12\x12\n\textension\x18\xe9\x07 \x01(\x0c\"\xb0\x02\n\x07RspBody\x12\x11\n\tclient_ip\x18\x01 \x01(\r\x12\x0e\n\x06subcmd\x18\x02 \x01(\r\x12\x32\n\rtryup_img_rsp\x18\x03 \x03(\x0b\x32\x1b.im.cs.cmd0x388.TryUpImgRsp\x12\x34\n\x0egetimg_url_rsp\x18\x04 \x03(\x0b\x32\x1c.im.cs.cmd0x388.GetImgUrlRsp\x12\x32\n\rtryup_ptt_rsp\x18\x05 \x03(\x0b\x32\x1b.im.cs.cmd0x388.TryUpPttRsp\x12\x34\n\x0egetptt_url_rsp\x18\x06 \x03(\x0b\x32\x1c.im.cs.cmd0x388.GetPttUrlRsp\x12.\n\x0b\x64\x65l_img_rsp\x18\x07 \x03(\x0b\x32\x19.im.cs.cmd0x388.DelImgRsp\"\xc2\x03\n\x0bTryUpImgReq\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x0f\n\x07src_uin\x18\x02 \x01(\x04\x12\x0f\n\x07\x66ile_id\x18\x03 \x01(\x04\x12\x10\n\x08\x66ile_md5\x18\x04 \x01(\x0c\x12\x11\n\tfile_size\x18\x05 \x01(\x04\x12\x11\n\tfile_name\x18\x06 \x01(\x0c\x12\x10\n\x08src_term\x18\x07 \x01(\r\x12\x15\n\rplatform_type\x18\x08 \x01(\r\x12\x0f\n\x07\x62u_type\x18\t \x01(\r\x12\x11\n\tpic_width\x18\n \x01(\r\x12\x12\n\npic_height\x18\x0b \x01(\r\x12\x10\n\x08pic_type\x18\x0c \x01(\r\x12\x11\n\tbuild_ver\x18\r \x01(\x0c\x12\x10\n\x08inner_ip\x18\x0e \x01(\r\x12\x14\n\x0c\x61pp_pic_type\x18\x0f \x01(\r\x12\x14\n\x0coriginal_pic\x18\x10 \x01(\r\x12\x12\n\nfile_index\x18\x11 \x01(\x0c\x12\x0f\n\x07\x64st_uin\x18\x12 \x01(\x04\x12\x12\n\nsrv_upload\x18\x13 \x01(\r\x12\x14\n\x0ctransfer_url\x18\x14 \x01(\x0c\x12\x17\n\x0fqqmeet_guild_id\x18\x15 \x01(\x04\x12\x19\n\x11qqmeet_channel_id\x18\x16 \x01(\x04\"\x87\x03\n\x0bTryUpImgRsp\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\x04\x12\x0e\n\x06result\x18\x02 \x01(\r\x12\x10\n\x08\x66\x61il_msg\x18\x03 \x01(\x0c\x12\x11\n\tfile_exit\x18\x04 \x01(\x08\x12)\n\x08img_info\x18\x05 \x01(\x0b\x32\x17.im.cs.cmd0x388.ImgInfo\x12\r\n\x05up_ip\x18\x06 \x03(\r\x12\x0f\n\x07up_port\x18\x07 \x03(\r\x12\x0f\n\x07up_ukey\x18\x08 \x01(\x0c\x12\x0e\n\x06\x66ileid\x18\t \x01(\x04\x12\x11\n\tup_offset\x18\n \x01(\x04\x12\x12\n\nblock_size\x18\x0b \x01(\x04\x12\x14\n\x0cnew_big_chan\x18\x0c \x01(\x08\x12(\n\x06up_ip6\x18\x1a \x03(\x0b\x32\x18.im.cs.cmd0x388.IPv6Info\x12\x12\n\nclient_ip6\x18\x1b \x01(\x0c\x12\x16\n\x0e\x64ownload_index\x18\x1c \x01(\x0c\x12\x33\n\ninfo4_busi\x18\xe9\x07 \x01(\x0b\x32\x1e.im.cs.cmd0x388.TryUpInfo4Busi\"\x82\x01\n\x0eTryUpInfo4Busi\x12\x13\n\x0b\x64own_domain\x18\x01 \x01(\x0c\x12\x16\n\x0ethumb_down_url\x18\x02 \x01(\x0c\x12\x19\n\x11original_down_url\x18\x03 \x01(\x0c\x12\x14\n\x0c\x62ig_down_url\x18\x04 \x01(\x0c\x12\x12\n\nfile_resid\x18\x05 \x01(\x0c\"\xb7\x02\n\x0bTryUpPttReq\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x0f\n\x07src_uin\x18\x02 \x01(\x04\x12\x0f\n\x07\x66ile_id\x18\x03 \x01(\x04\x12\x10\n\x08\x66ile_md5\x18\x04 \x01(\x0c\x12\x11\n\tfile_size\x18\x05 \x01(\x04\x12\x11\n\tfile_name\x18\x06 \x01(\x0c\x12\x10\n\x08src_term\x18\x07 \x01(\r\x12\x15\n\rplatform_type\x18\x08 \x01(\r\x12\x0f\n\x07\x62u_type\x18\t \x01(\r\x12\x11\n\tbuild_ver\x18\n \x01(\x0c\x12\x10\n\x08inner_ip\x18\x0b \x01(\r\x12\x14\n\x0cvoice_length\x18\x0c \x01(\r\x12\x13\n\x0bnew_up_chan\x18\r \x01(\x08\x12\r\n\x05\x63odec\x18\x0e \x01(\r\x12\x12\n\nvoice_type\x18\x0f \x01(\r\x12\r\n\x05\x62u_id\x18\x10 \x01(\r\"\xa1\x02\n\x0bTryUpPttRsp\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\x04\x12\x0e\n\x06result\x18\x02 \x01(\r\x12\x10\n\x08\x66\x61il_msg\x18\x03 \x01(\x0c\x12\x11\n\tfile_exit\x18\x04 \x01(\x08\x12\r\n\x05up_ip\x18\x05 \x03(\r\x12\x0f\n\x07up_port\x18\x06 \x03(\r\x12\x0f\n\x07up_ukey\x18\x07 \x01(\x0c\x12\x0e\n\x06\x66ileid\x18\x08 \x01(\x04\x12\x11\n\tup_offset\x18\t \x01(\x04\x12\x12\n\nblock_size\x18\n \x01(\x04\x12\x10\n\x08\x66ile_key\x18\x0b \x01(\x0c\x12\x14\n\x0c\x63hannel_type\x18\x0c \x01(\r\x12(\n\x06up_ip6\x18\x1a \x03(\x0b\x32\x18.im.cs.cmd0x388.IPv6Info\x12\x12\n\nclient_ip6\x18\x1b \x01(\x0c')
+
+
+
+_DELIMGREQ = DESCRIPTOR.message_types_by_name['DelImgReq']
+_DELIMGRSP = DESCRIPTOR.message_types_by_name['DelImgRsp']
+_EXPROAMEXTENDINFO = DESCRIPTOR.message_types_by_name['ExpRoamExtendInfo']
+_EXPROAMPICINFO = DESCRIPTOR.message_types_by_name['ExpRoamPicInfo']
+_EXTENSIONCOMMPICTRYUP = DESCRIPTOR.message_types_by_name['ExtensionCommPicTryUp']
+_EXTENSIONEXPROAMTRYUP = DESCRIPTOR.message_types_by_name['ExtensionExpRoamTryUp']
+_GETIMGURLREQ = DESCRIPTOR.message_types_by_name['GetImgUrlReq']
+_GETIMGURLRSP = DESCRIPTOR.message_types_by_name['GetImgUrlRsp']
+_GETPTTURLREQ = DESCRIPTOR.message_types_by_name['GetPttUrlReq']
+_GETPTTURLRSP = DESCRIPTOR.message_types_by_name['GetPttUrlRsp']
+_IPV6INFO = DESCRIPTOR.message_types_by_name['IPv6Info']
+_IMGINFO = DESCRIPTOR.message_types_by_name['ImgInfo']
+_PICSIZE = DESCRIPTOR.message_types_by_name['PicSize']
+_REQBODY = DESCRIPTOR.message_types_by_name['ReqBody']
+_RSPBODY = DESCRIPTOR.message_types_by_name['RspBody']
+_TRYUPIMGREQ = DESCRIPTOR.message_types_by_name['TryUpImgReq']
+_TRYUPIMGRSP = DESCRIPTOR.message_types_by_name['TryUpImgRsp']
+_TRYUPINFO4BUSI = DESCRIPTOR.message_types_by_name['TryUpInfo4Busi']
+_TRYUPPTTREQ = DESCRIPTOR.message_types_by_name['TryUpPttReq']
+_TRYUPPTTRSP = DESCRIPTOR.message_types_by_name['TryUpPttRsp']
+DelImgReq = _reflection.GeneratedProtocolMessageType('DelImgReq', (_message.Message,), {
+  'DESCRIPTOR' : _DELIMGREQ,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.DelImgReq)
+  })
+_sym_db.RegisterMessage(DelImgReq)
+
+DelImgRsp = _reflection.GeneratedProtocolMessageType('DelImgRsp', (_message.Message,), {
+  'DESCRIPTOR' : _DELIMGRSP,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.DelImgRsp)
+  })
+_sym_db.RegisterMessage(DelImgRsp)
+
+ExpRoamExtendInfo = _reflection.GeneratedProtocolMessageType('ExpRoamExtendInfo', (_message.Message,), {
+  'DESCRIPTOR' : _EXPROAMEXTENDINFO,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.ExpRoamExtendInfo)
+  })
+_sym_db.RegisterMessage(ExpRoamExtendInfo)
+
+ExpRoamPicInfo = _reflection.GeneratedProtocolMessageType('ExpRoamPicInfo', (_message.Message,), {
+  'DESCRIPTOR' : _EXPROAMPICINFO,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.ExpRoamPicInfo)
+  })
+_sym_db.RegisterMessage(ExpRoamPicInfo)
+
+ExtensionCommPicTryUp = _reflection.GeneratedProtocolMessageType('ExtensionCommPicTryUp', (_message.Message,), {
+  'DESCRIPTOR' : _EXTENSIONCOMMPICTRYUP,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.ExtensionCommPicTryUp)
+  })
+_sym_db.RegisterMessage(ExtensionCommPicTryUp)
+
+ExtensionExpRoamTryUp = _reflection.GeneratedProtocolMessageType('ExtensionExpRoamTryUp', (_message.Message,), {
+  'DESCRIPTOR' : _EXTENSIONEXPROAMTRYUP,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.ExtensionExpRoamTryUp)
+  })
+_sym_db.RegisterMessage(ExtensionExpRoamTryUp)
+
+GetImgUrlReq = _reflection.GeneratedProtocolMessageType('GetImgUrlReq', (_message.Message,), {
+  'DESCRIPTOR' : _GETIMGURLREQ,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.GetImgUrlReq)
+  })
+_sym_db.RegisterMessage(GetImgUrlReq)
+
+GetImgUrlRsp = _reflection.GeneratedProtocolMessageType('GetImgUrlRsp', (_message.Message,), {
+  'DESCRIPTOR' : _GETIMGURLRSP,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.GetImgUrlRsp)
+  })
+_sym_db.RegisterMessage(GetImgUrlRsp)
+
+GetPttUrlReq = _reflection.GeneratedProtocolMessageType('GetPttUrlReq', (_message.Message,), {
+  'DESCRIPTOR' : _GETPTTURLREQ,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.GetPttUrlReq)
+  })
+_sym_db.RegisterMessage(GetPttUrlReq)
+
+GetPttUrlRsp = _reflection.GeneratedProtocolMessageType('GetPttUrlRsp', (_message.Message,), {
+  'DESCRIPTOR' : _GETPTTURLRSP,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.GetPttUrlRsp)
+  })
+_sym_db.RegisterMessage(GetPttUrlRsp)
+
+IPv6Info = _reflection.GeneratedProtocolMessageType('IPv6Info', (_message.Message,), {
+  'DESCRIPTOR' : _IPV6INFO,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.IPv6Info)
+  })
+_sym_db.RegisterMessage(IPv6Info)
+
+ImgInfo = _reflection.GeneratedProtocolMessageType('ImgInfo', (_message.Message,), {
+  'DESCRIPTOR' : _IMGINFO,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.ImgInfo)
+  })
+_sym_db.RegisterMessage(ImgInfo)
+
+PicSize = _reflection.GeneratedProtocolMessageType('PicSize', (_message.Message,), {
+  'DESCRIPTOR' : _PICSIZE,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.PicSize)
+  })
+_sym_db.RegisterMessage(PicSize)
+
+ReqBody = _reflection.GeneratedProtocolMessageType('ReqBody', (_message.Message,), {
+  'DESCRIPTOR' : _REQBODY,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.ReqBody)
+  })
+_sym_db.RegisterMessage(ReqBody)
+
+RspBody = _reflection.GeneratedProtocolMessageType('RspBody', (_message.Message,), {
+  'DESCRIPTOR' : _RSPBODY,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.RspBody)
+  })
+_sym_db.RegisterMessage(RspBody)
+
+TryUpImgReq = _reflection.GeneratedProtocolMessageType('TryUpImgReq', (_message.Message,), {
+  'DESCRIPTOR' : _TRYUPIMGREQ,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.TryUpImgReq)
+  })
+_sym_db.RegisterMessage(TryUpImgReq)
+
+TryUpImgRsp = _reflection.GeneratedProtocolMessageType('TryUpImgRsp', (_message.Message,), {
+  'DESCRIPTOR' : _TRYUPIMGRSP,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.TryUpImgRsp)
+  })
+_sym_db.RegisterMessage(TryUpImgRsp)
+
+TryUpInfo4Busi = _reflection.GeneratedProtocolMessageType('TryUpInfo4Busi', (_message.Message,), {
+  'DESCRIPTOR' : _TRYUPINFO4BUSI,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.TryUpInfo4Busi)
+  })
+_sym_db.RegisterMessage(TryUpInfo4Busi)
+
+TryUpPttReq = _reflection.GeneratedProtocolMessageType('TryUpPttReq', (_message.Message,), {
+  'DESCRIPTOR' : _TRYUPPTTREQ,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.TryUpPttReq)
+  })
+_sym_db.RegisterMessage(TryUpPttReq)
+
+TryUpPttRsp = _reflection.GeneratedProtocolMessageType('TryUpPttRsp', (_message.Message,), {
+  'DESCRIPTOR' : _TRYUPPTTRSP,
+  '__module__' : 'cai.pb.im.cs.cmd0x388.cmd0x388_pb2'
+  # @@protoc_insertion_point(class_scope:im.cs.cmd0x388.TryUpPttRsp)
+  })
+_sym_db.RegisterMessage(TryUpPttRsp)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _DELIMGREQ._serialized_start=57
+  _DELIMGREQ._serialized_end=242
+  _DELIMGRSP._serialized_start=244
+  _DELIMGRSP._serialized_end=309
+  _EXPROAMEXTENDINFO._serialized_start=311
+  _EXPROAMEXTENDINFO._serialized_end=345
+  _EXPROAMPICINFO._serialized_start=347
+  _EXPROAMPICINFO._serialized_end=414
+  _EXTENSIONCOMMPICTRYUP._serialized_start=416
+  _EXTENSIONCOMMPICTRYUP._serialized_end=456
+  _EXTENSIONEXPROAMTRYUP._serialized_start=458
+  _EXTENSIONEXPROAMTRYUP._serialized_end=539
+  _GETIMGURLREQ._serialized_start=542
+  _GETIMGURLREQ._serialized_end=1027
+  _GETIMGURLRSP._serialized_start=1030
+  _GETIMGURLRSP._serialized_end=1544
+  _GETPTTURLREQ._serialized_start=1547
+  _GETPTTURLREQ._serialized_end=1840
+  _GETPTTURLRSP._serialized_start=1843
+  _GETPTTURLRSP._serialized_end=2160
+  _IPV6INFO._serialized_start=2162
+  _IPV6INFO._serialized_end=2199
+  _IMGINFO._serialized_start=2201
+  _IMGINFO._serialized_end=2307
+  _PICSIZE._serialized_start=2309
+  _PICSIZE._serialized_end=2365
+  _REQBODY._serialized_start=2368
+  _REQBODY._serialized_end=2711
+  _RSPBODY._serialized_start=2714
+  _RSPBODY._serialized_end=3018
+  _TRYUPIMGREQ._serialized_start=3021
+  _TRYUPIMGREQ._serialized_end=3471
+  _TRYUPIMGRSP._serialized_start=3474
+  _TRYUPIMGRSP._serialized_end=3865
+  _TRYUPINFO4BUSI._serialized_start=3868
+  _TRYUPINFO4BUSI._serialized_end=3998
+  _TRYUPPTTREQ._serialized_start=4001
+  _TRYUPPTTREQ._serialized_end=4312
+  _TRYUPPTTRSP._serialized_start=4315
+  _TRYUPPTTRSP._serialized_end=4604
+# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/cs/cmd0x388/cmd0x388_pb2.pyi b/cai/pb/im/cs/cmd0x388/cmd0x388_pb2.pyi
new file mode 100644
index 00000000..9ac4c16f
--- /dev/null
+++ b/cai/pb/im/cs/cmd0x388/cmd0x388_pb2.pyi
@@ -0,0 +1,802 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+from builtins import (
+    bool,
+    bytes,
+    int,
+)
+
+from google.protobuf.descriptor import (
+    Descriptor,
+    FileDescriptor,
+)
+
+from google.protobuf.internal.containers import (
+    RepeatedCompositeFieldContainer,
+    RepeatedScalarFieldContainer,
+)
+
+from google.protobuf.message import (
+    Message,
+)
+
+from typing import (
+    Iterable,
+    Optional,
+    Text,
+)
+
+from typing_extensions import (
+    Literal,
+)
+
+
+DESCRIPTOR: FileDescriptor
+
+class DelImgReq(Message):
+    """tencent/im/cs/cmd0x388/cmd0x388.java
+
+    """
+    DESCRIPTOR: Descriptor
+    SRC_UIN_FIELD_NUMBER: int
+    DST_UIN_FIELD_NUMBER: int
+    REQ_TERM_FIELD_NUMBER: int
+    REQ_PLATFORM_TYPE_FIELD_NUMBER: int
+    BU_TYPE_FIELD_NUMBER: int
+    BUILD_VER_FIELD_NUMBER: int
+    FILE_RESID_FIELD_NUMBER: int
+    PIC_WIDTH_FIELD_NUMBER: int
+    PIC_HEIGHT_FIELD_NUMBER: int
+    src_uin: int
+    dst_uin: int
+    req_term: int
+    req_platform_type: int
+    bu_type: int
+    build_ver: bytes
+    file_resid: bytes
+    pic_width: int
+    pic_height: int
+    def __init__(self,
+        *,
+        src_uin: Optional[int] = ...,
+        dst_uin: Optional[int] = ...,
+        req_term: Optional[int] = ...,
+        req_platform_type: Optional[int] = ...,
+        bu_type: Optional[int] = ...,
+        build_ver: Optional[bytes] = ...,
+        file_resid: Optional[bytes] = ...,
+        pic_width: Optional[int] = ...,
+        pic_height: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["bu_type",b"bu_type","build_ver",b"build_ver","dst_uin",b"dst_uin","file_resid",b"file_resid","pic_height",b"pic_height","pic_width",b"pic_width","req_platform_type",b"req_platform_type","req_term",b"req_term","src_uin",b"src_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bu_type",b"bu_type","build_ver",b"build_ver","dst_uin",b"dst_uin","file_resid",b"file_resid","pic_height",b"pic_height","pic_width",b"pic_width","req_platform_type",b"req_platform_type","req_term",b"req_term","src_uin",b"src_uin"]) -> None: ...
+
+class DelImgRsp(Message):
+    DESCRIPTOR: Descriptor
+    RESULT_FIELD_NUMBER: int
+    FAIL_MSG_FIELD_NUMBER: int
+    FILE_RESID_FIELD_NUMBER: int
+    result: int
+    fail_msg: bytes
+    file_resid: bytes
+    def __init__(self,
+        *,
+        result: Optional[int] = ...,
+        fail_msg: Optional[bytes] = ...,
+        file_resid: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["fail_msg",b"fail_msg","file_resid",b"file_resid","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["fail_msg",b"fail_msg","file_resid",b"file_resid","result",b"result"]) -> None: ...
+
+class ExpRoamExtendInfo(Message):
+    DESCRIPTOR: Descriptor
+    RESID_FIELD_NUMBER: int
+    resid: bytes
+    def __init__(self,
+        *,
+        resid: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["resid",b"resid"]) -> bool: ...
+    def ClearField(self, field_name: Literal["resid",b"resid"]) -> None: ...
+
+class ExpRoamPicInfo(Message):
+    DESCRIPTOR: Descriptor
+    SHOP_FLAG_FIELD_NUMBER: int
+    PKG_ID_FIELD_NUMBER: int
+    PIC_ID_FIELD_NUMBER: int
+    shop_flag: int
+    pkg_id: int
+    pic_id: bytes
+    def __init__(self,
+        *,
+        shop_flag: Optional[int] = ...,
+        pkg_id: Optional[int] = ...,
+        pic_id: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["pic_id",b"pic_id","pkg_id",b"pkg_id","shop_flag",b"shop_flag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["pic_id",b"pic_id","pkg_id",b"pkg_id","shop_flag",b"shop_flag"]) -> None: ...
+
+class ExtensionCommPicTryUp(Message):
+    DESCRIPTOR: Descriptor
+    EXTINFO_FIELD_NUMBER: int
+    @property
+    def extinfo(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    def __init__(self,
+        *,
+        extinfo: Optional[Iterable[bytes]] = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["extinfo",b"extinfo"]) -> None: ...
+
+class ExtensionExpRoamTryUp(Message):
+    DESCRIPTOR: Descriptor
+    EXPROAM_PIC_INFO_FIELD_NUMBER: int
+    @property
+    def exproam_pic_info(self) -> RepeatedCompositeFieldContainer[ExpRoamPicInfo]: ...
+    def __init__(self,
+        *,
+        exproam_pic_info: Optional[Iterable[ExpRoamPicInfo]] = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["exproam_pic_info",b"exproam_pic_info"]) -> None: ...
+
+class GetImgUrlReq(Message):
+    DESCRIPTOR: Descriptor
+    GROUP_CODE_FIELD_NUMBER: int
+    DST_UIN_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    FILE_MD5_FIELD_NUMBER: int
+    URL_FLAG_FIELD_NUMBER: int
+    URL_TYPE_FIELD_NUMBER: int
+    REQ_TERM_FIELD_NUMBER: int
+    REQ_PLATFORM_TYPE_FIELD_NUMBER: int
+    INNER_IP_FIELD_NUMBER: int
+    BU_TYPE_FIELD_NUMBER: int
+    BUILD_VER_FIELD_NUMBER: int
+    FILE_ID_FIELD_NUMBER: int
+    FILE_SIZE_FIELD_NUMBER: int
+    ORIGINAL_PIC_FIELD_NUMBER: int
+    RETRY_REQ_FIELD_NUMBER: int
+    FILE_HEIGHT_FIELD_NUMBER: int
+    FILE_WIDTH_FIELD_NUMBER: int
+    PIC_TYPE_FIELD_NUMBER: int
+    PIC_UP_TIMESTAMP_FIELD_NUMBER: int
+    REQ_TRANSFER_TYPE_FIELD_NUMBER: int
+    QQMEET_GUILD_ID_FIELD_NUMBER: int
+    QQMEET_CHANNEL_ID_FIELD_NUMBER: int
+    DOWNLOAD_INDEX_FIELD_NUMBER: int
+    group_code: int
+    dst_uin: int
+    fileid: int
+    file_md5: bytes
+    url_flag: int
+    url_type: int
+    req_term: int
+    req_platform_type: int
+    inner_ip: int
+    bu_type: int
+    build_ver: bytes
+    file_id: int
+    file_size: int
+    original_pic: int
+    retry_req: int
+    file_height: int
+    file_width: int
+    pic_type: int
+    pic_up_timestamp: int
+    req_transfer_type: int
+    qqmeet_guild_id: int
+    qqmeet_channel_id: int
+    download_index: bytes
+    def __init__(self,
+        *,
+        group_code: Optional[int] = ...,
+        dst_uin: Optional[int] = ...,
+        fileid: Optional[int] = ...,
+        file_md5: Optional[bytes] = ...,
+        url_flag: Optional[int] = ...,
+        url_type: Optional[int] = ...,
+        req_term: Optional[int] = ...,
+        req_platform_type: Optional[int] = ...,
+        inner_ip: Optional[int] = ...,
+        bu_type: Optional[int] = ...,
+        build_ver: Optional[bytes] = ...,
+        file_id: Optional[int] = ...,
+        file_size: Optional[int] = ...,
+        original_pic: Optional[int] = ...,
+        retry_req: Optional[int] = ...,
+        file_height: Optional[int] = ...,
+        file_width: Optional[int] = ...,
+        pic_type: Optional[int] = ...,
+        pic_up_timestamp: Optional[int] = ...,
+        req_transfer_type: Optional[int] = ...,
+        qqmeet_guild_id: Optional[int] = ...,
+        qqmeet_channel_id: Optional[int] = ...,
+        download_index: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["bu_type",b"bu_type","build_ver",b"build_ver","download_index",b"download_index","dst_uin",b"dst_uin","file_height",b"file_height","file_id",b"file_id","file_md5",b"file_md5","file_size",b"file_size","file_width",b"file_width","fileid",b"fileid","group_code",b"group_code","inner_ip",b"inner_ip","original_pic",b"original_pic","pic_type",b"pic_type","pic_up_timestamp",b"pic_up_timestamp","qqmeet_channel_id",b"qqmeet_channel_id","qqmeet_guild_id",b"qqmeet_guild_id","req_platform_type",b"req_platform_type","req_term",b"req_term","req_transfer_type",b"req_transfer_type","retry_req",b"retry_req","url_flag",b"url_flag","url_type",b"url_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bu_type",b"bu_type","build_ver",b"build_ver","download_index",b"download_index","dst_uin",b"dst_uin","file_height",b"file_height","file_id",b"file_id","file_md5",b"file_md5","file_size",b"file_size","file_width",b"file_width","fileid",b"fileid","group_code",b"group_code","inner_ip",b"inner_ip","original_pic",b"original_pic","pic_type",b"pic_type","pic_up_timestamp",b"pic_up_timestamp","qqmeet_channel_id",b"qqmeet_channel_id","qqmeet_guild_id",b"qqmeet_guild_id","req_platform_type",b"req_platform_type","req_term",b"req_term","req_transfer_type",b"req_transfer_type","retry_req",b"retry_req","url_flag",b"url_flag","url_type",b"url_type"]) -> None: ...
+
+class GetImgUrlRsp(Message):
+    DESCRIPTOR: Descriptor
+    FILEID_FIELD_NUMBER: int
+    FILE_MD5_FIELD_NUMBER: int
+    RESULT_FIELD_NUMBER: int
+    FAIL_MSG_FIELD_NUMBER: int
+    IMG_INFO_FIELD_NUMBER: int
+    THUMB_DOWN_URL_FIELD_NUMBER: int
+    ORIGINAL_DOWN_URL_FIELD_NUMBER: int
+    BIG_DOWN_URL_FIELD_NUMBER: int
+    DOWN_IP_FIELD_NUMBER: int
+    DOWN_PORT_FIELD_NUMBER: int
+    DOWN_DOMAIN_FIELD_NUMBER: int
+    THUMB_DOWN_PARA_FIELD_NUMBER: int
+    ORIGINAL_DOWN_PARA_FIELD_NUMBER: int
+    BIG_DOWN_PARA_FIELD_NUMBER: int
+    FILE_ID_FIELD_NUMBER: int
+    AUTO_DOWN_TYPE_FIELD_NUMBER: int
+    ORDER_DOWN_TYPE_FIELD_NUMBER: int
+    BIG_THUMB_DOWN_PARA_FIELD_NUMBER: int
+    HTTPS_URL_FLAG_FIELD_NUMBER: int
+    DOWN_IP6_FIELD_NUMBER: int
+    CLIENT_IP6_FIELD_NUMBER: int
+    fileid: int
+    file_md5: bytes
+    result: int
+    fail_msg: bytes
+    @property
+    def img_info(self) -> ImgInfo: ...
+    @property
+    def thumb_down_url(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    @property
+    def original_down_url(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    @property
+    def big_down_url(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    @property
+    def down_ip(self) -> RepeatedScalarFieldContainer[int]: ...
+    @property
+    def down_port(self) -> RepeatedScalarFieldContainer[int]: ...
+    down_domain: bytes
+    thumb_down_para: bytes
+    original_down_para: bytes
+    big_down_para: bytes
+    file_id: int
+    auto_down_type: int
+    @property
+    def order_down_type(self) -> RepeatedScalarFieldContainer[int]: ...
+    big_thumb_down_para: bytes
+    https_url_flag: int
+    @property
+    def down_ip6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
+    client_ip6: bytes
+    def __init__(self,
+        *,
+        fileid: Optional[int] = ...,
+        file_md5: Optional[bytes] = ...,
+        result: Optional[int] = ...,
+        fail_msg: Optional[bytes] = ...,
+        img_info: Optional[ImgInfo] = ...,
+        thumb_down_url: Optional[Iterable[bytes]] = ...,
+        original_down_url: Optional[Iterable[bytes]] = ...,
+        big_down_url: Optional[Iterable[bytes]] = ...,
+        down_ip: Optional[Iterable[int]] = ...,
+        down_port: Optional[Iterable[int]] = ...,
+        down_domain: Optional[bytes] = ...,
+        thumb_down_para: Optional[bytes] = ...,
+        original_down_para: Optional[bytes] = ...,
+        big_down_para: Optional[bytes] = ...,
+        file_id: Optional[int] = ...,
+        auto_down_type: Optional[int] = ...,
+        order_down_type: Optional[Iterable[int]] = ...,
+        big_thumb_down_para: Optional[bytes] = ...,
+        https_url_flag: Optional[int] = ...,
+        down_ip6: Optional[Iterable[IPv6Info]] = ...,
+        client_ip6: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["auto_down_type",b"auto_down_type","big_down_para",b"big_down_para","big_thumb_down_para",b"big_thumb_down_para","client_ip6",b"client_ip6","down_domain",b"down_domain","fail_msg",b"fail_msg","file_id",b"file_id","file_md5",b"file_md5","fileid",b"fileid","https_url_flag",b"https_url_flag","img_info",b"img_info","original_down_para",b"original_down_para","result",b"result","thumb_down_para",b"thumb_down_para"]) -> bool: ...
+    def ClearField(self, field_name: Literal["auto_down_type",b"auto_down_type","big_down_para",b"big_down_para","big_down_url",b"big_down_url","big_thumb_down_para",b"big_thumb_down_para","client_ip6",b"client_ip6","down_domain",b"down_domain","down_ip",b"down_ip","down_ip6",b"down_ip6","down_port",b"down_port","fail_msg",b"fail_msg","file_id",b"file_id","file_md5",b"file_md5","fileid",b"fileid","https_url_flag",b"https_url_flag","img_info",b"img_info","order_down_type",b"order_down_type","original_down_para",b"original_down_para","original_down_url",b"original_down_url","result",b"result","thumb_down_para",b"thumb_down_para","thumb_down_url",b"thumb_down_url"]) -> None: ...
+
+class GetPttUrlReq(Message):
+    DESCRIPTOR: Descriptor
+    GROUP_CODE_FIELD_NUMBER: int
+    DST_UIN_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    FILE_MD5_FIELD_NUMBER: int
+    REQ_TERM_FIELD_NUMBER: int
+    REQ_PLATFORM_TYPE_FIELD_NUMBER: int
+    INNER_IP_FIELD_NUMBER: int
+    BU_TYPE_FIELD_NUMBER: int
+    BUILD_VER_FIELD_NUMBER: int
+    FILE_ID_FIELD_NUMBER: int
+    FILE_KEY_FIELD_NUMBER: int
+    CODEC_FIELD_NUMBER: int
+    BU_ID_FIELD_NUMBER: int
+    REQ_TRANSFER_TYPE_FIELD_NUMBER: int
+    IS_AUTO_FIELD_NUMBER: int
+    group_code: int
+    dst_uin: int
+    fileid: int
+    file_md5: bytes
+    req_term: int
+    req_platform_type: int
+    inner_ip: int
+    bu_type: int
+    build_ver: bytes
+    file_id: int
+    file_key: bytes
+    codec: int
+    bu_id: int
+    req_transfer_type: int
+    is_auto: int
+    def __init__(self,
+        *,
+        group_code: Optional[int] = ...,
+        dst_uin: Optional[int] = ...,
+        fileid: Optional[int] = ...,
+        file_md5: Optional[bytes] = ...,
+        req_term: Optional[int] = ...,
+        req_platform_type: Optional[int] = ...,
+        inner_ip: Optional[int] = ...,
+        bu_type: Optional[int] = ...,
+        build_ver: Optional[bytes] = ...,
+        file_id: Optional[int] = ...,
+        file_key: Optional[bytes] = ...,
+        codec: Optional[int] = ...,
+        bu_id: Optional[int] = ...,
+        req_transfer_type: Optional[int] = ...,
+        is_auto: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["bu_id",b"bu_id","bu_type",b"bu_type","build_ver",b"build_ver","codec",b"codec","dst_uin",b"dst_uin","file_id",b"file_id","file_key",b"file_key","file_md5",b"file_md5","fileid",b"fileid","group_code",b"group_code","inner_ip",b"inner_ip","is_auto",b"is_auto","req_platform_type",b"req_platform_type","req_term",b"req_term","req_transfer_type",b"req_transfer_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bu_id",b"bu_id","bu_type",b"bu_type","build_ver",b"build_ver","codec",b"codec","dst_uin",b"dst_uin","file_id",b"file_id","file_key",b"file_key","file_md5",b"file_md5","fileid",b"fileid","group_code",b"group_code","inner_ip",b"inner_ip","is_auto",b"is_auto","req_platform_type",b"req_platform_type","req_term",b"req_term","req_transfer_type",b"req_transfer_type"]) -> None: ...
+
+class GetPttUrlRsp(Message):
+    DESCRIPTOR: Descriptor
+    FILEID_FIELD_NUMBER: int
+    FILE_MD5_FIELD_NUMBER: int
+    RESULT_FIELD_NUMBER: int
+    FAIL_MSG_FIELD_NUMBER: int
+    DOWN_URL_FIELD_NUMBER: int
+    DOWN_IP_FIELD_NUMBER: int
+    DOWN_PORT_FIELD_NUMBER: int
+    DOWN_DOMAIN_FIELD_NUMBER: int
+    DOWN_PARA_FIELD_NUMBER: int
+    FILE_ID_FIELD_NUMBER: int
+    TRANSFER_TYPE_FIELD_NUMBER: int
+    ALLOW_RETRY_FIELD_NUMBER: int
+    DOWN_IP6_FIELD_NUMBER: int
+    CLIENT_IP6_FIELD_NUMBER: int
+    DOMAIN_FIELD_NUMBER: int
+    fileid: int
+    file_md5: bytes
+    result: int
+    fail_msg: bytes
+    @property
+    def down_url(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    @property
+    def down_ip(self) -> RepeatedScalarFieldContainer[int]: ...
+    @property
+    def down_port(self) -> RepeatedScalarFieldContainer[int]: ...
+    down_domain: bytes
+    down_para: bytes
+    file_id: int
+    transfer_type: int
+    allow_retry: int
+    @property
+    def down_ip6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
+    client_ip6: bytes
+    domain: Text
+    def __init__(self,
+        *,
+        fileid: Optional[int] = ...,
+        file_md5: Optional[bytes] = ...,
+        result: Optional[int] = ...,
+        fail_msg: Optional[bytes] = ...,
+        down_url: Optional[Iterable[bytes]] = ...,
+        down_ip: Optional[Iterable[int]] = ...,
+        down_port: Optional[Iterable[int]] = ...,
+        down_domain: Optional[bytes] = ...,
+        down_para: Optional[bytes] = ...,
+        file_id: Optional[int] = ...,
+        transfer_type: Optional[int] = ...,
+        allow_retry: Optional[int] = ...,
+        down_ip6: Optional[Iterable[IPv6Info]] = ...,
+        client_ip6: Optional[bytes] = ...,
+        domain: Optional[Text] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["allow_retry",b"allow_retry","client_ip6",b"client_ip6","domain",b"domain","down_domain",b"down_domain","down_para",b"down_para","fail_msg",b"fail_msg","file_id",b"file_id","file_md5",b"file_md5","fileid",b"fileid","result",b"result","transfer_type",b"transfer_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["allow_retry",b"allow_retry","client_ip6",b"client_ip6","domain",b"domain","down_domain",b"down_domain","down_ip",b"down_ip","down_ip6",b"down_ip6","down_para",b"down_para","down_port",b"down_port","down_url",b"down_url","fail_msg",b"fail_msg","file_id",b"file_id","file_md5",b"file_md5","fileid",b"fileid","result",b"result","transfer_type",b"transfer_type"]) -> None: ...
+
+class IPv6Info(Message):
+    DESCRIPTOR: Descriptor
+    IP6_FIELD_NUMBER: int
+    PORT_FIELD_NUMBER: int
+    ip6: bytes
+    port: int
+    def __init__(self,
+        *,
+        ip6: Optional[bytes] = ...,
+        port: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["ip6",b"ip6","port",b"port"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ip6",b"ip6","port",b"port"]) -> None: ...
+
+class ImgInfo(Message):
+    DESCRIPTOR: Descriptor
+    FILE_MD5_FIELD_NUMBER: int
+    FILE_TYPE_FIELD_NUMBER: int
+    FILE_SIZE_FIELD_NUMBER: int
+    FILE_WIDTH_FIELD_NUMBER: int
+    FILE_HEIGHT_FIELD_NUMBER: int
+    file_md5: bytes
+    file_type: int
+    file_size: int
+    file_width: int
+    file_height: int
+    def __init__(self,
+        *,
+        file_md5: Optional[bytes] = ...,
+        file_type: Optional[int] = ...,
+        file_size: Optional[int] = ...,
+        file_width: Optional[int] = ...,
+        file_height: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["file_height",b"file_height","file_md5",b"file_md5","file_size",b"file_size","file_type",b"file_type","file_width",b"file_width"]) -> bool: ...
+    def ClearField(self, field_name: Literal["file_height",b"file_height","file_md5",b"file_md5","file_size",b"file_size","file_type",b"file_type","file_width",b"file_width"]) -> None: ...
+
+class PicSize(Message):
+    DESCRIPTOR: Descriptor
+    ORIGINAL_FIELD_NUMBER: int
+    THUMB_FIELD_NUMBER: int
+    HIGH_FIELD_NUMBER: int
+    original: int
+    thumb: int
+    high: int
+    def __init__(self,
+        *,
+        original: Optional[int] = ...,
+        thumb: Optional[int] = ...,
+        high: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["high",b"high","original",b"original","thumb",b"thumb"]) -> bool: ...
+    def ClearField(self, field_name: Literal["high",b"high","original",b"original","thumb",b"thumb"]) -> None: ...
+
+class ReqBody(Message):
+    DESCRIPTOR: Descriptor
+    NET_TYPE_FIELD_NUMBER: int
+    SUBCMD_FIELD_NUMBER: int
+    TRYUP_IMG_REQ_FIELD_NUMBER: int
+    GETIMG_URL_REQ_FIELD_NUMBER: int
+    TRYUP_PTT_REQ_FIELD_NUMBER: int
+    GETPTT_URL_REQ_FIELD_NUMBER: int
+    COMMAND_ID_FIELD_NUMBER: int
+    DEL_IMG_REQ_FIELD_NUMBER: int
+    EXTENSION_FIELD_NUMBER: int
+    net_type: int
+    subcmd: int
+    @property
+    def tryup_img_req(self) -> RepeatedCompositeFieldContainer[TryUpImgReq]: ...
+    @property
+    def getimg_url_req(self) -> RepeatedCompositeFieldContainer[GetImgUrlReq]: ...
+    @property
+    def tryup_ptt_req(self) -> RepeatedCompositeFieldContainer[TryUpPttReq]: ...
+    @property
+    def getptt_url_req(self) -> RepeatedCompositeFieldContainer[GetPttUrlReq]: ...
+    command_id: int
+    @property
+    def del_img_req(self) -> RepeatedCompositeFieldContainer[DelImgReq]: ...
+    extension: bytes
+    def __init__(self,
+        *,
+        net_type: Optional[int] = ...,
+        subcmd: Optional[int] = ...,
+        tryup_img_req: Optional[Iterable[TryUpImgReq]] = ...,
+        getimg_url_req: Optional[Iterable[GetImgUrlReq]] = ...,
+        tryup_ptt_req: Optional[Iterable[TryUpPttReq]] = ...,
+        getptt_url_req: Optional[Iterable[GetPttUrlReq]] = ...,
+        command_id: Optional[int] = ...,
+        del_img_req: Optional[Iterable[DelImgReq]] = ...,
+        extension: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["command_id",b"command_id","extension",b"extension","net_type",b"net_type","subcmd",b"subcmd"]) -> bool: ...
+    def ClearField(self, field_name: Literal["command_id",b"command_id","del_img_req",b"del_img_req","extension",b"extension","getimg_url_req",b"getimg_url_req","getptt_url_req",b"getptt_url_req","net_type",b"net_type","subcmd",b"subcmd","tryup_img_req",b"tryup_img_req","tryup_ptt_req",b"tryup_ptt_req"]) -> None: ...
+
+class RspBody(Message):
+    DESCRIPTOR: Descriptor
+    CLIENT_IP_FIELD_NUMBER: int
+    SUBCMD_FIELD_NUMBER: int
+    TRYUP_IMG_RSP_FIELD_NUMBER: int
+    GETIMG_URL_RSP_FIELD_NUMBER: int
+    TRYUP_PTT_RSP_FIELD_NUMBER: int
+    GETPTT_URL_RSP_FIELD_NUMBER: int
+    DEL_IMG_RSP_FIELD_NUMBER: int
+    client_ip: int
+    subcmd: int
+    @property
+    def tryup_img_rsp(self) -> RepeatedCompositeFieldContainer[TryUpImgRsp]: ...
+    @property
+    def getimg_url_rsp(self) -> RepeatedCompositeFieldContainer[GetImgUrlRsp]: ...
+    @property
+    def tryup_ptt_rsp(self) -> RepeatedCompositeFieldContainer[TryUpPttRsp]: ...
+    @property
+    def getptt_url_rsp(self) -> RepeatedCompositeFieldContainer[GetPttUrlRsp]: ...
+    @property
+    def del_img_rsp(self) -> RepeatedCompositeFieldContainer[DelImgRsp]: ...
+    def __init__(self,
+        *,
+        client_ip: Optional[int] = ...,
+        subcmd: Optional[int] = ...,
+        tryup_img_rsp: Optional[Iterable[TryUpImgRsp]] = ...,
+        getimg_url_rsp: Optional[Iterable[GetImgUrlRsp]] = ...,
+        tryup_ptt_rsp: Optional[Iterable[TryUpPttRsp]] = ...,
+        getptt_url_rsp: Optional[Iterable[GetPttUrlRsp]] = ...,
+        del_img_rsp: Optional[Iterable[DelImgRsp]] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["client_ip",b"client_ip","subcmd",b"subcmd"]) -> bool: ...
+    def ClearField(self, field_name: Literal["client_ip",b"client_ip","del_img_rsp",b"del_img_rsp","getimg_url_rsp",b"getimg_url_rsp","getptt_url_rsp",b"getptt_url_rsp","subcmd",b"subcmd","tryup_img_rsp",b"tryup_img_rsp","tryup_ptt_rsp",b"tryup_ptt_rsp"]) -> None: ...
+
+class TryUpImgReq(Message):
+    DESCRIPTOR: Descriptor
+    GROUP_CODE_FIELD_NUMBER: int
+    SRC_UIN_FIELD_NUMBER: int
+    FILE_ID_FIELD_NUMBER: int
+    FILE_MD5_FIELD_NUMBER: int
+    FILE_SIZE_FIELD_NUMBER: int
+    FILE_NAME_FIELD_NUMBER: int
+    SRC_TERM_FIELD_NUMBER: int
+    PLATFORM_TYPE_FIELD_NUMBER: int
+    BU_TYPE_FIELD_NUMBER: int
+    PIC_WIDTH_FIELD_NUMBER: int
+    PIC_HEIGHT_FIELD_NUMBER: int
+    PIC_TYPE_FIELD_NUMBER: int
+    BUILD_VER_FIELD_NUMBER: int
+    INNER_IP_FIELD_NUMBER: int
+    APP_PIC_TYPE_FIELD_NUMBER: int
+    ORIGINAL_PIC_FIELD_NUMBER: int
+    FILE_INDEX_FIELD_NUMBER: int
+    DST_UIN_FIELD_NUMBER: int
+    SRV_UPLOAD_FIELD_NUMBER: int
+    TRANSFER_URL_FIELD_NUMBER: int
+    QQMEET_GUILD_ID_FIELD_NUMBER: int
+    QQMEET_CHANNEL_ID_FIELD_NUMBER: int
+    group_code: int
+    src_uin: int
+    file_id: int
+    file_md5: bytes
+    file_size: int
+    file_name: bytes
+    src_term: int
+    platform_type: int
+    bu_type: int
+    pic_width: int
+    pic_height: int
+    pic_type: int
+    build_ver: bytes
+    inner_ip: int
+    app_pic_type: int
+    original_pic: int
+    file_index: bytes
+    dst_uin: int
+    srv_upload: int
+    transfer_url: bytes
+    qqmeet_guild_id: int
+    qqmeet_channel_id: int
+    def __init__(self,
+        *,
+        group_code: Optional[int] = ...,
+        src_uin: Optional[int] = ...,
+        file_id: Optional[int] = ...,
+        file_md5: Optional[bytes] = ...,
+        file_size: Optional[int] = ...,
+        file_name: Optional[bytes] = ...,
+        src_term: Optional[int] = ...,
+        platform_type: Optional[int] = ...,
+        bu_type: Optional[int] = ...,
+        pic_width: Optional[int] = ...,
+        pic_height: Optional[int] = ...,
+        pic_type: Optional[int] = ...,
+        build_ver: Optional[bytes] = ...,
+        inner_ip: Optional[int] = ...,
+        app_pic_type: Optional[int] = ...,
+        original_pic: Optional[int] = ...,
+        file_index: Optional[bytes] = ...,
+        dst_uin: Optional[int] = ...,
+        srv_upload: Optional[int] = ...,
+        transfer_url: Optional[bytes] = ...,
+        qqmeet_guild_id: Optional[int] = ...,
+        qqmeet_channel_id: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["app_pic_type",b"app_pic_type","bu_type",b"bu_type","build_ver",b"build_ver","dst_uin",b"dst_uin","file_id",b"file_id","file_index",b"file_index","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","group_code",b"group_code","inner_ip",b"inner_ip","original_pic",b"original_pic","pic_height",b"pic_height","pic_type",b"pic_type","pic_width",b"pic_width","platform_type",b"platform_type","qqmeet_channel_id",b"qqmeet_channel_id","qqmeet_guild_id",b"qqmeet_guild_id","src_term",b"src_term","src_uin",b"src_uin","srv_upload",b"srv_upload","transfer_url",b"transfer_url"]) -> bool: ...
+    def ClearField(self, field_name: Literal["app_pic_type",b"app_pic_type","bu_type",b"bu_type","build_ver",b"build_ver","dst_uin",b"dst_uin","file_id",b"file_id","file_index",b"file_index","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","group_code",b"group_code","inner_ip",b"inner_ip","original_pic",b"original_pic","pic_height",b"pic_height","pic_type",b"pic_type","pic_width",b"pic_width","platform_type",b"platform_type","qqmeet_channel_id",b"qqmeet_channel_id","qqmeet_guild_id",b"qqmeet_guild_id","src_term",b"src_term","src_uin",b"src_uin","srv_upload",b"srv_upload","transfer_url",b"transfer_url"]) -> None: ...
+
+class TryUpImgRsp(Message):
+    DESCRIPTOR: Descriptor
+    FILE_ID_FIELD_NUMBER: int
+    RESULT_FIELD_NUMBER: int
+    FAIL_MSG_FIELD_NUMBER: int
+    FILE_EXIT_FIELD_NUMBER: int
+    IMG_INFO_FIELD_NUMBER: int
+    UP_IP_FIELD_NUMBER: int
+    UP_PORT_FIELD_NUMBER: int
+    UP_UKEY_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    UP_OFFSET_FIELD_NUMBER: int
+    BLOCK_SIZE_FIELD_NUMBER: int
+    NEW_BIG_CHAN_FIELD_NUMBER: int
+    UP_IP6_FIELD_NUMBER: int
+    CLIENT_IP6_FIELD_NUMBER: int
+    DOWNLOAD_INDEX_FIELD_NUMBER: int
+    INFO4_BUSI_FIELD_NUMBER: int
+    file_id: int
+    result: int
+    fail_msg: bytes
+    file_exit: bool
+    @property
+    def img_info(self) -> ImgInfo: ...
+    @property
+    def up_ip(self) -> RepeatedScalarFieldContainer[int]: ...
+    @property
+    def up_port(self) -> RepeatedScalarFieldContainer[int]: ...
+    up_ukey: bytes
+    fileid: int
+    up_offset: int
+    block_size: int
+    new_big_chan: bool
+    @property
+    def up_ip6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
+    client_ip6: bytes
+    download_index: bytes
+    @property
+    def info4_busi(self) -> TryUpInfo4Busi: ...
+    def __init__(self,
+        *,
+        file_id: Optional[int] = ...,
+        result: Optional[int] = ...,
+        fail_msg: Optional[bytes] = ...,
+        file_exit: Optional[bool] = ...,
+        img_info: Optional[ImgInfo] = ...,
+        up_ip: Optional[Iterable[int]] = ...,
+        up_port: Optional[Iterable[int]] = ...,
+        up_ukey: Optional[bytes] = ...,
+        fileid: Optional[int] = ...,
+        up_offset: Optional[int] = ...,
+        block_size: Optional[int] = ...,
+        new_big_chan: Optional[bool] = ...,
+        up_ip6: Optional[Iterable[IPv6Info]] = ...,
+        client_ip6: Optional[bytes] = ...,
+        download_index: Optional[bytes] = ...,
+        info4_busi: Optional[TryUpInfo4Busi] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["block_size",b"block_size","client_ip6",b"client_ip6","download_index",b"download_index","fail_msg",b"fail_msg","file_exit",b"file_exit","file_id",b"file_id","fileid",b"fileid","img_info",b"img_info","info4_busi",b"info4_busi","new_big_chan",b"new_big_chan","result",b"result","up_offset",b"up_offset","up_ukey",b"up_ukey"]) -> bool: ...
+    def ClearField(self, field_name: Literal["block_size",b"block_size","client_ip6",b"client_ip6","download_index",b"download_index","fail_msg",b"fail_msg","file_exit",b"file_exit","file_id",b"file_id","fileid",b"fileid","img_info",b"img_info","info4_busi",b"info4_busi","new_big_chan",b"new_big_chan","result",b"result","up_ip",b"up_ip","up_ip6",b"up_ip6","up_offset",b"up_offset","up_port",b"up_port","up_ukey",b"up_ukey"]) -> None: ...
+
+class TryUpInfo4Busi(Message):
+    DESCRIPTOR: Descriptor
+    DOWN_DOMAIN_FIELD_NUMBER: int
+    THUMB_DOWN_URL_FIELD_NUMBER: int
+    ORIGINAL_DOWN_URL_FIELD_NUMBER: int
+    BIG_DOWN_URL_FIELD_NUMBER: int
+    FILE_RESID_FIELD_NUMBER: int
+    down_domain: bytes
+    thumb_down_url: bytes
+    original_down_url: bytes
+    big_down_url: bytes
+    file_resid: bytes
+    def __init__(self,
+        *,
+        down_domain: Optional[bytes] = ...,
+        thumb_down_url: Optional[bytes] = ...,
+        original_down_url: Optional[bytes] = ...,
+        big_down_url: Optional[bytes] = ...,
+        file_resid: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["big_down_url",b"big_down_url","down_domain",b"down_domain","file_resid",b"file_resid","original_down_url",b"original_down_url","thumb_down_url",b"thumb_down_url"]) -> bool: ...
+    def ClearField(self, field_name: Literal["big_down_url",b"big_down_url","down_domain",b"down_domain","file_resid",b"file_resid","original_down_url",b"original_down_url","thumb_down_url",b"thumb_down_url"]) -> None: ...
+
+class TryUpPttReq(Message):
+    DESCRIPTOR: Descriptor
+    GROUP_CODE_FIELD_NUMBER: int
+    SRC_UIN_FIELD_NUMBER: int
+    FILE_ID_FIELD_NUMBER: int
+    FILE_MD5_FIELD_NUMBER: int
+    FILE_SIZE_FIELD_NUMBER: int
+    FILE_NAME_FIELD_NUMBER: int
+    SRC_TERM_FIELD_NUMBER: int
+    PLATFORM_TYPE_FIELD_NUMBER: int
+    BU_TYPE_FIELD_NUMBER: int
+    BUILD_VER_FIELD_NUMBER: int
+    INNER_IP_FIELD_NUMBER: int
+    VOICE_LENGTH_FIELD_NUMBER: int
+    NEW_UP_CHAN_FIELD_NUMBER: int
+    CODEC_FIELD_NUMBER: int
+    VOICE_TYPE_FIELD_NUMBER: int
+    BU_ID_FIELD_NUMBER: int
+    group_code: int
+    src_uin: int
+    file_id: int
+    file_md5: bytes
+    file_size: int
+    file_name: bytes
+    src_term: int
+    platform_type: int
+    bu_type: int
+    build_ver: bytes
+    inner_ip: int
+    voice_length: int
+    new_up_chan: bool
+    codec: int
+    voice_type: int
+    bu_id: int
+    def __init__(self,
+        *,
+        group_code: Optional[int] = ...,
+        src_uin: Optional[int] = ...,
+        file_id: Optional[int] = ...,
+        file_md5: Optional[bytes] = ...,
+        file_size: Optional[int] = ...,
+        file_name: Optional[bytes] = ...,
+        src_term: Optional[int] = ...,
+        platform_type: Optional[int] = ...,
+        bu_type: Optional[int] = ...,
+        build_ver: Optional[bytes] = ...,
+        inner_ip: Optional[int] = ...,
+        voice_length: Optional[int] = ...,
+        new_up_chan: Optional[bool] = ...,
+        codec: Optional[int] = ...,
+        voice_type: Optional[int] = ...,
+        bu_id: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["bu_id",b"bu_id","bu_type",b"bu_type","build_ver",b"build_ver","codec",b"codec","file_id",b"file_id","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","group_code",b"group_code","inner_ip",b"inner_ip","new_up_chan",b"new_up_chan","platform_type",b"platform_type","src_term",b"src_term","src_uin",b"src_uin","voice_length",b"voice_length","voice_type",b"voice_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bu_id",b"bu_id","bu_type",b"bu_type","build_ver",b"build_ver","codec",b"codec","file_id",b"file_id","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","group_code",b"group_code","inner_ip",b"inner_ip","new_up_chan",b"new_up_chan","platform_type",b"platform_type","src_term",b"src_term","src_uin",b"src_uin","voice_length",b"voice_length","voice_type",b"voice_type"]) -> None: ...
+
+class TryUpPttRsp(Message):
+    DESCRIPTOR: Descriptor
+    FILE_ID_FIELD_NUMBER: int
+    RESULT_FIELD_NUMBER: int
+    FAIL_MSG_FIELD_NUMBER: int
+    FILE_EXIT_FIELD_NUMBER: int
+    UP_IP_FIELD_NUMBER: int
+    UP_PORT_FIELD_NUMBER: int
+    UP_UKEY_FIELD_NUMBER: int
+    FILEID_FIELD_NUMBER: int
+    UP_OFFSET_FIELD_NUMBER: int
+    BLOCK_SIZE_FIELD_NUMBER: int
+    FILE_KEY_FIELD_NUMBER: int
+    CHANNEL_TYPE_FIELD_NUMBER: int
+    UP_IP6_FIELD_NUMBER: int
+    CLIENT_IP6_FIELD_NUMBER: int
+    file_id: int
+    result: int
+    fail_msg: bytes
+    file_exit: bool
+    @property
+    def up_ip(self) -> RepeatedScalarFieldContainer[int]: ...
+    @property
+    def up_port(self) -> RepeatedScalarFieldContainer[int]: ...
+    up_ukey: bytes
+    fileid: int
+    up_offset: int
+    block_size: int
+    file_key: bytes
+    channel_type: int
+    @property
+    def up_ip6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
+    client_ip6: bytes
+    def __init__(self,
+        *,
+        file_id: Optional[int] = ...,
+        result: Optional[int] = ...,
+        fail_msg: Optional[bytes] = ...,
+        file_exit: Optional[bool] = ...,
+        up_ip: Optional[Iterable[int]] = ...,
+        up_port: Optional[Iterable[int]] = ...,
+        up_ukey: Optional[bytes] = ...,
+        fileid: Optional[int] = ...,
+        up_offset: Optional[int] = ...,
+        block_size: Optional[int] = ...,
+        file_key: Optional[bytes] = ...,
+        channel_type: Optional[int] = ...,
+        up_ip6: Optional[Iterable[IPv6Info]] = ...,
+        client_ip6: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["block_size",b"block_size","channel_type",b"channel_type","client_ip6",b"client_ip6","fail_msg",b"fail_msg","file_exit",b"file_exit","file_id",b"file_id","file_key",b"file_key","fileid",b"fileid","result",b"result","up_offset",b"up_offset","up_ukey",b"up_ukey"]) -> bool: ...
+    def ClearField(self, field_name: Literal["block_size",b"block_size","channel_type",b"channel_type","client_ip6",b"client_ip6","fail_msg",b"fail_msg","file_exit",b"file_exit","file_id",b"file_id","file_key",b"file_key","fileid",b"fileid","result",b"result","up_ip",b"up_ip","up_ip6",b"up_ip6","up_offset",b"up_offset","up_port",b"up_port","up_ukey",b"up_ukey"]) -> None: ...
diff --git a/cai/pb/im/msg/common/common_pb2.py b/cai/pb/im/msg/common/common_pb2.py
index c36a1de8..d7db7645 100644
--- a/cai/pb/im/msg/common/common_pb2.py
+++ b/cai/pb/im/msg/common/common_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/im/msg/common/common.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -13,249 +14,14 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/im/msg/common/common.proto',
-  package='im.msg.common',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n!cai/pb/im/msg/common/common.proto\x12\rim.msg.common\"1\n\tGroupInfo\x12\x10\n\x08group_id\x18\x01 \x01(\x04\x12\x12\n\ngroup_type\x18\x02 \x01(\r\"J\n\tSignature\x12\x10\n\x08key_type\x18\x01 \x01(\r\x12\x16\n\x0esession_app_id\x18\x02 \x01(\r\x12\x13\n\x0bsession_key\x18\x03 \x01(\x0c\"<\n\x05Token\x12\x0b\n\x03\x62uf\x18\x01 \x01(\x0c\x12\x10\n\x08\x63\x32\x63_type\x18\x02 \x01(\r\x12\x14\n\x0cservice_type\x18\x03 \x01(\r\"\xbe\x01\n\x04User\x12\x0b\n\x03uin\x18\x01 \x01(\x04\x12\x0e\n\x06\x61pp_id\x18\x02 \x01(\r\x12\x13\n\x0binstance_id\x18\x03 \x01(\r\x12\x10\n\x08\x61pp_type\x18\x04 \x01(\r\x12\x11\n\tclient_ip\x18\x05 \x01(\x07\x12\x0f\n\x07version\x18\x06 \x01(\r\x12\x14\n\x0cphone_number\x18\x07 \x01(\t\x12\x13\n\x0bplatform_id\x18\x08 \x01(\r\x12\x10\n\x08language\x18\t \x01(\r\x12\x11\n\tequip_key\x18\n \x01(\x0c'
-)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!cai/pb/im/msg/common/common.proto\x12\rim.msg.common\"1\n\tGroupInfo\x12\x10\n\x08group_id\x18\x01 \x01(\x04\x12\x12\n\ngroup_type\x18\x02 \x01(\r\"J\n\tSignature\x12\x10\n\x08key_type\x18\x01 \x01(\r\x12\x16\n\x0esession_app_id\x18\x02 \x01(\r\x12\x13\n\x0bsession_key\x18\x03 \x01(\x0c\"<\n\x05Token\x12\x0b\n\x03\x62uf\x18\x01 \x01(\x0c\x12\x10\n\x08\x63\x32\x63_type\x18\x02 \x01(\r\x12\x14\n\x0cservice_type\x18\x03 \x01(\r\"\xbe\x01\n\x04User\x12\x0b\n\x03uin\x18\x01 \x01(\x04\x12\x0e\n\x06\x61pp_id\x18\x02 \x01(\r\x12\x13\n\x0binstance_id\x18\x03 \x01(\r\x12\x10\n\x08\x61pp_type\x18\x04 \x01(\r\x12\x11\n\tclient_ip\x18\x05 \x01(\x07\x12\x0f\n\x07version\x18\x06 \x01(\r\x12\x14\n\x0cphone_number\x18\x07 \x01(\t\x12\x13\n\x0bplatform_id\x18\x08 \x01(\r\x12\x10\n\x08language\x18\t \x01(\r\x12\x11\n\tequip_key\x18\n \x01(\x0c')
 
 
 
-
-_GROUPINFO = _descriptor.Descriptor(
-  name='GroupInfo',
-  full_name='im.msg.common.GroupInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='group_id', full_name='im.msg.common.GroupInfo.group_id', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_type', full_name='im.msg.common.GroupInfo.group_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=52,
-  serialized_end=101,
-)
-
-
-_SIGNATURE = _descriptor.Descriptor(
-  name='Signature',
-  full_name='im.msg.common.Signature',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='key_type', full_name='im.msg.common.Signature.key_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='session_app_id', full_name='im.msg.common.Signature.session_app_id', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='session_key', full_name='im.msg.common.Signature.session_key', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=103,
-  serialized_end=177,
-)
-
-
-_TOKEN = _descriptor.Descriptor(
-  name='Token',
-  full_name='im.msg.common.Token',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='buf', full_name='im.msg.common.Token.buf', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_type', full_name='im.msg.common.Token.c2c_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='service_type', full_name='im.msg.common.Token.service_type', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=179,
-  serialized_end=239,
-)
-
-
-_USER = _descriptor.Descriptor(
-  name='User',
-  full_name='im.msg.common.User',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='uin', full_name='im.msg.common.User.uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='app_id', full_name='im.msg.common.User.app_id', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='instance_id', full_name='im.msg.common.User.instance_id', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='app_type', full_name='im.msg.common.User.app_type', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='client_ip', full_name='im.msg.common.User.client_ip', index=4,
-      number=5, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='version', full_name='im.msg.common.User.version', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='phone_number', full_name='im.msg.common.User.phone_number', index=6,
-      number=7, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='platform_id', full_name='im.msg.common.User.platform_id', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='language', full_name='im.msg.common.User.language', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='equip_key', full_name='im.msg.common.User.equip_key', index=9,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=242,
-  serialized_end=432,
-)
-
-DESCRIPTOR.message_types_by_name['GroupInfo'] = _GROUPINFO
-DESCRIPTOR.message_types_by_name['Signature'] = _SIGNATURE
-DESCRIPTOR.message_types_by_name['Token'] = _TOKEN
-DESCRIPTOR.message_types_by_name['User'] = _USER
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_GROUPINFO = DESCRIPTOR.message_types_by_name['GroupInfo']
+_SIGNATURE = DESCRIPTOR.message_types_by_name['Signature']
+_TOKEN = DESCRIPTOR.message_types_by_name['Token']
+_USER = DESCRIPTOR.message_types_by_name['User']
 GroupInfo = _reflection.GeneratedProtocolMessageType('GroupInfo', (_message.Message,), {
   'DESCRIPTOR' : _GROUPINFO,
   '__module__' : 'cai.pb.im.msg.common.common_pb2'
@@ -284,5 +50,15 @@
   })
 _sym_db.RegisterMessage(User)
 
-
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _GROUPINFO._serialized_start=52
+  _GROUPINFO._serialized_end=101
+  _SIGNATURE._serialized_start=103
+  _SIGNATURE._serialized_end=177
+  _TOKEN._serialized_start=179
+  _TOKEN._serialized_end=239
+  _USER._serialized_start=242
+  _USER._serialized_end=432
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/msg/common/common_pb2.pyi b/cai/pb/im/msg/common/common_pb2.pyi
index f27c8021..e4e58b11 100644
--- a/cai/pb/im/msg/common/common_pb2.pyi
+++ b/cai/pb/im/msg/common/common_pb2.pyi
@@ -27,61 +27,61 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class GroupInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    """tencent/im/msg/im_common.java
+
+    """
+    DESCRIPTOR: Descriptor
     GROUP_ID_FIELD_NUMBER: int
     GROUP_TYPE_FIELD_NUMBER: int
-    group_id: int = ...
-    group_type: int = ...
-
+    group_id: int
+    group_type: int
     def __init__(self,
         *,
-        group_id : Optional[int] = ...,
-        group_type : Optional[int] = ...,
+        group_id: Optional[int] = ...,
+        group_type: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"group_id",b"group_id",u"group_type",b"group_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"group_id",b"group_id",u"group_type",b"group_type"]) -> None: ...
+    def HasField(self, field_name: Literal["group_id",b"group_id","group_type",b"group_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_id",b"group_id","group_type",b"group_type"]) -> None: ...
 
 class Signature(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     KEY_TYPE_FIELD_NUMBER: int
     SESSION_APP_ID_FIELD_NUMBER: int
     SESSION_KEY_FIELD_NUMBER: int
-    key_type: int = ...
-    session_app_id: int = ...
-    session_key: bytes = ...
-
+    key_type: int
+    session_app_id: int
+    session_key: bytes
     def __init__(self,
         *,
-        key_type : Optional[int] = ...,
-        session_app_id : Optional[int] = ...,
-        session_key : Optional[bytes] = ...,
+        key_type: Optional[int] = ...,
+        session_app_id: Optional[int] = ...,
+        session_key: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"key_type",b"key_type",u"session_app_id",b"session_app_id",u"session_key",b"session_key"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"key_type",b"key_type",u"session_app_id",b"session_app_id",u"session_key",b"session_key"]) -> None: ...
+    def HasField(self, field_name: Literal["key_type",b"key_type","session_app_id",b"session_app_id","session_key",b"session_key"]) -> bool: ...
+    def ClearField(self, field_name: Literal["key_type",b"key_type","session_app_id",b"session_app_id","session_key",b"session_key"]) -> None: ...
 
 class Token(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BUF_FIELD_NUMBER: int
     C2C_TYPE_FIELD_NUMBER: int
     SERVICE_TYPE_FIELD_NUMBER: int
-    buf: bytes = ...
-    c2c_type: int = ...
-    service_type: int = ...
-
+    buf: bytes
+    c2c_type: int
+    service_type: int
     def __init__(self,
         *,
-        buf : Optional[bytes] = ...,
-        c2c_type : Optional[int] = ...,
-        service_type : Optional[int] = ...,
+        buf: Optional[bytes] = ...,
+        c2c_type: Optional[int] = ...,
+        service_type: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"buf",b"buf",u"c2c_type",b"c2c_type",u"service_type",b"service_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"buf",b"buf",u"c2c_type",b"c2c_type",u"service_type",b"service_type"]) -> None: ...
+    def HasField(self, field_name: Literal["buf",b"buf","c2c_type",b"c2c_type","service_type",b"service_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["buf",b"buf","c2c_type",b"c2c_type","service_type",b"service_type"]) -> None: ...
 
 class User(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     UIN_FIELD_NUMBER: int
     APP_ID_FIELD_NUMBER: int
     INSTANCE_ID_FIELD_NUMBER: int
@@ -92,29 +92,28 @@ class User(Message):
     PLATFORM_ID_FIELD_NUMBER: int
     LANGUAGE_FIELD_NUMBER: int
     EQUIP_KEY_FIELD_NUMBER: int
-    uin: int = ...
-    app_id: int = ...
-    instance_id: int = ...
-    app_type: int = ...
-    client_ip: int = ...
-    version: int = ...
-    phone_number: Text = ...
-    platform_id: int = ...
-    language: int = ...
-    equip_key: bytes = ...
-
+    uin: int
+    app_id: int
+    instance_id: int
+    app_type: int
+    client_ip: int
+    version: int
+    phone_number: Text
+    platform_id: int
+    language: int
+    equip_key: bytes
     def __init__(self,
         *,
-        uin : Optional[int] = ...,
-        app_id : Optional[int] = ...,
-        instance_id : Optional[int] = ...,
-        app_type : Optional[int] = ...,
-        client_ip : Optional[int] = ...,
-        version : Optional[int] = ...,
-        phone_number : Optional[Text] = ...,
-        platform_id : Optional[int] = ...,
-        language : Optional[int] = ...,
-        equip_key : Optional[bytes] = ...,
+        uin: Optional[int] = ...,
+        app_id: Optional[int] = ...,
+        instance_id: Optional[int] = ...,
+        app_type: Optional[int] = ...,
+        client_ip: Optional[int] = ...,
+        version: Optional[int] = ...,
+        phone_number: Optional[Text] = ...,
+        platform_id: Optional[int] = ...,
+        language: Optional[int] = ...,
+        equip_key: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"app_id",b"app_id",u"app_type",b"app_type",u"client_ip",b"client_ip",u"equip_key",b"equip_key",u"instance_id",b"instance_id",u"language",b"language",u"phone_number",b"phone_number",u"platform_id",b"platform_id",u"uin",b"uin",u"version",b"version"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"app_id",b"app_id",u"app_type",b"app_type",u"client_ip",b"client_ip",u"equip_key",b"equip_key",u"instance_id",b"instance_id",u"language",b"language",u"phone_number",b"phone_number",u"platform_id",b"platform_id",u"uin",b"uin",u"version",b"version"]) -> None: ...
+    def HasField(self, field_name: Literal["app_id",b"app_id","app_type",b"app_type","client_ip",b"client_ip","equip_key",b"equip_key","instance_id",b"instance_id","language",b"language","phone_number",b"phone_number","platform_id",b"platform_id","uin",b"uin","version",b"version"]) -> bool: ...
+    def ClearField(self, field_name: Literal["app_id",b"app_id","app_type",b"app_type","client_ip",b"client_ip","equip_key",b"equip_key","instance_id",b"instance_id","language",b"language","phone_number",b"phone_number","platform_id",b"platform_id","uin",b"uin","version",b"version"]) -> None: ...
diff --git a/cai/pb/im/msg/msg/msg_pb2.py b/cai/pb/im/msg/msg/msg_pb2.py
index 23b1d189..d18dee4d 100644
--- a/cai/pb/im/msg/msg/msg_pb2.py
+++ b/cai/pb/im/msg/msg/msg_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/im/msg/msg/msg.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -15,486 +16,19 @@
 from cai.pb.im.msg.msg_body import msg_body_pb2 as cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/im/msg/msg/msg.proto',
-  package='im.msg.msg',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1b\x63\x61i/pb/im/msg/msg/msg.proto\x12\nim.msg.msg\x1a!cai/pb/im/msg/common/common.proto\x1a%cai/pb/im/msg/msg_body/msg_body.proto\"\x80\x01\n\x03\x43\x32\x43\x12#\n\x06sender\x18\x01 \x01(\x0b\x32\x13.im.msg.common.User\x12%\n\x08receiver\x18\x02 \x01(\x0b\x32\x13.im.msg.common.User\x12-\n\x0c\x63\x32\x63_relation\x18\x03 \x01(\x0b\x32\x17.im.msg.msg.C2CRelation\"r\n\x0b\x43\x32\x43Relation\x12\x10\n\x08\x63\x32\x63_type\x18\x01 \x01(\r\x12,\n\ngroup_info\x18\x02 \x01(\x0b\x32\x18.im.msg.common.GroupInfo\x12#\n\x05token\x18\x03 \x01(\x0b\x32\x14.im.msg.common.Token\"\xba\x01\n\x0b\x43ontentHead\x12\x0f\n\x07pkg_num\x18\x01 \x01(\r\x12\x11\n\tpkg_index\x18\x02 \x01(\r\x12\x0b\n\x03seq\x18\x03 \x01(\r\x12\x11\n\tdate_time\x18\x04 \x01(\r\x12\x0c\n\x04type\x18\x05 \x01(\r\x12\x0f\n\x07\x64iv_seq\x18\x06 \x01(\r\x12\x11\n\tmsgdb_uin\x18\x07 \x01(\x04\x12\x11\n\tmsgdb_seq\x18\x08 \x01(\r\x12\x14\n\x0cword_msg_seq\x18\t \x01(\r\x12\x0c\n\x04rand\x18\n \x01(\r\"\x81\x01\n\x05Group\x12#\n\x06sender\x18\x01 \x01(\x0b\x32\x13.im.msg.common.User\x12%\n\x08receiver\x18\x02 \x01(\x0b\x32\x13.im.msg.common.User\x12,\n\ngroup_info\x18\x03 \x01(\x0b\x32\x18.im.msg.common.GroupInfo\"P\n\x03Msg\x12!\n\x04head\x18\x01 \x01(\x0b\x32\x13.im.msg.msg.MsgHead\x12&\n\x04\x62ody\x18\x02 \x01(\x0b\x32\x18.im.msg.msg_body.MsgBody\"\x81\x01\n\x07MsgHead\x12-\n\x0crouting_head\x18\x01 \x01(\x0b\x32\x17.im.msg.msg.RoutingHead\x12-\n\x0c\x63ontent_head\x18\x02 \x01(\x0b\x32\x17.im.msg.msg.ContentHead\x12\x18\n\x10gbk_tmp_msg_body\x18\x03 \x01(\x0c\"r\n\nMsgSendReq\x12\x1c\n\x03msg\x18\x01 \x01(\x0b\x32\x0f.im.msg.msg.Msg\x12\x0e\n\x06\x62u_msg\x18\x02 \x01(\x0c\x12\x0f\n\x07tail_id\x18\x03 \x01(\r\x12\x15\n\rconn_msg_flag\x18\x04 \x01(\r\x12\x0e\n\x06\x63ookie\x18\x05 \x01(\x0c\"\r\n\x0bMsgSendResp\"N\n\x0bRoutingHead\x12\x1d\n\x04\x63\x32_c\x18\x01 \x01(\x0b\x32\x0f.im.msg.msg.C2C\x12 \n\x05group\x18\x02 \x01(\x0b\x32\x11.im.msg.msg.Group'
-  ,
-  dependencies=[cai_dot_pb_dot_im_dot_msg_dot_common_dot_common__pb2.DESCRIPTOR,cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2.DESCRIPTOR,])
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1b\x63\x61i/pb/im/msg/msg/msg.proto\x12\nim.msg.msg\x1a!cai/pb/im/msg/common/common.proto\x1a%cai/pb/im/msg/msg_body/msg_body.proto\"\x80\x01\n\x03\x43\x32\x43\x12#\n\x06sender\x18\x01 \x01(\x0b\x32\x13.im.msg.common.User\x12%\n\x08receiver\x18\x02 \x01(\x0b\x32\x13.im.msg.common.User\x12-\n\x0c\x63\x32\x63_relation\x18\x03 \x01(\x0b\x32\x17.im.msg.msg.C2CRelation\"r\n\x0b\x43\x32\x43Relation\x12\x10\n\x08\x63\x32\x63_type\x18\x01 \x01(\r\x12,\n\ngroup_info\x18\x02 \x01(\x0b\x32\x18.im.msg.common.GroupInfo\x12#\n\x05token\x18\x03 \x01(\x0b\x32\x14.im.msg.common.Token\"\xba\x01\n\x0b\x43ontentHead\x12\x0f\n\x07pkg_num\x18\x01 \x01(\r\x12\x11\n\tpkg_index\x18\x02 \x01(\r\x12\x0b\n\x03seq\x18\x03 \x01(\r\x12\x11\n\tdate_time\x18\x04 \x01(\r\x12\x0c\n\x04type\x18\x05 \x01(\r\x12\x0f\n\x07\x64iv_seq\x18\x06 \x01(\r\x12\x11\n\tmsgdb_uin\x18\x07 \x01(\x04\x12\x11\n\tmsgdb_seq\x18\x08 \x01(\r\x12\x14\n\x0cword_msg_seq\x18\t \x01(\r\x12\x0c\n\x04rand\x18\n \x01(\r\"\x81\x01\n\x05Group\x12#\n\x06sender\x18\x01 \x01(\x0b\x32\x13.im.msg.common.User\x12%\n\x08receiver\x18\x02 \x01(\x0b\x32\x13.im.msg.common.User\x12,\n\ngroup_info\x18\x03 \x01(\x0b\x32\x18.im.msg.common.GroupInfo\"P\n\x03Msg\x12!\n\x04head\x18\x01 \x01(\x0b\x32\x13.im.msg.msg.MsgHead\x12&\n\x04\x62ody\x18\x02 \x01(\x0b\x32\x18.im.msg.msg_body.MsgBody\"\x81\x01\n\x07MsgHead\x12-\n\x0crouting_head\x18\x01 \x01(\x0b\x32\x17.im.msg.msg.RoutingHead\x12-\n\x0c\x63ontent_head\x18\x02 \x01(\x0b\x32\x17.im.msg.msg.ContentHead\x12\x18\n\x10gbk_tmp_msg_body\x18\x03 \x01(\x0c\"r\n\nMsgSendReq\x12\x1c\n\x03msg\x18\x01 \x01(\x0b\x32\x0f.im.msg.msg.Msg\x12\x0e\n\x06\x62u_msg\x18\x02 \x01(\x0c\x12\x0f\n\x07tail_id\x18\x03 \x01(\r\x12\x15\n\rconn_msg_flag\x18\x04 \x01(\r\x12\x0e\n\x06\x63ookie\x18\x05 \x01(\x0c\"\r\n\x0bMsgSendResp\"N\n\x0bRoutingHead\x12\x1d\n\x04\x63\x32_c\x18\x01 \x01(\x0b\x32\x0f.im.msg.msg.C2C\x12 \n\x05group\x18\x02 \x01(\x0b\x32\x11.im.msg.msg.Group')
 
 
 
-
-_C2C = _descriptor.Descriptor(
-  name='C2C',
-  full_name='im.msg.msg.C2C',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='sender', full_name='im.msg.msg.C2C.sender', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='receiver', full_name='im.msg.msg.C2C.receiver', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_relation', full_name='im.msg.msg.C2C.c2c_relation', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=118,
-  serialized_end=246,
-)
-
-
-_C2CRELATION = _descriptor.Descriptor(
-  name='C2CRelation',
-  full_name='im.msg.msg.C2CRelation',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='c2c_type', full_name='im.msg.msg.C2CRelation.c2c_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_info', full_name='im.msg.msg.C2CRelation.group_info', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='token', full_name='im.msg.msg.C2CRelation.token', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=248,
-  serialized_end=362,
-)
-
-
-_CONTENTHEAD = _descriptor.Descriptor(
-  name='ContentHead',
-  full_name='im.msg.msg.ContentHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='pkg_num', full_name='im.msg.msg.ContentHead.pkg_num', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pkg_index', full_name='im.msg.msg.ContentHead.pkg_index', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='seq', full_name='im.msg.msg.ContentHead.seq', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='date_time', full_name='im.msg.msg.ContentHead.date_time', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='type', full_name='im.msg.msg.ContentHead.type', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='div_seq', full_name='im.msg.msg.ContentHead.div_seq', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msgdb_uin', full_name='im.msg.msg.ContentHead.msgdb_uin', index=6,
-      number=7, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msgdb_seq', full_name='im.msg.msg.ContentHead.msgdb_seq', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='word_msg_seq', full_name='im.msg.msg.ContentHead.word_msg_seq', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rand', full_name='im.msg.msg.ContentHead.rand', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=365,
-  serialized_end=551,
-)
-
-
-_GROUP = _descriptor.Descriptor(
-  name='Group',
-  full_name='im.msg.msg.Group',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='sender', full_name='im.msg.msg.Group.sender', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='receiver', full_name='im.msg.msg.Group.receiver', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_info', full_name='im.msg.msg.Group.group_info', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=554,
-  serialized_end=683,
-)
-
-
-_MSG = _descriptor.Descriptor(
-  name='Msg',
-  full_name='im.msg.msg.Msg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='head', full_name='im.msg.msg.Msg.head', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='body', full_name='im.msg.msg.Msg.body', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=685,
-  serialized_end=765,
-)
-
-
-_MSGHEAD = _descriptor.Descriptor(
-  name='MsgHead',
-  full_name='im.msg.msg.MsgHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='routing_head', full_name='im.msg.msg.MsgHead.routing_head', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content_head', full_name='im.msg.msg.MsgHead.content_head', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='gbk_tmp_msg_body', full_name='im.msg.msg.MsgHead.gbk_tmp_msg_body', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=768,
-  serialized_end=897,
-)
-
-
-_MSGSENDREQ = _descriptor.Descriptor(
-  name='MsgSendReq',
-  full_name='im.msg.msg.MsgSendReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='msg', full_name='im.msg.msg.MsgSendReq.msg', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bu_msg', full_name='im.msg.msg.MsgSendReq.bu_msg', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='tail_id', full_name='im.msg.msg.MsgSendReq.tail_id', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='conn_msg_flag', full_name='im.msg.msg.MsgSendReq.conn_msg_flag', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cookie', full_name='im.msg.msg.MsgSendReq.cookie', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=899,
-  serialized_end=1013,
-)
-
-
-_MSGSENDRESP = _descriptor.Descriptor(
-  name='MsgSendResp',
-  full_name='im.msg.msg.MsgSendResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1015,
-  serialized_end=1028,
-)
-
-
-_ROUTINGHEAD = _descriptor.Descriptor(
-  name='RoutingHead',
-  full_name='im.msg.msg.RoutingHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='c2_c', full_name='im.msg.msg.RoutingHead.c2_c', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group', full_name='im.msg.msg.RoutingHead.group', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1030,
-  serialized_end=1108,
-)
-
-_C2C.fields_by_name['sender'].message_type = cai_dot_pb_dot_im_dot_msg_dot_common_dot_common__pb2._USER
-_C2C.fields_by_name['receiver'].message_type = cai_dot_pb_dot_im_dot_msg_dot_common_dot_common__pb2._USER
-_C2C.fields_by_name['c2c_relation'].message_type = _C2CRELATION
-_C2CRELATION.fields_by_name['group_info'].message_type = cai_dot_pb_dot_im_dot_msg_dot_common_dot_common__pb2._GROUPINFO
-_C2CRELATION.fields_by_name['token'].message_type = cai_dot_pb_dot_im_dot_msg_dot_common_dot_common__pb2._TOKEN
-_GROUP.fields_by_name['sender'].message_type = cai_dot_pb_dot_im_dot_msg_dot_common_dot_common__pb2._USER
-_GROUP.fields_by_name['receiver'].message_type = cai_dot_pb_dot_im_dot_msg_dot_common_dot_common__pb2._USER
-_GROUP.fields_by_name['group_info'].message_type = cai_dot_pb_dot_im_dot_msg_dot_common_dot_common__pb2._GROUPINFO
-_MSG.fields_by_name['head'].message_type = _MSGHEAD
-_MSG.fields_by_name['body'].message_type = cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2._MSGBODY
-_MSGHEAD.fields_by_name['routing_head'].message_type = _ROUTINGHEAD
-_MSGHEAD.fields_by_name['content_head'].message_type = _CONTENTHEAD
-_MSGSENDREQ.fields_by_name['msg'].message_type = _MSG
-_ROUTINGHEAD.fields_by_name['c2_c'].message_type = _C2C
-_ROUTINGHEAD.fields_by_name['group'].message_type = _GROUP
-DESCRIPTOR.message_types_by_name['C2C'] = _C2C
-DESCRIPTOR.message_types_by_name['C2CRelation'] = _C2CRELATION
-DESCRIPTOR.message_types_by_name['ContentHead'] = _CONTENTHEAD
-DESCRIPTOR.message_types_by_name['Group'] = _GROUP
-DESCRIPTOR.message_types_by_name['Msg'] = _MSG
-DESCRIPTOR.message_types_by_name['MsgHead'] = _MSGHEAD
-DESCRIPTOR.message_types_by_name['MsgSendReq'] = _MSGSENDREQ
-DESCRIPTOR.message_types_by_name['MsgSendResp'] = _MSGSENDRESP
-DESCRIPTOR.message_types_by_name['RoutingHead'] = _ROUTINGHEAD
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_C2C = DESCRIPTOR.message_types_by_name['C2C']
+_C2CRELATION = DESCRIPTOR.message_types_by_name['C2CRelation']
+_CONTENTHEAD = DESCRIPTOR.message_types_by_name['ContentHead']
+_GROUP = DESCRIPTOR.message_types_by_name['Group']
+_MSG = DESCRIPTOR.message_types_by_name['Msg']
+_MSGHEAD = DESCRIPTOR.message_types_by_name['MsgHead']
+_MSGSENDREQ = DESCRIPTOR.message_types_by_name['MsgSendReq']
+_MSGSENDRESP = DESCRIPTOR.message_types_by_name['MsgSendResp']
+_ROUTINGHEAD = DESCRIPTOR.message_types_by_name['RoutingHead']
 C2C = _reflection.GeneratedProtocolMessageType('C2C', (_message.Message,), {
   'DESCRIPTOR' : _C2C,
   '__module__' : 'cai.pb.im.msg.msg.msg_pb2'
@@ -558,5 +92,25 @@
   })
 _sym_db.RegisterMessage(RoutingHead)
 
-
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _C2C._serialized_start=118
+  _C2C._serialized_end=246
+  _C2CRELATION._serialized_start=248
+  _C2CRELATION._serialized_end=362
+  _CONTENTHEAD._serialized_start=365
+  _CONTENTHEAD._serialized_end=551
+  _GROUP._serialized_start=554
+  _GROUP._serialized_end=683
+  _MSG._serialized_start=685
+  _MSG._serialized_end=765
+  _MSGHEAD._serialized_start=768
+  _MSGHEAD._serialized_end=897
+  _MSGSENDREQ._serialized_start=899
+  _MSGSENDREQ._serialized_end=1013
+  _MSGSENDRESP._serialized_start=1015
+  _MSGSENDRESP._serialized_end=1028
+  _ROUTINGHEAD._serialized_start=1030
+  _ROUTINGHEAD._serialized_end=1108
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/msg/msg/msg_pb2.pyi b/cai/pb/im/msg/msg/msg_pb2.pyi
index 743b2b75..1b7557e9 100644
--- a/cai/pb/im/msg/msg/msg_pb2.pyi
+++ b/cai/pb/im/msg/msg/msg_pb2.pyi
@@ -36,56 +36,49 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class C2C(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SENDER_FIELD_NUMBER: int
     RECEIVER_FIELD_NUMBER: int
     C2C_RELATION_FIELD_NUMBER: int
-
     @property
     def sender(self) -> User: ...
-
     @property
     def receiver(self) -> User: ...
-
     @property
     def c2c_relation(self) -> C2CRelation: ...
-
     def __init__(self,
         *,
-        sender : Optional[User] = ...,
-        receiver : Optional[User] = ...,
-        c2c_relation : Optional[C2CRelation] = ...,
+        sender: Optional[User] = ...,
+        receiver: Optional[User] = ...,
+        c2c_relation: Optional[C2CRelation] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2c_relation",b"c2c_relation",u"receiver",b"receiver",u"sender",b"sender"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2c_relation",b"c2c_relation",u"receiver",b"receiver",u"sender",b"sender"]) -> None: ...
+    def HasField(self, field_name: Literal["c2c_relation",b"c2c_relation","receiver",b"receiver","sender",b"sender"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2c_relation",b"c2c_relation","receiver",b"receiver","sender",b"sender"]) -> None: ...
 
 class C2CRelation(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     C2C_TYPE_FIELD_NUMBER: int
     GROUP_INFO_FIELD_NUMBER: int
     TOKEN_FIELD_NUMBER: int
-    c2c_type: int = ...
-
+    c2c_type: int
     @property
     def group_info(self) -> GroupInfo: ...
-
     @property
     def token(self) -> Token: ...
-
     def __init__(self,
         *,
-        c2c_type : Optional[int] = ...,
-        group_info : Optional[GroupInfo] = ...,
-        token : Optional[Token] = ...,
+        c2c_type: Optional[int] = ...,
+        group_info: Optional[GroupInfo] = ...,
+        token: Optional[Token] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2c_type",b"c2c_type",u"group_info",b"group_info",u"token",b"token"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2c_type",b"c2c_type",u"group_info",b"group_info",u"token",b"token"]) -> None: ...
+    def HasField(self, field_name: Literal["c2c_type",b"c2c_type","group_info",b"group_info","token",b"token"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2c_type",b"c2c_type","group_info",b"group_info","token",b"token"]) -> None: ...
 
 class ContentHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     PKG_NUM_FIELD_NUMBER: int
     PKG_INDEX_FIELD_NUMBER: int
     SEQ_FIELD_NUMBER: int
@@ -96,145 +89,128 @@ class ContentHead(Message):
     MSGDB_SEQ_FIELD_NUMBER: int
     WORD_MSG_SEQ_FIELD_NUMBER: int
     RAND_FIELD_NUMBER: int
-    pkg_num: int = ...
-    pkg_index: int = ...
-    seq: int = ...
-    date_time: int = ...
-    type: int = ...
-    div_seq: int = ...
-    msgdb_uin: int = ...
-    msgdb_seq: int = ...
-    word_msg_seq: int = ...
-    rand: int = ...
-
+    pkg_num: int
+    pkg_index: int
+    seq: int
+    date_time: int
+    type: int
+    div_seq: int
+    msgdb_uin: int
+    msgdb_seq: int
+    word_msg_seq: int
+    rand: int
     def __init__(self,
         *,
-        pkg_num : Optional[int] = ...,
-        pkg_index : Optional[int] = ...,
-        seq : Optional[int] = ...,
-        date_time : Optional[int] = ...,
-        type : Optional[int] = ...,
-        div_seq : Optional[int] = ...,
-        msgdb_uin : Optional[int] = ...,
-        msgdb_seq : Optional[int] = ...,
-        word_msg_seq : Optional[int] = ...,
-        rand : Optional[int] = ...,
+        pkg_num: Optional[int] = ...,
+        pkg_index: Optional[int] = ...,
+        seq: Optional[int] = ...,
+        date_time: Optional[int] = ...,
+        type: Optional[int] = ...,
+        div_seq: Optional[int] = ...,
+        msgdb_uin: Optional[int] = ...,
+        msgdb_seq: Optional[int] = ...,
+        word_msg_seq: Optional[int] = ...,
+        rand: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"date_time",b"date_time",u"div_seq",b"div_seq",u"msgdb_seq",b"msgdb_seq",u"msgdb_uin",b"msgdb_uin",u"pkg_index",b"pkg_index",u"pkg_num",b"pkg_num",u"rand",b"rand",u"seq",b"seq",u"type",b"type",u"word_msg_seq",b"word_msg_seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"date_time",b"date_time",u"div_seq",b"div_seq",u"msgdb_seq",b"msgdb_seq",u"msgdb_uin",b"msgdb_uin",u"pkg_index",b"pkg_index",u"pkg_num",b"pkg_num",u"rand",b"rand",u"seq",b"seq",u"type",b"type",u"word_msg_seq",b"word_msg_seq"]) -> None: ...
+    def HasField(self, field_name: Literal["date_time",b"date_time","div_seq",b"div_seq","msgdb_seq",b"msgdb_seq","msgdb_uin",b"msgdb_uin","pkg_index",b"pkg_index","pkg_num",b"pkg_num","rand",b"rand","seq",b"seq","type",b"type","word_msg_seq",b"word_msg_seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["date_time",b"date_time","div_seq",b"div_seq","msgdb_seq",b"msgdb_seq","msgdb_uin",b"msgdb_uin","pkg_index",b"pkg_index","pkg_num",b"pkg_num","rand",b"rand","seq",b"seq","type",b"type","word_msg_seq",b"word_msg_seq"]) -> None: ...
 
 class Group(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SENDER_FIELD_NUMBER: int
     RECEIVER_FIELD_NUMBER: int
     GROUP_INFO_FIELD_NUMBER: int
-
     @property
     def sender(self) -> User: ...
-
     @property
     def receiver(self) -> User: ...
-
     @property
     def group_info(self) -> GroupInfo: ...
-
     def __init__(self,
         *,
-        sender : Optional[User] = ...,
-        receiver : Optional[User] = ...,
-        group_info : Optional[GroupInfo] = ...,
+        sender: Optional[User] = ...,
+        receiver: Optional[User] = ...,
+        group_info: Optional[GroupInfo] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"group_info",b"group_info",u"receiver",b"receiver",u"sender",b"sender"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"group_info",b"group_info",u"receiver",b"receiver",u"sender",b"sender"]) -> None: ...
+    def HasField(self, field_name: Literal["group_info",b"group_info","receiver",b"receiver","sender",b"sender"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_info",b"group_info","receiver",b"receiver","sender",b"sender"]) -> None: ...
 
 class Msg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     HEAD_FIELD_NUMBER: int
     BODY_FIELD_NUMBER: int
-
     @property
     def head(self) -> MsgHead: ...
-
     @property
     def body(self) -> MsgBody: ...
-
     def __init__(self,
         *,
-        head : Optional[MsgHead] = ...,
-        body : Optional[MsgBody] = ...,
+        head: Optional[MsgHead] = ...,
+        body: Optional[MsgBody] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"body",b"body",u"head",b"head"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"body",b"body",u"head",b"head"]) -> None: ...
+    def HasField(self, field_name: Literal["body",b"body","head",b"head"]) -> bool: ...
+    def ClearField(self, field_name: Literal["body",b"body","head",b"head"]) -> None: ...
 
 class MsgHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     ROUTING_HEAD_FIELD_NUMBER: int
     CONTENT_HEAD_FIELD_NUMBER: int
     GBK_TMP_MSG_BODY_FIELD_NUMBER: int
-    gbk_tmp_msg_body: bytes = ...
-
     @property
     def routing_head(self) -> RoutingHead: ...
-
     @property
     def content_head(self) -> ContentHead: ...
-
+    gbk_tmp_msg_body: bytes
     def __init__(self,
         *,
-        routing_head : Optional[RoutingHead] = ...,
-        content_head : Optional[ContentHead] = ...,
-        gbk_tmp_msg_body : Optional[bytes] = ...,
+        routing_head: Optional[RoutingHead] = ...,
+        content_head: Optional[ContentHead] = ...,
+        gbk_tmp_msg_body: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"content_head",b"content_head",u"gbk_tmp_msg_body",b"gbk_tmp_msg_body",u"routing_head",b"routing_head"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"content_head",b"content_head",u"gbk_tmp_msg_body",b"gbk_tmp_msg_body",u"routing_head",b"routing_head"]) -> None: ...
+    def HasField(self, field_name: Literal["content_head",b"content_head","gbk_tmp_msg_body",b"gbk_tmp_msg_body","routing_head",b"routing_head"]) -> bool: ...
+    def ClearField(self, field_name: Literal["content_head",b"content_head","gbk_tmp_msg_body",b"gbk_tmp_msg_body","routing_head",b"routing_head"]) -> None: ...
 
 class MsgSendReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     MSG_FIELD_NUMBER: int
     BU_MSG_FIELD_NUMBER: int
     TAIL_ID_FIELD_NUMBER: int
     CONN_MSG_FLAG_FIELD_NUMBER: int
     COOKIE_FIELD_NUMBER: int
-    bu_msg: bytes = ...
-    tail_id: int = ...
-    conn_msg_flag: int = ...
-    cookie: bytes = ...
-
     @property
     def msg(self) -> Msg: ...
-
+    bu_msg: bytes
+    tail_id: int
+    conn_msg_flag: int
+    cookie: bytes
     def __init__(self,
         *,
-        msg : Optional[Msg] = ...,
-        bu_msg : Optional[bytes] = ...,
-        tail_id : Optional[int] = ...,
-        conn_msg_flag : Optional[int] = ...,
-        cookie : Optional[bytes] = ...,
+        msg: Optional[Msg] = ...,
+        bu_msg: Optional[bytes] = ...,
+        tail_id: Optional[int] = ...,
+        conn_msg_flag: Optional[int] = ...,
+        cookie: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bu_msg",b"bu_msg",u"conn_msg_flag",b"conn_msg_flag",u"cookie",b"cookie",u"msg",b"msg",u"tail_id",b"tail_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bu_msg",b"bu_msg",u"conn_msg_flag",b"conn_msg_flag",u"cookie",b"cookie",u"msg",b"msg",u"tail_id",b"tail_id"]) -> None: ...
+    def HasField(self, field_name: Literal["bu_msg",b"bu_msg","conn_msg_flag",b"conn_msg_flag","cookie",b"cookie","msg",b"msg","tail_id",b"tail_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bu_msg",b"bu_msg","conn_msg_flag",b"conn_msg_flag","cookie",b"cookie","msg",b"msg","tail_id",b"tail_id"]) -> None: ...
 
 class MsgSendResp(Message):
-    DESCRIPTOR: Descriptor = ...
-
+    DESCRIPTOR: Descriptor
     def __init__(self,
         ) -> None: ...
 
 class RoutingHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     C2_C_FIELD_NUMBER: int
     GROUP_FIELD_NUMBER: int
-
     @property
     def c2_c(self) -> C2C: ...
-
     @property
     def group(self) -> Group: ...
-
     def __init__(self,
         *,
-        c2_c : Optional[C2C] = ...,
-        group : Optional[Group] = ...,
+        c2_c: Optional[C2C] = ...,
+        group: Optional[Group] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2_c",b"c2_c",u"group",b"group"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2_c",b"c2_c",u"group",b"group"]) -> None: ...
+    def HasField(self, field_name: Literal["c2_c",b"c2_c","group",b"group"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2_c",b"c2_c","group",b"group"]) -> None: ...
diff --git a/cai/pb/im/msg/msg_body/msg_body_pb2.py b/cai/pb/im/msg/msg_body/msg_body_pb2.py
index f3b1d979..f3090910 100644
--- a/cai/pb/im/msg/msg_body/msg_body_pb2.py
+++ b/cai/pb/im/msg/msg_body/msg_body_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/im/msg/msg_body/msg_body.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -13,5495 +14,76 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/im/msg/msg_body/msg_body.proto',
-  package='im.msg.msg_body',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n%cai/pb/im/msg/msg_body/msg_body.proto\x12\x0fim.msg.msg_body\"\x99\x01\n\x11\x41nonymousGroupMsg\x12\r\n\x05\x66lags\x18\x01 \x01(\r\x12\x0f\n\x07\x61non_id\x18\x02 \x01(\x0c\x12\x11\n\tanon_nick\x18\x03 \x01(\x0c\x12\x15\n\rhead_portrait\x18\x04 \x01(\r\x12\x13\n\x0b\x65xpire_time\x18\x05 \x01(\r\x12\x11\n\tbubble_id\x18\x06 \x01(\r\x12\x12\n\nrank_color\x18\x07 \x01(\x0c\"\x90\x02\n\x0c\x41polloActMsg\x12\x11\n\taction_id\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tion_name\x18\x02 \x01(\x0c\x12\x13\n\x0b\x61\x63tion_text\x18\x03 \x01(\x0c\x12\x0c\n\x04\x66lag\x18\x04 \x01(\r\x12\x10\n\x08peer_uin\x18\x05 \x01(\r\x12\x11\n\tsender_ts\x18\x06 \x01(\r\x12\x0f\n\x07peer_ts\x18\x07 \x01(\r\x12\x15\n\rsender_status\x18\x08 \x01(\x05\x12\x13\n\x0bpeer_status\x18\t \x01(\x05\x12\x12\n\ndiytext_id\x18\n \x01(\r\x12\x17\n\x0f\x64iytext_content\x18\x0b \x01(\x0c\x12\x12\n\ninput_text\x18\x0c \x01(\x0c\x12\x12\n\npb_reserve\x18\r \x01(\x0c\"W\n\nArkAppElem\x12\x10\n\x08\x61pp_name\x18\x01 \x01(\t\x12\x13\n\x0bmin_version\x18\x02 \x01(\t\x12\x14\n\x0cxml_template\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\"\xb9\x01\n\x04\x41ttr\x12\x11\n\tcode_page\x18\x01 \x01(\x11\x12\x0c\n\x04time\x18\x02 \x01(\r\x12\x0e\n\x06random\x18\x03 \x01(\r\x12\r\n\x05\x63olor\x18\x04 \x01(\r\x12\x0c\n\x04size\x18\x05 \x01(\r\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\x06 \x01(\r\x12\x10\n\x08\x63har_set\x18\x07 \x01(\r\x12\x18\n\x10pitch_and_family\x18\x08 \x01(\r\x12\x11\n\tfont_name\x18\t \x01(\t\x12\x14\n\x0creserve_data\x18\n \x01(\x0c\"\x18\n\tBitAppMsg\x12\x0b\n\x03\x62uf\x18\x01 \x01(\x0c\"4\n\x0f\x42lessingMessage\x12\x10\n\x08msg_type\x18\x01 \x01(\r\x12\x0f\n\x07\x65x_flag\x18\x02 \x01(\r\"J\n\nCommonElem\x12\x14\n\x0cservice_type\x18\x01 \x01(\r\x12\x0f\n\x07pb_elem\x18\x02 \x01(\x0c\x12\x15\n\rbusiness_type\x18\x03 \x01(\r\"M\n\x12\x43onferenceTipsInfo\x12\x14\n\x0csession_type\x18\x01 \x01(\r\x12\x13\n\x0bsession_uin\x18\x02 \x01(\x04\x12\x0c\n\x04text\x18\x03 \x01(\t\"i\n\x07\x43rmElem\x12\x0f\n\x07\x63rm_buf\x18\x01 \x01(\x0c\x12\x11\n\tmsg_resid\x18\x02 \x01(\x0c\x12\x13\n\x0bqidian_flag\x18\x03 \x01(\r\x12\x11\n\tpush_flag\x18\x04 \x01(\r\x12\x12\n\ncount_flag\x18\x05 \x01(\r\"W\n\nCustomElem\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\x0c\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\x11\n\tenum_type\x18\x03 \x01(\r\x12\x0b\n\x03\x65xt\x18\x04 \x01(\x0c\x12\r\n\x05sound\x18\x05 \x01(\x0c\"\xf1\x04\n\nCustomFace\x12\x0c\n\x04guid\x18\x01 \x01(\x0c\x12\x11\n\tfile_path\x18\x02 \x01(\t\x12\x10\n\x08shortcut\x18\x03 \x01(\t\x12\x0e\n\x06\x62uffer\x18\x04 \x01(\x0c\x12\x0c\n\x04\x66lag\x18\x05 \x01(\x0c\x12\x10\n\x08old_data\x18\x06 \x01(\x0c\x12\x0f\n\x07\x66ile_id\x18\x07 \x01(\r\x12\x11\n\tserver_ip\x18\x08 \x01(\r\x12\x13\n\x0bserver_port\x18\t \x01(\r\x12\x11\n\tfile_type\x18\n \x01(\r\x12\x11\n\tsignature\x18\x0b \x01(\x0c\x12\x0e\n\x06useful\x18\x0c \x01(\r\x12\x0b\n\x03md5\x18\r \x01(\x0c\x12\x11\n\tthumb_url\x18\x0e \x01(\t\x12\x0f\n\x07\x62ig_url\x18\x0f \x01(\t\x12\x10\n\x08orig_url\x18\x10 \x01(\t\x12\x10\n\x08\x62iz_type\x18\x11 \x01(\r\x12\x14\n\x0crepeat_index\x18\x12 \x01(\r\x12\x14\n\x0crepeat_image\x18\x13 \x01(\r\x12\x12\n\nimage_type\x18\x14 \x01(\r\x12\r\n\x05index\x18\x15 \x01(\r\x12\r\n\x05width\x18\x16 \x01(\r\x12\x0e\n\x06height\x18\x17 \x01(\r\x12\x0e\n\x06source\x18\x18 \x01(\r\x12\x0c\n\x04size\x18\x19 \x01(\r\x12\x0e\n\x06origin\x18\x1a \x01(\r\x12\x13\n\x0bthumb_width\x18\x1b \x01(\r\x12\x14\n\x0cthumb_height\x18\x1c \x01(\r\x12\x10\n\x08show_len\x18\x1d \x01(\r\x12\x14\n\x0c\x64ownload_len\x18\x1e \x01(\r\x12\x10\n\x08_400_url\x18\x1f \x01(\t\x12\x12\n\n_400_width\x18  \x01(\r\x12\x13\n\x0b_400_height\x18! \x01(\r\x12\x12\n\npb_reserve\x18\" \x01(\x0c\"\xb6\x04\n\x0e\x44\x65liverGiftMsg\x12\x18\n\x10gray_tip_content\x18\x01 \x01(\x0c\x12\x1c\n\x14\x61nimation_package_id\x18\x02 \x01(\r\x12\x1f\n\x17\x61nimation_package_url_a\x18\x03 \x01(\x0c\x12\x1f\n\x17\x61nimation_package_url_i\x18\x04 \x01(\x0c\x12\x14\n\x0cremind_brief\x18\x05 \x01(\x0c\x12\x0f\n\x07gift_id\x18\x06 \x01(\r\x12\x12\n\ngift_count\x18\x07 \x01(\r\x12\x17\n\x0f\x61nimation_brief\x18\x08 \x01(\x0c\x12\x12\n\nsender_uin\x18\t \x01(\x04\x12\x14\n\x0creceiver_uin\x18\n \x01(\x04\x12\x17\n\x0fstmessage_title\x18\x0b \x01(\x0c\x12\x1a\n\x12stmessage_subtitle\x18\x0c \x01(\x0c\x12\x19\n\x11stmessage_message\x18\r \x01(\x0c\x12\x1b\n\x13stmessage_giftpicid\x18\x0e \x01(\r\x12\x1a\n\x12stmessage_comefrom\x18\x0f \x01(\x0c\x12\x18\n\x10stmessage_exflag\x18\x10 \x01(\r\x12\x16\n\x0eto_all_gift_id\x18\x11 \x01(\x0c\x12\x15\n\rcomefrom_link\x18\x12 \x01(\x0c\x12\x12\n\npb_reserve\x18\x13 \x01(\x0c\x12\x15\n\rreceiver_name\x18\x14 \x01(\x0c\x12\x14\n\x0creceiver_pic\x18\x15 \x01(\x0c\x12\x19\n\x11stmessage_gifturl\x18\x16 \x01(\x0c\"(\n\x07\x45IMInfo\x12\x0f\n\x07root_id\x18\x01 \x01(\x04\x12\x0c\n\x04\x66lag\x18\x02 \x01(\r\"\x8b\x15\n\x04\x45lem\x12(\n\x04text\x18\x01 \x01(\x0b\x32\x1a.im.msg.msg_body.PlainText\x12#\n\x04\x66\x61\x63\x65\x18\x02 \x01(\x0b\x32\x15.im.msg.msg_body.Face\x12\x32\n\x0conline_image\x18\x03 \x01(\x0b\x32\x1c.im.msg.msg_body.OnlineImage\x12\x39\n\x10not_online_image\x18\x04 \x01(\x0b\x32\x1f.im.msg.msg_body.NotOnlineImage\x12\x33\n\x0ftrans_elem_info\x18\x05 \x01(\x0b\x32\x1a.im.msg.msg_body.TransElem\x12\x30\n\x0bmarket_face\x18\x06 \x01(\x0b\x32\x1b.im.msg.msg_body.MarketFace\x12.\n\nelem_flags\x18\x07 \x01(\x0b\x32\x1a.im.msg.msg_body.ElemFlags\x12\x30\n\x0b\x63ustom_face\x18\x08 \x01(\x0b\x32\x1b.im.msg.msg_body.CustomFace\x12\x30\n\x0b\x65lem_flags2\x18\t \x01(\x0b\x32\x1b.im.msg.msg_body.ElemFlags2\x12*\n\x08\x66un_face\x18\n \x01(\x0b\x32\x18.im.msg.msg_body.FunFace\x12\x33\n\x0bsecret_file\x18\x0b \x01(\x0b\x32\x1e.im.msg.msg_body.SecretFileMsg\x12*\n\x08rich_msg\x18\x0c \x01(\x0b\x32\x18.im.msg.msg_body.RichMsg\x12.\n\ngroup_file\x18\r \x01(\x0b\x32\x1a.im.msg.msg_body.GroupFile\x12,\n\tpub_group\x18\x0e \x01(\x0b\x32\x19.im.msg.msg_body.PubGroup\x12\x32\n\x0cmarket_trans\x18\x0f \x01(\x0b\x32\x1c.im.msg.msg_body.MarketTrans\x12.\n\nextra_info\x18\x10 \x01(\x0b\x32\x1a.im.msg.msg_body.ExtraInfo\x12\x32\n\x0cshake_window\x18\x11 \x01(\x0b\x32\x1c.im.msg.msg_body.ShakeWindow\x12\x30\n\x0bpub_account\x18\x12 \x01(\x0b\x32\x1b.im.msg.msg_body.PubAccount\x12.\n\nvideo_file\x18\x13 \x01(\x0b\x32\x1a.im.msg.msg_body.VideoFile\x12,\n\ttips_info\x18\x14 \x01(\x0b\x32\x19.im.msg.msg_body.TipsInfo\x12:\n\x0e\x61non_group_msg\x18\x15 \x01(\x0b\x32\".im.msg.msg_body.AnonymousGroupMsg\x12/\n\x0bqq_live_old\x18\x16 \x01(\x0b\x32\x1a.im.msg.msg_body.QQLiveOld\x12\x37\n\x0blife_online\x18\x17 \x01(\x0b\x32\".im.msg.msg_body.LifeOnlineAccount\x12\x32\n\x0cqqwallet_msg\x18\x18 \x01(\x0b\x32\x1c.im.msg.msg_body.QQWalletMsg\x12*\n\x08\x63rm_elem\x18\x19 \x01(\x0b\x32\x18.im.msg.msg_body.CrmElem\x12\x41\n\x14\x63onference_tips_info\x18\x1a \x01(\x0b\x32#.im.msg.msg_body.ConferenceTipsInfo\x12\x30\n\x0bredbag_info\x18\x1b \x01(\x0b\x32\x1b.im.msg.msg_body.RedBagInfo\x12\x39\n\x10low_version_tips\x18\x1c \x01(\x0b\x32\x1f.im.msg.msg_body.LowVersionTips\x12\x1a\n\x12\x62\x61nkcode_ctrl_info\x18\x1d \x01(\x0c\x12\x37\n\x0bnear_by_msg\x18\x1e \x01(\x0b\x32\".im.msg.msg_body.NearByMessageType\x12\x30\n\x0b\x63ustom_elem\x18\x1f \x01(\x0b\x32\x1b.im.msg.msg_body.CustomElem\x12\x34\n\rlocation_info\x18  \x01(\x0b\x32\x1d.im.msg.msg_body.LocationInfo\x12\x31\n\x0cpub_acc_info\x18! \x01(\x0b\x32\x1b.im.msg.msg_body.PubAccInfo\x12\x30\n\x0bsmall_emoji\x18\" \x01(\x0b\x32\x1b.im.msg.msg_body.SmallEmoji\x12\x35\n\x0c\x66sj_msg_elem\x18# \x01(\x0b\x32\x1f.im.msg.msg_body.FSJMessageElem\x12,\n\x07\x61rk_app\x18$ \x01(\x0b\x32\x1b.im.msg.msg_body.ArkAppElem\x12\x34\n\rgeneral_flags\x18% \x01(\x0b\x32\x1d.im.msg.msg_body.GeneralFlags\x12\x31\n\x0chc_flash_pic\x18& \x01(\x0b\x32\x1b.im.msg.msg_body.CustomFace\x12\x39\n\x10\x64\x65liver_gift_msg\x18\' \x01(\x0b\x32\x1f.im.msg.msg_body.DeliverGiftMsg\x12.\n\nbitapp_msg\x18( \x01(\x0b\x32\x1a.im.msg.msg_body.BitAppMsg\x12\x31\n\x0copen_qq_data\x18) \x01(\x0b\x32\x1b.im.msg.msg_body.OpenQQData\x12\x31\n\napollo_msg\x18* \x01(\x0b\x32\x1d.im.msg.msg_body.ApolloActMsg\x12@\n\x12group_pub_acc_info\x18+ \x01(\x0b\x32$.im.msg.msg_body.GroupPubAccountInfo\x12\x33\n\tbless_msg\x18, \x01(\x0b\x32 .im.msg.msg_body.BlessingMessage\x12+\n\x07src_msg\x18- \x01(\x0b\x32\x1a.im.msg.msg_body.SourceMsg\x12*\n\x08lola_msg\x18. \x01(\x0b\x32\x18.im.msg.msg_body.LolaMsg\x12=\n\x12group_business_msg\x18/ \x01(\x0b\x32!.im.msg.msg_body.GroupBusinessMsg\x12;\n\x0fworkflow_notify\x18\x30 \x01(\x0b\x32\".im.msg.msg_body.WorkflowNotifyMsg\x12+\n\x08pat_elem\x18\x31 \x01(\x0b\x32\x19.im.msg.msg_body.PatsElem\x12\x37\n\x0fgroup_post_elem\x18\x32 \x01(\x0b\x32\x1e.im.msg.msg_body.GroupPostElem\x12\x30\n\tlight_app\x18\x33 \x01(\x0b\x32\x1d.im.msg.msg_body.LightAppElem\x12*\n\x08\x65im_info\x18\x34 \x01(\x0b\x32\x18.im.msg.msg_body.EIMInfo\x12\x30\n\x0b\x63ommon_elem\x18\x35 \x01(\x0b\x32\x1b.im.msg.msg_body.CommonElem\"2\n\tElemFlags\x12\x0e\n\x06\x66lags1\x18\x01 \x01(\x0c\x12\x15\n\rbusiness_data\x18\x02 \x01(\x0c\"\xfb\x02\n\nElemFlags2\x12\x15\n\rcolor_text_id\x18\x01 \x01(\r\x12\x0e\n\x06msg_id\x18\x02 \x01(\x04\x12\x1a\n\x12whisper_session_id\x18\x03 \x01(\r\x12\x16\n\x0eptt_change_bit\x18\x04 \x01(\r\x12\x12\n\nvip_status\x18\x05 \x01(\r\x12\x15\n\rcompatible_id\x18\x06 \x01(\r\x12$\n\x05insts\x18\x07 \x03(\x0b\x32\x15.im.msg.msg_body.Inst\x12\x13\n\x0bmsg_rpt_cnt\x18\x08 \x01(\r\x12\'\n\x08src_inst\x18\t \x01(\x0b\x32\x15.im.msg.msg_body.Inst\x12\x12\n\nlongtitude\x18\n \x01(\r\x12\x10\n\x08latitude\x18\x0b \x01(\r\x12\x13\n\x0b\x63ustom_font\x18\x0c \x01(\r\x12\x35\n\x0epc_support_def\x18\r \x01(\x0b\x32\x1d.im.msg.msg_body.PcSupportDef\x12\x11\n\tcrm_flags\x18\x0e \x01(\r\"\'\n\x04Inst\x12\x0e\n\x06\x61pp_id\x18\x01 \x01(\r\x12\x0f\n\x07inst_id\x18\x02 \x01(\r\"\xf3\x01\n\tExtraInfo\x12\x0c\n\x04nick\x18\x01 \x01(\x0c\x12\x12\n\ngroup_card\x18\x02 \x01(\x0c\x12\r\n\x05level\x18\x03 \x01(\r\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x12\n\ngroup_mask\x18\x05 \x01(\r\x12\x13\n\x0bmsg_tail_id\x18\x06 \x01(\r\x12\x14\n\x0csender_title\x18\x07 \x01(\x0c\x12\x11\n\tapns_tips\x18\x08 \x01(\x0c\x12\x0b\n\x03uin\x18\t \x01(\x04\x12\x16\n\x0emsg_state_flag\x18\n \x01(\r\x12\x17\n\x0f\x61pns_sound_type\x18\x0b \x01(\r\x12\x16\n\x0enew_group_flag\x18\x0c \x01(\r\"\"\n\x0e\x46SJMessageElem\x12\x10\n\x08msg_type\x18\x01 \x01(\r\"/\n\x04\x46\x61\x63\x65\x12\r\n\x05index\x18\x01 \x01(\r\x12\x0b\n\x03old\x18\x02 \x01(\x0c\x12\x0b\n\x03\x62uf\x18\x0b \x01(\x0c\"]\n\x07\x46unFace\x12-\n\tturntable\x18\x01 \x01(\x0b\x32\x1a.im.msg.msg_body.Turntable\x12#\n\x04\x62omb\x18\x02 \x01(\x0b\x32\x15.im.msg.msg_body.Bomb\"\x15\n\x04\x42omb\x12\r\n\x05\x62urst\x18\x01 \x01(\x08\"D\n\tTurntable\x12\x10\n\x08uin_list\x18\x01 \x03(\x04\x12\x0f\n\x07hit_uin\x18\x02 \x01(\x04\x12\x14\n\x0chit_uin_nick\x18\x03 \x01(\t\"\xb2\x03\n\x0cGeneralFlags\x12\x1a\n\x12\x62ubble_diy_text_id\x18\x01 \x01(\r\x12\x16\n\x0egroup_flag_new\x18\x02 \x01(\r\x12\x0b\n\x03uin\x18\x03 \x01(\x04\x12\r\n\x05rp_id\x18\x04 \x01(\x0c\x12\x10\n\x08prp_fold\x18\x05 \x01(\r\x12\x16\n\x0elong_text_flag\x18\x06 \x01(\r\x12\x17\n\x0flong_text_resid\x18\x07 \x01(\x0c\x12\x12\n\ngroup_type\x18\x08 \x01(\r\x12\x13\n\x0bto_uin_flag\x18\t \x01(\r\x12\x15\n\rglamour_level\x18\n \x01(\r\x12\x14\n\x0cmember_level\x18\x0b \x01(\r\x12\x16\n\x0egroup_rank_seq\x18\x0c \x01(\x04\x12\x15\n\rolympic_torch\x18\r \x01(\r\x12\x1e\n\x16\x62\x61\x62yq_guide_msg_cookie\x18\x0e \x01(\x0c\x12\x19\n\x11uin32_expert_flag\x18\x0f \x01(\r\x12\x15\n\rbubble_sub_id\x18\x10 \x01(\r\x12\x12\n\npendant_id\x18\x11 \x01(\x04\x12\x10\n\x08rp_index\x18\x12 \x01(\x0c\x12\x12\n\npb_reserve\x18\x13 \x01(\x0c\"\xa3\x01\n\x10GroupBusinessMsg\x12\r\n\x05\x66lags\x18\x01 \x01(\r\x12\x10\n\x08head_url\x18\x02 \x01(\x0c\x12\x14\n\x0chead_clk_url\x18\x03 \x01(\x0c\x12\x0c\n\x04nick\x18\x04 \x01(\x0c\x12\x12\n\nnick_color\x18\x05 \x01(\x0c\x12\x0c\n\x04rank\x18\x06 \x01(\x0c\x12\x12\n\nrank_color\x18\x07 \x01(\x0c\x12\x14\n\x0crank_bgcolor\x18\x08 \x01(\x0c\"\xc7\x01\n\tGroupFile\x12\x10\n\x08\x66ilename\x18\x01 \x01(\x0c\x12\x11\n\tfile_size\x18\x02 \x01(\x04\x12\x0f\n\x07\x66ile_id\x18\x03 \x01(\x0c\x12\x10\n\x08\x62\x61tch_id\x18\x04 \x01(\x0c\x12\x10\n\x08\x66ile_key\x18\x05 \x01(\x0c\x12\x0c\n\x04mark\x18\x06 \x01(\x0c\x12\x10\n\x08sequence\x18\x07 \x01(\x04\x12\x15\n\rbatch_item_id\x18\x08 \x01(\x0c\x12\x15\n\rfeed_msg_time\x18\t \x01(\r\x12\x12\n\npb_reserve\x18\n \x01(\x0c\"6\n\rGroupPostElem\x12\x12\n\ntrans_type\x18\x01 \x01(\r\x12\x11\n\ttrans_msg\x18\x02 \x01(\x0c\"*\n\x13GroupPubAccountInfo\x12\x13\n\x0bpub_account\x18\x01 \x01(\x04\"\xaf\x01\n\x11LifeOnlineAccount\x12\x11\n\tunique_id\x18\x01 \x01(\x04\x12\n\n\x02op\x18\x02 \x01(\r\x12\x11\n\tshow_time\x18\x03 \x01(\r\x12\x0e\n\x06report\x18\x04 \x01(\r\x12\x0b\n\x03\x61\x63k\x18\x05 \x01(\r\x12\x0e\n\x06\x62itmap\x18\x06 \x01(\x04\x12\x14\n\x0cgdt_imp_data\x18\x07 \x01(\x0c\x12\x14\n\x0cgdt_cli_data\x18\x08 \x01(\x0c\x12\x0f\n\x07view_id\x18\t \x01(\x0c\"/\n\x0cLightAppElem\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\x11\n\tmsg_resid\x18\x02 \x01(\x0c\"`\n\x07LolaMsg\x12\x11\n\tmsg_resid\x18\x01 \x01(\x0c\x12\x16\n\x0e\x65ncode_content\x18\x02 \x01(\x0c\x12\x14\n\x0clong_msg_url\x18\x03 \x01(\x0c\x12\x14\n\x0c\x64ownload_key\x18\x04 \x01(\x0c\"r\n\x0eLowVersionTips\x12\x13\n\x0b\x62usiness_id\x18\x01 \x01(\r\x12\x14\n\x0csession_type\x18\x02 \x01(\r\x12\x13\n\x0bsession_uin\x18\x03 \x01(\x04\x12\x12\n\nsender_uin\x18\x04 \x01(\x04\x12\x0c\n\x04text\x18\x05 \x01(\t\"\xfc\x01\n\nMarketFace\x12\x11\n\tface_name\x18\x01 \x01(\x0c\x12\x11\n\titem_type\x18\x02 \x01(\r\x12\x11\n\tface_info\x18\x03 \x01(\r\x12\x0f\n\x07\x66\x61\x63\x65_id\x18\x04 \x01(\x0c\x12\x0e\n\x06tab_id\x18\x05 \x01(\r\x12\x10\n\x08sub_type\x18\x06 \x01(\r\x12\x0b\n\x03key\x18\x07 \x01(\x0c\x12\r\n\x05param\x18\x08 \x01(\x0c\x12\x12\n\nmedia_type\x18\t \x01(\r\x12\x13\n\x0bimage_width\x18\n \x01(\r\x12\x14\n\x0cimage_height\x18\x0b \x01(\r\x12\x13\n\x0bmobileparam\x18\x0c \x01(\x0c\x12\x12\n\npb_reserve\x18\r \x01(\x0c\"a\n\x0bMarketTrans\x12\x0c\n\x04\x66lag\x18\x01 \x01(\x05\x12\x0b\n\x03xml\x18\x02 \x01(\x0c\x12\x11\n\tmsg_resid\x18\x03 \x01(\x0c\x12\x0f\n\x07\x61\x62ility\x18\x04 \x01(\r\x12\x13\n\x0bmin_ability\x18\x05 \x01(\r\"a\n\x07MsgBody\x12,\n\trich_text\x18\x01 \x01(\x0b\x32\x19.im.msg.msg_body.RichText\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\x12\x17\n\x0f\x65ncrypt_content\x18\x03 \x01(\x0c\"]\n\x10MsgBody_subtype4\x12\x37\n\x0fnot_online_file\x18\x01 \x01(\x0b\x32\x1e.im.msg.msg_body.NotOnlineFile\x12\x10\n\x08msg_time\x18\x02 \x01(\r\"8\n\x11NearByMessageType\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x15\n\ridentify_type\x18\x02 \x01(\r\"\x94\x03\n\rNotOnlineFile\x12\x11\n\tfile_type\x18\x01 \x01(\r\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\x11\n\tfile_uuid\x18\x03 \x01(\x0c\x12\x10\n\x08\x66ile_md5\x18\x04 \x01(\x0c\x12\x11\n\tfile_name\x18\x05 \x01(\x0c\x12\x11\n\tfile_size\x18\x06 \x01(\x04\x12\x0c\n\x04note\x18\x07 \x01(\x0c\x12\x10\n\x08reserved\x18\x08 \x01(\r\x12\x0e\n\x06subcmd\x18\t \x01(\r\x12\x13\n\x0bmicro_cloud\x18\n \x01(\r\x12\x11\n\tfile_urls\x18\x0b \x03(\x0c\x12\x15\n\rdownload_flag\x18\x0c \x01(\r\x12\x13\n\x0b\x64\x61nger_evel\x18\x32 \x01(\r\x12\x11\n\tlife_time\x18\x33 \x01(\r\x12\x13\n\x0bupload_time\x18\x34 \x01(\r\x12\x15\n\rabs_file_type\x18\x35 \x01(\r\x12\x13\n\x0b\x63lient_type\x18\x36 \x01(\r\x12\x13\n\x0b\x65xpire_time\x18\x37 \x01(\r\x12\x12\n\npb_reserve\x18\x38 \x01(\x0c\x12\x17\n\x0f\x66ileidcrc_media\x18\x39 \x01(\t\"\xbd\x04\n\x0eNotOnlineImage\x12\x11\n\tfile_path\x18\x01 \x01(\x0c\x12\x10\n\x08\x66ile_len\x18\x02 \x01(\r\x12\x15\n\rdownload_path\x18\x03 \x01(\x0c\x12\x19\n\x11old_ver_send_file\x18\x04 \x01(\x0c\x12\x10\n\x08img_type\x18\x05 \x01(\r\x12\x16\n\x0epreviews_image\x18\x06 \x01(\x0c\x12\x0f\n\x07pic_md5\x18\x07 \x01(\x0c\x12\x12\n\npic_height\x18\x08 \x01(\r\x12\x11\n\tpic_width\x18\t \x01(\r\x12\x0e\n\x06res_id\x18\n \x01(\x0c\x12\x0c\n\x04\x66lag\x18\x0b \x01(\x0c\x12\x11\n\tthumb_url\x18\x0c \x01(\t\x12\x10\n\x08original\x18\r \x01(\r\x12\x0f\n\x07\x62ig_url\x18\x0e \x01(\t\x12\x10\n\x08orig_url\x18\x0f \x01(\t\x12\x10\n\x08\x62iz_type\x18\x10 \x01(\r\x12\x0e\n\x06result\x18\x11 \x01(\r\x12\r\n\x05index\x18\x12 \x01(\r\x12\x13\n\x0bop_face_buf\x18\x13 \x01(\x0c\x12\x13\n\x0bold_pic_md5\x18\x14 \x01(\x08\x12\x13\n\x0bthumb_width\x18\x15 \x01(\r\x12\x14\n\x0cthumb_height\x18\x16 \x01(\r\x12\x0f\n\x07\x66ile_id\x18\x17 \x01(\r\x12\x10\n\x08show_len\x18\x18 \x01(\r\x12\x14\n\x0c\x64ownload_len\x18\x19 \x01(\r\x12\x10\n\x08_400_url\x18\x1a \x01(\t\x12\x12\n\n_400_width\x18\x1b \x01(\r\x12\x13\n\x0b_400_height\x18\x1c \x01(\r\x12\x12\n\npb_reserve\x18\x1d \x01(\x0c\"I\n\x0bOnlineImage\x12\x0c\n\x04guid\x18\x01 \x01(\x0c\x12\x11\n\tfile_path\x18\x02 \x01(\x0c\x12\x19\n\x11old_ver_send_file\x18\x03 \x01(\x0c\"!\n\nOpenQQData\x12\x13\n\x0b\x63\x61r_qq_data\x18\x01 \x01(\x0c\"/\n\x08PatsElem\x12\x10\n\x08pat_type\x18\x01 \x01(\r\x12\x11\n\tpat_count\x18\x02 \x01(\r\"\x94\x01\n\x0cPcSupportDef\x12\x14\n\x0cpc_ptl_begin\x18\x01 \x01(\r\x12\x12\n\npc_ptl_end\x18\x02 \x01(\r\x12\x15\n\rmac_ptl_begin\x18\x03 \x01(\r\x12\x13\n\x0bmac_ptl_end\x18\x04 \x01(\r\x12\x14\n\x0cptls_support\x18\x05 \x03(\r\x12\x18\n\x10ptls_not_support\x18\x06 \x03(\r\"\xca\x03\n\x03Ptt\x12\x11\n\tfile_type\x18\x01 \x01(\r\x12\x0f\n\x07src_uin\x18\x02 \x01(\x04\x12\x11\n\tfile_uuid\x18\x03 \x01(\x0c\x12\x10\n\x08\x66ile_md5\x18\x04 \x01(\x0c\x12\x11\n\tfile_name\x18\x05 \x01(\x0c\x12\x11\n\tfile_size\x18\x06 \x01(\r\x12\x0f\n\x07reserve\x18\x07 \x01(\x0c\x12\x0f\n\x07\x66ile_id\x18\x08 \x01(\r\x12\x11\n\tserver_ip\x18\t \x01(\r\x12\x13\n\x0bserver_port\x18\n \x01(\r\x12\r\n\x05valid\x18\x0b \x01(\x08\x12\x11\n\tsignature\x18\x0c \x01(\x0c\x12\x10\n\x08shortcut\x18\r \x01(\x0c\x12\x10\n\x08\x66ile_key\x18\x0e \x01(\x0c\x12\x17\n\x0fmagic_ptt_index\x18\x0f \x01(\r\x12\x14\n\x0cvoice_switch\x18\x10 \x01(\r\x12\x0f\n\x07ptt_url\x18\x11 \x01(\x0c\x12\x16\n\x0egroup_file_key\x18\x12 \x01(\x0c\x12\x0c\n\x04time\x18\x13 \x01(\r\x12\x11\n\tdown_para\x18\x14 \x01(\x0c\x12\x0e\n\x06\x66ormat\x18\x1d \x01(\r\x12\x12\n\npb_reserve\x18\x1e \x01(\x0c\x12\x10\n\x08ptt_urls\x18\x1f \x03(\x0c\x12\x15\n\rdownload_flag\x18  \x01(\r\"g\n\nPubAccInfo\x12\x14\n\x0cis_inter_num\x18\x01 \x01(\r\x12\x17\n\x0fmsg_template_id\x18\x02 \x01(\t\x12\x14\n\x0clong_msg_url\x18\x03 \x01(\t\x12\x14\n\x0c\x64ownload_key\x18\x04 \x01(\x0c\"2\n\nPubAccount\x12\x0b\n\x03\x62uf\x18\x01 \x01(\x0c\x12\x17\n\x0fpub_account_uin\x18\x02 \x01(\x04\"K\n\x08PubGroup\x12\x10\n\x08nickname\x18\x01 \x01(\x0c\x12\x0e\n\x06gender\x18\x02 \x01(\r\x12\x0b\n\x03\x61ge\x18\x03 \x01(\r\x12\x10\n\x08\x64istance\x18\x04 \x01(\r\"Q\n\tQQLiveOld\x12\x0f\n\x07sub_cmd\x18\x01 \x01(\r\x12\x11\n\tshow_text\x18\x02 \x01(\x0c\x12\r\n\x05param\x18\x03 \x01(\x0c\x12\x11\n\tintroduce\x18\x04 \x01(\x0c\"\xcd\x03\n\x0fQQWalletAioBody\x12\x0f\n\x07senduin\x18\x01 \x01(\x04\x12\x30\n\x06sender\x18\x02 \x01(\x0b\x32 .im.msg.msg_body.QQWalletAioElem\x12\x32\n\x08receiver\x18\x03 \x01(\x0b\x32 .im.msg.msg_body.QQWalletAioElem\x12\x11\n\tchannelid\x18\x04 \x01(\x11\x12\x12\n\ntemplateid\x18\x05 \x01(\x11\x12\x0e\n\x06resend\x18\x06 \x01(\r\x12\x14\n\x0cmsg_priority\x18\x07 \x01(\r\x12\x0f\n\x07redtype\x18\x08 \x01(\x11\x12\x0e\n\x06\x62illno\x18\t \x01(\x0c\x12\x0f\n\x07\x61uthkey\x18\n \x01(\x0c\x12\x13\n\x0bsessiontype\x18\x0b \x01(\x11\x12\x0f\n\x07msgtype\x18\x0c \x01(\x11\x12\x12\n\nenvelopeid\x18\r \x01(\x11\x12\x0c\n\x04name\x18\x0e \x01(\x0c\x12\x10\n\x08\x63onftype\x18\x0f \x01(\x11\x12\x10\n\x08msg_from\x18\x10 \x01(\x11\x12\x0f\n\x07pc_body\x18\x11 \x01(\x0c\x12\r\n\x05index\x18\x12 \x01(\x0c\x12\x12\n\nredchannel\x18\x13 \x01(\r\x12\x10\n\x08grap_uin\x18\x14 \x03(\x04\x12\x12\n\npb_reserve\x18\x15 \x01(\x0c\"\xb9\x03\n\x0fQQWalletAioElem\x12\x12\n\nbackground\x18\x01 \x01(\r\x12\x0c\n\x04icon\x18\x02 \x01(\r\x12\r\n\x05title\x18\x03 \x01(\x0c\x12\x10\n\x08subtitle\x18\x04 \x01(\x0c\x12\x0f\n\x07\x63ontent\x18\x05 \x01(\x0c\x12\x0f\n\x07linkurl\x18\x06 \x01(\x0c\x12\x13\n\x0b\x62lackstripe\x18\x07 \x01(\x0c\x12\x0e\n\x06notice\x18\x08 \x01(\x0c\x12\x13\n\x0btitle_color\x18\t \x01(\r\x12\x16\n\x0esubtitle_color\x18\n \x01(\r\x12\x18\n\x10\x61\x63tions_priority\x18\x0b \x01(\x0c\x12\x10\n\x08jump_url\x18\x0c \x01(\x0c\x12\x12\n\nnative_ios\x18\r \x01(\x0c\x12\x16\n\x0enative_android\x18\x0e \x01(\x0c\x12\x0f\n\x07iconurl\x18\x0f \x01(\x0c\x12\x15\n\rcontent_color\x18\x10 \x01(\r\x12\x17\n\x0f\x63ontent_bgcolor\x18\x11 \x01(\r\x12\x16\n\x0e\x61io_image_left\x18\x12 \x01(\x0c\x12\x17\n\x0f\x61io_image_right\x18\x13 \x01(\x0c\x12\x11\n\tcft_image\x18\x14 \x01(\x0c\x12\x12\n\npb_reserve\x18\x15 \x01(\x0c\"A\n\x0bQQWalletMsg\x12\x32\n\x08\x61io_body\x18\x01 \x01(\x0b\x32 .im.msg.msg_body.QQWalletAioBody\"!\n\nRedBagInfo\x12\x13\n\x0bredbag_type\x18\x01 \x01(\r\"n\n\x07RichMsg\x12\x12\n\ntemplate_1\x18\x01 \x01(\x0c\x12\x12\n\nservice_id\x18\x02 \x01(\r\x12\x11\n\tmsg_resid\x18\x03 \x01(\x0c\x12\x0c\n\x04rand\x18\x04 \x01(\r\x12\x0b\n\x03seq\x18\x05 \x01(\r\x12\r\n\x05\x66lags\x18\x06 \x01(\r\"\x97\x02\n\x08RichText\x12#\n\x04\x61ttr\x18\x01 \x01(\x0b\x32\x15.im.msg.msg_body.Attr\x12$\n\x05\x65lems\x18\x02 \x03(\x0b\x32\x15.im.msg.msg_body.Elem\x12\x37\n\x0fnot_online_file\x18\x03 \x01(\x0b\x32\x1e.im.msg.msg_body.NotOnlineFile\x12!\n\x03ptt\x18\x04 \x01(\x0b\x32\x14.im.msg.msg_body.Ptt\x12(\n\x07tmp_ptt\x18\x05 \x01(\x0b\x32\x17.im.msg.msg_body.TmpPtt\x12:\n\x11trans_211_tmp_msg\x18\x06 \x01(\x0b\x32\x1f.im.msg.msg_body.Trans211TmpMsg\"\xf5\x02\n\rSecretFileMsg\x12\x10\n\x08\x66ile_key\x18\x01 \x01(\x0c\x12\x10\n\x08\x66rom_uin\x18\x02 \x01(\x04\x12\x0e\n\x06to_uin\x18\x03 \x01(\x04\x12\x0e\n\x06status\x18\x04 \x01(\r\x12\x0b\n\x03ttl\x18\x05 \x01(\r\x12\x0c\n\x04type\x18\x06 \x01(\r\x12\x1e\n\x16\x65ncrypt_prehead_length\x18\x07 \x01(\r\x12\x14\n\x0c\x65ncrypt_type\x18\x08 \x01(\r\x12\x13\n\x0b\x65ncrypt_key\x18\t \x01(\x0c\x12\x12\n\nread_times\x18\n \x01(\r\x12\x11\n\tleft_time\x18\x0b \x01(\r\x12\x39\n\x10not_online_image\x18\x0c \x01(\x0b\x32\x1f.im.msg.msg_body.NotOnlineImage\x12\x30\n\x0b\x65lem_flags2\x18\r \x01(\x0b\x32\x1b.im.msg.msg_body.ElemFlags2\x12\x10\n\x08opertype\x18\x0e \x01(\r\x12\x14\n\x0c\x66romphonenum\x18\x0f \x01(\t\"9\n\x0bShakeWindow\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0f\n\x07reserve\x18\x02 \x01(\r\x12\x0b\n\x03uin\x18\x03 \x01(\x04\"5\n\nSmallEmoji\x12\x13\n\x0bpack_id_sum\x18\x01 \x01(\r\x12\x12\n\nimage_type\x18\x02 \x01(\r\"\xdd\x01\n\tSourceMsg\x12\x11\n\torig_seqs\x18\x01 \x03(\r\x12\x12\n\nsender_uin\x18\x02 \x01(\x04\x12\x0c\n\x04time\x18\x03 \x01(\r\x12\x0c\n\x04\x66lag\x18\x04 \x01(\r\x12$\n\x05\x65lems\x18\x05 \x03(\x0b\x32\x15.im.msg.msg_body.Elem\x12\x0c\n\x04type\x18\x06 \x01(\r\x12\x10\n\x08rich_msg\x18\x07 \x01(\x0c\x12\x12\n\npb_reserve\x18\x08 \x01(\x0c\x12\x0f\n\x07src_msg\x18\t \x01(\x0c\x12\x0e\n\x06to_uin\x18\n \x01(\x04\x12\x12\n\ntroop_name\x18\x0b \x01(\x0c\"o\n\tPlainText\x12\x0b\n\x03str\x18\x01 \x01(\x0c\x12\x0c\n\x04link\x18\x02 \x01(\t\x12\x12\n\nattr_6_buf\x18\x03 \x01(\x0c\x12\x12\n\nattr_7_buf\x18\x04 \x01(\x0c\x12\x0b\n\x03\x62uf\x18\x0b \x01(\x0c\x12\x12\n\npb_reserve\x18\x0c \x01(\x0c\"\x18\n\x08TipsInfo\x12\x0c\n\x04text\x18\x01 \x01(\t\"\xf3\x01\n\x06TmpPtt\x12\x11\n\tfile_type\x18\x01 \x01(\r\x12\x11\n\tfile_uuid\x18\x02 \x01(\x0c\x12\x10\n\x08\x66ile_md5\x18\x03 \x01(\x0c\x12\x11\n\tfile_name\x18\x04 \x01(\x0c\x12\x11\n\tfile_size\x18\x05 \x01(\r\x12\x11\n\tptt_times\x18\x06 \x01(\r\x12\x11\n\tuser_type\x18\x07 \x01(\r\x12\x15\n\rptttrans_flag\x18\x08 \x01(\r\x12\x11\n\tbusi_type\x18\t \x01(\r\x12\x0e\n\x06msg_id\x18\n \x01(\x04\x12\x12\n\npb_reserve\x18\x1e \x01(\x0c\x12\x17\n\x0fptt_encode_data\x18\x1f \x01(\x0c\"3\n\x0eTrans211TmpMsg\x12\x10\n\x08msg_body\x18\x01 \x01(\x0c\x12\x0f\n\x07\x63\x32\x63_cmd\x18\x02 \x01(\r\"2\n\tTransElem\x12\x11\n\telem_type\x18\x01 \x01(\r\x12\x12\n\nelem_value\x18\x02 \x01(\x0c\"\x9c\x04\n\tVideoFile\x12\x11\n\tfile_uuid\x18\x01 \x01(\x0c\x12\x10\n\x08\x66ile_md5\x18\x02 \x01(\x0c\x12\x11\n\tfile_name\x18\x03 \x01(\x0c\x12\x13\n\x0b\x66ile_format\x18\x04 \x01(\r\x12\x11\n\tfile_time\x18\x05 \x01(\r\x12\x11\n\tfile_size\x18\x06 \x01(\r\x12\x13\n\x0bthumb_width\x18\x07 \x01(\r\x12\x14\n\x0cthumb_height\x18\x08 \x01(\r\x12\x16\n\x0ethumb_file_md5\x18\t \x01(\x0c\x12\x0e\n\x06source\x18\n \x01(\x0c\x12\x17\n\x0fthumb_file_size\x18\x0b \x01(\r\x12\x11\n\tbusi_type\x18\x0c \x01(\r\x12\x16\n\x0e\x66rom_chat_type\x18\r \x01(\r\x12\x14\n\x0cto_chat_type\x18\x0e \x01(\r\x12\x1b\n\x13support_progressive\x18\x0f \x01(\x08\x12\x12\n\nfile_width\x18\x10 \x01(\r\x12\x13\n\x0b\x66ile_height\x18\x11 \x01(\r\x12\x15\n\rsub_busi_type\x18\x12 \x01(\r\x12\x12\n\nvideo_attr\x18\x13 \x01(\r\x12\x17\n\x0fthumb_file_urls\x18\x14 \x03(\x0c\x12\x17\n\x0fvideo_file_urls\x18\x15 \x03(\x0c\x12\x1b\n\x13thumb_download_flag\x18\x16 \x01(\r\x12\x1b\n\x13video_download_flag\x18\x17 \x01(\r\x12\x12\n\npb_reserve\x18\x18 \x01(\x0c\"8\n\x11WorkflowNotifyMsg\x12\x0f\n\x07\x65xt_msg\x18\x01 \x01(\x0c\x12\x12\n\ncreate_uin\x18\x02 \x01(\x04\"A\n\x0cLocationInfo\x12\x11\n\tlongitude\x18\x01 \x01(\x01\x12\x10\n\x08latitude\x18\x02 \x01(\x01\x12\x0c\n\x04\x64\x65sc\x18\x03 \x01(\x0c'
-)
-
-
-
-
-_ANONYMOUSGROUPMSG = _descriptor.Descriptor(
-  name='AnonymousGroupMsg',
-  full_name='im.msg.msg_body.AnonymousGroupMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='flags', full_name='im.msg.msg_body.AnonymousGroupMsg.flags', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='anon_id', full_name='im.msg.msg_body.AnonymousGroupMsg.anon_id', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='anon_nick', full_name='im.msg.msg_body.AnonymousGroupMsg.anon_nick', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='head_portrait', full_name='im.msg.msg_body.AnonymousGroupMsg.head_portrait', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='expire_time', full_name='im.msg.msg_body.AnonymousGroupMsg.expire_time', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bubble_id', full_name='im.msg.msg_body.AnonymousGroupMsg.bubble_id', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rank_color', full_name='im.msg.msg_body.AnonymousGroupMsg.rank_color', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=59,
-  serialized_end=212,
-)
-
-
-_APOLLOACTMSG = _descriptor.Descriptor(
-  name='ApolloActMsg',
-  full_name='im.msg.msg_body.ApolloActMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='action_id', full_name='im.msg.msg_body.ApolloActMsg.action_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='action_name', full_name='im.msg.msg_body.ApolloActMsg.action_name', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='action_text', full_name='im.msg.msg_body.ApolloActMsg.action_text', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='im.msg.msg_body.ApolloActMsg.flag', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='peer_uin', full_name='im.msg.msg_body.ApolloActMsg.peer_uin', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sender_ts', full_name='im.msg.msg_body.ApolloActMsg.sender_ts', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='peer_ts', full_name='im.msg.msg_body.ApolloActMsg.peer_ts', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sender_status', full_name='im.msg.msg_body.ApolloActMsg.sender_status', index=7,
-      number=8, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='peer_status', full_name='im.msg.msg_body.ApolloActMsg.peer_status', index=8,
-      number=9, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='diytext_id', full_name='im.msg.msg_body.ApolloActMsg.diytext_id', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='diytext_content', full_name='im.msg.msg_body.ApolloActMsg.diytext_content', index=10,
-      number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='input_text', full_name='im.msg.msg_body.ApolloActMsg.input_text', index=11,
-      number=12, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.ApolloActMsg.pb_reserve', index=12,
-      number=13, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=215,
-  serialized_end=487,
-)
-
-
-_ARKAPPELEM = _descriptor.Descriptor(
-  name='ArkAppElem',
-  full_name='im.msg.msg_body.ArkAppElem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='app_name', full_name='im.msg.msg_body.ArkAppElem.app_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='min_version', full_name='im.msg.msg_body.ArkAppElem.min_version', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='xml_template', full_name='im.msg.msg_body.ArkAppElem.xml_template', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='data', full_name='im.msg.msg_body.ArkAppElem.data', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=489,
-  serialized_end=576,
-)
-
-
-_ATTR = _descriptor.Descriptor(
-  name='Attr',
-  full_name='im.msg.msg_body.Attr',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='code_page', full_name='im.msg.msg_body.Attr.code_page', index=0,
-      number=1, type=17, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='time', full_name='im.msg.msg_body.Attr.time', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='random', full_name='im.msg.msg_body.Attr.random', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='color', full_name='im.msg.msg_body.Attr.color', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='size', full_name='im.msg.msg_body.Attr.size', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='effect', full_name='im.msg.msg_body.Attr.effect', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='char_set', full_name='im.msg.msg_body.Attr.char_set', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pitch_and_family', full_name='im.msg.msg_body.Attr.pitch_and_family', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='font_name', full_name='im.msg.msg_body.Attr.font_name', index=8,
-      number=9, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserve_data', full_name='im.msg.msg_body.Attr.reserve_data', index=9,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=579,
-  serialized_end=764,
-)
-
-
-_BITAPPMSG = _descriptor.Descriptor(
-  name='BitAppMsg',
-  full_name='im.msg.msg_body.BitAppMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='buf', full_name='im.msg.msg_body.BitAppMsg.buf', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=766,
-  serialized_end=790,
-)
-
-
-_BLESSINGMESSAGE = _descriptor.Descriptor(
-  name='BlessingMessage',
-  full_name='im.msg.msg_body.BlessingMessage',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='msg_type', full_name='im.msg.msg_body.BlessingMessage.msg_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ex_flag', full_name='im.msg.msg_body.BlessingMessage.ex_flag', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=792,
-  serialized_end=844,
-)
-
-
-_COMMONELEM = _descriptor.Descriptor(
-  name='CommonElem',
-  full_name='im.msg.msg_body.CommonElem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='service_type', full_name='im.msg.msg_body.CommonElem.service_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_elem', full_name='im.msg.msg_body.CommonElem.pb_elem', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='business_type', full_name='im.msg.msg_body.CommonElem.business_type', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=846,
-  serialized_end=920,
-)
-
-
-_CONFERENCETIPSINFO = _descriptor.Descriptor(
-  name='ConferenceTipsInfo',
-  full_name='im.msg.msg_body.ConferenceTipsInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='session_type', full_name='im.msg.msg_body.ConferenceTipsInfo.session_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='session_uin', full_name='im.msg.msg_body.ConferenceTipsInfo.session_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='text', full_name='im.msg.msg_body.ConferenceTipsInfo.text', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=922,
-  serialized_end=999,
-)
-
-
-_CRMELEM = _descriptor.Descriptor(
-  name='CrmElem',
-  full_name='im.msg.msg_body.CrmElem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='crm_buf', full_name='im.msg.msg_body.CrmElem.crm_buf', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_resid', full_name='im.msg.msg_body.CrmElem.msg_resid', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='qidian_flag', full_name='im.msg.msg_body.CrmElem.qidian_flag', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='push_flag', full_name='im.msg.msg_body.CrmElem.push_flag', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='count_flag', full_name='im.msg.msg_body.CrmElem.count_flag', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1001,
-  serialized_end=1106,
-)
-
-
-_CUSTOMELEM = _descriptor.Descriptor(
-  name='CustomElem',
-  full_name='im.msg.msg_body.CustomElem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='desc', full_name='im.msg.msg_body.CustomElem.desc', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='data', full_name='im.msg.msg_body.CustomElem.data', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='enum_type', full_name='im.msg.msg_body.CustomElem.enum_type', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ext', full_name='im.msg.msg_body.CustomElem.ext', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sound', full_name='im.msg.msg_body.CustomElem.sound', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1108,
-  serialized_end=1195,
-)
-
-
-_CUSTOMFACE = _descriptor.Descriptor(
-  name='CustomFace',
-  full_name='im.msg.msg_body.CustomFace',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='guid', full_name='im.msg.msg_body.CustomFace.guid', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_path', full_name='im.msg.msg_body.CustomFace.file_path', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='shortcut', full_name='im.msg.msg_body.CustomFace.shortcut', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='buffer', full_name='im.msg.msg_body.CustomFace.buffer', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='im.msg.msg_body.CustomFace.flag', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='old_data', full_name='im.msg.msg_body.CustomFace.old_data', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_id', full_name='im.msg.msg_body.CustomFace.file_id', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='server_ip', full_name='im.msg.msg_body.CustomFace.server_ip', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='server_port', full_name='im.msg.msg_body.CustomFace.server_port', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_type', full_name='im.msg.msg_body.CustomFace.file_type', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='signature', full_name='im.msg.msg_body.CustomFace.signature', index=10,
-      number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='useful', full_name='im.msg.msg_body.CustomFace.useful', index=11,
-      number=12, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='md5', full_name='im.msg.msg_body.CustomFace.md5', index=12,
-      number=13, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_url', full_name='im.msg.msg_body.CustomFace.thumb_url', index=13,
-      number=14, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='big_url', full_name='im.msg.msg_body.CustomFace.big_url', index=14,
-      number=15, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='orig_url', full_name='im.msg.msg_body.CustomFace.orig_url', index=15,
-      number=16, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='biz_type', full_name='im.msg.msg_body.CustomFace.biz_type', index=16,
-      number=17, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='repeat_index', full_name='im.msg.msg_body.CustomFace.repeat_index', index=17,
-      number=18, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='repeat_image', full_name='im.msg.msg_body.CustomFace.repeat_image', index=18,
-      number=19, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='image_type', full_name='im.msg.msg_body.CustomFace.image_type', index=19,
-      number=20, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='index', full_name='im.msg.msg_body.CustomFace.index', index=20,
-      number=21, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='width', full_name='im.msg.msg_body.CustomFace.width', index=21,
-      number=22, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='height', full_name='im.msg.msg_body.CustomFace.height', index=22,
-      number=23, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='source', full_name='im.msg.msg_body.CustomFace.source', index=23,
-      number=24, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='size', full_name='im.msg.msg_body.CustomFace.size', index=24,
-      number=25, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='origin', full_name='im.msg.msg_body.CustomFace.origin', index=25,
-      number=26, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_width', full_name='im.msg.msg_body.CustomFace.thumb_width', index=26,
-      number=27, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_height', full_name='im.msg.msg_body.CustomFace.thumb_height', index=27,
-      number=28, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='show_len', full_name='im.msg.msg_body.CustomFace.show_len', index=28,
-      number=29, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='download_len', full_name='im.msg.msg_body.CustomFace.download_len', index=29,
-      number=30, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='_400_url', full_name='im.msg.msg_body.CustomFace._400_url', index=30,
-      number=31, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='_400_width', full_name='im.msg.msg_body.CustomFace._400_width', index=31,
-      number=32, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='_400_height', full_name='im.msg.msg_body.CustomFace._400_height', index=32,
-      number=33, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.CustomFace.pb_reserve', index=33,
-      number=34, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1198,
-  serialized_end=1823,
-)
-
-
-_DELIVERGIFTMSG = _descriptor.Descriptor(
-  name='DeliverGiftMsg',
-  full_name='im.msg.msg_body.DeliverGiftMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='gray_tip_content', full_name='im.msg.msg_body.DeliverGiftMsg.gray_tip_content', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='animation_package_id', full_name='im.msg.msg_body.DeliverGiftMsg.animation_package_id', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='animation_package_url_a', full_name='im.msg.msg_body.DeliverGiftMsg.animation_package_url_a', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='animation_package_url_i', full_name='im.msg.msg_body.DeliverGiftMsg.animation_package_url_i', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='remind_brief', full_name='im.msg.msg_body.DeliverGiftMsg.remind_brief', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='gift_id', full_name='im.msg.msg_body.DeliverGiftMsg.gift_id', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='gift_count', full_name='im.msg.msg_body.DeliverGiftMsg.gift_count', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='animation_brief', full_name='im.msg.msg_body.DeliverGiftMsg.animation_brief', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sender_uin', full_name='im.msg.msg_body.DeliverGiftMsg.sender_uin', index=8,
-      number=9, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='receiver_uin', full_name='im.msg.msg_body.DeliverGiftMsg.receiver_uin', index=9,
-      number=10, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='stmessage_title', full_name='im.msg.msg_body.DeliverGiftMsg.stmessage_title', index=10,
-      number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='stmessage_subtitle', full_name='im.msg.msg_body.DeliverGiftMsg.stmessage_subtitle', index=11,
-      number=12, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='stmessage_message', full_name='im.msg.msg_body.DeliverGiftMsg.stmessage_message', index=12,
-      number=13, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='stmessage_giftpicid', full_name='im.msg.msg_body.DeliverGiftMsg.stmessage_giftpicid', index=13,
-      number=14, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='stmessage_comefrom', full_name='im.msg.msg_body.DeliverGiftMsg.stmessage_comefrom', index=14,
-      number=15, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='stmessage_exflag', full_name='im.msg.msg_body.DeliverGiftMsg.stmessage_exflag', index=15,
-      number=16, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_all_gift_id', full_name='im.msg.msg_body.DeliverGiftMsg.to_all_gift_id', index=16,
-      number=17, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='comefrom_link', full_name='im.msg.msg_body.DeliverGiftMsg.comefrom_link', index=17,
-      number=18, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.DeliverGiftMsg.pb_reserve', index=18,
-      number=19, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='receiver_name', full_name='im.msg.msg_body.DeliverGiftMsg.receiver_name', index=19,
-      number=20, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='receiver_pic', full_name='im.msg.msg_body.DeliverGiftMsg.receiver_pic', index=20,
-      number=21, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='stmessage_gifturl', full_name='im.msg.msg_body.DeliverGiftMsg.stmessage_gifturl', index=21,
-      number=22, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1826,
-  serialized_end=2392,
-)
-
-
-_EIMINFO = _descriptor.Descriptor(
-  name='EIMInfo',
-  full_name='im.msg.msg_body.EIMInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='root_id', full_name='im.msg.msg_body.EIMInfo.root_id', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='im.msg.msg_body.EIMInfo.flag', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2394,
-  serialized_end=2434,
-)
-
-
-_ELEM = _descriptor.Descriptor(
-  name='Elem',
-  full_name='im.msg.msg_body.Elem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='text', full_name='im.msg.msg_body.Elem.text', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='face', full_name='im.msg.msg_body.Elem.face', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='online_image', full_name='im.msg.msg_body.Elem.online_image', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='not_online_image', full_name='im.msg.msg_body.Elem.not_online_image', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='trans_elem_info', full_name='im.msg.msg_body.Elem.trans_elem_info', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='market_face', full_name='im.msg.msg_body.Elem.market_face', index=5,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='elem_flags', full_name='im.msg.msg_body.Elem.elem_flags', index=6,
-      number=7, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='custom_face', full_name='im.msg.msg_body.Elem.custom_face', index=7,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='elem_flags2', full_name='im.msg.msg_body.Elem.elem_flags2', index=8,
-      number=9, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='fun_face', full_name='im.msg.msg_body.Elem.fun_face', index=9,
-      number=10, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='secret_file', full_name='im.msg.msg_body.Elem.secret_file', index=10,
-      number=11, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rich_msg', full_name='im.msg.msg_body.Elem.rich_msg', index=11,
-      number=12, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_file', full_name='im.msg.msg_body.Elem.group_file', index=12,
-      number=13, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pub_group', full_name='im.msg.msg_body.Elem.pub_group', index=13,
-      number=14, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='market_trans', full_name='im.msg.msg_body.Elem.market_trans', index=14,
-      number=15, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='extra_info', full_name='im.msg.msg_body.Elem.extra_info', index=15,
-      number=16, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='shake_window', full_name='im.msg.msg_body.Elem.shake_window', index=16,
-      number=17, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pub_account', full_name='im.msg.msg_body.Elem.pub_account', index=17,
-      number=18, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='video_file', full_name='im.msg.msg_body.Elem.video_file', index=18,
-      number=19, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='tips_info', full_name='im.msg.msg_body.Elem.tips_info', index=19,
-      number=20, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='anon_group_msg', full_name='im.msg.msg_body.Elem.anon_group_msg', index=20,
-      number=21, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='qq_live_old', full_name='im.msg.msg_body.Elem.qq_live_old', index=21,
-      number=22, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='life_online', full_name='im.msg.msg_body.Elem.life_online', index=22,
-      number=23, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='qqwallet_msg', full_name='im.msg.msg_body.Elem.qqwallet_msg', index=23,
-      number=24, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='crm_elem', full_name='im.msg.msg_body.Elem.crm_elem', index=24,
-      number=25, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='conference_tips_info', full_name='im.msg.msg_body.Elem.conference_tips_info', index=25,
-      number=26, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='redbag_info', full_name='im.msg.msg_body.Elem.redbag_info', index=26,
-      number=27, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='low_version_tips', full_name='im.msg.msg_body.Elem.low_version_tips', index=27,
-      number=28, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bankcode_ctrl_info', full_name='im.msg.msg_body.Elem.bankcode_ctrl_info', index=28,
-      number=29, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='near_by_msg', full_name='im.msg.msg_body.Elem.near_by_msg', index=29,
-      number=30, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='custom_elem', full_name='im.msg.msg_body.Elem.custom_elem', index=30,
-      number=31, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='location_info', full_name='im.msg.msg_body.Elem.location_info', index=31,
-      number=32, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pub_acc_info', full_name='im.msg.msg_body.Elem.pub_acc_info', index=32,
-      number=33, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='small_emoji', full_name='im.msg.msg_body.Elem.small_emoji', index=33,
-      number=34, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='fsj_msg_elem', full_name='im.msg.msg_body.Elem.fsj_msg_elem', index=34,
-      number=35, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ark_app', full_name='im.msg.msg_body.Elem.ark_app', index=35,
-      number=36, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='general_flags', full_name='im.msg.msg_body.Elem.general_flags', index=36,
-      number=37, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='hc_flash_pic', full_name='im.msg.msg_body.Elem.hc_flash_pic', index=37,
-      number=38, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='deliver_gift_msg', full_name='im.msg.msg_body.Elem.deliver_gift_msg', index=38,
-      number=39, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bitapp_msg', full_name='im.msg.msg_body.Elem.bitapp_msg', index=39,
-      number=40, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='open_qq_data', full_name='im.msg.msg_body.Elem.open_qq_data', index=40,
-      number=41, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='apollo_msg', full_name='im.msg.msg_body.Elem.apollo_msg', index=41,
-      number=42, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_pub_acc_info', full_name='im.msg.msg_body.Elem.group_pub_acc_info', index=42,
-      number=43, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bless_msg', full_name='im.msg.msg_body.Elem.bless_msg', index=43,
-      number=44, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='src_msg', full_name='im.msg.msg_body.Elem.src_msg', index=44,
-      number=45, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='lola_msg', full_name='im.msg.msg_body.Elem.lola_msg', index=45,
-      number=46, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_business_msg', full_name='im.msg.msg_body.Elem.group_business_msg', index=46,
-      number=47, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='workflow_notify', full_name='im.msg.msg_body.Elem.workflow_notify', index=47,
-      number=48, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pat_elem', full_name='im.msg.msg_body.Elem.pat_elem', index=48,
-      number=49, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_post_elem', full_name='im.msg.msg_body.Elem.group_post_elem', index=49,
-      number=50, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='light_app', full_name='im.msg.msg_body.Elem.light_app', index=50,
-      number=51, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='eim_info', full_name='im.msg.msg_body.Elem.eim_info', index=51,
-      number=52, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='common_elem', full_name='im.msg.msg_body.Elem.common_elem', index=52,
-      number=53, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2437,
-  serialized_end=5136,
-)
-
-
-_ELEMFLAGS = _descriptor.Descriptor(
-  name='ElemFlags',
-  full_name='im.msg.msg_body.ElemFlags',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='flags1', full_name='im.msg.msg_body.ElemFlags.flags1', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='business_data', full_name='im.msg.msg_body.ElemFlags.business_data', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5138,
-  serialized_end=5188,
-)
-
-
-_ELEMFLAGS2 = _descriptor.Descriptor(
-  name='ElemFlags2',
-  full_name='im.msg.msg_body.ElemFlags2',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='color_text_id', full_name='im.msg.msg_body.ElemFlags2.color_text_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_id', full_name='im.msg.msg_body.ElemFlags2.msg_id', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='whisper_session_id', full_name='im.msg.msg_body.ElemFlags2.whisper_session_id', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ptt_change_bit', full_name='im.msg.msg_body.ElemFlags2.ptt_change_bit', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='vip_status', full_name='im.msg.msg_body.ElemFlags2.vip_status', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='compatible_id', full_name='im.msg.msg_body.ElemFlags2.compatible_id', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='insts', full_name='im.msg.msg_body.ElemFlags2.insts', index=6,
-      number=7, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_rpt_cnt', full_name='im.msg.msg_body.ElemFlags2.msg_rpt_cnt', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='src_inst', full_name='im.msg.msg_body.ElemFlags2.src_inst', index=8,
-      number=9, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='longtitude', full_name='im.msg.msg_body.ElemFlags2.longtitude', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='latitude', full_name='im.msg.msg_body.ElemFlags2.latitude', index=10,
-      number=11, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='custom_font', full_name='im.msg.msg_body.ElemFlags2.custom_font', index=11,
-      number=12, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pc_support_def', full_name='im.msg.msg_body.ElemFlags2.pc_support_def', index=12,
-      number=13, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='crm_flags', full_name='im.msg.msg_body.ElemFlags2.crm_flags', index=13,
-      number=14, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5191,
-  serialized_end=5570,
-)
-
-
-_INST = _descriptor.Descriptor(
-  name='Inst',
-  full_name='im.msg.msg_body.Inst',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='app_id', full_name='im.msg.msg_body.Inst.app_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='inst_id', full_name='im.msg.msg_body.Inst.inst_id', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5572,
-  serialized_end=5611,
-)
-
-
-_EXTRAINFO = _descriptor.Descriptor(
-  name='ExtraInfo',
-  full_name='im.msg.msg_body.ExtraInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='nick', full_name='im.msg.msg_body.ExtraInfo.nick', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_card', full_name='im.msg.msg_body.ExtraInfo.group_card', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='level', full_name='im.msg.msg_body.ExtraInfo.level', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flags', full_name='im.msg.msg_body.ExtraInfo.flags', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_mask', full_name='im.msg.msg_body.ExtraInfo.group_mask', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_tail_id', full_name='im.msg.msg_body.ExtraInfo.msg_tail_id', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sender_title', full_name='im.msg.msg_body.ExtraInfo.sender_title', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='apns_tips', full_name='im.msg.msg_body.ExtraInfo.apns_tips', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='uin', full_name='im.msg.msg_body.ExtraInfo.uin', index=8,
-      number=9, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_state_flag', full_name='im.msg.msg_body.ExtraInfo.msg_state_flag', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='apns_sound_type', full_name='im.msg.msg_body.ExtraInfo.apns_sound_type', index=10,
-      number=11, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='new_group_flag', full_name='im.msg.msg_body.ExtraInfo.new_group_flag', index=11,
-      number=12, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5614,
-  serialized_end=5857,
-)
-
-
-_FSJMESSAGEELEM = _descriptor.Descriptor(
-  name='FSJMessageElem',
-  full_name='im.msg.msg_body.FSJMessageElem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='msg_type', full_name='im.msg.msg_body.FSJMessageElem.msg_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5859,
-  serialized_end=5893,
-)
-
-
-_FACE = _descriptor.Descriptor(
-  name='Face',
-  full_name='im.msg.msg_body.Face',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='index', full_name='im.msg.msg_body.Face.index', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='old', full_name='im.msg.msg_body.Face.old', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='buf', full_name='im.msg.msg_body.Face.buf', index=2,
-      number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5895,
-  serialized_end=5942,
-)
-
-
-_FUNFACE = _descriptor.Descriptor(
-  name='FunFace',
-  full_name='im.msg.msg_body.FunFace',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='turntable', full_name='im.msg.msg_body.FunFace.turntable', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bomb', full_name='im.msg.msg_body.FunFace.bomb', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5944,
-  serialized_end=6037,
-)
-
-
-_BOMB = _descriptor.Descriptor(
-  name='Bomb',
-  full_name='im.msg.msg_body.Bomb',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='burst', full_name='im.msg.msg_body.Bomb.burst', index=0,
-      number=1, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6039,
-  serialized_end=6060,
-)
-
-
-_TURNTABLE = _descriptor.Descriptor(
-  name='Turntable',
-  full_name='im.msg.msg_body.Turntable',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='uin_list', full_name='im.msg.msg_body.Turntable.uin_list', index=0,
-      number=1, type=4, cpp_type=4, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='hit_uin', full_name='im.msg.msg_body.Turntable.hit_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='hit_uin_nick', full_name='im.msg.msg_body.Turntable.hit_uin_nick', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6062,
-  serialized_end=6130,
-)
-
-
-_GENERALFLAGS = _descriptor.Descriptor(
-  name='GeneralFlags',
-  full_name='im.msg.msg_body.GeneralFlags',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='bubble_diy_text_id', full_name='im.msg.msg_body.GeneralFlags.bubble_diy_text_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_flag_new', full_name='im.msg.msg_body.GeneralFlags.group_flag_new', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='uin', full_name='im.msg.msg_body.GeneralFlags.uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rp_id', full_name='im.msg.msg_body.GeneralFlags.rp_id', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='prp_fold', full_name='im.msg.msg_body.GeneralFlags.prp_fold', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='long_text_flag', full_name='im.msg.msg_body.GeneralFlags.long_text_flag', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='long_text_resid', full_name='im.msg.msg_body.GeneralFlags.long_text_resid', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_type', full_name='im.msg.msg_body.GeneralFlags.group_type', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_uin_flag', full_name='im.msg.msg_body.GeneralFlags.to_uin_flag', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='glamour_level', full_name='im.msg.msg_body.GeneralFlags.glamour_level', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='member_level', full_name='im.msg.msg_body.GeneralFlags.member_level', index=10,
-      number=11, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_rank_seq', full_name='im.msg.msg_body.GeneralFlags.group_rank_seq', index=11,
-      number=12, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='olympic_torch', full_name='im.msg.msg_body.GeneralFlags.olympic_torch', index=12,
-      number=13, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='babyq_guide_msg_cookie', full_name='im.msg.msg_body.GeneralFlags.babyq_guide_msg_cookie', index=13,
-      number=14, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='uin32_expert_flag', full_name='im.msg.msg_body.GeneralFlags.uin32_expert_flag', index=14,
-      number=15, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bubble_sub_id', full_name='im.msg.msg_body.GeneralFlags.bubble_sub_id', index=15,
-      number=16, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pendant_id', full_name='im.msg.msg_body.GeneralFlags.pendant_id', index=16,
-      number=17, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rp_index', full_name='im.msg.msg_body.GeneralFlags.rp_index', index=17,
-      number=18, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.GeneralFlags.pb_reserve', index=18,
-      number=19, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6133,
-  serialized_end=6567,
-)
-
-
-_GROUPBUSINESSMSG = _descriptor.Descriptor(
-  name='GroupBusinessMsg',
-  full_name='im.msg.msg_body.GroupBusinessMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='flags', full_name='im.msg.msg_body.GroupBusinessMsg.flags', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='head_url', full_name='im.msg.msg_body.GroupBusinessMsg.head_url', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='head_clk_url', full_name='im.msg.msg_body.GroupBusinessMsg.head_clk_url', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='nick', full_name='im.msg.msg_body.GroupBusinessMsg.nick', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='nick_color', full_name='im.msg.msg_body.GroupBusinessMsg.nick_color', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rank', full_name='im.msg.msg_body.GroupBusinessMsg.rank', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rank_color', full_name='im.msg.msg_body.GroupBusinessMsg.rank_color', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rank_bgcolor', full_name='im.msg.msg_body.GroupBusinessMsg.rank_bgcolor', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6570,
-  serialized_end=6733,
-)
-
-
-_GROUPFILE = _descriptor.Descriptor(
-  name='GroupFile',
-  full_name='im.msg.msg_body.GroupFile',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='filename', full_name='im.msg.msg_body.GroupFile.filename', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_size', full_name='im.msg.msg_body.GroupFile.file_size', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_id', full_name='im.msg.msg_body.GroupFile.file_id', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='batch_id', full_name='im.msg.msg_body.GroupFile.batch_id', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_key', full_name='im.msg.msg_body.GroupFile.file_key', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='mark', full_name='im.msg.msg_body.GroupFile.mark', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sequence', full_name='im.msg.msg_body.GroupFile.sequence', index=6,
-      number=7, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='batch_item_id', full_name='im.msg.msg_body.GroupFile.batch_item_id', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='feed_msg_time', full_name='im.msg.msg_body.GroupFile.feed_msg_time', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.GroupFile.pb_reserve', index=9,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6736,
-  serialized_end=6935,
-)
-
-
-_GROUPPOSTELEM = _descriptor.Descriptor(
-  name='GroupPostElem',
-  full_name='im.msg.msg_body.GroupPostElem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='trans_type', full_name='im.msg.msg_body.GroupPostElem.trans_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='trans_msg', full_name='im.msg.msg_body.GroupPostElem.trans_msg', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6937,
-  serialized_end=6991,
-)
-
-
-_GROUPPUBACCOUNTINFO = _descriptor.Descriptor(
-  name='GroupPubAccountInfo',
-  full_name='im.msg.msg_body.GroupPubAccountInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='pub_account', full_name='im.msg.msg_body.GroupPubAccountInfo.pub_account', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6993,
-  serialized_end=7035,
-)
-
-
-_LIFEONLINEACCOUNT = _descriptor.Descriptor(
-  name='LifeOnlineAccount',
-  full_name='im.msg.msg_body.LifeOnlineAccount',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='unique_id', full_name='im.msg.msg_body.LifeOnlineAccount.unique_id', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='op', full_name='im.msg.msg_body.LifeOnlineAccount.op', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='show_time', full_name='im.msg.msg_body.LifeOnlineAccount.show_time', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='report', full_name='im.msg.msg_body.LifeOnlineAccount.report', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ack', full_name='im.msg.msg_body.LifeOnlineAccount.ack', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bitmap', full_name='im.msg.msg_body.LifeOnlineAccount.bitmap', index=5,
-      number=6, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='gdt_imp_data', full_name='im.msg.msg_body.LifeOnlineAccount.gdt_imp_data', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='gdt_cli_data', full_name='im.msg.msg_body.LifeOnlineAccount.gdt_cli_data', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='view_id', full_name='im.msg.msg_body.LifeOnlineAccount.view_id', index=8,
-      number=9, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7038,
-  serialized_end=7213,
-)
-
-
-_LIGHTAPPELEM = _descriptor.Descriptor(
-  name='LightAppElem',
-  full_name='im.msg.msg_body.LightAppElem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='data', full_name='im.msg.msg_body.LightAppElem.data', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_resid', full_name='im.msg.msg_body.LightAppElem.msg_resid', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7215,
-  serialized_end=7262,
-)
-
-
-_LOLAMSG = _descriptor.Descriptor(
-  name='LolaMsg',
-  full_name='im.msg.msg_body.LolaMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='msg_resid', full_name='im.msg.msg_body.LolaMsg.msg_resid', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='encode_content', full_name='im.msg.msg_body.LolaMsg.encode_content', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='long_msg_url', full_name='im.msg.msg_body.LolaMsg.long_msg_url', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='download_key', full_name='im.msg.msg_body.LolaMsg.download_key', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7264,
-  serialized_end=7360,
-)
-
-
-_LOWVERSIONTIPS = _descriptor.Descriptor(
-  name='LowVersionTips',
-  full_name='im.msg.msg_body.LowVersionTips',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='business_id', full_name='im.msg.msg_body.LowVersionTips.business_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='session_type', full_name='im.msg.msg_body.LowVersionTips.session_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='session_uin', full_name='im.msg.msg_body.LowVersionTips.session_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sender_uin', full_name='im.msg.msg_body.LowVersionTips.sender_uin', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='text', full_name='im.msg.msg_body.LowVersionTips.text', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7362,
-  serialized_end=7476,
-)
-
-
-_MARKETFACE = _descriptor.Descriptor(
-  name='MarketFace',
-  full_name='im.msg.msg_body.MarketFace',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='face_name', full_name='im.msg.msg_body.MarketFace.face_name', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='item_type', full_name='im.msg.msg_body.MarketFace.item_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='face_info', full_name='im.msg.msg_body.MarketFace.face_info', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='face_id', full_name='im.msg.msg_body.MarketFace.face_id', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='tab_id', full_name='im.msg.msg_body.MarketFace.tab_id', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sub_type', full_name='im.msg.msg_body.MarketFace.sub_type', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='key', full_name='im.msg.msg_body.MarketFace.key', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='param', full_name='im.msg.msg_body.MarketFace.param', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='media_type', full_name='im.msg.msg_body.MarketFace.media_type', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='image_width', full_name='im.msg.msg_body.MarketFace.image_width', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='image_height', full_name='im.msg.msg_body.MarketFace.image_height', index=10,
-      number=11, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='mobileparam', full_name='im.msg.msg_body.MarketFace.mobileparam', index=11,
-      number=12, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.MarketFace.pb_reserve', index=12,
-      number=13, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7479,
-  serialized_end=7731,
-)
-
-
-_MARKETTRANS = _descriptor.Descriptor(
-  name='MarketTrans',
-  full_name='im.msg.msg_body.MarketTrans',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='im.msg.msg_body.MarketTrans.flag', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='xml', full_name='im.msg.msg_body.MarketTrans.xml', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_resid', full_name='im.msg.msg_body.MarketTrans.msg_resid', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ability', full_name='im.msg.msg_body.MarketTrans.ability', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='min_ability', full_name='im.msg.msg_body.MarketTrans.min_ability', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7733,
-  serialized_end=7830,
-)
-
-
-_MSGBODY = _descriptor.Descriptor(
-  name='MsgBody',
-  full_name='im.msg.msg_body.MsgBody',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='rich_text', full_name='im.msg.msg_body.MsgBody.rich_text', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content', full_name='im.msg.msg_body.MsgBody.content', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='encrypt_content', full_name='im.msg.msg_body.MsgBody.encrypt_content', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7832,
-  serialized_end=7929,
-)
-
-
-_MSGBODY_SUBTYPE4 = _descriptor.Descriptor(
-  name='MsgBody_subtype4',
-  full_name='im.msg.msg_body.MsgBody_subtype4',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='not_online_file', full_name='im.msg.msg_body.MsgBody_subtype4.not_online_file', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_time', full_name='im.msg.msg_body.MsgBody_subtype4.msg_time', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7931,
-  serialized_end=8024,
-)
-
-
-_NEARBYMESSAGETYPE = _descriptor.Descriptor(
-  name='NearByMessageType',
-  full_name='im.msg.msg_body.NearByMessageType',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='type', full_name='im.msg.msg_body.NearByMessageType.type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='identify_type', full_name='im.msg.msg_body.NearByMessageType.identify_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=8026,
-  serialized_end=8082,
-)
-
-
-_NOTONLINEFILE = _descriptor.Descriptor(
-  name='NotOnlineFile',
-  full_name='im.msg.msg_body.NotOnlineFile',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='file_type', full_name='im.msg.msg_body.NotOnlineFile.file_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='im.msg.msg_body.NotOnlineFile.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_uuid', full_name='im.msg.msg_body.NotOnlineFile.file_uuid', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_md5', full_name='im.msg.msg_body.NotOnlineFile.file_md5', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_name', full_name='im.msg.msg_body.NotOnlineFile.file_name', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_size', full_name='im.msg.msg_body.NotOnlineFile.file_size', index=5,
-      number=6, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='note', full_name='im.msg.msg_body.NotOnlineFile.note', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserved', full_name='im.msg.msg_body.NotOnlineFile.reserved', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='subcmd', full_name='im.msg.msg_body.NotOnlineFile.subcmd', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='micro_cloud', full_name='im.msg.msg_body.NotOnlineFile.micro_cloud', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_urls', full_name='im.msg.msg_body.NotOnlineFile.file_urls', index=10,
-      number=11, type=12, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='download_flag', full_name='im.msg.msg_body.NotOnlineFile.download_flag', index=11,
-      number=12, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='danger_evel', full_name='im.msg.msg_body.NotOnlineFile.danger_evel', index=12,
-      number=50, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='life_time', full_name='im.msg.msg_body.NotOnlineFile.life_time', index=13,
-      number=51, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='upload_time', full_name='im.msg.msg_body.NotOnlineFile.upload_time', index=14,
-      number=52, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='abs_file_type', full_name='im.msg.msg_body.NotOnlineFile.abs_file_type', index=15,
-      number=53, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='client_type', full_name='im.msg.msg_body.NotOnlineFile.client_type', index=16,
-      number=54, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='expire_time', full_name='im.msg.msg_body.NotOnlineFile.expire_time', index=17,
-      number=55, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.NotOnlineFile.pb_reserve', index=18,
-      number=56, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='fileidcrc_media', full_name='im.msg.msg_body.NotOnlineFile.fileidcrc_media', index=19,
-      number=57, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=8085,
-  serialized_end=8489,
-)
-
-
-_NOTONLINEIMAGE = _descriptor.Descriptor(
-  name='NotOnlineImage',
-  full_name='im.msg.msg_body.NotOnlineImage',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='file_path', full_name='im.msg.msg_body.NotOnlineImage.file_path', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_len', full_name='im.msg.msg_body.NotOnlineImage.file_len', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='download_path', full_name='im.msg.msg_body.NotOnlineImage.download_path', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='old_ver_send_file', full_name='im.msg.msg_body.NotOnlineImage.old_ver_send_file', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='img_type', full_name='im.msg.msg_body.NotOnlineImage.img_type', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='previews_image', full_name='im.msg.msg_body.NotOnlineImage.previews_image', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pic_md5', full_name='im.msg.msg_body.NotOnlineImage.pic_md5', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pic_height', full_name='im.msg.msg_body.NotOnlineImage.pic_height', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pic_width', full_name='im.msg.msg_body.NotOnlineImage.pic_width', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='res_id', full_name='im.msg.msg_body.NotOnlineImage.res_id', index=9,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='im.msg.msg_body.NotOnlineImage.flag', index=10,
-      number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_url', full_name='im.msg.msg_body.NotOnlineImage.thumb_url', index=11,
-      number=12, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='original', full_name='im.msg.msg_body.NotOnlineImage.original', index=12,
-      number=13, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='big_url', full_name='im.msg.msg_body.NotOnlineImage.big_url', index=13,
-      number=14, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='orig_url', full_name='im.msg.msg_body.NotOnlineImage.orig_url', index=14,
-      number=15, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='biz_type', full_name='im.msg.msg_body.NotOnlineImage.biz_type', index=15,
-      number=16, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='result', full_name='im.msg.msg_body.NotOnlineImage.result', index=16,
-      number=17, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='index', full_name='im.msg.msg_body.NotOnlineImage.index', index=17,
-      number=18, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='op_face_buf', full_name='im.msg.msg_body.NotOnlineImage.op_face_buf', index=18,
-      number=19, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='old_pic_md5', full_name='im.msg.msg_body.NotOnlineImage.old_pic_md5', index=19,
-      number=20, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_width', full_name='im.msg.msg_body.NotOnlineImage.thumb_width', index=20,
-      number=21, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_height', full_name='im.msg.msg_body.NotOnlineImage.thumb_height', index=21,
-      number=22, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_id', full_name='im.msg.msg_body.NotOnlineImage.file_id', index=22,
-      number=23, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='show_len', full_name='im.msg.msg_body.NotOnlineImage.show_len', index=23,
-      number=24, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='download_len', full_name='im.msg.msg_body.NotOnlineImage.download_len', index=24,
-      number=25, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='_400_url', full_name='im.msg.msg_body.NotOnlineImage._400_url', index=25,
-      number=26, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='_400_width', full_name='im.msg.msg_body.NotOnlineImage._400_width', index=26,
-      number=27, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='_400_height', full_name='im.msg.msg_body.NotOnlineImage._400_height', index=27,
-      number=28, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.NotOnlineImage.pb_reserve', index=28,
-      number=29, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=8492,
-  serialized_end=9065,
-)
-
-
-_ONLINEIMAGE = _descriptor.Descriptor(
-  name='OnlineImage',
-  full_name='im.msg.msg_body.OnlineImage',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='guid', full_name='im.msg.msg_body.OnlineImage.guid', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_path', full_name='im.msg.msg_body.OnlineImage.file_path', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='old_ver_send_file', full_name='im.msg.msg_body.OnlineImage.old_ver_send_file', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9067,
-  serialized_end=9140,
-)
-
-
-_OPENQQDATA = _descriptor.Descriptor(
-  name='OpenQQData',
-  full_name='im.msg.msg_body.OpenQQData',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='car_qq_data', full_name='im.msg.msg_body.OpenQQData.car_qq_data', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9142,
-  serialized_end=9175,
-)
-
-
-_PATSELEM = _descriptor.Descriptor(
-  name='PatsElem',
-  full_name='im.msg.msg_body.PatsElem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='pat_type', full_name='im.msg.msg_body.PatsElem.pat_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pat_count', full_name='im.msg.msg_body.PatsElem.pat_count', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9177,
-  serialized_end=9224,
-)
-
-
-_PCSUPPORTDEF = _descriptor.Descriptor(
-  name='PcSupportDef',
-  full_name='im.msg.msg_body.PcSupportDef',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='pc_ptl_begin', full_name='im.msg.msg_body.PcSupportDef.pc_ptl_begin', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pc_ptl_end', full_name='im.msg.msg_body.PcSupportDef.pc_ptl_end', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='mac_ptl_begin', full_name='im.msg.msg_body.PcSupportDef.mac_ptl_begin', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='mac_ptl_end', full_name='im.msg.msg_body.PcSupportDef.mac_ptl_end', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ptls_support', full_name='im.msg.msg_body.PcSupportDef.ptls_support', index=4,
-      number=5, type=13, cpp_type=3, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ptls_not_support', full_name='im.msg.msg_body.PcSupportDef.ptls_not_support', index=5,
-      number=6, type=13, cpp_type=3, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9227,
-  serialized_end=9375,
-)
-
-
-_PTT = _descriptor.Descriptor(
-  name='Ptt',
-  full_name='im.msg.msg_body.Ptt',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='file_type', full_name='im.msg.msg_body.Ptt.file_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='src_uin', full_name='im.msg.msg_body.Ptt.src_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_uuid', full_name='im.msg.msg_body.Ptt.file_uuid', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_md5', full_name='im.msg.msg_body.Ptt.file_md5', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_name', full_name='im.msg.msg_body.Ptt.file_name', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_size', full_name='im.msg.msg_body.Ptt.file_size', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserve', full_name='im.msg.msg_body.Ptt.reserve', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_id', full_name='im.msg.msg_body.Ptt.file_id', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='server_ip', full_name='im.msg.msg_body.Ptt.server_ip', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='server_port', full_name='im.msg.msg_body.Ptt.server_port', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='valid', full_name='im.msg.msg_body.Ptt.valid', index=10,
-      number=11, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='signature', full_name='im.msg.msg_body.Ptt.signature', index=11,
-      number=12, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='shortcut', full_name='im.msg.msg_body.Ptt.shortcut', index=12,
-      number=13, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_key', full_name='im.msg.msg_body.Ptt.file_key', index=13,
-      number=14, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='magic_ptt_index', full_name='im.msg.msg_body.Ptt.magic_ptt_index', index=14,
-      number=15, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='voice_switch', full_name='im.msg.msg_body.Ptt.voice_switch', index=15,
-      number=16, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ptt_url', full_name='im.msg.msg_body.Ptt.ptt_url', index=16,
-      number=17, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_file_key', full_name='im.msg.msg_body.Ptt.group_file_key', index=17,
-      number=18, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='time', full_name='im.msg.msg_body.Ptt.time', index=18,
-      number=19, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='down_para', full_name='im.msg.msg_body.Ptt.down_para', index=19,
-      number=20, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='format', full_name='im.msg.msg_body.Ptt.format', index=20,
-      number=29, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.Ptt.pb_reserve', index=21,
-      number=30, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ptt_urls', full_name='im.msg.msg_body.Ptt.ptt_urls', index=22,
-      number=31, type=12, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='download_flag', full_name='im.msg.msg_body.Ptt.download_flag', index=23,
-      number=32, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9378,
-  serialized_end=9836,
-)
-
-
-_PUBACCINFO = _descriptor.Descriptor(
-  name='PubAccInfo',
-  full_name='im.msg.msg_body.PubAccInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='is_inter_num', full_name='im.msg.msg_body.PubAccInfo.is_inter_num', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_template_id', full_name='im.msg.msg_body.PubAccInfo.msg_template_id', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='long_msg_url', full_name='im.msg.msg_body.PubAccInfo.long_msg_url', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='download_key', full_name='im.msg.msg_body.PubAccInfo.download_key', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9838,
-  serialized_end=9941,
-)
-
-
-_PUBACCOUNT = _descriptor.Descriptor(
-  name='PubAccount',
-  full_name='im.msg.msg_body.PubAccount',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='buf', full_name='im.msg.msg_body.PubAccount.buf', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pub_account_uin', full_name='im.msg.msg_body.PubAccount.pub_account_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9943,
-  serialized_end=9993,
-)
-
-
-_PUBGROUP = _descriptor.Descriptor(
-  name='PubGroup',
-  full_name='im.msg.msg_body.PubGroup',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='nickname', full_name='im.msg.msg_body.PubGroup.nickname', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='gender', full_name='im.msg.msg_body.PubGroup.gender', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='age', full_name='im.msg.msg_body.PubGroup.age', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='distance', full_name='im.msg.msg_body.PubGroup.distance', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9995,
-  serialized_end=10070,
-)
-
-
-_QQLIVEOLD = _descriptor.Descriptor(
-  name='QQLiveOld',
-  full_name='im.msg.msg_body.QQLiveOld',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='sub_cmd', full_name='im.msg.msg_body.QQLiveOld.sub_cmd', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='show_text', full_name='im.msg.msg_body.QQLiveOld.show_text', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='param', full_name='im.msg.msg_body.QQLiveOld.param', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='introduce', full_name='im.msg.msg_body.QQLiveOld.introduce', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=10072,
-  serialized_end=10153,
-)
-
-
-_QQWALLETAIOBODY = _descriptor.Descriptor(
-  name='QQWalletAioBody',
-  full_name='im.msg.msg_body.QQWalletAioBody',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='senduin', full_name='im.msg.msg_body.QQWalletAioBody.senduin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sender', full_name='im.msg.msg_body.QQWalletAioBody.sender', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='receiver', full_name='im.msg.msg_body.QQWalletAioBody.receiver', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='channelid', full_name='im.msg.msg_body.QQWalletAioBody.channelid', index=3,
-      number=4, type=17, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='templateid', full_name='im.msg.msg_body.QQWalletAioBody.templateid', index=4,
-      number=5, type=17, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='resend', full_name='im.msg.msg_body.QQWalletAioBody.resend', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_priority', full_name='im.msg.msg_body.QQWalletAioBody.msg_priority', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='redtype', full_name='im.msg.msg_body.QQWalletAioBody.redtype', index=7,
-      number=8, type=17, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='billno', full_name='im.msg.msg_body.QQWalletAioBody.billno', index=8,
-      number=9, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='authkey', full_name='im.msg.msg_body.QQWalletAioBody.authkey', index=9,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sessiontype', full_name='im.msg.msg_body.QQWalletAioBody.sessiontype', index=10,
-      number=11, type=17, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msgtype', full_name='im.msg.msg_body.QQWalletAioBody.msgtype', index=11,
-      number=12, type=17, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='envelopeid', full_name='im.msg.msg_body.QQWalletAioBody.envelopeid', index=12,
-      number=13, type=17, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='name', full_name='im.msg.msg_body.QQWalletAioBody.name', index=13,
-      number=14, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='conftype', full_name='im.msg.msg_body.QQWalletAioBody.conftype', index=14,
-      number=15, type=17, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_from', full_name='im.msg.msg_body.QQWalletAioBody.msg_from', index=15,
-      number=16, type=17, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pc_body', full_name='im.msg.msg_body.QQWalletAioBody.pc_body', index=16,
-      number=17, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='index', full_name='im.msg.msg_body.QQWalletAioBody.index', index=17,
-      number=18, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='redchannel', full_name='im.msg.msg_body.QQWalletAioBody.redchannel', index=18,
-      number=19, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='grap_uin', full_name='im.msg.msg_body.QQWalletAioBody.grap_uin', index=19,
-      number=20, type=4, cpp_type=4, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.QQWalletAioBody.pb_reserve', index=20,
-      number=21, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=10156,
-  serialized_end=10617,
-)
-
-
-_QQWALLETAIOELEM = _descriptor.Descriptor(
-  name='QQWalletAioElem',
-  full_name='im.msg.msg_body.QQWalletAioElem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='background', full_name='im.msg.msg_body.QQWalletAioElem.background', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='icon', full_name='im.msg.msg_body.QQWalletAioElem.icon', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='title', full_name='im.msg.msg_body.QQWalletAioElem.title', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='subtitle', full_name='im.msg.msg_body.QQWalletAioElem.subtitle', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content', full_name='im.msg.msg_body.QQWalletAioElem.content', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='linkurl', full_name='im.msg.msg_body.QQWalletAioElem.linkurl', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='blackstripe', full_name='im.msg.msg_body.QQWalletAioElem.blackstripe', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='notice', full_name='im.msg.msg_body.QQWalletAioElem.notice', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='title_color', full_name='im.msg.msg_body.QQWalletAioElem.title_color', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='subtitle_color', full_name='im.msg.msg_body.QQWalletAioElem.subtitle_color', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='actions_priority', full_name='im.msg.msg_body.QQWalletAioElem.actions_priority', index=10,
-      number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='jump_url', full_name='im.msg.msg_body.QQWalletAioElem.jump_url', index=11,
-      number=12, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='native_ios', full_name='im.msg.msg_body.QQWalletAioElem.native_ios', index=12,
-      number=13, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='native_android', full_name='im.msg.msg_body.QQWalletAioElem.native_android', index=13,
-      number=14, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='iconurl', full_name='im.msg.msg_body.QQWalletAioElem.iconurl', index=14,
-      number=15, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content_color', full_name='im.msg.msg_body.QQWalletAioElem.content_color', index=15,
-      number=16, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content_bgcolor', full_name='im.msg.msg_body.QQWalletAioElem.content_bgcolor', index=16,
-      number=17, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='aio_image_left', full_name='im.msg.msg_body.QQWalletAioElem.aio_image_left', index=17,
-      number=18, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='aio_image_right', full_name='im.msg.msg_body.QQWalletAioElem.aio_image_right', index=18,
-      number=19, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cft_image', full_name='im.msg.msg_body.QQWalletAioElem.cft_image', index=19,
-      number=20, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.QQWalletAioElem.pb_reserve', index=20,
-      number=21, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=10620,
-  serialized_end=11061,
-)
-
-
-_QQWALLETMSG = _descriptor.Descriptor(
-  name='QQWalletMsg',
-  full_name='im.msg.msg_body.QQWalletMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='aio_body', full_name='im.msg.msg_body.QQWalletMsg.aio_body', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11063,
-  serialized_end=11128,
-)
-
-
-_REDBAGINFO = _descriptor.Descriptor(
-  name='RedBagInfo',
-  full_name='im.msg.msg_body.RedBagInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='redbag_type', full_name='im.msg.msg_body.RedBagInfo.redbag_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11130,
-  serialized_end=11163,
-)
-
-
-_RICHMSG = _descriptor.Descriptor(
-  name='RichMsg',
-  full_name='im.msg.msg_body.RichMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='template_1', full_name='im.msg.msg_body.RichMsg.template_1', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='service_id', full_name='im.msg.msg_body.RichMsg.service_id', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_resid', full_name='im.msg.msg_body.RichMsg.msg_resid', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rand', full_name='im.msg.msg_body.RichMsg.rand', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='seq', full_name='im.msg.msg_body.RichMsg.seq', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flags', full_name='im.msg.msg_body.RichMsg.flags', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11165,
-  serialized_end=11275,
-)
-
-
-_RICHTEXT = _descriptor.Descriptor(
-  name='RichText',
-  full_name='im.msg.msg_body.RichText',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='attr', full_name='im.msg.msg_body.RichText.attr', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='elems', full_name='im.msg.msg_body.RichText.elems', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='not_online_file', full_name='im.msg.msg_body.RichText.not_online_file', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ptt', full_name='im.msg.msg_body.RichText.ptt', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='tmp_ptt', full_name='im.msg.msg_body.RichText.tmp_ptt', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='trans_211_tmp_msg', full_name='im.msg.msg_body.RichText.trans_211_tmp_msg', index=5,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11278,
-  serialized_end=11557,
-)
-
-
-_SECRETFILEMSG = _descriptor.Descriptor(
-  name='SecretFileMsg',
-  full_name='im.msg.msg_body.SecretFileMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='file_key', full_name='im.msg.msg_body.SecretFileMsg.file_key', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_uin', full_name='im.msg.msg_body.SecretFileMsg.from_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='im.msg.msg_body.SecretFileMsg.to_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='im.msg.msg_body.SecretFileMsg.status', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ttl', full_name='im.msg.msg_body.SecretFileMsg.ttl', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='type', full_name='im.msg.msg_body.SecretFileMsg.type', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='encrypt_prehead_length', full_name='im.msg.msg_body.SecretFileMsg.encrypt_prehead_length', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='encrypt_type', full_name='im.msg.msg_body.SecretFileMsg.encrypt_type', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='encrypt_key', full_name='im.msg.msg_body.SecretFileMsg.encrypt_key', index=8,
-      number=9, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='read_times', full_name='im.msg.msg_body.SecretFileMsg.read_times', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='left_time', full_name='im.msg.msg_body.SecretFileMsg.left_time', index=10,
-      number=11, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='not_online_image', full_name='im.msg.msg_body.SecretFileMsg.not_online_image', index=11,
-      number=12, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='elem_flags2', full_name='im.msg.msg_body.SecretFileMsg.elem_flags2', index=12,
-      number=13, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='opertype', full_name='im.msg.msg_body.SecretFileMsg.opertype', index=13,
-      number=14, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='fromphonenum', full_name='im.msg.msg_body.SecretFileMsg.fromphonenum', index=14,
-      number=15, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11560,
-  serialized_end=11933,
-)
-
-
-_SHAKEWINDOW = _descriptor.Descriptor(
-  name='ShakeWindow',
-  full_name='im.msg.msg_body.ShakeWindow',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='type', full_name='im.msg.msg_body.ShakeWindow.type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserve', full_name='im.msg.msg_body.ShakeWindow.reserve', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='uin', full_name='im.msg.msg_body.ShakeWindow.uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11935,
-  serialized_end=11992,
-)
-
-
-_SMALLEMOJI = _descriptor.Descriptor(
-  name='SmallEmoji',
-  full_name='im.msg.msg_body.SmallEmoji',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='pack_id_sum', full_name='im.msg.msg_body.SmallEmoji.pack_id_sum', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='image_type', full_name='im.msg.msg_body.SmallEmoji.image_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11994,
-  serialized_end=12047,
-)
-
-
-_SOURCEMSG = _descriptor.Descriptor(
-  name='SourceMsg',
-  full_name='im.msg.msg_body.SourceMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='orig_seqs', full_name='im.msg.msg_body.SourceMsg.orig_seqs', index=0,
-      number=1, type=13, cpp_type=3, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sender_uin', full_name='im.msg.msg_body.SourceMsg.sender_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='time', full_name='im.msg.msg_body.SourceMsg.time', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='im.msg.msg_body.SourceMsg.flag', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='elems', full_name='im.msg.msg_body.SourceMsg.elems', index=4,
-      number=5, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='type', full_name='im.msg.msg_body.SourceMsg.type', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rich_msg', full_name='im.msg.msg_body.SourceMsg.rich_msg', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.SourceMsg.pb_reserve', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='src_msg', full_name='im.msg.msg_body.SourceMsg.src_msg', index=8,
-      number=9, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='im.msg.msg_body.SourceMsg.to_uin', index=9,
-      number=10, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='troop_name', full_name='im.msg.msg_body.SourceMsg.troop_name', index=10,
-      number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=12050,
-  serialized_end=12271,
-)
-
-
-_PLAINTEXT = _descriptor.Descriptor(
-  name='PlainText',
-  full_name='im.msg.msg_body.PlainText',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='str', full_name='im.msg.msg_body.PlainText.str', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='link', full_name='im.msg.msg_body.PlainText.link', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='attr_6_buf', full_name='im.msg.msg_body.PlainText.attr_6_buf', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='attr_7_buf', full_name='im.msg.msg_body.PlainText.attr_7_buf', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='buf', full_name='im.msg.msg_body.PlainText.buf', index=4,
-      number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.PlainText.pb_reserve', index=5,
-      number=12, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=12273,
-  serialized_end=12384,
-)
-
-
-_TIPSINFO = _descriptor.Descriptor(
-  name='TipsInfo',
-  full_name='im.msg.msg_body.TipsInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='text', full_name='im.msg.msg_body.TipsInfo.text', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=12386,
-  serialized_end=12410,
-)
-
-
-_TMPPTT = _descriptor.Descriptor(
-  name='TmpPtt',
-  full_name='im.msg.msg_body.TmpPtt',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='file_type', full_name='im.msg.msg_body.TmpPtt.file_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_uuid', full_name='im.msg.msg_body.TmpPtt.file_uuid', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_md5', full_name='im.msg.msg_body.TmpPtt.file_md5', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_name', full_name='im.msg.msg_body.TmpPtt.file_name', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_size', full_name='im.msg.msg_body.TmpPtt.file_size', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ptt_times', full_name='im.msg.msg_body.TmpPtt.ptt_times', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='user_type', full_name='im.msg.msg_body.TmpPtt.user_type', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ptttrans_flag', full_name='im.msg.msg_body.TmpPtt.ptttrans_flag', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='busi_type', full_name='im.msg.msg_body.TmpPtt.busi_type', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_id', full_name='im.msg.msg_body.TmpPtt.msg_id', index=9,
-      number=10, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.TmpPtt.pb_reserve', index=10,
-      number=30, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ptt_encode_data', full_name='im.msg.msg_body.TmpPtt.ptt_encode_data', index=11,
-      number=31, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=12413,
-  serialized_end=12656,
-)
-
-
-_TRANS211TMPMSG = _descriptor.Descriptor(
-  name='Trans211TmpMsg',
-  full_name='im.msg.msg_body.Trans211TmpMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='msg_body', full_name='im.msg.msg_body.Trans211TmpMsg.msg_body', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_cmd', full_name='im.msg.msg_body.Trans211TmpMsg.c2c_cmd', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=12658,
-  serialized_end=12709,
-)
-
-
-_TRANSELEM = _descriptor.Descriptor(
-  name='TransElem',
-  full_name='im.msg.msg_body.TransElem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='elem_type', full_name='im.msg.msg_body.TransElem.elem_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='elem_value', full_name='im.msg.msg_body.TransElem.elem_value', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=12711,
-  serialized_end=12761,
-)
-
-
-_VIDEOFILE = _descriptor.Descriptor(
-  name='VideoFile',
-  full_name='im.msg.msg_body.VideoFile',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='file_uuid', full_name='im.msg.msg_body.VideoFile.file_uuid', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_md5', full_name='im.msg.msg_body.VideoFile.file_md5', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_name', full_name='im.msg.msg_body.VideoFile.file_name', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_format', full_name='im.msg.msg_body.VideoFile.file_format', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_time', full_name='im.msg.msg_body.VideoFile.file_time', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_size', full_name='im.msg.msg_body.VideoFile.file_size', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_width', full_name='im.msg.msg_body.VideoFile.thumb_width', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_height', full_name='im.msg.msg_body.VideoFile.thumb_height', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_file_md5', full_name='im.msg.msg_body.VideoFile.thumb_file_md5', index=8,
-      number=9, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='source', full_name='im.msg.msg_body.VideoFile.source', index=9,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_file_size', full_name='im.msg.msg_body.VideoFile.thumb_file_size', index=10,
-      number=11, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='busi_type', full_name='im.msg.msg_body.VideoFile.busi_type', index=11,
-      number=12, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_chat_type', full_name='im.msg.msg_body.VideoFile.from_chat_type', index=12,
-      number=13, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_chat_type', full_name='im.msg.msg_body.VideoFile.to_chat_type', index=13,
-      number=14, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='support_progressive', full_name='im.msg.msg_body.VideoFile.support_progressive', index=14,
-      number=15, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_width', full_name='im.msg.msg_body.VideoFile.file_width', index=15,
-      number=16, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_height', full_name='im.msg.msg_body.VideoFile.file_height', index=16,
-      number=17, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sub_busi_type', full_name='im.msg.msg_body.VideoFile.sub_busi_type', index=17,
-      number=18, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='video_attr', full_name='im.msg.msg_body.VideoFile.video_attr', index=18,
-      number=19, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_file_urls', full_name='im.msg.msg_body.VideoFile.thumb_file_urls', index=19,
-      number=20, type=12, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='video_file_urls', full_name='im.msg.msg_body.VideoFile.video_file_urls', index=20,
-      number=21, type=12, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_download_flag', full_name='im.msg.msg_body.VideoFile.thumb_download_flag', index=21,
-      number=22, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='video_download_flag', full_name='im.msg.msg_body.VideoFile.video_download_flag', index=22,
-      number=23, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='im.msg.msg_body.VideoFile.pb_reserve', index=23,
-      number=24, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=12764,
-  serialized_end=13304,
-)
-
-
-_WORKFLOWNOTIFYMSG = _descriptor.Descriptor(
-  name='WorkflowNotifyMsg',
-  full_name='im.msg.msg_body.WorkflowNotifyMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='ext_msg', full_name='im.msg.msg_body.WorkflowNotifyMsg.ext_msg', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='create_uin', full_name='im.msg.msg_body.WorkflowNotifyMsg.create_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=13306,
-  serialized_end=13362,
-)
-
-
-_LOCATIONINFO = _descriptor.Descriptor(
-  name='LocationInfo',
-  full_name='im.msg.msg_body.LocationInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='longitude', full_name='im.msg.msg_body.LocationInfo.longitude', index=0,
-      number=1, type=1, cpp_type=5, label=1,
-      has_default_value=False, default_value=float(0),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='latitude', full_name='im.msg.msg_body.LocationInfo.latitude', index=1,
-      number=2, type=1, cpp_type=5, label=1,
-      has_default_value=False, default_value=float(0),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='desc', full_name='im.msg.msg_body.LocationInfo.desc', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=13364,
-  serialized_end=13429,
-)
-
-_ELEM.fields_by_name['text'].message_type = _PLAINTEXT
-_ELEM.fields_by_name['face'].message_type = _FACE
-_ELEM.fields_by_name['online_image'].message_type = _ONLINEIMAGE
-_ELEM.fields_by_name['not_online_image'].message_type = _NOTONLINEIMAGE
-_ELEM.fields_by_name['trans_elem_info'].message_type = _TRANSELEM
-_ELEM.fields_by_name['market_face'].message_type = _MARKETFACE
-_ELEM.fields_by_name['elem_flags'].message_type = _ELEMFLAGS
-_ELEM.fields_by_name['custom_face'].message_type = _CUSTOMFACE
-_ELEM.fields_by_name['elem_flags2'].message_type = _ELEMFLAGS2
-_ELEM.fields_by_name['fun_face'].message_type = _FUNFACE
-_ELEM.fields_by_name['secret_file'].message_type = _SECRETFILEMSG
-_ELEM.fields_by_name['rich_msg'].message_type = _RICHMSG
-_ELEM.fields_by_name['group_file'].message_type = _GROUPFILE
-_ELEM.fields_by_name['pub_group'].message_type = _PUBGROUP
-_ELEM.fields_by_name['market_trans'].message_type = _MARKETTRANS
-_ELEM.fields_by_name['extra_info'].message_type = _EXTRAINFO
-_ELEM.fields_by_name['shake_window'].message_type = _SHAKEWINDOW
-_ELEM.fields_by_name['pub_account'].message_type = _PUBACCOUNT
-_ELEM.fields_by_name['video_file'].message_type = _VIDEOFILE
-_ELEM.fields_by_name['tips_info'].message_type = _TIPSINFO
-_ELEM.fields_by_name['anon_group_msg'].message_type = _ANONYMOUSGROUPMSG
-_ELEM.fields_by_name['qq_live_old'].message_type = _QQLIVEOLD
-_ELEM.fields_by_name['life_online'].message_type = _LIFEONLINEACCOUNT
-_ELEM.fields_by_name['qqwallet_msg'].message_type = _QQWALLETMSG
-_ELEM.fields_by_name['crm_elem'].message_type = _CRMELEM
-_ELEM.fields_by_name['conference_tips_info'].message_type = _CONFERENCETIPSINFO
-_ELEM.fields_by_name['redbag_info'].message_type = _REDBAGINFO
-_ELEM.fields_by_name['low_version_tips'].message_type = _LOWVERSIONTIPS
-_ELEM.fields_by_name['near_by_msg'].message_type = _NEARBYMESSAGETYPE
-_ELEM.fields_by_name['custom_elem'].message_type = _CUSTOMELEM
-_ELEM.fields_by_name['location_info'].message_type = _LOCATIONINFO
-_ELEM.fields_by_name['pub_acc_info'].message_type = _PUBACCINFO
-_ELEM.fields_by_name['small_emoji'].message_type = _SMALLEMOJI
-_ELEM.fields_by_name['fsj_msg_elem'].message_type = _FSJMESSAGEELEM
-_ELEM.fields_by_name['ark_app'].message_type = _ARKAPPELEM
-_ELEM.fields_by_name['general_flags'].message_type = _GENERALFLAGS
-_ELEM.fields_by_name['hc_flash_pic'].message_type = _CUSTOMFACE
-_ELEM.fields_by_name['deliver_gift_msg'].message_type = _DELIVERGIFTMSG
-_ELEM.fields_by_name['bitapp_msg'].message_type = _BITAPPMSG
-_ELEM.fields_by_name['open_qq_data'].message_type = _OPENQQDATA
-_ELEM.fields_by_name['apollo_msg'].message_type = _APOLLOACTMSG
-_ELEM.fields_by_name['group_pub_acc_info'].message_type = _GROUPPUBACCOUNTINFO
-_ELEM.fields_by_name['bless_msg'].message_type = _BLESSINGMESSAGE
-_ELEM.fields_by_name['src_msg'].message_type = _SOURCEMSG
-_ELEM.fields_by_name['lola_msg'].message_type = _LOLAMSG
-_ELEM.fields_by_name['group_business_msg'].message_type = _GROUPBUSINESSMSG
-_ELEM.fields_by_name['workflow_notify'].message_type = _WORKFLOWNOTIFYMSG
-_ELEM.fields_by_name['pat_elem'].message_type = _PATSELEM
-_ELEM.fields_by_name['group_post_elem'].message_type = _GROUPPOSTELEM
-_ELEM.fields_by_name['light_app'].message_type = _LIGHTAPPELEM
-_ELEM.fields_by_name['eim_info'].message_type = _EIMINFO
-_ELEM.fields_by_name['common_elem'].message_type = _COMMONELEM
-_ELEMFLAGS2.fields_by_name['insts'].message_type = _INST
-_ELEMFLAGS2.fields_by_name['src_inst'].message_type = _INST
-_ELEMFLAGS2.fields_by_name['pc_support_def'].message_type = _PCSUPPORTDEF
-_FUNFACE.fields_by_name['turntable'].message_type = _TURNTABLE
-_FUNFACE.fields_by_name['bomb'].message_type = _BOMB
-_MSGBODY.fields_by_name['rich_text'].message_type = _RICHTEXT
-_MSGBODY_SUBTYPE4.fields_by_name['not_online_file'].message_type = _NOTONLINEFILE
-_QQWALLETAIOBODY.fields_by_name['sender'].message_type = _QQWALLETAIOELEM
-_QQWALLETAIOBODY.fields_by_name['receiver'].message_type = _QQWALLETAIOELEM
-_QQWALLETMSG.fields_by_name['aio_body'].message_type = _QQWALLETAIOBODY
-_RICHTEXT.fields_by_name['attr'].message_type = _ATTR
-_RICHTEXT.fields_by_name['elems'].message_type = _ELEM
-_RICHTEXT.fields_by_name['not_online_file'].message_type = _NOTONLINEFILE
-_RICHTEXT.fields_by_name['ptt'].message_type = _PTT
-_RICHTEXT.fields_by_name['tmp_ptt'].message_type = _TMPPTT
-_RICHTEXT.fields_by_name['trans_211_tmp_msg'].message_type = _TRANS211TMPMSG
-_SECRETFILEMSG.fields_by_name['not_online_image'].message_type = _NOTONLINEIMAGE
-_SECRETFILEMSG.fields_by_name['elem_flags2'].message_type = _ELEMFLAGS2
-_SOURCEMSG.fields_by_name['elems'].message_type = _ELEM
-DESCRIPTOR.message_types_by_name['AnonymousGroupMsg'] = _ANONYMOUSGROUPMSG
-DESCRIPTOR.message_types_by_name['ApolloActMsg'] = _APOLLOACTMSG
-DESCRIPTOR.message_types_by_name['ArkAppElem'] = _ARKAPPELEM
-DESCRIPTOR.message_types_by_name['Attr'] = _ATTR
-DESCRIPTOR.message_types_by_name['BitAppMsg'] = _BITAPPMSG
-DESCRIPTOR.message_types_by_name['BlessingMessage'] = _BLESSINGMESSAGE
-DESCRIPTOR.message_types_by_name['CommonElem'] = _COMMONELEM
-DESCRIPTOR.message_types_by_name['ConferenceTipsInfo'] = _CONFERENCETIPSINFO
-DESCRIPTOR.message_types_by_name['CrmElem'] = _CRMELEM
-DESCRIPTOR.message_types_by_name['CustomElem'] = _CUSTOMELEM
-DESCRIPTOR.message_types_by_name['CustomFace'] = _CUSTOMFACE
-DESCRIPTOR.message_types_by_name['DeliverGiftMsg'] = _DELIVERGIFTMSG
-DESCRIPTOR.message_types_by_name['EIMInfo'] = _EIMINFO
-DESCRIPTOR.message_types_by_name['Elem'] = _ELEM
-DESCRIPTOR.message_types_by_name['ElemFlags'] = _ELEMFLAGS
-DESCRIPTOR.message_types_by_name['ElemFlags2'] = _ELEMFLAGS2
-DESCRIPTOR.message_types_by_name['Inst'] = _INST
-DESCRIPTOR.message_types_by_name['ExtraInfo'] = _EXTRAINFO
-DESCRIPTOR.message_types_by_name['FSJMessageElem'] = _FSJMESSAGEELEM
-DESCRIPTOR.message_types_by_name['Face'] = _FACE
-DESCRIPTOR.message_types_by_name['FunFace'] = _FUNFACE
-DESCRIPTOR.message_types_by_name['Bomb'] = _BOMB
-DESCRIPTOR.message_types_by_name['Turntable'] = _TURNTABLE
-DESCRIPTOR.message_types_by_name['GeneralFlags'] = _GENERALFLAGS
-DESCRIPTOR.message_types_by_name['GroupBusinessMsg'] = _GROUPBUSINESSMSG
-DESCRIPTOR.message_types_by_name['GroupFile'] = _GROUPFILE
-DESCRIPTOR.message_types_by_name['GroupPostElem'] = _GROUPPOSTELEM
-DESCRIPTOR.message_types_by_name['GroupPubAccountInfo'] = _GROUPPUBACCOUNTINFO
-DESCRIPTOR.message_types_by_name['LifeOnlineAccount'] = _LIFEONLINEACCOUNT
-DESCRIPTOR.message_types_by_name['LightAppElem'] = _LIGHTAPPELEM
-DESCRIPTOR.message_types_by_name['LolaMsg'] = _LOLAMSG
-DESCRIPTOR.message_types_by_name['LowVersionTips'] = _LOWVERSIONTIPS
-DESCRIPTOR.message_types_by_name['MarketFace'] = _MARKETFACE
-DESCRIPTOR.message_types_by_name['MarketTrans'] = _MARKETTRANS
-DESCRIPTOR.message_types_by_name['MsgBody'] = _MSGBODY
-DESCRIPTOR.message_types_by_name['MsgBody_subtype4'] = _MSGBODY_SUBTYPE4
-DESCRIPTOR.message_types_by_name['NearByMessageType'] = _NEARBYMESSAGETYPE
-DESCRIPTOR.message_types_by_name['NotOnlineFile'] = _NOTONLINEFILE
-DESCRIPTOR.message_types_by_name['NotOnlineImage'] = _NOTONLINEIMAGE
-DESCRIPTOR.message_types_by_name['OnlineImage'] = _ONLINEIMAGE
-DESCRIPTOR.message_types_by_name['OpenQQData'] = _OPENQQDATA
-DESCRIPTOR.message_types_by_name['PatsElem'] = _PATSELEM
-DESCRIPTOR.message_types_by_name['PcSupportDef'] = _PCSUPPORTDEF
-DESCRIPTOR.message_types_by_name['Ptt'] = _PTT
-DESCRIPTOR.message_types_by_name['PubAccInfo'] = _PUBACCINFO
-DESCRIPTOR.message_types_by_name['PubAccount'] = _PUBACCOUNT
-DESCRIPTOR.message_types_by_name['PubGroup'] = _PUBGROUP
-DESCRIPTOR.message_types_by_name['QQLiveOld'] = _QQLIVEOLD
-DESCRIPTOR.message_types_by_name['QQWalletAioBody'] = _QQWALLETAIOBODY
-DESCRIPTOR.message_types_by_name['QQWalletAioElem'] = _QQWALLETAIOELEM
-DESCRIPTOR.message_types_by_name['QQWalletMsg'] = _QQWALLETMSG
-DESCRIPTOR.message_types_by_name['RedBagInfo'] = _REDBAGINFO
-DESCRIPTOR.message_types_by_name['RichMsg'] = _RICHMSG
-DESCRIPTOR.message_types_by_name['RichText'] = _RICHTEXT
-DESCRIPTOR.message_types_by_name['SecretFileMsg'] = _SECRETFILEMSG
-DESCRIPTOR.message_types_by_name['ShakeWindow'] = _SHAKEWINDOW
-DESCRIPTOR.message_types_by_name['SmallEmoji'] = _SMALLEMOJI
-DESCRIPTOR.message_types_by_name['SourceMsg'] = _SOURCEMSG
-DESCRIPTOR.message_types_by_name['PlainText'] = _PLAINTEXT
-DESCRIPTOR.message_types_by_name['TipsInfo'] = _TIPSINFO
-DESCRIPTOR.message_types_by_name['TmpPtt'] = _TMPPTT
-DESCRIPTOR.message_types_by_name['Trans211TmpMsg'] = _TRANS211TMPMSG
-DESCRIPTOR.message_types_by_name['TransElem'] = _TRANSELEM
-DESCRIPTOR.message_types_by_name['VideoFile'] = _VIDEOFILE
-DESCRIPTOR.message_types_by_name['WorkflowNotifyMsg'] = _WORKFLOWNOTIFYMSG
-DESCRIPTOR.message_types_by_name['LocationInfo'] = _LOCATIONINFO
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%cai/pb/im/msg/msg_body/msg_body.proto\x12\x0fim.msg.msg_body\"\x99\x01\n\x11\x41nonymousGroupMsg\x12\r\n\x05\x66lags\x18\x01 \x01(\r\x12\x0f\n\x07\x61non_id\x18\x02 \x01(\x0c\x12\x11\n\tanon_nick\x18\x03 \x01(\x0c\x12\x15\n\rhead_portrait\x18\x04 \x01(\r\x12\x13\n\x0b\x65xpire_time\x18\x05 \x01(\r\x12\x11\n\tbubble_id\x18\x06 \x01(\r\x12\x12\n\nrank_color\x18\x07 \x01(\x0c\"\x90\x02\n\x0c\x41polloActMsg\x12\x11\n\taction_id\x18\x01 \x01(\r\x12\x13\n\x0b\x61\x63tion_name\x18\x02 \x01(\x0c\x12\x13\n\x0b\x61\x63tion_text\x18\x03 \x01(\x0c\x12\x0c\n\x04\x66lag\x18\x04 \x01(\r\x12\x10\n\x08peer_uin\x18\x05 \x01(\r\x12\x11\n\tsender_ts\x18\x06 \x01(\r\x12\x0f\n\x07peer_ts\x18\x07 \x01(\r\x12\x15\n\rsender_status\x18\x08 \x01(\x05\x12\x13\n\x0bpeer_status\x18\t \x01(\x05\x12\x12\n\ndiytext_id\x18\n \x01(\r\x12\x17\n\x0f\x64iytext_content\x18\x0b \x01(\x0c\x12\x12\n\ninput_text\x18\x0c \x01(\x0c\x12\x12\n\npb_reserve\x18\r \x01(\x0c\"W\n\nArkAppElem\x12\x10\n\x08\x61pp_name\x18\x01 \x01(\t\x12\x13\n\x0bmin_version\x18\x02 \x01(\t\x12\x14\n\x0cxml_template\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\"\xb9\x01\n\x04\x41ttr\x12\x11\n\tcode_page\x18\x01 \x01(\x11\x12\x0c\n\x04time\x18\x02 \x01(\r\x12\x0e\n\x06random\x18\x03 \x01(\r\x12\r\n\x05\x63olor\x18\x04 \x01(\r\x12\x0c\n\x04size\x18\x05 \x01(\r\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\x06 \x01(\r\x12\x10\n\x08\x63har_set\x18\x07 \x01(\r\x12\x18\n\x10pitch_and_family\x18\x08 \x01(\r\x12\x11\n\tfont_name\x18\t \x01(\t\x12\x14\n\x0creserve_data\x18\n \x01(\x0c\"\x18\n\tBitAppMsg\x12\x0b\n\x03\x62uf\x18\x01 \x01(\x0c\"4\n\x0f\x42lessingMessage\x12\x10\n\x08msg_type\x18\x01 \x01(\r\x12\x0f\n\x07\x65x_flag\x18\x02 \x01(\r\"J\n\nCommonElem\x12\x14\n\x0cservice_type\x18\x01 \x01(\r\x12\x0f\n\x07pb_elem\x18\x02 \x01(\x0c\x12\x15\n\rbusiness_type\x18\x03 \x01(\r\"M\n\x12\x43onferenceTipsInfo\x12\x14\n\x0csession_type\x18\x01 \x01(\r\x12\x13\n\x0bsession_uin\x18\x02 \x01(\x04\x12\x0c\n\x04text\x18\x03 \x01(\t\"i\n\x07\x43rmElem\x12\x0f\n\x07\x63rm_buf\x18\x01 \x01(\x0c\x12\x11\n\tmsg_resid\x18\x02 \x01(\x0c\x12\x13\n\x0bqidian_flag\x18\x03 \x01(\r\x12\x11\n\tpush_flag\x18\x04 \x01(\r\x12\x12\n\ncount_flag\x18\x05 \x01(\r\"W\n\nCustomElem\x12\x0c\n\x04\x64\x65sc\x18\x01 \x01(\x0c\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\x11\n\tenum_type\x18\x03 \x01(\r\x12\x0b\n\x03\x65xt\x18\x04 \x01(\x0c\x12\r\n\x05sound\x18\x05 \x01(\x0c\"\xf1\x04\n\nCustomFace\x12\x0c\n\x04guid\x18\x01 \x01(\x0c\x12\x11\n\tfile_path\x18\x02 \x01(\t\x12\x10\n\x08shortcut\x18\x03 \x01(\t\x12\x0e\n\x06\x62uffer\x18\x04 \x01(\x0c\x12\x0c\n\x04\x66lag\x18\x05 \x01(\x0c\x12\x10\n\x08old_data\x18\x06 \x01(\x0c\x12\x0f\n\x07\x66ile_id\x18\x07 \x01(\r\x12\x11\n\tserver_ip\x18\x08 \x01(\r\x12\x13\n\x0bserver_port\x18\t \x01(\r\x12\x11\n\tfile_type\x18\n \x01(\r\x12\x11\n\tsignature\x18\x0b \x01(\x0c\x12\x0e\n\x06useful\x18\x0c \x01(\r\x12\x0b\n\x03md5\x18\r \x01(\x0c\x12\x11\n\tthumb_url\x18\x0e \x01(\t\x12\x0f\n\x07\x62ig_url\x18\x0f \x01(\t\x12\x10\n\x08orig_url\x18\x10 \x01(\t\x12\x10\n\x08\x62iz_type\x18\x11 \x01(\r\x12\x14\n\x0crepeat_index\x18\x12 \x01(\r\x12\x14\n\x0crepeat_image\x18\x13 \x01(\r\x12\x12\n\nimage_type\x18\x14 \x01(\r\x12\r\n\x05index\x18\x15 \x01(\r\x12\r\n\x05width\x18\x16 \x01(\r\x12\x0e\n\x06height\x18\x17 \x01(\r\x12\x0e\n\x06source\x18\x18 \x01(\r\x12\x0c\n\x04size\x18\x19 \x01(\r\x12\x0e\n\x06origin\x18\x1a \x01(\r\x12\x13\n\x0bthumb_width\x18\x1b \x01(\r\x12\x14\n\x0cthumb_height\x18\x1c \x01(\r\x12\x10\n\x08show_len\x18\x1d \x01(\r\x12\x14\n\x0c\x64ownload_len\x18\x1e \x01(\r\x12\x10\n\x08_400_url\x18\x1f \x01(\t\x12\x12\n\n_400_width\x18  \x01(\r\x12\x13\n\x0b_400_height\x18! \x01(\r\x12\x12\n\npb_reserve\x18\" \x01(\x0c\"\xb6\x04\n\x0e\x44\x65liverGiftMsg\x12\x18\n\x10gray_tip_content\x18\x01 \x01(\x0c\x12\x1c\n\x14\x61nimation_package_id\x18\x02 \x01(\r\x12\x1f\n\x17\x61nimation_package_url_a\x18\x03 \x01(\x0c\x12\x1f\n\x17\x61nimation_package_url_i\x18\x04 \x01(\x0c\x12\x14\n\x0cremind_brief\x18\x05 \x01(\x0c\x12\x0f\n\x07gift_id\x18\x06 \x01(\r\x12\x12\n\ngift_count\x18\x07 \x01(\r\x12\x17\n\x0f\x61nimation_brief\x18\x08 \x01(\x0c\x12\x12\n\nsender_uin\x18\t \x01(\x04\x12\x14\n\x0creceiver_uin\x18\n \x01(\x04\x12\x17\n\x0fstmessage_title\x18\x0b \x01(\x0c\x12\x1a\n\x12stmessage_subtitle\x18\x0c \x01(\x0c\x12\x19\n\x11stmessage_message\x18\r \x01(\x0c\x12\x1b\n\x13stmessage_giftpicid\x18\x0e \x01(\r\x12\x1a\n\x12stmessage_comefrom\x18\x0f \x01(\x0c\x12\x18\n\x10stmessage_exflag\x18\x10 \x01(\r\x12\x16\n\x0eto_all_gift_id\x18\x11 \x01(\x0c\x12\x15\n\rcomefrom_link\x18\x12 \x01(\x0c\x12\x12\n\npb_reserve\x18\x13 \x01(\x0c\x12\x15\n\rreceiver_name\x18\x14 \x01(\x0c\x12\x14\n\x0creceiver_pic\x18\x15 \x01(\x0c\x12\x19\n\x11stmessage_gifturl\x18\x16 \x01(\x0c\"(\n\x07\x45IMInfo\x12\x0f\n\x07root_id\x18\x01 \x01(\x04\x12\x0c\n\x04\x66lag\x18\x02 \x01(\r\"\x8b\x15\n\x04\x45lem\x12(\n\x04text\x18\x01 \x01(\x0b\x32\x1a.im.msg.msg_body.PlainText\x12#\n\x04\x66\x61\x63\x65\x18\x02 \x01(\x0b\x32\x15.im.msg.msg_body.Face\x12\x32\n\x0conline_image\x18\x03 \x01(\x0b\x32\x1c.im.msg.msg_body.OnlineImage\x12\x39\n\x10not_online_image\x18\x04 \x01(\x0b\x32\x1f.im.msg.msg_body.NotOnlineImage\x12\x33\n\x0ftrans_elem_info\x18\x05 \x01(\x0b\x32\x1a.im.msg.msg_body.TransElem\x12\x30\n\x0bmarket_face\x18\x06 \x01(\x0b\x32\x1b.im.msg.msg_body.MarketFace\x12.\n\nelem_flags\x18\x07 \x01(\x0b\x32\x1a.im.msg.msg_body.ElemFlags\x12\x30\n\x0b\x63ustom_face\x18\x08 \x01(\x0b\x32\x1b.im.msg.msg_body.CustomFace\x12\x30\n\x0b\x65lem_flags2\x18\t \x01(\x0b\x32\x1b.im.msg.msg_body.ElemFlags2\x12*\n\x08\x66un_face\x18\n \x01(\x0b\x32\x18.im.msg.msg_body.FunFace\x12\x33\n\x0bsecret_file\x18\x0b \x01(\x0b\x32\x1e.im.msg.msg_body.SecretFileMsg\x12*\n\x08rich_msg\x18\x0c \x01(\x0b\x32\x18.im.msg.msg_body.RichMsg\x12.\n\ngroup_file\x18\r \x01(\x0b\x32\x1a.im.msg.msg_body.GroupFile\x12,\n\tpub_group\x18\x0e \x01(\x0b\x32\x19.im.msg.msg_body.PubGroup\x12\x32\n\x0cmarket_trans\x18\x0f \x01(\x0b\x32\x1c.im.msg.msg_body.MarketTrans\x12.\n\nextra_info\x18\x10 \x01(\x0b\x32\x1a.im.msg.msg_body.ExtraInfo\x12\x32\n\x0cshake_window\x18\x11 \x01(\x0b\x32\x1c.im.msg.msg_body.ShakeWindow\x12\x30\n\x0bpub_account\x18\x12 \x01(\x0b\x32\x1b.im.msg.msg_body.PubAccount\x12.\n\nvideo_file\x18\x13 \x01(\x0b\x32\x1a.im.msg.msg_body.VideoFile\x12,\n\ttips_info\x18\x14 \x01(\x0b\x32\x19.im.msg.msg_body.TipsInfo\x12:\n\x0e\x61non_group_msg\x18\x15 \x01(\x0b\x32\".im.msg.msg_body.AnonymousGroupMsg\x12/\n\x0bqq_live_old\x18\x16 \x01(\x0b\x32\x1a.im.msg.msg_body.QQLiveOld\x12\x37\n\x0blife_online\x18\x17 \x01(\x0b\x32\".im.msg.msg_body.LifeOnlineAccount\x12\x32\n\x0cqqwallet_msg\x18\x18 \x01(\x0b\x32\x1c.im.msg.msg_body.QQWalletMsg\x12*\n\x08\x63rm_elem\x18\x19 \x01(\x0b\x32\x18.im.msg.msg_body.CrmElem\x12\x41\n\x14\x63onference_tips_info\x18\x1a \x01(\x0b\x32#.im.msg.msg_body.ConferenceTipsInfo\x12\x30\n\x0bredbag_info\x18\x1b \x01(\x0b\x32\x1b.im.msg.msg_body.RedBagInfo\x12\x39\n\x10low_version_tips\x18\x1c \x01(\x0b\x32\x1f.im.msg.msg_body.LowVersionTips\x12\x1a\n\x12\x62\x61nkcode_ctrl_info\x18\x1d \x01(\x0c\x12\x37\n\x0bnear_by_msg\x18\x1e \x01(\x0b\x32\".im.msg.msg_body.NearByMessageType\x12\x30\n\x0b\x63ustom_elem\x18\x1f \x01(\x0b\x32\x1b.im.msg.msg_body.CustomElem\x12\x34\n\rlocation_info\x18  \x01(\x0b\x32\x1d.im.msg.msg_body.LocationInfo\x12\x31\n\x0cpub_acc_info\x18! \x01(\x0b\x32\x1b.im.msg.msg_body.PubAccInfo\x12\x30\n\x0bsmall_emoji\x18\" \x01(\x0b\x32\x1b.im.msg.msg_body.SmallEmoji\x12\x35\n\x0c\x66sj_msg_elem\x18# \x01(\x0b\x32\x1f.im.msg.msg_body.FSJMessageElem\x12,\n\x07\x61rk_app\x18$ \x01(\x0b\x32\x1b.im.msg.msg_body.ArkAppElem\x12\x34\n\rgeneral_flags\x18% \x01(\x0b\x32\x1d.im.msg.msg_body.GeneralFlags\x12\x31\n\x0chc_flash_pic\x18& \x01(\x0b\x32\x1b.im.msg.msg_body.CustomFace\x12\x39\n\x10\x64\x65liver_gift_msg\x18\' \x01(\x0b\x32\x1f.im.msg.msg_body.DeliverGiftMsg\x12.\n\nbitapp_msg\x18( \x01(\x0b\x32\x1a.im.msg.msg_body.BitAppMsg\x12\x31\n\x0copen_qq_data\x18) \x01(\x0b\x32\x1b.im.msg.msg_body.OpenQQData\x12\x31\n\napollo_msg\x18* \x01(\x0b\x32\x1d.im.msg.msg_body.ApolloActMsg\x12@\n\x12group_pub_acc_info\x18+ \x01(\x0b\x32$.im.msg.msg_body.GroupPubAccountInfo\x12\x33\n\tbless_msg\x18, \x01(\x0b\x32 .im.msg.msg_body.BlessingMessage\x12+\n\x07src_msg\x18- \x01(\x0b\x32\x1a.im.msg.msg_body.SourceMsg\x12*\n\x08lola_msg\x18. \x01(\x0b\x32\x18.im.msg.msg_body.LolaMsg\x12=\n\x12group_business_msg\x18/ \x01(\x0b\x32!.im.msg.msg_body.GroupBusinessMsg\x12;\n\x0fworkflow_notify\x18\x30 \x01(\x0b\x32\".im.msg.msg_body.WorkflowNotifyMsg\x12+\n\x08pat_elem\x18\x31 \x01(\x0b\x32\x19.im.msg.msg_body.PatsElem\x12\x37\n\x0fgroup_post_elem\x18\x32 \x01(\x0b\x32\x1e.im.msg.msg_body.GroupPostElem\x12\x30\n\tlight_app\x18\x33 \x01(\x0b\x32\x1d.im.msg.msg_body.LightAppElem\x12*\n\x08\x65im_info\x18\x34 \x01(\x0b\x32\x18.im.msg.msg_body.EIMInfo\x12\x30\n\x0b\x63ommon_elem\x18\x35 \x01(\x0b\x32\x1b.im.msg.msg_body.CommonElem\"2\n\tElemFlags\x12\x0e\n\x06\x66lags1\x18\x01 \x01(\x0c\x12\x15\n\rbusiness_data\x18\x02 \x01(\x0c\"\xfb\x02\n\nElemFlags2\x12\x15\n\rcolor_text_id\x18\x01 \x01(\r\x12\x0e\n\x06msg_id\x18\x02 \x01(\x04\x12\x1a\n\x12whisper_session_id\x18\x03 \x01(\r\x12\x16\n\x0eptt_change_bit\x18\x04 \x01(\r\x12\x12\n\nvip_status\x18\x05 \x01(\r\x12\x15\n\rcompatible_id\x18\x06 \x01(\r\x12$\n\x05insts\x18\x07 \x03(\x0b\x32\x15.im.msg.msg_body.Inst\x12\x13\n\x0bmsg_rpt_cnt\x18\x08 \x01(\r\x12\'\n\x08src_inst\x18\t \x01(\x0b\x32\x15.im.msg.msg_body.Inst\x12\x12\n\nlongtitude\x18\n \x01(\r\x12\x10\n\x08latitude\x18\x0b \x01(\r\x12\x13\n\x0b\x63ustom_font\x18\x0c \x01(\r\x12\x35\n\x0epc_support_def\x18\r \x01(\x0b\x32\x1d.im.msg.msg_body.PcSupportDef\x12\x11\n\tcrm_flags\x18\x0e \x01(\r\"\'\n\x04Inst\x12\x0e\n\x06\x61pp_id\x18\x01 \x01(\r\x12\x0f\n\x07inst_id\x18\x02 \x01(\r\"\xf3\x01\n\tExtraInfo\x12\x0c\n\x04nick\x18\x01 \x01(\x0c\x12\x12\n\ngroup_card\x18\x02 \x01(\x0c\x12\r\n\x05level\x18\x03 \x01(\r\x12\r\n\x05\x66lags\x18\x04 \x01(\r\x12\x12\n\ngroup_mask\x18\x05 \x01(\r\x12\x13\n\x0bmsg_tail_id\x18\x06 \x01(\r\x12\x14\n\x0csender_title\x18\x07 \x01(\x0c\x12\x11\n\tapns_tips\x18\x08 \x01(\x0c\x12\x0b\n\x03uin\x18\t \x01(\x04\x12\x16\n\x0emsg_state_flag\x18\n \x01(\r\x12\x17\n\x0f\x61pns_sound_type\x18\x0b \x01(\r\x12\x16\n\x0enew_group_flag\x18\x0c \x01(\r\"\"\n\x0e\x46SJMessageElem\x12\x10\n\x08msg_type\x18\x01 \x01(\r\"/\n\x04\x46\x61\x63\x65\x12\r\n\x05index\x18\x01 \x01(\r\x12\x0b\n\x03old\x18\x02 \x01(\x0c\x12\x0b\n\x03\x62uf\x18\x0b \x01(\x0c\"]\n\x07\x46unFace\x12-\n\tturntable\x18\x01 \x01(\x0b\x32\x1a.im.msg.msg_body.Turntable\x12#\n\x04\x62omb\x18\x02 \x01(\x0b\x32\x15.im.msg.msg_body.Bomb\"\x15\n\x04\x42omb\x12\r\n\x05\x62urst\x18\x01 \x01(\x08\"D\n\tTurntable\x12\x10\n\x08uin_list\x18\x01 \x03(\x04\x12\x0f\n\x07hit_uin\x18\x02 \x01(\x04\x12\x14\n\x0chit_uin_nick\x18\x03 \x01(\t\"\xb2\x03\n\x0cGeneralFlags\x12\x1a\n\x12\x62ubble_diy_text_id\x18\x01 \x01(\r\x12\x16\n\x0egroup_flag_new\x18\x02 \x01(\r\x12\x0b\n\x03uin\x18\x03 \x01(\x04\x12\r\n\x05rp_id\x18\x04 \x01(\x0c\x12\x10\n\x08prp_fold\x18\x05 \x01(\r\x12\x16\n\x0elong_text_flag\x18\x06 \x01(\r\x12\x17\n\x0flong_text_resid\x18\x07 \x01(\x0c\x12\x12\n\ngroup_type\x18\x08 \x01(\r\x12\x13\n\x0bto_uin_flag\x18\t \x01(\r\x12\x15\n\rglamour_level\x18\n \x01(\r\x12\x14\n\x0cmember_level\x18\x0b \x01(\r\x12\x16\n\x0egroup_rank_seq\x18\x0c \x01(\x04\x12\x15\n\rolympic_torch\x18\r \x01(\r\x12\x1e\n\x16\x62\x61\x62yq_guide_msg_cookie\x18\x0e \x01(\x0c\x12\x19\n\x11uin32_expert_flag\x18\x0f \x01(\r\x12\x15\n\rbubble_sub_id\x18\x10 \x01(\r\x12\x12\n\npendant_id\x18\x11 \x01(\x04\x12\x10\n\x08rp_index\x18\x12 \x01(\x0c\x12\x12\n\npb_reserve\x18\x13 \x01(\x0c\"\xa3\x01\n\x10GroupBusinessMsg\x12\r\n\x05\x66lags\x18\x01 \x01(\r\x12\x10\n\x08head_url\x18\x02 \x01(\x0c\x12\x14\n\x0chead_clk_url\x18\x03 \x01(\x0c\x12\x0c\n\x04nick\x18\x04 \x01(\x0c\x12\x12\n\nnick_color\x18\x05 \x01(\x0c\x12\x0c\n\x04rank\x18\x06 \x01(\x0c\x12\x12\n\nrank_color\x18\x07 \x01(\x0c\x12\x14\n\x0crank_bgcolor\x18\x08 \x01(\x0c\"\xc7\x01\n\tGroupFile\x12\x10\n\x08\x66ilename\x18\x01 \x01(\x0c\x12\x11\n\tfile_size\x18\x02 \x01(\x04\x12\x0f\n\x07\x66ile_id\x18\x03 \x01(\x0c\x12\x10\n\x08\x62\x61tch_id\x18\x04 \x01(\x0c\x12\x10\n\x08\x66ile_key\x18\x05 \x01(\x0c\x12\x0c\n\x04mark\x18\x06 \x01(\x0c\x12\x10\n\x08sequence\x18\x07 \x01(\x04\x12\x15\n\rbatch_item_id\x18\x08 \x01(\x0c\x12\x15\n\rfeed_msg_time\x18\t \x01(\r\x12\x12\n\npb_reserve\x18\n \x01(\x0c\"6\n\rGroupPostElem\x12\x12\n\ntrans_type\x18\x01 \x01(\r\x12\x11\n\ttrans_msg\x18\x02 \x01(\x0c\"*\n\x13GroupPubAccountInfo\x12\x13\n\x0bpub_account\x18\x01 \x01(\x04\"\xaf\x01\n\x11LifeOnlineAccount\x12\x11\n\tunique_id\x18\x01 \x01(\x04\x12\n\n\x02op\x18\x02 \x01(\r\x12\x11\n\tshow_time\x18\x03 \x01(\r\x12\x0e\n\x06report\x18\x04 \x01(\r\x12\x0b\n\x03\x61\x63k\x18\x05 \x01(\r\x12\x0e\n\x06\x62itmap\x18\x06 \x01(\x04\x12\x14\n\x0cgdt_imp_data\x18\x07 \x01(\x0c\x12\x14\n\x0cgdt_cli_data\x18\x08 \x01(\x0c\x12\x0f\n\x07view_id\x18\t \x01(\x0c\"/\n\x0cLightAppElem\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\x11\n\tmsg_resid\x18\x02 \x01(\x0c\"`\n\x07LolaMsg\x12\x11\n\tmsg_resid\x18\x01 \x01(\x0c\x12\x16\n\x0e\x65ncode_content\x18\x02 \x01(\x0c\x12\x14\n\x0clong_msg_url\x18\x03 \x01(\x0c\x12\x14\n\x0c\x64ownload_key\x18\x04 \x01(\x0c\"r\n\x0eLowVersionTips\x12\x13\n\x0b\x62usiness_id\x18\x01 \x01(\r\x12\x14\n\x0csession_type\x18\x02 \x01(\r\x12\x13\n\x0bsession_uin\x18\x03 \x01(\x04\x12\x12\n\nsender_uin\x18\x04 \x01(\x04\x12\x0c\n\x04text\x18\x05 \x01(\t\"\xfc\x01\n\nMarketFace\x12\x11\n\tface_name\x18\x01 \x01(\x0c\x12\x11\n\titem_type\x18\x02 \x01(\r\x12\x11\n\tface_info\x18\x03 \x01(\r\x12\x0f\n\x07\x66\x61\x63\x65_id\x18\x04 \x01(\x0c\x12\x0e\n\x06tab_id\x18\x05 \x01(\r\x12\x10\n\x08sub_type\x18\x06 \x01(\r\x12\x0b\n\x03key\x18\x07 \x01(\x0c\x12\r\n\x05param\x18\x08 \x01(\x0c\x12\x12\n\nmedia_type\x18\t \x01(\r\x12\x13\n\x0bimage_width\x18\n \x01(\r\x12\x14\n\x0cimage_height\x18\x0b \x01(\r\x12\x13\n\x0bmobileparam\x18\x0c \x01(\x0c\x12\x12\n\npb_reserve\x18\r \x01(\x0c\"a\n\x0bMarketTrans\x12\x0c\n\x04\x66lag\x18\x01 \x01(\x05\x12\x0b\n\x03xml\x18\x02 \x01(\x0c\x12\x11\n\tmsg_resid\x18\x03 \x01(\x0c\x12\x0f\n\x07\x61\x62ility\x18\x04 \x01(\r\x12\x13\n\x0bmin_ability\x18\x05 \x01(\r\"a\n\x07MsgBody\x12,\n\trich_text\x18\x01 \x01(\x0b\x32\x19.im.msg.msg_body.RichText\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\x12\x17\n\x0f\x65ncrypt_content\x18\x03 \x01(\x0c\"]\n\x10MsgBody_subtype4\x12\x37\n\x0fnot_online_file\x18\x01 \x01(\x0b\x32\x1e.im.msg.msg_body.NotOnlineFile\x12\x10\n\x08msg_time\x18\x02 \x01(\r\"8\n\x11NearByMessageType\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x15\n\ridentify_type\x18\x02 \x01(\r\"\x94\x03\n\rNotOnlineFile\x12\x11\n\tfile_type\x18\x01 \x01(\r\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\x11\n\tfile_uuid\x18\x03 \x01(\x0c\x12\x10\n\x08\x66ile_md5\x18\x04 \x01(\x0c\x12\x11\n\tfile_name\x18\x05 \x01(\x0c\x12\x11\n\tfile_size\x18\x06 \x01(\x04\x12\x0c\n\x04note\x18\x07 \x01(\x0c\x12\x10\n\x08reserved\x18\x08 \x01(\r\x12\x0e\n\x06subcmd\x18\t \x01(\r\x12\x13\n\x0bmicro_cloud\x18\n \x01(\r\x12\x11\n\tfile_urls\x18\x0b \x03(\x0c\x12\x15\n\rdownload_flag\x18\x0c \x01(\r\x12\x13\n\x0b\x64\x61nger_evel\x18\x32 \x01(\r\x12\x11\n\tlife_time\x18\x33 \x01(\r\x12\x13\n\x0bupload_time\x18\x34 \x01(\r\x12\x15\n\rabs_file_type\x18\x35 \x01(\r\x12\x13\n\x0b\x63lient_type\x18\x36 \x01(\r\x12\x13\n\x0b\x65xpire_time\x18\x37 \x01(\r\x12\x12\n\npb_reserve\x18\x38 \x01(\x0c\x12\x17\n\x0f\x66ileidcrc_media\x18\x39 \x01(\t\"\xbd\x04\n\x0eNotOnlineImage\x12\x11\n\tfile_path\x18\x01 \x01(\x0c\x12\x10\n\x08\x66ile_len\x18\x02 \x01(\r\x12\x15\n\rdownload_path\x18\x03 \x01(\x0c\x12\x19\n\x11old_ver_send_file\x18\x04 \x01(\x0c\x12\x10\n\x08img_type\x18\x05 \x01(\r\x12\x16\n\x0epreviews_image\x18\x06 \x01(\x0c\x12\x0f\n\x07pic_md5\x18\x07 \x01(\x0c\x12\x12\n\npic_height\x18\x08 \x01(\r\x12\x11\n\tpic_width\x18\t \x01(\r\x12\x0e\n\x06res_id\x18\n \x01(\x0c\x12\x0c\n\x04\x66lag\x18\x0b \x01(\x0c\x12\x11\n\tthumb_url\x18\x0c \x01(\t\x12\x10\n\x08original\x18\r \x01(\r\x12\x0f\n\x07\x62ig_url\x18\x0e \x01(\t\x12\x10\n\x08orig_url\x18\x0f \x01(\t\x12\x10\n\x08\x62iz_type\x18\x10 \x01(\r\x12\x0e\n\x06result\x18\x11 \x01(\r\x12\r\n\x05index\x18\x12 \x01(\r\x12\x13\n\x0bop_face_buf\x18\x13 \x01(\x0c\x12\x13\n\x0bold_pic_md5\x18\x14 \x01(\x08\x12\x13\n\x0bthumb_width\x18\x15 \x01(\r\x12\x14\n\x0cthumb_height\x18\x16 \x01(\r\x12\x0f\n\x07\x66ile_id\x18\x17 \x01(\r\x12\x10\n\x08show_len\x18\x18 \x01(\r\x12\x14\n\x0c\x64ownload_len\x18\x19 \x01(\r\x12\x10\n\x08_400_url\x18\x1a \x01(\t\x12\x12\n\n_400_width\x18\x1b \x01(\r\x12\x13\n\x0b_400_height\x18\x1c \x01(\r\x12\x12\n\npb_reserve\x18\x1d \x01(\x0c\"I\n\x0bOnlineImage\x12\x0c\n\x04guid\x18\x01 \x01(\x0c\x12\x11\n\tfile_path\x18\x02 \x01(\x0c\x12\x19\n\x11old_ver_send_file\x18\x03 \x01(\x0c\"!\n\nOpenQQData\x12\x13\n\x0b\x63\x61r_qq_data\x18\x01 \x01(\x0c\"/\n\x08PatsElem\x12\x10\n\x08pat_type\x18\x01 \x01(\r\x12\x11\n\tpat_count\x18\x02 \x01(\r\"\x94\x01\n\x0cPcSupportDef\x12\x14\n\x0cpc_ptl_begin\x18\x01 \x01(\r\x12\x12\n\npc_ptl_end\x18\x02 \x01(\r\x12\x15\n\rmac_ptl_begin\x18\x03 \x01(\r\x12\x13\n\x0bmac_ptl_end\x18\x04 \x01(\r\x12\x14\n\x0cptls_support\x18\x05 \x03(\r\x12\x18\n\x10ptls_not_support\x18\x06 \x03(\r\"\xca\x03\n\x03Ptt\x12\x11\n\tfile_type\x18\x01 \x01(\r\x12\x0f\n\x07src_uin\x18\x02 \x01(\x04\x12\x11\n\tfile_uuid\x18\x03 \x01(\x0c\x12\x10\n\x08\x66ile_md5\x18\x04 \x01(\x0c\x12\x11\n\tfile_name\x18\x05 \x01(\x0c\x12\x11\n\tfile_size\x18\x06 \x01(\r\x12\x0f\n\x07reserve\x18\x07 \x01(\x0c\x12\x0f\n\x07\x66ile_id\x18\x08 \x01(\r\x12\x11\n\tserver_ip\x18\t \x01(\r\x12\x13\n\x0bserver_port\x18\n \x01(\r\x12\r\n\x05valid\x18\x0b \x01(\x08\x12\x11\n\tsignature\x18\x0c \x01(\x0c\x12\x10\n\x08shortcut\x18\r \x01(\x0c\x12\x10\n\x08\x66ile_key\x18\x0e \x01(\x0c\x12\x17\n\x0fmagic_ptt_index\x18\x0f \x01(\r\x12\x14\n\x0cvoice_switch\x18\x10 \x01(\r\x12\x0f\n\x07ptt_url\x18\x11 \x01(\x0c\x12\x16\n\x0egroup_file_key\x18\x12 \x01(\x0c\x12\x0c\n\x04time\x18\x13 \x01(\r\x12\x11\n\tdown_para\x18\x14 \x01(\x0c\x12\x0e\n\x06\x66ormat\x18\x1d \x01(\r\x12\x12\n\npb_reserve\x18\x1e \x01(\x0c\x12\x10\n\x08ptt_urls\x18\x1f \x03(\x0c\x12\x15\n\rdownload_flag\x18  \x01(\r\"g\n\nPubAccInfo\x12\x14\n\x0cis_inter_num\x18\x01 \x01(\r\x12\x17\n\x0fmsg_template_id\x18\x02 \x01(\t\x12\x14\n\x0clong_msg_url\x18\x03 \x01(\t\x12\x14\n\x0c\x64ownload_key\x18\x04 \x01(\x0c\"2\n\nPubAccount\x12\x0b\n\x03\x62uf\x18\x01 \x01(\x0c\x12\x17\n\x0fpub_account_uin\x18\x02 \x01(\x04\"K\n\x08PubGroup\x12\x10\n\x08nickname\x18\x01 \x01(\x0c\x12\x0e\n\x06gender\x18\x02 \x01(\r\x12\x0b\n\x03\x61ge\x18\x03 \x01(\r\x12\x10\n\x08\x64istance\x18\x04 \x01(\r\"Q\n\tQQLiveOld\x12\x0f\n\x07sub_cmd\x18\x01 \x01(\r\x12\x11\n\tshow_text\x18\x02 \x01(\x0c\x12\r\n\x05param\x18\x03 \x01(\x0c\x12\x11\n\tintroduce\x18\x04 \x01(\x0c\"\xcd\x03\n\x0fQQWalletAioBody\x12\x0f\n\x07senduin\x18\x01 \x01(\x04\x12\x30\n\x06sender\x18\x02 \x01(\x0b\x32 .im.msg.msg_body.QQWalletAioElem\x12\x32\n\x08receiver\x18\x03 \x01(\x0b\x32 .im.msg.msg_body.QQWalletAioElem\x12\x11\n\tchannelid\x18\x04 \x01(\x11\x12\x12\n\ntemplateid\x18\x05 \x01(\x11\x12\x0e\n\x06resend\x18\x06 \x01(\r\x12\x14\n\x0cmsg_priority\x18\x07 \x01(\r\x12\x0f\n\x07redtype\x18\x08 \x01(\x11\x12\x0e\n\x06\x62illno\x18\t \x01(\x0c\x12\x0f\n\x07\x61uthkey\x18\n \x01(\x0c\x12\x13\n\x0bsessiontype\x18\x0b \x01(\x11\x12\x0f\n\x07msgtype\x18\x0c \x01(\x11\x12\x12\n\nenvelopeid\x18\r \x01(\x11\x12\x0c\n\x04name\x18\x0e \x01(\x0c\x12\x10\n\x08\x63onftype\x18\x0f \x01(\x11\x12\x10\n\x08msg_from\x18\x10 \x01(\x11\x12\x0f\n\x07pc_body\x18\x11 \x01(\x0c\x12\r\n\x05index\x18\x12 \x01(\x0c\x12\x12\n\nredchannel\x18\x13 \x01(\r\x12\x10\n\x08grap_uin\x18\x14 \x03(\x04\x12\x12\n\npb_reserve\x18\x15 \x01(\x0c\"\xb9\x03\n\x0fQQWalletAioElem\x12\x12\n\nbackground\x18\x01 \x01(\r\x12\x0c\n\x04icon\x18\x02 \x01(\r\x12\r\n\x05title\x18\x03 \x01(\x0c\x12\x10\n\x08subtitle\x18\x04 \x01(\x0c\x12\x0f\n\x07\x63ontent\x18\x05 \x01(\x0c\x12\x0f\n\x07linkurl\x18\x06 \x01(\x0c\x12\x13\n\x0b\x62lackstripe\x18\x07 \x01(\x0c\x12\x0e\n\x06notice\x18\x08 \x01(\x0c\x12\x13\n\x0btitle_color\x18\t \x01(\r\x12\x16\n\x0esubtitle_color\x18\n \x01(\r\x12\x18\n\x10\x61\x63tions_priority\x18\x0b \x01(\x0c\x12\x10\n\x08jump_url\x18\x0c \x01(\x0c\x12\x12\n\nnative_ios\x18\r \x01(\x0c\x12\x16\n\x0enative_android\x18\x0e \x01(\x0c\x12\x0f\n\x07iconurl\x18\x0f \x01(\x0c\x12\x15\n\rcontent_color\x18\x10 \x01(\r\x12\x17\n\x0f\x63ontent_bgcolor\x18\x11 \x01(\r\x12\x16\n\x0e\x61io_image_left\x18\x12 \x01(\x0c\x12\x17\n\x0f\x61io_image_right\x18\x13 \x01(\x0c\x12\x11\n\tcft_image\x18\x14 \x01(\x0c\x12\x12\n\npb_reserve\x18\x15 \x01(\x0c\"A\n\x0bQQWalletMsg\x12\x32\n\x08\x61io_body\x18\x01 \x01(\x0b\x32 .im.msg.msg_body.QQWalletAioBody\"!\n\nRedBagInfo\x12\x13\n\x0bredbag_type\x18\x01 \x01(\r\"n\n\x07RichMsg\x12\x12\n\ntemplate_1\x18\x01 \x01(\x0c\x12\x12\n\nservice_id\x18\x02 \x01(\r\x12\x11\n\tmsg_resid\x18\x03 \x01(\x0c\x12\x0c\n\x04rand\x18\x04 \x01(\r\x12\x0b\n\x03seq\x18\x05 \x01(\r\x12\r\n\x05\x66lags\x18\x06 \x01(\r\"\x97\x02\n\x08RichText\x12#\n\x04\x61ttr\x18\x01 \x01(\x0b\x32\x15.im.msg.msg_body.Attr\x12$\n\x05\x65lems\x18\x02 \x03(\x0b\x32\x15.im.msg.msg_body.Elem\x12\x37\n\x0fnot_online_file\x18\x03 \x01(\x0b\x32\x1e.im.msg.msg_body.NotOnlineFile\x12!\n\x03ptt\x18\x04 \x01(\x0b\x32\x14.im.msg.msg_body.Ptt\x12(\n\x07tmp_ptt\x18\x05 \x01(\x0b\x32\x17.im.msg.msg_body.TmpPtt\x12:\n\x11trans_211_tmp_msg\x18\x06 \x01(\x0b\x32\x1f.im.msg.msg_body.Trans211TmpMsg\"\xf5\x02\n\rSecretFileMsg\x12\x10\n\x08\x66ile_key\x18\x01 \x01(\x0c\x12\x10\n\x08\x66rom_uin\x18\x02 \x01(\x04\x12\x0e\n\x06to_uin\x18\x03 \x01(\x04\x12\x0e\n\x06status\x18\x04 \x01(\r\x12\x0b\n\x03ttl\x18\x05 \x01(\r\x12\x0c\n\x04type\x18\x06 \x01(\r\x12\x1e\n\x16\x65ncrypt_prehead_length\x18\x07 \x01(\r\x12\x14\n\x0c\x65ncrypt_type\x18\x08 \x01(\r\x12\x13\n\x0b\x65ncrypt_key\x18\t \x01(\x0c\x12\x12\n\nread_times\x18\n \x01(\r\x12\x11\n\tleft_time\x18\x0b \x01(\r\x12\x39\n\x10not_online_image\x18\x0c \x01(\x0b\x32\x1f.im.msg.msg_body.NotOnlineImage\x12\x30\n\x0b\x65lem_flags2\x18\r \x01(\x0b\x32\x1b.im.msg.msg_body.ElemFlags2\x12\x10\n\x08opertype\x18\x0e \x01(\r\x12\x14\n\x0c\x66romphonenum\x18\x0f \x01(\t\"9\n\x0bShakeWindow\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0f\n\x07reserve\x18\x02 \x01(\r\x12\x0b\n\x03uin\x18\x03 \x01(\x04\"5\n\nSmallEmoji\x12\x13\n\x0bpack_id_sum\x18\x01 \x01(\r\x12\x12\n\nimage_type\x18\x02 \x01(\r\"\xdd\x01\n\tSourceMsg\x12\x11\n\torig_seqs\x18\x01 \x03(\r\x12\x12\n\nsender_uin\x18\x02 \x01(\x04\x12\x0c\n\x04time\x18\x03 \x01(\r\x12\x0c\n\x04\x66lag\x18\x04 \x01(\r\x12$\n\x05\x65lems\x18\x05 \x03(\x0b\x32\x15.im.msg.msg_body.Elem\x12\x0c\n\x04type\x18\x06 \x01(\r\x12\x10\n\x08rich_msg\x18\x07 \x01(\x0c\x12\x12\n\npb_reserve\x18\x08 \x01(\x0c\x12\x0f\n\x07src_msg\x18\t \x01(\x0c\x12\x0e\n\x06to_uin\x18\n \x01(\x04\x12\x12\n\ntroop_name\x18\x0b \x01(\x0c\"o\n\tPlainText\x12\x0b\n\x03str\x18\x01 \x01(\x0c\x12\x0c\n\x04link\x18\x02 \x01(\t\x12\x12\n\nattr_6_buf\x18\x03 \x01(\x0c\x12\x12\n\nattr_7_buf\x18\x04 \x01(\x0c\x12\x0b\n\x03\x62uf\x18\x0b \x01(\x0c\x12\x12\n\npb_reserve\x18\x0c \x01(\x0c\"\x18\n\x08TipsInfo\x12\x0c\n\x04text\x18\x01 \x01(\t\"\xf3\x01\n\x06TmpPtt\x12\x11\n\tfile_type\x18\x01 \x01(\r\x12\x11\n\tfile_uuid\x18\x02 \x01(\x0c\x12\x10\n\x08\x66ile_md5\x18\x03 \x01(\x0c\x12\x11\n\tfile_name\x18\x04 \x01(\x0c\x12\x11\n\tfile_size\x18\x05 \x01(\r\x12\x11\n\tptt_times\x18\x06 \x01(\r\x12\x11\n\tuser_type\x18\x07 \x01(\r\x12\x15\n\rptttrans_flag\x18\x08 \x01(\r\x12\x11\n\tbusi_type\x18\t \x01(\r\x12\x0e\n\x06msg_id\x18\n \x01(\x04\x12\x12\n\npb_reserve\x18\x1e \x01(\x0c\x12\x17\n\x0fptt_encode_data\x18\x1f \x01(\x0c\"3\n\x0eTrans211TmpMsg\x12\x10\n\x08msg_body\x18\x01 \x01(\x0c\x12\x0f\n\x07\x63\x32\x63_cmd\x18\x02 \x01(\r\"2\n\tTransElem\x12\x11\n\telem_type\x18\x01 \x01(\r\x12\x12\n\nelem_value\x18\x02 \x01(\x0c\"\x9c\x04\n\tVideoFile\x12\x11\n\tfile_uuid\x18\x01 \x01(\x0c\x12\x10\n\x08\x66ile_md5\x18\x02 \x01(\x0c\x12\x11\n\tfile_name\x18\x03 \x01(\x0c\x12\x13\n\x0b\x66ile_format\x18\x04 \x01(\r\x12\x11\n\tfile_time\x18\x05 \x01(\r\x12\x11\n\tfile_size\x18\x06 \x01(\r\x12\x13\n\x0bthumb_width\x18\x07 \x01(\r\x12\x14\n\x0cthumb_height\x18\x08 \x01(\r\x12\x16\n\x0ethumb_file_md5\x18\t \x01(\x0c\x12\x0e\n\x06source\x18\n \x01(\x0c\x12\x17\n\x0fthumb_file_size\x18\x0b \x01(\r\x12\x11\n\tbusi_type\x18\x0c \x01(\r\x12\x16\n\x0e\x66rom_chat_type\x18\r \x01(\r\x12\x14\n\x0cto_chat_type\x18\x0e \x01(\r\x12\x1b\n\x13support_progressive\x18\x0f \x01(\x08\x12\x12\n\nfile_width\x18\x10 \x01(\r\x12\x13\n\x0b\x66ile_height\x18\x11 \x01(\r\x12\x15\n\rsub_busi_type\x18\x12 \x01(\r\x12\x12\n\nvideo_attr\x18\x13 \x01(\r\x12\x17\n\x0fthumb_file_urls\x18\x14 \x03(\x0c\x12\x17\n\x0fvideo_file_urls\x18\x15 \x03(\x0c\x12\x1b\n\x13thumb_download_flag\x18\x16 \x01(\r\x12\x1b\n\x13video_download_flag\x18\x17 \x01(\r\x12\x12\n\npb_reserve\x18\x18 \x01(\x0c\"8\n\x11WorkflowNotifyMsg\x12\x0f\n\x07\x65xt_msg\x18\x01 \x01(\x0c\x12\x12\n\ncreate_uin\x18\x02 \x01(\x04\"A\n\x0cLocationInfo\x12\x11\n\tlongitude\x18\x01 \x01(\x01\x12\x10\n\x08latitude\x18\x02 \x01(\x01\x12\x0c\n\x04\x64\x65sc\x18\x03 \x01(\x0c')
+
+
+
+_ANONYMOUSGROUPMSG = DESCRIPTOR.message_types_by_name['AnonymousGroupMsg']
+_APOLLOACTMSG = DESCRIPTOR.message_types_by_name['ApolloActMsg']
+_ARKAPPELEM = DESCRIPTOR.message_types_by_name['ArkAppElem']
+_ATTR = DESCRIPTOR.message_types_by_name['Attr']
+_BITAPPMSG = DESCRIPTOR.message_types_by_name['BitAppMsg']
+_BLESSINGMESSAGE = DESCRIPTOR.message_types_by_name['BlessingMessage']
+_COMMONELEM = DESCRIPTOR.message_types_by_name['CommonElem']
+_CONFERENCETIPSINFO = DESCRIPTOR.message_types_by_name['ConferenceTipsInfo']
+_CRMELEM = DESCRIPTOR.message_types_by_name['CrmElem']
+_CUSTOMELEM = DESCRIPTOR.message_types_by_name['CustomElem']
+_CUSTOMFACE = DESCRIPTOR.message_types_by_name['CustomFace']
+_DELIVERGIFTMSG = DESCRIPTOR.message_types_by_name['DeliverGiftMsg']
+_EIMINFO = DESCRIPTOR.message_types_by_name['EIMInfo']
+_ELEM = DESCRIPTOR.message_types_by_name['Elem']
+_ELEMFLAGS = DESCRIPTOR.message_types_by_name['ElemFlags']
+_ELEMFLAGS2 = DESCRIPTOR.message_types_by_name['ElemFlags2']
+_INST = DESCRIPTOR.message_types_by_name['Inst']
+_EXTRAINFO = DESCRIPTOR.message_types_by_name['ExtraInfo']
+_FSJMESSAGEELEM = DESCRIPTOR.message_types_by_name['FSJMessageElem']
+_FACE = DESCRIPTOR.message_types_by_name['Face']
+_FUNFACE = DESCRIPTOR.message_types_by_name['FunFace']
+_BOMB = DESCRIPTOR.message_types_by_name['Bomb']
+_TURNTABLE = DESCRIPTOR.message_types_by_name['Turntable']
+_GENERALFLAGS = DESCRIPTOR.message_types_by_name['GeneralFlags']
+_GROUPBUSINESSMSG = DESCRIPTOR.message_types_by_name['GroupBusinessMsg']
+_GROUPFILE = DESCRIPTOR.message_types_by_name['GroupFile']
+_GROUPPOSTELEM = DESCRIPTOR.message_types_by_name['GroupPostElem']
+_GROUPPUBACCOUNTINFO = DESCRIPTOR.message_types_by_name['GroupPubAccountInfo']
+_LIFEONLINEACCOUNT = DESCRIPTOR.message_types_by_name['LifeOnlineAccount']
+_LIGHTAPPELEM = DESCRIPTOR.message_types_by_name['LightAppElem']
+_LOLAMSG = DESCRIPTOR.message_types_by_name['LolaMsg']
+_LOWVERSIONTIPS = DESCRIPTOR.message_types_by_name['LowVersionTips']
+_MARKETFACE = DESCRIPTOR.message_types_by_name['MarketFace']
+_MARKETTRANS = DESCRIPTOR.message_types_by_name['MarketTrans']
+_MSGBODY = DESCRIPTOR.message_types_by_name['MsgBody']
+_MSGBODY_SUBTYPE4 = DESCRIPTOR.message_types_by_name['MsgBody_subtype4']
+_NEARBYMESSAGETYPE = DESCRIPTOR.message_types_by_name['NearByMessageType']
+_NOTONLINEFILE = DESCRIPTOR.message_types_by_name['NotOnlineFile']
+_NOTONLINEIMAGE = DESCRIPTOR.message_types_by_name['NotOnlineImage']
+_ONLINEIMAGE = DESCRIPTOR.message_types_by_name['OnlineImage']
+_OPENQQDATA = DESCRIPTOR.message_types_by_name['OpenQQData']
+_PATSELEM = DESCRIPTOR.message_types_by_name['PatsElem']
+_PCSUPPORTDEF = DESCRIPTOR.message_types_by_name['PcSupportDef']
+_PTT = DESCRIPTOR.message_types_by_name['Ptt']
+_PUBACCINFO = DESCRIPTOR.message_types_by_name['PubAccInfo']
+_PUBACCOUNT = DESCRIPTOR.message_types_by_name['PubAccount']
+_PUBGROUP = DESCRIPTOR.message_types_by_name['PubGroup']
+_QQLIVEOLD = DESCRIPTOR.message_types_by_name['QQLiveOld']
+_QQWALLETAIOBODY = DESCRIPTOR.message_types_by_name['QQWalletAioBody']
+_QQWALLETAIOELEM = DESCRIPTOR.message_types_by_name['QQWalletAioElem']
+_QQWALLETMSG = DESCRIPTOR.message_types_by_name['QQWalletMsg']
+_REDBAGINFO = DESCRIPTOR.message_types_by_name['RedBagInfo']
+_RICHMSG = DESCRIPTOR.message_types_by_name['RichMsg']
+_RICHTEXT = DESCRIPTOR.message_types_by_name['RichText']
+_SECRETFILEMSG = DESCRIPTOR.message_types_by_name['SecretFileMsg']
+_SHAKEWINDOW = DESCRIPTOR.message_types_by_name['ShakeWindow']
+_SMALLEMOJI = DESCRIPTOR.message_types_by_name['SmallEmoji']
+_SOURCEMSG = DESCRIPTOR.message_types_by_name['SourceMsg']
+_PLAINTEXT = DESCRIPTOR.message_types_by_name['PlainText']
+_TIPSINFO = DESCRIPTOR.message_types_by_name['TipsInfo']
+_TMPPTT = DESCRIPTOR.message_types_by_name['TmpPtt']
+_TRANS211TMPMSG = DESCRIPTOR.message_types_by_name['Trans211TmpMsg']
+_TRANSELEM = DESCRIPTOR.message_types_by_name['TransElem']
+_VIDEOFILE = DESCRIPTOR.message_types_by_name['VideoFile']
+_WORKFLOWNOTIFYMSG = DESCRIPTOR.message_types_by_name['WorkflowNotifyMsg']
+_LOCATIONINFO = DESCRIPTOR.message_types_by_name['LocationInfo']
 AnonymousGroupMsg = _reflection.GeneratedProtocolMessageType('AnonymousGroupMsg', (_message.Message,), {
   'DESCRIPTOR' : _ANONYMOUSGROUPMSG,
   '__module__' : 'cai.pb.im.msg.msg_body.msg_body_pb2'
@@ -5964,5 +546,139 @@
   })
 _sym_db.RegisterMessage(LocationInfo)
 
-
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _ANONYMOUSGROUPMSG._serialized_start=59
+  _ANONYMOUSGROUPMSG._serialized_end=212
+  _APOLLOACTMSG._serialized_start=215
+  _APOLLOACTMSG._serialized_end=487
+  _ARKAPPELEM._serialized_start=489
+  _ARKAPPELEM._serialized_end=576
+  _ATTR._serialized_start=579
+  _ATTR._serialized_end=764
+  _BITAPPMSG._serialized_start=766
+  _BITAPPMSG._serialized_end=790
+  _BLESSINGMESSAGE._serialized_start=792
+  _BLESSINGMESSAGE._serialized_end=844
+  _COMMONELEM._serialized_start=846
+  _COMMONELEM._serialized_end=920
+  _CONFERENCETIPSINFO._serialized_start=922
+  _CONFERENCETIPSINFO._serialized_end=999
+  _CRMELEM._serialized_start=1001
+  _CRMELEM._serialized_end=1106
+  _CUSTOMELEM._serialized_start=1108
+  _CUSTOMELEM._serialized_end=1195
+  _CUSTOMFACE._serialized_start=1198
+  _CUSTOMFACE._serialized_end=1823
+  _DELIVERGIFTMSG._serialized_start=1826
+  _DELIVERGIFTMSG._serialized_end=2392
+  _EIMINFO._serialized_start=2394
+  _EIMINFO._serialized_end=2434
+  _ELEM._serialized_start=2437
+  _ELEM._serialized_end=5136
+  _ELEMFLAGS._serialized_start=5138
+  _ELEMFLAGS._serialized_end=5188
+  _ELEMFLAGS2._serialized_start=5191
+  _ELEMFLAGS2._serialized_end=5570
+  _INST._serialized_start=5572
+  _INST._serialized_end=5611
+  _EXTRAINFO._serialized_start=5614
+  _EXTRAINFO._serialized_end=5857
+  _FSJMESSAGEELEM._serialized_start=5859
+  _FSJMESSAGEELEM._serialized_end=5893
+  _FACE._serialized_start=5895
+  _FACE._serialized_end=5942
+  _FUNFACE._serialized_start=5944
+  _FUNFACE._serialized_end=6037
+  _BOMB._serialized_start=6039
+  _BOMB._serialized_end=6060
+  _TURNTABLE._serialized_start=6062
+  _TURNTABLE._serialized_end=6130
+  _GENERALFLAGS._serialized_start=6133
+  _GENERALFLAGS._serialized_end=6567
+  _GROUPBUSINESSMSG._serialized_start=6570
+  _GROUPBUSINESSMSG._serialized_end=6733
+  _GROUPFILE._serialized_start=6736
+  _GROUPFILE._serialized_end=6935
+  _GROUPPOSTELEM._serialized_start=6937
+  _GROUPPOSTELEM._serialized_end=6991
+  _GROUPPUBACCOUNTINFO._serialized_start=6993
+  _GROUPPUBACCOUNTINFO._serialized_end=7035
+  _LIFEONLINEACCOUNT._serialized_start=7038
+  _LIFEONLINEACCOUNT._serialized_end=7213
+  _LIGHTAPPELEM._serialized_start=7215
+  _LIGHTAPPELEM._serialized_end=7262
+  _LOLAMSG._serialized_start=7264
+  _LOLAMSG._serialized_end=7360
+  _LOWVERSIONTIPS._serialized_start=7362
+  _LOWVERSIONTIPS._serialized_end=7476
+  _MARKETFACE._serialized_start=7479
+  _MARKETFACE._serialized_end=7731
+  _MARKETTRANS._serialized_start=7733
+  _MARKETTRANS._serialized_end=7830
+  _MSGBODY._serialized_start=7832
+  _MSGBODY._serialized_end=7929
+  _MSGBODY_SUBTYPE4._serialized_start=7931
+  _MSGBODY_SUBTYPE4._serialized_end=8024
+  _NEARBYMESSAGETYPE._serialized_start=8026
+  _NEARBYMESSAGETYPE._serialized_end=8082
+  _NOTONLINEFILE._serialized_start=8085
+  _NOTONLINEFILE._serialized_end=8489
+  _NOTONLINEIMAGE._serialized_start=8492
+  _NOTONLINEIMAGE._serialized_end=9065
+  _ONLINEIMAGE._serialized_start=9067
+  _ONLINEIMAGE._serialized_end=9140
+  _OPENQQDATA._serialized_start=9142
+  _OPENQQDATA._serialized_end=9175
+  _PATSELEM._serialized_start=9177
+  _PATSELEM._serialized_end=9224
+  _PCSUPPORTDEF._serialized_start=9227
+  _PCSUPPORTDEF._serialized_end=9375
+  _PTT._serialized_start=9378
+  _PTT._serialized_end=9836
+  _PUBACCINFO._serialized_start=9838
+  _PUBACCINFO._serialized_end=9941
+  _PUBACCOUNT._serialized_start=9943
+  _PUBACCOUNT._serialized_end=9993
+  _PUBGROUP._serialized_start=9995
+  _PUBGROUP._serialized_end=10070
+  _QQLIVEOLD._serialized_start=10072
+  _QQLIVEOLD._serialized_end=10153
+  _QQWALLETAIOBODY._serialized_start=10156
+  _QQWALLETAIOBODY._serialized_end=10617
+  _QQWALLETAIOELEM._serialized_start=10620
+  _QQWALLETAIOELEM._serialized_end=11061
+  _QQWALLETMSG._serialized_start=11063
+  _QQWALLETMSG._serialized_end=11128
+  _REDBAGINFO._serialized_start=11130
+  _REDBAGINFO._serialized_end=11163
+  _RICHMSG._serialized_start=11165
+  _RICHMSG._serialized_end=11275
+  _RICHTEXT._serialized_start=11278
+  _RICHTEXT._serialized_end=11557
+  _SECRETFILEMSG._serialized_start=11560
+  _SECRETFILEMSG._serialized_end=11933
+  _SHAKEWINDOW._serialized_start=11935
+  _SHAKEWINDOW._serialized_end=11992
+  _SMALLEMOJI._serialized_start=11994
+  _SMALLEMOJI._serialized_end=12047
+  _SOURCEMSG._serialized_start=12050
+  _SOURCEMSG._serialized_end=12271
+  _PLAINTEXT._serialized_start=12273
+  _PLAINTEXT._serialized_end=12384
+  _TIPSINFO._serialized_start=12386
+  _TIPSINFO._serialized_end=12410
+  _TMPPTT._serialized_start=12413
+  _TMPPTT._serialized_end=12656
+  _TRANS211TMPMSG._serialized_start=12658
+  _TRANS211TMPMSG._serialized_end=12709
+  _TRANSELEM._serialized_start=12711
+  _TRANSELEM._serialized_end=12761
+  _VIDEOFILE._serialized_start=12764
+  _VIDEOFILE._serialized_end=13304
+  _WORKFLOWNOTIFYMSG._serialized_start=13306
+  _WORKFLOWNOTIFYMSG._serialized_end=13362
+  _LOCATIONINFO._serialized_start=13364
+  _LOCATIONINFO._serialized_end=13429
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/msg/msg_body/msg_body_pb2.pyi b/cai/pb/im/msg/msg_body/msg_body_pb2.pyi
index 108ccef3..ec73f80f 100644
--- a/cai/pb/im/msg/msg_body/msg_body_pb2.pyi
+++ b/cai/pb/im/msg/msg_body/msg_body_pb2.pyi
@@ -34,10 +34,13 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class AnonymousGroupMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    """tencent/im/msg/im_msg_body.java
+
+    """
+    DESCRIPTOR: Descriptor
     FLAGS_FIELD_NUMBER: int
     ANON_ID_FIELD_NUMBER: int
     ANON_NICK_FIELD_NUMBER: int
@@ -45,29 +48,28 @@ class AnonymousGroupMsg(Message):
     EXPIRE_TIME_FIELD_NUMBER: int
     BUBBLE_ID_FIELD_NUMBER: int
     RANK_COLOR_FIELD_NUMBER: int
-    flags: int = ...
-    anon_id: bytes = ...
-    anon_nick: bytes = ...
-    head_portrait: int = ...
-    expire_time: int = ...
-    bubble_id: int = ...
-    rank_color: bytes = ...
-
-    def __init__(self,
-        *,
-        flags : Optional[int] = ...,
-        anon_id : Optional[bytes] = ...,
-        anon_nick : Optional[bytes] = ...,
-        head_portrait : Optional[int] = ...,
-        expire_time : Optional[int] = ...,
-        bubble_id : Optional[int] = ...,
-        rank_color : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"anon_id",b"anon_id",u"anon_nick",b"anon_nick",u"bubble_id",b"bubble_id",u"expire_time",b"expire_time",u"flags",b"flags",u"head_portrait",b"head_portrait",u"rank_color",b"rank_color"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"anon_id",b"anon_id",u"anon_nick",b"anon_nick",u"bubble_id",b"bubble_id",u"expire_time",b"expire_time",u"flags",b"flags",u"head_portrait",b"head_portrait",u"rank_color",b"rank_color"]) -> None: ...
+    flags: int
+    anon_id: bytes
+    anon_nick: bytes
+    head_portrait: int
+    expire_time: int
+    bubble_id: int
+    rank_color: bytes
+    def __init__(self,
+        *,
+        flags: Optional[int] = ...,
+        anon_id: Optional[bytes] = ...,
+        anon_nick: Optional[bytes] = ...,
+        head_portrait: Optional[int] = ...,
+        expire_time: Optional[int] = ...,
+        bubble_id: Optional[int] = ...,
+        rank_color: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["anon_id",b"anon_id","anon_nick",b"anon_nick","bubble_id",b"bubble_id","expire_time",b"expire_time","flags",b"flags","head_portrait",b"head_portrait","rank_color",b"rank_color"]) -> bool: ...
+    def ClearField(self, field_name: Literal["anon_id",b"anon_id","anon_nick",b"anon_nick","bubble_id",b"bubble_id","expire_time",b"expire_time","flags",b"flags","head_portrait",b"head_portrait","rank_color",b"rank_color"]) -> None: ...
 
 class ApolloActMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     ACTION_ID_FIELD_NUMBER: int
     ACTION_NAME_FIELD_NUMBER: int
     ACTION_TEXT_FIELD_NUMBER: int
@@ -81,62 +83,60 @@ class ApolloActMsg(Message):
     DIYTEXT_CONTENT_FIELD_NUMBER: int
     INPUT_TEXT_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
-    action_id: int = ...
-    action_name: bytes = ...
-    action_text: bytes = ...
-    flag: int = ...
-    peer_uin: int = ...
-    sender_ts: int = ...
-    peer_ts: int = ...
-    sender_status: int = ...
-    peer_status: int = ...
-    diytext_id: int = ...
-    diytext_content: bytes = ...
-    input_text: bytes = ...
-    pb_reserve: bytes = ...
-
-    def __init__(self,
-        *,
-        action_id : Optional[int] = ...,
-        action_name : Optional[bytes] = ...,
-        action_text : Optional[bytes] = ...,
-        flag : Optional[int] = ...,
-        peer_uin : Optional[int] = ...,
-        sender_ts : Optional[int] = ...,
-        peer_ts : Optional[int] = ...,
-        sender_status : Optional[int] = ...,
-        peer_status : Optional[int] = ...,
-        diytext_id : Optional[int] = ...,
-        diytext_content : Optional[bytes] = ...,
-        input_text : Optional[bytes] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"action_id",b"action_id",u"action_name",b"action_name",u"action_text",b"action_text",u"diytext_content",b"diytext_content",u"diytext_id",b"diytext_id",u"flag",b"flag",u"input_text",b"input_text",u"pb_reserve",b"pb_reserve",u"peer_status",b"peer_status",u"peer_ts",b"peer_ts",u"peer_uin",b"peer_uin",u"sender_status",b"sender_status",u"sender_ts",b"sender_ts"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"action_id",b"action_id",u"action_name",b"action_name",u"action_text",b"action_text",u"diytext_content",b"diytext_content",u"diytext_id",b"diytext_id",u"flag",b"flag",u"input_text",b"input_text",u"pb_reserve",b"pb_reserve",u"peer_status",b"peer_status",u"peer_ts",b"peer_ts",u"peer_uin",b"peer_uin",u"sender_status",b"sender_status",u"sender_ts",b"sender_ts"]) -> None: ...
+    action_id: int
+    action_name: bytes
+    action_text: bytes
+    flag: int
+    peer_uin: int
+    sender_ts: int
+    peer_ts: int
+    sender_status: int
+    peer_status: int
+    diytext_id: int
+    diytext_content: bytes
+    input_text: bytes
+    pb_reserve: bytes
+    def __init__(self,
+        *,
+        action_id: Optional[int] = ...,
+        action_name: Optional[bytes] = ...,
+        action_text: Optional[bytes] = ...,
+        flag: Optional[int] = ...,
+        peer_uin: Optional[int] = ...,
+        sender_ts: Optional[int] = ...,
+        peer_ts: Optional[int] = ...,
+        sender_status: Optional[int] = ...,
+        peer_status: Optional[int] = ...,
+        diytext_id: Optional[int] = ...,
+        diytext_content: Optional[bytes] = ...,
+        input_text: Optional[bytes] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["action_id",b"action_id","action_name",b"action_name","action_text",b"action_text","diytext_content",b"diytext_content","diytext_id",b"diytext_id","flag",b"flag","input_text",b"input_text","pb_reserve",b"pb_reserve","peer_status",b"peer_status","peer_ts",b"peer_ts","peer_uin",b"peer_uin","sender_status",b"sender_status","sender_ts",b"sender_ts"]) -> bool: ...
+    def ClearField(self, field_name: Literal["action_id",b"action_id","action_name",b"action_name","action_text",b"action_text","diytext_content",b"diytext_content","diytext_id",b"diytext_id","flag",b"flag","input_text",b"input_text","pb_reserve",b"pb_reserve","peer_status",b"peer_status","peer_ts",b"peer_ts","peer_uin",b"peer_uin","sender_status",b"sender_status","sender_ts",b"sender_ts"]) -> None: ...
 
 class ArkAppElem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     APP_NAME_FIELD_NUMBER: int
     MIN_VERSION_FIELD_NUMBER: int
     XML_TEMPLATE_FIELD_NUMBER: int
     DATA_FIELD_NUMBER: int
-    app_name: Text = ...
-    min_version: Text = ...
-    xml_template: Text = ...
-    data: bytes = ...
-
+    app_name: Text
+    min_version: Text
+    xml_template: Text
+    data: bytes
     def __init__(self,
         *,
-        app_name : Optional[Text] = ...,
-        min_version : Optional[Text] = ...,
-        xml_template : Optional[Text] = ...,
-        data : Optional[bytes] = ...,
+        app_name: Optional[Text] = ...,
+        min_version: Optional[Text] = ...,
+        xml_template: Optional[Text] = ...,
+        data: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"app_name",b"app_name",u"data",b"data",u"min_version",b"min_version",u"xml_template",b"xml_template"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"app_name",b"app_name",u"data",b"data",u"min_version",b"min_version",u"xml_template",b"xml_template"]) -> None: ...
+    def HasField(self, field_name: Literal["app_name",b"app_name","data",b"data","min_version",b"min_version","xml_template",b"xml_template"]) -> bool: ...
+    def ClearField(self, field_name: Literal["app_name",b"app_name","data",b"data","min_version",b"min_version","xml_template",b"xml_template"]) -> None: ...
 
 class Attr(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CODE_PAGE_FIELD_NUMBER: int
     TIME_FIELD_NUMBER: int
     RANDOM_FIELD_NUMBER: int
@@ -147,146 +147,139 @@ class Attr(Message):
     PITCH_AND_FAMILY_FIELD_NUMBER: int
     FONT_NAME_FIELD_NUMBER: int
     RESERVE_DATA_FIELD_NUMBER: int
-    code_page: int = ...
-    time: int = ...
-    random: int = ...
-    color: int = ...
-    size: int = ...
-    effect: int = ...
-    char_set: int = ...
-    pitch_and_family: int = ...
-    font_name: Text = ...
-    reserve_data: bytes = ...
-
-    def __init__(self,
-        *,
-        code_page : Optional[int] = ...,
-        time : Optional[int] = ...,
-        random : Optional[int] = ...,
-        color : Optional[int] = ...,
-        size : Optional[int] = ...,
-        effect : Optional[int] = ...,
-        char_set : Optional[int] = ...,
-        pitch_and_family : Optional[int] = ...,
-        font_name : Optional[Text] = ...,
-        reserve_data : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"char_set",b"char_set",u"code_page",b"code_page",u"color",b"color",u"effect",b"effect",u"font_name",b"font_name",u"pitch_and_family",b"pitch_and_family",u"random",b"random",u"reserve_data",b"reserve_data",u"size",b"size",u"time",b"time"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"char_set",b"char_set",u"code_page",b"code_page",u"color",b"color",u"effect",b"effect",u"font_name",b"font_name",u"pitch_and_family",b"pitch_and_family",u"random",b"random",u"reserve_data",b"reserve_data",u"size",b"size",u"time",b"time"]) -> None: ...
+    code_page: int
+    time: int
+    random: int
+    color: int
+    size: int
+    effect: int
+    char_set: int
+    pitch_and_family: int
+    font_name: Text
+    reserve_data: bytes
+    def __init__(self,
+        *,
+        code_page: Optional[int] = ...,
+        time: Optional[int] = ...,
+        random: Optional[int] = ...,
+        color: Optional[int] = ...,
+        size: Optional[int] = ...,
+        effect: Optional[int] = ...,
+        char_set: Optional[int] = ...,
+        pitch_and_family: Optional[int] = ...,
+        font_name: Optional[Text] = ...,
+        reserve_data: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["char_set",b"char_set","code_page",b"code_page","color",b"color","effect",b"effect","font_name",b"font_name","pitch_and_family",b"pitch_and_family","random",b"random","reserve_data",b"reserve_data","size",b"size","time",b"time"]) -> bool: ...
+    def ClearField(self, field_name: Literal["char_set",b"char_set","code_page",b"code_page","color",b"color","effect",b"effect","font_name",b"font_name","pitch_and_family",b"pitch_and_family","random",b"random","reserve_data",b"reserve_data","size",b"size","time",b"time"]) -> None: ...
 
 class BitAppMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BUF_FIELD_NUMBER: int
-    buf: bytes = ...
-
+    buf: bytes
     def __init__(self,
         *,
-        buf : Optional[bytes] = ...,
+        buf: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"buf",b"buf"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"buf",b"buf"]) -> None: ...
+    def HasField(self, field_name: Literal["buf",b"buf"]) -> bool: ...
+    def ClearField(self, field_name: Literal["buf",b"buf"]) -> None: ...
 
 class BlessingMessage(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     MSG_TYPE_FIELD_NUMBER: int
     EX_FLAG_FIELD_NUMBER: int
-    msg_type: int = ...
-    ex_flag: int = ...
-
+    msg_type: int
+    ex_flag: int
     def __init__(self,
         *,
-        msg_type : Optional[int] = ...,
-        ex_flag : Optional[int] = ...,
+        msg_type: Optional[int] = ...,
+        ex_flag: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"ex_flag",b"ex_flag",u"msg_type",b"msg_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"ex_flag",b"ex_flag",u"msg_type",b"msg_type"]) -> None: ...
+    def HasField(self, field_name: Literal["ex_flag",b"ex_flag","msg_type",b"msg_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ex_flag",b"ex_flag","msg_type",b"msg_type"]) -> None: ...
 
 class CommonElem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SERVICE_TYPE_FIELD_NUMBER: int
     PB_ELEM_FIELD_NUMBER: int
     BUSINESS_TYPE_FIELD_NUMBER: int
-    service_type: int = ...
-    pb_elem: bytes = ...
-    business_type: int = ...
-
+    service_type: int
+    pb_elem: bytes
+    business_type: int
     def __init__(self,
         *,
-        service_type : Optional[int] = ...,
-        pb_elem : Optional[bytes] = ...,
-        business_type : Optional[int] = ...,
+        service_type: Optional[int] = ...,
+        pb_elem: Optional[bytes] = ...,
+        business_type: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"business_type",b"business_type",u"pb_elem",b"pb_elem",u"service_type",b"service_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"business_type",b"business_type",u"pb_elem",b"pb_elem",u"service_type",b"service_type"]) -> None: ...
+    def HasField(self, field_name: Literal["business_type",b"business_type","pb_elem",b"pb_elem","service_type",b"service_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["business_type",b"business_type","pb_elem",b"pb_elem","service_type",b"service_type"]) -> None: ...
 
 class ConferenceTipsInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SESSION_TYPE_FIELD_NUMBER: int
     SESSION_UIN_FIELD_NUMBER: int
     TEXT_FIELD_NUMBER: int
-    session_type: int = ...
-    session_uin: int = ...
-    text: Text = ...
-
+    session_type: int
+    session_uin: int
+    text: Text
     def __init__(self,
         *,
-        session_type : Optional[int] = ...,
-        session_uin : Optional[int] = ...,
-        text : Optional[Text] = ...,
+        session_type: Optional[int] = ...,
+        session_uin: Optional[int] = ...,
+        text: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"session_type",b"session_type",u"session_uin",b"session_uin",u"text",b"text"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"session_type",b"session_type",u"session_uin",b"session_uin",u"text",b"text"]) -> None: ...
+    def HasField(self, field_name: Literal["session_type",b"session_type","session_uin",b"session_uin","text",b"text"]) -> bool: ...
+    def ClearField(self, field_name: Literal["session_type",b"session_type","session_uin",b"session_uin","text",b"text"]) -> None: ...
 
 class CrmElem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CRM_BUF_FIELD_NUMBER: int
     MSG_RESID_FIELD_NUMBER: int
     QIDIAN_FLAG_FIELD_NUMBER: int
     PUSH_FLAG_FIELD_NUMBER: int
     COUNT_FLAG_FIELD_NUMBER: int
-    crm_buf: bytes = ...
-    msg_resid: bytes = ...
-    qidian_flag: int = ...
-    push_flag: int = ...
-    count_flag: int = ...
-
+    crm_buf: bytes
+    msg_resid: bytes
+    qidian_flag: int
+    push_flag: int
+    count_flag: int
     def __init__(self,
         *,
-        crm_buf : Optional[bytes] = ...,
-        msg_resid : Optional[bytes] = ...,
-        qidian_flag : Optional[int] = ...,
-        push_flag : Optional[int] = ...,
-        count_flag : Optional[int] = ...,
+        crm_buf: Optional[bytes] = ...,
+        msg_resid: Optional[bytes] = ...,
+        qidian_flag: Optional[int] = ...,
+        push_flag: Optional[int] = ...,
+        count_flag: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"count_flag",b"count_flag",u"crm_buf",b"crm_buf",u"msg_resid",b"msg_resid",u"push_flag",b"push_flag",u"qidian_flag",b"qidian_flag"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"count_flag",b"count_flag",u"crm_buf",b"crm_buf",u"msg_resid",b"msg_resid",u"push_flag",b"push_flag",u"qidian_flag",b"qidian_flag"]) -> None: ...
+    def HasField(self, field_name: Literal["count_flag",b"count_flag","crm_buf",b"crm_buf","msg_resid",b"msg_resid","push_flag",b"push_flag","qidian_flag",b"qidian_flag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["count_flag",b"count_flag","crm_buf",b"crm_buf","msg_resid",b"msg_resid","push_flag",b"push_flag","qidian_flag",b"qidian_flag"]) -> None: ...
 
 class CustomElem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     DESC_FIELD_NUMBER: int
     DATA_FIELD_NUMBER: int
     ENUM_TYPE_FIELD_NUMBER: int
     EXT_FIELD_NUMBER: int
     SOUND_FIELD_NUMBER: int
-    desc: bytes = ...
-    data: bytes = ...
-    enum_type: int = ...
-    ext: bytes = ...
-    sound: bytes = ...
-
+    desc: bytes
+    data: bytes
+    enum_type: int
+    ext: bytes
+    sound: bytes
     def __init__(self,
         *,
-        desc : Optional[bytes] = ...,
-        data : Optional[bytes] = ...,
-        enum_type : Optional[int] = ...,
-        ext : Optional[bytes] = ...,
-        sound : Optional[bytes] = ...,
+        desc: Optional[bytes] = ...,
+        data: Optional[bytes] = ...,
+        enum_type: Optional[int] = ...,
+        ext: Optional[bytes] = ...,
+        sound: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"data",b"data",u"desc",b"desc",u"enum_type",b"enum_type",u"ext",b"ext",u"sound",b"sound"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"data",b"data",u"desc",b"desc",u"enum_type",b"enum_type",u"ext",b"ext",u"sound",b"sound"]) -> None: ...
+    def HasField(self, field_name: Literal["data",b"data","desc",b"desc","enum_type",b"enum_type","ext",b"ext","sound",b"sound"]) -> bool: ...
+    def ClearField(self, field_name: Literal["data",b"data","desc",b"desc","enum_type",b"enum_type","ext",b"ext","sound",b"sound"]) -> None: ...
 
 class CustomFace(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GUID_FIELD_NUMBER: int
     FILE_PATH_FIELD_NUMBER: int
     SHORTCUT_FIELD_NUMBER: int
@@ -321,83 +314,82 @@ class CustomFace(Message):
     _400_WIDTH_FIELD_NUMBER: int
     _400_HEIGHT_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
-    guid: bytes = ...
-    file_path: Text = ...
-    shortcut: Text = ...
-    buffer: bytes = ...
-    flag: bytes = ...
-    old_data: bytes = ...
-    file_id: int = ...
-    server_ip: int = ...
-    server_port: int = ...
-    file_type: int = ...
-    signature: bytes = ...
-    useful: int = ...
-    md5: bytes = ...
-    thumb_url: Text = ...
-    big_url: Text = ...
-    orig_url: Text = ...
-    biz_type: int = ...
-    repeat_index: int = ...
-    repeat_image: int = ...
-    image_type: int = ...
-    index: int = ...
-    width: int = ...
-    height: int = ...
-    source: int = ...
-    size: int = ...
-    origin: int = ...
-    thumb_width: int = ...
-    thumb_height: int = ...
-    show_len: int = ...
-    download_len: int = ...
-    _400_url: Text = ...
-    _400_width: int = ...
-    _400_height: int = ...
-    pb_reserve: bytes = ...
-
-    def __init__(self,
-        *,
-        guid : Optional[bytes] = ...,
-        file_path : Optional[Text] = ...,
-        shortcut : Optional[Text] = ...,
-        buffer : Optional[bytes] = ...,
-        flag : Optional[bytes] = ...,
-        old_data : Optional[bytes] = ...,
-        file_id : Optional[int] = ...,
-        server_ip : Optional[int] = ...,
-        server_port : Optional[int] = ...,
-        file_type : Optional[int] = ...,
-        signature : Optional[bytes] = ...,
-        useful : Optional[int] = ...,
-        md5 : Optional[bytes] = ...,
-        thumb_url : Optional[Text] = ...,
-        big_url : Optional[Text] = ...,
-        orig_url : Optional[Text] = ...,
-        biz_type : Optional[int] = ...,
-        repeat_index : Optional[int] = ...,
-        repeat_image : Optional[int] = ...,
-        image_type : Optional[int] = ...,
-        index : Optional[int] = ...,
-        width : Optional[int] = ...,
-        height : Optional[int] = ...,
-        source : Optional[int] = ...,
-        size : Optional[int] = ...,
-        origin : Optional[int] = ...,
-        thumb_width : Optional[int] = ...,
-        thumb_height : Optional[int] = ...,
-        show_len : Optional[int] = ...,
-        download_len : Optional[int] = ...,
-        _400_url : Optional[Text] = ...,
-        _400_width : Optional[int] = ...,
-        _400_height : Optional[int] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"_400_height",b"_400_height",u"_400_url",b"_400_url",u"_400_width",b"_400_width",u"big_url",b"big_url",u"biz_type",b"biz_type",u"buffer",b"buffer",u"download_len",b"download_len",u"file_id",b"file_id",u"file_path",b"file_path",u"file_type",b"file_type",u"flag",b"flag",u"guid",b"guid",u"height",b"height",u"image_type",b"image_type",u"index",b"index",u"md5",b"md5",u"old_data",b"old_data",u"orig_url",b"orig_url",u"origin",b"origin",u"pb_reserve",b"pb_reserve",u"repeat_image",b"repeat_image",u"repeat_index",b"repeat_index",u"server_ip",b"server_ip",u"server_port",b"server_port",u"shortcut",b"shortcut",u"show_len",b"show_len",u"signature",b"signature",u"size",b"size",u"source",b"source",u"thumb_height",b"thumb_height",u"thumb_url",b"thumb_url",u"thumb_width",b"thumb_width",u"useful",b"useful",u"width",b"width"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"_400_height",b"_400_height",u"_400_url",b"_400_url",u"_400_width",b"_400_width",u"big_url",b"big_url",u"biz_type",b"biz_type",u"buffer",b"buffer",u"download_len",b"download_len",u"file_id",b"file_id",u"file_path",b"file_path",u"file_type",b"file_type",u"flag",b"flag",u"guid",b"guid",u"height",b"height",u"image_type",b"image_type",u"index",b"index",u"md5",b"md5",u"old_data",b"old_data",u"orig_url",b"orig_url",u"origin",b"origin",u"pb_reserve",b"pb_reserve",u"repeat_image",b"repeat_image",u"repeat_index",b"repeat_index",u"server_ip",b"server_ip",u"server_port",b"server_port",u"shortcut",b"shortcut",u"show_len",b"show_len",u"signature",b"signature",u"size",b"size",u"source",b"source",u"thumb_height",b"thumb_height",u"thumb_url",b"thumb_url",u"thumb_width",b"thumb_width",u"useful",b"useful",u"width",b"width"]) -> None: ...
+    guid: bytes
+    file_path: Text
+    shortcut: Text
+    buffer: bytes
+    flag: bytes
+    old_data: bytes
+    file_id: int
+    server_ip: int
+    server_port: int
+    file_type: int
+    signature: bytes
+    useful: int
+    md5: bytes
+    thumb_url: Text
+    big_url: Text
+    orig_url: Text
+    biz_type: int
+    repeat_index: int
+    repeat_image: int
+    image_type: int
+    index: int
+    width: int
+    height: int
+    source: int
+    size: int
+    origin: int
+    thumb_width: int
+    thumb_height: int
+    show_len: int
+    download_len: int
+    _400_url: Text
+    _400_width: int
+    _400_height: int
+    pb_reserve: bytes
+    def __init__(self,
+        *,
+        guid: Optional[bytes] = ...,
+        file_path: Optional[Text] = ...,
+        shortcut: Optional[Text] = ...,
+        buffer: Optional[bytes] = ...,
+        flag: Optional[bytes] = ...,
+        old_data: Optional[bytes] = ...,
+        file_id: Optional[int] = ...,
+        server_ip: Optional[int] = ...,
+        server_port: Optional[int] = ...,
+        file_type: Optional[int] = ...,
+        signature: Optional[bytes] = ...,
+        useful: Optional[int] = ...,
+        md5: Optional[bytes] = ...,
+        thumb_url: Optional[Text] = ...,
+        big_url: Optional[Text] = ...,
+        orig_url: Optional[Text] = ...,
+        biz_type: Optional[int] = ...,
+        repeat_index: Optional[int] = ...,
+        repeat_image: Optional[int] = ...,
+        image_type: Optional[int] = ...,
+        index: Optional[int] = ...,
+        width: Optional[int] = ...,
+        height: Optional[int] = ...,
+        source: Optional[int] = ...,
+        size: Optional[int] = ...,
+        origin: Optional[int] = ...,
+        thumb_width: Optional[int] = ...,
+        thumb_height: Optional[int] = ...,
+        show_len: Optional[int] = ...,
+        download_len: Optional[int] = ...,
+        _400_url: Optional[Text] = ...,
+        _400_width: Optional[int] = ...,
+        _400_height: Optional[int] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["_400_height",b"_400_height","_400_url",b"_400_url","_400_width",b"_400_width","big_url",b"big_url","biz_type",b"biz_type","buffer",b"buffer","download_len",b"download_len","file_id",b"file_id","file_path",b"file_path","file_type",b"file_type","flag",b"flag","guid",b"guid","height",b"height","image_type",b"image_type","index",b"index","md5",b"md5","old_data",b"old_data","orig_url",b"orig_url","origin",b"origin","pb_reserve",b"pb_reserve","repeat_image",b"repeat_image","repeat_index",b"repeat_index","server_ip",b"server_ip","server_port",b"server_port","shortcut",b"shortcut","show_len",b"show_len","signature",b"signature","size",b"size","source",b"source","thumb_height",b"thumb_height","thumb_url",b"thumb_url","thumb_width",b"thumb_width","useful",b"useful","width",b"width"]) -> bool: ...
+    def ClearField(self, field_name: Literal["_400_height",b"_400_height","_400_url",b"_400_url","_400_width",b"_400_width","big_url",b"big_url","biz_type",b"biz_type","buffer",b"buffer","download_len",b"download_len","file_id",b"file_id","file_path",b"file_path","file_type",b"file_type","flag",b"flag","guid",b"guid","height",b"height","image_type",b"image_type","index",b"index","md5",b"md5","old_data",b"old_data","orig_url",b"orig_url","origin",b"origin","pb_reserve",b"pb_reserve","repeat_image",b"repeat_image","repeat_index",b"repeat_index","server_ip",b"server_ip","server_port",b"server_port","shortcut",b"shortcut","show_len",b"show_len","signature",b"signature","size",b"size","source",b"source","thumb_height",b"thumb_height","thumb_url",b"thumb_url","thumb_width",b"thumb_width","useful",b"useful","width",b"width"]) -> None: ...
 
 class DeliverGiftMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GRAY_TIP_CONTENT_FIELD_NUMBER: int
     ANIMATION_PACKAGE_ID_FIELD_NUMBER: int
     ANIMATION_PACKAGE_URL_A_FIELD_NUMBER: int
@@ -420,74 +412,72 @@ class DeliverGiftMsg(Message):
     RECEIVER_NAME_FIELD_NUMBER: int
     RECEIVER_PIC_FIELD_NUMBER: int
     STMESSAGE_GIFTURL_FIELD_NUMBER: int
-    gray_tip_content: bytes = ...
-    animation_package_id: int = ...
-    animation_package_url_a: bytes = ...
-    animation_package_url_i: bytes = ...
-    remind_brief: bytes = ...
-    gift_id: int = ...
-    gift_count: int = ...
-    animation_brief: bytes = ...
-    sender_uin: int = ...
-    receiver_uin: int = ...
-    stmessage_title: bytes = ...
-    stmessage_subtitle: bytes = ...
-    stmessage_message: bytes = ...
-    stmessage_giftpicid: int = ...
-    stmessage_comefrom: bytes = ...
-    stmessage_exflag: int = ...
-    to_all_gift_id: bytes = ...
-    comefrom_link: bytes = ...
-    pb_reserve: bytes = ...
-    receiver_name: bytes = ...
-    receiver_pic: bytes = ...
-    stmessage_gifturl: bytes = ...
-
-    def __init__(self,
-        *,
-        gray_tip_content : Optional[bytes] = ...,
-        animation_package_id : Optional[int] = ...,
-        animation_package_url_a : Optional[bytes] = ...,
-        animation_package_url_i : Optional[bytes] = ...,
-        remind_brief : Optional[bytes] = ...,
-        gift_id : Optional[int] = ...,
-        gift_count : Optional[int] = ...,
-        animation_brief : Optional[bytes] = ...,
-        sender_uin : Optional[int] = ...,
-        receiver_uin : Optional[int] = ...,
-        stmessage_title : Optional[bytes] = ...,
-        stmessage_subtitle : Optional[bytes] = ...,
-        stmessage_message : Optional[bytes] = ...,
-        stmessage_giftpicid : Optional[int] = ...,
-        stmessage_comefrom : Optional[bytes] = ...,
-        stmessage_exflag : Optional[int] = ...,
-        to_all_gift_id : Optional[bytes] = ...,
-        comefrom_link : Optional[bytes] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        receiver_name : Optional[bytes] = ...,
-        receiver_pic : Optional[bytes] = ...,
-        stmessage_gifturl : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"animation_brief",b"animation_brief",u"animation_package_id",b"animation_package_id",u"animation_package_url_a",b"animation_package_url_a",u"animation_package_url_i",b"animation_package_url_i",u"comefrom_link",b"comefrom_link",u"gift_count",b"gift_count",u"gift_id",b"gift_id",u"gray_tip_content",b"gray_tip_content",u"pb_reserve",b"pb_reserve",u"receiver_name",b"receiver_name",u"receiver_pic",b"receiver_pic",u"receiver_uin",b"receiver_uin",u"remind_brief",b"remind_brief",u"sender_uin",b"sender_uin",u"stmessage_comefrom",b"stmessage_comefrom",u"stmessage_exflag",b"stmessage_exflag",u"stmessage_giftpicid",b"stmessage_giftpicid",u"stmessage_gifturl",b"stmessage_gifturl",u"stmessage_message",b"stmessage_message",u"stmessage_subtitle",b"stmessage_subtitle",u"stmessage_title",b"stmessage_title",u"to_all_gift_id",b"to_all_gift_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"animation_brief",b"animation_brief",u"animation_package_id",b"animation_package_id",u"animation_package_url_a",b"animation_package_url_a",u"animation_package_url_i",b"animation_package_url_i",u"comefrom_link",b"comefrom_link",u"gift_count",b"gift_count",u"gift_id",b"gift_id",u"gray_tip_content",b"gray_tip_content",u"pb_reserve",b"pb_reserve",u"receiver_name",b"receiver_name",u"receiver_pic",b"receiver_pic",u"receiver_uin",b"receiver_uin",u"remind_brief",b"remind_brief",u"sender_uin",b"sender_uin",u"stmessage_comefrom",b"stmessage_comefrom",u"stmessage_exflag",b"stmessage_exflag",u"stmessage_giftpicid",b"stmessage_giftpicid",u"stmessage_gifturl",b"stmessage_gifturl",u"stmessage_message",b"stmessage_message",u"stmessage_subtitle",b"stmessage_subtitle",u"stmessage_title",b"stmessage_title",u"to_all_gift_id",b"to_all_gift_id"]) -> None: ...
+    gray_tip_content: bytes
+    animation_package_id: int
+    animation_package_url_a: bytes
+    animation_package_url_i: bytes
+    remind_brief: bytes
+    gift_id: int
+    gift_count: int
+    animation_brief: bytes
+    sender_uin: int
+    receiver_uin: int
+    stmessage_title: bytes
+    stmessage_subtitle: bytes
+    stmessage_message: bytes
+    stmessage_giftpicid: int
+    stmessage_comefrom: bytes
+    stmessage_exflag: int
+    to_all_gift_id: bytes
+    comefrom_link: bytes
+    pb_reserve: bytes
+    receiver_name: bytes
+    receiver_pic: bytes
+    stmessage_gifturl: bytes
+    def __init__(self,
+        *,
+        gray_tip_content: Optional[bytes] = ...,
+        animation_package_id: Optional[int] = ...,
+        animation_package_url_a: Optional[bytes] = ...,
+        animation_package_url_i: Optional[bytes] = ...,
+        remind_brief: Optional[bytes] = ...,
+        gift_id: Optional[int] = ...,
+        gift_count: Optional[int] = ...,
+        animation_brief: Optional[bytes] = ...,
+        sender_uin: Optional[int] = ...,
+        receiver_uin: Optional[int] = ...,
+        stmessage_title: Optional[bytes] = ...,
+        stmessage_subtitle: Optional[bytes] = ...,
+        stmessage_message: Optional[bytes] = ...,
+        stmessage_giftpicid: Optional[int] = ...,
+        stmessage_comefrom: Optional[bytes] = ...,
+        stmessage_exflag: Optional[int] = ...,
+        to_all_gift_id: Optional[bytes] = ...,
+        comefrom_link: Optional[bytes] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        receiver_name: Optional[bytes] = ...,
+        receiver_pic: Optional[bytes] = ...,
+        stmessage_gifturl: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["animation_brief",b"animation_brief","animation_package_id",b"animation_package_id","animation_package_url_a",b"animation_package_url_a","animation_package_url_i",b"animation_package_url_i","comefrom_link",b"comefrom_link","gift_count",b"gift_count","gift_id",b"gift_id","gray_tip_content",b"gray_tip_content","pb_reserve",b"pb_reserve","receiver_name",b"receiver_name","receiver_pic",b"receiver_pic","receiver_uin",b"receiver_uin","remind_brief",b"remind_brief","sender_uin",b"sender_uin","stmessage_comefrom",b"stmessage_comefrom","stmessage_exflag",b"stmessage_exflag","stmessage_giftpicid",b"stmessage_giftpicid","stmessage_gifturl",b"stmessage_gifturl","stmessage_message",b"stmessage_message","stmessage_subtitle",b"stmessage_subtitle","stmessage_title",b"stmessage_title","to_all_gift_id",b"to_all_gift_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["animation_brief",b"animation_brief","animation_package_id",b"animation_package_id","animation_package_url_a",b"animation_package_url_a","animation_package_url_i",b"animation_package_url_i","comefrom_link",b"comefrom_link","gift_count",b"gift_count","gift_id",b"gift_id","gray_tip_content",b"gray_tip_content","pb_reserve",b"pb_reserve","receiver_name",b"receiver_name","receiver_pic",b"receiver_pic","receiver_uin",b"receiver_uin","remind_brief",b"remind_brief","sender_uin",b"sender_uin","stmessage_comefrom",b"stmessage_comefrom","stmessage_exflag",b"stmessage_exflag","stmessage_giftpicid",b"stmessage_giftpicid","stmessage_gifturl",b"stmessage_gifturl","stmessage_message",b"stmessage_message","stmessage_subtitle",b"stmessage_subtitle","stmessage_title",b"stmessage_title","to_all_gift_id",b"to_all_gift_id"]) -> None: ...
 
 class EIMInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     ROOT_ID_FIELD_NUMBER: int
     FLAG_FIELD_NUMBER: int
-    root_id: int = ...
-    flag: int = ...
-
+    root_id: int
+    flag: int
     def __init__(self,
         *,
-        root_id : Optional[int] = ...,
-        flag : Optional[int] = ...,
+        root_id: Optional[int] = ...,
+        flag: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"flag",b"flag",u"root_id",b"root_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"flag",b"flag",u"root_id",b"root_id"]) -> None: ...
+    def HasField(self, field_name: Literal["flag",b"flag","root_id",b"root_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["flag",b"flag","root_id",b"root_id"]) -> None: ...
 
 class Elem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TEXT_FIELD_NUMBER: int
     FACE_FIELD_NUMBER: int
     ONLINE_IMAGE_FIELD_NUMBER: int
@@ -541,240 +531,186 @@ class Elem(Message):
     LIGHT_APP_FIELD_NUMBER: int
     EIM_INFO_FIELD_NUMBER: int
     COMMON_ELEM_FIELD_NUMBER: int
-    bankcode_ctrl_info: bytes = ...
-
     @property
     def text(self) -> PlainText: ...
-
     @property
     def face(self) -> Face: ...
-
     @property
     def online_image(self) -> OnlineImage: ...
-
     @property
     def not_online_image(self) -> NotOnlineImage: ...
-
     @property
     def trans_elem_info(self) -> TransElem: ...
-
     @property
     def market_face(self) -> MarketFace: ...
-
     @property
     def elem_flags(self) -> ElemFlags: ...
-
     @property
     def custom_face(self) -> CustomFace: ...
-
     @property
     def elem_flags2(self) -> ElemFlags2: ...
-
     @property
     def fun_face(self) -> FunFace: ...
-
     @property
     def secret_file(self) -> SecretFileMsg: ...
-
     @property
     def rich_msg(self) -> RichMsg: ...
-
     @property
     def group_file(self) -> GroupFile: ...
-
     @property
     def pub_group(self) -> PubGroup: ...
-
     @property
     def market_trans(self) -> MarketTrans: ...
-
     @property
     def extra_info(self) -> ExtraInfo: ...
-
     @property
     def shake_window(self) -> ShakeWindow: ...
-
     @property
     def pub_account(self) -> PubAccount: ...
-
     @property
     def video_file(self) -> VideoFile: ...
-
     @property
     def tips_info(self) -> TipsInfo: ...
-
     @property
     def anon_group_msg(self) -> AnonymousGroupMsg: ...
-
     @property
     def qq_live_old(self) -> QQLiveOld: ...
-
     @property
     def life_online(self) -> LifeOnlineAccount: ...
-
     @property
     def qqwallet_msg(self) -> QQWalletMsg: ...
-
     @property
     def crm_elem(self) -> CrmElem: ...
-
     @property
     def conference_tips_info(self) -> ConferenceTipsInfo: ...
-
     @property
     def redbag_info(self) -> RedBagInfo: ...
-
     @property
     def low_version_tips(self) -> LowVersionTips: ...
-
+    bankcode_ctrl_info: bytes
     @property
     def near_by_msg(self) -> NearByMessageType: ...
-
     @property
     def custom_elem(self) -> CustomElem: ...
-
     @property
     def location_info(self) -> LocationInfo: ...
-
     @property
     def pub_acc_info(self) -> PubAccInfo: ...
-
     @property
     def small_emoji(self) -> SmallEmoji: ...
-
     @property
     def fsj_msg_elem(self) -> FSJMessageElem: ...
-
     @property
     def ark_app(self) -> ArkAppElem: ...
-
     @property
     def general_flags(self) -> GeneralFlags: ...
-
     @property
     def hc_flash_pic(self) -> CustomFace: ...
-
     @property
     def deliver_gift_msg(self) -> DeliverGiftMsg: ...
-
     @property
     def bitapp_msg(self) -> BitAppMsg: ...
-
     @property
     def open_qq_data(self) -> OpenQQData: ...
-
     @property
     def apollo_msg(self) -> ApolloActMsg: ...
-
     @property
     def group_pub_acc_info(self) -> GroupPubAccountInfo: ...
-
     @property
     def bless_msg(self) -> BlessingMessage: ...
-
     @property
     def src_msg(self) -> SourceMsg: ...
-
     @property
     def lola_msg(self) -> LolaMsg: ...
-
     @property
     def group_business_msg(self) -> GroupBusinessMsg: ...
-
     @property
     def workflow_notify(self) -> WorkflowNotifyMsg: ...
-
     @property
     def pat_elem(self) -> PatsElem: ...
-
     @property
     def group_post_elem(self) -> GroupPostElem: ...
-
     @property
     def light_app(self) -> LightAppElem: ...
-
     @property
     def eim_info(self) -> EIMInfo: ...
-
     @property
     def common_elem(self) -> CommonElem: ...
-
     def __init__(self,
         *,
-        text : Optional[PlainText] = ...,
-        face : Optional[Face] = ...,
-        online_image : Optional[OnlineImage] = ...,
-        not_online_image : Optional[NotOnlineImage] = ...,
-        trans_elem_info : Optional[TransElem] = ...,
-        market_face : Optional[MarketFace] = ...,
-        elem_flags : Optional[ElemFlags] = ...,
-        custom_face : Optional[CustomFace] = ...,
-        elem_flags2 : Optional[ElemFlags2] = ...,
-        fun_face : Optional[FunFace] = ...,
-        secret_file : Optional[SecretFileMsg] = ...,
-        rich_msg : Optional[RichMsg] = ...,
-        group_file : Optional[GroupFile] = ...,
-        pub_group : Optional[PubGroup] = ...,
-        market_trans : Optional[MarketTrans] = ...,
-        extra_info : Optional[ExtraInfo] = ...,
-        shake_window : Optional[ShakeWindow] = ...,
-        pub_account : Optional[PubAccount] = ...,
-        video_file : Optional[VideoFile] = ...,
-        tips_info : Optional[TipsInfo] = ...,
-        anon_group_msg : Optional[AnonymousGroupMsg] = ...,
-        qq_live_old : Optional[QQLiveOld] = ...,
-        life_online : Optional[LifeOnlineAccount] = ...,
-        qqwallet_msg : Optional[QQWalletMsg] = ...,
-        crm_elem : Optional[CrmElem] = ...,
-        conference_tips_info : Optional[ConferenceTipsInfo] = ...,
-        redbag_info : Optional[RedBagInfo] = ...,
-        low_version_tips : Optional[LowVersionTips] = ...,
-        bankcode_ctrl_info : Optional[bytes] = ...,
-        near_by_msg : Optional[NearByMessageType] = ...,
-        custom_elem : Optional[CustomElem] = ...,
-        location_info : Optional[LocationInfo] = ...,
-        pub_acc_info : Optional[PubAccInfo] = ...,
-        small_emoji : Optional[SmallEmoji] = ...,
-        fsj_msg_elem : Optional[FSJMessageElem] = ...,
-        ark_app : Optional[ArkAppElem] = ...,
-        general_flags : Optional[GeneralFlags] = ...,
-        hc_flash_pic : Optional[CustomFace] = ...,
-        deliver_gift_msg : Optional[DeliverGiftMsg] = ...,
-        bitapp_msg : Optional[BitAppMsg] = ...,
-        open_qq_data : Optional[OpenQQData] = ...,
-        apollo_msg : Optional[ApolloActMsg] = ...,
-        group_pub_acc_info : Optional[GroupPubAccountInfo] = ...,
-        bless_msg : Optional[BlessingMessage] = ...,
-        src_msg : Optional[SourceMsg] = ...,
-        lola_msg : Optional[LolaMsg] = ...,
-        group_business_msg : Optional[GroupBusinessMsg] = ...,
-        workflow_notify : Optional[WorkflowNotifyMsg] = ...,
-        pat_elem : Optional[PatsElem] = ...,
-        group_post_elem : Optional[GroupPostElem] = ...,
-        light_app : Optional[LightAppElem] = ...,
-        eim_info : Optional[EIMInfo] = ...,
-        common_elem : Optional[CommonElem] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"anon_group_msg",b"anon_group_msg",u"apollo_msg",b"apollo_msg",u"ark_app",b"ark_app",u"bankcode_ctrl_info",b"bankcode_ctrl_info",u"bitapp_msg",b"bitapp_msg",u"bless_msg",b"bless_msg",u"common_elem",b"common_elem",u"conference_tips_info",b"conference_tips_info",u"crm_elem",b"crm_elem",u"custom_elem",b"custom_elem",u"custom_face",b"custom_face",u"deliver_gift_msg",b"deliver_gift_msg",u"eim_info",b"eim_info",u"elem_flags",b"elem_flags",u"elem_flags2",b"elem_flags2",u"extra_info",b"extra_info",u"face",b"face",u"fsj_msg_elem",b"fsj_msg_elem",u"fun_face",b"fun_face",u"general_flags",b"general_flags",u"group_business_msg",b"group_business_msg",u"group_file",b"group_file",u"group_post_elem",b"group_post_elem",u"group_pub_acc_info",b"group_pub_acc_info",u"hc_flash_pic",b"hc_flash_pic",u"life_online",b"life_online",u"light_app",b"light_app",u"location_info",b"location_info",u"lola_msg",b"lola_msg",u"low_version_tips",b"low_version_tips",u"market_face",b"market_face",u"market_trans",b"market_trans",u"near_by_msg",b"near_by_msg",u"not_online_image",b"not_online_image",u"online_image",b"online_image",u"open_qq_data",b"open_qq_data",u"pat_elem",b"pat_elem",u"pub_acc_info",b"pub_acc_info",u"pub_account",b"pub_account",u"pub_group",b"pub_group",u"qq_live_old",b"qq_live_old",u"qqwallet_msg",b"qqwallet_msg",u"redbag_info",b"redbag_info",u"rich_msg",b"rich_msg",u"secret_file",b"secret_file",u"shake_window",b"shake_window",u"small_emoji",b"small_emoji",u"src_msg",b"src_msg",u"text",b"text",u"tips_info",b"tips_info",u"trans_elem_info",b"trans_elem_info",u"video_file",b"video_file",u"workflow_notify",b"workflow_notify"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"anon_group_msg",b"anon_group_msg",u"apollo_msg",b"apollo_msg",u"ark_app",b"ark_app",u"bankcode_ctrl_info",b"bankcode_ctrl_info",u"bitapp_msg",b"bitapp_msg",u"bless_msg",b"bless_msg",u"common_elem",b"common_elem",u"conference_tips_info",b"conference_tips_info",u"crm_elem",b"crm_elem",u"custom_elem",b"custom_elem",u"custom_face",b"custom_face",u"deliver_gift_msg",b"deliver_gift_msg",u"eim_info",b"eim_info",u"elem_flags",b"elem_flags",u"elem_flags2",b"elem_flags2",u"extra_info",b"extra_info",u"face",b"face",u"fsj_msg_elem",b"fsj_msg_elem",u"fun_face",b"fun_face",u"general_flags",b"general_flags",u"group_business_msg",b"group_business_msg",u"group_file",b"group_file",u"group_post_elem",b"group_post_elem",u"group_pub_acc_info",b"group_pub_acc_info",u"hc_flash_pic",b"hc_flash_pic",u"life_online",b"life_online",u"light_app",b"light_app",u"location_info",b"location_info",u"lola_msg",b"lola_msg",u"low_version_tips",b"low_version_tips",u"market_face",b"market_face",u"market_trans",b"market_trans",u"near_by_msg",b"near_by_msg",u"not_online_image",b"not_online_image",u"online_image",b"online_image",u"open_qq_data",b"open_qq_data",u"pat_elem",b"pat_elem",u"pub_acc_info",b"pub_acc_info",u"pub_account",b"pub_account",u"pub_group",b"pub_group",u"qq_live_old",b"qq_live_old",u"qqwallet_msg",b"qqwallet_msg",u"redbag_info",b"redbag_info",u"rich_msg",b"rich_msg",u"secret_file",b"secret_file",u"shake_window",b"shake_window",u"small_emoji",b"small_emoji",u"src_msg",b"src_msg",u"text",b"text",u"tips_info",b"tips_info",u"trans_elem_info",b"trans_elem_info",u"video_file",b"video_file",u"workflow_notify",b"workflow_notify"]) -> None: ...
+        text: Optional[PlainText] = ...,
+        face: Optional[Face] = ...,
+        online_image: Optional[OnlineImage] = ...,
+        not_online_image: Optional[NotOnlineImage] = ...,
+        trans_elem_info: Optional[TransElem] = ...,
+        market_face: Optional[MarketFace] = ...,
+        elem_flags: Optional[ElemFlags] = ...,
+        custom_face: Optional[CustomFace] = ...,
+        elem_flags2: Optional[ElemFlags2] = ...,
+        fun_face: Optional[FunFace] = ...,
+        secret_file: Optional[SecretFileMsg] = ...,
+        rich_msg: Optional[RichMsg] = ...,
+        group_file: Optional[GroupFile] = ...,
+        pub_group: Optional[PubGroup] = ...,
+        market_trans: Optional[MarketTrans] = ...,
+        extra_info: Optional[ExtraInfo] = ...,
+        shake_window: Optional[ShakeWindow] = ...,
+        pub_account: Optional[PubAccount] = ...,
+        video_file: Optional[VideoFile] = ...,
+        tips_info: Optional[TipsInfo] = ...,
+        anon_group_msg: Optional[AnonymousGroupMsg] = ...,
+        qq_live_old: Optional[QQLiveOld] = ...,
+        life_online: Optional[LifeOnlineAccount] = ...,
+        qqwallet_msg: Optional[QQWalletMsg] = ...,
+        crm_elem: Optional[CrmElem] = ...,
+        conference_tips_info: Optional[ConferenceTipsInfo] = ...,
+        redbag_info: Optional[RedBagInfo] = ...,
+        low_version_tips: Optional[LowVersionTips] = ...,
+        bankcode_ctrl_info: Optional[bytes] = ...,
+        near_by_msg: Optional[NearByMessageType] = ...,
+        custom_elem: Optional[CustomElem] = ...,
+        location_info: Optional[LocationInfo] = ...,
+        pub_acc_info: Optional[PubAccInfo] = ...,
+        small_emoji: Optional[SmallEmoji] = ...,
+        fsj_msg_elem: Optional[FSJMessageElem] = ...,
+        ark_app: Optional[ArkAppElem] = ...,
+        general_flags: Optional[GeneralFlags] = ...,
+        hc_flash_pic: Optional[CustomFace] = ...,
+        deliver_gift_msg: Optional[DeliverGiftMsg] = ...,
+        bitapp_msg: Optional[BitAppMsg] = ...,
+        open_qq_data: Optional[OpenQQData] = ...,
+        apollo_msg: Optional[ApolloActMsg] = ...,
+        group_pub_acc_info: Optional[GroupPubAccountInfo] = ...,
+        bless_msg: Optional[BlessingMessage] = ...,
+        src_msg: Optional[SourceMsg] = ...,
+        lola_msg: Optional[LolaMsg] = ...,
+        group_business_msg: Optional[GroupBusinessMsg] = ...,
+        workflow_notify: Optional[WorkflowNotifyMsg] = ...,
+        pat_elem: Optional[PatsElem] = ...,
+        group_post_elem: Optional[GroupPostElem] = ...,
+        light_app: Optional[LightAppElem] = ...,
+        eim_info: Optional[EIMInfo] = ...,
+        common_elem: Optional[CommonElem] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["anon_group_msg",b"anon_group_msg","apollo_msg",b"apollo_msg","ark_app",b"ark_app","bankcode_ctrl_info",b"bankcode_ctrl_info","bitapp_msg",b"bitapp_msg","bless_msg",b"bless_msg","common_elem",b"common_elem","conference_tips_info",b"conference_tips_info","crm_elem",b"crm_elem","custom_elem",b"custom_elem","custom_face",b"custom_face","deliver_gift_msg",b"deliver_gift_msg","eim_info",b"eim_info","elem_flags",b"elem_flags","elem_flags2",b"elem_flags2","extra_info",b"extra_info","face",b"face","fsj_msg_elem",b"fsj_msg_elem","fun_face",b"fun_face","general_flags",b"general_flags","group_business_msg",b"group_business_msg","group_file",b"group_file","group_post_elem",b"group_post_elem","group_pub_acc_info",b"group_pub_acc_info","hc_flash_pic",b"hc_flash_pic","life_online",b"life_online","light_app",b"light_app","location_info",b"location_info","lola_msg",b"lola_msg","low_version_tips",b"low_version_tips","market_face",b"market_face","market_trans",b"market_trans","near_by_msg",b"near_by_msg","not_online_image",b"not_online_image","online_image",b"online_image","open_qq_data",b"open_qq_data","pat_elem",b"pat_elem","pub_acc_info",b"pub_acc_info","pub_account",b"pub_account","pub_group",b"pub_group","qq_live_old",b"qq_live_old","qqwallet_msg",b"qqwallet_msg","redbag_info",b"redbag_info","rich_msg",b"rich_msg","secret_file",b"secret_file","shake_window",b"shake_window","small_emoji",b"small_emoji","src_msg",b"src_msg","text",b"text","tips_info",b"tips_info","trans_elem_info",b"trans_elem_info","video_file",b"video_file","workflow_notify",b"workflow_notify"]) -> bool: ...
+    def ClearField(self, field_name: Literal["anon_group_msg",b"anon_group_msg","apollo_msg",b"apollo_msg","ark_app",b"ark_app","bankcode_ctrl_info",b"bankcode_ctrl_info","bitapp_msg",b"bitapp_msg","bless_msg",b"bless_msg","common_elem",b"common_elem","conference_tips_info",b"conference_tips_info","crm_elem",b"crm_elem","custom_elem",b"custom_elem","custom_face",b"custom_face","deliver_gift_msg",b"deliver_gift_msg","eim_info",b"eim_info","elem_flags",b"elem_flags","elem_flags2",b"elem_flags2","extra_info",b"extra_info","face",b"face","fsj_msg_elem",b"fsj_msg_elem","fun_face",b"fun_face","general_flags",b"general_flags","group_business_msg",b"group_business_msg","group_file",b"group_file","group_post_elem",b"group_post_elem","group_pub_acc_info",b"group_pub_acc_info","hc_flash_pic",b"hc_flash_pic","life_online",b"life_online","light_app",b"light_app","location_info",b"location_info","lola_msg",b"lola_msg","low_version_tips",b"low_version_tips","market_face",b"market_face","market_trans",b"market_trans","near_by_msg",b"near_by_msg","not_online_image",b"not_online_image","online_image",b"online_image","open_qq_data",b"open_qq_data","pat_elem",b"pat_elem","pub_acc_info",b"pub_acc_info","pub_account",b"pub_account","pub_group",b"pub_group","qq_live_old",b"qq_live_old","qqwallet_msg",b"qqwallet_msg","redbag_info",b"redbag_info","rich_msg",b"rich_msg","secret_file",b"secret_file","shake_window",b"shake_window","small_emoji",b"small_emoji","src_msg",b"src_msg","text",b"text","tips_info",b"tips_info","trans_elem_info",b"trans_elem_info","video_file",b"video_file","workflow_notify",b"workflow_notify"]) -> None: ...
 
 class ElemFlags(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FLAGS1_FIELD_NUMBER: int
     BUSINESS_DATA_FIELD_NUMBER: int
-    flags1: bytes = ...
-    business_data: bytes = ...
-
+    flags1: bytes
+    business_data: bytes
     def __init__(self,
         *,
-        flags1 : Optional[bytes] = ...,
-        business_data : Optional[bytes] = ...,
+        flags1: Optional[bytes] = ...,
+        business_data: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"business_data",b"business_data",u"flags1",b"flags1"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"business_data",b"business_data",u"flags1",b"flags1"]) -> None: ...
+    def HasField(self, field_name: Literal["business_data",b"business_data","flags1",b"flags1"]) -> bool: ...
+    def ClearField(self, field_name: Literal["business_data",b"business_data","flags1",b"flags1"]) -> None: ...
 
 class ElemFlags2(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     COLOR_TEXT_ID_FIELD_NUMBER: int
     MSG_ID_FIELD_NUMBER: int
     WHISPER_SESSION_ID_FIELD_NUMBER: int
@@ -789,64 +725,59 @@ class ElemFlags2(Message):
     CUSTOM_FONT_FIELD_NUMBER: int
     PC_SUPPORT_DEF_FIELD_NUMBER: int
     CRM_FLAGS_FIELD_NUMBER: int
-    color_text_id: int = ...
-    msg_id: int = ...
-    whisper_session_id: int = ...
-    ptt_change_bit: int = ...
-    vip_status: int = ...
-    compatible_id: int = ...
-    msg_rpt_cnt: int = ...
-    longtitude: int = ...
-    latitude: int = ...
-    custom_font: int = ...
-    crm_flags: int = ...
-
+    color_text_id: int
+    msg_id: int
+    whisper_session_id: int
+    ptt_change_bit: int
+    vip_status: int
+    compatible_id: int
     @property
     def insts(self) -> RepeatedCompositeFieldContainer[Inst]: ...
-
+    msg_rpt_cnt: int
     @property
     def src_inst(self) -> Inst: ...
-
+    longtitude: int
+    latitude: int
+    custom_font: int
     @property
     def pc_support_def(self) -> PcSupportDef: ...
-
-    def __init__(self,
-        *,
-        color_text_id : Optional[int] = ...,
-        msg_id : Optional[int] = ...,
-        whisper_session_id : Optional[int] = ...,
-        ptt_change_bit : Optional[int] = ...,
-        vip_status : Optional[int] = ...,
-        compatible_id : Optional[int] = ...,
-        insts : Optional[Iterable[Inst]] = ...,
-        msg_rpt_cnt : Optional[int] = ...,
-        src_inst : Optional[Inst] = ...,
-        longtitude : Optional[int] = ...,
-        latitude : Optional[int] = ...,
-        custom_font : Optional[int] = ...,
-        pc_support_def : Optional[PcSupportDef] = ...,
-        crm_flags : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"color_text_id",b"color_text_id",u"compatible_id",b"compatible_id",u"crm_flags",b"crm_flags",u"custom_font",b"custom_font",u"latitude",b"latitude",u"longtitude",b"longtitude",u"msg_id",b"msg_id",u"msg_rpt_cnt",b"msg_rpt_cnt",u"pc_support_def",b"pc_support_def",u"ptt_change_bit",b"ptt_change_bit",u"src_inst",b"src_inst",u"vip_status",b"vip_status",u"whisper_session_id",b"whisper_session_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"color_text_id",b"color_text_id",u"compatible_id",b"compatible_id",u"crm_flags",b"crm_flags",u"custom_font",b"custom_font",u"insts",b"insts",u"latitude",b"latitude",u"longtitude",b"longtitude",u"msg_id",b"msg_id",u"msg_rpt_cnt",b"msg_rpt_cnt",u"pc_support_def",b"pc_support_def",u"ptt_change_bit",b"ptt_change_bit",u"src_inst",b"src_inst",u"vip_status",b"vip_status",u"whisper_session_id",b"whisper_session_id"]) -> None: ...
+    crm_flags: int
+    def __init__(self,
+        *,
+        color_text_id: Optional[int] = ...,
+        msg_id: Optional[int] = ...,
+        whisper_session_id: Optional[int] = ...,
+        ptt_change_bit: Optional[int] = ...,
+        vip_status: Optional[int] = ...,
+        compatible_id: Optional[int] = ...,
+        insts: Optional[Iterable[Inst]] = ...,
+        msg_rpt_cnt: Optional[int] = ...,
+        src_inst: Optional[Inst] = ...,
+        longtitude: Optional[int] = ...,
+        latitude: Optional[int] = ...,
+        custom_font: Optional[int] = ...,
+        pc_support_def: Optional[PcSupportDef] = ...,
+        crm_flags: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["color_text_id",b"color_text_id","compatible_id",b"compatible_id","crm_flags",b"crm_flags","custom_font",b"custom_font","latitude",b"latitude","longtitude",b"longtitude","msg_id",b"msg_id","msg_rpt_cnt",b"msg_rpt_cnt","pc_support_def",b"pc_support_def","ptt_change_bit",b"ptt_change_bit","src_inst",b"src_inst","vip_status",b"vip_status","whisper_session_id",b"whisper_session_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["color_text_id",b"color_text_id","compatible_id",b"compatible_id","crm_flags",b"crm_flags","custom_font",b"custom_font","insts",b"insts","latitude",b"latitude","longtitude",b"longtitude","msg_id",b"msg_id","msg_rpt_cnt",b"msg_rpt_cnt","pc_support_def",b"pc_support_def","ptt_change_bit",b"ptt_change_bit","src_inst",b"src_inst","vip_status",b"vip_status","whisper_session_id",b"whisper_session_id"]) -> None: ...
 
 class Inst(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     APP_ID_FIELD_NUMBER: int
     INST_ID_FIELD_NUMBER: int
-    app_id: int = ...
-    inst_id: int = ...
-
+    app_id: int
+    inst_id: int
     def __init__(self,
         *,
-        app_id : Optional[int] = ...,
-        inst_id : Optional[int] = ...,
+        app_id: Optional[int] = ...,
+        inst_id: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"app_id",b"app_id",u"inst_id",b"inst_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"app_id",b"app_id",u"inst_id",b"inst_id"]) -> None: ...
+    def HasField(self, field_name: Literal["app_id",b"app_id","inst_id",b"inst_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["app_id",b"app_id","inst_id",b"inst_id"]) -> None: ...
 
 class ExtraInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     NICK_FIELD_NUMBER: int
     GROUP_CARD_FIELD_NUMBER: int
     LEVEL_FIELD_NUMBER: int
@@ -859,118 +790,111 @@ class ExtraInfo(Message):
     MSG_STATE_FLAG_FIELD_NUMBER: int
     APNS_SOUND_TYPE_FIELD_NUMBER: int
     NEW_GROUP_FLAG_FIELD_NUMBER: int
-    nick: bytes = ...
-    group_card: bytes = ...
-    level: int = ...
-    flags: int = ...
-    group_mask: int = ...
-    msg_tail_id: int = ...
-    sender_title: bytes = ...
-    apns_tips: bytes = ...
-    uin: int = ...
-    msg_state_flag: int = ...
-    apns_sound_type: int = ...
-    new_group_flag: int = ...
-
-    def __init__(self,
-        *,
-        nick : Optional[bytes] = ...,
-        group_card : Optional[bytes] = ...,
-        level : Optional[int] = ...,
-        flags : Optional[int] = ...,
-        group_mask : Optional[int] = ...,
-        msg_tail_id : Optional[int] = ...,
-        sender_title : Optional[bytes] = ...,
-        apns_tips : Optional[bytes] = ...,
-        uin : Optional[int] = ...,
-        msg_state_flag : Optional[int] = ...,
-        apns_sound_type : Optional[int] = ...,
-        new_group_flag : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"apns_sound_type",b"apns_sound_type",u"apns_tips",b"apns_tips",u"flags",b"flags",u"group_card",b"group_card",u"group_mask",b"group_mask",u"level",b"level",u"msg_state_flag",b"msg_state_flag",u"msg_tail_id",b"msg_tail_id",u"new_group_flag",b"new_group_flag",u"nick",b"nick",u"sender_title",b"sender_title",u"uin",b"uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"apns_sound_type",b"apns_sound_type",u"apns_tips",b"apns_tips",u"flags",b"flags",u"group_card",b"group_card",u"group_mask",b"group_mask",u"level",b"level",u"msg_state_flag",b"msg_state_flag",u"msg_tail_id",b"msg_tail_id",u"new_group_flag",b"new_group_flag",u"nick",b"nick",u"sender_title",b"sender_title",u"uin",b"uin"]) -> None: ...
+    nick: bytes
+    group_card: bytes
+    level: int
+    flags: int
+    group_mask: int
+    msg_tail_id: int
+    sender_title: bytes
+    apns_tips: bytes
+    uin: int
+    msg_state_flag: int
+    apns_sound_type: int
+    new_group_flag: int
+    def __init__(self,
+        *,
+        nick: Optional[bytes] = ...,
+        group_card: Optional[bytes] = ...,
+        level: Optional[int] = ...,
+        flags: Optional[int] = ...,
+        group_mask: Optional[int] = ...,
+        msg_tail_id: Optional[int] = ...,
+        sender_title: Optional[bytes] = ...,
+        apns_tips: Optional[bytes] = ...,
+        uin: Optional[int] = ...,
+        msg_state_flag: Optional[int] = ...,
+        apns_sound_type: Optional[int] = ...,
+        new_group_flag: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["apns_sound_type",b"apns_sound_type","apns_tips",b"apns_tips","flags",b"flags","group_card",b"group_card","group_mask",b"group_mask","level",b"level","msg_state_flag",b"msg_state_flag","msg_tail_id",b"msg_tail_id","new_group_flag",b"new_group_flag","nick",b"nick","sender_title",b"sender_title","uin",b"uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["apns_sound_type",b"apns_sound_type","apns_tips",b"apns_tips","flags",b"flags","group_card",b"group_card","group_mask",b"group_mask","level",b"level","msg_state_flag",b"msg_state_flag","msg_tail_id",b"msg_tail_id","new_group_flag",b"new_group_flag","nick",b"nick","sender_title",b"sender_title","uin",b"uin"]) -> None: ...
 
 class FSJMessageElem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     MSG_TYPE_FIELD_NUMBER: int
-    msg_type: int = ...
-
+    msg_type: int
     def __init__(self,
         *,
-        msg_type : Optional[int] = ...,
+        msg_type: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"msg_type",b"msg_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"msg_type",b"msg_type"]) -> None: ...
+    def HasField(self, field_name: Literal["msg_type",b"msg_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["msg_type",b"msg_type"]) -> None: ...
 
 class Face(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     INDEX_FIELD_NUMBER: int
     OLD_FIELD_NUMBER: int
     BUF_FIELD_NUMBER: int
-    index: int = ...
-    old: bytes = ...
-    buf: bytes = ...
-
+    index: int
+    old: bytes
+    buf: bytes
     def __init__(self,
         *,
-        index : Optional[int] = ...,
-        old : Optional[bytes] = ...,
-        buf : Optional[bytes] = ...,
+        index: Optional[int] = ...,
+        old: Optional[bytes] = ...,
+        buf: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"buf",b"buf",u"index",b"index",u"old",b"old"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"buf",b"buf",u"index",b"index",u"old",b"old"]) -> None: ...
+    def HasField(self, field_name: Literal["buf",b"buf","index",b"index","old",b"old"]) -> bool: ...
+    def ClearField(self, field_name: Literal["buf",b"buf","index",b"index","old",b"old"]) -> None: ...
 
 class FunFace(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TURNTABLE_FIELD_NUMBER: int
     BOMB_FIELD_NUMBER: int
-
     @property
     def turntable(self) -> Turntable: ...
-
     @property
     def bomb(self) -> Bomb: ...
-
     def __init__(self,
         *,
-        turntable : Optional[Turntable] = ...,
-        bomb : Optional[Bomb] = ...,
+        turntable: Optional[Turntable] = ...,
+        bomb: Optional[Bomb] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bomb",b"bomb",u"turntable",b"turntable"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bomb",b"bomb",u"turntable",b"turntable"]) -> None: ...
+    def HasField(self, field_name: Literal["bomb",b"bomb","turntable",b"turntable"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bomb",b"bomb","turntable",b"turntable"]) -> None: ...
 
 class Bomb(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BURST_FIELD_NUMBER: int
-    burst: bool = ...
-
+    burst: bool
     def __init__(self,
         *,
-        burst : Optional[bool] = ...,
+        burst: Optional[bool] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"burst",b"burst"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"burst",b"burst"]) -> None: ...
+    def HasField(self, field_name: Literal["burst",b"burst"]) -> bool: ...
+    def ClearField(self, field_name: Literal["burst",b"burst"]) -> None: ...
 
 class Turntable(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     UIN_LIST_FIELD_NUMBER: int
     HIT_UIN_FIELD_NUMBER: int
     HIT_UIN_NICK_FIELD_NUMBER: int
-    uin_list: RepeatedScalarFieldContainer[int] = ...
-    hit_uin: int = ...
-    hit_uin_nick: Text = ...
-
+    @property
+    def uin_list(self) -> RepeatedScalarFieldContainer[int]: ...
+    hit_uin: int
+    hit_uin_nick: Text
     def __init__(self,
         *,
-        uin_list : Optional[Iterable[int]] = ...,
-        hit_uin : Optional[int] = ...,
-        hit_uin_nick : Optional[Text] = ...,
+        uin_list: Optional[Iterable[int]] = ...,
+        hit_uin: Optional[int] = ...,
+        hit_uin_nick: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"hit_uin",b"hit_uin",u"hit_uin_nick",b"hit_uin_nick"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"hit_uin",b"hit_uin",u"hit_uin_nick",b"hit_uin_nick",u"uin_list",b"uin_list"]) -> None: ...
+    def HasField(self, field_name: Literal["hit_uin",b"hit_uin","hit_uin_nick",b"hit_uin_nick"]) -> bool: ...
+    def ClearField(self, field_name: Literal["hit_uin",b"hit_uin","hit_uin_nick",b"hit_uin_nick","uin_list",b"uin_list"]) -> None: ...
 
 class GeneralFlags(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BUBBLE_DIY_TEXT_ID_FIELD_NUMBER: int
     GROUP_FLAG_NEW_FIELD_NUMBER: int
     UIN_FIELD_NUMBER: int
@@ -990,53 +914,52 @@ class GeneralFlags(Message):
     PENDANT_ID_FIELD_NUMBER: int
     RP_INDEX_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
-    bubble_diy_text_id: int = ...
-    group_flag_new: int = ...
-    uin: int = ...
-    rp_id: bytes = ...
-    prp_fold: int = ...
-    long_text_flag: int = ...
-    long_text_resid: bytes = ...
-    group_type: int = ...
-    to_uin_flag: int = ...
-    glamour_level: int = ...
-    member_level: int = ...
-    group_rank_seq: int = ...
-    olympic_torch: int = ...
-    babyq_guide_msg_cookie: bytes = ...
-    uin32_expert_flag: int = ...
-    bubble_sub_id: int = ...
-    pendant_id: int = ...
-    rp_index: bytes = ...
-    pb_reserve: bytes = ...
-
-    def __init__(self,
-        *,
-        bubble_diy_text_id : Optional[int] = ...,
-        group_flag_new : Optional[int] = ...,
-        uin : Optional[int] = ...,
-        rp_id : Optional[bytes] = ...,
-        prp_fold : Optional[int] = ...,
-        long_text_flag : Optional[int] = ...,
-        long_text_resid : Optional[bytes] = ...,
-        group_type : Optional[int] = ...,
-        to_uin_flag : Optional[int] = ...,
-        glamour_level : Optional[int] = ...,
-        member_level : Optional[int] = ...,
-        group_rank_seq : Optional[int] = ...,
-        olympic_torch : Optional[int] = ...,
-        babyq_guide_msg_cookie : Optional[bytes] = ...,
-        uin32_expert_flag : Optional[int] = ...,
-        bubble_sub_id : Optional[int] = ...,
-        pendant_id : Optional[int] = ...,
-        rp_index : Optional[bytes] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"babyq_guide_msg_cookie",b"babyq_guide_msg_cookie",u"bubble_diy_text_id",b"bubble_diy_text_id",u"bubble_sub_id",b"bubble_sub_id",u"glamour_level",b"glamour_level",u"group_flag_new",b"group_flag_new",u"group_rank_seq",b"group_rank_seq",u"group_type",b"group_type",u"long_text_flag",b"long_text_flag",u"long_text_resid",b"long_text_resid",u"member_level",b"member_level",u"olympic_torch",b"olympic_torch",u"pb_reserve",b"pb_reserve",u"pendant_id",b"pendant_id",u"prp_fold",b"prp_fold",u"rp_id",b"rp_id",u"rp_index",b"rp_index",u"to_uin_flag",b"to_uin_flag",u"uin",b"uin",u"uin32_expert_flag",b"uin32_expert_flag"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"babyq_guide_msg_cookie",b"babyq_guide_msg_cookie",u"bubble_diy_text_id",b"bubble_diy_text_id",u"bubble_sub_id",b"bubble_sub_id",u"glamour_level",b"glamour_level",u"group_flag_new",b"group_flag_new",u"group_rank_seq",b"group_rank_seq",u"group_type",b"group_type",u"long_text_flag",b"long_text_flag",u"long_text_resid",b"long_text_resid",u"member_level",b"member_level",u"olympic_torch",b"olympic_torch",u"pb_reserve",b"pb_reserve",u"pendant_id",b"pendant_id",u"prp_fold",b"prp_fold",u"rp_id",b"rp_id",u"rp_index",b"rp_index",u"to_uin_flag",b"to_uin_flag",u"uin",b"uin",u"uin32_expert_flag",b"uin32_expert_flag"]) -> None: ...
+    bubble_diy_text_id: int
+    group_flag_new: int
+    uin: int
+    rp_id: bytes
+    prp_fold: int
+    long_text_flag: int
+    long_text_resid: bytes
+    group_type: int
+    to_uin_flag: int
+    glamour_level: int
+    member_level: int
+    group_rank_seq: int
+    olympic_torch: int
+    babyq_guide_msg_cookie: bytes
+    uin32_expert_flag: int
+    bubble_sub_id: int
+    pendant_id: int
+    rp_index: bytes
+    pb_reserve: bytes
+    def __init__(self,
+        *,
+        bubble_diy_text_id: Optional[int] = ...,
+        group_flag_new: Optional[int] = ...,
+        uin: Optional[int] = ...,
+        rp_id: Optional[bytes] = ...,
+        prp_fold: Optional[int] = ...,
+        long_text_flag: Optional[int] = ...,
+        long_text_resid: Optional[bytes] = ...,
+        group_type: Optional[int] = ...,
+        to_uin_flag: Optional[int] = ...,
+        glamour_level: Optional[int] = ...,
+        member_level: Optional[int] = ...,
+        group_rank_seq: Optional[int] = ...,
+        olympic_torch: Optional[int] = ...,
+        babyq_guide_msg_cookie: Optional[bytes] = ...,
+        uin32_expert_flag: Optional[int] = ...,
+        bubble_sub_id: Optional[int] = ...,
+        pendant_id: Optional[int] = ...,
+        rp_index: Optional[bytes] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["babyq_guide_msg_cookie",b"babyq_guide_msg_cookie","bubble_diy_text_id",b"bubble_diy_text_id","bubble_sub_id",b"bubble_sub_id","glamour_level",b"glamour_level","group_flag_new",b"group_flag_new","group_rank_seq",b"group_rank_seq","group_type",b"group_type","long_text_flag",b"long_text_flag","long_text_resid",b"long_text_resid","member_level",b"member_level","olympic_torch",b"olympic_torch","pb_reserve",b"pb_reserve","pendant_id",b"pendant_id","prp_fold",b"prp_fold","rp_id",b"rp_id","rp_index",b"rp_index","to_uin_flag",b"to_uin_flag","uin",b"uin","uin32_expert_flag",b"uin32_expert_flag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["babyq_guide_msg_cookie",b"babyq_guide_msg_cookie","bubble_diy_text_id",b"bubble_diy_text_id","bubble_sub_id",b"bubble_sub_id","glamour_level",b"glamour_level","group_flag_new",b"group_flag_new","group_rank_seq",b"group_rank_seq","group_type",b"group_type","long_text_flag",b"long_text_flag","long_text_resid",b"long_text_resid","member_level",b"member_level","olympic_torch",b"olympic_torch","pb_reserve",b"pb_reserve","pendant_id",b"pendant_id","prp_fold",b"prp_fold","rp_id",b"rp_id","rp_index",b"rp_index","to_uin_flag",b"to_uin_flag","uin",b"uin","uin32_expert_flag",b"uin32_expert_flag"]) -> None: ...
 
 class GroupBusinessMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FLAGS_FIELD_NUMBER: int
     HEAD_URL_FIELD_NUMBER: int
     HEAD_CLK_URL_FIELD_NUMBER: int
@@ -1045,31 +968,30 @@ class GroupBusinessMsg(Message):
     RANK_FIELD_NUMBER: int
     RANK_COLOR_FIELD_NUMBER: int
     RANK_BGCOLOR_FIELD_NUMBER: int
-    flags: int = ...
-    head_url: bytes = ...
-    head_clk_url: bytes = ...
-    nick: bytes = ...
-    nick_color: bytes = ...
-    rank: bytes = ...
-    rank_color: bytes = ...
-    rank_bgcolor: bytes = ...
-
-    def __init__(self,
-        *,
-        flags : Optional[int] = ...,
-        head_url : Optional[bytes] = ...,
-        head_clk_url : Optional[bytes] = ...,
-        nick : Optional[bytes] = ...,
-        nick_color : Optional[bytes] = ...,
-        rank : Optional[bytes] = ...,
-        rank_color : Optional[bytes] = ...,
-        rank_bgcolor : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"flags",b"flags",u"head_clk_url",b"head_clk_url",u"head_url",b"head_url",u"nick",b"nick",u"nick_color",b"nick_color",u"rank",b"rank",u"rank_bgcolor",b"rank_bgcolor",u"rank_color",b"rank_color"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"flags",b"flags",u"head_clk_url",b"head_clk_url",u"head_url",b"head_url",u"nick",b"nick",u"nick_color",b"nick_color",u"rank",b"rank",u"rank_bgcolor",b"rank_bgcolor",u"rank_color",b"rank_color"]) -> None: ...
+    flags: int
+    head_url: bytes
+    head_clk_url: bytes
+    nick: bytes
+    nick_color: bytes
+    rank: bytes
+    rank_color: bytes
+    rank_bgcolor: bytes
+    def __init__(self,
+        *,
+        flags: Optional[int] = ...,
+        head_url: Optional[bytes] = ...,
+        head_clk_url: Optional[bytes] = ...,
+        nick: Optional[bytes] = ...,
+        nick_color: Optional[bytes] = ...,
+        rank: Optional[bytes] = ...,
+        rank_color: Optional[bytes] = ...,
+        rank_bgcolor: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["flags",b"flags","head_clk_url",b"head_clk_url","head_url",b"head_url","nick",b"nick","nick_color",b"nick_color","rank",b"rank","rank_bgcolor",b"rank_bgcolor","rank_color",b"rank_color"]) -> bool: ...
+    def ClearField(self, field_name: Literal["flags",b"flags","head_clk_url",b"head_clk_url","head_url",b"head_url","nick",b"nick","nick_color",b"nick_color","rank",b"rank","rank_bgcolor",b"rank_bgcolor","rank_color",b"rank_color"]) -> None: ...
 
 class GroupFile(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FILENAME_FIELD_NUMBER: int
     FILE_SIZE_FIELD_NUMBER: int
     FILE_ID_FIELD_NUMBER: int
@@ -1080,62 +1002,59 @@ class GroupFile(Message):
     BATCH_ITEM_ID_FIELD_NUMBER: int
     FEED_MSG_TIME_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
-    filename: bytes = ...
-    file_size: int = ...
-    file_id: bytes = ...
-    batch_id: bytes = ...
-    file_key: bytes = ...
-    mark: bytes = ...
-    sequence: int = ...
-    batch_item_id: bytes = ...
-    feed_msg_time: int = ...
-    pb_reserve: bytes = ...
-
-    def __init__(self,
-        *,
-        filename : Optional[bytes] = ...,
-        file_size : Optional[int] = ...,
-        file_id : Optional[bytes] = ...,
-        batch_id : Optional[bytes] = ...,
-        file_key : Optional[bytes] = ...,
-        mark : Optional[bytes] = ...,
-        sequence : Optional[int] = ...,
-        batch_item_id : Optional[bytes] = ...,
-        feed_msg_time : Optional[int] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"batch_id",b"batch_id",u"batch_item_id",b"batch_item_id",u"feed_msg_time",b"feed_msg_time",u"file_id",b"file_id",u"file_key",b"file_key",u"file_size",b"file_size",u"filename",b"filename",u"mark",b"mark",u"pb_reserve",b"pb_reserve",u"sequence",b"sequence"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"batch_id",b"batch_id",u"batch_item_id",b"batch_item_id",u"feed_msg_time",b"feed_msg_time",u"file_id",b"file_id",u"file_key",b"file_key",u"file_size",b"file_size",u"filename",b"filename",u"mark",b"mark",u"pb_reserve",b"pb_reserve",u"sequence",b"sequence"]) -> None: ...
+    filename: bytes
+    file_size: int
+    file_id: bytes
+    batch_id: bytes
+    file_key: bytes
+    mark: bytes
+    sequence: int
+    batch_item_id: bytes
+    feed_msg_time: int
+    pb_reserve: bytes
+    def __init__(self,
+        *,
+        filename: Optional[bytes] = ...,
+        file_size: Optional[int] = ...,
+        file_id: Optional[bytes] = ...,
+        batch_id: Optional[bytes] = ...,
+        file_key: Optional[bytes] = ...,
+        mark: Optional[bytes] = ...,
+        sequence: Optional[int] = ...,
+        batch_item_id: Optional[bytes] = ...,
+        feed_msg_time: Optional[int] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["batch_id",b"batch_id","batch_item_id",b"batch_item_id","feed_msg_time",b"feed_msg_time","file_id",b"file_id","file_key",b"file_key","file_size",b"file_size","filename",b"filename","mark",b"mark","pb_reserve",b"pb_reserve","sequence",b"sequence"]) -> bool: ...
+    def ClearField(self, field_name: Literal["batch_id",b"batch_id","batch_item_id",b"batch_item_id","feed_msg_time",b"feed_msg_time","file_id",b"file_id","file_key",b"file_key","file_size",b"file_size","filename",b"filename","mark",b"mark","pb_reserve",b"pb_reserve","sequence",b"sequence"]) -> None: ...
 
 class GroupPostElem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TRANS_TYPE_FIELD_NUMBER: int
     TRANS_MSG_FIELD_NUMBER: int
-    trans_type: int = ...
-    trans_msg: bytes = ...
-
+    trans_type: int
+    trans_msg: bytes
     def __init__(self,
         *,
-        trans_type : Optional[int] = ...,
-        trans_msg : Optional[bytes] = ...,
+        trans_type: Optional[int] = ...,
+        trans_msg: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"trans_msg",b"trans_msg",u"trans_type",b"trans_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"trans_msg",b"trans_msg",u"trans_type",b"trans_type"]) -> None: ...
+    def HasField(self, field_name: Literal["trans_msg",b"trans_msg","trans_type",b"trans_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["trans_msg",b"trans_msg","trans_type",b"trans_type"]) -> None: ...
 
 class GroupPubAccountInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     PUB_ACCOUNT_FIELD_NUMBER: int
-    pub_account: int = ...
-
+    pub_account: int
     def __init__(self,
         *,
-        pub_account : Optional[int] = ...,
+        pub_account: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"pub_account",b"pub_account"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"pub_account",b"pub_account"]) -> None: ...
+    def HasField(self, field_name: Literal["pub_account",b"pub_account"]) -> bool: ...
+    def ClearField(self, field_name: Literal["pub_account",b"pub_account"]) -> None: ...
 
 class LifeOnlineAccount(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     UNIQUE_ID_FIELD_NUMBER: int
     OP_FIELD_NUMBER: int
     SHOW_TIME_FIELD_NUMBER: int
@@ -1145,93 +1064,89 @@ class LifeOnlineAccount(Message):
     GDT_IMP_DATA_FIELD_NUMBER: int
     GDT_CLI_DATA_FIELD_NUMBER: int
     VIEW_ID_FIELD_NUMBER: int
-    unique_id: int = ...
-    op: int = ...
-    show_time: int = ...
-    report: int = ...
-    ack: int = ...
-    bitmap: int = ...
-    gdt_imp_data: bytes = ...
-    gdt_cli_data: bytes = ...
-    view_id: bytes = ...
-
-    def __init__(self,
-        *,
-        unique_id : Optional[int] = ...,
-        op : Optional[int] = ...,
-        show_time : Optional[int] = ...,
-        report : Optional[int] = ...,
-        ack : Optional[int] = ...,
-        bitmap : Optional[int] = ...,
-        gdt_imp_data : Optional[bytes] = ...,
-        gdt_cli_data : Optional[bytes] = ...,
-        view_id : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"ack",b"ack",u"bitmap",b"bitmap",u"gdt_cli_data",b"gdt_cli_data",u"gdt_imp_data",b"gdt_imp_data",u"op",b"op",u"report",b"report",u"show_time",b"show_time",u"unique_id",b"unique_id",u"view_id",b"view_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"ack",b"ack",u"bitmap",b"bitmap",u"gdt_cli_data",b"gdt_cli_data",u"gdt_imp_data",b"gdt_imp_data",u"op",b"op",u"report",b"report",u"show_time",b"show_time",u"unique_id",b"unique_id",u"view_id",b"view_id"]) -> None: ...
+    unique_id: int
+    op: int
+    show_time: int
+    report: int
+    ack: int
+    bitmap: int
+    gdt_imp_data: bytes
+    gdt_cli_data: bytes
+    view_id: bytes
+    def __init__(self,
+        *,
+        unique_id: Optional[int] = ...,
+        op: Optional[int] = ...,
+        show_time: Optional[int] = ...,
+        report: Optional[int] = ...,
+        ack: Optional[int] = ...,
+        bitmap: Optional[int] = ...,
+        gdt_imp_data: Optional[bytes] = ...,
+        gdt_cli_data: Optional[bytes] = ...,
+        view_id: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["ack",b"ack","bitmap",b"bitmap","gdt_cli_data",b"gdt_cli_data","gdt_imp_data",b"gdt_imp_data","op",b"op","report",b"report","show_time",b"show_time","unique_id",b"unique_id","view_id",b"view_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ack",b"ack","bitmap",b"bitmap","gdt_cli_data",b"gdt_cli_data","gdt_imp_data",b"gdt_imp_data","op",b"op","report",b"report","show_time",b"show_time","unique_id",b"unique_id","view_id",b"view_id"]) -> None: ...
 
 class LightAppElem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     DATA_FIELD_NUMBER: int
     MSG_RESID_FIELD_NUMBER: int
-    data: bytes = ...
-    msg_resid: bytes = ...
-
+    data: bytes
+    msg_resid: bytes
     def __init__(self,
         *,
-        data : Optional[bytes] = ...,
-        msg_resid : Optional[bytes] = ...,
+        data: Optional[bytes] = ...,
+        msg_resid: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"data",b"data",u"msg_resid",b"msg_resid"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"data",b"data",u"msg_resid",b"msg_resid"]) -> None: ...
+    def HasField(self, field_name: Literal["data",b"data","msg_resid",b"msg_resid"]) -> bool: ...
+    def ClearField(self, field_name: Literal["data",b"data","msg_resid",b"msg_resid"]) -> None: ...
 
 class LolaMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     MSG_RESID_FIELD_NUMBER: int
     ENCODE_CONTENT_FIELD_NUMBER: int
     LONG_MSG_URL_FIELD_NUMBER: int
     DOWNLOAD_KEY_FIELD_NUMBER: int
-    msg_resid: bytes = ...
-    encode_content: bytes = ...
-    long_msg_url: bytes = ...
-    download_key: bytes = ...
-
+    msg_resid: bytes
+    encode_content: bytes
+    long_msg_url: bytes
+    download_key: bytes
     def __init__(self,
         *,
-        msg_resid : Optional[bytes] = ...,
-        encode_content : Optional[bytes] = ...,
-        long_msg_url : Optional[bytes] = ...,
-        download_key : Optional[bytes] = ...,
+        msg_resid: Optional[bytes] = ...,
+        encode_content: Optional[bytes] = ...,
+        long_msg_url: Optional[bytes] = ...,
+        download_key: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"download_key",b"download_key",u"encode_content",b"encode_content",u"long_msg_url",b"long_msg_url",u"msg_resid",b"msg_resid"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"download_key",b"download_key",u"encode_content",b"encode_content",u"long_msg_url",b"long_msg_url",u"msg_resid",b"msg_resid"]) -> None: ...
+    def HasField(self, field_name: Literal["download_key",b"download_key","encode_content",b"encode_content","long_msg_url",b"long_msg_url","msg_resid",b"msg_resid"]) -> bool: ...
+    def ClearField(self, field_name: Literal["download_key",b"download_key","encode_content",b"encode_content","long_msg_url",b"long_msg_url","msg_resid",b"msg_resid"]) -> None: ...
 
 class LowVersionTips(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BUSINESS_ID_FIELD_NUMBER: int
     SESSION_TYPE_FIELD_NUMBER: int
     SESSION_UIN_FIELD_NUMBER: int
     SENDER_UIN_FIELD_NUMBER: int
     TEXT_FIELD_NUMBER: int
-    business_id: int = ...
-    session_type: int = ...
-    session_uin: int = ...
-    sender_uin: int = ...
-    text: Text = ...
-
+    business_id: int
+    session_type: int
+    session_uin: int
+    sender_uin: int
+    text: Text
     def __init__(self,
         *,
-        business_id : Optional[int] = ...,
-        session_type : Optional[int] = ...,
-        session_uin : Optional[int] = ...,
-        sender_uin : Optional[int] = ...,
-        text : Optional[Text] = ...,
+        business_id: Optional[int] = ...,
+        session_type: Optional[int] = ...,
+        session_uin: Optional[int] = ...,
+        sender_uin: Optional[int] = ...,
+        text: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"business_id",b"business_id",u"sender_uin",b"sender_uin",u"session_type",b"session_type",u"session_uin",b"session_uin",u"text",b"text"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"business_id",b"business_id",u"sender_uin",b"sender_uin",u"session_type",b"session_type",u"session_uin",b"session_uin",u"text",b"text"]) -> None: ...
+    def HasField(self, field_name: Literal["business_id",b"business_id","sender_uin",b"sender_uin","session_type",b"session_type","session_uin",b"session_uin","text",b"text"]) -> bool: ...
+    def ClearField(self, field_name: Literal["business_id",b"business_id","sender_uin",b"sender_uin","session_type",b"session_type","session_uin",b"session_uin","text",b"text"]) -> None: ...
 
 class MarketFace(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FACE_NAME_FIELD_NUMBER: int
     ITEM_TYPE_FIELD_NUMBER: int
     FACE_INFO_FIELD_NUMBER: int
@@ -1245,117 +1160,110 @@ class MarketFace(Message):
     IMAGE_HEIGHT_FIELD_NUMBER: int
     MOBILEPARAM_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
-    face_name: bytes = ...
-    item_type: int = ...
-    face_info: int = ...
-    face_id: bytes = ...
-    tab_id: int = ...
-    sub_type: int = ...
-    key: bytes = ...
-    param: bytes = ...
-    media_type: int = ...
-    image_width: int = ...
-    image_height: int = ...
-    mobileparam: bytes = ...
-    pb_reserve: bytes = ...
-
-    def __init__(self,
-        *,
-        face_name : Optional[bytes] = ...,
-        item_type : Optional[int] = ...,
-        face_info : Optional[int] = ...,
-        face_id : Optional[bytes] = ...,
-        tab_id : Optional[int] = ...,
-        sub_type : Optional[int] = ...,
-        key : Optional[bytes] = ...,
-        param : Optional[bytes] = ...,
-        media_type : Optional[int] = ...,
-        image_width : Optional[int] = ...,
-        image_height : Optional[int] = ...,
-        mobileparam : Optional[bytes] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"face_id",b"face_id",u"face_info",b"face_info",u"face_name",b"face_name",u"image_height",b"image_height",u"image_width",b"image_width",u"item_type",b"item_type",u"key",b"key",u"media_type",b"media_type",u"mobileparam",b"mobileparam",u"param",b"param",u"pb_reserve",b"pb_reserve",u"sub_type",b"sub_type",u"tab_id",b"tab_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"face_id",b"face_id",u"face_info",b"face_info",u"face_name",b"face_name",u"image_height",b"image_height",u"image_width",b"image_width",u"item_type",b"item_type",u"key",b"key",u"media_type",b"media_type",u"mobileparam",b"mobileparam",u"param",b"param",u"pb_reserve",b"pb_reserve",u"sub_type",b"sub_type",u"tab_id",b"tab_id"]) -> None: ...
+    face_name: bytes
+    item_type: int
+    face_info: int
+    face_id: bytes
+    tab_id: int
+    sub_type: int
+    key: bytes
+    param: bytes
+    media_type: int
+    image_width: int
+    image_height: int
+    mobileparam: bytes
+    pb_reserve: bytes
+    def __init__(self,
+        *,
+        face_name: Optional[bytes] = ...,
+        item_type: Optional[int] = ...,
+        face_info: Optional[int] = ...,
+        face_id: Optional[bytes] = ...,
+        tab_id: Optional[int] = ...,
+        sub_type: Optional[int] = ...,
+        key: Optional[bytes] = ...,
+        param: Optional[bytes] = ...,
+        media_type: Optional[int] = ...,
+        image_width: Optional[int] = ...,
+        image_height: Optional[int] = ...,
+        mobileparam: Optional[bytes] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["face_id",b"face_id","face_info",b"face_info","face_name",b"face_name","image_height",b"image_height","image_width",b"image_width","item_type",b"item_type","key",b"key","media_type",b"media_type","mobileparam",b"mobileparam","param",b"param","pb_reserve",b"pb_reserve","sub_type",b"sub_type","tab_id",b"tab_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["face_id",b"face_id","face_info",b"face_info","face_name",b"face_name","image_height",b"image_height","image_width",b"image_width","item_type",b"item_type","key",b"key","media_type",b"media_type","mobileparam",b"mobileparam","param",b"param","pb_reserve",b"pb_reserve","sub_type",b"sub_type","tab_id",b"tab_id"]) -> None: ...
 
 class MarketTrans(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FLAG_FIELD_NUMBER: int
     XML_FIELD_NUMBER: int
     MSG_RESID_FIELD_NUMBER: int
     ABILITY_FIELD_NUMBER: int
     MIN_ABILITY_FIELD_NUMBER: int
-    flag: int = ...
-    xml: bytes = ...
-    msg_resid: bytes = ...
-    ability: int = ...
-    min_ability: int = ...
-
+    flag: int
+    xml: bytes
+    msg_resid: bytes
+    ability: int
+    min_ability: int
     def __init__(self,
         *,
-        flag : Optional[int] = ...,
-        xml : Optional[bytes] = ...,
-        msg_resid : Optional[bytes] = ...,
-        ability : Optional[int] = ...,
-        min_ability : Optional[int] = ...,
+        flag: Optional[int] = ...,
+        xml: Optional[bytes] = ...,
+        msg_resid: Optional[bytes] = ...,
+        ability: Optional[int] = ...,
+        min_ability: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"ability",b"ability",u"flag",b"flag",u"min_ability",b"min_ability",u"msg_resid",b"msg_resid",u"xml",b"xml"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"ability",b"ability",u"flag",b"flag",u"min_ability",b"min_ability",u"msg_resid",b"msg_resid",u"xml",b"xml"]) -> None: ...
+    def HasField(self, field_name: Literal["ability",b"ability","flag",b"flag","min_ability",b"min_ability","msg_resid",b"msg_resid","xml",b"xml"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ability",b"ability","flag",b"flag","min_ability",b"min_ability","msg_resid",b"msg_resid","xml",b"xml"]) -> None: ...
 
 class MsgBody(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RICH_TEXT_FIELD_NUMBER: int
     CONTENT_FIELD_NUMBER: int
     ENCRYPT_CONTENT_FIELD_NUMBER: int
-    content: bytes = ...
-    encrypt_content: bytes = ...
-
     @property
     def rich_text(self) -> RichText: ...
-
+    content: bytes
+    encrypt_content: bytes
     def __init__(self,
         *,
-        rich_text : Optional[RichText] = ...,
-        content : Optional[bytes] = ...,
-        encrypt_content : Optional[bytes] = ...,
+        rich_text: Optional[RichText] = ...,
+        content: Optional[bytes] = ...,
+        encrypt_content: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"content",b"content",u"encrypt_content",b"encrypt_content",u"rich_text",b"rich_text"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"content",b"content",u"encrypt_content",b"encrypt_content",u"rich_text",b"rich_text"]) -> None: ...
+    def HasField(self, field_name: Literal["content",b"content","encrypt_content",b"encrypt_content","rich_text",b"rich_text"]) -> bool: ...
+    def ClearField(self, field_name: Literal["content",b"content","encrypt_content",b"encrypt_content","rich_text",b"rich_text"]) -> None: ...
 
 class MsgBody_subtype4(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     NOT_ONLINE_FILE_FIELD_NUMBER: int
     MSG_TIME_FIELD_NUMBER: int
-    msg_time: int = ...
-
     @property
     def not_online_file(self) -> NotOnlineFile: ...
-
+    msg_time: int
     def __init__(self,
         *,
-        not_online_file : Optional[NotOnlineFile] = ...,
-        msg_time : Optional[int] = ...,
+        not_online_file: Optional[NotOnlineFile] = ...,
+        msg_time: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"msg_time",b"msg_time",u"not_online_file",b"not_online_file"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"msg_time",b"msg_time",u"not_online_file",b"not_online_file"]) -> None: ...
+    def HasField(self, field_name: Literal["msg_time",b"msg_time","not_online_file",b"not_online_file"]) -> bool: ...
+    def ClearField(self, field_name: Literal["msg_time",b"msg_time","not_online_file",b"not_online_file"]) -> None: ...
 
 class NearByMessageType(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TYPE_FIELD_NUMBER: int
     IDENTIFY_TYPE_FIELD_NUMBER: int
-    type: int = ...
-    identify_type: int = ...
-
+    type: int
+    identify_type: int
     def __init__(self,
         *,
-        type : Optional[int] = ...,
-        identify_type : Optional[int] = ...,
+        type: Optional[int] = ...,
+        identify_type: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"identify_type",b"identify_type",u"type",b"type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"identify_type",b"identify_type",u"type",b"type"]) -> None: ...
+    def HasField(self, field_name: Literal["identify_type",b"identify_type","type",b"type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["identify_type",b"identify_type","type",b"type"]) -> None: ...
 
 class NotOnlineFile(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FILE_TYPE_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
     FILE_UUID_FIELD_NUMBER: int
@@ -1376,55 +1284,55 @@ class NotOnlineFile(Message):
     EXPIRE_TIME_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
     FILEIDCRC_MEDIA_FIELD_NUMBER: int
-    file_type: int = ...
-    sig: bytes = ...
-    file_uuid: bytes = ...
-    file_md5: bytes = ...
-    file_name: bytes = ...
-    file_size: int = ...
-    note: bytes = ...
-    reserved: int = ...
-    subcmd: int = ...
-    micro_cloud: int = ...
-    file_urls: RepeatedScalarFieldContainer[bytes] = ...
-    download_flag: int = ...
-    danger_evel: int = ...
-    life_time: int = ...
-    upload_time: int = ...
-    abs_file_type: int = ...
-    client_type: int = ...
-    expire_time: int = ...
-    pb_reserve: bytes = ...
-    fileidcrc_media: Text = ...
-
-    def __init__(self,
-        *,
-        file_type : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
-        file_uuid : Optional[bytes] = ...,
-        file_md5 : Optional[bytes] = ...,
-        file_name : Optional[bytes] = ...,
-        file_size : Optional[int] = ...,
-        note : Optional[bytes] = ...,
-        reserved : Optional[int] = ...,
-        subcmd : Optional[int] = ...,
-        micro_cloud : Optional[int] = ...,
-        file_urls : Optional[Iterable[bytes]] = ...,
-        download_flag : Optional[int] = ...,
-        danger_evel : Optional[int] = ...,
-        life_time : Optional[int] = ...,
-        upload_time : Optional[int] = ...,
-        abs_file_type : Optional[int] = ...,
-        client_type : Optional[int] = ...,
-        expire_time : Optional[int] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        fileidcrc_media : Optional[Text] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"abs_file_type",b"abs_file_type",u"client_type",b"client_type",u"danger_evel",b"danger_evel",u"download_flag",b"download_flag",u"expire_time",b"expire_time",u"file_md5",b"file_md5",u"file_name",b"file_name",u"file_size",b"file_size",u"file_type",b"file_type",u"file_uuid",b"file_uuid",u"fileidcrc_media",b"fileidcrc_media",u"life_time",b"life_time",u"micro_cloud",b"micro_cloud",u"note",b"note",u"pb_reserve",b"pb_reserve",u"reserved",b"reserved",u"sig",b"sig",u"subcmd",b"subcmd",u"upload_time",b"upload_time"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"abs_file_type",b"abs_file_type",u"client_type",b"client_type",u"danger_evel",b"danger_evel",u"download_flag",b"download_flag",u"expire_time",b"expire_time",u"file_md5",b"file_md5",u"file_name",b"file_name",u"file_size",b"file_size",u"file_type",b"file_type",u"file_urls",b"file_urls",u"file_uuid",b"file_uuid",u"fileidcrc_media",b"fileidcrc_media",u"life_time",b"life_time",u"micro_cloud",b"micro_cloud",u"note",b"note",u"pb_reserve",b"pb_reserve",u"reserved",b"reserved",u"sig",b"sig",u"subcmd",b"subcmd",u"upload_time",b"upload_time"]) -> None: ...
+    file_type: int
+    sig: bytes
+    file_uuid: bytes
+    file_md5: bytes
+    file_name: bytes
+    file_size: int
+    note: bytes
+    reserved: int
+    subcmd: int
+    micro_cloud: int
+    @property
+    def file_urls(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    download_flag: int
+    danger_evel: int
+    life_time: int
+    upload_time: int
+    abs_file_type: int
+    client_type: int
+    expire_time: int
+    pb_reserve: bytes
+    fileidcrc_media: Text
+    def __init__(self,
+        *,
+        file_type: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
+        file_uuid: Optional[bytes] = ...,
+        file_md5: Optional[bytes] = ...,
+        file_name: Optional[bytes] = ...,
+        file_size: Optional[int] = ...,
+        note: Optional[bytes] = ...,
+        reserved: Optional[int] = ...,
+        subcmd: Optional[int] = ...,
+        micro_cloud: Optional[int] = ...,
+        file_urls: Optional[Iterable[bytes]] = ...,
+        download_flag: Optional[int] = ...,
+        danger_evel: Optional[int] = ...,
+        life_time: Optional[int] = ...,
+        upload_time: Optional[int] = ...,
+        abs_file_type: Optional[int] = ...,
+        client_type: Optional[int] = ...,
+        expire_time: Optional[int] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        fileidcrc_media: Optional[Text] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["abs_file_type",b"abs_file_type","client_type",b"client_type","danger_evel",b"danger_evel","download_flag",b"download_flag","expire_time",b"expire_time","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","file_type",b"file_type","file_uuid",b"file_uuid","fileidcrc_media",b"fileidcrc_media","life_time",b"life_time","micro_cloud",b"micro_cloud","note",b"note","pb_reserve",b"pb_reserve","reserved",b"reserved","sig",b"sig","subcmd",b"subcmd","upload_time",b"upload_time"]) -> bool: ...
+    def ClearField(self, field_name: Literal["abs_file_type",b"abs_file_type","client_type",b"client_type","danger_evel",b"danger_evel","download_flag",b"download_flag","expire_time",b"expire_time","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","file_type",b"file_type","file_urls",b"file_urls","file_uuid",b"file_uuid","fileidcrc_media",b"fileidcrc_media","life_time",b"life_time","micro_cloud",b"micro_cloud","note",b"note","pb_reserve",b"pb_reserve","reserved",b"reserved","sig",b"sig","subcmd",b"subcmd","upload_time",b"upload_time"]) -> None: ...
 
 class NotOnlineImage(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FILE_PATH_FIELD_NUMBER: int
     FILE_LEN_FIELD_NUMBER: int
     DOWNLOAD_PATH_FIELD_NUMBER: int
@@ -1454,145 +1362,142 @@ class NotOnlineImage(Message):
     _400_WIDTH_FIELD_NUMBER: int
     _400_HEIGHT_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
-    file_path: bytes = ...
-    file_len: int = ...
-    download_path: bytes = ...
-    old_ver_send_file: bytes = ...
-    img_type: int = ...
-    previews_image: bytes = ...
-    pic_md5: bytes = ...
-    pic_height: int = ...
-    pic_width: int = ...
-    res_id: bytes = ...
-    flag: bytes = ...
-    thumb_url: Text = ...
-    original: int = ...
-    big_url: Text = ...
-    orig_url: Text = ...
-    biz_type: int = ...
-    result: int = ...
-    index: int = ...
-    op_face_buf: bytes = ...
-    old_pic_md5: bool = ...
-    thumb_width: int = ...
-    thumb_height: int = ...
-    file_id: int = ...
-    show_len: int = ...
-    download_len: int = ...
-    _400_url: Text = ...
-    _400_width: int = ...
-    _400_height: int = ...
-    pb_reserve: bytes = ...
-
-    def __init__(self,
-        *,
-        file_path : Optional[bytes] = ...,
-        file_len : Optional[int] = ...,
-        download_path : Optional[bytes] = ...,
-        old_ver_send_file : Optional[bytes] = ...,
-        img_type : Optional[int] = ...,
-        previews_image : Optional[bytes] = ...,
-        pic_md5 : Optional[bytes] = ...,
-        pic_height : Optional[int] = ...,
-        pic_width : Optional[int] = ...,
-        res_id : Optional[bytes] = ...,
-        flag : Optional[bytes] = ...,
-        thumb_url : Optional[Text] = ...,
-        original : Optional[int] = ...,
-        big_url : Optional[Text] = ...,
-        orig_url : Optional[Text] = ...,
-        biz_type : Optional[int] = ...,
-        result : Optional[int] = ...,
-        index : Optional[int] = ...,
-        op_face_buf : Optional[bytes] = ...,
-        old_pic_md5 : Optional[bool] = ...,
-        thumb_width : Optional[int] = ...,
-        thumb_height : Optional[int] = ...,
-        file_id : Optional[int] = ...,
-        show_len : Optional[int] = ...,
-        download_len : Optional[int] = ...,
-        _400_url : Optional[Text] = ...,
-        _400_width : Optional[int] = ...,
-        _400_height : Optional[int] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"_400_height",b"_400_height",u"_400_url",b"_400_url",u"_400_width",b"_400_width",u"big_url",b"big_url",u"biz_type",b"biz_type",u"download_len",b"download_len",u"download_path",b"download_path",u"file_id",b"file_id",u"file_len",b"file_len",u"file_path",b"file_path",u"flag",b"flag",u"img_type",b"img_type",u"index",b"index",u"old_pic_md5",b"old_pic_md5",u"old_ver_send_file",b"old_ver_send_file",u"op_face_buf",b"op_face_buf",u"orig_url",b"orig_url",u"original",b"original",u"pb_reserve",b"pb_reserve",u"pic_height",b"pic_height",u"pic_md5",b"pic_md5",u"pic_width",b"pic_width",u"previews_image",b"previews_image",u"res_id",b"res_id",u"result",b"result",u"show_len",b"show_len",u"thumb_height",b"thumb_height",u"thumb_url",b"thumb_url",u"thumb_width",b"thumb_width"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"_400_height",b"_400_height",u"_400_url",b"_400_url",u"_400_width",b"_400_width",u"big_url",b"big_url",u"biz_type",b"biz_type",u"download_len",b"download_len",u"download_path",b"download_path",u"file_id",b"file_id",u"file_len",b"file_len",u"file_path",b"file_path",u"flag",b"flag",u"img_type",b"img_type",u"index",b"index",u"old_pic_md5",b"old_pic_md5",u"old_ver_send_file",b"old_ver_send_file",u"op_face_buf",b"op_face_buf",u"orig_url",b"orig_url",u"original",b"original",u"pb_reserve",b"pb_reserve",u"pic_height",b"pic_height",u"pic_md5",b"pic_md5",u"pic_width",b"pic_width",u"previews_image",b"previews_image",u"res_id",b"res_id",u"result",b"result",u"show_len",b"show_len",u"thumb_height",b"thumb_height",u"thumb_url",b"thumb_url",u"thumb_width",b"thumb_width"]) -> None: ...
+    file_path: bytes
+    file_len: int
+    download_path: bytes
+    old_ver_send_file: bytes
+    img_type: int
+    previews_image: bytes
+    pic_md5: bytes
+    pic_height: int
+    pic_width: int
+    res_id: bytes
+    flag: bytes
+    thumb_url: Text
+    original: int
+    big_url: Text
+    orig_url: Text
+    biz_type: int
+    result: int
+    index: int
+    op_face_buf: bytes
+    old_pic_md5: bool
+    thumb_width: int
+    thumb_height: int
+    file_id: int
+    show_len: int
+    download_len: int
+    _400_url: Text
+    _400_width: int
+    _400_height: int
+    pb_reserve: bytes
+    def __init__(self,
+        *,
+        file_path: Optional[bytes] = ...,
+        file_len: Optional[int] = ...,
+        download_path: Optional[bytes] = ...,
+        old_ver_send_file: Optional[bytes] = ...,
+        img_type: Optional[int] = ...,
+        previews_image: Optional[bytes] = ...,
+        pic_md5: Optional[bytes] = ...,
+        pic_height: Optional[int] = ...,
+        pic_width: Optional[int] = ...,
+        res_id: Optional[bytes] = ...,
+        flag: Optional[bytes] = ...,
+        thumb_url: Optional[Text] = ...,
+        original: Optional[int] = ...,
+        big_url: Optional[Text] = ...,
+        orig_url: Optional[Text] = ...,
+        biz_type: Optional[int] = ...,
+        result: Optional[int] = ...,
+        index: Optional[int] = ...,
+        op_face_buf: Optional[bytes] = ...,
+        old_pic_md5: Optional[bool] = ...,
+        thumb_width: Optional[int] = ...,
+        thumb_height: Optional[int] = ...,
+        file_id: Optional[int] = ...,
+        show_len: Optional[int] = ...,
+        download_len: Optional[int] = ...,
+        _400_url: Optional[Text] = ...,
+        _400_width: Optional[int] = ...,
+        _400_height: Optional[int] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["_400_height",b"_400_height","_400_url",b"_400_url","_400_width",b"_400_width","big_url",b"big_url","biz_type",b"biz_type","download_len",b"download_len","download_path",b"download_path","file_id",b"file_id","file_len",b"file_len","file_path",b"file_path","flag",b"flag","img_type",b"img_type","index",b"index","old_pic_md5",b"old_pic_md5","old_ver_send_file",b"old_ver_send_file","op_face_buf",b"op_face_buf","orig_url",b"orig_url","original",b"original","pb_reserve",b"pb_reserve","pic_height",b"pic_height","pic_md5",b"pic_md5","pic_width",b"pic_width","previews_image",b"previews_image","res_id",b"res_id","result",b"result","show_len",b"show_len","thumb_height",b"thumb_height","thumb_url",b"thumb_url","thumb_width",b"thumb_width"]) -> bool: ...
+    def ClearField(self, field_name: Literal["_400_height",b"_400_height","_400_url",b"_400_url","_400_width",b"_400_width","big_url",b"big_url","biz_type",b"biz_type","download_len",b"download_len","download_path",b"download_path","file_id",b"file_id","file_len",b"file_len","file_path",b"file_path","flag",b"flag","img_type",b"img_type","index",b"index","old_pic_md5",b"old_pic_md5","old_ver_send_file",b"old_ver_send_file","op_face_buf",b"op_face_buf","orig_url",b"orig_url","original",b"original","pb_reserve",b"pb_reserve","pic_height",b"pic_height","pic_md5",b"pic_md5","pic_width",b"pic_width","previews_image",b"previews_image","res_id",b"res_id","result",b"result","show_len",b"show_len","thumb_height",b"thumb_height","thumb_url",b"thumb_url","thumb_width",b"thumb_width"]) -> None: ...
 
 class OnlineImage(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GUID_FIELD_NUMBER: int
     FILE_PATH_FIELD_NUMBER: int
     OLD_VER_SEND_FILE_FIELD_NUMBER: int
-    guid: bytes = ...
-    file_path: bytes = ...
-    old_ver_send_file: bytes = ...
-
+    guid: bytes
+    file_path: bytes
+    old_ver_send_file: bytes
     def __init__(self,
         *,
-        guid : Optional[bytes] = ...,
-        file_path : Optional[bytes] = ...,
-        old_ver_send_file : Optional[bytes] = ...,
+        guid: Optional[bytes] = ...,
+        file_path: Optional[bytes] = ...,
+        old_ver_send_file: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"file_path",b"file_path",u"guid",b"guid",u"old_ver_send_file",b"old_ver_send_file"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"file_path",b"file_path",u"guid",b"guid",u"old_ver_send_file",b"old_ver_send_file"]) -> None: ...
+    def HasField(self, field_name: Literal["file_path",b"file_path","guid",b"guid","old_ver_send_file",b"old_ver_send_file"]) -> bool: ...
+    def ClearField(self, field_name: Literal["file_path",b"file_path","guid",b"guid","old_ver_send_file",b"old_ver_send_file"]) -> None: ...
 
 class OpenQQData(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CAR_QQ_DATA_FIELD_NUMBER: int
-    car_qq_data: bytes = ...
-
+    car_qq_data: bytes
     def __init__(self,
         *,
-        car_qq_data : Optional[bytes] = ...,
+        car_qq_data: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"car_qq_data",b"car_qq_data"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"car_qq_data",b"car_qq_data"]) -> None: ...
+    def HasField(self, field_name: Literal["car_qq_data",b"car_qq_data"]) -> bool: ...
+    def ClearField(self, field_name: Literal["car_qq_data",b"car_qq_data"]) -> None: ...
 
 class PatsElem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     PAT_TYPE_FIELD_NUMBER: int
     PAT_COUNT_FIELD_NUMBER: int
-    pat_type: int = ...
-    pat_count: int = ...
-
+    pat_type: int
+    pat_count: int
     def __init__(self,
         *,
-        pat_type : Optional[int] = ...,
-        pat_count : Optional[int] = ...,
+        pat_type: Optional[int] = ...,
+        pat_count: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"pat_count",b"pat_count",u"pat_type",b"pat_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"pat_count",b"pat_count",u"pat_type",b"pat_type"]) -> None: ...
+    def HasField(self, field_name: Literal["pat_count",b"pat_count","pat_type",b"pat_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["pat_count",b"pat_count","pat_type",b"pat_type"]) -> None: ...
 
 class PcSupportDef(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     PC_PTL_BEGIN_FIELD_NUMBER: int
     PC_PTL_END_FIELD_NUMBER: int
     MAC_PTL_BEGIN_FIELD_NUMBER: int
     MAC_PTL_END_FIELD_NUMBER: int
     PTLS_SUPPORT_FIELD_NUMBER: int
     PTLS_NOT_SUPPORT_FIELD_NUMBER: int
-    pc_ptl_begin: int = ...
-    pc_ptl_end: int = ...
-    mac_ptl_begin: int = ...
-    mac_ptl_end: int = ...
-    ptls_support: RepeatedScalarFieldContainer[int] = ...
-    ptls_not_support: RepeatedScalarFieldContainer[int] = ...
-
+    pc_ptl_begin: int
+    pc_ptl_end: int
+    mac_ptl_begin: int
+    mac_ptl_end: int
+    @property
+    def ptls_support(self) -> RepeatedScalarFieldContainer[int]: ...
+    @property
+    def ptls_not_support(self) -> RepeatedScalarFieldContainer[int]: ...
     def __init__(self,
         *,
-        pc_ptl_begin : Optional[int] = ...,
-        pc_ptl_end : Optional[int] = ...,
-        mac_ptl_begin : Optional[int] = ...,
-        mac_ptl_end : Optional[int] = ...,
-        ptls_support : Optional[Iterable[int]] = ...,
-        ptls_not_support : Optional[Iterable[int]] = ...,
+        pc_ptl_begin: Optional[int] = ...,
+        pc_ptl_end: Optional[int] = ...,
+        mac_ptl_begin: Optional[int] = ...,
+        mac_ptl_end: Optional[int] = ...,
+        ptls_support: Optional[Iterable[int]] = ...,
+        ptls_not_support: Optional[Iterable[int]] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"mac_ptl_begin",b"mac_ptl_begin",u"mac_ptl_end",b"mac_ptl_end",u"pc_ptl_begin",b"pc_ptl_begin",u"pc_ptl_end",b"pc_ptl_end"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"mac_ptl_begin",b"mac_ptl_begin",u"mac_ptl_end",b"mac_ptl_end",u"pc_ptl_begin",b"pc_ptl_begin",u"pc_ptl_end",b"pc_ptl_end",u"ptls_not_support",b"ptls_not_support",u"ptls_support",b"ptls_support"]) -> None: ...
+    def HasField(self, field_name: Literal["mac_ptl_begin",b"mac_ptl_begin","mac_ptl_end",b"mac_ptl_end","pc_ptl_begin",b"pc_ptl_begin","pc_ptl_end",b"pc_ptl_end"]) -> bool: ...
+    def ClearField(self, field_name: Literal["mac_ptl_begin",b"mac_ptl_begin","mac_ptl_end",b"mac_ptl_end","pc_ptl_begin",b"pc_ptl_begin","pc_ptl_end",b"pc_ptl_end","ptls_not_support",b"ptls_not_support","ptls_support",b"ptls_support"]) -> None: ...
 
 class Ptt(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FILE_TYPE_FIELD_NUMBER: int
     SRC_UIN_FIELD_NUMBER: int
     FILE_UUID_FIELD_NUMBER: int
@@ -1617,141 +1522,137 @@ class Ptt(Message):
     PB_RESERVE_FIELD_NUMBER: int
     PTT_URLS_FIELD_NUMBER: int
     DOWNLOAD_FLAG_FIELD_NUMBER: int
-    file_type: int = ...
-    src_uin: int = ...
-    file_uuid: bytes = ...
-    file_md5: bytes = ...
-    file_name: bytes = ...
-    file_size: int = ...
-    reserve: bytes = ...
-    file_id: int = ...
-    server_ip: int = ...
-    server_port: int = ...
-    valid: bool = ...
-    signature: bytes = ...
-    shortcut: bytes = ...
-    file_key: bytes = ...
-    magic_ptt_index: int = ...
-    voice_switch: int = ...
-    ptt_url: bytes = ...
-    group_file_key: bytes = ...
-    time: int = ...
-    down_para: bytes = ...
-    format: int = ...
-    pb_reserve: bytes = ...
-    ptt_urls: RepeatedScalarFieldContainer[bytes] = ...
-    download_flag: int = ...
-
-    def __init__(self,
-        *,
-        file_type : Optional[int] = ...,
-        src_uin : Optional[int] = ...,
-        file_uuid : Optional[bytes] = ...,
-        file_md5 : Optional[bytes] = ...,
-        file_name : Optional[bytes] = ...,
-        file_size : Optional[int] = ...,
-        reserve : Optional[bytes] = ...,
-        file_id : Optional[int] = ...,
-        server_ip : Optional[int] = ...,
-        server_port : Optional[int] = ...,
-        valid : Optional[bool] = ...,
-        signature : Optional[bytes] = ...,
-        shortcut : Optional[bytes] = ...,
-        file_key : Optional[bytes] = ...,
-        magic_ptt_index : Optional[int] = ...,
-        voice_switch : Optional[int] = ...,
-        ptt_url : Optional[bytes] = ...,
-        group_file_key : Optional[bytes] = ...,
-        time : Optional[int] = ...,
-        down_para : Optional[bytes] = ...,
-        format : Optional[int] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ptt_urls : Optional[Iterable[bytes]] = ...,
-        download_flag : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"down_para",b"down_para",u"download_flag",b"download_flag",u"file_id",b"file_id",u"file_key",b"file_key",u"file_md5",b"file_md5",u"file_name",b"file_name",u"file_size",b"file_size",u"file_type",b"file_type",u"file_uuid",b"file_uuid",u"format",b"format",u"group_file_key",b"group_file_key",u"magic_ptt_index",b"magic_ptt_index",u"pb_reserve",b"pb_reserve",u"ptt_url",b"ptt_url",u"reserve",b"reserve",u"server_ip",b"server_ip",u"server_port",b"server_port",u"shortcut",b"shortcut",u"signature",b"signature",u"src_uin",b"src_uin",u"time",b"time",u"valid",b"valid",u"voice_switch",b"voice_switch"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"down_para",b"down_para",u"download_flag",b"download_flag",u"file_id",b"file_id",u"file_key",b"file_key",u"file_md5",b"file_md5",u"file_name",b"file_name",u"file_size",b"file_size",u"file_type",b"file_type",u"file_uuid",b"file_uuid",u"format",b"format",u"group_file_key",b"group_file_key",u"magic_ptt_index",b"magic_ptt_index",u"pb_reserve",b"pb_reserve",u"ptt_url",b"ptt_url",u"ptt_urls",b"ptt_urls",u"reserve",b"reserve",u"server_ip",b"server_ip",u"server_port",b"server_port",u"shortcut",b"shortcut",u"signature",b"signature",u"src_uin",b"src_uin",u"time",b"time",u"valid",b"valid",u"voice_switch",b"voice_switch"]) -> None: ...
+    file_type: int
+    src_uin: int
+    file_uuid: bytes
+    file_md5: bytes
+    file_name: bytes
+    file_size: int
+    reserve: bytes
+    file_id: int
+    server_ip: int
+    server_port: int
+    valid: bool
+    signature: bytes
+    shortcut: bytes
+    file_key: bytes
+    magic_ptt_index: int
+    voice_switch: int
+    ptt_url: bytes
+    group_file_key: bytes
+    time: int
+    down_para: bytes
+    format: int
+    pb_reserve: bytes
+    @property
+    def ptt_urls(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    download_flag: int
+    def __init__(self,
+        *,
+        file_type: Optional[int] = ...,
+        src_uin: Optional[int] = ...,
+        file_uuid: Optional[bytes] = ...,
+        file_md5: Optional[bytes] = ...,
+        file_name: Optional[bytes] = ...,
+        file_size: Optional[int] = ...,
+        reserve: Optional[bytes] = ...,
+        file_id: Optional[int] = ...,
+        server_ip: Optional[int] = ...,
+        server_port: Optional[int] = ...,
+        valid: Optional[bool] = ...,
+        signature: Optional[bytes] = ...,
+        shortcut: Optional[bytes] = ...,
+        file_key: Optional[bytes] = ...,
+        magic_ptt_index: Optional[int] = ...,
+        voice_switch: Optional[int] = ...,
+        ptt_url: Optional[bytes] = ...,
+        group_file_key: Optional[bytes] = ...,
+        time: Optional[int] = ...,
+        down_para: Optional[bytes] = ...,
+        format: Optional[int] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ptt_urls: Optional[Iterable[bytes]] = ...,
+        download_flag: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["down_para",b"down_para","download_flag",b"download_flag","file_id",b"file_id","file_key",b"file_key","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","file_type",b"file_type","file_uuid",b"file_uuid","format",b"format","group_file_key",b"group_file_key","magic_ptt_index",b"magic_ptt_index","pb_reserve",b"pb_reserve","ptt_url",b"ptt_url","reserve",b"reserve","server_ip",b"server_ip","server_port",b"server_port","shortcut",b"shortcut","signature",b"signature","src_uin",b"src_uin","time",b"time","valid",b"valid","voice_switch",b"voice_switch"]) -> bool: ...
+    def ClearField(self, field_name: Literal["down_para",b"down_para","download_flag",b"download_flag","file_id",b"file_id","file_key",b"file_key","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","file_type",b"file_type","file_uuid",b"file_uuid","format",b"format","group_file_key",b"group_file_key","magic_ptt_index",b"magic_ptt_index","pb_reserve",b"pb_reserve","ptt_url",b"ptt_url","ptt_urls",b"ptt_urls","reserve",b"reserve","server_ip",b"server_ip","server_port",b"server_port","shortcut",b"shortcut","signature",b"signature","src_uin",b"src_uin","time",b"time","valid",b"valid","voice_switch",b"voice_switch"]) -> None: ...
 
 class PubAccInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     IS_INTER_NUM_FIELD_NUMBER: int
     MSG_TEMPLATE_ID_FIELD_NUMBER: int
     LONG_MSG_URL_FIELD_NUMBER: int
     DOWNLOAD_KEY_FIELD_NUMBER: int
-    is_inter_num: int = ...
-    msg_template_id: Text = ...
-    long_msg_url: Text = ...
-    download_key: bytes = ...
-
+    is_inter_num: int
+    msg_template_id: Text
+    long_msg_url: Text
+    download_key: bytes
     def __init__(self,
         *,
-        is_inter_num : Optional[int] = ...,
-        msg_template_id : Optional[Text] = ...,
-        long_msg_url : Optional[Text] = ...,
-        download_key : Optional[bytes] = ...,
+        is_inter_num: Optional[int] = ...,
+        msg_template_id: Optional[Text] = ...,
+        long_msg_url: Optional[Text] = ...,
+        download_key: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"download_key",b"download_key",u"is_inter_num",b"is_inter_num",u"long_msg_url",b"long_msg_url",u"msg_template_id",b"msg_template_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"download_key",b"download_key",u"is_inter_num",b"is_inter_num",u"long_msg_url",b"long_msg_url",u"msg_template_id",b"msg_template_id"]) -> None: ...
+    def HasField(self, field_name: Literal["download_key",b"download_key","is_inter_num",b"is_inter_num","long_msg_url",b"long_msg_url","msg_template_id",b"msg_template_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["download_key",b"download_key","is_inter_num",b"is_inter_num","long_msg_url",b"long_msg_url","msg_template_id",b"msg_template_id"]) -> None: ...
 
 class PubAccount(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BUF_FIELD_NUMBER: int
     PUB_ACCOUNT_UIN_FIELD_NUMBER: int
-    buf: bytes = ...
-    pub_account_uin: int = ...
-
+    buf: bytes
+    pub_account_uin: int
     def __init__(self,
         *,
-        buf : Optional[bytes] = ...,
-        pub_account_uin : Optional[int] = ...,
+        buf: Optional[bytes] = ...,
+        pub_account_uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"buf",b"buf",u"pub_account_uin",b"pub_account_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"buf",b"buf",u"pub_account_uin",b"pub_account_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["buf",b"buf","pub_account_uin",b"pub_account_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["buf",b"buf","pub_account_uin",b"pub_account_uin"]) -> None: ...
 
 class PubGroup(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     NICKNAME_FIELD_NUMBER: int
     GENDER_FIELD_NUMBER: int
     AGE_FIELD_NUMBER: int
     DISTANCE_FIELD_NUMBER: int
-    nickname: bytes = ...
-    gender: int = ...
-    age: int = ...
-    distance: int = ...
-
+    nickname: bytes
+    gender: int
+    age: int
+    distance: int
     def __init__(self,
         *,
-        nickname : Optional[bytes] = ...,
-        gender : Optional[int] = ...,
-        age : Optional[int] = ...,
-        distance : Optional[int] = ...,
+        nickname: Optional[bytes] = ...,
+        gender: Optional[int] = ...,
+        age: Optional[int] = ...,
+        distance: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"age",b"age",u"distance",b"distance",u"gender",b"gender",u"nickname",b"nickname"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"age",b"age",u"distance",b"distance",u"gender",b"gender",u"nickname",b"nickname"]) -> None: ...
+    def HasField(self, field_name: Literal["age",b"age","distance",b"distance","gender",b"gender","nickname",b"nickname"]) -> bool: ...
+    def ClearField(self, field_name: Literal["age",b"age","distance",b"distance","gender",b"gender","nickname",b"nickname"]) -> None: ...
 
 class QQLiveOld(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SUB_CMD_FIELD_NUMBER: int
     SHOW_TEXT_FIELD_NUMBER: int
     PARAM_FIELD_NUMBER: int
     INTRODUCE_FIELD_NUMBER: int
-    sub_cmd: int = ...
-    show_text: bytes = ...
-    param: bytes = ...
-    introduce: bytes = ...
-
+    sub_cmd: int
+    show_text: bytes
+    param: bytes
+    introduce: bytes
     def __init__(self,
         *,
-        sub_cmd : Optional[int] = ...,
-        show_text : Optional[bytes] = ...,
-        param : Optional[bytes] = ...,
-        introduce : Optional[bytes] = ...,
+        sub_cmd: Optional[int] = ...,
+        show_text: Optional[bytes] = ...,
+        param: Optional[bytes] = ...,
+        introduce: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"introduce",b"introduce",u"param",b"param",u"show_text",b"show_text",u"sub_cmd",b"sub_cmd"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"introduce",b"introduce",u"param",b"param",u"show_text",b"show_text",u"sub_cmd",b"sub_cmd"]) -> None: ...
+    def HasField(self, field_name: Literal["introduce",b"introduce","param",b"param","show_text",b"show_text","sub_cmd",b"sub_cmd"]) -> bool: ...
+    def ClearField(self, field_name: Literal["introduce",b"introduce","param",b"param","show_text",b"show_text","sub_cmd",b"sub_cmd"]) -> None: ...
 
 class QQWalletAioBody(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SENDUIN_FIELD_NUMBER: int
     SENDER_FIELD_NUMBER: int
     RECEIVER_FIELD_NUMBER: int
@@ -1773,61 +1674,59 @@ class QQWalletAioBody(Message):
     REDCHANNEL_FIELD_NUMBER: int
     GRAP_UIN_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
-    senduin: int = ...
-    channelid: int = ...
-    templateid: int = ...
-    resend: int = ...
-    msg_priority: int = ...
-    redtype: int = ...
-    billno: bytes = ...
-    authkey: bytes = ...
-    sessiontype: int = ...
-    msgtype: int = ...
-    envelopeid: int = ...
-    name: bytes = ...
-    conftype: int = ...
-    msg_from: int = ...
-    pc_body: bytes = ...
-    index: bytes = ...
-    redchannel: int = ...
-    grap_uin: RepeatedScalarFieldContainer[int] = ...
-    pb_reserve: bytes = ...
-
+    senduin: int
     @property
     def sender(self) -> QQWalletAioElem: ...
-
     @property
     def receiver(self) -> QQWalletAioElem: ...
-
-    def __init__(self,
-        *,
-        senduin : Optional[int] = ...,
-        sender : Optional[QQWalletAioElem] = ...,
-        receiver : Optional[QQWalletAioElem] = ...,
-        channelid : Optional[int] = ...,
-        templateid : Optional[int] = ...,
-        resend : Optional[int] = ...,
-        msg_priority : Optional[int] = ...,
-        redtype : Optional[int] = ...,
-        billno : Optional[bytes] = ...,
-        authkey : Optional[bytes] = ...,
-        sessiontype : Optional[int] = ...,
-        msgtype : Optional[int] = ...,
-        envelopeid : Optional[int] = ...,
-        name : Optional[bytes] = ...,
-        conftype : Optional[int] = ...,
-        msg_from : Optional[int] = ...,
-        pc_body : Optional[bytes] = ...,
-        index : Optional[bytes] = ...,
-        redchannel : Optional[int] = ...,
-        grap_uin : Optional[Iterable[int]] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"authkey",b"authkey",u"billno",b"billno",u"channelid",b"channelid",u"conftype",b"conftype",u"envelopeid",b"envelopeid",u"index",b"index",u"msg_from",b"msg_from",u"msg_priority",b"msg_priority",u"msgtype",b"msgtype",u"name",b"name",u"pb_reserve",b"pb_reserve",u"pc_body",b"pc_body",u"receiver",b"receiver",u"redchannel",b"redchannel",u"redtype",b"redtype",u"resend",b"resend",u"sender",b"sender",u"senduin",b"senduin",u"sessiontype",b"sessiontype",u"templateid",b"templateid"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"authkey",b"authkey",u"billno",b"billno",u"channelid",b"channelid",u"conftype",b"conftype",u"envelopeid",b"envelopeid",u"grap_uin",b"grap_uin",u"index",b"index",u"msg_from",b"msg_from",u"msg_priority",b"msg_priority",u"msgtype",b"msgtype",u"name",b"name",u"pb_reserve",b"pb_reserve",u"pc_body",b"pc_body",u"receiver",b"receiver",u"redchannel",b"redchannel",u"redtype",b"redtype",u"resend",b"resend",u"sender",b"sender",u"senduin",b"senduin",u"sessiontype",b"sessiontype",u"templateid",b"templateid"]) -> None: ...
+    channelid: int
+    templateid: int
+    resend: int
+    msg_priority: int
+    redtype: int
+    billno: bytes
+    authkey: bytes
+    sessiontype: int
+    msgtype: int
+    envelopeid: int
+    name: bytes
+    conftype: int
+    msg_from: int
+    pc_body: bytes
+    index: bytes
+    redchannel: int
+    @property
+    def grap_uin(self) -> RepeatedScalarFieldContainer[int]: ...
+    pb_reserve: bytes
+    def __init__(self,
+        *,
+        senduin: Optional[int] = ...,
+        sender: Optional[QQWalletAioElem] = ...,
+        receiver: Optional[QQWalletAioElem] = ...,
+        channelid: Optional[int] = ...,
+        templateid: Optional[int] = ...,
+        resend: Optional[int] = ...,
+        msg_priority: Optional[int] = ...,
+        redtype: Optional[int] = ...,
+        billno: Optional[bytes] = ...,
+        authkey: Optional[bytes] = ...,
+        sessiontype: Optional[int] = ...,
+        msgtype: Optional[int] = ...,
+        envelopeid: Optional[int] = ...,
+        name: Optional[bytes] = ...,
+        conftype: Optional[int] = ...,
+        msg_from: Optional[int] = ...,
+        pc_body: Optional[bytes] = ...,
+        index: Optional[bytes] = ...,
+        redchannel: Optional[int] = ...,
+        grap_uin: Optional[Iterable[int]] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["authkey",b"authkey","billno",b"billno","channelid",b"channelid","conftype",b"conftype","envelopeid",b"envelopeid","index",b"index","msg_from",b"msg_from","msg_priority",b"msg_priority","msgtype",b"msgtype","name",b"name","pb_reserve",b"pb_reserve","pc_body",b"pc_body","receiver",b"receiver","redchannel",b"redchannel","redtype",b"redtype","resend",b"resend","sender",b"sender","senduin",b"senduin","sessiontype",b"sessiontype","templateid",b"templateid"]) -> bool: ...
+    def ClearField(self, field_name: Literal["authkey",b"authkey","billno",b"billno","channelid",b"channelid","conftype",b"conftype","envelopeid",b"envelopeid","grap_uin",b"grap_uin","index",b"index","msg_from",b"msg_from","msg_priority",b"msg_priority","msgtype",b"msgtype","name",b"name","pb_reserve",b"pb_reserve","pc_body",b"pc_body","receiver",b"receiver","redchannel",b"redchannel","redtype",b"redtype","resend",b"resend","sender",b"sender","senduin",b"senduin","sessiontype",b"sessiontype","templateid",b"templateid"]) -> None: ...
 
 class QQWalletAioElem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BACKGROUND_FIELD_NUMBER: int
     ICON_FIELD_NUMBER: int
     TITLE_FIELD_NUMBER: int
@@ -1849,149 +1748,137 @@ class QQWalletAioElem(Message):
     AIO_IMAGE_RIGHT_FIELD_NUMBER: int
     CFT_IMAGE_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
-    background: int = ...
-    icon: int = ...
-    title: bytes = ...
-    subtitle: bytes = ...
-    content: bytes = ...
-    linkurl: bytes = ...
-    blackstripe: bytes = ...
-    notice: bytes = ...
-    title_color: int = ...
-    subtitle_color: int = ...
-    actions_priority: bytes = ...
-    jump_url: bytes = ...
-    native_ios: bytes = ...
-    native_android: bytes = ...
-    iconurl: bytes = ...
-    content_color: int = ...
-    content_bgcolor: int = ...
-    aio_image_left: bytes = ...
-    aio_image_right: bytes = ...
-    cft_image: bytes = ...
-    pb_reserve: bytes = ...
-
-    def __init__(self,
-        *,
-        background : Optional[int] = ...,
-        icon : Optional[int] = ...,
-        title : Optional[bytes] = ...,
-        subtitle : Optional[bytes] = ...,
-        content : Optional[bytes] = ...,
-        linkurl : Optional[bytes] = ...,
-        blackstripe : Optional[bytes] = ...,
-        notice : Optional[bytes] = ...,
-        title_color : Optional[int] = ...,
-        subtitle_color : Optional[int] = ...,
-        actions_priority : Optional[bytes] = ...,
-        jump_url : Optional[bytes] = ...,
-        native_ios : Optional[bytes] = ...,
-        native_android : Optional[bytes] = ...,
-        iconurl : Optional[bytes] = ...,
-        content_color : Optional[int] = ...,
-        content_bgcolor : Optional[int] = ...,
-        aio_image_left : Optional[bytes] = ...,
-        aio_image_right : Optional[bytes] = ...,
-        cft_image : Optional[bytes] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"actions_priority",b"actions_priority",u"aio_image_left",b"aio_image_left",u"aio_image_right",b"aio_image_right",u"background",b"background",u"blackstripe",b"blackstripe",u"cft_image",b"cft_image",u"content",b"content",u"content_bgcolor",b"content_bgcolor",u"content_color",b"content_color",u"icon",b"icon",u"iconurl",b"iconurl",u"jump_url",b"jump_url",u"linkurl",b"linkurl",u"native_android",b"native_android",u"native_ios",b"native_ios",u"notice",b"notice",u"pb_reserve",b"pb_reserve",u"subtitle",b"subtitle",u"subtitle_color",b"subtitle_color",u"title",b"title",u"title_color",b"title_color"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"actions_priority",b"actions_priority",u"aio_image_left",b"aio_image_left",u"aio_image_right",b"aio_image_right",u"background",b"background",u"blackstripe",b"blackstripe",u"cft_image",b"cft_image",u"content",b"content",u"content_bgcolor",b"content_bgcolor",u"content_color",b"content_color",u"icon",b"icon",u"iconurl",b"iconurl",u"jump_url",b"jump_url",u"linkurl",b"linkurl",u"native_android",b"native_android",u"native_ios",b"native_ios",u"notice",b"notice",u"pb_reserve",b"pb_reserve",u"subtitle",b"subtitle",u"subtitle_color",b"subtitle_color",u"title",b"title",u"title_color",b"title_color"]) -> None: ...
+    background: int
+    icon: int
+    title: bytes
+    subtitle: bytes
+    content: bytes
+    linkurl: bytes
+    blackstripe: bytes
+    notice: bytes
+    title_color: int
+    subtitle_color: int
+    actions_priority: bytes
+    jump_url: bytes
+    native_ios: bytes
+    native_android: bytes
+    iconurl: bytes
+    content_color: int
+    content_bgcolor: int
+    aio_image_left: bytes
+    aio_image_right: bytes
+    cft_image: bytes
+    pb_reserve: bytes
+    def __init__(self,
+        *,
+        background: Optional[int] = ...,
+        icon: Optional[int] = ...,
+        title: Optional[bytes] = ...,
+        subtitle: Optional[bytes] = ...,
+        content: Optional[bytes] = ...,
+        linkurl: Optional[bytes] = ...,
+        blackstripe: Optional[bytes] = ...,
+        notice: Optional[bytes] = ...,
+        title_color: Optional[int] = ...,
+        subtitle_color: Optional[int] = ...,
+        actions_priority: Optional[bytes] = ...,
+        jump_url: Optional[bytes] = ...,
+        native_ios: Optional[bytes] = ...,
+        native_android: Optional[bytes] = ...,
+        iconurl: Optional[bytes] = ...,
+        content_color: Optional[int] = ...,
+        content_bgcolor: Optional[int] = ...,
+        aio_image_left: Optional[bytes] = ...,
+        aio_image_right: Optional[bytes] = ...,
+        cft_image: Optional[bytes] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["actions_priority",b"actions_priority","aio_image_left",b"aio_image_left","aio_image_right",b"aio_image_right","background",b"background","blackstripe",b"blackstripe","cft_image",b"cft_image","content",b"content","content_bgcolor",b"content_bgcolor","content_color",b"content_color","icon",b"icon","iconurl",b"iconurl","jump_url",b"jump_url","linkurl",b"linkurl","native_android",b"native_android","native_ios",b"native_ios","notice",b"notice","pb_reserve",b"pb_reserve","subtitle",b"subtitle","subtitle_color",b"subtitle_color","title",b"title","title_color",b"title_color"]) -> bool: ...
+    def ClearField(self, field_name: Literal["actions_priority",b"actions_priority","aio_image_left",b"aio_image_left","aio_image_right",b"aio_image_right","background",b"background","blackstripe",b"blackstripe","cft_image",b"cft_image","content",b"content","content_bgcolor",b"content_bgcolor","content_color",b"content_color","icon",b"icon","iconurl",b"iconurl","jump_url",b"jump_url","linkurl",b"linkurl","native_android",b"native_android","native_ios",b"native_ios","notice",b"notice","pb_reserve",b"pb_reserve","subtitle",b"subtitle","subtitle_color",b"subtitle_color","title",b"title","title_color",b"title_color"]) -> None: ...
 
 class QQWalletMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     AIO_BODY_FIELD_NUMBER: int
-
     @property
     def aio_body(self) -> QQWalletAioBody: ...
-
     def __init__(self,
         *,
-        aio_body : Optional[QQWalletAioBody] = ...,
+        aio_body: Optional[QQWalletAioBody] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"aio_body",b"aio_body"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"aio_body",b"aio_body"]) -> None: ...
+    def HasField(self, field_name: Literal["aio_body",b"aio_body"]) -> bool: ...
+    def ClearField(self, field_name: Literal["aio_body",b"aio_body"]) -> None: ...
 
 class RedBagInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     REDBAG_TYPE_FIELD_NUMBER: int
-    redbag_type: int = ...
-
+    redbag_type: int
     def __init__(self,
         *,
-        redbag_type : Optional[int] = ...,
+        redbag_type: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"redbag_type",b"redbag_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"redbag_type",b"redbag_type"]) -> None: ...
+    def HasField(self, field_name: Literal["redbag_type",b"redbag_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["redbag_type",b"redbag_type"]) -> None: ...
 
 class RichMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TEMPLATE_1_FIELD_NUMBER: int
     SERVICE_ID_FIELD_NUMBER: int
     MSG_RESID_FIELD_NUMBER: int
     RAND_FIELD_NUMBER: int
     SEQ_FIELD_NUMBER: int
     FLAGS_FIELD_NUMBER: int
-    template_1: bytes = ...
-    service_id: int = ...
-    msg_resid: bytes = ...
-    rand: int = ...
-    seq: int = ...
-    flags: int = ...
-
+    template_1: bytes
+    service_id: int
+    msg_resid: bytes
+    rand: int
+    seq: int
+    flags: int
     def __init__(self,
         *,
-        template_1 : Optional[bytes] = ...,
-        service_id : Optional[int] = ...,
-        msg_resid : Optional[bytes] = ...,
-        rand : Optional[int] = ...,
-        seq : Optional[int] = ...,
-        flags : Optional[int] = ...,
+        template_1: Optional[bytes] = ...,
+        service_id: Optional[int] = ...,
+        msg_resid: Optional[bytes] = ...,
+        rand: Optional[int] = ...,
+        seq: Optional[int] = ...,
+        flags: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"flags",b"flags",u"msg_resid",b"msg_resid",u"rand",b"rand",u"seq",b"seq",u"service_id",b"service_id",u"template_1",b"template_1"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"flags",b"flags",u"msg_resid",b"msg_resid",u"rand",b"rand",u"seq",b"seq",u"service_id",b"service_id",u"template_1",b"template_1"]) -> None: ...
+    def HasField(self, field_name: Literal["flags",b"flags","msg_resid",b"msg_resid","rand",b"rand","seq",b"seq","service_id",b"service_id","template_1",b"template_1"]) -> bool: ...
+    def ClearField(self, field_name: Literal["flags",b"flags","msg_resid",b"msg_resid","rand",b"rand","seq",b"seq","service_id",b"service_id","template_1",b"template_1"]) -> None: ...
 
 class RichText(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     ATTR_FIELD_NUMBER: int
     ELEMS_FIELD_NUMBER: int
     NOT_ONLINE_FILE_FIELD_NUMBER: int
     PTT_FIELD_NUMBER: int
     TMP_PTT_FIELD_NUMBER: int
     TRANS_211_TMP_MSG_FIELD_NUMBER: int
-
     @property
     def attr(self) -> Attr: ...
-
     @property
     def elems(self) -> RepeatedCompositeFieldContainer[Elem]: ...
-
     @property
     def not_online_file(self) -> NotOnlineFile: ...
-
     @property
     def ptt(self) -> Ptt: ...
-
     @property
     def tmp_ptt(self) -> TmpPtt: ...
-
     @property
     def trans_211_tmp_msg(self) -> Trans211TmpMsg: ...
-
     def __init__(self,
         *,
-        attr : Optional[Attr] = ...,
-        elems : Optional[Iterable[Elem]] = ...,
-        not_online_file : Optional[NotOnlineFile] = ...,
-        ptt : Optional[Ptt] = ...,
-        tmp_ptt : Optional[TmpPtt] = ...,
-        trans_211_tmp_msg : Optional[Trans211TmpMsg] = ...,
+        attr: Optional[Attr] = ...,
+        elems: Optional[Iterable[Elem]] = ...,
+        not_online_file: Optional[NotOnlineFile] = ...,
+        ptt: Optional[Ptt] = ...,
+        tmp_ptt: Optional[TmpPtt] = ...,
+        trans_211_tmp_msg: Optional[Trans211TmpMsg] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"attr",b"attr",u"not_online_file",b"not_online_file",u"ptt",b"ptt",u"tmp_ptt",b"tmp_ptt",u"trans_211_tmp_msg",b"trans_211_tmp_msg"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"attr",b"attr",u"elems",b"elems",u"not_online_file",b"not_online_file",u"ptt",b"ptt",u"tmp_ptt",b"tmp_ptt",u"trans_211_tmp_msg",b"trans_211_tmp_msg"]) -> None: ...
+    def HasField(self, field_name: Literal["attr",b"attr","not_online_file",b"not_online_file","ptt",b"ptt","tmp_ptt",b"tmp_ptt","trans_211_tmp_msg",b"trans_211_tmp_msg"]) -> bool: ...
+    def ClearField(self, field_name: Literal["attr",b"attr","elems",b"elems","not_online_file",b"not_online_file","ptt",b"ptt","tmp_ptt",b"tmp_ptt","trans_211_tmp_msg",b"trans_211_tmp_msg"]) -> None: ...
 
 class SecretFileMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FILE_KEY_FIELD_NUMBER: int
     FROM_UIN_FIELD_NUMBER: int
     TO_UIN_FIELD_NUMBER: int
@@ -2007,82 +1894,77 @@ class SecretFileMsg(Message):
     ELEM_FLAGS2_FIELD_NUMBER: int
     OPERTYPE_FIELD_NUMBER: int
     FROMPHONENUM_FIELD_NUMBER: int
-    file_key: bytes = ...
-    from_uin: int = ...
-    to_uin: int = ...
-    status: int = ...
-    ttl: int = ...
-    type: int = ...
-    encrypt_prehead_length: int = ...
-    encrypt_type: int = ...
-    encrypt_key: bytes = ...
-    read_times: int = ...
-    left_time: int = ...
-    opertype: int = ...
-    fromphonenum: Text = ...
-
+    file_key: bytes
+    from_uin: int
+    to_uin: int
+    status: int
+    ttl: int
+    type: int
+    encrypt_prehead_length: int
+    encrypt_type: int
+    encrypt_key: bytes
+    read_times: int
+    left_time: int
     @property
     def not_online_image(self) -> NotOnlineImage: ...
-
     @property
     def elem_flags2(self) -> ElemFlags2: ...
-
-    def __init__(self,
-        *,
-        file_key : Optional[bytes] = ...,
-        from_uin : Optional[int] = ...,
-        to_uin : Optional[int] = ...,
-        status : Optional[int] = ...,
-        ttl : Optional[int] = ...,
-        type : Optional[int] = ...,
-        encrypt_prehead_length : Optional[int] = ...,
-        encrypt_type : Optional[int] = ...,
-        encrypt_key : Optional[bytes] = ...,
-        read_times : Optional[int] = ...,
-        left_time : Optional[int] = ...,
-        not_online_image : Optional[NotOnlineImage] = ...,
-        elem_flags2 : Optional[ElemFlags2] = ...,
-        opertype : Optional[int] = ...,
-        fromphonenum : Optional[Text] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"elem_flags2",b"elem_flags2",u"encrypt_key",b"encrypt_key",u"encrypt_prehead_length",b"encrypt_prehead_length",u"encrypt_type",b"encrypt_type",u"file_key",b"file_key",u"from_uin",b"from_uin",u"fromphonenum",b"fromphonenum",u"left_time",b"left_time",u"not_online_image",b"not_online_image",u"opertype",b"opertype",u"read_times",b"read_times",u"status",b"status",u"to_uin",b"to_uin",u"ttl",b"ttl",u"type",b"type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"elem_flags2",b"elem_flags2",u"encrypt_key",b"encrypt_key",u"encrypt_prehead_length",b"encrypt_prehead_length",u"encrypt_type",b"encrypt_type",u"file_key",b"file_key",u"from_uin",b"from_uin",u"fromphonenum",b"fromphonenum",u"left_time",b"left_time",u"not_online_image",b"not_online_image",u"opertype",b"opertype",u"read_times",b"read_times",u"status",b"status",u"to_uin",b"to_uin",u"ttl",b"ttl",u"type",b"type"]) -> None: ...
+    opertype: int
+    fromphonenum: Text
+    def __init__(self,
+        *,
+        file_key: Optional[bytes] = ...,
+        from_uin: Optional[int] = ...,
+        to_uin: Optional[int] = ...,
+        status: Optional[int] = ...,
+        ttl: Optional[int] = ...,
+        type: Optional[int] = ...,
+        encrypt_prehead_length: Optional[int] = ...,
+        encrypt_type: Optional[int] = ...,
+        encrypt_key: Optional[bytes] = ...,
+        read_times: Optional[int] = ...,
+        left_time: Optional[int] = ...,
+        not_online_image: Optional[NotOnlineImage] = ...,
+        elem_flags2: Optional[ElemFlags2] = ...,
+        opertype: Optional[int] = ...,
+        fromphonenum: Optional[Text] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["elem_flags2",b"elem_flags2","encrypt_key",b"encrypt_key","encrypt_prehead_length",b"encrypt_prehead_length","encrypt_type",b"encrypt_type","file_key",b"file_key","from_uin",b"from_uin","fromphonenum",b"fromphonenum","left_time",b"left_time","not_online_image",b"not_online_image","opertype",b"opertype","read_times",b"read_times","status",b"status","to_uin",b"to_uin","ttl",b"ttl","type",b"type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["elem_flags2",b"elem_flags2","encrypt_key",b"encrypt_key","encrypt_prehead_length",b"encrypt_prehead_length","encrypt_type",b"encrypt_type","file_key",b"file_key","from_uin",b"from_uin","fromphonenum",b"fromphonenum","left_time",b"left_time","not_online_image",b"not_online_image","opertype",b"opertype","read_times",b"read_times","status",b"status","to_uin",b"to_uin","ttl",b"ttl","type",b"type"]) -> None: ...
 
 class ShakeWindow(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TYPE_FIELD_NUMBER: int
     RESERVE_FIELD_NUMBER: int
     UIN_FIELD_NUMBER: int
-    type: int = ...
-    reserve: int = ...
-    uin: int = ...
-
+    type: int
+    reserve: int
+    uin: int
     def __init__(self,
         *,
-        type : Optional[int] = ...,
-        reserve : Optional[int] = ...,
-        uin : Optional[int] = ...,
+        type: Optional[int] = ...,
+        reserve: Optional[int] = ...,
+        uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"reserve",b"reserve",u"type",b"type",u"uin",b"uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"reserve",b"reserve",u"type",b"type",u"uin",b"uin"]) -> None: ...
+    def HasField(self, field_name: Literal["reserve",b"reserve","type",b"type","uin",b"uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["reserve",b"reserve","type",b"type","uin",b"uin"]) -> None: ...
 
 class SmallEmoji(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     PACK_ID_SUM_FIELD_NUMBER: int
     IMAGE_TYPE_FIELD_NUMBER: int
-    pack_id_sum: int = ...
-    image_type: int = ...
-
+    pack_id_sum: int
+    image_type: int
     def __init__(self,
         *,
-        pack_id_sum : Optional[int] = ...,
-        image_type : Optional[int] = ...,
+        pack_id_sum: Optional[int] = ...,
+        image_type: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"image_type",b"image_type",u"pack_id_sum",b"pack_id_sum"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"image_type",b"image_type",u"pack_id_sum",b"pack_id_sum"]) -> None: ...
+    def HasField(self, field_name: Literal["image_type",b"image_type","pack_id_sum",b"pack_id_sum"]) -> bool: ...
+    def ClearField(self, field_name: Literal["image_type",b"image_type","pack_id_sum",b"pack_id_sum"]) -> None: ...
 
 class SourceMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     ORIG_SEQS_FIELD_NUMBER: int
     SENDER_UIN_FIELD_NUMBER: int
     TIME_FIELD_NUMBER: int
@@ -2094,78 +1976,75 @@ class SourceMsg(Message):
     SRC_MSG_FIELD_NUMBER: int
     TO_UIN_FIELD_NUMBER: int
     TROOP_NAME_FIELD_NUMBER: int
-    orig_seqs: RepeatedScalarFieldContainer[int] = ...
-    sender_uin: int = ...
-    time: int = ...
-    flag: int = ...
-    type: int = ...
-    rich_msg: bytes = ...
-    pb_reserve: bytes = ...
-    src_msg: bytes = ...
-    to_uin: int = ...
-    troop_name: bytes = ...
-
+    @property
+    def orig_seqs(self) -> RepeatedScalarFieldContainer[int]: ...
+    sender_uin: int
+    time: int
+    flag: int
     @property
     def elems(self) -> RepeatedCompositeFieldContainer[Elem]: ...
-
-    def __init__(self,
-        *,
-        orig_seqs : Optional[Iterable[int]] = ...,
-        sender_uin : Optional[int] = ...,
-        time : Optional[int] = ...,
-        flag : Optional[int] = ...,
-        elems : Optional[Iterable[Elem]] = ...,
-        type : Optional[int] = ...,
-        rich_msg : Optional[bytes] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        src_msg : Optional[bytes] = ...,
-        to_uin : Optional[int] = ...,
-        troop_name : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"flag",b"flag",u"pb_reserve",b"pb_reserve",u"rich_msg",b"rich_msg",u"sender_uin",b"sender_uin",u"src_msg",b"src_msg",u"time",b"time",u"to_uin",b"to_uin",u"troop_name",b"troop_name",u"type",b"type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"elems",b"elems",u"flag",b"flag",u"orig_seqs",b"orig_seqs",u"pb_reserve",b"pb_reserve",u"rich_msg",b"rich_msg",u"sender_uin",b"sender_uin",u"src_msg",b"src_msg",u"time",b"time",u"to_uin",b"to_uin",u"troop_name",b"troop_name",u"type",b"type"]) -> None: ...
+    type: int
+    rich_msg: bytes
+    pb_reserve: bytes
+    src_msg: bytes
+    to_uin: int
+    troop_name: bytes
+    def __init__(self,
+        *,
+        orig_seqs: Optional[Iterable[int]] = ...,
+        sender_uin: Optional[int] = ...,
+        time: Optional[int] = ...,
+        flag: Optional[int] = ...,
+        elems: Optional[Iterable[Elem]] = ...,
+        type: Optional[int] = ...,
+        rich_msg: Optional[bytes] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        src_msg: Optional[bytes] = ...,
+        to_uin: Optional[int] = ...,
+        troop_name: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["flag",b"flag","pb_reserve",b"pb_reserve","rich_msg",b"rich_msg","sender_uin",b"sender_uin","src_msg",b"src_msg","time",b"time","to_uin",b"to_uin","troop_name",b"troop_name","type",b"type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["elems",b"elems","flag",b"flag","orig_seqs",b"orig_seqs","pb_reserve",b"pb_reserve","rich_msg",b"rich_msg","sender_uin",b"sender_uin","src_msg",b"src_msg","time",b"time","to_uin",b"to_uin","troop_name",b"troop_name","type",b"type"]) -> None: ...
 
 class PlainText(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     STR_FIELD_NUMBER: int
     LINK_FIELD_NUMBER: int
     ATTR_6_BUF_FIELD_NUMBER: int
     ATTR_7_BUF_FIELD_NUMBER: int
     BUF_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
-    str: bytes = ...
-    link: Text = ...
-    attr_6_buf: bytes = ...
-    attr_7_buf: bytes = ...
-    buf: bytes = ...
-    pb_reserve: bytes = ...
-
+    str: bytes
+    link: Text
+    attr_6_buf: bytes
+    attr_7_buf: bytes
+    buf: bytes
+    pb_reserve: bytes
     def __init__(self,
         *,
-        str : Optional[bytes] = ...,
-        link : Optional[Text] = ...,
-        attr_6_buf : Optional[bytes] = ...,
-        attr_7_buf : Optional[bytes] = ...,
-        buf : Optional[bytes] = ...,
-        pb_reserve : Optional[bytes] = ...,
+        str: Optional[bytes] = ...,
+        link: Optional[Text] = ...,
+        attr_6_buf: Optional[bytes] = ...,
+        attr_7_buf: Optional[bytes] = ...,
+        buf: Optional[bytes] = ...,
+        pb_reserve: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"attr_6_buf",b"attr_6_buf",u"attr_7_buf",b"attr_7_buf",u"buf",b"buf",u"link",b"link",u"pb_reserve",b"pb_reserve",u"str",b"str"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"attr_6_buf",b"attr_6_buf",u"attr_7_buf",b"attr_7_buf",u"buf",b"buf",u"link",b"link",u"pb_reserve",b"pb_reserve",u"str",b"str"]) -> None: ...
+    def HasField(self, field_name: Literal["attr_6_buf",b"attr_6_buf","attr_7_buf",b"attr_7_buf","buf",b"buf","link",b"link","pb_reserve",b"pb_reserve","str",b"str"]) -> bool: ...
+    def ClearField(self, field_name: Literal["attr_6_buf",b"attr_6_buf","attr_7_buf",b"attr_7_buf","buf",b"buf","link",b"link","pb_reserve",b"pb_reserve","str",b"str"]) -> None: ...
 
 class TipsInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TEXT_FIELD_NUMBER: int
-    text: Text = ...
-
+    text: Text
     def __init__(self,
         *,
-        text : Optional[Text] = ...,
+        text: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"text",b"text"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"text",b"text"]) -> None: ...
+    def HasField(self, field_name: Literal["text",b"text"]) -> bool: ...
+    def ClearField(self, field_name: Literal["text",b"text"]) -> None: ...
 
 class TmpPtt(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FILE_TYPE_FIELD_NUMBER: int
     FILE_UUID_FIELD_NUMBER: int
     FILE_MD5_FIELD_NUMBER: int
@@ -2178,69 +2057,66 @@ class TmpPtt(Message):
     MSG_ID_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
     PTT_ENCODE_DATA_FIELD_NUMBER: int
-    file_type: int = ...
-    file_uuid: bytes = ...
-    file_md5: bytes = ...
-    file_name: bytes = ...
-    file_size: int = ...
-    ptt_times: int = ...
-    user_type: int = ...
-    ptttrans_flag: int = ...
-    busi_type: int = ...
-    msg_id: int = ...
-    pb_reserve: bytes = ...
-    ptt_encode_data: bytes = ...
-
-    def __init__(self,
-        *,
-        file_type : Optional[int] = ...,
-        file_uuid : Optional[bytes] = ...,
-        file_md5 : Optional[bytes] = ...,
-        file_name : Optional[bytes] = ...,
-        file_size : Optional[int] = ...,
-        ptt_times : Optional[int] = ...,
-        user_type : Optional[int] = ...,
-        ptttrans_flag : Optional[int] = ...,
-        busi_type : Optional[int] = ...,
-        msg_id : Optional[int] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ptt_encode_data : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"busi_type",b"busi_type",u"file_md5",b"file_md5",u"file_name",b"file_name",u"file_size",b"file_size",u"file_type",b"file_type",u"file_uuid",b"file_uuid",u"msg_id",b"msg_id",u"pb_reserve",b"pb_reserve",u"ptt_encode_data",b"ptt_encode_data",u"ptt_times",b"ptt_times",u"ptttrans_flag",b"ptttrans_flag",u"user_type",b"user_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"busi_type",b"busi_type",u"file_md5",b"file_md5",u"file_name",b"file_name",u"file_size",b"file_size",u"file_type",b"file_type",u"file_uuid",b"file_uuid",u"msg_id",b"msg_id",u"pb_reserve",b"pb_reserve",u"ptt_encode_data",b"ptt_encode_data",u"ptt_times",b"ptt_times",u"ptttrans_flag",b"ptttrans_flag",u"user_type",b"user_type"]) -> None: ...
+    file_type: int
+    file_uuid: bytes
+    file_md5: bytes
+    file_name: bytes
+    file_size: int
+    ptt_times: int
+    user_type: int
+    ptttrans_flag: int
+    busi_type: int
+    msg_id: int
+    pb_reserve: bytes
+    ptt_encode_data: bytes
+    def __init__(self,
+        *,
+        file_type: Optional[int] = ...,
+        file_uuid: Optional[bytes] = ...,
+        file_md5: Optional[bytes] = ...,
+        file_name: Optional[bytes] = ...,
+        file_size: Optional[int] = ...,
+        ptt_times: Optional[int] = ...,
+        user_type: Optional[int] = ...,
+        ptttrans_flag: Optional[int] = ...,
+        busi_type: Optional[int] = ...,
+        msg_id: Optional[int] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ptt_encode_data: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["busi_type",b"busi_type","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","file_type",b"file_type","file_uuid",b"file_uuid","msg_id",b"msg_id","pb_reserve",b"pb_reserve","ptt_encode_data",b"ptt_encode_data","ptt_times",b"ptt_times","ptttrans_flag",b"ptttrans_flag","user_type",b"user_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["busi_type",b"busi_type","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","file_type",b"file_type","file_uuid",b"file_uuid","msg_id",b"msg_id","pb_reserve",b"pb_reserve","ptt_encode_data",b"ptt_encode_data","ptt_times",b"ptt_times","ptttrans_flag",b"ptttrans_flag","user_type",b"user_type"]) -> None: ...
 
 class Trans211TmpMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     MSG_BODY_FIELD_NUMBER: int
     C2C_CMD_FIELD_NUMBER: int
-    msg_body: bytes = ...
-    c2c_cmd: int = ...
-
+    msg_body: bytes
+    c2c_cmd: int
     def __init__(self,
         *,
-        msg_body : Optional[bytes] = ...,
-        c2c_cmd : Optional[int] = ...,
+        msg_body: Optional[bytes] = ...,
+        c2c_cmd: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2c_cmd",b"c2c_cmd",u"msg_body",b"msg_body"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2c_cmd",b"c2c_cmd",u"msg_body",b"msg_body"]) -> None: ...
+    def HasField(self, field_name: Literal["c2c_cmd",b"c2c_cmd","msg_body",b"msg_body"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2c_cmd",b"c2c_cmd","msg_body",b"msg_body"]) -> None: ...
 
 class TransElem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     ELEM_TYPE_FIELD_NUMBER: int
     ELEM_VALUE_FIELD_NUMBER: int
-    elem_type: int = ...
-    elem_value: bytes = ...
-
+    elem_type: int
+    elem_value: bytes
     def __init__(self,
         *,
-        elem_type : Optional[int] = ...,
-        elem_value : Optional[bytes] = ...,
+        elem_type: Optional[int] = ...,
+        elem_value: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"elem_type",b"elem_type",u"elem_value",b"elem_value"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"elem_type",b"elem_type",u"elem_value",b"elem_value"]) -> None: ...
+    def HasField(self, field_name: Literal["elem_type",b"elem_type","elem_value",b"elem_value"]) -> bool: ...
+    def ClearField(self, field_name: Literal["elem_type",b"elem_type","elem_value",b"elem_value"]) -> None: ...
 
 class VideoFile(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FILE_UUID_FIELD_NUMBER: int
     FILE_MD5_FIELD_NUMBER: int
     FILE_NAME_FIELD_NUMBER: int
@@ -2265,90 +2141,89 @@ class VideoFile(Message):
     THUMB_DOWNLOAD_FLAG_FIELD_NUMBER: int
     VIDEO_DOWNLOAD_FLAG_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
-    file_uuid: bytes = ...
-    file_md5: bytes = ...
-    file_name: bytes = ...
-    file_format: int = ...
-    file_time: int = ...
-    file_size: int = ...
-    thumb_width: int = ...
-    thumb_height: int = ...
-    thumb_file_md5: bytes = ...
-    source: bytes = ...
-    thumb_file_size: int = ...
-    busi_type: int = ...
-    from_chat_type: int = ...
-    to_chat_type: int = ...
-    support_progressive: bool = ...
-    file_width: int = ...
-    file_height: int = ...
-    sub_busi_type: int = ...
-    video_attr: int = ...
-    thumb_file_urls: RepeatedScalarFieldContainer[bytes] = ...
-    video_file_urls: RepeatedScalarFieldContainer[bytes] = ...
-    thumb_download_flag: int = ...
-    video_download_flag: int = ...
-    pb_reserve: bytes = ...
-
-    def __init__(self,
-        *,
-        file_uuid : Optional[bytes] = ...,
-        file_md5 : Optional[bytes] = ...,
-        file_name : Optional[bytes] = ...,
-        file_format : Optional[int] = ...,
-        file_time : Optional[int] = ...,
-        file_size : Optional[int] = ...,
-        thumb_width : Optional[int] = ...,
-        thumb_height : Optional[int] = ...,
-        thumb_file_md5 : Optional[bytes] = ...,
-        source : Optional[bytes] = ...,
-        thumb_file_size : Optional[int] = ...,
-        busi_type : Optional[int] = ...,
-        from_chat_type : Optional[int] = ...,
-        to_chat_type : Optional[int] = ...,
-        support_progressive : Optional[bool] = ...,
-        file_width : Optional[int] = ...,
-        file_height : Optional[int] = ...,
-        sub_busi_type : Optional[int] = ...,
-        video_attr : Optional[int] = ...,
-        thumb_file_urls : Optional[Iterable[bytes]] = ...,
-        video_file_urls : Optional[Iterable[bytes]] = ...,
-        thumb_download_flag : Optional[int] = ...,
-        video_download_flag : Optional[int] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"busi_type",b"busi_type",u"file_format",b"file_format",u"file_height",b"file_height",u"file_md5",b"file_md5",u"file_name",b"file_name",u"file_size",b"file_size",u"file_time",b"file_time",u"file_uuid",b"file_uuid",u"file_width",b"file_width",u"from_chat_type",b"from_chat_type",u"pb_reserve",b"pb_reserve",u"source",b"source",u"sub_busi_type",b"sub_busi_type",u"support_progressive",b"support_progressive",u"thumb_download_flag",b"thumb_download_flag",u"thumb_file_md5",b"thumb_file_md5",u"thumb_file_size",b"thumb_file_size",u"thumb_height",b"thumb_height",u"thumb_width",b"thumb_width",u"to_chat_type",b"to_chat_type",u"video_attr",b"video_attr",u"video_download_flag",b"video_download_flag"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"busi_type",b"busi_type",u"file_format",b"file_format",u"file_height",b"file_height",u"file_md5",b"file_md5",u"file_name",b"file_name",u"file_size",b"file_size",u"file_time",b"file_time",u"file_uuid",b"file_uuid",u"file_width",b"file_width",u"from_chat_type",b"from_chat_type",u"pb_reserve",b"pb_reserve",u"source",b"source",u"sub_busi_type",b"sub_busi_type",u"support_progressive",b"support_progressive",u"thumb_download_flag",b"thumb_download_flag",u"thumb_file_md5",b"thumb_file_md5",u"thumb_file_size",b"thumb_file_size",u"thumb_file_urls",b"thumb_file_urls",u"thumb_height",b"thumb_height",u"thumb_width",b"thumb_width",u"to_chat_type",b"to_chat_type",u"video_attr",b"video_attr",u"video_download_flag",b"video_download_flag",u"video_file_urls",b"video_file_urls"]) -> None: ...
+    file_uuid: bytes
+    file_md5: bytes
+    file_name: bytes
+    file_format: int
+    file_time: int
+    file_size: int
+    thumb_width: int
+    thumb_height: int
+    thumb_file_md5: bytes
+    source: bytes
+    thumb_file_size: int
+    busi_type: int
+    from_chat_type: int
+    to_chat_type: int
+    support_progressive: bool
+    file_width: int
+    file_height: int
+    sub_busi_type: int
+    video_attr: int
+    @property
+    def thumb_file_urls(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    @property
+    def video_file_urls(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    thumb_download_flag: int
+    video_download_flag: int
+    pb_reserve: bytes
+    def __init__(self,
+        *,
+        file_uuid: Optional[bytes] = ...,
+        file_md5: Optional[bytes] = ...,
+        file_name: Optional[bytes] = ...,
+        file_format: Optional[int] = ...,
+        file_time: Optional[int] = ...,
+        file_size: Optional[int] = ...,
+        thumb_width: Optional[int] = ...,
+        thumb_height: Optional[int] = ...,
+        thumb_file_md5: Optional[bytes] = ...,
+        source: Optional[bytes] = ...,
+        thumb_file_size: Optional[int] = ...,
+        busi_type: Optional[int] = ...,
+        from_chat_type: Optional[int] = ...,
+        to_chat_type: Optional[int] = ...,
+        support_progressive: Optional[bool] = ...,
+        file_width: Optional[int] = ...,
+        file_height: Optional[int] = ...,
+        sub_busi_type: Optional[int] = ...,
+        video_attr: Optional[int] = ...,
+        thumb_file_urls: Optional[Iterable[bytes]] = ...,
+        video_file_urls: Optional[Iterable[bytes]] = ...,
+        thumb_download_flag: Optional[int] = ...,
+        video_download_flag: Optional[int] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["busi_type",b"busi_type","file_format",b"file_format","file_height",b"file_height","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","file_time",b"file_time","file_uuid",b"file_uuid","file_width",b"file_width","from_chat_type",b"from_chat_type","pb_reserve",b"pb_reserve","source",b"source","sub_busi_type",b"sub_busi_type","support_progressive",b"support_progressive","thumb_download_flag",b"thumb_download_flag","thumb_file_md5",b"thumb_file_md5","thumb_file_size",b"thumb_file_size","thumb_height",b"thumb_height","thumb_width",b"thumb_width","to_chat_type",b"to_chat_type","video_attr",b"video_attr","video_download_flag",b"video_download_flag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["busi_type",b"busi_type","file_format",b"file_format","file_height",b"file_height","file_md5",b"file_md5","file_name",b"file_name","file_size",b"file_size","file_time",b"file_time","file_uuid",b"file_uuid","file_width",b"file_width","from_chat_type",b"from_chat_type","pb_reserve",b"pb_reserve","source",b"source","sub_busi_type",b"sub_busi_type","support_progressive",b"support_progressive","thumb_download_flag",b"thumb_download_flag","thumb_file_md5",b"thumb_file_md5","thumb_file_size",b"thumb_file_size","thumb_file_urls",b"thumb_file_urls","thumb_height",b"thumb_height","thumb_width",b"thumb_width","to_chat_type",b"to_chat_type","video_attr",b"video_attr","video_download_flag",b"video_download_flag","video_file_urls",b"video_file_urls"]) -> None: ...
 
 class WorkflowNotifyMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     EXT_MSG_FIELD_NUMBER: int
     CREATE_UIN_FIELD_NUMBER: int
-    ext_msg: bytes = ...
-    create_uin: int = ...
-
+    ext_msg: bytes
+    create_uin: int
     def __init__(self,
         *,
-        ext_msg : Optional[bytes] = ...,
-        create_uin : Optional[int] = ...,
+        ext_msg: Optional[bytes] = ...,
+        create_uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"create_uin",b"create_uin",u"ext_msg",b"ext_msg"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"create_uin",b"create_uin",u"ext_msg",b"ext_msg"]) -> None: ...
+    def HasField(self, field_name: Literal["create_uin",b"create_uin","ext_msg",b"ext_msg"]) -> bool: ...
+    def ClearField(self, field_name: Literal["create_uin",b"create_uin","ext_msg",b"ext_msg"]) -> None: ...
 
 class LocationInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     LONGITUDE_FIELD_NUMBER: int
     LATITUDE_FIELD_NUMBER: int
     DESC_FIELD_NUMBER: int
-    longitude: float = ...
-    latitude: float = ...
-    desc: bytes = ...
-
+    longitude: float
+    latitude: float
+    desc: bytes
     def __init__(self,
         *,
-        longitude : Optional[float] = ...,
-        latitude : Optional[float] = ...,
-        desc : Optional[bytes] = ...,
+        longitude: Optional[float] = ...,
+        latitude: Optional[float] = ...,
+        desc: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"desc",b"desc",u"latitude",b"latitude",u"longitude",b"longitude"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"desc",b"desc",u"latitude",b"latitude",u"longitude",b"longitude"]) -> None: ...
+    def HasField(self, field_name: Literal["desc",b"desc","latitude",b"latitude","longitude",b"longitude"]) -> bool: ...
+    def ClearField(self, field_name: Literal["desc",b"desc","latitude",b"latitude","longitude",b"longitude"]) -> None: ...
diff --git a/cai/pb/im/msg/msg_head/msg_head_pb2.py b/cai/pb/im/msg/msg_head/msg_head_pb2.py
index f55330e0..840f1bc3 100644
--- a/cai/pb/im/msg/msg_head/msg_head_pb2.py
+++ b/cai/pb/im/msg/msg_head/msg_head_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/im/msg/msg_head/msg_head.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -13,1058 +14,22 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/im/msg/msg_head/msg_head.proto',
-  package='im.msg.msg_head',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n%cai/pb/im/msg/msg_head/msg_head.proto\x12\x0fim.msg.msg_head\"\xd4\x01\n\x07\x43\x32\x43Head\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x10\n\x08\x66rom_uin\x18\x02 \x01(\x04\x12\x0f\n\x07\x63\x63_type\x18\x03 \x01(\r\x12\x0e\n\x06\x63\x63_cmd\x18\x04 \x01(\r\x12\x14\n\x0c\x61uth_pic_sig\x18\x05 \x01(\x0c\x12\x10\n\x08\x61uth_sig\x18\x06 \x01(\x0c\x12\x10\n\x08\x61uth_buf\x18\x07 \x01(\x0c\x12\x13\n\x0bserver_time\x18\x08 \x01(\r\x12\x13\n\x0b\x63lient_time\x18\t \x01(\r\x12\x0c\n\x04rand\x18\n \x01(\r\x12\x14\n\x0cphone_number\x18\x0b \x01(\t\"\xb7\x03\n\x06\x43SHead\x12\x0b\n\x03uin\x18\x01 \x01(\x04\x12\x0f\n\x07\x63ommand\x18\x02 \x01(\r\x12\x0b\n\x03seq\x18\x03 \x01(\r\x12\x0f\n\x07version\x18\x04 \x01(\r\x12\x13\n\x0bretry_times\x18\x05 \x01(\r\x12\x13\n\x0b\x63lient_type\x18\x06 \x01(\r\x12\r\n\x05pubno\x18\x07 \x01(\r\x12\x0f\n\x07localid\x18\x08 \x01(\r\x12\x10\n\x08timezone\x18\t \x01(\r\x12\x11\n\tclient_ip\x18\n \x01(\x07\x12\x13\n\x0b\x63lient_port\x18\x0b \x01(\r\x12\x0f\n\x07\x63onn_ip\x18\x0c \x01(\x07\x12\x11\n\tconn_port\x18\r \x01(\r\x12\x14\n\x0cinterface_ip\x18\x0e \x01(\x07\x12\x16\n\x0einterface_port\x18\x0f \x01(\r\x12\x11\n\tactual_ip\x18\x10 \x01(\x07\x12\x0c\n\x04\x66lag\x18\x11 \x01(\r\x12\x11\n\ttimestamp\x18\x12 \x01(\x07\x12\x0e\n\x06subcmd\x18\x13 \x01(\r\x12\x0e\n\x06result\x18\x14 \x01(\r\x12\x0e\n\x06\x61pp_id\x18\x15 \x01(\r\x12\x13\n\x0binstance_id\x18\x16 \x01(\r\x12\x12\n\nsession_id\x18\x17 \x01(\x04\x12\x0e\n\x06idc_id\x18\x18 \x01(\r\"\x85\x01\n\tDeltaHead\x12\x11\n\ttotal_len\x18\x01 \x01(\x04\x12\x0e\n\x06offset\x18\x02 \x01(\x04\x12\x12\n\nack_offset\x18\x03 \x01(\x04\x12\x0e\n\x06\x63ookie\x18\x04 \x01(\x0c\x12\x12\n\nack_cookie\x18\x05 \x01(\x0c\x12\x0e\n\x06result\x18\x06 \x01(\r\x12\r\n\x05\x66lags\x18\x07 \x01(\r\"\xa1\x03\n\x04Head\x12\x11\n\thead_type\x18\x01 \x01(\r\x12(\n\x07\x63s_head\x18\x02 \x01(\x0b\x32\x17.im.msg.msg_head.CSHead\x12*\n\x08s2c_head\x18\x03 \x01(\x0b\x32\x18.im.msg.msg_head.S2CHead\x12\x34\n\rhttpconn_head\x18\x04 \x01(\x0b\x32\x1d.im.msg.msg_head.HttpConnHead\x12\x12\n\npaint_flag\x18\x05 \x01(\r\x12,\n\tlogin_sig\x18\x06 \x01(\x0b\x32\x19.im.msg.msg_head.LoginSig\x12.\n\ndelta_head\x18\x07 \x01(\x0b\x32\x1a.im.msg.msg_head.DeltaHead\x12*\n\x08\x63\x32\x63_head\x18\x08 \x01(\x0b\x32\x18.im.msg.msg_head.C2CHead\x12.\n\nsconn_head\x18\t \x01(\x0b\x32\x1a.im.msg.msg_head.SConnHead\x12,\n\tinst_ctrl\x18\n \x01(\x0b\x32\x19.im.msg.msg_head.InstCtrl\"\x98\x04\n\x0cHttpConnHead\x12\x0b\n\x03uin\x18\x01 \x01(\x04\x12\x0f\n\x07\x63ommand\x18\x02 \x01(\r\x12\x13\n\x0bsub_command\x18\x03 \x01(\r\x12\x0b\n\x03seq\x18\x04 \x01(\r\x12\x0f\n\x07version\x18\x05 \x01(\r\x12\x13\n\x0bretry_times\x18\x06 \x01(\r\x12\x13\n\x0b\x63lient_type\x18\x07 \x01(\r\x12\x0e\n\x06pub_no\x18\x08 \x01(\r\x12\x10\n\x08local_id\x18\t \x01(\r\x12\x11\n\ttime_zone\x18\n \x01(\r\x12\x11\n\tclient_ip\x18\x0b \x01(\x07\x12\x13\n\x0b\x63lient_port\x18\x0c \x01(\r\x12\x11\n\tqzhttp_ip\x18\r \x01(\x07\x12\x13\n\x0bqzhttp_port\x18\x0e \x01(\r\x12\x0e\n\x06spp_ip\x18\x0f \x01(\x07\x12\x10\n\x08spp_port\x18\x10 \x01(\r\x12\x0c\n\x04\x66lag\x18\x11 \x01(\r\x12\x0b\n\x03key\x18\x12 \x01(\x0c\x12\x15\n\rcompress_type\x18\x13 \x01(\r\x12\x13\n\x0borigin_size\x18\x14 \x01(\r\x12\x12\n\nerror_code\x18\x15 \x01(\r\x12.\n\x08redirect\x18\x16 \x01(\x0b\x32\x1c.im.msg.msg_head.RedirectMsg\x12\x12\n\ncommand_id\x18\x17 \x01(\r\x12\x15\n\rservice_cmdid\x18\x18 \x01(\r\x12\x30\n\x08oidbhead\x18\x19 \x01(\x0b\x32\x1e.im.msg.msg_head.TransOidbHead\"\x9a\x01\n\x08InstCtrl\x12/\n\x0csend_to_inst\x18\x01 \x03(\x0b\x32\x19.im.msg.msg_head.InstInfo\x12/\n\x0c\x65xclude_inst\x18\x02 \x03(\x0b\x32\x19.im.msg.msg_head.InstInfo\x12,\n\tfrom_inst\x18\x03 \x01(\x0b\x32\x19.im.msg.msg_head.InstInfo\"V\n\x08InstInfo\x12\x0e\n\x06\x61pppid\x18\x01 \x01(\r\x12\x0e\n\x06instid\x18\x02 \x01(\r\x12\x10\n\x08platform\x18\x03 \x01(\r\x12\x18\n\x10\x65num_device_type\x18\n \x01(\r\"%\n\x08LoginSig\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\"\x87\x01\n\x0bRedirectMsg\x12\x18\n\x10last_redirect_ip\x18\x01 \x01(\x07\x12\x1a\n\x12last_redirect_port\x18\x02 \x01(\r\x12\x13\n\x0bredirect_ip\x18\x03 \x01(\x07\x12\x15\n\rredirect_port\x18\x04 \x01(\r\x12\x16\n\x0eredirect_count\x18\x05 \x01(\r\"\x88\x01\n\x07S2CHead\x12\x13\n\x0bsub_msgtype\x18\x01 \x01(\r\x12\x10\n\x08msg_type\x18\x02 \x01(\r\x12\x10\n\x08\x66rom_uin\x18\x03 \x01(\x04\x12\x0e\n\x06msg_id\x18\x04 \x01(\r\x12\x10\n\x08relay_ip\x18\x05 \x01(\x07\x12\x12\n\nrelay_port\x18\x06 \x01(\r\x12\x0e\n\x06to_uin\x18\x07 \x01(\x04\"\x0b\n\tSConnHead\"Y\n\rTransOidbHead\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\r\x12\x14\n\x0cservice_type\x18\x02 \x01(\r\x12\x0e\n\x06result\x18\x03 \x01(\r\x12\x11\n\terror_msg\x18\x04 \x01(\t'
-)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%cai/pb/im/msg/msg_head/msg_head.proto\x12\x0fim.msg.msg_head\"\xd4\x01\n\x07\x43\x32\x43Head\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x10\n\x08\x66rom_uin\x18\x02 \x01(\x04\x12\x0f\n\x07\x63\x63_type\x18\x03 \x01(\r\x12\x0e\n\x06\x63\x63_cmd\x18\x04 \x01(\r\x12\x14\n\x0c\x61uth_pic_sig\x18\x05 \x01(\x0c\x12\x10\n\x08\x61uth_sig\x18\x06 \x01(\x0c\x12\x10\n\x08\x61uth_buf\x18\x07 \x01(\x0c\x12\x13\n\x0bserver_time\x18\x08 \x01(\r\x12\x13\n\x0b\x63lient_time\x18\t \x01(\r\x12\x0c\n\x04rand\x18\n \x01(\r\x12\x14\n\x0cphone_number\x18\x0b \x01(\t\"\xb7\x03\n\x06\x43SHead\x12\x0b\n\x03uin\x18\x01 \x01(\x04\x12\x0f\n\x07\x63ommand\x18\x02 \x01(\r\x12\x0b\n\x03seq\x18\x03 \x01(\r\x12\x0f\n\x07version\x18\x04 \x01(\r\x12\x13\n\x0bretry_times\x18\x05 \x01(\r\x12\x13\n\x0b\x63lient_type\x18\x06 \x01(\r\x12\r\n\x05pubno\x18\x07 \x01(\r\x12\x0f\n\x07localid\x18\x08 \x01(\r\x12\x10\n\x08timezone\x18\t \x01(\r\x12\x11\n\tclient_ip\x18\n \x01(\x07\x12\x13\n\x0b\x63lient_port\x18\x0b \x01(\r\x12\x0f\n\x07\x63onn_ip\x18\x0c \x01(\x07\x12\x11\n\tconn_port\x18\r \x01(\r\x12\x14\n\x0cinterface_ip\x18\x0e \x01(\x07\x12\x16\n\x0einterface_port\x18\x0f \x01(\r\x12\x11\n\tactual_ip\x18\x10 \x01(\x07\x12\x0c\n\x04\x66lag\x18\x11 \x01(\r\x12\x11\n\ttimestamp\x18\x12 \x01(\x07\x12\x0e\n\x06subcmd\x18\x13 \x01(\r\x12\x0e\n\x06result\x18\x14 \x01(\r\x12\x0e\n\x06\x61pp_id\x18\x15 \x01(\r\x12\x13\n\x0binstance_id\x18\x16 \x01(\r\x12\x12\n\nsession_id\x18\x17 \x01(\x04\x12\x0e\n\x06idc_id\x18\x18 \x01(\r\"\x85\x01\n\tDeltaHead\x12\x11\n\ttotal_len\x18\x01 \x01(\x04\x12\x0e\n\x06offset\x18\x02 \x01(\x04\x12\x12\n\nack_offset\x18\x03 \x01(\x04\x12\x0e\n\x06\x63ookie\x18\x04 \x01(\x0c\x12\x12\n\nack_cookie\x18\x05 \x01(\x0c\x12\x0e\n\x06result\x18\x06 \x01(\r\x12\r\n\x05\x66lags\x18\x07 \x01(\r\"\xa1\x03\n\x04Head\x12\x11\n\thead_type\x18\x01 \x01(\r\x12(\n\x07\x63s_head\x18\x02 \x01(\x0b\x32\x17.im.msg.msg_head.CSHead\x12*\n\x08s2c_head\x18\x03 \x01(\x0b\x32\x18.im.msg.msg_head.S2CHead\x12\x34\n\rhttpconn_head\x18\x04 \x01(\x0b\x32\x1d.im.msg.msg_head.HttpConnHead\x12\x12\n\npaint_flag\x18\x05 \x01(\r\x12,\n\tlogin_sig\x18\x06 \x01(\x0b\x32\x19.im.msg.msg_head.LoginSig\x12.\n\ndelta_head\x18\x07 \x01(\x0b\x32\x1a.im.msg.msg_head.DeltaHead\x12*\n\x08\x63\x32\x63_head\x18\x08 \x01(\x0b\x32\x18.im.msg.msg_head.C2CHead\x12.\n\nsconn_head\x18\t \x01(\x0b\x32\x1a.im.msg.msg_head.SConnHead\x12,\n\tinst_ctrl\x18\n \x01(\x0b\x32\x19.im.msg.msg_head.InstCtrl\"\x98\x04\n\x0cHttpConnHead\x12\x0b\n\x03uin\x18\x01 \x01(\x04\x12\x0f\n\x07\x63ommand\x18\x02 \x01(\r\x12\x13\n\x0bsub_command\x18\x03 \x01(\r\x12\x0b\n\x03seq\x18\x04 \x01(\r\x12\x0f\n\x07version\x18\x05 \x01(\r\x12\x13\n\x0bretry_times\x18\x06 \x01(\r\x12\x13\n\x0b\x63lient_type\x18\x07 \x01(\r\x12\x0e\n\x06pub_no\x18\x08 \x01(\r\x12\x10\n\x08local_id\x18\t \x01(\r\x12\x11\n\ttime_zone\x18\n \x01(\r\x12\x11\n\tclient_ip\x18\x0b \x01(\x07\x12\x13\n\x0b\x63lient_port\x18\x0c \x01(\r\x12\x11\n\tqzhttp_ip\x18\r \x01(\x07\x12\x13\n\x0bqzhttp_port\x18\x0e \x01(\r\x12\x0e\n\x06spp_ip\x18\x0f \x01(\x07\x12\x10\n\x08spp_port\x18\x10 \x01(\r\x12\x0c\n\x04\x66lag\x18\x11 \x01(\r\x12\x0b\n\x03key\x18\x12 \x01(\x0c\x12\x15\n\rcompress_type\x18\x13 \x01(\r\x12\x13\n\x0borigin_size\x18\x14 \x01(\r\x12\x12\n\nerror_code\x18\x15 \x01(\r\x12.\n\x08redirect\x18\x16 \x01(\x0b\x32\x1c.im.msg.msg_head.RedirectMsg\x12\x12\n\ncommand_id\x18\x17 \x01(\r\x12\x15\n\rservice_cmdid\x18\x18 \x01(\r\x12\x30\n\x08oidbhead\x18\x19 \x01(\x0b\x32\x1e.im.msg.msg_head.TransOidbHead\"\x9a\x01\n\x08InstCtrl\x12/\n\x0csend_to_inst\x18\x01 \x03(\x0b\x32\x19.im.msg.msg_head.InstInfo\x12/\n\x0c\x65xclude_inst\x18\x02 \x03(\x0b\x32\x19.im.msg.msg_head.InstInfo\x12,\n\tfrom_inst\x18\x03 \x01(\x0b\x32\x19.im.msg.msg_head.InstInfo\"V\n\x08InstInfo\x12\x0e\n\x06\x61pppid\x18\x01 \x01(\r\x12\x0e\n\x06instid\x18\x02 \x01(\r\x12\x10\n\x08platform\x18\x03 \x01(\r\x12\x18\n\x10\x65num_device_type\x18\n \x01(\r\"%\n\x08LoginSig\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\"\x87\x01\n\x0bRedirectMsg\x12\x18\n\x10last_redirect_ip\x18\x01 \x01(\x07\x12\x1a\n\x12last_redirect_port\x18\x02 \x01(\r\x12\x13\n\x0bredirect_ip\x18\x03 \x01(\x07\x12\x15\n\rredirect_port\x18\x04 \x01(\r\x12\x16\n\x0eredirect_count\x18\x05 \x01(\r\"\x88\x01\n\x07S2CHead\x12\x13\n\x0bsub_msgtype\x18\x01 \x01(\r\x12\x10\n\x08msg_type\x18\x02 \x01(\r\x12\x10\n\x08\x66rom_uin\x18\x03 \x01(\x04\x12\x0e\n\x06msg_id\x18\x04 \x01(\r\x12\x10\n\x08relay_ip\x18\x05 \x01(\x07\x12\x12\n\nrelay_port\x18\x06 \x01(\r\x12\x0e\n\x06to_uin\x18\x07 \x01(\x04\"\x0b\n\tSConnHead\"Y\n\rTransOidbHead\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\r\x12\x14\n\x0cservice_type\x18\x02 \x01(\r\x12\x0e\n\x06result\x18\x03 \x01(\r\x12\x11\n\terror_msg\x18\x04 \x01(\t')
 
 
 
-
-_C2CHEAD = _descriptor.Descriptor(
-  name='C2CHead',
-  full_name='im.msg.msg_head.C2CHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='im.msg.msg_head.C2CHead.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_uin', full_name='im.msg.msg_head.C2CHead.from_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cc_type', full_name='im.msg.msg_head.C2CHead.cc_type', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cc_cmd', full_name='im.msg.msg_head.C2CHead.cc_cmd', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='auth_pic_sig', full_name='im.msg.msg_head.C2CHead.auth_pic_sig', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='auth_sig', full_name='im.msg.msg_head.C2CHead.auth_sig', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='auth_buf', full_name='im.msg.msg_head.C2CHead.auth_buf', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='server_time', full_name='im.msg.msg_head.C2CHead.server_time', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='client_time', full_name='im.msg.msg_head.C2CHead.client_time', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rand', full_name='im.msg.msg_head.C2CHead.rand', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='phone_number', full_name='im.msg.msg_head.C2CHead.phone_number', index=10,
-      number=11, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=59,
-  serialized_end=271,
-)
-
-
-_CSHEAD = _descriptor.Descriptor(
-  name='CSHead',
-  full_name='im.msg.msg_head.CSHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='uin', full_name='im.msg.msg_head.CSHead.uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='command', full_name='im.msg.msg_head.CSHead.command', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='seq', full_name='im.msg.msg_head.CSHead.seq', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='version', full_name='im.msg.msg_head.CSHead.version', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='retry_times', full_name='im.msg.msg_head.CSHead.retry_times', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='client_type', full_name='im.msg.msg_head.CSHead.client_type', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pubno', full_name='im.msg.msg_head.CSHead.pubno', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='localid', full_name='im.msg.msg_head.CSHead.localid', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='timezone', full_name='im.msg.msg_head.CSHead.timezone', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='client_ip', full_name='im.msg.msg_head.CSHead.client_ip', index=9,
-      number=10, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='client_port', full_name='im.msg.msg_head.CSHead.client_port', index=10,
-      number=11, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='conn_ip', full_name='im.msg.msg_head.CSHead.conn_ip', index=11,
-      number=12, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='conn_port', full_name='im.msg.msg_head.CSHead.conn_port', index=12,
-      number=13, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='interface_ip', full_name='im.msg.msg_head.CSHead.interface_ip', index=13,
-      number=14, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='interface_port', full_name='im.msg.msg_head.CSHead.interface_port', index=14,
-      number=15, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='actual_ip', full_name='im.msg.msg_head.CSHead.actual_ip', index=15,
-      number=16, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='im.msg.msg_head.CSHead.flag', index=16,
-      number=17, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='timestamp', full_name='im.msg.msg_head.CSHead.timestamp', index=17,
-      number=18, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='subcmd', full_name='im.msg.msg_head.CSHead.subcmd', index=18,
-      number=19, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='result', full_name='im.msg.msg_head.CSHead.result', index=19,
-      number=20, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='app_id', full_name='im.msg.msg_head.CSHead.app_id', index=20,
-      number=21, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='instance_id', full_name='im.msg.msg_head.CSHead.instance_id', index=21,
-      number=22, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='session_id', full_name='im.msg.msg_head.CSHead.session_id', index=22,
-      number=23, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='idc_id', full_name='im.msg.msg_head.CSHead.idc_id', index=23,
-      number=24, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=274,
-  serialized_end=713,
-)
-
-
-_DELTAHEAD = _descriptor.Descriptor(
-  name='DeltaHead',
-  full_name='im.msg.msg_head.DeltaHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='total_len', full_name='im.msg.msg_head.DeltaHead.total_len', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='offset', full_name='im.msg.msg_head.DeltaHead.offset', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ack_offset', full_name='im.msg.msg_head.DeltaHead.ack_offset', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cookie', full_name='im.msg.msg_head.DeltaHead.cookie', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ack_cookie', full_name='im.msg.msg_head.DeltaHead.ack_cookie', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='result', full_name='im.msg.msg_head.DeltaHead.result', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flags', full_name='im.msg.msg_head.DeltaHead.flags', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=716,
-  serialized_end=849,
-)
-
-
-_HEAD = _descriptor.Descriptor(
-  name='Head',
-  full_name='im.msg.msg_head.Head',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='head_type', full_name='im.msg.msg_head.Head.head_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cs_head', full_name='im.msg.msg_head.Head.cs_head', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='s2c_head', full_name='im.msg.msg_head.Head.s2c_head', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='httpconn_head', full_name='im.msg.msg_head.Head.httpconn_head', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='paint_flag', full_name='im.msg.msg_head.Head.paint_flag', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='login_sig', full_name='im.msg.msg_head.Head.login_sig', index=5,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='delta_head', full_name='im.msg.msg_head.Head.delta_head', index=6,
-      number=7, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_head', full_name='im.msg.msg_head.Head.c2c_head', index=7,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sconn_head', full_name='im.msg.msg_head.Head.sconn_head', index=8,
-      number=9, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='inst_ctrl', full_name='im.msg.msg_head.Head.inst_ctrl', index=9,
-      number=10, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=852,
-  serialized_end=1269,
-)
-
-
-_HTTPCONNHEAD = _descriptor.Descriptor(
-  name='HttpConnHead',
-  full_name='im.msg.msg_head.HttpConnHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='uin', full_name='im.msg.msg_head.HttpConnHead.uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='command', full_name='im.msg.msg_head.HttpConnHead.command', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sub_command', full_name='im.msg.msg_head.HttpConnHead.sub_command', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='seq', full_name='im.msg.msg_head.HttpConnHead.seq', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='version', full_name='im.msg.msg_head.HttpConnHead.version', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='retry_times', full_name='im.msg.msg_head.HttpConnHead.retry_times', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='client_type', full_name='im.msg.msg_head.HttpConnHead.client_type', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pub_no', full_name='im.msg.msg_head.HttpConnHead.pub_no', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='local_id', full_name='im.msg.msg_head.HttpConnHead.local_id', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='time_zone', full_name='im.msg.msg_head.HttpConnHead.time_zone', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='client_ip', full_name='im.msg.msg_head.HttpConnHead.client_ip', index=10,
-      number=11, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='client_port', full_name='im.msg.msg_head.HttpConnHead.client_port', index=11,
-      number=12, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='qzhttp_ip', full_name='im.msg.msg_head.HttpConnHead.qzhttp_ip', index=12,
-      number=13, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='qzhttp_port', full_name='im.msg.msg_head.HttpConnHead.qzhttp_port', index=13,
-      number=14, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='spp_ip', full_name='im.msg.msg_head.HttpConnHead.spp_ip', index=14,
-      number=15, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='spp_port', full_name='im.msg.msg_head.HttpConnHead.spp_port', index=15,
-      number=16, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='im.msg.msg_head.HttpConnHead.flag', index=16,
-      number=17, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='key', full_name='im.msg.msg_head.HttpConnHead.key', index=17,
-      number=18, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='compress_type', full_name='im.msg.msg_head.HttpConnHead.compress_type', index=18,
-      number=19, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='origin_size', full_name='im.msg.msg_head.HttpConnHead.origin_size', index=19,
-      number=20, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='error_code', full_name='im.msg.msg_head.HttpConnHead.error_code', index=20,
-      number=21, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='redirect', full_name='im.msg.msg_head.HttpConnHead.redirect', index=21,
-      number=22, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='command_id', full_name='im.msg.msg_head.HttpConnHead.command_id', index=22,
-      number=23, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='service_cmdid', full_name='im.msg.msg_head.HttpConnHead.service_cmdid', index=23,
-      number=24, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='oidbhead', full_name='im.msg.msg_head.HttpConnHead.oidbhead', index=24,
-      number=25, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1272,
-  serialized_end=1808,
-)
-
-
-_INSTCTRL = _descriptor.Descriptor(
-  name='InstCtrl',
-  full_name='im.msg.msg_head.InstCtrl',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='send_to_inst', full_name='im.msg.msg_head.InstCtrl.send_to_inst', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='exclude_inst', full_name='im.msg.msg_head.InstCtrl.exclude_inst', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_inst', full_name='im.msg.msg_head.InstCtrl.from_inst', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1811,
-  serialized_end=1965,
-)
-
-
-_INSTINFO = _descriptor.Descriptor(
-  name='InstInfo',
-  full_name='im.msg.msg_head.InstInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='apppid', full_name='im.msg.msg_head.InstInfo.apppid', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='instid', full_name='im.msg.msg_head.InstInfo.instid', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='platform', full_name='im.msg.msg_head.InstInfo.platform', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='enum_device_type', full_name='im.msg.msg_head.InstInfo.enum_device_type', index=3,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1967,
-  serialized_end=2053,
-)
-
-
-_LOGINSIG = _descriptor.Descriptor(
-  name='LoginSig',
-  full_name='im.msg.msg_head.LoginSig',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='type', full_name='im.msg.msg_head.LoginSig.type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='im.msg.msg_head.LoginSig.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2055,
-  serialized_end=2092,
-)
-
-
-_REDIRECTMSG = _descriptor.Descriptor(
-  name='RedirectMsg',
-  full_name='im.msg.msg_head.RedirectMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='last_redirect_ip', full_name='im.msg.msg_head.RedirectMsg.last_redirect_ip', index=0,
-      number=1, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_redirect_port', full_name='im.msg.msg_head.RedirectMsg.last_redirect_port', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='redirect_ip', full_name='im.msg.msg_head.RedirectMsg.redirect_ip', index=2,
-      number=3, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='redirect_port', full_name='im.msg.msg_head.RedirectMsg.redirect_port', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='redirect_count', full_name='im.msg.msg_head.RedirectMsg.redirect_count', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2095,
-  serialized_end=2230,
-)
-
-
-_S2CHEAD = _descriptor.Descriptor(
-  name='S2CHead',
-  full_name='im.msg.msg_head.S2CHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='sub_msgtype', full_name='im.msg.msg_head.S2CHead.sub_msgtype', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_type', full_name='im.msg.msg_head.S2CHead.msg_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_uin', full_name='im.msg.msg_head.S2CHead.from_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_id', full_name='im.msg.msg_head.S2CHead.msg_id', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='relay_ip', full_name='im.msg.msg_head.S2CHead.relay_ip', index=4,
-      number=5, type=7, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='relay_port', full_name='im.msg.msg_head.S2CHead.relay_port', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='im.msg.msg_head.S2CHead.to_uin', index=6,
-      number=7, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2233,
-  serialized_end=2369,
-)
-
-
-_SCONNHEAD = _descriptor.Descriptor(
-  name='SConnHead',
-  full_name='im.msg.msg_head.SConnHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2371,
-  serialized_end=2382,
-)
-
-
-_TRANSOIDBHEAD = _descriptor.Descriptor(
-  name='TransOidbHead',
-  full_name='im.msg.msg_head.TransOidbHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='command', full_name='im.msg.msg_head.TransOidbHead.command', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='service_type', full_name='im.msg.msg_head.TransOidbHead.service_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='result', full_name='im.msg.msg_head.TransOidbHead.result', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='error_msg', full_name='im.msg.msg_head.TransOidbHead.error_msg', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2384,
-  serialized_end=2473,
-)
-
-_HEAD.fields_by_name['cs_head'].message_type = _CSHEAD
-_HEAD.fields_by_name['s2c_head'].message_type = _S2CHEAD
-_HEAD.fields_by_name['httpconn_head'].message_type = _HTTPCONNHEAD
-_HEAD.fields_by_name['login_sig'].message_type = _LOGINSIG
-_HEAD.fields_by_name['delta_head'].message_type = _DELTAHEAD
-_HEAD.fields_by_name['c2c_head'].message_type = _C2CHEAD
-_HEAD.fields_by_name['sconn_head'].message_type = _SCONNHEAD
-_HEAD.fields_by_name['inst_ctrl'].message_type = _INSTCTRL
-_HTTPCONNHEAD.fields_by_name['redirect'].message_type = _REDIRECTMSG
-_HTTPCONNHEAD.fields_by_name['oidbhead'].message_type = _TRANSOIDBHEAD
-_INSTCTRL.fields_by_name['send_to_inst'].message_type = _INSTINFO
-_INSTCTRL.fields_by_name['exclude_inst'].message_type = _INSTINFO
-_INSTCTRL.fields_by_name['from_inst'].message_type = _INSTINFO
-DESCRIPTOR.message_types_by_name['C2CHead'] = _C2CHEAD
-DESCRIPTOR.message_types_by_name['CSHead'] = _CSHEAD
-DESCRIPTOR.message_types_by_name['DeltaHead'] = _DELTAHEAD
-DESCRIPTOR.message_types_by_name['Head'] = _HEAD
-DESCRIPTOR.message_types_by_name['HttpConnHead'] = _HTTPCONNHEAD
-DESCRIPTOR.message_types_by_name['InstCtrl'] = _INSTCTRL
-DESCRIPTOR.message_types_by_name['InstInfo'] = _INSTINFO
-DESCRIPTOR.message_types_by_name['LoginSig'] = _LOGINSIG
-DESCRIPTOR.message_types_by_name['RedirectMsg'] = _REDIRECTMSG
-DESCRIPTOR.message_types_by_name['S2CHead'] = _S2CHEAD
-DESCRIPTOR.message_types_by_name['SConnHead'] = _SCONNHEAD
-DESCRIPTOR.message_types_by_name['TransOidbHead'] = _TRANSOIDBHEAD
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_C2CHEAD = DESCRIPTOR.message_types_by_name['C2CHead']
+_CSHEAD = DESCRIPTOR.message_types_by_name['CSHead']
+_DELTAHEAD = DESCRIPTOR.message_types_by_name['DeltaHead']
+_HEAD = DESCRIPTOR.message_types_by_name['Head']
+_HTTPCONNHEAD = DESCRIPTOR.message_types_by_name['HttpConnHead']
+_INSTCTRL = DESCRIPTOR.message_types_by_name['InstCtrl']
+_INSTINFO = DESCRIPTOR.message_types_by_name['InstInfo']
+_LOGINSIG = DESCRIPTOR.message_types_by_name['LoginSig']
+_REDIRECTMSG = DESCRIPTOR.message_types_by_name['RedirectMsg']
+_S2CHEAD = DESCRIPTOR.message_types_by_name['S2CHead']
+_SCONNHEAD = DESCRIPTOR.message_types_by_name['SConnHead']
+_TRANSOIDBHEAD = DESCRIPTOR.message_types_by_name['TransOidbHead']
 C2CHead = _reflection.GeneratedProtocolMessageType('C2CHead', (_message.Message,), {
   'DESCRIPTOR' : _C2CHEAD,
   '__module__' : 'cai.pb.im.msg.msg_head.msg_head_pb2'
@@ -1149,5 +114,31 @@
   })
 _sym_db.RegisterMessage(TransOidbHead)
 
-
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _C2CHEAD._serialized_start=59
+  _C2CHEAD._serialized_end=271
+  _CSHEAD._serialized_start=274
+  _CSHEAD._serialized_end=713
+  _DELTAHEAD._serialized_start=716
+  _DELTAHEAD._serialized_end=849
+  _HEAD._serialized_start=852
+  _HEAD._serialized_end=1269
+  _HTTPCONNHEAD._serialized_start=1272
+  _HTTPCONNHEAD._serialized_end=1808
+  _INSTCTRL._serialized_start=1811
+  _INSTCTRL._serialized_end=1965
+  _INSTINFO._serialized_start=1967
+  _INSTINFO._serialized_end=2053
+  _LOGINSIG._serialized_start=2055
+  _LOGINSIG._serialized_end=2092
+  _REDIRECTMSG._serialized_start=2095
+  _REDIRECTMSG._serialized_end=2230
+  _S2CHEAD._serialized_start=2233
+  _S2CHEAD._serialized_end=2369
+  _SCONNHEAD._serialized_start=2371
+  _SCONNHEAD._serialized_end=2382
+  _TRANSOIDBHEAD._serialized_start=2384
+  _TRANSOIDBHEAD._serialized_end=2473
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/msg/msg_head/msg_head_pb2.pyi b/cai/pb/im/msg/msg_head/msg_head_pb2.pyi
index 8288d243..24b94614 100644
--- a/cai/pb/im/msg/msg_head/msg_head_pb2.pyi
+++ b/cai/pb/im/msg/msg_head/msg_head_pb2.pyi
@@ -32,10 +32,13 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class C2CHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    """tencent/im/msg/im_msg_head.java
+
+    """
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     FROM_UIN_FIELD_NUMBER: int
     CC_TYPE_FIELD_NUMBER: int
@@ -47,37 +50,36 @@ class C2CHead(Message):
     CLIENT_TIME_FIELD_NUMBER: int
     RAND_FIELD_NUMBER: int
     PHONE_NUMBER_FIELD_NUMBER: int
-    to_uin: int = ...
-    from_uin: int = ...
-    cc_type: int = ...
-    cc_cmd: int = ...
-    auth_pic_sig: bytes = ...
-    auth_sig: bytes = ...
-    auth_buf: bytes = ...
-    server_time: int = ...
-    client_time: int = ...
-    rand: int = ...
-    phone_number: Text = ...
-
+    to_uin: int
+    from_uin: int
+    cc_type: int
+    cc_cmd: int
+    auth_pic_sig: bytes
+    auth_sig: bytes
+    auth_buf: bytes
+    server_time: int
+    client_time: int
+    rand: int
+    phone_number: Text
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        from_uin : Optional[int] = ...,
-        cc_type : Optional[int] = ...,
-        cc_cmd : Optional[int] = ...,
-        auth_pic_sig : Optional[bytes] = ...,
-        auth_sig : Optional[bytes] = ...,
-        auth_buf : Optional[bytes] = ...,
-        server_time : Optional[int] = ...,
-        client_time : Optional[int] = ...,
-        rand : Optional[int] = ...,
-        phone_number : Optional[Text] = ...,
+        to_uin: Optional[int] = ...,
+        from_uin: Optional[int] = ...,
+        cc_type: Optional[int] = ...,
+        cc_cmd: Optional[int] = ...,
+        auth_pic_sig: Optional[bytes] = ...,
+        auth_sig: Optional[bytes] = ...,
+        auth_buf: Optional[bytes] = ...,
+        server_time: Optional[int] = ...,
+        client_time: Optional[int] = ...,
+        rand: Optional[int] = ...,
+        phone_number: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"auth_buf",b"auth_buf",u"auth_pic_sig",b"auth_pic_sig",u"auth_sig",b"auth_sig",u"cc_cmd",b"cc_cmd",u"cc_type",b"cc_type",u"client_time",b"client_time",u"from_uin",b"from_uin",u"phone_number",b"phone_number",u"rand",b"rand",u"server_time",b"server_time",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"auth_buf",b"auth_buf",u"auth_pic_sig",b"auth_pic_sig",u"auth_sig",b"auth_sig",u"cc_cmd",b"cc_cmd",u"cc_type",b"cc_type",u"client_time",b"client_time",u"from_uin",b"from_uin",u"phone_number",b"phone_number",u"rand",b"rand",u"server_time",b"server_time",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["auth_buf",b"auth_buf","auth_pic_sig",b"auth_pic_sig","auth_sig",b"auth_sig","cc_cmd",b"cc_cmd","cc_type",b"cc_type","client_time",b"client_time","from_uin",b"from_uin","phone_number",b"phone_number","rand",b"rand","server_time",b"server_time","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["auth_buf",b"auth_buf","auth_pic_sig",b"auth_pic_sig","auth_sig",b"auth_sig","cc_cmd",b"cc_cmd","cc_type",b"cc_type","client_time",b"client_time","from_uin",b"from_uin","phone_number",b"phone_number","rand",b"rand","server_time",b"server_time","to_uin",b"to_uin"]) -> None: ...
 
 class CSHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     UIN_FIELD_NUMBER: int
     COMMAND_FIELD_NUMBER: int
     SEQ_FIELD_NUMBER: int
@@ -102,63 +104,62 @@ class CSHead(Message):
     INSTANCE_ID_FIELD_NUMBER: int
     SESSION_ID_FIELD_NUMBER: int
     IDC_ID_FIELD_NUMBER: int
-    uin: int = ...
-    command: int = ...
-    seq: int = ...
-    version: int = ...
-    retry_times: int = ...
-    client_type: int = ...
-    pubno: int = ...
-    localid: int = ...
-    timezone: int = ...
-    client_ip: int = ...
-    client_port: int = ...
-    conn_ip: int = ...
-    conn_port: int = ...
-    interface_ip: int = ...
-    interface_port: int = ...
-    actual_ip: int = ...
-    flag: int = ...
-    timestamp: int = ...
-    subcmd: int = ...
-    result: int = ...
-    app_id: int = ...
-    instance_id: int = ...
-    session_id: int = ...
-    idc_id: int = ...
-
+    uin: int
+    command: int
+    seq: int
+    version: int
+    retry_times: int
+    client_type: int
+    pubno: int
+    localid: int
+    timezone: int
+    client_ip: int
+    client_port: int
+    conn_ip: int
+    conn_port: int
+    interface_ip: int
+    interface_port: int
+    actual_ip: int
+    flag: int
+    timestamp: int
+    subcmd: int
+    result: int
+    app_id: int
+    instance_id: int
+    session_id: int
+    idc_id: int
     def __init__(self,
         *,
-        uin : Optional[int] = ...,
-        command : Optional[int] = ...,
-        seq : Optional[int] = ...,
-        version : Optional[int] = ...,
-        retry_times : Optional[int] = ...,
-        client_type : Optional[int] = ...,
-        pubno : Optional[int] = ...,
-        localid : Optional[int] = ...,
-        timezone : Optional[int] = ...,
-        client_ip : Optional[int] = ...,
-        client_port : Optional[int] = ...,
-        conn_ip : Optional[int] = ...,
-        conn_port : Optional[int] = ...,
-        interface_ip : Optional[int] = ...,
-        interface_port : Optional[int] = ...,
-        actual_ip : Optional[int] = ...,
-        flag : Optional[int] = ...,
-        timestamp : Optional[int] = ...,
-        subcmd : Optional[int] = ...,
-        result : Optional[int] = ...,
-        app_id : Optional[int] = ...,
-        instance_id : Optional[int] = ...,
-        session_id : Optional[int] = ...,
-        idc_id : Optional[int] = ...,
+        uin: Optional[int] = ...,
+        command: Optional[int] = ...,
+        seq: Optional[int] = ...,
+        version: Optional[int] = ...,
+        retry_times: Optional[int] = ...,
+        client_type: Optional[int] = ...,
+        pubno: Optional[int] = ...,
+        localid: Optional[int] = ...,
+        timezone: Optional[int] = ...,
+        client_ip: Optional[int] = ...,
+        client_port: Optional[int] = ...,
+        conn_ip: Optional[int] = ...,
+        conn_port: Optional[int] = ...,
+        interface_ip: Optional[int] = ...,
+        interface_port: Optional[int] = ...,
+        actual_ip: Optional[int] = ...,
+        flag: Optional[int] = ...,
+        timestamp: Optional[int] = ...,
+        subcmd: Optional[int] = ...,
+        result: Optional[int] = ...,
+        app_id: Optional[int] = ...,
+        instance_id: Optional[int] = ...,
+        session_id: Optional[int] = ...,
+        idc_id: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"actual_ip",b"actual_ip",u"app_id",b"app_id",u"client_ip",b"client_ip",u"client_port",b"client_port",u"client_type",b"client_type",u"command",b"command",u"conn_ip",b"conn_ip",u"conn_port",b"conn_port",u"flag",b"flag",u"idc_id",b"idc_id",u"instance_id",b"instance_id",u"interface_ip",b"interface_ip",u"interface_port",b"interface_port",u"localid",b"localid",u"pubno",b"pubno",u"result",b"result",u"retry_times",b"retry_times",u"seq",b"seq",u"session_id",b"session_id",u"subcmd",b"subcmd",u"timestamp",b"timestamp",u"timezone",b"timezone",u"uin",b"uin",u"version",b"version"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"actual_ip",b"actual_ip",u"app_id",b"app_id",u"client_ip",b"client_ip",u"client_port",b"client_port",u"client_type",b"client_type",u"command",b"command",u"conn_ip",b"conn_ip",u"conn_port",b"conn_port",u"flag",b"flag",u"idc_id",b"idc_id",u"instance_id",b"instance_id",u"interface_ip",b"interface_ip",u"interface_port",b"interface_port",u"localid",b"localid",u"pubno",b"pubno",u"result",b"result",u"retry_times",b"retry_times",u"seq",b"seq",u"session_id",b"session_id",u"subcmd",b"subcmd",u"timestamp",b"timestamp",u"timezone",b"timezone",u"uin",b"uin",u"version",b"version"]) -> None: ...
+    def HasField(self, field_name: Literal["actual_ip",b"actual_ip","app_id",b"app_id","client_ip",b"client_ip","client_port",b"client_port","client_type",b"client_type","command",b"command","conn_ip",b"conn_ip","conn_port",b"conn_port","flag",b"flag","idc_id",b"idc_id","instance_id",b"instance_id","interface_ip",b"interface_ip","interface_port",b"interface_port","localid",b"localid","pubno",b"pubno","result",b"result","retry_times",b"retry_times","seq",b"seq","session_id",b"session_id","subcmd",b"subcmd","timestamp",b"timestamp","timezone",b"timezone","uin",b"uin","version",b"version"]) -> bool: ...
+    def ClearField(self, field_name: Literal["actual_ip",b"actual_ip","app_id",b"app_id","client_ip",b"client_ip","client_port",b"client_port","client_type",b"client_type","command",b"command","conn_ip",b"conn_ip","conn_port",b"conn_port","flag",b"flag","idc_id",b"idc_id","instance_id",b"instance_id","interface_ip",b"interface_ip","interface_port",b"interface_port","localid",b"localid","pubno",b"pubno","result",b"result","retry_times",b"retry_times","seq",b"seq","session_id",b"session_id","subcmd",b"subcmd","timestamp",b"timestamp","timezone",b"timezone","uin",b"uin","version",b"version"]) -> None: ...
 
 class DeltaHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TOTAL_LEN_FIELD_NUMBER: int
     OFFSET_FIELD_NUMBER: int
     ACK_OFFSET_FIELD_NUMBER: int
@@ -166,29 +167,28 @@ class DeltaHead(Message):
     ACK_COOKIE_FIELD_NUMBER: int
     RESULT_FIELD_NUMBER: int
     FLAGS_FIELD_NUMBER: int
-    total_len: int = ...
-    offset: int = ...
-    ack_offset: int = ...
-    cookie: bytes = ...
-    ack_cookie: bytes = ...
-    result: int = ...
-    flags: int = ...
-
+    total_len: int
+    offset: int
+    ack_offset: int
+    cookie: bytes
+    ack_cookie: bytes
+    result: int
+    flags: int
     def __init__(self,
         *,
-        total_len : Optional[int] = ...,
-        offset : Optional[int] = ...,
-        ack_offset : Optional[int] = ...,
-        cookie : Optional[bytes] = ...,
-        ack_cookie : Optional[bytes] = ...,
-        result : Optional[int] = ...,
-        flags : Optional[int] = ...,
+        total_len: Optional[int] = ...,
+        offset: Optional[int] = ...,
+        ack_offset: Optional[int] = ...,
+        cookie: Optional[bytes] = ...,
+        ack_cookie: Optional[bytes] = ...,
+        result: Optional[int] = ...,
+        flags: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"ack_cookie",b"ack_cookie",u"ack_offset",b"ack_offset",u"cookie",b"cookie",u"flags",b"flags",u"offset",b"offset",u"result",b"result",u"total_len",b"total_len"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"ack_cookie",b"ack_cookie",u"ack_offset",b"ack_offset",u"cookie",b"cookie",u"flags",b"flags",u"offset",b"offset",u"result",b"result",u"total_len",b"total_len"]) -> None: ...
+    def HasField(self, field_name: Literal["ack_cookie",b"ack_cookie","ack_offset",b"ack_offset","cookie",b"cookie","flags",b"flags","offset",b"offset","result",b"result","total_len",b"total_len"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ack_cookie",b"ack_cookie","ack_offset",b"ack_offset","cookie",b"cookie","flags",b"flags","offset",b"offset","result",b"result","total_len",b"total_len"]) -> None: ...
 
 class Head(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     HEAD_TYPE_FIELD_NUMBER: int
     CS_HEAD_FIELD_NUMBER: int
     S2C_HEAD_FIELD_NUMBER: int
@@ -199,51 +199,42 @@ class Head(Message):
     C2C_HEAD_FIELD_NUMBER: int
     SCONN_HEAD_FIELD_NUMBER: int
     INST_CTRL_FIELD_NUMBER: int
-    head_type: int = ...
-    paint_flag: int = ...
-
+    head_type: int
     @property
     def cs_head(self) -> CSHead: ...
-
     @property
     def s2c_head(self) -> S2CHead: ...
-
     @property
     def httpconn_head(self) -> HttpConnHead: ...
-
+    paint_flag: int
     @property
     def login_sig(self) -> LoginSig: ...
-
     @property
     def delta_head(self) -> DeltaHead: ...
-
     @property
     def c2c_head(self) -> C2CHead: ...
-
     @property
     def sconn_head(self) -> SConnHead: ...
-
     @property
     def inst_ctrl(self) -> InstCtrl: ...
-
     def __init__(self,
         *,
-        head_type : Optional[int] = ...,
-        cs_head : Optional[CSHead] = ...,
-        s2c_head : Optional[S2CHead] = ...,
-        httpconn_head : Optional[HttpConnHead] = ...,
-        paint_flag : Optional[int] = ...,
-        login_sig : Optional[LoginSig] = ...,
-        delta_head : Optional[DeltaHead] = ...,
-        c2c_head : Optional[C2CHead] = ...,
-        sconn_head : Optional[SConnHead] = ...,
-        inst_ctrl : Optional[InstCtrl] = ...,
+        head_type: Optional[int] = ...,
+        cs_head: Optional[CSHead] = ...,
+        s2c_head: Optional[S2CHead] = ...,
+        httpconn_head: Optional[HttpConnHead] = ...,
+        paint_flag: Optional[int] = ...,
+        login_sig: Optional[LoginSig] = ...,
+        delta_head: Optional[DeltaHead] = ...,
+        c2c_head: Optional[C2CHead] = ...,
+        sconn_head: Optional[SConnHead] = ...,
+        inst_ctrl: Optional[InstCtrl] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2c_head",b"c2c_head",u"cs_head",b"cs_head",u"delta_head",b"delta_head",u"head_type",b"head_type",u"httpconn_head",b"httpconn_head",u"inst_ctrl",b"inst_ctrl",u"login_sig",b"login_sig",u"paint_flag",b"paint_flag",u"s2c_head",b"s2c_head",u"sconn_head",b"sconn_head"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2c_head",b"c2c_head",u"cs_head",b"cs_head",u"delta_head",b"delta_head",u"head_type",b"head_type",u"httpconn_head",b"httpconn_head",u"inst_ctrl",b"inst_ctrl",u"login_sig",b"login_sig",u"paint_flag",b"paint_flag",u"s2c_head",b"s2c_head",u"sconn_head",b"sconn_head"]) -> None: ...
+    def HasField(self, field_name: Literal["c2c_head",b"c2c_head","cs_head",b"cs_head","delta_head",b"delta_head","head_type",b"head_type","httpconn_head",b"httpconn_head","inst_ctrl",b"inst_ctrl","login_sig",b"login_sig","paint_flag",b"paint_flag","s2c_head",b"s2c_head","sconn_head",b"sconn_head"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2c_head",b"c2c_head","cs_head",b"cs_head","delta_head",b"delta_head","head_type",b"head_type","httpconn_head",b"httpconn_head","inst_ctrl",b"inst_ctrl","login_sig",b"login_sig","paint_flag",b"paint_flag","s2c_head",b"s2c_head","sconn_head",b"sconn_head"]) -> None: ...
 
 class HttpConnHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     UIN_FIELD_NUMBER: int
     COMMAND_FIELD_NUMBER: int
     SUB_COMMAND_FIELD_NUMBER: int
@@ -269,153 +260,143 @@ class HttpConnHead(Message):
     COMMAND_ID_FIELD_NUMBER: int
     SERVICE_CMDID_FIELD_NUMBER: int
     OIDBHEAD_FIELD_NUMBER: int
-    uin: int = ...
-    command: int = ...
-    sub_command: int = ...
-    seq: int = ...
-    version: int = ...
-    retry_times: int = ...
-    client_type: int = ...
-    pub_no: int = ...
-    local_id: int = ...
-    time_zone: int = ...
-    client_ip: int = ...
-    client_port: int = ...
-    qzhttp_ip: int = ...
-    qzhttp_port: int = ...
-    spp_ip: int = ...
-    spp_port: int = ...
-    flag: int = ...
-    key: bytes = ...
-    compress_type: int = ...
-    origin_size: int = ...
-    error_code: int = ...
-    command_id: int = ...
-    service_cmdid: int = ...
-
+    uin: int
+    command: int
+    sub_command: int
+    seq: int
+    version: int
+    retry_times: int
+    client_type: int
+    pub_no: int
+    local_id: int
+    time_zone: int
+    client_ip: int
+    client_port: int
+    qzhttp_ip: int
+    qzhttp_port: int
+    spp_ip: int
+    spp_port: int
+    flag: int
+    key: bytes
+    compress_type: int
+    origin_size: int
+    error_code: int
     @property
     def redirect(self) -> RedirectMsg: ...
-
+    command_id: int
+    service_cmdid: int
     @property
     def oidbhead(self) -> TransOidbHead: ...
-
     def __init__(self,
         *,
-        uin : Optional[int] = ...,
-        command : Optional[int] = ...,
-        sub_command : Optional[int] = ...,
-        seq : Optional[int] = ...,
-        version : Optional[int] = ...,
-        retry_times : Optional[int] = ...,
-        client_type : Optional[int] = ...,
-        pub_no : Optional[int] = ...,
-        local_id : Optional[int] = ...,
-        time_zone : Optional[int] = ...,
-        client_ip : Optional[int] = ...,
-        client_port : Optional[int] = ...,
-        qzhttp_ip : Optional[int] = ...,
-        qzhttp_port : Optional[int] = ...,
-        spp_ip : Optional[int] = ...,
-        spp_port : Optional[int] = ...,
-        flag : Optional[int] = ...,
-        key : Optional[bytes] = ...,
-        compress_type : Optional[int] = ...,
-        origin_size : Optional[int] = ...,
-        error_code : Optional[int] = ...,
-        redirect : Optional[RedirectMsg] = ...,
-        command_id : Optional[int] = ...,
-        service_cmdid : Optional[int] = ...,
-        oidbhead : Optional[TransOidbHead] = ...,
+        uin: Optional[int] = ...,
+        command: Optional[int] = ...,
+        sub_command: Optional[int] = ...,
+        seq: Optional[int] = ...,
+        version: Optional[int] = ...,
+        retry_times: Optional[int] = ...,
+        client_type: Optional[int] = ...,
+        pub_no: Optional[int] = ...,
+        local_id: Optional[int] = ...,
+        time_zone: Optional[int] = ...,
+        client_ip: Optional[int] = ...,
+        client_port: Optional[int] = ...,
+        qzhttp_ip: Optional[int] = ...,
+        qzhttp_port: Optional[int] = ...,
+        spp_ip: Optional[int] = ...,
+        spp_port: Optional[int] = ...,
+        flag: Optional[int] = ...,
+        key: Optional[bytes] = ...,
+        compress_type: Optional[int] = ...,
+        origin_size: Optional[int] = ...,
+        error_code: Optional[int] = ...,
+        redirect: Optional[RedirectMsg] = ...,
+        command_id: Optional[int] = ...,
+        service_cmdid: Optional[int] = ...,
+        oidbhead: Optional[TransOidbHead] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"client_ip",b"client_ip",u"client_port",b"client_port",u"client_type",b"client_type",u"command",b"command",u"command_id",b"command_id",u"compress_type",b"compress_type",u"error_code",b"error_code",u"flag",b"flag",u"key",b"key",u"local_id",b"local_id",u"oidbhead",b"oidbhead",u"origin_size",b"origin_size",u"pub_no",b"pub_no",u"qzhttp_ip",b"qzhttp_ip",u"qzhttp_port",b"qzhttp_port",u"redirect",b"redirect",u"retry_times",b"retry_times",u"seq",b"seq",u"service_cmdid",b"service_cmdid",u"spp_ip",b"spp_ip",u"spp_port",b"spp_port",u"sub_command",b"sub_command",u"time_zone",b"time_zone",u"uin",b"uin",u"version",b"version"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"client_ip",b"client_ip",u"client_port",b"client_port",u"client_type",b"client_type",u"command",b"command",u"command_id",b"command_id",u"compress_type",b"compress_type",u"error_code",b"error_code",u"flag",b"flag",u"key",b"key",u"local_id",b"local_id",u"oidbhead",b"oidbhead",u"origin_size",b"origin_size",u"pub_no",b"pub_no",u"qzhttp_ip",b"qzhttp_ip",u"qzhttp_port",b"qzhttp_port",u"redirect",b"redirect",u"retry_times",b"retry_times",u"seq",b"seq",u"service_cmdid",b"service_cmdid",u"spp_ip",b"spp_ip",u"spp_port",b"spp_port",u"sub_command",b"sub_command",u"time_zone",b"time_zone",u"uin",b"uin",u"version",b"version"]) -> None: ...
+    def HasField(self, field_name: Literal["client_ip",b"client_ip","client_port",b"client_port","client_type",b"client_type","command",b"command","command_id",b"command_id","compress_type",b"compress_type","error_code",b"error_code","flag",b"flag","key",b"key","local_id",b"local_id","oidbhead",b"oidbhead","origin_size",b"origin_size","pub_no",b"pub_no","qzhttp_ip",b"qzhttp_ip","qzhttp_port",b"qzhttp_port","redirect",b"redirect","retry_times",b"retry_times","seq",b"seq","service_cmdid",b"service_cmdid","spp_ip",b"spp_ip","spp_port",b"spp_port","sub_command",b"sub_command","time_zone",b"time_zone","uin",b"uin","version",b"version"]) -> bool: ...
+    def ClearField(self, field_name: Literal["client_ip",b"client_ip","client_port",b"client_port","client_type",b"client_type","command",b"command","command_id",b"command_id","compress_type",b"compress_type","error_code",b"error_code","flag",b"flag","key",b"key","local_id",b"local_id","oidbhead",b"oidbhead","origin_size",b"origin_size","pub_no",b"pub_no","qzhttp_ip",b"qzhttp_ip","qzhttp_port",b"qzhttp_port","redirect",b"redirect","retry_times",b"retry_times","seq",b"seq","service_cmdid",b"service_cmdid","spp_ip",b"spp_ip","spp_port",b"spp_port","sub_command",b"sub_command","time_zone",b"time_zone","uin",b"uin","version",b"version"]) -> None: ...
 
 class InstCtrl(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SEND_TO_INST_FIELD_NUMBER: int
     EXCLUDE_INST_FIELD_NUMBER: int
     FROM_INST_FIELD_NUMBER: int
-
     @property
     def send_to_inst(self) -> RepeatedCompositeFieldContainer[InstInfo]: ...
-
     @property
     def exclude_inst(self) -> RepeatedCompositeFieldContainer[InstInfo]: ...
-
     @property
     def from_inst(self) -> InstInfo: ...
-
     def __init__(self,
         *,
-        send_to_inst : Optional[Iterable[InstInfo]] = ...,
-        exclude_inst : Optional[Iterable[InstInfo]] = ...,
-        from_inst : Optional[InstInfo] = ...,
+        send_to_inst: Optional[Iterable[InstInfo]] = ...,
+        exclude_inst: Optional[Iterable[InstInfo]] = ...,
+        from_inst: Optional[InstInfo] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"from_inst",b"from_inst"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"exclude_inst",b"exclude_inst",u"from_inst",b"from_inst",u"send_to_inst",b"send_to_inst"]) -> None: ...
+    def HasField(self, field_name: Literal["from_inst",b"from_inst"]) -> bool: ...
+    def ClearField(self, field_name: Literal["exclude_inst",b"exclude_inst","from_inst",b"from_inst","send_to_inst",b"send_to_inst"]) -> None: ...
 
 class InstInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     APPPID_FIELD_NUMBER: int
     INSTID_FIELD_NUMBER: int
     PLATFORM_FIELD_NUMBER: int
     ENUM_DEVICE_TYPE_FIELD_NUMBER: int
-    apppid: int = ...
-    instid: int = ...
-    platform: int = ...
-    enum_device_type: int = ...
-
+    apppid: int
+    instid: int
+    platform: int
+    enum_device_type: int
     def __init__(self,
         *,
-        apppid : Optional[int] = ...,
-        instid : Optional[int] = ...,
-        platform : Optional[int] = ...,
-        enum_device_type : Optional[int] = ...,
+        apppid: Optional[int] = ...,
+        instid: Optional[int] = ...,
+        platform: Optional[int] = ...,
+        enum_device_type: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"apppid",b"apppid",u"enum_device_type",b"enum_device_type",u"instid",b"instid",u"platform",b"platform"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"apppid",b"apppid",u"enum_device_type",b"enum_device_type",u"instid",b"instid",u"platform",b"platform"]) -> None: ...
+    def HasField(self, field_name: Literal["apppid",b"apppid","enum_device_type",b"enum_device_type","instid",b"instid","platform",b"platform"]) -> bool: ...
+    def ClearField(self, field_name: Literal["apppid",b"apppid","enum_device_type",b"enum_device_type","instid",b"instid","platform",b"platform"]) -> None: ...
 
 class LoginSig(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TYPE_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
-    type: int = ...
-    sig: bytes = ...
-
+    type: int
+    sig: bytes
     def __init__(self,
         *,
-        type : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
+        type: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"sig",b"sig",u"type",b"type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"sig",b"sig",u"type",b"type"]) -> None: ...
+    def HasField(self, field_name: Literal["sig",b"sig","type",b"type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["sig",b"sig","type",b"type"]) -> None: ...
 
 class RedirectMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     LAST_REDIRECT_IP_FIELD_NUMBER: int
     LAST_REDIRECT_PORT_FIELD_NUMBER: int
     REDIRECT_IP_FIELD_NUMBER: int
     REDIRECT_PORT_FIELD_NUMBER: int
     REDIRECT_COUNT_FIELD_NUMBER: int
-    last_redirect_ip: int = ...
-    last_redirect_port: int = ...
-    redirect_ip: int = ...
-    redirect_port: int = ...
-    redirect_count: int = ...
-
+    last_redirect_ip: int
+    last_redirect_port: int
+    redirect_ip: int
+    redirect_port: int
+    redirect_count: int
     def __init__(self,
         *,
-        last_redirect_ip : Optional[int] = ...,
-        last_redirect_port : Optional[int] = ...,
-        redirect_ip : Optional[int] = ...,
-        redirect_port : Optional[int] = ...,
-        redirect_count : Optional[int] = ...,
+        last_redirect_ip: Optional[int] = ...,
+        last_redirect_port: Optional[int] = ...,
+        redirect_ip: Optional[int] = ...,
+        redirect_port: Optional[int] = ...,
+        redirect_count: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"last_redirect_ip",b"last_redirect_ip",u"last_redirect_port",b"last_redirect_port",u"redirect_count",b"redirect_count",u"redirect_ip",b"redirect_ip",u"redirect_port",b"redirect_port"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"last_redirect_ip",b"last_redirect_ip",u"last_redirect_port",b"last_redirect_port",u"redirect_count",b"redirect_count",u"redirect_ip",b"redirect_ip",u"redirect_port",b"redirect_port"]) -> None: ...
+    def HasField(self, field_name: Literal["last_redirect_ip",b"last_redirect_ip","last_redirect_port",b"last_redirect_port","redirect_count",b"redirect_count","redirect_ip",b"redirect_ip","redirect_port",b"redirect_port"]) -> bool: ...
+    def ClearField(self, field_name: Literal["last_redirect_ip",b"last_redirect_ip","last_redirect_port",b"last_redirect_port","redirect_count",b"redirect_count","redirect_ip",b"redirect_ip","redirect_port",b"redirect_port"]) -> None: ...
 
 class S2CHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SUB_MSGTYPE_FIELD_NUMBER: int
     MSG_TYPE_FIELD_NUMBER: int
     FROM_UIN_FIELD_NUMBER: int
@@ -423,50 +404,47 @@ class S2CHead(Message):
     RELAY_IP_FIELD_NUMBER: int
     RELAY_PORT_FIELD_NUMBER: int
     TO_UIN_FIELD_NUMBER: int
-    sub_msgtype: int = ...
-    msg_type: int = ...
-    from_uin: int = ...
-    msg_id: int = ...
-    relay_ip: int = ...
-    relay_port: int = ...
-    to_uin: int = ...
-
+    sub_msgtype: int
+    msg_type: int
+    from_uin: int
+    msg_id: int
+    relay_ip: int
+    relay_port: int
+    to_uin: int
     def __init__(self,
         *,
-        sub_msgtype : Optional[int] = ...,
-        msg_type : Optional[int] = ...,
-        from_uin : Optional[int] = ...,
-        msg_id : Optional[int] = ...,
-        relay_ip : Optional[int] = ...,
-        relay_port : Optional[int] = ...,
-        to_uin : Optional[int] = ...,
+        sub_msgtype: Optional[int] = ...,
+        msg_type: Optional[int] = ...,
+        from_uin: Optional[int] = ...,
+        msg_id: Optional[int] = ...,
+        relay_ip: Optional[int] = ...,
+        relay_port: Optional[int] = ...,
+        to_uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"from_uin",b"from_uin",u"msg_id",b"msg_id",u"msg_type",b"msg_type",u"relay_ip",b"relay_ip",u"relay_port",b"relay_port",u"sub_msgtype",b"sub_msgtype",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"from_uin",b"from_uin",u"msg_id",b"msg_id",u"msg_type",b"msg_type",u"relay_ip",b"relay_ip",u"relay_port",b"relay_port",u"sub_msgtype",b"sub_msgtype",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["from_uin",b"from_uin","msg_id",b"msg_id","msg_type",b"msg_type","relay_ip",b"relay_ip","relay_port",b"relay_port","sub_msgtype",b"sub_msgtype","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["from_uin",b"from_uin","msg_id",b"msg_id","msg_type",b"msg_type","relay_ip",b"relay_ip","relay_port",b"relay_port","sub_msgtype",b"sub_msgtype","to_uin",b"to_uin"]) -> None: ...
 
 class SConnHead(Message):
-    DESCRIPTOR: Descriptor = ...
-
+    DESCRIPTOR: Descriptor
     def __init__(self,
         ) -> None: ...
 
 class TransOidbHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     COMMAND_FIELD_NUMBER: int
     SERVICE_TYPE_FIELD_NUMBER: int
     RESULT_FIELD_NUMBER: int
     ERROR_MSG_FIELD_NUMBER: int
-    command: int = ...
-    service_type: int = ...
-    result: int = ...
-    error_msg: Text = ...
-
+    command: int
+    service_type: int
+    result: int
+    error_msg: Text
     def __init__(self,
         *,
-        command : Optional[int] = ...,
-        service_type : Optional[int] = ...,
-        result : Optional[int] = ...,
-        error_msg : Optional[Text] = ...,
+        command: Optional[int] = ...,
+        service_type: Optional[int] = ...,
+        result: Optional[int] = ...,
+        error_msg: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"command",b"command",u"error_msg",b"error_msg",u"result",b"result",u"service_type",b"service_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"command",b"command",u"error_msg",b"error_msg",u"result",b"result",u"service_type",b"service_type"]) -> None: ...
+    def HasField(self, field_name: Literal["command",b"command","error_msg",b"error_msg","result",b"result","service_type",b"service_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["command",b"command","error_msg",b"error_msg","result",b"result","service_type",b"service_type"]) -> None: ...
diff --git a/cai/pb/im/msg/obj_msg/obj_msg_pb2.py b/cai/pb/im/msg/obj_msg/obj_msg_pb2.py
index 4bfe3466..0f8de275 100644
--- a/cai/pb/im/msg/obj_msg/obj_msg_pb2.py
+++ b/cai/pb/im/msg/obj_msg/obj_msg_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/im/msg/obj_msg/obj_msg.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -13,266 +14,14 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/im/msg/obj_msg/obj_msg.proto',
-  package='im.msg.obj_msg',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n#cai/pb/im/msg/obj_msg/obj_msg.proto\x12\x0eim.msg.obj_msg\"P\n\x0eMsgContentInfo\x12\x17\n\x0f\x63ontent_info_id\x18\x01 \x01(\x0c\x12%\n\x04\x66ile\x18\x02 \x01(\x0b\x32\x17.im.msg.obj_msg.MsgFile\"\x97\x01\n\x07MsgFile\x12\x0e\n\x06\x62us_id\x18\x01 \x01(\r\x12\x11\n\tfile_path\x18\x02 \x01(\x0c\x12\x11\n\tfile_size\x18\x03 \x01(\x04\x12\x11\n\tfile_name\x18\x04 \x01(\t\x12\x11\n\tdead_time\x18\x05 \x01(\x03\x12\x11\n\tfile_sha1\x18\x06 \x01(\x0c\x12\x0b\n\x03\x65xt\x18\x07 \x01(\x0c\x12\x10\n\x08\x66ile_md5\x18\x08 \x01(\x0c\"O\n\x06MsgPic\x12\x15\n\rsmall_pic_url\x18\x01 \x01(\x0c\x12\x18\n\x10original_pic_url\x18\x02 \x01(\x0c\x12\x14\n\x0clocal_pic_id\x18\x03 \x01(\r\"\xc0\x01\n\x06ObjMsg\x12\x10\n\x08msg_type\x18\x01 \x01(\r\x12\r\n\x05title\x18\x02 \x01(\x0c\x12\x0f\n\x07\x61\x62stact\x18\x03 \x03(\x0c\x12\x11\n\ttitle_ext\x18\x05 \x01(\x0c\x12#\n\x03pic\x18\x06 \x03(\x0b\x32\x16.im.msg.obj_msg.MsgPic\x12\x34\n\x0c\x63ontent_info\x18\x07 \x03(\x0b\x32\x1e.im.msg.obj_msg.MsgContentInfo\x12\x16\n\x0ereport_id_show\x18\x08 \x01(\r'
-)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#cai/pb/im/msg/obj_msg/obj_msg.proto\x12\x0eim.msg.obj_msg\"P\n\x0eMsgContentInfo\x12\x17\n\x0f\x63ontent_info_id\x18\x01 \x01(\x0c\x12%\n\x04\x66ile\x18\x02 \x01(\x0b\x32\x17.im.msg.obj_msg.MsgFile\"\x97\x01\n\x07MsgFile\x12\x0e\n\x06\x62us_id\x18\x01 \x01(\r\x12\x11\n\tfile_path\x18\x02 \x01(\x0c\x12\x11\n\tfile_size\x18\x03 \x01(\x04\x12\x11\n\tfile_name\x18\x04 \x01(\t\x12\x11\n\tdead_time\x18\x05 \x01(\x03\x12\x11\n\tfile_sha1\x18\x06 \x01(\x0c\x12\x0b\n\x03\x65xt\x18\x07 \x01(\x0c\x12\x10\n\x08\x66ile_md5\x18\x08 \x01(\x0c\"O\n\x06MsgPic\x12\x15\n\rsmall_pic_url\x18\x01 \x01(\x0c\x12\x18\n\x10original_pic_url\x18\x02 \x01(\x0c\x12\x14\n\x0clocal_pic_id\x18\x03 \x01(\r\"\xc0\x01\n\x06ObjMsg\x12\x10\n\x08msg_type\x18\x01 \x01(\r\x12\r\n\x05title\x18\x02 \x01(\x0c\x12\x0f\n\x07\x61\x62stact\x18\x03 \x03(\x0c\x12\x11\n\ttitle_ext\x18\x05 \x01(\x0c\x12#\n\x03pic\x18\x06 \x03(\x0b\x32\x16.im.msg.obj_msg.MsgPic\x12\x34\n\x0c\x63ontent_info\x18\x07 \x03(\x0b\x32\x1e.im.msg.obj_msg.MsgContentInfo\x12\x16\n\x0ereport_id_show\x18\x08 \x01(\r')
 
 
 
-
-_MSGCONTENTINFO = _descriptor.Descriptor(
-  name='MsgContentInfo',
-  full_name='im.msg.obj_msg.MsgContentInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='content_info_id', full_name='im.msg.obj_msg.MsgContentInfo.content_info_id', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file', full_name='im.msg.obj_msg.MsgContentInfo.file', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=55,
-  serialized_end=135,
-)
-
-
-_MSGFILE = _descriptor.Descriptor(
-  name='MsgFile',
-  full_name='im.msg.obj_msg.MsgFile',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='bus_id', full_name='im.msg.obj_msg.MsgFile.bus_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_path', full_name='im.msg.obj_msg.MsgFile.file_path', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_size', full_name='im.msg.obj_msg.MsgFile.file_size', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_name', full_name='im.msg.obj_msg.MsgFile.file_name', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='dead_time', full_name='im.msg.obj_msg.MsgFile.dead_time', index=4,
-      number=5, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_sha1', full_name='im.msg.obj_msg.MsgFile.file_sha1', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ext', full_name='im.msg.obj_msg.MsgFile.ext', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='file_md5', full_name='im.msg.obj_msg.MsgFile.file_md5', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=138,
-  serialized_end=289,
-)
-
-
-_MSGPIC = _descriptor.Descriptor(
-  name='MsgPic',
-  full_name='im.msg.obj_msg.MsgPic',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='small_pic_url', full_name='im.msg.obj_msg.MsgPic.small_pic_url', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='original_pic_url', full_name='im.msg.obj_msg.MsgPic.original_pic_url', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='local_pic_id', full_name='im.msg.obj_msg.MsgPic.local_pic_id', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=291,
-  serialized_end=370,
-)
-
-
-_OBJMSG = _descriptor.Descriptor(
-  name='ObjMsg',
-  full_name='im.msg.obj_msg.ObjMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='msg_type', full_name='im.msg.obj_msg.ObjMsg.msg_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='title', full_name='im.msg.obj_msg.ObjMsg.title', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='abstact', full_name='im.msg.obj_msg.ObjMsg.abstact', index=2,
-      number=3, type=12, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='title_ext', full_name='im.msg.obj_msg.ObjMsg.title_ext', index=3,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pic', full_name='im.msg.obj_msg.ObjMsg.pic', index=4,
-      number=6, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content_info', full_name='im.msg.obj_msg.ObjMsg.content_info', index=5,
-      number=7, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='report_id_show', full_name='im.msg.obj_msg.ObjMsg.report_id_show', index=6,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=373,
-  serialized_end=565,
-)
-
-_MSGCONTENTINFO.fields_by_name['file'].message_type = _MSGFILE
-_OBJMSG.fields_by_name['pic'].message_type = _MSGPIC
-_OBJMSG.fields_by_name['content_info'].message_type = _MSGCONTENTINFO
-DESCRIPTOR.message_types_by_name['MsgContentInfo'] = _MSGCONTENTINFO
-DESCRIPTOR.message_types_by_name['MsgFile'] = _MSGFILE
-DESCRIPTOR.message_types_by_name['MsgPic'] = _MSGPIC
-DESCRIPTOR.message_types_by_name['ObjMsg'] = _OBJMSG
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_MSGCONTENTINFO = DESCRIPTOR.message_types_by_name['MsgContentInfo']
+_MSGFILE = DESCRIPTOR.message_types_by_name['MsgFile']
+_MSGPIC = DESCRIPTOR.message_types_by_name['MsgPic']
+_OBJMSG = DESCRIPTOR.message_types_by_name['ObjMsg']
 MsgContentInfo = _reflection.GeneratedProtocolMessageType('MsgContentInfo', (_message.Message,), {
   'DESCRIPTOR' : _MSGCONTENTINFO,
   '__module__' : 'cai.pb.im.msg.obj_msg.obj_msg_pb2'
@@ -301,5 +50,15 @@
   })
 _sym_db.RegisterMessage(ObjMsg)
 
-
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _MSGCONTENTINFO._serialized_start=55
+  _MSGCONTENTINFO._serialized_end=135
+  _MSGFILE._serialized_start=138
+  _MSGFILE._serialized_end=289
+  _MSGPIC._serialized_start=291
+  _MSGPIC._serialized_end=370
+  _OBJMSG._serialized_start=373
+  _OBJMSG._serialized_end=565
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/msg/obj_msg/obj_msg_pb2.pyi b/cai/pb/im/msg/obj_msg/obj_msg_pb2.pyi
index 660c9b8f..d02df1cf 100644
--- a/cai/pb/im/msg/obj_msg/obj_msg_pb2.pyi
+++ b/cai/pb/im/msg/obj_msg/obj_msg_pb2.pyi
@@ -33,27 +33,28 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class MsgContentInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    """tencent/im/msg/obj_msg.java
+
+    """
+    DESCRIPTOR: Descriptor
     CONTENT_INFO_ID_FIELD_NUMBER: int
     FILE_FIELD_NUMBER: int
-    content_info_id: bytes = ...
-
+    content_info_id: bytes
     @property
     def file(self) -> MsgFile: ...
-
     def __init__(self,
         *,
-        content_info_id : Optional[bytes] = ...,
-        file : Optional[MsgFile] = ...,
+        content_info_id: Optional[bytes] = ...,
+        file: Optional[MsgFile] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"content_info_id",b"content_info_id",u"file",b"file"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"content_info_id",b"content_info_id",u"file",b"file"]) -> None: ...
+    def HasField(self, field_name: Literal["content_info_id",b"content_info_id","file",b"file"]) -> bool: ...
+    def ClearField(self, field_name: Literal["content_info_id",b"content_info_id","file",b"file"]) -> None: ...
 
 class MsgFile(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BUS_ID_FIELD_NUMBER: int
     FILE_PATH_FIELD_NUMBER: int
     FILE_SIZE_FIELD_NUMBER: int
@@ -62,49 +63,47 @@ class MsgFile(Message):
     FILE_SHA1_FIELD_NUMBER: int
     EXT_FIELD_NUMBER: int
     FILE_MD5_FIELD_NUMBER: int
-    bus_id: int = ...
-    file_path: bytes = ...
-    file_size: int = ...
-    file_name: Text = ...
-    dead_time: int = ...
-    file_sha1: bytes = ...
-    ext: bytes = ...
-    file_md5: bytes = ...
-
+    bus_id: int
+    file_path: bytes
+    file_size: int
+    file_name: Text
+    dead_time: int
+    file_sha1: bytes
+    ext: bytes
+    file_md5: bytes
     def __init__(self,
         *,
-        bus_id : Optional[int] = ...,
-        file_path : Optional[bytes] = ...,
-        file_size : Optional[int] = ...,
-        file_name : Optional[Text] = ...,
-        dead_time : Optional[int] = ...,
-        file_sha1 : Optional[bytes] = ...,
-        ext : Optional[bytes] = ...,
-        file_md5 : Optional[bytes] = ...,
+        bus_id: Optional[int] = ...,
+        file_path: Optional[bytes] = ...,
+        file_size: Optional[int] = ...,
+        file_name: Optional[Text] = ...,
+        dead_time: Optional[int] = ...,
+        file_sha1: Optional[bytes] = ...,
+        ext: Optional[bytes] = ...,
+        file_md5: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bus_id",b"bus_id",u"dead_time",b"dead_time",u"ext",b"ext",u"file_md5",b"file_md5",u"file_name",b"file_name",u"file_path",b"file_path",u"file_sha1",b"file_sha1",u"file_size",b"file_size"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bus_id",b"bus_id",u"dead_time",b"dead_time",u"ext",b"ext",u"file_md5",b"file_md5",u"file_name",b"file_name",u"file_path",b"file_path",u"file_sha1",b"file_sha1",u"file_size",b"file_size"]) -> None: ...
+    def HasField(self, field_name: Literal["bus_id",b"bus_id","dead_time",b"dead_time","ext",b"ext","file_md5",b"file_md5","file_name",b"file_name","file_path",b"file_path","file_sha1",b"file_sha1","file_size",b"file_size"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bus_id",b"bus_id","dead_time",b"dead_time","ext",b"ext","file_md5",b"file_md5","file_name",b"file_name","file_path",b"file_path","file_sha1",b"file_sha1","file_size",b"file_size"]) -> None: ...
 
 class MsgPic(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SMALL_PIC_URL_FIELD_NUMBER: int
     ORIGINAL_PIC_URL_FIELD_NUMBER: int
     LOCAL_PIC_ID_FIELD_NUMBER: int
-    small_pic_url: bytes = ...
-    original_pic_url: bytes = ...
-    local_pic_id: int = ...
-
+    small_pic_url: bytes
+    original_pic_url: bytes
+    local_pic_id: int
     def __init__(self,
         *,
-        small_pic_url : Optional[bytes] = ...,
-        original_pic_url : Optional[bytes] = ...,
-        local_pic_id : Optional[int] = ...,
+        small_pic_url: Optional[bytes] = ...,
+        original_pic_url: Optional[bytes] = ...,
+        local_pic_id: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"local_pic_id",b"local_pic_id",u"original_pic_url",b"original_pic_url",u"small_pic_url",b"small_pic_url"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"local_pic_id",b"local_pic_id",u"original_pic_url",b"original_pic_url",u"small_pic_url",b"small_pic_url"]) -> None: ...
+    def HasField(self, field_name: Literal["local_pic_id",b"local_pic_id","original_pic_url",b"original_pic_url","small_pic_url",b"small_pic_url"]) -> bool: ...
+    def ClearField(self, field_name: Literal["local_pic_id",b"local_pic_id","original_pic_url",b"original_pic_url","small_pic_url",b"small_pic_url"]) -> None: ...
 
 class ObjMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     MSG_TYPE_FIELD_NUMBER: int
     TITLE_FIELD_NUMBER: int
     ABSTACT_FIELD_NUMBER: int
@@ -112,27 +111,25 @@ class ObjMsg(Message):
     PIC_FIELD_NUMBER: int
     CONTENT_INFO_FIELD_NUMBER: int
     REPORT_ID_SHOW_FIELD_NUMBER: int
-    msg_type: int = ...
-    title: bytes = ...
-    abstact: RepeatedScalarFieldContainer[bytes] = ...
-    title_ext: bytes = ...
-    report_id_show: int = ...
-
+    msg_type: int
+    title: bytes
+    @property
+    def abstact(self) -> RepeatedScalarFieldContainer[bytes]: ...
+    title_ext: bytes
     @property
     def pic(self) -> RepeatedCompositeFieldContainer[MsgPic]: ...
-
     @property
     def content_info(self) -> RepeatedCompositeFieldContainer[MsgContentInfo]: ...
-
+    report_id_show: int
     def __init__(self,
         *,
-        msg_type : Optional[int] = ...,
-        title : Optional[bytes] = ...,
-        abstact : Optional[Iterable[bytes]] = ...,
-        title_ext : Optional[bytes] = ...,
-        pic : Optional[Iterable[MsgPic]] = ...,
-        content_info : Optional[Iterable[MsgContentInfo]] = ...,
-        report_id_show : Optional[int] = ...,
+        msg_type: Optional[int] = ...,
+        title: Optional[bytes] = ...,
+        abstact: Optional[Iterable[bytes]] = ...,
+        title_ext: Optional[bytes] = ...,
+        pic: Optional[Iterable[MsgPic]] = ...,
+        content_info: Optional[Iterable[MsgContentInfo]] = ...,
+        report_id_show: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"msg_type",b"msg_type",u"report_id_show",b"report_id_show",u"title",b"title",u"title_ext",b"title_ext"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"abstact",b"abstact",u"content_info",b"content_info",u"msg_type",b"msg_type",u"pic",b"pic",u"report_id_show",b"report_id_show",u"title",b"title",u"title_ext",b"title_ext"]) -> None: ...
+    def HasField(self, field_name: Literal["msg_type",b"msg_type","report_id_show",b"report_id_show","title",b"title","title_ext",b"title_ext"]) -> bool: ...
+    def ClearField(self, field_name: Literal["abstact",b"abstact","content_info",b"content_info","msg_type",b"msg_type","pic",b"pic","report_id_show",b"report_id_show","title",b"title","title_ext",b"title_ext"]) -> None: ...
diff --git a/cai/pb/im/msg/receipt/receipt_pb2.py b/cai/pb/im/msg/receipt/receipt_pb2.py
index 883847d9..ac741f0a 100644
--- a/cai/pb/im/msg/receipt/receipt_pb2.py
+++ b/cai/pb/im/msg/receipt/receipt_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/im/msg/receipt/receipt.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -13,188 +14,14 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/im/msg/receipt/receipt.proto',
-  package='im.msg.receipt',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n#cai/pb/im/msg/receipt/receipt.proto\x12\x0eim.msg.receipt\"P\n\x07MsgInfo\x12\x10\n\x08\x66rom_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\x12\x0f\n\x07msg_seq\x18\x03 \x01(\r\x12\x12\n\nmsg_random\x18\x04 \x01(\r\" \n\x0bReceiptInfo\x12\x11\n\tread_time\x18\x01 \x01(\x04\"D\n\nReceiptReq\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\r\x12%\n\x04info\x18\x02 \x01(\x0b\x32\x17.im.msg.receipt.MsgInfo\"Q\n\x0bReceiptResp\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\r\x12\x31\n\x0creceipt_info\x18\x02 \x01(\x0b\x32\x1b.im.msg.receipt.ReceiptInfo'
-)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#cai/pb/im/msg/receipt/receipt.proto\x12\x0eim.msg.receipt\"P\n\x07MsgInfo\x12\x10\n\x08\x66rom_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\x12\x0f\n\x07msg_seq\x18\x03 \x01(\r\x12\x12\n\nmsg_random\x18\x04 \x01(\r\" \n\x0bReceiptInfo\x12\x11\n\tread_time\x18\x01 \x01(\x04\"D\n\nReceiptReq\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\r\x12%\n\x04info\x18\x02 \x01(\x0b\x32\x17.im.msg.receipt.MsgInfo\"Q\n\x0bReceiptResp\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\r\x12\x31\n\x0creceipt_info\x18\x02 \x01(\x0b\x32\x1b.im.msg.receipt.ReceiptInfo')
 
 
 
-
-_MSGINFO = _descriptor.Descriptor(
-  name='MsgInfo',
-  full_name='im.msg.receipt.MsgInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='from_uin', full_name='im.msg.receipt.MsgInfo.from_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='im.msg.receipt.MsgInfo.to_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_seq', full_name='im.msg.receipt.MsgInfo.msg_seq', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_random', full_name='im.msg.receipt.MsgInfo.msg_random', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=55,
-  serialized_end=135,
-)
-
-
-_RECEIPTINFO = _descriptor.Descriptor(
-  name='ReceiptInfo',
-  full_name='im.msg.receipt.ReceiptInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='read_time', full_name='im.msg.receipt.ReceiptInfo.read_time', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=137,
-  serialized_end=169,
-)
-
-
-_RECEIPTREQ = _descriptor.Descriptor(
-  name='ReceiptReq',
-  full_name='im.msg.receipt.ReceiptReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='command', full_name='im.msg.receipt.ReceiptReq.command', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='info', full_name='im.msg.receipt.ReceiptReq.info', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=171,
-  serialized_end=239,
-)
-
-
-_RECEIPTRESP = _descriptor.Descriptor(
-  name='ReceiptResp',
-  full_name='im.msg.receipt.ReceiptResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='command', full_name='im.msg.receipt.ReceiptResp.command', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='receipt_info', full_name='im.msg.receipt.ReceiptResp.receipt_info', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=241,
-  serialized_end=322,
-)
-
-_RECEIPTREQ.fields_by_name['info'].message_type = _MSGINFO
-_RECEIPTRESP.fields_by_name['receipt_info'].message_type = _RECEIPTINFO
-DESCRIPTOR.message_types_by_name['MsgInfo'] = _MSGINFO
-DESCRIPTOR.message_types_by_name['ReceiptInfo'] = _RECEIPTINFO
-DESCRIPTOR.message_types_by_name['ReceiptReq'] = _RECEIPTREQ
-DESCRIPTOR.message_types_by_name['ReceiptResp'] = _RECEIPTRESP
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_MSGINFO = DESCRIPTOR.message_types_by_name['MsgInfo']
+_RECEIPTINFO = DESCRIPTOR.message_types_by_name['ReceiptInfo']
+_RECEIPTREQ = DESCRIPTOR.message_types_by_name['ReceiptReq']
+_RECEIPTRESP = DESCRIPTOR.message_types_by_name['ReceiptResp']
 MsgInfo = _reflection.GeneratedProtocolMessageType('MsgInfo', (_message.Message,), {
   'DESCRIPTOR' : _MSGINFO,
   '__module__' : 'cai.pb.im.msg.receipt.receipt_pb2'
@@ -223,5 +50,15 @@
   })
 _sym_db.RegisterMessage(ReceiptResp)
 
-
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _MSGINFO._serialized_start=55
+  _MSGINFO._serialized_end=135
+  _RECEIPTINFO._serialized_start=137
+  _RECEIPTINFO._serialized_end=169
+  _RECEIPTREQ._serialized_start=171
+  _RECEIPTREQ._serialized_end=239
+  _RECEIPTRESP._serialized_start=241
+  _RECEIPTRESP._serialized_end=322
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/msg/receipt/receipt_pb2.pyi b/cai/pb/im/msg/receipt/receipt_pb2.pyi
index 6c1a289f..b92646f1 100644
--- a/cai/pb/im/msg/receipt/receipt_pb2.pyi
+++ b/cai/pb/im/msg/receipt/receipt_pb2.pyi
@@ -25,71 +25,65 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class MsgInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FROM_UIN_FIELD_NUMBER: int
     TO_UIN_FIELD_NUMBER: int
     MSG_SEQ_FIELD_NUMBER: int
     MSG_RANDOM_FIELD_NUMBER: int
-    from_uin: int = ...
-    to_uin: int = ...
-    msg_seq: int = ...
-    msg_random: int = ...
-
+    from_uin: int
+    to_uin: int
+    msg_seq: int
+    msg_random: int
     def __init__(self,
         *,
-        from_uin : Optional[int] = ...,
-        to_uin : Optional[int] = ...,
-        msg_seq : Optional[int] = ...,
-        msg_random : Optional[int] = ...,
+        from_uin: Optional[int] = ...,
+        to_uin: Optional[int] = ...,
+        msg_seq: Optional[int] = ...,
+        msg_random: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"from_uin",b"from_uin",u"msg_random",b"msg_random",u"msg_seq",b"msg_seq",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"from_uin",b"from_uin",u"msg_random",b"msg_random",u"msg_seq",b"msg_seq",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["from_uin",b"from_uin","msg_random",b"msg_random","msg_seq",b"msg_seq","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["from_uin",b"from_uin","msg_random",b"msg_random","msg_seq",b"msg_seq","to_uin",b"to_uin"]) -> None: ...
 
 class ReceiptInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     READ_TIME_FIELD_NUMBER: int
-    read_time: int = ...
-
+    read_time: int
     def __init__(self,
         *,
-        read_time : Optional[int] = ...,
+        read_time: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"read_time",b"read_time"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"read_time",b"read_time"]) -> None: ...
+    def HasField(self, field_name: Literal["read_time",b"read_time"]) -> bool: ...
+    def ClearField(self, field_name: Literal["read_time",b"read_time"]) -> None: ...
 
 class ReceiptReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     COMMAND_FIELD_NUMBER: int
     INFO_FIELD_NUMBER: int
-    command: int = ...
-
+    command: int
     @property
     def info(self) -> MsgInfo: ...
-
     def __init__(self,
         *,
-        command : Optional[int] = ...,
-        info : Optional[MsgInfo] = ...,
+        command: Optional[int] = ...,
+        info: Optional[MsgInfo] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"command",b"command",u"info",b"info"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"command",b"command",u"info",b"info"]) -> None: ...
+    def HasField(self, field_name: Literal["command",b"command","info",b"info"]) -> bool: ...
+    def ClearField(self, field_name: Literal["command",b"command","info",b"info"]) -> None: ...
 
 class ReceiptResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     COMMAND_FIELD_NUMBER: int
     RECEIPT_INFO_FIELD_NUMBER: int
-    command: int = ...
-
+    command: int
     @property
     def receipt_info(self) -> ReceiptInfo: ...
-
     def __init__(self,
         *,
-        command : Optional[int] = ...,
-        receipt_info : Optional[ReceiptInfo] = ...,
+        command: Optional[int] = ...,
+        receipt_info: Optional[ReceiptInfo] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"command",b"command",u"receipt_info",b"receipt_info"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"command",b"command",u"receipt_info",b"receipt_info"]) -> None: ...
+    def HasField(self, field_name: Literal["command",b"command","receipt_info",b"receipt_info"]) -> bool: ...
+    def ClearField(self, field_name: Literal["command",b"command","receipt_info",b"receipt_info"]) -> None: ...
diff --git a/cai/pb/im/msg/service/comm_elem/comm_elem_pb2.py b/cai/pb/im/msg/service/comm_elem/comm_elem_pb2.py
index 46bc7d8e..e0a5c960 100644
--- a/cai/pb/im/msg/service/comm_elem/comm_elem_pb2.py
+++ b/cai/pb/im/msg/service/comm_elem/comm_elem_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/im/msg/service/comm_elem/comm_elem.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -14,2006 +15,42 @@
 from cai.pb.im.msg.msg_body import msg_body_pb2 as cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/im/msg/service/comm_elem/comm_elem.proto',
-  package='im.msg.service.comm_elem',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n/cai/pb/im/msg/service/comm_elem/comm_elem.proto\x12\x18im.msg.service.comm_elem\x1a%cai/pb/im/msg/msg_body/msg_body.proto\"\xfa\x01\n\x15MsgElemInfo_servtype1\x12\x11\n\treward_id\x18\x01 \x01(\x0c\x12\x12\n\nsender_uin\x18\x02 \x01(\x04\x12\x10\n\x08pic_type\x18\x03 \x01(\r\x12\x14\n\x0creward_money\x18\x04 \x01(\r\x12\x0b\n\x03url\x18\x05 \x01(\x0c\x12\x0f\n\x07\x63ontent\x18\x06 \x01(\x0c\x12\x18\n\x10\x63reate_timestamp\x18\x07 \x01(\r\x12\x0e\n\x06status\x18\x08 \x01(\r\x12\x0c\n\x04size\x18\t \x01(\r\x12\x16\n\x0evideo_duration\x18\n \x01(\r\x12\x0b\n\x03seq\x18\x0b \x01(\x04\x12\x17\n\x0freward_type_ext\x18\x0c \x01(\r\"\xc2\x01\n\x16MsgElemInfo_servtype11\x12\x0e\n\x06res_id\x18\x01 \x01(\x0c\x12\x0f\n\x07res_md5\x18\x02 \x01(\x0c\x12\x15\n\rreserve_info1\x18\x03 \x01(\x0c\x12\x15\n\rreserve_info2\x18\x04 \x01(\x0c\x12\x1a\n\x12\x64oodle_data_offset\x18\x05 \x01(\r\x12\x15\n\rdoodle_gif_id\x18\x06 \x01(\r\x12\x12\n\ndoodle_url\x18\x07 \x01(\x0c\x12\x12\n\ndoodle_md5\x18\x08 \x01(\x0c\"@\n\x16MsgElemInfo_servtype13\x12\x13\n\x0bsys_head_id\x18\x01 \x01(\r\x12\x11\n\thead_flag\x18\x02 \x01(\r\":\n\x16MsgElemInfo_servtype14\x12\n\n\x02id\x18\x01 \x01(\r\x12\x14\n\x0creserve_info\x18\x02 \x01(\x0c\"\xa7\x01\n\x16MsgElemInfo_servtype15\x12\x0b\n\x03vid\x18\x01 \x01(\x0c\x12\r\n\x05\x63over\x18\x02 \x01(\x0c\x12\r\n\x05title\x18\x03 \x01(\x0c\x12\x0f\n\x07summary\x18\x04 \x01(\x0c\x12\x13\n\x0b\x63reate_time\x18\x05 \x01(\x04\x12\x17\n\x0f\x63omment_content\x18\x06 \x01(\x0c\x12\x0e\n\x06\x61uthor\x18\x07 \x01(\x04\x12\x13\n\x0b\x63tr_version\x18\x08 \x01(\r\"\x8a\x02\n\x16MsgElemInfo_servtype16\x12\x0b\n\x03uid\x18\x01 \x01(\x04\x12\x10\n\x08union_id\x18\x02 \x01(\x0c\x12\x10\n\x08story_id\x18\x03 \x01(\x0c\x12\x0b\n\x03md5\x18\x04 \x01(\x0c\x12\x11\n\tthumb_url\x18\x05 \x01(\x0c\x12\x12\n\ndoodle_url\x18\x06 \x01(\x0c\x12\x13\n\x0bvideo_width\x18\x07 \x01(\r\x12\x14\n\x0cvideo_height\x18\x08 \x01(\r\x12\x13\n\x0bsource_name\x18\t \x01(\x0c\x12\x1a\n\x12source_action_type\x18\n \x01(\x0c\x12\x1a\n\x12source_action_data\x18\x0b \x01(\x0c\x12\x13\n\x0b\x63tr_version\x18\x0c \x01(\r\"x\n\x16MsgElemInfo_servtype18\x12\x16\n\x0e\x63urrent_amount\x18\x01 \x01(\x04\x12\x14\n\x0ctotal_amount\x18\x02 \x01(\x04\x12\x0e\n\x06listid\x18\x03 \x01(\x0c\x12\x10\n\x08\x61uth_key\x18\x04 \x01(\x0c\x12\x0e\n\x06number\x18\x05 \x01(\r\"&\n\x16MsgElemInfo_servtype19\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\xed\x01\n\x15MsgElemInfo_servtype2\x12\x11\n\tpoke_type\x18\x01 \x01(\r\x12\x14\n\x0cpoke_summary\x18\x02 \x01(\x0c\x12\x12\n\ndouble_hit\x18\x03 \x01(\r\x12\x12\n\nvaspoke_id\x18\x04 \x01(\r\x12\x14\n\x0cvaspoke_name\x18\x05 \x01(\x0c\x12\x16\n\x0evaspoke_minver\x18\x06 \x01(\x0c\x12\x15\n\rpoke_strength\x18\x07 \x01(\r\x12\x10\n\x08msg_type\x18\x08 \x01(\r\x12\x19\n\x11\x66\x61\x63\x65_bubble_count\x18\t \x01(\r\x12\x11\n\tpoke_flag\x18\n \x01(\r\"&\n\x16MsgElemInfo_servtype20\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\x81\x03\n\x16MsgElemInfo_servtype21\x12\x10\n\x08topic_id\x18\x01 \x01(\r\x12\x15\n\rconfessor_uin\x18\x02 \x01(\x04\x12\x16\n\x0e\x63onfessor_nick\x18\x03 \x01(\x0c\x12\x15\n\rconfessor_sex\x18\x04 \x01(\r\x12\x13\n\x0bsysmsg_flag\x18\x05 \x01(\r\x12\x45\n\x10\x63\x32_c_confess_ctx\x18\x06 \x01(\x0b\x32+.im.msg.service.comm_elem.C2CConfessContext\x12\r\n\x05topic\x18\x07 \x01(\x0c\x12\x14\n\x0c\x63onfess_time\x18\x08 \x01(\x04\x12\x44\n\x11group_confess_msg\x18\t \x01(\x0b\x32).im.msg.service.comm_elem.GroupConfessMsg\x12H\n\x11group_confess_ctx\x18\n \x01(\x0b\x32-.im.msg.service.comm_elem.GroupConfessContext\"\x8c\x02\n\x11\x43\x32\x43\x43onfessContext\x12\x15\n\rconfessor_uin\x18\x01 \x01(\x04\x12\x16\n\x0e\x63onfess_to_uin\x18\x02 \x01(\x04\x12\x10\n\x08send_uin\x18\x03 \x01(\x04\x12\x16\n\x0e\x63onfessor_nick\x18\x04 \x01(\x0c\x12\x0f\n\x07\x63onfess\x18\x05 \x01(\x0c\x12\x0f\n\x07\x62g_type\x18\x06 \x01(\r\x12\x10\n\x08topic_id\x18\x07 \x01(\r\x12\x14\n\x0c\x63onfess_time\x18\x08 \x01(\x04\x12\x15\n\rconfessor_sex\x18\t \x01(\r\x12\x10\n\x08\x62iz_type\x18\n \x01(\r\x12\x13\n\x0b\x63onfess_num\x18\x0b \x01(\r\x12\x16\n\x0e\x63onfess_to_sex\x18\x0c \x01(\r\"\xf3\x01\n\x13GroupConfessContext\x12\x15\n\rconfessor_uin\x18\x01 \x01(\x04\x12\x16\n\x0e\x63onfess_to_uin\x18\x02 \x01(\x04\x12\x10\n\x08send_uin\x18\x03 \x01(\x04\x12\x15\n\rconfessor_sex\x18\x04 \x01(\r\x12\x17\n\x0f\x63onfess_to_nick\x18\x05 \x01(\x0c\x12\r\n\x05topic\x18\x06 \x01(\x0c\x12\x10\n\x08topic_id\x18\x07 \x01(\r\x12\x14\n\x0c\x63onfess_time\x18\x08 \x01(\x04\x12\x1c\n\x14\x63onfess_to_nick_type\x18\t \x01(\r\x12\x16\n\x0e\x63onfessor_nick\x18\n \x01(\x0c\"\x82\x01\n\x10GroupConfessItem\x12\x10\n\x08topic_id\x18\x01 \x01(\r\x12\x16\n\x0e\x63onfess_to_uin\x18\x02 \x01(\x04\x12\x17\n\x0f\x63onfess_to_nick\x18\x03 \x01(\x0c\x12\r\n\x05topic\x18\x04 \x01(\x0c\x12\x1c\n\x14\x63onfess_to_nick_type\x18\x05 \x01(\r\"\xc8\x01\n\x0fGroupConfessMsg\x12\x14\n\x0c\x63onfess_time\x18\x01 \x01(\x04\x12\x15\n\rconfessor_uin\x18\x02 \x01(\x04\x12\x15\n\rconfessor_sex\x18\x03 \x01(\r\x12\x13\n\x0bsysmsg_flag\x18\x04 \x01(\r\x12\x41\n\rconfess_items\x18\x05 \x03(\x0b\x32*.im.msg.service.comm_elem.GroupConfessItem\x12\x19\n\x11total_topic_count\x18\x06 \x01(\r\"\xc1\x01\n\x16MsgElemInfo_servtype23\x12\x11\n\tface_type\x18\x01 \x01(\r\x12\x19\n\x11\x66\x61\x63\x65_bubble_count\x18\x02 \x01(\r\x12\x14\n\x0c\x66\x61\x63\x65_summary\x18\x03 \x01(\x0c\x12\x0c\n\x04\x66lag\x18\x04 \x01(\r\x12\x0e\n\x06others\x18\x05 \x01(\x0c\x12\x45\n\x0byellow_face\x18\x06 \x01(\x0b\x32\x30.im.msg.service.comm_elem.MsgElemInfo_servtype33\"\x9e\x01\n\x16MsgElemInfo_servtype24\x12\x42\n\x10limit_chat_enter\x18\x01 \x01(\x0b\x32(.im.msg.service.comm_elem.LimitChatEnter\x12@\n\x0flimit_chat_exit\x18\x02 \x01(\x0b\x32\'.im.msg.service.comm_elem.LimitChatExit\"\xad\x01\n\x0eLimitChatEnter\x12\x14\n\x0ctips_wording\x18\x01 \x01(\x0c\x12\x16\n\x0eleft_chat_time\x18\x02 \x01(\r\x12\x10\n\x08match_ts\x18\x03 \x01(\x04\x12\x1a\n\x12match_expired_time\x18\x04 \x01(\r\x12\x19\n\x11\x63\x32_c_expired_time\x18\x05 \x01(\r\x12\x10\n\x08ready_ts\x18\x06 \x01(\x04\x12\x12\n\nmatch_nick\x18\x07 \x01(\x0c\"6\n\rLimitChatExit\x12\x13\n\x0b\x65xit_method\x18\x01 \x01(\r\x12\x10\n\x08match_ts\x18\x02 \x01(\x04\"H\n\x16MsgElemInfo_servtype27\x12.\n\nvideo_file\x18\x01 \x01(\x0b\x32\x1a.im.msg.msg_body.VideoFile\".\n\x16MsgElemInfo_servtype29\x12\x14\n\x0cluckybag_msg\x18\x01 \x01(\x0c\"\x86\x01\n\x15MsgElemInfo_servtype3\x12\x34\n\x0f\x66lash_troop_pic\x18\x01 \x01(\x0b\x32\x1b.im.msg.msg_body.CustomFace\x12\x37\n\x0e\x66lash_c2_c_pic\x18\x02 \x01(\x0b\x32\x1f.im.msg.msg_body.NotOnlineImage\"3\n\x16MsgElemInfo_servtype31\x12\x0c\n\x04text\x18\x01 \x01(\x0c\x12\x0b\n\x03\x65xt\x18\x02 \x01(\x0c\"R\n\x16MsgElemInfo_servtype33\x12\r\n\x05index\x18\x01 \x01(\r\x12\x0c\n\x04text\x18\x02 \x01(\x0c\x12\x0e\n\x06\x63ompat\x18\x03 \x01(\x0c\x12\x0b\n\x03\x62uf\x18\x04 \x01(\x0c\"\x93\x01\n\x16MsgElemInfo_servtype34\x12\x15\n\rfrom_nickname\x18\x01 \x01(\x0c\x12\x18\n\x10push_window_flag\x18\x02 \x01(\r\x12;\n\x0cgame_session\x18\x03 \x01(\x0b\x32%.im.msg.service.comm_elem.GameSession\x12\x0b\n\x03\x65xt\x18\x04 \x01(\x0c\"\x9f\x01\n\x0bGameSession\x12\x14\n\x0c\x66rom_role_id\x18\x01 \x01(\x0c\x12\x14\n\x0c\x66rom_open_id\x18\x02 \x01(\x0c\x12\x12\n\nto_role_id\x18\x03 \x01(\x0c\x12\x12\n\nto_open_id\x18\x04 \x01(\x0c\x12\x12\n\ngame_appid\x18\x05 \x01(\x04\x12\x14\n\x0c\x66rom_tiny_id\x18\x06 \x01(\x04\x12\x12\n\nto_tiny_id\x18\x07 \x01(\x04\"h\n\x16MsgElemInfo_servtype35\x12\r\n\x05token\x18\x01 \x01(\x0c\x12\x14\n\x0cglobal_padid\x18\x02 \x01(\x0c\x12\x0f\n\x07get_rev\x18\x03 \x01(\r\x12\x18\n\x10his_edit_uin_num\x18\x04 \x01(\r\"r\n\x15MsgElemInfo_servtype4\x12\x11\n\timsg_type\x18\x01 \x01(\r\x12\x46\n\x14st_story_aio_obj_msg\x18\x04 \x01(\x0b\x32(.im.msg.service.comm_elem.StoryAioObjMsg\"\x91\x01\n\x15MsgElemInfo_servtype5\x12\x0b\n\x03vid\x18\x01 \x01(\x0c\x12\r\n\x05\x63over\x18\x02 \x01(\x0c\x12\r\n\x05title\x18\x03 \x01(\x0c\x12\x0f\n\x07summary\x18\x04 \x01(\x0c\x12\x13\n\x0b\x63reate_time\x18\x05 \x01(\x04\x12\x17\n\x0f\x63omment_content\x18\x06 \x01(\x0c\x12\x0e\n\x06\x61uthor\x18\x07 \x01(\x04\"W\n\x15MsgElemInfo_servtype8\x12>\n\x15wifi_deliver_gift_msg\x18\x01 \x01(\x0b\x32\x1f.im.msg.msg_body.DeliverGiftMsg\"\x89\x01\n\x15MsgElemInfo_servtype9\x12\x15\n\ranchor_status\x18\x01 \x01(\r\x12\x13\n\x0bjump_schema\x18\x02 \x01(\x0c\x12\x17\n\x0f\x61nchor_nickname\x18\x03 \x01(\t\x12\x17\n\x0f\x61nchor_head_url\x18\x04 \x01(\x0c\x12\x12\n\nlive_title\x18\x05 \x01(\t\"1\n\x0eStoryAioObjMsg\x12\x0e\n\x06ui_url\x18\x01 \x01(\t\x12\x0f\n\x07jmp_url\x18\x02 \x01(\t'
-  ,
-  dependencies=[cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2.DESCRIPTOR,])
-
-
-
-
-_MSGELEMINFO_SERVTYPE1 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype1',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='reward_id', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.reward_id', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sender_uin', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.sender_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pic_type', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.pic_type', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reward_money', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.reward_money', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='url', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.url', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.content', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='create_timestamp', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.create_timestamp', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.status', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='size', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.size', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='video_duration', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.video_duration', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='seq', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.seq', index=10,
-      number=11, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reward_type_ext', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype1.reward_type_ext', index=11,
-      number=12, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=117,
-  serialized_end=367,
-)
-
-
-_MSGELEMINFO_SERVTYPE11 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype11',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype11',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='res_id', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype11.res_id', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='res_md5', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype11.res_md5', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserve_info1', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype11.reserve_info1', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserve_info2', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype11.reserve_info2', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='doodle_data_offset', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype11.doodle_data_offset', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='doodle_gif_id', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype11.doodle_gif_id', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='doodle_url', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype11.doodle_url', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='doodle_md5', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype11.doodle_md5', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=370,
-  serialized_end=564,
-)
-
-
-_MSGELEMINFO_SERVTYPE13 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype13',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype13',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='sys_head_id', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype13.sys_head_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='head_flag', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype13.head_flag', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=566,
-  serialized_end=630,
-)
-
-
-_MSGELEMINFO_SERVTYPE14 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype14',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype14',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='id', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype14.id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserve_info', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype14.reserve_info', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=632,
-  serialized_end=690,
-)
-
-
-_MSGELEMINFO_SERVTYPE15 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype15',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype15',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='vid', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype15.vid', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cover', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype15.cover', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='title', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype15.title', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='summary', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype15.summary', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='create_time', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype15.create_time', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='comment_content', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype15.comment_content', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='author', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype15.author', index=6,
-      number=7, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ctr_version', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype15.ctr_version', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=693,
-  serialized_end=860,
-)
-
-
-_MSGELEMINFO_SERVTYPE16 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype16',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='uid', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.uid', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='union_id', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.union_id', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='story_id', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.story_id', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='md5', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.md5', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thumb_url', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.thumb_url', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='doodle_url', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.doodle_url', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='video_width', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.video_width', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='video_height', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.video_height', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='source_name', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.source_name', index=8,
-      number=9, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='source_action_type', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.source_action_type', index=9,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='source_action_data', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.source_action_data', index=10,
-      number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ctr_version', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype16.ctr_version', index=11,
-      number=12, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=863,
-  serialized_end=1129,
-)
-
-
-_MSGELEMINFO_SERVTYPE18 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype18',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype18',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='current_amount', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype18.current_amount', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='total_amount', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype18.total_amount', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='listid', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype18.listid', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='auth_key', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype18.auth_key', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='number', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype18.number', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1131,
-  serialized_end=1251,
-)
-
-
-_MSGELEMINFO_SERVTYPE19 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype19',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype19',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='data', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype19.data', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1253,
-  serialized_end=1291,
-)
-
-
-_MSGELEMINFO_SERVTYPE2 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype2',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype2',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='poke_type', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype2.poke_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='poke_summary', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype2.poke_summary', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='double_hit', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype2.double_hit', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='vaspoke_id', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype2.vaspoke_id', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='vaspoke_name', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype2.vaspoke_name', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='vaspoke_minver', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype2.vaspoke_minver', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='poke_strength', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype2.poke_strength', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_type', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype2.msg_type', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='face_bubble_count', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype2.face_bubble_count', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='poke_flag', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype2.poke_flag', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1294,
-  serialized_end=1531,
-)
-
-
-_MSGELEMINFO_SERVTYPE20 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype20',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype20',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='data', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype20.data', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1533,
-  serialized_end=1571,
-)
-
-
-_MSGELEMINFO_SERVTYPE21 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype21',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype21',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='topic_id', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype21.topic_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confessor_uin', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype21.confessor_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confessor_nick', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype21.confessor_nick', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confessor_sex', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype21.confessor_sex', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sysmsg_flag', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype21.sysmsg_flag', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2_c_confess_ctx', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype21.c2_c_confess_ctx', index=5,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='topic', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype21.topic', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_time', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype21.confess_time', index=7,
-      number=8, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_confess_msg', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype21.group_confess_msg', index=8,
-      number=9, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_confess_ctx', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype21.group_confess_ctx', index=9,
-      number=10, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1574,
-  serialized_end=1959,
-)
-
-
-_C2CCONFESSCONTEXT = _descriptor.Descriptor(
-  name='C2CConfessContext',
-  full_name='im.msg.service.comm_elem.C2CConfessContext',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='confessor_uin', full_name='im.msg.service.comm_elem.C2CConfessContext.confessor_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_to_uin', full_name='im.msg.service.comm_elem.C2CConfessContext.confess_to_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='send_uin', full_name='im.msg.service.comm_elem.C2CConfessContext.send_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confessor_nick', full_name='im.msg.service.comm_elem.C2CConfessContext.confessor_nick', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess', full_name='im.msg.service.comm_elem.C2CConfessContext.confess', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bg_type', full_name='im.msg.service.comm_elem.C2CConfessContext.bg_type', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='topic_id', full_name='im.msg.service.comm_elem.C2CConfessContext.topic_id', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_time', full_name='im.msg.service.comm_elem.C2CConfessContext.confess_time', index=7,
-      number=8, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confessor_sex', full_name='im.msg.service.comm_elem.C2CConfessContext.confessor_sex', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='biz_type', full_name='im.msg.service.comm_elem.C2CConfessContext.biz_type', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_num', full_name='im.msg.service.comm_elem.C2CConfessContext.confess_num', index=10,
-      number=11, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_to_sex', full_name='im.msg.service.comm_elem.C2CConfessContext.confess_to_sex', index=11,
-      number=12, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1962,
-  serialized_end=2230,
-)
-
-
-_GROUPCONFESSCONTEXT = _descriptor.Descriptor(
-  name='GroupConfessContext',
-  full_name='im.msg.service.comm_elem.GroupConfessContext',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='confessor_uin', full_name='im.msg.service.comm_elem.GroupConfessContext.confessor_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_to_uin', full_name='im.msg.service.comm_elem.GroupConfessContext.confess_to_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='send_uin', full_name='im.msg.service.comm_elem.GroupConfessContext.send_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confessor_sex', full_name='im.msg.service.comm_elem.GroupConfessContext.confessor_sex', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_to_nick', full_name='im.msg.service.comm_elem.GroupConfessContext.confess_to_nick', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='topic', full_name='im.msg.service.comm_elem.GroupConfessContext.topic', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='topic_id', full_name='im.msg.service.comm_elem.GroupConfessContext.topic_id', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_time', full_name='im.msg.service.comm_elem.GroupConfessContext.confess_time', index=7,
-      number=8, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_to_nick_type', full_name='im.msg.service.comm_elem.GroupConfessContext.confess_to_nick_type', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confessor_nick', full_name='im.msg.service.comm_elem.GroupConfessContext.confessor_nick', index=9,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2233,
-  serialized_end=2476,
-)
-
-
-_GROUPCONFESSITEM = _descriptor.Descriptor(
-  name='GroupConfessItem',
-  full_name='im.msg.service.comm_elem.GroupConfessItem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='topic_id', full_name='im.msg.service.comm_elem.GroupConfessItem.topic_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_to_uin', full_name='im.msg.service.comm_elem.GroupConfessItem.confess_to_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_to_nick', full_name='im.msg.service.comm_elem.GroupConfessItem.confess_to_nick', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='topic', full_name='im.msg.service.comm_elem.GroupConfessItem.topic', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_to_nick_type', full_name='im.msg.service.comm_elem.GroupConfessItem.confess_to_nick_type', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2479,
-  serialized_end=2609,
-)
-
-
-_GROUPCONFESSMSG = _descriptor.Descriptor(
-  name='GroupConfessMsg',
-  full_name='im.msg.service.comm_elem.GroupConfessMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='confess_time', full_name='im.msg.service.comm_elem.GroupConfessMsg.confess_time', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confessor_uin', full_name='im.msg.service.comm_elem.GroupConfessMsg.confessor_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confessor_sex', full_name='im.msg.service.comm_elem.GroupConfessMsg.confessor_sex', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sysmsg_flag', full_name='im.msg.service.comm_elem.GroupConfessMsg.sysmsg_flag', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confess_items', full_name='im.msg.service.comm_elem.GroupConfessMsg.confess_items', index=4,
-      number=5, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='total_topic_count', full_name='im.msg.service.comm_elem.GroupConfessMsg.total_topic_count', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2612,
-  serialized_end=2812,
-)
-
-
-_MSGELEMINFO_SERVTYPE23 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype23',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype23',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='face_type', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype23.face_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='face_bubble_count', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype23.face_bubble_count', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='face_summary', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype23.face_summary', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype23.flag', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='others', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype23.others', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='yellow_face', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype23.yellow_face', index=5,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2815,
-  serialized_end=3008,
-)
-
-
-_MSGELEMINFO_SERVTYPE24 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype24',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype24',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='limit_chat_enter', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype24.limit_chat_enter', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='limit_chat_exit', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype24.limit_chat_exit', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3011,
-  serialized_end=3169,
-)
-
-
-_LIMITCHATENTER = _descriptor.Descriptor(
-  name='LimitChatEnter',
-  full_name='im.msg.service.comm_elem.LimitChatEnter',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='tips_wording', full_name='im.msg.service.comm_elem.LimitChatEnter.tips_wording', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='left_chat_time', full_name='im.msg.service.comm_elem.LimitChatEnter.left_chat_time', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='match_ts', full_name='im.msg.service.comm_elem.LimitChatEnter.match_ts', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='match_expired_time', full_name='im.msg.service.comm_elem.LimitChatEnter.match_expired_time', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2_c_expired_time', full_name='im.msg.service.comm_elem.LimitChatEnter.c2_c_expired_time', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ready_ts', full_name='im.msg.service.comm_elem.LimitChatEnter.ready_ts', index=5,
-      number=6, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='match_nick', full_name='im.msg.service.comm_elem.LimitChatEnter.match_nick', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3172,
-  serialized_end=3345,
-)
-
-
-_LIMITCHATEXIT = _descriptor.Descriptor(
-  name='LimitChatExit',
-  full_name='im.msg.service.comm_elem.LimitChatExit',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='exit_method', full_name='im.msg.service.comm_elem.LimitChatExit.exit_method', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='match_ts', full_name='im.msg.service.comm_elem.LimitChatExit.match_ts', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3347,
-  serialized_end=3401,
-)
-
-
-_MSGELEMINFO_SERVTYPE27 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype27',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype27',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='video_file', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype27.video_file', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3403,
-  serialized_end=3475,
-)
-
-
-_MSGELEMINFO_SERVTYPE29 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype29',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype29',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='luckybag_msg', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype29.luckybag_msg', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3477,
-  serialized_end=3523,
-)
-
-
-_MSGELEMINFO_SERVTYPE3 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype3',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype3',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='flash_troop_pic', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype3.flash_troop_pic', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flash_c2_c_pic', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype3.flash_c2_c_pic', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3526,
-  serialized_end=3660,
-)
-
-
-_MSGELEMINFO_SERVTYPE31 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype31',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype31',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='text', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype31.text', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ext', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype31.ext', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3662,
-  serialized_end=3713,
-)
-
-
-_MSGELEMINFO_SERVTYPE33 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype33',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype33',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='index', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype33.index', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='text', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype33.text', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='compat', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype33.compat', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='buf', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype33.buf', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3715,
-  serialized_end=3797,
-)
-
-
-_MSGELEMINFO_SERVTYPE34 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype34',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype34',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='from_nickname', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype34.from_nickname', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='push_window_flag', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype34.push_window_flag', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='game_session', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype34.game_session', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ext', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype34.ext', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3800,
-  serialized_end=3947,
-)
-
-
-_GAMESESSION = _descriptor.Descriptor(
-  name='GameSession',
-  full_name='im.msg.service.comm_elem.GameSession',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='from_role_id', full_name='im.msg.service.comm_elem.GameSession.from_role_id', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_open_id', full_name='im.msg.service.comm_elem.GameSession.from_open_id', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_role_id', full_name='im.msg.service.comm_elem.GameSession.to_role_id', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_open_id', full_name='im.msg.service.comm_elem.GameSession.to_open_id', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='game_appid', full_name='im.msg.service.comm_elem.GameSession.game_appid', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_tiny_id', full_name='im.msg.service.comm_elem.GameSession.from_tiny_id', index=5,
-      number=6, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_tiny_id', full_name='im.msg.service.comm_elem.GameSession.to_tiny_id', index=6,
-      number=7, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3950,
-  serialized_end=4109,
-)
-
-
-_MSGELEMINFO_SERVTYPE35 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype35',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype35',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='token', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype35.token', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='global_padid', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype35.global_padid', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='get_rev', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype35.get_rev', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='his_edit_uin_num', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype35.his_edit_uin_num', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4111,
-  serialized_end=4215,
-)
-
-
-_MSGELEMINFO_SERVTYPE4 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype4',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype4',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='imsg_type', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype4.imsg_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='st_story_aio_obj_msg', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype4.st_story_aio_obj_msg', index=1,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4217,
-  serialized_end=4331,
-)
-
-
-_MSGELEMINFO_SERVTYPE5 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype5',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype5',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='vid', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype5.vid', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cover', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype5.cover', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='title', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype5.title', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='summary', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype5.summary', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='create_time', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype5.create_time', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='comment_content', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype5.comment_content', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='author', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype5.author', index=6,
-      number=7, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4334,
-  serialized_end=4479,
-)
-
-
-_MSGELEMINFO_SERVTYPE8 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype8',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype8',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='wifi_deliver_gift_msg', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype8.wifi_deliver_gift_msg', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4481,
-  serialized_end=4568,
-)
-
-
-_MSGELEMINFO_SERVTYPE9 = _descriptor.Descriptor(
-  name='MsgElemInfo_servtype9',
-  full_name='im.msg.service.comm_elem.MsgElemInfo_servtype9',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='anchor_status', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype9.anchor_status', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='jump_schema', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype9.jump_schema', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='anchor_nickname', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype9.anchor_nickname', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='anchor_head_url', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype9.anchor_head_url', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='live_title', full_name='im.msg.service.comm_elem.MsgElemInfo_servtype9.live_title', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4571,
-  serialized_end=4708,
-)
-
-
-_STORYAIOOBJMSG = _descriptor.Descriptor(
-  name='StoryAioObjMsg',
-  full_name='im.msg.service.comm_elem.StoryAioObjMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='ui_url', full_name='im.msg.service.comm_elem.StoryAioObjMsg.ui_url', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='jmp_url', full_name='im.msg.service.comm_elem.StoryAioObjMsg.jmp_url', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4710,
-  serialized_end=4759,
-)
-
-_MSGELEMINFO_SERVTYPE21.fields_by_name['c2_c_confess_ctx'].message_type = _C2CCONFESSCONTEXT
-_MSGELEMINFO_SERVTYPE21.fields_by_name['group_confess_msg'].message_type = _GROUPCONFESSMSG
-_MSGELEMINFO_SERVTYPE21.fields_by_name['group_confess_ctx'].message_type = _GROUPCONFESSCONTEXT
-_GROUPCONFESSMSG.fields_by_name['confess_items'].message_type = _GROUPCONFESSITEM
-_MSGELEMINFO_SERVTYPE23.fields_by_name['yellow_face'].message_type = _MSGELEMINFO_SERVTYPE33
-_MSGELEMINFO_SERVTYPE24.fields_by_name['limit_chat_enter'].message_type = _LIMITCHATENTER
-_MSGELEMINFO_SERVTYPE24.fields_by_name['limit_chat_exit'].message_type = _LIMITCHATEXIT
-_MSGELEMINFO_SERVTYPE27.fields_by_name['video_file'].message_type = cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2._VIDEOFILE
-_MSGELEMINFO_SERVTYPE3.fields_by_name['flash_troop_pic'].message_type = cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2._CUSTOMFACE
-_MSGELEMINFO_SERVTYPE3.fields_by_name['flash_c2_c_pic'].message_type = cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2._NOTONLINEIMAGE
-_MSGELEMINFO_SERVTYPE34.fields_by_name['game_session'].message_type = _GAMESESSION
-_MSGELEMINFO_SERVTYPE4.fields_by_name['st_story_aio_obj_msg'].message_type = _STORYAIOOBJMSG
-_MSGELEMINFO_SERVTYPE8.fields_by_name['wifi_deliver_gift_msg'].message_type = cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2._DELIVERGIFTMSG
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype1'] = _MSGELEMINFO_SERVTYPE1
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype11'] = _MSGELEMINFO_SERVTYPE11
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype13'] = _MSGELEMINFO_SERVTYPE13
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype14'] = _MSGELEMINFO_SERVTYPE14
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype15'] = _MSGELEMINFO_SERVTYPE15
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype16'] = _MSGELEMINFO_SERVTYPE16
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype18'] = _MSGELEMINFO_SERVTYPE18
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype19'] = _MSGELEMINFO_SERVTYPE19
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype2'] = _MSGELEMINFO_SERVTYPE2
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype20'] = _MSGELEMINFO_SERVTYPE20
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype21'] = _MSGELEMINFO_SERVTYPE21
-DESCRIPTOR.message_types_by_name['C2CConfessContext'] = _C2CCONFESSCONTEXT
-DESCRIPTOR.message_types_by_name['GroupConfessContext'] = _GROUPCONFESSCONTEXT
-DESCRIPTOR.message_types_by_name['GroupConfessItem'] = _GROUPCONFESSITEM
-DESCRIPTOR.message_types_by_name['GroupConfessMsg'] = _GROUPCONFESSMSG
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype23'] = _MSGELEMINFO_SERVTYPE23
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype24'] = _MSGELEMINFO_SERVTYPE24
-DESCRIPTOR.message_types_by_name['LimitChatEnter'] = _LIMITCHATENTER
-DESCRIPTOR.message_types_by_name['LimitChatExit'] = _LIMITCHATEXIT
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype27'] = _MSGELEMINFO_SERVTYPE27
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype29'] = _MSGELEMINFO_SERVTYPE29
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype3'] = _MSGELEMINFO_SERVTYPE3
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype31'] = _MSGELEMINFO_SERVTYPE31
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype33'] = _MSGELEMINFO_SERVTYPE33
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype34'] = _MSGELEMINFO_SERVTYPE34
-DESCRIPTOR.message_types_by_name['GameSession'] = _GAMESESSION
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype35'] = _MSGELEMINFO_SERVTYPE35
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype4'] = _MSGELEMINFO_SERVTYPE4
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype5'] = _MSGELEMINFO_SERVTYPE5
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype8'] = _MSGELEMINFO_SERVTYPE8
-DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype9'] = _MSGELEMINFO_SERVTYPE9
-DESCRIPTOR.message_types_by_name['StoryAioObjMsg'] = _STORYAIOOBJMSG
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/cai/pb/im/msg/service/comm_elem/comm_elem.proto\x12\x18im.msg.service.comm_elem\x1a%cai/pb/im/msg/msg_body/msg_body.proto\"\xfa\x01\n\x15MsgElemInfo_servtype1\x12\x11\n\treward_id\x18\x01 \x01(\x0c\x12\x12\n\nsender_uin\x18\x02 \x01(\x04\x12\x10\n\x08pic_type\x18\x03 \x01(\r\x12\x14\n\x0creward_money\x18\x04 \x01(\r\x12\x0b\n\x03url\x18\x05 \x01(\x0c\x12\x0f\n\x07\x63ontent\x18\x06 \x01(\x0c\x12\x18\n\x10\x63reate_timestamp\x18\x07 \x01(\r\x12\x0e\n\x06status\x18\x08 \x01(\r\x12\x0c\n\x04size\x18\t \x01(\r\x12\x16\n\x0evideo_duration\x18\n \x01(\r\x12\x0b\n\x03seq\x18\x0b \x01(\x04\x12\x17\n\x0freward_type_ext\x18\x0c \x01(\r\"\xc2\x01\n\x16MsgElemInfo_servtype11\x12\x0e\n\x06res_id\x18\x01 \x01(\x0c\x12\x0f\n\x07res_md5\x18\x02 \x01(\x0c\x12\x15\n\rreserve_info1\x18\x03 \x01(\x0c\x12\x15\n\rreserve_info2\x18\x04 \x01(\x0c\x12\x1a\n\x12\x64oodle_data_offset\x18\x05 \x01(\r\x12\x15\n\rdoodle_gif_id\x18\x06 \x01(\r\x12\x12\n\ndoodle_url\x18\x07 \x01(\x0c\x12\x12\n\ndoodle_md5\x18\x08 \x01(\x0c\"@\n\x16MsgElemInfo_servtype13\x12\x13\n\x0bsys_head_id\x18\x01 \x01(\r\x12\x11\n\thead_flag\x18\x02 \x01(\r\":\n\x16MsgElemInfo_servtype14\x12\n\n\x02id\x18\x01 \x01(\r\x12\x14\n\x0creserve_info\x18\x02 \x01(\x0c\"\xa7\x01\n\x16MsgElemInfo_servtype15\x12\x0b\n\x03vid\x18\x01 \x01(\x0c\x12\r\n\x05\x63over\x18\x02 \x01(\x0c\x12\r\n\x05title\x18\x03 \x01(\x0c\x12\x0f\n\x07summary\x18\x04 \x01(\x0c\x12\x13\n\x0b\x63reate_time\x18\x05 \x01(\x04\x12\x17\n\x0f\x63omment_content\x18\x06 \x01(\x0c\x12\x0e\n\x06\x61uthor\x18\x07 \x01(\x04\x12\x13\n\x0b\x63tr_version\x18\x08 \x01(\r\"\x8a\x02\n\x16MsgElemInfo_servtype16\x12\x0b\n\x03uid\x18\x01 \x01(\x04\x12\x10\n\x08union_id\x18\x02 \x01(\x0c\x12\x10\n\x08story_id\x18\x03 \x01(\x0c\x12\x0b\n\x03md5\x18\x04 \x01(\x0c\x12\x11\n\tthumb_url\x18\x05 \x01(\x0c\x12\x12\n\ndoodle_url\x18\x06 \x01(\x0c\x12\x13\n\x0bvideo_width\x18\x07 \x01(\r\x12\x14\n\x0cvideo_height\x18\x08 \x01(\r\x12\x13\n\x0bsource_name\x18\t \x01(\x0c\x12\x1a\n\x12source_action_type\x18\n \x01(\x0c\x12\x1a\n\x12source_action_data\x18\x0b \x01(\x0c\x12\x13\n\x0b\x63tr_version\x18\x0c \x01(\r\"x\n\x16MsgElemInfo_servtype18\x12\x16\n\x0e\x63urrent_amount\x18\x01 \x01(\x04\x12\x14\n\x0ctotal_amount\x18\x02 \x01(\x04\x12\x0e\n\x06listid\x18\x03 \x01(\x0c\x12\x10\n\x08\x61uth_key\x18\x04 \x01(\x0c\x12\x0e\n\x06number\x18\x05 \x01(\r\"&\n\x16MsgElemInfo_servtype19\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\xed\x01\n\x15MsgElemInfo_servtype2\x12\x11\n\tpoke_type\x18\x01 \x01(\r\x12\x14\n\x0cpoke_summary\x18\x02 \x01(\x0c\x12\x12\n\ndouble_hit\x18\x03 \x01(\r\x12\x12\n\nvaspoke_id\x18\x04 \x01(\r\x12\x14\n\x0cvaspoke_name\x18\x05 \x01(\x0c\x12\x16\n\x0evaspoke_minver\x18\x06 \x01(\x0c\x12\x15\n\rpoke_strength\x18\x07 \x01(\r\x12\x10\n\x08msg_type\x18\x08 \x01(\r\x12\x19\n\x11\x66\x61\x63\x65_bubble_count\x18\t \x01(\r\x12\x11\n\tpoke_flag\x18\n \x01(\r\"&\n\x16MsgElemInfo_servtype20\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"\x81\x03\n\x16MsgElemInfo_servtype21\x12\x10\n\x08topic_id\x18\x01 \x01(\r\x12\x15\n\rconfessor_uin\x18\x02 \x01(\x04\x12\x16\n\x0e\x63onfessor_nick\x18\x03 \x01(\x0c\x12\x15\n\rconfessor_sex\x18\x04 \x01(\r\x12\x13\n\x0bsysmsg_flag\x18\x05 \x01(\r\x12\x45\n\x10\x63\x32_c_confess_ctx\x18\x06 \x01(\x0b\x32+.im.msg.service.comm_elem.C2CConfessContext\x12\r\n\x05topic\x18\x07 \x01(\x0c\x12\x14\n\x0c\x63onfess_time\x18\x08 \x01(\x04\x12\x44\n\x11group_confess_msg\x18\t \x01(\x0b\x32).im.msg.service.comm_elem.GroupConfessMsg\x12H\n\x11group_confess_ctx\x18\n \x01(\x0b\x32-.im.msg.service.comm_elem.GroupConfessContext\"\x8c\x02\n\x11\x43\x32\x43\x43onfessContext\x12\x15\n\rconfessor_uin\x18\x01 \x01(\x04\x12\x16\n\x0e\x63onfess_to_uin\x18\x02 \x01(\x04\x12\x10\n\x08send_uin\x18\x03 \x01(\x04\x12\x16\n\x0e\x63onfessor_nick\x18\x04 \x01(\x0c\x12\x0f\n\x07\x63onfess\x18\x05 \x01(\x0c\x12\x0f\n\x07\x62g_type\x18\x06 \x01(\r\x12\x10\n\x08topic_id\x18\x07 \x01(\r\x12\x14\n\x0c\x63onfess_time\x18\x08 \x01(\x04\x12\x15\n\rconfessor_sex\x18\t \x01(\r\x12\x10\n\x08\x62iz_type\x18\n \x01(\r\x12\x13\n\x0b\x63onfess_num\x18\x0b \x01(\r\x12\x16\n\x0e\x63onfess_to_sex\x18\x0c \x01(\r\"\xf3\x01\n\x13GroupConfessContext\x12\x15\n\rconfessor_uin\x18\x01 \x01(\x04\x12\x16\n\x0e\x63onfess_to_uin\x18\x02 \x01(\x04\x12\x10\n\x08send_uin\x18\x03 \x01(\x04\x12\x15\n\rconfessor_sex\x18\x04 \x01(\r\x12\x17\n\x0f\x63onfess_to_nick\x18\x05 \x01(\x0c\x12\r\n\x05topic\x18\x06 \x01(\x0c\x12\x10\n\x08topic_id\x18\x07 \x01(\r\x12\x14\n\x0c\x63onfess_time\x18\x08 \x01(\x04\x12\x1c\n\x14\x63onfess_to_nick_type\x18\t \x01(\r\x12\x16\n\x0e\x63onfessor_nick\x18\n \x01(\x0c\"\x82\x01\n\x10GroupConfessItem\x12\x10\n\x08topic_id\x18\x01 \x01(\r\x12\x16\n\x0e\x63onfess_to_uin\x18\x02 \x01(\x04\x12\x17\n\x0f\x63onfess_to_nick\x18\x03 \x01(\x0c\x12\r\n\x05topic\x18\x04 \x01(\x0c\x12\x1c\n\x14\x63onfess_to_nick_type\x18\x05 \x01(\r\"\xc8\x01\n\x0fGroupConfessMsg\x12\x14\n\x0c\x63onfess_time\x18\x01 \x01(\x04\x12\x15\n\rconfessor_uin\x18\x02 \x01(\x04\x12\x15\n\rconfessor_sex\x18\x03 \x01(\r\x12\x13\n\x0bsysmsg_flag\x18\x04 \x01(\r\x12\x41\n\rconfess_items\x18\x05 \x03(\x0b\x32*.im.msg.service.comm_elem.GroupConfessItem\x12\x19\n\x11total_topic_count\x18\x06 \x01(\r\"\xc1\x01\n\x16MsgElemInfo_servtype23\x12\x11\n\tface_type\x18\x01 \x01(\r\x12\x19\n\x11\x66\x61\x63\x65_bubble_count\x18\x02 \x01(\r\x12\x14\n\x0c\x66\x61\x63\x65_summary\x18\x03 \x01(\x0c\x12\x0c\n\x04\x66lag\x18\x04 \x01(\r\x12\x0e\n\x06others\x18\x05 \x01(\x0c\x12\x45\n\x0byellow_face\x18\x06 \x01(\x0b\x32\x30.im.msg.service.comm_elem.MsgElemInfo_servtype33\"\x9e\x01\n\x16MsgElemInfo_servtype24\x12\x42\n\x10limit_chat_enter\x18\x01 \x01(\x0b\x32(.im.msg.service.comm_elem.LimitChatEnter\x12@\n\x0flimit_chat_exit\x18\x02 \x01(\x0b\x32\'.im.msg.service.comm_elem.LimitChatExit\"\xad\x01\n\x0eLimitChatEnter\x12\x14\n\x0ctips_wording\x18\x01 \x01(\x0c\x12\x16\n\x0eleft_chat_time\x18\x02 \x01(\r\x12\x10\n\x08match_ts\x18\x03 \x01(\x04\x12\x1a\n\x12match_expired_time\x18\x04 \x01(\r\x12\x19\n\x11\x63\x32_c_expired_time\x18\x05 \x01(\r\x12\x10\n\x08ready_ts\x18\x06 \x01(\x04\x12\x12\n\nmatch_nick\x18\x07 \x01(\x0c\"6\n\rLimitChatExit\x12\x13\n\x0b\x65xit_method\x18\x01 \x01(\r\x12\x10\n\x08match_ts\x18\x02 \x01(\x04\"H\n\x16MsgElemInfo_servtype27\x12.\n\nvideo_file\x18\x01 \x01(\x0b\x32\x1a.im.msg.msg_body.VideoFile\".\n\x16MsgElemInfo_servtype29\x12\x14\n\x0cluckybag_msg\x18\x01 \x01(\x0c\"\x86\x01\n\x15MsgElemInfo_servtype3\x12\x34\n\x0f\x66lash_troop_pic\x18\x01 \x01(\x0b\x32\x1b.im.msg.msg_body.CustomFace\x12\x37\n\x0e\x66lash_c2_c_pic\x18\x02 \x01(\x0b\x32\x1f.im.msg.msg_body.NotOnlineImage\"3\n\x16MsgElemInfo_servtype31\x12\x0c\n\x04text\x18\x01 \x01(\x0c\x12\x0b\n\x03\x65xt\x18\x02 \x01(\x0c\"R\n\x16MsgElemInfo_servtype33\x12\r\n\x05index\x18\x01 \x01(\r\x12\x0c\n\x04text\x18\x02 \x01(\x0c\x12\x0e\n\x06\x63ompat\x18\x03 \x01(\x0c\x12\x0b\n\x03\x62uf\x18\x04 \x01(\x0c\"\x93\x01\n\x16MsgElemInfo_servtype34\x12\x15\n\rfrom_nickname\x18\x01 \x01(\x0c\x12\x18\n\x10push_window_flag\x18\x02 \x01(\r\x12;\n\x0cgame_session\x18\x03 \x01(\x0b\x32%.im.msg.service.comm_elem.GameSession\x12\x0b\n\x03\x65xt\x18\x04 \x01(\x0c\"\x9f\x01\n\x0bGameSession\x12\x14\n\x0c\x66rom_role_id\x18\x01 \x01(\x0c\x12\x14\n\x0c\x66rom_open_id\x18\x02 \x01(\x0c\x12\x12\n\nto_role_id\x18\x03 \x01(\x0c\x12\x12\n\nto_open_id\x18\x04 \x01(\x0c\x12\x12\n\ngame_appid\x18\x05 \x01(\x04\x12\x14\n\x0c\x66rom_tiny_id\x18\x06 \x01(\x04\x12\x12\n\nto_tiny_id\x18\x07 \x01(\x04\"h\n\x16MsgElemInfo_servtype35\x12\r\n\x05token\x18\x01 \x01(\x0c\x12\x14\n\x0cglobal_padid\x18\x02 \x01(\x0c\x12\x0f\n\x07get_rev\x18\x03 \x01(\r\x12\x18\n\x10his_edit_uin_num\x18\x04 \x01(\r\"r\n\x15MsgElemInfo_servtype4\x12\x11\n\timsg_type\x18\x01 \x01(\r\x12\x46\n\x14st_story_aio_obj_msg\x18\x04 \x01(\x0b\x32(.im.msg.service.comm_elem.StoryAioObjMsg\"\x91\x01\n\x15MsgElemInfo_servtype5\x12\x0b\n\x03vid\x18\x01 \x01(\x0c\x12\r\n\x05\x63over\x18\x02 \x01(\x0c\x12\r\n\x05title\x18\x03 \x01(\x0c\x12\x0f\n\x07summary\x18\x04 \x01(\x0c\x12\x13\n\x0b\x63reate_time\x18\x05 \x01(\x04\x12\x17\n\x0f\x63omment_content\x18\x06 \x01(\x0c\x12\x0e\n\x06\x61uthor\x18\x07 \x01(\x04\"W\n\x15MsgElemInfo_servtype8\x12>\n\x15wifi_deliver_gift_msg\x18\x01 \x01(\x0b\x32\x1f.im.msg.msg_body.DeliverGiftMsg\"\x89\x01\n\x15MsgElemInfo_servtype9\x12\x15\n\ranchor_status\x18\x01 \x01(\r\x12\x13\n\x0bjump_schema\x18\x02 \x01(\x0c\x12\x17\n\x0f\x61nchor_nickname\x18\x03 \x01(\t\x12\x17\n\x0f\x61nchor_head_url\x18\x04 \x01(\x0c\x12\x12\n\nlive_title\x18\x05 \x01(\t\"1\n\x0eStoryAioObjMsg\x12\x0e\n\x06ui_url\x18\x01 \x01(\t\x12\x0f\n\x07jmp_url\x18\x02 \x01(\t')
+
+
+
+_MSGELEMINFO_SERVTYPE1 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype1']
+_MSGELEMINFO_SERVTYPE11 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype11']
+_MSGELEMINFO_SERVTYPE13 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype13']
+_MSGELEMINFO_SERVTYPE14 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype14']
+_MSGELEMINFO_SERVTYPE15 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype15']
+_MSGELEMINFO_SERVTYPE16 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype16']
+_MSGELEMINFO_SERVTYPE18 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype18']
+_MSGELEMINFO_SERVTYPE19 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype19']
+_MSGELEMINFO_SERVTYPE2 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype2']
+_MSGELEMINFO_SERVTYPE20 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype20']
+_MSGELEMINFO_SERVTYPE21 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype21']
+_C2CCONFESSCONTEXT = DESCRIPTOR.message_types_by_name['C2CConfessContext']
+_GROUPCONFESSCONTEXT = DESCRIPTOR.message_types_by_name['GroupConfessContext']
+_GROUPCONFESSITEM = DESCRIPTOR.message_types_by_name['GroupConfessItem']
+_GROUPCONFESSMSG = DESCRIPTOR.message_types_by_name['GroupConfessMsg']
+_MSGELEMINFO_SERVTYPE23 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype23']
+_MSGELEMINFO_SERVTYPE24 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype24']
+_LIMITCHATENTER = DESCRIPTOR.message_types_by_name['LimitChatEnter']
+_LIMITCHATEXIT = DESCRIPTOR.message_types_by_name['LimitChatExit']
+_MSGELEMINFO_SERVTYPE27 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype27']
+_MSGELEMINFO_SERVTYPE29 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype29']
+_MSGELEMINFO_SERVTYPE3 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype3']
+_MSGELEMINFO_SERVTYPE31 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype31']
+_MSGELEMINFO_SERVTYPE33 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype33']
+_MSGELEMINFO_SERVTYPE34 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype34']
+_GAMESESSION = DESCRIPTOR.message_types_by_name['GameSession']
+_MSGELEMINFO_SERVTYPE35 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype35']
+_MSGELEMINFO_SERVTYPE4 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype4']
+_MSGELEMINFO_SERVTYPE5 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype5']
+_MSGELEMINFO_SERVTYPE8 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype8']
+_MSGELEMINFO_SERVTYPE9 = DESCRIPTOR.message_types_by_name['MsgElemInfo_servtype9']
+_STORYAIOOBJMSG = DESCRIPTOR.message_types_by_name['StoryAioObjMsg']
 MsgElemInfo_servtype1 = _reflection.GeneratedProtocolMessageType('MsgElemInfo_servtype1', (_message.Message,), {
   'DESCRIPTOR' : _MSGELEMINFO_SERVTYPE1,
   '__module__' : 'cai.pb.im.msg.service.comm_elem.comm_elem_pb2'
@@ -2238,5 +275,71 @@
   })
 _sym_db.RegisterMessage(StoryAioObjMsg)
 
-
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _MSGELEMINFO_SERVTYPE1._serialized_start=117
+  _MSGELEMINFO_SERVTYPE1._serialized_end=367
+  _MSGELEMINFO_SERVTYPE11._serialized_start=370
+  _MSGELEMINFO_SERVTYPE11._serialized_end=564
+  _MSGELEMINFO_SERVTYPE13._serialized_start=566
+  _MSGELEMINFO_SERVTYPE13._serialized_end=630
+  _MSGELEMINFO_SERVTYPE14._serialized_start=632
+  _MSGELEMINFO_SERVTYPE14._serialized_end=690
+  _MSGELEMINFO_SERVTYPE15._serialized_start=693
+  _MSGELEMINFO_SERVTYPE15._serialized_end=860
+  _MSGELEMINFO_SERVTYPE16._serialized_start=863
+  _MSGELEMINFO_SERVTYPE16._serialized_end=1129
+  _MSGELEMINFO_SERVTYPE18._serialized_start=1131
+  _MSGELEMINFO_SERVTYPE18._serialized_end=1251
+  _MSGELEMINFO_SERVTYPE19._serialized_start=1253
+  _MSGELEMINFO_SERVTYPE19._serialized_end=1291
+  _MSGELEMINFO_SERVTYPE2._serialized_start=1294
+  _MSGELEMINFO_SERVTYPE2._serialized_end=1531
+  _MSGELEMINFO_SERVTYPE20._serialized_start=1533
+  _MSGELEMINFO_SERVTYPE20._serialized_end=1571
+  _MSGELEMINFO_SERVTYPE21._serialized_start=1574
+  _MSGELEMINFO_SERVTYPE21._serialized_end=1959
+  _C2CCONFESSCONTEXT._serialized_start=1962
+  _C2CCONFESSCONTEXT._serialized_end=2230
+  _GROUPCONFESSCONTEXT._serialized_start=2233
+  _GROUPCONFESSCONTEXT._serialized_end=2476
+  _GROUPCONFESSITEM._serialized_start=2479
+  _GROUPCONFESSITEM._serialized_end=2609
+  _GROUPCONFESSMSG._serialized_start=2612
+  _GROUPCONFESSMSG._serialized_end=2812
+  _MSGELEMINFO_SERVTYPE23._serialized_start=2815
+  _MSGELEMINFO_SERVTYPE23._serialized_end=3008
+  _MSGELEMINFO_SERVTYPE24._serialized_start=3011
+  _MSGELEMINFO_SERVTYPE24._serialized_end=3169
+  _LIMITCHATENTER._serialized_start=3172
+  _LIMITCHATENTER._serialized_end=3345
+  _LIMITCHATEXIT._serialized_start=3347
+  _LIMITCHATEXIT._serialized_end=3401
+  _MSGELEMINFO_SERVTYPE27._serialized_start=3403
+  _MSGELEMINFO_SERVTYPE27._serialized_end=3475
+  _MSGELEMINFO_SERVTYPE29._serialized_start=3477
+  _MSGELEMINFO_SERVTYPE29._serialized_end=3523
+  _MSGELEMINFO_SERVTYPE3._serialized_start=3526
+  _MSGELEMINFO_SERVTYPE3._serialized_end=3660
+  _MSGELEMINFO_SERVTYPE31._serialized_start=3662
+  _MSGELEMINFO_SERVTYPE31._serialized_end=3713
+  _MSGELEMINFO_SERVTYPE33._serialized_start=3715
+  _MSGELEMINFO_SERVTYPE33._serialized_end=3797
+  _MSGELEMINFO_SERVTYPE34._serialized_start=3800
+  _MSGELEMINFO_SERVTYPE34._serialized_end=3947
+  _GAMESESSION._serialized_start=3950
+  _GAMESESSION._serialized_end=4109
+  _MSGELEMINFO_SERVTYPE35._serialized_start=4111
+  _MSGELEMINFO_SERVTYPE35._serialized_end=4215
+  _MSGELEMINFO_SERVTYPE4._serialized_start=4217
+  _MSGELEMINFO_SERVTYPE4._serialized_end=4331
+  _MSGELEMINFO_SERVTYPE5._serialized_start=4334
+  _MSGELEMINFO_SERVTYPE5._serialized_end=4479
+  _MSGELEMINFO_SERVTYPE8._serialized_start=4481
+  _MSGELEMINFO_SERVTYPE8._serialized_end=4568
+  _MSGELEMINFO_SERVTYPE9._serialized_start=4571
+  _MSGELEMINFO_SERVTYPE9._serialized_end=4708
+  _STORYAIOOBJMSG._serialized_start=4710
+  _STORYAIOOBJMSG._serialized_end=4759
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/msg/service/comm_elem/comm_elem_pb2.pyi b/cai/pb/im/msg/service/comm_elem/comm_elem_pb2.pyi
index 2c4f00ae..62fe8f33 100644
--- a/cai/pb/im/msg/service/comm_elem/comm_elem_pb2.pyi
+++ b/cai/pb/im/msg/service/comm_elem/comm_elem_pb2.pyi
@@ -39,10 +39,10 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class MsgElemInfo_servtype1(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     REWARD_ID_FIELD_NUMBER: int
     SENDER_UIN_FIELD_NUMBER: int
     PIC_TYPE_FIELD_NUMBER: int
@@ -55,39 +55,38 @@ class MsgElemInfo_servtype1(Message):
     VIDEO_DURATION_FIELD_NUMBER: int
     SEQ_FIELD_NUMBER: int
     REWARD_TYPE_EXT_FIELD_NUMBER: int
-    reward_id: bytes = ...
-    sender_uin: int = ...
-    pic_type: int = ...
-    reward_money: int = ...
-    url: bytes = ...
-    content: bytes = ...
-    create_timestamp: int = ...
-    status: int = ...
-    size: int = ...
-    video_duration: int = ...
-    seq: int = ...
-    reward_type_ext: int = ...
-
-    def __init__(self,
-        *,
-        reward_id : Optional[bytes] = ...,
-        sender_uin : Optional[int] = ...,
-        pic_type : Optional[int] = ...,
-        reward_money : Optional[int] = ...,
-        url : Optional[bytes] = ...,
-        content : Optional[bytes] = ...,
-        create_timestamp : Optional[int] = ...,
-        status : Optional[int] = ...,
-        size : Optional[int] = ...,
-        video_duration : Optional[int] = ...,
-        seq : Optional[int] = ...,
-        reward_type_ext : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"content",b"content",u"create_timestamp",b"create_timestamp",u"pic_type",b"pic_type",u"reward_id",b"reward_id",u"reward_money",b"reward_money",u"reward_type_ext",b"reward_type_ext",u"sender_uin",b"sender_uin",u"seq",b"seq",u"size",b"size",u"status",b"status",u"url",b"url",u"video_duration",b"video_duration"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"content",b"content",u"create_timestamp",b"create_timestamp",u"pic_type",b"pic_type",u"reward_id",b"reward_id",u"reward_money",b"reward_money",u"reward_type_ext",b"reward_type_ext",u"sender_uin",b"sender_uin",u"seq",b"seq",u"size",b"size",u"status",b"status",u"url",b"url",u"video_duration",b"video_duration"]) -> None: ...
+    reward_id: bytes
+    sender_uin: int
+    pic_type: int
+    reward_money: int
+    url: bytes
+    content: bytes
+    create_timestamp: int
+    status: int
+    size: int
+    video_duration: int
+    seq: int
+    reward_type_ext: int
+    def __init__(self,
+        *,
+        reward_id: Optional[bytes] = ...,
+        sender_uin: Optional[int] = ...,
+        pic_type: Optional[int] = ...,
+        reward_money: Optional[int] = ...,
+        url: Optional[bytes] = ...,
+        content: Optional[bytes] = ...,
+        create_timestamp: Optional[int] = ...,
+        status: Optional[int] = ...,
+        size: Optional[int] = ...,
+        video_duration: Optional[int] = ...,
+        seq: Optional[int] = ...,
+        reward_type_ext: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["content",b"content","create_timestamp",b"create_timestamp","pic_type",b"pic_type","reward_id",b"reward_id","reward_money",b"reward_money","reward_type_ext",b"reward_type_ext","sender_uin",b"sender_uin","seq",b"seq","size",b"size","status",b"status","url",b"url","video_duration",b"video_duration"]) -> bool: ...
+    def ClearField(self, field_name: Literal["content",b"content","create_timestamp",b"create_timestamp","pic_type",b"pic_type","reward_id",b"reward_id","reward_money",b"reward_money","reward_type_ext",b"reward_type_ext","sender_uin",b"sender_uin","seq",b"seq","size",b"size","status",b"status","url",b"url","video_duration",b"video_duration"]) -> None: ...
 
 class MsgElemInfo_servtype11(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RES_ID_FIELD_NUMBER: int
     RES_MD5_FIELD_NUMBER: int
     RESERVE_INFO1_FIELD_NUMBER: int
@@ -96,61 +95,58 @@ class MsgElemInfo_servtype11(Message):
     DOODLE_GIF_ID_FIELD_NUMBER: int
     DOODLE_URL_FIELD_NUMBER: int
     DOODLE_MD5_FIELD_NUMBER: int
-    res_id: bytes = ...
-    res_md5: bytes = ...
-    reserve_info1: bytes = ...
-    reserve_info2: bytes = ...
-    doodle_data_offset: int = ...
-    doodle_gif_id: int = ...
-    doodle_url: bytes = ...
-    doodle_md5: bytes = ...
-
-    def __init__(self,
-        *,
-        res_id : Optional[bytes] = ...,
-        res_md5 : Optional[bytes] = ...,
-        reserve_info1 : Optional[bytes] = ...,
-        reserve_info2 : Optional[bytes] = ...,
-        doodle_data_offset : Optional[int] = ...,
-        doodle_gif_id : Optional[int] = ...,
-        doodle_url : Optional[bytes] = ...,
-        doodle_md5 : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"doodle_data_offset",b"doodle_data_offset",u"doodle_gif_id",b"doodle_gif_id",u"doodle_md5",b"doodle_md5",u"doodle_url",b"doodle_url",u"res_id",b"res_id",u"res_md5",b"res_md5",u"reserve_info1",b"reserve_info1",u"reserve_info2",b"reserve_info2"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"doodle_data_offset",b"doodle_data_offset",u"doodle_gif_id",b"doodle_gif_id",u"doodle_md5",b"doodle_md5",u"doodle_url",b"doodle_url",u"res_id",b"res_id",u"res_md5",b"res_md5",u"reserve_info1",b"reserve_info1",u"reserve_info2",b"reserve_info2"]) -> None: ...
+    res_id: bytes
+    res_md5: bytes
+    reserve_info1: bytes
+    reserve_info2: bytes
+    doodle_data_offset: int
+    doodle_gif_id: int
+    doodle_url: bytes
+    doodle_md5: bytes
+    def __init__(self,
+        *,
+        res_id: Optional[bytes] = ...,
+        res_md5: Optional[bytes] = ...,
+        reserve_info1: Optional[bytes] = ...,
+        reserve_info2: Optional[bytes] = ...,
+        doodle_data_offset: Optional[int] = ...,
+        doodle_gif_id: Optional[int] = ...,
+        doodle_url: Optional[bytes] = ...,
+        doodle_md5: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["doodle_data_offset",b"doodle_data_offset","doodle_gif_id",b"doodle_gif_id","doodle_md5",b"doodle_md5","doodle_url",b"doodle_url","res_id",b"res_id","res_md5",b"res_md5","reserve_info1",b"reserve_info1","reserve_info2",b"reserve_info2"]) -> bool: ...
+    def ClearField(self, field_name: Literal["doodle_data_offset",b"doodle_data_offset","doodle_gif_id",b"doodle_gif_id","doodle_md5",b"doodle_md5","doodle_url",b"doodle_url","res_id",b"res_id","res_md5",b"res_md5","reserve_info1",b"reserve_info1","reserve_info2",b"reserve_info2"]) -> None: ...
 
 class MsgElemInfo_servtype13(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SYS_HEAD_ID_FIELD_NUMBER: int
     HEAD_FLAG_FIELD_NUMBER: int
-    sys_head_id: int = ...
-    head_flag: int = ...
-
+    sys_head_id: int
+    head_flag: int
     def __init__(self,
         *,
-        sys_head_id : Optional[int] = ...,
-        head_flag : Optional[int] = ...,
+        sys_head_id: Optional[int] = ...,
+        head_flag: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"head_flag",b"head_flag",u"sys_head_id",b"sys_head_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"head_flag",b"head_flag",u"sys_head_id",b"sys_head_id"]) -> None: ...
+    def HasField(self, field_name: Literal["head_flag",b"head_flag","sys_head_id",b"sys_head_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["head_flag",b"head_flag","sys_head_id",b"sys_head_id"]) -> None: ...
 
 class MsgElemInfo_servtype14(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     ID_FIELD_NUMBER: int
     RESERVE_INFO_FIELD_NUMBER: int
-    id: int = ...
-    reserve_info: bytes = ...
-
+    id: int
+    reserve_info: bytes
     def __init__(self,
         *,
-        id : Optional[int] = ...,
-        reserve_info : Optional[bytes] = ...,
+        id: Optional[int] = ...,
+        reserve_info: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"id",b"id",u"reserve_info",b"reserve_info"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"id",b"id",u"reserve_info",b"reserve_info"]) -> None: ...
+    def HasField(self, field_name: Literal["id",b"id","reserve_info",b"reserve_info"]) -> bool: ...
+    def ClearField(self, field_name: Literal["id",b"id","reserve_info",b"reserve_info"]) -> None: ...
 
 class MsgElemInfo_servtype15(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     VID_FIELD_NUMBER: int
     COVER_FIELD_NUMBER: int
     TITLE_FIELD_NUMBER: int
@@ -159,31 +155,30 @@ class MsgElemInfo_servtype15(Message):
     COMMENT_CONTENT_FIELD_NUMBER: int
     AUTHOR_FIELD_NUMBER: int
     CTR_VERSION_FIELD_NUMBER: int
-    vid: bytes = ...
-    cover: bytes = ...
-    title: bytes = ...
-    summary: bytes = ...
-    create_time: int = ...
-    comment_content: bytes = ...
-    author: int = ...
-    ctr_version: int = ...
-
-    def __init__(self,
-        *,
-        vid : Optional[bytes] = ...,
-        cover : Optional[bytes] = ...,
-        title : Optional[bytes] = ...,
-        summary : Optional[bytes] = ...,
-        create_time : Optional[int] = ...,
-        comment_content : Optional[bytes] = ...,
-        author : Optional[int] = ...,
-        ctr_version : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"author",b"author",u"comment_content",b"comment_content",u"cover",b"cover",u"create_time",b"create_time",u"ctr_version",b"ctr_version",u"summary",b"summary",u"title",b"title",u"vid",b"vid"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"author",b"author",u"comment_content",b"comment_content",u"cover",b"cover",u"create_time",b"create_time",u"ctr_version",b"ctr_version",u"summary",b"summary",u"title",b"title",u"vid",b"vid"]) -> None: ...
+    vid: bytes
+    cover: bytes
+    title: bytes
+    summary: bytes
+    create_time: int
+    comment_content: bytes
+    author: int
+    ctr_version: int
+    def __init__(self,
+        *,
+        vid: Optional[bytes] = ...,
+        cover: Optional[bytes] = ...,
+        title: Optional[bytes] = ...,
+        summary: Optional[bytes] = ...,
+        create_time: Optional[int] = ...,
+        comment_content: Optional[bytes] = ...,
+        author: Optional[int] = ...,
+        ctr_version: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["author",b"author","comment_content",b"comment_content","cover",b"cover","create_time",b"create_time","ctr_version",b"ctr_version","summary",b"summary","title",b"title","vid",b"vid"]) -> bool: ...
+    def ClearField(self, field_name: Literal["author",b"author","comment_content",b"comment_content","cover",b"cover","create_time",b"create_time","ctr_version",b"ctr_version","summary",b"summary","title",b"title","vid",b"vid"]) -> None: ...
 
 class MsgElemInfo_servtype16(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     UID_FIELD_NUMBER: int
     UNION_ID_FIELD_NUMBER: int
     STORY_ID_FIELD_NUMBER: int
@@ -196,75 +191,72 @@ class MsgElemInfo_servtype16(Message):
     SOURCE_ACTION_TYPE_FIELD_NUMBER: int
     SOURCE_ACTION_DATA_FIELD_NUMBER: int
     CTR_VERSION_FIELD_NUMBER: int
-    uid: int = ...
-    union_id: bytes = ...
-    story_id: bytes = ...
-    md5: bytes = ...
-    thumb_url: bytes = ...
-    doodle_url: bytes = ...
-    video_width: int = ...
-    video_height: int = ...
-    source_name: bytes = ...
-    source_action_type: bytes = ...
-    source_action_data: bytes = ...
-    ctr_version: int = ...
-
-    def __init__(self,
-        *,
-        uid : Optional[int] = ...,
-        union_id : Optional[bytes] = ...,
-        story_id : Optional[bytes] = ...,
-        md5 : Optional[bytes] = ...,
-        thumb_url : Optional[bytes] = ...,
-        doodle_url : Optional[bytes] = ...,
-        video_width : Optional[int] = ...,
-        video_height : Optional[int] = ...,
-        source_name : Optional[bytes] = ...,
-        source_action_type : Optional[bytes] = ...,
-        source_action_data : Optional[bytes] = ...,
-        ctr_version : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"ctr_version",b"ctr_version",u"doodle_url",b"doodle_url",u"md5",b"md5",u"source_action_data",b"source_action_data",u"source_action_type",b"source_action_type",u"source_name",b"source_name",u"story_id",b"story_id",u"thumb_url",b"thumb_url",u"uid",b"uid",u"union_id",b"union_id",u"video_height",b"video_height",u"video_width",b"video_width"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"ctr_version",b"ctr_version",u"doodle_url",b"doodle_url",u"md5",b"md5",u"source_action_data",b"source_action_data",u"source_action_type",b"source_action_type",u"source_name",b"source_name",u"story_id",b"story_id",u"thumb_url",b"thumb_url",u"uid",b"uid",u"union_id",b"union_id",u"video_height",b"video_height",u"video_width",b"video_width"]) -> None: ...
+    uid: int
+    union_id: bytes
+    story_id: bytes
+    md5: bytes
+    thumb_url: bytes
+    doodle_url: bytes
+    video_width: int
+    video_height: int
+    source_name: bytes
+    source_action_type: bytes
+    source_action_data: bytes
+    ctr_version: int
+    def __init__(self,
+        *,
+        uid: Optional[int] = ...,
+        union_id: Optional[bytes] = ...,
+        story_id: Optional[bytes] = ...,
+        md5: Optional[bytes] = ...,
+        thumb_url: Optional[bytes] = ...,
+        doodle_url: Optional[bytes] = ...,
+        video_width: Optional[int] = ...,
+        video_height: Optional[int] = ...,
+        source_name: Optional[bytes] = ...,
+        source_action_type: Optional[bytes] = ...,
+        source_action_data: Optional[bytes] = ...,
+        ctr_version: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["ctr_version",b"ctr_version","doodle_url",b"doodle_url","md5",b"md5","source_action_data",b"source_action_data","source_action_type",b"source_action_type","source_name",b"source_name","story_id",b"story_id","thumb_url",b"thumb_url","uid",b"uid","union_id",b"union_id","video_height",b"video_height","video_width",b"video_width"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ctr_version",b"ctr_version","doodle_url",b"doodle_url","md5",b"md5","source_action_data",b"source_action_data","source_action_type",b"source_action_type","source_name",b"source_name","story_id",b"story_id","thumb_url",b"thumb_url","uid",b"uid","union_id",b"union_id","video_height",b"video_height","video_width",b"video_width"]) -> None: ...
 
 class MsgElemInfo_servtype18(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CURRENT_AMOUNT_FIELD_NUMBER: int
     TOTAL_AMOUNT_FIELD_NUMBER: int
     LISTID_FIELD_NUMBER: int
     AUTH_KEY_FIELD_NUMBER: int
     NUMBER_FIELD_NUMBER: int
-    current_amount: int = ...
-    total_amount: int = ...
-    listid: bytes = ...
-    auth_key: bytes = ...
-    number: int = ...
-
+    current_amount: int
+    total_amount: int
+    listid: bytes
+    auth_key: bytes
+    number: int
     def __init__(self,
         *,
-        current_amount : Optional[int] = ...,
-        total_amount : Optional[int] = ...,
-        listid : Optional[bytes] = ...,
-        auth_key : Optional[bytes] = ...,
-        number : Optional[int] = ...,
+        current_amount: Optional[int] = ...,
+        total_amount: Optional[int] = ...,
+        listid: Optional[bytes] = ...,
+        auth_key: Optional[bytes] = ...,
+        number: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"auth_key",b"auth_key",u"current_amount",b"current_amount",u"listid",b"listid",u"number",b"number",u"total_amount",b"total_amount"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"auth_key",b"auth_key",u"current_amount",b"current_amount",u"listid",b"listid",u"number",b"number",u"total_amount",b"total_amount"]) -> None: ...
+    def HasField(self, field_name: Literal["auth_key",b"auth_key","current_amount",b"current_amount","listid",b"listid","number",b"number","total_amount",b"total_amount"]) -> bool: ...
+    def ClearField(self, field_name: Literal["auth_key",b"auth_key","current_amount",b"current_amount","listid",b"listid","number",b"number","total_amount",b"total_amount"]) -> None: ...
 
 class MsgElemInfo_servtype19(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     DATA_FIELD_NUMBER: int
-    data: bytes = ...
-
+    data: bytes
     def __init__(self,
         *,
-        data : Optional[bytes] = ...,
+        data: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"data",b"data"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"data",b"data"]) -> None: ...
+    def HasField(self, field_name: Literal["data",b"data"]) -> bool: ...
+    def ClearField(self, field_name: Literal["data",b"data"]) -> None: ...
 
 class MsgElemInfo_servtype2(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     POKE_TYPE_FIELD_NUMBER: int
     POKE_SUMMARY_FIELD_NUMBER: int
     DOUBLE_HIT_FIELD_NUMBER: int
@@ -275,47 +267,45 @@ class MsgElemInfo_servtype2(Message):
     MSG_TYPE_FIELD_NUMBER: int
     FACE_BUBBLE_COUNT_FIELD_NUMBER: int
     POKE_FLAG_FIELD_NUMBER: int
-    poke_type: int = ...
-    poke_summary: bytes = ...
-    double_hit: int = ...
-    vaspoke_id: int = ...
-    vaspoke_name: bytes = ...
-    vaspoke_minver: bytes = ...
-    poke_strength: int = ...
-    msg_type: int = ...
-    face_bubble_count: int = ...
-    poke_flag: int = ...
-
-    def __init__(self,
-        *,
-        poke_type : Optional[int] = ...,
-        poke_summary : Optional[bytes] = ...,
-        double_hit : Optional[int] = ...,
-        vaspoke_id : Optional[int] = ...,
-        vaspoke_name : Optional[bytes] = ...,
-        vaspoke_minver : Optional[bytes] = ...,
-        poke_strength : Optional[int] = ...,
-        msg_type : Optional[int] = ...,
-        face_bubble_count : Optional[int] = ...,
-        poke_flag : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"double_hit",b"double_hit",u"face_bubble_count",b"face_bubble_count",u"msg_type",b"msg_type",u"poke_flag",b"poke_flag",u"poke_strength",b"poke_strength",u"poke_summary",b"poke_summary",u"poke_type",b"poke_type",u"vaspoke_id",b"vaspoke_id",u"vaspoke_minver",b"vaspoke_minver",u"vaspoke_name",b"vaspoke_name"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"double_hit",b"double_hit",u"face_bubble_count",b"face_bubble_count",u"msg_type",b"msg_type",u"poke_flag",b"poke_flag",u"poke_strength",b"poke_strength",u"poke_summary",b"poke_summary",u"poke_type",b"poke_type",u"vaspoke_id",b"vaspoke_id",u"vaspoke_minver",b"vaspoke_minver",u"vaspoke_name",b"vaspoke_name"]) -> None: ...
+    poke_type: int
+    poke_summary: bytes
+    double_hit: int
+    vaspoke_id: int
+    vaspoke_name: bytes
+    vaspoke_minver: bytes
+    poke_strength: int
+    msg_type: int
+    face_bubble_count: int
+    poke_flag: int
+    def __init__(self,
+        *,
+        poke_type: Optional[int] = ...,
+        poke_summary: Optional[bytes] = ...,
+        double_hit: Optional[int] = ...,
+        vaspoke_id: Optional[int] = ...,
+        vaspoke_name: Optional[bytes] = ...,
+        vaspoke_minver: Optional[bytes] = ...,
+        poke_strength: Optional[int] = ...,
+        msg_type: Optional[int] = ...,
+        face_bubble_count: Optional[int] = ...,
+        poke_flag: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["double_hit",b"double_hit","face_bubble_count",b"face_bubble_count","msg_type",b"msg_type","poke_flag",b"poke_flag","poke_strength",b"poke_strength","poke_summary",b"poke_summary","poke_type",b"poke_type","vaspoke_id",b"vaspoke_id","vaspoke_minver",b"vaspoke_minver","vaspoke_name",b"vaspoke_name"]) -> bool: ...
+    def ClearField(self, field_name: Literal["double_hit",b"double_hit","face_bubble_count",b"face_bubble_count","msg_type",b"msg_type","poke_flag",b"poke_flag","poke_strength",b"poke_strength","poke_summary",b"poke_summary","poke_type",b"poke_type","vaspoke_id",b"vaspoke_id","vaspoke_minver",b"vaspoke_minver","vaspoke_name",b"vaspoke_name"]) -> None: ...
 
 class MsgElemInfo_servtype20(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     DATA_FIELD_NUMBER: int
-    data: bytes = ...
-
+    data: bytes
     def __init__(self,
         *,
-        data : Optional[bytes] = ...,
+        data: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"data",b"data"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"data",b"data"]) -> None: ...
+    def HasField(self, field_name: Literal["data",b"data"]) -> bool: ...
+    def ClearField(self, field_name: Literal["data",b"data"]) -> None: ...
 
 class MsgElemInfo_servtype21(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TOPIC_ID_FIELD_NUMBER: int
     CONFESSOR_UIN_FIELD_NUMBER: int
     CONFESSOR_NICK_FIELD_NUMBER: int
@@ -326,41 +316,37 @@ class MsgElemInfo_servtype21(Message):
     CONFESS_TIME_FIELD_NUMBER: int
     GROUP_CONFESS_MSG_FIELD_NUMBER: int
     GROUP_CONFESS_CTX_FIELD_NUMBER: int
-    topic_id: int = ...
-    confessor_uin: int = ...
-    confessor_nick: bytes = ...
-    confessor_sex: int = ...
-    sysmsg_flag: int = ...
-    topic: bytes = ...
-    confess_time: int = ...
-
+    topic_id: int
+    confessor_uin: int
+    confessor_nick: bytes
+    confessor_sex: int
+    sysmsg_flag: int
     @property
     def c2_c_confess_ctx(self) -> C2CConfessContext: ...
-
+    topic: bytes
+    confess_time: int
     @property
     def group_confess_msg(self) -> GroupConfessMsg: ...
-
     @property
     def group_confess_ctx(self) -> GroupConfessContext: ...
-
     def __init__(self,
         *,
-        topic_id : Optional[int] = ...,
-        confessor_uin : Optional[int] = ...,
-        confessor_nick : Optional[bytes] = ...,
-        confessor_sex : Optional[int] = ...,
-        sysmsg_flag : Optional[int] = ...,
-        c2_c_confess_ctx : Optional[C2CConfessContext] = ...,
-        topic : Optional[bytes] = ...,
-        confess_time : Optional[int] = ...,
-        group_confess_msg : Optional[GroupConfessMsg] = ...,
-        group_confess_ctx : Optional[GroupConfessContext] = ...,
+        topic_id: Optional[int] = ...,
+        confessor_uin: Optional[int] = ...,
+        confessor_nick: Optional[bytes] = ...,
+        confessor_sex: Optional[int] = ...,
+        sysmsg_flag: Optional[int] = ...,
+        c2_c_confess_ctx: Optional[C2CConfessContext] = ...,
+        topic: Optional[bytes] = ...,
+        confess_time: Optional[int] = ...,
+        group_confess_msg: Optional[GroupConfessMsg] = ...,
+        group_confess_ctx: Optional[GroupConfessContext] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2_c_confess_ctx",b"c2_c_confess_ctx",u"confess_time",b"confess_time",u"confessor_nick",b"confessor_nick",u"confessor_sex",b"confessor_sex",u"confessor_uin",b"confessor_uin",u"group_confess_ctx",b"group_confess_ctx",u"group_confess_msg",b"group_confess_msg",u"sysmsg_flag",b"sysmsg_flag",u"topic",b"topic",u"topic_id",b"topic_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2_c_confess_ctx",b"c2_c_confess_ctx",u"confess_time",b"confess_time",u"confessor_nick",b"confessor_nick",u"confessor_sex",b"confessor_sex",u"confessor_uin",b"confessor_uin",u"group_confess_ctx",b"group_confess_ctx",u"group_confess_msg",b"group_confess_msg",u"sysmsg_flag",b"sysmsg_flag",u"topic",b"topic",u"topic_id",b"topic_id"]) -> None: ...
+    def HasField(self, field_name: Literal["c2_c_confess_ctx",b"c2_c_confess_ctx","confess_time",b"confess_time","confessor_nick",b"confessor_nick","confessor_sex",b"confessor_sex","confessor_uin",b"confessor_uin","group_confess_ctx",b"group_confess_ctx","group_confess_msg",b"group_confess_msg","sysmsg_flag",b"sysmsg_flag","topic",b"topic","topic_id",b"topic_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2_c_confess_ctx",b"c2_c_confess_ctx","confess_time",b"confess_time","confessor_nick",b"confessor_nick","confessor_sex",b"confessor_sex","confessor_uin",b"confessor_uin","group_confess_ctx",b"group_confess_ctx","group_confess_msg",b"group_confess_msg","sysmsg_flag",b"sysmsg_flag","topic",b"topic","topic_id",b"topic_id"]) -> None: ...
 
 class C2CConfessContext(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CONFESSOR_UIN_FIELD_NUMBER: int
     CONFESS_TO_UIN_FIELD_NUMBER: int
     SEND_UIN_FIELD_NUMBER: int
@@ -373,39 +359,38 @@ class C2CConfessContext(Message):
     BIZ_TYPE_FIELD_NUMBER: int
     CONFESS_NUM_FIELD_NUMBER: int
     CONFESS_TO_SEX_FIELD_NUMBER: int
-    confessor_uin: int = ...
-    confess_to_uin: int = ...
-    send_uin: int = ...
-    confessor_nick: bytes = ...
-    confess: bytes = ...
-    bg_type: int = ...
-    topic_id: int = ...
-    confess_time: int = ...
-    confessor_sex: int = ...
-    biz_type: int = ...
-    confess_num: int = ...
-    confess_to_sex: int = ...
-
-    def __init__(self,
-        *,
-        confessor_uin : Optional[int] = ...,
-        confess_to_uin : Optional[int] = ...,
-        send_uin : Optional[int] = ...,
-        confessor_nick : Optional[bytes] = ...,
-        confess : Optional[bytes] = ...,
-        bg_type : Optional[int] = ...,
-        topic_id : Optional[int] = ...,
-        confess_time : Optional[int] = ...,
-        confessor_sex : Optional[int] = ...,
-        biz_type : Optional[int] = ...,
-        confess_num : Optional[int] = ...,
-        confess_to_sex : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"bg_type",b"bg_type",u"biz_type",b"biz_type",u"confess",b"confess",u"confess_num",b"confess_num",u"confess_time",b"confess_time",u"confess_to_sex",b"confess_to_sex",u"confess_to_uin",b"confess_to_uin",u"confessor_nick",b"confessor_nick",u"confessor_sex",b"confessor_sex",u"confessor_uin",b"confessor_uin",u"send_uin",b"send_uin",u"topic_id",b"topic_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bg_type",b"bg_type",u"biz_type",b"biz_type",u"confess",b"confess",u"confess_num",b"confess_num",u"confess_time",b"confess_time",u"confess_to_sex",b"confess_to_sex",u"confess_to_uin",b"confess_to_uin",u"confessor_nick",b"confessor_nick",u"confessor_sex",b"confessor_sex",u"confessor_uin",b"confessor_uin",u"send_uin",b"send_uin",u"topic_id",b"topic_id"]) -> None: ...
+    confessor_uin: int
+    confess_to_uin: int
+    send_uin: int
+    confessor_nick: bytes
+    confess: bytes
+    bg_type: int
+    topic_id: int
+    confess_time: int
+    confessor_sex: int
+    biz_type: int
+    confess_num: int
+    confess_to_sex: int
+    def __init__(self,
+        *,
+        confessor_uin: Optional[int] = ...,
+        confess_to_uin: Optional[int] = ...,
+        send_uin: Optional[int] = ...,
+        confessor_nick: Optional[bytes] = ...,
+        confess: Optional[bytes] = ...,
+        bg_type: Optional[int] = ...,
+        topic_id: Optional[int] = ...,
+        confess_time: Optional[int] = ...,
+        confessor_sex: Optional[int] = ...,
+        biz_type: Optional[int] = ...,
+        confess_num: Optional[int] = ...,
+        confess_to_sex: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["bg_type",b"bg_type","biz_type",b"biz_type","confess",b"confess","confess_num",b"confess_num","confess_time",b"confess_time","confess_to_sex",b"confess_to_sex","confess_to_uin",b"confess_to_uin","confessor_nick",b"confessor_nick","confessor_sex",b"confessor_sex","confessor_uin",b"confessor_uin","send_uin",b"send_uin","topic_id",b"topic_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bg_type",b"bg_type","biz_type",b"biz_type","confess",b"confess","confess_num",b"confess_num","confess_time",b"confess_time","confess_to_sex",b"confess_to_sex","confess_to_uin",b"confess_to_uin","confessor_nick",b"confessor_nick","confessor_sex",b"confessor_sex","confessor_uin",b"confessor_uin","send_uin",b"send_uin","topic_id",b"topic_id"]) -> None: ...
 
 class GroupConfessContext(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CONFESSOR_UIN_FIELD_NUMBER: int
     CONFESS_TO_UIN_FIELD_NUMBER: int
     SEND_UIN_FIELD_NUMBER: int
@@ -416,136 +401,127 @@ class GroupConfessContext(Message):
     CONFESS_TIME_FIELD_NUMBER: int
     CONFESS_TO_NICK_TYPE_FIELD_NUMBER: int
     CONFESSOR_NICK_FIELD_NUMBER: int
-    confessor_uin: int = ...
-    confess_to_uin: int = ...
-    send_uin: int = ...
-    confessor_sex: int = ...
-    confess_to_nick: bytes = ...
-    topic: bytes = ...
-    topic_id: int = ...
-    confess_time: int = ...
-    confess_to_nick_type: int = ...
-    confessor_nick: bytes = ...
-
-    def __init__(self,
-        *,
-        confessor_uin : Optional[int] = ...,
-        confess_to_uin : Optional[int] = ...,
-        send_uin : Optional[int] = ...,
-        confessor_sex : Optional[int] = ...,
-        confess_to_nick : Optional[bytes] = ...,
-        topic : Optional[bytes] = ...,
-        topic_id : Optional[int] = ...,
-        confess_time : Optional[int] = ...,
-        confess_to_nick_type : Optional[int] = ...,
-        confessor_nick : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"confess_time",b"confess_time",u"confess_to_nick",b"confess_to_nick",u"confess_to_nick_type",b"confess_to_nick_type",u"confess_to_uin",b"confess_to_uin",u"confessor_nick",b"confessor_nick",u"confessor_sex",b"confessor_sex",u"confessor_uin",b"confessor_uin",u"send_uin",b"send_uin",u"topic",b"topic",u"topic_id",b"topic_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"confess_time",b"confess_time",u"confess_to_nick",b"confess_to_nick",u"confess_to_nick_type",b"confess_to_nick_type",u"confess_to_uin",b"confess_to_uin",u"confessor_nick",b"confessor_nick",u"confessor_sex",b"confessor_sex",u"confessor_uin",b"confessor_uin",u"send_uin",b"send_uin",u"topic",b"topic",u"topic_id",b"topic_id"]) -> None: ...
+    confessor_uin: int
+    confess_to_uin: int
+    send_uin: int
+    confessor_sex: int
+    confess_to_nick: bytes
+    topic: bytes
+    topic_id: int
+    confess_time: int
+    confess_to_nick_type: int
+    confessor_nick: bytes
+    def __init__(self,
+        *,
+        confessor_uin: Optional[int] = ...,
+        confess_to_uin: Optional[int] = ...,
+        send_uin: Optional[int] = ...,
+        confessor_sex: Optional[int] = ...,
+        confess_to_nick: Optional[bytes] = ...,
+        topic: Optional[bytes] = ...,
+        topic_id: Optional[int] = ...,
+        confess_time: Optional[int] = ...,
+        confess_to_nick_type: Optional[int] = ...,
+        confessor_nick: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["confess_time",b"confess_time","confess_to_nick",b"confess_to_nick","confess_to_nick_type",b"confess_to_nick_type","confess_to_uin",b"confess_to_uin","confessor_nick",b"confessor_nick","confessor_sex",b"confessor_sex","confessor_uin",b"confessor_uin","send_uin",b"send_uin","topic",b"topic","topic_id",b"topic_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["confess_time",b"confess_time","confess_to_nick",b"confess_to_nick","confess_to_nick_type",b"confess_to_nick_type","confess_to_uin",b"confess_to_uin","confessor_nick",b"confessor_nick","confessor_sex",b"confessor_sex","confessor_uin",b"confessor_uin","send_uin",b"send_uin","topic",b"topic","topic_id",b"topic_id"]) -> None: ...
 
 class GroupConfessItem(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TOPIC_ID_FIELD_NUMBER: int
     CONFESS_TO_UIN_FIELD_NUMBER: int
     CONFESS_TO_NICK_FIELD_NUMBER: int
     TOPIC_FIELD_NUMBER: int
     CONFESS_TO_NICK_TYPE_FIELD_NUMBER: int
-    topic_id: int = ...
-    confess_to_uin: int = ...
-    confess_to_nick: bytes = ...
-    topic: bytes = ...
-    confess_to_nick_type: int = ...
-
+    topic_id: int
+    confess_to_uin: int
+    confess_to_nick: bytes
+    topic: bytes
+    confess_to_nick_type: int
     def __init__(self,
         *,
-        topic_id : Optional[int] = ...,
-        confess_to_uin : Optional[int] = ...,
-        confess_to_nick : Optional[bytes] = ...,
-        topic : Optional[bytes] = ...,
-        confess_to_nick_type : Optional[int] = ...,
+        topic_id: Optional[int] = ...,
+        confess_to_uin: Optional[int] = ...,
+        confess_to_nick: Optional[bytes] = ...,
+        topic: Optional[bytes] = ...,
+        confess_to_nick_type: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"confess_to_nick",b"confess_to_nick",u"confess_to_nick_type",b"confess_to_nick_type",u"confess_to_uin",b"confess_to_uin",u"topic",b"topic",u"topic_id",b"topic_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"confess_to_nick",b"confess_to_nick",u"confess_to_nick_type",b"confess_to_nick_type",u"confess_to_uin",b"confess_to_uin",u"topic",b"topic",u"topic_id",b"topic_id"]) -> None: ...
+    def HasField(self, field_name: Literal["confess_to_nick",b"confess_to_nick","confess_to_nick_type",b"confess_to_nick_type","confess_to_uin",b"confess_to_uin","topic",b"topic","topic_id",b"topic_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["confess_to_nick",b"confess_to_nick","confess_to_nick_type",b"confess_to_nick_type","confess_to_uin",b"confess_to_uin","topic",b"topic","topic_id",b"topic_id"]) -> None: ...
 
 class GroupConfessMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CONFESS_TIME_FIELD_NUMBER: int
     CONFESSOR_UIN_FIELD_NUMBER: int
     CONFESSOR_SEX_FIELD_NUMBER: int
     SYSMSG_FLAG_FIELD_NUMBER: int
     CONFESS_ITEMS_FIELD_NUMBER: int
     TOTAL_TOPIC_COUNT_FIELD_NUMBER: int
-    confess_time: int = ...
-    confessor_uin: int = ...
-    confessor_sex: int = ...
-    sysmsg_flag: int = ...
-    total_topic_count: int = ...
-
+    confess_time: int
+    confessor_uin: int
+    confessor_sex: int
+    sysmsg_flag: int
     @property
     def confess_items(self) -> RepeatedCompositeFieldContainer[GroupConfessItem]: ...
-
+    total_topic_count: int
     def __init__(self,
         *,
-        confess_time : Optional[int] = ...,
-        confessor_uin : Optional[int] = ...,
-        confessor_sex : Optional[int] = ...,
-        sysmsg_flag : Optional[int] = ...,
-        confess_items : Optional[Iterable[GroupConfessItem]] = ...,
-        total_topic_count : Optional[int] = ...,
+        confess_time: Optional[int] = ...,
+        confessor_uin: Optional[int] = ...,
+        confessor_sex: Optional[int] = ...,
+        sysmsg_flag: Optional[int] = ...,
+        confess_items: Optional[Iterable[GroupConfessItem]] = ...,
+        total_topic_count: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"confess_time",b"confess_time",u"confessor_sex",b"confessor_sex",u"confessor_uin",b"confessor_uin",u"sysmsg_flag",b"sysmsg_flag",u"total_topic_count",b"total_topic_count"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"confess_items",b"confess_items",u"confess_time",b"confess_time",u"confessor_sex",b"confessor_sex",u"confessor_uin",b"confessor_uin",u"sysmsg_flag",b"sysmsg_flag",u"total_topic_count",b"total_topic_count"]) -> None: ...
+    def HasField(self, field_name: Literal["confess_time",b"confess_time","confessor_sex",b"confessor_sex","confessor_uin",b"confessor_uin","sysmsg_flag",b"sysmsg_flag","total_topic_count",b"total_topic_count"]) -> bool: ...
+    def ClearField(self, field_name: Literal["confess_items",b"confess_items","confess_time",b"confess_time","confessor_sex",b"confessor_sex","confessor_uin",b"confessor_uin","sysmsg_flag",b"sysmsg_flag","total_topic_count",b"total_topic_count"]) -> None: ...
 
 class MsgElemInfo_servtype23(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FACE_TYPE_FIELD_NUMBER: int
     FACE_BUBBLE_COUNT_FIELD_NUMBER: int
     FACE_SUMMARY_FIELD_NUMBER: int
     FLAG_FIELD_NUMBER: int
     OTHERS_FIELD_NUMBER: int
     YELLOW_FACE_FIELD_NUMBER: int
-    face_type: int = ...
-    face_bubble_count: int = ...
-    face_summary: bytes = ...
-    flag: int = ...
-    others: bytes = ...
-
+    face_type: int
+    face_bubble_count: int
+    face_summary: bytes
+    flag: int
+    others: bytes
     @property
     def yellow_face(self) -> MsgElemInfo_servtype33: ...
-
     def __init__(self,
         *,
-        face_type : Optional[int] = ...,
-        face_bubble_count : Optional[int] = ...,
-        face_summary : Optional[bytes] = ...,
-        flag : Optional[int] = ...,
-        others : Optional[bytes] = ...,
-        yellow_face : Optional[MsgElemInfo_servtype33] = ...,
+        face_type: Optional[int] = ...,
+        face_bubble_count: Optional[int] = ...,
+        face_summary: Optional[bytes] = ...,
+        flag: Optional[int] = ...,
+        others: Optional[bytes] = ...,
+        yellow_face: Optional[MsgElemInfo_servtype33] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"face_bubble_count",b"face_bubble_count",u"face_summary",b"face_summary",u"face_type",b"face_type",u"flag",b"flag",u"others",b"others",u"yellow_face",b"yellow_face"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"face_bubble_count",b"face_bubble_count",u"face_summary",b"face_summary",u"face_type",b"face_type",u"flag",b"flag",u"others",b"others",u"yellow_face",b"yellow_face"]) -> None: ...
+    def HasField(self, field_name: Literal["face_bubble_count",b"face_bubble_count","face_summary",b"face_summary","face_type",b"face_type","flag",b"flag","others",b"others","yellow_face",b"yellow_face"]) -> bool: ...
+    def ClearField(self, field_name: Literal["face_bubble_count",b"face_bubble_count","face_summary",b"face_summary","face_type",b"face_type","flag",b"flag","others",b"others","yellow_face",b"yellow_face"]) -> None: ...
 
 class MsgElemInfo_servtype24(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     LIMIT_CHAT_ENTER_FIELD_NUMBER: int
     LIMIT_CHAT_EXIT_FIELD_NUMBER: int
-
     @property
     def limit_chat_enter(self) -> LimitChatEnter: ...
-
     @property
     def limit_chat_exit(self) -> LimitChatExit: ...
-
     def __init__(self,
         *,
-        limit_chat_enter : Optional[LimitChatEnter] = ...,
-        limit_chat_exit : Optional[LimitChatExit] = ...,
+        limit_chat_enter: Optional[LimitChatEnter] = ...,
+        limit_chat_exit: Optional[LimitChatExit] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"limit_chat_enter",b"limit_chat_enter",u"limit_chat_exit",b"limit_chat_exit"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"limit_chat_enter",b"limit_chat_enter",u"limit_chat_exit",b"limit_chat_exit"]) -> None: ...
+    def HasField(self, field_name: Literal["limit_chat_enter",b"limit_chat_enter","limit_chat_exit",b"limit_chat_exit"]) -> bool: ...
+    def ClearField(self, field_name: Literal["limit_chat_enter",b"limit_chat_enter","limit_chat_exit",b"limit_chat_exit"]) -> None: ...
 
 class LimitChatEnter(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TIPS_WORDING_FIELD_NUMBER: int
     LEFT_CHAT_TIME_FIELD_NUMBER: int
     MATCH_TS_FIELD_NUMBER: int
@@ -553,148 +529,136 @@ class LimitChatEnter(Message):
     C2_C_EXPIRED_TIME_FIELD_NUMBER: int
     READY_TS_FIELD_NUMBER: int
     MATCH_NICK_FIELD_NUMBER: int
-    tips_wording: bytes = ...
-    left_chat_time: int = ...
-    match_ts: int = ...
-    match_expired_time: int = ...
-    c2_c_expired_time: int = ...
-    ready_ts: int = ...
-    match_nick: bytes = ...
-
-    def __init__(self,
-        *,
-        tips_wording : Optional[bytes] = ...,
-        left_chat_time : Optional[int] = ...,
-        match_ts : Optional[int] = ...,
-        match_expired_time : Optional[int] = ...,
-        c2_c_expired_time : Optional[int] = ...,
-        ready_ts : Optional[int] = ...,
-        match_nick : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2_c_expired_time",b"c2_c_expired_time",u"left_chat_time",b"left_chat_time",u"match_expired_time",b"match_expired_time",u"match_nick",b"match_nick",u"match_ts",b"match_ts",u"ready_ts",b"ready_ts",u"tips_wording",b"tips_wording"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2_c_expired_time",b"c2_c_expired_time",u"left_chat_time",b"left_chat_time",u"match_expired_time",b"match_expired_time",u"match_nick",b"match_nick",u"match_ts",b"match_ts",u"ready_ts",b"ready_ts",u"tips_wording",b"tips_wording"]) -> None: ...
+    tips_wording: bytes
+    left_chat_time: int
+    match_ts: int
+    match_expired_time: int
+    c2_c_expired_time: int
+    ready_ts: int
+    match_nick: bytes
+    def __init__(self,
+        *,
+        tips_wording: Optional[bytes] = ...,
+        left_chat_time: Optional[int] = ...,
+        match_ts: Optional[int] = ...,
+        match_expired_time: Optional[int] = ...,
+        c2_c_expired_time: Optional[int] = ...,
+        ready_ts: Optional[int] = ...,
+        match_nick: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["c2_c_expired_time",b"c2_c_expired_time","left_chat_time",b"left_chat_time","match_expired_time",b"match_expired_time","match_nick",b"match_nick","match_ts",b"match_ts","ready_ts",b"ready_ts","tips_wording",b"tips_wording"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2_c_expired_time",b"c2_c_expired_time","left_chat_time",b"left_chat_time","match_expired_time",b"match_expired_time","match_nick",b"match_nick","match_ts",b"match_ts","ready_ts",b"ready_ts","tips_wording",b"tips_wording"]) -> None: ...
 
 class LimitChatExit(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     EXIT_METHOD_FIELD_NUMBER: int
     MATCH_TS_FIELD_NUMBER: int
-    exit_method: int = ...
-    match_ts: int = ...
-
+    exit_method: int
+    match_ts: int
     def __init__(self,
         *,
-        exit_method : Optional[int] = ...,
-        match_ts : Optional[int] = ...,
+        exit_method: Optional[int] = ...,
+        match_ts: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"exit_method",b"exit_method",u"match_ts",b"match_ts"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"exit_method",b"exit_method",u"match_ts",b"match_ts"]) -> None: ...
+    def HasField(self, field_name: Literal["exit_method",b"exit_method","match_ts",b"match_ts"]) -> bool: ...
+    def ClearField(self, field_name: Literal["exit_method",b"exit_method","match_ts",b"match_ts"]) -> None: ...
 
 class MsgElemInfo_servtype27(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     VIDEO_FILE_FIELD_NUMBER: int
-
     @property
     def video_file(self) -> VideoFile: ...
-
     def __init__(self,
         *,
-        video_file : Optional[VideoFile] = ...,
+        video_file: Optional[VideoFile] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"video_file",b"video_file"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"video_file",b"video_file"]) -> None: ...
+    def HasField(self, field_name: Literal["video_file",b"video_file"]) -> bool: ...
+    def ClearField(self, field_name: Literal["video_file",b"video_file"]) -> None: ...
 
 class MsgElemInfo_servtype29(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     LUCKYBAG_MSG_FIELD_NUMBER: int
-    luckybag_msg: bytes = ...
-
+    luckybag_msg: bytes
     def __init__(self,
         *,
-        luckybag_msg : Optional[bytes] = ...,
+        luckybag_msg: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"luckybag_msg",b"luckybag_msg"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"luckybag_msg",b"luckybag_msg"]) -> None: ...
+    def HasField(self, field_name: Literal["luckybag_msg",b"luckybag_msg"]) -> bool: ...
+    def ClearField(self, field_name: Literal["luckybag_msg",b"luckybag_msg"]) -> None: ...
 
 class MsgElemInfo_servtype3(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FLASH_TROOP_PIC_FIELD_NUMBER: int
     FLASH_C2_C_PIC_FIELD_NUMBER: int
-
     @property
     def flash_troop_pic(self) -> CustomFace: ...
-
     @property
     def flash_c2_c_pic(self) -> NotOnlineImage: ...
-
     def __init__(self,
         *,
-        flash_troop_pic : Optional[CustomFace] = ...,
-        flash_c2_c_pic : Optional[NotOnlineImage] = ...,
+        flash_troop_pic: Optional[CustomFace] = ...,
+        flash_c2_c_pic: Optional[NotOnlineImage] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"flash_c2_c_pic",b"flash_c2_c_pic",u"flash_troop_pic",b"flash_troop_pic"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"flash_c2_c_pic",b"flash_c2_c_pic",u"flash_troop_pic",b"flash_troop_pic"]) -> None: ...
+    def HasField(self, field_name: Literal["flash_c2_c_pic",b"flash_c2_c_pic","flash_troop_pic",b"flash_troop_pic"]) -> bool: ...
+    def ClearField(self, field_name: Literal["flash_c2_c_pic",b"flash_c2_c_pic","flash_troop_pic",b"flash_troop_pic"]) -> None: ...
 
 class MsgElemInfo_servtype31(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TEXT_FIELD_NUMBER: int
     EXT_FIELD_NUMBER: int
-    text: bytes = ...
-    ext: bytes = ...
-
+    text: bytes
+    ext: bytes
     def __init__(self,
         *,
-        text : Optional[bytes] = ...,
-        ext : Optional[bytes] = ...,
+        text: Optional[bytes] = ...,
+        ext: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"ext",b"ext",u"text",b"text"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"ext",b"ext",u"text",b"text"]) -> None: ...
+    def HasField(self, field_name: Literal["ext",b"ext","text",b"text"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ext",b"ext","text",b"text"]) -> None: ...
 
 class MsgElemInfo_servtype33(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     INDEX_FIELD_NUMBER: int
     TEXT_FIELD_NUMBER: int
     COMPAT_FIELD_NUMBER: int
     BUF_FIELD_NUMBER: int
-    index: int = ...
-    text: bytes = ...
-    compat: bytes = ...
-    buf: bytes = ...
-
+    index: int
+    text: bytes
+    compat: bytes
+    buf: bytes
     def __init__(self,
         *,
-        index : Optional[int] = ...,
-        text : Optional[bytes] = ...,
-        compat : Optional[bytes] = ...,
-        buf : Optional[bytes] = ...,
+        index: Optional[int] = ...,
+        text: Optional[bytes] = ...,
+        compat: Optional[bytes] = ...,
+        buf: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"buf",b"buf",u"compat",b"compat",u"index",b"index",u"text",b"text"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"buf",b"buf",u"compat",b"compat",u"index",b"index",u"text",b"text"]) -> None: ...
+    def HasField(self, field_name: Literal["buf",b"buf","compat",b"compat","index",b"index","text",b"text"]) -> bool: ...
+    def ClearField(self, field_name: Literal["buf",b"buf","compat",b"compat","index",b"index","text",b"text"]) -> None: ...
 
 class MsgElemInfo_servtype34(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FROM_NICKNAME_FIELD_NUMBER: int
     PUSH_WINDOW_FLAG_FIELD_NUMBER: int
     GAME_SESSION_FIELD_NUMBER: int
     EXT_FIELD_NUMBER: int
-    from_nickname: bytes = ...
-    push_window_flag: int = ...
-    ext: bytes = ...
-
+    from_nickname: bytes
+    push_window_flag: int
     @property
     def game_session(self) -> GameSession: ...
-
+    ext: bytes
     def __init__(self,
         *,
-        from_nickname : Optional[bytes] = ...,
-        push_window_flag : Optional[int] = ...,
-        game_session : Optional[GameSession] = ...,
-        ext : Optional[bytes] = ...,
+        from_nickname: Optional[bytes] = ...,
+        push_window_flag: Optional[int] = ...,
+        game_session: Optional[GameSession] = ...,
+        ext: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"ext",b"ext",u"from_nickname",b"from_nickname",u"game_session",b"game_session",u"push_window_flag",b"push_window_flag"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"ext",b"ext",u"from_nickname",b"from_nickname",u"game_session",b"game_session",u"push_window_flag",b"push_window_flag"]) -> None: ...
+    def HasField(self, field_name: Literal["ext",b"ext","from_nickname",b"from_nickname","game_session",b"game_session","push_window_flag",b"push_window_flag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ext",b"ext","from_nickname",b"from_nickname","game_session",b"game_session","push_window_flag",b"push_window_flag"]) -> None: ...
 
 class GameSession(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FROM_ROLE_ID_FIELD_NUMBER: int
     FROM_OPEN_ID_FIELD_NUMBER: int
     TO_ROLE_ID_FIELD_NUMBER: int
@@ -702,67 +666,63 @@ class GameSession(Message):
     GAME_APPID_FIELD_NUMBER: int
     FROM_TINY_ID_FIELD_NUMBER: int
     TO_TINY_ID_FIELD_NUMBER: int
-    from_role_id: bytes = ...
-    from_open_id: bytes = ...
-    to_role_id: bytes = ...
-    to_open_id: bytes = ...
-    game_appid: int = ...
-    from_tiny_id: int = ...
-    to_tiny_id: int = ...
-
-    def __init__(self,
-        *,
-        from_role_id : Optional[bytes] = ...,
-        from_open_id : Optional[bytes] = ...,
-        to_role_id : Optional[bytes] = ...,
-        to_open_id : Optional[bytes] = ...,
-        game_appid : Optional[int] = ...,
-        from_tiny_id : Optional[int] = ...,
-        to_tiny_id : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"from_open_id",b"from_open_id",u"from_role_id",b"from_role_id",u"from_tiny_id",b"from_tiny_id",u"game_appid",b"game_appid",u"to_open_id",b"to_open_id",u"to_role_id",b"to_role_id",u"to_tiny_id",b"to_tiny_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"from_open_id",b"from_open_id",u"from_role_id",b"from_role_id",u"from_tiny_id",b"from_tiny_id",u"game_appid",b"game_appid",u"to_open_id",b"to_open_id",u"to_role_id",b"to_role_id",u"to_tiny_id",b"to_tiny_id"]) -> None: ...
+    from_role_id: bytes
+    from_open_id: bytes
+    to_role_id: bytes
+    to_open_id: bytes
+    game_appid: int
+    from_tiny_id: int
+    to_tiny_id: int
+    def __init__(self,
+        *,
+        from_role_id: Optional[bytes] = ...,
+        from_open_id: Optional[bytes] = ...,
+        to_role_id: Optional[bytes] = ...,
+        to_open_id: Optional[bytes] = ...,
+        game_appid: Optional[int] = ...,
+        from_tiny_id: Optional[int] = ...,
+        to_tiny_id: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["from_open_id",b"from_open_id","from_role_id",b"from_role_id","from_tiny_id",b"from_tiny_id","game_appid",b"game_appid","to_open_id",b"to_open_id","to_role_id",b"to_role_id","to_tiny_id",b"to_tiny_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["from_open_id",b"from_open_id","from_role_id",b"from_role_id","from_tiny_id",b"from_tiny_id","game_appid",b"game_appid","to_open_id",b"to_open_id","to_role_id",b"to_role_id","to_tiny_id",b"to_tiny_id"]) -> None: ...
 
 class MsgElemInfo_servtype35(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TOKEN_FIELD_NUMBER: int
     GLOBAL_PADID_FIELD_NUMBER: int
     GET_REV_FIELD_NUMBER: int
     HIS_EDIT_UIN_NUM_FIELD_NUMBER: int
-    token: bytes = ...
-    global_padid: bytes = ...
-    get_rev: int = ...
-    his_edit_uin_num: int = ...
-
+    token: bytes
+    global_padid: bytes
+    get_rev: int
+    his_edit_uin_num: int
     def __init__(self,
         *,
-        token : Optional[bytes] = ...,
-        global_padid : Optional[bytes] = ...,
-        get_rev : Optional[int] = ...,
-        his_edit_uin_num : Optional[int] = ...,
+        token: Optional[bytes] = ...,
+        global_padid: Optional[bytes] = ...,
+        get_rev: Optional[int] = ...,
+        his_edit_uin_num: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"get_rev",b"get_rev",u"global_padid",b"global_padid",u"his_edit_uin_num",b"his_edit_uin_num",u"token",b"token"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"get_rev",b"get_rev",u"global_padid",b"global_padid",u"his_edit_uin_num",b"his_edit_uin_num",u"token",b"token"]) -> None: ...
+    def HasField(self, field_name: Literal["get_rev",b"get_rev","global_padid",b"global_padid","his_edit_uin_num",b"his_edit_uin_num","token",b"token"]) -> bool: ...
+    def ClearField(self, field_name: Literal["get_rev",b"get_rev","global_padid",b"global_padid","his_edit_uin_num",b"his_edit_uin_num","token",b"token"]) -> None: ...
 
 class MsgElemInfo_servtype4(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     IMSG_TYPE_FIELD_NUMBER: int
     ST_STORY_AIO_OBJ_MSG_FIELD_NUMBER: int
-    imsg_type: int = ...
-
+    imsg_type: int
     @property
     def st_story_aio_obj_msg(self) -> StoryAioObjMsg: ...
-
     def __init__(self,
         *,
-        imsg_type : Optional[int] = ...,
-        st_story_aio_obj_msg : Optional[StoryAioObjMsg] = ...,
+        imsg_type: Optional[int] = ...,
+        st_story_aio_obj_msg: Optional[StoryAioObjMsg] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"imsg_type",b"imsg_type",u"st_story_aio_obj_msg",b"st_story_aio_obj_msg"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"imsg_type",b"imsg_type",u"st_story_aio_obj_msg",b"st_story_aio_obj_msg"]) -> None: ...
+    def HasField(self, field_name: Literal["imsg_type",b"imsg_type","st_story_aio_obj_msg",b"st_story_aio_obj_msg"]) -> bool: ...
+    def ClearField(self, field_name: Literal["imsg_type",b"imsg_type","st_story_aio_obj_msg",b"st_story_aio_obj_msg"]) -> None: ...
 
 class MsgElemInfo_servtype5(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     VID_FIELD_NUMBER: int
     COVER_FIELD_NUMBER: int
     TITLE_FIELD_NUMBER: int
@@ -770,76 +730,71 @@ class MsgElemInfo_servtype5(Message):
     CREATE_TIME_FIELD_NUMBER: int
     COMMENT_CONTENT_FIELD_NUMBER: int
     AUTHOR_FIELD_NUMBER: int
-    vid: bytes = ...
-    cover: bytes = ...
-    title: bytes = ...
-    summary: bytes = ...
-    create_time: int = ...
-    comment_content: bytes = ...
-    author: int = ...
-
-    def __init__(self,
-        *,
-        vid : Optional[bytes] = ...,
-        cover : Optional[bytes] = ...,
-        title : Optional[bytes] = ...,
-        summary : Optional[bytes] = ...,
-        create_time : Optional[int] = ...,
-        comment_content : Optional[bytes] = ...,
-        author : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"author",b"author",u"comment_content",b"comment_content",u"cover",b"cover",u"create_time",b"create_time",u"summary",b"summary",u"title",b"title",u"vid",b"vid"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"author",b"author",u"comment_content",b"comment_content",u"cover",b"cover",u"create_time",b"create_time",u"summary",b"summary",u"title",b"title",u"vid",b"vid"]) -> None: ...
+    vid: bytes
+    cover: bytes
+    title: bytes
+    summary: bytes
+    create_time: int
+    comment_content: bytes
+    author: int
+    def __init__(self,
+        *,
+        vid: Optional[bytes] = ...,
+        cover: Optional[bytes] = ...,
+        title: Optional[bytes] = ...,
+        summary: Optional[bytes] = ...,
+        create_time: Optional[int] = ...,
+        comment_content: Optional[bytes] = ...,
+        author: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["author",b"author","comment_content",b"comment_content","cover",b"cover","create_time",b"create_time","summary",b"summary","title",b"title","vid",b"vid"]) -> bool: ...
+    def ClearField(self, field_name: Literal["author",b"author","comment_content",b"comment_content","cover",b"cover","create_time",b"create_time","summary",b"summary","title",b"title","vid",b"vid"]) -> None: ...
 
 class MsgElemInfo_servtype8(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     WIFI_DELIVER_GIFT_MSG_FIELD_NUMBER: int
-
     @property
     def wifi_deliver_gift_msg(self) -> DeliverGiftMsg: ...
-
     def __init__(self,
         *,
-        wifi_deliver_gift_msg : Optional[DeliverGiftMsg] = ...,
+        wifi_deliver_gift_msg: Optional[DeliverGiftMsg] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"wifi_deliver_gift_msg",b"wifi_deliver_gift_msg"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"wifi_deliver_gift_msg",b"wifi_deliver_gift_msg"]) -> None: ...
+    def HasField(self, field_name: Literal["wifi_deliver_gift_msg",b"wifi_deliver_gift_msg"]) -> bool: ...
+    def ClearField(self, field_name: Literal["wifi_deliver_gift_msg",b"wifi_deliver_gift_msg"]) -> None: ...
 
 class MsgElemInfo_servtype9(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     ANCHOR_STATUS_FIELD_NUMBER: int
     JUMP_SCHEMA_FIELD_NUMBER: int
     ANCHOR_NICKNAME_FIELD_NUMBER: int
     ANCHOR_HEAD_URL_FIELD_NUMBER: int
     LIVE_TITLE_FIELD_NUMBER: int
-    anchor_status: int = ...
-    jump_schema: bytes = ...
-    anchor_nickname: Text = ...
-    anchor_head_url: bytes = ...
-    live_title: Text = ...
-
+    anchor_status: int
+    jump_schema: bytes
+    anchor_nickname: Text
+    anchor_head_url: bytes
+    live_title: Text
     def __init__(self,
         *,
-        anchor_status : Optional[int] = ...,
-        jump_schema : Optional[bytes] = ...,
-        anchor_nickname : Optional[Text] = ...,
-        anchor_head_url : Optional[bytes] = ...,
-        live_title : Optional[Text] = ...,
+        anchor_status: Optional[int] = ...,
+        jump_schema: Optional[bytes] = ...,
+        anchor_nickname: Optional[Text] = ...,
+        anchor_head_url: Optional[bytes] = ...,
+        live_title: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"anchor_head_url",b"anchor_head_url",u"anchor_nickname",b"anchor_nickname",u"anchor_status",b"anchor_status",u"jump_schema",b"jump_schema",u"live_title",b"live_title"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"anchor_head_url",b"anchor_head_url",u"anchor_nickname",b"anchor_nickname",u"anchor_status",b"anchor_status",u"jump_schema",b"jump_schema",u"live_title",b"live_title"]) -> None: ...
+    def HasField(self, field_name: Literal["anchor_head_url",b"anchor_head_url","anchor_nickname",b"anchor_nickname","anchor_status",b"anchor_status","jump_schema",b"jump_schema","live_title",b"live_title"]) -> bool: ...
+    def ClearField(self, field_name: Literal["anchor_head_url",b"anchor_head_url","anchor_nickname",b"anchor_nickname","anchor_status",b"anchor_status","jump_schema",b"jump_schema","live_title",b"live_title"]) -> None: ...
 
 class StoryAioObjMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     UI_URL_FIELD_NUMBER: int
     JMP_URL_FIELD_NUMBER: int
-    ui_url: Text = ...
-    jmp_url: Text = ...
-
+    ui_url: Text
+    jmp_url: Text
     def __init__(self,
         *,
-        ui_url : Optional[Text] = ...,
-        jmp_url : Optional[Text] = ...,
+        ui_url: Optional[Text] = ...,
+        jmp_url: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"jmp_url",b"jmp_url",u"ui_url",b"ui_url"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"jmp_url",b"jmp_url",u"ui_url",b"ui_url"]) -> None: ...
+    def HasField(self, field_name: Literal["jmp_url",b"jmp_url","ui_url",b"ui_url"]) -> bool: ...
+    def ClearField(self, field_name: Literal["jmp_url",b"jmp_url","ui_url",b"ui_url"]) -> None: ...
diff --git a/cai/pb/im/oidb/cmd0x388/__init__.py b/cai/pb/im/oidb/cmd0x388/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/cai/pb/im/oidb/cmd0x388/cmd0x388.proto b/cai/pb/im/oidb/cmd0x388/cmd0x388.proto
deleted file mode 100644
index f5cef756..00000000
--- a/cai/pb/im/oidb/cmd0x388/cmd0x388.proto
+++ /dev/null
@@ -1,255 +0,0 @@
-syntax = "proto2";
-
-option go_package = "github.com/Mrs4s/MiraiGo/client/pb/cmd0x388";
-
-  message DelImgReq {
-    optional uint64 srcUin = 1;
-    optional uint64 dstUin = 2;
-    optional uint32 reqTerm = 3;
-    optional uint32 reqPlatformType = 4;
-    optional uint32 buType = 5;
-    optional bytes buildVer = 6;
-    optional bytes fileResid = 7;
-    optional uint32 picWidth = 8;
-    optional uint32 picHeight = 9;
-  }
-
-  message DelImgRsp {
-    optional uint32 result = 1;
-    optional bytes failMsg = 2;
-    optional bytes fileResid = 3;
-  }
-
-  message ExpRoamExtendInfo {
-    optional bytes resid = 1;
-  }
-
-  message ExpRoamPicInfo {
-    optional uint32 shopFlag = 1;
-    optional uint32 pkgId = 2;
-    optional bytes picId = 3;
-  }
-
-  message ExtensionCommPicTryUp {
-    repeated bytes extinfo = 1;
-  }
-
-  message ExtensionExpRoamTryUp {
-    repeated ExpRoamPicInfo exproamPicInfo = 1;
-  }
-
-  message GetImgUrlReq {
-    optional uint64 groupCode = 1;
-    optional uint64 dstUin = 2;
-    optional uint64 fileid = 3;
-    optional bytes fileMd5 = 4;
-    optional uint32 urlFlag = 5;
-    optional uint32 urlType = 6;
-    optional uint32 reqTerm = 7;
-    optional uint32 reqPlatformType = 8;
-    optional uint32 innerIp = 9;
-    optional uint32 buType = 10;
-    optional bytes buildVer = 11;
-    optional uint64 fileId = 12;
-    optional uint64 fileSize = 13;
-    optional uint32 originalPic = 14;
-    optional uint32 retryReq = 15;
-    optional uint32 fileHeight = 16;
-    optional uint32 fileWidth = 17;
-    optional uint32 picType = 18;
-    optional uint32 picUpTimestamp = 19;
-    optional uint32 reqTransferType = 20;
-    optional uint64 qqmeetGuildId = 21;
-    optional uint64 qqmeetChannelId = 22;
-    optional bytes downloadIndex = 23;
-  }
-
-  message GetImgUrlRsp {
-    optional uint64 fileid = 1;
-    optional bytes fileMd5 = 2;
-    optional uint32 result = 3;
-    optional bytes failMsg = 4;
-    optional ImgInfo imgInfo = 5;
-    repeated bytes thumbDownUrl = 6;
-    repeated bytes originalDownUrl = 7;
-    repeated bytes bigDownUrl = 8;
-    repeated uint32 downIp = 9;
-    repeated uint32 downPort = 10;
-    optional bytes downDomain = 11;
-    optional bytes thumbDownPara = 12;
-    optional bytes originalDownPara = 13;
-    optional bytes bigDownPara = 14;
-    optional uint64 fileId = 15;
-    optional uint32 autoDownType = 16;
-    repeated uint32 orderDownType = 17;
-    optional bytes bigThumbDownPara = 19;
-    optional uint32 httpsUrlFlag = 20;
-    repeated IPv6Info downIp6 = 26;
-    optional bytes clientIp6 = 27;
-  }
-
-  message GetPttUrlReq {
-    optional uint64 groupCode = 1;
-    optional uint64 dstUin = 2;
-    optional uint64 fileid = 3;
-    optional bytes fileMd5 = 4;
-    optional uint32 reqTerm = 5;
-    optional uint32 reqPlatformType = 6;
-    optional uint32 innerIp = 7;
-    optional uint32 buType = 8;
-    optional bytes buildVer = 9;
-    optional uint64 fileId = 10;
-    optional bytes fileKey = 11;
-    optional uint32 codec = 12;
-    optional uint32 buId = 13;
-    optional uint32 reqTransferType = 14;
-    optional uint32 isAuto = 15;
-  }
-
-  message GetPttUrlRsp {
-    optional uint64 fileid = 1;
-    optional bytes fileMd5 = 2;
-    optional uint32 result = 3;
-    optional bytes failMsg = 4;
-    repeated bytes downUrl = 5;
-    repeated uint32 downIp = 6;
-    repeated uint32 downPort = 7;
-    optional bytes downDomain = 8;
-    optional bytes downPara = 9;
-    optional uint64 fileId = 10;
-    optional uint32 transferType = 11;
-    optional uint32 allowRetry = 12;
-    repeated IPv6Info downIp6 = 26;
-    optional bytes clientIp6 = 27;
-    optional string domain = 28;
-  }
-
-  message IPv6Info {
-    optional bytes ip6 = 1;
-    optional uint32 port = 2;
-  }
-
-  message ImgInfo {
-    optional bytes fileMd5 = 1;
-    optional uint32 fileType = 2;
-    optional uint64 fileSize = 3;
-    optional uint32 fileWidth = 4;
-    optional uint32 fileHeight = 5;
-  }
-
-  message PicSize {
-    optional uint32 original = 1;
-    optional uint32 thumb = 2;
-    optional uint32 high = 3;
-  }
-
-  message D388ReqBody {
-    optional uint32 netType = 1;
-    optional uint32 subcmd = 2;
-    repeated TryUpImgReq tryupImgReq = 3;
-    repeated GetImgUrlReq getimgUrlReq = 4;
-    repeated TryUpPttReq tryupPttReq = 5;
-    repeated GetPttUrlReq getpttUrlReq = 6;
-    optional uint32 commandId = 7;
-    repeated DelImgReq delImgReq = 8;
-    optional bytes extension = 1001;
-  }
-
-  message D388RspBody {
-    optional uint32 clientIp = 1;
-    optional uint32 subcmd = 2;
-    repeated D388TryUpImgRsp tryupImgRsp = 3;
-    repeated GetImgUrlRsp getimgUrlRsp = 4;
-    repeated TryUpPttRsp tryupPttRsp = 5;
-    repeated GetPttUrlRsp getpttUrlRsp = 6;
-    repeated DelImgRsp delImgRsp = 7;
-  }
-
-  message TryUpImgReq {
-    optional uint64 groupCode = 1;
-    optional uint64 srcUin = 2;
-    optional uint64 fileId = 3;
-    optional bytes fileMd5 = 4;
-    optional uint64 fileSize = 5;
-    optional bytes fileName = 6;
-    optional uint32 srcTerm = 7;
-    optional uint32 platformType = 8;
-    optional uint32 buType = 9;
-    optional uint32 picWidth = 10;
-    optional uint32 picHeight = 11;
-    optional uint32 picType = 12;
-    optional bytes buildVer = 13;
-    optional uint32 innerIp = 14;
-    optional uint32 appPicType = 15;
-    optional uint32 originalPic = 16;
-    optional bytes fileIndex = 17;
-    optional uint64 dstUin = 18;
-    optional uint32 srvUpload = 19;
-    optional bytes transferUrl = 20;
-    optional uint64 qqmeetGuildId = 21;
-    optional uint64 qqmeetChannelId = 22;
-  }
-
-  message D388TryUpImgRsp {
-    optional uint64 fileId = 1;
-    optional uint32 result = 2;
-    optional bytes failMsg = 3;
-    optional bool fileExit = 4;
-    optional ImgInfo imgInfo = 5;
-    repeated uint32 upIp = 6;
-    repeated uint32 upPort = 7;
-    optional bytes upUkey = 8;
-    optional uint64 fileid = 9;
-    optional uint64 upOffset = 10;
-    optional uint64 blockSize = 11;
-    optional bool newBigChan = 12;
-    repeated IPv6Info upIp6 = 26;
-    optional bytes clientIp6 = 27;
-    optional bytes downloadIndex = 28;
-    optional TryUpInfo4Busi info4Busi = 1001;
-  }
-
-  message TryUpInfo4Busi {
-    optional bytes downDomain = 1;
-    optional bytes thumbDownUrl = 2;
-    optional bytes originalDownUrl = 3;
-    optional bytes bigDownUrl = 4;
-    optional bytes fileResid = 5;
-  }
-
-  message TryUpPttReq {
-    optional uint64 groupCode = 1;
-    optional uint64 srcUin = 2;
-    optional uint64 fileId = 3;
-    optional bytes fileMd5 = 4;
-    optional uint64 fileSize = 5;
-    optional bytes fileName = 6;
-    optional uint32 srcTerm = 7;
-    optional uint32 platformType = 8;
-    optional uint32 buType = 9;
-    optional bytes buildVer = 10;
-    optional uint32 innerIp = 11;
-    optional uint32 voiceLength = 12;
-    optional bool newUpChan = 13;
-    optional uint32 codec = 14;
-    optional uint32 voiceType = 15;
-    optional uint32 buId = 16;
-  }
-
-  message TryUpPttRsp {
-    optional uint64 fileId = 1;
-    optional uint32 result = 2;
-    optional bytes failMsg = 3;
-    optional bool fileExit = 4;
-    repeated uint32 upIp = 5;
-    repeated uint32 upPort = 6;
-    optional bytes upUkey = 7;
-    optional uint64 fileid = 8;
-    optional uint64 upOffset = 9;
-    optional uint64 blockSize = 10;
-    optional bytes fileKey = 11;
-    optional uint32 channelType = 12;
-    repeated IPv6Info upIp6 = 26;
-    optional bytes clientIp6 = 27;
-  }
-
diff --git a/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.py b/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.py
deleted file mode 100644
index 4f02ceba..00000000
--- a/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.py
+++ /dev/null
@@ -1,225 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: cmd0x388.proto
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0e\x63md0x388.proto\"\xaf\x01\n\tDelImgReq\x12\x0e\n\x06srcUin\x18\x01 \x01(\x04\x12\x0e\n\x06\x64stUin\x18\x02 \x01(\x04\x12\x0f\n\x07reqTerm\x18\x03 \x01(\r\x12\x17\n\x0freqPlatformType\x18\x04 \x01(\r\x12\x0e\n\x06\x62uType\x18\x05 \x01(\r\x12\x10\n\x08\x62uildVer\x18\x06 \x01(\x0c\x12\x11\n\tfileResid\x18\x07 \x01(\x0c\x12\x10\n\x08picWidth\x18\x08 \x01(\r\x12\x11\n\tpicHeight\x18\t \x01(\r\"?\n\tDelImgRsp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x61ilMsg\x18\x02 \x01(\x0c\x12\x11\n\tfileResid\x18\x03 \x01(\x0c\"\"\n\x11\x45xpRoamExtendInfo\x12\r\n\x05resid\x18\x01 \x01(\x0c\"@\n\x0e\x45xpRoamPicInfo\x12\x10\n\x08shopFlag\x18\x01 \x01(\r\x12\r\n\x05pkgId\x18\x02 \x01(\r\x12\r\n\x05picId\x18\x03 \x01(\x0c\"(\n\x15\x45xtensionCommPicTryUp\x12\x0f\n\x07\x65xtinfo\x18\x01 \x03(\x0c\"@\n\x15\x45xtensionExpRoamTryUp\x12\'\n\x0e\x65xproamPicInfo\x18\x01 \x03(\x0b\x32\x0f.ExpRoamPicInfo\"\xca\x03\n\x0cGetImgUrlReq\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0e\n\x06\x64stUin\x18\x02 \x01(\x04\x12\x0e\n\x06\x66ileid\x18\x03 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x04 \x01(\x0c\x12\x0f\n\x07urlFlag\x18\x05 \x01(\r\x12\x0f\n\x07urlType\x18\x06 \x01(\r\x12\x0f\n\x07reqTerm\x18\x07 \x01(\r\x12\x17\n\x0freqPlatformType\x18\x08 \x01(\r\x12\x0f\n\x07innerIp\x18\t \x01(\r\x12\x0e\n\x06\x62uType\x18\n \x01(\r\x12\x10\n\x08\x62uildVer\x18\x0b \x01(\x0c\x12\x0e\n\x06\x66ileId\x18\x0c \x01(\x04\x12\x10\n\x08\x66ileSize\x18\r \x01(\x04\x12\x13\n\x0boriginalPic\x18\x0e \x01(\r\x12\x10\n\x08retryReq\x18\x0f \x01(\r\x12\x12\n\nfileHeight\x18\x10 \x01(\r\x12\x11\n\tfileWidth\x18\x11 \x01(\r\x12\x0f\n\x07picType\x18\x12 \x01(\r\x12\x16\n\x0epicUpTimestamp\x18\x13 \x01(\r\x12\x17\n\x0freqTransferType\x18\x14 \x01(\r\x12\x15\n\rqqmeetGuildId\x18\x15 \x01(\x04\x12\x17\n\x0fqqmeetChannelId\x18\x16 \x01(\x04\x12\x15\n\rdownloadIndex\x18\x17 \x01(\x0c\"\xc6\x03\n\x0cGetImgUrlRsp\x12\x0e\n\x06\x66ileid\x18\x01 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x02 \x01(\x0c\x12\x0e\n\x06result\x18\x03 \x01(\r\x12\x0f\n\x07\x66\x61ilMsg\x18\x04 \x01(\x0c\x12\x19\n\x07imgInfo\x18\x05 \x01(\x0b\x32\x08.ImgInfo\x12\x14\n\x0cthumbDownUrl\x18\x06 \x03(\x0c\x12\x17\n\x0foriginalDownUrl\x18\x07 \x03(\x0c\x12\x12\n\nbigDownUrl\x18\x08 \x03(\x0c\x12\x0e\n\x06\x64ownIp\x18\t \x03(\r\x12\x10\n\x08\x64ownPort\x18\n \x03(\r\x12\x12\n\ndownDomain\x18\x0b \x01(\x0c\x12\x15\n\rthumbDownPara\x18\x0c \x01(\x0c\x12\x18\n\x10originalDownPara\x18\r \x01(\x0c\x12\x13\n\x0b\x62igDownPara\x18\x0e \x01(\x0c\x12\x0e\n\x06\x66ileId\x18\x0f \x01(\x04\x12\x14\n\x0c\x61utoDownType\x18\x10 \x01(\r\x12\x15\n\rorderDownType\x18\x11 \x03(\r\x12\x18\n\x10\x62igThumbDownPara\x18\x13 \x01(\x0c\x12\x14\n\x0chttpsUrlFlag\x18\x14 \x01(\r\x12\x1a\n\x07\x64ownIp6\x18\x1a \x03(\x0b\x32\t.IPv6Info\x12\x11\n\tclientIp6\x18\x1b \x01(\x0c\"\x96\x02\n\x0cGetPttUrlReq\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0e\n\x06\x64stUin\x18\x02 \x01(\x04\x12\x0e\n\x06\x66ileid\x18\x03 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x04 \x01(\x0c\x12\x0f\n\x07reqTerm\x18\x05 \x01(\r\x12\x17\n\x0freqPlatformType\x18\x06 \x01(\r\x12\x0f\n\x07innerIp\x18\x07 \x01(\r\x12\x0e\n\x06\x62uType\x18\x08 \x01(\r\x12\x10\n\x08\x62uildVer\x18\t \x01(\x0c\x12\x0e\n\x06\x66ileId\x18\n \x01(\x04\x12\x0f\n\x07\x66ileKey\x18\x0b \x01(\x0c\x12\r\n\x05\x63odec\x18\x0c \x01(\r\x12\x0c\n\x04\x62uId\x18\r \x01(\r\x12\x17\n\x0freqTransferType\x18\x0e \x01(\r\x12\x0e\n\x06isAuto\x18\x0f \x01(\r\"\xa2\x02\n\x0cGetPttUrlRsp\x12\x0e\n\x06\x66ileid\x18\x01 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x02 \x01(\x0c\x12\x0e\n\x06result\x18\x03 \x01(\r\x12\x0f\n\x07\x66\x61ilMsg\x18\x04 \x01(\x0c\x12\x0f\n\x07\x64ownUrl\x18\x05 \x03(\x0c\x12\x0e\n\x06\x64ownIp\x18\x06 \x03(\r\x12\x10\n\x08\x64ownPort\x18\x07 \x03(\r\x12\x12\n\ndownDomain\x18\x08 \x01(\x0c\x12\x10\n\x08\x64ownPara\x18\t \x01(\x0c\x12\x0e\n\x06\x66ileId\x18\n \x01(\x04\x12\x14\n\x0ctransferType\x18\x0b \x01(\r\x12\x12\n\nallowRetry\x18\x0c \x01(\r\x12\x1a\n\x07\x64ownIp6\x18\x1a \x03(\x0b\x32\t.IPv6Info\x12\x11\n\tclientIp6\x18\x1b \x01(\x0c\x12\x0e\n\x06\x64omain\x18\x1c \x01(\t\"%\n\x08IPv6Info\x12\x0b\n\x03ip6\x18\x01 \x01(\x0c\x12\x0c\n\x04port\x18\x02 \x01(\r\"e\n\x07ImgInfo\x12\x0f\n\x07\x66ileMd5\x18\x01 \x01(\x0c\x12\x10\n\x08\x66ileType\x18\x02 \x01(\r\x12\x10\n\x08\x66ileSize\x18\x03 \x01(\x04\x12\x11\n\tfileWidth\x18\x04 \x01(\r\x12\x12\n\nfileHeight\x18\x05 \x01(\r\"8\n\x07PicSize\x12\x10\n\x08original\x18\x01 \x01(\r\x12\r\n\x05thumb\x18\x02 \x01(\r\x12\x0c\n\x04high\x18\x03 \x01(\r\"\x84\x02\n\x0b\x44\x33\x38\x38ReqBody\x12\x0f\n\x07netType\x18\x01 \x01(\r\x12\x0e\n\x06subcmd\x18\x02 \x01(\r\x12!\n\x0btryupImgReq\x18\x03 \x03(\x0b\x32\x0c.TryUpImgReq\x12#\n\x0cgetimgUrlReq\x18\x04 \x03(\x0b\x32\r.GetImgUrlReq\x12!\n\x0btryupPttReq\x18\x05 \x03(\x0b\x32\x0c.TryUpPttReq\x12#\n\x0cgetpttUrlReq\x18\x06 \x03(\x0b\x32\r.GetPttUrlReq\x12\x11\n\tcommandId\x18\x07 \x01(\r\x12\x1d\n\tdelImgReq\x18\x08 \x03(\x0b\x32\n.DelImgReq\x12\x12\n\textension\x18\xe9\x07 \x01(\x0c\"\xe2\x01\n\x0b\x44\x33\x38\x38RspBody\x12\x10\n\x08\x63lientIp\x18\x01 \x01(\r\x12\x0e\n\x06subcmd\x18\x02 \x01(\r\x12%\n\x0btryupImgRsp\x18\x03 \x03(\x0b\x32\x10.D388TryUpImgRsp\x12#\n\x0cgetimgUrlRsp\x18\x04 \x03(\x0b\x32\r.GetImgUrlRsp\x12!\n\x0btryupPttRsp\x18\x05 \x03(\x0b\x32\x0c.TryUpPttRsp\x12#\n\x0cgetpttUrlRsp\x18\x06 \x03(\x0b\x32\r.GetPttUrlRsp\x12\x1d\n\tdelImgRsp\x18\x07 \x03(\x0b\x32\n.DelImgRsp\"\xa9\x03\n\x0bTryUpImgReq\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0e\n\x06srcUin\x18\x02 \x01(\x04\x12\x0e\n\x06\x66ileId\x18\x03 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x04 \x01(\x0c\x12\x10\n\x08\x66ileSize\x18\x05 \x01(\x04\x12\x10\n\x08\x66ileName\x18\x06 \x01(\x0c\x12\x0f\n\x07srcTerm\x18\x07 \x01(\r\x12\x14\n\x0cplatformType\x18\x08 \x01(\r\x12\x0e\n\x06\x62uType\x18\t \x01(\r\x12\x10\n\x08picWidth\x18\n \x01(\r\x12\x11\n\tpicHeight\x18\x0b \x01(\r\x12\x0f\n\x07picType\x18\x0c \x01(\r\x12\x10\n\x08\x62uildVer\x18\r \x01(\x0c\x12\x0f\n\x07innerIp\x18\x0e \x01(\r\x12\x12\n\nappPicType\x18\x0f \x01(\r\x12\x13\n\x0boriginalPic\x18\x10 \x01(\r\x12\x11\n\tfileIndex\x18\x11 \x01(\x0c\x12\x0e\n\x06\x64stUin\x18\x12 \x01(\x04\x12\x11\n\tsrvUpload\x18\x13 \x01(\r\x12\x13\n\x0btransferUrl\x18\x14 \x01(\x0c\x12\x15\n\rqqmeetGuildId\x18\x15 \x01(\x04\x12\x17\n\x0fqqmeetChannelId\x18\x16 \x01(\x04\"\xcf\x02\n\x0f\x44\x33\x38\x38TryUpImgRsp\x12\x0e\n\x06\x66ileId\x18\x01 \x01(\x04\x12\x0e\n\x06result\x18\x02 \x01(\r\x12\x0f\n\x07\x66\x61ilMsg\x18\x03 \x01(\x0c\x12\x10\n\x08\x66ileExit\x18\x04 \x01(\x08\x12\x19\n\x07imgInfo\x18\x05 \x01(\x0b\x32\x08.ImgInfo\x12\x0c\n\x04upIp\x18\x06 \x03(\r\x12\x0e\n\x06upPort\x18\x07 \x03(\r\x12\x0e\n\x06upUkey\x18\x08 \x01(\x0c\x12\x0e\n\x06\x66ileid\x18\t \x01(\x04\x12\x10\n\x08upOffset\x18\n \x01(\x04\x12\x11\n\tblockSize\x18\x0b \x01(\x04\x12\x12\n\nnewBigChan\x18\x0c \x01(\x08\x12\x18\n\x05upIp6\x18\x1a \x03(\x0b\x32\t.IPv6Info\x12\x11\n\tclientIp6\x18\x1b \x01(\x0c\x12\x15\n\rdownloadIndex\x18\x1c \x01(\x0c\x12#\n\tinfo4Busi\x18\xe9\x07 \x01(\x0b\x32\x0f.TryUpInfo4Busi\"z\n\x0eTryUpInfo4Busi\x12\x12\n\ndownDomain\x18\x01 \x01(\x0c\x12\x14\n\x0cthumbDownUrl\x18\x02 \x01(\x0c\x12\x17\n\x0foriginalDownUrl\x18\x03 \x01(\x0c\x12\x12\n\nbigDownUrl\x18\x04 \x01(\x0c\x12\x11\n\tfileResid\x18\x05 \x01(\x0c\"\xa7\x02\n\x0bTryUpPttReq\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0e\n\x06srcUin\x18\x02 \x01(\x04\x12\x0e\n\x06\x66ileId\x18\x03 \x01(\x04\x12\x0f\n\x07\x66ileMd5\x18\x04 \x01(\x0c\x12\x10\n\x08\x66ileSize\x18\x05 \x01(\x04\x12\x10\n\x08\x66ileName\x18\x06 \x01(\x0c\x12\x0f\n\x07srcTerm\x18\x07 \x01(\r\x12\x14\n\x0cplatformType\x18\x08 \x01(\r\x12\x0e\n\x06\x62uType\x18\t \x01(\r\x12\x10\n\x08\x62uildVer\x18\n \x01(\x0c\x12\x0f\n\x07innerIp\x18\x0b \x01(\r\x12\x13\n\x0bvoiceLength\x18\x0c \x01(\r\x12\x11\n\tnewUpChan\x18\r \x01(\x08\x12\r\n\x05\x63odec\x18\x0e \x01(\r\x12\x11\n\tvoiceType\x18\x0f \x01(\r\x12\x0c\n\x04\x62uId\x18\x10 \x01(\r\"\x86\x02\n\x0bTryUpPttRsp\x12\x0e\n\x06\x66ileId\x18\x01 \x01(\x04\x12\x0e\n\x06result\x18\x02 \x01(\r\x12\x0f\n\x07\x66\x61ilMsg\x18\x03 \x01(\x0c\x12\x10\n\x08\x66ileExit\x18\x04 \x01(\x08\x12\x0c\n\x04upIp\x18\x05 \x03(\r\x12\x0e\n\x06upPort\x18\x06 \x03(\r\x12\x0e\n\x06upUkey\x18\x07 \x01(\x0c\x12\x0e\n\x06\x66ileid\x18\x08 \x01(\x04\x12\x10\n\x08upOffset\x18\t \x01(\x04\x12\x11\n\tblockSize\x18\n \x01(\x04\x12\x0f\n\x07\x66ileKey\x18\x0b \x01(\x0c\x12\x13\n\x0b\x63hannelType\x18\x0c \x01(\r\x12\x18\n\x05upIp6\x18\x1a \x03(\x0b\x32\t.IPv6Info\x12\x11\n\tclientIp6\x18\x1b \x01(\x0c\x42-Z+github.com/Mrs4s/MiraiGo/client/pb/cmd0x388')
-
-
-
-_DELIMGREQ = DESCRIPTOR.message_types_by_name['DelImgReq']
-_DELIMGRSP = DESCRIPTOR.message_types_by_name['DelImgRsp']
-_EXPROAMEXTENDINFO = DESCRIPTOR.message_types_by_name['ExpRoamExtendInfo']
-_EXPROAMPICINFO = DESCRIPTOR.message_types_by_name['ExpRoamPicInfo']
-_EXTENSIONCOMMPICTRYUP = DESCRIPTOR.message_types_by_name['ExtensionCommPicTryUp']
-_EXTENSIONEXPROAMTRYUP = DESCRIPTOR.message_types_by_name['ExtensionExpRoamTryUp']
-_GETIMGURLREQ = DESCRIPTOR.message_types_by_name['GetImgUrlReq']
-_GETIMGURLRSP = DESCRIPTOR.message_types_by_name['GetImgUrlRsp']
-_GETPTTURLREQ = DESCRIPTOR.message_types_by_name['GetPttUrlReq']
-_GETPTTURLRSP = DESCRIPTOR.message_types_by_name['GetPttUrlRsp']
-_IPV6INFO = DESCRIPTOR.message_types_by_name['IPv6Info']
-_IMGINFO = DESCRIPTOR.message_types_by_name['ImgInfo']
-_PICSIZE = DESCRIPTOR.message_types_by_name['PicSize']
-_D388REQBODY = DESCRIPTOR.message_types_by_name['D388ReqBody']
-_D388RSPBODY = DESCRIPTOR.message_types_by_name['D388RspBody']
-_TRYUPIMGREQ = DESCRIPTOR.message_types_by_name['TryUpImgReq']
-_D388TRYUPIMGRSP = DESCRIPTOR.message_types_by_name['D388TryUpImgRsp']
-_TRYUPINFO4BUSI = DESCRIPTOR.message_types_by_name['TryUpInfo4Busi']
-_TRYUPPTTREQ = DESCRIPTOR.message_types_by_name['TryUpPttReq']
-_TRYUPPTTRSP = DESCRIPTOR.message_types_by_name['TryUpPttRsp']
-DelImgReq = _reflection.GeneratedProtocolMessageType('DelImgReq', (_message.Message,), {
-  'DESCRIPTOR' : _DELIMGREQ,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:DelImgReq)
-  })
-_sym_db.RegisterMessage(DelImgReq)
-
-DelImgRsp = _reflection.GeneratedProtocolMessageType('DelImgRsp', (_message.Message,), {
-  'DESCRIPTOR' : _DELIMGRSP,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:DelImgRsp)
-  })
-_sym_db.RegisterMessage(DelImgRsp)
-
-ExpRoamExtendInfo = _reflection.GeneratedProtocolMessageType('ExpRoamExtendInfo', (_message.Message,), {
-  'DESCRIPTOR' : _EXPROAMEXTENDINFO,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:ExpRoamExtendInfo)
-  })
-_sym_db.RegisterMessage(ExpRoamExtendInfo)
-
-ExpRoamPicInfo = _reflection.GeneratedProtocolMessageType('ExpRoamPicInfo', (_message.Message,), {
-  'DESCRIPTOR' : _EXPROAMPICINFO,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:ExpRoamPicInfo)
-  })
-_sym_db.RegisterMessage(ExpRoamPicInfo)
-
-ExtensionCommPicTryUp = _reflection.GeneratedProtocolMessageType('ExtensionCommPicTryUp', (_message.Message,), {
-  'DESCRIPTOR' : _EXTENSIONCOMMPICTRYUP,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:ExtensionCommPicTryUp)
-  })
-_sym_db.RegisterMessage(ExtensionCommPicTryUp)
-
-ExtensionExpRoamTryUp = _reflection.GeneratedProtocolMessageType('ExtensionExpRoamTryUp', (_message.Message,), {
-  'DESCRIPTOR' : _EXTENSIONEXPROAMTRYUP,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:ExtensionExpRoamTryUp)
-  })
-_sym_db.RegisterMessage(ExtensionExpRoamTryUp)
-
-GetImgUrlReq = _reflection.GeneratedProtocolMessageType('GetImgUrlReq', (_message.Message,), {
-  'DESCRIPTOR' : _GETIMGURLREQ,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:GetImgUrlReq)
-  })
-_sym_db.RegisterMessage(GetImgUrlReq)
-
-GetImgUrlRsp = _reflection.GeneratedProtocolMessageType('GetImgUrlRsp', (_message.Message,), {
-  'DESCRIPTOR' : _GETIMGURLRSP,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:GetImgUrlRsp)
-  })
-_sym_db.RegisterMessage(GetImgUrlRsp)
-
-GetPttUrlReq = _reflection.GeneratedProtocolMessageType('GetPttUrlReq', (_message.Message,), {
-  'DESCRIPTOR' : _GETPTTURLREQ,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:GetPttUrlReq)
-  })
-_sym_db.RegisterMessage(GetPttUrlReq)
-
-GetPttUrlRsp = _reflection.GeneratedProtocolMessageType('GetPttUrlRsp', (_message.Message,), {
-  'DESCRIPTOR' : _GETPTTURLRSP,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:GetPttUrlRsp)
-  })
-_sym_db.RegisterMessage(GetPttUrlRsp)
-
-IPv6Info = _reflection.GeneratedProtocolMessageType('IPv6Info', (_message.Message,), {
-  'DESCRIPTOR' : _IPV6INFO,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:IPv6Info)
-  })
-_sym_db.RegisterMessage(IPv6Info)
-
-ImgInfo = _reflection.GeneratedProtocolMessageType('ImgInfo', (_message.Message,), {
-  'DESCRIPTOR' : _IMGINFO,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:ImgInfo)
-  })
-_sym_db.RegisterMessage(ImgInfo)
-
-PicSize = _reflection.GeneratedProtocolMessageType('PicSize', (_message.Message,), {
-  'DESCRIPTOR' : _PICSIZE,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:PicSize)
-  })
-_sym_db.RegisterMessage(PicSize)
-
-D388ReqBody = _reflection.GeneratedProtocolMessageType('D388ReqBody', (_message.Message,), {
-  'DESCRIPTOR' : _D388REQBODY,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:D388ReqBody)
-  })
-_sym_db.RegisterMessage(D388ReqBody)
-
-D388RspBody = _reflection.GeneratedProtocolMessageType('D388RspBody', (_message.Message,), {
-  'DESCRIPTOR' : _D388RSPBODY,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:D388RspBody)
-  })
-_sym_db.RegisterMessage(D388RspBody)
-
-TryUpImgReq = _reflection.GeneratedProtocolMessageType('TryUpImgReq', (_message.Message,), {
-  'DESCRIPTOR' : _TRYUPIMGREQ,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:TryUpImgReq)
-  })
-_sym_db.RegisterMessage(TryUpImgReq)
-
-D388TryUpImgRsp = _reflection.GeneratedProtocolMessageType('D388TryUpImgRsp', (_message.Message,), {
-  'DESCRIPTOR' : _D388TRYUPIMGRSP,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:D388TryUpImgRsp)
-  })
-_sym_db.RegisterMessage(D388TryUpImgRsp)
-
-TryUpInfo4Busi = _reflection.GeneratedProtocolMessageType('TryUpInfo4Busi', (_message.Message,), {
-  'DESCRIPTOR' : _TRYUPINFO4BUSI,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:TryUpInfo4Busi)
-  })
-_sym_db.RegisterMessage(TryUpInfo4Busi)
-
-TryUpPttReq = _reflection.GeneratedProtocolMessageType('TryUpPttReq', (_message.Message,), {
-  'DESCRIPTOR' : _TRYUPPTTREQ,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:TryUpPttReq)
-  })
-_sym_db.RegisterMessage(TryUpPttReq)
-
-TryUpPttRsp = _reflection.GeneratedProtocolMessageType('TryUpPttRsp', (_message.Message,), {
-  'DESCRIPTOR' : _TRYUPPTTRSP,
-  '__module__' : 'cmd0x388_pb2'
-  # @@protoc_insertion_point(class_scope:TryUpPttRsp)
-  })
-_sym_db.RegisterMessage(TryUpPttRsp)
-
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  DESCRIPTOR._serialized_options = b'Z+github.com/Mrs4s/MiraiGo/client/pb/cmd0x388'
-  _DELIMGREQ._serialized_start=19
-  _DELIMGREQ._serialized_end=194
-  _DELIMGRSP._serialized_start=196
-  _DELIMGRSP._serialized_end=259
-  _EXPROAMEXTENDINFO._serialized_start=261
-  _EXPROAMEXTENDINFO._serialized_end=295
-  _EXPROAMPICINFO._serialized_start=297
-  _EXPROAMPICINFO._serialized_end=361
-  _EXTENSIONCOMMPICTRYUP._serialized_start=363
-  _EXTENSIONCOMMPICTRYUP._serialized_end=403
-  _EXTENSIONEXPROAMTRYUP._serialized_start=405
-  _EXTENSIONEXPROAMTRYUP._serialized_end=469
-  _GETIMGURLREQ._serialized_start=472
-  _GETIMGURLREQ._serialized_end=930
-  _GETIMGURLRSP._serialized_start=933
-  _GETIMGURLRSP._serialized_end=1387
-  _GETPTTURLREQ._serialized_start=1390
-  _GETPTTURLREQ._serialized_end=1668
-  _GETPTTURLRSP._serialized_start=1671
-  _GETPTTURLRSP._serialized_end=1961
-  _IPV6INFO._serialized_start=1963
-  _IPV6INFO._serialized_end=2000
-  _IMGINFO._serialized_start=2002
-  _IMGINFO._serialized_end=2103
-  _PICSIZE._serialized_start=2105
-  _PICSIZE._serialized_end=2161
-  _D388REQBODY._serialized_start=2164
-  _D388REQBODY._serialized_end=2424
-  _D388RSPBODY._serialized_start=2427
-  _D388RSPBODY._serialized_end=2653
-  _TRYUPIMGREQ._serialized_start=2656
-  _TRYUPIMGREQ._serialized_end=3081
-  _D388TRYUPIMGRSP._serialized_start=3084
-  _D388TRYUPIMGRSP._serialized_end=3419
-  _TRYUPINFO4BUSI._serialized_start=3421
-  _TRYUPINFO4BUSI._serialized_end=3543
-  _TRYUPPTTREQ._serialized_start=3546
-  _TRYUPPTTREQ._serialized_end=3841
-  _TRYUPPTTRSP._serialized_start=3844
-  _TRYUPPTTRSP._serialized_end=4106
-# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.pyi b/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.pyi
deleted file mode 100644
index 49ccf026..00000000
--- a/cai/pb/im/oidb/cmd0x388/cmd0x388_pb2.pyi
+++ /dev/null
@@ -1,799 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-"""
-from builtins import (
-    bool,
-    bytes,
-    int,
-)
-
-from google.protobuf.descriptor import (
-    Descriptor,
-    FileDescriptor,
-)
-
-from google.protobuf.internal.containers import (
-    RepeatedCompositeFieldContainer,
-    RepeatedScalarFieldContainer,
-)
-
-from google.protobuf.message import (
-    Message,
-)
-
-from typing import (
-    Iterable,
-    Optional,
-    Text,
-)
-
-from typing_extensions import (
-    Literal,
-)
-
-
-DESCRIPTOR: FileDescriptor
-
-class DelImgReq(Message):
-    DESCRIPTOR: Descriptor
-    SRCUIN_FIELD_NUMBER: int
-    DSTUIN_FIELD_NUMBER: int
-    REQTERM_FIELD_NUMBER: int
-    REQPLATFORMTYPE_FIELD_NUMBER: int
-    BUTYPE_FIELD_NUMBER: int
-    BUILDVER_FIELD_NUMBER: int
-    FILERESID_FIELD_NUMBER: int
-    PICWIDTH_FIELD_NUMBER: int
-    PICHEIGHT_FIELD_NUMBER: int
-    srcUin: int
-    dstUin: int
-    reqTerm: int
-    reqPlatformType: int
-    buType: int
-    buildVer: bytes
-    fileResid: bytes
-    picWidth: int
-    picHeight: int
-    def __init__(self,
-        *,
-        srcUin: Optional[int] = ...,
-        dstUin: Optional[int] = ...,
-        reqTerm: Optional[int] = ...,
-        reqPlatformType: Optional[int] = ...,
-        buType: Optional[int] = ...,
-        buildVer: Optional[bytes] = ...,
-        fileResid: Optional[bytes] = ...,
-        picWidth: Optional[int] = ...,
-        picHeight: Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["buType",b"buType","buildVer",b"buildVer","dstUin",b"dstUin","fileResid",b"fileResid","picHeight",b"picHeight","picWidth",b"picWidth","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","srcUin",b"srcUin"]) -> bool: ...
-    def ClearField(self, field_name: Literal["buType",b"buType","buildVer",b"buildVer","dstUin",b"dstUin","fileResid",b"fileResid","picHeight",b"picHeight","picWidth",b"picWidth","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","srcUin",b"srcUin"]) -> None: ...
-
-class DelImgRsp(Message):
-    DESCRIPTOR: Descriptor
-    RESULT_FIELD_NUMBER: int
-    FAILMSG_FIELD_NUMBER: int
-    FILERESID_FIELD_NUMBER: int
-    result: int
-    failMsg: bytes
-    fileResid: bytes
-    def __init__(self,
-        *,
-        result: Optional[int] = ...,
-        failMsg: Optional[bytes] = ...,
-        fileResid: Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["failMsg",b"failMsg","fileResid",b"fileResid","result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal["failMsg",b"failMsg","fileResid",b"fileResid","result",b"result"]) -> None: ...
-
-class ExpRoamExtendInfo(Message):
-    DESCRIPTOR: Descriptor
-    RESID_FIELD_NUMBER: int
-    resid: bytes
-    def __init__(self,
-        *,
-        resid: Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["resid",b"resid"]) -> bool: ...
-    def ClearField(self, field_name: Literal["resid",b"resid"]) -> None: ...
-
-class ExpRoamPicInfo(Message):
-    DESCRIPTOR: Descriptor
-    SHOPFLAG_FIELD_NUMBER: int
-    PKGID_FIELD_NUMBER: int
-    PICID_FIELD_NUMBER: int
-    shopFlag: int
-    pkgId: int
-    picId: bytes
-    def __init__(self,
-        *,
-        shopFlag: Optional[int] = ...,
-        pkgId: Optional[int] = ...,
-        picId: Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["picId",b"picId","pkgId",b"pkgId","shopFlag",b"shopFlag"]) -> bool: ...
-    def ClearField(self, field_name: Literal["picId",b"picId","pkgId",b"pkgId","shopFlag",b"shopFlag"]) -> None: ...
-
-class ExtensionCommPicTryUp(Message):
-    DESCRIPTOR: Descriptor
-    EXTINFO_FIELD_NUMBER: int
-    @property
-    def extinfo(self) -> RepeatedScalarFieldContainer[bytes]: ...
-    def __init__(self,
-        *,
-        extinfo: Optional[Iterable[bytes]] = ...,
-        ) -> None: ...
-    def ClearField(self, field_name: Literal["extinfo",b"extinfo"]) -> None: ...
-
-class ExtensionExpRoamTryUp(Message):
-    DESCRIPTOR: Descriptor
-    EXPROAMPICINFO_FIELD_NUMBER: int
-    @property
-    def exproamPicInfo(self) -> RepeatedCompositeFieldContainer[ExpRoamPicInfo]: ...
-    def __init__(self,
-        *,
-        exproamPicInfo: Optional[Iterable[ExpRoamPicInfo]] = ...,
-        ) -> None: ...
-    def ClearField(self, field_name: Literal["exproamPicInfo",b"exproamPicInfo"]) -> None: ...
-
-class GetImgUrlReq(Message):
-    DESCRIPTOR: Descriptor
-    GROUPCODE_FIELD_NUMBER: int
-    DSTUIN_FIELD_NUMBER: int
-    FILEID_FIELD_NUMBER: int
-    FILEMD5_FIELD_NUMBER: int
-    URLFLAG_FIELD_NUMBER: int
-    URLTYPE_FIELD_NUMBER: int
-    REQTERM_FIELD_NUMBER: int
-    REQPLATFORMTYPE_FIELD_NUMBER: int
-    INNERIP_FIELD_NUMBER: int
-    BUTYPE_FIELD_NUMBER: int
-    BUILDVER_FIELD_NUMBER: int
-    FILEID_FIELD_NUMBER: int
-    FILESIZE_FIELD_NUMBER: int
-    ORIGINALPIC_FIELD_NUMBER: int
-    RETRYREQ_FIELD_NUMBER: int
-    FILEHEIGHT_FIELD_NUMBER: int
-    FILEWIDTH_FIELD_NUMBER: int
-    PICTYPE_FIELD_NUMBER: int
-    PICUPTIMESTAMP_FIELD_NUMBER: int
-    REQTRANSFERTYPE_FIELD_NUMBER: int
-    QQMEETGUILDID_FIELD_NUMBER: int
-    QQMEETCHANNELID_FIELD_NUMBER: int
-    DOWNLOADINDEX_FIELD_NUMBER: int
-    groupCode: int
-    dstUin: int
-    fileid: int
-    fileMd5: bytes
-    urlFlag: int
-    urlType: int
-    reqTerm: int
-    reqPlatformType: int
-    innerIp: int
-    buType: int
-    buildVer: bytes
-    fileId: int
-    fileSize: int
-    originalPic: int
-    retryReq: int
-    fileHeight: int
-    fileWidth: int
-    picType: int
-    picUpTimestamp: int
-    reqTransferType: int
-    qqmeetGuildId: int
-    qqmeetChannelId: int
-    downloadIndex: bytes
-    def __init__(self,
-        *,
-        groupCode: Optional[int] = ...,
-        dstUin: Optional[int] = ...,
-        fileid: Optional[int] = ...,
-        fileMd5: Optional[bytes] = ...,
-        urlFlag: Optional[int] = ...,
-        urlType: Optional[int] = ...,
-        reqTerm: Optional[int] = ...,
-        reqPlatformType: Optional[int] = ...,
-        innerIp: Optional[int] = ...,
-        buType: Optional[int] = ...,
-        buildVer: Optional[bytes] = ...,
-        fileId: Optional[int] = ...,
-        fileSize: Optional[int] = ...,
-        originalPic: Optional[int] = ...,
-        retryReq: Optional[int] = ...,
-        fileHeight: Optional[int] = ...,
-        fileWidth: Optional[int] = ...,
-        picType: Optional[int] = ...,
-        picUpTimestamp: Optional[int] = ...,
-        reqTransferType: Optional[int] = ...,
-        qqmeetGuildId: Optional[int] = ...,
-        qqmeetChannelId: Optional[int] = ...,
-        downloadIndex: Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["buType",b"buType","buildVer",b"buildVer","downloadIndex",b"downloadIndex","dstUin",b"dstUin","fileHeight",b"fileHeight","fileId",b"fileId","fileMd5",b"fileMd5","fileSize",b"fileSize","fileWidth",b"fileWidth","fileid",b"fileid","groupCode",b"groupCode","innerIp",b"innerIp","originalPic",b"originalPic","picType",b"picType","picUpTimestamp",b"picUpTimestamp","qqmeetChannelId",b"qqmeetChannelId","qqmeetGuildId",b"qqmeetGuildId","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","reqTransferType",b"reqTransferType","retryReq",b"retryReq","urlFlag",b"urlFlag","urlType",b"urlType"]) -> bool: ...
-    def ClearField(self, field_name: Literal["buType",b"buType","buildVer",b"buildVer","downloadIndex",b"downloadIndex","dstUin",b"dstUin","fileHeight",b"fileHeight","fileId",b"fileId","fileMd5",b"fileMd5","fileSize",b"fileSize","fileWidth",b"fileWidth","fileid",b"fileid","groupCode",b"groupCode","innerIp",b"innerIp","originalPic",b"originalPic","picType",b"picType","picUpTimestamp",b"picUpTimestamp","qqmeetChannelId",b"qqmeetChannelId","qqmeetGuildId",b"qqmeetGuildId","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","reqTransferType",b"reqTransferType","retryReq",b"retryReq","urlFlag",b"urlFlag","urlType",b"urlType"]) -> None: ...
-
-class GetImgUrlRsp(Message):
-    DESCRIPTOR: Descriptor
-    FILEID_FIELD_NUMBER: int
-    FILEMD5_FIELD_NUMBER: int
-    RESULT_FIELD_NUMBER: int
-    FAILMSG_FIELD_NUMBER: int
-    IMGINFO_FIELD_NUMBER: int
-    THUMBDOWNURL_FIELD_NUMBER: int
-    ORIGINALDOWNURL_FIELD_NUMBER: int
-    BIGDOWNURL_FIELD_NUMBER: int
-    DOWNIP_FIELD_NUMBER: int
-    DOWNPORT_FIELD_NUMBER: int
-    DOWNDOMAIN_FIELD_NUMBER: int
-    THUMBDOWNPARA_FIELD_NUMBER: int
-    ORIGINALDOWNPARA_FIELD_NUMBER: int
-    BIGDOWNPARA_FIELD_NUMBER: int
-    FILEID_FIELD_NUMBER: int
-    AUTODOWNTYPE_FIELD_NUMBER: int
-    ORDERDOWNTYPE_FIELD_NUMBER: int
-    BIGTHUMBDOWNPARA_FIELD_NUMBER: int
-    HTTPSURLFLAG_FIELD_NUMBER: int
-    DOWNIP6_FIELD_NUMBER: int
-    CLIENTIP6_FIELD_NUMBER: int
-    fileid: int
-    fileMd5: bytes
-    result: int
-    failMsg: bytes
-    @property
-    def imgInfo(self) -> ImgInfo: ...
-    @property
-    def thumbDownUrl(self) -> RepeatedScalarFieldContainer[bytes]: ...
-    @property
-    def originalDownUrl(self) -> RepeatedScalarFieldContainer[bytes]: ...
-    @property
-    def bigDownUrl(self) -> RepeatedScalarFieldContainer[bytes]: ...
-    @property
-    def downIp(self) -> RepeatedScalarFieldContainer[int]: ...
-    @property
-    def downPort(self) -> RepeatedScalarFieldContainer[int]: ...
-    downDomain: bytes
-    thumbDownPara: bytes
-    originalDownPara: bytes
-    bigDownPara: bytes
-    fileId: int
-    autoDownType: int
-    @property
-    def orderDownType(self) -> RepeatedScalarFieldContainer[int]: ...
-    bigThumbDownPara: bytes
-    httpsUrlFlag: int
-    @property
-    def downIp6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
-    clientIp6: bytes
-    def __init__(self,
-        *,
-        fileid: Optional[int] = ...,
-        fileMd5: Optional[bytes] = ...,
-        result: Optional[int] = ...,
-        failMsg: Optional[bytes] = ...,
-        imgInfo: Optional[ImgInfo] = ...,
-        thumbDownUrl: Optional[Iterable[bytes]] = ...,
-        originalDownUrl: Optional[Iterable[bytes]] = ...,
-        bigDownUrl: Optional[Iterable[bytes]] = ...,
-        downIp: Optional[Iterable[int]] = ...,
-        downPort: Optional[Iterable[int]] = ...,
-        downDomain: Optional[bytes] = ...,
-        thumbDownPara: Optional[bytes] = ...,
-        originalDownPara: Optional[bytes] = ...,
-        bigDownPara: Optional[bytes] = ...,
-        fileId: Optional[int] = ...,
-        autoDownType: Optional[int] = ...,
-        orderDownType: Optional[Iterable[int]] = ...,
-        bigThumbDownPara: Optional[bytes] = ...,
-        httpsUrlFlag: Optional[int] = ...,
-        downIp6: Optional[Iterable[IPv6Info]] = ...,
-        clientIp6: Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["autoDownType",b"autoDownType","bigDownPara",b"bigDownPara","bigThumbDownPara",b"bigThumbDownPara","clientIp6",b"clientIp6","downDomain",b"downDomain","failMsg",b"failMsg","fileId",b"fileId","fileMd5",b"fileMd5","fileid",b"fileid","httpsUrlFlag",b"httpsUrlFlag","imgInfo",b"imgInfo","originalDownPara",b"originalDownPara","result",b"result","thumbDownPara",b"thumbDownPara"]) -> bool: ...
-    def ClearField(self, field_name: Literal["autoDownType",b"autoDownType","bigDownPara",b"bigDownPara","bigDownUrl",b"bigDownUrl","bigThumbDownPara",b"bigThumbDownPara","clientIp6",b"clientIp6","downDomain",b"downDomain","downIp",b"downIp","downIp6",b"downIp6","downPort",b"downPort","failMsg",b"failMsg","fileId",b"fileId","fileMd5",b"fileMd5","fileid",b"fileid","httpsUrlFlag",b"httpsUrlFlag","imgInfo",b"imgInfo","orderDownType",b"orderDownType","originalDownPara",b"originalDownPara","originalDownUrl",b"originalDownUrl","result",b"result","thumbDownPara",b"thumbDownPara","thumbDownUrl",b"thumbDownUrl"]) -> None: ...
-
-class GetPttUrlReq(Message):
-    DESCRIPTOR: Descriptor
-    GROUPCODE_FIELD_NUMBER: int
-    DSTUIN_FIELD_NUMBER: int
-    FILEID_FIELD_NUMBER: int
-    FILEMD5_FIELD_NUMBER: int
-    REQTERM_FIELD_NUMBER: int
-    REQPLATFORMTYPE_FIELD_NUMBER: int
-    INNERIP_FIELD_NUMBER: int
-    BUTYPE_FIELD_NUMBER: int
-    BUILDVER_FIELD_NUMBER: int
-    FILEID_FIELD_NUMBER: int
-    FILEKEY_FIELD_NUMBER: int
-    CODEC_FIELD_NUMBER: int
-    BUID_FIELD_NUMBER: int
-    REQTRANSFERTYPE_FIELD_NUMBER: int
-    ISAUTO_FIELD_NUMBER: int
-    groupCode: int
-    dstUin: int
-    fileid: int
-    fileMd5: bytes
-    reqTerm: int
-    reqPlatformType: int
-    innerIp: int
-    buType: int
-    buildVer: bytes
-    fileId: int
-    fileKey: bytes
-    codec: int
-    buId: int
-    reqTransferType: int
-    isAuto: int
-    def __init__(self,
-        *,
-        groupCode: Optional[int] = ...,
-        dstUin: Optional[int] = ...,
-        fileid: Optional[int] = ...,
-        fileMd5: Optional[bytes] = ...,
-        reqTerm: Optional[int] = ...,
-        reqPlatformType: Optional[int] = ...,
-        innerIp: Optional[int] = ...,
-        buType: Optional[int] = ...,
-        buildVer: Optional[bytes] = ...,
-        fileId: Optional[int] = ...,
-        fileKey: Optional[bytes] = ...,
-        codec: Optional[int] = ...,
-        buId: Optional[int] = ...,
-        reqTransferType: Optional[int] = ...,
-        isAuto: Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["buId",b"buId","buType",b"buType","buildVer",b"buildVer","codec",b"codec","dstUin",b"dstUin","fileId",b"fileId","fileKey",b"fileKey","fileMd5",b"fileMd5","fileid",b"fileid","groupCode",b"groupCode","innerIp",b"innerIp","isAuto",b"isAuto","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","reqTransferType",b"reqTransferType"]) -> bool: ...
-    def ClearField(self, field_name: Literal["buId",b"buId","buType",b"buType","buildVer",b"buildVer","codec",b"codec","dstUin",b"dstUin","fileId",b"fileId","fileKey",b"fileKey","fileMd5",b"fileMd5","fileid",b"fileid","groupCode",b"groupCode","innerIp",b"innerIp","isAuto",b"isAuto","reqPlatformType",b"reqPlatformType","reqTerm",b"reqTerm","reqTransferType",b"reqTransferType"]) -> None: ...
-
-class GetPttUrlRsp(Message):
-    DESCRIPTOR: Descriptor
-    FILEID_FIELD_NUMBER: int
-    FILEMD5_FIELD_NUMBER: int
-    RESULT_FIELD_NUMBER: int
-    FAILMSG_FIELD_NUMBER: int
-    DOWNURL_FIELD_NUMBER: int
-    DOWNIP_FIELD_NUMBER: int
-    DOWNPORT_FIELD_NUMBER: int
-    DOWNDOMAIN_FIELD_NUMBER: int
-    DOWNPARA_FIELD_NUMBER: int
-    FILEID_FIELD_NUMBER: int
-    TRANSFERTYPE_FIELD_NUMBER: int
-    ALLOWRETRY_FIELD_NUMBER: int
-    DOWNIP6_FIELD_NUMBER: int
-    CLIENTIP6_FIELD_NUMBER: int
-    DOMAIN_FIELD_NUMBER: int
-    fileid: int
-    fileMd5: bytes
-    result: int
-    failMsg: bytes
-    @property
-    def downUrl(self) -> RepeatedScalarFieldContainer[bytes]: ...
-    @property
-    def downIp(self) -> RepeatedScalarFieldContainer[int]: ...
-    @property
-    def downPort(self) -> RepeatedScalarFieldContainer[int]: ...
-    downDomain: bytes
-    downPara: bytes
-    fileId: int
-    transferType: int
-    allowRetry: int
-    @property
-    def downIp6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
-    clientIp6: bytes
-    domain: Text
-    def __init__(self,
-        *,
-        fileid: Optional[int] = ...,
-        fileMd5: Optional[bytes] = ...,
-        result: Optional[int] = ...,
-        failMsg: Optional[bytes] = ...,
-        downUrl: Optional[Iterable[bytes]] = ...,
-        downIp: Optional[Iterable[int]] = ...,
-        downPort: Optional[Iterable[int]] = ...,
-        downDomain: Optional[bytes] = ...,
-        downPara: Optional[bytes] = ...,
-        fileId: Optional[int] = ...,
-        transferType: Optional[int] = ...,
-        allowRetry: Optional[int] = ...,
-        downIp6: Optional[Iterable[IPv6Info]] = ...,
-        clientIp6: Optional[bytes] = ...,
-        domain: Optional[Text] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["allowRetry",b"allowRetry","clientIp6",b"clientIp6","domain",b"domain","downDomain",b"downDomain","downPara",b"downPara","failMsg",b"failMsg","fileId",b"fileId","fileMd5",b"fileMd5","fileid",b"fileid","result",b"result","transferType",b"transferType"]) -> bool: ...
-    def ClearField(self, field_name: Literal["allowRetry",b"allowRetry","clientIp6",b"clientIp6","domain",b"domain","downDomain",b"downDomain","downIp",b"downIp","downIp6",b"downIp6","downPara",b"downPara","downPort",b"downPort","downUrl",b"downUrl","failMsg",b"failMsg","fileId",b"fileId","fileMd5",b"fileMd5","fileid",b"fileid","result",b"result","transferType",b"transferType"]) -> None: ...
-
-class IPv6Info(Message):
-    DESCRIPTOR: Descriptor
-    IP6_FIELD_NUMBER: int
-    PORT_FIELD_NUMBER: int
-    ip6: bytes
-    port: int
-    def __init__(self,
-        *,
-        ip6: Optional[bytes] = ...,
-        port: Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["ip6",b"ip6","port",b"port"]) -> bool: ...
-    def ClearField(self, field_name: Literal["ip6",b"ip6","port",b"port"]) -> None: ...
-
-class ImgInfo(Message):
-    DESCRIPTOR: Descriptor
-    FILEMD5_FIELD_NUMBER: int
-    FILETYPE_FIELD_NUMBER: int
-    FILESIZE_FIELD_NUMBER: int
-    FILEWIDTH_FIELD_NUMBER: int
-    FILEHEIGHT_FIELD_NUMBER: int
-    fileMd5: bytes
-    fileType: int
-    fileSize: int
-    fileWidth: int
-    fileHeight: int
-    def __init__(self,
-        *,
-        fileMd5: Optional[bytes] = ...,
-        fileType: Optional[int] = ...,
-        fileSize: Optional[int] = ...,
-        fileWidth: Optional[int] = ...,
-        fileHeight: Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["fileHeight",b"fileHeight","fileMd5",b"fileMd5","fileSize",b"fileSize","fileType",b"fileType","fileWidth",b"fileWidth"]) -> bool: ...
-    def ClearField(self, field_name: Literal["fileHeight",b"fileHeight","fileMd5",b"fileMd5","fileSize",b"fileSize","fileType",b"fileType","fileWidth",b"fileWidth"]) -> None: ...
-
-class PicSize(Message):
-    DESCRIPTOR: Descriptor
-    ORIGINAL_FIELD_NUMBER: int
-    THUMB_FIELD_NUMBER: int
-    HIGH_FIELD_NUMBER: int
-    original: int
-    thumb: int
-    high: int
-    def __init__(self,
-        *,
-        original: Optional[int] = ...,
-        thumb: Optional[int] = ...,
-        high: Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["high",b"high","original",b"original","thumb",b"thumb"]) -> bool: ...
-    def ClearField(self, field_name: Literal["high",b"high","original",b"original","thumb",b"thumb"]) -> None: ...
-
-class D388ReqBody(Message):
-    DESCRIPTOR: Descriptor
-    NETTYPE_FIELD_NUMBER: int
-    SUBCMD_FIELD_NUMBER: int
-    TRYUPIMGREQ_FIELD_NUMBER: int
-    GETIMGURLREQ_FIELD_NUMBER: int
-    TRYUPPTTREQ_FIELD_NUMBER: int
-    GETPTTURLREQ_FIELD_NUMBER: int
-    COMMANDID_FIELD_NUMBER: int
-    DELIMGREQ_FIELD_NUMBER: int
-    EXTENSION_FIELD_NUMBER: int
-    netType: int
-    subcmd: int
-    @property
-    def tryupImgReq(self) -> RepeatedCompositeFieldContainer[TryUpImgReq]: ...
-    @property
-    def getimgUrlReq(self) -> RepeatedCompositeFieldContainer[GetImgUrlReq]: ...
-    @property
-    def tryupPttReq(self) -> RepeatedCompositeFieldContainer[TryUpPttReq]: ...
-    @property
-    def getpttUrlReq(self) -> RepeatedCompositeFieldContainer[GetPttUrlReq]: ...
-    commandId: int
-    @property
-    def delImgReq(self) -> RepeatedCompositeFieldContainer[DelImgReq]: ...
-    extension: bytes
-    def __init__(self,
-        *,
-        netType: Optional[int] = ...,
-        subcmd: Optional[int] = ...,
-        tryupImgReq: Optional[Iterable[TryUpImgReq]] = ...,
-        getimgUrlReq: Optional[Iterable[GetImgUrlReq]] = ...,
-        tryupPttReq: Optional[Iterable[TryUpPttReq]] = ...,
-        getpttUrlReq: Optional[Iterable[GetPttUrlReq]] = ...,
-        commandId: Optional[int] = ...,
-        delImgReq: Optional[Iterable[DelImgReq]] = ...,
-        extension: Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["commandId",b"commandId","extension",b"extension","netType",b"netType","subcmd",b"subcmd"]) -> bool: ...
-    def ClearField(self, field_name: Literal["commandId",b"commandId","delImgReq",b"delImgReq","extension",b"extension","getimgUrlReq",b"getimgUrlReq","getpttUrlReq",b"getpttUrlReq","netType",b"netType","subcmd",b"subcmd","tryupImgReq",b"tryupImgReq","tryupPttReq",b"tryupPttReq"]) -> None: ...
-
-class D388RspBody(Message):
-    DESCRIPTOR: Descriptor
-    CLIENTIP_FIELD_NUMBER: int
-    SUBCMD_FIELD_NUMBER: int
-    TRYUPIMGRSP_FIELD_NUMBER: int
-    GETIMGURLRSP_FIELD_NUMBER: int
-    TRYUPPTTRSP_FIELD_NUMBER: int
-    GETPTTURLRSP_FIELD_NUMBER: int
-    DELIMGRSP_FIELD_NUMBER: int
-    clientIp: int
-    subcmd: int
-    @property
-    def tryupImgRsp(self) -> RepeatedCompositeFieldContainer[D388TryUpImgRsp]: ...
-    @property
-    def getimgUrlRsp(self) -> RepeatedCompositeFieldContainer[GetImgUrlRsp]: ...
-    @property
-    def tryupPttRsp(self) -> RepeatedCompositeFieldContainer[TryUpPttRsp]: ...
-    @property
-    def getpttUrlRsp(self) -> RepeatedCompositeFieldContainer[GetPttUrlRsp]: ...
-    @property
-    def delImgRsp(self) -> RepeatedCompositeFieldContainer[DelImgRsp]: ...
-    def __init__(self,
-        *,
-        clientIp: Optional[int] = ...,
-        subcmd: Optional[int] = ...,
-        tryupImgRsp: Optional[Iterable[D388TryUpImgRsp]] = ...,
-        getimgUrlRsp: Optional[Iterable[GetImgUrlRsp]] = ...,
-        tryupPttRsp: Optional[Iterable[TryUpPttRsp]] = ...,
-        getpttUrlRsp: Optional[Iterable[GetPttUrlRsp]] = ...,
-        delImgRsp: Optional[Iterable[DelImgRsp]] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["clientIp",b"clientIp","subcmd",b"subcmd"]) -> bool: ...
-    def ClearField(self, field_name: Literal["clientIp",b"clientIp","delImgRsp",b"delImgRsp","getimgUrlRsp",b"getimgUrlRsp","getpttUrlRsp",b"getpttUrlRsp","subcmd",b"subcmd","tryupImgRsp",b"tryupImgRsp","tryupPttRsp",b"tryupPttRsp"]) -> None: ...
-
-class TryUpImgReq(Message):
-    DESCRIPTOR: Descriptor
-    GROUPCODE_FIELD_NUMBER: int
-    SRCUIN_FIELD_NUMBER: int
-    FILEID_FIELD_NUMBER: int
-    FILEMD5_FIELD_NUMBER: int
-    FILESIZE_FIELD_NUMBER: int
-    FILENAME_FIELD_NUMBER: int
-    SRCTERM_FIELD_NUMBER: int
-    PLATFORMTYPE_FIELD_NUMBER: int
-    BUTYPE_FIELD_NUMBER: int
-    PICWIDTH_FIELD_NUMBER: int
-    PICHEIGHT_FIELD_NUMBER: int
-    PICTYPE_FIELD_NUMBER: int
-    BUILDVER_FIELD_NUMBER: int
-    INNERIP_FIELD_NUMBER: int
-    APPPICTYPE_FIELD_NUMBER: int
-    ORIGINALPIC_FIELD_NUMBER: int
-    FILEINDEX_FIELD_NUMBER: int
-    DSTUIN_FIELD_NUMBER: int
-    SRVUPLOAD_FIELD_NUMBER: int
-    TRANSFERURL_FIELD_NUMBER: int
-    QQMEETGUILDID_FIELD_NUMBER: int
-    QQMEETCHANNELID_FIELD_NUMBER: int
-    groupCode: int
-    srcUin: int
-    fileId: int
-    fileMd5: bytes
-    fileSize: int
-    fileName: bytes
-    srcTerm: int
-    platformType: int
-    buType: int
-    picWidth: int
-    picHeight: int
-    picType: int
-    buildVer: bytes
-    innerIp: int
-    appPicType: int
-    originalPic: int
-    fileIndex: bytes
-    dstUin: int
-    srvUpload: int
-    transferUrl: bytes
-    qqmeetGuildId: int
-    qqmeetChannelId: int
-    def __init__(self,
-        *,
-        groupCode: Optional[int] = ...,
-        srcUin: Optional[int] = ...,
-        fileId: Optional[int] = ...,
-        fileMd5: Optional[bytes] = ...,
-        fileSize: Optional[int] = ...,
-        fileName: Optional[bytes] = ...,
-        srcTerm: Optional[int] = ...,
-        platformType: Optional[int] = ...,
-        buType: Optional[int] = ...,
-        picWidth: Optional[int] = ...,
-        picHeight: Optional[int] = ...,
-        picType: Optional[int] = ...,
-        buildVer: Optional[bytes] = ...,
-        innerIp: Optional[int] = ...,
-        appPicType: Optional[int] = ...,
-        originalPic: Optional[int] = ...,
-        fileIndex: Optional[bytes] = ...,
-        dstUin: Optional[int] = ...,
-        srvUpload: Optional[int] = ...,
-        transferUrl: Optional[bytes] = ...,
-        qqmeetGuildId: Optional[int] = ...,
-        qqmeetChannelId: Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["appPicType",b"appPicType","buType",b"buType","buildVer",b"buildVer","dstUin",b"dstUin","fileId",b"fileId","fileIndex",b"fileIndex","fileMd5",b"fileMd5","fileName",b"fileName","fileSize",b"fileSize","groupCode",b"groupCode","innerIp",b"innerIp","originalPic",b"originalPic","picHeight",b"picHeight","picType",b"picType","picWidth",b"picWidth","platformType",b"platformType","qqmeetChannelId",b"qqmeetChannelId","qqmeetGuildId",b"qqmeetGuildId","srcTerm",b"srcTerm","srcUin",b"srcUin","srvUpload",b"srvUpload","transferUrl",b"transferUrl"]) -> bool: ...
-    def ClearField(self, field_name: Literal["appPicType",b"appPicType","buType",b"buType","buildVer",b"buildVer","dstUin",b"dstUin","fileId",b"fileId","fileIndex",b"fileIndex","fileMd5",b"fileMd5","fileName",b"fileName","fileSize",b"fileSize","groupCode",b"groupCode","innerIp",b"innerIp","originalPic",b"originalPic","picHeight",b"picHeight","picType",b"picType","picWidth",b"picWidth","platformType",b"platformType","qqmeetChannelId",b"qqmeetChannelId","qqmeetGuildId",b"qqmeetGuildId","srcTerm",b"srcTerm","srcUin",b"srcUin","srvUpload",b"srvUpload","transferUrl",b"transferUrl"]) -> None: ...
-
-class D388TryUpImgRsp(Message):
-    DESCRIPTOR: Descriptor
-    FILEID_FIELD_NUMBER: int
-    RESULT_FIELD_NUMBER: int
-    FAILMSG_FIELD_NUMBER: int
-    FILEEXIT_FIELD_NUMBER: int
-    IMGINFO_FIELD_NUMBER: int
-    UPIP_FIELD_NUMBER: int
-    UPPORT_FIELD_NUMBER: int
-    UPUKEY_FIELD_NUMBER: int
-    FILEID_FIELD_NUMBER: int
-    UPOFFSET_FIELD_NUMBER: int
-    BLOCKSIZE_FIELD_NUMBER: int
-    NEWBIGCHAN_FIELD_NUMBER: int
-    UPIP6_FIELD_NUMBER: int
-    CLIENTIP6_FIELD_NUMBER: int
-    DOWNLOADINDEX_FIELD_NUMBER: int
-    INFO4BUSI_FIELD_NUMBER: int
-    fileId: int
-    result: int
-    failMsg: bytes
-    fileExit: bool
-    @property
-    def imgInfo(self) -> ImgInfo: ...
-    @property
-    def upIp(self) -> RepeatedScalarFieldContainer[int]: ...
-    @property
-    def upPort(self) -> RepeatedScalarFieldContainer[int]: ...
-    upUkey: bytes
-    fileid: int
-    upOffset: int
-    blockSize: int
-    newBigChan: bool
-    @property
-    def upIp6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
-    clientIp6: bytes
-    downloadIndex: bytes
-    @property
-    def info4Busi(self) -> TryUpInfo4Busi: ...
-    def __init__(self,
-        *,
-        fileId: Optional[int] = ...,
-        result: Optional[int] = ...,
-        failMsg: Optional[bytes] = ...,
-        fileExit: Optional[bool] = ...,
-        imgInfo: Optional[ImgInfo] = ...,
-        upIp: Optional[Iterable[int]] = ...,
-        upPort: Optional[Iterable[int]] = ...,
-        upUkey: Optional[bytes] = ...,
-        fileid: Optional[int] = ...,
-        upOffset: Optional[int] = ...,
-        blockSize: Optional[int] = ...,
-        newBigChan: Optional[bool] = ...,
-        upIp6: Optional[Iterable[IPv6Info]] = ...,
-        clientIp6: Optional[bytes] = ...,
-        downloadIndex: Optional[bytes] = ...,
-        info4Busi: Optional[TryUpInfo4Busi] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["blockSize",b"blockSize","clientIp6",b"clientIp6","downloadIndex",b"downloadIndex","failMsg",b"failMsg","fileExit",b"fileExit","fileId",b"fileId","fileid",b"fileid","imgInfo",b"imgInfo","info4Busi",b"info4Busi","newBigChan",b"newBigChan","result",b"result","upOffset",b"upOffset","upUkey",b"upUkey"]) -> bool: ...
-    def ClearField(self, field_name: Literal["blockSize",b"blockSize","clientIp6",b"clientIp6","downloadIndex",b"downloadIndex","failMsg",b"failMsg","fileExit",b"fileExit","fileId",b"fileId","fileid",b"fileid","imgInfo",b"imgInfo","info4Busi",b"info4Busi","newBigChan",b"newBigChan","result",b"result","upIp",b"upIp","upIp6",b"upIp6","upOffset",b"upOffset","upPort",b"upPort","upUkey",b"upUkey"]) -> None: ...
-
-class TryUpInfo4Busi(Message):
-    DESCRIPTOR: Descriptor
-    DOWNDOMAIN_FIELD_NUMBER: int
-    THUMBDOWNURL_FIELD_NUMBER: int
-    ORIGINALDOWNURL_FIELD_NUMBER: int
-    BIGDOWNURL_FIELD_NUMBER: int
-    FILERESID_FIELD_NUMBER: int
-    downDomain: bytes
-    thumbDownUrl: bytes
-    originalDownUrl: bytes
-    bigDownUrl: bytes
-    fileResid: bytes
-    def __init__(self,
-        *,
-        downDomain: Optional[bytes] = ...,
-        thumbDownUrl: Optional[bytes] = ...,
-        originalDownUrl: Optional[bytes] = ...,
-        bigDownUrl: Optional[bytes] = ...,
-        fileResid: Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["bigDownUrl",b"bigDownUrl","downDomain",b"downDomain","fileResid",b"fileResid","originalDownUrl",b"originalDownUrl","thumbDownUrl",b"thumbDownUrl"]) -> bool: ...
-    def ClearField(self, field_name: Literal["bigDownUrl",b"bigDownUrl","downDomain",b"downDomain","fileResid",b"fileResid","originalDownUrl",b"originalDownUrl","thumbDownUrl",b"thumbDownUrl"]) -> None: ...
-
-class TryUpPttReq(Message):
-    DESCRIPTOR: Descriptor
-    GROUPCODE_FIELD_NUMBER: int
-    SRCUIN_FIELD_NUMBER: int
-    FILEID_FIELD_NUMBER: int
-    FILEMD5_FIELD_NUMBER: int
-    FILESIZE_FIELD_NUMBER: int
-    FILENAME_FIELD_NUMBER: int
-    SRCTERM_FIELD_NUMBER: int
-    PLATFORMTYPE_FIELD_NUMBER: int
-    BUTYPE_FIELD_NUMBER: int
-    BUILDVER_FIELD_NUMBER: int
-    INNERIP_FIELD_NUMBER: int
-    VOICELENGTH_FIELD_NUMBER: int
-    NEWUPCHAN_FIELD_NUMBER: int
-    CODEC_FIELD_NUMBER: int
-    VOICETYPE_FIELD_NUMBER: int
-    BUID_FIELD_NUMBER: int
-    groupCode: int
-    srcUin: int
-    fileId: int
-    fileMd5: bytes
-    fileSize: int
-    fileName: bytes
-    srcTerm: int
-    platformType: int
-    buType: int
-    buildVer: bytes
-    innerIp: int
-    voiceLength: int
-    newUpChan: bool
-    codec: int
-    voiceType: int
-    buId: int
-    def __init__(self,
-        *,
-        groupCode: Optional[int] = ...,
-        srcUin: Optional[int] = ...,
-        fileId: Optional[int] = ...,
-        fileMd5: Optional[bytes] = ...,
-        fileSize: Optional[int] = ...,
-        fileName: Optional[bytes] = ...,
-        srcTerm: Optional[int] = ...,
-        platformType: Optional[int] = ...,
-        buType: Optional[int] = ...,
-        buildVer: Optional[bytes] = ...,
-        innerIp: Optional[int] = ...,
-        voiceLength: Optional[int] = ...,
-        newUpChan: Optional[bool] = ...,
-        codec: Optional[int] = ...,
-        voiceType: Optional[int] = ...,
-        buId: Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["buId",b"buId","buType",b"buType","buildVer",b"buildVer","codec",b"codec","fileId",b"fileId","fileMd5",b"fileMd5","fileName",b"fileName","fileSize",b"fileSize","groupCode",b"groupCode","innerIp",b"innerIp","newUpChan",b"newUpChan","platformType",b"platformType","srcTerm",b"srcTerm","srcUin",b"srcUin","voiceLength",b"voiceLength","voiceType",b"voiceType"]) -> bool: ...
-    def ClearField(self, field_name: Literal["buId",b"buId","buType",b"buType","buildVer",b"buildVer","codec",b"codec","fileId",b"fileId","fileMd5",b"fileMd5","fileName",b"fileName","fileSize",b"fileSize","groupCode",b"groupCode","innerIp",b"innerIp","newUpChan",b"newUpChan","platformType",b"platformType","srcTerm",b"srcTerm","srcUin",b"srcUin","voiceLength",b"voiceLength","voiceType",b"voiceType"]) -> None: ...
-
-class TryUpPttRsp(Message):
-    DESCRIPTOR: Descriptor
-    FILEID_FIELD_NUMBER: int
-    RESULT_FIELD_NUMBER: int
-    FAILMSG_FIELD_NUMBER: int
-    FILEEXIT_FIELD_NUMBER: int
-    UPIP_FIELD_NUMBER: int
-    UPPORT_FIELD_NUMBER: int
-    UPUKEY_FIELD_NUMBER: int
-    FILEID_FIELD_NUMBER: int
-    UPOFFSET_FIELD_NUMBER: int
-    BLOCKSIZE_FIELD_NUMBER: int
-    FILEKEY_FIELD_NUMBER: int
-    CHANNELTYPE_FIELD_NUMBER: int
-    UPIP6_FIELD_NUMBER: int
-    CLIENTIP6_FIELD_NUMBER: int
-    fileId: int
-    result: int
-    failMsg: bytes
-    fileExit: bool
-    @property
-    def upIp(self) -> RepeatedScalarFieldContainer[int]: ...
-    @property
-    def upPort(self) -> RepeatedScalarFieldContainer[int]: ...
-    upUkey: bytes
-    fileid: int
-    upOffset: int
-    blockSize: int
-    fileKey: bytes
-    channelType: int
-    @property
-    def upIp6(self) -> RepeatedCompositeFieldContainer[IPv6Info]: ...
-    clientIp6: bytes
-    def __init__(self,
-        *,
-        fileId: Optional[int] = ...,
-        result: Optional[int] = ...,
-        failMsg: Optional[bytes] = ...,
-        fileExit: Optional[bool] = ...,
-        upIp: Optional[Iterable[int]] = ...,
-        upPort: Optional[Iterable[int]] = ...,
-        upUkey: Optional[bytes] = ...,
-        fileid: Optional[int] = ...,
-        upOffset: Optional[int] = ...,
-        blockSize: Optional[int] = ...,
-        fileKey: Optional[bytes] = ...,
-        channelType: Optional[int] = ...,
-        upIp6: Optional[Iterable[IPv6Info]] = ...,
-        clientIp6: Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["blockSize",b"blockSize","channelType",b"channelType","clientIp6",b"clientIp6","failMsg",b"failMsg","fileExit",b"fileExit","fileId",b"fileId","fileKey",b"fileKey","fileid",b"fileid","result",b"result","upOffset",b"upOffset","upUkey",b"upUkey"]) -> bool: ...
-    def ClearField(self, field_name: Literal["blockSize",b"blockSize","channelType",b"channelType","clientIp6",b"clientIp6","failMsg",b"failMsg","fileExit",b"fileExit","fileId",b"fileId","fileKey",b"fileKey","fileid",b"fileid","result",b"result","upIp",b"upIp","upIp6",b"upIp6","upOffset",b"upOffset","upPort",b"upPort","upUkey",b"upUkey"]) -> None: ...
diff --git a/cai/pb/im/oidb/cmd0x769/cmd0x769.proto b/cai/pb/im/oidb/cmd0x769/cmd0x769.proto
index 56ee4b68..d82dd2ba 100644
--- a/cai/pb/im/oidb/cmd0x769/cmd0x769.proto
+++ b/cai/pb/im/oidb/cmd0x769/cmd0x769.proto
@@ -1,7 +1,7 @@
 syntax = "proto2";
 package im.oidb.cmd0x769;
 
-// tencent/im/oidb/cmd0xd50/Oidb_0x769.java
+// tencent/im/oidb/cmd0x769/Oidb_0x769.java
 
 message CPU {
   optional string model = 1;
diff --git a/cai/pb/im/oidb/cmd0x769/cmd0x769_pb2.py b/cai/pb/im/oidb/cmd0x769/cmd0x769_pb2.py
index 85a6ed59..0d9a89e7 100644
--- a/cai/pb/im/oidb/cmd0x769/cmd0x769_pb2.py
+++ b/cai/pb/im/oidb/cmd0x769/cmd0x769_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/im/oidb/cmd0x769/cmd0x769.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -13,835 +14,25 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/im/oidb/cmd0x769/cmd0x769.proto',
-  package='im.oidb.cmd0x769',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n&cai/pb/im/oidb/cmd0x769/cmd0x769.proto\x12\x10im.oidb.cmd0x769\"6\n\x03\x43PU\x12\r\n\x05model\x18\x01 \x01(\t\x12\r\n\x05\x63ores\x18\x02 \x01(\r\x12\x11\n\tfrequency\x18\x03 \x01(\r\";\n\x06\x43\x61mera\x12\x0f\n\x07primary\x18\x01 \x01(\x04\x12\x11\n\tsecondary\x18\x02 \x01(\x04\x12\r\n\x05\x66lash\x18\x03 \x01(\x08\"\x85\x01\n\x06\x43onfig\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0f\n\x07version\x18\x02 \x01(\r\x12\x14\n\x0c\x63ontent_list\x18\x03 \x03(\t\x12\x11\n\tdebug_msg\x18\x04 \x01(\t\x12\x33\n\x10msg_content_list\x18\x05 \x03(\x0b\x32\x19.im.oidb.cmd0x769.Content\"*\n\tConfigSeq\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0f\n\x07version\x18\x02 \x01(\r\"=\n\x07\x43ontent\x12\x0f\n\x07task_id\x18\x01 \x01(\r\x12\x10\n\x08\x63ompress\x18\x02 \x01(\r\x12\x0f\n\x07\x63ontent\x18\n \x01(\x0c\"\x9a\x02\n\nDeviceInfo\x12\r\n\x05\x62rand\x18\x01 \x01(\t\x12\r\n\x05model\x18\x02 \x01(\t\x12 \n\x02os\x18\x03 \x01(\x0b\x32\x14.im.oidb.cmd0x769.OS\x12\"\n\x03\x63pu\x18\x04 \x01(\x0b\x32\x15.im.oidb.cmd0x769.CPU\x12(\n\x06memory\x18\x05 \x01(\x0b\x32\x18.im.oidb.cmd0x769.Memory\x12*\n\x07storage\x18\x06 \x01(\x0b\x32\x19.im.oidb.cmd0x769.Storage\x12(\n\x06screen\x18\x07 \x01(\x0b\x32\x18.im.oidb.cmd0x769.Screen\x12(\n\x06\x63\x61mera\x18\x08 \x01(\x0b\x32\x18.im.oidb.cmd0x769.Camera\"(\n\x06Memory\x12\r\n\x05total\x18\x01 \x01(\x04\x12\x0f\n\x07process\x18\x02 \x01(\x04\"M\n\x02OS\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x0b\n\x03sdk\x18\x03 \x01(\t\x12\x0e\n\x06kernel\x18\x04 \x01(\t\x12\x0b\n\x03rom\x18\x05 \x01(\t\">\n\x17QueryUinPackageUsageReq\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x15\n\ruin_file_size\x18\x02 \x01(\x04\"\xad\x01\n\x17QueryUinPackageUsageRsp\x12\x0e\n\x06status\x18\x01 \x01(\r\x12\x14\n\x0cleft_uin_num\x18\x02 \x01(\x04\x12\x13\n\x0bmax_uin_num\x18\x03 \x01(\x04\x12\x12\n\nproportion\x18\x04 \x01(\r\x12\x43\n\x15uin_package_used_list\x18\n \x03(\x0b\x32$.im.oidb.cmd0x769.UinPackageUsedInfo\"\x83\x02\n\x07ReqBody\x12\x30\n\x0b\x63onfig_list\x18\x01 \x03(\x0b\x32\x1b.im.oidb.cmd0x769.ConfigSeq\x12\x31\n\x0b\x64\x65vice_info\x18\x02 \x01(\x0b\x32\x1c.im.oidb.cmd0x769.DeviceInfo\x12\x0c\n\x04info\x18\x03 \x01(\t\x12\x10\n\x08province\x18\x04 \x01(\t\x12\x0c\n\x04\x63ity\x18\x05 \x01(\t\x12\x15\n\rreq_debug_msg\x18\x06 \x01(\x05\x12N\n\x1bquery_uin_package_usage_req\x18\x65 \x01(\x0b\x32).im.oidb.cmd0x769.QueryUinPackageUsageReq\"\x98\x01\n\x07RspBody\x12\x0e\n\x06result\x18\x01 \x01(\r\x12-\n\x0b\x63onfig_list\x18\x02 \x03(\x0b\x32\x18.im.oidb.cmd0x769.Config\x12N\n\x1bquery_uin_package_usage_rsp\x18\x65 \x01(\x0b\x32).im.oidb.cmd0x769.QueryUinPackageUsageRsp\"X\n\x06Screen\x12\r\n\x05model\x18\x01 \x01(\t\x12\r\n\x05width\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\r\x12\x0b\n\x03\x64pi\x18\x04 \x01(\r\x12\x13\n\x0bmulti_touch\x18\x05 \x01(\x08\",\n\x07Storage\x12\x0f\n\x07\x62uiltin\x18\x01 \x01(\x04\x12\x10\n\x08\x65xternal\x18\x02 \x01(\x04\"S\n\x12UinPackageUsedInfo\x12\x0f\n\x07rule_id\x18\x01 \x01(\r\x12\x0e\n\x06\x61uthor\x18\x02 \x01(\t\x12\x0b\n\x03url\x18\x03 \x01(\t\x12\x0f\n\x07uin_num\x18\x04 \x01(\x04'
-)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&cai/pb/im/oidb/cmd0x769/cmd0x769.proto\x12\x10im.oidb.cmd0x769\"6\n\x03\x43PU\x12\r\n\x05model\x18\x01 \x01(\t\x12\r\n\x05\x63ores\x18\x02 \x01(\r\x12\x11\n\tfrequency\x18\x03 \x01(\r\";\n\x06\x43\x61mera\x12\x0f\n\x07primary\x18\x01 \x01(\x04\x12\x11\n\tsecondary\x18\x02 \x01(\x04\x12\r\n\x05\x66lash\x18\x03 \x01(\x08\"\x85\x01\n\x06\x43onfig\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0f\n\x07version\x18\x02 \x01(\r\x12\x14\n\x0c\x63ontent_list\x18\x03 \x03(\t\x12\x11\n\tdebug_msg\x18\x04 \x01(\t\x12\x33\n\x10msg_content_list\x18\x05 \x03(\x0b\x32\x19.im.oidb.cmd0x769.Content\"*\n\tConfigSeq\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0f\n\x07version\x18\x02 \x01(\r\"=\n\x07\x43ontent\x12\x0f\n\x07task_id\x18\x01 \x01(\r\x12\x10\n\x08\x63ompress\x18\x02 \x01(\r\x12\x0f\n\x07\x63ontent\x18\n \x01(\x0c\"\x9a\x02\n\nDeviceInfo\x12\r\n\x05\x62rand\x18\x01 \x01(\t\x12\r\n\x05model\x18\x02 \x01(\t\x12 \n\x02os\x18\x03 \x01(\x0b\x32\x14.im.oidb.cmd0x769.OS\x12\"\n\x03\x63pu\x18\x04 \x01(\x0b\x32\x15.im.oidb.cmd0x769.CPU\x12(\n\x06memory\x18\x05 \x01(\x0b\x32\x18.im.oidb.cmd0x769.Memory\x12*\n\x07storage\x18\x06 \x01(\x0b\x32\x19.im.oidb.cmd0x769.Storage\x12(\n\x06screen\x18\x07 \x01(\x0b\x32\x18.im.oidb.cmd0x769.Screen\x12(\n\x06\x63\x61mera\x18\x08 \x01(\x0b\x32\x18.im.oidb.cmd0x769.Camera\"(\n\x06Memory\x12\r\n\x05total\x18\x01 \x01(\x04\x12\x0f\n\x07process\x18\x02 \x01(\x04\"M\n\x02OS\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x0b\n\x03sdk\x18\x03 \x01(\t\x12\x0e\n\x06kernel\x18\x04 \x01(\t\x12\x0b\n\x03rom\x18\x05 \x01(\t\">\n\x17QueryUinPackageUsageReq\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x15\n\ruin_file_size\x18\x02 \x01(\x04\"\xad\x01\n\x17QueryUinPackageUsageRsp\x12\x0e\n\x06status\x18\x01 \x01(\r\x12\x14\n\x0cleft_uin_num\x18\x02 \x01(\x04\x12\x13\n\x0bmax_uin_num\x18\x03 \x01(\x04\x12\x12\n\nproportion\x18\x04 \x01(\r\x12\x43\n\x15uin_package_used_list\x18\n \x03(\x0b\x32$.im.oidb.cmd0x769.UinPackageUsedInfo\"\x83\x02\n\x07ReqBody\x12\x30\n\x0b\x63onfig_list\x18\x01 \x03(\x0b\x32\x1b.im.oidb.cmd0x769.ConfigSeq\x12\x31\n\x0b\x64\x65vice_info\x18\x02 \x01(\x0b\x32\x1c.im.oidb.cmd0x769.DeviceInfo\x12\x0c\n\x04info\x18\x03 \x01(\t\x12\x10\n\x08province\x18\x04 \x01(\t\x12\x0c\n\x04\x63ity\x18\x05 \x01(\t\x12\x15\n\rreq_debug_msg\x18\x06 \x01(\x05\x12N\n\x1bquery_uin_package_usage_req\x18\x65 \x01(\x0b\x32).im.oidb.cmd0x769.QueryUinPackageUsageReq\"\x98\x01\n\x07RspBody\x12\x0e\n\x06result\x18\x01 \x01(\r\x12-\n\x0b\x63onfig_list\x18\x02 \x03(\x0b\x32\x18.im.oidb.cmd0x769.Config\x12N\n\x1bquery_uin_package_usage_rsp\x18\x65 \x01(\x0b\x32).im.oidb.cmd0x769.QueryUinPackageUsageRsp\"X\n\x06Screen\x12\r\n\x05model\x18\x01 \x01(\t\x12\r\n\x05width\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\r\x12\x0b\n\x03\x64pi\x18\x04 \x01(\r\x12\x13\n\x0bmulti_touch\x18\x05 \x01(\x08\",\n\x07Storage\x12\x0f\n\x07\x62uiltin\x18\x01 \x01(\x04\x12\x10\n\x08\x65xternal\x18\x02 \x01(\x04\"S\n\x12UinPackageUsedInfo\x12\x0f\n\x07rule_id\x18\x01 \x01(\r\x12\x0e\n\x06\x61uthor\x18\x02 \x01(\t\x12\x0b\n\x03url\x18\x03 \x01(\t\x12\x0f\n\x07uin_num\x18\x04 \x01(\x04')
 
 
 
-
-_CPU = _descriptor.Descriptor(
-  name='CPU',
-  full_name='im.oidb.cmd0x769.CPU',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='model', full_name='im.oidb.cmd0x769.CPU.model', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cores', full_name='im.oidb.cmd0x769.CPU.cores', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='frequency', full_name='im.oidb.cmd0x769.CPU.frequency', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=60,
-  serialized_end=114,
-)
-
-
-_CAMERA = _descriptor.Descriptor(
-  name='Camera',
-  full_name='im.oidb.cmd0x769.Camera',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='primary', full_name='im.oidb.cmd0x769.Camera.primary', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='secondary', full_name='im.oidb.cmd0x769.Camera.secondary', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flash', full_name='im.oidb.cmd0x769.Camera.flash', index=2,
-      number=3, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=116,
-  serialized_end=175,
-)
-
-
-_CONFIG = _descriptor.Descriptor(
-  name='Config',
-  full_name='im.oidb.cmd0x769.Config',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='type', full_name='im.oidb.cmd0x769.Config.type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='version', full_name='im.oidb.cmd0x769.Config.version', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content_list', full_name='im.oidb.cmd0x769.Config.content_list', index=2,
-      number=3, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='debug_msg', full_name='im.oidb.cmd0x769.Config.debug_msg', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_content_list', full_name='im.oidb.cmd0x769.Config.msg_content_list', index=4,
-      number=5, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=178,
-  serialized_end=311,
-)
-
-
-_CONFIGSEQ = _descriptor.Descriptor(
-  name='ConfigSeq',
-  full_name='im.oidb.cmd0x769.ConfigSeq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='type', full_name='im.oidb.cmd0x769.ConfigSeq.type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='version', full_name='im.oidb.cmd0x769.ConfigSeq.version', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=313,
-  serialized_end=355,
-)
-
-
-_CONTENT = _descriptor.Descriptor(
-  name='Content',
-  full_name='im.oidb.cmd0x769.Content',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='task_id', full_name='im.oidb.cmd0x769.Content.task_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='compress', full_name='im.oidb.cmd0x769.Content.compress', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content', full_name='im.oidb.cmd0x769.Content.content', index=2,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=357,
-  serialized_end=418,
-)
-
-
-_DEVICEINFO = _descriptor.Descriptor(
-  name='DeviceInfo',
-  full_name='im.oidb.cmd0x769.DeviceInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='brand', full_name='im.oidb.cmd0x769.DeviceInfo.brand', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='model', full_name='im.oidb.cmd0x769.DeviceInfo.model', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='os', full_name='im.oidb.cmd0x769.DeviceInfo.os', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cpu', full_name='im.oidb.cmd0x769.DeviceInfo.cpu', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='memory', full_name='im.oidb.cmd0x769.DeviceInfo.memory', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='storage', full_name='im.oidb.cmd0x769.DeviceInfo.storage', index=5,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='screen', full_name='im.oidb.cmd0x769.DeviceInfo.screen', index=6,
-      number=7, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='camera', full_name='im.oidb.cmd0x769.DeviceInfo.camera', index=7,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=421,
-  serialized_end=703,
-)
-
-
-_MEMORY = _descriptor.Descriptor(
-  name='Memory',
-  full_name='im.oidb.cmd0x769.Memory',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='total', full_name='im.oidb.cmd0x769.Memory.total', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='process', full_name='im.oidb.cmd0x769.Memory.process', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=705,
-  serialized_end=745,
-)
-
-
-_OS = _descriptor.Descriptor(
-  name='OS',
-  full_name='im.oidb.cmd0x769.OS',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='type', full_name='im.oidb.cmd0x769.OS.type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='version', full_name='im.oidb.cmd0x769.OS.version', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sdk', full_name='im.oidb.cmd0x769.OS.sdk', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='kernel', full_name='im.oidb.cmd0x769.OS.kernel', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rom', full_name='im.oidb.cmd0x769.OS.rom', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=747,
-  serialized_end=824,
-)
-
-
-_QUERYUINPACKAGEUSAGEREQ = _descriptor.Descriptor(
-  name='QueryUinPackageUsageReq',
-  full_name='im.oidb.cmd0x769.QueryUinPackageUsageReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='type', full_name='im.oidb.cmd0x769.QueryUinPackageUsageReq.type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='uin_file_size', full_name='im.oidb.cmd0x769.QueryUinPackageUsageReq.uin_file_size', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=826,
-  serialized_end=888,
-)
-
-
-_QUERYUINPACKAGEUSAGERSP = _descriptor.Descriptor(
-  name='QueryUinPackageUsageRsp',
-  full_name='im.oidb.cmd0x769.QueryUinPackageUsageRsp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='status', full_name='im.oidb.cmd0x769.QueryUinPackageUsageRsp.status', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='left_uin_num', full_name='im.oidb.cmd0x769.QueryUinPackageUsageRsp.left_uin_num', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='max_uin_num', full_name='im.oidb.cmd0x769.QueryUinPackageUsageRsp.max_uin_num', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='proportion', full_name='im.oidb.cmd0x769.QueryUinPackageUsageRsp.proportion', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='uin_package_used_list', full_name='im.oidb.cmd0x769.QueryUinPackageUsageRsp.uin_package_used_list', index=4,
-      number=10, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=891,
-  serialized_end=1064,
-)
-
-
-_REQBODY = _descriptor.Descriptor(
-  name='ReqBody',
-  full_name='im.oidb.cmd0x769.ReqBody',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='config_list', full_name='im.oidb.cmd0x769.ReqBody.config_list', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='device_info', full_name='im.oidb.cmd0x769.ReqBody.device_info', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='info', full_name='im.oidb.cmd0x769.ReqBody.info', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='province', full_name='im.oidb.cmd0x769.ReqBody.province', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='city', full_name='im.oidb.cmd0x769.ReqBody.city', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_debug_msg', full_name='im.oidb.cmd0x769.ReqBody.req_debug_msg', index=5,
-      number=6, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='query_uin_package_usage_req', full_name='im.oidb.cmd0x769.ReqBody.query_uin_package_usage_req', index=6,
-      number=101, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1067,
-  serialized_end=1326,
-)
-
-
-_RSPBODY = _descriptor.Descriptor(
-  name='RspBody',
-  full_name='im.oidb.cmd0x769.RspBody',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='im.oidb.cmd0x769.RspBody.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='config_list', full_name='im.oidb.cmd0x769.RspBody.config_list', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='query_uin_package_usage_rsp', full_name='im.oidb.cmd0x769.RspBody.query_uin_package_usage_rsp', index=2,
-      number=101, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1329,
-  serialized_end=1481,
-)
-
-
-_SCREEN = _descriptor.Descriptor(
-  name='Screen',
-  full_name='im.oidb.cmd0x769.Screen',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='model', full_name='im.oidb.cmd0x769.Screen.model', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='width', full_name='im.oidb.cmd0x769.Screen.width', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='height', full_name='im.oidb.cmd0x769.Screen.height', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='dpi', full_name='im.oidb.cmd0x769.Screen.dpi', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='multi_touch', full_name='im.oidb.cmd0x769.Screen.multi_touch', index=4,
-      number=5, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1483,
-  serialized_end=1571,
-)
-
-
-_STORAGE = _descriptor.Descriptor(
-  name='Storage',
-  full_name='im.oidb.cmd0x769.Storage',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='builtin', full_name='im.oidb.cmd0x769.Storage.builtin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='external', full_name='im.oidb.cmd0x769.Storage.external', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1573,
-  serialized_end=1617,
-)
-
-
-_UINPACKAGEUSEDINFO = _descriptor.Descriptor(
-  name='UinPackageUsedInfo',
-  full_name='im.oidb.cmd0x769.UinPackageUsedInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='rule_id', full_name='im.oidb.cmd0x769.UinPackageUsedInfo.rule_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='author', full_name='im.oidb.cmd0x769.UinPackageUsedInfo.author', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='url', full_name='im.oidb.cmd0x769.UinPackageUsedInfo.url', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='uin_num', full_name='im.oidb.cmd0x769.UinPackageUsedInfo.uin_num', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1619,
-  serialized_end=1702,
-)
-
-_CONFIG.fields_by_name['msg_content_list'].message_type = _CONTENT
-_DEVICEINFO.fields_by_name['os'].message_type = _OS
-_DEVICEINFO.fields_by_name['cpu'].message_type = _CPU
-_DEVICEINFO.fields_by_name['memory'].message_type = _MEMORY
-_DEVICEINFO.fields_by_name['storage'].message_type = _STORAGE
-_DEVICEINFO.fields_by_name['screen'].message_type = _SCREEN
-_DEVICEINFO.fields_by_name['camera'].message_type = _CAMERA
-_QUERYUINPACKAGEUSAGERSP.fields_by_name['uin_package_used_list'].message_type = _UINPACKAGEUSEDINFO
-_REQBODY.fields_by_name['config_list'].message_type = _CONFIGSEQ
-_REQBODY.fields_by_name['device_info'].message_type = _DEVICEINFO
-_REQBODY.fields_by_name['query_uin_package_usage_req'].message_type = _QUERYUINPACKAGEUSAGEREQ
-_RSPBODY.fields_by_name['config_list'].message_type = _CONFIG
-_RSPBODY.fields_by_name['query_uin_package_usage_rsp'].message_type = _QUERYUINPACKAGEUSAGERSP
-DESCRIPTOR.message_types_by_name['CPU'] = _CPU
-DESCRIPTOR.message_types_by_name['Camera'] = _CAMERA
-DESCRIPTOR.message_types_by_name['Config'] = _CONFIG
-DESCRIPTOR.message_types_by_name['ConfigSeq'] = _CONFIGSEQ
-DESCRIPTOR.message_types_by_name['Content'] = _CONTENT
-DESCRIPTOR.message_types_by_name['DeviceInfo'] = _DEVICEINFO
-DESCRIPTOR.message_types_by_name['Memory'] = _MEMORY
-DESCRIPTOR.message_types_by_name['OS'] = _OS
-DESCRIPTOR.message_types_by_name['QueryUinPackageUsageReq'] = _QUERYUINPACKAGEUSAGEREQ
-DESCRIPTOR.message_types_by_name['QueryUinPackageUsageRsp'] = _QUERYUINPACKAGEUSAGERSP
-DESCRIPTOR.message_types_by_name['ReqBody'] = _REQBODY
-DESCRIPTOR.message_types_by_name['RspBody'] = _RSPBODY
-DESCRIPTOR.message_types_by_name['Screen'] = _SCREEN
-DESCRIPTOR.message_types_by_name['Storage'] = _STORAGE
-DESCRIPTOR.message_types_by_name['UinPackageUsedInfo'] = _UINPACKAGEUSEDINFO
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_CPU = DESCRIPTOR.message_types_by_name['CPU']
+_CAMERA = DESCRIPTOR.message_types_by_name['Camera']
+_CONFIG = DESCRIPTOR.message_types_by_name['Config']
+_CONFIGSEQ = DESCRIPTOR.message_types_by_name['ConfigSeq']
+_CONTENT = DESCRIPTOR.message_types_by_name['Content']
+_DEVICEINFO = DESCRIPTOR.message_types_by_name['DeviceInfo']
+_MEMORY = DESCRIPTOR.message_types_by_name['Memory']
+_OS = DESCRIPTOR.message_types_by_name['OS']
+_QUERYUINPACKAGEUSAGEREQ = DESCRIPTOR.message_types_by_name['QueryUinPackageUsageReq']
+_QUERYUINPACKAGEUSAGERSP = DESCRIPTOR.message_types_by_name['QueryUinPackageUsageRsp']
+_REQBODY = DESCRIPTOR.message_types_by_name['ReqBody']
+_RSPBODY = DESCRIPTOR.message_types_by_name['RspBody']
+_SCREEN = DESCRIPTOR.message_types_by_name['Screen']
+_STORAGE = DESCRIPTOR.message_types_by_name['Storage']
+_UINPACKAGEUSEDINFO = DESCRIPTOR.message_types_by_name['UinPackageUsedInfo']
 CPU = _reflection.GeneratedProtocolMessageType('CPU', (_message.Message,), {
   'DESCRIPTOR' : _CPU,
   '__module__' : 'cai.pb.im.oidb.cmd0x769.cmd0x769_pb2'
@@ -947,5 +138,37 @@
   })
 _sym_db.RegisterMessage(UinPackageUsedInfo)
 
-
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _CPU._serialized_start=60
+  _CPU._serialized_end=114
+  _CAMERA._serialized_start=116
+  _CAMERA._serialized_end=175
+  _CONFIG._serialized_start=178
+  _CONFIG._serialized_end=311
+  _CONFIGSEQ._serialized_start=313
+  _CONFIGSEQ._serialized_end=355
+  _CONTENT._serialized_start=357
+  _CONTENT._serialized_end=418
+  _DEVICEINFO._serialized_start=421
+  _DEVICEINFO._serialized_end=703
+  _MEMORY._serialized_start=705
+  _MEMORY._serialized_end=745
+  _OS._serialized_start=747
+  _OS._serialized_end=824
+  _QUERYUINPACKAGEUSAGEREQ._serialized_start=826
+  _QUERYUINPACKAGEUSAGEREQ._serialized_end=888
+  _QUERYUINPACKAGEUSAGERSP._serialized_start=891
+  _QUERYUINPACKAGEUSAGERSP._serialized_end=1064
+  _REQBODY._serialized_start=1067
+  _REQBODY._serialized_end=1326
+  _RSPBODY._serialized_start=1329
+  _RSPBODY._serialized_end=1481
+  _SCREEN._serialized_start=1483
+  _SCREEN._serialized_end=1571
+  _STORAGE._serialized_start=1573
+  _STORAGE._serialized_end=1617
+  _UINPACKAGEUSEDINFO._serialized_start=1619
+  _UINPACKAGEUSEDINFO._serialized_end=1702
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/oidb/cmd0x769/cmd0x769_pb2.pyi b/cai/pb/im/oidb/cmd0x769/cmd0x769_pb2.pyi
index 55f2a335..307d9ea0 100644
--- a/cai/pb/im/oidb/cmd0x769/cmd0x769_pb2.pyi
+++ b/cai/pb/im/oidb/cmd0x769/cmd0x769_pb2.pyi
@@ -33,105 +33,103 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class CPU(Message):
-    DESCRIPTOR: Descriptor = ...
+    """tencent/im/oidb/cmd0x769/Oidb_0x769.java
+
+    """
+    DESCRIPTOR: Descriptor
     MODEL_FIELD_NUMBER: int
     CORES_FIELD_NUMBER: int
     FREQUENCY_FIELD_NUMBER: int
-    model: Text = ...
-    cores: int = ...
-    frequency: int = ...
-
+    model: Text
+    cores: int
+    frequency: int
     def __init__(self,
         *,
-        model : Optional[Text] = ...,
-        cores : Optional[int] = ...,
-        frequency : Optional[int] = ...,
+        model: Optional[Text] = ...,
+        cores: Optional[int] = ...,
+        frequency: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"cores",b"cores",u"frequency",b"frequency",u"model",b"model"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"cores",b"cores",u"frequency",b"frequency",u"model",b"model"]) -> None: ...
+    def HasField(self, field_name: Literal["cores",b"cores","frequency",b"frequency","model",b"model"]) -> bool: ...
+    def ClearField(self, field_name: Literal["cores",b"cores","frequency",b"frequency","model",b"model"]) -> None: ...
 
 class Camera(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     PRIMARY_FIELD_NUMBER: int
     SECONDARY_FIELD_NUMBER: int
     FLASH_FIELD_NUMBER: int
-    primary: int = ...
-    secondary: int = ...
-    flash: bool = ...
-
+    primary: int
+    secondary: int
+    flash: bool
     def __init__(self,
         *,
-        primary : Optional[int] = ...,
-        secondary : Optional[int] = ...,
-        flash : Optional[bool] = ...,
+        primary: Optional[int] = ...,
+        secondary: Optional[int] = ...,
+        flash: Optional[bool] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"flash",b"flash",u"primary",b"primary",u"secondary",b"secondary"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"flash",b"flash",u"primary",b"primary",u"secondary",b"secondary"]) -> None: ...
+    def HasField(self, field_name: Literal["flash",b"flash","primary",b"primary","secondary",b"secondary"]) -> bool: ...
+    def ClearField(self, field_name: Literal["flash",b"flash","primary",b"primary","secondary",b"secondary"]) -> None: ...
 
 class Config(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TYPE_FIELD_NUMBER: int
     VERSION_FIELD_NUMBER: int
     CONTENT_LIST_FIELD_NUMBER: int
     DEBUG_MSG_FIELD_NUMBER: int
     MSG_CONTENT_LIST_FIELD_NUMBER: int
-    type: int = ...
-    version: int = ...
-    content_list: RepeatedScalarFieldContainer[Text] = ...
-    debug_msg: Text = ...
-
+    type: int
+    version: int
+    @property
+    def content_list(self) -> RepeatedScalarFieldContainer[Text]: ...
+    debug_msg: Text
     @property
     def msg_content_list(self) -> RepeatedCompositeFieldContainer[Content]: ...
-
     def __init__(self,
         *,
-        type : Optional[int] = ...,
-        version : Optional[int] = ...,
-        content_list : Optional[Iterable[Text]] = ...,
-        debug_msg : Optional[Text] = ...,
-        msg_content_list : Optional[Iterable[Content]] = ...,
+        type: Optional[int] = ...,
+        version: Optional[int] = ...,
+        content_list: Optional[Iterable[Text]] = ...,
+        debug_msg: Optional[Text] = ...,
+        msg_content_list: Optional[Iterable[Content]] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"debug_msg",b"debug_msg",u"type",b"type",u"version",b"version"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"content_list",b"content_list",u"debug_msg",b"debug_msg",u"msg_content_list",b"msg_content_list",u"type",b"type",u"version",b"version"]) -> None: ...
+    def HasField(self, field_name: Literal["debug_msg",b"debug_msg","type",b"type","version",b"version"]) -> bool: ...
+    def ClearField(self, field_name: Literal["content_list",b"content_list","debug_msg",b"debug_msg","msg_content_list",b"msg_content_list","type",b"type","version",b"version"]) -> None: ...
 
 class ConfigSeq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TYPE_FIELD_NUMBER: int
     VERSION_FIELD_NUMBER: int
-    type: int = ...
-    version: int = ...
-
+    type: int
+    version: int
     def __init__(self,
         *,
-        type : Optional[int] = ...,
-        version : Optional[int] = ...,
+        type: Optional[int] = ...,
+        version: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"type",b"type",u"version",b"version"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"type",b"type",u"version",b"version"]) -> None: ...
+    def HasField(self, field_name: Literal["type",b"type","version",b"version"]) -> bool: ...
+    def ClearField(self, field_name: Literal["type",b"type","version",b"version"]) -> None: ...
 
 class Content(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TASK_ID_FIELD_NUMBER: int
     COMPRESS_FIELD_NUMBER: int
     CONTENT_FIELD_NUMBER: int
-    task_id: int = ...
-    compress: int = ...
-    content: bytes = ...
-
+    task_id: int
+    compress: int
+    content: bytes
     def __init__(self,
         *,
-        task_id : Optional[int] = ...,
-        compress : Optional[int] = ...,
-        content : Optional[bytes] = ...,
+        task_id: Optional[int] = ...,
+        compress: Optional[int] = ...,
+        content: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"compress",b"compress",u"content",b"content",u"task_id",b"task_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"compress",b"compress",u"content",b"content",u"task_id",b"task_id"]) -> None: ...
+    def HasField(self, field_name: Literal["compress",b"compress","content",b"content","task_id",b"task_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["compress",b"compress","content",b"content","task_id",b"task_id"]) -> None: ...
 
 class DeviceInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BRAND_FIELD_NUMBER: int
     MODEL_FIELD_NUMBER: int
     OS_FIELD_NUMBER: int
@@ -140,123 +138,111 @@ class DeviceInfo(Message):
     STORAGE_FIELD_NUMBER: int
     SCREEN_FIELD_NUMBER: int
     CAMERA_FIELD_NUMBER: int
-    brand: Text = ...
-    model: Text = ...
-
+    brand: Text
+    model: Text
     @property
     def os(self) -> OS: ...
-
     @property
     def cpu(self) -> CPU: ...
-
     @property
     def memory(self) -> Memory: ...
-
     @property
     def storage(self) -> Storage: ...
-
     @property
     def screen(self) -> Screen: ...
-
     @property
     def camera(self) -> Camera: ...
-
     def __init__(self,
         *,
-        brand : Optional[Text] = ...,
-        model : Optional[Text] = ...,
-        os : Optional[OS] = ...,
-        cpu : Optional[CPU] = ...,
-        memory : Optional[Memory] = ...,
-        storage : Optional[Storage] = ...,
-        screen : Optional[Screen] = ...,
-        camera : Optional[Camera] = ...,
+        brand: Optional[Text] = ...,
+        model: Optional[Text] = ...,
+        os: Optional[OS] = ...,
+        cpu: Optional[CPU] = ...,
+        memory: Optional[Memory] = ...,
+        storage: Optional[Storage] = ...,
+        screen: Optional[Screen] = ...,
+        camera: Optional[Camera] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"brand",b"brand",u"camera",b"camera",u"cpu",b"cpu",u"memory",b"memory",u"model",b"model",u"os",b"os",u"screen",b"screen",u"storage",b"storage"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"brand",b"brand",u"camera",b"camera",u"cpu",b"cpu",u"memory",b"memory",u"model",b"model",u"os",b"os",u"screen",b"screen",u"storage",b"storage"]) -> None: ...
+    def HasField(self, field_name: Literal["brand",b"brand","camera",b"camera","cpu",b"cpu","memory",b"memory","model",b"model","os",b"os","screen",b"screen","storage",b"storage"]) -> bool: ...
+    def ClearField(self, field_name: Literal["brand",b"brand","camera",b"camera","cpu",b"cpu","memory",b"memory","model",b"model","os",b"os","screen",b"screen","storage",b"storage"]) -> None: ...
 
 class Memory(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TOTAL_FIELD_NUMBER: int
     PROCESS_FIELD_NUMBER: int
-    total: int = ...
-    process: int = ...
-
+    total: int
+    process: int
     def __init__(self,
         *,
-        total : Optional[int] = ...,
-        process : Optional[int] = ...,
+        total: Optional[int] = ...,
+        process: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"process",b"process",u"total",b"total"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"process",b"process",u"total",b"total"]) -> None: ...
+    def HasField(self, field_name: Literal["process",b"process","total",b"total"]) -> bool: ...
+    def ClearField(self, field_name: Literal["process",b"process","total",b"total"]) -> None: ...
 
 class OS(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TYPE_FIELD_NUMBER: int
     VERSION_FIELD_NUMBER: int
     SDK_FIELD_NUMBER: int
     KERNEL_FIELD_NUMBER: int
     ROM_FIELD_NUMBER: int
-    type: int = ...
-    version: Text = ...
-    sdk: Text = ...
-    kernel: Text = ...
-    rom: Text = ...
-
+    type: int
+    version: Text
+    sdk: Text
+    kernel: Text
+    rom: Text
     def __init__(self,
         *,
-        type : Optional[int] = ...,
-        version : Optional[Text] = ...,
-        sdk : Optional[Text] = ...,
-        kernel : Optional[Text] = ...,
-        rom : Optional[Text] = ...,
+        type: Optional[int] = ...,
+        version: Optional[Text] = ...,
+        sdk: Optional[Text] = ...,
+        kernel: Optional[Text] = ...,
+        rom: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"kernel",b"kernel",u"rom",b"rom",u"sdk",b"sdk",u"type",b"type",u"version",b"version"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"kernel",b"kernel",u"rom",b"rom",u"sdk",b"sdk",u"type",b"type",u"version",b"version"]) -> None: ...
+    def HasField(self, field_name: Literal["kernel",b"kernel","rom",b"rom","sdk",b"sdk","type",b"type","version",b"version"]) -> bool: ...
+    def ClearField(self, field_name: Literal["kernel",b"kernel","rom",b"rom","sdk",b"sdk","type",b"type","version",b"version"]) -> None: ...
 
 class QueryUinPackageUsageReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TYPE_FIELD_NUMBER: int
     UIN_FILE_SIZE_FIELD_NUMBER: int
-    type: int = ...
-    uin_file_size: int = ...
-
+    type: int
+    uin_file_size: int
     def __init__(self,
         *,
-        type : Optional[int] = ...,
-        uin_file_size : Optional[int] = ...,
+        type: Optional[int] = ...,
+        uin_file_size: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"type",b"type",u"uin_file_size",b"uin_file_size"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"type",b"type",u"uin_file_size",b"uin_file_size"]) -> None: ...
+    def HasField(self, field_name: Literal["type",b"type","uin_file_size",b"uin_file_size"]) -> bool: ...
+    def ClearField(self, field_name: Literal["type",b"type","uin_file_size",b"uin_file_size"]) -> None: ...
 
 class QueryUinPackageUsageRsp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     STATUS_FIELD_NUMBER: int
     LEFT_UIN_NUM_FIELD_NUMBER: int
     MAX_UIN_NUM_FIELD_NUMBER: int
     PROPORTION_FIELD_NUMBER: int
     UIN_PACKAGE_USED_LIST_FIELD_NUMBER: int
-    status: int = ...
-    left_uin_num: int = ...
-    max_uin_num: int = ...
-    proportion: int = ...
-
+    status: int
+    left_uin_num: int
+    max_uin_num: int
+    proportion: int
     @property
     def uin_package_used_list(self) -> RepeatedCompositeFieldContainer[UinPackageUsedInfo]: ...
-
     def __init__(self,
         *,
-        status : Optional[int] = ...,
-        left_uin_num : Optional[int] = ...,
-        max_uin_num : Optional[int] = ...,
-        proportion : Optional[int] = ...,
-        uin_package_used_list : Optional[Iterable[UinPackageUsedInfo]] = ...,
+        status: Optional[int] = ...,
+        left_uin_num: Optional[int] = ...,
+        max_uin_num: Optional[int] = ...,
+        proportion: Optional[int] = ...,
+        uin_package_used_list: Optional[Iterable[UinPackageUsedInfo]] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"left_uin_num",b"left_uin_num",u"max_uin_num",b"max_uin_num",u"proportion",b"proportion",u"status",b"status"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"left_uin_num",b"left_uin_num",u"max_uin_num",b"max_uin_num",u"proportion",b"proportion",u"status",b"status",u"uin_package_used_list",b"uin_package_used_list"]) -> None: ...
+    def HasField(self, field_name: Literal["left_uin_num",b"left_uin_num","max_uin_num",b"max_uin_num","proportion",b"proportion","status",b"status"]) -> bool: ...
+    def ClearField(self, field_name: Literal["left_uin_num",b"left_uin_num","max_uin_num",b"max_uin_num","proportion",b"proportion","status",b"status","uin_package_used_list",b"uin_package_used_list"]) -> None: ...
 
 class ReqBody(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CONFIG_LIST_FIELD_NUMBER: int
     DEVICE_INFO_FIELD_NUMBER: int
     INFO_FIELD_NUMBER: int
@@ -264,111 +250,101 @@ class ReqBody(Message):
     CITY_FIELD_NUMBER: int
     REQ_DEBUG_MSG_FIELD_NUMBER: int
     QUERY_UIN_PACKAGE_USAGE_REQ_FIELD_NUMBER: int
-    info: Text = ...
-    province: Text = ...
-    city: Text = ...
-    req_debug_msg: int = ...
-
     @property
     def config_list(self) -> RepeatedCompositeFieldContainer[ConfigSeq]: ...
-
     @property
     def device_info(self) -> DeviceInfo: ...
-
+    info: Text
+    province: Text
+    city: Text
+    req_debug_msg: int
     @property
     def query_uin_package_usage_req(self) -> QueryUinPackageUsageReq: ...
-
     def __init__(self,
         *,
-        config_list : Optional[Iterable[ConfigSeq]] = ...,
-        device_info : Optional[DeviceInfo] = ...,
-        info : Optional[Text] = ...,
-        province : Optional[Text] = ...,
-        city : Optional[Text] = ...,
-        req_debug_msg : Optional[int] = ...,
-        query_uin_package_usage_req : Optional[QueryUinPackageUsageReq] = ...,
+        config_list: Optional[Iterable[ConfigSeq]] = ...,
+        device_info: Optional[DeviceInfo] = ...,
+        info: Optional[Text] = ...,
+        province: Optional[Text] = ...,
+        city: Optional[Text] = ...,
+        req_debug_msg: Optional[int] = ...,
+        query_uin_package_usage_req: Optional[QueryUinPackageUsageReq] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"city",b"city",u"device_info",b"device_info",u"info",b"info",u"province",b"province",u"query_uin_package_usage_req",b"query_uin_package_usage_req",u"req_debug_msg",b"req_debug_msg"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"city",b"city",u"config_list",b"config_list",u"device_info",b"device_info",u"info",b"info",u"province",b"province",u"query_uin_package_usage_req",b"query_uin_package_usage_req",u"req_debug_msg",b"req_debug_msg"]) -> None: ...
+    def HasField(self, field_name: Literal["city",b"city","device_info",b"device_info","info",b"info","province",b"province","query_uin_package_usage_req",b"query_uin_package_usage_req","req_debug_msg",b"req_debug_msg"]) -> bool: ...
+    def ClearField(self, field_name: Literal["city",b"city","config_list",b"config_list","device_info",b"device_info","info",b"info","province",b"province","query_uin_package_usage_req",b"query_uin_package_usage_req","req_debug_msg",b"req_debug_msg"]) -> None: ...
 
 class RspBody(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     CONFIG_LIST_FIELD_NUMBER: int
     QUERY_UIN_PACKAGE_USAGE_RSP_FIELD_NUMBER: int
-    result: int = ...
-
+    result: int
     @property
     def config_list(self) -> RepeatedCompositeFieldContainer[Config]: ...
-
     @property
     def query_uin_package_usage_rsp(self) -> QueryUinPackageUsageRsp: ...
-
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        config_list : Optional[Iterable[Config]] = ...,
-        query_uin_package_usage_rsp : Optional[QueryUinPackageUsageRsp] = ...,
+        result: Optional[int] = ...,
+        config_list: Optional[Iterable[Config]] = ...,
+        query_uin_package_usage_rsp: Optional[QueryUinPackageUsageRsp] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"query_uin_package_usage_rsp",b"query_uin_package_usage_rsp",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"config_list",b"config_list",u"query_uin_package_usage_rsp",b"query_uin_package_usage_rsp",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["query_uin_package_usage_rsp",b"query_uin_package_usage_rsp","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["config_list",b"config_list","query_uin_package_usage_rsp",b"query_uin_package_usage_rsp","result",b"result"]) -> None: ...
 
 class Screen(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     MODEL_FIELD_NUMBER: int
     WIDTH_FIELD_NUMBER: int
     HEIGHT_FIELD_NUMBER: int
     DPI_FIELD_NUMBER: int
     MULTI_TOUCH_FIELD_NUMBER: int
-    model: Text = ...
-    width: int = ...
-    height: int = ...
-    dpi: int = ...
-    multi_touch: bool = ...
-
+    model: Text
+    width: int
+    height: int
+    dpi: int
+    multi_touch: bool
     def __init__(self,
         *,
-        model : Optional[Text] = ...,
-        width : Optional[int] = ...,
-        height : Optional[int] = ...,
-        dpi : Optional[int] = ...,
-        multi_touch : Optional[bool] = ...,
+        model: Optional[Text] = ...,
+        width: Optional[int] = ...,
+        height: Optional[int] = ...,
+        dpi: Optional[int] = ...,
+        multi_touch: Optional[bool] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"dpi",b"dpi",u"height",b"height",u"model",b"model",u"multi_touch",b"multi_touch",u"width",b"width"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"dpi",b"dpi",u"height",b"height",u"model",b"model",u"multi_touch",b"multi_touch",u"width",b"width"]) -> None: ...
+    def HasField(self, field_name: Literal["dpi",b"dpi","height",b"height","model",b"model","multi_touch",b"multi_touch","width",b"width"]) -> bool: ...
+    def ClearField(self, field_name: Literal["dpi",b"dpi","height",b"height","model",b"model","multi_touch",b"multi_touch","width",b"width"]) -> None: ...
 
 class Storage(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BUILTIN_FIELD_NUMBER: int
     EXTERNAL_FIELD_NUMBER: int
-    builtin: int = ...
-    external: int = ...
-
+    builtin: int
+    external: int
     def __init__(self,
         *,
-        builtin : Optional[int] = ...,
-        external : Optional[int] = ...,
+        builtin: Optional[int] = ...,
+        external: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"builtin",b"builtin",u"external",b"external"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"builtin",b"builtin",u"external",b"external"]) -> None: ...
+    def HasField(self, field_name: Literal["builtin",b"builtin","external",b"external"]) -> bool: ...
+    def ClearField(self, field_name: Literal["builtin",b"builtin","external",b"external"]) -> None: ...
 
 class UinPackageUsedInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RULE_ID_FIELD_NUMBER: int
     AUTHOR_FIELD_NUMBER: int
     URL_FIELD_NUMBER: int
     UIN_NUM_FIELD_NUMBER: int
-    rule_id: int = ...
-    author: Text = ...
-    url: Text = ...
-    uin_num: int = ...
-
+    rule_id: int
+    author: Text
+    url: Text
+    uin_num: int
     def __init__(self,
         *,
-        rule_id : Optional[int] = ...,
-        author : Optional[Text] = ...,
-        url : Optional[Text] = ...,
-        uin_num : Optional[int] = ...,
+        rule_id: Optional[int] = ...,
+        author: Optional[Text] = ...,
+        url: Optional[Text] = ...,
+        uin_num: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"author",b"author",u"rule_id",b"rule_id",u"uin_num",b"uin_num",u"url",b"url"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"author",b"author",u"rule_id",b"rule_id",u"uin_num",b"uin_num",u"url",b"url"]) -> None: ...
+    def HasField(self, field_name: Literal["author",b"author","rule_id",b"rule_id","uin_num",b"uin_num","url",b"url"]) -> bool: ...
+    def ClearField(self, field_name: Literal["author",b"author","rule_id",b"rule_id","uin_num",b"uin_num","url",b"url"]) -> None: ...
diff --git a/cai/pb/im/oidb/cmd0xd50/cmd0xd50_pb2.py b/cai/pb/im/oidb/cmd0xd50/cmd0xd50_pb2.py
index e4a6fb27..51251c5c 100644
--- a/cai/pb/im/oidb/cmd0xd50/cmd0xd50_pb2.py
+++ b/cai/pb/im/oidb/cmd0xd50/cmd0xd50_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/im/oidb/cmd0xd50/cmd0xd50.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -13,544 +14,14 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/im/oidb/cmd0xd50/cmd0xd50.proto',
-  package='im.oidb.cmd0xd50',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n&cai/pb/im/oidb/cmd0xd50/cmd0xd50.proto\x12\x10im.oidb.cmd0xd50\"\xe8\x04\n\rExtSnsFrdData\x12\x0f\n\x07\x66rd_uin\x18\x01 \x01(\x04\x12\x0f\n\x06lovers\x18\xfaU \x01(\x0c\x12\x14\n\nconfidante\x18\x8a\xa4\x01 \x01(\x0c\x12\x0f\n\x05\x62uddy\x18\x9a\xf2\x01 \x01(\x0c\x12\x12\n\x08\x66rd_tree\x18\xa9\xc0\x02 \x01(\x0c\x12\x0e\n\x04\x63hat\x18\xb9\x8e\x03 \x01(\x0c\x12\x10\n\x06praise\x18\xc9\xdc\x03 \x01(\x0c\x12\x14\n\nqzone_love\x18\xd9\xaa\x04 \x01(\x0c\x12\x15\n\x0bqzone_house\x18\xe9\xf8\x04 \x01(\x0c\x12\x16\n\x0cmusic_switch\x18\xf9\xc6\x05 \x01(\x0c\x12\x1f\n\x15mutualmark_alienation\x18\x89\x95\x06 \x01(\x0c\x12\x18\n\x0eunread_message\x18\x99\xe3\x06 \x01(\x0c\x12\x0e\n\x04\x62oat\x18\xa9\xb1\x07 \x01(\x0c\x12\x13\n\tclose_frd\x18\xb9\xff\x07 \x01(\x0c\x12\x1a\n\x10mutualmark_score\x18\xc9\xcd\x08 \x01(\x0c\x12\x16\n\x0cksing_switch\x18\xd9\x9b\t \x01(\x0c\x12\x13\n\tlbs_share\x18\x89\x86\x0b \x01(\x0c\x12\x18\n\x0e\x64ont_forget_me\x18\xb9\xf0\x0c \x01(\x0c\x12)\n\x1fmy_online_status_visible_to_frd\x18\xc9\xbe\r \x01(\x0c\x12)\n\x1f\x66rd_online_status_visible_to_me\x18\xca\xbe\r \x01(\x0c\x12\x18\n\x0evisitor_record\x18\xd9\x8c\x0e \x01(\x0c\x12\x1a\n\x10\x66rd_steal_record\x18\xda\x8c\x0e \x01(\x0c\x12\x19\n\x0fmy_steal_record\x18\xdb\x8c\x0e \x01(\x0c\x12\x10\n\x06\x61vgame\x18\xe9\xda\x0e \x01(\x0c\x12\x17\n\raio_quick_app\x18\xf9\xa8\x0f \x01(\x0c\"!\n\x11KSingRelationInfo\x12\x0c\n\x04\x66lag\x18\x01 \x01(\r\"\xac\x06\n\x07ReqBody\x12\r\n\x05\x61ppid\x18\x01 \x01(\x04\x12\x14\n\x0cmax_pkg_size\x18\x02 \x01(\r\x12\x12\n\nstart_time\x18\x03 \x01(\r\x12\x13\n\x0bstart_index\x18\x04 \x01(\r\x12\x0f\n\x07req_num\x18\x05 \x01(\r\x12\x10\n\x08uin_list\x18\x06 \x03(\x04\x12\x13\n\nreq_lovers\x18\xfaU \x01(\r\x12\x18\n\x0ereq_confidante\x18\x8a\xa4\x01 \x01(\r\x12\x13\n\treq_buddy\x18\x9a\xf2\x01 \x01(\r\x12\x16\n\x0creq_frd_tree\x18\xa9\xc0\x02 \x01(\r\x12\x12\n\x08req_chat\x18\xb9\x8e\x03 \x01(\r\x12\x14\n\nreq_praise\x18\xc9\xdc\x03 \x01(\r\x12\x18\n\x0ereq_qzone_love\x18\xd9\xaa\x04 \x01(\r\x12\x19\n\x0freq_qzone_house\x18\xe9\xf8\x04 \x01(\r\x12\x1a\n\x10req_music_switch\x18\xf9\xc6\x05 \x01(\r\x12#\n\x19req_mutualmark_alienation\x18\x89\x95\x06 \x01(\r\x12\x1c\n\x12req_unread_message\x18\x99\xe3\x06 \x01(\r\x12\x12\n\x08req_boat\x18\xa9\xb1\x07 \x01(\r\x12\x17\n\rreq_close_frd\x18\xb9\xff\x07 \x01(\r\x12\x1e\n\x14req_mutualmark_score\x18\xc9\xcd\x08 \x01(\r\x12\x1a\n\x10req_ksing_switch\x18\xd9\x9b\t \x01(\r\x12!\n\x17req_mutualmark_lbsshare\x18\x89\x86\x0b \x01(\r\x12\x1c\n\x12req_dont_forget_me\x18\xb9\xf0\x0c \x01(\r\x12-\n#req_my_online_status_visible_to_frd\x18\xc9\xbe\r \x01(\r\x12-\n#req_frd_online_status_visible_to_me\x18\xca\xbe\r \x01(\r\x12\x1c\n\x12req_visitor_record\x18\xd9\x8c\x0e \x01(\r\x12\x1e\n\x14req_frd_steal_record\x18\xda\x8c\x0e \x01(\r\x12\x1d\n\x13req_my_steal_record\x18\xdb\x8c\x0e \x01(\r\x12\x14\n\nreq_avgame\x18\xe9\xda\x0e \x01(\r\x12\x1b\n\x11req_aio_quick_app\x18\xf9\xa8\x0f \x01(\r\"z\n\x07RspBody\x12\x34\n\x0bupdate_data\x18\x01 \x03(\x0b\x32\x1f.im.oidb.cmd0xd50.ExtSnsFrdData\x12\x0c\n\x04over\x18\x0b \x01(\r\x12\x12\n\nnext_start\x18\x0c \x01(\r\x12\x17\n\x0funfinished_uins\x18\r \x03(\x04'
-)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&cai/pb/im/oidb/cmd0xd50/cmd0xd50.proto\x12\x10im.oidb.cmd0xd50\"\xe8\x04\n\rExtSnsFrdData\x12\x0f\n\x07\x66rd_uin\x18\x01 \x01(\x04\x12\x0f\n\x06lovers\x18\xfaU \x01(\x0c\x12\x14\n\nconfidante\x18\x8a\xa4\x01 \x01(\x0c\x12\x0f\n\x05\x62uddy\x18\x9a\xf2\x01 \x01(\x0c\x12\x12\n\x08\x66rd_tree\x18\xa9\xc0\x02 \x01(\x0c\x12\x0e\n\x04\x63hat\x18\xb9\x8e\x03 \x01(\x0c\x12\x10\n\x06praise\x18\xc9\xdc\x03 \x01(\x0c\x12\x14\n\nqzone_love\x18\xd9\xaa\x04 \x01(\x0c\x12\x15\n\x0bqzone_house\x18\xe9\xf8\x04 \x01(\x0c\x12\x16\n\x0cmusic_switch\x18\xf9\xc6\x05 \x01(\x0c\x12\x1f\n\x15mutualmark_alienation\x18\x89\x95\x06 \x01(\x0c\x12\x18\n\x0eunread_message\x18\x99\xe3\x06 \x01(\x0c\x12\x0e\n\x04\x62oat\x18\xa9\xb1\x07 \x01(\x0c\x12\x13\n\tclose_frd\x18\xb9\xff\x07 \x01(\x0c\x12\x1a\n\x10mutualmark_score\x18\xc9\xcd\x08 \x01(\x0c\x12\x16\n\x0cksing_switch\x18\xd9\x9b\t \x01(\x0c\x12\x13\n\tlbs_share\x18\x89\x86\x0b \x01(\x0c\x12\x18\n\x0e\x64ont_forget_me\x18\xb9\xf0\x0c \x01(\x0c\x12)\n\x1fmy_online_status_visible_to_frd\x18\xc9\xbe\r \x01(\x0c\x12)\n\x1f\x66rd_online_status_visible_to_me\x18\xca\xbe\r \x01(\x0c\x12\x18\n\x0evisitor_record\x18\xd9\x8c\x0e \x01(\x0c\x12\x1a\n\x10\x66rd_steal_record\x18\xda\x8c\x0e \x01(\x0c\x12\x19\n\x0fmy_steal_record\x18\xdb\x8c\x0e \x01(\x0c\x12\x10\n\x06\x61vgame\x18\xe9\xda\x0e \x01(\x0c\x12\x17\n\raio_quick_app\x18\xf9\xa8\x0f \x01(\x0c\"!\n\x11KSingRelationInfo\x12\x0c\n\x04\x66lag\x18\x01 \x01(\r\"\xac\x06\n\x07ReqBody\x12\r\n\x05\x61ppid\x18\x01 \x01(\x04\x12\x14\n\x0cmax_pkg_size\x18\x02 \x01(\r\x12\x12\n\nstart_time\x18\x03 \x01(\r\x12\x13\n\x0bstart_index\x18\x04 \x01(\r\x12\x0f\n\x07req_num\x18\x05 \x01(\r\x12\x10\n\x08uin_list\x18\x06 \x03(\x04\x12\x13\n\nreq_lovers\x18\xfaU \x01(\r\x12\x18\n\x0ereq_confidante\x18\x8a\xa4\x01 \x01(\r\x12\x13\n\treq_buddy\x18\x9a\xf2\x01 \x01(\r\x12\x16\n\x0creq_frd_tree\x18\xa9\xc0\x02 \x01(\r\x12\x12\n\x08req_chat\x18\xb9\x8e\x03 \x01(\r\x12\x14\n\nreq_praise\x18\xc9\xdc\x03 \x01(\r\x12\x18\n\x0ereq_qzone_love\x18\xd9\xaa\x04 \x01(\r\x12\x19\n\x0freq_qzone_house\x18\xe9\xf8\x04 \x01(\r\x12\x1a\n\x10req_music_switch\x18\xf9\xc6\x05 \x01(\r\x12#\n\x19req_mutualmark_alienation\x18\x89\x95\x06 \x01(\r\x12\x1c\n\x12req_unread_message\x18\x99\xe3\x06 \x01(\r\x12\x12\n\x08req_boat\x18\xa9\xb1\x07 \x01(\r\x12\x17\n\rreq_close_frd\x18\xb9\xff\x07 \x01(\r\x12\x1e\n\x14req_mutualmark_score\x18\xc9\xcd\x08 \x01(\r\x12\x1a\n\x10req_ksing_switch\x18\xd9\x9b\t \x01(\r\x12!\n\x17req_mutualmark_lbsshare\x18\x89\x86\x0b \x01(\r\x12\x1c\n\x12req_dont_forget_me\x18\xb9\xf0\x0c \x01(\r\x12-\n#req_my_online_status_visible_to_frd\x18\xc9\xbe\r \x01(\r\x12-\n#req_frd_online_status_visible_to_me\x18\xca\xbe\r \x01(\r\x12\x1c\n\x12req_visitor_record\x18\xd9\x8c\x0e \x01(\r\x12\x1e\n\x14req_frd_steal_record\x18\xda\x8c\x0e \x01(\r\x12\x1d\n\x13req_my_steal_record\x18\xdb\x8c\x0e \x01(\r\x12\x14\n\nreq_avgame\x18\xe9\xda\x0e \x01(\r\x12\x1b\n\x11req_aio_quick_app\x18\xf9\xa8\x0f \x01(\r\"z\n\x07RspBody\x12\x34\n\x0bupdate_data\x18\x01 \x03(\x0b\x32\x1f.im.oidb.cmd0xd50.ExtSnsFrdData\x12\x0c\n\x04over\x18\x0b \x01(\r\x12\x12\n\nnext_start\x18\x0c \x01(\r\x12\x17\n\x0funfinished_uins\x18\r \x03(\x04')
 
 
 
-
-_EXTSNSFRDDATA = _descriptor.Descriptor(
-  name='ExtSnsFrdData',
-  full_name='im.oidb.cmd0xd50.ExtSnsFrdData',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='frd_uin', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.frd_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='lovers', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.lovers', index=1,
-      number=11002, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='confidante', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.confidante', index=2,
-      number=21002, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='buddy', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.buddy', index=3,
-      number=31002, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='frd_tree', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.frd_tree', index=4,
-      number=41001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='chat', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.chat', index=5,
-      number=51001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='praise', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.praise', index=6,
-      number=61001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='qzone_love', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.qzone_love', index=7,
-      number=71001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='qzone_house', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.qzone_house', index=8,
-      number=81001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='music_switch', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.music_switch', index=9,
-      number=91001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='mutualmark_alienation', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.mutualmark_alienation', index=10,
-      number=101001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='unread_message', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.unread_message', index=11,
-      number=111001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='boat', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.boat', index=12,
-      number=121001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='close_frd', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.close_frd', index=13,
-      number=131001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='mutualmark_score', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.mutualmark_score', index=14,
-      number=141001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ksing_switch', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.ksing_switch', index=15,
-      number=151001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='lbs_share', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.lbs_share', index=16,
-      number=181001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='dont_forget_me', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.dont_forget_me', index=17,
-      number=211001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='my_online_status_visible_to_frd', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.my_online_status_visible_to_frd', index=18,
-      number=221001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='frd_online_status_visible_to_me', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.frd_online_status_visible_to_me', index=19,
-      number=221002, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='visitor_record', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.visitor_record', index=20,
-      number=231001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='frd_steal_record', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.frd_steal_record', index=21,
-      number=231002, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='my_steal_record', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.my_steal_record', index=22,
-      number=231003, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='avgame', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.avgame', index=23,
-      number=241001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='aio_quick_app', full_name='im.oidb.cmd0xd50.ExtSnsFrdData.aio_quick_app', index=24,
-      number=251001, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=61,
-  serialized_end=677,
-)
-
-
-_KSINGRELATIONINFO = _descriptor.Descriptor(
-  name='KSingRelationInfo',
-  full_name='im.oidb.cmd0xd50.KSingRelationInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='im.oidb.cmd0xd50.KSingRelationInfo.flag', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=679,
-  serialized_end=712,
-)
-
-
-_REQBODY = _descriptor.Descriptor(
-  name='ReqBody',
-  full_name='im.oidb.cmd0xd50.ReqBody',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='appid', full_name='im.oidb.cmd0xd50.ReqBody.appid', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='max_pkg_size', full_name='im.oidb.cmd0xd50.ReqBody.max_pkg_size', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='start_time', full_name='im.oidb.cmd0xd50.ReqBody.start_time', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='start_index', full_name='im.oidb.cmd0xd50.ReqBody.start_index', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_num', full_name='im.oidb.cmd0xd50.ReqBody.req_num', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='uin_list', full_name='im.oidb.cmd0xd50.ReqBody.uin_list', index=5,
-      number=6, type=4, cpp_type=4, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_lovers', full_name='im.oidb.cmd0xd50.ReqBody.req_lovers', index=6,
-      number=11002, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_confidante', full_name='im.oidb.cmd0xd50.ReqBody.req_confidante', index=7,
-      number=21002, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_buddy', full_name='im.oidb.cmd0xd50.ReqBody.req_buddy', index=8,
-      number=31002, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_frd_tree', full_name='im.oidb.cmd0xd50.ReqBody.req_frd_tree', index=9,
-      number=41001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_chat', full_name='im.oidb.cmd0xd50.ReqBody.req_chat', index=10,
-      number=51001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_praise', full_name='im.oidb.cmd0xd50.ReqBody.req_praise', index=11,
-      number=61001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_qzone_love', full_name='im.oidb.cmd0xd50.ReqBody.req_qzone_love', index=12,
-      number=71001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_qzone_house', full_name='im.oidb.cmd0xd50.ReqBody.req_qzone_house', index=13,
-      number=81001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_music_switch', full_name='im.oidb.cmd0xd50.ReqBody.req_music_switch', index=14,
-      number=91001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_mutualmark_alienation', full_name='im.oidb.cmd0xd50.ReqBody.req_mutualmark_alienation', index=15,
-      number=101001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_unread_message', full_name='im.oidb.cmd0xd50.ReqBody.req_unread_message', index=16,
-      number=111001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_boat', full_name='im.oidb.cmd0xd50.ReqBody.req_boat', index=17,
-      number=121001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_close_frd', full_name='im.oidb.cmd0xd50.ReqBody.req_close_frd', index=18,
-      number=131001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_mutualmark_score', full_name='im.oidb.cmd0xd50.ReqBody.req_mutualmark_score', index=19,
-      number=141001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_ksing_switch', full_name='im.oidb.cmd0xd50.ReqBody.req_ksing_switch', index=20,
-      number=151001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_mutualmark_lbsshare', full_name='im.oidb.cmd0xd50.ReqBody.req_mutualmark_lbsshare', index=21,
-      number=181001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_dont_forget_me', full_name='im.oidb.cmd0xd50.ReqBody.req_dont_forget_me', index=22,
-      number=211001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_my_online_status_visible_to_frd', full_name='im.oidb.cmd0xd50.ReqBody.req_my_online_status_visible_to_frd', index=23,
-      number=221001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_frd_online_status_visible_to_me', full_name='im.oidb.cmd0xd50.ReqBody.req_frd_online_status_visible_to_me', index=24,
-      number=221002, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_visitor_record', full_name='im.oidb.cmd0xd50.ReqBody.req_visitor_record', index=25,
-      number=231001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_frd_steal_record', full_name='im.oidb.cmd0xd50.ReqBody.req_frd_steal_record', index=26,
-      number=231002, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_my_steal_record', full_name='im.oidb.cmd0xd50.ReqBody.req_my_steal_record', index=27,
-      number=231003, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_avgame', full_name='im.oidb.cmd0xd50.ReqBody.req_avgame', index=28,
-      number=241001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_aio_quick_app', full_name='im.oidb.cmd0xd50.ReqBody.req_aio_quick_app', index=29,
-      number=251001, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=715,
-  serialized_end=1527,
-)
-
-
-_RSPBODY = _descriptor.Descriptor(
-  name='RspBody',
-  full_name='im.oidb.cmd0xd50.RspBody',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='update_data', full_name='im.oidb.cmd0xd50.RspBody.update_data', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='over', full_name='im.oidb.cmd0xd50.RspBody.over', index=1,
-      number=11, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='next_start', full_name='im.oidb.cmd0xd50.RspBody.next_start', index=2,
-      number=12, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='unfinished_uins', full_name='im.oidb.cmd0xd50.RspBody.unfinished_uins', index=3,
-      number=13, type=4, cpp_type=4, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1529,
-  serialized_end=1651,
-)
-
-_RSPBODY.fields_by_name['update_data'].message_type = _EXTSNSFRDDATA
-DESCRIPTOR.message_types_by_name['ExtSnsFrdData'] = _EXTSNSFRDDATA
-DESCRIPTOR.message_types_by_name['KSingRelationInfo'] = _KSINGRELATIONINFO
-DESCRIPTOR.message_types_by_name['ReqBody'] = _REQBODY
-DESCRIPTOR.message_types_by_name['RspBody'] = _RSPBODY
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_EXTSNSFRDDATA = DESCRIPTOR.message_types_by_name['ExtSnsFrdData']
+_KSINGRELATIONINFO = DESCRIPTOR.message_types_by_name['KSingRelationInfo']
+_REQBODY = DESCRIPTOR.message_types_by_name['ReqBody']
+_RSPBODY = DESCRIPTOR.message_types_by_name['RspBody']
 ExtSnsFrdData = _reflection.GeneratedProtocolMessageType('ExtSnsFrdData', (_message.Message,), {
   'DESCRIPTOR' : _EXTSNSFRDDATA,
   '__module__' : 'cai.pb.im.oidb.cmd0xd50.cmd0xd50_pb2'
@@ -579,5 +50,15 @@
   })
 _sym_db.RegisterMessage(RspBody)
 
-
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _EXTSNSFRDDATA._serialized_start=61
+  _EXTSNSFRDDATA._serialized_end=677
+  _KSINGRELATIONINFO._serialized_start=679
+  _KSINGRELATIONINFO._serialized_end=712
+  _REQBODY._serialized_start=715
+  _REQBODY._serialized_end=1527
+  _RSPBODY._serialized_start=1529
+  _RSPBODY._serialized_end=1651
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/oidb/cmd0xd50/cmd0xd50_pb2.pyi b/cai/pb/im/oidb/cmd0xd50/cmd0xd50_pb2.pyi
index 96eca976..57f1bdb8 100644
--- a/cai/pb/im/oidb/cmd0xd50/cmd0xd50_pb2.pyi
+++ b/cai/pb/im/oidb/cmd0xd50/cmd0xd50_pb2.pyi
@@ -32,10 +32,13 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class ExtSnsFrdData(Message):
-    DESCRIPTOR: Descriptor = ...
+    """tencent/im/oidb/cmd0xd50/Oidb_0xd50.java
+
+    """
+    DESCRIPTOR: Descriptor
     FRD_UIN_FIELD_NUMBER: int
     LOVERS_FIELD_NUMBER: int
     CONFIDANTE_FIELD_NUMBER: int
@@ -61,77 +64,75 @@ class ExtSnsFrdData(Message):
     MY_STEAL_RECORD_FIELD_NUMBER: int
     AVGAME_FIELD_NUMBER: int
     AIO_QUICK_APP_FIELD_NUMBER: int
-    frd_uin: int = ...
-    lovers: bytes = ...
-    confidante: bytes = ...
-    buddy: bytes = ...
-    frd_tree: bytes = ...
-    chat: bytes = ...
-    praise: bytes = ...
-    qzone_love: bytes = ...
-    qzone_house: bytes = ...
-    music_switch: bytes = ...
-    mutualmark_alienation: bytes = ...
-    unread_message: bytes = ...
-    boat: bytes = ...
-    close_frd: bytes = ...
-    mutualmark_score: bytes = ...
-    ksing_switch: bytes = ...
-    lbs_share: bytes = ...
-    dont_forget_me: bytes = ...
-    my_online_status_visible_to_frd: bytes = ...
-    frd_online_status_visible_to_me: bytes = ...
-    visitor_record: bytes = ...
-    frd_steal_record: bytes = ...
-    my_steal_record: bytes = ...
-    avgame: bytes = ...
-    aio_quick_app: bytes = ...
-
+    frd_uin: int
+    lovers: bytes
+    confidante: bytes
+    buddy: bytes
+    frd_tree: bytes
+    chat: bytes
+    praise: bytes
+    qzone_love: bytes
+    qzone_house: bytes
+    music_switch: bytes
+    mutualmark_alienation: bytes
+    unread_message: bytes
+    boat: bytes
+    close_frd: bytes
+    mutualmark_score: bytes
+    ksing_switch: bytes
+    lbs_share: bytes
+    dont_forget_me: bytes
+    my_online_status_visible_to_frd: bytes
+    frd_online_status_visible_to_me: bytes
+    visitor_record: bytes
+    frd_steal_record: bytes
+    my_steal_record: bytes
+    avgame: bytes
+    aio_quick_app: bytes
     def __init__(self,
         *,
-        frd_uin : Optional[int] = ...,
-        lovers : Optional[bytes] = ...,
-        confidante : Optional[bytes] = ...,
-        buddy : Optional[bytes] = ...,
-        frd_tree : Optional[bytes] = ...,
-        chat : Optional[bytes] = ...,
-        praise : Optional[bytes] = ...,
-        qzone_love : Optional[bytes] = ...,
-        qzone_house : Optional[bytes] = ...,
-        music_switch : Optional[bytes] = ...,
-        mutualmark_alienation : Optional[bytes] = ...,
-        unread_message : Optional[bytes] = ...,
-        boat : Optional[bytes] = ...,
-        close_frd : Optional[bytes] = ...,
-        mutualmark_score : Optional[bytes] = ...,
-        ksing_switch : Optional[bytes] = ...,
-        lbs_share : Optional[bytes] = ...,
-        dont_forget_me : Optional[bytes] = ...,
-        my_online_status_visible_to_frd : Optional[bytes] = ...,
-        frd_online_status_visible_to_me : Optional[bytes] = ...,
-        visitor_record : Optional[bytes] = ...,
-        frd_steal_record : Optional[bytes] = ...,
-        my_steal_record : Optional[bytes] = ...,
-        avgame : Optional[bytes] = ...,
-        aio_quick_app : Optional[bytes] = ...,
+        frd_uin: Optional[int] = ...,
+        lovers: Optional[bytes] = ...,
+        confidante: Optional[bytes] = ...,
+        buddy: Optional[bytes] = ...,
+        frd_tree: Optional[bytes] = ...,
+        chat: Optional[bytes] = ...,
+        praise: Optional[bytes] = ...,
+        qzone_love: Optional[bytes] = ...,
+        qzone_house: Optional[bytes] = ...,
+        music_switch: Optional[bytes] = ...,
+        mutualmark_alienation: Optional[bytes] = ...,
+        unread_message: Optional[bytes] = ...,
+        boat: Optional[bytes] = ...,
+        close_frd: Optional[bytes] = ...,
+        mutualmark_score: Optional[bytes] = ...,
+        ksing_switch: Optional[bytes] = ...,
+        lbs_share: Optional[bytes] = ...,
+        dont_forget_me: Optional[bytes] = ...,
+        my_online_status_visible_to_frd: Optional[bytes] = ...,
+        frd_online_status_visible_to_me: Optional[bytes] = ...,
+        visitor_record: Optional[bytes] = ...,
+        frd_steal_record: Optional[bytes] = ...,
+        my_steal_record: Optional[bytes] = ...,
+        avgame: Optional[bytes] = ...,
+        aio_quick_app: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"aio_quick_app",b"aio_quick_app",u"avgame",b"avgame",u"boat",b"boat",u"buddy",b"buddy",u"chat",b"chat",u"close_frd",b"close_frd",u"confidante",b"confidante",u"dont_forget_me",b"dont_forget_me",u"frd_online_status_visible_to_me",b"frd_online_status_visible_to_me",u"frd_steal_record",b"frd_steal_record",u"frd_tree",b"frd_tree",u"frd_uin",b"frd_uin",u"ksing_switch",b"ksing_switch",u"lbs_share",b"lbs_share",u"lovers",b"lovers",u"music_switch",b"music_switch",u"mutualmark_alienation",b"mutualmark_alienation",u"mutualmark_score",b"mutualmark_score",u"my_online_status_visible_to_frd",b"my_online_status_visible_to_frd",u"my_steal_record",b"my_steal_record",u"praise",b"praise",u"qzone_house",b"qzone_house",u"qzone_love",b"qzone_love",u"unread_message",b"unread_message",u"visitor_record",b"visitor_record"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"aio_quick_app",b"aio_quick_app",u"avgame",b"avgame",u"boat",b"boat",u"buddy",b"buddy",u"chat",b"chat",u"close_frd",b"close_frd",u"confidante",b"confidante",u"dont_forget_me",b"dont_forget_me",u"frd_online_status_visible_to_me",b"frd_online_status_visible_to_me",u"frd_steal_record",b"frd_steal_record",u"frd_tree",b"frd_tree",u"frd_uin",b"frd_uin",u"ksing_switch",b"ksing_switch",u"lbs_share",b"lbs_share",u"lovers",b"lovers",u"music_switch",b"music_switch",u"mutualmark_alienation",b"mutualmark_alienation",u"mutualmark_score",b"mutualmark_score",u"my_online_status_visible_to_frd",b"my_online_status_visible_to_frd",u"my_steal_record",b"my_steal_record",u"praise",b"praise",u"qzone_house",b"qzone_house",u"qzone_love",b"qzone_love",u"unread_message",b"unread_message",u"visitor_record",b"visitor_record"]) -> None: ...
+    def HasField(self, field_name: Literal["aio_quick_app",b"aio_quick_app","avgame",b"avgame","boat",b"boat","buddy",b"buddy","chat",b"chat","close_frd",b"close_frd","confidante",b"confidante","dont_forget_me",b"dont_forget_me","frd_online_status_visible_to_me",b"frd_online_status_visible_to_me","frd_steal_record",b"frd_steal_record","frd_tree",b"frd_tree","frd_uin",b"frd_uin","ksing_switch",b"ksing_switch","lbs_share",b"lbs_share","lovers",b"lovers","music_switch",b"music_switch","mutualmark_alienation",b"mutualmark_alienation","mutualmark_score",b"mutualmark_score","my_online_status_visible_to_frd",b"my_online_status_visible_to_frd","my_steal_record",b"my_steal_record","praise",b"praise","qzone_house",b"qzone_house","qzone_love",b"qzone_love","unread_message",b"unread_message","visitor_record",b"visitor_record"]) -> bool: ...
+    def ClearField(self, field_name: Literal["aio_quick_app",b"aio_quick_app","avgame",b"avgame","boat",b"boat","buddy",b"buddy","chat",b"chat","close_frd",b"close_frd","confidante",b"confidante","dont_forget_me",b"dont_forget_me","frd_online_status_visible_to_me",b"frd_online_status_visible_to_me","frd_steal_record",b"frd_steal_record","frd_tree",b"frd_tree","frd_uin",b"frd_uin","ksing_switch",b"ksing_switch","lbs_share",b"lbs_share","lovers",b"lovers","music_switch",b"music_switch","mutualmark_alienation",b"mutualmark_alienation","mutualmark_score",b"mutualmark_score","my_online_status_visible_to_frd",b"my_online_status_visible_to_frd","my_steal_record",b"my_steal_record","praise",b"praise","qzone_house",b"qzone_house","qzone_love",b"qzone_love","unread_message",b"unread_message","visitor_record",b"visitor_record"]) -> None: ...
 
 class KSingRelationInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FLAG_FIELD_NUMBER: int
-    flag: int = ...
-
+    flag: int
     def __init__(self,
         *,
-        flag : Optional[int] = ...,
+        flag: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"flag",b"flag"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"flag",b"flag"]) -> None: ...
+    def HasField(self, field_name: Literal["flag",b"flag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["flag",b"flag"]) -> None: ...
 
 class ReqBody(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     APPID_FIELD_NUMBER: int
     MAX_PKG_SIZE_FIELD_NUMBER: int
     START_TIME_FIELD_NUMBER: int
@@ -162,92 +163,91 @@ class ReqBody(Message):
     REQ_MY_STEAL_RECORD_FIELD_NUMBER: int
     REQ_AVGAME_FIELD_NUMBER: int
     REQ_AIO_QUICK_APP_FIELD_NUMBER: int
-    appid: int = ...
-    max_pkg_size: int = ...
-    start_time: int = ...
-    start_index: int = ...
-    req_num: int = ...
-    uin_list: RepeatedScalarFieldContainer[int] = ...
-    req_lovers: int = ...
-    req_confidante: int = ...
-    req_buddy: int = ...
-    req_frd_tree: int = ...
-    req_chat: int = ...
-    req_praise: int = ...
-    req_qzone_love: int = ...
-    req_qzone_house: int = ...
-    req_music_switch: int = ...
-    req_mutualmark_alienation: int = ...
-    req_unread_message: int = ...
-    req_boat: int = ...
-    req_close_frd: int = ...
-    req_mutualmark_score: int = ...
-    req_ksing_switch: int = ...
-    req_mutualmark_lbsshare: int = ...
-    req_dont_forget_me: int = ...
-    req_my_online_status_visible_to_frd: int = ...
-    req_frd_online_status_visible_to_me: int = ...
-    req_visitor_record: int = ...
-    req_frd_steal_record: int = ...
-    req_my_steal_record: int = ...
-    req_avgame: int = ...
-    req_aio_quick_app: int = ...
-
+    appid: int
+    max_pkg_size: int
+    start_time: int
+    start_index: int
+    req_num: int
+    @property
+    def uin_list(self) -> RepeatedScalarFieldContainer[int]: ...
+    req_lovers: int
+    req_confidante: int
+    req_buddy: int
+    req_frd_tree: int
+    req_chat: int
+    req_praise: int
+    req_qzone_love: int
+    req_qzone_house: int
+    req_music_switch: int
+    req_mutualmark_alienation: int
+    req_unread_message: int
+    req_boat: int
+    req_close_frd: int
+    req_mutualmark_score: int
+    req_ksing_switch: int
+    req_mutualmark_lbsshare: int
+    req_dont_forget_me: int
+    req_my_online_status_visible_to_frd: int
+    req_frd_online_status_visible_to_me: int
+    req_visitor_record: int
+    req_frd_steal_record: int
+    req_my_steal_record: int
+    req_avgame: int
+    req_aio_quick_app: int
     def __init__(self,
         *,
-        appid : Optional[int] = ...,
-        max_pkg_size : Optional[int] = ...,
-        start_time : Optional[int] = ...,
-        start_index : Optional[int] = ...,
-        req_num : Optional[int] = ...,
-        uin_list : Optional[Iterable[int]] = ...,
-        req_lovers : Optional[int] = ...,
-        req_confidante : Optional[int] = ...,
-        req_buddy : Optional[int] = ...,
-        req_frd_tree : Optional[int] = ...,
-        req_chat : Optional[int] = ...,
-        req_praise : Optional[int] = ...,
-        req_qzone_love : Optional[int] = ...,
-        req_qzone_house : Optional[int] = ...,
-        req_music_switch : Optional[int] = ...,
-        req_mutualmark_alienation : Optional[int] = ...,
-        req_unread_message : Optional[int] = ...,
-        req_boat : Optional[int] = ...,
-        req_close_frd : Optional[int] = ...,
-        req_mutualmark_score : Optional[int] = ...,
-        req_ksing_switch : Optional[int] = ...,
-        req_mutualmark_lbsshare : Optional[int] = ...,
-        req_dont_forget_me : Optional[int] = ...,
-        req_my_online_status_visible_to_frd : Optional[int] = ...,
-        req_frd_online_status_visible_to_me : Optional[int] = ...,
-        req_visitor_record : Optional[int] = ...,
-        req_frd_steal_record : Optional[int] = ...,
-        req_my_steal_record : Optional[int] = ...,
-        req_avgame : Optional[int] = ...,
-        req_aio_quick_app : Optional[int] = ...,
+        appid: Optional[int] = ...,
+        max_pkg_size: Optional[int] = ...,
+        start_time: Optional[int] = ...,
+        start_index: Optional[int] = ...,
+        req_num: Optional[int] = ...,
+        uin_list: Optional[Iterable[int]] = ...,
+        req_lovers: Optional[int] = ...,
+        req_confidante: Optional[int] = ...,
+        req_buddy: Optional[int] = ...,
+        req_frd_tree: Optional[int] = ...,
+        req_chat: Optional[int] = ...,
+        req_praise: Optional[int] = ...,
+        req_qzone_love: Optional[int] = ...,
+        req_qzone_house: Optional[int] = ...,
+        req_music_switch: Optional[int] = ...,
+        req_mutualmark_alienation: Optional[int] = ...,
+        req_unread_message: Optional[int] = ...,
+        req_boat: Optional[int] = ...,
+        req_close_frd: Optional[int] = ...,
+        req_mutualmark_score: Optional[int] = ...,
+        req_ksing_switch: Optional[int] = ...,
+        req_mutualmark_lbsshare: Optional[int] = ...,
+        req_dont_forget_me: Optional[int] = ...,
+        req_my_online_status_visible_to_frd: Optional[int] = ...,
+        req_frd_online_status_visible_to_me: Optional[int] = ...,
+        req_visitor_record: Optional[int] = ...,
+        req_frd_steal_record: Optional[int] = ...,
+        req_my_steal_record: Optional[int] = ...,
+        req_avgame: Optional[int] = ...,
+        req_aio_quick_app: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"appid",b"appid",u"max_pkg_size",b"max_pkg_size",u"req_aio_quick_app",b"req_aio_quick_app",u"req_avgame",b"req_avgame",u"req_boat",b"req_boat",u"req_buddy",b"req_buddy",u"req_chat",b"req_chat",u"req_close_frd",b"req_close_frd",u"req_confidante",b"req_confidante",u"req_dont_forget_me",b"req_dont_forget_me",u"req_frd_online_status_visible_to_me",b"req_frd_online_status_visible_to_me",u"req_frd_steal_record",b"req_frd_steal_record",u"req_frd_tree",b"req_frd_tree",u"req_ksing_switch",b"req_ksing_switch",u"req_lovers",b"req_lovers",u"req_music_switch",b"req_music_switch",u"req_mutualmark_alienation",b"req_mutualmark_alienation",u"req_mutualmark_lbsshare",b"req_mutualmark_lbsshare",u"req_mutualmark_score",b"req_mutualmark_score",u"req_my_online_status_visible_to_frd",b"req_my_online_status_visible_to_frd",u"req_my_steal_record",b"req_my_steal_record",u"req_num",b"req_num",u"req_praise",b"req_praise",u"req_qzone_house",b"req_qzone_house",u"req_qzone_love",b"req_qzone_love",u"req_unread_message",b"req_unread_message",u"req_visitor_record",b"req_visitor_record",u"start_index",b"start_index",u"start_time",b"start_time"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"appid",b"appid",u"max_pkg_size",b"max_pkg_size",u"req_aio_quick_app",b"req_aio_quick_app",u"req_avgame",b"req_avgame",u"req_boat",b"req_boat",u"req_buddy",b"req_buddy",u"req_chat",b"req_chat",u"req_close_frd",b"req_close_frd",u"req_confidante",b"req_confidante",u"req_dont_forget_me",b"req_dont_forget_me",u"req_frd_online_status_visible_to_me",b"req_frd_online_status_visible_to_me",u"req_frd_steal_record",b"req_frd_steal_record",u"req_frd_tree",b"req_frd_tree",u"req_ksing_switch",b"req_ksing_switch",u"req_lovers",b"req_lovers",u"req_music_switch",b"req_music_switch",u"req_mutualmark_alienation",b"req_mutualmark_alienation",u"req_mutualmark_lbsshare",b"req_mutualmark_lbsshare",u"req_mutualmark_score",b"req_mutualmark_score",u"req_my_online_status_visible_to_frd",b"req_my_online_status_visible_to_frd",u"req_my_steal_record",b"req_my_steal_record",u"req_num",b"req_num",u"req_praise",b"req_praise",u"req_qzone_house",b"req_qzone_house",u"req_qzone_love",b"req_qzone_love",u"req_unread_message",b"req_unread_message",u"req_visitor_record",b"req_visitor_record",u"start_index",b"start_index",u"start_time",b"start_time",u"uin_list",b"uin_list"]) -> None: ...
+    def HasField(self, field_name: Literal["appid",b"appid","max_pkg_size",b"max_pkg_size","req_aio_quick_app",b"req_aio_quick_app","req_avgame",b"req_avgame","req_boat",b"req_boat","req_buddy",b"req_buddy","req_chat",b"req_chat","req_close_frd",b"req_close_frd","req_confidante",b"req_confidante","req_dont_forget_me",b"req_dont_forget_me","req_frd_online_status_visible_to_me",b"req_frd_online_status_visible_to_me","req_frd_steal_record",b"req_frd_steal_record","req_frd_tree",b"req_frd_tree","req_ksing_switch",b"req_ksing_switch","req_lovers",b"req_lovers","req_music_switch",b"req_music_switch","req_mutualmark_alienation",b"req_mutualmark_alienation","req_mutualmark_lbsshare",b"req_mutualmark_lbsshare","req_mutualmark_score",b"req_mutualmark_score","req_my_online_status_visible_to_frd",b"req_my_online_status_visible_to_frd","req_my_steal_record",b"req_my_steal_record","req_num",b"req_num","req_praise",b"req_praise","req_qzone_house",b"req_qzone_house","req_qzone_love",b"req_qzone_love","req_unread_message",b"req_unread_message","req_visitor_record",b"req_visitor_record","start_index",b"start_index","start_time",b"start_time"]) -> bool: ...
+    def ClearField(self, field_name: Literal["appid",b"appid","max_pkg_size",b"max_pkg_size","req_aio_quick_app",b"req_aio_quick_app","req_avgame",b"req_avgame","req_boat",b"req_boat","req_buddy",b"req_buddy","req_chat",b"req_chat","req_close_frd",b"req_close_frd","req_confidante",b"req_confidante","req_dont_forget_me",b"req_dont_forget_me","req_frd_online_status_visible_to_me",b"req_frd_online_status_visible_to_me","req_frd_steal_record",b"req_frd_steal_record","req_frd_tree",b"req_frd_tree","req_ksing_switch",b"req_ksing_switch","req_lovers",b"req_lovers","req_music_switch",b"req_music_switch","req_mutualmark_alienation",b"req_mutualmark_alienation","req_mutualmark_lbsshare",b"req_mutualmark_lbsshare","req_mutualmark_score",b"req_mutualmark_score","req_my_online_status_visible_to_frd",b"req_my_online_status_visible_to_frd","req_my_steal_record",b"req_my_steal_record","req_num",b"req_num","req_praise",b"req_praise","req_qzone_house",b"req_qzone_house","req_qzone_love",b"req_qzone_love","req_unread_message",b"req_unread_message","req_visitor_record",b"req_visitor_record","start_index",b"start_index","start_time",b"start_time","uin_list",b"uin_list"]) -> None: ...
 
 class RspBody(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     UPDATE_DATA_FIELD_NUMBER: int
     OVER_FIELD_NUMBER: int
     NEXT_START_FIELD_NUMBER: int
     UNFINISHED_UINS_FIELD_NUMBER: int
-    over: int = ...
-    next_start: int = ...
-    unfinished_uins: RepeatedScalarFieldContainer[int] = ...
-
     @property
     def update_data(self) -> RepeatedCompositeFieldContainer[ExtSnsFrdData]: ...
-
+    over: int
+    next_start: int
+    @property
+    def unfinished_uins(self) -> RepeatedScalarFieldContainer[int]: ...
     def __init__(self,
         *,
-        update_data : Optional[Iterable[ExtSnsFrdData]] = ...,
-        over : Optional[int] = ...,
-        next_start : Optional[int] = ...,
-        unfinished_uins : Optional[Iterable[int]] = ...,
+        update_data: Optional[Iterable[ExtSnsFrdData]] = ...,
+        over: Optional[int] = ...,
+        next_start: Optional[int] = ...,
+        unfinished_uins: Optional[Iterable[int]] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"next_start",b"next_start",u"over",b"over"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"next_start",b"next_start",u"over",b"over",u"unfinished_uins",b"unfinished_uins",u"update_data",b"update_data"]) -> None: ...
+    def HasField(self, field_name: Literal["next_start",b"next_start","over",b"over"]) -> bool: ...
+    def ClearField(self, field_name: Literal["next_start",b"next_start","over",b"over","unfinished_uins",b"unfinished_uins","update_data",b"update_data"]) -> None: ...
diff --git a/cai/pb/im/oidb/group0x857/group0x857_pb2.py b/cai/pb/im/oidb/group0x857/group0x857_pb2.py
index ef7632b0..7bee7469 100644
--- a/cai/pb/im/oidb/group0x857/group0x857_pb2.py
+++ b/cai/pb/im/oidb/group0x857/group0x857_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: group0x857.proto
+# source: cai/pb/im/oidb/group0x857/group0x857.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -14,7 +14,7 @@
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10group0x857.proto\"\x82\x02\n\rNotifyMsgBody\x12(\n\x0eoptMsgGrayTips\x18\x05 \x01(\x0b\x32\x10.AIOGrayTipsInfo\x12\'\n\roptMsgRedTips\x18\t \x01(\x0b\x32\x10.RedGrayTipsInfo\x12,\n\x0coptMsgRecall\x18\x0b \x01(\x0b\x32\x16.MessageRecallReminder\x12.\n\x11optGeneralGrayTip\x18\x1a \x01(\x0b\x32\x13.GeneralGrayTipInfo\x12+\n\x10qqGroupDigestMsg\x18! \x01(\x0b\x32\x11.QQGroupDigestMsg\x12\x13\n\x0bserviceType\x18\r \x01(\x05\"\x82\x01\n\x0f\x41IOGrayTipsInfo\x12\x12\n\nshowLatest\x18\x01 \x01(\r\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\x12\x0e\n\x06remind\x18\x03 \x01(\r\x12\r\n\x05\x62rief\x18\x04 \x01(\x0c\x12\x13\n\x0breceiverUin\x18\x05 \x01(\x04\x12\x16\n\x0ereliaoAdminOpt\x18\x06 \x01(\r\"\xb4\x01\n\x12GeneralGrayTipInfo\x12\x10\n\x08\x62usiType\x18\x01 \x01(\x04\x12\x0e\n\x06\x62usiId\x18\x02 \x01(\x04\x12\x10\n\x08\x63trlFlag\x18\x03 \x01(\r\x12\x0f\n\x07\x63\x32\x63Type\x18\x04 \x01(\r\x12\x13\n\x0bserviceType\x18\x05 \x01(\r\x12\x0f\n\x07templId\x18\x06 \x01(\x04\x12\"\n\rmsgTemplParam\x18\x07 \x03(\x0b\x32\x0b.TemplParam\x12\x0f\n\x07\x63ontent\x18\x08 \x01(\t\")\n\nTemplParam\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xb2\x01\n\x15MessageRecallReminder\x12\x0b\n\x03uin\x18\x01 \x01(\x03\x12\x10\n\x08nickname\x18\x02 \x01(\x0c\x12-\n\x0frecalledMsgList\x18\x03 \x03(\x0b\x32\x14.RecalledMessageMeta\x12\x17\n\x0freminderContent\x18\x04 \x01(\x0c\x12\x0f\n\x07userdef\x18\x05 \x01(\x0c\x12\x11\n\tgroupType\x18\x06 \x01(\x05\x12\x0e\n\x06opType\x18\x07 \x01(\x05\"x\n\x13RecalledMessageMeta\x12\x0b\n\x03seq\x18\x01 \x01(\x05\x12\x0c\n\x04time\x18\x02 \x01(\x05\x12\x11\n\tmsgRandom\x18\x03 \x01(\x05\x12\x0f\n\x07msgType\x18\x04 \x01(\x05\x12\x0f\n\x07msgFlag\x18\x05 \x01(\x05\x12\x11\n\tauthorUin\x18\x06 \x01(\x03\"\xde\x01\n\x0fRedGrayTipsInfo\x12\x12\n\nshowLatest\x18\x01 \x01(\r\x12\x11\n\tsenderUin\x18\x02 \x01(\x04\x12\x13\n\x0breceiverUin\x18\x03 \x01(\x04\x12\x19\n\x11senderRichContent\x18\x04 \x01(\t\x12\x1b\n\x13receiverRichContent\x18\x05 \x01(\t\x12\x0f\n\x07\x61uthKey\x18\x06 \x01(\x0c\x12\x0f\n\x07msgType\x18\x07 \x01(\x11\x12\x11\n\tluckyFlag\x18\x08 \x01(\r\x12\x10\n\x08hideFlag\x18\t \x01(\r\x12\x10\n\x08luckyUin\x18\x0c \x01(\x04\"\xd4\x01\n\x10QQGroupDigestMsg\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0b\n\x03seq\x18\x02 \x01(\r\x12\x0e\n\x06random\x18\x03 \x01(\r\x12\x0e\n\x06opType\x18\x04 \x01(\x05\x12\x0e\n\x06sender\x18\x05 \x01(\x04\x12\x12\n\ndigestOper\x18\x06 \x01(\x04\x12\x0e\n\x06opTime\x18\x07 \x01(\r\x12\x15\n\rlastestMsgSeq\x18\x08 \x01(\r\x12\x10\n\x08operNick\x18\t \x01(\x0c\x12\x12\n\nsenderNick\x18\n \x01(\x0c\x12\x0f\n\x07\x65xtInfo\x18\x0b \x01(\x05\x42+Z)github.com/Mrs4s/MiraiGo/client/pb/notifyb\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*cai/pb/im/oidb/group0x857/group0x857.proto\"\x82\x02\n\rNotifyMsgBody\x12(\n\x0eoptMsgGrayTips\x18\x05 \x01(\x0b\x32\x10.AIOGrayTipsInfo\x12\'\n\roptMsgRedTips\x18\t \x01(\x0b\x32\x10.RedGrayTipsInfo\x12,\n\x0coptMsgRecall\x18\x0b \x01(\x0b\x32\x16.MessageRecallReminder\x12.\n\x11optGeneralGrayTip\x18\x1a \x01(\x0b\x32\x13.GeneralGrayTipInfo\x12+\n\x10qqGroupDigestMsg\x18! \x01(\x0b\x32\x11.QQGroupDigestMsg\x12\x13\n\x0bserviceType\x18\r \x01(\x05\"\x82\x01\n\x0f\x41IOGrayTipsInfo\x12\x12\n\nshowLatest\x18\x01 \x01(\r\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\x12\x0e\n\x06remind\x18\x03 \x01(\r\x12\r\n\x05\x62rief\x18\x04 \x01(\x0c\x12\x13\n\x0breceiverUin\x18\x05 \x01(\x04\x12\x16\n\x0ereliaoAdminOpt\x18\x06 \x01(\r\"\xb4\x01\n\x12GeneralGrayTipInfo\x12\x10\n\x08\x62usiType\x18\x01 \x01(\x04\x12\x0e\n\x06\x62usiId\x18\x02 \x01(\x04\x12\x10\n\x08\x63trlFlag\x18\x03 \x01(\r\x12\x0f\n\x07\x63\x32\x63Type\x18\x04 \x01(\r\x12\x13\n\x0bserviceType\x18\x05 \x01(\r\x12\x0f\n\x07templId\x18\x06 \x01(\x04\x12\"\n\rmsgTemplParam\x18\x07 \x03(\x0b\x32\x0b.TemplParam\x12\x0f\n\x07\x63ontent\x18\x08 \x01(\t\")\n\nTemplParam\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xb2\x01\n\x15MessageRecallReminder\x12\x0b\n\x03uin\x18\x01 \x01(\x03\x12\x10\n\x08nickname\x18\x02 \x01(\x0c\x12-\n\x0frecalledMsgList\x18\x03 \x03(\x0b\x32\x14.RecalledMessageMeta\x12\x17\n\x0freminderContent\x18\x04 \x01(\x0c\x12\x0f\n\x07userdef\x18\x05 \x01(\x0c\x12\x11\n\tgroupType\x18\x06 \x01(\x05\x12\x0e\n\x06opType\x18\x07 \x01(\x05\"x\n\x13RecalledMessageMeta\x12\x0b\n\x03seq\x18\x01 \x01(\x05\x12\x0c\n\x04time\x18\x02 \x01(\x05\x12\x11\n\tmsgRandom\x18\x03 \x01(\x05\x12\x0f\n\x07msgType\x18\x04 \x01(\x05\x12\x0f\n\x07msgFlag\x18\x05 \x01(\x05\x12\x11\n\tauthorUin\x18\x06 \x01(\x03\"\xde\x01\n\x0fRedGrayTipsInfo\x12\x12\n\nshowLatest\x18\x01 \x01(\r\x12\x11\n\tsenderUin\x18\x02 \x01(\x04\x12\x13\n\x0breceiverUin\x18\x03 \x01(\x04\x12\x19\n\x11senderRichContent\x18\x04 \x01(\t\x12\x1b\n\x13receiverRichContent\x18\x05 \x01(\t\x12\x0f\n\x07\x61uthKey\x18\x06 \x01(\x0c\x12\x0f\n\x07msgType\x18\x07 \x01(\x11\x12\x11\n\tluckyFlag\x18\x08 \x01(\r\x12\x10\n\x08hideFlag\x18\t \x01(\r\x12\x10\n\x08luckyUin\x18\x0c \x01(\x04\"\xd4\x01\n\x10QQGroupDigestMsg\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0b\n\x03seq\x18\x02 \x01(\r\x12\x0e\n\x06random\x18\x03 \x01(\r\x12\x0e\n\x06opType\x18\x04 \x01(\x05\x12\x0e\n\x06sender\x18\x05 \x01(\x04\x12\x12\n\ndigestOper\x18\x06 \x01(\x04\x12\x0e\n\x06opTime\x18\x07 \x01(\r\x12\x15\n\rlastestMsgSeq\x18\x08 \x01(\r\x12\x10\n\x08operNick\x18\t \x01(\x0c\x12\x12\n\nsenderNick\x18\n \x01(\x0c\x12\x0f\n\x07\x65xtInfo\x18\x0b \x01(\x05\x42+Z)github.com/Mrs4s/MiraiGo/client/pb/notifyb\x06proto3')
 
 
 
@@ -28,56 +28,56 @@
 _QQGROUPDIGESTMSG = DESCRIPTOR.message_types_by_name['QQGroupDigestMsg']
 NotifyMsgBody = _reflection.GeneratedProtocolMessageType('NotifyMsgBody', (_message.Message,), {
   'DESCRIPTOR' : _NOTIFYMSGBODY,
-  '__module__' : 'group0x857_pb2'
+  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
   # @@protoc_insertion_point(class_scope:NotifyMsgBody)
   })
 _sym_db.RegisterMessage(NotifyMsgBody)
 
 AIOGrayTipsInfo = _reflection.GeneratedProtocolMessageType('AIOGrayTipsInfo', (_message.Message,), {
   'DESCRIPTOR' : _AIOGRAYTIPSINFO,
-  '__module__' : 'group0x857_pb2'
+  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
   # @@protoc_insertion_point(class_scope:AIOGrayTipsInfo)
   })
 _sym_db.RegisterMessage(AIOGrayTipsInfo)
 
 GeneralGrayTipInfo = _reflection.GeneratedProtocolMessageType('GeneralGrayTipInfo', (_message.Message,), {
   'DESCRIPTOR' : _GENERALGRAYTIPINFO,
-  '__module__' : 'group0x857_pb2'
+  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
   # @@protoc_insertion_point(class_scope:GeneralGrayTipInfo)
   })
 _sym_db.RegisterMessage(GeneralGrayTipInfo)
 
 TemplParam = _reflection.GeneratedProtocolMessageType('TemplParam', (_message.Message,), {
   'DESCRIPTOR' : _TEMPLPARAM,
-  '__module__' : 'group0x857_pb2'
+  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
   # @@protoc_insertion_point(class_scope:TemplParam)
   })
 _sym_db.RegisterMessage(TemplParam)
 
 MessageRecallReminder = _reflection.GeneratedProtocolMessageType('MessageRecallReminder', (_message.Message,), {
   'DESCRIPTOR' : _MESSAGERECALLREMINDER,
-  '__module__' : 'group0x857_pb2'
+  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
   # @@protoc_insertion_point(class_scope:MessageRecallReminder)
   })
 _sym_db.RegisterMessage(MessageRecallReminder)
 
 RecalledMessageMeta = _reflection.GeneratedProtocolMessageType('RecalledMessageMeta', (_message.Message,), {
   'DESCRIPTOR' : _RECALLEDMESSAGEMETA,
-  '__module__' : 'group0x857_pb2'
+  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
   # @@protoc_insertion_point(class_scope:RecalledMessageMeta)
   })
 _sym_db.RegisterMessage(RecalledMessageMeta)
 
 RedGrayTipsInfo = _reflection.GeneratedProtocolMessageType('RedGrayTipsInfo', (_message.Message,), {
   'DESCRIPTOR' : _REDGRAYTIPSINFO,
-  '__module__' : 'group0x857_pb2'
+  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
   # @@protoc_insertion_point(class_scope:RedGrayTipsInfo)
   })
 _sym_db.RegisterMessage(RedGrayTipsInfo)
 
 QQGroupDigestMsg = _reflection.GeneratedProtocolMessageType('QQGroupDigestMsg', (_message.Message,), {
   'DESCRIPTOR' : _QQGROUPDIGESTMSG,
-  '__module__' : 'group0x857_pb2'
+  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
   # @@protoc_insertion_point(class_scope:QQGroupDigestMsg)
   })
 _sym_db.RegisterMessage(QQGroupDigestMsg)
@@ -86,20 +86,20 @@
 
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = b'Z)github.com/Mrs4s/MiraiGo/client/pb/notify'
-  _NOTIFYMSGBODY._serialized_start=21
-  _NOTIFYMSGBODY._serialized_end=279
-  _AIOGRAYTIPSINFO._serialized_start=282
-  _AIOGRAYTIPSINFO._serialized_end=412
-  _GENERALGRAYTIPINFO._serialized_start=415
-  _GENERALGRAYTIPINFO._serialized_end=595
-  _TEMPLPARAM._serialized_start=597
-  _TEMPLPARAM._serialized_end=638
-  _MESSAGERECALLREMINDER._serialized_start=641
-  _MESSAGERECALLREMINDER._serialized_end=819
-  _RECALLEDMESSAGEMETA._serialized_start=821
-  _RECALLEDMESSAGEMETA._serialized_end=941
-  _REDGRAYTIPSINFO._serialized_start=944
-  _REDGRAYTIPSINFO._serialized_end=1166
-  _QQGROUPDIGESTMSG._serialized_start=1169
-  _QQGROUPDIGESTMSG._serialized_end=1381
+  _NOTIFYMSGBODY._serialized_start=47
+  _NOTIFYMSGBODY._serialized_end=305
+  _AIOGRAYTIPSINFO._serialized_start=308
+  _AIOGRAYTIPSINFO._serialized_end=438
+  _GENERALGRAYTIPINFO._serialized_start=441
+  _GENERALGRAYTIPINFO._serialized_end=621
+  _TEMPLPARAM._serialized_start=623
+  _TEMPLPARAM._serialized_end=664
+  _MESSAGERECALLREMINDER._serialized_start=667
+  _MESSAGERECALLREMINDER._serialized_end=845
+  _RECALLEDMESSAGEMETA._serialized_start=847
+  _RECALLEDMESSAGEMETA._serialized_end=967
+  _REDGRAYTIPSINFO._serialized_start=970
+  _REDGRAYTIPSINFO._serialized_end=1192
+  _QQGROUPDIGESTMSG._serialized_start=1195
+  _QQGROUPDIGESTMSG._serialized_end=1407
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/msf/msg/comm/comm_pb2.py b/cai/pb/msf/msg/comm/comm_pb2.py
index a109fce3..c6762eea 100644
--- a/cai/pb/msf/msg/comm/comm_pb2.py
+++ b/cai/pb/msf/msg/comm/comm_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/msf/msg/comm/comm.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -15,1035 +16,23 @@
 from cai.pb.im.msg.msg_head import msg_head_pb2 as cai_dot_pb_dot_im_dot_msg_dot_msg__head_dot_msg__head__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/msf/msg/comm/comm.proto',
-  package='msf.msg.comm',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1e\x63\x61i/pb/msf/msg/comm/comm.proto\x12\x0cmsf.msg.comm\x1a%cai/pb/im/msg/msg_body/msg_body.proto\x1a%cai/pb/im/msg/msg_head/msg_head.proto\"q\n\x0c\x41ppShareInfo\x12\x13\n\x0b\x61ppshare_id\x18\x01 \x01(\r\x12\x17\n\x0f\x61ppshare_cookie\x18\x02 \x01(\x0c\x12\x33\n\x11\x61ppshare_resource\x18\x03 \x01(\x0b\x32\x18.msf.msg.comm.PluginInfo\"\x98\x02\n\rC2CTmpMsgHead\x12\x10\n\x08\x63\x32\x63_type\x18\x01 \x01(\r\x12\x14\n\x0cservice_type\x18\x02 \x01(\r\x12\x11\n\tgroup_uin\x18\x03 \x01(\x04\x12\x12\n\ngroup_code\x18\x04 \x01(\x04\x12\x0b\n\x03sig\x18\x05 \x01(\x0c\x12\x10\n\x08sig_type\x18\x06 \x01(\r\x12\x12\n\nfrom_phone\x18\x07 \x01(\t\x12\x10\n\x08to_phone\x18\x08 \x01(\t\x12\x14\n\x0clock_display\x18\t \x01(\r\x12\x16\n\x0e\x64irection_flag\x18\n \x01(\r\x12\x10\n\x08reserved\x18\x0b \x01(\x0c\x12\x15\n\rbusiness_name\x18\x0e \x01(\x0c\x12\x1c\n\x14\x62usiness_sub_content\x18\x0f \x01(\x0c\"V\n\x0b\x43ontentHead\x12\x0f\n\x07pkg_num\x18\x01 \x01(\r\x12\x11\n\tpkg_index\x18\x02 \x01(\r\x12\x0f\n\x07\x64iv_seq\x18\x03 \x01(\r\x12\x12\n\nauto_reply\x18\x04 \x01(\r\"\x80\x01\n\x0b\x44iscussInfo\x12\x13\n\x0b\x64iscuss_uin\x18\x01 \x01(\x04\x12\x14\n\x0c\x64iscuss_type\x18\x02 \x01(\r\x12\x18\n\x10\x64iscuss_info_seq\x18\x03 \x01(\x04\x12\x16\n\x0e\x64iscuss_remark\x18\x04 \x01(\x0c\x12\x14\n\x0c\x64iscuss_name\x18\x05 \x01(\x0c\"l\n\x0f\x45xtGroupKeyInfo\x12\x13\n\x0b\x63ur_max_seq\x18\x01 \x01(\r\x12\x10\n\x08\x63ur_time\x18\x02 \x01(\x04\x12\x1a\n\x12operate_by_parents\x18\x03 \x01(\r\x12\x16\n\x0e\x65xt_group_info\x18\x04 \x01(\x0c\"\xb5\x01\n\tGroupInfo\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x12\n\ngroup_type\x18\x02 \x01(\r\x12\x16\n\x0egroup_info_seq\x18\x03 \x01(\x04\x12\x12\n\ngroup_card\x18\x04 \x01(\x0c\x12\x12\n\ngroup_rank\x18\x05 \x01(\x0c\x12\x13\n\x0bgroup_level\x18\x06 \x01(\r\x12\x17\n\x0fgroup_card_type\x18\x07 \x01(\r\x12\x12\n\ngroup_name\x18\x08 \x01(\x0c\"\xb6\x01\n\x03Msg\x12#\n\x04head\x18\x01 \x01(\x0b\x32\x15.msf.msg.comm.MsgHead\x12/\n\x0c\x63ontent_head\x18\x02 \x01(\x0b\x32\x19.msf.msg.comm.ContentHead\x12&\n\x04\x62ody\x18\x03 \x01(\x0b\x32\x18.im.msg.msg_body.MsgBody\x12\x31\n\rappshare_info\x18\x04 \x01(\x0b\x32\x1a.msf.msg.comm.AppShareInfo\"\xec\x05\n\x07MsgHead\x12\x10\n\x08\x66rom_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\x0f\n\x07\x63\x32\x63_cmd\x18\x04 \x01(\r\x12\x0b\n\x03seq\x18\x05 \x01(\r\x12\x0c\n\x04time\x18\x06 \x01(\r\x12\x0b\n\x03uid\x18\x07 \x01(\x04\x12\x35\n\x10\x63\x32\x63_tmp_msg_head\x18\x08 \x01(\x0b\x32\x1b.msf.msg.comm.C2CTmpMsgHead\x12+\n\ngroup_info\x18\t \x01(\x0b\x32\x17.msf.msg.comm.GroupInfo\x12\x12\n\nfrom_appid\x18\n \x01(\r\x12\x13\n\x0b\x66rom_instid\x18\x0b \x01(\r\x12\x13\n\x0buser_active\x18\x0c \x01(\r\x12/\n\x0c\x64iscuss_info\x18\r \x01(\x0b\x32\x19.msf.msg.comm.DiscussInfo\x12\x11\n\tfrom_nick\x18\x0e \x01(\t\x12\x10\n\x08\x61uth_uin\x18\x0f \x01(\x04\x12\x11\n\tauth_nick\x18\x10 \x01(\t\x12\x0c\n\x04\x66lag\x18\x11 \x01(\r\x12\x13\n\x0b\x61uth_remark\x18\x12 \x01(\t\x12\x12\n\ngroup_name\x18\x13 \x01(\t\x12\x35\n\x0fmutiltrans_head\x18\x14 \x01(\x0b\x32\x1c.msf.msg.comm.MutilTransHead\x12,\n\tinst_ctrl\x18\x15 \x01(\x0b\x32\x19.im.msg.msg_head.InstCtrl\x12&\n\x1epublic_account_group_send_flag\x18\x16 \x01(\r\x12\x1b\n\x13wseq_in_c2c_msghead\x18\x17 \x01(\r\x12\x0c\n\x04\x63pid\x18\x18 \x01(\x04\x12\x39\n\x12\x65xt_group_key_info\x18\x19 \x01(\x0b\x32\x1d.msf.msg.comm.ExtGroupKeyInfo\x12\x1d\n\x15multi_compatible_text\x18\x1a \x01(\t\x12\x10\n\x08\x61uth_sex\x18\x1b \x01(\r\x12\x12\n\nis_src_msg\x18\x1c \x01(\x08\"5\n\x0cMsgType0x210\x12\x14\n\x0csub_msg_type\x18\x01 \x01(\r\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\"0\n\x0eMutilTransHead\x12\x0e\n\x06status\x18\x01 \x01(\r\x12\x0e\n\x06msg_id\x18\x02 \x01(\r\"\xd7\x01\n\nPluginInfo\x12\x0e\n\x06res_id\x18\x01 \x01(\r\x12\x10\n\x08pkg_name\x18\x02 \x01(\t\x12\x0f\n\x07new_ver\x18\x03 \x01(\r\x12\x10\n\x08res_type\x18\x04 \x01(\r\x12\x10\n\x08lan_type\x18\x05 \x01(\r\x12\x10\n\x08priority\x18\x06 \x01(\r\x12\x10\n\x08res_name\x18\x07 \x01(\t\x12\x10\n\x08res_desc\x18\x08 \x01(\t\x12\x13\n\x0bres_url_big\x18\t \x01(\t\x12\x15\n\rres_url_small\x18\n \x01(\t\x12\x10\n\x08res_conf\x18\x0b \x01(\t\"%\n\x08Uin2Nick\x12\x0b\n\x03uin\x18\x01 \x01(\x04\x12\x0c\n\x04nick\x18\x02 \x01(\t\"\xd1\x01\n\nUinPairMsg\x12\x16\n\x0elast_read_time\x18\x01 \x01(\r\x12\x10\n\x08peer_uin\x18\x02 \x01(\x04\x12\x11\n\tcompleted\x18\x03 \x01(\r\x12\x1e\n\x03msg\x18\x04 \x03(\x0b\x32\x11.msf.msg.comm.Msg\x12\x16\n\x0eunread_msg_num\x18\x05 \x01(\r\x12\x10\n\x08\x63\x32\x63_type\x18\x08 \x01(\r\x12\x14\n\x0cservice_type\x18\t \x01(\r\x12\x12\n\npb_reserve\x18\n \x01(\x0c\x12\x12\n\nto_tiny_id\x18\x0b \x01(\x04'
-  ,
-  dependencies=[cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2.DESCRIPTOR,cai_dot_pb_dot_im_dot_msg_dot_msg__head_dot_msg__head__pb2.DESCRIPTOR,])
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1e\x63\x61i/pb/msf/msg/comm/comm.proto\x12\x0cmsf.msg.comm\x1a%cai/pb/im/msg/msg_body/msg_body.proto\x1a%cai/pb/im/msg/msg_head/msg_head.proto\"q\n\x0c\x41ppShareInfo\x12\x13\n\x0b\x61ppshare_id\x18\x01 \x01(\r\x12\x17\n\x0f\x61ppshare_cookie\x18\x02 \x01(\x0c\x12\x33\n\x11\x61ppshare_resource\x18\x03 \x01(\x0b\x32\x18.msf.msg.comm.PluginInfo\"\x98\x02\n\rC2CTmpMsgHead\x12\x10\n\x08\x63\x32\x63_type\x18\x01 \x01(\r\x12\x14\n\x0cservice_type\x18\x02 \x01(\r\x12\x11\n\tgroup_uin\x18\x03 \x01(\x04\x12\x12\n\ngroup_code\x18\x04 \x01(\x04\x12\x0b\n\x03sig\x18\x05 \x01(\x0c\x12\x10\n\x08sig_type\x18\x06 \x01(\r\x12\x12\n\nfrom_phone\x18\x07 \x01(\t\x12\x10\n\x08to_phone\x18\x08 \x01(\t\x12\x14\n\x0clock_display\x18\t \x01(\r\x12\x16\n\x0e\x64irection_flag\x18\n \x01(\r\x12\x10\n\x08reserved\x18\x0b \x01(\x0c\x12\x15\n\rbusiness_name\x18\x0e \x01(\x0c\x12\x1c\n\x14\x62usiness_sub_content\x18\x0f \x01(\x0c\"V\n\x0b\x43ontentHead\x12\x0f\n\x07pkg_num\x18\x01 \x01(\r\x12\x11\n\tpkg_index\x18\x02 \x01(\r\x12\x0f\n\x07\x64iv_seq\x18\x03 \x01(\r\x12\x12\n\nauto_reply\x18\x04 \x01(\r\"\x80\x01\n\x0b\x44iscussInfo\x12\x13\n\x0b\x64iscuss_uin\x18\x01 \x01(\x04\x12\x14\n\x0c\x64iscuss_type\x18\x02 \x01(\r\x12\x18\n\x10\x64iscuss_info_seq\x18\x03 \x01(\x04\x12\x16\n\x0e\x64iscuss_remark\x18\x04 \x01(\x0c\x12\x14\n\x0c\x64iscuss_name\x18\x05 \x01(\x0c\"l\n\x0f\x45xtGroupKeyInfo\x12\x13\n\x0b\x63ur_max_seq\x18\x01 \x01(\r\x12\x10\n\x08\x63ur_time\x18\x02 \x01(\x04\x12\x1a\n\x12operate_by_parents\x18\x03 \x01(\r\x12\x16\n\x0e\x65xt_group_info\x18\x04 \x01(\x0c\"\xb5\x01\n\tGroupInfo\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x12\n\ngroup_type\x18\x02 \x01(\r\x12\x16\n\x0egroup_info_seq\x18\x03 \x01(\x04\x12\x12\n\ngroup_card\x18\x04 \x01(\x0c\x12\x12\n\ngroup_rank\x18\x05 \x01(\x0c\x12\x13\n\x0bgroup_level\x18\x06 \x01(\r\x12\x17\n\x0fgroup_card_type\x18\x07 \x01(\r\x12\x12\n\ngroup_name\x18\x08 \x01(\x0c\"\xb6\x01\n\x03Msg\x12#\n\x04head\x18\x01 \x01(\x0b\x32\x15.msf.msg.comm.MsgHead\x12/\n\x0c\x63ontent_head\x18\x02 \x01(\x0b\x32\x19.msf.msg.comm.ContentHead\x12&\n\x04\x62ody\x18\x03 \x01(\x0b\x32\x18.im.msg.msg_body.MsgBody\x12\x31\n\rappshare_info\x18\x04 \x01(\x0b\x32\x1a.msf.msg.comm.AppShareInfo\"\xec\x05\n\x07MsgHead\x12\x10\n\x08\x66rom_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\x0f\n\x07\x63\x32\x63_cmd\x18\x04 \x01(\r\x12\x0b\n\x03seq\x18\x05 \x01(\r\x12\x0c\n\x04time\x18\x06 \x01(\r\x12\x0b\n\x03uid\x18\x07 \x01(\x04\x12\x35\n\x10\x63\x32\x63_tmp_msg_head\x18\x08 \x01(\x0b\x32\x1b.msf.msg.comm.C2CTmpMsgHead\x12+\n\ngroup_info\x18\t \x01(\x0b\x32\x17.msf.msg.comm.GroupInfo\x12\x12\n\nfrom_appid\x18\n \x01(\r\x12\x13\n\x0b\x66rom_instid\x18\x0b \x01(\r\x12\x13\n\x0buser_active\x18\x0c \x01(\r\x12/\n\x0c\x64iscuss_info\x18\r \x01(\x0b\x32\x19.msf.msg.comm.DiscussInfo\x12\x11\n\tfrom_nick\x18\x0e \x01(\t\x12\x10\n\x08\x61uth_uin\x18\x0f \x01(\x04\x12\x11\n\tauth_nick\x18\x10 \x01(\t\x12\x0c\n\x04\x66lag\x18\x11 \x01(\r\x12\x13\n\x0b\x61uth_remark\x18\x12 \x01(\t\x12\x12\n\ngroup_name\x18\x13 \x01(\t\x12\x35\n\x0fmutiltrans_head\x18\x14 \x01(\x0b\x32\x1c.msf.msg.comm.MutilTransHead\x12,\n\tinst_ctrl\x18\x15 \x01(\x0b\x32\x19.im.msg.msg_head.InstCtrl\x12&\n\x1epublic_account_group_send_flag\x18\x16 \x01(\r\x12\x1b\n\x13wseq_in_c2c_msghead\x18\x17 \x01(\r\x12\x0c\n\x04\x63pid\x18\x18 \x01(\x04\x12\x39\n\x12\x65xt_group_key_info\x18\x19 \x01(\x0b\x32\x1d.msf.msg.comm.ExtGroupKeyInfo\x12\x1d\n\x15multi_compatible_text\x18\x1a \x01(\t\x12\x10\n\x08\x61uth_sex\x18\x1b \x01(\r\x12\x12\n\nis_src_msg\x18\x1c \x01(\x08\"5\n\x0cMsgType0x210\x12\x14\n\x0csub_msg_type\x18\x01 \x01(\r\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\"0\n\x0eMutilTransHead\x12\x0e\n\x06status\x18\x01 \x01(\r\x12\x0e\n\x06msg_id\x18\x02 \x01(\r\"\xd7\x01\n\nPluginInfo\x12\x0e\n\x06res_id\x18\x01 \x01(\r\x12\x10\n\x08pkg_name\x18\x02 \x01(\t\x12\x0f\n\x07new_ver\x18\x03 \x01(\r\x12\x10\n\x08res_type\x18\x04 \x01(\r\x12\x10\n\x08lan_type\x18\x05 \x01(\r\x12\x10\n\x08priority\x18\x06 \x01(\r\x12\x10\n\x08res_name\x18\x07 \x01(\t\x12\x10\n\x08res_desc\x18\x08 \x01(\t\x12\x13\n\x0bres_url_big\x18\t \x01(\t\x12\x15\n\rres_url_small\x18\n \x01(\t\x12\x10\n\x08res_conf\x18\x0b \x01(\t\"%\n\x08Uin2Nick\x12\x0b\n\x03uin\x18\x01 \x01(\x04\x12\x0c\n\x04nick\x18\x02 \x01(\t\"\xd1\x01\n\nUinPairMsg\x12\x16\n\x0elast_read_time\x18\x01 \x01(\r\x12\x10\n\x08peer_uin\x18\x02 \x01(\x04\x12\x11\n\tcompleted\x18\x03 \x01(\r\x12\x1e\n\x03msg\x18\x04 \x03(\x0b\x32\x11.msf.msg.comm.Msg\x12\x16\n\x0eunread_msg_num\x18\x05 \x01(\r\x12\x10\n\x08\x63\x32\x63_type\x18\x08 \x01(\r\x12\x14\n\x0cservice_type\x18\t \x01(\r\x12\x12\n\npb_reserve\x18\n \x01(\x0c\x12\x12\n\nto_tiny_id\x18\x0b \x01(\x04')
 
 
 
-
-_APPSHAREINFO = _descriptor.Descriptor(
-  name='AppShareInfo',
-  full_name='msf.msg.comm.AppShareInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='appshare_id', full_name='msf.msg.comm.AppShareInfo.appshare_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='appshare_cookie', full_name='msf.msg.comm.AppShareInfo.appshare_cookie', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='appshare_resource', full_name='msf.msg.comm.AppShareInfo.appshare_resource', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=126,
-  serialized_end=239,
-)
-
-
-_C2CTMPMSGHEAD = _descriptor.Descriptor(
-  name='C2CTmpMsgHead',
-  full_name='msf.msg.comm.C2CTmpMsgHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='c2c_type', full_name='msf.msg.comm.C2CTmpMsgHead.c2c_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='service_type', full_name='msf.msg.comm.C2CTmpMsgHead.service_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_uin', full_name='msf.msg.comm.C2CTmpMsgHead.group_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.comm.C2CTmpMsgHead.group_code', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.comm.C2CTmpMsgHead.sig', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig_type', full_name='msf.msg.comm.C2CTmpMsgHead.sig_type', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_phone', full_name='msf.msg.comm.C2CTmpMsgHead.from_phone', index=6,
-      number=7, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_phone', full_name='msf.msg.comm.C2CTmpMsgHead.to_phone', index=7,
-      number=8, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='lock_display', full_name='msf.msg.comm.C2CTmpMsgHead.lock_display', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='direction_flag', full_name='msf.msg.comm.C2CTmpMsgHead.direction_flag', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserved', full_name='msf.msg.comm.C2CTmpMsgHead.reserved', index=10,
-      number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='business_name', full_name='msf.msg.comm.C2CTmpMsgHead.business_name', index=11,
-      number=14, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='business_sub_content', full_name='msf.msg.comm.C2CTmpMsgHead.business_sub_content', index=12,
-      number=15, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=242,
-  serialized_end=522,
-)
-
-
-_CONTENTHEAD = _descriptor.Descriptor(
-  name='ContentHead',
-  full_name='msf.msg.comm.ContentHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='pkg_num', full_name='msf.msg.comm.ContentHead.pkg_num', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pkg_index', full_name='msf.msg.comm.ContentHead.pkg_index', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='div_seq', full_name='msf.msg.comm.ContentHead.div_seq', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='auto_reply', full_name='msf.msg.comm.ContentHead.auto_reply', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=524,
-  serialized_end=610,
-)
-
-
-_DISCUSSINFO = _descriptor.Descriptor(
-  name='DiscussInfo',
-  full_name='msf.msg.comm.DiscussInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='discuss_uin', full_name='msf.msg.comm.DiscussInfo.discuss_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='discuss_type', full_name='msf.msg.comm.DiscussInfo.discuss_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='discuss_info_seq', full_name='msf.msg.comm.DiscussInfo.discuss_info_seq', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='discuss_remark', full_name='msf.msg.comm.DiscussInfo.discuss_remark', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='discuss_name', full_name='msf.msg.comm.DiscussInfo.discuss_name', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=613,
-  serialized_end=741,
-)
-
-
-_EXTGROUPKEYINFO = _descriptor.Descriptor(
-  name='ExtGroupKeyInfo',
-  full_name='msf.msg.comm.ExtGroupKeyInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='cur_max_seq', full_name='msf.msg.comm.ExtGroupKeyInfo.cur_max_seq', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cur_time', full_name='msf.msg.comm.ExtGroupKeyInfo.cur_time', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='operate_by_parents', full_name='msf.msg.comm.ExtGroupKeyInfo.operate_by_parents', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ext_group_info', full_name='msf.msg.comm.ExtGroupKeyInfo.ext_group_info', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=743,
-  serialized_end=851,
-)
-
-
-_GROUPINFO = _descriptor.Descriptor(
-  name='GroupInfo',
-  full_name='msf.msg.comm.GroupInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.comm.GroupInfo.group_code', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_type', full_name='msf.msg.comm.GroupInfo.group_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_info_seq', full_name='msf.msg.comm.GroupInfo.group_info_seq', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_card', full_name='msf.msg.comm.GroupInfo.group_card', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_rank', full_name='msf.msg.comm.GroupInfo.group_rank', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_level', full_name='msf.msg.comm.GroupInfo.group_level', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_card_type', full_name='msf.msg.comm.GroupInfo.group_card_type', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_name', full_name='msf.msg.comm.GroupInfo.group_name', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=854,
-  serialized_end=1035,
-)
-
-
-_MSG = _descriptor.Descriptor(
-  name='Msg',
-  full_name='msf.msg.comm.Msg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='head', full_name='msf.msg.comm.Msg.head', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content_head', full_name='msf.msg.comm.Msg.content_head', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='body', full_name='msf.msg.comm.Msg.body', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='appshare_info', full_name='msf.msg.comm.Msg.appshare_info', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1038,
-  serialized_end=1220,
-)
-
-
-_MSGHEAD = _descriptor.Descriptor(
-  name='MsgHead',
-  full_name='msf.msg.comm.MsgHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='from_uin', full_name='msf.msg.comm.MsgHead.from_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.comm.MsgHead.to_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='type', full_name='msf.msg.comm.MsgHead.type', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_cmd', full_name='msf.msg.comm.MsgHead.c2c_cmd', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='seq', full_name='msf.msg.comm.MsgHead.seq', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='time', full_name='msf.msg.comm.MsgHead.time', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='uid', full_name='msf.msg.comm.MsgHead.uid', index=6,
-      number=7, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_tmp_msg_head', full_name='msf.msg.comm.MsgHead.c2c_tmp_msg_head', index=7,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_info', full_name='msf.msg.comm.MsgHead.group_info', index=8,
-      number=9, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_appid', full_name='msf.msg.comm.MsgHead.from_appid', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_instid', full_name='msf.msg.comm.MsgHead.from_instid', index=10,
-      number=11, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='user_active', full_name='msf.msg.comm.MsgHead.user_active', index=11,
-      number=12, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='discuss_info', full_name='msf.msg.comm.MsgHead.discuss_info', index=12,
-      number=13, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_nick', full_name='msf.msg.comm.MsgHead.from_nick', index=13,
-      number=14, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='auth_uin', full_name='msf.msg.comm.MsgHead.auth_uin', index=14,
-      number=15, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='auth_nick', full_name='msf.msg.comm.MsgHead.auth_nick', index=15,
-      number=16, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='msf.msg.comm.MsgHead.flag', index=16,
-      number=17, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='auth_remark', full_name='msf.msg.comm.MsgHead.auth_remark', index=17,
-      number=18, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_name', full_name='msf.msg.comm.MsgHead.group_name', index=18,
-      number=19, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='mutiltrans_head', full_name='msf.msg.comm.MsgHead.mutiltrans_head', index=19,
-      number=20, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='inst_ctrl', full_name='msf.msg.comm.MsgHead.inst_ctrl', index=20,
-      number=21, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='public_account_group_send_flag', full_name='msf.msg.comm.MsgHead.public_account_group_send_flag', index=21,
-      number=22, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='wseq_in_c2c_msghead', full_name='msf.msg.comm.MsgHead.wseq_in_c2c_msghead', index=22,
-      number=23, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cpid', full_name='msf.msg.comm.MsgHead.cpid', index=23,
-      number=24, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ext_group_key_info', full_name='msf.msg.comm.MsgHead.ext_group_key_info', index=24,
-      number=25, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='multi_compatible_text', full_name='msf.msg.comm.MsgHead.multi_compatible_text', index=25,
-      number=26, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='auth_sex', full_name='msf.msg.comm.MsgHead.auth_sex', index=26,
-      number=27, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='is_src_msg', full_name='msf.msg.comm.MsgHead.is_src_msg', index=27,
-      number=28, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1223,
-  serialized_end=1971,
-)
-
-
-_MSGTYPE0X210 = _descriptor.Descriptor(
-  name='MsgType0x210',
-  full_name='msf.msg.comm.MsgType0x210',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='sub_msg_type', full_name='msf.msg.comm.MsgType0x210.sub_msg_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content', full_name='msf.msg.comm.MsgType0x210.content', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1973,
-  serialized_end=2026,
-)
-
-
-_MUTILTRANSHEAD = _descriptor.Descriptor(
-  name='MutilTransHead',
-  full_name='msf.msg.comm.MutilTransHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='status', full_name='msf.msg.comm.MutilTransHead.status', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_id', full_name='msf.msg.comm.MutilTransHead.msg_id', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2028,
-  serialized_end=2076,
-)
-
-
-_PLUGININFO = _descriptor.Descriptor(
-  name='PluginInfo',
-  full_name='msf.msg.comm.PluginInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='res_id', full_name='msf.msg.comm.PluginInfo.res_id', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pkg_name', full_name='msf.msg.comm.PluginInfo.pkg_name', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='new_ver', full_name='msf.msg.comm.PluginInfo.new_ver', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='res_type', full_name='msf.msg.comm.PluginInfo.res_type', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='lan_type', full_name='msf.msg.comm.PluginInfo.lan_type', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='priority', full_name='msf.msg.comm.PluginInfo.priority', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='res_name', full_name='msf.msg.comm.PluginInfo.res_name', index=6,
-      number=7, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='res_desc', full_name='msf.msg.comm.PluginInfo.res_desc', index=7,
-      number=8, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='res_url_big', full_name='msf.msg.comm.PluginInfo.res_url_big', index=8,
-      number=9, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='res_url_small', full_name='msf.msg.comm.PluginInfo.res_url_small', index=9,
-      number=10, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='res_conf', full_name='msf.msg.comm.PluginInfo.res_conf', index=10,
-      number=11, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2079,
-  serialized_end=2294,
-)
-
-
-_UIN2NICK = _descriptor.Descriptor(
-  name='Uin2Nick',
-  full_name='msf.msg.comm.Uin2Nick',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='uin', full_name='msf.msg.comm.Uin2Nick.uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='nick', full_name='msf.msg.comm.Uin2Nick.nick', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2296,
-  serialized_end=2333,
-)
-
-
-_UINPAIRMSG = _descriptor.Descriptor(
-  name='UinPairMsg',
-  full_name='msf.msg.comm.UinPairMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='last_read_time', full_name='msf.msg.comm.UinPairMsg.last_read_time', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='peer_uin', full_name='msf.msg.comm.UinPairMsg.peer_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='completed', full_name='msf.msg.comm.UinPairMsg.completed', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg', full_name='msf.msg.comm.UinPairMsg.msg', index=3,
-      number=4, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='unread_msg_num', full_name='msf.msg.comm.UinPairMsg.unread_msg_num', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_type', full_name='msf.msg.comm.UinPairMsg.c2c_type', index=5,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='service_type', full_name='msf.msg.comm.UinPairMsg.service_type', index=6,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='msf.msg.comm.UinPairMsg.pb_reserve', index=7,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_tiny_id', full_name='msf.msg.comm.UinPairMsg.to_tiny_id', index=8,
-      number=11, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2336,
-  serialized_end=2545,
-)
-
-_APPSHAREINFO.fields_by_name['appshare_resource'].message_type = _PLUGININFO
-_MSG.fields_by_name['head'].message_type = _MSGHEAD
-_MSG.fields_by_name['content_head'].message_type = _CONTENTHEAD
-_MSG.fields_by_name['body'].message_type = cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2._MSGBODY
-_MSG.fields_by_name['appshare_info'].message_type = _APPSHAREINFO
-_MSGHEAD.fields_by_name['c2c_tmp_msg_head'].message_type = _C2CTMPMSGHEAD
-_MSGHEAD.fields_by_name['group_info'].message_type = _GROUPINFO
-_MSGHEAD.fields_by_name['discuss_info'].message_type = _DISCUSSINFO
-_MSGHEAD.fields_by_name['mutiltrans_head'].message_type = _MUTILTRANSHEAD
-_MSGHEAD.fields_by_name['inst_ctrl'].message_type = cai_dot_pb_dot_im_dot_msg_dot_msg__head_dot_msg__head__pb2._INSTCTRL
-_MSGHEAD.fields_by_name['ext_group_key_info'].message_type = _EXTGROUPKEYINFO
-_UINPAIRMSG.fields_by_name['msg'].message_type = _MSG
-DESCRIPTOR.message_types_by_name['AppShareInfo'] = _APPSHAREINFO
-DESCRIPTOR.message_types_by_name['C2CTmpMsgHead'] = _C2CTMPMSGHEAD
-DESCRIPTOR.message_types_by_name['ContentHead'] = _CONTENTHEAD
-DESCRIPTOR.message_types_by_name['DiscussInfo'] = _DISCUSSINFO
-DESCRIPTOR.message_types_by_name['ExtGroupKeyInfo'] = _EXTGROUPKEYINFO
-DESCRIPTOR.message_types_by_name['GroupInfo'] = _GROUPINFO
-DESCRIPTOR.message_types_by_name['Msg'] = _MSG
-DESCRIPTOR.message_types_by_name['MsgHead'] = _MSGHEAD
-DESCRIPTOR.message_types_by_name['MsgType0x210'] = _MSGTYPE0X210
-DESCRIPTOR.message_types_by_name['MutilTransHead'] = _MUTILTRANSHEAD
-DESCRIPTOR.message_types_by_name['PluginInfo'] = _PLUGININFO
-DESCRIPTOR.message_types_by_name['Uin2Nick'] = _UIN2NICK
-DESCRIPTOR.message_types_by_name['UinPairMsg'] = _UINPAIRMSG
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_APPSHAREINFO = DESCRIPTOR.message_types_by_name['AppShareInfo']
+_C2CTMPMSGHEAD = DESCRIPTOR.message_types_by_name['C2CTmpMsgHead']
+_CONTENTHEAD = DESCRIPTOR.message_types_by_name['ContentHead']
+_DISCUSSINFO = DESCRIPTOR.message_types_by_name['DiscussInfo']
+_EXTGROUPKEYINFO = DESCRIPTOR.message_types_by_name['ExtGroupKeyInfo']
+_GROUPINFO = DESCRIPTOR.message_types_by_name['GroupInfo']
+_MSG = DESCRIPTOR.message_types_by_name['Msg']
+_MSGHEAD = DESCRIPTOR.message_types_by_name['MsgHead']
+_MSGTYPE0X210 = DESCRIPTOR.message_types_by_name['MsgType0x210']
+_MUTILTRANSHEAD = DESCRIPTOR.message_types_by_name['MutilTransHead']
+_PLUGININFO = DESCRIPTOR.message_types_by_name['PluginInfo']
+_UIN2NICK = DESCRIPTOR.message_types_by_name['Uin2Nick']
+_UINPAIRMSG = DESCRIPTOR.message_types_by_name['UinPairMsg']
 AppShareInfo = _reflection.GeneratedProtocolMessageType('AppShareInfo', (_message.Message,), {
   'DESCRIPTOR' : _APPSHAREINFO,
   '__module__' : 'cai.pb.msf.msg.comm.comm_pb2'
@@ -1135,5 +124,33 @@
   })
 _sym_db.RegisterMessage(UinPairMsg)
 
-
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _APPSHAREINFO._serialized_start=126
+  _APPSHAREINFO._serialized_end=239
+  _C2CTMPMSGHEAD._serialized_start=242
+  _C2CTMPMSGHEAD._serialized_end=522
+  _CONTENTHEAD._serialized_start=524
+  _CONTENTHEAD._serialized_end=610
+  _DISCUSSINFO._serialized_start=613
+  _DISCUSSINFO._serialized_end=741
+  _EXTGROUPKEYINFO._serialized_start=743
+  _EXTGROUPKEYINFO._serialized_end=851
+  _GROUPINFO._serialized_start=854
+  _GROUPINFO._serialized_end=1035
+  _MSG._serialized_start=1038
+  _MSG._serialized_end=1220
+  _MSGHEAD._serialized_start=1223
+  _MSGHEAD._serialized_end=1971
+  _MSGTYPE0X210._serialized_start=1973
+  _MSGTYPE0X210._serialized_end=2026
+  _MUTILTRANSHEAD._serialized_start=2028
+  _MUTILTRANSHEAD._serialized_end=2076
+  _PLUGININFO._serialized_start=2079
+  _PLUGININFO._serialized_end=2294
+  _UIN2NICK._serialized_start=2296
+  _UIN2NICK._serialized_end=2333
+  _UINPAIRMSG._serialized_start=2336
+  _UINPAIRMSG._serialized_end=2545
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/msf/msg/comm/comm_pb2.pyi b/cai/pb/msf/msg/comm/comm_pb2.pyi
index c5c1d143..8e7eec06 100644
--- a/cai/pb/msf/msg/comm/comm_pb2.pyi
+++ b/cai/pb/msf/msg/comm/comm_pb2.pyi
@@ -40,30 +40,28 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class AppShareInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     APPSHARE_ID_FIELD_NUMBER: int
     APPSHARE_COOKIE_FIELD_NUMBER: int
     APPSHARE_RESOURCE_FIELD_NUMBER: int
-    appshare_id: int = ...
-    appshare_cookie: bytes = ...
-
+    appshare_id: int
+    appshare_cookie: bytes
     @property
     def appshare_resource(self) -> PluginInfo: ...
-
     def __init__(self,
         *,
-        appshare_id : Optional[int] = ...,
-        appshare_cookie : Optional[bytes] = ...,
-        appshare_resource : Optional[PluginInfo] = ...,
+        appshare_id: Optional[int] = ...,
+        appshare_cookie: Optional[bytes] = ...,
+        appshare_resource: Optional[PluginInfo] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"appshare_cookie",b"appshare_cookie",u"appshare_id",b"appshare_id",u"appshare_resource",b"appshare_resource"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"appshare_cookie",b"appshare_cookie",u"appshare_id",b"appshare_id",u"appshare_resource",b"appshare_resource"]) -> None: ...
+    def HasField(self, field_name: Literal["appshare_cookie",b"appshare_cookie","appshare_id",b"appshare_id","appshare_resource",b"appshare_resource"]) -> bool: ...
+    def ClearField(self, field_name: Literal["appshare_cookie",b"appshare_cookie","appshare_id",b"appshare_id","appshare_resource",b"appshare_resource"]) -> None: ...
 
 class C2CTmpMsgHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     C2C_TYPE_FIELD_NUMBER: int
     SERVICE_TYPE_FIELD_NUMBER: int
     GROUP_UIN_FIELD_NUMBER: int
@@ -77,107 +75,103 @@ class C2CTmpMsgHead(Message):
     RESERVED_FIELD_NUMBER: int
     BUSINESS_NAME_FIELD_NUMBER: int
     BUSINESS_SUB_CONTENT_FIELD_NUMBER: int
-    c2c_type: int = ...
-    service_type: int = ...
-    group_uin: int = ...
-    group_code: int = ...
-    sig: bytes = ...
-    sig_type: int = ...
-    from_phone: Text = ...
-    to_phone: Text = ...
-    lock_display: int = ...
-    direction_flag: int = ...
-    reserved: bytes = ...
-    business_name: bytes = ...
-    business_sub_content: bytes = ...
-
+    c2c_type: int
+    service_type: int
+    group_uin: int
+    group_code: int
+    sig: bytes
+    sig_type: int
+    from_phone: Text
+    to_phone: Text
+    lock_display: int
+    direction_flag: int
+    reserved: bytes
+    business_name: bytes
+    business_sub_content: bytes
     def __init__(self,
         *,
-        c2c_type : Optional[int] = ...,
-        service_type : Optional[int] = ...,
-        group_uin : Optional[int] = ...,
-        group_code : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
-        sig_type : Optional[int] = ...,
-        from_phone : Optional[Text] = ...,
-        to_phone : Optional[Text] = ...,
-        lock_display : Optional[int] = ...,
-        direction_flag : Optional[int] = ...,
-        reserved : Optional[bytes] = ...,
-        business_name : Optional[bytes] = ...,
-        business_sub_content : Optional[bytes] = ...,
+        c2c_type: Optional[int] = ...,
+        service_type: Optional[int] = ...,
+        group_uin: Optional[int] = ...,
+        group_code: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
+        sig_type: Optional[int] = ...,
+        from_phone: Optional[Text] = ...,
+        to_phone: Optional[Text] = ...,
+        lock_display: Optional[int] = ...,
+        direction_flag: Optional[int] = ...,
+        reserved: Optional[bytes] = ...,
+        business_name: Optional[bytes] = ...,
+        business_sub_content: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"business_name",b"business_name",u"business_sub_content",b"business_sub_content",u"c2c_type",b"c2c_type",u"direction_flag",b"direction_flag",u"from_phone",b"from_phone",u"group_code",b"group_code",u"group_uin",b"group_uin",u"lock_display",b"lock_display",u"reserved",b"reserved",u"service_type",b"service_type",u"sig",b"sig",u"sig_type",b"sig_type",u"to_phone",b"to_phone"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"business_name",b"business_name",u"business_sub_content",b"business_sub_content",u"c2c_type",b"c2c_type",u"direction_flag",b"direction_flag",u"from_phone",b"from_phone",u"group_code",b"group_code",u"group_uin",b"group_uin",u"lock_display",b"lock_display",u"reserved",b"reserved",u"service_type",b"service_type",u"sig",b"sig",u"sig_type",b"sig_type",u"to_phone",b"to_phone"]) -> None: ...
+    def HasField(self, field_name: Literal["business_name",b"business_name","business_sub_content",b"business_sub_content","c2c_type",b"c2c_type","direction_flag",b"direction_flag","from_phone",b"from_phone","group_code",b"group_code","group_uin",b"group_uin","lock_display",b"lock_display","reserved",b"reserved","service_type",b"service_type","sig",b"sig","sig_type",b"sig_type","to_phone",b"to_phone"]) -> bool: ...
+    def ClearField(self, field_name: Literal["business_name",b"business_name","business_sub_content",b"business_sub_content","c2c_type",b"c2c_type","direction_flag",b"direction_flag","from_phone",b"from_phone","group_code",b"group_code","group_uin",b"group_uin","lock_display",b"lock_display","reserved",b"reserved","service_type",b"service_type","sig",b"sig","sig_type",b"sig_type","to_phone",b"to_phone"]) -> None: ...
 
 class ContentHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     PKG_NUM_FIELD_NUMBER: int
     PKG_INDEX_FIELD_NUMBER: int
     DIV_SEQ_FIELD_NUMBER: int
     AUTO_REPLY_FIELD_NUMBER: int
-    pkg_num: int = ...
-    pkg_index: int = ...
-    div_seq: int = ...
-    auto_reply: int = ...
-
+    pkg_num: int
+    pkg_index: int
+    div_seq: int
+    auto_reply: int
     def __init__(self,
         *,
-        pkg_num : Optional[int] = ...,
-        pkg_index : Optional[int] = ...,
-        div_seq : Optional[int] = ...,
-        auto_reply : Optional[int] = ...,
+        pkg_num: Optional[int] = ...,
+        pkg_index: Optional[int] = ...,
+        div_seq: Optional[int] = ...,
+        auto_reply: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"auto_reply",b"auto_reply",u"div_seq",b"div_seq",u"pkg_index",b"pkg_index",u"pkg_num",b"pkg_num"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"auto_reply",b"auto_reply",u"div_seq",b"div_seq",u"pkg_index",b"pkg_index",u"pkg_num",b"pkg_num"]) -> None: ...
+    def HasField(self, field_name: Literal["auto_reply",b"auto_reply","div_seq",b"div_seq","pkg_index",b"pkg_index","pkg_num",b"pkg_num"]) -> bool: ...
+    def ClearField(self, field_name: Literal["auto_reply",b"auto_reply","div_seq",b"div_seq","pkg_index",b"pkg_index","pkg_num",b"pkg_num"]) -> None: ...
 
 class DiscussInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     DISCUSS_UIN_FIELD_NUMBER: int
     DISCUSS_TYPE_FIELD_NUMBER: int
     DISCUSS_INFO_SEQ_FIELD_NUMBER: int
     DISCUSS_REMARK_FIELD_NUMBER: int
     DISCUSS_NAME_FIELD_NUMBER: int
-    discuss_uin: int = ...
-    discuss_type: int = ...
-    discuss_info_seq: int = ...
-    discuss_remark: bytes = ...
-    discuss_name: bytes = ...
-
+    discuss_uin: int
+    discuss_type: int
+    discuss_info_seq: int
+    discuss_remark: bytes
+    discuss_name: bytes
     def __init__(self,
         *,
-        discuss_uin : Optional[int] = ...,
-        discuss_type : Optional[int] = ...,
-        discuss_info_seq : Optional[int] = ...,
-        discuss_remark : Optional[bytes] = ...,
-        discuss_name : Optional[bytes] = ...,
+        discuss_uin: Optional[int] = ...,
+        discuss_type: Optional[int] = ...,
+        discuss_info_seq: Optional[int] = ...,
+        discuss_remark: Optional[bytes] = ...,
+        discuss_name: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"discuss_info_seq",b"discuss_info_seq",u"discuss_name",b"discuss_name",u"discuss_remark",b"discuss_remark",u"discuss_type",b"discuss_type",u"discuss_uin",b"discuss_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"discuss_info_seq",b"discuss_info_seq",u"discuss_name",b"discuss_name",u"discuss_remark",b"discuss_remark",u"discuss_type",b"discuss_type",u"discuss_uin",b"discuss_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["discuss_info_seq",b"discuss_info_seq","discuss_name",b"discuss_name","discuss_remark",b"discuss_remark","discuss_type",b"discuss_type","discuss_uin",b"discuss_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["discuss_info_seq",b"discuss_info_seq","discuss_name",b"discuss_name","discuss_remark",b"discuss_remark","discuss_type",b"discuss_type","discuss_uin",b"discuss_uin"]) -> None: ...
 
 class ExtGroupKeyInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CUR_MAX_SEQ_FIELD_NUMBER: int
     CUR_TIME_FIELD_NUMBER: int
     OPERATE_BY_PARENTS_FIELD_NUMBER: int
     EXT_GROUP_INFO_FIELD_NUMBER: int
-    cur_max_seq: int = ...
-    cur_time: int = ...
-    operate_by_parents: int = ...
-    ext_group_info: bytes = ...
-
+    cur_max_seq: int
+    cur_time: int
+    operate_by_parents: int
+    ext_group_info: bytes
     def __init__(self,
         *,
-        cur_max_seq : Optional[int] = ...,
-        cur_time : Optional[int] = ...,
-        operate_by_parents : Optional[int] = ...,
-        ext_group_info : Optional[bytes] = ...,
+        cur_max_seq: Optional[int] = ...,
+        cur_time: Optional[int] = ...,
+        operate_by_parents: Optional[int] = ...,
+        ext_group_info: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"cur_max_seq",b"cur_max_seq",u"cur_time",b"cur_time",u"ext_group_info",b"ext_group_info",u"operate_by_parents",b"operate_by_parents"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"cur_max_seq",b"cur_max_seq",u"cur_time",b"cur_time",u"ext_group_info",b"ext_group_info",u"operate_by_parents",b"operate_by_parents"]) -> None: ...
+    def HasField(self, field_name: Literal["cur_max_seq",b"cur_max_seq","cur_time",b"cur_time","ext_group_info",b"ext_group_info","operate_by_parents",b"operate_by_parents"]) -> bool: ...
+    def ClearField(self, field_name: Literal["cur_max_seq",b"cur_max_seq","cur_time",b"cur_time","ext_group_info",b"ext_group_info","operate_by_parents",b"operate_by_parents"]) -> None: ...
 
 class GroupInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GROUP_CODE_FIELD_NUMBER: int
     GROUP_TYPE_FIELD_NUMBER: int
     GROUP_INFO_SEQ_FIELD_NUMBER: int
@@ -186,60 +180,54 @@ class GroupInfo(Message):
     GROUP_LEVEL_FIELD_NUMBER: int
     GROUP_CARD_TYPE_FIELD_NUMBER: int
     GROUP_NAME_FIELD_NUMBER: int
-    group_code: int = ...
-    group_type: int = ...
-    group_info_seq: int = ...
-    group_card: bytes = ...
-    group_rank: bytes = ...
-    group_level: int = ...
-    group_card_type: int = ...
-    group_name: bytes = ...
-
+    group_code: int
+    group_type: int
+    group_info_seq: int
+    group_card: bytes
+    group_rank: bytes
+    group_level: int
+    group_card_type: int
+    group_name: bytes
     def __init__(self,
         *,
-        group_code : Optional[int] = ...,
-        group_type : Optional[int] = ...,
-        group_info_seq : Optional[int] = ...,
-        group_card : Optional[bytes] = ...,
-        group_rank : Optional[bytes] = ...,
-        group_level : Optional[int] = ...,
-        group_card_type : Optional[int] = ...,
-        group_name : Optional[bytes] = ...,
+        group_code: Optional[int] = ...,
+        group_type: Optional[int] = ...,
+        group_info_seq: Optional[int] = ...,
+        group_card: Optional[bytes] = ...,
+        group_rank: Optional[bytes] = ...,
+        group_level: Optional[int] = ...,
+        group_card_type: Optional[int] = ...,
+        group_name: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"group_card",b"group_card",u"group_card_type",b"group_card_type",u"group_code",b"group_code",u"group_info_seq",b"group_info_seq",u"group_level",b"group_level",u"group_name",b"group_name",u"group_rank",b"group_rank",u"group_type",b"group_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"group_card",b"group_card",u"group_card_type",b"group_card_type",u"group_code",b"group_code",u"group_info_seq",b"group_info_seq",u"group_level",b"group_level",u"group_name",b"group_name",u"group_rank",b"group_rank",u"group_type",b"group_type"]) -> None: ...
+    def HasField(self, field_name: Literal["group_card",b"group_card","group_card_type",b"group_card_type","group_code",b"group_code","group_info_seq",b"group_info_seq","group_level",b"group_level","group_name",b"group_name","group_rank",b"group_rank","group_type",b"group_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_card",b"group_card","group_card_type",b"group_card_type","group_code",b"group_code","group_info_seq",b"group_info_seq","group_level",b"group_level","group_name",b"group_name","group_rank",b"group_rank","group_type",b"group_type"]) -> None: ...
 
 class Msg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     HEAD_FIELD_NUMBER: int
     CONTENT_HEAD_FIELD_NUMBER: int
     BODY_FIELD_NUMBER: int
     APPSHARE_INFO_FIELD_NUMBER: int
-
     @property
     def head(self) -> MsgHead: ...
-
     @property
     def content_head(self) -> ContentHead: ...
-
     @property
     def body(self) -> MsgBody: ...
-
     @property
     def appshare_info(self) -> AppShareInfo: ...
-
     def __init__(self,
         *,
-        head : Optional[MsgHead] = ...,
-        content_head : Optional[ContentHead] = ...,
-        body : Optional[MsgBody] = ...,
-        appshare_info : Optional[AppShareInfo] = ...,
+        head: Optional[MsgHead] = ...,
+        content_head: Optional[ContentHead] = ...,
+        body: Optional[MsgBody] = ...,
+        appshare_info: Optional[AppShareInfo] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"appshare_info",b"appshare_info",u"body",b"body",u"content_head",b"content_head",u"head",b"head"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"appshare_info",b"appshare_info",u"body",b"body",u"content_head",b"content_head",u"head",b"head"]) -> None: ...
+    def HasField(self, field_name: Literal["appshare_info",b"appshare_info","body",b"body","content_head",b"content_head","head",b"head"]) -> bool: ...
+    def ClearField(self, field_name: Literal["appshare_info",b"appshare_info","body",b"body","content_head",b"content_head","head",b"head"]) -> None: ...
 
 class MsgHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FROM_UIN_FIELD_NUMBER: int
     TO_UIN_FIELD_NUMBER: int
     TYPE_FIELD_NUMBER: int
@@ -268,113 +256,104 @@ class MsgHead(Message):
     MULTI_COMPATIBLE_TEXT_FIELD_NUMBER: int
     AUTH_SEX_FIELD_NUMBER: int
     IS_SRC_MSG_FIELD_NUMBER: int
-    from_uin: int = ...
-    to_uin: int = ...
-    type: int = ...
-    c2c_cmd: int = ...
-    seq: int = ...
-    time: int = ...
-    uid: int = ...
-    from_appid: int = ...
-    from_instid: int = ...
-    user_active: int = ...
-    from_nick: Text = ...
-    auth_uin: int = ...
-    auth_nick: Text = ...
-    flag: int = ...
-    auth_remark: Text = ...
-    group_name: Text = ...
-    public_account_group_send_flag: int = ...
-    wseq_in_c2c_msghead: int = ...
-    cpid: int = ...
-    multi_compatible_text: Text = ...
-    auth_sex: int = ...
-    is_src_msg: bool = ...
-
+    from_uin: int
+    to_uin: int
+    type: int
+    c2c_cmd: int
+    seq: int
+    time: int
+    uid: int
     @property
     def c2c_tmp_msg_head(self) -> C2CTmpMsgHead: ...
-
     @property
     def group_info(self) -> GroupInfo: ...
-
+    from_appid: int
+    from_instid: int
+    user_active: int
     @property
     def discuss_info(self) -> DiscussInfo: ...
-
+    from_nick: Text
+    auth_uin: int
+    auth_nick: Text
+    flag: int
+    auth_remark: Text
+    group_name: Text
     @property
     def mutiltrans_head(self) -> MutilTransHead: ...
-
     @property
     def inst_ctrl(self) -> InstCtrl: ...
-
+    public_account_group_send_flag: int
+    wseq_in_c2c_msghead: int
+    cpid: int
     @property
     def ext_group_key_info(self) -> ExtGroupKeyInfo: ...
-
+    multi_compatible_text: Text
+    auth_sex: int
+    is_src_msg: bool
     def __init__(self,
         *,
-        from_uin : Optional[int] = ...,
-        to_uin : Optional[int] = ...,
-        type : Optional[int] = ...,
-        c2c_cmd : Optional[int] = ...,
-        seq : Optional[int] = ...,
-        time : Optional[int] = ...,
-        uid : Optional[int] = ...,
-        c2c_tmp_msg_head : Optional[C2CTmpMsgHead] = ...,
-        group_info : Optional[GroupInfo] = ...,
-        from_appid : Optional[int] = ...,
-        from_instid : Optional[int] = ...,
-        user_active : Optional[int] = ...,
-        discuss_info : Optional[DiscussInfo] = ...,
-        from_nick : Optional[Text] = ...,
-        auth_uin : Optional[int] = ...,
-        auth_nick : Optional[Text] = ...,
-        flag : Optional[int] = ...,
-        auth_remark : Optional[Text] = ...,
-        group_name : Optional[Text] = ...,
-        mutiltrans_head : Optional[MutilTransHead] = ...,
-        inst_ctrl : Optional[InstCtrl] = ...,
-        public_account_group_send_flag : Optional[int] = ...,
-        wseq_in_c2c_msghead : Optional[int] = ...,
-        cpid : Optional[int] = ...,
-        ext_group_key_info : Optional[ExtGroupKeyInfo] = ...,
-        multi_compatible_text : Optional[Text] = ...,
-        auth_sex : Optional[int] = ...,
-        is_src_msg : Optional[bool] = ...,
+        from_uin: Optional[int] = ...,
+        to_uin: Optional[int] = ...,
+        type: Optional[int] = ...,
+        c2c_cmd: Optional[int] = ...,
+        seq: Optional[int] = ...,
+        time: Optional[int] = ...,
+        uid: Optional[int] = ...,
+        c2c_tmp_msg_head: Optional[C2CTmpMsgHead] = ...,
+        group_info: Optional[GroupInfo] = ...,
+        from_appid: Optional[int] = ...,
+        from_instid: Optional[int] = ...,
+        user_active: Optional[int] = ...,
+        discuss_info: Optional[DiscussInfo] = ...,
+        from_nick: Optional[Text] = ...,
+        auth_uin: Optional[int] = ...,
+        auth_nick: Optional[Text] = ...,
+        flag: Optional[int] = ...,
+        auth_remark: Optional[Text] = ...,
+        group_name: Optional[Text] = ...,
+        mutiltrans_head: Optional[MutilTransHead] = ...,
+        inst_ctrl: Optional[InstCtrl] = ...,
+        public_account_group_send_flag: Optional[int] = ...,
+        wseq_in_c2c_msghead: Optional[int] = ...,
+        cpid: Optional[int] = ...,
+        ext_group_key_info: Optional[ExtGroupKeyInfo] = ...,
+        multi_compatible_text: Optional[Text] = ...,
+        auth_sex: Optional[int] = ...,
+        is_src_msg: Optional[bool] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"auth_nick",b"auth_nick",u"auth_remark",b"auth_remark",u"auth_sex",b"auth_sex",u"auth_uin",b"auth_uin",u"c2c_cmd",b"c2c_cmd",u"c2c_tmp_msg_head",b"c2c_tmp_msg_head",u"cpid",b"cpid",u"discuss_info",b"discuss_info",u"ext_group_key_info",b"ext_group_key_info",u"flag",b"flag",u"from_appid",b"from_appid",u"from_instid",b"from_instid",u"from_nick",b"from_nick",u"from_uin",b"from_uin",u"group_info",b"group_info",u"group_name",b"group_name",u"inst_ctrl",b"inst_ctrl",u"is_src_msg",b"is_src_msg",u"multi_compatible_text",b"multi_compatible_text",u"mutiltrans_head",b"mutiltrans_head",u"public_account_group_send_flag",b"public_account_group_send_flag",u"seq",b"seq",u"time",b"time",u"to_uin",b"to_uin",u"type",b"type",u"uid",b"uid",u"user_active",b"user_active",u"wseq_in_c2c_msghead",b"wseq_in_c2c_msghead"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"auth_nick",b"auth_nick",u"auth_remark",b"auth_remark",u"auth_sex",b"auth_sex",u"auth_uin",b"auth_uin",u"c2c_cmd",b"c2c_cmd",u"c2c_tmp_msg_head",b"c2c_tmp_msg_head",u"cpid",b"cpid",u"discuss_info",b"discuss_info",u"ext_group_key_info",b"ext_group_key_info",u"flag",b"flag",u"from_appid",b"from_appid",u"from_instid",b"from_instid",u"from_nick",b"from_nick",u"from_uin",b"from_uin",u"group_info",b"group_info",u"group_name",b"group_name",u"inst_ctrl",b"inst_ctrl",u"is_src_msg",b"is_src_msg",u"multi_compatible_text",b"multi_compatible_text",u"mutiltrans_head",b"mutiltrans_head",u"public_account_group_send_flag",b"public_account_group_send_flag",u"seq",b"seq",u"time",b"time",u"to_uin",b"to_uin",u"type",b"type",u"uid",b"uid",u"user_active",b"user_active",u"wseq_in_c2c_msghead",b"wseq_in_c2c_msghead"]) -> None: ...
+    def HasField(self, field_name: Literal["auth_nick",b"auth_nick","auth_remark",b"auth_remark","auth_sex",b"auth_sex","auth_uin",b"auth_uin","c2c_cmd",b"c2c_cmd","c2c_tmp_msg_head",b"c2c_tmp_msg_head","cpid",b"cpid","discuss_info",b"discuss_info","ext_group_key_info",b"ext_group_key_info","flag",b"flag","from_appid",b"from_appid","from_instid",b"from_instid","from_nick",b"from_nick","from_uin",b"from_uin","group_info",b"group_info","group_name",b"group_name","inst_ctrl",b"inst_ctrl","is_src_msg",b"is_src_msg","multi_compatible_text",b"multi_compatible_text","mutiltrans_head",b"mutiltrans_head","public_account_group_send_flag",b"public_account_group_send_flag","seq",b"seq","time",b"time","to_uin",b"to_uin","type",b"type","uid",b"uid","user_active",b"user_active","wseq_in_c2c_msghead",b"wseq_in_c2c_msghead"]) -> bool: ...
+    def ClearField(self, field_name: Literal["auth_nick",b"auth_nick","auth_remark",b"auth_remark","auth_sex",b"auth_sex","auth_uin",b"auth_uin","c2c_cmd",b"c2c_cmd","c2c_tmp_msg_head",b"c2c_tmp_msg_head","cpid",b"cpid","discuss_info",b"discuss_info","ext_group_key_info",b"ext_group_key_info","flag",b"flag","from_appid",b"from_appid","from_instid",b"from_instid","from_nick",b"from_nick","from_uin",b"from_uin","group_info",b"group_info","group_name",b"group_name","inst_ctrl",b"inst_ctrl","is_src_msg",b"is_src_msg","multi_compatible_text",b"multi_compatible_text","mutiltrans_head",b"mutiltrans_head","public_account_group_send_flag",b"public_account_group_send_flag","seq",b"seq","time",b"time","to_uin",b"to_uin","type",b"type","uid",b"uid","user_active",b"user_active","wseq_in_c2c_msghead",b"wseq_in_c2c_msghead"]) -> None: ...
 
 class MsgType0x210(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SUB_MSG_TYPE_FIELD_NUMBER: int
     CONTENT_FIELD_NUMBER: int
-    sub_msg_type: int = ...
-    content: bytes = ...
-
+    sub_msg_type: int
+    content: bytes
     def __init__(self,
         *,
-        sub_msg_type : Optional[int] = ...,
-        content : Optional[bytes] = ...,
+        sub_msg_type: Optional[int] = ...,
+        content: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"content",b"content",u"sub_msg_type",b"sub_msg_type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"content",b"content",u"sub_msg_type",b"sub_msg_type"]) -> None: ...
+    def HasField(self, field_name: Literal["content",b"content","sub_msg_type",b"sub_msg_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["content",b"content","sub_msg_type",b"sub_msg_type"]) -> None: ...
 
 class MutilTransHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     STATUS_FIELD_NUMBER: int
     MSG_ID_FIELD_NUMBER: int
-    status: int = ...
-    msg_id: int = ...
-
+    status: int
+    msg_id: int
     def __init__(self,
         *,
-        status : Optional[int] = ...,
-        msg_id : Optional[int] = ...,
+        status: Optional[int] = ...,
+        msg_id: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"msg_id",b"msg_id",u"status",b"status"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"msg_id",b"msg_id",u"status",b"status"]) -> None: ...
+    def HasField(self, field_name: Literal["msg_id",b"msg_id","status",b"status"]) -> bool: ...
+    def ClearField(self, field_name: Literal["msg_id",b"msg_id","status",b"status"]) -> None: ...
 
 class PluginInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RES_ID_FIELD_NUMBER: int
     PKG_NAME_FIELD_NUMBER: int
     NEW_VER_FIELD_NUMBER: int
@@ -386,52 +365,50 @@ class PluginInfo(Message):
     RES_URL_BIG_FIELD_NUMBER: int
     RES_URL_SMALL_FIELD_NUMBER: int
     RES_CONF_FIELD_NUMBER: int
-    res_id: int = ...
-    pkg_name: Text = ...
-    new_ver: int = ...
-    res_type: int = ...
-    lan_type: int = ...
-    priority: int = ...
-    res_name: Text = ...
-    res_desc: Text = ...
-    res_url_big: Text = ...
-    res_url_small: Text = ...
-    res_conf: Text = ...
-
+    res_id: int
+    pkg_name: Text
+    new_ver: int
+    res_type: int
+    lan_type: int
+    priority: int
+    res_name: Text
+    res_desc: Text
+    res_url_big: Text
+    res_url_small: Text
+    res_conf: Text
     def __init__(self,
         *,
-        res_id : Optional[int] = ...,
-        pkg_name : Optional[Text] = ...,
-        new_ver : Optional[int] = ...,
-        res_type : Optional[int] = ...,
-        lan_type : Optional[int] = ...,
-        priority : Optional[int] = ...,
-        res_name : Optional[Text] = ...,
-        res_desc : Optional[Text] = ...,
-        res_url_big : Optional[Text] = ...,
-        res_url_small : Optional[Text] = ...,
-        res_conf : Optional[Text] = ...,
+        res_id: Optional[int] = ...,
+        pkg_name: Optional[Text] = ...,
+        new_ver: Optional[int] = ...,
+        res_type: Optional[int] = ...,
+        lan_type: Optional[int] = ...,
+        priority: Optional[int] = ...,
+        res_name: Optional[Text] = ...,
+        res_desc: Optional[Text] = ...,
+        res_url_big: Optional[Text] = ...,
+        res_url_small: Optional[Text] = ...,
+        res_conf: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"lan_type",b"lan_type",u"new_ver",b"new_ver",u"pkg_name",b"pkg_name",u"priority",b"priority",u"res_conf",b"res_conf",u"res_desc",b"res_desc",u"res_id",b"res_id",u"res_name",b"res_name",u"res_type",b"res_type",u"res_url_big",b"res_url_big",u"res_url_small",b"res_url_small"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"lan_type",b"lan_type",u"new_ver",b"new_ver",u"pkg_name",b"pkg_name",u"priority",b"priority",u"res_conf",b"res_conf",u"res_desc",b"res_desc",u"res_id",b"res_id",u"res_name",b"res_name",u"res_type",b"res_type",u"res_url_big",b"res_url_big",u"res_url_small",b"res_url_small"]) -> None: ...
+    def HasField(self, field_name: Literal["lan_type",b"lan_type","new_ver",b"new_ver","pkg_name",b"pkg_name","priority",b"priority","res_conf",b"res_conf","res_desc",b"res_desc","res_id",b"res_id","res_name",b"res_name","res_type",b"res_type","res_url_big",b"res_url_big","res_url_small",b"res_url_small"]) -> bool: ...
+    def ClearField(self, field_name: Literal["lan_type",b"lan_type","new_ver",b"new_ver","pkg_name",b"pkg_name","priority",b"priority","res_conf",b"res_conf","res_desc",b"res_desc","res_id",b"res_id","res_name",b"res_name","res_type",b"res_type","res_url_big",b"res_url_big","res_url_small",b"res_url_small"]) -> None: ...
 
 class Uin2Nick(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     UIN_FIELD_NUMBER: int
     NICK_FIELD_NUMBER: int
-    uin: int = ...
-    nick: Text = ...
-
+    uin: int
+    nick: Text
     def __init__(self,
         *,
-        uin : Optional[int] = ...,
-        nick : Optional[Text] = ...,
+        uin: Optional[int] = ...,
+        nick: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"nick",b"nick",u"uin",b"uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"nick",b"nick",u"uin",b"uin"]) -> None: ...
+    def HasField(self, field_name: Literal["nick",b"nick","uin",b"uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["nick",b"nick","uin",b"uin"]) -> None: ...
 
 class UinPairMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     LAST_READ_TIME_FIELD_NUMBER: int
     PEER_UIN_FIELD_NUMBER: int
     COMPLETED_FIELD_NUMBER: int
@@ -441,29 +418,27 @@ class UinPairMsg(Message):
     SERVICE_TYPE_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
     TO_TINY_ID_FIELD_NUMBER: int
-    last_read_time: int = ...
-    peer_uin: int = ...
-    completed: int = ...
-    unread_msg_num: int = ...
-    c2c_type: int = ...
-    service_type: int = ...
-    pb_reserve: bytes = ...
-    to_tiny_id: int = ...
-
+    last_read_time: int
+    peer_uin: int
+    completed: int
     @property
     def msg(self) -> RepeatedCompositeFieldContainer[Msg]: ...
-
+    unread_msg_num: int
+    c2c_type: int
+    service_type: int
+    pb_reserve: bytes
+    to_tiny_id: int
     def __init__(self,
         *,
-        last_read_time : Optional[int] = ...,
-        peer_uin : Optional[int] = ...,
-        completed : Optional[int] = ...,
-        msg : Optional[Iterable[Msg]] = ...,
-        unread_msg_num : Optional[int] = ...,
-        c2c_type : Optional[int] = ...,
-        service_type : Optional[int] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        to_tiny_id : Optional[int] = ...,
+        last_read_time: Optional[int] = ...,
+        peer_uin: Optional[int] = ...,
+        completed: Optional[int] = ...,
+        msg: Optional[Iterable[Msg]] = ...,
+        unread_msg_num: Optional[int] = ...,
+        c2c_type: Optional[int] = ...,
+        service_type: Optional[int] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        to_tiny_id: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2c_type",b"c2c_type",u"completed",b"completed",u"last_read_time",b"last_read_time",u"pb_reserve",b"pb_reserve",u"peer_uin",b"peer_uin",u"service_type",b"service_type",u"to_tiny_id",b"to_tiny_id",u"unread_msg_num",b"unread_msg_num"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2c_type",b"c2c_type",u"completed",b"completed",u"last_read_time",b"last_read_time",u"msg",b"msg",u"pb_reserve",b"pb_reserve",u"peer_uin",b"peer_uin",u"service_type",b"service_type",u"to_tiny_id",b"to_tiny_id",u"unread_msg_num",b"unread_msg_num"]) -> None: ...
+    def HasField(self, field_name: Literal["c2c_type",b"c2c_type","completed",b"completed","last_read_time",b"last_read_time","pb_reserve",b"pb_reserve","peer_uin",b"peer_uin","service_type",b"service_type","to_tiny_id",b"to_tiny_id","unread_msg_num",b"unread_msg_num"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2c_type",b"c2c_type","completed",b"completed","last_read_time",b"last_read_time","msg",b"msg","pb_reserve",b"pb_reserve","peer_uin",b"peer_uin","service_type",b"service_type","to_tiny_id",b"to_tiny_id","unread_msg_num",b"unread_msg_num"]) -> None: ...
diff --git a/cai/pb/msf/msg/ctrl/ctrl_pb2.py b/cai/pb/msf/msg/ctrl/ctrl_pb2.py
index 8dca50f0..0cd7045d 100644
--- a/cai/pb/msf/msg/ctrl/ctrl_pb2.py
+++ b/cai/pb/msf/msg/ctrl/ctrl_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/msf/msg/ctrl/ctrl.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -13,142 +14,12 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/msf/msg/ctrl/ctrl.proto',
-  package='msf.msg.ctrl',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1e\x63\x61i/pb/msf/msg/ctrl/ctrl.proto\x12\x0cmsf.msg.ctrl\"K\n\x07MsgCtrl\x12\x0c\n\x04\x66lag\x18\x01 \x01(\r\x12\x32\n\x0eresv_resv_info\x18\x02 \x01(\x0b\x32\x1a.msf.msg.ctrl.ResvResvInfo\"\x9e\x01\n\x0cResvResvInfo\x12\x0c\n\x04\x66lag\x18\x01 \x01(\r\x12\x0f\n\x07reserv1\x18\x02 \x01(\x0c\x12\x0f\n\x07reserv2\x18\x03 \x01(\x04\x12\x0f\n\x07reserv3\x18\x04 \x01(\x04\x12\x13\n\x0b\x63reate_time\x18\x05 \x01(\r\x12\x12\n\npic_height\x18\x06 \x01(\r\x12\x11\n\tpic_width\x18\x07 \x01(\r\x12\x11\n\tresv_flag\x18\x08 \x01(\r'
-)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1e\x63\x61i/pb/msf/msg/ctrl/ctrl.proto\x12\x0cmsf.msg.ctrl\"K\n\x07MsgCtrl\x12\x0c\n\x04\x66lag\x18\x01 \x01(\r\x12\x32\n\x0eresv_resv_info\x18\x02 \x01(\x0b\x32\x1a.msf.msg.ctrl.ResvResvInfo\"\x9e\x01\n\x0cResvResvInfo\x12\x0c\n\x04\x66lag\x18\x01 \x01(\r\x12\x0f\n\x07reserv1\x18\x02 \x01(\x0c\x12\x0f\n\x07reserv2\x18\x03 \x01(\x04\x12\x0f\n\x07reserv3\x18\x04 \x01(\x04\x12\x13\n\x0b\x63reate_time\x18\x05 \x01(\r\x12\x12\n\npic_height\x18\x06 \x01(\r\x12\x11\n\tpic_width\x18\x07 \x01(\r\x12\x11\n\tresv_flag\x18\x08 \x01(\r')
 
 
 
-
-_MSGCTRL = _descriptor.Descriptor(
-  name='MsgCtrl',
-  full_name='msf.msg.ctrl.MsgCtrl',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='msf.msg.ctrl.MsgCtrl.flag', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='resv_resv_info', full_name='msf.msg.ctrl.MsgCtrl.resv_resv_info', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=48,
-  serialized_end=123,
-)
-
-
-_RESVRESVINFO = _descriptor.Descriptor(
-  name='ResvResvInfo',
-  full_name='msf.msg.ctrl.ResvResvInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='msf.msg.ctrl.ResvResvInfo.flag', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserv1', full_name='msf.msg.ctrl.ResvResvInfo.reserv1', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserv2', full_name='msf.msg.ctrl.ResvResvInfo.reserv2', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserv3', full_name='msf.msg.ctrl.ResvResvInfo.reserv3', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='create_time', full_name='msf.msg.ctrl.ResvResvInfo.create_time', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pic_height', full_name='msf.msg.ctrl.ResvResvInfo.pic_height', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pic_width', full_name='msf.msg.ctrl.ResvResvInfo.pic_width', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='resv_flag', full_name='msf.msg.ctrl.ResvResvInfo.resv_flag', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=126,
-  serialized_end=284,
-)
-
-_MSGCTRL.fields_by_name['resv_resv_info'].message_type = _RESVRESVINFO
-DESCRIPTOR.message_types_by_name['MsgCtrl'] = _MSGCTRL
-DESCRIPTOR.message_types_by_name['ResvResvInfo'] = _RESVRESVINFO
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_MSGCTRL = DESCRIPTOR.message_types_by_name['MsgCtrl']
+_RESVRESVINFO = DESCRIPTOR.message_types_by_name['ResvResvInfo']
 MsgCtrl = _reflection.GeneratedProtocolMessageType('MsgCtrl', (_message.Message,), {
   'DESCRIPTOR' : _MSGCTRL,
   '__module__' : 'cai.pb.msf.msg.ctrl.ctrl_pb2'
@@ -163,5 +34,11 @@
   })
 _sym_db.RegisterMessage(ResvResvInfo)
 
+if _descriptor._USE_C_DESCRIPTORS == False:
 
+  DESCRIPTOR._options = None
+  _MSGCTRL._serialized_start=48
+  _MSGCTRL._serialized_end=123
+  _RESVRESVINFO._serialized_start=126
+  _RESVRESVINFO._serialized_end=284
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/msf/msg/ctrl/ctrl_pb2.pyi b/cai/pb/msf/msg/ctrl/ctrl_pb2.pyi
index e29fba87..3ef3d865 100644
--- a/cai/pb/msf/msg/ctrl/ctrl_pb2.pyi
+++ b/cai/pb/msf/msg/ctrl/ctrl_pb2.pyi
@@ -26,27 +26,28 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class MsgCtrl(Message):
-    DESCRIPTOR: Descriptor = ...
+    """msf/msgsvc/msg_ctrl.java
+
+    """
+    DESCRIPTOR: Descriptor
     FLAG_FIELD_NUMBER: int
     RESV_RESV_INFO_FIELD_NUMBER: int
-    flag: int = ...
-
+    flag: int
     @property
     def resv_resv_info(self) -> ResvResvInfo: ...
-
     def __init__(self,
         *,
-        flag : Optional[int] = ...,
-        resv_resv_info : Optional[ResvResvInfo] = ...,
+        flag: Optional[int] = ...,
+        resv_resv_info: Optional[ResvResvInfo] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"flag",b"flag",u"resv_resv_info",b"resv_resv_info"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"flag",b"flag",u"resv_resv_info",b"resv_resv_info"]) -> None: ...
+    def HasField(self, field_name: Literal["flag",b"flag","resv_resv_info",b"resv_resv_info"]) -> bool: ...
+    def ClearField(self, field_name: Literal["flag",b"flag","resv_resv_info",b"resv_resv_info"]) -> None: ...
 
 class ResvResvInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FLAG_FIELD_NUMBER: int
     RESERV1_FIELD_NUMBER: int
     RESERV2_FIELD_NUMBER: int
@@ -55,25 +56,24 @@ class ResvResvInfo(Message):
     PIC_HEIGHT_FIELD_NUMBER: int
     PIC_WIDTH_FIELD_NUMBER: int
     RESV_FLAG_FIELD_NUMBER: int
-    flag: int = ...
-    reserv1: bytes = ...
-    reserv2: int = ...
-    reserv3: int = ...
-    create_time: int = ...
-    pic_height: int = ...
-    pic_width: int = ...
-    resv_flag: int = ...
-
+    flag: int
+    reserv1: bytes
+    reserv2: int
+    reserv3: int
+    create_time: int
+    pic_height: int
+    pic_width: int
+    resv_flag: int
     def __init__(self,
         *,
-        flag : Optional[int] = ...,
-        reserv1 : Optional[bytes] = ...,
-        reserv2 : Optional[int] = ...,
-        reserv3 : Optional[int] = ...,
-        create_time : Optional[int] = ...,
-        pic_height : Optional[int] = ...,
-        pic_width : Optional[int] = ...,
-        resv_flag : Optional[int] = ...,
+        flag: Optional[int] = ...,
+        reserv1: Optional[bytes] = ...,
+        reserv2: Optional[int] = ...,
+        reserv3: Optional[int] = ...,
+        create_time: Optional[int] = ...,
+        pic_height: Optional[int] = ...,
+        pic_width: Optional[int] = ...,
+        resv_flag: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"create_time",b"create_time",u"flag",b"flag",u"pic_height",b"pic_height",u"pic_width",b"pic_width",u"reserv1",b"reserv1",u"reserv2",b"reserv2",u"reserv3",b"reserv3",u"resv_flag",b"resv_flag"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"create_time",b"create_time",u"flag",b"flag",u"pic_height",b"pic_height",u"pic_width",b"pic_width",u"reserv1",b"reserv1",u"reserv2",b"reserv2",u"reserv3",b"reserv3",u"resv_flag",b"resv_flag"]) -> None: ...
+    def HasField(self, field_name: Literal["create_time",b"create_time","flag",b"flag","pic_height",b"pic_height","pic_width",b"pic_width","reserv1",b"reserv1","reserv2",b"reserv2","reserv3",b"reserv3","resv_flag",b"resv_flag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["create_time",b"create_time","flag",b"flag","pic_height",b"pic_height","pic_width",b"pic_width","reserv1",b"reserv1","reserv2",b"reserv2","reserv3",b"reserv3","resv_flag",b"resv_flag"]) -> None: ...
diff --git a/cai/pb/msf/msg/onlinepush/onlinepush_pb2.py b/cai/pb/msf/msg/onlinepush/onlinepush_pb2.py
index fa1d8919..c72913fa 100644
--- a/cai/pb/msf/msg/onlinepush/onlinepush_pb2.py
+++ b/cai/pb/msf/msg/onlinepush/onlinepush_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/msf/msg/onlinepush/onlinepush.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -14,89 +15,11 @@
 from cai.pb.msf.msg.comm import comm_pb2 as cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/msf/msg/onlinepush/onlinepush.proto',
-  package='msf.msg.onlinepush',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n*cai/pb/msf/msg/onlinepush/onlinepush.proto\x12\x12msf.msg.onlinepush\x1a\x1e\x63\x61i/pb/msf/msg/comm/comm.proto\"\x89\x01\n\tPbPushMsg\x12\x1e\n\x03msg\x18\x01 \x01(\x0b\x32\x11.msf.msg.comm.Msg\x12\r\n\x05svrip\x18\x02 \x01(\x05\x12\x12\n\npush_token\x18\x03 \x01(\x0c\x12\x11\n\tping_flag\x18\x04 \x01(\r\x12\x14\n\x0cgeneral_flag\x18\t \x01(\r\x12\x10\n\x08\x62ind_uin\x18\n \x01(\x04'
-  ,
-  dependencies=[cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2.DESCRIPTOR,])
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*cai/pb/msf/msg/onlinepush/onlinepush.proto\x12\x12msf.msg.onlinepush\x1a\x1e\x63\x61i/pb/msf/msg/comm/comm.proto\"\x89\x01\n\tPbPushMsg\x12\x1e\n\x03msg\x18\x01 \x01(\x0b\x32\x11.msf.msg.comm.Msg\x12\r\n\x05svrip\x18\x02 \x01(\x05\x12\x12\n\npush_token\x18\x03 \x01(\x0c\x12\x11\n\tping_flag\x18\x04 \x01(\r\x12\x14\n\x0cgeneral_flag\x18\t \x01(\r\x12\x10\n\x08\x62ind_uin\x18\n \x01(\x04')
 
 
 
-
-_PBPUSHMSG = _descriptor.Descriptor(
-  name='PbPushMsg',
-  full_name='msf.msg.onlinepush.PbPushMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='msg', full_name='msf.msg.onlinepush.PbPushMsg.msg', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='svrip', full_name='msf.msg.onlinepush.PbPushMsg.svrip', index=1,
-      number=2, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='push_token', full_name='msf.msg.onlinepush.PbPushMsg.push_token', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ping_flag', full_name='msf.msg.onlinepush.PbPushMsg.ping_flag', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='general_flag', full_name='msf.msg.onlinepush.PbPushMsg.general_flag', index=4,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bind_uin', full_name='msf.msg.onlinepush.PbPushMsg.bind_uin', index=5,
-      number=10, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=99,
-  serialized_end=236,
-)
-
-_PBPUSHMSG.fields_by_name['msg'].message_type = cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2._MSG
-DESCRIPTOR.message_types_by_name['PbPushMsg'] = _PBPUSHMSG
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_PBPUSHMSG = DESCRIPTOR.message_types_by_name['PbPushMsg']
 PbPushMsg = _reflection.GeneratedProtocolMessageType('PbPushMsg', (_message.Message,), {
   'DESCRIPTOR' : _PBPUSHMSG,
   '__module__' : 'cai.pb.msf.msg.onlinepush.onlinepush_pb2'
@@ -104,5 +27,9 @@
   })
 _sym_db.RegisterMessage(PbPushMsg)
 
+if _descriptor._USE_C_DESCRIPTORS == False:
 
+  DESCRIPTOR._options = None
+  _PBPUSHMSG._serialized_start=99
+  _PBPUSHMSG._serialized_end=236
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/msf/msg/onlinepush/onlinepush_pb2.pyi b/cai/pb/msf/msg/onlinepush/onlinepush_pb2.pyi
index 76bcd87c..f3ed6766 100644
--- a/cai/pb/msf/msg/onlinepush/onlinepush_pb2.pyi
+++ b/cai/pb/msf/msg/onlinepush/onlinepush_pb2.pyi
@@ -30,33 +30,31 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class PbPushMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     MSG_FIELD_NUMBER: int
     SVRIP_FIELD_NUMBER: int
     PUSH_TOKEN_FIELD_NUMBER: int
     PING_FLAG_FIELD_NUMBER: int
     GENERAL_FLAG_FIELD_NUMBER: int
     BIND_UIN_FIELD_NUMBER: int
-    svrip: int = ...
-    push_token: bytes = ...
-    ping_flag: int = ...
-    general_flag: int = ...
-    bind_uin: int = ...
-
     @property
     def msg(self) -> Msg: ...
-
+    svrip: int
+    push_token: bytes
+    ping_flag: int
+    general_flag: int
+    bind_uin: int
     def __init__(self,
         *,
-        msg : Optional[Msg] = ...,
-        svrip : Optional[int] = ...,
-        push_token : Optional[bytes] = ...,
-        ping_flag : Optional[int] = ...,
-        general_flag : Optional[int] = ...,
-        bind_uin : Optional[int] = ...,
+        msg: Optional[Msg] = ...,
+        svrip: Optional[int] = ...,
+        push_token: Optional[bytes] = ...,
+        ping_flag: Optional[int] = ...,
+        general_flag: Optional[int] = ...,
+        bind_uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"general_flag",b"general_flag",u"msg",b"msg",u"ping_flag",b"ping_flag",u"push_token",b"push_token",u"svrip",b"svrip"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"general_flag",b"general_flag",u"msg",b"msg",u"ping_flag",b"ping_flag",u"push_token",b"push_token",u"svrip",b"svrip"]) -> None: ...
+    def HasField(self, field_name: Literal["bind_uin",b"bind_uin","general_flag",b"general_flag","msg",b"msg","ping_flag",b"ping_flag","push_token",b"push_token","svrip",b"svrip"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bind_uin",b"bind_uin","general_flag",b"general_flag","msg",b"msg","ping_flag",b"ping_flag","push_token",b"push_token","svrip",b"svrip"]) -> None: ...
diff --git a/cai/pb/msf/msg/svc/svc_pb2.py b/cai/pb/msf/msg/svc/svc_pb2.py
index ea92fc15..c4a4d01b 100644
--- a/cai/pb/msf/msg/svc/svc_pb2.py
+++ b/cai/pb/msf/msg/svc/svc_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/msf/msg/svc/svc.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -18,5125 +19,101 @@
 from cai.pb.im.msg.receipt import receipt_pb2 as cai_dot_pb_dot_im_dot_msg_dot_receipt_dot_receipt__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/msf/msg/svc/svc.proto',
-  package='msf.msg.svc',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1c\x63\x61i/pb/msf/msg/svc/svc.proto\x12\x0bmsf.msg.svc\x1a\x1e\x63\x61i/pb/msf/msg/comm/comm.proto\x1a\x1e\x63\x61i/pb/msf/msg/ctrl/ctrl.proto\x1a%cai/pb/im/msg/msg_body/msg_body.proto\x1a%cai/pb/im/msg/msg_head/msg_head.proto\x1a#cai/pb/im/msg/receipt/receipt.proto\"7\n\tAccostTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\r\n\x05reply\x18\x03 \x01(\x08\"n\n\x0e\x41\x64\x64ressListTmp\x12\x12\n\nfrom_phone\x18\x01 \x01(\t\x12\x10\n\x08to_phone\x18\x02 \x01(\t\x12\x0e\n\x06to_uin\x18\x03 \x01(\x04\x12\x0b\n\x03sig\x18\x04 \x01(\x0c\x12\x19\n\x11\x66rom_contact_size\x18\x05 \x01(\r\"&\n\x07\x41uthTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\"&\n\x07\x42snsTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\";\n\x0e\x42usinessWPATmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\x0c\n\x04sigt\x18\x03 \x01(\x0c\"\x15\n\x03\x43\x32\x43\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\"\\\n\x07\x43ommTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x10\n\x08\x63\x32\x63_type\x18\x02 \x01(\r\x12\x10\n\x08svr_type\x18\x03 \x01(\r\x12\x0b\n\x03sig\x18\x04 \x01(\x0c\x12\x10\n\x08reserved\x18\x05 \x01(\x0c\"\x16\n\x03\x44is\x12\x0f\n\x07\x64is_uin\x18\x01 \x01(\x04\")\n\x06\x44isTmp\x12\x0f\n\x07\x64is_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\"\x19\n\x03Grp\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\"+\n\x06GrpTmp\x12\x11\n\tgroup_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\"\x1f\n\x0bMsgSendInfo\x12\x10\n\x08receiver\x18\x01 \x01(\r\"\xc7\x01\n\x0eMultiMsgAssist\x12\x32\n\x10repeated_routing\x18\x01 \x03(\x0b\x32\x18.msf.msg.svc.RoutingHead\x12\x0b\n\x03use\x18\x02 \x01(\r\x12\x0f\n\x07temp_id\x18\x03 \x01(\x04\x12\x11\n\tvedio_len\x18\x04 \x01(\x04\x12\x11\n\tredbag_id\x18\x05 \x01(\x0c\x12\x15\n\rredbag_amount\x18\x06 \x01(\x04\x12\x13\n\x0bhas_readbag\x18\x07 \x01(\r\x12\x11\n\thas_vedio\x18\x08 \x01(\r\"@\n\x12NearByAssistantTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\r\n\x05reply\x18\x03 \x01(\x08\"=\n\x0fNearByDatingTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\r\n\x05reply\x18\x03 \x01(\x08\"d\n\x12PbBindUinGetMsgReq\x12\x10\n\x08\x62ind_uin\x18\x01 \x01(\x04\x12\x14\n\x0c\x62ind_uin_sig\x18\x02 \x01(\x0c\x12\x11\n\tsync_flag\x18\x03 \x01(\r\x12\x13\n\x0bsync_cookie\x18\x04 \x01(\x0c\"E\n\x1cPbBindUinMsgReadedConfirmReq\x12\x13\n\x0bsync_cookie\x18\x01 \x01(\x0c\x12\x10\n\x08\x62ind_uin\x18\x02 \x01(\x04\"f\n\x1dPbBindUinMsgReadedConfirmResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x13\n\x0bsync_cookie\x18\x03 \x01(\x0c\x12\x10\n\x08\x62ind_uin\x18\x04 \x01(\x04\"A\n\x18PbBindUinUnReadMsgNumReq\x12\x10\n\x08\x62ind_uin\x18\x01 \x01(\x04\x12\x13\n\x0bsync_cookie\x18\x02 \x01(\x0c\"Z\n\x19PbBindUinUnReadMsgNumResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x10\n\x08\x62ind_uin\x18\x03 \x01(\x04\x12\x0b\n\x03num\x18\x04 \x01(\r\"\xf8\x02\n\x13PbC2CMsgWithDrawReq\x12\x36\n\x04info\x18\x01 \x03(\x0b\x32(.msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo\x12\x19\n\x11long_message_flag\x18\x02 \x01(\r\x12\x10\n\x08reserved\x18\x03 \x01(\x0c\x12\x0f\n\x07sub_cmd\x18\x04 \x01(\r\x1a\xea\x01\n\x07MsgInfo\x12\x10\n\x08\x66rom_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\x12\x0f\n\x07msg_seq\x18\x03 \x01(\r\x12\x0f\n\x07msg_uid\x18\x04 \x01(\x04\x12\x10\n\x08msg_time\x18\x05 \x01(\x04\x12\x12\n\nmsg_random\x18\x06 \x01(\r\x12\x0f\n\x07pkg_num\x18\x07 \x01(\r\x12\x11\n\tpkg_index\x18\x08 \x01(\r\x12\x0f\n\x07\x64iv_seq\x18\t \x01(\r\x12\x10\n\x08msg_type\x18\n \x01(\r\x12.\n\x0crouting_head\x18\x14 \x01(\x0b\x32\x18.msf.msg.svc.RoutingHead\"\xa7\x01\n\x14PbC2CMsgWithDrawResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12&\n\x06status\x18\x03 \x03(\x0b\x32\x16.msf.msg.svc.MsgStatus\x12\x0f\n\x07sub_cmd\x18\x04 \x01(\r\x12\x36\n\x0cwording_info\x18\x05 \x01(\x0b\x32 .msf.msg.svc.WithDrawWordingInfo\"S\n\tMsgStatus\x12\x36\n\x04info\x18\x01 \x01(\x0b\x32(.msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo\x12\x0e\n\x06status\x18\x02 \x01(\r\"\\\n\x14PbC2CReadedReportReq\x12\x13\n\x0bsync_cookie\x18\x01 \x01(\x0c\x12/\n\tpair_info\x18\x02 \x03(\x0b\x32\x1c.msf.msg.svc.UinPairReadInfo\"\xa6\x01\n\x0fUinPairReadInfo\x12\x10\n\x08peer_uin\x18\x01 \x01(\x04\x12\x16\n\x0elast_read_time\x18\x02 \x01(\r\x12\x0f\n\x07\x63rm_sig\x18\x03 \x01(\x0c\x12\x11\n\tpeer_type\x18\x04 \x01(\r\x12\x11\n\tchat_type\x18\x05 \x01(\r\x12\x0c\n\x04\x63pid\x18\x06 \x01(\x04\x12\x10\n\x08\x61io_type\x18\x07 \x01(\r\x12\x12\n\nto_tiny_id\x18\t \x01(\x04\"L\n\x15PbC2CReadedReportResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x13\n\x0bsync_cookie\x18\x03 \x01(\x0c\"\x16\n\x14PbC2CUnReadMsgNumReq\"D\n\x15PbC2CUnReadMsgNumResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x0b\n\x03num\x18\x03 \x01(\r\"\x83\x01\n\x0fPbDelRoamMsgReq\x12$\n\x07\x63\x32\x63_msg\x18\x01 \x01(\x0b\x32\x13.msf.msg.svc.C2CMsg\x12$\n\x07grp_msg\x18\x02 \x01(\x0b\x32\x13.msf.msg.svc.GrpMsg\x12$\n\x07\x64is_msg\x18\x03 \x01(\x0b\x32\x13.msf.msg.svc.DisMsg\"W\n\x06\x43\x32\x43Msg\x12\x10\n\x08\x66rom_uin\x18\x01 \x01(\x04\x12\x10\n\x08peer_uin\x18\x02 \x01(\x04\x12\x0c\n\x04time\x18\x03 \x01(\r\x12\x0e\n\x06random\x18\x04 \x01(\r\x12\x0b\n\x03seq\x18\x05 \x01(\r\"*\n\x06\x44isMsg\x12\x13\n\x0b\x64iscuss_uin\x18\x01 \x01(\x04\x12\x0b\n\x03seq\x18\x02 \x01(\x04\"<\n\x06GrpMsg\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x0b\n\x03seq\x18\x02 \x01(\x04\x12\x11\n\tresv_flag\x18\x03 \x01(\r\"2\n\x10PbDelRoamMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\"\xaa\x01\n\x0ePbDeleteMsgReq\x12\x36\n\tmsg_items\x18\x01 \x03(\x0b\x32#.msf.msg.svc.PbDeleteMsgReq.MsgItem\x1a`\n\x07MsgItem\x12\x10\n\x08\x66rom_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\x0b\n\x03seq\x18\x04 \x01(\r\x12\x0b\n\x03uid\x18\x05 \x01(\x04\x12\x0b\n\x03sig\x18\x07 \x01(\x0c\"1\n\x0fPbDeleteMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\"C\n\x18PbDiscussReadedReportReq\x12\x10\n\x08\x63onf_uin\x18\x01 \x01(\x04\x12\x15\n\rlast_read_seq\x18\x02 \x01(\x04\"s\n\x19PbDiscussReadedReportResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x10\n\x08\x63onf_uin\x18\x03 \x01(\x04\x12\x12\n\nmember_seq\x18\x04 \x01(\x04\x12\x10\n\x08\x63onf_seq\x18\x05 \x01(\x04\"\xa2\x01\n\x12PbGetDiscussMsgReq\x12\x13\n\x0b\x64iscuss_uin\x18\x01 \x01(\x04\x12\x0f\n\x07\x65nd_seq\x18\x02 \x01(\x04\x12\x11\n\tbegin_seq\x18\x03 \x01(\x04\x12\x15\n\rlast_get_time\x18\x04 \x01(\x04\x12\x18\n\x10\x64iscuss_info_seq\x18\x05 \x01(\x04\x12\x0e\n\x06\x66ilter\x18\x06 \x01(\r\x12\x12\n\nmember_seq\x18\x07 \x01(\x04\"\xcd\x01\n\x13PbGetDiscussMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x13\n\x0b\x64iscuss_uin\x18\x03 \x01(\x04\x12\x16\n\x0ereturn_end_seq\x18\x04 \x01(\x04\x12\x18\n\x10return_begin_seq\x18\x05 \x01(\x04\x12\x1e\n\x03msg\x18\x06 \x03(\x0b\x32\x11.msf.msg.comm.Msg\x12\x15\n\rlast_get_time\x18\x07 \x01(\x04\x12\x18\n\x10\x64iscuss_info_seq\x18\x08 \x01(\x04\"\xb4\x01\n\x10PbGetGroupMsgReq\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x11\n\tbegin_seq\x18\x02 \x01(\x04\x12\x0f\n\x07\x65nd_seq\x18\x03 \x01(\x04\x12\x0e\n\x06\x66ilter\x18\x04 \x01(\r\x12\x12\n\nmember_seq\x18\x05 \x01(\x04\x12\x14\n\x0cpublic_group\x18\x06 \x01(\x08\x12\x13\n\x0bshield_flag\x18\x07 \x01(\r\x12\x19\n\x11save_traffic_flag\x18\x08 \x01(\r\"\x99\x01\n\x11PbGetGroupMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x12\n\ngroup_code\x18\x03 \x01(\x04\x12\x18\n\x10return_begin_seq\x18\x04 \x01(\x04\x12\x16\n\x0ereturn_end_seq\x18\x05 \x01(\x04\x12\x1e\n\x03msg\x18\x06 \x03(\x0b\x32\x11.msf.msg.comm.Msg\"\xa4\x02\n\x0bPbGetMsgReq\x12\x11\n\tsync_flag\x18\x01 \x01(\r\x12\x13\n\x0bsync_cookie\x18\x02 \x01(\x0c\x12\x13\n\x0bramble_flag\x18\x03 \x01(\r\x12\x1c\n\x14latest_ramble_number\x18\x04 \x01(\r\x12\x1b\n\x13other_ramble_number\x18\x05 \x01(\r\x12\x18\n\x10online_sync_flag\x18\x06 \x01(\r\x12\x14\n\x0c\x63ontext_flag\x18\x07 \x01(\r\x12\x1a\n\x12whisper_session_id\x18\x08 \x01(\r\x12\x10\n\x08req_type\x18\t \x01(\r\x12\x19\n\x11pubaccount_cookie\x18\n \x01(\x0c\x12\x10\n\x08\x63trl_buf\x18\x0b \x01(\x0c\x12\x12\n\nserver_buf\x18\x0c \x01(\x0c\"\xf1\x01\n\x0cPbGetMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x13\n\x0bsync_cookie\x18\x03 \x01(\x0c\x12\x11\n\tsync_flag\x18\x04 \x01(\r\x12/\n\ruin_pair_msgs\x18\x05 \x03(\x0b\x32\x18.msf.msg.comm.UinPairMsg\x12\x10\n\x08\x62ind_uin\x18\x06 \x01(\x04\x12\x10\n\x08rsp_type\x18\x07 \x01(\r\x12\x19\n\x11pubaccount_cookie\x18\x08 \x01(\x0c\x12\x17\n\x0fis_partial_sync\x18\t \x01(\x08\x12\x10\n\x08\x63trl_buf\x18\n \x01(\x0c\"a\n\x15PbGetOneDayRoamMsgReq\x12\x10\n\x08peer_uin\x18\x01 \x01(\x04\x12\x14\n\x0clast_msgtime\x18\x02 \x01(\x04\x12\x0e\n\x06random\x18\x03 \x01(\x04\x12\x10\n\x08read_cnt\x18\x04 \x01(\r\"\xa4\x01\n\x16PbGetOneDayRoamMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x10\n\x08peer_uin\x18\x03 \x01(\x04\x12\x14\n\x0clast_msgtime\x18\x04 \x01(\x04\x12\x0e\n\x06random\x18\x05 \x01(\x04\x12\x1e\n\x03msg\x18\x06 \x03(\x0b\x32\x11.msf.msg.comm.Msg\x12\x12\n\niscomplete\x18\x07 \x01(\r\"\xc1\x01\n\x0fPbGetRoamMsgReq\x12\x10\n\x08peer_uin\x18\x01 \x01(\x04\x12\x14\n\x0clast_msgtime\x18\x02 \x01(\x04\x12\x0e\n\x06random\x18\x03 \x01(\x04\x12\x10\n\x08read_cnt\x18\x04 \x01(\r\x12\x11\n\tcheck_pwd\x18\x05 \x01(\r\x12\x0b\n\x03sig\x18\x06 \x01(\x0c\x12\x0b\n\x03pwd\x18\x07 \x01(\x0c\x12\x0e\n\x06subcmd\x18\x08 \x01(\r\x12\x15\n\rbegin_msgtime\x18\t \x01(\x04\x12\x10\n\x08req_type\x18\n \x01(\r\"\x97\x01\n\x10PbGetRoamMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x10\n\x08peer_uin\x18\x03 \x01(\x04\x12\x14\n\x0clast_msgtime\x18\x04 \x01(\x04\x12\x0e\n\x06random\x18\x05 \x01(\x04\x12\x1e\n\x03msg\x18\x06 \x03(\x0b\x32\x11.msf.msg.comm.Msg\x12\x0b\n\x03sig\x18\x07 \x01(\x0c\"\x89\x01\n\x15PbGroupMsgWithDrawReq\x12\x0f\n\x07sub_cmd\x18\x01 \x01(\r\x12\x12\n\ngroup_type\x18\x02 \x01(\r\x12\x12\n\ngroup_code\x18\x03 \x01(\x04\x12&\n\x04list\x18\x04 \x03(\x0b\x32\x18.msf.msg.svc.MessageInfo\x12\x0f\n\x07userdef\x18\x05 \x01(\x0c\"W\n\x0bMessageInfo\x12\x0f\n\x07msg_seq\x18\x01 \x01(\r\x12\x12\n\nmsg_random\x18\x02 \x01(\r\x12\x10\n\x08msg_type\x18\x03 \x01(\r\x12\x11\n\tresv_flag\x18\x04 \x01(\r\"\xef\x01\n\x16PbGroupMsgWithDrawResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x0f\n\x07sub_cmd\x18\x03 \x01(\r\x12\x12\n\ngroup_type\x18\x04 \x01(\r\x12\x12\n\ngroup_code\x18\x05 \x01(\x04\x12\x33\n\x0f\x66\x61iled_msg_list\x18\x06 \x03(\x0b\x32\x1a.msf.msg.svc.MessageResult\x12\x0f\n\x07userdef\x18\x07 \x01(\x0c\x12\x36\n\x0cwording_info\x18\x08 \x01(\x0b\x32 .msf.msg.svc.WithDrawWordingInfo\"y\n\rMessageResult\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0f\n\x07msg_seq\x18\x02 \x01(\r\x12\x10\n\x08msg_time\x18\x03 \x01(\r\x12\x12\n\nmsg_random\x18\x04 \x01(\r\x12\x0f\n\x07\x65rr_msg\x18\x05 \x01(\x0c\x12\x10\n\x08msg_type\x18\x06 \x01(\r\"C\n\x16PbGroupReadedReportReq\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x15\n\rlast_read_seq\x18\x02 \x01(\x04\"x\n\x17PbGroupReadedReportResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x12\n\ngroup_code\x18\x03 \x01(\x04\x12\x12\n\nmember_seq\x18\x04 \x01(\x04\x12\x15\n\rgroup_msg_seq\x18\x05 \x01(\x04\"s\n\x11PbInputNotifyInfo\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03ime\x18\x02 \x01(\r\x12\x13\n\x0bnotify_flag\x18\x03 \x01(\r\x12\x12\n\npb_reserve\x18\x04 \x01(\x0c\x12\x18\n\x10ios_push_wording\x18\x05 \x01(\x0c\"\x99\x02\n\x14PbMsgReadedReportReq\x12<\n\x0fgrp_read_report\x18\x01 \x03(\x0b\x32#.msf.msg.svc.PbGroupReadedReportReq\x12>\n\x0f\x64is_read_report\x18\x02 \x03(\x0b\x32%.msf.msg.svc.PbDiscussReadedReportReq\x12:\n\x0f\x63\x32\x63_read_report\x18\x03 \x01(\x0b\x32!.msf.msg.svc.PbC2CReadedReportReq\x12G\n\x14\x62ind_uin_read_report\x18\x04 \x01(\x0b\x32).msf.msg.svc.PbBindUinMsgReadedConfirmReq\"\x9e\x02\n\x15PbMsgReadedReportResp\x12=\n\x0fgrp_read_report\x18\x01 \x03(\x0b\x32$.msf.msg.svc.PbGroupReadedReportResp\x12?\n\x0f\x64is_read_report\x18\x02 \x03(\x0b\x32&.msf.msg.svc.PbDiscussReadedReportResp\x12;\n\x0f\x63\x32\x63_read_report\x18\x03 \x01(\x0b\x32\".msf.msg.svc.PbC2CReadedReportResp\x12H\n\x14\x62ind_uin_read_report\x18\x04 \x01(\x0b\x32*.msf.msg.svc.PbBindUinMsgReadedConfirmResp\"\x88\x01\n\x10PbMsgWithDrawReq\x12\x37\n\rc2c_with_draw\x18\x01 \x03(\x0b\x32 .msf.msg.svc.PbC2CMsgWithDrawReq\x12;\n\x0fgroup_with_draw\x18\x02 \x03(\x0b\x32\".msf.msg.svc.PbGroupMsgWithDrawReq\"\x8b\x01\n\x11PbMsgWithDrawResp\x12\x38\n\rc2c_with_draw\x18\x01 \x03(\x0b\x32!.msf.msg.svc.PbC2CMsgWithDrawResp\x12<\n\x0fgroup_with_draw\x18\x02 \x03(\x0b\x32#.msf.msg.svc.PbGroupMsgWithDrawResp\"O\n\x16PbPullDiscussMsgSeqReq\x12\x35\n\x10\x64iscuss_info_req\x18\x01 \x03(\x0b\x32\x1b.msf.msg.svc.DiscussInfoReq\"4\n\x0e\x44iscussInfoReq\x12\x10\n\x08\x63onf_uin\x18\x01 \x01(\x04\x12\x10\n\x08last_seq\x18\x02 \x01(\x04\"r\n\x17PbPullDiscussMsgSeqResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x37\n\x11\x64iscuss_info_resp\x18\x03 \x03(\x0b\x32\x1c.msf.msg.svc.DiscussInfoResp\"I\n\x0f\x44iscussInfoResp\x12\x10\n\x08\x63onf_uin\x18\x01 \x01(\x04\x12\x12\n\nmember_seq\x18\x02 \x01(\x04\x12\x10\n\x08\x63onf_seq\x18\x03 \x01(\x04\"I\n\x14PbPullGroupMsgSeqReq\x12\x31\n\x0egroup_info_req\x18\x01 \x03(\x0b\x32\x19.msf.msg.svc.GroupInfoReq\"4\n\x0cGroupInfoReq\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x10\n\x08last_seq\x18\x02 \x01(\x04\"l\n\x15PbPullGroupMsgSeqResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x33\n\x0fgroup_info_resp\x18\x03 \x03(\x0b\x32\x1a.msf.msg.svc.GroupInfoResp\"J\n\rGroupInfoResp\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x12\n\nmember_seq\x18\x02 \x01(\x04\x12\x11\n\tgroup_seq\x18\x03 \x01(\x04\"6\n\x19PbSearchRoamMsgInCloudReq\x12\x19\n\x11serialize_reqbody\x18\x01 \x01(\x0c\"W\n\x1aPbSearchRoamMsgInCloudResp\x12\x1e\n\x03msg\x18\x01 \x03(\x0b\x32\x11.msf.msg.comm.Msg\x12\x19\n\x11serialize_rspbody\x18\x02 \x01(\x0c\"\xf9\x03\n\x0cPbSendMsgReq\x12.\n\x0crouting_head\x18\x01 \x01(\x0b\x32\x18.msf.msg.svc.RoutingHead\x12/\n\x0c\x63ontent_head\x18\x02 \x01(\x0b\x32\x19.msf.msg.comm.ContentHead\x12&\n\x04\x62ody\x18\x03 \x01(\x0b\x32\x18.im.msg.msg_body.MsgBody\x12\x0b\n\x03seq\x18\x04 \x01(\r\x12\x0c\n\x04rand\x18\x05 \x01(\r\x12\x13\n\x0bsync_cookie\x18\x06 \x01(\x0c\x12-\n\tapp_share\x18\x07 \x01(\x0b\x32\x1a.msf.msg.comm.AppShareInfo\x12\x0b\n\x03via\x18\x08 \x01(\r\x12\x14\n\x0c\x64\x61ta_statist\x18\t \x01(\r\x12\x35\n\x10multi_msg_assist\x18\n \x01(\x0b\x32\x1b.msf.msg.svc.MultiMsgAssist\x12\x39\n\x11input_notify_info\x18\x0b \x01(\x0b\x32\x1e.msf.msg.svc.PbInputNotifyInfo\x12#\n\x04\x63trl\x18\x0c \x01(\x0b\x32\x15.msf.msg.ctrl.MsgCtrl\x12/\n\x0breceipt_req\x18\r \x01(\x0b\x32\x1a.im.msg.receipt.ReceiptReq\x12\x16\n\x0emulti_send_seq\x18\x0e \x01(\r\"\xb6\x02\n\rPbSendMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x11\n\tsend_time\x18\x03 \x01(\r\x12\x19\n\x11svrbusy_wait_time\x18\x04 \x01(\r\x12+\n\tsend_info\x18\x05 \x01(\x0b\x32\x18.msf.msg.svc.MsgSendInfo\x12\x0f\n\x07\x65rrtype\x18\x06 \x01(\r\x12\x31\n\x0etrans_svr_info\x18\x07 \x01(\x0b\x32\x19.msf.msg.svc.TransSvrInfo\x12\x31\n\x0creceipt_resp\x18\x08 \x01(\x0b\x32\x1b.im.msg.receipt.ReceiptResp\x12\x1c\n\x14text_analysis_result\x18\t \x01(\r\x12\x15\n\rmsg_info_flag\x18\n \x01(\r\"a\n\x18PbThirdQQUnReadMsgNumReq\x12\x35\n\x10thirdqq_req_info\x18\x01 \x03(\x0b\x32\x1b.msf.msg.svc.ThirdQQReqInfo\x12\x0e\n\x06source\x18\x02 \x01(\r\"T\n\x0eThirdQQReqInfo\x12\x11\n\tthird_uin\x18\x01 \x01(\x04\x12\x15\n\rthird_uin_sig\x18\x02 \x01(\x0c\x12\x18\n\x10third_uin_cookie\x18\x03 \x01(\x0c\"\x86\x01\n\x19PbThirdQQUnReadMsgNumResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x37\n\x11thirdqq_resp_info\x18\x03 \x03(\x0b\x32\x1c.msf.msg.svc.ThirdQQRespInfo\x12\x10\n\x08interval\x18\x04 \x01(\r\"\x95\x01\n\x0fThirdQQRespInfo\x12\x11\n\tthird_uin\x18\x01 \x01(\x04\x12\x18\n\x10third_uin_cookie\x18\x02 \x01(\x0c\x12\x0b\n\x03num\x18\x03 \x01(\r\x12\x0c\n\x04\x66lag\x18\x04 \x01(\r\x12\x13\n\x0bredbag_time\x18\x05 \x01(\r\x12\x0e\n\x06status\x18\x06 \x01(\r\x12\x15\n\rlast_msg_time\x18\x07 \x01(\r\"\xd7\x02\n\x11PbUnReadMsgSeqReq\x12:\n\x0f\x63\x32\x63_unread_info\x18\x01 \x01(\x0b\x32!.msf.msg.svc.PbC2CUnReadMsgNumReq\x12\x42\n\x13\x62induin_unread_info\x18\x02 \x03(\x0b\x32%.msf.msg.svc.PbBindUinUnReadMsgNumReq\x12<\n\x11group_unread_info\x18\x03 \x01(\x0b\x32!.msf.msg.svc.PbPullGroupMsgSeqReq\x12@\n\x13\x64iscuss_unread_info\x18\x04 \x01(\x0b\x32#.msf.msg.svc.PbPullDiscussMsgSeqReq\x12\x42\n\x13thirdqq_unread_info\x18\x05 \x01(\x0b\x32%.msf.msg.svc.PbThirdQQUnReadMsgNumReq\"\xdd\x02\n\x12PbUnReadMsgSeqResp\x12;\n\x0f\x63\x32\x63_unread_info\x18\x01 \x01(\x0b\x32\".msf.msg.svc.PbC2CUnReadMsgNumResp\x12\x43\n\x13\x62induin_unread_info\x18\x02 \x03(\x0b\x32&.msf.msg.svc.PbBindUinUnReadMsgNumResp\x12=\n\x11group_unread_info\x18\x03 \x01(\x0b\x32\".msf.msg.svc.PbPullGroupMsgSeqResp\x12\x41\n\x13\x64iscuss_unread_info\x18\x04 \x01(\x0b\x32$.msf.msg.svc.PbPullDiscussMsgSeqResp\x12\x43\n\x13thirdqq_unread_info\x18\x05 \x01(\x0b\x32&.msf.msg.svc.PbThirdQQUnReadMsgNumResp\"=\n\x0bPubGroupTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\x11\n\tgroup_uin\x18\x03 \x01(\x04\")\n\nPublicPlat\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\"1\n\x12QQQueryBusinessTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\",\n\rRichStatusTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\"\xb8\x07\n\x0bRoutingHead\x12\x1d\n\x03\x63\x32\x63\x18\x01 \x01(\x0b\x32\x10.msf.msg.svc.C2C\x12\x1d\n\x03grp\x18\x02 \x01(\x0b\x32\x10.msf.msg.svc.Grp\x12$\n\x07grp_tmp\x18\x03 \x01(\x0b\x32\x13.msf.msg.svc.GrpTmp\x12\x1d\n\x03\x64is\x18\x04 \x01(\x0b\x32\x10.msf.msg.svc.Dis\x12$\n\x07\x64is_tmp\x18\x05 \x01(\x0b\x32\x13.msf.msg.svc.DisTmp\x12$\n\x07wpa_tmp\x18\x06 \x01(\x0b\x32\x13.msf.msg.svc.WPATmp\x12,\n\x0bpublic_plat\x18\x08 \x01(\x0b\x32\x17.msf.msg.svc.PublicPlat\x12(\n\ttrans_msg\x18\t \x01(\x0b\x32\x15.msf.msg.svc.TransMsg\x12\x31\n\x0c\x61\x64\x64ress_list\x18\n \x01(\x0b\x32\x1b.msf.msg.svc.AddressListTmp\x12\x33\n\x0frich_status_tmp\x18\x0b \x01(\x0b\x32\x1a.msf.msg.svc.RichStatusTmp\x12(\n\ttrans_cmd\x18\x0c \x01(\x0b\x32\x15.msf.msg.svc.TransCmd\x12*\n\naccost_tmp\x18\r \x01(\x0b\x32\x16.msf.msg.svc.AccostTmp\x12/\n\rpub_group_tmp\x18\x0e \x01(\x0b\x32\x18.msf.msg.svc.PubGroupTmp\x12-\n\x0ctrans_0_x211\x18\x0f \x01(\x0b\x32\x17.msf.msg.svc.Trans0x211\x12\x35\n\x10\x62usiness_wpa_tmp\x18\x10 \x01(\x0b\x32\x1b.msf.msg.svc.BusinessWPATmp\x12&\n\x08\x61uth_tmp\x18\x11 \x01(\x0b\x32\x14.msf.msg.svc.AuthTmp\x12&\n\x08\x62sns_tmp\x18\x12 \x01(\x0b\x32\x14.msf.msg.svc.BsnsTmp\x12=\n\x14qq_querybusiness_tmp\x18\x13 \x01(\x0b\x32\x1f.msf.msg.svc.QQQueryBusinessTmp\x12\x37\n\x11nearby_dating_tmp\x18\x14 \x01(\x0b\x32\x1c.msf.msg.svc.NearByDatingTmp\x12=\n\x14nearby_assistant_tmp\x18\x15 \x01(\x0b\x32\x1f.msf.msg.svc.NearByAssistantTmp\x12&\n\x08\x63omm_tmp\x18\x16 \x01(\x0b\x32\x14.msf.msg.svc.CommTmp\"\xa6\x01\n\nTrans0x211\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0e\n\x06\x63\x63_cmd\x18\x02 \x01(\r\x12,\n\tinst_ctrl\x18\x03 \x01(\x0b\x32\x19.im.msg.msg_head.InstCtrl\x12\x0b\n\x03sig\x18\x04 \x01(\x0c\x12\x10\n\x08\x63\x32\x63_type\x18\x05 \x01(\r\x12\x14\n\x0cservice_type\x18\x06 \x01(\r\x12\x15\n\rdataline_flag\x18\x07 \x01(\r\"(\n\x08TransCmd\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0c\n\x04type\x18\x02 \x01(\r\"+\n\x08TransMsg\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0f\n\x07\x63\x32\x63_cmd\x18\x02 \x01(\r\">\n\x08TransReq\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\x05\x12\x0f\n\x07req_tag\x18\x02 \x01(\r\x12\x10\n\x08req_buff\x18\x03 \x01(\x0c\"P\n\tTransResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x10\n\x08resp_tag\x18\x03 \x01(\r\x12\x11\n\tresp_buff\x18\x04 \x01(\x0c\"W\n\x0cTransSvrInfo\x12\x10\n\x08sub_type\x18\x01 \x01(\r\x12\x10\n\x08ret_code\x18\x02 \x01(\x05\x12\x0f\n\x07\x65rr_msg\x18\x03 \x01(\x0c\x12\x12\n\ntrans_info\x18\x04 \x01(\x0c\"%\n\x06WPATmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\"9\n\x13WithDrawWordingInfo\x12\x0f\n\x07item_id\x18\x01 \x01(\x05\x12\x11\n\titem_name\x18\x02 \x01(\t'
-  ,
-  dependencies=[cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2.DESCRIPTOR,cai_dot_pb_dot_msf_dot_msg_dot_ctrl_dot_ctrl__pb2.DESCRIPTOR,cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2.DESCRIPTOR,cai_dot_pb_dot_im_dot_msg_dot_msg__head_dot_msg__head__pb2.DESCRIPTOR,cai_dot_pb_dot_im_dot_msg_dot_receipt_dot_receipt__pb2.DESCRIPTOR,])
-
-
-
-
-_ACCOSTTMP = _descriptor.Descriptor(
-  name='AccostTmp',
-  full_name='msf.msg.svc.AccostTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.AccostTmp.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.AccostTmp.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reply', full_name='msf.msg.svc.AccostTmp.reply', index=2,
-      number=3, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=224,
-  serialized_end=279,
-)
-
-
-_ADDRESSLISTTMP = _descriptor.Descriptor(
-  name='AddressListTmp',
-  full_name='msf.msg.svc.AddressListTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='from_phone', full_name='msf.msg.svc.AddressListTmp.from_phone', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_phone', full_name='msf.msg.svc.AddressListTmp.to_phone', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.AddressListTmp.to_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.AddressListTmp.sig', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='from_contact_size', full_name='msf.msg.svc.AddressListTmp.from_contact_size', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=281,
-  serialized_end=391,
-)
-
-
-_AUTHTMP = _descriptor.Descriptor(
-  name='AuthTmp',
-  full_name='msf.msg.svc.AuthTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.AuthTmp.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.AuthTmp.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=393,
-  serialized_end=431,
-)
-
-
-_BSNSTMP = _descriptor.Descriptor(
-  name='BsnsTmp',
-  full_name='msf.msg.svc.BsnsTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.BsnsTmp.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.BsnsTmp.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=433,
-  serialized_end=471,
-)
-
-
-_BUSINESSWPATMP = _descriptor.Descriptor(
-  name='BusinessWPATmp',
-  full_name='msf.msg.svc.BusinessWPATmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.BusinessWPATmp.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.BusinessWPATmp.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sigt', full_name='msf.msg.svc.BusinessWPATmp.sigt', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=473,
-  serialized_end=532,
-)
-
-
-_C2C = _descriptor.Descriptor(
-  name='C2C',
-  full_name='msf.msg.svc.C2C',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.C2C.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=534,
-  serialized_end=555,
-)
-
-
-_COMMTMP = _descriptor.Descriptor(
-  name='CommTmp',
-  full_name='msf.msg.svc.CommTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.CommTmp.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_type', full_name='msf.msg.svc.CommTmp.c2c_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='svr_type', full_name='msf.msg.svc.CommTmp.svr_type', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.CommTmp.sig', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserved', full_name='msf.msg.svc.CommTmp.reserved', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=557,
-  serialized_end=649,
-)
-
-
-_DIS = _descriptor.Descriptor(
-  name='Dis',
-  full_name='msf.msg.svc.Dis',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='dis_uin', full_name='msf.msg.svc.Dis.dis_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=651,
-  serialized_end=673,
-)
-
-
-_DISTMP = _descriptor.Descriptor(
-  name='DisTmp',
-  full_name='msf.msg.svc.DisTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='dis_uin', full_name='msf.msg.svc.DisTmp.dis_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.DisTmp.to_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=675,
-  serialized_end=716,
-)
-
-
-_GRP = _descriptor.Descriptor(
-  name='Grp',
-  full_name='msf.msg.svc.Grp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.svc.Grp.group_code', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=718,
-  serialized_end=743,
-)
-
-
-_GRPTMP = _descriptor.Descriptor(
-  name='GrpTmp',
-  full_name='msf.msg.svc.GrpTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='group_uin', full_name='msf.msg.svc.GrpTmp.group_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.GrpTmp.to_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=745,
-  serialized_end=788,
-)
-
-
-_MSGSENDINFO = _descriptor.Descriptor(
-  name='MsgSendInfo',
-  full_name='msf.msg.svc.MsgSendInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='receiver', full_name='msf.msg.svc.MsgSendInfo.receiver', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=790,
-  serialized_end=821,
-)
-
-
-_MULTIMSGASSIST = _descriptor.Descriptor(
-  name='MultiMsgAssist',
-  full_name='msf.msg.svc.MultiMsgAssist',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='repeated_routing', full_name='msf.msg.svc.MultiMsgAssist.repeated_routing', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='use', full_name='msf.msg.svc.MultiMsgAssist.use', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='temp_id', full_name='msf.msg.svc.MultiMsgAssist.temp_id', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='vedio_len', full_name='msf.msg.svc.MultiMsgAssist.vedio_len', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='redbag_id', full_name='msf.msg.svc.MultiMsgAssist.redbag_id', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='redbag_amount', full_name='msf.msg.svc.MultiMsgAssist.redbag_amount', index=5,
-      number=6, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='has_readbag', full_name='msf.msg.svc.MultiMsgAssist.has_readbag', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='has_vedio', full_name='msf.msg.svc.MultiMsgAssist.has_vedio', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=824,
-  serialized_end=1023,
-)
-
-
-_NEARBYASSISTANTTMP = _descriptor.Descriptor(
-  name='NearByAssistantTmp',
-  full_name='msf.msg.svc.NearByAssistantTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.NearByAssistantTmp.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.NearByAssistantTmp.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reply', full_name='msf.msg.svc.NearByAssistantTmp.reply', index=2,
-      number=3, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1025,
-  serialized_end=1089,
-)
-
-
-_NEARBYDATINGTMP = _descriptor.Descriptor(
-  name='NearByDatingTmp',
-  full_name='msf.msg.svc.NearByDatingTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.NearByDatingTmp.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.NearByDatingTmp.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reply', full_name='msf.msg.svc.NearByDatingTmp.reply', index=2,
-      number=3, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1091,
-  serialized_end=1152,
-)
-
-
-_PBBINDUINGETMSGREQ = _descriptor.Descriptor(
-  name='PbBindUinGetMsgReq',
-  full_name='msf.msg.svc.PbBindUinGetMsgReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='bind_uin', full_name='msf.msg.svc.PbBindUinGetMsgReq.bind_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bind_uin_sig', full_name='msf.msg.svc.PbBindUinGetMsgReq.bind_uin_sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sync_flag', full_name='msf.msg.svc.PbBindUinGetMsgReq.sync_flag', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sync_cookie', full_name='msf.msg.svc.PbBindUinGetMsgReq.sync_cookie', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1154,
-  serialized_end=1254,
-)
-
-
-_PBBINDUINMSGREADEDCONFIRMREQ = _descriptor.Descriptor(
-  name='PbBindUinMsgReadedConfirmReq',
-  full_name='msf.msg.svc.PbBindUinMsgReadedConfirmReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='sync_cookie', full_name='msf.msg.svc.PbBindUinMsgReadedConfirmReq.sync_cookie', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bind_uin', full_name='msf.msg.svc.PbBindUinMsgReadedConfirmReq.bind_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1256,
-  serialized_end=1325,
-)
-
-
-_PBBINDUINMSGREADEDCONFIRMRESP = _descriptor.Descriptor(
-  name='PbBindUinMsgReadedConfirmResp',
-  full_name='msf.msg.svc.PbBindUinMsgReadedConfirmResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbBindUinMsgReadedConfirmResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbBindUinMsgReadedConfirmResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sync_cookie', full_name='msf.msg.svc.PbBindUinMsgReadedConfirmResp.sync_cookie', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bind_uin', full_name='msf.msg.svc.PbBindUinMsgReadedConfirmResp.bind_uin', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1327,
-  serialized_end=1429,
-)
-
-
-_PBBINDUINUNREADMSGNUMREQ = _descriptor.Descriptor(
-  name='PbBindUinUnReadMsgNumReq',
-  full_name='msf.msg.svc.PbBindUinUnReadMsgNumReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='bind_uin', full_name='msf.msg.svc.PbBindUinUnReadMsgNumReq.bind_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sync_cookie', full_name='msf.msg.svc.PbBindUinUnReadMsgNumReq.sync_cookie', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1431,
-  serialized_end=1496,
-)
-
-
-_PBBINDUINUNREADMSGNUMRESP = _descriptor.Descriptor(
-  name='PbBindUinUnReadMsgNumResp',
-  full_name='msf.msg.svc.PbBindUinUnReadMsgNumResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbBindUinUnReadMsgNumResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbBindUinUnReadMsgNumResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bind_uin', full_name='msf.msg.svc.PbBindUinUnReadMsgNumResp.bind_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='num', full_name='msf.msg.svc.PbBindUinUnReadMsgNumResp.num', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1498,
-  serialized_end=1588,
-)
-
-
-_PBC2CMSGWITHDRAWREQ_MSGINFO = _descriptor.Descriptor(
-  name='MsgInfo',
-  full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='from_uin', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo.from_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo.to_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_seq', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo.msg_seq', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_uid', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo.msg_uid', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_time', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo.msg_time', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_random', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo.msg_random', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pkg_num', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo.pkg_num', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pkg_index', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo.pkg_index', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='div_seq', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo.div_seq', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_type', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo.msg_type', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='routing_head', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo.routing_head', index=10,
-      number=20, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1733,
-  serialized_end=1967,
-)
-
-_PBC2CMSGWITHDRAWREQ = _descriptor.Descriptor(
-  name='PbC2CMsgWithDrawReq',
-  full_name='msf.msg.svc.PbC2CMsgWithDrawReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='info', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.info', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='long_message_flag', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.long_message_flag', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='reserved', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.reserved', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sub_cmd', full_name='msf.msg.svc.PbC2CMsgWithDrawReq.sub_cmd', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[_PBC2CMSGWITHDRAWREQ_MSGINFO, ],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1591,
-  serialized_end=1967,
-)
-
-
-_PBC2CMSGWITHDRAWRESP = _descriptor.Descriptor(
-  name='PbC2CMsgWithDrawResp',
-  full_name='msf.msg.svc.PbC2CMsgWithDrawResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbC2CMsgWithDrawResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbC2CMsgWithDrawResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='msf.msg.svc.PbC2CMsgWithDrawResp.status', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sub_cmd', full_name='msf.msg.svc.PbC2CMsgWithDrawResp.sub_cmd', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='wording_info', full_name='msf.msg.svc.PbC2CMsgWithDrawResp.wording_info', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1970,
-  serialized_end=2137,
-)
-
-
-_MSGSTATUS = _descriptor.Descriptor(
-  name='MsgStatus',
-  full_name='msf.msg.svc.MsgStatus',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='info', full_name='msf.msg.svc.MsgStatus.info', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='msf.msg.svc.MsgStatus.status', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2139,
-  serialized_end=2222,
-)
-
-
-_PBC2CREADEDREPORTREQ = _descriptor.Descriptor(
-  name='PbC2CReadedReportReq',
-  full_name='msf.msg.svc.PbC2CReadedReportReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='sync_cookie', full_name='msf.msg.svc.PbC2CReadedReportReq.sync_cookie', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pair_info', full_name='msf.msg.svc.PbC2CReadedReportReq.pair_info', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2224,
-  serialized_end=2316,
-)
-
-
-_UINPAIRREADINFO = _descriptor.Descriptor(
-  name='UinPairReadInfo',
-  full_name='msf.msg.svc.UinPairReadInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='peer_uin', full_name='msf.msg.svc.UinPairReadInfo.peer_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_read_time', full_name='msf.msg.svc.UinPairReadInfo.last_read_time', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='crm_sig', full_name='msf.msg.svc.UinPairReadInfo.crm_sig', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='peer_type', full_name='msf.msg.svc.UinPairReadInfo.peer_type', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='chat_type', full_name='msf.msg.svc.UinPairReadInfo.chat_type', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cpid', full_name='msf.msg.svc.UinPairReadInfo.cpid', index=5,
-      number=6, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='aio_type', full_name='msf.msg.svc.UinPairReadInfo.aio_type', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_tiny_id', full_name='msf.msg.svc.UinPairReadInfo.to_tiny_id', index=7,
-      number=9, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2319,
-  serialized_end=2485,
-)
-
-
-_PBC2CREADEDREPORTRESP = _descriptor.Descriptor(
-  name='PbC2CReadedReportResp',
-  full_name='msf.msg.svc.PbC2CReadedReportResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbC2CReadedReportResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbC2CReadedReportResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sync_cookie', full_name='msf.msg.svc.PbC2CReadedReportResp.sync_cookie', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2487,
-  serialized_end=2563,
-)
-
-
-_PBC2CUNREADMSGNUMREQ = _descriptor.Descriptor(
-  name='PbC2CUnReadMsgNumReq',
-  full_name='msf.msg.svc.PbC2CUnReadMsgNumReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2565,
-  serialized_end=2587,
-)
-
-
-_PBC2CUNREADMSGNUMRESP = _descriptor.Descriptor(
-  name='PbC2CUnReadMsgNumResp',
-  full_name='msf.msg.svc.PbC2CUnReadMsgNumResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbC2CUnReadMsgNumResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbC2CUnReadMsgNumResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='num', full_name='msf.msg.svc.PbC2CUnReadMsgNumResp.num', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2589,
-  serialized_end=2657,
-)
-
-
-_PBDELROAMMSGREQ = _descriptor.Descriptor(
-  name='PbDelRoamMsgReq',
-  full_name='msf.msg.svc.PbDelRoamMsgReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='c2c_msg', full_name='msf.msg.svc.PbDelRoamMsgReq.c2c_msg', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='grp_msg', full_name='msf.msg.svc.PbDelRoamMsgReq.grp_msg', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='dis_msg', full_name='msf.msg.svc.PbDelRoamMsgReq.dis_msg', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2660,
-  serialized_end=2791,
-)
-
-
-_C2CMSG = _descriptor.Descriptor(
-  name='C2CMsg',
-  full_name='msf.msg.svc.C2CMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='from_uin', full_name='msf.msg.svc.C2CMsg.from_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='peer_uin', full_name='msf.msg.svc.C2CMsg.peer_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='time', full_name='msf.msg.svc.C2CMsg.time', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='random', full_name='msf.msg.svc.C2CMsg.random', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='seq', full_name='msf.msg.svc.C2CMsg.seq', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2793,
-  serialized_end=2880,
-)
-
-
-_DISMSG = _descriptor.Descriptor(
-  name='DisMsg',
-  full_name='msf.msg.svc.DisMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='discuss_uin', full_name='msf.msg.svc.DisMsg.discuss_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='seq', full_name='msf.msg.svc.DisMsg.seq', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2882,
-  serialized_end=2924,
-)
-
-
-_GRPMSG = _descriptor.Descriptor(
-  name='GrpMsg',
-  full_name='msf.msg.svc.GrpMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.svc.GrpMsg.group_code', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='seq', full_name='msf.msg.svc.GrpMsg.seq', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='resv_flag', full_name='msf.msg.svc.GrpMsg.resv_flag', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2926,
-  serialized_end=2986,
-)
-
-
-_PBDELROAMMSGRESP = _descriptor.Descriptor(
-  name='PbDelRoamMsgResp',
-  full_name='msf.msg.svc.PbDelRoamMsgResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbDelRoamMsgResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbDelRoamMsgResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2988,
-  serialized_end=3038,
-)
-
-
-_PBDELETEMSGREQ_MSGITEM = _descriptor.Descriptor(
-  name='MsgItem',
-  full_name='msf.msg.svc.PbDeleteMsgReq.MsgItem',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='from_uin', full_name='msf.msg.svc.PbDeleteMsgReq.MsgItem.from_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.PbDeleteMsgReq.MsgItem.to_uin', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='type', full_name='msf.msg.svc.PbDeleteMsgReq.MsgItem.type', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='seq', full_name='msf.msg.svc.PbDeleteMsgReq.MsgItem.seq', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='uid', full_name='msf.msg.svc.PbDeleteMsgReq.MsgItem.uid', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.PbDeleteMsgReq.MsgItem.sig', index=5,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3115,
-  serialized_end=3211,
-)
-
-_PBDELETEMSGREQ = _descriptor.Descriptor(
-  name='PbDeleteMsgReq',
-  full_name='msf.msg.svc.PbDeleteMsgReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='msg_items', full_name='msf.msg.svc.PbDeleteMsgReq.msg_items', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[_PBDELETEMSGREQ_MSGITEM, ],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3041,
-  serialized_end=3211,
-)
-
-
-_PBDELETEMSGRESP = _descriptor.Descriptor(
-  name='PbDeleteMsgResp',
-  full_name='msf.msg.svc.PbDeleteMsgResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbDeleteMsgResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbDeleteMsgResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3213,
-  serialized_end=3262,
-)
-
-
-_PBDISCUSSREADEDREPORTREQ = _descriptor.Descriptor(
-  name='PbDiscussReadedReportReq',
-  full_name='msf.msg.svc.PbDiscussReadedReportReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='conf_uin', full_name='msf.msg.svc.PbDiscussReadedReportReq.conf_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_read_seq', full_name='msf.msg.svc.PbDiscussReadedReportReq.last_read_seq', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3264,
-  serialized_end=3331,
-)
-
-
-_PBDISCUSSREADEDREPORTRESP = _descriptor.Descriptor(
-  name='PbDiscussReadedReportResp',
-  full_name='msf.msg.svc.PbDiscussReadedReportResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbDiscussReadedReportResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbDiscussReadedReportResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='conf_uin', full_name='msf.msg.svc.PbDiscussReadedReportResp.conf_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='member_seq', full_name='msf.msg.svc.PbDiscussReadedReportResp.member_seq', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='conf_seq', full_name='msf.msg.svc.PbDiscussReadedReportResp.conf_seq', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3333,
-  serialized_end=3448,
-)
-
-
-_PBGETDISCUSSMSGREQ = _descriptor.Descriptor(
-  name='PbGetDiscussMsgReq',
-  full_name='msf.msg.svc.PbGetDiscussMsgReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='discuss_uin', full_name='msf.msg.svc.PbGetDiscussMsgReq.discuss_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='end_seq', full_name='msf.msg.svc.PbGetDiscussMsgReq.end_seq', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='begin_seq', full_name='msf.msg.svc.PbGetDiscussMsgReq.begin_seq', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_get_time', full_name='msf.msg.svc.PbGetDiscussMsgReq.last_get_time', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='discuss_info_seq', full_name='msf.msg.svc.PbGetDiscussMsgReq.discuss_info_seq', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='filter', full_name='msf.msg.svc.PbGetDiscussMsgReq.filter', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='member_seq', full_name='msf.msg.svc.PbGetDiscussMsgReq.member_seq', index=6,
-      number=7, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3451,
-  serialized_end=3613,
-)
-
-
-_PBGETDISCUSSMSGRESP = _descriptor.Descriptor(
-  name='PbGetDiscussMsgResp',
-  full_name='msf.msg.svc.PbGetDiscussMsgResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbGetDiscussMsgResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbGetDiscussMsgResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='discuss_uin', full_name='msf.msg.svc.PbGetDiscussMsgResp.discuss_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='return_end_seq', full_name='msf.msg.svc.PbGetDiscussMsgResp.return_end_seq', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='return_begin_seq', full_name='msf.msg.svc.PbGetDiscussMsgResp.return_begin_seq', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg', full_name='msf.msg.svc.PbGetDiscussMsgResp.msg', index=5,
-      number=6, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_get_time', full_name='msf.msg.svc.PbGetDiscussMsgResp.last_get_time', index=6,
-      number=7, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='discuss_info_seq', full_name='msf.msg.svc.PbGetDiscussMsgResp.discuss_info_seq', index=7,
-      number=8, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3616,
-  serialized_end=3821,
-)
-
-
-_PBGETGROUPMSGREQ = _descriptor.Descriptor(
-  name='PbGetGroupMsgReq',
-  full_name='msf.msg.svc.PbGetGroupMsgReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.svc.PbGetGroupMsgReq.group_code', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='begin_seq', full_name='msf.msg.svc.PbGetGroupMsgReq.begin_seq', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='end_seq', full_name='msf.msg.svc.PbGetGroupMsgReq.end_seq', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='filter', full_name='msf.msg.svc.PbGetGroupMsgReq.filter', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='member_seq', full_name='msf.msg.svc.PbGetGroupMsgReq.member_seq', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='public_group', full_name='msf.msg.svc.PbGetGroupMsgReq.public_group', index=5,
-      number=6, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='shield_flag', full_name='msf.msg.svc.PbGetGroupMsgReq.shield_flag', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='save_traffic_flag', full_name='msf.msg.svc.PbGetGroupMsgReq.save_traffic_flag', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=3824,
-  serialized_end=4004,
-)
-
-
-_PBGETGROUPMSGRESP = _descriptor.Descriptor(
-  name='PbGetGroupMsgResp',
-  full_name='msf.msg.svc.PbGetGroupMsgResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbGetGroupMsgResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbGetGroupMsgResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.svc.PbGetGroupMsgResp.group_code', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='return_begin_seq', full_name='msf.msg.svc.PbGetGroupMsgResp.return_begin_seq', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='return_end_seq', full_name='msf.msg.svc.PbGetGroupMsgResp.return_end_seq', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg', full_name='msf.msg.svc.PbGetGroupMsgResp.msg', index=5,
-      number=6, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4007,
-  serialized_end=4160,
-)
-
-
-_PBGETMSGREQ = _descriptor.Descriptor(
-  name='PbGetMsgReq',
-  full_name='msf.msg.svc.PbGetMsgReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='sync_flag', full_name='msf.msg.svc.PbGetMsgReq.sync_flag', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sync_cookie', full_name='msf.msg.svc.PbGetMsgReq.sync_cookie', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ramble_flag', full_name='msf.msg.svc.PbGetMsgReq.ramble_flag', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='latest_ramble_number', full_name='msf.msg.svc.PbGetMsgReq.latest_ramble_number', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='other_ramble_number', full_name='msf.msg.svc.PbGetMsgReq.other_ramble_number', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='online_sync_flag', full_name='msf.msg.svc.PbGetMsgReq.online_sync_flag', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='context_flag', full_name='msf.msg.svc.PbGetMsgReq.context_flag', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='whisper_session_id', full_name='msf.msg.svc.PbGetMsgReq.whisper_session_id', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_type', full_name='msf.msg.svc.PbGetMsgReq.req_type', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pubaccount_cookie', full_name='msf.msg.svc.PbGetMsgReq.pubaccount_cookie', index=9,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ctrl_buf', full_name='msf.msg.svc.PbGetMsgReq.ctrl_buf', index=10,
-      number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='server_buf', full_name='msf.msg.svc.PbGetMsgReq.server_buf', index=11,
-      number=12, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4163,
-  serialized_end=4455,
-)
-
-
-_PBGETMSGRESP = _descriptor.Descriptor(
-  name='PbGetMsgResp',
-  full_name='msf.msg.svc.PbGetMsgResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbGetMsgResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbGetMsgResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sync_cookie', full_name='msf.msg.svc.PbGetMsgResp.sync_cookie', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sync_flag', full_name='msf.msg.svc.PbGetMsgResp.sync_flag', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='uin_pair_msgs', full_name='msf.msg.svc.PbGetMsgResp.uin_pair_msgs', index=4,
-      number=5, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bind_uin', full_name='msf.msg.svc.PbGetMsgResp.bind_uin', index=5,
-      number=6, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rsp_type', full_name='msf.msg.svc.PbGetMsgResp.rsp_type', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pubaccount_cookie', full_name='msf.msg.svc.PbGetMsgResp.pubaccount_cookie', index=7,
-      number=8, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='is_partial_sync', full_name='msf.msg.svc.PbGetMsgResp.is_partial_sync', index=8,
-      number=9, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ctrl_buf', full_name='msf.msg.svc.PbGetMsgResp.ctrl_buf', index=9,
-      number=10, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4458,
-  serialized_end=4699,
-)
-
-
-_PBGETONEDAYROAMMSGREQ = _descriptor.Descriptor(
-  name='PbGetOneDayRoamMsgReq',
-  full_name='msf.msg.svc.PbGetOneDayRoamMsgReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='peer_uin', full_name='msf.msg.svc.PbGetOneDayRoamMsgReq.peer_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_msgtime', full_name='msf.msg.svc.PbGetOneDayRoamMsgReq.last_msgtime', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='random', full_name='msf.msg.svc.PbGetOneDayRoamMsgReq.random', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='read_cnt', full_name='msf.msg.svc.PbGetOneDayRoamMsgReq.read_cnt', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4701,
-  serialized_end=4798,
-)
-
-
-_PBGETONEDAYROAMMSGRESP = _descriptor.Descriptor(
-  name='PbGetOneDayRoamMsgResp',
-  full_name='msf.msg.svc.PbGetOneDayRoamMsgResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbGetOneDayRoamMsgResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbGetOneDayRoamMsgResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='peer_uin', full_name='msf.msg.svc.PbGetOneDayRoamMsgResp.peer_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_msgtime', full_name='msf.msg.svc.PbGetOneDayRoamMsgResp.last_msgtime', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='random', full_name='msf.msg.svc.PbGetOneDayRoamMsgResp.random', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg', full_name='msf.msg.svc.PbGetOneDayRoamMsgResp.msg', index=5,
-      number=6, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='iscomplete', full_name='msf.msg.svc.PbGetOneDayRoamMsgResp.iscomplete', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4801,
-  serialized_end=4965,
-)
-
-
-_PBGETROAMMSGREQ = _descriptor.Descriptor(
-  name='PbGetRoamMsgReq',
-  full_name='msf.msg.svc.PbGetRoamMsgReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='peer_uin', full_name='msf.msg.svc.PbGetRoamMsgReq.peer_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_msgtime', full_name='msf.msg.svc.PbGetRoamMsgReq.last_msgtime', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='random', full_name='msf.msg.svc.PbGetRoamMsgReq.random', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='read_cnt', full_name='msf.msg.svc.PbGetRoamMsgReq.read_cnt', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='check_pwd', full_name='msf.msg.svc.PbGetRoamMsgReq.check_pwd', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.PbGetRoamMsgReq.sig', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pwd', full_name='msf.msg.svc.PbGetRoamMsgReq.pwd', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='subcmd', full_name='msf.msg.svc.PbGetRoamMsgReq.subcmd', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='begin_msgtime', full_name='msf.msg.svc.PbGetRoamMsgReq.begin_msgtime', index=8,
-      number=9, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_type', full_name='msf.msg.svc.PbGetRoamMsgReq.req_type', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=4968,
-  serialized_end=5161,
-)
-
-
-_PBGETROAMMSGRESP = _descriptor.Descriptor(
-  name='PbGetRoamMsgResp',
-  full_name='msf.msg.svc.PbGetRoamMsgResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbGetRoamMsgResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbGetRoamMsgResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='peer_uin', full_name='msf.msg.svc.PbGetRoamMsgResp.peer_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_msgtime', full_name='msf.msg.svc.PbGetRoamMsgResp.last_msgtime', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='random', full_name='msf.msg.svc.PbGetRoamMsgResp.random', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg', full_name='msf.msg.svc.PbGetRoamMsgResp.msg', index=5,
-      number=6, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.PbGetRoamMsgResp.sig', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5164,
-  serialized_end=5315,
-)
-
-
-_PBGROUPMSGWITHDRAWREQ = _descriptor.Descriptor(
-  name='PbGroupMsgWithDrawReq',
-  full_name='msf.msg.svc.PbGroupMsgWithDrawReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='sub_cmd', full_name='msf.msg.svc.PbGroupMsgWithDrawReq.sub_cmd', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_type', full_name='msf.msg.svc.PbGroupMsgWithDrawReq.group_type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.svc.PbGroupMsgWithDrawReq.group_code', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='list', full_name='msf.msg.svc.PbGroupMsgWithDrawReq.list', index=3,
-      number=4, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='userdef', full_name='msf.msg.svc.PbGroupMsgWithDrawReq.userdef', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5318,
-  serialized_end=5455,
-)
-
-
-_MESSAGEINFO = _descriptor.Descriptor(
-  name='MessageInfo',
-  full_name='msf.msg.svc.MessageInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='msg_seq', full_name='msf.msg.svc.MessageInfo.msg_seq', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_random', full_name='msf.msg.svc.MessageInfo.msg_random', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_type', full_name='msf.msg.svc.MessageInfo.msg_type', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='resv_flag', full_name='msf.msg.svc.MessageInfo.resv_flag', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5457,
-  serialized_end=5544,
-)
-
-
-_PBGROUPMSGWITHDRAWRESP = _descriptor.Descriptor(
-  name='PbGroupMsgWithDrawResp',
-  full_name='msf.msg.svc.PbGroupMsgWithDrawResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbGroupMsgWithDrawResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbGroupMsgWithDrawResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sub_cmd', full_name='msf.msg.svc.PbGroupMsgWithDrawResp.sub_cmd', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_type', full_name='msf.msg.svc.PbGroupMsgWithDrawResp.group_type', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.svc.PbGroupMsgWithDrawResp.group_code', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='failed_msg_list', full_name='msf.msg.svc.PbGroupMsgWithDrawResp.failed_msg_list', index=5,
-      number=6, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='userdef', full_name='msf.msg.svc.PbGroupMsgWithDrawResp.userdef', index=6,
-      number=7, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='wording_info', full_name='msf.msg.svc.PbGroupMsgWithDrawResp.wording_info', index=7,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5547,
-  serialized_end=5786,
-)
-
-
-_MESSAGERESULT = _descriptor.Descriptor(
-  name='MessageResult',
-  full_name='msf.msg.svc.MessageResult',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.MessageResult.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_seq', full_name='msf.msg.svc.MessageResult.msg_seq', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_time', full_name='msf.msg.svc.MessageResult.msg_time', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_random', full_name='msf.msg.svc.MessageResult.msg_random', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='err_msg', full_name='msf.msg.svc.MessageResult.err_msg', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_type', full_name='msf.msg.svc.MessageResult.msg_type', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5788,
-  serialized_end=5909,
-)
-
-
-_PBGROUPREADEDREPORTREQ = _descriptor.Descriptor(
-  name='PbGroupReadedReportReq',
-  full_name='msf.msg.svc.PbGroupReadedReportReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.svc.PbGroupReadedReportReq.group_code', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_read_seq', full_name='msf.msg.svc.PbGroupReadedReportReq.last_read_seq', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5911,
-  serialized_end=5978,
-)
-
-
-_PBGROUPREADEDREPORTRESP = _descriptor.Descriptor(
-  name='PbGroupReadedReportResp',
-  full_name='msf.msg.svc.PbGroupReadedReportResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbGroupReadedReportResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbGroupReadedReportResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.svc.PbGroupReadedReportResp.group_code', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='member_seq', full_name='msf.msg.svc.PbGroupReadedReportResp.member_seq', index=3,
-      number=4, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_msg_seq', full_name='msf.msg.svc.PbGroupReadedReportResp.group_msg_seq', index=4,
-      number=5, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=5980,
-  serialized_end=6100,
-)
-
-
-_PBINPUTNOTIFYINFO = _descriptor.Descriptor(
-  name='PbInputNotifyInfo',
-  full_name='msf.msg.svc.PbInputNotifyInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.PbInputNotifyInfo.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ime', full_name='msf.msg.svc.PbInputNotifyInfo.ime', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='notify_flag', full_name='msf.msg.svc.PbInputNotifyInfo.notify_flag', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pb_reserve', full_name='msf.msg.svc.PbInputNotifyInfo.pb_reserve', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ios_push_wording', full_name='msf.msg.svc.PbInputNotifyInfo.ios_push_wording', index=4,
-      number=5, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6102,
-  serialized_end=6217,
-)
-
-
-_PBMSGREADEDREPORTREQ = _descriptor.Descriptor(
-  name='PbMsgReadedReportReq',
-  full_name='msf.msg.svc.PbMsgReadedReportReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='grp_read_report', full_name='msf.msg.svc.PbMsgReadedReportReq.grp_read_report', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='dis_read_report', full_name='msf.msg.svc.PbMsgReadedReportReq.dis_read_report', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_read_report', full_name='msf.msg.svc.PbMsgReadedReportReq.c2c_read_report', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bind_uin_read_report', full_name='msf.msg.svc.PbMsgReadedReportReq.bind_uin_read_report', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6220,
-  serialized_end=6501,
-)
-
-
-_PBMSGREADEDREPORTRESP = _descriptor.Descriptor(
-  name='PbMsgReadedReportResp',
-  full_name='msf.msg.svc.PbMsgReadedReportResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='grp_read_report', full_name='msf.msg.svc.PbMsgReadedReportResp.grp_read_report', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='dis_read_report', full_name='msf.msg.svc.PbMsgReadedReportResp.dis_read_report', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_read_report', full_name='msf.msg.svc.PbMsgReadedReportResp.c2c_read_report', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bind_uin_read_report', full_name='msf.msg.svc.PbMsgReadedReportResp.bind_uin_read_report', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6504,
-  serialized_end=6790,
-)
-
-
-_PBMSGWITHDRAWREQ = _descriptor.Descriptor(
-  name='PbMsgWithDrawReq',
-  full_name='msf.msg.svc.PbMsgWithDrawReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='c2c_with_draw', full_name='msf.msg.svc.PbMsgWithDrawReq.c2c_with_draw', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_with_draw', full_name='msf.msg.svc.PbMsgWithDrawReq.group_with_draw', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6793,
-  serialized_end=6929,
-)
-
-
-_PBMSGWITHDRAWRESP = _descriptor.Descriptor(
-  name='PbMsgWithDrawResp',
-  full_name='msf.msg.svc.PbMsgWithDrawResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='c2c_with_draw', full_name='msf.msg.svc.PbMsgWithDrawResp.c2c_with_draw', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_with_draw', full_name='msf.msg.svc.PbMsgWithDrawResp.group_with_draw', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=6932,
-  serialized_end=7071,
-)
-
-
-_PBPULLDISCUSSMSGSEQREQ = _descriptor.Descriptor(
-  name='PbPullDiscussMsgSeqReq',
-  full_name='msf.msg.svc.PbPullDiscussMsgSeqReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='discuss_info_req', full_name='msf.msg.svc.PbPullDiscussMsgSeqReq.discuss_info_req', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7073,
-  serialized_end=7152,
-)
-
-
-_DISCUSSINFOREQ = _descriptor.Descriptor(
-  name='DiscussInfoReq',
-  full_name='msf.msg.svc.DiscussInfoReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='conf_uin', full_name='msf.msg.svc.DiscussInfoReq.conf_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_seq', full_name='msf.msg.svc.DiscussInfoReq.last_seq', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7154,
-  serialized_end=7206,
-)
-
-
-_PBPULLDISCUSSMSGSEQRESP = _descriptor.Descriptor(
-  name='PbPullDiscussMsgSeqResp',
-  full_name='msf.msg.svc.PbPullDiscussMsgSeqResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbPullDiscussMsgSeqResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbPullDiscussMsgSeqResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='discuss_info_resp', full_name='msf.msg.svc.PbPullDiscussMsgSeqResp.discuss_info_resp', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7208,
-  serialized_end=7322,
-)
-
-
-_DISCUSSINFORESP = _descriptor.Descriptor(
-  name='DiscussInfoResp',
-  full_name='msf.msg.svc.DiscussInfoResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='conf_uin', full_name='msf.msg.svc.DiscussInfoResp.conf_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='member_seq', full_name='msf.msg.svc.DiscussInfoResp.member_seq', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='conf_seq', full_name='msf.msg.svc.DiscussInfoResp.conf_seq', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7324,
-  serialized_end=7397,
-)
-
-
-_PBPULLGROUPMSGSEQREQ = _descriptor.Descriptor(
-  name='PbPullGroupMsgSeqReq',
-  full_name='msf.msg.svc.PbPullGroupMsgSeqReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='group_info_req', full_name='msf.msg.svc.PbPullGroupMsgSeqReq.group_info_req', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7399,
-  serialized_end=7472,
-)
-
-
-_GROUPINFOREQ = _descriptor.Descriptor(
-  name='GroupInfoReq',
-  full_name='msf.msg.svc.GroupInfoReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.svc.GroupInfoReq.group_code', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_seq', full_name='msf.msg.svc.GroupInfoReq.last_seq', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7474,
-  serialized_end=7526,
-)
-
-
-_PBPULLGROUPMSGSEQRESP = _descriptor.Descriptor(
-  name='PbPullGroupMsgSeqResp',
-  full_name='msf.msg.svc.PbPullGroupMsgSeqResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbPullGroupMsgSeqResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbPullGroupMsgSeqResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_info_resp', full_name='msf.msg.svc.PbPullGroupMsgSeqResp.group_info_resp', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7528,
-  serialized_end=7636,
-)
-
-
-_GROUPINFORESP = _descriptor.Descriptor(
-  name='GroupInfoResp',
-  full_name='msf.msg.svc.GroupInfoResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='group_code', full_name='msf.msg.svc.GroupInfoResp.group_code', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='member_seq', full_name='msf.msg.svc.GroupInfoResp.member_seq', index=1,
-      number=2, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_seq', full_name='msf.msg.svc.GroupInfoResp.group_seq', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7638,
-  serialized_end=7712,
-)
-
-
-_PBSEARCHROAMMSGINCLOUDREQ = _descriptor.Descriptor(
-  name='PbSearchRoamMsgInCloudReq',
-  full_name='msf.msg.svc.PbSearchRoamMsgInCloudReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='serialize_reqbody', full_name='msf.msg.svc.PbSearchRoamMsgInCloudReq.serialize_reqbody', index=0,
-      number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7714,
-  serialized_end=7768,
-)
-
-
-_PBSEARCHROAMMSGINCLOUDRESP = _descriptor.Descriptor(
-  name='PbSearchRoamMsgInCloudResp',
-  full_name='msf.msg.svc.PbSearchRoamMsgInCloudResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='msg', full_name='msf.msg.svc.PbSearchRoamMsgInCloudResp.msg', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='serialize_rspbody', full_name='msf.msg.svc.PbSearchRoamMsgInCloudResp.serialize_rspbody', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7770,
-  serialized_end=7857,
-)
-
-
-_PBSENDMSGREQ = _descriptor.Descriptor(
-  name='PbSendMsgReq',
-  full_name='msf.msg.svc.PbSendMsgReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='routing_head', full_name='msf.msg.svc.PbSendMsgReq.routing_head', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content_head', full_name='msf.msg.svc.PbSendMsgReq.content_head', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='body', full_name='msf.msg.svc.PbSendMsgReq.body', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='seq', full_name='msf.msg.svc.PbSendMsgReq.seq', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rand', full_name='msf.msg.svc.PbSendMsgReq.rand', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sync_cookie', full_name='msf.msg.svc.PbSendMsgReq.sync_cookie', index=5,
-      number=6, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='app_share', full_name='msf.msg.svc.PbSendMsgReq.app_share', index=6,
-      number=7, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='via', full_name='msf.msg.svc.PbSendMsgReq.via', index=7,
-      number=8, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='data_statist', full_name='msf.msg.svc.PbSendMsgReq.data_statist', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='multi_msg_assist', full_name='msf.msg.svc.PbSendMsgReq.multi_msg_assist', index=9,
-      number=10, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='input_notify_info', full_name='msf.msg.svc.PbSendMsgReq.input_notify_info', index=10,
-      number=11, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ctrl', full_name='msf.msg.svc.PbSendMsgReq.ctrl', index=11,
-      number=12, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='receipt_req', full_name='msf.msg.svc.PbSendMsgReq.receipt_req', index=12,
-      number=13, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='multi_send_seq', full_name='msf.msg.svc.PbSendMsgReq.multi_send_seq', index=13,
-      number=14, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=7860,
-  serialized_end=8365,
-)
-
-
-_PBSENDMSGRESP = _descriptor.Descriptor(
-  name='PbSendMsgResp',
-  full_name='msf.msg.svc.PbSendMsgResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbSendMsgResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbSendMsgResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='send_time', full_name='msf.msg.svc.PbSendMsgResp.send_time', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='svrbusy_wait_time', full_name='msf.msg.svc.PbSendMsgResp.svrbusy_wait_time', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='send_info', full_name='msf.msg.svc.PbSendMsgResp.send_info', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errtype', full_name='msf.msg.svc.PbSendMsgResp.errtype', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='trans_svr_info', full_name='msf.msg.svc.PbSendMsgResp.trans_svr_info', index=6,
-      number=7, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='receipt_resp', full_name='msf.msg.svc.PbSendMsgResp.receipt_resp', index=7,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='text_analysis_result', full_name='msf.msg.svc.PbSendMsgResp.text_analysis_result', index=8,
-      number=9, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='msg_info_flag', full_name='msf.msg.svc.PbSendMsgResp.msg_info_flag', index=9,
-      number=10, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=8368,
-  serialized_end=8678,
-)
-
-
-_PBTHIRDQQUNREADMSGNUMREQ = _descriptor.Descriptor(
-  name='PbThirdQQUnReadMsgNumReq',
-  full_name='msf.msg.svc.PbThirdQQUnReadMsgNumReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='thirdqq_req_info', full_name='msf.msg.svc.PbThirdQQUnReadMsgNumReq.thirdqq_req_info', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='source', full_name='msf.msg.svc.PbThirdQQUnReadMsgNumReq.source', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=8680,
-  serialized_end=8777,
-)
-
-
-_THIRDQQREQINFO = _descriptor.Descriptor(
-  name='ThirdQQReqInfo',
-  full_name='msf.msg.svc.ThirdQQReqInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='third_uin', full_name='msf.msg.svc.ThirdQQReqInfo.third_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='third_uin_sig', full_name='msf.msg.svc.ThirdQQReqInfo.third_uin_sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='third_uin_cookie', full_name='msf.msg.svc.ThirdQQReqInfo.third_uin_cookie', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=8779,
-  serialized_end=8863,
-)
-
-
-_PBTHIRDQQUNREADMSGNUMRESP = _descriptor.Descriptor(
-  name='PbThirdQQUnReadMsgNumResp',
-  full_name='msf.msg.svc.PbThirdQQUnReadMsgNumResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.PbThirdQQUnReadMsgNumResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.PbThirdQQUnReadMsgNumResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thirdqq_resp_info', full_name='msf.msg.svc.PbThirdQQUnReadMsgNumResp.thirdqq_resp_info', index=2,
-      number=3, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='interval', full_name='msf.msg.svc.PbThirdQQUnReadMsgNumResp.interval', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=8866,
-  serialized_end=9000,
-)
-
-
-_THIRDQQRESPINFO = _descriptor.Descriptor(
-  name='ThirdQQRespInfo',
-  full_name='msf.msg.svc.ThirdQQRespInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='third_uin', full_name='msf.msg.svc.ThirdQQRespInfo.third_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='third_uin_cookie', full_name='msf.msg.svc.ThirdQQRespInfo.third_uin_cookie', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='num', full_name='msf.msg.svc.ThirdQQRespInfo.num', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='flag', full_name='msf.msg.svc.ThirdQQRespInfo.flag', index=3,
-      number=4, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='redbag_time', full_name='msf.msg.svc.ThirdQQRespInfo.redbag_time', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='msf.msg.svc.ThirdQQRespInfo.status', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='last_msg_time', full_name='msf.msg.svc.ThirdQQRespInfo.last_msg_time', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9003,
-  serialized_end=9152,
-)
-
-
-_PBUNREADMSGSEQREQ = _descriptor.Descriptor(
-  name='PbUnReadMsgSeqReq',
-  full_name='msf.msg.svc.PbUnReadMsgSeqReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='c2c_unread_info', full_name='msf.msg.svc.PbUnReadMsgSeqReq.c2c_unread_info', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='binduin_unread_info', full_name='msf.msg.svc.PbUnReadMsgSeqReq.binduin_unread_info', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_unread_info', full_name='msf.msg.svc.PbUnReadMsgSeqReq.group_unread_info', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='discuss_unread_info', full_name='msf.msg.svc.PbUnReadMsgSeqReq.discuss_unread_info', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thirdqq_unread_info', full_name='msf.msg.svc.PbUnReadMsgSeqReq.thirdqq_unread_info', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9155,
-  serialized_end=9498,
-)
-
-
-_PBUNREADMSGSEQRESP = _descriptor.Descriptor(
-  name='PbUnReadMsgSeqResp',
-  full_name='msf.msg.svc.PbUnReadMsgSeqResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='c2c_unread_info', full_name='msf.msg.svc.PbUnReadMsgSeqResp.c2c_unread_info', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='binduin_unread_info', full_name='msf.msg.svc.PbUnReadMsgSeqResp.binduin_unread_info', index=1,
-      number=2, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_unread_info', full_name='msf.msg.svc.PbUnReadMsgSeqResp.group_unread_info', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='discuss_unread_info', full_name='msf.msg.svc.PbUnReadMsgSeqResp.discuss_unread_info', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='thirdqq_unread_info', full_name='msf.msg.svc.PbUnReadMsgSeqResp.thirdqq_unread_info', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9501,
-  serialized_end=9850,
-)
-
-
-_PUBGROUPTMP = _descriptor.Descriptor(
-  name='PubGroupTmp',
-  full_name='msf.msg.svc.PubGroupTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.PubGroupTmp.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.PubGroupTmp.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='group_uin', full_name='msf.msg.svc.PubGroupTmp.group_uin', index=2,
-      number=3, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9852,
-  serialized_end=9913,
-)
-
-
-_PUBLICPLAT = _descriptor.Descriptor(
-  name='PublicPlat',
-  full_name='msf.msg.svc.PublicPlat',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.PublicPlat.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.PublicPlat.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9915,
-  serialized_end=9956,
-)
-
-
-_QQQUERYBUSINESSTMP = _descriptor.Descriptor(
-  name='QQQueryBusinessTmp',
-  full_name='msf.msg.svc.QQQueryBusinessTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.QQQueryBusinessTmp.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.QQQueryBusinessTmp.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=9958,
-  serialized_end=10007,
-)
-
-
-_RICHSTATUSTMP = _descriptor.Descriptor(
-  name='RichStatusTmp',
-  full_name='msf.msg.svc.RichStatusTmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.RichStatusTmp.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.RichStatusTmp.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=10009,
-  serialized_end=10053,
-)
-
-
-_ROUTINGHEAD = _descriptor.Descriptor(
-  name='RoutingHead',
-  full_name='msf.msg.svc.RoutingHead',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='c2c', full_name='msf.msg.svc.RoutingHead.c2c', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='grp', full_name='msf.msg.svc.RoutingHead.grp', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='grp_tmp', full_name='msf.msg.svc.RoutingHead.grp_tmp', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='dis', full_name='msf.msg.svc.RoutingHead.dis', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='dis_tmp', full_name='msf.msg.svc.RoutingHead.dis_tmp', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='wpa_tmp', full_name='msf.msg.svc.RoutingHead.wpa_tmp', index=5,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='public_plat', full_name='msf.msg.svc.RoutingHead.public_plat', index=6,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='trans_msg', full_name='msf.msg.svc.RoutingHead.trans_msg', index=7,
-      number=9, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='address_list', full_name='msf.msg.svc.RoutingHead.address_list', index=8,
-      number=10, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rich_status_tmp', full_name='msf.msg.svc.RoutingHead.rich_status_tmp', index=9,
-      number=11, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='trans_cmd', full_name='msf.msg.svc.RoutingHead.trans_cmd', index=10,
-      number=12, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='accost_tmp', full_name='msf.msg.svc.RoutingHead.accost_tmp', index=11,
-      number=13, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pub_group_tmp', full_name='msf.msg.svc.RoutingHead.pub_group_tmp', index=12,
-      number=14, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='trans_0_x211', full_name='msf.msg.svc.RoutingHead.trans_0_x211', index=13,
-      number=15, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='business_wpa_tmp', full_name='msf.msg.svc.RoutingHead.business_wpa_tmp', index=14,
-      number=16, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='auth_tmp', full_name='msf.msg.svc.RoutingHead.auth_tmp', index=15,
-      number=17, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bsns_tmp', full_name='msf.msg.svc.RoutingHead.bsns_tmp', index=16,
-      number=18, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='qq_querybusiness_tmp', full_name='msf.msg.svc.RoutingHead.qq_querybusiness_tmp', index=17,
-      number=19, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='nearby_dating_tmp', full_name='msf.msg.svc.RoutingHead.nearby_dating_tmp', index=18,
-      number=20, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='nearby_assistant_tmp', full_name='msf.msg.svc.RoutingHead.nearby_assistant_tmp', index=19,
-      number=21, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='comm_tmp', full_name='msf.msg.svc.RoutingHead.comm_tmp', index=20,
-      number=22, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=10056,
-  serialized_end=11008,
-)
-
-
-_TRANS0X211 = _descriptor.Descriptor(
-  name='Trans0x211',
-  full_name='msf.msg.svc.Trans0x211',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.Trans0x211.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='cc_cmd', full_name='msf.msg.svc.Trans0x211.cc_cmd', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='inst_ctrl', full_name='msf.msg.svc.Trans0x211.inst_ctrl', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.Trans0x211.sig', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_type', full_name='msf.msg.svc.Trans0x211.c2c_type', index=4,
-      number=5, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='service_type', full_name='msf.msg.svc.Trans0x211.service_type', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='dataline_flag', full_name='msf.msg.svc.Trans0x211.dataline_flag', index=6,
-      number=7, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11011,
-  serialized_end=11177,
-)
-
-
-_TRANSCMD = _descriptor.Descriptor(
-  name='TransCmd',
-  full_name='msf.msg.svc.TransCmd',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.TransCmd.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='type', full_name='msf.msg.svc.TransCmd.type', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11179,
-  serialized_end=11219,
-)
-
-
-_TRANSMSG = _descriptor.Descriptor(
-  name='TransMsg',
-  full_name='msf.msg.svc.TransMsg',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.TransMsg.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='c2c_cmd', full_name='msf.msg.svc.TransMsg.c2c_cmd', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11221,
-  serialized_end=11264,
-)
-
-
-_TRANSREQ = _descriptor.Descriptor(
-  name='TransReq',
-  full_name='msf.msg.svc.TransReq',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='command', full_name='msf.msg.svc.TransReq.command', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_tag', full_name='msf.msg.svc.TransReq.req_tag', index=1,
-      number=2, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='req_buff', full_name='msf.msg.svc.TransReq.req_buff', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11266,
-  serialized_end=11328,
-)
-
-
-_TRANSRESP = _descriptor.Descriptor(
-  name='TransResp',
-  full_name='msf.msg.svc.TransResp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='result', full_name='msf.msg.svc.TransResp.result', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='errmsg', full_name='msf.msg.svc.TransResp.errmsg', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='resp_tag', full_name='msf.msg.svc.TransResp.resp_tag', index=2,
-      number=3, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='resp_buff', full_name='msf.msg.svc.TransResp.resp_buff', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11330,
-  serialized_end=11410,
-)
-
-
-_TRANSSVRINFO = _descriptor.Descriptor(
-  name='TransSvrInfo',
-  full_name='msf.msg.svc.TransSvrInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='sub_type', full_name='msf.msg.svc.TransSvrInfo.sub_type', index=0,
-      number=1, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='ret_code', full_name='msf.msg.svc.TransSvrInfo.ret_code', index=1,
-      number=2, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='err_msg', full_name='msf.msg.svc.TransSvrInfo.err_msg', index=2,
-      number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='trans_info', full_name='msf.msg.svc.TransSvrInfo.trans_info', index=3,
-      number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11412,
-  serialized_end=11499,
-)
-
-
-_WPATMP = _descriptor.Descriptor(
-  name='WPATmp',
-  full_name='msf.msg.svc.WPATmp',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='to_uin', full_name='msf.msg.svc.WPATmp.to_uin', index=0,
-      number=1, type=4, cpp_type=4, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sig', full_name='msf.msg.svc.WPATmp.sig', index=1,
-      number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"",
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11501,
-  serialized_end=11538,
-)
-
-
-_WITHDRAWWORDINGINFO = _descriptor.Descriptor(
-  name='WithDrawWordingInfo',
-  full_name='msf.msg.svc.WithDrawWordingInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='item_id', full_name='msf.msg.svc.WithDrawWordingInfo.item_id', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='item_name', full_name='msf.msg.svc.WithDrawWordingInfo.item_name', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=11540,
-  serialized_end=11597,
-)
-
-_MULTIMSGASSIST.fields_by_name['repeated_routing'].message_type = _ROUTINGHEAD
-_PBC2CMSGWITHDRAWREQ_MSGINFO.fields_by_name['routing_head'].message_type = _ROUTINGHEAD
-_PBC2CMSGWITHDRAWREQ_MSGINFO.containing_type = _PBC2CMSGWITHDRAWREQ
-_PBC2CMSGWITHDRAWREQ.fields_by_name['info'].message_type = _PBC2CMSGWITHDRAWREQ_MSGINFO
-_PBC2CMSGWITHDRAWRESP.fields_by_name['status'].message_type = _MSGSTATUS
-_PBC2CMSGWITHDRAWRESP.fields_by_name['wording_info'].message_type = _WITHDRAWWORDINGINFO
-_MSGSTATUS.fields_by_name['info'].message_type = _PBC2CMSGWITHDRAWREQ_MSGINFO
-_PBC2CREADEDREPORTREQ.fields_by_name['pair_info'].message_type = _UINPAIRREADINFO
-_PBDELROAMMSGREQ.fields_by_name['c2c_msg'].message_type = _C2CMSG
-_PBDELROAMMSGREQ.fields_by_name['grp_msg'].message_type = _GRPMSG
-_PBDELROAMMSGREQ.fields_by_name['dis_msg'].message_type = _DISMSG
-_PBDELETEMSGREQ_MSGITEM.containing_type = _PBDELETEMSGREQ
-_PBDELETEMSGREQ.fields_by_name['msg_items'].message_type = _PBDELETEMSGREQ_MSGITEM
-_PBGETDISCUSSMSGRESP.fields_by_name['msg'].message_type = cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2._MSG
-_PBGETGROUPMSGRESP.fields_by_name['msg'].message_type = cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2._MSG
-_PBGETMSGRESP.fields_by_name['uin_pair_msgs'].message_type = cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2._UINPAIRMSG
-_PBGETONEDAYROAMMSGRESP.fields_by_name['msg'].message_type = cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2._MSG
-_PBGETROAMMSGRESP.fields_by_name['msg'].message_type = cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2._MSG
-_PBGROUPMSGWITHDRAWREQ.fields_by_name['list'].message_type = _MESSAGEINFO
-_PBGROUPMSGWITHDRAWRESP.fields_by_name['failed_msg_list'].message_type = _MESSAGERESULT
-_PBGROUPMSGWITHDRAWRESP.fields_by_name['wording_info'].message_type = _WITHDRAWWORDINGINFO
-_PBMSGREADEDREPORTREQ.fields_by_name['grp_read_report'].message_type = _PBGROUPREADEDREPORTREQ
-_PBMSGREADEDREPORTREQ.fields_by_name['dis_read_report'].message_type = _PBDISCUSSREADEDREPORTREQ
-_PBMSGREADEDREPORTREQ.fields_by_name['c2c_read_report'].message_type = _PBC2CREADEDREPORTREQ
-_PBMSGREADEDREPORTREQ.fields_by_name['bind_uin_read_report'].message_type = _PBBINDUINMSGREADEDCONFIRMREQ
-_PBMSGREADEDREPORTRESP.fields_by_name['grp_read_report'].message_type = _PBGROUPREADEDREPORTRESP
-_PBMSGREADEDREPORTRESP.fields_by_name['dis_read_report'].message_type = _PBDISCUSSREADEDREPORTRESP
-_PBMSGREADEDREPORTRESP.fields_by_name['c2c_read_report'].message_type = _PBC2CREADEDREPORTRESP
-_PBMSGREADEDREPORTRESP.fields_by_name['bind_uin_read_report'].message_type = _PBBINDUINMSGREADEDCONFIRMRESP
-_PBMSGWITHDRAWREQ.fields_by_name['c2c_with_draw'].message_type = _PBC2CMSGWITHDRAWREQ
-_PBMSGWITHDRAWREQ.fields_by_name['group_with_draw'].message_type = _PBGROUPMSGWITHDRAWREQ
-_PBMSGWITHDRAWRESP.fields_by_name['c2c_with_draw'].message_type = _PBC2CMSGWITHDRAWRESP
-_PBMSGWITHDRAWRESP.fields_by_name['group_with_draw'].message_type = _PBGROUPMSGWITHDRAWRESP
-_PBPULLDISCUSSMSGSEQREQ.fields_by_name['discuss_info_req'].message_type = _DISCUSSINFOREQ
-_PBPULLDISCUSSMSGSEQRESP.fields_by_name['discuss_info_resp'].message_type = _DISCUSSINFORESP
-_PBPULLGROUPMSGSEQREQ.fields_by_name['group_info_req'].message_type = _GROUPINFOREQ
-_PBPULLGROUPMSGSEQRESP.fields_by_name['group_info_resp'].message_type = _GROUPINFORESP
-_PBSEARCHROAMMSGINCLOUDRESP.fields_by_name['msg'].message_type = cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2._MSG
-_PBSENDMSGREQ.fields_by_name['routing_head'].message_type = _ROUTINGHEAD
-_PBSENDMSGREQ.fields_by_name['content_head'].message_type = cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2._CONTENTHEAD
-_PBSENDMSGREQ.fields_by_name['body'].message_type = cai_dot_pb_dot_im_dot_msg_dot_msg__body_dot_msg__body__pb2._MSGBODY
-_PBSENDMSGREQ.fields_by_name['app_share'].message_type = cai_dot_pb_dot_msf_dot_msg_dot_comm_dot_comm__pb2._APPSHAREINFO
-_PBSENDMSGREQ.fields_by_name['multi_msg_assist'].message_type = _MULTIMSGASSIST
-_PBSENDMSGREQ.fields_by_name['input_notify_info'].message_type = _PBINPUTNOTIFYINFO
-_PBSENDMSGREQ.fields_by_name['ctrl'].message_type = cai_dot_pb_dot_msf_dot_msg_dot_ctrl_dot_ctrl__pb2._MSGCTRL
-_PBSENDMSGREQ.fields_by_name['receipt_req'].message_type = cai_dot_pb_dot_im_dot_msg_dot_receipt_dot_receipt__pb2._RECEIPTREQ
-_PBSENDMSGRESP.fields_by_name['send_info'].message_type = _MSGSENDINFO
-_PBSENDMSGRESP.fields_by_name['trans_svr_info'].message_type = _TRANSSVRINFO
-_PBSENDMSGRESP.fields_by_name['receipt_resp'].message_type = cai_dot_pb_dot_im_dot_msg_dot_receipt_dot_receipt__pb2._RECEIPTRESP
-_PBTHIRDQQUNREADMSGNUMREQ.fields_by_name['thirdqq_req_info'].message_type = _THIRDQQREQINFO
-_PBTHIRDQQUNREADMSGNUMRESP.fields_by_name['thirdqq_resp_info'].message_type = _THIRDQQRESPINFO
-_PBUNREADMSGSEQREQ.fields_by_name['c2c_unread_info'].message_type = _PBC2CUNREADMSGNUMREQ
-_PBUNREADMSGSEQREQ.fields_by_name['binduin_unread_info'].message_type = _PBBINDUINUNREADMSGNUMREQ
-_PBUNREADMSGSEQREQ.fields_by_name['group_unread_info'].message_type = _PBPULLGROUPMSGSEQREQ
-_PBUNREADMSGSEQREQ.fields_by_name['discuss_unread_info'].message_type = _PBPULLDISCUSSMSGSEQREQ
-_PBUNREADMSGSEQREQ.fields_by_name['thirdqq_unread_info'].message_type = _PBTHIRDQQUNREADMSGNUMREQ
-_PBUNREADMSGSEQRESP.fields_by_name['c2c_unread_info'].message_type = _PBC2CUNREADMSGNUMRESP
-_PBUNREADMSGSEQRESP.fields_by_name['binduin_unread_info'].message_type = _PBBINDUINUNREADMSGNUMRESP
-_PBUNREADMSGSEQRESP.fields_by_name['group_unread_info'].message_type = _PBPULLGROUPMSGSEQRESP
-_PBUNREADMSGSEQRESP.fields_by_name['discuss_unread_info'].message_type = _PBPULLDISCUSSMSGSEQRESP
-_PBUNREADMSGSEQRESP.fields_by_name['thirdqq_unread_info'].message_type = _PBTHIRDQQUNREADMSGNUMRESP
-_ROUTINGHEAD.fields_by_name['c2c'].message_type = _C2C
-_ROUTINGHEAD.fields_by_name['grp'].message_type = _GRP
-_ROUTINGHEAD.fields_by_name['grp_tmp'].message_type = _GRPTMP
-_ROUTINGHEAD.fields_by_name['dis'].message_type = _DIS
-_ROUTINGHEAD.fields_by_name['dis_tmp'].message_type = _DISTMP
-_ROUTINGHEAD.fields_by_name['wpa_tmp'].message_type = _WPATMP
-_ROUTINGHEAD.fields_by_name['public_plat'].message_type = _PUBLICPLAT
-_ROUTINGHEAD.fields_by_name['trans_msg'].message_type = _TRANSMSG
-_ROUTINGHEAD.fields_by_name['address_list'].message_type = _ADDRESSLISTTMP
-_ROUTINGHEAD.fields_by_name['rich_status_tmp'].message_type = _RICHSTATUSTMP
-_ROUTINGHEAD.fields_by_name['trans_cmd'].message_type = _TRANSCMD
-_ROUTINGHEAD.fields_by_name['accost_tmp'].message_type = _ACCOSTTMP
-_ROUTINGHEAD.fields_by_name['pub_group_tmp'].message_type = _PUBGROUPTMP
-_ROUTINGHEAD.fields_by_name['trans_0_x211'].message_type = _TRANS0X211
-_ROUTINGHEAD.fields_by_name['business_wpa_tmp'].message_type = _BUSINESSWPATMP
-_ROUTINGHEAD.fields_by_name['auth_tmp'].message_type = _AUTHTMP
-_ROUTINGHEAD.fields_by_name['bsns_tmp'].message_type = _BSNSTMP
-_ROUTINGHEAD.fields_by_name['qq_querybusiness_tmp'].message_type = _QQQUERYBUSINESSTMP
-_ROUTINGHEAD.fields_by_name['nearby_dating_tmp'].message_type = _NEARBYDATINGTMP
-_ROUTINGHEAD.fields_by_name['nearby_assistant_tmp'].message_type = _NEARBYASSISTANTTMP
-_ROUTINGHEAD.fields_by_name['comm_tmp'].message_type = _COMMTMP
-_TRANS0X211.fields_by_name['inst_ctrl'].message_type = cai_dot_pb_dot_im_dot_msg_dot_msg__head_dot_msg__head__pb2._INSTCTRL
-DESCRIPTOR.message_types_by_name['AccostTmp'] = _ACCOSTTMP
-DESCRIPTOR.message_types_by_name['AddressListTmp'] = _ADDRESSLISTTMP
-DESCRIPTOR.message_types_by_name['AuthTmp'] = _AUTHTMP
-DESCRIPTOR.message_types_by_name['BsnsTmp'] = _BSNSTMP
-DESCRIPTOR.message_types_by_name['BusinessWPATmp'] = _BUSINESSWPATMP
-DESCRIPTOR.message_types_by_name['C2C'] = _C2C
-DESCRIPTOR.message_types_by_name['CommTmp'] = _COMMTMP
-DESCRIPTOR.message_types_by_name['Dis'] = _DIS
-DESCRIPTOR.message_types_by_name['DisTmp'] = _DISTMP
-DESCRIPTOR.message_types_by_name['Grp'] = _GRP
-DESCRIPTOR.message_types_by_name['GrpTmp'] = _GRPTMP
-DESCRIPTOR.message_types_by_name['MsgSendInfo'] = _MSGSENDINFO
-DESCRIPTOR.message_types_by_name['MultiMsgAssist'] = _MULTIMSGASSIST
-DESCRIPTOR.message_types_by_name['NearByAssistantTmp'] = _NEARBYASSISTANTTMP
-DESCRIPTOR.message_types_by_name['NearByDatingTmp'] = _NEARBYDATINGTMP
-DESCRIPTOR.message_types_by_name['PbBindUinGetMsgReq'] = _PBBINDUINGETMSGREQ
-DESCRIPTOR.message_types_by_name['PbBindUinMsgReadedConfirmReq'] = _PBBINDUINMSGREADEDCONFIRMREQ
-DESCRIPTOR.message_types_by_name['PbBindUinMsgReadedConfirmResp'] = _PBBINDUINMSGREADEDCONFIRMRESP
-DESCRIPTOR.message_types_by_name['PbBindUinUnReadMsgNumReq'] = _PBBINDUINUNREADMSGNUMREQ
-DESCRIPTOR.message_types_by_name['PbBindUinUnReadMsgNumResp'] = _PBBINDUINUNREADMSGNUMRESP
-DESCRIPTOR.message_types_by_name['PbC2CMsgWithDrawReq'] = _PBC2CMSGWITHDRAWREQ
-DESCRIPTOR.message_types_by_name['PbC2CMsgWithDrawResp'] = _PBC2CMSGWITHDRAWRESP
-DESCRIPTOR.message_types_by_name['MsgStatus'] = _MSGSTATUS
-DESCRIPTOR.message_types_by_name['PbC2CReadedReportReq'] = _PBC2CREADEDREPORTREQ
-DESCRIPTOR.message_types_by_name['UinPairReadInfo'] = _UINPAIRREADINFO
-DESCRIPTOR.message_types_by_name['PbC2CReadedReportResp'] = _PBC2CREADEDREPORTRESP
-DESCRIPTOR.message_types_by_name['PbC2CUnReadMsgNumReq'] = _PBC2CUNREADMSGNUMREQ
-DESCRIPTOR.message_types_by_name['PbC2CUnReadMsgNumResp'] = _PBC2CUNREADMSGNUMRESP
-DESCRIPTOR.message_types_by_name['PbDelRoamMsgReq'] = _PBDELROAMMSGREQ
-DESCRIPTOR.message_types_by_name['C2CMsg'] = _C2CMSG
-DESCRIPTOR.message_types_by_name['DisMsg'] = _DISMSG
-DESCRIPTOR.message_types_by_name['GrpMsg'] = _GRPMSG
-DESCRIPTOR.message_types_by_name['PbDelRoamMsgResp'] = _PBDELROAMMSGRESP
-DESCRIPTOR.message_types_by_name['PbDeleteMsgReq'] = _PBDELETEMSGREQ
-DESCRIPTOR.message_types_by_name['PbDeleteMsgResp'] = _PBDELETEMSGRESP
-DESCRIPTOR.message_types_by_name['PbDiscussReadedReportReq'] = _PBDISCUSSREADEDREPORTREQ
-DESCRIPTOR.message_types_by_name['PbDiscussReadedReportResp'] = _PBDISCUSSREADEDREPORTRESP
-DESCRIPTOR.message_types_by_name['PbGetDiscussMsgReq'] = _PBGETDISCUSSMSGREQ
-DESCRIPTOR.message_types_by_name['PbGetDiscussMsgResp'] = _PBGETDISCUSSMSGRESP
-DESCRIPTOR.message_types_by_name['PbGetGroupMsgReq'] = _PBGETGROUPMSGREQ
-DESCRIPTOR.message_types_by_name['PbGetGroupMsgResp'] = _PBGETGROUPMSGRESP
-DESCRIPTOR.message_types_by_name['PbGetMsgReq'] = _PBGETMSGREQ
-DESCRIPTOR.message_types_by_name['PbGetMsgResp'] = _PBGETMSGRESP
-DESCRIPTOR.message_types_by_name['PbGetOneDayRoamMsgReq'] = _PBGETONEDAYROAMMSGREQ
-DESCRIPTOR.message_types_by_name['PbGetOneDayRoamMsgResp'] = _PBGETONEDAYROAMMSGRESP
-DESCRIPTOR.message_types_by_name['PbGetRoamMsgReq'] = _PBGETROAMMSGREQ
-DESCRIPTOR.message_types_by_name['PbGetRoamMsgResp'] = _PBGETROAMMSGRESP
-DESCRIPTOR.message_types_by_name['PbGroupMsgWithDrawReq'] = _PBGROUPMSGWITHDRAWREQ
-DESCRIPTOR.message_types_by_name['MessageInfo'] = _MESSAGEINFO
-DESCRIPTOR.message_types_by_name['PbGroupMsgWithDrawResp'] = _PBGROUPMSGWITHDRAWRESP
-DESCRIPTOR.message_types_by_name['MessageResult'] = _MESSAGERESULT
-DESCRIPTOR.message_types_by_name['PbGroupReadedReportReq'] = _PBGROUPREADEDREPORTREQ
-DESCRIPTOR.message_types_by_name['PbGroupReadedReportResp'] = _PBGROUPREADEDREPORTRESP
-DESCRIPTOR.message_types_by_name['PbInputNotifyInfo'] = _PBINPUTNOTIFYINFO
-DESCRIPTOR.message_types_by_name['PbMsgReadedReportReq'] = _PBMSGREADEDREPORTREQ
-DESCRIPTOR.message_types_by_name['PbMsgReadedReportResp'] = _PBMSGREADEDREPORTRESP
-DESCRIPTOR.message_types_by_name['PbMsgWithDrawReq'] = _PBMSGWITHDRAWREQ
-DESCRIPTOR.message_types_by_name['PbMsgWithDrawResp'] = _PBMSGWITHDRAWRESP
-DESCRIPTOR.message_types_by_name['PbPullDiscussMsgSeqReq'] = _PBPULLDISCUSSMSGSEQREQ
-DESCRIPTOR.message_types_by_name['DiscussInfoReq'] = _DISCUSSINFOREQ
-DESCRIPTOR.message_types_by_name['PbPullDiscussMsgSeqResp'] = _PBPULLDISCUSSMSGSEQRESP
-DESCRIPTOR.message_types_by_name['DiscussInfoResp'] = _DISCUSSINFORESP
-DESCRIPTOR.message_types_by_name['PbPullGroupMsgSeqReq'] = _PBPULLGROUPMSGSEQREQ
-DESCRIPTOR.message_types_by_name['GroupInfoReq'] = _GROUPINFOREQ
-DESCRIPTOR.message_types_by_name['PbPullGroupMsgSeqResp'] = _PBPULLGROUPMSGSEQRESP
-DESCRIPTOR.message_types_by_name['GroupInfoResp'] = _GROUPINFORESP
-DESCRIPTOR.message_types_by_name['PbSearchRoamMsgInCloudReq'] = _PBSEARCHROAMMSGINCLOUDREQ
-DESCRIPTOR.message_types_by_name['PbSearchRoamMsgInCloudResp'] = _PBSEARCHROAMMSGINCLOUDRESP
-DESCRIPTOR.message_types_by_name['PbSendMsgReq'] = _PBSENDMSGREQ
-DESCRIPTOR.message_types_by_name['PbSendMsgResp'] = _PBSENDMSGRESP
-DESCRIPTOR.message_types_by_name['PbThirdQQUnReadMsgNumReq'] = _PBTHIRDQQUNREADMSGNUMREQ
-DESCRIPTOR.message_types_by_name['ThirdQQReqInfo'] = _THIRDQQREQINFO
-DESCRIPTOR.message_types_by_name['PbThirdQQUnReadMsgNumResp'] = _PBTHIRDQQUNREADMSGNUMRESP
-DESCRIPTOR.message_types_by_name['ThirdQQRespInfo'] = _THIRDQQRESPINFO
-DESCRIPTOR.message_types_by_name['PbUnReadMsgSeqReq'] = _PBUNREADMSGSEQREQ
-DESCRIPTOR.message_types_by_name['PbUnReadMsgSeqResp'] = _PBUNREADMSGSEQRESP
-DESCRIPTOR.message_types_by_name['PubGroupTmp'] = _PUBGROUPTMP
-DESCRIPTOR.message_types_by_name['PublicPlat'] = _PUBLICPLAT
-DESCRIPTOR.message_types_by_name['QQQueryBusinessTmp'] = _QQQUERYBUSINESSTMP
-DESCRIPTOR.message_types_by_name['RichStatusTmp'] = _RICHSTATUSTMP
-DESCRIPTOR.message_types_by_name['RoutingHead'] = _ROUTINGHEAD
-DESCRIPTOR.message_types_by_name['Trans0x211'] = _TRANS0X211
-DESCRIPTOR.message_types_by_name['TransCmd'] = _TRANSCMD
-DESCRIPTOR.message_types_by_name['TransMsg'] = _TRANSMSG
-DESCRIPTOR.message_types_by_name['TransReq'] = _TRANSREQ
-DESCRIPTOR.message_types_by_name['TransResp'] = _TRANSRESP
-DESCRIPTOR.message_types_by_name['TransSvrInfo'] = _TRANSSVRINFO
-DESCRIPTOR.message_types_by_name['WPATmp'] = _WPATMP
-DESCRIPTOR.message_types_by_name['WithDrawWordingInfo'] = _WITHDRAWWORDINGINFO
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x63\x61i/pb/msf/msg/svc/svc.proto\x12\x0bmsf.msg.svc\x1a\x1e\x63\x61i/pb/msf/msg/comm/comm.proto\x1a\x1e\x63\x61i/pb/msf/msg/ctrl/ctrl.proto\x1a%cai/pb/im/msg/msg_body/msg_body.proto\x1a%cai/pb/im/msg/msg_head/msg_head.proto\x1a#cai/pb/im/msg/receipt/receipt.proto\"7\n\tAccostTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\r\n\x05reply\x18\x03 \x01(\x08\"n\n\x0e\x41\x64\x64ressListTmp\x12\x12\n\nfrom_phone\x18\x01 \x01(\t\x12\x10\n\x08to_phone\x18\x02 \x01(\t\x12\x0e\n\x06to_uin\x18\x03 \x01(\x04\x12\x0b\n\x03sig\x18\x04 \x01(\x0c\x12\x19\n\x11\x66rom_contact_size\x18\x05 \x01(\r\"&\n\x07\x41uthTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\"&\n\x07\x42snsTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\";\n\x0e\x42usinessWPATmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\x0c\n\x04sigt\x18\x03 \x01(\x0c\"\x15\n\x03\x43\x32\x43\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\"\\\n\x07\x43ommTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x10\n\x08\x63\x32\x63_type\x18\x02 \x01(\r\x12\x10\n\x08svr_type\x18\x03 \x01(\r\x12\x0b\n\x03sig\x18\x04 \x01(\x0c\x12\x10\n\x08reserved\x18\x05 \x01(\x0c\"\x16\n\x03\x44is\x12\x0f\n\x07\x64is_uin\x18\x01 \x01(\x04\")\n\x06\x44isTmp\x12\x0f\n\x07\x64is_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\"\x19\n\x03Grp\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\"+\n\x06GrpTmp\x12\x11\n\tgroup_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\"\x1f\n\x0bMsgSendInfo\x12\x10\n\x08receiver\x18\x01 \x01(\r\"\xc7\x01\n\x0eMultiMsgAssist\x12\x32\n\x10repeated_routing\x18\x01 \x03(\x0b\x32\x18.msf.msg.svc.RoutingHead\x12\x0b\n\x03use\x18\x02 \x01(\r\x12\x0f\n\x07temp_id\x18\x03 \x01(\x04\x12\x11\n\tvedio_len\x18\x04 \x01(\x04\x12\x11\n\tredbag_id\x18\x05 \x01(\x0c\x12\x15\n\rredbag_amount\x18\x06 \x01(\x04\x12\x13\n\x0bhas_readbag\x18\x07 \x01(\r\x12\x11\n\thas_vedio\x18\x08 \x01(\r\"@\n\x12NearByAssistantTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\r\n\x05reply\x18\x03 \x01(\x08\"=\n\x0fNearByDatingTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\r\n\x05reply\x18\x03 \x01(\x08\"d\n\x12PbBindUinGetMsgReq\x12\x10\n\x08\x62ind_uin\x18\x01 \x01(\x04\x12\x14\n\x0c\x62ind_uin_sig\x18\x02 \x01(\x0c\x12\x11\n\tsync_flag\x18\x03 \x01(\r\x12\x13\n\x0bsync_cookie\x18\x04 \x01(\x0c\"E\n\x1cPbBindUinMsgReadedConfirmReq\x12\x13\n\x0bsync_cookie\x18\x01 \x01(\x0c\x12\x10\n\x08\x62ind_uin\x18\x02 \x01(\x04\"f\n\x1dPbBindUinMsgReadedConfirmResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x13\n\x0bsync_cookie\x18\x03 \x01(\x0c\x12\x10\n\x08\x62ind_uin\x18\x04 \x01(\x04\"A\n\x18PbBindUinUnReadMsgNumReq\x12\x10\n\x08\x62ind_uin\x18\x01 \x01(\x04\x12\x13\n\x0bsync_cookie\x18\x02 \x01(\x0c\"Z\n\x19PbBindUinUnReadMsgNumResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x10\n\x08\x62ind_uin\x18\x03 \x01(\x04\x12\x0b\n\x03num\x18\x04 \x01(\r\"\xf8\x02\n\x13PbC2CMsgWithDrawReq\x12\x36\n\x04info\x18\x01 \x03(\x0b\x32(.msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo\x12\x19\n\x11long_message_flag\x18\x02 \x01(\r\x12\x10\n\x08reserved\x18\x03 \x01(\x0c\x12\x0f\n\x07sub_cmd\x18\x04 \x01(\r\x1a\xea\x01\n\x07MsgInfo\x12\x10\n\x08\x66rom_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\x12\x0f\n\x07msg_seq\x18\x03 \x01(\r\x12\x0f\n\x07msg_uid\x18\x04 \x01(\x04\x12\x10\n\x08msg_time\x18\x05 \x01(\x04\x12\x12\n\nmsg_random\x18\x06 \x01(\r\x12\x0f\n\x07pkg_num\x18\x07 \x01(\r\x12\x11\n\tpkg_index\x18\x08 \x01(\r\x12\x0f\n\x07\x64iv_seq\x18\t \x01(\r\x12\x10\n\x08msg_type\x18\n \x01(\r\x12.\n\x0crouting_head\x18\x14 \x01(\x0b\x32\x18.msf.msg.svc.RoutingHead\"\xa7\x01\n\x14PbC2CMsgWithDrawResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12&\n\x06status\x18\x03 \x03(\x0b\x32\x16.msf.msg.svc.MsgStatus\x12\x0f\n\x07sub_cmd\x18\x04 \x01(\r\x12\x36\n\x0cwording_info\x18\x05 \x01(\x0b\x32 .msf.msg.svc.WithDrawWordingInfo\"S\n\tMsgStatus\x12\x36\n\x04info\x18\x01 \x01(\x0b\x32(.msf.msg.svc.PbC2CMsgWithDrawReq.MsgInfo\x12\x0e\n\x06status\x18\x02 \x01(\r\"\\\n\x14PbC2CReadedReportReq\x12\x13\n\x0bsync_cookie\x18\x01 \x01(\x0c\x12/\n\tpair_info\x18\x02 \x03(\x0b\x32\x1c.msf.msg.svc.UinPairReadInfo\"\xa6\x01\n\x0fUinPairReadInfo\x12\x10\n\x08peer_uin\x18\x01 \x01(\x04\x12\x16\n\x0elast_read_time\x18\x02 \x01(\r\x12\x0f\n\x07\x63rm_sig\x18\x03 \x01(\x0c\x12\x11\n\tpeer_type\x18\x04 \x01(\r\x12\x11\n\tchat_type\x18\x05 \x01(\r\x12\x0c\n\x04\x63pid\x18\x06 \x01(\x04\x12\x10\n\x08\x61io_type\x18\x07 \x01(\r\x12\x12\n\nto_tiny_id\x18\t \x01(\x04\"L\n\x15PbC2CReadedReportResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x13\n\x0bsync_cookie\x18\x03 \x01(\x0c\"\x16\n\x14PbC2CUnReadMsgNumReq\"D\n\x15PbC2CUnReadMsgNumResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x0b\n\x03num\x18\x03 \x01(\r\"\x83\x01\n\x0fPbDelRoamMsgReq\x12$\n\x07\x63\x32\x63_msg\x18\x01 \x01(\x0b\x32\x13.msf.msg.svc.C2CMsg\x12$\n\x07grp_msg\x18\x02 \x01(\x0b\x32\x13.msf.msg.svc.GrpMsg\x12$\n\x07\x64is_msg\x18\x03 \x01(\x0b\x32\x13.msf.msg.svc.DisMsg\"W\n\x06\x43\x32\x43Msg\x12\x10\n\x08\x66rom_uin\x18\x01 \x01(\x04\x12\x10\n\x08peer_uin\x18\x02 \x01(\x04\x12\x0c\n\x04time\x18\x03 \x01(\r\x12\x0e\n\x06random\x18\x04 \x01(\r\x12\x0b\n\x03seq\x18\x05 \x01(\r\"*\n\x06\x44isMsg\x12\x13\n\x0b\x64iscuss_uin\x18\x01 \x01(\x04\x12\x0b\n\x03seq\x18\x02 \x01(\x04\"<\n\x06GrpMsg\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x0b\n\x03seq\x18\x02 \x01(\x04\x12\x11\n\tresv_flag\x18\x03 \x01(\r\"2\n\x10PbDelRoamMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\"\xaa\x01\n\x0ePbDeleteMsgReq\x12\x36\n\tmsg_items\x18\x01 \x03(\x0b\x32#.msf.msg.svc.PbDeleteMsgReq.MsgItem\x1a`\n\x07MsgItem\x12\x10\n\x08\x66rom_uin\x18\x01 \x01(\x04\x12\x0e\n\x06to_uin\x18\x02 \x01(\x04\x12\x0c\n\x04type\x18\x03 \x01(\r\x12\x0b\n\x03seq\x18\x04 \x01(\r\x12\x0b\n\x03uid\x18\x05 \x01(\x04\x12\x0b\n\x03sig\x18\x07 \x01(\x0c\"1\n\x0fPbDeleteMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\"C\n\x18PbDiscussReadedReportReq\x12\x10\n\x08\x63onf_uin\x18\x01 \x01(\x04\x12\x15\n\rlast_read_seq\x18\x02 \x01(\x04\"s\n\x19PbDiscussReadedReportResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x10\n\x08\x63onf_uin\x18\x03 \x01(\x04\x12\x12\n\nmember_seq\x18\x04 \x01(\x04\x12\x10\n\x08\x63onf_seq\x18\x05 \x01(\x04\"\xa2\x01\n\x12PbGetDiscussMsgReq\x12\x13\n\x0b\x64iscuss_uin\x18\x01 \x01(\x04\x12\x0f\n\x07\x65nd_seq\x18\x02 \x01(\x04\x12\x11\n\tbegin_seq\x18\x03 \x01(\x04\x12\x15\n\rlast_get_time\x18\x04 \x01(\x04\x12\x18\n\x10\x64iscuss_info_seq\x18\x05 \x01(\x04\x12\x0e\n\x06\x66ilter\x18\x06 \x01(\r\x12\x12\n\nmember_seq\x18\x07 \x01(\x04\"\xcd\x01\n\x13PbGetDiscussMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x13\n\x0b\x64iscuss_uin\x18\x03 \x01(\x04\x12\x16\n\x0ereturn_end_seq\x18\x04 \x01(\x04\x12\x18\n\x10return_begin_seq\x18\x05 \x01(\x04\x12\x1e\n\x03msg\x18\x06 \x03(\x0b\x32\x11.msf.msg.comm.Msg\x12\x15\n\rlast_get_time\x18\x07 \x01(\x04\x12\x18\n\x10\x64iscuss_info_seq\x18\x08 \x01(\x04\"\xb4\x01\n\x10PbGetGroupMsgReq\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x11\n\tbegin_seq\x18\x02 \x01(\x04\x12\x0f\n\x07\x65nd_seq\x18\x03 \x01(\x04\x12\x0e\n\x06\x66ilter\x18\x04 \x01(\r\x12\x12\n\nmember_seq\x18\x05 \x01(\x04\x12\x14\n\x0cpublic_group\x18\x06 \x01(\x08\x12\x13\n\x0bshield_flag\x18\x07 \x01(\r\x12\x19\n\x11save_traffic_flag\x18\x08 \x01(\r\"\x99\x01\n\x11PbGetGroupMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x12\n\ngroup_code\x18\x03 \x01(\x04\x12\x18\n\x10return_begin_seq\x18\x04 \x01(\x04\x12\x16\n\x0ereturn_end_seq\x18\x05 \x01(\x04\x12\x1e\n\x03msg\x18\x06 \x03(\x0b\x32\x11.msf.msg.comm.Msg\"\xa4\x02\n\x0bPbGetMsgReq\x12\x11\n\tsync_flag\x18\x01 \x01(\r\x12\x13\n\x0bsync_cookie\x18\x02 \x01(\x0c\x12\x13\n\x0bramble_flag\x18\x03 \x01(\r\x12\x1c\n\x14latest_ramble_number\x18\x04 \x01(\r\x12\x1b\n\x13other_ramble_number\x18\x05 \x01(\r\x12\x18\n\x10online_sync_flag\x18\x06 \x01(\r\x12\x14\n\x0c\x63ontext_flag\x18\x07 \x01(\r\x12\x1a\n\x12whisper_session_id\x18\x08 \x01(\r\x12\x10\n\x08req_type\x18\t \x01(\r\x12\x19\n\x11pubaccount_cookie\x18\n \x01(\x0c\x12\x10\n\x08\x63trl_buf\x18\x0b \x01(\x0c\x12\x12\n\nserver_buf\x18\x0c \x01(\x0c\"\xf1\x01\n\x0cPbGetMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x13\n\x0bsync_cookie\x18\x03 \x01(\x0c\x12\x11\n\tsync_flag\x18\x04 \x01(\r\x12/\n\ruin_pair_msgs\x18\x05 \x03(\x0b\x32\x18.msf.msg.comm.UinPairMsg\x12\x10\n\x08\x62ind_uin\x18\x06 \x01(\x04\x12\x10\n\x08rsp_type\x18\x07 \x01(\r\x12\x19\n\x11pubaccount_cookie\x18\x08 \x01(\x0c\x12\x17\n\x0fis_partial_sync\x18\t \x01(\x08\x12\x10\n\x08\x63trl_buf\x18\n \x01(\x0c\"a\n\x15PbGetOneDayRoamMsgReq\x12\x10\n\x08peer_uin\x18\x01 \x01(\x04\x12\x14\n\x0clast_msgtime\x18\x02 \x01(\x04\x12\x0e\n\x06random\x18\x03 \x01(\x04\x12\x10\n\x08read_cnt\x18\x04 \x01(\r\"\xa4\x01\n\x16PbGetOneDayRoamMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x10\n\x08peer_uin\x18\x03 \x01(\x04\x12\x14\n\x0clast_msgtime\x18\x04 \x01(\x04\x12\x0e\n\x06random\x18\x05 \x01(\x04\x12\x1e\n\x03msg\x18\x06 \x03(\x0b\x32\x11.msf.msg.comm.Msg\x12\x12\n\niscomplete\x18\x07 \x01(\r\"\xc1\x01\n\x0fPbGetRoamMsgReq\x12\x10\n\x08peer_uin\x18\x01 \x01(\x04\x12\x14\n\x0clast_msgtime\x18\x02 \x01(\x04\x12\x0e\n\x06random\x18\x03 \x01(\x04\x12\x10\n\x08read_cnt\x18\x04 \x01(\r\x12\x11\n\tcheck_pwd\x18\x05 \x01(\r\x12\x0b\n\x03sig\x18\x06 \x01(\x0c\x12\x0b\n\x03pwd\x18\x07 \x01(\x0c\x12\x0e\n\x06subcmd\x18\x08 \x01(\r\x12\x15\n\rbegin_msgtime\x18\t \x01(\x04\x12\x10\n\x08req_type\x18\n \x01(\r\"\x97\x01\n\x10PbGetRoamMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x10\n\x08peer_uin\x18\x03 \x01(\x04\x12\x14\n\x0clast_msgtime\x18\x04 \x01(\x04\x12\x0e\n\x06random\x18\x05 \x01(\x04\x12\x1e\n\x03msg\x18\x06 \x03(\x0b\x32\x11.msf.msg.comm.Msg\x12\x0b\n\x03sig\x18\x07 \x01(\x0c\"\x89\x01\n\x15PbGroupMsgWithDrawReq\x12\x0f\n\x07sub_cmd\x18\x01 \x01(\r\x12\x12\n\ngroup_type\x18\x02 \x01(\r\x12\x12\n\ngroup_code\x18\x03 \x01(\x04\x12&\n\x04list\x18\x04 \x03(\x0b\x32\x18.msf.msg.svc.MessageInfo\x12\x0f\n\x07userdef\x18\x05 \x01(\x0c\"W\n\x0bMessageInfo\x12\x0f\n\x07msg_seq\x18\x01 \x01(\r\x12\x12\n\nmsg_random\x18\x02 \x01(\r\x12\x10\n\x08msg_type\x18\x03 \x01(\r\x12\x11\n\tresv_flag\x18\x04 \x01(\r\"\xef\x01\n\x16PbGroupMsgWithDrawResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x0f\n\x07sub_cmd\x18\x03 \x01(\r\x12\x12\n\ngroup_type\x18\x04 \x01(\r\x12\x12\n\ngroup_code\x18\x05 \x01(\x04\x12\x33\n\x0f\x66\x61iled_msg_list\x18\x06 \x03(\x0b\x32\x1a.msf.msg.svc.MessageResult\x12\x0f\n\x07userdef\x18\x07 \x01(\x0c\x12\x36\n\x0cwording_info\x18\x08 \x01(\x0b\x32 .msf.msg.svc.WithDrawWordingInfo\"y\n\rMessageResult\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0f\n\x07msg_seq\x18\x02 \x01(\r\x12\x10\n\x08msg_time\x18\x03 \x01(\r\x12\x12\n\nmsg_random\x18\x04 \x01(\r\x12\x0f\n\x07\x65rr_msg\x18\x05 \x01(\x0c\x12\x10\n\x08msg_type\x18\x06 \x01(\r\"C\n\x16PbGroupReadedReportReq\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x15\n\rlast_read_seq\x18\x02 \x01(\x04\"x\n\x17PbGroupReadedReportResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x12\n\ngroup_code\x18\x03 \x01(\x04\x12\x12\n\nmember_seq\x18\x04 \x01(\x04\x12\x15\n\rgroup_msg_seq\x18\x05 \x01(\x04\"s\n\x11PbInputNotifyInfo\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03ime\x18\x02 \x01(\r\x12\x13\n\x0bnotify_flag\x18\x03 \x01(\r\x12\x12\n\npb_reserve\x18\x04 \x01(\x0c\x12\x18\n\x10ios_push_wording\x18\x05 \x01(\x0c\"\x99\x02\n\x14PbMsgReadedReportReq\x12<\n\x0fgrp_read_report\x18\x01 \x03(\x0b\x32#.msf.msg.svc.PbGroupReadedReportReq\x12>\n\x0f\x64is_read_report\x18\x02 \x03(\x0b\x32%.msf.msg.svc.PbDiscussReadedReportReq\x12:\n\x0f\x63\x32\x63_read_report\x18\x03 \x01(\x0b\x32!.msf.msg.svc.PbC2CReadedReportReq\x12G\n\x14\x62ind_uin_read_report\x18\x04 \x01(\x0b\x32).msf.msg.svc.PbBindUinMsgReadedConfirmReq\"\x9e\x02\n\x15PbMsgReadedReportResp\x12=\n\x0fgrp_read_report\x18\x01 \x03(\x0b\x32$.msf.msg.svc.PbGroupReadedReportResp\x12?\n\x0f\x64is_read_report\x18\x02 \x03(\x0b\x32&.msf.msg.svc.PbDiscussReadedReportResp\x12;\n\x0f\x63\x32\x63_read_report\x18\x03 \x01(\x0b\x32\".msf.msg.svc.PbC2CReadedReportResp\x12H\n\x14\x62ind_uin_read_report\x18\x04 \x01(\x0b\x32*.msf.msg.svc.PbBindUinMsgReadedConfirmResp\"\x88\x01\n\x10PbMsgWithDrawReq\x12\x37\n\rc2c_with_draw\x18\x01 \x03(\x0b\x32 .msf.msg.svc.PbC2CMsgWithDrawReq\x12;\n\x0fgroup_with_draw\x18\x02 \x03(\x0b\x32\".msf.msg.svc.PbGroupMsgWithDrawReq\"\x8b\x01\n\x11PbMsgWithDrawResp\x12\x38\n\rc2c_with_draw\x18\x01 \x03(\x0b\x32!.msf.msg.svc.PbC2CMsgWithDrawResp\x12<\n\x0fgroup_with_draw\x18\x02 \x03(\x0b\x32#.msf.msg.svc.PbGroupMsgWithDrawResp\"O\n\x16PbPullDiscussMsgSeqReq\x12\x35\n\x10\x64iscuss_info_req\x18\x01 \x03(\x0b\x32\x1b.msf.msg.svc.DiscussInfoReq\"4\n\x0e\x44iscussInfoReq\x12\x10\n\x08\x63onf_uin\x18\x01 \x01(\x04\x12\x10\n\x08last_seq\x18\x02 \x01(\x04\"r\n\x17PbPullDiscussMsgSeqResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x37\n\x11\x64iscuss_info_resp\x18\x03 \x03(\x0b\x32\x1c.msf.msg.svc.DiscussInfoResp\"I\n\x0f\x44iscussInfoResp\x12\x10\n\x08\x63onf_uin\x18\x01 \x01(\x04\x12\x12\n\nmember_seq\x18\x02 \x01(\x04\x12\x10\n\x08\x63onf_seq\x18\x03 \x01(\x04\"I\n\x14PbPullGroupMsgSeqReq\x12\x31\n\x0egroup_info_req\x18\x01 \x03(\x0b\x32\x19.msf.msg.svc.GroupInfoReq\"4\n\x0cGroupInfoReq\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x10\n\x08last_seq\x18\x02 \x01(\x04\"l\n\x15PbPullGroupMsgSeqResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x33\n\x0fgroup_info_resp\x18\x03 \x03(\x0b\x32\x1a.msf.msg.svc.GroupInfoResp\"J\n\rGroupInfoResp\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x12\n\nmember_seq\x18\x02 \x01(\x04\x12\x11\n\tgroup_seq\x18\x03 \x01(\x04\"6\n\x19PbSearchRoamMsgInCloudReq\x12\x19\n\x11serialize_reqbody\x18\x01 \x01(\x0c\"W\n\x1aPbSearchRoamMsgInCloudResp\x12\x1e\n\x03msg\x18\x01 \x03(\x0b\x32\x11.msf.msg.comm.Msg\x12\x19\n\x11serialize_rspbody\x18\x02 \x01(\x0c\"\xf9\x03\n\x0cPbSendMsgReq\x12.\n\x0crouting_head\x18\x01 \x01(\x0b\x32\x18.msf.msg.svc.RoutingHead\x12/\n\x0c\x63ontent_head\x18\x02 \x01(\x0b\x32\x19.msf.msg.comm.ContentHead\x12&\n\x04\x62ody\x18\x03 \x01(\x0b\x32\x18.im.msg.msg_body.MsgBody\x12\x0b\n\x03seq\x18\x04 \x01(\r\x12\x0c\n\x04rand\x18\x05 \x01(\r\x12\x13\n\x0bsync_cookie\x18\x06 \x01(\x0c\x12-\n\tapp_share\x18\x07 \x01(\x0b\x32\x1a.msf.msg.comm.AppShareInfo\x12\x0b\n\x03via\x18\x08 \x01(\r\x12\x14\n\x0c\x64\x61ta_statist\x18\t \x01(\r\x12\x35\n\x10multi_msg_assist\x18\n \x01(\x0b\x32\x1b.msf.msg.svc.MultiMsgAssist\x12\x39\n\x11input_notify_info\x18\x0b \x01(\x0b\x32\x1e.msf.msg.svc.PbInputNotifyInfo\x12#\n\x04\x63trl\x18\x0c \x01(\x0b\x32\x15.msf.msg.ctrl.MsgCtrl\x12/\n\x0breceipt_req\x18\r \x01(\x0b\x32\x1a.im.msg.receipt.ReceiptReq\x12\x16\n\x0emulti_send_seq\x18\x0e \x01(\r\"\xb6\x02\n\rPbSendMsgResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x11\n\tsend_time\x18\x03 \x01(\r\x12\x19\n\x11svrbusy_wait_time\x18\x04 \x01(\r\x12+\n\tsend_info\x18\x05 \x01(\x0b\x32\x18.msf.msg.svc.MsgSendInfo\x12\x0f\n\x07\x65rrtype\x18\x06 \x01(\r\x12\x31\n\x0etrans_svr_info\x18\x07 \x01(\x0b\x32\x19.msf.msg.svc.TransSvrInfo\x12\x31\n\x0creceipt_resp\x18\x08 \x01(\x0b\x32\x1b.im.msg.receipt.ReceiptResp\x12\x1c\n\x14text_analysis_result\x18\t \x01(\r\x12\x15\n\rmsg_info_flag\x18\n \x01(\r\"a\n\x18PbThirdQQUnReadMsgNumReq\x12\x35\n\x10thirdqq_req_info\x18\x01 \x03(\x0b\x32\x1b.msf.msg.svc.ThirdQQReqInfo\x12\x0e\n\x06source\x18\x02 \x01(\r\"T\n\x0eThirdQQReqInfo\x12\x11\n\tthird_uin\x18\x01 \x01(\x04\x12\x15\n\rthird_uin_sig\x18\x02 \x01(\x0c\x12\x18\n\x10third_uin_cookie\x18\x03 \x01(\x0c\"\x86\x01\n\x19PbThirdQQUnReadMsgNumResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x37\n\x11thirdqq_resp_info\x18\x03 \x03(\x0b\x32\x1c.msf.msg.svc.ThirdQQRespInfo\x12\x10\n\x08interval\x18\x04 \x01(\r\"\x95\x01\n\x0fThirdQQRespInfo\x12\x11\n\tthird_uin\x18\x01 \x01(\x04\x12\x18\n\x10third_uin_cookie\x18\x02 \x01(\x0c\x12\x0b\n\x03num\x18\x03 \x01(\r\x12\x0c\n\x04\x66lag\x18\x04 \x01(\r\x12\x13\n\x0bredbag_time\x18\x05 \x01(\r\x12\x0e\n\x06status\x18\x06 \x01(\r\x12\x15\n\rlast_msg_time\x18\x07 \x01(\r\"\xd7\x02\n\x11PbUnReadMsgSeqReq\x12:\n\x0f\x63\x32\x63_unread_info\x18\x01 \x01(\x0b\x32!.msf.msg.svc.PbC2CUnReadMsgNumReq\x12\x42\n\x13\x62induin_unread_info\x18\x02 \x03(\x0b\x32%.msf.msg.svc.PbBindUinUnReadMsgNumReq\x12<\n\x11group_unread_info\x18\x03 \x01(\x0b\x32!.msf.msg.svc.PbPullGroupMsgSeqReq\x12@\n\x13\x64iscuss_unread_info\x18\x04 \x01(\x0b\x32#.msf.msg.svc.PbPullDiscussMsgSeqReq\x12\x42\n\x13thirdqq_unread_info\x18\x05 \x01(\x0b\x32%.msf.msg.svc.PbThirdQQUnReadMsgNumReq\"\xdd\x02\n\x12PbUnReadMsgSeqResp\x12;\n\x0f\x63\x32\x63_unread_info\x18\x01 \x01(\x0b\x32\".msf.msg.svc.PbC2CUnReadMsgNumResp\x12\x43\n\x13\x62induin_unread_info\x18\x02 \x03(\x0b\x32&.msf.msg.svc.PbBindUinUnReadMsgNumResp\x12=\n\x11group_unread_info\x18\x03 \x01(\x0b\x32\".msf.msg.svc.PbPullGroupMsgSeqResp\x12\x41\n\x13\x64iscuss_unread_info\x18\x04 \x01(\x0b\x32$.msf.msg.svc.PbPullDiscussMsgSeqResp\x12\x43\n\x13thirdqq_unread_info\x18\x05 \x01(\x0b\x32&.msf.msg.svc.PbThirdQQUnReadMsgNumResp\"=\n\x0bPubGroupTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\x12\x11\n\tgroup_uin\x18\x03 \x01(\x04\")\n\nPublicPlat\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\"1\n\x12QQQueryBusinessTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\",\n\rRichStatusTmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\"\xb8\x07\n\x0bRoutingHead\x12\x1d\n\x03\x63\x32\x63\x18\x01 \x01(\x0b\x32\x10.msf.msg.svc.C2C\x12\x1d\n\x03grp\x18\x02 \x01(\x0b\x32\x10.msf.msg.svc.Grp\x12$\n\x07grp_tmp\x18\x03 \x01(\x0b\x32\x13.msf.msg.svc.GrpTmp\x12\x1d\n\x03\x64is\x18\x04 \x01(\x0b\x32\x10.msf.msg.svc.Dis\x12$\n\x07\x64is_tmp\x18\x05 \x01(\x0b\x32\x13.msf.msg.svc.DisTmp\x12$\n\x07wpa_tmp\x18\x06 \x01(\x0b\x32\x13.msf.msg.svc.WPATmp\x12,\n\x0bpublic_plat\x18\x08 \x01(\x0b\x32\x17.msf.msg.svc.PublicPlat\x12(\n\ttrans_msg\x18\t \x01(\x0b\x32\x15.msf.msg.svc.TransMsg\x12\x31\n\x0c\x61\x64\x64ress_list\x18\n \x01(\x0b\x32\x1b.msf.msg.svc.AddressListTmp\x12\x33\n\x0frich_status_tmp\x18\x0b \x01(\x0b\x32\x1a.msf.msg.svc.RichStatusTmp\x12(\n\ttrans_cmd\x18\x0c \x01(\x0b\x32\x15.msf.msg.svc.TransCmd\x12*\n\naccost_tmp\x18\r \x01(\x0b\x32\x16.msf.msg.svc.AccostTmp\x12/\n\rpub_group_tmp\x18\x0e \x01(\x0b\x32\x18.msf.msg.svc.PubGroupTmp\x12-\n\x0ctrans_0_x211\x18\x0f \x01(\x0b\x32\x17.msf.msg.svc.Trans0x211\x12\x35\n\x10\x62usiness_wpa_tmp\x18\x10 \x01(\x0b\x32\x1b.msf.msg.svc.BusinessWPATmp\x12&\n\x08\x61uth_tmp\x18\x11 \x01(\x0b\x32\x14.msf.msg.svc.AuthTmp\x12&\n\x08\x62sns_tmp\x18\x12 \x01(\x0b\x32\x14.msf.msg.svc.BsnsTmp\x12=\n\x14qq_querybusiness_tmp\x18\x13 \x01(\x0b\x32\x1f.msf.msg.svc.QQQueryBusinessTmp\x12\x37\n\x11nearby_dating_tmp\x18\x14 \x01(\x0b\x32\x1c.msf.msg.svc.NearByDatingTmp\x12=\n\x14nearby_assistant_tmp\x18\x15 \x01(\x0b\x32\x1f.msf.msg.svc.NearByAssistantTmp\x12&\n\x08\x63omm_tmp\x18\x16 \x01(\x0b\x32\x14.msf.msg.svc.CommTmp\"\xa6\x01\n\nTrans0x211\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0e\n\x06\x63\x63_cmd\x18\x02 \x01(\r\x12,\n\tinst_ctrl\x18\x03 \x01(\x0b\x32\x19.im.msg.msg_head.InstCtrl\x12\x0b\n\x03sig\x18\x04 \x01(\x0c\x12\x10\n\x08\x63\x32\x63_type\x18\x05 \x01(\r\x12\x14\n\x0cservice_type\x18\x06 \x01(\r\x12\x15\n\rdataline_flag\x18\x07 \x01(\r\"(\n\x08TransCmd\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0c\n\x04type\x18\x02 \x01(\r\"+\n\x08TransMsg\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0f\n\x07\x63\x32\x63_cmd\x18\x02 \x01(\r\">\n\x08TransReq\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\x05\x12\x0f\n\x07req_tag\x18\x02 \x01(\r\x12\x10\n\x08req_buff\x18\x03 \x01(\x0c\"P\n\tTransResp\x12\x0e\n\x06result\x18\x01 \x01(\r\x12\x0e\n\x06\x65rrmsg\x18\x02 \x01(\t\x12\x10\n\x08resp_tag\x18\x03 \x01(\r\x12\x11\n\tresp_buff\x18\x04 \x01(\x0c\"W\n\x0cTransSvrInfo\x12\x10\n\x08sub_type\x18\x01 \x01(\r\x12\x10\n\x08ret_code\x18\x02 \x01(\x05\x12\x0f\n\x07\x65rr_msg\x18\x03 \x01(\x0c\x12\x12\n\ntrans_info\x18\x04 \x01(\x0c\"%\n\x06WPATmp\x12\x0e\n\x06to_uin\x18\x01 \x01(\x04\x12\x0b\n\x03sig\x18\x02 \x01(\x0c\"9\n\x13WithDrawWordingInfo\x12\x0f\n\x07item_id\x18\x01 \x01(\x05\x12\x11\n\titem_name\x18\x02 \x01(\t')
+
+
+
+_ACCOSTTMP = DESCRIPTOR.message_types_by_name['AccostTmp']
+_ADDRESSLISTTMP = DESCRIPTOR.message_types_by_name['AddressListTmp']
+_AUTHTMP = DESCRIPTOR.message_types_by_name['AuthTmp']
+_BSNSTMP = DESCRIPTOR.message_types_by_name['BsnsTmp']
+_BUSINESSWPATMP = DESCRIPTOR.message_types_by_name['BusinessWPATmp']
+_C2C = DESCRIPTOR.message_types_by_name['C2C']
+_COMMTMP = DESCRIPTOR.message_types_by_name['CommTmp']
+_DIS = DESCRIPTOR.message_types_by_name['Dis']
+_DISTMP = DESCRIPTOR.message_types_by_name['DisTmp']
+_GRP = DESCRIPTOR.message_types_by_name['Grp']
+_GRPTMP = DESCRIPTOR.message_types_by_name['GrpTmp']
+_MSGSENDINFO = DESCRIPTOR.message_types_by_name['MsgSendInfo']
+_MULTIMSGASSIST = DESCRIPTOR.message_types_by_name['MultiMsgAssist']
+_NEARBYASSISTANTTMP = DESCRIPTOR.message_types_by_name['NearByAssistantTmp']
+_NEARBYDATINGTMP = DESCRIPTOR.message_types_by_name['NearByDatingTmp']
+_PBBINDUINGETMSGREQ = DESCRIPTOR.message_types_by_name['PbBindUinGetMsgReq']
+_PBBINDUINMSGREADEDCONFIRMREQ = DESCRIPTOR.message_types_by_name['PbBindUinMsgReadedConfirmReq']
+_PBBINDUINMSGREADEDCONFIRMRESP = DESCRIPTOR.message_types_by_name['PbBindUinMsgReadedConfirmResp']
+_PBBINDUINUNREADMSGNUMREQ = DESCRIPTOR.message_types_by_name['PbBindUinUnReadMsgNumReq']
+_PBBINDUINUNREADMSGNUMRESP = DESCRIPTOR.message_types_by_name['PbBindUinUnReadMsgNumResp']
+_PBC2CMSGWITHDRAWREQ = DESCRIPTOR.message_types_by_name['PbC2CMsgWithDrawReq']
+_PBC2CMSGWITHDRAWREQ_MSGINFO = _PBC2CMSGWITHDRAWREQ.nested_types_by_name['MsgInfo']
+_PBC2CMSGWITHDRAWRESP = DESCRIPTOR.message_types_by_name['PbC2CMsgWithDrawResp']
+_MSGSTATUS = DESCRIPTOR.message_types_by_name['MsgStatus']
+_PBC2CREADEDREPORTREQ = DESCRIPTOR.message_types_by_name['PbC2CReadedReportReq']
+_UINPAIRREADINFO = DESCRIPTOR.message_types_by_name['UinPairReadInfo']
+_PBC2CREADEDREPORTRESP = DESCRIPTOR.message_types_by_name['PbC2CReadedReportResp']
+_PBC2CUNREADMSGNUMREQ = DESCRIPTOR.message_types_by_name['PbC2CUnReadMsgNumReq']
+_PBC2CUNREADMSGNUMRESP = DESCRIPTOR.message_types_by_name['PbC2CUnReadMsgNumResp']
+_PBDELROAMMSGREQ = DESCRIPTOR.message_types_by_name['PbDelRoamMsgReq']
+_C2CMSG = DESCRIPTOR.message_types_by_name['C2CMsg']
+_DISMSG = DESCRIPTOR.message_types_by_name['DisMsg']
+_GRPMSG = DESCRIPTOR.message_types_by_name['GrpMsg']
+_PBDELROAMMSGRESP = DESCRIPTOR.message_types_by_name['PbDelRoamMsgResp']
+_PBDELETEMSGREQ = DESCRIPTOR.message_types_by_name['PbDeleteMsgReq']
+_PBDELETEMSGREQ_MSGITEM = _PBDELETEMSGREQ.nested_types_by_name['MsgItem']
+_PBDELETEMSGRESP = DESCRIPTOR.message_types_by_name['PbDeleteMsgResp']
+_PBDISCUSSREADEDREPORTREQ = DESCRIPTOR.message_types_by_name['PbDiscussReadedReportReq']
+_PBDISCUSSREADEDREPORTRESP = DESCRIPTOR.message_types_by_name['PbDiscussReadedReportResp']
+_PBGETDISCUSSMSGREQ = DESCRIPTOR.message_types_by_name['PbGetDiscussMsgReq']
+_PBGETDISCUSSMSGRESP = DESCRIPTOR.message_types_by_name['PbGetDiscussMsgResp']
+_PBGETGROUPMSGREQ = DESCRIPTOR.message_types_by_name['PbGetGroupMsgReq']
+_PBGETGROUPMSGRESP = DESCRIPTOR.message_types_by_name['PbGetGroupMsgResp']
+_PBGETMSGREQ = DESCRIPTOR.message_types_by_name['PbGetMsgReq']
+_PBGETMSGRESP = DESCRIPTOR.message_types_by_name['PbGetMsgResp']
+_PBGETONEDAYROAMMSGREQ = DESCRIPTOR.message_types_by_name['PbGetOneDayRoamMsgReq']
+_PBGETONEDAYROAMMSGRESP = DESCRIPTOR.message_types_by_name['PbGetOneDayRoamMsgResp']
+_PBGETROAMMSGREQ = DESCRIPTOR.message_types_by_name['PbGetRoamMsgReq']
+_PBGETROAMMSGRESP = DESCRIPTOR.message_types_by_name['PbGetRoamMsgResp']
+_PBGROUPMSGWITHDRAWREQ = DESCRIPTOR.message_types_by_name['PbGroupMsgWithDrawReq']
+_MESSAGEINFO = DESCRIPTOR.message_types_by_name['MessageInfo']
+_PBGROUPMSGWITHDRAWRESP = DESCRIPTOR.message_types_by_name['PbGroupMsgWithDrawResp']
+_MESSAGERESULT = DESCRIPTOR.message_types_by_name['MessageResult']
+_PBGROUPREADEDREPORTREQ = DESCRIPTOR.message_types_by_name['PbGroupReadedReportReq']
+_PBGROUPREADEDREPORTRESP = DESCRIPTOR.message_types_by_name['PbGroupReadedReportResp']
+_PBINPUTNOTIFYINFO = DESCRIPTOR.message_types_by_name['PbInputNotifyInfo']
+_PBMSGREADEDREPORTREQ = DESCRIPTOR.message_types_by_name['PbMsgReadedReportReq']
+_PBMSGREADEDREPORTRESP = DESCRIPTOR.message_types_by_name['PbMsgReadedReportResp']
+_PBMSGWITHDRAWREQ = DESCRIPTOR.message_types_by_name['PbMsgWithDrawReq']
+_PBMSGWITHDRAWRESP = DESCRIPTOR.message_types_by_name['PbMsgWithDrawResp']
+_PBPULLDISCUSSMSGSEQREQ = DESCRIPTOR.message_types_by_name['PbPullDiscussMsgSeqReq']
+_DISCUSSINFOREQ = DESCRIPTOR.message_types_by_name['DiscussInfoReq']
+_PBPULLDISCUSSMSGSEQRESP = DESCRIPTOR.message_types_by_name['PbPullDiscussMsgSeqResp']
+_DISCUSSINFORESP = DESCRIPTOR.message_types_by_name['DiscussInfoResp']
+_PBPULLGROUPMSGSEQREQ = DESCRIPTOR.message_types_by_name['PbPullGroupMsgSeqReq']
+_GROUPINFOREQ = DESCRIPTOR.message_types_by_name['GroupInfoReq']
+_PBPULLGROUPMSGSEQRESP = DESCRIPTOR.message_types_by_name['PbPullGroupMsgSeqResp']
+_GROUPINFORESP = DESCRIPTOR.message_types_by_name['GroupInfoResp']
+_PBSEARCHROAMMSGINCLOUDREQ = DESCRIPTOR.message_types_by_name['PbSearchRoamMsgInCloudReq']
+_PBSEARCHROAMMSGINCLOUDRESP = DESCRIPTOR.message_types_by_name['PbSearchRoamMsgInCloudResp']
+_PBSENDMSGREQ = DESCRIPTOR.message_types_by_name['PbSendMsgReq']
+_PBSENDMSGRESP = DESCRIPTOR.message_types_by_name['PbSendMsgResp']
+_PBTHIRDQQUNREADMSGNUMREQ = DESCRIPTOR.message_types_by_name['PbThirdQQUnReadMsgNumReq']
+_THIRDQQREQINFO = DESCRIPTOR.message_types_by_name['ThirdQQReqInfo']
+_PBTHIRDQQUNREADMSGNUMRESP = DESCRIPTOR.message_types_by_name['PbThirdQQUnReadMsgNumResp']
+_THIRDQQRESPINFO = DESCRIPTOR.message_types_by_name['ThirdQQRespInfo']
+_PBUNREADMSGSEQREQ = DESCRIPTOR.message_types_by_name['PbUnReadMsgSeqReq']
+_PBUNREADMSGSEQRESP = DESCRIPTOR.message_types_by_name['PbUnReadMsgSeqResp']
+_PUBGROUPTMP = DESCRIPTOR.message_types_by_name['PubGroupTmp']
+_PUBLICPLAT = DESCRIPTOR.message_types_by_name['PublicPlat']
+_QQQUERYBUSINESSTMP = DESCRIPTOR.message_types_by_name['QQQueryBusinessTmp']
+_RICHSTATUSTMP = DESCRIPTOR.message_types_by_name['RichStatusTmp']
+_ROUTINGHEAD = DESCRIPTOR.message_types_by_name['RoutingHead']
+_TRANS0X211 = DESCRIPTOR.message_types_by_name['Trans0x211']
+_TRANSCMD = DESCRIPTOR.message_types_by_name['TransCmd']
+_TRANSMSG = DESCRIPTOR.message_types_by_name['TransMsg']
+_TRANSREQ = DESCRIPTOR.message_types_by_name['TransReq']
+_TRANSRESP = DESCRIPTOR.message_types_by_name['TransResp']
+_TRANSSVRINFO = DESCRIPTOR.message_types_by_name['TransSvrInfo']
+_WPATMP = DESCRIPTOR.message_types_by_name['WPATmp']
+_WITHDRAWWORDINGINFO = DESCRIPTOR.message_types_by_name['WithDrawWordingInfo']
 AccostTmp = _reflection.GeneratedProtocolMessageType('AccostTmp', (_message.Message,), {
   'DESCRIPTOR' : _ACCOSTTMP,
   '__module__' : 'cai.pb.msf.msg.svc.svc_pb2'
@@ -5776,5 +753,189 @@
   })
 _sym_db.RegisterMessage(WithDrawWordingInfo)
 
-
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _ACCOSTTMP._serialized_start=224
+  _ACCOSTTMP._serialized_end=279
+  _ADDRESSLISTTMP._serialized_start=281
+  _ADDRESSLISTTMP._serialized_end=391
+  _AUTHTMP._serialized_start=393
+  _AUTHTMP._serialized_end=431
+  _BSNSTMP._serialized_start=433
+  _BSNSTMP._serialized_end=471
+  _BUSINESSWPATMP._serialized_start=473
+  _BUSINESSWPATMP._serialized_end=532
+  _C2C._serialized_start=534
+  _C2C._serialized_end=555
+  _COMMTMP._serialized_start=557
+  _COMMTMP._serialized_end=649
+  _DIS._serialized_start=651
+  _DIS._serialized_end=673
+  _DISTMP._serialized_start=675
+  _DISTMP._serialized_end=716
+  _GRP._serialized_start=718
+  _GRP._serialized_end=743
+  _GRPTMP._serialized_start=745
+  _GRPTMP._serialized_end=788
+  _MSGSENDINFO._serialized_start=790
+  _MSGSENDINFO._serialized_end=821
+  _MULTIMSGASSIST._serialized_start=824
+  _MULTIMSGASSIST._serialized_end=1023
+  _NEARBYASSISTANTTMP._serialized_start=1025
+  _NEARBYASSISTANTTMP._serialized_end=1089
+  _NEARBYDATINGTMP._serialized_start=1091
+  _NEARBYDATINGTMP._serialized_end=1152
+  _PBBINDUINGETMSGREQ._serialized_start=1154
+  _PBBINDUINGETMSGREQ._serialized_end=1254
+  _PBBINDUINMSGREADEDCONFIRMREQ._serialized_start=1256
+  _PBBINDUINMSGREADEDCONFIRMREQ._serialized_end=1325
+  _PBBINDUINMSGREADEDCONFIRMRESP._serialized_start=1327
+  _PBBINDUINMSGREADEDCONFIRMRESP._serialized_end=1429
+  _PBBINDUINUNREADMSGNUMREQ._serialized_start=1431
+  _PBBINDUINUNREADMSGNUMREQ._serialized_end=1496
+  _PBBINDUINUNREADMSGNUMRESP._serialized_start=1498
+  _PBBINDUINUNREADMSGNUMRESP._serialized_end=1588
+  _PBC2CMSGWITHDRAWREQ._serialized_start=1591
+  _PBC2CMSGWITHDRAWREQ._serialized_end=1967
+  _PBC2CMSGWITHDRAWREQ_MSGINFO._serialized_start=1733
+  _PBC2CMSGWITHDRAWREQ_MSGINFO._serialized_end=1967
+  _PBC2CMSGWITHDRAWRESP._serialized_start=1970
+  _PBC2CMSGWITHDRAWRESP._serialized_end=2137
+  _MSGSTATUS._serialized_start=2139
+  _MSGSTATUS._serialized_end=2222
+  _PBC2CREADEDREPORTREQ._serialized_start=2224
+  _PBC2CREADEDREPORTREQ._serialized_end=2316
+  _UINPAIRREADINFO._serialized_start=2319
+  _UINPAIRREADINFO._serialized_end=2485
+  _PBC2CREADEDREPORTRESP._serialized_start=2487
+  _PBC2CREADEDREPORTRESP._serialized_end=2563
+  _PBC2CUNREADMSGNUMREQ._serialized_start=2565
+  _PBC2CUNREADMSGNUMREQ._serialized_end=2587
+  _PBC2CUNREADMSGNUMRESP._serialized_start=2589
+  _PBC2CUNREADMSGNUMRESP._serialized_end=2657
+  _PBDELROAMMSGREQ._serialized_start=2660
+  _PBDELROAMMSGREQ._serialized_end=2791
+  _C2CMSG._serialized_start=2793
+  _C2CMSG._serialized_end=2880
+  _DISMSG._serialized_start=2882
+  _DISMSG._serialized_end=2924
+  _GRPMSG._serialized_start=2926
+  _GRPMSG._serialized_end=2986
+  _PBDELROAMMSGRESP._serialized_start=2988
+  _PBDELROAMMSGRESP._serialized_end=3038
+  _PBDELETEMSGREQ._serialized_start=3041
+  _PBDELETEMSGREQ._serialized_end=3211
+  _PBDELETEMSGREQ_MSGITEM._serialized_start=3115
+  _PBDELETEMSGREQ_MSGITEM._serialized_end=3211
+  _PBDELETEMSGRESP._serialized_start=3213
+  _PBDELETEMSGRESP._serialized_end=3262
+  _PBDISCUSSREADEDREPORTREQ._serialized_start=3264
+  _PBDISCUSSREADEDREPORTREQ._serialized_end=3331
+  _PBDISCUSSREADEDREPORTRESP._serialized_start=3333
+  _PBDISCUSSREADEDREPORTRESP._serialized_end=3448
+  _PBGETDISCUSSMSGREQ._serialized_start=3451
+  _PBGETDISCUSSMSGREQ._serialized_end=3613
+  _PBGETDISCUSSMSGRESP._serialized_start=3616
+  _PBGETDISCUSSMSGRESP._serialized_end=3821
+  _PBGETGROUPMSGREQ._serialized_start=3824
+  _PBGETGROUPMSGREQ._serialized_end=4004
+  _PBGETGROUPMSGRESP._serialized_start=4007
+  _PBGETGROUPMSGRESP._serialized_end=4160
+  _PBGETMSGREQ._serialized_start=4163
+  _PBGETMSGREQ._serialized_end=4455
+  _PBGETMSGRESP._serialized_start=4458
+  _PBGETMSGRESP._serialized_end=4699
+  _PBGETONEDAYROAMMSGREQ._serialized_start=4701
+  _PBGETONEDAYROAMMSGREQ._serialized_end=4798
+  _PBGETONEDAYROAMMSGRESP._serialized_start=4801
+  _PBGETONEDAYROAMMSGRESP._serialized_end=4965
+  _PBGETROAMMSGREQ._serialized_start=4968
+  _PBGETROAMMSGREQ._serialized_end=5161
+  _PBGETROAMMSGRESP._serialized_start=5164
+  _PBGETROAMMSGRESP._serialized_end=5315
+  _PBGROUPMSGWITHDRAWREQ._serialized_start=5318
+  _PBGROUPMSGWITHDRAWREQ._serialized_end=5455
+  _MESSAGEINFO._serialized_start=5457
+  _MESSAGEINFO._serialized_end=5544
+  _PBGROUPMSGWITHDRAWRESP._serialized_start=5547
+  _PBGROUPMSGWITHDRAWRESP._serialized_end=5786
+  _MESSAGERESULT._serialized_start=5788
+  _MESSAGERESULT._serialized_end=5909
+  _PBGROUPREADEDREPORTREQ._serialized_start=5911
+  _PBGROUPREADEDREPORTREQ._serialized_end=5978
+  _PBGROUPREADEDREPORTRESP._serialized_start=5980
+  _PBGROUPREADEDREPORTRESP._serialized_end=6100
+  _PBINPUTNOTIFYINFO._serialized_start=6102
+  _PBINPUTNOTIFYINFO._serialized_end=6217
+  _PBMSGREADEDREPORTREQ._serialized_start=6220
+  _PBMSGREADEDREPORTREQ._serialized_end=6501
+  _PBMSGREADEDREPORTRESP._serialized_start=6504
+  _PBMSGREADEDREPORTRESP._serialized_end=6790
+  _PBMSGWITHDRAWREQ._serialized_start=6793
+  _PBMSGWITHDRAWREQ._serialized_end=6929
+  _PBMSGWITHDRAWRESP._serialized_start=6932
+  _PBMSGWITHDRAWRESP._serialized_end=7071
+  _PBPULLDISCUSSMSGSEQREQ._serialized_start=7073
+  _PBPULLDISCUSSMSGSEQREQ._serialized_end=7152
+  _DISCUSSINFOREQ._serialized_start=7154
+  _DISCUSSINFOREQ._serialized_end=7206
+  _PBPULLDISCUSSMSGSEQRESP._serialized_start=7208
+  _PBPULLDISCUSSMSGSEQRESP._serialized_end=7322
+  _DISCUSSINFORESP._serialized_start=7324
+  _DISCUSSINFORESP._serialized_end=7397
+  _PBPULLGROUPMSGSEQREQ._serialized_start=7399
+  _PBPULLGROUPMSGSEQREQ._serialized_end=7472
+  _GROUPINFOREQ._serialized_start=7474
+  _GROUPINFOREQ._serialized_end=7526
+  _PBPULLGROUPMSGSEQRESP._serialized_start=7528
+  _PBPULLGROUPMSGSEQRESP._serialized_end=7636
+  _GROUPINFORESP._serialized_start=7638
+  _GROUPINFORESP._serialized_end=7712
+  _PBSEARCHROAMMSGINCLOUDREQ._serialized_start=7714
+  _PBSEARCHROAMMSGINCLOUDREQ._serialized_end=7768
+  _PBSEARCHROAMMSGINCLOUDRESP._serialized_start=7770
+  _PBSEARCHROAMMSGINCLOUDRESP._serialized_end=7857
+  _PBSENDMSGREQ._serialized_start=7860
+  _PBSENDMSGREQ._serialized_end=8365
+  _PBSENDMSGRESP._serialized_start=8368
+  _PBSENDMSGRESP._serialized_end=8678
+  _PBTHIRDQQUNREADMSGNUMREQ._serialized_start=8680
+  _PBTHIRDQQUNREADMSGNUMREQ._serialized_end=8777
+  _THIRDQQREQINFO._serialized_start=8779
+  _THIRDQQREQINFO._serialized_end=8863
+  _PBTHIRDQQUNREADMSGNUMRESP._serialized_start=8866
+  _PBTHIRDQQUNREADMSGNUMRESP._serialized_end=9000
+  _THIRDQQRESPINFO._serialized_start=9003
+  _THIRDQQRESPINFO._serialized_end=9152
+  _PBUNREADMSGSEQREQ._serialized_start=9155
+  _PBUNREADMSGSEQREQ._serialized_end=9498
+  _PBUNREADMSGSEQRESP._serialized_start=9501
+  _PBUNREADMSGSEQRESP._serialized_end=9850
+  _PUBGROUPTMP._serialized_start=9852
+  _PUBGROUPTMP._serialized_end=9913
+  _PUBLICPLAT._serialized_start=9915
+  _PUBLICPLAT._serialized_end=9956
+  _QQQUERYBUSINESSTMP._serialized_start=9958
+  _QQQUERYBUSINESSTMP._serialized_end=10007
+  _RICHSTATUSTMP._serialized_start=10009
+  _RICHSTATUSTMP._serialized_end=10053
+  _ROUTINGHEAD._serialized_start=10056
+  _ROUTINGHEAD._serialized_end=11008
+  _TRANS0X211._serialized_start=11011
+  _TRANS0X211._serialized_end=11177
+  _TRANSCMD._serialized_start=11179
+  _TRANSCMD._serialized_end=11219
+  _TRANSMSG._serialized_start=11221
+  _TRANSMSG._serialized_end=11264
+  _TRANSREQ._serialized_start=11266
+  _TRANSREQ._serialized_end=11328
+  _TRANSRESP._serialized_start=11330
+  _TRANSRESP._serialized_end=11410
+  _TRANSSVRINFO._serialized_start=11412
+  _TRANSSVRINFO._serialized_end=11499
+  _WPATMP._serialized_start=11501
+  _WPATMP._serialized_end=11538
+  _WITHDRAWWORDINGINFO._serialized_start=11540
+  _WITHDRAWWORDINGINFO._serialized_end=11597
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/msf/msg/svc/svc_pb2.pyi b/cai/pb/msf/msg/svc/svc_pb2.pyi
index 601adfbe..a2685239 100644
--- a/cai/pb/msf/msg/svc/svc_pb2.pyi
+++ b/cai/pb/msf/msg/svc/svc_pb2.pyi
@@ -56,202 +56,190 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class AccostTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
     REPLY_FIELD_NUMBER: int
-    to_uin: int = ...
-    sig: bytes = ...
-    reply: bool = ...
-
+    to_uin: int
+    sig: bytes
+    reply: bool
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
-        reply : Optional[bool] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
+        reply: Optional[bool] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"reply",b"reply",u"sig",b"sig",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"reply",b"reply",u"sig",b"sig",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["reply",b"reply","sig",b"sig","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["reply",b"reply","sig",b"sig","to_uin",b"to_uin"]) -> None: ...
 
 class AddressListTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FROM_PHONE_FIELD_NUMBER: int
     TO_PHONE_FIELD_NUMBER: int
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
     FROM_CONTACT_SIZE_FIELD_NUMBER: int
-    from_phone: Text = ...
-    to_phone: Text = ...
-    to_uin: int = ...
-    sig: bytes = ...
-    from_contact_size: int = ...
-
+    from_phone: Text
+    to_phone: Text
+    to_uin: int
+    sig: bytes
+    from_contact_size: int
     def __init__(self,
         *,
-        from_phone : Optional[Text] = ...,
-        to_phone : Optional[Text] = ...,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
-        from_contact_size : Optional[int] = ...,
+        from_phone: Optional[Text] = ...,
+        to_phone: Optional[Text] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
+        from_contact_size: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"from_contact_size",b"from_contact_size",u"from_phone",b"from_phone",u"sig",b"sig",u"to_phone",b"to_phone",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"from_contact_size",b"from_contact_size",u"from_phone",b"from_phone",u"sig",b"sig",u"to_phone",b"to_phone",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["from_contact_size",b"from_contact_size","from_phone",b"from_phone","sig",b"sig","to_phone",b"to_phone","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["from_contact_size",b"from_contact_size","from_phone",b"from_phone","sig",b"sig","to_phone",b"to_phone","to_uin",b"to_uin"]) -> None: ...
 
 class AuthTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
-    to_uin: int = ...
-    sig: bytes = ...
-
+    to_uin: int
+    sig: bytes
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> None: ...
 
 class BsnsTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
-    to_uin: int = ...
-    sig: bytes = ...
-
+    to_uin: int
+    sig: bytes
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> None: ...
 
 class BusinessWPATmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
     SIGT_FIELD_NUMBER: int
-    to_uin: int = ...
-    sig: bytes = ...
-    sigt: bytes = ...
-
+    to_uin: int
+    sig: bytes
+    sigt: bytes
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
-        sigt : Optional[bytes] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
+        sigt: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"sig",b"sig",u"sigt",b"sigt",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"sig",b"sig",u"sigt",b"sigt",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["sig",b"sig","sigt",b"sigt","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["sig",b"sig","sigt",b"sigt","to_uin",b"to_uin"]) -> None: ...
 
 class C2C(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
-    to_uin: int = ...
-
+    to_uin: int
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
+        to_uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["to_uin",b"to_uin"]) -> None: ...
 
 class CommTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     C2C_TYPE_FIELD_NUMBER: int
     SVR_TYPE_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
     RESERVED_FIELD_NUMBER: int
-    to_uin: int = ...
-    c2c_type: int = ...
-    svr_type: int = ...
-    sig: bytes = ...
-    reserved: bytes = ...
-
+    to_uin: int
+    c2c_type: int
+    svr_type: int
+    sig: bytes
+    reserved: bytes
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        c2c_type : Optional[int] = ...,
-        svr_type : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
-        reserved : Optional[bytes] = ...,
+        to_uin: Optional[int] = ...,
+        c2c_type: Optional[int] = ...,
+        svr_type: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
+        reserved: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2c_type",b"c2c_type",u"reserved",b"reserved",u"sig",b"sig",u"svr_type",b"svr_type",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2c_type",b"c2c_type",u"reserved",b"reserved",u"sig",b"sig",u"svr_type",b"svr_type",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["c2c_type",b"c2c_type","reserved",b"reserved","sig",b"sig","svr_type",b"svr_type","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2c_type",b"c2c_type","reserved",b"reserved","sig",b"sig","svr_type",b"svr_type","to_uin",b"to_uin"]) -> None: ...
 
 class Dis(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     DIS_UIN_FIELD_NUMBER: int
-    dis_uin: int = ...
-
+    dis_uin: int
     def __init__(self,
         *,
-        dis_uin : Optional[int] = ...,
+        dis_uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"dis_uin",b"dis_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"dis_uin",b"dis_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["dis_uin",b"dis_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["dis_uin",b"dis_uin"]) -> None: ...
 
 class DisTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     DIS_UIN_FIELD_NUMBER: int
     TO_UIN_FIELD_NUMBER: int
-    dis_uin: int = ...
-    to_uin: int = ...
-
+    dis_uin: int
+    to_uin: int
     def __init__(self,
         *,
-        dis_uin : Optional[int] = ...,
-        to_uin : Optional[int] = ...,
+        dis_uin: Optional[int] = ...,
+        to_uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"dis_uin",b"dis_uin",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"dis_uin",b"dis_uin",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["dis_uin",b"dis_uin","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["dis_uin",b"dis_uin","to_uin",b"to_uin"]) -> None: ...
 
 class Grp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GROUP_CODE_FIELD_NUMBER: int
-    group_code: int = ...
-
+    group_code: int
     def __init__(self,
         *,
-        group_code : Optional[int] = ...,
+        group_code: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"group_code",b"group_code"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"group_code",b"group_code"]) -> None: ...
+    def HasField(self, field_name: Literal["group_code",b"group_code"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_code",b"group_code"]) -> None: ...
 
 class GrpTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GROUP_UIN_FIELD_NUMBER: int
     TO_UIN_FIELD_NUMBER: int
-    group_uin: int = ...
-    to_uin: int = ...
-
+    group_uin: int
+    to_uin: int
     def __init__(self,
         *,
-        group_uin : Optional[int] = ...,
-        to_uin : Optional[int] = ...,
+        group_uin: Optional[int] = ...,
+        to_uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"group_uin",b"group_uin",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"group_uin",b"group_uin",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["group_uin",b"group_uin","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_uin",b"group_uin","to_uin",b"to_uin"]) -> None: ...
 
 class MsgSendInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RECEIVER_FIELD_NUMBER: int
-    receiver: int = ...
-
+    receiver: int
     def __init__(self,
         *,
-        receiver : Optional[int] = ...,
+        receiver: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"receiver",b"receiver"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"receiver",b"receiver"]) -> None: ...
+    def HasField(self, field_name: Literal["receiver",b"receiver"]) -> bool: ...
+    def ClearField(self, field_name: Literal["receiver",b"receiver"]) -> None: ...
 
 class MultiMsgAssist(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     REPEATED_ROUTING_FIELD_NUMBER: int
     USE_FIELD_NUMBER: int
     TEMP_ID_FIELD_NUMBER: int
@@ -260,164 +248,155 @@ class MultiMsgAssist(Message):
     REDBAG_AMOUNT_FIELD_NUMBER: int
     HAS_READBAG_FIELD_NUMBER: int
     HAS_VEDIO_FIELD_NUMBER: int
-    use: int = ...
-    temp_id: int = ...
-    vedio_len: int = ...
-    redbag_id: bytes = ...
-    redbag_amount: int = ...
-    has_readbag: int = ...
-    has_vedio: int = ...
-
     @property
     def repeated_routing(self) -> RepeatedCompositeFieldContainer[RoutingHead]: ...
-
-    def __init__(self,
-        *,
-        repeated_routing : Optional[Iterable[RoutingHead]] = ...,
-        use : Optional[int] = ...,
-        temp_id : Optional[int] = ...,
-        vedio_len : Optional[int] = ...,
-        redbag_id : Optional[bytes] = ...,
-        redbag_amount : Optional[int] = ...,
-        has_readbag : Optional[int] = ...,
-        has_vedio : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"has_readbag",b"has_readbag",u"has_vedio",b"has_vedio",u"redbag_amount",b"redbag_amount",u"redbag_id",b"redbag_id",u"temp_id",b"temp_id",u"use",b"use",u"vedio_len",b"vedio_len"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"has_readbag",b"has_readbag",u"has_vedio",b"has_vedio",u"redbag_amount",b"redbag_amount",u"redbag_id",b"redbag_id",u"repeated_routing",b"repeated_routing",u"temp_id",b"temp_id",u"use",b"use",u"vedio_len",b"vedio_len"]) -> None: ...
+    use: int
+    temp_id: int
+    vedio_len: int
+    redbag_id: bytes
+    redbag_amount: int
+    has_readbag: int
+    has_vedio: int
+    def __init__(self,
+        *,
+        repeated_routing: Optional[Iterable[RoutingHead]] = ...,
+        use: Optional[int] = ...,
+        temp_id: Optional[int] = ...,
+        vedio_len: Optional[int] = ...,
+        redbag_id: Optional[bytes] = ...,
+        redbag_amount: Optional[int] = ...,
+        has_readbag: Optional[int] = ...,
+        has_vedio: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["has_readbag",b"has_readbag","has_vedio",b"has_vedio","redbag_amount",b"redbag_amount","redbag_id",b"redbag_id","temp_id",b"temp_id","use",b"use","vedio_len",b"vedio_len"]) -> bool: ...
+    def ClearField(self, field_name: Literal["has_readbag",b"has_readbag","has_vedio",b"has_vedio","redbag_amount",b"redbag_amount","redbag_id",b"redbag_id","repeated_routing",b"repeated_routing","temp_id",b"temp_id","use",b"use","vedio_len",b"vedio_len"]) -> None: ...
 
 class NearByAssistantTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
     REPLY_FIELD_NUMBER: int
-    to_uin: int = ...
-    sig: bytes = ...
-    reply: bool = ...
-
+    to_uin: int
+    sig: bytes
+    reply: bool
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
-        reply : Optional[bool] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
+        reply: Optional[bool] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"reply",b"reply",u"sig",b"sig",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"reply",b"reply",u"sig",b"sig",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["reply",b"reply","sig",b"sig","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["reply",b"reply","sig",b"sig","to_uin",b"to_uin"]) -> None: ...
 
 class NearByDatingTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
     REPLY_FIELD_NUMBER: int
-    to_uin: int = ...
-    sig: bytes = ...
-    reply: bool = ...
-
+    to_uin: int
+    sig: bytes
+    reply: bool
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
-        reply : Optional[bool] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
+        reply: Optional[bool] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"reply",b"reply",u"sig",b"sig",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"reply",b"reply",u"sig",b"sig",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["reply",b"reply","sig",b"sig","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["reply",b"reply","sig",b"sig","to_uin",b"to_uin"]) -> None: ...
 
 class PbBindUinGetMsgReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BIND_UIN_FIELD_NUMBER: int
     BIND_UIN_SIG_FIELD_NUMBER: int
     SYNC_FLAG_FIELD_NUMBER: int
     SYNC_COOKIE_FIELD_NUMBER: int
-    bind_uin: int = ...
-    bind_uin_sig: bytes = ...
-    sync_flag: int = ...
-    sync_cookie: bytes = ...
-
+    bind_uin: int
+    bind_uin_sig: bytes
+    sync_flag: int
+    sync_cookie: bytes
     def __init__(self,
         *,
-        bind_uin : Optional[int] = ...,
-        bind_uin_sig : Optional[bytes] = ...,
-        sync_flag : Optional[int] = ...,
-        sync_cookie : Optional[bytes] = ...,
+        bind_uin: Optional[int] = ...,
+        bind_uin_sig: Optional[bytes] = ...,
+        sync_flag: Optional[int] = ...,
+        sync_cookie: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"bind_uin_sig",b"bind_uin_sig",u"sync_cookie",b"sync_cookie",u"sync_flag",b"sync_flag"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"bind_uin_sig",b"bind_uin_sig",u"sync_cookie",b"sync_cookie",u"sync_flag",b"sync_flag"]) -> None: ...
+    def HasField(self, field_name: Literal["bind_uin",b"bind_uin","bind_uin_sig",b"bind_uin_sig","sync_cookie",b"sync_cookie","sync_flag",b"sync_flag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bind_uin",b"bind_uin","bind_uin_sig",b"bind_uin_sig","sync_cookie",b"sync_cookie","sync_flag",b"sync_flag"]) -> None: ...
 
 class PbBindUinMsgReadedConfirmReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SYNC_COOKIE_FIELD_NUMBER: int
     BIND_UIN_FIELD_NUMBER: int
-    sync_cookie: bytes = ...
-    bind_uin: int = ...
-
+    sync_cookie: bytes
+    bind_uin: int
     def __init__(self,
         *,
-        sync_cookie : Optional[bytes] = ...,
-        bind_uin : Optional[int] = ...,
+        sync_cookie: Optional[bytes] = ...,
+        bind_uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"sync_cookie",b"sync_cookie"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"sync_cookie",b"sync_cookie"]) -> None: ...
+    def HasField(self, field_name: Literal["bind_uin",b"bind_uin","sync_cookie",b"sync_cookie"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bind_uin",b"bind_uin","sync_cookie",b"sync_cookie"]) -> None: ...
 
 class PbBindUinMsgReadedConfirmResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     SYNC_COOKIE_FIELD_NUMBER: int
     BIND_UIN_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    sync_cookie: bytes = ...
-    bind_uin: int = ...
-
+    result: int
+    errmsg: Text
+    sync_cookie: bytes
+    bind_uin: int
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        sync_cookie : Optional[bytes] = ...,
-        bind_uin : Optional[int] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        sync_cookie: Optional[bytes] = ...,
+        bind_uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"errmsg",b"errmsg",u"result",b"result",u"sync_cookie",b"sync_cookie"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"errmsg",b"errmsg",u"result",b"result",u"sync_cookie",b"sync_cookie"]) -> None: ...
+    def HasField(self, field_name: Literal["bind_uin",b"bind_uin","errmsg",b"errmsg","result",b"result","sync_cookie",b"sync_cookie"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bind_uin",b"bind_uin","errmsg",b"errmsg","result",b"result","sync_cookie",b"sync_cookie"]) -> None: ...
 
 class PbBindUinUnReadMsgNumReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     BIND_UIN_FIELD_NUMBER: int
     SYNC_COOKIE_FIELD_NUMBER: int
-    bind_uin: int = ...
-    sync_cookie: bytes = ...
-
+    bind_uin: int
+    sync_cookie: bytes
     def __init__(self,
         *,
-        bind_uin : Optional[int] = ...,
-        sync_cookie : Optional[bytes] = ...,
+        bind_uin: Optional[int] = ...,
+        sync_cookie: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"sync_cookie",b"sync_cookie"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"sync_cookie",b"sync_cookie"]) -> None: ...
+    def HasField(self, field_name: Literal["bind_uin",b"bind_uin","sync_cookie",b"sync_cookie"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bind_uin",b"bind_uin","sync_cookie",b"sync_cookie"]) -> None: ...
 
 class PbBindUinUnReadMsgNumResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     BIND_UIN_FIELD_NUMBER: int
     NUM_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    bind_uin: int = ...
-    num: int = ...
-
+    result: int
+    errmsg: Text
+    bind_uin: int
+    num: int
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        bind_uin : Optional[int] = ...,
-        num : Optional[int] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        bind_uin: Optional[int] = ...,
+        num: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"errmsg",b"errmsg",u"num",b"num",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"errmsg",b"errmsg",u"num",b"num",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["bind_uin",b"bind_uin","errmsg",b"errmsg","num",b"num","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bind_uin",b"bind_uin","errmsg",b"errmsg","num",b"num","result",b"result"]) -> None: ...
 
 class PbC2CMsgWithDrawReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     class MsgInfo(Message):
-        DESCRIPTOR: Descriptor = ...
+        DESCRIPTOR: Descriptor
         FROM_UIN_FIELD_NUMBER: int
         TO_UIN_FIELD_NUMBER: int
         MSG_SEQ_FIELD_NUMBER: int
@@ -429,122 +408,111 @@ class PbC2CMsgWithDrawReq(Message):
         DIV_SEQ_FIELD_NUMBER: int
         MSG_TYPE_FIELD_NUMBER: int
         ROUTING_HEAD_FIELD_NUMBER: int
-        from_uin: int = ...
-        to_uin: int = ...
-        msg_seq: int = ...
-        msg_uid: int = ...
-        msg_time: int = ...
-        msg_random: int = ...
-        pkg_num: int = ...
-        pkg_index: int = ...
-        div_seq: int = ...
-        msg_type: int = ...
-
+        from_uin: int
+        to_uin: int
+        msg_seq: int
+        msg_uid: int
+        msg_time: int
+        msg_random: int
+        pkg_num: int
+        pkg_index: int
+        div_seq: int
+        msg_type: int
         @property
         def routing_head(self) -> RoutingHead: ...
-
         def __init__(self,
             *,
-            from_uin : Optional[int] = ...,
-            to_uin : Optional[int] = ...,
-            msg_seq : Optional[int] = ...,
-            msg_uid : Optional[int] = ...,
-            msg_time : Optional[int] = ...,
-            msg_random : Optional[int] = ...,
-            pkg_num : Optional[int] = ...,
-            pkg_index : Optional[int] = ...,
-            div_seq : Optional[int] = ...,
-            msg_type : Optional[int] = ...,
-            routing_head : Optional[RoutingHead] = ...,
+            from_uin: Optional[int] = ...,
+            to_uin: Optional[int] = ...,
+            msg_seq: Optional[int] = ...,
+            msg_uid: Optional[int] = ...,
+            msg_time: Optional[int] = ...,
+            msg_random: Optional[int] = ...,
+            pkg_num: Optional[int] = ...,
+            pkg_index: Optional[int] = ...,
+            div_seq: Optional[int] = ...,
+            msg_type: Optional[int] = ...,
+            routing_head: Optional[RoutingHead] = ...,
             ) -> None: ...
-        def HasField(self, field_name: Literal[u"div_seq",b"div_seq",u"from_uin",b"from_uin",u"msg_random",b"msg_random",u"msg_seq",b"msg_seq",u"msg_time",b"msg_time",u"msg_type",b"msg_type",u"msg_uid",b"msg_uid",u"pkg_index",b"pkg_index",u"pkg_num",b"pkg_num",u"routing_head",b"routing_head",u"to_uin",b"to_uin"]) -> bool: ...
-        def ClearField(self, field_name: Literal[u"div_seq",b"div_seq",u"from_uin",b"from_uin",u"msg_random",b"msg_random",u"msg_seq",b"msg_seq",u"msg_time",b"msg_time",u"msg_type",b"msg_type",u"msg_uid",b"msg_uid",u"pkg_index",b"pkg_index",u"pkg_num",b"pkg_num",u"routing_head",b"routing_head",u"to_uin",b"to_uin"]) -> None: ...
+        def HasField(self, field_name: Literal["div_seq",b"div_seq","from_uin",b"from_uin","msg_random",b"msg_random","msg_seq",b"msg_seq","msg_time",b"msg_time","msg_type",b"msg_type","msg_uid",b"msg_uid","pkg_index",b"pkg_index","pkg_num",b"pkg_num","routing_head",b"routing_head","to_uin",b"to_uin"]) -> bool: ...
+        def ClearField(self, field_name: Literal["div_seq",b"div_seq","from_uin",b"from_uin","msg_random",b"msg_random","msg_seq",b"msg_seq","msg_time",b"msg_time","msg_type",b"msg_type","msg_uid",b"msg_uid","pkg_index",b"pkg_index","pkg_num",b"pkg_num","routing_head",b"routing_head","to_uin",b"to_uin"]) -> None: ...
 
     INFO_FIELD_NUMBER: int
     LONG_MESSAGE_FLAG_FIELD_NUMBER: int
     RESERVED_FIELD_NUMBER: int
     SUB_CMD_FIELD_NUMBER: int
-    long_message_flag: int = ...
-    reserved: bytes = ...
-    sub_cmd: int = ...
-
     @property
     def info(self) -> RepeatedCompositeFieldContainer[PbC2CMsgWithDrawReq.MsgInfo]: ...
-
+    long_message_flag: int
+    reserved: bytes
+    sub_cmd: int
     def __init__(self,
         *,
-        info : Optional[Iterable[PbC2CMsgWithDrawReq.MsgInfo]] = ...,
-        long_message_flag : Optional[int] = ...,
-        reserved : Optional[bytes] = ...,
-        sub_cmd : Optional[int] = ...,
+        info: Optional[Iterable[PbC2CMsgWithDrawReq.MsgInfo]] = ...,
+        long_message_flag: Optional[int] = ...,
+        reserved: Optional[bytes] = ...,
+        sub_cmd: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"long_message_flag",b"long_message_flag",u"reserved",b"reserved",u"sub_cmd",b"sub_cmd"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"info",b"info",u"long_message_flag",b"long_message_flag",u"reserved",b"reserved",u"sub_cmd",b"sub_cmd"]) -> None: ...
+    def HasField(self, field_name: Literal["long_message_flag",b"long_message_flag","reserved",b"reserved","sub_cmd",b"sub_cmd"]) -> bool: ...
+    def ClearField(self, field_name: Literal["info",b"info","long_message_flag",b"long_message_flag","reserved",b"reserved","sub_cmd",b"sub_cmd"]) -> None: ...
 
 class PbC2CMsgWithDrawResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     STATUS_FIELD_NUMBER: int
     SUB_CMD_FIELD_NUMBER: int
     WORDING_INFO_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    sub_cmd: int = ...
-
+    result: int
+    errmsg: Text
     @property
     def status(self) -> RepeatedCompositeFieldContainer[MsgStatus]: ...
-
+    sub_cmd: int
     @property
     def wording_info(self) -> WithDrawWordingInfo: ...
-
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        status : Optional[Iterable[MsgStatus]] = ...,
-        sub_cmd : Optional[int] = ...,
-        wording_info : Optional[WithDrawWordingInfo] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        status: Optional[Iterable[MsgStatus]] = ...,
+        sub_cmd: Optional[int] = ...,
+        wording_info: Optional[WithDrawWordingInfo] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"result",b"result",u"sub_cmd",b"sub_cmd",u"wording_info",b"wording_info"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"result",b"result",u"status",b"status",u"sub_cmd",b"sub_cmd",u"wording_info",b"wording_info"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","result",b"result","sub_cmd",b"sub_cmd","wording_info",b"wording_info"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","result",b"result","status",b"status","sub_cmd",b"sub_cmd","wording_info",b"wording_info"]) -> None: ...
 
 class MsgStatus(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     INFO_FIELD_NUMBER: int
     STATUS_FIELD_NUMBER: int
-    status: int = ...
-
     @property
     def info(self) -> PbC2CMsgWithDrawReq.MsgInfo: ...
-
+    status: int
     def __init__(self,
         *,
-        info : Optional[PbC2CMsgWithDrawReq.MsgInfo] = ...,
-        status : Optional[int] = ...,
+        info: Optional[PbC2CMsgWithDrawReq.MsgInfo] = ...,
+        status: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"info",b"info",u"status",b"status"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"info",b"info",u"status",b"status"]) -> None: ...
+    def HasField(self, field_name: Literal["info",b"info","status",b"status"]) -> bool: ...
+    def ClearField(self, field_name: Literal["info",b"info","status",b"status"]) -> None: ...
 
 class PbC2CReadedReportReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SYNC_COOKIE_FIELD_NUMBER: int
     PAIR_INFO_FIELD_NUMBER: int
-    sync_cookie: bytes = ...
-
+    sync_cookie: bytes
     @property
     def pair_info(self) -> RepeatedCompositeFieldContainer[UinPairReadInfo]: ...
-
     def __init__(self,
         *,
-        sync_cookie : Optional[bytes] = ...,
-        pair_info : Optional[Iterable[UinPairReadInfo]] = ...,
+        sync_cookie: Optional[bytes] = ...,
+        pair_info: Optional[Iterable[UinPairReadInfo]] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"sync_cookie",b"sync_cookie"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"pair_info",b"pair_info",u"sync_cookie",b"sync_cookie"]) -> None: ...
+    def HasField(self, field_name: Literal["sync_cookie",b"sync_cookie"]) -> bool: ...
+    def ClearField(self, field_name: Literal["pair_info",b"pair_info","sync_cookie",b"sync_cookie"]) -> None: ...
 
 class UinPairReadInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     PEER_UIN_FIELD_NUMBER: int
     LAST_READ_TIME_FIELD_NUMBER: int
     CRM_SIG_FIELD_NUMBER: int
@@ -553,263 +521,245 @@ class UinPairReadInfo(Message):
     CPID_FIELD_NUMBER: int
     AIO_TYPE_FIELD_NUMBER: int
     TO_TINY_ID_FIELD_NUMBER: int
-    peer_uin: int = ...
-    last_read_time: int = ...
-    crm_sig: bytes = ...
-    peer_type: int = ...
-    chat_type: int = ...
-    cpid: int = ...
-    aio_type: int = ...
-    to_tiny_id: int = ...
-
-    def __init__(self,
-        *,
-        peer_uin : Optional[int] = ...,
-        last_read_time : Optional[int] = ...,
-        crm_sig : Optional[bytes] = ...,
-        peer_type : Optional[int] = ...,
-        chat_type : Optional[int] = ...,
-        cpid : Optional[int] = ...,
-        aio_type : Optional[int] = ...,
-        to_tiny_id : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"aio_type",b"aio_type",u"chat_type",b"chat_type",u"cpid",b"cpid",u"crm_sig",b"crm_sig",u"last_read_time",b"last_read_time",u"peer_type",b"peer_type",u"peer_uin",b"peer_uin",u"to_tiny_id",b"to_tiny_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"aio_type",b"aio_type",u"chat_type",b"chat_type",u"cpid",b"cpid",u"crm_sig",b"crm_sig",u"last_read_time",b"last_read_time",u"peer_type",b"peer_type",u"peer_uin",b"peer_uin",u"to_tiny_id",b"to_tiny_id"]) -> None: ...
+    peer_uin: int
+    last_read_time: int
+    crm_sig: bytes
+    peer_type: int
+    chat_type: int
+    cpid: int
+    aio_type: int
+    to_tiny_id: int
+    def __init__(self,
+        *,
+        peer_uin: Optional[int] = ...,
+        last_read_time: Optional[int] = ...,
+        crm_sig: Optional[bytes] = ...,
+        peer_type: Optional[int] = ...,
+        chat_type: Optional[int] = ...,
+        cpid: Optional[int] = ...,
+        aio_type: Optional[int] = ...,
+        to_tiny_id: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["aio_type",b"aio_type","chat_type",b"chat_type","cpid",b"cpid","crm_sig",b"crm_sig","last_read_time",b"last_read_time","peer_type",b"peer_type","peer_uin",b"peer_uin","to_tiny_id",b"to_tiny_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["aio_type",b"aio_type","chat_type",b"chat_type","cpid",b"cpid","crm_sig",b"crm_sig","last_read_time",b"last_read_time","peer_type",b"peer_type","peer_uin",b"peer_uin","to_tiny_id",b"to_tiny_id"]) -> None: ...
 
 class PbC2CReadedReportResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     SYNC_COOKIE_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    sync_cookie: bytes = ...
-
+    result: int
+    errmsg: Text
+    sync_cookie: bytes
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        sync_cookie : Optional[bytes] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        sync_cookie: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"result",b"result",u"sync_cookie",b"sync_cookie"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"result",b"result",u"sync_cookie",b"sync_cookie"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","result",b"result","sync_cookie",b"sync_cookie"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","result",b"result","sync_cookie",b"sync_cookie"]) -> None: ...
 
 class PbC2CUnReadMsgNumReq(Message):
-    DESCRIPTOR: Descriptor = ...
-
+    DESCRIPTOR: Descriptor
     def __init__(self,
         ) -> None: ...
 
 class PbC2CUnReadMsgNumResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     NUM_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    num: int = ...
-
+    result: int
+    errmsg: Text
+    num: int
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        num : Optional[int] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        num: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"num",b"num",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"num",b"num",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","num",b"num","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","num",b"num","result",b"result"]) -> None: ...
 
 class PbDelRoamMsgReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     C2C_MSG_FIELD_NUMBER: int
     GRP_MSG_FIELD_NUMBER: int
     DIS_MSG_FIELD_NUMBER: int
-
     @property
     def c2c_msg(self) -> C2CMsg: ...
-
     @property
     def grp_msg(self) -> GrpMsg: ...
-
     @property
     def dis_msg(self) -> DisMsg: ...
-
     def __init__(self,
         *,
-        c2c_msg : Optional[C2CMsg] = ...,
-        grp_msg : Optional[GrpMsg] = ...,
-        dis_msg : Optional[DisMsg] = ...,
+        c2c_msg: Optional[C2CMsg] = ...,
+        grp_msg: Optional[GrpMsg] = ...,
+        dis_msg: Optional[DisMsg] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2c_msg",b"c2c_msg",u"dis_msg",b"dis_msg",u"grp_msg",b"grp_msg"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2c_msg",b"c2c_msg",u"dis_msg",b"dis_msg",u"grp_msg",b"grp_msg"]) -> None: ...
+    def HasField(self, field_name: Literal["c2c_msg",b"c2c_msg","dis_msg",b"dis_msg","grp_msg",b"grp_msg"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2c_msg",b"c2c_msg","dis_msg",b"dis_msg","grp_msg",b"grp_msg"]) -> None: ...
 
 class C2CMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     FROM_UIN_FIELD_NUMBER: int
     PEER_UIN_FIELD_NUMBER: int
     TIME_FIELD_NUMBER: int
     RANDOM_FIELD_NUMBER: int
     SEQ_FIELD_NUMBER: int
-    from_uin: int = ...
-    peer_uin: int = ...
-    time: int = ...
-    random: int = ...
-    seq: int = ...
-
+    from_uin: int
+    peer_uin: int
+    time: int
+    random: int
+    seq: int
     def __init__(self,
         *,
-        from_uin : Optional[int] = ...,
-        peer_uin : Optional[int] = ...,
-        time : Optional[int] = ...,
-        random : Optional[int] = ...,
-        seq : Optional[int] = ...,
+        from_uin: Optional[int] = ...,
+        peer_uin: Optional[int] = ...,
+        time: Optional[int] = ...,
+        random: Optional[int] = ...,
+        seq: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"from_uin",b"from_uin",u"peer_uin",b"peer_uin",u"random",b"random",u"seq",b"seq",u"time",b"time"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"from_uin",b"from_uin",u"peer_uin",b"peer_uin",u"random",b"random",u"seq",b"seq",u"time",b"time"]) -> None: ...
+    def HasField(self, field_name: Literal["from_uin",b"from_uin","peer_uin",b"peer_uin","random",b"random","seq",b"seq","time",b"time"]) -> bool: ...
+    def ClearField(self, field_name: Literal["from_uin",b"from_uin","peer_uin",b"peer_uin","random",b"random","seq",b"seq","time",b"time"]) -> None: ...
 
 class DisMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     DISCUSS_UIN_FIELD_NUMBER: int
     SEQ_FIELD_NUMBER: int
-    discuss_uin: int = ...
-    seq: int = ...
-
+    discuss_uin: int
+    seq: int
     def __init__(self,
         *,
-        discuss_uin : Optional[int] = ...,
-        seq : Optional[int] = ...,
+        discuss_uin: Optional[int] = ...,
+        seq: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"discuss_uin",b"discuss_uin",u"seq",b"seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"discuss_uin",b"discuss_uin",u"seq",b"seq"]) -> None: ...
+    def HasField(self, field_name: Literal["discuss_uin",b"discuss_uin","seq",b"seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["discuss_uin",b"discuss_uin","seq",b"seq"]) -> None: ...
 
 class GrpMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GROUP_CODE_FIELD_NUMBER: int
     SEQ_FIELD_NUMBER: int
     RESV_FLAG_FIELD_NUMBER: int
-    group_code: int = ...
-    seq: int = ...
-    resv_flag: int = ...
-
+    group_code: int
+    seq: int
+    resv_flag: int
     def __init__(self,
         *,
-        group_code : Optional[int] = ...,
-        seq : Optional[int] = ...,
-        resv_flag : Optional[int] = ...,
+        group_code: Optional[int] = ...,
+        seq: Optional[int] = ...,
+        resv_flag: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"group_code",b"group_code",u"resv_flag",b"resv_flag",u"seq",b"seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"group_code",b"group_code",u"resv_flag",b"resv_flag",u"seq",b"seq"]) -> None: ...
+    def HasField(self, field_name: Literal["group_code",b"group_code","resv_flag",b"resv_flag","seq",b"seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_code",b"group_code","resv_flag",b"resv_flag","seq",b"seq"]) -> None: ...
 
 class PbDelRoamMsgResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-
+    result: int
+    errmsg: Text
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","result",b"result"]) -> None: ...
 
 class PbDeleteMsgReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     class MsgItem(Message):
-        DESCRIPTOR: Descriptor = ...
+        DESCRIPTOR: Descriptor
         FROM_UIN_FIELD_NUMBER: int
         TO_UIN_FIELD_NUMBER: int
         TYPE_FIELD_NUMBER: int
         SEQ_FIELD_NUMBER: int
         UID_FIELD_NUMBER: int
         SIG_FIELD_NUMBER: int
-        from_uin: int = ...
-        to_uin: int = ...
-        type: int = ...
-        seq: int = ...
-        uid: int = ...
-        sig: bytes = ...
-
+        from_uin: int
+        to_uin: int
+        type: int
+        seq: int
+        uid: int
+        sig: bytes
         def __init__(self,
             *,
-            from_uin : Optional[int] = ...,
-            to_uin : Optional[int] = ...,
-            type : Optional[int] = ...,
-            seq : Optional[int] = ...,
-            uid : Optional[int] = ...,
-            sig : Optional[bytes] = ...,
+            from_uin: Optional[int] = ...,
+            to_uin: Optional[int] = ...,
+            type: Optional[int] = ...,
+            seq: Optional[int] = ...,
+            uid: Optional[int] = ...,
+            sig: Optional[bytes] = ...,
             ) -> None: ...
-        def HasField(self, field_name: Literal[u"from_uin",b"from_uin",u"seq",b"seq",u"sig",b"sig",u"to_uin",b"to_uin",u"type",b"type",u"uid",b"uid"]) -> bool: ...
-        def ClearField(self, field_name: Literal[u"from_uin",b"from_uin",u"seq",b"seq",u"sig",b"sig",u"to_uin",b"to_uin",u"type",b"type",u"uid",b"uid"]) -> None: ...
+        def HasField(self, field_name: Literal["from_uin",b"from_uin","seq",b"seq","sig",b"sig","to_uin",b"to_uin","type",b"type","uid",b"uid"]) -> bool: ...
+        def ClearField(self, field_name: Literal["from_uin",b"from_uin","seq",b"seq","sig",b"sig","to_uin",b"to_uin","type",b"type","uid",b"uid"]) -> None: ...
 
     MSG_ITEMS_FIELD_NUMBER: int
-
     @property
     def msg_items(self) -> RepeatedCompositeFieldContainer[PbDeleteMsgReq.MsgItem]: ...
-
     def __init__(self,
         *,
-        msg_items : Optional[Iterable[PbDeleteMsgReq.MsgItem]] = ...,
+        msg_items: Optional[Iterable[PbDeleteMsgReq.MsgItem]] = ...,
         ) -> None: ...
-    def ClearField(self, field_name: Literal[u"msg_items",b"msg_items"]) -> None: ...
+    def ClearField(self, field_name: Literal["msg_items",b"msg_items"]) -> None: ...
 
 class PbDeleteMsgResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-
+    result: int
+    errmsg: Text
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","result",b"result"]) -> None: ...
 
 class PbDiscussReadedReportReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CONF_UIN_FIELD_NUMBER: int
     LAST_READ_SEQ_FIELD_NUMBER: int
-    conf_uin: int = ...
-    last_read_seq: int = ...
-
+    conf_uin: int
+    last_read_seq: int
     def __init__(self,
         *,
-        conf_uin : Optional[int] = ...,
-        last_read_seq : Optional[int] = ...,
+        conf_uin: Optional[int] = ...,
+        last_read_seq: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"conf_uin",b"conf_uin",u"last_read_seq",b"last_read_seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"conf_uin",b"conf_uin",u"last_read_seq",b"last_read_seq"]) -> None: ...
+    def HasField(self, field_name: Literal["conf_uin",b"conf_uin","last_read_seq",b"last_read_seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["conf_uin",b"conf_uin","last_read_seq",b"last_read_seq"]) -> None: ...
 
 class PbDiscussReadedReportResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     CONF_UIN_FIELD_NUMBER: int
     MEMBER_SEQ_FIELD_NUMBER: int
     CONF_SEQ_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    conf_uin: int = ...
-    member_seq: int = ...
-    conf_seq: int = ...
-
+    result: int
+    errmsg: Text
+    conf_uin: int
+    member_seq: int
+    conf_seq: int
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        conf_uin : Optional[int] = ...,
-        member_seq : Optional[int] = ...,
-        conf_seq : Optional[int] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        conf_uin: Optional[int] = ...,
+        member_seq: Optional[int] = ...,
+        conf_seq: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"conf_seq",b"conf_seq",u"conf_uin",b"conf_uin",u"errmsg",b"errmsg",u"member_seq",b"member_seq",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"conf_seq",b"conf_seq",u"conf_uin",b"conf_uin",u"errmsg",b"errmsg",u"member_seq",b"member_seq",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["conf_seq",b"conf_seq","conf_uin",b"conf_uin","errmsg",b"errmsg","member_seq",b"member_seq","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["conf_seq",b"conf_seq","conf_uin",b"conf_uin","errmsg",b"errmsg","member_seq",b"member_seq","result",b"result"]) -> None: ...
 
 class PbGetDiscussMsgReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     DISCUSS_UIN_FIELD_NUMBER: int
     END_SEQ_FIELD_NUMBER: int
     BEGIN_SEQ_FIELD_NUMBER: int
@@ -817,29 +767,28 @@ class PbGetDiscussMsgReq(Message):
     DISCUSS_INFO_SEQ_FIELD_NUMBER: int
     FILTER_FIELD_NUMBER: int
     MEMBER_SEQ_FIELD_NUMBER: int
-    discuss_uin: int = ...
-    end_seq: int = ...
-    begin_seq: int = ...
-    last_get_time: int = ...
-    discuss_info_seq: int = ...
-    filter: int = ...
-    member_seq: int = ...
-
-    def __init__(self,
-        *,
-        discuss_uin : Optional[int] = ...,
-        end_seq : Optional[int] = ...,
-        begin_seq : Optional[int] = ...,
-        last_get_time : Optional[int] = ...,
-        discuss_info_seq : Optional[int] = ...,
-        filter : Optional[int] = ...,
-        member_seq : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"begin_seq",b"begin_seq",u"discuss_info_seq",b"discuss_info_seq",u"discuss_uin",b"discuss_uin",u"end_seq",b"end_seq",u"filter",b"filter",u"last_get_time",b"last_get_time",u"member_seq",b"member_seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"begin_seq",b"begin_seq",u"discuss_info_seq",b"discuss_info_seq",u"discuss_uin",b"discuss_uin",u"end_seq",b"end_seq",u"filter",b"filter",u"last_get_time",b"last_get_time",u"member_seq",b"member_seq"]) -> None: ...
+    discuss_uin: int
+    end_seq: int
+    begin_seq: int
+    last_get_time: int
+    discuss_info_seq: int
+    filter: int
+    member_seq: int
+    def __init__(self,
+        *,
+        discuss_uin: Optional[int] = ...,
+        end_seq: Optional[int] = ...,
+        begin_seq: Optional[int] = ...,
+        last_get_time: Optional[int] = ...,
+        discuss_info_seq: Optional[int] = ...,
+        filter: Optional[int] = ...,
+        member_seq: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["begin_seq",b"begin_seq","discuss_info_seq",b"discuss_info_seq","discuss_uin",b"discuss_uin","end_seq",b"end_seq","filter",b"filter","last_get_time",b"last_get_time","member_seq",b"member_seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["begin_seq",b"begin_seq","discuss_info_seq",b"discuss_info_seq","discuss_uin",b"discuss_uin","end_seq",b"end_seq","filter",b"filter","last_get_time",b"last_get_time","member_seq",b"member_seq"]) -> None: ...
 
 class PbGetDiscussMsgResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     DISCUSS_UIN_FIELD_NUMBER: int
@@ -848,33 +797,31 @@ class PbGetDiscussMsgResp(Message):
     MSG_FIELD_NUMBER: int
     LAST_GET_TIME_FIELD_NUMBER: int
     DISCUSS_INFO_SEQ_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    discuss_uin: int = ...
-    return_end_seq: int = ...
-    return_begin_seq: int = ...
-    last_get_time: int = ...
-    discuss_info_seq: int = ...
-
+    result: int
+    errmsg: Text
+    discuss_uin: int
+    return_end_seq: int
+    return_begin_seq: int
     @property
     def msg(self) -> RepeatedCompositeFieldContainer[Msg]: ...
-
+    last_get_time: int
+    discuss_info_seq: int
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        discuss_uin : Optional[int] = ...,
-        return_end_seq : Optional[int] = ...,
-        return_begin_seq : Optional[int] = ...,
-        msg : Optional[Iterable[Msg]] = ...,
-        last_get_time : Optional[int] = ...,
-        discuss_info_seq : Optional[int] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        discuss_uin: Optional[int] = ...,
+        return_end_seq: Optional[int] = ...,
+        return_begin_seq: Optional[int] = ...,
+        msg: Optional[Iterable[Msg]] = ...,
+        last_get_time: Optional[int] = ...,
+        discuss_info_seq: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"discuss_info_seq",b"discuss_info_seq",u"discuss_uin",b"discuss_uin",u"errmsg",b"errmsg",u"last_get_time",b"last_get_time",u"result",b"result",u"return_begin_seq",b"return_begin_seq",u"return_end_seq",b"return_end_seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"discuss_info_seq",b"discuss_info_seq",u"discuss_uin",b"discuss_uin",u"errmsg",b"errmsg",u"last_get_time",b"last_get_time",u"msg",b"msg",u"result",b"result",u"return_begin_seq",b"return_begin_seq",u"return_end_seq",b"return_end_seq"]) -> None: ...
+    def HasField(self, field_name: Literal["discuss_info_seq",b"discuss_info_seq","discuss_uin",b"discuss_uin","errmsg",b"errmsg","last_get_time",b"last_get_time","result",b"result","return_begin_seq",b"return_begin_seq","return_end_seq",b"return_end_seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["discuss_info_seq",b"discuss_info_seq","discuss_uin",b"discuss_uin","errmsg",b"errmsg","last_get_time",b"last_get_time","msg",b"msg","result",b"result","return_begin_seq",b"return_begin_seq","return_end_seq",b"return_end_seq"]) -> None: ...
 
 class PbGetGroupMsgReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GROUP_CODE_FIELD_NUMBER: int
     BEGIN_SEQ_FIELD_NUMBER: int
     END_SEQ_FIELD_NUMBER: int
@@ -883,60 +830,57 @@ class PbGetGroupMsgReq(Message):
     PUBLIC_GROUP_FIELD_NUMBER: int
     SHIELD_FLAG_FIELD_NUMBER: int
     SAVE_TRAFFIC_FLAG_FIELD_NUMBER: int
-    group_code: int = ...
-    begin_seq: int = ...
-    end_seq: int = ...
-    filter: int = ...
-    member_seq: int = ...
-    public_group: bool = ...
-    shield_flag: int = ...
-    save_traffic_flag: int = ...
-
-    def __init__(self,
-        *,
-        group_code : Optional[int] = ...,
-        begin_seq : Optional[int] = ...,
-        end_seq : Optional[int] = ...,
-        filter : Optional[int] = ...,
-        member_seq : Optional[int] = ...,
-        public_group : Optional[bool] = ...,
-        shield_flag : Optional[int] = ...,
-        save_traffic_flag : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"begin_seq",b"begin_seq",u"end_seq",b"end_seq",u"filter",b"filter",u"group_code",b"group_code",u"member_seq",b"member_seq",u"public_group",b"public_group",u"save_traffic_flag",b"save_traffic_flag",u"shield_flag",b"shield_flag"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"begin_seq",b"begin_seq",u"end_seq",b"end_seq",u"filter",b"filter",u"group_code",b"group_code",u"member_seq",b"member_seq",u"public_group",b"public_group",u"save_traffic_flag",b"save_traffic_flag",u"shield_flag",b"shield_flag"]) -> None: ...
+    group_code: int
+    begin_seq: int
+    end_seq: int
+    filter: int
+    member_seq: int
+    public_group: bool
+    shield_flag: int
+    save_traffic_flag: int
+    def __init__(self,
+        *,
+        group_code: Optional[int] = ...,
+        begin_seq: Optional[int] = ...,
+        end_seq: Optional[int] = ...,
+        filter: Optional[int] = ...,
+        member_seq: Optional[int] = ...,
+        public_group: Optional[bool] = ...,
+        shield_flag: Optional[int] = ...,
+        save_traffic_flag: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["begin_seq",b"begin_seq","end_seq",b"end_seq","filter",b"filter","group_code",b"group_code","member_seq",b"member_seq","public_group",b"public_group","save_traffic_flag",b"save_traffic_flag","shield_flag",b"shield_flag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["begin_seq",b"begin_seq","end_seq",b"end_seq","filter",b"filter","group_code",b"group_code","member_seq",b"member_seq","public_group",b"public_group","save_traffic_flag",b"save_traffic_flag","shield_flag",b"shield_flag"]) -> None: ...
 
 class PbGetGroupMsgResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     GROUP_CODE_FIELD_NUMBER: int
     RETURN_BEGIN_SEQ_FIELD_NUMBER: int
     RETURN_END_SEQ_FIELD_NUMBER: int
     MSG_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    group_code: int = ...
-    return_begin_seq: int = ...
-    return_end_seq: int = ...
-
+    result: int
+    errmsg: Text
+    group_code: int
+    return_begin_seq: int
+    return_end_seq: int
     @property
     def msg(self) -> RepeatedCompositeFieldContainer[Msg]: ...
-
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        group_code : Optional[int] = ...,
-        return_begin_seq : Optional[int] = ...,
-        return_end_seq : Optional[int] = ...,
-        msg : Optional[Iterable[Msg]] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        group_code: Optional[int] = ...,
+        return_begin_seq: Optional[int] = ...,
+        return_end_seq: Optional[int] = ...,
+        msg: Optional[Iterable[Msg]] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"group_code",b"group_code",u"result",b"result",u"return_begin_seq",b"return_begin_seq",u"return_end_seq",b"return_end_seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"group_code",b"group_code",u"msg",b"msg",u"result",b"result",u"return_begin_seq",b"return_begin_seq",u"return_end_seq",b"return_end_seq"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","group_code",b"group_code","result",b"result","return_begin_seq",b"return_begin_seq","return_end_seq",b"return_end_seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","group_code",b"group_code","msg",b"msg","result",b"result","return_begin_seq",b"return_begin_seq","return_end_seq",b"return_end_seq"]) -> None: ...
 
 class PbGetMsgReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SYNC_FLAG_FIELD_NUMBER: int
     SYNC_COOKIE_FIELD_NUMBER: int
     RAMBLE_FLAG_FIELD_NUMBER: int
@@ -949,39 +893,38 @@ class PbGetMsgReq(Message):
     PUBACCOUNT_COOKIE_FIELD_NUMBER: int
     CTRL_BUF_FIELD_NUMBER: int
     SERVER_BUF_FIELD_NUMBER: int
-    sync_flag: int = ...
-    sync_cookie: bytes = ...
-    ramble_flag: int = ...
-    latest_ramble_number: int = ...
-    other_ramble_number: int = ...
-    online_sync_flag: int = ...
-    context_flag: int = ...
-    whisper_session_id: int = ...
-    req_type: int = ...
-    pubaccount_cookie: bytes = ...
-    ctrl_buf: bytes = ...
-    server_buf: bytes = ...
-
-    def __init__(self,
-        *,
-        sync_flag : Optional[int] = ...,
-        sync_cookie : Optional[bytes] = ...,
-        ramble_flag : Optional[int] = ...,
-        latest_ramble_number : Optional[int] = ...,
-        other_ramble_number : Optional[int] = ...,
-        online_sync_flag : Optional[int] = ...,
-        context_flag : Optional[int] = ...,
-        whisper_session_id : Optional[int] = ...,
-        req_type : Optional[int] = ...,
-        pubaccount_cookie : Optional[bytes] = ...,
-        ctrl_buf : Optional[bytes] = ...,
-        server_buf : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"context_flag",b"context_flag",u"ctrl_buf",b"ctrl_buf",u"latest_ramble_number",b"latest_ramble_number",u"online_sync_flag",b"online_sync_flag",u"other_ramble_number",b"other_ramble_number",u"pubaccount_cookie",b"pubaccount_cookie",u"ramble_flag",b"ramble_flag",u"req_type",b"req_type",u"server_buf",b"server_buf",u"sync_cookie",b"sync_cookie",u"sync_flag",b"sync_flag",u"whisper_session_id",b"whisper_session_id"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"context_flag",b"context_flag",u"ctrl_buf",b"ctrl_buf",u"latest_ramble_number",b"latest_ramble_number",u"online_sync_flag",b"online_sync_flag",u"other_ramble_number",b"other_ramble_number",u"pubaccount_cookie",b"pubaccount_cookie",u"ramble_flag",b"ramble_flag",u"req_type",b"req_type",u"server_buf",b"server_buf",u"sync_cookie",b"sync_cookie",u"sync_flag",b"sync_flag",u"whisper_session_id",b"whisper_session_id"]) -> None: ...
+    sync_flag: int
+    sync_cookie: bytes
+    ramble_flag: int
+    latest_ramble_number: int
+    other_ramble_number: int
+    online_sync_flag: int
+    context_flag: int
+    whisper_session_id: int
+    req_type: int
+    pubaccount_cookie: bytes
+    ctrl_buf: bytes
+    server_buf: bytes
+    def __init__(self,
+        *,
+        sync_flag: Optional[int] = ...,
+        sync_cookie: Optional[bytes] = ...,
+        ramble_flag: Optional[int] = ...,
+        latest_ramble_number: Optional[int] = ...,
+        other_ramble_number: Optional[int] = ...,
+        online_sync_flag: Optional[int] = ...,
+        context_flag: Optional[int] = ...,
+        whisper_session_id: Optional[int] = ...,
+        req_type: Optional[int] = ...,
+        pubaccount_cookie: Optional[bytes] = ...,
+        ctrl_buf: Optional[bytes] = ...,
+        server_buf: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["context_flag",b"context_flag","ctrl_buf",b"ctrl_buf","latest_ramble_number",b"latest_ramble_number","online_sync_flag",b"online_sync_flag","other_ramble_number",b"other_ramble_number","pubaccount_cookie",b"pubaccount_cookie","ramble_flag",b"ramble_flag","req_type",b"req_type","server_buf",b"server_buf","sync_cookie",b"sync_cookie","sync_flag",b"sync_flag","whisper_session_id",b"whisper_session_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["context_flag",b"context_flag","ctrl_buf",b"ctrl_buf","latest_ramble_number",b"latest_ramble_number","online_sync_flag",b"online_sync_flag","other_ramble_number",b"other_ramble_number","pubaccount_cookie",b"pubaccount_cookie","ramble_flag",b"ramble_flag","req_type",b"req_type","server_buf",b"server_buf","sync_cookie",b"sync_cookie","sync_flag",b"sync_flag","whisper_session_id",b"whisper_session_id"]) -> None: ...
 
 class PbGetMsgResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     SYNC_COOKIE_FIELD_NUMBER: int
@@ -992,58 +935,55 @@ class PbGetMsgResp(Message):
     PUBACCOUNT_COOKIE_FIELD_NUMBER: int
     IS_PARTIAL_SYNC_FIELD_NUMBER: int
     CTRL_BUF_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    sync_cookie: bytes = ...
-    sync_flag: int = ...
-    bind_uin: int = ...
-    rsp_type: int = ...
-    pubaccount_cookie: bytes = ...
-    is_partial_sync: bool = ...
-    ctrl_buf: bytes = ...
-
+    result: int
+    errmsg: Text
+    sync_cookie: bytes
+    sync_flag: int
     @property
     def uin_pair_msgs(self) -> RepeatedCompositeFieldContainer[UinPairMsg]: ...
-
-    def __init__(self,
-        *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        sync_cookie : Optional[bytes] = ...,
-        sync_flag : Optional[int] = ...,
-        uin_pair_msgs : Optional[Iterable[UinPairMsg]] = ...,
-        bind_uin : Optional[int] = ...,
-        rsp_type : Optional[int] = ...,
-        pubaccount_cookie : Optional[bytes] = ...,
-        is_partial_sync : Optional[bool] = ...,
-        ctrl_buf : Optional[bytes] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"ctrl_buf",b"ctrl_buf",u"errmsg",b"errmsg",u"is_partial_sync",b"is_partial_sync",u"pubaccount_cookie",b"pubaccount_cookie",u"result",b"result",u"rsp_type",b"rsp_type",u"sync_cookie",b"sync_cookie",u"sync_flag",b"sync_flag"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bind_uin",b"bind_uin",u"ctrl_buf",b"ctrl_buf",u"errmsg",b"errmsg",u"is_partial_sync",b"is_partial_sync",u"pubaccount_cookie",b"pubaccount_cookie",u"result",b"result",u"rsp_type",b"rsp_type",u"sync_cookie",b"sync_cookie",u"sync_flag",b"sync_flag",u"uin_pair_msgs",b"uin_pair_msgs"]) -> None: ...
+    bind_uin: int
+    rsp_type: int
+    pubaccount_cookie: bytes
+    is_partial_sync: bool
+    ctrl_buf: bytes
+    def __init__(self,
+        *,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        sync_cookie: Optional[bytes] = ...,
+        sync_flag: Optional[int] = ...,
+        uin_pair_msgs: Optional[Iterable[UinPairMsg]] = ...,
+        bind_uin: Optional[int] = ...,
+        rsp_type: Optional[int] = ...,
+        pubaccount_cookie: Optional[bytes] = ...,
+        is_partial_sync: Optional[bool] = ...,
+        ctrl_buf: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["bind_uin",b"bind_uin","ctrl_buf",b"ctrl_buf","errmsg",b"errmsg","is_partial_sync",b"is_partial_sync","pubaccount_cookie",b"pubaccount_cookie","result",b"result","rsp_type",b"rsp_type","sync_cookie",b"sync_cookie","sync_flag",b"sync_flag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bind_uin",b"bind_uin","ctrl_buf",b"ctrl_buf","errmsg",b"errmsg","is_partial_sync",b"is_partial_sync","pubaccount_cookie",b"pubaccount_cookie","result",b"result","rsp_type",b"rsp_type","sync_cookie",b"sync_cookie","sync_flag",b"sync_flag","uin_pair_msgs",b"uin_pair_msgs"]) -> None: ...
 
 class PbGetOneDayRoamMsgReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     PEER_UIN_FIELD_NUMBER: int
     LAST_MSGTIME_FIELD_NUMBER: int
     RANDOM_FIELD_NUMBER: int
     READ_CNT_FIELD_NUMBER: int
-    peer_uin: int = ...
-    last_msgtime: int = ...
-    random: int = ...
-    read_cnt: int = ...
-
+    peer_uin: int
+    last_msgtime: int
+    random: int
+    read_cnt: int
     def __init__(self,
         *,
-        peer_uin : Optional[int] = ...,
-        last_msgtime : Optional[int] = ...,
-        random : Optional[int] = ...,
-        read_cnt : Optional[int] = ...,
+        peer_uin: Optional[int] = ...,
+        last_msgtime: Optional[int] = ...,
+        random: Optional[int] = ...,
+        read_cnt: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"last_msgtime",b"last_msgtime",u"peer_uin",b"peer_uin",u"random",b"random",u"read_cnt",b"read_cnt"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"last_msgtime",b"last_msgtime",u"peer_uin",b"peer_uin",u"random",b"random",u"read_cnt",b"read_cnt"]) -> None: ...
+    def HasField(self, field_name: Literal["last_msgtime",b"last_msgtime","peer_uin",b"peer_uin","random",b"random","read_cnt",b"read_cnt"]) -> bool: ...
+    def ClearField(self, field_name: Literal["last_msgtime",b"last_msgtime","peer_uin",b"peer_uin","random",b"random","read_cnt",b"read_cnt"]) -> None: ...
 
 class PbGetOneDayRoamMsgResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     PEER_UIN_FIELD_NUMBER: int
@@ -1051,31 +991,29 @@ class PbGetOneDayRoamMsgResp(Message):
     RANDOM_FIELD_NUMBER: int
     MSG_FIELD_NUMBER: int
     ISCOMPLETE_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    peer_uin: int = ...
-    last_msgtime: int = ...
-    random: int = ...
-    iscomplete: int = ...
-
+    result: int
+    errmsg: Text
+    peer_uin: int
+    last_msgtime: int
+    random: int
     @property
     def msg(self) -> RepeatedCompositeFieldContainer[Msg]: ...
-
+    iscomplete: int
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        peer_uin : Optional[int] = ...,
-        last_msgtime : Optional[int] = ...,
-        random : Optional[int] = ...,
-        msg : Optional[Iterable[Msg]] = ...,
-        iscomplete : Optional[int] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        peer_uin: Optional[int] = ...,
+        last_msgtime: Optional[int] = ...,
+        random: Optional[int] = ...,
+        msg: Optional[Iterable[Msg]] = ...,
+        iscomplete: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"iscomplete",b"iscomplete",u"last_msgtime",b"last_msgtime",u"peer_uin",b"peer_uin",u"random",b"random",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"iscomplete",b"iscomplete",u"last_msgtime",b"last_msgtime",u"msg",b"msg",u"peer_uin",b"peer_uin",u"random",b"random",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","iscomplete",b"iscomplete","last_msgtime",b"last_msgtime","peer_uin",b"peer_uin","random",b"random","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","iscomplete",b"iscomplete","last_msgtime",b"last_msgtime","msg",b"msg","peer_uin",b"peer_uin","random",b"random","result",b"result"]) -> None: ...
 
 class PbGetRoamMsgReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     PEER_UIN_FIELD_NUMBER: int
     LAST_MSGTIME_FIELD_NUMBER: int
     RANDOM_FIELD_NUMBER: int
@@ -1086,35 +1024,34 @@ class PbGetRoamMsgReq(Message):
     SUBCMD_FIELD_NUMBER: int
     BEGIN_MSGTIME_FIELD_NUMBER: int
     REQ_TYPE_FIELD_NUMBER: int
-    peer_uin: int = ...
-    last_msgtime: int = ...
-    random: int = ...
-    read_cnt: int = ...
-    check_pwd: int = ...
-    sig: bytes = ...
-    pwd: bytes = ...
-    subcmd: int = ...
-    begin_msgtime: int = ...
-    req_type: int = ...
-
-    def __init__(self,
-        *,
-        peer_uin : Optional[int] = ...,
-        last_msgtime : Optional[int] = ...,
-        random : Optional[int] = ...,
-        read_cnt : Optional[int] = ...,
-        check_pwd : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
-        pwd : Optional[bytes] = ...,
-        subcmd : Optional[int] = ...,
-        begin_msgtime : Optional[int] = ...,
-        req_type : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"begin_msgtime",b"begin_msgtime",u"check_pwd",b"check_pwd",u"last_msgtime",b"last_msgtime",u"peer_uin",b"peer_uin",u"pwd",b"pwd",u"random",b"random",u"read_cnt",b"read_cnt",u"req_type",b"req_type",u"sig",b"sig",u"subcmd",b"subcmd"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"begin_msgtime",b"begin_msgtime",u"check_pwd",b"check_pwd",u"last_msgtime",b"last_msgtime",u"peer_uin",b"peer_uin",u"pwd",b"pwd",u"random",b"random",u"read_cnt",b"read_cnt",u"req_type",b"req_type",u"sig",b"sig",u"subcmd",b"subcmd"]) -> None: ...
+    peer_uin: int
+    last_msgtime: int
+    random: int
+    read_cnt: int
+    check_pwd: int
+    sig: bytes
+    pwd: bytes
+    subcmd: int
+    begin_msgtime: int
+    req_type: int
+    def __init__(self,
+        *,
+        peer_uin: Optional[int] = ...,
+        last_msgtime: Optional[int] = ...,
+        random: Optional[int] = ...,
+        read_cnt: Optional[int] = ...,
+        check_pwd: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
+        pwd: Optional[bytes] = ...,
+        subcmd: Optional[int] = ...,
+        begin_msgtime: Optional[int] = ...,
+        req_type: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["begin_msgtime",b"begin_msgtime","check_pwd",b"check_pwd","last_msgtime",b"last_msgtime","peer_uin",b"peer_uin","pwd",b"pwd","random",b"random","read_cnt",b"read_cnt","req_type",b"req_type","sig",b"sig","subcmd",b"subcmd"]) -> bool: ...
+    def ClearField(self, field_name: Literal["begin_msgtime",b"begin_msgtime","check_pwd",b"check_pwd","last_msgtime",b"last_msgtime","peer_uin",b"peer_uin","pwd",b"pwd","random",b"random","read_cnt",b"read_cnt","req_type",b"req_type","sig",b"sig","subcmd",b"subcmd"]) -> None: ...
 
 class PbGetRoamMsgResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     PEER_UIN_FIELD_NUMBER: int
@@ -1122,78 +1059,73 @@ class PbGetRoamMsgResp(Message):
     RANDOM_FIELD_NUMBER: int
     MSG_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    peer_uin: int = ...
-    last_msgtime: int = ...
-    random: int = ...
-    sig: bytes = ...
-
+    result: int
+    errmsg: Text
+    peer_uin: int
+    last_msgtime: int
+    random: int
     @property
     def msg(self) -> RepeatedCompositeFieldContainer[Msg]: ...
-
+    sig: bytes
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        peer_uin : Optional[int] = ...,
-        last_msgtime : Optional[int] = ...,
-        random : Optional[int] = ...,
-        msg : Optional[Iterable[Msg]] = ...,
-        sig : Optional[bytes] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        peer_uin: Optional[int] = ...,
+        last_msgtime: Optional[int] = ...,
+        random: Optional[int] = ...,
+        msg: Optional[Iterable[Msg]] = ...,
+        sig: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"last_msgtime",b"last_msgtime",u"peer_uin",b"peer_uin",u"random",b"random",u"result",b"result",u"sig",b"sig"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"last_msgtime",b"last_msgtime",u"msg",b"msg",u"peer_uin",b"peer_uin",u"random",b"random",u"result",b"result",u"sig",b"sig"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","last_msgtime",b"last_msgtime","peer_uin",b"peer_uin","random",b"random","result",b"result","sig",b"sig"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","last_msgtime",b"last_msgtime","msg",b"msg","peer_uin",b"peer_uin","random",b"random","result",b"result","sig",b"sig"]) -> None: ...
 
 class PbGroupMsgWithDrawReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SUB_CMD_FIELD_NUMBER: int
     GROUP_TYPE_FIELD_NUMBER: int
     GROUP_CODE_FIELD_NUMBER: int
     LIST_FIELD_NUMBER: int
     USERDEF_FIELD_NUMBER: int
-    sub_cmd: int = ...
-    group_type: int = ...
-    group_code: int = ...
-    userdef: bytes = ...
-
+    sub_cmd: int
+    group_type: int
+    group_code: int
     @property
     def list(self) -> RepeatedCompositeFieldContainer[MessageInfo]: ...
-
+    userdef: bytes
     def __init__(self,
         *,
-        sub_cmd : Optional[int] = ...,
-        group_type : Optional[int] = ...,
-        group_code : Optional[int] = ...,
-        list : Optional[Iterable[MessageInfo]] = ...,
-        userdef : Optional[bytes] = ...,
+        sub_cmd: Optional[int] = ...,
+        group_type: Optional[int] = ...,
+        group_code: Optional[int] = ...,
+        list: Optional[Iterable[MessageInfo]] = ...,
+        userdef: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"group_code",b"group_code",u"group_type",b"group_type",u"sub_cmd",b"sub_cmd",u"userdef",b"userdef"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"group_code",b"group_code",u"group_type",b"group_type",u"list",b"list",u"sub_cmd",b"sub_cmd",u"userdef",b"userdef"]) -> None: ...
+    def HasField(self, field_name: Literal["group_code",b"group_code","group_type",b"group_type","sub_cmd",b"sub_cmd","userdef",b"userdef"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_code",b"group_code","group_type",b"group_type","list",b"list","sub_cmd",b"sub_cmd","userdef",b"userdef"]) -> None: ...
 
 class MessageInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     MSG_SEQ_FIELD_NUMBER: int
     MSG_RANDOM_FIELD_NUMBER: int
     MSG_TYPE_FIELD_NUMBER: int
     RESV_FLAG_FIELD_NUMBER: int
-    msg_seq: int = ...
-    msg_random: int = ...
-    msg_type: int = ...
-    resv_flag: int = ...
-
+    msg_seq: int
+    msg_random: int
+    msg_type: int
+    resv_flag: int
     def __init__(self,
         *,
-        msg_seq : Optional[int] = ...,
-        msg_random : Optional[int] = ...,
-        msg_type : Optional[int] = ...,
-        resv_flag : Optional[int] = ...,
+        msg_seq: Optional[int] = ...,
+        msg_random: Optional[int] = ...,
+        msg_type: Optional[int] = ...,
+        resv_flag: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"msg_random",b"msg_random",u"msg_seq",b"msg_seq",u"msg_type",b"msg_type",u"resv_flag",b"resv_flag"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"msg_random",b"msg_random",u"msg_seq",b"msg_seq",u"msg_type",b"msg_type",u"resv_flag",b"resv_flag"]) -> None: ...
+    def HasField(self, field_name: Literal["msg_random",b"msg_random","msg_seq",b"msg_seq","msg_type",b"msg_type","resv_flag",b"resv_flag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["msg_random",b"msg_random","msg_seq",b"msg_seq","msg_type",b"msg_type","resv_flag",b"resv_flag"]) -> None: ...
 
 class PbGroupMsgWithDrawResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     SUB_CMD_FIELD_NUMBER: int
@@ -1202,380 +1134,342 @@ class PbGroupMsgWithDrawResp(Message):
     FAILED_MSG_LIST_FIELD_NUMBER: int
     USERDEF_FIELD_NUMBER: int
     WORDING_INFO_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    sub_cmd: int = ...
-    group_type: int = ...
-    group_code: int = ...
-    userdef: bytes = ...
-
+    result: int
+    errmsg: Text
+    sub_cmd: int
+    group_type: int
+    group_code: int
     @property
     def failed_msg_list(self) -> RepeatedCompositeFieldContainer[MessageResult]: ...
-
+    userdef: bytes
     @property
     def wording_info(self) -> WithDrawWordingInfo: ...
-
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        sub_cmd : Optional[int] = ...,
-        group_type : Optional[int] = ...,
-        group_code : Optional[int] = ...,
-        failed_msg_list : Optional[Iterable[MessageResult]] = ...,
-        userdef : Optional[bytes] = ...,
-        wording_info : Optional[WithDrawWordingInfo] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        sub_cmd: Optional[int] = ...,
+        group_type: Optional[int] = ...,
+        group_code: Optional[int] = ...,
+        failed_msg_list: Optional[Iterable[MessageResult]] = ...,
+        userdef: Optional[bytes] = ...,
+        wording_info: Optional[WithDrawWordingInfo] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"group_code",b"group_code",u"group_type",b"group_type",u"result",b"result",u"sub_cmd",b"sub_cmd",u"userdef",b"userdef",u"wording_info",b"wording_info"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"failed_msg_list",b"failed_msg_list",u"group_code",b"group_code",u"group_type",b"group_type",u"result",b"result",u"sub_cmd",b"sub_cmd",u"userdef",b"userdef",u"wording_info",b"wording_info"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","group_code",b"group_code","group_type",b"group_type","result",b"result","sub_cmd",b"sub_cmd","userdef",b"userdef","wording_info",b"wording_info"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","failed_msg_list",b"failed_msg_list","group_code",b"group_code","group_type",b"group_type","result",b"result","sub_cmd",b"sub_cmd","userdef",b"userdef","wording_info",b"wording_info"]) -> None: ...
 
 class MessageResult(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     MSG_SEQ_FIELD_NUMBER: int
     MSG_TIME_FIELD_NUMBER: int
     MSG_RANDOM_FIELD_NUMBER: int
     ERR_MSG_FIELD_NUMBER: int
     MSG_TYPE_FIELD_NUMBER: int
-    result: int = ...
-    msg_seq: int = ...
-    msg_time: int = ...
-    msg_random: int = ...
-    err_msg: bytes = ...
-    msg_type: int = ...
-
+    result: int
+    msg_seq: int
+    msg_time: int
+    msg_random: int
+    err_msg: bytes
+    msg_type: int
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        msg_seq : Optional[int] = ...,
-        msg_time : Optional[int] = ...,
-        msg_random : Optional[int] = ...,
-        err_msg : Optional[bytes] = ...,
-        msg_type : Optional[int] = ...,
+        result: Optional[int] = ...,
+        msg_seq: Optional[int] = ...,
+        msg_time: Optional[int] = ...,
+        msg_random: Optional[int] = ...,
+        err_msg: Optional[bytes] = ...,
+        msg_type: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"err_msg",b"err_msg",u"msg_random",b"msg_random",u"msg_seq",b"msg_seq",u"msg_time",b"msg_time",u"msg_type",b"msg_type",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"err_msg",b"err_msg",u"msg_random",b"msg_random",u"msg_seq",b"msg_seq",u"msg_time",b"msg_time",u"msg_type",b"msg_type",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["err_msg",b"err_msg","msg_random",b"msg_random","msg_seq",b"msg_seq","msg_time",b"msg_time","msg_type",b"msg_type","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["err_msg",b"err_msg","msg_random",b"msg_random","msg_seq",b"msg_seq","msg_time",b"msg_time","msg_type",b"msg_type","result",b"result"]) -> None: ...
 
 class PbGroupReadedReportReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GROUP_CODE_FIELD_NUMBER: int
     LAST_READ_SEQ_FIELD_NUMBER: int
-    group_code: int = ...
-    last_read_seq: int = ...
-
+    group_code: int
+    last_read_seq: int
     def __init__(self,
         *,
-        group_code : Optional[int] = ...,
-        last_read_seq : Optional[int] = ...,
+        group_code: Optional[int] = ...,
+        last_read_seq: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"group_code",b"group_code",u"last_read_seq",b"last_read_seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"group_code",b"group_code",u"last_read_seq",b"last_read_seq"]) -> None: ...
+    def HasField(self, field_name: Literal["group_code",b"group_code","last_read_seq",b"last_read_seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_code",b"group_code","last_read_seq",b"last_read_seq"]) -> None: ...
 
 class PbGroupReadedReportResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     GROUP_CODE_FIELD_NUMBER: int
     MEMBER_SEQ_FIELD_NUMBER: int
     GROUP_MSG_SEQ_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    group_code: int = ...
-    member_seq: int = ...
-    group_msg_seq: int = ...
-
+    result: int
+    errmsg: Text
+    group_code: int
+    member_seq: int
+    group_msg_seq: int
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        group_code : Optional[int] = ...,
-        member_seq : Optional[int] = ...,
-        group_msg_seq : Optional[int] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        group_code: Optional[int] = ...,
+        member_seq: Optional[int] = ...,
+        group_msg_seq: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"group_code",b"group_code",u"group_msg_seq",b"group_msg_seq",u"member_seq",b"member_seq",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"group_code",b"group_code",u"group_msg_seq",b"group_msg_seq",u"member_seq",b"member_seq",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","group_code",b"group_code","group_msg_seq",b"group_msg_seq","member_seq",b"member_seq","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","group_code",b"group_code","group_msg_seq",b"group_msg_seq","member_seq",b"member_seq","result",b"result"]) -> None: ...
 
 class PbInputNotifyInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     IME_FIELD_NUMBER: int
     NOTIFY_FLAG_FIELD_NUMBER: int
     PB_RESERVE_FIELD_NUMBER: int
     IOS_PUSH_WORDING_FIELD_NUMBER: int
-    to_uin: int = ...
-    ime: int = ...
-    notify_flag: int = ...
-    pb_reserve: bytes = ...
-    ios_push_wording: bytes = ...
-
+    to_uin: int
+    ime: int
+    notify_flag: int
+    pb_reserve: bytes
+    ios_push_wording: bytes
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        ime : Optional[int] = ...,
-        notify_flag : Optional[int] = ...,
-        pb_reserve : Optional[bytes] = ...,
-        ios_push_wording : Optional[bytes] = ...,
+        to_uin: Optional[int] = ...,
+        ime: Optional[int] = ...,
+        notify_flag: Optional[int] = ...,
+        pb_reserve: Optional[bytes] = ...,
+        ios_push_wording: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"ime",b"ime",u"ios_push_wording",b"ios_push_wording",u"notify_flag",b"notify_flag",u"pb_reserve",b"pb_reserve",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"ime",b"ime",u"ios_push_wording",b"ios_push_wording",u"notify_flag",b"notify_flag",u"pb_reserve",b"pb_reserve",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["ime",b"ime","ios_push_wording",b"ios_push_wording","notify_flag",b"notify_flag","pb_reserve",b"pb_reserve","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ime",b"ime","ios_push_wording",b"ios_push_wording","notify_flag",b"notify_flag","pb_reserve",b"pb_reserve","to_uin",b"to_uin"]) -> None: ...
 
 class PbMsgReadedReportReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GRP_READ_REPORT_FIELD_NUMBER: int
     DIS_READ_REPORT_FIELD_NUMBER: int
     C2C_READ_REPORT_FIELD_NUMBER: int
     BIND_UIN_READ_REPORT_FIELD_NUMBER: int
-
     @property
     def grp_read_report(self) -> RepeatedCompositeFieldContainer[PbGroupReadedReportReq]: ...
-
     @property
     def dis_read_report(self) -> RepeatedCompositeFieldContainer[PbDiscussReadedReportReq]: ...
-
     @property
     def c2c_read_report(self) -> PbC2CReadedReportReq: ...
-
     @property
     def bind_uin_read_report(self) -> PbBindUinMsgReadedConfirmReq: ...
-
     def __init__(self,
         *,
-        grp_read_report : Optional[Iterable[PbGroupReadedReportReq]] = ...,
-        dis_read_report : Optional[Iterable[PbDiscussReadedReportReq]] = ...,
-        c2c_read_report : Optional[PbC2CReadedReportReq] = ...,
-        bind_uin_read_report : Optional[PbBindUinMsgReadedConfirmReq] = ...,
+        grp_read_report: Optional[Iterable[PbGroupReadedReportReq]] = ...,
+        dis_read_report: Optional[Iterable[PbDiscussReadedReportReq]] = ...,
+        c2c_read_report: Optional[PbC2CReadedReportReq] = ...,
+        bind_uin_read_report: Optional[PbBindUinMsgReadedConfirmReq] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bind_uin_read_report",b"bind_uin_read_report",u"c2c_read_report",b"c2c_read_report"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bind_uin_read_report",b"bind_uin_read_report",u"c2c_read_report",b"c2c_read_report",u"dis_read_report",b"dis_read_report",u"grp_read_report",b"grp_read_report"]) -> None: ...
+    def HasField(self, field_name: Literal["bind_uin_read_report",b"bind_uin_read_report","c2c_read_report",b"c2c_read_report"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bind_uin_read_report",b"bind_uin_read_report","c2c_read_report",b"c2c_read_report","dis_read_report",b"dis_read_report","grp_read_report",b"grp_read_report"]) -> None: ...
 
 class PbMsgReadedReportResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GRP_READ_REPORT_FIELD_NUMBER: int
     DIS_READ_REPORT_FIELD_NUMBER: int
     C2C_READ_REPORT_FIELD_NUMBER: int
     BIND_UIN_READ_REPORT_FIELD_NUMBER: int
-
     @property
     def grp_read_report(self) -> RepeatedCompositeFieldContainer[PbGroupReadedReportResp]: ...
-
     @property
     def dis_read_report(self) -> RepeatedCompositeFieldContainer[PbDiscussReadedReportResp]: ...
-
     @property
     def c2c_read_report(self) -> PbC2CReadedReportResp: ...
-
     @property
     def bind_uin_read_report(self) -> PbBindUinMsgReadedConfirmResp: ...
-
     def __init__(self,
         *,
-        grp_read_report : Optional[Iterable[PbGroupReadedReportResp]] = ...,
-        dis_read_report : Optional[Iterable[PbDiscussReadedReportResp]] = ...,
-        c2c_read_report : Optional[PbC2CReadedReportResp] = ...,
-        bind_uin_read_report : Optional[PbBindUinMsgReadedConfirmResp] = ...,
+        grp_read_report: Optional[Iterable[PbGroupReadedReportResp]] = ...,
+        dis_read_report: Optional[Iterable[PbDiscussReadedReportResp]] = ...,
+        c2c_read_report: Optional[PbC2CReadedReportResp] = ...,
+        bind_uin_read_report: Optional[PbBindUinMsgReadedConfirmResp] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bind_uin_read_report",b"bind_uin_read_report",u"c2c_read_report",b"c2c_read_report"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bind_uin_read_report",b"bind_uin_read_report",u"c2c_read_report",b"c2c_read_report",u"dis_read_report",b"dis_read_report",u"grp_read_report",b"grp_read_report"]) -> None: ...
+    def HasField(self, field_name: Literal["bind_uin_read_report",b"bind_uin_read_report","c2c_read_report",b"c2c_read_report"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bind_uin_read_report",b"bind_uin_read_report","c2c_read_report",b"c2c_read_report","dis_read_report",b"dis_read_report","grp_read_report",b"grp_read_report"]) -> None: ...
 
 class PbMsgWithDrawReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     C2C_WITH_DRAW_FIELD_NUMBER: int
     GROUP_WITH_DRAW_FIELD_NUMBER: int
-
     @property
     def c2c_with_draw(self) -> RepeatedCompositeFieldContainer[PbC2CMsgWithDrawReq]: ...
-
     @property
     def group_with_draw(self) -> RepeatedCompositeFieldContainer[PbGroupMsgWithDrawReq]: ...
-
     def __init__(self,
         *,
-        c2c_with_draw : Optional[Iterable[PbC2CMsgWithDrawReq]] = ...,
-        group_with_draw : Optional[Iterable[PbGroupMsgWithDrawReq]] = ...,
+        c2c_with_draw: Optional[Iterable[PbC2CMsgWithDrawReq]] = ...,
+        group_with_draw: Optional[Iterable[PbGroupMsgWithDrawReq]] = ...,
         ) -> None: ...
-    def ClearField(self, field_name: Literal[u"c2c_with_draw",b"c2c_with_draw",u"group_with_draw",b"group_with_draw"]) -> None: ...
+    def ClearField(self, field_name: Literal["c2c_with_draw",b"c2c_with_draw","group_with_draw",b"group_with_draw"]) -> None: ...
 
 class PbMsgWithDrawResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     C2C_WITH_DRAW_FIELD_NUMBER: int
     GROUP_WITH_DRAW_FIELD_NUMBER: int
-
     @property
     def c2c_with_draw(self) -> RepeatedCompositeFieldContainer[PbC2CMsgWithDrawResp]: ...
-
     @property
     def group_with_draw(self) -> RepeatedCompositeFieldContainer[PbGroupMsgWithDrawResp]: ...
-
     def __init__(self,
         *,
-        c2c_with_draw : Optional[Iterable[PbC2CMsgWithDrawResp]] = ...,
-        group_with_draw : Optional[Iterable[PbGroupMsgWithDrawResp]] = ...,
+        c2c_with_draw: Optional[Iterable[PbC2CMsgWithDrawResp]] = ...,
+        group_with_draw: Optional[Iterable[PbGroupMsgWithDrawResp]] = ...,
         ) -> None: ...
-    def ClearField(self, field_name: Literal[u"c2c_with_draw",b"c2c_with_draw",u"group_with_draw",b"group_with_draw"]) -> None: ...
+    def ClearField(self, field_name: Literal["c2c_with_draw",b"c2c_with_draw","group_with_draw",b"group_with_draw"]) -> None: ...
 
 class PbPullDiscussMsgSeqReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     DISCUSS_INFO_REQ_FIELD_NUMBER: int
-
     @property
     def discuss_info_req(self) -> RepeatedCompositeFieldContainer[DiscussInfoReq]: ...
-
     def __init__(self,
         *,
-        discuss_info_req : Optional[Iterable[DiscussInfoReq]] = ...,
+        discuss_info_req: Optional[Iterable[DiscussInfoReq]] = ...,
         ) -> None: ...
-    def ClearField(self, field_name: Literal[u"discuss_info_req",b"discuss_info_req"]) -> None: ...
+    def ClearField(self, field_name: Literal["discuss_info_req",b"discuss_info_req"]) -> None: ...
 
 class DiscussInfoReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CONF_UIN_FIELD_NUMBER: int
     LAST_SEQ_FIELD_NUMBER: int
-    conf_uin: int = ...
-    last_seq: int = ...
-
+    conf_uin: int
+    last_seq: int
     def __init__(self,
         *,
-        conf_uin : Optional[int] = ...,
-        last_seq : Optional[int] = ...,
+        conf_uin: Optional[int] = ...,
+        last_seq: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"conf_uin",b"conf_uin",u"last_seq",b"last_seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"conf_uin",b"conf_uin",u"last_seq",b"last_seq"]) -> None: ...
+    def HasField(self, field_name: Literal["conf_uin",b"conf_uin","last_seq",b"last_seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["conf_uin",b"conf_uin","last_seq",b"last_seq"]) -> None: ...
 
 class PbPullDiscussMsgSeqResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     DISCUSS_INFO_RESP_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-
+    result: int
+    errmsg: Text
     @property
     def discuss_info_resp(self) -> RepeatedCompositeFieldContainer[DiscussInfoResp]: ...
-
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        discuss_info_resp : Optional[Iterable[DiscussInfoResp]] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        discuss_info_resp: Optional[Iterable[DiscussInfoResp]] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"discuss_info_resp",b"discuss_info_resp",u"errmsg",b"errmsg",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["discuss_info_resp",b"discuss_info_resp","errmsg",b"errmsg","result",b"result"]) -> None: ...
 
 class DiscussInfoResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     CONF_UIN_FIELD_NUMBER: int
     MEMBER_SEQ_FIELD_NUMBER: int
     CONF_SEQ_FIELD_NUMBER: int
-    conf_uin: int = ...
-    member_seq: int = ...
-    conf_seq: int = ...
-
+    conf_uin: int
+    member_seq: int
+    conf_seq: int
     def __init__(self,
         *,
-        conf_uin : Optional[int] = ...,
-        member_seq : Optional[int] = ...,
-        conf_seq : Optional[int] = ...,
+        conf_uin: Optional[int] = ...,
+        member_seq: Optional[int] = ...,
+        conf_seq: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"conf_seq",b"conf_seq",u"conf_uin",b"conf_uin",u"member_seq",b"member_seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"conf_seq",b"conf_seq",u"conf_uin",b"conf_uin",u"member_seq",b"member_seq"]) -> None: ...
+    def HasField(self, field_name: Literal["conf_seq",b"conf_seq","conf_uin",b"conf_uin","member_seq",b"member_seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["conf_seq",b"conf_seq","conf_uin",b"conf_uin","member_seq",b"member_seq"]) -> None: ...
 
 class PbPullGroupMsgSeqReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GROUP_INFO_REQ_FIELD_NUMBER: int
-
     @property
     def group_info_req(self) -> RepeatedCompositeFieldContainer[GroupInfoReq]: ...
-
     def __init__(self,
         *,
-        group_info_req : Optional[Iterable[GroupInfoReq]] = ...,
+        group_info_req: Optional[Iterable[GroupInfoReq]] = ...,
         ) -> None: ...
-    def ClearField(self, field_name: Literal[u"group_info_req",b"group_info_req"]) -> None: ...
+    def ClearField(self, field_name: Literal["group_info_req",b"group_info_req"]) -> None: ...
 
 class GroupInfoReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GROUP_CODE_FIELD_NUMBER: int
     LAST_SEQ_FIELD_NUMBER: int
-    group_code: int = ...
-    last_seq: int = ...
-
+    group_code: int
+    last_seq: int
     def __init__(self,
         *,
-        group_code : Optional[int] = ...,
-        last_seq : Optional[int] = ...,
+        group_code: Optional[int] = ...,
+        last_seq: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"group_code",b"group_code",u"last_seq",b"last_seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"group_code",b"group_code",u"last_seq",b"last_seq"]) -> None: ...
+    def HasField(self, field_name: Literal["group_code",b"group_code","last_seq",b"last_seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_code",b"group_code","last_seq",b"last_seq"]) -> None: ...
 
 class PbPullGroupMsgSeqResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     GROUP_INFO_RESP_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-
+    result: int
+    errmsg: Text
     @property
     def group_info_resp(self) -> RepeatedCompositeFieldContainer[GroupInfoResp]: ...
-
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        group_info_resp : Optional[Iterable[GroupInfoResp]] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        group_info_resp: Optional[Iterable[GroupInfoResp]] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"group_info_resp",b"group_info_resp",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","group_info_resp",b"group_info_resp","result",b"result"]) -> None: ...
 
 class GroupInfoResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     GROUP_CODE_FIELD_NUMBER: int
     MEMBER_SEQ_FIELD_NUMBER: int
     GROUP_SEQ_FIELD_NUMBER: int
-    group_code: int = ...
-    member_seq: int = ...
-    group_seq: int = ...
-
+    group_code: int
+    member_seq: int
+    group_seq: int
     def __init__(self,
         *,
-        group_code : Optional[int] = ...,
-        member_seq : Optional[int] = ...,
-        group_seq : Optional[int] = ...,
+        group_code: Optional[int] = ...,
+        member_seq: Optional[int] = ...,
+        group_seq: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"group_code",b"group_code",u"group_seq",b"group_seq",u"member_seq",b"member_seq"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"group_code",b"group_code",u"group_seq",b"group_seq",u"member_seq",b"member_seq"]) -> None: ...
+    def HasField(self, field_name: Literal["group_code",b"group_code","group_seq",b"group_seq","member_seq",b"member_seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_code",b"group_code","group_seq",b"group_seq","member_seq",b"member_seq"]) -> None: ...
 
 class PbSearchRoamMsgInCloudReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SERIALIZE_REQBODY_FIELD_NUMBER: int
-    serialize_reqbody: bytes = ...
-
+    serialize_reqbody: bytes
     def __init__(self,
         *,
-        serialize_reqbody : Optional[bytes] = ...,
+        serialize_reqbody: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"serialize_reqbody",b"serialize_reqbody"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"serialize_reqbody",b"serialize_reqbody"]) -> None: ...
+    def HasField(self, field_name: Literal["serialize_reqbody",b"serialize_reqbody"]) -> bool: ...
+    def ClearField(self, field_name: Literal["serialize_reqbody",b"serialize_reqbody"]) -> None: ...
 
 class PbSearchRoamMsgInCloudResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     MSG_FIELD_NUMBER: int
     SERIALIZE_RSPBODY_FIELD_NUMBER: int
-    serialize_rspbody: bytes = ...
-
     @property
     def msg(self) -> RepeatedCompositeFieldContainer[Msg]: ...
-
+    serialize_rspbody: bytes
     def __init__(self,
         *,
-        msg : Optional[Iterable[Msg]] = ...,
-        serialize_rspbody : Optional[bytes] = ...,
+        msg: Optional[Iterable[Msg]] = ...,
+        serialize_rspbody: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"serialize_rspbody",b"serialize_rspbody"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"msg",b"msg",u"serialize_rspbody",b"serialize_rspbody"]) -> None: ...
+    def HasField(self, field_name: Literal["serialize_rspbody",b"serialize_rspbody"]) -> bool: ...
+    def ClearField(self, field_name: Literal["msg",b"msg","serialize_rspbody",b"serialize_rspbody"]) -> None: ...
 
 class PbSendMsgReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     ROUTING_HEAD_FIELD_NUMBER: int
     CONTENT_HEAD_FIELD_NUMBER: int
     BODY_FIELD_NUMBER: int
@@ -1590,59 +1484,50 @@ class PbSendMsgReq(Message):
     CTRL_FIELD_NUMBER: int
     RECEIPT_REQ_FIELD_NUMBER: int
     MULTI_SEND_SEQ_FIELD_NUMBER: int
-    seq: int = ...
-    rand: int = ...
-    sync_cookie: bytes = ...
-    via: int = ...
-    data_statist: int = ...
-    multi_send_seq: int = ...
-
     @property
     def routing_head(self) -> RoutingHead: ...
-
     @property
     def content_head(self) -> ContentHead: ...
-
     @property
     def body(self) -> MsgBody: ...
-
+    seq: int
+    rand: int
+    sync_cookie: bytes
     @property
     def app_share(self) -> AppShareInfo: ...
-
+    via: int
+    data_statist: int
     @property
     def multi_msg_assist(self) -> MultiMsgAssist: ...
-
     @property
     def input_notify_info(self) -> PbInputNotifyInfo: ...
-
     @property
     def ctrl(self) -> MsgCtrl: ...
-
     @property
     def receipt_req(self) -> ReceiptReq: ...
-
-    def __init__(self,
-        *,
-        routing_head : Optional[RoutingHead] = ...,
-        content_head : Optional[ContentHead] = ...,
-        body : Optional[MsgBody] = ...,
-        seq : Optional[int] = ...,
-        rand : Optional[int] = ...,
-        sync_cookie : Optional[bytes] = ...,
-        app_share : Optional[AppShareInfo] = ...,
-        via : Optional[int] = ...,
-        data_statist : Optional[int] = ...,
-        multi_msg_assist : Optional[MultiMsgAssist] = ...,
-        input_notify_info : Optional[PbInputNotifyInfo] = ...,
-        ctrl : Optional[MsgCtrl] = ...,
-        receipt_req : Optional[ReceiptReq] = ...,
-        multi_send_seq : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"app_share",b"app_share",u"body",b"body",u"content_head",b"content_head",u"ctrl",b"ctrl",u"data_statist",b"data_statist",u"input_notify_info",b"input_notify_info",u"multi_msg_assist",b"multi_msg_assist",u"multi_send_seq",b"multi_send_seq",u"rand",b"rand",u"receipt_req",b"receipt_req",u"routing_head",b"routing_head",u"seq",b"seq",u"sync_cookie",b"sync_cookie",u"via",b"via"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"app_share",b"app_share",u"body",b"body",u"content_head",b"content_head",u"ctrl",b"ctrl",u"data_statist",b"data_statist",u"input_notify_info",b"input_notify_info",u"multi_msg_assist",b"multi_msg_assist",u"multi_send_seq",b"multi_send_seq",u"rand",b"rand",u"receipt_req",b"receipt_req",u"routing_head",b"routing_head",u"seq",b"seq",u"sync_cookie",b"sync_cookie",u"via",b"via"]) -> None: ...
+    multi_send_seq: int
+    def __init__(self,
+        *,
+        routing_head: Optional[RoutingHead] = ...,
+        content_head: Optional[ContentHead] = ...,
+        body: Optional[MsgBody] = ...,
+        seq: Optional[int] = ...,
+        rand: Optional[int] = ...,
+        sync_cookie: Optional[bytes] = ...,
+        app_share: Optional[AppShareInfo] = ...,
+        via: Optional[int] = ...,
+        data_statist: Optional[int] = ...,
+        multi_msg_assist: Optional[MultiMsgAssist] = ...,
+        input_notify_info: Optional[PbInputNotifyInfo] = ...,
+        ctrl: Optional[MsgCtrl] = ...,
+        receipt_req: Optional[ReceiptReq] = ...,
+        multi_send_seq: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["app_share",b"app_share","body",b"body","content_head",b"content_head","ctrl",b"ctrl","data_statist",b"data_statist","input_notify_info",b"input_notify_info","multi_msg_assist",b"multi_msg_assist","multi_send_seq",b"multi_send_seq","rand",b"rand","receipt_req",b"receipt_req","routing_head",b"routing_head","seq",b"seq","sync_cookie",b"sync_cookie","via",b"via"]) -> bool: ...
+    def ClearField(self, field_name: Literal["app_share",b"app_share","body",b"body","content_head",b"content_head","ctrl",b"ctrl","data_statist",b"data_statist","input_notify_info",b"input_notify_info","multi_msg_assist",b"multi_msg_assist","multi_send_seq",b"multi_send_seq","rand",b"rand","receipt_req",b"receipt_req","routing_head",b"routing_head","seq",b"seq","sync_cookie",b"sync_cookie","via",b"via"]) -> None: ...
 
 class PbSendMsgResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     SEND_TIME_FIELD_NUMBER: int
@@ -1653,99 +1538,90 @@ class PbSendMsgResp(Message):
     RECEIPT_RESP_FIELD_NUMBER: int
     TEXT_ANALYSIS_RESULT_FIELD_NUMBER: int
     MSG_INFO_FLAG_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    send_time: int = ...
-    svrbusy_wait_time: int = ...
-    errtype: int = ...
-    text_analysis_result: int = ...
-    msg_info_flag: int = ...
-
+    result: int
+    errmsg: Text
+    send_time: int
+    svrbusy_wait_time: int
     @property
     def send_info(self) -> MsgSendInfo: ...
-
+    errtype: int
     @property
     def trans_svr_info(self) -> TransSvrInfo: ...
-
     @property
     def receipt_resp(self) -> ReceiptResp: ...
-
+    text_analysis_result: int
+    msg_info_flag: int
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        send_time : Optional[int] = ...,
-        svrbusy_wait_time : Optional[int] = ...,
-        send_info : Optional[MsgSendInfo] = ...,
-        errtype : Optional[int] = ...,
-        trans_svr_info : Optional[TransSvrInfo] = ...,
-        receipt_resp : Optional[ReceiptResp] = ...,
-        text_analysis_result : Optional[int] = ...,
-        msg_info_flag : Optional[int] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        send_time: Optional[int] = ...,
+        svrbusy_wait_time: Optional[int] = ...,
+        send_info: Optional[MsgSendInfo] = ...,
+        errtype: Optional[int] = ...,
+        trans_svr_info: Optional[TransSvrInfo] = ...,
+        receipt_resp: Optional[ReceiptResp] = ...,
+        text_analysis_result: Optional[int] = ...,
+        msg_info_flag: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"errtype",b"errtype",u"msg_info_flag",b"msg_info_flag",u"receipt_resp",b"receipt_resp",u"result",b"result",u"send_info",b"send_info",u"send_time",b"send_time",u"svrbusy_wait_time",b"svrbusy_wait_time",u"text_analysis_result",b"text_analysis_result",u"trans_svr_info",b"trans_svr_info"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"errtype",b"errtype",u"msg_info_flag",b"msg_info_flag",u"receipt_resp",b"receipt_resp",u"result",b"result",u"send_info",b"send_info",u"send_time",b"send_time",u"svrbusy_wait_time",b"svrbusy_wait_time",u"text_analysis_result",b"text_analysis_result",u"trans_svr_info",b"trans_svr_info"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","errtype",b"errtype","msg_info_flag",b"msg_info_flag","receipt_resp",b"receipt_resp","result",b"result","send_info",b"send_info","send_time",b"send_time","svrbusy_wait_time",b"svrbusy_wait_time","text_analysis_result",b"text_analysis_result","trans_svr_info",b"trans_svr_info"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","errtype",b"errtype","msg_info_flag",b"msg_info_flag","receipt_resp",b"receipt_resp","result",b"result","send_info",b"send_info","send_time",b"send_time","svrbusy_wait_time",b"svrbusy_wait_time","text_analysis_result",b"text_analysis_result","trans_svr_info",b"trans_svr_info"]) -> None: ...
 
 class PbThirdQQUnReadMsgNumReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     THIRDQQ_REQ_INFO_FIELD_NUMBER: int
     SOURCE_FIELD_NUMBER: int
-    source: int = ...
-
     @property
     def thirdqq_req_info(self) -> RepeatedCompositeFieldContainer[ThirdQQReqInfo]: ...
-
+    source: int
     def __init__(self,
         *,
-        thirdqq_req_info : Optional[Iterable[ThirdQQReqInfo]] = ...,
-        source : Optional[int] = ...,
+        thirdqq_req_info: Optional[Iterable[ThirdQQReqInfo]] = ...,
+        source: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"source",b"source"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"source",b"source",u"thirdqq_req_info",b"thirdqq_req_info"]) -> None: ...
+    def HasField(self, field_name: Literal["source",b"source"]) -> bool: ...
+    def ClearField(self, field_name: Literal["source",b"source","thirdqq_req_info",b"thirdqq_req_info"]) -> None: ...
 
 class ThirdQQReqInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     THIRD_UIN_FIELD_NUMBER: int
     THIRD_UIN_SIG_FIELD_NUMBER: int
     THIRD_UIN_COOKIE_FIELD_NUMBER: int
-    third_uin: int = ...
-    third_uin_sig: bytes = ...
-    third_uin_cookie: bytes = ...
-
+    third_uin: int
+    third_uin_sig: bytes
+    third_uin_cookie: bytes
     def __init__(self,
         *,
-        third_uin : Optional[int] = ...,
-        third_uin_sig : Optional[bytes] = ...,
-        third_uin_cookie : Optional[bytes] = ...,
+        third_uin: Optional[int] = ...,
+        third_uin_sig: Optional[bytes] = ...,
+        third_uin_cookie: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"third_uin",b"third_uin",u"third_uin_cookie",b"third_uin_cookie",u"third_uin_sig",b"third_uin_sig"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"third_uin",b"third_uin",u"third_uin_cookie",b"third_uin_cookie",u"third_uin_sig",b"third_uin_sig"]) -> None: ...
+    def HasField(self, field_name: Literal["third_uin",b"third_uin","third_uin_cookie",b"third_uin_cookie","third_uin_sig",b"third_uin_sig"]) -> bool: ...
+    def ClearField(self, field_name: Literal["third_uin",b"third_uin","third_uin_cookie",b"third_uin_cookie","third_uin_sig",b"third_uin_sig"]) -> None: ...
 
 class PbThirdQQUnReadMsgNumResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     THIRDQQ_RESP_INFO_FIELD_NUMBER: int
     INTERVAL_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    interval: int = ...
-
+    result: int
+    errmsg: Text
     @property
     def thirdqq_resp_info(self) -> RepeatedCompositeFieldContainer[ThirdQQRespInfo]: ...
-
+    interval: int
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        thirdqq_resp_info : Optional[Iterable[ThirdQQRespInfo]] = ...,
-        interval : Optional[int] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        thirdqq_resp_info: Optional[Iterable[ThirdQQRespInfo]] = ...,
+        interval: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"interval",b"interval",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"interval",b"interval",u"result",b"result",u"thirdqq_resp_info",b"thirdqq_resp_info"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","interval",b"interval","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","interval",b"interval","result",b"result","thirdqq_resp_info",b"thirdqq_resp_info"]) -> None: ...
 
 class ThirdQQRespInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     THIRD_UIN_FIELD_NUMBER: int
     THIRD_UIN_COOKIE_FIELD_NUMBER: int
     NUM_FIELD_NUMBER: int
@@ -1753,160 +1629,143 @@ class ThirdQQRespInfo(Message):
     REDBAG_TIME_FIELD_NUMBER: int
     STATUS_FIELD_NUMBER: int
     LAST_MSG_TIME_FIELD_NUMBER: int
-    third_uin: int = ...
-    third_uin_cookie: bytes = ...
-    num: int = ...
-    flag: int = ...
-    redbag_time: int = ...
-    status: int = ...
-    last_msg_time: int = ...
-
-    def __init__(self,
-        *,
-        third_uin : Optional[int] = ...,
-        third_uin_cookie : Optional[bytes] = ...,
-        num : Optional[int] = ...,
-        flag : Optional[int] = ...,
-        redbag_time : Optional[int] = ...,
-        status : Optional[int] = ...,
-        last_msg_time : Optional[int] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"flag",b"flag",u"last_msg_time",b"last_msg_time",u"num",b"num",u"redbag_time",b"redbag_time",u"status",b"status",u"third_uin",b"third_uin",u"third_uin_cookie",b"third_uin_cookie"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"flag",b"flag",u"last_msg_time",b"last_msg_time",u"num",b"num",u"redbag_time",b"redbag_time",u"status",b"status",u"third_uin",b"third_uin",u"third_uin_cookie",b"third_uin_cookie"]) -> None: ...
+    third_uin: int
+    third_uin_cookie: bytes
+    num: int
+    flag: int
+    redbag_time: int
+    status: int
+    last_msg_time: int
+    def __init__(self,
+        *,
+        third_uin: Optional[int] = ...,
+        third_uin_cookie: Optional[bytes] = ...,
+        num: Optional[int] = ...,
+        flag: Optional[int] = ...,
+        redbag_time: Optional[int] = ...,
+        status: Optional[int] = ...,
+        last_msg_time: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["flag",b"flag","last_msg_time",b"last_msg_time","num",b"num","redbag_time",b"redbag_time","status",b"status","third_uin",b"third_uin","third_uin_cookie",b"third_uin_cookie"]) -> bool: ...
+    def ClearField(self, field_name: Literal["flag",b"flag","last_msg_time",b"last_msg_time","num",b"num","redbag_time",b"redbag_time","status",b"status","third_uin",b"third_uin","third_uin_cookie",b"third_uin_cookie"]) -> None: ...
 
 class PbUnReadMsgSeqReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     C2C_UNREAD_INFO_FIELD_NUMBER: int
     BINDUIN_UNREAD_INFO_FIELD_NUMBER: int
     GROUP_UNREAD_INFO_FIELD_NUMBER: int
     DISCUSS_UNREAD_INFO_FIELD_NUMBER: int
     THIRDQQ_UNREAD_INFO_FIELD_NUMBER: int
-
     @property
     def c2c_unread_info(self) -> PbC2CUnReadMsgNumReq: ...
-
     @property
     def binduin_unread_info(self) -> RepeatedCompositeFieldContainer[PbBindUinUnReadMsgNumReq]: ...
-
     @property
     def group_unread_info(self) -> PbPullGroupMsgSeqReq: ...
-
     @property
     def discuss_unread_info(self) -> PbPullDiscussMsgSeqReq: ...
-
     @property
     def thirdqq_unread_info(self) -> PbThirdQQUnReadMsgNumReq: ...
-
     def __init__(self,
         *,
-        c2c_unread_info : Optional[PbC2CUnReadMsgNumReq] = ...,
-        binduin_unread_info : Optional[Iterable[PbBindUinUnReadMsgNumReq]] = ...,
-        group_unread_info : Optional[PbPullGroupMsgSeqReq] = ...,
-        discuss_unread_info : Optional[PbPullDiscussMsgSeqReq] = ...,
-        thirdqq_unread_info : Optional[PbThirdQQUnReadMsgNumReq] = ...,
+        c2c_unread_info: Optional[PbC2CUnReadMsgNumReq] = ...,
+        binduin_unread_info: Optional[Iterable[PbBindUinUnReadMsgNumReq]] = ...,
+        group_unread_info: Optional[PbPullGroupMsgSeqReq] = ...,
+        discuss_unread_info: Optional[PbPullDiscussMsgSeqReq] = ...,
+        thirdqq_unread_info: Optional[PbThirdQQUnReadMsgNumReq] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2c_unread_info",b"c2c_unread_info",u"discuss_unread_info",b"discuss_unread_info",u"group_unread_info",b"group_unread_info",u"thirdqq_unread_info",b"thirdqq_unread_info"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"binduin_unread_info",b"binduin_unread_info",u"c2c_unread_info",b"c2c_unread_info",u"discuss_unread_info",b"discuss_unread_info",u"group_unread_info",b"group_unread_info",u"thirdqq_unread_info",b"thirdqq_unread_info"]) -> None: ...
+    def HasField(self, field_name: Literal["c2c_unread_info",b"c2c_unread_info","discuss_unread_info",b"discuss_unread_info","group_unread_info",b"group_unread_info","thirdqq_unread_info",b"thirdqq_unread_info"]) -> bool: ...
+    def ClearField(self, field_name: Literal["binduin_unread_info",b"binduin_unread_info","c2c_unread_info",b"c2c_unread_info","discuss_unread_info",b"discuss_unread_info","group_unread_info",b"group_unread_info","thirdqq_unread_info",b"thirdqq_unread_info"]) -> None: ...
 
 class PbUnReadMsgSeqResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     C2C_UNREAD_INFO_FIELD_NUMBER: int
     BINDUIN_UNREAD_INFO_FIELD_NUMBER: int
     GROUP_UNREAD_INFO_FIELD_NUMBER: int
     DISCUSS_UNREAD_INFO_FIELD_NUMBER: int
     THIRDQQ_UNREAD_INFO_FIELD_NUMBER: int
-
     @property
     def c2c_unread_info(self) -> PbC2CUnReadMsgNumResp: ...
-
     @property
     def binduin_unread_info(self) -> RepeatedCompositeFieldContainer[PbBindUinUnReadMsgNumResp]: ...
-
     @property
     def group_unread_info(self) -> PbPullGroupMsgSeqResp: ...
-
     @property
     def discuss_unread_info(self) -> PbPullDiscussMsgSeqResp: ...
-
     @property
     def thirdqq_unread_info(self) -> PbThirdQQUnReadMsgNumResp: ...
-
     def __init__(self,
         *,
-        c2c_unread_info : Optional[PbC2CUnReadMsgNumResp] = ...,
-        binduin_unread_info : Optional[Iterable[PbBindUinUnReadMsgNumResp]] = ...,
-        group_unread_info : Optional[PbPullGroupMsgSeqResp] = ...,
-        discuss_unread_info : Optional[PbPullDiscussMsgSeqResp] = ...,
-        thirdqq_unread_info : Optional[PbThirdQQUnReadMsgNumResp] = ...,
+        c2c_unread_info: Optional[PbC2CUnReadMsgNumResp] = ...,
+        binduin_unread_info: Optional[Iterable[PbBindUinUnReadMsgNumResp]] = ...,
+        group_unread_info: Optional[PbPullGroupMsgSeqResp] = ...,
+        discuss_unread_info: Optional[PbPullDiscussMsgSeqResp] = ...,
+        thirdqq_unread_info: Optional[PbThirdQQUnReadMsgNumResp] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2c_unread_info",b"c2c_unread_info",u"discuss_unread_info",b"discuss_unread_info",u"group_unread_info",b"group_unread_info",u"thirdqq_unread_info",b"thirdqq_unread_info"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"binduin_unread_info",b"binduin_unread_info",u"c2c_unread_info",b"c2c_unread_info",u"discuss_unread_info",b"discuss_unread_info",u"group_unread_info",b"group_unread_info",u"thirdqq_unread_info",b"thirdqq_unread_info"]) -> None: ...
+    def HasField(self, field_name: Literal["c2c_unread_info",b"c2c_unread_info","discuss_unread_info",b"discuss_unread_info","group_unread_info",b"group_unread_info","thirdqq_unread_info",b"thirdqq_unread_info"]) -> bool: ...
+    def ClearField(self, field_name: Literal["binduin_unread_info",b"binduin_unread_info","c2c_unread_info",b"c2c_unread_info","discuss_unread_info",b"discuss_unread_info","group_unread_info",b"group_unread_info","thirdqq_unread_info",b"thirdqq_unread_info"]) -> None: ...
 
 class PubGroupTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
     GROUP_UIN_FIELD_NUMBER: int
-    to_uin: int = ...
-    sig: bytes = ...
-    group_uin: int = ...
-
+    to_uin: int
+    sig: bytes
+    group_uin: int
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
-        group_uin : Optional[int] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
+        group_uin: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"group_uin",b"group_uin",u"sig",b"sig",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"group_uin",b"group_uin",u"sig",b"sig",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["group_uin",b"group_uin","sig",b"sig","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_uin",b"group_uin","sig",b"sig","to_uin",b"to_uin"]) -> None: ...
 
 class PublicPlat(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
-    to_uin: int = ...
-    sig: bytes = ...
-
+    to_uin: int
+    sig: bytes
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> None: ...
 
 class QQQueryBusinessTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
-    to_uin: int = ...
-    sig: bytes = ...
-
+    to_uin: int
+    sig: bytes
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> None: ...
 
 class RichStatusTmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
-    to_uin: int = ...
-    sig: bytes = ...
-
+    to_uin: int
+    sig: bytes
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> None: ...
 
 class RoutingHead(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     C2C_FIELD_NUMBER: int
     GRP_FIELD_NUMBER: int
     GRP_TMP_FIELD_NUMBER: int
@@ -1928,99 +1787,85 @@ class RoutingHead(Message):
     NEARBY_DATING_TMP_FIELD_NUMBER: int
     NEARBY_ASSISTANT_TMP_FIELD_NUMBER: int
     COMM_TMP_FIELD_NUMBER: int
-
     @property
     def c2c(self) -> C2C: ...
-
     @property
     def grp(self) -> Grp: ...
-
     @property
     def grp_tmp(self) -> GrpTmp: ...
-
     @property
     def dis(self) -> Dis: ...
-
     @property
     def dis_tmp(self) -> DisTmp: ...
-
     @property
     def wpa_tmp(self) -> WPATmp: ...
-
     @property
-    def public_plat(self) -> PublicPlat: ...
-
+    def public_plat(self) -> PublicPlat:
+        """optional SecretFileHead secret_file = 7;"""
+        pass
     @property
     def trans_msg(self) -> TransMsg: ...
-
     @property
     def address_list(self) -> AddressListTmp: ...
-
     @property
     def rich_status_tmp(self) -> RichStatusTmp: ...
-
     @property
     def trans_cmd(self) -> TransCmd: ...
-
     @property
     def accost_tmp(self) -> AccostTmp: ...
-
     @property
     def pub_group_tmp(self) -> PubGroupTmp: ...
-
     @property
     def trans_0_x211(self) -> Trans0x211: ...
-
     @property
     def business_wpa_tmp(self) -> BusinessWPATmp: ...
-
     @property
     def auth_tmp(self) -> AuthTmp: ...
-
     @property
     def bsns_tmp(self) -> BsnsTmp: ...
-
     @property
     def qq_querybusiness_tmp(self) -> QQQueryBusinessTmp: ...
-
     @property
     def nearby_dating_tmp(self) -> NearByDatingTmp: ...
-
     @property
     def nearby_assistant_tmp(self) -> NearByAssistantTmp: ...
-
     @property
     def comm_tmp(self) -> CommTmp: ...
-
     def __init__(self,
         *,
-        c2c : Optional[C2C] = ...,
-        grp : Optional[Grp] = ...,
-        grp_tmp : Optional[GrpTmp] = ...,
-        dis : Optional[Dis] = ...,
-        dis_tmp : Optional[DisTmp] = ...,
-        wpa_tmp : Optional[WPATmp] = ...,
-        public_plat : Optional[PublicPlat] = ...,
-        trans_msg : Optional[TransMsg] = ...,
-        address_list : Optional[AddressListTmp] = ...,
-        rich_status_tmp : Optional[RichStatusTmp] = ...,
-        trans_cmd : Optional[TransCmd] = ...,
-        accost_tmp : Optional[AccostTmp] = ...,
-        pub_group_tmp : Optional[PubGroupTmp] = ...,
-        trans_0_x211 : Optional[Trans0x211] = ...,
-        business_wpa_tmp : Optional[BusinessWPATmp] = ...,
-        auth_tmp : Optional[AuthTmp] = ...,
-        bsns_tmp : Optional[BsnsTmp] = ...,
-        qq_querybusiness_tmp : Optional[QQQueryBusinessTmp] = ...,
-        nearby_dating_tmp : Optional[NearByDatingTmp] = ...,
-        nearby_assistant_tmp : Optional[NearByAssistantTmp] = ...,
-        comm_tmp : Optional[CommTmp] = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal[u"accost_tmp",b"accost_tmp",u"address_list",b"address_list",u"auth_tmp",b"auth_tmp",u"bsns_tmp",b"bsns_tmp",u"business_wpa_tmp",b"business_wpa_tmp",u"c2c",b"c2c",u"comm_tmp",b"comm_tmp",u"dis",b"dis",u"dis_tmp",b"dis_tmp",u"grp",b"grp",u"grp_tmp",b"grp_tmp",u"nearby_assistant_tmp",b"nearby_assistant_tmp",u"nearby_dating_tmp",b"nearby_dating_tmp",u"pub_group_tmp",b"pub_group_tmp",u"public_plat",b"public_plat",u"qq_querybusiness_tmp",b"qq_querybusiness_tmp",u"rich_status_tmp",b"rich_status_tmp",u"trans_0_x211",b"trans_0_x211",u"trans_cmd",b"trans_cmd",u"trans_msg",b"trans_msg",u"wpa_tmp",b"wpa_tmp"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"accost_tmp",b"accost_tmp",u"address_list",b"address_list",u"auth_tmp",b"auth_tmp",u"bsns_tmp",b"bsns_tmp",u"business_wpa_tmp",b"business_wpa_tmp",u"c2c",b"c2c",u"comm_tmp",b"comm_tmp",u"dis",b"dis",u"dis_tmp",b"dis_tmp",u"grp",b"grp",u"grp_tmp",b"grp_tmp",u"nearby_assistant_tmp",b"nearby_assistant_tmp",u"nearby_dating_tmp",b"nearby_dating_tmp",u"pub_group_tmp",b"pub_group_tmp",u"public_plat",b"public_plat",u"qq_querybusiness_tmp",b"qq_querybusiness_tmp",u"rich_status_tmp",b"rich_status_tmp",u"trans_0_x211",b"trans_0_x211",u"trans_cmd",b"trans_cmd",u"trans_msg",b"trans_msg",u"wpa_tmp",b"wpa_tmp"]) -> None: ...
+        c2c: Optional[C2C] = ...,
+        grp: Optional[Grp] = ...,
+        grp_tmp: Optional[GrpTmp] = ...,
+        dis: Optional[Dis] = ...,
+        dis_tmp: Optional[DisTmp] = ...,
+        wpa_tmp: Optional[WPATmp] = ...,
+        public_plat: Optional[PublicPlat] = ...,
+        trans_msg: Optional[TransMsg] = ...,
+        address_list: Optional[AddressListTmp] = ...,
+        rich_status_tmp: Optional[RichStatusTmp] = ...,
+        trans_cmd: Optional[TransCmd] = ...,
+        accost_tmp: Optional[AccostTmp] = ...,
+        pub_group_tmp: Optional[PubGroupTmp] = ...,
+        trans_0_x211: Optional[Trans0x211] = ...,
+        business_wpa_tmp: Optional[BusinessWPATmp] = ...,
+        auth_tmp: Optional[AuthTmp] = ...,
+        bsns_tmp: Optional[BsnsTmp] = ...,
+        qq_querybusiness_tmp: Optional[QQQueryBusinessTmp] = ...,
+        nearby_dating_tmp: Optional[NearByDatingTmp] = ...,
+        nearby_assistant_tmp: Optional[NearByAssistantTmp] = ...,
+        comm_tmp: Optional[CommTmp] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["accost_tmp",b"accost_tmp","address_list",b"address_list","auth_tmp",b"auth_tmp","bsns_tmp",b"bsns_tmp","business_wpa_tmp",b"business_wpa_tmp","c2c",b"c2c","comm_tmp",b"comm_tmp","dis",b"dis","dis_tmp",b"dis_tmp","grp",b"grp","grp_tmp",b"grp_tmp","nearby_assistant_tmp",b"nearby_assistant_tmp","nearby_dating_tmp",b"nearby_dating_tmp","pub_group_tmp",b"pub_group_tmp","public_plat",b"public_plat","qq_querybusiness_tmp",b"qq_querybusiness_tmp","rich_status_tmp",b"rich_status_tmp","trans_0_x211",b"trans_0_x211","trans_cmd",b"trans_cmd","trans_msg",b"trans_msg","wpa_tmp",b"wpa_tmp"]) -> bool: ...
+    def ClearField(self, field_name: Literal["accost_tmp",b"accost_tmp","address_list",b"address_list","auth_tmp",b"auth_tmp","bsns_tmp",b"bsns_tmp","business_wpa_tmp",b"business_wpa_tmp","c2c",b"c2c","comm_tmp",b"comm_tmp","dis",b"dis","dis_tmp",b"dis_tmp","grp",b"grp","grp_tmp",b"grp_tmp","nearby_assistant_tmp",b"nearby_assistant_tmp","nearby_dating_tmp",b"nearby_dating_tmp","pub_group_tmp",b"pub_group_tmp","public_plat",b"public_plat","qq_querybusiness_tmp",b"qq_querybusiness_tmp","rich_status_tmp",b"rich_status_tmp","trans_0_x211",b"trans_0_x211","trans_cmd",b"trans_cmd","trans_msg",b"trans_msg","wpa_tmp",b"wpa_tmp"]) -> None: ...
 
 class Trans0x211(Message):
-    DESCRIPTOR: Descriptor = ...
+    """message SecretFileHead {
+      optional SubMsgType0xc1.MsgBody secret_file_msg = 1;
+      optional SubMsgType0x1a.MsgBody secret_file_status = 2;
+    }
+
+    """
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     CC_CMD_FIELD_NUMBER: int
     INST_CTRL_FIELD_NUMBER: int
@@ -2028,145 +1873,136 @@ class Trans0x211(Message):
     C2C_TYPE_FIELD_NUMBER: int
     SERVICE_TYPE_FIELD_NUMBER: int
     DATALINE_FLAG_FIELD_NUMBER: int
-    to_uin: int = ...
-    cc_cmd: int = ...
-    sig: bytes = ...
-    c2c_type: int = ...
-    service_type: int = ...
-    dataline_flag: int = ...
-
+    to_uin: int
+    cc_cmd: int
     @property
     def inst_ctrl(self) -> InstCtrl: ...
-
+    sig: bytes
+    c2c_type: int
+    service_type: int
+    dataline_flag: int
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        cc_cmd : Optional[int] = ...,
-        inst_ctrl : Optional[InstCtrl] = ...,
-        sig : Optional[bytes] = ...,
-        c2c_type : Optional[int] = ...,
-        service_type : Optional[int] = ...,
-        dataline_flag : Optional[int] = ...,
+        to_uin: Optional[int] = ...,
+        cc_cmd: Optional[int] = ...,
+        inst_ctrl: Optional[InstCtrl] = ...,
+        sig: Optional[bytes] = ...,
+        c2c_type: Optional[int] = ...,
+        service_type: Optional[int] = ...,
+        dataline_flag: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2c_type",b"c2c_type",u"cc_cmd",b"cc_cmd",u"dataline_flag",b"dataline_flag",u"inst_ctrl",b"inst_ctrl",u"service_type",b"service_type",u"sig",b"sig",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2c_type",b"c2c_type",u"cc_cmd",b"cc_cmd",u"dataline_flag",b"dataline_flag",u"inst_ctrl",b"inst_ctrl",u"service_type",b"service_type",u"sig",b"sig",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["c2c_type",b"c2c_type","cc_cmd",b"cc_cmd","dataline_flag",b"dataline_flag","inst_ctrl",b"inst_ctrl","service_type",b"service_type","sig",b"sig","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2c_type",b"c2c_type","cc_cmd",b"cc_cmd","dataline_flag",b"dataline_flag","inst_ctrl",b"inst_ctrl","service_type",b"service_type","sig",b"sig","to_uin",b"to_uin"]) -> None: ...
 
 class TransCmd(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     TYPE_FIELD_NUMBER: int
-    to_uin: int = ...
-    type: int = ...
-
+    to_uin: int
+    type: int
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        type : Optional[int] = ...,
+        to_uin: Optional[int] = ...,
+        type: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"to_uin",b"to_uin",u"type",b"type"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"to_uin",b"to_uin",u"type",b"type"]) -> None: ...
+    def HasField(self, field_name: Literal["to_uin",b"to_uin","type",b"type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["to_uin",b"to_uin","type",b"type"]) -> None: ...
 
 class TransMsg(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     C2C_CMD_FIELD_NUMBER: int
-    to_uin: int = ...
-    c2c_cmd: int = ...
-
+    to_uin: int
+    c2c_cmd: int
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        c2c_cmd : Optional[int] = ...,
+        to_uin: Optional[int] = ...,
+        c2c_cmd: Optional[int] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"c2c_cmd",b"c2c_cmd",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"c2c_cmd",b"c2c_cmd",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["c2c_cmd",b"c2c_cmd","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["c2c_cmd",b"c2c_cmd","to_uin",b"to_uin"]) -> None: ...
 
 class TransReq(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     COMMAND_FIELD_NUMBER: int
     REQ_TAG_FIELD_NUMBER: int
     REQ_BUFF_FIELD_NUMBER: int
-    command: int = ...
-    req_tag: int = ...
-    req_buff: bytes = ...
-
+    command: int
+    req_tag: int
+    req_buff: bytes
     def __init__(self,
         *,
-        command : Optional[int] = ...,
-        req_tag : Optional[int] = ...,
-        req_buff : Optional[bytes] = ...,
+        command: Optional[int] = ...,
+        req_tag: Optional[int] = ...,
+        req_buff: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"command",b"command",u"req_buff",b"req_buff",u"req_tag",b"req_tag"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"command",b"command",u"req_buff",b"req_buff",u"req_tag",b"req_tag"]) -> None: ...
+    def HasField(self, field_name: Literal["command",b"command","req_buff",b"req_buff","req_tag",b"req_tag"]) -> bool: ...
+    def ClearField(self, field_name: Literal["command",b"command","req_buff",b"req_buff","req_tag",b"req_tag"]) -> None: ...
 
 class TransResp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     RESULT_FIELD_NUMBER: int
     ERRMSG_FIELD_NUMBER: int
     RESP_TAG_FIELD_NUMBER: int
     RESP_BUFF_FIELD_NUMBER: int
-    result: int = ...
-    errmsg: Text = ...
-    resp_tag: int = ...
-    resp_buff: bytes = ...
-
+    result: int
+    errmsg: Text
+    resp_tag: int
+    resp_buff: bytes
     def __init__(self,
         *,
-        result : Optional[int] = ...,
-        errmsg : Optional[Text] = ...,
-        resp_tag : Optional[int] = ...,
-        resp_buff : Optional[bytes] = ...,
+        result: Optional[int] = ...,
+        errmsg: Optional[Text] = ...,
+        resp_tag: Optional[int] = ...,
+        resp_buff: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"errmsg",b"errmsg",u"resp_buff",b"resp_buff",u"resp_tag",b"resp_tag",u"result",b"result"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"errmsg",b"errmsg",u"resp_buff",b"resp_buff",u"resp_tag",b"resp_tag",u"result",b"result"]) -> None: ...
+    def HasField(self, field_name: Literal["errmsg",b"errmsg","resp_buff",b"resp_buff","resp_tag",b"resp_tag","result",b"result"]) -> bool: ...
+    def ClearField(self, field_name: Literal["errmsg",b"errmsg","resp_buff",b"resp_buff","resp_tag",b"resp_tag","result",b"result"]) -> None: ...
 
 class TransSvrInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     SUB_TYPE_FIELD_NUMBER: int
     RET_CODE_FIELD_NUMBER: int
     ERR_MSG_FIELD_NUMBER: int
     TRANS_INFO_FIELD_NUMBER: int
-    sub_type: int = ...
-    ret_code: int = ...
-    err_msg: bytes = ...
-    trans_info: bytes = ...
-
+    sub_type: int
+    ret_code: int
+    err_msg: bytes
+    trans_info: bytes
     def __init__(self,
         *,
-        sub_type : Optional[int] = ...,
-        ret_code : Optional[int] = ...,
-        err_msg : Optional[bytes] = ...,
-        trans_info : Optional[bytes] = ...,
+        sub_type: Optional[int] = ...,
+        ret_code: Optional[int] = ...,
+        err_msg: Optional[bytes] = ...,
+        trans_info: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"err_msg",b"err_msg",u"ret_code",b"ret_code",u"sub_type",b"sub_type",u"trans_info",b"trans_info"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"err_msg",b"err_msg",u"ret_code",b"ret_code",u"sub_type",b"sub_type",u"trans_info",b"trans_info"]) -> None: ...
+    def HasField(self, field_name: Literal["err_msg",b"err_msg","ret_code",b"ret_code","sub_type",b"sub_type","trans_info",b"trans_info"]) -> bool: ...
+    def ClearField(self, field_name: Literal["err_msg",b"err_msg","ret_code",b"ret_code","sub_type",b"sub_type","trans_info",b"trans_info"]) -> None: ...
 
 class WPATmp(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     TO_UIN_FIELD_NUMBER: int
     SIG_FIELD_NUMBER: int
-    to_uin: int = ...
-    sig: bytes = ...
-
+    to_uin: int
+    sig: bytes
     def __init__(self,
         *,
-        to_uin : Optional[int] = ...,
-        sig : Optional[bytes] = ...,
+        to_uin: Optional[int] = ...,
+        sig: Optional[bytes] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"sig",b"sig",u"to_uin",b"to_uin"]) -> None: ...
+    def HasField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["sig",b"sig","to_uin",b"to_uin"]) -> None: ...
 
 class WithDrawWordingInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    DESCRIPTOR: Descriptor
     ITEM_ID_FIELD_NUMBER: int
     ITEM_NAME_FIELD_NUMBER: int
-    item_id: int = ...
-    item_name: Text = ...
-
+    item_id: int
+    item_name: Text
     def __init__(self,
         *,
-        item_id : Optional[int] = ...,
-        item_name : Optional[Text] = ...,
+        item_id: Optional[int] = ...,
+        item_name: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"item_id",b"item_id",u"item_name",b"item_name"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"item_id",b"item_id",u"item_name",b"item_name"]) -> None: ...
+    def HasField(self, field_name: Literal["item_id",b"item_id","item_name",b"item_name"]) -> bool: ...
+    def ClearField(self, field_name: Literal["item_id",b"item_id","item_name",b"item_name"]) -> None: ...
diff --git a/cai/pb/wtlogin/data_pb2.py b/cai/pb/wtlogin/data_pb2.py
index b865a13c..bf938f56 100644
--- a/cai/pb/wtlogin/data_pb2.py
+++ b/cai/pb/wtlogin/data_pb2.py
@@ -3,6 +3,7 @@
 # source: cai/pb/wtlogin/data.proto
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -13,183 +14,12 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='cai/pb/wtlogin/data.proto',
-  package='wtlogin',
-  syntax='proto2',
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x19\x63\x61i/pb/wtlogin/data.proto\x12\x07wtlogin\"\xc3\x01\n\x0c\x44\x65viceReport\x12\x12\n\nbootloader\x18\x01 \x01(\t\x12\x14\n\x0cproc_version\x18\x02 \x01(\t\x12\x10\n\x08\x63odename\x18\x03 \x01(\t\x12\x13\n\x0bincremental\x18\x04 \x01(\t\x12\x13\n\x0b\x66ingerprint\x18\x05 \x01(\t\x12\x0f\n\x07\x62oot_id\x18\x06 \x01(\t\x12\x12\n\nandroid_id\x18\x07 \x01(\t\x12\x11\n\tbase_band\x18\x08 \x01(\t\x12\x15\n\rinner_version\x18\t \x01(\t\"\x98\x01\n\x0cSecTransInfo\x12\x13\n\x0bphone_brand\x18\x01 \x01(\t\x12\x12\n\nmodel_type\x18\x02 \x01(\t\x12\x10\n\x08wifi_mac\x18\x03 \x01(\t\x12\r\n\x05\x62ssid\x18\x04 \x01(\t\x12\x13\n\x0bos_language\x18\x05 \x01(\t\x12\x13\n\x0bqq_language\x18\x06 \x01(\r\x12\x14\n\x0cgps_location\x18\x07 \x01(\t'
-)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19\x63\x61i/pb/wtlogin/data.proto\x12\x07wtlogin\"\xc3\x01\n\x0c\x44\x65viceReport\x12\x12\n\nbootloader\x18\x01 \x01(\t\x12\x14\n\x0cproc_version\x18\x02 \x01(\t\x12\x10\n\x08\x63odename\x18\x03 \x01(\t\x12\x13\n\x0bincremental\x18\x04 \x01(\t\x12\x13\n\x0b\x66ingerprint\x18\x05 \x01(\t\x12\x0f\n\x07\x62oot_id\x18\x06 \x01(\t\x12\x12\n\nandroid_id\x18\x07 \x01(\t\x12\x11\n\tbase_band\x18\x08 \x01(\t\x12\x15\n\rinner_version\x18\t \x01(\t\"\x98\x01\n\x0cSecTransInfo\x12\x13\n\x0bphone_brand\x18\x01 \x01(\t\x12\x12\n\nmodel_type\x18\x02 \x01(\t\x12\x10\n\x08wifi_mac\x18\x03 \x01(\t\x12\r\n\x05\x62ssid\x18\x04 \x01(\t\x12\x13\n\x0bos_language\x18\x05 \x01(\t\x12\x13\n\x0bqq_language\x18\x06 \x01(\r\x12\x14\n\x0cgps_location\x18\x07 \x01(\t')
 
 
 
-
-_DEVICEREPORT = _descriptor.Descriptor(
-  name='DeviceReport',
-  full_name='wtlogin.DeviceReport',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='bootloader', full_name='wtlogin.DeviceReport.bootloader', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='proc_version', full_name='wtlogin.DeviceReport.proc_version', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='codename', full_name='wtlogin.DeviceReport.codename', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='incremental', full_name='wtlogin.DeviceReport.incremental', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='fingerprint', full_name='wtlogin.DeviceReport.fingerprint', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='boot_id', full_name='wtlogin.DeviceReport.boot_id', index=5,
-      number=6, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='android_id', full_name='wtlogin.DeviceReport.android_id', index=6,
-      number=7, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='base_band', full_name='wtlogin.DeviceReport.base_band', index=7,
-      number=8, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='inner_version', full_name='wtlogin.DeviceReport.inner_version', index=8,
-      number=9, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=39,
-  serialized_end=234,
-)
-
-
-_SECTRANSINFO = _descriptor.Descriptor(
-  name='SecTransInfo',
-  full_name='wtlogin.SecTransInfo',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='phone_brand', full_name='wtlogin.SecTransInfo.phone_brand', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='model_type', full_name='wtlogin.SecTransInfo.model_type', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='wifi_mac', full_name='wtlogin.SecTransInfo.wifi_mac', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='bssid', full_name='wtlogin.SecTransInfo.bssid', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='os_language', full_name='wtlogin.SecTransInfo.os_language', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='qq_language', full_name='wtlogin.SecTransInfo.qq_language', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='gps_location', full_name='wtlogin.SecTransInfo.gps_location', index=6,
-      number=7, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto2',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=237,
-  serialized_end=389,
-)
-
-DESCRIPTOR.message_types_by_name['DeviceReport'] = _DEVICEREPORT
-DESCRIPTOR.message_types_by_name['SecTransInfo'] = _SECTRANSINFO
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
+_DEVICEREPORT = DESCRIPTOR.message_types_by_name['DeviceReport']
+_SECTRANSINFO = DESCRIPTOR.message_types_by_name['SecTransInfo']
 DeviceReport = _reflection.GeneratedProtocolMessageType('DeviceReport', (_message.Message,), {
   'DESCRIPTOR' : _DEVICEREPORT,
   '__module__' : 'cai.pb.wtlogin.data_pb2'
@@ -204,5 +34,11 @@
   })
 _sym_db.RegisterMessage(SecTransInfo)
 
+if _descriptor._USE_C_DESCRIPTORS == False:
 
+  DESCRIPTOR._options = None
+  _DEVICEREPORT._serialized_start=39
+  _DEVICEREPORT._serialized_end=234
+  _SECTRANSINFO._serialized_start=237
+  _SECTRANSINFO._serialized_end=389
 # @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/wtlogin/data_pb2.pyi b/cai/pb/wtlogin/data_pb2.pyi
index c000f034..2d6b8d36 100644
--- a/cai/pb/wtlogin/data_pb2.pyi
+++ b/cai/pb/wtlogin/data_pb2.pyi
@@ -26,10 +26,11 @@ from typing_extensions import (
 )
 
 
-DESCRIPTOR: FileDescriptor = ...
+DESCRIPTOR: FileDescriptor
 
 class DeviceReport(Message):
-    DESCRIPTOR: Descriptor = ...
+    """oicq/wlogin_sdk/pb/device_report.java"""
+    DESCRIPTOR: Descriptor
     BOOTLOADER_FIELD_NUMBER: int
     PROC_VERSION_FIELD_NUMBER: int
     CODENAME_FIELD_NUMBER: int
@@ -39,33 +40,33 @@ class DeviceReport(Message):
     ANDROID_ID_FIELD_NUMBER: int
     BASE_BAND_FIELD_NUMBER: int
     INNER_VERSION_FIELD_NUMBER: int
-    bootloader: Text = ...
-    proc_version: Text = ...
-    codename: Text = ...
-    incremental: Text = ...
-    fingerprint: Text = ...
-    boot_id: Text = ...
-    android_id: Text = ...
-    base_band: Text = ...
-    inner_version: Text = ...
-
+    bootloader: Text
+    proc_version: Text
+    codename: Text
+    incremental: Text
+    fingerprint: Text
+    boot_id: Text
+    android_id: Text
+    base_band: Text
+    inner_version: Text
     def __init__(self,
         *,
-        bootloader : Optional[Text] = ...,
-        proc_version : Optional[Text] = ...,
-        codename : Optional[Text] = ...,
-        incremental : Optional[Text] = ...,
-        fingerprint : Optional[Text] = ...,
-        boot_id : Optional[Text] = ...,
-        android_id : Optional[Text] = ...,
-        base_band : Optional[Text] = ...,
-        inner_version : Optional[Text] = ...,
+        bootloader: Optional[Text] = ...,
+        proc_version: Optional[Text] = ...,
+        codename: Optional[Text] = ...,
+        incremental: Optional[Text] = ...,
+        fingerprint: Optional[Text] = ...,
+        boot_id: Optional[Text] = ...,
+        android_id: Optional[Text] = ...,
+        base_band: Optional[Text] = ...,
+        inner_version: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"android_id",b"android_id",u"base_band",b"base_band",u"boot_id",b"boot_id",u"bootloader",b"bootloader",u"codename",b"codename",u"fingerprint",b"fingerprint",u"incremental",b"incremental",u"inner_version",b"inner_version",u"proc_version",b"proc_version"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"android_id",b"android_id",u"base_band",b"base_band",u"boot_id",b"boot_id",u"bootloader",b"bootloader",u"codename",b"codename",u"fingerprint",b"fingerprint",u"incremental",b"incremental",u"inner_version",b"inner_version",u"proc_version",b"proc_version"]) -> None: ...
+    def HasField(self, field_name: Literal["android_id",b"android_id","base_band",b"base_band","boot_id",b"boot_id","bootloader",b"bootloader","codename",b"codename","fingerprint",b"fingerprint","incremental",b"incremental","inner_version",b"inner_version","proc_version",b"proc_version"]) -> bool: ...
+    def ClearField(self, field_name: Literal["android_id",b"android_id","base_band",b"base_band","boot_id",b"boot_id","bootloader",b"bootloader","codename",b"codename","fingerprint",b"fingerprint","incremental",b"incremental","inner_version",b"inner_version","proc_version",b"proc_version"]) -> None: ...
 
 class SecTransInfo(Message):
-    DESCRIPTOR: Descriptor = ...
+    """oicq/wlogin_sdk/pb/sec_trans.java"""
+    DESCRIPTOR: Descriptor
     PHONE_BRAND_FIELD_NUMBER: int
     MODEL_TYPE_FIELD_NUMBER: int
     WIFI_MAC_FIELD_NUMBER: int
@@ -73,23 +74,22 @@ class SecTransInfo(Message):
     OS_LANGUAGE_FIELD_NUMBER: int
     QQ_LANGUAGE_FIELD_NUMBER: int
     GPS_LOCATION_FIELD_NUMBER: int
-    phone_brand: Text = ...
-    model_type: Text = ...
-    wifi_mac: Text = ...
-    bssid: Text = ...
-    os_language: Text = ...
-    qq_language: int = ...
-    gps_location: Text = ...
-
+    phone_brand: Text
+    model_type: Text
+    wifi_mac: Text
+    bssid: Text
+    os_language: Text
+    qq_language: int
+    gps_location: Text
     def __init__(self,
         *,
-        phone_brand : Optional[Text] = ...,
-        model_type : Optional[Text] = ...,
-        wifi_mac : Optional[Text] = ...,
-        bssid : Optional[Text] = ...,
-        os_language : Optional[Text] = ...,
-        qq_language : Optional[int] = ...,
-        gps_location : Optional[Text] = ...,
+        phone_brand: Optional[Text] = ...,
+        model_type: Optional[Text] = ...,
+        wifi_mac: Optional[Text] = ...,
+        bssid: Optional[Text] = ...,
+        os_language: Optional[Text] = ...,
+        qq_language: Optional[int] = ...,
+        gps_location: Optional[Text] = ...,
         ) -> None: ...
-    def HasField(self, field_name: Literal[u"bssid",b"bssid",u"gps_location",b"gps_location",u"model_type",b"model_type",u"os_language",b"os_language",u"phone_brand",b"phone_brand",u"qq_language",b"qq_language",u"wifi_mac",b"wifi_mac"]) -> bool: ...
-    def ClearField(self, field_name: Literal[u"bssid",b"bssid",u"gps_location",b"gps_location",u"model_type",b"model_type",u"os_language",b"os_language",u"phone_brand",b"phone_brand",u"qq_language",b"qq_language",u"wifi_mac",b"wifi_mac"]) -> None: ...
+    def HasField(self, field_name: Literal["bssid",b"bssid","gps_location",b"gps_location","model_type",b"model_type","os_language",b"os_language","phone_brand",b"phone_brand","qq_language",b"qq_language","wifi_mac",b"wifi_mac"]) -> bool: ...
+    def ClearField(self, field_name: Literal["bssid",b"bssid","gps_location",b"gps_location","model_type",b"model_type","os_language",b"os_language","phone_brand",b"phone_brand","qq_language",b"qq_language","wifi_mac",b"wifi_mac"]) -> None: ...

From cc2c19ba34d58621450c3af0152588f4b979fccb Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Fri, 8 Apr 2022 14:21:44 +0800
Subject: [PATCH 071/113] :arrow_up: upgrade oidb proto files

---
 cai/client/online_push/__init__.py            |   14 +-
 .../oidb/{group0x857 => cmd0x857}/__init__.py |    0
 .../cmd0x857/group_open_sys_msg/__init__.py   |    1 +
 .../group_open_sys_msg.proto                  |   47 +
 .../group_open_sys_msg_pb2.py                 |   74 +
 .../group_open_sys_msg_pb2.pyi                |  161 +++
 .../im/oidb/cmd0x857/troop_tips/__init__.py   |    1 +
 .../oidb/cmd0x857/troop_tips/troop_tips.proto |  412 ++++++
 .../cmd0x857/troop_tips/troop_tips_pb2.py     |  439 ++++++
 .../cmd0x857/troop_tips/troop_tips_pb2.pyi    | 1261 +++++++++++++++++
 cai/pb/im/oidb/group0x857/group0x857.proto    |   83 --
 cai/pb/im/oidb/group0x857/group0x857_pb2.py   |  105 --
 cai/pb/im/oidb/group0x857/group0x857_pb2.pyi  |  267 ----
 13 files changed, 2403 insertions(+), 462 deletions(-)
 rename cai/pb/im/oidb/{group0x857 => cmd0x857}/__init__.py (100%)
 create mode 100644 cai/pb/im/oidb/cmd0x857/group_open_sys_msg/__init__.py
 create mode 100644 cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg.proto
 create mode 100644 cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg_pb2.py
 create mode 100644 cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg_pb2.pyi
 create mode 100644 cai/pb/im/oidb/cmd0x857/troop_tips/__init__.py
 create mode 100644 cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips.proto
 create mode 100644 cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips_pb2.py
 create mode 100644 cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips_pb2.pyi
 delete mode 100644 cai/pb/im/oidb/group0x857/group0x857.proto
 delete mode 100644 cai/pb/im/oidb/group0x857/group0x857_pb2.py
 delete mode 100644 cai/pb/im/oidb/group0x857/group0x857_pb2.pyi

diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index 785f700a..bccd6f84 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -18,7 +18,7 @@
 from cai.client.message_service import MESSAGE_DECODERS
 from cai.client.packet import UniPacket, IncomingPacket
 from cai.utils.jce import RequestPacket, RequestPacketVersion3
-from cai.pb.im.oidb.group0x857.group0x857_pb2 import TemplParam, NotifyMsgBody
+from cai.pb.im.oidb.cmd0x857.troop_tips import TemplParam, NotifyMsgBody
 
 from .jce import DelMsgInfo, DeviceInfo, SvcRespPushMsg
 from .command import PushMsg, PushMsgError, PushMsgCommand
@@ -271,19 +271,19 @@ async def handle_req_push(
             if stype == 0x14:  # nudge
                 client.dispatch_event(
                     events.NudgeEvent(
-                        **_parse_poke(notify.optGeneralGrayTip.msgTemplParam),
+                        **_parse_poke(notify.general_gray_tip.templ_param),
                         group=gid,
                     )
                 )
             elif stype == 0x11:  # recall
-                msg = notify.optMsgRecall.recalledMsgList[0]
+                msg = notify.recall.recalled_msg_list[0]
                 client.dispatch_event(
                     events.MemberRecallMessageEvent(
                         gid,
-                        notify.optMsgRecall.uin,
-                        notify.optMsgRecall.opType,
-                        msg.authorUin,
-                        msg.msgRandom,
+                        notify.recall.uin,
+                        notify.recall.op_type,
+                        msg.author_uin,
+                        msg.msg_random,
                         msg.seq,
                         msg.time,
                     )
diff --git a/cai/pb/im/oidb/group0x857/__init__.py b/cai/pb/im/oidb/cmd0x857/__init__.py
similarity index 100%
rename from cai/pb/im/oidb/group0x857/__init__.py
rename to cai/pb/im/oidb/cmd0x857/__init__.py
diff --git a/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/__init__.py b/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/__init__.py
new file mode 100644
index 00000000..c87bd76f
--- /dev/null
+++ b/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/__init__.py
@@ -0,0 +1 @@
+from .group_open_sys_msg_pb2 import *
diff --git a/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg.proto b/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg.proto
new file mode 100644
index 00000000..bd67e595
--- /dev/null
+++ b/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg.proto
@@ -0,0 +1,47 @@
+syntax = "proto2";
+package im.oidb.cmd0x857.group_open_sys_msg;
+
+// im/oidb/cmd0x857/GroupOpenSysMsg.java
+
+message LightApp {
+  optional string app = 1;
+  optional string view = 2;
+  optional string desc = 3;
+  optional string prompt = 4;
+  optional string ver = 5;
+  optional string meta = 6;
+  optional string config = 7;
+  optional Source source = 8;
+}
+
+message RichMsg {
+  optional string title = 1;
+  optional string desc = 2;
+  optional string brief = 3;
+  optional string cover = 4;
+  optional string url = 5;
+  optional Source source = 6;
+}
+
+message Sender {
+  optional uint64 uin = 1;
+  optional string nick = 2;
+  optional string avatar = 3;
+  optional string url = 4;
+}
+
+message Source {
+  optional string name = 1;
+  optional string icon = 2;
+  optional string url = 3;
+}
+
+message SysMsgBody {
+  optional uint64 group_id = 1;
+  optional uint64 appid = 2;
+  optional Sender sender = 3;
+  optional uint32 type = 4;
+  optional string content = 5;
+  optional RichMsg rich_msg = 6;
+  optional LightApp light_app = 7;
+}
diff --git a/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg_pb2.py b/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg_pb2.py
new file mode 100644
index 00000000..968a2131
--- /dev/null
+++ b/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg_pb2.py
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\nCcai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg.proto\x12#im.oidb.cmd0x857.group_open_sys_msg\"\xab\x01\n\x08LightApp\x12\x0b\n\x03\x61pp\x18\x01 \x01(\t\x12\x0c\n\x04view\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x65sc\x18\x03 \x01(\t\x12\x0e\n\x06prompt\x18\x04 \x01(\t\x12\x0b\n\x03ver\x18\x05 \x01(\t\x12\x0c\n\x04meta\x18\x06 \x01(\t\x12\x0e\n\x06\x63onfig\x18\x07 \x01(\t\x12;\n\x06source\x18\x08 \x01(\x0b\x32+.im.oidb.cmd0x857.group_open_sys_msg.Source\"\x8e\x01\n\x07RichMsg\x12\r\n\x05title\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x65sc\x18\x02 \x01(\t\x12\r\n\x05\x62rief\x18\x03 \x01(\t\x12\r\n\x05\x63over\x18\x04 \x01(\t\x12\x0b\n\x03url\x18\x05 \x01(\t\x12;\n\x06source\x18\x06 \x01(\x0b\x32+.im.oidb.cmd0x857.group_open_sys_msg.Source\"@\n\x06Sender\x12\x0b\n\x03uin\x18\x01 \x01(\x04\x12\x0c\n\x04nick\x18\x02 \x01(\t\x12\x0e\n\x06\x61vatar\x18\x03 \x01(\t\x12\x0b\n\x03url\x18\x04 \x01(\t\"1\n\x06Source\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04icon\x18\x02 \x01(\t\x12\x0b\n\x03url\x18\x03 \x01(\t\"\x8b\x02\n\nSysMsgBody\x12\x10\n\x08group_id\x18\x01 \x01(\x04\x12\r\n\x05\x61ppid\x18\x02 \x01(\x04\x12;\n\x06sender\x18\x03 \x01(\x0b\x32+.im.oidb.cmd0x857.group_open_sys_msg.Sender\x12\x0c\n\x04type\x18\x04 \x01(\r\x12\x0f\n\x07\x63ontent\x18\x05 \x01(\t\x12>\n\x08rich_msg\x18\x06 \x01(\x0b\x32,.im.oidb.cmd0x857.group_open_sys_msg.RichMsg\x12@\n\tlight_app\x18\x07 \x01(\x0b\x32-.im.oidb.cmd0x857.group_open_sys_msg.LightApp')
+
+
+
+_LIGHTAPP = DESCRIPTOR.message_types_by_name['LightApp']
+_RICHMSG = DESCRIPTOR.message_types_by_name['RichMsg']
+_SENDER = DESCRIPTOR.message_types_by_name['Sender']
+_SOURCE = DESCRIPTOR.message_types_by_name['Source']
+_SYSMSGBODY = DESCRIPTOR.message_types_by_name['SysMsgBody']
+LightApp = _reflection.GeneratedProtocolMessageType('LightApp', (_message.Message,), {
+  'DESCRIPTOR' : _LIGHTAPP,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.group_open_sys_msg.group_open_sys_msg_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.group_open_sys_msg.LightApp)
+  })
+_sym_db.RegisterMessage(LightApp)
+
+RichMsg = _reflection.GeneratedProtocolMessageType('RichMsg', (_message.Message,), {
+  'DESCRIPTOR' : _RICHMSG,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.group_open_sys_msg.group_open_sys_msg_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.group_open_sys_msg.RichMsg)
+  })
+_sym_db.RegisterMessage(RichMsg)
+
+Sender = _reflection.GeneratedProtocolMessageType('Sender', (_message.Message,), {
+  'DESCRIPTOR' : _SENDER,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.group_open_sys_msg.group_open_sys_msg_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.group_open_sys_msg.Sender)
+  })
+_sym_db.RegisterMessage(Sender)
+
+Source = _reflection.GeneratedProtocolMessageType('Source', (_message.Message,), {
+  'DESCRIPTOR' : _SOURCE,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.group_open_sys_msg.group_open_sys_msg_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.group_open_sys_msg.Source)
+  })
+_sym_db.RegisterMessage(Source)
+
+SysMsgBody = _reflection.GeneratedProtocolMessageType('SysMsgBody', (_message.Message,), {
+  'DESCRIPTOR' : _SYSMSGBODY,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.group_open_sys_msg.group_open_sys_msg_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.group_open_sys_msg.SysMsgBody)
+  })
+_sym_db.RegisterMessage(SysMsgBody)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _LIGHTAPP._serialized_start=109
+  _LIGHTAPP._serialized_end=280
+  _RICHMSG._serialized_start=283
+  _RICHMSG._serialized_end=425
+  _SENDER._serialized_start=427
+  _SENDER._serialized_end=491
+  _SOURCE._serialized_start=493
+  _SOURCE._serialized_end=542
+  _SYSMSGBODY._serialized_start=545
+  _SYSMSGBODY._serialized_end=812
+# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg_pb2.pyi b/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg_pb2.pyi
new file mode 100644
index 00000000..03d0da15
--- /dev/null
+++ b/cai/pb/im/oidb/cmd0x857/group_open_sys_msg/group_open_sys_msg_pb2.pyi
@@ -0,0 +1,161 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+from builtins import (
+    bool,
+    int,
+)
+
+from google.protobuf.descriptor import (
+    Descriptor,
+    FileDescriptor,
+)
+
+from google.protobuf.message import (
+    Message,
+)
+
+from typing import (
+    Optional,
+    Text,
+)
+
+from typing_extensions import (
+    Literal,
+)
+
+
+DESCRIPTOR: FileDescriptor
+
+class LightApp(Message):
+    """im/oidb/cmd0x857/GroupOpenSysMsg.java
+
+    """
+    DESCRIPTOR: Descriptor
+    APP_FIELD_NUMBER: int
+    VIEW_FIELD_NUMBER: int
+    DESC_FIELD_NUMBER: int
+    PROMPT_FIELD_NUMBER: int
+    VER_FIELD_NUMBER: int
+    META_FIELD_NUMBER: int
+    CONFIG_FIELD_NUMBER: int
+    SOURCE_FIELD_NUMBER: int
+    app: Text
+    view: Text
+    desc: Text
+    prompt: Text
+    ver: Text
+    meta: Text
+    config: Text
+    @property
+    def source(self) -> Source: ...
+    def __init__(self,
+        *,
+        app: Optional[Text] = ...,
+        view: Optional[Text] = ...,
+        desc: Optional[Text] = ...,
+        prompt: Optional[Text] = ...,
+        ver: Optional[Text] = ...,
+        meta: Optional[Text] = ...,
+        config: Optional[Text] = ...,
+        source: Optional[Source] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["app",b"app","config",b"config","desc",b"desc","meta",b"meta","prompt",b"prompt","source",b"source","ver",b"ver","view",b"view"]) -> bool: ...
+    def ClearField(self, field_name: Literal["app",b"app","config",b"config","desc",b"desc","meta",b"meta","prompt",b"prompt","source",b"source","ver",b"ver","view",b"view"]) -> None: ...
+
+class RichMsg(Message):
+    DESCRIPTOR: Descriptor
+    TITLE_FIELD_NUMBER: int
+    DESC_FIELD_NUMBER: int
+    BRIEF_FIELD_NUMBER: int
+    COVER_FIELD_NUMBER: int
+    URL_FIELD_NUMBER: int
+    SOURCE_FIELD_NUMBER: int
+    title: Text
+    desc: Text
+    brief: Text
+    cover: Text
+    url: Text
+    @property
+    def source(self) -> Source: ...
+    def __init__(self,
+        *,
+        title: Optional[Text] = ...,
+        desc: Optional[Text] = ...,
+        brief: Optional[Text] = ...,
+        cover: Optional[Text] = ...,
+        url: Optional[Text] = ...,
+        source: Optional[Source] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["brief",b"brief","cover",b"cover","desc",b"desc","source",b"source","title",b"title","url",b"url"]) -> bool: ...
+    def ClearField(self, field_name: Literal["brief",b"brief","cover",b"cover","desc",b"desc","source",b"source","title",b"title","url",b"url"]) -> None: ...
+
+class Sender(Message):
+    DESCRIPTOR: Descriptor
+    UIN_FIELD_NUMBER: int
+    NICK_FIELD_NUMBER: int
+    AVATAR_FIELD_NUMBER: int
+    URL_FIELD_NUMBER: int
+    uin: int
+    nick: Text
+    avatar: Text
+    url: Text
+    def __init__(self,
+        *,
+        uin: Optional[int] = ...,
+        nick: Optional[Text] = ...,
+        avatar: Optional[Text] = ...,
+        url: Optional[Text] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["avatar",b"avatar","nick",b"nick","uin",b"uin","url",b"url"]) -> bool: ...
+    def ClearField(self, field_name: Literal["avatar",b"avatar","nick",b"nick","uin",b"uin","url",b"url"]) -> None: ...
+
+class Source(Message):
+    DESCRIPTOR: Descriptor
+    NAME_FIELD_NUMBER: int
+    ICON_FIELD_NUMBER: int
+    URL_FIELD_NUMBER: int
+    name: Text
+    icon: Text
+    url: Text
+    def __init__(self,
+        *,
+        name: Optional[Text] = ...,
+        icon: Optional[Text] = ...,
+        url: Optional[Text] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["icon",b"icon","name",b"name","url",b"url"]) -> bool: ...
+    def ClearField(self, field_name: Literal["icon",b"icon","name",b"name","url",b"url"]) -> None: ...
+
+class SysMsgBody(Message):
+    DESCRIPTOR: Descriptor
+    GROUP_ID_FIELD_NUMBER: int
+    APPID_FIELD_NUMBER: int
+    SENDER_FIELD_NUMBER: int
+    TYPE_FIELD_NUMBER: int
+    CONTENT_FIELD_NUMBER: int
+    RICH_MSG_FIELD_NUMBER: int
+    LIGHT_APP_FIELD_NUMBER: int
+    group_id: int
+    appid: int
+    @property
+    def sender(self) -> Sender: ...
+    type: int
+    content: Text
+    @property
+    def rich_msg(self) -> RichMsg: ...
+    @property
+    def light_app(self) -> LightApp: ...
+    def __init__(self,
+        *,
+        group_id: Optional[int] = ...,
+        appid: Optional[int] = ...,
+        sender: Optional[Sender] = ...,
+        type: Optional[int] = ...,
+        content: Optional[Text] = ...,
+        rich_msg: Optional[RichMsg] = ...,
+        light_app: Optional[LightApp] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["appid",b"appid","content",b"content","group_id",b"group_id","light_app",b"light_app","rich_msg",b"rich_msg","sender",b"sender","type",b"type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["appid",b"appid","content",b"content","group_id",b"group_id","light_app",b"light_app","rich_msg",b"rich_msg","sender",b"sender","type",b"type"]) -> None: ...
diff --git a/cai/pb/im/oidb/cmd0x857/troop_tips/__init__.py b/cai/pb/im/oidb/cmd0x857/troop_tips/__init__.py
new file mode 100644
index 00000000..6f4e17ff
--- /dev/null
+++ b/cai/pb/im/oidb/cmd0x857/troop_tips/__init__.py
@@ -0,0 +1 @@
+from .troop_tips_pb2 import *
diff --git a/cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips.proto b/cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips.proto
new file mode 100644
index 00000000..df81bebb
--- /dev/null
+++ b/cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips.proto
@@ -0,0 +1,412 @@
+syntax = "proto2";
+package im.oidb.cmd0x857.troop_tips;
+
+// tencent/im/oidb/cmd0x857/TroopTips0x857.java
+
+message AIOGrayTipsInfo {
+  optional uint32 show_lastest = 1;
+  optional bytes content = 2;
+  optional uint32 remind = 3;
+  optional bytes brief = 4;
+  optional uint64 receiver_uin = 5;
+  optional uint32 reliao_admin_opt = 6;
+  optional uint32 robot_group_opt = 7;
+}
+
+message AIOTopTipsInfo {
+  optional bytes content = 1;
+  optional uint32 icon = 2;
+  optional uint32 enum_action = 3;
+  optional bytes url = 4;
+  optional bytes data = 5;
+  optional bytes data_i = 6;
+  optional bytes data_a = 7;
+  optional bytes data_p = 8;
+}
+
+message FloatedTipsInfo {
+  optional bytes content = 1;
+}
+
+message GeneralGrayTipInfo {
+  optional uint64 busi_type = 1;
+  optional uint64 busi_id = 2;
+  optional uint32 ctrl_flag = 3;
+  optional uint32 c2c_type = 4;
+  optional uint32 service_type = 5;
+  optional uint64 templ_id = 6;
+  repeated TemplParam templ_param = 7;
+  optional bytes content = 8;
+  optional uint64 tips_seq_id = 10;
+  optional bytes pb_reserv = 100;
+}
+
+message GoldMsgTipsElem {
+  optional uint32 type = 1;
+  optional string billno = 2;
+  optional uint32 result = 3;
+  optional uint32 amount = 4;
+  optional uint32 total = 5;
+  optional uint32 interval = 6;
+  optional uint32 finish = 7;
+  repeated uint64 uin = 8;
+  optional uint32 action = 9;
+}
+
+message GrayData {
+  optional uint32 all_read = 1;
+  optional string feed_id = 2;
+}
+
+message GroupAnnounceTBCInfo {
+  optional bytes feeds_id = 1;
+  optional uint64 group_id = 2;
+  optional uint32 action = 3;
+}
+
+message GroupAsyncNotify {
+  optional uint32 msg_type = 1;
+  optional uint64 msg_seq = 2;
+}
+
+message GroupInfoChange {
+  optional uint32 group_honor_switch = 1;
+  optional uint32 group_member_level_switch = 2;
+  optional uint32 group_flagext4 = 3;
+  optional uint32 appeal_deadline = 4;
+  optional uint32 group_flag = 5;
+  optional uint32 group_flagext3 = 7;
+  optional uint32 group_class_ext = 8;
+  optional uint32 group_info_ext_seq = 9;
+}
+
+message GroupNotifyInfo {
+  optional uint32 auto_pull_flag = 1;
+  optional bytes feeds_id = 2;
+}
+
+message InstCtrl {
+  repeated InstInfo send_to_inst = 1;
+  repeated InstInfo exclude_inst = 2;
+  optional InstInfo from_inst = 3;
+}
+
+message InstInfo {
+  optional uint32 apppid = 1;
+  optional uint32 instid = 2;
+  optional uint32 platform = 3;
+  optional uint32 open_appid = 4;
+  optional uint32 productid = 5;
+  optional uint32 sso_bid = 6;
+  optional bytes guid = 7;
+  optional uint32 ver_min = 8;
+  optional uint32 ver_max = 9;
+}
+
+message LbsShareChangePushInfo {
+  optional uint32 msg_type = 1;
+  optional bytes msg_info = 2;
+  optional bytes version_ctrl = 3;
+  optional uint64 group_id = 4;
+  optional uint64 oper_uin = 5;
+  optional bytes gray_tips = 6;
+  optional uint64 msg_seq = 7;
+  optional uint32 join_nums = 8;
+  optional uint32 push_type = 99;
+  optional bytes ext_info = 100;
+}
+
+message LuckyBagNotify {
+  optional bytes msg_tips = 1;
+}
+
+message MediaChangePushInfo {
+  optional uint32 msg_type = 1;
+  optional bytes msg_info = 2;
+  optional bytes version_ctrl = 3;
+  optional uint64 group_id = 4;
+  optional uint64 oper_uin = 5;
+  optional bytes gray_tips = 6;
+  optional uint64 msg_seq = 7;
+  optional uint32 join_nums = 8;
+  optional PersonalSetting per_setting = 9;
+  optional uint32 play_mode = 10;
+  optional bool is_join_when_start = 11;
+  optional uint32 media_type = 99;
+  optional bytes ext_info = 100;
+
+  message PersonalSetting {
+    optional uint32 theme_id = 1;
+    optional uint32 player_id = 2;
+    optional uint32 font_id = 3;
+  }
+}
+
+message MessageBoxInfo {
+  optional bytes content = 1;
+  optional bytes title = 2;
+  optional bytes button = 3;
+}
+
+message MessageRecallReminder {
+  optional uint64 uin = 1;
+  optional bytes nickname = 2;
+  repeated MessageMeta recalled_msg_list = 3;
+  optional bytes reminder_content = 4;
+  optional bytes userdef = 5;
+  optional uint32 group_type = 6;
+  optional uint32 op_type = 7;
+  optional uint64 admin_uin = 8;
+  optional WithDrawWordingInfo wording_info = 9;
+
+  message MessageMeta {
+    optional uint32 seq = 1;
+    optional uint32 time = 2;
+    optional uint32 msg_random = 3;
+    optional uint32 msg_type = 4;
+    optional uint32 msg_flag = 5;
+    optional uint64 author_uin = 6;
+    optional uint32 is_anony_msg = 7;
+  }
+
+  message WithDrawWordingInfo {
+    optional int32 item_id = 1;
+    optional string item_name = 2;
+  }
+}
+
+message MiniAppNotify {
+  optional bytes msg = 1;
+}
+
+message NotifyMsgBody {
+  optional uint32 enum_type = 1;
+  optional uint64 msg_time = 2;
+  optional uint64 msg_expires = 3;
+  optional uint64 group_code = 4;
+  optional AIOGrayTipsInfo graytips = 5;
+  optional MessageBoxInfo messagebox = 6;
+  optional FloatedTipsInfo floatedtips = 7;
+  optional AIOTopTipsInfo toptips = 8;
+  optional RedGrayTipsInfo redtips = 9;
+  optional GroupNotifyInfo group_notify = 10;
+  optional MessageRecallReminder recall = 11;
+  optional ThemeStateNotify theme_notify = 12;
+  optional uint32 service_type = 13;
+  optional NotifyObjmsgUpdate objmsg_update = 14;
+  optional WereWolfPush werewolf_push = 15;
+  // optional apollo_game_status.STCMGameMessage stcm_game_state = 16;
+  // optional apollo_push_msgInfo.STPushMsgElem apllo_msg_push = 17;
+  optional GoldMsgTipsElem goldtips = 18;
+  optional MiniAppNotify miniapp_notify = 20;
+  optional uint64 sender_uin = 21;
+  optional LuckyBagNotify luckybag_notify = 22;
+  optional TroopFormGrayTipsInfo troopformtips_push = 23;
+  optional MediaChangePushInfo media_push = 24;
+  optional GeneralGrayTipInfo general_gray_tip = 26;
+  optional VideoChangePushInfo video_push = 27;
+  optional LbsShareChangePushInfo lbs_share_change_plus_info = 28;
+  optional SingChangePushInfo sing_push = 29;
+  optional GroupInfoChange group_info_change = 30;
+  optional GroupAnnounceTBCInfo group_announce_tbc_info = 31;
+  optional QQVedioGamePushInfo qq_vedio_game_push_info = 32;
+  optional QQGroupDigestMsg qq_group_digest_msg = 33;
+  optional StudyRoomMemberChangePush study_room_member_msg = 34;
+  optional QQVaLiveNotifyMsg qq_live_notify = 35;
+  optional GroupAsyncNotify group_async_notidy = 36;
+  optional uint64 group_cur_msg_seq = 37;
+  optional QQGroupDigestMsgSummary group_digest_msg_summary = 38;
+  optional uint64 sysdb_msg_id = 39;
+  optional RevertGrayTipsMsgTraceless revert_graytips_traceless = 40;
+}
+
+message NotifyObjmsgUpdate {
+  optional bytes objmsg_id = 1;
+  optional uint32 update_type = 2;
+  optional bytes ext_msg = 3;
+}
+
+message QQGroupDigestMsg {
+  optional uint64 group_code = 1;
+  optional uint32 seq = 2;
+  optional uint32 random = 3;
+  optional int32 op_type = 4;
+  optional uint64 sender = 5;
+  optional uint64 digest_oper = 6;
+  optional uint32 op_time = 7;
+  optional uint32 lastest_msg_seq = 8;
+  optional bytes oper_nick = 9;
+  optional bytes sender_nick = 10;
+  optional int32 ext_info = 11;
+}
+
+message QQGroupDigestMsgSummary {
+  optional uint64 digest_oper = 1;
+  optional int32 op_type = 2;
+  optional uint32 op_time = 3;
+  optional bytes digest_nick = 4;
+  optional int32 succ_cnt = 5;
+  repeated QQGroupDigestSummaryInfo summary_info = 6;
+}
+
+message QQGroupDigestSummaryInfo {
+  optional uint32 seq = 1;
+  optional uint32 random = 2;
+  optional uint32 error_code = 3;
+}
+
+message QQVaLiveNotifyMsg {
+  optional bytes uid = 1;
+  optional int32 notify_type = 2;
+  optional bytes ext1 = 3;
+  optional bytes ext2 = 4;
+  optional bytes ext3 = 5;
+}
+
+message QQVedioGamePushInfo {
+  optional uint32 msg_type = 1;
+  optional uint64 group_code = 2;
+  optional uint64 oper_uin = 3;
+  optional bytes version_ctrl = 4;
+  optional bytes ext_info = 5;
+}
+
+message RedGrayTipsInfo {
+  optional uint32 show_lastest = 1;
+  optional uint64 sender_uin = 2;
+  optional uint64 receiver_uin = 3;
+  optional bytes sender_rich_content = 4;
+  optional bytes receiver_rich_content = 5;
+  optional bytes authkey = 6;
+  optional sint32 msgtype = 7;
+  optional uint32 lucky_flag = 8;
+  optional uint32 hide_flag = 9;
+  optional bytes pc_body = 10;
+  optional uint32 icon = 11;
+  optional uint64 lucky_uin = 12;
+  optional uint32 time = 13;
+  optional uint32 random = 14;
+  optional bytes broadcast_rich_content = 15;
+  optional bytes idiom = 16;
+  optional uint32 idiom_seq = 17;
+  optional bytes idiom_alpha = 18;
+  optional bytes jumpurl = 19;
+  optional uint32 subchannel = 20;
+  optional bytes poem_rule = 21;
+}
+
+message ReqBody {
+  optional uint64 group_code = 1;
+  repeated uint64 memberuins = 2;
+  optional uint32 offline = 3;
+  optional InstCtrl inst_ctrl = 4;
+  optional bytes msg = 5;
+  optional uint32 busi_type = 6;
+}
+
+message RevertGrayTipsMsgTraceless {
+  optional uint64 from = 1;
+  optional uint64 to = 2;
+  optional uint64 group_code = 3;
+  optional uint64 busi_id = 4;
+  optional uint64 tips_seq_id = 5;
+}
+
+message RspBody {
+  optional uint64 group_code = 1;
+}
+
+message SingChangePushInfo {
+  optional uint64 seq = 1;
+  optional uint32 action_type = 2;
+  optional uint64 group_id = 3;
+  optional uint64 oper_uin = 4;
+  optional bytes gray_tips = 5;
+  optional uint32 join_nums = 6;
+}
+
+message StudyRoomMemberChangePush {
+  optional uint32 member_count = 1;
+}
+
+message TemplParam {
+  optional bytes name = 1;
+  optional bytes value = 2;
+}
+
+message ThemeStateNotify {
+  optional uint32 state = 1;
+  optional bytes feeds_id = 2;
+  optional bytes theme_name = 3;
+  optional uint64 action_uin = 4;
+  optional uint64 create_uin = 5;
+}
+
+message TroopFormGrayTipsInfo {
+  optional uint64 writer_uin = 1;
+  optional uint64 creator_uin = 2;
+  optional bytes rich_content = 3;
+  optional bytes opt_bytes_url = 4;
+  optional bytes creator_nick = 5;
+}
+
+message VideoChangePushInfo {
+  optional uint64 seq = 1;
+  optional uint32 action_type = 2;
+  optional uint64 group_id = 3;
+  optional uint64 oper_uin = 4;
+  optional bytes gray_tips = 5;
+  optional uint32 join_nums = 6;
+  optional uint32 join_state = 7;
+  optional bytes ext_info = 100;
+}
+
+message WereWolfPush {
+  optional uint32 push_type = 1;
+  optional uint64 game_room = 2;
+  optional uint32 enum_game_state = 3;
+  optional uint32 game_round = 4;
+  repeated Role roles = 5;
+  optional uint64 speaker = 6;
+  optional uint64 judge_uin = 7;
+  optional bytes judge_words = 8;
+  optional uint32 enum_operation = 9;
+  optional uint64 src_user = 10;
+  optional uint64 dst_user = 11;
+  repeated uint64 dead_users = 12;
+  optional uint32 game_result = 13;
+  optional uint32 timeout_sec = 14;
+  optional uint32 kill_confirmed = 15;
+  optional bytes judge_nickname = 16;
+  repeated uint64 voted_tie_users = 17;
+
+  message GameRecord {
+    optional uint32 total = 1;
+    optional uint32 win = 2;
+    optional uint32 lose = 3;
+    optional uint32 draw = 4;
+  }
+
+  message Role {
+    optional uint64 uin = 1;
+    optional uint32 enum_type = 2;
+    optional uint32 enum_state = 3;
+    optional uint32 can_speak = 4;
+    optional uint32 can_listen = 5;
+    optional uint32 position = 6;
+    optional uint32 can_vote = 7;
+    optional uint32 can_voted = 8;
+    optional uint32 already_checked = 9;
+    optional uint32 already_saved = 10;
+    optional uint32 already_poisoned = 11;
+    optional uint32 player_state = 12;
+    optional uint32 enum_dead_op = 13;
+    optional uint32 enum_operation = 14;
+    optional uint64 dst_user = 15;
+    optional uint32 operation_round = 16;
+    optional GameRecord game_record = 17;
+    optional uint32 is_werewolf = 18;
+    optional uint64 defended_user = 19;
+    optional uint32 is_sheriff = 20;
+  }
+}
diff --git a/cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips_pb2.py b/cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips_pb2.py
new file mode 100644
index 00000000..b0f2f199
--- /dev/null
+++ b/cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips_pb2.py
@@ -0,0 +1,439 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n3cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips.proto\x12\x1bim.oidb.cmd0x857.troop_tips\"\xa0\x01\n\x0f\x41IOGrayTipsInfo\x12\x14\n\x0cshow_lastest\x18\x01 \x01(\r\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\x12\x0e\n\x06remind\x18\x03 \x01(\r\x12\r\n\x05\x62rief\x18\x04 \x01(\x0c\x12\x14\n\x0creceiver_uin\x18\x05 \x01(\x04\x12\x18\n\x10reliao_admin_opt\x18\x06 \x01(\r\x12\x17\n\x0frobot_group_opt\x18\x07 \x01(\r\"\x8f\x01\n\x0e\x41IOTopTipsInfo\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\x0c\x12\x0c\n\x04icon\x18\x02 \x01(\r\x12\x13\n\x0b\x65num_action\x18\x03 \x01(\r\x12\x0b\n\x03url\x18\x04 \x01(\x0c\x12\x0c\n\x04\x64\x61ta\x18\x05 \x01(\x0c\x12\x0e\n\x06\x64\x61ta_i\x18\x06 \x01(\x0c\x12\x0e\n\x06\x64\x61ta_a\x18\x07 \x01(\x0c\x12\x0e\n\x06\x64\x61ta_p\x18\x08 \x01(\x0c\"\"\n\x0f\x46loatedTipsInfo\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\x0c\"\xfc\x01\n\x12GeneralGrayTipInfo\x12\x11\n\tbusi_type\x18\x01 \x01(\x04\x12\x0f\n\x07\x62usi_id\x18\x02 \x01(\x04\x12\x11\n\tctrl_flag\x18\x03 \x01(\r\x12\x10\n\x08\x63\x32\x63_type\x18\x04 \x01(\r\x12\x14\n\x0cservice_type\x18\x05 \x01(\r\x12\x10\n\x08templ_id\x18\x06 \x01(\x04\x12<\n\x0btempl_param\x18\x07 \x03(\x0b\x32\'.im.oidb.cmd0x857.troop_tips.TemplParam\x12\x0f\n\x07\x63ontent\x18\x08 \x01(\x0c\x12\x13\n\x0btips_seq_id\x18\n \x01(\x04\x12\x11\n\tpb_reserv\x18\x64 \x01(\x0c\"\x9d\x01\n\x0fGoldMsgTipsElem\x12\x0c\n\x04type\x18\x01 \x01(\r\x12\x0e\n\x06\x62illno\x18\x02 \x01(\t\x12\x0e\n\x06result\x18\x03 \x01(\r\x12\x0e\n\x06\x61mount\x18\x04 \x01(\r\x12\r\n\x05total\x18\x05 \x01(\r\x12\x10\n\x08interval\x18\x06 \x01(\r\x12\x0e\n\x06\x66inish\x18\x07 \x01(\r\x12\x0b\n\x03uin\x18\x08 \x03(\x04\x12\x0e\n\x06\x61\x63tion\x18\t \x01(\r\"-\n\x08GrayData\x12\x10\n\x08\x61ll_read\x18\x01 \x01(\r\x12\x0f\n\x07\x66\x65\x65\x64_id\x18\x02 \x01(\t\"J\n\x14GroupAnnounceTBCInfo\x12\x10\n\x08\x66\x65\x65\x64s_id\x18\x01 \x01(\x0c\x12\x10\n\x08group_id\x18\x02 \x01(\x04\x12\x0e\n\x06\x61\x63tion\x18\x03 \x01(\r\"5\n\x10GroupAsyncNotify\x12\x10\n\x08msg_type\x18\x01 \x01(\r\x12\x0f\n\x07msg_seq\x18\x02 \x01(\x04\"\xe2\x01\n\x0fGroupInfoChange\x12\x1a\n\x12group_honor_switch\x18\x01 \x01(\r\x12!\n\x19group_member_level_switch\x18\x02 \x01(\r\x12\x16\n\x0egroup_flagext4\x18\x03 \x01(\r\x12\x17\n\x0f\x61ppeal_deadline\x18\x04 \x01(\r\x12\x12\n\ngroup_flag\x18\x05 \x01(\r\x12\x16\n\x0egroup_flagext3\x18\x07 \x01(\r\x12\x17\n\x0fgroup_class_ext\x18\x08 \x01(\r\x12\x1a\n\x12group_info_ext_seq\x18\t \x01(\r\";\n\x0fGroupNotifyInfo\x12\x16\n\x0e\x61uto_pull_flag\x18\x01 \x01(\r\x12\x10\n\x08\x66\x65\x65\x64s_id\x18\x02 \x01(\x0c\"\xbe\x01\n\x08InstCtrl\x12;\n\x0csend_to_inst\x18\x01 \x03(\x0b\x32%.im.oidb.cmd0x857.troop_tips.InstInfo\x12;\n\x0c\x65xclude_inst\x18\x02 \x03(\x0b\x32%.im.oidb.cmd0x857.troop_tips.InstInfo\x12\x38\n\tfrom_inst\x18\x03 \x01(\x0b\x32%.im.oidb.cmd0x857.troop_tips.InstInfo\"\xa4\x01\n\x08InstInfo\x12\x0e\n\x06\x61pppid\x18\x01 \x01(\r\x12\x0e\n\x06instid\x18\x02 \x01(\r\x12\x10\n\x08platform\x18\x03 \x01(\r\x12\x12\n\nopen_appid\x18\x04 \x01(\r\x12\x11\n\tproductid\x18\x05 \x01(\r\x12\x0f\n\x07sso_bid\x18\x06 \x01(\r\x12\x0c\n\x04guid\x18\x07 \x01(\x0c\x12\x0f\n\x07ver_min\x18\x08 \x01(\r\x12\x0f\n\x07ver_max\x18\t \x01(\r\"\xd2\x01\n\x16LbsShareChangePushInfo\x12\x10\n\x08msg_type\x18\x01 \x01(\r\x12\x10\n\x08msg_info\x18\x02 \x01(\x0c\x12\x14\n\x0cversion_ctrl\x18\x03 \x01(\x0c\x12\x10\n\x08group_id\x18\x04 \x01(\x04\x12\x10\n\x08oper_uin\x18\x05 \x01(\x04\x12\x11\n\tgray_tips\x18\x06 \x01(\x0c\x12\x0f\n\x07msg_seq\x18\x07 \x01(\x04\x12\x11\n\tjoin_nums\x18\x08 \x01(\r\x12\x11\n\tpush_type\x18\x63 \x01(\r\x12\x10\n\x08\x65xt_info\x18\x64 \x01(\x0c\"\"\n\x0eLuckyBagNotify\x12\x10\n\x08msg_tips\x18\x01 \x01(\x0c\"\x9f\x03\n\x13MediaChangePushInfo\x12\x10\n\x08msg_type\x18\x01 \x01(\r\x12\x10\n\x08msg_info\x18\x02 \x01(\x0c\x12\x14\n\x0cversion_ctrl\x18\x03 \x01(\x0c\x12\x10\n\x08group_id\x18\x04 \x01(\x04\x12\x10\n\x08oper_uin\x18\x05 \x01(\x04\x12\x11\n\tgray_tips\x18\x06 \x01(\x0c\x12\x0f\n\x07msg_seq\x18\x07 \x01(\x04\x12\x11\n\tjoin_nums\x18\x08 \x01(\r\x12U\n\x0bper_setting\x18\t \x01(\x0b\x32@.im.oidb.cmd0x857.troop_tips.MediaChangePushInfo.PersonalSetting\x12\x11\n\tplay_mode\x18\n \x01(\r\x12\x1a\n\x12is_join_when_start\x18\x0b \x01(\x08\x12\x12\n\nmedia_type\x18\x63 \x01(\r\x12\x10\n\x08\x65xt_info\x18\x64 \x01(\x0c\x1aG\n\x0fPersonalSetting\x12\x10\n\x08theme_id\x18\x01 \x01(\r\x12\x11\n\tplayer_id\x18\x02 \x01(\r\x12\x0f\n\x07\x66ont_id\x18\x03 \x01(\r\"@\n\x0eMessageBoxInfo\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\x0c\x12\r\n\x05title\x18\x02 \x01(\x0c\x12\x0e\n\x06\x62utton\x18\x03 \x01(\x0c\"\x9a\x04\n\x15MessageRecallReminder\x12\x0b\n\x03uin\x18\x01 \x01(\x04\x12\x10\n\x08nickname\x18\x02 \x01(\x0c\x12Y\n\x11recalled_msg_list\x18\x03 \x03(\x0b\x32>.im.oidb.cmd0x857.troop_tips.MessageRecallReminder.MessageMeta\x12\x18\n\x10reminder_content\x18\x04 \x01(\x0c\x12\x0f\n\x07userdef\x18\x05 \x01(\x0c\x12\x12\n\ngroup_type\x18\x06 \x01(\r\x12\x0f\n\x07op_type\x18\x07 \x01(\r\x12\x11\n\tadmin_uin\x18\x08 \x01(\x04\x12\\\n\x0cwording_info\x18\t \x01(\x0b\x32\x46.im.oidb.cmd0x857.troop_tips.MessageRecallReminder.WithDrawWordingInfo\x1a\x8a\x01\n\x0bMessageMeta\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x0c\n\x04time\x18\x02 \x01(\r\x12\x12\n\nmsg_random\x18\x03 \x01(\r\x12\x10\n\x08msg_type\x18\x04 \x01(\r\x12\x10\n\x08msg_flag\x18\x05 \x01(\r\x12\x12\n\nauthor_uin\x18\x06 \x01(\x04\x12\x14\n\x0cis_anony_msg\x18\x07 \x01(\r\x1a\x39\n\x13WithDrawWordingInfo\x12\x0f\n\x07item_id\x18\x01 \x01(\x05\x12\x11\n\titem_name\x18\x02 \x01(\t\"\x1c\n\rMiniAppNotify\x12\x0b\n\x03msg\x18\x01 \x01(\x0c\"\xb8\x11\n\rNotifyMsgBody\x12\x11\n\tenum_type\x18\x01 \x01(\r\x12\x10\n\x08msg_time\x18\x02 \x01(\x04\x12\x13\n\x0bmsg_expires\x18\x03 \x01(\x04\x12\x12\n\ngroup_code\x18\x04 \x01(\x04\x12>\n\x08graytips\x18\x05 \x01(\x0b\x32,.im.oidb.cmd0x857.troop_tips.AIOGrayTipsInfo\x12?\n\nmessagebox\x18\x06 \x01(\x0b\x32+.im.oidb.cmd0x857.troop_tips.MessageBoxInfo\x12\x41\n\x0b\x66loatedtips\x18\x07 \x01(\x0b\x32,.im.oidb.cmd0x857.troop_tips.FloatedTipsInfo\x12<\n\x07toptips\x18\x08 \x01(\x0b\x32+.im.oidb.cmd0x857.troop_tips.AIOTopTipsInfo\x12=\n\x07redtips\x18\t \x01(\x0b\x32,.im.oidb.cmd0x857.troop_tips.RedGrayTipsInfo\x12\x42\n\x0cgroup_notify\x18\n \x01(\x0b\x32,.im.oidb.cmd0x857.troop_tips.GroupNotifyInfo\x12\x42\n\x06recall\x18\x0b \x01(\x0b\x32\x32.im.oidb.cmd0x857.troop_tips.MessageRecallReminder\x12\x43\n\x0ctheme_notify\x18\x0c \x01(\x0b\x32-.im.oidb.cmd0x857.troop_tips.ThemeStateNotify\x12\x14\n\x0cservice_type\x18\r \x01(\r\x12\x46\n\robjmsg_update\x18\x0e \x01(\x0b\x32/.im.oidb.cmd0x857.troop_tips.NotifyObjmsgUpdate\x12@\n\rwerewolf_push\x18\x0f \x01(\x0b\x32).im.oidb.cmd0x857.troop_tips.WereWolfPush\x12>\n\x08goldtips\x18\x12 \x01(\x0b\x32,.im.oidb.cmd0x857.troop_tips.GoldMsgTipsElem\x12\x42\n\x0eminiapp_notify\x18\x14 \x01(\x0b\x32*.im.oidb.cmd0x857.troop_tips.MiniAppNotify\x12\x12\n\nsender_uin\x18\x15 \x01(\x04\x12\x44\n\x0fluckybag_notify\x18\x16 \x01(\x0b\x32+.im.oidb.cmd0x857.troop_tips.LuckyBagNotify\x12N\n\x12troopformtips_push\x18\x17 \x01(\x0b\x32\x32.im.oidb.cmd0x857.troop_tips.TroopFormGrayTipsInfo\x12\x44\n\nmedia_push\x18\x18 \x01(\x0b\x32\x30.im.oidb.cmd0x857.troop_tips.MediaChangePushInfo\x12I\n\x10general_gray_tip\x18\x1a \x01(\x0b\x32/.im.oidb.cmd0x857.troop_tips.GeneralGrayTipInfo\x12\x44\n\nvideo_push\x18\x1b \x01(\x0b\x32\x30.im.oidb.cmd0x857.troop_tips.VideoChangePushInfo\x12W\n\x1albs_share_change_plus_info\x18\x1c \x01(\x0b\x32\x33.im.oidb.cmd0x857.troop_tips.LbsShareChangePushInfo\x12\x42\n\tsing_push\x18\x1d \x01(\x0b\x32/.im.oidb.cmd0x857.troop_tips.SingChangePushInfo\x12G\n\x11group_info_change\x18\x1e \x01(\x0b\x32,.im.oidb.cmd0x857.troop_tips.GroupInfoChange\x12R\n\x17group_announce_tbc_info\x18\x1f \x01(\x0b\x32\x31.im.oidb.cmd0x857.troop_tips.GroupAnnounceTBCInfo\x12Q\n\x17qq_vedio_game_push_info\x18  \x01(\x0b\x32\x30.im.oidb.cmd0x857.troop_tips.QQVedioGamePushInfo\x12J\n\x13qq_group_digest_msg\x18! \x01(\x0b\x32-.im.oidb.cmd0x857.troop_tips.QQGroupDigestMsg\x12U\n\x15study_room_member_msg\x18\" \x01(\x0b\x32\x36.im.oidb.cmd0x857.troop_tips.StudyRoomMemberChangePush\x12\x46\n\x0eqq_live_notify\x18# \x01(\x0b\x32..im.oidb.cmd0x857.troop_tips.QQVaLiveNotifyMsg\x12I\n\x12group_async_notidy\x18$ \x01(\x0b\x32-.im.oidb.cmd0x857.troop_tips.GroupAsyncNotify\x12\x19\n\x11group_cur_msg_seq\x18% \x01(\x04\x12V\n\x18group_digest_msg_summary\x18& \x01(\x0b\x32\x34.im.oidb.cmd0x857.troop_tips.QQGroupDigestMsgSummary\x12\x14\n\x0csysdb_msg_id\x18\' \x01(\x04\x12Z\n\x19revert_graytips_traceless\x18( \x01(\x0b\x32\x37.im.oidb.cmd0x857.troop_tips.RevertGrayTipsMsgTraceless\"M\n\x12NotifyObjmsgUpdate\x12\x11\n\tobjmsg_id\x18\x01 \x01(\x0c\x12\x13\n\x0bupdate_type\x18\x02 \x01(\r\x12\x0f\n\x07\x65xt_msg\x18\x03 \x01(\x0c\"\xdd\x01\n\x10QQGroupDigestMsg\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x0b\n\x03seq\x18\x02 \x01(\r\x12\x0e\n\x06random\x18\x03 \x01(\r\x12\x0f\n\x07op_type\x18\x04 \x01(\x05\x12\x0e\n\x06sender\x18\x05 \x01(\x04\x12\x13\n\x0b\x64igest_oper\x18\x06 \x01(\x04\x12\x0f\n\x07op_time\x18\x07 \x01(\r\x12\x17\n\x0flastest_msg_seq\x18\x08 \x01(\r\x12\x11\n\toper_nick\x18\t \x01(\x0c\x12\x13\n\x0bsender_nick\x18\n \x01(\x0c\x12\x10\n\x08\x65xt_info\x18\x0b \x01(\x05\"\xc4\x01\n\x17QQGroupDigestMsgSummary\x12\x13\n\x0b\x64igest_oper\x18\x01 \x01(\x04\x12\x0f\n\x07op_type\x18\x02 \x01(\x05\x12\x0f\n\x07op_time\x18\x03 \x01(\r\x12\x13\n\x0b\x64igest_nick\x18\x04 \x01(\x0c\x12\x10\n\x08succ_cnt\x18\x05 \x01(\x05\x12K\n\x0csummary_info\x18\x06 \x03(\x0b\x32\x35.im.oidb.cmd0x857.troop_tips.QQGroupDigestSummaryInfo\"K\n\x18QQGroupDigestSummaryInfo\x12\x0b\n\x03seq\x18\x01 \x01(\r\x12\x0e\n\x06random\x18\x02 \x01(\r\x12\x12\n\nerror_code\x18\x03 \x01(\r\"_\n\x11QQVaLiveNotifyMsg\x12\x0b\n\x03uid\x18\x01 \x01(\x0c\x12\x13\n\x0bnotify_type\x18\x02 \x01(\x05\x12\x0c\n\x04\x65xt1\x18\x03 \x01(\x0c\x12\x0c\n\x04\x65xt2\x18\x04 \x01(\x0c\x12\x0c\n\x04\x65xt3\x18\x05 \x01(\x0c\"u\n\x13QQVedioGamePushInfo\x12\x10\n\x08msg_type\x18\x01 \x01(\r\x12\x12\n\ngroup_code\x18\x02 \x01(\x04\x12\x10\n\x08oper_uin\x18\x03 \x01(\x04\x12\x14\n\x0cversion_ctrl\x18\x04 \x01(\x0c\x12\x10\n\x08\x65xt_info\x18\x05 \x01(\x0c\"\xb5\x03\n\x0fRedGrayTipsInfo\x12\x14\n\x0cshow_lastest\x18\x01 \x01(\r\x12\x12\n\nsender_uin\x18\x02 \x01(\x04\x12\x14\n\x0creceiver_uin\x18\x03 \x01(\x04\x12\x1b\n\x13sender_rich_content\x18\x04 \x01(\x0c\x12\x1d\n\x15receiver_rich_content\x18\x05 \x01(\x0c\x12\x0f\n\x07\x61uthkey\x18\x06 \x01(\x0c\x12\x0f\n\x07msgtype\x18\x07 \x01(\x11\x12\x12\n\nlucky_flag\x18\x08 \x01(\r\x12\x11\n\thide_flag\x18\t \x01(\r\x12\x0f\n\x07pc_body\x18\n \x01(\x0c\x12\x0c\n\x04icon\x18\x0b \x01(\r\x12\x11\n\tlucky_uin\x18\x0c \x01(\x04\x12\x0c\n\x04time\x18\r \x01(\r\x12\x0e\n\x06random\x18\x0e \x01(\r\x12\x1e\n\x16\x62roadcast_rich_content\x18\x0f \x01(\x0c\x12\r\n\x05idiom\x18\x10 \x01(\x0c\x12\x11\n\tidiom_seq\x18\x11 \x01(\r\x12\x13\n\x0bidiom_alpha\x18\x12 \x01(\x0c\x12\x0f\n\x07jumpurl\x18\x13 \x01(\x0c\x12\x12\n\nsubchannel\x18\x14 \x01(\r\x12\x11\n\tpoem_rule\x18\x15 \x01(\x0c\"\x9c\x01\n\x07ReqBody\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\x12\x12\n\nmemberuins\x18\x02 \x03(\x04\x12\x0f\n\x07offline\x18\x03 \x01(\r\x12\x38\n\tinst_ctrl\x18\x04 \x01(\x0b\x32%.im.oidb.cmd0x857.troop_tips.InstCtrl\x12\x0b\n\x03msg\x18\x05 \x01(\x0c\x12\x11\n\tbusi_type\x18\x06 \x01(\r\"p\n\x1aRevertGrayTipsMsgTraceless\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x04\x12\n\n\x02to\x18\x02 \x01(\x04\x12\x12\n\ngroup_code\x18\x03 \x01(\x04\x12\x0f\n\x07\x62usi_id\x18\x04 \x01(\x04\x12\x13\n\x0btips_seq_id\x18\x05 \x01(\x04\"\x1d\n\x07RspBody\x12\x12\n\ngroup_code\x18\x01 \x01(\x04\"\x80\x01\n\x12SingChangePushInfo\x12\x0b\n\x03seq\x18\x01 \x01(\x04\x12\x13\n\x0b\x61\x63tion_type\x18\x02 \x01(\r\x12\x10\n\x08group_id\x18\x03 \x01(\x04\x12\x10\n\x08oper_uin\x18\x04 \x01(\x04\x12\x11\n\tgray_tips\x18\x05 \x01(\x0c\x12\x11\n\tjoin_nums\x18\x06 \x01(\r\"1\n\x19StudyRoomMemberChangePush\x12\x14\n\x0cmember_count\x18\x01 \x01(\r\")\n\nTemplParam\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\r\n\x05value\x18\x02 \x01(\x0c\"o\n\x10ThemeStateNotify\x12\r\n\x05state\x18\x01 \x01(\r\x12\x10\n\x08\x66\x65\x65\x64s_id\x18\x02 \x01(\x0c\x12\x12\n\ntheme_name\x18\x03 \x01(\x0c\x12\x12\n\naction_uin\x18\x04 \x01(\x04\x12\x12\n\ncreate_uin\x18\x05 \x01(\x04\"\x83\x01\n\x15TroopFormGrayTipsInfo\x12\x12\n\nwriter_uin\x18\x01 \x01(\x04\x12\x13\n\x0b\x63reator_uin\x18\x02 \x01(\x04\x12\x14\n\x0crich_content\x18\x03 \x01(\x0c\x12\x15\n\ropt_bytes_url\x18\x04 \x01(\x0c\x12\x14\n\x0c\x63reator_nick\x18\x05 \x01(\x0c\"\xa7\x01\n\x13VideoChangePushInfo\x12\x0b\n\x03seq\x18\x01 \x01(\x04\x12\x13\n\x0b\x61\x63tion_type\x18\x02 \x01(\r\x12\x10\n\x08group_id\x18\x03 \x01(\x04\x12\x10\n\x08oper_uin\x18\x04 \x01(\x04\x12\x11\n\tgray_tips\x18\x05 \x01(\x0c\x12\x11\n\tjoin_nums\x18\x06 \x01(\r\x12\x12\n\njoin_state\x18\x07 \x01(\r\x12\x10\n\x08\x65xt_info\x18\x64 \x01(\x0c\"\xc1\x07\n\x0cWereWolfPush\x12\x11\n\tpush_type\x18\x01 \x01(\r\x12\x11\n\tgame_room\x18\x02 \x01(\x04\x12\x17\n\x0f\x65num_game_state\x18\x03 \x01(\r\x12\x12\n\ngame_round\x18\x04 \x01(\r\x12=\n\x05roles\x18\x05 \x03(\x0b\x32..im.oidb.cmd0x857.troop_tips.WereWolfPush.Role\x12\x0f\n\x07speaker\x18\x06 \x01(\x04\x12\x11\n\tjudge_uin\x18\x07 \x01(\x04\x12\x13\n\x0bjudge_words\x18\x08 \x01(\x0c\x12\x16\n\x0e\x65num_operation\x18\t \x01(\r\x12\x10\n\x08src_user\x18\n \x01(\x04\x12\x10\n\x08\x64st_user\x18\x0b \x01(\x04\x12\x12\n\ndead_users\x18\x0c \x03(\x04\x12\x13\n\x0bgame_result\x18\r \x01(\r\x12\x13\n\x0btimeout_sec\x18\x0e \x01(\r\x12\x16\n\x0ekill_confirmed\x18\x0f \x01(\r\x12\x16\n\x0ejudge_nickname\x18\x10 \x01(\x0c\x12\x17\n\x0fvoted_tie_users\x18\x11 \x03(\x04\x1a\x44\n\nGameRecord\x12\r\n\x05total\x18\x01 \x01(\r\x12\x0b\n\x03win\x18\x02 \x01(\r\x12\x0c\n\x04lose\x18\x03 \x01(\r\x12\x0c\n\x04\x64raw\x18\x04 \x01(\r\x1a\xdc\x03\n\x04Role\x12\x0b\n\x03uin\x18\x01 \x01(\x04\x12\x11\n\tenum_type\x18\x02 \x01(\r\x12\x12\n\nenum_state\x18\x03 \x01(\r\x12\x11\n\tcan_speak\x18\x04 \x01(\r\x12\x12\n\ncan_listen\x18\x05 \x01(\r\x12\x10\n\x08position\x18\x06 \x01(\r\x12\x10\n\x08\x63\x61n_vote\x18\x07 \x01(\r\x12\x11\n\tcan_voted\x18\x08 \x01(\r\x12\x17\n\x0f\x61lready_checked\x18\t \x01(\r\x12\x15\n\ralready_saved\x18\n \x01(\r\x12\x18\n\x10\x61lready_poisoned\x18\x0b \x01(\r\x12\x14\n\x0cplayer_state\x18\x0c \x01(\r\x12\x14\n\x0c\x65num_dead_op\x18\r \x01(\r\x12\x16\n\x0e\x65num_operation\x18\x0e \x01(\r\x12\x10\n\x08\x64st_user\x18\x0f \x01(\x04\x12\x17\n\x0foperation_round\x18\x10 \x01(\r\x12I\n\x0bgame_record\x18\x11 \x01(\x0b\x32\x34.im.oidb.cmd0x857.troop_tips.WereWolfPush.GameRecord\x12\x13\n\x0bis_werewolf\x18\x12 \x01(\r\x12\x15\n\rdefended_user\x18\x13 \x01(\x04\x12\x12\n\nis_sheriff\x18\x14 \x01(\r')
+
+
+
+_AIOGRAYTIPSINFO = DESCRIPTOR.message_types_by_name['AIOGrayTipsInfo']
+_AIOTOPTIPSINFO = DESCRIPTOR.message_types_by_name['AIOTopTipsInfo']
+_FLOATEDTIPSINFO = DESCRIPTOR.message_types_by_name['FloatedTipsInfo']
+_GENERALGRAYTIPINFO = DESCRIPTOR.message_types_by_name['GeneralGrayTipInfo']
+_GOLDMSGTIPSELEM = DESCRIPTOR.message_types_by_name['GoldMsgTipsElem']
+_GRAYDATA = DESCRIPTOR.message_types_by_name['GrayData']
+_GROUPANNOUNCETBCINFO = DESCRIPTOR.message_types_by_name['GroupAnnounceTBCInfo']
+_GROUPASYNCNOTIFY = DESCRIPTOR.message_types_by_name['GroupAsyncNotify']
+_GROUPINFOCHANGE = DESCRIPTOR.message_types_by_name['GroupInfoChange']
+_GROUPNOTIFYINFO = DESCRIPTOR.message_types_by_name['GroupNotifyInfo']
+_INSTCTRL = DESCRIPTOR.message_types_by_name['InstCtrl']
+_INSTINFO = DESCRIPTOR.message_types_by_name['InstInfo']
+_LBSSHARECHANGEPUSHINFO = DESCRIPTOR.message_types_by_name['LbsShareChangePushInfo']
+_LUCKYBAGNOTIFY = DESCRIPTOR.message_types_by_name['LuckyBagNotify']
+_MEDIACHANGEPUSHINFO = DESCRIPTOR.message_types_by_name['MediaChangePushInfo']
+_MEDIACHANGEPUSHINFO_PERSONALSETTING = _MEDIACHANGEPUSHINFO.nested_types_by_name['PersonalSetting']
+_MESSAGEBOXINFO = DESCRIPTOR.message_types_by_name['MessageBoxInfo']
+_MESSAGERECALLREMINDER = DESCRIPTOR.message_types_by_name['MessageRecallReminder']
+_MESSAGERECALLREMINDER_MESSAGEMETA = _MESSAGERECALLREMINDER.nested_types_by_name['MessageMeta']
+_MESSAGERECALLREMINDER_WITHDRAWWORDINGINFO = _MESSAGERECALLREMINDER.nested_types_by_name['WithDrawWordingInfo']
+_MINIAPPNOTIFY = DESCRIPTOR.message_types_by_name['MiniAppNotify']
+_NOTIFYMSGBODY = DESCRIPTOR.message_types_by_name['NotifyMsgBody']
+_NOTIFYOBJMSGUPDATE = DESCRIPTOR.message_types_by_name['NotifyObjmsgUpdate']
+_QQGROUPDIGESTMSG = DESCRIPTOR.message_types_by_name['QQGroupDigestMsg']
+_QQGROUPDIGESTMSGSUMMARY = DESCRIPTOR.message_types_by_name['QQGroupDigestMsgSummary']
+_QQGROUPDIGESTSUMMARYINFO = DESCRIPTOR.message_types_by_name['QQGroupDigestSummaryInfo']
+_QQVALIVENOTIFYMSG = DESCRIPTOR.message_types_by_name['QQVaLiveNotifyMsg']
+_QQVEDIOGAMEPUSHINFO = DESCRIPTOR.message_types_by_name['QQVedioGamePushInfo']
+_REDGRAYTIPSINFO = DESCRIPTOR.message_types_by_name['RedGrayTipsInfo']
+_REQBODY = DESCRIPTOR.message_types_by_name['ReqBody']
+_REVERTGRAYTIPSMSGTRACELESS = DESCRIPTOR.message_types_by_name['RevertGrayTipsMsgTraceless']
+_RSPBODY = DESCRIPTOR.message_types_by_name['RspBody']
+_SINGCHANGEPUSHINFO = DESCRIPTOR.message_types_by_name['SingChangePushInfo']
+_STUDYROOMMEMBERCHANGEPUSH = DESCRIPTOR.message_types_by_name['StudyRoomMemberChangePush']
+_TEMPLPARAM = DESCRIPTOR.message_types_by_name['TemplParam']
+_THEMESTATENOTIFY = DESCRIPTOR.message_types_by_name['ThemeStateNotify']
+_TROOPFORMGRAYTIPSINFO = DESCRIPTOR.message_types_by_name['TroopFormGrayTipsInfo']
+_VIDEOCHANGEPUSHINFO = DESCRIPTOR.message_types_by_name['VideoChangePushInfo']
+_WEREWOLFPUSH = DESCRIPTOR.message_types_by_name['WereWolfPush']
+_WEREWOLFPUSH_GAMERECORD = _WEREWOLFPUSH.nested_types_by_name['GameRecord']
+_WEREWOLFPUSH_ROLE = _WEREWOLFPUSH.nested_types_by_name['Role']
+AIOGrayTipsInfo = _reflection.GeneratedProtocolMessageType('AIOGrayTipsInfo', (_message.Message,), {
+  'DESCRIPTOR' : _AIOGRAYTIPSINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.AIOGrayTipsInfo)
+  })
+_sym_db.RegisterMessage(AIOGrayTipsInfo)
+
+AIOTopTipsInfo = _reflection.GeneratedProtocolMessageType('AIOTopTipsInfo', (_message.Message,), {
+  'DESCRIPTOR' : _AIOTOPTIPSINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.AIOTopTipsInfo)
+  })
+_sym_db.RegisterMessage(AIOTopTipsInfo)
+
+FloatedTipsInfo = _reflection.GeneratedProtocolMessageType('FloatedTipsInfo', (_message.Message,), {
+  'DESCRIPTOR' : _FLOATEDTIPSINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.FloatedTipsInfo)
+  })
+_sym_db.RegisterMessage(FloatedTipsInfo)
+
+GeneralGrayTipInfo = _reflection.GeneratedProtocolMessageType('GeneralGrayTipInfo', (_message.Message,), {
+  'DESCRIPTOR' : _GENERALGRAYTIPINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.GeneralGrayTipInfo)
+  })
+_sym_db.RegisterMessage(GeneralGrayTipInfo)
+
+GoldMsgTipsElem = _reflection.GeneratedProtocolMessageType('GoldMsgTipsElem', (_message.Message,), {
+  'DESCRIPTOR' : _GOLDMSGTIPSELEM,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.GoldMsgTipsElem)
+  })
+_sym_db.RegisterMessage(GoldMsgTipsElem)
+
+GrayData = _reflection.GeneratedProtocolMessageType('GrayData', (_message.Message,), {
+  'DESCRIPTOR' : _GRAYDATA,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.GrayData)
+  })
+_sym_db.RegisterMessage(GrayData)
+
+GroupAnnounceTBCInfo = _reflection.GeneratedProtocolMessageType('GroupAnnounceTBCInfo', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPANNOUNCETBCINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.GroupAnnounceTBCInfo)
+  })
+_sym_db.RegisterMessage(GroupAnnounceTBCInfo)
+
+GroupAsyncNotify = _reflection.GeneratedProtocolMessageType('GroupAsyncNotify', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPASYNCNOTIFY,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.GroupAsyncNotify)
+  })
+_sym_db.RegisterMessage(GroupAsyncNotify)
+
+GroupInfoChange = _reflection.GeneratedProtocolMessageType('GroupInfoChange', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPINFOCHANGE,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.GroupInfoChange)
+  })
+_sym_db.RegisterMessage(GroupInfoChange)
+
+GroupNotifyInfo = _reflection.GeneratedProtocolMessageType('GroupNotifyInfo', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPNOTIFYINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.GroupNotifyInfo)
+  })
+_sym_db.RegisterMessage(GroupNotifyInfo)
+
+InstCtrl = _reflection.GeneratedProtocolMessageType('InstCtrl', (_message.Message,), {
+  'DESCRIPTOR' : _INSTCTRL,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.InstCtrl)
+  })
+_sym_db.RegisterMessage(InstCtrl)
+
+InstInfo = _reflection.GeneratedProtocolMessageType('InstInfo', (_message.Message,), {
+  'DESCRIPTOR' : _INSTINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.InstInfo)
+  })
+_sym_db.RegisterMessage(InstInfo)
+
+LbsShareChangePushInfo = _reflection.GeneratedProtocolMessageType('LbsShareChangePushInfo', (_message.Message,), {
+  'DESCRIPTOR' : _LBSSHARECHANGEPUSHINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.LbsShareChangePushInfo)
+  })
+_sym_db.RegisterMessage(LbsShareChangePushInfo)
+
+LuckyBagNotify = _reflection.GeneratedProtocolMessageType('LuckyBagNotify', (_message.Message,), {
+  'DESCRIPTOR' : _LUCKYBAGNOTIFY,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.LuckyBagNotify)
+  })
+_sym_db.RegisterMessage(LuckyBagNotify)
+
+MediaChangePushInfo = _reflection.GeneratedProtocolMessageType('MediaChangePushInfo', (_message.Message,), {
+
+  'PersonalSetting' : _reflection.GeneratedProtocolMessageType('PersonalSetting', (_message.Message,), {
+    'DESCRIPTOR' : _MEDIACHANGEPUSHINFO_PERSONALSETTING,
+    '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+    # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.MediaChangePushInfo.PersonalSetting)
+    })
+  ,
+  'DESCRIPTOR' : _MEDIACHANGEPUSHINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.MediaChangePushInfo)
+  })
+_sym_db.RegisterMessage(MediaChangePushInfo)
+_sym_db.RegisterMessage(MediaChangePushInfo.PersonalSetting)
+
+MessageBoxInfo = _reflection.GeneratedProtocolMessageType('MessageBoxInfo', (_message.Message,), {
+  'DESCRIPTOR' : _MESSAGEBOXINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.MessageBoxInfo)
+  })
+_sym_db.RegisterMessage(MessageBoxInfo)
+
+MessageRecallReminder = _reflection.GeneratedProtocolMessageType('MessageRecallReminder', (_message.Message,), {
+
+  'MessageMeta' : _reflection.GeneratedProtocolMessageType('MessageMeta', (_message.Message,), {
+    'DESCRIPTOR' : _MESSAGERECALLREMINDER_MESSAGEMETA,
+    '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+    # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.MessageRecallReminder.MessageMeta)
+    })
+  ,
+
+  'WithDrawWordingInfo' : _reflection.GeneratedProtocolMessageType('WithDrawWordingInfo', (_message.Message,), {
+    'DESCRIPTOR' : _MESSAGERECALLREMINDER_WITHDRAWWORDINGINFO,
+    '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+    # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.MessageRecallReminder.WithDrawWordingInfo)
+    })
+  ,
+  'DESCRIPTOR' : _MESSAGERECALLREMINDER,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.MessageRecallReminder)
+  })
+_sym_db.RegisterMessage(MessageRecallReminder)
+_sym_db.RegisterMessage(MessageRecallReminder.MessageMeta)
+_sym_db.RegisterMessage(MessageRecallReminder.WithDrawWordingInfo)
+
+MiniAppNotify = _reflection.GeneratedProtocolMessageType('MiniAppNotify', (_message.Message,), {
+  'DESCRIPTOR' : _MINIAPPNOTIFY,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.MiniAppNotify)
+  })
+_sym_db.RegisterMessage(MiniAppNotify)
+
+NotifyMsgBody = _reflection.GeneratedProtocolMessageType('NotifyMsgBody', (_message.Message,), {
+  'DESCRIPTOR' : _NOTIFYMSGBODY,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.NotifyMsgBody)
+  })
+_sym_db.RegisterMessage(NotifyMsgBody)
+
+NotifyObjmsgUpdate = _reflection.GeneratedProtocolMessageType('NotifyObjmsgUpdate', (_message.Message,), {
+  'DESCRIPTOR' : _NOTIFYOBJMSGUPDATE,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.NotifyObjmsgUpdate)
+  })
+_sym_db.RegisterMessage(NotifyObjmsgUpdate)
+
+QQGroupDigestMsg = _reflection.GeneratedProtocolMessageType('QQGroupDigestMsg', (_message.Message,), {
+  'DESCRIPTOR' : _QQGROUPDIGESTMSG,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.QQGroupDigestMsg)
+  })
+_sym_db.RegisterMessage(QQGroupDigestMsg)
+
+QQGroupDigestMsgSummary = _reflection.GeneratedProtocolMessageType('QQGroupDigestMsgSummary', (_message.Message,), {
+  'DESCRIPTOR' : _QQGROUPDIGESTMSGSUMMARY,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.QQGroupDigestMsgSummary)
+  })
+_sym_db.RegisterMessage(QQGroupDigestMsgSummary)
+
+QQGroupDigestSummaryInfo = _reflection.GeneratedProtocolMessageType('QQGroupDigestSummaryInfo', (_message.Message,), {
+  'DESCRIPTOR' : _QQGROUPDIGESTSUMMARYINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.QQGroupDigestSummaryInfo)
+  })
+_sym_db.RegisterMessage(QQGroupDigestSummaryInfo)
+
+QQVaLiveNotifyMsg = _reflection.GeneratedProtocolMessageType('QQVaLiveNotifyMsg', (_message.Message,), {
+  'DESCRIPTOR' : _QQVALIVENOTIFYMSG,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.QQVaLiveNotifyMsg)
+  })
+_sym_db.RegisterMessage(QQVaLiveNotifyMsg)
+
+QQVedioGamePushInfo = _reflection.GeneratedProtocolMessageType('QQVedioGamePushInfo', (_message.Message,), {
+  'DESCRIPTOR' : _QQVEDIOGAMEPUSHINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.QQVedioGamePushInfo)
+  })
+_sym_db.RegisterMessage(QQVedioGamePushInfo)
+
+RedGrayTipsInfo = _reflection.GeneratedProtocolMessageType('RedGrayTipsInfo', (_message.Message,), {
+  'DESCRIPTOR' : _REDGRAYTIPSINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.RedGrayTipsInfo)
+  })
+_sym_db.RegisterMessage(RedGrayTipsInfo)
+
+ReqBody = _reflection.GeneratedProtocolMessageType('ReqBody', (_message.Message,), {
+  'DESCRIPTOR' : _REQBODY,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.ReqBody)
+  })
+_sym_db.RegisterMessage(ReqBody)
+
+RevertGrayTipsMsgTraceless = _reflection.GeneratedProtocolMessageType('RevertGrayTipsMsgTraceless', (_message.Message,), {
+  'DESCRIPTOR' : _REVERTGRAYTIPSMSGTRACELESS,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.RevertGrayTipsMsgTraceless)
+  })
+_sym_db.RegisterMessage(RevertGrayTipsMsgTraceless)
+
+RspBody = _reflection.GeneratedProtocolMessageType('RspBody', (_message.Message,), {
+  'DESCRIPTOR' : _RSPBODY,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.RspBody)
+  })
+_sym_db.RegisterMessage(RspBody)
+
+SingChangePushInfo = _reflection.GeneratedProtocolMessageType('SingChangePushInfo', (_message.Message,), {
+  'DESCRIPTOR' : _SINGCHANGEPUSHINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.SingChangePushInfo)
+  })
+_sym_db.RegisterMessage(SingChangePushInfo)
+
+StudyRoomMemberChangePush = _reflection.GeneratedProtocolMessageType('StudyRoomMemberChangePush', (_message.Message,), {
+  'DESCRIPTOR' : _STUDYROOMMEMBERCHANGEPUSH,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.StudyRoomMemberChangePush)
+  })
+_sym_db.RegisterMessage(StudyRoomMemberChangePush)
+
+TemplParam = _reflection.GeneratedProtocolMessageType('TemplParam', (_message.Message,), {
+  'DESCRIPTOR' : _TEMPLPARAM,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.TemplParam)
+  })
+_sym_db.RegisterMessage(TemplParam)
+
+ThemeStateNotify = _reflection.GeneratedProtocolMessageType('ThemeStateNotify', (_message.Message,), {
+  'DESCRIPTOR' : _THEMESTATENOTIFY,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.ThemeStateNotify)
+  })
+_sym_db.RegisterMessage(ThemeStateNotify)
+
+TroopFormGrayTipsInfo = _reflection.GeneratedProtocolMessageType('TroopFormGrayTipsInfo', (_message.Message,), {
+  'DESCRIPTOR' : _TROOPFORMGRAYTIPSINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.TroopFormGrayTipsInfo)
+  })
+_sym_db.RegisterMessage(TroopFormGrayTipsInfo)
+
+VideoChangePushInfo = _reflection.GeneratedProtocolMessageType('VideoChangePushInfo', (_message.Message,), {
+  'DESCRIPTOR' : _VIDEOCHANGEPUSHINFO,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.VideoChangePushInfo)
+  })
+_sym_db.RegisterMessage(VideoChangePushInfo)
+
+WereWolfPush = _reflection.GeneratedProtocolMessageType('WereWolfPush', (_message.Message,), {
+
+  'GameRecord' : _reflection.GeneratedProtocolMessageType('GameRecord', (_message.Message,), {
+    'DESCRIPTOR' : _WEREWOLFPUSH_GAMERECORD,
+    '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+    # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.WereWolfPush.GameRecord)
+    })
+  ,
+
+  'Role' : _reflection.GeneratedProtocolMessageType('Role', (_message.Message,), {
+    'DESCRIPTOR' : _WEREWOLFPUSH_ROLE,
+    '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+    # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.WereWolfPush.Role)
+    })
+  ,
+  'DESCRIPTOR' : _WEREWOLFPUSH,
+  '__module__' : 'cai.pb.im.oidb.cmd0x857.troop_tips.troop_tips_pb2'
+  # @@protoc_insertion_point(class_scope:im.oidb.cmd0x857.troop_tips.WereWolfPush)
+  })
+_sym_db.RegisterMessage(WereWolfPush)
+_sym_db.RegisterMessage(WereWolfPush.GameRecord)
+_sym_db.RegisterMessage(WereWolfPush.Role)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _AIOGRAYTIPSINFO._serialized_start=85
+  _AIOGRAYTIPSINFO._serialized_end=245
+  _AIOTOPTIPSINFO._serialized_start=248
+  _AIOTOPTIPSINFO._serialized_end=391
+  _FLOATEDTIPSINFO._serialized_start=393
+  _FLOATEDTIPSINFO._serialized_end=427
+  _GENERALGRAYTIPINFO._serialized_start=430
+  _GENERALGRAYTIPINFO._serialized_end=682
+  _GOLDMSGTIPSELEM._serialized_start=685
+  _GOLDMSGTIPSELEM._serialized_end=842
+  _GRAYDATA._serialized_start=844
+  _GRAYDATA._serialized_end=889
+  _GROUPANNOUNCETBCINFO._serialized_start=891
+  _GROUPANNOUNCETBCINFO._serialized_end=965
+  _GROUPASYNCNOTIFY._serialized_start=967
+  _GROUPASYNCNOTIFY._serialized_end=1020
+  _GROUPINFOCHANGE._serialized_start=1023
+  _GROUPINFOCHANGE._serialized_end=1249
+  _GROUPNOTIFYINFO._serialized_start=1251
+  _GROUPNOTIFYINFO._serialized_end=1310
+  _INSTCTRL._serialized_start=1313
+  _INSTCTRL._serialized_end=1503
+  _INSTINFO._serialized_start=1506
+  _INSTINFO._serialized_end=1670
+  _LBSSHARECHANGEPUSHINFO._serialized_start=1673
+  _LBSSHARECHANGEPUSHINFO._serialized_end=1883
+  _LUCKYBAGNOTIFY._serialized_start=1885
+  _LUCKYBAGNOTIFY._serialized_end=1919
+  _MEDIACHANGEPUSHINFO._serialized_start=1922
+  _MEDIACHANGEPUSHINFO._serialized_end=2337
+  _MEDIACHANGEPUSHINFO_PERSONALSETTING._serialized_start=2266
+  _MEDIACHANGEPUSHINFO_PERSONALSETTING._serialized_end=2337
+  _MESSAGEBOXINFO._serialized_start=2339
+  _MESSAGEBOXINFO._serialized_end=2403
+  _MESSAGERECALLREMINDER._serialized_start=2406
+  _MESSAGERECALLREMINDER._serialized_end=2944
+  _MESSAGERECALLREMINDER_MESSAGEMETA._serialized_start=2747
+  _MESSAGERECALLREMINDER_MESSAGEMETA._serialized_end=2885
+  _MESSAGERECALLREMINDER_WITHDRAWWORDINGINFO._serialized_start=2887
+  _MESSAGERECALLREMINDER_WITHDRAWWORDINGINFO._serialized_end=2944
+  _MINIAPPNOTIFY._serialized_start=2946
+  _MINIAPPNOTIFY._serialized_end=2974
+  _NOTIFYMSGBODY._serialized_start=2977
+  _NOTIFYMSGBODY._serialized_end=5209
+  _NOTIFYOBJMSGUPDATE._serialized_start=5211
+  _NOTIFYOBJMSGUPDATE._serialized_end=5288
+  _QQGROUPDIGESTMSG._serialized_start=5291
+  _QQGROUPDIGESTMSG._serialized_end=5512
+  _QQGROUPDIGESTMSGSUMMARY._serialized_start=5515
+  _QQGROUPDIGESTMSGSUMMARY._serialized_end=5711
+  _QQGROUPDIGESTSUMMARYINFO._serialized_start=5713
+  _QQGROUPDIGESTSUMMARYINFO._serialized_end=5788
+  _QQVALIVENOTIFYMSG._serialized_start=5790
+  _QQVALIVENOTIFYMSG._serialized_end=5885
+  _QQVEDIOGAMEPUSHINFO._serialized_start=5887
+  _QQVEDIOGAMEPUSHINFO._serialized_end=6004
+  _REDGRAYTIPSINFO._serialized_start=6007
+  _REDGRAYTIPSINFO._serialized_end=6444
+  _REQBODY._serialized_start=6447
+  _REQBODY._serialized_end=6603
+  _REVERTGRAYTIPSMSGTRACELESS._serialized_start=6605
+  _REVERTGRAYTIPSMSGTRACELESS._serialized_end=6717
+  _RSPBODY._serialized_start=6719
+  _RSPBODY._serialized_end=6748
+  _SINGCHANGEPUSHINFO._serialized_start=6751
+  _SINGCHANGEPUSHINFO._serialized_end=6879
+  _STUDYROOMMEMBERCHANGEPUSH._serialized_start=6881
+  _STUDYROOMMEMBERCHANGEPUSH._serialized_end=6930
+  _TEMPLPARAM._serialized_start=6932
+  _TEMPLPARAM._serialized_end=6973
+  _THEMESTATENOTIFY._serialized_start=6975
+  _THEMESTATENOTIFY._serialized_end=7086
+  _TROOPFORMGRAYTIPSINFO._serialized_start=7089
+  _TROOPFORMGRAYTIPSINFO._serialized_end=7220
+  _VIDEOCHANGEPUSHINFO._serialized_start=7223
+  _VIDEOCHANGEPUSHINFO._serialized_end=7390
+  _WEREWOLFPUSH._serialized_start=7393
+  _WEREWOLFPUSH._serialized_end=8354
+  _WEREWOLFPUSH_GAMERECORD._serialized_start=7807
+  _WEREWOLFPUSH_GAMERECORD._serialized_end=7875
+  _WEREWOLFPUSH_ROLE._serialized_start=7878
+  _WEREWOLFPUSH_ROLE._serialized_end=8354
+# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips_pb2.pyi b/cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips_pb2.pyi
new file mode 100644
index 00000000..decaed08
--- /dev/null
+++ b/cai/pb/im/oidb/cmd0x857/troop_tips/troop_tips_pb2.pyi
@@ -0,0 +1,1261 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+from builtins import (
+    bool,
+    bytes,
+    int,
+)
+
+from google.protobuf.descriptor import (
+    Descriptor,
+    FileDescriptor,
+)
+
+from google.protobuf.internal.containers import (
+    RepeatedCompositeFieldContainer,
+    RepeatedScalarFieldContainer,
+)
+
+from google.protobuf.message import (
+    Message,
+)
+
+from typing import (
+    Iterable,
+    Optional,
+    Text,
+)
+
+from typing_extensions import (
+    Literal,
+)
+
+
+DESCRIPTOR: FileDescriptor
+
+class AIOGrayTipsInfo(Message):
+    """tencent/im/oidb/cmd0x857/TroopTips0x857.java
+
+    """
+    DESCRIPTOR: Descriptor
+    SHOW_LASTEST_FIELD_NUMBER: int
+    CONTENT_FIELD_NUMBER: int
+    REMIND_FIELD_NUMBER: int
+    BRIEF_FIELD_NUMBER: int
+    RECEIVER_UIN_FIELD_NUMBER: int
+    RELIAO_ADMIN_OPT_FIELD_NUMBER: int
+    ROBOT_GROUP_OPT_FIELD_NUMBER: int
+    show_lastest: int
+    content: bytes
+    remind: int
+    brief: bytes
+    receiver_uin: int
+    reliao_admin_opt: int
+    robot_group_opt: int
+    def __init__(self,
+        *,
+        show_lastest: Optional[int] = ...,
+        content: Optional[bytes] = ...,
+        remind: Optional[int] = ...,
+        brief: Optional[bytes] = ...,
+        receiver_uin: Optional[int] = ...,
+        reliao_admin_opt: Optional[int] = ...,
+        robot_group_opt: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["brief",b"brief","content",b"content","receiver_uin",b"receiver_uin","reliao_admin_opt",b"reliao_admin_opt","remind",b"remind","robot_group_opt",b"robot_group_opt","show_lastest",b"show_lastest"]) -> bool: ...
+    def ClearField(self, field_name: Literal["brief",b"brief","content",b"content","receiver_uin",b"receiver_uin","reliao_admin_opt",b"reliao_admin_opt","remind",b"remind","robot_group_opt",b"robot_group_opt","show_lastest",b"show_lastest"]) -> None: ...
+
+class AIOTopTipsInfo(Message):
+    DESCRIPTOR: Descriptor
+    CONTENT_FIELD_NUMBER: int
+    ICON_FIELD_NUMBER: int
+    ENUM_ACTION_FIELD_NUMBER: int
+    URL_FIELD_NUMBER: int
+    DATA_FIELD_NUMBER: int
+    DATA_I_FIELD_NUMBER: int
+    DATA_A_FIELD_NUMBER: int
+    DATA_P_FIELD_NUMBER: int
+    content: bytes
+    icon: int
+    enum_action: int
+    url: bytes
+    data: bytes
+    data_i: bytes
+    data_a: bytes
+    data_p: bytes
+    def __init__(self,
+        *,
+        content: Optional[bytes] = ...,
+        icon: Optional[int] = ...,
+        enum_action: Optional[int] = ...,
+        url: Optional[bytes] = ...,
+        data: Optional[bytes] = ...,
+        data_i: Optional[bytes] = ...,
+        data_a: Optional[bytes] = ...,
+        data_p: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["content",b"content","data",b"data","data_a",b"data_a","data_i",b"data_i","data_p",b"data_p","enum_action",b"enum_action","icon",b"icon","url",b"url"]) -> bool: ...
+    def ClearField(self, field_name: Literal["content",b"content","data",b"data","data_a",b"data_a","data_i",b"data_i","data_p",b"data_p","enum_action",b"enum_action","icon",b"icon","url",b"url"]) -> None: ...
+
+class FloatedTipsInfo(Message):
+    DESCRIPTOR: Descriptor
+    CONTENT_FIELD_NUMBER: int
+    content: bytes
+    def __init__(self,
+        *,
+        content: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["content",b"content"]) -> bool: ...
+    def ClearField(self, field_name: Literal["content",b"content"]) -> None: ...
+
+class GeneralGrayTipInfo(Message):
+    DESCRIPTOR: Descriptor
+    BUSI_TYPE_FIELD_NUMBER: int
+    BUSI_ID_FIELD_NUMBER: int
+    CTRL_FLAG_FIELD_NUMBER: int
+    C2C_TYPE_FIELD_NUMBER: int
+    SERVICE_TYPE_FIELD_NUMBER: int
+    TEMPL_ID_FIELD_NUMBER: int
+    TEMPL_PARAM_FIELD_NUMBER: int
+    CONTENT_FIELD_NUMBER: int
+    TIPS_SEQ_ID_FIELD_NUMBER: int
+    PB_RESERV_FIELD_NUMBER: int
+    busi_type: int
+    busi_id: int
+    ctrl_flag: int
+    c2c_type: int
+    service_type: int
+    templ_id: int
+    @property
+    def templ_param(self) -> RepeatedCompositeFieldContainer[TemplParam]: ...
+    content: bytes
+    tips_seq_id: int
+    pb_reserv: bytes
+    def __init__(self,
+        *,
+        busi_type: Optional[int] = ...,
+        busi_id: Optional[int] = ...,
+        ctrl_flag: Optional[int] = ...,
+        c2c_type: Optional[int] = ...,
+        service_type: Optional[int] = ...,
+        templ_id: Optional[int] = ...,
+        templ_param: Optional[Iterable[TemplParam]] = ...,
+        content: Optional[bytes] = ...,
+        tips_seq_id: Optional[int] = ...,
+        pb_reserv: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["busi_id",b"busi_id","busi_type",b"busi_type","c2c_type",b"c2c_type","content",b"content","ctrl_flag",b"ctrl_flag","pb_reserv",b"pb_reserv","service_type",b"service_type","templ_id",b"templ_id","tips_seq_id",b"tips_seq_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["busi_id",b"busi_id","busi_type",b"busi_type","c2c_type",b"c2c_type","content",b"content","ctrl_flag",b"ctrl_flag","pb_reserv",b"pb_reserv","service_type",b"service_type","templ_id",b"templ_id","templ_param",b"templ_param","tips_seq_id",b"tips_seq_id"]) -> None: ...
+
+class GoldMsgTipsElem(Message):
+    DESCRIPTOR: Descriptor
+    TYPE_FIELD_NUMBER: int
+    BILLNO_FIELD_NUMBER: int
+    RESULT_FIELD_NUMBER: int
+    AMOUNT_FIELD_NUMBER: int
+    TOTAL_FIELD_NUMBER: int
+    INTERVAL_FIELD_NUMBER: int
+    FINISH_FIELD_NUMBER: int
+    UIN_FIELD_NUMBER: int
+    ACTION_FIELD_NUMBER: int
+    type: int
+    billno: Text
+    result: int
+    amount: int
+    total: int
+    interval: int
+    finish: int
+    @property
+    def uin(self) -> RepeatedScalarFieldContainer[int]: ...
+    action: int
+    def __init__(self,
+        *,
+        type: Optional[int] = ...,
+        billno: Optional[Text] = ...,
+        result: Optional[int] = ...,
+        amount: Optional[int] = ...,
+        total: Optional[int] = ...,
+        interval: Optional[int] = ...,
+        finish: Optional[int] = ...,
+        uin: Optional[Iterable[int]] = ...,
+        action: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["action",b"action","amount",b"amount","billno",b"billno","finish",b"finish","interval",b"interval","result",b"result","total",b"total","type",b"type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["action",b"action","amount",b"amount","billno",b"billno","finish",b"finish","interval",b"interval","result",b"result","total",b"total","type",b"type","uin",b"uin"]) -> None: ...
+
+class GrayData(Message):
+    DESCRIPTOR: Descriptor
+    ALL_READ_FIELD_NUMBER: int
+    FEED_ID_FIELD_NUMBER: int
+    all_read: int
+    feed_id: Text
+    def __init__(self,
+        *,
+        all_read: Optional[int] = ...,
+        feed_id: Optional[Text] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["all_read",b"all_read","feed_id",b"feed_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["all_read",b"all_read","feed_id",b"feed_id"]) -> None: ...
+
+class GroupAnnounceTBCInfo(Message):
+    DESCRIPTOR: Descriptor
+    FEEDS_ID_FIELD_NUMBER: int
+    GROUP_ID_FIELD_NUMBER: int
+    ACTION_FIELD_NUMBER: int
+    feeds_id: bytes
+    group_id: int
+    action: int
+    def __init__(self,
+        *,
+        feeds_id: Optional[bytes] = ...,
+        group_id: Optional[int] = ...,
+        action: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["action",b"action","feeds_id",b"feeds_id","group_id",b"group_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["action",b"action","feeds_id",b"feeds_id","group_id",b"group_id"]) -> None: ...
+
+class GroupAsyncNotify(Message):
+    DESCRIPTOR: Descriptor
+    MSG_TYPE_FIELD_NUMBER: int
+    MSG_SEQ_FIELD_NUMBER: int
+    msg_type: int
+    msg_seq: int
+    def __init__(self,
+        *,
+        msg_type: Optional[int] = ...,
+        msg_seq: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["msg_seq",b"msg_seq","msg_type",b"msg_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["msg_seq",b"msg_seq","msg_type",b"msg_type"]) -> None: ...
+
+class GroupInfoChange(Message):
+    DESCRIPTOR: Descriptor
+    GROUP_HONOR_SWITCH_FIELD_NUMBER: int
+    GROUP_MEMBER_LEVEL_SWITCH_FIELD_NUMBER: int
+    GROUP_FLAGEXT4_FIELD_NUMBER: int
+    APPEAL_DEADLINE_FIELD_NUMBER: int
+    GROUP_FLAG_FIELD_NUMBER: int
+    GROUP_FLAGEXT3_FIELD_NUMBER: int
+    GROUP_CLASS_EXT_FIELD_NUMBER: int
+    GROUP_INFO_EXT_SEQ_FIELD_NUMBER: int
+    group_honor_switch: int
+    group_member_level_switch: int
+    group_flagext4: int
+    appeal_deadline: int
+    group_flag: int
+    group_flagext3: int
+    group_class_ext: int
+    group_info_ext_seq: int
+    def __init__(self,
+        *,
+        group_honor_switch: Optional[int] = ...,
+        group_member_level_switch: Optional[int] = ...,
+        group_flagext4: Optional[int] = ...,
+        appeal_deadline: Optional[int] = ...,
+        group_flag: Optional[int] = ...,
+        group_flagext3: Optional[int] = ...,
+        group_class_ext: Optional[int] = ...,
+        group_info_ext_seq: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["appeal_deadline",b"appeal_deadline","group_class_ext",b"group_class_ext","group_flag",b"group_flag","group_flagext3",b"group_flagext3","group_flagext4",b"group_flagext4","group_honor_switch",b"group_honor_switch","group_info_ext_seq",b"group_info_ext_seq","group_member_level_switch",b"group_member_level_switch"]) -> bool: ...
+    def ClearField(self, field_name: Literal["appeal_deadline",b"appeal_deadline","group_class_ext",b"group_class_ext","group_flag",b"group_flag","group_flagext3",b"group_flagext3","group_flagext4",b"group_flagext4","group_honor_switch",b"group_honor_switch","group_info_ext_seq",b"group_info_ext_seq","group_member_level_switch",b"group_member_level_switch"]) -> None: ...
+
+class GroupNotifyInfo(Message):
+    DESCRIPTOR: Descriptor
+    AUTO_PULL_FLAG_FIELD_NUMBER: int
+    FEEDS_ID_FIELD_NUMBER: int
+    auto_pull_flag: int
+    feeds_id: bytes
+    def __init__(self,
+        *,
+        auto_pull_flag: Optional[int] = ...,
+        feeds_id: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["auto_pull_flag",b"auto_pull_flag","feeds_id",b"feeds_id"]) -> bool: ...
+    def ClearField(self, field_name: Literal["auto_pull_flag",b"auto_pull_flag","feeds_id",b"feeds_id"]) -> None: ...
+
+class InstCtrl(Message):
+    DESCRIPTOR: Descriptor
+    SEND_TO_INST_FIELD_NUMBER: int
+    EXCLUDE_INST_FIELD_NUMBER: int
+    FROM_INST_FIELD_NUMBER: int
+    @property
+    def send_to_inst(self) -> RepeatedCompositeFieldContainer[InstInfo]: ...
+    @property
+    def exclude_inst(self) -> RepeatedCompositeFieldContainer[InstInfo]: ...
+    @property
+    def from_inst(self) -> InstInfo: ...
+    def __init__(self,
+        *,
+        send_to_inst: Optional[Iterable[InstInfo]] = ...,
+        exclude_inst: Optional[Iterable[InstInfo]] = ...,
+        from_inst: Optional[InstInfo] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["from_inst",b"from_inst"]) -> bool: ...
+    def ClearField(self, field_name: Literal["exclude_inst",b"exclude_inst","from_inst",b"from_inst","send_to_inst",b"send_to_inst"]) -> None: ...
+
+class InstInfo(Message):
+    DESCRIPTOR: Descriptor
+    APPPID_FIELD_NUMBER: int
+    INSTID_FIELD_NUMBER: int
+    PLATFORM_FIELD_NUMBER: int
+    OPEN_APPID_FIELD_NUMBER: int
+    PRODUCTID_FIELD_NUMBER: int
+    SSO_BID_FIELD_NUMBER: int
+    GUID_FIELD_NUMBER: int
+    VER_MIN_FIELD_NUMBER: int
+    VER_MAX_FIELD_NUMBER: int
+    apppid: int
+    instid: int
+    platform: int
+    open_appid: int
+    productid: int
+    sso_bid: int
+    guid: bytes
+    ver_min: int
+    ver_max: int
+    def __init__(self,
+        *,
+        apppid: Optional[int] = ...,
+        instid: Optional[int] = ...,
+        platform: Optional[int] = ...,
+        open_appid: Optional[int] = ...,
+        productid: Optional[int] = ...,
+        sso_bid: Optional[int] = ...,
+        guid: Optional[bytes] = ...,
+        ver_min: Optional[int] = ...,
+        ver_max: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["apppid",b"apppid","guid",b"guid","instid",b"instid","open_appid",b"open_appid","platform",b"platform","productid",b"productid","sso_bid",b"sso_bid","ver_max",b"ver_max","ver_min",b"ver_min"]) -> bool: ...
+    def ClearField(self, field_name: Literal["apppid",b"apppid","guid",b"guid","instid",b"instid","open_appid",b"open_appid","platform",b"platform","productid",b"productid","sso_bid",b"sso_bid","ver_max",b"ver_max","ver_min",b"ver_min"]) -> None: ...
+
+class LbsShareChangePushInfo(Message):
+    DESCRIPTOR: Descriptor
+    MSG_TYPE_FIELD_NUMBER: int
+    MSG_INFO_FIELD_NUMBER: int
+    VERSION_CTRL_FIELD_NUMBER: int
+    GROUP_ID_FIELD_NUMBER: int
+    OPER_UIN_FIELD_NUMBER: int
+    GRAY_TIPS_FIELD_NUMBER: int
+    MSG_SEQ_FIELD_NUMBER: int
+    JOIN_NUMS_FIELD_NUMBER: int
+    PUSH_TYPE_FIELD_NUMBER: int
+    EXT_INFO_FIELD_NUMBER: int
+    msg_type: int
+    msg_info: bytes
+    version_ctrl: bytes
+    group_id: int
+    oper_uin: int
+    gray_tips: bytes
+    msg_seq: int
+    join_nums: int
+    push_type: int
+    ext_info: bytes
+    def __init__(self,
+        *,
+        msg_type: Optional[int] = ...,
+        msg_info: Optional[bytes] = ...,
+        version_ctrl: Optional[bytes] = ...,
+        group_id: Optional[int] = ...,
+        oper_uin: Optional[int] = ...,
+        gray_tips: Optional[bytes] = ...,
+        msg_seq: Optional[int] = ...,
+        join_nums: Optional[int] = ...,
+        push_type: Optional[int] = ...,
+        ext_info: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["ext_info",b"ext_info","gray_tips",b"gray_tips","group_id",b"group_id","join_nums",b"join_nums","msg_info",b"msg_info","msg_seq",b"msg_seq","msg_type",b"msg_type","oper_uin",b"oper_uin","push_type",b"push_type","version_ctrl",b"version_ctrl"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ext_info",b"ext_info","gray_tips",b"gray_tips","group_id",b"group_id","join_nums",b"join_nums","msg_info",b"msg_info","msg_seq",b"msg_seq","msg_type",b"msg_type","oper_uin",b"oper_uin","push_type",b"push_type","version_ctrl",b"version_ctrl"]) -> None: ...
+
+class LuckyBagNotify(Message):
+    DESCRIPTOR: Descriptor
+    MSG_TIPS_FIELD_NUMBER: int
+    msg_tips: bytes
+    def __init__(self,
+        *,
+        msg_tips: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["msg_tips",b"msg_tips"]) -> bool: ...
+    def ClearField(self, field_name: Literal["msg_tips",b"msg_tips"]) -> None: ...
+
+class MediaChangePushInfo(Message):
+    DESCRIPTOR: Descriptor
+    class PersonalSetting(Message):
+        DESCRIPTOR: Descriptor
+        THEME_ID_FIELD_NUMBER: int
+        PLAYER_ID_FIELD_NUMBER: int
+        FONT_ID_FIELD_NUMBER: int
+        theme_id: int
+        player_id: int
+        font_id: int
+        def __init__(self,
+            *,
+            theme_id: Optional[int] = ...,
+            player_id: Optional[int] = ...,
+            font_id: Optional[int] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["font_id",b"font_id","player_id",b"player_id","theme_id",b"theme_id"]) -> bool: ...
+        def ClearField(self, field_name: Literal["font_id",b"font_id","player_id",b"player_id","theme_id",b"theme_id"]) -> None: ...
+
+    MSG_TYPE_FIELD_NUMBER: int
+    MSG_INFO_FIELD_NUMBER: int
+    VERSION_CTRL_FIELD_NUMBER: int
+    GROUP_ID_FIELD_NUMBER: int
+    OPER_UIN_FIELD_NUMBER: int
+    GRAY_TIPS_FIELD_NUMBER: int
+    MSG_SEQ_FIELD_NUMBER: int
+    JOIN_NUMS_FIELD_NUMBER: int
+    PER_SETTING_FIELD_NUMBER: int
+    PLAY_MODE_FIELD_NUMBER: int
+    IS_JOIN_WHEN_START_FIELD_NUMBER: int
+    MEDIA_TYPE_FIELD_NUMBER: int
+    EXT_INFO_FIELD_NUMBER: int
+    msg_type: int
+    msg_info: bytes
+    version_ctrl: bytes
+    group_id: int
+    oper_uin: int
+    gray_tips: bytes
+    msg_seq: int
+    join_nums: int
+    @property
+    def per_setting(self) -> MediaChangePushInfo.PersonalSetting: ...
+    play_mode: int
+    is_join_when_start: bool
+    media_type: int
+    ext_info: bytes
+    def __init__(self,
+        *,
+        msg_type: Optional[int] = ...,
+        msg_info: Optional[bytes] = ...,
+        version_ctrl: Optional[bytes] = ...,
+        group_id: Optional[int] = ...,
+        oper_uin: Optional[int] = ...,
+        gray_tips: Optional[bytes] = ...,
+        msg_seq: Optional[int] = ...,
+        join_nums: Optional[int] = ...,
+        per_setting: Optional[MediaChangePushInfo.PersonalSetting] = ...,
+        play_mode: Optional[int] = ...,
+        is_join_when_start: Optional[bool] = ...,
+        media_type: Optional[int] = ...,
+        ext_info: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["ext_info",b"ext_info","gray_tips",b"gray_tips","group_id",b"group_id","is_join_when_start",b"is_join_when_start","join_nums",b"join_nums","media_type",b"media_type","msg_info",b"msg_info","msg_seq",b"msg_seq","msg_type",b"msg_type","oper_uin",b"oper_uin","per_setting",b"per_setting","play_mode",b"play_mode","version_ctrl",b"version_ctrl"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ext_info",b"ext_info","gray_tips",b"gray_tips","group_id",b"group_id","is_join_when_start",b"is_join_when_start","join_nums",b"join_nums","media_type",b"media_type","msg_info",b"msg_info","msg_seq",b"msg_seq","msg_type",b"msg_type","oper_uin",b"oper_uin","per_setting",b"per_setting","play_mode",b"play_mode","version_ctrl",b"version_ctrl"]) -> None: ...
+
+class MessageBoxInfo(Message):
+    DESCRIPTOR: Descriptor
+    CONTENT_FIELD_NUMBER: int
+    TITLE_FIELD_NUMBER: int
+    BUTTON_FIELD_NUMBER: int
+    content: bytes
+    title: bytes
+    button: bytes
+    def __init__(self,
+        *,
+        content: Optional[bytes] = ...,
+        title: Optional[bytes] = ...,
+        button: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["button",b"button","content",b"content","title",b"title"]) -> bool: ...
+    def ClearField(self, field_name: Literal["button",b"button","content",b"content","title",b"title"]) -> None: ...
+
+class MessageRecallReminder(Message):
+    DESCRIPTOR: Descriptor
+    class MessageMeta(Message):
+        DESCRIPTOR: Descriptor
+        SEQ_FIELD_NUMBER: int
+        TIME_FIELD_NUMBER: int
+        MSG_RANDOM_FIELD_NUMBER: int
+        MSG_TYPE_FIELD_NUMBER: int
+        MSG_FLAG_FIELD_NUMBER: int
+        AUTHOR_UIN_FIELD_NUMBER: int
+        IS_ANONY_MSG_FIELD_NUMBER: int
+        seq: int
+        time: int
+        msg_random: int
+        msg_type: int
+        msg_flag: int
+        author_uin: int
+        is_anony_msg: int
+        def __init__(self,
+            *,
+            seq: Optional[int] = ...,
+            time: Optional[int] = ...,
+            msg_random: Optional[int] = ...,
+            msg_type: Optional[int] = ...,
+            msg_flag: Optional[int] = ...,
+            author_uin: Optional[int] = ...,
+            is_anony_msg: Optional[int] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["author_uin",b"author_uin","is_anony_msg",b"is_anony_msg","msg_flag",b"msg_flag","msg_random",b"msg_random","msg_type",b"msg_type","seq",b"seq","time",b"time"]) -> bool: ...
+        def ClearField(self, field_name: Literal["author_uin",b"author_uin","is_anony_msg",b"is_anony_msg","msg_flag",b"msg_flag","msg_random",b"msg_random","msg_type",b"msg_type","seq",b"seq","time",b"time"]) -> None: ...
+
+    class WithDrawWordingInfo(Message):
+        DESCRIPTOR: Descriptor
+        ITEM_ID_FIELD_NUMBER: int
+        ITEM_NAME_FIELD_NUMBER: int
+        item_id: int
+        item_name: Text
+        def __init__(self,
+            *,
+            item_id: Optional[int] = ...,
+            item_name: Optional[Text] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["item_id",b"item_id","item_name",b"item_name"]) -> bool: ...
+        def ClearField(self, field_name: Literal["item_id",b"item_id","item_name",b"item_name"]) -> None: ...
+
+    UIN_FIELD_NUMBER: int
+    NICKNAME_FIELD_NUMBER: int
+    RECALLED_MSG_LIST_FIELD_NUMBER: int
+    REMINDER_CONTENT_FIELD_NUMBER: int
+    USERDEF_FIELD_NUMBER: int
+    GROUP_TYPE_FIELD_NUMBER: int
+    OP_TYPE_FIELD_NUMBER: int
+    ADMIN_UIN_FIELD_NUMBER: int
+    WORDING_INFO_FIELD_NUMBER: int
+    uin: int
+    nickname: bytes
+    @property
+    def recalled_msg_list(self) -> RepeatedCompositeFieldContainer[MessageRecallReminder.MessageMeta]: ...
+    reminder_content: bytes
+    userdef: bytes
+    group_type: int
+    op_type: int
+    admin_uin: int
+    @property
+    def wording_info(self) -> MessageRecallReminder.WithDrawWordingInfo: ...
+    def __init__(self,
+        *,
+        uin: Optional[int] = ...,
+        nickname: Optional[bytes] = ...,
+        recalled_msg_list: Optional[Iterable[MessageRecallReminder.MessageMeta]] = ...,
+        reminder_content: Optional[bytes] = ...,
+        userdef: Optional[bytes] = ...,
+        group_type: Optional[int] = ...,
+        op_type: Optional[int] = ...,
+        admin_uin: Optional[int] = ...,
+        wording_info: Optional[MessageRecallReminder.WithDrawWordingInfo] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["admin_uin",b"admin_uin","group_type",b"group_type","nickname",b"nickname","op_type",b"op_type","reminder_content",b"reminder_content","uin",b"uin","userdef",b"userdef","wording_info",b"wording_info"]) -> bool: ...
+    def ClearField(self, field_name: Literal["admin_uin",b"admin_uin","group_type",b"group_type","nickname",b"nickname","op_type",b"op_type","recalled_msg_list",b"recalled_msg_list","reminder_content",b"reminder_content","uin",b"uin","userdef",b"userdef","wording_info",b"wording_info"]) -> None: ...
+
+class MiniAppNotify(Message):
+    DESCRIPTOR: Descriptor
+    MSG_FIELD_NUMBER: int
+    msg: bytes
+    def __init__(self,
+        *,
+        msg: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["msg",b"msg"]) -> bool: ...
+    def ClearField(self, field_name: Literal["msg",b"msg"]) -> None: ...
+
+class NotifyMsgBody(Message):
+    DESCRIPTOR: Descriptor
+    ENUM_TYPE_FIELD_NUMBER: int
+    MSG_TIME_FIELD_NUMBER: int
+    MSG_EXPIRES_FIELD_NUMBER: int
+    GROUP_CODE_FIELD_NUMBER: int
+    GRAYTIPS_FIELD_NUMBER: int
+    MESSAGEBOX_FIELD_NUMBER: int
+    FLOATEDTIPS_FIELD_NUMBER: int
+    TOPTIPS_FIELD_NUMBER: int
+    REDTIPS_FIELD_NUMBER: int
+    GROUP_NOTIFY_FIELD_NUMBER: int
+    RECALL_FIELD_NUMBER: int
+    THEME_NOTIFY_FIELD_NUMBER: int
+    SERVICE_TYPE_FIELD_NUMBER: int
+    OBJMSG_UPDATE_FIELD_NUMBER: int
+    WEREWOLF_PUSH_FIELD_NUMBER: int
+    GOLDTIPS_FIELD_NUMBER: int
+    MINIAPP_NOTIFY_FIELD_NUMBER: int
+    SENDER_UIN_FIELD_NUMBER: int
+    LUCKYBAG_NOTIFY_FIELD_NUMBER: int
+    TROOPFORMTIPS_PUSH_FIELD_NUMBER: int
+    MEDIA_PUSH_FIELD_NUMBER: int
+    GENERAL_GRAY_TIP_FIELD_NUMBER: int
+    VIDEO_PUSH_FIELD_NUMBER: int
+    LBS_SHARE_CHANGE_PLUS_INFO_FIELD_NUMBER: int
+    SING_PUSH_FIELD_NUMBER: int
+    GROUP_INFO_CHANGE_FIELD_NUMBER: int
+    GROUP_ANNOUNCE_TBC_INFO_FIELD_NUMBER: int
+    QQ_VEDIO_GAME_PUSH_INFO_FIELD_NUMBER: int
+    QQ_GROUP_DIGEST_MSG_FIELD_NUMBER: int
+    STUDY_ROOM_MEMBER_MSG_FIELD_NUMBER: int
+    QQ_LIVE_NOTIFY_FIELD_NUMBER: int
+    GROUP_ASYNC_NOTIDY_FIELD_NUMBER: int
+    GROUP_CUR_MSG_SEQ_FIELD_NUMBER: int
+    GROUP_DIGEST_MSG_SUMMARY_FIELD_NUMBER: int
+    SYSDB_MSG_ID_FIELD_NUMBER: int
+    REVERT_GRAYTIPS_TRACELESS_FIELD_NUMBER: int
+    enum_type: int
+    msg_time: int
+    msg_expires: int
+    group_code: int
+    @property
+    def graytips(self) -> AIOGrayTipsInfo: ...
+    @property
+    def messagebox(self) -> MessageBoxInfo: ...
+    @property
+    def floatedtips(self) -> FloatedTipsInfo: ...
+    @property
+    def toptips(self) -> AIOTopTipsInfo: ...
+    @property
+    def redtips(self) -> RedGrayTipsInfo: ...
+    @property
+    def group_notify(self) -> GroupNotifyInfo: ...
+    @property
+    def recall(self) -> MessageRecallReminder: ...
+    @property
+    def theme_notify(self) -> ThemeStateNotify: ...
+    service_type: int
+    @property
+    def objmsg_update(self) -> NotifyObjmsgUpdate: ...
+    @property
+    def werewolf_push(self) -> WereWolfPush: ...
+    @property
+    def goldtips(self) -> GoldMsgTipsElem:
+        """optional apollo_game_status.STCMGameMessage stcm_game_state = 16;
+        optional apollo_push_msgInfo.STPushMsgElem apllo_msg_push = 17;
+        """
+        pass
+    @property
+    def miniapp_notify(self) -> MiniAppNotify: ...
+    sender_uin: int
+    @property
+    def luckybag_notify(self) -> LuckyBagNotify: ...
+    @property
+    def troopformtips_push(self) -> TroopFormGrayTipsInfo: ...
+    @property
+    def media_push(self) -> MediaChangePushInfo: ...
+    @property
+    def general_gray_tip(self) -> GeneralGrayTipInfo: ...
+    @property
+    def video_push(self) -> VideoChangePushInfo: ...
+    @property
+    def lbs_share_change_plus_info(self) -> LbsShareChangePushInfo: ...
+    @property
+    def sing_push(self) -> SingChangePushInfo: ...
+    @property
+    def group_info_change(self) -> GroupInfoChange: ...
+    @property
+    def group_announce_tbc_info(self) -> GroupAnnounceTBCInfo: ...
+    @property
+    def qq_vedio_game_push_info(self) -> QQVedioGamePushInfo: ...
+    @property
+    def qq_group_digest_msg(self) -> QQGroupDigestMsg: ...
+    @property
+    def study_room_member_msg(self) -> StudyRoomMemberChangePush: ...
+    @property
+    def qq_live_notify(self) -> QQVaLiveNotifyMsg: ...
+    @property
+    def group_async_notidy(self) -> GroupAsyncNotify: ...
+    group_cur_msg_seq: int
+    @property
+    def group_digest_msg_summary(self) -> QQGroupDigestMsgSummary: ...
+    sysdb_msg_id: int
+    @property
+    def revert_graytips_traceless(self) -> RevertGrayTipsMsgTraceless: ...
+    def __init__(self,
+        *,
+        enum_type: Optional[int] = ...,
+        msg_time: Optional[int] = ...,
+        msg_expires: Optional[int] = ...,
+        group_code: Optional[int] = ...,
+        graytips: Optional[AIOGrayTipsInfo] = ...,
+        messagebox: Optional[MessageBoxInfo] = ...,
+        floatedtips: Optional[FloatedTipsInfo] = ...,
+        toptips: Optional[AIOTopTipsInfo] = ...,
+        redtips: Optional[RedGrayTipsInfo] = ...,
+        group_notify: Optional[GroupNotifyInfo] = ...,
+        recall: Optional[MessageRecallReminder] = ...,
+        theme_notify: Optional[ThemeStateNotify] = ...,
+        service_type: Optional[int] = ...,
+        objmsg_update: Optional[NotifyObjmsgUpdate] = ...,
+        werewolf_push: Optional[WereWolfPush] = ...,
+        goldtips: Optional[GoldMsgTipsElem] = ...,
+        miniapp_notify: Optional[MiniAppNotify] = ...,
+        sender_uin: Optional[int] = ...,
+        luckybag_notify: Optional[LuckyBagNotify] = ...,
+        troopformtips_push: Optional[TroopFormGrayTipsInfo] = ...,
+        media_push: Optional[MediaChangePushInfo] = ...,
+        general_gray_tip: Optional[GeneralGrayTipInfo] = ...,
+        video_push: Optional[VideoChangePushInfo] = ...,
+        lbs_share_change_plus_info: Optional[LbsShareChangePushInfo] = ...,
+        sing_push: Optional[SingChangePushInfo] = ...,
+        group_info_change: Optional[GroupInfoChange] = ...,
+        group_announce_tbc_info: Optional[GroupAnnounceTBCInfo] = ...,
+        qq_vedio_game_push_info: Optional[QQVedioGamePushInfo] = ...,
+        qq_group_digest_msg: Optional[QQGroupDigestMsg] = ...,
+        study_room_member_msg: Optional[StudyRoomMemberChangePush] = ...,
+        qq_live_notify: Optional[QQVaLiveNotifyMsg] = ...,
+        group_async_notidy: Optional[GroupAsyncNotify] = ...,
+        group_cur_msg_seq: Optional[int] = ...,
+        group_digest_msg_summary: Optional[QQGroupDigestMsgSummary] = ...,
+        sysdb_msg_id: Optional[int] = ...,
+        revert_graytips_traceless: Optional[RevertGrayTipsMsgTraceless] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["enum_type",b"enum_type","floatedtips",b"floatedtips","general_gray_tip",b"general_gray_tip","goldtips",b"goldtips","graytips",b"graytips","group_announce_tbc_info",b"group_announce_tbc_info","group_async_notidy",b"group_async_notidy","group_code",b"group_code","group_cur_msg_seq",b"group_cur_msg_seq","group_digest_msg_summary",b"group_digest_msg_summary","group_info_change",b"group_info_change","group_notify",b"group_notify","lbs_share_change_plus_info",b"lbs_share_change_plus_info","luckybag_notify",b"luckybag_notify","media_push",b"media_push","messagebox",b"messagebox","miniapp_notify",b"miniapp_notify","msg_expires",b"msg_expires","msg_time",b"msg_time","objmsg_update",b"objmsg_update","qq_group_digest_msg",b"qq_group_digest_msg","qq_live_notify",b"qq_live_notify","qq_vedio_game_push_info",b"qq_vedio_game_push_info","recall",b"recall","redtips",b"redtips","revert_graytips_traceless",b"revert_graytips_traceless","sender_uin",b"sender_uin","service_type",b"service_type","sing_push",b"sing_push","study_room_member_msg",b"study_room_member_msg","sysdb_msg_id",b"sysdb_msg_id","theme_notify",b"theme_notify","toptips",b"toptips","troopformtips_push",b"troopformtips_push","video_push",b"video_push","werewolf_push",b"werewolf_push"]) -> bool: ...
+    def ClearField(self, field_name: Literal["enum_type",b"enum_type","floatedtips",b"floatedtips","general_gray_tip",b"general_gray_tip","goldtips",b"goldtips","graytips",b"graytips","group_announce_tbc_info",b"group_announce_tbc_info","group_async_notidy",b"group_async_notidy","group_code",b"group_code","group_cur_msg_seq",b"group_cur_msg_seq","group_digest_msg_summary",b"group_digest_msg_summary","group_info_change",b"group_info_change","group_notify",b"group_notify","lbs_share_change_plus_info",b"lbs_share_change_plus_info","luckybag_notify",b"luckybag_notify","media_push",b"media_push","messagebox",b"messagebox","miniapp_notify",b"miniapp_notify","msg_expires",b"msg_expires","msg_time",b"msg_time","objmsg_update",b"objmsg_update","qq_group_digest_msg",b"qq_group_digest_msg","qq_live_notify",b"qq_live_notify","qq_vedio_game_push_info",b"qq_vedio_game_push_info","recall",b"recall","redtips",b"redtips","revert_graytips_traceless",b"revert_graytips_traceless","sender_uin",b"sender_uin","service_type",b"service_type","sing_push",b"sing_push","study_room_member_msg",b"study_room_member_msg","sysdb_msg_id",b"sysdb_msg_id","theme_notify",b"theme_notify","toptips",b"toptips","troopformtips_push",b"troopformtips_push","video_push",b"video_push","werewolf_push",b"werewolf_push"]) -> None: ...
+
+class NotifyObjmsgUpdate(Message):
+    DESCRIPTOR: Descriptor
+    OBJMSG_ID_FIELD_NUMBER: int
+    UPDATE_TYPE_FIELD_NUMBER: int
+    EXT_MSG_FIELD_NUMBER: int
+    objmsg_id: bytes
+    update_type: int
+    ext_msg: bytes
+    def __init__(self,
+        *,
+        objmsg_id: Optional[bytes] = ...,
+        update_type: Optional[int] = ...,
+        ext_msg: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["ext_msg",b"ext_msg","objmsg_id",b"objmsg_id","update_type",b"update_type"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ext_msg",b"ext_msg","objmsg_id",b"objmsg_id","update_type",b"update_type"]) -> None: ...
+
+class QQGroupDigestMsg(Message):
+    DESCRIPTOR: Descriptor
+    GROUP_CODE_FIELD_NUMBER: int
+    SEQ_FIELD_NUMBER: int
+    RANDOM_FIELD_NUMBER: int
+    OP_TYPE_FIELD_NUMBER: int
+    SENDER_FIELD_NUMBER: int
+    DIGEST_OPER_FIELD_NUMBER: int
+    OP_TIME_FIELD_NUMBER: int
+    LASTEST_MSG_SEQ_FIELD_NUMBER: int
+    OPER_NICK_FIELD_NUMBER: int
+    SENDER_NICK_FIELD_NUMBER: int
+    EXT_INFO_FIELD_NUMBER: int
+    group_code: int
+    seq: int
+    random: int
+    op_type: int
+    sender: int
+    digest_oper: int
+    op_time: int
+    lastest_msg_seq: int
+    oper_nick: bytes
+    sender_nick: bytes
+    ext_info: int
+    def __init__(self,
+        *,
+        group_code: Optional[int] = ...,
+        seq: Optional[int] = ...,
+        random: Optional[int] = ...,
+        op_type: Optional[int] = ...,
+        sender: Optional[int] = ...,
+        digest_oper: Optional[int] = ...,
+        op_time: Optional[int] = ...,
+        lastest_msg_seq: Optional[int] = ...,
+        oper_nick: Optional[bytes] = ...,
+        sender_nick: Optional[bytes] = ...,
+        ext_info: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["digest_oper",b"digest_oper","ext_info",b"ext_info","group_code",b"group_code","lastest_msg_seq",b"lastest_msg_seq","op_time",b"op_time","op_type",b"op_type","oper_nick",b"oper_nick","random",b"random","sender",b"sender","sender_nick",b"sender_nick","seq",b"seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["digest_oper",b"digest_oper","ext_info",b"ext_info","group_code",b"group_code","lastest_msg_seq",b"lastest_msg_seq","op_time",b"op_time","op_type",b"op_type","oper_nick",b"oper_nick","random",b"random","sender",b"sender","sender_nick",b"sender_nick","seq",b"seq"]) -> None: ...
+
+class QQGroupDigestMsgSummary(Message):
+    DESCRIPTOR: Descriptor
+    DIGEST_OPER_FIELD_NUMBER: int
+    OP_TYPE_FIELD_NUMBER: int
+    OP_TIME_FIELD_NUMBER: int
+    DIGEST_NICK_FIELD_NUMBER: int
+    SUCC_CNT_FIELD_NUMBER: int
+    SUMMARY_INFO_FIELD_NUMBER: int
+    digest_oper: int
+    op_type: int
+    op_time: int
+    digest_nick: bytes
+    succ_cnt: int
+    @property
+    def summary_info(self) -> RepeatedCompositeFieldContainer[QQGroupDigestSummaryInfo]: ...
+    def __init__(self,
+        *,
+        digest_oper: Optional[int] = ...,
+        op_type: Optional[int] = ...,
+        op_time: Optional[int] = ...,
+        digest_nick: Optional[bytes] = ...,
+        succ_cnt: Optional[int] = ...,
+        summary_info: Optional[Iterable[QQGroupDigestSummaryInfo]] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["digest_nick",b"digest_nick","digest_oper",b"digest_oper","op_time",b"op_time","op_type",b"op_type","succ_cnt",b"succ_cnt"]) -> bool: ...
+    def ClearField(self, field_name: Literal["digest_nick",b"digest_nick","digest_oper",b"digest_oper","op_time",b"op_time","op_type",b"op_type","succ_cnt",b"succ_cnt","summary_info",b"summary_info"]) -> None: ...
+
+class QQGroupDigestSummaryInfo(Message):
+    DESCRIPTOR: Descriptor
+    SEQ_FIELD_NUMBER: int
+    RANDOM_FIELD_NUMBER: int
+    ERROR_CODE_FIELD_NUMBER: int
+    seq: int
+    random: int
+    error_code: int
+    def __init__(self,
+        *,
+        seq: Optional[int] = ...,
+        random: Optional[int] = ...,
+        error_code: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["error_code",b"error_code","random",b"random","seq",b"seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["error_code",b"error_code","random",b"random","seq",b"seq"]) -> None: ...
+
+class QQVaLiveNotifyMsg(Message):
+    DESCRIPTOR: Descriptor
+    UID_FIELD_NUMBER: int
+    NOTIFY_TYPE_FIELD_NUMBER: int
+    EXT1_FIELD_NUMBER: int
+    EXT2_FIELD_NUMBER: int
+    EXT3_FIELD_NUMBER: int
+    uid: bytes
+    notify_type: int
+    ext1: bytes
+    ext2: bytes
+    ext3: bytes
+    def __init__(self,
+        *,
+        uid: Optional[bytes] = ...,
+        notify_type: Optional[int] = ...,
+        ext1: Optional[bytes] = ...,
+        ext2: Optional[bytes] = ...,
+        ext3: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["ext1",b"ext1","ext2",b"ext2","ext3",b"ext3","notify_type",b"notify_type","uid",b"uid"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ext1",b"ext1","ext2",b"ext2","ext3",b"ext3","notify_type",b"notify_type","uid",b"uid"]) -> None: ...
+
+class QQVedioGamePushInfo(Message):
+    DESCRIPTOR: Descriptor
+    MSG_TYPE_FIELD_NUMBER: int
+    GROUP_CODE_FIELD_NUMBER: int
+    OPER_UIN_FIELD_NUMBER: int
+    VERSION_CTRL_FIELD_NUMBER: int
+    EXT_INFO_FIELD_NUMBER: int
+    msg_type: int
+    group_code: int
+    oper_uin: int
+    version_ctrl: bytes
+    ext_info: bytes
+    def __init__(self,
+        *,
+        msg_type: Optional[int] = ...,
+        group_code: Optional[int] = ...,
+        oper_uin: Optional[int] = ...,
+        version_ctrl: Optional[bytes] = ...,
+        ext_info: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["ext_info",b"ext_info","group_code",b"group_code","msg_type",b"msg_type","oper_uin",b"oper_uin","version_ctrl",b"version_ctrl"]) -> bool: ...
+    def ClearField(self, field_name: Literal["ext_info",b"ext_info","group_code",b"group_code","msg_type",b"msg_type","oper_uin",b"oper_uin","version_ctrl",b"version_ctrl"]) -> None: ...
+
+class RedGrayTipsInfo(Message):
+    DESCRIPTOR: Descriptor
+    SHOW_LASTEST_FIELD_NUMBER: int
+    SENDER_UIN_FIELD_NUMBER: int
+    RECEIVER_UIN_FIELD_NUMBER: int
+    SENDER_RICH_CONTENT_FIELD_NUMBER: int
+    RECEIVER_RICH_CONTENT_FIELD_NUMBER: int
+    AUTHKEY_FIELD_NUMBER: int
+    MSGTYPE_FIELD_NUMBER: int
+    LUCKY_FLAG_FIELD_NUMBER: int
+    HIDE_FLAG_FIELD_NUMBER: int
+    PC_BODY_FIELD_NUMBER: int
+    ICON_FIELD_NUMBER: int
+    LUCKY_UIN_FIELD_NUMBER: int
+    TIME_FIELD_NUMBER: int
+    RANDOM_FIELD_NUMBER: int
+    BROADCAST_RICH_CONTENT_FIELD_NUMBER: int
+    IDIOM_FIELD_NUMBER: int
+    IDIOM_SEQ_FIELD_NUMBER: int
+    IDIOM_ALPHA_FIELD_NUMBER: int
+    JUMPURL_FIELD_NUMBER: int
+    SUBCHANNEL_FIELD_NUMBER: int
+    POEM_RULE_FIELD_NUMBER: int
+    show_lastest: int
+    sender_uin: int
+    receiver_uin: int
+    sender_rich_content: bytes
+    receiver_rich_content: bytes
+    authkey: bytes
+    msgtype: int
+    lucky_flag: int
+    hide_flag: int
+    pc_body: bytes
+    icon: int
+    lucky_uin: int
+    time: int
+    random: int
+    broadcast_rich_content: bytes
+    idiom: bytes
+    idiom_seq: int
+    idiom_alpha: bytes
+    jumpurl: bytes
+    subchannel: int
+    poem_rule: bytes
+    def __init__(self,
+        *,
+        show_lastest: Optional[int] = ...,
+        sender_uin: Optional[int] = ...,
+        receiver_uin: Optional[int] = ...,
+        sender_rich_content: Optional[bytes] = ...,
+        receiver_rich_content: Optional[bytes] = ...,
+        authkey: Optional[bytes] = ...,
+        msgtype: Optional[int] = ...,
+        lucky_flag: Optional[int] = ...,
+        hide_flag: Optional[int] = ...,
+        pc_body: Optional[bytes] = ...,
+        icon: Optional[int] = ...,
+        lucky_uin: Optional[int] = ...,
+        time: Optional[int] = ...,
+        random: Optional[int] = ...,
+        broadcast_rich_content: Optional[bytes] = ...,
+        idiom: Optional[bytes] = ...,
+        idiom_seq: Optional[int] = ...,
+        idiom_alpha: Optional[bytes] = ...,
+        jumpurl: Optional[bytes] = ...,
+        subchannel: Optional[int] = ...,
+        poem_rule: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["authkey",b"authkey","broadcast_rich_content",b"broadcast_rich_content","hide_flag",b"hide_flag","icon",b"icon","idiom",b"idiom","idiom_alpha",b"idiom_alpha","idiom_seq",b"idiom_seq","jumpurl",b"jumpurl","lucky_flag",b"lucky_flag","lucky_uin",b"lucky_uin","msgtype",b"msgtype","pc_body",b"pc_body","poem_rule",b"poem_rule","random",b"random","receiver_rich_content",b"receiver_rich_content","receiver_uin",b"receiver_uin","sender_rich_content",b"sender_rich_content","sender_uin",b"sender_uin","show_lastest",b"show_lastest","subchannel",b"subchannel","time",b"time"]) -> bool: ...
+    def ClearField(self, field_name: Literal["authkey",b"authkey","broadcast_rich_content",b"broadcast_rich_content","hide_flag",b"hide_flag","icon",b"icon","idiom",b"idiom","idiom_alpha",b"idiom_alpha","idiom_seq",b"idiom_seq","jumpurl",b"jumpurl","lucky_flag",b"lucky_flag","lucky_uin",b"lucky_uin","msgtype",b"msgtype","pc_body",b"pc_body","poem_rule",b"poem_rule","random",b"random","receiver_rich_content",b"receiver_rich_content","receiver_uin",b"receiver_uin","sender_rich_content",b"sender_rich_content","sender_uin",b"sender_uin","show_lastest",b"show_lastest","subchannel",b"subchannel","time",b"time"]) -> None: ...
+
+class ReqBody(Message):
+    DESCRIPTOR: Descriptor
+    GROUP_CODE_FIELD_NUMBER: int
+    MEMBERUINS_FIELD_NUMBER: int
+    OFFLINE_FIELD_NUMBER: int
+    INST_CTRL_FIELD_NUMBER: int
+    MSG_FIELD_NUMBER: int
+    BUSI_TYPE_FIELD_NUMBER: int
+    group_code: int
+    @property
+    def memberuins(self) -> RepeatedScalarFieldContainer[int]: ...
+    offline: int
+    @property
+    def inst_ctrl(self) -> InstCtrl: ...
+    msg: bytes
+    busi_type: int
+    def __init__(self,
+        *,
+        group_code: Optional[int] = ...,
+        memberuins: Optional[Iterable[int]] = ...,
+        offline: Optional[int] = ...,
+        inst_ctrl: Optional[InstCtrl] = ...,
+        msg: Optional[bytes] = ...,
+        busi_type: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["busi_type",b"busi_type","group_code",b"group_code","inst_ctrl",b"inst_ctrl","msg",b"msg","offline",b"offline"]) -> bool: ...
+    def ClearField(self, field_name: Literal["busi_type",b"busi_type","group_code",b"group_code","inst_ctrl",b"inst_ctrl","memberuins",b"memberuins","msg",b"msg","offline",b"offline"]) -> None: ...
+
+class RevertGrayTipsMsgTraceless(Message):
+    DESCRIPTOR: Descriptor
+    FROM_FIELD_NUMBER: int
+    TO_FIELD_NUMBER: int
+    GROUP_CODE_FIELD_NUMBER: int
+    BUSI_ID_FIELD_NUMBER: int
+    TIPS_SEQ_ID_FIELD_NUMBER: int
+    to: int
+    group_code: int
+    busi_id: int
+    tips_seq_id: int
+    def __init__(self,
+        *,
+        to: Optional[int] = ...,
+        group_code: Optional[int] = ...,
+        busi_id: Optional[int] = ...,
+        tips_seq_id: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["busi_id",b"busi_id","from",b"from","group_code",b"group_code","tips_seq_id",b"tips_seq_id","to",b"to"]) -> bool: ...
+    def ClearField(self, field_name: Literal["busi_id",b"busi_id","from",b"from","group_code",b"group_code","tips_seq_id",b"tips_seq_id","to",b"to"]) -> None: ...
+
+class RspBody(Message):
+    DESCRIPTOR: Descriptor
+    GROUP_CODE_FIELD_NUMBER: int
+    group_code: int
+    def __init__(self,
+        *,
+        group_code: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["group_code",b"group_code"]) -> bool: ...
+    def ClearField(self, field_name: Literal["group_code",b"group_code"]) -> None: ...
+
+class SingChangePushInfo(Message):
+    DESCRIPTOR: Descriptor
+    SEQ_FIELD_NUMBER: int
+    ACTION_TYPE_FIELD_NUMBER: int
+    GROUP_ID_FIELD_NUMBER: int
+    OPER_UIN_FIELD_NUMBER: int
+    GRAY_TIPS_FIELD_NUMBER: int
+    JOIN_NUMS_FIELD_NUMBER: int
+    seq: int
+    action_type: int
+    group_id: int
+    oper_uin: int
+    gray_tips: bytes
+    join_nums: int
+    def __init__(self,
+        *,
+        seq: Optional[int] = ...,
+        action_type: Optional[int] = ...,
+        group_id: Optional[int] = ...,
+        oper_uin: Optional[int] = ...,
+        gray_tips: Optional[bytes] = ...,
+        join_nums: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["action_type",b"action_type","gray_tips",b"gray_tips","group_id",b"group_id","join_nums",b"join_nums","oper_uin",b"oper_uin","seq",b"seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["action_type",b"action_type","gray_tips",b"gray_tips","group_id",b"group_id","join_nums",b"join_nums","oper_uin",b"oper_uin","seq",b"seq"]) -> None: ...
+
+class StudyRoomMemberChangePush(Message):
+    DESCRIPTOR: Descriptor
+    MEMBER_COUNT_FIELD_NUMBER: int
+    member_count: int
+    def __init__(self,
+        *,
+        member_count: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["member_count",b"member_count"]) -> bool: ...
+    def ClearField(self, field_name: Literal["member_count",b"member_count"]) -> None: ...
+
+class TemplParam(Message):
+    DESCRIPTOR: Descriptor
+    NAME_FIELD_NUMBER: int
+    VALUE_FIELD_NUMBER: int
+    name: bytes
+    value: bytes
+    def __init__(self,
+        *,
+        name: Optional[bytes] = ...,
+        value: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["name",b"name","value",b"value"]) -> bool: ...
+    def ClearField(self, field_name: Literal["name",b"name","value",b"value"]) -> None: ...
+
+class ThemeStateNotify(Message):
+    DESCRIPTOR: Descriptor
+    STATE_FIELD_NUMBER: int
+    FEEDS_ID_FIELD_NUMBER: int
+    THEME_NAME_FIELD_NUMBER: int
+    ACTION_UIN_FIELD_NUMBER: int
+    CREATE_UIN_FIELD_NUMBER: int
+    state: int
+    feeds_id: bytes
+    theme_name: bytes
+    action_uin: int
+    create_uin: int
+    def __init__(self,
+        *,
+        state: Optional[int] = ...,
+        feeds_id: Optional[bytes] = ...,
+        theme_name: Optional[bytes] = ...,
+        action_uin: Optional[int] = ...,
+        create_uin: Optional[int] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["action_uin",b"action_uin","create_uin",b"create_uin","feeds_id",b"feeds_id","state",b"state","theme_name",b"theme_name"]) -> bool: ...
+    def ClearField(self, field_name: Literal["action_uin",b"action_uin","create_uin",b"create_uin","feeds_id",b"feeds_id","state",b"state","theme_name",b"theme_name"]) -> None: ...
+
+class TroopFormGrayTipsInfo(Message):
+    DESCRIPTOR: Descriptor
+    WRITER_UIN_FIELD_NUMBER: int
+    CREATOR_UIN_FIELD_NUMBER: int
+    RICH_CONTENT_FIELD_NUMBER: int
+    OPT_BYTES_URL_FIELD_NUMBER: int
+    CREATOR_NICK_FIELD_NUMBER: int
+    writer_uin: int
+    creator_uin: int
+    rich_content: bytes
+    opt_bytes_url: bytes
+    creator_nick: bytes
+    def __init__(self,
+        *,
+        writer_uin: Optional[int] = ...,
+        creator_uin: Optional[int] = ...,
+        rich_content: Optional[bytes] = ...,
+        opt_bytes_url: Optional[bytes] = ...,
+        creator_nick: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["creator_nick",b"creator_nick","creator_uin",b"creator_uin","opt_bytes_url",b"opt_bytes_url","rich_content",b"rich_content","writer_uin",b"writer_uin"]) -> bool: ...
+    def ClearField(self, field_name: Literal["creator_nick",b"creator_nick","creator_uin",b"creator_uin","opt_bytes_url",b"opt_bytes_url","rich_content",b"rich_content","writer_uin",b"writer_uin"]) -> None: ...
+
+class VideoChangePushInfo(Message):
+    DESCRIPTOR: Descriptor
+    SEQ_FIELD_NUMBER: int
+    ACTION_TYPE_FIELD_NUMBER: int
+    GROUP_ID_FIELD_NUMBER: int
+    OPER_UIN_FIELD_NUMBER: int
+    GRAY_TIPS_FIELD_NUMBER: int
+    JOIN_NUMS_FIELD_NUMBER: int
+    JOIN_STATE_FIELD_NUMBER: int
+    EXT_INFO_FIELD_NUMBER: int
+    seq: int
+    action_type: int
+    group_id: int
+    oper_uin: int
+    gray_tips: bytes
+    join_nums: int
+    join_state: int
+    ext_info: bytes
+    def __init__(self,
+        *,
+        seq: Optional[int] = ...,
+        action_type: Optional[int] = ...,
+        group_id: Optional[int] = ...,
+        oper_uin: Optional[int] = ...,
+        gray_tips: Optional[bytes] = ...,
+        join_nums: Optional[int] = ...,
+        join_state: Optional[int] = ...,
+        ext_info: Optional[bytes] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["action_type",b"action_type","ext_info",b"ext_info","gray_tips",b"gray_tips","group_id",b"group_id","join_nums",b"join_nums","join_state",b"join_state","oper_uin",b"oper_uin","seq",b"seq"]) -> bool: ...
+    def ClearField(self, field_name: Literal["action_type",b"action_type","ext_info",b"ext_info","gray_tips",b"gray_tips","group_id",b"group_id","join_nums",b"join_nums","join_state",b"join_state","oper_uin",b"oper_uin","seq",b"seq"]) -> None: ...
+
+class WereWolfPush(Message):
+    DESCRIPTOR: Descriptor
+    class GameRecord(Message):
+        DESCRIPTOR: Descriptor
+        TOTAL_FIELD_NUMBER: int
+        WIN_FIELD_NUMBER: int
+        LOSE_FIELD_NUMBER: int
+        DRAW_FIELD_NUMBER: int
+        total: int
+        win: int
+        lose: int
+        draw: int
+        def __init__(self,
+            *,
+            total: Optional[int] = ...,
+            win: Optional[int] = ...,
+            lose: Optional[int] = ...,
+            draw: Optional[int] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["draw",b"draw","lose",b"lose","total",b"total","win",b"win"]) -> bool: ...
+        def ClearField(self, field_name: Literal["draw",b"draw","lose",b"lose","total",b"total","win",b"win"]) -> None: ...
+
+    class Role(Message):
+        DESCRIPTOR: Descriptor
+        UIN_FIELD_NUMBER: int
+        ENUM_TYPE_FIELD_NUMBER: int
+        ENUM_STATE_FIELD_NUMBER: int
+        CAN_SPEAK_FIELD_NUMBER: int
+        CAN_LISTEN_FIELD_NUMBER: int
+        POSITION_FIELD_NUMBER: int
+        CAN_VOTE_FIELD_NUMBER: int
+        CAN_VOTED_FIELD_NUMBER: int
+        ALREADY_CHECKED_FIELD_NUMBER: int
+        ALREADY_SAVED_FIELD_NUMBER: int
+        ALREADY_POISONED_FIELD_NUMBER: int
+        PLAYER_STATE_FIELD_NUMBER: int
+        ENUM_DEAD_OP_FIELD_NUMBER: int
+        ENUM_OPERATION_FIELD_NUMBER: int
+        DST_USER_FIELD_NUMBER: int
+        OPERATION_ROUND_FIELD_NUMBER: int
+        GAME_RECORD_FIELD_NUMBER: int
+        IS_WEREWOLF_FIELD_NUMBER: int
+        DEFENDED_USER_FIELD_NUMBER: int
+        IS_SHERIFF_FIELD_NUMBER: int
+        uin: int
+        enum_type: int
+        enum_state: int
+        can_speak: int
+        can_listen: int
+        position: int
+        can_vote: int
+        can_voted: int
+        already_checked: int
+        already_saved: int
+        already_poisoned: int
+        player_state: int
+        enum_dead_op: int
+        enum_operation: int
+        dst_user: int
+        operation_round: int
+        @property
+        def game_record(self) -> WereWolfPush.GameRecord: ...
+        is_werewolf: int
+        defended_user: int
+        is_sheriff: int
+        def __init__(self,
+            *,
+            uin: Optional[int] = ...,
+            enum_type: Optional[int] = ...,
+            enum_state: Optional[int] = ...,
+            can_speak: Optional[int] = ...,
+            can_listen: Optional[int] = ...,
+            position: Optional[int] = ...,
+            can_vote: Optional[int] = ...,
+            can_voted: Optional[int] = ...,
+            already_checked: Optional[int] = ...,
+            already_saved: Optional[int] = ...,
+            already_poisoned: Optional[int] = ...,
+            player_state: Optional[int] = ...,
+            enum_dead_op: Optional[int] = ...,
+            enum_operation: Optional[int] = ...,
+            dst_user: Optional[int] = ...,
+            operation_round: Optional[int] = ...,
+            game_record: Optional[WereWolfPush.GameRecord] = ...,
+            is_werewolf: Optional[int] = ...,
+            defended_user: Optional[int] = ...,
+            is_sheriff: Optional[int] = ...,
+            ) -> None: ...
+        def HasField(self, field_name: Literal["already_checked",b"already_checked","already_poisoned",b"already_poisoned","already_saved",b"already_saved","can_listen",b"can_listen","can_speak",b"can_speak","can_vote",b"can_vote","can_voted",b"can_voted","defended_user",b"defended_user","dst_user",b"dst_user","enum_dead_op",b"enum_dead_op","enum_operation",b"enum_operation","enum_state",b"enum_state","enum_type",b"enum_type","game_record",b"game_record","is_sheriff",b"is_sheriff","is_werewolf",b"is_werewolf","operation_round",b"operation_round","player_state",b"player_state","position",b"position","uin",b"uin"]) -> bool: ...
+        def ClearField(self, field_name: Literal["already_checked",b"already_checked","already_poisoned",b"already_poisoned","already_saved",b"already_saved","can_listen",b"can_listen","can_speak",b"can_speak","can_vote",b"can_vote","can_voted",b"can_voted","defended_user",b"defended_user","dst_user",b"dst_user","enum_dead_op",b"enum_dead_op","enum_operation",b"enum_operation","enum_state",b"enum_state","enum_type",b"enum_type","game_record",b"game_record","is_sheriff",b"is_sheriff","is_werewolf",b"is_werewolf","operation_round",b"operation_round","player_state",b"player_state","position",b"position","uin",b"uin"]) -> None: ...
+
+    PUSH_TYPE_FIELD_NUMBER: int
+    GAME_ROOM_FIELD_NUMBER: int
+    ENUM_GAME_STATE_FIELD_NUMBER: int
+    GAME_ROUND_FIELD_NUMBER: int
+    ROLES_FIELD_NUMBER: int
+    SPEAKER_FIELD_NUMBER: int
+    JUDGE_UIN_FIELD_NUMBER: int
+    JUDGE_WORDS_FIELD_NUMBER: int
+    ENUM_OPERATION_FIELD_NUMBER: int
+    SRC_USER_FIELD_NUMBER: int
+    DST_USER_FIELD_NUMBER: int
+    DEAD_USERS_FIELD_NUMBER: int
+    GAME_RESULT_FIELD_NUMBER: int
+    TIMEOUT_SEC_FIELD_NUMBER: int
+    KILL_CONFIRMED_FIELD_NUMBER: int
+    JUDGE_NICKNAME_FIELD_NUMBER: int
+    VOTED_TIE_USERS_FIELD_NUMBER: int
+    push_type: int
+    game_room: int
+    enum_game_state: int
+    game_round: int
+    @property
+    def roles(self) -> RepeatedCompositeFieldContainer[WereWolfPush.Role]: ...
+    speaker: int
+    judge_uin: int
+    judge_words: bytes
+    enum_operation: int
+    src_user: int
+    dst_user: int
+    @property
+    def dead_users(self) -> RepeatedScalarFieldContainer[int]: ...
+    game_result: int
+    timeout_sec: int
+    kill_confirmed: int
+    judge_nickname: bytes
+    @property
+    def voted_tie_users(self) -> RepeatedScalarFieldContainer[int]: ...
+    def __init__(self,
+        *,
+        push_type: Optional[int] = ...,
+        game_room: Optional[int] = ...,
+        enum_game_state: Optional[int] = ...,
+        game_round: Optional[int] = ...,
+        roles: Optional[Iterable[WereWolfPush.Role]] = ...,
+        speaker: Optional[int] = ...,
+        judge_uin: Optional[int] = ...,
+        judge_words: Optional[bytes] = ...,
+        enum_operation: Optional[int] = ...,
+        src_user: Optional[int] = ...,
+        dst_user: Optional[int] = ...,
+        dead_users: Optional[Iterable[int]] = ...,
+        game_result: Optional[int] = ...,
+        timeout_sec: Optional[int] = ...,
+        kill_confirmed: Optional[int] = ...,
+        judge_nickname: Optional[bytes] = ...,
+        voted_tie_users: Optional[Iterable[int]] = ...,
+        ) -> None: ...
+    def HasField(self, field_name: Literal["dst_user",b"dst_user","enum_game_state",b"enum_game_state","enum_operation",b"enum_operation","game_result",b"game_result","game_room",b"game_room","game_round",b"game_round","judge_nickname",b"judge_nickname","judge_uin",b"judge_uin","judge_words",b"judge_words","kill_confirmed",b"kill_confirmed","push_type",b"push_type","speaker",b"speaker","src_user",b"src_user","timeout_sec",b"timeout_sec"]) -> bool: ...
+    def ClearField(self, field_name: Literal["dead_users",b"dead_users","dst_user",b"dst_user","enum_game_state",b"enum_game_state","enum_operation",b"enum_operation","game_result",b"game_result","game_room",b"game_room","game_round",b"game_round","judge_nickname",b"judge_nickname","judge_uin",b"judge_uin","judge_words",b"judge_words","kill_confirmed",b"kill_confirmed","push_type",b"push_type","roles",b"roles","speaker",b"speaker","src_user",b"src_user","timeout_sec",b"timeout_sec","voted_tie_users",b"voted_tie_users"]) -> None: ...
diff --git a/cai/pb/im/oidb/group0x857/group0x857.proto b/cai/pb/im/oidb/group0x857/group0x857.proto
deleted file mode 100644
index 6989c805..00000000
--- a/cai/pb/im/oidb/group0x857/group0x857.proto
+++ /dev/null
@@ -1,83 +0,0 @@
-syntax = "proto3";
-
-option go_package = "github.com/Mrs4s/MiraiGo/client/pb/notify";
-
-message NotifyMsgBody {
-  AIOGrayTipsInfo optMsgGrayTips = 5;
-  RedGrayTipsInfo optMsgRedTips = 9;
-  MessageRecallReminder optMsgRecall = 11;
-  GeneralGrayTipInfo optGeneralGrayTip = 26;
-  QQGroupDigestMsg qqGroupDigestMsg = 33;
-  int32 serviceType = 13;
-}
-
-message AIOGrayTipsInfo{
-  uint32 showLatest = 1;
-  bytes content = 2;
-  uint32 remind = 3;
-  bytes brief = 4;
-  uint64 receiverUin = 5;
-  uint32 reliaoAdminOpt = 6;
-}
-
-message GeneralGrayTipInfo {
-  uint64 busiType = 1;
-  uint64 busiId = 2;
-  uint32 ctrlFlag = 3;
-  uint32 c2cType = 4;
-  uint32 serviceType = 5;
-  uint64 templId = 6;
-  repeated TemplParam msgTemplParam = 7;
-  string content = 8;
-}
-
-message TemplParam {
-  string name = 1;
-  string value = 2;
-}
-
-message MessageRecallReminder {
-  int64 uin = 1;
-  bytes nickname = 2;
-  repeated RecalledMessageMeta recalledMsgList = 3;
-  bytes reminderContent = 4;
-  bytes userdef = 5;
-  int32 groupType = 6;
-  int32 opType = 7;
-}
-
-message RecalledMessageMeta {
-  int32 seq = 1;
-  int32 time = 2;
-  int32 msgRandom = 3;
-  int32 msgType = 4;
-  int32 msgFlag = 5;
-  int64 authorUin = 6;
-}
-
-message RedGrayTipsInfo {
-  uint32 showLatest = 1;
-  uint64 senderUin = 2;
-  uint64 receiverUin = 3;
-  string senderRichContent = 4;
-  string receiverRichContent = 5;
-  bytes authKey = 6;
-  sint32 msgType = 7;
-  uint32 luckyFlag = 8;
-  uint32 hideFlag = 9;
-  uint64 luckyUin = 12;
-}
-
-message QQGroupDigestMsg {
-  uint64 groupCode = 1;
-  uint32 seq = 2;
-  uint32 random = 3;
-  int32 opType = 4;
-  uint64 sender = 5;
-  uint64 digestOper = 6;
-  uint32 opTime = 7;
-  uint32 lastestMsgSeq = 8;
-  bytes operNick = 9;
-  bytes senderNick = 10;
-  int32 extInfo = 11;
-}
diff --git a/cai/pb/im/oidb/group0x857/group0x857_pb2.py b/cai/pb/im/oidb/group0x857/group0x857_pb2.py
deleted file mode 100644
index 7bee7469..00000000
--- a/cai/pb/im/oidb/group0x857/group0x857_pb2.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: cai/pb/im/oidb/group0x857/group0x857.proto
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*cai/pb/im/oidb/group0x857/group0x857.proto\"\x82\x02\n\rNotifyMsgBody\x12(\n\x0eoptMsgGrayTips\x18\x05 \x01(\x0b\x32\x10.AIOGrayTipsInfo\x12\'\n\roptMsgRedTips\x18\t \x01(\x0b\x32\x10.RedGrayTipsInfo\x12,\n\x0coptMsgRecall\x18\x0b \x01(\x0b\x32\x16.MessageRecallReminder\x12.\n\x11optGeneralGrayTip\x18\x1a \x01(\x0b\x32\x13.GeneralGrayTipInfo\x12+\n\x10qqGroupDigestMsg\x18! \x01(\x0b\x32\x11.QQGroupDigestMsg\x12\x13\n\x0bserviceType\x18\r \x01(\x05\"\x82\x01\n\x0f\x41IOGrayTipsInfo\x12\x12\n\nshowLatest\x18\x01 \x01(\r\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\x12\x0e\n\x06remind\x18\x03 \x01(\r\x12\r\n\x05\x62rief\x18\x04 \x01(\x0c\x12\x13\n\x0breceiverUin\x18\x05 \x01(\x04\x12\x16\n\x0ereliaoAdminOpt\x18\x06 \x01(\r\"\xb4\x01\n\x12GeneralGrayTipInfo\x12\x10\n\x08\x62usiType\x18\x01 \x01(\x04\x12\x0e\n\x06\x62usiId\x18\x02 \x01(\x04\x12\x10\n\x08\x63trlFlag\x18\x03 \x01(\r\x12\x0f\n\x07\x63\x32\x63Type\x18\x04 \x01(\r\x12\x13\n\x0bserviceType\x18\x05 \x01(\r\x12\x0f\n\x07templId\x18\x06 \x01(\x04\x12\"\n\rmsgTemplParam\x18\x07 \x03(\x0b\x32\x0b.TemplParam\x12\x0f\n\x07\x63ontent\x18\x08 \x01(\t\")\n\nTemplParam\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xb2\x01\n\x15MessageRecallReminder\x12\x0b\n\x03uin\x18\x01 \x01(\x03\x12\x10\n\x08nickname\x18\x02 \x01(\x0c\x12-\n\x0frecalledMsgList\x18\x03 \x03(\x0b\x32\x14.RecalledMessageMeta\x12\x17\n\x0freminderContent\x18\x04 \x01(\x0c\x12\x0f\n\x07userdef\x18\x05 \x01(\x0c\x12\x11\n\tgroupType\x18\x06 \x01(\x05\x12\x0e\n\x06opType\x18\x07 \x01(\x05\"x\n\x13RecalledMessageMeta\x12\x0b\n\x03seq\x18\x01 \x01(\x05\x12\x0c\n\x04time\x18\x02 \x01(\x05\x12\x11\n\tmsgRandom\x18\x03 \x01(\x05\x12\x0f\n\x07msgType\x18\x04 \x01(\x05\x12\x0f\n\x07msgFlag\x18\x05 \x01(\x05\x12\x11\n\tauthorUin\x18\x06 \x01(\x03\"\xde\x01\n\x0fRedGrayTipsInfo\x12\x12\n\nshowLatest\x18\x01 \x01(\r\x12\x11\n\tsenderUin\x18\x02 \x01(\x04\x12\x13\n\x0breceiverUin\x18\x03 \x01(\x04\x12\x19\n\x11senderRichContent\x18\x04 \x01(\t\x12\x1b\n\x13receiverRichContent\x18\x05 \x01(\t\x12\x0f\n\x07\x61uthKey\x18\x06 \x01(\x0c\x12\x0f\n\x07msgType\x18\x07 \x01(\x11\x12\x11\n\tluckyFlag\x18\x08 \x01(\r\x12\x10\n\x08hideFlag\x18\t \x01(\r\x12\x10\n\x08luckyUin\x18\x0c \x01(\x04\"\xd4\x01\n\x10QQGroupDigestMsg\x12\x11\n\tgroupCode\x18\x01 \x01(\x04\x12\x0b\n\x03seq\x18\x02 \x01(\r\x12\x0e\n\x06random\x18\x03 \x01(\r\x12\x0e\n\x06opType\x18\x04 \x01(\x05\x12\x0e\n\x06sender\x18\x05 \x01(\x04\x12\x12\n\ndigestOper\x18\x06 \x01(\x04\x12\x0e\n\x06opTime\x18\x07 \x01(\r\x12\x15\n\rlastestMsgSeq\x18\x08 \x01(\r\x12\x10\n\x08operNick\x18\t \x01(\x0c\x12\x12\n\nsenderNick\x18\n \x01(\x0c\x12\x0f\n\x07\x65xtInfo\x18\x0b \x01(\x05\x42+Z)github.com/Mrs4s/MiraiGo/client/pb/notifyb\x06proto3')
-
-
-
-_NOTIFYMSGBODY = DESCRIPTOR.message_types_by_name['NotifyMsgBody']
-_AIOGRAYTIPSINFO = DESCRIPTOR.message_types_by_name['AIOGrayTipsInfo']
-_GENERALGRAYTIPINFO = DESCRIPTOR.message_types_by_name['GeneralGrayTipInfo']
-_TEMPLPARAM = DESCRIPTOR.message_types_by_name['TemplParam']
-_MESSAGERECALLREMINDER = DESCRIPTOR.message_types_by_name['MessageRecallReminder']
-_RECALLEDMESSAGEMETA = DESCRIPTOR.message_types_by_name['RecalledMessageMeta']
-_REDGRAYTIPSINFO = DESCRIPTOR.message_types_by_name['RedGrayTipsInfo']
-_QQGROUPDIGESTMSG = DESCRIPTOR.message_types_by_name['QQGroupDigestMsg']
-NotifyMsgBody = _reflection.GeneratedProtocolMessageType('NotifyMsgBody', (_message.Message,), {
-  'DESCRIPTOR' : _NOTIFYMSGBODY,
-  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
-  # @@protoc_insertion_point(class_scope:NotifyMsgBody)
-  })
-_sym_db.RegisterMessage(NotifyMsgBody)
-
-AIOGrayTipsInfo = _reflection.GeneratedProtocolMessageType('AIOGrayTipsInfo', (_message.Message,), {
-  'DESCRIPTOR' : _AIOGRAYTIPSINFO,
-  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
-  # @@protoc_insertion_point(class_scope:AIOGrayTipsInfo)
-  })
-_sym_db.RegisterMessage(AIOGrayTipsInfo)
-
-GeneralGrayTipInfo = _reflection.GeneratedProtocolMessageType('GeneralGrayTipInfo', (_message.Message,), {
-  'DESCRIPTOR' : _GENERALGRAYTIPINFO,
-  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
-  # @@protoc_insertion_point(class_scope:GeneralGrayTipInfo)
-  })
-_sym_db.RegisterMessage(GeneralGrayTipInfo)
-
-TemplParam = _reflection.GeneratedProtocolMessageType('TemplParam', (_message.Message,), {
-  'DESCRIPTOR' : _TEMPLPARAM,
-  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
-  # @@protoc_insertion_point(class_scope:TemplParam)
-  })
-_sym_db.RegisterMessage(TemplParam)
-
-MessageRecallReminder = _reflection.GeneratedProtocolMessageType('MessageRecallReminder', (_message.Message,), {
-  'DESCRIPTOR' : _MESSAGERECALLREMINDER,
-  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
-  # @@protoc_insertion_point(class_scope:MessageRecallReminder)
-  })
-_sym_db.RegisterMessage(MessageRecallReminder)
-
-RecalledMessageMeta = _reflection.GeneratedProtocolMessageType('RecalledMessageMeta', (_message.Message,), {
-  'DESCRIPTOR' : _RECALLEDMESSAGEMETA,
-  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
-  # @@protoc_insertion_point(class_scope:RecalledMessageMeta)
-  })
-_sym_db.RegisterMessage(RecalledMessageMeta)
-
-RedGrayTipsInfo = _reflection.GeneratedProtocolMessageType('RedGrayTipsInfo', (_message.Message,), {
-  'DESCRIPTOR' : _REDGRAYTIPSINFO,
-  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
-  # @@protoc_insertion_point(class_scope:RedGrayTipsInfo)
-  })
-_sym_db.RegisterMessage(RedGrayTipsInfo)
-
-QQGroupDigestMsg = _reflection.GeneratedProtocolMessageType('QQGroupDigestMsg', (_message.Message,), {
-  'DESCRIPTOR' : _QQGROUPDIGESTMSG,
-  '__module__' : 'cai.pb.im.oidb.group0x857.group0x857_pb2'
-  # @@protoc_insertion_point(class_scope:QQGroupDigestMsg)
-  })
-_sym_db.RegisterMessage(QQGroupDigestMsg)
-
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  DESCRIPTOR._serialized_options = b'Z)github.com/Mrs4s/MiraiGo/client/pb/notify'
-  _NOTIFYMSGBODY._serialized_start=47
-  _NOTIFYMSGBODY._serialized_end=305
-  _AIOGRAYTIPSINFO._serialized_start=308
-  _AIOGRAYTIPSINFO._serialized_end=438
-  _GENERALGRAYTIPINFO._serialized_start=441
-  _GENERALGRAYTIPINFO._serialized_end=621
-  _TEMPLPARAM._serialized_start=623
-  _TEMPLPARAM._serialized_end=664
-  _MESSAGERECALLREMINDER._serialized_start=667
-  _MESSAGERECALLREMINDER._serialized_end=845
-  _RECALLEDMESSAGEMETA._serialized_start=847
-  _RECALLEDMESSAGEMETA._serialized_end=967
-  _REDGRAYTIPSINFO._serialized_start=970
-  _REDGRAYTIPSINFO._serialized_end=1192
-  _QQGROUPDIGESTMSG._serialized_start=1195
-  _QQGROUPDIGESTMSG._serialized_end=1407
-# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/oidb/group0x857/group0x857_pb2.pyi b/cai/pb/im/oidb/group0x857/group0x857_pb2.pyi
deleted file mode 100644
index 7fa6257b..00000000
--- a/cai/pb/im/oidb/group0x857/group0x857_pb2.pyi
+++ /dev/null
@@ -1,267 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-"""
-from builtins import (
-    bool,
-    bytes,
-    int,
-)
-
-from google.protobuf.descriptor import (
-    Descriptor,
-    FileDescriptor,
-)
-
-from google.protobuf.internal.containers import (
-    RepeatedCompositeFieldContainer,
-)
-
-from google.protobuf.message import (
-    Message,
-)
-
-from typing import (
-    Iterable,
-    Optional,
-    Text,
-)
-
-from typing_extensions import (
-    Literal,
-)
-
-
-DESCRIPTOR: FileDescriptor
-
-class NotifyMsgBody(Message):
-    DESCRIPTOR: Descriptor
-    OPTMSGGRAYTIPS_FIELD_NUMBER: int
-    OPTMSGREDTIPS_FIELD_NUMBER: int
-    OPTMSGRECALL_FIELD_NUMBER: int
-    OPTGENERALGRAYTIP_FIELD_NUMBER: int
-    QQGROUPDIGESTMSG_FIELD_NUMBER: int
-    SERVICETYPE_FIELD_NUMBER: int
-    @property
-    def optMsgGrayTips(self) -> AIOGrayTipsInfo: ...
-    @property
-    def optMsgRedTips(self) -> RedGrayTipsInfo: ...
-    @property
-    def optMsgRecall(self) -> MessageRecallReminder: ...
-    @property
-    def optGeneralGrayTip(self) -> GeneralGrayTipInfo: ...
-    @property
-    def qqGroupDigestMsg(self) -> QQGroupDigestMsg: ...
-    serviceType: int
-    def __init__(self,
-        *,
-        optMsgGrayTips: Optional[AIOGrayTipsInfo] = ...,
-        optMsgRedTips: Optional[RedGrayTipsInfo] = ...,
-        optMsgRecall: Optional[MessageRecallReminder] = ...,
-        optGeneralGrayTip: Optional[GeneralGrayTipInfo] = ...,
-        qqGroupDigestMsg: Optional[QQGroupDigestMsg] = ...,
-        serviceType: int = ...,
-        ) -> None: ...
-    def HasField(self, field_name: Literal["optGeneralGrayTip",b"optGeneralGrayTip","optMsgGrayTips",b"optMsgGrayTips","optMsgRecall",b"optMsgRecall","optMsgRedTips",b"optMsgRedTips","qqGroupDigestMsg",b"qqGroupDigestMsg"]) -> bool: ...
-    def ClearField(self, field_name: Literal["optGeneralGrayTip",b"optGeneralGrayTip","optMsgGrayTips",b"optMsgGrayTips","optMsgRecall",b"optMsgRecall","optMsgRedTips",b"optMsgRedTips","qqGroupDigestMsg",b"qqGroupDigestMsg","serviceType",b"serviceType"]) -> None: ...
-
-class AIOGrayTipsInfo(Message):
-    DESCRIPTOR: Descriptor
-    SHOWLATEST_FIELD_NUMBER: int
-    CONTENT_FIELD_NUMBER: int
-    REMIND_FIELD_NUMBER: int
-    BRIEF_FIELD_NUMBER: int
-    RECEIVERUIN_FIELD_NUMBER: int
-    RELIAOADMINOPT_FIELD_NUMBER: int
-    showLatest: int
-    content: bytes
-    remind: int
-    brief: bytes
-    receiverUin: int
-    reliaoAdminOpt: int
-    def __init__(self,
-        *,
-        showLatest: int = ...,
-        content: bytes = ...,
-        remind: int = ...,
-        brief: bytes = ...,
-        receiverUin: int = ...,
-        reliaoAdminOpt: int = ...,
-        ) -> None: ...
-    def ClearField(self, field_name: Literal["brief",b"brief","content",b"content","receiverUin",b"receiverUin","reliaoAdminOpt",b"reliaoAdminOpt","remind",b"remind","showLatest",b"showLatest"]) -> None: ...
-
-class GeneralGrayTipInfo(Message):
-    DESCRIPTOR: Descriptor
-    BUSITYPE_FIELD_NUMBER: int
-    BUSIID_FIELD_NUMBER: int
-    CTRLFLAG_FIELD_NUMBER: int
-    C2CTYPE_FIELD_NUMBER: int
-    SERVICETYPE_FIELD_NUMBER: int
-    TEMPLID_FIELD_NUMBER: int
-    MSGTEMPLPARAM_FIELD_NUMBER: int
-    CONTENT_FIELD_NUMBER: int
-    busiType: int
-    busiId: int
-    ctrlFlag: int
-    c2cType: int
-    serviceType: int
-    templId: int
-    @property
-    def msgTemplParam(self) -> RepeatedCompositeFieldContainer[TemplParam]: ...
-    content: Text
-    def __init__(self,
-        *,
-        busiType: int = ...,
-        busiId: int = ...,
-        ctrlFlag: int = ...,
-        c2cType: int = ...,
-        serviceType: int = ...,
-        templId: int = ...,
-        msgTemplParam: Optional[Iterable[TemplParam]] = ...,
-        content: Text = ...,
-        ) -> None: ...
-    def ClearField(self, field_name: Literal["busiId",b"busiId","busiType",b"busiType","c2cType",b"c2cType","content",b"content","ctrlFlag",b"ctrlFlag","msgTemplParam",b"msgTemplParam","serviceType",b"serviceType","templId",b"templId"]) -> None: ...
-
-class TemplParam(Message):
-    DESCRIPTOR: Descriptor
-    NAME_FIELD_NUMBER: int
-    VALUE_FIELD_NUMBER: int
-    name: Text
-    value: Text
-    def __init__(self,
-        *,
-        name: Text = ...,
-        value: Text = ...,
-        ) -> None: ...
-    def ClearField(self, field_name: Literal["name",b"name","value",b"value"]) -> None: ...
-
-class MessageRecallReminder(Message):
-    DESCRIPTOR: Descriptor
-    UIN_FIELD_NUMBER: int
-    NICKNAME_FIELD_NUMBER: int
-    RECALLEDMSGLIST_FIELD_NUMBER: int
-    REMINDERCONTENT_FIELD_NUMBER: int
-    USERDEF_FIELD_NUMBER: int
-    GROUPTYPE_FIELD_NUMBER: int
-    OPTYPE_FIELD_NUMBER: int
-    uin: int
-    nickname: bytes
-    @property
-    def recalledMsgList(self) -> RepeatedCompositeFieldContainer[RecalledMessageMeta]: ...
-    reminderContent: bytes
-    userdef: bytes
-    groupType: int
-    opType: int
-    def __init__(self,
-        *,
-        uin: int = ...,
-        nickname: bytes = ...,
-        recalledMsgList: Optional[Iterable[RecalledMessageMeta]] = ...,
-        reminderContent: bytes = ...,
-        userdef: bytes = ...,
-        groupType: int = ...,
-        opType: int = ...,
-        ) -> None: ...
-    def ClearField(self, field_name: Literal["groupType",b"groupType","nickname",b"nickname","opType",b"opType","recalledMsgList",b"recalledMsgList","reminderContent",b"reminderContent","uin",b"uin","userdef",b"userdef"]) -> None: ...
-
-class RecalledMessageMeta(Message):
-    DESCRIPTOR: Descriptor
-    SEQ_FIELD_NUMBER: int
-    TIME_FIELD_NUMBER: int
-    MSGRANDOM_FIELD_NUMBER: int
-    MSGTYPE_FIELD_NUMBER: int
-    MSGFLAG_FIELD_NUMBER: int
-    AUTHORUIN_FIELD_NUMBER: int
-    seq: int
-    time: int
-    msgRandom: int
-    msgType: int
-    msgFlag: int
-    authorUin: int
-    def __init__(self,
-        *,
-        seq: int = ...,
-        time: int = ...,
-        msgRandom: int = ...,
-        msgType: int = ...,
-        msgFlag: int = ...,
-        authorUin: int = ...,
-        ) -> None: ...
-    def ClearField(self, field_name: Literal["authorUin",b"authorUin","msgFlag",b"msgFlag","msgRandom",b"msgRandom","msgType",b"msgType","seq",b"seq","time",b"time"]) -> None: ...
-
-class RedGrayTipsInfo(Message):
-    DESCRIPTOR: Descriptor
-    SHOWLATEST_FIELD_NUMBER: int
-    SENDERUIN_FIELD_NUMBER: int
-    RECEIVERUIN_FIELD_NUMBER: int
-    SENDERRICHCONTENT_FIELD_NUMBER: int
-    RECEIVERRICHCONTENT_FIELD_NUMBER: int
-    AUTHKEY_FIELD_NUMBER: int
-    MSGTYPE_FIELD_NUMBER: int
-    LUCKYFLAG_FIELD_NUMBER: int
-    HIDEFLAG_FIELD_NUMBER: int
-    LUCKYUIN_FIELD_NUMBER: int
-    showLatest: int
-    senderUin: int
-    receiverUin: int
-    senderRichContent: Text
-    receiverRichContent: Text
-    authKey: bytes
-    msgType: int
-    luckyFlag: int
-    hideFlag: int
-    luckyUin: int
-    def __init__(self,
-        *,
-        showLatest: int = ...,
-        senderUin: int = ...,
-        receiverUin: int = ...,
-        senderRichContent: Text = ...,
-        receiverRichContent: Text = ...,
-        authKey: bytes = ...,
-        msgType: int = ...,
-        luckyFlag: int = ...,
-        hideFlag: int = ...,
-        luckyUin: int = ...,
-        ) -> None: ...
-    def ClearField(self, field_name: Literal["authKey",b"authKey","hideFlag",b"hideFlag","luckyFlag",b"luckyFlag","luckyUin",b"luckyUin","msgType",b"msgType","receiverRichContent",b"receiverRichContent","receiverUin",b"receiverUin","senderRichContent",b"senderRichContent","senderUin",b"senderUin","showLatest",b"showLatest"]) -> None: ...
-
-class QQGroupDigestMsg(Message):
-    DESCRIPTOR: Descriptor
-    GROUPCODE_FIELD_NUMBER: int
-    SEQ_FIELD_NUMBER: int
-    RANDOM_FIELD_NUMBER: int
-    OPTYPE_FIELD_NUMBER: int
-    SENDER_FIELD_NUMBER: int
-    DIGESTOPER_FIELD_NUMBER: int
-    OPTIME_FIELD_NUMBER: int
-    LASTESTMSGSEQ_FIELD_NUMBER: int
-    OPERNICK_FIELD_NUMBER: int
-    SENDERNICK_FIELD_NUMBER: int
-    EXTINFO_FIELD_NUMBER: int
-    groupCode: int
-    seq: int
-    random: int
-    opType: int
-    sender: int
-    digestOper: int
-    opTime: int
-    lastestMsgSeq: int
-    operNick: bytes
-    senderNick: bytes
-    extInfo: int
-    def __init__(self,
-        *,
-        groupCode: int = ...,
-        seq: int = ...,
-        random: int = ...,
-        opType: int = ...,
-        sender: int = ...,
-        digestOper: int = ...,
-        opTime: int = ...,
-        lastestMsgSeq: int = ...,
-        operNick: bytes = ...,
-        senderNick: bytes = ...,
-        extInfo: int = ...,
-        ) -> None: ...
-    def ClearField(self, field_name: Literal["digestOper",b"digestOper","extInfo",b"extInfo","groupCode",b"groupCode","lastestMsgSeq",b"lastestMsgSeq","opTime",b"opTime","opType",b"opType","operNick",b"operNick","random",b"random","sender",b"sender","senderNick",b"senderNick","seq",b"seq"]) -> None: ...

From 7d7677a1b06b233f47925d7acc8a05c76b5c9b7f Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 9 Apr 2022 01:26:29 +0800
Subject: [PATCH 072/113] add: reconnect fallback

---
 cai/client/client.py     | 8 +++++++-
 examples/friend_group.py | 3 ++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index e8d904f5..4813db7c 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -388,7 +388,13 @@ async def reconnect_and_login(
     ) -> None:
         await self.reconnect(change_server=change_server, server=server)
         # FIXME: register reason msfByNetChange?
-        await self._init(drop_offline_msg=False)
+        try:
+            await self._init(drop_offline_msg=False)
+        except asyncio.exceptions.TimeoutError:  # fallback
+            log.network.warning("register failed, trying to re-login")
+            await self.disconnect()
+            await self.connect()
+            await self.login()
 
     async def close(self) -> None:
         """Close the client and logout."""
diff --git a/examples/friend_group.py b/examples/friend_group.py
index 7a660ade..d2e56f12 100644
--- a/examples/friend_group.py
+++ b/examples/friend_group.py
@@ -11,7 +11,7 @@
 import asyncio
 from hashlib import md5
 
-import cai
+from cai.api.client import Client
 
 
 async def run():
@@ -26,6 +26,7 @@ async def run():
         )
         return
 
+    client = Client()
     client = await cai.login(account, md5(password.encode()).digest())
 
     # friend

From 73912cef0ffd208c9e0cc450ba75aa3dfe93c23e Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 9 Apr 2022 02:04:55 +0800
Subject: [PATCH 073/113] f**k u, tencent

---
 cai/client/online_push/__init__.py | 79 ++++++++++++++----------------
 cai/client/online_push/jce.py      | 28 +++++++++++
 cai/pb/im/op/__init__.py           |  0
 cai/pb/im/op/online_push.proto     |  8 +++
 cai/pb/im/op/online_push_pb2.py    | 34 +++++++++++++
 cai/pb/im/op/online_push_pb2.pyi   | 46 +++++++++++++++++
 6 files changed, 153 insertions(+), 42 deletions(-)
 create mode 100644 cai/pb/im/op/__init__.py
 create mode 100644 cai/pb/im/op/online_push.proto
 create mode 100644 cai/pb/im/op/online_push_pb2.py
 create mode 100644 cai/pb/im/op/online_push_pb2.pyi

diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index bccd6f84..b2914fc1 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -19,8 +19,9 @@
 from cai.client.packet import UniPacket, IncomingPacket
 from cai.utils.jce import RequestPacket, RequestPacketVersion3
 from cai.pb.im.oidb.cmd0x857.troop_tips import TemplParam, NotifyMsgBody
+from cai.pb.im.op.online_push_pb2 import DelMsgCookies
 
-from .jce import DelMsgInfo, DeviceInfo, SvcRespPushMsg
+from .jce import DelMsgInfo, DeviceInfo, SvcRespPushMsg, SvcReqPushMsg
 from .command import PushMsg, PushMsgError, PushMsgCommand
 
 if TYPE_CHECKING:
@@ -38,6 +39,7 @@ def encode_push_response(
     push_token: Optional[bytes] = None,
     service_type: int = 0,
     device_info: Optional[DeviceInfo] = None,
+    req_id: int = 0
 ) -> Packet:
     """Build online push response packet.
 
@@ -74,6 +76,7 @@ def encode_push_response(
     )
     payload = SvcRespPushMsg.to_bytes(0, resp)
     req_packet = RequestPacketVersion3(
+        req_id=req_id,
         servant_name="OnlinePush",
         func_name="SvcRespPushMsg",
         data=types.MAP({types.STRING("resp"): types.BYTES(payload)}),
@@ -225,42 +228,21 @@ def _parse_poke(params: Sequence[TemplParam]) -> dict:
     return res
 
 
-# OnlinePush.SvcRespPushMsg
-# def encode_resp_push_pkg(
-#     uin: int, svrip: int, seq: int, items: Sequence[DelMsgInfo]
-# ) -> bytes:
-#     pkg = SvcRespPushMsg(
-#         uin=uin, del_infos=items, svrip=svrip & 0xFFFFFFFF, service_type=0
-#     )
-#     return RequestPacketVersion3(
-#         servant_name="OnlinePush",
-#         func_name="SvcRespPushMsg",
-#         req_id=seq,
-#         data=types.MAP(
-#             {
-#                 types.STRING("SvcRespPushMsg"): types.BYTES(
-#                     SvcRespPushMsg.to_bytes(0, pkg)
-#                 )
-#             }
-#         ),
-#     ).encode()
-
-
 # OnlinePush.ReqPush
 async def handle_req_push(
     client: "Client", packet: IncomingPacket
 ) -> PushMsgCommand:
-    body = JceDecoder.decode_bytes(
-        JceDecoder.decode_single(  # type: ignore
-            RequestPacket.decode(packet.data).buffer
-        )[1]["req"]["OnlinePushPack.SvcReqPushMsg"]
-    )[0]
+    req_pkg = RequestPacket.decode(packet.data)
+
+    body = SvcReqPushMsg.decode(
+        JceDecoder.decode_single(req_pkg.buffer)[1]["req"]["OnlinePushPack.SvcReqPushMsg"]  # type: ignore
+    ).body
 
     _uin, stime, push_type, content = (
-        body[0],
-        body[1],
-        body[2][0][2],
-        body[2][0][6],
+        body.uin,
+        body.msg_time,
+        body.msg_info[0].msg_type,
+        body.msg_info[0].msg,
     )
 
     if push_type == 732:  # group
@@ -304,19 +286,32 @@ async def handle_req_push(
         pass
         # TODO: parse friend event
 
-    await client.send_and_wait(  # resp ack
-        seq=client.next_seq(),
-        command_name="OnlinePush.RespPush",
-        packet=encode_push_response(
-            body[1],
-            client._session_id,
-            _uin,
-            client._siginfo.d2key,
-            body[3] & 0xFFFFFFFF,
-            [DelMsgInfo(from_uin=_uin, msg_seq=body[1], msg_time=stime)],
-        ),
+    seq = client.next_seq()
+    pkg = encode_push_response(
+        seq,
+        client._session_id,
+        _uin,
+        client._siginfo.d2key,
+        body.svrip,
+        [
+            DelMsgInfo(
+                from_uin=info.from_uin,
+                msg_seq=info.msg_seq,
+                msg_time=info.msg_time,
+                msg_cookies=DelMsgCookies(
+                    msg_type=info.msg_type,
+                    msg_uid=info.msg_uid,
+                    type=3,
+                    xid=50015
+                ).SerializeToString()
+            ) for info in body.msg_info
+        ],
+        req_id=req_pkg.req_id
     )
 
+    # FIXME: useless
+    await client.send(seq, "OnlinePush.RespPush", pkg)
+
     return PushMsgCommand(
         packet.uin, packet.seq, packet.ret_code, packet.command_name
     )
diff --git a/cai/client/online_push/jce.py b/cai/client/online_push/jce.py
index 4cc8d5d5..7bfa6db5 100644
--- a/cai/client/online_push/jce.py
+++ b/cai/client/online_push/jce.py
@@ -49,6 +49,22 @@ class DeviceInfo(JceStruct):
     ios_idfa: types.STRING = JceField("", jce_id=5)
 
 
+class MsgInfo(JceStruct):
+    from_uin: types.INT64 = JceField(jce_id=0)
+    msg_time: types.INT64 = JceField(jce_id=1)
+    msg_type: types.INT8 = JceField(jce_id=2)
+    msg_seq: types.INT8 = JceField(jce_id=3)
+    str_msg: types.STRING = JceField("", jce_id=4)
+    real_msg_time: types.INT32 = JceField(0, jce_id=5)
+    msg: types.BYTES = JceField(jce_id=6)
+    share_id: types.INT64 = JceField(0, jce_id=7)
+    msg_cookie: types.BYTES = JceField(bytes(), jce_id=8)
+    app_share_cookie: types.BYTES = JceField(bytes(), jce_id=9)
+    msg_uid: types.INT64 = JceField(0, jce_id=10)
+    last_change_time: types.INT64 = JceField(0, jce_id=11)
+    # TODO: missed
+
+
 class SvcRespPushMsg(JceStruct):
     """OnlinePush Service Push Response Packet.
 
@@ -62,3 +78,15 @@ class SvcRespPushMsg(JceStruct):
     push_token: Optional[types.BYTES] = JceField(None, jce_id=3)
     service_type: types.INT32 = JceField(0, jce_id=4)
     device_info: Optional[DeviceInfo] = JceField(None, jce_id=5)
+
+
+class _SvcReqPushMsg(JceStruct):
+    uin: types.INT64 = JceField(jce_id=0)
+    msg_time: types.INT64 = JceField(jce_id=1)
+    msg_info: types.LIST[MsgInfo] = JceField(jce_id=2)
+    svrip: types.INT32 = JceField(0, jce_id=3)
+    sync_cookie: types.BYTES = JceField(bytes(), jce_id=4)
+
+
+class SvcReqPushMsg(JceStruct):
+    body: _SvcReqPushMsg = JceField(jce_id=0)
diff --git a/cai/pb/im/op/__init__.py b/cai/pb/im/op/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/cai/pb/im/op/online_push.proto b/cai/pb/im/op/online_push.proto
new file mode 100644
index 00000000..313545db
--- /dev/null
+++ b/cai/pb/im/op/online_push.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+
+message DelMsgCookies {
+  int32 msg_type = 1;
+  int64 msg_uid = 2;
+  int32 type = 3;  // idk, value is 3
+  int32 xid = 4;  // idk, value is 50015
+}
diff --git a/cai/pb/im/op/online_push_pb2.py b/cai/pb/im/op/online_push_pb2.py
new file mode 100644
index 00000000..b744b0d8
--- /dev/null
+++ b/cai/pb/im/op/online_push_pb2.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: online_push.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11online_push.proto\"M\n\rDelMsgCookies\x12\x10\n\x08msg_type\x18\x01 \x01(\x05\x12\x0f\n\x07msg_uid\x18\x02 \x01(\x03\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x0b\n\x03xid\x18\x04 \x01(\x05\x62\x06proto3')
+
+
+
+_DELMSGCOOKIES = DESCRIPTOR.message_types_by_name['DelMsgCookies']
+DelMsgCookies = _reflection.GeneratedProtocolMessageType('DelMsgCookies', (_message.Message,), {
+  'DESCRIPTOR' : _DELMSGCOOKIES,
+  '__module__' : 'online_push_pb2'
+  # @@protoc_insertion_point(class_scope:DelMsgCookies)
+  })
+_sym_db.RegisterMessage(DelMsgCookies)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _DELMSGCOOKIES._serialized_start=21
+  _DELMSGCOOKIES._serialized_end=98
+# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/op/online_push_pb2.pyi b/cai/pb/im/op/online_push_pb2.pyi
new file mode 100644
index 00000000..6e54e27e
--- /dev/null
+++ b/cai/pb/im/op/online_push_pb2.pyi
@@ -0,0 +1,46 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+from builtins import (
+    int,
+)
+
+from google.protobuf.descriptor import (
+    Descriptor,
+    FileDescriptor,
+)
+
+from google.protobuf.message import (
+    Message,
+)
+
+from typing_extensions import (
+    Literal,
+)
+
+
+DESCRIPTOR: FileDescriptor
+
+class DelMsgCookies(Message):
+    DESCRIPTOR: Descriptor
+    MSG_TYPE_FIELD_NUMBER: int
+    MSG_UID_FIELD_NUMBER: int
+    TYPE_FIELD_NUMBER: int
+    XID_FIELD_NUMBER: int
+    msg_type: int
+    msg_uid: int
+    type: int
+    """idk, value is 3"""
+
+    xid: int
+    """idk, value is 50015"""
+
+    def __init__(self,
+        *,
+        msg_type: int = ...,
+        msg_uid: int = ...,
+        type: int = ...,
+        xid: int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: Literal["msg_type",b"msg_type","msg_uid",b"msg_uid","type",b"type","xid",b"xid"]) -> None: ...

From 7415cf1ead9018e940495bb404d954ff159c7d8a Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 9 Apr 2022 02:14:33 +0800
Subject: [PATCH 074/113] update: close client when force_offline triggered

---
 cai/client/client.py                   | 5 ++---
 cai/client/message_service/__init__.py | 1 +
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 4813db7c..f6abb4b7 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -347,7 +347,7 @@ def _recv_done_cb(self, task: asyncio.Task):
                 asyncio.create_task(self.reconnect_and_login())
         else:
             log.network.warning("receiver stopped")
-            asyncio.create_task(self.disconnect())
+            asyncio.create_task(self.close())
 
     async def disconnect(self) -> None:
         """Disconnect if already connected to the server."""
@@ -392,8 +392,7 @@ async def reconnect_and_login(
             await self._init(drop_offline_msg=False)
         except asyncio.exceptions.TimeoutError:  # fallback
             log.network.warning("register failed, trying to re-login")
-            await self.disconnect()
-            await self.connect()
+            await self.reconnect()
             await self.login()
 
     async def close(self) -> None:
diff --git a/cai/client/message_service/__init__.py b/cai/client/message_service/__init__.py
index 515d4cf6..46deac95 100644
--- a/cai/client/message_service/__init__.py
+++ b/cai/client/message_service/__init__.py
@@ -307,6 +307,7 @@ async def handle_force_offline(
     client: "Client", packet: IncomingPacket
 ) -> PushForceOfflineCommand:
     client._status = OnlineStatus.Offline
+    client._reconnect = False
     await client.disconnect()
     request = PushForceOfflineCommand.decode_response(
         packet.uin,

From 79ac21dfb9b82fc16ae1e66779584de38cc1e94c Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 9 Apr 2022 02:30:16 +0800
Subject: [PATCH 075/113] add: ignore repeat event

---
 cai/client/online_push/__init__.py | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index b2914fc1..4fa478d3 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -228,12 +228,21 @@ def _parse_poke(params: Sequence[TemplParam]) -> dict:
     return res
 
 
+repeat_ev = set()
+
 # OnlinePush.ReqPush
 async def handle_req_push(
     client: "Client", packet: IncomingPacket
 ) -> PushMsgCommand:
     req_pkg = RequestPacket.decode(packet.data)
 
+    # sbtx
+    if req_pkg.req_id in repeat_ev:
+        repeat_ev.remove(req_pkg.req_id)
+        return PushMsgCommand(packet.uin, packet.seq, packet.ret_code, packet.command_name)
+    else:
+        repeat_ev.add(req_pkg.req_id)
+
     body = SvcReqPushMsg.decode(
         JceDecoder.decode_single(req_pkg.buffer)[1]["req"]["OnlinePushPack.SvcReqPushMsg"]  # type: ignore
     ).body

From 15e0728966a00f2fba7192c1d48a321ab21b9668 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 9 Apr 2022 02:45:51 +0800
Subject: [PATCH 076/113] fix: nudge event

---
 cai/client/online_push/__init__.py | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index 4fa478d3..4ac33a61 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -214,17 +214,20 @@ async def handle_push_msg(
     return push
 
 
-def _parse_poke(params: Sequence[TemplParam]) -> dict:
+def _parse_poke(params: Sequence[TemplParam], default: int) -> dict:
     res = {"target": None, "sender": None, "action": None, "suffix": None}
     for p in params:
-        if p.name == "uin_str1":
-            res["sender"] = int(p.value)
-        elif p.name == "uin_str2":
-            res["target"] = int(p.value)
-        elif p.name == "suffix_str":
-            res["suffix"] = p.value
-        elif p.name == "action_str":
-            res["action"] = p.value
+        name, value = p.name.decode(), p.value.decode()
+        if name == "uin_str1":
+            res["sender"] = int(value)
+        elif name == "uin_str2":
+            res["target"] = int(value)
+        elif name == "suffix_str":
+            res["suffix"] = value
+        elif name == "action_str":
+            res["action"] = value
+    if not res["target"]:
+        res["target"] = default
     return res
 
 
@@ -262,7 +265,7 @@ async def handle_req_push(
             if stype == 0x14:  # nudge
                 client.dispatch_event(
                     events.NudgeEvent(
-                        **_parse_poke(notify.general_gray_tip.templ_param),
+                        **_parse_poke(notify.general_gray_tip.templ_param, default=_uin),
                         group=gid,
                     )
                 )

From 3587d32d76a6824da9f9788ed07bc53f98ffecab Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Sat, 9 Apr 2022 13:15:54 +0800
Subject: [PATCH 077/113] :art: rewrite reqpush

---
 cai/client/message_service/jce.py  |  54 +-------
 cai/client/online_push/__init__.py | 200 ++++++++++++++++-------------
 cai/client/online_push/command.py  |  52 ++++++++
 cai/client/online_push/jce.py      |  84 +++++++++---
 4 files changed, 228 insertions(+), 162 deletions(-)

diff --git a/cai/client/message_service/jce.py b/cai/client/message_service/jce.py
index 8b3dba1c..6965d71d 100644
--- a/cai/client/message_service/jce.py
+++ b/cai/client/message_service/jce.py
@@ -13,59 +13,7 @@
 
 from jce import JceField, JceStruct, types
 
-from cai.client.qq_service.jce import StShareData
-
-
-# Push Notify
-class CPicInfo(JceStruct):
-    """MessageSvc Online Push CPic Info jce packet.
-
-    Note:
-        Source: OnlinePushPack.CPicInfo
-    """
-
-    path: types.BYTES = JceField(jce_id=0)
-    host: types.BYTES = JceField(bytes(), jce_id=1)
-
-
-class TempMsgHead(JceStruct):
-    """MessageSvc Online Push Temp Message Head jce packet.
-
-    Note:
-        Source: OnlinePushPack.TempMsgHead
-    """
-
-    c2c_type: types.INT32 = JceField(0, jce_id=0)
-    service_type: types.INT32 = JceField(0, jce_id=1)
-
-
-class MessageInfo(JceStruct):
-    """MessageSvc Online Push Message Info jce packet.
-
-    Note:
-        Source: OnlinePushPack.MsgInfo
-    """
-
-    from_uin: types.INT64 = JceField(jce_id=0)
-    message_time: types.INT64 = JceField(jce_id=1)
-    message_type: types.INT16 = JceField(jce_id=2)
-    message_seq: types.INT16 = JceField(jce_id=3)
-    message: types.STRING = JceField(jce_id=4)
-    real_message_time: types.INT32 = JceField(0, jce_id=5)
-    vec_message: types.BYTES = JceField(bytes(), jce_id=6)
-    app_share_id: types.INT64 = JceField(0, jce_id=7)
-    message_cookies: types.BYTES = JceField(bytes(), jce_id=8)
-    app_share_cookie: types.BYTES = JceField(bytes(), jce_id=9)
-    message_uid: types.INT64 = JceField(0, jce_id=10)
-    last_change_time: types.INT64 = JceField(0, jce_id=11)
-    cpic_info: types.LIST[CPicInfo] = JceField([], jce_id=12)
-    share_data: Optional[StShareData] = JceField(None, jce_id=13)
-    from_inst_id: types.INT64 = JceField(0, jce_id=14)
-    remark_of_sender: types.BYTES = JceField(bytes(), jce_id=15)
-    from_mobile: types.STRING = JceField("", jce_id=16)
-    from_name: types.STRING = JceField("", jce_id=17)
-    nickname: types.LIST[types.STRING] = JceField([], jce_id=18)
-    c2c_temp_msg_head: Optional[TempMsgHead] = JceField(None, jce_id=19)
+from cai.client.online_push.jce import MessageInfo
 
 
 class RequestPushNotify(JceStruct):
diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index 4ac33a61..73580e6a 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -15,14 +15,20 @@
 from cai.log import logger
 from cai.client import events
 from cai.utils.binary import Packet
+from cai.pb.im.op.online_push_pb2 import DelMsgCookies
 from cai.client.message_service import MESSAGE_DECODERS
 from cai.client.packet import UniPacket, IncomingPacket
 from cai.utils.jce import RequestPacket, RequestPacketVersion3
 from cai.pb.im.oidb.cmd0x857.troop_tips import TemplParam, NotifyMsgBody
-from cai.pb.im.op.online_push_pb2 import DelMsgCookies
 
-from .jce import DelMsgInfo, DeviceInfo, SvcRespPushMsg, SvcReqPushMsg
-from .command import PushMsg, PushMsgError, PushMsgCommand
+from .jce import DelMsgInfo, DeviceInfo, SvcReqPushMsg, SvcRespPushMsg
+from .command import (
+    PushMsg,
+    SvcReqPush,
+    PushMsgError,
+    PushMsgCommand,
+    SvcReqPushCommand,
+)
 
 if TYPE_CHECKING:
     from cai.client import Client
@@ -39,7 +45,7 @@ def encode_push_response(
     push_token: Optional[bytes] = None,
     service_type: int = 0,
     device_info: Optional[DeviceInfo] = None,
-    req_id: int = 0
+    req_id: int = 0,
 ) -> Packet:
     """Build online push response packet.
 
@@ -236,97 +242,111 @@ def _parse_poke(params: Sequence[TemplParam], default: int) -> dict:
 # OnlinePush.ReqPush
 async def handle_req_push(
     client: "Client", packet: IncomingPacket
-) -> PushMsgCommand:
-    req_pkg = RequestPacket.decode(packet.data)
-
-    # sbtx
-    if req_pkg.req_id in repeat_ev:
-        repeat_ev.remove(req_pkg.req_id)
-        return PushMsgCommand(packet.uin, packet.seq, packet.ret_code, packet.command_name)
-    else:
-        repeat_ev.add(req_pkg.req_id)
-
-    body = SvcReqPushMsg.decode(
-        JceDecoder.decode_single(req_pkg.buffer)[1]["req"]["OnlinePushPack.SvcReqPushMsg"]  # type: ignore
-    ).body
-
-    _uin, stime, push_type, content = (
-        body.uin,
-        body.msg_time,
-        body.msg_info[0].msg_type,
-        body.msg_info[0].msg,
+) -> SvcReqPushCommand:
+    """Handle Request Push Command.
+
+    Note:
+        Source: com.tencent.imcore.message.OnLinePushMessageProcessor.ProcessOneMsg.a
+    """
+    push = SvcReqPushCommand.decode_response(
+        packet.uin,
+        packet.seq,
+        packet.ret_code,
+        packet.command_name,
+        packet.data,
     )
 
-    if push_type == 732:  # group
-        gid = int.from_bytes(content[0:4], "big")
-        stype = content[4]
-        if stype in (0x14, 0x11):
-            notify = NotifyMsgBody.FromString(content[7:])
-            if stype == 0x14:  # nudge
-                client.dispatch_event(
-                    events.NudgeEvent(
-                        **_parse_poke(notify.general_gray_tip.templ_param, default=_uin),
-                        group=gid,
-                    )
+    # FIXME: cache and remove duplicates
+
+    if isinstance(push, SvcReqPush):
+        seq = client.next_seq()
+        pkg = encode_push_response(
+            seq,
+            client._session_id,
+            push.message.uin,
+            client._siginfo.d2key,
+            push.message.svrip,
+            [
+                DelMsgInfo(
+                    from_uin=info.from_uin,
+                    msg_seq=info.message_seq,
+                    msg_time=info.message_time,
+                    msg_cookies=DelMsgCookies(
+                        msg_type=info.message_type,
+                        msg_uid=info.message_uid,
+                        type=3,
+                        xid=50015,
+                    ).SerializeToString(),
                 )
-            elif stype == 0x11:  # recall
-                msg = notify.recall.recalled_msg_list[0]
-                client.dispatch_event(
-                    events.MemberRecallMessageEvent(
-                        gid,
-                        notify.recall.uin,
-                        notify.recall.op_type,
-                        msg.author_uin,
-                        msg.msg_random,
-                        msg.seq,
-                        msg.time,
+                for info in push.message.msg_info
+            ],
+            req_id=push.seq,
+        )
+        await client.send(seq, "OnlinePush.RespPush", pkg)
+
+        for message in push.message.msg_info:
+            if message.message_type == 169:
+                # handleC2COnlinePushMsgResp
+                pass
+            elif message.message_type == 8:
+                # HandleShMsgType0x08
+                pass
+            elif message.message_type == 132:
+                # HandleShMsgType0x84
+                pass
+            elif message.message_type == 732:
+                content = message.vec_message
+                sub_type = content[4]
+                gid = int.from_bytes(content[:4], "big")
+
+                if sub_type in (0x14, 0x11):
+                    notify = NotifyMsgBody.FromString(content[7:])
+                    if sub_type == 0x14:  # nudge
+                        client.dispatch_event(
+                            events.NudgeEvent(
+                                **_parse_poke(
+                                    notify.general_gray_tip.templ_param,
+                                    default=message.from_uin,
+                                ),
+                                group=gid,
+                            )
+                        )
+                    elif sub_type == 0x11:  # recall
+                        msg = notify.recall.recalled_msg_list[0]
+                        client.dispatch_event(
+                            events.MemberRecallMessageEvent(
+                                gid,
+                                notify.recall.uin,
+                                notify.recall.op_type,
+                                msg.author_uin,
+                                msg.msg_random,
+                                msg.seq,
+                                msg.time,
+                            )
+                        )
+                elif sub_type == 0x0C:  # mute event
+                    operator = int.from_bytes(
+                        content[6:10], "big", signed=False
                     )
-                )
-        elif stype == 0x0C:  # mute event
-            operator = int.from_bytes(content[6:10], "big", signed=False)
-            target = int.from_bytes(content[16:20], "big", signed=False)
-            duration = int.from_bytes(content[20:24], "big", signed=False)
-            if duration > 0:  # muted
-                client.dispatch_event(
-                    events.MemberMutedEvent(gid, operator, target, duration)
-                )
-            else:
-                client.dispatch_event(
-                    events.MemberUnMutedEvent(gid, operator, target)
-                )
-    elif push_type == 528:
-        pass
-        # TODO: parse friend event
-
-    seq = client.next_seq()
-    pkg = encode_push_response(
-        seq,
-        client._session_id,
-        _uin,
-        client._siginfo.d2key,
-        body.svrip,
-        [
-            DelMsgInfo(
-                from_uin=info.from_uin,
-                msg_seq=info.msg_seq,
-                msg_time=info.msg_time,
-                msg_cookies=DelMsgCookies(
-                    msg_type=info.msg_type,
-                    msg_uid=info.msg_uid,
-                    type=3,
-                    xid=50015
-                ).SerializeToString()
-            ) for info in body.msg_info
-        ],
-        req_id=req_pkg.req_id
-    )
-
-    # FIXME: useless
-    await client.send(seq, "OnlinePush.RespPush", pkg)
+                    target = int.from_bytes(content[16:20], "big", signed=False)
+                    duration = int.from_bytes(
+                        content[20:24], "big", signed=False
+                    )
+                    if duration > 0:  # muted
+                        client.dispatch_event(
+                            events.MemberMutedEvent(
+                                gid, operator, target, duration
+                            )
+                        )
+                    else:
+                        client.dispatch_event(
+                            events.MemberUnMutedEvent(gid, operator, target)
+                        )
+            elif message.message_type == 528:
+                # TODO: parse friend event
+                pass
 
-    return PushMsgCommand(
-        packet.uin, packet.seq, packet.ret_code, packet.command_name
-    )
+    return push
 
 
 __all__ = [
diff --git a/cai/client/online_push/command.py b/cai/client/online_push/command.py
index bf08cff4..a52daf2b 100644
--- a/cai/client/online_push/command.py
+++ b/cai/client/online_push/command.py
@@ -13,6 +13,9 @@
 
 from cai.client.command import Command
 from cai.pb.msf.msg.onlinepush import PbPushMsg
+from cai.utils.jce import RequestPacketVersion2
+
+from .jce import SvcReqPushMsg
 
 
 @dataclass
@@ -61,3 +64,52 @@ class PushMsg(PushMsgCommand):
 @dataclass
 class PushMsgError(PushMsgCommand):
     message: str
+
+
+@dataclass
+class SvcReqPushCommand(Command):
+    @classmethod
+    def decode_response(
+        cls, uin: int, seq: int, ret_code: int, command_name: str, data: bytes
+    ) -> "SvcReqPushCommand":
+        """Decode OnlinePush request push packet.
+
+        Note:
+            Source: com.tencent.mobileqq.service.message.MessageFactoryReceiver.l
+
+        Args:
+            uin (int): User QQ
+            seq (int): Sequence number of the response packet.
+            ret_code (int): Return code of the response.
+            command_name (str): Command name of the response.
+            data (bytes): Payload data of the response.
+        """
+        if ret_code != 0 or not data:
+            return SvcReqPushCommand(uin, seq, ret_code, command_name)
+
+        try:
+            req_packet = RequestPacketVersion2.decode(data)
+            svc_req_push = SvcReqPushMsg.decode(
+                req_packet.data["req"][  # type: ignore
+                    "OnlinePushPack.SvcReqPushMsg"
+                ][1:-1]
+            )
+            return SvcReqPush(uin, seq, ret_code, command_name, svc_req_push)
+        except Exception as e:
+            return SvcReqPushError(
+                uin,
+                seq,
+                ret_code,
+                command_name,
+                f"Error when decoding response! {repr(e)}",
+            )
+
+
+@dataclass
+class SvcReqPush(SvcReqPushCommand):
+    message: SvcReqPushMsg
+
+
+@dataclass
+class SvcReqPushError(SvcReqPushCommand):
+    message: str
diff --git a/cai/client/online_push/jce.py b/cai/client/online_push/jce.py
index 7bfa6db5..d1c35af4 100644
--- a/cai/client/online_push/jce.py
+++ b/cai/client/online_push/jce.py
@@ -13,6 +13,8 @@
 
 from jce import JceField, JceStruct, types
 
+from cai.client.qq_service.jce import StShareData
+
 
 class DelMsgInfo(JceStruct):
     """OnlinePush Delete Message Info Packet.
@@ -49,20 +51,62 @@ class DeviceInfo(JceStruct):
     ios_idfa: types.STRING = JceField("", jce_id=5)
 
 
-class MsgInfo(JceStruct):
+class CPicInfo(JceStruct):
+    """MessageSvc Online Push CPic Info jce packet.
+
+    Note:
+        Source: OnlinePushPack.CPicInfo
+    """
+
+    path: types.BYTES = JceField(jce_id=0)
+    host: types.BYTES = JceField(bytes(), jce_id=1)
+
+
+class TempMsgHead(JceStruct):
+    """MessageSvc Online Push Temp Message Head jce packet.
+
+    Note:
+        Source: OnlinePushPack.TempMsgHead
+    """
+
+    c2c_type: types.INT32 = JceField(0, jce_id=0)
+    service_type: types.INT32 = JceField(0, jce_id=1)
+
+
+class MessageInfo(JceStruct):
+    """MessageSvc Online Push Message Info jce packet.
+
+    Note:
+        Source: OnlinePushPack.MsgInfo
+    """
+
     from_uin: types.INT64 = JceField(jce_id=0)
-    msg_time: types.INT64 = JceField(jce_id=1)
-    msg_type: types.INT8 = JceField(jce_id=2)
-    msg_seq: types.INT8 = JceField(jce_id=3)
-    str_msg: types.STRING = JceField("", jce_id=4)
-    real_msg_time: types.INT32 = JceField(0, jce_id=5)
-    msg: types.BYTES = JceField(jce_id=6)
-    share_id: types.INT64 = JceField(0, jce_id=7)
-    msg_cookie: types.BYTES = JceField(bytes(), jce_id=8)
+    message_time: types.INT64 = JceField(jce_id=1)
+    message_type: types.INT16 = JceField(jce_id=2)
+    message_seq: types.INT16 = JceField(jce_id=3)
+    message: types.STRING = JceField(jce_id=4)
+    real_message_time: types.INT32 = JceField(0, jce_id=5)
+    vec_message: types.BYTES = JceField(bytes(), jce_id=6)
+    app_share_id: types.INT64 = JceField(0, jce_id=7)
+    message_cookies: types.BYTES = JceField(bytes(), jce_id=8)
     app_share_cookie: types.BYTES = JceField(bytes(), jce_id=9)
-    msg_uid: types.INT64 = JceField(0, jce_id=10)
+    message_uid: types.INT64 = JceField(0, jce_id=10)
     last_change_time: types.INT64 = JceField(0, jce_id=11)
-    # TODO: missed
+    cpic_info: types.LIST[CPicInfo] = JceField([], jce_id=12)
+    share_data: Optional[StShareData] = JceField(None, jce_id=13)
+    from_inst_id: types.INT64 = JceField(0, jce_id=14)
+    remark_of_sender: types.BYTES = JceField(bytes(), jce_id=15)
+    from_mobile: types.STRING = JceField("", jce_id=16)
+    from_name: types.STRING = JceField("", jce_id=17)
+    nickname: types.LIST[types.STRING] = JceField([], jce_id=18)
+    c2c_temp_msg_head: Optional[TempMsgHead] = JceField(None, jce_id=19)
+
+
+class UinPairMsg(JceStruct):
+    last_read_time: types.INT64 = JceField(0, jce_id=1)
+    peer_uin: types.INT64 = JceField(0, jce_id=2)
+    msg_completed: types.INT64 = JceField(0, jce_id=3)
+    msg_info: Optional[types.LIST[MessageInfo]] = JceField(None, jce_id=4)
 
 
 class SvcRespPushMsg(JceStruct):
@@ -80,13 +124,15 @@ class SvcRespPushMsg(JceStruct):
     device_info: Optional[DeviceInfo] = JceField(None, jce_id=5)
 
 
-class _SvcReqPushMsg(JceStruct):
+class SvcReqPushMsg(JceStruct):
     uin: types.INT64 = JceField(jce_id=0)
     msg_time: types.INT64 = JceField(jce_id=1)
-    msg_info: types.LIST[MsgInfo] = JceField(jce_id=2)
-    svrip: types.INT32 = JceField(0, jce_id=3)
-    sync_cookie: types.BYTES = JceField(bytes(), jce_id=4)
-
-
-class SvcReqPushMsg(JceStruct):
-    body: _SvcReqPushMsg = JceField(jce_id=0)
+    msg_info: types.LIST[MessageInfo] = JceField(jce_id=2)
+    svrip: types.INT32 = JceField(jce_id=3)
+    sync_cookie: Optional[types.BYTES] = JceField(None, jce_id=4)
+    uinpair_msg: Optional[types.LIST[UinPairMsg]] = JceField(None, jce_id=5)
+    preview: Optional[types.MAP[types.STRING, types.BYTES]] = JceField(
+        None, jce_id=6
+    )
+    user_active: types.INT32 = JceField(0, jce_id=7)
+    general_flag: types.INT32 = JceField(0, jce_id=12)

From 49e177b44f369c9ed0c024f369f9b60003e44037 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 9 Apr 2022 13:17:37 +0800
Subject: [PATCH 078/113] fix: reconnect fail

---
 cai/client/client.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index f6abb4b7..f06b986d 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -369,6 +369,7 @@ async def reconnect(
         if not change_server and self._connection:
             log.network.warning("reconnecting...")
             await self._connection.reconnect()
+            asyncio.create_task(self.receive()).add_done_callback(self._recv_done_cb)
             log.network.info("reconnected")
             return
 
@@ -389,7 +390,7 @@ async def reconnect_and_login(
         await self.reconnect(change_server=change_server, server=server)
         # FIXME: register reason msfByNetChange?
         try:
-            await self._init(drop_offline_msg=False)
+            await self._init()
         except asyncio.exceptions.TimeoutError:  # fallback
             log.network.warning("register failed, trying to re-login")
             await self.reconnect()

From 6ce883cd23b05cd646c26a8ab0f55279674efc6c Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 9 Apr 2022 13:21:16 +0800
Subject: [PATCH 079/113] fix: drop msg when reconnect

---
 cai/client/client.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index f06b986d..da6209a2 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -390,7 +390,7 @@ async def reconnect_and_login(
         await self.reconnect(change_server=change_server, server=server)
         # FIXME: register reason msfByNetChange?
         try:
-            await self._init()
+            await self._init(drop_offline_msg=False)
         except asyncio.exceptions.TimeoutError:  # fallback
             log.network.warning("register failed, trying to re-login")
             await self.reconnect()

From 83f2d132dd25ae7ad1190b36ee327d18ae9f61e4 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Sat, 9 Apr 2022 13:40:05 +0800
Subject: [PATCH 080/113] :wheelchair: refactor receiver start

---
 cai/client/client.py | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index da6209a2..3d7ea719 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -321,8 +321,7 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
             self._connection = await connect(
                 _server.host, _server.port, ssl=False, timeout=3.0
             )
-            task = asyncio.create_task(self.receive())
-            task.add_done_callback(self._recv_done_cb)
+            self._start_receiver()
         except ConnectionError as e:
             raise
         except Exception as e:
@@ -331,6 +330,10 @@ async def connect(self, server: Optional[SsoServer] = None) -> None:
                 f"server({_server.host}:{_server.port}): " + repr(e)
             )
 
+    def _start_receiver(self):
+        task = asyncio.create_task(self.receive())
+        task.add_done_callback(self._recv_done_cb)
+
     def _recv_done_cb(self, task: asyncio.Task):
         if self._reconnect:
             if (
@@ -369,7 +372,7 @@ async def reconnect(
         if not change_server and self._connection:
             log.network.warning("reconnecting...")
             await self._connection.reconnect()
-            asyncio.create_task(self.receive()).add_done_callback(self._recv_done_cb)
+            self._start_receiver()
             log.network.info("reconnected")
             return
 

From 7f8fb29b5c4f51559414a61eb97f716f12edbaa3 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 9 Apr 2022 15:14:30 +0800
Subject: [PATCH 081/113] add: remove duplicates req

---
 cai/client/online_push/__init__.py | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index 73580e6a..6d362f84 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -256,9 +256,12 @@ async def handle_req_push(
         packet.data,
     )
 
-    # FIXME: cache and remove duplicates
-
     if isinstance(push, SvcReqPush):
+        if push.seq in client._msg_cache:  # duplicates msg, drop
+            return push
+        else:
+            client._msg_cache[push.seq] = None
+
         seq = client.next_seq()
         pkg = encode_push_response(
             seq,
@@ -282,7 +285,7 @@ async def handle_req_push(
             ],
             req_id=push.seq,
         )
-        await client.send(seq, "OnlinePush.RespPush", pkg)
+        #await client.send(seq, "OnlinePush.RespPush", pkg)
 
         for message in push.message.msg_info:
             if message.message_type == 169:

From 016b31eb83bce32d3bdc7b5fe8101fc2129096b6 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Sat, 9 Apr 2022 16:32:23 +0800
Subject: [PATCH 082/113] :wheelchair: improve online push cache

---
 cai/client/client.py                   |  9 +++---
 cai/client/message_service/__init__.py | 11 ++++---
 cai/client/online_push/__init__.py     | 43 ++++++++++++++------------
 3 files changed, 35 insertions(+), 28 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 3d7ea719..84968566 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -149,7 +149,7 @@ def __init__(
         apk_info: ApkInfo,
         *,
         auto_reconnect: bool = True,
-        max_reconnections: Optional[int] = 3,
+        max_reconnections: int = 3,
     ):
         # client info
         self._device: DeviceInfo = device
@@ -196,12 +196,13 @@ def __init__(
         self._sync_cookie: bytes = bytes()
         self._pubaccount_cookie: bytes = bytes()
         self._msg_cache: TTLCache = TTLCache(maxsize=1024, ttl=3600)
+        self._online_push_cache: TTLCache = TTLCache(maxsize=1024, ttl=3600)
         self._receive_store: FutureStore[int, Command] = FutureStore()
 
         # connection info
         self._reconnect: bool = auto_reconnect
         self._reconnect_times: int = 0
-        self._max_reconnections: Optional[int] = max_reconnections
+        self._max_reconnections: int = max_reconnections
         self._closed: asyncio.Event = asyncio.Event()
 
     def __str__(self) -> str:
@@ -394,9 +395,9 @@ async def reconnect_and_login(
         # FIXME: register reason msfByNetChange?
         try:
             await self._init(drop_offline_msg=False)
-        except asyncio.exceptions.TimeoutError:  # fallback
+        except asyncio.TimeoutError:
             log.network.warning("register failed, trying to re-login")
-            await self.reconnect()
+            await self.reconnect(change_server=True, server=server)
             await self.login()
 
     async def close(self) -> None:
diff --git a/cai/client/message_service/__init__.py b/cai/client/message_service/__init__.py
index 46deac95..acdf0c69 100644
--- a/cai/client/message_service/__init__.py
+++ b/cai/client/message_service/__init__.py
@@ -155,12 +155,15 @@ async def handle_get_message(
 
                 key = (
                     f"{message.head.from_uin}"
-                    f"{message.head.type}"
-                    f"{message.head.time}"
+                    f"{message.head.to_uin}"
+                    f"{message.head.seq}"
+                    f"{message.head.uid}"
                 )
-                if key in client._msg_cache:
-                    continue
+                # refresh key ttl first
+                should_skip = key in client._msg_cache
                 client._msg_cache[key] = None
+                if should_skip:
+                    continue
 
                 # drop messages when init
                 if client._init_flag:
diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index 6d362f84..e9454fe5 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -8,20 +8,20 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-from typing import TYPE_CHECKING, List, Tuple, Optional, Sequence
+from typing import TYPE_CHECKING, List, Optional, Sequence
 
-from jce import JceStruct, JceDecoder, types
+from jce import types
 
 from cai.log import logger
 from cai.client import events
 from cai.utils.binary import Packet
+from cai.utils.jce import RequestPacketVersion3
 from cai.pb.im.op.online_push_pb2 import DelMsgCookies
 from cai.client.message_service import MESSAGE_DECODERS
 from cai.client.packet import UniPacket, IncomingPacket
-from cai.utils.jce import RequestPacket, RequestPacketVersion3
 from cai.pb.im.oidb.cmd0x857.troop_tips import TemplParam, NotifyMsgBody
 
-from .jce import DelMsgInfo, DeviceInfo, SvcReqPushMsg, SvcRespPushMsg
+from .jce import DelMsgInfo, DeviceInfo, SvcRespPushMsg
 from .command import (
     PushMsg,
     SvcReqPush,
@@ -237,8 +237,6 @@ def _parse_poke(params: Sequence[TemplParam], default: int) -> dict:
     return res
 
 
-repeat_ev = set()
-
 # OnlinePush.ReqPush
 async def handle_req_push(
     client: "Client", packet: IncomingPacket
@@ -257,11 +255,6 @@ async def handle_req_push(
     )
 
     if isinstance(push, SvcReqPush):
-        if push.seq in client._msg_cache:  # duplicates msg, drop
-            return push
-        else:
-            client._msg_cache[push.seq] = None
-
         seq = client.next_seq()
         pkg = encode_push_response(
             seq,
@@ -285,20 +278,30 @@ async def handle_req_push(
             ],
             req_id=push.seq,
         )
-        #await client.send(seq, "OnlinePush.RespPush", pkg)
+        # await client.send(seq, "OnlinePush.RespPush", pkg)
+
+        for info in push.message.msg_info:
+            key = (
+                f"{info.message_seq}"
+                f"{info.message_time}"
+                f"{info.message_uid}"
+            )
+            should_skip = key in client._online_push_cache
+            client._online_push_cache[key] = None
+            if should_skip:
+                continue
 
-        for message in push.message.msg_info:
-            if message.message_type == 169:
+            if info.message_type == 169:
                 # handleC2COnlinePushMsgResp
                 pass
-            elif message.message_type == 8:
+            elif info.message_type == 8:
                 # HandleShMsgType0x08
                 pass
-            elif message.message_type == 132:
+            elif info.message_type == 132:
                 # HandleShMsgType0x84
                 pass
-            elif message.message_type == 732:
-                content = message.vec_message
+            elif info.message_type == 732:
+                content = info.vec_message
                 sub_type = content[4]
                 gid = int.from_bytes(content[:4], "big")
 
@@ -309,7 +312,7 @@ async def handle_req_push(
                             events.NudgeEvent(
                                 **_parse_poke(
                                     notify.general_gray_tip.templ_param,
-                                    default=message.from_uin,
+                                    default=info.from_uin,
                                 ),
                                 group=gid,
                             )
@@ -345,7 +348,7 @@ async def handle_req_push(
                         client.dispatch_event(
                             events.MemberUnMutedEvent(gid, operator, target)
                         )
-            elif message.message_type == 528:
+            elif info.message_type == 528:
                 # TODO: parse friend event
                 pass
 

From e66eeef239013925d9fef4d89c9112815b43494f Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Sat, 9 Apr 2022 17:15:39 +0800
Subject: [PATCH 083/113] :construction: process del msg

---
 cai/client/online_push/__init__.py | 32 +++++++--------------
 cai/client/online_push/jce.py      | 16 +++++------
 cai/pb/im/op/__init__.py           |  0
 cai/pb/im/op/online_push.proto     |  8 ------
 cai/pb/im/op/online_push_pb2.py    | 34 ----------------------
 cai/pb/im/op/online_push_pb2.pyi   | 46 ------------------------------
 6 files changed, 19 insertions(+), 117 deletions(-)
 delete mode 100644 cai/pb/im/op/__init__.py
 delete mode 100644 cai/pb/im/op/online_push.proto
 delete mode 100644 cai/pb/im/op/online_push_pb2.py
 delete mode 100644 cai/pb/im/op/online_push_pb2.pyi

diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index e9454fe5..32690aa9 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -16,7 +16,6 @@
 from cai.client import events
 from cai.utils.binary import Packet
 from cai.utils.jce import RequestPacketVersion3
-from cai.pb.im.op.online_push_pb2 import DelMsgCookies
 from cai.client.message_service import MESSAGE_DECODERS
 from cai.client.packet import UniPacket, IncomingPacket
 from cai.pb.im.oidb.cmd0x857.troop_tips import TemplParam, NotifyMsgBody
@@ -265,43 +264,34 @@ async def handle_req_push(
             [
                 DelMsgInfo(
                     from_uin=info.from_uin,
-                    msg_seq=info.message_seq,
-                    msg_time=info.message_time,
-                    msg_cookies=DelMsgCookies(
-                        msg_type=info.message_type,
-                        msg_uid=info.message_uid,
-                        type=3,
-                        xid=50015,
-                    ).SerializeToString(),
+                    msg_seq=info.msg_seq,
+                    msg_time=info.msg_time,
+                    msg_cookies=info.msg_cookies,
                 )
                 for info in push.message.msg_info
             ],
             req_id=push.seq,
         )
-        # await client.send(seq, "OnlinePush.RespPush", pkg)
+        await client.send(seq, "OnlinePush.RespPush", pkg)
 
         for info in push.message.msg_info:
-            key = (
-                f"{info.message_seq}"
-                f"{info.message_time}"
-                f"{info.message_uid}"
-            )
+            key = f"{info.msg_seq}" f"{info.msg_time}" f"{info.msg_uid}"
             should_skip = key in client._online_push_cache
             client._online_push_cache[key] = None
             if should_skip:
                 continue
 
-            if info.message_type == 169:
+            if info.msg_type == 169:
                 # handleC2COnlinePushMsgResp
                 pass
-            elif info.message_type == 8:
+            elif info.msg_type == 8:
                 # HandleShMsgType0x08
                 pass
-            elif info.message_type == 132:
+            elif info.msg_type == 132:
                 # HandleShMsgType0x84
                 pass
-            elif info.message_type == 732:
-                content = info.vec_message
+            elif info.msg_type == 732:
+                content = info.vec_msg
                 sub_type = content[4]
                 gid = int.from_bytes(content[:4], "big")
 
@@ -348,7 +338,7 @@ async def handle_req_push(
                         client.dispatch_event(
                             events.MemberUnMutedEvent(gid, operator, target)
                         )
-            elif info.message_type == 528:
+            elif info.msg_type == 528:
                 # TODO: parse friend event
                 pass
 
diff --git a/cai/client/online_push/jce.py b/cai/client/online_push/jce.py
index d1c35af4..46986871 100644
--- a/cai/client/online_push/jce.py
+++ b/cai/client/online_push/jce.py
@@ -81,16 +81,16 @@ class MessageInfo(JceStruct):
     """
 
     from_uin: types.INT64 = JceField(jce_id=0)
-    message_time: types.INT64 = JceField(jce_id=1)
-    message_type: types.INT16 = JceField(jce_id=2)
-    message_seq: types.INT16 = JceField(jce_id=3)
-    message: types.STRING = JceField(jce_id=4)
-    real_message_time: types.INT32 = JceField(0, jce_id=5)
-    vec_message: types.BYTES = JceField(bytes(), jce_id=6)
+    msg_time: types.INT64 = JceField(jce_id=1)
+    msg_type: types.INT16 = JceField(jce_id=2)
+    msg_seq: types.INT16 = JceField(jce_id=3)
+    msg: types.STRING = JceField(jce_id=4)
+    real_msg_time: types.INT32 = JceField(0, jce_id=5)
+    vec_msg: types.BYTES = JceField(bytes(), jce_id=6)
     app_share_id: types.INT64 = JceField(0, jce_id=7)
-    message_cookies: types.BYTES = JceField(bytes(), jce_id=8)
+    msg_cookies: types.BYTES = JceField(bytes(), jce_id=8)
     app_share_cookie: types.BYTES = JceField(bytes(), jce_id=9)
-    message_uid: types.INT64 = JceField(0, jce_id=10)
+    msg_uid: types.INT64 = JceField(0, jce_id=10)
     last_change_time: types.INT64 = JceField(0, jce_id=11)
     cpic_info: types.LIST[CPicInfo] = JceField([], jce_id=12)
     share_data: Optional[StShareData] = JceField(None, jce_id=13)
diff --git a/cai/pb/im/op/__init__.py b/cai/pb/im/op/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/cai/pb/im/op/online_push.proto b/cai/pb/im/op/online_push.proto
deleted file mode 100644
index 313545db..00000000
--- a/cai/pb/im/op/online_push.proto
+++ /dev/null
@@ -1,8 +0,0 @@
-syntax = "proto3";
-
-message DelMsgCookies {
-  int32 msg_type = 1;
-  int64 msg_uid = 2;
-  int32 type = 3;  // idk, value is 3
-  int32 xid = 4;  // idk, value is 50015
-}
diff --git a/cai/pb/im/op/online_push_pb2.py b/cai/pb/im/op/online_push_pb2.py
deleted file mode 100644
index b744b0d8..00000000
--- a/cai/pb/im/op/online_push_pb2.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: online_push.proto
-"""Generated protocol buffer code."""
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11online_push.proto\"M\n\rDelMsgCookies\x12\x10\n\x08msg_type\x18\x01 \x01(\x05\x12\x0f\n\x07msg_uid\x18\x02 \x01(\x03\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x0b\n\x03xid\x18\x04 \x01(\x05\x62\x06proto3')
-
-
-
-_DELMSGCOOKIES = DESCRIPTOR.message_types_by_name['DelMsgCookies']
-DelMsgCookies = _reflection.GeneratedProtocolMessageType('DelMsgCookies', (_message.Message,), {
-  'DESCRIPTOR' : _DELMSGCOOKIES,
-  '__module__' : 'online_push_pb2'
-  # @@protoc_insertion_point(class_scope:DelMsgCookies)
-  })
-_sym_db.RegisterMessage(DelMsgCookies)
-
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  _DELMSGCOOKIES._serialized_start=21
-  _DELMSGCOOKIES._serialized_end=98
-# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/op/online_push_pb2.pyi b/cai/pb/im/op/online_push_pb2.pyi
deleted file mode 100644
index 6e54e27e..00000000
--- a/cai/pb/im/op/online_push_pb2.pyi
+++ /dev/null
@@ -1,46 +0,0 @@
-"""
-@generated by mypy-protobuf.  Do not edit manually!
-isort:skip_file
-"""
-from builtins import (
-    int,
-)
-
-from google.protobuf.descriptor import (
-    Descriptor,
-    FileDescriptor,
-)
-
-from google.protobuf.message import (
-    Message,
-)
-
-from typing_extensions import (
-    Literal,
-)
-
-
-DESCRIPTOR: FileDescriptor
-
-class DelMsgCookies(Message):
-    DESCRIPTOR: Descriptor
-    MSG_TYPE_FIELD_NUMBER: int
-    MSG_UID_FIELD_NUMBER: int
-    TYPE_FIELD_NUMBER: int
-    XID_FIELD_NUMBER: int
-    msg_type: int
-    msg_uid: int
-    type: int
-    """idk, value is 3"""
-
-    xid: int
-    """idk, value is 50015"""
-
-    def __init__(self,
-        *,
-        msg_type: int = ...,
-        msg_uid: int = ...,
-        type: int = ...,
-        xid: int = ...,
-        ) -> None: ...
-    def ClearField(self, field_name: Literal["msg_type",b"msg_type","msg_uid",b"msg_uid","type",b"type","xid",b"xid"]) -> None: ...

From e099cfa68ac7bad0b63e4158f466ae0d511dd48c Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Sat, 9 Apr 2022 17:51:36 +0800
Subject: [PATCH 084/113] :wrench: improve account settings cache

---
 cai/api/client.py        | 15 +++++----------
 cai/settings/device.py   | 31 +++++++++++--------------------
 cai/settings/protocol.py | 29 ++++++++++-------------------
 cai/storage/__init__.py  | 38 +++++++++++++++++++-------------------
 examples/login.py        |  6 +-----
 5 files changed, 46 insertions(+), 73 deletions(-)

diff --git a/cai/api/client.py b/cai/api/client.py
index 76b917c4..66205bb3 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -13,10 +13,10 @@
 from cai import log
 from cai.client import OnlineStatus
 from cai.client import Client as client_t
-from cai.settings.protocol import ApkInfo
+from cai.settings.device import get_device
 from cai.pb.msf.msg.svc import PbSendMsgResp
 from cai.client.highway import HighWaySession
-from cai.settings.device import DeviceInfo, new_device
+from cai.settings.protocol import get_protocol
 from cai.client.message_service.encoders import build_msg, make_group_msg_pkg
 from cai.client.message_service.models import (
     Element,
@@ -35,20 +35,15 @@
 )
 
 
-def make_client(
-    uin: int,
-    passwd: Union[str, bytes],
-    apk_info: ApkInfo,
-    device: Optional[DeviceInfo] = None,
-) -> client_t:
+def make_client(uin: int, passwd: Union[str, bytes]) -> client_t:
     if not (isinstance(passwd, bytes) and len(passwd) == 16):
         # not a vailed md5 passwd
         if isinstance(passwd, bytes):
             passwd = hashlib.md5(passwd).digest()
         else:
             passwd = hashlib.md5(passwd.encode()).digest()
-    if not device:
-        device = new_device()
+    device = get_device(uin)
+    apk_info = get_protocol(uin)
     return client_t(uin, passwd, device, apk_info)
 
 
diff --git a/cai/settings/device.py b/cai/settings/device.py
index fd0726ad..81c3b1a4 100644
--- a/cai/settings/device.py
+++ b/cai/settings/device.py
@@ -11,7 +11,6 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 import os
-import time
 import uuid
 import random
 import secrets
@@ -23,8 +22,6 @@
 from cai.storage import Storage
 from cai.utils.dataclass import JsonableDataclass
 
-_device: Optional["DeviceInfo"] = None
-
 
 @dataclass(init=True, eq=False)
 class Version(JsonableDataclass):
@@ -232,35 +229,29 @@ def new_device(
     )
 
 
-def get_device(cache: bool = True) -> DeviceInfo:
-    global _device
-    if cache and _device:
-        return _device
+def get_device(uin: int, cache: bool = True) -> DeviceInfo:
+    cache_file = Storage.get_account_cache_dir(uin) / "device.json"
+    backup_file = Storage.get_account_cache_dir(uin) / "device.json.bak"
 
     device: DeviceInfo
-    if not os.path.exists(Storage.device_file):
-        device = new_device()
-        with open(Storage.device_file, "w") as f:
-            device.to_file(f)
-    else:
-        with open(Storage.device_file, "r+") as f:
+    if cache and cache_file.exists():
+        with cache_file.open("r+") as f:
             try:
                 device = DeviceInfo.from_file(f)
             except Exception as e:
-                backup_file = f"{Storage.device_file}.{int(time.time())}.bak"
                 logger.error(
                     "Error when loading device info from config file:\n\n"
                     + repr(e)
-                    + f"\n\nRegenerating device info in `{Storage.device_file}`! "
+                    + f"\n\nRegenerating device info in `{cache_file}`! "
                     + f"The original device info has been backed up in `{backup_file}`."
                 )
                 f.seek(0)
-                with open(backup_file, "w") as fb:
-                    fb.write(f.read())
+                backup_file.write_text(f.read())
                 device = new_device()
                 f.seek(0)
                 f.truncate(0)
                 device.to_file(f)
-
-    _device = device
-    return _device
+    else:
+        device = new_device()
+        cache_file.write_text(device.to_json())
+    return device
diff --git a/cai/settings/protocol.py b/cai/settings/protocol.py
index b7eaf766..8dcd75fb 100644
--- a/cai/settings/protocol.py
+++ b/cai/settings/protocol.py
@@ -10,15 +10,10 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-import os
-from typing import Optional, NamedTuple
+from typing import NamedTuple
 
 from cai.storage import Storage
 
-MISSING = "MISSING"
-
-_protocol: Optional["ApkInfo"] = None
-
 
 class ApkInfo(NamedTuple):
     apk_id: str
@@ -176,18 +171,14 @@ def get_apk_info(_type: str = "IPAD") -> ApkInfo:
     return info[_type]
 
 
-def get_protocol(cache: bool = True) -> ApkInfo:
-    global _protocol
-    if cache and _protocol:
-        return _protocol
+def get_protocol(uin: int, cache: bool = True) -> ApkInfo:
+    protocol_file = Storage.get_account_cache_dir(uin) / "protocol"
 
-    type_ = os.getenv(Storage.protocol_env_name, MISSING)
-    if type_ is MISSING and os.path.exists(Storage.protocol_file):
-        with open(Storage.protocol_file, "r") as f:
-            type_ = f.read()
-    elif type_ is MISSING:
+    if protocol_file.exists():
+        type_ = protocol_file.read_text()
+    else:
         type_ = "IPAD"
-        with open(Storage.protocol_file, "w") as f:
-            f.write("IPAD")
-    _protocol = get_apk_info(type_)
-    return _protocol
+        protocol_file.write_text(type_)
+
+    protocol = get_apk_info(type_)
+    return protocol
diff --git a/cai/storage/__init__.py b/cai/storage/__init__.py
index 31571d60..e3e62fd3 100644
--- a/cai/storage/__init__.py
+++ b/cai/storage/__init__.py
@@ -10,6 +10,7 @@
 """
 import os
 import shutil
+from pathlib import Path
 
 from .utils import user_cache_dir, user_config_dir
 
@@ -18,37 +19,36 @@ class Storage:
     app_name: str = "CAI"
 
     # application config dir
-    default_app_dir: str = user_config_dir(app_name, roaming=True)
-    app_dir: str = os.getenv(f"{app_name}_APP_DIR", default_app_dir)
-    if not os.path.exists(app_dir):
-        os.makedirs(app_dir)
-    if not os.path.isdir(app_dir):
+    _default_app_dir: str = user_config_dir(app_name, roaming=True)
+    app_dir: Path = Path(os.getenv(f"{app_name}_APP_DIR", _default_app_dir))
+    app_dir.mkdir(parents=True, exist_ok=True)
+    if not app_dir.is_dir():
         raise RuntimeError(
             f"Application directory {app_dir} is not a directory!"
         )
 
     # application cache dir
-    default_cache_dir: str = user_cache_dir(app_name)
-    cache_dir: str = os.getenv(f"{app_name}_CACHE_DIR", default_cache_dir)
-    if not os.path.exists(cache_dir):
-        os.makedirs(cache_dir)
-    if not os.path.isdir(cache_dir):
+    _default_cache_dir: str = user_cache_dir(app_name)
+    cache_dir: Path = Path(
+        os.getenv(f"{app_name}_CACHE_DIR", _default_cache_dir)
+    )
+    cache_dir.mkdir(parents=True, exist_ok=True)
+    if not cache_dir.is_dir():
         raise RuntimeError(
             f"Application Cache directory {cache_dir} is not a directory!"
         )
 
-    # cai.settings.device
-    device_file: str = os.path.join(app_dir, "device.json")
-
-    # cai.settings.protocol
-    protocol_env_name: str = f"{app_name}_PROTOCOL"
-    protocol_file: str = os.path.join(app_dir, "protocol")
+    @classmethod
+    def get_account_cache_dir(cls, uin: int) -> Path:
+        cache = cls.cache_dir / str(uin)
+        cache.mkdir(parents=True, exist_ok=True)
+        return cache
 
     @classmethod
     def clear_cache(cls):
         # FIXME: delete used dir only
-        for path in os.listdir(cls.cache_dir):
-            if os.path.isdir(path):
+        for path in cls.cache_dir.iterdir():
+            if path.is_dir():
                 shutil.rmtree(path)
             else:
-                os.remove(path)
+                path.unlink()
diff --git a/examples/login.py b/examples/login.py
index fd869e3a..b2c48d61 100644
--- a/examples/login.py
+++ b/examples/login.py
@@ -17,8 +17,6 @@
 from PIL import Image
 
 from cai.api import Client, make_client
-from cai.settings.device import get_device
-from cai.settings.protocol import get_apk_info
 from cai.client.message_service.models import TextElement
 from cai.client import Event, GroupMessage, OnlineStatus, PrivateMessage
 from cai.exceptions import (
@@ -38,9 +36,7 @@ async def run(closed: asyncio.Event):
         assert password and account, ValueError("account or password not set")
 
         account = int(account)
-        ci = Client(
-            make_client(account, password, get_apk_info(), device=get_device())
-        )
+        ci = Client(make_client(account, password))
 
         try:
             await ci.login()

From 4d4a6b057856bf8bead39609b66925513a31c3e9 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Sat, 9 Apr 2022 20:25:52 +0800
Subject: [PATCH 085/113] :bug: fix delete online push seq error

---
 cai/client/online_push/__init__.py | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index 32690aa9..167e2b3a 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -44,7 +44,6 @@ def encode_push_response(
     push_token: Optional[bytes] = None,
     service_type: int = 0,
     device_info: Optional[DeviceInfo] = None,
-    req_id: int = 0,
 ) -> Packet:
     """Build online push response packet.
 
@@ -81,7 +80,6 @@ def encode_push_response(
     )
     payload = SvcRespPushMsg.to_bytes(0, resp)
     req_packet = RequestPacketVersion3(
-        req_id=req_id,
         servant_name="OnlinePush",
         func_name="SvcRespPushMsg",
         data=types.MAP({types.STRING("resp"): types.BYTES(payload)}),
@@ -254,9 +252,8 @@ async def handle_req_push(
     )
 
     if isinstance(push, SvcReqPush):
-        seq = client.next_seq()
         pkg = encode_push_response(
-            seq,
+            push.seq,
             client._session_id,
             push.message.uin,
             client._siginfo.d2key,
@@ -270,9 +267,8 @@ async def handle_req_push(
                 )
                 for info in push.message.msg_info
             ],
-            req_id=push.seq,
         )
-        await client.send(seq, "OnlinePush.RespPush", pkg)
+        await client.send(push.seq, "OnlinePush.RespPush", pkg)
 
         for info in push.message.msg_info:
             key = f"{info.msg_seq}" f"{info.msg_time}" f"{info.msg_uid}"

From 0254e5aa5e50f81137149ea8e8f3af562dbe7c6b Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Sat, 9 Apr 2022 20:42:30 +0800
Subject: [PATCH 086/113] :bug: fix incoming packet signed seq

---
 cai/client/packet.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cai/client/packet.py b/cai/client/packet.py
index 79929d4d..bac60eab 100644
--- a/cai/client/packet.py
+++ b/cai/client/packet.py
@@ -244,8 +244,8 @@ def parse_sso_frame(
             compress_type,
         ) = (
             sso_frame.start()
-            .uint32()
-            .uint32()
+            .int32()
+            .int32()
             .int32()
             .bytes_with_length(4, 4)
             .string(4, 4)

From 3e6a61e025824fec05c0dea7008098f6a0544970 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 9 Apr 2022 21:11:16 +0800
Subject: [PATCH 087/113] fix: unipkg seq signed

---
 cai/client/packet.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cai/client/packet.py b/cai/client/packet.py
index 79929d4d..b59da8fd 100644
--- a/cai/client/packet.py
+++ b/cai/client/packet.py
@@ -152,7 +152,7 @@ def build(
         )
         data.write_with_length(body, offset=4)
         return cls().write_with_length(
-            struct.pack(">IBIB", 0xB, body_type, seq, 0),
+            struct.pack(">IBiB", 0xB, body_type, seq, 0),
             struct.pack(">I", len(str(uin)) + 4),
             str(uin).encode(),
             qqtea_encrypt(bytes(data), key),

From 7752c206693d8f9d597bea5c7b0b6afaecadab8d Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Sat, 9 Apr 2022 21:12:45 +0800
Subject: [PATCH 088/113] change: incoming log message

---
 cai/client/client.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index da6209a2..3ae61c0b 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -520,7 +520,7 @@ async def receive(self):
                     self._siginfo.wt_session_ticket_key,
                 )
                 log.network.debug(
-                    f"(receive: {packet.ret_code}): {packet.command_name}"
+                    f"(receive: {packet.seq}): {packet.command_name}"
                 )
                 # do not block receive
                 asyncio.create_task(self._handle_incoming_packet(packet))

From 1d0bd8235b784d527518a06b1a383e94a1acbf0e Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Sun, 10 Apr 2022 15:18:03 +0800
Subject: [PATCH 089/113] :wrench: fix config dir error

---
 cai/settings/device.py   | 4 ++--
 cai/settings/protocol.py | 4 ++--
 cai/storage/__init__.py  | 6 ++++++
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/cai/settings/device.py b/cai/settings/device.py
index 81c3b1a4..19621c1e 100644
--- a/cai/settings/device.py
+++ b/cai/settings/device.py
@@ -230,8 +230,8 @@ def new_device(
 
 
 def get_device(uin: int, cache: bool = True) -> DeviceInfo:
-    cache_file = Storage.get_account_cache_dir(uin) / "device.json"
-    backup_file = Storage.get_account_cache_dir(uin) / "device.json.bak"
+    cache_file = Storage.get_account_config_dir(uin) / "device.json"
+    backup_file = Storage.get_account_config_dir(uin) / "device.json.bak"
 
     device: DeviceInfo
     if cache and cache_file.exists():
diff --git a/cai/settings/protocol.py b/cai/settings/protocol.py
index 8dcd75fb..a9121d0b 100644
--- a/cai/settings/protocol.py
+++ b/cai/settings/protocol.py
@@ -172,9 +172,9 @@ def get_apk_info(_type: str = "IPAD") -> ApkInfo:
 
 
 def get_protocol(uin: int, cache: bool = True) -> ApkInfo:
-    protocol_file = Storage.get_account_cache_dir(uin) / "protocol"
+    protocol_file = Storage.get_account_config_dir(uin) / "protocol"
 
-    if protocol_file.exists():
+    if cache and protocol_file.exists():
         type_ = protocol_file.read_text()
     else:
         type_ = "IPAD"
diff --git a/cai/storage/__init__.py b/cai/storage/__init__.py
index e3e62fd3..d7404235 100644
--- a/cai/storage/__init__.py
+++ b/cai/storage/__init__.py
@@ -44,6 +44,12 @@ def get_account_cache_dir(cls, uin: int) -> Path:
         cache.mkdir(parents=True, exist_ok=True)
         return cache
 
+    @classmethod
+    def get_account_config_dir(cls, uin: int) -> Path:
+        config = cls.app_dir / str(uin)
+        config.mkdir(parents=True, exist_ok=True)
+        return config
+
     @classmethod
     def clear_cache(cls):
         # FIXME: delete used dir only

From 1a819ebdc29735401c0630c5f9a273431b238ca0 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Sun, 10 Apr 2022 16:24:39 +0800
Subject: [PATCH 090/113] :construction: process onlinepush reqpush types

---
 cai/client/events/__init__.py      |  24 ++--
 cai/client/events/group.py         |  52 +++++---
 cai/client/online_push/__init__.py |  75 ++---------
 cai/client/online_push/decoders.py | 194 +++++++++++++++++++++++++++++
 examples/login.py                  |  46 +++----
 5 files changed, 276 insertions(+), 115 deletions(-)
 create mode 100644 cai/client/online_push/decoders.py

diff --git a/cai/client/events/__init__.py b/cai/client/events/__init__.py
index 183ef0b9..d7859013 100644
--- a/cai/client/events/__init__.py
+++ b/cai/client/events/__init__.py
@@ -1,18 +1,22 @@
-from .common import NudgeEvent
+from .base import Event as Event
+from .group import GroupEvent as GroupEvent
+from .common import NudgeEvent as NudgeEvent
+from .group import GroupRedbagEvent as GroupRedbagEvent
+from .group import MemberMutedEvent as MemberMutedEvent
+from .group import MemberUnMutedEvent as MemberUnMutedEvent
+from .group import GroupNameChangedEvent as GroupNameChangedEvent
+from .group import GroupMessageRecalledEvent as GroupMessageRecalledEvent
 from .group import (
-    GroupEvent,
-    MemberMutedEvent,
-    MemberUnMutedEvent,
-    MemberRecallMessageEvent,
+    GroupMemberSpecialTitleChangedEvent as GroupMemberSpecialTitleChangedEvent,
 )
 
-# from .friend import *
-
-
 __all__ = [
+    "Event",
     "GroupEvent",
+    "NudgeEvent",
     "MemberMutedEvent",
     "MemberUnMutedEvent",
-    "MemberRecallMessageEvent",
-    "NudgeEvent",
+    "GroupMemberSpecialTitleChangedEvent",
+    "GroupNameChangedEvent",
+    "GroupMessageRecalledEvent",
 ]
diff --git a/cai/client/events/group.py b/cai/client/events/group.py
index ff61ec8d..93675b7d 100644
--- a/cai/client/events/group.py
+++ b/cai/client/events/group.py
@@ -1,36 +1,60 @@
 from dataclasses import dataclass
+from typing import Any, Dict, List
 
 from .base import Event
 
 
+@dataclass
 class GroupEvent(Event):
+    group_id: int
+
     @property
     def type(self) -> str:
         return self.__class__.__name__
 
 
 @dataclass
-class MemberMutedEvent(GroupEvent):
-    group: int
-    operator: int
-    target: int
-    duration: int
+class _GroupGrayTipEvent(GroupEvent):
+    text: str
+    raw_text: str
+    cmds: List[Dict[str, Any]]
 
 
+# FIXME: unhandle details
 @dataclass
-class MemberUnMutedEvent(GroupEvent):
-    group: int
+class GroupRedbagEvent(GroupEvent):
+    sender_id: int
+
+
+@dataclass
+class GroupMemberSpecialTitleChangedEvent(_GroupGrayTipEvent):
+    user_id: int
+
+
+@dataclass
+class GroupNameChangedEvent(_GroupGrayTipEvent):
+    ...
+
+
+@dataclass
+class GroupMessageRecalledEvent(GroupEvent):
+    operator_id: int
+    author_id: int
+    msg_seq: int
+    msg_time: int
+    msg_type: int
+    msg_random: int
+    is_anony_msg: bool
+
+
+@dataclass
+class MemberMutedEvent(GroupEvent):
     operator: int
     target: int
+    duration: int
 
 
 @dataclass
-class MemberRecallMessageEvent(GroupEvent):
-    group: int
+class MemberUnMutedEvent(GroupEvent):
     operator: int
-    operator_type: int
     target: int
-
-    msg_rand: int
-    msg_seq: int
-    msg_time: int
diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index 167e2b3a..150cbafb 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -18,8 +18,9 @@
 from cai.utils.jce import RequestPacketVersion3
 from cai.client.message_service import MESSAGE_DECODERS
 from cai.client.packet import UniPacket, IncomingPacket
-from cai.pb.im.oidb.cmd0x857.troop_tips import TemplParam, NotifyMsgBody
+from cai.pb.im.oidb.cmd0x857.troop_tips import TemplParam
 
+from .decoders import ONLINEPUSH_DECODERS
 from .jce import DelMsgInfo, DeviceInfo, SvcRespPushMsg
 from .command import (
     PushMsg,
@@ -271,73 +272,21 @@ async def handle_req_push(
         await client.send(push.seq, "OnlinePush.RespPush", pkg)
 
         for info in push.message.msg_info:
-            key = f"{info.msg_seq}" f"{info.msg_time}" f"{info.msg_uid}"
+            key = f"{info.msg_seq}{info.msg_time}{info.msg_uid}"
             should_skip = key in client._online_push_cache
             client._online_push_cache[key] = None
             if should_skip:
                 continue
 
-            if info.msg_type == 169:
-                # handleC2COnlinePushMsgResp
-                pass
-            elif info.msg_type == 8:
-                # HandleShMsgType0x08
-                pass
-            elif info.msg_type == 132:
-                # HandleShMsgType0x84
-                pass
-            elif info.msg_type == 732:
-                content = info.vec_msg
-                sub_type = content[4]
-                gid = int.from_bytes(content[:4], "big")
-
-                if sub_type in (0x14, 0x11):
-                    notify = NotifyMsgBody.FromString(content[7:])
-                    if sub_type == 0x14:  # nudge
-                        client.dispatch_event(
-                            events.NudgeEvent(
-                                **_parse_poke(
-                                    notify.general_gray_tip.templ_param,
-                                    default=info.from_uin,
-                                ),
-                                group=gid,
-                            )
-                        )
-                    elif sub_type == 0x11:  # recall
-                        msg = notify.recall.recalled_msg_list[0]
-                        client.dispatch_event(
-                            events.MemberRecallMessageEvent(
-                                gid,
-                                notify.recall.uin,
-                                notify.recall.op_type,
-                                msg.author_uin,
-                                msg.msg_random,
-                                msg.seq,
-                                msg.time,
-                            )
-                        )
-                elif sub_type == 0x0C:  # mute event
-                    operator = int.from_bytes(
-                        content[6:10], "big", signed=False
-                    )
-                    target = int.from_bytes(content[16:20], "big", signed=False)
-                    duration = int.from_bytes(
-                        content[20:24], "big", signed=False
-                    )
-                    if duration > 0:  # muted
-                        client.dispatch_event(
-                            events.MemberMutedEvent(
-                                gid, operator, target, duration
-                            )
-                        )
-                    else:
-                        client.dispatch_event(
-                            events.MemberUnMutedEvent(gid, operator, target)
-                        )
-            elif info.msg_type == 528:
-                # TODO: parse friend event
-                pass
-
+            Decoder = ONLINEPUSH_DECODERS.get(info.msg_type, None)
+            if not Decoder:
+                logger.debug(
+                    f"{push.command_name}: "
+                    f"Received unknown onlinepush type {info.msg_type}."
+                )
+                continue
+            for event in Decoder(info):
+                client.dispatch_event(event)
     return push
 
 
diff --git a/cai/client/online_push/decoders.py b/cai/client/online_push/decoders.py
new file mode 100644
index 00000000..75d352ab
--- /dev/null
+++ b/cai/client/online_push/decoders.py
@@ -0,0 +1,194 @@
+import re
+import json
+from typing import Any, Dict, List, Tuple, Callable, Iterator
+
+from cai.log import logger
+from cai.client.events import Event
+from cai.pb.im.oidb.cmd0x857.troop_tips import NotifyMsgBody
+from cai.client.events.group import (
+    GroupRedbagEvent,
+    GroupNameChangedEvent,
+    GroupMessageRecalledEvent,
+    GroupMemberSpecialTitleChangedEvent,
+)
+
+from .jce import MessageInfo
+
+DT = Callable[[MessageInfo], Iterator[Event]]
+
+
+def parse_cmds(content: str) -> Tuple[str, List[Dict[str, Any]]]:
+    cmds: List[Dict[str, Any]] = []
+    texts: List[str] = []
+    text_begin = 0
+    for cmd in re.finditer(r"<([^>]+)>", content):
+        texts.append(content[text_begin : cmd.pos + cmd.start()])
+        text_begin = cmd.pos + cmd.end()
+        cmd_obj = json.loads(cmd.group(1))
+        cmd_obj["start_index"] = cmd.pos + cmd.start()
+        cmd_obj["end_index"] = cmd.pos + cmd.end()
+        cmds.append(cmd_obj)
+        if "text" in cmd_obj:
+            texts.append(cmd_obj["text"])
+    texts.append(content[text_begin:])
+    return "".join(texts), cmds
+
+
+class GroupEventDecoder:
+    __slots__ = ()
+
+    @classmethod
+    def decode(cls, info: MessageInfo) -> Iterator[Event]:
+        """Group Event Decoder.
+
+        Note:
+            Source:
+            com.tencent.imcore.message.OnLinePushMessageProcessor.ProcessOneMsg.a
+        """
+        content = info.vec_msg
+        sub_type = content[4]
+
+        sub_decoders: Dict[int, DT] = {
+            # 6: cls.decode_troop_exit,  # troop exit message
+            # 11: cls.decode_group_visitor_join,  # group visitor join tencent.im.group.cmd0x2dc
+            12: cls.decode_troop_gag,
+            # 13: cls.decode_group_visitor_join,
+            14: cls.decode_troop_gag,
+            # 15: cls.decode_troop,  # troop manager
+            16: cls.decode_troop_tips,
+            17: cls.decode_troop_tips,
+            20: cls.decode_troop_tips,
+            21: cls.decode_troop_tips,
+        }
+        Decoder = sub_decoders.get(sub_type, None)
+        if not Decoder:
+            logger.debug(
+                "OnlinePush.ReqPush: GroupEventDecoder cannot "
+                f"decode event with subtype {sub_type}"
+            )
+            return
+        yield from Decoder(info)
+
+    @classmethod
+    def decode_troop_gag(cls, info: MessageInfo) -> Iterator[Event]:
+        """Troop Gag Manager.
+
+        Sub Type: 12, 14
+        """
+        ...
+
+    @classmethod
+    def decode_troop_tips(cls, info: MessageInfo) -> Iterator[Event]:
+        """Troop Tips Message Manager.
+
+        Sub Type: 16, 17, 20, 21
+
+        Prompt Type:
+            1: red/gray tip
+            2: ignore
+            3: ignore
+            4: ignore
+            5: ignore
+            6: troop feeds
+            7: message recall
+            8: ignore
+            9: notify obj msg update push
+            10: 0x857 werewolf push
+            11: 0x857 game status notify
+            12: apollo msg
+            13: gold msg tips
+            14: ignore
+            15: miniapp notify -> group open sys msg
+            16: ignore
+            17: recv msg set changed
+            18: prompt troop form tips
+            19: msg media push
+            20: general gray tip
+            21: msg video push
+            22: troop location push
+            23: msg sing push
+            24: group info change
+            25: group announce tbc info
+            26: qq video game push
+            27: group digest msg
+            28: ignore
+            29: ignore
+            30: qq live notify
+            31: group digest msg summary
+            32: revert gray tips traceless
+        """
+        content = info.vec_msg
+        if len(content) <= 7:
+            raise StopIteration
+        tip = NotifyMsgBody.FromString(content[7:])
+        prompt_type = tip.enum_type
+        group_id = tip.group_code
+        service_type = tip.service_type
+        if prompt_type == 1:
+            if tip.HasField("redtips"):
+                # FIXME: more detailed events
+                yield GroupRedbagEvent(
+                    group_id=group_id, sender_id=tip.redtips.sender_uin
+                )
+            if tip.HasField("graytips"):
+                content = tip.graytips.content.decode("utf-8")
+                if content:
+                    text, cmds = parse_cmds(content)
+                    if service_type == 6:
+                        yield GroupMemberSpecialTitleChangedEvent(
+                            group_id=group_id,
+                            text=text,
+                            raw_text=content,
+                            cmds=cmds,
+                            user_id=tip.graytips.receiver_uin,
+                        )
+                    elif service_type == 11:
+                        # Unknown
+                        pass
+                    elif service_type == 12:
+                        yield GroupNameChangedEvent(
+                            group_id=group_id,
+                            text=text,
+                            raw_text=content,
+                            cmds=cmds,
+                        )
+                    else:
+                        logger.debug(
+                            f"Unknown service type: {service_type}, content: {content}"
+                        )
+        elif prompt_type == 7:
+            if tip.HasField("recall"):
+                msg_list = tip.recall.recalled_msg_list
+                for msg in msg_list:
+                    yield GroupMessageRecalledEvent(
+                        group_id=group_id,
+                        operator_id=tip.recall.uin,
+                        author_id=msg.author_uin,
+                        msg_seq=msg.seq,
+                        msg_time=msg.time,
+                        msg_type=msg.msg_type,
+                        msg_random=msg.msg_random,
+                        is_anony_msg=bool(msg.is_anony_msg),
+                    )
+        elif prompt_type == 20:
+            if tip.HasField("general_gray_tip"):
+                ...
+        elif prompt_type == 24:
+            if tip.HasField("group_info_change"):
+                ...
+        elif prompt_type == 27:
+            if tip.HasField("qq_group_digest_msg"):
+                ...
+
+
+ONLINEPUSH_DECODERS: Dict[int, DT] = {
+    # 169: handleC2COnlinePushMsgResp,
+    # 8: HandleShMsgType0x08
+    # 132: HandleShMsgType0x84
+    732: GroupEventDecoder.decode
+}
+"""Online Push ReqPush Decoders.
+
+Note:
+    Source: com.tencent.imcore.message.OnLinePushMessageProcessor.ProcessOneMsg.a
+"""
diff --git a/examples/login.py b/examples/login.py
index b2c48d61..b523fa46 100644
--- a/examples/login.py
+++ b/examples/login.py
@@ -8,6 +8,7 @@
 """
 import os
 import sys
+import signal
 import asyncio
 import logging
 import functools
@@ -29,30 +30,13 @@
 )
 
 
-async def run(closed: asyncio.Event):
-    account = os.getenv("ACCOUNT", "")
-    password = os.getenv("PASSWORD")
+async def run(ci: Client):
     try:
-        assert password and account, ValueError("account or password not set")
-
-        account = int(account)
-        ci = Client(make_client(account, password))
-
-        try:
-            await ci.login()
-            print(f"Login Success! Client status: {ci.client.status!r}")
-        except Exception as e:
-            await handle_failure(ci, e)
-        ci.client.add_event_listener(functools.partial(listen_message, ci))
-        while True:
-            for status in OnlineStatus:
-                if status == OnlineStatus.Offline:
-                    continue
-                print(status, "Changed")
-                # await ci.set_status(status, 67, True)
-                await asyncio.sleep(360)
-    finally:
-        closed.set()
+        await ci.login()
+        print(f"Login Success! Client status: {ci.client.status!r}")
+    except Exception as e:
+        await handle_failure(ci, e)
+    ci.client.add_event_listener(functools.partial(listen_message, ci))
 
 
 async def listen_message(client: Client, _, event: Event):
@@ -169,14 +153,20 @@ async def handle_failure(client: Client, exception: Exception):
         format="%(asctime)s %(name)s[%(levelname)s]: %(message)s",
     )
 
+    account = os.getenv("ACCOUNT", "")
+    password = os.getenv("PASSWORD")
+    assert password and account, ValueError("account or password not set")
+    account = int(account)
+    ci = Client(make_client(account, password))
+
     close = asyncio.Event()
 
     async def wait_cleanup():
         await close.wait()
+        await ci.client.close()
 
     loop = asyncio.get_event_loop()
-    loop.create_task(run(close))
-    try:
-        loop.run_until_complete(wait_cleanup())
-    except KeyboardInterrupt:
-        close.set()
+    loop.add_signal_handler(signal.SIGINT, close.set)
+    loop.add_signal_handler(signal.SIGTERM, close.set)
+    loop.create_task(run(ci))
+    loop.run_until_complete(wait_cleanup())

From a99179e26df7a38eac95bc5dd8ccda3edb7c89cd Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Mon, 11 Apr 2022 12:18:37 +0800
Subject: [PATCH 091/113] :sparkles: parse nudge event

---
 cai/client/events/group.py         | 30 ++++++++++++++++++++++++++++++
 cai/client/online_push/decoders.py | 18 ++++++++++++++++--
 2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/cai/client/events/group.py b/cai/client/events/group.py
index 93675b7d..013ea571 100644
--- a/cai/client/events/group.py
+++ b/cai/client/events/group.py
@@ -20,6 +20,13 @@ class _GroupGrayTipEvent(GroupEvent):
     cmds: List[Dict[str, Any]]
 
 
+@dataclass
+class _GroupGeneralGrayTipEvent(GroupEvent):
+    template_id: int
+    template_text: str
+    template_params: Dict[str, str]
+
+
 # FIXME: unhandle details
 @dataclass
 class GroupRedbagEvent(GroupEvent):
@@ -47,6 +54,29 @@ class GroupMessageRecalledEvent(GroupEvent):
     is_anony_msg: bool
 
 
+@dataclass
+class GroupNudgeEvent(_GroupGeneralGrayTipEvent):
+    @property
+    def sender_id(self) -> int:
+        return int(self.template_params["uin_str1"])
+
+    @property
+    def receiver_id(self) -> int:
+        return int(self.template_params["uin_str2"])
+
+    @property
+    def action_text(self) -> str:
+        return self.template_params["action_str"]
+
+    @property
+    def action_img(self) -> str:
+        return self.template_params["action_img_url"]
+
+    @property
+    def suffix_text(self) -> str:
+        return self.template_params["suffix_str"]
+
+
 @dataclass
 class MemberMutedEvent(GroupEvent):
     operator: int
diff --git a/cai/client/online_push/decoders.py b/cai/client/online_push/decoders.py
index 75d352ab..eefbfbcb 100644
--- a/cai/client/online_push/decoders.py
+++ b/cai/client/online_push/decoders.py
@@ -6,6 +6,7 @@
 from cai.client.events import Event
 from cai.pb.im.oidb.cmd0x857.troop_tips import NotifyMsgBody
 from cai.client.events.group import (
+    GroupNudgeEvent,
     GroupRedbagEvent,
     GroupNameChangedEvent,
     GroupMessageRecalledEvent,
@@ -119,7 +120,7 @@ def decode_troop_tips(cls, info: MessageInfo) -> Iterator[Event]:
         """
         content = info.vec_msg
         if len(content) <= 7:
-            raise StopIteration
+            return
         tip = NotifyMsgBody.FromString(content[7:])
         prompt_type = tip.enum_type
         group_id = tip.group_code
@@ -172,7 +173,20 @@ def decode_troop_tips(cls, info: MessageInfo) -> Iterator[Event]:
                     )
         elif prompt_type == 20:
             if tip.HasField("general_gray_tip"):
-                ...
+                graytip = tip.general_gray_tip
+                busi_type = graytip.busi_type
+                busi_id = graytip.busi_id
+                if busi_type == 12 and busi_id == 1061:
+                    # com.tencent.mobileqq.activity.aio.avatardoubletap.PaiYiPaiMsgUtil
+                    yield GroupNudgeEvent(
+                        group_id=group_id,
+                        template_id=graytip.templ_id,
+                        template_text=graytip.content.decode("utf-8"),
+                        template_params=dict(
+                            (p.name.decode("utf-8"), p.value.decode("utf-8"))
+                            for p in graytip.templ_param
+                        ),
+                    )
         elif prompt_type == 24:
             if tip.HasField("group_info_change"):
                 ...

From 3369b13855db8706d842d86eacd87e4e30188011 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Mon, 11 Apr 2022 14:33:23 +0800
Subject: [PATCH 092/113] :sparkles: add group lucky character events

---
 cai/client/events/group.py         | 67 ++++++++++++++++++++++++++----
 cai/client/online_push/decoders.py | 61 +++++++++++++++++++++++++++
 2 files changed, 121 insertions(+), 7 deletions(-)

diff --git a/cai/client/events/group.py b/cai/client/events/group.py
index 013ea571..2a55fa07 100644
--- a/cai/client/events/group.py
+++ b/cai/client/events/group.py
@@ -13,6 +13,7 @@ def type(self) -> str:
         return self.__class__.__name__
 
 
+# online push graytip
 @dataclass
 class _GroupGrayTipEvent(GroupEvent):
     text: str
@@ -20,13 +21,6 @@ class _GroupGrayTipEvent(GroupEvent):
     cmds: List[Dict[str, Any]]
 
 
-@dataclass
-class _GroupGeneralGrayTipEvent(GroupEvent):
-    template_id: int
-    template_text: str
-    template_params: Dict[str, str]
-
-
 # FIXME: unhandle details
 @dataclass
 class GroupRedbagEvent(GroupEvent):
@@ -43,6 +37,7 @@ class GroupNameChangedEvent(_GroupGrayTipEvent):
     ...
 
 
+# online push msg recall
 @dataclass
 class GroupMessageRecalledEvent(GroupEvent):
     operator_id: int
@@ -54,6 +49,14 @@ class GroupMessageRecalledEvent(GroupEvent):
     is_anony_msg: bool
 
 
+# online push general graytip
+@dataclass
+class _GroupGeneralGrayTipEvent(GroupEvent):
+    template_id: int
+    template_text: str
+    template_params: Dict[str, str]
+
+
 @dataclass
 class GroupNudgeEvent(_GroupGeneralGrayTipEvent):
     @property
@@ -77,6 +80,56 @@ def suffix_text(self) -> str:
         return self.template_params["suffix_str"]
 
 
+@dataclass
+class GroupLuckyCharacterEvent(_GroupGeneralGrayTipEvent):
+    @property
+    def user_id(self) -> int:
+        return int(self.template_params["uin"])
+
+    @property
+    def detail_url(self) -> str:
+        return self.template_params["detail_url"]
+
+
+@dataclass
+class GroupLuckyCharacterInitEvent(GroupLuckyCharacterEvent):  # 抽中并开启
+    @property
+    def lucky_character_url(self) -> str:
+        return self.template_params["img_url"]
+
+
+@dataclass
+class GroupLuckyCharacterNewEvent(GroupLuckyCharacterEvent):  # 抽中
+    @property
+    def lucky_character_url(self) -> str:
+        return self.template_params["img_url"]
+
+
+@dataclass
+class GroupLuckyCharacterChangedEvent(GroupLuckyCharacterEvent):  # 更换
+    @property
+    def previous_character_url(self) -> str:
+        return self.template_params["img_url_1"]
+
+    @property
+    def new_character_url(self) -> str:
+        return self.template_params["img_url_2"]
+
+
+@dataclass
+class GroupLuckyCharacterClosedEvent(GroupLuckyCharacterEvent):  # 关闭
+    @property
+    def lucky_character_url(self) -> str:
+        return self.template_params["img_url"]
+
+
+@dataclass
+class GroupLuckyCharacterOpenedEvent(GroupLuckyCharacterEvent):  # 开启
+    @property
+    def lucky_character_url(self) -> str:
+        return self.template_params["img_url"]
+
+
 @dataclass
 class MemberMutedEvent(GroupEvent):
     operator: int
diff --git a/cai/client/online_push/decoders.py b/cai/client/online_push/decoders.py
index eefbfbcb..a77ba88e 100644
--- a/cai/client/online_push/decoders.py
+++ b/cai/client/online_push/decoders.py
@@ -10,6 +10,11 @@
     GroupRedbagEvent,
     GroupNameChangedEvent,
     GroupMessageRecalledEvent,
+    GroupLuckyCharacterNewEvent,
+    GroupLuckyCharacterInitEvent,
+    GroupLuckyCharacterClosedEvent,
+    GroupLuckyCharacterOpenedEvent,
+    GroupLuckyCharacterChangedEvent,
     GroupMemberSpecialTitleChangedEvent,
 )
 
@@ -187,12 +192,68 @@ def decode_troop_tips(cls, info: MessageInfo) -> Iterator[Event]:
                             for p in graytip.templ_param
                         ),
                     )
+                # elif busi_type == 12 and busi_id == 1062:
+                #    # 动作,效果
+                elif busi_id == 1069:  # busi_type == 1
+                    yield GroupLuckyCharacterInitEvent(
+                        group_id=group_id,
+                        template_id=graytip.templ_id,
+                        template_text=graytip.content.decode("utf-8"),
+                        template_params=dict(
+                            (p.name.decode("utf-8"), p.value.decode("utf-8"))
+                            for p in graytip.templ_param
+                        ),
+                    )
+                elif busi_id == 1070:
+                    yield GroupLuckyCharacterNewEvent(
+                        group_id=group_id,
+                        template_id=graytip.templ_id,
+                        template_text=graytip.content.decode("utf-8"),
+                        template_params=dict(
+                            (p.name.decode("utf-8"), p.value.decode("utf-8"))
+                            for p in graytip.templ_param
+                        ),
+                    )
+                elif busi_id == 1071:
+                    yield GroupLuckyCharacterChangedEvent(
+                        group_id=group_id,
+                        template_id=graytip.templ_id,
+                        template_text=graytip.content.decode("utf-8"),
+                        template_params=dict(
+                            (p.name.decode("utf-8"), p.value.decode("utf-8"))
+                            for p in graytip.templ_param
+                        ),
+                    )
+                elif busi_id == 1072:
+                    yield GroupLuckyCharacterClosedEvent(
+                        group_id=group_id,
+                        template_id=graytip.templ_id,
+                        template_text=graytip.content.decode("utf-8"),
+                        template_params=dict(
+                            (p.name.decode("utf-8"), p.value.decode("utf-8"))
+                            for p in graytip.templ_param
+                        ),
+                    )
+                elif busi_id == 1073:
+                    yield GroupLuckyCharacterOpenedEvent(
+                        group_id=group_id,
+                        template_id=graytip.templ_id,
+                        template_text=graytip.content.decode("utf-8"),
+                        template_params=dict(
+                            (p.name.decode("utf-8"), p.value.decode("utf-8"))
+                            for p in graytip.templ_param
+                        ),
+                    )
+                # TODO: busi_id 1052, 1053, 1054, 1067 group honor
         elif prompt_type == 24:
             if tip.HasField("group_info_change"):
                 ...
         elif prompt_type == 27:
             if tip.HasField("qq_group_digest_msg"):
                 ...
+        elif prompt_type == 32:
+            if tip.HasField("revert_graytips_traceless"):
+                ...
 
 
 ONLINEPUSH_DECODERS: Dict[int, DT] = {

From 1b8005902ac4b0c89a50e3dafe59f46ebd7c9bac Mon Sep 17 00:00:00 2001
From: local <a@b.c>
Date: Mon, 11 Apr 2022 16:18:18 +0800
Subject: [PATCH 093/113] fix: receiver bug

---
 cai/client/client.py       | 12 ++++++++----
 cai/connection/__init__.py |  1 -
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/cai/client/client.py b/cai/client/client.py
index 470837dc..79aee216 100644
--- a/cai/client/client.py
+++ b/cai/client/client.py
@@ -352,6 +352,7 @@ def _recv_done_cb(self, task: asyncio.Task):
         else:
             log.network.warning("receiver stopped")
             asyncio.create_task(self.close())
+        task.cancel()
 
     async def disconnect(self) -> None:
         """Disconnect if already connected to the server."""
@@ -516,7 +517,13 @@ async def receive(self):
                     - 4
                 )
                 # FIXME: length < 0 ?
+
                 data = await self.connection.read_bytes(length)
+            except ConnectionError as e:
+                log.logger.error(f"{self.uin} connection lost: {str(e)}")
+                break
+
+            try:
                 packet = IncomingPacket.parse(
                     data,
                     self._key,
@@ -528,11 +535,8 @@ async def receive(self):
                 )
                 # do not block receive
                 asyncio.create_task(self._handle_incoming_packet(packet))
-            except ConnectionAbortedError as e:
-                log.logger.error(f"{self.uin} connection lost: {str(e)}")
-                break
             except Exception as e:
-                log.logger.exception(e)
+                log.logger.exception("Unexpected error raised")
 
     @property
     def listeners(self) -> Set[LT]:
diff --git a/cai/connection/__init__.py b/cai/connection/__init__.py
index 750a9499..5d35def1 100644
--- a/cai/connection/__init__.py
+++ b/cai/connection/__init__.py
@@ -97,7 +97,6 @@ async def _connect(self):
     async def close(self):
         if self._writer:
             self._writer.close()
-            await self._writer.wait_closed()
         self._writer = None
         self._reader = None
         self._closed.set()

From 69c097ff99cc0f63ea024919449a4362be551f6e Mon Sep 17 00:00:00 2001
From: wyapx <a1025952421@outlook.com>
Date: Tue, 12 Apr 2022 12:11:54 +0800
Subject: [PATCH 094/113] add: CustomDataElement

---
 cai/client/message_service/decoders.py |  7 +++++++
 cai/client/message_service/encoders.py |  7 +++++++
 cai/client/message_service/models.py   | 10 ++++++++++
 3 files changed, 24 insertions(+)

diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index f17b2f50..3b1ed163 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -36,6 +36,7 @@
     VoiceElement,
     PrivateMessage,
     RichMsgElement,
+    CustomDataElement,
     FlashImageElement,
     SmallEmojiElement,
 )
@@ -215,6 +216,12 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
                         + "/0",
                     )
                 )
+        elif elem.HasField("open_qq_data"):
+            res.append(
+                CustomDataElement(
+                    data=elem.open_qq_data.car_qq_data
+                )
+            )
         elif elem.HasField("common_elem"):
             service_type = elem.common_elem.service_type
             # PokeMsgElemDecoder
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index 98b454cd..aba6b6fa 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -19,6 +19,7 @@
     CustomFace,
     ShakeWindow,
     LightAppElem,
+    OpenQQData
 )
 
 from . import models
@@ -131,6 +132,12 @@ def build_msg(elements: Sequence[models.Element]) -> MsgBody:
         elif isinstance(e, models.VoiceElement):
             ptt = e.to_ptt()
             break
+        elif isinstance(e, models.CustomDataElement):
+            ret.append(
+                Elem(
+                    open_qq_data=OpenQQData(car_qq_data=e.data)
+                )
+            )
         else:
             raise NotImplementedError(e)
 
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 821bd3f6..19eba9bf 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -232,3 +232,13 @@ class ShakeElement(Element):
     @property
     def type(self) -> str:
         return "shake"
+
+
+@dataclass
+class CustomDataElement(Element):
+    data: bytes
+
+    @property
+    def type(self) -> str:
+        return "custom_daata"
+

From 454f2744719c5b26e660cb0660bbed1948dd7fa9 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Tue, 12 Apr 2022 13:42:38 +0800
Subject: [PATCH 095/113] :construction: process event type default

---
 cai/client/events/base.py          |  8 ++++----
 cai/client/events/group.py         |  4 ----
 cai/client/online_push/__init__.py | 17 -----------------
 3 files changed, 4 insertions(+), 25 deletions(-)

diff --git a/cai/client/events/base.py b/cai/client/events/base.py
index 953d5927..5a3b1c92 100644
--- a/cai/client/events/base.py
+++ b/cai/client/events/base.py
@@ -9,11 +9,11 @@
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
 
-import abc
+from dataclasses import dataclass
 
 
-class Event(abc.ABC):
+@dataclass
+class Event:
     @property
-    @abc.abstractmethod
     def type(self) -> str:
-        raise NotImplementedError
+        return self.__class__.__name__
diff --git a/cai/client/events/group.py b/cai/client/events/group.py
index 2a55fa07..2b5011e6 100644
--- a/cai/client/events/group.py
+++ b/cai/client/events/group.py
@@ -8,10 +8,6 @@
 class GroupEvent(Event):
     group_id: int
 
-    @property
-    def type(self) -> str:
-        return self.__class__.__name__
-
 
 # online push graytip
 @dataclass
diff --git a/cai/client/online_push/__init__.py b/cai/client/online_push/__init__.py
index 150cbafb..dd53ab41 100644
--- a/cai/client/online_push/__init__.py
+++ b/cai/client/online_push/__init__.py
@@ -218,23 +218,6 @@ async def handle_push_msg(
     return push
 
 
-def _parse_poke(params: Sequence[TemplParam], default: int) -> dict:
-    res = {"target": None, "sender": None, "action": None, "suffix": None}
-    for p in params:
-        name, value = p.name.decode(), p.value.decode()
-        if name == "uin_str1":
-            res["sender"] = int(value)
-        elif name == "uin_str2":
-            res["target"] = int(value)
-        elif name == "suffix_str":
-            res["suffix"] = value
-        elif name == "action_str":
-            res["action"] = value
-    if not res["target"]:
-        res["target"] = default
-    return res
-
-
 # OnlinePush.ReqPush
 async def handle_req_push(
     client: "Client", packet: IncomingPacket

From c7313716437772f3c46ce921c0abe62cd296c37f Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Tue, 12 Apr 2022 13:46:44 +0800
Subject: [PATCH 096/113] :memo: update readme

---
 README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 19c23b5f..7f152217 100644
--- a/README.md
+++ b/README.md
@@ -16,8 +16,8 @@ _✨ Yet Another Bot Framework for Tencent QQ Written in Python ✨_
   <a target="_blank" href="https://github.com/sindresorhus/awesome">
     <img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg">
   </a>
-  <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=5NsG-WIp3hqzM3ihjY87JEvsNCRdUW2x&jump_from=webapi">
-    <img src="https://img.shields.io/badge/qq%E7%BE%A4-768887710-success" alt="QQ Chat">
+  <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=1SsvybRcQrgt6Kd5fV9W2Kpfje0l3VFw&jump_from=webapi">
+    <img src="https://img.shields.io/badge/qq%E7%BE%A4-552362998-success" alt="QQ Chat">
   </a>
 </p>
 

From 60f7f84682d729fe8aa35860889d0a30151cc921 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Tue, 12 Apr 2022 14:41:08 +0800
Subject: [PATCH 097/113] :sparkles: add group member mute event

---
 cai/client/events/__init__.py      |  8 +++----
 cai/client/events/group.py         | 12 +++++-----
 cai/client/online_push/decoders.py | 36 +++++++++++++++++++++++++++++-
 3 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/cai/client/events/__init__.py b/cai/client/events/__init__.py
index d7859013..bf311aa3 100644
--- a/cai/client/events/__init__.py
+++ b/cai/client/events/__init__.py
@@ -2,9 +2,9 @@
 from .group import GroupEvent as GroupEvent
 from .common import NudgeEvent as NudgeEvent
 from .group import GroupRedbagEvent as GroupRedbagEvent
-from .group import MemberMutedEvent as MemberMutedEvent
-from .group import MemberUnMutedEvent as MemberUnMutedEvent
+from .group import GroupMemberMutedEvent as GroupMemberMutedEvent
 from .group import GroupNameChangedEvent as GroupNameChangedEvent
+from .group import GroupMemberUnMutedEvent as GroupMemberUnMutedEvent
 from .group import GroupMessageRecalledEvent as GroupMessageRecalledEvent
 from .group import (
     GroupMemberSpecialTitleChangedEvent as GroupMemberSpecialTitleChangedEvent,
@@ -14,8 +14,8 @@
     "Event",
     "GroupEvent",
     "NudgeEvent",
-    "MemberMutedEvent",
-    "MemberUnMutedEvent",
+    "GroupMemberMutedEvent",
+    "GroupMemberUnMutedEvent",
     "GroupMemberSpecialTitleChangedEvent",
     "GroupNameChangedEvent",
     "GroupMessageRecalledEvent",
diff --git a/cai/client/events/group.py b/cai/client/events/group.py
index 2b5011e6..fcf2a4e5 100644
--- a/cai/client/events/group.py
+++ b/cai/client/events/group.py
@@ -127,13 +127,13 @@ def lucky_character_url(self) -> str:
 
 
 @dataclass
-class MemberMutedEvent(GroupEvent):
-    operator: int
-    target: int
+class GroupMemberMutedEvent(GroupEvent):
+    operator_id: int
+    target_id: int
     duration: int
 
 
 @dataclass
-class MemberUnMutedEvent(GroupEvent):
-    operator: int
-    target: int
+class GroupMemberUnMutedEvent(GroupEvent):
+    operator_id: int
+    target_id: int
diff --git a/cai/client/online_push/decoders.py b/cai/client/online_push/decoders.py
index a77ba88e..560858d9 100644
--- a/cai/client/online_push/decoders.py
+++ b/cai/client/online_push/decoders.py
@@ -4,11 +4,14 @@
 
 from cai.log import logger
 from cai.client.events import Event
+from cai.utils.binary import Packet
 from cai.pb.im.oidb.cmd0x857.troop_tips import NotifyMsgBody
 from cai.client.events.group import (
     GroupNudgeEvent,
     GroupRedbagEvent,
+    GroupMemberMutedEvent,
     GroupNameChangedEvent,
+    GroupMemberUnMutedEvent,
     GroupMessageRecalledEvent,
     GroupLuckyCharacterNewEvent,
     GroupLuckyCharacterInitEvent,
@@ -80,8 +83,36 @@ def decode_troop_gag(cls, info: MessageInfo) -> Iterator[Event]:
         """Troop Gag Manager.
 
         Sub Type: 12, 14
+
+        Note:
+            Source: com.tencent.mobileqq.troop.utils.TroopGagMgr.a
         """
-        ...
+        data = Packet(info.vec_msg)
+        group_id, sub_type = data.start().uint32().uint8().execute()
+        if sub_type == 12:
+            operator_id = data.start().offset(6).uint32().execute()[0]
+
+            offset = 16
+            count = info.vec_msg[14]
+            for _ in range(count):
+                target_id, duration = (
+                    data.start().offset(offset).uint32().uint32().execute()
+                )
+                offset += 8
+                if duration > 0:
+                    yield GroupMemberMutedEvent(
+                        group_id=group_id,
+                        operator_id=operator_id,
+                        target_id=target_id,
+                        duration=duration,
+                    )
+                else:
+                    yield GroupMemberUnMutedEvent(
+                        group_id=group_id,
+                        operator_id=operator_id,
+                        target_id=target_id,
+                    )
+        # elif sub_type == 14:
 
     @classmethod
     def decode_troop_tips(cls, info: MessageInfo) -> Iterator[Event]:
@@ -122,6 +153,9 @@ def decode_troop_tips(cls, info: MessageInfo) -> Iterator[Event]:
             30: qq live notify
             31: group digest msg summary
             32: revert gray tips traceless
+
+        Note:
+            Source: com.tencent.mobileqq.troop.utils.TroopTipsMsgMgr.a
         """
         content = info.vec_msg
         if len(content) <= 7:

From 0799e2abe79681954a14620637e59b9327bc8d37 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Tue, 12 Apr 2022 17:11:48 +0800
Subject: [PATCH 098/113] :construction: move comments

---
 cai/client/message_service/decoders.py | 38 ++++++++++++++++++--------
 cai/client/online_push/decoders.py     | 13 +++++----
 2 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index 3b1ed163..950281d9 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -13,8 +13,8 @@
 from typing import Dict, List, Callable, Optional, Sequence
 
 from cai.log import logger
+from cai.client.events import Event
 from cai.pb.msf.msg.comm import Msg
-from cai.client.events.base import Event
 from cai.pb.im.msg.msg_body import Ptt, Elem
 from cai.pb.im.msg.service.comm_elem import (
     MsgElemInfo_servtype2,
@@ -217,11 +217,7 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
                     )
                 )
         elif elem.HasField("open_qq_data"):
-            res.append(
-                CustomDataElement(
-                    data=elem.open_qq_data.car_qq_data
-                )
-            )
+            res.append(CustomDataElement(data=elem.open_qq_data.car_qq_data))
         elif elem.HasField("common_elem"):
             service_type = elem.common_elem.service_type
             # PokeMsgElemDecoder
@@ -275,14 +271,15 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
 
 
 class BuddyMessageDecoder:
+    """Buddy Message Decoder.
+
+    Note:
+        Source:
+        com.tencent.mobileqq.service.message.codec.decoder.buddyMessage.BuddyMessageDecoder
+    """
+
     @classmethod
     def decode(cls, message: Msg) -> Optional[Event]:
-        """Buddy Message Decoder.
-
-        Note:
-            Source:
-            com.tencent.mobileqq.service.message.codec.decoder.buddyMessage.BuddyMessageDecoder
-        """
         sub_decoders: Dict[int, Callable[[Msg], Optional[Event]]] = {
             11: cls.decode_normal_buddy,
             # 129: OnlineFileDecoder,
@@ -344,10 +341,27 @@ def decode_normal_buddy(cls, message: Msg) -> Optional[Event]:
 
 
 class TroopMessageDecoder:
+    """Troop Message Decoder(Processor).
+
+    Note:
+        Source: com.tencent.mobileqq.troop.data.TroopMessageProcessor
+    """
+
+    __slots__ = ()
+
     long_msg_fragment_store: Dict[int, List[Msg]] = {}
 
     @classmethod
     def decode(cls, message: Msg) -> Optional[Event]:
+        """Troop Message Processor.
+
+        Note:
+            Source:
+
+            com.tencent.mobileqq.troop.data.TroopMessageProcessor.a
+
+            com.tencent.imcore.message.BaseMessageProcessorForTroopAndDisc.a
+        """
         if not message.head.HasField("group_info"):
             return
 
diff --git a/cai/client/online_push/decoders.py b/cai/client/online_push/decoders.py
index 560858d9..46501fb4 100644
--- a/cai/client/online_push/decoders.py
+++ b/cai/client/online_push/decoders.py
@@ -44,16 +44,17 @@ def parse_cmds(content: str) -> Tuple[str, List[Dict[str, Any]]]:
 
 
 class GroupEventDecoder:
+    """Group Event Decoder.
+
+    Note:
+        Source:
+        com.tencent.imcore.message.OnLinePushMessageProcessor.ProcessOneMsg.a
+    """
+
     __slots__ = ()
 
     @classmethod
     def decode(cls, info: MessageInfo) -> Iterator[Event]:
-        """Group Event Decoder.
-
-        Note:
-            Source:
-            com.tencent.imcore.message.OnLinePushMessageProcessor.ProcessOneMsg.a
-        """
         content = info.vec_msg
         sub_type = content[4]
 

From 0999df1ecca4dcdbf258bbdc5b445a6b626d0c15 Mon Sep 17 00:00:00 2001
From: pad <a1025952421@outlook.com>
Date: Wed, 13 Apr 2022 18:01:15 +0800
Subject: [PATCH 099/113] add: part of oidb packet

---
 cai/client/oidb/builder.py  | 55 +++++++++++++++++++++++++++++++
 cai/client/packet.py        |  1 +
 cai/pb/im/oidb/__init__.py  |  2 ++
 cai/pb/im/oidb/oidb.proto   | 19 +++++++++++
 cai/pb/im/oidb/oidb_pb2.py  | 44 +++++++++++++++++++++++++
 cai/pb/im/oidb/oidb_pb2.pyi | 65 +++++++++++++++++++++++++++++++++++++
 6 files changed, 186 insertions(+)
 create mode 100644 cai/client/oidb/builder.py
 create mode 100644 cai/pb/im/oidb/oidb.proto
 create mode 100644 cai/pb/im/oidb/oidb_pb2.py
 create mode 100644 cai/pb/im/oidb/oidb_pb2.pyi

diff --git a/cai/client/oidb/builder.py b/cai/client/oidb/builder.py
new file mode 100644
index 00000000..70334064
--- /dev/null
+++ b/cai/client/oidb/builder.py
@@ -0,0 +1,55 @@
+import struct
+from cai.pb.im.oidb import OidbSsoPacket, DED3ReqBody
+
+
+def build_oidb_sso_packet(cmd: int, service_type: int, body: bytes) -> bytes:
+    return OidbSsoPacket(
+        command=cmd,
+        service_type=service_type,
+        body=body
+    ).SerializeToString()
+
+
+# SendNudge, Oidb.0xed3
+def build_send_nudge_pkg(target_uin: int, group: int = None, from_uin: int = None) -> bytes:
+    if not (group or from_uin):
+        raise ValueError("no sender")
+    return build_oidb_sso_packet(
+        3795, 1,
+        DED3ReqBody(
+            to_uin=target_uin,
+            group_code=group,
+            from_uin=from_uin
+        ).SerializeToString()
+    )
+
+
+# SetAdmin, Oidb.0x55c_1
+def build_set_admin_pkg(target_uin: int, group: int, is_admin: bool) -> bytes:
+    return build_oidb_sso_packet(
+        1372, 1,
+        struct.pack(
+            "!II?",
+            group,
+            target_uin,
+            is_admin
+        )
+    )
+
+
+# MuteMember, Oidb.0x570_8
+def build_mute_member_pkg(target_uin: int, group: int, duration: int) -> bytes:
+    if duration < 0:
+        return ValueError("duration must be a positive value")
+    return build_oidb_sso_packet(
+        1392, 8,
+        struct.pack(
+            "!IQQQQHII",
+            group,
+            0, 0, 0, 0,  # 32 bytes padding
+            1,
+            target_uin,
+            duration
+        )
+    )
+
diff --git a/cai/client/packet.py b/cai/client/packet.py
index 26e8845f..f78d1f47 100644
--- a/cai/client/packet.py
+++ b/cai/client/packet.py
@@ -348,3 +348,4 @@ def parse_oicq_body(
             raise NotImplementedError
         else:
             raise ValueError(f"Unknown encrypt type: {encrypt_type}")
+
diff --git a/cai/pb/im/oidb/__init__.py b/cai/pb/im/oidb/__init__.py
index 562fb8b7..3d5876ea 100644
--- a/cai/pb/im/oidb/__init__.py
+++ b/cai/pb/im/oidb/__init__.py
@@ -14,3 +14,5 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
+
+from .oidb_pb2 import *
diff --git a/cai/pb/im/oidb/oidb.proto b/cai/pb/im/oidb/oidb.proto
new file mode 100644
index 00000000..95a32997
--- /dev/null
+++ b/cai/pb/im/oidb/oidb.proto
@@ -0,0 +1,19 @@
+syntax = "proto3";
+
+
+message OidbSsoPacket {
+  int32 command = 1;
+  int32 service_type = 2;
+  optional int32 result = 3;
+  bytes body = 4;
+  optional string error_msg = 5;
+  string client_version = 6;
+}
+
+message DED3ReqBody {
+  int64 to_uin = 1;
+  int64 group_code = 2;
+  int32 msg_seq = 3;
+  int32 msg_rand = 4;
+  int64 from_uin = 5;
+}
diff --git a/cai/pb/im/oidb/oidb_pb2.py b/cai/pb/im/oidb/oidb_pb2.py
new file mode 100644
index 00000000..2a83b31d
--- /dev/null
+++ b/cai/pb/im/oidb/oidb_pb2.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: oidb.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\noidb.proto\"\xa2\x01\n\rOidbSsoPacket\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\x05\x12\x14\n\x0cservice_type\x18\x02 \x01(\x05\x12\x13\n\x06result\x18\x03 \x01(\x05H\x00\x88\x01\x01\x12\x0c\n\x04\x62ody\x18\x04 \x01(\x0c\x12\x16\n\terror_msg\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x16\n\x0e\x63lient_version\x18\x06 \x01(\tB\t\n\x07_resultB\x0c\n\n_error_msg\"f\n\x0b\x44\x45\x44\x33ReqBody\x12\x0e\n\x06to_uin\x18\x01 \x01(\x03\x12\x12\n\ngroup_code\x18\x02 \x01(\x03\x12\x0f\n\x07msg_seq\x18\x03 \x01(\x05\x12\x10\n\x08msg_rand\x18\x04 \x01(\x05\x12\x10\n\x08\x66rom_uin\x18\x05 \x01(\x03\x62\x06proto3')
+
+
+
+_OIDBSSOPACKET = DESCRIPTOR.message_types_by_name['OidbSsoPacket']
+_DED3REQBODY = DESCRIPTOR.message_types_by_name['DED3ReqBody']
+OidbSsoPacket = _reflection.GeneratedProtocolMessageType('OidbSsoPacket', (_message.Message,), {
+  'DESCRIPTOR' : _OIDBSSOPACKET,
+  '__module__' : 'oidb_pb2'
+  # @@protoc_insertion_point(class_scope:OidbSsoPacket)
+  })
+_sym_db.RegisterMessage(OidbSsoPacket)
+
+DED3ReqBody = _reflection.GeneratedProtocolMessageType('DED3ReqBody', (_message.Message,), {
+  'DESCRIPTOR' : _DED3REQBODY,
+  '__module__' : 'oidb_pb2'
+  # @@protoc_insertion_point(class_scope:DED3ReqBody)
+  })
+_sym_db.RegisterMessage(DED3ReqBody)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _OIDBSSOPACKET._serialized_start=15
+  _OIDBSSOPACKET._serialized_end=177
+  _DED3REQBODY._serialized_start=179
+  _DED3REQBODY._serialized_end=281
+# @@protoc_insertion_point(module_scope)
diff --git a/cai/pb/im/oidb/oidb_pb2.pyi b/cai/pb/im/oidb/oidb_pb2.pyi
new file mode 100644
index 00000000..a56fe0a0
--- /dev/null
+++ b/cai/pb/im/oidb/oidb_pb2.pyi
@@ -0,0 +1,65 @@
+"""
+@generated by mypy-protobuf.  Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import typing
+import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class OidbSsoPacket(google.protobuf.message.Message):
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    COMMAND_FIELD_NUMBER: builtins.int
+    SERVICE_TYPE_FIELD_NUMBER: builtins.int
+    RESULT_FIELD_NUMBER: builtins.int
+    BODY_FIELD_NUMBER: builtins.int
+    ERROR_MSG_FIELD_NUMBER: builtins.int
+    CLIENT_VERSION_FIELD_NUMBER: builtins.int
+    command: builtins.int
+    service_type: builtins.int
+    result: builtins.int
+    body: builtins.bytes
+    error_msg: typing.Text
+    client_version: typing.Text
+    def __init__(self,
+        *,
+        command: builtins.int = ...,
+        service_type: builtins.int = ...,
+        result: typing.Optional[builtins.int] = ...,
+        body: builtins.bytes = ...,
+        error_msg: typing.Optional[typing.Text] = ...,
+        client_version: typing.Text = ...,
+        ) -> None: ...
+    def HasField(self, field_name: typing_extensions.Literal["_error_msg",b"_error_msg","_result",b"_result","error_msg",b"error_msg","result",b"result"]) -> builtins.bool: ...
+    def ClearField(self, field_name: typing_extensions.Literal["_error_msg",b"_error_msg","_result",b"_result","body",b"body","client_version",b"client_version","command",b"command","error_msg",b"error_msg","result",b"result","service_type",b"service_type"]) -> None: ...
+    @typing.overload
+    def WhichOneof(self, oneof_group: typing_extensions.Literal["_error_msg",b"_error_msg"]) -> typing.Optional[typing_extensions.Literal["error_msg"]]: ...
+    @typing.overload
+    def WhichOneof(self, oneof_group: typing_extensions.Literal["_result",b"_result"]) -> typing.Optional[typing_extensions.Literal["result"]]: ...
+global___OidbSsoPacket = OidbSsoPacket
+
+class DED3ReqBody(google.protobuf.message.Message):
+    DESCRIPTOR: google.protobuf.descriptor.Descriptor
+    TO_UIN_FIELD_NUMBER: builtins.int
+    GROUP_CODE_FIELD_NUMBER: builtins.int
+    MSG_SEQ_FIELD_NUMBER: builtins.int
+    MSG_RAND_FIELD_NUMBER: builtins.int
+    FROM_UIN_FIELD_NUMBER: builtins.int
+    to_uin: builtins.int
+    group_code: builtins.int
+    msg_seq: builtins.int
+    msg_rand: builtins.int
+    from_uin: builtins.int
+    def __init__(self,
+        *,
+        to_uin: builtins.int = ...,
+        group_code: builtins.int = ...,
+        msg_seq: builtins.int = ...,
+        msg_rand: builtins.int = ...,
+        from_uin: builtins.int = ...,
+        ) -> None: ...
+    def ClearField(self, field_name: typing_extensions.Literal["from_uin",b"from_uin","group_code",b"group_code","msg_rand",b"msg_rand","msg_seq",b"msg_seq","to_uin",b"to_uin"]) -> None: ...
+global___DED3ReqBody = DED3ReqBody

From 808aa0196d72ae05b2825fd53b59b930b14ea42b Mon Sep 17 00:00:00 2001
From: pad <a1025952421@outlook.com>
Date: Wed, 13 Apr 2022 18:12:33 +0800
Subject: [PATCH 100/113] add: group operation

---
 cai/api/group.py | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/cai/api/group.py b/cai/api/group.py
index b16536c7..dbdc405b 100644
--- a/cai/api/group.py
+++ b/cai/api/group.py
@@ -11,6 +11,7 @@
 
 from cai.client import GroupMember
 from cai.client import Group as group_t
+from cai.client.oidb import builder
 
 from .base import BaseAPI
 
@@ -81,5 +82,34 @@ async def get_group_member_list(
         """
         return await self._executor("get_group_member_list", group, cache)
 
+    async def set_group_admin(self, group: int, uin: int, is_admin: bool):
+        await self.client.send_unipkg_and_wait(
+            "Oidb.0x55c_1",
+            builder.build_set_admin_pkg(
+                target_uin=uin,
+                group=group,
+                is_admin=is_admin
+            )
+        )
+
+    async def mute_member(self, group: int, uin: int, duration: int):
+        await self.client.send_unipkg_and_wait(
+            "Oidb.0x570_8",
+            builder.build_mute_member_pkg(
+                target_uin=uin,
+                group=group,
+                duration=duration
+            )
+        )
+
+    async def send_group_nudge(self, group: int, uin: int):
+        await self.client.send_unipkg_and_wait(
+            "Oidb.0xed3",
+            builder.build_send_nudge_pkg(
+                target_uin=uin,
+                group=group
+            )
+        )
+
 
 __all__ = ["Group"]

From df052cf1cf4c0e1d33525ea0d7df6257d2acfcab Mon Sep 17 00:00:00 2001
From: wyapx <a1025952421@outlook.com>
Date: Wed, 13 Apr 2022 18:31:56 +0800
Subject: [PATCH 101/113] fix: stupid problem

---
 cai/api/group.py           | 6 +++---
 cai/client/oidb/builder.py | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/cai/api/group.py b/cai/api/group.py
index dbdc405b..32e3f28b 100644
--- a/cai/api/group.py
+++ b/cai/api/group.py
@@ -84,7 +84,7 @@ async def get_group_member_list(
 
     async def set_group_admin(self, group: int, uin: int, is_admin: bool):
         await self.client.send_unipkg_and_wait(
-            "Oidb.0x55c_1",
+            "OidbSvc.0x55c_1",
             builder.build_set_admin_pkg(
                 target_uin=uin,
                 group=group,
@@ -94,7 +94,7 @@ async def set_group_admin(self, group: int, uin: int, is_admin: bool):
 
     async def mute_member(self, group: int, uin: int, duration: int):
         await self.client.send_unipkg_and_wait(
-            "Oidb.0x570_8",
+            "OidbSvc.0x570_8",
             builder.build_mute_member_pkg(
                 target_uin=uin,
                 group=group,
@@ -104,7 +104,7 @@ async def mute_member(self, group: int, uin: int, duration: int):
 
     async def send_group_nudge(self, group: int, uin: int):
         await self.client.send_unipkg_and_wait(
-            "Oidb.0xed3",
+            "OidbSvc.0xed3",
             builder.build_send_nudge_pkg(
                 target_uin=uin,
                 group=group
diff --git a/cai/client/oidb/builder.py b/cai/client/oidb/builder.py
index 70334064..b5b0fb7b 100644
--- a/cai/client/oidb/builder.py
+++ b/cai/client/oidb/builder.py
@@ -10,7 +10,7 @@ def build_oidb_sso_packet(cmd: int, service_type: int, body: bytes) -> bytes:
     ).SerializeToString()
 
 
-# SendNudge, Oidb.0xed3
+# SendNudge, OidbSvc.0xed3
 def build_send_nudge_pkg(target_uin: int, group: int = None, from_uin: int = None) -> bytes:
     if not (group or from_uin):
         raise ValueError("no sender")
@@ -24,7 +24,7 @@ def build_send_nudge_pkg(target_uin: int, group: int = None, from_uin: int = Non
     )
 
 
-# SetAdmin, Oidb.0x55c_1
+# SetAdmin, OidbSvc.0x55c_1
 def build_set_admin_pkg(target_uin: int, group: int, is_admin: bool) -> bytes:
     return build_oidb_sso_packet(
         1372, 1,
@@ -37,7 +37,7 @@ def build_set_admin_pkg(target_uin: int, group: int, is_admin: bool) -> bytes:
     )
 
 
-# MuteMember, Oidb.0x570_8
+# MuteMember, OidbSvc.0x570_8
 def build_mute_member_pkg(target_uin: int, group: int, duration: int) -> bytes:
     if duration < 0:
         return ValueError("duration must be a positive value")

From 2dcf545a9f76ef40e969d18ac6a810482f57e710 Mon Sep 17 00:00:00 2001
From: yanyongyu <42488585+yanyongyu@users.noreply.github.com>
Date: Wed, 13 Apr 2022 19:16:50 +0800
Subject: [PATCH 102/113] :bug: fix group mute count decode error

---
 cai/client/online_push/decoders.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/cai/client/online_push/decoders.py b/cai/client/online_push/decoders.py
index 46501fb4..b0b29624 100644
--- a/cai/client/online_push/decoders.py
+++ b/cai/client/online_push/decoders.py
@@ -91,10 +91,11 @@ def decode_troop_gag(cls, info: MessageInfo) -> Iterator[Event]:
         data = Packet(info.vec_msg)
         group_id, sub_type = data.start().uint32().uint8().execute()
         if sub_type == 12:
-            operator_id = data.start().offset(6).uint32().execute()[0]
+            operator_id, count = (
+                data.start().offset(6).uint32().offset(4).uint16().execute()
+            )
 
             offset = 16
-            count = info.vec_msg[14]
             for _ in range(count):
                 target_id, duration = (
                     data.start().offset(offset).uint32().uint32().execute()

From 19dd4db88f828e745b767db38f3483793f23bbb7 Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Thu, 7 Apr 2022 14:37:10 +0800
Subject: [PATCH 103/113] remove: unused file

---
 cai/utils/gcode.py | 38 --------------------------------------
 1 file changed, 38 deletions(-)
 delete mode 100644 cai/utils/gcode.py

diff --git a/cai/utils/gcode.py b/cai/utils/gcode.py
deleted file mode 100644
index 53b5714a..00000000
--- a/cai/utils/gcode.py
+++ /dev/null
@@ -1,38 +0,0 @@
-class GroupIdConvertor:
-    @staticmethod
-    def to_group_code(group_id: int) -> int:
-        left = group_id // 1000000
-        if 0 + 202 <= left <= 10 + 202:
-            left -= 202
-        elif 11 + 480 - 11 <= left <= 19 + 480 - 11:
-            left -= 480 - 11
-        elif 20 + 2100 - 20 <= left <= 66 + 2100 - 20:
-            left -= 2100 - 20
-        elif 67 + 2010 - 67 <= left <= 156 + 2010 - 67:
-            left -= 2010 - 67
-        elif 157 + 2147 - 157 <= left <= 209 + 2147 - 157:
-            left -= 2147 - 157
-        elif 210 + 4100 - 210 <= left <= 309 + 4100 - 210:
-            left -= 4100 - 210
-        elif 310 + 3800 - 310 <= left <= 499 + 3800 - 310:
-            left -= 3800 - 310
-        return int(left * 1000000 + group_id % 1000000)
-
-    @staticmethod
-    def to_group_uin(group_code: int) -> int:
-        left = group_code // 1000000
-        if 0 <= left <= 10:
-            left += 202
-        elif 11 <= left <= 19:
-            left += 480 - 11
-        elif 20 <= left <= 66:
-            left += 2100 - 20
-        elif 67 <= left <= 156:
-            left += 2010 - 67
-        elif 157 <= left <= 209:
-            left += 2147 - 157
-        elif 210 <= left <= 309:
-            left += 4100 - 210
-        elif 310 <= left <= 499:
-            left += 3800 - 310
-        return int(left * 1000000 + group_code % 1000000)

From c3b8c5a14a13f7acff7b39b46e8762b2866a927f Mon Sep 17 00:00:00 2001
From: wyapx <a1025952421@outlook.com>
Date: Fri, 15 Apr 2022 08:00:17 +0800
Subject: [PATCH 104/113] add: image decoder

---
 cai/client/highway/encoders.py | 54 ++++++++++++++++-----
 cai/client/highway/highway.py  | 27 ++++-------
 cai/utils/image/__init__.py    |  0
 cai/utils/image/decoder.py     | 88 ++++++++++++++++++++++++++++++++++
 cai/utils/image/enum.py        | 10 ++++
 5 files changed, 148 insertions(+), 31 deletions(-)
 create mode 100644 cai/utils/image/__init__.py
 create mode 100644 cai/utils/image/decoder.py
 create mode 100644 cai/utils/image/enum.py

diff --git a/cai/client/highway/encoders.py b/cai/client/highway/encoders.py
index 30425329..c20392d7 100644
--- a/cai/client/highway/encoders.py
+++ b/cai/client/highway/encoders.py
@@ -1,13 +1,34 @@
 from cai.pb.im.cs.cmd0x388 import ReqBody, TryUpImgReq, TryUpPttReq
+from typing import Sequence, Optional
 
 
 def encode_d388_req(
-    group_code: int, uin: int, md5: bytes, size: int, subcmd: int
+    subcmd: int,
+    tryup_img: Sequence[TryUpImgReq] = None,
+    tryup_ptt: Sequence[TryUpPttReq] = None,
+    ext: Optional[bytes] = None
 ) -> ReqBody:
-    img, ptt = None, None
-    if subcmd == 1:  # upload img
-        fn = md5.hex().upper() + ".jpg"
-        img = [
+    return ReqBody(
+        net_type=8,
+        subcmd=subcmd,
+        tryup_img_req=tryup_img,
+        tryup_ptt_req=tryup_ptt,
+        extension=ext
+    )
+
+
+def encode_upload_img_req(
+    group_code: int,
+    uin: int,
+    md5: bytes,
+    size: int,
+    suffix: str = None,
+    pic_type: int = 1003
+) -> ReqBody:
+    fn = f"{md5.hex().upper()}.{'jpg' if not suffix else suffix}"
+    return encode_d388_req(
+        subcmd=1,
+        tryup_img=[
             TryUpImgReq(
                 group_code=group_code,
                 src_uin=uin,
@@ -18,7 +39,7 @@ def encode_d388_req(
                 src_term=5,
                 platform_type=9,
                 bu_type=1,
-                pic_type=1003,
+                pic_type=pic_type,
                 pic_width=1920,
                 pic_height=903,
                 build_ver=b"8.8.50.2324",
@@ -27,13 +48,23 @@ def encode_d388_req(
                 srv_upload=0,
             )
         ]
-    elif subcmd == 3:  # voice
-        ptt = [
+    )
+
+def encode_upload_voice_req(
+    group_code: int,
+    uin: int,
+    md5: bytes,
+    size: int,
+    suffix: str = None,
+) -> ReqBody:
+    return encode_d388_req(
+        subcmd=3,
+        tryup_ptt=[
             TryUpPttReq(
                 group_code=group_code,
                 src_uin=uin,
                 file_md5=md5,
-                file_name=(md5.hex().upper() + ".amr").encode(),
+                file_name=f"{md5.hex().upper()}.{'amr' if not suffix else suffix}".encode(),
                 file_size=size,
                 voice_length=size,
                 voice_type=1,
@@ -46,8 +77,5 @@ def encode_d388_req(
                 new_up_chan=True,
             )
         ]
-    else:
-        ValueError("unsupported subcmd:", subcmd)
-    return ReqBody(
-        net_type=8, subcmd=subcmd, tryup_img_req=img, tryup_ptt_req=ptt
     )
+
diff --git a/cai/client/highway/highway.py b/cai/client/highway/highway.py
index 13a77d5c..6d7acdba 100644
--- a/cai/client/highway/highway.py
+++ b/cai/client/highway/highway.py
@@ -3,9 +3,10 @@
 from hashlib import md5
 from typing import TYPE_CHECKING, List, Tuple, BinaryIO, Optional
 
+from cai.utils.image import decoder
 from cai.pb.highway.protocol.highway_head_pb2 import highway_head
 
-from .encoders import encode_d388_req
+from .encoders import encode_upload_img_req, encode_upload_voice_req
 from .frame import read_frame, write_frame
 from .utils import to_id, timeit, calc_file_md5_and_length
 from ..message_service.models import ImageElement, VoiceElement
@@ -77,12 +78,13 @@ async def _upload_controller(
 
     async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
         fmd5, fl = calc_file_md5_and_length(file)
+        info = decoder.decode(file)
         ret = decode_upload_image_resp(
             (
                 await self._client.send_unipkg_and_wait(
                     "ImgStore.GroupPicUp",
-                    encode_d388_req(
-                        gid, self._client.uin, fmd5, fl, 1
+                    encode_upload_img_req(
+                        gid, self._client.uin, fmd5, fl, suffix=info.img_type, pic_type=info.pic_type
                     ).SerializeToString(),
                 )
             ).data
@@ -96,23 +98,12 @@ async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
                 ret.uploadAddr, file, 2, ret.uploadKey  # send to group
             )
 
-            ret = decode_upload_image_resp(
-                (
-                    await self._client.send_unipkg_and_wait(
-                        "ImgStore.GroupPicUp",
-                        encode_d388_req(
-                            gid, self._client.uin, fmd5, fl, 1
-                        ).SerializeToString(),
-                    )
-                ).data
-            )
-
         if ret.hasMetaData:
             image_type = ret.fileType
             w, h = ret.width, ret.height
         else:
-            image_type = 1000
-            w, h = (800, 600)
+            image_type = info.pic_type
+            w, h = info.width, info.height
 
         return ImageElement(
             id=ret.fileId,
@@ -127,8 +118,8 @@ async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
 
     async def upload_voice(self, file: BinaryIO, gid: int) -> VoiceElement:
         fmd5, fl = calc_file_md5_and_length(file)
-        ext = encode_d388_req(
-            gid, self._client.uin, fmd5, fl, 3
+        ext = encode_upload_voice_req(
+            gid, self._client.uin, fmd5, fl
         ).SerializeToString()
         if not (self._session_key and self._session_sig):
             self._decode_bdh_session()
diff --git a/cai/utils/image/__init__.py b/cai/utils/image/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/cai/utils/image/decoder.py b/cai/utils/image/decoder.py
new file mode 100644
index 00000000..153b0ccb
--- /dev/null
+++ b/cai/utils/image/decoder.py
@@ -0,0 +1,88 @@
+import struct
+import binascii
+from typing import BinaryIO
+from dataclasses import dataclass
+
+from .enum import ImageType
+
+
+@dataclass
+class ImageInfo:
+    img_type: str
+    width: int
+    height: int
+    depth: int
+
+    @property
+    def pic_type(self) -> ImageType:
+        return ImageType(self.img_type)
+
+
+class BaseDecoder:
+    @classmethod
+    def decode(cls, fio: BinaryIO) -> ImageInfo:
+        raise NotImplementedError
+
+
+class JPEGDecoder(BaseDecoder):
+    @classmethod
+    def decode(cls, fio: BinaryIO) -> ImageInfo:
+        if fio.read(2) != b"\xff\xd8":
+            raise TypeError("not a valid jpeg file")
+        while True:
+            if fio.read(1) != b"\xff":
+                raise ValueError("decoder fail")
+            btype = fio.read(1)
+            data = fio.read(
+                int.from_bytes(fio.read(2), "big") - 2
+            )
+            # if btype == b"\xe0":
+            #    _, _, hdpi, wdpi, *_ = struct.unpack("!BBBHHBB", data[5:])
+            if btype == b"\xc0":
+                depth, height, width, _ = struct.unpack("!BHHB", data[:6])
+                print(width, height)
+                return ImageInfo("jpg", width, height, depth)
+
+
+class PNGDecoder(BaseDecoder):
+    @classmethod
+    def decode(cls, fio: BinaryIO) -> ImageInfo:
+        if fio.read(8).hex() != "89504e470d0a1a0a":
+            raise TypeError("not a valid png file")
+        while True:
+            raw_head = fio.read(8)
+            if not raw_head:
+                break
+            elif len(raw_head) != 8:
+                raise ValueError("decoder fail")
+            length, btype = struct.unpack("!I4s", raw_head)
+            data = fio.read(length)
+            if binascii.crc32(raw_head[4:] + data) != int.from_bytes(fio.read(4), "big"):
+                raise ValueError("CRC not match")
+            elif btype == b"IHDR":
+                width, height, depth, *_ = struct.unpack("!IIBBBBB", data)
+                return ImageInfo("png", width, height, depth)
+            # else:
+            #     print(length, btype)
+
+
+class GIFDecoder(BaseDecoder):
+    @classmethod
+    def decode(cls, fio: BinaryIO) -> ImageInfo:
+        if fio.read(6) != b"GIF89a":
+            raise TypeError("not a valid gif file")
+        width, height, flag, *_ = struct.unpack("<HHBBB", fio.read(7))
+        return ImageInfo("gif", width, height, ((flag ^ 0x80) >> 4) + 2)
+
+
+def decode(f: BinaryIO) -> ImageInfo:
+    head = f.read(3)
+    f.seek(0)
+    if head[:-1] == b"\xff\xd8":
+        return JPEGDecoder.decode(f)
+    elif head.hex() == "89504e":
+        return PNGDecoder.decode(f)
+    elif head == b"GIF":
+        return GIFDecoder.decode(f)
+    else:
+        raise NotImplementedError
diff --git a/cai/utils/image/enum.py b/cai/utils/image/enum.py
new file mode 100644
index 00000000..846f13c4
--- /dev/null
+++ b/cai/utils/image/enum.py
@@ -0,0 +1,10 @@
+from enum import IntEnum
+
+
+class ImageType(IntEnum):
+    img = 1000
+    gif = 2000
+    # jpg = 1003
+
+    def _missing_(cls, value: object):
+        return cls.img

From 0c508c583f32a15f2073a8d297661696b229dfd4 Mon Sep 17 00:00:00 2001
From: wyapx <a1025952421@outlook.com>
Date: Fri, 15 Apr 2022 08:03:01 +0800
Subject: [PATCH 105/113] fix: image/enum.py

---
 cai/utils/image/enum.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/cai/utils/image/enum.py b/cai/utils/image/enum.py
index 846f13c4..89b919dd 100644
--- a/cai/utils/image/enum.py
+++ b/cai/utils/image/enum.py
@@ -6,5 +6,6 @@ class ImageType(IntEnum):
     gif = 2000
     # jpg = 1003
 
+    @classmethod
     def _missing_(cls, value: object):
         return cls.img

From 1d7efc740e041885fc4a729099b7502e39f94b35 Mon Sep 17 00:00:00 2001
From: wyapx <a1025952421@outlook.com>
Date: Fri, 15 Apr 2022 08:31:31 +0800
Subject: [PATCH 106/113] update: image/enum.py

---
 cai/utils/image/enum.py | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/cai/utils/image/enum.py b/cai/utils/image/enum.py
index 89b919dd..665e06b5 100644
--- a/cai/utils/image/enum.py
+++ b/cai/utils/image/enum.py
@@ -2,10 +2,13 @@
 
 
 class ImageType(IntEnum):
-    img = 1000
+    jpg = 1000
+    png = 1001
+    webp = 1002
+    bmp = 1005
     gif = 2000
-    # jpg = 1003
+    apng = 2001
 
     @classmethod
     def _missing_(cls, value: object):
-        return cls.img
+        return cls.jpg

From 95df06510db3fd1bbde4f4bb389f14b7001eecea Mon Sep 17 00:00:00 2001
From: wyapx <a1025952421@outlook.com>
Date: Fri, 15 Apr 2022 17:56:17 +0800
Subject: [PATCH 107/113] fix: image upload

---
 cai/client/highway/encoders.py | 23 ++++++++++++-----------
 cai/client/highway/highway.py  | 16 ++++++++++++----
 cai/utils/image/decoder.py     |  4 ++--
 3 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/cai/client/highway/encoders.py b/cai/client/highway/encoders.py
index c20392d7..63bd0d7f 100644
--- a/cai/client/highway/encoders.py
+++ b/cai/client/highway/encoders.py
@@ -1,19 +1,20 @@
 from cai.pb.im.cs.cmd0x388 import ReqBody, TryUpImgReq, TryUpPttReq
-from typing import Sequence, Optional
+from typing import Sequence, TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from cai.utils.image.decoder import ImageInfo
 
 
 def encode_d388_req(
     subcmd: int,
     tryup_img: Sequence[TryUpImgReq] = None,
-    tryup_ptt: Sequence[TryUpPttReq] = None,
-    ext: Optional[bytes] = None
+    tryup_ptt: Sequence[TryUpPttReq] = None
 ) -> ReqBody:
     return ReqBody(
         net_type=8,
         subcmd=subcmd,
         tryup_img_req=tryup_img,
-        tryup_ptt_req=tryup_ptt,
-        extension=ext
+        tryup_ptt_req=tryup_ptt
     )
 
 
@@ -22,10 +23,10 @@ def encode_upload_img_req(
     uin: int,
     md5: bytes,
     size: int,
-    suffix: str = None,
-    pic_type: int = 1003
+    info: "ImageInfo"
 ) -> ReqBody:
-    fn = f"{md5.hex().upper()}.{'jpg' if not suffix else suffix}"
+    fn = f"{md5.hex().upper()}.{info.name or 'jpg'}"
+    print(info, fn)
     return encode_d388_req(
         subcmd=1,
         tryup_img=[
@@ -39,9 +40,9 @@ def encode_upload_img_req(
                 src_term=5,
                 platform_type=9,
                 bu_type=1,
-                pic_type=pic_type,
-                pic_width=1920,
-                pic_height=903,
+                pic_type=info.pic_type.value,
+                pic_width=info.width,
+                pic_height=info.height,
                 build_ver=b"8.8.50.2324",
                 app_pic_type=1052,
                 original_pic=1,
diff --git a/cai/client/highway/highway.py b/cai/client/highway/highway.py
index 6d7acdba..684c0957 100644
--- a/cai/client/highway/highway.py
+++ b/cai/client/highway/highway.py
@@ -79,13 +79,12 @@ async def _upload_controller(
     async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
         fmd5, fl = calc_file_md5_and_length(file)
         info = decoder.decode(file)
+        file.seek(0)
         ret = decode_upload_image_resp(
             (
                 await self._client.send_unipkg_and_wait(
                     "ImgStore.GroupPicUp",
-                    encode_upload_img_req(
-                        gid, self._client.uin, fmd5, fl, suffix=info.img_type, pic_type=info.pic_type
-                    ).SerializeToString(),
+                    encode_upload_img_req(gid, self._client.uin, fmd5, fl, info).SerializeToString(),
                 )
             ).data
         )
@@ -98,6 +97,15 @@ async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
                 ret.uploadAddr, file, 2, ret.uploadKey  # send to group
             )
 
+            ret = decode_upload_image_resp(
+                (
+                    await self._client.send_unipkg_and_wait(
+                        "ImgStore.GroupPicUp",
+                        encode_upload_img_req(gid, self._client.uin, fmd5, fl, info).SerializeToString(),
+                    )
+                ).data
+            )
+
         if ret.hasMetaData:
             image_type = ret.fileType
             w, h = ret.width, ret.height
@@ -107,7 +115,7 @@ async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
 
         return ImageElement(
             id=ret.fileId,
-            filename=to_id(fmd5) + ".png",
+            filename=to_id(fmd5) + f".{info.name}",
             size=fl,
             width=w,
             height=h,
diff --git a/cai/utils/image/decoder.py b/cai/utils/image/decoder.py
index 153b0ccb..1e10b244 100644
--- a/cai/utils/image/decoder.py
+++ b/cai/utils/image/decoder.py
@@ -8,14 +8,14 @@
 
 @dataclass
 class ImageInfo:
-    img_type: str
+    name: str
     width: int
     height: int
     depth: int
 
     @property
     def pic_type(self) -> ImageType:
-        return ImageType(self.img_type)
+        return getattr(ImageType, self.name)
 
 
 class BaseDecoder:

From ec74eda0f954313732ef0f118c7a80ab89bc95c6 Mon Sep 17 00:00:00 2001
From: wyapx <a1025952421@outlook.com>
Date: Fri, 15 Apr 2022 18:14:38 +0800
Subject: [PATCH 108/113] fix: some design problem

---
 cai/client/highway/decoders.py | 1 +
 cai/client/highway/highway.py  | 9 ---------
 cai/client/highway/utils.py    | 2 +-
 3 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/cai/client/highway/decoders.py b/cai/client/highway/decoders.py
index 0fd6ee01..63b234e6 100644
--- a/cai/client/highway/decoders.py
+++ b/cai/client/highway/decoders.py
@@ -27,6 +27,7 @@ def decode_upload_image_resp(data: bytes) -> ImageUploadResponse:
             return ImageUploadResponse(isExists=True, fileId=pkg.fileid)
     return ImageUploadResponse(
         isExists=False,
+        fileId=pkg.fileid,
         uploadAddr=[(itoa(a), p) for a, p in zip(pkg.up_ip, pkg.up_port)],
         uploadKey=pkg.up_ukey,
     )
diff --git a/cai/client/highway/highway.py b/cai/client/highway/highway.py
index 684c0957..f8653351 100644
--- a/cai/client/highway/highway.py
+++ b/cai/client/highway/highway.py
@@ -97,15 +97,6 @@ async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
                 ret.uploadAddr, file, 2, ret.uploadKey  # send to group
             )
 
-            ret = decode_upload_image_resp(
-                (
-                    await self._client.send_unipkg_and_wait(
-                        "ImgStore.GroupPicUp",
-                        encode_upload_img_req(gid, self._client.uin, fmd5, fl, info).SerializeToString(),
-                    )
-                ).data
-            )
-
         if ret.hasMetaData:
             image_type = ret.fileType
             w, h = ret.width, ret.height
diff --git a/cai/client/highway/utils.py b/cai/client/highway/utils.py
index 3eb68bfa..9cb764c3 100644
--- a/cai/client/highway/utils.py
+++ b/cai/client/highway/utils.py
@@ -23,7 +23,7 @@ def itoa(i: int) -> str:  # int to address(str)
 
 
 def to_id(b_uuid: bytes) -> str:
-    return "{%s}" % uuid.UUID(bytes=b_uuid)
+    return b_uuid.hex()
 
 
 async def timeit(func: Awaitable) -> Tuple[float, Any]:

From abca32bd6db53fe618df30744e8cadda84ecdf5a Mon Sep 17 00:00:00 2001
From: wyapx <a1025952421@outlook.com>
Date: Sat, 16 Apr 2022 12:33:22 +0800
Subject: [PATCH 109/113] add: parse GroupFile

---
 cai/client/highway/encoders.py         |  2 +-
 cai/client/highway/utils.py            |  2 +-
 cai/client/message_service/decoders.py | 13 +++++++++++++
 cai/client/message_service/models.py   | 11 +++++++++++
 4 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/cai/client/highway/encoders.py b/cai/client/highway/encoders.py
index 63bd0d7f..65344eb3 100644
--- a/cai/client/highway/encoders.py
+++ b/cai/client/highway/encoders.py
@@ -51,6 +51,7 @@ def encode_upload_img_req(
         ]
     )
 
+
 def encode_upload_voice_req(
     group_code: int,
     uin: int,
@@ -79,4 +80,3 @@ def encode_upload_voice_req(
             )
         ]
     )
-
diff --git a/cai/client/highway/utils.py b/cai/client/highway/utils.py
index 9cb764c3..f86ce7c6 100644
--- a/cai/client/highway/utils.py
+++ b/cai/client/highway/utils.py
@@ -23,7 +23,7 @@ def itoa(i: int) -> str:  # int to address(str)
 
 
 def to_id(b_uuid: bytes) -> str:
-    return b_uuid.hex()
+    return f"{{{uuid.UUID(bytes=b_uuid)}}}"
 
 
 async def timeit(func: Awaitable) -> Tuple[float, Any]:
diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index 950281d9..4ea14826 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -16,6 +16,7 @@
 from cai.client.events import Event
 from cai.pb.msf.msg.comm import Msg
 from cai.pb.im.msg.msg_body import Ptt, Elem
+from cai.pb.im.msg.obj_msg import ObjMsg
 from cai.pb.im.msg.service.comm_elem import (
     MsgElemInfo_servtype2,
     MsgElemInfo_servtype3,
@@ -39,6 +40,7 @@
     CustomDataElement,
     FlashImageElement,
     SmallEmojiElement,
+    GroupFileElement,
 )
 
 
@@ -266,6 +268,17 @@ def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
                     stype=elem.shake_window.type, uin=elem.shake_window.uin
                 )
             )
+        elif elem.HasField("trans_elem_info"):
+            if elem.trans_elem_info.elem_type == 24:  # QQ File
+                if elem.trans_elem_info.elem_value[0]:
+                    obj = ObjMsg.FromString(elem.trans_elem_info.elem_value[3:])
+                    for info in obj.content_info:
+                        res.append(GroupFileElement(
+                            info.file.file_name,
+                            info.file.file_size,
+                            info.file.file_path.decode(),
+                            bytes.fromhex(info.file.file_md5.decode())
+                        ))
         index += 1
     return res
 
diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 19eba9bf..334d9789 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -242,3 +242,14 @@ class CustomDataElement(Element):
     def type(self) -> str:
         return "custom_daata"
 
+
+@dataclass
+class GroupFileElement(Element):
+    name: str
+    size: int
+    path: str
+    md5: bytes
+
+    @property
+    def type(self) -> str:
+        return "group_file"

From 1f4d1a3d491cc45f7716c3fa23935ed6502332ad Mon Sep 17 00:00:00 2001
From: wyapx <a1025952421@outlook.com>
Date: Sat, 16 Apr 2022 13:59:22 +0800
Subject: [PATCH 110/113] add: BMPDecoder & optimized code

---
 cai/client/highway/encoders.py |  1 -
 cai/client/highway/highway.py  |  1 -
 cai/client/highway/utils.py    |  2 +-
 cai/utils/image/decoder.py     | 33 +++++++++++++++++++++++++--------
 4 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/cai/client/highway/encoders.py b/cai/client/highway/encoders.py
index 65344eb3..76f57a6f 100644
--- a/cai/client/highway/encoders.py
+++ b/cai/client/highway/encoders.py
@@ -26,7 +26,6 @@ def encode_upload_img_req(
     info: "ImageInfo"
 ) -> ReqBody:
     fn = f"{md5.hex().upper()}.{info.name or 'jpg'}"
-    print(info, fn)
     return encode_d388_req(
         subcmd=1,
         tryup_img=[
diff --git a/cai/client/highway/highway.py b/cai/client/highway/highway.py
index f8653351..6538e668 100644
--- a/cai/client/highway/highway.py
+++ b/cai/client/highway/highway.py
@@ -79,7 +79,6 @@ async def _upload_controller(
     async def upload_image(self, file: BinaryIO, gid: int) -> ImageElement:
         fmd5, fl = calc_file_md5_and_length(file)
         info = decoder.decode(file)
-        file.seek(0)
         ret = decode_upload_image_resp(
             (
                 await self._client.send_unipkg_and_wait(
diff --git a/cai/client/highway/utils.py b/cai/client/highway/utils.py
index f86ce7c6..d701eaf8 100644
--- a/cai/client/highway/utils.py
+++ b/cai/client/highway/utils.py
@@ -23,7 +23,7 @@ def itoa(i: int) -> str:  # int to address(str)
 
 
 def to_id(b_uuid: bytes) -> str:
-    return f"{{{uuid.UUID(bytes=b_uuid)}}}"
+    return f"{{{str(uuid.UUID(bytes=b_uuid)).upper()}}}"
 
 
 async def timeit(func: Awaitable) -> Tuple[float, Any]:
diff --git a/cai/utils/image/decoder.py b/cai/utils/image/decoder.py
index 1e10b244..480aab59 100644
--- a/cai/utils/image/decoder.py
+++ b/cai/utils/image/decoder.py
@@ -75,14 +75,31 @@ def decode(cls, fio: BinaryIO) -> ImageInfo:
         return ImageInfo("gif", width, height, ((flag ^ 0x80) >> 4) + 2)
 
 
+class BMPDecoder(BaseDecoder):
+    @classmethod
+    def decode(cls, fio: BinaryIO) -> ImageInfo:
+        if fio.read(2) != b"BM":
+            raise TypeError("not a valid bmp file")
+        fio.read(12)  # offset
+        data = fio.read(16)
+        print(data)
+        _, width, height, _, depth = struct.unpack("<IiiHH", data)
+        return ImageInfo("bmp", width, height, depth)
+
+
 def decode(f: BinaryIO) -> ImageInfo:
     head = f.read(3)
     f.seek(0)
-    if head[:-1] == b"\xff\xd8":
-        return JPEGDecoder.decode(f)
-    elif head.hex() == "89504e":
-        return PNGDecoder.decode(f)
-    elif head == b"GIF":
-        return GIFDecoder.decode(f)
-    else:
-        raise NotImplementedError
+    try:
+        if head[:-1] == b"\xff\xd8":
+            return JPEGDecoder.decode(f)
+        elif head.hex() == "89504e":
+            return PNGDecoder.decode(f)
+        elif head == b"GIF":
+            return GIFDecoder.decode(f)
+        elif head[:-1] == b"BM":
+            return BMPDecoder.decode(f)
+        else:
+            raise NotImplementedError
+    finally:
+        f.seek(0)

From 0656836f5bdc5c89da636c437911fc4656abd770 Mon Sep 17 00:00:00 2001
From: wyapx <a1025952421@outlook.com>
Date: Sat, 16 Apr 2022 14:01:04 +0800
Subject: [PATCH 111/113] remove: unused code

---
 cai/utils/image/decoder.py | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/cai/utils/image/decoder.py b/cai/utils/image/decoder.py
index 480aab59..f7a5ef20 100644
--- a/cai/utils/image/decoder.py
+++ b/cai/utils/image/decoder.py
@@ -36,8 +36,6 @@ def decode(cls, fio: BinaryIO) -> ImageInfo:
             data = fio.read(
                 int.from_bytes(fio.read(2), "big") - 2
             )
-            # if btype == b"\xe0":
-            #    _, _, hdpi, wdpi, *_ = struct.unpack("!BBBHHBB", data[5:])
             if btype == b"\xc0":
                 depth, height, width, _ = struct.unpack("!BHHB", data[:6])
                 print(width, height)
@@ -62,8 +60,6 @@ def decode(cls, fio: BinaryIO) -> ImageInfo:
             elif btype == b"IHDR":
                 width, height, depth, *_ = struct.unpack("!IIBBBBB", data)
                 return ImageInfo("png", width, height, depth)
-            # else:
-            #     print(length, btype)
 
 
 class GIFDecoder(BaseDecoder):
@@ -82,7 +78,6 @@ def decode(cls, fio: BinaryIO) -> ImageInfo:
             raise TypeError("not a valid bmp file")
         fio.read(12)  # offset
         data = fio.read(16)
-        print(data)
         _, width, height, _, depth = struct.unpack("<IiiHH", data)
         return ImageInfo("bmp", width, height, depth)
 

From b3dbbb60b3ba07d4d5400c256f89c4d58f14893d Mon Sep 17 00:00:00 2001
From: a1025 <a1025952421@outlook.com>
Date: Mon, 18 Apr 2022 14:47:16 +0800
Subject: [PATCH 112/113] fix: send image fail

---
 cai/client/message_service/models.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cai/client/message_service/models.py b/cai/client/message_service/models.py
index 334d9789..60547d19 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message_service/models.py
@@ -124,7 +124,7 @@ class ImageElement(Element):
     width: int
     height: int
     md5: bytes
-    id: Optional[int] = -1
+    id: Optional[int] = 0
     url: Optional[str] = None
     filetype: Optional[int] = 1000
 

From 3c9c9d19b10472acf667176885356aeea1a29db0 Mon Sep 17 00:00:00 2001
From: Ju4tCode <42488585+yanyongyu@users.noreply.github.com>
Date: Sun, 29 May 2022 10:26:03 +0000
Subject: [PATCH 113/113] :art: improve parse message element

---
 cai/api/client.py                             |   2 +-
 cai/client/events/__init__.py                 |  29 +-
 cai/client/events/common.py                   |  17 -
 cai/client/events/friend.py                   |  25 +-
 cai/client/events/group.py                    |  16 +
 cai/client/highway/highway.py                 |   2 +-
 cai/client/message/__init__.py                | 258 +++++++++++++
 .../{message_service => message}/models.py    |  62 +---
 cai/client/message_service/__init__.py        |   2 +-
 cai/client/message_service/decoders.py        | 343 +++---------------
 cai/client/message_service/encoders.py        |   2 +-
 examples/login.py                             |   2 +-
 12 files changed, 378 insertions(+), 382 deletions(-)
 delete mode 100644 cai/client/events/common.py
 create mode 100644 cai/client/message/__init__.py
 rename cai/client/{message_service => message}/models.py (78%)

diff --git a/cai/api/client.py b/cai/api/client.py
index 66205bb3..6759740a 100644
--- a/cai/api/client.py
+++ b/cai/api/client.py
@@ -18,7 +18,7 @@
 from cai.client.highway import HighWaySession
 from cai.settings.protocol import get_protocol
 from cai.client.message_service.encoders import build_msg, make_group_msg_pkg
-from cai.client.message_service.models import (
+from cai.client.message.models import (
     Element,
     ImageElement,
     VoiceElement,
diff --git a/cai/client/events/__init__.py b/cai/client/events/__init__.py
index bf311aa3..72e041e2 100644
--- a/cai/client/events/__init__.py
+++ b/cai/client/events/__init__.py
@@ -1,22 +1,27 @@
+# base
 from .base import Event as Event
 from .group import GroupEvent as GroupEvent
-from .common import NudgeEvent as NudgeEvent
+from .friend import PrivateEvent as PrivateEvent
+from .group import GroupNudgeEvent as GroupNudgeEvent
 from .group import GroupRedbagEvent as GroupRedbagEvent
+from .group import GroupMessageEvent as GroupMessageEvent
+from .friend import PrivateMessageEvent as PrivateMessageEvent
 from .group import GroupMemberMutedEvent as GroupMemberMutedEvent
 from .group import GroupNameChangedEvent as GroupNameChangedEvent
 from .group import GroupMemberUnMutedEvent as GroupMemberUnMutedEvent
+from .group import GroupLuckyCharacterEvent as GroupLuckyCharacterEvent
 from .group import GroupMessageRecalledEvent as GroupMessageRecalledEvent
+from .group import GroupLuckyCharacterNewEvent as GroupLuckyCharacterNewEvent
+from .group import GroupLuckyCharacterInitEvent as GroupLuckyCharacterInitEvent
+from .group import (
+    GroupLuckyCharacterClosedEvent as GroupLuckyCharacterClosedEvent,
+)
+from .group import (
+    GroupLuckyCharacterOpenedEvent as GroupLuckyCharacterOpenedEvent,
+)
+from .group import (
+    GroupLuckyCharacterChangedEvent as GroupLuckyCharacterChangedEvent,
+)
 from .group import (
     GroupMemberSpecialTitleChangedEvent as GroupMemberSpecialTitleChangedEvent,
 )
-
-__all__ = [
-    "Event",
-    "GroupEvent",
-    "NudgeEvent",
-    "GroupMemberMutedEvent",
-    "GroupMemberUnMutedEvent",
-    "GroupMemberSpecialTitleChangedEvent",
-    "GroupNameChangedEvent",
-    "GroupMessageRecalledEvent",
-]
diff --git a/cai/client/events/common.py b/cai/client/events/common.py
deleted file mode 100644
index 5a4d1524..00000000
--- a/cai/client/events/common.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from typing import Optional
-from dataclasses import dataclass
-
-from .base import Event
-
-
-@dataclass
-class NudgeEvent(Event):
-    sender: int
-    target: int
-    action: str
-    suffix: Optional[str]
-    group: Optional[int] = None
-
-    @property
-    def type(self) -> str:
-        return "NudgeEvent"
diff --git a/cai/client/events/friend.py b/cai/client/events/friend.py
index db4e5dd7..5ced4963 100644
--- a/cai/client/events/friend.py
+++ b/cai/client/events/friend.py
@@ -1 +1,24 @@
-# TODO: PR Welcome
+from typing import List
+from dataclasses import dataclass
+
+from cai.pb.msf.msg.comm import Msg
+from cai.client.message import Element
+
+from .base import Event
+
+
+@dataclass
+class PrivateEvent(Event):
+    user_id: int
+
+
+# message service get message
+@dataclass
+class PrivateMessageEvent(PrivateEvent):
+    _msg: Msg
+    seq: int
+    time: int
+    auto_reply: bool
+    user_nick: str
+    to_id: int
+    message: List[Element]
diff --git a/cai/client/events/group.py b/cai/client/events/group.py
index fcf2a4e5..3023a9bb 100644
--- a/cai/client/events/group.py
+++ b/cai/client/events/group.py
@@ -1,6 +1,9 @@
 from dataclasses import dataclass
 from typing import Any, Dict, List
 
+from cai.pb.msf.msg.comm import Msg
+from cai.client.message import Element
+
 from .base import Event
 
 
@@ -9,6 +12,19 @@ class GroupEvent(Event):
     group_id: int
 
 
+# online push push msg
+@dataclass
+class GroupMessageEvent(GroupEvent):
+    _msg: Msg
+    seq: int
+    time: int
+    group_name: str
+    group_level: int
+    from_uin: int
+    from_group_card: str
+    message: List[Element]
+
+
 # online push graytip
 @dataclass
 class _GroupGrayTipEvent(GroupEvent):
diff --git a/cai/client/highway/highway.py b/cai/client/highway/highway.py
index 6538e668..593794a3 100644
--- a/cai/client/highway/highway.py
+++ b/cai/client/highway/highway.py
@@ -9,7 +9,7 @@
 from .encoders import encode_upload_img_req, encode_upload_voice_req
 from .frame import read_frame, write_frame
 from .utils import to_id, timeit, calc_file_md5_and_length
-from ..message_service.models import ImageElement, VoiceElement
+from ..message.models import ImageElement, VoiceElement
 from .decoders import decode_upload_ptt_resp, decode_upload_image_resp
 
 if TYPE_CHECKING:
diff --git a/cai/client/message/__init__.py b/cai/client/message/__init__.py
new file mode 100644
index 00000000..62666d2d
--- /dev/null
+++ b/cai/client/message/__init__.py
@@ -0,0 +1,258 @@
+import zlib
+from typing import List, Sequence
+
+from cai.pb.im.msg.obj_msg import ObjMsg
+from cai.pb.im.msg.msg_body import Ptt, Elem
+from cai.pb.im.msg.service.comm_elem import (
+    MsgElemInfo_servtype2,
+    MsgElemInfo_servtype3,
+    MsgElemInfo_servtype33,
+)
+
+from .models import *
+
+
+def parse_elements(elems: Sequence[Elem]) -> List[Element]:
+    """Parse message rich text elements.
+
+    Only parse ``text``, ``face``, ``small_smoji``, ``common_elem service 33``
+    for plain text.
+
+    Note:
+        Source: com.tencent.imcore.message.ext.codec.decoder.pbelement.*
+
+    Args:
+        elems (Sequence[Elem]): Sequence of rich text elements.
+        ptt (Ptt)
+
+    Returns:
+        List[Element]: List of decoded message elements.
+    """
+    res: List[Element] = []
+    index = 0
+    while index < len(elems):
+        elem = elems[index]
+        # SrcElemDecoder
+        if elem.HasField("src_msg"):
+            if len(elem.src_msg.orig_seqs) > 0:
+                # preprocess
+                # Delete redundancy data
+                # if index == 2:  # Sent by PC
+                #     res = []
+                # else:
+                #     index += 1  # pass
+                res.append(
+                    ReplyElement(
+                        elem.src_msg.orig_seqs[0],
+                        elem.src_msg.time,
+                        elem.src_msg.sender_uin,
+                        parse_elements(elem.src_msg.elems),
+                        elem.src_msg.troop_name.decode("utf-8") or None,
+                    )
+                )
+        # TextElemDecoder
+        elif elem.HasField("text"):
+            if elem.text.attr_6_buf:
+                if elem.text.attr_6_buf[6]:  # AtAll
+                    res.append(AtAllElement())
+                else:
+                    res.append(
+                        AtElement(
+                            int.from_bytes(
+                                elem.text.attr_6_buf[7:11], "big", signed=False
+                            ),
+                            elem.text.str.decode("utf-8"),
+                        )
+                    )
+            else:
+                res.append(TextElement(elem.text.str.decode("utf-8")))
+        elif elem.HasField("rich_msg"):
+            if elem.rich_msg.template_1[0]:
+                content = zlib.decompress(elem.rich_msg.template_1[1:])
+            else:
+                content = elem.rich_msg.template_1[1:]
+            return [
+                RichMsgElement(
+                    content,
+                    elem.rich_msg.service_id if content[0] == 60 else -1,
+                )
+            ]
+        elif elem.HasField("light_app"):
+            if elem.light_app.data[0]:
+                content = zlib.decompress(elem.light_app.data[1:])
+            else:
+                content = elem.light_app.data[1:]
+            return [RichMsgElement(content, -2)]
+        # TextElemDecoder
+        elif elem.HasField("face"):
+            res.append(FaceElement(elem.face.index))
+        # TextElemDecoder
+        elif elem.HasField("small_emoji"):
+            index += 1
+            text = elems[index].text.str.decode("utf-8")
+            res.append(
+                SmallEmojiElement(
+                    elem.small_emoji.pack_id_sum,
+                    text,
+                    # bytes(
+                    #     [
+                    #         0x1FF
+                    #         if elem.small_emoji.image_type & 0xFFFF == 2
+                    #         else 0xFF,
+                    #         elem.small_emoji.pack_id_sum & 0xFFFF,
+                    #         elem.small_emoji.pack_id_sum >> 16 & 0xFF,
+                    #         elem.small_emoji.pack_id_sum >> 24,
+                    #     ]
+                    # ),
+                )
+            )
+        # PictureElemDecoder
+        elif elem.HasField("custom_face"):
+            if elem.custom_face.md5 and elem.custom_face.orig_url:
+                res.append(
+                    ImageElement(
+                        filename=elem.custom_face.file_path,
+                        size=elem.custom_face.size,
+                        width=elem.custom_face.width,
+                        height=elem.custom_face.height,
+                        md5=elem.custom_face.md5,
+                        url="https://gchat.qpic.cn" + elem.custom_face.orig_url,
+                    )
+                )
+            elif elem.custom_face.md5:
+                res.append(
+                    ImageElement(
+                        filename=elem.custom_face.file_path,
+                        size=elem.custom_face.size,
+                        width=elem.custom_face.width,
+                        height=elem.custom_face.height,
+                        md5=elem.custom_face.md5,
+                        url="https://gchat.qpic.cn/gchatpic_new/0/0-0-"
+                        + elem.custom_face.md5.decode().upper()
+                        + "/0",
+                    )
+                )
+        # PictureElemDecoder
+        elif elem.HasField("not_online_image"):
+            if elem.not_online_image.orig_url:
+                res.append(
+                    ImageElement(
+                        filename=elem.not_online_image.file_path.decode(
+                            "utf-8"
+                        ),
+                        size=elem.not_online_image.file_len,
+                        width=elem.not_online_image.pic_width,
+                        height=elem.not_online_image.pic_height,
+                        md5=elem.not_online_image.pic_md5,
+                        url="https://c2cpicdw.qpic.cn"
+                        + elem.not_online_image.orig_url,
+                    )
+                )
+            elif (
+                elem.not_online_image.res_id
+                or elem.not_online_image.download_path
+            ):
+                res.append(
+                    ImageElement(
+                        filename=elem.not_online_image.file_path.decode(
+                            "utf-8"
+                        ),
+                        size=elem.not_online_image.file_len,
+                        width=elem.not_online_image.pic_width,
+                        height=elem.not_online_image.pic_height,
+                        md5=elem.not_online_image.pic_md5,
+                        url="https://c2cpicdw.qpic.cn/offpic_new/0/"
+                        + (
+                            elem.not_online_image.res_id
+                            or elem.not_online_image.download_path
+                        ).decode("utf-8")
+                        + "/0",
+                    )
+                )
+        elif elem.HasField("open_qq_data"):
+            res.append(CustomDataElement(data=elem.open_qq_data.car_qq_data))
+        elif elem.HasField("common_elem"):
+            service_type = elem.common_elem.service_type
+            # PokeMsgElemDecoder
+            if service_type == 2:
+                poke = MsgElemInfo_servtype2.FromString(
+                    elem.common_elem.pb_elem
+                )
+                res = [
+                    PokeElement(
+                        poke.poke_type
+                        if poke.vaspoke_id == 0xFFFFFFFF
+                        else poke.vaspoke_id,
+                        poke.vaspoke_name.decode("utf-8"),
+                        poke.poke_strength,
+                        poke.double_hit,
+                    )
+                ]
+                break
+            elif service_type == 3:
+                flash = MsgElemInfo_servtype3.FromString(
+                    elem.common_elem.pb_elem
+                )
+                if flash.flash_troop_pic:
+                    res.append(
+                        FlashImageElement(
+                            id=flash.flash_troop_pic.file_id,
+                            filename=flash.flash_troop_pic.file_path,
+                            filetype=flash.flash_troop_pic.file_type,
+                            size=flash.flash_troop_pic.size,
+                            md5=flash.flash_troop_pic.md5,
+                            width=flash.flash_troop_pic.width,
+                            height=flash.flash_troop_pic.height,
+                            url=f"https://gchat.qpic.cn/gchatpic_new/0/0-0-{flash.flash_troop_pic.md5.hex().upper()}/0",
+                        )
+                    )
+                break
+            # TextElemDecoder
+            elif service_type == 33:
+                info = MsgElemInfo_servtype33.FromString(
+                    elem.common_elem.pb_elem
+                )
+                res.append(FaceElement(info.index))
+        elif elem.HasField("shake_window"):
+            res.append(
+                ShakeElement(
+                    stype=elem.shake_window.type, uin=elem.shake_window.uin
+                )
+            )
+        elif elem.HasField("trans_elem_info"):
+            if elem.trans_elem_info.elem_type == 24:  # QQ File
+                if elem.trans_elem_info.elem_value[0]:
+                    obj = ObjMsg.FromString(elem.trans_elem_info.elem_value[3:])
+                    for info in obj.content_info:
+                        res.append(
+                            GroupFileElement(
+                                info.file.file_name,
+                                info.file.file_size,
+                                info.file.file_path.decode(),
+                                bytes.fromhex(info.file.file_md5.decode()),
+                            )
+                        )
+        index += 1
+    return res
+
+
+def parse_ptt(ptt: Ptt) -> VoiceElement:
+    """Parse message ptt elements.
+
+    Note:
+        Source: com.tencent.mobileqq.service.message.codec.decoder.PTTDecoder
+
+    Args:
+        ptt (Ptt): ptt element in msg
+
+    Returns:
+        VoiceElement: Parsed VoiceElement object.
+    """
+    return VoiceElement(
+        file_name=ptt.file_name.decode(),
+        file_type=ptt.file_type,
+        file_size=ptt.file_size,
+        file_uuid=ptt.file_uuid,
+        file_md5=ptt.file_md5,
+        url=ptt.down_para.decode(),
+    )
diff --git a/cai/client/message_service/models.py b/cai/client/message/models.py
similarity index 78%
rename from cai/client/message_service/models.py
rename to cai/client/message/models.py
index 60547d19..5ac921b9 100644
--- a/cai/client/message_service/models.py
+++ b/cai/client/message/models.py
@@ -28,39 +28,6 @@ class PokeType(IntEnum):
     FangDaZhao = 6
 
 
-@dataclass
-class PrivateMessage(Event):
-    _msg: Msg
-    seq: int
-    time: int
-    auto_reply: bool
-    from_uin: int
-    from_nick: str
-    to_uin: int
-    message: List["Element"]
-
-    @property
-    def type(self) -> str:
-        return "private_message"
-
-
-@dataclass
-class GroupMessage(Event):
-    _msg: Msg
-    seq: int
-    time: int
-    group_id: int
-    group_name: str
-    group_level: int
-    from_uin: int
-    from_group_card: str
-    message: List["Element"]
-
-    @property
-    def type(self) -> str:
-        return "group_message"
-
-
 class Element(abc.ABC):
     @property
     @abc.abstractmethod
@@ -156,11 +123,10 @@ def type(self) -> str:
 class VoiceElement(Element):
     file_name: str
     file_type: int
-    from_uin: int
-    md5: bytes
-    size: int
-    group_file_key: bytes
-    url: str = None
+    file_size: int
+    file_uuid: bytes
+    file_md5: bytes
+    url: str
 
     @property
     def type(self) -> str:
@@ -170,16 +136,16 @@ def type(self) -> str:
     def _pb_reserve(self) -> bytes:
         return bytes([8, 0, 40, 0, 56, 0])
 
-    def to_ptt(self) -> Ptt:
-        return Ptt(
-            file_type=self.file_type,
-            src_uin=self.from_uin,
-            file_md5=self.md5,
-            file_name=self.file_name.encode(),
-            file_size=self.size,
-            pb_reserve=self._pb_reserve,
-            valid=True,
-        )
+    # def to_ptt(self) -> Ptt:
+    #     return Ptt(
+    #         file_type=self.file_type,
+    #         src_uin=self.from_uin,
+    #         file_md5=self.md5,
+    #         file_name=self.file_name.encode(),
+    #         file_size=self.size,
+    #         pb_reserve=self._pb_reserve,
+    #         valid=True,
+    #     )
 
 
 @dataclass
diff --git a/cai/client/message_service/__init__.py b/cai/client/message_service/__init__.py
index acdf0c69..190a6f55 100644
--- a/cai/client/message_service/__init__.py
+++ b/cai/client/message_service/__init__.py
@@ -19,7 +19,7 @@
 from cai.pb.msf.msg.svc import PbGetMsgReq, PbDeleteMsgReq
 
 from .decoders import MESSAGE_DECODERS
-from .models import GroupMessage, PrivateMessage
+from ..message.models import GroupMessage, PrivateMessage
 from .command import (
     PushNotify,
     GetMessageFail,
diff --git a/cai/client/message_service/decoders.py b/cai/client/message_service/decoders.py
index 4ea14826..9b3dd5f4 100644
--- a/cai/client/message_service/decoders.py
+++ b/cai/client/message_service/decoders.py
@@ -8,279 +8,13 @@
 .. _LICENSE:
     https://github.com/cscs181/CAI/blob/master/LICENSE
 """
-import zlib
 from itertools import chain
-from typing import Dict, List, Callable, Optional, Sequence
+from typing import Dict, List, Callable, Optional
 
 from cai.log import logger
-from cai.client.events import Event
 from cai.pb.msf.msg.comm import Msg
-from cai.pb.im.msg.msg_body import Ptt, Elem
-from cai.pb.im.msg.obj_msg import ObjMsg
-from cai.pb.im.msg.service.comm_elem import (
-    MsgElemInfo_servtype2,
-    MsgElemInfo_servtype3,
-    MsgElemInfo_servtype33,
-)
-
-from .models import (
-    Element,
-    AtElement,
-    FaceElement,
-    PokeElement,
-    TextElement,
-    AtAllElement,
-    GroupMessage,
-    ImageElement,
-    ReplyElement,
-    ShakeElement,
-    VoiceElement,
-    PrivateMessage,
-    RichMsgElement,
-    CustomDataElement,
-    FlashImageElement,
-    SmallEmojiElement,
-    GroupFileElement,
-)
-
-
-def parse_elements(elems: Sequence[Elem], ptt: Optional[Ptt]) -> List[Element]:
-    """Parse message rich text elements.
-
-    Only parse ``text``, ``face``, ``small_smoji``, ``common_elem service 33``
-    for plain text.
-
-    Note:
-        Source: com.tencent.imcore.message.ext.codec.decoder.pbelement.*
-
-    Args:
-        elems (Sequence[Elem]): Sequence of rich text elements.
-        ptt (Ptt)
-
-    Returns:
-        List[Element]: List of decoded message elements.
-    """
-    if ptt:
-        if ptt.file_name.endswith(b".amr"):
-            info = {}
-            for bl in ptt.down_para.decode().split("&")[1:]:
-                k, v = bl.split("=", 1)
-                info[k] = v
-            return [
-                VoiceElement(
-                    ptt.file_name.decode(),
-                    info["filetype"],
-                    ptt.src_uin,
-                    ptt.file_md5,
-                    ptt.file_size,
-                    bytes.fromhex(info["rkey"]),
-                    "https://grouptalk.c2c.qq.com" + ptt.down_para.decode(),
-                )
-            ]
-    res: List[Element] = []
-    index = 0
-    while index < len(elems):
-        elem = elems[index]
-        # SrcElemDecoder
-        if elem.HasField("src_msg"):
-            if len(elem.src_msg.orig_seqs) > 0:
-                # preprocess
-                # Delete redundancy data
-                if index == 2:  # Sent by PC
-                    res = []
-                else:
-                    index += 1  # pass
-                res.append(
-                    ReplyElement(
-                        elem.src_msg.orig_seqs[0],
-                        elem.src_msg.time,
-                        elem.src_msg.sender_uin,
-                        parse_elements(elem.src_msg.elems, None),
-                        elem.src_msg.troop_name.decode("utf-8") or None,
-                    )
-                )
-        # TextElemDecoder
-        elif elem.HasField("text"):
-            if elem.text.attr_6_buf:
-                if elem.text.attr_6_buf[6]:  # AtAll
-                    res.append(AtAllElement())
-                else:
-                    res.append(
-                        AtElement(
-                            int.from_bytes(
-                                elem.text.attr_6_buf[7:11], "big", signed=False
-                            ),
-                            elem.text.str.decode("utf-8"),
-                        )
-                    )
-            else:
-                res.append(TextElement(elem.text.str.decode("utf-8")))
-        elif elem.HasField("rich_msg"):
-            if elem.rich_msg.template_1[0]:
-                content = zlib.decompress(elem.rich_msg.template_1[1:])
-            else:
-                content = elem.rich_msg.template_1[1:]
-            return [
-                RichMsgElement(
-                    content,
-                    elem.rich_msg.service_id if content[0] == 60 else -1,
-                )
-            ]
-        elif elem.HasField("light_app"):
-            if elem.light_app.data[0]:
-                content = zlib.decompress(elem.light_app.data[1:])
-            else:
-                content = elem.light_app.data[1:]
-            return [RichMsgElement(content, -2)]
-        # TextElemDecoder
-        elif elem.HasField("face"):
-            res.append(FaceElement(elem.face.index))
-        # TextElemDecoder
-        elif elem.HasField("small_emoji"):
-            index += 1
-            text = elems[index].text.str.decode("utf-8")
-            res.append(
-                SmallEmojiElement(
-                    elem.small_emoji.pack_id_sum,
-                    text,
-                    # bytes(
-                    #     [
-                    #         0x1FF
-                    #         if elem.small_emoji.image_type & 0xFFFF == 2
-                    #         else 0xFF,
-                    #         elem.small_emoji.pack_id_sum & 0xFFFF,
-                    #         elem.small_emoji.pack_id_sum >> 16 & 0xFF,
-                    #         elem.small_emoji.pack_id_sum >> 24,
-                    #     ]
-                    # ),
-                )
-            )
-        # PictureElemDecoder
-        elif elem.HasField("custom_face"):
-            if elem.custom_face.md5 and elem.custom_face.orig_url:
-                res.append(
-                    ImageElement(
-                        filename=elem.custom_face.file_path,
-                        size=elem.custom_face.size,
-                        width=elem.custom_face.width,
-                        height=elem.custom_face.height,
-                        md5=elem.custom_face.md5,
-                        url="https://gchat.qpic.cn" + elem.custom_face.orig_url,
-                    )
-                )
-            elif elem.custom_face.md5:
-                res.append(
-                    ImageElement(
-                        filename=elem.custom_face.file_path,
-                        size=elem.custom_face.size,
-                        width=elem.custom_face.width,
-                        height=elem.custom_face.height,
-                        md5=elem.custom_face.md5,
-                        url="https://gchat.qpic.cn/gchatpic_new/0/0-0-"
-                        + elem.custom_face.md5.decode().upper()
-                        + "/0",
-                    )
-                )
-        # PictureElemDecoder
-        elif elem.HasField("not_online_image"):
-            if elem.not_online_image.orig_url:
-                res.append(
-                    ImageElement(
-                        filename=elem.not_online_image.file_path.decode(
-                            "utf-8"
-                        ),
-                        size=elem.not_online_image.file_len,
-                        width=elem.not_online_image.pic_width,
-                        height=elem.not_online_image.pic_height,
-                        md5=elem.not_online_image.pic_md5,
-                        url="https://c2cpicdw.qpic.cn"
-                        + elem.not_online_image.orig_url,
-                    )
-                )
-            elif (
-                elem.not_online_image.res_id
-                or elem.not_online_image.download_path
-            ):
-                res.append(
-                    ImageElement(
-                        filename=elem.not_online_image.file_path.decode(
-                            "utf-8"
-                        ),
-                        size=elem.not_online_image.file_len,
-                        width=elem.not_online_image.pic_width,
-                        height=elem.not_online_image.pic_height,
-                        md5=elem.not_online_image.pic_md5,
-                        url="https://c2cpicdw.qpic.cn/offpic_new/0/"
-                        + (
-                            elem.not_online_image.res_id
-                            or elem.not_online_image.download_path
-                        ).decode("utf-8")
-                        + "/0",
-                    )
-                )
-        elif elem.HasField("open_qq_data"):
-            res.append(CustomDataElement(data=elem.open_qq_data.car_qq_data))
-        elif elem.HasField("common_elem"):
-            service_type = elem.common_elem.service_type
-            # PokeMsgElemDecoder
-            if service_type == 2:
-                poke = MsgElemInfo_servtype2.FromString(
-                    elem.common_elem.pb_elem
-                )
-                res = [
-                    PokeElement(
-                        poke.poke_type
-                        if poke.vaspoke_id == 0xFFFFFFFF
-                        else poke.vaspoke_id,
-                        poke.vaspoke_name.decode("utf-8"),
-                        poke.poke_strength,
-                        poke.double_hit,
-                    )
-                ]
-                break
-            elif service_type == 3:
-                flash = MsgElemInfo_servtype3.FromString(
-                    elem.common_elem.pb_elem
-                )
-                if flash.flash_troop_pic:
-                    res.append(
-                        FlashImageElement(
-                            id=flash.flash_troop_pic.file_id,
-                            filename=flash.flash_troop_pic.file_path,
-                            filetype=flash.flash_troop_pic.file_type,
-                            size=flash.flash_troop_pic.size,
-                            md5=flash.flash_troop_pic.md5,
-                            width=flash.flash_troop_pic.width,
-                            height=flash.flash_troop_pic.height,
-                            url=f"https://gchat.qpic.cn/gchatpic_new/0/0-0-{flash.flash_troop_pic.md5.hex().upper()}/0",
-                        )
-                    )
-                break
-            # TextElemDecoder
-            elif service_type == 33:
-                info = MsgElemInfo_servtype33.FromString(
-                    elem.common_elem.pb_elem
-                )
-                res.append(FaceElement(info.index))
-        elif elem.HasField("shake_window"):
-            res.append(
-                ShakeElement(
-                    stype=elem.shake_window.type, uin=elem.shake_window.uin
-                )
-            )
-        elif elem.HasField("trans_elem_info"):
-            if elem.trans_elem_info.elem_type == 24:  # QQ File
-                if elem.trans_elem_info.elem_value[0]:
-                    obj = ObjMsg.FromString(elem.trans_elem_info.elem_value[3:])
-                    for info in obj.content_info:
-                        res.append(GroupFileElement(
-                            info.file.file_name,
-                            info.file.file_size,
-                            info.file.file_path.decode(),
-                            bytes.fromhex(info.file.file_md5.decode())
-                        ))
-        index += 1
-    return res
+from cai.client.message import parse_ptt, parse_elements
+from cai.client.events import Event, GroupMessageEvent, PrivateMessageEvent
 
 
 class BuddyMessageDecoder:
@@ -304,7 +38,7 @@ def decode(cls, message: Msg) -> Optional[Event]:
             # 242: OfflineFileDecoder,
             # 243: OfflineFileDecoder,
         }
-        Decoder = sub_decoders.get(message.head.c2c_cmd, None)
+        Decoder = sub_decoders.get(message.head.c2c_cmd)
         if not Decoder:
             logger.debug(
                 "MessageSvc.PbGetMsg: BuddyMessageDecoder cannot "
@@ -338,18 +72,20 @@ def decode_normal_buddy(cls, message: Msg) -> Optional[Event]:
         from_uin = message.head.from_uin
         from_nick = message.head.from_nick
         to_uin = message.head.to_uin
-        elems = message.body.rich_text.elems
-        ptt = message.body.rich_text.ptt
-
-        return PrivateMessage(
-            message,
-            seq,
-            time,
-            auto_reply,
-            from_uin,
-            from_nick,
-            to_uin,
-            parse_elements(elems, ptt),
+        parsed_elems = []
+        if message.body.rich_text.HasField("ptt"):
+            parsed_elems.append(parse_ptt(message.body.rich_text.ptt))
+        parsed_elems.extend(parse_elements(message.body.rich_text.elems))
+
+        return PrivateMessageEvent(
+            _msg=message,
+            seq=seq,
+            time=time,
+            auto_reply=auto_reply,
+            user_id=from_uin,
+            user_nick=from_nick,
+            to_id=to_uin,
+            message=parsed_elems,
         )
 
 
@@ -383,8 +119,13 @@ def decode(cls, message: Msg) -> Optional[Event]:
         from_uin = message.head.from_uin
         troop = message.head.group_info
         content_head = message.content_head
+        parsed_elems = []
+        ptts = (
+            [message.body.rich_text.ptt]
+            if message.body.rich_text.HasField("ptt")
+            else []
+        )
         elems = message.body.rich_text.elems
-        ptt = message.body.rich_text.ptt
 
         # long msg fragment
         if content_head.pkg_num > 1:
@@ -396,25 +137,29 @@ def decode(cls, message: Msg) -> Optional[Event]:
                 return
 
             cls.long_msg_fragment_store.pop(content_head.div_seq)
+            f = sorted(fragments, key=lambda f: f.content_head.pkg_index)
+            ptts = [
+                msg.body.rich_text.ptt
+                for msg in f
+                if msg.body.rich_text.HasField("ptt")
+            ]
             elems = list(
-                chain.from_iterable(
-                    msg.body.rich_text.elems
-                    for msg in sorted(
-                        fragments, key=lambda f: f.content_head.pkg_index
-                    )
-                )
+                chain.from_iterable(msg.body.rich_text.elems for msg in f)
             )
 
-        return GroupMessage(
-            message,
-            seq,
-            time,
-            troop.group_code,
-            troop.group_name.decode("utf-8"),
-            troop.group_level,
-            from_uin,
-            troop.group_card.decode("utf-8"),
-            parse_elements(elems, ptt),
+        parsed_elems.extend(map(parse_ptt, ptts))
+        parsed_elems.extend(parse_elements(elems))
+
+        return GroupMessageEvent(
+            _msg=message,
+            seq=seq,
+            time=time,
+            group_id=troop.group_code,
+            group_name=troop.group_name.decode("utf-8"),
+            group_level=troop.group_level,
+            from_uin=from_uin,
+            from_group_card=troop.group_card.decode("utf-8"),
+            message=parsed_elems,
         )
 
 
diff --git a/cai/client/message_service/encoders.py b/cai/client/message_service/encoders.py
index aba6b6fa..1ef8be04 100644
--- a/cai/client/message_service/encoders.py
+++ b/cai/client/message_service/encoders.py
@@ -22,7 +22,7 @@
     OpenQQData
 )
 
-from . import models
+from ..message import models
 
 # todo: https://github.com/mamoe/mirai/blob/7d3971259de59cede94b7a55650c8a6ad4346a59/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbSendMsg.kt#L103
 # https://github.com/mamoe/mirai/blob/74fc5a50376ed0330b984af51e0fabc2147afdbb/mirai-core/src/commonMain/kotlin/contact/SendMessageHandler.kt
diff --git a/examples/login.py b/examples/login.py
index b523fa46..ee946f8c 100644
--- a/examples/login.py
+++ b/examples/login.py
@@ -18,7 +18,7 @@
 from PIL import Image
 
 from cai.api import Client, make_client
-from cai.client.message_service.models import TextElement
+from cai.client.message.models import TextElement
 from cai.client import Event, GroupMessage, OnlineStatus, PrivateMessage
 from cai.exceptions import (
     LoginException,