diff --git a/README.md b/README.md index 27b128f..3c1d328 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,10 @@ Xposed 微信辅助模块,实现消息防撤回、模拟位置、运动步数 ![01.png](https://raw.githubusercontent.com/wuxiaosu/XposedWechatHelper/master/screenshots/01.png) ![02.png](https://raw.githubusercontent.com/wuxiaosu/XposedWechatHelper/master/screenshots/02.png) ## 下载 -- release from [github](https://github.com/wuxiaosu/XposedWechatHelper/releases) -- release from [酷安](https://www.coolapk.com/apk/180057) +- release from [github](https://github.com/wuxiaosu/XposedWechatHelper/releases) +- ~~release from [酷安](https://www.coolapk.com/apk/180057)~~(被和谐了) +## v1.11 +更改了实现方式; ## v1.09 新增 微信登录自动确认; diff --git a/build.gradle b/build.gradle index ed7ef8e..a22026b 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:3.1.3' classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1' diff --git a/wechathelper/build.gradle b/wechathelper/build.gradle index 4649f50..2f7ba7f 100644 --- a/wechathelper/build.gradle +++ b/wechathelper/build.gradle @@ -6,8 +6,8 @@ android { applicationId "com.wuxiaosu.wechathelper" minSdkVersion 21 targetSdkVersion 23 - versionCode 10 - versionName "1.09" + versionCode 12 + versionName "1.11" } signingConfigs { @@ -22,6 +22,8 @@ android { buildTypes { release { minifyEnabled true + shrinkResources true + zipAlignEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release @@ -89,5 +91,5 @@ dependencies { } static def buildTime() { - return new Date().format("yyMMddHHss", TimeZone.getTimeZone("GMT+08")) + return new Date().format("yyMMddHHmm", TimeZone.getTimeZone("GMT+08")) } \ No newline at end of file diff --git a/wechathelper/dic.txt b/wechathelper/dic.txt new file mode 100755 index 0000000..7f3198a --- /dev/null +++ b/wechathelper/dic.txt @@ -0,0 +1,4586 @@ +0000O000000o +000O00000Oo +000O00000o0 +000O00000o +000O00000oO +000O00000oo +000O0000O0o +000O0000OOo +000O0000Oo0 +000O0000Oo +000O0000OoO +00O0000Ooo +00O0000o00 +00O0000o0 +00O0000o0O +00O0000o0o +00O0000o +00O0000oO0 +00O0000oO +00O0000oOO +000O0000oOo +00O0000oo0 +00O0000oo +00O0000ooO +00O0000ooo +00O00oOooO +00O00oOooo +00O000O00o +00O000O0OO +00O000O0Oo +000O00oOoOo +00O000O0o0 +00O000O0o +00O000O0oO +00O000O0oo +00O000OO00 +00O000OO0o +00O000OO +00O000OOOo +00O000OOo0 +000O000OOo +00O000OOoO +00O000OOoo +00O000Oo00 +00O000Oo0 +00O000Oo0O +00O000Oo0o +00O000OoO0 +00O00O0Oo +00O000OoO +000O000OoOO +00O000OoOo +00O000Ooo0 +00O000Ooo +00O000OooO +00O000Oooo +00O000o000 +00O000o00 +00O000o00O +00O000o00o +000O000o0 +00O000o0O0 +00O000o0O +00O000o0OO +00O000o0Oo +00O000o0o0 +00O000o0o +00O000o0oo +00O000o +00O000oO00 +000O000oO0 +00O000oO0O +00O000oO0o +00O000oO +00O000oOO0 +00O000oOO +00O000oOOO +00O000oOOo +00O000oOo0 +00O000oOo +000O000oOoO +00O000oOoo +00O000oo0 +00O000oo0O +00O000oo0o +00O000oo +00O000ooO0 +00O000ooO +00O000ooOO +00O000ooOo +000O000ooo0 +00O000ooo +00O000oooO +00O000oooo +00oooOoO +00O00oOOoo +00O00O000o +00O00O00Oo +00O00O00o0 +00O00O00o +000O00O00oO +00O00O00oo +00O00O0O0o +00O00O0OO +00O00O0OOo +00O00O0Oo0 +00O00O0OoO +00O00O0Ooo +00O00O0o00 +00O00O0o0 +00O00O0o0O +0O00O0o0o +0O00O0o +0O00O0oO0 +0O00O0oOO +0O00O0oOo +0O00O0oo0 +0O00O0oo +0O00O0ooO +0O00O0ooo +00O00OO0O +0O00OO0o +0O00OOOo +0O00OOo0 +0O00OOo +0O00OOoO +0O00OOoo +0O00Oo00 +0O00Oo00o +0O00Oo0 +00O00Oo0OO +0O00Oo0Oo +0O00Oo0o0 +0O00Oo0o +0O00Oo0oO +0O00OooOO +0O00Oo0oo +0O00Oo +0O00OoO0 +0O00OoO0o +00O00OoO0O +0O00Ooo +0O00OoO +0O00OoOO0 +0O00OoOO +0O00OoOo0 +0O00OoOo +0O00OoOoO +0O00OoOoo +0O00Ooo00 +00O00Ooo0 +0O00Ooo0O +0O00Ooo0o +0O00OooO0 +0O00OooO +0O00OooOo +0O00Oooo0 +0O00Oooo +0O00Ooooo +0O00OoooO +00O00o0000 +0O00o000 +0O00o000O +0O00o000o +0O00o00 +0O00o00O0 +0O00o00O +0O00o00OO +0O00o00Oo +0O00o00o0 +00O00o00o +0O00o00oO +0O00o00oo +0O00o0 +0O00o0O00 +0O00o0O0 +0O00oo000 +0O00o0O0O +0O00o0O0o +0O00o0O +00O00o0OO0 +0O00o0OO +0O00o0OOO +0O00o0OOo +0O00o0Oo0 +0O00o0Oo +0O00o0OoO +0O00o0Ooo +0O00o0o00 +0O00o0o0 +00O00o0o0O +0O00o0o0o +0O00o0o +0O00o0oO0 +0O00o0oO +0O00o0oOO +0O00o0oOo +0O00o0oo0 +0O00o0oo +0O00o0ooO +000O00o0ooo +00O00o +00O00oO0O0 +00O00oO000 +00O00oO00 +00O00oO00O +00O00oO0OO +00O00oO00o +00O00oO0 +00O00oO0O +00O00ooO00 +0O00oO0Oo +0O00oO0o0 +0O00oO0o +0O00oO0oO +0O00oO0oo +0O00oO +0O00oOO0o +0O00oOO00 +0O00oOO0 +00O00oOO0O +0O00oOo +0O00oOO +0O00oOOO0 +0O00oOOO +0O00oOOOO +0O00oOOOo +0O00oOOo0 +0O00oOOo +0O00oOOoO +00O00oOo00 +0O00oOo0 +0O00oOo0O +0O00oOo0o +0O00oOoO +0O00oOoOO +0O00oOoo0 +0O00oOoo +0O00oo00 +0O00oo00O +00O00oo00o +0O00oo0 +0O00oo0O0 +0O00oo0O +0O00oo0OO +0O00oo0Oo +0O00oo0o0 +0O00oo0o +0O00oo0oo +0O00oo +00O00ooO0 +0O00ooO0O +0O00ooO0o +0O00ooO +0O00ooOo0 +0O00ooOO0 +0O00ooOO +0O00ooOOO +0O00ooOOo +0O00ooOo +00O00ooOoO +0O00ooOoo +0O00ooo00 +0O00ooo0 +0O00ooo0o +0O00ooo +0O00oooO0 +0O00oooO +0O00oooOO +0O00oooOo +00O00oooo0 +0O00oooo +0O00ooooo +0ooooooo +0O0O00oO +0O0O000o +0O0O00OO +0O0O00Oo +0O0O00o0 +0O0O00o +00O0O0O0o +0O0O0O +0O0O0OO0 +0O0O0OO +0O0O0OOO +0O0O0OOo +0O0O0Oo0 +0O0O0OoO +0O0O0Ooo +0O0O0o00 +00O0O0o0 +0O0O0o0O +0O0O0o0o +0O0O0o +0O0O0oO0 +0O0O0oO +0O0O0oOO +0O0O0oOo +0O0O0oo0 +0O0O0oo +000O0O0ooO +00O0O0ooo +00O0OoOo +00O0OoOO +00O0OO00O +00O0OO00o +00O0OO0O +00O0Oo0o0 +00O0OO0Oo +00O0OO0o0 +00O0OO0oO +0O0OO0oo +0O0OOO00 +0O0OOoo +0O0OOoO +0O0OOO0 +0O0OOO0O +0O0OOO0o +0OO0oO +0O0OOOO +00O0OOOOO +0O0OOOOo +0O0OOOo0 +0O0OOOo +0O0OOOoO +0O0OOOoo +0O0OOo00 +0O0OOo0O +0O0OOo0o +0O0OOo +00O0OOoO0 +0O0OOoOO +0O0OOoOo +0O0OOoo0 +0O0OOooO +0O0OOooo +0O0Oo000 +0O0Oo00 +0O0Oo00O +0O0Oo00o +00O0Oo0 +0O0Oo0O0 +0O0Oooo +0O0Oo0O +0O0Oo0OO +0O0Oo0Oo +0O0Oo0o +0O0Oo0oO +0O0Oo0oo +0o00o00O +00O0Oo +0O0OoO00 +0O0OoO0 +0O0OoO0O +0OooOO +0OoO0o +0O0OoO +0O0OoOO0 +0O0OoOOO +0O0OoOOo +00O0OoOo0 +0O0OoOoO +0O0OoOoo +0O0Ooo00 +0O0Ooo0 +0O0Ooo0O +0O0Ooo0o +0O0Ooo +0O0OooO0 +0O0OooO +00O0OooOO +0O0OooOo +0O0Oooo0 +0O0OoooO +0O0Ooooo +0O0o0000 +0O0o000 +0O0o000O +0O0o000o +0O0o00 +00O0o00O0 +0O0o00O +0O0o00OO +0O0o00Oo +0O0o00o0 +0O0o00o +0O0o00oO +0O0o00oo +0O0o0 +0O0o0O00 +00O0o0O0 +0O0o0O0O +0O0o0O0o +0O0o0O +0O0o0OO0 +0O0oo0o +0O0o0OO +0O0o0OOO +0O0o0OOo +0O0o0Oo0 +000O0o0Oo +00O0o0OoO +00O0o0Ooo +00O0o0o00 +00O0o0o0 +00O0o0o0O +00O0o0o0o +00O0o0oO0 +00O0o0oO +00O0o0oOO +00O0o0oOo +0O0o0oo +0O0o0ooO +0oOOoOO +0O0o +0O0oO000 +0O0oO00 +0O0oO0oO +0O0oO00O +0O0oO00o +00O0oO0 +0O0oO0O0 +0O0oO0O +0O0oO0OO +0O0oO0Oo +0O0oO0o0 +0O0oO0o +0O0oO0oo +0o0Oo0o0 +0O0oO +00O0oOO00 +0O0oOO0 +0o00O00O0 +0O0oOO0O +0O0oOO0o +0O0oOO +0O0oOOO0 +0O0oOOOo +0O0oOOo0 +0Oo0OOo +00O0oOOo +0O0oOOoO +0O0oOOoo +0O0oOo00 +0O0oOo0 +0ooO0Ooo +0O0oOo0O +0O0oOo0o +0O0oOo +0O0oOoO0 +00O0oOoO +0O0oOoOO +0O0oOoOo +0OOoOoo +0O0oOoo0 +0O0oOoo +0O0oOooO +0O0oOooo +0O0oo000 +0O0oo00 +00O0oo00O +0O0oo00o +0O0oo0 +0O0oo0O0 +0O0oo0O +0O0oo0OO +0O0oo0Oo +0O0oo0o0 +0O0oo0oO +0O0oo0oo +00O0oo +0O0ooO00 +0O0ooOo +0O0oooo +0O0oooO +0O0ooO0 +0O0oooOo +0O0ooO0O +0O0ooO0o +0O0ooO +00O0ooOO0 +0O0ooOO +0O0ooOOO +0O0ooOOo +0O0ooOo0 +0O0ooOoO +0O0ooOoo +0O0ooo00 +0O0ooo0 +0O0ooo0O +00O0ooo0o +0O0ooo +0O0oooO0 +0O0oooOO +0O0oooo0 +0O0ooooO +0O0ooooo +0OO0000 +0OO0000o +0OoOOO +000OO000OO +00OO000Oo +00OO000o0 +00OO000o +00OO000oO +00OO000oo +00OO00OO +00OO00O0 +00OO00O0o +00OO00O +00OO00OOO +0OO00OOo +0OO00Oo0 +0OO0ooO +0OO00Oo +0OO00OoO +0OO00Ooo +0OO00o00 +0OO00o0O +0OO00o0o +00OO00oO0 +0OO00oO +0OO00oOO +0OO00oOo +0OO00oo0 +0OO00oo +0OO00ooO +0OO00ooo +0OO0O00o +0OO0O0O +00OO0O0OO +0OO0O0Oo +0OO0O0o0 +0OO0oOo +0OO0oOO +0OO0O0o +0OO0O0oO +0OO0O0oo +0oOo00 +0OO0OO0o +00OOo00 +0OO0OO +0OO0OOO +0OO0OOOO +0OO0OOOo +0OO0OOo0 +0OO0OOo +0OO0OOoO +0OO0OOoo +0OO0Oo00 +00OO0Oo0 +0OO0Oo0O +0OO0Oo0o +0Oo0Oo0O +0OO0OoO0 +0OO0OoO +0OO0OoOO +0Oo0Ooo0 +0OO0OoOo +0OO0Ooo0 +00OO0Ooo +0OO0OooO +0OO0Oooo +0OO0o000 +0OO0o00 +0OO0o00O +0OO0o00o +0OO0o0 +0OO0o0O0 +0OO0o0OO +00OO0o0Oo +0OO0o0o0 +0OO0o0o +0OO0o0oO +0OO0o0oo +0OO0o +0OO0oO00 +0OO0oO0 +0OO0oO0O +0OO0oO0o +00OO0oOO0 +0OoOOoOo +0OO0oOOO +0OO0oOOo +0OO0oOo0 +0OO0oOoO +0OO0oOoo +0OO0oo00 +0OO0oo0 +0OO0oo0O +00OO0oo0o +0OO0oo +0OO0ooO0 +0OO0ooOO +0OO0ooOo +0OO0ooo0 +0OO0ooo +0OO0oooO +0OO0oooo +0OOO000o +000OOO00 +00OOO00O0 +00OOO00Oo +00OOO00o0 +00OOO00o +00OOO00oO +00OOO00oo +00OOO0O0O +00OOO0O0o +00OOO0O +00o00OOOOO +0OOO0OO0 +0OOO0OOO +0OOO0OOo +0OOO0Oo0 +0OOO0oO +0OOO0Oo +0OOO0OoO +0OOO0Ooo +0OOO0o00 +00OOO0o0 +0OOO0o0O +0OOO0o0o +0OOO0o +0OOO0oO0 +0OOO0oOO +0OOO0oOo +0OOO0oo0 +0OOO0oo +0OOO0ooO +00OOO0ooo +0OOO +0OOOO00O +0OOOO00o +0OOOO0 +0OOOOoO +0OOOOo0 +0OOOOoo +0OOOO0O +0OOOO0OO +00OOOO0Oo +0OOOO0o0 +0OOOO0oO +0OOOO0oo +0OOOOO00 +0OOOOO0 +0OOOOO0o +0OOOOO +0OOOOOO +0OOOOOOO +00OOOOOOo +0OOOOOo0 +0OOooOo +0OOoooo +0OOOOOo +0OOOOOoO +0OOOOOoo +0OOOOo00 +0OOOOo0O +0OOOOo0o +00OOOOo +0OOOOoO0 +0OOOOoOO +0OOOOoOo +0OOOOoo0 +0OOOOooO +0OOOOooo +0OOOo000 +0OOo000 +0OOOo00 +00OOOo00O +0OOOo00o +0OOOo0 +0ooOOo00 +0OOOo0O0 +0OOOo0O +0OOOo0OO +0OOOo0Oo +0OOOo0o0 +0OOOo0o +00OOOo0oO +0OOOo0oo +0OOOo +0OOOoO00 +0OOOoO0 +0OOOoO0O +0o0ooo0OO +0OOOoO0o +0OOOoO +0OOOoOO0 +00OOOoOO +0OOOoOOO +0OOOoOOo +0OOOoOo0 +0OOOoOo +0OOOoOoO +0OOOoOoo +0ooO00O0 +0OOOoo00 +0OOOoo0 +000o00O0oO0 +00OOOoo0O +00OOOoo0o +00OOOoo +00OOOooO0 +00OOOooO +00o0OOoOoo +00OOOooOO +00OOOooOo +00OOOooo0 +00OOOooo +0OOOoooO +0OOOoooo +0OOo0000 +0OOo000O +0OOo000o +0OOo00O0 +0OOo00O +0OOo00OO +0OOo00Oo +00OOo00o0 +0OOo00o +0OOo00oO +0OOo00oo +0ooOo +0OOo0 +0OOo0O00 +0OOo0OO +0OOo0Oo +0OOoo00 +00OOo0O0 +0OOo0O0O +0OOo0O0o +0OOoOOoO +0OOo0OO0 +0OOo0OOO +0OOo0OOo +0OOo0Oo0 +0OOo0OoO +0OOo0Ooo +00OOo0o00 +0OOo0o0 +0OOo0o0O +0OOo0o0o +0OOo0o +0OOo0oO0 +0OOo0oO +0OOo0oOO +0OOo0oOo +0OOo0oo0 +00OOo0oo +0OOo0ooO +0OOo0ooo +0OOoO000 +0OOoO00 +0OOoO00O +0OOoO00o +0OOoO0 +0OOoO0O0 +0OOoO0o +00OOoO0O +0OOoO0OO +0OOoO0Oo +0OOoO0o0 +0OOoO0oO +0OOoO0oo +0OOoO +0OOoOO00 +0OOoOO0O +0OOoOO0o +00OOoOO +0OOoOOO0 +0OOoOOO +0OOoOOOO +0OOoOOOo +0OOoOOo0 +0OOoOOo +0OOoOOoo +0OOoOo00 +0OOoOo0 +00OOoOo0O +0OOoOo0o +0OOoOo +0OOoOoO0 +0oO0OO0 +0OOoOoO +0OOoOoOO +0OOoOoOo +0OOoOoo0 +0OOoOooO +00OOoOooo +0OOoo000 +0OOoo00O +0OOoo00o +0OOoo0 +0OOoo0O0 +0OOoo0O +0OOoo0OO +0OOoo0Oo +0OOoo0o0 +000OOoo0o +00OOoo0oO +00OOoo0oo +00OOoo +00OOooO00 +00OOooO0 +00OOooO0O +00OOooO0o +00OOooO +00OOooOO0 +00OOooOO +0OOooOOO +0OOooOOo +0OOooOo0 +0OOooOoO +0OOooOoo +0OOooo00 +0OOooo0 +0OOooo0O +0OOooo0o +00OOooo +0OOoooO0 +0OOoooO +0OOoooOO +0OOoooOo +0OOoooo0 +0OOooooO +0OOooooo +0Oo00000 +0Oo0000O +00Oo0000o +0Oo000 +0Oo000O0 +0Oo000O +0Oo000OO +0Oo000Oo +0Oo000o0 +0Oo000o +0Oo000oO +0Oo000oo +00Oo00 +0Oo00O00 +0Oo00O0 +0Oo0o0Oo +0Oo00O0O +0Oo00O0o +0Oo00O +0Oo00OO0 +0Oo0o0o +0Oo00Oo +00Oo00OO +0Oo00OOO +0Oo00OOo +0Oo00Oo0 +0Oo0o0O0 +0Oo00OoO +0Oo00Ooo +0Oo00o00 +0Oo00o0 +0Oo00o0O +00Oo00o0o +0Oo00o +0Oo00oO0 +0Oo00oOO +0Oo00oo0 +0Oo00oo +0Oo00ooO +0Oo00ooo +0Oo0 +0Oo0O000 +00Oo0O00 +0Oo0O00O +0Oo0O00o +0Oo0O0 +0Oo0O0O0 +0Oo0O0O +0Oo0O0OO +0Oo0O0Oo +0Oo0O0o0 +0Oo0O0o +00Oo0O0oO +0Oo0O0oo +0o00oO00 +0o00OO00 +0Oo0O +0Oo0OO00 +0Oo0OO0 +0Oo0OO0O +0Oo0OO0o +0Oo0OO +00Oo0OOO0 +0Oo0OOOO +0Oo0OOOo +0Oo0OOo0 +0Oo0OOoO +0Oo0OOoo +0Oo0Oo00 +0Oo0Oo0 +0Oo0Oo0o +0Oo0Oo +000Oo0OoO0 +00Oo0OoO +00Oo0OoOo +00Oo0Ooo +00Oo0OooO +00Oo0Oooo +00Oo0o000 +00Oo0o00 +00Oo0o00O +00Oo0o00o +00Oo0o0 +0Oo0o0O +0Oo0o0o0 +0Oo0o0oO +0Oo0o0oo +0Oo0o +0Oo0oO00 +0Oo0ooO +0Oo0oOO +0Oo0oo0 +00Oo0ooo +0Oo0oO0 +0Oo0oO0O +0Oo0oO0o +0Oo0oO +0Oo0oOO0 +0Oo0oOOO +0Oo0oOOo +0Oo0oOo0 +0Oo0oOo +00Oo0oOoO +0Oo0oOoo +0Oo0oo00 +0Oo0oo0O +0Oo0oo0o +0Oo0oo +0Oo0ooO0 +0Oo0ooOO +0Oo0ooOo +0Oo0ooo0 +00Oo0oooO +0Oo0oooo +0Oo +0OoO0000 +0OoO000 +0OoO000O +0OoO000o +0OoO00O0 +0OoO00O +0OoO00OO +00OoO00Oo +0OoO00o0 +0OoO00o +0OoO00oO +0OoO00oo +0OoO0 +0OoO0O00 +0OoO0Oo +0OoO0O0 +0OoO0O0O +00OoO0O0o +0OoO0O +0OoO0OO0 +0OoO0OO +0OoO0OOO +0OoOo00O +0OoO0OOo +0OoO0Oo0 +0OoO0OoO +0OoO0Ooo +00OoO0o00 +0OoO0o0 +0OoO0o0O +0OoO0o0o +0OoO0oO0 +0OoO0oo +0OoO0oO +0OoO0oOO +0OoO0oOo +0OoO0oo0 +00OoO0ooO +0OoO0ooo +0OoO +0OoOO000 +0OoOOo0 +0OoOOOO +0OoOO0O +0OoOOoo +0OoOOoO +0OoOOO0 +00OoOOOo +0OoOoOo +0OoOoOO +0OoOO00 +0OoOO00O +0OoOO00o +0OoOO0 +0OoOO0O0 +0OoOO0OO +0OoOO0Oo +000OoOO0o0 +00OoOO0o +00OoOO0oO +00OoOO0oo +00OoOo +00OoOO +00OoOOO0O +00OoOOO0o +00OoOOOO0 +00OoOOOOO +00OoOOOOo +0OoOOOo0 +0OoOOOoO +0OoOOOoo +0OoOOo00 +0OoOOo0O +0OoOOo0o +0OoOOo +0OoOOoO0 +0OoOOoOO +00OoOOoo0 +0OoOOooO +0OoOOooo +0OoOo000 +0OoOooo +0OoOoo0 +0OoOo00 +0OoOo00o +0OoOo0 +0OoOo0O0 +00OoOo0o +0OoOo0O +0OoOo0OO +0OoOo0Oo +0OoOo0o0 +0OoOo0oO +0OoOo0oo +0OoOoO00 +0OoOoO0 +0OoOoO0O +00OoOoO0o +0OoOoO +0OoOoOO0 +0OoOoOOO +0OoOoOOo +0OoOoOo0 +0OoOoOoO +0OoOoOoo +0OoOoo00 +0OoOoo0O +00OoOoo0o +0OoOoo +0OoOooO0 +0OoOooO +0OoOooOO +0OoOooOo +0OoOooo0 +0OoOoooO +0OoOoooo +0Ooo0000 +00Ooo000 +0Ooo000O +0Ooo000o +0Ooo00 +0Ooo00O0 +0Ooo00O +0Ooo00OO +0Ooo00Oo +0Ooo00o0 +0Ooo00o +00Ooo00oO +0o00oo00o +0Ooo00oo +0Ooo0 +0Ooo0O00 +0Ooo0O0 +0Ooo0O0O +0Ooo0O0o +0Ooo0O +0Ooo0OO0 +00Oooo00 +0Ooo0oO +0Ooo0Oo +0Ooo0OO +0o000O0OO +0o000oO0O +0Ooo0OOO +0Ooo0OOo +0Ooo0OoO +0Ooo0Ooo +00Ooo0o00 +0Ooo0o0 +0Ooo0o0o +0Ooo0o +0Ooo0oO0 +0Ooo0oOO +0Ooo0oOo +0Ooo0oo0 +0Ooo0oo +0Ooo0ooO +00Ooo0ooo +0o0oo +0Ooo +0OooO000 +0OooO0O +0Ooooo0 +0OooooO +0OoooOO +0OoooOo +0OooO00 +0OooO00O +OooO00o +OooO0O0 +OooO0OO +OooO0Oo +OooO0o0 +OooO0o +OooO0oO +OooO0oo +OooO +0OooOO00 +OooOO0 +OooOO0O +OooOO0o +OooOOO0 +OooOOO +OooOOOO +OooOOOo +OooOOo0 +OooOOo +0OooOOoO +OooOOoo +OooOo00 +OooOo0 +OooOo0O +OooOo0o +OooOo +OooOoO0 +OooOoO +OooOoOO +0OooOoOo +OooOoo0 +OooOoo +OooOooO +OooOooo +Oooo000 +Oooo00O +Oooo00o +Oooo0 +Oooo0O0 +0Oooo0O +Oooo0OO +Oooo0o0 +Oooo0o +Oooo0oO +Oooo0oo +Oooo +OoooO00 +OoooO0 +OoooO0O +0OoooO0o +OoooO +OoooOO0 +o000oOoO +OoooOOO +OoooOOo +OoooOo0 +OoooOoO +OoooOoo +Ooooo00 +0Ooooo0O +Ooooo0o +OooooO0 +OooooOO +OooooOo +Oooooo0 +Oooooo +OoooooO +Ooooooo +o0OoOo0 +0o0OoO0O +ooOO +o00O0O +o00Oo0 +o00Ooo +o00o0O +o00ooo +oo000o +o00oO0o +o00oO0O +0o0oo000 +o0ooOO0 +o0ooOOo +o0ooOoO +o0OOO0o +o0Oo0oo +o0OO00O +oo0o0Oo +o0O0O00 +o000OOo +00oo0oOoO +0ooo0Ooo +0ooOo00O +0o0OoOO0 +0o0O00oo +0o0ooo00 +0o000OOoo +0o000OOOo +0o000OOOO +0o000OOO0 +0o0000000 +o000000 +o000000O +o000000o +o00000 +o00000O0 +o00000O +o00000OO +o00000Oo +o00000o0 +0o00000o +o0000Ooo +o00000oO +o00000oo +o0000 +o0000O00 +o0000oo +o0000oO +o0000O0 +o0000O0O +0o0000O0o +o000OO +o0000O +o0000OO0 +o0000OO +o0000OOO +o0000OOo +o0000Oo0 +o0000Oo +o0000OoO +0o0000o00 +o0000o0 +o0000o0O +o0000o0o +o0000o +o0000oO0 +o0000oOO +o0000oOo +o0000oo0 +o0000ooO +0o0000ooo +o000 +o000O000 +o000OoO +o000O0o +o000Ooo +o000O0O +o000Oo0 +o000O00 +o000O00O +0o000O00o +o000O0 +o000O0Oo +o000OO0O +o000O0O0 +o000O0o0 +o000O0oO +o000O0oo +o000O +o000OO00 +0o000OO0 +o0OoO0o +o000OO0o +o000OOO +o000OOo0 +o000OOoO +o000Oo00 +o000Oo0O +o000Oo0o +o000Oo +0o000OoO0 +o000OoOO +o000OoOo +o000Ooo0 +o000OooO +o000Oooo +o000o000 +o000o00 +o000o00O +o000o00o +0o000o0 +oooo00o +o000o0O0 +o000o0O +o000o0OO +o000o0Oo +o000o0o0 +o000o0o +o000o0oO +o000o0oo +00o000o +0o000oO00 +0o000oO0 +0o000oO0o +0o000oO +0o000oOO0 +0o000oOO +0o000oOOO +0o000oOOo +0o000oOo0 +0o000oOo +o000oOoo +o000oo00 +o000oo0 +o000oo0O +o000oo0o +o000oo +o000ooO0 +o000ooO +o000ooOO +0o000ooOo +o000ooo0 +o000ooo +o000oooO +o000oooo +o00 +o00O0000 +o0O0ooO +o00oOoo +o00O000 +0o00O000O +o00O000o +o00O00 +o00O00O +oOO00O +o00O00OO +o00O00Oo +o00O00o0 +o00O00o +o00O00oO +0o00O00oo +oo00o +o00O0 +o00O0O00 +o00O0O0 +o00O0O0O +o00O0O0o +o00O0OO0 +oo0o0O0 +o00O0OO +0o00Oo00O +o00O0OOO +o00O0OOo +o00O0Oo0 +oo0oOO0 +o00O0Oo +o00O0OoO +o00O0Ooo +o00O0o00 +o00oOOo +0o00oOOO +o00O0o0 +o00O0o0O +o00O0o0o +o00O0o +o00O0oO +o00O0oOO +o00O0oOo +o00O0oo0 +o00O0oo +0o00O0ooO +o00O0ooo +o00O +o00OO000 +o00OO00O +o00OO00o +o00OO0 +o00OO0O0 +o00OO0O +o00OO0OO +0o00OO0Oo +o00OO0o0 +o00OO0o +o00OO0oO +o00OO0oo +oo0O +o00OO +o00OOO00 +o00OOO0 +o00OOO0O +0o00OOO0o +o0o0Oo +o00OOO +o00OOOO0 +o00OOOO +o00OOOOo +oOooo0o +o00OOOo0 +o00OOOo +o00OOOoO +00o00OOOoo +0o00OOo00 +0o00OOo0 +0o00OOo0O +0o00OOo0o +0o00OOo +0o00OOoO0 +0o00OOoO +0o00OOoOO +0o00OOoOo +0o00OOoo0 +o00OOoo +o00OOooO +o00OOooo +o00OoOoO +o00Oo000 +o00Oo00 +o00Oo00o +o00Oo0O0 +o00Oo0O +0o00Oo0OO +o00Oo0Oo +o00Oo0o0 +o00Oo0o +o00Oo0oO +o00Oo0oo +o0oOO +o00Oo +o00OoO00 +o00OoO0 +0o00OoO0O +o00OoO0o +o00OoO +o00OoOO0 +o00OoOO +o00OoOOO +o00OoOOo +o00OoOo0 +o00OoOo +o00OoOoo +0o00Oooo0 +o00Ooo00 +o00Ooo0 +o00Ooo0O +o00Ooo0o +o00OooO0 +o00OooO +o00OooOO +o00OooOo +o0O00o0 +0o00Oooo +o00OoooO +o00Ooooo +o00o0000 +o00o000 +o00o000O +o00o000o +oo00oO +o00o00 +o00o00O0 +0o00o00OO +o00o00Oo +o00o00o0 +o00o00o +o00o00oO +o00o00oo +o00o0 +o00o0O00 +o00o0O0 +o00o0O0O +0o00o0O0o +o00o0OO0 +o00o0OO +o00o0OOO +o00o0OOo +o00o0Oo0 +o00o0Oo +o00o0OoO +o00o0Ooo +o00o0o00 +0o00o0o0 +o00o0o0O +o00o0o0o +o00o0o +o00o0oO0 +o00o0oO +o00o0oOO +o00o0oOo +o00o0oo0 +o00o0oo +0o00o0ooO +o00o0ooo +o00o +o00oo000 +o00oO000 +o00oO00O +o00oO00o +o00oOo +o00oO0 +o00oO0O0 +00o00oO0OO +0o00oO0Oo +0o00oO0o0 +0o00oO0oO +0o00oO0oo +0o00oO +0o00oOOoo +0o00oOO00 +0o00oOO0 +0o00oOO0O +0o00oOO0o +o0oOOo +o0ooOO +o00oOO +o00oOOO0 +o00oOOOO +o00oOOOo +o00oOOo0 +o00oOOoO +o00oOo00 +0o00oOo0 +o00oOooO +o00oOo0O +o00oOo0o +o00oOoO0 +o00oOoO +o00oOoOO +o00oOoOo +o00oOoo0 +o00oOooo +0o00oo00 +o00oo00O +o00oo0 +o00oo0OO +o00oo0O0 +o00oo0O +o00oo0Oo +o00oo0o0 +o00oo0o +o00oo0oO +0o00oo0oo +o0O0o +o00oo +o00ooO00 +o00ooO0 +o00ooO0O +o00ooO0o +o00ooO +o00ooOO0 +o00ooOO +0o00ooOOO +o00ooOOo +o00ooOo0 +o00ooOo +o00ooOoO +o00ooOoo +o00ooo00 +o00ooo0 +o00ooo0O +o00ooo0o +0o00oooO0 +o00oooO +o00oooOO +o00oooOo +o00oooo0 +o00oooo +o00ooooO +o00ooooo +o0 +o0O00000 +0o0O0000 +o0O0000O +o0O0000o +o0O000 +o0O000O +o0OoOoOo +o0O000Oo +o0OoOoOO +o0O000o0 +o0O000o +0o0O000oO +o0ooOoOO +o0O000oo +o0O00 +o0O00O0 +o0OoO00O +o0O00O0o +o0O00O +o0O00OO +o0O00OOO +0o0O00Oo0 +o0O00Oo +o0oO0Ooo +o0O00OoO +o0O00Ooo +o0O00o00 +o0O00o0O +o0O00o0o +o0O00o +o0O00oO0 +00o0O00oO +0o0O00oOO +0o0O00oOo +0o0O00oo0 +0o0Oo0oOO +0o0O00ooO +0o0O00ooo +0o0O0 +0o0ooOOOo +0o0O0O00O +0o0O0O0 +o0O0O0O +o0oO0O0o +o0O0oo0o +o0O0O0Oo +o0O0O0o0 +o0O0O0o +o0O0O0oO +o0O0O0oo +o0ooO +0o0O0O +o0O0OO0 +o0O0OO0O +o0O0OO +o0O0OOO0 +o0O0OOO +o0O0OOOo +o0O0OOo +o0O0OOoO +o0O0OOoo +0o0O0Oo00 +o0OooO0 +o0O0Oo0 +o0O0Oo0O +o0O0Oo0o +o0O0Oo +o0O0Oooo +o0O0OoO0 +oo0OOoo +o0O0OoO +0o0O0OoOO +o0O0OoOo +o0O0Ooo0 +o0O0Ooo +o0O0OooO +o0O0o000 +o0O0o00 +o0O0o00O +o0O0o00o +o0O0o0 +0o0O0o0O0 +o0O0o0O +o0O0o0OO +o0O0o0Oo +o0O0o0o0 +o0O0o0o +o0oOo0O0 +o0O0o0oO +o0O0o0oo +o0O0oo0O +0o0O0oO00 +oooOO0 +o0O0oO0 +o0O0oO0O +o0O0oO0o +o0O0oO +o0O0oOO0 +o0O0oOO +o0O0oo00 +o0O0oOOO +0o0O0oOOo +o0O0oOo0 +oo0oOOo +o0O0oOo +o0O0oOoO +o0O0oOoo +o0O0oo0 +o0O0oo +o0O0ooO0 +o0O0ooOO +0o0O0ooOo +o0O0ooo0 +o0O0ooo +o0O0oooO +o0O0oooo +o0O +o0OO000 +o0OO000o +oo0oO0 +oo0ooO +0o0OO00 +o0OO00OO +o0OO00oo +o0OO00Oo +o0OO00o0 +o0OoOoO +o0OO00o +o0OO0 +o0OO0O0 +o0OO0O0O +00o0OO0O0o +0o0OO0O +0o0OOoOOo +0o0OOoOoO +0o0OO0OO0 +0o0OO0OO +0o0OOoOO0 +0o0OO0OOO +0o0OO0OOo +0o0OO0Oo0 +0o0OO0Oo +o0OO0OoO +o0OOooO0 +o0OO0Ooo +o0OO0o00 +o0OO0o0 +o0OO0o0O +o0OO0o0o +o0OO0o +o0OO0oO0 +0o0OO0oo +o0OO0oO +o0OO0oOO +o0OOoooO +o0OO0oOo +o0OO0oo0 +o0OO0ooO +o0OO0ooo +o0OO +o0OOO00 +0o0OOO00O +o0OOO00o +o0OOO0 +o0OOO0O0 +o0OOO0O +o0OOO0OO +o0OOO0Oo +o0OOO0o0 +o0OOO0oO +o0OOO0oo +0o0OOO +o0OOOOoO +o0OOOO00 +o0OOOO0 +o0OOOO0o +o0OOOO +o0OOOOO0 +o0OOOOO +o0OOOOOO +o0OOOOOo +0o0OOOOo0 +o0OOOOo +o0OOOOoo +o0OOOo00 +o0OOOo0 +o0OOOo0O +o0OOOo0o +o0OOOo +o0OOOoO0 +o0OOOoO +0o0OOOoOO +o0OOOoOo +o0OOOoo0 +o0OOOoo +o0OOOooO +o0OOOooo +o0OOo000 +o0OOo00 +o0OOo00O +o0OOo00o +0o0OOo0 +o0OOo0O0 +o0OooOo +o0OOo0O +o0OOo0OO +o0OOo0Oo +o0OOo0o0 +o0OOo0o +o0OOo0oO +o0OOo0oo +0o0OOo +o0OOoO00 +o0OOoO0 +o0OOoO0O +o0OOoO0o +o0OOoO +o0OOoOO +o0OOoOOO +o0OOoOo0 +o0OOoOo +0o0OOoo00 +o0OOoo0 +o0OOoo0O +o0OOoo0o +o0OOoo +o0OOooO +o0OOooOO +o0OOooOo +o0OOooo0 +o0OOooo +00o0OOoooo +0o0Oo0000 +0o0Oo000 +0o0Oooo0O +0o0Oo00O0 +0o0Oo000O +0o0Oo000o +0o0Oo00 +0o0Oo00OO +0o0Oo00Oo +0o0oooOoo +o0Oo00o0 +o0Oo00o +o0Oo00oO +o0Oo00oo +o0Oo0 +o0ooO0O0 +o0Oo0O00 +o0Oo0O0 +o0Oo0O0O +0o0Oo0O0o +o0Oo0O +o0Oo0OO0 +o0Oo0OO +o0oOooO0 +o0ooOOOO +o0oOo000 +o0Oo0OOO +o0oOo0o0 +o0oOoo00 +0o0oO0OOo +o0Oo0OOo +o0Oo0Oo0 +o0Oo0Oo +o0Oo0OoO +o0Oo0oOo +o0Oo0Ooo +o0Oo0o00 +o0Oo0o0O +o0Oo0o0o +0o0Oo0o +o0Oo0oO0 +o0Oo0oO +o0Oo0oo0 +o0Oo0ooO +o0Oo0ooo +o0Oo +o0OooOoo +o0OoO000 +o0OoO0 +0o0OoO0O0 +o0oO0O00 +o0OoO0OO +o0ooOOO0 +o0OoO0Oo +o0OoO0o0 +o0OoO0oO +o0OoO0oo +o0OoO +o0OoOO00 +0o0OoOO0O +o0OoOO0o +o0OoOO +o0OoOOoO +o0OoOOO0 +o0OoOOO +o0OoOOOO +o0OoOOOo +o0OoOOo0 +o0OoOOo +0o0OoOOoo +o0OoOo00 +o0OoOo0O +o0ooOOoo +o0OoOo0o +o0OoOo +o0OoOoO0 +o0OoOoo0 +o0OoOoo +o0OoOooO +0o0OoOooo +o0Ooo000 +o0Ooo00 +o0Ooo00O +o0oOO0Oo +o0oOoOoo +o0Ooo00o +o0Ooo0 +o0Ooo0O0 +o0Ooo0O +0o0Ooo0OO +o0oOOOoo +o0OoooO0 +o0oOOO0o +o0Ooo0Oo +o0Ooo0o0 +o0Ooo0o +o0Ooo0oO +o0Ooo0oo +o0Ooo +00o0OooO00 +0o0OooO0O +0o0OooO0o +0o0OooO +0o0OooOO0 +0o0OooOO +0o0OooOOO +0o0OooOOo +0o0OooOo0 +0o0OooOoO +0o0Oooo00 +o0Oooo0 +o0Oooo0o +o0Oooo +o0OoooO +o0OoooOO +o0OoooOo +o0Ooooo0 +o0Ooooo +o0OooooO +0o0Oooooo +o0o0000 +o0o0o00O +o0o0000o +o0o000 +o0o000O0 +o0o000O +o0o000OO +o0o000Oo +o0o000o0 +0o0o000o +o0o000oO +o0o000oo +o0o00 +o0o00O00 +o0o00O0 +o0o00O0O +o0o00O0o +o0o00O +o0o00OO0 +0o0o00OO +o0o00OOO +o0o00OOo +o0o00Oo0 +o0o00Oo +o0o00OoO +o0o00Ooo +o0o00o00 +o0o00o0 +o0o00o0O +0o0o00o0o +o0o00o +o0o00oO0 +o0o00oO +o0o00oOO +o0o00oOo +o0o00oo0 +o0o00oo +o0o00ooO +o0o00ooo +0o0o0 +o0o0O000 +o0o0O00 +o0o0O00O +o0o0O00o +o0o0O0 +o0o0O0O0 +o0o0O0O +o0o0Oo00 +o0o0O0OO +0o0o0O0Oo +o0o0O0o0 +o0o0O0o +o0o0O0oO +o0o0O0oo +oO0Oo +oO0OO +o0ooo +o0o0O +o0o0OoO0 +0o0o0OO00 +o0o0OO0 +o0o0OO0O +o0o0OO0o +o0o0OO +o0o0OOO0 +o0o0OOO +o0o0OOOO +o0o0OOOo +o0o0OOo0 +0o0o0OOo +o0o0OOoO +o0o0OOoo +o0o0Oo0 +o0o0Oo0O +o0o0Oo0o +o0o0OoO +o0o0OoOO +o0o0OoOo +o0o0Ooo0 +000o0o0Ooo +00o0o0OooO +00o0o0Oooo +00o0o0o000 +00o0o0o00 +00o0o0o00o +00o0o0o0 +00o0o0o0O0 +00o0o0o0O +00o0o0o0OO +00o0o0o0Oo +0o0o0o0o0 +0o0o0o0o +0o0o0o0oO +0o0o0o0oo +0o0o0o +0o0o0oO00 +0o0o0oO0 +0o0o0oO0O +0o0o0oO0o +00o0oo00 +0o0o0oO +0o0o0oOO0 +0o0o0oOO +0o0o0oOOO +0o0o0oOOo +0o0o0oOo0 +0o0o0oOo +0o0o0oOoO +0o0o0oOoo +00o0o0oo00 +0o0o0oo0 +0o0o0oo0O +0o0o0oo0o +0o0o0oo +0o0o0ooO0 +0o0o0ooO +0o0o0ooOO +0o0o0ooOo +0o0o0ooo0 +00o0o0ooo +0o0o0oooO +0o0o0oooo +0o0o +0o0oO0000 +0ooooooO +0o0oO000 +0o0oO000O +0o0oO000o +0o0oO00 +00o0oO00O0 +0o0oO00O +0o0oO00Oo +0o0oO00OO +0o0oO00o0 +0o0oO00o +0o0oO00oO +0o0oO00oo +0o0oO0 +0o0oO0O0 +00o0oO0O +0o0oO0OO0 +0o0oO0OO +0o0oO0OOO +0o0oO0Oo +0o0oO0OoO +0o0oO0o00 +0o0oO0o0 +0o0oO0o0o +0o0oO0o0O +00o0oO0o +0o0oO0oO0 +0o0oO0oO +0o0oO0oOO +0o0oO0oo0 +0o0oO0oo +0o0oO0ooO +0o0oO0ooo +0o0oO +0o0oOO000 +00o0oOO00 +0o0oOO00O +0o0oOO00o +0o0oOO0 +0o0oOO0O0 +0o0oOO0O +0o0oOo0oO +0o0oOo0oo +0o0oOO0OO +0o0oOO0o0 +00o0oOO0o +0o0oOO0oO +0o0oOO0oo +0o0oOOO00 +0o0oOOO0 +0o0oOOO0O +0o0oOOO +0o0oOOOO0 +0o0oOOOO +0o0oOOOOO +00o0oOOOOo +0o0oOOOo0 +0o0oOOOo +0o0oOOOoO +0o0oOOo00 +0o0oOOo0 +0o0oOOo0O +0o0oOOo0o +0o0oOOoO0 +0o0oOOoO +0o0oOoO00 +o0oOOoOO +o0oOooOO +o0oOOoOo +o0oOOoo0 +o0oOOoo +o0oOOooO +o0oOOooo +o0oOo00 +o0oOo00O +0o0oOo00o +o0oOo0 +o0oOo0O +o0oOo0OO +o0oOo0Oo +o0oOo0o +o0oOo +o0oOoO0 +o0oOoO0o +o0oOoOo0 +0o0oOoO0O +o0oOoO +o0oOoOO0 +o0oOoOO +o0oOoOOO +o0oOoOOo +o0oOoOo +o0oOoOoO +o0oOoo0 +o0oOoo0O +0o0oOoo0o +o0oOoo +o0oOooO +o0oOooOo +o0oOooo0 +o0oOooo +o0oOoooO +o0oOoooo +o0oo0000 +o0oo000O +0o0oo000o +o0oo00O0 +o0oo00O +o0oo00OO +o0oo00Oo +o0oo00o0 +o0oo00o +o0oo00oO +o0oo00oo +o0oo0 +0o0oo0O00 +o0oo0O0 +o0oo0O0O +o0oo0O0o +o0oo0o +o0oo0O +o0oo0OO0 +o0oo0OO +o0oo0OOO +o0oo0OOo +0o0oo0Oo0 +o0oo0Oo +o0oo0OoO +o0oo0Ooo +o0oo0o00 +o0oo0o0 +o0oo0o0O +o0oo0o0o +o0oo0oO0 +o0oo0oO +0o0oo0oOO +o0oo0oOo +o0oo0oo0 +o0oo0oo +o0oo0ooO +o0oo0ooo +o0ooO000 +o0ooO00 +o0ooO00O +o0ooO00o +0o0ooO0 +o0ooO0O +o0ooO0OO +o0ooO0Oo +o0ooO0o0 +o0ooO0o +o0ooO0oO +o0ooO0oo +o0ooOO0O +o0ooOO0o +00o0ooOOO +0o0ooOOoO +0o0ooOo00 +0o0ooOo0 +0o0ooOo0o +0o0ooOo0O +0o0ooOo +0o0ooOooO +0o0ooOoO0 +0o0ooOoOo +0o0ooOoo0 +o0ooOoo +o0ooOooo +o0ooo000 +o0ooo00O +o0ooo00o +o0ooo0 +o0ooo0O +o0ooo0o0 +o0ooo0o +0o0ooo0oO +o0ooo0oo +o0oooO00 +o0oooO0 +o0oooO0o +o0oooO0O +o0oooO +o0oooOO0 +o0oooOO +o0oooOOo +0o0oooOOO +o0oooOo0 +o0oooOo +o0oooOoO +o0oooo00 +o0oooo0 +o0oooo0O +o0oooo0o +o0oooo +o0ooooO0 +0o0ooooO +o0ooooOo +o0ooooo0 +ooo0Oo0 +o0ooooo +o0oooooO +o0oooooo +o +oO00000 +oO00000o +0oO0000 +oO0000O +oO0000Oo +oO0000o0 +oO0000o +oO0000oO +oO0000oo +oO000 +oO000O0 +oO000O0O +0oO0Ooo00 +oO0Ooooo +oO000O0o +oO0o0o +oO000O +oO0OoOO0 +oO0OOooo +oO0OoOOO +oO0OOoO0 +oO0Oo0oo +0oO000OOO +oO0OO0oo +oO0OOooO +oO000OOo +oO0OoOoO +ooOOOOoo +oO0OOo0o +oO000Oo0 +oO000Oo +oO0OO0OO +0oO0OoOoo +oO0OOoo0 +oO000OoO +oO0OOo0O +oO000Ooo +oO000o00 +oO000o0 +ooOOOOOo +oO000o0o +oO000o +0oO0Oo0OO +oO000oO0 +oO000oO +oO0Ooo0O +oO000oOO +oO0Ooo0o +oO000oOo +oO000oo0 +oO000oo +oO0Oo0Oo +00oO000ooO +0oO0Oo0O0 +0oO000ooo +0oO00 +0oO00O00 +0oO0O0o0o +0ooOOoooO +0oO00O00o +0oO00O0 +0oO00O0O +0oO00O0Oo +oO0O0OoO +ooOOooOo +oO00O0o0 +oO00O0o +oOo00OO0 +oO00O0oO +oO0O0OOo +oO00O0oo +oO00O +0oO00OO0 +ooOOoOoO +oO0O0OOO +oO00OO0O +oO00OO +oO00OOO +oO00OOOo +oOo00Oo0 +ooOOoOOo +oO00OOo0 +0oO00OOo +oO0oOOO0 +oO00OOoO +oOOoOoOO +oO00OOoo +oO00Oo00 +oO00Oo0 +oO00Oo0O +oO00Oo0o +oO00Oo +0oO00oOOO +oO00OoO0 +oO00OoO +oOOoOOO0 +oO00OoOO +oO0oOOOo +oO00OoOo +oO00Ooo0 +oO00Ooo +oO00OooO +0oO00Oooo +oO0OOoOo +oO00o000 +oO00o00 +oO0OooOO +oO0OoOo0 +oO0OOO00 +oO00o00O +oO0OOoOO +oO00o00o +0ooOO0O +ooOOo0 +oO00o0 +oO0OOOoo +oO00o0O0 +oO00o0O +oO0OOOOo +oO00o0OO +oO0OOOoO +oO00o0Oo +0oO0OoO0O +oO0OOO0o +oO00o0o0 +oO00o0o +oO0OOOo0 +oO00o0oO +oO0OOO0O +oO00o0oo +oO00o +oO0OO0oO +0oO0OO000 +oOo00o0o +oO00oO00 +oO00oO0 +oO0OoooO +oOo00ooO +oO00oO0O +oO0OooOo +oOo00ooo +oO00oO0o +0oO00oO +oO00oOO0 +oO00oOO +oO0OO00o +oO00oOOo +oOo00oO0 +oO00oOo0 +oO00oOo +oO0OO00O +ooOOOOoO +00oOo00oOO +0oO00oOoO +0oOo00oOo +0oO00oOoo +0oO0OOOOO +0oO00oo00 +0oO00oo0 +0oO0OO0o0 +0oO00oo0O +0oO00oo0o +0oO00oo +oO00ooO0 +oO00ooO +oOo000Oo +oO00ooOO +oO00ooOo +oOo0000O +oO00ooo0 +oO00ooo +oOo000oo +0oO00oooO +oOo000o0 +oO00oooo +oO0 +oO0O000 +oO0Oo00O +ooOOoOo0 +oO0O000o +oO0O00 +oO0O00O +0oO0O00Oo +oO0O00o0 +oO0O00o +oO0O00oO +oO0O00oo +oOoo0 +oO0O0 +oO0O0O00 +oO0O0O0 +ooOOOoO0 +0oO0O0O0O +ooOOOoo0 +oO0O0O0o +oO0O0o +oO0O0O +oO0O0OO +oOo0oooO +ooOOOoOo +oO0O0Oo0 +oO0O0Oo +0oO0O0o0 +oO0O0o0O +oO0O0oO0 +oO0O0oO +oOo0o0oO +ooOOO0Oo +oO0O0oOO +oO0O0oOo +oOo00OOo +oO0O0oo0 +0oO0O0oo +oOo00OOO +ooOOO00O +oO0O0ooO +oO0O0ooo +ooo0o +oO0O +oO0OO00 +oO0OO0O +oO0OO0Oo +0oO0OO0o +oO0OOO0 +oO0OOO +oO0OooO0 +oO0OOOO0 +oO0OOOO +oO0OOOo +oO0OOo0 +oO0OOo +oO0OOoO +0oO0OOoo +oO0Oo00 +oO0Oo0 +oO0Oo0O +oO0Oo0o0 +oO0Oo0o +oO0OoO00 +oO0OoO0 +oO0OoO +oO0OoOO +0oO0OoOo +oO0Ooo0 +oO0Ooo +oO0OooO +oO0Oooo +oO0o0000 +oO0o000 +oO0o000O +ooOOoOoo +oO0o000o +00oO0o00 +0oO0o0oo0 +0oO0o00O0 +0oO0o00O +0oO0o00OO +0oO0o00Oo +0oO0o00o0 +0oO0o00o +0oO0o00oO +0oO0o00oo +0oO0o0 +oO0o0O00 +oO0o0O0 +oO0o0O0O +oO0o0O0o +oO0o0O +oO0o0OO0 +oO0o0OO +oO0o0OOO +oO0o0OOo +0oO0o0Oo0 +oO0o0Oo +oO0o0OoO +oO0o0Ooo +oO0o0o00 +oO0o0o0 +oO0o0o0O +oO0o0o0o +oO0o0oO0 +oO0o0oO +0oO0o0oOO +oO0o0oOo +oO0o0oo +oO0o0ooO +oO0o0ooo +oO0o +oO0oO000 +oO0oO00 +oOo00O0O +ooOOoOO0 +0oO0oO00O +oO0oO00o +oO0oO0 +oO0oO0O0 +oO0oO0O +oO0oO0OO +oOo00OoO +ooOOoOOO +oO0oO0Oo +oO0oO0o0 +0oO0oO0o +oO0oO0oO +oO0oO0oo +oOooo +oO0oO +oO0oOoOO +oO0oOO00 +oO0oOO0 +oO0oOO0O +oO0oOO0o +0oO0oOO +oO0oOOO +oO0oOOOO +oO0oOOo0 +oO0oOOo +oO0oOOoO +oO0oOOoo +oO0oOo00 +oO0oOo0 +oO0oOo0O +0oO0oOo0o +oO0oOo +oO0oOoO0 +oO0oOoO +oO0oOooo +oO0oOoOo +oO0oOoo0 +oO0oOoo +oO0oOooO +oO0oo000 +0oO0oo00 +oO0oo00O +oO0oo00o +oO0oo0 +oO0oo0O0 +oO0oo0O +oO0oo0OO +oO0oo0Oo +oO0oo0o0 +oO0oo0o +0oO0oo0oO +oO0oo0oo +oO0oo +oO0ooO00 +oO0ooO0 +oO0ooO0O +oO0ooO0o +oO0ooO +oO0ooOO0 +oO0ooOO +00oO0ooOOO +0oO0ooOOo +0oO0ooOo0 +0oO0ooOo +0oO0ooOoO +0oO0ooOoo +0oO0ooo00 +0oO0ooo0 +0oO0ooo0O +0oO0ooo0o +0oO0ooo +oOo00o0O +oO0oooO0 +oO0oooO +oO0oooOO +oOo00oo0 +oO0oooOo +oOo000OO +oO0oooo0 +oO0oooo +0oO0ooooO +oOo00o00 +oO0ooooo +oO +oOO00000 +oOO0000 +oOO0000O +oOO0000o +oOO000 +oOO000O0 +0oOO000O +oOO000OO +oOO000Oo +oOO000o0 +oOO000o +oOO000oO +oOO000oo +oOO00 +oOO00O00 +oOO00O0 +0ooooOO00 +oOO00O0O +oOO00O0o +oOO00OO0 +oOO00OO +oOO00OOO +oOO00OOo +oOO00Oo0 +oOO00Oo +ooooO000 +0oOO00OoO +ooooOoOo +oOO00Ooo +oOO00o00 +oOO00o0 +oOO00ooo +oOO00o0O +oOO00o0o +oOO00o +oOO00oO0 +0oOO00oO +ooooOOo0 +ooooO0oo +oOO00oOO +oOO00oOo +oOO00oo +oOO00ooO +oOO0 +ooooOoOO +oOO0O000 +0oOO0O00 +oOO0O00O +oOO0O00o +oOO0O0 +oOO0O0O0 +oOO0O0O +oOO0O0OO +oOO0O0Oo +oOO0O0o0 +oOO0O0o +0oOO0O0oO +oOO0O0oo +oOO0O +oOO0OO0 +oOO0OO0O +oOO0OO0o +oOO0OO +oOO0OOO +oOO0OOOO +oOO0OOOo +0oOO0OOo0 +oOO0OOo +oOO0OOoO +oOO0OOoo +oOO0Oo00 +oOO0Oo0 +oOO0Oo0O +oOO0Oo0o +oOO0Oo +oOO0OoO0 +00oOO0OoO +0oOO0OoOO +0oOO0OoOo +0oOO0Ooo0 +0oOO0Ooo +0oOO0OooO +0oOO0Oooo +0oOO0o00 +0ooooOOoo +0oOO0o00o +0oOO0o0 +oOO0o0O0 +oOO0o0O +oOO0o0OO +oOO0o0Oo +ooooO0O0 +oOO0o0o0 +oOO0o0o +oOO0o0oO +oOO0o0oo +0oOO0o +oOO0oO00 +oOO0oO0 +oOO0oO0O +oOO0oO0o +oOO0oO +oOO0oOO0 +oOO0oOO +oOO0oOOO +oOO0oOOo +0oOO0oOo0 +oOO0oOo +oOO0oOoO +oOO0oOoo +oOO0oo00 +oOO0oo0 +oOO0oo0O +oOO0oo0o +oOO0oo +oOO0ooO0 +0oOO0ooO +oOO0ooOO +oOO0ooOo +oOO0ooo0 +oOO0ooo +oOO0oooO +oOO0oooo +oOO +oOOO000 +oOOO000o +0oOOO0O +oOOOoO +oOOO00 +oOOO00O +oOOO00Oo +oOOO00o0 +oOOO00o +oOOO00oO +oOOO00oo +oOOO0 +0oOOO0oOO +oOOO0O0 +oOOO0O0o +oOOO0OO0 +oOOO0OO +oOOO0OOO +oOOO0OOo +oOOO0Oo +oOOO0OoO +oOOO0Ooo +0oOOO0o00 +oOOO0o0 +oOOO0o0O +oOOO0o0o +oOOOOO +oOOO0o +oOOO0oO0 +oOOO0oO +oOOO0ooo +oOOO0ooO +0oOOO0oOo +oOOO0oo0 +oOOO0oo +oOOO +oOOOO0OO +oOOOO000 +oOOOO00 +oOOOoo00 +oOOOO00O +oOOOO00o +0oOOOO0 +oOOOO0O0 +oOOOO0O +oOOOO0Oo +oOOOO0o0 +oOOOO0o +oOOOO0oO +oOOOO0oo +oOo0o +oOOOO +00oOOOOO00 +0oOOOOO0 +0oOOOOO0O +0oOOOOO0o +0oOOOOOO0 +0oOOOOOO +0oOOOOOOO +0oOOOOOOo +0oOOOOOo0 +0oOOOOOo +0oOOOOOoO +oOOOOOoo +oOOOOo00 +oOOOOo0 +oOOOOo0O +oOOOOo0o +oOOOOo +oOOOOoO0 +oOOOOoO +oOOOOoOO +0oOOOOoOo +oOOOOoo0 +oOOOOoo +oOOOOooO +oOOOOooo +oOOOo000 +oOOOo00 +oOOOo00O +oOOOo00o +oOOOo0 +0oOOOo0O0 +oOOOo0O +oOOOo0OO +oOOOo0Oo +oOOOo0o0 +oOOOo0o +oOOOo0oO +oOOOo0oo +oOOOo +oOOOoO00 +0oOOOoO0 +oOOOoO0O +oOOOoO0o +oOOOoOO0 +oOOOoOO +oOOOoOOO +oOOOoOOo +oOOOoOo0 +oOOOoOo +oOOOoOoO +0oOOOoOoo +oOOOoo0 +oOOOoo0O +oOOOoo0o +oOOOoo +oOOOooO0 +oOOOooO +oOOOooOO +oOOOooOo +oOOOooo0 +0oOOOooo +oOOOoooO +oOOOoooo +oOOo0000 +oOOo000 +oOOo000O +oOOo000o +oOOo00 +oOOo00O0 +oOOo00O +0oOOo00OO +oOOo00Oo +oOOo00o0 +oOOo00o +oOOo00oO +oOOo00oo +oOOo0 +oOOo0O00 +oOOo0O0 +oOOo0O0O +0oOOo0O0o +oOOo0O +oOOo0OO0 +oOOo0OO +oOOo0OOO +oOOo0OOo +oOOo0Oo0 +oOOo0Oo +oOOo0OoO +oOOo0Ooo +0oOOo0o00 +oOOo0o0 +oOOo0o0O +oOOo0o0o +oOOo0o +oOOo0oO0 +oOOo0oO +oOOo0oOO +oOOo0oOo +oOOo0oo0 +00oOOo0oo +0oOOo0ooO +0oOOo0ooo +0oOOo +0oOOoO000 +0oOOoO00 +0oOOoO00O +0oOOoO00o +0oOOoO0 +0oooO0oOO +0oOOoO0O0 +oOOoO0O +oOOoO0OO +oOOoO0Oo +oOOoO0o +oOOoO0oO +oOOoO0oo +oOOoO +oOOoOO0o +oOOoOO00 +0oOOoOO0 +oOOoOO0O +oOOoOOO +oOOoOOOO +oOOoOOOo +oOOoOOo0 +oOOoOOo +oOOoOOoO +oOOoOOoo +oOOoOo00 +0oOOoOo0 +oOOoOo0O +oOOoOo0o +oOOoOo +oOOoOoO0 +oOOoOoO +oOOoOoOo +oOOoOoo0 +oOOoOoo +oOOoOooO +0oOOoOooo +oOOoo000 +oOOoo00 +oOOoo00O +oOOoo00o +oOOoo0 +oOOoo0O0 +oOOoo0O +oOOoo0OO +oOOoo0Oo +0oOOoo0o0 +oOOoo0o +oOOoo0oO +oOOoo0oo +oOOoo +oOOooO00 +oOOooO0 +oOOooO0O +oOOooO0o +oOOooO +0oOOooOO0 +oOOooOO +oOOooOOO +oOOooOOo +oOOooOo0 +oOOooOo +oOOooOoO +oOOooOoo +oOOooo00 +oOOooo0 +0oOOooo0O +oOOooo0o +oOOooo +oOOoooO0 +oOOoooO +oOOoooOO +oOOoooOo +oOOoooo0 +oOOoooo +oOOooooO +0oOOooooo +oOo0000 +oOo000 +oOo000O +oOo000o +oOo00O0 +oOo00O +oOo00OO +oOo0o00 +oOo00Oo +0oOo00o0 +oOo00o +oOo00oO +oOo00oo +oOo0 +oOo0O000 +oOo0O00 +oOo0O00O +oOo0oO0o +oOo0O00o +000oOo0oo +00oOo0O0 +00oOo0O0O0 +00oOo0O0O +00oOo0O0OO +00oOo0O0Oo +00oOo0O0o0 +00oOo0O0o +00oOo0O0oO +00oOo0O0oo +00oOo0O +0oOo0OO00 +0oOoo00o +0oOo0OO0 +0oOo0OO0O +0oOo0OO0o +0oOo0OO +0oOo0OOO0 +0oOo0OOO +0oOo0OOOO +00oOo0OOOo +0oOo0OOo0 +0oOo0OOo +0oOo0OOoO +0oOo0OOoo +0oOo0Oo00 +0oOo0Oo0 +0oOo0Oo0O +0oOo0Oo0o +0oOo0Oo +00oOo0OoO0 +0oOo0OoO +0oOo0OoOO +0oOo0OoOo +0oOo0Ooo0 +0oOo0Ooo +0oOo0OooO +0oOo0Oooo +0oOo0o000 +0oOo0o00O +00oOo0o00o +0oOo0o0 +0oOo0o0O +0oOo0o0OO +0oOo0o0Oo +0oOo0o0o0 +0oOo0o0o +0oOo0oO00 +0oOo0oO0 +0oOo0oO0O +00oOo0oO +0oOo0oOO0 +0oOo0oOO +0oOo0oOOO +0oOo0oOOo +0oOo0oOo0 +0oOo0oOo +0oOo0oOoO +0oOo0oOoo +0oOo0oo00 +00oOo0oo0 +0oOo0oo0O +0oOo0ooO0 +0oOo0ooO +0oOo0ooOO +0oOo0ooOo +0oOo0ooo0 +0oOo0ooo +0oOo +0oOooOOoO +00oOoO0000 +0oOoO000 +0oOoO000O +0oOoO000o +0oOoO00 +0oOoO00O0 +0oOoO00O +0oOoO00OO +0oOoO00Oo +0oOoO00o0 +00oOoO00o +0oOoO00oO +0oOoO00oo +0oOoO0 +0oOooOo0O +0oOoO0O00 +0oOoO0O0 +0oOoO0O0O +0oOoO0O0o +0oOoO0o +00oOoO0O +0oOoO0OO0 +0oOoO0OO +0oOoO0OOO +0oOoO0OOo +0oOoO0Oo0 +0oOoO0Oo +0oOoO0OoO +0oOoO0Ooo +0oOooOo00 +00oOoO0o00 +0oOoO0o0 +0oOoO0o0O +0oOoOoOOO +0oOoO0o0o +0oOoO0oO0 +0oOoO0oO +0oOoO0oOO +0oOoO0oOo +0oOooOo0o +0oOoO0oo0 +oOoO0oo +oOoO0ooO +oOoO0ooo +oOoO +oOoOO000 +oOoOO00 +oOoOO00O +oOoOO00o +oOoOO0 +0oOoOO0O0 +oOoOO0O +oOoOOo0O +oOoOO0OO +oOoOO0Oo +oOoOO0o0 +oOoOO0o +oOoOO0oO +oOooOOOO +oOoOO0oo +0oOoOO +oOoOOO00 +oOoOOO0 +oOoOOO0O +oOoOOO0o +oOoOOO +oOoOOOO0 +oOoOOOO +oOoOOOOO +oOoOOOOo +0oOoOOOo0 +oOoOOOo +oOoOOOoO +oOooOooO +oOoOOOoo +oOoOOo00 +oOoOOo0 +oOoOOo0o +oOoOOo +oOoOOoO0 +0oOoOOoO +oOoOOoOO +oOoOOoOo +oOoOOoo0 +oOoOOoo +oOoOOooO +oOoOOooo +oOoOo000 +oOoOo00 +oOoOo00O +0oOoOo00o +oOoOo0 +oOoOoo0O +oOoOo0O0 +oOoOo0O +ooOOO0oo +oOooo0Oo +oOooo0oo +oOoOo0OO +ooOOO0o0 +0oOoOo0Oo +oOoOo0o0 +oOoOo0o +oOoOo0oO +oOoOo0oo +oOoOo +ooOOOooo +oOoOoO00 +oOoOoO0 +oOoOoO0O +0ooOOOooO +oOooooOO +oOoOoO0o +oOoOoO +oOoOoOO0 +oOoOoOO +oOoOoOOo +oOoOoOo0 +oOoOoOo +oOooOOoo +0oOoOoOoO +oOoOoOoo +ooOOO0oO +oOooo0oO +oOoOoo00 +oOoOoo0 +ooOOO0O0 +oOooo0O0 +oOoOoo0o +oOoOoo +00ooOOOo0o +0oOoooooo +0oOoOooO0 +0oOoOooO +0oOoOooOO +0ooOOOo0O +0oOoooooO +0oOoOooOo +0oOoOooo0 +0oOoOooo +0ooOOOo00 +oOooooo0 +oOoOoooO +oOoOoooo +oOoo0000 +oOoo000 +oOoo000O +oOoo000o +oOoo00 +oOoo00O0 +0oOoo00O +oOoo00OO +oOoo00Oo +oOoo00o0 +oOoo00oO +oOoo00oo +oOoo0Oo0 +oOoo0O00 +oOoo0O0 +oOoo0O0O +0oOoo0O0o +oOoo0O +oOoo0OO0 +oOoo0oO +oOooo00 +oOoo0OO +oOoo0OOO +oOoo0OOo +oOoo0Oo +oOoo0OoO +0oOoo0Ooo +oOoo0o00 +oOoo0o0 +oOoo0o0O +oOoo0o0o +oOoo0o +oOoo0oO0 +oOoo0oOO +oOoo0oOo +oOoo0oo0 +0oOoo0oo +oOoo0ooO +oOoo0ooo +oOoo +oOooO000 +oOooO00 +oOooO00O +oOooO00o +oOooO0 +oOooO0O0 +0oOooO0O +oOooO0OO +oOooO0Oo +oOooO0o0 +oOooO0o +oOooO0oO +oOooO0oo +oOooO +oOooOO00 +oOooOO0 +0oOooOOo0 +oOooOO0O +oOooOO0o +oOooOO +oOooOOO0 +oOooOOO +oOooOOOo +oOooOOo +oOooOo0 +oOooOo +0oOooOoO0 +oOooOoO +oOooOoOO +oOooOoOo +oOooOoo0 +oOooOoo +oOooOooo +oOooo000 +oOooo00O +oOooo00o +0oOoooO +oOooo0 +oOooo0O +oOooo0OO +oOooo0o0 +oOoooO00 +oOoooO0 +oOoooO0O +oOoooO0o +oOoooOO0 +00oOoooOO +0oOoooOOO +0oOoooOOo +0oOoooOo0 +0oOoooOo +0oOoooOoO +0oOoooOoo +0oOoooo00 +0oOoooo0 +0oOoooo0O +0oOoooo0o +oOoooo +oOooooO0 +oOooooO +oOooooOo +oOooooo +oo000000 +oo00000 +oo00000O +oo00000o +0oo0000 +oo0000O0 +oo0000O +oo0000OO +oo0000Oo +oo0000o0 +oo0000o +oo0000oO +oo0000oo +oo000 +0oo000O00 +oo000O0 +oo000O0O +oo000O0o +oo000O +oo000OO0 +oo0OOOO +oo000OO +oo000OOO +oo000OOo +0oo000Oo0 +oo000Oo +oo000OoO +oo000Ooo +oo000o00 +oo000o0 +oo000o0O +oo000o0o +oo000oO0 +oo000oO +0oo000oOO +oo000oOo +oo000oo0 +oo000oo +oo000ooO +oo00 +oo00O00o +oo00O000 +oo00O00 +oo00O00O +0oo00O0 +oo00O0O0 +oo00O0O +oo00Oo0O +oo00O0OO +oo00O0Oo +oo00O0o0 +oo00O0o +oo00O0oO +oo00O0oo +0oo00O +oo00OO00 +oo00OO0 +oo00OO0O +oo00OO0o +oo00OO +oo00OOO0 +oo00OOO +oo00OOOO +oo00OOOo +0oo00OOo0 +oo00OOo +oo00OOoO +oo00OOoo +oo00Oo00 +oo00Oo0 +oo00Oo0o +oo00Oo +oo00OoO0 +oo00OoO +0oo00OoOO +oo00OoOo +oo00Ooo0 +oo00Ooo +oo00OooO +oo00Oooo +oo00o000 +oo00o00 +oo00o0o0 +oo00o00O +00oo00o00o +0oo00o0 +0oo00o0oo +0oo00ooOO +0oo00o0O0 +0oo00o0O +0oo00o0OO +0oo00o0Oo +0oo00o0o +0oo00o0oO +0oo00oO00 +oo00oO0 +oo00oO0O +oo00oO0o +oo00oOoO +oo00oOO0 +oo00oOo +oo00oOO +oo00oOOO +oo00oOOo +0oo00oOo0 +oo00oOoo +oo00oo00 +oo00oo0 +oo00oo0O +oo00oo0o +oo00oo +oo00ooO0 +oo00ooO +oo00ooOo +0oo00ooo0 +oo00ooo +oo00oooO +oo00oooo +oo0 +oo0O0000 +oo0O000 +oo0O000O +oo0O000o +oo0O00 +0oo0oOOOO +oo0O00O0 +oo0O00O +oo0O00OO +oo0O00Oo +oo0O00o0 +oo0O00o +oo0O00oO +oo0O00oo +oo0O0 +0oo0O0O00 +oo0O0O0 +oo0O0O0O +oo0O0O0o +oo0O0O +oo0O0OO0 +oo0O0OO +oo0O0OOO +oo0O0OOo +oo0O0Oo0 +0oo0O0Oo +oo0O0OoO +oo0O0Ooo +oo0O0o00 +oo0O0o0 +oo0O0o0O +oo0O0o0o +oo0O0o +oo0O0oO0 +ooo0OoO +0oo0O0oO +oo0oOOoO +oo0O0oOO +oo0O0oOo +oo0O0oo0 +oo0O0oo +oo0O0ooO +oo0O0ooo +oo0OoOO0 +oo0OO00o +0oo0OO00O +oo0OO000 +oo0OO00 +oo0Oo0 +oo0Ooo +oo0OoO +oo0OO0 +oo0OOoOO +oo0OO0Oo +oo0OOo0O +0oo0OOooO +oo0OO0O0 +oo0OO0O +oo0OO0OO +oo0OO0o0 +oo0OO0o +oo0OO0oO +oo0OO0oo +oo0OO +oo0OOO00 +00oo0oOoo +0oo0OOO0 +0oo0OOO0O +0ooo000O0 +0oo0OOO0o +0oo0OOO +0ooo000o0 +0oo0OOOO0 +0oo0OOOOO +0oo0OOOOo +0oo0OOOo0 +oo0OOOo +oo0OOOoO +ooo0000O +ooo00000 +oo0OOOoo +oo0OOo00 +oo0OOo0 +oo0OOo0o +oo0OOo +0oo0OOoO0 +oo0OOoO +oo0OOoOo +oo0OOoo0 +oo0OOooo +oo0Oo000 +oo0Oo00 +oo0Oo00O +oo0Oo00o +oo0Oo0O0 +0oo0Oo0O +oo0Oo0OO +oo0Oo0Oo +oo0Oo0o0 +oo0Oo0o +oo0Oo0oO +oo0Oo0oo +oo0Oo +oo0OoO00 +oo0OoO0 +0oo0OoO0O +oo0OoO0o +oo0OoOO +oo0OoOOO +oo0OoOOo +oo0OoOo0 +oo0OoOo +oo0OoOoO +oo0OoOoo +oo0Ooo00 +0oo0Ooo0 +oo0Ooo0O +oo0Ooo0o +oo0OooO +oo0OooOO +oo0OooOo +oo0Oooo0 +oo0Oooo +oo0OoooO +0oo0Ooooo +oo0o0000 +oo0o000 +oo0o000O +oo0o000o +oo0o00 +oo0o00O0 +oo0o00o +oo0o00O +oo0o00Oo +0oo0o00oO +oo0o00OO +oo0o00o0 +oo0o00oo +oo0o0 +oo0o0O00 +oo0o0O0o +oo0o0o +oo0o0O +oo0o0OO0 +0oo0o0OO +oo0o0OOO +oo0o0OOo +oo0o0Oo0 +oo0o0OoO +oo0o0Ooo +oo0o0o00 +oo0o0o0 +oo0o0o0O +oo0o0o0o +0oo0o0oO0 +oo0o0oO +oo0o0oOO +oo0o0oOo +oo0o0oo0 +oo0o0oo +oo0o0ooO +oo0o0ooo +oo0o +oo0oO000 +00oo0oO00 +0oo0oO0oO +0oo0oO00O +0oo0oO00o +0oo0oO0O0 +0oo0oO0O +0oo0oO0OO +0oo0oO0Oo +0oo0oO0o0 +0oo0oO0o +0oo0oO0oo +oo0oO +oo0oOO00 +oo0oOO0O +oo0oOO0o +oo0oOO +oo0oOOO0 +oo0oOOO +oo0oOOOo +oo0oOOo0 +0oo0oOOoo +oo0oOo00 +oo0oOo0 +oo0oOo0O +oo0oOo0o +oo0oOo +oo0oOoO0 +oo0oOoOO +oo0oOoOo +oo0oOoo0 +0oo0oOooO +oo0oOooo +oo0oo000 +ooo0oOO +oooOooO +oo0oo00 +oo0oo00O +oo0oo00o +oo0oo0 +oo0oo0O0 +0oo0oo0O +oo0oo0OO +oo0oo0Oo +oo0oo0o0 +oo0oo0o +oo0oo0oO +oo0oo0oo +oo0oo +oo0ooO00 +oo0ooO0 +0oo0ooO0O +oo0ooO0o +oo0ooOO0 +oo0ooOO +ooo0O0oo +ooo0oooO +oo0ooOOO +oo0ooOOo +oo0ooOo0 +oo0ooOo +0oo0ooOoO +oo0ooOoo +oo0ooo00 +oo0ooo0 +oo0ooo0o +oo0ooo0O +oo0ooo +oo0oooOO +oo0oooO0 +oo0oooO +0oo0oooOo +oo0oooo0 +oo0oooo +oo0ooooO +oo0ooooo +oo +ooO00000 +oooooOo +ooO0000 +ooO0000O +0ooOooOOO +ooO0000o +ooO0oo +ooO000 +ooO000O0 +ooO000O +ooO000OO +ooO000Oo +ooO000o0 +ooO000o +0ooO000oO +ooO000oo +ooO00 +ooO0OOoo +ooOo000o +ooOo00O0 +ooO00O00 +ooO00O0O +ooO0OOoO +ooO00O0o +00ooO00O +0ooOo00o0 +0ooO00OO0 +0ooO00OO +0ooO0OOOO +0ooO00OOO +0ooO00OOo +0ooO00Oo0 +0ooO00Oo +0ooO00OoO +0ooOo00OO +ooO00Ooo +ooO00o00 +ooO00o0 +ooO00o0O +ooO00o0o +ooO00o +ooO00oO0 +ooO00oO +ooO00oOO +0ooO00oOo +ooO00oo0 +ooO00oo +ooO00ooO +ooO00ooo +ooO0 +ooO0O000 +oooo000 +ooO0O00 +ooO0O00O +0ooO0O00o +ooO0O0 +ooO0O0O0 +ooO0O0O +ooO0O0OO +ooO0O0Oo +ooO0O0o0 +ooO0OOO +ooO0O0o +ooO0O0oO +0ooO0O0oo +ooO0O +ooOo000O +ooO0OO00 +ooO0OO0 +ooO0OO0O +ooO0OO0o +ooO0OO +ooO0OOO0 +ooO0OOOo +0ooO0OOo0 +ooO0OOo +ooO0Oo00 +ooo0oOo +ooO0Oo0 +ooO0Oo0O +ooO0Oo0o +ooO0Oo +ooO0OoO0 +ooO0OoO +0ooO0OoOO +ooO0OoOo +ooO0Ooo0 +ooO0OooO +ooO0Oooo +ooO0o000 +ooO0o00 +ooO0o00O +ooO0o00o +ooO0o0 +0ooO0o0O0 +ooO0o0O +ooO0o0OO +ooO0o0Oo +ooO0o0o0 +ooO0o0o +ooO0o0oO +ooO0o0oo +ooO0o +ooO0oO00 +0ooO0oO0 +ooO0oO0O +ooOo00Oo +ooO0oO0o +ooO0oO +ooO0oOO0 +ooO0oOO +ooO0oOOO +ooO0oOOo +ooO0oOo0 +0ooo0OOo +ooO0oOo +ooO0oOoO +ooO0oOoo +ooO0oo00 +ooO0oo0 +ooO0oo0O +ooO0oo0o +ooO0ooO0 +ooO0ooO +00ooO0ooOO +0ooO0ooOo +0ooO0ooo0 +0ooO0ooo +0ooO0oooO +0ooO0oooo +0ooo +0ooO +0ooOO0000 +0ooOO000 +0ooOO000O +ooOO000o +ooOO00 +ooOO00O0 +ooOO00O +ooOO00OO +ooOO00Oo +ooOO00o0 +ooOO00o +ooOO00oO +0ooOO00oo +ooOO0 +ooOO0O00 +ooOO0O0 +ooOO0O0O +ooOO0O0o +ooOO0OO0 +ooOO0OO +ooOO0OOO +ooOOo0OO +0ooOO0OOo +ooOO0Oo0 +ooOO0Oo +ooOO0OoO +ooOO0Ooo +ooOO0o00 +ooOO0o0 +ooOO0o0O +ooOO0o0o +ooOO0o +0ooOO0oO0 +ooOO0oO +ooOO0oOO +ooOO0oOo +ooOO0oo0 +ooOO0oo +ooOO0ooO +ooOO0ooo +ooOOO00 +ooOOoO +0ooOOO0 +ooOOO0O +ooOOO0o +ooOOO +ooOOOO00 +ooOOOO0 +ooOOOO0O +ooOOOO0o +ooOOOO +ooOOOOO0 +0ooOOOOO +ooOOOOOO +ooOOOOo +ooOOOo0 +ooOOOo +ooOOOoO +ooOOOoo +ooOOo000 +ooOOo00O +ooOOo00o +0ooOOo0O0 +ooOOo0O +ooOOo0Oo +ooOOo0o0 +ooOOo0o +ooOOo0oO +ooOOo0oo +ooOOo +ooOOoO0 +ooOOoO0O +0ooOOoO0o +ooOOoOo +ooOOoo00 +ooOOoo0 +ooOOoo0O +ooOOoo0o +ooOOoo +ooOOooO0 +ooOOooO +ooOOooOO +0ooOOooo0 +ooOOooo +ooOOoooo +ooOo0000 +ooOo000 +ooOo00 +ooOo00oO +ooOo00oo +ooOo0 +ooOo0O00 +00ooOo0o0 +0ooOo0O0 +0ooOo0oOo +0ooOo0O0O +0ooOo0O0o +0ooOo0O +0ooOo0OO0 +0ooOo0OO +0ooOoOo0o +0ooOooOOo +0ooOo0OOO +ooOo0OOo +ooOo0Oo0 +ooOo0Oo +ooOo0OoO +ooOo0Ooo +ooOo0o00 +ooOo0o0O +ooOo0o0o +ooOo0o +0ooOo0oO0 +ooOo0oO +ooOo0oOO +ooOo0oo0 +ooOo0oo +ooOo0ooO +ooOo0ooo +ooOoO000 +ooOoO00 +ooOoO00O +0ooOoO00o +ooOoO0 +ooOoO0O0 +ooOoO0O +ooOoO0OO +ooOoO0Oo +ooOoO0o0 +ooOoO0o +ooOoO0oO +ooOoO0oo +0ooOoO +ooOoOoOO +ooOoOO00 +ooOoOO0 +ooOoOOOo +ooOoOO0O +ooOoOO0o +ooOoOO +ooOoOOO0 +ooOoOOO +0ooOoOOOO +ooOoOOo0 +ooOoOOo +ooOoOOoO +ooOoOOoo +ooOoOo00 +ooOoOo0 +ooOoOo0O +ooOoOo +ooOoOoO0 +0ooOoOoO +ooOoOoOo +ooOoOoo0 +ooOoOoo +ooOoOooO +ooOoOooo +ooOoo000 +ooOoo00 +ooOooo0o +ooOoo00O +0ooOoo00o +ooOoo0 +ooOoo0O0 +ooOoo0O +ooOoo0OO +ooOoo0Oo +ooOoo0o0 +ooOoo0o +ooOoo0oo +ooOoo0oO +0ooooO +ooOoo +ooOooO00 +ooOooO0 +ooOooO0O +ooOooO0o +ooOooo +ooOooO +ooOooOO0 +ooOooOO +0ooOooOo0 +ooOooOo +ooOooOoO +ooOooOoo +ooOooo00 +ooOooo0 +ooOooo0O +ooOoooO0 +ooOoooO +ooOoooOO +000ooOoooOo +00ooOoooo0 +00ooOoooo +00ooOooooO +00ooOooooo +00ooo0000 +00ooo000oo +00ooo0000o +00ooo000 +00ooo000O +00ooo000OO +0ooo000Oo +0ooo000o +0ooo000oO +0ooo00 +0ooo00O00 +0ooo00oO0 +0ooo00O0O +0ooo00O0o +0ooo00O +00ooo00Oo0 +0ooo00OO0 +0ooo00OO +0ooo00OOO +0ooo00OOo +0ooo00Oo +0ooo00OoO +0ooo00Ooo +0ooo00o00 +0ooo00o0 +00ooo00o0O +0ooo00o0o +0ooo00o +0ooo00oO +0ooo00oOO +0ooo00oOo +0ooo00oo0 +0ooo00oo +0ooo00ooO +0ooo00ooo +00ooo0 +0ooo0O000 +0ooo0O00 +0ooo0O00O +0ooo0O00o +0ooo0oo +0ooo0o0 +0ooo0oO +0ooo0O0 +0ooo0O0O0 +00ooo0O0O +0ooo0O0OO +0ooo0O0Oo +0ooo0O0o0 +0ooo0O0o +0ooo0O0oO +0ooo0O +0ooo0OO00 +0ooo0OO0 +0ooo0OO0O +00ooo0OO0o +0ooo0Oo +0ooo0OO +0ooo0OOO0 +0ooo0OOO +0oooo00oo +0ooo0OOoO +0ooo0OOOO +0ooo0OOOo +0ooo0OOo0 +00ooo0OOoo +0ooo0Oo00 +0ooo0Oo0O +0ooo0Oo0o +0ooo0OoO0 +0ooo0OoOO +0ooo0OoOo +0ooo0Ooo0 +0ooo0OooO +0ooo0Oooo +00ooo0o000 +0ooo0o00 +0ooo0o00O +0ooo0o00o +0ooo0o0OO +0ooo0o0O0 +0ooo0o0O +0ooo0o0Oo +0ooo0o0o0 +0ooo0o0o +00ooo0o0oO +0ooo0o0oo +0ooo0oO00 +0ooo0oO0 +0ooo0oO0O +0ooo0oO0o +0ooo0oOO0 +0ooo0oOOO +0ooo0oOOo +0ooo0oOo0 +00ooo0oOoO +0ooo0oOoo +0ooo0oo00 +0ooo0oo0 +0ooo0oo0O +0ooo0oo0o +0ooo0ooO0 +0ooo0ooO +0ooo0ooOO +0ooo0ooOo +0ooo0ooo0 +ooo0oooo +oooO0oo0 +oooO0000 +oooO000 +oooO00o0 +oooO000O +oooO0ooo +oooO000o +ooooo0 +0oooooo +ooooOo +oooO00 +oooO00O0 +oooO00O +oooO00Oo +oooO00OO +oooO00o +ooooOOOo +ooooOOOO +0ooooOo00 +oooO0oO0 +oooO00oO +oooO00oo +oooO0 +oooO0O00 +oooO0O0 +oooO0O0O +oooO0O0o +oooO0O +0oooOOo0O +oooO0OO0 +oooO0OO +oooO0OOO +oooO0OOo +oooO0Oo0 +oooO0Oo +oooO0OoO +oooO0Ooo +oooO0o00 +0oooO0o0 +oooO0o0O +oooO0o0o +oooooO +oooO0o +oooO0oO +oooO0oo +oooO0ooO +oooO +oooOooOO +0oooOO000 +oooOO00 +oooOO0o0 +oooOO00O +oooOO00o +oooOO0O0 +oooOO0O +oooOO0OO +oooOO0Oo +oooOO0o +0oooOO0oO +oooOO0oo +oooOO +oooOOO00 +oooOOO0 +oooOOO0O +oooOOO0o +oooOOO +oooOOOO0 +oooOOOO +0oooOOOOO +oooOOOOo +oooOOOo0 +oooOOOo +oooOOOoO +oooOOOoo +oooOOo00 +oooOOo0 +oooOOo0o +oooOOo +0oooOOoO0 +oooOOoO +oooOOoOO +oooOOoOo +oooOOoo0 +oooOOoo +oooOOooO +oooOOooo +oooOo000 +oooOo00 +00oooOo00O +0oooOo00o +0oooOo0 +0oooOo0oo +0oooOo0O0 +0oooOo0O +0oooOo0OO +0oooOo0Oo +0oooOo0o0 +0oooOo0o +0oooOo0oO +oooOo +oooOoO00 +oooOoO0 +oooOoO0O +oooOoO0o +oooOoOOO +oooOoOO0 +oooOoOO +oooOoOOo +0oooOoOo0 +oooOoOo +oooOoOoO +oooOoOoo +oooOoo00 +oooOoo0 +oooOoo0O +oooOoo0o +oooOooO0 +oooOooOo +0oooOooo0 +oooOooo +oooOoooO +oooOoooo +oooo0000 +oooo000O +oooo000o +oooo00 +oooo00o0 +oooo00O0 +0oooo00O +oooo00OO +oooo00Oo +oooo00oO +oooo0 +oooo0O00 +oooo0O0 +oooo0O0O +oooo0O0o +oooo0O +0oooo0OO0 +oooo0OO +oooo0OOO +oooo0OOo +oooo0Oo0 +oooo0Oo +oooo0OoO +oooo0Ooo +oooo0o00 +oooo0o0 +0oooo0o0O +oooo0o0o +oooo0o +oooo0oO0 +oooo0oO +oooo0oOO +oooo0oOo +oooo0oo0 +oooo0oo +oooo0ooO +0oooo0ooo +oooo +ooooO00 +ooooOOoO +ooooO00O +ooooO00o +ooooO0 +ooooO0O +ooooO0OO +ooooO0Oo +0ooooO0o0 +ooooO0o +ooooO0oO +ooooOO0 +ooooOO0o +ooooOO +ooooOoo0 +ooooOOO0 +ooooOOO +ooooOOo +0ooooOo0 +ooooOo0O +ooooOo0o +ooooOoO0 +ooooOoO +ooooOoo +ooooOooO +ooooOooo +ooooo000 +ooooo00 +00ooooo00O +0ooooo00o +0ooooo0O0 +0ooooo0O +0ooooo0OO +0ooooo0Oo +0ooooo0o0 +0ooooo0o +0ooooo0oO +0ooooo0oo +0ooooo +oooooO00 +oooooO0 +oooooOo0 +oooooO0O +oooooO0o +oooooOO0 +oooooOO +oooooOOO +oooooOOo +0oooooOoO +oooooOoo +oooooo00 +oooooo0 +oooooo0O +oooooo0o +ooooooO0 +ooooooOO +ooooooOo +ooooooo0 +0oooooooO +oooooooo +O +O0 +O00 +O000 +O0000 +O00000 +O000000 +O0000000 +O000000O +O00000O +O00000O0 +O00000OO +O0000O +O0000O0 +O0000O00 +O0000O0O +O0000OO +O0000OO0 +O0000OOO +O000O +O000O0 +O000O00 +O000O000 +O000O00O +O000O0O +O000O0O0 +O000o0oO +O000Oo +O000OO0 +O000oo00 +O000OO0O +O000OOO +O000OOO0 +O000OOOO +O00O +O00O0 +O00O00 +O00O000 +O00O0000 +O00O000O +O00O00O +O00O00O0 +O00O00OO +O00O0O +O00O0O0 +O00O0O00 +O00O0O0O +O00O0oO +O00O0OO0 +O00O0OOO +O00OO +O00OO0 +O00OO00 +O00Oo000 +O00Oo00O +O00Oo0O +O00Oo0O0 +O00oo0oO +O00OOO +O00OOO0 +O00OoO00 +O00ooo0O +O00OOOO +O00oOoO0 +O00ooooO +O0O +O0O0 +O0O00 +O0O000 +O0O0000 +o0o00000 +o0o0000O +O0O000O +o0O000O0 +o0O000OO +O0O00O +O0O00O0 +o0O00O00 +o0O00O0O +O0O00oo +o0O00OO0 +o0O00OOo +O0o0o +O0O0O0 +O0O0O00 +o0O0O000 +o0O0O00o +O0O0O0O +o0O0O0O0 +o0O0O0OO +O0O0Oo +O0o0oo0 +o0O0OO00 +o0O0OO0o +O0o0ooo +o0O0OOo0 +o0O0OOOO +O0OO +O0OO0 +O0OO00 +O0OO000 +o0OO0000 +o0OO000O +o0Oo00O +o0OO00O0 +o0OO00oO +O0OO0o +O0OO0O0 +o0OO0O00 +o0oO0O0O +O0OO0OO +o0oO0Oo0 +o0oO0oOo +O0OOO +O0OOo0 +o0OoO00 +o0OOO000 +o0OoO00o +O0OoO0o +o0ooo0O0 +o0ooo0Oo +O0oOOO +O0OOOO0 +o0ooOO00 +o0OOOO0O +O0oOOOO +o0ooOOo0 +o0ooooOO +OO +OO0 +OO00 +OO000 +Oo0000 +OO00000 +oO000000 +oO00000O +OO0000O +oO0000O0 +oO0000OO +OO000O +OO000O0 +oO000O00 +oO000o0O +oO000OO +oO000OO0 +oo000ooo +OO00o +OO00o0 +OO00O00 +oO00O000 +oO00O00O +OO00O0O +oO00O0O0 +oO00O0OO +Oo00oO +OO00OO0 +oO00OO00 +oO00OO0o +Oo00oOo +oO00OOO0 +oO00OOOO +OO0O +OO0O0 +OO0O00 +OO0O000 +oO0O0000 +oO0O000O +OO0O00O +oO0O00O0 +oO0O00OO +OO0o0O +OO0O0O0 +oO0O0o00 +oo0o0O0O +Oo0o0OO +oO0O0OO0 +oO0O0Ooo +OO0Oo +OO0OO0 +OO0OO00 +oO0Oo000 +oO0Oo00o +OO0OO0O +oO0OO0O0 +oO0Oo0oO +Oo0OOO +OO0OOO0 +oO0OOo00 +oO0OoO0o +Oo0OoOO +oO0Oooo0 +oO0OoOOo +OOo +OOO0 +OoO00 +OOO000 +OOO0000 +oOo00000 +oOo0000o +OOO000O +oOo000O0 +oOo000oO +OOO00O +ooo00O0 +oOo00O00 +oOo00O0o +OOO00OO +oOO00oo0 +oOo00Ooo +OOo0O +OOO0O0 +OOO0O00 +oOO0o000 +oOO0o00O +Ooo0o0O +oOo0o0O0 +oOo0o0oo +OOO0OO +Ooo0Oo0 +oOO0OO00 +oOo0oo0o +ooo0ooo +oOO0OOO0 +oOo0oooo +OOOO +OooO0 +OOOO00 +OOOO000 +oOOO0000 +oOOO000O +ooOo00o +oOOO00O0 +oOOO00OO +OOOO0o +OOOO0O0 +oOOO0O00 +oOOO0O0O +Oooo0Oo +oOOO0Oo0 +oooO0oOo +Ooooo +OOoOO0 +OoOOO00 +ooOOO000 +ooOOO00o +OOOOO0O +oOOoO0o0 +ooOOO0OO +oooOoo +OOOOOO0 +ooOOoO00 +ooooOO0O +ooOOoOO +ooOOOOo0 +ooOOOoOO diff --git a/wechathelper/proguard-rules.pro b/wechathelper/proguard-rules.pro index 205bc72..4f50022 100644 --- a/wechathelper/proguard-rules.pro +++ b/wechathelper/proguard-rules.pro @@ -39,4 +39,8 @@ -dontwarn org.eclipse.jdt.annotation.** -dontwarn c.t.** -dontwarn android.support.v4.animation.** --dontwarn android.support.v7.widget.** \ No newline at end of file +-dontwarn android.support.v7.widget.** + +-obfuscationdictionary dic.txt +-classobfuscationdictionary dic.txt +-packageobfuscationdictionary dic.txt \ No newline at end of file diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/Main.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/Main.java index e56b839..922d7e3 100644 --- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/Main.java +++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/Main.java @@ -11,7 +11,7 @@ import com.wuxiaosu.wechathelper.hook.ExdeviceRankHook; import com.wuxiaosu.wechathelper.hook.ExtDeviceWXLoginUIHook; import com.wuxiaosu.wechathelper.hook.LauncherUIHook; -import com.wuxiaosu.wechathelper.hook.MoneyHook; +import com.wuxiaosu.wechathelper.hook.WalletHook; import com.wuxiaosu.wechathelper.hook.RevokeMsgHook; import com.wuxiaosu.wechathelper.hook.StepHook; import com.wuxiaosu.wechathelper.hook.TencentLocationManagerHook; @@ -95,9 +95,9 @@ protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Thr private void handleHook(ClassLoader classLoader, String versionName) { new TencentLocationManagerHook(versionName).hook(classLoader); - new EmojiGameHook(versionName).hook(classLoader); - new MoneyHook(versionName).hook(classLoader); - new UIHook(versionName).hook(classLoader); + EmojiGameHook.getInstance().init(classLoader, versionName); + WalletHook.getInstance().init(classLoader, versionName); + UIHook.getInstance().init(classLoader, versionName); LauncherUIHook.getInstance().init(classLoader, versionName); ExdeviceRankHook.getInstance().init(classLoader, versionName); RevokeMsgHook.getInstance().init(classLoader, versionName); diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/activity/MainActivity.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/activity/MainActivity.java index 4471063..0de44a1 100644 --- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/activity/MainActivity.java +++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/activity/MainActivity.java @@ -35,8 +35,6 @@ import com.wuxiaosu.widget.SettingLabelView; import com.wuxiaosu.widget.utils.PropertiesUtils; -import java.util.Arrays; - import butterknife.BindView; import butterknife.OnClick; @@ -210,7 +208,7 @@ private void showInfo() { TextView mTvVersionName = view.findViewById(R.id.tv_version_name); TextView mTvInfo = view.findViewById(R.id.tv_info); final TextView mTvUrl = view.findViewById(R.id.tv_url); - mTvUrl.setText(Html.fromHtml("https://github.com/wuxiaosu/XposedWechatHelper")); + mTvUrl.setText(Html.fromHtml("https://www.coolapk.com/apk/com.wuxiaosu.wechathelper")); mTvUrl.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -218,9 +216,7 @@ public void onClick(View v) { } }); mTvVersionName.setText(getString(R.string.app_name) + " v" + BuildConfig.VERSION_NAME); - mTvInfo.setText(getString(R.string.app_description) - + ",当前版本已支持\n微信:" - + Arrays.toString(wechatSupportVersions) + mTvInfo.setText("可以请作者喝杯豆浆" + getContactInfo() + "\n更多详情:"); AlertDialog alertDialog = new AlertDialog.Builder(this) @@ -231,9 +227,8 @@ public void onClick(View v) { } private String getContactInfo() { - return "\nQQ交流群:[123320001]\n" + - "微信进群加微信:[CSYJZF]\n" + - "一键点赞问题反馈微信:[WUXIAOSU45]"; + return "\nQ群:[123320001]\n" + + "微信群加:[CSYJZF]\n"; } private void sendURLIntent(String url) { @@ -252,6 +247,8 @@ private void sendURLIntent(String url) { private void showModuleActiveInfo(boolean isModuleActive) { if (!isModuleActive) { Toast.makeText(this, "模块未激活", Toast.LENGTH_SHORT).show(); + } else { + showInfo(); } } diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/EmojiGameHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/EmojiGameHook.java index dc41d80..5f42ca4 100644 --- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/EmojiGameHook.java +++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/EmojiGameHook.java @@ -1,8 +1,13 @@ package com.wuxiaosu.wechathelper.hook; +import android.annotation.SuppressLint; + import com.wuxiaosu.wechathelper.utils.Constant; import com.wuxiaosu.widget.utils.PropertiesUtils; +import java.lang.reflect.Method; +import java.util.Random; + import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedHelpers; @@ -17,40 +22,62 @@ public class EmojiGameHook { private String morra; private boolean fakeDice; private String dice; - private String methodName; - private String clazzName; - public EmojiGameHook(String versionName) { - switch (versionName) { - case "6.6.0": - clazzName = "com.tencent.mm.sdk.platformtools.bh"; - methodName = "em"; - break; - case "6.6.1": - clazzName = "com.tencent.mm.sdk.platformtools.bh"; - methodName = "en"; - break; - case "6.6.2": - clazzName = "com.tencent.mm.sdk.platformtools.bh"; - methodName = "eF"; - break; - case "6.6.3": - clazzName = "com.tencent.mm.sdk.platformtools.bh"; - methodName = "eF"; - break; - case "6.6.5": - clazzName = "com.tencent.mm.sdk.platformtools.bi"; - methodName = "eI"; - break; - default: - case "6.6.6": - clazzName = "com.tencent.mm.sdk.platformtools.bh"; - methodName = "eE"; - break; + private EmojiGameHook() { + } + + private ClassLoader classLoader; + + public void init(ClassLoader classLoader, String versionName) { + if (this.classLoader == null) { + this.classLoader = classLoader; + hook(classLoader); + } + } + + public static EmojiGameHook getInstance() { + return EmojiGameHook.SingletonHolder.instance; + } + + private static class SingletonHolder { + @SuppressLint("StaticFieldLeak") + private static final EmojiGameHook instance = new EmojiGameHook(); + } + + private void hook(final ClassLoader classLoader) { + try { + XposedHelpers.findAndHookMethod(Random.class, "nextInt", int.class, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + if ((int) param.args[0] < 10) { + StackTraceElement[] traceElements = Thread.currentThread().getStackTrace(); + for (StackTraceElement traceElement : traceElements) { + if (traceElement.getClassName().startsWith("com.tencent.mm.sdk.platformtools.")) { + Method[] methods = XposedHelpers.findClass(traceElement.getClassName(), classLoader).getMethods(); + for (Method method : methods) { + if (method.getName().equals(traceElement.getMethodName())) { + if (method.getParameterTypes().length == 2) { + if (method.getParameterTypes()[0] == int.class + && method.getParameterTypes()[1] == int.class + && method.getReturnType() == int.class) { + hook(classLoader, traceElement.getClassName(), method.getName()); + break; + } + } + } + } + } + } + } + super.beforeHookedMethod(param); + } + }); + } catch (Exception e) { + e.printStackTrace(); } } - public void hook(ClassLoader classLoader) { + private void hook(final ClassLoader classLoader, String clazzName, String methodName) { try { Class clazz = XposedHelpers.findClass(clazzName, classLoader); XposedHelpers.findAndHookMethod(clazz, methodName, int.class, int.class, new XC_MethodHook() { diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/ExdeviceRankHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/ExdeviceRankHook.java index 12cd489..9575570 100644 --- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/ExdeviceRankHook.java +++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/ExdeviceRankHook.java @@ -8,6 +8,10 @@ import android.widget.ListView; import android.widget.RelativeLayout; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; @@ -23,7 +27,6 @@ public class ExdeviceRankHook { - private String itemInfoFieldName; private ListView listView; private int likeIconId = 0; @@ -33,35 +36,12 @@ private ExdeviceRankHook() { private ClassLoader classLoader; public void init(ClassLoader classLoader, String versionName) { - switch (versionName) { - case "6.6.0": - itemInfoFieldName = "lqh"; - break; - case "6.6.1": - itemInfoFieldName = "lus"; - break; - case "6.6.2": - itemInfoFieldName = "lZj"; - break; - case "6.6.3": - itemInfoFieldName = "lZj"; - break; - case "6.6.5": - itemInfoFieldName = "meX"; - break; - default: - case "6.6.6": - itemInfoFieldName = "mcf"; - break; - } if (this.classLoader == null) { this.classLoader = classLoader; hook(classLoader); } } - private long startTime = 0; - public static ExdeviceRankHook getInstance() { return ExdeviceRankHookHolder.instance; } @@ -73,7 +53,20 @@ private static class ExdeviceRankHookHolder { private void hook(final ClassLoader classLoader) { try { - Class contextMenuClazz = XposedHelpers.findClass("com.tencent.mm.ui.base.n", classLoader); + Class menuClazz = XposedHelpers.findClass("com.tencent.mm.plugin.exdevice.ui.ExdeviceRankInfoUI$19", classLoader); + + Class contextMenuClazz = null; + + String methodName = ""; + Method[] methods = menuClazz.getMethods(); + for (Method method : methods) { + if (method.getReturnType() == void.class && method.getParameterTypes().length == 1) { + //写法偷懒了 以后出问题了再说 + methodName = method.getName(); + contextMenuClazz = method.getParameterTypes()[0]; + break; + } + } XposedHelpers.findAndHookMethod(contextMenuClazz, "a", int.class, CharSequence.class, int.class, new XC_MethodHook() { @Override @@ -84,9 +77,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); } }); - Class menuClazz = XposedHelpers.findClass("com.tencent.mm.plugin.exdevice.ui.ExdeviceRankInfoUI$19", classLoader); - - XposedBridge.hookAllMethods(menuClazz, "a", new XC_MethodHook() { + XposedBridge.hookAllMethods(menuClazz, methodName, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { Object object = param.args[0]; @@ -107,17 +98,39 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { protected void afterHookedMethod(MethodHookParam param) throws Throwable { MenuItem menuItem = (MenuItem) param.args[0]; if (menuItem.getItemId() == 4 && listView != null) { - startTime = System.currentTimeMillis(); - XposedBridge.log(" --- >> like start"); Observable.create(new ObservableOnSubscribe() { @Override - public void subscribe(ObservableEmitter emitter) throws InterruptedException { + public void subscribe(ObservableEmitter emitter) { ListAdapter listAdapter = listView.getAdapter(); + Object itemObject = listAdapter.getItem(1); + Constructor[] constructors = itemObject.getClass().getDeclaredConstructors(); + + String itemInfoFieldName = ""; + for (Constructor constructor : constructors) { + Class[] classes = constructor.getParameterTypes(); + if (classes.length == 5) { + if (classes[0] == int.class + && classes[1] == int.class + && classes[2] == String.class + && classes[3] == String.class) { + + Field[] fields = itemObject.getClass().getDeclaredFields(); + + for (Field field : fields) { + if (field.getType() == classes[4]) { + itemInfoFieldName = field.getName(); + break; + } + } + break; + } + } + } + int rankNum = (int) XposedHelpers.getObjectField( XposedHelpers.getObjectField(listAdapter.getItem(1), itemInfoFieldName), "field_ranknum"); - XposedBridge.log(" --- >> for start - > " + (System.currentTimeMillis() - startTime)); for (int i = 3; i < listAdapter.getCount() - 1; i++) { if (i != rankNum + 2) { int selfLikeState = (int) XposedHelpers.getObjectField( @@ -126,15 +139,11 @@ public void subscribe(ObservableEmitter emitter) throws InterruptedExcepti "field_selfLikeState"); if (selfLikeState == 0) { // 没赞过的 - XposedBridge.log(" --- >> get view start " + i + " - > " + (System.currentTimeMillis() - startTime)); - View view = ((RelativeLayout) ((LinearLayout) ((RelativeLayout) listAdapter.getView(i, null, null)) .getChildAt(1)) .getChildAt(1)).getChildAt(1); - XposedBridge.log(" --- >> get view done " + i + " - > " + (System.currentTimeMillis() - startTime) + " " + view); - emitter.onNext(view); } } @@ -143,10 +152,8 @@ public void subscribe(ObservableEmitter emitter) throws InterruptedExcepti }).subscribe(new Consumer() { @Override public void accept(View view) { - XposedBridge.log(" --- >> click start - > " + (System.currentTimeMillis() - startTime) + " " + view); view.callOnClick(); view.destroyDrawingCache(); - XposedBridge.log(" --- >> click done - > " + (System.currentTimeMillis() - startTime) + " " + view); } }); } diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/LauncherUIHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/LauncherUIHook.java index 8707273..9c2caec 100644 --- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/LauncherUIHook.java +++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/LauncherUIHook.java @@ -4,10 +4,14 @@ import android.content.Intent; import android.view.Menu; import android.view.MenuItem; +import android.widget.AdapterView; +import android.widget.PopupWindow; import com.wuxiaosu.wechathelper.utils.Constant; import com.wuxiaosu.widget.utils.PropertiesUtils; +import java.lang.reflect.Field; + import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; @@ -21,9 +25,7 @@ public class LauncherUIHook { - private boolean fakeLauncherMenu; - - private int[] iconIds; + private int[] iconIds = new int[2]; private LauncherUIHook() { } @@ -31,27 +33,6 @@ private LauncherUIHook() { private ClassLoader classLoader; public void init(ClassLoader classLoader, String versionName) { - switch (versionName) { - case "6.6.0": - iconIds = new int[]{2131165958, 2131166039}; - break; - case "6.6.1": - iconIds = new int[]{2131165967, 2131166048}; - break; - case "6.6.2": - iconIds = new int[]{2131165967, 2131166048}; - break; - case "6.6.3": - iconIds = new int[]{2131165967, 2131166048}; - break; - case "6.6.5": - iconIds = new int[]{2131165967, 2131166048}; - break; - default: - case "6.6.6": - iconIds = new int[]{2131165986, 2131166064}; - break; - } if (this.classLoader == null) { this.classLoader = classLoader; hook(classLoader); @@ -68,12 +49,14 @@ private static class SingletonHolder { } private void hook(final ClassLoader classLoader) { - fakeLauncherMenu = Boolean.valueOf(PropertiesUtils.getValue(Constant.PRO_FILE, "fake_launcher_menu", "false")); + boolean fakeLauncherMenu = Boolean.valueOf(PropertiesUtils.getValue(Constant.PRO_FILE, "fake_launcher_menu", "false")); if (!fakeLauncherMenu) { return; } + initItemClass(classLoader); + try { Class clazz = XposedHelpers.findClass("com.tencent.mm.ui.LauncherUI", classLoader); XposedHelpers.findAndHookMethod(clazz, "onCreateOptionsMenu", @@ -121,4 +104,83 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log(e); } } + + + /** + * find item bean + * + * @param classLoader + */ + private void initItemClass(final ClassLoader classLoader) { + try { + final Class homeUIClazz = XposedHelpers.findClass("com.tencent.mm.ui.HomeUI", classLoader); + final Class launcherUIClazz = XposedHelpers.findClass("com.tencent.mm.ui.LauncherUI", classLoader); + + XposedHelpers.findAndHookMethod(launcherUIClazz, "onResume", new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) throws Throwable { + Object homeUIObject = null; + Field[] launcherUIFields = launcherUIClazz.getFields(); + for (Field field : launcherUIFields) { + if (field.getType() == homeUIClazz) { + homeUIObject = XposedHelpers.getObjectField(param.thisObject, field.getName()); + } + } + Field[] homeUIFields = homeUIClazz.getDeclaredFields(); + for (Field homeUIField : homeUIFields) { + Object object = XposedHelpers.getObjectField(homeUIObject, homeUIField.getName()); + if (object instanceof AdapterView.OnItemClickListener + && object instanceof PopupWindow.OnDismissListener) { + + Class[] classes = object.getClass().getClasses(); + for (Class aClass : classes) { + + Field[] fields = aClass.getDeclaredFields(); + + if (fields.length == 5) { + int intCount = 0; + int stringCount = 0; + for (Field field : fields) { + intCount = intCount + (field.getType() == int.class ? 1 : 0); + stringCount = stringCount + (field.getType() == String.class ? 1 : 0); + } + if (intCount == 3 && stringCount == 2) { + initIconIds(aClass); + } + } + } + } + } + super.beforeHookedMethod(param); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * find icon id + * + * @param itemClass + */ + private void initIconIds(final Class itemClass) { + try { + XposedBridge.hookAllConstructors(itemClass, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + int arg0 = (int) param.args[0]; + int iconId = (int) param.args[3]; + if (arg0 == 10) { + iconIds[0] = iconId; + } else if (arg0 == 20) { + iconIds[1] = iconId; + } + super.beforeHookedMethod(param); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/MoneyHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/MoneyHook.java deleted file mode 100644 index afed965..0000000 --- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/MoneyHook.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.wuxiaosu.wechathelper.hook; - -import android.widget.TextView; - -import com.wuxiaosu.wechathelper.BuildConfig; -import com.wuxiaosu.wechathelper.utils.Constant; -import com.wuxiaosu.widget.SettingLabelView; -import com.wuxiaosu.widget.utils.PropertiesUtils; - -import de.robv.android.xposed.XC_MethodHook; -import de.robv.android.xposed.XSharedPreferences; -import de.robv.android.xposed.XposedHelpers; - -import static de.robv.android.xposed.XposedHelpers.getObjectField; - - -/** - * Created by su on 2018/2/05. - * 零钱 hook - */ - -public class MoneyHook { - - private static boolean fakeMoney; - private static String money; - - private String mallIndexUIMethodName; - private String mallIndexUIFiledName; - - private String walletBalanceManagerUIMethodName; - private String walletBalanceManagerUIFiledName; - - public MoneyHook(String versionName) { - switch (versionName) { - //6.6.1 通过 - case "6.6.0": - mallIndexUIMethodName = "aSR"; - mallIndexUIFiledName = "nya"; - - walletBalanceManagerUIMethodName = "au"; - walletBalanceManagerUIFiledName = "rFA"; - break; - case "6.6.1": - mallIndexUIMethodName = "aTu"; - mallIndexUIFiledName = "nCe"; - - walletBalanceManagerUIMethodName = "au"; - walletBalanceManagerUIFiledName = "rJK"; - break; - case "6.6.2": - mallIndexUIMethodName = "aYm"; - mallIndexUIFiledName = "olV"; - - walletBalanceManagerUIMethodName = "au"; - walletBalanceManagerUIFiledName = "szP"; - break; - case "6.6.5": - mallIndexUIMethodName = "aYS"; - mallIndexUIFiledName = "orA"; - - walletBalanceManagerUIMethodName = "av"; - walletBalanceManagerUIFiledName = "sFT"; - break; - default: - case "6.6.6": - mallIndexUIMethodName = "bbL"; - mallIndexUIFiledName = "oFV"; - - walletBalanceManagerUIMethodName = "aF"; - walletBalanceManagerUIFiledName = "ths"; - break; - } - } - - private void reload() { - money = PropertiesUtils.getValue(Constant.PRO_FILE, "money", "0.00"); - fakeMoney = Boolean.valueOf(PropertiesUtils.getValue(Constant.PRO_FILE, "fake_money", "false")); - } - - public void hook(ClassLoader classLoader) { - try { - Class clazz = XposedHelpers.findClass("com.tencent.mm.plugin.mall.ui.MallIndexUI", classLoader); - if (clazz != null) { - XposedHelpers.findAndHookMethod(clazz, mallIndexUIMethodName, new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - reload(); - if (fakeMoney) { - Object object = param.thisObject; - TextView textView = (TextView) getObjectField(object, mallIndexUIFiledName); - textView.setText("¥" + money); - } - super.afterHookedMethod(param); - } - }); - } - - XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.wallet.balance.ui.WalletBalanceManagerUI", classLoader, - walletBalanceManagerUIMethodName, new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - reload(); - if (fakeMoney) { - Object object = param.thisObject; - TextView textView = (TextView) getObjectField(object, walletBalanceManagerUIFiledName); - textView.setText("¥" + money); - } - super.afterHookedMethod(param); - } - }); - } catch (Error | Exception e) { - e.printStackTrace(); - } - } -} diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/RevokeMsgHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/RevokeMsgHook.java index c2c0b89..564bf22 100644 --- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/RevokeMsgHook.java +++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/RevokeMsgHook.java @@ -3,18 +3,18 @@ import android.annotation.SuppressLint; import android.content.ContentValues; -import com.wuxiaosu.wechathelper.BuildConfig; import com.wuxiaosu.wechathelper.utils.Constant; -import com.wuxiaosu.widget.SettingLabelView; import com.wuxiaosu.widget.utils.PropertiesUtils; import java.io.File; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import de.robv.android.xposed.XC_MethodHook; -import de.robv.android.xposed.XSharedPreferences; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; @@ -25,10 +25,9 @@ public class RevokeMsgHook { private static Map msgCacheMap = new HashMap<>(); - private static Object storageInsertClazz; + private static Object storageInsertObject; - private String insertClassName; - private String insertMethodName; + private static String insertMethodName; private static boolean disableRevoke; private ClassLoader classLoader; @@ -47,12 +46,7 @@ private static class ExdeviceRankHookHolder { } public void init(ClassLoader classLoader, String versionName) { - insertClassName = "com.tencent.mm.storage.av"; - insertMethodName = "b"; - if (versionName.startsWith("6.6.6")) { - insertClassName = "com.tencent.mm.storage.ba"; - insertMethodName = "b"; - } + if (this.classLoader == null) { this.classLoader = classLoader; hook(classLoader); @@ -120,24 +114,54 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable { } try { - // insert method - Class clazz = XposedHelpers.findClass(insertClassName, classLoader); - XposedBridge.hookAllMethods(clazz, insertMethodName, - new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - storageInsertClazz = param.thisObject; - Object msg = param.args[0]; - long msgId = -1; - try { - msgId = XposedHelpers.getLongField(msg, "field_msgId"); - } catch (Throwable e) { - e.printStackTrace(); + Class pluginMessengerFoundationClazz = XposedHelpers.findClass("com.tencent.mm.plugin.messenger.foundation.PluginMessengerFoundation", classLoader); + Field[] fields = pluginMessengerFoundationClazz.getDeclaredFields(); + for (Field field : fields) { + if (field.getType().getName().startsWith("com.tencent.mm.plugin.messenger.foundation")) { + //全凭感觉 下次要改再说 + Field[] fieldsFields = field.getType().getDeclaredFields(); + if (fieldsFields.length == 12) { + for (Field fieldsField : fieldsFields) { + Constructor[] constructors = fieldsField.getType().getConstructors(); + if (constructors.length == 1 && constructors[0].getParameterTypes().length == 3) { + Class insertClass = fieldsField.getType(); + + Method[] methods = insertClass.getDeclaredMethods(); + for (Method method : methods) { + if (method.getParameterTypes().length == 2 + && method.getParameterTypes()[1] == boolean.class + && method.getReturnType() == long.class) { + insertMethodName = method.getName(); + + XposedBridge.hookAllMethods(insertClass, insertMethodName, + new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) throws Throwable { + storageInsertObject = param.thisObject; + if (param.args.length == 2) { + Object msg = param.args[0]; + long msgId = -1; + try { + msgId = XposedHelpers.getLongField(msg, "field_msgId"); + } catch (Throwable e) { + e.printStackTrace(); + } + msgCacheMap.put(msgId, msg); + } + super.afterHookedMethod(param); + } + }); + + break; + } + } + break; } - msgCacheMap.put(msgId, msg); - super.afterHookedMethod(param); } - }); + break; + } + } + } } catch (Error | Exception e) { e.printStackTrace(); } @@ -156,6 +180,6 @@ private static void handleMessageRecall(ContentValues contentValues) { XposedHelpers.setObjectField(msg, "field_content", contentValues.getAsString("content") + "(已被阻止)"); XposedHelpers.setLongField(msg, "field_createTime", createTime + 1L); - XposedHelpers.callMethod(storageInsertClazz, "b", msg, false); + XposedHelpers.callMethod(storageInsertObject, insertMethodName, msg, false); } } diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/UIHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/UIHook.java index 6611893..75fa54b 100644 --- a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/UIHook.java +++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/UIHook.java @@ -1,11 +1,16 @@ package com.wuxiaosu.wechathelper.hook; +import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +import android.text.Editable; +import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; @@ -13,13 +18,22 @@ import com.wuxiaosu.wechathelper.utils.Constant; import com.wuxiaosu.widget.utils.PropertiesUtils; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodReplacement; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; +import static android.content.ContentValues.TAG; + /** * Created by su on 2018/03/16. */ @@ -27,138 +41,80 @@ public class UIHook { private boolean hideDiscover; - private String wClassName; - private String wFieldName; - private HashMap wHashMap = new HashMap(); - - private int[] iconId; private String discoverFragmentName; - private String myFragmentName; - private String adapterClassName; - private String vMethodName; + private String meFragmentName; + + private ClassLoader classLoader; - private String[] switchMethodName; + private UIHook() { + + } - public UIHook(String versionName) { + public void init(ClassLoader classLoader, String versionName) { switch (versionName) { case "6.6.0": - iconId = new int[]{2131165901, 2131165904, 2131165905, 2131165906}; - wClassName = "com.tencent.mm.ui.x"; - wFieldName = "wHJ"; - wHashMap.put("Lcom/tencent/mm/modelsns/e;", 0); - wHashMap.put("Lcom/tencent/mm/modelsns/b;", 1); - wHashMap.put("Lcom/tencent/mm/modelsns/d;", 2); discoverFragmentName = "com.tencent.mm.ui.i"; - myFragmentName = "com.tencent.mm.ui.z"; - adapterClassName = "com.tencent.mm.ui.x$a"; - vMethodName = "ES"; - - switchMethodName = new String[]{"Xa", "Cj"}; - + meFragmentName = "com.tencent.mm.ui.z"; break; case "6.6.1": - iconId = new int[]{2131165910, 2131165913, 2131165914, 2131165915}; - wClassName = "com.tencent.mm.ui.x"; - wFieldName = "wMd"; - wHashMap.put("Lcom/tencent/mm/modelvideo/MMVideoView;", 0); - wHashMap.put("Lcom/tencent/mm/modelvideo/MMVideoView$1;", 1); - wHashMap.put("Lcom/tencent/mm/modelvideo/MMVideoView$a;", 2); discoverFragmentName = "com.tencent.mm.ui.i"; - myFragmentName = "com.tencent.mm.ui.z"; - adapterClassName = "com.tencent.mm.ui.x$a"; - vMethodName = "Fb"; - - switchMethodName = new String[]{"Xl", "Cq"}; + meFragmentName = "com.tencent.mm.ui.z"; break; case "6.6.2": - iconId = new int[]{2131165910, 2131165913, 2131165914, 2131165915}; - wClassName = "com.tencent.mm.ui.w"; - wFieldName = "xKG"; - wHashMap.put("Lcom/google/android/gms/analytics/internal/u$a;", 0); - wHashMap.put("Lcom/google/android/gms/analytics/internal/s;", 1); - wHashMap.put("Lcom/google/android/gms/analytics/internal/t$a;", 2); - discoverFragmentName = "com.tencent.mm.ui.h"; - myFragmentName = "com.tencent.mm.ui.y"; - adapterClassName = "com.tencent.mm.ui.w$a"; - vMethodName = "xe"; - - switchMethodName = new String[]{"Yp", "DW"}; + discoverFragmentName = "com.tencent.mm.ui.i"; + meFragmentName = "com.tencent.mm.ui.z"; break; case "6.6.3": - iconId = new int[]{2131165910, 2131165913, 2131165914, 2131165915}; - wClassName = "com.tencent.mm.ui.w"; - wFieldName = "xKG"; - wHashMap.put("Lcom/google/android/gms/common/j$aa;", 0); - wHashMap.put("Lcom/google/android/gms/common/internal/zzab;", 1); - wHashMap.put("Lcom/google/android/gms/common/j$aa$1;", 2); - discoverFragmentName = "com.tencent.mm.ui.h"; - myFragmentName = "com.tencent.mm.ui.y"; - adapterClassName = "com.tencent.mm.ui.w$a"; - vMethodName = "xe"; - - switchMethodName = new String[]{"Yp", "DW"}; + discoverFragmentName = "com.tencent.mm.ui.i"; + meFragmentName = "com.tencent.mm.ui.z"; break; case "6.6.5": - iconId = new int[]{2131165910, 2131165913, 2131165914, 2131165915}; - wClassName = "com.tencent.mm.ui.w"; - wFieldName = "xTl"; - wHashMap.put("Lcom/google/android/exoplayer2/h/r;", 0); - wHashMap.put("Lcom/google/android/exoplayer2/h/r$c;", 1); - wHashMap.put("Lcom/google/android/exoplayer2/h/r$e;", 2); + discoverFragmentName = "com.tencent.mm.ui.i"; + meFragmentName = "com.tencent.mm.ui.z"; + break; + case "6.6.6": discoverFragmentName = "com.tencent.mm.ui.h"; - myFragmentName = "com.tencent.mm.ui.y"; - adapterClassName = "com.tencent.mm.ui.w$a"; - vMethodName = "xw"; - - switchMethodName = new String[]{"YW", "Ep"}; + meFragmentName = "com.tencent.mm.ui.y"; break; default: - case "6.6.6": - iconId = new int[]{2131165929, 2131165932, 2131165933, 2131165934}; - wClassName = "com.tencent.mm.ui.w"; - wFieldName = "yrA"; - wHashMap.put("Lcom/google/android/exoplayer2/f/e/b;", 0); - wHashMap.put("Lcom/google/android/exoplayer2/f/d/b;", 1); - wHashMap.put("Lcom/google/android/exoplayer2/f/e/a$a;", 2); - + case "6.6.7": discoverFragmentName = "com.tencent.mm.ui.h"; - myFragmentName = "com.tencent.mm.ui.y"; - adapterClassName = "com.tencent.mm.ui.w$a"; - vMethodName = "xz"; - - switchMethodName = new String[]{"ZN", "EB"}; + meFragmentName = "com.tencent.mm.ui.ab"; break; } + if (this.classLoader == null) { + this.classLoader = classLoader; + hook(classLoader); + } + } + + public static UIHook getInstance() { + return UIHook.SingletonHolder.instance; + } + + private static class SingletonHolder { + @SuppressLint("StaticFieldLeak") + private static final UIHook instance = new UIHook(); } - public void hook(final ClassLoader classLoader) { + private void hook(final ClassLoader classLoader) { hideDiscover = Boolean.valueOf(PropertiesUtils.getValue(Constant.PRO_FILE, "hide_discover", "false")); if (!hideDiscover) { return; } + initIconId(classLoader); + initMainTabUI(classLoader); try { - Class clazz = XposedHelpers.findClass(wClassName, classLoader); - XposedHelpers.setStaticObjectField(clazz, wFieldName, wHashMap); - - XposedHelpers.findAndHookMethod(clazz, switchMethodName[0], - String.class, new XC_MethodReplacement() { - @Override - protected Object replaceHookedMethod(MethodHookParam param) { - XposedHelpers.callMethod(param.thisObject, switchMethodName[1], 0); - return null; - } - }); - // replace fragment Class baseBundleClazz = XposedHelpers.findClass("android.os.BaseBundle", classLoader); XposedHelpers.findAndHookMethod(baseBundleClazz, "putInt", String.class, int.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (param.args[0].equals(discoverFragmentName)) { - param.args[0] = myFragmentName; + param.args[0] = meFragmentName; } super.beforeHookedMethod(param); } @@ -169,24 +125,15 @@ Context.class, String.class, Bundle.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (param.args[1].equals(discoverFragmentName)) { - param.args[1] = myFragmentName; + param.args[1] = meFragmentName; } super.beforeHookedMethod(param); } }); - Class adapterClass = XposedHelpers.findClass(adapterClassName, classLoader); - - XposedHelpers.findAndHookMethod(adapterClass, "getCount", new XC_MethodReplacement() { - @Override - protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { - return 3; - } - }); - Class viewPagerClass = XposedHelpers.findClass("com.tencent.mm.ui.mogic.WxViewPager", classLoader); - XposedHelpers.findAndHookMethod(viewPagerClass, vMethodName, int.class, new XC_MethodHook() { + XposedHelpers.findAndHookMethod(viewPagerClass, "setOffscreenPageLimit", int.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { // tab count @@ -220,21 +167,127 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { } catch (Error | Exception e) { XposedBridge.log(e); } + } + + private HashMap tempMap = new HashMap(); + private void initMainTabUI(final ClassLoader classLoader) { try { - Class clazz = XposedHelpers.findClass("com.tencent.mm.ui.TabIconView", classLoader); - XposedHelpers.findAndHookMethod(clazz, "g", - int.class, int.class, int.class, boolean.class, new XC_MethodHook() { - @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { - if ((int) param.args[0] == iconId[0]) { - param.args[0] = iconId[1]; - param.args[1] = iconId[2]; - param.args[2] = iconId[3]; + Class homeUIClazz = XposedHelpers.findClass("com.tencent.mm.ui.HomeUI", classLoader); + Field[] fields = homeUIClazz.getFields(); + for (Field field : fields) { + if (field.getType().getName().startsWith("com.tencent.mm.ui")) { + Class mainTabUIClazz = field.getType(); + + Field[] mainTabUIFields = mainTabUIClazz.getDeclaredFields(); + for (Field mainTabUIField : mainTabUIFields) { + if (mainTabUIField.getType() == HashMap.class && Modifier.isStatic(mainTabUIField.getModifiers())) { + HashMap hashMap = (HashMap) XposedHelpers.getStaticObjectField(mainTabUIClazz, mainTabUIField.getName()); + Object threeKey = null; + for (Object o : hashMap.keySet()) { + if ((int) hashMap.get(o) != 2) { + if ((int) hashMap.get(o) == 3) { + tempMap.put(threeKey, 2); + } else { + tempMap.put(o, hashMap.get(o)); + } + } else { + threeKey = o; + } } - super.beforeHookedMethod(param); + XposedHelpers.setStaticObjectField(mainTabUIClazz, mainTabUIField.getName(), tempMap); + break; } - }); + } + + handleHook(classLoader, mainTabUIClazz); + break; + } + } + } catch (Error | Exception e) { + XposedBridge.log(e); + } + } + + private void handleHook(final ClassLoader classLoader, Class mainTabUIClazz) { + Method[] methods = mainTabUIClazz.getDeclaredMethods(); + for (Method method : methods) { + + if (method.getParameterTypes().length == 1 + && method.getParameterTypes()[0] == String.class + && method.getReturnType() == void.class) { + + XposedHelpers.findAndHookMethod(mainTabUIClazz, method.getName(), + String.class, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + if (!tempMap.containsKey(param.args[0])) { + param.args[0] = tempMap.keySet().toArray()[0]; + } + super.beforeHookedMethod(param); + } + }); + } + } + + Class[] classes = mainTabUIClazz.getDeclaredClasses(); + // adapterClass + XposedHelpers.findAndHookMethod(classes[0], "getCount", new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { + return 3; + } + }); + } + + private boolean isThreeTabIcon = false; + + private void initIconId(final ClassLoader classLoader) { + try { + Class launcherUIBottomTabViewClazz = XposedHelpers.findClass("com.tencent.mm.ui.LauncherUIBottomTabView", classLoader); + + Method[] methods = launcherUIBottomTabViewClazz.getDeclaredMethods(); + for (Method method : methods) { + if (method.getParameterTypes().length == 1 + && method.getParameterTypes()[0] == int.class + && method.getReturnType() != void.class) { + + XposedHelpers.findAndHookMethod(launcherUIBottomTabViewClazz, method.getName(), + int.class, new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) throws Throwable { + isThreeTabIcon = ((int) param.args[0] == 2); + super.afterHookedMethod(param); + } + }); + } + } + Class tabIconViewClazz = XposedHelpers.findClass("com.tencent.mm.ui.TabIconView", classLoader); + + Method[] tabIconViewMethods = tabIconViewClazz.getDeclaredMethods(); + for (Method tabIconViewMethod : tabIconViewMethods) { + if (tabIconViewMethod.getParameterTypes().length == 4 + && tabIconViewMethod.getParameterTypes()[0] == int.class + && tabIconViewMethod.getParameterTypes()[1] == int.class + && tabIconViewMethod.getParameterTypes()[2] == int.class + && tabIconViewMethod.getParameterTypes()[3] == boolean.class) { + + XposedHelpers.findAndHookMethod(tabIconViewClazz, tabIconViewMethod.getName(), + int.class, int.class, int.class, boolean.class, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + if (isThreeTabIcon) { + // 用“发现”页 iconId 递加,算出 “我” 页iconId + param.args[0] = (int) param.args[0] + 3; + param.args[1] = (int) param.args[1] + 3; + param.args[2] = (int) param.args[2] + 3; + } + super.beforeHookedMethod(param); + } + }); + break; + } + } } catch (Error | Exception e) { XposedBridge.log(e); } diff --git a/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/WalletHook.java b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/WalletHook.java new file mode 100644 index 0000000..79cf18e --- /dev/null +++ b/wechathelper/src/main/java/com/wuxiaosu/wechathelper/hook/WalletHook.java @@ -0,0 +1,108 @@ +package com.wuxiaosu.wechathelper.hook; + +import android.annotation.SuppressLint; +import android.text.Editable; +import android.text.TextWatcher; +import android.widget.TextView; + +import com.wuxiaosu.wechathelper.utils.Constant; +import com.wuxiaosu.widget.utils.PropertiesUtils; + +import java.lang.reflect.Field; + +import de.robv.android.xposed.XC_MethodHook; +import de.robv.android.xposed.XposedHelpers; + +import static de.robv.android.xposed.XposedHelpers.getObjectField; + + +/** + * Created by su on 2018/2/05. + * 零钱 hook + */ + +public class WalletHook { + + private static boolean fakeMoney; + private static String money; + + private ClassLoader classLoader; + + private WalletHook() { + + } + + public void init(ClassLoader classLoader, String versionName) { + if (this.classLoader == null) { + this.classLoader = classLoader; + hook(classLoader); + } + } + + public static WalletHook getInstance() { + return WalletHook.SingletonHolder.instance; + } + + private static class SingletonHolder { + @SuppressLint("StaticFieldLeak") + private static final WalletHook instance = new WalletHook(); + } + + private void reload() { + money = PropertiesUtils.getValue(Constant.PRO_FILE, "money", "0.00"); + fakeMoney = Boolean.valueOf(PropertiesUtils.getValue(Constant.PRO_FILE, "fake_money", "false")); + } + + private void hook(final ClassLoader classLoader) { + final Class mallIndexUIClazz = + XposedHelpers.findClass("com.tencent.mm.plugin.mall.ui.MallIndexUI", classLoader); + final Class walletBalanceManagerUIClazz = + XposedHelpers.findClass("com.tencent.mm.plugin.wallet.balance.ui.WalletBalanceManagerUI", classLoader); + + handleHook(mallIndexUIClazz, mallIndexUIClazz.getSuperclass().getDeclaredFields()); + handleHook(walletBalanceManagerUIClazz, walletBalanceManagerUIClazz.getDeclaredFields()); + } + + private void handleHook(Class clazz, final Field[] fields) { + try { + XposedHelpers.findAndHookMethod(clazz, "onResume", new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) throws Throwable { + reload(); + if (fakeMoney) { + Object object = param.thisObject; + for (Field field : fields) { + if (field.getType() == TextView.class) { + final TextView textView = (TextView) getObjectField(object, field.getName()); + if (textView != null) { + textView.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + String string = s.toString(); + if (string.startsWith("¥") && !s.toString().equals("¥" + money)) { + textView.setText("¥" + money); + } + } + }); + } + } + } + } + super.afterHookedMethod(param); + } + }); + } catch (Error | Exception e) { + e.printStackTrace(); + } + } +} diff --git a/wechathelper/src/main/res/drawable-xhdpi/qrcode.png b/wechathelper/src/main/res/drawable-xhdpi/qrcode.png new file mode 100644 index 0000000..205d084 Binary files /dev/null and b/wechathelper/src/main/res/drawable-xhdpi/qrcode.png differ diff --git a/wechathelper/src/main/res/layout/dialog_about_content.xml b/wechathelper/src/main/res/layout/dialog_about_content.xml index 396bea7..1232b8a 100755 --- a/wechathelper/src/main/res/layout/dialog_about_content.xml +++ b/wechathelper/src/main/res/layout/dialog_about_content.xml @@ -1,31 +1,44 @@ - - + android:orientation="vertical"> - - + + + + + - + + +