[
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "<!--\n提 issue 前，请先完成以下四步：\n\n1. 确保微信小助手是最新版本，没有请更新.\n2. 请搜索下是否有人发了相同的 issue，可以的话请在相同的 issue 下描述自己的问题，避免 duplicate issue.\n3. 请详细查看 Wiki 中的常见问题解决方法。Wiki地址：https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/wiki\n4. 如果是 oh-my-wechat 、wechat-alfred-workflow、LaunchBar 的问题，请到各自的项目提 issue。\n\n如果以上四步仍然没有解决问题，那么请遵从以下的规范描述您的问题。\n之后可以点击上方的 Preview 进行预览。\n-->\n\n### 问题描述\n<!--描述问题发生的场景，最好能够复现 -->\n\n### 版本\n<!--请提供macOS、微信、微信小助手当前的版本-->\n* MacOS Version:\n* WeChat Version:\n* WeChatPlugin Version:\n\n### 日志\n<!--如果有崩溃的话，提供下崩溃日志，没有的话请删除这部分。-->\n\n"
  },
  {
    "path": ".gitignore",
    "content": "# Xcode\n#\n.DS_Store\n*.xcuserstate\n\n# CocoaPods\n#\nPods/\nPodfile.lock\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# 更新日志 \n\n### [v2.0 (2023-03-12)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v2.)\n\n- 适配 3.7.0\n- 新增撤回消息定位\n- 新增群聊监控\n- 移除官方已支持的功能（自动登录，移除会话，标为未读等等）\n\n### [v1.7.5 (2019-01-13)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7.5)\n\n- 适配 2.3.22\n- 新增禁止微信检测更新开关\n- 优化 XML解析(在此感谢 @wangliangliang2 提醒)\n\n###[v1.7.3 (2018-10-23)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7.3)\n\n- 适配2.3.19\n- 菜单栏新增 alfred 开关\n- 更改更新弹窗逻辑\n- 新增自带浏览器浏览开关\n\n### [v1.7.1 (2018-07-24)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7.1)\n\n* 适配微信 Version. 2.3.17\n* 新增 alfred 搜索最近聊天列表\n* 新增 alfred 查看用户聊天记录\n\n### [v1.7 (2018-05-12)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7)\n\n* 新增不同账户设置不同的自动回复&远程控制\n* 自动回复新增总开关&指定联系人\n* 远程控制新增控制小助手配置\n* 新增一键已读\n* 新增一键清除空回话\n* 新增国际化(支持英、简、繁)\n* 新增关于小助手\n* 新增在线更新小助手\n* 去除微信url转链处理(从此直接打开抖音链接🌝\n* 修复无法免认证登录&多开等bug\n\n### [v1.6.1 (2018-04-07)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6.1)\n\n* 自动回复新增延迟回复\n* 调整置顶模式快捷键\n* 修复bug & 优化代码\n* 更新 README.md 文档 \n\n### [v1.6 (2018-03-18)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6)\n\n* 新增 Alfred 快捷发送消息 & 打开聊天窗口\n\n### [v1.5.1 (2018-03-03)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.1)\n\n* 新增语音远程控制 mac\n* 修复快捷回复后消息未读数未更新的问题\n* 优化防撤回提醒 (显示撤回人昵称 & 消息类型)\n\n### [v1.5.0 (2018-02-24)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.0)\n\n* 优化防撤回提醒\n* 新增自动登录开关\n* 新增小助手检测更新\n* 新增通知中心快捷回复\n* 新增表情包复制 & 存储\n* 自动回复 & 远程控制设置存储到本地\n\n### [v1.4.0 (2017-10-11)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.4.0)\n\n* 新增微信窗口置顶\n* 新增最近联系人多选删除\n* 新增远程控制信息回调\n* 新增手机端获取指令信息\n\n### [v1.3.0 (2017-09-17)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.3.0)\n\n* 新增最近联系人置底功能\n* 新增免认证登录\n\n### [v1.2.0 (2017-09-11)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.2.0)\n\n* 自动回复新增 正则匹配 & 私聊开关\n* 修复聊天记录消失 & `~/Documents` 生成MMappedKV、JietuSDKStat.plist 文件\n\n\n### [v1.1.0 (2017-08-23)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.1.0)\n\n* 重构 自动回复，实现多回复\n* 优化 代码结构\n\n### [v1.0.1 (2017-08-18)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.0.1)\n\n* 修复 部分防撤回提示乱码的bug\n* 新增 Install.sh  & Uninstall.sh   \n\n### [v1.0.0 (2017-08-09)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.0.0)\n\n* 新增 远程控制\n* 新增 微信多开\n* 优化 消息防撤回\n* 优化 自动回复\n\n"
  },
  {
    "path": "Install.md",
    "content": "\n\n## Install\n\n**第一次安装需要输入密码，仅是为了获取写入微信文件夹的权限**\n\n**0. 懒癌版安装&升级**\n\n打开`应用程序-实用工具-Terminal(终端)`，执行下面的命令安装 [Oh My WeChat](https://github.com/lmk123/oh-my-wechat)：\n\n```sh\ncurl -o- -L https://raw.githubusercontent.com/lmk123/oh-my-wechat/master/install.sh | bash -s\n```\n\n然后运行 `omw` 即可。\n\n> 可以访问 [Oh My WeChat 的项目主页](https://github.com/lmk123/oh-my-wechat#oh-my-wechat)查看更多用法。\n\n**1. 普通安装**\n\n* 点击`clone or download`按钮下载 WeChatPlugin 并解压\n\n![clone or download](./Other/ScreenShots/install_download.png)\n\n* 从`应用程序-实用工具`中打开Terminal(终端)\n\n![terminal](./Other/ScreenShots/terminal_path.png)\n\n* 拖动解压后`Install.sh` 文件到终端中回车即可.\n\n![terminal](./Other/ScreenShots/install_terminal.png)\n\n**2. 若想修改源码&重编译(需要安装Cocoapods)**\n\n* 先更改微信的 owner 以获取写入微信文件夹的权限，否则会出现类似**Permission denied**的错误。\n\n`sudo chown -R $(whoami) /Applications/WeChat.app`\n\n![Permission denied.png](http://upload-images.jianshu.io/upload_images/965383-11e4480553ba086e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n* 下载 WeChatPlugin, 进行`Pod install`。\n* 用Xcode打开，编辑 Scheme，在 Debug 模式下启动 WeChat。\n![](http://upload-images.jianshu.io/upload_images/965383-26dbb068acb8998f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n![edit scheme](http://upload-images.jianshu.io/upload_images/965383-7fbd4dc6e8d161dc.gif?imageMogr2/auto-orient/strip)\n* 之后 Run (`command + R`)即可启动微信，此时插件注入完成。\n\n* 若 Error，提示找不到 Framework，先进行 Build。\n* 若Error, 需要配置环境，请参考[我的博客](http://www.tkkk.fun/2017/04/21/macOS%E9%80%86%E5%90%91-%E5%BE%AE%E4%BF%A1%E5%B0%8F%E5%8A%A9%E6%89%8B/)。\n\n## 卸载\n\n* 打开Terminal(终端)，拖动解压后`Uninstall.sh` 文件到 Terminal 回车即可。"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 TK\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Other/Install.sh",
    "content": "#!/bin/bash\n\nwechat_path=\"/Applications/WeChat.app\"\n\nif [ ! -d \"$wechat_path\" ]\nthen\nwechat_path=\"/Applications/微信.app\"\nif [ ! -d \"$wechat_path\" ]\nthen\necho -e \"\\n\\n应用程序文件夹中未发现微信，请检查微信是否有重命名或者移动路径位置\"\nexit\nfi\nfi\n\napp_name=\"WeChat\"\nshell_path=\"$(dirname \"$0\")\"\nframework_name=\"WeChatPlugin\"\napp_bundle_path=\"${wechat_path}/Contents/MacOS\"\napp_executable_path=\"${app_bundle_path}/${app_name}\"\napp_executable_backup_path=\"${app_executable_path}_backup\"\nframework_path=\"${app_bundle_path}/${framework_name}.framework\"\n\n\n# 对 WeChat 赋予权限\nif [ ! -w \"$wechat_path\" ]\nthen\necho -e \"\\n\\n为了将小助手写入微信, 请输入密码 ： \"\nsudo chown -R $(whoami) \"$wechat_path\"\nfi\n\n# 判断是否已经存在备份文件 或者 是否强制覆盖安装\nif [ ! -f \"$app_executable_backup_path\" ] || [ -n \"$1\" -a \"$1\" = \"--force\" ]\nthen\n# 备份 WeChat 原始可执行文件\ncp \"$app_executable_path\" \"$app_executable_backup_path\"\nresult=\"y\"\nelse\nread -t 150 -p \"已安装微信小助手，是否覆盖？[y/n]:\" result\nfi\n\nif [[ \"$result\" == 'y' ]]; then\n    cp -r \"${shell_path}/Products/Debug/${framework_name}.framework\" ${app_bundle_path}\n    ${shell_path}/insert_dylib --all-yes \"${framework_path}/${framework_name}\" \"$app_executable_backup_path\" \"$app_executable_path\"\nfi\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Headers/WeChatPlugin.h",
    "content": "//\n//  WeChatPlugin.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n#import \"TKWeChatPluginConfig.h\"\n#import \"TKHelper.h\"\n\nFOUNDATION_EXPORT double WeChatPluginVersionNumber;\nFOUNDATION_EXPORT const unsigned char WeChatPluginVersionString[];\n\n@class WCContactData;\n\n#pragma mark - 微信原始的部分类与方法\n\n@interface MMSystemLinkInfo : NSObject\n@property(retain, nonatomic) NSMutableAttributedString *msgContent;\n\n@end\n@interface MMContactProfileController : NSViewController\n@property(copy, nonatomic) NSString *groupName;\n@property(nonatomic) struct CGRect relativeToRect;\n@property(nonatomic) unsigned long long preferredEdge;\n@property(retain, nonatomic) WCContactData *contactData;\n- (void)sendGetContactRequest:(id)arg1 withGroupName:(id)arg2;\n- (void)showInView:(id)arg1;\n@end\n\n\n@interface MMBrandChatsViewController : NSObject\n- (void)startChatWithContact:(id)arg1;\n@end\n\n@interface MMLoginOneClickViewController : NSViewController\n@property(nonatomic) NSTextField *descriptionLabel;\n- (void)onLoginButtonClicked:(id)arg1;\n@property(nonatomic) NSButton *loginButton;\n@end\n\n@interface AccountService : NSObject\n- (id)GetLastLoginUserName;\n- (id)GetLastLoginAutoAuthKey;\n- (BOOL)canAutoAuth;\n- (void)AutoAuth;\n- (void)ManualLogin:(id)arg1 withPassword:(id)arg2;\n- (void)ManualLogout;\n- (void)FFAddSvrMsgImgVCZZ;\n- (void)QRCodeLoginWithUserName:(id)arg1 password:(id)arg2;\n- (void)onAuthOKOfUser:(id)arg1 withSessionKey:(id)arg2 withServerId:(id)arg3 autoAuthKey:(id)arg4 isAutoAuth:(BOOL)arg5;\n@end\n\n@interface MMLoginViewController : NSObject\n@property(retain, nonatomic) MMLoginOneClickViewController *oneClickViewController;\n@end\n\n@interface MMHandoffButton : NSView\n@end\n\n@interface MMMainViewController : NSObject\n@property(nonatomic) __weak MMHandoffButton *handoffButton;\n@end\n\n@interface MMMainWindowController : NSWindowController\n@property(retain, nonatomic) MMLoginViewController *loginViewController;\n@property(retain, nonatomic) MMMainViewController *mainViewController;\n- (void)onAuthOK;\n- (void)onLogOut;\n@end\n\n@interface MMVoiceTranscribeCGI : NSObject\n- (void)transcribeVoiceMessage:(id)arg1 withCompletion:(void (^)(void))arg2;\n@end\n\n@interface FFProcessReqsvrZZ : NSObject\n- (void)onRevokeMsg:(id)arg1;\n- (void)FFToNameFavChatZZ:(id)arg1;\n- (void)FFToNameFavChatZZ:(id)arg1 sessionMsgList:(id)arg2;\n- (void)OnSyncBatchAddMsgs:(NSArray *)arg1 isFirstSync:(BOOL)arg2;\n- (void)FFImgToOnFavInfoInfoVCZZ:(id)arg1 isFirstSync:(BOOL)arg2;\n- (id)FFProcessTReqZZ:(id)arg1 toUsrName:(id)arg2 msgText:(id)arg3 atUserList:(id)arg4;\n- (id)GetMsgData:(id)arg1 svrId:(long)arg2;\n- (void)AddLocalMsg:(id)arg1 msgData:(id)arg2;\n- (void)TranscribeVoiceMessage:(id)arg1 completion:(void (^)(void))arg2;\n- (BOOL)ClearUnRead:(id)arg1 FromID:(unsigned int)arg2 ToID:(unsigned int)arg3;\n- (BOOL)ClearUnRead:(id)arg1 FromCreateTime:(unsigned int)arg2 ToCreateTime:(unsigned int)arg3;\n- (BOOL)HasMsgInChat:(id)arg1;\n- (id)GetMsgListWithChatName:(id)arg1 fromCreateTime:(unsigned int)arg2 localId:(NSInteger)arg3 limitCnt:(NSInteger)arg4 hasMore:(char *)arg5 sortAscend:(BOOL)arg6;\n- (void)DelMsg:(id)arg1 msgList:(id)arg2 isDelAll:(BOOL)arg3 isManual:(BOOL)arg4;\n@end\n\n@interface MMServiceCenter : NSObject\n+ (id)defaultCenter;\n- (id)getService:(Class)arg1;\n@end\n\n@interface SKBuiltinString_t : NSObject\n@property(retain, nonatomic, setter=SetString:) NSString *string; // @synthesize string;\n@end\n\n@interface AddMsg : NSObject\n@property(retain, nonatomic, setter=SetContent:) SKBuiltinString_t *content; // @synthesize content;\n@property(retain, nonatomic, setter=SetFromUserName:) SKBuiltinString_t *fromUserName; // @synthesize fromUserName;\n@property(nonatomic, setter=SetMsgType:) int msgType; // @synthesize msgType;\n@property(retain, nonatomic, setter=SetToUserName:) SKBuiltinString_t *toUserName; // @synthesize toUserName;\n@property (nonatomic, assign) unsigned int createTime;\n@property(nonatomic, setter=SetNewMsgId:) long long newMsgId;\n@end\n\n@interface MMChatMessageViewController : NSViewController\n@property(retain, nonatomic) WCContactData *chatContact;\n@property(nonatomic) __weak NSTableView *messageTableView;\n- (void)scrollToMessage:(NSUInteger)arg1;\n- (BOOL)showLocatedMessage:(NSUInteger)arg1;\n- (BOOL)showLocatedMessage:(unsigned int)arg1 needHighLighted:(BOOL)arg2;\n- (void)onClickSession;\n- (void)reloadTableView;\n@end\n\n@interface MMChatDetailSplitViewController : NSObject\n@property(retain, nonatomic) MMChatMessageViewController *chatMessageViewController;\n@end\n\n@interface MMChatsViewController : NSViewController <NSTableViewDataSource, NSTableViewDelegate>\n@property(nonatomic) __weak NSTableView *tableView;\n@property(retain, nonatomic) MMBrandChatsViewController *brandChatsViewController;\n@property(retain, nonatomic) MMChatDetailSplitViewController *chatDetailSplitViewController;\n@end\n\n@interface WeChat : NSObject\n+ (id)sharedInstance;\n@property(nonatomic) MMChatsViewController *chatsViewController;\n@property(retain, nonatomic) MMMainWindowController *mainWindowController;\n@property(nonatomic) BOOL isAppTerminating;\n@property(nonatomic) BOOL hasAuthOK;\n- (void)startANewChatWithContact:(id)arg1;\n- (void)_clearAllUnreadMessages:(id)arg1;\n- (void)onAuthOK:(BOOL)arg1;\n- (void)checkForUpdatesInBackground;\n- (void)FFAddRecvFavZZ:(BOOL)arg1;\n@end\n\n@interface ContactStorage : NSObject\n- (id)GetSelfContact;\n- (id)GetContact:(id)arg1;\n- (id)GetAllBrandContacts;\n- (id)GetAllFavContacts;\n- (id)GetAllFriendContacts;\n@end\n\n@interface GroupStorage : NSObject\n{\n    NSMutableDictionary *m_dictGroupContacts;\n}\n- (id)GetAllGroups;\n- (id)GetGroupMemberContact:(id)arg1;\n- (void)notifyModifyGroupContactsOnMainThread:(id)arg1;\n//- (id)GetGroupMemberListWithGroupContact:(id)arg1;\n- (id)GetGroupMemberListWithGroupContact:(id)arg1 limit:(unsigned int)arg2 filterSelf:(BOOL)arg3;\n@end\n\n@interface ChatRoomData : NSObject\n{\n    NSMutableDictionary *m_dicData;\n}\n@end\n\n@interface WCContactData : NSObject\n@property(retain, nonatomic) NSString *m_nsUsrName; // @synthesize m_nsUsrName;\n@property(nonatomic) unsigned int m_uiFriendScene;  // @synthesize m_uiFriendScene;\n@property(retain, nonatomic) NSString *m_nsNickName;    // 用户昵称\n@property(retain, nonatomic) NSString *m_nsRemark;      // 备注\n@property(retain, nonatomic) NSString *m_nsHeadImgUrl;  // 头像\n@property(retain, nonatomic) NSString *m_nsHeadHDImgUrl;\n@property(retain, nonatomic) NSString *m_nsHeadHDMd5;\n@property(retain, nonatomic) NSString *m_nsAliasName;\n@property(retain, nonatomic) NSString *avatarCacheKey;\n@property(readonly, nonatomic) unsigned long long groupMemberCount;\n@property(retain, nonatomic) ChatRoomData *m_chatRoomData;\n@property(nonatomic) BOOL m_isShowRedDot;\n- (BOOL)isBrandContact;\n- (BOOL)isSelf;\n- (id)innerGetGroupDisplayName;\n- (NSString *)groupChatDisplayNameInGroup:(id)arg1;\n- (id)getContactDisplayUsrName;\n- (BOOL)isGroupChat;\n- (BOOL)isMMChat;\n- (BOOL)isMMContact;\n- (BOOL)containsMember:(id)arg1;\n- (id)displayRegion;\n- (BOOL)isStickyFolder;\n@end\n\n@interface WCPayInfoItem : NSObject\n@property(retain, nonatomic) NSString *m_nsFeeDesc;\n@end\n\n@interface MessageData : NSObject\n- (id)initWithMsgType:(long long)arg1;\n@property(retain, nonatomic) NSString *fromUsrName;\n@property(retain, nonatomic) NSString *toUsrName;\n@property(retain, nonatomic) NSString *msgContent;\n@property(retain, nonatomic) NSString *msgPushContent;\n@property(retain, nonatomic) NSString *realChatUserName;\n@property(retain, nonatomic) WCPayInfoItem *m_oWCPayInfoItem; // @dynamic m_oWCPayInfoItem;\n@property(retain, nonatomic) NSString *m_nsAppName;\n@property(retain, nonatomic) NSString *m_nsSourceDisplayname;\n@property(nonatomic) int messageType;\n@property(nonatomic) int msgStatus;\n@property(nonatomic) int msgCreateTime;\n@property(nonatomic) int mesLocalID;\n@property(nonatomic) long long mesSvrID;\n@property(retain, nonatomic) NSString *msgVoiceText;\n@property(copy, nonatomic) NSString *m_nsEmoticonMD5;\n- (BOOL)isChatRoomMessage;\n- (NSString *)groupChatSenderDisplayName;\n- (id)getRealMessageContent;\n- (id)getChatRoomUsrName;\n- (BOOL)isSendFromSelf;\n- (BOOL)isCustomEmojiMsg;\n- (BOOL)isImgMsg;\n- (BOOL)isVideoMsg;\n- (BOOL)isVoiceMsg;\n- (BOOL)canForward;\n- (BOOL)IsPlayingSound;\n- (id)summaryString:(BOOL)arg1;\n- (BOOL)isEmojiAppMsg;\n- (BOOL)isAppBrandMsg;\n- (BOOL)IsUnPlayed;\n- (void)SetPlayed;\n@property(retain, nonatomic) NSString *m_nsTitle;\n- (id)originalImageFilePath;\n@property(retain, nonatomic) NSString *m_nsVideoPath;\n@property(retain, nonatomic) NSString *m_nsFilePath;\n@property(retain, nonatomic) NSString *m_nsAppMediaUrl;\n@property(nonatomic) MessageData *m_refMessageData;\n@property(nonatomic) unsigned int m_uiDownloadStatus;\n- (void)SetPlayingSoundStatus:(BOOL)arg1;\n@end\n\n@interface CUtility : NSObject\n+ (BOOL)HasWechatInstance;\n+ (BOOL)FFSvrChatInfoMsgWithImgZZ;\n+ (unsigned long long)getFreeDiskSpace;\n+ (void)ReloadSessionForMsgSync;\n+ (id)GetCurrentUserName;\n+ (id)GetContactByUsrName:(id)arg1;\n+ (BOOL)IsStickyChatsFolder:(id)arg1;\n@end\n\n@interface MMSessionInfoPackedInfo: NSObject\n@property(retain, nonatomic) WCContactData *m_contact;\n@property(retain, nonatomic) MessageData *m_msgData;\n@end\n\n@interface MMSessionInfo : NSObject\n@property(nonatomic) BOOL m_bIsTop; // @synthesize m_bIsTop;\n@property(nonatomic) BOOL m_bShowUnReadAsRedDot;\n@property(nonatomic) BOOL m_isMentionedUnread; // @synthesize\n@property BOOL isInGroupBox; \n@property(retain, nonatomic) NSString *m_nsUserName; // @synthesize m_nsUserName;\n@property(retain, nonatomic) MMSessionInfoPackedInfo *m_packedInfo;\n@property(nonatomic) unsigned int m_uUnReadCount; \n@end\n\n@protocol MMChatsTableCellViewDelegate <NSObject>\n@optional\n- (void)cellViewReloadData:(MMSessionInfo *)arg1;\n@end\n\n@interface MMChatsTableCellView : NSTableCellView\n@property(nonatomic) __weak id <MMChatsTableCellViewDelegate> delegate;\n@property(retain, nonatomic) MMSessionInfo *sessionInfo;\n- (void)menuWillOpen:(id)arg1;\n- (void)contextMenuSticky:(id)arg1;\n- (void)contextMenuDelete:(id)arg1;\n- (void)tableView:(NSTableView *)arg1 rowGotMouseDown:(long long)arg2;\n@end\n\n@interface MMSessionMgr : NSObject\n//@property(retain, nonatomic) NSMutableArray *m_arrSession;\n- (id)getSessionAtIndex:(unsigned long long)arg1;\n- (id)sessionInfoByUserName:(id)arg1;\n- (void)muteSessionByUserName:(id)arg1;\n- (void)onUnReadCountChange:(id)arg1;\n//- (void)TopSessionByUserName:(id)arg1;\n- (void)unmuteSessionByUserName:(id)arg1;\n- (void)untopSessionByUserName:(id)arg1;\n- (void)changeSessionUnreadCountWithUserName:(id)arg1 to:(unsigned int)arg2;\n- (void)removeSessionOfUser:(id)arg1 isDelMsg:(BOOL)arg2;\n- (void)sortSessions;\n- (void)FFDataSvrMgrSvrFavZZ;\n- (id)getContact:(id)arg1;\n- (id)getSessionContact:(id)arg1;\n- (void)onModifyContacts:(id)arg1;\n- (NSMutableArray *)getAllSessions;\n@end\n\n@interface LogoutCGI : NSTableCellView\n- (void)sendLogoutCGIWithCompletion:(id)arg1;\n- (void)FFVCRecvDataAddDataToMsgChatMgrRecvZZ:(id)arg1;\n@end\n\n@interface MMNotificationService : NSObject\n- (id)getNotificationContentWithMsgData:(id)arg1;\n- (void)userNotificationCenter:(id)arg1 didActivateNotification:(id)arg2;\n@end\n\n@interface MMMessageTableItem : NSObject\n@property(retain, nonatomic) MessageData *message;\n@end\n\n@interface MMStickerMessageCellView : NSObject\n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@property(nonatomic) MMChatMessageViewController *delegate;\n- (BOOL)allowCopy;\n- (void)contextMenuCopy;\n- (id)contextMenu;\n@end\n\n@interface MMImageMessageCellView: NSObject\n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@end\n\n@interface MMSystemMessageCellView: NSObject\n@property(nonatomic) id delegate; \n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@property(retain, nonatomic) NSTextView *msgTextView;\n- (void)populateWithMessage:(id)arg1;\n@end\n@interface EmoticonMgr : NSObject\n@property(retain, nonatomic) MessageData *message;\n- (id)getEmotionDataWithMD5:(id)arg1;\n- (id)getEmotionImgWithMD5:(id)arg1;\n- (void)addFavEmoticon:(id)arg1;\n- (void)addEmoticonToUploadQueueWithMD5:(id)arg1;\n- (void)setAppStickerToastViewDelegate:(id)arg1;\n@end\n\n@interface MMComplexContactSearchTaskMgr : NSObject\n+ (id)sharedInstance;\n- (void)doComplexContactSearch:(id)arg1 searchScene:(unsigned long long)arg2 complete:(void (^)(NSString *,NSArray *, NSArray *, NSArray *,id))arg3 cancelable:(BOOL)arg4;\n@end\n\n@interface MMBasicSearchResult : NSObject\n@end\n\n@interface MMSearchResultItem : NSObject\n@property(retain, nonatomic) MMBasicSearchResult *result;\n@end\n\n@interface MMSearchResultContainer : NSObject\n@property(nonatomic) unsigned long long logicSearchResultFlag; // @synthesize\n@end\n\n@interface MMContactSearchLogic : NSObject\n{\n    unsigned long long _logicSearchResultFlag;      // 2.3.19 失效\n}\n@property(retain, nonatomic) NSMutableArray *contactResults;\n- (void)doSearchWithKeyword:(id)arg1 searchScene:(unsigned long long)arg2 resultIsShownBlock:(id)arg3 completion:(id)arg4;\n@property(retain, nonatomic) NSMutableArray *groupResults;\n@property(nonatomic) BOOL isBrandContactSearched;\n@property(nonatomic) BOOL isChatLogSearched;\n@property(nonatomic) BOOL isContactSearched;\n@property(nonatomic) BOOL isGroupContactSearched;\n@property(retain, nonatomic) NSMutableArray *oaResults;\n- (void)clearAllResults;    //  2.3.19 失效\n- (void)clearDataWhenSearchEnd;\n- (void)reloadSearchResultDataWithKeyword:(id)arg1 completionBlock:(id)arg2;    //  2.3.17\n- (void)reloadSearchResultDataWithCompletionBlock:(id)arg1;                     //  2.3.13\n- (void)reloadSearchResultDataWithKeyword:(id)arg1 resultContainer:(id)arg2 completionBlock:(id)arg3;\n@property(retain, nonatomic) MMSearchResultContainer *searchResultContainer;\n@end\n\n@interface MMComplexContactSearchResult : MMBasicSearchResult\n@property(retain, nonatomic) NSString *fieldValue;\n@property(retain, nonatomic) WCContactData *contact;\n@property(nonatomic) unsigned long long fieldType;  // 1：备注 3：昵称 4：微信号  8：省份  7：市  9：国家\n@end\n\n@interface MMComplexGroupContactMembersSearchResult : MMBasicSearchResult\n@property(retain, nonatomic) NSMutableArray<MMComplexContactSearchResult *> *membersSearchReults;\n@end\n\n@interface MMComplexGroupContactSearchResult : MMBasicSearchResult\n@property(nonatomic) unsigned long long searchType;     // 1 名称 2 群成员名称\n@property(retain) WCContactData *groupContact;\n@property(retain, nonatomic) MMComplexGroupContactMembersSearchResult *groupMembersResult;\n@end\n\n@interface MMAvatarService : NSObject\n- (NSString *)avatarCachePath;\n- (id)_getImageFromCacheWithMD5Key:(id)arg1;\n- (void)avatarImageWithContact:(id)arg1 completion:(void (^)(NSImage *image))arg2;\n- (void)getAvatarImageWithContact:(id)arg1 completion:(void (^)(NSImage *image))arg2;\n@end\n\n@interface NSString (MD5)\n- (id)md5String;\n@end\n\n@interface MMSessionPickerLogic : NSObject\n@property(nonatomic) NSArray *selectedUserNames;\n@end\n\n\n@interface MMSessionListView : NSObject\n{\n    MMSessionPickerLogic *m_logic;\n}\n@end\n\n@interface MMSessionPickerWindow : NSWindowController\n+ (id)shareInstance;\n- (void)beginSheetForWindow:(id)arg1 completionHandler:(void(^)(id a1))arg2;\n@property(retain, nonatomic) id choosenViewController; // @synthesize\n@property(retain, nonatomic) id listViewController; // @synthesize\n- (void)setShowsGroupChats:(BOOL)arg1;\n- (void)setShowsOfficialAccounts:(BOOL)arg1;\n- (void)setShowsOtherNonhumanChats:(BOOL)arg1;\n- (void)setType:(unsigned long long)arg1;\n\n@end\n\n@interface AFHTTPResponseSerializer : NSObject\n@end\n\n@interface AFURLSessionManager : NSObject\n- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request\n                                             progress:(void (^)(NSProgress *downloadProgress))downloadProgressBlock\n                                          destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination\n                                    completionHandler:(void (^)(NSURLResponse *response, NSURL * filePath, NSError * error))completionHandler;\n- (id)initWithSessionConfiguration:(id)arg1;\n@end\n\n@interface AFHTTPRequestSerializer : NSObject\n+ (id)serializer;\n@property(nonatomic) unsigned long long cachePolicy;\n@end\n\n@interface AFHTTPSessionManager : NSObject\n+ (AFHTTPSessionManager *)manager;\n@property(retain, nonatomic) AFHTTPRequestSerializer *requestSerializer;\n@property(retain, nonatomic) AFHTTPResponseSerializer *responseSerializer;\n@end\n\n@interface MMURLHandler : NSObject\n+ (id)defaultHandler;\n- (void)startGetA8KeyWithURL:(id)arg1;\n- (BOOL)openURLWithDefault:(id)arg1;\n+ (BOOL)containsHTTPString:(id)arg1;\n- (void)openURLWithDefault:(id)arg1 useA8Key:(BOOL)arg2;\n- (BOOL)preHandleUrlStr:(id)arg1 withMessage:(id)arg2;\n@end\n\n@interface UserDefaultsService : NSObject\n- (void)setString:(id)arg1 forKey:(id)arg2;\n- (id)stringForKey:(id)arg1;\n@end\n\n@interface MMLinkInfo : NSObject\n+ (NSRange)rangeOfUrlInString:(id)arg1 withRange:(NSRange)arg2;\n@end\n\n@interface MMCDNDownloadMgr : NSObject\n- (BOOL)downloadImageWithMessage:(id)arg1 disableHevc:(BOOL)arg2 downloadType:(unsigned long long)arg3;\n@end\n\n@interface MMMessageVideoService : NSObject\n- (BOOL)downloadVideoWithMessage:(id)arg1;\n@end\n\n@interface MMVoiceMessagePlayer : NSObject\n+ (id)defaultPlayer;\n- (void)playWithVoiceMessage:(id)arg1 isUnplayedBeforePlay:(BOOL)arg2;\n- (void)playVoiceWithMessage:(id)arg1 isUnplayedBeforePlay:(BOOL)arg2;\n- (void)stop;\n@end\n\n@interface MultiPlatformStatusSyncMgr : NSObject\n- (void)markVoiceMessageAsRead:(id)arg1;\n@end\n\n@interface EmoticonDownloadMgr : NSObject\n- (void)downloadEmoticonWithMessageData:(id)arg1;\n@end\n\n@interface PathUtility : NSObject\n+ (id)GetCurUserCachePath;\n+ (id)emoticonPath:(id)arg1;\n+ (id)getMsgVideoPathWithMessage:(id)arg1;\n+ (id)getMsgVideoPathWithUserName:(id)arg1 localId:(unsigned int)arg2;\n@end\n\n@interface MMExtensionCenter : NSObject\n- (id)getExtension:(id)arg1;\n@end\n\n@interface MMExtension : NSObject\n- (BOOL)registerExtension:(id)arg1;\n- (void)unregisterExtension:(id)arg1;\n- (id)getExtensionListForSelector:(SEL)arg1;\n@end\n\n@interface EmoticonMsgInfo : NSObject\n@property(copy, nonatomic) NSString *cdnUrl;\n@property(copy, nonatomic) NSString *m_nsMD5;\n@end\n\n@protocol EmoticonDownloadMgrExt <NSObject>\n@optional\n- (void)emoticonDownloadFailed:(EmoticonMsgInfo *)arg1;\n- (void)emoticonDownloadFinished:(EmoticonMsgInfo *)arg1;\n@end\n\n@protocol IGroupMgrExt <NSObject>\n\n@end\n\n@interface MMChatMangerSearchReportMgr : NSObject\n@property(retain, nonatomic) NSMutableArray *brandContactSearchResults;\n@property(retain, nonatomic) NSMutableArray *chatLogSearchResults;\n@property(retain, nonatomic) NSMutableArray *contactSearchResults;\n@property(retain, nonatomic) NSMutableArray *groupContactSearchResults;\n@end\n\n@interface MMWebViewHelper : NSObject\n+ (BOOL)preHandleWebUrlStr:(id)arg1 withMessage:(id)arg2;\n@end\n\n@interface XMLDictionaryParser : NSObject\n+ (id)sharedInstance;\n- (id)dictionaryWithString:(id)arg1;\n@end\n\n@interface MMEmoticonData : NSObject\n@property(retain, nonatomic) NSString *md5; // @synthesize md5=_md5;\n@end\n\n@interface MMStickerPickerCell : NSView <NSMenuDelegate>\n@property(retain, nonatomic) MMEmoticonData *emoticonData; // @synthesize emoticonData=_emoticonData;\n@property(nonatomic) __weak NSScrollView *collectionView; \n@end\n\n@interface MMStickerCollectionViewController : NSViewController\n@property(nonatomic) __weak id delegate;\n@end\n\n@interface MMStickerPicker : NSViewController\n- (void)hide;\n@end\n\n@interface MMVoiceTranslateMgr : NSObject\n- (void)doTranslate:(id)arg1 isAuto:(BOOL)arg2;\n- (void)updateTranscribeVoiceMessage:(id)arg1 voiceText:(id)arg2 voiceToTextStatus:(unsigned int)arg3;\n@end\n\n@interface MMAppBrandMessageCellView : NSObject\n+ (id)makeAppBrandTableItemWithItem:(id)arg1;\n@end\n\n@interface MMUnsupportedCellView : NSObject\n+ (id)makeUnsupportedTableItemWithItem:(id)arg1;\n@end\n\n@interface MMPayTransferCellView : NSObject\n+ (id)makePayTransferTableItemWithItem:(id)arg1;\n@end\n\n\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Modules/module.modulemap",
    "content": "framework module WeChatPlugin {\n  umbrella header \"WeChatPlugin.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Resources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>BuildMachineOSBuild</key>\n\t<string>22D68</string>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>WeChatPlugin</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>tk.WeChatPlugin</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>WeChatPlugin</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.7.5</string>\n\t<key>CFBundleSupportedPlatforms</key>\n\t<array>\n\t\t<string>MacOSX</string>\n\t</array>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>DTCompiler</key>\n\t<string>com.apple.compilers.llvm.clang.1_0</string>\n\t<key>DTPlatformBuild</key>\n\t<string>14A400</string>\n\t<key>DTPlatformName</key>\n\t<string>macosx</string>\n\t<key>DTPlatformVersion</key>\n\t<string>12.3</string>\n\t<key>DTSDKBuild</key>\n\t<string>21E226</string>\n\t<key>DTSDKName</key>\n\t<string>macosx12.3</string>\n\t<key>DTXcode</key>\n\t<string>1401</string>\n\t<key>DTXcodeBuild</key>\n\t<string>14A400</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>10.12</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2017年 tk. All rights reserved.</string>\n\t<key>showUpdateWindow</key>\n\t<true/>\n\t<key>versionInfo</key>\n\t<string>v1.7.5(2019-01-13):\\n👉🏻  适配微信 Version. 2.3.22\\n👉🏼  菜单栏新增是否允许微信启动时检测更新(非AppStore版本)\\n👉🏽  优化 XML 解析\\n\\n\\n\\nv1.7.3 (2018-10-22)：\\n👉🏻  适配微信 Version. 2.3.19\\n👉🏼  修复安全漏洞(请务必更新，若有安装QQ插件也需要更新)\\n👉🏽  菜单栏-关于小助手-新增 alfred 开关(若不使用 aflred 可关闭)  \\n\\nv1.7.1 (2018-07-24)：\\n👉🏻  适配微信 Version. 2.3.17\\n👉🏼  新增 alfred 搜索最近聊天列表\\n👉🏽  新增 alfred 查看用户聊天记录\\n     (需更新wechat-alfred-workflow)\\n\\nv1.7 (2018-05-12)：\\n👉🏻  新增不同账户设置不同的自动回复&amp;远程控制\\n👉🏼  自动回复新增总开关&amp;指定联系人\\n👉🏽  远程控制新增控制小助手配置\\n👉🏾  新增一键已读\\n👉  新增一键清除空回话\\n👉🏻  新增国际化(支持英、简、繁)\\n👉🏼  新增关于小助手\\n👉🏽  新增在线更新小助手  \\n👉🏾  去除微信url转链处理(从此直接打开抖音链接🌝 \\n👉🏿  修复无法免认证登录&amp;多开等bug \\n</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Resources/TKRemoteControlCommands.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>open /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app || open /System/Library/CoreServices/ScreenSaverEngine.app </string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>ScreenSave</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.ScreenSave</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>/System/Library/CoreServices/Menu\\ Extras/User.menu/Contents/Resources/CGSession -suspend</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>LockScreen</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.LockScreen</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>sleep</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Sleep</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Sleep</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>shutdown</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Shutdown</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Shutdown</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>restart</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Restart</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Restart</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>empty</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>EmptyTrash</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.EmptyTrash</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>mute</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Mute</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Mute</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killQQ</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillQQ</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillQQ</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killWeChat</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>killWeChat</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillWeChat</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killChrome</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillChrome</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillChrome</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killSafari</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillSafari</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillSafari</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killFirefox</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>killFirefox</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillFirefox</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killAll</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillAll</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillAll</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicToggle</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Toggle</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Toggle</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicNext</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Next</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Next</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicPrevious</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Previous</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Previous</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicVolumeUp</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>VolumeUp</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.VolumeUp</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicVolumeDown</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>VolumeDown</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.VolumeDown</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicLike</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>LikeChange</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.LikeChange</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>getDirectiveList</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>getDirective</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.GetList</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>PreventRevokeSwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>PreventRevokeSwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.PreventRevokeSwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>AutoReplySwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>AutoReplySwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.AutoReplySwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>AutoAuthSwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>AutoAuthSwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.AutoAuthSwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t</array>\n</array>\n</plist>\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Resources/en.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset0 HelveticaNeue-Bold;\n\\f3\\fnil\\fcharset134 PingFangSC-Regular;}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs34 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs34 \\cf2 Feature\n\\fs47\\fsmilli23660 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f0\\b0\\fs30 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nMessage auto reply\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nPrevent message recall\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nRemote control(support voice control)\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nMultiple WeChat\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nAuto Auth Login\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nSession Sticky Bottom\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nWindows Sticky Top\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nSession multiple delete\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nAuto Login Switch\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nQuick reply to notifications\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nCopy or Export Sticker\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nUpdate plugin\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nReply or Open session by Alfred\n\\f3\\fs32 \\\n}"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Resources/zh-Hans.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset134 PingFangSC-Semibold;\n\\f3\\fnil\\fcharset0 HelveticaNeue-Bold;\\f4\\fnil\\fcharset134 PingFangSC-Regular;\\f5\\fnil\\fcharset0 AppleColorEmoji;\n}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;\\red255\\green255\\blue255;\n\\red52\\green110\\blue183;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;\\cssrgb\\c100000\\c100000\\c100000;\n\\cssrgb\\c25490\\c51373\\c76863;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}\n{\\list\\listtemplateid2\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid101\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid2}\n{\\list\\listtemplateid3\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid201\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid3}\n{\\list\\listtemplateid4\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid301\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid4}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}{\\listoverride\\listid2\\listoverridecount0\\ls2}{\\listoverride\\listid3\\listoverridecount0\\ls3}{\\listoverride\\listid4\\listoverridecount0\\ls4}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs36\\fsmilli18200 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1\\fs32 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b9\\'a6\\'c4\\'dc\n\\f3\\fs48 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f1\\b0\\fs32 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'b7\\'c0\\'b3\\'b7\\'bb\\'d8\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d4\\'b6\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f1 (\n\\f4 \\'d2\\'d1\\'d6\\'a7\\'b3\\'d6\\'d3\\'ef\\'d2\\'f4\n\\f1 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b6\\'e0\\'bf\\'aa\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'b5\\'da\\'b6\\'fe\\'b4\\'ce\\'b5\\'c7\\'c2\\'bc\\'c3\\'e2\\'c8\\'cf\\'d6\\'a4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'d6\\'c3\\'b5\\'d7\\'b9\\'a6\\'c4\\'dc\n\\f1 (\n\\f4 \\strike \\strikec2 \\'c0\\'e0\\'cb\\'c6\\'d6\\'c3\\'b6\\'a5\n\\f1 \\strike0\\striked0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'b6\\'a5\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'bb\\'e1\\'bb\\'b0\\'b6\\'e0\\'d1\\'a1\\'c9\\'be\\'b3\\'fd\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d7\\'d4\\'b6\\'af\\'b5\\'c7\\'c2\\'bc\\'bf\\'aa\\'b9\\'d8\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cd\\'a8\\'d6\\'aa\\'d6\\'d0\\'d0\\'c4\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'b8\\'b4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'b8\\'b4\\'d6\\'c6\n\\f1  & \n\\f4 \\'b4\\'e6\\'b4\\'a2\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'bc\\'ec\\'b2\\'e2\\'b8\\'fc\\'d0\\'c2\\'cc\\'e1\\'d0\\'d1\n\\f1 \\\n\\pard\\tx0\\tx220\\pardeftab720\\fi-1\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b7\\'a2\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f1  & \n\\f4 \\'b4\\'f2\\'bf\\'aa\\'b4\\'b0\\'bf\\'da\\\n\\pard\\tx0\\tx220\\pardeftab720\\fi-1\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f1 \\cf2 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'bb\\'e1\\'bb\\'b0\\'d2\\'bb\\'bc\\'fc\\'d2\\'d1\\'b6\\'c1\n\\f1 \\cb1 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls1\\ilvl0\\cf2 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d2\\'bb\\'bc\\'fc\\'c7\\'e5\\'b3\\'fd\\'bf\\'d5\\'bb\\'e1\\'bb\\'b0\n\\f1 \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'a7\\'b3\\'d6\\'b9\\'fa\\'bc\\'ca\\'bb\\'af\n\\f1  \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d2\\'bb\\'bc\\'fc\\'b8\\'fc\\'d0\\'c2\n\\f1 \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c8\\'a5\\'b3\\'fd\\'ce\\'a2\\'d0\\'c5\n\\f1 url\n\\f4 \\'d7\\'aa\\'c1\\'b4\\'a3\\'a8\\'b4\\'d3\\'b4\\'cb\\'d6\\'b1\\'bd\\'d3\\'b4\\'f2\\'bf\\'aa\\'b6\\'b6\\'d2\\'f4\\'c1\\'b4\\'bd\\'d3\n\\f5 \\uc0\\u55356 \\u57117 \\\n\\ls1\\ilvl0\n\\f1 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'cb\\'d1\\'cb\\'f7\\'d7\\'ee\\'bd\\'fc\\'c1\\'c4\\'cc\\'ec\\'a1\\'a2\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc\n\\f5 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\n\\f1 \\cf2 \\kerning1\\expnd0\\expndtw0 \t\\'95\t\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d2\\'c6\\'b3\\'fd\\'bb\\'e1\\'bb\\'b0(\\'b2\\'bb\\'c9\\'be\\'b3\\'fd\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc)\\cb1 \\\n\n\\f1 \\cf5 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b8\\'fc\\'d0\\'c2\\'c8\\'d5\\'d6\\'be\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls2\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\ul \\'ca\\'ca\\'c5\\'e4\n\\f1 2.3.17 & \n\\f4 \\'bc\\'d3\\'c7\\'bf\n\\f1  alfred \n\\f4 \\'cb\\'d1\\'cb\\'f7\n\\f1 (2018-07-24)}}\n\\f2\\b\\fs36 \\cf2 \\cb1 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls3\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\ul \\'d0\\'c2\\'d4\\'f6\\'ba\\'c3\\'b6\\'e0\\'b9\\'a6\\'c4\\'dc\n\\f1 \\'85(2018-05-12)}}\n\\f3\\b\\fs36 \\cf2 \\cb1 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls4\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\\'d1\\'d3\\'b3\\'d9\n\\f1  & \n\\f4 \\'d0\\'de\\'b8\\'c4\\'d6\\'c3\\'b6\\'a5\\'b4\\'b0\\'bf\\'da\\'bf\\'ec\\'bd\\'dd\n\\f1 (2018-04-07)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\n\\f1  Alfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b7\\'a2\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f1  & \n\\f4 \\'b4\\'f2\\'bf\\'aa\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\n\\f1 (2018-03-18)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d3\\'ef\\'d2\\'f4\\'d4\\'b6\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f1 mac & \n\\f4 \\'d3\\'c5\\'bb\\'af\\'b3\\'b7\\'bb\\'d8\\'cf\\'fb\\'cf\\'a2\\'a1\\'a2\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'b8\\'b4\n\\f1 (2018-03-03)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'bc\\'ec\\'b2\\'e2\\'b8\\'fc\\'d0\\'c2\n\\f1 &\n\\f4 \\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'b8\\'b4\\'d6\\'c6\\'b4\\'e6\\'b4\\'a2\\'b5\\'c8\\'b5\\'c8\n\\f1  (2018-02-24)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.4.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'b6\\'a5\n\\f1 &\n\\f4 \\'b6\\'e0\\'d1\\'a1\\'c9\\'be\\'b3\\'fd\\'b5\\'c8\\'b5\\'c8\n\\f1  (2017-10-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.3.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d6\\'c3\\'b5\\'d7\n\\f1 &\n\\f4 \\'c3\\'e2\\'c8\\'cf\\'d6\\'a4\n\\f1  (2017-09-17)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.2.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'de\\'b8\\'b4\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc\\'cf\\'fb\\'ca\\'a7\\'b5\\'c4\n\\f1 bug (2017-09-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.1.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'d8\\'b9\\'b9\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\\'a3\\'ac\\'ca\\'b5\\'cf\\'d6\\'b6\\'e0\\'bb\\'d8\\'b8\\'b4\n\\f1  (2017-08-23)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\pardeftab720\\sl264\\slmult1\\partightenfactor0\n\n\\f2\\b \\cf2 \\'cf\\'ea\\'cf\\'b8\\'c4\\'da\\'c8\\'dd\\'c7\\'eb\\'b2\\'e9\\'bf\\'b4{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/CHANGELOG.md\"}}{\\fldrslt \n\\f1\\b0 \\cf5 CHANGELOG}}\n\\f1\\b0 \\cf5 \\\n}"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Resources/zh-Hant.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset134 PingFangSC-Semibold;\n\\f3\\fnil\\fcharset0 HelveticaNeue-Bold;\\f4\\fnil\\fcharset134 PingFangSC-Light;}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}\n{\\list\\listtemplateid2\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid101\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid2}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}{\\listoverride\\listid2\\listoverridecount0\\ls2}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs36\\fsmilli18200 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1\\fs32 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b9\\'a6\\'c4\\'dc\n\\f3\\fs47\\fsmilli23660 \\cf2 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\partightenfactor0\n\\ls1\\ilvl0\n\\f0\\b0\\fs32 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'b7\\'c0\\'b3\\'b7\\'bb\\'d8\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'df\\'68\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f0 (\n\\f4 \\'d2\\'d1\\'d6\\'a7\\'b3\\'d6\\'d5\\'5a\\'d2\\'f4\n\\f0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b6\\'e0\\'e9\\'5f\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'b5\\'da\\'b6\\'fe\\'b4\\'ce\\'b5\\'c7\\'e4\\'9b\\'c3\\'e2\\'d5\\'4a\\'d7\\'43\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'d6\\'c3\\'b5\\'d7\\'b9\\'a6\\'c4\\'dc\n\\f0 (\n\\f4 \\strike \\strikec2 \\'ee\\'90\\'cb\\'c6\\'d6\\'c3\\'ed\\'94\n\\f0 \\strike0\\striked0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'ed\\'94\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'95\\'fe\\'d4\\'92\\'b6\\'e0\\'df\\'78\\'84\\'68\\'b3\\'fd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d7\\'d4\\'84\\'d3\\'b5\\'c7\\'e4\\'9b\\'e9\\'5f\\'ea\\'50\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cd\\'a8\\'d6\\'aa\\'d6\\'d0\\'d0\\'c4\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'8f\\'cd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'8f\\'cd\\'d6\\'c6\n\\f0  & \n\\f4 \\'b4\\'e6\\'83\\'a6\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'99\\'7a\\'9c\\'79\\'b8\\'fc\\'d0\\'c2\\'cc\\'e1\\'d0\\'d1\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b0\\'6c\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f0  & \n\\f4 \\'b4\\'f2\\'e9\\'5f\\'b4\\'b0\\'bf\\'da\n\\f0  \\\n\\pard\\tx566\\pardeftab720\\partightenfactor0\n\n\\fs36\\fsmilli18200 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b8\\'fc\\'d0\\'c2\\'c8\\'d5\\'d5\\'49\n\\f3\\fs47\\fsmilli23660 \\cf2 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls2\\ilvl0\n\\f0\\b0\\fs32 \\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\\'d1\\'d3\\'df\\'74\n\\f0  & \n\\f4 \\'d0\\'de\\'b8\\'c4\\'d6\\'c3\\'ed\\'94\\'b4\\'b0\\'bf\\'da\\'bf\\'ec\\'bd\\'dd\n\\f0 (2018-04-07)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\n\\f0  Alfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b0\\'6c\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f0  & \n\\f4 \\'b4\\'f2\\'e9\\'5f\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\n\\f0 (2018-03-18)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d5\\'5a\\'d2\\'f4\\'df\\'68\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f0 mac & \n\\f4 \\'83\\'9e\\'bb\\'af\\'b3\\'b7\\'bb\\'d8\\'cf\\'fb\\'cf\\'a2\\'a1\\'a2\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'8f\\'cd\n\\f0 (2018-03-03)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'99\\'7a\\'9c\\'79\\'b8\\'fc\\'d0\\'c2\n\\f0 &\n\\f4 \\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'8f\\'cd\\'d6\\'c6\\'b4\\'e6\\'83\\'a6\\'b5\\'c8\\'b5\\'c8\n\\f0  (2018-02-24)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.4.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'ed\\'94\n\\f0 &\n\\f4 \\'b6\\'e0\\'df\\'78\\'84\\'68\\'b3\\'fd\\'b5\\'c8\\'b5\\'c8\n\\f0  (2017-10-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.3.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d6\\'c3\\'b5\\'d7\n\\f0 &\n\\f4 \\'c3\\'e2\\'d5\\'4a\\'d7\\'43\n\\f0  (2017-09-17)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.2.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'de\\'8f\\'cd\\'c1\\'c4\\'cc\\'ec\\'d3\\'9b\\'e4\\'9b\\'cf\\'fb\\'ca\\'a7\\'b5\\'c4\n\\f0 bug (2017-09-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.1.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'d8\\'98\\'8b\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\\'a3\\'ac\\'8c\\'8d\\'ac\\'46\\'b6\\'e0\\'bb\\'d8\\'8f\\'cd\n\\f0  (2017-08-23)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\pardeftab720\\sl264\\slmult1\\partightenfactor0\n\n\\f2\\b \\cf2 \\'d4\\'94\\'bc\\'9a\\'83\\'c8\\'c8\\'dd\\'d5\\'88\\'b2\\'e9\\'bf\\'b4{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/CHANGELOG.md\"}}{\\fldrslt \n\\f0\\b0 \\cf3 CHANGELOG}}\n\\f0\\b0\\fs36\\fsmilli18200 \\cf2 \\\n}"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/A/Headers/WeChatPlugin.h",
    "content": "//\n//  WeChatPlugin.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n#import \"TKWeChatPluginConfig.h\"\n#import \"TKHelper.h\"\n\nFOUNDATION_EXPORT double WeChatPluginVersionNumber;\nFOUNDATION_EXPORT const unsigned char WeChatPluginVersionString[];\n\n@class WCContactData;\n\n#pragma mark - 微信原始的部分类与方法\n\n@interface MMSystemLinkInfo : NSObject\n@property(retain, nonatomic) NSMutableAttributedString *msgContent;\n\n@end\n@interface MMContactProfileController : NSViewController\n@property(copy, nonatomic) NSString *groupName;\n@property(nonatomic) struct CGRect relativeToRect;\n@property(nonatomic) unsigned long long preferredEdge;\n@property(retain, nonatomic) WCContactData *contactData;\n- (void)sendGetContactRequest:(id)arg1 withGroupName:(id)arg2;\n- (void)showInView:(id)arg1;\n@end\n\n\n@interface MMBrandChatsViewController : NSObject\n- (void)startChatWithContact:(id)arg1;\n@end\n\n@interface MMLoginOneClickViewController : NSViewController\n@property(nonatomic) NSTextField *descriptionLabel;\n- (void)onLoginButtonClicked:(id)arg1;\n@property(nonatomic) NSButton *loginButton;\n@end\n\n@interface AccountService : NSObject\n- (id)GetLastLoginUserName;\n- (id)GetLastLoginAutoAuthKey;\n- (BOOL)canAutoAuth;\n- (void)AutoAuth;\n- (void)ManualLogin:(id)arg1 withPassword:(id)arg2;\n- (void)ManualLogout;\n- (void)FFAddSvrMsgImgVCZZ;\n- (void)QRCodeLoginWithUserName:(id)arg1 password:(id)arg2;\n- (void)onAuthOKOfUser:(id)arg1 withSessionKey:(id)arg2 withServerId:(id)arg3 autoAuthKey:(id)arg4 isAutoAuth:(BOOL)arg5;\n@end\n\n@interface MMLoginViewController : NSObject\n@property(retain, nonatomic) MMLoginOneClickViewController *oneClickViewController;\n@end\n\n@interface MMHandoffButton : NSView\n@end\n\n@interface MMMainViewController : NSObject\n@property(nonatomic) __weak MMHandoffButton *handoffButton;\n@end\n\n@interface MMMainWindowController : NSWindowController\n@property(retain, nonatomic) MMLoginViewController *loginViewController;\n@property(retain, nonatomic) MMMainViewController *mainViewController;\n- (void)onAuthOK;\n- (void)onLogOut;\n@end\n\n@interface MMVoiceTranscribeCGI : NSObject\n- (void)transcribeVoiceMessage:(id)arg1 withCompletion:(void (^)(void))arg2;\n@end\n\n@interface FFProcessReqsvrZZ : NSObject\n- (void)onRevokeMsg:(id)arg1;\n- (void)FFToNameFavChatZZ:(id)arg1;\n- (void)FFToNameFavChatZZ:(id)arg1 sessionMsgList:(id)arg2;\n- (void)OnSyncBatchAddMsgs:(NSArray *)arg1 isFirstSync:(BOOL)arg2;\n- (void)FFImgToOnFavInfoInfoVCZZ:(id)arg1 isFirstSync:(BOOL)arg2;\n- (id)FFProcessTReqZZ:(id)arg1 toUsrName:(id)arg2 msgText:(id)arg3 atUserList:(id)arg4;\n- (id)GetMsgData:(id)arg1 svrId:(long)arg2;\n- (void)AddLocalMsg:(id)arg1 msgData:(id)arg2;\n- (void)TranscribeVoiceMessage:(id)arg1 completion:(void (^)(void))arg2;\n- (BOOL)ClearUnRead:(id)arg1 FromID:(unsigned int)arg2 ToID:(unsigned int)arg3;\n- (BOOL)ClearUnRead:(id)arg1 FromCreateTime:(unsigned int)arg2 ToCreateTime:(unsigned int)arg3;\n- (BOOL)HasMsgInChat:(id)arg1;\n- (id)GetMsgListWithChatName:(id)arg1 fromCreateTime:(unsigned int)arg2 localId:(NSInteger)arg3 limitCnt:(NSInteger)arg4 hasMore:(char *)arg5 sortAscend:(BOOL)arg6;\n- (void)DelMsg:(id)arg1 msgList:(id)arg2 isDelAll:(BOOL)arg3 isManual:(BOOL)arg4;\n@end\n\n@interface MMServiceCenter : NSObject\n+ (id)defaultCenter;\n- (id)getService:(Class)arg1;\n@end\n\n@interface SKBuiltinString_t : NSObject\n@property(retain, nonatomic, setter=SetString:) NSString *string; // @synthesize string;\n@end\n\n@interface AddMsg : NSObject\n@property(retain, nonatomic, setter=SetContent:) SKBuiltinString_t *content; // @synthesize content;\n@property(retain, nonatomic, setter=SetFromUserName:) SKBuiltinString_t *fromUserName; // @synthesize fromUserName;\n@property(nonatomic, setter=SetMsgType:) int msgType; // @synthesize msgType;\n@property(retain, nonatomic, setter=SetToUserName:) SKBuiltinString_t *toUserName; // @synthesize toUserName;\n@property (nonatomic, assign) unsigned int createTime;\n@property(nonatomic, setter=SetNewMsgId:) long long newMsgId;\n@end\n\n@interface MMChatMessageViewController : NSViewController\n@property(retain, nonatomic) WCContactData *chatContact;\n@property(nonatomic) __weak NSTableView *messageTableView;\n- (void)scrollToMessage:(NSUInteger)arg1;\n- (BOOL)showLocatedMessage:(NSUInteger)arg1;\n- (BOOL)showLocatedMessage:(unsigned int)arg1 needHighLighted:(BOOL)arg2;\n- (void)onClickSession;\n- (void)reloadTableView;\n@end\n\n@interface MMChatDetailSplitViewController : NSObject\n@property(retain, nonatomic) MMChatMessageViewController *chatMessageViewController;\n@end\n\n@interface MMChatsViewController : NSViewController <NSTableViewDataSource, NSTableViewDelegate>\n@property(nonatomic) __weak NSTableView *tableView;\n@property(retain, nonatomic) MMBrandChatsViewController *brandChatsViewController;\n@property(retain, nonatomic) MMChatDetailSplitViewController *chatDetailSplitViewController;\n@end\n\n@interface WeChat : NSObject\n+ (id)sharedInstance;\n@property(nonatomic) MMChatsViewController *chatsViewController;\n@property(retain, nonatomic) MMMainWindowController *mainWindowController;\n@property(nonatomic) BOOL isAppTerminating;\n@property(nonatomic) BOOL hasAuthOK;\n- (void)startANewChatWithContact:(id)arg1;\n- (void)_clearAllUnreadMessages:(id)arg1;\n- (void)onAuthOK:(BOOL)arg1;\n- (void)checkForUpdatesInBackground;\n- (void)FFAddRecvFavZZ:(BOOL)arg1;\n@end\n\n@interface ContactStorage : NSObject\n- (id)GetSelfContact;\n- (id)GetContact:(id)arg1;\n- (id)GetAllBrandContacts;\n- (id)GetAllFavContacts;\n- (id)GetAllFriendContacts;\n@end\n\n@interface GroupStorage : NSObject\n{\n    NSMutableDictionary *m_dictGroupContacts;\n}\n- (id)GetAllGroups;\n- (id)GetGroupMemberContact:(id)arg1;\n- (void)notifyModifyGroupContactsOnMainThread:(id)arg1;\n//- (id)GetGroupMemberListWithGroupContact:(id)arg1;\n- (id)GetGroupMemberListWithGroupContact:(id)arg1 limit:(unsigned int)arg2 filterSelf:(BOOL)arg3;\n@end\n\n@interface ChatRoomData : NSObject\n{\n    NSMutableDictionary *m_dicData;\n}\n@end\n\n@interface WCContactData : NSObject\n@property(retain, nonatomic) NSString *m_nsUsrName; // @synthesize m_nsUsrName;\n@property(nonatomic) unsigned int m_uiFriendScene;  // @synthesize m_uiFriendScene;\n@property(retain, nonatomic) NSString *m_nsNickName;    // 用户昵称\n@property(retain, nonatomic) NSString *m_nsRemark;      // 备注\n@property(retain, nonatomic) NSString *m_nsHeadImgUrl;  // 头像\n@property(retain, nonatomic) NSString *m_nsHeadHDImgUrl;\n@property(retain, nonatomic) NSString *m_nsHeadHDMd5;\n@property(retain, nonatomic) NSString *m_nsAliasName;\n@property(retain, nonatomic) NSString *avatarCacheKey;\n@property(readonly, nonatomic) unsigned long long groupMemberCount;\n@property(retain, nonatomic) ChatRoomData *m_chatRoomData;\n@property(nonatomic) BOOL m_isShowRedDot;\n- (BOOL)isBrandContact;\n- (BOOL)isSelf;\n- (id)innerGetGroupDisplayName;\n- (NSString *)groupChatDisplayNameInGroup:(id)arg1;\n- (id)getContactDisplayUsrName;\n- (BOOL)isGroupChat;\n- (BOOL)isMMChat;\n- (BOOL)isMMContact;\n- (BOOL)containsMember:(id)arg1;\n- (id)displayRegion;\n- (BOOL)isStickyFolder;\n@end\n\n@interface WCPayInfoItem : NSObject\n@property(retain, nonatomic) NSString *m_nsFeeDesc;\n@end\n\n@interface MessageData : NSObject\n- (id)initWithMsgType:(long long)arg1;\n@property(retain, nonatomic) NSString *fromUsrName;\n@property(retain, nonatomic) NSString *toUsrName;\n@property(retain, nonatomic) NSString *msgContent;\n@property(retain, nonatomic) NSString *msgPushContent;\n@property(retain, nonatomic) NSString *realChatUserName;\n@property(retain, nonatomic) WCPayInfoItem *m_oWCPayInfoItem; // @dynamic m_oWCPayInfoItem;\n@property(retain, nonatomic) NSString *m_nsAppName;\n@property(retain, nonatomic) NSString *m_nsSourceDisplayname;\n@property(nonatomic) int messageType;\n@property(nonatomic) int msgStatus;\n@property(nonatomic) int msgCreateTime;\n@property(nonatomic) int mesLocalID;\n@property(nonatomic) long long mesSvrID;\n@property(retain, nonatomic) NSString *msgVoiceText;\n@property(copy, nonatomic) NSString *m_nsEmoticonMD5;\n- (BOOL)isChatRoomMessage;\n- (NSString *)groupChatSenderDisplayName;\n- (id)getRealMessageContent;\n- (id)getChatRoomUsrName;\n- (BOOL)isSendFromSelf;\n- (BOOL)isCustomEmojiMsg;\n- (BOOL)isImgMsg;\n- (BOOL)isVideoMsg;\n- (BOOL)isVoiceMsg;\n- (BOOL)canForward;\n- (BOOL)IsPlayingSound;\n- (id)summaryString:(BOOL)arg1;\n- (BOOL)isEmojiAppMsg;\n- (BOOL)isAppBrandMsg;\n- (BOOL)IsUnPlayed;\n- (void)SetPlayed;\n@property(retain, nonatomic) NSString *m_nsTitle;\n- (id)originalImageFilePath;\n@property(retain, nonatomic) NSString *m_nsVideoPath;\n@property(retain, nonatomic) NSString *m_nsFilePath;\n@property(retain, nonatomic) NSString *m_nsAppMediaUrl;\n@property(nonatomic) MessageData *m_refMessageData;\n@property(nonatomic) unsigned int m_uiDownloadStatus;\n- (void)SetPlayingSoundStatus:(BOOL)arg1;\n@end\n\n@interface CUtility : NSObject\n+ (BOOL)HasWechatInstance;\n+ (BOOL)FFSvrChatInfoMsgWithImgZZ;\n+ (unsigned long long)getFreeDiskSpace;\n+ (void)ReloadSessionForMsgSync;\n+ (id)GetCurrentUserName;\n+ (id)GetContactByUsrName:(id)arg1;\n+ (BOOL)IsStickyChatsFolder:(id)arg1;\n@end\n\n@interface MMSessionInfoPackedInfo: NSObject\n@property(retain, nonatomic) WCContactData *m_contact;\n@property(retain, nonatomic) MessageData *m_msgData;\n@end\n\n@interface MMSessionInfo : NSObject\n@property(nonatomic) BOOL m_bIsTop; // @synthesize m_bIsTop;\n@property(nonatomic) BOOL m_bShowUnReadAsRedDot;\n@property(nonatomic) BOOL m_isMentionedUnread; // @synthesize\n@property BOOL isInGroupBox; \n@property(retain, nonatomic) NSString *m_nsUserName; // @synthesize m_nsUserName;\n@property(retain, nonatomic) MMSessionInfoPackedInfo *m_packedInfo;\n@property(nonatomic) unsigned int m_uUnReadCount; \n@end\n\n@protocol MMChatsTableCellViewDelegate <NSObject>\n@optional\n- (void)cellViewReloadData:(MMSessionInfo *)arg1;\n@end\n\n@interface MMChatsTableCellView : NSTableCellView\n@property(nonatomic) __weak id <MMChatsTableCellViewDelegate> delegate;\n@property(retain, nonatomic) MMSessionInfo *sessionInfo;\n- (void)menuWillOpen:(id)arg1;\n- (void)contextMenuSticky:(id)arg1;\n- (void)contextMenuDelete:(id)arg1;\n- (void)tableView:(NSTableView *)arg1 rowGotMouseDown:(long long)arg2;\n@end\n\n@interface MMSessionMgr : NSObject\n//@property(retain, nonatomic) NSMutableArray *m_arrSession;\n- (id)getSessionAtIndex:(unsigned long long)arg1;\n- (id)sessionInfoByUserName:(id)arg1;\n- (void)muteSessionByUserName:(id)arg1;\n- (void)onUnReadCountChange:(id)arg1;\n//- (void)TopSessionByUserName:(id)arg1;\n- (void)unmuteSessionByUserName:(id)arg1;\n- (void)untopSessionByUserName:(id)arg1;\n- (void)changeSessionUnreadCountWithUserName:(id)arg1 to:(unsigned int)arg2;\n- (void)removeSessionOfUser:(id)arg1 isDelMsg:(BOOL)arg2;\n- (void)sortSessions;\n- (void)FFDataSvrMgrSvrFavZZ;\n- (id)getContact:(id)arg1;\n- (id)getSessionContact:(id)arg1;\n- (void)onModifyContacts:(id)arg1;\n- (NSMutableArray *)getAllSessions;\n@end\n\n@interface LogoutCGI : NSTableCellView\n- (void)sendLogoutCGIWithCompletion:(id)arg1;\n- (void)FFVCRecvDataAddDataToMsgChatMgrRecvZZ:(id)arg1;\n@end\n\n@interface MMNotificationService : NSObject\n- (id)getNotificationContentWithMsgData:(id)arg1;\n- (void)userNotificationCenter:(id)arg1 didActivateNotification:(id)arg2;\n@end\n\n@interface MMMessageTableItem : NSObject\n@property(retain, nonatomic) MessageData *message;\n@end\n\n@interface MMStickerMessageCellView : NSObject\n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@property(nonatomic) MMChatMessageViewController *delegate;\n- (BOOL)allowCopy;\n- (void)contextMenuCopy;\n- (id)contextMenu;\n@end\n\n@interface MMImageMessageCellView: NSObject\n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@end\n\n@interface MMSystemMessageCellView: NSObject\n@property(nonatomic) id delegate; \n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@property(retain, nonatomic) NSTextView *msgTextView;\n- (void)populateWithMessage:(id)arg1;\n@end\n@interface EmoticonMgr : NSObject\n@property(retain, nonatomic) MessageData *message;\n- (id)getEmotionDataWithMD5:(id)arg1;\n- (id)getEmotionImgWithMD5:(id)arg1;\n- (void)addFavEmoticon:(id)arg1;\n- (void)addEmoticonToUploadQueueWithMD5:(id)arg1;\n- (void)setAppStickerToastViewDelegate:(id)arg1;\n@end\n\n@interface MMComplexContactSearchTaskMgr : NSObject\n+ (id)sharedInstance;\n- (void)doComplexContactSearch:(id)arg1 searchScene:(unsigned long long)arg2 complete:(void (^)(NSString *,NSArray *, NSArray *, NSArray *,id))arg3 cancelable:(BOOL)arg4;\n@end\n\n@interface MMBasicSearchResult : NSObject\n@end\n\n@interface MMSearchResultItem : NSObject\n@property(retain, nonatomic) MMBasicSearchResult *result;\n@end\n\n@interface MMSearchResultContainer : NSObject\n@property(nonatomic) unsigned long long logicSearchResultFlag; // @synthesize\n@end\n\n@interface MMContactSearchLogic : NSObject\n{\n    unsigned long long _logicSearchResultFlag;      // 2.3.19 失效\n}\n@property(retain, nonatomic) NSMutableArray *contactResults;\n- (void)doSearchWithKeyword:(id)arg1 searchScene:(unsigned long long)arg2 resultIsShownBlock:(id)arg3 completion:(id)arg4;\n@property(retain, nonatomic) NSMutableArray *groupResults;\n@property(nonatomic) BOOL isBrandContactSearched;\n@property(nonatomic) BOOL isChatLogSearched;\n@property(nonatomic) BOOL isContactSearched;\n@property(nonatomic) BOOL isGroupContactSearched;\n@property(retain, nonatomic) NSMutableArray *oaResults;\n- (void)clearAllResults;    //  2.3.19 失效\n- (void)clearDataWhenSearchEnd;\n- (void)reloadSearchResultDataWithKeyword:(id)arg1 completionBlock:(id)arg2;    //  2.3.17\n- (void)reloadSearchResultDataWithCompletionBlock:(id)arg1;                     //  2.3.13\n- (void)reloadSearchResultDataWithKeyword:(id)arg1 resultContainer:(id)arg2 completionBlock:(id)arg3;\n@property(retain, nonatomic) MMSearchResultContainer *searchResultContainer;\n@end\n\n@interface MMComplexContactSearchResult : MMBasicSearchResult\n@property(retain, nonatomic) NSString *fieldValue;\n@property(retain, nonatomic) WCContactData *contact;\n@property(nonatomic) unsigned long long fieldType;  // 1：备注 3：昵称 4：微信号  8：省份  7：市  9：国家\n@end\n\n@interface MMComplexGroupContactMembersSearchResult : MMBasicSearchResult\n@property(retain, nonatomic) NSMutableArray<MMComplexContactSearchResult *> *membersSearchReults;\n@end\n\n@interface MMComplexGroupContactSearchResult : MMBasicSearchResult\n@property(nonatomic) unsigned long long searchType;     // 1 名称 2 群成员名称\n@property(retain) WCContactData *groupContact;\n@property(retain, nonatomic) MMComplexGroupContactMembersSearchResult *groupMembersResult;\n@end\n\n@interface MMAvatarService : NSObject\n- (NSString *)avatarCachePath;\n- (id)_getImageFromCacheWithMD5Key:(id)arg1;\n- (void)avatarImageWithContact:(id)arg1 completion:(void (^)(NSImage *image))arg2;\n- (void)getAvatarImageWithContact:(id)arg1 completion:(void (^)(NSImage *image))arg2;\n@end\n\n@interface NSString (MD5)\n- (id)md5String;\n@end\n\n@interface MMSessionPickerLogic : NSObject\n@property(nonatomic) NSArray *selectedUserNames;\n@end\n\n\n@interface MMSessionListView : NSObject\n{\n    MMSessionPickerLogic *m_logic;\n}\n@end\n\n@interface MMSessionPickerWindow : NSWindowController\n+ (id)shareInstance;\n- (void)beginSheetForWindow:(id)arg1 completionHandler:(void(^)(id a1))arg2;\n@property(retain, nonatomic) id choosenViewController; // @synthesize\n@property(retain, nonatomic) id listViewController; // @synthesize\n- (void)setShowsGroupChats:(BOOL)arg1;\n- (void)setShowsOfficialAccounts:(BOOL)arg1;\n- (void)setShowsOtherNonhumanChats:(BOOL)arg1;\n- (void)setType:(unsigned long long)arg1;\n\n@end\n\n@interface AFHTTPResponseSerializer : NSObject\n@end\n\n@interface AFURLSessionManager : NSObject\n- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request\n                                             progress:(void (^)(NSProgress *downloadProgress))downloadProgressBlock\n                                          destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination\n                                    completionHandler:(void (^)(NSURLResponse *response, NSURL * filePath, NSError * error))completionHandler;\n- (id)initWithSessionConfiguration:(id)arg1;\n@end\n\n@interface AFHTTPRequestSerializer : NSObject\n+ (id)serializer;\n@property(nonatomic) unsigned long long cachePolicy;\n@end\n\n@interface AFHTTPSessionManager : NSObject\n+ (AFHTTPSessionManager *)manager;\n@property(retain, nonatomic) AFHTTPRequestSerializer *requestSerializer;\n@property(retain, nonatomic) AFHTTPResponseSerializer *responseSerializer;\n@end\n\n@interface MMURLHandler : NSObject\n+ (id)defaultHandler;\n- (void)startGetA8KeyWithURL:(id)arg1;\n- (BOOL)openURLWithDefault:(id)arg1;\n+ (BOOL)containsHTTPString:(id)arg1;\n- (void)openURLWithDefault:(id)arg1 useA8Key:(BOOL)arg2;\n- (BOOL)preHandleUrlStr:(id)arg1 withMessage:(id)arg2;\n@end\n\n@interface UserDefaultsService : NSObject\n- (void)setString:(id)arg1 forKey:(id)arg2;\n- (id)stringForKey:(id)arg1;\n@end\n\n@interface MMLinkInfo : NSObject\n+ (NSRange)rangeOfUrlInString:(id)arg1 withRange:(NSRange)arg2;\n@end\n\n@interface MMCDNDownloadMgr : NSObject\n- (BOOL)downloadImageWithMessage:(id)arg1 disableHevc:(BOOL)arg2 downloadType:(unsigned long long)arg3;\n@end\n\n@interface MMMessageVideoService : NSObject\n- (BOOL)downloadVideoWithMessage:(id)arg1;\n@end\n\n@interface MMVoiceMessagePlayer : NSObject\n+ (id)defaultPlayer;\n- (void)playWithVoiceMessage:(id)arg1 isUnplayedBeforePlay:(BOOL)arg2;\n- (void)playVoiceWithMessage:(id)arg1 isUnplayedBeforePlay:(BOOL)arg2;\n- (void)stop;\n@end\n\n@interface MultiPlatformStatusSyncMgr : NSObject\n- (void)markVoiceMessageAsRead:(id)arg1;\n@end\n\n@interface EmoticonDownloadMgr : NSObject\n- (void)downloadEmoticonWithMessageData:(id)arg1;\n@end\n\n@interface PathUtility : NSObject\n+ (id)GetCurUserCachePath;\n+ (id)emoticonPath:(id)arg1;\n+ (id)getMsgVideoPathWithMessage:(id)arg1;\n+ (id)getMsgVideoPathWithUserName:(id)arg1 localId:(unsigned int)arg2;\n@end\n\n@interface MMExtensionCenter : NSObject\n- (id)getExtension:(id)arg1;\n@end\n\n@interface MMExtension : NSObject\n- (BOOL)registerExtension:(id)arg1;\n- (void)unregisterExtension:(id)arg1;\n- (id)getExtensionListForSelector:(SEL)arg1;\n@end\n\n@interface EmoticonMsgInfo : NSObject\n@property(copy, nonatomic) NSString *cdnUrl;\n@property(copy, nonatomic) NSString *m_nsMD5;\n@end\n\n@protocol EmoticonDownloadMgrExt <NSObject>\n@optional\n- (void)emoticonDownloadFailed:(EmoticonMsgInfo *)arg1;\n- (void)emoticonDownloadFinished:(EmoticonMsgInfo *)arg1;\n@end\n\n@protocol IGroupMgrExt <NSObject>\n\n@end\n\n@interface MMChatMangerSearchReportMgr : NSObject\n@property(retain, nonatomic) NSMutableArray *brandContactSearchResults;\n@property(retain, nonatomic) NSMutableArray *chatLogSearchResults;\n@property(retain, nonatomic) NSMutableArray *contactSearchResults;\n@property(retain, nonatomic) NSMutableArray *groupContactSearchResults;\n@end\n\n@interface MMWebViewHelper : NSObject\n+ (BOOL)preHandleWebUrlStr:(id)arg1 withMessage:(id)arg2;\n@end\n\n@interface XMLDictionaryParser : NSObject\n+ (id)sharedInstance;\n- (id)dictionaryWithString:(id)arg1;\n@end\n\n@interface MMEmoticonData : NSObject\n@property(retain, nonatomic) NSString *md5; // @synthesize md5=_md5;\n@end\n\n@interface MMStickerPickerCell : NSView <NSMenuDelegate>\n@property(retain, nonatomic) MMEmoticonData *emoticonData; // @synthesize emoticonData=_emoticonData;\n@property(nonatomic) __weak NSScrollView *collectionView; \n@end\n\n@interface MMStickerCollectionViewController : NSViewController\n@property(nonatomic) __weak id delegate;\n@end\n\n@interface MMStickerPicker : NSViewController\n- (void)hide;\n@end\n\n@interface MMVoiceTranslateMgr : NSObject\n- (void)doTranslate:(id)arg1 isAuto:(BOOL)arg2;\n- (void)updateTranscribeVoiceMessage:(id)arg1 voiceText:(id)arg2 voiceToTextStatus:(unsigned int)arg3;\n@end\n\n@interface MMAppBrandMessageCellView : NSObject\n+ (id)makeAppBrandTableItemWithItem:(id)arg1;\n@end\n\n@interface MMUnsupportedCellView : NSObject\n+ (id)makeUnsupportedTableItemWithItem:(id)arg1;\n@end\n\n@interface MMPayTransferCellView : NSObject\n+ (id)makePayTransferTableItemWithItem:(id)arg1;\n@end\n\n\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/A/Modules/module.modulemap",
    "content": "framework module WeChatPlugin {\n  umbrella header \"WeChatPlugin.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/A/Resources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>BuildMachineOSBuild</key>\n\t<string>22D68</string>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>WeChatPlugin</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>tk.WeChatPlugin</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>WeChatPlugin</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.7.5</string>\n\t<key>CFBundleSupportedPlatforms</key>\n\t<array>\n\t\t<string>MacOSX</string>\n\t</array>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>DTCompiler</key>\n\t<string>com.apple.compilers.llvm.clang.1_0</string>\n\t<key>DTPlatformBuild</key>\n\t<string>14A400</string>\n\t<key>DTPlatformName</key>\n\t<string>macosx</string>\n\t<key>DTPlatformVersion</key>\n\t<string>12.3</string>\n\t<key>DTSDKBuild</key>\n\t<string>21E226</string>\n\t<key>DTSDKName</key>\n\t<string>macosx12.3</string>\n\t<key>DTXcode</key>\n\t<string>1401</string>\n\t<key>DTXcodeBuild</key>\n\t<string>14A400</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>10.12</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2017年 tk. All rights reserved.</string>\n\t<key>showUpdateWindow</key>\n\t<true/>\n\t<key>versionInfo</key>\n\t<string>v1.7.5(2019-01-13):\\n👉🏻  适配微信 Version. 2.3.22\\n👉🏼  菜单栏新增是否允许微信启动时检测更新(非AppStore版本)\\n👉🏽  优化 XML 解析\\n\\n\\n\\nv1.7.3 (2018-10-22)：\\n👉🏻  适配微信 Version. 2.3.19\\n👉🏼  修复安全漏洞(请务必更新，若有安装QQ插件也需要更新)\\n👉🏽  菜单栏-关于小助手-新增 alfred 开关(若不使用 aflred 可关闭)  \\n\\nv1.7.1 (2018-07-24)：\\n👉🏻  适配微信 Version. 2.3.17\\n👉🏼  新增 alfred 搜索最近聊天列表\\n👉🏽  新增 alfred 查看用户聊天记录\\n     (需更新wechat-alfred-workflow)\\n\\nv1.7 (2018-05-12)：\\n👉🏻  新增不同账户设置不同的自动回复&amp;远程控制\\n👉🏼  自动回复新增总开关&amp;指定联系人\\n👉🏽  远程控制新增控制小助手配置\\n👉🏾  新增一键已读\\n👉  新增一键清除空回话\\n👉🏻  新增国际化(支持英、简、繁)\\n👉🏼  新增关于小助手\\n👉🏽  新增在线更新小助手  \\n👉🏾  去除微信url转链处理(从此直接打开抖音链接🌝 \\n👉🏿  修复无法免认证登录&amp;多开等bug \\n</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/A/Resources/TKRemoteControlCommands.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>open /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app || open /System/Library/CoreServices/ScreenSaverEngine.app </string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>ScreenSave</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.ScreenSave</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>/System/Library/CoreServices/Menu\\ Extras/User.menu/Contents/Resources/CGSession -suspend</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>LockScreen</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.LockScreen</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>sleep</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Sleep</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Sleep</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>shutdown</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Shutdown</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Shutdown</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>restart</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Restart</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Restart</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>empty</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>EmptyTrash</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.EmptyTrash</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>mute</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Mute</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Mute</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killQQ</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillQQ</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillQQ</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killWeChat</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>killWeChat</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillWeChat</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killChrome</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillChrome</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillChrome</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killSafari</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillSafari</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillSafari</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killFirefox</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>killFirefox</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillFirefox</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killAll</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillAll</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillAll</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicToggle</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Toggle</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Toggle</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicNext</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Next</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Next</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicPrevious</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Previous</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Previous</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicVolumeUp</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>VolumeUp</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.VolumeUp</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicVolumeDown</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>VolumeDown</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.VolumeDown</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicLike</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>LikeChange</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.LikeChange</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>getDirectiveList</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>getDirective</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.GetList</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>PreventRevokeSwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>PreventRevokeSwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.PreventRevokeSwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>AutoReplySwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>AutoReplySwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.AutoReplySwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>AutoAuthSwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>AutoAuthSwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.AutoAuthSwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t</array>\n</array>\n</plist>\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/A/Resources/en.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset0 HelveticaNeue-Bold;\n\\f3\\fnil\\fcharset134 PingFangSC-Regular;}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs34 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs34 \\cf2 Feature\n\\fs47\\fsmilli23660 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f0\\b0\\fs30 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nMessage auto reply\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nPrevent message recall\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nRemote control(support voice control)\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nMultiple WeChat\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nAuto Auth Login\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nSession Sticky Bottom\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nWindows Sticky Top\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nSession multiple delete\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nAuto Login Switch\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nQuick reply to notifications\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nCopy or Export Sticker\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nUpdate plugin\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nReply or Open session by Alfred\n\\f3\\fs32 \\\n}"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/A/Resources/zh-Hans.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset134 PingFangSC-Semibold;\n\\f3\\fnil\\fcharset0 HelveticaNeue-Bold;\\f4\\fnil\\fcharset134 PingFangSC-Regular;\\f5\\fnil\\fcharset0 AppleColorEmoji;\n}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;\\red255\\green255\\blue255;\n\\red52\\green110\\blue183;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;\\cssrgb\\c100000\\c100000\\c100000;\n\\cssrgb\\c25490\\c51373\\c76863;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}\n{\\list\\listtemplateid2\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid101\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid2}\n{\\list\\listtemplateid3\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid201\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid3}\n{\\list\\listtemplateid4\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid301\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid4}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}{\\listoverride\\listid2\\listoverridecount0\\ls2}{\\listoverride\\listid3\\listoverridecount0\\ls3}{\\listoverride\\listid4\\listoverridecount0\\ls4}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs36\\fsmilli18200 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1\\fs32 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b9\\'a6\\'c4\\'dc\n\\f3\\fs48 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f1\\b0\\fs32 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'b7\\'c0\\'b3\\'b7\\'bb\\'d8\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d4\\'b6\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f1 (\n\\f4 \\'d2\\'d1\\'d6\\'a7\\'b3\\'d6\\'d3\\'ef\\'d2\\'f4\n\\f1 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b6\\'e0\\'bf\\'aa\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'b5\\'da\\'b6\\'fe\\'b4\\'ce\\'b5\\'c7\\'c2\\'bc\\'c3\\'e2\\'c8\\'cf\\'d6\\'a4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'d6\\'c3\\'b5\\'d7\\'b9\\'a6\\'c4\\'dc\n\\f1 (\n\\f4 \\strike \\strikec2 \\'c0\\'e0\\'cb\\'c6\\'d6\\'c3\\'b6\\'a5\n\\f1 \\strike0\\striked0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'b6\\'a5\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'bb\\'e1\\'bb\\'b0\\'b6\\'e0\\'d1\\'a1\\'c9\\'be\\'b3\\'fd\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d7\\'d4\\'b6\\'af\\'b5\\'c7\\'c2\\'bc\\'bf\\'aa\\'b9\\'d8\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cd\\'a8\\'d6\\'aa\\'d6\\'d0\\'d0\\'c4\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'b8\\'b4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'b8\\'b4\\'d6\\'c6\n\\f1  & \n\\f4 \\'b4\\'e6\\'b4\\'a2\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'bc\\'ec\\'b2\\'e2\\'b8\\'fc\\'d0\\'c2\\'cc\\'e1\\'d0\\'d1\n\\f1 \\\n\\pard\\tx0\\tx220\\pardeftab720\\fi-1\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b7\\'a2\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f1  & \n\\f4 \\'b4\\'f2\\'bf\\'aa\\'b4\\'b0\\'bf\\'da\\\n\\pard\\tx0\\tx220\\pardeftab720\\fi-1\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f1 \\cf2 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'bb\\'e1\\'bb\\'b0\\'d2\\'bb\\'bc\\'fc\\'d2\\'d1\\'b6\\'c1\n\\f1 \\cb1 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls1\\ilvl0\\cf2 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d2\\'bb\\'bc\\'fc\\'c7\\'e5\\'b3\\'fd\\'bf\\'d5\\'bb\\'e1\\'bb\\'b0\n\\f1 \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'a7\\'b3\\'d6\\'b9\\'fa\\'bc\\'ca\\'bb\\'af\n\\f1  \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d2\\'bb\\'bc\\'fc\\'b8\\'fc\\'d0\\'c2\n\\f1 \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c8\\'a5\\'b3\\'fd\\'ce\\'a2\\'d0\\'c5\n\\f1 url\n\\f4 \\'d7\\'aa\\'c1\\'b4\\'a3\\'a8\\'b4\\'d3\\'b4\\'cb\\'d6\\'b1\\'bd\\'d3\\'b4\\'f2\\'bf\\'aa\\'b6\\'b6\\'d2\\'f4\\'c1\\'b4\\'bd\\'d3\n\\f5 \\uc0\\u55356 \\u57117 \\\n\\ls1\\ilvl0\n\\f1 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'cb\\'d1\\'cb\\'f7\\'d7\\'ee\\'bd\\'fc\\'c1\\'c4\\'cc\\'ec\\'a1\\'a2\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc\n\\f5 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\n\\f1 \\cf2 \\kerning1\\expnd0\\expndtw0 \t\\'95\t\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d2\\'c6\\'b3\\'fd\\'bb\\'e1\\'bb\\'b0(\\'b2\\'bb\\'c9\\'be\\'b3\\'fd\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc)\\cb1 \\\n\n\\f1 \\cf5 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b8\\'fc\\'d0\\'c2\\'c8\\'d5\\'d6\\'be\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls2\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\ul \\'ca\\'ca\\'c5\\'e4\n\\f1 2.3.17 & \n\\f4 \\'bc\\'d3\\'c7\\'bf\n\\f1  alfred \n\\f4 \\'cb\\'d1\\'cb\\'f7\n\\f1 (2018-07-24)}}\n\\f2\\b\\fs36 \\cf2 \\cb1 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls3\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\ul \\'d0\\'c2\\'d4\\'f6\\'ba\\'c3\\'b6\\'e0\\'b9\\'a6\\'c4\\'dc\n\\f1 \\'85(2018-05-12)}}\n\\f3\\b\\fs36 \\cf2 \\cb1 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls4\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\\'d1\\'d3\\'b3\\'d9\n\\f1  & \n\\f4 \\'d0\\'de\\'b8\\'c4\\'d6\\'c3\\'b6\\'a5\\'b4\\'b0\\'bf\\'da\\'bf\\'ec\\'bd\\'dd\n\\f1 (2018-04-07)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\n\\f1  Alfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b7\\'a2\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f1  & \n\\f4 \\'b4\\'f2\\'bf\\'aa\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\n\\f1 (2018-03-18)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d3\\'ef\\'d2\\'f4\\'d4\\'b6\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f1 mac & \n\\f4 \\'d3\\'c5\\'bb\\'af\\'b3\\'b7\\'bb\\'d8\\'cf\\'fb\\'cf\\'a2\\'a1\\'a2\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'b8\\'b4\n\\f1 (2018-03-03)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'bc\\'ec\\'b2\\'e2\\'b8\\'fc\\'d0\\'c2\n\\f1 &\n\\f4 \\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'b8\\'b4\\'d6\\'c6\\'b4\\'e6\\'b4\\'a2\\'b5\\'c8\\'b5\\'c8\n\\f1  (2018-02-24)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.4.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'b6\\'a5\n\\f1 &\n\\f4 \\'b6\\'e0\\'d1\\'a1\\'c9\\'be\\'b3\\'fd\\'b5\\'c8\\'b5\\'c8\n\\f1  (2017-10-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.3.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d6\\'c3\\'b5\\'d7\n\\f1 &\n\\f4 \\'c3\\'e2\\'c8\\'cf\\'d6\\'a4\n\\f1  (2017-09-17)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.2.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'de\\'b8\\'b4\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc\\'cf\\'fb\\'ca\\'a7\\'b5\\'c4\n\\f1 bug (2017-09-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.1.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'d8\\'b9\\'b9\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\\'a3\\'ac\\'ca\\'b5\\'cf\\'d6\\'b6\\'e0\\'bb\\'d8\\'b8\\'b4\n\\f1  (2017-08-23)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\pardeftab720\\sl264\\slmult1\\partightenfactor0\n\n\\f2\\b \\cf2 \\'cf\\'ea\\'cf\\'b8\\'c4\\'da\\'c8\\'dd\\'c7\\'eb\\'b2\\'e9\\'bf\\'b4{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/CHANGELOG.md\"}}{\\fldrslt \n\\f1\\b0 \\cf5 CHANGELOG}}\n\\f1\\b0 \\cf5 \\\n}"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/A/Resources/zh-Hant.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset134 PingFangSC-Semibold;\n\\f3\\fnil\\fcharset0 HelveticaNeue-Bold;\\f4\\fnil\\fcharset134 PingFangSC-Light;}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}\n{\\list\\listtemplateid2\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid101\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid2}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}{\\listoverride\\listid2\\listoverridecount0\\ls2}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs36\\fsmilli18200 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1\\fs32 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b9\\'a6\\'c4\\'dc\n\\f3\\fs47\\fsmilli23660 \\cf2 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\partightenfactor0\n\\ls1\\ilvl0\n\\f0\\b0\\fs32 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'b7\\'c0\\'b3\\'b7\\'bb\\'d8\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'df\\'68\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f0 (\n\\f4 \\'d2\\'d1\\'d6\\'a7\\'b3\\'d6\\'d5\\'5a\\'d2\\'f4\n\\f0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b6\\'e0\\'e9\\'5f\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'b5\\'da\\'b6\\'fe\\'b4\\'ce\\'b5\\'c7\\'e4\\'9b\\'c3\\'e2\\'d5\\'4a\\'d7\\'43\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'d6\\'c3\\'b5\\'d7\\'b9\\'a6\\'c4\\'dc\n\\f0 (\n\\f4 \\strike \\strikec2 \\'ee\\'90\\'cb\\'c6\\'d6\\'c3\\'ed\\'94\n\\f0 \\strike0\\striked0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'ed\\'94\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'95\\'fe\\'d4\\'92\\'b6\\'e0\\'df\\'78\\'84\\'68\\'b3\\'fd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d7\\'d4\\'84\\'d3\\'b5\\'c7\\'e4\\'9b\\'e9\\'5f\\'ea\\'50\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cd\\'a8\\'d6\\'aa\\'d6\\'d0\\'d0\\'c4\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'8f\\'cd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'8f\\'cd\\'d6\\'c6\n\\f0  & \n\\f4 \\'b4\\'e6\\'83\\'a6\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'99\\'7a\\'9c\\'79\\'b8\\'fc\\'d0\\'c2\\'cc\\'e1\\'d0\\'d1\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b0\\'6c\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f0  & \n\\f4 \\'b4\\'f2\\'e9\\'5f\\'b4\\'b0\\'bf\\'da\n\\f0  \\\n\\pard\\tx566\\pardeftab720\\partightenfactor0\n\n\\fs36\\fsmilli18200 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b8\\'fc\\'d0\\'c2\\'c8\\'d5\\'d5\\'49\n\\f3\\fs47\\fsmilli23660 \\cf2 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls2\\ilvl0\n\\f0\\b0\\fs32 \\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\\'d1\\'d3\\'df\\'74\n\\f0  & \n\\f4 \\'d0\\'de\\'b8\\'c4\\'d6\\'c3\\'ed\\'94\\'b4\\'b0\\'bf\\'da\\'bf\\'ec\\'bd\\'dd\n\\f0 (2018-04-07)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\n\\f0  Alfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b0\\'6c\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f0  & \n\\f4 \\'b4\\'f2\\'e9\\'5f\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\n\\f0 (2018-03-18)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d5\\'5a\\'d2\\'f4\\'df\\'68\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f0 mac & \n\\f4 \\'83\\'9e\\'bb\\'af\\'b3\\'b7\\'bb\\'d8\\'cf\\'fb\\'cf\\'a2\\'a1\\'a2\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'8f\\'cd\n\\f0 (2018-03-03)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'99\\'7a\\'9c\\'79\\'b8\\'fc\\'d0\\'c2\n\\f0 &\n\\f4 \\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'8f\\'cd\\'d6\\'c6\\'b4\\'e6\\'83\\'a6\\'b5\\'c8\\'b5\\'c8\n\\f0  (2018-02-24)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.4.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'ed\\'94\n\\f0 &\n\\f4 \\'b6\\'e0\\'df\\'78\\'84\\'68\\'b3\\'fd\\'b5\\'c8\\'b5\\'c8\n\\f0  (2017-10-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.3.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d6\\'c3\\'b5\\'d7\n\\f0 &\n\\f4 \\'c3\\'e2\\'d5\\'4a\\'d7\\'43\n\\f0  (2017-09-17)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.2.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'de\\'8f\\'cd\\'c1\\'c4\\'cc\\'ec\\'d3\\'9b\\'e4\\'9b\\'cf\\'fb\\'ca\\'a7\\'b5\\'c4\n\\f0 bug (2017-09-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.1.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'d8\\'98\\'8b\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\\'a3\\'ac\\'8c\\'8d\\'ac\\'46\\'b6\\'e0\\'bb\\'d8\\'8f\\'cd\n\\f0  (2017-08-23)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\pardeftab720\\sl264\\slmult1\\partightenfactor0\n\n\\f2\\b \\cf2 \\'d4\\'94\\'bc\\'9a\\'83\\'c8\\'c8\\'dd\\'d5\\'88\\'b2\\'e9\\'bf\\'b4{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/CHANGELOG.md\"}}{\\fldrslt \n\\f0\\b0 \\cf3 CHANGELOG}}\n\\f0\\b0\\fs36\\fsmilli18200 \\cf2 \\\n}"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/Current/Headers/WeChatPlugin.h",
    "content": "//\n//  WeChatPlugin.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n#import \"TKWeChatPluginConfig.h\"\n#import \"TKHelper.h\"\n\nFOUNDATION_EXPORT double WeChatPluginVersionNumber;\nFOUNDATION_EXPORT const unsigned char WeChatPluginVersionString[];\n\n@class WCContactData;\n\n#pragma mark - 微信原始的部分类与方法\n\n@interface MMSystemLinkInfo : NSObject\n@property(retain, nonatomic) NSMutableAttributedString *msgContent;\n\n@end\n@interface MMContactProfileController : NSViewController\n@property(copy, nonatomic) NSString *groupName;\n@property(nonatomic) struct CGRect relativeToRect;\n@property(nonatomic) unsigned long long preferredEdge;\n@property(retain, nonatomic) WCContactData *contactData;\n- (void)sendGetContactRequest:(id)arg1 withGroupName:(id)arg2;\n- (void)showInView:(id)arg1;\n@end\n\n\n@interface MMBrandChatsViewController : NSObject\n- (void)startChatWithContact:(id)arg1;\n@end\n\n@interface MMLoginOneClickViewController : NSViewController\n@property(nonatomic) NSTextField *descriptionLabel;\n- (void)onLoginButtonClicked:(id)arg1;\n@property(nonatomic) NSButton *loginButton;\n@end\n\n@interface AccountService : NSObject\n- (id)GetLastLoginUserName;\n- (id)GetLastLoginAutoAuthKey;\n- (BOOL)canAutoAuth;\n- (void)AutoAuth;\n- (void)ManualLogin:(id)arg1 withPassword:(id)arg2;\n- (void)ManualLogout;\n- (void)FFAddSvrMsgImgVCZZ;\n- (void)QRCodeLoginWithUserName:(id)arg1 password:(id)arg2;\n- (void)onAuthOKOfUser:(id)arg1 withSessionKey:(id)arg2 withServerId:(id)arg3 autoAuthKey:(id)arg4 isAutoAuth:(BOOL)arg5;\n@end\n\n@interface MMLoginViewController : NSObject\n@property(retain, nonatomic) MMLoginOneClickViewController *oneClickViewController;\n@end\n\n@interface MMHandoffButton : NSView\n@end\n\n@interface MMMainViewController : NSObject\n@property(nonatomic) __weak MMHandoffButton *handoffButton;\n@end\n\n@interface MMMainWindowController : NSWindowController\n@property(retain, nonatomic) MMLoginViewController *loginViewController;\n@property(retain, nonatomic) MMMainViewController *mainViewController;\n- (void)onAuthOK;\n- (void)onLogOut;\n@end\n\n@interface MMVoiceTranscribeCGI : NSObject\n- (void)transcribeVoiceMessage:(id)arg1 withCompletion:(void (^)(void))arg2;\n@end\n\n@interface FFProcessReqsvrZZ : NSObject\n- (void)onRevokeMsg:(id)arg1;\n- (void)FFToNameFavChatZZ:(id)arg1;\n- (void)FFToNameFavChatZZ:(id)arg1 sessionMsgList:(id)arg2;\n- (void)OnSyncBatchAddMsgs:(NSArray *)arg1 isFirstSync:(BOOL)arg2;\n- (void)FFImgToOnFavInfoInfoVCZZ:(id)arg1 isFirstSync:(BOOL)arg2;\n- (id)FFProcessTReqZZ:(id)arg1 toUsrName:(id)arg2 msgText:(id)arg3 atUserList:(id)arg4;\n- (id)GetMsgData:(id)arg1 svrId:(long)arg2;\n- (void)AddLocalMsg:(id)arg1 msgData:(id)arg2;\n- (void)TranscribeVoiceMessage:(id)arg1 completion:(void (^)(void))arg2;\n- (BOOL)ClearUnRead:(id)arg1 FromID:(unsigned int)arg2 ToID:(unsigned int)arg3;\n- (BOOL)ClearUnRead:(id)arg1 FromCreateTime:(unsigned int)arg2 ToCreateTime:(unsigned int)arg3;\n- (BOOL)HasMsgInChat:(id)arg1;\n- (id)GetMsgListWithChatName:(id)arg1 fromCreateTime:(unsigned int)arg2 localId:(NSInteger)arg3 limitCnt:(NSInteger)arg4 hasMore:(char *)arg5 sortAscend:(BOOL)arg6;\n- (void)DelMsg:(id)arg1 msgList:(id)arg2 isDelAll:(BOOL)arg3 isManual:(BOOL)arg4;\n@end\n\n@interface MMServiceCenter : NSObject\n+ (id)defaultCenter;\n- (id)getService:(Class)arg1;\n@end\n\n@interface SKBuiltinString_t : NSObject\n@property(retain, nonatomic, setter=SetString:) NSString *string; // @synthesize string;\n@end\n\n@interface AddMsg : NSObject\n@property(retain, nonatomic, setter=SetContent:) SKBuiltinString_t *content; // @synthesize content;\n@property(retain, nonatomic, setter=SetFromUserName:) SKBuiltinString_t *fromUserName; // @synthesize fromUserName;\n@property(nonatomic, setter=SetMsgType:) int msgType; // @synthesize msgType;\n@property(retain, nonatomic, setter=SetToUserName:) SKBuiltinString_t *toUserName; // @synthesize toUserName;\n@property (nonatomic, assign) unsigned int createTime;\n@property(nonatomic, setter=SetNewMsgId:) long long newMsgId;\n@end\n\n@interface MMChatMessageViewController : NSViewController\n@property(retain, nonatomic) WCContactData *chatContact;\n@property(nonatomic) __weak NSTableView *messageTableView;\n- (void)scrollToMessage:(NSUInteger)arg1;\n- (BOOL)showLocatedMessage:(NSUInteger)arg1;\n- (BOOL)showLocatedMessage:(unsigned int)arg1 needHighLighted:(BOOL)arg2;\n- (void)onClickSession;\n- (void)reloadTableView;\n@end\n\n@interface MMChatDetailSplitViewController : NSObject\n@property(retain, nonatomic) MMChatMessageViewController *chatMessageViewController;\n@end\n\n@interface MMChatsViewController : NSViewController <NSTableViewDataSource, NSTableViewDelegate>\n@property(nonatomic) __weak NSTableView *tableView;\n@property(retain, nonatomic) MMBrandChatsViewController *brandChatsViewController;\n@property(retain, nonatomic) MMChatDetailSplitViewController *chatDetailSplitViewController;\n@end\n\n@interface WeChat : NSObject\n+ (id)sharedInstance;\n@property(nonatomic) MMChatsViewController *chatsViewController;\n@property(retain, nonatomic) MMMainWindowController *mainWindowController;\n@property(nonatomic) BOOL isAppTerminating;\n@property(nonatomic) BOOL hasAuthOK;\n- (void)startANewChatWithContact:(id)arg1;\n- (void)_clearAllUnreadMessages:(id)arg1;\n- (void)onAuthOK:(BOOL)arg1;\n- (void)checkForUpdatesInBackground;\n- (void)FFAddRecvFavZZ:(BOOL)arg1;\n@end\n\n@interface ContactStorage : NSObject\n- (id)GetSelfContact;\n- (id)GetContact:(id)arg1;\n- (id)GetAllBrandContacts;\n- (id)GetAllFavContacts;\n- (id)GetAllFriendContacts;\n@end\n\n@interface GroupStorage : NSObject\n{\n    NSMutableDictionary *m_dictGroupContacts;\n}\n- (id)GetAllGroups;\n- (id)GetGroupMemberContact:(id)arg1;\n- (void)notifyModifyGroupContactsOnMainThread:(id)arg1;\n//- (id)GetGroupMemberListWithGroupContact:(id)arg1;\n- (id)GetGroupMemberListWithGroupContact:(id)arg1 limit:(unsigned int)arg2 filterSelf:(BOOL)arg3;\n@end\n\n@interface ChatRoomData : NSObject\n{\n    NSMutableDictionary *m_dicData;\n}\n@end\n\n@interface WCContactData : NSObject\n@property(retain, nonatomic) NSString *m_nsUsrName; // @synthesize m_nsUsrName;\n@property(nonatomic) unsigned int m_uiFriendScene;  // @synthesize m_uiFriendScene;\n@property(retain, nonatomic) NSString *m_nsNickName;    // 用户昵称\n@property(retain, nonatomic) NSString *m_nsRemark;      // 备注\n@property(retain, nonatomic) NSString *m_nsHeadImgUrl;  // 头像\n@property(retain, nonatomic) NSString *m_nsHeadHDImgUrl;\n@property(retain, nonatomic) NSString *m_nsHeadHDMd5;\n@property(retain, nonatomic) NSString *m_nsAliasName;\n@property(retain, nonatomic) NSString *avatarCacheKey;\n@property(readonly, nonatomic) unsigned long long groupMemberCount;\n@property(retain, nonatomic) ChatRoomData *m_chatRoomData;\n@property(nonatomic) BOOL m_isShowRedDot;\n- (BOOL)isBrandContact;\n- (BOOL)isSelf;\n- (id)innerGetGroupDisplayName;\n- (NSString *)groupChatDisplayNameInGroup:(id)arg1;\n- (id)getContactDisplayUsrName;\n- (BOOL)isGroupChat;\n- (BOOL)isMMChat;\n- (BOOL)isMMContact;\n- (BOOL)containsMember:(id)arg1;\n- (id)displayRegion;\n- (BOOL)isStickyFolder;\n@end\n\n@interface WCPayInfoItem : NSObject\n@property(retain, nonatomic) NSString *m_nsFeeDesc;\n@end\n\n@interface MessageData : NSObject\n- (id)initWithMsgType:(long long)arg1;\n@property(retain, nonatomic) NSString *fromUsrName;\n@property(retain, nonatomic) NSString *toUsrName;\n@property(retain, nonatomic) NSString *msgContent;\n@property(retain, nonatomic) NSString *msgPushContent;\n@property(retain, nonatomic) NSString *realChatUserName;\n@property(retain, nonatomic) WCPayInfoItem *m_oWCPayInfoItem; // @dynamic m_oWCPayInfoItem;\n@property(retain, nonatomic) NSString *m_nsAppName;\n@property(retain, nonatomic) NSString *m_nsSourceDisplayname;\n@property(nonatomic) int messageType;\n@property(nonatomic) int msgStatus;\n@property(nonatomic) int msgCreateTime;\n@property(nonatomic) int mesLocalID;\n@property(nonatomic) long long mesSvrID;\n@property(retain, nonatomic) NSString *msgVoiceText;\n@property(copy, nonatomic) NSString *m_nsEmoticonMD5;\n- (BOOL)isChatRoomMessage;\n- (NSString *)groupChatSenderDisplayName;\n- (id)getRealMessageContent;\n- (id)getChatRoomUsrName;\n- (BOOL)isSendFromSelf;\n- (BOOL)isCustomEmojiMsg;\n- (BOOL)isImgMsg;\n- (BOOL)isVideoMsg;\n- (BOOL)isVoiceMsg;\n- (BOOL)canForward;\n- (BOOL)IsPlayingSound;\n- (id)summaryString:(BOOL)arg1;\n- (BOOL)isEmojiAppMsg;\n- (BOOL)isAppBrandMsg;\n- (BOOL)IsUnPlayed;\n- (void)SetPlayed;\n@property(retain, nonatomic) NSString *m_nsTitle;\n- (id)originalImageFilePath;\n@property(retain, nonatomic) NSString *m_nsVideoPath;\n@property(retain, nonatomic) NSString *m_nsFilePath;\n@property(retain, nonatomic) NSString *m_nsAppMediaUrl;\n@property(nonatomic) MessageData *m_refMessageData;\n@property(nonatomic) unsigned int m_uiDownloadStatus;\n- (void)SetPlayingSoundStatus:(BOOL)arg1;\n@end\n\n@interface CUtility : NSObject\n+ (BOOL)HasWechatInstance;\n+ (BOOL)FFSvrChatInfoMsgWithImgZZ;\n+ (unsigned long long)getFreeDiskSpace;\n+ (void)ReloadSessionForMsgSync;\n+ (id)GetCurrentUserName;\n+ (id)GetContactByUsrName:(id)arg1;\n+ (BOOL)IsStickyChatsFolder:(id)arg1;\n@end\n\n@interface MMSessionInfoPackedInfo: NSObject\n@property(retain, nonatomic) WCContactData *m_contact;\n@property(retain, nonatomic) MessageData *m_msgData;\n@end\n\n@interface MMSessionInfo : NSObject\n@property(nonatomic) BOOL m_bIsTop; // @synthesize m_bIsTop;\n@property(nonatomic) BOOL m_bShowUnReadAsRedDot;\n@property(nonatomic) BOOL m_isMentionedUnread; // @synthesize\n@property BOOL isInGroupBox; \n@property(retain, nonatomic) NSString *m_nsUserName; // @synthesize m_nsUserName;\n@property(retain, nonatomic) MMSessionInfoPackedInfo *m_packedInfo;\n@property(nonatomic) unsigned int m_uUnReadCount; \n@end\n\n@protocol MMChatsTableCellViewDelegate <NSObject>\n@optional\n- (void)cellViewReloadData:(MMSessionInfo *)arg1;\n@end\n\n@interface MMChatsTableCellView : NSTableCellView\n@property(nonatomic) __weak id <MMChatsTableCellViewDelegate> delegate;\n@property(retain, nonatomic) MMSessionInfo *sessionInfo;\n- (void)menuWillOpen:(id)arg1;\n- (void)contextMenuSticky:(id)arg1;\n- (void)contextMenuDelete:(id)arg1;\n- (void)tableView:(NSTableView *)arg1 rowGotMouseDown:(long long)arg2;\n@end\n\n@interface MMSessionMgr : NSObject\n//@property(retain, nonatomic) NSMutableArray *m_arrSession;\n- (id)getSessionAtIndex:(unsigned long long)arg1;\n- (id)sessionInfoByUserName:(id)arg1;\n- (void)muteSessionByUserName:(id)arg1;\n- (void)onUnReadCountChange:(id)arg1;\n//- (void)TopSessionByUserName:(id)arg1;\n- (void)unmuteSessionByUserName:(id)arg1;\n- (void)untopSessionByUserName:(id)arg1;\n- (void)changeSessionUnreadCountWithUserName:(id)arg1 to:(unsigned int)arg2;\n- (void)removeSessionOfUser:(id)arg1 isDelMsg:(BOOL)arg2;\n- (void)sortSessions;\n- (void)FFDataSvrMgrSvrFavZZ;\n- (id)getContact:(id)arg1;\n- (id)getSessionContact:(id)arg1;\n- (void)onModifyContacts:(id)arg1;\n- (NSMutableArray *)getAllSessions;\n@end\n\n@interface LogoutCGI : NSTableCellView\n- (void)sendLogoutCGIWithCompletion:(id)arg1;\n- (void)FFVCRecvDataAddDataToMsgChatMgrRecvZZ:(id)arg1;\n@end\n\n@interface MMNotificationService : NSObject\n- (id)getNotificationContentWithMsgData:(id)arg1;\n- (void)userNotificationCenter:(id)arg1 didActivateNotification:(id)arg2;\n@end\n\n@interface MMMessageTableItem : NSObject\n@property(retain, nonatomic) MessageData *message;\n@end\n\n@interface MMStickerMessageCellView : NSObject\n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@property(nonatomic) MMChatMessageViewController *delegate;\n- (BOOL)allowCopy;\n- (void)contextMenuCopy;\n- (id)contextMenu;\n@end\n\n@interface MMImageMessageCellView: NSObject\n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@end\n\n@interface MMSystemMessageCellView: NSObject\n@property(nonatomic) id delegate; \n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@property(retain, nonatomic) NSTextView *msgTextView;\n- (void)populateWithMessage:(id)arg1;\n@end\n@interface EmoticonMgr : NSObject\n@property(retain, nonatomic) MessageData *message;\n- (id)getEmotionDataWithMD5:(id)arg1;\n- (id)getEmotionImgWithMD5:(id)arg1;\n- (void)addFavEmoticon:(id)arg1;\n- (void)addEmoticonToUploadQueueWithMD5:(id)arg1;\n- (void)setAppStickerToastViewDelegate:(id)arg1;\n@end\n\n@interface MMComplexContactSearchTaskMgr : NSObject\n+ (id)sharedInstance;\n- (void)doComplexContactSearch:(id)arg1 searchScene:(unsigned long long)arg2 complete:(void (^)(NSString *,NSArray *, NSArray *, NSArray *,id))arg3 cancelable:(BOOL)arg4;\n@end\n\n@interface MMBasicSearchResult : NSObject\n@end\n\n@interface MMSearchResultItem : NSObject\n@property(retain, nonatomic) MMBasicSearchResult *result;\n@end\n\n@interface MMSearchResultContainer : NSObject\n@property(nonatomic) unsigned long long logicSearchResultFlag; // @synthesize\n@end\n\n@interface MMContactSearchLogic : NSObject\n{\n    unsigned long long _logicSearchResultFlag;      // 2.3.19 失效\n}\n@property(retain, nonatomic) NSMutableArray *contactResults;\n- (void)doSearchWithKeyword:(id)arg1 searchScene:(unsigned long long)arg2 resultIsShownBlock:(id)arg3 completion:(id)arg4;\n@property(retain, nonatomic) NSMutableArray *groupResults;\n@property(nonatomic) BOOL isBrandContactSearched;\n@property(nonatomic) BOOL isChatLogSearched;\n@property(nonatomic) BOOL isContactSearched;\n@property(nonatomic) BOOL isGroupContactSearched;\n@property(retain, nonatomic) NSMutableArray *oaResults;\n- (void)clearAllResults;    //  2.3.19 失效\n- (void)clearDataWhenSearchEnd;\n- (void)reloadSearchResultDataWithKeyword:(id)arg1 completionBlock:(id)arg2;    //  2.3.17\n- (void)reloadSearchResultDataWithCompletionBlock:(id)arg1;                     //  2.3.13\n- (void)reloadSearchResultDataWithKeyword:(id)arg1 resultContainer:(id)arg2 completionBlock:(id)arg3;\n@property(retain, nonatomic) MMSearchResultContainer *searchResultContainer;\n@end\n\n@interface MMComplexContactSearchResult : MMBasicSearchResult\n@property(retain, nonatomic) NSString *fieldValue;\n@property(retain, nonatomic) WCContactData *contact;\n@property(nonatomic) unsigned long long fieldType;  // 1：备注 3：昵称 4：微信号  8：省份  7：市  9：国家\n@end\n\n@interface MMComplexGroupContactMembersSearchResult : MMBasicSearchResult\n@property(retain, nonatomic) NSMutableArray<MMComplexContactSearchResult *> *membersSearchReults;\n@end\n\n@interface MMComplexGroupContactSearchResult : MMBasicSearchResult\n@property(nonatomic) unsigned long long searchType;     // 1 名称 2 群成员名称\n@property(retain) WCContactData *groupContact;\n@property(retain, nonatomic) MMComplexGroupContactMembersSearchResult *groupMembersResult;\n@end\n\n@interface MMAvatarService : NSObject\n- (NSString *)avatarCachePath;\n- (id)_getImageFromCacheWithMD5Key:(id)arg1;\n- (void)avatarImageWithContact:(id)arg1 completion:(void (^)(NSImage *image))arg2;\n- (void)getAvatarImageWithContact:(id)arg1 completion:(void (^)(NSImage *image))arg2;\n@end\n\n@interface NSString (MD5)\n- (id)md5String;\n@end\n\n@interface MMSessionPickerLogic : NSObject\n@property(nonatomic) NSArray *selectedUserNames;\n@end\n\n\n@interface MMSessionListView : NSObject\n{\n    MMSessionPickerLogic *m_logic;\n}\n@end\n\n@interface MMSessionPickerWindow : NSWindowController\n+ (id)shareInstance;\n- (void)beginSheetForWindow:(id)arg1 completionHandler:(void(^)(id a1))arg2;\n@property(retain, nonatomic) id choosenViewController; // @synthesize\n@property(retain, nonatomic) id listViewController; // @synthesize\n- (void)setShowsGroupChats:(BOOL)arg1;\n- (void)setShowsOfficialAccounts:(BOOL)arg1;\n- (void)setShowsOtherNonhumanChats:(BOOL)arg1;\n- (void)setType:(unsigned long long)arg1;\n\n@end\n\n@interface AFHTTPResponseSerializer : NSObject\n@end\n\n@interface AFURLSessionManager : NSObject\n- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request\n                                             progress:(void (^)(NSProgress *downloadProgress))downloadProgressBlock\n                                          destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination\n                                    completionHandler:(void (^)(NSURLResponse *response, NSURL * filePath, NSError * error))completionHandler;\n- (id)initWithSessionConfiguration:(id)arg1;\n@end\n\n@interface AFHTTPRequestSerializer : NSObject\n+ (id)serializer;\n@property(nonatomic) unsigned long long cachePolicy;\n@end\n\n@interface AFHTTPSessionManager : NSObject\n+ (AFHTTPSessionManager *)manager;\n@property(retain, nonatomic) AFHTTPRequestSerializer *requestSerializer;\n@property(retain, nonatomic) AFHTTPResponseSerializer *responseSerializer;\n@end\n\n@interface MMURLHandler : NSObject\n+ (id)defaultHandler;\n- (void)startGetA8KeyWithURL:(id)arg1;\n- (BOOL)openURLWithDefault:(id)arg1;\n+ (BOOL)containsHTTPString:(id)arg1;\n- (void)openURLWithDefault:(id)arg1 useA8Key:(BOOL)arg2;\n- (BOOL)preHandleUrlStr:(id)arg1 withMessage:(id)arg2;\n@end\n\n@interface UserDefaultsService : NSObject\n- (void)setString:(id)arg1 forKey:(id)arg2;\n- (id)stringForKey:(id)arg1;\n@end\n\n@interface MMLinkInfo : NSObject\n+ (NSRange)rangeOfUrlInString:(id)arg1 withRange:(NSRange)arg2;\n@end\n\n@interface MMCDNDownloadMgr : NSObject\n- (BOOL)downloadImageWithMessage:(id)arg1 disableHevc:(BOOL)arg2 downloadType:(unsigned long long)arg3;\n@end\n\n@interface MMMessageVideoService : NSObject\n- (BOOL)downloadVideoWithMessage:(id)arg1;\n@end\n\n@interface MMVoiceMessagePlayer : NSObject\n+ (id)defaultPlayer;\n- (void)playWithVoiceMessage:(id)arg1 isUnplayedBeforePlay:(BOOL)arg2;\n- (void)playVoiceWithMessage:(id)arg1 isUnplayedBeforePlay:(BOOL)arg2;\n- (void)stop;\n@end\n\n@interface MultiPlatformStatusSyncMgr : NSObject\n- (void)markVoiceMessageAsRead:(id)arg1;\n@end\n\n@interface EmoticonDownloadMgr : NSObject\n- (void)downloadEmoticonWithMessageData:(id)arg1;\n@end\n\n@interface PathUtility : NSObject\n+ (id)GetCurUserCachePath;\n+ (id)emoticonPath:(id)arg1;\n+ (id)getMsgVideoPathWithMessage:(id)arg1;\n+ (id)getMsgVideoPathWithUserName:(id)arg1 localId:(unsigned int)arg2;\n@end\n\n@interface MMExtensionCenter : NSObject\n- (id)getExtension:(id)arg1;\n@end\n\n@interface MMExtension : NSObject\n- (BOOL)registerExtension:(id)arg1;\n- (void)unregisterExtension:(id)arg1;\n- (id)getExtensionListForSelector:(SEL)arg1;\n@end\n\n@interface EmoticonMsgInfo : NSObject\n@property(copy, nonatomic) NSString *cdnUrl;\n@property(copy, nonatomic) NSString *m_nsMD5;\n@end\n\n@protocol EmoticonDownloadMgrExt <NSObject>\n@optional\n- (void)emoticonDownloadFailed:(EmoticonMsgInfo *)arg1;\n- (void)emoticonDownloadFinished:(EmoticonMsgInfo *)arg1;\n@end\n\n@protocol IGroupMgrExt <NSObject>\n\n@end\n\n@interface MMChatMangerSearchReportMgr : NSObject\n@property(retain, nonatomic) NSMutableArray *brandContactSearchResults;\n@property(retain, nonatomic) NSMutableArray *chatLogSearchResults;\n@property(retain, nonatomic) NSMutableArray *contactSearchResults;\n@property(retain, nonatomic) NSMutableArray *groupContactSearchResults;\n@end\n\n@interface MMWebViewHelper : NSObject\n+ (BOOL)preHandleWebUrlStr:(id)arg1 withMessage:(id)arg2;\n@end\n\n@interface XMLDictionaryParser : NSObject\n+ (id)sharedInstance;\n- (id)dictionaryWithString:(id)arg1;\n@end\n\n@interface MMEmoticonData : NSObject\n@property(retain, nonatomic) NSString *md5; // @synthesize md5=_md5;\n@end\n\n@interface MMStickerPickerCell : NSView <NSMenuDelegate>\n@property(retain, nonatomic) MMEmoticonData *emoticonData; // @synthesize emoticonData=_emoticonData;\n@property(nonatomic) __weak NSScrollView *collectionView; \n@end\n\n@interface MMStickerCollectionViewController : NSViewController\n@property(nonatomic) __weak id delegate;\n@end\n\n@interface MMStickerPicker : NSViewController\n- (void)hide;\n@end\n\n@interface MMVoiceTranslateMgr : NSObject\n- (void)doTranslate:(id)arg1 isAuto:(BOOL)arg2;\n- (void)updateTranscribeVoiceMessage:(id)arg1 voiceText:(id)arg2 voiceToTextStatus:(unsigned int)arg3;\n@end\n\n@interface MMAppBrandMessageCellView : NSObject\n+ (id)makeAppBrandTableItemWithItem:(id)arg1;\n@end\n\n@interface MMUnsupportedCellView : NSObject\n+ (id)makeUnsupportedTableItemWithItem:(id)arg1;\n@end\n\n@interface MMPayTransferCellView : NSObject\n+ (id)makePayTransferTableItemWithItem:(id)arg1;\n@end\n\n\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/Current/Modules/module.modulemap",
    "content": "framework module WeChatPlugin {\n  umbrella header \"WeChatPlugin.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/Current/Resources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>BuildMachineOSBuild</key>\n\t<string>22D68</string>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>WeChatPlugin</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>tk.WeChatPlugin</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>WeChatPlugin</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.7.5</string>\n\t<key>CFBundleSupportedPlatforms</key>\n\t<array>\n\t\t<string>MacOSX</string>\n\t</array>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>DTCompiler</key>\n\t<string>com.apple.compilers.llvm.clang.1_0</string>\n\t<key>DTPlatformBuild</key>\n\t<string>14A400</string>\n\t<key>DTPlatformName</key>\n\t<string>macosx</string>\n\t<key>DTPlatformVersion</key>\n\t<string>12.3</string>\n\t<key>DTSDKBuild</key>\n\t<string>21E226</string>\n\t<key>DTSDKName</key>\n\t<string>macosx12.3</string>\n\t<key>DTXcode</key>\n\t<string>1401</string>\n\t<key>DTXcodeBuild</key>\n\t<string>14A400</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>10.12</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2017年 tk. All rights reserved.</string>\n\t<key>showUpdateWindow</key>\n\t<true/>\n\t<key>versionInfo</key>\n\t<string>v1.7.5(2019-01-13):\\n👉🏻  适配微信 Version. 2.3.22\\n👉🏼  菜单栏新增是否允许微信启动时检测更新(非AppStore版本)\\n👉🏽  优化 XML 解析\\n\\n\\n\\nv1.7.3 (2018-10-22)：\\n👉🏻  适配微信 Version. 2.3.19\\n👉🏼  修复安全漏洞(请务必更新，若有安装QQ插件也需要更新)\\n👉🏽  菜单栏-关于小助手-新增 alfred 开关(若不使用 aflred 可关闭)  \\n\\nv1.7.1 (2018-07-24)：\\n👉🏻  适配微信 Version. 2.3.17\\n👉🏼  新增 alfred 搜索最近聊天列表\\n👉🏽  新增 alfred 查看用户聊天记录\\n     (需更新wechat-alfred-workflow)\\n\\nv1.7 (2018-05-12)：\\n👉🏻  新增不同账户设置不同的自动回复&amp;远程控制\\n👉🏼  自动回复新增总开关&amp;指定联系人\\n👉🏽  远程控制新增控制小助手配置\\n👉🏾  新增一键已读\\n👉  新增一键清除空回话\\n👉🏻  新增国际化(支持英、简、繁)\\n👉🏼  新增关于小助手\\n👉🏽  新增在线更新小助手  \\n👉🏾  去除微信url转链处理(从此直接打开抖音链接🌝 \\n👉🏿  修复无法免认证登录&amp;多开等bug \\n</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/Current/Resources/TKRemoteControlCommands.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>open /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app || open /System/Library/CoreServices/ScreenSaverEngine.app </string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>ScreenSave</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.ScreenSave</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>/System/Library/CoreServices/Menu\\ Extras/User.menu/Contents/Resources/CGSession -suspend</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>LockScreen</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.LockScreen</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>sleep</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Sleep</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Sleep</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>shutdown</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Shutdown</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Shutdown</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>restart</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Restart</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Restart</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>empty</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>EmptyTrash</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.EmptyTrash</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>mute</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Mute</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Mute</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killQQ</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillQQ</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillQQ</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killWeChat</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>killWeChat</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillWeChat</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killChrome</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillChrome</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillChrome</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killSafari</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillSafari</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillSafari</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killFirefox</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>killFirefox</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillFirefox</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killAll</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillAll</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillAll</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicToggle</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Toggle</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Toggle</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicNext</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Next</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Next</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicPrevious</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Previous</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Previous</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicVolumeUp</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>VolumeUp</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.VolumeUp</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicVolumeDown</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>VolumeDown</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.VolumeDown</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicLike</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>LikeChange</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.LikeChange</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>getDirectiveList</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>getDirective</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.GetList</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>PreventRevokeSwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>PreventRevokeSwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.PreventRevokeSwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>AutoReplySwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>AutoReplySwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.AutoReplySwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>AutoAuthSwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>AutoAuthSwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.AutoAuthSwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t</array>\n</array>\n</plist>\n"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/Current/Resources/en.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset0 HelveticaNeue-Bold;\n\\f3\\fnil\\fcharset134 PingFangSC-Regular;}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs34 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs34 \\cf2 Feature\n\\fs47\\fsmilli23660 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f0\\b0\\fs30 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nMessage auto reply\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nPrevent message recall\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nRemote control(support voice control)\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nMultiple WeChat\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nAuto Auth Login\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nSession Sticky Bottom\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nWindows Sticky Top\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nSession multiple delete\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nAuto Login Switch\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nQuick reply to notifications\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nCopy or Export Sticker\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nUpdate plugin\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nReply or Open session by Alfred\n\\f3\\fs32 \\\n}"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/Current/Resources/zh-Hans.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset134 PingFangSC-Semibold;\n\\f3\\fnil\\fcharset0 HelveticaNeue-Bold;\\f4\\fnil\\fcharset134 PingFangSC-Regular;\\f5\\fnil\\fcharset0 AppleColorEmoji;\n}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;\\red255\\green255\\blue255;\n\\red52\\green110\\blue183;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;\\cssrgb\\c100000\\c100000\\c100000;\n\\cssrgb\\c25490\\c51373\\c76863;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}\n{\\list\\listtemplateid2\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid101\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid2}\n{\\list\\listtemplateid3\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid201\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid3}\n{\\list\\listtemplateid4\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid301\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid4}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}{\\listoverride\\listid2\\listoverridecount0\\ls2}{\\listoverride\\listid3\\listoverridecount0\\ls3}{\\listoverride\\listid4\\listoverridecount0\\ls4}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs36\\fsmilli18200 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1\\fs32 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b9\\'a6\\'c4\\'dc\n\\f3\\fs48 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f1\\b0\\fs32 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'b7\\'c0\\'b3\\'b7\\'bb\\'d8\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d4\\'b6\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f1 (\n\\f4 \\'d2\\'d1\\'d6\\'a7\\'b3\\'d6\\'d3\\'ef\\'d2\\'f4\n\\f1 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b6\\'e0\\'bf\\'aa\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'b5\\'da\\'b6\\'fe\\'b4\\'ce\\'b5\\'c7\\'c2\\'bc\\'c3\\'e2\\'c8\\'cf\\'d6\\'a4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'d6\\'c3\\'b5\\'d7\\'b9\\'a6\\'c4\\'dc\n\\f1 (\n\\f4 \\strike \\strikec2 \\'c0\\'e0\\'cb\\'c6\\'d6\\'c3\\'b6\\'a5\n\\f1 \\strike0\\striked0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'b6\\'a5\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'bb\\'e1\\'bb\\'b0\\'b6\\'e0\\'d1\\'a1\\'c9\\'be\\'b3\\'fd\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d7\\'d4\\'b6\\'af\\'b5\\'c7\\'c2\\'bc\\'bf\\'aa\\'b9\\'d8\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cd\\'a8\\'d6\\'aa\\'d6\\'d0\\'d0\\'c4\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'b8\\'b4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'b8\\'b4\\'d6\\'c6\n\\f1  & \n\\f4 \\'b4\\'e6\\'b4\\'a2\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'bc\\'ec\\'b2\\'e2\\'b8\\'fc\\'d0\\'c2\\'cc\\'e1\\'d0\\'d1\n\\f1 \\\n\\pard\\tx0\\tx220\\pardeftab720\\fi-1\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b7\\'a2\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f1  & \n\\f4 \\'b4\\'f2\\'bf\\'aa\\'b4\\'b0\\'bf\\'da\\\n\\pard\\tx0\\tx220\\pardeftab720\\fi-1\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f1 \\cf2 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'bb\\'e1\\'bb\\'b0\\'d2\\'bb\\'bc\\'fc\\'d2\\'d1\\'b6\\'c1\n\\f1 \\cb1 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls1\\ilvl0\\cf2 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d2\\'bb\\'bc\\'fc\\'c7\\'e5\\'b3\\'fd\\'bf\\'d5\\'bb\\'e1\\'bb\\'b0\n\\f1 \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'a7\\'b3\\'d6\\'b9\\'fa\\'bc\\'ca\\'bb\\'af\n\\f1  \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d2\\'bb\\'bc\\'fc\\'b8\\'fc\\'d0\\'c2\n\\f1 \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c8\\'a5\\'b3\\'fd\\'ce\\'a2\\'d0\\'c5\n\\f1 url\n\\f4 \\'d7\\'aa\\'c1\\'b4\\'a3\\'a8\\'b4\\'d3\\'b4\\'cb\\'d6\\'b1\\'bd\\'d3\\'b4\\'f2\\'bf\\'aa\\'b6\\'b6\\'d2\\'f4\\'c1\\'b4\\'bd\\'d3\n\\f5 \\uc0\\u55356 \\u57117 \\\n\\ls1\\ilvl0\n\\f1 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'cb\\'d1\\'cb\\'f7\\'d7\\'ee\\'bd\\'fc\\'c1\\'c4\\'cc\\'ec\\'a1\\'a2\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc\n\\f5 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\n\\f1 \\cf2 \\kerning1\\expnd0\\expndtw0 \t\\'95\t\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d2\\'c6\\'b3\\'fd\\'bb\\'e1\\'bb\\'b0(\\'b2\\'bb\\'c9\\'be\\'b3\\'fd\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc)\\cb1 \\\n\n\\f1 \\cf5 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b8\\'fc\\'d0\\'c2\\'c8\\'d5\\'d6\\'be\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls2\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\ul \\'ca\\'ca\\'c5\\'e4\n\\f1 2.3.17 & \n\\f4 \\'bc\\'d3\\'c7\\'bf\n\\f1  alfred \n\\f4 \\'cb\\'d1\\'cb\\'f7\n\\f1 (2018-07-24)}}\n\\f2\\b\\fs36 \\cf2 \\cb1 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls3\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\ul \\'d0\\'c2\\'d4\\'f6\\'ba\\'c3\\'b6\\'e0\\'b9\\'a6\\'c4\\'dc\n\\f1 \\'85(2018-05-12)}}\n\\f3\\b\\fs36 \\cf2 \\cb1 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls4\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\\'d1\\'d3\\'b3\\'d9\n\\f1  & \n\\f4 \\'d0\\'de\\'b8\\'c4\\'d6\\'c3\\'b6\\'a5\\'b4\\'b0\\'bf\\'da\\'bf\\'ec\\'bd\\'dd\n\\f1 (2018-04-07)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\n\\f1  Alfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b7\\'a2\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f1  & \n\\f4 \\'b4\\'f2\\'bf\\'aa\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\n\\f1 (2018-03-18)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d3\\'ef\\'d2\\'f4\\'d4\\'b6\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f1 mac & \n\\f4 \\'d3\\'c5\\'bb\\'af\\'b3\\'b7\\'bb\\'d8\\'cf\\'fb\\'cf\\'a2\\'a1\\'a2\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'b8\\'b4\n\\f1 (2018-03-03)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'bc\\'ec\\'b2\\'e2\\'b8\\'fc\\'d0\\'c2\n\\f1 &\n\\f4 \\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'b8\\'b4\\'d6\\'c6\\'b4\\'e6\\'b4\\'a2\\'b5\\'c8\\'b5\\'c8\n\\f1  (2018-02-24)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.4.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'b6\\'a5\n\\f1 &\n\\f4 \\'b6\\'e0\\'d1\\'a1\\'c9\\'be\\'b3\\'fd\\'b5\\'c8\\'b5\\'c8\n\\f1  (2017-10-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.3.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d6\\'c3\\'b5\\'d7\n\\f1 &\n\\f4 \\'c3\\'e2\\'c8\\'cf\\'d6\\'a4\n\\f1  (2017-09-17)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.2.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'de\\'b8\\'b4\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc\\'cf\\'fb\\'ca\\'a7\\'b5\\'c4\n\\f1 bug (2017-09-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.1.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'d8\\'b9\\'b9\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\\'a3\\'ac\\'ca\\'b5\\'cf\\'d6\\'b6\\'e0\\'bb\\'d8\\'b8\\'b4\n\\f1  (2017-08-23)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\pardeftab720\\sl264\\slmult1\\partightenfactor0\n\n\\f2\\b \\cf2 \\'cf\\'ea\\'cf\\'b8\\'c4\\'da\\'c8\\'dd\\'c7\\'eb\\'b2\\'e9\\'bf\\'b4{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/CHANGELOG.md\"}}{\\fldrslt \n\\f1\\b0 \\cf5 CHANGELOG}}\n\\f1\\b0 \\cf5 \\\n}"
  },
  {
    "path": "Other/Products/Debug/WeChatPlugin.framework/Versions/Current/Resources/zh-Hant.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset134 PingFangSC-Semibold;\n\\f3\\fnil\\fcharset0 HelveticaNeue-Bold;\\f4\\fnil\\fcharset134 PingFangSC-Light;}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}\n{\\list\\listtemplateid2\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid101\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid2}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}{\\listoverride\\listid2\\listoverridecount0\\ls2}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs36\\fsmilli18200 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1\\fs32 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b9\\'a6\\'c4\\'dc\n\\f3\\fs47\\fsmilli23660 \\cf2 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\partightenfactor0\n\\ls1\\ilvl0\n\\f0\\b0\\fs32 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'b7\\'c0\\'b3\\'b7\\'bb\\'d8\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'df\\'68\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f0 (\n\\f4 \\'d2\\'d1\\'d6\\'a7\\'b3\\'d6\\'d5\\'5a\\'d2\\'f4\n\\f0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b6\\'e0\\'e9\\'5f\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'b5\\'da\\'b6\\'fe\\'b4\\'ce\\'b5\\'c7\\'e4\\'9b\\'c3\\'e2\\'d5\\'4a\\'d7\\'43\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'d6\\'c3\\'b5\\'d7\\'b9\\'a6\\'c4\\'dc\n\\f0 (\n\\f4 \\strike \\strikec2 \\'ee\\'90\\'cb\\'c6\\'d6\\'c3\\'ed\\'94\n\\f0 \\strike0\\striked0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'ed\\'94\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'95\\'fe\\'d4\\'92\\'b6\\'e0\\'df\\'78\\'84\\'68\\'b3\\'fd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d7\\'d4\\'84\\'d3\\'b5\\'c7\\'e4\\'9b\\'e9\\'5f\\'ea\\'50\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cd\\'a8\\'d6\\'aa\\'d6\\'d0\\'d0\\'c4\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'8f\\'cd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'8f\\'cd\\'d6\\'c6\n\\f0  & \n\\f4 \\'b4\\'e6\\'83\\'a6\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'99\\'7a\\'9c\\'79\\'b8\\'fc\\'d0\\'c2\\'cc\\'e1\\'d0\\'d1\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b0\\'6c\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f0  & \n\\f4 \\'b4\\'f2\\'e9\\'5f\\'b4\\'b0\\'bf\\'da\n\\f0  \\\n\\pard\\tx566\\pardeftab720\\partightenfactor0\n\n\\fs36\\fsmilli18200 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b8\\'fc\\'d0\\'c2\\'c8\\'d5\\'d5\\'49\n\\f3\\fs47\\fsmilli23660 \\cf2 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls2\\ilvl0\n\\f0\\b0\\fs32 \\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\\'d1\\'d3\\'df\\'74\n\\f0  & \n\\f4 \\'d0\\'de\\'b8\\'c4\\'d6\\'c3\\'ed\\'94\\'b4\\'b0\\'bf\\'da\\'bf\\'ec\\'bd\\'dd\n\\f0 (2018-04-07)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\n\\f0  Alfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b0\\'6c\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f0  & \n\\f4 \\'b4\\'f2\\'e9\\'5f\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\n\\f0 (2018-03-18)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d5\\'5a\\'d2\\'f4\\'df\\'68\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f0 mac & \n\\f4 \\'83\\'9e\\'bb\\'af\\'b3\\'b7\\'bb\\'d8\\'cf\\'fb\\'cf\\'a2\\'a1\\'a2\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'8f\\'cd\n\\f0 (2018-03-03)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'99\\'7a\\'9c\\'79\\'b8\\'fc\\'d0\\'c2\n\\f0 &\n\\f4 \\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'8f\\'cd\\'d6\\'c6\\'b4\\'e6\\'83\\'a6\\'b5\\'c8\\'b5\\'c8\n\\f0  (2018-02-24)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.4.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'ed\\'94\n\\f0 &\n\\f4 \\'b6\\'e0\\'df\\'78\\'84\\'68\\'b3\\'fd\\'b5\\'c8\\'b5\\'c8\n\\f0  (2017-10-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.3.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d6\\'c3\\'b5\\'d7\n\\f0 &\n\\f4 \\'c3\\'e2\\'d5\\'4a\\'d7\\'43\n\\f0  (2017-09-17)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.2.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'de\\'8f\\'cd\\'c1\\'c4\\'cc\\'ec\\'d3\\'9b\\'e4\\'9b\\'cf\\'fb\\'ca\\'a7\\'b5\\'c4\n\\f0 bug (2017-09-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.1.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'d8\\'98\\'8b\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\\'a3\\'ac\\'8c\\'8d\\'ac\\'46\\'b6\\'e0\\'bb\\'d8\\'8f\\'cd\n\\f0  (2017-08-23)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\pardeftab720\\sl264\\slmult1\\partightenfactor0\n\n\\f2\\b \\cf2 \\'d4\\'94\\'bc\\'9a\\'83\\'c8\\'c8\\'dd\\'d5\\'88\\'b2\\'e9\\'bf\\'b4{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/CHANGELOG.md\"}}{\\fldrslt \n\\f0\\b0 \\cf3 CHANGELOG}}\n\\f0\\b0\\fs36\\fsmilli18200 \\cf2 \\\n}"
  },
  {
    "path": "Other/Uninstall.sh",
    "content": "# !/bin/bash\n\nwechat_path=\"/Applications/WeChat.app\"\n\nif [ ! -d \"$wechat_path\" ]\nthen\nwechat_path=\"/Applications/微信.app\"\nif [ ! -d \"$wechat_path\" ]\nthen\necho -e \"\\n\\n应用程序文件夹中未发现微信，请检查微信是否有重命名或者移动路径位置\"\nexit\nfi\nfi\n\napp_name=\"WeChat\"\nframework_name=\"WeChatPlugin\"\napp_bundle_path=\"${wechat_path}/Contents/MacOS\"\napp_executable_path=\"${app_bundle_path}/${app_name}\"\napp_executable_backup_path=\"${app_executable_path}_backup\"\nframework_path=\"${app_bundle_path}/${framework_name}.framework\"\n\n# 备份WeChat原始可执行文件\nif [ -f \"$app_executable_backup_path\" ]\nthen\nrm \"$app_executable_path\"\nrm -rf \"$framework_path\"\nmv \"$app_executable_backup_path\" \"$app_executable_path\"\n\nif [ -f \"$app_executable_backup_path\" ]\nthen\n\techo \"卸载失败，请到 /Applications/WeChat.app/Contents/MacOS 路径，删除 WeChatPlugin.framework、WeChat 两个文件文件，并将 WeChat_backup 重命名为 WeChat\"\nelse\n\techo \"\\n\\t卸载成功\"\nfi\n\nelse\necho \"\\n\\t未发现微信小助手\"\nfi\n"
  },
  {
    "path": "Other/Update.sh",
    "content": "#!/bin/bash\n\napp_name=\"WeChat\"\nshell_path=\"$(dirname \"$0\")\"\nwechat_path=\"/Applications/WeChat.app\"\nframework_name=\"WeChatPlugin\"\napp_bundle_path=\"/Applications/${app_name}.app/Contents/MacOS\"\napp_executable_path=\"${app_bundle_path}/${app_name}\"\napp_executable_backup_path=\"${app_executable_path}_backup\"\nframework_path=\"${app_bundle_path}/${framework_name}.framework\"\n\n# 对 WeChat 赋予权限\nif [ ! -w \"$wechat_path\" ]\nthen\necho -e \"\\n\\n为了将小助手写入微信, 请输入密码 ： \"\nsudo chown -R $(whoami) \"$wechat_path\"\nfi\n\n# 备份 WeChat 原始可执行文件\nif [ ! -f \"$app_executable_backup_path\" ]\nthen\ncp \"$app_executable_path\" \"$app_executable_backup_path\"\nfi\n\ncp -r \"${shell_path}/Products/Debug/${framework_name}.framework\" ${app_bundle_path}\n${shell_path}/insert_dylib --all-yes \"${framework_path}/${framework_name}\" \"$app_executable_backup_path\" \"$app_executable_path\"\n${shell_path}/UpdateRemoteControlCommandsPlist.py\n"
  },
  {
    "path": "Other/UpdateRemoteControlCommandsPlist.py",
    "content": "#! /usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\"\nu为老用户自动同步新的plist，不改变已有的entry设置.\n\"\"\"\n\nimport sys, os\nimport plistlib\n\nPLIST_REMOTE_SUB_PATH = 'Products/Debug/WeChatPlugin.framework/Resources/TKRemoteControlCommands.plist'\nPLIST_LOCAL_PATH = os.path.expanduser('~') + '/Library/Containers/com.tencent.xinWeChat/Data/Documents/TKWeChatPlugin/'\n\ndef ExportPlistToDict(plist, key):\n    plist_dic = {}\n    for l1 in plist:\n        for l2 in l1:\n            plist_dic[l2[key]] = l2\n    return plist_dic\n\ndef SyncPlistContent(remote_plist, local_plist, key):\n    local_plist_dic = ExportPlistToDict(local_plist, key)\n\n    new_tmp_plist = []\n    for l1 in remote_plist:\n        new_tmp_plist.append([])\n        for l2 in l1:\n            if l2[key] in local_plist_dic:\n                new_tmp_plist[-1].append(local_plist_dic[l2[key]])\n            else:\n                new_tmp_plist[-1].append(l2)\n\n    return new_tmp_plist\n\ndef main():\n    root_path = os.path.dirname(os.path.abspath(sys.argv[0])) + '/'\n    PLIST_REMOTE_PATH = root_path + PLIST_REMOTE_SUB_PATH\n\n    if not os.path.isfile(PLIST_REMOTE_PATH) or not os.path.exists(PLIST_LOCAL_PATH):\n        print('Find plist failed... exit')\n        return 1\n\n    remote_plist = plistlib.readPlist(PLIST_REMOTE_PATH)\n\n    for user in os.listdir(PLIST_LOCAL_PATH):\n        user_plist_dir = os.path.join(PLIST_LOCAL_PATH, user, 'TKRemoteControlCommands.plist')\n        if not os.path.isfile(user_plist_dir):\n            continue\n\n        local_plist = plistlib.readPlist(user_plist_dir)\n        new_plist = SyncPlistContent(remote_plist, local_plist, 'function')\n        plistlib.writePlist(new_plist, user_plist_dir)\n\n    return 0\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "Podfile",
    "content": "platform :osx, '10.12'\ninhibit_all_warnings!\n\ntarget 'WeChatPlugin' do\n  pod 'GCDWebServer', '~> 3.4.2'\nend\n"
  },
  {
    "path": "Q&A.md",
    "content": "## 常见问题解决方法：\n\n##### 0. 开场:   \n由于微信每次更新都会更新一些方法，因此建议可以先备份当前可用的微信.app(~~其实我是不太建议更新的~~)，这样避免微信更新之后，小助手部分功能失效或者闪退。\n\n---\n\n##### 1. 为什么我更新微信之后菜单栏小助手不见了？\n\n因为微信更新之后，整个 app 都被覆盖，所以小助手也被清空，这时候只要重新安装小助手即可。\n\n---\n\n##### 2. 为什么更新了微信之后闪退/崩溃？\n\n因为微信更换了API，导致小助手找不到对应的方法、函数，因此崩溃，解决方法有两种：1. 下载旧版本的微信。2.卸载微信小助手。\n\n---\n\n##### 3. 有没有微信群或者 QQ群讨论？\n\n没有，目前没有这个打算。\n\n---\n\n##### 4. omw 无法安装或者是安装时候不是最新？\n\nomw 的问题可以去 [oh-my-wechat](https://github.com/lmk123/oh-my-wechat) 提 issue，这样作者能够及时解决。\n如果使用omw更新小助手不是最新的，可以使用其他安装方法试试。\n\n---\n\n##### 5. 如何卸载小助手？\n\n在终端执行 Other 文件夹中的 Uninstall.sh，如果无效的话，那么再终端执行以下代码:\n\n`cd /Applications/WeChat.app/Contents/MacOS && mv WeChat_backup WeChat`\n\n如果在无效，那么请在Finder中应用程序中，右击微信.app，查看包内容，打开目录`/Contents/MacOS `，将`WeChat_backup`改名为 `WeChat`\n\n---\n\n##### 6. 如何禁止微信更新？\n\n可以下载小助手1.7.5，如果是从官网下载，点击菜单栏的`微信小助手`-`禁止微信启动时检测更新`，如果是从 App Store，那么请在 App Store 中设置去除自动更新下载。\n\n##### 7. 能不能做朋友圈或者微信抢红包？\n\n* 不能，朋友圈工作量大，细节多，没有那么多的时间。\n* 抢红包是不可能的，这辈子都不可能的，因为也没有人给我发红包。\n\n---\n\n##### 8. 能不能做群管理或者是自动添加好友？\n\n不能，目前如果是有点微商性质的功能还是尽量避免，避免打扰到别人。\n\n---\n\n##### 9. 能不能做群发消息或者定时发送消息？\n\n不能，目前如果是有点微商性质的功能还是尽量避免，避免打扰到别人。\n\n---\n\n##### 10. 为什么不支持企业微信？\n\n企业微信跟普通的微信是两个app，方法也不一样，另外本人没有使用企业微信，因此不打算。\n\n---\n\n##### 11. 为什么菜单栏的小助手无法点击？\n\n因为目前小助手的功能是分账号设置的，因为如果用户退出登录的话，那么将无法点击，只有重新登录微信才行。\n\n---\n\n##### 12. Safari /共享无法分享到微信？\n\n目前无法解决。\n\n---\n\n##### 13. 休眠无法自动同步微信消息？\n\n目前还无法解决。\n\n---\n\n##### 14. 作者是不是不更新了？\n\n* 作者的目标是一年两更，现在已达标完成了。\n\n\n\n"
  },
  {
    "path": "README.md",
    "content": "\n\n![微信小助手.png](./Other/ScreenShots/wechatplugin.png)\n\n![platform](https://img.shields.io/badge/platform-macos-lightgrey.svg)  [![release](https://img.shields.io/badge/release-v1.7.5-brightgreen.svg)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases)  ![support](https://img.shields.io/badge/support-wechat%202.3.22-blue.svg)  [![Readme](https://img.shields.io/badge/readme-english-yellow.svg)](./README_EN.md)   [![GitHub license](https://img.shields.io/github/license/TKkk-iOSer/WeChatPlugin-MacOS.svg)](./LICENSE)\n\n# 微信小助手 v2.0\n\n **[English](./README_EN.md) | 中文**\n\n\n[ [功能](#功能) &bull; [更新日志](#更新日志) &bull; [Demo演示](#demo演示) &bull; [使用](#使用) &bull; [安装](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/Install.md) &bull; [卸载](#卸载) &bull; [TODO](#todo) ]\n\n其他插件：\n[ [wechat-alfred-workflow](https://github.com/TKkk-iOSer/wechat-alfred-workflow) &bull; [QQ 版本](https://github.com/TKkk-iOSer/QQPlugin-macOS) ]\n\n---\n\n## 功能\n* 消息自动回复\n* 消息防撤回\n* 远程控制(已支持语音)\n* 微信多开\n* 第二次登录免认证\n* 聊天置底功能(~~类似置顶~~)\n* 微信窗口置顶\n* 会话多选删除\n* 自动登录开关\n* 通知中心快捷回复\n* 聊天窗口表情包复制 & 存储\n* 小助手检测更新提醒\n* alfred 快捷发送消息 & 打开窗口 (需安装：[wechat-alfred-workflow](https://github.com/TKkk-iOSer/wechat-alfred-workflow))\n* 会话一键已读\n* 一键清除空会话\n* 支持国际化\n* 新增一键更新\n* 新增关于小助手\n* 去除微信url转链（从此直接打开抖音链接🌝\n* 史上最强 alfred 扩展🌚\n* 新增移除会话(不删除聊天记录)\n* 菜单栏(关于小助手)新增 alfred 开关 \n* 新增是否使用微信自带浏览器开关\n* 新增[LaunchBar 扩展](https://github.com/VDeamoV/WeChatHelper)\n* 新增禁止微信检测更新开关(非App Store版本)\n* ~~新增小助手.app安装方式~~\n* 支持退群监控，撤回消息定位\n* 支持微信 3.7.0 \n\n**若无使用 alfred，则不必打开 alfred 开关**\n\n远程控制：\n\n- [x] 屏幕保护\n- [x] 清空废纸篓\n- [x] 锁屏、休眠、关机、重启\n- [x] 退出QQ、WeChat、Chrome、Safari、所有程序\n- [x] 网易云音乐(播放、暂停、下一首、上一首、喜欢、取消喜欢)\n- [x] 小助手(获取指令、防撤回开关、自动回复开关、免认证登录开关)\n\n**若想使用远程控制网易云音乐，请在“系统偏好设置 ==> 安全性与隐私 ==> 隐私 ==> 辅助功能”中添加微信、脚本编辑器**\n\n---\n\n## 更新日志\n\n* [适配3.7.0(2023-03-12)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v2.0)\n* [适配2.3.22 & 新增禁止微信检测更新开关(2019-01-13)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7.5)\n* [适配2.3.19 & 修复安全漏洞(2018-10-23)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7.3)\n* [适配2.3.17 & 加强 alfred 搜索(2018-07-24)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7.1)\n* [新增好多功能…(2018-05-12)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7)\n* [新增自动回复延迟 & 修改置顶窗口快捷(2018-04-07)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6.1)\n* [新增 Alfred 快捷发送消息 & 打开聊天窗口(2018-03-18)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6)\n* [新增语音远程控制mac & 优化撤回消息、快捷回复(2018-03-03)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.1)\n* [新增小助手检测更新&表情包复制存储等等 (2018-02-24)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.0)\n* [新增窗口置顶&多选删除等等 (2017-10-11)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.4.0)\n* [新增置底&免认证 (2017-09-17)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.3.0)\n* [修复聊天记录消失的bug (2017-09-11)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.2.0)\n* [重构自动回复，实现多回复 (2017-08-23)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.1.0)\n\n**详细内容请查看**[CHANGELOG](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/CHANGELOG.md)\n\n---\n\n## Demo演示\n\n* 消息防撤回\n![消息防撤回.gif](http://upload-images.jianshu.io/upload_images/965383-30cbea645661e627.gif?imageMogr2/auto-orient/strip)\n\n* 自动回复\n![自动回复.gif](http://upload-images.jianshu.io/upload_images/965383-d488dce3696ba1b3.gif?imageMogr2/auto-orient/strip)\n\n* 微信多开\n![微信多开.gif](http://upload-images.jianshu.io/upload_images/965383-51d8eae02d48fda9.gif?imageMogr2/auto-orient/strip)\n\n* 远程控制 (测试关闭Chrome、QQ、开启屏幕保护)\n![远程控制.gif](http://upload-images.jianshu.io/upload_images/965383-0cf50d9b22b02f2f.gif?imageMogr2/auto-orient/strip)\n\n* 免认证 & 置底 & 多选删除\n![免认证&置底&多选删除](http://upload-images.jianshu.io/upload_images/965383-170592b03781cbf4.gif?imageMogr2/auto-orient/strip)\n\n* 通知中心快捷回复\n![快捷回复](./Other/ScreenShots/notification_quick_reply.gif)\n\n* 聊天窗口表情复制 & 存储\n<img src=\"./Other/ScreenShots/emotion_copy_export.png\" height=\"400\" hspace=\"50\" />\n\n* 语音远程控制 mac\n![语音远程控制](./Other/ScreenShots/voice_remote_control.gif)\n\n* Alfred 快速搜索 [wechat-alfred-workflow](https://github.com/TKkk-iOSer/wechat-alfred-workflow)   \n![alfred](./Other/ScreenShots/alfred_search.gif)\n\n* Alfred 搜索最近聊天列表 & 查看聊天记录   \n![alfred](./Other/ScreenShots/alfred_chat_log.gif)\n\n* 一键已读 & 一键清除空回话\n![基本操作](./Other/ScreenShots/session_empty_and_clean.gif)\n\n---\n\n## 使用\n\n* 消息防撤回：点击`开启消息防撤回`或者快捷键`command + t`,即可开启、关闭。\n* 自动回复：点击`开启自动回复`或者快捷键`conmand + k`，将弹出自动回复设置的窗口，点击红色箭头的按钮设置开关。\n\n>若关键字为 `*`，则任何信息都回复；\n>若关键字为`x|y`,则 x 和 y 都回复；\n>若关键字**或者**自动回复为空，则不开启该条自动回复；\n>可设置延迟回复，单位：秒；\n>若开启正则，请确认正则表达式书写正确，[在线正则表达式测试](http://tool.oschina.net/regex/)\n**若开启特定联系人回复，则原先的群聊&私聊回复无效**\n\n![自动回复设置.png](./Other/ScreenShots/auto_reply.png)\n\n* 微信多开：点击`登录新微信`或者快捷键`command + shift + n`,即可多开微信。\n\n* 远程控制：点击`远程控制 Mac OS`或者快捷键`command + shift + c`,即可打开控制窗口。\n\n**注意：仅向自己账号发送指令有效**\n\n![远程控制设置.png](./Other/ScreenShots/remote_control.png)\n\n* Alfred 使用：请查看 [wechat-alfred-workflow](https://github.com/TKkk-iOSer/wechat-alfred-workflow)\n\n---\n\n## 安装\n\n详细安装方法(或者需要重新编译)请查阅 [Install.md](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/Install.md)\n\n#### 1. 安装\n\n**若提示无权限：`Permission denied`，执行 `sudo chmod -R 777 /Applications/WeChat.app`**\n\n##### 1.1 需要安装Git\n\n打开`应用程序-实用工具-Terminal(终端)`，执行下面的命令安装\n\n`cd ~/Downloads && rm -rf WeChatPlugin-MacOS && git clone https://github.com/TKkk-iOSer/WeChatPlugin-MacOS.git --depth=1 && ./WeChatPlugin-MacOS/Other/Install.sh`\n\n\n#### 2. 普通安装\n\n* 点击`clone or download`按钮下载 WeChatPlugin 并解压，打开Terminal(终端)，拖动解压后`Install.sh` 文件(在 Other 文件夹中)到 Terminal 回车即可。\n\n#### 3. 安装完成\n\n* 重启微信，在**菜单栏**中看到**微信小助手**即安装成功。\n\n![微信小助手.png](./Other/ScreenShots/wechatplugin.png)\n\n---\n\n## 卸载\n\n打开Terminal(终端)，拖动解压后`Uninstall.sh` 文件(在 Other 文件夹中)到 Terminal 回车即可。\n\n---\n\n## TODO\n- [x] 增加`Alfred`搜索\n- [ ] 查看单向好友\n- [ ] 增加 brew 安装方式\n- [x] 完善自动回复(指定好友回复)\n- [x] 完善消息防撤回(显示撤回用户昵称)\n- [x] ~~清除微信缓存(官方已加)~~\n- [x] 优化小助手设置(更新后保留相关设置，更新提醒)\n- [x] 语音远程控制 mac\n- [x] 支持中英文\n- [ ] 支持深色模式\n\n---\n\n## 依赖\n\n* [insert_dylib](https://github.com/Tyilo/insert_dylib)\n* [fishhook](https://github.com/facebook/fishhook)\n* [GCDWebServer](https://github.com/swisspol/GCDWebServer)\n\n---\n\n### 免责声明\n* 使用插件有风险，使用需谨慎。\n* 本项目旨在提升生活幸福感使用，不可用于商业和个人其他意图。若使用不当，请使用者自行承担。\n* 如有侵权，请联系本人。tkk.ioser@gmail.com\n\n\n"
  },
  {
    "path": "README_EN.md",
    "content": "\n\n![wechat assistant.png](./Other/ScreenShots/en/wechatplugin.png)\n\n![platform](https://img.shields.io/badge/platform-macos-lightgrey.svg)  [![release](https://img.shields.io/badge/release-v1.7-brightgreen.svg)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases)  ![support](https://img.shields.io/badge/support-wechat%202.3.10-blue.svg)  [![Readme](https://img.shields.io/badge/readme-中文-yellow.svg)](./README.md)  [![GitHub license](https://img.shields.io/github/license/TKkk-iOSer/WeChatPlugin-MacOS.svg)](https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/LICENSE)\n\n# WeChatPlugin-macOS v1.7\n\n**English | [中文](./README.md)**\n\n[ [Feature](#feature) &bull; [Install](#install) &bull; [Uninstall](#uninstall) &bull; [Usage](#usage)]\n\nOther plugin：  \n[ [wechat-alfred-workflow](https://github.com/TKkk-iOSer/wechat-alfred-workflow) &bull; [QQPlugin-macOS](https://github.com/TKkk-iOSer/QQPlugin-macOS) &bull; [WeChatPlugin-iOS](https://github.com/TKkk-iOSer/WeChatPlugin-iOS) ]\n\n---\n\n## Feature\n\n* Message auto reply\n* Prevent message recall\n* Remote control(support voice control)\n* Multiple WeChat\n* Auto Auth Login\n* Session Sticky Bottom\n* Windows Sticky Top\n* Session multiple delete\n* Auto Login Switch\n* Quick reply to notifications\n* Copy or Export Sticker\n* Update plugin\n* Reply or Open session by Alfred  (dependency：[wechat-alfred-workflow](https://github.com/TKkk-iOSer/wechat-alfred-workflow))\n* Make all session As Read\n* Clear all empty session\n* Remove url redirect\n\nRemote Control：\n\n- [x] Save Screen\n- [x] Empty Trash\n- [x] Lock Screen & Sleep  & Shut Down & Restart\n- [x] Quit some app, include QQ、WeChat、Chrome、Safari。\n- [x] NeteaseMusic(play、pause、next song、previous song、like song、unlike song)\n- [x] Assistant(get all directive、prevent recall switch、auto reply switch、auto auth switch)\n\n**If you want to control NeteaseMusic, please allow WeChat Control in \"System Preferences-Security & Privacy-Privacy-Accessibility\"**\n\n---\n\n## Install\n\n**1. If you have installed Git**\n\nopen `/Applications/Utilities/Terminal.app`，run command\n\n`cd ~/Downloads && rm -rf WeChatPlugin-MacOS && git clone https://github.com/TKkk-iOSer/WeChatPlugin-MacOS.git --depth=1 && ./WeChatPlugin-MacOS/Other/Install.sh`, and enter the mac password.\n\n**2. Normal install**\n\n* click `clone or download` button to download project and unzip it，open Terminal.app，Drag the `Install.sh` file(in `Other` Folder) to Terminal.\n\n---\n\n## Uninstall\nopen `/Applications/Utilities/Terminal.app`,Drag the `Uninstall.sh` file(in `Other` Folder) to Terminal.\n\n---\n\n## Usage\n\n> A few examples of how to use WeChatPlugin-macOS.\n\n* Prevent message recall   \n  ![Prevent message recall](./Other/ScreenShots/en/prevent_recall.gif)\n\n* Message auto reply\n  ![Message auto reply](./Other/ScreenShots/en/auto_reply.gif)\n\n* Auto Login & Multiple WeChat\n  ![Auto Auth & Multiple WeChat](./Other/ScreenShots/en/auto_auth_and_new.gif)\n\n* Remote control (quit Chrome and Save Screen)\n  ![remote_control.gif](./Other/ScreenShots/en/remote_control.gif)\n\n* Session multiple delete & session sticky bottom &  delete empty session\n  ![wechat assistant.png](./Other/ScreenShots/en/multiselect_and_stick_bottom_and_clear_empty.gif)\n\n\n* Quick reply to notifications &  make all as Read  \n  ![wechat assistant.png](./Other/ScreenShots/en/quick_reply_and_make_read.gif)\n\n\n* Copy or export sticker  \n  <img src=\"./Other/ScreenShots/en/emotion_copy_export.png\" height=\"400\" hspace=\"50\" />\n\n* Reply or Open session by Alfred  [wechat-alfred-workflow](https://github.com/TKkk-iOSer/wechat-alfred-workflow)   \n  ![Alfred](./Other/ScreenShots/en/alfred.gif)\n\n\n---\n\n## Dependency\n\n* [insert_dylib](https://github.com/Tyilo/insert_dylib)\n* [fishhook](https://github.com/facebook/fishhook)\n* [GCDWebServer](https://github.com/swisspol/GCDWebServer)\n\n\n"
  },
  {
    "path": "WeChatPlugin/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(MARKETING_VERSION)</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2017年 tk. All rights reserved.</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n\t<key>showUpdateWindow</key>\n\t<true/>\n\t<key>versionInfo</key>\n\t<string>v1.7.5(2019-01-13):\\n👉🏻  适配微信 Version. 2.3.22\\n👉🏼  菜单栏新增是否允许微信启动时检测更新(非AppStore版本)\\n👉🏽  优化 XML 解析\\n\\n\\n\\nv1.7.3 (2018-10-22)：\\n👉🏻  适配微信 Version. 2.3.19\\n👉🏼  修复安全漏洞(请务必更新，若有安装QQ插件也需要更新)\\n👉🏽  菜单栏-关于小助手-新增 alfred 开关(若不使用 aflred 可关闭)  \\n\\nv1.7.1 (2018-07-24)：\\n👉🏻  适配微信 Version. 2.3.17\\n👉🏼  新增 alfred 搜索最近聊天列表\\n👉🏽  新增 alfred 查看用户聊天记录\\n     (需更新wechat-alfred-workflow)\\n\\nv1.7 (2018-05-12)：\\n👉🏻  新增不同账户设置不同的自动回复&amp;远程控制\\n👉🏼  自动回复新增总开关&amp;指定联系人\\n👉🏽  远程控制新增控制小助手配置\\n👉🏾  新增一键已读\\n👉  新增一键清除空回话\\n👉🏻  新增国际化(支持英、简、繁)\\n👉🏼  新增关于小助手\\n👉🏽  新增在线更新小助手  \\n👉🏾  去除微信url转链处理(从此直接打开抖音链接🌝 \\n👉🏿  修复无法免认证登录&amp;多开等bug \\n</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSButton+Action.h",
    "content": "//\n//  NSButton+Action.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/9/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface NSButton (Action)\n\n+ (instancetype)tk_buttonWithTitle:(NSString *)title target:(id)target action:(SEL)action;\n+ (instancetype)tk_checkboxWithTitle:(NSString *)title target:(id)target action:(SEL)action;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSButton+Action.m",
    "content": "//\n//  NSButton+Action.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/9/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"NSButton+Action.h\"\n\n@implementation NSButton (Action)\n\n+ (instancetype)tk_checkboxWithTitle:(NSString *)title target:(id)target action:(SEL)action {\n    NSButton *btn = [self tk_buttonWithTitle:title target:target action:action];\n    [btn setButtonType:NSButtonTypeSwitch];\n    \n    return btn;\n}\n\n+ (instancetype)tk_buttonWithTitle:(NSString *)title target:(id)target action:(SEL)action {\n    NSButton *btn = ({\n        NSButton *btn = [[self alloc] init];\n        btn.title = title;\n        btn.target = target;\n        btn.action = action;\n        \n        btn;\n    });\n    \n    return btn;\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSDate+Action.h",
    "content": "//\n//  NSDate+Action.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/7/25.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSDate (Action)\n\n- (BOOL)isToday;\n- (BOOL)isYesterday;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSDate+Action.m",
    "content": "//\n//  NSDate+Action.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/7/25.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"NSDate+Action.h\"\n\n@implementation NSDate (Action)\n\n- (BOOL)isToday {\n    NSCalendar *calendar = [NSCalendar currentCalendar];\n    NSInteger unit = NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear ;\n    \n    NSDateComponents *nowComponents = [calendar components:unit fromDate:[NSDate date]];\n    NSDateComponents *selfComponents = [calendar components:unit fromDate:self];\n    \n    return (selfComponents.year == nowComponents.year) && (selfComponents.month == nowComponents.month) && (selfComponents.day == nowComponents.day);\n}\n\n- (BOOL)isYesterday {\n    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];\n    formatter.dateFormat = @\"yyyy-MM-dd\";\n    \n    NSDate *nowDate = [formatter dateFromString:[formatter stringFromDate:[NSDate date]]];\n    NSDate *selfDate = [formatter dateFromString:[formatter stringFromDate:self]];;\n    NSCalendar *calendar = [NSCalendar currentCalendar];\n    NSDateComponents *cmps = [calendar components:NSCalendarUnitDay fromDate:selfDate toDate:nowDate options:0];\n    \n    return cmps.day == 1;\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSMenu+Action.h",
    "content": "//\n//  NSMenu+Action.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/15.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface NSMenu (Action)\n\n- (void)addItems:(NSArray *)subItems;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSMenu+Action.m",
    "content": "//\n//  NSMenu+Action.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/15.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"NSMenu+Action.h\"\n\n@implementation NSMenu (Action)\n\n- (void)addItems:(NSArray *)subItems {\n    for (NSMenuItem *item in subItems) {\n        NSAssert([item isKindOfClass:[NSMenuItem class]], @\"the elements must be a NSMenuItem!\");\n        [self addItem:item];\n    }\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSMenuItem+Action.h",
    "content": "//\n//  NSMenuItem+Action.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/25.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface NSMenuItem (Action)\n\n+ (NSMenuItem *)menuItemWithTitle:(NSString *)title action:(SEL)selector target:(id)target keyEquivalent:(NSString *)key state:(NSControlStateValue)state;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSMenuItem+Action.m",
    "content": "//\n//  NSMenuItem+Action.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/25.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"NSMenuItem+Action.h\"\n\n@implementation NSMenuItem (Action)\n\n+ (NSMenuItem *)menuItemWithTitle:(NSString *)title action:(SEL)selector target:(id)target keyEquivalent:(NSString *)key state:(NSControlStateValue)state {\n    NSMenuItem *item = [[self alloc] initWithTitle:title action:selector keyEquivalent:key];\n    item.target = target;\n    item.state = state;\n    \n    return item;\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSString+Action.h",
    "content": "//\n//  NSString+Action.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/5/1.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (Action)\n\n- (CGFloat)widthWithFont:(NSFont *)font;\n- (NSRect)rectWithFont:(NSFont *)font;\n- (NSString *)substringFromString:(NSString *)fromStr;\n- (NSString *)substringToString:(NSString *)fromStr;\n- (NSString *)substringFromString:(NSString *)fromStr toString:(NSString *)toString; \n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSString+Action.m",
    "content": "//\n//  NSString+Action.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/5/1.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"NSString+Action.h\"\n\n@implementation NSString (Action)\n\n- (CGFloat)widthWithFont:(NSFont *)font {\n    return [self rectWithFont:font].size.width;\n}\n\n- (NSRect)rectWithFont:(NSFont *)font {\n    return [self boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font}];\n}\n\n- (NSString *)substringFromString:(NSString *)fromStr {\n    if (!fromStr || [fromStr isKindOfClass:NSNull.class]) {\n        return self;\n    }\n    NSRange range = [self rangeOfString:fromStr];\n    if (range.length > 0) {\n        return [self substringFromIndex:range.location + range.length];\n    }\n    return nil;\n}\n\n- (NSString *)substringToString:(NSString *)fromStr {\n    if (!fromStr || [fromStr isKindOfClass:NSNull.class]) {\n        return self;\n    }\n   NSRange range = [self rangeOfString:fromStr];\n    if (range.length > 0) {\n        return [self substringToIndex:range.location];\n    }\n    return nil;\n}\n\n- (NSString *)substringFromString:(NSString *)fromStr toString:(NSString *)toString {\n    NSString *subString = [self substringFromString:fromStr];\n    subString = [subString substringToString:toString];\n\n    return subString;\n}\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSTextField+Action.h",
    "content": "//\n//  NSTextField+Action.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/9/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface NSTextField (Action)\n\n+ (instancetype)tk_labelWithString:(NSString *)stringValue;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSTextField+Action.m",
    "content": "//\n//  NSTextField+Action.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/9/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"NSTextField+Action.h\"\n\n@implementation NSTextField (Action)\n\n+ (instancetype)tk_labelWithString:(NSString *)stringValue {\n    NSTextField *textField = ({\n        NSTextField *textField = [[self alloc] initWithFrame:NSMakeRect(10, 10, 200, 17)];\n        [textField setStringValue:stringValue];\n        [textField setBezeled:NO];\n        [textField setDrawsBackground:NO];\n        [textField setEditable:NO];\n        [textField setSelectable:NO];\n        \n        textField;\n    });\n\n    return textField;\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSView+Action.h",
    "content": "//\n//  NSView+Action.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/20.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface NSView (Action)\n\n- (void)addSubviews:(NSArray *)subViews;\n\n@end\n\n@interface NSView (Size)\n\n@property (nonatomic) CGPoint origin;\n@property (nonatomic) CGSize size;\n@property (nonatomic) CGFloat x;\n@property (nonatomic) CGFloat y;\n@property (nonatomic) CGFloat width;\n@property (nonatomic) CGFloat height;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSView+Action.m",
    "content": "//\n//  NSView+Action.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/20.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"NSView+Action.h\"\n\n@implementation NSView (Action)\n\n- (void)addSubviews:(NSArray *)subViews {\n    for (NSView *v in subViews) {\n        NSAssert([v isKindOfClass:[NSView class]], @\"the elements must be a view!\");\n        [self addSubview:v];\n    }\n}\n\n@end\n\n@implementation NSView (Size)\n\n- (CGPoint)origin {\n    return self.frame.origin;\n}\n\n- (void)setOrigin:(CGPoint)point {\n    CGRect rect = self.frame;\n    \n    rect.origin = point;\n    self.frame = rect;\n}\n\n- (CGSize)size {\n    return self.frame.size;\n}\n\n- (void)setSize:(CGSize)size {\n    CGRect rect = self.frame;\n    \n    rect.size = size;\n    self.frame = rect;\n}\n\n- (CGFloat)x {\n    return self.frame.origin.x;\n}\n\n- (void)setX:(CGFloat)x {\n    [self setOrigin:CGPointMake(x, self.y)];\n}\n\n- (CGFloat)y {\n    return self.frame.origin.y;\n}\n\n- (void)setY:(CGFloat)y {\n    [self setOrigin:CGPointMake(self.x, y)];\n}\n\n- (CGFloat)width {\n    return self.frame.size.width;\n}\n\n- (void)setWidth:(CGFloat)width {\n    [self setSize:CGSizeMake(width, self.height)];\n}\n\n- (CGFloat)height {\n    return self.frame.size.height;\n}\n\n- (void)setHeight:(CGFloat)height {\n    [self setSize:CGSizeMake(self.width, height)];\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSWindowController+Action.h",
    "content": "//\n//  NSWindowController+Action.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/5/4.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface NSWindowController (Action)\n\n- (void)show;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Category/NSWindowController+Action.m",
    "content": "//\n//  NSWindowController+Action.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/5/4.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"NSWindowController+Action.h\"\n\n@implementation NSWindowController (Action)\n\n- (void)show {\n    [self showWindow:self];\n    [self.window center];\n    [self.window makeKeyWindow];\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Macro/ColorConstant.h",
    "content": "//\n//  Color.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/20.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#ifndef Color_h\n#define Color_h\n\n#define TK_RGBA(r, g, b, a) [NSColor colorWithRed:(r) / 255.0 \\\ngreen:(g) / 255.0 \\\nblue:(b) / 255.0 \\\nalpha:(a)]\n\n#define TK_RGB(r, g, b) TK_RGBA(r, g, b, 1.0)\n#define TK_GRAYA(c, a) TK_RGBA(c, c, c, a)\n#define TK_GRAY(c) TK_GRAYA(c, 1.0)\n\n#define kBG1 TK_GRAY(0xec)\n#define kBG2 TK_GRAY(0xe3)\n#define kBG3 TK_GRAYA(0x2a, 0.5)\n#define kBG4 TK_GRAYA(0x7a, 0.5)\n\n#endif /* Color_h */\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Macro/DefineConstant.h",
    "content": "//\n//  DefineConstant.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/14.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#ifndef DefineConstant_h\n#define DefineConstant_h\n\n#define TKLocalizedString(key)  [[NSBundle bundleWithIdentifier:@\"tk.WeChatPlugin\"] localizedStringForKey:(key) value:@\"\" table:nil]\n#define WXLocalizedString(key)  [[NSBundle mainBundle] localizedStringForKey:(key) value:@\"\" table:nil]\n\n#endif /* DefineConstant_h */\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/Macro/NotifyConstant.h",
    "content": "\n//\n//  NotifyConstant.h.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/23.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#ifndef NotifyConstant_h_h\n#define NotifyConstant_h_h\n\nstatic NSString * const NOTIFY_AUTO_REPLY_CHANGE = @\"NOTIFY_AUTO_REPLY_CHANGE\";\nstatic NSString * const NOTIFY_PREVENT_REVOKE_CHANGE  = @\"NOTIFY_PREVENT_REVOKE_CHANGE\";\nstatic NSString * const NOTIFY_AUTO_AUTH_CHANGE = @\"NOTIFY_AUTO_AUTH_CHANGE\";\n\n#endif /* NotifyConstant_h_h */\n"
  },
  {
    "path": "WeChatPlugin/Sources/Common/TKPrefixHeader.pch",
    "content": "//\n//  TKPrefixHeader.pch\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/20.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#ifndef TKPrefixHeader_pch\n#define TKPrefixHeader_pch\n\n#ifdef __OBJC__\n#import \"ColorConstant.h\"\n#import \"DefineConstant.h\"\n#import \"NotifyConstant.h\"\n#import \"NSView+Action.h\"\n#import \"NSButton+Action.h\"\n#import \"NSTextField+Action.h\"\n#import \"NSMenu+Action.h\"\n#import \"NSString+Action.h\"\n#import \"NSDate+Action.h\"\n#import \"NSWindowController+Action.h\"\n#import \"WeChatPlugin.h\"\n#import \"TKUtility.h\"\n#endif\n\n#endif /* TKPrefixHeader_pch */\n"
  },
  {
    "path": "WeChatPlugin/Sources/Config/TKConstants.h",
    "content": "//\n//  TKConstants.h\n//  WeChatPlugin\n//\n//  Created by TK on 2020/3/14.\n//  Copyright © 2020 tk. All rights reserved.\n//\n\n#ifndef TKConstants_h\n#define TKConstants_h\n\nstatic NSString * const kTKScrollToMessageKey = @\"click://kTKScrollToMessageKey\";\nstatic NSString * const kTKRevokeLocationKey = @\"kTKRevokeLocationKey\";\nstatic NSString * const kTKShowMembeContactProfileKey = @\"kTKShowMembeContactProfileKey\";\nstatic NSInteger  const kTKMemberQuitDayInterval = 30*2;\n\n#endif /* TKConstants_h */\n"
  },
  {
    "path": "WeChatPlugin/Sources/Config/TKWeChatPluginConfig.h",
    "content": "//\n//  TKWeChatPluginConfig.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n\n#import <Foundation/Foundation.h>\n\n@interface TKWeChatPluginConfig : NSObject\n\n@property (nonatomic, assign) BOOL preventRevokeEnable;                 /**<    是否开启防撤回    */\n@property (nonatomic, assign) BOOL preventSelfRevokeEnable;             /**<    是否防撤回自己    */\n@property (nonatomic, assign) BOOL autoReplyEnable;                     /**<    是否开启自动回复  */\n@property (nonatomic, assign) BOOL autoAuthEnable;                      /**<    是否免认证登录    */\n@property (nonatomic, assign) BOOL autoLoginEnable;                     /**<    是否自动登录      */\n@property (nonatomic, assign) BOOL onTop;                               /**<    是否要置顶微信    */\n@property (nonatomic, assign) BOOL multipleSelectionEnable;             /**<    是否要进行多选    */\n@property (nonatomic, assign) BOOL forbidCheckVersion;                  /**<    禁止检测版本      */\n@property (nonatomic, assign) BOOL alfredEnable;                        /**<    是否开启Alfred   */\n@property (nonatomic, assign) BOOL checkUpdateWechatEnable;             /**<    是否允许微信启动检测更新  */\n@property (nonatomic, assign) BOOL systemBrowserEnable;                 /**<    是否使用自身浏览器打开连接   */\n@property (nonatomic, assign) BOOL memberExitMonitoringEnable;                 /**<    是否使用自身浏览器打开连接   */\n@property (nonatomic, strong) NSMutableArray *autoReplyModels;           /**<    自动回复的数组    */\n@property (nonatomic, strong) NSMutableArray *remoteControlModels;       /**<    远程控制的数组    */\n@property (nonatomic, strong) NSMutableArray *ignoreSessionModels;       /**<    聊天置底的数组    */\n@property (nonatomic, strong) NSMutableArray *selectSessions;            /**<    已经选中的会话    */\n@property (nonatomic, strong) NSMutableSet *revokeMsgSet;                /**<    撤回的消息集合    */\n@property (nonatomic, strong) NSMutableSet *unreadSessionSet;            /**<    标记未读消息集合    */\n@property (nonatomic, copy) NSString *currentUserName;                   /**<    当前用户的id     */\n@property (nonatomic, copy, readonly) NSDictionary *localInfoPlist;\n@property (nonatomic, copy, readonly) NSDictionary *romoteInfoPlist;\n@property (nonatomic, strong) NSMutableDictionary *quitChatRoomMemberDict;     /**<    退群的好友集合    */\n\n- (void)saveAutoReplyModels;\n- (void)saveRemoteControlModels;\n- (void)saveIgnoreSessionModels;\n- (void)saveQuitChatRoomMemberDict;\n\n+ (instancetype)sharedConfig;\n\n@end\n\n"
  },
  {
    "path": "WeChatPlugin/Sources/Config/TKWeChatPluginConfig.m",
    "content": "//\n//  TKWeChatPluginConfig.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKWeChatPluginConfig.h\"\n#import \"TKRemoteControlModel.h\"\n#import \"TKAutoReplyModel.h\"\n#import \"TKIgnoreSessonModel.h\"\n#import \"WeChatPlugin.h\"\n\nstatic NSString * const kTKPreventRevokeEnableKey = @\"kTKPreventRevokeEnableKey\";\nstatic NSString * const kTKPreventSelfRevokeEnableKey = @\"kTKPreventSelfRevokeEnableKey\";\nstatic NSString * const kTKAutoReplyEnableKey = @\"kTKAutoReplyEnableKey\";\nstatic NSString * const kTKAutoAuthEnableKey = @\"kTKAutoAuthEnableKey\";\nstatic NSString * const kTKAutoLoginEnableKey = @\"kTKAutoLoginEnableKey\";\nstatic NSString * const kTKOnTopKey = @\"kTKOnTopKey\";\nstatic NSString * const kTKForbidCheckVersionKey = @\"kTKForbidCheckVersionKey\";\nstatic NSString * const kTKAlfredEnableKey = @\"kTKAlfredEnableKey\";\nstatic NSString * const kTKCheckUpdateWechatEnableKey = @\"kTKCheckUpdateWechatEnableKey\";\nstatic NSString * const kTKSystemBrowserEnableKey = @\"kTKSystemBrowserEnableKey\";\nstatic NSString * const kTKmemberExitMonitoringEnableKey = @\"kTKmemberExitMonitoringEnableKey\";\nstatic NSString * const kTKWeChatResourcesPath = @\"/Applications/WeChat.app/Contents/MacOS/WeChatPlugin.framework/Resources/\";\nstatic NSString * const kTKWeChatRemotePlistPath = @\"https://raw.githubusercontent.com/TKkk-iOSer/WeChatPlugin-MacOS/master/Other/Products/Debug/WeChatPlugin.framework/Resources/Info.plist\";\n\n@interface TKWeChatPluginConfig ()\n\n@property (nonatomic, copy) NSString *remoteControlPlistFilePath;\n@property (nonatomic, copy) NSString *autoReplyPlistFilePath;\n@property (nonatomic, copy) NSString *ignoreSessionPlistFilePath;\n@property (nonatomic, copy) NSString *quitChatroomMemberPlistFilePath;\n\n@property (nonatomic, copy) NSDictionary *localInfoPlist;\n@property (nonatomic, copy) NSDictionary *romoteInfoPlist;\n\n@end\n\n@implementation TKWeChatPluginConfig\n\n+ (instancetype)sharedConfig {\n    static TKWeChatPluginConfig *config = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        config = [[TKWeChatPluginConfig alloc] init];\n    });\n    return config;\n}\n\n- (instancetype)init {\n    self = [super init];\n    if (self) {\n        _preventRevokeEnable = [[NSUserDefaults standardUserDefaults] boolForKey:kTKPreventRevokeEnableKey];\n        _preventSelfRevokeEnable = [[NSUserDefaults standardUserDefaults] boolForKey:kTKPreventSelfRevokeEnableKey];\n        _autoReplyEnable = [[NSUserDefaults standardUserDefaults] boolForKey:kTKAutoReplyEnableKey];\n        _autoAuthEnable = [[NSUserDefaults standardUserDefaults] boolForKey:kTKAutoAuthEnableKey];\n        _autoLoginEnable = [[NSUserDefaults standardUserDefaults] boolForKey:kTKAutoLoginEnableKey];\n        _onTop = [[NSUserDefaults standardUserDefaults] boolForKey:kTKOnTopKey];\n        _forbidCheckVersion = [[NSUserDefaults standardUserDefaults] boolForKey:kTKForbidCheckVersionKey];\n        _alfredEnable = [[NSUserDefaults standardUserDefaults] boolForKey:kTKAlfredEnableKey];\n        _checkUpdateWechatEnable = [[NSUserDefaults standardUserDefaults] boolForKey:kTKCheckUpdateWechatEnableKey];\n        _systemBrowserEnable = [[NSUserDefaults standardUserDefaults] boolForKey:kTKSystemBrowserEnableKey];\n        _memberExitMonitoringEnable = [[NSUserDefaults standardUserDefaults] boolForKey:kTKmemberExitMonitoringEnableKey];\n    }\n    return self;\n}\n\n- (void)setPreventRevokeEnable:(BOOL)preventRevokeEnable {\n    _preventRevokeEnable = preventRevokeEnable;\n    [[NSUserDefaults standardUserDefaults] setBool:preventRevokeEnable forKey:kTKPreventRevokeEnableKey];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)setPreventSelfRevokeEnable:(BOOL)preventSelfRevokeEnable {\n    _preventSelfRevokeEnable = preventSelfRevokeEnable;\n    [[NSUserDefaults standardUserDefaults] setBool:preventSelfRevokeEnable forKey:kTKPreventSelfRevokeEnableKey];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)setAutoReplyEnable:(BOOL)autoReplyEnable {\n    _autoReplyEnable = autoReplyEnable;\n    [[NSUserDefaults standardUserDefaults] setBool:autoReplyEnable forKey:kTKAutoReplyEnableKey];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)setAutoAuthEnable:(BOOL)autoAuthEnable {\n    _autoAuthEnable = autoAuthEnable;\n    [[NSUserDefaults standardUserDefaults] setBool:autoAuthEnable forKey:kTKAutoAuthEnableKey];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)setAutoLoginEnable:(BOOL)autoLoginEnable {\n    _autoLoginEnable = autoLoginEnable;\n    [[NSUserDefaults standardUserDefaults] setBool:autoLoginEnable forKey:kTKAutoLoginEnableKey];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)setOnTop:(BOOL)onTop {\n    _onTop = onTop;\n    [[NSUserDefaults standardUserDefaults] setBool:_onTop forKey:kTKOnTopKey];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)setForbidCheckVersion:(BOOL)forbidCheckVersion {\n    _forbidCheckVersion = forbidCheckVersion;\n    [[NSUserDefaults standardUserDefaults] setBool:_forbidCheckVersion forKey:kTKForbidCheckVersionKey];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)setAlfredEnable:(BOOL)alfredEnable {\n    _alfredEnable = alfredEnable;\n    [[NSUserDefaults standardUserDefaults] setBool:_alfredEnable forKey:kTKAlfredEnableKey];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)setCheckUpdateWechatEnable:(BOOL)checkUpdateWechatEnable {\n    _checkUpdateWechatEnable = checkUpdateWechatEnable;\n    [[NSUserDefaults standardUserDefaults] setBool:_checkUpdateWechatEnable forKey:kTKCheckUpdateWechatEnableKey];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)setSystemBrowserEnable:(BOOL)systemBrowserEnable {\n    _systemBrowserEnable = systemBrowserEnable;\n    [[NSUserDefaults standardUserDefaults] setBool:_systemBrowserEnable forKey:kTKSystemBrowserEnableKey];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)setMemberExitMonitoringEnable:(BOOL)memberExitMonitoringEnable {\n    _memberExitMonitoringEnable = memberExitMonitoringEnable;\n    [[NSUserDefaults standardUserDefaults] setBool:_memberExitMonitoringEnable forKey:kTKmemberExitMonitoringEnableKey];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n#pragma mark - 自动回复\n- (NSArray *)autoReplyModels {\n    if (!_autoReplyModels) {\n        _autoReplyModels = [self getModelsWithClass:[TKAutoReplyModel class] filePath:self.autoReplyPlistFilePath];\n    }\n    return _autoReplyModels;\n}\n\n- (void)saveAutoReplyModels {\n    NSMutableArray *needSaveModels = [NSMutableArray array];\n    [_autoReplyModels enumerateObjectsUsingBlock:^(TKAutoReplyModel *model, NSUInteger idx, BOOL * _Nonnull stop) {\n        if (model.hasEmptyKeywordOrReplyContent) {\n            model.enable = NO;\n            model.enableGroupReply = NO;\n        }\n        model.replyContent = model.replyContent == nil ? @\"\" : model.replyContent;\n        model.keyword = model.keyword == nil ? @\"\" : model.keyword;\n        [needSaveModels addObject:model.dictionary];\n    }];\n    [needSaveModels writeToFile:self.autoReplyPlistFilePath atomically:YES];\n}\n\n#pragma mark - 远程控制\n- (NSArray *)remoteControlModels {\n    if (!_remoteControlModels) {\n        __block BOOL needSaveRemoteControlModels = NO;\n        _remoteControlModels = ({\n            NSArray *originModels = [NSArray arrayWithContentsOfFile:self.remoteControlPlistFilePath];\n            NSMutableArray *newRemoteControlModels = [NSMutableArray array];\n            [originModels enumerateObjectsUsingBlock:^(NSArray *subModels, NSUInteger idx, BOOL * _Nonnull stop) {\n                NSMutableArray *newSubModels = [NSMutableArray array];\n                [subModels enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {\n                    TKRemoteControlModel *model = [[TKRemoteControlModel alloc] initWithDict:obj];\n                    if ([model.executeCommand isEqualToString:@\"restartWeChat\"]) {\n                        model.executeCommand = @\"killWeChat\";\n                        needSaveRemoteControlModels = YES;\n                    }\n                    [newSubModels addObject:model];\n                }];\n                [newRemoteControlModels addObject:newSubModels];\n            }];\n            newRemoteControlModels;\n        });\n        if (needSaveRemoteControlModels) {\n            [self saveRemoteControlModels];\n        }\n    }\n    return _remoteControlModels;\n}\n\n- (void)saveRemoteControlModels {\n    NSMutableArray *needSaveModels = [NSMutableArray array];\n    [_remoteControlModels enumerateObjectsUsingBlock:^(NSArray *subModels, NSUInteger idx, BOOL * _Nonnull stop) {\n        NSMutableArray *newSubModels = [NSMutableArray array];\n        [subModels enumerateObjectsUsingBlock:^(TKRemoteControlModel *obj, NSUInteger idx, BOOL * _Nonnull stop) {\n            [newSubModels addObject:obj.dictionary];\n        }];\n        [needSaveModels addObject:newSubModels];\n    }];\n    [needSaveModels writeToFile:self.remoteControlPlistFilePath atomically:YES];\n}\n\n#pragma mark - 置底\n- (NSArray *)ignoreSessionModels {\n    if (!_ignoreSessionModels) {\n        _ignoreSessionModels = [self getModelsWithClass:[TKIgnoreSessonModel class] filePath:self.ignoreSessionPlistFilePath];\n    }\n    return _ignoreSessionModels;\n}\n\n- (void)saveIgnoreSessionModels {\n    NSMutableArray *needSaveArray = [NSMutableArray array];\n    [self.ignoreSessionModels enumerateObjectsUsingBlock:^(TKBaseModel *obj, NSUInteger idx, BOOL * _Nonnull stop) {\n        [needSaveArray addObject:obj.dictionary];\n    }];\n    \n    [needSaveArray writeToFile:self.ignoreSessionPlistFilePath atomically:YES];\n    \n}\n\n#pragma mark - 选中的会话\n- (NSMutableArray *)selectSessions {\n    if (!_selectSessions) {\n        _selectSessions = [NSMutableArray array];\n    }\n    return _selectSessions;\n}\n\n#pragma mark - 撤回的消息集合\n- (NSMutableSet *)revokeMsgSet {\n    if (!_revokeMsgSet) {\n        _revokeMsgSet = [NSMutableSet set];\n    }\n    return _revokeMsgSet;\n}\n\n- (NSMutableSet *)unreadSessionSet {\n    if (!_unreadSessionSet) {\n        _unreadSessionSet = [NSMutableSet set];\n    }\n    return _unreadSessionSet;\n}\n\n- (NSMutableDictionary *)quitChatRoomMemberDict {\n    if (!_quitChatRoomMemberDict) {\n        _quitChatRoomMemberDict = [NSMutableDictionary dictionaryWithContentsOfFile:self.quitChatroomMemberPlistFilePath];\n        if (!_quitChatRoomMemberDict) {\n            _quitChatRoomMemberDict = [NSMutableDictionary dictionary];\n        }\n    }\n    return _quitChatRoomMemberDict;\n}\n\n- (void)saveQuitChatRoomMemberDict {\n    [self.quitChatRoomMemberDict writeToFile:self.quitChatroomMemberPlistFilePath atomically:YES];\n}\n#pragma mark - 获取沙盒上的 plist 文件，包括：远程控制，自动回复，置底列表。\n- (NSString *)remoteControlPlistFilePath {\n    if (!_remoteControlPlistFilePath) {\n        _remoteControlPlistFilePath = [self getSandboxFilePathWithPlistName:@\"TKRemoteControlCommands.plist\"];\n    }\n    return _remoteControlPlistFilePath;\n}\n\n- (NSString *)autoReplyPlistFilePath {\n    if (!_autoReplyPlistFilePath) {\n        _autoReplyPlistFilePath = [self getSandboxFilePathWithPlistName:@\"TKAutoReplyModels.plist\"];\n    }\n    return _autoReplyPlistFilePath;\n}\n\n- (NSString *)ignoreSessionPlistFilePath {\n    if (!_ignoreSessionPlistFilePath) {\n        _ignoreSessionPlistFilePath = [self getSandboxFilePathWithPlistName:@\"TKIgnoreSessons.plist\"];\n    }\n    return _ignoreSessionPlistFilePath;\n}\n\n- (NSString *)quitChatroomMemberPlistFilePath {\n    if (!_quitChatroomMemberPlistFilePath) {\n        _quitChatroomMemberPlistFilePath = [self getSandboxFilePathWithPlistName:@\"TKQuitChatRoomMember.plist\"];\n    }\n    return _quitChatroomMemberPlistFilePath;\n}\n\n#pragma mark - 获取本地 & github 上的小助手 info 信息\n- (NSDictionary *)localInfoPlist {\n    if (!_localInfoPlist) {\n        NSString *localInfoPath = [kTKWeChatResourcesPath stringByAppendingString:@\"info.plist\"];\n        _localInfoPlist = [NSDictionary dictionaryWithContentsOfFile:localInfoPath];\n    }\n    return _localInfoPlist;\n}\n\n- (NSDictionary *)romoteInfoPlist {\n    if (!_romoteInfoPlist) {\n        NSURL *url = [NSURL URLWithString:kTKWeChatRemotePlistPath];\n        _romoteInfoPlist = [NSDictionary dictionaryWithContentsOfURL:url];\n    }\n    return _romoteInfoPlist;\n}\n\n#pragma mark - common\n- (NSMutableArray *)getModelsWithClass:(Class)class filePath:(NSString *)filePath {\n    NSArray *originModels = [NSArray arrayWithContentsOfFile:filePath];\n    NSMutableArray *newModels = [NSMutableArray array];\n    \n    __weak Class weakClass = class;\n    [originModels enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {\n        TKIgnoreSessonModel *model = [[weakClass alloc] initWithDict:obj];\n        [newModels addObject:model];\n    }];\n    return newModels;\n}\n\n- (NSString *)getSandboxFilePathWithPlistName:(NSString *)plistName {\n    NSFileManager *manager = [NSFileManager defaultManager];\n    NSString *currentUserName = [objc_getClass(\"CUtility\") GetCurrentUserName];\n    \n    NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];\n    NSString *wechatPluginDirectory = [documentDirectory stringByAppendingFormat:@\"/TKWeChatPlugin/%@/\",currentUserName];\n    NSString *plistFilePath = [wechatPluginDirectory stringByAppendingPathComponent:plistName];\n    if ([manager fileExistsAtPath:plistFilePath]) {\n        return plistFilePath;\n    }\n    \n    [manager createDirectoryAtPath:wechatPluginDirectory withIntermediateDirectories:YES attributes:nil error:nil];\n    NSString *resourcesFilePath = [kTKWeChatResourcesPath stringByAppendingString:plistName];\n    if (![manager fileExistsAtPath:resourcesFilePath]) {\n        return plistFilePath;\n    }\n    \n    NSError *error = nil;\n    [manager copyItemAtPath:resourcesFilePath toPath:plistFilePath error:&error];\n    if (!error) {\n        return plistFilePath;\n    }\n    return resourcesFilePath;\n}\n\n@end\n\n"
  },
  {
    "path": "WeChatPlugin/Sources/Hook/MMChatsTableCellView+hook.h",
    "content": "//\n//  MMChatsTableCellView+hook.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/9/15.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface NSObject (MMChatsTableCellViewHook)\n\n+ (void)hookMMChatsTableCellView;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Hook/MMChatsTableCellView+hook.m",
    "content": "//\n//  MMChatsTableCellView+hook.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/9/15.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"MMChatsTableCellView+hook.h\"\n#import \"WeChatPlugin.h\"\n#import \"TKIgnoreSessonModel.h\"\n#import \"TKMessageManager.h\"\n#import \"TKEmoticonManager.h\"\n\n@implementation NSObject (MMChatsTableCellViewHook)\n\n+ (void)hookMMChatsTableCellView {\n    tk_hookMethod(objc_getClass(\"MMChatsTableCellView\"), @selector(menuWillOpen:), [self class], @selector(hook_menuWillOpen:));\n    tk_hookMethod(objc_getClass(\"MMChatsTableCellView\"), @selector(setSessionInfo:), [self class], @selector(hook_setSessionInfo:));\n    tk_hookMethod(objc_getClass(\"MMChatsTableCellView\"), @selector(contextMenuSticky:), [self class], @selector(hook_contextMenuSticky:));\n    tk_hookMethod(objc_getClass(\"MMChatsTableCellView\"), @selector(contextMenuDelete:), [self class], @selector(hook_contextMenuDelete:));\n    tk_hookMethod(objc_getClass(\"MMChatsViewController\"), @selector(tableView:rowGotMouseDown:), [self class], @selector(hook_tableView:rowGotMouseDown:));\n}\n\n- (void)hook_tableView:(NSTableView *)arg1 rowGotMouseDown:(long long)arg2 {\n    [self hook_tableView:arg1 rowGotMouseDown:arg2];\n    \n    if ([[TKWeChatPluginConfig sharedConfig] multipleSelectionEnable]) {\n        NSMutableArray *selectSessions = [[TKWeChatPluginConfig sharedConfig] selectSessions];\n        MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n        MMSessionInfo *sessionInfo = [sessionMgr getSessionAtIndex:arg2];\n        if ([selectSessions containsObject:sessionInfo]) {\n            [selectSessions removeObject:sessionInfo];\n        } else {\n            [selectSessions addObject:sessionInfo];\n        }\n        [arg1 reloadData];\n    }\n}\n\n- (void)hook_setSessionInfo:(MMSessionInfo *)sessionInfo {\n    [self hook_setSessionInfo:sessionInfo];\n    \n    MMChatsTableCellView *cellView = (MMChatsTableCellView *)self;\n    NSString *currentUserName = [objc_getClass(\"CUtility\") GetCurrentUserName];\n    __block BOOL isIgnore = false;\n    NSMutableArray *ignoreSessions = [[TKWeChatPluginConfig sharedConfig] ignoreSessionModels];\n    [ignoreSessions enumerateObjectsUsingBlock:^(TKIgnoreSessonModel *model, NSUInteger idx, BOOL * _Nonnull stop) {\n        if ([model.userName isEqualToString:sessionInfo.m_nsUserName] && [model.selfContact isEqualToString:currentUserName]) {\n            isIgnore = true;\n            *stop = YES;\n        }\n    }];\n    \n    NSMutableArray *selectSessions = [[TKWeChatPluginConfig sharedConfig] selectSessions];\n    if (isIgnore) {\n        cellView.layer.backgroundColor = kBG3.CGColor;\n    } else if ([selectSessions containsObject:sessionInfo]){\n        cellView.layer.backgroundColor = kBG4.CGColor;\n    } else {\n        cellView.layer.backgroundColor = [NSColor clearColor].CGColor;\n    }\n    [cellView.layer setNeedsDisplay];\n}\n\n- (void)hook_menuWillOpen:(NSMenu *)arg1 {\n    MMSessionInfo *sessionInfo = [(MMChatsTableCellView *)self sessionInfo];\n    NSString *currentUserName = [objc_getClass(\"CUtility\") GetCurrentUserName];\n    \n    __block BOOL isIgnore = false;\n    NSMutableArray *ignoreSessions = [[TKWeChatPluginConfig sharedConfig] ignoreSessionModels];\n    [ignoreSessions enumerateObjectsUsingBlock:^(TKIgnoreSessonModel *model, NSUInteger idx, BOOL * _Nonnull stop) {\n        if ([model.userName isEqualToString:sessionInfo.m_nsUserName] && [model.selfContact isEqualToString:currentUserName]) {\n            isIgnore = true;\n            *stop = YES;\n        }\n    }];\n\n    NSMenuItem *clearUnReadItem = [[NSMenuItem alloc] initWithTitle:TKLocalizedString(@\"assistant.chat.readAll\") action:@selector(contextMenuClearUnRead) keyEquivalent:@\"\"];\n    \n    NSMenuItem *clearEmptySessionItem = [[NSMenuItem alloc] initWithTitle:TKLocalizedString(@\"assistant.chat.clearEmpty\") action:@selector(contextMenuClearEmptySession) keyEquivalent:@\"\"];\n\n    [arg1 addItems:@[[NSMenuItem separatorItem],\n                     clearUnReadItem,\n                     clearEmptySessionItem\n                     ]];\n    [self hook_menuWillOpen:arg1];\n}\n\n- (void)contextMenuClearUnRead {\n    MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n    NSMutableArray *arrSession = [sessionMgr getAllSessions];\n\n    [arrSession enumerateObjectsUsingBlock:^(MMSessionInfo *obj, NSUInteger idx, BOOL * _Nonnull stop) {\n        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n            [[TKMessageManager shareManager] clearUnRead:obj.m_nsUserName];\n        });\n    }];\n}\n\n- (void)contextMenuClearEmptySession {\n    MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n    FFProcessReqsvrZZ *msgService = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"FFProcessReqsvrZZ\")];\n    \n    if (msgService == nil || sessionMgr == nil) {\n        return;\n        \n    }\n    \n    NSMutableArray *arrSession = [sessionMgr getAllSessions];\n    NSMutableArray *emptyArrSession = [NSMutableArray array];\n    \n    [arrSession enumerateObjectsUsingBlock:^(MMSessionInfo *sessionInfo, NSUInteger idx, BOOL * _Nonnull stop) {\n        BOOL hasEmplyMsgSession = ![msgService HasMsgInChat:sessionInfo.m_nsUserName];\n        WCContactData *contact = sessionInfo.m_packedInfo.m_contact;\n        if (![sessionInfo.m_nsUserName isEqualToString:@\"brandsessionholder\"] && ![contact isSelf] && hasEmplyMsgSession) {\n            [emptyArrSession addObject:sessionInfo];\n        }\n    }];\n    \n    while (emptyArrSession.count > 0) {\n        [emptyArrSession enumerateObjectsUsingBlock:^(MMSessionInfo *  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {\n            [sessionMgr removeSessionOfUser:obj.m_nsUserName isDelMsg:NO];\n            [emptyArrSession removeObject:obj];\n        }];\n    }\n}\n\n- (void)contextMenuUnreadSession {\n    MMSessionInfo *sessionInfo = [(MMChatsTableCellView *)self sessionInfo];\n    if (sessionInfo.m_uUnReadCount > 0) return;\n    \n    NSMutableSet *unreadSessionSet = [[TKWeChatPluginConfig sharedConfig] unreadSessionSet];\n    if ([unreadSessionSet containsObject:sessionInfo.m_nsUserName]) return;\n    \n    [unreadSessionSet addObject:sessionInfo.m_nsUserName];\n    MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n    [sessionMgr changeSessionUnreadCountWithUserName:sessionInfo.m_nsUserName to:sessionInfo.m_uUnReadCount + 1];\n}\n\n- (void)hook_contextMenuSticky:(id)arg1 {\n    [self hook_contextMenuSticky:arg1];\n    \n    MMSessionInfo *sessionInfo = [(MMChatsTableCellView *)self sessionInfo];\n    if (!sessionInfo.m_bIsTop) return;\n    \n    NSString *currentUserName = [objc_getClass(\"CUtility\") GetCurrentUserName];\n    NSMutableArray *ignoreSessions = [[TKWeChatPluginConfig sharedConfig] ignoreSessionModels];\n    __block NSInteger index = -1;\n    [ignoreSessions enumerateObjectsUsingBlock:^(TKIgnoreSessonModel *model, NSUInteger idx, BOOL * _Nonnull stop) {\n        if ([model.userName isEqualToString:sessionInfo.m_nsUserName] && [model.selfContact isEqual:currentUserName]) {\n            index = idx;\n            *stop = YES;\n        }\n    }];\n    \n    if (index != -1) {\n        [ignoreSessions removeObjectAtIndex:index];\n        MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n        \n        if (sessionInfo.m_bShowUnReadAsRedDot && sessionInfo.m_nsUserName) {\n            [sessionMgr unmuteSessionByUserName:sessionInfo.m_nsUserName];\n        }\n        if ([sessionMgr respondsToSelector:@selector(FFDataSvrMgrSvrFavZZ)]) {\n            [sessionMgr FFDataSvrMgrSvrFavZZ];\n        } else if ([sessionMgr respondsToSelector:@selector(sortSessions)]){\n            [sessionMgr sortSessions];\n        }\n        [[TKWeChatPluginConfig sharedConfig] saveIgnoreSessionModels];\n    }\n}\n\n- (void)hook_contextMenuDelete:(id)arg1 {\n    BOOL multipleSelection = [[TKWeChatPluginConfig sharedConfig] multipleSelectionEnable];\n    \n    if (multipleSelection) {\n        MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n        NSMutableArray *selectSessions = [[TKWeChatPluginConfig sharedConfig] selectSessions];\n        \n        [selectSessions  enumerateObjectsUsingBlock:^(MMSessionInfo *sessionInfo, NSUInteger idx, BOOL * _Nonnull stop) {\n            NSString *sessionUserName = sessionInfo.m_nsUserName;\n            if (sessionUserName.length != 0) {\n                [sessionMgr removeSessionOfUser:sessionUserName isDelMsg:NO];\n            }\n        }];\n        [[TKWeChatPluginConfig sharedConfig] setMultipleSelectionEnable:NO];\n        WeChat *wechat = [objc_getClass(\"WeChat\") sharedInstance];\n        [wechat.chatsViewController.tableView reloadData];\n    } else {\n        [self hook_contextMenuDelete:arg1];\n    }\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Hook/MMStickerMessageCellView+hook.h",
    "content": "//\n//  MMStickerMessageCellView+hook.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/2/23.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface NSObject (MMStickerMessageCellView)\n\n+ (void)hookMMStickerMessageCellView;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Hook/MMStickerMessageCellView+hook.m",
    "content": "//\n//  MMStickerMessageCellView+hook.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/2/23.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"MMStickerMessageCellView+hook.h\"\n#import \"WeChatPlugin.h\"\n#import \"TKEmoticonManager.h\"\n\n@implementation NSObject (MMStickerMessageCellView)\n\n+ (void)hookMMStickerMessageCellView {\n    tk_hookMethod(objc_getClass(\"MMStickerMessageCellView\"), @selector(contextMenu), [self class], @selector(hook_contextMenu));\n    if (LargerOrEqualVersion(@\"2.3.22\")) {\n         tk_hookMethod(objc_getClass(\"MMStickerMessageCellView\"), @selector(contextMenuExport), [self class], @selector(hook_contextMenuExport));\n    }\n}\n\n- (id)hook_contextMenu {\n    NSMenu *menu = [self hook_contextMenu];\n    if ([self.className isEqualToString:@\"MMStickerMessageCellView\"]) {\n        NSMenuItem *copyItem = [[NSMenuItem alloc] initWithTitle:WXLocalizedString(@\"Message.Menu.Copy\") action:@selector(contextMenuCopyEmoji) keyEquivalent:@\"\"];\n        NSMenuItem *exportItem = [[NSMenuItem alloc] initWithTitle:WXLocalizedString(@\"Message.Menu.Export\") action:@selector(contextMenuExport) keyEquivalent:@\"\"];\n        [menu addItem:[NSMenuItem separatorItem]];\n        [menu addItem:copyItem];\n        [menu addItem:exportItem];\n    }\n    return menu;\n}\n\n- (void)contextMenuExport {\n    [self exportEmoji];\n}\n\n- (void)hook_contextMenuExport {\n    if (![self.className isEqualToString:@\"MMStickerMessageCellView\"]) {\n        [self hook_contextMenu];\n        return;\n    }\n    [self exportEmoji];\n}\n\n- (void)exportEmoji {\n    MMStickerMessageCellView *currentCellView = (MMStickerMessageCellView *)self;\n    MMMessageTableItem *item = currentCellView.messageTableItem;\n    if (!item.message || !item.message.m_nsEmoticonMD5) {\n        return;\n    }\n    [[TKEmoticonManager shareManager] exportEmoticonWithMd5:item.message.m_nsEmoticonMD5 window:currentCellView.delegate.view.window];\n}\n\n- (void)contextMenuCopyEmoji {\n    if ([self.className isEqualToString:@\"MMStickerMessageCellView\"]) {\n        MMMessageTableItem *item = [self valueForKey:@\"messageTableItem\"];\n        if (!item.message || !item.message.m_nsEmoticonMD5) {\n            return;\n        }\n        [[TKEmoticonManager shareManager] copyEmoticonWithMd5:item.message.m_nsEmoticonMD5];\n    }\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Hook/MMStickerPickerCell+hook.h",
    "content": "//\n//  NSObject+MMStickerPickerCell.h\n//  WeChatPlugin\n//\n//  Created by TK on 2019/3/13.\n//  Copyright © 2019 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface NSObject (MMStickerPickerCell)\n+ (void)hookMMStickerPickerCell;\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "WeChatPlugin/Sources/Hook/MMStickerPickerCell+hook.m",
    "content": "//\n//  NSObject+MMStickerPickerCell.m\n//  WeChatPlugin\n//\n//  Created by TK on 2019/3/13.\n//  Copyright © 2019 tk. All rights reserved.\n//\n\n#import \"MMStickerPickerCell+hook.h\"\n#import \"TKEmoticonManager.h\"\n\n@implementation NSObject (MMStickerPickerCell)\n\n+ (void)hookMMStickerPickerCell {\n    tk_hookMethod(objc_getClass(\"MMStickerPickerCell\"), @selector(rightMouseDown:), [self class], @selector(hook_rightMouseDown:));\n}\n\n- (void)hook_rightMouseDown:(id)theEvent {\n    [self hook_rightMouseDown:theEvent];\n    if ([self.className isEqualToString:@\"MMStickerPickerCell\"]) {\n        MMStickerPickerCell *pickerCell = (MMStickerPickerCell *)self;\n        NSMenu *popupMenu = [[NSMenu alloc] init];\n        popupMenu.delegate = pickerCell;\n        \n        NSMenuItem *preventRevokeItem = [[NSMenuItem alloc] initWithTitle:@\"存储\" action:@selector(pickerExportEmoji) keyEquivalent:@\"\"];\n        \n        NSMenuItem *copyItem = [[NSMenuItem alloc] initWithTitle:@\"复制\" action:@selector(pickerCopyEmoji) keyEquivalent:@\"\"];\n        [popupMenu addItems:@[preventRevokeItem,copyItem]];\n        [NSMenu popUpContextMenu:popupMenu withEvent:theEvent forView:pickerCell];\n    }\n}\n\n- (void)pickerExportEmoji {\n    if (![self.className isEqualToString:@\"MMStickerPickerCell\"]) return;\n    \n    MMStickerPickerCell *currentCellView = (MMStickerPickerCell *)self;\n    MMEmoticonData *emotionData = currentCellView.emoticonData;\n    if (!emotionData.md5) {\n        return;\n    }\n    WeChat *wechat = [objc_getClass(\"WeChat\") sharedInstance];\n    MMMainWindowController *mainWC = wechat.mainWindowController;\n    [[TKEmoticonManager shareManager] exportEmoticonWithMd5:emotionData.md5 window:mainWC.window];\n}\n\n- (void)pickerCopyEmoji {\n    if (![self.className isEqualToString:@\"MMStickerPickerCell\"]) return;\n    \n    MMStickerPickerCell *currentCellView = (MMStickerPickerCell *)self;\n    MMEmoticonData *emotionData = currentCellView.emoticonData;\n    if (!emotionData.md5) {\n        return;\n    }\n    [[TKEmoticonManager shareManager] copyEmoticonWithMd5:emotionData.md5];\n    if([currentCellView.collectionView respondsToSelector:@selector(delegate)]) {\n       MMStickerCollectionViewController *stickerVC = [currentCellView.collectionView performSelector:@selector(delegate)];\n        MMStickerPicker *picker = stickerVC.delegate;\n        [picker hide];\n    }\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Hook/WeChat+hook.h",
    "content": "//\n//  WeChat+hook.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface NSObject (WeChatHook)\n\n+ (void)hookWeChat;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Hook/WeChat+hook.m",
    "content": "//\n//  WeChat+hook.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"WeChat+hook.h\"\n#import \"WeChatPlugin.h\"\n#import \"fishhook.h\"\n#import \"TKIgnoreSessonModel.h\"\n#import \"TKWebServerManager.h\"\n#import \"TKMessageManager.h\"\n#import \"TKAssistantMenuManager.h\"\n#import \"TKAutoReplyModel.h\"\n#import \"TKVersionManager.h\"\n#import \"TKRemoteControlManager.h\"\n#import \"TKDownloadWindowController.h\"\n#import \"TKConstants.h\"\n\n@implementation NSObject (WeChatHook)\n\n+ (void)hookWeChat {\n    //      微信撤回消息\n    tk_hookMethod(objc_getClass(\"FFProcessReqsvrZZ\"), @selector(FFToNameFavChatZZ:sessionMsgList:), [self class], @selector(hook_FFToNameFavChatZZ:sessionMsgList:));\n    //      微信消息同步\n    SEL syncBatchAddMsgsMethod = LargerOrEqualVersion(@\"2.3.22\") ? @selector(FFImgToOnFavInfoInfoVCZZ:isFirstSync:) : @selector(OnSyncBatchAddMsgs:isFirstSync:);\n    tk_hookMethod(objc_getClass(\"FFProcessReqsvrZZ\"), syncBatchAddMsgsMethod, [self class], @selector(hook_OnSyncBatchAddMsgs:isFirstSync:));\n    //      微信多开\n    SEL hasWechatInstanceMethod = LargerOrEqualVersion(@\"2.3.22\") ? @selector(FFSvrChatInfoMsgWithImgZZ) : @selector(HasWechatInstance);\n    tk_hookClassMethod(objc_getClass(\"CUtility\"), hasWechatInstanceMethod, [self class], @selector(hook_HasWechatInstance));\n    //      窗口置顶\n    tk_hookMethod(objc_getClass(\"NSWindow\"), @selector(makeKeyAndOrderFront:), [self class], @selector(hook_makeKeyAndOrderFront:));\n    //      登录逻辑\n    tk_hookMethod(objc_getClass(\"AccountService\"), @selector(onAuthOKOfUser:withSessionKey:withServerId:autoAuthKey:isAutoAuth:), [self class], @selector(hook_onAuthOKOfUser:withSessionKey:withServerId:autoAuthKey:isAutoAuth:));\n\n    //      自带浏览器打开链接\n    tk_hookMethod(objc_getClass(\"MMURLHandler\"), @selector(preHandleUrlStr:withMessage:), [self class], @selector(hook_preHandleUrlStr:withMessage:));\n\n    tk_hookMethod(objc_getClass(\"MMURLHandler\"), @selector(startGetA8KeyWithURL:), [self class], @selector(hook_startGetA8KeyWithURL:));\n    tk_hookMethod(objc_getClass(\"WeChat\"), @selector(applicationDidFinishLaunching:), [self class], @selector(hook_applicationDidFinishLaunching:));\n    \n    tk_hookMethod(objc_getClass(\"UserDefaultsService\"), @selector(stringForKey:), [self class], @selector(hook_stringForKey:));\n    \n    //    设置标记未读\n    tk_hookMethod(objc_getClass(\"MMChatMessageViewController\"), @selector(onClickSession), [self class], @selector(hook_onClickSession));\n    tk_hookMethod(objc_getClass(\"MMSessionMgr\"), @selector(onUnReadCountChange:), [self class], @selector(hook_onUnReadCountChange:));\n\n    //    远程语音控制\n    tk_hookMethod(objc_getClass(\"MMVoiceTranslateMgr\"), @selector(updateTranscribeVoiceMessage:voiceText:voiceToTextStatus:), [self class], @selector(hook_updateTranscribeVoiceMessage:voiceText:voiceToTextStatus:));\n\n    //    不支持的消息提示（小程序、转账等\n    tk_hookClassMethod(objc_getClass(\"MMAppBrandMessageCellView\"), @selector(makeAppBrandTableItemWithItem:), [self class], @selector(hook_makeAppBrandTableItemWithItem:));\n    tk_hookClassMethod(objc_getClass(\"MMUnsupportedCellView\"), @selector(makeUnsupportedTableItemWithItem:), [self class], @selector(hook_makeUnsupportedTableItemWithItem:));\n    tk_hookClassMethod(objc_getClass(\"MMPayTransferCellView\"), @selector(makePayTransferTableItemWithItem:), [self class], @selector(hook_makePayTransferTableItemWithItem:));\n    \n    //  退群提示\n    tk_hookMethod(objc_getClass(\"GroupStorage\"), @selector(notifyModifyGroupContactsOnMainThread:), [self class], @selector(hook_notifyModifyGroupContactsOnMainThread:));\n    tk_hookMethod(objc_getClass(\"MMSystemMessageCellView\"), @selector(textView:clickedOnLink:atIndex:), [self class], @selector(hook_textView:clickedOnLink:atIndex:));\n    tk_hookMethod(objc_getClass(\"MMSystemMessageCellView\"), @selector(populateWithMessage:), [self class], @selector(hook_populateWithMessage:));\n    //      替换沙盒路径\n    rebind_symbols((struct rebinding[2]) {\n        { \"NSSearchPathForDirectoriesInDomains\", swizzled_NSSearchPathForDirectoriesInDomains, (void *)&original_NSSearchPathForDirectoriesInDomains },\n        { \"NSHomeDirectory\", swizzled_NSHomeDirectory, (void *)&original_NSHomeDirectory }\n    }, 2);\n    \n    [self setup];\n}\n\n+ (void)setup {\n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n        \n        //        窗口置顶初始化\n        [self setupWindowSticky];\n    });\n    [self checkPluginVersion];\n    //    监听 NSWindow 最小化通知\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowsWillMiniaturize:) name:NSWindowWillMiniaturizeNotification object:nil];\n}\n\n+ (void)setupWindowSticky {\n    BOOL onTop = [[TKWeChatPluginConfig sharedConfig] onTop];\n    WeChat *wechat = [objc_getClass(\"WeChat\") sharedInstance];\n    wechat.mainWindowController.window.level = onTop == NSControlStateValueOn ? NSNormalWindowLevel+2 : NSNormalWindowLevel;\n}\n\n+ (void)checkPluginVersion {\n    if ([[TKWeChatPluginConfig sharedConfig] forbidCheckVersion]) return;\n    \n    [[TKVersionManager shareManager] checkVersionFinish:^(TKVersionStatus status, NSString *message) {\n        if (status == TKVersionStatusNew) {\n            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n                NSAlert *alert = [[NSAlert alloc] init];\n                [alert addButtonWithTitle:TKLocalizedString(@\"assistant.update.alret.confirm\")];\n                [alert addButtonWithTitle:TKLocalizedString(@\"assistant.update.alret.forbid\")];\n                [alert addButtonWithTitle:TKLocalizedString(@\"assistant.update.alret.cancle\")];\n                [alert setMessageText:TKLocalizedString(@\"assistant.update.alret.title\")];\n                [alert setInformativeText:message];\n                NSModalResponse respose = [alert runModal];\n                if (respose == NSAlertFirstButtonReturn) {\n                    [[TKDownloadWindowController downloadWindowController] show];\n                } else if (respose == NSAlertSecondButtonReturn) {\n                    [[TKWeChatPluginConfig sharedConfig] setForbidCheckVersion:YES];\n                }\n            });\n        }\n    }];\n}\n\n/**\n 登录界面-自动登录\n \n @param btn 自动登录按钮\n */\n- (void)selectAutoLogin:(NSButton *)btn {\n    [[TKWeChatPluginConfig sharedConfig] setAutoLoginEnable:btn.state];\n}\n\n#pragma mark - hook 微信方法\n/**\n hook 微信是否已启动\n \n */\n+ (BOOL)hook_HasWechatInstance {\n    return NO;\n}\n\n/**\n hook 微信撤回消息\n \n */\n- (void)hook_FFToNameFavChatZZ:(id)msgData sessionMsgList:(id)arg2 {\n    if (![[TKWeChatPluginConfig sharedConfig] preventRevokeEnable]) {\n        [self hook_FFToNameFavChatZZ:msgData sessionMsgList:arg2];\n        return;\n    }\n    id msg = msgData;\n    if ([msgData isKindOfClass:objc_getClass(\"MessageData\")]) {\n        msg = [msgData valueForKey:@\"msgContent\"];\n    }\n    if ([msg rangeOfString:@\"<sysmsg\"].length <= 0) return;\n    \n    //      转换群聊的 msg\n    NSString *msgContent = [msg substringFromIndex:[msg rangeOfString:@\"<sysmsg\"].location];\n    \n    //      xml 转 dict\n    XMLDictionaryParser *xmlParser = [objc_getClass(\"XMLDictionaryParser\") sharedInstance];\n    NSDictionary *msgDict = [xmlParser dictionaryWithString:msgContent];\n    \n    if (msgDict && msgDict[@\"revokemsg\"]) {\n        NSString *newmsgid = msgDict[@\"revokemsg\"][@\"newmsgid\"];\n        NSString *session =  msgDict[@\"revokemsg\"][@\"session\"];\n        msgDict = nil;\n        \n        NSMutableSet *revokeMsgSet = [[TKWeChatPluginConfig sharedConfig] revokeMsgSet];\n        //      该消息已进行过防撤回处理\n        if ([revokeMsgSet containsObject:newmsgid] || !newmsgid) {\n            return;\n        }\n        [revokeMsgSet addObject:newmsgid];\n        \n        //      获取原始的撤回提示消息\n        FFProcessReqsvrZZ *msgService = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"FFProcessReqsvrZZ\")];\n        MessageData *revokeMsgData = [msgService GetMsgData:session svrId:[newmsgid integerValue]];\n        if ([revokeMsgData isSendFromSelf] && ![[TKWeChatPluginConfig sharedConfig] preventSelfRevokeEnable]) {\n            [self hook_FFToNameFavChatZZ:msgData sessionMsgList:arg2];\n            return;\n        }\n        NSString *msgContent = [[TKMessageManager shareManager] getMessageContentWithData:revokeMsgData];\n        NSString *newMsgContent = [NSString stringWithFormat:@\"%@ \\n%@%@%d\",TKLocalizedString(@\"assistant.revoke.otherMessage.tip\"), msgContent, kTKRevokeLocationKey, revokeMsgData.mesLocalID];\n        MessageData *newMsgData = ({\n            MessageData *msg = [[objc_getClass(\"MessageData\") alloc] initWithMsgType:0x2710];\n            [msg setFromUsrName:revokeMsgData.toUsrName];\n            [msg setToUsrName:revokeMsgData.fromUsrName];\n            [msg setMsgStatus:4];\n            [msg setMsgContent:newMsgContent];\n            [msg setMsgCreateTime:[revokeMsgData msgCreateTime]];\n            //   [msg setMesLocalID:[revokeMsgData mesLocalID]];\n            \n            msg;\n        });\n        \n        [msgService AddLocalMsg:session msgData:newMsgData];\n    }\n}\n\n/**\n hook 微信消息同步\n \n */\n- (void)hook_OnSyncBatchAddMsgs:(NSArray *)msgs isFirstSync:(BOOL)arg2 {\n    [self hook_OnSyncBatchAddMsgs:msgs isFirstSync:arg2];\n    \n    [msgs enumerateObjectsUsingBlock:^(AddMsg *addMsg, NSUInteger idx, BOOL * _Nonnull stop) {\n        NSDate *now = [NSDate date];\n        NSTimeInterval nowSecond = now.timeIntervalSince1970;\n        if (nowSecond - addMsg.createTime > 180) {      // 若是3分钟前的消息，则不进行自动回复与远程控制。\n            return;\n        }\n        \n        [self autoReplyWithMsg:addMsg];\n        \n        NSString *currentUserName = [objc_getClass(\"CUtility\") GetCurrentUserName];\n        if ([addMsg.fromUserName.string isEqualToString:currentUserName] &&\n            [addMsg.toUserName.string isEqualToString:currentUserName]) {\n            [self remoteControlWithMsg:addMsg];\n            [self replySelfWithMsg:addMsg];\n        }\n    }];\n}\n\n/**\n hook 微信通知消息\n \n */\n//- (id)hook_getNotificationContentWithMsgData:(MessageData *)arg1 {\n//    [[TKWeChatPluginConfig sharedConfig] setCurrentUserName:arg1.toUsrName];\n//    return [self hook_getNotificationContentWithMsgData:arg1];;\n//}\n//\n//- (void)hook_deliverNotification:(NSUserNotification *)notification {\n//    NSMutableDictionary *dict = [notification.userInfo mutableCopy];\n//    dict[@\"currnetName\"] = [[TKWeChatPluginConfig sharedConfig] currentUserName];\n//    notification.userInfo = dict;\n//    notification.hasReplyButton = YES;\n//    [self hook_deliverNotification:notification];\n//}\n//\n//- (void)hook_userNotificationCenter:(id)notificationCenter didActivateNotification:(NSUserNotification *)notification {\n//    NSString *chatName = notification.userInfo[@\"ChatName\"];\n//    if (chatName && notification.response.string) {\n//        NSString *instanceUserName = [objc_getClass(\"CUtility\") GetCurrentUserName];\n//        NSString *currentUserName = notification.userInfo[@\"currnetName\"];\n//        if ([instanceUserName isEqualToString:currentUserName]) {\n//            MessageService *service = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MessageService\")];\n//            [service SendTextMessage:currentUserName toUsrName:chatName msgText:notification.response.string atUserList:nil];\n//            [[TKMessageManager shareManager] clearUnRead:chatName];\n//        }\n//    } else {\n//        [self hook_userNotificationCenter:notificationCenter didActivateNotification:notification];\n//    }\n//}\n\n- (void)hook_onAuthOKOfUser:(id)arg1 withSessionKey:(id)arg2 withServerId:(id)arg3 autoAuthKey:(id)arg4 isAutoAuth:(BOOL)arg5 {\n    [self hook_onAuthOKOfUser:arg1 withSessionKey:arg2 withServerId:arg3 autoAuthKey:arg4 isAutoAuth:arg5];\n\n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n        if ([[TKWeChatPluginConfig sharedConfig] alfredEnable]) {\n            [[TKWebServerManager shareManager] startServer];\n        }\n        NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];\n        NSMenuItem *pluginMenu = mainMenu.itemArray.lastObject;\n        pluginMenu.enabled = YES;\n        NSMenuItem *preventMenu = pluginMenu.submenu.itemArray.firstObject;\n        preventMenu.enabled = YES;\n    });\n}\n\n- (void)hook_startGetA8KeyWithURL:(id)arg1 {\n    MMURLHandler *urlHandler = (MMURLHandler *)self;\n    [urlHandler openURLWithDefault:arg1];\n}\n\n- (void)hook_applicationDidFinishLaunching:(id)arg1 {\n    WeChat *wechat = [objc_getClass(\"WeChat\") sharedInstance];\n    if ([NSObject hook_HasWechatInstance]) {\n        wechat.hasAuthOK = YES;\n    }\n    if ([wechat respondsToSelector:@selector(checkForUpdatesInBackground)]) {\n        //      去除刚启动微信更新弹窗提醒\n        tk_hookMethod(objc_getClass(\"WeChat\"), @selector(checkForUpdatesInBackground), [self class], @selector(hook_checkForUpdatesInBackground));\n    }\n    \n    [[TKAssistantMenuManager shareManager] initAssistantMenuItems];\n    [self hook_applicationDidFinishLaunching:arg1];\n}\n\n//  强制用户退出时保存聊天记录\n- (id)hook_stringForKey:(NSString *)key {\n    if ([key isEqualToString:@\"kMMUserDefaultsKey_SaveChatHistory\"]) {\n        return @\"1\";\n    }\n    return [self hook_stringForKey:key];\n}\n\n//  微信检测更新\n- (void)hook_checkForUpdatesInBackground {\n    if ([[TKWeChatPluginConfig sharedConfig] checkUpdateWechatEnable]) {\n        [self hook_checkForUpdatesInBackground];\n    }\n}\n\n//  是否使用微信浏览器\n- (BOOL)hook_preHandleUrlStr:(id)arg1 withMessage:(id)arg2 {\n   if ([[TKWeChatPluginConfig sharedConfig] systemBrowserEnable]) {\n        MMURLHandler *urlHander = [objc_getClass(\"MMURLHandler\") defaultHandler];\n       if ([urlHander respondsToSelector:@selector(openURLWithDefault:)]) { // 2.3.22\n           [urlHander openURLWithDefault:arg1];\n           return YES;\n       } else if ([urlHander respondsToSelector:@selector(openURLWithDefault:useA8Key:)]) { // 2.3.30\n           [urlHander openURLWithDefault:arg1 useA8Key:YES];\n           return YES;\n       }\n    }\n    return [self hook_preHandleUrlStr:arg1 withMessage:arg2];\n}\n\n//  设置标记未读\n- (void)hook_onClickSession {\n    [self hook_onClickSession];\n    MMChatMessageViewController *chatMessageVC = (MMChatMessageViewController *)self;\n    NSMutableSet *unreadSessionSet = [[TKWeChatPluginConfig sharedConfig] unreadSessionSet];\n    if ([unreadSessionSet containsObject:chatMessageVC.chatContact.m_nsUsrName]) {\n        [unreadSessionSet removeObject:chatMessageVC.chatContact.m_nsUsrName];\n        [[TKMessageManager shareManager] clearUnRead:chatMessageVC.chatContact.m_nsUsrName];\n    }\n}\n\n- (void)hook_onUnReadCountChange:(id)arg1 {\n    NSMutableSet *unreadSessionSet = [[TKWeChatPluginConfig sharedConfig] unreadSessionSet];\n    if ([unreadSessionSet containsObject:arg1]) {\n        MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n        MMSessionInfo *sessionInfo = [sessionMgr sessionInfoByUserName:arg1];\n        sessionInfo.m_uUnReadCount++;\n    }\n    [self hook_onUnReadCountChange:arg1];\n}\n\n//  拦截微信语音转换，用于语音远程控制\n- (void)hook_updateTranscribeVoiceMessage:(MessageData *)arg1 voiceText:(id)arg2 voiceToTextStatus:(unsigned int)arg3 {\n    [self hook_updateTranscribeVoiceMessage:arg1 voiceText:arg2 voiceToTextStatus:arg3];\n    dispatch_async(dispatch_get_main_queue(), ^{\n        if ([arg1 isSendFromSelf]) {\n             NSString *currentUserName = [objc_getClass(\"CUtility\") GetCurrentUserName];\n            if ([arg1.toUsrName isEqualToString:currentUserName]) {\n                [TKRemoteControlManager executeRemoteControlCommandWithVoiceMsg:arg2];\n            }\n        }\n    });\n}\n\n#pragma mark - hook 系统方法\n- (void)hook_makeKeyAndOrderFront:(nullable id)sender {\n    BOOL top = [[TKWeChatPluginConfig sharedConfig] onTop];\n    ((NSWindow *)self).level = top == NSControlStateValueOn ? NSNormalWindowLevel+2 : NSNormalWindowLevel;\n    \n    [self hook_makeKeyAndOrderFront:sender];\n}\n\n#pragma mark - Other\n/**\n 自动回复\n \n @param addMsg 接收的消息\n */\n- (void)autoReplyWithMsg:(AddMsg *)addMsg {\n    //    addMsg.msgType != 49\n    if (![[TKWeChatPluginConfig sharedConfig] autoReplyEnable]) return;\n    if (addMsg.msgType != 1 && addMsg.msgType != 3) return;\n    \n    NSString *userName = addMsg.fromUserName.string;\n    \n    MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n    WCContactData *msgContact = [sessionMgr getSessionContact:userName];\n    if ([msgContact isBrandContact] || [msgContact isSelf]) {\n        //        该消息为公众号或者本人发送的消息\n        return;\n    }\n    NSArray *autoReplyModels = [[TKWeChatPluginConfig sharedConfig] autoReplyModels];\n    [autoReplyModels enumerateObjectsUsingBlock:^(TKAutoReplyModel *model, NSUInteger idx, BOOL * _Nonnull stop) {\n        if (!model.enable) return;\n        if (!model.replyContent || model.replyContent.length == 0) return;\n        \n        if (model.enableSpecificReply) {\n            if ([model.specificContacts containsObject:userName]) {\n                [self replyWithMsg:addMsg model:model];\n            }\n            return;\n        }\n        if ([addMsg.fromUserName.string containsString:@\"@chatroom\"] && !model.enableGroupReply) return;\n        if (![addMsg.fromUserName.string containsString:@\"@chatroom\"] && !model.enableSingleReply) return;\n        \n        [self replyWithMsg:addMsg model:model];\n    }];\n}\n\n- (void)replyWithMsg:(AddMsg *)addMsg model:(TKAutoReplyModel *)model {\n    NSString *msgContent = addMsg.content.string;\n    if ([addMsg.fromUserName.string containsString:@\"@chatroom\"]) {\n        msgContent = [msgContent substringFromString:@\":\\n\"];\n    }\n    \n    NSArray *replyArray = [model.replyContent componentsSeparatedByString:@\"|\"];\n    int index = arc4random() % replyArray.count;\n    NSString *randomReplyContent = replyArray[index];\n    NSInteger delayTime = model.enableDelay ? model.delayTime : 0;\n    \n    if (model.enableRegex) {\n        NSString *regex = model.keyword;\n        NSError *error;\n        NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:regex options:NSRegularExpressionCaseInsensitive error:&error];\n        if (error) return;\n        NSInteger count = [regular numberOfMatchesInString:msgContent options:NSMatchingReportCompletion range:NSMakeRange(0, msgContent.length)];\n        if (count > 0) {\n            [[TKMessageManager shareManager] sendTextMessage:randomReplyContent toUsrName:addMsg.fromUserName.string delay:delayTime];\n        }\n    } else {\n        NSArray * keyWordArray = [model.keyword componentsSeparatedByString:@\"|\"];\n        [keyWordArray enumerateObjectsUsingBlock:^(NSString *keyword, NSUInteger idx, BOOL * _Nonnull stop) {\n            if ([keyword isEqualToString:@\"*\"] || [msgContent isEqualToString:keyword]) {\n                [[TKMessageManager shareManager] sendTextMessage:randomReplyContent toUsrName:addMsg.fromUserName.string delay:delayTime];\n                *stop = YES;\n            }\n        }];\n    }\n}\n\n/**\n 远程控制\n \n @param addMsg 接收的消息\n */\n- (void)remoteControlWithMsg:(AddMsg *)addMsg {\n    NSDate *now = [NSDate date];\n    NSTimeInterval nowSecond = now.timeIntervalSince1970;\n    if (nowSecond - addMsg.createTime > 10) {      // 若是10秒前的消息，则不进行远程控制。\n        return;\n    }\n    if (addMsg.msgType == 1 || addMsg.msgType == 3) {\n        [TKRemoteControlManager executeRemoteControlCommandWithMsg:addMsg.content.string];\n    } else if (addMsg.msgType == 34) {\n        //      此为语音消息\n        FFProcessReqsvrZZ *msgService = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"FFProcessReqsvrZZ\")];\n        MessageData *msgData = [msgService GetMsgData:addMsg.fromUserName.string svrId:addMsg.newMsgId];\n         dispatch_async(dispatch_get_main_queue(), ^{\n             MMVoiceTranslateMgr *voiceMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMVoiceTranslateMgr\")];\n             [voiceMgr doTranslate:msgData isAuto:YES];\n         });\n    }\n}\n\n- (void)replySelfWithMsg:(AddMsg *)addMsg {\n    if (addMsg.msgType != 1 && addMsg.msgType != 3) return;\n    \n    if ([addMsg.content.string isEqualToString:TKLocalizedString(@\"assistant.remoteControl.getList\")]) {\n        NSString *callBack = [TKRemoteControlManager remoteControlCommandsString];\n        [[TKMessageManager shareManager] sendTextMessageToSelf:callBack];\n    }\n}\n\n- (void)windowsWillMiniaturize:(NSNotification *)notification {\n    NSObject *window = notification.object;\n    ((NSWindow *)window).level =NSNormalWindowLevel;\n}\n\n#pragma mark - 不支持的消息展示\n+ (id)hook_makePayTransferTableItemWithItem:(MMMessageTableItem *)arg1 {\n    MMMessageTableItem *tableItem = [self hook_makePayTransferTableItemWithItem:arg1];\n    \n    NSString *feeDesc = tableItem.message.m_oWCPayInfoItem.m_nsFeeDesc;\n    if (feeDesc.length > 0) {\n        tableItem.message.msgContent = [NSString stringWithFormat:@\"%@\\n金额：%@元\",tableItem.message.msgContent,feeDesc];\n    }\n    return tableItem;\n    \n}\n+ (id)hook_makeAppBrandTableItemWithItem:(MMMessageTableItem *)arg1 {\n    MMMessageTableItem *tableItem = [self hook_makeAppBrandTableItemWithItem:arg1];\n    tableItem.message = [self resetMsgContent:tableItem.message];\n    return tableItem;\n}\n\n+ (id)hook_makeUnsupportedTableItemWithItem:(MMMessageTableItem *)arg1 {\n    MMMessageTableItem *tableItem = [self hook_makeUnsupportedTableItemWithItem:arg1];\n    tableItem.message = [self resetMsgContent:tableItem.message];\n    return tableItem;\n}\n\n+ (MessageData *)resetMsgContent:(MessageData *)msgData {\n    if (msgData.m_nsTitle.length > 0) {\n        NSString *from = @\"内容\";\n        if (msgData.m_nsSourceDisplayname.length > 0) {\n            from = msgData.m_nsSourceDisplayname;\n        } else if (msgData.m_nsAppName.length > 0) {\n            from = msgData.m_nsAppName;\n        }\n        msgData.msgContent = [msgData.msgContent stringByAppendingFormat:@\"\\n%@：%@\", from, msgData.m_nsTitle];\n    }\n\n    return msgData;\n}\n\n#pragma mark - 退群处理\n- (void)hook_notifyModifyGroupContactsOnMainThread:(NSArray <WCContactData *> *)arg1 {\n    [self hook_notifyModifyGroupContactsOnMainThread:arg1];\n    if (![TKWeChatPluginConfig sharedConfig].memberExitMonitoringEnable) {\n        return;\n    }\n    GroupStorage *contactStorage = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"GroupStorage\")];\n    [arg1 enumerateObjectsUsingBlock:^(WCContactData * obj, NSUInteger idx, BOOL * _Nonnull stop) {\n        NSDictionary *m_dicData = [obj.m_chatRoomData valueForKey:@\"m_dicData\"];\n        [m_dicData.allKeys enumerateObjectsUsingBlock:^(NSString *userName, NSUInteger idx, BOOL * _Nonnull stop) {\n            if (![obj containsMember:userName]) {\n                NSString *localKey = [NSString stringWithFormat:@\"%@-%@\",obj.m_nsUsrName, userName];\n                NSMutableDictionary *quitChatRoomMemberDict = [TKWeChatPluginConfig sharedConfig].quitChatRoomMemberDict;\n                NSString *saveDateKey = quitChatRoomMemberDict[localKey];\n                BOOL canShowQuitTip = NO;\n                if (saveDateKey) {\n                    NSDate *currentDate = [NSDate date];\n                    NSDate *lastSaveDate = [[TKUtility getDateFormater] dateFromString:saveDateKey];\n                    NSTimeInterval days = [currentDate timeIntervalSinceDate:lastSaveDate] / (3600.0 * 24);\n                    canShowQuitTip = days > kTKMemberQuitDayInterval;\n                } else {\n                    canShowQuitTip = YES;\n                }\n                if (canShowQuitTip) {\n                    [TKWeChatPluginConfig sharedConfig].quitChatRoomMemberDict[localKey] = [TKUtility getOnlyDateString];\n                    [[TKWeChatPluginConfig sharedConfig] saveQuitChatRoomMemberDict];\n                    WCContactData *quitChatroomUser = [contactStorage GetGroupMemberContact:userName];\n                    NSString *msgContent = [NSString stringWithFormat:@\"%@ %@ \\n %@%@\",quitChatroomUser.m_nsNickName, WXLocalizedString(@\"ChatInspector.LeaveChat\"),WXLocalizedString(@\"Contacts.UserNameKeyLabel\"),userName];\n                    FFProcessReqsvrZZ *msgService = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"FFProcessReqsvrZZ\")];\n                    MessageData *newMsgData = ({\n                        MessageData *msg = [[objc_getClass(\"MessageData\") alloc] initWithMsgType:0x2710];\n                        [msg setFromUsrName:userName];\n                        [msg setToUsrName:obj.m_nsUsrName];\n                        [msg setM_nsAppName:userName];\n                        [msg setMsgStatus:4];\n                        [msg setMsgContent:msgContent];\n                        [msg setMsgCreateTime:[[NSDate date] timeIntervalSince1970]];\n\n                        msg;\n                    });\n                    [msgService AddLocalMsg:obj.m_nsUsrName msgData:newMsgData];\n                }\n            }\n        }];\n    }];\n}\n\n- (BOOL)hook_textView:(NSTextView *)arg1 clickedOnLink:(NSString *)arg2 atIndex:(unsigned long long)arg3 {\n    if ([arg2 containsString:kTKScrollToMessageKey]) {\n        MMSystemMessageCellView *currentCellView = (MMSystemMessageCellView *)self;\n        NSString *localIDStr = [arg2 substringFromString:kTKScrollToMessageKey];\n        NSUInteger localId = [localIDStr integerValue];\n        if (localId > 0) {\n            if ([currentCellView.delegate isKindOfClass:objc_getClass(\"MMChatMessageViewController\")]) {\n                MMChatMessageViewController *vc = currentCellView.delegate;\n                if ([vc respondsToSelector:@selector(showLocatedMessage:)]) {\n                    [vc showLocatedMessage:localId];\n                } else if ([vc respondsToSelector:@selector(showLocatedMessage:needHighLighted:)]) {\n                    [vc showLocatedMessage:localId needHighLighted:YES];\n                }\n            }\n        }\n        return YES;\n    } else if ([arg2 containsString:kTKShowMembeContactProfileKey]) {\n        NSString *usrName = [arg2 substringFromString:kTKShowMembeContactProfileKey];\n        if (usrName.length) {\n            MMSystemMessageCellView *currentCellView = (MMSystemMessageCellView *)self;\n            MMMessageTableItem *item = currentCellView.messageTableItem;\n            MessageData *msgData = item.message;\n            GroupStorage *contactStorage = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"GroupStorage\")];\n            WCContactData *contactData = [objc_getClass(\"CUtility\") GetContactByUsrName:usrName];\n            if (!contactData) {\n                contactData = [contactStorage GetGroupMemberContact:usrName];\n            }\n            if (contactData) {\n                MMContactProfileController *vc = [[objc_getClass(\"MMContactProfileController\") alloc] initWithNibName:@\"MMContactProfileController\" bundle:0];\n                vc.groupName = msgData.fromUsrName;\n                vc.relativeToRect = CGRectMake(150, 11, 200, 50);\n                vc.preferredEdge = 2;\n                vc.contactData = contactData;\n                [vc showInView:self];\n                return YES;\n            }\n        }\n    }\n    \n    return [self hook_textView:arg1 clickedOnLink:arg2 atIndex:arg3];\n}\n\n- (void)hook_populateWithMessage:(id)arg1 {\n    [self hook_populateWithMessage:arg1];\n    \n    MMSystemMessageCellView *currentCellView = (MMSystemMessageCellView *)self;\n    MMMessageTableItem *item = currentCellView.messageTableItem;\n    MessageData *msgData = item.message;\n    NSString *msgContent = msgData.msgContent;\n    if ([msgContent containsString:WXLocalizedString(@\"ChatInspector.LeaveChat\")] &&\n        [msgContent containsString:WXLocalizedString(@\"Contacts.UserNameKeyLabel\")]) {\n        NSMutableAttributedString *attStr = [currentCellView.msgTextView.attributedString mutableCopy];\n        NSString *displayMsgContent = attStr.string;\n        NSString *userName = [displayMsgContent substringToString:WXLocalizedString(@\"ChatInspector.LeaveChat\")];\n        NSString *userId = [displayMsgContent substringFromString:WXLocalizedString(@\"Contacts.UserNameKeyLabel\")];\n        \n        if (userName && userId) {\n            // 将用户昵称标记超链接\n            NSRange userRange = [displayMsgContent rangeOfString:userName];\n            if (userRange.length > 0 && userId) {\n                NSString *linkValue = [kTKShowMembeContactProfileKey stringByAppendingString:userId];\n                [attStr addAttribute:NSLinkAttributeName value:linkValue range:userRange];\n            }\n            //  删除其他信息，不显示微信号\n            NSString *otherMsg = [displayMsgContent substringFromString:WXLocalizedString(@\"ChatInspector.LeaveChat\")];\n            if (otherMsg) {\n                NSRange otherMsgRange = [displayMsgContent rangeOfString:otherMsg];\n                [attStr deleteCharactersInRange:otherMsgRange];\n            }\n            currentCellView.msgTextView.textStorage.attributedString = attStr;\n        }\n    } else if ([msgContent containsString:kTKRevokeLocationKey]) {\n        NSMutableAttributedString *attStr = [currentCellView.msgTextView.attributedString mutableCopy];\n        NSString *displayMsgContent = attStr.string;\n        NSString *originMsg = [displayMsgContent substringFromString:TKLocalizedString(@\"assistant.revoke.otherMessage.tip\")];\n        if (originMsg) {\n            // 将撤回内容标记超链接\n            NSRange msgRange = [displayMsgContent rangeOfString:originMsg];\n            if (msgRange.length > 0) {\n                NSString *localID = [displayMsgContent substringFromString:kTKRevokeLocationKey];\n                if (localID) {\n                    NSString *linkValue = [kTKScrollToMessageKey stringByAppendingString:localID];\n                    [attStr addAttribute:NSLinkAttributeName value:linkValue range:msgRange];\n                }\n            }\n        }\n        //  删除其他信息，不显示微信号\n        NSRange tipRange = [attStr.string rangeOfString:kTKRevokeLocationKey];\n        if (tipRange.length > 0) {\n            NSString *tipAndLocalId = [attStr.string substringFromIndex:tipRange.location];\n            NSRange localIdrange = [attStr.string rangeOfString:tipAndLocalId];\n            if (localIdrange.length > 0) {\n                if (localIdrange.length + localIdrange.location > attStr.length) {\n                    localIdrange.length = attStr.length - localIdrange.location;\n                }\n                [attStr deleteCharactersInRange:localIdrange];\n            }\n            currentCellView.msgTextView.textStorage.attributedString = attStr;\n        }\n    }\n    NSMutableArray *names = [TKUtility getMemberNameWithMsgContent:msgContent];\n    if (names.count > 0) {\n        NSMutableAttributedString *attStr = [currentCellView.msgTextView.attributedString mutableCopy];\n         NSString *displayMsgContent = attStr.string;\n        GroupStorage *contactStorage = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"GroupStorage\")];\n        MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n        WCContactData *group = [sessionMgr getSessionContact:msgData.fromUsrName];\n        NSArray *memberList = [contactStorage GetGroupMemberListWithGroupContact:group limit:500 filterSelf:YES];\n\n        [memberList enumerateObjectsUsingBlock:^(WCContactData *obj, NSUInteger idx, BOOL * _Nonnull stop) {\n            __block NSString *needRemoveName = nil;\n            [names enumerateObjectsUsingBlock:^(NSString *name, NSUInteger idx, BOOL * _Nonnull subStop) {\n                if ( [[obj groupChatDisplayNameInGroup:msgData.fromUsrName] isEqualToString:name] ||\n                    [obj.m_nsNickName isEqualToString:name] ||\n                    [obj.m_nsRemark isEqual:name]) {\n                    NSRange nameRange = [displayMsgContent rangeOfString:name];\n                    NSString *value = [NSString stringWithFormat:@\"%@%@\",kTKShowMembeContactProfileKey,obj.m_nsUsrName];\n                    [attStr addAttribute:NSLinkAttributeName value:value range:nameRange];\n                    needRemoveName = name;\n                    *subStop = YES;\n                }\n            }];\n            if (needRemoveName) {\n                [names removeObject:needRemoveName];\n            }\n            if (names.count == 0) {\n                *stop = YES;\n            }\n        }];\n        currentCellView.msgTextView.textStorage.attributedString = attStr;\n    }\n}\n\n#pragma mark - 替换 NSSearchPathForDirectoriesInDomains & NSHomeDirectory\nstatic NSArray<NSString *> *(*original_NSSearchPathForDirectoriesInDomains)(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);\n\nNSArray<NSString *> *swizzled_NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde) {\n    NSMutableArray<NSString *> *paths = [original_NSSearchPathForDirectoriesInDomains(directory, domainMask, expandTilde) mutableCopy];\n    NSString *sandBoxPath = [NSString stringWithFormat:@\"%@/Library/Containers/com.tencent.xinWeChat/Data\",original_NSHomeDirectory()];\n    \n    [paths enumerateObjectsUsingBlock:^(NSString *filePath, NSUInteger idx, BOOL * _Nonnull stop) {\n        NSRange range = [filePath rangeOfString:original_NSHomeDirectory()];\n        if (range.length > 0) {\n            NSMutableString *newFilePath = [filePath mutableCopy];\n            [newFilePath replaceCharactersInRange:range withString:sandBoxPath];\n            paths[idx] = newFilePath;\n        }\n    }];\n    \n    return paths;\n}\n\nstatic NSString *(*original_NSHomeDirectory)(void);\n\nNSString *swizzled_NSHomeDirectory(void) {\n    return [NSString stringWithFormat:@\"%@/Library/Containers/com.tencent.xinWeChat/Data\",original_NSHomeDirectory()];\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKAssistantMenuManager.h",
    "content": "//\n//  TKAssistantMenuManager.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/24.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface TKAssistantMenuManager : NSObject\n\n+ (instancetype)shareManager;\n- (void)initAssistantMenuItems;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKAssistantMenuManager.m",
    "content": "//\n//  TKAssistantMenuManager.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/24.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"TKAssistantMenuManager.h\"\n#import \"TKRemoteControlManager.h\"\n#import \"TKAutoReplyWindowController.h\"\n#import \"TKRemoteControlWindowController.h\"\n#import \"TKVersionManager.h\"\n#import \"NSMenuItem+Action.h\"\n#import \"TKDownloadWindowController.h\"\n#import \"TKAboutWindowController.h\"\n#import \"TKWebServerManager.h\"\n\nstatic char tkAutoReplyWindowControllerKey;         //  自动回复窗口的关联 key\nstatic char tkRemoteControlWindowControllerKey;     //  远程控制窗口的关联 key\nstatic char tkAboutWindowControllerKey;             //  关于窗口的关联 key\n\n@implementation TKAssistantMenuManager\n\n+ (instancetype)shareManager {\n    static id manager = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        manager = [[self alloc] init];\n    });\n    return manager;\n}\n\n- (void)initAssistantMenuItems {\n    //        消息防撤回\n    NSMenuItem *preventRevokeItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.revoke\")\n                                                           action:@selector(onPreventRevoke:)\n                                                           target:self\n                                                    keyEquivalent:@\"t\"\n                                                            state:[[TKWeChatPluginConfig sharedConfig] preventRevokeEnable]];\n    if ([[TKWeChatPluginConfig sharedConfig] preventRevokeEnable]) {\n        //        防撤回自己\n        NSMenuItem *preventSelfRevokeItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.revokeSelf\")\n                                                                   action:@selector(onPreventSelfRevoke:)\n                                                                   target:self\n                                                            keyEquivalent:@\"\"\n                                                                    state:[[TKWeChatPluginConfig sharedConfig] preventSelfRevokeEnable]];\n        \n        NSMenu *subPreventMenu = [[NSMenu alloc] initWithTitle:TKLocalizedString(@\"assistant.menu.revoke\")];\n        [subPreventMenu addItems:@[preventSelfRevokeItem]];\n        preventRevokeItem.submenu = subPreventMenu;\n    }\n    \n    //        自动回复\n    NSMenuItem *autoReplyItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.autoReply\")\n                                                       action:@selector(onAutoReply:)\n                                                       target:self\n                                                keyEquivalent:@\"k\"\n                                                        state:[[TKWeChatPluginConfig sharedConfig] autoReplyEnable]];\n    //        远程控制\n    NSMenuItem *commandItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.remoteControl\")\n                                                     action:@selector(onRemoteControl:)\n                                                     target:self\n                                              keyEquivalent:@\"C\"\n                                                      state:0];\n    //        微信窗口置顶\n    NSMenuItem *onTopItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.windowSticky\")\n                                                   action:@selector(onWechatOnTopControl:)\n                                                   target:self\n                                            keyEquivalent:@\"D\"\n                                                    state:[[TKWeChatPluginConfig sharedConfig] onTop]];\n    \n    //        使用自带浏览器\n    NSMenuItem *enableSystemBrowserItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.systemBrowser\")\n                                                                action:@selector(onEnableSystemBrowser:)\n                                                                target:self\n                                                         keyEquivalent:@\"B\"\n                                                                 state:[[TKWeChatPluginConfig sharedConfig] systemBrowserEnable]];\n    \n    //        退群监控\n    NSMenuItem *memberExitMonitoringItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.memberExitMonitoring\")\n                                                                action:@selector(onEnablememberExitMonitoring:)\n                                                                target:self\n                                                         keyEquivalent:@\"\"\n                                                                 state:[[TKWeChatPluginConfig sharedConfig] memberExitMonitoringEnable]];\n    \n    //        是否禁止微信开启时检测新版本\n    NSMenuItem *forbidCheckUpdateItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.forbidCheck\")\n                                                                 action:@selector(onForbidWeChatCheckUpdate:)\n                                                                 target:self\n                                                          keyEquivalent:@\"\"\n                                                                  state:![[TKWeChatPluginConfig sharedConfig] checkUpdateWechatEnable]];\n    \n    //        开启 Alfred\n    NSMenuItem *enableAlfredItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.enableAlfred\")\n                                                          action:@selector(onEnableaAlfred:)\n                                                          target:self\n                                                   keyEquivalent:@\"\"\n                                                           state:[[TKWeChatPluginConfig sharedConfig] alfredEnable]];\n\n    //        更新小助手\n    NSMenuItem *updatePluginItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.updateAssistant\")\n                                                          action:@selector(onUpdatePluginControl:)\n                                                          target:self\n                                                   keyEquivalent:@\"\"\n                                                           state:0];\n    //        关于小助手\n    NSMenuItem *abountPluginItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.aboutAssistant\")\n                                                          action:@selector(onAboutPluginControl:)\n                                                          target:self\n                                                   keyEquivalent:@\"\"\n                                                           state:0];\n    \n    //        关于小助手\n    NSMenuItem *pluginItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.other\")\n                                                          action:@selector(onAboutPluginControl:)\n                                                          target:self\n                                                   keyEquivalent:@\"\"\n                                                           state:0];\n    NSMenu *subPluginMenu = [[NSMenu alloc] initWithTitle:TKLocalizedString(@\"assistant.menu.other\")];\n    [subPluginMenu addItems:@[enableAlfredItem,\n                             updatePluginItem,\n                             abountPluginItem]];\n    \n    NSMenu *subMenu = [[NSMenu alloc] initWithTitle:TKLocalizedString(@\"assistant.menu.title\")];\n\n    [subMenu addItems:@[preventRevokeItem,\n                        autoReplyItem,\n                        commandItem,\n                        onTopItem,\n                        enableSystemBrowserItem,\n                        memberExitMonitoringItem,\n                        pluginItem\n                        ]];\n    WeChat *wechat = [objc_getClass(\"WeChat\") sharedInstance];\n    if ([wechat respondsToSelector:@selector(checkForUpdatesInBackground)]) {\n        [subMenu insertItem:forbidCheckUpdateItem atIndex:6];\n    }\n    [subMenu setSubmenu:subPluginMenu forItem:pluginItem];\n    NSMenuItem *menuItem = [[NSMenuItem alloc] init];\n    [menuItem setTitle:TKLocalizedString(@\"assistant.menu.title\")];\n    [menuItem setSubmenu:subMenu];\n    menuItem.target = self;\n    [[[NSApplication sharedApplication] mainMenu] addItem:menuItem];\n    menuItem.enabled = NO;\n    \n    [self addObserverWeChatConfig];\n}\n\n#pragma mark - 监听 WeChatPluginConfig\n\n- (void)addObserverWeChatConfig {\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(weChatPluginConfigAutoReplyChange) name:NOTIFY_AUTO_REPLY_CHANGE object:nil];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(weChatPluginConfigPreventRevokeChange) name:NOTIFY_PREVENT_REVOKE_CHANGE object:nil];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(weChatPluginConfigAutoAuthChange) name:NOTIFY_AUTO_AUTH_CHANGE object:nil];\n}\n\n- (void)weChatPluginConfigAutoReplyChange {\n    TKWeChatPluginConfig *shareConfig = [TKWeChatPluginConfig sharedConfig];\n    shareConfig.autoReplyEnable = !shareConfig.autoReplyEnable;\n    [self changePluginMenuItemWithIndex:1 state:shareConfig.autoReplyEnable];\n}\n\n- (void)weChatPluginConfigPreventRevokeChange {\n    TKWeChatPluginConfig *shareConfig = [TKWeChatPluginConfig sharedConfig];\n    shareConfig.preventRevokeEnable = !shareConfig.preventRevokeEnable;\n    [self changePluginMenuItemWithIndex:0 state:shareConfig.preventRevokeEnable];\n}\n\n- (void)weChatPluginConfigAutoAuthChange {\n    TKWeChatPluginConfig *shareConfig = [TKWeChatPluginConfig sharedConfig];\n    shareConfig.autoAuthEnable = !shareConfig.autoAuthEnable;\n    [self changePluginMenuItemWithIndex:5 state:shareConfig.autoAuthEnable];\n}\n\n- (void)changePluginMenuItemWithIndex:(NSInteger)index state:(NSControlStateValue)state {\n    NSMenuItem *pluginMenuItem = [[[[NSApplication sharedApplication] mainMenu] itemArray] lastObject];\n    NSMenuItem *item = pluginMenuItem.submenu.itemArray[index];\n    item.state = state;\n}\n\n#pragma mark - menuItem 的点击事件\n/**\n 菜单栏-微信小助手-消息防撤回 设置\n \n @param item 消息防撤回的item\n */\n- (void)onPreventRevoke:(NSMenuItem *)item {\n    item.state = !item.state;\n    [[TKWeChatPluginConfig sharedConfig] setPreventRevokeEnable:item.state];\n    if (item.state) {\n        //        防撤回自己\n        NSMenuItem *preventSelfRevokeItem = [NSMenuItem menuItemWithTitle:TKLocalizedString(@\"assistant.menu.revokeSelf\")\n                                                                   action:@selector(onPreventSelfRevoke:)\n                                                                   target:self\n                                                            keyEquivalent:@\"\"\n                                                                    state:[[TKWeChatPluginConfig sharedConfig] preventSelfRevokeEnable]];\n        \n        NSMenu *subPreventMenu = [[NSMenu alloc] initWithTitle:TKLocalizedString(@\"assistant.menu.revoke\")];\n        [subPreventMenu addItems:@[preventSelfRevokeItem]];\n        item.submenu = subPreventMenu;\n    } else {\n        item.submenu = nil;\n    }\n    \n}\n\n/**\n 菜单栏-微信小助手-消息防撤回-拦截自己消息 设置\n \n @param item 消息防撤回的item\n */\n- (void)onPreventSelfRevoke:(NSMenuItem *)item {\n    item.state = !item.state;\n    [[TKWeChatPluginConfig sharedConfig] setPreventSelfRevokeEnable:item.state];\n}\n\n/**\n 菜单栏-微信小助手-自动回复 设置\n \n @param item 自动回复设置的item\n */\n- (void)onAutoReply:(NSMenuItem *)item {\n    WeChat *wechat = [objc_getClass(\"WeChat\") sharedInstance];\n    TKAutoReplyWindowController *autoReplyWC = objc_getAssociatedObject(wechat, &tkAutoReplyWindowControllerKey);\n\n    if (!autoReplyWC) {\n        autoReplyWC = [[TKAutoReplyWindowController alloc] initWithWindowNibName:@\"TKAutoReplyWindowController\"];\n        objc_setAssociatedObject(wechat, &tkAutoReplyWindowControllerKey, autoReplyWC, OBJC_ASSOCIATION_RETAIN);\n    }\n    [autoReplyWC show];\n}\n\n/**\n 菜单栏-帮助-远程控制 MAC OS 设置\n \n @param item 远程控制的item\n */\n- (void)onRemoteControl:(NSMenuItem *)item {\n    WeChat *wechat = [objc_getClass(\"WeChat\") sharedInstance];\n    TKRemoteControlWindowController *remoteControlWC = objc_getAssociatedObject(wechat, &tkRemoteControlWindowControllerKey);\n    \n    if (!remoteControlWC) {\n        remoteControlWC = [[TKRemoteControlWindowController alloc] initWithWindowNibName:@\"TKRemoteControlWindowController\"];\n        objc_setAssociatedObject(wechat, &tkRemoteControlWindowControllerKey, remoteControlWC, OBJC_ASSOCIATION_RETAIN);\n    }\n    \n    [remoteControlWC show];\n}\n\n/**\n 菜单栏-微信小助手-微信窗口置顶\n \n @param item 窗口置顶的 item\n */\n- (void)onWechatOnTopControl:(NSMenuItem *)item {\n    item.state = !item.state;\n    [[TKWeChatPluginConfig sharedConfig] setOnTop:item.state];\n    \n    NSArray *windows = [[NSApplication sharedApplication] windows];\n    [windows enumerateObjectsUsingBlock:^(NSWindow *window, NSUInteger idx, BOOL * _Nonnull stop) {\n        if (![window.className isEqualToString:@\"NSStatusBarWindow\"]) {\n            window.level = item.state == NSControlStateValueOn ? NSNormalWindowLevel+2 : NSNormalWindowLevel;\n        }\n    }];\n}\n\n/**\n 菜单栏-微信小助手-更新小助手\n \n @param item 更新小助手的 item\n */\n- (void)onUpdatePluginControl:(NSMenuItem *)item {\n    [[TKWeChatPluginConfig sharedConfig] setForbidCheckVersion:NO];\n    [[TKVersionManager shareManager] checkVersionFinish:^(TKVersionStatus status, NSString *message) {\n        if (status == TKVersionStatusNew) {\n            NSAlert *alert = [[NSAlert alloc] init];\n            [alert addButtonWithTitle:TKLocalizedString(@\"assistant.update.alret.confirm\")];\n            [alert addButtonWithTitle:TKLocalizedString(@\"assistant.update.alret.cancle\")];\n            [alert setMessageText:TKLocalizedString(@\"assistant.update.alret.title\")];\n            [alert setInformativeText:message];\n            NSModalResponse respose = [alert runModal];\n            if (respose == NSAlertFirstButtonReturn) {\n                [[TKDownloadWindowController downloadWindowController] show];\n            }\n        } else {\n            NSAlert *alert = [[NSAlert alloc] init];\n            [alert setMessageText:TKLocalizedString(@\"assistant.update.alret.latest\")];\n            [alert setInformativeText:message];\n            [alert runModal];\n        }\n    }];\n}\n\n- (void)onEnableaAlfred:(NSMenuItem *)item {\n    item.state = !item.state;\n    if (item.state) {\n        [[TKWebServerManager shareManager] startServer];\n    } else {\n        [[TKWebServerManager shareManager] endServer];\n    }\n    [[TKWeChatPluginConfig sharedConfig] setAlfredEnable:item.state];\n}\n\n- (void)onEnableSystemBrowser:(NSMenuItem *)item {\n    item.state = !item.state;\n    [[TKWeChatPluginConfig sharedConfig] setSystemBrowserEnable:item.state];\n}\n\n- (void)onEnablememberExitMonitoring:(NSMenuItem *)item {\n    item.state = !item.state;\n    [[TKWeChatPluginConfig sharedConfig] setMemberExitMonitoringEnable:item.state];\n}\n\n- (void)onForbidWeChatCheckUpdate:(NSMenuItem *)item {\n    item.state = !item.state;\n    [[TKWeChatPluginConfig sharedConfig] setCheckUpdateWechatEnable:!item.state];\n}\n\n- (void)onAboutPluginControl:(NSMenuItem *)item {\n    WeChat *wechat = [objc_getClass(\"WeChat\") sharedInstance];\n    TKAboutWindowController *remoteControlWC = objc_getAssociatedObject(wechat, &tkAboutWindowControllerKey);\n    \n    if (!remoteControlWC) {\n        remoteControlWC = [[TKAboutWindowController alloc] initWithWindowNibName:@\"TKAboutWindowController\"];\n        objc_setAssociatedObject(wechat, &tkAboutWindowControllerKey, remoteControlWC, OBJC_ASSOCIATION_RETAIN);\n    }\n    \n    [remoteControlWC show];\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKCacheManager.h",
    "content": "//\n//  TKCacheManager.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/8/3.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface TKCacheManager : NSObject\n\n+ (instancetype)shareManager;\n\n- (BOOL)fileExistsWithName:(NSString *)fileName;\n- (NSString *)filePathWithName:(NSString *)fileName;\n- (NSString *)cacheEmotionMessage:(MessageData *)emotionMsg;\n- (NSString *)cacheAvatarWithContact:(WCContactData *)contact;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKCacheManager.m",
    "content": "//\n//  TKCacheManager.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/8/3.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"TKCacheManager.h\"\n\n@interface TKCacheManager () <EmoticonDownloadMgrExt>\n\n@property (nonatomic, copy) NSString *cacheDirectory;\n@property (nonatomic, strong) NSMutableSet *emotionSet;\n@property (nonatomic, strong) NSMutableSet *avatarSet;\n@end\n\n@implementation TKCacheManager\n\n+ (instancetype)shareManager {\n    static TKCacheManager *manager = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        manager = [[TKCacheManager alloc] init];\n    });\n    return manager;\n}\n\n- (instancetype)init\n{\n    self = [super init];\n    if (self) {\n        self.cacheDirectory = [NSTemporaryDirectory() stringByAppendingString:@\"TKWeChatPlugin/\"];\n        NSFileManager *manager = [NSFileManager defaultManager];\n        if (![manager fileExistsAtPath:self.cacheDirectory]) {\n            [manager createDirectoryAtPath:self.cacheDirectory withIntermediateDirectories:YES attributes:nil error:nil];\n        }\n        \n        MMExtensionCenter *extensionCenter = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:[objc_getClass(\"MMExtensionCenter\") class]];\n        MMExtension *extension = [extensionCenter getExtension:@protocol(EmoticonDownloadMgrExt)];\n        if (extension) {\n            [extension registerExtension:self];\n        }\n        \n        self.emotionSet = [NSMutableSet set];\n        self.avatarSet = [NSMutableSet set];\n    }\n    return self;\n}\n\n- (void)dealloc {\n    MMExtensionCenter *extensionCenter = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:[objc_getClass(\"MMExtensionCenter\") class]];\n    MMExtension *extension = [extensionCenter getExtension:@protocol(EmoticonDownloadMgrExt)];\n    if (extension) {\n        [extension unregisterExtension:self];\n    }\n}\n\n- (BOOL)fileExistsWithName:(NSString *)fileName {\n    fileName = [fileName stringByAppendingString:@\".gif\"];\n    NSString *filePath = [self.cacheDirectory stringByAppendingString:fileName];\n    NSFileManager *manager = [NSFileManager defaultManager];\n    return [manager fileExistsAtPath:filePath];\n}\n\n- (NSString *)filePathWithName:(NSString *)fileName {\n    if (![self fileExistsWithName:fileName]) return nil;\n    \n    fileName = [fileName stringByAppendingString:@\".gif\"];\n    return [self.cacheDirectory stringByAppendingString:fileName];\n}\n\n- (NSString *)cacheImageData:(NSData *)imageData withFileName:(NSString *)fileName completion:(void (^)(BOOL))completion {\n    BOOL result = NO;\n    if (!imageData) {\n        if (completion) {\n            completion(result);\n        }\n    }\n    NSString *imageName = [NSString stringWithFormat:@\"%@.gif\", fileName];\n    NSString *tempImageFilePath = [self.cacheDirectory stringByAppendingString:imageName];\n    if (imageData) {\n        NSURL *imageUrl = [NSURL fileURLWithPath:tempImageFilePath];\n        result = [imageData writeToURL:imageUrl atomically:YES];\n    }\n    \n    if (completion) {\n        completion(result);\n    }\n    return tempImageFilePath;\n}\n\n- (NSString *)cacheEmotionMessage:(MessageData *)emotionMsg {\n    EmoticonMgr *emoticonMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"EmoticonMgr\")];\n    NSData *imageData = [emoticonMgr getEmotionDataWithMD5:emotionMsg.m_nsEmoticonMD5];\n    if (!imageData && ![self.emotionSet containsObject:emotionMsg.m_nsEmoticonMD5]) {\n        EmoticonDownloadMgr *emotionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"EmoticonDownloadMgr\")];\n        [emotionMgr downloadEmoticonWithMessageData:emotionMsg];\n        [self.emotionSet addObject:emotionMsg.m_nsEmoticonMD5];\n    }\n    NSString *tempImageFilePath = [self cacheImageData:imageData withFileName:emotionMsg.m_nsEmoticonMD5 completion:nil];\n\n    return tempImageFilePath;\n}\n\n- (void)emoticonDownloadFinished:(EmoticonMsgInfo *)msgInfo {\n    if (![self.emotionSet containsObject:msgInfo.m_nsMD5]) return;\n    \n    EmoticonMgr *emoticonMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"EmoticonMgr\")];\n    NSData *imageData = [emoticonMgr getEmotionDataWithMD5:msgInfo.m_nsMD5];\n    [self cacheImageData:imageData withFileName:msgInfo.m_nsMD5 completion:^(BOOL result) {\n        if(result) {\n            [self.emotionSet removeObject:msgInfo.m_nsMD5];\n        }\n    }];\n}\n\n- (NSString *)cacheAvatarWithContact:(WCContactData *)contact {\n    NSString *headImgUrl = contact.m_nsHeadImgUrl;\n    if (headImgUrl.length == 0) return @\"\";\n    \n    NSString *imgPath = @\"\";\n    if ([headImgUrl respondsToSelector:@selector(md5String)]) {\n        NSString *imgMd5Str = [headImgUrl performSelector:@selector(md5String)];\n        MMAvatarService *avatarService = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMAvatarService\")];\n\n        NSString *userCache =  [objc_getClass(\"PathUtility\") GetCurUserCachePath];\n        NSString *avatarPath = [userCache stringByAppendingString:@\"/avatar\"];\n\n        NSFileManager *fileMgr = [NSFileManager defaultManager];\n        if (![fileMgr fileExistsAtPath:avatarPath]) {\n             [fileMgr createDirectoryAtPath:avatarPath withIntermediateDirectories:YES attributes:nil error:nil];\n        }\n        \n        imgPath = [NSString stringWithFormat:@\"%@/%@\", avatarPath, imgMd5Str];\n        if (imgPath && ![fileMgr fileExistsAtPath:imgPath] && ![self.avatarSet containsObject:imgPath]) {\n            [self.avatarSet addObject:imgPath];\n            \n            void (^cacheImage)(NSImage *img) = ^(NSImage *img) {\n                NSData *imageData = [img TIFFRepresentation];\n                [imageData writeToFile:imgPath atomically:YES];\n                [self.avatarSet removeObject:imgPath];\n            };\n            \n            if ([avatarService respondsToSelector:@selector(avatarImageWithContact:completion:)]) {\n                [avatarService avatarImageWithContact:contact completion:cacheImage];\n            } else {\n                [avatarService getAvatarImageWithContact:contact completion:cacheImage];\n            }\n        }\n\n    }\n    return imgPath ?: @\"\";\n\n}\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKEmoticonManager.h",
    "content": "//\n//  TKEmoticonManager.h\n//  WeChatPlugin\n//\n//  Created by TK on 2019/3/13.\n//  Copyright © 2019 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface TKEmoticonManager : NSObject\n\n+ (instancetype)shareManager;\n\n- (void)copyEmoticonWithMd5:(NSString *)md5Str;\n- (void)exportEmoticonWithMd5:(NSString *)md5Str window:(NSWindow *)window;\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKEmoticonManager.m",
    "content": "//\n//  TKEmoticonManager.m\n//  WeChatPlugin\n//\n//  Created by TK on 2019/3/13.\n//  Copyright © 2019 tk. All rights reserved.\n//\n\n#import \"TKEmoticonManager.h\"\n#import \"WeChatPlugin.h\"\n\n@implementation TKEmoticonManager\n\n+ (instancetype)shareManager {\n    static TKEmoticonManager *manager = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        manager = [[TKEmoticonManager alloc] init];\n    });\n    return manager;\n}\n\n- (void)copyEmoticonWithMd5:(NSString *)md5Str {\n    if (!md5Str) {\n        return;\n    }\n    \n    EmoticonMgr *emoticonMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"EmoticonMgr\")];\n    NSData *imageData = [emoticonMgr getEmotionDataWithMD5:md5Str];\n    if (!imageData) return;\n    \n    NSString *imageType = [TKUtility getTypeForImageData:imageData];\n    if (![imageType isEqualToString:@\"gif\"]) {\n        NSImage *image = [emoticonMgr getEmotionImgWithMD5:md5Str];\n        image = [self resizeImage:image forSize:CGSizeMake(60, 60)];\n        imageData = [image TIFFRepresentation];\n    }\n    NSString *imageName = [NSString stringWithFormat:@\"temp_paste_image_%@.%@\", md5Str, imageType];\n    NSString *tempImageFilePath = [NSTemporaryDirectory() stringByAppendingString:imageName];\n    NSURL *imageUrl = [NSURL fileURLWithPath:tempImageFilePath];\n    [imageData writeToURL:imageUrl atomically:YES];\n    \n    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];\n    [pasteboard clearContents];\n    [pasteboard declareTypes:@[NSFilenamesPboardType] owner:nil];\n    [pasteboard writeObjects:@[imageUrl]];\n}\n\n- (NSImage *)resizeImage:(NSImage *)sourceImage forSize:(NSSize)size {\n    NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height);\n    NSSize imageSize = sourceImage.size;\n    if (imageSize.height * 0.5 < size.height && imageSize.width * 0.5 < size.width) {\n        targetFrame = NSMakeRect(0, 0, imageSize.width * 0.5, imageSize.height * 0.5);\n    } else {\n        if (imageSize.height > imageSize.width) {\n            targetFrame = NSMakeRect(0, 0, imageSize.width / imageSize.height * size.width, size.height);\n        } else {\n            targetFrame = NSMakeRect(0, 0, size.width, size.height * imageSize.height / imageSize.width);\n        }\n    }\n    NSImageRep *sourceImageRep = [sourceImage bestRepresentationForRect:targetFrame context:nil hints:nil];\n    NSImage *targetImage = [[NSImage alloc] initWithSize:targetFrame.size];\n    \n    [targetImage lockFocus];\n    [sourceImageRep drawInRect: targetFrame];\n    [targetImage unlockFocus];\n    \n    return targetImage;\n}\n\n- (void)exportEmoticonWithMd5:(NSString *)md5Str window:(NSWindow *)window {\n    if (!md5Str || !window) {\n        return;\n    }\n    \n    EmoticonMgr *emoticonMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"EmoticonMgr\")];\n    NSData *imageData = [emoticonMgr getEmotionDataWithMD5:md5Str];\n    if (!imageData) return;\n    \n    NSSavePanel *savePanel = ({\n        NSSavePanel *panel = [NSSavePanel savePanel];\n        [panel setDirectoryURL:[NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@\"Pictures\"]]];\n        [panel setNameFieldStringValue:md5Str];\n        [panel setAllowedFileTypes:@[[TKUtility getTypeForImageData:imageData]]];\n        [panel setAllowsOtherFileTypes:YES];\n        [panel setExtensionHidden:NO];\n        [panel setCanCreateDirectories:YES];\n        \n        panel;\n    });\n\n    [savePanel beginSheetModalForWindow:window completionHandler:^(NSInteger result) {\n        if (result == NSModalResponseOK) {\n            [imageData writeToFile:[[savePanel URL] path] atomically:YES];\n        }\n    }];\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKHTTPManager.h",
    "content": "//\n//  TKHTTPManager.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/17.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface TKHTTPManager : NSObject\n\n+ (instancetype)shareManager;\n\n- (void)downloadWithUrlString:(NSString *)urlString\n               toDirectoryPah:(NSString *)directory\n                     progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgressBlock\n            completionHandler:(nullable void (^)(NSString * filePath, NSError * _Nullable error))completionHandler;\n\n- (void)cancelDownload;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKHTTPManager.m",
    "content": "//\n//  TKHTTPManager.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/17.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"TKHTTPManager.h\"\n#import \"TKRemoteControlManager.h\"\n\n@interface TKHTTPManager ()\n\n@property (nonatomic, strong) AFHTTPSessionManager *session;\n@property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask;\n@property (nonatomic, strong)  AFURLSessionManager *sessionManager;\n@property (nonatomic, copy) NSString *zipPath;\n\n@end\n\n@implementation TKHTTPManager\n\n- (instancetype) init\n{\n    self = [super init];\n    if (self) {\n        self.session = ({\n            AFHTTPSessionManager *session = [objc_getClass(\"AFHTTPSessionManager\") manager];\n            session.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringCacheData;\n            \n            session;\n        });\n    }\n    return self;\n}\n\n+ (instancetype)shareManager {\n    static TKHTTPManager *manager = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        manager = [[TKHTTPManager alloc] init];\n    });\n    return manager;\n}\n\n- (void)downloadWithUrlString:(NSString *)urlString\n               toDirectoryPah:(NSString *)directory\n                     progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgressBlock\n            completionHandler:(nullable void (^)(NSString * filePath, NSError * _Nullable error))completionHandler {\n    \n    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];\n    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];\n    self.sessionManager = [[objc_getClass(\"AFURLSessionManager\") alloc] initWithSessionConfiguration:configuration];\n\n    self.downloadTask = [self.sessionManager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {\n        if (downloadProgressBlock) downloadProgressBlock(downloadProgress);\n        \n    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {\n        NSString *path = [directory stringByAppendingPathComponent:response.suggestedFilename];\n        return [NSURL fileURLWithPath:path];\n    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable urlPath, NSError * _Nullable error) {\n        NSString *filePath = [[urlPath absoluteString] substringFromIndex:7];\n        if (completionHandler) completionHandler(filePath, error);\n    }];\n    [self.downloadTask resume];\n}\n\n- (void)cancelDownload {\n    if (!self.downloadTask) return;\n    [self.downloadTask cancel];\n    self.downloadTask = nil;\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKMessageManager.h",
    "content": "//\n//  TKMessageManager.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/23.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface TKMessageManager : NSObject\n\n+ (instancetype)shareManager;\n\n- (void)sendTextMessageToSelf:(id)msgContent;\n- (void)sendTextMessage:(id)msgContent toUsrName:(id)toUser delay:(NSInteger)delayTime;\n- (void)clearUnRead:(id)arg1;\n- (NSString *)getMessageContentWithData:(MessageData *)msgData;\n- (NSArray *)getMsgListWithChatName:(id)arg1 minMesLocalId:(unsigned int)arg2 limitCnt:(NSInteger)arg3;\n- (void)playVoiceWithMessageData:(MessageData *)msgData;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKMessageManager.m",
    "content": "//\n//  TKMessageManager.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/23.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"TKMessageManager.h\"\n\n@implementation TKMessageManager\n\n+ (instancetype)shareManager {\n    static id manager = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        manager = [[self alloc] init];\n    });\n    return manager;\n}\n\n- (void)sendTextMessageToSelf:(id)msgContent {\n    NSString *currentUserName = [objc_getClass(\"CUtility\") GetCurrentUserName];\n    [self sendTextMessage:msgContent toUsrName:currentUserName delay:0];\n}\n\n- (void)sendTextMessage:(id)msgContent toUsrName:(id)toUser delay:(NSInteger)delayTime {\n    FFProcessReqsvrZZ *service = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"FFProcessReqsvrZZ\")];\n    NSString *currentUserName = [objc_getClass(\"CUtility\") GetCurrentUserName];\n    \n    if (delayTime == 0) {\n        [service FFProcessTReqZZ:currentUserName toUsrName:toUser msgText:msgContent atUserList:nil];\n        return;\n    }\n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n        dispatch_async(dispatch_get_main_queue(), ^{\n            [service FFProcessTReqZZ:currentUserName toUsrName:toUser msgText:msgContent atUserList:nil];\n        });\n    });\n}\n\n- (void)clearUnRead:(id)arg1 {\n    FFProcessReqsvrZZ *service = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"FFProcessReqsvrZZ\")];\n    if ([service respondsToSelector:@selector(ClearUnRead:FromCreateTime:ToCreateTime:)]) {\n        [service ClearUnRead:arg1 FromCreateTime:0 ToCreateTime:0];\n    } else if ([service respondsToSelector:@selector(ClearUnRead:FromID:ToID:)]) {\n        [service ClearUnRead:arg1 FromID:0 ToID:0];\n    }\n}\n\n- (NSString *)getMessageContentWithData:(MessageData *)msgData {\n    if (!msgData) return @\"\";\n    \n    NSString *msgContent = [msgData summaryString:NO] ?: @\"\";\n    if (msgData.m_nsTitle && (msgData.isAppBrandMsg || [msgContent isEqualToString:WXLocalizedString(@\"Message_type_unsupport\")])){\n        NSString *content = msgData.m_nsTitle ?:@\"\";\n        if (msgContent) {\n            if (msgData.m_nsSourceDisplayname.length > 0) {\n                msgContent = [msgContent stringByAppendingFormat:@\"%@：\", msgData.m_nsSourceDisplayname];\n            } else if (msgData.m_nsAppName.length > 0) {\n                msgContent = [msgContent stringByAppendingFormat:@\"%@：\", msgData.m_nsAppName];\n            }\n            msgContent = [msgContent stringByAppendingString:content];\n        }\n    }\n    \n    if ([msgData respondsToSelector:@selector(isChatRoomMessage)] && msgData.isChatRoomMessage && msgData.groupChatSenderDisplayName) {\n         if (msgData.groupChatSenderDisplayName.length > 0 && msgContent) {\n            msgContent = [NSString stringWithFormat:@\"%@：%@\",msgData.groupChatSenderDisplayName, msgContent];\n        }\n    }\n    \n    if (msgData.messageType == 49) {\n        if (msgData.m_oWCPayInfoItem.m_nsFeeDesc.length > 0) {\n            msgContent = [msgContent stringByAppendingFormat:@\" [金额：%@元]\",msgData.m_oWCPayInfoItem.m_nsFeeDesc];\n        }\n    }\n    return msgContent;\n}\n\n- (NSArray <MessageData *> *)getMsgListWithChatName:(id)arg1 minMesLocalId:(unsigned int)arg2 limitCnt:(NSInteger)arg3 {\n    FFProcessReqsvrZZ *service = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"FFProcessReqsvrZZ\")];\n    char hasMore = '1';\n    NSArray *array = @[];\n    if ([service respondsToSelector:@selector(GetMsgListWithChatName:fromCreateTime:localId:limitCnt:hasMore:sortAscend:)]) {\n        array = [service GetMsgListWithChatName:arg1 fromCreateTime:arg2 localId:arg2 limitCnt:arg3 hasMore:&hasMore sortAscend:YES];\n    }\n\n    return [[array reverseObjectEnumerator] allObjects];\n}\n\n- (void)playVoiceWithMessageData:(MessageData *)msgData {\n    if (!msgData.isVoiceMsg) return;\n    \n    if (msgData.IsUnPlayed) {\n        msgData.msgStatus = 4;\n        MultiPlatformStatusSyncMgr *syncMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter]\n                                               getService:objc_getClass(\"MultiPlatformStatusSyncMgr\")];\n        if ([syncMgr respondsToSelector:@selector(markVoiceMessageAsRead:)]) {\n            [syncMgr markVoiceMessageAsRead:msgData];\n        }\n    }\n    MMVoiceMessagePlayer *voicePlayer = [objc_getClass(\"MMVoiceMessagePlayer\") defaultPlayer];\n    \n    if (msgData.IsPlayingSound) {\n        [msgData SetPlayingSoundStatus:NO];\n        [voicePlayer stop];\n    } else {\n        [msgData SetPlayed];\n        MessageData *refMsgData = [msgData m_refMessageData];\n        [refMsgData setM_uiDownloadStatus:refMsgData.m_uiDownloadStatus|0x4];\n        [msgData SetPlayingSoundStatus:1];\n        if ([voicePlayer respondsToSelector:@selector(playWithVoiceMessage:isUnplayedBeforePlay:)]) {\n            [voicePlayer playWithVoiceMessage:msgData isUnplayedBeforePlay:msgData.IsUnPlayed];\n        } else if ([voicePlayer respondsToSelector:@selector(playVoiceWithMessage:isUnplayedBeforePlay:)]) {\n            [voicePlayer playVoiceWithMessage:msgData isUnplayedBeforePlay:msgData.IsUnPlayed];\n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKRemoteControlCommands.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>open /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app || open /System/Library/CoreServices/ScreenSaverEngine.app </string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>ScreenSave</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.ScreenSave</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>/System/Library/CoreServices/Menu\\ Extras/User.menu/Contents/Resources/CGSession -suspend</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>LockScreen</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.LockScreen</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>sleep</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Sleep</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Sleep</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>shutdown</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Shutdown</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Shutdown</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>restart</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Restart</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Restart</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>empty</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>EmptyTrash</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.EmptyTrash</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>mute</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Mute</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Mute</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killQQ</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillQQ</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillQQ</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killWeChat</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>killWeChat</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillWeChat</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killChrome</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillChrome</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillChrome</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killSafari</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillSafari</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillSafari</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killFirefox</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>killFirefox</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillFirefox</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>killAll</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>KillAll</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.KillAll</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicToggle</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Toggle</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Toggle</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicNext</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Next</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Next</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicPrevious</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>Previous</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.Previous</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicVolumeUp</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>VolumeUp</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.VolumeUp</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicVolumeDown</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>VolumeDown</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.VolumeDown</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>musicLike</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>LikeChange</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.LikeChange</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>2</integer>\n\t\t</dict>\n\t</array>\n\t<array>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>getDirectiveList</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>getDirective</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.GetList</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>PreventRevokeSwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>PreventRevokeSwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.PreventRevokeSwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>AutoReplySwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>AutoReplySwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.AutoReplySwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>executeCommand</key>\n\t\t\t<string>AutoAuthSwitch</string>\n\t\t\t<key>keyword</key>\n\t\t\t<string>AutoAuthSwitch</string>\n\t\t\t<key>function</key>\n\t\t\t<string>Assistant.Directive.AutoAuthSwitch</string>\n\t\t\t<key>enable</key>\n\t\t\t<true/>\n\t\t\t<key>type</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t</array>\n</array>\n</plist>\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKRemoteControlManager.h",
    "content": "//\n//  TKRemoteControlManager.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/24.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface TKRemoteControlManager : NSObject\n\n+ (void)executeRemoteControlCommandWithVoiceMsg:(NSString *)msg;\n+ (void)executeRemoteControlCommandWithMsg:(NSString *)msg;\n+ (NSString *)executeShellCommand:(NSString *)msg;\n+ (NSString *)executeAppleScriptCommand:(NSString *)cmd;\n+ (NSString *)remoteControlCommandsString;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKRemoteControlManager.m",
    "content": "//\n//  TKRemoteControlManager.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/24.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"TKRemoteControlManager.h\"\n#import \"TKWeChatPluginConfig.h\"\n#import \"TKRemoteControlModel.h\"\n#import \"TKMessageManager.h\"\n\ntypedef NS_ENUM(NSUInteger, MessageDataType) {\n    MessageDataTypeText,\n    MessageDataTypeVoice\n};\n\n//      执行 AppleScript\nstatic NSString * const kRemoteControlAppleScript = @\"osascript /Applications/WeChat.app/Contents/MacOS/WeChatPlugin.framework/Resources/TKRemoteControlScript.scpt\";\n\n@implementation TKRemoteControlManager\n\n+ (void)executeRemoteControlCommandWithVoiceMsg:(NSString *)msg {\n    NSString *currentUserName = [objc_getClass(\"CUtility\") GetCurrentUserName];\n    NSString *callBack = [NSString stringWithFormat:@\"%@\\n\\n\\n%@\", TKLocalizedString(@\"assistant.remoteControl.voiceRecall\"), msg];\n    FFProcessReqsvrZZ *service = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"FFProcessReqsvrZZ\")];\n    [service FFProcessTReqZZ:currentUserName toUsrName:currentUserName msgText:callBack atUserList:nil];\n    \n    [self executeRemoteControlCommandWithMsg:msg msgType:MessageDataTypeVoice];\n}\n\n+ (void)executeRemoteControlCommandWithMsg:(NSString *)msg {\n    [self executeRemoteControlCommandWithMsg:msg msgType:MessageDataTypeText];\n}\n\n+ (void)executeRemoteControlCommandWithMsg:(NSString *)msg msgType:(MessageDataType)type {\n    NSArray *remoteControlModels = [TKWeChatPluginConfig sharedConfig].remoteControlModels;\n    [remoteControlModels enumerateObjectsUsingBlock:^(NSArray *subModels, NSUInteger index, BOOL * _Nonnull stop) {\n        [subModels enumerateObjectsUsingBlock:^(TKRemoteControlModel *model, NSUInteger idx, BOOL * _Nonnull subStop) {\n            if ([self shouldExecuteRemoteControlWithModel:model msg:msg msgType:type]) {\n                switch (model.type) {\n                    case TKRemoteControlTypeShell: {\n                        //      屏幕保护 & 锁屏 通过 Shell 命令来执行即可\n                        [self executeShellCommand:model.executeCommand];\n                        break;\n                    }\n                    case TKRemoteControlTypeScript: {\n                        NSString *errorMsg = [self executeAppleScriptCommand:model.executeCommand];\n                        if ([errorMsg containsString:@\"TKRemoteControlScript.scpt:\"]) {\n                            NSString *result = [errorMsg substringFromString:@\"TKRemoteControlScript.scpt:\"];\n                            [[TKMessageManager shareManager] sendTextMessageToSelf:result];\n                        }\n                        //      bug: 有些程序在第一次时会无法关闭，需要再次关闭\n                        if ([model.function isEqualToString:@\"Assistant.Directive.KillAll\"]) {\n                            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n                                [self executeAppleScriptCommand:model.executeCommand];\n                            });\n                        }\n                        break;\n                    }\n                    case TKRemoteControlTypePlugin: {\n                        [self executePluginCommand:model.executeCommand];\n                        break;\n                    }\n                    default:\n                        break;\n                }\n                \n                if (model.type != TKRemoteControlTypePlugin) {\n                    NSString *callBack = [NSString stringWithFormat:@\"%@%@\", TKLocalizedString(@\"assistant.remoteControl.recall\"), TKLocalizedString(model.function)];\n                    [[TKMessageManager shareManager] sendTextMessageToSelf:callBack];\n                    [[TKMessageManager shareManager] clearUnRead:[objc_getClass(\"CUtility\") GetCurrentUserName]];\n                }\n                *stop = YES;\n                *subStop = YES;\n            }\n        }];\n    }];\n}\n\n+ (BOOL)shouldExecuteRemoteControlWithModel:(TKRemoteControlModel *)model msg:(NSString *)msg msgType:(MessageDataType)type {\n    if (model.enable && ![model.keyword isEqualToString:@\"\"]) {\n        if ((type == MessageDataTypeText && [msg isEqualToString:model.keyword]) || (type == MessageDataTypeVoice && ([msg containsString:model.keyword] || [msg containsString:TKLocalizedString(model.function)]))) {\n            return YES;\n        } else {\n            return NO;\n        }\n    } else {\n        return NO;\n    }\n}\n\n+ (NSString *)executeAppleScriptCommand:(NSString *)cmd {\n    NSString *command = [NSString stringWithFormat:@\"%@ %@\",kRemoteControlAppleScript, cmd];\n    return [self executeShellCommand:command];\n}\n\n/**\n 通过 NSTask 执行 Shell 命令\n \n @param cmd Terminal命令\n */\n+ (NSString *)executeShellCommand:(NSString *)cmd {\n    NSTask *task = [[NSTask alloc] init];\n    [task setLaunchPath:@\"/bin/bash\"];\n    [task setArguments:@[@\"-c\", cmd]];\n    // 新建输出管道作为Task的错误输出\n    NSPipe *errorPipe = [NSPipe pipe];\n    [task setStandardError:errorPipe];\n    NSFileHandle *file = [errorPipe fileHandleForReading];\n    // 获取运行结果\n    [task launch];\n    NSData *data = [file readDataToEndOfFile];\n    \n    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n}\n\n+ (void)executePluginCommand:(NSString *)cmd {\n    NSString *callBack = @\"\";\n    TKWeChatPluginConfig *config = [TKWeChatPluginConfig sharedConfig];\n    if ([cmd isEqualToString:@\"getDirectiveList\"]) {\n        callBack = [TKRemoteControlManager remoteControlCommandsString];\n    } else if ([cmd isEqualToString:@\"AutoReplySwitch\"]) {\n        NSString *status = config.autoReplyEnable ? TKLocalizedString(@\"Assistant.Directive.SwitchOff\") : TKLocalizedString(@\"Assistant.Directive.SwitchOn\");\n        callBack = [NSString stringWithFormat:@\"%@-%@\",TKLocalizedString(@\"Assistant.Directive.AutoReplySwitch\"),status];\n        [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFY_AUTO_REPLY_CHANGE object:nil];\n    } else if ([cmd isEqualToString:@\"PreventRevokeSwitch\"]) {\n        NSString *status = config.preventRevokeEnable ? TKLocalizedString(@\"Assistant.Directive.SwitchOff\") : TKLocalizedString(@\"Assistant.Directive.SwitchOn\");\n        callBack = [NSString stringWithFormat:@\"%@-%@\",TKLocalizedString(@\"Assistant.Directive.PreventRevokeSwitch\"),status];\n        [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFY_PREVENT_REVOKE_CHANGE object:nil];\n    } else if ([cmd isEqualToString:@\"AutoAuthSwitch\"]) {\n        NSString *status = config.autoAuthEnable ? TKLocalizedString(@\"Assistant.Directive.SwitchOff\") : TKLocalizedString(@\"Assistant.Directive.SwitchOn\");\n        callBack = [NSString stringWithFormat:@\"%@-%@\",TKLocalizedString(@\"Assistant.Directive.AutoAuthSwitch\"),status];\n        [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFY_AUTO_AUTH_CHANGE object:nil];\n    }\n    \n    [[TKMessageManager shareManager] sendTextMessageToSelf:callBack];\n}\n\n+ (NSString *)remoteControlCommandsString {\n    NSMutableString *replyContent = [NSMutableString stringWithString:TKLocalizedString(@\"assistant.remoteControl.listTip\")];\n    \n    NSArray *remoteControlModels = [TKWeChatPluginConfig sharedConfig].remoteControlModels;\n    [remoteControlModels enumerateObjectsUsingBlock:^(NSArray *subModels, NSUInteger index, BOOL * _Nonnull stop) {\n        switch (index) {\n            case 0:\n                [replyContent appendFormat:@\"%@\\n\",TKLocalizedString(@\"assistant.remoteControl.mac\")];\n                break;\n            case 1:\n                [replyContent appendFormat:@\"%@\\n\",TKLocalizedString(@\"assistant.remoteControl.app\")];\n                break;\n            case 2:\n                [replyContent appendFormat:@\"%@\\n\",TKLocalizedString(@\"assistant.remoteControl.neteaseMusic\")];\n                break;\n            case 3:\n                [replyContent appendFormat:@\"%@\\n\",TKLocalizedString(@\"assistant.remoteControl.assistant\")];\n                break;\n            default:\n                break;\n        }\n        [subModels enumerateObjectsUsingBlock:^(TKRemoteControlModel *model, NSUInteger idx, BOOL * _Nonnull stop) {\n            [replyContent appendFormat:@\"%@-%@-%@\\n\", TKLocalizedString(model.function), model.keyword, model.enable ? TKLocalizedString(@\"assistant.remoteControl.open\") : TKLocalizedString(@\"assistant.remoteControl.close\")];\n        }];\n        [replyContent appendString:@\"\\n\"];\n    }];\n    return replyContent;\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKVersionManager.h",
    "content": "//\n//  TKVersionManager.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/2/24.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\ntypedef NS_ENUM(NSUInteger, TKVersionStatus) {\n    TKVersionStatusOld,\n    TKVersionStatusNew,\n};\n\n@interface TKVersionManager : NSObject\n\n+ (instancetype)shareManager;\n- (void)checkVersionFinish:(void (^)(TKVersionStatus, NSString *))finish;\n- (void)downloadPluginProgress:(void (^)(NSProgress *downloadProgress))downloadProgressBlock completionHandler:(void (^)(NSString *filePath, NSError * _Nullable error))completionHandler;\n- (void)cancelDownload;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKVersionManager.m",
    "content": "//\n//  TKVersionManager.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/2/24.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"TKVersionManager.h\"\n#import \"TKWeChatPluginConfig.h\"\n#import \"TKHTTPManager.h\"\n#import \"TKRemoteControlManager.h\"\n\n@implementation TKVersionManager\n\n+ (instancetype)shareManager {\n    static TKVersionManager *manager = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        manager = [[TKVersionManager alloc] init];\n    });\n    return manager;\n}\n\n- (void)checkVersionFinish:(void (^)(TKVersionStatus, NSString *))finish {\n    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n        NSDictionary *localInfo = [[TKWeChatPluginConfig sharedConfig] localInfoPlist];\n        NSDictionary *romoteInfo = [[TKWeChatPluginConfig sharedConfig] romoteInfoPlist];\n        NSString *localBundle = localInfo[@\"CFBundleShortVersionString\"];\n        NSString *romoteBundle = romoteInfo[@\"CFBundleShortVersionString\"];\n        \n        dispatch_async(dispatch_get_main_queue(), ^{\n            if ([localBundle isEqualToString:romoteBundle]) {\n                NSString *versionMsg = [localInfo[@\"versionInfo\"] stringByReplacingOccurrencesOfString:@\"\\\\n\" withString:@\"\\n\"];\n                finish(TKVersionStatusOld, versionMsg);\n            } else if (romoteInfo[@\"versionInfo\"]) {\n                if (![romoteInfo[@\"showUpdateWindow\"] boolValue]) return;\n                NSString *versionMsg = [romoteInfo[@\"versionInfo\"] stringByReplacingOccurrencesOfString:@\"\\\\n\" withString:@\"\\n\"];\n                finish(TKVersionStatusNew, versionMsg);\n            }\n        });\n    });\n}\n\n- (void)downloadPluginProgress:(void (^)(NSProgress *downloadProgress))downloadProgressBlock completionHandler:(void (^)(NSString *filePath, NSError * _Nullable error))completionHandler {\n    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];\n    \n    NSString *pluginName = @\"WeChatPlugin-MacOS-master\";\n    NSString *pluginPath = [NSString stringWithFormat:@\"%@/%@\",cachesPath,pluginName];\n    NSString *pluginZipPath = [NSString stringWithFormat:@\"%@.zip\",pluginPath];\n    \n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    [fileManager removeItemAtPath:pluginPath error:nil];\n    [fileManager removeItemAtPath:pluginZipPath error:nil];\n    \n    NSString *urlString = @\"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/archive/master.zip\";\n    [[TKHTTPManager shareManager] downloadWithUrlString:urlString toDirectoryPah:cachesPath progress:^(NSProgress *downloadProgress) {\n        if (downloadProgressBlock) downloadProgressBlock(downloadProgress);\n    } completionHandler:^(NSString *filePath, NSError * _Nullable error) {\n        if (completionHandler) completionHandler(filePath,error);\n    }];\n}\n\n- (void)cancelDownload {\n    [[TKHTTPManager shareManager] cancelDownload];\n}\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKWebServerManager.h",
    "content": "//\n//  TKWebServerManager.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/3/18.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface TKWebServerManager : NSObject\n\n+ (instancetype)shareManager;\n\n- (void)startServer;\n- (void)endServer;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Managers/TKWebServerManager.m",
    "content": "//\n//  TKWebServerManager.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/3/18.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"TKWebServerManager.h\"\n#import \"WeChatPlugin.h\"\n#import <GCDWebServer.h>\n#import <GCDWebServerDataResponse.h>\n#import <GCDWebServerURLEncodedFormRequest.h>\n#import \"TKMessageManager.h\"\n#import \"TKCacheManager.h\"\n\n@interface TKWebServerManager ()\n\n@property (nonatomic, strong) GCDWebServer *webServer;\n@property (nonatomic, strong) MMContactSearchLogic *searchLogic;\n@property (nonatomic, strong) dispatch_semaphore_t semaphore;\n@end\n\n@implementation TKWebServerManager\n\nstatic int port=57270;\n\n+ (instancetype)shareManager {\n    static TKWebServerManager *manager = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        manager = [[TKWebServerManager alloc] init];\n    });\n    return manager;\n}\n\n- (instancetype)init {\n    self = [super init];\n    if (self) {\n        self.searchLogic = [[objc_getClass(\"MMContactSearchLogic\") alloc] init];\n        self.semaphore = dispatch_semaphore_create(0);\n    }\n    return self;\n}\n\n- (void)startServer {\n    if (self.webServer) {\n        return;\n    }\n    NSDictionary *options = @{GCDWebServerOption_Port: [NSNumber numberWithInt:port],\n                              GCDWebServerOption_BindToLocalhost: @YES,\n                              GCDWebServerOption_ConnectedStateCoalescingInterval: @2,\n                              };\n    \n    self.webServer = [[GCDWebServer alloc] init];\n    [self addHandleForSearchUser];\n    [self addHandleForOpenSession];\n    [self addHandleForSendMsg];\n    [self addHandleForSearchUserChatLog];\n    [self.webServer startWithOptions:options error:nil];\n}\n\n- (void)endServer {\n    if( [self.webServer isRunning] ) {\n        [self.webServer stop];\n        [self.webServer removeAllHandlers];\n        self.webServer = nil;\n    }\n}\n\n- (void)addHandleForSearchUser {\n    __weak typeof(self) weakSelf = self;\n    \n    [self.webServer addHandlerForMethod:@\"GET\" path:@\"/wechat-plugin/user\" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse * _Nullable(__kindof GCDWebServerRequest * _Nonnull request) {\n\n        if (![weakSelf isLocalhost:request.headers[@\"Host\"]]) {\n             return [GCDWebServerResponse responseWithStatusCode:404];\n        }\n        \n        NSString *keyword = request.query ? request.query[@\"keyword\"] ? request.query[@\"keyword\"] : @\"\" : @\"\";\n        __block NSMutableArray *sessionList = [NSMutableArray array];\n        \n        //        返回最近聊天列表\n        if ([keyword isEqualToString:@\"\"]) {\n            MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n            NSMutableArray <MMSessionInfo *> *arrSession = [sessionMgr getAllSessions];\n            [arrSession enumerateObjectsUsingBlock:^(MMSessionInfo * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {\n                if ([obj.m_packedInfo.m_contact.m_nsUsrName isEqualToString:@\"brandsessionholder\"]) {\n                    return ;\n                }\n                if (obj.isInGroupBox) {\n                    return;\n                }\n                [sessionList addObject:[weakSelf dictFromSessionInfo:obj]];\n            }];\n            return [GCDWebServerDataResponse responseWithJSONObject:sessionList];\n        }\n        \n        __block NSInteger count = 2;\n        MMContactSearchLogic *logic = weakSelf.searchLogic;\n        [logic doSearchWithKeyword:keyword searchScene:31 resultIsShownBlock:nil completion:^ {\n            if ([logic respondsToSelector:@selector(reloadSearchResultDataWithKeyword:resultContainer:completionBlock:)]) {\n                [logic reloadSearchResultDataWithKeyword:keyword resultContainer:nil completionBlock:^ {\n                    NSLog(@\"TKKK ---- %d\", logic.searchResultContainer.logicSearchResultFlag);\n                    if (logic.searchResultContainer.logicSearchResultFlag == 55) {\n                        count -= 1;\n                        if (count <= 0) {\n                            dispatch_semaphore_signal(weakSelf.semaphore);\n                        }\n                    }\n                }];\n            }\n        }];\n        dispatch_semaphore_wait(weakSelf.semaphore, DISPATCH_TIME_FOREVER);\n        \n        MMChatMangerSearchReportMgr *reportMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMChatMangerSearchReportMgr\")];\n        \n        [reportMgr.contactSearchResults enumerateObjectsUsingBlock:^(id contact, NSUInteger idx, BOOL * _Nonnull stop) {\n            if ([contact isKindOfClass:objc_getClass(\"MMComplexContactSearchResult\")]) {\n                [sessionList addObject:[weakSelf dictFromContactSearchResult:(MMComplexContactSearchResult *)contact]];\n            } else if([contact isKindOfClass:objc_getClass(\"MMComplexGroupContactSearchResult\")]) {\n                [sessionList addObject:[weakSelf dictFromGroupSearchResult:(MMComplexGroupContactSearchResult *)contact]];\n            }\n        }];\n        [reportMgr.groupContactSearchResults enumerateObjectsUsingBlock:^(MMComplexGroupContactSearchResult *group, NSUInteger idx, BOOL * _Nonnull stop) {\n            [sessionList addObject:[weakSelf dictFromGroupSearchResult:group]];\n        }];\n        [reportMgr.brandContactSearchResults enumerateObjectsUsingBlock:^(MMComplexContactSearchResult *contact, NSUInteger idx, BOOL * _Nonnull stop) {\n            [sessionList addObject:[weakSelf dictFromContactSearchResult:contact]];\n        }];\n        \n        if ([logic respondsToSelector:@selector(clearAllResults)]) {\n            [logic clearAllResults];\n        } else if ([logic respondsToSelector:@selector(clearDataWhenSearchEnd)]) {\n            [logic clearDataWhenSearchEnd];\n        }\n\n        return [GCDWebServerDataResponse responseWithJSONObject:sessionList];\n        \n    }];\n}\n\n- (void)addHandleForSearchUserChatLog {\n    __weak typeof(self) weakSelf = self;\n    [self.webServer addHandlerForMethod:@\"GET\" path:@\"/wechat-plugin/chatlog\" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse * _Nullable(__kindof GCDWebServerRequest * _Nonnull request) {\n\n        if (![weakSelf isLocalhost:request.headers[@\"Host\"]]) {\n            return [GCDWebServerResponse responseWithStatusCode:404];\n        }\n        \n        NSString *userId = request.query ? request.query[@\"userId\"] ? request.query[@\"userId\"] : nil : nil;\n        NSInteger count = request.query ? request.query[@\"count\"] ? [request.query[@\"count\"] integerValue] : 30 : 30;\n        \n        if (userId) {\n            NSMutableArray *chatLogList = [NSMutableArray array];\n            \n            NSArray *msgDataList = [[TKMessageManager shareManager] getMsgListWithChatName:userId minMesLocalId:0 limitCnt:count];\n            [msgDataList enumerateObjectsUsingBlock:^(MessageData * _Nonnull msgData, NSUInteger idx, BOOL * _Nonnull stop) {\n                [chatLogList addObject:[weakSelf dictFromMessageData:msgData]];\n            }];\n            \n            MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n            WCContactData *toUserContact = [sessionMgr getSessionContact:userId];\n            NSString *wechatId = [toUserContact getContactDisplayUsrName];\n            NSString *title = [weakSelf getUserNameWithContactData:toUserContact showOriginName:YES];\n            NSString *imgPath = [[TKCacheManager shareManager] cacheAvatarWithContact:toUserContact];\n            NSDictionary *toUserContactDict = @{@\"title\": [NSString stringWithFormat:@\"To: %@\", title],\n                                                @\"subTitle\": chatLogList.count > 0 ? TKLocalizedString(@\"assistant.search.chatlog\") : @\"\",\n                                                @\"icon\": imgPath ?: @\"\",\n                                                @\"userId\": userId,\n                                                @\"url\": @\"\",\n                                                @\"copyText\": wechatId ?: @\"\",\n                                                @\"srvId\": @(0)\n                                                };\n            [chatLogList insertObject:toUserContactDict atIndex:0];\n            \n            return [GCDWebServerDataResponse responseWithJSONObject:chatLogList];\n        }\n        \n        return [GCDWebServerResponse responseWithStatusCode:404];\n    }];\n}\n\n- (void)addHandleForOpenSession {\n    __weak typeof(self) weakSelf = self;\n    \n    [self.webServer addHandlerForMethod:@\"POST\" path:@\"/wechat-plugin/open-session\" requestClass:[GCDWebServerURLEncodedFormRequest class] processBlock:^GCDWebServerResponse * _Nullable(__kindof GCDWebServerURLEncodedFormRequest * _Nonnull request) {\n\n        if (![weakSelf isLocalhost:request.headers[@\"Host\"]]) {\n            return [GCDWebServerResponse responseWithStatusCode:404];\n        }\n        \n        NSDictionary *requestBody = [request arguments];\n        \n        if (requestBody && requestBody[@\"userId\"]) {\n            dispatch_async(dispatch_get_main_queue(), ^{\n                NSString *userId = requestBody[@\"userId\"];\n                NSInteger srvId = [requestBody[@\"srvId\"] integerValue];\n                MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n                WCContactData *selectContact = [sessionMgr getSessionContact:userId];\n                \n                WeChat *wechat = [objc_getClass(\"WeChat\") sharedInstance];\n                if ([selectContact isBrandContact]) {\n                    WCContactData *brandsessionholder  = [sessionMgr getSessionContact:@\"brandsessionholder\"];\n                    if (brandsessionholder) {\n                        [wechat startANewChatWithContact:brandsessionholder];\n                        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n                            MMBrandChatsViewController *brandChats = wechat.chatsViewController.brandChatsViewController;\n                            [brandChats startChatWithContact:selectContact];\n                        });\n                    }\n                } else {\n                    [wechat startANewChatWithContact:selectContact];\n                    if (srvId > 0) {\n                        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n                            FFProcessReqsvrZZ *msgService = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"FFProcessReqsvrZZ\")];\n                            MessageData *msgData = [msgService GetMsgData:userId svrId:srvId];\n                            if (msgData) {\n                                MMChatMessageViewController *vc = wechat.chatsViewController.chatDetailSplitViewController.chatMessageViewController;\n                                [vc scrollToMessage:msgData];\n                            }\n                            \n                        });\n                    }\n                }\n                [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];\n            });\n            return [GCDWebServerResponse responseWithStatusCode:200];\n        }\n        \n        return [GCDWebServerResponse responseWithStatusCode:404];\n    }];\n}\n\n- (void)addHandleForSendMsg {\n    __weak typeof(self) weakSelf = self;\n    \n    [self.webServer addHandlerForMethod:@\"POST\" path:@\"/wechat-plugin/send-message\" requestClass:[GCDWebServerURLEncodedFormRequest class] processBlock:^GCDWebServerResponse * _Nullable(__kindof GCDWebServerURLEncodedFormRequest * _Nonnull request) {\n\n        if (![weakSelf isLocalhost:request.headers[@\"Host\"]]) {\n            return [GCDWebServerResponse responseWithStatusCode:404];\n        }\n\n        NSDictionary *requestBody = [request arguments];\n        NSString *userId = requestBody[@\"userId\"];\n        \n        if (requestBody && userId.length > 0) {\n            NSString *content = requestBody[@\"content\"];\n            \n            FFProcessReqsvrZZ *messageService = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"FFProcessReqsvrZZ\")];\n            dispatch_async(dispatch_get_main_queue(), ^{\n                if (content.length > 0) {\n                    NSString *currentUserName = [objc_getClass(\"CUtility\") GetCurrentUserName];\n                    [messageService FFProcessTReqZZ:currentUserName\n                                          toUsrName:requestBody[@\"userId\"]\n                                            msgText:requestBody[@\"content\"]\n                                         atUserList:nil];\n                    [[TKMessageManager shareManager] clearUnRead:requestBody[@\"userId\"]];\n                    \n                } else if (content.length == 0 && requestBody[@\"srvId\"]) {\n                    if (requestBody[@\"srvId\"]) {\n                        NSInteger srvId = [requestBody[@\"srvId\"] integerValue];\n                        if (srvId != 0) {\n                            MessageData *msgData = [messageService GetMsgData:userId svrId:srvId];\n                            [[TKMessageManager shareManager] playVoiceWithMessageData:msgData];\n                        }\n                    }\n                    [[TKMessageManager shareManager] clearUnRead:userId];\n                }\n            });\n            return [GCDWebServerResponse responseWithStatusCode:200];\n        }\n        \n        return [GCDWebServerResponse responseWithStatusCode:404];\n    }];\n}\n\n- (NSDictionary *)dictFromGroupSearchResult:(MMComplexGroupContactSearchResult *)result {\n    if (![result isKindOfClass:objc_getClass(\"MMComplexGroupContactSearchResult\")]) {\n        return [self dictWithErrorMsg:result.className];\n    }\n    WCContactData *groupContact = result.groupContact;\n    if (!groupContact) {\n        return [self dictWithErrorMsg:@\"搜索群组有误\"];\n    }\n    NSMutableArray *subTitleArray = [NSMutableArray array];\n    if (result.searchType == 2) {\n        [result.groupMembersResult.membersSearchReults enumerateObjectsUsingBlock:^(MMComplexContactSearchResult * _Nonnull contact, NSUInteger idx, BOOL * _Nonnull stop) {\n            NSString *matchStr =[self matchWithContactResult:contact];\n            NSString *contactName;\n            if(contact.contact.m_nsRemark && ![contact.contact.m_nsRemark isEqualToString:@\"\"]) {\n                contactName = contact.contact.m_nsRemark;\n                if (contact.fieldType != 1) {\n                    contactName = [NSString stringWithFormat:@\"%@(%@)\", contactName, matchStr];\n                }\n            } else {\n                contactName = contact.contact.m_nsNickName;\n                if (contact.fieldType != 3) {\n                    contactName = [NSString stringWithFormat:@\"%@(%@)\", contactName, matchStr];\n                }\n            }\n            [subTitleArray addObject:contactName];\n        }];\n    }\n    NSString *title = [NSString stringWithFormat:@\"%@%@\", TKLocalizedString(@\"assistant.search.group\"), groupContact.innerGetGroupDisplayName];\n    if ([groupContact isGroupChat]) {\n        title = [title stringByAppendingFormat:@\" (%@)\",@(groupContact.groupMemberCount)];\n    }\n    NSString *subTitle = @\"\";\n    if (subTitleArray.count > 0) {\n        subTitle = [NSString stringWithFormat:@\"%@%@\",TKLocalizedString(@\"assistant.search.member\"),[subTitleArray componentsJoinedByString:@\", \"]];\n    }\n    NSString *imgPath = [[TKCacheManager shareManager] cacheAvatarWithContact:groupContact];\n    NSString *wechatId = [groupContact getContactDisplayUsrName];\n    \n    return @{@\"title\": title,\n             @\"subTitle\": subTitle,\n             @\"icon\": imgPath,\n             @\"userId\": groupContact.m_nsUsrName,\n             @\"copyText\": wechatId ?: @\"\",\n             @\"url\": groupContact.m_nsHeadHDImgUrl ?: @\"\"\n             };\n}\n\n- (NSString *)matchWithContactResult:(MMComplexContactSearchResult *)result {\n    NSString *matchStr = @\"\";\n    NSInteger type = result.fieldType;\n    \n    switch (type) {     //     1：备注 3：昵称 4：微信号 7：市 8：省份 9：国家\n        case 1:\n            matchStr = WXLocalizedString(@\"Search.Remark\");\n            break;\n        case 3:\n            matchStr = WXLocalizedString(@\"Search.Nickname\");\n            break;\n        case 4:\n            matchStr = WXLocalizedString(@\"Search.Username\");\n            break;\n        case 7:\n            matchStr = WXLocalizedString(@\"Search.City\");\n            break;\n        case 8:\n            matchStr = WXLocalizedString(@\"Search.Province\");\n            break;\n        case 9:\n            matchStr = WXLocalizedString(@\"Search.Country\");\n            break;\n        default:\n            matchStr = WXLocalizedString(@\"Search.Include\");\n            break;\n    }\n    matchStr = [matchStr stringByAppendingString:result.fieldValue ?: @\"\"];\n    return matchStr;\n}\n\n- (NSDictionary *)dictFromContactSearchResult:(MMComplexContactSearchResult *)result {\n    if (![result isKindOfClass:objc_getClass(\"MMComplexContactSearchResult\")]) {\n        return [self dictWithErrorMsg:result.className];\n    }\n    WCContactData *contact = result.contact;\n    if (!contact) {\n        return [self dictWithErrorMsg:@\"搜索用户有误\"];\n    }\n    if (contact.m_nsNickName.length == 0) {\n        return [self dictWithErrorMsg:@\"用户：找不到 m_nsNickName\"];\n    }\n    NSString *title = [contact isBrandContact] ? [NSString stringWithFormat:@\"%@%@\",TKLocalizedString(@\"assistant.search.official\"), contact.m_nsNickName] : contact.m_nsNickName;\n    if(contact.m_nsRemark && ![contact.m_nsRemark isEqualToString:@\"\"]) {\n        title = [NSString stringWithFormat:@\"%@(%@)\",contact.m_nsRemark, contact.m_nsNickName];\n    }\n    \n    NSString *subTitle =[self matchWithContactResult:result];\n    NSString *imgPath = [[TKCacheManager shareManager] cacheAvatarWithContact:contact];\n    \n    NSString *wechatId = [contact getContactDisplayUsrName];\n    return @{@\"title\": title,\n             @\"subTitle\": subTitle,\n             @\"icon\": imgPath,\n             @\"userId\": contact.m_nsUsrName,\n             @\"copyText\": wechatId ?: @\"\",\n             @\"url\": contact.m_nsHeadHDImgUrl ?: @\"\"\n             };\n}\n\n- (NSDictionary *)dictFromSessionInfo:(MMSessionInfo *)sessionInfo {\n    if (!sessionInfo) return [self dictWithErrorMsg:@\"最近聊天列表有误\"];\n    \n    WCContactData *contact = sessionInfo.m_packedInfo.m_contact;\n    MessageData *msgData = sessionInfo.m_packedInfo.m_msgData;\n    \n    NSString *title = [self getUserNameWithContactData:contact showOriginName:YES];\n    if ([contact isGroupChat]) {\n        title = [title stringByAppendingFormat:@\" (%@)\",@(contact.groupMemberCount)];\n    }\n    NSString *msgContent = [[TKMessageManager shareManager] getMessageContentWithData:msgData];\n    NSString *imgPath = [[TKCacheManager shareManager] cacheAvatarWithContact:contact];\n    \n    NSString *wechatId = [contact getContactDisplayUsrName];\n    return @{@\"title\": title,\n             @\"subTitle\": msgContent,\n             @\"icon\": imgPath,\n             @\"userId\": contact.m_nsUsrName,\n             @\"copyText\": wechatId ?: @\"\",\n             @\"unReadCount\": @(sessionInfo.m_bShowUnReadAsRedDot ? 0 : sessionInfo.m_uUnReadCount),\n             @\"url\": contact.m_nsHeadHDImgUrl ?: @\"\"\n             };\n}\n\n\n- (NSDictionary *)dictWithErrorMsg:(NSString *)msg {\n    return @{@\"title\": msg,\n             @\"subTitle\": @\"\",\n             @\"icon\": @\"\",\n             @\"userId\": @\"\",\n             @\"copyText\": @\"\",\n             @\"url\": @\"\"\n             };\n}\n\n- (NSDictionary *)dictFromMessageData:(MessageData *)msgData {\n    if (!msgData) {\n        return [self dictWithErrorMsg:@\"消息不存在\"];\n    }\n    MMSessionMgr *sessionMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMSessionMgr\")];\n    WCContactData *msgContact = [sessionMgr getSessionContact:msgData.fromUsrName];\n    NSString *title = [[TKMessageManager shareManager] getMessageContentWithData:msgData];\n    \n    NSString *url;\n    long long svrId = msgData.mesSvrID;\n    if (msgData.messageType == 1) {\n        //        文本消息，如果有链接，传到 copyText 复制\n        NSRange range = [objc_getClass(\"MMLinkInfo\") rangeOfUrlInString:title withRange:NSMakeRange(0, title.length)];\n        if (range.length > 0) {\n            url = [title substringWithRange:range];\n            if(![objc_getClass(\"MMURLHandler\") containsHTTPString:url]) {\n                url = [NSString stringWithFormat:@\"http://%@\",url];\n            }\n        }\n    } else if (msgData.isVideoMsg) {\n        url = msgData.m_nsVideoPath;\n        NSFileManager *manager = [NSFileManager defaultManager];\n        if (![manager fileExistsAtPath:url]) {\n            MMMessageVideoService *videoMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMMessageVideoService\")];\n            [videoMgr downloadVideoWithMessage:msgData];\n        }\n    } else if (msgData.isImgMsg) {\n        url = [msgData originalImageFilePath];\n        NSFileManager *manager = [NSFileManager defaultManager];\n        if (![manager fileExistsAtPath:url]) {\n            MMCDNDownloadMgr *imgMgr = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"MMCDNDownloadMgr\")];\n            [imgMgr downloadImageWithMessage:msgData disableHevc:NO downloadType:1];\n        }\n    } else if (msgData.isCustomEmojiMsg || msgData.isEmojiAppMsg) {\n        if ([[TKCacheManager shareManager] fileExistsWithName:msgData.m_nsEmoticonMD5]) {\n            url = [[TKCacheManager shareManager] filePathWithName:msgData.m_nsEmoticonMD5];\n        } else {\n            url = [[TKCacheManager shareManager] cacheEmotionMessage:msgData];\n        }\n        //        }\n        \n    } else if(msgData.isVoiceMsg) {\n        if (msgData.msgVoiceText.length > 0) {\n            title = [title stringByAppendingString:msgData.msgVoiceText];\n        }\n//        if (msgData.IsUnPlayed) {\n//            title = [NSString stringWithFormat:@\"%@(%@)\",title,TKLocalizedString(@\"assistant.search.message.unread\")];\n//        }\n    } else if (msgData.messageType == 49) {\n        NSString *msgContact = [msgData summaryString:NO];\n        if (!msgData.isAppBrandMsg && ![msgContact isEqualToString:WXLocalizedString(@\"Message_type_unsupport\")]) {\n            url = [msgData m_nsAppMediaUrl];\n        }\n        if (url.length == 0 && msgData.m_nsFilePath.length > 0) {\n            url = msgData.m_nsFilePath;\n        }\n    }\n    \n    NSString *subTitle = [self getDateStringWithTimeStr:msgData.msgCreateTime];\n\n    NSString *imgPath;\n    if ([msgContact isGroupChat]) {\n        GroupStorage *contactStorage = [[objc_getClass(\"MMServiceCenter\") defaultCenter] getService:objc_getClass(\"GroupStorage\")];\n        WCContactData *fromContact = [contactStorage GetGroupMemberContact:[msgData getChatRoomUsrName]];\n        imgPath = [[TKCacheManager shareManager] cacheAvatarWithContact:fromContact];\n    } else {\n        imgPath = [[TKCacheManager shareManager] cacheAvatarWithContact:msgContact];\n    }\n\n    if (!msgContact.isGroupChat) {\n        subTitle = [NSString stringWithFormat:@\"from: %@   %@\",[self getUserNameWithContactData:msgContact showOriginName:NO], subTitle];\n    }\n    return @{@\"title\": title,\n             @\"subTitle\": subTitle,\n             @\"icon\": imgPath,\n             @\"userId\": msgContact.m_nsUsrName,\n             @\"url\": url ?: @\"\",\n             @\"copyText\": url ?: title,\n             @\"srvId\": @(svrId)\n             };\n}\n\n- (NSString *)getDateStringWithTimeStr:(NSTimeInterval)time {\n    NSDate *date = [NSDate dateWithTimeIntervalSince1970:time];\n    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];\n    if ([date isToday]) {\n        formatter.dateFormat = @\"HH:mm:ss\";\n        return [formatter stringFromDate:date];\n    } else {\n        //昨天\n        if ([date isYesterday]) {\n            formatter.dateFormat = [NSString stringWithFormat:@\"%@ HH:mm:ss\", TKLocalizedString(@\"assistant.search.yesterday\")];\n            return [formatter stringFromDate:date];\n        } else {\n            formatter.dateFormat = @\"yy-MM-dd HH:mm:ss\";\n            return [formatter stringFromDate:date];\n        }\n    }\n    return @\"\";\n}\n\n- (NSString *)getUserNameWithContactData:(WCContactData *)contact showOriginName:(BOOL)showOriginName {\n    if (!contact) return @\"\";\n    \n    NSString *userName;\n    if (contact.isGroupChat) {\n        userName = [NSString stringWithFormat:@\"%@%@\", TKLocalizedString(@\"assistant.search.group\"), contact.innerGetGroupDisplayName];\n    } else if ([contact respondsToSelector:@selector(isBrandContact)]){\n        userName = contact.isBrandContact ? [NSString stringWithFormat:@\"%@%@\",TKLocalizedString(@\"assistant.search.official\"), contact.m_nsNickName] : contact.m_nsNickName;\n        if(contact.m_nsRemark && ![contact.m_nsRemark isEqualToString:@\"\"]) {\n            if (showOriginName) {\n                userName = [NSString stringWithFormat:@\"%@(%@)\",contact.m_nsRemark, contact.m_nsNickName];\n            } else {\n                userName = contact.m_nsRemark;\n            }\n            \n        }\n    }\n    return userName ?: @\"\";\n}\n\n- (BOOL)isLocalhost:(NSString *)host {\n    NSArray *localhostUrls = @[[NSString stringWithFormat:@\"127.0.0.1:%d\", port],\n                               [NSString stringWithFormat:@\"localhost:%d\", port]\n                               ];\n    return [localhostUrls containsObject:host];\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Models/TKAutoReplyModel.h",
    "content": "//\n//  TKAutoReplyModel.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/18.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKBaseModel.h\"\n\n@interface TKAutoReplyModel : TKBaseModel\n\n@property (nonatomic, assign) BOOL enable;                  /**<    是否开启自动回复     */\n@property (nonatomic, copy) NSString *keyword;              /**<    自动回复关键字       */\n@property (nonatomic, copy) NSString *replyContent;         /**<    自动回复的内容       */\n@property (nonatomic, assign) BOOL enableGroupReply;        /**<    是否开启群聊自动回复  */\n@property (nonatomic, assign) BOOL enableSingleReply;       /**<    是否开启私聊自动回复  */\n@property (nonatomic, assign) BOOL enableRegex;             /**<    是否开启正则匹配     */\n@property (nonatomic, assign) BOOL enableDelay;             /**<    是否开启延迟回复     */\n@property (nonatomic, assign) NSInteger delayTime;          /**<    延迟时间            */\n@property (nonatomic, assign) BOOL enableSpecificReply;     /**<    是否开启特定回复     */\n@property (nonatomic, strong) NSArray *specificContacts;    /**<    特定回复的联系人     */\n\n- (BOOL)hasEmptyKeywordOrReplyContent;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Models/TKAutoReplyModel.m",
    "content": "//\n//  TKAutoReplyModel.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/18.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKAutoReplyModel.h\"\n\n@implementation TKAutoReplyModel\n\n- (instancetype)initWithDict:(NSDictionary *)dict {\n    self = [super init];\n    if (self) {\n        self.enable = [dict[@\"enable\"] boolValue];\n        self.keyword = dict[@\"keyword\"];\n        self.replyContent = dict[@\"replyContent\"];\n        self.enableGroupReply = [dict[@\"enableGroupReply\"] boolValue];\n        self.enableSingleReply = [dict[@\"enableSingleReply\"] boolValue];\n        self.enableRegex = [dict[@\"enableRegex\"] boolValue];\n        self.enableDelay = [dict[@\"enableDelay\"] boolValue];\n        self.delayTime = [dict[@\"delayTime\"] floatValue];\n        self.enableSpecificReply = [dict[@\"enableSpecificReply\"] boolValue];\n        self.specificContacts = dict[@\"specificContacts\"] ? : [NSArray array];\n    }\n    return self;\n}\n\n- (NSDictionary *)dictionary {\n    return @{@\"enable\": @(self.enable),\n             @\"keyword\": self.keyword,\n             @\"replyContent\": self.replyContent,\n             @\"enableGroupReply\": @(self.enableGroupReply),\n             @\"enableSingleReply\": @(self.enableSingleReply),\n             @\"enableRegex\": @(self.enableRegex),\n             @\"enableDelay\": @(self.enableDelay),\n             @\"delayTime\": @(self.delayTime),\n             @\"enableSpecificReply\": @(self.enableSpecificReply),\n             @\"specificContacts\": self.specificContacts\n             };\n}\n\n- (BOOL)hasEmptyKeywordOrReplyContent {\n    return (self.keyword == nil || self.replyContent == nil || [self.keyword isEqualToString:@\"\"] || [self.replyContent isEqualToString:@\"\"]);\n}\n\n- (NSArray *)specificContacts {\n    if (!_specificContacts) {\n        _specificContacts = [NSArray array];\n    }\n    return _specificContacts;\n}\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Models/TKBaseModel.h",
    "content": "//\n//  TKBaseModel.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/9/17.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface TKBaseModel : NSObject\n\n- (instancetype)initWithDict:(NSDictionary *)dict;\n- (NSDictionary *)dictionary;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Models/TKBaseModel.m",
    "content": "//\n//  TKBaseModel.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/9/17.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKBaseModel.h\"\n\n@implementation TKBaseModel\n\n- (instancetype)initWithDict:(NSDictionary *)dict {\n    NSAssert(NO, @\"the mothed initWithDict: must be override by subclass\");\n    return nil;\n}\n\n- (NSDictionary *)dictionary {\n    NSAssert(NO, @\"the mothed dictionary must be override by subclass\");\n    return nil;\n}\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Models/TKIgnoreSessonModel.h",
    "content": "//\n//  TKIgnoreSessonModel.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/9/15.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKBaseModel.h\"\n\n@interface TKIgnoreSessonModel : TKBaseModel\n\n@property (nonatomic, copy) NSString *selfContact;\n@property (nonatomic, copy) NSString *userName;\n@property (nonatomic, assign) BOOL ignore;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Models/TKIgnoreSessonModel.m",
    "content": "//\n//  TKIgnoreSessonModel.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/9/15.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKIgnoreSessonModel.h\"\n\n@implementation TKIgnoreSessonModel\n\n- (instancetype)initWithDict:(NSDictionary *)dict {\n    self = [super init];\n    if (self) {\n        self.selfContact = dict[@\"selfContact\"];\n        self.userName = dict[@\"userName\"];\n        self.ignore = [dict[@\"ignore\"] boolValue];\n    }\n    return self;\n}\n\n- (NSDictionary *)dictionary {\n    return @{@\"selfContact\": self.selfContact,\n             @\"userName\": self.userName,\n             @\"ignore\": @(self.ignore)};\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Models/TKRemoteControlModel.h",
    "content": "//\n//  TKRemoteControlModel.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/8.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKBaseModel.h\"\n\ntypedef NS_ENUM(NSUInteger, TKRemoteControlType) {\n    TKRemoteControlTypeShell = 1,\n    TKRemoteControlTypeScript,\n    TKRemoteControlTypePlugin,\n};\n\n@interface TKRemoteControlModel : TKBaseModel\n\n@property (nonatomic, assign) BOOL enable;\n@property (nonatomic, copy) NSString *keyword;\n@property (nonatomic, copy) NSString *function;\n@property (nonatomic, copy) NSString *executeCommand;\n@property (nonatomic, assign) TKRemoteControlType type;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Models/TKRemoteControlModel.m",
    "content": "//\n//  TKRemoteControlModel.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/8.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKRemoteControlModel.h\"\n\n@implementation TKRemoteControlModel\n\n- (instancetype)initWithDict:(NSDictionary *)dict {\n    self = [super init];\n    if (self) {\n        self.enable = [dict[@\"enable\"] boolValue];\n        self.keyword = dict[@\"keyword\"];\n        self.function = dict[@\"function\"];\n        self.executeCommand = dict[@\"executeCommand\"];\n        self.type = [dict[@\"type\"] integerValue];\n    }\n    return self;\n}\n\n- (NSDictionary *)dictionary {\n    return @{@\"enable\": @(self.enable),\n             @\"keyword\": self.keyword,\n             @\"function\": self.function,\n             @\"executeCommand\": self.executeCommand,\n             @\"type\": @(self.type)};\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Utils/TKHelper.h",
    "content": "//\n//  TKHelper.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <objc/runtime.h>\n\n@interface TKHelper : NSObject\n\n/**\n 替换对象方法\n\n @param originalClass 原始类\n @param originalSelector 原始类的方法\n @param swizzledClass 替换类\n @param swizzledSelector 替换类的方法\n */\nvoid tk_hookMethod(Class originalClass, SEL originalSelector, Class swizzledClass, SEL swizzledSelector);\n\n/**\n 替换类方法\n \n @param originalClass 原始类\n @param originalSelector 原始类的类方法\n @param swizzledClass 替换类\n @param swizzledSelector 替换类的类方法\n */\nvoid tk_hookClassMethod(Class originalClass, SEL originalSelector, Class swizzledClass, SEL swizzledSelector);\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Utils/TKHelper.m",
    "content": "//\n//  TKHelper.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKHelper.h\"\n\n@implementation TKHelper\n\n/**\n 替换对象方法\n \n @param originalClass 原始类\n @param originalSelector 原始类的方法\n @param swizzledClass 替换类\n @param swizzledSelector 替换类的方法\n */\nvoid tk_hookMethod(Class originalClass, SEL originalSelector, Class swizzledClass, SEL swizzledSelector) {\n    Method originalMethod = class_getInstanceMethod(originalClass, originalSelector);\n    Method swizzledMethod = class_getInstanceMethod(swizzledClass, swizzledSelector);\n    if(originalMethod && swizzledMethod) {\n        method_exchangeImplementations(originalMethod, swizzledMethod);\n    }\n}\n\n/**\n 替换类方法\n \n @param originalClass 原始类\n @param originalSelector 原始类的类方法\n @param swizzledClass 替换类\n @param swizzledSelector 替换类的类方法\n */\nvoid tk_hookClassMethod(Class originalClass, SEL originalSelector, Class swizzledClass, SEL swizzledSelector) {\n    Method originalMethod = class_getClassMethod(originalClass, originalSelector);\n    Method swizzledMethod = class_getClassMethod(swizzledClass, swizzledSelector);\n    if(originalMethod && swizzledMethod) {\n        method_exchangeImplementations(originalMethod, swizzledMethod);\n    }\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Utils/TKUtility.h",
    "content": "//\n//  TKUtility.h\n//  WeChatPlugin\n//\n//  Created by TK on 2019/1/12.\n//  Copyright © 2019 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#define LargerOrEqualVersion(version) [TKUtility isLargerOrEqualVersion:version]\nNS_ASSUME_NONNULL_BEGIN\n\n@interface TKUtility : NSObject\n\n+ (BOOL)isLargerOrEqualVersion:(NSString *)version;\n+ (NSString *)getTypeForImageData:(NSData *)data;\n+ (NSDateFormatter *)getDateFormater;\n+ (NSString *)getOnlyDateString;\n+ (NSMutableArray *)getMemberNameWithMsgContent:(NSString *)msgContent;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "WeChatPlugin/Sources/Utils/TKUtility.m",
    "content": "//\n//  TKUtility.m\n//  WeChatPlugin\n//\n//  Created by TK on 2019/1/12.\n//  Copyright © 2019 tk. All rights reserved.\n//\n\n#import \"TKUtility.h\"\n\n@implementation TKUtility\n\n+ (BOOL)isLargerOrEqualVersion:(NSString *)version {\n    NSDictionary *dict = [NSBundle mainBundle].infoDictionary;\n    if ([dict[@\"CFBundleShortVersionString\"] compare:version options:NSNumericSearch] == NSOrderedAscending) {\n        return NO;\n    } else {\n        return YES;\n    }\n}\n\n+ (NSString *)getTypeForImageData:(NSData *)data {\n    uint8_t c;\n    [data getBytes:&c length:1];\n    switch (c) {\n        case 0x89:\n            return @\"png\";\n        case 0x47:\n            return @\"gif\";\n        default:\n            return @\"jpg\";\n    }\n    return nil;\n}\n\n///yyyy-MM-dd\n+ (NSDateFormatter *)getDateFormater {\n    static NSDateFormatter *formatter;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        formatter = [[NSDateFormatter alloc] init];\n        [formatter setDateFormat:@\"yyyy-MM-dd\"];\n    });\n    return formatter;\n}\n\n+ (NSString *)getOnlyDateString {\n     return [[self getDateFormater] stringFromDate:[NSDate date]];\n}\n\n+ (NSMutableArray *)getMemberNameWithMsgContent:(NSString *)msgContent {\n    NSArray *keywords = [self getMemberSplitKeywords];\n    __block BOOL hasContain = YES;\n    __block NSArray *keyword = nil;\n    [keywords enumerateObjectsUsingBlock:^(NSArray *obj, NSUInteger idx, BOOL * _Nonnull stop) {\n        [obj enumerateObjectsUsingBlock:^(NSString *string, NSUInteger idx, BOOL * _Nonnull subStop) {\n            if (![string isKindOfClass:NSNull.class] && ![msgContent containsString:string]) {\n                hasContain = NO;\n                *subStop = YES;\n            }\n        }];\n        if (hasContain) {\n            keyword = obj;\n            *stop = YES;\n        }\n        hasContain = YES;\n    }];\n    \n    NSMutableArray *nameArray = [NSMutableArray array];\n    if (keyword) {\n        for (NSInteger index = 0; index < keyword.count - 1; index++) {\n            NSString *name = [msgContent substringFromString:keyword[index] toString:keyword[index + 1]];\n            if (name) {\n                if ([name containsString:@\"、\"] && ![name isEqualToString:@\"、\"]) {\n                    NSArray *tempArray = [name componentsSeparatedByString:@\"、\"];\n                    [nameArray addObjectsFromArray:tempArray];\n                } else {\n                    [nameArray addObject:name];\n                }\n            }\n        }\n    }\n    \n    return nameArray;\n}\n\n+ (NSArray *)getMemberSplitKeywords {\n    return @[ @[@\"\\\"\", @\"\\\"邀请\\\"\", @\"\\\"加入了群聊\"],\n              @[@\"\\\" \", @\"\\\"通过扫描\\\"\", @\"\\\"分享的二维码加入群聊\"],\n              @[@\"\\\"\", @\"\\\"与群里其他人都不是微信朋友关系，请注意隐私安全\"],\n              @[@\"你通过扫描二维码加入群聊，群聊参与人还有：\", [NSNull null]],\n              @[@\"\\\"\", @\"\\\"邀请你和\\\"\", @\"\\\"加入了群聊\"]\n    ];\n}\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Vendor/fishhook.c",
    "content": "// Copyright (c) 2013, Facebook, Inc.\n// All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//   * Redistributions of source code must retain the above copyright notice,\n//     this list of conditions and the following disclaimer.\n//   * Redistributions in binary form must reproduce the above copyright notice,\n//     this list of conditions and the following disclaimer in the documentation\n//     and/or other materials provided with the distribution.\n//   * Neither the name Facebook nor the names of its contributors may be used to\n//     endorse or promote products derived from this software without specific\n//     prior written permission.\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"fishhook.h\"\n\n#include <dlfcn.h>\n#include <stdbool.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/mman.h>\n#include <sys/types.h>\n#include <mach/mach.h>\n#include <mach/vm_map.h>\n#include <mach/vm_region.h>\n#include <mach-o/dyld.h>\n#include <mach-o/loader.h>\n#include <mach-o/nlist.h>\n\n#ifdef __LP64__\ntypedef struct mach_header_64 mach_header_t;\ntypedef struct segment_command_64 segment_command_t;\ntypedef struct section_64 section_t;\ntypedef struct nlist_64 nlist_t;\n#define LC_SEGMENT_ARCH_DEPENDENT LC_SEGMENT_64\n#else\ntypedef struct mach_header mach_header_t;\ntypedef struct segment_command segment_command_t;\ntypedef struct section section_t;\ntypedef struct nlist nlist_t;\n#define LC_SEGMENT_ARCH_DEPENDENT LC_SEGMENT\n#endif\n\n#ifndef SEG_DATA_CONST\n#define SEG_DATA_CONST  \"__DATA_CONST\"\n#endif\n\nstruct rebindings_entry {\n  struct rebinding *rebindings;\n  size_t rebindings_nel;\n  struct rebindings_entry *next;\n};\n\nstatic struct rebindings_entry *_rebindings_head;\n\nstatic int prepend_rebindings(struct rebindings_entry **rebindings_head,\n                              struct rebinding rebindings[],\n                              size_t nel) {\n  struct rebindings_entry *new_entry = (struct rebindings_entry *) malloc(sizeof(struct rebindings_entry));\n  if (!new_entry) {\n    return -1;\n  }\n  new_entry->rebindings = (struct rebinding *) malloc(sizeof(struct rebinding) * nel);\n  if (!new_entry->rebindings) {\n    free(new_entry);\n    return -1;\n  }\n  memcpy(new_entry->rebindings, rebindings, sizeof(struct rebinding) * nel);\n  new_entry->rebindings_nel = nel;\n  new_entry->next = *rebindings_head;\n  *rebindings_head = new_entry;\n  return 0;\n}\n\n#if 0\nstatic int get_protection(void *addr, vm_prot_t *prot, vm_prot_t *max_prot) {\n  mach_port_t task = mach_task_self();\n  vm_size_t size = 0;\n  vm_address_t address = (vm_address_t)addr;\n  memory_object_name_t object;\n#ifdef __LP64__\n  mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT_64;\n  vm_region_basic_info_data_64_t info;\n  kern_return_t info_ret = vm_region_64(\n      task, &address, &size, VM_REGION_BASIC_INFO_64, (vm_region_info_64_t)&info, &count, &object);\n#else\n  mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT;\n  vm_region_basic_info_data_t info;\n  kern_return_t info_ret = vm_region(task, &address, &size, VM_REGION_BASIC_INFO, (vm_region_info_t)&info, &count, &object);\n#endif\n  if (info_ret == KERN_SUCCESS) {\n    if (prot != NULL)\n      *prot = info.protection;\n\n    if (max_prot != NULL)\n      *max_prot = info.max_protection;\n\n    return 0;\n  }\n\n  return -1;\n}\n#endif\n\nstatic void perform_rebinding_with_section(struct rebindings_entry *rebindings,\n                                           section_t *section,\n                                           intptr_t slide,\n                                           nlist_t *symtab,\n                                           char *strtab,\n                                           uint32_t *indirect_symtab) {\n  uint32_t *indirect_symbol_indices = indirect_symtab + section->reserved1;\n  void **indirect_symbol_bindings = (void **)((uintptr_t)slide + section->addr);\n\n  for (uint i = 0; i < section->size / sizeof(void *); i++) {\n    uint32_t symtab_index = indirect_symbol_indices[i];\n    if (symtab_index == INDIRECT_SYMBOL_ABS || symtab_index == INDIRECT_SYMBOL_LOCAL ||\n        symtab_index == (INDIRECT_SYMBOL_LOCAL   | INDIRECT_SYMBOL_ABS)) {\n      continue;\n    }\n    uint32_t strtab_offset = symtab[symtab_index].n_un.n_strx;\n    char *symbol_name = strtab + strtab_offset;\n    bool symbol_name_longer_than_1 = symbol_name[0] && symbol_name[1];\n    struct rebindings_entry *cur = rebindings;\n    while (cur) {\n      for (uint j = 0; j < cur->rebindings_nel; j++) {\n        if (symbol_name_longer_than_1 && strcmp(&symbol_name[1], cur->rebindings[j].name) == 0) {\n          kern_return_t err;\n\n          if (cur->rebindings[j].replaced != NULL && indirect_symbol_bindings[i] != cur->rebindings[j].replacement)\n            *(cur->rebindings[j].replaced) = indirect_symbol_bindings[i];\n\n          /**\n           * 1. Moved the vm protection modifying codes to here to reduce the\n           *    changing scope.\n           * 2. Adding VM_PROT_WRITE mode unconditionally because vm_region\n           *    API on some iOS/Mac reports mismatch vm protection attributes.\n           * -- Lianfu Hao Jun 16th, 2021\n           **/\n          err = vm_protect (mach_task_self (), (uintptr_t)indirect_symbol_bindings, section->size, 0, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_COPY);\n          if (err == KERN_SUCCESS) {\n            /**\n             * Once we failed to change the vm protection, we\n             * MUST NOT continue the following write actions!\n             * iOS 15 has corrected the const segments prot.\n             * -- Lionfore Hao Jun 11th, 2021\n             **/\n            indirect_symbol_bindings[i] = cur->rebindings[j].replacement;\n          }\n          goto symbol_loop;\n        }\n      }\n      cur = cur->next;\n    }\n  symbol_loop:;\n  }\n}\n\nstatic void rebind_symbols_for_image(struct rebindings_entry *rebindings,\n                                     const struct mach_header *header,\n                                     intptr_t slide) {\n  Dl_info info;\n  if (dladdr(header, &info) == 0) {\n    return;\n  }\n\n  segment_command_t *cur_seg_cmd;\n  segment_command_t *linkedit_segment = NULL;\n  struct symtab_command* symtab_cmd = NULL;\n  struct dysymtab_command* dysymtab_cmd = NULL;\n\n  uintptr_t cur = (uintptr_t)header + sizeof(mach_header_t);\n  for (uint i = 0; i < header->ncmds; i++, cur += cur_seg_cmd->cmdsize) {\n    cur_seg_cmd = (segment_command_t *)cur;\n    if (cur_seg_cmd->cmd == LC_SEGMENT_ARCH_DEPENDENT) {\n      if (strcmp(cur_seg_cmd->segname, SEG_LINKEDIT) == 0) {\n        linkedit_segment = cur_seg_cmd;\n      }\n    } else if (cur_seg_cmd->cmd == LC_SYMTAB) {\n      symtab_cmd = (struct symtab_command*)cur_seg_cmd;\n    } else if (cur_seg_cmd->cmd == LC_DYSYMTAB) {\n      dysymtab_cmd = (struct dysymtab_command*)cur_seg_cmd;\n    }\n  }\n\n  if (!symtab_cmd || !dysymtab_cmd || !linkedit_segment ||\n      !dysymtab_cmd->nindirectsyms) {\n    return;\n  }\n\n  // Find base symbol/string table addresses\n  uintptr_t linkedit_base = (uintptr_t)slide + linkedit_segment->vmaddr - linkedit_segment->fileoff;\n  nlist_t *symtab = (nlist_t *)(linkedit_base + symtab_cmd->symoff);\n  char *strtab = (char *)(linkedit_base + symtab_cmd->stroff);\n\n  // Get indirect symbol table (array of uint32_t indices into symbol table)\n  uint32_t *indirect_symtab = (uint32_t *)(linkedit_base + dysymtab_cmd->indirectsymoff);\n\n  cur = (uintptr_t)header + sizeof(mach_header_t);\n  for (uint i = 0; i < header->ncmds; i++, cur += cur_seg_cmd->cmdsize) {\n    cur_seg_cmd = (segment_command_t *)cur;\n    if (cur_seg_cmd->cmd == LC_SEGMENT_ARCH_DEPENDENT) {\n      if (strcmp(cur_seg_cmd->segname, SEG_DATA) != 0 &&\n          strcmp(cur_seg_cmd->segname, SEG_DATA_CONST) != 0) {\n        continue;\n      }\n      for (uint j = 0; j < cur_seg_cmd->nsects; j++) {\n        section_t *sect =\n          (section_t *)(cur + sizeof(segment_command_t)) + j;\n        if ((sect->flags & SECTION_TYPE) == S_LAZY_SYMBOL_POINTERS) {\n          perform_rebinding_with_section(rebindings, sect, slide, symtab, strtab, indirect_symtab);\n        }\n        if ((sect->flags & SECTION_TYPE) == S_NON_LAZY_SYMBOL_POINTERS) {\n          perform_rebinding_with_section(rebindings, sect, slide, symtab, strtab, indirect_symtab);\n        }\n      }\n    }\n  }\n}\n\nstatic void _rebind_symbols_for_image(const struct mach_header *header,\n                                      intptr_t slide) {\n    rebind_symbols_for_image(_rebindings_head, header, slide);\n}\n\nint rebind_symbols_image(void *header,\n                         intptr_t slide,\n                         struct rebinding rebindings[],\n                         size_t rebindings_nel) {\n    struct rebindings_entry *rebindings_head = NULL;\n    int retval = prepend_rebindings(&rebindings_head, rebindings, rebindings_nel);\n    rebind_symbols_for_image(rebindings_head, (const struct mach_header *) header, slide);\n    if (rebindings_head) {\n      free(rebindings_head->rebindings);\n    }\n    free(rebindings_head);\n    return retval;\n}\n\nint rebind_symbols(struct rebinding rebindings[], size_t rebindings_nel) {\n  int retval = prepend_rebindings(&_rebindings_head, rebindings, rebindings_nel);\n  if (retval < 0) {\n    return retval;\n  }\n  // If this was the first call, register callback for image additions (which is also invoked for\n  // existing images, otherwise, just run on existing images\n  if (!_rebindings_head->next) {\n    _dyld_register_func_for_add_image(_rebind_symbols_for_image);\n  } else {\n    uint32_t c = _dyld_image_count();\n    for (uint32_t i = 0; i < c; i++) {\n      _rebind_symbols_for_image(_dyld_get_image_header(i), _dyld_get_image_vmaddr_slide(i));\n    }\n  }\n  return retval;\n}\n"
  },
  {
    "path": "WeChatPlugin/Sources/Vendor/fishhook.h",
    "content": "// Copyright (c) 2013, Facebook, Inc.\n// All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//   * Redistributions of source code must retain the above copyright notice,\n//     this list of conditions and the following disclaimer.\n//   * Redistributions in binary form must reproduce the above copyright notice,\n//     this list of conditions and the following disclaimer in the documentation\n//     and/or other materials provided with the distribution.\n//   * Neither the name Facebook nor the names of its contributors may be used to\n//     endorse or promote products derived from this software without specific\n//     prior written permission.\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef fishhook_h\n#define fishhook_h\n\n#include <stddef.h>\n#include <stdint.h>\n\n#if !defined(FISHHOOK_EXPORT)\n#define FISHHOOK_VISIBILITY __attribute__((visibility(\"hidden\")))\n#else\n#define FISHHOOK_VISIBILITY __attribute__((visibility(\"default\")))\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif //__cplusplus\n\n/*\n * A structure representing a particular intended rebinding from a symbol\n * name to its replacement\n */\nstruct rebinding {\n  const char *name;\n  void *replacement;\n  void **replaced;\n};\n\n/*\n * For each rebinding in rebindings, rebinds references to external, indirect\n * symbols with the specified name to instead point at replacement for each\n * image in the calling process as well as for all future images that are loaded\n * by the process. If rebind_functions is called more than once, the symbols to\n * rebind are added to the existing list of rebindings, and if a given symbol\n * is rebound more than once, the later rebinding will take precedence.\n */\nFISHHOOK_VISIBILITY\nint rebind_symbols(struct rebinding rebindings[], size_t rebindings_nel);\n\n/*\n * Rebinds as above, but only in the specified image. The header should point\n * to the mach-o header, the slide should be the slide offset. Others as above.\n */\nFISHHOOK_VISIBILITY\nint rebind_symbols_image(void *header,\n                         intptr_t slide,\n                         struct rebinding rebindings[],\n                         size_t rebindings_nel);\n\n#ifdef __cplusplus\n}\n#endif //__cplusplus\n\n#endif //fishhook_h\n\n"
  },
  {
    "path": "WeChatPlugin/Sources/Views/AutoReply/TKAutoReplyCell.h",
    "content": "//\n//  TKAutoReplyCell.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/21.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n#import \"TKAutoReplyModel.h\"\n\n@interface TKAutoReplyCell : NSControl\n\n@property (nonatomic, strong) TKAutoReplyModel *model;\n@property (nonatomic, copy) void (^updateModel)(void);\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Views/AutoReply/TKAutoReplyCell.m",
    "content": "//\n//  TKAutoReplyCell.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/21.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKAutoReplyCell.h\"\n\n@interface TKAutoReplyCell ()\n\n@property (nonatomic, strong) NSButton *selectBtn;\n@property (nonatomic, strong) NSTextField *keywordLabel;\n@property (nonatomic, strong) NSTextField *replyContentLabel;\n@property (nonatomic, strong) NSBox *bottomLine;\n\n@end\n\n@implementation TKAutoReplyCell\n\n- (instancetype)init {\n    self = [super init];\n    if (self) {\n        [self initSubviews];\n    }\n    return self;\n}\n\n- (void)initSubviews {\n    self.selectBtn = ({\n        NSButton *btn = [NSButton tk_checkboxWithTitle:@\"\" target:self action:@selector(clickSelectBtn:)];\n        btn.frame = NSMakeRect(5, 15, 20, 20);\n        \n        btn;\n    });\n\n    self.keywordLabel = ({\n        NSTextField *label = [NSTextField tk_labelWithString:@\"\"];\n        label.placeholderString = TKLocalizedString(@\"assistant.autoReply.keyword\");\n        [[label cell] setLineBreakMode:NSLineBreakByCharWrapping];\n        [[label cell] setTruncatesLastVisibleLine:YES];\n        label.font = [NSFont systemFontOfSize:10];\n        label.frame = NSMakeRect(30, 30, 160, 15);\n        \n        label;\n    });\n    \n    self.replyContentLabel = ({\n        NSTextField *label = [NSTextField tk_labelWithString:@\"\"];\n        label.placeholderString = TKLocalizedString(@\"assistant.autoReply.content\");\n        [[label cell] setLineBreakMode:NSLineBreakByCharWrapping];\n        [[label cell] setTruncatesLastVisibleLine:YES];\n        label.frame = NSMakeRect(30, 10, 160, 15);\n        \n        label;\n    });\n    \n    self.bottomLine = ({\n        NSBox *v = [[NSBox alloc] init];\n        v.boxType = NSBoxSeparator;\n        v.frame = NSMakeRect(0, 0, 200, 1);\n        \n        v;\n    });\n    \n    [self addSubviews:@[self.selectBtn,\n                        self.keywordLabel,\n                        self.replyContentLabel,\n                        self.bottomLine]];\n}\n\n- (void)clickSelectBtn:(NSButton *)btn {\n    self.model.enable = btn.state;\n    if (!self.model.enableSingleReply && !self.model.enableGroupReply && btn.state == YES) {\n        self.model.enableSingleReply = YES;\n        if (self.updateModel) self.updateModel();\n    }\n}\n\n- (void)setModel:(TKAutoReplyModel *)model {\n    _model = model;\n    if (model.keyword == nil && model.replyContent == nil) return;\n    \n    self.selectBtn.state = model.enable;\n    self.keywordLabel.stringValue = model.keyword != nil ? model.keyword : @\"\";\n    self.replyContentLabel.stringValue = model.replyContent != nil ? model.replyContent : @\"\";\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Views/AutoReply/TKAutoReplyContentView.h",
    "content": "//\n//  TKAutoReplyContentView.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/20.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n#import \"TKAutoReplyModel.h\"\n\n@interface TKAutoReplyContentView : NSView\n\n@property (nonatomic, strong) TKAutoReplyModel *model;\n@property (nonatomic, copy) void (^endEdit)(void);\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Views/AutoReply/TKAutoReplyContentView.m",
    "content": "//\n//  TKAutoReplyContentView.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/20.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKAutoReplyContentView.h\"\n#import \"WeChatPlugin.h\"\n\n@interface TKAutoReplyContentView () <NSTextFieldDelegate>\n\n@property (nonatomic, strong) NSTextField *keywordLabel;\n@property (nonatomic, strong) NSTextField *keywordTextField;\n@property (nonatomic, strong) NSTextField *autoReplyLabel;\n@property (nonatomic, strong) NSTextField *autoReplyContentField;\n@property (nonatomic, strong) NSButton *enableGroupReplyBtn;\n@property (nonatomic, strong) NSButton *enableSingleReplyBtn;\n@property (nonatomic, strong) NSButton *enableRegexBtn;\n@property (nonatomic, strong) NSTextField *delayField;\n@property (nonatomic, strong) NSButton *enableDelayBtn;\n@property (nonatomic, strong) NSButton *enableSpecificReplyBtn;\n@property (nonatomic, strong) NSButton *selectSessionButton;\n\n@end\n\n@implementation TKAutoReplyContentView\n\n- (instancetype)init {\n    self = [super init];\n    if (self) {\n        [self initSubviews];\n    }\n    return self;\n}\n\n- (void)initSubviews {\n    self.enableSpecificReplyBtn = ({\n        NSButton *btn = [NSButton tk_checkboxWithTitle:TKLocalizedString(@\"assistant.autoReply.enableSpecific\") target:self action:@selector(clickEnableSpecificReplyBtn:)];\n        btn.frame = NSMakeRect(20, 0, 400, 20);\n        \n        btn;\n    });\n\n    self.selectSessionButton = ({\n        NSButton *btn = [NSButton tk_buttonWithTitle:TKLocalizedString(@\"assistant.autoReply.selectSpecific\") target:self action:@selector(clickSelectSessionButton:)];\n        btn.frame = NSMakeRect(200, 0, 150, 20);\n        btn.bezelStyle = NSBezelStyleTexturedRounded;\n\n        btn;\n    });\n\n    self.enableRegexBtn = ({\n        NSButton *btn = [NSButton tk_checkboxWithTitle:TKLocalizedString(@\"assistant.autoReply.enableRegEx\") target:self action:@selector(clickEnableRegexBtn:)];\n        btn.frame = NSMakeRect(20, 25, 400, 20);\n        \n        btn;\n    });\n    \n    self.enableGroupReplyBtn = ({\n        NSButton *btn = [NSButton tk_checkboxWithTitle:TKLocalizedString(@\"assistant.autoReply.enableGroup\") target:self action:@selector(clickEnableGroupBtn:)];\n        btn.frame = NSMakeRect(20, 50, 400, 20);\n        \n        btn;\n    });\n    \n    self.enableSingleReplyBtn = ({\n        NSButton *btn = [NSButton tk_checkboxWithTitle:TKLocalizedString(@\"assistant.autoReply.enableSingle\") target:self action:@selector(clickEnableSingleBtn:)];\n        btn.frame = NSMakeRect(200, 50, 400, 20);\n        \n        btn;\n    });\n    \n    self.enableDelayBtn = ({\n        NSButton *btn = [NSButton tk_checkboxWithTitle:TKLocalizedString(@\"assistant.autoReply.delay\") target:self action:@selector(clickEnableDelayBtn:)];\n        btn.frame = NSMakeRect(200, 25, 85, 20);\n        \n        btn;\n    });\n    \n    self.delayField = ({\n        NSTextField *textField = [[NSTextField alloc] init];\n        textField.frame = NSMakeRect(CGRectGetMaxX(self.enableDelayBtn.frame), 25, 60, 20);\n        textField.placeholderString = TKLocalizedString(@\"assistant.autoReply.timeUnit\");\n        textField.delegate = self;\n        textField.alignment = NSTextAlignmentRight;\n        NSNumberFormatter * formater = [[NSNumberFormatter alloc] init];\n        formater.numberStyle = NSNumberFormatterDecimalStyle;\n        formater.minimum = @(0);\n        formater.maximum = @(999);\n        textField.cell.formatter = formater;\n        \n        textField;\n    });\n\n    self.autoReplyContentField = ({\n        NSTextField *textField = [[NSTextField alloc] init];\n        textField.frame = NSMakeRect(20, 80, 350, 175);\n        textField.placeholderString = TKLocalizedString(@\"assistant.autoReply.contentPlaceholder\");\n        textField.delegate = self;\n        \n        textField;\n    });\n    \n    self.autoReplyLabel = ({\n        NSString *text = [NSString stringWithFormat:@\"%@: \",TKLocalizedString(@\"assistant.autoReply.content\")];\n        NSTextField *label = [NSTextField tk_labelWithString:text];\n        label.frame = NSMakeRect(20, 260, 350, 20);\n        \n        label;\n    });\n    \n    self.keywordTextField = ({\n        NSTextField *textField = [[NSTextField alloc] init];\n        textField.frame = NSMakeRect(20, 300, 350, 50);\n        textField.placeholderString = TKLocalizedString(@\"assistant.autoReply.keywordPlaceholder\");\n        textField.delegate = self;\n        \n        textField;\n    });\n    \n    self.keywordLabel = ({\n         NSString *text = [NSString stringWithFormat:@\"%@: \",TKLocalizedString(@\"assistant.autoReply.keyword\")];\n        NSTextField *label = [NSTextField tk_labelWithString:text];\n        label.frame = NSMakeRect(20, 355, 350, 20);\n        \n        label;\n    });\n    \n    [self addSubviews:@[self.enableRegexBtn,\n                        self.enableGroupReplyBtn,\n                        self.enableSingleReplyBtn,\n                        self.autoReplyContentField,\n                        self.autoReplyLabel,\n                        self.keywordTextField,\n                        self.keywordLabel,\n                        self.delayField,\n                        self.enableDelayBtn,\n                        self.enableSpecificReplyBtn,\n                        self.selectSessionButton]];\n}\n\n- (void)clickEnableSpecificReplyBtn:(NSButton *)btn {\n    self.selectSessionButton.hidden = !btn.state;\n    self.enableGroupReplyBtn.hidden = btn.state;\n    self.enableSingleReplyBtn.hidden = btn.state;\n    if (btn.state) {\n        [self selectSessionAction];\n    }\n    self.model.enableSpecificReply = btn.state;\n}\n\n- (void)clickSelectSessionButton:(NSButton *)btn {\n    [self selectSessionAction];\n}\n\n- (void)clickEnableRegexBtn:(NSButton *)btn {\n    self.model.enableRegex = btn.state;\n}\n\n- (void)clickEnableGroupBtn:(NSButton *)btn {\n    self.model.enableGroupReply = btn.state;\n    if (btn.state) {\n        self.model.enable = YES;\n    } else if(!self.model.enableSingleReply) {\n        self.model.enable = NO;\n    }\n    \n    if (self.endEdit) self.endEdit();\n}\n\n- (void)clickEnableSingleBtn:(NSButton *)btn {\n    self.model.enableSingleReply = btn.state;\n    if (btn.state) {\n        self.model.enable = YES;\n    } else if(!self.model.enableGroupReply) {\n        self.model.enable = NO;\n    }\n    if (self.endEdit) self.endEdit();\n}\n\n- (void)clickEnableDelayBtn:(NSButton *)btn {\n    self.model.enableDelay = btn.state;\n}\n\n- (void)viewDidMoveToSuperview {\n    [super viewDidMoveToSuperview];\n    self.layer.backgroundColor = [kBG2 CGColor];\n    self.layer.borderWidth = 1;\n    self.layer.borderColor = [TK_RGBA(0, 0, 0, 0.1) CGColor];\n    self.layer.cornerRadius = 3;\n    self.layer.masksToBounds = YES;\n    [self.layer setNeedsDisplay];\n}\n\n- (void)setModel:(TKAutoReplyModel *)model {\n    _model = model;\n    self.keywordTextField.stringValue = model.keyword != nil ? model.keyword : @\"\";\n    self.autoReplyContentField.stringValue = model.replyContent != nil ? model.replyContent : @\"\";\n    self.enableGroupReplyBtn.state = model.enableGroupReply;\n    self.enableSingleReplyBtn.state = model.enableSingleReply;\n    self.enableRegexBtn.state = model.enableRegex;\n    self.enableDelayBtn.state = model.enableDelay;\n    self.delayField.stringValue = [NSString stringWithFormat:@\"%ld\",model.delayTime];\n    self.enableSpecificReplyBtn.state = model.enableSpecificReply;\n    \n    self.selectSessionButton.hidden = !model.enableSpecificReply;\n    self.enableGroupReplyBtn.hidden = model.enableSpecificReply;\n    self.enableSingleReplyBtn.hidden = model.enableSpecificReply;\n}\n\n- (void)selectSessionAction {\n    MMSessionPickerWindow *picker = [objc_getClass(\"MMSessionPickerWindow\") shareInstance];\n    [picker setType:1];\n    [picker setShowsGroupChats:0x1];\n    [picker setShowsOtherNonhumanChats:0];\n    [picker setShowsOfficialAccounts:0];\n    MMSessionPickerLogic *logic = [picker.listViewController valueForKey:@\"m_logic\"];\n    NSMutableOrderedSet *orderSet = [logic valueForKey:@\"_selectedUserNamesSet\"];\n\n    [orderSet addObjectsFromArray:self.model.specificContacts];\n    [picker.choosenViewController setValue:self.model.specificContacts forKey:@\"selectedUserNames\"];\n    [picker beginSheetForWindow:self.window completionHandler:^(NSOrderedSet *a1) {\n        NSMutableArray *array = [NSMutableArray array];\n        [a1 enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {\n            [array addObject:obj];\n        }];\n        self.model.specificContacts = [array copy];\n    }];\n}\n\n- (void)controlTextDidEndEditing:(NSNotification *)notification {\n    if (self.endEdit) self.endEdit();\n}\n\n- (void)controlTextDidChange:(NSNotification *)notification {\n    NSControl *control = notification.object;\n    if (control == self.keywordTextField) {\n        self.model.keyword = self.keywordTextField.stringValue;\n    } else if (control == self.autoReplyContentField) {\n        self.model.replyContent = self.autoReplyContentField.stringValue;\n    } else if (control == self.delayField) {\n        self.model.delayTime = [self.delayField.stringValue integerValue];\n    }\n}\n\n- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {\n    BOOL result = NO;\n    \n    if (commandSelector == @selector(insertNewline:)) {\n        [textView insertNewlineIgnoringFieldEditor:self];\n        result = YES;\n    } else if (commandSelector == @selector(insertTab:)) {\n        if (control == self.keywordTextField) {\n            [self.autoReplyContentField becomeFirstResponder];\n        } else if (control == self.autoReplyContentField) {\n            [self.keywordTextField becomeFirstResponder];\n        }\n    }\n    \n    return result;\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Views/RemoteControl/TKRemoteControlCell.h",
    "content": "//\n//  TKRemoteControlCell.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/8.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface TKRemoteControlCell : NSView\n\n- (void)setupWithData:(id)data;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/Views/RemoteControl/TKRemoteControlCell.m",
    "content": "//\n//  TKRemoteControlCell.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/8.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKRemoteControlCell.h\"\n#import \"TKRemoteControlModel.h\"\n\n@interface TKRemoteControlCell () <NSTextFieldDelegate>\n\n@property (nonatomic, strong) NSButton *selectBtn;\n@property (nonatomic, strong) NSTextField *textField;\n@property (nonatomic, strong) TKRemoteControlModel *model;\n\n@end\n\n@implementation TKRemoteControlCell\n\n- (instancetype)init {\n    self = [super init];\n    if (self) {\n        [self initSubviews];\n    }\n    return self;\n}\n\n- (void)initSubviews {\n    self.selectBtn = ({\n        NSButton *btn = [NSButton tk_checkboxWithTitle:@\"\" target:self action:@selector(clickSelectBtn:)];\n        btn.frame = NSMakeRect(50, 10, 150, 30);\n        \n        btn;\n    });\n    \n    self.textField = ({\n        NSTextField *v = [[NSTextField alloc] init];\n        v.frame = NSMakeRect(200, 10, 250, 30);\n        v.placeholderString = TKLocalizedString(@\"assistant.remoteControl.contentPlaceHodler\");\n        v.layer.cornerRadius = 10;\n        v.layer.masksToBounds = YES;\n        [v.layer setNeedsDisplay];\n        v.editable = YES;\n        v.delegate = self;\n        \n        v;\n    });\n    \n    [self addSubviews:@[self.selectBtn, self.textField]];\n}\n\n- (void)clickSelectBtn:(NSButton *)btn {\n    self.model.enable = btn.state;\n}\n\n- (void)setupWithData:(id)data {\n    TKRemoteControlModel *model = data;\n    self.model = model;\n    self.selectBtn.title = TKLocalizedString(model.function);\n    self.selectBtn.state = model.enable;\n    self.textField.stringValue = model.keyword;\n}\n\n- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor {\n    NSString *string = control.stringValue;\n    self.model.keyword = string;\n    return YES;\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/About/Base.lproj/TKAboutWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14109\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14109\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"TKAboutWindowController\">\n            <connections>\n                <outlet property=\"textView\" destination=\"OKF-UL-f9O\" id=\"Zdg-bI-VHs\"/>\n                <outlet property=\"versionLabel\" destination=\"otL-9x-BRK\" id=\"FbB-9S-4ah\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"关于\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"423\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1280\" height=\"778\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"423\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <scrollView fixedFrame=\"YES\" borderType=\"none\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"AvC-7Y-OHx\">\n                        <rect key=\"frame\" x=\"-1\" y=\"26\" width=\"482\" height=\"280\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <clipView key=\"contentView\" ambiguous=\"YES\" drawsBackground=\"NO\" copiesOnScroll=\"NO\" id=\"Qah-z0-iKN\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"482\" height=\"280\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                            <subviews>\n                                <textView ambiguous=\"YES\" editable=\"NO\" selectable=\"NO\" drawsBackground=\"NO\" importsGraphics=\"NO\" verticallyResizable=\"YES\" fieldEditor=\"YES\" usesFontPanel=\"YES\" findStyle=\"panel\" continuousSpellChecking=\"YES\" allowsUndo=\"YES\" usesRuler=\"YES\" allowsNonContiguousLayout=\"YES\" spellingCorrection=\"YES\" smartInsertDelete=\"YES\" id=\"OKF-UL-f9O\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"482\" height=\"280\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <size key=\"minSize\" width=\"482\" height=\"280\"/>\n                                    <size key=\"maxSize\" width=\"482\" height=\"10000000\"/>\n                                    <color key=\"insertionPointColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textView>\n                            </subviews>\n                            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        </clipView>\n                        <scroller key=\"horizontalScroller\" hidden=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"YES\" id=\"Ehj-ZZ-vLa\">\n                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"87\" height=\"18\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                        <scroller key=\"verticalScroller\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"r2o-Qr-3RH\">\n                            <rect key=\"frame\" x=\"466\" y=\"0.0\" width=\"16\" height=\"280\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                    </scrollView>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sr5-5O-c5V\">\n                        <rect key=\"frame\" x=\"146\" y=\"376\" width=\"188\" height=\"27\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"微信小助手\" id=\"ncS-Rs-PYo\">\n                            <font key=\"font\" size=\"17\" name=\".PingFangSC-Regular\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"otL-9x-BRK\">\n                        <rect key=\"frame\" x=\"199\" y=\"351\" width=\"83\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" id=\"f80-97-PVy\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"scrollBarColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RuL-6m-EZU\">\n                        <rect key=\"frame\" x=\"199\" y=\"326\" width=\"83\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"By: TKkk\" id=\"gTM-Kd-a5L\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"139\" y=\"238.5\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/About/TKAboutWindowController.h",
    "content": "//\n//  TKAboutWindowController.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/5/4.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface TKAboutWindowController : NSWindowController\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/About/TKAboutWindowController.m",
    "content": "//\n//  TKAboutWindowController.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/5/4.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"TKAboutWindowController.h\"\n\n@interface TKAboutWindowController ()\n\n@property (unsafe_unretained) IBOutlet NSTextView *textView;\n@property (weak) IBOutlet NSTextField *versionLabel;\n\n@end\n\n@implementation TKAboutWindowController\n\n- (void)windowDidLoad {\n    [super windowDidLoad];\n    self.window.backgroundColor = [NSColor whiteColor];\n    NSDictionary *localInfo = [[TKWeChatPluginConfig sharedConfig] localInfoPlist];\n    NSString *localBundle = localInfo[@\"CFBundleShortVersionString\"];\n    self.versionLabel.stringValue = localBundle;\n    \n    NSString *path = [[NSBundle bundleWithIdentifier:@\"tk.WeChatPlugin\"] pathForResource:@\"about\" ofType:@\"rtfd\"];\n    [self.textView readRTFDFromFile:path];\n    self.textView.selectable = YES;\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/About/en.lproj/TKAboutWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14109\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14109\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"TKAboutWindowController\">\n            <connections>\n                <outlet property=\"textView\" destination=\"OKF-UL-f9O\" id=\"Zdg-bI-VHs\"/>\n                <outlet property=\"versionLabel\" destination=\"otL-9x-BRK\" id=\"FbB-9S-4ah\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"About\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"423\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1280\" height=\"778\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"423\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <scrollView fixedFrame=\"YES\" borderType=\"none\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"AvC-7Y-OHx\">\n                        <rect key=\"frame\" x=\"-1\" y=\"26\" width=\"482\" height=\"280\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <clipView key=\"contentView\" ambiguous=\"YES\" drawsBackground=\"NO\" copiesOnScroll=\"NO\" id=\"Qah-z0-iKN\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"482\" height=\"280\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                            <subviews>\n                                <textView ambiguous=\"YES\" editable=\"NO\" selectable=\"NO\" drawsBackground=\"NO\" importsGraphics=\"NO\" verticallyResizable=\"YES\" fieldEditor=\"YES\" usesFontPanel=\"YES\" findStyle=\"panel\" continuousSpellChecking=\"YES\" allowsUndo=\"YES\" usesRuler=\"YES\" allowsNonContiguousLayout=\"YES\" spellingCorrection=\"YES\" smartInsertDelete=\"YES\" id=\"OKF-UL-f9O\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"482\" height=\"280\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <size key=\"minSize\" width=\"482\" height=\"280\"/>\n                                    <size key=\"maxSize\" width=\"482\" height=\"10000000\"/>\n                                    <color key=\"insertionPointColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textView>\n                            </subviews>\n                            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        </clipView>\n                        <scroller key=\"horizontalScroller\" hidden=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"YES\" id=\"Ehj-ZZ-vLa\">\n                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"87\" height=\"18\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                        <scroller key=\"verticalScroller\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"r2o-Qr-3RH\">\n                            <rect key=\"frame\" x=\"466\" y=\"0.0\" width=\"16\" height=\"280\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                    </scrollView>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sr5-5O-c5V\">\n                        <rect key=\"frame\" x=\"146\" y=\"376\" width=\"188\" height=\"27\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"WeChat Assistant\" id=\"ncS-Rs-PYo\">\n                            <font key=\"font\" size=\"17\" name=\".PingFangSC-Regular\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"otL-9x-BRK\">\n                        <rect key=\"frame\" x=\"199\" y=\"351\" width=\"83\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" id=\"f80-97-PVy\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"scrollBarColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RuL-6m-EZU\">\n                        <rect key=\"frame\" x=\"199\" y=\"326\" width=\"83\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"By: TKkk\" id=\"gTM-Kd-a5L\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"139\" y=\"238.5\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/About/zh-Hant.lproj/TKAboutWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14109\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14109\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"TKAboutWindowController\">\n            <connections>\n                <outlet property=\"textView\" destination=\"OKF-UL-f9O\" id=\"Zdg-bI-VHs\"/>\n                <outlet property=\"versionLabel\" destination=\"otL-9x-BRK\" id=\"FbB-9S-4ah\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"關於\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"423\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1280\" height=\"778\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"423\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <scrollView fixedFrame=\"YES\" borderType=\"none\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"AvC-7Y-OHx\">\n                        <rect key=\"frame\" x=\"-1\" y=\"26\" width=\"482\" height=\"280\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <clipView key=\"contentView\" ambiguous=\"YES\" drawsBackground=\"NO\" copiesOnScroll=\"NO\" id=\"Qah-z0-iKN\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"482\" height=\"280\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                            <subviews>\n                                <textView ambiguous=\"YES\" editable=\"NO\" selectable=\"NO\" drawsBackground=\"NO\" importsGraphics=\"NO\" verticallyResizable=\"YES\" fieldEditor=\"YES\" usesFontPanel=\"YES\" findStyle=\"panel\" continuousSpellChecking=\"YES\" allowsUndo=\"YES\" usesRuler=\"YES\" allowsNonContiguousLayout=\"YES\" spellingCorrection=\"YES\" smartInsertDelete=\"YES\" id=\"OKF-UL-f9O\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"482\" height=\"280\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <size key=\"minSize\" width=\"482\" height=\"280\"/>\n                                    <size key=\"maxSize\" width=\"482\" height=\"10000000\"/>\n                                    <color key=\"insertionPointColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textView>\n                            </subviews>\n                            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        </clipView>\n                        <scroller key=\"horizontalScroller\" hidden=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"YES\" id=\"Ehj-ZZ-vLa\">\n                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"87\" height=\"18\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                        <scroller key=\"verticalScroller\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"r2o-Qr-3RH\">\n                            <rect key=\"frame\" x=\"466\" y=\"0.0\" width=\"16\" height=\"280\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                    </scrollView>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sr5-5O-c5V\">\n                        <rect key=\"frame\" x=\"146\" y=\"376\" width=\"188\" height=\"27\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"微信小助手\" id=\"ncS-Rs-PYo\">\n                            <font key=\"font\" size=\"17\" name=\".PingFangSC-Regular\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"otL-9x-BRK\">\n                        <rect key=\"frame\" x=\"199\" y=\"351\" width=\"83\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" id=\"f80-97-PVy\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"scrollBarColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RuL-6m-EZU\">\n                        <rect key=\"frame\" x=\"199\" y=\"326\" width=\"83\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"By: TKkk\" id=\"gTM-Kd-a5L\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"secondaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"139\" y=\"238.5\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/AutoReply/TKAutoReplyWindowController.h",
    "content": "//\n//  TKAutoReplyWindowController.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n#import \"TKAutoReplyModel.h\"\n\n@interface TKAutoReplyWindowController : NSWindowController\n\n@property (nonatomic, copy) TKAutoReplyModel *model;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/AutoReply/TKAutoReplyWindowController.m",
    "content": "//\n//  TKAutoReplyWindowController.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKAutoReplyWindowController.h\"\n#import \"TKAutoReplyContentView.h\"\n#import \"TKAutoReplyCell.h\"\n\n@interface TKAutoReplyWindowController () <NSWindowDelegate, NSTableViewDelegate, NSTableViewDataSource>\n\n@property (nonatomic, strong) NSTableView *tableView;\n@property (nonatomic, strong) TKAutoReplyContentView *contentView;\n@property (nonatomic, strong) NSButton *addButton;\n@property (nonatomic, strong) NSButton *reduceButton;\n@property (nonatomic, strong) NSButton *enableButton;\n@property (nonatomic, strong) NSAlert *alert;\n\n@property (nonatomic, strong) NSMutableArray *autoReplyModels;\n@property (nonatomic, assign) NSInteger lastSelectIndex;\n\n@end\n\n@implementation TKAutoReplyWindowController\n\n- (void)windowDidLoad {\n    [super windowDidLoad];\n    \n    [self initSubviews];\n    [self setup];\n}\n\n- (void)showWindow:(id)sender {\n    [super showWindow:sender];\n    [self.tableView reloadData];\n    [self.contentView setHidden:YES];\n    if (self.autoReplyModels && self.autoReplyModels.count == 0) {\n        [self addModel];\n    }\n    if (self.autoReplyModels.count > 0 && self.tableView) {\n         [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:self.autoReplyModels.count - 1] byExtendingSelection:YES];\n    }\n}\n\n- (void)initSubviews {\n    NSScrollView *scrollView = ({\n        NSScrollView *scrollView = [[NSScrollView alloc] init];\n        scrollView.hasVerticalScroller = YES;\n        scrollView.frame = NSMakeRect(30, 50, 200, 375);\n        scrollView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;\n        \n        scrollView;\n    });\n    \n    self.tableView = ({\n        NSTableView *tableView = [[NSTableView alloc] init];\n        tableView.frame = scrollView.bounds;\n        tableView.allowsTypeSelect = YES;\n        tableView.delegate = self;\n        tableView.dataSource = self;\n        NSTableColumn *column = [[NSTableColumn alloc] init];\n        column.title = TKLocalizedString(@\"assistant.autoReply.list\");\n        column.width = 200;\n        [tableView addTableColumn:column];\n        \n        tableView;\n    });\n    \n    self.contentView = ({\n        TKAutoReplyContentView *contentView = [[TKAutoReplyContentView alloc] init];\n        contentView.frame = NSMakeRect(250, 50, 400, 375);\n        contentView.hidden = YES;\n        \n        contentView;\n    });\n    \n    self.addButton = ({\n        NSButton *btn = [NSButton tk_buttonWithTitle:@\"＋\" target:self action:@selector(addModel)];\n        btn.frame = NSMakeRect(30, 10, 40, 40);\n        btn.bezelStyle = NSBezelStyleTexturedRounded;\n        \n        btn;\n    });\n    \n    self.reduceButton = ({\n        NSButton *btn = [NSButton tk_buttonWithTitle:@\"－\" target:self action:@selector(reduceModel)];\n        btn.frame = NSMakeRect(80, 10, 40, 40);\n        btn.bezelStyle = NSBezelStyleTexturedRounded;\n        btn.enabled = NO;\n        \n        btn;\n    });\n    \n    self.enableButton = ({\n        NSButton *btn = [NSButton tk_checkboxWithTitle:TKLocalizedString(@\"assistant.autoReply.enable\") target:self action:@selector(clickEnableBtn:)];\n        btn.frame = NSMakeRect(130, 20, 130, 20);\n        btn.state = [[TKWeChatPluginConfig sharedConfig] autoReplyEnable];\n        \n        btn;\n    });\n    \n    self.alert = ({\n        NSAlert *alert = [[NSAlert alloc] init];\n        [alert addButtonWithTitle:TKLocalizedString(@\"assistant.autoReply.alert.confirm\")];\n        [alert setMessageText:TKLocalizedString(@\"assistant.autoReply.alert.title\")];\n        [alert setInformativeText:TKLocalizedString(@\"assistant.autoReply.alert.content\")];\n        \n        alert;\n    });\n    \n    scrollView.contentView.documentView = self.tableView;\n    \n    [self.window.contentView addSubviews:@[scrollView,\n                                           self.contentView,\n                                           self.addButton,\n                                           self.reduceButton,\n                                           self.enableButton]];\n}\n\n- (void)setup {\n    self.window.title = TKLocalizedString(@\"assistant.autoReply.title\");\n    self.window.contentView.layer.backgroundColor = [NSColor windowBackgroundColor].CGColor;\n    [self.window.contentView.layer setNeedsDisplay];\n    \n    self.lastSelectIndex = -1;\n    self.autoReplyModels = [[TKWeChatPluginConfig sharedConfig] autoReplyModels];\n    [self.tableView reloadData];\n    \n    __weak typeof(self) weakSelf = self;\n    self.contentView.endEdit = ^(void) {\n        [weakSelf.tableView reloadData];\n        if (weakSelf.lastSelectIndex != -1) {\n            [weakSelf.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:weakSelf.lastSelectIndex] byExtendingSelection:YES];\n        }\n    };\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowShouldClosed:) name:NSWindowWillCloseNotification object:nil];\n}\n\n/**\n 关闭窗口事件\n \n */\n- (void)windowShouldClosed:(NSNotification *)notification {\n    if (notification.object != self.window) {\n        return;\n    }\n    [[TKWeChatPluginConfig sharedConfig] saveAutoReplyModels];\n\n}\n\n- (void)dealloc {\n    [[NSNotificationCenter defaultCenter] removeObserver:self];\n}\n\n#pragma mark - addButton & reduceButton ClickAction\n- (void)addModel {\n    if (self.contentView.hidden) {\n        self.contentView.hidden = NO;\n    }\n    __block NSInteger emptyModelIndex = -1;\n    [self.autoReplyModels enumerateObjectsUsingBlock:^(TKAutoReplyModel *model, NSUInteger idx, BOOL * _Nonnull stop) {\n        if (model.hasEmptyKeywordOrReplyContent) {\n            emptyModelIndex = idx;\n            *stop = YES;\n        }\n    }];\n    \n    if (self.autoReplyModels.count > 0 && emptyModelIndex != -1) {\n        [self.alert beginSheetModalForWindow:self.window completionHandler:^(NSModalResponse returnCode) {\n            if(returnCode == NSAlertFirstButtonReturn){\n                if (self.tableView.selectedRow != -1) {\n                    [self.tableView deselectRow:self.tableView.selectedRow];\n                }\n                [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:emptyModelIndex] byExtendingSelection:YES];\n            }\n        }];\n        return;\n    };\n    \n    TKAutoReplyModel *model = [[TKAutoReplyModel alloc] init];\n    [self.autoReplyModels addObject:model];\n    [self.tableView reloadData];\n    self.contentView.model = model;\n    \n    [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:self.autoReplyModels.count - 1] byExtendingSelection:YES];\n}\n\n- (void)reduceModel {\n    NSInteger index = self.tableView.selectedRow;\n    if (index > -1) {\n        [self.autoReplyModels removeObjectAtIndex:index];\n        [self.tableView reloadData];\n        if (self.autoReplyModels.count == 0) {\n            self.contentView.hidden = YES;\n            self.reduceButton.enabled = NO;\n        } else {\n            [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:self.autoReplyModels.count - 1] byExtendingSelection:YES];\n        }\n    }\n}\n\n- (void)clickEnableBtn:(NSButton *)btn {\n    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFY_AUTO_REPLY_CHANGE object:nil];\n}\n\n#pragma mark - NSTableViewDataSource && NSTableViewDelegate\n- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {\n    return self.autoReplyModels.count;\n}\n\n- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {\n    TKAutoReplyCell *cell = [[TKAutoReplyCell alloc] init];\n    cell.frame = NSMakeRect(0, 0, self.tableView.frame.size.width, 40);\n    cell.model = self.autoReplyModels[row];\n     __weak typeof(self) weakSelf = self;\n    cell.updateModel = ^{\n        weakSelf.contentView.model = weakSelf.autoReplyModels[row];\n    };\n    return cell;\n}\n\n- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row {\n    return 50;\n}\n\n- (void)tableViewSelectionDidChange:(NSNotification *)notification {\n    NSTableView *tableView = notification.object;\n    self.contentView.hidden = tableView.selectedRow == -1;\n    self.reduceButton.enabled = tableView.selectedRow != -1;\n    \n    if (tableView.selectedRow != -1) {\n        TKAutoReplyModel *model = self.autoReplyModels[tableView.selectedRow];\n        self.contentView.model = model;\n        self.lastSelectIndex = tableView.selectedRow;\n        __block NSInteger emptyModelIndex = -1;\n        [self.autoReplyModels enumerateObjectsUsingBlock:^(TKAutoReplyModel *model, NSUInteger idx, BOOL * _Nonnull stop) {\n            if (model.hasEmptyKeywordOrReplyContent) {\n                emptyModelIndex = idx;\n                *stop = YES;\n            }\n        }];\n        \n        if (emptyModelIndex != -1 && tableView.selectedRow != emptyModelIndex) {\n            [self.alert beginSheetModalForWindow:self.window completionHandler:^(NSModalResponse returnCode) {\n                if(returnCode == NSAlertFirstButtonReturn){\n                    if (self.tableView.selectedRow != -1) {\n                        [self.tableView deselectRow:self.tableView.selectedRow];\n                    }\n                    [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:emptyModelIndex] byExtendingSelection:YES];\n                }\n            }];\n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/AutoReply/TKAutoReplyWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"12120\" systemVersion=\"16E195\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"12120\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"TKAutoReplyWindowController\">\n            <connections>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"668\" height=\"452\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1280\" height=\"778\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"668\" height=\"452\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"-52.5\" y=\"145.5\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/Download/TKDownloadWindowController.h",
    "content": "//\n//  TKDownloadWindowController.h\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/28.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface TKDownloadWindowController : NSWindowController\n\n+ (instancetype)downloadWindowController;\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/Download/TKDownloadWindowController.m",
    "content": "//\n//  TKDownloadWindowController.m\n//  WeChatPlugin\n//\n//  Created by TK on 2018/4/28.\n//  Copyright © 2018年 tk. All rights reserved.\n//\n\n#import \"TKDownloadWindowController.h\"\n#import \"TKVersionManager.h\"\n#import \"TKRemoteControlManager.h\"\n\ntypedef NS_ENUM(NSUInteger, TKDownloadState) {\n    TKDownloadStateProgress,\n    TKDownloadStateFinish,\n    TKDownloadStateError,\n};\n\n@interface TKDownloadWindowController ()\n\n@property (weak) IBOutlet NSTextField *titleLabel;\n@property (weak) IBOutlet NSButton *installButton;\n@property (weak) IBOutlet NSProgressIndicator *progressView;\n@property (weak) IBOutlet NSTextField *progressLabel;\n@property (nonatomic, assign) TKDownloadState downloadState;\n@property (nonatomic, copy) NSString *filePath;\n\n@end\n\n@implementation TKDownloadWindowController\n\n+ (instancetype)downloadWindowController {\n    static TKDownloadWindowController *windowController = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        windowController = [[TKDownloadWindowController alloc] initWithWindowNibName:@\"TKDownloadWindowController\"];\n    });\n    return windowController;\n}\n\n- (void)windowDidLoad {\n    [super windowDidLoad];\n    \n    [self setup];\n}\n\n- (void)setup {\n    [self downloadPlugin];\n}\n\n- (void)setupInstallBtnTitle:(NSString *)text {\n    self.installButton.title = text;\n    \n    CGFloat stringWidth = [text widthWithFont:self.installButton.font];\n    self.installButton.width = stringWidth + 40;\n    self.installButton.x = 430 - stringWidth - 40;\n}\n\n- (void)downloadPlugin {\n    self.downloadState = TKDownloadStateProgress;\n    self.window.title = TKLocalizedString(@\"assistant.download.title\");\n    self.titleLabel.stringValue = TKLocalizedString(@\"assistant.download.update\");\n    self.progressView.doubleValue = 0;\n    [self setupInstallBtnTitle:TKLocalizedString(@\"assistant.download.cancel\")];\n    \n    [[TKVersionManager shareManager] downloadPluginProgress:^(NSProgress *downloadProgress) {\n        dispatch_async(dispatch_get_main_queue(), ^{\n            self.progressView.minValue = 0;\n            self.progressView.maxValue = downloadProgress.totalUnitCount / 1024.0;\n            self.progressView.doubleValue = downloadProgress.completedUnitCount  / 1024.0;\n            CGFloat currentCount = downloadProgress.completedUnitCount / 1024.0 / 1024.0;\n            CGFloat totalCount = downloadProgress.totalUnitCount / 1024.0 / 1024.0;\n            self.progressLabel.stringValue = [NSString stringWithFormat:@\"%.2lf MB / %.2lf MB\", currentCount, totalCount];\n        });\n    } completionHandler:^(NSString *filePath, NSError * _Nullable error) {\n        dispatch_async(dispatch_get_main_queue(), ^{\n            if (error) {\n                self.downloadState = TKDownloadStateError;\n                if (error.code == NSURLErrorCancelled) {\n                    self.titleLabel.stringValue = TKLocalizedString(@\"assistant.download.cancelTitle\");\n                    [self setupInstallBtnTitle:TKLocalizedString(@\"assistant.download.reDownload\")];\n                    self.progressLabel.stringValue = @\"\";\n                } else {\n                    self.titleLabel.stringValue = TKLocalizedString(@\"assistant.download.error\");\n                    [self setupInstallBtnTitle:TKLocalizedString(@\"assistant.download.reInstall\")];\n                }\n                return;\n            }\n            self.downloadState = TKDownloadStateFinish;\n            [self setupInstallBtnTitle:TKLocalizedString(@\"assistant.download.relaunch\")];\n            self.titleLabel.stringValue = TKLocalizedString(@\"assistant.download.install\");\n            self.filePath = filePath;\n        });\n    }];\n}\n\n- (IBAction)clickInstallButton:(NSButton *)sender {\n    switch (self.downloadState) {\n        case TKDownloadStateProgress: {\n            [[TKVersionManager shareManager] cancelDownload];\n            break;\n        }\n        case TKDownloadStateFinish: {\n            NSString *directoryName = [self.filePath stringByDeletingLastPathComponent];\n            NSString *fileName = [[self.filePath lastPathComponent] stringByDeletingPathExtension];\n            NSString *cmdString = [NSString stringWithFormat:@\"cd %@ && unzip -n %@.zip && ./%@/Other/Update.sh && killall WeChat && sleep 2s && open /Applications/WeChat.app\",directoryName, fileName, fileName];\n            [TKRemoteControlManager executeShellCommand:cmdString];\n            break;\n        }\n        case TKDownloadStateError: {\n            [self downloadPlugin];\n            break;\n        }\n        default:\n            break;\n    }\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/Download/TKDownloadWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14109\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14109\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"TKDownloadWindowController\">\n            <connections>\n                <outlet property=\"installButton\" destination=\"w8i-aV-lxW\" id=\"qcn-zb-pYb\"/>\n                <outlet property=\"progressLabel\" destination=\"K0H-A9-vS1\" id=\"9Xf-UC-JLq\"/>\n                <outlet property=\"progressView\" destination=\"BAg-So-MZF\" id=\"PUO-s8-892\"/>\n                <outlet property=\"titleLabel\" destination=\"zqF-Us-xe7\" id=\"3NM-jA-q7Z\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"460\" height=\"143\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1280\" height=\"778\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"460\" height=\"143\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <progressIndicator wantsLayer=\"YES\" fixedFrame=\"YES\" maxValue=\"100\" style=\"bar\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BAg-So-MZF\">\n                        <rect key=\"frame\" x=\"37\" y=\"72\" width=\"387\" height=\"20\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                    </progressIndicator>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zqF-Us-xe7\">\n                        <rect key=\"frame\" x=\"35\" y=\"96\" width=\"238\" height=\"27\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" id=\"Y5h-Y6-YSS\">\n                            <font key=\"font\" size=\"15\" name=\".PingFangSC-Regular\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"w8i-aV-lxW\">\n                        <rect key=\"frame\" x=\"343\" y=\"22\" width=\"87\" height=\"32\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"push\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" inset=\"2\" id=\"tXt-Nk-lG1\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\" size=\"14\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"clickInstallButton:\" target=\"-2\" id=\"U6z-l7-DBw\"/>\n                        </connections>\n                    </button>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"K0H-A9-vS1\">\n                        <rect key=\"frame\" x=\"35\" y=\"28\" width=\"168\" height=\"24\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" id=\"CHt-Ww-Gux\">\n                            <font key=\"font\" size=\"14\" name=\".PingFangSC-Regular\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"149\" y=\"98.5\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/RemoteControl/Base.lproj/TKRemoteControlWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14109\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14109\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"TKRemoteControlWindowController\">\n            <connections>\n                <outlet property=\"tabView\" destination=\"WoN-94-FsZ\" id=\"RoF-ij-bGy\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Remote Control Setting\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"670\" height=\"520\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1280\" height=\"778\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"670\" height=\"520\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <tabView fixedFrame=\"YES\" drawsBackground=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WoN-94-FsZ\">\n                        <rect key=\"frame\" x=\"20\" y=\"43\" width=\"630\" height=\"445\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <font key=\"font\" metaFont=\"system\"/>\n                        <tabViewItems>\n                            <tabViewItem label=\"Macbook\" identifier=\"0\" id=\"sNP-nR-n56\">\n                                <view key=\"view\" ambiguous=\"YES\" id=\"IAk-5N-FY9\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lv9-ri-gWd\">\n                                            <rect key=\"frame\" x=\"115\" y=\"17\" width=\"300\" height=\"17\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Now remote control support voice recognition\" id=\"JDf-Rp-jEj\">\n                                                <font key=\"font\" size=\"13\" name=\".PingFangSC-Medium\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </subviews>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"APP\" identifier=\"1\" id=\"kWv-JR-wGj\">\n                                <view key=\"view\" id=\"iVA-JL-GJu\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"NeteaseMusic\" identifier=\"2\" id=\"pJO-yQ-9vs\">\n                                <view key=\"view\" id=\"FCO-eB-j0J\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kwl-L5-YwP\">\n                                            <rect key=\"frame\" x=\"17\" y=\"17\" width=\"577\" height=\"17\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Allow WeChat Control in &quot;System Preferences-Security &amp; Privacy-Privacy-Accessibility&quot;\" id=\"qpH-CW-UVl\">\n                                                <font key=\"font\" size=\"13\" name=\".PingFangSC-Medium\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </subviews>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"Assistant\" identifier=\"3\" id=\"5Vc-7I-XmY\">\n                                <view key=\"view\" id=\"1oJ-Fj-CIe\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                </view>\n                            </tabViewItem>\n                        </tabViewItems>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"-2\" id=\"gLJ-15-ouy\"/>\n                        </connections>\n                    </tabView>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"J1L-Ly-Rmw\">\n                        <rect key=\"frame\" x=\"25\" y=\"16\" width=\"117\" height=\"26\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"⚠️Attention: \" id=\"pyh-Mz-b2h\">\n                            <font key=\"font\" size=\"13\" name=\"AppleColorEmoji\"/>\n                            <color key=\"textColor\" red=\"0.95428575227915313\" green=\"0.054907046790266048\" blue=\"0.027834490462353378\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Koj-RI-ARh\">\n                        <rect key=\"frame\" x=\"123\" y=\"20\" width=\"376\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Remote Control is available only when send it to yourself \" id=\"EiN-zX-6I8\">\n                            <font key=\"font\" size=\"13\" name=\".PingFangSC-Medium\"/>\n                            <color key=\"textColor\" name=\"controlShadowColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/RemoteControl/TKRemoteControlWindowController.h",
    "content": "//\n//  TKRemoteControlWindowController.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/8.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface TKRemoteControlWindowController : NSWindowController\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/RemoteControl/TKRemoteControlWindowController.m",
    "content": "//\n//  TKRemoteControlWindowController.m\n//  WeChatPlugin\n//\n//  Created by TK on 2017/8/8.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import \"TKRemoteControlWindowController.h\"\n#import \"TKRemoteControlModel.h\"\n#import \"TKWeChatPluginConfig.h\"\n#import \"TKRemoteControlCell.h\"\n\n@interface TKRemoteControlWindowController () <NSWindowDelegate, NSTabViewDelegate, NSTableViewDelegate, NSTableViewDataSource>\n\n@property (nonatomic, weak) IBOutlet NSTabView *tabView;\n@property (nonatomic, strong) NSTableView *tableView;\n@property (nonatomic, strong) NSArray *remoteControlModels;\n\n@end\n\n@implementation TKRemoteControlWindowController\n\n- (void)windowDidLoad {\n    [super windowDidLoad];\n\n    [self setup];\n    [self initSubviews];\n}\n\n- (void)initSubviews {\n    CGFloat scrollViewWidth = self.tabView.frame.size.width -100;\n    CGFloat scrollViewHeight = self.tabView.frame.size.height -110;\n    \n    self.tableView = ({\n        NSTableView *tableView = [[NSTableView alloc] init];\n        tableView.frame = NSMakeRect(0, 0, scrollViewWidth, scrollViewHeight);\n        tableView.headerView = nil;\n        tableView.delegate = self;\n        tableView.dataSource = self;\n        NSTableColumn *column = [[NSTableColumn alloc] init];\n        column.width = scrollViewWidth - 50;\n        [tableView addTableColumn:column];\n        tableView.selectionHighlightStyle = NSTableViewSelectionHighlightStyleNone;\n        tableView.backgroundColor = [NSColor clearColor];\n\n        tableView;\n    });\n    \n    NSScrollView *scrollView = ({\n        NSScrollView *view = [[NSScrollView alloc] initWithFrame:NSMakeRect(50, 50, scrollViewWidth, scrollViewHeight)];\n        view.documentView = self.tableView;\n        view.hasVerticalScroller = YES;\n        view.autohidesScrollers = YES;\n        view.drawsBackground = NO;\n\n        view;\n    });\n\n    [self.tabView addSubview:scrollView];\n}\n\n- (void)setup {\n    self.window.contentView.layer.backgroundColor = [NSColor windowBackgroundColor].CGColor;\n    [self.window.contentView.layer setNeedsDisplay];\n    self.remoteControlModels = [[TKWeChatPluginConfig sharedConfig] remoteControlModels][0];\n}\n\n/**\n 关闭窗口事件\n\n */\n- (BOOL)windowShouldClose:(id)sender {\n    [[TKWeChatPluginConfig sharedConfig] saveRemoteControlModels];\n    return YES;\n}\n\n#pragma mark - NSTableViewDataSource && NSTableViewDelegate\n- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{\n    return self.remoteControlModels.count;\n}\n\n- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{\n    TKRemoteControlCell *cell = [[TKRemoteControlCell alloc] init];\n    cell.frame = NSMakeRect(0, 0, self.tabView.frame.size.width, 40);\n    [cell setupWithData:self.remoteControlModels[row]];\n\n    return cell;\n}\n\n- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row{\n    return 50;\n}\n\n#pragma mark - NSTabViewDelegate\n- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem {\n    NSInteger selectTabIndex = [tabViewItem.identifier integerValue];\n    self.remoteControlModels = [[TKWeChatPluginConfig sharedConfig] remoteControlModels][selectTabIndex];\n    [self.tableView reloadData];\n}\n\n@end\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/RemoteControl/zh-Hans.lproj/TKRemoteControlWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14109\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14109\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"TKRemoteControlWindowController\">\n            <connections>\n                <outlet property=\"tabView\" destination=\"WoN-94-FsZ\" id=\"RoF-ij-bGy\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"远程控制设置\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"670\" height=\"520\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1280\" height=\"778\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"670\" height=\"520\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <tabView fixedFrame=\"YES\" drawsBackground=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WoN-94-FsZ\">\n                        <rect key=\"frame\" x=\"20\" y=\"43\" width=\"630\" height=\"445\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <font key=\"font\" metaFont=\"system\"/>\n                        <tabViewItems>\n                            <tabViewItem label=\"macbook\" identifier=\"0\" id=\"sNP-nR-n56\">\n                                <view key=\"view\" id=\"IAk-5N-FY9\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lv9-ri-gWd\">\n                                            <rect key=\"frame\" x=\"143\" y=\"17\" width=\"164\" height=\"17\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"小助手已支持语音远程控制\" id=\"JDf-Rp-jEj\">\n                                                <font key=\"font\" size=\"13\" name=\".PingFangSC-Medium\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </subviews>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"app控制\" identifier=\"1\" id=\"kWv-JR-wGj\">\n                                <view key=\"view\" id=\"iVA-JL-GJu\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"网易云音乐\" identifier=\"2\" id=\"pJO-yQ-9vs\">\n                                <view key=\"view\" id=\"FCO-eB-j0J\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kwl-L5-YwP\">\n                                            <rect key=\"frame\" x=\"26\" y=\"17\" width=\"559\" height=\"17\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"若想使用该功能，请于“系统偏好设置 ==&gt; 安全性与隐私 ==&gt; 隐私 ==&gt; 辅助功能”中添加微信\" id=\"qpH-CW-UVl\">\n                                                <font key=\"font\" size=\"13\" name=\".PingFangSC-Medium\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </subviews>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"小助手\" identifier=\"3\" id=\"lza-eI-NvH\">\n                                <view key=\"view\" ambiguous=\"YES\" id=\"gO3-SA-WEm\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                </view>\n                            </tabViewItem>\n                        </tabViewItems>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"-2\" id=\"gLJ-15-ouy\"/>\n                        </connections>\n                    </tabView>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"J1L-Ly-Rmw\">\n                        <rect key=\"frame\" x=\"25\" y=\"16\" width=\"60\" height=\"26\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"⚠️注意：\" id=\"pyh-Mz-b2h\">\n                            <font key=\"font\" size=\"13\" name=\"AppleColorEmoji\"/>\n                            <color key=\"textColor\" red=\"0.95428575227915313\" green=\"0.054907046790266048\" blue=\"0.027834490462353378\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Koj-RI-ARh\">\n                        <rect key=\"frame\" x=\"77\" y=\"20\" width=\"495\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"为避免误触，远程控制仅在向自己发送指令有效，他人发送或者发送给他人均无效。\" id=\"EiN-zX-6I8\">\n                            <font key=\"font\" size=\"13\" name=\".PingFangSC-Medium\"/>\n                            <color key=\"textColor\" name=\"controlShadowColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "WeChatPlugin/Sources/WindowControllers/RemoteControl/zh-Hant.lproj/TKRemoteControlWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14109\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14109\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"TKRemoteControlWindowController\">\n            <connections>\n                <outlet property=\"tabView\" destination=\"WoN-94-FsZ\" id=\"RoF-ij-bGy\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"遠程控制設置\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"670\" height=\"520\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1280\" height=\"778\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"670\" height=\"520\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <tabView fixedFrame=\"YES\" drawsBackground=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WoN-94-FsZ\">\n                        <rect key=\"frame\" x=\"20\" y=\"43\" width=\"630\" height=\"445\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <font key=\"font\" metaFont=\"system\"/>\n                        <tabViewItems>\n                            <tabViewItem label=\"Macbook\" identifier=\"0\" id=\"sNP-nR-n56\">\n                                <view key=\"view\" id=\"IAk-5N-FY9\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lv9-ri-gWd\">\n                                            <rect key=\"frame\" x=\"115\" y=\"17\" width=\"164\" height=\"17\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"小助手已支持語音遠程控制\" id=\"JDf-Rp-jEj\">\n                                                <font key=\"font\" size=\"13\" name=\".PingFangSC-Medium\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </subviews>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"app控制\" identifier=\"1\" id=\"kWv-JR-wGj\">\n                                <view key=\"view\" id=\"iVA-JL-GJu\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"網易雲音樂\" identifier=\"2\" id=\"pJO-yQ-9vs\">\n                                <view key=\"view\" id=\"FCO-eB-j0J\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kwl-L5-YwP\">\n                                            <rect key=\"frame\" x=\"17\" y=\"17\" width=\"559\" height=\"17\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"若想使用該功能，請於“系統偏好設置 ==&gt; 安全性與隱私 ==&gt; 隱私 ==&gt; 輔助功能”中添加微信\" id=\"qpH-CW-UVl\">\n                                                <font key=\"font\" size=\"13\" name=\".PingFangSC-Medium\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                    </subviews>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"小助手\" identifier=\"3\" id=\"5Vc-7I-XmY\">\n                                <view key=\"view\" ambiguous=\"YES\" id=\"1oJ-Fj-CIe\">\n                                    <rect key=\"frame\" x=\"10\" y=\"33\" width=\"610\" height=\"399\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                </view>\n                            </tabViewItem>\n                        </tabViewItems>\n                        <connections>\n                            <outlet property=\"delegate\" destination=\"-2\" id=\"gLJ-15-ouy\"/>\n                        </connections>\n                    </tabView>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"J1L-Ly-Rmw\">\n                        <rect key=\"frame\" x=\"25\" y=\"16\" width=\"60\" height=\"26\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"⚠️註意：\" id=\"pyh-Mz-b2h\">\n                            <font key=\"font\" size=\"13\" name=\"AppleColorEmoji\"/>\n                            <color key=\"textColor\" red=\"0.95428575227915313\" green=\"0.054907046790266048\" blue=\"0.027834490462353378\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Koj-RI-ARh\">\n                        <rect key=\"frame\" x=\"82\" y=\"20\" width=\"495\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"為避免誤觸，遠程控制僅在向自己發送指令有效，他人發送或者發送給他人均無效。\" id=\"EiN-zX-6I8\">\n                            <font key=\"font\" size=\"13\" name=\".PingFangSC-Medium\"/>\n                            <color key=\"textColor\" name=\"controlShadowColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "WeChatPlugin/WeChatPlugin.h",
    "content": "//\n//  WeChatPlugin.h\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n#import \"TKWeChatPluginConfig.h\"\n#import \"TKHelper.h\"\n\nFOUNDATION_EXPORT double WeChatPluginVersionNumber;\nFOUNDATION_EXPORT const unsigned char WeChatPluginVersionString[];\n\n@class WCContactData;\n\n#pragma mark - 微信原始的部分类与方法\n\n@interface MMSystemLinkInfo : NSObject\n@property(retain, nonatomic) NSMutableAttributedString *msgContent;\n\n@end\n@interface MMContactProfileController : NSViewController\n@property(copy, nonatomic) NSString *groupName;\n@property(nonatomic) struct CGRect relativeToRect;\n@property(nonatomic) unsigned long long preferredEdge;\n@property(retain, nonatomic) WCContactData *contactData;\n- (void)sendGetContactRequest:(id)arg1 withGroupName:(id)arg2;\n- (void)showInView:(id)arg1;\n@end\n\n\n@interface MMBrandChatsViewController : NSObject\n- (void)startChatWithContact:(id)arg1;\n@end\n\n@interface MMLoginOneClickViewController : NSViewController\n@property(nonatomic) NSTextField *descriptionLabel;\n- (void)onLoginButtonClicked:(id)arg1;\n@property(nonatomic) NSButton *loginButton;\n@end\n\n@interface AccountService : NSObject\n- (id)GetLastLoginUserName;\n- (id)GetLastLoginAutoAuthKey;\n- (BOOL)canAutoAuth;\n- (void)AutoAuth;\n- (void)ManualLogin:(id)arg1 withPassword:(id)arg2;\n- (void)ManualLogout;\n- (void)FFAddSvrMsgImgVCZZ;\n- (void)QRCodeLoginWithUserName:(id)arg1 password:(id)arg2;\n- (void)onAuthOKOfUser:(id)arg1 withSessionKey:(id)arg2 withServerId:(id)arg3 autoAuthKey:(id)arg4 isAutoAuth:(BOOL)arg5;\n@end\n\n@interface MMLoginViewController : NSObject\n@property(retain, nonatomic) MMLoginOneClickViewController *oneClickViewController;\n@end\n\n@interface MMHandoffButton : NSView\n@end\n\n@interface MMMainViewController : NSObject\n@property(nonatomic) __weak MMHandoffButton *handoffButton;\n@end\n\n@interface MMMainWindowController : NSWindowController\n@property(retain, nonatomic) MMLoginViewController *loginViewController;\n@property(retain, nonatomic) MMMainViewController *mainViewController;\n- (void)onAuthOK;\n- (void)onLogOut;\n@end\n\n@interface MMVoiceTranscribeCGI : NSObject\n- (void)transcribeVoiceMessage:(id)arg1 withCompletion:(void (^)(void))arg2;\n@end\n\n@interface FFProcessReqsvrZZ : NSObject\n- (void)onRevokeMsg:(id)arg1;\n- (void)FFToNameFavChatZZ:(id)arg1;\n- (void)FFToNameFavChatZZ:(id)arg1 sessionMsgList:(id)arg2;\n- (void)OnSyncBatchAddMsgs:(NSArray *)arg1 isFirstSync:(BOOL)arg2;\n- (void)FFImgToOnFavInfoInfoVCZZ:(id)arg1 isFirstSync:(BOOL)arg2;\n- (id)FFProcessTReqZZ:(id)arg1 toUsrName:(id)arg2 msgText:(id)arg3 atUserList:(id)arg4;\n- (id)GetMsgData:(id)arg1 svrId:(long)arg2;\n- (void)AddLocalMsg:(id)arg1 msgData:(id)arg2;\n- (void)TranscribeVoiceMessage:(id)arg1 completion:(void (^)(void))arg2;\n- (BOOL)ClearUnRead:(id)arg1 FromID:(unsigned int)arg2 ToID:(unsigned int)arg3;\n- (BOOL)ClearUnRead:(id)arg1 FromCreateTime:(unsigned int)arg2 ToCreateTime:(unsigned int)arg3;\n- (BOOL)HasMsgInChat:(id)arg1;\n- (id)GetMsgListWithChatName:(id)arg1 fromCreateTime:(unsigned int)arg2 localId:(NSInteger)arg3 limitCnt:(NSInteger)arg4 hasMore:(char *)arg5 sortAscend:(BOOL)arg6;\n- (void)DelMsg:(id)arg1 msgList:(id)arg2 isDelAll:(BOOL)arg3 isManual:(BOOL)arg4;\n@end\n\n@interface MMServiceCenter : NSObject\n+ (id)defaultCenter;\n- (id)getService:(Class)arg1;\n@end\n\n@interface SKBuiltinString_t : NSObject\n@property(retain, nonatomic, setter=SetString:) NSString *string; // @synthesize string;\n@end\n\n@interface AddMsg : NSObject\n@property(retain, nonatomic, setter=SetContent:) SKBuiltinString_t *content; // @synthesize content;\n@property(retain, nonatomic, setter=SetFromUserName:) SKBuiltinString_t *fromUserName; // @synthesize fromUserName;\n@property(nonatomic, setter=SetMsgType:) int msgType; // @synthesize msgType;\n@property(retain, nonatomic, setter=SetToUserName:) SKBuiltinString_t *toUserName; // @synthesize toUserName;\n@property (nonatomic, assign) unsigned int createTime;\n@property(nonatomic, setter=SetNewMsgId:) long long newMsgId;\n@end\n\n@interface MMChatMessageViewController : NSViewController\n@property(retain, nonatomic) WCContactData *chatContact;\n@property(nonatomic) __weak NSTableView *messageTableView;\n- (void)scrollToMessage:(NSUInteger)arg1;\n- (BOOL)showLocatedMessage:(NSUInteger)arg1;\n- (BOOL)showLocatedMessage:(unsigned int)arg1 needHighLighted:(BOOL)arg2;\n- (void)onClickSession;\n- (void)reloadTableView;\n@end\n\n@interface MMChatDetailSplitViewController : NSObject\n@property(retain, nonatomic) MMChatMessageViewController *chatMessageViewController;\n@end\n\n@interface MMChatsViewController : NSViewController <NSTableViewDataSource, NSTableViewDelegate>\n@property(nonatomic) __weak NSTableView *tableView;\n@property(retain, nonatomic) MMBrandChatsViewController *brandChatsViewController;\n@property(retain, nonatomic) MMChatDetailSplitViewController *chatDetailSplitViewController;\n@end\n\n@interface WeChat : NSObject\n+ (id)sharedInstance;\n@property(nonatomic) MMChatsViewController *chatsViewController;\n@property(retain, nonatomic) MMMainWindowController *mainWindowController;\n@property(nonatomic) BOOL isAppTerminating;\n@property(nonatomic) BOOL hasAuthOK;\n- (void)startANewChatWithContact:(id)arg1;\n- (void)_clearAllUnreadMessages:(id)arg1;\n- (void)onAuthOK:(BOOL)arg1;\n- (void)checkForUpdatesInBackground;\n- (void)FFAddRecvFavZZ:(BOOL)arg1;\n@end\n\n@interface ContactStorage : NSObject\n- (id)GetSelfContact;\n- (id)GetContact:(id)arg1;\n- (id)GetAllBrandContacts;\n- (id)GetAllFavContacts;\n- (id)GetAllFriendContacts;\n@end\n\n@interface GroupStorage : NSObject\n{\n    NSMutableDictionary *m_dictGroupContacts;\n}\n- (id)GetAllGroups;\n- (id)GetGroupMemberContact:(id)arg1;\n- (void)notifyModifyGroupContactsOnMainThread:(id)arg1;\n//- (id)GetGroupMemberListWithGroupContact:(id)arg1;\n- (id)GetGroupMemberListWithGroupContact:(id)arg1 limit:(unsigned int)arg2 filterSelf:(BOOL)arg3;\n@end\n\n@interface ChatRoomData : NSObject\n{\n    NSMutableDictionary *m_dicData;\n}\n@end\n\n@interface WCContactData : NSObject\n@property(retain, nonatomic) NSString *m_nsUsrName; // @synthesize m_nsUsrName;\n@property(nonatomic) unsigned int m_uiFriendScene;  // @synthesize m_uiFriendScene;\n@property(retain, nonatomic) NSString *m_nsNickName;    // 用户昵称\n@property(retain, nonatomic) NSString *m_nsRemark;      // 备注\n@property(retain, nonatomic) NSString *m_nsHeadImgUrl;  // 头像\n@property(retain, nonatomic) NSString *m_nsHeadHDImgUrl;\n@property(retain, nonatomic) NSString *m_nsHeadHDMd5;\n@property(retain, nonatomic) NSString *m_nsAliasName;\n@property(retain, nonatomic) NSString *avatarCacheKey;\n@property(readonly, nonatomic) unsigned long long groupMemberCount;\n@property(retain, nonatomic) ChatRoomData *m_chatRoomData;\n@property(nonatomic) BOOL m_isShowRedDot;\n- (BOOL)isBrandContact;\n- (BOOL)isSelf;\n- (id)innerGetGroupDisplayName;\n- (NSString *)groupChatDisplayNameInGroup:(id)arg1;\n- (id)getContactDisplayUsrName;\n- (BOOL)isGroupChat;\n- (BOOL)isMMChat;\n- (BOOL)isMMContact;\n- (BOOL)containsMember:(id)arg1;\n- (id)displayRegion;\n- (BOOL)isStickyFolder;\n@end\n\n@interface WCPayInfoItem : NSObject\n@property(retain, nonatomic) NSString *m_nsFeeDesc;\n@end\n\n@interface MessageData : NSObject\n- (id)initWithMsgType:(long long)arg1;\n@property(retain, nonatomic) NSString *fromUsrName;\n@property(retain, nonatomic) NSString *toUsrName;\n@property(retain, nonatomic) NSString *msgContent;\n@property(retain, nonatomic) NSString *msgPushContent;\n@property(retain, nonatomic) NSString *realChatUserName;\n@property(retain, nonatomic) WCPayInfoItem *m_oWCPayInfoItem; // @dynamic m_oWCPayInfoItem;\n@property(retain, nonatomic) NSString *m_nsAppName;\n@property(retain, nonatomic) NSString *m_nsSourceDisplayname;\n@property(nonatomic) int messageType;\n@property(nonatomic) int msgStatus;\n@property(nonatomic) int msgCreateTime;\n@property(nonatomic) int mesLocalID;\n@property(nonatomic) long long mesSvrID;\n@property(retain, nonatomic) NSString *msgVoiceText;\n@property(copy, nonatomic) NSString *m_nsEmoticonMD5;\n- (BOOL)isChatRoomMessage;\n- (NSString *)groupChatSenderDisplayName;\n- (id)getRealMessageContent;\n- (id)getChatRoomUsrName;\n- (BOOL)isSendFromSelf;\n- (BOOL)isCustomEmojiMsg;\n- (BOOL)isImgMsg;\n- (BOOL)isVideoMsg;\n- (BOOL)isVoiceMsg;\n- (BOOL)canForward;\n- (BOOL)IsPlayingSound;\n- (id)summaryString:(BOOL)arg1;\n- (BOOL)isEmojiAppMsg;\n- (BOOL)isAppBrandMsg;\n- (BOOL)IsUnPlayed;\n- (void)SetPlayed;\n@property(retain, nonatomic) NSString *m_nsTitle;\n- (id)originalImageFilePath;\n@property(retain, nonatomic) NSString *m_nsVideoPath;\n@property(retain, nonatomic) NSString *m_nsFilePath;\n@property(retain, nonatomic) NSString *m_nsAppMediaUrl;\n@property(nonatomic) MessageData *m_refMessageData;\n@property(nonatomic) unsigned int m_uiDownloadStatus;\n- (void)SetPlayingSoundStatus:(BOOL)arg1;\n@end\n\n@interface CUtility : NSObject\n+ (BOOL)HasWechatInstance;\n+ (BOOL)FFSvrChatInfoMsgWithImgZZ;\n+ (unsigned long long)getFreeDiskSpace;\n+ (void)ReloadSessionForMsgSync;\n+ (id)GetCurrentUserName;\n+ (id)GetContactByUsrName:(id)arg1;\n+ (BOOL)IsStickyChatsFolder:(id)arg1;\n@end\n\n@interface MMSessionInfoPackedInfo: NSObject\n@property(retain, nonatomic) WCContactData *m_contact;\n@property(retain, nonatomic) MessageData *m_msgData;\n@end\n\n@interface MMSessionInfo : NSObject\n@property(nonatomic) BOOL m_bIsTop; // @synthesize m_bIsTop;\n@property(nonatomic) BOOL m_bShowUnReadAsRedDot;\n@property(nonatomic) BOOL m_isMentionedUnread; // @synthesize\n@property BOOL isInGroupBox; \n@property(retain, nonatomic) NSString *m_nsUserName; // @synthesize m_nsUserName;\n@property(retain, nonatomic) MMSessionInfoPackedInfo *m_packedInfo;\n@property(nonatomic) unsigned int m_uUnReadCount; \n@end\n\n@protocol MMChatsTableCellViewDelegate <NSObject>\n@optional\n- (void)cellViewReloadData:(MMSessionInfo *)arg1;\n@end\n\n@interface MMChatsTableCellView : NSTableCellView\n@property(nonatomic) __weak id <MMChatsTableCellViewDelegate> delegate;\n@property(retain, nonatomic) MMSessionInfo *sessionInfo;\n- (void)menuWillOpen:(id)arg1;\n- (void)contextMenuSticky:(id)arg1;\n- (void)contextMenuDelete:(id)arg1;\n- (void)tableView:(NSTableView *)arg1 rowGotMouseDown:(long long)arg2;\n@end\n\n@interface MMSessionMgr : NSObject\n//@property(retain, nonatomic) NSMutableArray *m_arrSession;\n- (id)getSessionAtIndex:(unsigned long long)arg1;\n- (id)sessionInfoByUserName:(id)arg1;\n- (void)muteSessionByUserName:(id)arg1;\n- (void)onUnReadCountChange:(id)arg1;\n//- (void)TopSessionByUserName:(id)arg1;\n- (void)unmuteSessionByUserName:(id)arg1;\n- (void)untopSessionByUserName:(id)arg1;\n- (void)changeSessionUnreadCountWithUserName:(id)arg1 to:(unsigned int)arg2;\n- (void)removeSessionOfUser:(id)arg1 isDelMsg:(BOOL)arg2;\n- (void)sortSessions;\n- (void)FFDataSvrMgrSvrFavZZ;\n- (id)getContact:(id)arg1;\n- (id)getSessionContact:(id)arg1;\n- (void)onModifyContacts:(id)arg1;\n- (NSMutableArray *)getAllSessions;\n@end\n\n@interface LogoutCGI : NSTableCellView\n- (void)sendLogoutCGIWithCompletion:(id)arg1;\n- (void)FFVCRecvDataAddDataToMsgChatMgrRecvZZ:(id)arg1;\n@end\n\n@interface MMNotificationService : NSObject\n- (id)getNotificationContentWithMsgData:(id)arg1;\n- (void)userNotificationCenter:(id)arg1 didActivateNotification:(id)arg2;\n@end\n\n@interface MMMessageTableItem : NSObject\n@property(retain, nonatomic) MessageData *message;\n@end\n\n@interface MMStickerMessageCellView : NSObject\n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@property(nonatomic) MMChatMessageViewController *delegate;\n- (BOOL)allowCopy;\n- (void)contextMenuCopy;\n- (id)contextMenu;\n@end\n\n@interface MMImageMessageCellView: NSObject\n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@end\n\n@interface MMSystemMessageCellView: NSObject\n@property(nonatomic) id delegate; \n@property(retain, nonatomic) MMMessageTableItem *messageTableItem;\n@property(retain, nonatomic) NSTextView *msgTextView;\n- (void)populateWithMessage:(id)arg1;\n@end\n@interface EmoticonMgr : NSObject\n@property(retain, nonatomic) MessageData *message;\n- (id)getEmotionDataWithMD5:(id)arg1;\n- (id)getEmotionImgWithMD5:(id)arg1;\n- (void)addFavEmoticon:(id)arg1;\n- (void)addEmoticonToUploadQueueWithMD5:(id)arg1;\n- (void)setAppStickerToastViewDelegate:(id)arg1;\n@end\n\n@interface MMComplexContactSearchTaskMgr : NSObject\n+ (id)sharedInstance;\n- (void)doComplexContactSearch:(id)arg1 searchScene:(unsigned long long)arg2 complete:(void (^)(NSString *,NSArray *, NSArray *, NSArray *,id))arg3 cancelable:(BOOL)arg4;\n@end\n\n@interface MMBasicSearchResult : NSObject\n@end\n\n@interface MMSearchResultItem : NSObject\n@property(retain, nonatomic) MMBasicSearchResult *result;\n@end\n\n@interface MMSearchResultContainer : NSObject\n@property(nonatomic) unsigned long long logicSearchResultFlag; // @synthesize\n@end\n\n@interface MMContactSearchLogic : NSObject\n{\n    unsigned long long _logicSearchResultFlag;      // 2.3.19 失效\n}\n@property(retain, nonatomic) NSMutableArray *contactResults;\n- (void)doSearchWithKeyword:(id)arg1 searchScene:(unsigned long long)arg2 resultIsShownBlock:(id)arg3 completion:(id)arg4;\n@property(retain, nonatomic) NSMutableArray *groupResults;\n@property(nonatomic) BOOL isBrandContactSearched;\n@property(nonatomic) BOOL isChatLogSearched;\n@property(nonatomic) BOOL isContactSearched;\n@property(nonatomic) BOOL isGroupContactSearched;\n@property(retain, nonatomic) NSMutableArray *oaResults;\n- (void)clearAllResults;    //  2.3.19 失效\n- (void)clearDataWhenSearchEnd;\n- (void)reloadSearchResultDataWithKeyword:(id)arg1 completionBlock:(id)arg2;    //  2.3.17\n- (void)reloadSearchResultDataWithCompletionBlock:(id)arg1;                     //  2.3.13\n- (void)reloadSearchResultDataWithKeyword:(id)arg1 resultContainer:(id)arg2 completionBlock:(id)arg3;\n@property(retain, nonatomic) MMSearchResultContainer *searchResultContainer;\n@end\n\n@interface MMComplexContactSearchResult : MMBasicSearchResult\n@property(retain, nonatomic) NSString *fieldValue;\n@property(retain, nonatomic) WCContactData *contact;\n@property(nonatomic) unsigned long long fieldType;  // 1：备注 3：昵称 4：微信号  8：省份  7：市  9：国家\n@end\n\n@interface MMComplexGroupContactMembersSearchResult : MMBasicSearchResult\n@property(retain, nonatomic) NSMutableArray<MMComplexContactSearchResult *> *membersSearchReults;\n@end\n\n@interface MMComplexGroupContactSearchResult : MMBasicSearchResult\n@property(nonatomic) unsigned long long searchType;     // 1 名称 2 群成员名称\n@property(retain) WCContactData *groupContact;\n@property(retain, nonatomic) MMComplexGroupContactMembersSearchResult *groupMembersResult;\n@end\n\n@interface MMAvatarService : NSObject\n- (NSString *)avatarCachePath;\n- (id)_getImageFromCacheWithMD5Key:(id)arg1;\n- (void)avatarImageWithContact:(id)arg1 completion:(void (^)(NSImage *image))arg2;\n- (void)getAvatarImageWithContact:(id)arg1 completion:(void (^)(NSImage *image))arg2;\n@end\n\n@interface NSString (MD5)\n- (id)md5String;\n@end\n\n@interface MMSessionPickerLogic : NSObject\n@property(nonatomic) NSArray *selectedUserNames;\n@end\n\n\n@interface MMSessionListView : NSObject\n{\n    MMSessionPickerLogic *m_logic;\n}\n@end\n\n@interface MMSessionPickerWindow : NSWindowController\n+ (id)shareInstance;\n- (void)beginSheetForWindow:(id)arg1 completionHandler:(void(^)(id a1))arg2;\n@property(retain, nonatomic) id choosenViewController; // @synthesize\n@property(retain, nonatomic) id listViewController; // @synthesize\n- (void)setShowsGroupChats:(BOOL)arg1;\n- (void)setShowsOfficialAccounts:(BOOL)arg1;\n- (void)setShowsOtherNonhumanChats:(BOOL)arg1;\n- (void)setType:(unsigned long long)arg1;\n\n@end\n\n@interface AFHTTPResponseSerializer : NSObject\n@end\n\n@interface AFURLSessionManager : NSObject\n- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request\n                                             progress:(void (^)(NSProgress *downloadProgress))downloadProgressBlock\n                                          destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination\n                                    completionHandler:(void (^)(NSURLResponse *response, NSURL * filePath, NSError * error))completionHandler;\n- (id)initWithSessionConfiguration:(id)arg1;\n@end\n\n@interface AFHTTPRequestSerializer : NSObject\n+ (id)serializer;\n@property(nonatomic) unsigned long long cachePolicy;\n@end\n\n@interface AFHTTPSessionManager : NSObject\n+ (AFHTTPSessionManager *)manager;\n@property(retain, nonatomic) AFHTTPRequestSerializer *requestSerializer;\n@property(retain, nonatomic) AFHTTPResponseSerializer *responseSerializer;\n@end\n\n@interface MMURLHandler : NSObject\n+ (id)defaultHandler;\n- (void)startGetA8KeyWithURL:(id)arg1;\n- (BOOL)openURLWithDefault:(id)arg1;\n+ (BOOL)containsHTTPString:(id)arg1;\n- (void)openURLWithDefault:(id)arg1 useA8Key:(BOOL)arg2;\n- (BOOL)preHandleUrlStr:(id)arg1 withMessage:(id)arg2;\n@end\n\n@interface UserDefaultsService : NSObject\n- (void)setString:(id)arg1 forKey:(id)arg2;\n- (id)stringForKey:(id)arg1;\n@end\n\n@interface MMLinkInfo : NSObject\n+ (NSRange)rangeOfUrlInString:(id)arg1 withRange:(NSRange)arg2;\n@end\n\n@interface MMCDNDownloadMgr : NSObject\n- (BOOL)downloadImageWithMessage:(id)arg1 disableHevc:(BOOL)arg2 downloadType:(unsigned long long)arg3;\n@end\n\n@interface MMMessageVideoService : NSObject\n- (BOOL)downloadVideoWithMessage:(id)arg1;\n@end\n\n@interface MMVoiceMessagePlayer : NSObject\n+ (id)defaultPlayer;\n- (void)playWithVoiceMessage:(id)arg1 isUnplayedBeforePlay:(BOOL)arg2;\n- (void)playVoiceWithMessage:(id)arg1 isUnplayedBeforePlay:(BOOL)arg2;\n- (void)stop;\n@end\n\n@interface MultiPlatformStatusSyncMgr : NSObject\n- (void)markVoiceMessageAsRead:(id)arg1;\n@end\n\n@interface EmoticonDownloadMgr : NSObject\n- (void)downloadEmoticonWithMessageData:(id)arg1;\n@end\n\n@interface PathUtility : NSObject\n+ (id)GetCurUserCachePath;\n+ (id)emoticonPath:(id)arg1;\n+ (id)getMsgVideoPathWithMessage:(id)arg1;\n+ (id)getMsgVideoPathWithUserName:(id)arg1 localId:(unsigned int)arg2;\n@end\n\n@interface MMExtensionCenter : NSObject\n- (id)getExtension:(id)arg1;\n@end\n\n@interface MMExtension : NSObject\n- (BOOL)registerExtension:(id)arg1;\n- (void)unregisterExtension:(id)arg1;\n- (id)getExtensionListForSelector:(SEL)arg1;\n@end\n\n@interface EmoticonMsgInfo : NSObject\n@property(copy, nonatomic) NSString *cdnUrl;\n@property(copy, nonatomic) NSString *m_nsMD5;\n@end\n\n@protocol EmoticonDownloadMgrExt <NSObject>\n@optional\n- (void)emoticonDownloadFailed:(EmoticonMsgInfo *)arg1;\n- (void)emoticonDownloadFinished:(EmoticonMsgInfo *)arg1;\n@end\n\n@protocol IGroupMgrExt <NSObject>\n\n@end\n\n@interface MMChatMangerSearchReportMgr : NSObject\n@property(retain, nonatomic) NSMutableArray *brandContactSearchResults;\n@property(retain, nonatomic) NSMutableArray *chatLogSearchResults;\n@property(retain, nonatomic) NSMutableArray *contactSearchResults;\n@property(retain, nonatomic) NSMutableArray *groupContactSearchResults;\n@end\n\n@interface MMWebViewHelper : NSObject\n+ (BOOL)preHandleWebUrlStr:(id)arg1 withMessage:(id)arg2;\n@end\n\n@interface XMLDictionaryParser : NSObject\n+ (id)sharedInstance;\n- (id)dictionaryWithString:(id)arg1;\n@end\n\n@interface MMEmoticonData : NSObject\n@property(retain, nonatomic) NSString *md5; // @synthesize md5=_md5;\n@end\n\n@interface MMStickerPickerCell : NSView <NSMenuDelegate>\n@property(retain, nonatomic) MMEmoticonData *emoticonData; // @synthesize emoticonData=_emoticonData;\n@property(nonatomic) __weak NSScrollView *collectionView; \n@end\n\n@interface MMStickerCollectionViewController : NSViewController\n@property(nonatomic) __weak id delegate;\n@end\n\n@interface MMStickerPicker : NSViewController\n- (void)hide;\n@end\n\n@interface MMVoiceTranslateMgr : NSObject\n- (void)doTranslate:(id)arg1 isAuto:(BOOL)arg2;\n- (void)updateTranscribeVoiceMessage:(id)arg1 voiceText:(id)arg2 voiceToTextStatus:(unsigned int)arg3;\n@end\n\n@interface MMAppBrandMessageCellView : NSObject\n+ (id)makeAppBrandTableItemWithItem:(id)arg1;\n@end\n\n@interface MMUnsupportedCellView : NSObject\n+ (id)makeUnsupportedTableItemWithItem:(id)arg1;\n@end\n\n@interface MMPayTransferCellView : NSObject\n+ (id)makePayTransferTableItemWithItem:(id)arg1;\n@end\n\n\n"
  },
  {
    "path": "WeChatPlugin/en.lproj/Localizable.strings",
    "content": "/*\n Localizable.strings\n WeChatPlugin\n \n Created by TK on 2018/4/14.\n Copyright © 2018年 tk. All rights reserved.\n */\n\n\n//  MainMenu\n\"assistant.menu.title\" = \"Assistant\";\n\"assistant.menu.revoke\" = \"Prevent Revoke\";\n\"assistant.menu.revokeSelf\" = \"Prevent Self Message\";\n\"assistant.menu.autoReply\" = \"Auto Reply\";\n\"assistant.menu.newWeChat\" = \"New WeChat\";\n\"assistant.menu.remoteControl\" = \"Remote Control\";\n\"assistant.menu.windowSticky\" = \"Sticky on Top\";\n\"assistant.menu.freeLogin\" = \"AutoAuth Login\";\n\"assistant.menu.systemBrowser\" = \"Use System Browser\";\n\"assistant.menu.forbidCheck\" = \"Forbid WeChat Check Update\";\n\"assistant.menu.other\" = \"Others\";\n\"assistant.menu.enableAlfred\" = \"Enable Alfred\";\n\"assistant.menu.updateAssistant\" = \"Update Assistant…\";\n\"assistant.menu.aboutAssistant\" = \"About Assistant\";\n\"assistant.menu.memberExitMonitoring\" = \"Member Exit Monitoring\";\n//  Prevent Revoke\n\"assistant.revokeType.emoji\" = \"[Sticker]\";\n\"assistant.revokeType.image\" = \"[Photo]\";\n\"assistant.revokeType.video\" = \"[Video]\";\n\"assistant.revokeType.voice\" = \"[Voice]\";\n\"assistant.revokeType.other\" = \"[Unknown Message]\";\n\"assistant.revoke.otherMessage.tip\" = \"TK prevent a message recalled: \";\n\"assistant.revoke.selfMessage.tip\" = \"You've recalled a message: \";\n\n//  AutoAuth\n\"assistant.autoAuth.tip\" = \"AutoAuth Logging in…\";\n\"assistant.autoLogin.text\" = \"Auto Login\";\n\n\n//  Context Menu\n\"assistant.chat.stickyBottom\" = \"Sticky on Bottom\";\n\"assistant.chat.unStickyBottom\" = \"Unsticky on Bottom\";\n\"assistant.chat.multiSelect\" = \"Multiselect\";\n\"assistant.chat.unMultiSelect\" = \"Unmultiselect\";\n\"assistant.chat.readAll\" = \"Mark All As Read\";\n\"assistant.chat.clearEmpty\" = \"Clear All Empty Session\";\n\"assistant.chat.remove\" = \"remove\";\n\"assistant.chat.unread\" = \"Unread\";\n\n//  Remote Control\n\"assistant.remoteControl.getList\" = \"Directive\";\n\"assistant.remoteControl.listTip\" = \"remote Control Directives: \\n(function-directive-Switch)\\n\\n\";\n\"assistant.remoteControl.recall\" = \"Assistant got a directive: \";\n\"assistant.remoteControl.voiceRecall\" = \"Assistant got a audio message, Convert to Text👇👇👇:\";\n\"assistant.remoteControl.mac\" = \"Macbook:\";\n\"assistant.remoteControl.app\" = \"APP:\";\n\"assistant.remoteControl.neteaseMusic\" = \"NeteaseMusic:\";\n\"assistant.remoteControl.assistant\" = \"Assistant:\";\n\"assistant.remoteControl.open\" = \"On\";\n\"assistant.remoteControl.close\" = \"Off\";\n\"assistant.remoteControl.contentPlaceHodler\" = \"Please enter the keyword\";\n\n//  Remote Control Directive\n\"Assistant.Directive.ScreenSave\" = \"Screen Save\";\n\"Assistant.Directive.LockScreen\" = \"Lock Screen\";\n\"Assistant.Directive.Sleep\" = \"Sleep\";\n\"Assistant.Directive.Shutdown\" = \"Shut Down\";\n\"Assistant.Directive.Restart\" = \"Restart\";\n\"Assistant.Directive.EmptyTrash\" = \"Empty Trash\";\n\"Assistant.Directive.Mute\" = \"Mute\";\n\"Assistant.Directive.KillQQ\" = \"Kill QQ\";\n\"Assistant.Directive.KillWeChat\" = \"Kill WeChat\";\n\"Assistant.Directive.KillChrome\" = \"Kill Chrome\";\n\"Assistant.Directive.KillSafari\" = \"Kill Safari\";\n\"Assistant.Directive.KillFirefox\" = \"Kill Firefox\";\n\"Assistant.Directive.KillAll\" = \"Kill All App\";\n\"Assistant.Directive.Toggle\" = \"Play/Pause\";\n\"Assistant.Directive.Next\" = \"Next\";\n\"Assistant.Directive.Previous\" = \"Previous\";\n\"Assistant.Directive.VolumeUp\" = \"Increase Volume\";\n\"Assistant.Directive.VolumeDown\" = \"Decrease Volume\";\n\"Assistant.Directive.LikeChange\" = \"Like/Unlike\";\n\"Assistant.Directive.GetList\" = \"Get Directive\";\n\"Assistant.Directive.AutoReplySwitch\" = \"AutoReply Switch\";\n\"Assistant.Directive.PreventRevokeSwitch\" = \"PreventRecall Switch\";\n\"Assistant.Directive.AutoAuthSwitch\" = \"AutoAuth Switch\";\n\"Assistant.Directive.SwitchOn\" = \"On\";\n\"Assistant.Directive.SwitchOff\" = \"Off\";\n\n//  AutoAuth Setting\n\"assistant.autoReply.title\" = \"Auto Reply Setting\";\n\"assistant.autoReply.enable\" = \"Enable Auto Reply\";\n\"assistant.autoReply.enableSpecific\" = \"Enable Some Session Reply\";\n\"assistant.autoReply.selectSpecific\" = \"View Or Edit Session\";\n\"assistant.autoReply.enableRegEx\" = \"Enable RegEx\";\n\"assistant.autoReply.enableGroup\" = \"Enable Group Reply\";\n\"assistant.autoReply.enableSingle\" = \"Enable Single Reply\";\n\"assistant.autoReply.delay\" = \"Delay Send\";\n\"assistant.autoReply.timeUnit\" = \"Second\";\n\"assistant.autoReply.contentPlaceholder\" = \"Reply Content（‘|’ is random reply a content）\";\n\"assistant.autoReply.keywordPlaceholder\" = \"Keyword (‘*’ is All message can Reply，‘|’ is match multiple keyword）\";\n\"assistant.autoReply.keyword\" = \"Keyword\";\n\"assistant.autoReply.content\" = \"Reply Content\";\n\"assistant.autoReply.list\" = \"Auto Reply List\";\n\"assistant.autoReply.alert.confirm\" = \"OK\";\n\"assistant.autoReply.alert.title\" = \"Attention\";   //\n\"assistant.autoReply.alert.content\" = \"Please fill in keyword and reply content\";\n\n//  Version Update\n\"assistant.update.alret.cancle\" = \"Cancel\";\n\"assistant.update.alret.confirm\" = \"Update\";\n\"assistant.update.alret.title\" = \"Found a New Version！Main Contents:👇\";\n\"assistant.update.alret.latest\" = \"This is Latest Version！Main Contents:👇\";\n\"assistant.update.alret.forbid\" = \"Ignore\";\n\n//  Download\n\"assistant.download.title\" = \"Update Assistant\";\n\"assistant.download.cancelTitle\" = \"Cancelled\";\n\"assistant.download.install\" = \"Ready to Install\";\n\"assistant.download.error\" = \"Update Error!\";\n\"assistant.download.update\" = \"Downloading update...\";\n\"assistant.download.relaunch\" = \"Install and Relaunch\";\n\"assistant.download.cancel\" = \"Cancel\";\n\"assistant.download.reInstall\" = \"Try Again\";\n\"assistant.download.reDownload\" = \"Redownload\";\n\n//  Alfred\n\"assistant.search.member\" = \"Member: \";\n\"assistant.search.friend\" = \"[Friend]\";\n\"assistant.search.group\" = \"[Group]\";\n\"assistant.search.official\" = \"[Official]\";\n\"assistant.search.chatlog\" = \"this is chat log👇🏻\";\n\"assistant.search.message.unread\" = \"unread\";\n\"assistant.search.yesterday\" = \"yesterday\";\n"
  },
  {
    "path": "WeChatPlugin/en.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset0 HelveticaNeue-Bold;\n\\f3\\fnil\\fcharset134 PingFangSC-Regular;}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs34 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs34 \\cf2 Feature\n\\fs47\\fsmilli23660 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f0\\b0\\fs30 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nMessage auto reply\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nPrevent message recall\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nRemote control(support voice control)\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nMultiple WeChat\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nAuto Auth Login\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nSession Sticky Bottom\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nWindows Sticky Top\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nSession multiple delete\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nAuto Login Switch\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nQuick reply to notifications\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nCopy or Export Sticker\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nUpdate plugin\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nReply or Open session by Alfred\n\\f3\\fs32 \\\n}"
  },
  {
    "path": "WeChatPlugin/main.mm",
    "content": "//\n//  main.c\n//  WeChatPlugin\n//\n//  Created by TK on 2017/4/19.\n//  Copyright © 2017年 tk. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"WeChat+hook.h\"\n#import \"MMChatsTableCellView+hook.h\"\n#import \"MMStickerMessageCellView+hook.h\"\n#import \"MMStickerPickerCell+hook.h\"\n\nstatic void __attribute__((constructor)) initialize(void) {\n    NSLog(@\"++++++++ WeChatPlugin loaded ++++++++\");\n    [NSObject hookWeChat];\n    [NSObject hookMMChatsTableCellView];\n    [NSObject hookMMStickerMessageCellView];\n    [NSObject hookMMStickerPickerCell];\n    \n}\n"
  },
  {
    "path": "WeChatPlugin/zh-Hans.lproj/Localizable.strings",
    "content": "/* \n  Localizable.strings\n  WeChatPlugin\n\n  Created by TK on 2018/4/14.\n  Copyright © 2018年 tk. All rights reserved.\n*/\n\n\n//  菜单栏\n\"assistant.menu.title\" = \"微信小助手\";\n\"assistant.menu.revoke\" = \"开启消息防撤回\";\n\"assistant.menu.revokeSelf\" = \"拦截自己撤回消息\";\n\"assistant.menu.autoReply\" = \"自动回复设置\";\n\"assistant.menu.newWeChat\" = \"登录新微信\";\n\"assistant.menu.remoteControl\" = \"远程控制mac\";\n\"assistant.menu.windowSticky\" = \"微信窗口置顶\";\n\"assistant.menu.freeLogin\" = \"免认证登录\";\n\"assistant.menu.systemBrowser\" = \"使用系统浏览器\";\n\"assistant.menu.forbidCheck\" = \"禁止微信启动时检测更新\";\n\"assistant.menu.memberExitMonitoring\" = \"退群监控\";\n\"assistant.menu.other\" = \"小助手🌚\";\n\"assistant.menu.enableAlfred\" = \"开启 Alfred 功能\";\n\"assistant.menu.updateAssistant\" = \"更新小助手…\";\n\"assistant.menu.aboutAssistant\" = \"关于小助手\";\n\n//  撤回相关\n\"assistant.revokeType.emoji\" = \"[表情]\";\n\"assistant.revokeType.image\" = \"[图片]\";\n\"assistant.revokeType.video\" = \"[视频]\";\n\"assistant.revokeType.voice\" = \"[语音]\";\n\"assistant.revokeType.other\" = \"[非文本]\";\n\"assistant.revoke.otherMessage.tip\" = \"TK拦截到一条撤回消息: \";\n\"assistant.revoke.selfMessage.tip\" = \"你撤回了一条消息: \";\n\n//  免认证相关\n\"assistant.autoAuth.tip\" = \"TK正在为你免认证登录~\";\n\"assistant.autoLogin.text\" = \"自动登录\";\n\n\n//  回话选择\n\"assistant.chat.stickyBottom\" = \"置底\";\n\"assistant.chat.unStickyBottom\" = \"取消置底\";\n\"assistant.chat.multiSelect\" = \"多选\";\n\"assistant.chat.unMultiSelect\" = \"取消多选\";\n\"assistant.chat.readAll\" = \"一键已读\";\n\"assistant.chat.clearEmpty\" = \"清除空会话\";\n\"assistant.chat.remove\" = \"移除\";\n\"assistant.chat.unread\" = \"标记未读\";\n\n//  远程控制相关\n\"assistant.remoteControl.getList\" = \"获取指令\";\n\"assistant.remoteControl.listTip\" = \"远程控制指令：\\n(功能-指令-是否开启)\\n\\n\";\n\"assistant.remoteControl.recall\" = \"小助手收到一条指令：\";\n\"assistant.remoteControl.voiceRecall\" = \"小助手收到一条语音消息，转文字后👇👇👇：\";\n\"assistant.remoteControl.mac\" = \"macbook控制:\";\n\"assistant.remoteControl.app\" = \"app控制:\";\n\"assistant.remoteControl.neteaseMusic\" = \"网易云音乐控制:\";\n\"assistant.remoteControl.assistant\" = \"小助手控制:\";\n\"assistant.remoteControl.open\" = \"开启\";\n\"assistant.remoteControl.close\" = \"关闭\";\n\"assistant.remoteControl.contentPlaceHodler\" = \"请输入匹配的关键词\";\n\n//  远程控制指令\n\"Assistant.Directive.ScreenSave\" = \"屏幕保护\";\n\"Assistant.Directive.LockScreen\" = \"锁屏\";\n\"Assistant.Directive.Sleep\" = \"休眠\";\n\"Assistant.Directive.Shutdown\" = \"关机\";\n\"Assistant.Directive.Restart\" = \"重启\";\n\"Assistant.Directive.EmptyTrash\" = \"清空废纸篓\";\n\"Assistant.Directive.Mute\" = \"静音\";\n\"Assistant.Directive.KillQQ\" = \"退出 QQ\";\n\"Assistant.Directive.KillWeChat\" = \"退出 WeChat\";\n\"Assistant.Directive.KillChrome\" = \"退出 Chrome\";\n\"Assistant.Directive.KillSafari\" = \"退出 Safari\";\n\"Assistant.Directive.KillFirefox\" = \"退出 Firefox\";\n\"Assistant.Directive.KillAll\" = \"退出所有程序\";\n\"Assistant.Directive.Toggle\" = \"播放/暂停\";\n\"Assistant.Directive.Next\" = \"下一首\";\n\"Assistant.Directive.Previous\" = \"上一首\";\n\"Assistant.Directive.VolumeUp\" = \"增大音量\";\n\"Assistant.Directive.VolumeDown\" = \"VolumeDown\";\n\"Assistant.Directive.LikeChange\" = \"喜欢/取消喜欢\";\n\"Assistant.Directive.GetList\" = \"获取指令\";\n\"Assistant.Directive.AutoReplySwitch\" = \"自动回复开关\";\n\"Assistant.Directive.PreventRevokeSwitch\" = \"防撤回开关\";\n\"Assistant.Directive.AutoAuthSwitch\" = \"免认证登录开关\";\n\"Assistant.Directive.SwitchOn\" = \"开启\";\n\"Assistant.Directive.SwitchOff\" = \"关闭\";\n\n//  自动回复\n\"assistant.autoReply.title\" = \"自动回复设置\";\n\"assistant.autoReply.enable\" = \"开启自动回复\";\n\"assistant.autoReply.enableSpecific\" = \"开启特定回复\";\n\"assistant.autoReply.selectSpecific\" = \"查看(修改)选中联系人\";\n\"assistant.autoReply.enableRegEx\" = \"开启正则匹配\";\n\"assistant.autoReply.enableGroup\" = \"开启群聊自动回复\";\n\"assistant.autoReply.enableSingle\" = \"开启私聊自动回复\";\n\"assistant.autoReply.delay\" = \"延迟发送\";\n\"assistant.autoReply.timeUnit\" = \"秒\";\n\"assistant.autoReply.contentPlaceholder\" = \"请输入自动回复的内容（‘|’ 为随机回复其中任一内容）\";\n\"assistant.autoReply.keywordPlaceholder\" = \"请输入关键字（ ‘*’ 为任何消息都回复，‘|’ 为匹配多个关键字）\";\n\"assistant.autoReply.keyword\" = \"关键字\";\n\"assistant.autoReply.content\" = \"回复内容\";\n\"assistant.autoReply.list\" = \"自动回复列表\";\n\"assistant.autoReply.alert.confirm\" = \"确定\";\n\"assistant.autoReply.alert.title\" = \"您还有一条自动回复设置未完成\";\n\"assistant.autoReply.alert.content\" = \"请完善未完成的自动回复设置\";\n\n//  版本更新\n\"assistant.update.alret.cancle\" = \"取消\";\n\"assistant.update.alret.confirm\" = \"安装更新\";\n\"assistant.update.alret.title\" = \"检测到新版本！主要内容：👇\";\n\"assistant.update.alret.latest\" = \"当前为最新版本！主要内容：👇\";\n\"assistant.update.alret.forbid\" = \"不再提示\";\n\n//  下载\n\"assistant.download.title\" = \"更新小助手\";\n\"assistant.download.cancelTitle\" = \"已取消\";\n\"assistant.download.install\" = \"可以开始安装了\";\n\"assistant.download.error\" = \"更新错误！\";\n\"assistant.download.update\" = \"正在下载更新…\";\n\"assistant.download.relaunch\" = \"安装并重启应用\";\n\"assistant.download.cancel\" = \"取消\";\n\"assistant.download.reInstall\" = \"重试\";\n\"assistant.download.reDownload\" = \"重新下载\";\n\n\n//  alfred 搜索\n\"assistant.search.member\" = \"成员：\";\n\"assistant.search.friend\" = \"[好友]\";\n\"assistant.search.group\" = \"[群聊]\";\n\"assistant.search.official\" = \"[公众号]\";\n\"assistant.search.chatlog\" = \"以下为聊天记录👇🏻\";\n\"assistant.search.message.unread\" = \"未读\";\n\"assistant.search.yesterday\" = \"昨天\";\n"
  },
  {
    "path": "WeChatPlugin/zh-Hans.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset134 PingFangSC-Semibold;\n\\f3\\fnil\\fcharset0 HelveticaNeue-Bold;\\f4\\fnil\\fcharset134 PingFangSC-Regular;\\f5\\fnil\\fcharset0 AppleColorEmoji;\n}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;\\red255\\green255\\blue255;\n\\red52\\green110\\blue183;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;\\cssrgb\\c100000\\c100000\\c100000;\n\\cssrgb\\c25490\\c51373\\c76863;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}\n{\\list\\listtemplateid2\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid101\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid2}\n{\\list\\listtemplateid3\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid201\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid3}\n{\\list\\listtemplateid4\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid301\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid4}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}{\\listoverride\\listid2\\listoverridecount0\\ls2}{\\listoverride\\listid3\\listoverridecount0\\ls3}{\\listoverride\\listid4\\listoverridecount0\\ls4}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs36\\fsmilli18200 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1\\fs32 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b9\\'a6\\'c4\\'dc\n\\f3\\fs48 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f1\\b0\\fs32 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'b7\\'c0\\'b3\\'b7\\'bb\\'d8\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d4\\'b6\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f1 (\n\\f4 \\'d2\\'d1\\'d6\\'a7\\'b3\\'d6\\'d3\\'ef\\'d2\\'f4\n\\f1 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b6\\'e0\\'bf\\'aa\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'b5\\'da\\'b6\\'fe\\'b4\\'ce\\'b5\\'c7\\'c2\\'bc\\'c3\\'e2\\'c8\\'cf\\'d6\\'a4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'d6\\'c3\\'b5\\'d7\\'b9\\'a6\\'c4\\'dc\n\\f1 (\n\\f4 \\strike \\strikec2 \\'c0\\'e0\\'cb\\'c6\\'d6\\'c3\\'b6\\'a5\n\\f1 \\strike0\\striked0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'b6\\'a5\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'bb\\'e1\\'bb\\'b0\\'b6\\'e0\\'d1\\'a1\\'c9\\'be\\'b3\\'fd\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d7\\'d4\\'b6\\'af\\'b5\\'c7\\'c2\\'bc\\'bf\\'aa\\'b9\\'d8\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cd\\'a8\\'d6\\'aa\\'d6\\'d0\\'d0\\'c4\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'b8\\'b4\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'b8\\'b4\\'d6\\'c6\n\\f1  & \n\\f4 \\'b4\\'e6\\'b4\\'a2\n\\f1 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'bc\\'ec\\'b2\\'e2\\'b8\\'fc\\'d0\\'c2\\'cc\\'e1\\'d0\\'d1\n\\f1 \\\n\\pard\\tx0\\tx220\\pardeftab720\\fi-1\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b7\\'a2\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f1  & \n\\f4 \\'b4\\'f2\\'bf\\'aa\\'b4\\'b0\\'bf\\'da\\\n\\pard\\tx0\\tx220\\pardeftab720\\fi-1\\sl216\\slmult1\\partightenfactor0\n\\ls1\\ilvl0\n\\f1 \\cf2 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'bb\\'e1\\'bb\\'b0\\'d2\\'bb\\'bc\\'fc\\'d2\\'d1\\'b6\\'c1\n\\f1 \\cb1 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls1\\ilvl0\\cf2 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d2\\'bb\\'bc\\'fc\\'c7\\'e5\\'b3\\'fd\\'bf\\'d5\\'bb\\'e1\\'bb\\'b0\n\\f1 \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'a7\\'b3\\'d6\\'b9\\'fa\\'bc\\'ca\\'bb\\'af\n\\f1  \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d2\\'bb\\'bc\\'fc\\'b8\\'fc\\'d0\\'c2\n\\f1 \\cb1 \\\n\\ls1\\ilvl0\\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c8\\'a5\\'b3\\'fd\\'ce\\'a2\\'d0\\'c5\n\\f1 url\n\\f4 \\'d7\\'aa\\'c1\\'b4\\'a3\\'a8\\'b4\\'d3\\'b4\\'cb\\'d6\\'b1\\'bd\\'d3\\'b4\\'f2\\'bf\\'aa\\'b6\\'b6\\'d2\\'f4\\'c1\\'b4\\'bd\\'d3\n\\f5 \\uc0\\u55356 \\u57117 \\\n\\ls1\\ilvl0\n\\f1 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'cb\\'d1\\'cb\\'f7\\'d7\\'ee\\'bd\\'fc\\'c1\\'c4\\'cc\\'ec\\'a1\\'a2\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc\n\\f5 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\n\\f1 \\cf2 \\kerning1\\expnd0\\expndtw0 \t\\'95\t\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d2\\'c6\\'b3\\'fd\\'bb\\'e1\\'bb\\'b0(\\'b2\\'bb\\'c9\\'be\\'b3\\'fd\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc)\\cb1 \\\n\n\\f1 \\cf5 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b8\\'fc\\'d0\\'c2\\'c8\\'d5\\'d6\\'be\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls2\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\ul \\'ca\\'ca\\'c5\\'e4\n\\f1 2.3.17 & \n\\f4 \\'bc\\'d3\\'c7\\'bf\n\\f1  alfred \n\\f4 \\'cb\\'d1\\'cb\\'f7\n\\f1 (2018-07-24)}}\n\\f2\\b\\fs36 \\cf2 \\cb1 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl360\\partightenfactor0\n\\ls3\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\cb4 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.7\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\ul \\'d0\\'c2\\'d4\\'f6\\'ba\\'c3\\'b6\\'e0\\'b9\\'a6\\'c4\\'dc\n\\f1 \\'85(2018-05-12)}}\n\\f3\\b\\fs36 \\cf2 \\cb1 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls4\\ilvl0\n\\f1\\b0\\fs32 \\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\\'d1\\'d3\\'b3\\'d9\n\\f1  & \n\\f4 \\'d0\\'de\\'b8\\'c4\\'d6\\'c3\\'b6\\'a5\\'b4\\'b0\\'bf\\'da\\'bf\\'ec\\'bd\\'dd\n\\f1 (2018-04-07)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\n\\f1  Alfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b7\\'a2\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f1  & \n\\f4 \\'b4\\'f2\\'bf\\'aa\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\n\\f1 (2018-03-18)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d3\\'ef\\'d2\\'f4\\'d4\\'b6\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f1 mac & \n\\f4 \\'d3\\'c5\\'bb\\'af\\'b3\\'b7\\'bb\\'d8\\'cf\\'fb\\'cf\\'a2\\'a1\\'a2\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'b8\\'b4\n\\f1 (2018-03-03)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'bc\\'ec\\'b2\\'e2\\'b8\\'fc\\'d0\\'c2\n\\f1 &\n\\f4 \\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'b8\\'b4\\'d6\\'c6\\'b4\\'e6\\'b4\\'a2\\'b5\\'c8\\'b5\\'c8\n\\f1  (2018-02-24)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.4.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'b6\\'a5\n\\f1 &\n\\f4 \\'b6\\'e0\\'d1\\'a1\\'c9\\'be\\'b3\\'fd\\'b5\\'c8\\'b5\\'c8\n\\f1  (2017-10-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.3.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d6\\'c3\\'b5\\'d7\n\\f1 &\n\\f4 \\'c3\\'e2\\'c8\\'cf\\'d6\\'a4\n\\f1  (2017-09-17)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.2.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'de\\'b8\\'b4\\'c1\\'c4\\'cc\\'ec\\'bc\\'c7\\'c2\\'bc\\'cf\\'fb\\'ca\\'a7\\'b5\\'c4\n\\f1 bug (2017-09-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls4\\ilvl0\\cf5 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.1.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'d8\\'b9\\'b9\\'d7\\'d4\\'b6\\'af\\'bb\\'d8\\'b8\\'b4\\'a3\\'ac\\'ca\\'b5\\'cf\\'d6\\'b6\\'e0\\'bb\\'d8\\'b8\\'b4\n\\f1  (2017-08-23)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\pardeftab720\\sl264\\slmult1\\partightenfactor0\n\n\\f2\\b \\cf2 \\'cf\\'ea\\'cf\\'b8\\'c4\\'da\\'c8\\'dd\\'c7\\'eb\\'b2\\'e9\\'bf\\'b4{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/CHANGELOG.md\"}}{\\fldrslt \n\\f1\\b0 \\cf5 CHANGELOG}}\n\\f1\\b0 \\cf5 \\\n}"
  },
  {
    "path": "WeChatPlugin/zh-Hant.lproj/Localizable.strings",
    "content": "/*\n Localizable.strings\n WeChatPlugin\n \n Created by TK on 2018/4/14.\n Copyright © 2018年 tk. All rights reserved.\n */\n\n\n//  菜單欄\n\"assistant.menu.title\" = \"微信小助手\";\n\"assistant.menu.revoke\" = \"開啟消息防撤回\";\n\"assistant.menu.revokeSelf\" = \"攔截自己撤回消息\";\n\"assistant.menu.autoReply\" = \"自動回復設置\";\n\"assistant.menu.newWeChat\" = \"登錄新微信\";\n\"assistant.menu.remoteControl\" = \"遠程控制mac\";\n\"assistant.menu.windowSticky\" = \"微信窗口置頂\";\n\"assistant.menu.freeLogin\" = \"免認證登錄\";\n\"assistant.menu.systemBrowser\" = \"使用系統瀏覽器\";\n\"assistant.menu.memberExitMonitoring\" = \"退群監控\";\n\"assistant.menu.forbidCheck\" = \"禁止微信啟動時檢測更新\";\n\"assistant.menu.other\" = \"小助手🌚\";\n\"assistant.menu.enableAlfred\" = \"開啟 Alfred 功能\";\n\"assistant.menu.updateAssistant\" = \"更新小助手…\";\n\"assistant.menu.aboutAssistant\" = \"關於小助手\";\n\n//  撤回相關\n\"assistant.revokeType.emoji\" = \"[表情]\";\n\"assistant.revokeType.image\" = \"[圖片]\";\n\"assistant.revokeType.video\" = \"[視頻]\";\n\"assistant.revokeType.voice\" = \"[語音]\";\n\"assistant.revokeType.other\" = \"[非文本]\";\n\"assistant.revoke.otherMessage.tip\" = \"TK攔截到一條撤回消息: \";\n\"assistant.revoke.selfMessage.tip\" = \"你撤回了一條消息: \";\n\n//  免認證相關\n\"assistant.autoAuth.tip\" = \"TK正在為你免認證登錄~\";\n\"assistant.autoLogin.text\" = \"自動登錄\";\n\n\n//  回話選擇\n\"assistant.chat.stickyBottom\" = \"置底\";\n\"assistant.chat.unStickyBottom\" = \"取消置底\";\n\"assistant.chat.multiSelect\" = \"多選\";\n\"assistant.chat.unMultiSelect\" = \"取消多選\";\n\"assistant.chat.readAll\" = \"一鍵已讀\";\n\"assistant.chat.clearEmpty\" = \"清除空會話\";\n\"assistant.chat.remove\" = \"移除\";\n\"assistant.chat.unread\" = \"标记未读\";\n\n//  遠程控制相關\n\"assistant.remoteControl.getList\" = \"獲取指令\";\n\"assistant.remoteControl.listTip\" = \"遠程控制指令：\\n(功能-指令-是否開啟)\\n\\n\";\n\"assistant.remoteControl.recall\" = \"小助手收到一條指令：\";\n\"assistant.remoteControl.voiceRecall\" = \"小助手收到一條語音消息，轉文字後👇👇👇：\";\n\"assistant.remoteControl.mac\" = \"macbook控制:\";\n\"assistant.remoteControl.app\" = \"app控制:\";\n\"assistant.remoteControl.neteaseMusic\" = \"網易雲音樂控制:\";\n\"assistant.remoteControl.assistant\" = \"小助手控制:\";\n\"assistant.remoteControl.open\" = \"開啟\";\n\"assistant.remoteControl.close\" = \"關閉\";\n\"assistant.remoteControl.contentPlaceHodler\" = \"請輸入匹配的關鍵詞\";\n\n//  遠程控制指令\n\"Assistant.Directive.ScreenSave\" = \"屏幕保護\";\n\"Assistant.Directive.LockScreen\" = \"鎖屏\";\n\"Assistant.Directive.Sleep\" = \"休眠\";\n\"Assistant.Directive.Shutdown\" = \"關機\";\n\"Assistant.Directive.Restart\" = \"重啟\";\n\"Assistant.Directive.EmptyTrash\" = \"清空廢紙簍\";\n\"Assistant.Directive.Mute\" = \"靜音\";\n\"Assistant.Directive.KillQQ\" = \"退出 QQ\";\n\"Assistant.Directive.KillWeChat\" = \"退出 WeChat\";\n\"Assistant.Directive.KillChrome\" = \"退出 Chrome\";\n\"Assistant.Directive.KillSafari\" = \"退出 Safari\";\n\"Assistant.Directive.KillFirefox\" = \"退出 Firefox\";\n\"Assistant.Directive.KillAll\" = \"退出所有程序\";\n\"Assistant.Directive.Toggle\" = \"播放/暫停\";\n\"Assistant.Directive.Next\" = \"下一首\";\n\"Assistant.Directive.Previous\" = \"上一首\";\n\"Assistant.Directive.VolumeUp\" = \"增大音量\";\n\"Assistant.Directive.VolumeDown\" = \"VolumeDown\";\n\"Assistant.Directive.LikeChange\" = \"喜歡/取消喜歡\";\n\"Assistant.Directive.GetList\" = \"獲取指令\";\n\"Assistant.Directive.AutoReplySwitch\" = \"自動回復開關\";\n\"Assistant.Directive.PreventRevokeSwitch\" = \"防撤回開關\";\n\"Assistant.Directive.AutoAuthSwitch\" = \"免認證登錄開關\";\n\"Assistant.Directive.SwitchOn\" = \"開啟\";\n\"Assistant.Directive.SwitchOff\" = \"關閉\";\n\n//  自動回復\n\"assistant.autoReply.title\" = \"自動回復設置\";\n\"assistant.autoReply.enable\" = \"開啟自動回復\";\n\"assistant.autoReply.enableSpecific\" = \"開啟特定回復\";\n\"assistant.autoReply.selectSpecific\" = \"查看(修改)選中聯系人\";\n\"assistant.autoReply.enableRegEx\" = \"開啟正則匹配\";\n\"assistant.autoReply.enableGroup\" = \"開啟群聊自動回復\";\n\"assistant.autoReply.enableSingle\" = \"開啟私聊自動回復\";\n\"assistant.autoReply.delay\" = \"延遲發送\";\n\"assistant.autoReply.timeUnit\" = \"秒\";\n\"assistant.autoReply.contentPlaceholder\" = \"請輸入自動回復的內容（‘|’ 為隨機回復其中任一內容）\";\n\"assistant.autoReply.keywordPlaceholder\" = \"請輸入關鍵字（ ‘*’ 為任何消息都回復，‘|’ 為匹配多個關鍵字）\";\n\"assistant.autoReply.keyword\" = \"關鍵字\";\n\"assistant.autoReply.content\" = \"回復內容\";\n\"assistant.autoReply.list\" = \"自動回復列表\";\n\"assistant.autoReply.alert.confirm\" = \"確定\";\n\"assistant.autoReply.alert.title\" = \"您還有一條自動回復設置未完成\";\n\"assistant.autoReply.alert.content\" = \"請完善未完成的自動回復設置\";\n\n//  版本更新\n\"assistant.update.alret.cancle\" = \"取消\";\n\"assistant.update.alret.confirm\" = \"安裝更新\";\n\"assistant.update.alret.title\" = \"檢測到新版本！主要內容：👇\";\n\"assistant.update.alret.latest\" = \"當前為最新版本！主要內容：👇\";\n\"assistant.update.alret.forbid\" = \"不再提示\";\n\n//  下載\n\"assistant.download.title\" = \"更新小助手\";\n\"assistant.download.cancelTitle\" = \"已取消\";\n\"assistant.download.install\" = \"可以開始安裝了\";\n\"assistant.download.error\" = \"更新錯誤！\";\n\"assistant.download.update\" = \"正在下載更新…\";\n\"assistant.download.relaunch\" = \"安裝並重啟應用\";\n\"assistant.download.cancel\" = \"取消\";\n\"assistant.download.reInstall\" = \"重試\";\n\"assistant.download.reDownload\" = \"重新下載\";\n\n\n//  alfred 搜索\n\"assistant.search.member\" = \"成員：\";\n\"assistant.search.friend\" = \"[好友]\";\n\"assistant.search.group\" = \"[群聊]\";\n\"assistant.search.official\" = \"[公衆號]\";\n\"assistant.search.chatlog\" = \"以下為聊天記錄👇🏻\";\n\"assistant.search.message.unread\" = \"未读\";\n\"assistant.search.yesterday\" = \"昨天\";\n"
  },
  {
    "path": "WeChatPlugin/zh-Hant.lproj/about.rtfd/TXT.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\n{\\fonttbl\\f0\\fnil\\fcharset0 HelveticaNeue-Light;\\f1\\fnil\\fcharset0 HelveticaNeue;\\f2\\fnil\\fcharset134 PingFangSC-Semibold;\n\\f3\\fnil\\fcharset0 HelveticaNeue-Bold;\\f4\\fnil\\fcharset134 PingFangSC-Light;}\n{\\colortbl;\\red255\\green255\\blue255;\\red38\\green38\\blue38;\\red32\\green124\\blue169;}\n{\\*\\expandedcolortbl;;\\cssrgb\\c20000\\c20000\\c20000;\\cssrgb\\c14510\\c56078\\c72157;}\n{\\*\\listtable{\\list\\listtemplateid1\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid1\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid1}\n{\\list\\listtemplateid2\\listhybrid{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelfollow0\\levelstartat1\\levelspace360\\levelindent0{\\*\\levelmarker \\{disc\\}}{\\leveltext\\leveltemplateid101\\'01\\uc0\\u8226 ;}{\\levelnumbers;}\\fi-360\\li720\\lin720 }{\\listname ;}\\listid2}}\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}{\\listoverride\\listid2\\listoverridecount0\\ls2}}\n\\margl1440\\margr1440\\vieww13760\\viewh11300\\viewkind0\n\\hyphauto1\\hyphfactor90\n\\deftab720\n\\pard\\pardeftab720\\qc\\partightenfactor0\n\n\\f0\\fs36\\fsmilli18200 \\cf2 \\expnd0\\expndtw0\\kerning0\nGithub: {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS\"}}{\\fldrslt \\cf3 WeChatPlugin-MacOS}}\\\nEmail: {\\field{\\*\\fldinst{HYPERLINK \"mailto:tkk.ioser@gmail.com\"}}{\\fldrslt \\cf3 tkk.ioser@gmail.com}}\n\\f1\\fs32 \\\n\\pard\\pardeftab720\\sl288\\slmult1\\qc\\partightenfactor0\n\n\\fs28 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b9\\'a6\\'c4\\'dc\n\\f3\\fs47\\fsmilli23660 \\cf2 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\partightenfactor0\n\\ls1\\ilvl0\n\\f0\\b0\\fs32 \\cf2 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cf\\'fb\\'cf\\'a2\\'b7\\'c0\\'b3\\'b7\\'bb\\'d8\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'df\\'68\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f0 (\n\\f4 \\'d2\\'d1\\'d6\\'a7\\'b3\\'d6\\'d5\\'5a\\'d2\\'f4\n\\f0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b6\\'e0\\'e9\\'5f\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'b5\\'da\\'b6\\'fe\\'b4\\'ce\\'b5\\'c7\\'e4\\'9b\\'c3\\'e2\\'d5\\'4a\\'d7\\'43\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'d6\\'c3\\'b5\\'d7\\'b9\\'a6\\'c4\\'dc\n\\f0 (\n\\f4 \\strike \\strikec2 \\'ee\\'90\\'cb\\'c6\\'d6\\'c3\\'ed\\'94\n\\f0 \\strike0\\striked0 )\\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'ce\\'a2\\'d0\\'c5\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'ed\\'94\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'95\\'fe\\'d4\\'92\\'b6\\'e0\\'df\\'78\\'84\\'68\\'b3\\'fd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d7\\'d4\\'84\\'d3\\'b5\\'c7\\'e4\\'9b\\'e9\\'5f\\'ea\\'50\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'cd\\'a8\\'d6\\'aa\\'d6\\'d0\\'d0\\'c4\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'8f\\'cd\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'8f\\'cd\\'d6\\'c6\n\\f0  & \n\\f4 \\'b4\\'e6\\'83\\'a6\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'99\\'7a\\'9c\\'79\\'b8\\'fc\\'d0\\'c2\\'cc\\'e1\\'d0\\'d1\n\\f0 \\\n\\ls1\\ilvl0\\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}\\expnd0\\expndtw0\\kerning0\nalfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b0\\'6c\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f0  & \n\\f4 \\'b4\\'f2\\'e9\\'5f\\'b4\\'b0\\'bf\\'da\n\\f0  \\\n\\pard\\tx566\\pardeftab720\\partightenfactor0\n\n\\fs36\\fsmilli18200 \\cf2 \\\n\\pard\\pardeftab720\\partightenfactor0\n\n\\f2\\b\\fs36 \\cf2 \\'b8\\'fc\\'d0\\'c2\\'c8\\'d5\\'d5\\'49\n\\f3\\fs47\\fsmilli23660 \\cf2 \\\n\\pard\\tx220\\tx720\\pardeftab720\\li720\\fi-720\\sl264\\slmult1\\partightenfactor0\n\\ls2\\ilvl0\n\\f0\\b0\\fs32 \\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\\'d1\\'d3\\'df\\'74\n\\f0  & \n\\f4 \\'d0\\'de\\'b8\\'c4\\'d6\\'c3\\'ed\\'94\\'b4\\'b0\\'bf\\'da\\'bf\\'ec\\'bd\\'dd\n\\f0 (2018-04-07)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.6\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\n\\f0  Alfred \n\\f4 \\'bf\\'ec\\'bd\\'dd\\'b0\\'6c\\'cb\\'cd\\'cf\\'fb\\'cf\\'a2\n\\f0  & \n\\f4 \\'b4\\'f2\\'e9\\'5f\\'c1\\'c4\\'cc\\'ec\\'b4\\'b0\\'bf\\'da\n\\f0 (2018-03-18)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.1\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d5\\'5a\\'d2\\'f4\\'df\\'68\\'b3\\'cc\\'bf\\'d8\\'d6\\'c6\n\\f0 mac & \n\\f4 \\'83\\'9e\\'bb\\'af\\'b3\\'b7\\'bb\\'d8\\'cf\\'fb\\'cf\\'a2\\'a1\\'a2\\'bf\\'ec\\'bd\\'dd\\'bb\\'d8\\'8f\\'cd\n\\f0 (2018-03-03)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.5.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d0\\'a1\\'d6\\'fa\\'ca\\'d6\\'99\\'7a\\'9c\\'79\\'b8\\'fc\\'d0\\'c2\n\\f0 &\n\\f4 \\'b1\\'ed\\'c7\\'e9\\'b0\\'fc\\'8f\\'cd\\'d6\\'c6\\'b4\\'e6\\'83\\'a6\\'b5\\'c8\\'b5\\'c8\n\\f0  (2018-02-24)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.4.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'b4\\'b0\\'bf\\'da\\'d6\\'c3\\'ed\\'94\n\\f0 &\n\\f4 \\'b6\\'e0\\'df\\'78\\'84\\'68\\'b3\\'fd\\'b5\\'c8\\'b5\\'c8\n\\f0  (2017-10-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.3.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'c2\\'d4\\'f6\\'d6\\'c3\\'b5\\'d7\n\\f0 &\n\\f4 \\'c3\\'e2\\'d5\\'4a\\'d7\\'43\n\\f0  (2017-09-17)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.2.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d0\\'de\\'8f\\'cd\\'c1\\'c4\\'cc\\'ec\\'d3\\'9b\\'e4\\'9b\\'cf\\'fb\\'ca\\'a7\\'b5\\'c4\n\\f0 bug (2017-09-11)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\ls2\\ilvl0\\cf3 \\kerning1\\expnd0\\expndtw0 {\\listtext\t\\uc0\\u8226 \t}{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/releases/tag/v1.1.0\"}}{\\fldrslt \n\\f4 \\expnd0\\expndtw0\\kerning0\n\\'d6\\'d8\\'98\\'8b\\'d7\\'d4\\'84\\'d3\\'bb\\'d8\\'8f\\'cd\\'a3\\'ac\\'8c\\'8d\\'ac\\'46\\'b6\\'e0\\'bb\\'d8\\'8f\\'cd\n\\f0  (2017-08-23)}}\\cf2 \\expnd0\\expndtw0\\kerning0\n\\\n\\pard\\pardeftab720\\sl264\\slmult1\\partightenfactor0\n\n\\f2\\b \\cf2 \\'d4\\'94\\'bc\\'9a\\'83\\'c8\\'c8\\'dd\\'d5\\'88\\'b2\\'e9\\'bf\\'b4{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/TKkk-iOSer/WeChatPlugin-MacOS/blob/master/CHANGELOG.md\"}}{\\fldrslt \n\\f0\\b0 \\cf3 CHANGELOG}}\n\\f0\\b0\\fs36\\fsmilli18200 \\cf2 \\\n}"
  },
  {
    "path": "WeChatPlugin.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t520AE6E8208E1DA300BADE47 /* TKMessageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 520AE6E6208E1DA300BADE47 /* TKMessageManager.h */; };\n\t\t520AE6E9208E1DA300BADE47 /* TKMessageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 520AE6E7208E1DA300BADE47 /* TKMessageManager.m */; };\n\t\t520AE6F0208E231F00BADE47 /* NotifyConstant.h in Headers */ = {isa = PBXBuildFile; fileRef = 520AE6EF208E231F00BADE47 /* NotifyConstant.h */; };\n\t\t520AE6F3208F62EF00BADE47 /* TKAssistantMenuManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 520AE6F1208F62EF00BADE47 /* TKAssistantMenuManager.h */; };\n\t\t520AE6F4208F62EF00BADE47 /* TKAssistantMenuManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 520AE6F2208F62EF00BADE47 /* TKAssistantMenuManager.m */; };\n\t\t520AE6F7208F632700BADE47 /* TKRemoteControlManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 520AE6F5208F632700BADE47 /* TKRemoteControlManager.h */; };\n\t\t520AE6F8208F632700BADE47 /* TKRemoteControlManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 520AE6F6208F632700BADE47 /* TKRemoteControlManager.m */; };\n\t\t520F2009205E1DF900A36B1E /* TKWebServerManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 520F2007205E1DF900A36B1E /* TKWebServerManager.h */; };\n\t\t520F200A205E1DF900A36B1E /* TKWebServerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 520F2008205E1DF900A36B1E /* TKWebServerManager.m */; };\n\t\t52176DD9209809CE0035FA50 /* NSString+Action.h in Headers */ = {isa = PBXBuildFile; fileRef = 52176DD7209809CE0035FA50 /* NSString+Action.h */; };\n\t\t52176DDA209809CE0035FA50 /* NSString+Action.m in Sources */ = {isa = PBXBuildFile; fileRef = 52176DD8209809CE0035FA50 /* NSString+Action.m */; };\n\t\t521C49C320820662003902E7 /* TKRemoteControlWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 521C49C520820662003902E7 /* TKRemoteControlWindowController.xib */; };\n\t\t521D75F92080E3670093C820 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 521D75FB2080E3670093C820 /* Localizable.strings */; };\n\t\t52206B6A20836A230010C232 /* NSMenu+Action.h in Headers */ = {isa = PBXBuildFile; fileRef = 52206B6820836A230010C232 /* NSMenu+Action.h */; };\n\t\t52206B6B20836A230010C232 /* NSMenu+Action.m in Sources */ = {isa = PBXBuildFile; fileRef = 52206B6920836A230010C232 /* NSMenu+Action.m */; };\n\t\t52232710223922610016D3F7 /* TKEmoticonManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5223270E223922610016D3F7 /* TKEmoticonManager.h */; };\n\t\t52232711223922610016D3F7 /* TKEmoticonManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5223270F223922610016D3F7 /* TKEmoticonManager.m */; };\n\t\t522327142239258D0016D3F7 /* MMStickerPickerCell+hook.h in Headers */ = {isa = PBXBuildFile; fileRef = 522327122239258D0016D3F7 /* MMStickerPickerCell+hook.h */; };\n\t\t522327152239258D0016D3F7 /* MMStickerPickerCell+hook.m in Sources */ = {isa = PBXBuildFile; fileRef = 522327132239258D0016D3F7 /* MMStickerPickerCell+hook.m */; };\n\t\t522547CF1F4AE5A700226A2A /* NSView+Action.h in Headers */ = {isa = PBXBuildFile; fileRef = 522547CD1F4AE5A700226A2A /* NSView+Action.h */; };\n\t\t522547D01F4AE5A700226A2A /* NSView+Action.m in Sources */ = {isa = PBXBuildFile; fileRef = 522547CE1F4AE5A700226A2A /* NSView+Action.m */; };\n\t\t522547DE1F4C312A00226A2A /* TKAutoReplyWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 522547D71F4C312A00226A2A /* TKAutoReplyWindowController.h */; };\n\t\t522547DF1F4C312A00226A2A /* TKAutoReplyWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 522547D81F4C312A00226A2A /* TKAutoReplyWindowController.m */; };\n\t\t522547E01F4C312A00226A2A /* TKAutoReplyWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 522547D91F4C312A00226A2A /* TKAutoReplyWindowController.xib */; };\n\t\t522547E11F4C312A00226A2A /* TKRemoteControlWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 522547DB1F4C312A00226A2A /* TKRemoteControlWindowController.h */; };\n\t\t522547E21F4C312A00226A2A /* TKRemoteControlWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 522547DC1F4C312A00226A2A /* TKRemoteControlWindowController.m */; };\n\t\t5226D5CA2040FC3E0013C048 /* TKVersionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5226D5C82040FC3E0013C048 /* TKVersionManager.h */; };\n\t\t5226D5CB2040FC3E0013C048 /* TKVersionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5226D5C92040FC3E0013C048 /* TKVersionManager.m */; };\n\t\t5228EABA1F70B59500D808CF /* NSButton+Action.h in Headers */ = {isa = PBXBuildFile; fileRef = 5228EAB81F70B59500D808CF /* NSButton+Action.h */; };\n\t\t5228EABB1F70B59500D808CF /* NSButton+Action.m in Sources */ = {isa = PBXBuildFile; fileRef = 5228EAB91F70B59500D808CF /* NSButton+Action.m */; };\n\t\t523848AB1F70E73500771BA3 /* NSTextField+Action.h in Headers */ = {isa = PBXBuildFile; fileRef = 523848A91F70E73500771BA3 /* NSTextField+Action.h */; };\n\t\t523848AC1F70E73500771BA3 /* NSTextField+Action.m in Sources */ = {isa = PBXBuildFile; fileRef = 523848AA1F70E73500771BA3 /* NSTextField+Action.m */; };\n\t\t52475C321F6BA43800760E3E /* TKIgnoreSessonModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 52475C301F6BA43800760E3E /* TKIgnoreSessonModel.h */; };\n\t\t52475C331F6BA43800760E3E /* TKIgnoreSessonModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 52475C311F6BA43800760E3E /* TKIgnoreSessonModel.m */; };\n\t\t526F4D7D1F4AAADA00E46004 /* ColorConstant.h in Headers */ = {isa = PBXBuildFile; fileRef = 526F4D791F4AAADA00E46004 /* ColorConstant.h */; };\n\t\t526F4D801F4AAADA00E46004 /* TKPrefixHeader.pch in Headers */ = {isa = PBXBuildFile; fileRef = 526F4D7C1F4AAADA00E46004 /* TKPrefixHeader.pch */; };\n\t\t526F4D831F4AAC1900E46004 /* TKAutoReplyModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 526F4D811F4AAC1900E46004 /* TKAutoReplyModel.h */; };\n\t\t526F4D841F4AAC1900E46004 /* TKAutoReplyModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 526F4D821F4AAC1900E46004 /* TKAutoReplyModel.m */; };\n\t\t527D017320903C1B007155C9 /* NSMenuItem+Action.h in Headers */ = {isa = PBXBuildFile; fileRef = 527D017120903C1B007155C9 /* NSMenuItem+Action.h */; };\n\t\t527D017420903C1B007155C9 /* NSMenuItem+Action.m in Sources */ = {isa = PBXBuildFile; fileRef = 527D017220903C1B007155C9 /* NSMenuItem+Action.m */; };\n\t\t527E7F622018711800358D26 /* fishhook.c in Sources */ = {isa = PBXBuildFile; fileRef = 527E7F602018711800358D26 /* fishhook.c */; };\n\t\t527E7F632018711800358D26 /* fishhook.h in Headers */ = {isa = PBXBuildFile; fileRef = 527E7F612018711800358D26 /* fishhook.h */; };\n\t\t52810B6B21E8FCF500861FC3 /* TKUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 52810B6921E8FCF500861FC3 /* TKUtility.h */; };\n\t\t52810B6C21E8FCF500861FC3 /* TKUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 52810B6A21E8FCF500861FC3 /* TKUtility.m */; };\n\t\t528B4F971EA7383800BC6A89 /* WeChatPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 528B4F951EA7383800BC6A89 /* WeChatPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t528B4FB41EA7386D00BC6A89 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 528B4FAA1EA7386D00BC6A89 /* main.mm */; };\n\t\t529950622113DAF10008BEE3 /* TKCacheManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 529950602113DAF10008BEE3 /* TKCacheManager.h */; };\n\t\t529950632113DAF10008BEE3 /* TKCacheManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 529950612113DAF10008BEE3 /* TKCacheManager.m */; };\n\t\t5299B2B021087C2B004810D2 /* NSDate+Action.h in Headers */ = {isa = PBXBuildFile; fileRef = 5299B2AE21087C2B004810D2 /* NSDate+Action.h */; };\n\t\t5299B2B121087C2B004810D2 /* NSDate+Action.m in Sources */ = {isa = PBXBuildFile; fileRef = 5299B2AF21087C2B004810D2 /* NSDate+Action.m */; };\n\t\t529CDDFE1F6E6A060056DC1A /* TKBaseModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 529CDDFC1F6E6A060056DC1A /* TKBaseModel.h */; };\n\t\t529CDDFF1F6E6A060056DC1A /* TKBaseModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 529CDDFD1F6E6A060056DC1A /* TKBaseModel.m */; };\n\t\t52B5CEF21F3B4623000D9DD9 /* TKRemoteControlCommands.plist in Resources */ = {isa = PBXBuildFile; fileRef = 52B5CEF01F3B4623000D9DD9 /* TKRemoteControlCommands.plist */; };\n\t\t52B5CEF31F3B4623000D9DD9 /* TKRemoteControlScript.scpt in Resources */ = {isa = PBXBuildFile; fileRef = 52B5CEF11F3B4623000D9DD9 /* TKRemoteControlScript.scpt */; };\n\t\t52B5CF141F3B4631000D9DD9 /* TKWeChatPluginConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CEF91F3B4631000D9DD9 /* TKWeChatPluginConfig.h */; };\n\t\t52B5CF151F3B4631000D9DD9 /* TKWeChatPluginConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CEFA1F3B4631000D9DD9 /* TKWeChatPluginConfig.m */; };\n\t\t52B5CF181F3B4631000D9DD9 /* TKRemoteControlModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CEFF1F3B4631000D9DD9 /* TKRemoteControlModel.h */; };\n\t\t52B5CF191F3B4631000D9DD9 /* TKRemoteControlModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CF001F3B4631000D9DD9 /* TKRemoteControlModel.m */; };\n\t\t52B5CF1A1F3B4631000D9DD9 /* TKHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B5CF021F3B4631000D9DD9 /* TKHelper.h */; };\n\t\t52B5CF1B1F3B4631000D9DD9 /* TKHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B5CF031F3B4631000D9DD9 /* TKHelper.m */; };\n\t\t52CD4C58209C5CA10061A5D6 /* NSWindowController+Action.h in Headers */ = {isa = PBXBuildFile; fileRef = 52CD4C56209C5CA10061A5D6 /* NSWindowController+Action.h */; };\n\t\t52CD4C59209C5CA10061A5D6 /* NSWindowController+Action.m in Sources */ = {isa = PBXBuildFile; fileRef = 52CD4C57209C5CA10061A5D6 /* NSWindowController+Action.m */; };\n\t\t52CD4C5E209CA0510061A5D6 /* TKAboutWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 52CD4C5B209CA0510061A5D6 /* TKAboutWindowController.h */; };\n\t\t52CD4C5F209CA0510061A5D6 /* TKAboutWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 52CD4C5C209CA0510061A5D6 /* TKAboutWindowController.m */; };\n\t\t52CD4C7C209ED2300061A5D6 /* TKAutoReplyCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 52CD4C78209ED22F0061A5D6 /* TKAutoReplyCell.h */; };\n\t\t52CD4C7D209ED2300061A5D6 /* TKAutoReplyContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = 52CD4C79209ED2300061A5D6 /* TKAutoReplyContentView.h */; };\n\t\t52CD4C7E209ED2300061A5D6 /* TKAutoReplyContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 52CD4C7A209ED2300061A5D6 /* TKAutoReplyContentView.m */; };\n\t\t52CD4C7F209ED2300061A5D6 /* TKAutoReplyCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 52CD4C7B209ED2300061A5D6 /* TKAutoReplyCell.m */; };\n\t\t52CD4C82209ED23B0061A5D6 /* TKRemoteControlCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 52CD4C80209ED23B0061A5D6 /* TKRemoteControlCell.m */; };\n\t\t52CD4C83209ED23B0061A5D6 /* TKRemoteControlCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 52CD4C81209ED23B0061A5D6 /* TKRemoteControlCell.h */; };\n\t\t52CD4C8420A01CDC0061A5D6 /* TKAboutWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 52CD4C8620A01CDC0061A5D6 /* TKAboutWindowController.xib */; };\n\t\t52CD4C8B20A07D420061A5D6 /* about.rtfd in Resources */ = {isa = PBXBuildFile; fileRef = 52CD4C8D20A07D420061A5D6 /* about.rtfd */; };\n\t\t52CD4C9720A0885A0061A5D6 /* MMChatsTableCellView+hook.h in Headers */ = {isa = PBXBuildFile; fileRef = 52CD4C9120A088590061A5D6 /* MMChatsTableCellView+hook.h */; };\n\t\t52CD4C9820A0885A0061A5D6 /* WeChat+hook.h in Headers */ = {isa = PBXBuildFile; fileRef = 52CD4C9220A088590061A5D6 /* WeChat+hook.h */; };\n\t\t52CD4C9920A0885A0061A5D6 /* MMStickerMessageCellView+hook.h in Headers */ = {isa = PBXBuildFile; fileRef = 52CD4C9320A088590061A5D6 /* MMStickerMessageCellView+hook.h */; };\n\t\t52CD4C9A20A0885A0061A5D6 /* MMStickerMessageCellView+hook.m in Sources */ = {isa = PBXBuildFile; fileRef = 52CD4C9420A088590061A5D6 /* MMStickerMessageCellView+hook.m */; };\n\t\t52CD4C9B20A0885A0061A5D6 /* WeChat+hook.m in Sources */ = {isa = PBXBuildFile; fileRef = 52CD4C9520A088590061A5D6 /* WeChat+hook.m */; };\n\t\t52CD4C9C20A0885A0061A5D6 /* MMChatsTableCellView+hook.m in Sources */ = {isa = PBXBuildFile; fileRef = 52CD4C9620A088590061A5D6 /* MMChatsTableCellView+hook.m */; };\n\t\t52DA3E0D2094790900C618BB /* TKDownloadWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 52DA3E0A2094790900C618BB /* TKDownloadWindowController.h */; };\n\t\t52DA3E0E2094790900C618BB /* TKDownloadWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 52DA3E0B2094790900C618BB /* TKDownloadWindowController.m */; };\n\t\t52DA3E0F2094790900C618BB /* TKDownloadWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 52DA3E0C2094790900C618BB /* TKDownloadWindowController.xib */; };\n\t\t52EA235920862D19008E6329 /* TKHTTPManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 52EA235720862D19008E6329 /* TKHTTPManager.h */; };\n\t\t52EA235A20862D19008E6329 /* TKHTTPManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 52EA235820862D19008E6329 /* TKHTTPManager.m */; };\n\t\t581E98663A5F0E6327516AA8 /* libPods-WeChatPlugin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 17F7A08DC0E3A0626801414D /* libPods-WeChatPlugin.a */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t13B308B4A92CE38341762A48 /* Pods-WeChatPlugin.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-WeChatPlugin.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-WeChatPlugin/Pods-WeChatPlugin.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t17F7A08DC0E3A0626801414D /* libPods-WeChatPlugin.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-WeChatPlugin.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t520AE6E6208E1DA300BADE47 /* TKMessageManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKMessageManager.h; sourceTree = \"<group>\"; };\n\t\t520AE6E7208E1DA300BADE47 /* TKMessageManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TKMessageManager.m; sourceTree = \"<group>\"; };\n\t\t520AE6EF208E231F00BADE47 /* NotifyConstant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotifyConstant.h; sourceTree = \"<group>\"; };\n\t\t520AE6F1208F62EF00BADE47 /* TKAssistantMenuManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKAssistantMenuManager.h; sourceTree = \"<group>\"; };\n\t\t520AE6F2208F62EF00BADE47 /* TKAssistantMenuManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TKAssistantMenuManager.m; sourceTree = \"<group>\"; };\n\t\t520AE6F5208F632700BADE47 /* TKRemoteControlManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKRemoteControlManager.h; sourceTree = \"<group>\"; };\n\t\t520AE6F6208F632700BADE47 /* TKRemoteControlManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TKRemoteControlManager.m; sourceTree = \"<group>\"; };\n\t\t520F2007205E1DF900A36B1E /* TKWebServerManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKWebServerManager.h; sourceTree = \"<group>\"; };\n\t\t520F2008205E1DF900A36B1E /* TKWebServerManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TKWebServerManager.m; sourceTree = \"<group>\"; };\n\t\t52176DD7209809CE0035FA50 /* NSString+Action.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"NSString+Action.h\"; sourceTree = \"<group>\"; };\n\t\t52176DD8209809CE0035FA50 /* NSString+Action.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"NSString+Action.m\"; sourceTree = \"<group>\"; };\n\t\t521C49C620820663003902E7 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = \"zh-Hans\"; path = \"zh-Hans.lproj/TKRemoteControlWindowController.xib\"; sourceTree = \"<group>\"; };\n\t\t521D75FA2080E3670093C820 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\t521D75FC2080E3780093C820 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = \"zh-Hans\"; path = \"zh-Hans.lproj/Localizable.strings\"; sourceTree = \"<group>\"; };\n\t\t52206B6820836A230010C232 /* NSMenu+Action.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"NSMenu+Action.h\"; sourceTree = \"<group>\"; };\n\t\t52206B6920836A230010C232 /* NSMenu+Action.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"NSMenu+Action.m\"; sourceTree = \"<group>\"; };\n\t\t5223270E223922610016D3F7 /* TKEmoticonManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKEmoticonManager.h; sourceTree = \"<group>\"; };\n\t\t5223270F223922610016D3F7 /* TKEmoticonManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TKEmoticonManager.m; sourceTree = \"<group>\"; };\n\t\t522327122239258D0016D3F7 /* MMStickerPickerCell+hook.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"MMStickerPickerCell+hook.h\"; sourceTree = \"<group>\"; };\n\t\t522327132239258D0016D3F7 /* MMStickerPickerCell+hook.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"MMStickerPickerCell+hook.m\"; sourceTree = \"<group>\"; };\n\t\t522547CD1F4AE5A700226A2A /* NSView+Action.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSView+Action.h\"; sourceTree = \"<group>\"; };\n\t\t522547CE1F4AE5A700226A2A /* NSView+Action.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSView+Action.m\"; sourceTree = \"<group>\"; };\n\t\t522547D71F4C312A00226A2A /* TKAutoReplyWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKAutoReplyWindowController.h; sourceTree = \"<group>\"; };\n\t\t522547D81F4C312A00226A2A /* TKAutoReplyWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKAutoReplyWindowController.m; sourceTree = \"<group>\"; };\n\t\t522547D91F4C312A00226A2A /* TKAutoReplyWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TKAutoReplyWindowController.xib; sourceTree = \"<group>\"; };\n\t\t522547DB1F4C312A00226A2A /* TKRemoteControlWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKRemoteControlWindowController.h; sourceTree = \"<group>\"; };\n\t\t522547DC1F4C312A00226A2A /* TKRemoteControlWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKRemoteControlWindowController.m; sourceTree = \"<group>\"; };\n\t\t5226D5C82040FC3E0013C048 /* TKVersionManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKVersionManager.h; sourceTree = \"<group>\"; };\n\t\t5226D5C92040FC3E0013C048 /* TKVersionManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TKVersionManager.m; sourceTree = \"<group>\"; };\n\t\t5228EAB81F70B59500D808CF /* NSButton+Action.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSButton+Action.h\"; sourceTree = \"<group>\"; };\n\t\t5228EAB91F70B59500D808CF /* NSButton+Action.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSButton+Action.m\"; sourceTree = \"<group>\"; };\n\t\t523848A91F70E73500771BA3 /* NSTextField+Action.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSTextField+Action.h\"; sourceTree = \"<group>\"; };\n\t\t523848AA1F70E73500771BA3 /* NSTextField+Action.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSTextField+Action.m\"; sourceTree = \"<group>\"; };\n\t\t5239B393241CAFDD00A471B4 /* TKConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKConstants.h; sourceTree = \"<group>\"; };\n\t\t52475C301F6BA43800760E3E /* TKIgnoreSessonModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKIgnoreSessonModel.h; sourceTree = \"<group>\"; };\n\t\t52475C311F6BA43800760E3E /* TKIgnoreSessonModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKIgnoreSessonModel.m; sourceTree = \"<group>\"; };\n\t\t526A26702081AC03005B3E3C /* DefineConstant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DefineConstant.h; sourceTree = \"<group>\"; };\n\t\t526F4D791F4AAADA00E46004 /* ColorConstant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorConstant.h; sourceTree = \"<group>\"; };\n\t\t526F4D7C1F4AAADA00E46004 /* TKPrefixHeader.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKPrefixHeader.pch; sourceTree = \"<group>\"; };\n\t\t526F4D811F4AAC1900E46004 /* TKAutoReplyModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKAutoReplyModel.h; sourceTree = \"<group>\"; };\n\t\t526F4D821F4AAC1900E46004 /* TKAutoReplyModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKAutoReplyModel.m; sourceTree = \"<group>\"; };\n\t\t527D017120903C1B007155C9 /* NSMenuItem+Action.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"NSMenuItem+Action.h\"; sourceTree = \"<group>\"; };\n\t\t527D017220903C1B007155C9 /* NSMenuItem+Action.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"NSMenuItem+Action.m\"; sourceTree = \"<group>\"; };\n\t\t527E7F602018711800358D26 /* fishhook.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fishhook.c; sourceTree = \"<group>\"; };\n\t\t527E7F612018711800358D26 /* fishhook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fishhook.h; sourceTree = \"<group>\"; };\n\t\t52810B6921E8FCF500861FC3 /* TKUtility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKUtility.h; sourceTree = \"<group>\"; };\n\t\t52810B6A21E8FCF500861FC3 /* TKUtility.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TKUtility.m; sourceTree = \"<group>\"; };\n\t\t52810B6D21E90B2400861FC3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/TKAboutWindowController.xib; sourceTree = \"<group>\"; };\n\t\t52810B6E21E90B2500861FC3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/TKRemoteControlWindowController.xib; sourceTree = \"<group>\"; };\n\t\t528B4F921EA7383800BC6A89 /* WeChatPlugin.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WeChatPlugin.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t528B4F951EA7383800BC6A89 /* WeChatPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WeChatPlugin.h; sourceTree = \"<group>\"; };\n\t\t528B4F961EA7383800BC6A89 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t528B4FAA1EA7386D00BC6A89 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = \"<group>\"; };\n\t\t529950602113DAF10008BEE3 /* TKCacheManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKCacheManager.h; sourceTree = \"<group>\"; };\n\t\t529950612113DAF10008BEE3 /* TKCacheManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TKCacheManager.m; sourceTree = \"<group>\"; };\n\t\t5299B2AE21087C2B004810D2 /* NSDate+Action.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"NSDate+Action.h\"; sourceTree = \"<group>\"; };\n\t\t5299B2AF21087C2B004810D2 /* NSDate+Action.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"NSDate+Action.m\"; sourceTree = \"<group>\"; };\n\t\t529CDDFC1F6E6A060056DC1A /* TKBaseModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKBaseModel.h; sourceTree = \"<group>\"; };\n\t\t529CDDFD1F6E6A060056DC1A /* TKBaseModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKBaseModel.m; sourceTree = \"<group>\"; };\n\t\t52B5CEF01F3B4623000D9DD9 /* TKRemoteControlCommands.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = TKRemoteControlCommands.plist; sourceTree = \"<group>\"; };\n\t\t52B5CEF11F3B4623000D9DD9 /* TKRemoteControlScript.scpt */ = {isa = PBXFileReference; lastKnownFileType = file; path = TKRemoteControlScript.scpt; sourceTree = \"<group>\"; };\n\t\t52B5CEF91F3B4631000D9DD9 /* TKWeChatPluginConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKWeChatPluginConfig.h; sourceTree = \"<group>\"; };\n\t\t52B5CEFA1F3B4631000D9DD9 /* TKWeChatPluginConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKWeChatPluginConfig.m; sourceTree = \"<group>\"; };\n\t\t52B5CEFF1F3B4631000D9DD9 /* TKRemoteControlModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKRemoteControlModel.h; sourceTree = \"<group>\"; };\n\t\t52B5CF001F3B4631000D9DD9 /* TKRemoteControlModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKRemoteControlModel.m; sourceTree = \"<group>\"; };\n\t\t52B5CF021F3B4631000D9DD9 /* TKHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKHelper.h; sourceTree = \"<group>\"; };\n\t\t52B5CF031F3B4631000D9DD9 /* TKHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKHelper.m; sourceTree = \"<group>\"; };\n\t\t52CD4C56209C5CA10061A5D6 /* NSWindowController+Action.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"NSWindowController+Action.h\"; sourceTree = \"<group>\"; };\n\t\t52CD4C57209C5CA10061A5D6 /* NSWindowController+Action.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"NSWindowController+Action.m\"; sourceTree = \"<group>\"; };\n\t\t52CD4C5B209CA0510061A5D6 /* TKAboutWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKAboutWindowController.h; sourceTree = \"<group>\"; };\n\t\t52CD4C5C209CA0510061A5D6 /* TKAboutWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TKAboutWindowController.m; sourceTree = \"<group>\"; };\n\t\t52CD4C78209ED22F0061A5D6 /* TKAutoReplyCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKAutoReplyCell.h; sourceTree = \"<group>\"; };\n\t\t52CD4C79209ED2300061A5D6 /* TKAutoReplyContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKAutoReplyContentView.h; sourceTree = \"<group>\"; };\n\t\t52CD4C7A209ED2300061A5D6 /* TKAutoReplyContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKAutoReplyContentView.m; sourceTree = \"<group>\"; };\n\t\t52CD4C7B209ED2300061A5D6 /* TKAutoReplyCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKAutoReplyCell.m; sourceTree = \"<group>\"; };\n\t\t52CD4C80209ED23B0061A5D6 /* TKRemoteControlCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKRemoteControlCell.m; sourceTree = \"<group>\"; };\n\t\t52CD4C81209ED23B0061A5D6 /* TKRemoteControlCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKRemoteControlCell.h; sourceTree = \"<group>\"; };\n\t\t52CD4C8520A01CDC0061A5D6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/TKAboutWindowController.xib; sourceTree = \"<group>\"; };\n\t\t52CD4C8820A07B8E0061A5D6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = \"zh-Hant\"; path = \"zh-Hant.lproj/TKAboutWindowController.xib\"; sourceTree = \"<group>\"; };\n\t\t52CD4C8920A07B8E0061A5D6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = \"zh-Hant\"; path = \"zh-Hant.lproj/TKRemoteControlWindowController.xib\"; sourceTree = \"<group>\"; };\n\t\t52CD4C8A20A07B8E0061A5D6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = \"zh-Hant\"; path = \"zh-Hant.lproj/Localizable.strings\"; sourceTree = \"<group>\"; };\n\t\t52CD4C8C20A07D420061A5D6 /* en */ = {isa = PBXFileReference; lastKnownFileType = wrapper.rtfd; name = en; path = en.lproj/about.rtfd; sourceTree = \"<group>\"; };\n\t\t52CD4C8E20A07D450061A5D6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = wrapper.rtfd; name = \"zh-Hans\"; path = \"zh-Hans.lproj/about.rtfd\"; sourceTree = \"<group>\"; };\n\t\t52CD4C8F20A07D460061A5D6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = wrapper.rtfd; name = \"zh-Hant\"; path = \"zh-Hant.lproj/about.rtfd\"; sourceTree = \"<group>\"; };\n\t\t52CD4C9120A088590061A5D6 /* MMChatsTableCellView+hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"MMChatsTableCellView+hook.h\"; sourceTree = \"<group>\"; };\n\t\t52CD4C9220A088590061A5D6 /* WeChat+hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"WeChat+hook.h\"; sourceTree = \"<group>\"; };\n\t\t52CD4C9320A088590061A5D6 /* MMStickerMessageCellView+hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"MMStickerMessageCellView+hook.h\"; sourceTree = \"<group>\"; };\n\t\t52CD4C9420A088590061A5D6 /* MMStickerMessageCellView+hook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"MMStickerMessageCellView+hook.m\"; sourceTree = \"<group>\"; };\n\t\t52CD4C9520A088590061A5D6 /* WeChat+hook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"WeChat+hook.m\"; sourceTree = \"<group>\"; };\n\t\t52CD4C9620A088590061A5D6 /* MMChatsTableCellView+hook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"MMChatsTableCellView+hook.m\"; sourceTree = \"<group>\"; };\n\t\t52DA3E0A2094790900C618BB /* TKDownloadWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKDownloadWindowController.h; sourceTree = \"<group>\"; };\n\t\t52DA3E0B2094790900C618BB /* TKDownloadWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TKDownloadWindowController.m; sourceTree = \"<group>\"; };\n\t\t52DA3E0C2094790900C618BB /* TKDownloadWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TKDownloadWindowController.xib; sourceTree = \"<group>\"; };\n\t\t52EA235720862D19008E6329 /* TKHTTPManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TKHTTPManager.h; sourceTree = \"<group>\"; };\n\t\t52EA235820862D19008E6329 /* TKHTTPManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TKHTTPManager.m; sourceTree = \"<group>\"; };\n\t\t888B2791FA0BBCC192BADA47 /* Pods-WeChatPlugin.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-WeChatPlugin.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-WeChatPlugin/Pods-WeChatPlugin.debug.xcconfig\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t528B4F8E1EA7383800BC6A89 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t581E98663A5F0E6327516AA8 /* libPods-WeChatPlugin.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t13EC3A000F46808B50A62C6F /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t17F7A08DC0E3A0626801414D /* libPods-WeChatPlugin.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3C138513A2C7760B47317A95 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t888B2791FA0BBCC192BADA47 /* Pods-WeChatPlugin.debug.xcconfig */,\n\t\t\t\t13B308B4A92CE38341762A48 /* Pods-WeChatPlugin.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t520AE6F9208F646200BADE47 /* Utils */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52B5CF021F3B4631000D9DD9 /* TKHelper.h */,\n\t\t\t\t52B5CF031F3B4631000D9DD9 /* TKHelper.m */,\n\t\t\t\t52810B6921E8FCF500861FC3 /* TKUtility.h */,\n\t\t\t\t52810B6A21E8FCF500861FC3 /* TKUtility.m */,\n\t\t\t);\n\t\t\tpath = Utils;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t522547CC1F4AE5A700226A2A /* Category */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t522547CD1F4AE5A700226A2A /* NSView+Action.h */,\n\t\t\t\t522547CE1F4AE5A700226A2A /* NSView+Action.m */,\n\t\t\t\t5228EAB81F70B59500D808CF /* NSButton+Action.h */,\n\t\t\t\t5228EAB91F70B59500D808CF /* NSButton+Action.m */,\n\t\t\t\t523848A91F70E73500771BA3 /* NSTextField+Action.h */,\n\t\t\t\t523848AA1F70E73500771BA3 /* NSTextField+Action.m */,\n\t\t\t\t52206B6820836A230010C232 /* NSMenu+Action.h */,\n\t\t\t\t52206B6920836A230010C232 /* NSMenu+Action.m */,\n\t\t\t\t527D017120903C1B007155C9 /* NSMenuItem+Action.h */,\n\t\t\t\t527D017220903C1B007155C9 /* NSMenuItem+Action.m */,\n\t\t\t\t52176DD7209809CE0035FA50 /* NSString+Action.h */,\n\t\t\t\t52176DD8209809CE0035FA50 /* NSString+Action.m */,\n\t\t\t\t52CD4C56209C5CA10061A5D6 /* NSWindowController+Action.h */,\n\t\t\t\t52CD4C57209C5CA10061A5D6 /* NSWindowController+Action.m */,\n\t\t\t\t5299B2AE21087C2B004810D2 /* NSDate+Action.h */,\n\t\t\t\t5299B2AF21087C2B004810D2 /* NSDate+Action.m */,\n\t\t\t);\n\t\t\tpath = Category;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t522547D11F4AE5AE00226A2A /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t522547D61F4C312A00226A2A /* AutoReply */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t522547D71F4C312A00226A2A /* TKAutoReplyWindowController.h */,\n\t\t\t\t522547D81F4C312A00226A2A /* TKAutoReplyWindowController.m */,\n\t\t\t\t522547D91F4C312A00226A2A /* TKAutoReplyWindowController.xib */,\n\t\t\t);\n\t\t\tpath = AutoReply;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t522547DA1F4C312A00226A2A /* RemoteControl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t522547DB1F4C312A00226A2A /* TKRemoteControlWindowController.h */,\n\t\t\t\t522547DC1F4C312A00226A2A /* TKRemoteControlWindowController.m */,\n\t\t\t\t521C49C520820662003902E7 /* TKRemoteControlWindowController.xib */,\n\t\t\t);\n\t\t\tpath = RemoteControl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5268C514209199690090BE40 /* Download */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52DA3E0A2094790900C618BB /* TKDownloadWindowController.h */,\n\t\t\t\t52DA3E0B2094790900C618BB /* TKDownloadWindowController.m */,\n\t\t\t\t52DA3E0C2094790900C618BB /* TKDownloadWindowController.xib */,\n\t\t\t);\n\t\t\tpath = Download;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t526A266F2081A8DC005B3E3C /* Macro */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t526F4D791F4AAADA00E46004 /* ColorConstant.h */,\n\t\t\t\t526A26702081AC03005B3E3C /* DefineConstant.h */,\n\t\t\t\t520AE6EF208E231F00BADE47 /* NotifyConstant.h */,\n\t\t\t);\n\t\t\tpath = Macro;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t526F4D781F4AAADA00E46004 /* Common */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t526A266F2081A8DC005B3E3C /* Macro */,\n\t\t\t\t522547D11F4AE5AE00226A2A /* View */,\n\t\t\t\t522547CC1F4AE5A700226A2A /* Category */,\n\t\t\t\t526F4D7C1F4AAADA00E46004 /* TKPrefixHeader.pch */,\n\t\t\t);\n\t\t\tpath = Common;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t527E7F5F2018711800358D26 /* Vendor */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t527E7F602018711800358D26 /* fishhook.c */,\n\t\t\t\t527E7F612018711800358D26 /* fishhook.h */,\n\t\t\t);\n\t\t\tpath = Vendor;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t528B4F881EA7383800BC6A89 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t528B4F941EA7383800BC6A89 /* WeChatPlugin */,\n\t\t\t\t528B4F931EA7383800BC6A89 /* Products */,\n\t\t\t\t3C138513A2C7760B47317A95 /* Pods */,\n\t\t\t\t13EC3A000F46808B50A62C6F /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t528B4F931EA7383800BC6A89 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t528B4F921EA7383800BC6A89 /* WeChatPlugin.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t528B4F941EA7383800BC6A89 /* WeChatPlugin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52B5CEF41F3B4631000D9DD9 /* Sources */,\n\t\t\t\t52B5CEEF1F3B45ED000D9DD9 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = WeChatPlugin;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52B5CEEF1F3B45ED000D9DD9 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t528B4FAA1EA7386D00BC6A89 /* main.mm */,\n\t\t\t\t52CD4C8D20A07D420061A5D6 /* about.rtfd */,\n\t\t\t\t528B4F951EA7383800BC6A89 /* WeChatPlugin.h */,\n\t\t\t\t528B4F961EA7383800BC6A89 /* Info.plist */,\n\t\t\t\t52B5CEF11F3B4623000D9DD9 /* TKRemoteControlScript.scpt */,\n\t\t\t\t521D75FB2080E3670093C820 /* Localizable.strings */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52B5CEF41F3B4631000D9DD9 /* Sources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52CD4C9020A088590061A5D6 /* Hook */,\n\t\t\t\t52CD4C75209ED2160061A5D6 /* Views */,\n\t\t\t\t527E7F5F2018711800358D26 /* Vendor */,\n\t\t\t\t526F4D781F4AAADA00E46004 /* Common */,\n\t\t\t\t52B5CEF81F3B4631000D9DD9 /* Config */,\n\t\t\t\t52B5CEFE1F3B4631000D9DD9 /* Models */,\n\t\t\t\t520AE6F9208F646200BADE47 /* Utils */,\n\t\t\t\t52B5CF011F3B4631000D9DD9 /* Managers */,\n\t\t\t\t52B5CF091F3B4631000D9DD9 /* WindowControllers */,\n\t\t\t);\n\t\t\tpath = Sources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52B5CEF81F3B4631000D9DD9 /* Config */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52B5CEF91F3B4631000D9DD9 /* TKWeChatPluginConfig.h */,\n\t\t\t\t52B5CEFA1F3B4631000D9DD9 /* TKWeChatPluginConfig.m */,\n\t\t\t\t5239B393241CAFDD00A471B4 /* TKConstants.h */,\n\t\t\t);\n\t\t\tpath = Config;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52B5CEFE1F3B4631000D9DD9 /* Models */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t529CDDFC1F6E6A060056DC1A /* TKBaseModel.h */,\n\t\t\t\t529CDDFD1F6E6A060056DC1A /* TKBaseModel.m */,\n\t\t\t\t526F4D811F4AAC1900E46004 /* TKAutoReplyModel.h */,\n\t\t\t\t526F4D821F4AAC1900E46004 /* TKAutoReplyModel.m */,\n\t\t\t\t52B5CEFF1F3B4631000D9DD9 /* TKRemoteControlModel.h */,\n\t\t\t\t52B5CF001F3B4631000D9DD9 /* TKRemoteControlModel.m */,\n\t\t\t\t52475C301F6BA43800760E3E /* TKIgnoreSessonModel.h */,\n\t\t\t\t52475C311F6BA43800760E3E /* TKIgnoreSessonModel.m */,\n\t\t\t);\n\t\t\tpath = Models;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52B5CF011F3B4631000D9DD9 /* Managers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5226D5C82040FC3E0013C048 /* TKVersionManager.h */,\n\t\t\t\t5226D5C92040FC3E0013C048 /* TKVersionManager.m */,\n\t\t\t\t520F2007205E1DF900A36B1E /* TKWebServerManager.h */,\n\t\t\t\t520F2008205E1DF900A36B1E /* TKWebServerManager.m */,\n\t\t\t\t52EA235720862D19008E6329 /* TKHTTPManager.h */,\n\t\t\t\t52EA235820862D19008E6329 /* TKHTTPManager.m */,\n\t\t\t\t520AE6E6208E1DA300BADE47 /* TKMessageManager.h */,\n\t\t\t\t520AE6E7208E1DA300BADE47 /* TKMessageManager.m */,\n\t\t\t\t520AE6F1208F62EF00BADE47 /* TKAssistantMenuManager.h */,\n\t\t\t\t520AE6F2208F62EF00BADE47 /* TKAssistantMenuManager.m */,\n\t\t\t\t520AE6F5208F632700BADE47 /* TKRemoteControlManager.h */,\n\t\t\t\t520AE6F6208F632700BADE47 /* TKRemoteControlManager.m */,\n\t\t\t\t52B5CEF01F3B4623000D9DD9 /* TKRemoteControlCommands.plist */,\n\t\t\t\t529950602113DAF10008BEE3 /* TKCacheManager.h */,\n\t\t\t\t529950612113DAF10008BEE3 /* TKCacheManager.m */,\n\t\t\t\t5223270E223922610016D3F7 /* TKEmoticonManager.h */,\n\t\t\t\t5223270F223922610016D3F7 /* TKEmoticonManager.m */,\n\t\t\t);\n\t\t\tpath = Managers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52B5CF091F3B4631000D9DD9 /* WindowControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52CD4C5A209CA0380061A5D6 /* About */,\n\t\t\t\t5268C514209199690090BE40 /* Download */,\n\t\t\t\t522547D61F4C312A00226A2A /* AutoReply */,\n\t\t\t\t522547DA1F4C312A00226A2A /* RemoteControl */,\n\t\t\t);\n\t\t\tpath = WindowControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52CD4C5A209CA0380061A5D6 /* About */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52CD4C5B209CA0510061A5D6 /* TKAboutWindowController.h */,\n\t\t\t\t52CD4C5C209CA0510061A5D6 /* TKAboutWindowController.m */,\n\t\t\t\t52CD4C8620A01CDC0061A5D6 /* TKAboutWindowController.xib */,\n\t\t\t);\n\t\t\tpath = About;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52CD4C75209ED2160061A5D6 /* Views */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52CD4C76209ED2160061A5D6 /* AutoReply */,\n\t\t\t\t52CD4C77209ED2160061A5D6 /* RemoteControl */,\n\t\t\t);\n\t\t\tpath = Views;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52CD4C76209ED2160061A5D6 /* AutoReply */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52CD4C78209ED22F0061A5D6 /* TKAutoReplyCell.h */,\n\t\t\t\t52CD4C7B209ED2300061A5D6 /* TKAutoReplyCell.m */,\n\t\t\t\t52CD4C79209ED2300061A5D6 /* TKAutoReplyContentView.h */,\n\t\t\t\t52CD4C7A209ED2300061A5D6 /* TKAutoReplyContentView.m */,\n\t\t\t);\n\t\t\tpath = AutoReply;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52CD4C77209ED2160061A5D6 /* RemoteControl */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52CD4C81209ED23B0061A5D6 /* TKRemoteControlCell.h */,\n\t\t\t\t52CD4C80209ED23B0061A5D6 /* TKRemoteControlCell.m */,\n\t\t\t);\n\t\t\tpath = RemoteControl;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52CD4C9020A088590061A5D6 /* Hook */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52CD4C9220A088590061A5D6 /* WeChat+hook.h */,\n\t\t\t\t52CD4C9520A088590061A5D6 /* WeChat+hook.m */,\n\t\t\t\t52CD4C9120A088590061A5D6 /* MMChatsTableCellView+hook.h */,\n\t\t\t\t52CD4C9620A088590061A5D6 /* MMChatsTableCellView+hook.m */,\n\t\t\t\t52CD4C9320A088590061A5D6 /* MMStickerMessageCellView+hook.h */,\n\t\t\t\t52CD4C9420A088590061A5D6 /* MMStickerMessageCellView+hook.m */,\n\t\t\t\t522327122239258D0016D3F7 /* MMStickerPickerCell+hook.h */,\n\t\t\t\t522327132239258D0016D3F7 /* MMStickerPickerCell+hook.m */,\n\t\t\t);\n\t\t\tpath = Hook;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t528B4F8F1EA7383800BC6A89 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t522327142239258D0016D3F7 /* MMStickerPickerCell+hook.h in Headers */,\n\t\t\t\t522547DE1F4C312A00226A2A /* TKAutoReplyWindowController.h in Headers */,\n\t\t\t\t5228EABA1F70B59500D808CF /* NSButton+Action.h in Headers */,\n\t\t\t\t526F4D7D1F4AAADA00E46004 /* ColorConstant.h in Headers */,\n\t\t\t\t527E7F632018711800358D26 /* fishhook.h in Headers */,\n\t\t\t\t528B4F971EA7383800BC6A89 /* WeChatPlugin.h in Headers */,\n\t\t\t\t526F4D801F4AAADA00E46004 /* TKPrefixHeader.pch in Headers */,\n\t\t\t\t52EA235920862D19008E6329 /* TKHTTPManager.h in Headers */,\n\t\t\t\t529CDDFE1F6E6A060056DC1A /* TKBaseModel.h in Headers */,\n\t\t\t\t52CD4C58209C5CA10061A5D6 /* NSWindowController+Action.h in Headers */,\n\t\t\t\t5299B2B021087C2B004810D2 /* NSDate+Action.h in Headers */,\n\t\t\t\t52B5CF1A1F3B4631000D9DD9 /* TKHelper.h in Headers */,\n\t\t\t\t52CD4C83209ED23B0061A5D6 /* TKRemoteControlCell.h in Headers */,\n\t\t\t\t527D017320903C1B007155C9 /* NSMenuItem+Action.h in Headers */,\n\t\t\t\t523848AB1F70E73500771BA3 /* NSTextField+Action.h in Headers */,\n\t\t\t\t52CD4C7C209ED2300061A5D6 /* TKAutoReplyCell.h in Headers */,\n\t\t\t\t52CD4C9820A0885A0061A5D6 /* WeChat+hook.h in Headers */,\n\t\t\t\t52CD4C9720A0885A0061A5D6 /* MMChatsTableCellView+hook.h in Headers */,\n\t\t\t\t52DA3E0D2094790900C618BB /* TKDownloadWindowController.h in Headers */,\n\t\t\t\t52475C321F6BA43800760E3E /* TKIgnoreSessonModel.h in Headers */,\n\t\t\t\t52810B6B21E8FCF500861FC3 /* TKUtility.h in Headers */,\n\t\t\t\t52206B6A20836A230010C232 /* NSMenu+Action.h in Headers */,\n\t\t\t\t52B5CF181F3B4631000D9DD9 /* TKRemoteControlModel.h in Headers */,\n\t\t\t\t52CD4C7D209ED2300061A5D6 /* TKAutoReplyContentView.h in Headers */,\n\t\t\t\t5226D5CA2040FC3E0013C048 /* TKVersionManager.h in Headers */,\n\t\t\t\t520F2009205E1DF900A36B1E /* TKWebServerManager.h in Headers */,\n\t\t\t\t520AE6F7208F632700BADE47 /* TKRemoteControlManager.h in Headers */,\n\t\t\t\t522547CF1F4AE5A700226A2A /* NSView+Action.h in Headers */,\n\t\t\t\t52232710223922610016D3F7 /* TKEmoticonManager.h in Headers */,\n\t\t\t\t520AE6F0208E231F00BADE47 /* NotifyConstant.h in Headers */,\n\t\t\t\t529950622113DAF10008BEE3 /* TKCacheManager.h in Headers */,\n\t\t\t\t52CD4C5E209CA0510061A5D6 /* TKAboutWindowController.h in Headers */,\n\t\t\t\t522547E11F4C312A00226A2A /* TKRemoteControlWindowController.h in Headers */,\n\t\t\t\t520AE6F3208F62EF00BADE47 /* TKAssistantMenuManager.h in Headers */,\n\t\t\t\t526F4D831F4AAC1900E46004 /* TKAutoReplyModel.h in Headers */,\n\t\t\t\t520AE6E8208E1DA300BADE47 /* TKMessageManager.h in Headers */,\n\t\t\t\t52CD4C9920A0885A0061A5D6 /* MMStickerMessageCellView+hook.h in Headers */,\n\t\t\t\t52176DD9209809CE0035FA50 /* NSString+Action.h in Headers */,\n\t\t\t\t52B5CF141F3B4631000D9DD9 /* TKWeChatPluginConfig.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t528B4F911EA7383800BC6A89 /* WeChatPlugin */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 528B4F9A1EA7383800BC6A89 /* Build configuration list for PBXNativeTarget \"WeChatPlugin\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tA23204925F0A37A0EBE14B92 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t528B4F8D1EA7383800BC6A89 /* Sources */,\n\t\t\t\t528B4F8E1EA7383800BC6A89 /* Frameworks */,\n\t\t\t\t528B4F8F1EA7383800BC6A89 /* Headers */,\n\t\t\t\t528B4F901EA7383800BC6A89 /* Resources */,\n\t\t\t\t528B4FB51EA738B100BC6A89 /* ShellScript */,\n\t\t\t\t165746E0A28B760DEA538E0D /* [CP] Copy Pods Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = WeChatPlugin;\n\t\t\tproductName = WeChatPlugin;\n\t\t\tproductReference = 528B4F921EA7383800BC6A89 /* WeChatPlugin.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t528B4F891EA7383800BC6A89 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0930;\n\t\t\t\tORGANIZATIONNAME = tk;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t528B4F911EA7383800BC6A89 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 528B4F8C1EA7383800BC6A89 /* Build configuration list for PBXProject \"WeChatPlugin\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t\t\"zh-Hans\",\n\t\t\t\t\"zh-Hant\",\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 528B4F881EA7383800BC6A89;\n\t\t\tproductRefGroup = 528B4F931EA7383800BC6A89 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t528B4F911EA7383800BC6A89 /* WeChatPlugin */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t528B4F901EA7383800BC6A89 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t52DA3E0F2094790900C618BB /* TKDownloadWindowController.xib in Resources */,\n\t\t\t\t521D75F92080E3670093C820 /* Localizable.strings in Resources */,\n\t\t\t\t522547E01F4C312A00226A2A /* TKAutoReplyWindowController.xib in Resources */,\n\t\t\t\t52B5CEF21F3B4623000D9DD9 /* TKRemoteControlCommands.plist in Resources */,\n\t\t\t\t52CD4C8420A01CDC0061A5D6 /* TKAboutWindowController.xib in Resources */,\n\t\t\t\t52B5CEF31F3B4623000D9DD9 /* TKRemoteControlScript.scpt in Resources */,\n\t\t\t\t52CD4C8B20A07D420061A5D6 /* about.rtfd in Resources */,\n\t\t\t\t521C49C320820662003902E7 /* TKRemoteControlWindowController.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t165746E0A28B760DEA538E0D /* [CP] Copy Pods Resources */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"[CP] Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods-WeChatPlugin/Pods-WeChatPlugin-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t528B4FB51EA738B100BC6A89 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"#!/bin/bash\\napp_name=\\\"WeChat\\\"\\nframework_name=\\\"WeChatPlugin\\\"\\napp_bundle_path=\\\"/Applications/${app_name}.app/Contents/MacOS\\\"\\napp_executable_path=\\\"${app_bundle_path}/${app_name}\\\"\\napp_executable_backup_path=\\\"${app_executable_path}_backup\\\"\\nframework_path=\\\"${app_bundle_path}/${framework_name}.framework\\\"\\n# 备份WeChat原始可执行文件\\nif [ ! -f \\\"$app_executable_backup_path\\\" ]\\nthen\\ncp \\\"$app_executable_path\\\" \\\"$app_executable_backup_path\\\"\\nfi\\n\\nrm -rf \\\"./Other/Products/Debug/${framework_name}.framework\\\"\\ncp -r \\\"${BUILT_PRODUCTS_DIR}/${framework_name}.framework\\\" \\\"./Other/Products/Debug/${framework_name}.framework\\\"\\n\\ncp -r \\\"${BUILT_PRODUCTS_DIR}/${framework_name}.framework\\\" ${app_bundle_path}\\n./Other/insert_dylib --all-yes \\\"${framework_path}/${framework_name}\\\" \\\"$app_executable_backup_path\\\" \\\"$app_executable_path\\\"\\n\";\n\t\t};\n\t\tA23204925F0A37A0EBE14B92 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-WeChatPlugin-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t528B4F8D1EA7383800BC6A89 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t52CD4C5F209CA0510061A5D6 /* TKAboutWindowController.m in Sources */,\n\t\t\t\t520F200A205E1DF900A36B1E /* TKWebServerManager.m in Sources */,\n\t\t\t\t52CD4C9C20A0885A0061A5D6 /* MMChatsTableCellView+hook.m in Sources */,\n\t\t\t\t52B5CF151F3B4631000D9DD9 /* TKWeChatPluginConfig.m in Sources */,\n\t\t\t\t52CD4C7F209ED2300061A5D6 /* TKAutoReplyCell.m in Sources */,\n\t\t\t\t52CD4C9B20A0885A0061A5D6 /* WeChat+hook.m in Sources */,\n\t\t\t\t522547E21F4C312A00226A2A /* TKRemoteControlWindowController.m in Sources */,\n\t\t\t\t529CDDFF1F6E6A060056DC1A /* TKBaseModel.m in Sources */,\n\t\t\t\t52DA3E0E2094790900C618BB /* TKDownloadWindowController.m in Sources */,\n\t\t\t\t527E7F622018711800358D26 /* fishhook.c in Sources */,\n\t\t\t\t52176DDA209809CE0035FA50 /* NSString+Action.m in Sources */,\n\t\t\t\t529950632113DAF10008BEE3 /* TKCacheManager.m in Sources */,\n\t\t\t\t52EA235A20862D19008E6329 /* TKHTTPManager.m in Sources */,\n\t\t\t\t52810B6C21E8FCF500861FC3 /* TKUtility.m in Sources */,\n\t\t\t\t5299B2B121087C2B004810D2 /* NSDate+Action.m in Sources */,\n\t\t\t\t527D017420903C1B007155C9 /* NSMenuItem+Action.m in Sources */,\n\t\t\t\t52B5CF1B1F3B4631000D9DD9 /* TKHelper.m in Sources */,\n\t\t\t\t52206B6B20836A230010C232 /* NSMenu+Action.m in Sources */,\n\t\t\t\t520AE6F8208F632700BADE47 /* TKRemoteControlManager.m in Sources */,\n\t\t\t\t520AE6F4208F62EF00BADE47 /* TKAssistantMenuManager.m in Sources */,\n\t\t\t\t522547D01F4AE5A700226A2A /* NSView+Action.m in Sources */,\n\t\t\t\t523848AC1F70E73500771BA3 /* NSTextField+Action.m in Sources */,\n\t\t\t\t526F4D841F4AAC1900E46004 /* TKAutoReplyModel.m in Sources */,\n\t\t\t\t522547DF1F4C312A00226A2A /* TKAutoReplyWindowController.m in Sources */,\n\t\t\t\t5226D5CB2040FC3E0013C048 /* TKVersionManager.m in Sources */,\n\t\t\t\t522327152239258D0016D3F7 /* MMStickerPickerCell+hook.m in Sources */,\n\t\t\t\t52CD4C7E209ED2300061A5D6 /* TKAutoReplyContentView.m in Sources */,\n\t\t\t\t520AE6E9208E1DA300BADE47 /* TKMessageManager.m in Sources */,\n\t\t\t\t52B5CF191F3B4631000D9DD9 /* TKRemoteControlModel.m in Sources */,\n\t\t\t\t5228EABB1F70B59500D808CF /* NSButton+Action.m in Sources */,\n\t\t\t\t52CD4C59209C5CA10061A5D6 /* NSWindowController+Action.m in Sources */,\n\t\t\t\t52CD4C82209ED23B0061A5D6 /* TKRemoteControlCell.m in Sources */,\n\t\t\t\t52232711223922610016D3F7 /* TKEmoticonManager.m in Sources */,\n\t\t\t\t528B4FB41EA7386D00BC6A89 /* main.mm in Sources */,\n\t\t\t\t52CD4C9A20A0885A0061A5D6 /* MMStickerMessageCellView+hook.m in Sources */,\n\t\t\t\t52475C331F6BA43800760E3E /* TKIgnoreSessonModel.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t521C49C520820662003902E7 /* TKRemoteControlWindowController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t521C49C620820663003902E7 /* zh-Hans */,\n\t\t\t\t52CD4C8920A07B8E0061A5D6 /* zh-Hant */,\n\t\t\t\t52810B6E21E90B2500861FC3 /* Base */,\n\t\t\t);\n\t\t\tname = TKRemoteControlWindowController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t521D75FB2080E3670093C820 /* Localizable.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t521D75FA2080E3670093C820 /* en */,\n\t\t\t\t521D75FC2080E3780093C820 /* zh-Hans */,\n\t\t\t\t52CD4C8A20A07B8E0061A5D6 /* zh-Hant */,\n\t\t\t);\n\t\t\tname = Localizable.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52CD4C8620A01CDC0061A5D6 /* TKAboutWindowController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t52CD4C8520A01CDC0061A5D6 /* en */,\n\t\t\t\t52CD4C8820A07B8E0061A5D6 /* zh-Hant */,\n\t\t\t\t52810B6D21E90B2400861FC3 /* Base */,\n\t\t\t);\n\t\t\tname = TKAboutWindowController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52CD4C8D20A07D420061A5D6 /* about.rtfd */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t52CD4C8C20A07D420061A5D6 /* en */,\n\t\t\t\t52CD4C8E20A07D450061A5D6 /* zh-Hans */,\n\t\t\t\t52CD4C8F20A07D460061A5D6 /* zh-Hant */,\n\t\t\t);\n\t\t\tname = about.rtfd;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t528B4F981EA7383800BC6A89 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t528B4F991EA7383800BC6A89 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t528B4F9B1EA7383800BC6A89 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 888B2791FA0BBCC192BADA47 /* Pods-WeChatPlugin.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tGCC_INPUT_FILETYPE = automatic;\n\t\t\t\tGCC_PREFIX_HEADER = \"$(SRCROOT)/WeChatPlugin/Sources/Common/TKPrefixHeader.pch\";\n\t\t\t\tINFOPLIST_FILE = WeChatPlugin/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMARKETING_VERSION = 1.7.5;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = tk.WeChatPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t528B4F9C1EA7383800BC6A89 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 13B308B4A92CE38341762A48 /* Pods-WeChatPlugin.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tGCC_INPUT_FILETYPE = automatic;\n\t\t\t\tGCC_PREFIX_HEADER = \"$(SRCROOT)/WeChatPlugin/Sources/Common/TKPrefixHeader.pch\";\n\t\t\t\tINFOPLIST_FILE = WeChatPlugin/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMARKETING_VERSION = 1.7.5;\n\t\t\t\tONLY_ACTIVE_ARCH = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = tk.WeChatPlugin;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t528B4F8C1EA7383800BC6A89 /* Build configuration list for PBXProject \"WeChatPlugin\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t528B4F981EA7383800BC6A89 /* Debug */,\n\t\t\t\t528B4F991EA7383800BC6A89 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t528B4F9A1EA7383800BC6A89 /* Build configuration list for PBXNativeTarget \"WeChatPlugin\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t528B4F9B1EA7383800BC6A89 /* Debug */,\n\t\t\t\t528B4F9C1EA7383800BC6A89 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 528B4F891EA7383800BC6A89 /* Project object */;\n}\n"
  },
  {
    "path": "WeChatPlugin.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:WeChatPlugin.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "WeChatPlugin.xcodeproj/xcuserdata/TK.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Bucket\n   type = \"1\"\n   version = \"2.0\">\n</Bucket>\n"
  },
  {
    "path": "WeChatPlugin.xcodeproj/xcuserdata/TK.xcuserdatad/xcschemes/WeChatPlugin.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0930\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"528B4F911EA7383800BC6A89\"\n               BuildableName = \"WeChatPlugin.framework\"\n               BlueprintName = \"WeChatPlugin\"\n               ReferencedContainer = \"container:WeChatPlugin.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <PathRunnable\n         runnableDebuggingMode = \"0\"\n         BundleIdentifier = \"com.tencent.xinWeChat\"\n         FilePath = \"/Applications/WeChat.app\">\n      </PathRunnable>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"528B4F911EA7383800BC6A89\"\n            BuildableName = \"WeChatPlugin.framework\"\n            BlueprintName = \"WeChatPlugin\"\n            ReferencedContainer = \"container:WeChatPlugin.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"528B4F911EA7383800BC6A89\"\n            BuildableName = \"WeChatPlugin.framework\"\n            BlueprintName = \"WeChatPlugin\"\n            ReferencedContainer = \"container:WeChatPlugin.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "WeChatPlugin.xcodeproj/xcuserdata/TK.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>WeChatPlugin.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n\t<key>SuppressBuildableAutocreation</key>\n\t<dict>\n\t\t<key>528B4F911EA7383800BC6A89</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "WeChatPlugin.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:WeChatPlugin.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "WeChatPlugin.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "WeChatPlugin.xcworkspace/xcuserdata/TK.xcuserdatad/IDEFindNavigatorScopes.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<array/>\n</plist>\n"
  },
  {
    "path": "WeChatPlugin.xcworkspace/xcuserdata/TK.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Bucket\n   uuid = \"6CFB7591-92E2-4372-82DC-C754B29D6A07\"\n   type = \"0\"\n   version = \"2.0\">\n   <Breakpoints>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.ExceptionBreakpoint\">\n         <BreakpointContent\n            uuid = \"52973E54-9201-4438-8ACF-46EC78959C83\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            scope = \"1\"\n            stopOnStyle = \"0\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"7E5CF296-3A04-4D2B-A782-9F9A9E2F8ED6\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"WeChatPlugin/Sources/Hook/WeChat+hook.m\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"547\"\n            endingLineNumber = \"547\"\n            landmarkName = \"-replyWithMsg:model:\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"549C88F9-7D14-43B2-94E8-335E3FE0AF3B\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"WeChatPlugin/Sources/Hook/WeChat+hook.m\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"524\"\n            endingLineNumber = \"524\"\n            landmarkName = \"-replyWithMsg:model:\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.FileBreakpoint\">\n         <BreakpointContent\n            uuid = \"EBEE3FF7-5115-49F5-B1F3-212D2203ABBA\"\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            filePath = \"WeChatPlugin/Sources/Hook/WeChat+hook.m\"\n            startingColumnNumber = \"9223372036854775807\"\n            endingColumnNumber = \"9223372036854775807\"\n            startingLineNumber = \"209\"\n            endingLineNumber = \"209\"\n            landmarkName = \"-hook_OnSyncBatchAddMsgs:isFirstSync:\"\n            landmarkType = \"7\">\n         </BreakpointContent>\n      </BreakpointProxy>\n   </Breakpoints>\n</Bucket>\n"
  }
]