data = new ArrayList<>();
+ if (resId == emptyId) {
+ return data;
+ }
+ String[] array = context.getResources().getStringArray(resId);
+ if (array.length > 0) {
+ data.addAll(Arrays.asList(array));
+ }
+ return data;
+ }
+
+ /**
+ * 获取Drawable的数组
+ *
+ * @param context context
+ * @param resId 资源id
+ * @return Drawable的数组
+ */
+ public static Drawable[] getDrawableArray(Context context, @ArrayRes int resId) {
+ TypedArray ta = getResources().obtainTypedArray(resId);
+ Drawable[] icons = new Drawable[ta.length()];
+ for (int i = 0; i < ta.length(); i++) {
+ int id = ta.getResourceId(i, 0);
+ if (id != 0) {
+ icons[i] = ContextCompat.getDrawable(context, id);
+ }
+ }
+ ta.recycle();
+ return icons;
+ }
+
+ /**
+ * 获取数字的数组
+ *
+ * @param resId 数组资源id
+ * @return 数字的数组
+ */
+ @Deprecated
+ public static int[] getIntArray(@ArrayRes int resId) {
+ return getResources().getIntArray(resId);
+ }
+
+ /**
+ * 获取数字的数组
+ *
+ * @param context 上下文
+ * @param resId 数组资源id
+ * @return 数字的数组
+ */
+ public static int[] getIntArray(@NonNull Context context, @ArrayRes int resId) {
+ return context.getResources().getIntArray(resId);
+ }
+
+ /**
+ * 获取动画
+ *
+ * @param resId 动画资源id
+ * @return 动画
+ */
+ @Deprecated
+ public static Animation getAnim(@AnimRes int resId) {
+ return AnimationUtils.loadAnimation(App.getApp(), resId);
+ }
+
+ /**
+ * 获取动画
+ *
+ * @param context 上下文
+ * @param resId 动画资源id
+ * @return 动画
+ */
+ public static Animation getAnim(@NonNull Context context, @AnimRes int resId) {
+ return AnimationUtils.loadAnimation(context, resId);
+ }
+
+
+ /**
+ * Check if layout direction is RTL
+ *
+ * @return {@code true} if the layout direction is right-to-left
+ */
+ @Deprecated
+ public static boolean isRtl() {
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 &&
+ getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+ }
+
+
+ /**
+ * Check if layout direction is RTL
+ *
+ * @param context context
+ * @return {@code true} if the layout direction is right-to-left
+ */
+ public static boolean isRtl(@NonNull Context context) {
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 &&
+ context.getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+ }
+
+ /**
+ * Darkens a color by a given factor.
+ *
+ * @param color the color to darken
+ * @param factor The factor to darken the color.
+ * @return darker version of specified color.
+ */
+ public static int darker(int color, float factor) {
+ return Color.argb(Color.alpha(color), Math.max((int) (Color.red(color) * factor), 0),
+ Math.max((int) (Color.green(color) * factor), 0),
+ Math.max((int) (Color.blue(color) * factor), 0));
+ }
+
+ /**
+ * Lightens a color by a given factor.
+ *
+ * @param color The color to lighten
+ * @param factor The factor to lighten the color. 0 will make the color unchanged. 1 will make the
+ * color white.
+ * @return lighter version of the specified color.
+ */
+ public static int lighter(int color, float factor) {
+ int red = (int) ((Color.red(color) * (1 - factor) / 255 + factor) * 255);
+ int green = (int) ((Color.green(color) * (1 - factor) / 255 + factor) * 255);
+ int blue = (int) ((Color.blue(color) * (1 - factor) / 255 + factor) * 255);
+ return Color.argb(Color.alpha(color), red, green, blue);
+ }
+
+}
diff --git a/app/src/main/java/com/project/survey/util/StatusBarUtils.java b/app/src/main/java/com/project/survey/util/StatusBarUtils.java
new file mode 100644
index 0000000..807a173
--- /dev/null
+++ b/app/src/main/java/com/project/survey/util/StatusBarUtils.java
@@ -0,0 +1,734 @@
+package com.project.survey.util;
+
+import static android.os.Build.VERSION_CODES.HONEYCOMB;
+import static android.os.Build.VERSION_CODES.KITKAT;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Build;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.IntDef;
+import androidx.core.view.ViewCompat;
+
+import com.project.survey.widget.util.Utils;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+/**
+ * 状态栏工具
+ *
+ * @author XUE
+ * @since 2019/3/22 10:50
+ */
+public class StatusBarUtils {
+
+ private final static int STATUSBAR_TYPE_DEFAULT = 0;
+ private final static int STATUSBAR_TYPE_MIUI = 1;
+ private final static int STATUSBAR_TYPE_FLYME = 2;
+ private final static int STATUSBAR_TYPE_ANDROID6 = 3; // Android 6.0
+ private final static int STATUS_BAR_DEFAULT_HEIGHT_DP = 25; // 大部分状态栏都是25dp
+ // 在某些机子上存在不同的density值,所以增加两个虚拟值
+ public static float sVirtualDensity = -1;
+ public static float sVirtualDensityDpi = -1;
+ private static int sStatusbarHeight = -1;
+ private static @StatusBarType
+ int mStatusBarType = STATUSBAR_TYPE_DEFAULT;
+ private static Integer sTransparentValue;
+
+ public static void translucent(Activity activity) {
+ translucent(activity.getWindow());
+ }
+
+ public static void translucent(Window window) {
+ translucent(window, 0x40000000);
+ }
+
+ private static boolean supportTranslucent() {
+ return Build.VERSION.SDK_INT >= KITKAT
+ // Essential Phone 在 Android 8 之前沉浸式做得不全,系统不从状态栏顶部开始布局却会下发 WindowInsets
+ && !(DeviceUtils.isEssentialPhone() && Build.VERSION.SDK_INT < 26);
+ }
+
+ private StatusBarUtils() {
+ throw new UnsupportedOperationException("u can't instantiate me...");
+ }
+
+ /**
+ * 设置沉浸式状态栏样式
+ *
+ * @param activity
+ * @param isDark 是否是深色的状态栏
+ */
+ public static void initStatusBarStyle(Activity activity, boolean isDark) {
+ initStatusBarStyle(activity, isDark, Color.TRANSPARENT);
+ }
+
+ /**
+ * 设置沉浸式状态栏样式
+ *
+ * @param activity
+ * @param isDark 是否是深色的状态栏
+ * @param colorOn5x 颜色
+ */
+ public static void initStatusBarStyle(Activity activity, boolean isDark, @ColorInt int colorOn5x) {
+ //设置沉浸式状态栏的颜色
+ translucent(activity, colorOn5x);
+ //修改状态栏的字体颜色
+ if (isDark) {
+ setStatusBarDarkMode(activity);
+ } else {
+ setStatusBarLightMode(activity);
+ }
+ }
+
+ /**
+ * 沉浸式状态栏。
+ * 支持 4.4 以上版本的 MIUI 和 Flyme,以及 5.0 以上版本的其他 Android。
+ *
+ * @param activity 需要被设置沉浸式状态栏的 Activity。
+ */
+ public static void translucent(Activity activity, @ColorInt int colorOn5x) {
+ Window window = activity.getWindow();
+ translucent(window, colorOn5x);
+ }
+
+ @TargetApi(Build.VERSION_CODES.KITKAT)
+ public static void translucent(Window window, @ColorInt int colorOn5x) {
+ if (!supportTranslucent()) {
+ // 版本小于4.4,绝对不考虑沉浸式
+ return;
+ }
+
+ if (isNotchOfficialSupport()) {
+ handleDisplayCutoutMode(window);
+ }
+
+ // 小米和魅族4.4 以上版本支持沉浸式
+ // 小米 Android 6.0 ,开发版 7.7.13 及以后版本设置黑色字体又需要 clear FLAG_TRANSLUCENT_STATUS, 因此还原为官方模式
+ if (DeviceUtils.isMeizu() || (DeviceUtils.isMIUI() && Build.VERSION.SDK_INT < Build.VERSION_CODES.M)) {
+ window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
+ WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+ return;
+ }
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && supportTransclentStatusBar6()) {
+ // android 6以后可以改状态栏字体颜色,因此可以自行设置为透明
+ // ZUK Z1是个另类,自家应用可以实现字体颜色变色,但没开放接口
+ window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+ window.setStatusBarColor(Color.TRANSPARENT);
+ } else {
+ // android 5不能修改状态栏字体颜色,因此直接用FLAG_TRANSLUCENT_STATUS,nexus表现为半透明
+ // 魅族和小米的表现如何?
+ // update: 部分手机运用FLAG_TRANSLUCENT_STATUS时背景不是半透明而是没有背景了。。。。。
+// window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+
+ // 采取setStatusBarColor的方式,部分机型不支持,那就纯黑了,保证状态栏图标可见
+ window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+ window.setStatusBarColor(colorOn5x);
+ }
+// } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+// // android4.4的默认是从上到下黑到透明,我们的背景是白色,很难看,因此只做魅族和小米的
+// } else if(Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1){
+// // 如果app 为白色,需要更改状态栏颜色,因此不能让19一下支持透明状态栏
+// Window window = activity.getWindow();
+// Integer transparentValue = getStatusBarAPITransparentValue(activity);
+// if(transparentValue != null) {
+// window.getDecorView().setSystemUiVisibility(transparentValue);
+// }
+ }
+ }
+
+ public static boolean isNotchOfficialSupport() {
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P;
+ }
+
+ @TargetApi(Build.VERSION_CODES.P)
+ private static void handleDisplayCutoutMode(final Window window) {
+ View decorView = window.getDecorView();
+ if (decorView != null) {
+ if (ViewCompat.isAttachedToWindow(decorView)) {
+ realHandleDisplayCutoutMode(window, decorView);
+ } else {
+ decorView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
+ @Override
+ public void onViewAttachedToWindow(View v) {
+ v.removeOnAttachStateChangeListener(this);
+ realHandleDisplayCutoutMode(window, v);
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(View v) {
+
+ }
+ });
+ }
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.P)
+ private static void realHandleDisplayCutoutMode(Window window, View decorView) {
+ if (decorView.getRootWindowInsets() != null &&
+ decorView.getRootWindowInsets().getDisplayCutout() != null) {
+ WindowManager.LayoutParams params = window.getAttributes();
+ params.layoutInDisplayCutoutMode = WindowManager.LayoutParams
+ .LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
+ window.setAttributes(params);
+ }
+ }
+
+ /**
+ * 设置状态栏黑色字体图标,
+ * 支持 4.4 以上版本 MIUI 和 Flyme,以及 6.0 以上版本的其他 Android
+ *
+ * @param activity 需要被处理的 Activity
+ */
+ public static boolean setStatusBarLightMode(Activity activity) {
+ if (activity == null) {
+ return false;
+ }
+ // 无语系列:ZTK C2016只能时间和电池图标变色。。。。
+ if (DeviceUtils.isZTKC2016()) {
+ return false;
+ }
+
+ if (mStatusBarType != STATUSBAR_TYPE_DEFAULT) {
+ return setStatusBarLightMode(activity, mStatusBarType);
+ }
+ if (Build.VERSION.SDK_INT >= KITKAT) {
+ if (isMIUICustomStatusBarLightModeImpl() && MIUISetStatusBarLightMode(activity.getWindow(), true)) {
+ mStatusBarType = STATUSBAR_TYPE_MIUI;
+ return true;
+ } else if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) {
+ mStatusBarType = STATUSBAR_TYPE_FLYME;
+ return true;
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ Android6SetStatusBarLightMode(activity.getWindow(), true);
+ mStatusBarType = STATUSBAR_TYPE_ANDROID6;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 已知系统类型时,设置状态栏黑色字体图标。
+ * 支持 4.4 以上版本 MIUI 和 Flyme,以及 6.0 以上版本的其他 Android
+ *
+ * @param activity 需要被处理的 Activity
+ * @param type StatusBar 类型,对应不同的系统
+ */
+ private static boolean setStatusBarLightMode(Activity activity, @StatusBarType int type) {
+ if (type == STATUSBAR_TYPE_MIUI) {
+ return MIUISetStatusBarLightMode(activity.getWindow(), true);
+ } else if (type == STATUSBAR_TYPE_FLYME) {
+ return FlymeSetStatusBarLightMode(activity.getWindow(), true);
+ } else if (type == STATUSBAR_TYPE_ANDROID6) {
+ return Android6SetStatusBarLightMode(activity.getWindow(), true);
+ }
+ return false;
+ }
+
+
+ /**
+ * 设置状态栏白色字体图标
+ * 支持 4.4 以上版本 MIUI 和 Flyme,以及 6.0 以上版本的其他 Android
+ */
+ public static boolean setStatusBarDarkMode(Activity activity) {
+ if (activity == null) {
+ return false;
+ }
+ if (mStatusBarType == STATUSBAR_TYPE_DEFAULT) {
+ // 默认状态,不需要处理
+ return true;
+ }
+
+ if (mStatusBarType == STATUSBAR_TYPE_MIUI) {
+ return MIUISetStatusBarLightMode(activity.getWindow(), false);
+ } else if (mStatusBarType == STATUSBAR_TYPE_FLYME) {
+ return FlymeSetStatusBarLightMode(activity.getWindow(), false);
+ } else if (mStatusBarType == STATUSBAR_TYPE_ANDROID6) {
+ return Android6SetStatusBarLightMode(activity.getWindow(), false);
+ }
+ return true;
+ }
+
+ @TargetApi(Build.VERSION_CODES.M)
+ private static int changeStatusBarModeRetainFlag(Window window, int out) {
+ out = retainSystemUiFlag(window, out, View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+ out = retainSystemUiFlag(window, out, View.SYSTEM_UI_FLAG_FULLSCREEN);
+ out = retainSystemUiFlag(window, out, View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
+ out = retainSystemUiFlag(window, out, View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+ out = retainSystemUiFlag(window, out, View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+ out = retainSystemUiFlag(window, out, View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
+ return out;
+ }
+
+ public static int retainSystemUiFlag(Window window, int out, int type) {
+ int now = window.getDecorView().getSystemUiVisibility();
+ if ((now & type) == type) {
+ out |= type;
+ }
+ return out;
+ }
+
+
+ /**
+ * 设置状态栏字体图标为深色,Android 6
+ *
+ * @param window 需要设置的窗口
+ * @param light 是否把状态栏字体及图标颜色设置为深色
+ * @return boolean 成功执行返回true
+ */
+ @TargetApi(Build.VERSION_CODES.M)
+ private static boolean Android6SetStatusBarLightMode(Window window, boolean light) {
+ View decorView = window.getDecorView();
+ int systemUi = light ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
+ systemUi = changeStatusBarModeRetainFlag(window, systemUi);
+ decorView.setSystemUiVisibility(systemUi);
+ if (DeviceUtils.isMIUIV9()) {
+ // MIUI 9 低于 6.0 版本依旧只能回退到以前的方案
+ // https://github.com/Tencent/QMUI_Android/issues/160
+ MIUISetStatusBarLightMode(window, light);
+ }
+ return true;
+ }
+
+ /**
+ * 设置状态栏字体图标为深色,需要 MIUIV6 以上
+ *
+ * @param window 需要设置的窗口
+ * @param light 是否把状态栏字体及图标颜色设置为深色
+ * @return boolean 成功执行返回 true
+ */
+ @SuppressWarnings("unchecked")
+ public static boolean MIUISetStatusBarLightMode(Window window, boolean light) {
+ boolean result = false;
+ if (window != null) {
+ Class clazz = window.getClass();
+ try {
+ int darkModeFlag;
+ Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
+ Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
+ darkModeFlag = field.getInt(layoutParams);
+ Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
+ if (light) {
+ extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体
+ } else {
+ extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体
+ }
+ result = true;
+ } catch (Exception ignored) {
+
+ }
+ }
+ return result;
+ }
+
+ /**
+ * 更改状态栏图标、文字颜色的方案是否是MIUI自家的, MIUI9 && Android 6 之后用回Android原生实现
+ * 见小米开发文档说明:https://dev.mi.com/console/doc/detail?pId=1159
+ */
+ private static boolean isMIUICustomStatusBarLightModeImpl() {
+ if (DeviceUtils.isMIUIV9() && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+ return true;
+ }
+ return DeviceUtils.isMIUIV5() || DeviceUtils.isMIUIV6() ||
+ DeviceUtils.isMIUIV7() || DeviceUtils.isMIUIV8();
+ }
+
+ /**
+ * 设置状态栏图标为深色和魅族特定的文字风格
+ * 可以用来判断是否为 Flyme 用户
+ *
+ * @param window 需要设置的窗口
+ * @param light 是否把状态栏字体及图标颜色设置为深色
+ * @return boolean 成功执行返回true
+ */
+ public static boolean FlymeSetStatusBarLightMode(Window window, boolean light) {
+ boolean result = false;
+ if (window != null) {
+ // flyme 在 6.2.0.0A 支持了 Android 官方的实现方案,旧的方案失效
+ Android6SetStatusBarLightMode(window, light);
+
+ try {
+ WindowManager.LayoutParams lp = window.getAttributes();
+ Field darkFlag = WindowManager.LayoutParams.class
+ .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
+ Field meizuFlags = WindowManager.LayoutParams.class
+ .getDeclaredField("meizuFlags");
+ darkFlag.setAccessible(true);
+ meizuFlags.setAccessible(true);
+ int bit = darkFlag.getInt(null);
+ int value = meizuFlags.getInt(lp);
+ if (light) {
+ value |= bit;
+ } else {
+ value &= ~bit;
+ }
+ meizuFlags.setInt(lp, value);
+ window.setAttributes(lp);
+ result = true;
+ } catch (Exception ignored) {
+
+ }
+ }
+ return result;
+ }
+
+ /**
+ * 获取是否全屏
+ *
+ * @return 是否全屏
+ */
+ public static boolean isFullScreen(Activity activity) {
+ boolean ret = false;
+ try {
+ WindowManager.LayoutParams attrs = activity.getWindow().getAttributes();
+ ret = (attrs.flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return ret;
+ }
+
+ /**
+ * API19之前透明状态栏:获取设置透明状态栏的system ui visibility的值,这是部分有提供接口的rom使用的
+ * http://stackoverflow.com/questions/21865621/transparent-status-bar-before-4-4-kitkat
+ */
+ public static Integer getStatusBarAPITransparentValue(Context context) {
+ if (sTransparentValue != null) {
+ return sTransparentValue;
+ }
+ String[] systemSharedLibraryNames = context.getPackageManager()
+ .getSystemSharedLibraryNames();
+ String fieldName = null;
+ for (String lib : systemSharedLibraryNames) {
+ if ("touchwiz".equals(lib)) {
+ fieldName = "SYSTEM_UI_FLAG_TRANSPARENT_BACKGROUND";
+ } else if (lib.startsWith("com.sonyericsson.navigationbar")) {
+ fieldName = "SYSTEM_UI_FLAG_TRANSPARENT";
+ }
+ }
+
+ if (fieldName != null) {
+ try {
+ Field field = View.class.getField(fieldName);
+ if (field != null) {
+ Class> type = field.getType();
+ if (type == int.class) {
+ sTransparentValue = field.getInt(null);
+ }
+ }
+ } catch (Exception ignored) {
+ }
+ }
+ return sTransparentValue;
+ }
+
+ /**
+ * 检测 Android 6.0 是否可以启用 window.setStatusBarColor(Color.TRANSPARENT)。
+ */
+ public static boolean supportTransclentStatusBar6() {
+ return !(DeviceUtils.isZUKZ1() || DeviceUtils.isZTKC2016());
+ }
+
+ /**
+ * 获取状态栏的高度。
+ *
+ * @param context 上下文
+ * @return 状态栏高度
+ */
+ public static int getStatusBarHeight(Context context) {
+ if (sStatusbarHeight == -1) {
+ sStatusbarHeight = Utils.getStatusBarHeight(context);
+ }
+ return sStatusbarHeight;
+ }
+
+ public static void setVirtualDensity(float density) {
+ sVirtualDensity = density;
+ }
+
+ public static void setVirtualDensityDpi(float densityDpi) {
+ sVirtualDensityDpi = densityDpi;
+ }
+
+ @IntDef({STATUSBAR_TYPE_DEFAULT, STATUSBAR_TYPE_MIUI, STATUSBAR_TYPE_FLYME, STATUSBAR_TYPE_ANDROID6})
+ @Retention(RetentionPolicy.SOURCE)
+ private @interface StatusBarType {
+ }
+
+
+ /**
+ * 全屏
+ *
+ * @param activity 窗口
+ */
+ public static void fullScreen(Activity activity) {
+ if (activity == null) {
+ return;
+ }
+ fullScreen(activity.getWindow());
+ }
+
+ /**
+ * 全屏
+ *
+ * @param window 窗口
+ */
+ public static void fullScreen(Window window) {
+ if (window == null) {
+ return;
+ }
+ if (Build.VERSION.SDK_INT > HONEYCOMB && Build.VERSION.SDK_INT < KITKAT) { // lower api
+ window.getDecorView().setSystemUiVisibility(View.GONE);
+ } else if (Build.VERSION.SDK_INT >= KITKAT) {
+ window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
+ | View.SYSTEM_UI_FLAG_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+ | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
+ }
+ }
+
+ /**
+ * 取消全屏
+ *
+ * @param activity 窗口
+ * @param statusBarColor 状态栏的颜色
+ * @param navigationBarColor 导航栏的颜色
+ */
+ public static void cancelFullScreen(Activity activity, @ColorInt int statusBarColor, @ColorInt int navigationBarColor) {
+ if (activity == null) {
+ return;
+ }
+ cancelFullScreen(activity.getWindow(), statusBarColor, navigationBarColor);
+ }
+
+ /**
+ * 取消全屏
+ *
+ * @param window 窗口
+ * @param statusBarColor 状态栏的颜色
+ * @param navigationBarColor 导航栏的颜色
+ */
+ public static void cancelFullScreen(Window window, @ColorInt int statusBarColor, @ColorInt int navigationBarColor) {
+ if (window == null) {
+ return;
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
+ | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+ window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+ if (statusBarColor != -1) {
+ window.setStatusBarColor(statusBarColor);
+ }
+ if (navigationBarColor != -1) {
+ window.setNavigationBarColor(navigationBarColor);
+ }
+ }
+ }
+
+ /**
+ * 取消全屏
+ *
+ * @param activity 窗口
+ */
+ public static void cancelFullScreen(Activity activity) {
+ if (activity == null) {
+ return;
+ }
+ cancelFullScreen(activity.getWindow());
+ }
+
+ /**
+ * 取消全屏
+ *
+ * @param window 窗口
+ */
+ public static void cancelFullScreen(Window window) {
+ cancelFullScreen(window, -1, -1);
+ }
+
+ /**
+ * 设置底部导航条的颜色
+ *
+ * @param activity 窗口
+ * @param color 颜色
+ */
+ public static void setNavigationBarColor(Activity activity, int color) {
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
+ //5.0以上可以直接设置 navigation颜色
+ activity.getWindow().setNavigationBarColor(color);
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+ ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
+ View navigationBar = new View(activity);
+ FrameLayout.LayoutParams params;
+ params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getNavigationBarHeight(activity));
+ params.gravity = Gravity.BOTTOM;
+ navigationBar.setLayoutParams(params);
+ navigationBar.setBackgroundColor(color);
+ decorView.addView(navigationBar);
+ } else {
+ //4.4以下无法设置NavigationBar颜色
+ }
+
+ }
+
+ /**
+ * 获取底部导航条的高度
+ *
+ * @param context 上下文
+ * @return 底部导航条的高度
+ */
+ public static int getNavigationBarHeight(Context context) {
+ int height = 0;
+ int id = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
+ if (id > 0) {
+ height = context.getResources().getDimensionPixelSize(id);
+ }
+ return height;
+ }
+
+ /**
+ * 底部导航条是否显示
+ *
+ * @param activity 窗口
+ * @return 底部导航条是否显示
+ */
+ public static boolean isNavigationBarExist(Activity activity) {
+ return DensityUtils.isNavigationBarExist(activity);
+ }
+
+ /**
+ * 全屏下显示弹窗
+ *
+ * @param dialog 弹窗
+ */
+ public static void showDialogInFullScreen(final Dialog dialog) {
+ if (dialog == null) {
+ return;
+ }
+ showWindowInFullScreen(dialog.getWindow(), new IWindowShower() {
+ @Override
+ public void show(Window window) {
+ dialog.show();
+ }
+ });
+ }
+
+ /**
+ * 全屏下显示窗口【包括dialog等】
+ *
+ * @param window 窗口
+ * @param iWindowShower 窗口显示接口
+ */
+ public static void showWindowInFullScreen(Window window, IWindowShower iWindowShower) {
+ if (window == null || iWindowShower == null) {
+ return;
+ }
+ window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
+ iWindowShower.show(window);
+ StatusBarUtils.fullScreen(window);
+ window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
+ }
+
+ /**
+ * 显示窗口【同步窗口系统view的可见度, 解决全屏下显示窗口导致界面退出全屏的问题】
+ *
+ * @param activity 活动窗口
+ * @param dialog 需要显示的窗口
+ */
+ public static void showDialog(Activity activity, final Dialog dialog) {
+ if (dialog == null) {
+ return;
+ }
+ showWindow(activity, dialog.getWindow(), new IWindowShower() {
+ @Override
+ public void show(Window window) {
+ dialog.show();
+ }
+ });
+ }
+
+ /**
+ * 显示窗口【同步窗口系统view的可见度, 解决全屏下显示窗口导致界面退出全屏的问题】
+ *
+ * @param activity 活动窗口
+ * @param window 需要显示的窗口
+ * @param iWindowShower 窗口显示接口
+ * @return 是否执行成功
+ */
+ public static boolean showWindow(Activity activity, Window window, IWindowShower iWindowShower) {
+ if (activity == null || window == null || iWindowShower == null) {
+ return false;
+ }
+ window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
+ iWindowShower.show(window);
+ StatusBarUtils.syncSystemUiVisibility(activity, window);
+ window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
+ return true;
+ }
+
+ /**
+ * 同步窗口的系统view的可见度【解决全屏下显示窗口导致界面退出全屏的问题】
+ *
+ * @param original 活动窗口
+ * @param target 目标窗口
+ * @return 是否执行成功
+ */
+ public static boolean syncSystemUiVisibility(Activity original, Window target) {
+ if (original == null) {
+ return false;
+ }
+ return syncSystemUiVisibility(original.getWindow(), target);
+ }
+
+ /**
+ * 同步两个窗口的系统view的可见度【解决全屏下显示窗口导致界面退出全屏的问题】
+ *
+ * @param original 原始窗口
+ * @param target 目标窗口
+ * @return 是否执行成功
+ */
+ public static boolean syncSystemUiVisibility(Window original, Window target) {
+ if (original == null || target == null) {
+ return false;
+ }
+ target.getDecorView().setSystemUiVisibility(original.getDecorView().getSystemUiVisibility());
+ return true;
+ }
+
+ /**
+ * 窗口显示接口
+ */
+ public interface IWindowShower {
+ /**
+ * 显示窗口
+ *
+ * @param window 窗口
+ */
+ void show(Window window);
+ }
+
+}
diff --git a/app/src/main/java/com/project/survey/util/ThemeUtils.java b/app/src/main/java/com/project/survey/util/ThemeUtils.java
new file mode 100644
index 0000000..add43fe
--- /dev/null
+++ b/app/src/main/java/com/project/survey/util/ThemeUtils.java
@@ -0,0 +1,414 @@
+package com.project.survey.util;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.text.TextUtils;
+import android.util.TypedValue;
+import android.view.View;
+
+import androidx.annotation.ArrayRes;
+import androidx.annotation.AttrRes;
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatDelegate;
+import androidx.appcompat.content.res.AppCompatResources;
+import androidx.core.content.ContextCompat;
+
+
+import com.project.survey.R;
+import com.project.survey.widget.edittext.GravityEnum;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * 主题工具
+ *
+ * @author xuexiang
+ * @since 2018/11/14 下午1:46
+ */
+public final class ThemeUtils {
+
+ private ThemeUtils() {
+ throw new UnsupportedOperationException("u can't instantiate me...");
+ }
+
+ @ColorInt
+ public static int getDisabledColor(Context context) {
+ final int primaryColor = resolveColor(context, android.R.attr.textColorPrimary);
+ final int disabledColor = isColorDark(primaryColor) ? Color.BLACK : Color.WHITE;
+ return adjustAlpha(disabledColor, 0.3f);
+ }
+
+ @ColorInt
+ public static int adjustAlpha(
+ @ColorInt int color, @SuppressWarnings("SameParameterValue") float factor) {
+ int alpha = Math.round(Color.alpha(color) * factor);
+ int red = Color.red(color);
+ int green = Color.green(color);
+ int blue = Color.blue(color);
+ return Color.argb(alpha, red, green, blue);
+ }
+
+ @ColorInt
+ public static int resolveColor(Context context, @AttrRes int attr) {
+ return resolveColor(context, attr, 0);
+ }
+
+ @ColorInt
+ public static int resolveColor(Context context, @AttrRes int attr, int fallback) {
+ TypedArray a = context.getTheme().obtainStyledAttributes(new int[]{attr});
+ try {
+ return a.getColor(0, fallback);
+ } finally {
+ a.recycle();
+ }
+ }
+
+ public static int getColorFromAttrRes(int attrRes, int defaultValue, Context context) {
+ TypedArray a = context.obtainStyledAttributes(new int[]{attrRes});
+ try {
+ return a.getColor(0, defaultValue);
+ } finally {
+ a.recycle();
+ }
+ }
+
+ public static float resolveFloat(Context context, int attrRes) {
+ TypedValue typedValue = new TypedValue();
+ context.getTheme().resolveAttribute(attrRes, typedValue, true);
+ return typedValue.getFloat();
+ }
+
+ public static int resolveInt(Context context, int attrRes) {
+ return resolveInt(context, attrRes, 0);
+ }
+
+ public static int resolveInt(Context context, int attrRes, int defaultValue) {
+ TypedArray a = context.obtainStyledAttributes(new int[]{attrRes});
+ try {
+ return a.getInt(0, defaultValue);
+ } finally {
+ a.recycle();
+ }
+ }
+
+ public static float resolveFloat(Context context, int attrRes, float defaultValue) {
+ TypedArray a = context.obtainStyledAttributes(new int[]{attrRes});
+ try {
+ return a.getFloat(0, defaultValue);
+ } finally {
+ a.recycle();
+ }
+ }
+
+ // Try to resolve the colorAttr attribute.
+ public static ColorStateList resolveActionTextColorStateList(
+ Context context, @AttrRes int colorAttr, ColorStateList fallback) {
+ TypedArray a = context.getTheme().obtainStyledAttributes(new int[]{colorAttr});
+ try {
+ final TypedValue value = a.peekValue(0);
+ if (value == null) {
+ return fallback;
+ }
+ if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT
+ && value.type <= TypedValue.TYPE_LAST_COLOR_INT) {
+ return getActionTextStateList(context, value.data);
+ } else {
+ final ColorStateList stateList = a.getColorStateList(0);
+ if (stateList != null) {
+ return stateList;
+ } else {
+ return fallback;
+ }
+ }
+ } finally {
+ a.recycle();
+ }
+ }
+
+ // Get the specified color resource, creating a ColorStateList if the resource
+ // points to a color value.
+ public static ColorStateList getActionTextColorStateList(Context context, @ColorRes int colorId) {
+ final TypedValue value = new TypedValue();
+ context.getResources().getValue(colorId, value, true);
+ if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT
+ && value.type <= TypedValue.TYPE_LAST_COLOR_INT) {
+ return getActionTextStateList(context, value.data);
+ } else {
+
+ if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
+ //noinspection deprecation
+ return context.getResources().getColorStateList(colorId);
+ } else {
+ return context.getColorStateList(colorId);
+ }
+ }
+ }
+
+ /**
+ * Returns a color associated with a particular resource ID
+ *
+ * Starting in {@link Build.VERSION_CODES#M}, the returned color will be styled for
+ * the specified Context's theme.
+ *
+ * @param colorId The desired resource identifier, as generated by the aapt tool. This integer
+ * encodes the package, type, and resource entry. The value 0 is an invalid identifier.
+ * @return A single color value in the form 0xAARRGGBB.
+ */
+ @ColorInt
+ public static int getColor(Context context, @ColorRes int colorId) {
+ return ContextCompat.getColor(context, colorId);
+ }
+
+ public static String resolveString(Context context, @AttrRes int attr) {
+ TypedValue v = new TypedValue();
+ context.getTheme().resolveAttribute(attr, v, true);
+ return (String) v.string;
+ }
+
+ public static String resolveString(Context context, @AttrRes int attr, String defaultValue) {
+ TypedValue v = new TypedValue();
+ context.getTheme().resolveAttribute(attr, v, true);
+ String value = (String) v.string;
+ return TextUtils.isEmpty(value) ? defaultValue : value;
+ }
+
+ public static String resolveString(Resources.Theme theme, @AttrRes int attr) {
+ TypedValue v = new TypedValue();
+ theme.resolveAttribute(attr, v, true);
+ return (String) v.string;
+ }
+
+
+ public static Drawable resolveDrawable(Context context, @AttrRes int attr) {
+ return resolveDrawable(context, attr, null);
+ }
+
+ public static Drawable resolveDrawable(
+ Context context,
+ @AttrRes int attr,
+ @SuppressWarnings("SameParameterValue") Drawable fallback) {
+ TypedArray array = context.getTheme().obtainStyledAttributes(new int[]{attr});
+ try {
+ Drawable drawable = null;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ drawable = array.getDrawable(0);
+ } else {
+ int id = array.getResourceId(0, -1);
+ if (id != -1) {
+ drawable = AppCompatResources.getDrawable(context, id);
+ }
+ }
+ if (drawable == null && fallback != null) {
+ drawable = fallback;
+ }
+ return drawable;
+ } finally {
+ array.recycle();
+ }
+ }
+
+ public static int resolveDimension(Context context, @AttrRes int attr) {
+ return resolveDimension(context, attr, -1);
+ }
+
+ public static int resolveDimension(Context context, @AttrRes int attr, int fallback) {
+ TypedArray a = context.getTheme().obtainStyledAttributes(new int[]{attr});
+ try {
+ return a.getDimensionPixelSize(0, fallback);
+ } finally {
+ a.recycle();
+ }
+ }
+
+ public static boolean resolveBoolean(Context context, @AttrRes int attr, boolean fallback) {
+ TypedArray a = context.getTheme().obtainStyledAttributes(new int[]{attr});
+ try {
+ return a.getBoolean(0, fallback);
+ } finally {
+ a.recycle();
+ }
+ }
+
+ public static boolean resolveBoolean(Context context, @AttrRes int attr) {
+ return resolveBoolean(context, attr, false);
+ }
+
+ public static boolean isColorDark(@ColorInt int color) {
+ double darkness =
+ 1
+ - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color))
+ / 255;
+ return darkness >= 0.5;
+ }
+
+ public static void setBackgroundCompat(View view, Drawable d) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
+ //noinspection deprecation
+ view.setBackgroundDrawable(d);
+ } else {
+ view.setBackground(d);
+ }
+ }
+
+
+ public static ColorStateList getActionTextStateList(Context context, int newPrimaryColor) {
+ final int fallBackButtonColor =
+ ThemeUtils.resolveColor(context, android.R.attr.textColorPrimary);
+ if (newPrimaryColor == 0) {
+ newPrimaryColor = fallBackButtonColor;
+ }
+ int[][] states =
+ new int[][]{
+ new int[]{-android.R.attr.state_enabled}, // disabled
+ new int[]{} // enabled
+ };
+ int[] colors = new int[]{ThemeUtils.adjustAlpha(newPrimaryColor, 0.4f), newPrimaryColor};
+ return new ColorStateList(states, colors);
+ }
+
+ public static int[] getColorArray(@NonNull Context context, @ArrayRes int array) {
+ if (array == 0) {
+ return null;
+ }
+ TypedArray ta = context.getResources().obtainTypedArray(array);
+ int[] colors = new int[ta.length()];
+ for (int i = 0; i < ta.length(); i++) {
+ colors[i] = ta.getColor(i, 0);
+ }
+ ta.recycle();
+ return colors;
+ }
+
+ public static boolean isIn(@NonNull T find, @Nullable T[] ary) {
+ if (ary == null || ary.length == 0) {
+ return false;
+ }
+ for (T item : ary) {
+ if (item.equals(find)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 获取主题色
+ *
+ * @param context 上下文
+ * @return 主题色
+ */
+ @ColorInt
+ public static int getMainThemeColor(Context context) {
+ return resolveColor(context, R.attr.colorPrimary, getColor(context, R.color.colorPrimary));
+ }
+
+ //========================深色模式==============================//
+ /**
+ * 系统默认模式
+ */
+ public static final int DEFAULT_MODE = 0;
+ /**
+ * 浅色模式
+ */
+ public static final int LIGHT_MODE = 1;
+ /**
+ * 深色模式
+ */
+ public static final int DARK_MODE = 2;
+
+ @IntDef({DEFAULT_MODE, LIGHT_MODE, DARK_MODE})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Theme {
+ }
+
+ /**
+ * 当前是否是处于深色模式
+ *
+ * @return 是否是深色模式
+ */
+ @Deprecated
+ public static boolean isNightMode() {
+ int mode = ResUtils.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
+ return mode == Configuration.UI_MODE_NIGHT_YES;
+ }
+
+ /**
+ * 当前是否是处于深色模式
+ *
+ * @param context 上下文
+ * @return 是否是深色模式
+ */
+ public static boolean isNightMode(@NonNull Context context) {
+ int mode = ResUtils.getResources(context).getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
+ return mode == Configuration.UI_MODE_NIGHT_YES;
+ }
+
+ /**
+ * 设置应用的主题(深色模式)
+ *
+ * @param theme 主题类型
+ */
+ @SuppressLint("WrongConstant")
+ public static void applyTheme(@Theme int theme) {
+ switch (theme) {
+ case LIGHT_MODE:
+ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
+ break;
+ case DARK_MODE:
+ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
+ break;
+ case DEFAULT_MODE:
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
+ } else {
+ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ //=================//
+
+ private static int gravityEnumToAttrInt(GravityEnum value) {
+ switch (value) {
+ case CENTER:
+ return 1;
+ case END:
+ return 2;
+ default:
+ return 0;
+ }
+ }
+
+ public static GravityEnum resolveGravityEnum(
+ Context context, @AttrRes int attr, GravityEnum defaultGravity) {
+ TypedArray a = context.getTheme().obtainStyledAttributes(new int[]{attr});
+ try {
+ switch (a.getInt(0, gravityEnumToAttrInt(defaultGravity))) {
+ case 1:
+ return GravityEnum.CENTER;
+ case 2:
+ return GravityEnum.END;
+ default:
+ return GravityEnum.START;
+ }
+ } finally {
+ a.recycle();
+ }
+ }
+
+}
diff --git a/app/src/main/java/com/project/survey/widget/XUI.java b/app/src/main/java/com/project/survey/widget/XUI.java
new file mode 100644
index 0000000..a60dab8
--- /dev/null
+++ b/app/src/main/java/com/project/survey/widget/XUI.java
@@ -0,0 +1,114 @@
+package com.project.survey.widget;
+
+
+import android.app.Activity;
+import android.app.Application;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.graphics.Typeface;
+import android.text.TextUtils;
+import android.view.View;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.Nullable;
+
+import com.project.survey.R;
+
+import io.github.inflationx.calligraphy3.CalligraphyConfig;
+import io.github.inflationx.calligraphy3.CalligraphyInterceptor;
+import io.github.inflationx.calligraphy3.TypefaceUtils;
+import io.github.inflationx.viewpump.ViewPump;
+
+/**
+ * UI全局设置
+ *
+ * @author xuexiang
+ * @since 2018/11/14 上午11:40
+ */
+public class XUI {
+
+ private static Application sContext;
+
+ private static boolean sIsTabletChecked;
+
+ private static int sScreenType;
+
+ private static String sDefaultFontAssetPath;
+
+ //=======================初始化设置===========================//
+
+ /**
+ * 初始化
+ *
+ * @param context 上下文
+ */
+ public static void init(Application context) {
+ sContext = context;
+ }
+
+ /**
+ * 设置默认字体
+ */
+ public static void initFontStyle(String defaultFontAssetPath) {
+ if (!TextUtils.isEmpty(defaultFontAssetPath)) {
+ sDefaultFontAssetPath = defaultFontAssetPath;
+ ViewPump.init(ViewPump.builder()
+ .addInterceptor(new CalligraphyInterceptor(
+ new CalligraphyConfig.Builder()
+ .setDefaultFontPath(defaultFontAssetPath)
+ .setFontAttrId(R.attr.fontPath)
+ .build()))
+ .build());
+ }
+ }
+
+ public static Context getContext() {
+ testInitialize();
+ return sContext;
+ }
+
+ private static void testInitialize() {
+ if (sContext == null) {
+ throw new ExceptionInInitializerError("请先在全局Application中调用 XUI.init() 初始化!");
+ }
+ }
+
+ //=======================日志调试===========================//
+
+
+ //=======================字体===========================//
+ /**
+ * @return 获取默认字体
+ */
+ @Nullable
+ public static Typeface getDefaultTypeface() {
+ if (!TextUtils.isEmpty(sDefaultFontAssetPath)) {
+ return TypefaceUtils.load(getContext().getAssets(), sDefaultFontAssetPath);
+ }
+ return null;
+ }
+
+ /**
+ * @return 默认字体的存储位置
+ */
+ public static String getDefaultFontAssetPath() {
+ return sDefaultFontAssetPath;
+ }
+
+ /**
+ * @param fontPath 字体路径
+ * @return 获取默认字体
+ */
+ @Nullable
+ public static Typeface getDefaultTypeface(String fontPath) {
+ if (TextUtils.isEmpty(fontPath)) {
+ fontPath = sDefaultFontAssetPath;
+ }
+ if (!TextUtils.isEmpty(fontPath)) {
+ return TypefaceUtils.load(getContext().getAssets(), fontPath);
+ }
+ return null;
+ }
+
+
+}
diff --git a/app/src/main/java/com/project/survey/widget/edittext/AsteriskPasswordTransformationMethod.java b/app/src/main/java/com/project/survey/widget/edittext/AsteriskPasswordTransformationMethod.java
new file mode 100644
index 0000000..99c5daa
--- /dev/null
+++ b/app/src/main/java/com/project/survey/widget/edittext/AsteriskPasswordTransformationMethod.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.project.survey.widget.edittext;
+
+import android.text.method.PasswordTransformationMethod;
+import android.view.View;
+
+/**
+ * ‘****’号密码输入样式
+ *
+ * @author xuexiang
+ * @since 2019-07-05 9:34
+ */
+public class AsteriskPasswordTransformationMethod extends PasswordTransformationMethod {
+
+ private static AsteriskPasswordTransformationMethod sInstance;
+
+ public static PasswordTransformationMethod getInstance() {
+ if (sInstance != null) {
+ return sInstance;
+ }
+ sInstance = new AsteriskPasswordTransformationMethod();
+ return sInstance;
+ }
+
+ @Override
+ public CharSequence getTransformation(CharSequence source, View view) {
+ return new AsteriskPasswordCharSequence(source);
+ }
+
+ private static class AsteriskPasswordCharSequence implements CharSequence {
+ private CharSequence mSource;
+
+ AsteriskPasswordCharSequence(CharSequence source) {
+ mSource = source; // Store char sequence
+ }
+
+ @Override
+ public char charAt(int index) {
+ return '*'; // This is the important part
+ }
+
+ @Override
+ public int length() {
+ return mSource.length(); // Return default
+ }
+
+ @Override
+ public CharSequence subSequence(int start, int end) {
+ return mSource.subSequence(start, end); // Return default
+ }
+ }
+
+}
diff --git a/app/src/main/java/com/project/survey/widget/edittext/GravityEnum.java b/app/src/main/java/com/project/survey/widget/edittext/GravityEnum.java
new file mode 100644
index 0000000..0bcb2c2
--- /dev/null
+++ b/app/src/main/java/com/project/survey/widget/edittext/GravityEnum.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2018 xuexiangjys(xuexiangjys@163.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.project.survey.widget.edittext;
+
+import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.view.Gravity;
+import android.view.View;
+
+/**
+ * 对齐方式
+ *
+ * @author xuexiang
+ * @since 2018/11/14 下午4:44
+ */
+public enum GravityEnum {
+ /**
+ * 头部对齐
+ */
+ START,
+ /**
+ * 居中对齐
+ */
+ CENTER,
+ /**
+ * 尾部对齐
+ */
+ END;
+
+ private static final boolean HAS_RTL =
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1;
+
+ @SuppressLint("RtlHardcoded")
+ public int getGravityInt() {
+ switch (this) {
+ case START:
+ return HAS_RTL ? Gravity.START : Gravity.LEFT;
+ case CENTER:
+ return Gravity.CENTER_HORIZONTAL;
+ case END:
+ return HAS_RTL ? Gravity.END : Gravity.RIGHT;
+ default:
+ throw new IllegalStateException("Invalid gravity constant");
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+ public int getTextAlignment() {
+ switch (this) {
+ case CENTER:
+ return View.TEXT_ALIGNMENT_CENTER;
+ case END:
+ return View.TEXT_ALIGNMENT_VIEW_END;
+ default:
+ return View.TEXT_ALIGNMENT_VIEW_START;
+ }
+ }
+}
diff --git a/app/src/main/java/com/project/survey/widget/edittext/PassEdittext2.java b/app/src/main/java/com/project/survey/widget/edittext/PassEdittext2.java
new file mode 100644
index 0000000..24a2ec5
--- /dev/null
+++ b/app/src/main/java/com/project/survey/widget/edittext/PassEdittext2.java
@@ -0,0 +1,318 @@
+package com.project.survey.widget.edittext;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.text.method.PasswordTransformationMethod;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.widget.EditText;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.widget.AppCompatEditText;
+
+import com.project.survey.R;
+import com.project.survey.util.DensityUtils;
+import com.project.survey.util.ResUtils;
+
+public class PassEdittext2 extends androidx.appcompat.widget.AppCompatEditText {
+ /**
+ * 增大点击区域
+ */
+ private int mExtraClickArea;
+
+ private final static int ALPHA_ICON_ENABLED = (int) (255 * 0.54f);
+ private final static int ALPHA_ICON_DISABLED = (int) (255 * 0.38f);
+
+ private Drawable mShowPwDrawable;
+ private Drawable mHidePwDrawable;
+ private boolean mPasswordVisible;
+ private boolean mShowingIcon;
+ private boolean mSetErrorCalled;
+ private boolean mHoverShowsPw;
+ private boolean mHandlingHoverEvent;
+ private PasswordTransformationMethod mTransformationMethod;
+
+ public PassEdittext2(Context context) {
+ this(context, null);
+ }
+
+ public PassEdittext2(Context context, AttributeSet attrs) {
+ this(context, attrs, R.attr.PasswordEditTextStyle);
+ }
+
+ public PassEdittext2(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ initAttrs(context, attrs, defStyleAttr);
+ }
+
+ public void initAttrs(Context context, AttributeSet attrs, int defStyleAttr) {
+ mExtraClickArea = DensityUtils.dp2px(context, 20);
+ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.PasswordEditText, defStyleAttr, 0);
+ boolean useNonMonospaceFont;
+ boolean enableIconAlpha;
+ try {
+ mShowPwDrawable = ResUtils.getDrawableAttrRes(getContext(), typedArray, R.styleable.PasswordEditText_pet_iconShow);
+ if (mShowPwDrawable == null) {
+ mShowPwDrawable = ResUtils.getVectorDrawable(getContext(), R.drawable.pet_icon_visibility_24dp);
+ }
+ mHidePwDrawable = ResUtils.getDrawableAttrRes(getContext(), typedArray, R.styleable.PasswordEditText_pet_iconHide);
+ if (mHidePwDrawable == null) {
+ mHidePwDrawable = ResUtils.getVectorDrawable(getContext(), R.drawable.pet_icon_visibility_off_24dp);
+ }
+ mHoverShowsPw = typedArray.getBoolean(R.styleable.PasswordEditText_pet_hoverShowsPw, false);
+ useNonMonospaceFont = typedArray.getBoolean(R.styleable.PasswordEditText_pet_nonMonospaceFont, false);
+ enableIconAlpha = typedArray.getBoolean(R.styleable.PasswordEditText_pet_enableIconAlpha, true);
+ boolean isAsteriskStyle = typedArray.getBoolean(R.styleable.PasswordEditText_pet_isAsteriskStyle, false);
+ if (isAsteriskStyle) {
+ mTransformationMethod = AsteriskPasswordTransformationMethod.getInstance();
+ } else {
+ mTransformationMethod = PasswordTransformationMethod.getInstance();
+ }
+ } finally {
+ typedArray.recycle();
+ }
+
+ if (enableIconAlpha) {
+ mHidePwDrawable.setAlpha(ALPHA_ICON_ENABLED);
+ mShowPwDrawable.setAlpha(ALPHA_ICON_DISABLED);
+ }
+
+// if (useNonMonospaceFont) {
+// setTypeface(Typeface.DEFAULT);
+// }
+
+ addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence seq, int start, int before, int count) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ if (s.length() > 0) {
+ if (mSetErrorCalled) {
+ setCompoundDrawablesRelative(null, null, null, null);
+ mSetErrorCalled = false;
+ showPasswordVisibilityIndicator(true);
+ }
+ if (!mShowingIcon) {
+ showPasswordVisibilityIndicator(true);
+ }
+ } else {
+ // hides the indicator if no text inside text field
+ mPasswordVisible = false;
+ handlePasswordInputVisibility();
+ showPasswordVisibilityIndicator(false);
+ }
+
+ }
+ });
+
+ handlePasswordInputVisibility();
+ }
+
+ public PassEdittext2 setExtraClickAreaSize(int extraClickArea) {
+ mExtraClickArea = extraClickArea;
+ return this;
+ }
+
+ /**
+ * 设置密码输入框的样式
+ *
+ * @param transformationMethod
+ * @return
+ */
+ public PassEdittext2 setPasswordTransformationMethod(PasswordTransformationMethod transformationMethod) {
+ mTransformationMethod = transformationMethod;
+ return this;
+ }
+
+ /**
+ * 设置密码输入框的样式
+ *
+ * @param isAsteriskStyle
+ * @return
+ */
+ public PassEdittext2 setIsAsteriskStyle(boolean isAsteriskStyle) {
+ if (isAsteriskStyle) {
+ mTransformationMethod = AsteriskPasswordTransformationMethod.getInstance();
+ } else {
+ mTransformationMethod = PasswordTransformationMethod.getInstance();
+ }
+ return this;
+ }
+
+ private boolean isRtl() {
+ return getLayoutDirection() == LAYOUT_DIRECTION_RTL;
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState() {
+ Parcelable superState = super.onSaveInstanceState();
+ return new PassEdittext2.SavedState(superState, mShowingIcon, mPasswordVisible);
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ PasswordEditText.SavedState savedState = (PasswordEditText.SavedState) state;
+ super.onRestoreInstanceState(savedState.getSuperState());
+ mShowingIcon = savedState.isShowingIcon();
+ mPasswordVisible = savedState.isPasswordVisible();
+ handlePasswordInputVisibility();
+ showPasswordVisibilityIndicator(mShowingIcon);
+ }
+
+ @Override
+ public void setError(CharSequence error) {
+ super.setError(error);
+ mSetErrorCalled = true;
+
+ }
+
+ @Override
+ public void setError(CharSequence error, Drawable icon) {
+ super.setError(error, icon);
+ mSetErrorCalled = true;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (!mShowingIcon) {
+ return super.onTouchEvent(event);
+ } else {
+ boolean touchable = isTouchable(event);
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ if (mHoverShowsPw) {
+ if (touchable) {
+ togglePasswordIconVisibility();
+ // prevent keyboard from coming up
+ event.setAction(MotionEvent.ACTION_CANCEL);
+ mHandlingHoverEvent = true;
+ }
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (mHandlingHoverEvent || touchable) {
+ togglePasswordIconVisibility();
+ // prevent keyboard from coming up
+ event.setAction(MotionEvent.ACTION_CANCEL);
+ mHandlingHoverEvent = false;
+ }
+ break;
+ default:
+ break;
+ }
+ return super.onTouchEvent(event);
+ }
+ }
+
+ private boolean isTouchable(MotionEvent event) {
+ boolean touchable;
+ if (isRtl()) {
+ touchable = event.getX() > getPaddingLeft() - mExtraClickArea && event.getX() < getPaddingLeft() + mShowPwDrawable.getIntrinsicWidth() + mExtraClickArea;
+ } else {
+ touchable = event.getX() > getWidth() - getPaddingRight() - mShowPwDrawable.getIntrinsicWidth() - mExtraClickArea && event.getX() < getWidth() - getPaddingRight() + mExtraClickArea;
+ }
+ return touchable;
+ }
+
+
+ private void showPasswordVisibilityIndicator(boolean shouldShowIcon) {
+ if (shouldShowIcon) {
+ Drawable drawable = mPasswordVisible ? mShowPwDrawable : mHidePwDrawable;
+ mShowingIcon = true;
+ setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, drawable, null);
+ } else {
+ // reset drawable
+ setCompoundDrawablesRelative(null, null, null, null);
+ mShowingIcon = false;
+ }
+ }
+
+ /**
+ * This method toggles the visibility of the icon and takes care of switching the input type
+ * of the view to be able to see the password afterwards.
+ *
+ * This method may only be called if there is an icon visible
+ */
+ private void togglePasswordIconVisibility() {
+ mPasswordVisible = !mPasswordVisible;
+ handlePasswordInputVisibility();
+ showPasswordVisibilityIndicator(true);
+ }
+
+ /**
+ * This method is called when restoring the state (e.g. on orientation change)
+ */
+ private void handlePasswordInputVisibility() {
+ int selectionStart = getSelectionStart();
+ int selectionEnd = getSelectionEnd();
+ if (mPasswordVisible) {
+ setTransformationMethod(null);
+ } else {
+ setTransformationMethod(mTransformationMethod);
+ }
+ setSelection(selectionStart, selectionEnd);
+
+ }
+
+ /**
+ * Convenience class to save / restore the state of icon.
+ */
+ protected static class SavedState extends BaseSavedState {
+
+ private final boolean mShowingIcon;
+ private final boolean mPasswordVisible;
+
+ private SavedState(Parcelable superState, boolean sI, boolean pV) {
+ super(superState);
+ mShowingIcon = sI;
+ mPasswordVisible = pV;
+ }
+
+ private SavedState(Parcel in) {
+ super(in);
+ mShowingIcon = in.readByte() != 0;
+ mPasswordVisible = in.readByte() != 0;
+ }
+
+ public boolean isShowingIcon() {
+ return mShowingIcon;
+ }
+
+ public boolean isPasswordVisible() {
+ return mPasswordVisible;
+ }
+
+ @Override
+ public void writeToParcel(Parcel destination, int flags) {
+ super.writeToParcel(destination, flags);
+ destination.writeByte((byte) (mShowingIcon ? 1 : 0));
+ destination.writeByte((byte) (mPasswordVisible ? 1 : 0));
+ }
+
+ public static final Creator CREATOR = new Creator() {
+
+ @Override
+ public PassEdittext2.SavedState createFromParcel(Parcel in) {
+ return new PassEdittext2.SavedState(in);
+ }
+
+ @Override
+ public PassEdittext2.SavedState[] newArray(int size) {
+ return new PassEdittext2.SavedState[size];
+ }
+
+ };
+ }
+}
diff --git a/app/src/main/java/com/project/survey/widget/edittext/PasswordEditText.java b/app/src/main/java/com/project/survey/widget/edittext/PasswordEditText.java
new file mode 100644
index 0000000..1e7fc19
--- /dev/null
+++ b/app/src/main/java/com/project/survey/widget/edittext/PasswordEditText.java
@@ -0,0 +1,323 @@
+package com.project.survey.widget.edittext;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.text.method.PasswordTransformationMethod;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+
+import androidx.appcompat.widget.AppCompatEditText;
+
+import com.project.survey.R;
+import com.project.survey.util.DensityUtils;
+import com.project.survey.util.ResUtils;
+
+
+/**
+ * 支持显示密码的输入框
+ *
+ * @author xuexiang
+ * @since 2019/1/14 下午10:08
+ */
+public class PasswordEditText extends AppCompatEditText {
+ /**
+ * 增大点击区域
+ */
+ private int mExtraClickArea;
+
+ private final static int ALPHA_ICON_ENABLED = (int) (255 * 0.54f);
+ private final static int ALPHA_ICON_DISABLED = (int) (255 * 0.38f);
+
+ private Drawable mShowPwDrawable;
+ private Drawable mHidePwDrawable;
+ private boolean mPasswordVisible;
+ private boolean mShowingIcon;
+ private boolean mSetErrorCalled;
+ private boolean mHoverShowsPw;
+ private boolean mHandlingHoverEvent;
+ private PasswordTransformationMethod mTransformationMethod;
+
+ public PasswordEditText(Context context) {
+ this(context, null);
+ }
+
+ public PasswordEditText(Context context, AttributeSet attrs) {
+ this(context, attrs, R.attr.PasswordEditTextStyle);
+ }
+
+ public PasswordEditText(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ initAttrs(context, attrs, defStyleAttr);
+ }
+
+ public void initAttrs(Context context, AttributeSet attrs, int defStyleAttr) {
+ mExtraClickArea = DensityUtils.dp2px(context, 20);
+ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.PasswordEditText, defStyleAttr, 0);
+ boolean useNonMonospaceFont;
+ boolean enableIconAlpha;
+ try {
+ mShowPwDrawable = ResUtils.getDrawableAttrRes(getContext(), typedArray, R.styleable.PasswordEditText_pet_iconShow);
+ if (mShowPwDrawable == null) {
+ mShowPwDrawable = ResUtils.getVectorDrawable(getContext(), R.drawable.pet_icon_visibility_24dp);
+ }
+ mHidePwDrawable = ResUtils.getDrawableAttrRes(getContext(), typedArray, R.styleable.PasswordEditText_pet_iconHide);
+ if (mHidePwDrawable == null) {
+ mHidePwDrawable = ResUtils.getVectorDrawable(getContext(), R.drawable.pet_icon_visibility_off_24dp);
+ }
+ mHoverShowsPw = typedArray.getBoolean(R.styleable.PasswordEditText_pet_hoverShowsPw, false);
+ useNonMonospaceFont = typedArray.getBoolean(R.styleable.PasswordEditText_pet_nonMonospaceFont, false);
+ enableIconAlpha = typedArray.getBoolean(R.styleable.PasswordEditText_pet_enableIconAlpha, true);
+ boolean isAsteriskStyle = typedArray.getBoolean(R.styleable.PasswordEditText_pet_isAsteriskStyle, false);
+ if (isAsteriskStyle) {
+ mTransformationMethod = AsteriskPasswordTransformationMethod.getInstance();
+ } else {
+ mTransformationMethod = PasswordTransformationMethod.getInstance();
+ }
+ } finally {
+ typedArray.recycle();
+ }
+
+ if (enableIconAlpha) {
+ mHidePwDrawable.setAlpha(ALPHA_ICON_ENABLED);
+ mShowPwDrawable.setAlpha(ALPHA_ICON_DISABLED);
+ }
+
+ if (useNonMonospaceFont) {
+ setTypeface(Typeface.DEFAULT);
+ }
+
+ addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence seq, int start, int before, int count) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ if (s.length() > 0) {
+ if (mSetErrorCalled) {
+ setCompoundDrawablesRelative(null, null, null, null);
+ mSetErrorCalled = false;
+ showPasswordVisibilityIndicator(true);
+ }
+ if (!mShowingIcon) {
+ showPasswordVisibilityIndicator(true);
+ }
+ } else {
+ // hides the indicator if no text inside text field
+ mPasswordVisible = false;
+ handlePasswordInputVisibility();
+ showPasswordVisibilityIndicator(false);
+ }
+
+ }
+ });
+
+ handlePasswordInputVisibility();
+ }
+
+ public PasswordEditText setExtraClickAreaSize(int extraClickArea) {
+ mExtraClickArea = extraClickArea;
+ return this;
+ }
+
+ /**
+ * 设置密码输入框的样式
+ *
+ * @param transformationMethod
+ * @return
+ */
+ public PasswordEditText setPasswordTransformationMethod(PasswordTransformationMethod transformationMethod) {
+ mTransformationMethod = transformationMethod;
+ return this;
+ }
+
+ /**
+ * 设置密码输入框的样式
+ *
+ * @param isAsteriskStyle
+ * @return
+ */
+ public PasswordEditText setIsAsteriskStyle(boolean isAsteriskStyle) {
+ if (isAsteriskStyle) {
+ mTransformationMethod = AsteriskPasswordTransformationMethod.getInstance();
+ } else {
+ mTransformationMethod = PasswordTransformationMethod.getInstance();
+ }
+ return this;
+ }
+
+ private boolean isRtl() {
+ return getLayoutDirection() == LAYOUT_DIRECTION_RTL;
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState() {
+ Parcelable superState = super.onSaveInstanceState();
+ return new SavedState(superState, mShowingIcon, mPasswordVisible);
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ SavedState savedState = (SavedState) state;
+ super.onRestoreInstanceState(savedState.getSuperState());
+ mShowingIcon = savedState.isShowingIcon();
+ mPasswordVisible = savedState.isPasswordVisible();
+ handlePasswordInputVisibility();
+ showPasswordVisibilityIndicator(mShowingIcon);
+ }
+
+ @Override
+ public void setError(CharSequence error) {
+ super.setError(error);
+ mSetErrorCalled = true;
+
+ }
+
+ @Override
+ public void setError(CharSequence error, Drawable icon) {
+ super.setError(error, icon);
+ mSetErrorCalled = true;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (!mShowingIcon) {
+ return super.onTouchEvent(event);
+ } else {
+ boolean touchable = isTouchable(event);
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ if (mHoverShowsPw) {
+ if (touchable) {
+ togglePasswordIconVisibility();
+ // prevent keyboard from coming up
+ event.setAction(MotionEvent.ACTION_CANCEL);
+ mHandlingHoverEvent = true;
+ }
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (mHandlingHoverEvent || touchable) {
+ togglePasswordIconVisibility();
+ // prevent keyboard from coming up
+ event.setAction(MotionEvent.ACTION_CANCEL);
+ mHandlingHoverEvent = false;
+ }
+ break;
+ default:
+ break;
+ }
+ return super.onTouchEvent(event);
+ }
+ }
+
+ private boolean isTouchable(MotionEvent event) {
+ boolean touchable;
+ if (isRtl()) {
+ touchable = event.getX() > getPaddingLeft() - mExtraClickArea && event.getX() < getPaddingLeft() + mShowPwDrawable.getIntrinsicWidth() + mExtraClickArea;
+ } else {
+ touchable = event.getX() > getWidth() - getPaddingRight() - mShowPwDrawable.getIntrinsicWidth() - mExtraClickArea && event.getX() < getWidth() - getPaddingRight() + mExtraClickArea;
+ }
+ return touchable;
+ }
+
+
+ private void showPasswordVisibilityIndicator(boolean shouldShowIcon) {
+ if (shouldShowIcon) {
+ Drawable drawable = mPasswordVisible ? mShowPwDrawable : mHidePwDrawable;
+ mShowingIcon = true;
+ setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, drawable, null);
+ } else {
+ // reset drawable
+ setCompoundDrawablesRelative(null, null, null, null);
+ mShowingIcon = false;
+ }
+ }
+
+ /**
+ * This method toggles the visibility of the icon and takes care of switching the input type
+ * of the view to be able to see the password afterwards.
+ *
+ * This method may only be called if there is an icon visible
+ */
+ private void togglePasswordIconVisibility() {
+ mPasswordVisible = !mPasswordVisible;
+ handlePasswordInputVisibility();
+ showPasswordVisibilityIndicator(true);
+ }
+
+ /**
+ * This method is called when restoring the state (e.g. on orientation change)
+ */
+ private void handlePasswordInputVisibility() {
+ int selectionStart = getSelectionStart();
+ int selectionEnd = getSelectionEnd();
+ if (mPasswordVisible) {
+ setTransformationMethod(null);
+ } else {
+ setTransformationMethod(mTransformationMethod);
+ }
+ setSelection(selectionStart, selectionEnd);
+
+ }
+
+ /**
+ * Convenience class to save / restore the state of icon.
+ */
+ protected static class SavedState extends BaseSavedState {
+
+ private final boolean mShowingIcon;
+ private final boolean mPasswordVisible;
+
+ private SavedState(Parcelable superState, boolean sI, boolean pV) {
+ super(superState);
+ mShowingIcon = sI;
+ mPasswordVisible = pV;
+ }
+
+ private SavedState(Parcel in) {
+ super(in);
+ mShowingIcon = in.readByte() != 0;
+ mPasswordVisible = in.readByte() != 0;
+ }
+
+ public boolean isShowingIcon() {
+ return mShowingIcon;
+ }
+
+ public boolean isPasswordVisible() {
+ return mPasswordVisible;
+ }
+
+ @Override
+ public void writeToParcel(Parcel destination, int flags) {
+ super.writeToParcel(destination, flags);
+ destination.writeByte((byte) (mShowingIcon ? 1 : 0));
+ destination.writeByte((byte) (mPasswordVisible ? 1 : 0));
+ }
+
+ public static final Creator CREATOR = new Creator() {
+
+ @Override
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in);
+ }
+
+ @Override
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+
+ };
+ }
+}
diff --git a/app/src/main/java/com/project/survey/widget/edittext/materialedittext/MaterialEditText.java b/app/src/main/java/com/project/survey/widget/edittext/materialedittext/MaterialEditText.java
new file mode 100644
index 0000000..3576b11
--- /dev/null
+++ b/app/src/main/java/com/project/survey/widget/edittext/materialedittext/MaterialEditText.java
@@ -0,0 +1,1788 @@
+package com.project.survey.widget.edittext.materialedittext;
+
+import android.animation.ArgbEvaluator;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.text.Editable;
+import android.text.Layout;
+import android.text.StaticLayout;
+import android.text.TextPaint;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.text.method.PasswordTransformationMethod;
+import android.text.method.TransformationMethod;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IntDef;
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.AppCompatEditText;
+
+
+import com.project.survey.R;
+import com.project.survey.util.DensityUtils;
+import com.project.survey.util.DrawableUtils;
+import com.project.survey.util.ResUtils;
+import com.project.survey.util.ThemeUtils;
+import com.project.survey.widget.XUI;
+import com.project.survey.widget.edittext.AsteriskPasswordTransformationMethod;
+import com.project.survey.widget.edittext.materialedittext.validation.METLengthChecker;
+import com.project.survey.widget.edittext.materialedittext.validation.METValidator;
+import com.project.survey.widget.edittext.materialedittext.validation.NotAllowEmptyValidator;
+import com.project.survey.widget.edittext.materialedittext.validation.RegexpValidator;
+import com.project.survey.widget.util.Utils;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import io.github.inflationx.calligraphy3.HasTypeface;
+
+
+/**
+ * Material Design 输入框
+ *
+ * @author XUE
+ * @since 2019/3/20 16:47
+ */
+@Keep
+public class MaterialEditText extends AppCompatEditText implements HasTypeface {
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({FLOATING_LABEL_NONE, FLOATING_LABEL_NORMAL, FLOATING_LABEL_HIGHLIGHT})
+ public @interface FloatingLabelType {
+ }
+
+ public static final int FLOATING_LABEL_NONE = 0;
+ public static final int FLOATING_LABEL_NORMAL = 1;
+ public static final int FLOATING_LABEL_HIGHLIGHT = 2;
+
+ /**
+ * the spacing between the main text and the inner top padding.
+ */
+ private int extraPaddingTop;
+
+ /**
+ * the spacing between the main text and the inner bottom padding.
+ */
+ private int extraPaddingBottom;
+
+ /**
+ * the extra spacing between the main text and the left, actually for the left icon.
+ */
+ private int extraPaddingLeft;
+
+ /**
+ * the extra spacing between the main text and the right, actually for the right icon.
+ */
+ private int extraPaddingRight;
+
+ /**
+ * the floating label's text size.
+ */
+ private int floatingLabelTextSize;
+
+ /**
+ * the floating label's text color.
+ */
+ private int floatingLabelTextColor;
+
+ /**
+ * the bottom texts' size.
+ */
+ private int bottomTextSize;
+
+ /**
+ * the spacing between the main text and the floating label.
+ */
+ private int floatingLabelPadding;
+
+ /**
+ * the spacing between the main text and the bottom components (bottom ellipsis, helper/error text, characters counter).
+ */
+ private int bottomSpacing;
+
+ /**
+ * whether the floating label should be shown. default is false.
+ */
+ private boolean floatingLabelEnabled;
+
+ /**
+ * whether to highlight the floating label's text color when focused (with the main color). default is true.
+ */
+ private boolean highlightFloatingLabel;
+
+ /**
+ * the base color of the line and the texts. default is black.
+ */
+ private int baseColor;
+
+ /**
+ * inner top padding
+ */
+ private int innerPaddingTop;
+
+ /**
+ * inner bottom padding
+ */
+ private int innerPaddingBottom;
+
+ /**
+ * inner left padding
+ */
+ private int innerPaddingLeft;
+
+ /**
+ * inner right padding
+ */
+ private int innerPaddingRight;
+
+ /**
+ * the underline's highlight color, and the highlight color of the floating label if app:highlightFloatingLabel is set true in the xml. default is black(when app:darkTheme is false) or white(when app:darkTheme is true)
+ */
+ private int primaryColor;
+
+ /**
+ * the color for when something is wrong.(e.g. exceeding max characters)
+ */
+ private int errorColor;
+
+ /**
+ * min characters count limit. 0 means no limit. default is 0. NOTE: the character counter will increase the View's height.
+ */
+ private int minCharacters;
+
+ /**
+ * max characters count limit. 0 means no limit. default is 0. NOTE: the character counter will increase the View's height.
+ */
+ private int maxCharacters;
+
+ /**
+ * whether to show the bottom ellipsis in singleLine mode. default is false. NOTE: the bottom ellipsis will increase the View's height.
+ */
+ private boolean singleLineEllipsis;
+
+ /**
+ * Always show the floating label, instead of animating it in/out. False by default.
+ */
+ private boolean floatingLabelAlwaysShown;
+
+ /**
+ * Always show the helper text, no matter if the edit text is focused. False by default.
+ */
+ private boolean helperTextAlwaysShown;
+
+ /**
+ * bottom ellipsis's height
+ */
+ private int bottomEllipsisSize;
+
+ /**
+ * min bottom lines count.
+ */
+ private int minBottomLines;
+
+ /**
+ * reserved bottom text lines count, no matter if there is some helper/error text.
+ */
+ private int minBottomTextLines;
+
+ /**
+ * real-time bottom lines count. used for bottom extending/collapsing animation.
+ */
+ private float currentBottomLines;
+
+ /**
+ * bottom lines count.
+ */
+ private float bottomLines;
+
+ /**
+ * Helper text at the bottom
+ */
+ private String helperText;
+
+ /**
+ * Helper text color
+ */
+ private int helperTextColor = -1;
+
+ /**
+ * error text for manually invoked
+ */
+ private String tempErrorText;
+
+ /**
+ * animation fraction of the floating label (0 as totally hidden).
+ */
+ private float floatingLabelFraction;
+
+ /**
+ * whether the floating label is being shown.
+ */
+ private boolean floatingLabelShown;
+
+ /**
+ * the floating label's focusFraction
+ */
+ private float focusFraction;
+
+ /**
+ * The font used for the accent texts (floating label, error/helper text, character counter, etc.)
+ */
+ private Typeface accentTypeface;
+
+ /**
+ * Text for the floatLabel if different from the hint
+ */
+ private CharSequence floatingLabelText;
+
+ /**
+ * Whether or not to show the underline. Shown by default
+ */
+ private boolean hideUnderline;
+
+ /**
+ * Underline's color
+ */
+ private int underlineColor;
+ /**
+ * Underline's height
+ */
+ private int underlineHeight;
+ private int underlineHeightFocused;
+ /**
+ * Whether to validate as soon as the text has changed. False by default
+ */
+ private boolean autoValidate;
+
+ /**
+ * Whether the characters count is valid
+ */
+ private boolean charactersCountValid;
+
+ /**
+ * Whether use animation to show/hide the floating label.
+ */
+ private boolean floatingLabelAnimating;
+
+ /**
+ * Whether check the characters count at the beginning it's shown.
+ */
+ private boolean checkCharactersCountAtBeginning;
+
+ /**
+ * Left Icon
+ */
+ private Bitmap[] iconLeftBitmaps;
+
+ /**
+ * Right Icon
+ */
+ private Bitmap[] iconRightBitmaps;
+
+ /**
+ * Clear Button
+ */
+ private Bitmap[] clearButtonBitmaps;
+ /**
+ * showPwIcon Button
+ */
+ private Bitmap[] showPwIconBitmaps;
+ /**
+ * hidePwIcon Button
+ */
+ private Bitmap[] hidePwIconBitmaps;
+
+ private boolean passwordVisible;
+
+ /**
+ * Auto validate when focus lost.
+ */
+ private boolean validateOnFocusLost;
+
+ private boolean showClearButton;
+ private boolean showPasswordButton;
+ private boolean firstShown;
+ private int iconSize;
+ private int iconOuterWidth;
+ private int iconOuterHeight;
+ private int iconPadding;
+ private boolean actionButtonTouched;
+ private boolean actionButtonClicking;
+ private ColorStateList textColorStateList;
+ private ColorStateList textColorHintStateList;
+ private ArgbEvaluator focusEvaluator = new ArgbEvaluator();
+ Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
+ StaticLayout textLayout;
+ ObjectAnimator labelAnimator;
+ ObjectAnimator labelFocusAnimator;
+ ObjectAnimator bottomLinesAnimator;
+ OnFocusChangeListener innerFocusChangeListener;
+ OnFocusChangeListener outerFocusChangeListener;
+ private List validators = new ArrayList<>();
+ private METLengthChecker lengthChecker;
+ private PasswordTransformationMethod mTransformationMethod;
+
+ public MaterialEditText(Context context) {
+ this(context, null);
+ }
+
+ public MaterialEditText(Context context, AttributeSet attrs) {
+ this(context, attrs, R.attr.MaterialEditTextStyle);
+ }
+
+ public MaterialEditText(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(context, attrs, defStyleAttr);
+ }
+
+ private void init(Context context, AttributeSet attrs, int defStyleAttr) {
+ iconSize = getPixel(32);
+ iconOuterWidth = getPixel(24);
+ iconOuterHeight = getPixel(32);
+
+ bottomSpacing = getResources().getDimensionPixelSize(R.dimen.default_edittext_components_spacing);
+ bottomEllipsisSize = getResources().getDimensionPixelSize(R.dimen.default_bottom_ellipsis_height);
+
+ // default baseColor is black
+ int defaultBaseColor = Color.BLACK;
+
+ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MaterialEditText, defStyleAttr, 0);
+ textColorStateList = ResUtils.getColorStateListAttrRes(context, typedArray, R.styleable.MaterialEditText_met_textColor);
+ textColorHintStateList = ResUtils.getColorStateListAttrRes(context, typedArray, R.styleable.MaterialEditText_met_textColorHint);
+ baseColor = typedArray.getColor(R.styleable.MaterialEditText_met_baseColor, defaultBaseColor);
+
+ primaryColor = typedArray.getColor(R.styleable.MaterialEditText_met_primaryColor, ThemeUtils.resolveColor(getContext(), R.attr.colorPrimary, baseColor));
+ setFloatingLabelInternal(typedArray.getInt(R.styleable.MaterialEditText_met_floatingLabel, 0));
+ errorColor = typedArray.getColor(R.styleable.MaterialEditText_met_errorColor, ThemeUtils.resolveColor(getContext(), R.attr.xui_config_color_error_text));
+
+ boolean allowEmpty = typedArray.getBoolean(R.styleable.MaterialEditText_met_allowEmpty, true);
+ if (!allowEmpty) {
+ String errorEmpty = typedArray.getString(R.styleable.MaterialEditText_met_errorEmpty);
+ if (!TextUtils.isEmpty(errorEmpty)) {
+ validators.add(new NotAllowEmptyValidator(errorEmpty));
+ } else {
+ validators.add(new NotAllowEmptyValidator(ResUtils.getString(context, R.string.xui_met_not_allow_empty)));
+ }
+ }
+ minCharacters = typedArray.getInt(R.styleable.MaterialEditText_met_minCharacters, 0);
+ maxCharacters = typedArray.getInt(R.styleable.MaterialEditText_met_maxCharacters, 0);
+ singleLineEllipsis = typedArray.getBoolean(R.styleable.MaterialEditText_met_singleLineEllipsis, false);
+ helperText = typedArray.getString(R.styleable.MaterialEditText_met_helperText);
+ helperTextColor = typedArray.getColor(R.styleable.MaterialEditText_met_helperTextColor, -1);
+ minBottomTextLines = typedArray.getInt(R.styleable.MaterialEditText_met_minBottomTextLines, 0);
+ String fontPathForAccent = typedArray.getString(R.styleable.MaterialEditText_met_accentTypeface);
+ if (fontPathForAccent != null) {
+ accentTypeface = XUI.getDefaultTypeface(fontPathForAccent);
+ textPaint.setTypeface(accentTypeface);
+ }
+ String fontPathForView = typedArray.getString(R.styleable.MaterialEditText_met_typeface);
+ if (fontPathForView != null) {
+ Typeface typeface = XUI.getDefaultTypeface(fontPathForView);
+ setTypeface(typeface);
+ }
+ floatingLabelText = typedArray.getString(R.styleable.MaterialEditText_met_floatingLabelText);
+ if (floatingLabelText == null) {
+ floatingLabelText = getHint();
+ }
+ floatingLabelPadding = typedArray.getDimensionPixelSize(R.styleable.MaterialEditText_met_floatingLabelPadding, bottomSpacing);
+ floatingLabelTextSize = typedArray.getDimensionPixelSize(R.styleable.MaterialEditText_met_floatingLabelTextSize, getResources().getDimensionPixelSize(R.dimen.default_floating_label_text_size));
+ floatingLabelTextColor = typedArray.getColor(R.styleable.MaterialEditText_met_floatingLabelTextColor, -1);
+ floatingLabelAnimating = typedArray.getBoolean(R.styleable.MaterialEditText_met_floatingLabelAnimating, true);
+ bottomTextSize = typedArray.getDimensionPixelSize(R.styleable.MaterialEditText_met_bottomTextSize, getResources().getDimensionPixelSize(R.dimen.default_bottom_text_size));
+ hideUnderline = typedArray.getBoolean(R.styleable.MaterialEditText_met_hideUnderline, false);
+ underlineColor = typedArray.getColor(R.styleable.MaterialEditText_met_underlineColor, -1);
+ underlineHeight = typedArray.getDimensionPixelSize(R.styleable.MaterialEditText_met_underlineHeight, getPixel(1));
+ underlineHeightFocused = typedArray.getDimensionPixelSize(R.styleable.MaterialEditText_met_underlineHeightFocused, getPixel(2));
+ autoValidate = typedArray.getBoolean(R.styleable.MaterialEditText_met_autoValidate, false);
+ iconLeftBitmaps = generateIconBitmaps(typedArray.getResourceId(R.styleable.MaterialEditText_met_iconLeft, -1));
+ iconRightBitmaps = generateIconBitmaps(typedArray.getResourceId(R.styleable.MaterialEditText_met_iconRight, -1));
+
+ showClearButton = typedArray.getBoolean(R.styleable.MaterialEditText_met_clearButton, false);
+ clearButtonBitmaps = generateIconBitmaps(DrawableUtils.getBitmapByDrawableId(getContext(), R.drawable.xui_ic_default_clear_btn));
+ showPasswordButton = typedArray.getBoolean(R.styleable.MaterialEditText_met_passWordButton, false);
+ boolean isAsteriskStyle = typedArray.getBoolean(R.styleable.MaterialEditText_met_isAsteriskStyle, false);
+ if (isAsteriskStyle) {
+ mTransformationMethod = AsteriskPasswordTransformationMethod.getInstance();
+ } else {
+ mTransformationMethod = PasswordTransformationMethod.getInstance();
+ }
+ if (showPasswordButton) {
+ handleSwitchPasswordInputVisibility();
+ }
+
+ showPwIconBitmaps = generateIconBitmaps(DrawableUtils.getBitmapByDrawableId(getContext(), R.drawable.pet_icon_visibility_24dp));
+ hidePwIconBitmaps = generateIconBitmaps(DrawableUtils.getBitmapByDrawableId(getContext(), R.drawable.pet_icon_visibility_off_24dp));
+
+ String regexp = typedArray.getString(R.styleable.MaterialEditText_met_regexp);
+ if (!TextUtils.isEmpty(regexp)) {
+ String errorMessage = typedArray.getString(R.styleable.MaterialEditText_met_errorMessage);
+ if (!TextUtils.isEmpty(errorMessage)) {
+ validators.add(new RegexpValidator(errorMessage, regexp));
+ } else {
+ validators.add(new RegexpValidator(ResUtils.getString(context, R.string.xui_met_input_error), regexp));
+ }
+ }
+
+ iconPadding = typedArray.getDimensionPixelSize(R.styleable.MaterialEditText_met_iconPadding, getPixel(8));
+ floatingLabelAlwaysShown = typedArray.getBoolean(R.styleable.MaterialEditText_met_floatingLabelAlwaysShown, false);
+ helperTextAlwaysShown = typedArray.getBoolean(R.styleable.MaterialEditText_met_helperTextAlwaysShown, false);
+ validateOnFocusLost = typedArray.getBoolean(R.styleable.MaterialEditText_met_validateOnFocusLost, false);
+ checkCharactersCountAtBeginning = typedArray.getBoolean(R.styleable.MaterialEditText_met_checkCharactersCountAtBeginning, true);
+ typedArray.recycle();
+
+ int[] paddings = new int[]{
+ android.R.attr.padding, // 0
+ android.R.attr.paddingLeft, // 1
+ android.R.attr.paddingTop, // 2
+ android.R.attr.paddingRight, // 3
+ android.R.attr.paddingBottom // 4
+ };
+ TypedArray paddingsTypedArray = context.obtainStyledAttributes(attrs, paddings);
+ int padding = paddingsTypedArray.getDimensionPixelSize(0, 0);
+ innerPaddingLeft = paddingsTypedArray.getDimensionPixelSize(1, padding);
+ innerPaddingTop = paddingsTypedArray.getDimensionPixelSize(2, padding);
+ innerPaddingRight = paddingsTypedArray.getDimensionPixelSize(3, padding);
+ innerPaddingBottom = paddingsTypedArray.getDimensionPixelSize(4, padding);
+ paddingsTypedArray.recycle();
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ setBackground(null);
+ } else {
+ setBackgroundDrawable(null);
+ }
+ if (singleLineEllipsis) {
+ TransformationMethod transformationMethod = getTransformationMethod();
+ setSingleLine();
+ setTransformationMethod(transformationMethod);
+ }
+ initMinBottomLines();
+ initPadding();
+ initText();
+ initFloatingLabel();
+ initTextWatcher();
+ checkCharactersCount();
+ }
+
+ private void initText() {
+ if (!TextUtils.isEmpty(getText())) {
+ CharSequence text = getText();
+ setText(null);
+ resetHintTextColor();
+ setText(text);
+ setSelection(text != null ? text.length() : 0);
+ floatingLabelFraction = 1;
+ floatingLabelShown = true;
+ } else {
+ resetHintTextColor();
+ }
+ resetTextColor();
+ }
+
+ private void initTextWatcher() {
+ 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) {
+ checkCharactersCount();
+ if (autoValidate) {
+ validate();
+ } else {
+ setError(null);
+ }
+ postInvalidate();
+ }
+ });
+ }
+
+ public MaterialEditText setIconLeft(@DrawableRes int res) {
+ iconLeftBitmaps = generateIconBitmaps(res);
+ initPadding();
+ return this;
+ }
+
+ public MaterialEditText setIconLeft(Drawable drawable) {
+ iconLeftBitmaps = generateIconBitmaps(drawable);
+ initPadding();
+ return this;
+ }
+
+ public MaterialEditText setIconLeft(Bitmap bitmap) {
+ iconLeftBitmaps = generateIconBitmaps(bitmap);
+ initPadding();
+ return this;
+ }
+
+ public MaterialEditText setIconRight(@DrawableRes int res) {
+ iconRightBitmaps = generateIconBitmaps(res);
+ initPadding();
+ return this;
+ }
+
+ public MaterialEditText setIconRight(Drawable drawable) {
+ iconRightBitmaps = generateIconBitmaps(drawable);
+ initPadding();
+ return this;
+ }
+
+ public MaterialEditText setIconRight(Bitmap bitmap) {
+ iconRightBitmaps = generateIconBitmaps(bitmap);
+ initPadding();
+ return this;
+ }
+
+ public boolean isShowClearButton() {
+ return showClearButton;
+ }
+
+ public boolean isShowPasswordButton() {
+ return showPasswordButton;
+ }
+
+ public MaterialEditText setShowClearButton(boolean show) {
+ showClearButton = show;
+ correctPaddings();
+ return this;
+ }
+
+ /**
+ * 设置密码输入框的样式
+ *
+ * @param transformationMethod
+ * @return
+ */
+ public MaterialEditText setPasswordTransformationMethod(PasswordTransformationMethod transformationMethod) {
+ mTransformationMethod = transformationMethod;
+ return this;
+ }
+
+ private Bitmap[] generateIconBitmaps(@DrawableRes int origin) {
+ if (origin == -1) {
+ return null;
+ }
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ int size = Math.max(options.outWidth, options.outHeight);
+ options.inSampleSize = size > iconSize ? size / iconSize : 1;
+ options.inJustDecodeBounds = false;
+ return generateIconBitmaps(BitmapFactory.decodeResource(getResources(), origin, options));
+ }
+
+ private Bitmap[] generateIconBitmaps(Drawable drawable) {
+ if (drawable == null) {
+ return null;
+ }
+ Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+ drawable.draw(canvas);
+ return generateIconBitmaps(Bitmap.createScaledBitmap(bitmap, iconSize, iconSize, false));
+ }
+
+ private Bitmap[] generateIconBitmaps(Bitmap origin) {
+ if (origin == null) {
+ return null;
+ }
+ Bitmap[] iconBitmaps = new Bitmap[4];
+ origin = scaleIcon(origin);
+ iconBitmaps[0] = origin.copy(Bitmap.Config.ARGB_8888, true);
+ Canvas canvas = new Canvas(iconBitmaps[0]);
+ canvas.drawColor(baseColor & 0x00ffffff | (Utils.isLight(baseColor) ? 0xff000000 : 0x8a000000), PorterDuff.Mode.SRC_IN);
+ iconBitmaps[1] = origin.copy(Bitmap.Config.ARGB_8888, true);
+ canvas = new Canvas(iconBitmaps[1]);
+ canvas.drawColor(primaryColor, PorterDuff.Mode.SRC_IN);
+ iconBitmaps[2] = origin.copy(Bitmap.Config.ARGB_8888, true);
+ canvas = new Canvas(iconBitmaps[2]);
+ canvas.drawColor(baseColor & 0x00ffffff | (Utils.isLight(baseColor) ? 0x4c000000 : 0x42000000), PorterDuff.Mode.SRC_IN);
+ iconBitmaps[3] = origin.copy(Bitmap.Config.ARGB_8888, true);
+ canvas = new Canvas(iconBitmaps[3]);
+ canvas.drawColor(errorColor, PorterDuff.Mode.SRC_IN);
+ return iconBitmaps;
+ }
+
+ private Bitmap scaleIcon(Bitmap origin) {
+ int width = origin.getWidth();
+ int height = origin.getHeight();
+ int size = Math.max(width, height);
+ if (size == iconSize) {
+ return origin;
+ } else if (size > iconSize) {
+ int scaledWidth;
+ int scaledHeight;
+ if (width > iconSize) {
+ scaledWidth = iconSize;
+ scaledHeight = (int) (iconSize * ((float) height / width));
+ } else {
+ scaledHeight = iconSize;
+ scaledWidth = (int) (iconSize * ((float) width / height));
+ }
+ return Bitmap.createScaledBitmap(origin, scaledWidth, scaledHeight, false);
+ } else {
+ return origin;
+ }
+ }
+
+ public float getFloatingLabelFraction() {
+ return floatingLabelFraction;
+ }
+
+ public MaterialEditText setFloatingLabelFraction(float floatingLabelFraction) {
+ this.floatingLabelFraction = floatingLabelFraction;
+ invalidate();
+ return this;
+ }
+
+ public float getFocusFraction() {
+ return focusFraction;
+ }
+
+ public MaterialEditText setFocusFraction(float focusFraction) {
+ this.focusFraction = focusFraction;
+ invalidate();
+ return this;
+ }
+
+ public float getCurrentBottomLines() {
+ return currentBottomLines;
+ }
+
+ public MaterialEditText setCurrentBottomLines(float currentBottomLines) {
+ this.currentBottomLines = currentBottomLines;
+ initPadding();
+ return this;
+ }
+
+ public boolean isFloatingLabelAlwaysShown() {
+ return floatingLabelAlwaysShown;
+ }
+
+ public MaterialEditText setFloatingLabelAlwaysShown(boolean floatingLabelAlwaysShown) {
+ this.floatingLabelAlwaysShown = floatingLabelAlwaysShown;
+ invalidate();
+ return this;
+ }
+
+ public boolean isHelperTextAlwaysShown() {
+ return helperTextAlwaysShown;
+ }
+
+ public MaterialEditText setHelperTextAlwaysShown(boolean helperTextAlwaysShown) {
+ this.helperTextAlwaysShown = helperTextAlwaysShown;
+ invalidate();
+ return this;
+ }
+
+ @Nullable
+ public Typeface getAccentTypeface() {
+ return accentTypeface;
+ }
+
+ /**
+ * Set typeface used for the accent texts (floating label, error/helper text, character counter, etc.)
+ */
+ public MaterialEditText setAccentTypeface(Typeface accentTypeface) {
+ this.accentTypeface = accentTypeface;
+ this.textPaint.setTypeface(accentTypeface);
+ postInvalidate();
+ return this;
+ }
+
+ public boolean isHideUnderline() {
+ return hideUnderline;
+ }
+
+ /**
+ * Set whether or not to hide the underline (shown by default).
+ *
+ * The positions of text below will be adjusted accordingly (error/helper text, character counter, ellipses, etc.)
+ *
+ * NOTE: You probably don't want to hide this if you have any subtext features of this enabled, as it can look weird to not have a dividing line between them.
+ */
+ public MaterialEditText setHideUnderline(boolean hideUnderline) {
+ this.hideUnderline = hideUnderline;
+ initPadding();
+ postInvalidate();
+ return this;
+ }
+
+ /**
+ * get the color of the underline for normal state
+ */
+ public int getUnderlineColor() {
+ return underlineColor;
+ }
+
+ /**
+ * Set the color of the underline for normal state
+ *
+ * @param color
+ */
+ public MaterialEditText setUnderlineColor(int color) {
+ this.underlineColor = color;
+ postInvalidate();
+ return this;
+ }
+
+ public CharSequence getFloatingLabelText() {
+ return floatingLabelText;
+ }
+
+ /**
+ * Set the floating label text.
+ *
+ * Pass null to force fallback to use hint's value.
+ *
+ * @param floatingLabelText
+ */
+ public MaterialEditText setFloatingLabelText(@Nullable CharSequence floatingLabelText) {
+ this.floatingLabelText = floatingLabelText == null ? getHint() : floatingLabelText;
+ postInvalidate();
+ return this;
+ }
+
+ public int getFloatingLabelTextSize() {
+ return floatingLabelTextSize;
+ }
+
+ public MaterialEditText setFloatingLabelTextSize(int size) {
+ floatingLabelTextSize = size;
+ initPadding();
+ return this;
+ }
+
+ public int getFloatingLabelTextColor() {
+ return floatingLabelTextColor;
+ }
+
+ public MaterialEditText setFloatingLabelTextColor(int color) {
+ this.floatingLabelTextColor = color;
+ postInvalidate();
+ return this;
+ }
+
+ public int getBottomTextSize() {
+ return bottomTextSize;
+ }
+
+ public void setBottomTextSize(int size) {
+ bottomTextSize = size;
+ initPadding();
+ }
+
+ private int getPixel(int dp) {
+ return DensityUtils.dp2px(getContext(), dp);
+ }
+
+ private void initPadding() {
+ extraPaddingTop = floatingLabelEnabled ? floatingLabelTextSize + floatingLabelPadding : floatingLabelPadding;
+ textPaint.setTextSize(bottomTextSize);
+ Paint.FontMetrics textMetrics = textPaint.getFontMetrics();
+ extraPaddingBottom = (int) ((textMetrics.descent - textMetrics.ascent) * currentBottomLines) + (hideUnderline ? bottomSpacing : bottomSpacing * 2);
+ extraPaddingLeft = getStartIcon() == null ? 0 : (iconOuterWidth + iconPadding);
+ extraPaddingRight = getEndIcon() == null ? 0 : (iconOuterWidth + iconPadding);
+ correctPaddings();
+ }
+
+ /**
+ * calculate {@link #minBottomLines}
+ */
+ private void initMinBottomLines() {
+ boolean extendBottom = minCharacters > 0 || maxCharacters > 0 || singleLineEllipsis || tempErrorText != null || helperText != null;
+ currentBottomLines = minBottomLines = minBottomTextLines > 0 ? minBottomTextLines : extendBottom ? 1 : 0;
+ }
+
+ /**
+ * use {@link #setPaddings(int, int, int, int)} instead, or the paddingTop and the paddingBottom may be set incorrectly.
+ */
+ @Deprecated
+ @Override
+ public final void setPadding(int left, int top, int right, int bottom) {
+ super.setPadding(left, top, right, bottom);
+ }
+
+ /**
+ * Use this method instead of {@link #setPadding(int, int, int, int)} to automatically set the paddingTop and the paddingBottom correctly.
+ */
+ public MaterialEditText setPaddings(int left, int top, int right, int bottom) {
+ innerPaddingTop = top;
+ innerPaddingBottom = bottom;
+ innerPaddingLeft = left;
+ innerPaddingRight = right;
+ correctPaddings();
+ return this;
+ }
+
+ /**
+ * Set paddings to the correct values
+ */
+ private void correctPaddings() {
+ int buttonsWidthLeft = 0, buttonsWidthRight = 0;
+ int buttonsWidth = iconOuterWidth * getButtonsCount();
+ if (isRTL()) {
+ buttonsWidthLeft = buttonsWidth;
+ } else {
+ buttonsWidthRight = buttonsWidth;
+ }
+ super.setPaddingRelative(innerPaddingLeft + extraPaddingLeft + buttonsWidthLeft, innerPaddingTop + extraPaddingTop, innerPaddingRight + extraPaddingRight + buttonsWidthRight, innerPaddingBottom + extraPaddingBottom);
+ }
+
+ private int getButtonsCount() {
+ return isShowClearButton() || isShowPasswordButton() ? 1 : 0;
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ if (!firstShown) {
+ firstShown = true;
+ }
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ if (changed) {
+ adjustBottomLines();
+ }
+ }
+
+ /**
+ * @return True, if adjustments were made that require the view to be invalidated.
+ */
+ private boolean adjustBottomLines() {
+ // Bail out if we have a zero width; lines will be adjusted during next layout.
+ if (getWidth() == 0) {
+ return false;
+ }
+ int destBottomLines;
+ textPaint.setTextSize(bottomTextSize);
+ if (tempErrorText != null || helperText != null) {
+ Layout.Alignment alignment = (getGravity() & Gravity.END) == Gravity.END || isRTL() ?
+ Layout.Alignment.ALIGN_OPPOSITE : (getGravity() & Gravity.START) == Gravity.START ?
+ Layout.Alignment.ALIGN_NORMAL : Layout.Alignment.ALIGN_CENTER;
+ textLayout = new StaticLayout(tempErrorText != null ? tempErrorText : helperText, textPaint, getWidth() - getBottomTextLeftOffset() - getBottomTextRightOffset() - getPaddingLeft() - getPaddingRight(), alignment, 1.0f, 0.0f, true);
+ destBottomLines = Math.max(textLayout.getLineCount(), minBottomTextLines);
+ } else {
+ destBottomLines = minBottomLines;
+ }
+ if (bottomLines != destBottomLines) {
+ getBottomLinesAnimator(destBottomLines).start();
+ }
+ bottomLines = destBottomLines;
+ return true;
+ }
+
+ /**
+ * get inner top padding, not the real paddingTop
+ */
+ public int getInnerPaddingTop() {
+ return innerPaddingTop;
+ }
+
+ /**
+ * get inner bottom padding, not the real paddingBottom
+ */
+ public int getInnerPaddingBottom() {
+ return innerPaddingBottom;
+ }
+
+ /**
+ * get inner left padding, not the real paddingLeft
+ */
+ public int getInnerPaddingLeft() {
+ return innerPaddingLeft;
+ }
+
+ /**
+ * get inner right padding, not the real paddingRight
+ */
+ public int getInnerPaddingRight() {
+ return innerPaddingRight;
+ }
+
+ private void initFloatingLabel() {
+ // observe the text changing
+ 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) {
+ if (floatingLabelEnabled) {
+ if (s.length() == 0) {
+ if (floatingLabelShown) {
+ floatingLabelShown = false;
+ getLabelAnimator().reverse();
+ }
+ } else if (!floatingLabelShown) {
+ floatingLabelShown = true;
+ getLabelAnimator().start();
+ }
+ }
+ }
+ });
+ // observe the focus state to animate the floating label's text color appropriately
+ innerFocusChangeListener = new OnFocusChangeListener() {
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ if (floatingLabelEnabled && highlightFloatingLabel) {
+ if (hasFocus) {
+ getLabelFocusAnimator().start();
+ } else {
+ getLabelFocusAnimator().reverse();
+ }
+ }
+ if (validateOnFocusLost && !hasFocus) {
+ validate();
+ }
+ if (outerFocusChangeListener != null) {
+ outerFocusChangeListener.onFocusChange(v, hasFocus);
+ }
+ }
+ };
+ super.setOnFocusChangeListener(innerFocusChangeListener);
+ }
+
+ public boolean isValidateOnFocusLost() {
+ return validateOnFocusLost;
+ }
+
+ public MaterialEditText setValidateOnFocusLost(boolean validate) {
+ this.validateOnFocusLost = validate;
+ return this;
+ }
+
+ public MaterialEditText setBaseColor(int color) {
+ if (baseColor != color) {
+ baseColor = color;
+ }
+ initText();
+ postInvalidate();
+ return this;
+ }
+
+ public MaterialEditText setPrimaryColor(int color) {
+ primaryColor = color;
+ postInvalidate();
+ return this;
+ }
+
+ /**
+ * Same function as {@link #setTextColor(int)}. (Directly overriding the built-in one could cause some error, so use this method instead.)
+ */
+ public MaterialEditText setMetTextColor(int color) {
+ textColorStateList = ColorStateList.valueOf(color);
+ resetTextColor();
+ return this;
+ }
+
+ /**
+ * Same function as {@link #setTextColor(ColorStateList)}. (Directly overriding the built-in one could cause some error, so use this method instead.)
+ */
+ public MaterialEditText setMetTextColor(ColorStateList colors) {
+ textColorStateList = colors;
+ resetTextColor();
+ return this;
+ }
+
+ private void resetTextColor() {
+ if (textColorStateList == null) {
+ textColorStateList = new ColorStateList(new int[][]{new int[]{android.R.attr.state_enabled}, EMPTY_STATE_SET}, new int[]{baseColor & 0x00ffffff | 0xdf000000, baseColor & 0x00ffffff | 0x44000000});
+ setTextColor(textColorStateList);
+ } else {
+ setTextColor(textColorStateList);
+ }
+ }
+
+ /**
+ * Same function as {@link #setHintTextColor(int)}. (The built-in one is a final method that can't be overridden, so use this method instead.)
+ */
+ public MaterialEditText setMetHintTextColor(int color) {
+ textColorHintStateList = ColorStateList.valueOf(color);
+ resetHintTextColor();
+ return this;
+ }
+
+ /**
+ * Same function as {@link #setHintTextColor(ColorStateList)}. (The built-in one is a final method that can't be overridden, so use this method instead.)
+ */
+ public MaterialEditText setMetHintTextColor(ColorStateList colors) {
+ textColorHintStateList = colors;
+ resetHintTextColor();
+ return this;
+ }
+
+ private void resetHintTextColor() {
+ if (textColorHintStateList == null) {
+ setHintTextColor(baseColor & 0x00ffffff | 0x44000000);
+ } else {
+ setHintTextColor(textColorHintStateList);
+ }
+ }
+
+ private void setFloatingLabelInternal(int mode) {
+ switch (mode) {
+ case FLOATING_LABEL_NORMAL:
+ floatingLabelEnabled = true;
+ highlightFloatingLabel = false;
+ break;
+ case FLOATING_LABEL_HIGHLIGHT:
+ floatingLabelEnabled = true;
+ highlightFloatingLabel = true;
+ break;
+ default:
+ floatingLabelEnabled = false;
+ highlightFloatingLabel = false;
+ break;
+ }
+ }
+
+ public MaterialEditText setFloatingLabel(@FloatingLabelType int mode) {
+ setFloatingLabelInternal(mode);
+ initPadding();
+ return this;
+ }
+
+ public int getFloatingLabelPadding() {
+ return floatingLabelPadding;
+ }
+
+ public MaterialEditText setFloatingLabelPadding(int padding) {
+ floatingLabelPadding = padding;
+ postInvalidate();
+ return this;
+ }
+
+ public boolean isFloatingLabelAnimating() {
+ return floatingLabelAnimating;
+ }
+
+ public MaterialEditText setFloatingLabelAnimating(boolean animating) {
+ floatingLabelAnimating = animating;
+ return this;
+ }
+
+ public MaterialEditText setSingleLineEllipsis() {
+ return setSingleLineEllipsis(true);
+ }
+
+ public MaterialEditText setSingleLineEllipsis(boolean enabled) {
+ singleLineEllipsis = enabled;
+ initMinBottomLines();
+ initPadding();
+ postInvalidate();
+ return this;
+ }
+
+ public int getMaxCharacters() {
+ return maxCharacters;
+ }
+
+ public MaterialEditText setMaxCharacters(int max) {
+ maxCharacters = max;
+ initMinBottomLines();
+ initPadding();
+ postInvalidate();
+ return this;
+ }
+
+ public int getMinCharacters() {
+ return minCharacters;
+ }
+
+ public MaterialEditText setMinCharacters(int min) {
+ minCharacters = min;
+ initMinBottomLines();
+ initPadding();
+ postInvalidate();
+ return this;
+ }
+
+ public int getMinBottomTextLines() {
+ return minBottomTextLines;
+ }
+
+ public MaterialEditText setMinBottomTextLines(int lines) {
+ minBottomTextLines = lines;
+ initMinBottomLines();
+ initPadding();
+ postInvalidate();
+ return this;
+ }
+
+ public boolean isAutoValidate() {
+ return autoValidate;
+ }
+
+ public MaterialEditText setAutoValidate(boolean autoValidate) {
+ this.autoValidate = autoValidate;
+ if (autoValidate) {
+ validate();
+ }
+ return this;
+ }
+
+ public int getErrorColor() {
+ return errorColor;
+ }
+
+ public MaterialEditText setErrorColor(int color) {
+ errorColor = color;
+ postInvalidate();
+ return this;
+ }
+
+ public MaterialEditText setHelperText(CharSequence helperText) {
+ this.helperText = helperText == null ? null : helperText.toString();
+ if (adjustBottomLines()) {
+ postInvalidate();
+ }
+ return this;
+ }
+
+ public String getHelperText() {
+ return helperText;
+ }
+
+ public int getHelperTextColor() {
+ return helperTextColor;
+ }
+
+ public MaterialEditText setHelperTextColor(int color) {
+ helperTextColor = color;
+ postInvalidate();
+ return this;
+ }
+
+ /**
+ * 设置输入框是否允许为空
+ *
+ * @param allowEmpty
+ * @param errorEmpty
+ * @return
+ */
+ public MaterialEditText setAllowEmpty(boolean allowEmpty, String errorEmpty) {
+ boolean updateError = false;
+ Iterator it = validators.iterator();
+ while (it.hasNext()) {
+ METValidator item = it.next();
+ if (item instanceof NotAllowEmptyValidator) {
+ if (allowEmpty) {
+ it.remove();
+ } else {
+ if (!TextUtils.isEmpty(errorEmpty)) {
+ item.setErrorMessage(errorEmpty);
+ } else {
+ item.setErrorMessage(ResUtils.getString(getContext(), R.string.xui_met_not_allow_empty));
+ }
+ updateError = true;
+ }
+ break;
+ }
+ }
+ if (!allowEmpty && !updateError) {
+ if (!TextUtils.isEmpty(errorEmpty)) {
+ validators.add(new NotAllowEmptyValidator(errorEmpty));
+ } else {
+ validators.add(new NotAllowEmptyValidator(ResUtils.getString(getContext(), R.string.xui_met_not_allow_empty)));
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public void setError(CharSequence errorText) {
+ tempErrorText = errorText == null ? null : errorText.toString();
+ if (adjustBottomLines()) {
+ postInvalidate();
+ }
+ }
+
+ @Override
+ public CharSequence getError() {
+ return tempErrorText;
+ }
+
+ /**
+ * only used to draw the bottom line
+ */
+ private boolean isInternalValid() {
+ return tempErrorText == null && isCharactersCountValid();
+ }
+
+ /**
+ * if the main text matches the regex
+ *
+ * @deprecated use the new validator interface to add your own custom validator
+ */
+ @Deprecated
+ public boolean isValid(String regex) {
+ if (regex == null) {
+ return false;
+ }
+ Pattern pattern = Pattern.compile(regex);
+ Matcher matcher = pattern.matcher(getText());
+ return matcher.matches();
+ }
+
+ /**
+ * check if the main text matches the regex, and set the error text if not.
+ *
+ * @return true if it matches the regex, false if not.
+ * @deprecated use the new validator interface to add your own custom validator
+ */
+ @Deprecated
+ public boolean validate(String regex, CharSequence errorText) {
+ boolean isValid = isValid(regex);
+ if (!isValid) {
+ setError(errorText);
+ }
+ postInvalidate();
+ return isValid;
+ }
+
+ /**
+ * Run validation on a single validator instance
+ *
+ * @param validator Validator to check
+ * @return True if valid, false if not
+ */
+ public boolean validateWith(@NonNull METValidator validator) {
+ CharSequence text = getText();
+ boolean isValid = validator.isValid(text, text.length() == 0);
+ if (!isValid) {
+ setError(validator.getErrorMessage());
+ }
+ postInvalidate();
+ return isValid;
+ }
+
+ /**
+ * Check all validators, sets the error text if not
+ *
+ * NOTE: this stops at the first validator to report invalid.
+ *
+ * @return True if all validators pass, false if not
+ */
+ public boolean validate() {
+ if (validators == null || validators.isEmpty()) {
+ return true;
+ }
+
+ CharSequence text = getText();
+ boolean isEmpty = TextUtils.isEmpty(text);
+
+ boolean isValid = true;
+ for (METValidator validator : validators) {
+ //noinspection ConstantConditions
+ isValid = isValid && validator.isValid(text, isEmpty);
+ if (!isValid) {
+ setError(validator.getErrorMessage());
+ break;
+ }
+ }
+ if (isValid) {
+ setError(null);
+ }
+
+ postInvalidate();
+ return isValid;
+ }
+
+ public boolean hasValidators() {
+ return this.validators != null && !this.validators.isEmpty();
+ }
+
+ /**
+ * Adds a new validator to the View's list of validators
+ *
+ * This will be checked with the others in {@link #validate()}
+ *
+ * @param validator Validator to add
+ * @return This instance, for easy chaining
+ */
+ public MaterialEditText addValidator(METValidator validator) {
+ if (validators == null) {
+ this.validators = new ArrayList<>();
+ }
+ this.validators.add(validator);
+ return this;
+ }
+
+ public MaterialEditText clearValidators() {
+ if (this.validators != null) {
+ this.validators.clear();
+ }
+ return this;
+ }
+
+ @Nullable
+ public List getValidators() {
+ return this.validators;
+ }
+
+ public MaterialEditText setLengthChecker(METLengthChecker lengthChecker) {
+ this.lengthChecker = lengthChecker;
+ return this;
+ }
+
+ /**
+ * 清除内容
+ */
+ public void clear() {
+ if (!TextUtils.isEmpty(getText())) {
+ setText(null);
+ }
+ }
+
+ /**
+ * 获取输入的内容
+ *
+ * @return
+ */
+ public String getEditValue() {
+ return getEditableText().toString().trim();
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ super.setFocusable(enabled);
+ super.setFocusableInTouchMode(enabled);
+ super.setEnabled(enabled);
+ }
+
+ /**
+ * 输入的内容是否为空
+ *
+ * @return
+ */
+ public boolean isEmpty() {
+ return TextUtils.isEmpty(getEditValue());
+ }
+
+ /**
+ * 输入的内容是否不为空
+ *
+ * @return
+ */
+ public boolean isNotEmpty() {
+ return !TextUtils.isEmpty(getEditValue());
+ }
+
+ @Override
+ public void setOnFocusChangeListener(OnFocusChangeListener listener) {
+ if (innerFocusChangeListener == null) {
+ super.setOnFocusChangeListener(listener);
+ } else {
+ outerFocusChangeListener = listener;
+ }
+ }
+
+ private ObjectAnimator getLabelAnimator() {
+ if (labelAnimator == null) {
+ labelAnimator = ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f);
+ }
+ labelAnimator.setDuration(floatingLabelAnimating ? 300 : 0);
+ return labelAnimator;
+ }
+
+ private ObjectAnimator getLabelFocusAnimator() {
+ if (labelFocusAnimator == null) {
+ labelFocusAnimator = ObjectAnimator.ofFloat(this, "focusFraction", 0f, 1f);
+ }
+ return labelFocusAnimator;
+ }
+
+ private ObjectAnimator getBottomLinesAnimator(float destBottomLines) {
+ if (bottomLinesAnimator == null) {
+ bottomLinesAnimator = ObjectAnimator.ofFloat(this, "currentBottomLines", destBottomLines);
+ } else {
+ bottomLinesAnimator.cancel();
+ bottomLinesAnimator.setFloatValues(destBottomLines);
+ }
+ return bottomLinesAnimator;
+ }
+
+ @Override
+ protected void onDraw(@NonNull Canvas canvas) {
+
+ int startX = getScrollX() + (getStartIcon() == null ? 0 : iconOuterWidth + iconPadding);
+ int endX = getScrollX() + (getEndIcon() == null ? getWidth() : getWidth() - iconOuterWidth - iconPadding);
+ int lineStartY = getScrollY() + getHeight() - getPaddingBottom();
+
+ // draw the icon(s)
+ drawIcons(canvas, startX, endX, lineStartY);
+
+ // draw the action button
+ drawActionButton(canvas, startX, endX, lineStartY);
+
+ // draw the underline
+ lineStartY = drawUnderline(canvas, startX, endX, lineStartY);
+
+ textPaint.setTextSize(bottomTextSize);
+ Paint.FontMetrics textMetrics = textPaint.getFontMetrics();
+ float relativeHeight = -textMetrics.ascent - textMetrics.descent;
+ float bottomTextPadding = bottomTextSize + textMetrics.ascent + textMetrics.descent;
+
+ // draw the characters counter
+ if ((hasFocus() && hasCharactersCounter()) || !isCharactersCountValid()) {
+ textPaint.setColor(isCharactersCountValid() ? (baseColor & 0x00ffffff | 0x44000000) : errorColor);
+ String charactersCounterText = getCharactersCounterText();
+ canvas.drawText(charactersCounterText, isRTL() ? startX : endX + getPaddingEnd() - textPaint.measureText(charactersCounterText), lineStartY + bottomSpacing + relativeHeight, textPaint);
+ }
+
+ // draw the bottom text
+ drawBottomText(canvas, startX, endX, lineStartY, bottomTextPadding);
+
+ // draw the floating label
+ drawFloatingLabel(canvas, startX, endX);
+
+ // draw the bottom ellipsis
+ drawBottomEllipsis(canvas, startX, endX, lineStartY);
+
+ // draw the original things
+ super.onDraw(canvas);
+ }
+
+ private Bitmap[] getStartIcon() {
+ return isRTL() ? iconRightBitmaps : iconLeftBitmaps;
+ }
+
+ private Bitmap[] getEndIcon() {
+ return isRTL() ? iconLeftBitmaps : iconRightBitmaps;
+ }
+
+ /**
+ * 画图标
+ *
+ * @param canvas
+ * @param startX
+ * @param endX
+ * @param lineStartY
+ */
+ private void drawIcons(@NonNull Canvas canvas, int startX, int endX, int lineStartY) {
+ paint.setAlpha(255);
+ if (getStartIcon() != null) {
+ Bitmap icon = getStartIcon()[!isInternalValid() ? 3 : !isEnabled() ? 2 : hasFocus() ? 1 : 0];
+ int iconLeft = startX - iconPadding - iconOuterWidth + (iconOuterWidth - icon.getWidth()) / 2;
+ int iconTop = lineStartY + bottomSpacing - iconOuterHeight + (iconOuterHeight - icon.getHeight()) / 2;
+ canvas.drawBitmap(icon, iconLeft, iconTop, paint);
+ }
+ if (getEndIcon() != null) {
+ Bitmap icon = getEndIcon()[!isInternalValid() ? 3 : !isEnabled() ? 2 : hasFocus() ? 1 : 0];
+ int iconRight = endX + iconPadding + (iconOuterWidth - icon.getWidth()) / 2;
+ int iconTop = lineStartY + bottomSpacing - iconOuterHeight + (iconOuterHeight - icon.getHeight()) / 2;
+ canvas.drawBitmap(icon, iconRight, iconTop, paint);
+ }
+ }
+
+ /**
+ * 画清除按钮
+ *
+ * @param canvas
+ * @param startX
+ * @param endX
+ * @param lineStartY
+ */
+ private void drawActionButton(@NonNull Canvas canvas, int startX, int endX, int lineStartY) {
+ if (hasFocus() && isEnabled() && !TextUtils.isEmpty(getText()) && (showClearButton || showPasswordButton)) {
+ paint.setAlpha(255);
+ int buttonLeft = isRTL() ? startX : endX - iconOuterWidth;
+ Bitmap actionButtonBitmap;
+ if (showClearButton) {
+ actionButtonBitmap = clearButtonBitmaps[0];
+ } else {
+ actionButtonBitmap = passwordVisible ? showPwIconBitmaps[0] : hidePwIconBitmaps[0];
+ }
+ int iconTop = lineStartY + bottomSpacing - iconOuterHeight + (iconOuterHeight - actionButtonBitmap.getHeight()) / 2;
+ canvas.drawBitmap(actionButtonBitmap, buttonLeft, iconTop, paint);
+ }
+ }
+
+ /**
+ * 画下划线
+ *
+ * @param canvas
+ * @param startX
+ * @param endX
+ * @param lineStartY
+ * @return
+ */
+ private int drawUnderline(@NonNull Canvas canvas, int startX, int endX, int lineStartY) {
+ if (!hideUnderline) {
+ lineStartY += bottomSpacing;
+ if (!isInternalValid()) { // not valid
+ paint.setColor(errorColor);
+ canvas.drawRect(startX, lineStartY, endX, lineStartY + underlineHeightFocused, paint);
+ } else if (!isEnabled()) { // disabled
+ paint.setColor(underlineColor != -1 ? underlineColor : baseColor & 0x00ffffff | 0x44000000);
+ float interval = getPixel(1);
+ for (float xOffset = 0; xOffset < getWidth(); xOffset += interval * 3) {
+ canvas.drawRect(startX + xOffset, lineStartY, startX + xOffset + interval, lineStartY + underlineHeight, paint);
+ }
+ } else if (hasFocus()) { // focused
+ paint.setColor(primaryColor);
+ canvas.drawRect(startX, lineStartY, endX, lineStartY + underlineHeightFocused, paint);
+ } else { // normal
+ paint.setColor(underlineColor != -1 ? underlineColor : baseColor & 0x00ffffff | 0x1E000000);
+ canvas.drawRect(startX, lineStartY, endX, lineStartY + underlineHeight, paint);
+ }
+ }
+ return lineStartY;
+ }
+
+ /**
+ * 画底部文字
+ *
+ * @param canvas
+ * @param startX
+ * @param endX
+ * @param lineStartY
+ * @param bottomTextPadding
+ */
+ private void drawBottomText(@NonNull Canvas canvas, int startX, int endX, int lineStartY, float bottomTextPadding) {
+ if (textLayout != null) {
+ if (tempErrorText != null || ((helperTextAlwaysShown || hasFocus()) && !TextUtils.isEmpty(helperText))) { // error text or helper text
+ textPaint.setColor(tempErrorText != null ? errorColor : helperTextColor != -1 ? helperTextColor : (baseColor & 0x00ffffff | 0x44000000));
+ canvas.save();
+ if (isRTL()) {
+ canvas.translate(endX - textLayout.getWidth(), lineStartY + bottomSpacing - bottomTextPadding);
+ } else {
+ canvas.translate(startX + getBottomTextLeftOffset(), lineStartY + bottomSpacing - bottomTextPadding);
+ }
+ textLayout.draw(canvas);
+ canvas.restore();
+ }
+ }
+ }
+
+ private void drawFloatingLabel(@NonNull Canvas canvas, int startX, int endX) {
+ if (floatingLabelEnabled && !TextUtils.isEmpty(floatingLabelText)) {
+ textPaint.setTextSize(floatingLabelTextSize);
+ // calculate the text color
+ textPaint.setColor((Integer) focusEvaluator.evaluate(focusFraction * (isEnabled() ? 1 : 0), floatingLabelTextColor != -1 ? floatingLabelTextColor : (baseColor & 0x00ffffff | 0x44000000), primaryColor));
+
+ // calculate the horizontal position
+ float floatingLabelWidth = textPaint.measureText(floatingLabelText.toString());
+ int floatingLabelStartX;
+ if ((getGravity() & Gravity.RIGHT) == Gravity.RIGHT || isRTL()) {
+ floatingLabelStartX = (int) (endX - floatingLabelWidth);
+ } else if ((getGravity() & Gravity.LEFT) == Gravity.LEFT) {
+ floatingLabelStartX = startX;
+ } else {
+ floatingLabelStartX = startX + (int) (getInnerPaddingLeft() + (getWidth() - getInnerPaddingLeft() - getInnerPaddingRight() - floatingLabelWidth) / 2);
+ }
+
+ // calculate the vertical position
+ int distance = floatingLabelPadding;
+ int floatingLabelStartY = (int) (innerPaddingTop + floatingLabelTextSize + floatingLabelPadding - distance * (floatingLabelAlwaysShown ? 1 : floatingLabelFraction) + getScrollY());
+
+ // calculate the alpha
+ int alpha = ((int) ((floatingLabelAlwaysShown ? 1 : floatingLabelFraction) * 0xff * (0.74f * focusFraction * (isEnabled() ? 1 : 0) + 0.26f) * (floatingLabelTextColor != -1 ? 1 : Color.alpha(floatingLabelTextColor) / 255F)));
+ textPaint.setAlpha(alpha);
+
+ // draw the floating label
+ canvas.drawText(floatingLabelText.toString(), floatingLabelStartX, floatingLabelStartY, textPaint);
+ }
+ }
+
+ private void drawBottomEllipsis(@NonNull Canvas canvas, int startX, int endX, int lineStartY) {
+ if (hasFocus() && singleLineEllipsis && getScrollX() != 0) {
+ paint.setColor(isInternalValid() ? primaryColor : errorColor);
+ float startY = lineStartY + bottomSpacing;
+ int ellipsisStartX;
+ if (isRTL()) {
+ ellipsisStartX = endX;
+ } else {
+ ellipsisStartX = startX;
+ }
+ int signum = isRTL() ? -1 : 1;
+ canvas.drawCircle(ellipsisStartX + signum * bottomEllipsisSize / 2F, startY + bottomEllipsisSize / 2F, bottomEllipsisSize / 2F, paint);
+ canvas.drawCircle(ellipsisStartX + signum * bottomEllipsisSize * 5 / 2F, startY + bottomEllipsisSize / 2F, bottomEllipsisSize / 2F, paint);
+ canvas.drawCircle(ellipsisStartX + signum * bottomEllipsisSize * 9 / 2F, startY + bottomEllipsisSize / 2F, bottomEllipsisSize / 2F, paint);
+ }
+ }
+
+ private boolean isRTL() {
+ return getLayoutDirection() == LAYOUT_DIRECTION_RTL;
+ }
+
+ private int getBottomTextLeftOffset() {
+ return isRTL() ? getCharactersCounterWidth() : getBottomEllipsisWidth();
+ }
+
+ private int getBottomTextRightOffset() {
+ return isRTL() ? getBottomEllipsisWidth() : getCharactersCounterWidth();
+ }
+
+ private int getCharactersCounterWidth() {
+ return hasCharactersCounter() ? (int) textPaint.measureText(getCharactersCounterText()) : 0;
+ }
+
+ private int getBottomEllipsisWidth() {
+ return singleLineEllipsis ? (bottomEllipsisSize * 5 + getPixel(4)) : 0;
+ }
+
+ private void checkCharactersCount() {
+ if ((!firstShown && !checkCharactersCountAtBeginning) || !hasCharactersCounter()) {
+ charactersCountValid = true;
+ } else {
+ CharSequence text = getText();
+ int count = text == null ? 0 : checkLength(text);
+ charactersCountValid = (count >= minCharacters && (maxCharacters <= 0 || count <= maxCharacters));
+ }
+ }
+
+ public boolean isCharactersCountValid() {
+ return charactersCountValid;
+ }
+
+ private boolean hasCharactersCounter() {
+ return minCharacters > 0 || maxCharacters > 0;
+ }
+
+ private String getCharactersCounterText() {
+ String text;
+ if (minCharacters <= 0) {
+ text = isRTL() ? maxCharacters + " / " + checkLength(getText()) : checkLength(getText()) + " / " + maxCharacters;
+ } else if (maxCharacters <= 0) {
+ text = isRTL() ? "+" + minCharacters + " / " + checkLength(getText()) : checkLength(getText()) + " / " + minCharacters + "+";
+ } else {
+ text = isRTL() ? maxCharacters + "-" + minCharacters + " / " + checkLength(getText()) : checkLength(getText()) + " / " + minCharacters + "-" + maxCharacters;
+ }
+ return text;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (singleLineEllipsis && getScrollX() > 0 && event.getAction() == MotionEvent.ACTION_DOWN && event.getX() < getPixel(4 * 5) && event.getY() > getHeight() - extraPaddingBottom - innerPaddingBottom && event.getY() < getHeight() - innerPaddingBottom) {
+ setSelection(0);
+ return false;
+ }
+ if (hasFocus() && (showClearButton || showPasswordButton) && isEnabled()) {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ if (insideActionButton(event)) {
+ actionButtonTouched = true;
+ actionButtonClicking = true;
+ return true;
+ }
+ case MotionEvent.ACTION_MOVE:
+ if (actionButtonClicking && !insideActionButton(event)) {
+ actionButtonClicking = false;
+ }
+ if (actionButtonTouched) {
+ return true;
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (actionButtonClicking) {
+ if (showClearButton) {
+ if (!TextUtils.isEmpty(getText())) {
+ setText(null);
+ }
+ } else {
+ togglePasswordIconVisibility();
+ }
+ actionButtonClicking = false;
+ }
+ if (actionButtonTouched) {
+ actionButtonTouched = false;
+ return true;
+ }
+ actionButtonTouched = false;
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ actionButtonTouched = false;
+ actionButtonClicking = false;
+ break;
+ default:
+ break;
+ }
+ }
+ return super.onTouchEvent(event);
+ }
+
+ private boolean insideActionButton(MotionEvent event) {
+ float x = event.getX();
+ float y = event.getY();
+ int startX = getStartIcon() == null ? 0 : iconOuterWidth + iconPadding;
+ int endX = getEndIcon() == null ? getWidth() : getWidth() - iconOuterWidth - iconPadding;
+ int buttonLeft = isRTL() ? startX : endX - iconOuterWidth;
+ int buttonTop = getScrollY() + getHeight() - getPaddingBottom() + bottomSpacing - iconOuterHeight;
+ return (x >= buttonLeft && x < buttonLeft + iconOuterWidth && y >= buttonTop && y < buttonTop + iconOuterHeight);
+ }
+
+ /**
+ * 密码显示切换
+ */
+ private void handleSwitchPasswordInputVisibility() {
+ int selectionStart = getSelectionStart();
+ int selectionEnd = getSelectionEnd();
+ if (passwordVisible) {
+ setTransformationMethod(null);
+ } else {
+ setTransformationMethod(mTransformationMethod);
+
+ }
+ setSelection(selectionStart, selectionEnd);
+ }
+
+ /**
+ * 密码显示切换
+ */
+ private void togglePasswordIconVisibility() {
+ passwordVisible = !passwordVisible;
+ handleSwitchPasswordInputVisibility();
+ }
+
+ private int checkLength(CharSequence text) {
+ if (lengthChecker == null) {
+ return text.length();
+ }
+ return lengthChecker.getLength(text);
+ }
+
+ @Override
+ public void setTypeface(Typeface typeface) {
+ super.setTypeface(typeface);
+ if (textPaint != null) {
+ textPaint.setTypeface(typeface);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/METLengthChecker.java b/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/METLengthChecker.java
new file mode 100644
index 0000000..6ac786f
--- /dev/null
+++ b/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/METLengthChecker.java
@@ -0,0 +1,13 @@
+package com.project.survey.widget.edittext.materialedittext.validation;
+
+/**
+ * 长度验证
+ *
+ * @author xuexiang
+ * @since 2018/11/26 下午5:06
+ */
+public abstract class METLengthChecker {
+
+ public abstract int getLength(CharSequence text);
+
+}
diff --git a/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/METValidator.java b/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/METValidator.java
new file mode 100644
index 0000000..af86cd5
--- /dev/null
+++ b/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/METValidator.java
@@ -0,0 +1,43 @@
+package com.project.survey.widget.edittext.materialedittext.validation;
+
+import androidx.annotation.NonNull;
+
+/**
+ * 自定义校验器
+ *
+ * @author xuexiang
+ * @since 2018/11/26 下午5:06
+ */
+public abstract class METValidator {
+
+ /**
+ * Error message that the view will display if validation fails.
+ *
+ * This is protected, so you can change this dynamically in your {@link #isValid(CharSequence, boolean)}
+ * implementation. If necessary, you can also interact with this via its getter and setter.
+ */
+ protected String errorMessage;
+
+ public METValidator(@NonNull String errorMessage) {
+ this.errorMessage = errorMessage;
+ }
+
+ public void setErrorMessage(@NonNull String errorMessage) {
+ this.errorMessage = errorMessage;
+ }
+
+ @NonNull
+ public String getErrorMessage() {
+ return this.errorMessage;
+ }
+
+ /**
+ * Abstract method to implement your own validation checking.
+ *
+ * @param text The CharSequence representation of the text in the EditText field. Cannot be null, but may be empty.
+ * @param isEmpty Boolean indicating whether or not the text param is empty
+ * @return True if valid, false if not
+ */
+ public abstract boolean isValid(@NonNull CharSequence text, boolean isEmpty);
+
+}
diff --git a/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/NotAllowEmptyValidator.java b/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/NotAllowEmptyValidator.java
new file mode 100644
index 0000000..f3614dd
--- /dev/null
+++ b/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/NotAllowEmptyValidator.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.project.survey.widget.edittext.materialedittext.validation;
+
+import androidx.annotation.NonNull;
+
+/**
+ * 非空检验
+ *
+ * @author xuexiang
+ * @since 2019/5/14 10:27
+ */
+public class NotAllowEmptyValidator extends METValidator {
+
+ public NotAllowEmptyValidator(@NonNull String errorMessage) {
+ super(errorMessage);
+ }
+
+ @Override
+ public boolean isValid(@NonNull CharSequence text, boolean isEmpty) {
+ return !isEmpty;
+ }
+}
diff --git a/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/RegexpValidator.java b/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/RegexpValidator.java
new file mode 100644
index 0000000..be787b5
--- /dev/null
+++ b/app/src/main/java/com/project/survey/widget/edittext/materialedittext/validation/RegexpValidator.java
@@ -0,0 +1,31 @@
+package com.project.survey.widget.edittext.materialedittext.validation;
+
+import androidx.annotation.NonNull;
+
+import java.util.regex.Pattern;
+
+/**
+ * 正则表达式验证
+ *
+ * @author xuexiang
+ * @since 2018/11/26 下午5:06
+ */
+public class RegexpValidator extends METValidator {
+
+ private Pattern pattern;
+
+ public RegexpValidator(@NonNull String errorMessage, @NonNull String regex) {
+ super(errorMessage);
+ pattern = Pattern.compile(regex);
+ }
+
+ public RegexpValidator(@NonNull String errorMessage, @NonNull Pattern pattern) {
+ super(errorMessage);
+ this.pattern = pattern;
+ }
+
+ @Override
+ public boolean isValid(@NonNull CharSequence text, boolean isEmpty) {
+ return pattern.matcher(text).matches();
+ }
+}
diff --git a/app/src/main/java/com/project/survey/widget/util/Utils.java b/app/src/main/java/com/project/survey/widget/util/Utils.java
new file mode 100644
index 0000000..fa10410
--- /dev/null
+++ b/app/src/main/java/com/project/survey/widget/util/Utils.java
@@ -0,0 +1,470 @@
+/*
+ * Copyright (C) 2018 xuexiangjys(xuexiangjys@163.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.project.survey.widget.util;
+
+import android.annotation.SuppressLint;
+import android.app.Application;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.LightingColorFilter;
+import android.graphics.Matrix;
+import android.graphics.PixelFormat;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.RelativeLayout.LayoutParams;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.Nullable;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * 工具类(不建议外部调用)
+ *
+ * @author xuexiang
+ * @since 2018/11/26 下午5:07
+ */
+public final class Utils {
+
+ private Utils() {
+ throw new UnsupportedOperationException("u can't instantiate me...");
+ }
+
+ /**
+ * 得到设备屏幕的宽度
+ */
+ public static int getScreenWidth(Context context) {
+ return context.getResources().getDisplayMetrics().widthPixels;
+ }
+
+ /**
+ * 得到设备屏幕的高度
+ */
+ public static int getScreenHeight(Context context) {
+ return context.getResources().getDisplayMetrics().heightPixels;
+ }
+
+ private static final String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height";
+
+ /**
+ * 计算状态栏高度 getStatusBarHeight
+ *
+ * @param context 上下文
+ * @return 状态栏高度
+ */
+ public static int getStatusBarHeight(Context context) {
+ if (context == null) {
+ return getStatusBarHeight();
+ }
+ return getInternalDimensionSize(context.getResources(),
+ STATUS_BAR_HEIGHT_RES_NAME);
+ }
+
+ /**
+ * 计算状态栏高度 getStatusBarHeight
+ *
+ * @return 状态栏高度
+ */
+ public static int getStatusBarHeight() {
+ return getInternalDimensionSize(Resources.getSystem(),
+ STATUS_BAR_HEIGHT_RES_NAME);
+ }
+
+ private static int getInternalDimensionSize(Resources res, String key) {
+ int result = 0;
+ int resourceId = res.getIdentifier(key, "dimen", "android");
+ if (resourceId > 0) {
+ result = res.getDimensionPixelSize(resourceId);
+ }
+ return result;
+ }
+
+ /**
+ * get ListView height according to every children
+ *
+ * @param view
+ * @return
+ */
+ public static int getListViewHeightBasedOnChildren(ListView view) {
+ int height = getAbsListViewHeightBasedOnChildren(view);
+ ListAdapter adapter;
+ int adapterCount;
+ if (view != null && (adapter = view.getAdapter()) != null
+ && (adapterCount = adapter.getCount()) > 0) {
+ height += view.getDividerHeight() * (adapterCount - 1);
+ }
+ return height;
+ }
+
+ /**
+ * get AbsListView height according to every children
+ *
+ * @param view
+ * @return
+ */
+ public static int getAbsListViewHeightBasedOnChildren(AbsListView view) {
+ ListAdapter adapter;
+ if (view == null || (adapter = view.getAdapter()) == null) {
+ return 0;
+ }
+
+ int height = 0;
+ for (int i = 0; i < adapter.getCount(); i++) {
+ View item = adapter.getView(i, null, view);
+ if (item instanceof ViewGroup) {
+ item.setLayoutParams(new LayoutParams(
+ LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
+ }
+ item.measure(0, 0);
+ height += item.getMeasuredHeight();
+ }
+ height += view.getPaddingTop() + view.getPaddingBottom();
+ return height;
+ }
+
+ /**
+ * View设备背景
+ *
+ * @param context 上下文
+ * @param view 控件
+ * @param resId 资源id
+ */
+ public static void setBackground(Context context, View view, int resId) {
+ if (view == null) {
+ return;
+ }
+ Bitmap bm = BitmapFactory.decodeResource(context.getResources(), resId);
+ BitmapDrawable bd = new BitmapDrawable(context.getResources(), bm);
+ view.setBackground(bd);
+ }
+
+ /**
+ * 释放图片资源
+ *
+ * @param view 控件
+ */
+ public static void recycleBackground(View view) {
+ Drawable d = view.getBackground();
+ //别忘了把背景设为null,避免onDraw刷新背景时候出现used a recycled bitmap错误
+ view.setBackgroundResource(0);
+ if (d != null && d instanceof BitmapDrawable) {
+ Bitmap bmp = ((BitmapDrawable) d).getBitmap();
+ if (bmp != null && !bmp.isRecycled()) {
+ bmp.recycle();
+ }
+ }
+ if (d != null) {
+ d.setCallback(null);
+ }
+ }
+
+ /**
+ * 遍历View,清除所有ImageView的缓存
+ *
+ * @param view
+ */
+ public static void clearImageView(View view) {
+ if (view instanceof ViewGroup) {
+ ViewGroup parent = (ViewGroup) view;
+ int count = parent.getChildCount();
+ for (int i = 0; i < count; i++) {
+ clearImageView(parent.getChildAt(i));
+ }
+ } else if (view instanceof ImageView) {
+ clearImgMemory((ImageView) view);
+ }
+ }
+
+ /**
+ * 清空图片的内存
+ */
+ public static void clearImgMemory(ImageView imageView) {
+ Drawable d = imageView.getDrawable();
+ if (d != null && d instanceof BitmapDrawable) {
+ Bitmap bmp = ((BitmapDrawable) d).getBitmap();
+ if (bmp != null && !bmp.isRecycled()) {
+ bmp.recycle();
+ }
+ }
+ imageView.setImageBitmap(null);
+ if (d != null) {
+ d.setCallback(null);
+ }
+ }
+
+ /**
+ * 放大缩小图片
+ *
+ * @param bitmap 源Bitmap
+ * @param w 宽
+ * @param h 高
+ * @return 目标Bitmap
+ */
+ public static Bitmap zoom(Bitmap bitmap, int w, int h) {
+ int width = bitmap.getWidth();
+ int height = bitmap.getHeight();
+ Matrix matrix = new Matrix();
+ float scaleWidth = ((float) w / width);
+ float scaleHeight = ((float) h / height);
+ matrix.postScale(scaleWidth, scaleHeight);
+ return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
+ }
+
+ /**
+ * 安静关闭 IO
+ *
+ * @param closeables closeables
+ */
+ public static void closeIOQuietly(final Closeable... closeables) {
+ if (closeables == null) {
+ return;
+ }
+ for (Closeable closeable : closeables) {
+ if (closeable != null) {
+ try {
+ closeable.close();
+ } catch (IOException ignored) {
+ }
+ }
+ }
+ }
+
+ /**
+ * Indicates if this file represents a file on the underlying file system.
+ *
+ * @param filePath 文件路径
+ * @return 是否存在文件
+ */
+ public static boolean isFileExist(String filePath) {
+ if (TextUtils.isEmpty(filePath)) {
+ return false;
+ }
+
+ File file = new File(filePath);
+ return (file.exists() && file.isFile());
+ }
+
+ /**
+ * 获取bitmap
+ *
+ * @param filePath 文件路径
+ * @return bitmap
+ */
+ public static Bitmap getBitmap(String filePath) {
+ if (!isFileExist(filePath)) {
+ return null;
+ }
+ return BitmapFactory.decodeFile(filePath);
+ }
+
+ /**
+ * 检查是否为空指针
+ *
+ * @param object
+ * @param hint
+ */
+ public static void checkNull(Object object, String hint) {
+ if (null == object) {
+ throw new NullPointerException(hint);
+ }
+ }
+
+ /**
+ * 检查是否为空指针
+ *
+ * @param t
+ * @param message
+ */
+ public static T checkNotNull(T t, String message) {
+ if (t == null) {
+ throw new NullPointerException(message);
+ }
+ return t;
+ }
+
+ /**
+ * 旋转图片
+ *
+ * @param angle 旋转角度
+ * @param bitmap 要旋转的图片
+ * @return 旋转后的图片
+ */
+ public static Bitmap rotate(Bitmap bitmap, int angle) {
+ Matrix matrix = new Matrix();
+ matrix.postRotate(angle);
+ return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
+ bitmap.getHeight(), matrix, true);
+ }
+
+ /**
+ * 将Drawable转化为Bitmap
+ *
+ * @param drawable Drawable
+ * @return Bitmap
+ */
+ public static Bitmap getBitmapFromDrawable(Drawable drawable) {
+ int width = drawable.getIntrinsicWidth();
+ int height = drawable.getIntrinsicHeight();
+ Bitmap bitmap = Bitmap.createBitmap(width, height, drawable
+ .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
+ : Bitmap.Config.RGB_565);
+ Canvas canvas = new Canvas(bitmap);
+ drawable.setBounds(0, 0, width, height);
+ drawable.draw(canvas);
+ return bitmap;
+ }
+
+ /**
+ * 将Drawable转化为Bitmap
+ *
+ * @param drawable Drawable
+ * @return Bitmap
+ */
+ public static Bitmap getBitmapFromDrawable(Drawable drawable, int color) {
+ int width = drawable.getIntrinsicWidth();
+ int height = drawable.getIntrinsicHeight();
+ Bitmap bitmap = Bitmap.createBitmap(width, height, drawable
+ .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
+ : Bitmap.Config.RGB_565);
+ Canvas canvas = new Canvas(bitmap);
+ canvas.drawColor(color, PorterDuff.Mode.SRC_IN);
+ drawable.setBounds(0, 0, width, height);
+ drawable.draw(canvas);
+
+ bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
+ canvas = new Canvas(bitmap);
+ canvas.drawColor(color, PorterDuff.Mode.SRC_IN);
+ return bitmap;
+ }
+
+ /**
+ * 获取应用的图标
+ *
+ * @param context
+ * @return
+ */
+ public static Drawable getAppIcon(Context context) {
+ try {
+ PackageManager pm = context.getPackageManager();
+ ApplicationInfo info = pm.getApplicationInfo(context.getPackageName(), 0);
+ return info.loadIcon(pm);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 支持?attrs属性 http://stackoverflow.com/questions/27986204 :As mentioned here on API < 21 you can't use attrs to color in xml drawable.
+ *
+ * @return 支持?attrs属性
+ */
+ public static boolean isSupportColorAttrs() {
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
+ }
+
+ public static boolean isLight(int color) {
+ return Math.sqrt(
+ Color.red(color) * Color.red(color) * .241 +
+ Color.green(color) * Color.green(color) * .691 +
+ Color.blue(color) * Color.blue(color) * .068) > 130;
+ }
+
+ public static boolean isNullOrEmpty(@Nullable CharSequence string) {
+ return string == null || string.length() == 0;
+ }
+
+ /**
+ * 获取数值的位数,例如9返回1,99返回2,999返回3
+ *
+ * @param number 要计算位数的数值,必须>0
+ * @return 数值的位数,若传的参数小于等于0,则返回0
+ */
+ public static int getNumberDigits(int number) {
+ if (number <= 0) {
+ return 0;
+ }
+ return (int) (Math.log10(number) + 1);
+ }
+
+ /**
+ * 设置Drawable的颜色
+ * 这里不对Drawable进行mutate(),会影响到所有用到这个Drawable的地方,如果要避免,请先自行mutate()
+ */
+ public static ColorFilter setDrawableTintColor(Drawable drawable, @ColorInt int tintColor) {
+ LightingColorFilter colorFilter = new LightingColorFilter(Color.argb(255, 0, 0, 0), tintColor);
+ if (drawable != null) {
+ drawable.setColorFilter(colorFilter);
+ }
+ return colorFilter;
+ }
+
+ public static Application getApplicationByReflect() {
+ try {
+ @SuppressLint("PrivateApi")
+ Class> activityThread = Class.forName("android.app.ActivityThread");
+ Object thread = activityThread.getMethod("currentActivityThread").invoke(null);
+ Object app = activityThread.getMethod("getApplication").invoke(thread);
+ if (app == null) {
+ throw new NullPointerException("you should init first");
+ }
+ return (Application) app;
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ throw new NullPointerException("you should init first");
+ }
+
+ /**
+ * 类型强转
+ *
+ * @param object 需要强转的对象
+ * @param clazz 需要强转的类型
+ * @param
+ * @return 类型强转结果
+ */
+ public static T cast(final Object object, Class clazz) {
+ return clazz != null && clazz.isInstance(object) ? (T) object : null;
+ }
+
+}
diff --git a/app/src/main/res/drawable/about.xml b/app/src/main/res/drawable/about.xml
new file mode 100644
index 0000000..78b5cf0
--- /dev/null
+++ b/app/src/main/res/drawable/about.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/arrow_right.xml b/app/src/main/res/drawable/arrow_right.xml
new file mode 100644
index 0000000..1108b51
--- /dev/null
+++ b/app/src/main/res/drawable/arrow_right.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/bg_btn_login.xml b/app/src/main/res/drawable/bg_btn_login.xml
new file mode 100644
index 0000000..ddbf5b9
--- /dev/null
+++ b/app/src/main/res/drawable/bg_btn_login.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_pwd_sc.xml b/app/src/main/res/drawable/bg_pwd_sc.xml
new file mode 100644
index 0000000..e3cab8d
--- /dev/null
+++ b/app/src/main/res/drawable/bg_pwd_sc.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_top_blue.xml b/app/src/main/res/drawable/bg_top_blue.xml
index 56d44a6..059ace1 100644
--- a/app/src/main/res/drawable/bg_top_blue.xml
+++ b/app/src/main/res/drawable/bg_top_blue.xml
@@ -4,5 +4,5 @@
+ android:startColor="@color/colorPrimary" />
\ No newline at end of file
diff --git a/app/src/main/res/drawable/change_pwd.xml b/app/src/main/res/drawable/change_pwd.xml
new file mode 100644
index 0000000..451b75d
--- /dev/null
+++ b/app/src/main/res/drawable/change_pwd.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/login_error.xml b/app/src/main/res/drawable/login_error.xml
new file mode 100644
index 0000000..edef016
--- /dev/null
+++ b/app/src/main/res/drawable/login_error.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/pet_icon_visibility_24dp.xml b/app/src/main/res/drawable/pet_icon_visibility_24dp.xml
new file mode 100644
index 0000000..f152113
--- /dev/null
+++ b/app/src/main/res/drawable/pet_icon_visibility_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/pet_icon_visibility_off_24dp.xml b/app/src/main/res/drawable/pet_icon_visibility_off_24dp.xml
new file mode 100644
index 0000000..5d7e38b
--- /dev/null
+++ b/app/src/main/res/drawable/pet_icon_visibility_off_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/pwd_hide.xml b/app/src/main/res/drawable/pwd_hide.xml
new file mode 100644
index 0000000..921dbc2
--- /dev/null
+++ b/app/src/main/res/drawable/pwd_hide.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/pwd_show.xml b/app/src/main/res/drawable/pwd_show.xml
new file mode 100644
index 0000000..756ac6f
--- /dev/null
+++ b/app/src/main/res/drawable/pwd_show.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/switch_project.xml b/app/src/main/res/drawable/switch_project.xml
new file mode 100644
index 0000000..c3c9fdc
--- /dev/null
+++ b/app/src/main/res/drawable/switch_project.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/xui_ic_default_clear_btn.xml b/app/src/main/res/drawable/xui_ic_default_clear_btn.xml
new file mode 100644
index 0000000..966fbb6
--- /dev/null
+++ b/app/src/main/res/drawable/xui_ic_default_clear_btn.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..be99bca
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_me.xml b/app/src/main/res/layout/fragment_me.xml
index 87f3ffd..f26c206 100644
--- a/app/src/main/res/layout/fragment_me.xml
+++ b/app/src/main/res/layout/fragment_me.xml
@@ -1,11 +1,183 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/line_hor.xml b/app/src/main/res/layout/line_hor.xml
new file mode 100644
index 0000000..efb6aff
--- /dev/null
+++ b/app/src/main/res/layout/line_hor.xml
@@ -0,0 +1,5 @@
+
+
diff --git a/app/src/main/res/layout/toolbar.xml b/app/src/main/res/layout/toolbar.xml
new file mode 100644
index 0000000..6d3719e
--- /dev/null
+++ b/app/src/main/res/layout/toolbar.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/values-sw300dp/dimens.xml b/app/src/main/res/values-sw300dp/dimens.xml
index 91a7601..1cc250f 100644
--- a/app/src/main/res/values-sw300dp/dimens.xml
+++ b/app/src/main/res/values-sw300dp/dimens.xml
@@ -1082,6 +1082,7 @@
-1.67dp
-0.83dp
0.0dp
+ 0.42dp
0.83dp
1.67dp
2.5dp
diff --git a/app/src/main/res/values-sw320dp/dimens.xml b/app/src/main/res/values-sw320dp/dimens.xml
index b99f44d..56962d5 100644
--- a/app/src/main/res/values-sw320dp/dimens.xml
+++ b/app/src/main/res/values-sw320dp/dimens.xml
@@ -1082,6 +1082,7 @@
-1.78dp
-0.89dp
0.0dp
+ 0.45dp
0.89dp
1.78dp
2.67dp
diff --git a/app/src/main/res/values-sw340dp/dimens.xml b/app/src/main/res/values-sw340dp/dimens.xml
index 3c51bb4..8c37631 100644
--- a/app/src/main/res/values-sw340dp/dimens.xml
+++ b/app/src/main/res/values-sw340dp/dimens.xml
@@ -1082,6 +1082,7 @@
-1.89dp
-0.94dp
0.0dp
+ 0.47dp
0.94dp
1.89dp
2.83dp
diff --git a/app/src/main/res/values-sw360dp/dimens.xml b/app/src/main/res/values-sw360dp/dimens.xml
index ae760e5..134ddf2 100644
--- a/app/src/main/res/values-sw360dp/dimens.xml
+++ b/app/src/main/res/values-sw360dp/dimens.xml
@@ -1082,6 +1082,7 @@
-2.0dp
-1.0dp
0.0dp
+ 0.5dp
1.0dp
2.0dp
3.0dp
diff --git a/app/src/main/res/values-sw380dp/dimens.xml b/app/src/main/res/values-sw380dp/dimens.xml
index 68e0655..f74e1ec 100644
--- a/app/src/main/res/values-sw380dp/dimens.xml
+++ b/app/src/main/res/values-sw380dp/dimens.xml
@@ -1082,6 +1082,7 @@
-2.11dp
-1.06dp
0.0dp
+ 0.53dp
1.06dp
2.11dp
3.17dp
diff --git a/app/src/main/res/values-sw400dp/dimens.xml b/app/src/main/res/values-sw400dp/dimens.xml
index 4cdeb60..648c2b9 100644
--- a/app/src/main/res/values-sw400dp/dimens.xml
+++ b/app/src/main/res/values-sw400dp/dimens.xml
@@ -1082,6 +1082,7 @@
-2.22dp
-1.11dp
0.0dp
+ 0.56dp
1.11dp
2.22dp
3.33dp
diff --git a/app/src/main/res/values-sw410dp/dimens.xml b/app/src/main/res/values-sw410dp/dimens.xml
index 3275786..63efb7a 100644
--- a/app/src/main/res/values-sw410dp/dimens.xml
+++ b/app/src/main/res/values-sw410dp/dimens.xml
@@ -1082,6 +1082,7 @@
-2.28dp
-1.14dp
0.0dp
+ 0.57dp
1.14dp
2.28dp
3.42dp
diff --git a/app/src/main/res/values-sw420dp/dimens.xml b/app/src/main/res/values-sw420dp/dimens.xml
index 023d750..ec47fba 100644
--- a/app/src/main/res/values-sw420dp/dimens.xml
+++ b/app/src/main/res/values-sw420dp/dimens.xml
@@ -1,2261 +1,2262 @@
- -1260.36dp
- -1259.19dp
- -1258.03dp
- -1256.86dp
- -1255.69dp
- -1254.53dp
- -1253.36dp
- -1252.19dp
- -1251.02dp
- -1249.86dp
- -1248.69dp
- -1247.52dp
- -1246.36dp
- -1245.19dp
- -1244.02dp
- -1242.86dp
- -1241.69dp
- -1240.52dp
- -1239.35dp
- -1238.19dp
- -1237.02dp
- -1235.85dp
- -1234.69dp
- -1233.52dp
- -1232.35dp
- -1231.18dp
- -1230.02dp
- -1228.85dp
- -1227.68dp
- -1226.52dp
- -1225.35dp
- -1224.18dp
- -1223.02dp
- -1221.85dp
- -1220.68dp
- -1219.52dp
- -1218.35dp
- -1217.18dp
- -1216.01dp
- -1214.85dp
- -1213.68dp
- -1212.51dp
- -1211.35dp
- -1210.18dp
- -1209.01dp
- -1207.85dp
- -1206.68dp
- -1205.51dp
- -1204.34dp
- -1203.18dp
- -1202.01dp
- -1200.84dp
- -1199.68dp
- -1198.51dp
- -1197.34dp
- -1196.17dp
- -1195.01dp
- -1193.84dp
- -1192.67dp
- -1191.51dp
- -1190.34dp
- -1189.17dp
- -1188.01dp
- -1186.84dp
- -1185.67dp
- -1184.51dp
- -1183.34dp
- -1182.17dp
- -1181.0dp
- -1179.84dp
- -1178.67dp
- -1177.5dp
- -1176.34dp
- -1175.17dp
- -1174.0dp
- -1172.84dp
- -1171.67dp
- -1170.5dp
- -1169.33dp
- -1168.17dp
- -1167.0dp
- -1165.83dp
- -1164.67dp
- -1163.5dp
- -1162.33dp
- -1161.16dp
- -1160.0dp
- -1158.83dp
- -1157.66dp
- -1156.5dp
- -1155.33dp
- -1154.16dp
- -1153.0dp
- -1151.83dp
- -1150.66dp
- -1149.5dp
- -1148.33dp
- -1147.16dp
- -1145.99dp
- -1144.83dp
- -1143.66dp
- -1142.49dp
- -1141.33dp
- -1140.16dp
- -1138.99dp
- -1137.83dp
- -1136.66dp
- -1135.49dp
- -1134.32dp
- -1133.16dp
- -1131.99dp
- -1130.82dp
- -1129.66dp
- -1128.49dp
- -1127.32dp
- -1126.15dp
- -1124.99dp
- -1123.82dp
- -1122.65dp
- -1121.49dp
- -1120.32dp
- -1119.15dp
- -1117.99dp
- -1116.82dp
- -1115.65dp
- -1114.49dp
- -1113.32dp
- -1112.15dp
- -1110.98dp
- -1109.82dp
- -1108.65dp
- -1107.48dp
- -1106.32dp
- -1105.15dp
- -1103.98dp
- -1102.82dp
- -1101.65dp
- -1100.48dp
- -1099.31dp
- -1098.15dp
- -1096.98dp
- -1095.81dp
- -1094.65dp
- -1093.48dp
- -1092.31dp
- -1091.14dp
- -1089.98dp
- -1088.81dp
- -1087.64dp
- -1086.48dp
- -1085.31dp
- -1084.14dp
- -1082.98dp
- -1081.81dp
- -1080.64dp
- -1079.48dp
- -1078.31dp
- -1077.14dp
- -1075.97dp
- -1074.81dp
- -1073.64dp
- -1072.47dp
- -1071.31dp
- -1070.14dp
- -1068.97dp
- -1067.81dp
- -1066.64dp
- -1065.47dp
- -1064.3dp
- -1063.14dp
- -1061.97dp
- -1060.8dp
- -1059.64dp
- -1058.47dp
- -1057.3dp
- -1056.13dp
- -1054.97dp
- -1053.8dp
- -1052.63dp
- -1051.47dp
- -1050.3dp
- -1049.13dp
- -1047.97dp
- -1046.8dp
- -1045.63dp
- -1044.47dp
- -1043.3dp
- -1042.13dp
- -1040.96dp
- -1039.8dp
- -1038.63dp
- -1037.46dp
- -1036.3dp
- -1035.13dp
- -1033.96dp
- -1032.8dp
- -1031.63dp
- -1030.46dp
- -1029.29dp
- -1028.13dp
- -1026.96dp
- -1025.79dp
- -1024.63dp
- -1023.46dp
- -1022.29dp
- -1021.13dp
- -1019.96dp
- -1018.79dp
- -1017.62dp
- -1016.46dp
- -1015.29dp
- -1014.12dp
- -1012.96dp
- -1011.79dp
- -1010.62dp
- -1009.46dp
- -1008.29dp
- -1007.12dp
- -1005.95dp
- -1004.79dp
- -1003.62dp
- -1002.45dp
- -1001.29dp
- -1000.12dp
- -998.95dp
- -997.79dp
- -996.62dp
- -995.45dp
- -994.28dp
- -993.12dp
- -991.95dp
- -990.78dp
- -989.62dp
- -988.45dp
- -987.28dp
- -986.12dp
- -984.95dp
- -983.78dp
- -982.61dp
- -981.45dp
- -980.28dp
- -979.11dp
- -977.95dp
- -976.78dp
- -975.61dp
- -974.45dp
- -973.28dp
- -972.11dp
- -970.94dp
- -969.78dp
- -968.61dp
- -967.44dp
- -966.28dp
- -965.11dp
- -963.94dp
- -962.77dp
- -961.61dp
- -960.44dp
- -959.27dp
- -958.11dp
- -956.94dp
- -955.77dp
- -954.61dp
- -953.44dp
- -952.27dp
- -951.11dp
- -949.94dp
- -948.77dp
- -947.6dp
- -946.44dp
- -945.27dp
- -944.1dp
- -942.94dp
- -941.77dp
- -940.6dp
- -939.44dp
- -938.27dp
- -937.1dp
- -935.93dp
- -934.77dp
- -933.6dp
- -932.43dp
- -931.27dp
- -930.1dp
- -928.93dp
- -927.76dp
- -926.6dp
- -925.43dp
- -924.26dp
- -923.1dp
- -921.93dp
- -920.76dp
- -919.6dp
- -918.43dp
- -917.26dp
- -916.1dp
- -914.93dp
- -913.76dp
- -912.59dp
- -911.43dp
- -910.26dp
- -909.09dp
- -907.93dp
- -906.76dp
- -905.59dp
- -904.43dp
- -903.26dp
- -902.09dp
- -900.92dp
- -899.76dp
- -898.59dp
- -897.42dp
- -896.26dp
- -895.09dp
- -893.92dp
- -892.75dp
- -891.59dp
- -890.42dp
- -889.25dp
- -888.09dp
- -886.92dp
- -885.75dp
- -884.59dp
- -883.42dp
- -882.25dp
- -881.09dp
- -879.92dp
- -878.75dp
- -877.58dp
- -876.42dp
- -875.25dp
- -874.08dp
- -872.92dp
- -871.75dp
- -870.58dp
- -869.42dp
- -868.25dp
- -867.08dp
- -865.91dp
- -864.75dp
- -863.58dp
- -862.41dp
- -861.25dp
- -860.08dp
- -858.91dp
- -857.75dp
- -856.58dp
- -855.41dp
- -854.24dp
- -853.08dp
- -851.91dp
- -850.74dp
- -849.58dp
- -848.41dp
- -847.24dp
- -846.08dp
- -844.91dp
- -843.74dp
- -842.57dp
- -841.41dp
- -840.24dp
- -839.07dp
- -837.91dp
- -836.74dp
- -835.57dp
- -834.4dp
- -833.24dp
- -832.07dp
- -830.9dp
- -829.74dp
- -828.57dp
- -827.4dp
- -826.24dp
- -825.07dp
- -823.9dp
- -822.74dp
- -821.57dp
- -820.4dp
- -819.23dp
- -818.07dp
- -816.9dp
- -815.73dp
- -814.57dp
- -813.4dp
- -812.23dp
- -811.07dp
- -809.9dp
- -808.73dp
- -807.56dp
- -806.4dp
- -805.23dp
- -804.06dp
- -802.9dp
- -801.73dp
- -800.56dp
- -799.39dp
- -798.23dp
- -797.06dp
- -795.89dp
- -794.73dp
- -793.56dp
- -792.39dp
- -791.23dp
- -790.06dp
- -788.89dp
- -787.73dp
- -786.56dp
- -785.39dp
- -784.22dp
- -783.06dp
- -781.89dp
- -780.72dp
- -779.56dp
- -778.39dp
- -777.22dp
- -776.06dp
- -774.89dp
- -773.72dp
- -772.55dp
- -771.39dp
- -770.22dp
- -769.05dp
- -767.89dp
- -766.72dp
- -765.55dp
- -764.38dp
- -763.22dp
- -762.05dp
- -760.88dp
- -759.72dp
- -758.55dp
- -757.38dp
- -756.22dp
- -755.05dp
- -753.88dp
- -752.72dp
- -751.55dp
- -750.38dp
- -749.21dp
- -748.05dp
- -746.88dp
- -745.71dp
- -744.55dp
- -743.38dp
- -742.21dp
- -741.05dp
- -739.88dp
- -738.71dp
- -737.54dp
- -736.38dp
- -735.21dp
- -734.04dp
- -732.88dp
- -731.71dp
- -730.54dp
- -729.38dp
- -728.21dp
- -727.04dp
- -725.87dp
- -724.71dp
- -723.54dp
- -722.37dp
- -721.21dp
- -720.04dp
- -718.87dp
- -717.71dp
- -716.54dp
- -715.37dp
- -714.2dp
- -713.04dp
- -711.87dp
- -710.7dp
- -709.54dp
- -708.37dp
- -707.2dp
- -706.03dp
- -704.87dp
- -703.7dp
- -702.53dp
- -701.37dp
- -700.2dp
- -699.03dp
- -697.87dp
- -696.7dp
- -695.53dp
- -694.37dp
- -693.2dp
- -692.03dp
- -690.86dp
- -689.7dp
- -688.53dp
- -687.36dp
- -686.2dp
- -685.03dp
- -683.86dp
- -682.7dp
- -681.53dp
- -680.36dp
- -679.19dp
- -678.03dp
- -676.86dp
- -675.69dp
- -674.53dp
- -673.36dp
- -672.19dp
- -671.02dp
- -669.86dp
- -668.69dp
- -667.52dp
- -666.36dp
- -665.19dp
- -664.02dp
- -662.86dp
- -661.69dp
- -660.52dp
- -659.36dp
- -658.19dp
- -657.02dp
- -655.85dp
- -654.69dp
- -653.52dp
- -652.35dp
- -651.19dp
- -650.02dp
- -648.85dp
- -647.69dp
- -646.52dp
- -645.35dp
- -644.18dp
- -643.02dp
- -641.85dp
- -640.68dp
- -639.52dp
- -638.35dp
- -637.18dp
- -636.01dp
- -634.85dp
- -633.68dp
- -632.51dp
- -631.35dp
- -630.18dp
- -629.01dp
- -627.85dp
- -626.68dp
- -625.51dp
- -624.35dp
- -623.18dp
- -622.01dp
- -620.84dp
- -619.68dp
- -618.51dp
- -617.34dp
- -616.18dp
- -615.01dp
- -613.84dp
- -612.68dp
- -611.51dp
- -610.34dp
- -609.17dp
- -608.01dp
- -606.84dp
- -605.67dp
- -604.51dp
- -603.34dp
- -602.17dp
- -601.0dp
- -599.84dp
- -598.67dp
- -597.5dp
- -596.34dp
- -595.17dp
- -594.0dp
- -592.84dp
- -591.67dp
- -590.5dp
- -589.34dp
- -588.17dp
- -587.0dp
- -585.83dp
- -584.67dp
- -583.5dp
- -582.33dp
- -581.17dp
- -580.0dp
- -578.83dp
- -577.66dp
- -576.5dp
- -575.33dp
- -574.16dp
- -573.0dp
- -571.83dp
- -570.66dp
- -569.5dp
- -568.33dp
- -567.16dp
- -566.0dp
- -564.83dp
- -563.66dp
- -562.49dp
- -561.33dp
- -560.16dp
- -558.99dp
- -557.83dp
- -556.66dp
- -555.49dp
- -554.33dp
- -553.16dp
- -551.99dp
- -550.82dp
- -549.66dp
- -548.49dp
- -547.32dp
- -546.16dp
- -544.99dp
- -543.82dp
- -542.65dp
- -541.49dp
- -540.32dp
- -539.15dp
- -537.99dp
- -536.82dp
- -535.65dp
- -534.49dp
- -533.32dp
- -532.15dp
- -530.99dp
- -529.82dp
- -528.65dp
- -527.48dp
- -526.32dp
- -525.15dp
- -523.98dp
- -522.82dp
- -521.65dp
- -520.48dp
- -519.32dp
- -518.15dp
- -516.98dp
- -515.81dp
- -514.65dp
- -513.48dp
- -512.31dp
- -511.15dp
- -509.98dp
- -508.81dp
- -507.65dp
- -506.48dp
- -505.31dp
- -504.14dp
- -502.98dp
- -501.81dp
- -500.64dp
- -499.48dp
- -498.31dp
- -497.14dp
- -495.98dp
- -494.81dp
- -493.64dp
- -492.47dp
- -491.31dp
- -490.14dp
- -488.97dp
- -487.81dp
- -486.64dp
- -485.47dp
- -484.31dp
- -483.14dp
- -481.97dp
- -480.8dp
- -479.64dp
- -478.47dp
- -477.3dp
- -476.14dp
- -474.97dp
- -473.8dp
- -472.63dp
- -471.47dp
- -470.3dp
- -469.13dp
- -467.97dp
- -466.8dp
- -465.63dp
- -464.47dp
- -463.3dp
- -462.13dp
- -460.97dp
- -459.8dp
- -458.63dp
- -457.46dp
- -456.3dp
- -455.13dp
- -453.96dp
- -452.8dp
- -451.63dp
- -450.46dp
- -449.3dp
- -448.13dp
- -446.96dp
- -445.79dp
- -444.63dp
- -443.46dp
- -442.29dp
- -441.13dp
- -439.96dp
- -438.79dp
- -437.63dp
- -436.46dp
- -435.29dp
- -434.12dp
- -432.96dp
- -431.79dp
- -430.62dp
- -429.46dp
- -428.29dp
- -427.12dp
- -425.96dp
- -424.79dp
- -423.62dp
- -422.45dp
- -421.29dp
- -420.12dp
- -418.95dp
- -417.79dp
- -416.62dp
- -415.45dp
- -414.29dp
- -413.12dp
- -411.95dp
- -410.78dp
- -409.62dp
- -408.45dp
- -407.28dp
- -406.12dp
- -404.95dp
- -403.78dp
- -402.62dp
- -401.45dp
- -400.28dp
- -399.11dp
- -397.95dp
- -396.78dp
- -395.61dp
- -394.45dp
- -393.28dp
- -392.11dp
- -390.94dp
- -389.78dp
- -388.61dp
- -387.44dp
- -386.28dp
- -385.11dp
- -383.94dp
- -382.78dp
- -381.61dp
- -380.44dp
- -379.28dp
- -378.11dp
- -376.94dp
- -375.77dp
- -374.61dp
- -373.44dp
- -372.27dp
- -371.11dp
- -369.94dp
- -368.77dp
- -367.61dp
- -366.44dp
- -365.27dp
- -364.1dp
- -362.94dp
- -361.77dp
- -360.6dp
- -359.44dp
- -358.27dp
- -357.1dp
- -355.94dp
- -354.77dp
- -353.6dp
- -352.43dp
- -351.27dp
- -350.1dp
- -348.93dp
- -347.77dp
- -346.6dp
- -345.43dp
- -344.26dp
- -343.1dp
- -341.93dp
- -340.76dp
- -339.6dp
- -338.43dp
- -337.26dp
- -336.1dp
- -334.93dp
- -333.76dp
- -332.6dp
- -331.43dp
- -330.26dp
- -329.09dp
- -327.93dp
- -326.76dp
- -325.59dp
- -324.43dp
- -323.26dp
- -322.09dp
- -320.93dp
- -319.76dp
- -318.59dp
- -317.42dp
- -316.26dp
- -315.09dp
- -313.92dp
- -312.76dp
- -311.59dp
- -310.42dp
- -309.25dp
- -308.09dp
- -306.92dp
- -305.75dp
- -304.59dp
- -303.42dp
- -302.25dp
- -301.09dp
- -299.92dp
- -298.75dp
- -297.59dp
- -296.42dp
- -295.25dp
- -294.08dp
- -292.92dp
- -291.75dp
- -290.58dp
- -289.42dp
- -288.25dp
- -287.08dp
- -285.92dp
- -284.75dp
- -283.58dp
- -282.41dp
- -281.25dp
- -280.08dp
- -278.91dp
- -277.75dp
- -276.58dp
- -275.41dp
- -274.25dp
- -273.08dp
- -271.91dp
- -270.74dp
- -269.58dp
- -268.41dp
- -267.24dp
- -266.08dp
- -264.91dp
- -263.74dp
- -262.57dp
- -261.41dp
- -260.24dp
- -259.07dp
- -257.91dp
- -256.74dp
- -255.57dp
- -254.41dp
- -253.24dp
- -252.07dp
- -250.91dp
- -249.74dp
- -248.57dp
- -247.4dp
- -246.24dp
- -245.07dp
- -243.9dp
- -242.74dp
- -241.57dp
- -240.4dp
- -239.24dp
- -238.07dp
- -236.9dp
- -235.73dp
- -234.57dp
- -233.4dp
- -232.23dp
- -231.07dp
- -229.9dp
- -228.73dp
- -227.56dp
- -226.4dp
- -225.23dp
- -224.06dp
- -222.9dp
- -221.73dp
- -220.56dp
- -219.4dp
- -218.23dp
- -217.06dp
- -215.9dp
- -214.73dp
- -213.56dp
- -212.39dp
- -211.23dp
- -210.06dp
- -208.89dp
- -207.73dp
- -206.56dp
- -205.39dp
- -204.22dp
- -203.06dp
- -201.89dp
- -200.72dp
- -199.56dp
- -198.39dp
- -197.22dp
- -196.06dp
- -194.89dp
- -193.72dp
- -192.56dp
- -191.39dp
- -190.22dp
- -189.05dp
- -187.89dp
- -186.72dp
- -185.55dp
- -184.39dp
- -183.22dp
- -182.05dp
- -180.89dp
- -179.72dp
- -178.55dp
- -177.38dp
- -176.22dp
- -175.05dp
- -173.88dp
- -172.72dp
- -171.55dp
- -170.38dp
- -169.22dp
- -168.05dp
- -166.88dp
- -165.71dp
- -164.55dp
- -163.38dp
- -162.21dp
- -161.05dp
- -159.88dp
- -158.71dp
- -157.55dp
- -156.38dp
- -155.21dp
- -154.04dp
- -152.88dp
- -151.71dp
- -150.54dp
- -149.38dp
- -148.21dp
- -147.04dp
- -145.88dp
- -144.71dp
- -143.54dp
- -142.37dp
- -141.21dp
- -140.04dp
- -138.87dp
- -137.71dp
- -136.54dp
- -135.37dp
- -134.21dp
- -133.04dp
- -131.87dp
- -130.7dp
- -129.54dp
- -128.37dp
- -127.2dp
- -126.04dp
- -124.87dp
- -123.7dp
- -122.54dp
- -121.37dp
- -120.2dp
- -119.03dp
- -117.87dp
- -116.7dp
- -115.53dp
- -114.37dp
- -113.2dp
- -112.03dp
- -110.87dp
- -109.7dp
- -108.53dp
- -107.36dp
- -106.2dp
- -105.03dp
- -103.86dp
- -102.7dp
- -101.53dp
- -100.36dp
- -99.2dp
- -98.03dp
- -96.86dp
- -95.69dp
- -94.53dp
- -93.36dp
- -92.19dp
- -91.03dp
- -89.86dp
- -88.69dp
- -87.53dp
- -86.36dp
- -85.19dp
- -84.02dp
- -82.86dp
- -81.69dp
- -80.52dp
- -79.36dp
- -78.19dp
- -77.02dp
- -75.86dp
- -74.69dp
- -73.52dp
- -72.35dp
- -71.19dp
- -70.02dp
- -68.85dp
- -67.69dp
- -66.52dp
- -65.35dp
- -64.19dp
- -63.02dp
- -61.85dp
- -60.68dp
- -59.52dp
- -58.35dp
- -57.18dp
- -56.02dp
- -54.85dp
- -53.68dp
- -52.52dp
- -51.35dp
- -50.18dp
- -49.01dp
- -47.85dp
- -46.68dp
- -45.51dp
- -44.35dp
- -43.18dp
- -42.01dp
- -40.84dp
- -39.68dp
- -38.51dp
- -37.34dp
- -36.18dp
- -35.01dp
- -33.84dp
- -32.68dp
- -31.51dp
- -30.34dp
- -29.18dp
- -28.01dp
- -26.84dp
- -25.67dp
- -24.51dp
- -23.34dp
- -22.17dp
- -21.01dp
- -19.84dp
- -18.67dp
- -17.5dp
- -16.34dp
- -15.17dp
- -14.0dp
- -12.84dp
- -11.67dp
- -10.5dp
- -9.34dp
- -8.17dp
- -7.0dp
- -5.83dp
- -4.67dp
- -3.5dp
- -2.33dp
- -1.17dp
- 0.0dp
- 1.17dp
- 2.33dp
- 3.5dp
- 4.67dp
- 5.83dp
- 7.0dp
- 8.17dp
- 9.34dp
- 10.5dp
- 11.67dp
- 12.84dp
- 14.0dp
- 15.17dp
- 16.34dp
- 17.5dp
- 18.67dp
- 19.84dp
- 21.01dp
- 22.17dp
- 23.34dp
- 24.51dp
- 25.67dp
- 26.84dp
- 28.01dp
- 29.18dp
- 30.34dp
- 31.51dp
- 32.68dp
- 33.84dp
- 35.01dp
- 36.18dp
- 37.34dp
- 38.51dp
- 39.68dp
- 40.84dp
- 42.01dp
- 43.18dp
- 44.35dp
- 45.51dp
- 46.68dp
- 47.85dp
- 49.01dp
- 50.18dp
- 51.35dp
- 52.52dp
- 53.68dp
- 54.85dp
- 56.02dp
- 57.18dp
- 58.35dp
- 59.52dp
- 60.68dp
- 61.85dp
- 63.02dp
- 64.19dp
- 65.35dp
- 66.52dp
- 67.69dp
- 68.85dp
- 70.02dp
- 71.19dp
- 72.35dp
- 73.52dp
- 74.69dp
- 75.86dp
- 77.02dp
- 78.19dp
- 79.36dp
- 80.52dp
- 81.69dp
- 82.86dp
- 84.02dp
- 85.19dp
- 86.36dp
- 87.53dp
- 88.69dp
- 89.86dp
- 91.03dp
- 92.19dp
- 93.36dp
- 94.53dp
- 95.69dp
- 96.86dp
- 98.03dp
- 99.2dp
- 100.36dp
- 101.53dp
- 102.7dp
- 103.86dp
- 105.03dp
- 106.2dp
- 107.36dp
- 108.53dp
- 109.7dp
- 110.87dp
- 112.03dp
- 113.2dp
- 114.37dp
- 115.53dp
- 116.7dp
- 117.87dp
- 119.03dp
- 120.2dp
- 121.37dp
- 122.54dp
- 123.7dp
- 124.87dp
- 126.04dp
- 127.2dp
- 128.37dp
- 129.54dp
- 130.7dp
- 131.87dp
- 133.04dp
- 134.21dp
- 135.37dp
- 136.54dp
- 137.71dp
- 138.87dp
- 140.04dp
- 141.21dp
- 142.37dp
- 143.54dp
- 144.71dp
- 145.88dp
- 147.04dp
- 148.21dp
- 149.38dp
- 150.54dp
- 151.71dp
- 152.88dp
- 154.04dp
- 155.21dp
- 156.38dp
- 157.55dp
- 158.71dp
- 159.88dp
- 161.05dp
- 162.21dp
- 163.38dp
- 164.55dp
- 165.71dp
- 166.88dp
- 168.05dp
- 169.22dp
- 170.38dp
- 171.55dp
- 172.72dp
- 173.88dp
- 175.05dp
- 176.22dp
- 177.38dp
- 178.55dp
- 179.72dp
- 180.89dp
- 182.05dp
- 183.22dp
- 184.39dp
- 185.55dp
- 186.72dp
- 187.89dp
- 189.05dp
- 190.22dp
- 191.39dp
- 192.56dp
- 193.72dp
- 194.89dp
- 196.06dp
- 197.22dp
- 198.39dp
- 199.56dp
- 200.72dp
- 201.89dp
- 203.06dp
- 204.22dp
- 205.39dp
- 206.56dp
- 207.73dp
- 208.89dp
- 210.06dp
- 211.23dp
- 212.39dp
- 213.56dp
- 214.73dp
- 215.9dp
- 217.06dp
- 218.23dp
- 219.4dp
- 220.56dp
- 221.73dp
- 222.9dp
- 224.06dp
- 225.23dp
- 226.4dp
- 227.56dp
- 228.73dp
- 229.9dp
- 231.07dp
- 232.23dp
- 233.4dp
- 234.57dp
- 235.73dp
- 236.9dp
- 238.07dp
- 239.24dp
- 240.4dp
- 241.57dp
- 242.74dp
- 243.9dp
- 245.07dp
- 246.24dp
- 247.4dp
- 248.57dp
- 249.74dp
- 250.91dp
- 252.07dp
- 253.24dp
- 254.41dp
- 255.57dp
- 256.74dp
- 257.91dp
- 259.07dp
- 260.24dp
- 261.41dp
- 262.57dp
- 263.74dp
- 264.91dp
- 266.08dp
- 267.24dp
- 268.41dp
- 269.58dp
- 270.74dp
- 271.91dp
- 273.08dp
- 274.25dp
- 275.41dp
- 276.58dp
- 277.75dp
- 278.91dp
- 280.08dp
- 281.25dp
- 282.41dp
- 283.58dp
- 284.75dp
- 285.92dp
- 287.08dp
- 288.25dp
- 289.42dp
- 290.58dp
- 291.75dp
- 292.92dp
- 294.08dp
- 295.25dp
- 296.42dp
- 297.59dp
- 298.75dp
- 299.92dp
- 301.09dp
- 302.25dp
- 303.42dp
- 304.59dp
- 305.75dp
- 306.92dp
- 308.09dp
- 309.25dp
- 310.42dp
- 311.59dp
- 312.76dp
- 313.92dp
- 315.09dp
- 316.26dp
- 317.42dp
- 318.59dp
- 319.76dp
- 320.93dp
- 322.09dp
- 323.26dp
- 324.43dp
- 325.59dp
- 326.76dp
- 327.93dp
- 329.09dp
- 330.26dp
- 331.43dp
- 332.6dp
- 333.76dp
- 334.93dp
- 336.1dp
- 337.26dp
- 338.43dp
- 339.6dp
- 340.76dp
- 341.93dp
- 343.1dp
- 344.26dp
- 345.43dp
- 346.6dp
- 347.77dp
- 348.93dp
- 350.1dp
- 351.27dp
- 352.43dp
- 353.6dp
- 354.77dp
- 355.94dp
- 357.1dp
- 358.27dp
- 359.44dp
- 360.6dp
- 361.77dp
- 362.94dp
- 364.1dp
- 365.27dp
- 366.44dp
- 367.61dp
- 368.77dp
- 369.94dp
- 371.11dp
- 372.27dp
- 373.44dp
- 374.61dp
- 375.77dp
- 376.94dp
- 378.11dp
- 379.28dp
- 380.44dp
- 381.61dp
- 382.78dp
- 383.94dp
- 385.11dp
- 386.28dp
- 387.44dp
- 388.61dp
- 389.78dp
- 390.94dp
- 392.11dp
- 393.28dp
- 394.45dp
- 395.61dp
- 396.78dp
- 397.95dp
- 399.11dp
- 400.28dp
- 401.45dp
- 402.62dp
- 403.78dp
- 404.95dp
- 406.12dp
- 407.28dp
- 408.45dp
- 409.62dp
- 410.78dp
- 411.95dp
- 413.12dp
- 414.29dp
- 415.45dp
- 416.62dp
- 417.79dp
- 418.95dp
- 420.12dp
- 421.29dp
- 422.45dp
- 423.62dp
- 424.79dp
- 425.96dp
- 427.12dp
- 428.29dp
- 429.46dp
- 430.62dp
- 431.79dp
- 432.96dp
- 434.12dp
- 435.29dp
- 436.46dp
- 437.63dp
- 438.79dp
- 439.96dp
- 441.13dp
- 442.29dp
- 443.46dp
- 444.63dp
- 445.79dp
- 446.96dp
- 448.13dp
- 449.3dp
- 450.46dp
- 451.63dp
- 452.8dp
- 453.96dp
- 455.13dp
- 456.3dp
- 457.46dp
- 458.63dp
- 459.8dp
- 460.97dp
- 462.13dp
- 463.3dp
- 464.47dp
- 465.63dp
- 466.8dp
- 467.97dp
- 469.13dp
- 470.3dp
- 471.47dp
- 472.63dp
- 473.8dp
- 474.97dp
- 476.14dp
- 477.3dp
- 478.47dp
- 479.64dp
- 480.8dp
- 481.97dp
- 483.14dp
- 484.31dp
- 485.47dp
- 486.64dp
- 487.81dp
- 488.97dp
- 490.14dp
- 491.31dp
- 492.47dp
- 493.64dp
- 494.81dp
- 495.98dp
- 497.14dp
- 498.31dp
- 499.48dp
- 500.64dp
- 501.81dp
- 502.98dp
- 504.14dp
- 505.31dp
- 506.48dp
- 507.65dp
- 508.81dp
- 509.98dp
- 511.15dp
- 512.31dp
- 513.48dp
- 514.65dp
- 515.81dp
- 516.98dp
- 518.15dp
- 519.32dp
- 520.48dp
- 521.65dp
- 522.82dp
- 523.98dp
- 525.15dp
- 526.32dp
- 527.48dp
- 528.65dp
- 529.82dp
- 530.99dp
- 532.15dp
- 533.32dp
- 534.49dp
- 535.65dp
- 536.82dp
- 537.99dp
- 539.15dp
- 540.32dp
- 541.49dp
- 542.65dp
- 543.82dp
- 544.99dp
- 546.16dp
- 547.32dp
- 548.49dp
- 549.66dp
- 550.82dp
- 551.99dp
- 553.16dp
- 554.33dp
- 555.49dp
- 556.66dp
- 557.83dp
- 558.99dp
- 560.16dp
- 561.33dp
- 562.49dp
- 563.66dp
- 564.83dp
- 566.0dp
- 567.16dp
- 568.33dp
- 569.5dp
- 570.66dp
- 571.83dp
- 573.0dp
- 574.16dp
- 575.33dp
- 576.5dp
- 577.66dp
- 578.83dp
- 580.0dp
- 581.17dp
- 582.33dp
- 583.5dp
- 584.67dp
- 585.83dp
- 587.0dp
- 588.17dp
- 589.34dp
- 590.5dp
- 591.67dp
- 592.84dp
- 594.0dp
- 595.17dp
- 596.34dp
- 597.5dp
- 598.67dp
- 599.84dp
- 601.0dp
- 602.17dp
- 603.34dp
- 604.51dp
- 605.67dp
- 606.84dp
- 608.01dp
- 609.17dp
- 610.34dp
- 611.51dp
- 612.68dp
- 613.84dp
- 615.01dp
- 616.18dp
- 617.34dp
- 618.51dp
- 619.68dp
- 620.84dp
- 622.01dp
- 623.18dp
- 624.35dp
- 625.51dp
- 626.68dp
- 627.85dp
- 629.01dp
- 630.18dp
- 631.35dp
- 632.51dp
- 633.68dp
- 634.85dp
- 636.01dp
- 637.18dp
- 638.35dp
- 639.52dp
- 640.68dp
- 641.85dp
- 643.02dp
- 644.18dp
- 645.35dp
- 646.52dp
- 647.69dp
- 648.85dp
- 650.02dp
- 651.19dp
- 652.35dp
- 653.52dp
- 654.69dp
- 655.85dp
- 657.02dp
- 658.19dp
- 659.36dp
- 660.52dp
- 661.69dp
- 662.86dp
- 664.02dp
- 665.19dp
- 666.36dp
- 667.52dp
- 668.69dp
- 669.86dp
- 671.02dp
- 672.19dp
- 673.36dp
- 674.53dp
- 675.69dp
- 676.86dp
- 678.03dp
- 679.19dp
- 680.36dp
- 681.53dp
- 682.7dp
- 683.86dp
- 685.03dp
- 686.2dp
- 687.36dp
- 688.53dp
- 689.7dp
- 690.86dp
- 692.03dp
- 693.2dp
- 694.37dp
- 695.53dp
- 696.7dp
- 697.87dp
- 699.03dp
- 700.2dp
- 701.37dp
- 702.53dp
- 703.7dp
- 704.87dp
- 706.03dp
- 707.2dp
- 708.37dp
- 709.54dp
- 710.7dp
- 711.87dp
- 713.04dp
- 714.2dp
- 715.37dp
- 716.54dp
- 717.71dp
- 718.87dp
- 720.04dp
- 721.21dp
- 722.37dp
- 723.54dp
- 724.71dp
- 725.87dp
- 727.04dp
- 728.21dp
- 729.38dp
- 730.54dp
- 731.71dp
- 732.88dp
- 734.04dp
- 735.21dp
- 736.38dp
- 737.54dp
- 738.71dp
- 739.88dp
- 741.05dp
- 742.21dp
- 743.38dp
- 744.55dp
- 745.71dp
- 746.88dp
- 748.05dp
- 749.21dp
- 750.38dp
- 751.55dp
- 752.72dp
- 753.88dp
- 755.05dp
- 756.22dp
- 757.38dp
- 758.55dp
- 759.72dp
- 760.88dp
- 762.05dp
- 763.22dp
- 764.38dp
- 765.55dp
- 766.72dp
- 767.89dp
- 769.05dp
- 770.22dp
- 771.39dp
- 772.55dp
- 773.72dp
- 774.89dp
- 776.06dp
- 777.22dp
- 778.39dp
- 779.56dp
- 780.72dp
- 781.89dp
- 783.06dp
- 784.22dp
- 785.39dp
- 786.56dp
- 787.73dp
- 788.89dp
- 790.06dp
- 791.23dp
- 792.39dp
- 793.56dp
- 794.73dp
- 795.89dp
- 797.06dp
- 798.23dp
- 799.39dp
- 800.56dp
- 801.73dp
- 802.9dp
- 804.06dp
- 805.23dp
- 806.4dp
- 807.56dp
- 808.73dp
- 809.9dp
- 811.07dp
- 812.23dp
- 813.4dp
- 814.57dp
- 815.73dp
- 816.9dp
- 818.07dp
- 819.23dp
- 820.4dp
- 821.57dp
- 822.74dp
- 823.9dp
- 825.07dp
- 826.24dp
- 827.4dp
- 828.57dp
- 829.74dp
- 830.9dp
- 832.07dp
- 833.24dp
- 834.4dp
- 835.57dp
- 836.74dp
- 837.91dp
- 839.07dp
- 840.24dp
- 841.41dp
- 842.57dp
- 843.74dp
- 844.91dp
- 846.08dp
- 847.24dp
- 848.41dp
- 849.58dp
- 850.74dp
- 851.91dp
- 853.08dp
- 854.24dp
- 855.41dp
- 856.58dp
- 857.75dp
- 858.91dp
- 860.08dp
- 861.25dp
- 862.41dp
- 863.58dp
- 864.75dp
- 865.91dp
- 867.08dp
- 868.25dp
- 869.42dp
- 870.58dp
- 871.75dp
- 872.92dp
- 874.08dp
- 875.25dp
- 876.42dp
- 877.58dp
- 878.75dp
- 879.92dp
- 881.09dp
- 882.25dp
- 883.42dp
- 884.59dp
- 885.75dp
- 886.92dp
- 888.09dp
- 889.25dp
- 890.42dp
- 891.59dp
- 892.75dp
- 893.92dp
- 895.09dp
- 896.26dp
- 897.42dp
- 898.59dp
- 899.76dp
- 900.92dp
- 902.09dp
- 903.26dp
- 904.43dp
- 905.59dp
- 906.76dp
- 907.93dp
- 909.09dp
- 910.26dp
- 911.43dp
- 912.59dp
- 913.76dp
- 914.93dp
- 916.1dp
- 917.26dp
- 918.43dp
- 919.6dp
- 920.76dp
- 921.93dp
- 923.1dp
- 924.26dp
- 925.43dp
- 926.6dp
- 927.76dp
- 928.93dp
- 930.1dp
- 931.27dp
- 932.43dp
- 933.6dp
- 934.77dp
- 935.93dp
- 937.1dp
- 938.27dp
- 939.44dp
- 940.6dp
- 941.77dp
- 942.94dp
- 944.1dp
- 945.27dp
- 946.44dp
- 947.6dp
- 948.77dp
- 949.94dp
- 951.11dp
- 952.27dp
- 953.44dp
- 954.61dp
- 955.77dp
- 956.94dp
- 958.11dp
- 959.27dp
- 960.44dp
- 961.61dp
- 962.77dp
- 963.94dp
- 965.11dp
- 966.28dp
- 967.44dp
- 968.61dp
- 969.78dp
- 970.94dp
- 972.11dp
- 973.28dp
- 974.45dp
- 975.61dp
- 976.78dp
- 977.95dp
- 979.11dp
- 980.28dp
- 981.45dp
- 982.61dp
- 983.78dp
- 984.95dp
- 986.12dp
- 987.28dp
- 988.45dp
- 989.62dp
- 990.78dp
- 991.95dp
- 993.12dp
- 994.28dp
- 995.45dp
- 996.62dp
- 997.79dp
- 998.95dp
- 1000.12dp
- 1001.29dp
- 1002.45dp
- 1003.62dp
- 1004.79dp
- 1005.95dp
- 1007.12dp
- 1008.29dp
- 1009.46dp
- 1010.62dp
- 1011.79dp
- 1012.96dp
- 1014.12dp
- 1015.29dp
- 1016.46dp
- 1017.62dp
- 1018.79dp
- 1019.96dp
- 1021.13dp
- 1022.29dp
- 1023.46dp
- 1024.63dp
- 1025.79dp
- 1026.96dp
- 1028.13dp
- 1029.29dp
- 1030.46dp
- 1031.63dp
- 1032.8dp
- 1033.96dp
- 1035.13dp
- 1036.3dp
- 1037.46dp
- 1038.63dp
- 1039.8dp
- 1040.96dp
- 1042.13dp
- 1043.3dp
- 1044.47dp
- 1045.63dp
- 1046.8dp
- 1047.97dp
- 1049.13dp
- 1050.3dp
- 1051.47dp
- 1052.63dp
- 1053.8dp
- 1054.97dp
- 1056.13dp
- 1057.3dp
- 1058.47dp
- 1059.64dp
- 1060.8dp
- 1061.97dp
- 1063.14dp
- 1064.3dp
- 1065.47dp
- 1066.64dp
- 1067.81dp
- 1068.97dp
- 1070.14dp
- 1071.31dp
- 1072.47dp
- 1073.64dp
- 1074.81dp
- 1075.97dp
- 1077.14dp
- 1078.31dp
- 1079.48dp
- 1080.64dp
- 1081.81dp
- 1082.98dp
- 1084.14dp
- 1085.31dp
- 1086.48dp
- 1087.64dp
- 1088.81dp
- 1089.98dp
- 1091.14dp
- 1092.31dp
- 1093.48dp
- 1094.65dp
- 1095.81dp
- 1096.98dp
- 1098.15dp
- 1099.31dp
- 1100.48dp
- 1101.65dp
- 1102.82dp
- 1103.98dp
- 1105.15dp
- 1106.32dp
- 1107.48dp
- 1108.65dp
- 1109.82dp
- 1110.98dp
- 1112.15dp
- 1113.32dp
- 1114.49dp
- 1115.65dp
- 1116.82dp
- 1117.99dp
- 1119.15dp
- 1120.32dp
- 1121.49dp
- 1122.65dp
- 1123.82dp
- 1124.99dp
- 1126.15dp
- 1127.32dp
- 1128.49dp
- 1129.66dp
- 1130.82dp
- 1131.99dp
- 1133.16dp
- 1134.32dp
- 1135.49dp
- 1136.66dp
- 1137.83dp
- 1138.99dp
- 1140.16dp
- 1141.33dp
- 1142.49dp
- 1143.66dp
- 1144.83dp
- 1145.99dp
- 1147.16dp
- 1148.33dp
- 1149.5dp
- 1150.66dp
- 1151.83dp
- 1153.0dp
- 1154.16dp
- 1155.33dp
- 1156.5dp
- 1157.66dp
- 1158.83dp
- 1160.0dp
- 1161.16dp
- 1162.33dp
- 1163.5dp
- 1164.67dp
- 1165.83dp
- 1167.0dp
- 1168.17dp
- 1169.33dp
- 1170.5dp
- 1171.67dp
- 1172.84dp
- 1174.0dp
- 1175.17dp
- 1176.34dp
- 1177.5dp
- 1178.67dp
- 1179.84dp
- 1181.0dp
- 1182.17dp
- 1183.34dp
- 1184.51dp
- 1185.67dp
- 1186.84dp
- 1188.01dp
- 1189.17dp
- 1190.34dp
- 1191.51dp
- 1192.67dp
- 1193.84dp
- 1195.01dp
- 1196.17dp
- 1197.34dp
- 1198.51dp
- 1199.68dp
- 1200.84dp
- 1202.01dp
- 1203.18dp
- 1204.34dp
- 1205.51dp
- 1206.68dp
- 1207.85dp
- 1209.01dp
- 1210.18dp
- 1211.35dp
- 1212.51dp
- 1213.68dp
- 1214.85dp
- 1216.01dp
- 1217.18dp
- 1218.35dp
- 1219.52dp
- 1220.68dp
- 1221.85dp
- 1223.02dp
- 1224.18dp
- 1225.35dp
- 1226.52dp
- 1227.68dp
- 1228.85dp
- 1230.02dp
- 1231.18dp
- 1232.35dp
- 1233.52dp
- 1234.69dp
- 1235.85dp
- 1237.02dp
- 1238.19dp
- 1239.35dp
- 1240.52dp
- 1241.69dp
- 1242.86dp
- 1244.02dp
- 1245.19dp
- 1246.36dp
- 1247.52dp
- 1248.69dp
- 1249.86dp
- 1251.02dp
- 1252.19dp
- 1253.36dp
- 1254.53dp
- 1255.69dp
- 1256.86dp
- 1258.03dp
- 1259.19dp
- 1260.36dp
- 5.83sp
- 7.0sp
- 8.17sp
- 9.34sp
- 10.5sp
- 11.67sp
- 12.84sp
- 14.0sp
- 15.17sp
- 16.34sp
- 17.5sp
- 18.67sp
- 19.84sp
- 21.01sp
- 22.17sp
- 23.34sp
- 24.51sp
- 25.67sp
- 26.84sp
- 28.01sp
- 29.18sp
- 30.34sp
- 31.51sp
- 32.68sp
- 33.84sp
- 35.01sp
- 36.18sp
- 37.34sp
- 38.51sp
- 39.68sp
- 40.84sp
- 42.01sp
- 43.18sp
- 44.35sp
- 45.51sp
- 46.68sp
- 47.85sp
- 49.01sp
- 50.18sp
- 51.35sp
- 52.52sp
- 53.68sp
- 54.85sp
- 56.02sp
- 57.18sp
- 58.35sp
- 59.52sp
- 60.68sp
- 61.85sp
- 63.02sp
- 64.19sp
- 65.35sp
- 66.52sp
- 67.69sp
- 68.85sp
- 70.02sp
- 71.19sp
- 72.35sp
- 73.52sp
- 74.69sp
- 75.86sp
- 77.02sp
- 78.19sp
- 79.36sp
- 80.52sp
- 81.69sp
- 82.86sp
- 84.02sp
- 85.19sp
- 86.36sp
- 87.53sp
- 88.69sp
- 89.86sp
- 91.03sp
- 92.19sp
- 93.36sp
- 94.53sp
- 95.69sp
- 96.86sp
- 98.03sp
- 99.2sp
- 100.36sp
- 101.53sp
- 102.7sp
- 103.86sp
- 105.03sp
- 106.2sp
- 107.36sp
- 108.53sp
- 109.7sp
- 110.87sp
- 112.03sp
- 113.2sp
- 114.37sp
- 115.53sp
- 116.7sp
+ -1260.36dp
+ -1259.19dp
+ -1258.03dp
+ -1256.86dp
+ -1255.69dp
+ -1254.53dp
+ -1253.36dp
+ -1252.19dp
+ -1251.02dp
+ -1249.86dp
+ -1248.69dp
+ -1247.52dp
+ -1246.36dp
+ -1245.19dp
+ -1244.02dp
+ -1242.86dp
+ -1241.69dp
+ -1240.52dp
+ -1239.35dp
+ -1238.19dp
+ -1237.02dp
+ -1235.85dp
+ -1234.69dp
+ -1233.52dp
+ -1232.35dp
+ -1231.18dp
+ -1230.02dp
+ -1228.85dp
+ -1227.68dp
+ -1226.52dp
+ -1225.35dp
+ -1224.18dp
+ -1223.02dp
+ -1221.85dp
+ -1220.68dp
+ -1219.52dp
+ -1218.35dp
+ -1217.18dp
+ -1216.01dp
+ -1214.85dp
+ -1213.68dp
+ -1212.51dp
+ -1211.35dp
+ -1210.18dp
+ -1209.01dp
+ -1207.85dp
+ -1206.68dp
+ -1205.51dp
+ -1204.34dp
+ -1203.18dp
+ -1202.01dp
+ -1200.84dp
+ -1199.68dp
+ -1198.51dp
+ -1197.34dp
+ -1196.17dp
+ -1195.01dp
+ -1193.84dp
+ -1192.67dp
+ -1191.51dp
+ -1190.34dp
+ -1189.17dp
+ -1188.01dp
+ -1186.84dp
+ -1185.67dp
+ -1184.51dp
+ -1183.34dp
+ -1182.17dp
+ -1181.0dp
+ -1179.84dp
+ -1178.67dp
+ -1177.5dp
+ -1176.34dp
+ -1175.17dp
+ -1174.0dp
+ -1172.84dp
+ -1171.67dp
+ -1170.5dp
+ -1169.33dp
+ -1168.17dp
+ -1167.0dp
+ -1165.83dp
+ -1164.67dp
+ -1163.5dp
+ -1162.33dp
+ -1161.16dp
+ -1160.0dp
+ -1158.83dp
+ -1157.66dp
+ -1156.5dp
+ -1155.33dp
+ -1154.16dp
+ -1153.0dp
+ -1151.83dp
+ -1150.66dp
+ -1149.5dp
+ -1148.33dp
+ -1147.16dp
+ -1145.99dp
+ -1144.83dp
+ -1143.66dp
+ -1142.49dp
+ -1141.33dp
+ -1140.16dp
+ -1138.99dp
+ -1137.83dp
+ -1136.66dp
+ -1135.49dp
+ -1134.32dp
+ -1133.16dp
+ -1131.99dp
+ -1130.82dp
+ -1129.66dp
+ -1128.49dp
+ -1127.32dp
+ -1126.15dp
+ -1124.99dp
+ -1123.82dp
+ -1122.65dp
+ -1121.49dp
+ -1120.32dp
+ -1119.15dp
+ -1117.99dp
+ -1116.82dp
+ -1115.65dp
+ -1114.49dp
+ -1113.32dp
+ -1112.15dp
+ -1110.98dp
+ -1109.82dp
+ -1108.65dp
+ -1107.48dp
+ -1106.32dp
+ -1105.15dp
+ -1103.98dp
+ -1102.82dp
+ -1101.65dp
+ -1100.48dp
+ -1099.31dp
+ -1098.15dp
+ -1096.98dp
+ -1095.81dp
+ -1094.65dp
+ -1093.48dp
+ -1092.31dp
+ -1091.14dp
+ -1089.98dp
+ -1088.81dp
+ -1087.64dp
+ -1086.48dp
+ -1085.31dp
+ -1084.14dp
+ -1082.98dp
+ -1081.81dp
+ -1080.64dp
+ -1079.48dp
+ -1078.31dp
+ -1077.14dp
+ -1075.97dp
+ -1074.81dp
+ -1073.64dp
+ -1072.47dp
+ -1071.31dp
+ -1070.14dp
+ -1068.97dp
+ -1067.81dp
+ -1066.64dp
+ -1065.47dp
+ -1064.3dp
+ -1063.14dp
+ -1061.97dp
+ -1060.8dp
+ -1059.64dp
+ -1058.47dp
+ -1057.3dp
+ -1056.13dp
+ -1054.97dp
+ -1053.8dp
+ -1052.63dp
+ -1051.47dp
+ -1050.3dp
+ -1049.13dp
+ -1047.97dp
+ -1046.8dp
+ -1045.63dp
+ -1044.47dp
+ -1043.3dp
+ -1042.13dp
+ -1040.96dp
+ -1039.8dp
+ -1038.63dp
+ -1037.46dp
+ -1036.3dp
+ -1035.13dp
+ -1033.96dp
+ -1032.8dp
+ -1031.63dp
+ -1030.46dp
+ -1029.29dp
+ -1028.13dp
+ -1026.96dp
+ -1025.79dp
+ -1024.63dp
+ -1023.46dp
+ -1022.29dp
+ -1021.13dp
+ -1019.96dp
+ -1018.79dp
+ -1017.62dp
+ -1016.46dp
+ -1015.29dp
+ -1014.12dp
+ -1012.96dp
+ -1011.79dp
+ -1010.62dp
+ -1009.46dp
+ -1008.29dp
+ -1007.12dp
+ -1005.95dp
+ -1004.79dp
+ -1003.62dp
+ -1002.45dp
+ -1001.29dp
+ -1000.12dp
+ -998.95dp
+ -997.79dp
+ -996.62dp
+ -995.45dp
+ -994.28dp
+ -993.12dp
+ -991.95dp
+ -990.78dp
+ -989.62dp
+ -988.45dp
+ -987.28dp
+ -986.12dp
+ -984.95dp
+ -983.78dp
+ -982.61dp
+ -981.45dp
+ -980.28dp
+ -979.11dp
+ -977.95dp
+ -976.78dp
+ -975.61dp
+ -974.45dp
+ -973.28dp
+ -972.11dp
+ -970.94dp
+ -969.78dp
+ -968.61dp
+ -967.44dp
+ -966.28dp
+ -965.11dp
+ -963.94dp
+ -962.77dp
+ -961.61dp
+ -960.44dp
+ -959.27dp
+ -958.11dp
+ -956.94dp
+ -955.77dp
+ -954.61dp
+ -953.44dp
+ -952.27dp
+ -951.11dp
+ -949.94dp
+ -948.77dp
+ -947.6dp
+ -946.44dp
+ -945.27dp
+ -944.1dp
+ -942.94dp
+ -941.77dp
+ -940.6dp
+ -939.44dp
+ -938.27dp
+ -937.1dp
+ -935.93dp
+ -934.77dp
+ -933.6dp
+ -932.43dp
+ -931.27dp
+ -930.1dp
+ -928.93dp
+ -927.76dp
+ -926.6dp
+ -925.43dp
+ -924.26dp
+ -923.1dp
+ -921.93dp
+ -920.76dp
+ -919.6dp
+ -918.43dp
+ -917.26dp
+ -916.1dp
+ -914.93dp
+ -913.76dp
+ -912.59dp
+ -911.43dp
+ -910.26dp
+ -909.09dp
+ -907.93dp
+ -906.76dp
+ -905.59dp
+ -904.43dp
+ -903.26dp
+ -902.09dp
+ -900.92dp
+ -899.76dp
+ -898.59dp
+ -897.42dp
+ -896.26dp
+ -895.09dp
+ -893.92dp
+ -892.75dp
+ -891.59dp
+ -890.42dp
+ -889.25dp
+ -888.09dp
+ -886.92dp
+ -885.75dp
+ -884.59dp
+ -883.42dp
+ -882.25dp
+ -881.09dp
+ -879.92dp
+ -878.75dp
+ -877.58dp
+ -876.42dp
+ -875.25dp
+ -874.08dp
+ -872.92dp
+ -871.75dp
+ -870.58dp
+ -869.42dp
+ -868.25dp
+ -867.08dp
+ -865.91dp
+ -864.75dp
+ -863.58dp
+ -862.41dp
+ -861.25dp
+ -860.08dp
+ -858.91dp
+ -857.75dp
+ -856.58dp
+ -855.41dp
+ -854.24dp
+ -853.08dp
+ -851.91dp
+ -850.74dp
+ -849.58dp
+ -848.41dp
+ -847.24dp
+ -846.08dp
+ -844.91dp
+ -843.74dp
+ -842.57dp
+ -841.41dp
+ -840.24dp
+ -839.07dp
+ -837.91dp
+ -836.74dp
+ -835.57dp
+ -834.4dp
+ -833.24dp
+ -832.07dp
+ -830.9dp
+ -829.74dp
+ -828.57dp
+ -827.4dp
+ -826.24dp
+ -825.07dp
+ -823.9dp
+ -822.74dp
+ -821.57dp
+ -820.4dp
+ -819.23dp
+ -818.07dp
+ -816.9dp
+ -815.73dp
+ -814.57dp
+ -813.4dp
+ -812.23dp
+ -811.07dp
+ -809.9dp
+ -808.73dp
+ -807.56dp
+ -806.4dp
+ -805.23dp
+ -804.06dp
+ -802.9dp
+ -801.73dp
+ -800.56dp
+ -799.39dp
+ -798.23dp
+ -797.06dp
+ -795.89dp
+ -794.73dp
+ -793.56dp
+ -792.39dp
+ -791.23dp
+ -790.06dp
+ -788.89dp
+ -787.73dp
+ -786.56dp
+ -785.39dp
+ -784.22dp
+ -783.06dp
+ -781.89dp
+ -780.72dp
+ -779.56dp
+ -778.39dp
+ -777.22dp
+ -776.06dp
+ -774.89dp
+ -773.72dp
+ -772.55dp
+ -771.39dp
+ -770.22dp
+ -769.05dp
+ -767.89dp
+ -766.72dp
+ -765.55dp
+ -764.38dp
+ -763.22dp
+ -762.05dp
+ -760.88dp
+ -759.72dp
+ -758.55dp
+ -757.38dp
+ -756.22dp
+ -755.05dp
+ -753.88dp
+ -752.72dp
+ -751.55dp
+ -750.38dp
+ -749.21dp
+ -748.05dp
+ -746.88dp
+ -745.71dp
+ -744.55dp
+ -743.38dp
+ -742.21dp
+ -741.05dp
+ -739.88dp
+ -738.71dp
+ -737.54dp
+ -736.38dp
+ -735.21dp
+ -734.04dp
+ -732.88dp
+ -731.71dp
+ -730.54dp
+ -729.38dp
+ -728.21dp
+ -727.04dp
+ -725.87dp
+ -724.71dp
+ -723.54dp
+ -722.37dp
+ -721.21dp
+ -720.04dp
+ -718.87dp
+ -717.71dp
+ -716.54dp
+ -715.37dp
+ -714.2dp
+ -713.04dp
+ -711.87dp
+ -710.7dp
+ -709.54dp
+ -708.37dp
+ -707.2dp
+ -706.03dp
+ -704.87dp
+ -703.7dp
+ -702.53dp
+ -701.37dp
+ -700.2dp
+ -699.03dp
+ -697.87dp
+ -696.7dp
+ -695.53dp
+ -694.37dp
+ -693.2dp
+ -692.03dp
+ -690.86dp
+ -689.7dp
+ -688.53dp
+ -687.36dp
+ -686.2dp
+ -685.03dp
+ -683.86dp
+ -682.7dp
+ -681.53dp
+ -680.36dp
+ -679.19dp
+ -678.03dp
+ -676.86dp
+ -675.69dp
+ -674.53dp
+ -673.36dp
+ -672.19dp
+ -671.02dp
+ -669.86dp
+ -668.69dp
+ -667.52dp
+ -666.36dp
+ -665.19dp
+ -664.02dp
+ -662.86dp
+ -661.69dp
+ -660.52dp
+ -659.36dp
+ -658.19dp
+ -657.02dp
+ -655.85dp
+ -654.69dp
+ -653.52dp
+ -652.35dp
+ -651.19dp
+ -650.02dp
+ -648.85dp
+ -647.69dp
+ -646.52dp
+ -645.35dp
+ -644.18dp
+ -643.02dp
+ -641.85dp
+ -640.68dp
+ -639.52dp
+ -638.35dp
+ -637.18dp
+ -636.01dp
+ -634.85dp
+ -633.68dp
+ -632.51dp
+ -631.35dp
+ -630.18dp
+ -629.01dp
+ -627.85dp
+ -626.68dp
+ -625.51dp
+ -624.35dp
+ -623.18dp
+ -622.01dp
+ -620.84dp
+ -619.68dp
+ -618.51dp
+ -617.34dp
+ -616.18dp
+ -615.01dp
+ -613.84dp
+ -612.68dp
+ -611.51dp
+ -610.34dp
+ -609.17dp
+ -608.01dp
+ -606.84dp
+ -605.67dp
+ -604.51dp
+ -603.34dp
+ -602.17dp
+ -601.0dp
+ -599.84dp
+ -598.67dp
+ -597.5dp
+ -596.34dp
+ -595.17dp
+ -594.0dp
+ -592.84dp
+ -591.67dp
+ -590.5dp
+ -589.34dp
+ -588.17dp
+ -587.0dp
+ -585.83dp
+ -584.67dp
+ -583.5dp
+ -582.33dp
+ -581.17dp
+ -580.0dp
+ -578.83dp
+ -577.66dp
+ -576.5dp
+ -575.33dp
+ -574.16dp
+ -573.0dp
+ -571.83dp
+ -570.66dp
+ -569.5dp
+ -568.33dp
+ -567.16dp
+ -566.0dp
+ -564.83dp
+ -563.66dp
+ -562.49dp
+ -561.33dp
+ -560.16dp
+ -558.99dp
+ -557.83dp
+ -556.66dp
+ -555.49dp
+ -554.33dp
+ -553.16dp
+ -551.99dp
+ -550.82dp
+ -549.66dp
+ -548.49dp
+ -547.32dp
+ -546.16dp
+ -544.99dp
+ -543.82dp
+ -542.65dp
+ -541.49dp
+ -540.32dp
+ -539.15dp
+ -537.99dp
+ -536.82dp
+ -535.65dp
+ -534.49dp
+ -533.32dp
+ -532.15dp
+ -530.99dp
+ -529.82dp
+ -528.65dp
+ -527.48dp
+ -526.32dp
+ -525.15dp
+ -523.98dp
+ -522.82dp
+ -521.65dp
+ -520.48dp
+ -519.32dp
+ -518.15dp
+ -516.98dp
+ -515.81dp
+ -514.65dp
+ -513.48dp
+ -512.31dp
+ -511.15dp
+ -509.98dp
+ -508.81dp
+ -507.65dp
+ -506.48dp
+ -505.31dp
+ -504.14dp
+ -502.98dp
+ -501.81dp
+ -500.64dp
+ -499.48dp
+ -498.31dp
+ -497.14dp
+ -495.98dp
+ -494.81dp
+ -493.64dp
+ -492.47dp
+ -491.31dp
+ -490.14dp
+ -488.97dp
+ -487.81dp
+ -486.64dp
+ -485.47dp
+ -484.31dp
+ -483.14dp
+ -481.97dp
+ -480.8dp
+ -479.64dp
+ -478.47dp
+ -477.3dp
+ -476.14dp
+ -474.97dp
+ -473.8dp
+ -472.63dp
+ -471.47dp
+ -470.3dp
+ -469.13dp
+ -467.97dp
+ -466.8dp
+ -465.63dp
+ -464.47dp
+ -463.3dp
+ -462.13dp
+ -460.97dp
+ -459.8dp
+ -458.63dp
+ -457.46dp
+ -456.3dp
+ -455.13dp
+ -453.96dp
+ -452.8dp
+ -451.63dp
+ -450.46dp
+ -449.3dp
+ -448.13dp
+ -446.96dp
+ -445.79dp
+ -444.63dp
+ -443.46dp
+ -442.29dp
+ -441.13dp
+ -439.96dp
+ -438.79dp
+ -437.63dp
+ -436.46dp
+ -435.29dp
+ -434.12dp
+ -432.96dp
+ -431.79dp
+ -430.62dp
+ -429.46dp
+ -428.29dp
+ -427.12dp
+ -425.96dp
+ -424.79dp
+ -423.62dp
+ -422.45dp
+ -421.29dp
+ -420.12dp
+ -418.95dp
+ -417.79dp
+ -416.62dp
+ -415.45dp
+ -414.29dp
+ -413.12dp
+ -411.95dp
+ -410.78dp
+ -409.62dp
+ -408.45dp
+ -407.28dp
+ -406.12dp
+ -404.95dp
+ -403.78dp
+ -402.62dp
+ -401.45dp
+ -400.28dp
+ -399.11dp
+ -397.95dp
+ -396.78dp
+ -395.61dp
+ -394.45dp
+ -393.28dp
+ -392.11dp
+ -390.94dp
+ -389.78dp
+ -388.61dp
+ -387.44dp
+ -386.28dp
+ -385.11dp
+ -383.94dp
+ -382.78dp
+ -381.61dp
+ -380.44dp
+ -379.28dp
+ -378.11dp
+ -376.94dp
+ -375.77dp
+ -374.61dp
+ -373.44dp
+ -372.27dp
+ -371.11dp
+ -369.94dp
+ -368.77dp
+ -367.61dp
+ -366.44dp
+ -365.27dp
+ -364.1dp
+ -362.94dp
+ -361.77dp
+ -360.6dp
+ -359.44dp
+ -358.27dp
+ -357.1dp
+ -355.94dp
+ -354.77dp
+ -353.6dp
+ -352.43dp
+ -351.27dp
+ -350.1dp
+ -348.93dp
+ -347.77dp
+ -346.6dp
+ -345.43dp
+ -344.26dp
+ -343.1dp
+ -341.93dp
+ -340.76dp
+ -339.6dp
+ -338.43dp
+ -337.26dp
+ -336.1dp
+ -334.93dp
+ -333.76dp
+ -332.6dp
+ -331.43dp
+ -330.26dp
+ -329.09dp
+ -327.93dp
+ -326.76dp
+ -325.59dp
+ -324.43dp
+ -323.26dp
+ -322.09dp
+ -320.93dp
+ -319.76dp
+ -318.59dp
+ -317.42dp
+ -316.26dp
+ -315.09dp
+ -313.92dp
+ -312.76dp
+ -311.59dp
+ -310.42dp
+ -309.25dp
+ -308.09dp
+ -306.92dp
+ -305.75dp
+ -304.59dp
+ -303.42dp
+ -302.25dp
+ -301.09dp
+ -299.92dp
+ -298.75dp
+ -297.59dp
+ -296.42dp
+ -295.25dp
+ -294.08dp
+ -292.92dp
+ -291.75dp
+ -290.58dp
+ -289.42dp
+ -288.25dp
+ -287.08dp
+ -285.92dp
+ -284.75dp
+ -283.58dp
+ -282.41dp
+ -281.25dp
+ -280.08dp
+ -278.91dp
+ -277.75dp
+ -276.58dp
+ -275.41dp
+ -274.25dp
+ -273.08dp
+ -271.91dp
+ -270.74dp
+ -269.58dp
+ -268.41dp
+ -267.24dp
+ -266.08dp
+ -264.91dp
+ -263.74dp
+ -262.57dp
+ -261.41dp
+ -260.24dp
+ -259.07dp
+ -257.91dp
+ -256.74dp
+ -255.57dp
+ -254.41dp
+ -253.24dp
+ -252.07dp
+ -250.91dp
+ -249.74dp
+ -248.57dp
+ -247.4dp
+ -246.24dp
+ -245.07dp
+ -243.9dp
+ -242.74dp
+ -241.57dp
+ -240.4dp
+ -239.24dp
+ -238.07dp
+ -236.9dp
+ -235.73dp
+ -234.57dp
+ -233.4dp
+ -232.23dp
+ -231.07dp
+ -229.9dp
+ -228.73dp
+ -227.56dp
+ -226.4dp
+ -225.23dp
+ -224.06dp
+ -222.9dp
+ -221.73dp
+ -220.56dp
+ -219.4dp
+ -218.23dp
+ -217.06dp
+ -215.9dp
+ -214.73dp
+ -213.56dp
+ -212.39dp
+ -211.23dp
+ -210.06dp
+ -208.89dp
+ -207.73dp
+ -206.56dp
+ -205.39dp
+ -204.22dp
+ -203.06dp
+ -201.89dp
+ -200.72dp
+ -199.56dp
+ -198.39dp
+ -197.22dp
+ -196.06dp
+ -194.89dp
+ -193.72dp
+ -192.56dp
+ -191.39dp
+ -190.22dp
+ -189.05dp
+ -187.89dp
+ -186.72dp
+ -185.55dp
+ -184.39dp
+ -183.22dp
+ -182.05dp
+ -180.89dp
+ -179.72dp
+ -178.55dp
+ -177.38dp
+ -176.22dp
+ -175.05dp
+ -173.88dp
+ -172.72dp
+ -171.55dp
+ -170.38dp
+ -169.22dp
+ -168.05dp
+ -166.88dp
+ -165.71dp
+ -164.55dp
+ -163.38dp
+ -162.21dp
+ -161.05dp
+ -159.88dp
+ -158.71dp
+ -157.55dp
+ -156.38dp
+ -155.21dp
+ -154.04dp
+ -152.88dp
+ -151.71dp
+ -150.54dp
+ -149.38dp
+ -148.21dp
+ -147.04dp
+ -145.88dp
+ -144.71dp
+ -143.54dp
+ -142.37dp
+ -141.21dp
+ -140.04dp
+ -138.87dp
+ -137.71dp
+ -136.54dp
+ -135.37dp
+ -134.21dp
+ -133.04dp
+ -131.87dp
+ -130.7dp
+ -129.54dp
+ -128.37dp
+ -127.2dp
+ -126.04dp
+ -124.87dp
+ -123.7dp
+ -122.54dp
+ -121.37dp
+ -120.2dp
+ -119.03dp
+ -117.87dp
+ -116.7dp
+ -115.53dp
+ -114.37dp
+ -113.2dp
+ -112.03dp
+ -110.87dp
+ -109.7dp
+ -108.53dp
+ -107.36dp
+ -106.2dp
+ -105.03dp
+ -103.86dp
+ -102.7dp
+ -101.53dp
+ -100.36dp
+ -99.2dp
+ -98.03dp
+ -96.86dp
+ -95.69dp
+ -94.53dp
+ -93.36dp
+ -92.19dp
+ -91.03dp
+ -89.86dp
+ -88.69dp
+ -87.53dp
+ -86.36dp
+ -85.19dp
+ -84.02dp
+ -82.86dp
+ -81.69dp
+ -80.52dp
+ -79.36dp
+ -78.19dp
+ -77.02dp
+ -75.86dp
+ -74.69dp
+ -73.52dp
+ -72.35dp
+ -71.19dp
+ -70.02dp
+ -68.85dp
+ -67.69dp
+ -66.52dp
+ -65.35dp
+ -64.19dp
+ -63.02dp
+ -61.85dp
+ -60.68dp
+ -59.52dp
+ -58.35dp
+ -57.18dp
+ -56.02dp
+ -54.85dp
+ -53.68dp
+ -52.52dp
+ -51.35dp
+ -50.18dp
+ -49.01dp
+ -47.85dp
+ -46.68dp
+ -45.51dp
+ -44.35dp
+ -43.18dp
+ -42.01dp
+ -40.84dp
+ -39.68dp
+ -38.51dp
+ -37.34dp
+ -36.18dp
+ -35.01dp
+ -33.84dp
+ -32.68dp
+ -31.51dp
+ -30.34dp
+ -29.18dp
+ -28.01dp
+ -26.84dp
+ -25.67dp
+ -24.51dp
+ -23.34dp
+ -22.17dp
+ -21.01dp
+ -19.84dp
+ -18.67dp
+ -17.5dp
+ -16.34dp
+ -15.17dp
+ -14.0dp
+ -12.84dp
+ -11.67dp
+ -10.5dp
+ -9.34dp
+ -8.17dp
+ -7.0dp
+ -5.83dp
+ -4.67dp
+ -3.5dp
+ -2.33dp
+ -1.17dp
+ 0.0dp
+ 0.59dp
+ 1.17dp
+ 2.33dp
+ 3.5dp
+ 4.67dp
+ 5.83dp
+ 7.0dp
+ 8.17dp
+ 9.34dp
+ 10.5dp
+ 11.67dp
+ 12.84dp
+ 14.0dp
+ 15.17dp
+ 16.34dp
+ 17.5dp
+ 18.67dp
+ 19.84dp
+ 21.01dp
+ 22.17dp
+ 23.34dp
+ 24.51dp
+ 25.67dp
+ 26.84dp
+ 28.01dp
+ 29.18dp
+ 30.34dp
+ 31.51dp
+ 32.68dp
+ 33.84dp
+ 35.01dp
+ 36.18dp
+ 37.34dp
+ 38.51dp
+ 39.68dp
+ 40.84dp
+ 42.01dp
+ 43.18dp
+ 44.35dp
+ 45.51dp
+ 46.68dp
+ 47.85dp
+ 49.01dp
+ 50.18dp
+ 51.35dp
+ 52.52dp
+ 53.68dp
+ 54.85dp
+ 56.02dp
+ 57.18dp
+ 58.35dp
+ 59.52dp
+ 60.68dp
+ 61.85dp
+ 63.02dp
+ 64.19dp
+ 65.35dp
+ 66.52dp
+ 67.69dp
+ 68.85dp
+ 70.02dp
+ 71.19dp
+ 72.35dp
+ 73.52dp
+ 74.69dp
+ 75.86dp
+ 77.02dp
+ 78.19dp
+ 79.36dp
+ 80.52dp
+ 81.69dp
+ 82.86dp
+ 84.02dp
+ 85.19dp
+ 86.36dp
+ 87.53dp
+ 88.69dp
+ 89.86dp
+ 91.03dp
+ 92.19dp
+ 93.36dp
+ 94.53dp
+ 95.69dp
+ 96.86dp
+ 98.03dp
+ 99.2dp
+ 100.36dp
+ 101.53dp
+ 102.7dp
+ 103.86dp
+ 105.03dp
+ 106.2dp
+ 107.36dp
+ 108.53dp
+ 109.7dp
+ 110.87dp
+ 112.03dp
+ 113.2dp
+ 114.37dp
+ 115.53dp
+ 116.7dp
+ 117.87dp
+ 119.03dp
+ 120.2dp
+ 121.37dp
+ 122.54dp
+ 123.7dp
+ 124.87dp
+ 126.04dp
+ 127.2dp
+ 128.37dp
+ 129.54dp
+ 130.7dp
+ 131.87dp
+ 133.04dp
+ 134.21dp
+ 135.37dp
+ 136.54dp
+ 137.71dp
+ 138.87dp
+ 140.04dp
+ 141.21dp
+ 142.37dp
+ 143.54dp
+ 144.71dp
+ 145.88dp
+ 147.04dp
+ 148.21dp
+ 149.38dp
+ 150.54dp
+ 151.71dp
+ 152.88dp
+ 154.04dp
+ 155.21dp
+ 156.38dp
+ 157.55dp
+ 158.71dp
+ 159.88dp
+ 161.05dp
+ 162.21dp
+ 163.38dp
+ 164.55dp
+ 165.71dp
+ 166.88dp
+ 168.05dp
+ 169.22dp
+ 170.38dp
+ 171.55dp
+ 172.72dp
+ 173.88dp
+ 175.05dp
+ 176.22dp
+ 177.38dp
+ 178.55dp
+ 179.72dp
+ 180.89dp
+ 182.05dp
+ 183.22dp
+ 184.39dp
+ 185.55dp
+ 186.72dp
+ 187.89dp
+ 189.05dp
+ 190.22dp
+ 191.39dp
+ 192.56dp
+ 193.72dp
+ 194.89dp
+ 196.06dp
+ 197.22dp
+ 198.39dp
+ 199.56dp
+ 200.72dp
+ 201.89dp
+ 203.06dp
+ 204.22dp
+ 205.39dp
+ 206.56dp
+ 207.73dp
+ 208.89dp
+ 210.06dp
+ 211.23dp
+ 212.39dp
+ 213.56dp
+ 214.73dp
+ 215.9dp
+ 217.06dp
+ 218.23dp
+ 219.4dp
+ 220.56dp
+ 221.73dp
+ 222.9dp
+ 224.06dp
+ 225.23dp
+ 226.4dp
+ 227.56dp
+ 228.73dp
+ 229.9dp
+ 231.07dp
+ 232.23dp
+ 233.4dp
+ 234.57dp
+ 235.73dp
+ 236.9dp
+ 238.07dp
+ 239.24dp
+ 240.4dp
+ 241.57dp
+ 242.74dp
+ 243.9dp
+ 245.07dp
+ 246.24dp
+ 247.4dp
+ 248.57dp
+ 249.74dp
+ 250.91dp
+ 252.07dp
+ 253.24dp
+ 254.41dp
+ 255.57dp
+ 256.74dp
+ 257.91dp
+ 259.07dp
+ 260.24dp
+ 261.41dp
+ 262.57dp
+ 263.74dp
+ 264.91dp
+ 266.08dp
+ 267.24dp
+ 268.41dp
+ 269.58dp
+ 270.74dp
+ 271.91dp
+ 273.08dp
+ 274.25dp
+ 275.41dp
+ 276.58dp
+ 277.75dp
+ 278.91dp
+ 280.08dp
+ 281.25dp
+ 282.41dp
+ 283.58dp
+ 284.75dp
+ 285.92dp
+ 287.08dp
+ 288.25dp
+ 289.42dp
+ 290.58dp
+ 291.75dp
+ 292.92dp
+ 294.08dp
+ 295.25dp
+ 296.42dp
+ 297.59dp
+ 298.75dp
+ 299.92dp
+ 301.09dp
+ 302.25dp
+ 303.42dp
+ 304.59dp
+ 305.75dp
+ 306.92dp
+ 308.09dp
+ 309.25dp
+ 310.42dp
+ 311.59dp
+ 312.76dp
+ 313.92dp
+ 315.09dp
+ 316.26dp
+ 317.42dp
+ 318.59dp
+ 319.76dp
+ 320.93dp
+ 322.09dp
+ 323.26dp
+ 324.43dp
+ 325.59dp
+ 326.76dp
+ 327.93dp
+ 329.09dp
+ 330.26dp
+ 331.43dp
+ 332.6dp
+ 333.76dp
+ 334.93dp
+ 336.1dp
+ 337.26dp
+ 338.43dp
+ 339.6dp
+ 340.76dp
+ 341.93dp
+ 343.1dp
+ 344.26dp
+ 345.43dp
+ 346.6dp
+ 347.77dp
+ 348.93dp
+ 350.1dp
+ 351.27dp
+ 352.43dp
+ 353.6dp
+ 354.77dp
+ 355.94dp
+ 357.1dp
+ 358.27dp
+ 359.44dp
+ 360.6dp
+ 361.77dp
+ 362.94dp
+ 364.1dp
+ 365.27dp
+ 366.44dp
+ 367.61dp
+ 368.77dp
+ 369.94dp
+ 371.11dp
+ 372.27dp
+ 373.44dp
+ 374.61dp
+ 375.77dp
+ 376.94dp
+ 378.11dp
+ 379.28dp
+ 380.44dp
+ 381.61dp
+ 382.78dp
+ 383.94dp
+ 385.11dp
+ 386.28dp
+ 387.44dp
+ 388.61dp
+ 389.78dp
+ 390.94dp
+ 392.11dp
+ 393.28dp
+ 394.45dp
+ 395.61dp
+ 396.78dp
+ 397.95dp
+ 399.11dp
+ 400.28dp
+ 401.45dp
+ 402.62dp
+ 403.78dp
+ 404.95dp
+ 406.12dp
+ 407.28dp
+ 408.45dp
+ 409.62dp
+ 410.78dp
+ 411.95dp
+ 413.12dp
+ 414.29dp
+ 415.45dp
+ 416.62dp
+ 417.79dp
+ 418.95dp
+ 420.12dp
+ 421.29dp
+ 422.45dp
+ 423.62dp
+ 424.79dp
+ 425.96dp
+ 427.12dp
+ 428.29dp
+ 429.46dp
+ 430.62dp
+ 431.79dp
+ 432.96dp
+ 434.12dp
+ 435.29dp
+ 436.46dp
+ 437.63dp
+ 438.79dp
+ 439.96dp
+ 441.13dp
+ 442.29dp
+ 443.46dp
+ 444.63dp
+ 445.79dp
+ 446.96dp
+ 448.13dp
+ 449.3dp
+ 450.46dp
+ 451.63dp
+ 452.8dp
+ 453.96dp
+ 455.13dp
+ 456.3dp
+ 457.46dp
+ 458.63dp
+ 459.8dp
+ 460.97dp
+ 462.13dp
+ 463.3dp
+ 464.47dp
+ 465.63dp
+ 466.8dp
+ 467.97dp
+ 469.13dp
+ 470.3dp
+ 471.47dp
+ 472.63dp
+ 473.8dp
+ 474.97dp
+ 476.14dp
+ 477.3dp
+ 478.47dp
+ 479.64dp
+ 480.8dp
+ 481.97dp
+ 483.14dp
+ 484.31dp
+ 485.47dp
+ 486.64dp
+ 487.81dp
+ 488.97dp
+ 490.14dp
+ 491.31dp
+ 492.47dp
+ 493.64dp
+ 494.81dp
+ 495.98dp
+ 497.14dp
+ 498.31dp
+ 499.48dp
+ 500.64dp
+ 501.81dp
+ 502.98dp
+ 504.14dp
+ 505.31dp
+ 506.48dp
+ 507.65dp
+ 508.81dp
+ 509.98dp
+ 511.15dp
+ 512.31dp
+ 513.48dp
+ 514.65dp
+ 515.81dp
+ 516.98dp
+ 518.15dp
+ 519.32dp
+ 520.48dp
+ 521.65dp
+ 522.82dp
+ 523.98dp
+ 525.15dp
+ 526.32dp
+ 527.48dp
+ 528.65dp
+ 529.82dp
+ 530.99dp
+ 532.15dp
+ 533.32dp
+ 534.49dp
+ 535.65dp
+ 536.82dp
+ 537.99dp
+ 539.15dp
+ 540.32dp
+ 541.49dp
+ 542.65dp
+ 543.82dp
+ 544.99dp
+ 546.16dp
+ 547.32dp
+ 548.49dp
+ 549.66dp
+ 550.82dp
+ 551.99dp
+ 553.16dp
+ 554.33dp
+ 555.49dp
+ 556.66dp
+ 557.83dp
+ 558.99dp
+ 560.16dp
+ 561.33dp
+ 562.49dp
+ 563.66dp
+ 564.83dp
+ 566.0dp
+ 567.16dp
+ 568.33dp
+ 569.5dp
+ 570.66dp
+ 571.83dp
+ 573.0dp
+ 574.16dp
+ 575.33dp
+ 576.5dp
+ 577.66dp
+ 578.83dp
+ 580.0dp
+ 581.17dp
+ 582.33dp
+ 583.5dp
+ 584.67dp
+ 585.83dp
+ 587.0dp
+ 588.17dp
+ 589.34dp
+ 590.5dp
+ 591.67dp
+ 592.84dp
+ 594.0dp
+ 595.17dp
+ 596.34dp
+ 597.5dp
+ 598.67dp
+ 599.84dp
+ 601.0dp
+ 602.17dp
+ 603.34dp
+ 604.51dp
+ 605.67dp
+ 606.84dp
+ 608.01dp
+ 609.17dp
+ 610.34dp
+ 611.51dp
+ 612.68dp
+ 613.84dp
+ 615.01dp
+ 616.18dp
+ 617.34dp
+ 618.51dp
+ 619.68dp
+ 620.84dp
+ 622.01dp
+ 623.18dp
+ 624.35dp
+ 625.51dp
+ 626.68dp
+ 627.85dp
+ 629.01dp
+ 630.18dp
+ 631.35dp
+ 632.51dp
+ 633.68dp
+ 634.85dp
+ 636.01dp
+ 637.18dp
+ 638.35dp
+ 639.52dp
+ 640.68dp
+ 641.85dp
+ 643.02dp
+ 644.18dp
+ 645.35dp
+ 646.52dp
+ 647.69dp
+ 648.85dp
+ 650.02dp
+ 651.19dp
+ 652.35dp
+ 653.52dp
+ 654.69dp
+ 655.85dp
+ 657.02dp
+ 658.19dp
+ 659.36dp
+ 660.52dp
+ 661.69dp
+ 662.86dp
+ 664.02dp
+ 665.19dp
+ 666.36dp
+ 667.52dp
+ 668.69dp
+ 669.86dp
+ 671.02dp
+ 672.19dp
+ 673.36dp
+ 674.53dp
+ 675.69dp
+ 676.86dp
+ 678.03dp
+ 679.19dp
+ 680.36dp
+ 681.53dp
+ 682.7dp
+ 683.86dp
+ 685.03dp
+ 686.2dp
+ 687.36dp
+ 688.53dp
+ 689.7dp
+ 690.86dp
+ 692.03dp
+ 693.2dp
+ 694.37dp
+ 695.53dp
+ 696.7dp
+ 697.87dp
+ 699.03dp
+ 700.2dp
+ 701.37dp
+ 702.53dp
+ 703.7dp
+ 704.87dp
+ 706.03dp
+ 707.2dp
+ 708.37dp
+ 709.54dp
+ 710.7dp
+ 711.87dp
+ 713.04dp
+ 714.2dp
+ 715.37dp
+ 716.54dp
+ 717.71dp
+ 718.87dp
+ 720.04dp
+ 721.21dp
+ 722.37dp
+ 723.54dp
+ 724.71dp
+ 725.87dp
+ 727.04dp
+ 728.21dp
+ 729.38dp
+ 730.54dp
+ 731.71dp
+ 732.88dp
+ 734.04dp
+ 735.21dp
+ 736.38dp
+ 737.54dp
+ 738.71dp
+ 739.88dp
+ 741.05dp
+ 742.21dp
+ 743.38dp
+ 744.55dp
+ 745.71dp
+ 746.88dp
+ 748.05dp
+ 749.21dp
+ 750.38dp
+ 751.55dp
+ 752.72dp
+ 753.88dp
+ 755.05dp
+ 756.22dp
+ 757.38dp
+ 758.55dp
+ 759.72dp
+ 760.88dp
+ 762.05dp
+ 763.22dp
+ 764.38dp
+ 765.55dp
+ 766.72dp
+ 767.89dp
+ 769.05dp
+ 770.22dp
+ 771.39dp
+ 772.55dp
+ 773.72dp
+ 774.89dp
+ 776.06dp
+ 777.22dp
+ 778.39dp
+ 779.56dp
+ 780.72dp
+ 781.89dp
+ 783.06dp
+ 784.22dp
+ 785.39dp
+ 786.56dp
+ 787.73dp
+ 788.89dp
+ 790.06dp
+ 791.23dp
+ 792.39dp
+ 793.56dp
+ 794.73dp
+ 795.89dp
+ 797.06dp
+ 798.23dp
+ 799.39dp
+ 800.56dp
+ 801.73dp
+ 802.9dp
+ 804.06dp
+ 805.23dp
+ 806.4dp
+ 807.56dp
+ 808.73dp
+ 809.9dp
+ 811.07dp
+ 812.23dp
+ 813.4dp
+ 814.57dp
+ 815.73dp
+ 816.9dp
+ 818.07dp
+ 819.23dp
+ 820.4dp
+ 821.57dp
+ 822.74dp
+ 823.9dp
+ 825.07dp
+ 826.24dp
+ 827.4dp
+ 828.57dp
+ 829.74dp
+ 830.9dp
+ 832.07dp
+ 833.24dp
+ 834.4dp
+ 835.57dp
+ 836.74dp
+ 837.91dp
+ 839.07dp
+ 840.24dp
+ 841.41dp
+ 842.57dp
+ 843.74dp
+ 844.91dp
+ 846.08dp
+ 847.24dp
+ 848.41dp
+ 849.58dp
+ 850.74dp
+ 851.91dp
+ 853.08dp
+ 854.24dp
+ 855.41dp
+ 856.58dp
+ 857.75dp
+ 858.91dp
+ 860.08dp
+ 861.25dp
+ 862.41dp
+ 863.58dp
+ 864.75dp
+ 865.91dp
+ 867.08dp
+ 868.25dp
+ 869.42dp
+ 870.58dp
+ 871.75dp
+ 872.92dp
+ 874.08dp
+ 875.25dp
+ 876.42dp
+ 877.58dp
+ 878.75dp
+ 879.92dp
+ 881.09dp
+ 882.25dp
+ 883.42dp
+ 884.59dp
+ 885.75dp
+ 886.92dp
+ 888.09dp
+ 889.25dp
+ 890.42dp
+ 891.59dp
+ 892.75dp
+ 893.92dp
+ 895.09dp
+ 896.26dp
+ 897.42dp
+ 898.59dp
+ 899.76dp
+ 900.92dp
+ 902.09dp
+ 903.26dp
+ 904.43dp
+ 905.59dp
+ 906.76dp
+ 907.93dp
+ 909.09dp
+ 910.26dp
+ 911.43dp
+ 912.59dp
+ 913.76dp
+ 914.93dp
+ 916.1dp
+ 917.26dp
+ 918.43dp
+ 919.6dp
+ 920.76dp
+ 921.93dp
+ 923.1dp
+ 924.26dp
+ 925.43dp
+ 926.6dp
+ 927.76dp
+ 928.93dp
+ 930.1dp
+ 931.27dp
+ 932.43dp
+ 933.6dp
+ 934.77dp
+ 935.93dp
+ 937.1dp
+ 938.27dp
+ 939.44dp
+ 940.6dp
+ 941.77dp
+ 942.94dp
+ 944.1dp
+ 945.27dp
+ 946.44dp
+ 947.6dp
+ 948.77dp
+ 949.94dp
+ 951.11dp
+ 952.27dp
+ 953.44dp
+ 954.61dp
+ 955.77dp
+ 956.94dp
+ 958.11dp
+ 959.27dp
+ 960.44dp
+ 961.61dp
+ 962.77dp
+ 963.94dp
+ 965.11dp
+ 966.28dp
+ 967.44dp
+ 968.61dp
+ 969.78dp
+ 970.94dp
+ 972.11dp
+ 973.28dp
+ 974.45dp
+ 975.61dp
+ 976.78dp
+ 977.95dp
+ 979.11dp
+ 980.28dp
+ 981.45dp
+ 982.61dp
+ 983.78dp
+ 984.95dp
+ 986.12dp
+ 987.28dp
+ 988.45dp
+ 989.62dp
+ 990.78dp
+ 991.95dp
+ 993.12dp
+ 994.28dp
+ 995.45dp
+ 996.62dp
+ 997.79dp
+ 998.95dp
+ 1000.12dp
+ 1001.29dp
+ 1002.45dp
+ 1003.62dp
+ 1004.79dp
+ 1005.95dp
+ 1007.12dp
+ 1008.29dp
+ 1009.46dp
+ 1010.62dp
+ 1011.79dp
+ 1012.96dp
+ 1014.12dp
+ 1015.29dp
+ 1016.46dp
+ 1017.62dp
+ 1018.79dp
+ 1019.96dp
+ 1021.13dp
+ 1022.29dp
+ 1023.46dp
+ 1024.63dp
+ 1025.79dp
+ 1026.96dp
+ 1028.13dp
+ 1029.29dp
+ 1030.46dp
+ 1031.63dp
+ 1032.8dp
+ 1033.96dp
+ 1035.13dp
+ 1036.3dp
+ 1037.46dp
+ 1038.63dp
+ 1039.8dp
+ 1040.96dp
+ 1042.13dp
+ 1043.3dp
+ 1044.47dp
+ 1045.63dp
+ 1046.8dp
+ 1047.97dp
+ 1049.13dp
+ 1050.3dp
+ 1051.47dp
+ 1052.63dp
+ 1053.8dp
+ 1054.97dp
+ 1056.13dp
+ 1057.3dp
+ 1058.47dp
+ 1059.64dp
+ 1060.8dp
+ 1061.97dp
+ 1063.14dp
+ 1064.3dp
+ 1065.47dp
+ 1066.64dp
+ 1067.81dp
+ 1068.97dp
+ 1070.14dp
+ 1071.31dp
+ 1072.47dp
+ 1073.64dp
+ 1074.81dp
+ 1075.97dp
+ 1077.14dp
+ 1078.31dp
+ 1079.48dp
+ 1080.64dp
+ 1081.81dp
+ 1082.98dp
+ 1084.14dp
+ 1085.31dp
+ 1086.48dp
+ 1087.64dp
+ 1088.81dp
+ 1089.98dp
+ 1091.14dp
+ 1092.31dp
+ 1093.48dp
+ 1094.65dp
+ 1095.81dp
+ 1096.98dp
+ 1098.15dp
+ 1099.31dp
+ 1100.48dp
+ 1101.65dp
+ 1102.82dp
+ 1103.98dp
+ 1105.15dp
+ 1106.32dp
+ 1107.48dp
+ 1108.65dp
+ 1109.82dp
+ 1110.98dp
+ 1112.15dp
+ 1113.32dp
+ 1114.49dp
+ 1115.65dp
+ 1116.82dp
+ 1117.99dp
+ 1119.15dp
+ 1120.32dp
+ 1121.49dp
+ 1122.65dp
+ 1123.82dp
+ 1124.99dp
+ 1126.15dp
+ 1127.32dp
+ 1128.49dp
+ 1129.66dp
+ 1130.82dp
+ 1131.99dp
+ 1133.16dp
+ 1134.32dp
+ 1135.49dp
+ 1136.66dp
+ 1137.83dp
+ 1138.99dp
+ 1140.16dp
+ 1141.33dp
+ 1142.49dp
+ 1143.66dp
+ 1144.83dp
+ 1145.99dp
+ 1147.16dp
+ 1148.33dp
+ 1149.5dp
+ 1150.66dp
+ 1151.83dp
+ 1153.0dp
+ 1154.16dp
+ 1155.33dp
+ 1156.5dp
+ 1157.66dp
+ 1158.83dp
+ 1160.0dp
+ 1161.16dp
+ 1162.33dp
+ 1163.5dp
+ 1164.67dp
+ 1165.83dp
+ 1167.0dp
+ 1168.17dp
+ 1169.33dp
+ 1170.5dp
+ 1171.67dp
+ 1172.84dp
+ 1174.0dp
+ 1175.17dp
+ 1176.34dp
+ 1177.5dp
+ 1178.67dp
+ 1179.84dp
+ 1181.0dp
+ 1182.17dp
+ 1183.34dp
+ 1184.51dp
+ 1185.67dp
+ 1186.84dp
+ 1188.01dp
+ 1189.17dp
+ 1190.34dp
+ 1191.51dp
+ 1192.67dp
+ 1193.84dp
+ 1195.01dp
+ 1196.17dp
+ 1197.34dp
+ 1198.51dp
+ 1199.68dp
+ 1200.84dp
+ 1202.01dp
+ 1203.18dp
+ 1204.34dp
+ 1205.51dp
+ 1206.68dp
+ 1207.85dp
+ 1209.01dp
+ 1210.18dp
+ 1211.35dp
+ 1212.51dp
+ 1213.68dp
+ 1214.85dp
+ 1216.01dp
+ 1217.18dp
+ 1218.35dp
+ 1219.52dp
+ 1220.68dp
+ 1221.85dp
+ 1223.02dp
+ 1224.18dp
+ 1225.35dp
+ 1226.52dp
+ 1227.68dp
+ 1228.85dp
+ 1230.02dp
+ 1231.18dp
+ 1232.35dp
+ 1233.52dp
+ 1234.69dp
+ 1235.85dp
+ 1237.02dp
+ 1238.19dp
+ 1239.35dp
+ 1240.52dp
+ 1241.69dp
+ 1242.86dp
+ 1244.02dp
+ 1245.19dp
+ 1246.36dp
+ 1247.52dp
+ 1248.69dp
+ 1249.86dp
+ 1251.02dp
+ 1252.19dp
+ 1253.36dp
+ 1254.53dp
+ 1255.69dp
+ 1256.86dp
+ 1258.03dp
+ 1259.19dp
+ 1260.36dp
+ 5.83sp
+ 7.0sp
+ 8.17sp
+ 9.34sp
+ 10.5sp
+ 11.67sp
+ 12.84sp
+ 14.0sp
+ 15.17sp
+ 16.34sp
+ 17.5sp
+ 18.67sp
+ 19.84sp
+ 21.01sp
+ 22.17sp
+ 23.34sp
+ 24.51sp
+ 25.67sp
+ 26.84sp
+ 28.01sp
+ 29.18sp
+ 30.34sp
+ 31.51sp
+ 32.68sp
+ 33.84sp
+ 35.01sp
+ 36.18sp
+ 37.34sp
+ 38.51sp
+ 39.68sp
+ 40.84sp
+ 42.01sp
+ 43.18sp
+ 44.35sp
+ 45.51sp
+ 46.68sp
+ 47.85sp
+ 49.01sp
+ 50.18sp
+ 51.35sp
+ 52.52sp
+ 53.68sp
+ 54.85sp
+ 56.02sp
+ 57.18sp
+ 58.35sp
+ 59.52sp
+ 60.68sp
+ 61.85sp
+ 63.02sp
+ 64.19sp
+ 65.35sp
+ 66.52sp
+ 67.69sp
+ 68.85sp
+ 70.02sp
+ 71.19sp
+ 72.35sp
+ 73.52sp
+ 74.69sp
+ 75.86sp
+ 77.02sp
+ 78.19sp
+ 79.36sp
+ 80.52sp
+ 81.69sp
+ 82.86sp
+ 84.02sp
+ 85.19sp
+ 86.36sp
+ 87.53sp
+ 88.69sp
+ 89.86sp
+ 91.03sp
+ 92.19sp
+ 93.36sp
+ 94.53sp
+ 95.69sp
+ 96.86sp
+ 98.03sp
+ 99.2sp
+ 100.36sp
+ 101.53sp
+ 102.7sp
+ 103.86sp
+ 105.03sp
+ 106.2sp
+ 107.36sp
+ 108.53sp
+ 109.7sp
+ 110.87sp
+ 112.03sp
+ 113.2sp
+ 114.37sp
+ 115.53sp
+ 116.7sp
diff --git a/app/src/main/res/values-sw440dp/dimens.xml b/app/src/main/res/values-sw440dp/dimens.xml
index b39d5ae..740e522 100644
--- a/app/src/main/res/values-sw440dp/dimens.xml
+++ b/app/src/main/res/values-sw440dp/dimens.xml
@@ -1082,6 +1082,7 @@
-2.44dp
-1.22dp
0.0dp
+ 0.61dp
1.22dp
2.44dp
3.67dp
diff --git a/app/src/main/res/values-sw460dp/dimens.xml b/app/src/main/res/values-sw460dp/dimens.xml
index d618482..a8b7246 100644
--- a/app/src/main/res/values-sw460dp/dimens.xml
+++ b/app/src/main/res/values-sw460dp/dimens.xml
@@ -1082,6 +1082,7 @@
-2.56dp
-1.28dp
0.0dp
+ 0.64dp
1.28dp
2.56dp
3.83dp
diff --git a/app/src/main/res/values-sw480dp/dimens.xml b/app/src/main/res/values-sw480dp/dimens.xml
index 64642d2..30fda63 100644
--- a/app/src/main/res/values-sw480dp/dimens.xml
+++ b/app/src/main/res/values-sw480dp/dimens.xml
@@ -1082,6 +1082,7 @@
-2.67dp
-1.33dp
0.0dp
+ 0.67dp
1.33dp
2.67dp
4.0dp
diff --git a/app/src/main/res/values-sw500dp/dimens.xml b/app/src/main/res/values-sw500dp/dimens.xml
index 639b002..ef1173c 100644
--- a/app/src/main/res/values-sw500dp/dimens.xml
+++ b/app/src/main/res/values-sw500dp/dimens.xml
@@ -1082,6 +1082,7 @@
-2.78dp
-1.39dp
0.0dp
+ 0.7dp
1.39dp
2.78dp
4.17dp
diff --git a/app/src/main/res/values-sw520dp/dimens.xml b/app/src/main/res/values-sw520dp/dimens.xml
index cf90623..830c3fa 100644
--- a/app/src/main/res/values-sw520dp/dimens.xml
+++ b/app/src/main/res/values-sw520dp/dimens.xml
@@ -1082,6 +1082,7 @@
-2.89dp
-1.44dp
0.0dp
+ 0.72dp
1.44dp
2.89dp
4.33dp
diff --git a/app/src/main/res/values/attr_widget.xml b/app/src/main/res/values/attr_widget.xml
new file mode 100644
index 0000000..87a771a
--- /dev/null
+++ b/app/src/main/res/values/attr_widget.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8dp
+ 4dp
+ 12sp
+ 12sp
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/color.xml b/app/src/main/res/values/color.xml
index 6333e33..6df34dd 100644
--- a/app/src/main/res/values/color.xml
+++ b/app/src/main/res/values/color.xml
@@ -1,18 +1,16 @@
+ #2964DA
+
#f8f8f8
#333333
#999
#ffffff
#000000
+ #2964DA
+ #EBEBEB
+ #727778
- #f2f2f2
- #F3AE42
- #1A000000
- #AAA
- #00B050
- #FFFF00
- #ff0000
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index cf90623..c4efc82 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -1,2261 +1,2262 @@
- -1559.52dp
- -1558.08dp
- -1556.63dp
- -1555.19dp
- -1553.74dp
- -1552.3dp
- -1550.86dp
- -1549.41dp
- -1547.97dp
- -1546.52dp
- -1545.08dp
- -1543.64dp
- -1542.19dp
- -1540.75dp
- -1539.3dp
- -1537.86dp
- -1536.42dp
- -1534.97dp
- -1533.53dp
- -1532.08dp
- -1530.64dp
- -1529.2dp
- -1527.75dp
- -1526.31dp
- -1524.86dp
- -1523.42dp
- -1521.98dp
- -1520.53dp
- -1519.09dp
- -1517.64dp
- -1516.2dp
- -1514.76dp
- -1513.31dp
- -1511.87dp
- -1510.42dp
- -1508.98dp
- -1507.54dp
- -1506.09dp
- -1504.65dp
- -1503.2dp
- -1501.76dp
- -1500.32dp
- -1498.87dp
- -1497.43dp
- -1495.98dp
- -1494.54dp
- -1493.1dp
- -1491.65dp
- -1490.21dp
- -1488.76dp
- -1487.32dp
- -1485.88dp
- -1484.43dp
- -1482.99dp
- -1481.54dp
- -1480.1dp
- -1478.66dp
- -1477.21dp
- -1475.77dp
- -1474.32dp
- -1472.88dp
- -1471.44dp
- -1469.99dp
- -1468.55dp
- -1467.1dp
- -1465.66dp
- -1464.22dp
- -1462.77dp
- -1461.33dp
- -1459.88dp
- -1458.44dp
- -1457.0dp
- -1455.55dp
- -1454.11dp
- -1452.66dp
- -1451.22dp
- -1449.78dp
- -1448.33dp
- -1446.89dp
- -1445.44dp
- -1444.0dp
- -1442.56dp
- -1441.11dp
- -1439.67dp
- -1438.22dp
- -1436.78dp
- -1435.34dp
- -1433.89dp
- -1432.45dp
- -1431.0dp
- -1429.56dp
- -1428.12dp
- -1426.67dp
- -1425.23dp
- -1423.78dp
- -1422.34dp
- -1420.9dp
- -1419.45dp
- -1418.01dp
- -1416.56dp
- -1415.12dp
- -1413.68dp
- -1412.23dp
- -1410.79dp
- -1409.34dp
- -1407.9dp
- -1406.46dp
- -1405.01dp
- -1403.57dp
- -1402.12dp
- -1400.68dp
- -1399.24dp
- -1397.79dp
- -1396.35dp
- -1394.9dp
- -1393.46dp
- -1392.02dp
- -1390.57dp
- -1389.13dp
- -1387.68dp
- -1386.24dp
- -1384.8dp
- -1383.35dp
- -1381.91dp
- -1380.46dp
- -1379.02dp
- -1377.58dp
- -1376.13dp
- -1374.69dp
- -1373.24dp
- -1371.8dp
- -1370.36dp
- -1368.91dp
- -1367.47dp
- -1366.02dp
- -1364.58dp
- -1363.14dp
- -1361.69dp
- -1360.25dp
- -1358.8dp
- -1357.36dp
- -1355.92dp
- -1354.47dp
- -1353.03dp
- -1351.58dp
- -1350.14dp
- -1348.7dp
- -1347.25dp
- -1345.81dp
- -1344.36dp
- -1342.92dp
- -1341.48dp
- -1340.03dp
- -1338.59dp
- -1337.14dp
- -1335.7dp
- -1334.26dp
- -1332.81dp
- -1331.37dp
- -1329.92dp
- -1328.48dp
- -1327.04dp
- -1325.59dp
- -1324.15dp
- -1322.7dp
- -1321.26dp
- -1319.82dp
- -1318.37dp
- -1316.93dp
- -1315.48dp
- -1314.04dp
- -1312.6dp
- -1311.15dp
- -1309.71dp
- -1308.26dp
- -1306.82dp
- -1305.38dp
- -1303.93dp
- -1302.49dp
- -1301.04dp
- -1299.6dp
- -1298.16dp
- -1296.71dp
- -1295.27dp
- -1293.82dp
- -1292.38dp
- -1290.94dp
- -1289.49dp
- -1288.05dp
- -1286.6dp
- -1285.16dp
- -1283.72dp
- -1282.27dp
- -1280.83dp
- -1279.38dp
- -1277.94dp
- -1276.5dp
- -1275.05dp
- -1273.61dp
- -1272.16dp
- -1270.72dp
- -1269.28dp
- -1267.83dp
- -1266.39dp
- -1264.94dp
- -1263.5dp
- -1262.06dp
- -1260.61dp
- -1259.17dp
- -1257.72dp
- -1256.28dp
- -1254.84dp
- -1253.39dp
- -1251.95dp
- -1250.5dp
- -1249.06dp
- -1247.62dp
- -1246.17dp
- -1244.73dp
- -1243.28dp
- -1241.84dp
- -1240.4dp
- -1238.95dp
- -1237.51dp
- -1236.06dp
- -1234.62dp
- -1233.18dp
- -1231.73dp
- -1230.29dp
- -1228.84dp
- -1227.4dp
- -1225.96dp
- -1224.51dp
- -1223.07dp
- -1221.62dp
- -1220.18dp
- -1218.74dp
- -1217.29dp
- -1215.85dp
- -1214.4dp
- -1212.96dp
- -1211.52dp
- -1210.07dp
- -1208.63dp
- -1207.18dp
- -1205.74dp
- -1204.3dp
- -1202.85dp
- -1201.41dp
- -1199.96dp
- -1198.52dp
- -1197.08dp
- -1195.63dp
- -1194.19dp
- -1192.74dp
- -1191.3dp
- -1189.86dp
- -1188.41dp
- -1186.97dp
- -1185.52dp
- -1184.08dp
- -1182.64dp
- -1181.19dp
- -1179.75dp
- -1178.3dp
- -1176.86dp
- -1175.42dp
- -1173.97dp
- -1172.53dp
- -1171.08dp
- -1169.64dp
- -1168.2dp
- -1166.75dp
- -1165.31dp
- -1163.86dp
- -1162.42dp
- -1160.98dp
- -1159.53dp
- -1158.09dp
- -1156.64dp
- -1155.2dp
- -1153.76dp
- -1152.31dp
- -1150.87dp
- -1149.42dp
- -1147.98dp
- -1146.54dp
- -1145.09dp
- -1143.65dp
- -1142.2dp
- -1140.76dp
- -1139.32dp
- -1137.87dp
- -1136.43dp
- -1134.98dp
- -1133.54dp
- -1132.1dp
- -1130.65dp
- -1129.21dp
- -1127.76dp
- -1126.32dp
- -1124.88dp
- -1123.43dp
- -1121.99dp
- -1120.54dp
- -1119.1dp
- -1117.66dp
- -1116.21dp
- -1114.77dp
- -1113.32dp
- -1111.88dp
- -1110.44dp
- -1108.99dp
- -1107.55dp
- -1106.1dp
- -1104.66dp
- -1103.22dp
- -1101.77dp
- -1100.33dp
- -1098.88dp
- -1097.44dp
- -1096.0dp
- -1094.55dp
- -1093.11dp
- -1091.66dp
- -1090.22dp
- -1088.78dp
- -1087.33dp
- -1085.89dp
- -1084.44dp
- -1083.0dp
- -1081.56dp
- -1080.11dp
- -1078.67dp
- -1077.22dp
- -1075.78dp
- -1074.34dp
- -1072.89dp
- -1071.45dp
- -1070.0dp
- -1068.56dp
- -1067.12dp
- -1065.67dp
- -1064.23dp
- -1062.78dp
- -1061.34dp
- -1059.9dp
- -1058.45dp
- -1057.01dp
- -1055.56dp
- -1054.12dp
- -1052.68dp
- -1051.23dp
- -1049.79dp
- -1048.34dp
- -1046.9dp
- -1045.46dp
- -1044.01dp
- -1042.57dp
- -1041.12dp
- -1039.68dp
- -1038.24dp
- -1036.79dp
- -1035.35dp
- -1033.9dp
- -1032.46dp
- -1031.02dp
- -1029.57dp
- -1028.13dp
- -1026.68dp
- -1025.24dp
- -1023.8dp
- -1022.35dp
- -1020.91dp
- -1019.46dp
- -1018.02dp
- -1016.58dp
- -1015.13dp
- -1013.69dp
- -1012.24dp
- -1010.8dp
- -1009.36dp
- -1007.91dp
- -1006.47dp
- -1005.02dp
- -1003.58dp
- -1002.14dp
- -1000.69dp
- -999.25dp
- -997.8dp
- -996.36dp
- -994.92dp
- -993.47dp
- -992.03dp
- -990.58dp
- -989.14dp
- -987.7dp
- -986.25dp
- -984.81dp
- -983.36dp
- -981.92dp
- -980.48dp
- -979.03dp
- -977.59dp
- -976.14dp
- -974.7dp
- -973.26dp
- -971.81dp
- -970.37dp
- -968.92dp
- -967.48dp
- -966.04dp
- -964.59dp
- -963.15dp
- -961.7dp
- -960.26dp
- -958.82dp
- -957.37dp
- -955.93dp
- -954.48dp
- -953.04dp
- -951.6dp
- -950.15dp
- -948.71dp
- -947.26dp
- -945.82dp
- -944.38dp
- -942.93dp
- -941.49dp
- -940.04dp
- -938.6dp
- -937.16dp
- -935.71dp
- -934.27dp
- -932.82dp
- -931.38dp
- -929.94dp
- -928.49dp
- -927.05dp
- -925.6dp
- -924.16dp
- -922.72dp
- -921.27dp
- -919.83dp
- -918.38dp
- -916.94dp
- -915.5dp
- -914.05dp
- -912.61dp
- -911.16dp
- -909.72dp
- -908.28dp
- -906.83dp
- -905.39dp
- -903.94dp
- -902.5dp
- -901.06dp
- -899.61dp
- -898.17dp
- -896.72dp
- -895.28dp
- -893.84dp
- -892.39dp
- -890.95dp
- -889.5dp
- -888.06dp
- -886.62dp
- -885.17dp
- -883.73dp
- -882.28dp
- -880.84dp
- -879.4dp
- -877.95dp
- -876.51dp
- -875.06dp
- -873.62dp
- -872.18dp
- -870.73dp
- -869.29dp
- -867.84dp
- -866.4dp
- -864.96dp
- -863.51dp
- -862.07dp
- -860.62dp
- -859.18dp
- -857.74dp
- -856.29dp
- -854.85dp
- -853.4dp
- -851.96dp
- -850.52dp
- -849.07dp
- -847.63dp
- -846.18dp
- -844.74dp
- -843.3dp
- -841.85dp
- -840.41dp
- -838.96dp
- -837.52dp
- -836.08dp
- -834.63dp
- -833.19dp
- -831.74dp
- -830.3dp
- -828.86dp
- -827.41dp
- -825.97dp
- -824.52dp
- -823.08dp
- -821.64dp
- -820.19dp
- -818.75dp
- -817.3dp
- -815.86dp
- -814.42dp
- -812.97dp
- -811.53dp
- -810.08dp
- -808.64dp
- -807.2dp
- -805.75dp
- -804.31dp
- -802.86dp
- -801.42dp
- -799.98dp
- -798.53dp
- -797.09dp
- -795.64dp
- -794.2dp
- -792.76dp
- -791.31dp
- -789.87dp
- -788.42dp
- -786.98dp
- -785.54dp
- -784.09dp
- -782.65dp
- -781.2dp
- -779.76dp
- -778.32dp
- -776.87dp
- -775.43dp
- -773.98dp
- -772.54dp
- -771.1dp
- -769.65dp
- -768.21dp
- -766.76dp
- -765.32dp
- -763.88dp
- -762.43dp
- -760.99dp
- -759.54dp
- -758.1dp
- -756.66dp
- -755.21dp
- -753.77dp
- -752.32dp
- -750.88dp
- -749.44dp
- -747.99dp
- -746.55dp
- -745.1dp
- -743.66dp
- -742.22dp
- -740.77dp
- -739.33dp
- -737.88dp
- -736.44dp
- -735.0dp
- -733.55dp
- -732.11dp
- -730.66dp
- -729.22dp
- -727.78dp
- -726.33dp
- -724.89dp
- -723.44dp
- -722.0dp
- -720.56dp
- -719.11dp
- -717.67dp
- -716.22dp
- -714.78dp
- -713.34dp
- -711.89dp
- -710.45dp
- -709.0dp
- -707.56dp
- -706.12dp
- -704.67dp
- -703.23dp
- -701.78dp
- -700.34dp
- -698.9dp
- -697.45dp
- -696.01dp
- -694.56dp
- -693.12dp
- -691.68dp
- -690.23dp
- -688.79dp
- -687.34dp
- -685.9dp
- -684.46dp
- -683.01dp
- -681.57dp
- -680.12dp
- -678.68dp
- -677.24dp
- -675.79dp
- -674.35dp
- -672.9dp
- -671.46dp
- -670.02dp
- -668.57dp
- -667.13dp
- -665.68dp
- -664.24dp
- -662.8dp
- -661.35dp
- -659.91dp
- -658.46dp
- -657.02dp
- -655.58dp
- -654.13dp
- -652.69dp
- -651.24dp
- -649.8dp
- -648.36dp
- -646.91dp
- -645.47dp
- -644.02dp
- -642.58dp
- -641.14dp
- -639.69dp
- -638.25dp
- -636.8dp
- -635.36dp
- -633.92dp
- -632.47dp
- -631.03dp
- -629.58dp
- -628.14dp
- -626.7dp
- -625.25dp
- -623.81dp
- -622.36dp
- -620.92dp
- -619.48dp
- -618.03dp
- -616.59dp
- -615.14dp
- -613.7dp
- -612.26dp
- -610.81dp
- -609.37dp
- -607.92dp
- -606.48dp
- -605.04dp
- -603.59dp
- -602.15dp
- -600.7dp
- -599.26dp
- -597.82dp
- -596.37dp
- -594.93dp
- -593.48dp
- -592.04dp
- -590.6dp
- -589.15dp
- -587.71dp
- -586.26dp
- -584.82dp
- -583.38dp
- -581.93dp
- -580.49dp
- -579.04dp
- -577.6dp
- -576.16dp
- -574.71dp
- -573.27dp
- -571.82dp
- -570.38dp
- -568.94dp
- -567.49dp
- -566.05dp
- -564.6dp
- -563.16dp
- -561.72dp
- -560.27dp
- -558.83dp
- -557.38dp
- -555.94dp
- -554.5dp
- -553.05dp
- -551.61dp
- -550.16dp
- -548.72dp
- -547.28dp
- -545.83dp
- -544.39dp
- -542.94dp
- -541.5dp
- -540.06dp
- -538.61dp
- -537.17dp
- -535.72dp
- -534.28dp
- -532.84dp
- -531.39dp
- -529.95dp
- -528.5dp
- -527.06dp
- -525.62dp
- -524.17dp
- -522.73dp
- -521.28dp
- -519.84dp
- -518.4dp
- -516.95dp
- -515.51dp
- -514.06dp
- -512.62dp
- -511.18dp
- -509.73dp
- -508.29dp
- -506.84dp
- -505.4dp
- -503.96dp
- -502.51dp
- -501.07dp
- -499.62dp
- -498.18dp
- -496.74dp
- -495.29dp
- -493.85dp
- -492.4dp
- -490.96dp
- -489.52dp
- -488.07dp
- -486.63dp
- -485.18dp
- -483.74dp
- -482.3dp
- -480.85dp
- -479.41dp
- -477.96dp
- -476.52dp
- -475.08dp
- -473.63dp
- -472.19dp
- -470.74dp
- -469.3dp
- -467.86dp
- -466.41dp
- -464.97dp
- -463.52dp
- -462.08dp
- -460.64dp
- -459.19dp
- -457.75dp
- -456.3dp
- -454.86dp
- -453.42dp
- -451.97dp
- -450.53dp
- -449.08dp
- -447.64dp
- -446.2dp
- -444.75dp
- -443.31dp
- -441.86dp
- -440.42dp
- -438.98dp
- -437.53dp
- -436.09dp
- -434.64dp
- -433.2dp
- -431.76dp
- -430.31dp
- -428.87dp
- -427.42dp
- -425.98dp
- -424.54dp
- -423.09dp
- -421.65dp
- -420.2dp
- -418.76dp
- -417.32dp
- -415.87dp
- -414.43dp
- -412.98dp
- -411.54dp
- -410.1dp
- -408.65dp
- -407.21dp
- -405.76dp
- -404.32dp
- -402.88dp
- -401.43dp
- -399.99dp
- -398.54dp
- -397.1dp
- -395.66dp
- -394.21dp
- -392.77dp
- -391.32dp
- -389.88dp
- -388.44dp
- -386.99dp
- -385.55dp
- -384.1dp
- -382.66dp
- -381.22dp
- -379.77dp
- -378.33dp
- -376.88dp
- -375.44dp
- -374.0dp
- -372.55dp
- -371.11dp
- -369.66dp
- -368.22dp
- -366.78dp
- -365.33dp
- -363.89dp
- -362.44dp
- -361.0dp
- -359.56dp
- -358.11dp
- -356.67dp
- -355.22dp
- -353.78dp
- -352.34dp
- -350.89dp
- -349.45dp
- -348.0dp
- -346.56dp
- -345.12dp
- -343.67dp
- -342.23dp
- -340.78dp
- -339.34dp
- -337.9dp
- -336.45dp
- -335.01dp
- -333.56dp
- -332.12dp
- -330.68dp
- -329.23dp
- -327.79dp
- -326.34dp
- -324.9dp
- -323.46dp
- -322.01dp
- -320.57dp
- -319.12dp
- -317.68dp
- -316.24dp
- -314.79dp
- -313.35dp
- -311.9dp
- -310.46dp
- -309.02dp
- -307.57dp
- -306.13dp
- -304.68dp
- -303.24dp
- -301.8dp
- -300.35dp
- -298.91dp
- -297.46dp
- -296.02dp
- -294.58dp
- -293.13dp
- -291.69dp
- -290.24dp
- -288.8dp
- -287.36dp
- -285.91dp
- -284.47dp
- -283.02dp
- -281.58dp
- -280.14dp
- -278.69dp
- -277.25dp
- -275.8dp
- -274.36dp
- -272.92dp
- -271.47dp
- -270.03dp
- -268.58dp
- -267.14dp
- -265.7dp
- -264.25dp
- -262.81dp
- -261.36dp
- -259.92dp
- -258.48dp
- -257.03dp
- -255.59dp
- -254.14dp
- -252.7dp
- -251.26dp
- -249.81dp
- -248.37dp
- -246.92dp
- -245.48dp
- -244.04dp
- -242.59dp
- -241.15dp
- -239.7dp
- -238.26dp
- -236.82dp
- -235.37dp
- -233.93dp
- -232.48dp
- -231.04dp
- -229.6dp
- -228.15dp
- -226.71dp
- -225.26dp
- -223.82dp
- -222.38dp
- -220.93dp
- -219.49dp
- -218.04dp
- -216.6dp
- -215.16dp
- -213.71dp
- -212.27dp
- -210.82dp
- -209.38dp
- -207.94dp
- -206.49dp
- -205.05dp
- -203.6dp
- -202.16dp
- -200.72dp
- -199.27dp
- -197.83dp
- -196.38dp
- -194.94dp
- -193.5dp
- -192.05dp
- -190.61dp
- -189.16dp
- -187.72dp
- -186.28dp
- -184.83dp
- -183.39dp
- -181.94dp
- -180.5dp
- -179.06dp
- -177.61dp
- -176.17dp
- -174.72dp
- -173.28dp
- -171.84dp
- -170.39dp
- -168.95dp
- -167.5dp
- -166.06dp
- -164.62dp
- -163.17dp
- -161.73dp
- -160.28dp
- -158.84dp
- -157.4dp
- -155.95dp
- -154.51dp
- -153.06dp
- -151.62dp
- -150.18dp
- -148.73dp
- -147.29dp
- -145.84dp
- -144.4dp
- -142.96dp
- -141.51dp
- -140.07dp
- -138.62dp
- -137.18dp
- -135.74dp
- -134.29dp
- -132.85dp
- -131.4dp
- -129.96dp
- -128.52dp
- -127.07dp
- -125.63dp
- -124.18dp
- -122.74dp
- -121.3dp
- -119.85dp
- -118.41dp
- -116.96dp
- -115.52dp
- -114.08dp
- -112.63dp
- -111.19dp
- -109.74dp
- -108.3dp
- -106.86dp
- -105.41dp
- -103.97dp
- -102.52dp
- -101.08dp
- -99.64dp
- -98.19dp
- -96.75dp
- -95.3dp
- -93.86dp
- -92.42dp
- -90.97dp
- -89.53dp
- -88.08dp
- -86.64dp
- -85.2dp
- -83.75dp
- -82.31dp
- -80.86dp
- -79.42dp
- -77.98dp
- -76.53dp
- -75.09dp
- -73.64dp
- -72.2dp
- -70.76dp
- -69.31dp
- -67.87dp
- -66.42dp
- -64.98dp
- -63.54dp
- -62.09dp
- -60.65dp
- -59.2dp
- -57.76dp
- -56.32dp
- -54.87dp
- -53.43dp
- -51.98dp
- -50.54dp
- -49.1dp
- -47.65dp
- -46.21dp
- -44.76dp
- -43.32dp
- -41.88dp
- -40.43dp
- -38.99dp
- -37.54dp
- -36.1dp
- -34.66dp
- -33.21dp
- -31.77dp
- -30.32dp
- -28.88dp
- -27.44dp
- -25.99dp
- -24.55dp
- -23.1dp
- -21.66dp
- -20.22dp
- -18.77dp
- -17.33dp
- -15.88dp
- -14.44dp
- -13.0dp
- -11.55dp
- -10.11dp
- -8.66dp
- -7.22dp
- -5.78dp
- -4.33dp
- -2.89dp
- -1.44dp
- 0.0dp
- 1.44dp
- 2.89dp
- 4.33dp
- 5.78dp
- 7.22dp
- 8.66dp
- 10.11dp
- 11.55dp
- 13.0dp
- 14.44dp
- 15.88dp
- 17.33dp
- 18.77dp
- 20.22dp
- 21.66dp
- 23.1dp
- 24.55dp
- 25.99dp
- 27.44dp
- 28.88dp
- 30.32dp
- 31.77dp
- 33.21dp
- 34.66dp
- 36.1dp
- 37.54dp
- 38.99dp
- 40.43dp
- 41.88dp
- 43.32dp
- 44.76dp
- 46.21dp
- 47.65dp
- 49.1dp
- 50.54dp
- 51.98dp
- 53.43dp
- 54.87dp
- 56.32dp
- 57.76dp
- 59.2dp
- 60.65dp
- 62.09dp
- 63.54dp
- 64.98dp
- 66.42dp
- 67.87dp
- 69.31dp
- 70.76dp
- 72.2dp
- 73.64dp
- 75.09dp
- 76.53dp
- 77.98dp
- 79.42dp
- 80.86dp
- 82.31dp
- 83.75dp
- 85.2dp
- 86.64dp
- 88.08dp
- 89.53dp
- 90.97dp
- 92.42dp
- 93.86dp
- 95.3dp
- 96.75dp
- 98.19dp
- 99.64dp
- 101.08dp
- 102.52dp
- 103.97dp
- 105.41dp
- 106.86dp
- 108.3dp
- 109.74dp
- 111.19dp
- 112.63dp
- 114.08dp
- 115.52dp
- 116.96dp
- 118.41dp
- 119.85dp
- 121.3dp
- 122.74dp
- 124.18dp
- 125.63dp
- 127.07dp
- 128.52dp
- 129.96dp
- 131.4dp
- 132.85dp
- 134.29dp
- 135.74dp
- 137.18dp
- 138.62dp
- 140.07dp
- 141.51dp
- 142.96dp
- 144.4dp
- 145.84dp
- 147.29dp
- 148.73dp
- 150.18dp
- 151.62dp
- 153.06dp
- 154.51dp
- 155.95dp
- 157.4dp
- 158.84dp
- 160.28dp
- 161.73dp
- 163.17dp
- 164.62dp
- 166.06dp
- 167.5dp
- 168.95dp
- 170.39dp
- 171.84dp
- 173.28dp
- 174.72dp
- 176.17dp
- 177.61dp
- 179.06dp
- 180.5dp
- 181.94dp
- 183.39dp
- 184.83dp
- 186.28dp
- 187.72dp
- 189.16dp
- 190.61dp
- 192.05dp
- 193.5dp
- 194.94dp
- 196.38dp
- 197.83dp
- 199.27dp
- 200.72dp
- 202.16dp
- 203.6dp
- 205.05dp
- 206.49dp
- 207.94dp
- 209.38dp
- 210.82dp
- 212.27dp
- 213.71dp
- 215.16dp
- 216.6dp
- 218.04dp
- 219.49dp
- 220.93dp
- 222.38dp
- 223.82dp
- 225.26dp
- 226.71dp
- 228.15dp
- 229.6dp
- 231.04dp
- 232.48dp
- 233.93dp
- 235.37dp
- 236.82dp
- 238.26dp
- 239.7dp
- 241.15dp
- 242.59dp
- 244.04dp
- 245.48dp
- 246.92dp
- 248.37dp
- 249.81dp
- 251.26dp
- 252.7dp
- 254.14dp
- 255.59dp
- 257.03dp
- 258.48dp
- 259.92dp
- 261.36dp
- 262.81dp
- 264.25dp
- 265.7dp
- 267.14dp
- 268.58dp
- 270.03dp
- 271.47dp
- 272.92dp
- 274.36dp
- 275.8dp
- 277.25dp
- 278.69dp
- 280.14dp
- 281.58dp
- 283.02dp
- 284.47dp
- 285.91dp
- 287.36dp
- 288.8dp
- 290.24dp
- 291.69dp
- 293.13dp
- 294.58dp
- 296.02dp
- 297.46dp
- 298.91dp
- 300.35dp
- 301.8dp
- 303.24dp
- 304.68dp
- 306.13dp
- 307.57dp
- 309.02dp
- 310.46dp
- 311.9dp
- 313.35dp
- 314.79dp
- 316.24dp
- 317.68dp
- 319.12dp
- 320.57dp
- 322.01dp
- 323.46dp
- 324.9dp
- 326.34dp
- 327.79dp
- 329.23dp
- 330.68dp
- 332.12dp
- 333.56dp
- 335.01dp
- 336.45dp
- 337.9dp
- 339.34dp
- 340.78dp
- 342.23dp
- 343.67dp
- 345.12dp
- 346.56dp
- 348.0dp
- 349.45dp
- 350.89dp
- 352.34dp
- 353.78dp
- 355.22dp
- 356.67dp
- 358.11dp
- 359.56dp
- 361.0dp
- 362.44dp
- 363.89dp
- 365.33dp
- 366.78dp
- 368.22dp
- 369.66dp
- 371.11dp
- 372.55dp
- 374.0dp
- 375.44dp
- 376.88dp
- 378.33dp
- 379.77dp
- 381.22dp
- 382.66dp
- 384.1dp
- 385.55dp
- 386.99dp
- 388.44dp
- 389.88dp
- 391.32dp
- 392.77dp
- 394.21dp
- 395.66dp
- 397.1dp
- 398.54dp
- 399.99dp
- 401.43dp
- 402.88dp
- 404.32dp
- 405.76dp
- 407.21dp
- 408.65dp
- 410.1dp
- 411.54dp
- 412.98dp
- 414.43dp
- 415.87dp
- 417.32dp
- 418.76dp
- 420.2dp
- 421.65dp
- 423.09dp
- 424.54dp
- 425.98dp
- 427.42dp
- 428.87dp
- 430.31dp
- 431.76dp
- 433.2dp
- 434.64dp
- 436.09dp
- 437.53dp
- 438.98dp
- 440.42dp
- 441.86dp
- 443.31dp
- 444.75dp
- 446.2dp
- 447.64dp
- 449.08dp
- 450.53dp
- 451.97dp
- 453.42dp
- 454.86dp
- 456.3dp
- 457.75dp
- 459.19dp
- 460.64dp
- 462.08dp
- 463.52dp
- 464.97dp
- 466.41dp
- 467.86dp
- 469.3dp
- 470.74dp
- 472.19dp
- 473.63dp
- 475.08dp
- 476.52dp
- 477.96dp
- 479.41dp
- 480.85dp
- 482.3dp
- 483.74dp
- 485.18dp
- 486.63dp
- 488.07dp
- 489.52dp
- 490.96dp
- 492.4dp
- 493.85dp
- 495.29dp
- 496.74dp
- 498.18dp
- 499.62dp
- 501.07dp
- 502.51dp
- 503.96dp
- 505.4dp
- 506.84dp
- 508.29dp
- 509.73dp
- 511.18dp
- 512.62dp
- 514.06dp
- 515.51dp
- 516.95dp
- 518.4dp
- 519.84dp
- 521.28dp
- 522.73dp
- 524.17dp
- 525.62dp
- 527.06dp
- 528.5dp
- 529.95dp
- 531.39dp
- 532.84dp
- 534.28dp
- 535.72dp
- 537.17dp
- 538.61dp
- 540.06dp
- 541.5dp
- 542.94dp
- 544.39dp
- 545.83dp
- 547.28dp
- 548.72dp
- 550.16dp
- 551.61dp
- 553.05dp
- 554.5dp
- 555.94dp
- 557.38dp
- 558.83dp
- 560.27dp
- 561.72dp
- 563.16dp
- 564.6dp
- 566.05dp
- 567.49dp
- 568.94dp
- 570.38dp
- 571.82dp
- 573.27dp
- 574.71dp
- 576.16dp
- 577.6dp
- 579.04dp
- 580.49dp
- 581.93dp
- 583.38dp
- 584.82dp
- 586.26dp
- 587.71dp
- 589.15dp
- 590.6dp
- 592.04dp
- 593.48dp
- 594.93dp
- 596.37dp
- 597.82dp
- 599.26dp
- 600.7dp
- 602.15dp
- 603.59dp
- 605.04dp
- 606.48dp
- 607.92dp
- 609.37dp
- 610.81dp
- 612.26dp
- 613.7dp
- 615.14dp
- 616.59dp
- 618.03dp
- 619.48dp
- 620.92dp
- 622.36dp
- 623.81dp
- 625.25dp
- 626.7dp
- 628.14dp
- 629.58dp
- 631.03dp
- 632.47dp
- 633.92dp
- 635.36dp
- 636.8dp
- 638.25dp
- 639.69dp
- 641.14dp
- 642.58dp
- 644.02dp
- 645.47dp
- 646.91dp
- 648.36dp
- 649.8dp
- 651.24dp
- 652.69dp
- 654.13dp
- 655.58dp
- 657.02dp
- 658.46dp
- 659.91dp
- 661.35dp
- 662.8dp
- 664.24dp
- 665.68dp
- 667.13dp
- 668.57dp
- 670.02dp
- 671.46dp
- 672.9dp
- 674.35dp
- 675.79dp
- 677.24dp
- 678.68dp
- 680.12dp
- 681.57dp
- 683.01dp
- 684.46dp
- 685.9dp
- 687.34dp
- 688.79dp
- 690.23dp
- 691.68dp
- 693.12dp
- 694.56dp
- 696.01dp
- 697.45dp
- 698.9dp
- 700.34dp
- 701.78dp
- 703.23dp
- 704.67dp
- 706.12dp
- 707.56dp
- 709.0dp
- 710.45dp
- 711.89dp
- 713.34dp
- 714.78dp
- 716.22dp
- 717.67dp
- 719.11dp
- 720.56dp
- 722.0dp
- 723.44dp
- 724.89dp
- 726.33dp
- 727.78dp
- 729.22dp
- 730.66dp
- 732.11dp
- 733.55dp
- 735.0dp
- 736.44dp
- 737.88dp
- 739.33dp
- 740.77dp
- 742.22dp
- 743.66dp
- 745.1dp
- 746.55dp
- 747.99dp
- 749.44dp
- 750.88dp
- 752.32dp
- 753.77dp
- 755.21dp
- 756.66dp
- 758.1dp
- 759.54dp
- 760.99dp
- 762.43dp
- 763.88dp
- 765.32dp
- 766.76dp
- 768.21dp
- 769.65dp
- 771.1dp
- 772.54dp
- 773.98dp
- 775.43dp
- 776.87dp
- 778.32dp
- 779.76dp
- 781.2dp
- 782.65dp
- 784.09dp
- 785.54dp
- 786.98dp
- 788.42dp
- 789.87dp
- 791.31dp
- 792.76dp
- 794.2dp
- 795.64dp
- 797.09dp
- 798.53dp
- 799.98dp
- 801.42dp
- 802.86dp
- 804.31dp
- 805.75dp
- 807.2dp
- 808.64dp
- 810.08dp
- 811.53dp
- 812.97dp
- 814.42dp
- 815.86dp
- 817.3dp
- 818.75dp
- 820.19dp
- 821.64dp
- 823.08dp
- 824.52dp
- 825.97dp
- 827.41dp
- 828.86dp
- 830.3dp
- 831.74dp
- 833.19dp
- 834.63dp
- 836.08dp
- 837.52dp
- 838.96dp
- 840.41dp
- 841.85dp
- 843.3dp
- 844.74dp
- 846.18dp
- 847.63dp
- 849.07dp
- 850.52dp
- 851.96dp
- 853.4dp
- 854.85dp
- 856.29dp
- 857.74dp
- 859.18dp
- 860.62dp
- 862.07dp
- 863.51dp
- 864.96dp
- 866.4dp
- 867.84dp
- 869.29dp
- 870.73dp
- 872.18dp
- 873.62dp
- 875.06dp
- 876.51dp
- 877.95dp
- 879.4dp
- 880.84dp
- 882.28dp
- 883.73dp
- 885.17dp
- 886.62dp
- 888.06dp
- 889.5dp
- 890.95dp
- 892.39dp
- 893.84dp
- 895.28dp
- 896.72dp
- 898.17dp
- 899.61dp
- 901.06dp
- 902.5dp
- 903.94dp
- 905.39dp
- 906.83dp
- 908.28dp
- 909.72dp
- 911.16dp
- 912.61dp
- 914.05dp
- 915.5dp
- 916.94dp
- 918.38dp
- 919.83dp
- 921.27dp
- 922.72dp
- 924.16dp
- 925.6dp
- 927.05dp
- 928.49dp
- 929.94dp
- 931.38dp
- 932.82dp
- 934.27dp
- 935.71dp
- 937.16dp
- 938.6dp
- 940.04dp
- 941.49dp
- 942.93dp
- 944.38dp
- 945.82dp
- 947.26dp
- 948.71dp
- 950.15dp
- 951.6dp
- 953.04dp
- 954.48dp
- 955.93dp
- 957.37dp
- 958.82dp
- 960.26dp
- 961.7dp
- 963.15dp
- 964.59dp
- 966.04dp
- 967.48dp
- 968.92dp
- 970.37dp
- 971.81dp
- 973.26dp
- 974.7dp
- 976.14dp
- 977.59dp
- 979.03dp
- 980.48dp
- 981.92dp
- 983.36dp
- 984.81dp
- 986.25dp
- 987.7dp
- 989.14dp
- 990.58dp
- 992.03dp
- 993.47dp
- 994.92dp
- 996.36dp
- 997.8dp
- 999.25dp
- 1000.69dp
- 1002.14dp
- 1003.58dp
- 1005.02dp
- 1006.47dp
- 1007.91dp
- 1009.36dp
- 1010.8dp
- 1012.24dp
- 1013.69dp
- 1015.13dp
- 1016.58dp
- 1018.02dp
- 1019.46dp
- 1020.91dp
- 1022.35dp
- 1023.8dp
- 1025.24dp
- 1026.68dp
- 1028.13dp
- 1029.57dp
- 1031.02dp
- 1032.46dp
- 1033.9dp
- 1035.35dp
- 1036.79dp
- 1038.24dp
- 1039.68dp
- 1041.12dp
- 1042.57dp
- 1044.01dp
- 1045.46dp
- 1046.9dp
- 1048.34dp
- 1049.79dp
- 1051.23dp
- 1052.68dp
- 1054.12dp
- 1055.56dp
- 1057.01dp
- 1058.45dp
- 1059.9dp
- 1061.34dp
- 1062.78dp
- 1064.23dp
- 1065.67dp
- 1067.12dp
- 1068.56dp
- 1070.0dp
- 1071.45dp
- 1072.89dp
- 1074.34dp
- 1075.78dp
- 1077.22dp
- 1078.67dp
- 1080.11dp
- 1081.56dp
- 1083.0dp
- 1084.44dp
- 1085.89dp
- 1087.33dp
- 1088.78dp
- 1090.22dp
- 1091.66dp
- 1093.11dp
- 1094.55dp
- 1096.0dp
- 1097.44dp
- 1098.88dp
- 1100.33dp
- 1101.77dp
- 1103.22dp
- 1104.66dp
- 1106.1dp
- 1107.55dp
- 1108.99dp
- 1110.44dp
- 1111.88dp
- 1113.32dp
- 1114.77dp
- 1116.21dp
- 1117.66dp
- 1119.1dp
- 1120.54dp
- 1121.99dp
- 1123.43dp
- 1124.88dp
- 1126.32dp
- 1127.76dp
- 1129.21dp
- 1130.65dp
- 1132.1dp
- 1133.54dp
- 1134.98dp
- 1136.43dp
- 1137.87dp
- 1139.32dp
- 1140.76dp
- 1142.2dp
- 1143.65dp
- 1145.09dp
- 1146.54dp
- 1147.98dp
- 1149.42dp
- 1150.87dp
- 1152.31dp
- 1153.76dp
- 1155.2dp
- 1156.64dp
- 1158.09dp
- 1159.53dp
- 1160.98dp
- 1162.42dp
- 1163.86dp
- 1165.31dp
- 1166.75dp
- 1168.2dp
- 1169.64dp
- 1171.08dp
- 1172.53dp
- 1173.97dp
- 1175.42dp
- 1176.86dp
- 1178.3dp
- 1179.75dp
- 1181.19dp
- 1182.64dp
- 1184.08dp
- 1185.52dp
- 1186.97dp
- 1188.41dp
- 1189.86dp
- 1191.3dp
- 1192.74dp
- 1194.19dp
- 1195.63dp
- 1197.08dp
- 1198.52dp
- 1199.96dp
- 1201.41dp
- 1202.85dp
- 1204.3dp
- 1205.74dp
- 1207.18dp
- 1208.63dp
- 1210.07dp
- 1211.52dp
- 1212.96dp
- 1214.4dp
- 1215.85dp
- 1217.29dp
- 1218.74dp
- 1220.18dp
- 1221.62dp
- 1223.07dp
- 1224.51dp
- 1225.96dp
- 1227.4dp
- 1228.84dp
- 1230.29dp
- 1231.73dp
- 1233.18dp
- 1234.62dp
- 1236.06dp
- 1237.51dp
- 1238.95dp
- 1240.4dp
- 1241.84dp
- 1243.28dp
- 1244.73dp
- 1246.17dp
- 1247.62dp
- 1249.06dp
- 1250.5dp
- 1251.95dp
- 1253.39dp
- 1254.84dp
- 1256.28dp
- 1257.72dp
- 1259.17dp
- 1260.61dp
- 1262.06dp
- 1263.5dp
- 1264.94dp
- 1266.39dp
- 1267.83dp
- 1269.28dp
- 1270.72dp
- 1272.16dp
- 1273.61dp
- 1275.05dp
- 1276.5dp
- 1277.94dp
- 1279.38dp
- 1280.83dp
- 1282.27dp
- 1283.72dp
- 1285.16dp
- 1286.6dp
- 1288.05dp
- 1289.49dp
- 1290.94dp
- 1292.38dp
- 1293.82dp
- 1295.27dp
- 1296.71dp
- 1298.16dp
- 1299.6dp
- 1301.04dp
- 1302.49dp
- 1303.93dp
- 1305.38dp
- 1306.82dp
- 1308.26dp
- 1309.71dp
- 1311.15dp
- 1312.6dp
- 1314.04dp
- 1315.48dp
- 1316.93dp
- 1318.37dp
- 1319.82dp
- 1321.26dp
- 1322.7dp
- 1324.15dp
- 1325.59dp
- 1327.04dp
- 1328.48dp
- 1329.92dp
- 1331.37dp
- 1332.81dp
- 1334.26dp
- 1335.7dp
- 1337.14dp
- 1338.59dp
- 1340.03dp
- 1341.48dp
- 1342.92dp
- 1344.36dp
- 1345.81dp
- 1347.25dp
- 1348.7dp
- 1350.14dp
- 1351.58dp
- 1353.03dp
- 1354.47dp
- 1355.92dp
- 1357.36dp
- 1358.8dp
- 1360.25dp
- 1361.69dp
- 1363.14dp
- 1364.58dp
- 1366.02dp
- 1367.47dp
- 1368.91dp
- 1370.36dp
- 1371.8dp
- 1373.24dp
- 1374.69dp
- 1376.13dp
- 1377.58dp
- 1379.02dp
- 1380.46dp
- 1381.91dp
- 1383.35dp
- 1384.8dp
- 1386.24dp
- 1387.68dp
- 1389.13dp
- 1390.57dp
- 1392.02dp
- 1393.46dp
- 1394.9dp
- 1396.35dp
- 1397.79dp
- 1399.24dp
- 1400.68dp
- 1402.12dp
- 1403.57dp
- 1405.01dp
- 1406.46dp
- 1407.9dp
- 1409.34dp
- 1410.79dp
- 1412.23dp
- 1413.68dp
- 1415.12dp
- 1416.56dp
- 1418.01dp
- 1419.45dp
- 1420.9dp
- 1422.34dp
- 1423.78dp
- 1425.23dp
- 1426.67dp
- 1428.12dp
- 1429.56dp
- 1431.0dp
- 1432.45dp
- 1433.89dp
- 1435.34dp
- 1436.78dp
- 1438.22dp
- 1439.67dp
- 1441.11dp
- 1442.56dp
- 1444.0dp
- 1445.44dp
- 1446.89dp
- 1448.33dp
- 1449.78dp
- 1451.22dp
- 1452.66dp
- 1454.11dp
- 1455.55dp
- 1457.0dp
- 1458.44dp
- 1459.88dp
- 1461.33dp
- 1462.77dp
- 1464.22dp
- 1465.66dp
- 1467.1dp
- 1468.55dp
- 1469.99dp
- 1471.44dp
- 1472.88dp
- 1474.32dp
- 1475.77dp
- 1477.21dp
- 1478.66dp
- 1480.1dp
- 1481.54dp
- 1482.99dp
- 1484.43dp
- 1485.88dp
- 1487.32dp
- 1488.76dp
- 1490.21dp
- 1491.65dp
- 1493.1dp
- 1494.54dp
- 1495.98dp
- 1497.43dp
- 1498.87dp
- 1500.32dp
- 1501.76dp
- 1503.2dp
- 1504.65dp
- 1506.09dp
- 1507.54dp
- 1508.98dp
- 1510.42dp
- 1511.87dp
- 1513.31dp
- 1514.76dp
- 1516.2dp
- 1517.64dp
- 1519.09dp
- 1520.53dp
- 1521.98dp
- 1523.42dp
- 1524.86dp
- 1526.31dp
- 1527.75dp
- 1529.2dp
- 1530.64dp
- 1532.08dp
- 1533.53dp
- 1534.97dp
- 1536.42dp
- 1537.86dp
- 1539.3dp
- 1540.75dp
- 1542.19dp
- 1543.64dp
- 1545.08dp
- 1546.52dp
- 1547.97dp
- 1549.41dp
- 1550.86dp
- 1552.3dp
- 1553.74dp
- 1555.19dp
- 1556.63dp
- 1558.08dp
- 1559.52dp
- 7.22sp
- 8.66sp
- 10.11sp
- 11.55sp
- 13.0sp
- 14.44sp
- 15.88sp
- 17.33sp
- 18.77sp
- 20.22sp
- 21.66sp
- 23.1sp
- 24.55sp
- 25.99sp
- 27.44sp
- 28.88sp
- 30.32sp
- 31.77sp
- 33.21sp
- 34.66sp
- 36.1sp
- 37.54sp
- 38.99sp
- 40.43sp
- 41.88sp
- 43.32sp
- 44.76sp
- 46.21sp
- 47.65sp
- 49.1sp
- 50.54sp
- 51.98sp
- 53.43sp
- 54.87sp
- 56.32sp
- 57.76sp
- 59.2sp
- 60.65sp
- 62.09sp
- 63.54sp
- 64.98sp
- 66.42sp
- 67.87sp
- 69.31sp
- 70.76sp
- 72.2sp
- 73.64sp
- 75.09sp
- 76.53sp
- 77.98sp
- 79.42sp
- 80.86sp
- 82.31sp
- 83.75sp
- 85.2sp
- 86.64sp
- 88.08sp
- 89.53sp
- 90.97sp
- 92.42sp
- 93.86sp
- 95.3sp
- 96.75sp
- 98.19sp
- 99.64sp
- 101.08sp
- 102.52sp
- 103.97sp
- 105.41sp
- 106.86sp
- 108.3sp
- 109.74sp
- 111.19sp
- 112.63sp
- 114.08sp
- 115.52sp
- 116.96sp
- 118.41sp
- 119.85sp
- 121.3sp
- 122.74sp
- 124.18sp
- 125.63sp
- 127.07sp
- 128.52sp
- 129.96sp
- 131.4sp
- 132.85sp
- 134.29sp
- 135.74sp
- 137.18sp
- 138.62sp
- 140.07sp
- 141.51sp
- 142.96sp
- 144.4sp
+ -1559.52dp
+ -1558.08dp
+ -1556.63dp
+ -1555.19dp
+ -1553.74dp
+ -1552.3dp
+ -1550.86dp
+ -1549.41dp
+ -1547.97dp
+ -1546.52dp
+ -1545.08dp
+ -1543.64dp
+ -1542.19dp
+ -1540.75dp
+ -1539.3dp
+ -1537.86dp
+ -1536.42dp
+ -1534.97dp
+ -1533.53dp
+ -1532.08dp
+ -1530.64dp
+ -1529.2dp
+ -1527.75dp
+ -1526.31dp
+ -1524.86dp
+ -1523.42dp
+ -1521.98dp
+ -1520.53dp
+ -1519.09dp
+ -1517.64dp
+ -1516.2dp
+ -1514.76dp
+ -1513.31dp
+ -1511.87dp
+ -1510.42dp
+ -1508.98dp
+ -1507.54dp
+ -1506.09dp
+ -1504.65dp
+ -1503.2dp
+ -1501.76dp
+ -1500.32dp
+ -1498.87dp
+ -1497.43dp
+ -1495.98dp
+ -1494.54dp
+ -1493.1dp
+ -1491.65dp
+ -1490.21dp
+ -1488.76dp
+ -1487.32dp
+ -1485.88dp
+ -1484.43dp
+ -1482.99dp
+ -1481.54dp
+ -1480.1dp
+ -1478.66dp
+ -1477.21dp
+ -1475.77dp
+ -1474.32dp
+ -1472.88dp
+ -1471.44dp
+ -1469.99dp
+ -1468.55dp
+ -1467.1dp
+ -1465.66dp
+ -1464.22dp
+ -1462.77dp
+ -1461.33dp
+ -1459.88dp
+ -1458.44dp
+ -1457.0dp
+ -1455.55dp
+ -1454.11dp
+ -1452.66dp
+ -1451.22dp
+ -1449.78dp
+ -1448.33dp
+ -1446.89dp
+ -1445.44dp
+ -1444.0dp
+ -1442.56dp
+ -1441.11dp
+ -1439.67dp
+ -1438.22dp
+ -1436.78dp
+ -1435.34dp
+ -1433.89dp
+ -1432.45dp
+ -1431.0dp
+ -1429.56dp
+ -1428.12dp
+ -1426.67dp
+ -1425.23dp
+ -1423.78dp
+ -1422.34dp
+ -1420.9dp
+ -1419.45dp
+ -1418.01dp
+ -1416.56dp
+ -1415.12dp
+ -1413.68dp
+ -1412.23dp
+ -1410.79dp
+ -1409.34dp
+ -1407.9dp
+ -1406.46dp
+ -1405.01dp
+ -1403.57dp
+ -1402.12dp
+ -1400.68dp
+ -1399.24dp
+ -1397.79dp
+ -1396.35dp
+ -1394.9dp
+ -1393.46dp
+ -1392.02dp
+ -1390.57dp
+ -1389.13dp
+ -1387.68dp
+ -1386.24dp
+ -1384.8dp
+ -1383.35dp
+ -1381.91dp
+ -1380.46dp
+ -1379.02dp
+ -1377.58dp
+ -1376.13dp
+ -1374.69dp
+ -1373.24dp
+ -1371.8dp
+ -1370.36dp
+ -1368.91dp
+ -1367.47dp
+ -1366.02dp
+ -1364.58dp
+ -1363.14dp
+ -1361.69dp
+ -1360.25dp
+ -1358.8dp
+ -1357.36dp
+ -1355.92dp
+ -1354.47dp
+ -1353.03dp
+ -1351.58dp
+ -1350.14dp
+ -1348.7dp
+ -1347.25dp
+ -1345.81dp
+ -1344.36dp
+ -1342.92dp
+ -1341.48dp
+ -1340.03dp
+ -1338.59dp
+ -1337.14dp
+ -1335.7dp
+ -1334.26dp
+ -1332.81dp
+ -1331.37dp
+ -1329.92dp
+ -1328.48dp
+ -1327.04dp
+ -1325.59dp
+ -1324.15dp
+ -1322.7dp
+ -1321.26dp
+ -1319.82dp
+ -1318.37dp
+ -1316.93dp
+ -1315.48dp
+ -1314.04dp
+ -1312.6dp
+ -1311.15dp
+ -1309.71dp
+ -1308.26dp
+ -1306.82dp
+ -1305.38dp
+ -1303.93dp
+ -1302.49dp
+ -1301.04dp
+ -1299.6dp
+ -1298.16dp
+ -1296.71dp
+ -1295.27dp
+ -1293.82dp
+ -1292.38dp
+ -1290.94dp
+ -1289.49dp
+ -1288.05dp
+ -1286.6dp
+ -1285.16dp
+ -1283.72dp
+ -1282.27dp
+ -1280.83dp
+ -1279.38dp
+ -1277.94dp
+ -1276.5dp
+ -1275.05dp
+ -1273.61dp
+ -1272.16dp
+ -1270.72dp
+ -1269.28dp
+ -1267.83dp
+ -1266.39dp
+ -1264.94dp
+ -1263.5dp
+ -1262.06dp
+ -1260.61dp
+ -1259.17dp
+ -1257.72dp
+ -1256.28dp
+ -1254.84dp
+ -1253.39dp
+ -1251.95dp
+ -1250.5dp
+ -1249.06dp
+ -1247.62dp
+ -1246.17dp
+ -1244.73dp
+ -1243.28dp
+ -1241.84dp
+ -1240.4dp
+ -1238.95dp
+ -1237.51dp
+ -1236.06dp
+ -1234.62dp
+ -1233.18dp
+ -1231.73dp
+ -1230.29dp
+ -1228.84dp
+ -1227.4dp
+ -1225.96dp
+ -1224.51dp
+ -1223.07dp
+ -1221.62dp
+ -1220.18dp
+ -1218.74dp
+ -1217.29dp
+ -1215.85dp
+ -1214.4dp
+ -1212.96dp
+ -1211.52dp
+ -1210.07dp
+ -1208.63dp
+ -1207.18dp
+ -1205.74dp
+ -1204.3dp
+ -1202.85dp
+ -1201.41dp
+ -1199.96dp
+ -1198.52dp
+ -1197.08dp
+ -1195.63dp
+ -1194.19dp
+ -1192.74dp
+ -1191.3dp
+ -1189.86dp
+ -1188.41dp
+ -1186.97dp
+ -1185.52dp
+ -1184.08dp
+ -1182.64dp
+ -1181.19dp
+ -1179.75dp
+ -1178.3dp
+ -1176.86dp
+ -1175.42dp
+ -1173.97dp
+ -1172.53dp
+ -1171.08dp
+ -1169.64dp
+ -1168.2dp
+ -1166.75dp
+ -1165.31dp
+ -1163.86dp
+ -1162.42dp
+ -1160.98dp
+ -1159.53dp
+ -1158.09dp
+ -1156.64dp
+ -1155.2dp
+ -1153.76dp
+ -1152.31dp
+ -1150.87dp
+ -1149.42dp
+ -1147.98dp
+ -1146.54dp
+ -1145.09dp
+ -1143.65dp
+ -1142.2dp
+ -1140.76dp
+ -1139.32dp
+ -1137.87dp
+ -1136.43dp
+ -1134.98dp
+ -1133.54dp
+ -1132.1dp
+ -1130.65dp
+ -1129.21dp
+ -1127.76dp
+ -1126.32dp
+ -1124.88dp
+ -1123.43dp
+ -1121.99dp
+ -1120.54dp
+ -1119.1dp
+ -1117.66dp
+ -1116.21dp
+ -1114.77dp
+ -1113.32dp
+ -1111.88dp
+ -1110.44dp
+ -1108.99dp
+ -1107.55dp
+ -1106.1dp
+ -1104.66dp
+ -1103.22dp
+ -1101.77dp
+ -1100.33dp
+ -1098.88dp
+ -1097.44dp
+ -1096.0dp
+ -1094.55dp
+ -1093.11dp
+ -1091.66dp
+ -1090.22dp
+ -1088.78dp
+ -1087.33dp
+ -1085.89dp
+ -1084.44dp
+ -1083.0dp
+ -1081.56dp
+ -1080.11dp
+ -1078.67dp
+ -1077.22dp
+ -1075.78dp
+ -1074.34dp
+ -1072.89dp
+ -1071.45dp
+ -1070.0dp
+ -1068.56dp
+ -1067.12dp
+ -1065.67dp
+ -1064.23dp
+ -1062.78dp
+ -1061.34dp
+ -1059.9dp
+ -1058.45dp
+ -1057.01dp
+ -1055.56dp
+ -1054.12dp
+ -1052.68dp
+ -1051.23dp
+ -1049.79dp
+ -1048.34dp
+ -1046.9dp
+ -1045.46dp
+ -1044.01dp
+ -1042.57dp
+ -1041.12dp
+ -1039.68dp
+ -1038.24dp
+ -1036.79dp
+ -1035.35dp
+ -1033.9dp
+ -1032.46dp
+ -1031.02dp
+ -1029.57dp
+ -1028.13dp
+ -1026.68dp
+ -1025.24dp
+ -1023.8dp
+ -1022.35dp
+ -1020.91dp
+ -1019.46dp
+ -1018.02dp
+ -1016.58dp
+ -1015.13dp
+ -1013.69dp
+ -1012.24dp
+ -1010.8dp
+ -1009.36dp
+ -1007.91dp
+ -1006.47dp
+ -1005.02dp
+ -1003.58dp
+ -1002.14dp
+ -1000.69dp
+ -999.25dp
+ -997.8dp
+ -996.36dp
+ -994.92dp
+ -993.47dp
+ -992.03dp
+ -990.58dp
+ -989.14dp
+ -987.7dp
+ -986.25dp
+ -984.81dp
+ -983.36dp
+ -981.92dp
+ -980.48dp
+ -979.03dp
+ -977.59dp
+ -976.14dp
+ -974.7dp
+ -973.26dp
+ -971.81dp
+ -970.37dp
+ -968.92dp
+ -967.48dp
+ -966.04dp
+ -964.59dp
+ -963.15dp
+ -961.7dp
+ -960.26dp
+ -958.82dp
+ -957.37dp
+ -955.93dp
+ -954.48dp
+ -953.04dp
+ -951.6dp
+ -950.15dp
+ -948.71dp
+ -947.26dp
+ -945.82dp
+ -944.38dp
+ -942.93dp
+ -941.49dp
+ -940.04dp
+ -938.6dp
+ -937.16dp
+ -935.71dp
+ -934.27dp
+ -932.82dp
+ -931.38dp
+ -929.94dp
+ -928.49dp
+ -927.05dp
+ -925.6dp
+ -924.16dp
+ -922.72dp
+ -921.27dp
+ -919.83dp
+ -918.38dp
+ -916.94dp
+ -915.5dp
+ -914.05dp
+ -912.61dp
+ -911.16dp
+ -909.72dp
+ -908.28dp
+ -906.83dp
+ -905.39dp
+ -903.94dp
+ -902.5dp
+ -901.06dp
+ -899.61dp
+ -898.17dp
+ -896.72dp
+ -895.28dp
+ -893.84dp
+ -892.39dp
+ -890.95dp
+ -889.5dp
+ -888.06dp
+ -886.62dp
+ -885.17dp
+ -883.73dp
+ -882.28dp
+ -880.84dp
+ -879.4dp
+ -877.95dp
+ -876.51dp
+ -875.06dp
+ -873.62dp
+ -872.18dp
+ -870.73dp
+ -869.29dp
+ -867.84dp
+ -866.4dp
+ -864.96dp
+ -863.51dp
+ -862.07dp
+ -860.62dp
+ -859.18dp
+ -857.74dp
+ -856.29dp
+ -854.85dp
+ -853.4dp
+ -851.96dp
+ -850.52dp
+ -849.07dp
+ -847.63dp
+ -846.18dp
+ -844.74dp
+ -843.3dp
+ -841.85dp
+ -840.41dp
+ -838.96dp
+ -837.52dp
+ -836.08dp
+ -834.63dp
+ -833.19dp
+ -831.74dp
+ -830.3dp
+ -828.86dp
+ -827.41dp
+ -825.97dp
+ -824.52dp
+ -823.08dp
+ -821.64dp
+ -820.19dp
+ -818.75dp
+ -817.3dp
+ -815.86dp
+ -814.42dp
+ -812.97dp
+ -811.53dp
+ -810.08dp
+ -808.64dp
+ -807.2dp
+ -805.75dp
+ -804.31dp
+ -802.86dp
+ -801.42dp
+ -799.98dp
+ -798.53dp
+ -797.09dp
+ -795.64dp
+ -794.2dp
+ -792.76dp
+ -791.31dp
+ -789.87dp
+ -788.42dp
+ -786.98dp
+ -785.54dp
+ -784.09dp
+ -782.65dp
+ -781.2dp
+ -779.76dp
+ -778.32dp
+ -776.87dp
+ -775.43dp
+ -773.98dp
+ -772.54dp
+ -771.1dp
+ -769.65dp
+ -768.21dp
+ -766.76dp
+ -765.32dp
+ -763.88dp
+ -762.43dp
+ -760.99dp
+ -759.54dp
+ -758.1dp
+ -756.66dp
+ -755.21dp
+ -753.77dp
+ -752.32dp
+ -750.88dp
+ -749.44dp
+ -747.99dp
+ -746.55dp
+ -745.1dp
+ -743.66dp
+ -742.22dp
+ -740.77dp
+ -739.33dp
+ -737.88dp
+ -736.44dp
+ -735.0dp
+ -733.55dp
+ -732.11dp
+ -730.66dp
+ -729.22dp
+ -727.78dp
+ -726.33dp
+ -724.89dp
+ -723.44dp
+ -722.0dp
+ -720.56dp
+ -719.11dp
+ -717.67dp
+ -716.22dp
+ -714.78dp
+ -713.34dp
+ -711.89dp
+ -710.45dp
+ -709.0dp
+ -707.56dp
+ -706.12dp
+ -704.67dp
+ -703.23dp
+ -701.78dp
+ -700.34dp
+ -698.9dp
+ -697.45dp
+ -696.01dp
+ -694.56dp
+ -693.12dp
+ -691.68dp
+ -690.23dp
+ -688.79dp
+ -687.34dp
+ -685.9dp
+ -684.46dp
+ -683.01dp
+ -681.57dp
+ -680.12dp
+ -678.68dp
+ -677.24dp
+ -675.79dp
+ -674.35dp
+ -672.9dp
+ -671.46dp
+ -670.02dp
+ -668.57dp
+ -667.13dp
+ -665.68dp
+ -664.24dp
+ -662.8dp
+ -661.35dp
+ -659.91dp
+ -658.46dp
+ -657.02dp
+ -655.58dp
+ -654.13dp
+ -652.69dp
+ -651.24dp
+ -649.8dp
+ -648.36dp
+ -646.91dp
+ -645.47dp
+ -644.02dp
+ -642.58dp
+ -641.14dp
+ -639.69dp
+ -638.25dp
+ -636.8dp
+ -635.36dp
+ -633.92dp
+ -632.47dp
+ -631.03dp
+ -629.58dp
+ -628.14dp
+ -626.7dp
+ -625.25dp
+ -623.81dp
+ -622.36dp
+ -620.92dp
+ -619.48dp
+ -618.03dp
+ -616.59dp
+ -615.14dp
+ -613.7dp
+ -612.26dp
+ -610.81dp
+ -609.37dp
+ -607.92dp
+ -606.48dp
+ -605.04dp
+ -603.59dp
+ -602.15dp
+ -600.7dp
+ -599.26dp
+ -597.82dp
+ -596.37dp
+ -594.93dp
+ -593.48dp
+ -592.04dp
+ -590.6dp
+ -589.15dp
+ -587.71dp
+ -586.26dp
+ -584.82dp
+ -583.38dp
+ -581.93dp
+ -580.49dp
+ -579.04dp
+ -577.6dp
+ -576.16dp
+ -574.71dp
+ -573.27dp
+ -571.82dp
+ -570.38dp
+ -568.94dp
+ -567.49dp
+ -566.05dp
+ -564.6dp
+ -563.16dp
+ -561.72dp
+ -560.27dp
+ -558.83dp
+ -557.38dp
+ -555.94dp
+ -554.5dp
+ -553.05dp
+ -551.61dp
+ -550.16dp
+ -548.72dp
+ -547.28dp
+ -545.83dp
+ -544.39dp
+ -542.94dp
+ -541.5dp
+ -540.06dp
+ -538.61dp
+ -537.17dp
+ -535.72dp
+ -534.28dp
+ -532.84dp
+ -531.39dp
+ -529.95dp
+ -528.5dp
+ -527.06dp
+ -525.62dp
+ -524.17dp
+ -522.73dp
+ -521.28dp
+ -519.84dp
+ -518.4dp
+ -516.95dp
+ -515.51dp
+ -514.06dp
+ -512.62dp
+ -511.18dp
+ -509.73dp
+ -508.29dp
+ -506.84dp
+ -505.4dp
+ -503.96dp
+ -502.51dp
+ -501.07dp
+ -499.62dp
+ -498.18dp
+ -496.74dp
+ -495.29dp
+ -493.85dp
+ -492.4dp
+ -490.96dp
+ -489.52dp
+ -488.07dp
+ -486.63dp
+ -485.18dp
+ -483.74dp
+ -482.3dp
+ -480.85dp
+ -479.41dp
+ -477.96dp
+ -476.52dp
+ -475.08dp
+ -473.63dp
+ -472.19dp
+ -470.74dp
+ -469.3dp
+ -467.86dp
+ -466.41dp
+ -464.97dp
+ -463.52dp
+ -462.08dp
+ -460.64dp
+ -459.19dp
+ -457.75dp
+ -456.3dp
+ -454.86dp
+ -453.42dp
+ -451.97dp
+ -450.53dp
+ -449.08dp
+ -447.64dp
+ -446.2dp
+ -444.75dp
+ -443.31dp
+ -441.86dp
+ -440.42dp
+ -438.98dp
+ -437.53dp
+ -436.09dp
+ -434.64dp
+ -433.2dp
+ -431.76dp
+ -430.31dp
+ -428.87dp
+ -427.42dp
+ -425.98dp
+ -424.54dp
+ -423.09dp
+ -421.65dp
+ -420.2dp
+ -418.76dp
+ -417.32dp
+ -415.87dp
+ -414.43dp
+ -412.98dp
+ -411.54dp
+ -410.1dp
+ -408.65dp
+ -407.21dp
+ -405.76dp
+ -404.32dp
+ -402.88dp
+ -401.43dp
+ -399.99dp
+ -398.54dp
+ -397.1dp
+ -395.66dp
+ -394.21dp
+ -392.77dp
+ -391.32dp
+ -389.88dp
+ -388.44dp
+ -386.99dp
+ -385.55dp
+ -384.1dp
+ -382.66dp
+ -381.22dp
+ -379.77dp
+ -378.33dp
+ -376.88dp
+ -375.44dp
+ -374.0dp
+ -372.55dp
+ -371.11dp
+ -369.66dp
+ -368.22dp
+ -366.78dp
+ -365.33dp
+ -363.89dp
+ -362.44dp
+ -361.0dp
+ -359.56dp
+ -358.11dp
+ -356.67dp
+ -355.22dp
+ -353.78dp
+ -352.34dp
+ -350.89dp
+ -349.45dp
+ -348.0dp
+ -346.56dp
+ -345.12dp
+ -343.67dp
+ -342.23dp
+ -340.78dp
+ -339.34dp
+ -337.9dp
+ -336.45dp
+ -335.01dp
+ -333.56dp
+ -332.12dp
+ -330.68dp
+ -329.23dp
+ -327.79dp
+ -326.34dp
+ -324.9dp
+ -323.46dp
+ -322.01dp
+ -320.57dp
+ -319.12dp
+ -317.68dp
+ -316.24dp
+ -314.79dp
+ -313.35dp
+ -311.9dp
+ -310.46dp
+ -309.02dp
+ -307.57dp
+ -306.13dp
+ -304.68dp
+ -303.24dp
+ -301.8dp
+ -300.35dp
+ -298.91dp
+ -297.46dp
+ -296.02dp
+ -294.58dp
+ -293.13dp
+ -291.69dp
+ -290.24dp
+ -288.8dp
+ -287.36dp
+ -285.91dp
+ -284.47dp
+ -283.02dp
+ -281.58dp
+ -280.14dp
+ -278.69dp
+ -277.25dp
+ -275.8dp
+ -274.36dp
+ -272.92dp
+ -271.47dp
+ -270.03dp
+ -268.58dp
+ -267.14dp
+ -265.7dp
+ -264.25dp
+ -262.81dp
+ -261.36dp
+ -259.92dp
+ -258.48dp
+ -257.03dp
+ -255.59dp
+ -254.14dp
+ -252.7dp
+ -251.26dp
+ -249.81dp
+ -248.37dp
+ -246.92dp
+ -245.48dp
+ -244.04dp
+ -242.59dp
+ -241.15dp
+ -239.7dp
+ -238.26dp
+ -236.82dp
+ -235.37dp
+ -233.93dp
+ -232.48dp
+ -231.04dp
+ -229.6dp
+ -228.15dp
+ -226.71dp
+ -225.26dp
+ -223.82dp
+ -222.38dp
+ -220.93dp
+ -219.49dp
+ -218.04dp
+ -216.6dp
+ -215.16dp
+ -213.71dp
+ -212.27dp
+ -210.82dp
+ -209.38dp
+ -207.94dp
+ -206.49dp
+ -205.05dp
+ -203.6dp
+ -202.16dp
+ -200.72dp
+ -199.27dp
+ -197.83dp
+ -196.38dp
+ -194.94dp
+ -193.5dp
+ -192.05dp
+ -190.61dp
+ -189.16dp
+ -187.72dp
+ -186.28dp
+ -184.83dp
+ -183.39dp
+ -181.94dp
+ -180.5dp
+ -179.06dp
+ -177.61dp
+ -176.17dp
+ -174.72dp
+ -173.28dp
+ -171.84dp
+ -170.39dp
+ -168.95dp
+ -167.5dp
+ -166.06dp
+ -164.62dp
+ -163.17dp
+ -161.73dp
+ -160.28dp
+ -158.84dp
+ -157.4dp
+ -155.95dp
+ -154.51dp
+ -153.06dp
+ -151.62dp
+ -150.18dp
+ -148.73dp
+ -147.29dp
+ -145.84dp
+ -144.4dp
+ -142.96dp
+ -141.51dp
+ -140.07dp
+ -138.62dp
+ -137.18dp
+ -135.74dp
+ -134.29dp
+ -132.85dp
+ -131.4dp
+ -129.96dp
+ -128.52dp
+ -127.07dp
+ -125.63dp
+ -124.18dp
+ -122.74dp
+ -121.3dp
+ -119.85dp
+ -118.41dp
+ -116.96dp
+ -115.52dp
+ -114.08dp
+ -112.63dp
+ -111.19dp
+ -109.74dp
+ -108.3dp
+ -106.86dp
+ -105.41dp
+ -103.97dp
+ -102.52dp
+ -101.08dp
+ -99.64dp
+ -98.19dp
+ -96.75dp
+ -95.3dp
+ -93.86dp
+ -92.42dp
+ -90.97dp
+ -89.53dp
+ -88.08dp
+ -86.64dp
+ -85.2dp
+ -83.75dp
+ -82.31dp
+ -80.86dp
+ -79.42dp
+ -77.98dp
+ -76.53dp
+ -75.09dp
+ -73.64dp
+ -72.2dp
+ -70.76dp
+ -69.31dp
+ -67.87dp
+ -66.42dp
+ -64.98dp
+ -63.54dp
+ -62.09dp
+ -60.65dp
+ -59.2dp
+ -57.76dp
+ -56.32dp
+ -54.87dp
+ -53.43dp
+ -51.98dp
+ -50.54dp
+ -49.1dp
+ -47.65dp
+ -46.21dp
+ -44.76dp
+ -43.32dp
+ -41.88dp
+ -40.43dp
+ -38.99dp
+ -37.54dp
+ -36.1dp
+ -34.66dp
+ -33.21dp
+ -31.77dp
+ -30.32dp
+ -28.88dp
+ -27.44dp
+ -25.99dp
+ -24.55dp
+ -23.1dp
+ -21.66dp
+ -20.22dp
+ -18.77dp
+ -17.33dp
+ -15.88dp
+ -14.44dp
+ -13.0dp
+ -11.55dp
+ -10.11dp
+ -8.66dp
+ -7.22dp
+ -5.78dp
+ -4.33dp
+ -2.89dp
+ -1.44dp
+ 0.0dp
+ 0.72dp
+ 1.44dp
+ 2.89dp
+ 4.33dp
+ 5.78dp
+ 7.22dp
+ 8.66dp
+ 10.11dp
+ 11.55dp
+ 13.0dp
+ 14.44dp
+ 15.88dp
+ 17.33dp
+ 18.77dp
+ 20.22dp
+ 21.66dp
+ 23.1dp
+ 24.55dp
+ 25.99dp
+ 27.44dp
+ 28.88dp
+ 30.32dp
+ 31.77dp
+ 33.21dp
+ 34.66dp
+ 36.1dp
+ 37.54dp
+ 38.99dp
+ 40.43dp
+ 41.88dp
+ 43.32dp
+ 44.76dp
+ 46.21dp
+ 47.65dp
+ 49.1dp
+ 50.54dp
+ 51.98dp
+ 53.43dp
+ 54.87dp
+ 56.32dp
+ 57.76dp
+ 59.2dp
+ 60.65dp
+ 62.09dp
+ 63.54dp
+ 64.98dp
+ 66.42dp
+ 67.87dp
+ 69.31dp
+ 70.76dp
+ 72.2dp
+ 73.64dp
+ 75.09dp
+ 76.53dp
+ 77.98dp
+ 79.42dp
+ 80.86dp
+ 82.31dp
+ 83.75dp
+ 85.2dp
+ 86.64dp
+ 88.08dp
+ 89.53dp
+ 90.97dp
+ 92.42dp
+ 93.86dp
+ 95.3dp
+ 96.75dp
+ 98.19dp
+ 99.64dp
+ 101.08dp
+ 102.52dp
+ 103.97dp
+ 105.41dp
+ 106.86dp
+ 108.3dp
+ 109.74dp
+ 111.19dp
+ 112.63dp
+ 114.08dp
+ 115.52dp
+ 116.96dp
+ 118.41dp
+ 119.85dp
+ 121.3dp
+ 122.74dp
+ 124.18dp
+ 125.63dp
+ 127.07dp
+ 128.52dp
+ 129.96dp
+ 131.4dp
+ 132.85dp
+ 134.29dp
+ 135.74dp
+ 137.18dp
+ 138.62dp
+ 140.07dp
+ 141.51dp
+ 142.96dp
+ 144.4dp
+ 145.84dp
+ 147.29dp
+ 148.73dp
+ 150.18dp
+ 151.62dp
+ 153.06dp
+ 154.51dp
+ 155.95dp
+ 157.4dp
+ 158.84dp
+ 160.28dp
+ 161.73dp
+ 163.17dp
+ 164.62dp
+ 166.06dp
+ 167.5dp
+ 168.95dp
+ 170.39dp
+ 171.84dp
+ 173.28dp
+ 174.72dp
+ 176.17dp
+ 177.61dp
+ 179.06dp
+ 180.5dp
+ 181.94dp
+ 183.39dp
+ 184.83dp
+ 186.28dp
+ 187.72dp
+ 189.16dp
+ 190.61dp
+ 192.05dp
+ 193.5dp
+ 194.94dp
+ 196.38dp
+ 197.83dp
+ 199.27dp
+ 200.72dp
+ 202.16dp
+ 203.6dp
+ 205.05dp
+ 206.49dp
+ 207.94dp
+ 209.38dp
+ 210.82dp
+ 212.27dp
+ 213.71dp
+ 215.16dp
+ 216.6dp
+ 218.04dp
+ 219.49dp
+ 220.93dp
+ 222.38dp
+ 223.82dp
+ 225.26dp
+ 226.71dp
+ 228.15dp
+ 229.6dp
+ 231.04dp
+ 232.48dp
+ 233.93dp
+ 235.37dp
+ 236.82dp
+ 238.26dp
+ 239.7dp
+ 241.15dp
+ 242.59dp
+ 244.04dp
+ 245.48dp
+ 246.92dp
+ 248.37dp
+ 249.81dp
+ 251.26dp
+ 252.7dp
+ 254.14dp
+ 255.59dp
+ 257.03dp
+ 258.48dp
+ 259.92dp
+ 261.36dp
+ 262.81dp
+ 264.25dp
+ 265.7dp
+ 267.14dp
+ 268.58dp
+ 270.03dp
+ 271.47dp
+ 272.92dp
+ 274.36dp
+ 275.8dp
+ 277.25dp
+ 278.69dp
+ 280.14dp
+ 281.58dp
+ 283.02dp
+ 284.47dp
+ 285.91dp
+ 287.36dp
+ 288.8dp
+ 290.24dp
+ 291.69dp
+ 293.13dp
+ 294.58dp
+ 296.02dp
+ 297.46dp
+ 298.91dp
+ 300.35dp
+ 301.8dp
+ 303.24dp
+ 304.68dp
+ 306.13dp
+ 307.57dp
+ 309.02dp
+ 310.46dp
+ 311.9dp
+ 313.35dp
+ 314.79dp
+ 316.24dp
+ 317.68dp
+ 319.12dp
+ 320.57dp
+ 322.01dp
+ 323.46dp
+ 324.9dp
+ 326.34dp
+ 327.79dp
+ 329.23dp
+ 330.68dp
+ 332.12dp
+ 333.56dp
+ 335.01dp
+ 336.45dp
+ 337.9dp
+ 339.34dp
+ 340.78dp
+ 342.23dp
+ 343.67dp
+ 345.12dp
+ 346.56dp
+ 348.0dp
+ 349.45dp
+ 350.89dp
+ 352.34dp
+ 353.78dp
+ 355.22dp
+ 356.67dp
+ 358.11dp
+ 359.56dp
+ 361.0dp
+ 362.44dp
+ 363.89dp
+ 365.33dp
+ 366.78dp
+ 368.22dp
+ 369.66dp
+ 371.11dp
+ 372.55dp
+ 374.0dp
+ 375.44dp
+ 376.88dp
+ 378.33dp
+ 379.77dp
+ 381.22dp
+ 382.66dp
+ 384.1dp
+ 385.55dp
+ 386.99dp
+ 388.44dp
+ 389.88dp
+ 391.32dp
+ 392.77dp
+ 394.21dp
+ 395.66dp
+ 397.1dp
+ 398.54dp
+ 399.99dp
+ 401.43dp
+ 402.88dp
+ 404.32dp
+ 405.76dp
+ 407.21dp
+ 408.65dp
+ 410.1dp
+ 411.54dp
+ 412.98dp
+ 414.43dp
+ 415.87dp
+ 417.32dp
+ 418.76dp
+ 420.2dp
+ 421.65dp
+ 423.09dp
+ 424.54dp
+ 425.98dp
+ 427.42dp
+ 428.87dp
+ 430.31dp
+ 431.76dp
+ 433.2dp
+ 434.64dp
+ 436.09dp
+ 437.53dp
+ 438.98dp
+ 440.42dp
+ 441.86dp
+ 443.31dp
+ 444.75dp
+ 446.2dp
+ 447.64dp
+ 449.08dp
+ 450.53dp
+ 451.97dp
+ 453.42dp
+ 454.86dp
+ 456.3dp
+ 457.75dp
+ 459.19dp
+ 460.64dp
+ 462.08dp
+ 463.52dp
+ 464.97dp
+ 466.41dp
+ 467.86dp
+ 469.3dp
+ 470.74dp
+ 472.19dp
+ 473.63dp
+ 475.08dp
+ 476.52dp
+ 477.96dp
+ 479.41dp
+ 480.85dp
+ 482.3dp
+ 483.74dp
+ 485.18dp
+ 486.63dp
+ 488.07dp
+ 489.52dp
+ 490.96dp
+ 492.4dp
+ 493.85dp
+ 495.29dp
+ 496.74dp
+ 498.18dp
+ 499.62dp
+ 501.07dp
+ 502.51dp
+ 503.96dp
+ 505.4dp
+ 506.84dp
+ 508.29dp
+ 509.73dp
+ 511.18dp
+ 512.62dp
+ 514.06dp
+ 515.51dp
+ 516.95dp
+ 518.4dp
+ 519.84dp
+ 521.28dp
+ 522.73dp
+ 524.17dp
+ 525.62dp
+ 527.06dp
+ 528.5dp
+ 529.95dp
+ 531.39dp
+ 532.84dp
+ 534.28dp
+ 535.72dp
+ 537.17dp
+ 538.61dp
+ 540.06dp
+ 541.5dp
+ 542.94dp
+ 544.39dp
+ 545.83dp
+ 547.28dp
+ 548.72dp
+ 550.16dp
+ 551.61dp
+ 553.05dp
+ 554.5dp
+ 555.94dp
+ 557.38dp
+ 558.83dp
+ 560.27dp
+ 561.72dp
+ 563.16dp
+ 564.6dp
+ 566.05dp
+ 567.49dp
+ 568.94dp
+ 570.38dp
+ 571.82dp
+ 573.27dp
+ 574.71dp
+ 576.16dp
+ 577.6dp
+ 579.04dp
+ 580.49dp
+ 581.93dp
+ 583.38dp
+ 584.82dp
+ 586.26dp
+ 587.71dp
+ 589.15dp
+ 590.6dp
+ 592.04dp
+ 593.48dp
+ 594.93dp
+ 596.37dp
+ 597.82dp
+ 599.26dp
+ 600.7dp
+ 602.15dp
+ 603.59dp
+ 605.04dp
+ 606.48dp
+ 607.92dp
+ 609.37dp
+ 610.81dp
+ 612.26dp
+ 613.7dp
+ 615.14dp
+ 616.59dp
+ 618.03dp
+ 619.48dp
+ 620.92dp
+ 622.36dp
+ 623.81dp
+ 625.25dp
+ 626.7dp
+ 628.14dp
+ 629.58dp
+ 631.03dp
+ 632.47dp
+ 633.92dp
+ 635.36dp
+ 636.8dp
+ 638.25dp
+ 639.69dp
+ 641.14dp
+ 642.58dp
+ 644.02dp
+ 645.47dp
+ 646.91dp
+ 648.36dp
+ 649.8dp
+ 651.24dp
+ 652.69dp
+ 654.13dp
+ 655.58dp
+ 657.02dp
+ 658.46dp
+ 659.91dp
+ 661.35dp
+ 662.8dp
+ 664.24dp
+ 665.68dp
+ 667.13dp
+ 668.57dp
+ 670.02dp
+ 671.46dp
+ 672.9dp
+ 674.35dp
+ 675.79dp
+ 677.24dp
+ 678.68dp
+ 680.12dp
+ 681.57dp
+ 683.01dp
+ 684.46dp
+ 685.9dp
+ 687.34dp
+ 688.79dp
+ 690.23dp
+ 691.68dp
+ 693.12dp
+ 694.56dp
+ 696.01dp
+ 697.45dp
+ 698.9dp
+ 700.34dp
+ 701.78dp
+ 703.23dp
+ 704.67dp
+ 706.12dp
+ 707.56dp
+ 709.0dp
+ 710.45dp
+ 711.89dp
+ 713.34dp
+ 714.78dp
+ 716.22dp
+ 717.67dp
+ 719.11dp
+ 720.56dp
+ 722.0dp
+ 723.44dp
+ 724.89dp
+ 726.33dp
+ 727.78dp
+ 729.22dp
+ 730.66dp
+ 732.11dp
+ 733.55dp
+ 735.0dp
+ 736.44dp
+ 737.88dp
+ 739.33dp
+ 740.77dp
+ 742.22dp
+ 743.66dp
+ 745.1dp
+ 746.55dp
+ 747.99dp
+ 749.44dp
+ 750.88dp
+ 752.32dp
+ 753.77dp
+ 755.21dp
+ 756.66dp
+ 758.1dp
+ 759.54dp
+ 760.99dp
+ 762.43dp
+ 763.88dp
+ 765.32dp
+ 766.76dp
+ 768.21dp
+ 769.65dp
+ 771.1dp
+ 772.54dp
+ 773.98dp
+ 775.43dp
+ 776.87dp
+ 778.32dp
+ 779.76dp
+ 781.2dp
+ 782.65dp
+ 784.09dp
+ 785.54dp
+ 786.98dp
+ 788.42dp
+ 789.87dp
+ 791.31dp
+ 792.76dp
+ 794.2dp
+ 795.64dp
+ 797.09dp
+ 798.53dp
+ 799.98dp
+ 801.42dp
+ 802.86dp
+ 804.31dp
+ 805.75dp
+ 807.2dp
+ 808.64dp
+ 810.08dp
+ 811.53dp
+ 812.97dp
+ 814.42dp
+ 815.86dp
+ 817.3dp
+ 818.75dp
+ 820.19dp
+ 821.64dp
+ 823.08dp
+ 824.52dp
+ 825.97dp
+ 827.41dp
+ 828.86dp
+ 830.3dp
+ 831.74dp
+ 833.19dp
+ 834.63dp
+ 836.08dp
+ 837.52dp
+ 838.96dp
+ 840.41dp
+ 841.85dp
+ 843.3dp
+ 844.74dp
+ 846.18dp
+ 847.63dp
+ 849.07dp
+ 850.52dp
+ 851.96dp
+ 853.4dp
+ 854.85dp
+ 856.29dp
+ 857.74dp
+ 859.18dp
+ 860.62dp
+ 862.07dp
+ 863.51dp
+ 864.96dp
+ 866.4dp
+ 867.84dp
+ 869.29dp
+ 870.73dp
+ 872.18dp
+ 873.62dp
+ 875.06dp
+ 876.51dp
+ 877.95dp
+ 879.4dp
+ 880.84dp
+ 882.28dp
+ 883.73dp
+ 885.17dp
+ 886.62dp
+ 888.06dp
+ 889.5dp
+ 890.95dp
+ 892.39dp
+ 893.84dp
+ 895.28dp
+ 896.72dp
+ 898.17dp
+ 899.61dp
+ 901.06dp
+ 902.5dp
+ 903.94dp
+ 905.39dp
+ 906.83dp
+ 908.28dp
+ 909.72dp
+ 911.16dp
+ 912.61dp
+ 914.05dp
+ 915.5dp
+ 916.94dp
+ 918.38dp
+ 919.83dp
+ 921.27dp
+ 922.72dp
+ 924.16dp
+ 925.6dp
+ 927.05dp
+ 928.49dp
+ 929.94dp
+ 931.38dp
+ 932.82dp
+ 934.27dp
+ 935.71dp
+ 937.16dp
+ 938.6dp
+ 940.04dp
+ 941.49dp
+ 942.93dp
+ 944.38dp
+ 945.82dp
+ 947.26dp
+ 948.71dp
+ 950.15dp
+ 951.6dp
+ 953.04dp
+ 954.48dp
+ 955.93dp
+ 957.37dp
+ 958.82dp
+ 960.26dp
+ 961.7dp
+ 963.15dp
+ 964.59dp
+ 966.04dp
+ 967.48dp
+ 968.92dp
+ 970.37dp
+ 971.81dp
+ 973.26dp
+ 974.7dp
+ 976.14dp
+ 977.59dp
+ 979.03dp
+ 980.48dp
+ 981.92dp
+ 983.36dp
+ 984.81dp
+ 986.25dp
+ 987.7dp
+ 989.14dp
+ 990.58dp
+ 992.03dp
+ 993.47dp
+ 994.92dp
+ 996.36dp
+ 997.8dp
+ 999.25dp
+ 1000.69dp
+ 1002.14dp
+ 1003.58dp
+ 1005.02dp
+ 1006.47dp
+ 1007.91dp
+ 1009.36dp
+ 1010.8dp
+ 1012.24dp
+ 1013.69dp
+ 1015.13dp
+ 1016.58dp
+ 1018.02dp
+ 1019.46dp
+ 1020.91dp
+ 1022.35dp
+ 1023.8dp
+ 1025.24dp
+ 1026.68dp
+ 1028.13dp
+ 1029.57dp
+ 1031.02dp
+ 1032.46dp
+ 1033.9dp
+ 1035.35dp
+ 1036.79dp
+ 1038.24dp
+ 1039.68dp
+ 1041.12dp
+ 1042.57dp
+ 1044.01dp
+ 1045.46dp
+ 1046.9dp
+ 1048.34dp
+ 1049.79dp
+ 1051.23dp
+ 1052.68dp
+ 1054.12dp
+ 1055.56dp
+ 1057.01dp
+ 1058.45dp
+ 1059.9dp
+ 1061.34dp
+ 1062.78dp
+ 1064.23dp
+ 1065.67dp
+ 1067.12dp
+ 1068.56dp
+ 1070.0dp
+ 1071.45dp
+ 1072.89dp
+ 1074.34dp
+ 1075.78dp
+ 1077.22dp
+ 1078.67dp
+ 1080.11dp
+ 1081.56dp
+ 1083.0dp
+ 1084.44dp
+ 1085.89dp
+ 1087.33dp
+ 1088.78dp
+ 1090.22dp
+ 1091.66dp
+ 1093.11dp
+ 1094.55dp
+ 1096.0dp
+ 1097.44dp
+ 1098.88dp
+ 1100.33dp
+ 1101.77dp
+ 1103.22dp
+ 1104.66dp
+ 1106.1dp
+ 1107.55dp
+ 1108.99dp
+ 1110.44dp
+ 1111.88dp
+ 1113.32dp
+ 1114.77dp
+ 1116.21dp
+ 1117.66dp
+ 1119.1dp
+ 1120.54dp
+ 1121.99dp
+ 1123.43dp
+ 1124.88dp
+ 1126.32dp
+ 1127.76dp
+ 1129.21dp
+ 1130.65dp
+ 1132.1dp
+ 1133.54dp
+ 1134.98dp
+ 1136.43dp
+ 1137.87dp
+ 1139.32dp
+ 1140.76dp
+ 1142.2dp
+ 1143.65dp
+ 1145.09dp
+ 1146.54dp
+ 1147.98dp
+ 1149.42dp
+ 1150.87dp
+ 1152.31dp
+ 1153.76dp
+ 1155.2dp
+ 1156.64dp
+ 1158.09dp
+ 1159.53dp
+ 1160.98dp
+ 1162.42dp
+ 1163.86dp
+ 1165.31dp
+ 1166.75dp
+ 1168.2dp
+ 1169.64dp
+ 1171.08dp
+ 1172.53dp
+ 1173.97dp
+ 1175.42dp
+ 1176.86dp
+ 1178.3dp
+ 1179.75dp
+ 1181.19dp
+ 1182.64dp
+ 1184.08dp
+ 1185.52dp
+ 1186.97dp
+ 1188.41dp
+ 1189.86dp
+ 1191.3dp
+ 1192.74dp
+ 1194.19dp
+ 1195.63dp
+ 1197.08dp
+ 1198.52dp
+ 1199.96dp
+ 1201.41dp
+ 1202.85dp
+ 1204.3dp
+ 1205.74dp
+ 1207.18dp
+ 1208.63dp
+ 1210.07dp
+ 1211.52dp
+ 1212.96dp
+ 1214.4dp
+ 1215.85dp
+ 1217.29dp
+ 1218.74dp
+ 1220.18dp
+ 1221.62dp
+ 1223.07dp
+ 1224.51dp
+ 1225.96dp
+ 1227.4dp
+ 1228.84dp
+ 1230.29dp
+ 1231.73dp
+ 1233.18dp
+ 1234.62dp
+ 1236.06dp
+ 1237.51dp
+ 1238.95dp
+ 1240.4dp
+ 1241.84dp
+ 1243.28dp
+ 1244.73dp
+ 1246.17dp
+ 1247.62dp
+ 1249.06dp
+ 1250.5dp
+ 1251.95dp
+ 1253.39dp
+ 1254.84dp
+ 1256.28dp
+ 1257.72dp
+ 1259.17dp
+ 1260.61dp
+ 1262.06dp
+ 1263.5dp
+ 1264.94dp
+ 1266.39dp
+ 1267.83dp
+ 1269.28dp
+ 1270.72dp
+ 1272.16dp
+ 1273.61dp
+ 1275.05dp
+ 1276.5dp
+ 1277.94dp
+ 1279.38dp
+ 1280.83dp
+ 1282.27dp
+ 1283.72dp
+ 1285.16dp
+ 1286.6dp
+ 1288.05dp
+ 1289.49dp
+ 1290.94dp
+ 1292.38dp
+ 1293.82dp
+ 1295.27dp
+ 1296.71dp
+ 1298.16dp
+ 1299.6dp
+ 1301.04dp
+ 1302.49dp
+ 1303.93dp
+ 1305.38dp
+ 1306.82dp
+ 1308.26dp
+ 1309.71dp
+ 1311.15dp
+ 1312.6dp
+ 1314.04dp
+ 1315.48dp
+ 1316.93dp
+ 1318.37dp
+ 1319.82dp
+ 1321.26dp
+ 1322.7dp
+ 1324.15dp
+ 1325.59dp
+ 1327.04dp
+ 1328.48dp
+ 1329.92dp
+ 1331.37dp
+ 1332.81dp
+ 1334.26dp
+ 1335.7dp
+ 1337.14dp
+ 1338.59dp
+ 1340.03dp
+ 1341.48dp
+ 1342.92dp
+ 1344.36dp
+ 1345.81dp
+ 1347.25dp
+ 1348.7dp
+ 1350.14dp
+ 1351.58dp
+ 1353.03dp
+ 1354.47dp
+ 1355.92dp
+ 1357.36dp
+ 1358.8dp
+ 1360.25dp
+ 1361.69dp
+ 1363.14dp
+ 1364.58dp
+ 1366.02dp
+ 1367.47dp
+ 1368.91dp
+ 1370.36dp
+ 1371.8dp
+ 1373.24dp
+ 1374.69dp
+ 1376.13dp
+ 1377.58dp
+ 1379.02dp
+ 1380.46dp
+ 1381.91dp
+ 1383.35dp
+ 1384.8dp
+ 1386.24dp
+ 1387.68dp
+ 1389.13dp
+ 1390.57dp
+ 1392.02dp
+ 1393.46dp
+ 1394.9dp
+ 1396.35dp
+ 1397.79dp
+ 1399.24dp
+ 1400.68dp
+ 1402.12dp
+ 1403.57dp
+ 1405.01dp
+ 1406.46dp
+ 1407.9dp
+ 1409.34dp
+ 1410.79dp
+ 1412.23dp
+ 1413.68dp
+ 1415.12dp
+ 1416.56dp
+ 1418.01dp
+ 1419.45dp
+ 1420.9dp
+ 1422.34dp
+ 1423.78dp
+ 1425.23dp
+ 1426.67dp
+ 1428.12dp
+ 1429.56dp
+ 1431.0dp
+ 1432.45dp
+ 1433.89dp
+ 1435.34dp
+ 1436.78dp
+ 1438.22dp
+ 1439.67dp
+ 1441.11dp
+ 1442.56dp
+ 1444.0dp
+ 1445.44dp
+ 1446.89dp
+ 1448.33dp
+ 1449.78dp
+ 1451.22dp
+ 1452.66dp
+ 1454.11dp
+ 1455.55dp
+ 1457.0dp
+ 1458.44dp
+ 1459.88dp
+ 1461.33dp
+ 1462.77dp
+ 1464.22dp
+ 1465.66dp
+ 1467.1dp
+ 1468.55dp
+ 1469.99dp
+ 1471.44dp
+ 1472.88dp
+ 1474.32dp
+ 1475.77dp
+ 1477.21dp
+ 1478.66dp
+ 1480.1dp
+ 1481.54dp
+ 1482.99dp
+ 1484.43dp
+ 1485.88dp
+ 1487.32dp
+ 1488.76dp
+ 1490.21dp
+ 1491.65dp
+ 1493.1dp
+ 1494.54dp
+ 1495.98dp
+ 1497.43dp
+ 1498.87dp
+ 1500.32dp
+ 1501.76dp
+ 1503.2dp
+ 1504.65dp
+ 1506.09dp
+ 1507.54dp
+ 1508.98dp
+ 1510.42dp
+ 1511.87dp
+ 1513.31dp
+ 1514.76dp
+ 1516.2dp
+ 1517.64dp
+ 1519.09dp
+ 1520.53dp
+ 1521.98dp
+ 1523.42dp
+ 1524.86dp
+ 1526.31dp
+ 1527.75dp
+ 1529.2dp
+ 1530.64dp
+ 1532.08dp
+ 1533.53dp
+ 1534.97dp
+ 1536.42dp
+ 1537.86dp
+ 1539.3dp
+ 1540.75dp
+ 1542.19dp
+ 1543.64dp
+ 1545.08dp
+ 1546.52dp
+ 1547.97dp
+ 1549.41dp
+ 1550.86dp
+ 1552.3dp
+ 1553.74dp
+ 1555.19dp
+ 1556.63dp
+ 1558.08dp
+ 1559.52dp
+ 7.22sp
+ 8.66sp
+ 10.11sp
+ 11.55sp
+ 13.0sp
+ 14.44sp
+ 15.88sp
+ 17.33sp
+ 18.77sp
+ 20.22sp
+ 21.66sp
+ 23.1sp
+ 24.55sp
+ 25.99sp
+ 27.44sp
+ 28.88sp
+ 30.32sp
+ 31.77sp
+ 33.21sp
+ 34.66sp
+ 36.1sp
+ 37.54sp
+ 38.99sp
+ 40.43sp
+ 41.88sp
+ 43.32sp
+ 44.76sp
+ 46.21sp
+ 47.65sp
+ 49.1sp
+ 50.54sp
+ 51.98sp
+ 53.43sp
+ 54.87sp
+ 56.32sp
+ 57.76sp
+ 59.2sp
+ 60.65sp
+ 62.09sp
+ 63.54sp
+ 64.98sp
+ 66.42sp
+ 67.87sp
+ 69.31sp
+ 70.76sp
+ 72.2sp
+ 73.64sp
+ 75.09sp
+ 76.53sp
+ 77.98sp
+ 79.42sp
+ 80.86sp
+ 82.31sp
+ 83.75sp
+ 85.2sp
+ 86.64sp
+ 88.08sp
+ 89.53sp
+ 90.97sp
+ 92.42sp
+ 93.86sp
+ 95.3sp
+ 96.75sp
+ 98.19sp
+ 99.64sp
+ 101.08sp
+ 102.52sp
+ 103.97sp
+ 105.41sp
+ 106.86sp
+ 108.3sp
+ 109.74sp
+ 111.19sp
+ 112.63sp
+ 114.08sp
+ 115.52sp
+ 116.96sp
+ 118.41sp
+ 119.85sp
+ 121.3sp
+ 122.74sp
+ 124.18sp
+ 125.63sp
+ 127.07sp
+ 128.52sp
+ 129.96sp
+ 131.4sp
+ 132.85sp
+ 134.29sp
+ 135.74sp
+ 137.18sp
+ 138.62sp
+ 140.07sp
+ 141.51sp
+ 142.96sp
+ 144.4sp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 6201dfb..fb20b8b 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -23,6 +23,20 @@
基站平移
坐标系统
点校正
-
+ 切换项目
+ 修改密码
+ 关于
+ 退出登录
+ 登录
+ 工程测量综合管理系统
+ Integrated Engineering Surveying Management System
+ 集团账号登录
+ 外部账号登录
+ 账号
+ 密码
+ 忘记密码
+ 您的账号或密码输入有误,请重新输入。
+ 输入不符合要求!
+ 输入不能为空!
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 9212c8e..869185c 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,19 +1,23 @@
@@ -29,7 +33,6 @@
-