Merge "Implement switchConnectable with Powered property setting instead of scan modes"
diff --git a/api/current.txt b/api/current.txt
index fee4df6..c70cea8 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2853,6 +2853,8 @@
     method public void setMessage(java.lang.CharSequence);
     method public void setView(android.view.View);
     method public void setView(android.view.View, int, int, int, int);
+    field public static final int THEME_DEVICE_DEFAULT_DARK = 4; // 0x4
+    field public static final int THEME_DEVICE_DEFAULT_LIGHT = 5; // 0x5
     field public static final int THEME_HOLO_DARK = 2; // 0x2
     field public static final int THEME_HOLO_LIGHT = 3; // 0x3
     field public static final int THEME_TRADITIONAL = 1; // 0x1
@@ -8216,6 +8218,7 @@
     method public int getFontMetricsInt(android.graphics.Paint.FontMetricsInt);
     method public android.graphics.Paint.FontMetricsInt getFontMetricsInt();
     method public float getFontSpacing();
+    method public int getHinting();
     method public android.graphics.MaskFilter getMaskFilter();
     method public android.graphics.PathEffect getPathEffect();
     method public android.graphics.Rasterizer getRasterizer();
@@ -8262,6 +8265,7 @@
     method public void setFakeBoldText(boolean);
     method public void setFilterBitmap(boolean);
     method public void setFlags(int);
+    method public void setHinting(int);
     method public void setLinearText(boolean);
     method public android.graphics.MaskFilter setMaskFilter(android.graphics.MaskFilter);
     method public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect);
@@ -8287,6 +8291,8 @@
     field public static final int DITHER_FLAG = 4; // 0x4
     field public static final int FAKE_BOLD_TEXT_FLAG = 32; // 0x20
     field public static final int FILTER_BITMAP_FLAG = 2; // 0x2
+    field public static final int HINTING_OFF = 0; // 0x0
+    field public static final int HINTING_ON = 1; // 0x1
     field public static final int LINEAR_TEXT_FLAG = 64; // 0x40
     field public static final int STRIKE_THRU_TEXT_FLAG = 16; // 0x10
     field public static final int SUBPIXEL_TEXT_FLAG = 128; // 0x80
@@ -10253,7 +10259,7 @@
     method public boolean isMicrophoneMute();
     method public boolean isMusicActive();
     method public boolean isSpeakerphoneOn();
-    method public boolean isWiredHeadsetOn();
+    method public deprecated boolean isWiredHeadsetOn();
     method public void loadSoundEffects();
     method public void playSoundEffect(int);
     method public void playSoundEffect(int, float);
@@ -16387,8 +16393,6 @@
   }
 
   protected static abstract interface ContactsContract.GroupsColumns {
-    field public static final java.lang.String ACTION = "action";
-    field public static final java.lang.String ACTION_URI = "action_uri";
     field public static final java.lang.String AUTO_ADD = "auto_add";
     field public static final java.lang.String DATA_SET = "data_set";
     field public static final java.lang.String DELETED = "deleted";
@@ -16585,12 +16589,14 @@
   }
 
   protected static abstract interface ContactsContract.StreamItemPhotosColumns {
-    field public static final java.lang.String ACTION = "action";
-    field public static final java.lang.String ACTION_URI = "action_uri";
     field public static final java.lang.String PHOTO_FILE_ID = "photo_file_id";
     field public static final java.lang.String PHOTO_URI = "photo_uri";
     field public static final java.lang.String SORT_INDEX = "sort_index";
     field public static final java.lang.String STREAM_ITEM_ID = "stream_item_id";
+    field public static final java.lang.String SYNC1 = "stream_item_photo_sync1";
+    field public static final java.lang.String SYNC2 = "stream_item_photo_sync2";
+    field public static final java.lang.String SYNC3 = "stream_item_photo_sync3";
+    field public static final java.lang.String SYNC4 = "stream_item_photo_sync4";
   }
 
   public static final class ContactsContract.StreamItems implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemsColumns {
@@ -16605,13 +16611,19 @@
   }
 
   protected static abstract interface ContactsContract.StreamItemsColumns {
-    field public static final java.lang.String ACTION = "action";
-    field public static final java.lang.String ACTION_URI = "action_uri";
+    field public static final java.lang.String ACCOUNT_NAME = "account_name";
+    field public static final java.lang.String ACCOUNT_TYPE = "account_type";
     field public static final java.lang.String COMMENTS = "comments";
+    field public static final java.lang.String DATA_SET = "data_set";
     field public static final java.lang.String RAW_CONTACT_ID = "raw_contact_id";
+    field public static final java.lang.String RAW_CONTACT_SOURCE_ID = "raw_contact_source_id";
     field public static final java.lang.String RES_ICON = "icon";
     field public static final java.lang.String RES_LABEL = "label";
     field public static final java.lang.String RES_PACKAGE = "res_package";
+    field public static final java.lang.String SYNC1 = "stream_item_sync1";
+    field public static final java.lang.String SYNC2 = "stream_item_sync2";
+    field public static final java.lang.String SYNC3 = "stream_item_sync3";
+    field public static final java.lang.String SYNC4 = "stream_item_sync4";
     field public static final java.lang.String TEXT = "text";
     field public static final java.lang.String TIMESTAMP = "timestamp";
   }
diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c
index 52b2d91..c2beb74 100644
--- a/cmds/dumpstate/dumpstate.c
+++ b/cmds/dumpstate/dumpstate.c
@@ -197,6 +197,8 @@
     dump_file(NULL, "/sys/class/leds/lcd-backlight/registers");
     printf("\n");
 
+    run_command("LIST OF OPEN FILES", 10, "su", "root", "lsof", NULL);
+
 #ifdef BOARD_HAS_DUMPSTATE
     printf("========================================================\n");
     printf("== Board\n");
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index f7e5cf1..93e30af 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -18,6 +18,7 @@
 
 import com.android.internal.app.IUsageStats;
 import com.android.internal.os.PkgUsageStats;
+import com.android.internal.util.MemInfoReader;
 
 import android.content.ComponentName;
 import android.content.Context;
@@ -28,6 +29,7 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.Point;
 import android.os.Debug;
 import android.os.Handler;
 import android.os.Parcel;
@@ -38,6 +40,8 @@
 import android.text.TextUtils;
 import android.util.DisplayMetrics;
 import android.util.Log;
+import android.util.Slog;
+import android.view.Display;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -206,6 +210,31 @@
     }
     
     /**
+     * Used by persistent processes to determine if they are running on a
+     * higher-end device so should be okay using hardware drawing acceleration
+     * (which tends to consume a lot more RAM).
+     * @hide
+     */
+    static public boolean isHighEndGfx(Display display) {
+        MemInfoReader reader = new MemInfoReader();
+        reader.readMemInfo();
+        if (reader.getTotalSize() >= (512*1024*1024)) {
+            // If the device has at least 512MB RAM available to the kernel,
+            // we can afford the overhead of graphics acceleration.
+            return true;
+        }
+        Point p = new Point();
+        display.getRealSize(p);
+        int pixels = p.x * p.y;
+        if (pixels >= (1024*600)) {
+            // If this is a sufficiently large screen, then there are enough
+            // pixels on it that we'd really like to use hw drawing.
+            return true;
+        }
+        return false;
+    }
+
+    /**
      * Information you can retrieve about tasks that the user has most recently
      * started or visited.
      */
diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java
index 491fcfe..c09e87f 100644
--- a/core/java/android/app/AlertDialog.java
+++ b/core/java/android/app/AlertDialog.java
@@ -75,6 +75,18 @@
      * the holographic alert theme with a light background.
      */
     public static final int THEME_HOLO_LIGHT = 3;
+
+    /**
+     * Special theme constant for {@link #AlertDialog(Context, int)}: use
+     * the device's default alert theme with a dark background.
+     */
+    public static final int THEME_DEVICE_DEFAULT_DARK = 4;
+
+    /**
+     * Special theme constant for {@link #AlertDialog(Context, int)}: use
+     * the device's default alert theme with a dark background.
+     */
+    public static final int THEME_DEVICE_DEFAULT_LIGHT = 5;
     
     protected AlertDialog(Context context) {
         this(context, resolveDialogTheme(context, 0), true);
@@ -113,6 +125,10 @@
             return com.android.internal.R.style.Theme_Holo_Dialog_Alert;
         } else if (resid == THEME_HOLO_LIGHT) {
             return com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert;
+        } else if (resid == THEME_DEVICE_DEFAULT_DARK) {
+            return com.android.internal.R.style.Theme_DeviceDefault_Dialog_Alert;
+        } else if (resid == THEME_DEVICE_DEFAULT_LIGHT) {
+            return com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog_Alert;
         } else if (resid >= 0x01000000) {   // start of real resource IDs.
             return resid;
         } else {
diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java
index 6524c9a..588125d 100644
--- a/core/java/android/app/ApplicationErrorReport.java
+++ b/core/java/android/app/ApplicationErrorReport.java
@@ -332,20 +332,31 @@
             exceptionMessage = tr.getMessage();
 
             // Populate fields with the "root cause" exception
+            Throwable rootTr = tr;
             while (tr.getCause() != null) {
                 tr = tr.getCause();
+                if (tr.getStackTrace() != null && tr.getStackTrace().length > 0) {
+                    rootTr = tr;
+                }
                 String msg = tr.getMessage();
                 if (msg != null && msg.length() > 0) {
                     exceptionMessage = msg;
                 }
             }
 
-            exceptionClassName = tr.getClass().getName();
-            StackTraceElement trace = tr.getStackTrace()[0];
-            throwFileName = trace.getFileName();
-            throwClassName = trace.getClassName();
-            throwMethodName = trace.getMethodName();
-            throwLineNumber = trace.getLineNumber();
+            exceptionClassName = rootTr.getClass().getName();
+            if (rootTr.getStackTrace().length > 0) {
+                StackTraceElement trace = rootTr.getStackTrace()[0];
+                throwFileName = trace.getFileName();
+                throwClassName = trace.getClassName();
+                throwMethodName = trace.getMethodName();
+                throwLineNumber = trace.getLineNumber();
+            } else {
+                throwFileName = "unknown";
+                throwClassName = "unknown";
+                throwMethodName = "unknown";
+                throwLineNumber = 0;
+            }
         }
 
         /**
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index b4bdb2f..2139704 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -364,7 +364,8 @@
                                 Resources.selectSystemTheme(0,
                                         outerContext.getApplicationInfo().targetSdkVersion,
                                         com.android.internal.R.style.Theme_Dialog,
-                                        com.android.internal.R.style.Theme_Holo_Dialog)),
+                                        com.android.internal.R.style.Theme_Holo_Dialog,
+                                        com.android.internal.R.style.Theme_DeviceDefault_Dialog)),
                         ctx.mMainThread.getHandler());
                 }});
 
diff --git a/core/java/android/app/DialogFragment.java b/core/java/android/app/DialogFragment.java
index cce7cd6..8921578 100644
--- a/core/java/android/app/DialogFragment.java
+++ b/core/java/android/app/DialogFragment.java
@@ -204,7 +204,7 @@
     public void setStyle(int style, int theme) {
         mStyle = style;
         if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) {
-            mTheme = com.android.internal.R.style.Theme_Holo_Dialog_NoFrame;
+            mTheme = com.android.internal.R.style.Theme_DeviceDefault_Dialog_NoFrame;
         }
         if (theme != 0) {
             mTheme = theme;
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index f526923..24f8319 100755
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -134,18 +134,24 @@
     /** @hide */
     public static int selectDefaultTheme(int curTheme, int targetSdkVersion) {
         return selectSystemTheme(curTheme, targetSdkVersion,
-                com.android.internal.R.style.Theme, com.android.internal.R.style.Theme_Holo);
+                com.android.internal.R.style.Theme,
+                com.android.internal.R.style.Theme_Holo,
+                com.android.internal.R.style.Theme_DeviceDefault);
     }
     
     /** @hide */
-    public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo) {
+    public static int selectSystemTheme(int curTheme, int targetSdkVersion,
+            int orig, int holo, int deviceDefault) {
         if (curTheme != 0) {
             return curTheme;
         }
         if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) {
             return orig;
         }
-        return holo;
+        if (targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+            return holo;
+        }
+        return deviceDefault;
     }
     
     /**
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 9481a88..370e22a 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -617,7 +617,9 @@
     @Override public void onCreate() {
         mTheme = Resources.selectSystemTheme(mTheme,
                 getApplicationInfo().targetSdkVersion,
-                android.R.style.Theme_InputMethod, android.R.style.Theme_Holo_InputMethod);
+                android.R.style.Theme_InputMethod,
+                android.R.style.Theme_Holo,
+                android.R.style.Theme_DeviceDefault_InputMethod);
         super.setTheme(mTheme);
         super.onCreate();
         mImm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index 3b21590..2c875c8 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -1689,7 +1689,7 @@
                     return HierarchicalUri.readFrom(in);
             }
 
-            throw new AssertionError("Unknown URI type: " + type);
+            throw new IllegalArgumentException("Unknown URI type: " + type);
         }
 
         public Uri[] newArray(int size) {
@@ -1996,7 +1996,7 @@
                 parcel.writeInt(Representation.DECODED);
                 parcel.writeString(decoded);
             } else {
-                throw new AssertionError();
+                throw new IllegalArgumentException("Neither encoded nor decoded");
             }
         }
     }
@@ -2037,7 +2037,8 @@
                 case Representation.DECODED:
                     return fromDecoded(parcel.readString());
                 default:
-                    throw new AssertionError();
+                    throw new IllegalArgumentException("Unknown representation: "
+                            + representation);
             }
         }
 
@@ -2221,7 +2222,7 @@
                 case Representation.DECODED:
                     return fromDecoded(parcel.readString());
                 default:
-                    throw new AssertionError();
+                    throw new IllegalArgumentException("Bad representation: " + representation);
             }
         }
 
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 6c7c58d..1e9ee7c 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -287,6 +287,15 @@
          * {@link android.R.attr#hardwareAccelerated android:hardwareAccelerated}
          * to turn it off if needed, although this is strongly discouraged since
          * it will result in poor performance on larger screen devices.
+         * <li> The default theme for applications is now the "device default" theme:
+         *      {@link android.R.style#Theme_DeviceDefault}. This may be the
+         *      holo dark theme or a different dark theme defined by the specific device.
+         *      The {@link android.R.style#Theme_Holo} family must not be modified
+         *      for a device to be considered compatible. Applications that explicitly
+         *      request a theme from the Holo family will be guaranteed that these themes
+         *      will not change character within the same platform version. Applications
+         *      that wish to blend in with the device should use a theme from the
+         *      {@link android.R.style#Theme_DeviceDefault} family.
          * </ul>
          */
         public static final int ICE_CREAM_SANDWICH = CUR_DEVELOPMENT;
diff --git a/core/java/android/preference/VolumePreference.java b/core/java/android/preference/VolumePreference.java
index b48e8ce..fe5e76c 100644
--- a/core/java/android/preference/VolumePreference.java
+++ b/core/java/android/preference/VolumePreference.java
@@ -114,7 +114,9 @@
     }
 
     public void onActivityStop() {
-        cleanup();
+        if (mSeekBarVolumizer != null) {
+            mSeekBarVolumizer.stopSample();
+        }
     }
 
     /**
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 5765dde..d867e35 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -2890,8 +2890,6 @@
      * values.put(StreamItems.TEXT, "Breakfasted at Tiffanys");
      * values.put(StreamItems.TIMESTAMP, timestamp);
      * values.put(StreamItems.COMMENTS, "3 people reshared this");
-     * values.put(StreamItems.ACTION, action);
-     * values.put(StreamItems.ACTION_URI, actionUri);
      * Uri streamItemUri = getContentResolver().insert(
      *     Uri.withAppendedPath(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
      *         RawContacts.StreamItems.CONTENT_DIRECTORY), values);
@@ -2905,8 +2903,6 @@
      * values.put(StreamItems.TEXT, "Breakfasted at Tiffanys");
      * values.put(StreamItems.TIMESTAMP, timestamp);
      * values.put(StreamItems.COMMENTS, "3 people reshared this");
-     * values.put(StreamItems.ACTION, action);
-     * values.put(StreamItems.ACTION_URI, actionUri);
      * Uri streamItemUri = getContentResolver().insert(StreamItems.CONTENT_URI, values);
      * long streamItemId = ContentUris.parseId(streamItemUri);
      * </dd>
@@ -2924,8 +2920,6 @@
      * values.clear();
      * values.put(StreamItemPhotos.SORT_INDEX, 1);
      * values.put(StreamItemPhotos.PHOTO, photoData);
-     * values.put(StreamItemPhotos.ACTION, action);
-     * values.put(StreamItemPhotos.ACTION_URI, actionUri);
      * getContentResolver().insert(Uri.withAppendedPath(
      *     ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId),
      *     StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), values);
@@ -2938,8 +2932,6 @@
      * values.put(StreamItemPhotos.STREAM_ITEM_ID, streamItemId);
      * values.put(StreamItemPhotos.SORT_INDEX, 1);
      * values.put(StreamItemPhotos.PHOTO, photoData);
-     * values.put(StreamItemPhotos.ACTION, action);
-     * values.put(StreamItemPhotos.ACTION_URI, actionUri);
      * getContentResolver().insert(StreamItems.CONTENT_PHOTO_URI, values);
      * </pre>
      * Note that this latter form allows the insertion of a stream item and its
@@ -3081,16 +3073,56 @@
         public static final String RES_PACKAGE = "res_package";
 
         /**
-         * The resource ID of the icon for the source of the stream item.
-         * This resource should be scoped by the {@link #RES_PACKAGE}.
-         * <P>Type: NUMBER</P>
+         * The account type to which the raw_contact of this item is associated. See
+         * {@link RawContacts#ACCOUNT_TYPE}
+         *
+         * <p>TYPE: text</p>
+         * <p>read-only</p>
+         */
+        public static final String ACCOUNT_TYPE = "account_type";
+
+        /**
+         * The account name to which the raw_contact of this item is associated. See
+         * {@link RawContacts#ACCOUNT_NAME}
+         *
+         * <p>TYPE: text</p>
+         * <p>read-only</p>
+         */
+        public static final String ACCOUNT_NAME = "account_name";
+
+        /**
+         * The data set within the account that the raw_contact of this row belongs to. This allows
+         * multiple sync adapters for the same account type to distinguish between
+         * each others' data.
+         * {@link RawContacts#DATA_SET}
+         *
+         * <P>Type: TEXT</P>
+         * <p>read-only</p>
+         */
+        public static final String DATA_SET = "data_set";
+
+        /**
+         * The source_id of the raw_contact that this row belongs to.
+         * {@link RawContacts#SOURCE_ID}
+         *
+         * <P>Type: TEXT</P>
+         * <p>read-only</p>
+         */
+        public static final String RAW_CONTACT_SOURCE_ID = "raw_contact_source_id";
+
+        /**
+         * The resource name of the icon for the source of the stream item.
+         * This resource should be scoped by the {@link #RES_PACKAGE}. As this can only reference
+         * drawables, the "@drawable/" prefix must be omitted.
+         * <P>Type: TEXT</P>
          */
         public static final String RES_ICON = "icon";
 
         /**
-         * The resource ID of the label describing the source of the status update, e.g. "Google
-         * Talk".  This resource should be scoped by the {@link #RES_PACKAGE}.
-         * <p>Type: NUMBER</p>
+         * The resource name of the label describing the source of the status update, e.g. "Google
+         * Talk". This resource should be scoped by the {@link #RES_PACKAGE}. As this can only
+         * reference strings, the "@string/" prefix must be omitted.
+         * <p>Type: TEXT</p>
          */
         public static final String RES_LABEL = "label";
 
@@ -3136,18 +3168,14 @@
          */
         public static final String COMMENTS = "comments";
 
-        /**
-         * The activity action to execute when the item is tapped.
-         * <P>Type: TEXT</P>
-         */
-        public static final String ACTION = "action";
-
-        /**
-         * The URI that is launched when the item is pressed. May be handled by
-         * the source app, but could also reference a website (e.g. YouTube).
-         * <P>Type: TEXT</P>
-         */
-        public static final String ACTION_URI = "action_uri";
+        /** Generic column for use by sync adapters. */
+        public static final String SYNC1 = "stream_item_sync1";
+        /** Generic column for use by sync adapters. */
+        public static final String SYNC2 = "stream_item_sync2";
+        /** Generic column for use by sync adapters. */
+        public static final String SYNC3 = "stream_item_sync3";
+        /** Generic column for use by sync adapters. */
+        public static final String SYNC4 = "stream_item_sync4";
     }
 
     /**
@@ -3171,8 +3199,6 @@
      * ContentValues values = new ContentValues();
      * values.put(StreamItemPhotos.SORT_INDEX, 1);
      * values.put(StreamItemPhotos.PHOTO, photoData);
-     * values.put(StreamItemPhotos.ACTION, action);
-     * values.put(StreamItemPhotos.ACTION_URI, actionUri);
      * Uri photoUri = getContentResolver().insert(Uri.withAppendedPath(
      *     ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId)
      *     StreamItems.StreamItemPhotos#CONTENT_DIRECTORY), values);
@@ -3186,8 +3212,6 @@
      * values.put(StreamItemPhotos.STREAM_ITEM_ID, streamItemId);
      * values.put(StreamItemPhotos.SORT_INDEX, 1);
      * values.put(StreamItemPhotos.PHOTO, photoData);
-     * values.put(StreamItemPhotos.ACTION, action);
-     * values.put(StreamItemPhotos.ACTION_URI, actionUri);
      * Uri photoUri = getContentResolver().insert(StreamItems.CONTENT_PHOTO_URI, values);
      * long photoId = ContentUris.parseId(photoUri);
      * </pre>
@@ -3353,18 +3377,14 @@
          */
         public static final String PHOTO_URI = "photo_uri";
 
-        /**
-         * The activity action to execute when the photo is tapped.
-         * <P>Type: TEXT</P>
-         */
-        public static final String ACTION = "action";
-
-        /**
-         * The URI that is launched when the photo is pressed. May be handled by
-         * the source app, but could also reference a website (e.g. YouTube).
-         * <P>Type: TEXT</P>
-         */
-        public static final String ACTION_URI = "action_uri";
+        /** Generic column for use by sync adapters. */
+        public static final String SYNC1 = "stream_item_photo_sync1";
+        /** Generic column for use by sync adapters. */
+        public static final String SYNC2 = "stream_item_photo_sync2";
+        /** Generic column for use by sync adapters. */
+        public static final String SYNC3 = "stream_item_photo_sync3";
+        /** Generic column for use by sync adapters. */
+        public static final String SYNC4 = "stream_item_photo_sync4";
     }
 
     /**
@@ -6496,28 +6516,6 @@
         public static final String NOTES = "notes";
 
         /**
-         * The Activity action to open the group in the source app (e.g.
-         * {@link Intent#ACTION_VIEW}). Can be NULL if the group does not have a dedicated viewer.
-         * This is used in conjunction with {@link #ACTION_URI}: In order to show an "Open in
-         * (sourceapp)"-button, both of these fields must be set
-         * <p>
-         * Type: TEXT
-         */
-        public static final String ACTION = "action";
-
-
-        /**
-         * Uri to open the group in the source app.
-         * Can be NULL if the group does not have a dedicated viewer.
-         * This is used in conjunction with {@link #ACTION}: In order to show an "Open in
-         * (sourceapp)"-button, both of these fields must be set
-         * <p>
-         * Type: TEXT
-         */
-        public static final String ACTION_URI = "action_uri";
-
-
-        /**
          * The ID of this group if it is a System Group, i.e. a group that has a special meaning
          * to the sync adapter, null otherwise.
          * <P>Type: TEXT</P>
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index f2b6b1f..f2c3131 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -199,8 +199,10 @@
      * @param attachInfo AttachInfo tied to the specified view.
      * @param callbacks Callbacks invoked when drawing happens.
      * @param dirty The dirty rectangle to update, can be null.
+     * 
+     * @return true if the dirty rect was ignored, false otherwise
      */
-    abstract void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks,
+    abstract boolean draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks,
             Rect dirty);
 
     /**
@@ -757,7 +759,7 @@
         }
 
         @Override
-        void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks,
+        boolean draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks,
                 Rect dirty) {
             if (canDraw()) {
                 if (!hasDirtyRegions()) {
@@ -825,8 +827,12 @@
 
                     sEgl.eglSwapBuffers(sEglDisplay, mEglSurface);
                     checkEglErrors();
+
+                    return dirty == null;
                 }
             }
+
+            return false;
         }
 
         /**
diff --git a/core/java/android/view/InputChannel.java b/core/java/android/view/InputChannel.java
index f2cad2f..523af04 100644
--- a/core/java/android/view/InputChannel.java
+++ b/core/java/android/view/InputChannel.java
@@ -48,8 +48,6 @@
     @SuppressWarnings("unused")
     private int mPtr; // used by native code
     
-    private boolean mDisposeAfterWriteToParcel;
-    
     private static native InputChannel[] nativeOpenInputChannelPair(String name);
     
     private native void nativeDispose(boolean finalized);
@@ -117,13 +115,12 @@
      * as an out parameter in a binder call.
      * @param other The other input channel instance.
      */
-    public void transferToBinderOutParameter(InputChannel outParameter) {
+    public void transferTo(InputChannel outParameter) {
         if (outParameter == null) {
             throw new IllegalArgumentException("outParameter must not be null");
         }
         
         nativeTransferTo(outParameter);
-        outParameter.mDisposeAfterWriteToParcel = true;
     }
 
     public int describeContents() {
@@ -145,7 +142,7 @@
         
         nativeWriteToParcel(out);
         
-        if (mDisposeAfterWriteToParcel) {
+        if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) {
             dispose();
         }
     }
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 5b77cf7..54bd637 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -6249,15 +6249,7 @@
                     }
 
                     // Walk up the hierarchy to determine if we're inside a scrolling container.
-                    boolean isInScrollingContainer = false;
-                    ViewParent p = getParent();
-                    while (p != null && p instanceof ViewGroup) {
-                        if (((ViewGroup) p).shouldDelayChildPressedState()) {
-                            isInScrollingContainer = true;
-                            break;
-                        }
-                        p = p.getParent();
-                    }
+                    boolean isInScrollingContainer = isInScrollingContainer();
 
                     // For views inside a scrolling container, delay the pressed feedback for
                     // a short period in case this is a scroll.
@@ -6307,6 +6299,20 @@
     }
 
     /**
+     * @hide
+     */
+    public boolean isInScrollingContainer() {
+        ViewParent p = getParent();
+        while (p != null && p instanceof ViewGroup) {
+            if (((ViewGroup) p).shouldDelayChildPressedState()) {
+                return true;
+            }
+            p = p.getParent();
+        }
+        return false;
+    }
+
+    /**
      * Remove the longpress detection timer.
      */
     private void removeLongPressCallback() {
@@ -8774,6 +8780,12 @@
      * @see #SCROLLBARS_OUTSIDE_OVERLAY
      * @see #SCROLLBARS_OUTSIDE_INSET
      */
+    @ViewDebug.ExportedProperty(mapping = {
+            @ViewDebug.IntToString(from = SCROLLBARS_INSIDE_OVERLAY, to = "INSIDE_OVERLAY"),
+            @ViewDebug.IntToString(from = SCROLLBARS_INSIDE_INSET, to = "INSIDE_INSET"),
+            @ViewDebug.IntToString(from = SCROLLBARS_OUTSIDE_OVERLAY, to = "OUTSIDE_OVERLAY"),
+            @ViewDebug.IntToString(from = SCROLLBARS_OUTSIDE_INSET, to = "OUTSIDE_INSET")
+    })
     public int getScrollBarStyle() {
         return mViewFlags & SCROLLBARS_STYLE_MASK;
     }
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 380fc15..f23c366 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1798,7 +1798,9 @@
                     currentDirty = null;
                 }
 
-                mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this, currentDirty);
+                if (mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this, currentDirty)) {
+                    mPreviousDirty.set(0, 0, mWidth, mHeight);
+                }
             }
 
             if (animating) {
diff --git a/core/java/android/webkit/webdriver/By.java b/core/java/android/webkit/webdriver/By.java
deleted file mode 100644
index fa4fe74..0000000
--- a/core/java/android/webkit/webdriver/By.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * 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 android.webkit.webdriver;
-
-import java.util.List;
-
-/**
- * Mechanism to locate elements within the DOM of the page.
- * @hide
- */
-public abstract class By {
-    public abstract WebElement findElement(WebElement element);
-    public abstract List<WebElement> findElements(WebElement element);
-
-    /**
-     * Locates an element by its HTML id attribute.
-     *
-     * @param id The HTML id attribute to look for.
-     * @return A By instance that locates elements by their HTML id attributes.
-     */
-    public static By id(final String id) {
-        throwIfNull(id);
-        return new By() {
-            @Override
-            public WebElement findElement(WebElement element) {
-                return element.findElementById(id);
-            }
-
-            @Override
-            public List<WebElement> findElements(WebElement element) {
-                return element.findElementsById(id); // Yes, it happens a lot.
-            }
-
-            @Override
-            public String toString() {
-                return "By.id: " + id;
-            }
-        };
-    }
-
-    /**
-     * Locates an element by the matching the exact text on the HTML link.
-     *
-     * @param linkText The exact text to match against.
-     * @return A By instance that locates elements by the text displayed by
-     * the link.
-     */
-    public static By linkText(final String linkText) {
-        throwIfNull(linkText);
-        return new By() {
-            @Override
-            public WebElement findElement(WebElement element) {
-                return element.findElementByLinkText(linkText);
-            }
-
-            @Override
-            public List<WebElement> findElements(WebElement element) {
-                return element.findElementsByLinkText(linkText);
-            }
-
-            @Override
-            public String toString() {
-                return "By.linkText: " + linkText;
-            }
-        };
-    }
-
-    /**
-     * Locates an element by matching partial part of the text displayed by an
-     * HTML link.
-     *
-     * @param linkText The text that should be contained by the text displayed
-     * on the link.
-     * @return A By instance that locates elements that contain the given link
-     * text.
-     */
-    public static By partialLinkText(final String linkText) {
-        throwIfNull(linkText);
-        return new By() {
-            @Override
-            public WebElement findElement(WebElement element) {
-                return element.findElementByPartialLinkText(linkText);
-            }
-
-            @Override
-            public List<WebElement> findElements(WebElement element) {
-                return element.findElementsByPartialLinkText(linkText);
-            }
-
-            @Override
-            public String toString() {
-                return "By.partialLinkText: " + linkText;
-            }
-        };
-    }
-
-    /**
-     * Locates an element by matching its HTML name attribute.
-     *
-     * @param name The value of the HTML name attribute.
-     * @return A By instance that locates elements by the HTML name attribute.
-     */
-    public static By name(final String name) {
-        throwIfNull(name);
-        return new By() {
-            @Override
-            public WebElement findElement(WebElement element) {
-                return element.findElementByName(name);
-            }
-
-            @Override
-            public List<WebElement> findElements(WebElement element) {
-                return element.findElementsByName(name);
-            }
-
-            @Override
-            public String toString() {
-                return "By.name: " + name;
-            }
-        };
-    }
-
-    /**
-     * Locates an element by matching its class name.
-     * @param className The class name
-     * @return A By instance that locates elements by their class name attribute.
-     */
-    public static By className(final String className) {
-        throwIfNull(className);
-        return new By() {
-            @Override
-            public WebElement findElement(WebElement element) {
-                return element.findElementByClassName(className);
-            }
-
-            @Override
-            public List<WebElement> findElements(WebElement element) {
-                return element.findElementsByClassName(className);
-            }
-
-            @Override
-            public String toString() {
-                return "By.className: " + className;
-            }
-        };
-    }
-
-    /**
-     * Locates an element by matching its css property.
-     *
-     * @param css The css property.
-     * @return A By instance that locates elements by their css property.
-     */
-    public static By css(final String css) {
-        throwIfNull(css);
-        return new By() {
-            @Override
-            public WebElement findElement(WebElement element) {
-                return element.findElementByCss(css);
-            }
-
-            @Override
-            public List<WebElement> findElements(WebElement element) {
-                return element.findElementsByCss(css);
-            }
-
-            @Override
-            public String toString() {
-                return "By.css: " + css;
-            }
-        };
-    }
-
-    /**
-     * Locates an element by matching its HTML tag name.
-     *
-     * @param tagName The HTML tag name to look for.
-     * @return A By instance that locates elements using the name of the
-     * HTML tag.
-     */
-    public static By tagName(final String tagName) {
-        throwIfNull(tagName);
-        return new By() {
-            @Override
-            public WebElement findElement(WebElement element) {
-                return element.findElementByTagName(tagName);
-            }
-
-            @Override
-            public List<WebElement> findElements(WebElement element) {
-                return element.findElementsByTagName(tagName);
-            }
-
-            @Override
-            public String toString() {
-                return "By.tagName: " + tagName;
-            }
-        };
-    }
-
-    /**
-     * Locates an element using an XPath expression.
-     *
-     * <p>When using XPath, be aware that this follows standard conventions: a
-     * search prefixed with "//" will search the entire document, not just the
-     * children of the current node. Use ".//" to limit your search to the
-     * children of this {@link android.webkit.webdriver.WebElement}.
-     *
-     * @param xpath The XPath expression to use.
-     * @return A By instance that locates elements using the given XPath.
-     */
-    public static By xpath(final String xpath) {
-        throwIfNull(xpath);
-        return new By() {
-            @Override
-            public WebElement findElement(WebElement element) {
-                return element.findElementByXPath(xpath);
-            }
-
-            @Override
-            public List<WebElement> findElements(WebElement element) {
-                return element.findElementsByXPath(xpath);
-            }
-
-            @Override
-            public String toString() {
-                return "By.xpath: " + xpath;
-            }
-        };
-    }
-
-    private static void throwIfNull(String argument) {
-        if (argument == null) {
-            throw new IllegalArgumentException(
-                    "Cannot find elements with null locator.");
-        }
-    }
-}
diff --git a/core/java/android/webkit/webdriver/WebDriver.java b/core/java/android/webkit/webdriver/WebDriver.java
deleted file mode 100644
index 79e6523..0000000
--- a/core/java/android/webkit/webdriver/WebDriver.java
+++ /dev/null
@@ -1,843 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * 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 android.webkit.webdriver;
-
-import android.graphics.Point;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.view.InputDevice;
-import android.view.KeyCharacterMap;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.webkit.WebView;
-import android.webkit.WebViewCore;
-
-import com.google.android.collect.Lists;
-import com.google.android.collect.Maps;
-
-import com.android.internal.R;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Drives a web application by controlling the WebView. This class
- * provides a DOM-like API allowing to get information about the page,
- * navigate, and interact with the web application. This is particularly useful
- * for testing a web application.
- *
- * <p/>{@link android.webkit.webdriver.WebDriver} should be created in the main
- * thread, and invoked from another thread. Here is a sample usage:
- *
- * public class WebDriverStubActivity extends Activity {
- *   private WebDriver mDriver;
- *
- *   public void onCreate(Bundle savedInstanceState) {
- *       super.onCreate(savedInstanceState);
- *       WebView view = new WebView(this);
- *       mDriver = new WebDriver(view);
- *       setContentView(view);
- *   }
- *
- *
- *   public WebDriver getDriver() {
- *       return mDriver;
- *   }
- *}
- *
- * public class WebDriverTest extends
- *       ActivityInstrumentationTestCase2<WebDriverStubActivity>{
- *   private WebDriver mDriver;
- *
- *   public WebDriverTest() {
- *       super(WebDriverStubActivity.class);
- *   }
- *
- *   protected void setUp() throws Exception {
- *       super.setUp();
- *       mDriver = getActivity().getDriver();
- *   }
- *
- *   public void testGoogle() {
- *       mDriver.get("http://google.com");
- *       WebElement searchBox = mDriver.findElement(By.name("q"));
- *       q.sendKeys("Cheese!");
- *       q.submit();
- *       assertTrue(mDriver.findElements(By.partialLinkText("Cheese")).size() > 0);
- *   }
- *}
- *
- * @hide
- */
-public class WebDriver {
-    // Timeout for page load in milliseconds.
-    private static final int LOADING_TIMEOUT = 30000;
-    // Timeout for executing JavaScript in the WebView in milliseconds.
-    private static final int JS_EXECUTION_TIMEOUT = 10000;
-    // Timeout for the MotionEvent to be completely handled
-    private static final int MOTION_EVENT_TIMEOUT = 1000;
-    // Timeout for detecting a new page load
-    private static final int PAGE_STARTED_LOADING = 500;
-    // Timeout for handling KeyEvents
-    private static final int KEY_EVENT_TIMEOUT = 2000;
-
-    // Commands posted to the handler
-    private static final int CMD_GET_URL = 1;
-    private static final int CMD_EXECUTE_SCRIPT = 2;
-    private static final int CMD_SEND_TOUCH = 3;
-    private static final int CMD_SEND_KEYS = 4;
-    private static final int CMD_NAV_REFRESH = 5;
-    private static final int CMD_NAV_BACK = 6;
-    private static final int CMD_NAV_FORWARD = 7;
-    private static final int CMD_SEND_KEYCODE = 8;
-    private static final int CMD_MOVE_CURSOR_RIGHTMOST_POS = 9;
-    private static final int CMD_MESSAGE_RELAY_ECHO = 10;
-
-    private static final String ELEMENT_KEY = "ELEMENT";
-    private static final String STATUS = "status";
-    private static final String VALUE = "value";
-
-    private static final long MAIN_THREAD = Thread.currentThread().getId();
-
-    // This is updated by a callabck from JavaScript when the result is ready.
-    private String mJsResult;
-
-    // Used for synchronization
-    private final Object mSyncObject;
-    private final Object mSyncPageLoad;
-
-    // Updated when the command is done executing in the main thread.
-    private volatile boolean mCommandDone;
-    // Used by WebViewClientWrapper.onPageStarted() to notify that
-    // a page started loading.
-    private volatile boolean mPageStartedLoading;
-    // Used by WebChromeClientWrapper.onProgressChanged to notify when
-    // a page finished loading.
-    private volatile boolean mPageFinishedLoading;
-    private WebView mWebView;
-    private Navigation mNavigation;
-    // This WebElement represents the object document.documentElement
-    private WebElement mDocumentElement;
-
-
-    // This Handler runs in the main UI thread.
-    private final Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case CMD_GET_URL:
-                    final String url = (String) msg.obj;
-                    mWebView.loadUrl(url);
-                    break;
-                case CMD_EXECUTE_SCRIPT:
-                    mWebView.loadUrl("javascript:" + (String) msg.obj);
-                    break;
-                case CMD_MESSAGE_RELAY_ECHO:
-                    notifyCommandDone();
-                    break;
-                case CMD_SEND_TOUCH:
-                    touchScreen((Point) msg.obj);
-                    notifyCommandDone();
-                    break;
-                case CMD_SEND_KEYS:
-                    dispatchKeys((CharSequence[]) msg.obj);
-                    notifyCommandDone();
-                    break;
-                case CMD_NAV_REFRESH:
-                    mWebView.reload();
-                    break;
-                case CMD_NAV_BACK:
-                    mWebView.goBack();
-                    break;
-                case CMD_NAV_FORWARD:
-                    mWebView.goForward();
-                    break;
-                case CMD_SEND_KEYCODE:
-                    dispatchKeyCodes((int[]) msg.obj);
-                    notifyCommandDone();
-                    break;
-                case CMD_MOVE_CURSOR_RIGHTMOST_POS:
-                    moveCursorToLeftMostPos((String) msg.obj);
-                    notifyCommandDone();
-                    break;
-            }
-        }
-    };
-
-    /**
-     * Error codes from the WebDriver wire protocol
-     * http://code.google.com/p/selenium/wiki/JsonWireProtocol#Response_Status_Codes
-     */
-    private enum ErrorCode {
-        SUCCESS(0),
-        NO_SUCH_ELEMENT(7),
-        NO_SUCH_FRAME(8),
-        UNKNOWN_COMMAND(9),
-        UNSUPPORTED_OPERATION(9),  // Alias
-        STALE_ELEMENT_REFERENCE(10),
-        ELEMENT_NOT_VISISBLE(11),
-        INVALID_ELEMENT_STATE(12),
-        UNKNOWN_ERROR(13),
-        ELEMENT_NOT_SELECTABLE(15),
-        XPATH_LOOKUP_ERROR(19),
-        NO_SUCH_WINDOW(23),
-        INVALID_COOKIE_DOMAIN(24),
-        UNABLE_TO_SET_COOKIE(25),
-        MODAL_DIALOG_OPENED(26),
-        MODAL_DIALOG_OPEN(27),
-        SCRIPT_TIMEOUT(28);
-
-        private final int mCode;
-        private static ErrorCode[] values = ErrorCode.values();
-
-        ErrorCode(int code) {
-            this.mCode = code;
-        }
-
-        public int getCode() {
-            return mCode;
-        }
-
-        public static ErrorCode get(final int intValue) {
-            for (int i = 0; i < values.length; i++) {
-                if (values[i].getCode() == intValue) {
-                    return values[i];
-                }
-            }
-            return UNKNOWN_ERROR;
-        }
-    }
-
-    public WebDriver(WebView webview) {
-        this.mWebView = webview;
-        mWebView.requestFocus();
-        if (mWebView == null) {
-            throw new IllegalArgumentException("WebView cannot be null");
-        }
-        if (!mWebView.getSettings().getJavaScriptEnabled()) {
-            throw new RuntimeException("Javascript is disabled in the WebView. "
-                    + "Enable it to use WebDriver");
-        }
-        shouldRunInMainThread(true);
-
-        mSyncObject = new Object();
-        mSyncPageLoad = new Object();
-        this.mWebView = webview;
-        WebChromeClientWrapper chromeWrapper = new WebChromeClientWrapper(
-                webview.getWebChromeClient(), this);
-        mWebView.setWebChromeClient(chromeWrapper);
-        WebViewClientWrapper viewWrapper = new WebViewClientWrapper(
-                webview.getWebViewClient(), this);
-        mWebView.setWebViewClient(viewWrapper);
-        mWebView.addJavascriptInterface(new JavascriptResultReady(),
-                "webdriver");
-        mDocumentElement = new WebElement(this, "");
-        mNavigation = new Navigation();
-    }
-
-    /**
-     * @return The title of the current page, null if not set.
-     */
-    public String getTitle() {
-        return mWebView.getTitle();
-    }
-
-    /**
-     * Loads a URL in the WebView. This function is blocking and will return
-     * when the page has finished loading.
-     *
-     * @param url The URL to load.
-     */
-    public void get(String url) {
-        mNavigation.to(url);
-    }
-
-    /**
-     * @return The source page of the currently loaded page in WebView.
-     */
-    public String getPageSource() {
-        return (String) executeScript("return new XMLSerializer()."
-                + "serializeToString(document);");
-    }
-
-    /**
-     * Find the first {@link android.webkit.webdriver.WebElement} using the
-     * given method.
-     *
-     * @param by The locating mechanism to use.
-     * @return The first matching element on the current context.
-     * @throws {@link android.webkit.webdriver.WebElementNotFoundException} if
-     * no matching element was found.
-     */
-    public WebElement findElement(By by) {
-        checkNotNull(mDocumentElement, "Load a page using WebDriver.get() "
-                + "before looking for elements.");
-        return by.findElement(mDocumentElement);
-    }
-
-    /**
-     * Finds all {@link android.webkit.webdriver.WebElement} within the page
-     * using the given method.
-     *
-     * @param by The locating mechanism to use.
-     * @return A list of all {@link android.webkit.webdriver.WebElement} found,
-     * or an empty list if nothing matches.
-     */
-    public List<WebElement> findElements(By by) {
-        checkNotNull(mDocumentElement, "Load a page using WebDriver.get() "
-                + "before looking for elements.");
-        return by.findElements(mDocumentElement);
-    }
-
-    /**
-     * Clears the WebView's state and closes associated views.
-     */
-    public void quit() {
-        mWebView.clearCache(true);
-        mWebView.clearFormData();
-        mWebView.clearHistory();
-        mWebView.clearSslPreferences();
-        mWebView.clearView();
-        mWebView.removeAllViewsInLayout();
-    }
-
-    /**
-     * Executes javascript in the context of the main frame.
-     *
-     * If the script has a return value the following happens:
-     * <ul>
-     * <li>For an HTML element, this method returns a WebElement</li>
-     * <li>For a decimal, a Double is returned</li>
-     * <li>For non-decimal number, a Long is returned</li>
-     * <li>For a boolean, a Boolean is returned</li>
-     * <li>For all other cases, a String is returned</li>
-     * <li>For an array, this returns a List<Object> with each object
-     * following the rules above.</li>
-     * <li>For an object literal this returns a Map<String, Object>. Note that
-     * Object literals keys can only be Strings. Non Strings keys will
-     * be filtered out.</li>
-     * </ul>
-     *
-     * <p> Arguments must be a number, a boolean, a string a WebElement or
-     * a list of any combination of the above. The arguments will be made
-     * available to the javascript via the "arguments" magic variable,
-     * as if the function was called via "Function.apply".
-     *
-     * @param script The JavaScript to execute.
-     * @param args The arguments to the script. Can be any of a number, boolean,
-     * string, WebElement or a List of those.
-     * @return A Boolean, Long, Double, String, WebElement, List or null.
-     */
-    public Object executeScript(final String script, final Object... args) {
-        String scriptArgs = "[" + convertToJsArgs(args) + "]";
-        String injectScriptJs = getResourceAsString(R.raw.execute_script_android);
-        return executeRawJavascript("(" + injectScriptJs +
-                ")(" + escapeAndQuote(script) + ", " + scriptArgs + ", true)");
-    }
-
-    public Navigation navigate() {
-        return mNavigation;
-    }
-
-
-    /**
-     * @hide
-     */
-    public class Navigation {
-        /* package */ Navigation () {}
-
-        public void back() {
-            navigate(CMD_NAV_BACK, null);
-        }
-
-        public void forward() {
-            navigate(CMD_NAV_FORWARD, null);
-        }
-
-        public void to(String url) {
-            navigate(CMD_GET_URL, url);
-        }
-
-        public void refresh() {
-            navigate(CMD_NAV_REFRESH, null);
-        }
-
-        private void navigate(int command, String url) {
-            synchronized (mSyncPageLoad) {
-                mPageFinishedLoading = false;
-                Message msg = mHandler.obtainMessage(command);
-                msg.obj = url;
-                mHandler.sendMessage(msg);
-                waitForPageLoad();
-            }
-        }
-    }
-
-    /**
-     * Converts the arguments passed to a JavaScript friendly format.
-     *
-     * @param args The arguments to convert.
-     * @return Comma separated Strings containing the arguments.
-     */
-    /* package */ String convertToJsArgs(final Object... args) {
-        StringBuilder toReturn = new StringBuilder();
-        int length = args.length;
-        for (int i = 0; i < length; i++) {
-            toReturn.append((i > 0) ? "," : "");
-            if (args[i] instanceof List<?>) {
-                toReturn.append("[");
-                List<Object> aList = (List<Object>) args[i];
-                for (int j = 0 ; j < aList.size(); j++) {
-                    String comma = ((j == 0) ? "" : ",");
-                    toReturn.append(comma + convertToJsArgs(aList.get(j)));
-                }
-                toReturn.append("]");
-            } else if (args[i] instanceof Map<?, ?>) {
-                Map<Object, Object> aMap = (Map<Object, Object>) args[i];
-                String toAdd = "{";
-                for (Object key: aMap.keySet()) {
-                    toAdd += key + ":"
-                            + convertToJsArgs(aMap.get(key)) + ",";
-                }
-                toReturn.append(toAdd.substring(0, toAdd.length() -1) + "}");
-            } else if (args[i] instanceof WebElement) {
-                // WebElement are represented in JavaScript by Objects as
-                // follow: {ELEMENT:"id"} where "id" refers to the id
-                // of the HTML element in the javascript cache that can
-                // be accessed throught bot.inject.cache.getCache_()
-                toReturn.append("{\"" + ELEMENT_KEY + "\":\""
-                        + ((WebElement) args[i]).getId() + "\"}");
-            } else if (args[i] instanceof Number || args[i] instanceof Boolean) {
-                toReturn.append(String.valueOf(args[i]));
-            } else if (args[i] instanceof String) {
-                toReturn.append(escapeAndQuote((String) args[i]));
-            } else {
-                throw new IllegalArgumentException(
-                        "Javascript arguments can be "
-                        + "a Number, a Boolean, a String, a WebElement, "
-                        + "or a List or a Map of those. Got: "
-                        + ((args[i] == null) ? "null" : args[i].getClass()
-                        + ", value: " + args[i].toString()));
-            }
-        }
-        return toReturn.toString();
-    }
-
-    /* package */ Object executeRawJavascript(final String script) {
-        if (mWebView.getUrl() == null) {
-            throw new WebDriverException("Cannot operate on a blank page. "
-                    + "Load a page using WebDriver.get().");
-        }
-        String result = executeCommand(CMD_EXECUTE_SCRIPT,
-                "if (!window.webdriver || !window.webdriver.resultReady) {" +
-                "  return;" +
-                "}" +
-                "window.webdriver.resultReady(" + script + ")",
-                JS_EXECUTION_TIMEOUT);
-        if (result == null || "undefined".equals(result)) {
-            return null;
-        }
-        try {
-            JSONObject json = new JSONObject(result);
-            throwIfError(json);
-            Object value = json.get(VALUE);
-            return convertJsonToJavaObject(value);
-        } catch (JSONException e) {
-            throw new RuntimeException("Failed to parse JavaScript result: "
-                    + result.toString(), e);
-        }
-    }
-
-    /* package */ String getResourceAsString(final int resourceId) {
-        InputStream is = mWebView.getResources().openRawResource(resourceId);
-        BufferedReader br = new BufferedReader(new InputStreamReader(is));
-        StringBuilder sb = new StringBuilder();
-        String line = null;
-        try {
-            while ((line = br.readLine()) != null) {
-                sb.append(line);
-            }
-            br.close();
-            is.close();
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to open JavaScript resource.", e);
-        }
-        return sb.toString();
-    }
-
-    /* package */ void sendTouchScreen(Point coords) {
-        // Reset state
-        resetPageLoadState();
-        executeCommand(CMD_SEND_TOUCH, coords,LOADING_TIMEOUT);
-        // Wait for the events to be fully handled
-        waitForMessageRelay(MOTION_EVENT_TIMEOUT);
-
-        // If a page started loading, block until page finishes loading
-        waitForPageLoadIfNeeded();
-    }
-
-    /* package */ void resetPageLoadState() {
-        synchronized (mSyncPageLoad) {
-            mPageStartedLoading = false;
-            mPageFinishedLoading = false;
-        }
-    }
-
-    /* package */ void waitForPageLoadIfNeeded() {
-        synchronized (mSyncPageLoad) {
-            Long end = System.currentTimeMillis() + PAGE_STARTED_LOADING;
-            // Wait PAGE_STARTED_LOADING milliseconds to see if we detect a
-            // page load.
-            while (!mPageStartedLoading && (System.currentTimeMillis() <= end)) {
-                try {
-                    // This is notified by WebChromeClientWrapper#onProgressChanged
-                    // when the page finished loading.
-                    mSyncPageLoad.wait(PAGE_STARTED_LOADING);
-                } catch (InterruptedException e) {
-                    new RuntimeException(e);
-                }
-            }
-            if (mPageStartedLoading) {
-                waitForPageLoad();
-            }
-        }
-    }
-
-    private void touchScreen(Point coords) {
-        // Convert to screen coords
-        // screen = JS x zoom - offset
-        float zoom = mWebView.getScale();
-        float xOffset = mWebView.getX();
-        float yOffset = mWebView.getY();
-        Point screenCoords = new Point( (int)(coords.x*zoom - xOffset),
-                (int)(coords.y*zoom - yOffset));
-
-        long downTime = SystemClock.uptimeMillis();
-        MotionEvent down = MotionEvent.obtain(downTime,
-                SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, screenCoords.x,
-                screenCoords.y, 0);
-        down.setSource(InputDevice.SOURCE_TOUCHSCREEN);
-        MotionEvent up = MotionEvent.obtain(downTime,
-                SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, screenCoords.x,
-                screenCoords.y, 0);
-        up.setSource(InputDevice.SOURCE_TOUCHSCREEN);
-        // Dispatch the events to WebView
-        mWebView.dispatchTouchEvent(down);
-        mWebView.dispatchTouchEvent(up);
-    }
-
-    /* package */ void notifyPageStartedLoading() {
-        synchronized (mSyncPageLoad) {
-            mPageStartedLoading = true;
-            mSyncPageLoad.notify();
-        }
-    }
-
-    /* package */ void notifyPageFinishedLoading() {
-        synchronized (mSyncPageLoad) {
-            mPageFinishedLoading = true;
-            mSyncPageLoad.notify();
-        }
-    }
-
-    /**
-     *
-     * @param keys The first element of the CharSequence should be the
-     * existing value in the text input, or the empty string if none.
-     */
-    /* package */ void sendKeys(CharSequence[] keys) {
-        executeCommand(CMD_SEND_KEYS, keys, KEY_EVENT_TIMEOUT);
-        // Wait for all KeyEvents to be handled
-        waitForMessageRelay(KEY_EVENT_TIMEOUT);
-    }
-
-    /* package */ void sendKeyCodes(int[] keycodes) {
-        executeCommand(CMD_SEND_KEYCODE, keycodes, KEY_EVENT_TIMEOUT);
-        // Wait for all KeyEvents to be handled
-        waitForMessageRelay(KEY_EVENT_TIMEOUT);
-    }
-
-    /* package */ void moveCursorToRightMostPosition(String value) {
-        executeCommand(CMD_MOVE_CURSOR_RIGHTMOST_POS, value, KEY_EVENT_TIMEOUT);
-        waitForMessageRelay(KEY_EVENT_TIMEOUT);
-    }
-
-    private void moveCursorToLeftMostPos(String value) {
-        // If there is text, move the cursor to the rightmost position
-        if (value != null && !value.equals("")) {
-            long downTime = SystemClock.uptimeMillis();
-            KeyEvent down = new KeyEvent(downTime, SystemClock.uptimeMillis(),
-                    KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT, 0);
-            KeyEvent up = new KeyEvent(downTime, SystemClock.uptimeMillis(),
-                    KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_RIGHT,
-                    value.length());
-            mWebView.dispatchKeyEvent(down);
-            mWebView.dispatchKeyEvent(up);
-        }
-    }
-
-    private void dispatchKeyCodes(int[] keycodes) {
-        for (int i = 0; i < keycodes.length; i++) {
-            KeyEvent down = new KeyEvent(KeyEvent.ACTION_DOWN, keycodes[i]);
-            KeyEvent up = new KeyEvent(KeyEvent.ACTION_UP, keycodes[i]);
-            mWebView.dispatchKeyEvent(down);
-            mWebView.dispatchKeyEvent(up);
-        }
-    }
-
-    private void dispatchKeys(CharSequence[] keys) {
-        KeyCharacterMap chararcterMap = KeyCharacterMap.load(
-                KeyCharacterMap.VIRTUAL_KEYBOARD);
-        for (int i = 0; i < keys.length; i++) {
-            CharSequence s = keys[i];
-            for (int j = 0; j < s.length(); j++) {
-                KeyEvent[] events =
-                        chararcterMap.getEvents(new char[]{s.charAt(j)});
-                for (KeyEvent e : events) {
-                    mWebView.dispatchKeyEvent(e);
-                }
-            }
-        }
-    }
-
-    private void waitForMessageRelay(long timeout) {
-        synchronized (mSyncObject) {
-            mCommandDone = false;
-        }
-        Message msg = Message.obtain();
-        msg.what = WebViewCore.EventHub.MESSAGE_RELAY;
-        Message echo = mHandler.obtainMessage(CMD_MESSAGE_RELAY_ECHO);
-        msg.obj = echo;
-
-        mWebView.getWebViewCore().sendMessage(msg);
-        synchronized (mSyncObject) {
-            long end  = System.currentTimeMillis() + timeout;
-            while (!mCommandDone && (System.currentTimeMillis() <= end)) {
-                try {
-                    // This is notifed by the mHandler when it receives the
-                    // MESSAGE_RELAY back
-                    mSyncObject.wait(timeout);
-                } catch (InterruptedException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        }
-    }
-
-    private void waitForPageLoad() {
-        long endLoad = System.currentTimeMillis() + LOADING_TIMEOUT;
-        while (!mPageFinishedLoading
-                && (System.currentTimeMillis() <= endLoad)) {
-            try {
-                mSyncPageLoad.wait(LOADING_TIMEOUT);
-            } catch (InterruptedException e) {
-                throw new RuntimeException();
-            }
-        }
-    }
-
-    /**
-     * Wraps the given string into quotes and escape existing quotes
-     * and backslashes.
-     * "foo" -> "\"foo\""
-     * "foo\"" -> "\"foo\\\"\""
-     * "fo\o" -> "\"fo\\o\""
-     *
-     * @param toWrap The String to wrap in quotes
-     * @return a String wrapping the original String in quotes
-     */
-    private static String escapeAndQuote(final String toWrap) {
-        StringBuilder toReturn = new StringBuilder("\"");
-        for (int i = 0; i < toWrap.length(); i++) {
-            char c = toWrap.charAt(i);
-            if (c == '\"') {
-                toReturn.append("\\\"");
-            } else if (c == '\\') {
-                toReturn.append("\\\\");
-            } else {
-                toReturn.append(c);
-            }
-        }
-        toReturn.append("\"");
-        return toReturn.toString();
-    }
-
-    private Object convertJsonToJavaObject(final Object toConvert) {
-        try {
-            if (toConvert == null
-                    || toConvert.equals(null)
-                    || "undefined".equals(toConvert)
-                    || "null".equals(toConvert)) {
-                return null;
-            } else if (toConvert instanceof Boolean) {
-                return toConvert;
-            } else if (toConvert instanceof Double
-                    || toConvert instanceof Float) {
-                return Double.valueOf(String.valueOf(toConvert));
-            } else if (toConvert instanceof Integer
-                    || toConvert instanceof Long) {
-              return Long.valueOf(String.valueOf(toConvert));
-            } else if (toConvert instanceof JSONArray) { // List
-                return convertJsonArrayToList((JSONArray) toConvert);
-            } else if (toConvert instanceof JSONObject) { // Map or WebElment
-                JSONObject map = (JSONObject) toConvert;
-                if (map.opt(ELEMENT_KEY) != null) { // WebElement
-                    return new WebElement(this, (String) map.get(ELEMENT_KEY));
-                } else { // Map
-                    return convertJsonObjectToMap(map);
-                }
-            } else {
-                return toConvert.toString();
-            }
-        } catch (JSONException e) {
-            throw new RuntimeException("Failed to parse JavaScript result: "
-                    + toConvert.toString(), e);
-        }
-    }
-
-    private List<Object> convertJsonArrayToList(final JSONArray json) {
-        List<Object> toReturn = Lists.newArrayList();
-        for (int i = 0; i < json.length(); i++) {
-            try {
-                toReturn.add(convertJsonToJavaObject(json.get(i)));
-            } catch (JSONException e) {
-                throw new RuntimeException("Failed to parse JSON: "
-                        + json.toString(), e);
-            }
-        }
-        return toReturn;
-    }
-
-    private Map<Object, Object> convertJsonObjectToMap(final JSONObject json) {
-        Map<Object, Object> toReturn = Maps.newHashMap();
-        for (Iterator it = json.keys(); it.hasNext();) {
-            String key = (String) it.next();
-            try {
-                Object value = json.get(key);
-                toReturn.put(convertJsonToJavaObject(key),
-                        convertJsonToJavaObject(value));
-            } catch (JSONException e) {
-                throw new RuntimeException("Failed to parse JSON:"
-                        + json.toString(), e);
-            }
-        }
-        return toReturn;
-    }
-
-    private void throwIfError(final JSONObject jsonObject) {
-        ErrorCode status;
-        String errorMsg;
-        try {
-            status = ErrorCode.get((Integer) jsonObject.get(STATUS));
-            errorMsg  = String.valueOf(jsonObject.get(VALUE));
-        } catch (JSONException e) {
-            throw new RuntimeException("Failed to parse JSON Object: "
-                    + jsonObject, e);
-        }
-        switch (status) {
-            case SUCCESS:
-                return;
-            case NO_SUCH_ELEMENT:
-                throw new WebElementNotFoundException("Could not find "
-                        + "WebElement.");
-            case STALE_ELEMENT_REFERENCE:
-                throw new WebElementStaleException("WebElement is stale.");
-            default:
-                throw new WebDriverException("Error: " + errorMsg);
-        }
-    }
-
-    private void shouldRunInMainThread(boolean value) {
-        assert (value == (MAIN_THREAD == Thread.currentThread().getId()));
-    }
-
-    /**
-     * Interface called from JavaScript when the result is ready.
-     */
-    private class JavascriptResultReady {
-
-        /**
-         * A callback from JavaScript to Java that passes the result as a
-         * parameter. This method is available from the WebView's
-         * JavaScript DOM as window.webdriver.resultReady().
-         *
-         * @param result The result that should be sent to Java from Javascript.
-         */
-        public void resultReady(final String result) {
-            synchronized (mSyncObject) {
-                mJsResult = result;
-                mCommandDone = true;
-                mSyncObject.notify();
-            }
-        }
-    }
-
-    /* package */ void notifyCommandDone() {
-        synchronized (mSyncObject) {
-            mCommandDone = true;
-            mSyncObject.notify();
-        }
-    }
-
-    /**
-     * Executes the given command by posting a message to mHandler. This thread
-     * will block until the command which runs in the main thread is done.
-     *
-     * @param command The command to run.
-     * @param arg The argument for that command.
-     * @param timeout A timeout in milliseconds.
-     */
-    private String executeCommand(int command, final Object arg, long timeout) {
-        shouldRunInMainThread(false);
-        synchronized (mSyncObject) {
-            mCommandDone = false;
-            Message msg = mHandler.obtainMessage(command);
-            msg.obj = arg;
-            mHandler.sendMessage(msg);
-
-            long end = System.currentTimeMillis() + timeout;
-            while (!mCommandDone) {
-                if (System.currentTimeMillis() >= end) {
-                    throw new RuntimeException("Timeout executing command: "
-                            + command);
-                }
-                try {
-                    mSyncObject.wait(timeout);
-                } catch (InterruptedException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        }
-        return mJsResult;
-    }
-
-    private void checkNotNull(Object obj, String errosMsg) {
-        if (obj == null) {
-            throw new NullPointerException(errosMsg);
-        }
-    }
-}
diff --git a/core/java/android/webkit/webdriver/WebDriverException.java b/core/java/android/webkit/webdriver/WebDriverException.java
deleted file mode 100644
index 1a579c2..0000000
--- a/core/java/android/webkit/webdriver/WebDriverException.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * 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 android.webkit.webdriver;
-
-/**
- * @hide
- */
-public class WebDriverException extends RuntimeException {
-    public WebDriverException() {
-        super();
-    }
-
-    public WebDriverException(String reason) {
-        super(reason);
-    }
-
-    public WebDriverException(String reason, Throwable cause) {
-        super(reason, cause);
-    }
-
-    public WebDriverException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/core/java/android/webkit/webdriver/WebElement.java b/core/java/android/webkit/webdriver/WebElement.java
deleted file mode 100644
index 02c1595..0000000
--- a/core/java/android/webkit/webdriver/WebElement.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * 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 android.webkit.webdriver;
-
-import android.graphics.Point;
-import android.view.KeyEvent;
-
-import com.android.internal.R;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Represents an HTML element. Typically most interactions with a web page
- * will be performed through this class.
- *
- * @hide
- */
-public class WebElement {
-    private final String mId;
-    private final WebDriver mDriver;
-
-    private static final String LOCATOR_ID = "id";
-    private static final String LOCATOR_LINK_TEXT = "linkText";
-    private static final String LOCATOR_PARTIAL_LINK_TEXT = "partialLinkText";
-    private static final String LOCATOR_NAME = "name";
-    private static final String LOCATOR_CLASS_NAME = "className";
-    private static final String LOCATOR_CSS = "css";
-    private static final String LOCATOR_TAG_NAME = "tagName";
-    private static final String LOCATOR_XPATH = "xpath";
-
-    /**
-     * Package constructor to prevent clients from creating a new WebElement
-     * instance.
-     *
-     * <p> A WebElement represents an HTML element on the page.
-     * The corresponding HTML element is stored in a JS cache in the page
-     * that can be accessed through JavaScript using "bot.inject.cache".
-     *
-     * @param driver The WebDriver instance to use.
-     * @param id The index of the HTML element in the JavaSctipt cache.
-     * document.documentElement object.
-     */
-    /* package */ WebElement(final WebDriver driver, final String id) {
-        this.mId = id;
-        this.mDriver = driver;
-    }
-
-    /**
-     * Finds the first {@link android.webkit.webdriver.WebElement} using the
-     * given method.
-     *
-     * @param by The locating mechanism to use.
-     * @return The first matching element on the current context.
-     */
-    public WebElement findElement(final By by) {
-        return by.findElement(this);
-    }
-
-     /**
-     * Finds all {@link android.webkit.webdriver.WebElement} within the page
-     * using the given method.
-     *
-     * @param by The locating mechanism to use.
-     * @return A list of all {@link android.webkit.webdriver.WebElement} found,
-     * or an empty list if nothing matches.
-     */
-    public List<WebElement> findElements(final By by) {
-        return by.findElements(this);
-    }
-
-    /**
-     * Gets the visisble (i.e. not hidden by CSS) innerText of this element,
-     * inlcuding sub-elements.
-     *
-     * @return the innerText of this element.
-     * @throws {@link android.webkit.webdriver.WebElementStaleException} if this
-     * element is stale, i.e. not on the current DOM.
-     */
-    public String getText() {
-        String getText = mDriver.getResourceAsString(R.raw.get_text_android);
-        return (String) executeAtom(getText, this);
-    }
-
-    /**
-     * Gets the value of an HTML attribute for this element or the value of the
-     * property with the same name if the attribute is not present. If neither
-     * is set, null is returned.
-     *
-     * @param attribute the HTML attribute.
-     * @return the value of that attribute or the value of the property with the
-     * same name if the attribute is not set, or null if neither are set. For
-     * boolean attribute values this will return the string "true" or "false".
-     */
-    public String getAttribute(String attribute) {
-        String getAttribute = mDriver.getResourceAsString(
-                R.raw.get_attribute_value_android);
-        return (String) executeAtom(getAttribute, this, attribute);
-    }
-
-    /**
-     * @return the tag name of this element.
-     */
-    public String getTagName() {
-        return (String) mDriver.executeScript("return arguments[0].tagName;",
-                this);
-    }
-
-    /**
-     * @return true if this element is enabled, false otherwise.
-     */
-    public boolean isEnabled() {
-        String isEnabled = mDriver.getResourceAsString(
-                R.raw.is_enabled_android);
-        return (Boolean) executeAtom(isEnabled, this);
-    }
-
-    /**
-     * Determines whether this element is selected or not. This applies to input
-     * elements such as checkboxes, options in a select, and radio buttons.
-     *
-     * @return True if this element is selected, false otherwise.
-     */
-    public boolean isSelected() {
-        String isSelected = mDriver.getResourceAsString(
-                R.raw.is_selected_android);
-        return (Boolean) executeAtom(isSelected, this);
-    }
-
-    /**
-     * Selects an element on the page. This works for selecting checkboxes,
-     * options in a select, and radio buttons.
-     */
-    public void setSelected() {
-        String setSelected = mDriver.getResourceAsString(
-                R.raw.set_selected_android);
-        executeAtom(setSelected, this);
-    }
-
-    /**
-     * This toggles the checkboxe state from selected to not selected, or
-     * from not selected to selected.
-     *
-     * @return True if the toggled element is selected, false otherwise.
-     */
-    public boolean toggle() {
-        String toggle = mDriver.getResourceAsString(R.raw.toggle_android);
-        return (Boolean) executeAtom(toggle, this);
-    }
-
-    /**
-     * Sends the KeyEvents for the given sequence of characters to the
-     * WebElement to simulate typing. The KeyEvents are generated using the
-     * device's {@link android.view.KeyCharacterMap.VIRTUAL_KEYBOARD}.
-     *
-     * @param keys The keys to send to this WebElement
-     */
-    public void sendKeys(CharSequence... keys) {
-        if (keys == null || keys.length == 0) {
-            return;
-        }
-        click();
-        mDriver.moveCursorToRightMostPosition(getAttribute("value"));
-        mDriver.sendKeys(keys);
-    }
-
-    /**
-     * Use this to send one of the key code constants defined in
-     * {@link android.view.KeyEvent}
-     *
-     * @param keys
-     */
-    public void sendKeyCodes(int... keys) {
-        if (keys == null || keys.length == 0) {
-            return;
-        }
-        click();
-        mDriver.moveCursorToRightMostPosition(getAttribute("value"));
-        mDriver.sendKeyCodes(keys);
-    }
-
-    /**
-     * Sends a touch event to the center coordinates of this WebElement.
-     */
-    public void click() {
-        Point topLeft = getLocation();
-        Point size = getSize();
-        int jsX = topLeft.x + size.x/2;
-        int jsY = topLeft.y + size.y/2;
-        Point center = new Point(jsX, jsY);
-        mDriver.sendTouchScreen(center);
-    }
-
-    /**
-     * Submits the form containing this WebElement.
-     */
-    public void submit() {
-        mDriver.resetPageLoadState();
-        String submit = mDriver.getResourceAsString(R.raw.submit_android);
-        executeAtom(submit, this);
-        mDriver.waitForPageLoadIfNeeded();
-    }
-
-    /**
-     * Clears the text value if this is a text entry element. Does nothing
-     * otherwise.
-     */
-    public void clear() {
-        String value = getAttribute("value");
-        if (value == null || value.equals("")) {
-            return;
-        }
-        int length = value.length();
-        int[] keys = new int[length];
-        for (int i = 0; i < length; i++) {
-            keys[i] = KeyEvent.KEYCODE_DEL;
-        }
-        sendKeyCodes(keys);
-    }
-
-    /**
-     * @return the value of the given CSS property if found, null otherwise.
-     */
-    public String getCssValue(String cssProperty) {
-        String getCssProp = mDriver.getResourceAsString(
-                R.raw.get_value_of_css_property_android);
-        return (String) executeAtom(getCssProp, this, cssProperty);
-    }
-
-    /**
-     * Gets the width and height of the rendered element.
-     *
-     * @return a {@link android.graphics.Point}, where Point.x represents the
-     * width, and Point.y represents the height of the element.
-     */
-    public Point getSize() {
-        String getSize = mDriver.getResourceAsString(R.raw.get_size_android);
-        Map<String, Long> map = (Map<String, Long>) executeAtom(getSize, this);
-        return new Point(map.get("width").intValue(),
-                map.get("height").intValue());
-    }
-
-    /**
-     * Gets the location of the top left corner of this element on the screen.
-     * If the element is not visisble, this will scroll to get the element into
-     * the visisble screen.
-     *
-     * @return a {@link android.graphics.Point} containing the x and y
-     * coordinates of the top left corner of this element.
-     */
-    public Point getLocation() {
-        String getLocation = mDriver.getResourceAsString(
-                R.raw.get_top_left_coordinates_android);
-        Map<String,Long> map = (Map<String, Long>)  executeAtom(getLocation,
-                this);
-        return new Point(map.get("x").intValue(), map.get("y").intValue());
-    }
-
-    /**
-     * @return True if the WebElement is displayed on the screen,
-     * false otherwise.
-     */
-    public boolean isDisplayed() {
-        String isDisplayed = mDriver.getResourceAsString(
-                R.raw.is_displayed_android);
-        return (Boolean) executeAtom(isDisplayed, this);
-    }
-
-    /*package*/ String getId() {
-        return mId;
-    }
-
-    /* package */ WebElement findElementById(final String locator) {
-        return findElement(LOCATOR_ID, locator);
-    }
-
-    /* package */ WebElement findElementByLinkText(final String linkText) {
-        return findElement(LOCATOR_LINK_TEXT, linkText);
-    }
-
-    /* package */ WebElement findElementByPartialLinkText(
-            final String linkText) {
-        return findElement(LOCATOR_PARTIAL_LINK_TEXT, linkText);
-    }
-
-    /* package */ WebElement findElementByName(final String name) {
-        return findElement(LOCATOR_NAME, name);
-    }
-
-    /* package */ WebElement findElementByClassName(final String className) {
-        return findElement(LOCATOR_CLASS_NAME, className);
-    }
-
-    /* package */ WebElement findElementByCss(final String css) {
-        return findElement(LOCATOR_CSS, css);
-    }
-
-    /* package */ WebElement findElementByTagName(final String tagName) {
-        return findElement(LOCATOR_TAG_NAME, tagName);
-    }
-
-    /* package */ WebElement findElementByXPath(final String xpath) {
-        return findElement(LOCATOR_XPATH, xpath);
-    }
-
-        /* package */ List<WebElement> findElementsById(final String locator) {
-        return findElements(LOCATOR_ID, locator);
-    }
-
-    /* package */ List<WebElement> findElementsByLinkText(final String linkText) {
-        return findElements(LOCATOR_LINK_TEXT, linkText);
-    }
-
-    /* package */ List<WebElement> findElementsByPartialLinkText(
-            final String linkText) {
-        return findElements(LOCATOR_PARTIAL_LINK_TEXT, linkText);
-    }
-
-    /* package */ List<WebElement> findElementsByName(final String name) {
-        return findElements(LOCATOR_NAME, name);
-    }
-
-    /* package */ List<WebElement> findElementsByClassName(final String className) {
-        return findElements(LOCATOR_CLASS_NAME, className);
-    }
-
-    /* package */ List<WebElement> findElementsByCss(final String css) {
-        return findElements(LOCATOR_CSS, css);
-    }
-
-    /* package */ List<WebElement> findElementsByTagName(final String tagName) {
-        return findElements(LOCATOR_TAG_NAME, tagName);
-    }
-
-    /* package */ List<WebElement> findElementsByXPath(final String xpath) {
-        return findElements(LOCATOR_XPATH, xpath);
-    }
-
-    private Object executeAtom(final String atom, final Object... args) {
-        String scriptArgs = mDriver.convertToJsArgs(args);
-        return mDriver.executeRawJavascript("(" +
-                atom + ")(" + scriptArgs + ")");
-    }
-
-    private List<WebElement> findElements(String strategy, String locator) {
-        String findElements = mDriver.getResourceAsString(
-                R.raw.find_elements_android);
-        if (mId.equals("")) {
-            return (List<WebElement>) executeAtom(findElements,
-                    strategy, locator);
-        } else {
-            return (List<WebElement>) executeAtom(findElements,
-                    strategy, locator, this);
-        }
-    }
-
-    private WebElement findElement(String strategy, String locator) {
-        String findElement = mDriver.getResourceAsString(
-                R.raw.find_element_android);
-        WebElement el;
-        if (mId.equals("")) {
-            el = (WebElement) executeAtom(findElement,
-                    strategy, locator);
-        } else {
-            el = (WebElement) executeAtom(findElement,
-                    strategy, locator, this);
-        }
-        if (el == null) {
-            throw new WebElementNotFoundException("Could not find element "
-                    + "with " + strategy + ": " + locator);
-        }
-        return el;
-    }
-}
diff --git a/core/java/android/webkit/webdriver/WebElementNotFoundException.java b/core/java/android/webkit/webdriver/WebElementNotFoundException.java
deleted file mode 100644
index e66d279..0000000
--- a/core/java/android/webkit/webdriver/WebElementNotFoundException.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * 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 android.webkit.webdriver;
-
-/**
- * Thrown when a {@link android.webkit.webdriver.WebElement} is not found in the
- * DOM of the page.
- * @hide
- */
-public class WebElementNotFoundException extends RuntimeException {
-
-    public WebElementNotFoundException() {
-        super();
-    }
-
-    public WebElementNotFoundException(String reason) {
-        super(reason);
-    }
-
-    public WebElementNotFoundException(String reason, Throwable cause) {
-        super(reason, cause);
-    }
-
-    public WebElementNotFoundException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/core/java/android/webkit/webdriver/WebElementStaleException.java b/core/java/android/webkit/webdriver/WebElementStaleException.java
deleted file mode 100644
index c59e7945..0000000
--- a/core/java/android/webkit/webdriver/WebElementStaleException.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * 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 android.webkit.webdriver;
-
-/**
- * Thrown when trying to access a {@link android.webkit.webdriver.WebElement}
- * that is stale. This mean that the {@link android.webkit.webdriver.WebElement}
- * is no longer present on the DOM of the page.
- * @hide
- */
-public class WebElementStaleException extends RuntimeException {
-
-    public WebElementStaleException() {
-        super();
-    }
-
-    public  WebElementStaleException(String reason) {
-        super(reason);
-    }
-
-    public WebElementStaleException(String reason, Throwable cause) {
-        super(reason, cause);
-    }
-
-    public WebElementStaleException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/core/java/android/webkit/webdriver/WebViewClient.java b/core/java/android/webkit/webdriver/WebViewClient.java
deleted file mode 100644
index c582b24..0000000
--- a/core/java/android/webkit/webdriver/WebViewClient.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * 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 android.webkit.webdriver;
-
-import android.graphics.Bitmap;
-import android.net.http.SslError;
-import android.os.Message;
-import android.view.KeyEvent;
-import android.webkit.HttpAuthHandler;
-import android.webkit.SslErrorHandler;
-import android.webkit.WebResourceResponse;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-
-/* package */ class WebViewClientWrapper extends WebViewClient {
-    private final WebViewClient mDelegate;
-    private final WebDriver mDriver;
-
-    public WebViewClientWrapper(WebViewClient delegate, WebDriver driver) {
-        if (delegate == null) {
-            mDelegate = new WebViewClient();
-        } else {
-            mDelegate = delegate;
-        }
-        this.mDriver = driver;
-    }
-
-    @Override
-    public boolean shouldOverrideUrlLoading(WebView view, String url) {
-        return mDelegate.shouldOverrideUrlLoading(view, url);
-    }
-
-    @Override
-    public void onPageStarted(WebView view, String url, Bitmap favicon) {
-        mDriver.notifyPageStartedLoading();
-        mDelegate.onPageStarted(view, url, favicon);
-    }
-
-    @Override
-    public void onPageFinished(WebView view, String url) {
-        mDelegate.onPageFinished(view, url);
-    }
-
-    @Override
-    public void onLoadResource(WebView view, String url) {
-        mDelegate.onLoadResource(view, url);
-    }
-
-    @Override
-    public WebResourceResponse shouldInterceptRequest(WebView view,
-            String url) {
-        return mDelegate.shouldInterceptRequest(view, url);
-    }
-
-    @Override
-    public void onTooManyRedirects(WebView view, Message cancelMsg,
-            Message continueMsg) {
-        mDelegate.onTooManyRedirects(view, cancelMsg, continueMsg);
-    }
-
-    @Override
-    public void onReceivedError(WebView view, int errorCode, String description,
-            String failingUrl) {
-        mDelegate.onReceivedError(view, errorCode, description, failingUrl);
-    }
-
-    @Override
-    public void onFormResubmission(WebView view, Message dontResend,
-            Message resend) {
-        mDelegate.onFormResubmission(view, dontResend, resend);
-    }
-
-    @Override
-    public void doUpdateVisitedHistory(WebView view, String url,
-            boolean isReload) {
-        mDelegate.doUpdateVisitedHistory(view, url, isReload);
-    }
-
-    @Override
-    public void onReceivedSslError(WebView view, SslErrorHandler handler,
-            SslError error) {
-        mDelegate.onReceivedSslError(view, handler, error);
-    }
-
-    @Override
-    public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler,
-            String host, String realm) {
-        mDelegate.onReceivedHttpAuthRequest(view, handler, host, realm);
-    }
-
-    @Override
-    public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
-        return mDelegate.shouldOverrideKeyEvent(view, event);
-    }
-
-    @Override
-    public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
-        mDelegate.onUnhandledKeyEvent(view, event);
-    }
-
-    @Override
-    public void onScaleChanged(WebView view, float oldScale, float newScale) {
-        mDelegate.onScaleChanged(view, oldScale, newScale);
-    }
-
-    @Override
-    public void onReceivedLoginRequest(WebView view, String realm,
-            String account, String args) {
-        mDelegate.onReceivedLoginRequest(view, realm, account, args);
-    }
-}
diff --git a/core/java/android/webkit/webdriver/WebchromeClientWrapper.java b/core/java/android/webkit/webdriver/WebchromeClientWrapper.java
deleted file mode 100644
index a9e5d19..0000000
--- a/core/java/android/webkit/webdriver/WebchromeClientWrapper.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * 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 android.webkit.webdriver;
-
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.os.Message;
-import android.view.View;
-import android.webkit.ConsoleMessage;
-import android.webkit.GeolocationPermissions;
-import android.webkit.JsPromptResult;
-import android.webkit.JsResult;
-import android.webkit.ValueCallback;
-import android.webkit.WebChromeClient;
-import android.webkit.WebStorage;
-import android.webkit.WebView;
-
-/* package */ class WebChromeClientWrapper extends WebChromeClient {
-
-    private final WebChromeClient mDelegate;
-    private final WebDriver mDriver;
-
-    public WebChromeClientWrapper(WebChromeClient delegate, WebDriver driver) {
-        if (delegate == null) {
-            this.mDelegate = new WebChromeClient();
-        } else {
-            this.mDelegate = delegate;
-        }
-        this.mDriver = driver;
-    }
-
-    @Override
-    public void onProgressChanged(WebView view, int newProgress) {
-        if (newProgress == 100) {
-            mDriver.notifyPageFinishedLoading();
-        }
-        mDelegate.onProgressChanged(view, newProgress);
-    }
-
-    @Override
-    public void onReceivedTitle(WebView view, String title) {
-        mDelegate.onReceivedTitle(view, title);
-    }
-
-    @Override
-    public void onReceivedIcon(WebView view, Bitmap icon) {
-        mDelegate.onReceivedIcon(view, icon);
-    }
-
-    @Override
-    public void onReceivedTouchIconUrl(WebView view, String url,
-            boolean precomposed) {
-        mDelegate.onReceivedTouchIconUrl(view, url, precomposed);
-    }
-
-    @Override
-    public void onShowCustomView(View view,
-            CustomViewCallback callback) {
-        mDelegate.onShowCustomView(view, callback);
-    }
-
-    @Override
-    public void onHideCustomView() {
-        mDelegate.onHideCustomView();
-    }
-
-    @Override
-    public boolean onCreateWindow(WebView view, boolean dialog,
-            boolean userGesture, Message resultMsg) {
-        return mDelegate.onCreateWindow(view, dialog, userGesture, resultMsg);
-    }
-
-    @Override
-    public void onRequestFocus(WebView view) {
-        mDelegate.onRequestFocus(view);
-    }
-
-    @Override
-    public void onCloseWindow(WebView window) {
-        mDelegate.onCloseWindow(window);
-    }
-
-    @Override
-    public boolean onJsAlert(WebView view, String url, String message,
-            JsResult result) {
-        return mDelegate.onJsAlert(view, url, message, result);
-    }
-
-    @Override
-    public boolean onJsConfirm(WebView view, String url, String message,
-            JsResult result) {
-        return mDelegate.onJsConfirm(view, url, message, result);
-    }
-
-    @Override
-    public boolean onJsPrompt(WebView view, String url, String message,
-            String defaultValue, JsPromptResult result) {
-        return mDelegate.onJsPrompt(view, url, message, defaultValue, result);
-    }
-
-    @Override
-    public boolean onJsBeforeUnload(WebView view, String url, String message,
-            JsResult result) {
-        return mDelegate.onJsBeforeUnload(view, url, message, result);
-    }
-
-    @Override
-    public void onExceededDatabaseQuota(String url, String databaseIdentifier,
-            long currentQuota, long estimatedSize, long totalUsedQuota,
-            WebStorage.QuotaUpdater quotaUpdater) {
-        mDelegate.onExceededDatabaseQuota(url, databaseIdentifier, currentQuota,
-                estimatedSize, totalUsedQuota, quotaUpdater);
-    }
-
-    @Override
-    public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota,
-            WebStorage.QuotaUpdater quotaUpdater) {
-        mDelegate.onReachedMaxAppCacheSize(spaceNeeded, totalUsedQuota,
-                quotaUpdater);
-    }
-
-    @Override
-    public void onGeolocationPermissionsShowPrompt(String origin,
-            GeolocationPermissions.Callback callback) {
-        mDelegate.onGeolocationPermissionsShowPrompt(origin, callback);
-    }
-
-    @Override
-    public void onGeolocationPermissionsHidePrompt() {
-        mDelegate.onGeolocationPermissionsHidePrompt();
-    }
-
-    @Override
-    public boolean onJsTimeout() {
-        return mDelegate.onJsTimeout();
-    }
-
-    @Override
-    public void onConsoleMessage(String message, int lineNumber,
-            String sourceID) {
-        mDelegate.onConsoleMessage(message, lineNumber, sourceID);
-    }
-
-    @Override
-    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
-        return mDelegate.onConsoleMessage(consoleMessage);
-    }
-
-    @Override
-    public Bitmap getDefaultVideoPoster() {
-        return mDelegate.getDefaultVideoPoster();
-    }
-
-    @Override
-    public View getVideoLoadingProgressView() {
-        return mDelegate.getVideoLoadingProgressView();
-    }
-
-    @Override
-    public void getVisitedHistory(ValueCallback<String[]> callback) {
-        mDelegate.getVisitedHistory(callback);
-    }
-
-    @Override
-    public void openFileChooser(ValueCallback<Uri> uploadFile,
-            String acceptType) {
-        mDelegate.openFileChooser(uploadFile, acceptType);
-    }
-
-    @Override
-    public void setInstallableWebApp() {
-        mDelegate.setInstallableWebApp();
-    }
-
-    @Override
-    public void setupAutoFill(Message msg) {
-        mDelegate.setupAutoFill(msg);
-    }
-}
diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java
index 2621e64..df8eb05 100644
--- a/core/java/android/widget/AbsSeekBar.java
+++ b/core/java/android/widget/AbsSeekBar.java
@@ -24,6 +24,7 @@
 import android.util.AttributeSet;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
+import android.view.ViewConfiguration;
 
 public abstract class AbsSeekBar extends ProgressBar {
     private Drawable mThumb;
@@ -49,6 +50,10 @@
     private static final int NO_ALPHA = 0xFF;
     private float mDisabledAlpha;
     
+    private int mScaledTouchSlop;
+    private float mTouchDownX;
+    private boolean mIsDragging;
+
     public AbsSeekBar(Context context) {
         super(context);
     }
@@ -74,6 +79,8 @@
                 com.android.internal.R.styleable.Theme, 0, 0);
         mDisabledAlpha = a.getFloat(com.android.internal.R.styleable.Theme_disabledAlpha, 0.5f);
         a.recycle();
+
+        mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
     }
 
     /**
@@ -324,20 +331,42 @@
         
         switch (event.getAction()) {
             case MotionEvent.ACTION_DOWN:
-                setPressed(true);
-                onStartTrackingTouch();
-                trackTouchEvent(event);
+                if (isInScrollingContainer()) {
+                    mTouchDownX = event.getX();
+                } else {
+                    setPressed(true);
+                    onStartTrackingTouch();
+                    trackTouchEvent(event);
+                    attemptClaimDrag();
+                }
                 break;
                 
             case MotionEvent.ACTION_MOVE:
-                trackTouchEvent(event);
-                attemptClaimDrag();
+                if (mIsDragging) {
+                    trackTouchEvent(event);
+                } else {
+                    final float x = event.getX();
+                    if (Math.abs(x - mTouchDownX) > mScaledTouchSlop) {
+                        setPressed(true);
+                        onStartTrackingTouch();
+                        trackTouchEvent(event);
+                        attemptClaimDrag();
+                    }
+                }
                 break;
                 
             case MotionEvent.ACTION_UP:
-                trackTouchEvent(event);
-                onStopTrackingTouch();
-                setPressed(false);
+                if (mIsDragging) {
+                    trackTouchEvent(event);
+                    onStopTrackingTouch();
+                    setPressed(false);
+                } else {
+                    // Touch up when we never crossed the touch slop threshold should
+                    // be interpreted as a tap-seek to that location.
+                    onStartTrackingTouch();
+                    trackTouchEvent(event);
+                    onStopTrackingTouch();
+                }
                 // ProgressBar doesn't know to repaint the thumb drawable
                 // in its inactive state when the touch stops (because the
                 // value has not apparently changed)
@@ -345,8 +374,10 @@
                 break;
                 
             case MotionEvent.ACTION_CANCEL:
-                onStopTrackingTouch();
-                setPressed(false);
+                if (mIsDragging) {
+                    onStopTrackingTouch();
+                    setPressed(false);
+                }
                 invalidate(); // see above explanation
                 break;
         }
@@ -388,6 +419,7 @@
      * This is called when the user has started touching this widget.
      */
     void onStartTrackingTouch() {
+        mIsDragging = true;
     }
 
     /**
@@ -395,6 +427,7 @@
      * canceled.
      */
     void onStopTrackingTouch() {
+        mIsDragging = false;
     }
 
     /**
diff --git a/core/java/android/widget/SeekBar.java b/core/java/android/widget/SeekBar.java
index dfee29b..c76728f 100644
--- a/core/java/android/widget/SeekBar.java
+++ b/core/java/android/widget/SeekBar.java
@@ -104,6 +104,7 @@
     
     @Override
     void onStartTrackingTouch() {
+        super.onStartTrackingTouch();
         if (mOnSeekBarChangeListener != null) {
             mOnSeekBarChangeListener.onStartTrackingTouch(this);
         }
@@ -111,6 +112,7 @@
     
     @Override
     void onStopTrackingTouch() {
+        super.onStopTrackingTouch();
         if (mOnSeekBarChangeListener != null) {
             mOnSeekBarChangeListener.onStopTrackingTouch(this);
         }
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index d78050a9..1ab1a87 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -139,6 +139,11 @@
 
 import org.xmlpull.v1.XmlPullParserException;
 
+import com.android.internal.util.FastMath;
+import com.android.internal.widget.EditableInputConnection;
+
+import org.xmlpull.v1.XmlPullParserException;
+
 import java.io.IOException;
 import java.lang.ref.WeakReference;
 import java.text.BreakIterator;
@@ -220,6 +225,7 @@
  * @attr ref android.R.styleable#TextView_imeActionLabel
  * @attr ref android.R.styleable#TextView_imeActionId
  * @attr ref android.R.styleable#TextView_editorExtras
+ * @attr ref android.R.styleable#TextView_suggestionsEnabled
  */
 @RemoteView
 public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {
@@ -9418,7 +9424,7 @@
     }
 
     void showSuggestions() {
-        if (!mSuggestionsEnabled || !isTextEditable()) return;
+        if (!isSuggestionsEnabled() || !isTextEditable()) return;
 
         if (mSuggestionsPopupWindow == null) {
             mSuggestionsPopupWindow = new SuggestionsPopupWindow();
@@ -9445,18 +9451,41 @@
      * user double taps on these parts of the text. No suggestions are displayed when this value is
      * false. Use {@link #setSuggestionsEnabled(boolean)} to change this value.
      *
+     * Note that suggestions are only enabled for a subset of input types. In addition to setting
+     * this flag to <code>true</code> using {@link #setSuggestionsEnabled(boolean)} or the
+     * <code>android:suggestionsEnabled</code> xml attribute, this method will return
+     * <code>true</code> only if the class of your input type is {@link InputType#TYPE_CLASS_TEXT}.
+     * In addition, the type variation must also be one of
+     * {@link InputType#TYPE_TEXT_VARIATION_NORMAL},
+     * {@link InputType#TYPE_TEXT_VARIATION_EMAIL_SUBJECT},
+     * {@link InputType#TYPE_TEXT_VARIATION_LONG_MESSAGE},
+     * {@link InputType#TYPE_TEXT_VARIATION_SHORT_MESSAGE} or
+     * {@link InputType#TYPE_TEXT_VARIATION_WEB_EDIT_TEXT}.
+     *
      * @return true if the suggestions popup window is enabled.
      *
      * @attr ref android.R.styleable#TextView_suggestionsEnabled
      */
     public boolean isSuggestionsEnabled() {
-        return mSuggestionsEnabled;
+        if (!mSuggestionsEnabled) return false;
+        if ((mInputType & InputType.TYPE_MASK_CLASS) != InputType.TYPE_CLASS_TEXT) return false;
+        final int variation =
+                mInputType & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION);
+        if (variation == EditorInfo.TYPE_TEXT_VARIATION_NORMAL ||
+                variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_SUBJECT ||
+                variation == EditorInfo.TYPE_TEXT_VARIATION_LONG_MESSAGE ||
+                variation == EditorInfo.TYPE_TEXT_VARIATION_SHORT_MESSAGE ||
+                variation == EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) return true;
+
+        return false;
     }
 
     /**
      * Enables or disables the suggestion popup. See {@link #isSuggestionsEnabled()}.
      *
      * @param enabled Whether or not suggestions are enabled.
+     *
+     * @attr ref android.R.styleable#TextView_suggestionsEnabled
      */
     public void setSuggestionsEnabled(boolean enabled) {
         mSuggestionsEnabled = enabled;
@@ -9728,10 +9757,12 @@
 
         @Override
         public void show() {
-            mPasteTextView.setVisibility(canPaste() ? View.VISIBLE : View.GONE);
-            mReplaceTextView.setVisibility(mSuggestionsEnabled ? View.VISIBLE : View.GONE);
+            boolean canPaste = canPaste();
+            boolean suggestionsEnabled = isSuggestionsEnabled();
+            mPasteTextView.setVisibility(canPaste ? View.VISIBLE : View.GONE);
+            mReplaceTextView.setVisibility(suggestionsEnabled ? View.VISIBLE : View.GONE);
 
-            if (!canPaste() && !mSuggestionsEnabled) return;
+            if (!canPaste && !suggestionsEnabled) return;
 
             super.show();
         }
diff --git a/core/java/com/android/internal/os/ProcessStats.java b/core/java/com/android/internal/os/ProcessStats.java
index ea5ce09..e0e9a29 100644
--- a/core/java/com/android/internal/os/ProcessStats.java
+++ b/core/java/com/android/internal/os/ProcessStats.java
@@ -19,6 +19,7 @@
 import static android.os.Process.*;
 
 import android.os.Process;
+import android.os.StrictMode;
 import android.os.SystemClock;
 import android.util.Slog;
 
@@ -798,6 +799,10 @@
     }
     
     private String readFile(String file, char endChar) {
+        // Permit disk reads here, as /proc/meminfo isn't really "on
+        // disk" and should be fast.  TODO: make BlockGuard ignore
+        // /proc/ and /sys/ files perhaps?
+        StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
         FileInputStream is = null;
         try {
             is = new FileInputStream(file);
@@ -822,6 +827,7 @@
                 } catch (java.io.IOException e) {
                 }
             }
+            StrictMode.setThreadPolicy(savedPolicy);
         }
         return null;
     }
diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
index 06f753f..aaae691 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
@@ -162,7 +162,6 @@
         final ActionMenuView menuView = (ActionMenuView) mMenuView;
         ActionMenuItemView actionItemView = (ActionMenuItemView) itemView;
         actionItemView.setItemInvoker(menuView);
-        if (false) actionItemView.setExpandedFormat(menuView.isExpandedFormat());
     }
 
     @Override
@@ -174,7 +173,8 @@
     public void updateMenuView(boolean cleared) {
         super.updateMenuView(cleared);
 
-        if (mReserveOverflow && mMenu.getNonActionItems().size() > 0) {
+        final boolean hasOverflow = mReserveOverflow && mMenu.getNonActionItems().size() > 0;
+        if (hasOverflow) {
             if (mOverflowButton == null) {
                 mOverflowButton = new OverflowMenuButton(mContext);
             }
@@ -189,6 +189,8 @@
         } else if (mOverflowButton != null && mOverflowButton.getParent() == mMenuView) {
             ((ViewGroup) mMenuView).removeView(mOverflowButton);
         }
+
+        ((ActionMenuView) mMenuView).setOverflowReserved(mReserveOverflow);
     }
 
     @Override
diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/com/android/internal/view/menu/ActionMenuView.java
index bff621c..267221b 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuView.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuView.java
@@ -115,17 +115,26 @@
         int maxChildHeight = 0;
         int maxCellsUsed = 0;
         int expandableItemCount = 0;
+        int visibleItemCount = 0;
+        boolean hasOverflow = false;
 
-        if (mReserveOverflow) cellsRemaining--;
+        // This is used as a bitfield to locate the smallest items present. Assumes childCount < 64.
+        long smallestItemsAt = 0;
 
         final int childCount = getChildCount();
         for (int i = 0; i < childCount; i++) {
             final View child = getChildAt(i);
+            if (child.getVisibility() == GONE) continue;
+
+            visibleItemCount++;
+
             final LayoutParams lp = (LayoutParams) child.getLayoutParams();
             lp.expanded = false;
             lp.extraPixels = 0;
             lp.cellsUsed = 0;
             lp.expandable = false;
+            lp.leftMargin = 0;
+            lp.rightMargin = 0;
 
             // Overflow always gets 1 cell. No more, no less.
             final int cellsAvailable = lp.isOverflowButton ? 1 : cellsRemaining;
@@ -135,16 +144,17 @@
 
             maxCellsUsed = Math.max(maxCellsUsed, cellsUsed);
             if (lp.expandable) expandableItemCount++;
+            if (lp.isOverflowButton) hasOverflow = true;
 
             cellsRemaining -= cellsUsed;
             maxChildHeight = Math.max(maxChildHeight, child.getMeasuredHeight());
+            if (cellsUsed == 1) smallestItemsAt |= (1 << i);
         }
 
         // Divide space for remaining cells if we have items that can expand.
         // Try distributing whole leftover cells to smaller items first.
 
         boolean needsExpansion = false;
-        long smallestExpandableItemsAt = 0;
         while (expandableItemCount > 0 && cellsRemaining > 0) {
             int minCells = Integer.MAX_VALUE;
             long minCellsAt = 0; // Bit locations are indices of relevant child views
@@ -170,7 +180,7 @@
             if (minCellsItemCount > cellsRemaining) break; // Couldn't expand anything evenly. Stop.
 
             // Items that get expanded will always be in the set of smallest items when we're done.
-            smallestExpandableItemsAt |= minCellsAt;
+            smallestItemsAt |= minCellsAt;
 
             for (int i = 0; i < childCount; i++) {
                 if ((minCellsAt & (1 << i)) == 0) continue;
@@ -186,22 +196,58 @@
         }
 
         // Divide any space left that wouldn't divide along cell boundaries
-        // evenly among the smallest multi-cell (expandable) items.
+        // evenly among the smallest items
 
-        if (cellsRemaining > 0 && smallestExpandableItemsAt != 0) {
-            final int expandCount = Long.bitCount(smallestExpandableItemsAt);
-            final int extraPixels = cellsRemaining * cellSize / expandCount;
+        final boolean singleItem = !hasOverflow && visibleItemCount == 1;
+        if (cellsRemaining > 0 && smallestItemsAt != 0 &&
+                (cellsRemaining < visibleItemCount - 1 || singleItem)) {
+            float expandCount = Long.bitCount(smallestItemsAt);
+
+            if (!singleItem) {
+                // The items at the far edges may only expand by half in order to pin to either side.
+                if ((smallestItemsAt & 1) != 0) {
+                    expandCount -= 0.5f;
+                }
+                if ((smallestItemsAt & (1 << (childCount - 1))) != 0) {
+                    expandCount -= 0.5f;
+                }
+            }
+
+            final int extraPixels = (int) (cellsRemaining * cellSize / expandCount);
 
             for (int i = 0; i < childCount; i++) {
-                if ((smallestExpandableItemsAt & (1 << i)) == 0) continue;
+                if ((smallestItemsAt & (1 << i)) == 0) continue;
 
                 final View child = getChildAt(i);
                 final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-                lp.extraPixels = extraPixels;
-                lp.expanded = true;
+                if (child instanceof ActionMenuItemView) {
+                    // If this is one of our views, expand and measure at the larger size.
+                    lp.extraPixels = extraPixels;
+                    lp.expanded = true;
+                    if (i == 0) {
+                        // First item gets part of its new padding pushed out of sight.
+                        // The last item will get this implicitly from layout.
+                        lp.leftMargin = -extraPixels / 2;
+                    }
+                    needsExpansion = true;
+                } else if (lp.isOverflowButton) {
+                    lp.extraPixels = extraPixels;
+                    lp.expanded = true;
+                    lp.rightMargin = -extraPixels / 2;
+                    needsExpansion = true;
+                } else {
+                    // If we don't know what it is, give it some margins instead
+                    // and let it center within its space. We still want to pin
+                    // against the edges.
+                    if (i != 0) {
+                        lp.leftMargin = extraPixels / 2;
+                    }
+                    if (i != childCount - 1) {
+                        lp.rightMargin = extraPixels / 2;
+                    }
+                }
             }
 
-            needsExpansion = true;
             cellsRemaining = 0;
         }
 
@@ -301,7 +347,7 @@
                 }
 
                 int height = v.getMeasuredHeight();
-                int r = getWidth() - getPaddingRight();
+                int r = getWidth() - getPaddingRight() - p.rightMargin;
                 int l = r - overflowWidth;
                 int t = midVertical - (height / 2);
                 int b = t + height;
@@ -320,8 +366,20 @@
             }
         }
 
+        if (childCount == 1 && !hasOverflow) {
+            // Center a single child
+            final View v = getChildAt(0);
+            final int width = v.getMeasuredWidth();
+            final int height = v.getMeasuredHeight();
+            final int midHorizontal = (right - left) / 2;
+            final int l = midHorizontal - width / 2;
+            final int t = midVertical - height / 2;
+            v.layout(l, t, l + width, t + height);
+            return;
+        }
+
         final int spacerCount = nonOverflowCount - (hasOverflow ? 0 : 1);
-        final int spacerSize = spacerCount > 0 ? widthRemaining / spacerCount : 0;
+        final int spacerSize = Math.max(0, spacerCount > 0 ? widthRemaining / spacerCount : 0);
 
         int startLeft = getPaddingLeft();
         for (int i = 0; i < childCount; i++) {
@@ -334,7 +392,7 @@
             startLeft += lp.leftMargin;
             int width = v.getMeasuredWidth();
             int height = v.getMeasuredHeight();
-            int t = midVertical - (height / 2);
+            int t = midVertical - height / 2;
             v.layout(startLeft, t, startLeft + width, t + height);
             startLeft += width + lp.rightMargin + spacerSize;
         }
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index a3d0fe4..83f3294 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -579,7 +579,7 @@
     }
 
     public void setIcon(int resId) {
-        setIcon(mContext.getResources().getDrawableForDensity(resId, getPreferredIconDensity()));
+        setIcon(mContext.getResources().getDrawable(resId));
     }
 
     public void setLogo(Drawable logo) {
@@ -593,25 +593,6 @@
         setLogo(mContext.getResources().getDrawable(resId));
     }
 
-    /**
-     * @return Drawable density to load that will best fit the available height.
-     */
-    private int getPreferredIconDensity() {
-        final Resources res = mContext.getResources();
-        final int availableHeight = getLayoutParams().height -
-                mHomeLayout.getVerticalIconPadding();
-        int iconSize = res.getDimensionPixelSize(android.R.dimen.app_icon_size);
-
-        if (iconSize * DisplayMetrics.DENSITY_LOW >= availableHeight) {
-            return DisplayMetrics.DENSITY_LOW;
-        } else if (iconSize * DisplayMetrics.DENSITY_MEDIUM >= availableHeight) {
-            return DisplayMetrics.DENSITY_MEDIUM;
-        } else if (iconSize * DisplayMetrics.DENSITY_HIGH >= availableHeight) {
-            return DisplayMetrics.DENSITY_HIGH;
-        }
-        return DisplayMetrics.DENSITY_XHIGH;
-    }
-
     public void setNavigationMode(int mode) {
         final int oldMode = mNavigationMode;
         if (mode != oldMode) {
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index 98d7fce..423eff4 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -15,6 +15,10 @@
 ** limitations under the License.
 */
 
+#define LOG_TAG "Paint"
+
+#include <utils/Log.h>
+
 #include "jni.h"
 #include "GraphicsJNI.h"
 #include <android_runtime/AndroidRuntime.h>
@@ -50,8 +54,6 @@
 static JMetricsID gFontMetricsInt_fieldID;
 
 static void defaultSettingsForAndroid(SkPaint* paint) {
-    // looks best we decided
-    paint->setHinting(SkPaint::kSlight_Hinting);
     // utf16 is required for java
     paint->setTextEncoding(SkPaint::kUTF16_TextEncoding);
 }
@@ -96,6 +98,18 @@
         GraphicsJNI::getNativePaint(env, paint)->setFlags(flags);
     }
 
+    static jint getHinting(JNIEnv* env, jobject paint) {
+        NPE_CHECK_RETURN_ZERO(env, paint);
+        return GraphicsJNI::getNativePaint(env, paint)->getHinting()
+                == SkPaint::kNo_Hinting ? 0 : 1;
+    }
+
+    static void setHinting(JNIEnv* env, jobject paint, jint mode) {
+        NPE_CHECK_RETURN_VOID(env, paint);
+        GraphicsJNI::getNativePaint(env, paint)->setHinting(
+                mode == 0 ? SkPaint::kNo_Hinting : SkPaint::kSlight_Hinting);
+    }
+
     static void setAntiAlias(JNIEnv* env, jobject paint, jboolean aa) {
         NPE_CHECK_RETURN_VOID(env, paint);
         GraphicsJNI::getNativePaint(env, paint)->setAntiAlias(aa);
@@ -833,6 +847,8 @@
     {"native_set","(II)V", (void*) SkPaintGlue::assign},
     {"getFlags","()I", (void*) SkPaintGlue::getFlags},
     {"setFlags","(I)V", (void*) SkPaintGlue::setFlags},
+    {"getHinting","()I", (void*) SkPaintGlue::getHinting},
+    {"setHinting","(I)V", (void*) SkPaintGlue::setHinting},
     {"setAntiAlias","(Z)V", (void*) SkPaintGlue::setAntiAlias},
     {"setSubpixelText","(Z)V", (void*) SkPaintGlue::setSubpixelText},
     {"setLinearText","(Z)V", (void*) SkPaintGlue::setLinearText},
diff --git a/core/jni/android_text_format_Time.cpp b/core/jni/android_text_format_Time.cpp
index 69c6021..776733c 100644
--- a/core/jni/android_text_format_Time.cpp
+++ b/core/jni/android_text_format_Time.cpp
@@ -69,7 +69,7 @@
     t->t.tm_yday = env->GetIntField(o, g_ydayField);
     t->t.tm_isdst = env->GetIntField(o, g_isdstField);
     t->t.tm_gmtoff = env->GetLongField(o, g_gmtoffField);
-    bool allDay = env->GetIntField(o, g_allDayField);
+    bool allDay = env->GetBooleanField(o, g_allDayField);
     if (allDay &&
 	((t->t.tm_sec !=0) || (t->t.tm_min != 0) || (t->t.tm_hour != 0))) {
         char msg[100];
@@ -162,7 +162,7 @@
 {
     Time t;
     if (!java2time(env, &t, This)) return env->NewStringUTF("");
-    bool allDay = env->GetIntField(This, g_allDayField);
+    bool allDay = env->GetBooleanField(This, g_allDayField);
     
     if (!allDay) {
         ACQUIRE_TIMEZONE(This, t)
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index dc0106c..b9868db 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -122,6 +122,15 @@
         android:label="@string/permlab_sendSms"
         android:description="@string/permdesc_sendSms" />
 
+    <!-- Allows an application to send SMS messages via the Messaging app with no user
+         input or confirmation.
+         @hide -->
+    <permission android:name="android.permission.SEND_SMS_NO_CONFIRMATION"
+        android:permissionGroup="android.permission-group.COST_MONEY"
+        android:protectionLevel="signatureOrSystem"
+        android:label="@string/permlab_sendSmsNoConfirmation"
+        android:description="@string/permdesc_sendSmsNoConfirmation" />
+
     <!-- Allows an application to initiate a phone call without going through
          the Dialer user interface for the user to confirm the call
          being placed. -->
@@ -1413,7 +1422,7 @@
         android:description="@string/permdesc_modifyNetworkAccounting"
         android:protectionLevel="signatureOrSystem" />
 
-    <!-- C2DM permission. 
+    <!-- C2DM permission.
          @hide Used internally.
      -->
     <permission android:name="android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE"
diff --git a/core/res/res/layout-large/action_mode_close_item.xml b/core/res/res/layout-large/action_mode_close_item.xml
index a7b3fbb..96aa451 100644
--- a/core/res/res/layout-large/action_mode_close_item.xml
+++ b/core/res/res/layout-large/action_mode_close_item.xml
@@ -18,7 +18,7 @@
         android:id="@+id/action_mode_close_button"
         android:focusable="true"
         android:clickable="true"
-        android:paddingLeft="16dip"
+        android:paddingLeft="8dip"
         style="?android:attr/actionModeCloseButtonStyle"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
@@ -31,8 +31,10 @@
     <TextView android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_gravity="center"
-              android:layout_marginLeft="8dip"
+              android:layout_marginLeft="4dip"
               android:layout_marginRight="16dip"
-              android:textAppearance="?android:attr/textAppearanceMedium"
+              android:textAppearance="?android:attr/textAppearanceSmall"
+              android:textSize="12sp"
+              android:textAllCaps="true"
               android:text="@string/action_mode_done" />
 </LinearLayout>
diff --git a/core/res/res/layout/action_mode_close_item.xml b/core/res/res/layout/action_mode_close_item.xml
index 57c0f1d..ac5af70 100644
--- a/core/res/res/layout/action_mode_close_item.xml
+++ b/core/res/res/layout/action_mode_close_item.xml
@@ -18,7 +18,7 @@
         android:id="@+id/action_mode_close_button"
         android:focusable="true"
         android:clickable="true"
-        android:paddingLeft="16dip"
+        android:paddingLeft="8dip"
         style="?android:attr/actionModeCloseButtonStyle"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
diff --git a/core/res/res/layout/preference_category_holo.xml b/core/res/res/layout/preference_category_holo.xml
index a4e20d2..81e595c 100644
--- a/core/res/res/layout/preference_category_holo.xml
+++ b/core/res/res/layout/preference_category_holo.xml
@@ -18,5 +18,5 @@
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
     style="?android:attr/listSeparatorTextViewStyle"
     android:id="@+android:id/title"
-    android:paddingLeft="16dp"
-/>
+    android:paddingLeft="@dimen/preference_item_padding_side"
+    android:paddingRight="@dimen/preference_item_padding_side" />
diff --git a/core/res/res/layout/preference_child_holo.xml b/core/res/res/layout/preference_child_holo.xml
index 06c846b..3c6a12e 100644
--- a/core/res/res/layout/preference_child_holo.xml
+++ b/core/res/res/layout/preference_child_holo.xml
@@ -20,7 +20,7 @@
     android:layout_height="wrap_content"
     android:minHeight="?android:attr/listPreferredItemHeight"
     android:gravity="center_vertical"
-    android:paddingLeft="16dip"
+    android:paddingLeft="@dimen/preference_child_padding_side"
     android:paddingRight="?android:attr/scrollbarSize">
 
     <LinearLayout
@@ -34,17 +34,16 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center"
-            />
+            android:paddingRight="@dimen/preference_item_padding_inner" />
     </LinearLayout>
 
     <RelativeLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="32dip"
-        android:layout_marginRight="6dip"
-        android:layout_marginTop="6dip"
-        android:layout_marginBottom="6dip"
-        android:layout_weight="1">
+        android:layout_weight="1"
+        android:paddingRight="@dimen/preference_item_padding_inner"
+        android:paddingTop="6dip"
+        android:paddingBottom="6dip">
 
         <TextView android:id="@+android:id/title"
             android:layout_width="wrap_content"
diff --git a/core/res/res/layout/preference_holo.xml b/core/res/res/layout/preference_holo.xml
index e5ed33c..48f483d 100644
--- a/core/res/res/layout/preference_holo.xml
+++ b/core/res/res/layout/preference_holo.xml
@@ -22,6 +22,7 @@
     android:layout_height="wrap_content"
     android:minHeight="?android:attr/listPreferredItemHeight"
     android:gravity="center_vertical"
+    android:paddingLeft="@dimen/preference_item_padding_side"
     android:paddingRight="?android:attr/scrollbarSize">
 
     <LinearLayout
@@ -36,18 +37,17 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center"
             android:minWidth="48dp"
-            />
+            android:paddingRight="@dimen/preference_item_padding_inner" />
     </LinearLayout>
 
     <RelativeLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="16dip"
-        android:layout_marginRight="8dip"
-        android:layout_marginTop="6dip"
-        android:layout_marginBottom="6dip"
-        android:layout_weight="1">
-    
+        android:layout_weight="1"
+        android:paddingRight="@dimen/preference_item_padding_inner"
+        android:paddingTop="6dip"
+        android:paddingBottom="6dip">
+
         <TextView android:id="@+android:id/title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
diff --git a/core/res/res/layout/preference_information_holo.xml b/core/res/res/layout/preference_information_holo.xml
index d15cd7b..e29ed03 100644
--- a/core/res/res/layout/preference_information_holo.xml
+++ b/core/res/res/layout/preference_information_holo.xml
@@ -22,6 +22,7 @@
     android:layout_height="wrap_content"
     android:minHeight="?android:attr/listPreferredItemHeight"
     android:gravity="center_vertical"
+    android:paddingLeft="@dimen/preference_item_padding_side"
     android:paddingRight="?android:attr/scrollbarSize">
 
     <LinearLayout
@@ -35,17 +36,16 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center"
-            />
+            android:paddingRight="@dimen/preference_item_padding_inner" />
     </LinearLayout>
 
     <RelativeLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="16dip"
-        android:layout_marginRight="6sp"
-        android:layout_marginTop="6sp"
-        android:layout_marginBottom="6sp"
-        android:layout_weight="1">
+        android:layout_weight="1"
+        android:paddingRight="@dimen/preference_item_padding_inner"
+        android:paddingTop="6dip"
+        android:paddingBottom="6dip">
 
         <TextView android:id="@+android:id/title"
             android:layout_width="wrap_content"
@@ -64,7 +64,7 @@
             android:maxLines="2" />
 
     </RelativeLayout>
-    
+
     <!-- Preference should place its actual preference widget here. -->
     <LinearLayout android:id="@+android:id/widget_frame"
         android:layout_width="wrap_content"
diff --git a/core/res/res/raw/execute_script_android.js b/core/res/res/raw/execute_script_android.js
deleted file mode 100644
index 84fcbd4..0000000
--- a/core/res/res/raw/execute_script_android.js
+++ /dev/null
@@ -1,8 +0,0 @@
-function(){return function(){function h(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
-else if(b=="function"&&typeof a.call=="undefined")return"object";return b}function i(a){var b=h(a);return b=="array"||b=="object"&&typeof a.length=="number"}function j(a){a=h(a);return a=="object"||a=="array"||a=="function"}var k=Date.now||function(){return+new Date};function l(a,b){function c(){}c.prototype=b.prototype;a.c=b.prototype;a.prototype=new c};function m(a){this.stack=Error().stack||"";if(a)this.message=String(a)}l(m,Error);m.prototype.name="CustomError";function n(a,b,c){var d={};for(var e in a)if(b.call(c,a[e],e,a))d[e]=a[e];return d}function o(a,b,c){var d={};for(var e in a)d[e]=b.call(c,a[e],e,a);return d}function p(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function q(a,b){m.call(this,b);this.code=a;this.name=r[a]||r[13]}l(q,m);var r,s={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},t={};for(var u in s)t[s[u]]=u;r=t;
-q.prototype.toString=function(){return"["+this.name+"] "+this.message};function v(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a};function w(a,b){b.unshift(a);m.call(this,v.apply(null,b));b.shift();this.b=a}l(w,m);w.prototype.name="AssertionError";function x(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var e=c}throw new w(""+d,e||[]);}return a};var y=Array.prototype,z=y.map?function(a,b,c){x(a.length!=null);return y.map.call(a,b,c)}:function(a,b,c){var d=a.length,e=Array(d),f=typeof a=="string"?a.split(""):a;for(var g=0;g<d;g++)if(g in f)e[g]=b.call(c,f[g],g,a);return e};var A="",B;if(B=/WebKit\/(\S+)/){var C=B.exec(this.navigator?this.navigator.userAgent:null);A=C?C[1]:""};function D(){}
-function E(a,b,c){switch(typeof b){case "string":F(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(h(b)=="array"){var d=b.length;c.push("[");var e="";for(var f=0;f<d;f++){c.push(e);E(a,b[f],c);e=","}c.push("]");break}c.push("{");d="";for(e in b)if(Object.prototype.hasOwnProperty.call(b,e)){f=b[e];if(typeof f!="function"){c.push(d);F(a,e,c);c.push(":");E(a,
-f,c);d=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var G={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},H=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function F(a,b,c){c.push('"',b.replace(H,function(d){if(d in G)return G[d];var e=d.charCodeAt(0),f="\\u";if(e<16)f+="000";else if(e<256)f+="00";else if(e<4096)f+="0";return G[d]=f+e.toString(16)}),'"')};function I(a){switch(h(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return z(a,I);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=J(a);return b}if(i(a))return z(a,I);a=n(a,function(c,d){return typeof d=="number"||typeof d=="string"});return o(a,I);default:return null}}
-function K(a,b){if(h(a)=="array")return z(a,function(c){return K(c,b)});else if(j(a))return"ELEMENT"in a?L(a.ELEMENT,b):o(a,function(c){return K(c,b)});return a}function M(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.a=k()}return b}function J(a){var b=M(a.ownerDocument),c=p(b,function(d){return d==a});if(!c){c=":wdc:"+b.a++;b[c]=a}return c}
-function L(a,b){a=decodeURIComponent(a);var c=b||document,d=M(c);if(!(a in d))throw new q(10,"Element does not exist in cache");var e=d[a];for(var f=e;f;){if(f==c.documentElement)return e;f=f.parentNode}delete d[a];throw new q(10,"Element is no longer attached to the DOM");};function N(a,b,c){var d;try{if(typeof a=="string")a=new Function(a);var e=K(b),f=a.apply(null,e);d={status:0,value:I(f)}}catch(g){d={status:"code"in g?g.code:13,value:{message:g.message}}}if(c){a=[];E(new D,d,a);d=a.join("")}else d=d;return d}var O="_".split("."),P=this;!(O[0]in P)&&P.execScript&&P.execScript("var "+O[0]);for(var Q;O.length&&(Q=O.shift());)if(!O.length&&N!==undefined)P[Q]=N;else P=P[Q]?P[Q]:P[Q]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/find_element_android.js b/core/res/res/raw/find_element_android.js
deleted file mode 100644
index c62f851..0000000
--- a/core/res/res/raw/find_element_android.js
+++ /dev/null
@@ -1,27 +0,0 @@
-function(){return function(){var i=this;
-function j(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if(b==
-"function"&&typeof a.call=="undefined")return"object";return b}function aa(a){var b=j(a);return b=="array"||b=="object"&&typeof a.length=="number"}function k(a){return typeof a=="string"}function l(a){return j(a)=="function"}function ba(a){a=j(a);return a=="object"||a=="array"||a=="function"}var ca=Date.now||function(){return+new Date};function m(a,b){function c(){}c.prototype=b.prototype;a.n=b.prototype;a.prototype=new c};function n(a){this.stack=Error().stack||"";if(a)this.message=String(a)}m(n,Error);n.prototype.name="CustomError";function da(a,b,c){var d={};for(var f in a)if(b.call(c,a[f],f,a))d[f]=a[f];return d}function ea(a,b,c){var d={};for(var f in a)d[f]=b.call(c,a[f],f,a);return d}function fa(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function o(a,b){n.call(this,b);this.code=a;this.name=p[a]||p[13]}m(o,n);var p,ga={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},ha={};for(var ia in ga)ha[ga[ia]]=ia;p=ha;
-o.prototype.toString=function(){return"["+this.name+"] "+this.message};function ja(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a}function q(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")}function r(a,b){if(a<b)return-1;else if(a>b)return 1;return 0}var ka={};function la(a){return ka[a]||(ka[a]=String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()}))};function s(a,b){b.unshift(a);n.call(this,ja.apply(null,b));b.shift();this.q=a}m(s,n);s.prototype.name="AssertionError";function t(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var f=c}throw new s(""+d,f||[]);}return a};var u=Array.prototype,ma=u.indexOf?function(a,b,c){t(a.length!=null);return u.indexOf.call(a,b,c)}:function(a,b,c){c=c==null?0:c<0?Math.max(0,a.length+c):c;if(k(a)){if(!k(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(c=c;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},na=u.forEach?function(a,b,c){t(a.length!=null);u.forEach.call(a,b,c)}:function(a,b,c){var d=a.length,f=k(a)?a.split(""):a;for(var e=0;e<d;e++)e in f&&b.call(c,f[e],e,a)},v=u.filter?function(a,b,c){t(a.length!=null);return u.filter.call(a,
-b,c)}:function(a,b,c){var d=a.length,f=[],e=0,g=k(a)?a.split(""):a;for(var h=0;h<d;h++)if(h in g){var G=g[h];if(b.call(c,G,h,a))f[e++]=G}return f},w=u.map?function(a,b,c){t(a.length!=null);return u.map.call(a,b,c)}:function(a,b,c){var d=a.length,f=Array(d),e=k(a)?a.split(""):a;for(var g=0;g<d;g++)if(g in e)f[g]=b.call(c,e[g],g,a);return f},oa=u.some?function(a,b,c){t(a.length!=null);return u.some.call(a,b,c)}:function(a,b,c){var d=a.length,f=k(a)?a.split(""):a;for(var e=0;e<d;e++)if(e in f&&b.call(c,
-f[e],e,a))return true;return false};function x(a,b,c){a:{var d=a.length,f=k(a)?a.split(""):a;for(var e=0;e<d;e++)if(e in f&&b.call(c,f[e],e,a)){b=e;break a}b=-1}return b<0?null:k(a)?a.charAt(b):a[b]};var A=true,pa,qa="",B;if(A)B=/WebKit\/(\S+)/;if(B){var ra=B.exec(i.navigator?i.navigator.userAgent:null);qa=ra?ra[1]:""}pa=qa;var sa={};var ta;function C(a,b){this.width=a;this.height=b}C.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};function D(a){return a?new E(F(a)):ta||(ta=new E)}function H(a,b){if(a.contains&&b.nodeType==1)return a==b||a.contains(b);if(typeof a.compareDocumentPosition!="undefined")return a==b||Boolean(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}function F(a){return a.nodeType==9?a:a.ownerDocument||a.document}function ua(a,b){var c=[];return va(a,b,c,true)?c[0]:undefined}
-function va(a,b,c,d){if(a!=null){var f=0;for(var e;e=a.childNodes[f];f++){if(b(e)){c.push(e);if(d)return true}if(va(e,b,c,d))return true}}return false}function wa(a,b,c,d){if(!c)a=a.parentNode;c=d==null;for(var f=0;a&&(c||f<=d);){if(b(a))return a;a=a.parentNode;f++}return null}function E(a){this.g=a||i.document||document}
-function I(a,b,c,d){a=d||a.g;b=b&&b!="*"?b.toUpperCase():"";if(d=a.querySelectorAll){if(d=a.querySelector){if(!(d=!A)){if(!(d=document.compatMode=="CSS1Compat")){if(!(d=sa["528"])){d=0;var f=q(String(pa)).split("."),e=q(String("528")).split("."),g=Math.max(f.length,e.length);for(var h=0;d==0&&h<g;h++){var G=f[h]||"",Oa=e[h]||"",Pa=RegExp("(\\d*)(\\D*)","g"),Qa=RegExp("(\\d*)(\\D*)","g");do{var y=Pa.exec(G)||["","",""],z=Qa.exec(Oa)||["","",""];if(y[0].length==0&&z[0].length==0)break;d=r(y[1].length==
-0?0:parseInt(y[1],10),z[1].length==0?0:parseInt(z[1],10))||r(y[2].length==0,z[2].length==0)||r(y[2],z[2])}while(d==0)}d=sa["528"]=d>=0}d=d}d=d}d=d}d=d}if(d&&(b||c))c=a.querySelectorAll(b+(c?"."+c:""));else if(c&&a.getElementsByClassName){a=a.getElementsByClassName(c);if(b){d={};e=f=0;for(;g=a[e];e++)if(b==g.nodeName)d[f++]=g;d.length=f;c=d}else c=a}else{a=a.getElementsByTagName(b||"*");if(c){d={};f=0;for(e=0;g=a[e];e++){b=g.className;if(typeof b.split=="function"&&ma(b.split(/\s+/),c)>=0)d[f++]=g}d.length=
-f;c=d}else c=a}return c}E.prototype.contains=H;function xa(){}
-function J(a,b,c){switch(typeof b){case "string":ya(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(j(b)=="array"){var d=b.length;c.push("[");var f="";for(var e=0;e<d;e++){c.push(f);J(a,b[e],c);f=","}c.push("]");break}c.push("{");d="";for(f in b)if(Object.prototype.hasOwnProperty.call(b,f)){e=b[f];if(typeof e!="function"){c.push(d);ya(a,f,c);c.push(":");J(a,
-e,c);d=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var K={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},za=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function ya(a,b,c){c.push('"',b.replace(za,function(d){if(d in K)return K[d];var f=d.charCodeAt(0),e="\\u";if(f<16)e+="000";else if(f<256)e+="00";else if(f<4096)e+="0";return K[d]=e+f.toString(16)}),'"')};function L(a){switch(j(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return w(a,L);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=Aa(a);return b}if(aa(a))return w(a,L);a=da(a,function(c,d){return typeof d=="number"||k(d)});return ea(a,L);default:return null}}
-function M(a,b){if(j(a)=="array")return w(a,function(c){return M(c,b)});else if(ba(a))return"ELEMENT"in a?Ba(a.ELEMENT,b):ea(a,function(c){return M(c,b)});return a}function Ca(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.m=ca()}return b}function Aa(a){var b=Ca(a.ownerDocument),c=fa(b,function(d){return d==a});if(!c){c=":wdc:"+b.m++;b[c]=a}return c}
-function Ba(a,b){a=decodeURIComponent(a);var c=b||document,d=Ca(c);if(!(a in d))throw new o(10,"Element does not exist in cache");var f=d[a];for(var e=f;e;){if(e==c.documentElement)return f;e=e.parentNode}delete d[a];throw new o(10,"Element is no longer attached to the DOM");};var Da=window;function Ea(){var a=i.Components;if(!a)return false;try{a.o["@mozilla.org/uuid-generator;1"].p(a.l.s);return true}catch(b){return false}};var N={};N.b=function(a,b){if(!a)throw Error("No class name specified");a=q(a);if(a.split(/\s+/).length>1)throw Error("Compound class names not permitted");var c=I(D(b),"*",a,b);return c.length?c[0]:null};N.e=function(a,b){if(!a)throw Error("No class name specified");a=q(a);if(a.split(/\s+/).length>1)throw Error("Compound class names not permitted");return I(D(b),"*",a,b)};var O={};O.b=function(a,b){if(!l(b.querySelector)&&0)throw Error("CSS selection is not supported");if(!a)throw Error("No selector specified");if(a.split(/,/).length>1)throw Error("Compound selectors not permitted");a=q(a);var c=b.querySelector(a);return c&&c.nodeType==1?c:null};O.e=function(a,b){if(!l(b.querySelectorAll)&&0)throw Error("CSS selection is not supported");if(!a)throw Error("No selector specified");if(a.split(/,/).length>1)throw Error("Compound selectors not permitted");a=q(a);return b.querySelectorAll(a)};function Fa(a,b){if(typeof a.selectNodes!="undefined"){var c=F(a);typeof c.setProperty!="undefined"&&c.setProperty("SelectionLanguage","XPath");return a.selectNodes(b)}else if(document.implementation.hasFeature("XPath","3.0")){c=F(a);var d=c.createNSResolver(c.documentElement);c=c.evaluate(b,a,d,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);d=[];var f=c.snapshotLength;for(var e=0;e<f;e++)d.push(c.snapshotItem(e));return d}else return[]};var P={};
-P.b=function(a,b){var c=function(d,f){var e=F(d);if(d.selectSingleNode){e.setProperty&&e.setProperty("SelectionLanguage","XPath");return d.selectSingleNode(f)}else if(e.implementation.hasFeature("XPath","3.0")){var g=e.createNSResolver(e.documentElement),h;if(typeof XPathResult!="undefined")h=XPathResult.FIRST_ORDERED_NODE_TYPE;else{if(!Ea())throw Error("Document claims it supports XPath yet XPathResult is not defined. Please report this to Selenium developers");h=Components.l.r.FIRST_ORDERED_NODE_TYPE}return e.evaluate(f,d,
-g,h,null).singleNodeValue}return null}(b,a);if(!c)return null;if(c.nodeType!=1)throw Error("Returned node is not an element: "+a);return c};P.e=function(a,b){var c=Fa(b,a);na(c,function(d){if(d.nodeType!=1)throw Error("Returned nodes must be elements: "+a);});return c};var Ga="StopIteration"in i?i.StopIteration:Error("StopIteration");function Ha(){}Ha.prototype.next=function(){throw Ga;};function Q(a,b,c,d,f){this.a=!!b;a&&R(this,a,d);this.f=f!=undefined?f:this.d||0;if(this.a)this.f*=-1;this.k=!c}m(Q,Ha);Q.prototype.c=null;Q.prototype.d=0;Q.prototype.j=false;function R(a,b,c,d){if(a.c=b)a.d=typeof c=="number"?c:a.c.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.f=d}
-Q.prototype.next=function(){var a;if(this.j){if(!this.c||this.k&&this.f==0)throw Ga;a=this.c;var b=this.a?-1:1;if(this.d==b){var c=this.a?a.lastChild:a.firstChild;c?R(this,c):R(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?R(this,c):R(this,a.parentNode,b*-1);this.f+=this.d*(this.a?-1:1)}else this.j=true;a=this.c;if(!this.c)throw Ga;return a};
-Q.prototype.splice=function(){var a=this.c,b=this.a?1:-1;if(this.d==b){this.d=b*-1;this.f+=this.d*(this.a?-1:1)}this.a=!this.a;Q.prototype.next.call(this);this.a=!this.a;b=aa(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function Ia(a,b,c,d){Q.call(this,a,b,c,null,d)}m(Ia,Q);Ia.prototype.next=function(){do Ia.n.next.call(this);while(this.d==-1);return this.c};function Ja(a,b){var c=F(a);if(c.defaultView&&c.defaultView.getComputedStyle)if(c=c.defaultView.getComputedStyle(a,null))return c[b]||c.getPropertyValue(b);return""};function S(a,b){return!!a&&a.nodeType==1&&(!b||a.tagName.toUpperCase()==b)}
-var Ka=["async","autofocus","autoplay","checked","compact","complete","controls","declare","defaultchecked","defaultselected","defer","disabled","draggable","ended","formnovalidate","hidden","indeterminate","iscontenteditable","ismap","itemscope","loop","multiple","muted","nohref","noresize","noshade","novalidate","nowrap","open","paused","pubdate","readonly","required","reversed","scoped","seamless","seeking","selected","spellcheck","truespeed","willvalidate"];
-function T(a,b){if(8==a.nodeType)return null;b=b.toLowerCase();if(b=="style"){var c=q(a.style.cssText).toLowerCase();return c.charAt(c.length-1)==";"?c:c+";"}c=a.getAttributeNode(b);if(!c)return null;if(ma(Ka,b)>=0)return"true";return c.specified?c.value:null}function U(a){for(a=a.parentNode;a&&a.nodeType!=1&&a.nodeType!=9&&a.nodeType!=11;)a=a.parentNode;return S(a)?a:null}function V(a,b){b=la(String(b));return Ja(a,b)||La(a,b)}
-function La(a,b){var c=(a.currentStyle||a.style)[b];if(c!="inherit")return c!==undefined?c:null;return(c=U(a))?La(c,b):null}
-function Ma(a){if(l(a.getBBox))return a.getBBox();var b;if((Ja(a,"display")||(a.currentStyle?a.currentStyle.display:null)||a.style.display)!="none")b=new C(a.offsetWidth,a.offsetHeight);else{b=a.style;var c=b.display,d=b.visibility,f=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";var e;e=a.offsetWidth;a=a.offsetHeight;b.display=c;b.position=f;b.visibility=d;b=new C(e,a)}return b}
-function W(a,b){function c(e){if(V(e,"display")=="none")return false;e=U(e);return!e||c(e)}function d(e){var g=Ma(e);if(g.height>0&&g.width>0)return true;if(e.innerText||e.textContent)if(Na.test(e.innerText||e.textContent))return true;return A&&oa(e.childNodes,function(h){return S(h)&&d(h)})}if(!S(a))throw Error("Argument to isShown must be of type Element");if(S(a,"TITLE"))return(F(a)?F(a).parentWindow||F(a).defaultView:window)==Da;if(S(a,"OPTION")||S(a,"OPTGROUP")){var f=wa(a,function(e){return S(e,
-"SELECT")});return!!f&&W(f)}if(S(a,"MAP")){if(!a.name)return false;f=F(a);f=f.evaluate?P.b('/descendant::*[@usemap = "#'+a.name+'"]',f):ua(f,function(e){return S(e)&&T(e,"usemap")=="#"+a.name});return!!f&&W(f)}if(S(a,"AREA")){f=wa(a,function(e){return S(e,"MAP")});return!!f&&W(f)}if(S(a,"INPUT")&&a.type.toLowerCase()=="hidden")return false;if(V(a,"visibility")=="hidden")return false;if(!c(a))return false;if(!b&&Ra(a)==0)return false;if(!d(a))return false;return true}
-function Sa(a){var b=[];Ta(a,b);b=w(b,q);return q(b.join("\n"))}function Ta(a,b){if(S(a,"BR"))b.push("");else{var c=Ua(a);c&&b[b.length-1]&&b.push("");na(a.childNodes,function(d){if(d.nodeType==3){var f=U(d);if(f){W(f);if(f&&W(f)){d=d.nodeValue.replace(Va," ");f=b.pop()||"";var e=f.length-1;if(e>=0&&f.indexOf(" ",e)==e&&d.lastIndexOf(" ",0)==0)d=d.substr(1);b.push(f+d)}}}else S(d)&&Ta(d,b)});c&&b[b.length-1]&&b.push("")}}function Ua(a){a=V(a,"display");return a=="block"||a=="list-item"}
-var Wa="[\\s\\xa0"+String.fromCharCode(160)+"]+",Va=RegExp(Wa,"g"),Na=RegExp("^"+Wa+"$");function Ra(a){var b=1,c=V(a,"opacity");if(c)b=Number(c);if(a=U(a))b*=Ra(a);return b};var Xa={};Xa.b=function(a,b){var c=D(b),d=k(a)?c.g.getElementById(a):a;if(!d)return null;if(T(d,"id")==a&&H(b,d))return d;c=I(c,"*");return x(c,function(f){return T(f,"id")==a&&H(b,f)})};Xa.e=function(a,b){var c=I(D(b),"*",null,b);return v(c,function(d){return T(d,"id")==a})};var X={},Ya={};X.i=function(a,b,c){b=I(D(b),"A",null,b);return x(b,function(d){d=Sa(d);return c&&d.indexOf(a)!=-1||d==a})};X.h=function(a,b,c){b=I(D(b),"A",null,b);return v(b,function(d){d=Sa(d);return c&&d.indexOf(a)!=-1||d==a})};X.b=function(a,b){return X.i(a,b,false)};X.e=function(a,b){return X.h(a,b,false)};Ya.b=function(a,b){return X.i(a,b,true)};Ya.e=function(a,b){return X.h(a,b,true)};var Za={};Za.b=function(a,b){var c=I(D(b),"*",null,b);return x(c,function(d){return T(d,"name")==a})};Za.e=function(a,b){var c=I(D(b),"*",null,b);return v(c,function(d){return T(d,"name")==a})};var $a={};$a.b=function(a,b){return I(D(b),a,null,b)[0]||null};$a.e=function(a,b){return I(D(b),a,null,b)};var ab={className:N,css:O,id:Xa,linkText:X,name:Za,partialLinkText:Ya,tagName:$a,xpath:P};function bb(a,b){var c;a:{for(c in a)if(!Object.prototype[c]){c=c;break a}c=null}if(c){var d=ab[c];if(d&&l(d.b))return d.b(a[c],b||F(Da))}throw Error("Unsupported locator strategy: "+c);};function cb(a,b,c){var d={};d[a]=b;a=bb;c=[d,c];var f;try{if(k(a))a=new Function(a);var e=M(c),g=a.apply(null,e);f={status:0,value:L(g)}}catch(h){f={status:"code"in h?h.code:13,value:{message:h.message}}}e=[];J(new xa,f,e);return e.join("")}var Y="_".split("."),Z=i;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)if(!Y.length&&cb!==undefined)Z[$]=cb;else Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/find_elements_android.js b/core/res/res/raw/find_elements_android.js
deleted file mode 100644
index 3a57689..0000000
--- a/core/res/res/raw/find_elements_android.js
+++ /dev/null
@@ -1,27 +0,0 @@
-function(){return function(){var i=this;
-function j(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if(b==
-"function"&&typeof a.call=="undefined")return"object";return b}function aa(a){var b=j(a);return b=="array"||b=="object"&&typeof a.length=="number"}function k(a){return typeof a=="string"}function l(a){return j(a)=="function"}function ba(a){a=j(a);return a=="object"||a=="array"||a=="function"}var ca=Date.now||function(){return+new Date};function m(a,b){function c(){}c.prototype=b.prototype;a.n=b.prototype;a.prototype=new c};function n(a){this.stack=Error().stack||"";if(a)this.message=String(a)}m(n,Error);n.prototype.name="CustomError";function da(a,b,c){var d={};for(var f in a)if(b.call(c,a[f],f,a))d[f]=a[f];return d}function ea(a,b,c){var d={};for(var f in a)d[f]=b.call(c,a[f],f,a);return d}function fa(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function o(a,b){n.call(this,b);this.code=a;this.name=p[a]||p[13]}m(o,n);var p,ga={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},ha={};for(var ia in ga)ha[ga[ia]]=ia;p=ha;
-o.prototype.toString=function(){return"["+this.name+"] "+this.message};function ja(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a}function q(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")}function r(a,b){if(a<b)return-1;else if(a>b)return 1;return 0}var ka={};function la(a){return ka[a]||(ka[a]=String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()}))};function s(a,b){b.unshift(a);n.call(this,ja.apply(null,b));b.shift();this.q=a}m(s,n);s.prototype.name="AssertionError";function t(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var f=c}throw new s(""+d,f||[]);}return a};var u=Array.prototype,ma=u.indexOf?function(a,b,c){t(a.length!=null);return u.indexOf.call(a,b,c)}:function(a,b,c){c=c==null?0:c<0?Math.max(0,a.length+c):c;if(k(a)){if(!k(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(c=c;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},na=u.forEach?function(a,b,c){t(a.length!=null);u.forEach.call(a,b,c)}:function(a,b,c){var d=a.length,f=k(a)?a.split(""):a;for(var e=0;e<d;e++)e in f&&b.call(c,f[e],e,a)},v=u.filter?function(a,b,c){t(a.length!=null);return u.filter.call(a,
-b,c)}:function(a,b,c){var d=a.length,f=[],e=0,g=k(a)?a.split(""):a;for(var h=0;h<d;h++)if(h in g){var G=g[h];if(b.call(c,G,h,a))f[e++]=G}return f},w=u.map?function(a,b,c){t(a.length!=null);return u.map.call(a,b,c)}:function(a,b,c){var d=a.length,f=Array(d),e=k(a)?a.split(""):a;for(var g=0;g<d;g++)if(g in e)f[g]=b.call(c,e[g],g,a);return f},oa=u.some?function(a,b,c){t(a.length!=null);return u.some.call(a,b,c)}:function(a,b,c){var d=a.length,f=k(a)?a.split(""):a;for(var e=0;e<d;e++)if(e in f&&b.call(c,
-f[e],e,a))return true;return false};function x(a,b,c){a:{var d=a.length,f=k(a)?a.split(""):a;for(var e=0;e<d;e++)if(e in f&&b.call(c,f[e],e,a)){b=e;break a}b=-1}return b<0?null:k(a)?a.charAt(b):a[b]};var A=true,pa,qa="",B;if(A)B=/WebKit\/(\S+)/;if(B){var ra=B.exec(i.navigator?i.navigator.userAgent:null);qa=ra?ra[1]:""}pa=qa;var sa={};var ta;function C(a,b){this.width=a;this.height=b}C.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};function D(a){return a?new E(F(a)):ta||(ta=new E)}function H(a,b){if(a.contains&&b.nodeType==1)return a==b||a.contains(b);if(typeof a.compareDocumentPosition!="undefined")return a==b||Boolean(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}function F(a){return a.nodeType==9?a:a.ownerDocument||a.document}function ua(a,b){var c=[];return va(a,b,c,true)?c[0]:undefined}
-function va(a,b,c,d){if(a!=null){var f=0;for(var e;e=a.childNodes[f];f++){if(b(e)){c.push(e);if(d)return true}if(va(e,b,c,d))return true}}return false}function wa(a,b,c,d){if(!c)a=a.parentNode;c=d==null;for(var f=0;a&&(c||f<=d);){if(b(a))return a;a=a.parentNode;f++}return null}function E(a){this.g=a||i.document||document}
-function I(a,b,c,d){a=d||a.g;b=b&&b!="*"?b.toUpperCase():"";if(d=a.querySelectorAll){if(d=a.querySelector){if(!(d=!A)){if(!(d=document.compatMode=="CSS1Compat")){if(!(d=sa["528"])){d=0;var f=q(String(pa)).split("."),e=q(String("528")).split("."),g=Math.max(f.length,e.length);for(var h=0;d==0&&h<g;h++){var G=f[h]||"",Oa=e[h]||"",Pa=RegExp("(\\d*)(\\D*)","g"),Qa=RegExp("(\\d*)(\\D*)","g");do{var y=Pa.exec(G)||["","",""],z=Qa.exec(Oa)||["","",""];if(y[0].length==0&&z[0].length==0)break;d=r(y[1].length==
-0?0:parseInt(y[1],10),z[1].length==0?0:parseInt(z[1],10))||r(y[2].length==0,z[2].length==0)||r(y[2],z[2])}while(d==0)}d=sa["528"]=d>=0}d=d}d=d}d=d}d=d}if(d&&(b||c))c=a.querySelectorAll(b+(c?"."+c:""));else if(c&&a.getElementsByClassName){a=a.getElementsByClassName(c);if(b){d={};e=f=0;for(;g=a[e];e++)if(b==g.nodeName)d[f++]=g;d.length=f;c=d}else c=a}else{a=a.getElementsByTagName(b||"*");if(c){d={};f=0;for(e=0;g=a[e];e++){b=g.className;if(typeof b.split=="function"&&ma(b.split(/\s+/),c)>=0)d[f++]=g}d.length=
-f;c=d}else c=a}return c}E.prototype.contains=H;function xa(){}
-function J(a,b,c){switch(typeof b){case "string":ya(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(j(b)=="array"){var d=b.length;c.push("[");var f="";for(var e=0;e<d;e++){c.push(f);J(a,b[e],c);f=","}c.push("]");break}c.push("{");d="";for(f in b)if(Object.prototype.hasOwnProperty.call(b,f)){e=b[f];if(typeof e!="function"){c.push(d);ya(a,f,c);c.push(":");J(a,
-e,c);d=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var K={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},za=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function ya(a,b,c){c.push('"',b.replace(za,function(d){if(d in K)return K[d];var f=d.charCodeAt(0),e="\\u";if(f<16)e+="000";else if(f<256)e+="00";else if(f<4096)e+="0";return K[d]=e+f.toString(16)}),'"')};function L(a){switch(j(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return w(a,L);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=Aa(a);return b}if(aa(a))return w(a,L);a=da(a,function(c,d){return typeof d=="number"||k(d)});return ea(a,L);default:return null}}
-function M(a,b){if(j(a)=="array")return w(a,function(c){return M(c,b)});else if(ba(a))return"ELEMENT"in a?Ba(a.ELEMENT,b):ea(a,function(c){return M(c,b)});return a}function Ca(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.m=ca()}return b}function Aa(a){var b=Ca(a.ownerDocument),c=fa(b,function(d){return d==a});if(!c){c=":wdc:"+b.m++;b[c]=a}return c}
-function Ba(a,b){a=decodeURIComponent(a);var c=b||document,d=Ca(c);if(!(a in d))throw new o(10,"Element does not exist in cache");var f=d[a];for(var e=f;e;){if(e==c.documentElement)return f;e=e.parentNode}delete d[a];throw new o(10,"Element is no longer attached to the DOM");};var Da=window;function Ea(){var a=i.Components;if(!a)return false;try{a.o["@mozilla.org/uuid-generator;1"].p(a.l.s);return true}catch(b){return false}};var N={};N.d=function(a,b){if(!a)throw Error("No class name specified");a=q(a);if(a.split(/\s+/).length>1)throw Error("Compound class names not permitted");var c=I(D(b),"*",a,b);return c.length?c[0]:null};N.b=function(a,b){if(!a)throw Error("No class name specified");a=q(a);if(a.split(/\s+/).length>1)throw Error("Compound class names not permitted");return I(D(b),"*",a,b)};var O={};O.d=function(a,b){if(!l(b.querySelector)&&0)throw Error("CSS selection is not supported");if(!a)throw Error("No selector specified");if(a.split(/,/).length>1)throw Error("Compound selectors not permitted");a=q(a);var c=b.querySelector(a);return c&&c.nodeType==1?c:null};O.b=function(a,b){if(!l(b.querySelectorAll)&&0)throw Error("CSS selection is not supported");if(!a)throw Error("No selector specified");if(a.split(/,/).length>1)throw Error("Compound selectors not permitted");a=q(a);return b.querySelectorAll(a)};function Fa(a,b){if(typeof a.selectNodes!="undefined"){var c=F(a);typeof c.setProperty!="undefined"&&c.setProperty("SelectionLanguage","XPath");return a.selectNodes(b)}else if(document.implementation.hasFeature("XPath","3.0")){c=F(a);var d=c.createNSResolver(c.documentElement);c=c.evaluate(b,a,d,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);d=[];var f=c.snapshotLength;for(var e=0;e<f;e++)d.push(c.snapshotItem(e));return d}else return[]};var P={};
-P.d=function(a,b){var c=function(d,f){var e=F(d);if(d.selectSingleNode){e.setProperty&&e.setProperty("SelectionLanguage","XPath");return d.selectSingleNode(f)}else if(e.implementation.hasFeature("XPath","3.0")){var g=e.createNSResolver(e.documentElement),h;if(typeof XPathResult!="undefined")h=XPathResult.FIRST_ORDERED_NODE_TYPE;else{if(!Ea())throw Error("Document claims it supports XPath yet XPathResult is not defined. Please report this to Selenium developers");h=Components.l.r.FIRST_ORDERED_NODE_TYPE}return e.evaluate(f,d,
-g,h,null).singleNodeValue}return null}(b,a);if(!c)return null;if(c.nodeType!=1)throw Error("Returned node is not an element: "+a);return c};P.b=function(a,b){var c=Fa(b,a);na(c,function(d){if(d.nodeType!=1)throw Error("Returned nodes must be elements: "+a);});return c};var Ga="StopIteration"in i?i.StopIteration:Error("StopIteration");function Ha(){}Ha.prototype.next=function(){throw Ga;};function Q(a,b,c,d,f){this.a=!!b;a&&R(this,a,d);this.f=f!=undefined?f:this.e||0;if(this.a)this.f*=-1;this.k=!c}m(Q,Ha);Q.prototype.c=null;Q.prototype.e=0;Q.prototype.j=false;function R(a,b,c,d){if(a.c=b)a.e=typeof c=="number"?c:a.c.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.f=d}
-Q.prototype.next=function(){var a;if(this.j){if(!this.c||this.k&&this.f==0)throw Ga;a=this.c;var b=this.a?-1:1;if(this.e==b){var c=this.a?a.lastChild:a.firstChild;c?R(this,c):R(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?R(this,c):R(this,a.parentNode,b*-1);this.f+=this.e*(this.a?-1:1)}else this.j=true;a=this.c;if(!this.c)throw Ga;return a};
-Q.prototype.splice=function(){var a=this.c,b=this.a?1:-1;if(this.e==b){this.e=b*-1;this.f+=this.e*(this.a?-1:1)}this.a=!this.a;Q.prototype.next.call(this);this.a=!this.a;b=aa(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function Ia(a,b,c,d){Q.call(this,a,b,c,null,d)}m(Ia,Q);Ia.prototype.next=function(){do Ia.n.next.call(this);while(this.e==-1);return this.c};function Ja(a,b){var c=F(a);if(c.defaultView&&c.defaultView.getComputedStyle)if(c=c.defaultView.getComputedStyle(a,null))return c[b]||c.getPropertyValue(b);return""};function S(a,b){return!!a&&a.nodeType==1&&(!b||a.tagName.toUpperCase()==b)}
-var Ka=["async","autofocus","autoplay","checked","compact","complete","controls","declare","defaultchecked","defaultselected","defer","disabled","draggable","ended","formnovalidate","hidden","indeterminate","iscontenteditable","ismap","itemscope","loop","multiple","muted","nohref","noresize","noshade","novalidate","nowrap","open","paused","pubdate","readonly","required","reversed","scoped","seamless","seeking","selected","spellcheck","truespeed","willvalidate"];
-function T(a,b){if(8==a.nodeType)return null;b=b.toLowerCase();if(b=="style"){var c=q(a.style.cssText).toLowerCase();return c.charAt(c.length-1)==";"?c:c+";"}c=a.getAttributeNode(b);if(!c)return null;if(ma(Ka,b)>=0)return"true";return c.specified?c.value:null}function U(a){for(a=a.parentNode;a&&a.nodeType!=1&&a.nodeType!=9&&a.nodeType!=11;)a=a.parentNode;return S(a)?a:null}function V(a,b){b=la(String(b));return Ja(a,b)||La(a,b)}
-function La(a,b){var c=(a.currentStyle||a.style)[b];if(c!="inherit")return c!==undefined?c:null;return(c=U(a))?La(c,b):null}
-function Ma(a){if(l(a.getBBox))return a.getBBox();var b;if((Ja(a,"display")||(a.currentStyle?a.currentStyle.display:null)||a.style.display)!="none")b=new C(a.offsetWidth,a.offsetHeight);else{b=a.style;var c=b.display,d=b.visibility,f=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";var e;e=a.offsetWidth;a=a.offsetHeight;b.display=c;b.position=f;b.visibility=d;b=new C(e,a)}return b}
-function W(a,b){function c(e){if(V(e,"display")=="none")return false;e=U(e);return!e||c(e)}function d(e){var g=Ma(e);if(g.height>0&&g.width>0)return true;if(e.innerText||e.textContent)if(Na.test(e.innerText||e.textContent))return true;return A&&oa(e.childNodes,function(h){return S(h)&&d(h)})}if(!S(a))throw Error("Argument to isShown must be of type Element");if(S(a,"TITLE"))return(F(a)?F(a).parentWindow||F(a).defaultView:window)==Da;if(S(a,"OPTION")||S(a,"OPTGROUP")){var f=wa(a,function(e){return S(e,
-"SELECT")});return!!f&&W(f)}if(S(a,"MAP")){if(!a.name)return false;f=F(a);f=f.evaluate?P.d('/descendant::*[@usemap = "#'+a.name+'"]',f):ua(f,function(e){return S(e)&&T(e,"usemap")=="#"+a.name});return!!f&&W(f)}if(S(a,"AREA")){f=wa(a,function(e){return S(e,"MAP")});return!!f&&W(f)}if(S(a,"INPUT")&&a.type.toLowerCase()=="hidden")return false;if(V(a,"visibility")=="hidden")return false;if(!c(a))return false;if(!b&&Ra(a)==0)return false;if(!d(a))return false;return true}
-function Sa(a){var b=[];Ta(a,b);b=w(b,q);return q(b.join("\n"))}function Ta(a,b){if(S(a,"BR"))b.push("");else{var c=Ua(a);c&&b[b.length-1]&&b.push("");na(a.childNodes,function(d){if(d.nodeType==3){var f=U(d);if(f){W(f);if(f&&W(f)){d=d.nodeValue.replace(Va," ");f=b.pop()||"";var e=f.length-1;if(e>=0&&f.indexOf(" ",e)==e&&d.lastIndexOf(" ",0)==0)d=d.substr(1);b.push(f+d)}}}else S(d)&&Ta(d,b)});c&&b[b.length-1]&&b.push("")}}function Ua(a){a=V(a,"display");return a=="block"||a=="list-item"}
-var Wa="[\\s\\xa0"+String.fromCharCode(160)+"]+",Va=RegExp(Wa,"g"),Na=RegExp("^"+Wa+"$");function Ra(a){var b=1,c=V(a,"opacity");if(c)b=Number(c);if(a=U(a))b*=Ra(a);return b};var Xa={};Xa.d=function(a,b){var c=D(b),d=k(a)?c.g.getElementById(a):a;if(!d)return null;if(T(d,"id")==a&&H(b,d))return d;c=I(c,"*");return x(c,function(f){return T(f,"id")==a&&H(b,f)})};Xa.b=function(a,b){var c=I(D(b),"*",null,b);return v(c,function(d){return T(d,"id")==a})};var X={},Ya={};X.i=function(a,b,c){b=I(D(b),"A",null,b);return x(b,function(d){d=Sa(d);return c&&d.indexOf(a)!=-1||d==a})};X.h=function(a,b,c){b=I(D(b),"A",null,b);return v(b,function(d){d=Sa(d);return c&&d.indexOf(a)!=-1||d==a})};X.d=function(a,b){return X.i(a,b,false)};X.b=function(a,b){return X.h(a,b,false)};Ya.d=function(a,b){return X.i(a,b,true)};Ya.b=function(a,b){return X.h(a,b,true)};var Za={};Za.d=function(a,b){var c=I(D(b),"*",null,b);return x(c,function(d){return T(d,"name")==a})};Za.b=function(a,b){var c=I(D(b),"*",null,b);return v(c,function(d){return T(d,"name")==a})};var $a={};$a.d=function(a,b){return I(D(b),a,null,b)[0]||null};$a.b=function(a,b){return I(D(b),a,null,b)};var ab={className:N,css:O,id:Xa,linkText:X,name:Za,partialLinkText:Ya,tagName:$a,xpath:P};function bb(a,b){var c;a:{for(c in a)if(!Object.prototype[c]){c=c;break a}c=null}if(c){var d=ab[c];if(d&&l(d.b))return d.b(a[c],b||F(Da))}throw Error("Unsupported locator strategy: "+c);};function cb(a,b,c){var d={};d[a]=b;a=bb;c=[d,c];var f;try{if(k(a))a=new Function(a);var e=M(c),g=a.apply(null,e);f={status:0,value:L(g)}}catch(h){f={status:"code"in h?h.code:13,value:{message:h.message}}}e=[];J(new xa,f,e);return e.join("")}var Y="_".split("."),Z=i;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)if(!Y.length&&cb!==undefined)Z[$]=cb;else Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/get_attribute_value_android.js b/core/res/res/raw/get_attribute_value_android.js
deleted file mode 100644
index dc43fa7..0000000
--- a/core/res/res/raw/get_attribute_value_android.js
+++ /dev/null
@@ -1,26 +0,0 @@
-function(){return function(){var h,n=this;function p(){}
-function q(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
-else if(b=="function"&&typeof a.call=="undefined")return"object";return b}function aa(a){var b=q(a);return b=="array"||b=="object"&&typeof a.length=="number"}function r(a){return typeof a=="string"}function s(a){a=q(a);return a=="object"||a=="array"||a=="function"}function u(a){return a[ba]||(a[ba]=++ca)}var ba="closure_uid_"+Math.floor(Math.random()*2147483648).toString(36),ca=0,da=Date.now||function(){return+new Date};
-function v(a,b){function c(){}c.prototype=b.prototype;a.q=b.prototype;a.prototype=new c};function w(a){this.stack=Error().stack||"";if(a)this.message=String(a)}v(w,Error);w.prototype.name="CustomError";function ea(a,b,c){var d={};for(var e in a)if(b.call(c,a[e],e,a))d[e]=a[e];return d}function fa(a,b,c){var d={};for(var e in a)d[e]=b.call(c,a[e],e,a);return d}function ga(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function x(a,b){w.call(this,b);this.code=a;this.name=y[a]||y[13]}v(x,w);var y,ha={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},ia={};for(var ja in ha)ia[ha[ja]]=ja;y=ia;
-x.prototype.toString=function(){return"["+this.name+"] "+this.message};function ka(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a}function z(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")}
-function la(a,b){var c=0,d=z(String(a)).split("."),e=z(String(b)).split("."),f=Math.max(d.length,e.length);for(var g=0;c==0&&g<f;g++){var i=d[g]||"",l=e[g]||"",j=RegExp("(\\d*)(\\D*)","g"),t=RegExp("(\\d*)(\\D*)","g");do{var m=j.exec(i)||["","",""],k=t.exec(l)||["","",""];if(m[0].length==0&&k[0].length==0)break;c=A(m[1].length==0?0:parseInt(m[1],10),k[1].length==0?0:parseInt(k[1],10))||A(m[2].length==0,k[2].length==0)||A(m[2],k[2])}while(c==0)}return c}
-function A(a,b){if(a<b)return-1;else if(a>b)return 1;return 0};function B(a,b){b.unshift(a);w.call(this,ka.apply(null,b));b.shift();this.J=a}v(B,w);B.prototype.name="AssertionError";function C(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var e=c}throw new B(""+d,e||[]);}return a};var D=Array.prototype,E=D.indexOf?function(a,b,c){C(a.length!=null);return D.indexOf.call(a,b,c)}:function(a,b,c){c=c==null?0:c<0?Math.max(0,a.length+c):c;if(r(a)){if(!r(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(c=c;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},F=D.map?function(a,b,c){C(a.length!=null);return D.map.call(a,b,c)}:function(a,b,c){var d=a.length,e=Array(d),f=r(a)?a.split(""):a;for(var g=0;g<d;g++)if(g in f)e[g]=b.call(c,f[g],g,a);return e};var ma=n.navigator,na=(ma&&ma.platform||"").indexOf("Mac")!=-1,oa="",pa;if(pa=/WebKit\/(\S+)/){var qa=pa.exec(n.navigator?n.navigator.userAgent:null);oa=qa?qa[1]:""};var G="StopIteration"in n?n.StopIteration:Error("StopIteration");function ra(){}ra.prototype.next=function(){throw G;};function H(a,b,c,d,e){this.a=!!b;a&&I(this,a,d);this.h=e!=undefined?e:this.d||0;if(this.a)this.h*=-1;this.C=!c}v(H,ra);h=H.prototype;h.c=null;h.d=0;h.B=false;function I(a,b,c,d){if(a.c=b)a.d=typeof c=="number"?c:a.c.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.h=d}
-h.next=function(){var a;if(this.B){if(!this.c||this.C&&this.h==0)throw G;a=this.c;var b=this.a?-1:1;if(this.d==b){var c=this.a?a.lastChild:a.firstChild;c?I(this,c):I(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?I(this,c):I(this,a.parentNode,b*-1);this.h+=this.d*(this.a?-1:1)}else this.B=true;a=this.c;if(!this.c)throw G;return a};
-h.splice=function(){var a=this.c,b=this.a?1:-1;if(this.d==b){this.d=b*-1;this.h+=this.d*(this.a?-1:1)}this.a=!this.a;H.prototype.next.call(this);this.a=!this.a;b=aa(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function J(a,b,c,d){H.call(this,a,b,c,null,d)}v(J,H);J.prototype.next=function(){do J.q.next.call(this);while(this.d==-1);return this.c};var sa={"class":"className",readonly:"readOnly"},ta=["checked","disabled","draggable","hidden"],ua=["async","autofocus","autoplay","checked","compact","complete","controls","declare","defaultchecked","defaultselected","defer","disabled","draggable","ended","formnovalidate","hidden","indeterminate","iscontenteditable","ismap","itemscope","loop","multiple","muted","nohref","noresize","noshade","novalidate","nowrap","open","paused","pubdate","readonly","required","reversed","scoped","seamless","seeking",
-"selected","spellcheck","truespeed","willvalidate"];function va(a,b){if(8==a.nodeType)return null;b=b.toLowerCase();if(b=="style"){var c=z(a.style.cssText).toLowerCase();return c.charAt(c.length-1)==";"?c:c+";"}c=a.getAttributeNode(b);if(!c)return null;if(E(ua,b)>=0)return"true";return c.specified?c.value:null}String.fromCharCode(160);var K;var wa=[];function L(){if(xa)M[u(this)]=this}var xa=false,M={};L.prototype.t=false;L.prototype.k=function(){if(!this.t){this.t=true;this.g();if(xa){var a=u(this);if(!M.hasOwnProperty(a))throw Error(this+" did not call the goog.Disposable base constructor or was disposed of after a clearUndisposedObjects call");delete M[a]}}};L.prototype.g=function(){};function N(a,b){L.call(this);this.type=a;this.currentTarget=this.target=b}v(N,L);N.prototype.g=function(){delete this.type;delete this.target;delete this.currentTarget};N.prototype.p=false;N.prototype.G=true;new Function("a","return a");function O(a,b){a&&this.m(a,b)}v(O,N);h=O.prototype;h.target=null;h.relatedTarget=null;h.offsetX=0;h.offsetY=0;h.clientX=0;h.clientY=0;h.screenX=0;h.screenY=0;h.button=0;h.keyCode=0;h.charCode=0;h.ctrlKey=false;h.altKey=false;h.shiftKey=false;h.metaKey=false;h.F=false;h.u=null;
-h.m=function(a,b){var c=this.type=a.type;N.call(this,c);this.target=a.target||a.srcElement;this.currentTarget=b;var d=a.relatedTarget;if(!d)if(c=="mouseover")d=a.fromElement;else if(c=="mouseout")d=a.toElement;this.relatedTarget=d;this.offsetX=a.offsetX!==undefined?a.offsetX:a.layerX;this.offsetY=a.offsetY!==undefined?a.offsetY:a.layerY;this.clientX=a.clientX!==undefined?a.clientX:a.pageX;this.clientY=a.clientY!==undefined?a.clientY:a.pageY;this.screenX=a.screenX||0;this.screenY=a.screenY||0;this.button=
-a.button;this.keyCode=a.keyCode||0;this.charCode=a.charCode||(c=="keypress"?a.keyCode:0);this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=a.metaKey;this.F=na?a.metaKey:a.ctrlKey;this.H=a.H;this.u=a;delete this.G;delete this.p};h.g=function(){O.q.g.call(this);this.relatedTarget=this.currentTarget=this.target=this.u=null};function ya(){}var za=0;h=ya.prototype;h.key=0;h.j=false;h.r=false;h.m=function(a,b,c,d,e,f){if(q(a)=="function")this.v=true;else if(a&&a.handleEvent&&q(a.handleEvent)=="function")this.v=false;else throw Error("Invalid listener argument");this.n=a;this.A=b;this.src=c;this.type=d;this.capture=!!e;this.D=f;this.r=false;this.key=++za;this.j=false};h.handleEvent=function(a){if(this.v)return this.n.call(this.D||this.src,a);return this.n.handleEvent.call(this.n,a)};function P(a,b){L.call(this);this.w=b;this.e=[];if(a>this.w)throw Error("[goog.structs.SimplePool] Initial cannot be greater than max");for(var c=0;c<a;c++)this.e.push(this.b?this.b():{})}v(P,L);P.prototype.b=null;P.prototype.s=null;function Aa(a){if(a.e.length)return a.e.pop();return a.b?a.b():{}}function Q(a,b){a.e.length<a.w?a.e.push(b):Ba(a,b)}function Ba(a,b){if(a.s)a.s(b);else if(s(b))if(q(b.k)=="function")b.k();else for(var c in b)delete b[c]}
-P.prototype.g=function(){P.q.g.call(this);for(var a=this.e;a.length;)Ba(this,a.pop());delete this.e};var Ca;var Da=(Ca="ScriptEngine"in n&&n.ScriptEngine()=="JScript")?n.ScriptEngineMajorVersion()+"."+n.ScriptEngineMinorVersion()+"."+n.ScriptEngineBuildVersion():"0";var R,S,T,Ea,Fa,Ga,Ha,Ia;
-(function(){function a(){return{f:0,i:0}}function b(){return[]}function c(){function k(o){return g.call(k.src,k.key,o)}return k}function d(){return new ya}function e(){return new O}var f=Ca&&!(la(Da,"5.7")>=0),g;Ea=function(k){g=k};if(f){R=function(k){Q(i,k)};S=function(){return Aa(l)};T=function(k){Q(l,k)};Fa=function(){Q(j,c())};Ga=function(k){Q(t,k)};Ha=function(){return Aa(m)};Ia=function(k){Q(m,k)};var i=new P(0,600);i.b=a;var l=new P(0,600);l.b=b;var j=new P(0,600);j.b=c;var t=new P(0,600);
-t.b=d;var m=new P(0,600);m.b=e}else{R=p;S=b;Ga=Fa=T=p;Ha=e;Ia=p}})();var U={},V={},Ja={},Ka={};function La(a,b,c,d){if(!d.l)if(d.z){var e=0;for(var f=0;e<d.length;e++)if(d[e].j){var g=d[e].A;g.src=null;Fa(g);Ga(d[e])}else{if(e!=f)d[f]=d[e];f++}d.length=f;d.z=false;if(f==0){T(d);delete V[a][b][c];V[a][b].f--;if(V[a][b].f==0){R(V[a][b]);delete V[a][b];V[a].f--}if(V[a].f==0){R(V[a]);delete V[a]}}}}function Ma(a){if(a in Ka)return Ka[a];return Ka[a]="on"+a}
-function Na(a,b,c,d,e){var f=1;b=u(b);if(a[b]){a.i--;a=a[b];if(a.l)a.l++;else a.l=1;try{var g=a.length;for(var i=0;i<g;i++){var l=a[i];if(l&&!l.j)f&=Oa(l,e)!==false}}finally{a.l--;La(c,d,b,a)}}return Boolean(f)}
-function Oa(a,b){var c=a.handleEvent(b);if(a.r){var d=a.key;if(U[d]){var e=U[d];if(!e.j){var f=e.src,g=e.type,i=e.A,l=e.capture;if(f.removeEventListener){if(f==n||!f.I)f.removeEventListener(g,i,l)}else f.detachEvent&&f.detachEvent(Ma(g),i);f=u(f);i=V[g][l][f];if(Ja[f]){var j=Ja[f],t=E(j,e);if(t>=0){C(j.length!=null);D.splice.call(j,t,1)}j.length==0&&delete Ja[f]}e.j=true;i.z=true;La(g,l,f,i);delete U[d]}}}return c}
-function W(a,b){if(!U[a])return true;var c=U[a],d=c.type,e=V;if(!(d in e))return true;e=e[d];var f,g;if(K===undefined)K=false;if(K){var i;if(!(i=b))a:{i="window.event".split(".");var l=n;for(;f=i.shift();)if(l[f]!=null)l=l[f];else{i=null;break a}i=l}f=i;i=true in e;l=false in e;if(i){if(f.keyCode<0||f.returnValue!=undefined)return true;a:{var j=false;if(f.keyCode==0)try{f.keyCode=-1;break a}catch(t){j=true}if(j||f.returnValue==undefined)f.returnValue=true}}j=Ha();j.m(f,this);f=true;try{if(i){var m=
-S();for(var k=j.currentTarget;k;k=k.parentNode)m.push(k);g=e[true];g.i=g.f;for(var o=m.length-1;!j.p&&o>=0&&g.i;o--){j.currentTarget=m[o];f&=Na(g,m[o],d,true,j)}if(l){g=e[false];g.i=g.f;for(o=0;!j.p&&o<m.length&&g.i;o++){j.currentTarget=m[o];f&=Na(g,m[o],d,false,j)}}}else f=Oa(c,j)}finally{if(m){m.length=0;T(m)}j.k();Ia(j)}return f}d=new O(b,this);try{f=Oa(c,d)}finally{d.k()}return f}Ea(W);wa[wa.length]=function(a){W=a(W);Ea(W)};function Pa(){}
-function Qa(a,b,c){switch(typeof b){case "string":Ra(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(q(b)=="array"){var d=b.length;c.push("[");var e="";for(var f=0;f<d;f++){c.push(e);Qa(a,b[f],c);e=","}c.push("]");break}c.push("{");d="";for(e in b)if(Object.prototype.hasOwnProperty.call(b,e)){f=b[e];if(typeof f!="function"){c.push(d);Ra(a,e,c);c.push(":");
-Qa(a,f,c);d=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var Sa={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},Ta=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function Ra(a,b,c){c.push('"',b.replace(Ta,function(d){if(d in Sa)return Sa[d];var e=d.charCodeAt(0),f="\\u";if(e<16)f+="000";else if(e<256)f+="00";else if(e<4096)f+="0";return Sa[d]=f+e.toString(16)}),'"')};function X(a){switch(q(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return F(a,X);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=Ua(a);return b}if(aa(a))return F(a,X);a=ea(a,function(c,d){return typeof d=="number"||r(d)});return fa(a,X);default:return null}}
-function Va(a,b){if(q(a)=="array")return F(a,function(c){return Va(c,b)});else if(s(a))return"ELEMENT"in a?Wa(a.ELEMENT,b):fa(a,function(c){return Va(c,b)});return a}function Xa(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.o=da()}if(!b.o)b.o=da();return b}function Ua(a){var b=Xa(a.ownerDocument),c=ga(b,function(d){return d==a});if(!c){c=":wdc:"+b.o++;b[c]=a}return c}
-function Wa(a,b){a=decodeURIComponent(a);var c=b||document,d=Xa(c);if(!(a in d))throw new x(10,"Element does not exist in cache");var e=d[a];for(var f=e;f;){if(f==c.documentElement)return e;f=f.parentNode}delete d[a];throw new x(10,"Element is no longer attached to the DOM");};var Ya=["checkbox","radio"];function Za(a){var b=a.tagName.toUpperCase();if(b=="OPTION")return true;if(b=="INPUT")if(E(Ya,a.type)>=0)return true;return false}
-function $a(a,b){var c=null;c=b.toLowerCase();if("style"==b.toLowerCase()){if((c=a.style)&&!r(c))c=c.cssText;return c}if("selected"==c||"checked"==c&&Za(a)){var d;if(Za(a)){d="selected";var e=a.type&&a.type.toLowerCase();if("checkbox"==e||"radio"==e)d="checked";d=!!a[d]}else d=false;return d?"true":null}var f=a.tagName&&"A"==a.tagName.toUpperCase(),g=a.tagName&&"IMG"==a.tagName.toUpperCase();try{e=sa[b]||b;var i=a[e];d=i===undefined&&E(ta,e)>=0?false:i}catch(l){}c=c=="href"&&f||c=="src"&&g||d==null||
-s(d)?va(a,b):d;return c!=null?c.toString():null};function ab(a,b){var c=$a,d=[a,b],e;try{if(r(c))c=new Function(c);var f=Va(d),g=c.apply(null,f);e={status:0,value:X(g)}}catch(i){e={status:"code"in i?i.code:13,value:{message:i.message}}}c=[];Qa(new Pa,e,c);return c.join("")}var Y="_".split("."),Z=n;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)if(!Y.length&&ab!==undefined)Z[$]=ab;else Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/get_size_android.js b/core/res/res/raw/get_size_android.js
deleted file mode 100644
index 54c2678..0000000
--- a/core/res/res/raw/get_size_android.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function(){return function(){function g(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
-else if(b=="function"&&typeof a.call=="undefined")return"object";return b}function h(a){var b=g(a);return b=="array"||b=="object"&&typeof a.length=="number"}function i(a){a=g(a);return a=="object"||a=="array"||a=="function"}Math.floor(Math.random()*2147483648).toString(36);var j=Date.now||function(){return+new Date};function l(a,b){function c(){}c.prototype=b.prototype;a.h=b.prototype;a.prototype=new c};function m(a){this.stack=Error().stack||"";if(a)this.message=String(a)}l(m,Error);m.prototype.name="CustomError";function n(a,b,c){var d={};for(var e in a)if(b.call(c,a[e],e,a))d[e]=a[e];return d}function o(a,b,c){var d={};for(var e in a)d[e]=b.call(c,a[e],e,a);return d}function p(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function q(a,b){m.call(this,b);this.code=a;this.name=r[a]||r[13]}l(q,m);var r,s={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},t={};for(var u in s)t[s[u]]=u;r=t;
-q.prototype.toString=function(){return"["+this.name+"] "+this.message};function v(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a};function w(a,b){b.unshift(a);m.call(this,v.apply(null,b));b.shift();this.i=a}l(w,m);w.prototype.name="AssertionError";function x(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var e=c}throw new w(""+d,e||[]);}return a};var y=Array.prototype,z=y.map?function(a,b,c){x(a.length!=null);return y.map.call(a,b,c)}:function(a,b,c){var d=a.length,e=Array(d),f=typeof a=="string"?a.split(""):a;for(var k=0;k<d;k++)if(k in f)e[k]=b.call(c,f[k],k,a);return e};var A="",B;if(B=/WebKit\/(\S+)/){var C=B.exec(this.navigator?this.navigator.userAgent:null);A=C?C[1]:""};function D(a,b){this.width=a;this.height=b}D.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};D.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};var E="StopIteration"in this?this.StopIteration:Error("StopIteration");function F(){}F.prototype.next=function(){throw E;};function G(a,b,c,d,e){this.a=!!b;a&&H(this,a,d);this.d=e!=undefined?e:this.c||0;if(this.a)this.d*=-1;this.f=!c}l(G,F);G.prototype.b=null;G.prototype.c=0;G.prototype.e=false;function H(a,b,c,d){if(a.b=b)a.c=typeof c=="number"?c:a.b.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.d=d}
-G.prototype.next=function(){var a;if(this.e){if(!this.b||this.f&&this.d==0)throw E;a=this.b;var b=this.a?-1:1;if(this.c==b){var c=this.a?a.lastChild:a.firstChild;c?H(this,c):H(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?H(this,c):H(this,a.parentNode,b*-1);this.d+=this.c*(this.a?-1:1)}else this.e=true;a=this.b;if(!this.b)throw E;return a};
-G.prototype.splice=function(){var a=this.b,b=this.a?1:-1;if(this.c==b){this.c=b*-1;this.d+=this.c*(this.a?-1:1)}this.a=!this.a;G.prototype.next.call(this);this.a=!this.a;b=h(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function I(a,b,c,d){G.call(this,a,b,c,null,d)}l(I,G);I.prototype.next=function(){do I.h.next.call(this);while(this.c==-1);return this.b};function J(a){if(g(a.getBBox)=="function")return a.getBBox();var b;b:{b=a.nodeType==9?a:a.ownerDocument||a.document;if(b.defaultView&&b.defaultView.getComputedStyle)if(b=b.defaultView.getComputedStyle(a,null)){b=b.display||b.getPropertyValue("display");break b}b=""}if((b||(a.currentStyle?a.currentStyle.display:null)||a.style.display)!="none")a=new D(a.offsetWidth,a.offsetHeight);else{b=a.style;var c=b.display,d=b.visibility,e=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";
-var f;f=a.offsetWidth;a=a.offsetHeight;b.display=c;b.position=e;b.visibility=d;a=new D(f,a)}return a}String.fromCharCode(160);function K(){}
-function L(a,b,c){switch(typeof b){case "string":M(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(g(b)=="array"){var d=b.length;c.push("[");var e="";for(var f=0;f<d;f++){c.push(e);L(a,b[f],c);e=","}c.push("]");break}c.push("{");d="";for(e in b)if(Object.prototype.hasOwnProperty.call(b,e)){f=b[e];if(typeof f!="function"){c.push(d);M(a,e,c);c.push(":");L(a,
-f,c);d=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var N={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},O=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function M(a,b,c){c.push('"',b.replace(O,function(d){if(d in N)return N[d];var e=d.charCodeAt(0),f="\\u";if(e<16)f+="000";else if(e<256)f+="00";else if(e<4096)f+="0";return N[d]=f+e.toString(16)}),'"')};function P(a){switch(g(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return z(a,P);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=Q(a);return b}if(h(a))return z(a,P);a=n(a,function(c,d){return typeof d=="number"||typeof d=="string"});return o(a,P);default:return null}}
-function R(a,b){if(g(a)=="array")return z(a,function(c){return R(c,b)});else if(i(a))return"ELEMENT"in a?S(a.ELEMENT,b):o(a,function(c){return R(c,b)});return a}function T(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.g=j()}return b}function Q(a){var b=T(a.ownerDocument),c=p(b,function(d){return d==a});if(!c){c=":wdc:"+b.g++;b[c]=a}return c}
-function S(a,b){a=decodeURIComponent(a);var c=b||document,d=T(c);if(!(a in d))throw new q(10,"Element does not exist in cache");var e=d[a];for(var f=e;f;){if(f==c.documentElement)return e;f=f.parentNode}delete d[a];throw new q(10,"Element is no longer attached to the DOM");};function U(a){var b=J;a=[a];var c;try{if(typeof b=="string")b=new Function(b);var d=R(a),e=b.apply(null,d);c={status:0,value:P(e)}}catch(f){c={status:"code"in f?f.code:13,value:{message:f.message}}}b=[];L(new K,c,b);return b.join("")}var V="_".split("."),W=this;!(V[0]in W)&&W.execScript&&W.execScript("var "+V[0]);for(var X;V.length&&(X=V.shift());)if(!V.length&&U!==undefined)W[X]=U;else W=W[X]?W[X]:W[X]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/get_text_android.js b/core/res/res/raw/get_text_android.js
deleted file mode 100644
index f74cb37..0000000
--- a/core/res/res/raw/get_text_android.js
+++ /dev/null
@@ -1,21 +0,0 @@
-function(){return function(){var g=this;
-function i(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if(b==
-"function"&&typeof a.call=="undefined")return"object";return b}function j(a){var b=i(a);return b=="array"||b=="object"&&typeof a.length=="number"}function k(a){return typeof a=="string"}function aa(a){a=i(a);return a=="object"||a=="array"||a=="function"}Math.floor(Math.random()*2147483648).toString(36);var ba=Date.now||function(){return+new Date};function l(a,b){function c(){}c.prototype=b.prototype;a.i=b.prototype;a.prototype=new c};var ca=window;function da(){var a=g.Components;if(!a)return false;try{a.j["@mozilla.org/uuid-generator;1"].k(a.g.n);return true}catch(b){return false}};function m(a){this.stack=Error().stack||"";if(a)this.message=String(a)}l(m,Error);m.prototype.name="CustomError";function ea(a,b,c){var d={};for(var f in a)if(b.call(c,a[f],f,a))d[f]=a[f];return d}function n(a,b,c){var d={};for(var f in a)d[f]=b.call(c,a[f],f,a);return d}function fa(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function o(a,b){m.call(this,b);this.code=a;this.name=p[a]||p[13]}l(o,m);var p,r={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},s={};for(var t in r)s[r[t]]=t;p=s;
-o.prototype.toString=function(){return"["+this.name+"] "+this.message};function ga(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a}function u(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")}var v={};function ha(a){return v[a]||(v[a]=String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()}))};function w(a,b){b.unshift(a);m.call(this,ga.apply(null,b));b.shift();this.l=a}l(w,m);w.prototype.name="AssertionError";function x(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var f=c}throw new w(""+d,f||[]);}return a};var y=Array.prototype,ia=y.indexOf?function(a,b,c){x(a.length!=null);return y.indexOf.call(a,b,c)}:function(a,b,c){c=c==null?0:c<0?Math.max(0,a.length+c):c;if(k(a)){if(!k(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(c=c;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},ja=y.forEach?function(a,b,c){x(a.length!=null);y.forEach.call(a,b,c)}:function(a,b,c){var d=a.length,f=k(a)?a.split(""):a;for(var e=0;e<d;e++)e in f&&b.call(c,f[e],e,a)},z=y.map?function(a,b,c){x(a.length!=null);return y.map.call(a,
-b,c)}:function(a,b,c){var d=a.length,f=Array(d),e=k(a)?a.split(""):a;for(var h=0;h<d;h++)if(h in e)f[h]=b.call(c,e[h],h,a);return f},ka=y.some?function(a,b,c){x(a.length!=null);return y.some.call(a,b,c)}:function(a,b,c){var d=a.length,f=k(a)?a.split(""):a;for(var e=0;e<d;e++)if(e in f&&b.call(c,f[e],e,a))return true;return false};var A=true,la="",B;if(A)B=/WebKit\/(\S+)/;if(B){var C=B.exec(g.navigator?g.navigator.userAgent:null);la=C?C[1]:""};function D(a,b){this.width=a;this.height=b}D.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};D.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};function E(a){return a.nodeType==9?a:a.ownerDocument||a.document}function ma(a,b){var c=[];return F(a,b,c,true)?c[0]:undefined}function F(a,b,c,d){if(a!=null){var f=0;for(var e;e=a.childNodes[f];f++){if(b(e)){c.push(e);if(d)return true}if(F(e,b,c,d))return true}}return false}function G(a,b,c,d){if(!c)a=a.parentNode;c=d==null;for(var f=0;a&&(c||f<=d);){if(b(a))return a;a=a.parentNode;f++}return null};function na(a,b){var c=function(d,f){var e=E(d);if(d.selectSingleNode){e.setProperty&&e.setProperty("SelectionLanguage","XPath");return d.selectSingleNode(f)}else if(e.implementation.hasFeature("XPath","3.0")){var h=e.createNSResolver(e.documentElement),q;if(typeof XPathResult!="undefined")q=XPathResult.FIRST_ORDERED_NODE_TYPE;else{if(!da())throw Error("Document claims it supports XPath yet XPathResult is not defined. Please report this to Selenium developers");q=Components.g.m.FIRST_ORDERED_NODE_TYPE}return e.evaluate(f,
-d,h,q,null).singleNodeValue}return null}(b,a);if(!c)return null;if(c.nodeType!=1)throw Error("Returned node is not an element: "+a);return c};var H="StopIteration"in g?g.StopIteration:Error("StopIteration");function I(){}I.prototype.next=function(){throw H;};function J(a,b,c,d,f){this.a=!!b;a&&K(this,a,d);this.d=f!=undefined?f:this.c||0;if(this.a)this.d*=-1;this.f=!c}l(J,I);J.prototype.b=null;J.prototype.c=0;J.prototype.e=false;function K(a,b,c,d){if(a.b=b)a.c=typeof c=="number"?c:a.b.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.d=d}
-J.prototype.next=function(){var a;if(this.e){if(!this.b||this.f&&this.d==0)throw H;a=this.b;var b=this.a?-1:1;if(this.c==b){var c=this.a?a.lastChild:a.firstChild;c?K(this,c):K(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?K(this,c):K(this,a.parentNode,b*-1);this.d+=this.c*(this.a?-1:1)}else this.e=true;a=this.b;if(!this.b)throw H;return a};
-J.prototype.splice=function(){var a=this.b,b=this.a?1:-1;if(this.c==b){this.c=b*-1;this.d+=this.c*(this.a?-1:1)}this.a=!this.a;J.prototype.next.call(this);this.a=!this.a;b=j(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function L(a,b,c,d){J.call(this,a,b,c,null,d)}l(L,J);L.prototype.next=function(){do L.i.next.call(this);while(this.c==-1);return this.b};function M(a,b){var c=E(a);if(c.defaultView&&c.defaultView.getComputedStyle)if(c=c.defaultView.getComputedStyle(a,null))return c[b]||c.getPropertyValue(b);return""};function N(a,b){return!!a&&a.nodeType==1&&(!b||a.tagName.toUpperCase()==b)}
-var oa=["async","autofocus","autoplay","checked","compact","complete","controls","declare","defaultchecked","defaultselected","defer","disabled","draggable","ended","formnovalidate","hidden","indeterminate","iscontenteditable","ismap","itemscope","loop","multiple","muted","nohref","noresize","noshade","novalidate","nowrap","open","paused","pubdate","readonly","required","reversed","scoped","seamless","seeking","selected","spellcheck","truespeed","willvalidate"];
-function pa(a,b){if(8==a.nodeType)return null;b=b.toLowerCase();if(b=="style"){var c=u(a.style.cssText).toLowerCase();return c.charAt(c.length-1)==";"?c:c+";"}c=a.getAttributeNode(b);if(!c)return null;if(ia(oa,b)>=0)return"true";return c.specified?c.value:null}function O(a){for(a=a.parentNode;a&&a.nodeType!=1&&a.nodeType!=9&&a.nodeType!=11;)a=a.parentNode;return N(a)?a:null}function P(a,b){b=ha(String(b));return M(a,b)||Q(a,b)}
-function Q(a,b){var c=(a.currentStyle||a.style)[b];if(c!="inherit")return c!==undefined?c:null;return(c=O(a))?Q(c,b):null}
-function qa(a){if(i(a.getBBox)=="function")return a.getBBox();var b;if((M(a,"display")||(a.currentStyle?a.currentStyle.display:null)||a.style.display)!="none")b=new D(a.offsetWidth,a.offsetHeight);else{b=a.style;var c=b.display,d=b.visibility,f=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";var e;e=a.offsetWidth;a=a.offsetHeight;b.display=c;b.position=f;b.visibility=d;b=new D(e,a)}return b}
-function R(a,b){function c(e){if(P(e,"display")=="none")return false;e=O(e);return!e||c(e)}function d(e){var h=qa(e);if(h.height>0&&h.width>0)return true;if(e.innerText||e.textContent)if(ra.test(e.innerText||e.textContent))return true;return A&&ka(e.childNodes,function(q){return N(q)&&d(q)})}if(!N(a))throw Error("Argument to isShown must be of type Element");if(N(a,"TITLE"))return(E(a)?E(a).parentWindow||E(a).defaultView:window)==ca;if(N(a,"OPTION")||N(a,"OPTGROUP")){var f=G(a,function(e){return N(e,
-"SELECT")});return!!f&&R(f)}if(N(a,"MAP")){if(!a.name)return false;f=E(a);f=f.evaluate?na('/descendant::*[@usemap = "#'+a.name+'"]',f):ma(f,function(e){return N(e)&&pa(e,"usemap")=="#"+a.name});return!!f&&R(f)}if(N(a,"AREA")){f=G(a,function(e){return N(e,"MAP")});return!!f&&R(f)}if(N(a,"INPUT")&&a.type.toLowerCase()=="hidden")return false;if(P(a,"visibility")=="hidden")return false;if(!c(a))return false;if(!b&&S(a)==0)return false;if(!d(a))return false;return true}
-function sa(a){var b=[];T(a,b);b=z(b,u);return u(b.join("\n"))}function T(a,b){if(N(a,"BR"))b.push("");else{var c=ta(a);c&&b[b.length-1]&&b.push("");ja(a.childNodes,function(d){if(d.nodeType==3){var f=O(d);if(f){R(f);if(f&&R(f)){d=d.nodeValue.replace(ua," ");f=b.pop()||"";var e=f.length-1;if(e>=0&&f.indexOf(" ",e)==e&&d.lastIndexOf(" ",0)==0)d=d.substr(1);b.push(f+d)}}}else N(d)&&T(d,b)});c&&b[b.length-1]&&b.push("")}}function ta(a){a=P(a,"display");return a=="block"||a=="list-item"}
-var va="[\\s\\xa0"+String.fromCharCode(160)+"]+",ua=RegExp(va,"g"),ra=RegExp("^"+va+"$");function S(a){var b=1,c=P(a,"opacity");if(c)b=Number(c);if(a=O(a))b*=S(a);return b};function wa(){}
-function U(a,b,c){switch(typeof b){case "string":xa(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(i(b)=="array"){var d=b.length;c.push("[");var f="";for(var e=0;e<d;e++){c.push(f);U(a,b[e],c);f=","}c.push("]");break}c.push("{");d="";for(f in b)if(Object.prototype.hasOwnProperty.call(b,f)){e=b[f];if(typeof e!="function"){c.push(d);xa(a,f,c);c.push(":");U(a,
-e,c);d=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var V={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},ya=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function xa(a,b,c){c.push('"',b.replace(ya,function(d){if(d in V)return V[d];var f=d.charCodeAt(0),e="\\u";if(f<16)e+="000";else if(f<256)e+="00";else if(f<4096)e+="0";return V[d]=e+f.toString(16)}),'"')};function W(a){switch(i(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return z(a,W);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=za(a);return b}if(j(a))return z(a,W);a=ea(a,function(c,d){return typeof d=="number"||k(d)});return n(a,W);default:return null}}
-function X(a,b){if(i(a)=="array")return z(a,function(c){return X(c,b)});else if(aa(a))return"ELEMENT"in a?Aa(a.ELEMENT,b):n(a,function(c){return X(c,b)});return a}function Ba(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.h=ba()}return b}function za(a){var b=Ba(a.ownerDocument),c=fa(b,function(d){return d==a});if(!c){c=":wdc:"+b.h++;b[c]=a}return c}
-function Aa(a,b){a=decodeURIComponent(a);var c=b||document,d=Ba(c);if(!(a in d))throw new o(10,"Element does not exist in cache");var f=d[a];for(var e=f;e;){if(e==c.documentElement)return f;e=e.parentNode}delete d[a];throw new o(10,"Element is no longer attached to the DOM");};function Ca(a){var b=sa;a=[a];var c;try{if(k(b))b=new Function(b);var d=X(a),f=b.apply(null,d);c={status:0,value:W(f)}}catch(e){c={status:"code"in e?e.code:13,value:{message:e.message}}}b=[];U(new wa,c,b);return b.join("")}var Y="_".split("."),Z=g;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)if(!Y.length&&Ca!==undefined)Z[$]=Ca;else Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/get_top_left_coordinates_android.js b/core/res/res/raw/get_top_left_coordinates_android.js
deleted file mode 100644
index 398f204..0000000
--- a/core/res/res/raw/get_top_left_coordinates_android.js
+++ /dev/null
@@ -1,18 +0,0 @@
-function(){return function(){var h=this;
-function j(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if(b==
-"function"&&typeof a.call=="undefined")return"object";return b}function l(a){var b=j(a);return b=="array"||b=="object"&&typeof a.length=="number"}function aa(a){a=j(a);return a=="object"||a=="array"||a=="function"}Math.floor(Math.random()*2147483648).toString(36);var ba=Date.now||function(){return+new Date};function m(a,b){function c(){}c.prototype=b.prototype;a.j=b.prototype;a.prototype=new c};function n(a){this.stack=Error().stack||"";if(a)this.message=String(a)}m(n,Error);n.prototype.name="CustomError";function ca(a,b,c){var d={};for(var f in a)if(b.call(c,a[f],f,a))d[f]=a[f];return d}function o(a,b,c){var d={};for(var f in a)d[f]=b.call(c,a[f],f,a);return d}function da(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function p(a,b){n.call(this,b);this.code=a;this.name=q[a]||q[13]}m(p,n);var q,r={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},s={};for(var t in r)s[r[t]]=t;q=s;
-p.prototype.toString=function(){return"["+this.name+"] "+this.message};function ea(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a}function y(a,b){if(a<b)return-1;else if(a>b)return 1;return 0};function z(a,b){b.unshift(a);n.call(this,ea.apply(null,b));b.shift();this.k=a}m(z,n);z.prototype.name="AssertionError";function fa(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var f=c}throw new z(""+d,f||[]);}return a};var A=Array.prototype,B=A.map?function(a,b,c){fa(a.length!=null);return A.map.call(a,b,c)}:function(a,b,c){var d=a.length,f=Array(d),e=typeof a=="string"?a.split(""):a;for(var g=0;g<d;g++)if(g in e)f[g]=b.call(c,e[g],g,a);return f};var C,F="",G;if(G=/WebKit\/(\S+)/){var H=G.exec(h.navigator?h.navigator.userAgent:null);F=H?H[1]:""}C=F;var ga={};var ha;function I(a,b){this.x=a!==undefined?a:0;this.y=b!==undefined?b:0}I.prototype.toString=function(){return"("+this.x+", "+this.y+")"};function J(a,b){this.width=a;this.height=b}J.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};J.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};function K(a){return a?new ia(L(a)):ha||(ha=new ia)}function L(a){return a.nodeType==9?a:a.ownerDocument||a.document}function ia(a){this.e=a||h.document||document}function ja(a){a=a.e.body;return new I(a.scrollLeft,a.scrollTop)};var M="StopIteration"in h?h.StopIteration:Error("StopIteration");function ka(){}ka.prototype.next=function(){throw M;};function N(a,b,c,d,f){this.a=!!b;a&&O(this,a,d);this.d=f!=undefined?f:this.c||0;if(this.a)this.d*=-1;this.h=!c}m(N,ka);N.prototype.b=null;N.prototype.c=0;N.prototype.g=false;function O(a,b,c,d){if(a.b=b)a.c=typeof c=="number"?c:a.b.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.d=d}
-N.prototype.next=function(){var a;if(this.g){if(!this.b||this.h&&this.d==0)throw M;a=this.b;var b=this.a?-1:1;if(this.c==b){var c=this.a?a.lastChild:a.firstChild;c?O(this,c):O(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?O(this,c):O(this,a.parentNode,b*-1);this.d+=this.c*(this.a?-1:1)}else this.g=true;a=this.b;if(!this.b)throw M;return a};
-N.prototype.splice=function(){var a=this.b,b=this.a?1:-1;if(this.c==b){this.c=b*-1;this.d+=this.c*(this.a?-1:1)}this.a=!this.a;N.prototype.next.call(this);this.a=!this.a;b=l(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function P(a,b,c,d){N.call(this,a,b,c,null,d)}m(P,N);P.prototype.next=function(){do P.j.next.call(this);while(this.c==-1);return this.b};function la(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d}la.prototype.toString=function(){return"("+this.top+"t, "+this.right+"r, "+this.bottom+"b, "+this.left+"l)"};function Q(a,b,c,d){this.left=a;this.top=b;this.width=c;this.height=d}Q.prototype.toString=function(){return"("+this.left+", "+this.top+" - "+this.width+"w x "+this.height+"h)"};function R(a,b){var c=L(a);if(c.defaultView&&c.defaultView.getComputedStyle)if(c=c.defaultView.getComputedStyle(a,null))return c[b]||c.getPropertyValue(b);return""}function S(a,b){return R(a,b)||(a.currentStyle?a.currentStyle[b]:null)||a.style[b]}
-function ma(a){var b=L(a),c=S(a,"position"),d=c=="fixed"||c=="absolute";for(a=a.parentNode;a&&a!=b;a=a.parentNode){c=S(a,"position");d=d&&c=="static"&&a!=b.documentElement&&a!=b.body;if(!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||c=="fixed"||c=="absolute"))return a}return null}
-function T(a){var b=L(a),c=S(a,"position"),d=new I(0,0),f=(b?b.nodeType==9?b:L(b):document).documentElement;if(a==f)return d;if(a.getBoundingClientRect){a=a.getBoundingClientRect();b=ja(K(b));d.x=a.left+b.x;d.y=a.top+b.y}else if(b.getBoxObjectFor){a=b.getBoxObjectFor(a);b=b.getBoxObjectFor(f);d.x=a.screenX-b.screenX;d.y=a.screenY-b.screenY}else{var e=a;do{d.x+=e.offsetLeft;d.y+=e.offsetTop;if(e!=a){d.x+=e.clientLeft||0;d.y+=e.clientTop||0}if(S(e,"position")=="fixed"){d.x+=b.body.scrollLeft;d.y+=b.body.scrollTop;
-break}e=e.offsetParent}while(e&&e!=a);if(c=="absolute")d.y-=b.body.offsetTop;for(e=a;(e=ma(e))&&e!=b.body&&e!=f;){d.x-=e.scrollLeft;d.y-=e.scrollTop}}return d};String.fromCharCode(160);function na(a,b){b.scrollLeft+=Math.min(a.left,Math.max(a.left-a.width,0));b.scrollTop+=Math.min(a.top,Math.max(a.top-a.height,0))}
-function oa(a,b){var c;c=b?new Q(b.left,b.top,b.width,b.height):new Q(0,0,a.offsetWidth,a.offsetHeight);var d=L(a);for(var f=a.parentNode;f&&f!=d.body&&f!=d.documentElement;){var e=c,g=f,u=T(a),v=T(g),i=void 0;i=void 0;var k=void 0,D=void 0,E=void 0;E=R(g,"borderLeftWidth");D=R(g,"borderRightWidth");k=R(g,"borderTopWidth");i=R(g,"borderBottomWidth");i=new la(parseFloat(k),parseFloat(D),parseFloat(i),parseFloat(E));na(new Q(u.x+e.left-v.x-i.left,u.y+e.top-v.y-i.top,g.clientWidth-e.width,g.clientHeight-
-e.height),g);f=f.parentNode}f=T(a);e=K(d);e=(e.e.parentWindow||e.e.defaultView||window).document;if(!ga["500"]){g=0;u=String(C).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split(".");v=String("500").replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split(".");i=Math.max(u.length,v.length);for(k=0;g==0&&k<i;k++){D=u[k]||"";E=v[k]||"";var sa=RegExp("(\\d*)(\\D*)","g"),ta=RegExp("(\\d*)(\\D*)","g");do{var w=sa.exec(D)||["","",""],x=ta.exec(E)||["","",""];if(w[0].length==0&&x[0].length==0)break;g=y(w[1].length==0?0:parseInt(w[1],
-10),x[1].length==0?0:parseInt(x[1],10))||y(w[2].length==0,x[2].length==0)||y(w[2],x[2])}while(g==0)}ga["500"]=g>=0}e=e.compatMode=="CSS1Compat"?e.documentElement:e.body;e=new J(e.clientWidth,e.clientHeight);na(new Q(f.x+c.left-d.body.scrollLeft,f.y+c.top-d.body.scrollTop,e.width-c.width,e.height-c.height),d.body);d=new I;if(a.nodeType==1)if(a.getBoundingClientRect){f=a.getBoundingClientRect();d.x=f.left;d.y=f.top}else{f=ja(K(a));e=T(a);d.x=e.x-f.x;d.y=e.y-f.y}else{f=j(a.f)=="function";e=a;if(a.targetTouches)e=
-a.targetTouches[0];else if(f&&a.f().targetTouches)e=a.f().targetTouches[0];d.x=e.clientX;d.y=e.clientY}return new I(d.x+c.left,d.y+c.top)};function pa(){}
-function U(a,b,c){switch(typeof b){case "string":qa(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(j(b)=="array"){var d=b.length;c.push("[");var f="";for(var e=0;e<d;e++){c.push(f);U(a,b[e],c);f=","}c.push("]");break}c.push("{");d="";for(f in b)if(Object.prototype.hasOwnProperty.call(b,f)){e=b[f];if(typeof e!="function"){c.push(d);qa(a,f,c);c.push(":");U(a,
-e,c);d=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var V={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},ra=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function qa(a,b,c){c.push('"',b.replace(ra,function(d){if(d in V)return V[d];var f=d.charCodeAt(0),e="\\u";if(f<16)e+="000";else if(f<256)e+="00";else if(f<4096)e+="0";return V[d]=e+f.toString(16)}),'"')};function W(a){switch(j(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return B(a,W);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=ua(a);return b}if(l(a))return B(a,W);a=ca(a,function(c,d){return typeof d=="number"||typeof d=="string"});return o(a,W);default:return null}}
-function X(a,b){if(j(a)=="array")return B(a,function(c){return X(c,b)});else if(aa(a))return"ELEMENT"in a?va(a.ELEMENT,b):o(a,function(c){return X(c,b)});return a}function wa(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.i=ba()}return b}function ua(a){var b=wa(a.ownerDocument),c=da(b,function(d){return d==a});if(!c){c=":wdc:"+b.i++;b[c]=a}return c}
-function va(a,b){a=decodeURIComponent(a);var c=b||document,d=wa(c);if(!(a in d))throw new p(10,"Element does not exist in cache");var f=d[a];for(var e=f;e;){if(e==c.documentElement)return f;e=e.parentNode}delete d[a];throw new p(10,"Element is no longer attached to the DOM");};function xa(a){var b=oa;a=[a];var c;try{if(typeof b=="string")b=new Function(b);var d=X(a),f=b.apply(null,d);c={status:0,value:W(f)}}catch(e){c={status:"code"in e?e.code:13,value:{message:e.message}}}b=[];U(new pa,c,b);return b.join("")}var Y="_".split("."),Z=h;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)if(!Y.length&&xa!==undefined)Z[$]=xa;else Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/get_value_of_css_property_android.js b/core/res/res/raw/get_value_of_css_property_android.js
deleted file mode 100644
index 0989b04..0000000
--- a/core/res/res/raw/get_value_of_css_property_android.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function(){return function(){function g(a){var c=typeof a;if(c=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return c;var b=Object.prototype.toString.call(a);if(b=="[object Window]")return"object";if(b=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(b=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
-else if(c=="function"&&typeof a.call=="undefined")return"object";return c}function i(a){var c=g(a);return c=="array"||c=="object"&&typeof a.length=="number"}function j(a){a=g(a);return a=="object"||a=="array"||a=="function"}Math.floor(Math.random()*2147483648).toString(36);var k=Date.now||function(){return+new Date};function l(a,c){function b(){}b.prototype=c.prototype;a.h=c.prototype;a.prototype=new b};function m(a){this.stack=Error().stack||"";if(a)this.message=String(a)}l(m,Error);m.prototype.name="CustomError";function n(a,c,b){var d={};for(var e in a)if(c.call(b,a[e],e,a))d[e]=a[e];return d}function o(a,c,b){var d={};for(var e in a)d[e]=c.call(b,a[e],e,a);return d}function p(a,c,b){for(var d in a)if(c.call(b,a[d],d,a))return d};function q(a,c){m.call(this,c);this.code=a;this.name=r[a]||r[13]}l(q,m);var r,s={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},t={};for(var u in s)t[s[u]]=u;r=t;
-q.prototype.toString=function(){return"["+this.name+"] "+this.message};function v(a){for(var c=1;c<arguments.length;c++){var b=String(arguments[c]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,b)}return a};function w(a,c){c.unshift(a);m.call(this,v.apply(null,c));c.shift();this.i=a}l(w,m);w.prototype.name="AssertionError";function x(a,c){if(!a){var b=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(c){d+=": "+c;var e=b}throw new w(""+d,e||[]);}return a};var y=Array.prototype,A=y.map?function(a,c,b){x(a.length!=null);return y.map.call(a,c,b)}:function(a,c,b){var d=a.length,e=Array(d),f=typeof a=="string"?a.split(""):a;for(var h=0;h<d;h++)if(h in f)e[h]=c.call(b,f[h],h,a);return e};var B="",C;if(C=/WebKit\/(\S+)/){var D=C.exec(this.navigator?this.navigator.userAgent:null);B=D?D[1]:""};var E="StopIteration"in this?this.StopIteration:Error("StopIteration");function F(){}F.prototype.next=function(){throw E;};function G(a,c,b,d,e){this.a=!!c;a&&H(this,a,d);this.d=e!=undefined?e:this.c||0;if(this.a)this.d*=-1;this.f=!b}l(G,F);G.prototype.b=null;G.prototype.c=0;G.prototype.e=false;function H(a,c,b,d){if(a.b=c)a.c=typeof b=="number"?b:a.b.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.d=d}
-G.prototype.next=function(){var a;if(this.e){if(!this.b||this.f&&this.d==0)throw E;a=this.b;var c=this.a?-1:1;if(this.c==c){var b=this.a?a.lastChild:a.firstChild;b?H(this,b):H(this,a,c*-1)}else(b=this.a?a.previousSibling:a.nextSibling)?H(this,b):H(this,a.parentNode,c*-1);this.d+=this.c*(this.a?-1:1)}else this.e=true;a=this.b;if(!this.b)throw E;return a};
-G.prototype.splice=function(){var a=this.b,c=this.a?1:-1;if(this.c==c){this.c=c*-1;this.d+=this.c*(this.a?-1:1)}this.a=!this.a;G.prototype.next.call(this);this.a=!this.a;c=i(arguments[0])?arguments[0]:arguments;for(var b=c.length-1;b>=0;b--)a.parentNode&&a.parentNode.insertBefore(c[b],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function I(a,c,b,d){G.call(this,a,c,b,null,d)}l(I,G);I.prototype.next=function(){do I.h.next.call(this);while(this.c==-1);return this.b};function J(a,c){var b=(a.currentStyle||a.style)[c];if(b!="inherit")return b!==undefined?b:null;for(b=a.parentNode;b&&b.nodeType!=1&&b.nodeType!=9&&b.nodeType!=11;)b=b.parentNode;return(b=b&&b.nodeType==1&&1?b:null)?J(b,c):null}String.fromCharCode(160);function K(){}
-function L(a,c,b){switch(typeof c){case "string":M(a,c,b);break;case "number":b.push(isFinite(c)&&!isNaN(c)?c:"null");break;case "boolean":b.push(c);break;case "undefined":b.push("null");break;case "object":if(c==null){b.push("null");break}if(g(c)=="array"){var d=c.length;b.push("[");var e="";for(var f=0;f<d;f++){b.push(e);L(a,c[f],b);e=","}b.push("]");break}b.push("{");d="";for(e in c)if(Object.prototype.hasOwnProperty.call(c,e)){f=c[e];if(typeof f!="function"){b.push(d);M(a,e,b);b.push(":");L(a,
-f,b);d=","}}b.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof c);}}var N={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},O=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function M(a,c,b){b.push('"',c.replace(O,function(d){if(d in N)return N[d];var e=d.charCodeAt(0),f="\\u";if(e<16)f+="000";else if(e<256)f+="00";else if(e<4096)f+="0";return N[d]=f+e.toString(16)}),'"')};function P(a){switch(g(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return A(a,P);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var c={};c.ELEMENT=Q(a);return c}if(i(a))return A(a,P);a=n(a,function(b,d){return typeof d=="number"||typeof d=="string"});return o(a,P);default:return null}}
-function R(a,c){if(g(a)=="array")return A(a,function(b){return R(b,c)});else if(j(a))return"ELEMENT"in a?S(a.ELEMENT,c):o(a,function(b){return R(b,c)});return a}function T(a){a=a||document;var c=a.$wdc_;if(!c){c=a.$wdc_={};c.g=k()}return c}function Q(a){var c=T(a.ownerDocument),b=p(c,function(d){return d==a});if(!b){b=":wdc:"+c.g++;c[b]=a}return b}
-function S(a,c){a=decodeURIComponent(a);var b=c||document,d=T(b);if(!(a in d))throw new q(10,"Element does not exist in cache");var e=d[a];for(var f=e;f;){if(f==b.documentElement)return e;f=f.parentNode}delete d[a];throw new q(10,"Element is no longer attached to the DOM");};function U(a,c){var b=J,d=[a,c],e;try{if(typeof b=="string")b=new Function(b);var f=R(d),h=b.apply(null,f);e={status:0,value:P(h)}}catch(z){e={status:"code"in z?z.code:13,value:{message:z.message}}}b=[];L(new K,e,b);return b.join("")}var V="_".split("."),W=this;!(V[0]in W)&&W.execScript&&W.execScript("var "+V[0]);for(var X;V.length&&(X=V.shift());)if(!V.length&&U!==undefined)W[X]=U;else W=W[X]?W[X]:W[X]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/is_displayed_android.js b/core/res/res/raw/is_displayed_android.js
deleted file mode 100644
index 154e319..0000000
--- a/core/res/res/raw/is_displayed_android.js
+++ /dev/null
@@ -1,20 +0,0 @@
-function(){return function(){var g=this;
-function i(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if(b==
-"function"&&typeof a.call=="undefined")return"object";return b}function j(a){var b=i(a);return b=="array"||b=="object"&&typeof a.length=="number"}function k(a){return typeof a=="string"}function aa(a){a=i(a);return a=="object"||a=="array"||a=="function"}Math.floor(Math.random()*2147483648).toString(36);var l=Date.now||function(){return+new Date};function m(a,b){function c(){}c.prototype=b.prototype;a.i=b.prototype;a.prototype=new c};var ba=window;function ca(){var a=g.Components;if(!a)return false;try{a.j["@mozilla.org/uuid-generator;1"].k(a.h.n);return true}catch(b){return false}};function n(a){this.stack=Error().stack||"";if(a)this.message=String(a)}m(n,Error);n.prototype.name="CustomError";function da(a,b,c){var e={};for(var f in a)if(b.call(c,a[f],f,a))e[f]=a[f];return e}function o(a,b,c){var e={};for(var f in a)e[f]=b.call(c,a[f],f,a);return e}function ea(a,b,c){for(var e in a)if(b.call(c,a[e],e,a))return e};function p(a,b){n.call(this,b);this.code=a;this.name=r[a]||r[13]}m(p,n);var r,s={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},t={};for(var u in s)t[s[u]]=u;r=t;
-p.prototype.toString=function(){return"["+this.name+"] "+this.message};function fa(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a}var v={};function ga(a){return v[a]||(v[a]=String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()}))};function w(a,b){b.unshift(a);n.call(this,fa.apply(null,b));b.shift();this.l=a}m(w,n);w.prototype.name="AssertionError";function x(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),e="Assertion failed";if(b){e+=": "+b;var f=c}throw new w(""+e,f||[]);}return a};var y=Array.prototype,ha=y.indexOf?function(a,b,c){x(a.length!=null);return y.indexOf.call(a,b,c)}:function(a,b,c){c=c==null?0:c<0?Math.max(0,a.length+c):c;if(k(a)){if(!k(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(c=c;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},z=y.map?function(a,b,c){x(a.length!=null);return y.map.call(a,b,c)}:function(a,b,c){var e=a.length,f=Array(e),d=k(a)?a.split(""):a;for(var h=0;h<e;h++)if(h in d)f[h]=b.call(c,d[h],h,a);return f},ia=y.some?function(a,b,c){x(a.length!=
-null);return y.some.call(a,b,c)}:function(a,b,c){var e=a.length,f=k(a)?a.split(""):a;for(var d=0;d<e;d++)if(d in f&&b.call(c,f[d],d,a))return true;return false};var A=true,ja="",B;if(A)B=/WebKit\/(\S+)/;if(B){var C=B.exec(g.navigator?g.navigator.userAgent:null);ja=C?C[1]:""};function D(a,b){this.width=a;this.height=b}D.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};D.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};function E(a){return a.nodeType==9?a:a.ownerDocument||a.document}function ka(a,b){var c=[];return F(a,b,c,true)?c[0]:undefined}function F(a,b,c,e){if(a!=null){var f=0;for(var d;d=a.childNodes[f];f++){if(b(d)){c.push(d);if(e)return true}if(F(d,b,c,e))return true}}return false}function G(a,b,c,e){if(!c)a=a.parentNode;c=e==null;for(var f=0;a&&(c||f<=e);){if(b(a))return a;a=a.parentNode;f++}return null};function la(a,b){var c=function(e,f){var d=E(e);if(e.selectSingleNode){d.setProperty&&d.setProperty("SelectionLanguage","XPath");return e.selectSingleNode(f)}else if(d.implementation.hasFeature("XPath","3.0")){var h=d.createNSResolver(d.documentElement),q;if(typeof XPathResult!="undefined")q=XPathResult.FIRST_ORDERED_NODE_TYPE;else{if(!ca())throw Error("Document claims it supports XPath yet XPathResult is not defined. Please report this to Selenium developers");q=Components.h.m.FIRST_ORDERED_NODE_TYPE}return d.evaluate(f,
-e,h,q,null).singleNodeValue}return null}(b,a);if(!c)return null;if(c.nodeType!=1)throw Error("Returned node is not an element: "+a);return c};var H="StopIteration"in g?g.StopIteration:Error("StopIteration");function I(){}I.prototype.next=function(){throw H;};function J(a,b,c,e,f){this.a=!!b;a&&K(this,a,e);this.d=f!=undefined?f:this.c||0;if(this.a)this.d*=-1;this.g=!c}m(J,I);J.prototype.b=null;J.prototype.c=0;J.prototype.f=false;function K(a,b,c,e){if(a.b=b)a.c=typeof c=="number"?c:a.b.nodeType!=1?0:a.a?-1:1;if(typeof e=="number")a.d=e}
-J.prototype.next=function(){var a;if(this.f){if(!this.b||this.g&&this.d==0)throw H;a=this.b;var b=this.a?-1:1;if(this.c==b){var c=this.a?a.lastChild:a.firstChild;c?K(this,c):K(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?K(this,c):K(this,a.parentNode,b*-1);this.d+=this.c*(this.a?-1:1)}else this.f=true;a=this.b;if(!this.b)throw H;return a};
-J.prototype.splice=function(){var a=this.b,b=this.a?1:-1;if(this.c==b){this.c=b*-1;this.d+=this.c*(this.a?-1:1)}this.a=!this.a;J.prototype.next.call(this);this.a=!this.a;b=j(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function L(a,b,c,e){J.call(this,a,b,c,null,e)}m(L,J);L.prototype.next=function(){do L.i.next.call(this);while(this.c==-1);return this.b};function M(a,b){var c=E(a);if(c.defaultView&&c.defaultView.getComputedStyle)if(c=c.defaultView.getComputedStyle(a,null))return c[b]||c.getPropertyValue(b);return""};function N(a,b){return!!a&&a.nodeType==1&&(!b||a.tagName.toUpperCase()==b)}
-var ma=["async","autofocus","autoplay","checked","compact","complete","controls","declare","defaultchecked","defaultselected","defer","disabled","draggable","ended","formnovalidate","hidden","indeterminate","iscontenteditable","ismap","itemscope","loop","multiple","muted","nohref","noresize","noshade","novalidate","nowrap","open","paused","pubdate","readonly","required","reversed","scoped","seamless","seeking","selected","spellcheck","truespeed","willvalidate"];
-function na(a,b){if(8==a.nodeType)return null;b=b.toLowerCase();if(b=="style"){var c=a.style.cssText.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").toLowerCase();return c.charAt(c.length-1)==";"?c:c+";"}c=a.getAttributeNode(b);if(!c)return null;if(ha(ma,b)>=0)return"true";return c.specified?c.value:null}function O(a){for(a=a.parentNode;a&&a.nodeType!=1&&a.nodeType!=9&&a.nodeType!=11;)a=a.parentNode;return N(a)?a:null}function P(a,b){b=ga(String(b));return M(a,b)||Q(a,b)}
-function Q(a,b){var c=(a.currentStyle||a.style)[b];if(c!="inherit")return c!==undefined?c:null;return(c=O(a))?Q(c,b):null}
-function oa(a){if(i(a.getBBox)=="function")return a.getBBox();var b;if((M(a,"display")||(a.currentStyle?a.currentStyle.display:null)||a.style.display)!="none")b=new D(a.offsetWidth,a.offsetHeight);else{b=a.style;var c=b.display,e=b.visibility,f=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";var d;d=a.offsetWidth;a=a.offsetHeight;b.display=c;b.position=f;b.visibility=e;b=new D(d,a)}return b}
-function R(a,b){function c(d){if(P(d,"display")=="none")return false;d=O(d);return!d||c(d)}function e(d){var h=oa(d);if(h.height>0&&h.width>0)return true;if(d.innerText||d.textContent)if(pa.test(d.innerText||d.textContent))return true;return A&&ia(d.childNodes,function(q){return N(q)&&e(q)})}if(!N(a))throw Error("Argument to isShown must be of type Element");if(N(a,"TITLE"))return(E(a)?E(a).parentWindow||E(a).defaultView:window)==ba;if(N(a,"OPTION")||N(a,"OPTGROUP")){var f=G(a,function(d){return N(d,
-"SELECT")});return!!f&&R(f)}if(N(a,"MAP")){if(!a.name)return false;f=E(a);f=f.evaluate?la('/descendant::*[@usemap = "#'+a.name+'"]',f):ka(f,function(d){return N(d)&&na(d,"usemap")=="#"+a.name});return!!f&&R(f)}if(N(a,"AREA")){f=G(a,function(d){return N(d,"MAP")});return!!f&&R(f)}if(N(a,"INPUT")&&a.type.toLowerCase()=="hidden")return false;if(P(a,"visibility")=="hidden")return false;if(!c(a))return false;if(!b&&S(a)==0)return false;if(!e(a))return false;return true}
-var qa="[\\s\\xa0"+String.fromCharCode(160)+"]+",pa=RegExp("^"+qa+"$");function S(a){var b=1,c=P(a,"opacity");if(c)b=Number(c);if(a=O(a))b*=S(a);return b};function ra(a){return R(a,true)};function sa(){}
-function T(a,b,c){switch(typeof b){case "string":U(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(i(b)=="array"){var e=b.length;c.push("[");var f="";for(var d=0;d<e;d++){c.push(f);T(a,b[d],c);f=","}c.push("]");break}c.push("{");e="";for(f in b)if(Object.prototype.hasOwnProperty.call(b,f)){d=b[f];if(typeof d!="function"){c.push(e);U(a,f,c);c.push(":");T(a,
-d,c);e=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var V={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},ta=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function U(a,b,c){c.push('"',b.replace(ta,function(e){if(e in V)return V[e];var f=e.charCodeAt(0),d="\\u";if(f<16)d+="000";else if(f<256)d+="00";else if(f<4096)d+="0";return V[e]=d+f.toString(16)}),'"')};function W(a){switch(i(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return z(a,W);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=ua(a);return b}if(j(a))return z(a,W);a=da(a,function(c,e){return typeof e=="number"||k(e)});return o(a,W);default:return null}}
-function X(a,b){if(i(a)=="array")return z(a,function(c){return X(c,b)});else if(aa(a))return"ELEMENT"in a?va(a.ELEMENT,b):o(a,function(c){return X(c,b)});return a}function wa(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.e=l()}if(!b.e)b.e=l();return b}function ua(a){var b=wa(a.ownerDocument),c=ea(b,function(e){return e==a});if(!c){c=":wdc:"+b.e++;b[c]=a}return c}
-function va(a,b){a=decodeURIComponent(a);var c=b||document,e=wa(c);if(!(a in e))throw new p(10,"Element does not exist in cache");var f=e[a];for(var d=f;d;){if(d==c.documentElement)return f;d=d.parentNode}delete e[a];throw new p(10,"Element is no longer attached to the DOM");};function xa(a){var b=ra;a=[a];var c;try{if(k(b))b=new Function(b);var e=X(a),f=b.apply(null,e);c={status:0,value:W(f)}}catch(d){c={status:"code"in d?d.code:13,value:{message:d.message}}}b=[];T(new sa,c,b);return b.join("")}var Y="_".split("."),Z=g;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)if(!Y.length&&xa!==undefined)Z[$]=xa;else Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/is_enabled_android.js b/core/res/res/raw/is_enabled_android.js
deleted file mode 100644
index 231309f..0000000
--- a/core/res/res/raw/is_enabled_android.js
+++ /dev/null
@@ -1,12 +0,0 @@
-function(){return function(){function g(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
-else if(b=="function"&&typeof a.call=="undefined")return"object";return b}function h(a){var b=g(a);return b=="array"||b=="object"&&typeof a.length=="number"}function i(a){return typeof a=="string"}function k(a){a=g(a);return a=="object"||a=="array"||a=="function"}Math.floor(Math.random()*2147483648).toString(36);var l=Date.now||function(){return+new Date};function m(a,b){function c(){}c.prototype=b.prototype;a.h=b.prototype;a.prototype=new c};function n(a){this.stack=Error().stack||"";if(a)this.message=String(a)}m(n,Error);n.prototype.name="CustomError";function o(a,b,c){var d={};for(var e in a)if(b.call(c,a[e],e,a))d[e]=a[e];return d}function p(a,b,c){var d={};for(var e in a)d[e]=b.call(c,a[e],e,a);return d}function q(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function r(a,b){n.call(this,b);this.code=a;this.name=s[a]||s[13]}m(r,n);var s,t={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},u={};for(var v in t)u[t[v]]=v;s=u;
-r.prototype.toString=function(){return"["+this.name+"] "+this.message};function w(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a};function x(a,b){b.unshift(a);n.call(this,w.apply(null,b));b.shift();this.i=a}m(x,n);x.prototype.name="AssertionError";function y(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var e=c}throw new x(""+d,e||[]);}return a};var z=Array.prototype,A=z.indexOf?function(a,b,c){y(a.length!=null);return z.indexOf.call(a,b,c)}:function(a,b,c){c=c==null?0:c<0?Math.max(0,a.length+c):c;if(i(a)){if(!i(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(c=c;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},B=z.map?function(a,b,c){y(a.length!=null);return z.map.call(a,b,c)}:function(a,b,c){var d=a.length,e=Array(d),f=i(a)?a.split(""):a;for(var j=0;j<d;j++)if(j in f)e[j]=b.call(c,f[j],j,a);return e};var C="",D;if(D=/WebKit\/(\S+)/){var E=D.exec(this.navigator?this.navigator.userAgent:null);C=E?E[1]:""};var F="StopIteration"in this?this.StopIteration:Error("StopIteration");function G(){}G.prototype.next=function(){throw F;};function H(a,b,c,d,e){this.a=!!b;a&&I(this,a,d);this.d=e!=undefined?e:this.c||0;if(this.a)this.d*=-1;this.f=!c}m(H,G);H.prototype.b=null;H.prototype.c=0;H.prototype.e=false;function I(a,b,c,d){if(a.b=b)a.c=typeof c=="number"?c:a.b.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.d=d}
-H.prototype.next=function(){var a;if(this.e){if(!this.b||this.f&&this.d==0)throw F;a=this.b;var b=this.a?-1:1;if(this.c==b){var c=this.a?a.lastChild:a.firstChild;c?I(this,c):I(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?I(this,c):I(this,a.parentNode,b*-1);this.d+=this.c*(this.a?-1:1)}else this.e=true;a=this.b;if(!this.b)throw F;return a};
-H.prototype.splice=function(){var a=this.b,b=this.a?1:-1;if(this.c==b){this.c=b*-1;this.d+=this.c*(this.a?-1:1)}this.a=!this.a;H.prototype.next.call(this);this.a=!this.a;b=h(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function J(a,b,c,d){H.call(this,a,b,c,null,d)}m(J,H);J.prototype.next=function(){do J.h.next.call(this);while(this.c==-1);return this.b};var K=["async","autofocus","autoplay","checked","compact","complete","controls","declare","defaultchecked","defaultselected","defer","disabled","draggable","ended","formnovalidate","hidden","indeterminate","iscontenteditable","ismap","itemscope","loop","multiple","muted","nohref","noresize","noshade","novalidate","nowrap","open","paused","pubdate","readonly","required","reversed","scoped","seamless","seeking","selected","spellcheck","truespeed","willvalidate"];
-function L(a,b){if(8==a.nodeType)return null;b=b.toLowerCase();if(b=="style"){var c=a.style.cssText.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").toLowerCase();return c.charAt(c.length-1)==";"?c:c+";"}c=a.getAttributeNode(b);if(!c)return null;if(A(K,b)>=0)return"true";return c.specified?c.value:null}var M=["BUTTON","INPUT","OPTGROUP","OPTION","SELECT","TEXTAREA"];
-function N(a){var b=a.tagName.toUpperCase();if(!(A(M,b)>=0))return true;if(L(a,"disabled"))return false;if(a.parentNode&&a.parentNode.nodeType==1&&"OPTGROUP"==b||"OPTION"==b)return N(a.parentNode);return true}String.fromCharCode(160);function O(){}
-function P(a,b,c){switch(typeof b){case "string":Q(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(g(b)=="array"){var d=b.length;c.push("[");var e="";for(var f=0;f<d;f++){c.push(e);P(a,b[f],c);e=","}c.push("]");break}c.push("{");d="";for(e in b)if(Object.prototype.hasOwnProperty.call(b,e)){f=b[e];if(typeof f!="function"){c.push(d);Q(a,e,c);c.push(":");P(a,
-f,c);d=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var R={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},S=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function Q(a,b,c){c.push('"',b.replace(S,function(d){if(d in R)return R[d];var e=d.charCodeAt(0),f="\\u";if(e<16)f+="000";else if(e<256)f+="00";else if(e<4096)f+="0";return R[d]=f+e.toString(16)}),'"')};function T(a){switch(g(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return B(a,T);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=U(a);return b}if(h(a))return B(a,T);a=o(a,function(c,d){return typeof d=="number"||i(d)});return p(a,T);default:return null}}
-function V(a,b){if(g(a)=="array")return B(a,function(c){return V(c,b)});else if(k(a))return"ELEMENT"in a?aa(a.ELEMENT,b):p(a,function(c){return V(c,b)});return a}function W(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.g=l()}return b}function U(a){var b=W(a.ownerDocument),c=q(b,function(d){return d==a});if(!c){c=":wdc:"+b.g++;b[c]=a}return c}
-function aa(a,b){a=decodeURIComponent(a);var c=b||document,d=W(c);if(!(a in d))throw new r(10,"Element does not exist in cache");var e=d[a];for(var f=e;f;){if(f==c.documentElement)return e;f=f.parentNode}delete d[a];throw new r(10,"Element is no longer attached to the DOM");};function X(a){var b=N;a=[a];var c;try{if(i(b))b=new Function(b);var d=V(a),e=b.apply(null,d);c={status:0,value:T(e)}}catch(f){c={status:"code"in f?f.code:13,value:{message:f.message}}}b=[];P(new O,c,b);return b.join("")}var Y="_".split("."),Z=this;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)if(!Y.length&&X!==undefined)Z[$]=X;else Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/is_selected_android.js b/core/res/res/raw/is_selected_android.js
deleted file mode 100644
index e1c51b6..0000000
--- a/core/res/res/raw/is_selected_android.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function(){return function(){function g(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
-else if(b=="function"&&typeof a.call=="undefined")return"object";return b}function h(a){var b=g(a);return b=="array"||b=="object"&&typeof a.length=="number"}function i(a){return typeof a=="string"}function k(a){a=g(a);return a=="object"||a=="array"||a=="function"}Math.floor(Math.random()*2147483648).toString(36);var l=Date.now||function(){return+new Date};function m(a,b){function c(){}c.prototype=b.prototype;a.h=b.prototype;a.prototype=new c};function n(a){this.stack=Error().stack||"";if(a)this.message=String(a)}m(n,Error);n.prototype.name="CustomError";function o(a,b,c){var d={};for(var e in a)if(b.call(c,a[e],e,a))d[e]=a[e];return d}function p(a,b,c){var d={};for(var e in a)d[e]=b.call(c,a[e],e,a);return d}function q(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function r(a,b){n.call(this,b);this.code=a;this.name=s[a]||s[13]}m(r,n);var s,t={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},u={};for(var v in t)u[t[v]]=v;s=u;
-r.prototype.toString=function(){return"["+this.name+"] "+this.message};function w(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a};function x(a,b){b.unshift(a);n.call(this,w.apply(null,b));b.shift();this.i=a}m(x,n);x.prototype.name="AssertionError";function y(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var e=c}throw new x(""+d,e||[]);}return a};var z=Array.prototype,A=z.indexOf?function(a,b,c){y(a.length!=null);return z.indexOf.call(a,b,c)}:function(a,b,c){c=c==null?0:c<0?Math.max(0,a.length+c):c;if(i(a)){if(!i(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(c=c;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},B=z.map?function(a,b,c){y(a.length!=null);return z.map.call(a,b,c)}:function(a,b,c){var d=a.length,e=Array(d),f=i(a)?a.split(""):a;for(var j=0;j<d;j++)if(j in f)e[j]=b.call(c,f[j],j,a);return e};var C="",D;if(D=/WebKit\/(\S+)/){var E=D.exec(this.navigator?this.navigator.userAgent:null);C=E?E[1]:""};var F="StopIteration"in this?this.StopIteration:Error("StopIteration");function G(){}G.prototype.next=function(){throw F;};function H(a,b,c,d,e){this.a=!!b;a&&I(this,a,d);this.d=e!=undefined?e:this.c||0;if(this.a)this.d*=-1;this.f=!c}m(H,G);H.prototype.b=null;H.prototype.c=0;H.prototype.e=false;function I(a,b,c,d){if(a.b=b)a.c=typeof c=="number"?c:a.b.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.d=d}
-H.prototype.next=function(){var a;if(this.e){if(!this.b||this.f&&this.d==0)throw F;a=this.b;var b=this.a?-1:1;if(this.c==b){var c=this.a?a.lastChild:a.firstChild;c?I(this,c):I(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?I(this,c):I(this,a.parentNode,b*-1);this.d+=this.c*(this.a?-1:1)}else this.e=true;a=this.b;if(!this.b)throw F;return a};
-H.prototype.splice=function(){var a=this.b,b=this.a?1:-1;if(this.c==b){this.c=b*-1;this.d+=this.c*(this.a?-1:1)}this.a=!this.a;H.prototype.next.call(this);this.a=!this.a;b=h(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function J(a,b,c,d){H.call(this,a,b,c,null,d)}m(J,H);J.prototype.next=function(){do J.h.next.call(this);while(this.c==-1);return this.b};var K={"class":"className",readonly:"readOnly"},L=["checked","disabled","draggable","hidden"];String.fromCharCode(160);function M(a){var b;if(a&&a.nodeType==1&&a.tagName.toUpperCase()=="OPTION")b=true;else if(a&&a.nodeType==1&&a.tagName.toUpperCase()=="INPUT"){b=a.type.toLowerCase();b=b=="checkbox"||b=="radio"}else b=false;if(!b)throw new r(15,"Element is not selectable");b="selected";var c=a.type&&a.type.toLowerCase();if("checkbox"==c||"radio"==c)b="checked";b=K[b]||b;a=a[b];a=a===undefined&&A(L,b)>=0?false:a;return!!a};function N(){}
-function O(a,b,c){switch(typeof b){case "string":P(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(g(b)=="array"){var d=b.length;c.push("[");var e="";for(var f=0;f<d;f++){c.push(e);O(a,b[f],c);e=","}c.push("]");break}c.push("{");d="";for(e in b)if(Object.prototype.hasOwnProperty.call(b,e)){f=b[e];if(typeof f!="function"){c.push(d);P(a,e,c);c.push(":");O(a,
-f,c);d=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var Q={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},R=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function P(a,b,c){c.push('"',b.replace(R,function(d){if(d in Q)return Q[d];var e=d.charCodeAt(0),f="\\u";if(e<16)f+="000";else if(e<256)f+="00";else if(e<4096)f+="0";return Q[d]=f+e.toString(16)}),'"')};function S(a){switch(g(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return B(a,S);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=T(a);return b}if(h(a))return B(a,S);a=o(a,function(c,d){return typeof d=="number"||i(d)});return p(a,S);default:return null}}
-function U(a,b){if(g(a)=="array")return B(a,function(c){return U(c,b)});else if(k(a))return"ELEMENT"in a?V(a.ELEMENT,b):p(a,function(c){return U(c,b)});return a}function W(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.g=l()}return b}function T(a){var b=W(a.ownerDocument),c=q(b,function(d){return d==a});if(!c){c=":wdc:"+b.g++;b[c]=a}return c}
-function V(a,b){a=decodeURIComponent(a);var c=b||document,d=W(c);if(!(a in d))throw new r(10,"Element does not exist in cache");var e=d[a];for(var f=e;f;){if(f==c.documentElement)return e;f=f.parentNode}delete d[a];throw new r(10,"Element is no longer attached to the DOM");};function X(a){var b=M;a=[a];var c;try{if(i(b))b=new Function(b);var d=U(a),e=b.apply(null,d);c={status:0,value:S(e)}}catch(f){c={status:"code"in f?f.code:13,value:{message:f.message}}}b=[];O(new N,c,b);return b.join("")}var Y="_".split("."),Z=this;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)if(!Y.length&&X!==undefined)Z[$]=X;else Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/set_selected_android.js b/core/res/res/raw/set_selected_android.js
deleted file mode 100644
index 8936f55..0000000
--- a/core/res/res/raw/set_selected_android.js
+++ /dev/null
@@ -1,27 +0,0 @@
-function(){return function(){var l=this;
-function m(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if(b==
-"function"&&typeof a.call=="undefined")return"object";return b}function o(a){var b=m(a);return b=="array"||b=="object"&&typeof a.length=="number"}function p(a){return typeof a=="string"}function q(a){a=m(a);return a=="object"||a=="array"||a=="function"}Math.floor(Math.random()*2147483648).toString(36);var aa=Date.now||function(){return+new Date};function r(a,b){function c(){}c.prototype=b.prototype;a.k=b.prototype;a.prototype=new c};var ba=window;function ca(){var a=l.Components;if(!a)return false;try{a.l["@mozilla.org/uuid-generator;1"].o(a.i.r);return true}catch(b){return false}};function s(a){this.stack=Error().stack||"";if(a)this.message=String(a)}r(s,Error);s.prototype.name="CustomError";function da(a,b,c){var d={};for(var f in a)if(b.call(c,a[f],f,a))d[f]=a[f];return d}function t(a,b,c){var d={};for(var f in a)d[f]=b.call(c,a[f],f,a);return d}function ea(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function v(a,b){s.call(this,b);this.code=a;this.name=w[a]||w[13]}r(v,s);var w,fa={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},ga={};for(var ha in fa)ga[fa[ha]]=ha;w=ga;
-v.prototype.toString=function(){return"["+this.name+"] "+this.message};function ia(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a}var ja={};function ka(a){return ja[a]||(ja[a]=String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()}))};function x(a,b){b.unshift(a);s.call(this,ia.apply(null,b));b.shift();this.p=a}r(x,s);x.prototype.name="AssertionError";function y(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var f=c}throw new x(""+d,f||[]);}return a};var z=Array.prototype,A=z.indexOf?function(a,b,c){y(a.length!=null);return z.indexOf.call(a,b,c)}:function(a,b,c){c=c==null?0:c<0?Math.max(0,a.length+c):c;if(p(a)){if(!p(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(c=c;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},B=z.map?function(a,b,c){y(a.length!=null);return z.map.call(a,b,c)}:function(a,b,c){var d=a.length,f=Array(d),e=p(a)?a.split(""):a;for(var g=0;g<d;g++)if(g in e)f[g]=b.call(c,e[g],g,a);return f},la=z.some?function(a,b,c){y(a.length!=
-null);return z.some.call(a,b,c)}:function(a,b,c){var d=a.length,f=p(a)?a.split(""):a;for(var e=0;e<d;e++)if(e in f&&b.call(c,f[e],e,a))return true;return false};var C=true,ma="",D;if(C)D=/WebKit\/(\S+)/;if(D){var na=D.exec(l.navigator?l.navigator.userAgent:null);ma=na?na[1]:""};var E;function F(a,b){this.x=a!==undefined?a:0;this.y=b!==undefined?b:0}F.prototype.toString=function(){return"("+this.x+", "+this.y+")"};function G(a,b){this.width=a;this.height=b}G.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};G.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};function H(a){return a.nodeType==9?a:a.ownerDocument||a.document}function oa(a,b){var c=[];return pa(a,b,c,true)?c[0]:undefined}function pa(a,b,c,d){if(a!=null){var f=0;for(var e;e=a.childNodes[f];f++){if(b(e)){c.push(e);if(d)return true}if(pa(e,b,c,d))return true}}return false}function I(a,b,c,d){if(!c)a=a.parentNode;c=d==null;for(var f=0;a&&(c||f<=d);){if(b(a))return a;a=a.parentNode;f++}return null}function J(a){this.e=a||l.document||document}
-function qa(a){a=!C&&a.e.compatMode=="CSS1Compat"?a.e.documentElement:a.e.body;return new F(a.scrollLeft,a.scrollTop)};function ra(a,b){var c=function(d,f){var e=H(d);if(d.selectSingleNode){e.setProperty&&e.setProperty("SelectionLanguage","XPath");return d.selectSingleNode(f)}else if(e.implementation.hasFeature("XPath","3.0")){var g=e.createNSResolver(e.documentElement),h;if(typeof XPathResult!="undefined")h=XPathResult.FIRST_ORDERED_NODE_TYPE;else{if(!ca())throw Error("Document claims it supports XPath yet XPathResult is not defined. Please report this to Selenium developers");h=Components.i.q.FIRST_ORDERED_NODE_TYPE}return e.evaluate(f,
-d,g,h,null).singleNodeValue}return null}(b,a);if(!c)return null;if(c.nodeType!=1)throw Error("Returned node is not an element: "+a);return c};var K="StopIteration"in l?l.StopIteration:Error("StopIteration");function sa(){}sa.prototype.next=function(){throw K;};function L(a,b,c,d,f){this.a=!!b;a&&M(this,a,d);this.d=f!=undefined?f:this.c||0;if(this.a)this.d*=-1;this.h=!c}r(L,sa);L.prototype.b=null;L.prototype.c=0;L.prototype.g=false;function M(a,b,c,d){if(a.b=b)a.c=typeof c=="number"?c:a.b.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.d=d}
-L.prototype.next=function(){var a;if(this.g){if(!this.b||this.h&&this.d==0)throw K;a=this.b;var b=this.a?-1:1;if(this.c==b){var c=this.a?a.lastChild:a.firstChild;c?M(this,c):M(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?M(this,c):M(this,a.parentNode,b*-1);this.d+=this.c*(this.a?-1:1)}else this.g=true;a=this.b;if(!this.b)throw K;return a};
-L.prototype.splice=function(){var a=this.b,b=this.a?1:-1;if(this.c==b){this.c=b*-1;this.d+=this.c*(this.a?-1:1)}this.a=!this.a;L.prototype.next.call(this);this.a=!this.a;b=o(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function N(a,b,c,d){L.call(this,a,b,c,null,d)}r(N,L);N.prototype.next=function(){do N.k.next.call(this);while(this.c==-1);return this.b};function ta(a,b){var c=H(a);if(c.defaultView&&c.defaultView.getComputedStyle)if(c=c.defaultView.getComputedStyle(a,null))return c[b]||c.getPropertyValue(b);return""}function O(a,b){return ta(a,b)||(a.currentStyle?a.currentStyle[b]:null)||a.style[b]}
-function ua(a){var b=H(a),c=O(a,"position"),d=c=="fixed"||c=="absolute";for(a=a.parentNode;a&&a!=b;a=a.parentNode){c=O(a,"position");d=d&&c=="static"&&a!=b.documentElement&&a!=b.body;if(!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||c=="fixed"||c=="absolute"))return a}return null};function P(a,b){return!!a&&a.nodeType==1&&(!b||a.tagName.toUpperCase()==b)}
-var va={"class":"className",readonly:"readOnly"},wa=["checked","disabled","draggable","hidden"],xa=["async","autofocus","autoplay","checked","compact","complete","controls","declare","defaultchecked","defaultselected","defer","disabled","draggable","ended","formnovalidate","hidden","indeterminate","iscontenteditable","ismap","itemscope","loop","multiple","muted","nohref","noresize","noshade","novalidate","nowrap","open","paused","pubdate","readonly","required","reversed","scoped","seamless","seeking",
-"selected","spellcheck","truespeed","willvalidate"];function ya(a,b){if(8==a.nodeType)return null;b=b.toLowerCase();if(b=="style"){var c=a.style.cssText.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").toLowerCase();return c.charAt(c.length-1)==";"?c:c+";"}c=a.getAttributeNode(b);if(!c)return null;if(A(xa,b)>=0)return"true";return c.specified?c.value:null}var za=["BUTTON","INPUT","OPTGROUP","OPTION","SELECT","TEXTAREA"];
-function Aa(a){var b=a.tagName.toUpperCase();if(!(A(za,b)>=0))return true;if(ya(a,"disabled"))return false;if(a.parentNode&&a.parentNode.nodeType==1&&"OPTGROUP"==b||"OPTION"==b)return Aa(a.parentNode);return true}function Q(a){for(a=a.parentNode;a&&a.nodeType!=1&&a.nodeType!=9&&a.nodeType!=11;)a=a.parentNode;return P(a)?a:null}function R(a,b){b=ka(String(b));return ta(a,b)||Ba(a,b)}
-function Ba(a,b){var c=(a.currentStyle||a.style)[b];if(c!="inherit")return c!==undefined?c:null;return(c=Q(a))?Ba(c,b):null}function Ca(a){if(m(a.getBBox)=="function")return a.getBBox();var b;if(O(a,"display")!="none")b=new G(a.offsetWidth,a.offsetHeight);else{b=a.style;var c=b.display,d=b.visibility,f=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";var e;e=a.offsetWidth;a=a.offsetHeight;b.display=c;b.position=f;b.visibility=d;b=new G(e,a)}return b}
-function S(a,b){function c(e){if(R(e,"display")=="none")return false;e=Q(e);return!e||c(e)}function d(e){var g=Ca(e);if(g.height>0&&g.width>0)return true;if(e.innerText||e.textContent)if(Da.test(e.innerText||e.textContent))return true;return C&&la(e.childNodes,function(h){return P(h)&&d(h)})}if(!P(a))throw Error("Argument to isShown must be of type Element");if(P(a,"TITLE"))return(H(a)?H(a).parentWindow||H(a).defaultView:window)==ba;if(P(a,"OPTION")||P(a,"OPTGROUP")){var f=I(a,function(e){return P(e,
-"SELECT")});return!!f&&S(f)}if(P(a,"MAP")){if(!a.name)return false;f=H(a);f=f.evaluate?ra('/descendant::*[@usemap = "#'+a.name+'"]',f):oa(f,function(e){return P(e)&&ya(e,"usemap")=="#"+a.name});return!!f&&S(f)}if(P(a,"AREA")){f=I(a,function(e){return P(e,"MAP")});return!!f&&S(f)}if(P(a,"INPUT")&&a.type.toLowerCase()=="hidden")return false;if(R(a,"visibility")=="hidden")return false;if(!c(a))return false;if(!b&&Ea(a)==0)return false;if(!d(a))return false;return true}
-var Fa="[\\s\\xa0"+String.fromCharCode(160)+"]+",Da=RegExp("^"+Fa+"$");function Ea(a){var b=1,c=R(a,"opacity");if(c)b=Number(c);if(a=Q(a))b*=Ea(a);return b};var Ga=["dragstart","dragexit","mouseover","mouseout"];
-function T(a,b,c){var d=H(a),f=d?d.parentWindow||d.defaultView:window,e=new F;if(a.nodeType==1)if(a.getBoundingClientRect){var g=a.getBoundingClientRect();e.x=g.left;e.y=g.top}else{g=qa(a?new J(H(a)):E||(E=new J));var h,i=H(a);h=O(a,"position");var j=new F(0,0),u=(i?i.nodeType==9?i:H(i):document).documentElement;if(a!=u)if(a.getBoundingClientRect){h=a.getBoundingClientRect();i=qa(i?new J(H(i)):E||(E=new J));j.x=h.left+i.x;j.y=h.top+i.y}else if(i.getBoxObjectFor){h=i.getBoxObjectFor(a);i=i.getBoxObjectFor(u);
-j.x=h.screenX-i.screenX;j.y=h.screenY-i.screenY}else{var k=a;do{j.x+=k.offsetLeft;j.y+=k.offsetTop;if(k!=a){j.x+=k.clientLeft||0;j.y+=k.clientTop||0}if(C&&O(k,"position")=="fixed"){j.x+=i.body.scrollLeft;j.y+=i.body.scrollTop;break}k=k.offsetParent}while(k&&k!=a);if(C&&h=="absolute")j.y-=i.body.offsetTop;for(k=a;(k=ua(k))&&k!=i.body&&k!=u;){j.x-=k.scrollLeft;j.y-=k.scrollTop}}e.x=j.x-g.x;e.y=j.y-g.y}else{g=m(a.f)=="function";j=a;if(a.targetTouches)j=a.targetTouches[0];else if(g&&a.f().targetTouches)j=
-a.f().targetTouches[0];e.x=j.clientX;e.y=j.clientY}var n=c||{};c=(n.x||0)+e.x;e=(n.y||0)+e.y;g=n.button||0;j=n.bubble||true;h=null;if(A(Ga,b)>=0)h=n.related||null;i=!!n.alt;u=!!n.control;k=!!n.shift;n=!!n.meta;if(a.fireEvent&&d&&d.createEventObject){a=d.createEventObject();a.altKey=i;a.m=u;a.metaKey=n;a.shiftKey=k;a.clientX=c;a.clientY=e;a.button=g;a.relatedTarget=h}else{a=d.createEvent("MouseEvents");if(a.initMouseEvent)a.initMouseEvent(b,j,true,f,1,0,0,c,e,u,i,k,n,g,h);else{a.initEvent(b,j,true);
-a.shiftKey=k;a.metaKey=n;a.altKey=i;a.ctrlKey=u;a.button=g}}return a}function U(a,b,c){var d=c||{};c=d.keyCode||0;var f=d.charCode||0,e=!!d.alt,g=!!d.ctrl,h=!!d.shift;d=!!d.meta;a=H(a).createEvent("Events");a.initEvent(b,true,true);a.charCode=f;a.keyCode=c;a.altKey=e;a.ctrlKey=g;a.metaKey=d;a.shiftKey=h;return a}
-function Ha(a,b,c){var d=H(a),f=c||{};c=f.bubble!==false;var e=!!f.alt,g=!!f.control,h=!!f.shift;f=!!f.meta;if(a.fireEvent&&d&&d.createEventObject){a=d.createEventObject();a.altKey=e;a.n=g;a.metaKey=f;a.shiftKey=h}else{a=d.createEvent("HTMLEvents");a.initEvent(b,c,true);a.shiftKey=h;a.metaKey=f;a.altKey=e;a.ctrlKey=g}return a}var V={};V.click=T;V.keydown=U;V.keypress=U;V.keyup=U;V.mousedown=T;V.mousemove=T;V.mouseout=T;V.mouseover=T;V.mouseup=T;
-function Ia(a,b,c){c=(V[b]||Ha)(a,b,c);if(m(a.fireEvent)=="function"||q(a.fireEvent)){try{(H(a)?H(a).parentWindow||H(a).defaultView:window).event=c}catch(d){}a=a.fireEvent("on"+b,c)}else a=a.dispatchEvent(c);return a};function Ja(a){var b;if(P(a,"OPTION"))b=true;else if(P(a,"INPUT")){b=a.type.toLowerCase();b=b=="checkbox"||b=="radio"}else b=false;if(!b)throw new v(15,"Element is not selectable");b="selected";var c=a.type&&a.type.toLowerCase();if("checkbox"==c||"radio"==c)b="checked";b=va[b]||b;a=a[b];a=a===undefined&&A(wa,b)>=0?false:a;return!!a}function Ka(a){return P(a,"SELECT")}
-function La(a,b){if(!Aa(a))throw new v(12,"Element is not currently enabled and may not be manipulated");if(!S(a,true))throw new v(11,"Element is not currently visible and may not be manipulated");if(P(a,"INPUT")){var c=a.type.toLowerCase();if(c=="checkbox"||c=="radio"){if(a.checked!=b){if(a.type=="radio"&&!b)throw new v(12,"You may not deselect a radio button");if(b!=Ja(a)){a.checked=b;Ia(a,"change")}}}else throw new v(15,"You may not select an unselectable input element: "+a.type);}else if(P(a,
-"OPTION")){c=I(a,Ka);if(!c.multiple&&!b)throw new v(15,"You may not deselect an option within a select that does not support multiple selections.");if(b!=Ja(a)){a.selected=b;Ia(c,"change")}}else throw new v(15,"You may not select an unselectable element: "+a.tagName);};function W(a){switch(m(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return B(a,W);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=Ma(a);return b}if(o(a))return B(a,W);a=da(a,function(c,d){return typeof d=="number"||p(d)});return t(a,W);default:return null}}
-function X(a,b){if(m(a)=="array")return B(a,function(c){return X(c,b)});else if(q(a))return"ELEMENT"in a?Na(a.ELEMENT,b):t(a,function(c){return X(c,b)});return a}function Oa(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.j=aa()}return b}function Ma(a){var b=Oa(a.ownerDocument),c=ea(b,function(d){return d==a});if(!c){c=":wdc:"+b.j++;b[c]=a}return c}
-function Na(a,b){a=decodeURIComponent(a);var c=b||document,d=Oa(c);if(!(a in d))throw new v(10,"Element does not exist in cache");var f=d[a];for(var e=f;e;){if(e==c.documentElement)return f;e=e.parentNode}delete d[a];throw new v(10,"Element is no longer attached to the DOM");};function Pa(a,b){var c=La,d=[a,b];try{if(p(c))c=new Function(c);var f=X(d),e=c.apply(null,f);W(e)}catch(g){}}var Y="_".split("."),Z=l;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)if(!Y.length&&Pa!==undefined)Z[$]=Pa;else Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/submit_android.js b/core/res/res/raw/submit_android.js
deleted file mode 100644
index 8dd2e3b6..0000000
--- a/core/res/res/raw/submit_android.js
+++ /dev/null
@@ -1,29 +0,0 @@
-function(){return function(){var m,o=this;function p(){}
-function r(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
-else if(b=="function"&&typeof a.call=="undefined")return"object";return b}function aa(a){var b=r(a);return b=="array"||b=="object"&&typeof a.length=="number"}function s(a){return typeof a=="string"}function t(a){return r(a)=="function"}function u(a){a=r(a);return a=="object"||a=="array"||a=="function"}function v(a){return a[ba]||(a[ba]=++ca)}var ba="closure_uid_"+Math.floor(Math.random()*2147483648).toString(36),ca=0,da=Date.now||function(){return+new Date};
-function w(a,b){function c(){}c.prototype=b.prototype;a.r=b.prototype;a.prototype=new c};function x(a){this.stack=Error().stack||"";if(a)this.message=String(a)}w(x,Error);x.prototype.name="CustomError";function ea(a,b,c){var d={};for(var f in a)if(b.call(c,a[f],f,a))d[f]=a[f];return d}function fa(a,b,c){var d={};for(var f in a)d[f]=b.call(c,a[f],f,a);return d}function ga(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function y(a,b){x.call(this,b);this.code=a;this.name=z[a]||z[13]}w(y,x);var z,ha={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},ia={};for(var ja in ha)ia[ha[ja]]=ja;z=ia;
-y.prototype.toString=function(){return"["+this.name+"] "+this.message};function ka(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a}
-function la(a,b){var c=0,d=String(a).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),f=String(b).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),e=Math.max(d.length,f.length);for(var g=0;c==0&&g<e;g++){var j=d[g]||"",i=f[g]||"",h=RegExp("(\\d*)(\\D*)","g"),n=RegExp("(\\d*)(\\D*)","g");do{var k=h.exec(j)||["","",""],l=n.exec(i)||["","",""];if(k[0].length==0&&l[0].length==0)break;c=A(k[1].length==0?0:parseInt(k[1],10),l[1].length==0?0:parseInt(l[1],10))||A(k[2].length==0,l[2].length==0)||A(k[2],l[2])}while(c==
-0)}return c}function A(a,b){if(a<b)return-1;else if(a>b)return 1;return 0};function B(a,b){b.unshift(a);x.call(this,ka.apply(null,b));b.shift();this.N=a}w(B,x);B.prototype.name="AssertionError";function C(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var f=c}throw new B(""+d,f||[]);}return a};var D=Array.prototype,ma=D.indexOf?function(a,b,c){C(a.length!=null);return D.indexOf.call(a,b,c)}:function(a,b,c){c=c==null?0:c<0?Math.max(0,a.length+c):c;if(s(a)){if(!s(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(c=c;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},na=D.map?function(a,b,c){C(a.length!=null);return D.map.call(a,b,c)}:function(a,b,c){var d=a.length,f=Array(d),e=s(a)?a.split(""):a;for(var g=0;g<d;g++)if(g in e)f[g]=b.call(c,e[g],g,a);return f};var oa=o.navigator,pa=(oa&&oa.platform||"").indexOf("Mac")!=-1,qa="",ra;if(ra=/WebKit\/(\S+)/){var sa=ra.exec(o.navigator?o.navigator.userAgent:null);qa=sa?sa[1]:""};var E;function F(a,b){this.x=a!==undefined?a:0;this.y=b!==undefined?b:0}F.prototype.toString=function(){return"("+this.x+", "+this.y+")"};function G(a){return a.nodeType==9?a:a.ownerDocument||a.document}function H(a){this.D=a||o.document||document}function ta(a){a=a.D.body;return new F(a.scrollLeft,a.scrollTop)};var ua="StopIteration"in o?o.StopIteration:Error("StopIteration");function va(){}va.prototype.next=function(){throw ua;};function I(a,b,c,d,f){this.a=!!b;a&&J(this,a,d);this.h=f!=undefined?f:this.d||0;if(this.a)this.h*=-1;this.C=!c}w(I,va);m=I.prototype;m.c=null;m.d=0;m.B=false;function J(a,b,c,d){if(a.c=b)a.d=typeof c=="number"?c:a.c.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.h=d}
-m.next=function(){var a;if(this.B){if(!this.c||this.C&&this.h==0)throw ua;a=this.c;var b=this.a?-1:1;if(this.d==b){var c=this.a?a.lastChild:a.firstChild;c?J(this,c):J(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?J(this,c):J(this,a.parentNode,b*-1);this.h+=this.d*(this.a?-1:1)}else this.B=true;a=this.c;if(!this.c)throw ua;return a};
-m.splice=function(){var a=this.c,b=this.a?1:-1;if(this.d==b){this.d=b*-1;this.h+=this.d*(this.a?-1:1)}this.a=!this.a;I.prototype.next.call(this);this.a=!this.a;b=aa(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function wa(a,b,c,d){I.call(this,a,b,c,null,d)}w(wa,I);wa.prototype.next=function(){do wa.r.next.call(this);while(this.d==-1);return this.c};function K(a,b){var c;a:{c=G(a);if(c.defaultView&&c.defaultView.getComputedStyle)if(c=c.defaultView.getComputedStyle(a,null)){c=c[b]||c.getPropertyValue(b);break a}c=""}return c||(a.currentStyle?a.currentStyle[b]:null)||a.style[b]}
-function xa(a){var b=G(a),c=K(a,"position"),d=c=="fixed"||c=="absolute";for(a=a.parentNode;a&&a!=b;a=a.parentNode){c=K(a,"position");d=d&&c=="static"&&a!=b.documentElement&&a!=b.body;if(!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||c=="fixed"||c=="absolute"))return a}return null};String.fromCharCode(160);var ya;var za=["dragstart","dragexit","mouseover","mouseout"];
-function L(a,b,c){var d=G(a),f=d?d.parentWindow||d.defaultView:window,e=new F;if(a.nodeType==1)if(a.getBoundingClientRect){var g=a.getBoundingClientRect();e.x=g.left;e.y=g.top}else{g=ta(a?new H(G(a)):E||(E=new H));var j,i=G(a);j=K(a,"position");var h=new F(0,0),n=(i?i.nodeType==9?i:G(i):document).documentElement;if(a!=n)if(a.getBoundingClientRect){j=a.getBoundingClientRect();i=ta(i?new H(G(i)):E||(E=new H));h.x=j.left+i.x;h.y=j.top+i.y}else if(i.getBoxObjectFor){j=i.getBoxObjectFor(a);i=i.getBoxObjectFor(n);
-h.x=j.screenX-i.screenX;h.y=j.screenY-i.screenY}else{var k=a;do{h.x+=k.offsetLeft;h.y+=k.offsetTop;if(k!=a){h.x+=k.clientLeft||0;h.y+=k.clientTop||0}if(K(k,"position")=="fixed"){h.x+=i.body.scrollLeft;h.y+=i.body.scrollTop;break}k=k.offsetParent}while(k&&k!=a);if(j=="absolute")h.y-=i.body.offsetTop;for(k=a;(k=xa(k))&&k!=i.body&&k!=n;){h.x-=k.scrollLeft;h.y-=k.scrollTop}}e.x=h.x-g.x;e.y=h.y-g.y}else{g=t(a.F);h=a;if(a.targetTouches)h=a.targetTouches[0];else if(g&&a.i.targetTouches)h=a.i.targetTouches[0];
-e.x=h.clientX;e.y=h.clientY}var l=c||{};c=(l.x||0)+e.x;e=(l.y||0)+e.y;g=l.button||0;h=l.bubble||true;j=null;if(ma(za,b)>=0)j=l.related||null;i=!!l.alt;n=!!l.control;k=!!l.shift;l=!!l.meta;if(a.fireEvent&&d&&d.createEventObject){a=d.createEventObject();a.altKey=i;a.K=n;a.metaKey=l;a.shiftKey=k;a.clientX=c;a.clientY=e;a.button=g;a.relatedTarget=j}else{a=d.createEvent("MouseEvents");if(a.initMouseEvent)a.initMouseEvent(b,h,true,f,1,0,0,c,e,n,i,k,l,g,j);else{a.initEvent(b,h,true);a.shiftKey=k;a.metaKey=
-l;a.altKey=i;a.ctrlKey=n;a.button=g}}return a}function Aa(a,b,c){var d=c||{};c=d.keyCode||0;var f=d.charCode||0,e=!!d.alt,g=!!d.ctrl,j=!!d.shift;d=!!d.meta;a=G(a).createEvent("Events");a.initEvent(b,true,true);a.charCode=f;a.keyCode=c;a.altKey=e;a.ctrlKey=g;a.metaKey=d;a.shiftKey=j;return a}
-function Ba(a,b,c){var d=G(a),f=c||{};c=f.bubble!==false;var e=!!f.alt,g=!!f.control,j=!!f.shift;f=!!f.meta;if(a.fireEvent&&d&&d.createEventObject){a=d.createEventObject();a.altKey=e;a.L=g;a.metaKey=f;a.shiftKey=j}else{a=d.createEvent("HTMLEvents");a.initEvent(b,c,true);a.shiftKey=j;a.metaKey=f;a.altKey=e;a.ctrlKey=g}return a}var M={};M.click=L;M.keydown=Aa;M.keypress=Aa;M.keyup=Aa;M.mousedown=L;M.mousemove=L;M.mouseout=L;M.mouseover=L;M.mouseup=L;function Ca(a){a:{a=a;for(var b=0;a;){if(a&&a.nodeType==1&&a.tagName.toUpperCase()=="FORM"){a=a;break a}a=a.parentNode;b++}a=null}if(!a)throw new y(12,"Element was not in a form, so could not submit.");b=a;var c=(M.submit||Ba)(b,"submit",void 0);if(t(b.fireEvent)||u(b.fireEvent)){try{(G(b)?G(b).parentWindow||G(b).defaultView:window).event=c}catch(d){}b=b.fireEvent("onsubmit",c)}else b=b.dispatchEvent(c);b&&a.submit()};var Da=[];function N(){if(Ea)Fa[v(this)]=this}var Ea=false,Fa={};N.prototype.u=false;N.prototype.l=function(){if(!this.u){this.u=true;this.g();if(Ea){var a=v(this);if(!Fa.hasOwnProperty(a))throw Error(this+" did not call the goog.Disposable base constructor or was disposed of after a clearUndisposedObjects call");delete Fa[a]}}};N.prototype.g=function(){};function O(a,b){N.call(this);this.type=a;this.currentTarget=this.target=b}w(O,N);O.prototype.g=function(){delete this.type;delete this.target;delete this.currentTarget};O.prototype.q=false;O.prototype.I=true;new Function("a","return a");function P(a,b){a&&this.n(a,b)}w(P,O);m=P.prototype;m.target=null;m.relatedTarget=null;m.offsetX=0;m.offsetY=0;m.clientX=0;m.clientY=0;m.screenX=0;m.screenY=0;m.button=0;m.keyCode=0;m.charCode=0;m.ctrlKey=false;m.altKey=false;m.shiftKey=false;m.metaKey=false;m.H=false;m.i=null;
-m.n=function(a,b){var c=this.type=a.type;O.call(this,c);this.target=a.target||a.srcElement;this.currentTarget=b;var d=a.relatedTarget;if(!d)if(c=="mouseover")d=a.fromElement;else if(c=="mouseout")d=a.toElement;this.relatedTarget=d;this.offsetX=a.offsetX!==undefined?a.offsetX:a.layerX;this.offsetY=a.offsetY!==undefined?a.offsetY:a.layerY;this.clientX=a.clientX!==undefined?a.clientX:a.pageX;this.clientY=a.clientY!==undefined?a.clientY:a.pageY;this.screenX=a.screenX||0;this.screenY=a.screenY||0;this.button=
-a.button;this.keyCode=a.keyCode||0;this.charCode=a.charCode||(c=="keypress"?a.keyCode:0);this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=a.metaKey;this.H=pa?a.metaKey:a.ctrlKey;this.J=a.J;this.i=a;delete this.I;delete this.q};m.F=function(){return this.i};m.g=function(){P.r.g.call(this);this.relatedTarget=this.currentTarget=this.target=this.i=null};function Ga(){}var Ha=0;m=Ga.prototype;m.key=0;m.k=false;m.s=false;m.n=function(a,b,c,d,f,e){if(t(a))this.v=true;else if(a&&a.handleEvent&&t(a.handleEvent))this.v=false;else throw Error("Invalid listener argument");this.o=a;this.A=b;this.src=c;this.type=d;this.capture=!!f;this.G=e;this.s=false;this.key=++Ha;this.k=false};m.handleEvent=function(a){if(this.v)return this.o.call(this.G||this.src,a);return this.o.handleEvent.call(this.o,a)};function Q(a,b){N.call(this);this.w=b;this.e=[];if(a>this.w)throw Error("[goog.structs.SimplePool] Initial cannot be greater than max");for(var c=0;c<a;c++)this.e.push(this.b?this.b():{})}w(Q,N);Q.prototype.b=null;Q.prototype.t=null;function Ia(a){if(a.e.length)return a.e.pop();return a.b?a.b():{}}function R(a,b){a.e.length<a.w?a.e.push(b):Ja(a,b)}function Ja(a,b){if(a.t)a.t(b);else if(u(b))if(t(b.l))b.l();else for(var c in b)delete b[c]}
-Q.prototype.g=function(){Q.r.g.call(this);for(var a=this.e;a.length;)Ja(this,a.pop());delete this.e};var Ka;var La=(Ka="ScriptEngine"in o&&o.ScriptEngine()=="JScript")?o.ScriptEngineMajorVersion()+"."+o.ScriptEngineMinorVersion()+"."+o.ScriptEngineBuildVersion():"0";var S,Ma,T,Na,Oa,Pa,Qa,Ra;
-(function(){function a(){return{f:0,j:0}}function b(){return[]}function c(){function l(q){return g.call(l.src,l.key,q)}return l}function d(){return new Ga}function f(){return new P}var e=Ka&&!(la(La,"5.7")>=0),g;Na=function(l){g=l};if(e){S=function(l){R(j,l)};Ma=function(){return Ia(i)};T=function(l){R(i,l)};Oa=function(){R(h,c())};Pa=function(l){R(n,l)};Qa=function(){return Ia(k)};Ra=function(l){R(k,l)};var j=new Q(0,600);j.b=a;var i=new Q(0,600);i.b=b;var h=new Q(0,600);h.b=c;var n=new Q(0,600);
-n.b=d;var k=new Q(0,600);k.b=f}else{S=p;Ma=b;Pa=Oa=T=p;Qa=f;Ra=p}})();var U={},V={},Sa={},Ta={};function Ua(a,b,c,d){if(!d.m)if(d.z){var f=0;for(var e=0;f<d.length;f++)if(d[f].k){var g=d[f].A;g.src=null;Oa(g);Pa(d[f])}else{if(f!=e)d[e]=d[f];e++}d.length=e;d.z=false;if(e==0){T(d);delete V[a][b][c];V[a][b].f--;if(V[a][b].f==0){S(V[a][b]);delete V[a][b];V[a].f--}if(V[a].f==0){S(V[a]);delete V[a]}}}}function Va(a){if(a in Ta)return Ta[a];return Ta[a]="on"+a}
-function Wa(a,b,c,d,f){var e=1;b=v(b);if(a[b]){a.j--;a=a[b];if(a.m)a.m++;else a.m=1;try{var g=a.length;for(var j=0;j<g;j++){var i=a[j];if(i&&!i.k)e&=Xa(i,f)!==false}}finally{a.m--;Ua(c,d,b,a)}}return Boolean(e)}
-function Xa(a,b){var c=a.handleEvent(b);if(a.s){var d=a.key;if(U[d]){var f=U[d];if(!f.k){var e=f.src,g=f.type,j=f.A,i=f.capture;if(e.removeEventListener){if(e==o||!e.M)e.removeEventListener(g,j,i)}else e.detachEvent&&e.detachEvent(Va(g),j);e=v(e);j=V[g][i][e];if(Sa[e]){var h=Sa[e],n=ma(h,f);if(n>=0){C(h.length!=null);D.splice.call(h,n,1)}h.length==0&&delete Sa[e]}f.k=true;j.z=true;Ua(g,i,e,j);delete U[d]}}}return c}
-function W(a,b){if(!U[a])return true;var c=U[a],d=c.type,f=V;if(!(d in f))return true;f=f[d];var e,g;if(ya===undefined)ya=false;if(ya){var j;if(!(j=b))a:{j="window.event".split(".");var i=o;for(;e=j.shift();)if(i[e]!=null)i=i[e];else{j=null;break a}j=i}e=j;j=true in f;i=false in f;if(j){if(e.keyCode<0||e.returnValue!=undefined)return true;a:{var h=false;if(e.keyCode==0)try{e.keyCode=-1;break a}catch(n){h=true}if(h||e.returnValue==undefined)e.returnValue=true}}h=Qa();h.n(e,this);e=true;try{if(j){var k=
-Ma();for(var l=h.currentTarget;l;l=l.parentNode)k.push(l);g=f[true];g.j=g.f;for(var q=k.length-1;!h.q&&q>=0&&g.j;q--){h.currentTarget=k[q];e&=Wa(g,k[q],d,true,h)}if(i){g=f[false];g.j=g.f;for(q=0;!h.q&&q<k.length&&g.j;q++){h.currentTarget=k[q];e&=Wa(g,k[q],d,false,h)}}}else e=Xa(c,h)}finally{if(k){k.length=0;T(k)}h.l();Ra(h)}return e}d=new P(b,this);try{e=Xa(c,d)}finally{d.l()}return e}Na(W);Da[Da.length]=function(a){W=a(W);Na(W)};function Ya(){}
-function Za(a,b,c){switch(typeof b){case "string":$a(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(r(b)=="array"){var d=b.length;c.push("[");var f="";for(var e=0;e<d;e++){c.push(f);Za(a,b[e],c);f=","}c.push("]");break}c.push("{");d="";for(f in b)if(Object.prototype.hasOwnProperty.call(b,f)){e=b[f];if(typeof e!="function"){c.push(d);$a(a,f,c);c.push(":");
-Za(a,e,c);d=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var ab={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},bb=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function $a(a,b,c){c.push('"',b.replace(bb,function(d){if(d in ab)return ab[d];var f=d.charCodeAt(0),e="\\u";if(f<16)e+="000";else if(f<256)e+="00";else if(f<4096)e+="0";return ab[d]=e+f.toString(16)}),'"')};function X(a){switch(r(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return na(a,X);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=cb(a);return b}if(aa(a))return na(a,X);a=ea(a,function(c,d){return typeof d=="number"||s(d)});return fa(a,X);default:return null}}
-function db(a,b){if(r(a)=="array")return na(a,function(c){return db(c,b)});else if(u(a))return"ELEMENT"in a?eb(a.ELEMENT,b):fa(a,function(c){return db(c,b)});return a}function fb(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.p=da()}if(!b.p)b.p=da();return b}function cb(a){var b=fb(a.ownerDocument),c=ga(b,function(d){return d==a});if(!c){c=":wdc:"+b.p++;b[c]=a}return c}
-function eb(a,b){a=decodeURIComponent(a);var c=b||document,d=fb(c);if(!(a in d))throw new y(10,"Element does not exist in cache");var f=d[a];for(var e=f;e;){if(e==c.documentElement)return f;e=e.parentNode}delete d[a];throw new y(10,"Element is no longer attached to the DOM");};function gb(a){var b=Ca;a=[a];var c;try{if(s(b))b=new Function(b);var d=db(a),f=b.apply(null,d);c={status:0,value:X(f)}}catch(e){c={status:"code"in e?e.code:13,value:{message:e.message}}}Za(new Ya,c,[])}var Y="_".split("."),Z=o;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)if(!Y.length&&gb!==undefined)Z[$]=gb;else Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/toggle_android.js b/core/res/res/raw/toggle_android.js
deleted file mode 100644
index d4da5b7..0000000
--- a/core/res/res/raw/toggle_android.js
+++ /dev/null
@@ -1,30 +0,0 @@
-function(){return function(){var l=this;
-function m(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if(b==
-"function"&&typeof a.call=="undefined")return"object";return b}function aa(a){var b=m(a);return b=="array"||b=="object"&&typeof a.length=="number"}function o(a){return typeof a=="string"}function ba(a){a=m(a);return a=="object"||a=="array"||a=="function"}Math.floor(Math.random()*2147483648).toString(36);var ca=Date.now||function(){return+new Date};function p(a,b){function c(){}c.prototype=b.prototype;a.k=b.prototype;a.prototype=new c};var da=window;function ea(){var a=l.Components;if(!a)return false;try{a.l["@mozilla.org/uuid-generator;1"].o(a.i.r);return true}catch(b){return false}};function q(a){this.stack=Error().stack||"";if(a)this.message=String(a)}p(q,Error);q.prototype.name="CustomError";function fa(a,b,c){var d={};for(var f in a)if(b.call(c,a[f],f,a))d[f]=a[f];return d}function ga(a,b,c){var d={};for(var f in a)d[f]=b.call(c,a[f],f,a);return d}function ha(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};function r(a,b){q.call(this,b);this.code=a;this.name=s[a]||s[13]}p(r,q);var s,ia={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,ModalDialogOpenError:27,ScriptTimeoutError:28},ja={};for(var ka in ia)ja[ia[ka]]=ka;s=ja;
-r.prototype.toString=function(){return"["+this.name+"] "+this.message};function la(a){for(var b=1;b<arguments.length;b++){var c=String(arguments[b]).replace(/\$/g,"$$$$");a=a.replace(/\%s/,c)}return a}var ma={};function na(a){return ma[a]||(ma[a]=String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()}))};function t(a,b){b.unshift(a);q.call(this,la.apply(null,b));b.shift();this.p=a}p(t,q);t.prototype.name="AssertionError";function v(a,b){if(!a){var c=Array.prototype.slice.call(arguments,2),d="Assertion failed";if(b){d+=": "+b;var f=c}throw new t(""+d,f||[]);}return a};var w=Array.prototype,x=w.indexOf?function(a,b,c){v(a.length!=null);return w.indexOf.call(a,b,c)}:function(a,b,c){c=c==null?0:c<0?Math.max(0,a.length+c):c;if(o(a)){if(!o(b)||b.length!=1)return-1;return a.indexOf(b,c)}for(c=c;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},y=w.map?function(a,b,c){v(a.length!=null);return w.map.call(a,b,c)}:function(a,b,c){var d=a.length,f=Array(d),e=o(a)?a.split(""):a;for(var g=0;g<d;g++)if(g in e)f[g]=b.call(c,e[g],g,a);return f},oa=w.some?function(a,b,c){v(a.length!=
-null);return w.some.call(a,b,c)}:function(a,b,c){var d=a.length,f=o(a)?a.split(""):a;for(var e=0;e<d;e++)if(e in f&&b.call(c,f[e],e,a))return true;return false};var z=true,pa="",A;if(z)A=/WebKit\/(\S+)/;if(A){var qa=A.exec(l.navigator?l.navigator.userAgent:null);pa=qa?qa[1]:""};var B;function C(a,b){this.x=a!==undefined?a:0;this.y=b!==undefined?b:0}C.prototype.toString=function(){return"("+this.x+", "+this.y+")"};function D(a,b){this.width=a;this.height=b}D.prototype.toString=function(){return"("+this.width+" x "+this.height+")"};D.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};function E(a){return a.nodeType==9?a:a.ownerDocument||a.document}function ra(a,b){var c=[];return sa(a,b,c,true)?c[0]:undefined}function sa(a,b,c,d){if(a!=null){var f=0;for(var e;e=a.childNodes[f];f++){if(b(e)){c.push(e);if(d)return true}if(sa(e,b,c,d))return true}}return false}function F(a,b,c,d){if(!c)a=a.parentNode;c=d==null;for(var f=0;a&&(c||f<=d);){if(b(a))return a;a=a.parentNode;f++}return null}function G(a){this.e=a||l.document||document}
-function ta(a){a=!z&&a.e.compatMode=="CSS1Compat"?a.e.documentElement:a.e.body;return new C(a.scrollLeft,a.scrollTop)};function ua(a,b){var c=function(d,f){var e=E(d);if(d.selectSingleNode){e.setProperty&&e.setProperty("SelectionLanguage","XPath");return d.selectSingleNode(f)}else if(e.implementation.hasFeature("XPath","3.0")){var g=e.createNSResolver(e.documentElement),h;if(typeof XPathResult!="undefined")h=XPathResult.FIRST_ORDERED_NODE_TYPE;else{if(!ea())throw Error("Document claims it supports XPath yet XPathResult is not defined. Please report this to Selenium developers");h=Components.i.q.FIRST_ORDERED_NODE_TYPE}return e.evaluate(f,
-d,g,h,null).singleNodeValue}return null}(b,a);if(!c)return null;if(c.nodeType!=1)throw Error("Returned node is not an element: "+a);return c};var H="StopIteration"in l?l.StopIteration:Error("StopIteration");function va(){}va.prototype.next=function(){throw H;};function I(a,b,c,d,f){this.a=!!b;a&&J(this,a,d);this.d=f!=undefined?f:this.c||0;if(this.a)this.d*=-1;this.h=!c}p(I,va);I.prototype.b=null;I.prototype.c=0;I.prototype.g=false;function J(a,b,c,d){if(a.b=b)a.c=typeof c=="number"?c:a.b.nodeType!=1?0:a.a?-1:1;if(typeof d=="number")a.d=d}
-I.prototype.next=function(){var a;if(this.g){if(!this.b||this.h&&this.d==0)throw H;a=this.b;var b=this.a?-1:1;if(this.c==b){var c=this.a?a.lastChild:a.firstChild;c?J(this,c):J(this,a,b*-1)}else(c=this.a?a.previousSibling:a.nextSibling)?J(this,c):J(this,a.parentNode,b*-1);this.d+=this.c*(this.a?-1:1)}else this.g=true;a=this.b;if(!this.b)throw H;return a};
-I.prototype.splice=function(){var a=this.b,b=this.a?1:-1;if(this.c==b){this.c=b*-1;this.d+=this.c*(this.a?-1:1)}this.a=!this.a;I.prototype.next.call(this);this.a=!this.a;b=aa(arguments[0])?arguments[0]:arguments;for(var c=b.length-1;c>=0;c--)a.parentNode&&a.parentNode.insertBefore(b[c],a.nextSibling);a&&a.parentNode&&a.parentNode.removeChild(a)};function K(a,b,c,d){I.call(this,a,b,c,null,d)}p(K,I);K.prototype.next=function(){do K.k.next.call(this);while(this.c==-1);return this.b};function wa(a,b){var c=E(a);if(c.defaultView&&c.defaultView.getComputedStyle)if(c=c.defaultView.getComputedStyle(a,null))return c[b]||c.getPropertyValue(b);return""}function L(a,b){return wa(a,b)||(a.currentStyle?a.currentStyle[b]:null)||a.style[b]}
-function xa(a){var b=E(a),c=L(a,"position"),d=c=="fixed"||c=="absolute";for(a=a.parentNode;a&&a!=b;a=a.parentNode){c=L(a,"position");d=d&&c=="static"&&a!=b.documentElement&&a!=b.body;if(!d&&(a.scrollWidth>a.clientWidth||a.scrollHeight>a.clientHeight||c=="fixed"||c=="absolute"))return a}return null};function M(a,b){return!!a&&a.nodeType==1&&(!b||a.tagName.toUpperCase()==b)}
-var ya={"class":"className",readonly:"readOnly"},za=["checked","disabled","draggable","hidden"],Aa=["async","autofocus","autoplay","checked","compact","complete","controls","declare","defaultchecked","defaultselected","defer","disabled","draggable","ended","formnovalidate","hidden","indeterminate","iscontenteditable","ismap","itemscope","loop","multiple","muted","nohref","noresize","noshade","novalidate","nowrap","open","paused","pubdate","readonly","required","reversed","scoped","seamless","seeking",
-"selected","spellcheck","truespeed","willvalidate"];function Ba(a,b){if(8==a.nodeType)return null;b=b.toLowerCase();if(b=="style"){var c=a.style.cssText.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").toLowerCase();return c.charAt(c.length-1)==";"?c:c+";"}c=a.getAttributeNode(b);if(!c)return null;if(x(Aa,b)>=0)return"true";return c.specified?c.value:null}var Ca=["BUTTON","INPUT","OPTGROUP","OPTION","SELECT","TEXTAREA"];
-function Da(a){var b=a.tagName.toUpperCase();if(!(x(Ca,b)>=0))return true;if(Ba(a,"disabled"))return false;if(a.parentNode&&a.parentNode.nodeType==1&&"OPTGROUP"==b||"OPTION"==b)return Da(a.parentNode);return true}function N(a){for(a=a.parentNode;a&&a.nodeType!=1&&a.nodeType!=9&&a.nodeType!=11;)a=a.parentNode;return M(a)?a:null}function O(a,b){b=na(String(b));return wa(a,b)||Ea(a,b)}
-function Ea(a,b){var c=(a.currentStyle||a.style)[b];if(c!="inherit")return c!==undefined?c:null;return(c=N(a))?Ea(c,b):null}function Fa(a){if(m(a.getBBox)=="function")return a.getBBox();var b;if(L(a,"display")!="none")b=new D(a.offsetWidth,a.offsetHeight);else{b=a.style;var c=b.display,d=b.visibility,f=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";var e;e=a.offsetWidth;a=a.offsetHeight;b.display=c;b.position=f;b.visibility=d;b=new D(e,a)}return b}
-function P(a,b){function c(e){if(O(e,"display")=="none")return false;e=N(e);return!e||c(e)}function d(e){var g=Fa(e);if(g.height>0&&g.width>0)return true;if(e.innerText||e.textContent)if(Ga.test(e.innerText||e.textContent))return true;return z&&oa(e.childNodes,function(h){return M(h)&&d(h)})}if(!M(a))throw Error("Argument to isShown must be of type Element");if(M(a,"TITLE"))return(E(a)?E(a).parentWindow||E(a).defaultView:window)==da;if(M(a,"OPTION")||M(a,"OPTGROUP")){var f=F(a,function(e){return M(e,
-"SELECT")});return!!f&&P(f)}if(M(a,"MAP")){if(!a.name)return false;f=E(a);f=f.evaluate?ua('/descendant::*[@usemap = "#'+a.name+'"]',f):ra(f,function(e){return M(e)&&Ba(e,"usemap")=="#"+a.name});return!!f&&P(f)}if(M(a,"AREA")){f=F(a,function(e){return M(e,"MAP")});return!!f&&P(f)}if(M(a,"INPUT")&&a.type.toLowerCase()=="hidden")return false;if(O(a,"visibility")=="hidden")return false;if(!c(a))return false;if(!b&&Ha(a)==0)return false;if(!d(a))return false;return true}
-var Ia="[\\s\\xa0"+String.fromCharCode(160)+"]+",Ga=RegExp("^"+Ia+"$");function Ha(a){var b=1,c=O(a,"opacity");if(c)b=Number(c);if(a=N(a))b*=Ha(a);return b};var Ja=["dragstart","dragexit","mouseover","mouseout"];
-function Q(a,b,c){var d=E(a),f=d?d.parentWindow||d.defaultView:window,e=new C;if(a.nodeType==1)if(a.getBoundingClientRect){var g=a.getBoundingClientRect();e.x=g.left;e.y=g.top}else{g=ta(a?new G(E(a)):B||(B=new G));var h,i=E(a);h=L(a,"position");var j=new C(0,0),u=(i?i.nodeType==9?i:E(i):document).documentElement;if(a!=u)if(a.getBoundingClientRect){h=a.getBoundingClientRect();i=ta(i?new G(E(i)):B||(B=new G));j.x=h.left+i.x;j.y=h.top+i.y}else if(i.getBoxObjectFor){h=i.getBoxObjectFor(a);i=i.getBoxObjectFor(u);
-j.x=h.screenX-i.screenX;j.y=h.screenY-i.screenY}else{var k=a;do{j.x+=k.offsetLeft;j.y+=k.offsetTop;if(k!=a){j.x+=k.clientLeft||0;j.y+=k.clientTop||0}if(z&&L(k,"position")=="fixed"){j.x+=i.body.scrollLeft;j.y+=i.body.scrollTop;break}k=k.offsetParent}while(k&&k!=a);if(z&&h=="absolute")j.y-=i.body.offsetTop;for(k=a;(k=xa(k))&&k!=i.body&&k!=u;){j.x-=k.scrollLeft;j.y-=k.scrollTop}}e.x=j.x-g.x;e.y=j.y-g.y}else{g=m(a.f)=="function";j=a;if(a.targetTouches)j=a.targetTouches[0];else if(g&&a.f().targetTouches)j=
-a.f().targetTouches[0];e.x=j.clientX;e.y=j.clientY}var n=c||{};c=(n.x||0)+e.x;e=(n.y||0)+e.y;g=n.button||0;j=n.bubble||true;h=null;if(x(Ja,b)>=0)h=n.related||null;i=!!n.alt;u=!!n.control;k=!!n.shift;n=!!n.meta;if(a.fireEvent&&d&&d.createEventObject){a=d.createEventObject();a.altKey=i;a.m=u;a.metaKey=n;a.shiftKey=k;a.clientX=c;a.clientY=e;a.button=g;a.relatedTarget=h}else{a=d.createEvent("MouseEvents");if(a.initMouseEvent)a.initMouseEvent(b,j,true,f,1,0,0,c,e,u,i,k,n,g,h);else{a.initEvent(b,j,true);
-a.shiftKey=k;a.metaKey=n;a.altKey=i;a.ctrlKey=u;a.button=g}}return a}function R(a,b,c){var d=c||{};c=d.keyCode||0;var f=d.charCode||0,e=!!d.alt,g=!!d.ctrl,h=!!d.shift;d=!!d.meta;a=E(a).createEvent("Events");a.initEvent(b,true,true);a.charCode=f;a.keyCode=c;a.altKey=e;a.ctrlKey=g;a.metaKey=d;a.shiftKey=h;return a}
-function Ka(a,b,c){var d=E(a),f=c||{};c=f.bubble!==false;var e=!!f.alt,g=!!f.control,h=!!f.shift;f=!!f.meta;if(a.fireEvent&&d&&d.createEventObject){a=d.createEventObject();a.altKey=e;a.n=g;a.metaKey=f;a.shiftKey=h}else{a=d.createEvent("HTMLEvents");a.initEvent(b,c,true);a.shiftKey=h;a.metaKey=f;a.altKey=e;a.ctrlKey=g}return a}var S={};S.click=Q;S.keydown=R;S.keypress=R;S.keyup=R;S.mousedown=Q;S.mousemove=Q;S.mouseout=Q;S.mouseover=Q;S.mouseup=Q;
-function La(a,b,c){c=(S[b]||Ka)(a,b,c);if(m(a.fireEvent)=="function"||ba(a.fireEvent)){try{(E(a)?E(a).parentWindow||E(a).defaultView:window).event=c}catch(d){}a=a.fireEvent("on"+b,c)}else a=a.dispatchEvent(c);return a};function T(a){var b;if(M(a,"OPTION"))b=true;else if(M(a,"INPUT")){b=a.type.toLowerCase();b=b=="checkbox"||b=="radio"}else b=false;if(!b)throw new r(15,"Element is not selectable");b="selected";var c=a.type&&a.type.toLowerCase();if("checkbox"==c||"radio"==c)b="checked";b=ya[b]||b;a=a[b];a=a===undefined&&x(za,b)>=0?false:a;return!!a}function Ma(a){return M(a,"SELECT")}
-function Na(a){if(M(a,"INPUT")&&"radio"==a.type)throw new r(12,"You may not toggle a radio button");var b=!T(a);if(!Da(a))throw new r(12,"Element is not currently enabled and may not be manipulated");if(!P(a,true))throw new r(11,"Element is not currently visible and may not be manipulated");if(M(a,"INPUT")){var c=a.type.toLowerCase();if(c=="checkbox"||c=="radio"){if(a.checked!=b){if(a.type=="radio"&&!b)throw new r(12,"You may not deselect a radio button");if(b!=T(a)){a.checked=b;La(a,"change")}}}else throw new r(15,
-"You may not select an unselectable input element: "+a.type);}else if(M(a,"OPTION")){c=F(a,Ma);if(!c.multiple&&!b)throw new r(15,"You may not deselect an option within a select that does not support multiple selections.");if(b!=T(a)){a.selected=b;La(c,"change")}}else throw new r(15,"You may not select an unselectable element: "+a.tagName);return T(a)};function Oa(){}
-function U(a,b,c){switch(typeof b){case "string":Pa(a,b,c);break;case "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.push(b);break;case "undefined":c.push("null");break;case "object":if(b==null){c.push("null");break}if(m(b)=="array"){var d=b.length;c.push("[");var f="";for(var e=0;e<d;e++){c.push(f);U(a,b[e],c);f=","}c.push("]");break}c.push("{");d="";for(f in b)if(Object.prototype.hasOwnProperty.call(b,f)){e=b[f];if(typeof e!="function"){c.push(d);Pa(a,f,c);c.push(":");U(a,
-e,c);d=","}}c.push("}");break;case "function":break;default:throw Error("Unknown type: "+typeof b);}}var V={'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},Qa=/\uffff/.test("\uffff")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;
-function Pa(a,b,c){c.push('"',b.replace(Qa,function(d){if(d in V)return V[d];var f=d.charCodeAt(0),e="\\u";if(f<16)e+="000";else if(f<256)e+="00";else if(f<4096)e+="0";return V[d]=e+f.toString(16)}),'"')};function W(a){switch(m(a)){case "string":case "number":case "boolean":return a;case "function":return a.toString();case "array":return y(a,W);case "object":a=a;if("nodeType"in a&&(a.nodeType==1||a.nodeType==9)){var b={};b.ELEMENT=Ra(a);return b}if(aa(a))return y(a,W);a=fa(a,function(c,d){return typeof d=="number"||o(d)});return ga(a,W);default:return null}}
-function X(a,b){if(m(a)=="array")return y(a,function(c){return X(c,b)});else if(ba(a))return"ELEMENT"in a?Sa(a.ELEMENT,b):ga(a,function(c){return X(c,b)});return a}function Ta(a){a=a||document;var b=a.$wdc_;if(!b){b=a.$wdc_={};b.j=ca()}return b}function Ra(a){var b=Ta(a.ownerDocument),c=ha(b,function(d){return d==a});if(!c){c=":wdc:"+b.j++;b[c]=a}return c}
-function Sa(a,b){a=decodeURIComponent(a);var c=b||document,d=Ta(c);if(!(a in d))throw new r(10,"Element does not exist in cache");var f=d[a];for(var e=f;e;){if(e==c.documentElement)return f;e=e.parentNode}delete d[a];throw new r(10,"Element is no longer attached to the DOM");};function Ua(a){var b=Na;a=[a];var c;try{if(o(b))b=new Function(b);var d=X(a),f=b.apply(null,d);c={status:0,value:W(f)}}catch(e){c={status:"code"in e?e.code:13,value:{message:e.message}}}b=[];U(new Oa,c,b);return b.join("")}var Y="_".split("."),Z=l;!(Y[0]in Z)&&Z.execScript&&Z.execScript("var "+Y[0]);for(var $;Y.length&&($=Y.shift());)if(!Y.length&&Ua!==undefined)Z[$]=Ua;else Z=Z[$]?Z[$]:Z[$]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
diff --git a/core/res/res/raw/webdriver_readme.txt b/core/res/res/raw/webdriver_readme.txt
deleted file mode 100644
index 5c4667d..0000000
--- a/core/res/res/raw/webdriver_readme.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-The JavaScript files *_android.js are used in frameworks/base/core/java/android/webkit/webdriver/
-. Those files contain closure compiled JavaScript from
-http://selenium.googlecode.com. They are under the Apache 2.0 licence:
-/** @license
-Copyright 2010 WebDriver committers
-Copyright 2010 Google Inc.
-
-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.
-*/
-
-The licence is not included in the compiled code to minimize the size
-of JavaScript injected into web pages.
-
-Those files can be generated by doing the following:
-$svn checkout http://selenium.googlecode.com/svn/trunk/ .
-$./go //javascript/webdriver-atoms/inject:<js_fragment_name>:android
-
-Where <js_fragment_name> should be replaced by the actual name of the fragment to
-generate. For example to generate is_selected_android.js, execute:
-$./go //javascript/webdriver-atoms/inject:is_selected:android
-
-The build file for those rules is under the following:
-http://code.google.com/p/selenium/source/browse/trunk/javascript/webdriver-atoms/inject/build.desc
-Every js_fragment rule generates a JavaScript file containing the corresponding
-JavaScript code snippet.
-
-The current version of the files was generated using revision 11823.
-
-Here is the build command list executed to generate those files:
-./go //javascript/webdriver-atoms/inject:find_element:android
-./go //javascript/webdriver-atoms/inject:find_elements:android
-./go //javascript/webdriver-atoms/inject:get_text:android
-./go //javascript/webdriver-atoms/inject:is_selected:android
-./go //javascript/webdriver-atoms/inject:get_top_left_coordinates:android
-./go //javascript/webdriver-atoms/inject:get_attribute_value:android
-./go //javascript/webdriver-atoms/inject:get_size:android
-./go //javascript/webdriver-atoms/inject:get_value_of_css_property:android
-./go //javascript/webdriver-atoms/inject:is_enabled:android
-./go //javascript/webdriver-atoms/inject:toggle:android
-./go //javascript/webdriver-atoms/inject:set_selected:android
-./go //javascript/webdriver-atoms/inject:is_displayed:android
-./go //javascript/webdriver-atoms:execute_script:android
-./go //javascript/webdriver-atoms/inject:submit:android
diff --git a/core/res/res/values-w720dp/dimens.xml b/core/res/res/values-w720dp/dimens.xml
index ec1195e..3d10103 100644
--- a/core/res/res/values-w720dp/dimens.xml
+++ b/core/res/res/values-w720dp/dimens.xml
@@ -28,5 +28,5 @@
     <!-- Minimum space to allocate to the left of a preference item for an icon.
         This helps in aligning titles when some items have icons and some don't. When space is
         at a premium, we don't pre-allocate any space. -->
-    <dimen name="preference_icon_minWidth">48dp</dimen>
+    <dimen name="preference_icon_minWidth">56dp</dimen>
 </resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 73443a0..3f67d1ba 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -89,7 +89,7 @@
 
     <!-- Whether dialogs should close automatically when the user touches outside
          of them.  This should not normally be modified. -->
-    <bool name="config_closeDialogWhenTouchOutside">false</bool>
+    <bool name="config_closeDialogWhenTouchOutside">true</bool>
 
     <!-- The duration (in milliseconds) that the radio will scan for a signal
          when there's no network connection. If the scan doesn't timeout, use zero -->
@@ -396,7 +396,7 @@
          If unlock screen is disabled, the puk should be unlocked through Emergency Dialer -->
     <bool name="config_enable_puk_unlock_screen">false</bool>
 
-    <!-- Control the behavior when the user long presses the power button.
+    <!-- Control the behavior when the user long presses the home button.
             0 - Nothing
             1 - Recent apps dialog
             2 - Recent apps view in SystemUI
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 829f757..9295388 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -108,6 +108,10 @@
     <!-- Preference activity, vertical padding for the header list -->
     <dimen name="preference_screen_header_vertical_padding">0dp</dimen>
 
+    <dimen name="preference_item_padding_side">8dip</dimen>
+    <dimen name="preference_item_padding_inner">8dip</dimen>
+    <dimen name="preference_child_padding_side">16dip</dimen>
+
     <!-- The platform's desired minimum size for a dialog's width when it
          is along the minor axis (that is the screen is portrait).  This may
          be either a fraction or a dimension. -->
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 71e302f..7d6d25c 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -474,6 +474,13 @@
       messages. Malicious applications may cost you money by sending
       messages without your confirmation.</string>
 
+     <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permlab_sendSmsNoConfirmation">send SMS messages with no confirmation</string>
+    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permdesc_sendSmsNoConfirmation">Allows application to send SMS
+      messages. Malicious applications may cost you money by sending
+      messages without your confirmation.</string>
+
     <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permlab_readSms">read SMS or MMS</string>
     <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
@@ -933,19 +940,19 @@
     <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permlab_readCalendar">read calendar events plus confidential information</string>
     <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
-    <string name="permdesc_readCalendar" product="tablet">Allows an application to read all calendar 
+    <string name="permdesc_readCalendar" product="tablet">Allows an application to read all calendar
         events stored on your tablet, including those of friends or coworkers. A malicious application with
         this permission can extract personal information from these calendars without the owners\' knowledge.</string>
     <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
-    <string name="permdesc_readCalendar" product="default">Allows an application to read all calendar 
+    <string name="permdesc_readCalendar" product="default">Allows an application to read all calendar
         events stored on your phone, including those of friends or coworkers. A malicious application with
         this permission can extract personal information from these calendars without the owners\' knowledge.</string>
 
     <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permlab_writeCalendar">add or modify calendar events and send email to guests without owners\' knowledge</string>
     <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
-    <string name="permdesc_writeCalendar">Allows an application to send event invitations as the calendar owner and add, remove, 
-        change events that you can modify on your device, including those of friends or co-workers. A malicious application with this permission 
+    <string name="permdesc_writeCalendar">Allows an application to send event invitations as the calendar owner and add, remove,
+        change events that you can modify on your device, including those of friends or co-workers. A malicious application with this permission
         can send spam emails that appear to come from calendar owners, modify events without the owners\' knowledge, or add fake events.</string>
 
     <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
@@ -1291,10 +1298,11 @@
       create network sockets.</string>
 
     <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
-    <string name="permlab_writeApnSettings">write Access Point Name settings</string>
+    <string name="permlab_writeApnSettings">change/intercept network settings and traffic</string>
     <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
-    <string name="permdesc_writeApnSettings">Allows an application to modify the APN
-        settings, such as Proxy and Port of any APN.</string>
+    <string name="permdesc_writeApnSettings">Allows an application to change network settings and to intercept and inspect all network traffic, 
+      for example to change the proxy and port of any APN. Malicious applications could monitor, redirect, or modify network 
+      packets without your knowledge.</string>
 
     <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permlab_changeNetworkState">change network connectivity</string>
@@ -2619,7 +2627,7 @@
     <!-- See SIM_REMOVED_DIALOG.  This is the title of that dialog. -->
     <string name="sim_removed_title">SIM card removed</string>
     <!-- See SIM_REMOVED_DIALOG.  This is the message of that dialog. -->
-    <string name="sim_removed_message">The mobile network will be unavailable until you replace the SIM card.</string>
+    <string name="sim_removed_message">The mobile network will be unavailable until you restart with a valid SIM card inserted.</string>
     <!-- See SIM_REMOVED_DIALOG.  This is the button of that dialog. -->
     <string name="sim_done_button">Done</string>
     <!-- See SIM_ADDED_DIALOG.  This is the title of that dialog. -->
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 8ff9d46..d20d16c 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -1516,7 +1516,7 @@
         <item name="android:paddingBottom">0dip</item>
         <item name="divider">?android:attr/dividerVertical</item>
         <item name="showDividers">middle</item>
-        <item name="dividerPadding">8dip</item>
+        <item name="dividerPadding">12dip</item>
         <item name="background">@null</item>
     </style>
 
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index bf6329d..94d2c38 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -420,4 +420,8 @@
     <style name="Theme.DeviceDefault.Light.SearchBar" parent="Theme.DeviceDefault.Light.SearchBar">
 
     </style>
+
+    <style name="Theme.DeviceDefault.Dialog.NoFrame" parent="Theme.Holo.Dialog.NoFrame">
+    </style>
+
 </resources>
diff --git a/data/fonts/DroidSansThai.ttf b/data/fonts/DroidSansThai.ttf
index f849bae..c078be0 100644
--- a/data/fonts/DroidSansThai.ttf
+++ b/data/fonts/DroidSansThai.ttf
Binary files differ
diff --git a/data/fonts/system_fonts.xml b/data/fonts/system_fonts.xml
index 76a5002..d2fe546 100644
--- a/data/fonts/system_fonts.xml
+++ b/data/fonts/system_fonts.xml
@@ -55,15 +55,15 @@
         </fileset>
     </family>
 
-	<family>
-		<nameset>
-			<name>Droid Sans</name>
-		</nameset>
-		<fileset>
-			<file>DroidSans.ttf</file>
-			<file>DroidSans-Bold.ttf</file>
-		</fileset>
-	</family>
+    <family>
+        <nameset>
+            <name>Droid Sans</name>
+        </nameset>
+        <fileset>
+            <file>DroidSans.ttf</file>
+            <file>DroidSans-Bold.ttf</file>
+        </fileset>
+    </family>
 
     <family>
         <nameset>
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 828bafd..cde997e 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -20,6 +20,7 @@
 import android.text.SpannableString;
 import android.text.SpannedString;
 import android.text.TextUtils;
+import android.util.DisplayMetrics;
 
 /**
  * The Paint class holds the style and color information about how to draw
@@ -106,6 +107,16 @@
     static final int DEFAULT_PAINT_FLAGS = DEV_KERN_TEXT_FLAG;
 
     /**
+     * Option for {@link #setHinting}: disable hinting.
+     */
+    public static final int HINTING_OFF = 0x0;
+
+    /**
+     * Option for {@link #setHinting}: enable hinting.
+     */
+    public static final int HINTING_ON = 0x1;
+
+    /**
      * Bidi flag to set LTR paragraph direction.
      * 
      * @hide
@@ -333,6 +344,8 @@
     public Paint(int flags) {
         mNativePaint = native_init();
         setFlags(flags | DEFAULT_PAINT_FLAGS);
+        setHinting(DisplayMetrics.DENSITY_DEVICE >= DisplayMetrics.DENSITY_TV
+                ? HINTING_OFF : HINTING_ON);
         mCompatScaling = mInvCompatScaling = 1;
     }
 
@@ -367,6 +380,8 @@
     public void reset() {
         native_reset(mNativePaint);
         setFlags(DEFAULT_PAINT_FLAGS);
+        setHinting(DisplayMetrics.DENSITY_DEVICE >= DisplayMetrics.DENSITY_TV
+                ? HINTING_OFF : HINTING_ON);
         mHasCompatScaling = false;
         mCompatScaling = mInvCompatScaling = 1;
         mBidiFlags = BIDI_DEFAULT_LTR;
@@ -446,6 +461,18 @@
     public native void setFlags(int flags);
 
     /**
+     * Return the paint's hinting mode.  Returns either
+     * {@link #HINTING_OFF} or {@link #HINTING_ON}.
+     */
+    public native int getHinting();
+
+    /**
+     * Set the paint's hinting mode.  May be either
+     * {@link #HINTING_OFF} or {@link #HINTING_ON}.
+     */
+    public native void setHinting(int mode);
+
+    /**
      * Helper for getFlags(), returning true if ANTI_ALIAS_FLAG bit is set
      * AntiAliasing smooths out the edges of what is being drawn, but is has
      * no impact on the interior of the shape. See setDither() and
diff --git a/include/utils/RefBase.h b/include/utils/RefBase.h
index ca17082..c7a9b78 100644
--- a/include/utils/RefBase.h
+++ b/include/utils/RefBase.h
@@ -80,9 +80,12 @@
         void                incWeak(const void* id);
         void                decWeak(const void* id);
         
+        // acquires a strong reference if there is already one.
         bool                attemptIncStrong(const void* id);
         
-        //! This is only safe if you have set OBJECT_LIFETIME_FOREVER.
+        // acquires a weak reference if there is already one.
+        // This is not always safe. see ProcessState.cpp and BpBinder.cpp
+        // for proper use.
         bool                attemptIncWeak(const void* id);
 
         //! DEBUGGING ONLY: Get current weak ref count.
@@ -116,28 +119,15 @@
 
     typedef RefBase basetype;
 
-    // used to override the RefBase destruction.
-    class Destroyer {
-        friend class RefBase;
-        friend class weakref_type;
-    public:
-        virtual ~Destroyer();
-    private:
-        virtual void destroy(RefBase const* base) = 0;
-    };
-
-    // Make sure to never acquire a strong reference from this function. The
-    // same restrictions than for destructors apply.
-    void setDestroyer(Destroyer* destroyer);
-
 protected:
                             RefBase();
     virtual                 ~RefBase();
 
     //! Flags for extendObjectLifetime()
     enum {
+        OBJECT_LIFETIME_STRONG  = 0x0000,
         OBJECT_LIFETIME_WEAK    = 0x0001,
-        OBJECT_LIFETIME_FOREVER = 0x0003
+        OBJECT_LIFETIME_MASK    = 0x0001
     };
     
             void            extendObjectLifetime(int32_t mode);
@@ -163,7 +153,7 @@
     
                             RefBase(const RefBase& o);
             RefBase&        operator=(const RefBase& o);
-            
+
         weakref_impl* const mRefs;
 };
 
diff --git a/libs/hwui/GradientCache.h b/libs/hwui/GradientCache.h
index 45c1005..7339853 100644
--- a/libs/hwui/GradientCache.h
+++ b/libs/hwui/GradientCache.h
@@ -38,28 +38,27 @@
 
     GradientCacheEntry(uint32_t* colors, float* positions, int count,
             SkShader::TileMode tileMode) {
-        this->count = count;
-        this->colors = new uint32_t[count];
-        this->positions = new float[count];
-        this->tileMode = tileMode;
-
-        memcpy(this->colors, colors, count * sizeof(uint32_t));
-        memcpy(this->positions, positions, count * sizeof(float));
+        copy(colors, positions, count, tileMode);
     }
 
     GradientCacheEntry(const GradientCacheEntry& entry) {
-        this->count = entry.count;
-        this->colors = new uint32_t[count];
-        this->positions = new float[count];
-        this->tileMode = entry.tileMode;
-
-        memcpy(this->colors, entry.colors, count * sizeof(uint32_t));
-        memcpy(this->positions, entry.positions, count * sizeof(float));
+        copy(entry.colors, entry.positions, entry.count, entry.tileMode);
     }
 
     ~GradientCacheEntry() {
-        if (colors) delete[] colors;
-        if (positions) delete[] positions;
+        delete[] colors;
+        delete[] positions;
+    }
+
+    GradientCacheEntry& operator=(const GradientCacheEntry& entry) {
+        if (this != &entry) {
+            delete[] colors;
+            delete[] positions;
+
+            copy(entry.colors, entry.positions, entry.count, entry.tileMode);
+        }
+
+        return *this;
     }
 
     bool operator<(const GradientCacheEntry& r) const {
@@ -82,6 +81,18 @@
     int count;
     SkShader::TileMode tileMode;
 
+private:
+
+    void copy(uint32_t* colors, float* positions, int count, SkShader::TileMode tileMode) {
+        this->count = count;
+        this->colors = new uint32_t[count];
+        this->positions = new float[count];
+        this->tileMode = tileMode;
+
+        memcpy(this->colors, colors, count * sizeof(uint32_t));
+        memcpy(this->positions, positions, count * sizeof(float));
+    }
+
 }; // GradientCacheEntry
 
 /**
diff --git a/libs/hwui/LayerCache.h b/libs/hwui/LayerCache.h
index a0eae59..63bb824 100644
--- a/libs/hwui/LayerCache.h
+++ b/libs/hwui/LayerCache.h
@@ -119,10 +119,6 @@
             mHeight = uint32_t(ceilf(layerHeight / float(LAYER_SIZE)) * LAYER_SIZE);
         }
 
-        LayerEntry(const LayerEntry& entry):
-            mLayer(entry.mLayer), mWidth(entry.mWidth), mHeight(entry.mHeight) {
-        }
-
         LayerEntry(Layer* layer):
             mLayer(layer), mWidth(layer->getWidth()), mHeight(layer->getHeight()) {
         }
diff --git a/libs/hwui/PatchCache.h b/libs/hwui/PatchCache.h
index 62d0ce1..91b603f 100644
--- a/libs/hwui/PatchCache.h
+++ b/libs/hwui/PatchCache.h
@@ -80,13 +80,6 @@
                 emptyCount(emptyCount), colorKey(colorKey) {
         }
 
-        PatchDescription(const PatchDescription& description):
-                bitmapWidth(description.bitmapWidth), bitmapHeight(description.bitmapHeight),
-                pixelWidth(description.pixelWidth), pixelHeight(description.pixelHeight),
-                xCount(description.xCount), yCount(description.yCount),
-                emptyCount(description.emptyCount), colorKey(description.colorKey) {
-        }
-
         bool operator<(const PatchDescription& rhs) const {
             LTE_FLOAT(bitmapWidth) {
                 LTE_FLOAT(bitmapHeight) {
diff --git a/libs/hwui/PathCache.h b/libs/hwui/PathCache.h
index 7ff8b74..4904a58 100644
--- a/libs/hwui/PathCache.h
+++ b/libs/hwui/PathCache.h
@@ -41,10 +41,6 @@
         path = NULL;
     }
 
-    PathCacheEntry(const PathCacheEntry& entry): ShapeCacheEntry(entry) {
-        path = entry.path;
-    }
-
     bool lessThan(const ShapeCacheEntry& r) const {
         const PathCacheEntry& rhs = (const PathCacheEntry&) r;
         LTE_INT(path) {
diff --git a/libs/hwui/ShapeCache.h b/libs/hwui/ShapeCache.h
index 33953be..0660b69 100644
--- a/libs/hwui/ShapeCache.h
+++ b/libs/hwui/ShapeCache.h
@@ -96,12 +96,6 @@
         pathEffect = NULL;
     }
 
-    ShapeCacheEntry(const ShapeCacheEntry& entry):
-        shapeType(entry.shapeType), join(entry.join), cap(entry.cap),
-        style(entry.style), miter(entry.miter),
-        strokeWidth(entry.strokeWidth), pathEffect(entry.pathEffect) {
-    }
-
     ShapeCacheEntry(ShapeType type, SkPaint* paint) {
         shapeType = type;
         join = paint->getStrokeJoin();
@@ -167,14 +161,6 @@
         mRy = 0;
     }
 
-    RoundRectShapeCacheEntry(const RoundRectShapeCacheEntry& entry):
-            ShapeCacheEntry(entry) {
-        mWidth = entry.mWidth;
-        mHeight = entry.mHeight;
-        mRx = entry.mRx;
-        mRy = entry.mRy;
-    }
-
     bool lessThan(const ShapeCacheEntry& r) const {
         const RoundRectShapeCacheEntry& rhs = (const RoundRectShapeCacheEntry&) r;
         LTE_INT(mWidth) {
@@ -206,11 +192,6 @@
         mRadius = 0;
     }
 
-    CircleShapeCacheEntry(const CircleShapeCacheEntry& entry):
-            ShapeCacheEntry(entry) {
-        mRadius = entry.mRadius;
-    }
-
     bool lessThan(const ShapeCacheEntry& r) const {
         const CircleShapeCacheEntry& rhs = (const CircleShapeCacheEntry&) r;
         LTE_INT(mRadius) {
@@ -234,12 +215,6 @@
         mWidth = mHeight = 0;
     }
 
-    OvalShapeCacheEntry(const OvalShapeCacheEntry& entry):
-            ShapeCacheEntry(entry) {
-        mWidth = entry.mWidth;
-        mHeight = entry.mHeight;
-    }
-
     bool lessThan(const ShapeCacheEntry& r) const {
         const OvalShapeCacheEntry& rhs = (const OvalShapeCacheEntry&) r;
         LTE_INT(mWidth) {
@@ -266,12 +241,6 @@
         mWidth = mHeight = 0;
     }
 
-    RectShapeCacheEntry(const RectShapeCacheEntry& entry):
-            ShapeCacheEntry(entry) {
-        mWidth = entry.mWidth;
-        mHeight = entry.mHeight;
-    }
-
     bool lessThan(const ShapeCacheEntry& r) const {
         const RectShapeCacheEntry& rhs = (const RectShapeCacheEntry&) r;
         LTE_INT(mWidth) {
@@ -306,15 +275,6 @@
         mUseCenter = 0;
     }
 
-    ArcShapeCacheEntry(const ArcShapeCacheEntry& entry):
-            ShapeCacheEntry(entry) {
-        mWidth = entry.mWidth;
-        mHeight = entry.mHeight;
-        mStartAngle = entry.mStartAngle;
-        mSweepAngle = entry.mSweepAngle;
-        mUseCenter = entry.mUseCenter;
-    }
-
     bool lessThan(const ShapeCacheEntry& r) const {
         const ArcShapeCacheEntry& rhs = (const ArcShapeCacheEntry&) r;
         LTE_INT(mWidth) {
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index f3e0c0a..b59ade8 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -58,6 +58,19 @@
 }
 
 Allocation::~Allocation() {
+    if (mHal.state.hasReferences &&
+        (mHal.state.hasFaces || mHal.state.hasMipmaps)) {
+        LOGE("Cube/mip allocation with references unsupported, memory not cleaned up!");
+    }
+
+    uint32_t elemCount = mHal.state.dimensionX;
+    if (mHal.state.dimensionY > 1) {
+        elemCount *= mHal.state.dimensionY;
+    }
+    if (mHal.state.dimensionZ > 1) {
+        elemCount *= mHal.state.dimensionZ;
+    }
+    decRefs(getPtr(), elemCount, 0);
     mRSC->mHal.funcs.allocation.destroy(mRSC, this);
 }
 
@@ -270,6 +283,9 @@
 }
 
 void Allocation::decRefs(const void *ptr, size_t ct, size_t startOff) const {
+    if (!mHal.state.hasReferences || !getIsScript()) {
+        return;
+    }
     const uint8_t *p = static_cast<const uint8_t *>(ptr);
     const Element *e = mHal.state.type->getElement();
     uint32_t stride = e->getSizeBytes();
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 6a30b17..bffe3c0 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -245,20 +245,32 @@
 
     rsc->mRunning = true;
     bool mDraw = true;
+    bool doWait = true;
+
+    uint64_t targetTime = rsc->getTime();
     while (!rsc->mExit) {
-        mDraw |= rsc->mIO.playCoreCommands(rsc, !mDraw);
+        uint64_t waitTime = 0;
+        uint64_t now = rsc->getTime();
+        if (now < targetTime) {
+            waitTime = targetTime - now;
+        } else {
+            doWait = false;
+        }
+
+        mDraw |= rsc->mIO.playCoreCommands(rsc, doWait, waitTime);
         mDraw &= (rsc->mRootScript.get() != NULL);
         mDraw &= rsc->mHasSurface;
 
-        uint32_t targetTime = 0;
         if (mDraw && rsc->mIsGraphicsContext) {
-            targetTime = rsc->runRootScript();
+            uint64_t delay = rsc->runRootScript() * 1000000;
+            targetTime = rsc->getTime() + delay;
+            doWait = delay != 0;
 
             if (rsc->props.mLogVisual) {
                 rsc->displayDebugStats();
             }
 
-            mDraw = targetTime && !rsc->mPaused;
+            mDraw = !rsc->mPaused;
             rsc->timerSet(RS_TIMER_CLEAR_SWAP);
             rsc->mHal.funcs.swap(rsc);
             rsc->timerFrame();
@@ -266,12 +278,6 @@
             rsc->timerPrint();
             rsc->timerReset();
         }
-        if (targetTime > 1) {
-            int32_t t = (targetTime - (int32_t)(rsc->mTimeMSLastScript + rsc->mTimeMSLastSwap)) * 1000;
-            if (t > 0) {
-                usleep(t);
-            }
-        }
     }
 
     LOGV("%p, RS Thread exiting", rsc);
diff --git a/libs/rs/rsLocklessFifo.cpp b/libs/rs/rsLocklessFifo.cpp
index 7023a1f..02a76ab 100644
--- a/libs/rs/rsLocklessFifo.cpp
+++ b/libs/rs/rsLocklessFifo.cpp
@@ -129,21 +129,23 @@
     //dumpState("flush 2");
 }
 
-void LocklessCommandFifo::wait() {
+bool LocklessCommandFifo::wait(uint64_t timeout) {
     while (isEmpty() && !mInShutdown) {
         mSignalToControl.set();
-        mSignalToWorker.wait();
+        return mSignalToWorker.wait(timeout);
     }
+    return true;
 }
 
-const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData) {
+const void * LocklessCommandFifo::get(uint32_t *command, uint32_t *bytesData, uint64_t timeout) {
     while (1) {
         //dumpState("get");
-        wait();
-        if (mInShutdown) {
+        wait(timeout);
+
+        if (isEmpty() || mInShutdown) {
             *command = 0;
             *bytesData = 0;
-            return 0;
+            return NULL;
         }
 
         *command = reinterpret_cast<const uint16_t *>(mGet)[0];
diff --git a/libs/rs/rsLocklessFifo.h b/libs/rs/rsLocklessFifo.h
index eabdc3e..4962ef6 100644
--- a/libs/rs/rsLocklessFifo.h
+++ b/libs/rs/rsLocklessFifo.h
@@ -57,9 +57,9 @@
     void commitSync(uint32_t command, uint32_t bytes);
 
     void flush();
-    void wait();
+    bool wait(uint64_t timeout = 0);
 
-    const void * get(uint32_t *command, uint32_t *bytesData);
+    const void * get(uint32_t *command, uint32_t *bytesData, uint64_t timeout = 0);
     void next();
 
     void makeSpace(uint32_t bytes);
diff --git a/libs/rs/rsSignal.cpp b/libs/rs/rsSignal.cpp
index ccd20b9..413ac2b 100644
--- a/libs/rs/rsSignal.cpp
+++ b/libs/rs/rsSignal.cpp
@@ -68,26 +68,43 @@
     }
 }
 
-void Signal::wait() {
+bool Signal::wait(uint64_t timeout) {
     int status;
+    bool ret = false;
 
     status = pthread_mutex_lock(&mMutex);
     if (status) {
         LOGE("LocklessCommandFifo: error %i locking for condition.", status);
-        return;
+        return false;
     }
 
     if (!mSet) {
-        status = pthread_cond_wait(&mCondition, &mMutex);
-        if (status) {
-            LOGE("LocklessCommandFifo: error %i waiting on condition.", status);
+        if (!timeout) {
+            status = pthread_cond_wait(&mCondition, &mMutex);
+        } else {
+#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE)
+            status = pthread_cond_timeout_np(&mCondition, &mMutex, timeout / 1000000);
+#else
+            // This is safe it will just make things less reponsive
+            status = pthread_cond_wait(&mCondition, &mMutex);
+#endif
         }
     }
-    mSet = false;
+
+    if (!status) {
+        mSet = false;
+        ret = true;
+    } else {
+        if (status != ETIMEDOUT) {
+            LOGE("LocklessCommandFifo: error %i waiting for condition.", status);
+        }
+    }
 
     status = pthread_mutex_unlock(&mMutex);
     if (status) {
         LOGE("LocklessCommandFifo: error %i unlocking for condition.", status);
     }
+
+    return ret;
 }
 
diff --git a/libs/rs/rsSignal.h b/libs/rs/rsSignal.h
index 2e760f1..fc31883 100644
--- a/libs/rs/rsSignal.h
+++ b/libs/rs/rsSignal.h
@@ -31,7 +31,10 @@
     bool init();
 
     void set();
-    void wait();
+
+    // returns true if the signal occured
+    // false for timeout
+    bool wait(uint64_t timeout = 0);
 
 protected:
     bool mSet;
diff --git a/libs/rs/rsThreadIO.cpp b/libs/rs/rsThreadIO.cpp
index 1c8b89c..fe2c52e 100644
--- a/libs/rs/rsThreadIO.cpp
+++ b/libs/rs/rsThreadIO.cpp
@@ -113,8 +113,10 @@
 }
 
 
-bool ThreadIO::playCoreCommands(Context *con, bool waitForCommand) {
+bool ThreadIO::playCoreCommands(Context *con, bool waitForCommand, uint64_t timeToWait) {
     bool ret = false;
+    uint64_t startTime = con->getTime();
+
     while (!mToCore.isEmpty() || waitForCommand) {
         uint32_t cmdID = 0;
         uint32_t cmdSize = 0;
@@ -122,9 +124,17 @@
         if (con->props.mLogTimes) {
             con->timerSet(Context::RS_TIMER_IDLE);
         }
-        const void * data = mToCore.get(&cmdID, &cmdSize);
+
+        uint64_t delay = 0;
+        if (waitForCommand) {
+            delay = timeToWait - (con->getTime() - startTime);
+            if (delay > timeToWait) {
+                delay = 0;
+            }
+        }
+        const void * data = mToCore.get(&cmdID, &cmdSize, delay);
         if (!cmdSize) {
-            // exception occured, probably shutdown.
+            // exception or timeout occurred.
             return false;
         }
         if (con->props.mLogTimes) {
diff --git a/libs/rs/rsThreadIO.h b/libs/rs/rsThreadIO.h
index cad7318..9036118 100644
--- a/libs/rs/rsThreadIO.h
+++ b/libs/rs/rsThreadIO.h
@@ -37,7 +37,7 @@
 
     // Plays back commands from the client.
     // Returns true if any commands were processed.
-    bool playCoreCommands(Context *con, bool waitForCommand);
+    bool playCoreCommands(Context *con, bool waitForCommand, uint64_t timeToWait);
 
     //LocklessCommandFifo mToCore;
 
diff --git a/libs/utils/RefBase.cpp b/libs/utils/RefBase.cpp
index 8db20095..37d061c 100644
--- a/libs/utils/RefBase.cpp
+++ b/libs/utils/RefBase.cpp
@@ -49,11 +49,6 @@
 
 // ---------------------------------------------------------------------------
 
-RefBase::Destroyer::~Destroyer() {
-}
-
-// ---------------------------------------------------------------------------
-
 class RefBase::weakref_impl : public RefBase::weakref_type
 {
 public:
@@ -61,7 +56,6 @@
     volatile int32_t    mWeak;
     RefBase* const      mBase;
     volatile int32_t    mFlags;
-    Destroyer*          mDestroyer;
 
 #if !DEBUG_REFS
 
@@ -70,7 +64,6 @@
         , mWeak(0)
         , mBase(base)
         , mFlags(0)
-        , mDestroyer(0)
     {
     }
 
@@ -113,7 +106,7 @@
                 LOGD("\t%c ID %p (ref %d):", inc, refs->id, refs->ref);
 #if DEBUG_REFS_CALLSTACK_ENABLED
                 refs->stack.dump();
-#endif;
+#endif
                 refs = refs->next;
             }
         }
@@ -131,7 +124,7 @@
                 LOGD("\t%c ID %p (ref %d):", inc, refs->id, refs->ref);
 #if DEBUG_REFS_CALLSTACK_ENABLED
                 refs->stack.dump();
-#endif;
+#endif
                 refs = refs->next;
             }
         }
@@ -193,7 +186,7 @@
         String8 text;
 
         {
-            Mutex::Autolock _l(const_cast<weakref_impl*>(this)->mMutex);
+            Mutex::Autolock _l(mMutex);
             char buf[128];
             sprintf(buf, "Strong references on RefBase %p (weakref_type %p):\n", mBase, this);
             text.append(buf);
@@ -318,7 +311,7 @@
         }
     }
 
-    Mutex mMutex;
+    mutable Mutex mMutex;
     ref_entry* mStrongRefs;
     ref_entry* mWeakRefs;
 
@@ -348,7 +341,7 @@
     }
 
     android_atomic_add(-INITIAL_STRONG_VALUE, &refs->mStrong);
-    const_cast<RefBase*>(this)->onFirstRef();
+    refs->mBase->onFirstRef();
 }
 
 void RefBase::decStrong(const void* id) const
@@ -361,13 +354,9 @@
 #endif
     LOG_ASSERT(c >= 1, "decStrong() called on %p too many times", refs);
     if (c == 1) {
-        const_cast<RefBase*>(this)->onLastStrongRef(id);
-        if ((refs->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK) {
-            if (refs->mDestroyer) {
-                refs->mDestroyer->destroy(this);
-            } else {
-                delete this;
-            }
+        refs->mBase->onLastStrongRef(id);
+        if ((refs->mFlags&OBJECT_LIFETIME_MASK) == OBJECT_LIFETIME_STRONG) {
+            delete this;
         }
     }
     refs->decWeak(id);
@@ -391,7 +380,7 @@
         android_atomic_add(-INITIAL_STRONG_VALUE, &refs->mStrong);
         // fall through...
     case 0:
-        const_cast<RefBase*>(this)->onFirstRef();
+        refs->mBase->onFirstRef();
     }
 }
 
@@ -400,10 +389,6 @@
     return mRefs->mStrong;
 }
 
-void RefBase::setDestroyer(RefBase::Destroyer* destroyer) {
-    mRefs->mDestroyer = destroyer;
-}
-
 RefBase* RefBase::weakref_type::refBase() const
 {
     return static_cast<const weakref_impl*>(this)->mBase;
@@ -417,6 +402,7 @@
     LOG_ASSERT(c >= 0, "incWeak called on %p after last weak ref", this);
 }
 
+
 void RefBase::weakref_type::decWeak(const void* id)
 {
     weakref_impl* const impl = static_cast<weakref_impl*>(this);
@@ -424,30 +410,27 @@
     const int32_t c = android_atomic_dec(&impl->mWeak);
     LOG_ASSERT(c >= 1, "decWeak called on %p too many times", this);
     if (c != 1) return;
-    
-    if ((impl->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK) {
+
+    if ((impl->mFlags&OBJECT_LIFETIME_WEAK) == OBJECT_LIFETIME_STRONG) {
+        // This is the regular lifetime case. The object is destroyed
+        // when the last strong reference goes away. Since weakref_impl
+        // outlive the object, it is not destroyed in the dtor, and
+        // we'll have to do it here.
         if (impl->mStrong == INITIAL_STRONG_VALUE) {
-            if (impl->mBase) {
-                if (impl->mDestroyer) {
-                    impl->mDestroyer->destroy(impl->mBase);
-                } else {
-                    delete impl->mBase;
-                }
-            }
+            // Special case: we never had a strong reference, so we need to
+            // destroy the object now.
+            delete impl->mBase;
         } else {
             // LOGV("Freeing refs %p of old RefBase %p\n", this, impl->mBase);
             delete impl;
         }
     } else {
+        // less common case: lifetime is OBJECT_LIFETIME_{WEAK|FOREVER}
         impl->mBase->onLastWeakRef(id);
-        if ((impl->mFlags&OBJECT_LIFETIME_FOREVER) != OBJECT_LIFETIME_FOREVER) {
-            if (impl->mBase) {
-                if (impl->mDestroyer) {
-                    impl->mDestroyer->destroy(impl->mBase);
-                } else {
-                    delete impl->mBase;
-                }
-            }
+        if ((impl->mFlags&OBJECT_LIFETIME_MASK) == OBJECT_LIFETIME_WEAK) {
+            // this is the OBJECT_LIFETIME_WEAK case. The last weak-reference
+            // is gone, we can destroy the object.
+            delete impl->mBase;
         }
     }
 }
@@ -569,11 +552,23 @@
 
 RefBase::~RefBase()
 {
-    if ((mRefs->mFlags & OBJECT_LIFETIME_WEAK) == OBJECT_LIFETIME_WEAK) {
-        if (mRefs->mWeak == 0) {
-            delete mRefs;
+    if (mRefs->mStrong == INITIAL_STRONG_VALUE) {
+        // we never acquired a strong (and/or weak) reference on this object.
+        delete mRefs;
+    } else {
+        // life-time of this object is extended to WEAK or FOREVER, in
+        // which case weakref_impl doesn't out-live the object and we
+        // can free it now.
+        if ((mRefs->mFlags & OBJECT_LIFETIME_MASK) != OBJECT_LIFETIME_STRONG) {
+            // It's possible that the weak count is not 0 if the object
+            // re-acquired a weak reference in its destructor
+            if (mRefs->mWeak == 0) {
+                delete mRefs;
+            }
         }
     }
+    // for debugging purposes, clear this.
+    const_cast<weakref_impl*&>(mRefs) = NULL;
 }
 
 void RefBase::extendObjectLifetime(int32_t mode)
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index da7a050..56a9933 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -1061,10 +1061,13 @@
     }
 
     /**
-     * Checks whether audio routing to the wired headset is on or off.
+     * Checks whether a wired headset is connected or not.
+     * <p>This is not a valid indication that audio playback is
+     * actually over the wired headset as audio routing depends on other conditions.
      *
-     * @return true if audio is being routed to/from wired headset;
+     * @return true if a wired headset is connected.
      *         false if otherwise
+     * @deprecated Use only to check is a headset is connected or not.
      */
     public boolean isWiredHeadsetOn() {
         if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_WIRED_HEADSET,"")
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 8ebb07c..5951229 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -2580,6 +2580,7 @@
         public IBinder mSourceRef = null;
         public String mClientId;
         public int mFocusChangeType;
+        public AudioFocusDeathHandler mHandler;
         public String mPackageName;
         public int mCallingUid;
 
@@ -2587,15 +2588,23 @@
         }
 
         public FocusStackEntry(int streamType, int duration,
-                IAudioFocusDispatcher afl, IBinder source, String id, String pn, int uid) {
+                IAudioFocusDispatcher afl, IBinder source, String id, AudioFocusDeathHandler hdlr,
+                String pn, int uid) {
             mStreamType = streamType;
             mFocusDispatcher = afl;
             mSourceRef = source;
             mClientId = id;
             mFocusChangeType = duration;
+            mHandler = hdlr;
             mPackageName = pn;
             mCallingUid = uid;
         }
+
+        public void unlinkToDeath() {
+            if (mSourceRef != null && mHandler != null) {
+                mSourceRef.unlinkToDeath(mHandler, 0);
+            }
+        }
     }
 
     private Stack<FocusStackEntry> mFocusStack = new Stack<FocusStackEntry>();
@@ -2630,7 +2639,8 @@
         if (!mFocusStack.empty() && mFocusStack.peek().mClientId.equals(clientToRemove))
         {
             //Log.i(TAG, "   removeFocusStackEntry() removing top of stack");
-            mFocusStack.pop();
+            FocusStackEntry fse = mFocusStack.pop();
+            fse.unlinkToDeath();
             if (signal) {
                 // notify the new top of the stack it gained focus
                 notifyTopOfAudioFocusStack();
@@ -2649,6 +2659,7 @@
                     Log.i(TAG, " AudioFocus  abandonAudioFocus(): removing entry for "
                             + fse.mClientId);
                     stackIterator.remove();
+                    fse.unlinkToDeath();
                 }
             }
         }
@@ -2738,6 +2749,18 @@
                 return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
             }
 
+            // handle the potential premature death of the new holder of the focus
+            // (premature death == death before abandoning focus)
+            // Register for client death notification
+            AudioFocusDeathHandler afdh = new AudioFocusDeathHandler(cb);
+            try {
+                cb.linkToDeath(afdh, 0);
+            } catch (RemoteException e) {
+                // client has already died!
+                Log.w(TAG, "AudioFocus  requestAudioFocus() could not link to "+cb+" binder death");
+                return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
+            }
+
             if (!mFocusStack.empty() && mFocusStack.peek().mClientId.equals(clientId)) {
                 // if focus is already owned by this client and the reason for acquiring the focus
                 // hasn't changed, don't do anything
@@ -2762,11 +2785,11 @@
             }
 
             // focus requester might already be somewhere below in the stack, remove it
-            removeFocusStackEntry(clientId, false);
+            removeFocusStackEntry(clientId, false /* signal */);
 
             // push focus requester at the top of the audio focus stack
             mFocusStack.push(new FocusStackEntry(mainStreamType, focusChangeHint, fd, cb,
-                    clientId, callingPackageName, Binder.getCallingUid()));
+                    clientId, afdh, callingPackageName, Binder.getCallingUid()));
 
             // there's a new top of the stack, let the remote control know
             synchronized(mRCStack) {
@@ -2774,17 +2797,6 @@
             }
         }//synchronized(mAudioFocusLock)
 
-        // handle the potential premature death of the new holder of the focus
-        // (premature death == death before abandoning focus)
-        // Register for client death notification
-        AudioFocusDeathHandler afdh = new AudioFocusDeathHandler(cb);
-        try {
-            cb.linkToDeath(afdh, 0);
-        } catch (RemoteException e) {
-            // client has already died!
-            Log.w(TAG, "AudioFocus  requestAudioFocus() could not link to "+cb+" binder death");
-        }
-
         return AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
     }
 
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index 2d1761f..65818a1 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -1122,19 +1122,23 @@
             }
 
             if (fileMissing) {
+                // Clear the file path to prevent the _DELETE_FILE database hook
+                // in the media provider from deleting the file.
+                // If the file is truly gone the delete is unnecessary, and we want to avoid
+                // accidentally deleting files that are really there.
+                ContentValues values = new ContentValues();
+                values.put(Files.FileColumns.DATA, "");
+                values.put(Files.FileColumns.DATE_MODIFIED, 0);
+                mMediaProvider.update(ContentUris.withAppendedId(mFilesUri, entry.mRowId),
+                        values, null, null);
+
                 // do not delete missing playlists, since they may have been modified by the user.
                 // the user can delete them in the media player instead.
                 // instead, clear the path and lastModified fields in the row
                 MediaFile.MediaFileType mediaFileType = MediaFile.getFileType(path);
                 int fileType = (mediaFileType == null ? 0 : mediaFileType.fileType);
 
-                if (MediaFile.isPlayListFileType(fileType)) {
-                    ContentValues values = new ContentValues();
-                    values.put(MediaStore.Audio.Playlists.DATA, "");
-                    values.put(MediaStore.Audio.Playlists.DATE_MODIFIED, 0);
-                    mMediaProvider.update(ContentUris.withAppendedId(mPlaylistsUri, entry.mRowId),
-                            values, null, null);
-                } else {
+                if (!MediaFile.isPlayListFileType(fileType)) {
                     mMediaProvider.delete(ContentUris.withAppendedId(mFilesUri, entry.mRowId),
                             null, null);
                     iterator.remove();
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index 13ed152c6..354f2c9 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -189,6 +189,7 @@
     if (tmp == NULL) {  // Out of memory
         return;
     }
+    LOGV("setDataSource: path %s", tmp);
 
     String8 pathStr(tmp);
     env->ReleaseStringUTFChars(path, tmp);
@@ -201,7 +202,6 @@
         return;
     }
 
-    LOGV("setDataSource: path %s", pathStr);
     status_t opStatus =
         mp->setDataSource(
                 pathStr,
@@ -243,11 +243,13 @@
 }
 
 static void
-android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
+setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive)
 {
     sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
-    if (mp == NULL ) {
-        jniThrowException(env, "java/lang/IllegalStateException", NULL);
+    if (mp == NULL) {
+        if (mediaPlayerMustBeAlive) {
+            jniThrowException(env, "java/lang/IllegalStateException", NULL);
+        }
         return;
     }
 
@@ -271,6 +273,12 @@
 }
 
 static void
+android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
+{
+    setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */);
+}
+
+static void
 android_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz)
 {
     sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
@@ -615,6 +623,7 @@
 android_media_MediaPlayer_release(JNIEnv *env, jobject thiz)
 {
     LOGV("release");
+    setVideoSurface(env, thiz, NULL, false /* mediaPlayerMustBeAlive */);
     sp<MediaPlayer> mp = setMediaPlayer(env, thiz, 0);
     if (mp != NULL) {
         // this prevents native callbacks after the object is released
@@ -627,7 +636,6 @@
 android_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz)
 {
     LOGV("native_finalize");
-    android_media_MediaPlayer_setVideoSurface(env, thiz, NULL);
     android_media_MediaPlayer_release(env, thiz);
 }
 
diff --git a/media/jni/audioeffect/android_media_AudioEffect.cpp b/media/jni/audioeffect/android_media_AudioEffect.cpp
index 57cabe2..277ea55 100644
--- a/media/jni/audioeffect/android_media_AudioEffect.cpp
+++ b/media/jni/audioeffect/android_media_AudioEffect.cpp
@@ -360,6 +360,8 @@
 
     if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
         jdescConnect = env->NewStringUTF("Auxiliary");
+    } else if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC) {
+        jdescConnect = env->NewStringUTF("Pre Processing");
     } else {
         jdescConnect = env->NewStringUTF("Insert");
     }
diff --git a/media/jni/mediaeditor/VideoBrowserMain.c b/media/jni/mediaeditor/VideoBrowserMain.c
index 6ef688d..2de55e3 100755
--- a/media/jni/mediaeditor/VideoBrowserMain.c
+++ b/media/jni/mediaeditor/VideoBrowserMain.c
@@ -258,6 +258,7 @@
                     err = pContext->m_pDecoder->m_pFctCreate(
                             &pContext->m_pDecoderCtx,
                             pContext->m_pStreamHandler,
+                            pContext->m_3gpReader,
                             pContext->m_3gpData,
                             &pContext->m_accessUnit,
                             pContext->m_pCodecLoaderContext) ;
@@ -284,6 +285,7 @@
                     err = pContext->m_pDecoder->m_pFctCreate(
                             &pContext->m_pDecoderCtx,
                             pContext->m_pStreamHandler,
+                            pContext->m_3gpReader,
                             pContext->m_3gpData,
                             &pContext->m_accessUnit,
                             pContext->m_pCodecLoaderContext) ;
@@ -435,9 +437,12 @@
 * @param        pContext     (IN) : Video browser context
 * @param        pTime        (IN/OUT) : Pointer on the time to reach. Updated
 *                                       by this function with the reached time
+* @param        tolerance    (IN) :  We may decode an earlier frame within the tolerance.
+*                                    The time difference is specified in milliseconds.
 * @return       M4NO_ERROR / M4ERR_PARAMETER / M4ERR_STATE / M4ERR_ALLOC
 ******************************************************************************/
-M4OSA_ERR videoBrowserPrepareFrame(M4OSA_Context pContext, M4OSA_UInt32* pTime)
+M4OSA_ERR videoBrowserPrepareFrame(M4OSA_Context pContext, M4OSA_UInt32* pTime,
+    M4OSA_UInt32 tolerance)
 {
     VideoBrowserContext* pC = (VideoBrowserContext*)pContext;
     M4OSA_ERR err = M4NO_ERROR;
@@ -481,52 +486,15 @@
         bJumpNeeded = M4OSA_TRUE;
     }
 
-    if (M4OSA_TRUE == bJumpNeeded)
-    {
-        rapTime = targetTime;
-        /*--- Retrieve the previous RAP time ---*/
-        err = pC->m_3gpReader->m_pFctGetPrevRapTime(
-                pC->m_pReaderCtx, pC->m_pStreamHandler, &rapTime);
-
-        CHECK_ERR(videoBrowserPrepareFrame, err);
-
-        jumpTime = rapTime;
-
-        err = pC->m_3gpReader->m_pFctJump(pC->m_pReaderCtx,
-                                          pC->m_pStreamHandler,
-                                          (M4OSA_Int32*)&jumpTime);
-        CHECK_ERR(videoBrowserPrepareFrame, err);
-    }
-
     timeMS = (M4_MediaTime)targetTime;
     err = pC->m_pDecoder->m_pFctDecode(
-        pC->m_pDecoderCtx, &timeMS, bJumpNeeded);
+        pC->m_pDecoderCtx, &timeMS, bJumpNeeded, tolerance);
 
     if ((err != M4NO_ERROR) && (err != M4WAR_NO_MORE_AU))
     {
         return err;
     }
 
-    // FIXME:
-    // Not sure that I understand why we need a second jump logic here
-    if ((timeMS >= pC->m_currentCTS) && (M4OSA_TRUE == isBackward))
-    {
-        jumpTime = rapTime;
-        err = pC->m_3gpReader->m_pFctJump(
-            pC->m_pReaderCtx, pC->m_pStreamHandler, (M4OSA_Int32*)&jumpTime);
-
-        CHECK_ERR(videoBrowserPrepareFrame, err);
-
-        timeMS = (M4_MediaTime)rapTime;
-        err = pC->m_pDecoder->m_pFctDecode(
-            pC->m_pDecoderCtx, &timeMS, M4OSA_TRUE);
-
-        if ((err != M4NO_ERROR) && (err != M4WAR_NO_MORE_AU))
-        {
-            return err;
-        }
-    }
-
     err = pC->m_pDecoder->m_pFctRender(
         pC->m_pDecoderCtx, &timeMS, pC->m_outputPlane, M4OSA_TRUE);
 
diff --git a/media/jni/mediaeditor/VideoBrowserMain.h b/media/jni/mediaeditor/VideoBrowserMain.h
index 5156ebb..00b5e05 100755
--- a/media/jni/mediaeditor/VideoBrowserMain.h
+++ b/media/jni/mediaeditor/VideoBrowserMain.h
@@ -133,7 +133,8 @@
 *                                     this function with the reached time
 * @return       M4NO_ERROR / M4ERR_PARAMETER / M4ERR_STATE / M4ERR_ALLOC
 ******************************************************************************/
-M4OSA_ERR videoBrowserPrepareFrame(M4OSA_Context pContext, M4OSA_UInt32* pTime);
+M4OSA_ERR videoBrowserPrepareFrame(M4OSA_Context pContext, M4OSA_UInt32* pTime,
+        M4OSA_UInt32 tolerance);
 
 /******************************************************************************
 * @brief        This function sets the size and the position of the display.
diff --git a/media/jni/mediaeditor/VideoEditorMain.cpp b/media/jni/mediaeditor/VideoEditorMain.cpp
index c95a0c2..14972a2 100755
--- a/media/jni/mediaeditor/VideoEditorMain.cpp
+++ b/media/jni/mediaeditor/VideoEditorMain.cpp
@@ -763,7 +763,7 @@
             ClipProperties.uiVideoWidth,
             pContext->pEditSettings->pClipList[iCurrentClipIndex]->\
             ClipProperties.uiVideoHeight,
-            &tnTimeMs);
+            &tnTimeMs, 0);
         if (result != M4NO_ERROR) {
             free(pixelArray);
             ThumbnailClose(tnContext);
@@ -991,7 +991,7 @@
 
     result = ThumbnailGetPixels16(tnContext, (M4OSA_Int16 *)pixelArray,
                                                 frameWidth,
-                                                frameHeight, &timeMs);
+                                                frameHeight, &timeMs, 0);
     if (result != M4NO_ERROR) {
         free(pixelArray);
         ThumbnailClose(tnContext);
@@ -2132,7 +2132,7 @@
 
     m_dst32 = env->GetIntArrayElements(pixelArray, NULL);
 
-    err = ThumbnailGetPixels32(mContext, (M4OSA_Int32 *)m_dst32, width,height,&timeMS);
+    err = ThumbnailGetPixels32(mContext, (M4OSA_Int32 *)m_dst32, width,height,&timeMS,0);
     if (err != M4NO_ERROR ) {
         if (env != NULL) {
             jniThrowException(env, "java/lang/RuntimeException",\
@@ -2194,9 +2194,10 @@
 
     m_dst32 = env->GetIntArrayElements(pixelArray, NULL);
 
+    M4OSA_UInt32 tolerance = deltatimeMS / 2;
     do {
         err = ThumbnailGetPixels32(mContext, ((M4OSA_Int32 *)m_dst32 + arrayOffset),
-            width,height,&timeMS);
+            width,height,&timeMS, tolerance);
         if (err != M4NO_ERROR ) {
             if (env != NULL) {
                 jniThrowException(env, "java/lang/RuntimeException",\
diff --git a/media/jni/mediaeditor/VideoEditorThumbnailMain.cpp b/media/jni/mediaeditor/VideoEditorThumbnailMain.cpp
index fe3734f..1508246 100755
--- a/media/jni/mediaeditor/VideoEditorThumbnailMain.cpp
+++ b/media/jni/mediaeditor/VideoEditorThumbnailMain.cpp
@@ -74,7 +74,7 @@
 M4OSA_ERR ThumbnailGetPixels(const M4OSA_Context pContext,
                              M4OSA_Int32* pixelArray,
                              M4OSA_UInt32 width, M4OSA_UInt32 height,
-                             M4OSA_UInt32* pTimeMS);
+                             M4OSA_UInt32* pTimeMS, M4OSA_UInt32 tolerance);
 
 
 /**
@@ -219,7 +219,7 @@
 M4OSA_ERR ThumbnailGetPixels(const M4OSA_Context pContext,
                              M4OSA_Int32* pixelArray,
                              M4OSA_UInt32 width, M4OSA_UInt32 height,
-                             M4OSA_UInt32* pTimeMS)
+                             M4OSA_UInt32* pTimeMS, M4OSA_UInt32 tolerance)
 {
     M4OSA_ERR err;
 
@@ -249,7 +249,7 @@
         pC->m_previousTime = *pTimeMS;
     }
 
-    err = videoBrowserPrepareFrame(pC->m_pVideoBrowser, pTimeMS);
+    err = videoBrowserPrepareFrame(pC->m_pVideoBrowser, pTimeMS, tolerance);
     CHECK_ERR(ThumbnailGetPixels, err);
 
     if (pC->m_bRender != M4OSA_TRUE) {
@@ -264,7 +264,8 @@
 
 M4OSA_ERR ThumbnailGetPixels32(const M4OSA_Context pContext,
                          M4OSA_Int32* pixelArray, M4OSA_UInt32 width,
-                         M4OSA_UInt32 height, M4OSA_UInt32* timeMS)
+                         M4OSA_UInt32 height, M4OSA_UInt32* timeMS,
+                         M4OSA_UInt32 tolerance)
 {
 
     M4OSA_ERR err = M4NO_ERROR;
@@ -277,7 +278,7 @@
     pC->m_dst16 = NULL;
     pC->m_dst32 = pixelArray;
 
-    err = ThumbnailGetPixels(pContext, pixelArray, width, height, timeMS);
+    err = ThumbnailGetPixels(pContext, pixelArray, width, height, timeMS, tolerance);
 
 ThumbnailGetPixels32_cleanUp:
 
@@ -286,7 +287,8 @@
 
 M4OSA_ERR ThumbnailGetPixels16(const M4OSA_Context pContext,
                          M4OSA_Int16* pixelArray, M4OSA_UInt32 width,
-                         M4OSA_UInt32 height, M4OSA_UInt32* timeMS)
+                         M4OSA_UInt32 height, M4OSA_UInt32* timeMS,
+                         M4OSA_UInt32 tolerance)
 {
     M4OSA_ERR err = M4NO_ERROR;
 
@@ -298,7 +300,8 @@
     pC->m_dst16 = pixelArray;
     pC->m_dst32 = NULL;
 
-    err = ThumbnailGetPixels(pContext, (M4OSA_Int32*)pixelArray, width, height, timeMS);
+    err = ThumbnailGetPixels(pContext, (M4OSA_Int32*)pixelArray, width, height,
+            timeMS, tolerance);
 
 ThumbnailGetPixels16_cleanUp:
 
diff --git a/media/jni/mediaeditor/VideoEditorThumbnailMain.h b/media/jni/mediaeditor/VideoEditorThumbnailMain.h
index 14c60dd..0b3b0c8 100755
--- a/media/jni/mediaeditor/VideoEditorThumbnailMain.h
+++ b/media/jni/mediaeditor/VideoEditorThumbnailMain.h
@@ -49,7 +49,8 @@
 */
 M4OSA_ERR ThumbnailGetPixels32(const M4OSA_Context pContext,
                              M4OSA_Int32* pixelArray, M4OSA_UInt32 width,
-                             M4OSA_UInt32 height, M4OSA_UInt32 *timeMS);
+                             M4OSA_UInt32 height, M4OSA_UInt32 *timeMS,
+                             M4OSA_UInt32 tolerance);
 
 /**
  ************************************************************************
@@ -63,7 +64,8 @@
 */
 M4OSA_ERR ThumbnailGetPixels16(const M4OSA_Context pContext,
                              M4OSA_Int16* pixelArray, M4OSA_UInt32 width,
-                             M4OSA_UInt32 height, M4OSA_UInt32 *timeMS);
+                             M4OSA_UInt32 height, M4OSA_UInt32 *timeMS,
+                             M4OSA_UInt32 tolerance);
 
 /**
  ************************************************************************
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 8630ec1..2051b3b 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -687,7 +687,9 @@
         p = android::createPlayer(playerType, this, notify);
     }
 
-    p->setUID(mUID);
+    if (p != NULL) {
+        p->setUID(mUID);
+    }
 
     return p;
 }
diff --git a/media/libstagefright/codecs/aacdec/SoftAAC.cpp b/media/libstagefright/codecs/aacdec/SoftAAC.cpp
index bbd6dbb..f0a330f 100644
--- a/media/libstagefright/codecs/aacdec/SoftAAC.cpp
+++ b/media/libstagefright/codecs/aacdec/SoftAAC.cpp
@@ -316,7 +316,7 @@
          * Thus, we could not say for sure whether a stream is
          * AAC+/eAAC+ until the first data frame is decoded.
          */
-        if (mInputBufferCount <= 2) {
+        if (decoderErr == MP4AUDEC_SUCCESS && mInputBufferCount <= 2) {
             LOGV("audio/extended audio object type: %d + %d",
                 mConfig->audioObjectType, mConfig->extendedAudioObjectType);
             LOGV("aac+ upsampling factor: %d desired channels: %d",
@@ -410,7 +410,9 @@
         notifyFillBufferDone(outHeader);
         outHeader = NULL;
 
-        ++mInputBufferCount;
+        if (decoderErr == MP4AUDEC_SUCCESS) {
+            ++mInputBufferCount;
+        }
     }
 }
 
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioEffectTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioEffectTest.java
index 90be041..1511cd7 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioEffectTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioEffectTest.java
@@ -23,9 +23,11 @@
 import android.media.AudioFormat;
 import android.media.AudioManager;
 import android.media.AudioTrack;
+import android.media.AudioRecord;
 import android.media.audiofx.EnvironmentalReverb;
 import android.media.audiofx.Equalizer;
 import android.media.MediaPlayer;
+import android.media.MediaRecorder;
 
 import android.os.Looper;
 import android.test.suitebuilder.annotation.LargeTest;
@@ -54,6 +56,7 @@
     private Looper mLooper = null;
     private int mError = 0;
     private final Object lock = new Object();
+    private final static int SAMPLING_RATE = 44100;
 
     public MediaAudioEffectTest() {
         super("com.android.mediaframeworktest", MediaFrameworkTest.class);
@@ -124,6 +127,25 @@
     // 1 - constructor
     //----------------------------------
 
+    private AudioRecord getAudioRecord() {
+        AudioRecord ar = null;
+        try {
+            ar = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
+                    SAMPLING_RATE,
+                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
+                    AudioFormat.ENCODING_PCM_16BIT,
+                    AudioRecord.getMinBufferSize(SAMPLING_RATE,
+                            AudioFormat.CHANNEL_CONFIGURATION_MONO,
+                            AudioFormat.ENCODING_PCM_16BIT) * 10);
+            assertNotNull("Could not create AudioRecord", ar);
+            assertEquals("AudioRecord not initialized",
+                    AudioRecord.STATE_INITIALIZED, ar.getState());
+        } catch (IllegalArgumentException e) {
+            fail("AudioRecord invalid parameter");
+        }
+        return ar;
+    }
+
     //Test case 1.0: test constructor from effect type and get effect ID
     @LargeTest
     public void test1_0ConstructorFromType() throws Exception {
@@ -132,10 +154,19 @@
         AudioEffect.Descriptor[] desc = AudioEffect.queryEffects();
         assertTrue(msg+": no effects found", (desc.length != 0));
         try {
+            int sessionId;
+            AudioRecord ar = null;
+            if (AudioEffect.EFFECT_PRE_PROCESSING.equals(desc[0].connectMode)) {
+                ar = getAudioRecord();
+                sessionId = ar.getAudioSessionId();
+            } else {
+                sessionId = 0;
+            }
+
             AudioEffect effect = new AudioEffect(desc[0].type,
                     AudioEffect.EFFECT_TYPE_NULL,
                     0,
-                    0);
+                    sessionId);
             assertNotNull(msg + ": could not create AudioEffect", effect);
             try {
                 assertTrue(msg +": invalid effect ID", (effect.getId() != 0));
@@ -144,6 +175,9 @@
                 result = false;
             } finally {
                 effect.release();
+                if (ar != null) {
+                    ar.release();
+                }
             }
         } catch (IllegalArgumentException e) {
             msg = msg.concat(": Effect not found: "+desc[0].name);
@@ -163,12 +197,23 @@
         AudioEffect.Descriptor[] desc = AudioEffect.queryEffects();
         assertTrue(msg+"no effects found", (desc.length != 0));
         try {
+            int sessionId;
+            AudioRecord ar = null;
+            if (AudioEffect.EFFECT_PRE_PROCESSING.equals(desc[0].connectMode)) {
+                ar = getAudioRecord();
+                sessionId = ar.getAudioSessionId();
+            } else {
+                sessionId = 0;
+            }
             AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_NULL,
                     desc[0].uuid,
                     0,
-                    0);
+                    sessionId);
             assertNotNull(msg + ": could not create AudioEffect", effect);
             effect.release();
+            if (ar != null) {
+                ar.release();
+            }
         } catch (IllegalArgumentException e) {
             msg = msg.concat(": Effect not found: "+desc[0].name);
             result = false;
diff --git a/packages/SystemUI/res/values-bg/donottranslate.xml b/packages/SystemUI/res/values-bg/donottranslate.xml
new file mode 100644
index 0000000..dcf434d
--- /dev/null
+++ b/packages/SystemUI/res/values-bg/donottranslate.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- For formatting day of week and date in DateView.  Day of week precedes date by default,
+         but this may be overridden on a per-locale basis if necessary. -->
+    <string name="status_bar_date_formatter">%2$s\n%1$s</string>
+
+</resources>
diff --git a/packages/SystemUI/res/values-hu/donottranslate.xml b/packages/SystemUI/res/values-hu/donottranslate.xml
new file mode 100644
index 0000000..dcf434d
--- /dev/null
+++ b/packages/SystemUI/res/values-hu/donottranslate.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- For formatting day of week and date in DateView.  Day of week precedes date by default,
+         but this may be overridden on a per-locale basis if necessary. -->
+    <string name="status_bar_date_formatter">%2$s\n%1$s</string>
+
+</resources>
diff --git a/packages/SystemUI/res/values-ja/donottranslate.xml b/packages/SystemUI/res/values-ja/donottranslate.xml
new file mode 100644
index 0000000..dcf434d
--- /dev/null
+++ b/packages/SystemUI/res/values-ja/donottranslate.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- For formatting day of week and date in DateView.  Day of week precedes date by default,
+         but this may be overridden on a per-locale basis if necessary. -->
+    <string name="status_bar_date_formatter">%2$s\n%1$s</string>
+
+</resources>
diff --git a/packages/SystemUI/res/values-ko/donottranslate.xml b/packages/SystemUI/res/values-ko/donottranslate.xml
new file mode 100644
index 0000000..dcf434d
--- /dev/null
+++ b/packages/SystemUI/res/values-ko/donottranslate.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- For formatting day of week and date in DateView.  Day of week precedes date by default,
+         but this may be overridden on a per-locale basis if necessary. -->
+    <string name="status_bar_date_formatter">%2$s\n%1$s</string>
+
+</resources>
diff --git a/packages/SystemUI/res/values-lt/donottranslate.xml b/packages/SystemUI/res/values-lt/donottranslate.xml
new file mode 100644
index 0000000..dcf434d
--- /dev/null
+++ b/packages/SystemUI/res/values-lt/donottranslate.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- For formatting day of week and date in DateView.  Day of week precedes date by default,
+         but this may be overridden on a per-locale basis if necessary. -->
+    <string name="status_bar_date_formatter">%2$s\n%1$s</string>
+
+</resources>
diff --git a/packages/SystemUI/res/values-tr/donottranslate.xml b/packages/SystemUI/res/values-tr/donottranslate.xml
new file mode 100644
index 0000000..dcf434d
--- /dev/null
+++ b/packages/SystemUI/res/values-tr/donottranslate.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- For formatting day of week and date in DateView.  Day of week precedes date by default,
+         but this may be overridden on a per-locale basis if necessary. -->
+    <string name="status_bar_date_formatter">%2$s\n%1$s</string>
+
+</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/donottranslate.xml b/packages/SystemUI/res/values-zh-rCN/donottranslate.xml
new file mode 100644
index 0000000..dcf434d
--- /dev/null
+++ b/packages/SystemUI/res/values-zh-rCN/donottranslate.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- For formatting day of week and date in DateView.  Day of week precedes date by default,
+         but this may be overridden on a per-locale basis if necessary. -->
+    <string name="status_bar_date_formatter">%2$s\n%1$s</string>
+
+</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/donottranslate.xml b/packages/SystemUI/res/values-zh-rTW/donottranslate.xml
new file mode 100644
index 0000000..dcf434d
--- /dev/null
+++ b/packages/SystemUI/res/values-zh-rTW/donottranslate.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- For formatting day of week and date in DateView.  Day of week precedes date by default,
+         but this may be overridden on a per-locale basis if necessary. -->
+    <string name="status_bar_date_formatter">%2$s\n%1$s</string>
+
+</resources>
diff --git a/packages/SystemUI/res/values/donottranslate.xml b/packages/SystemUI/res/values/donottranslate.xml
new file mode 100644
index 0000000..c25a5b7
--- /dev/null
+++ b/packages/SystemUI/res/values/donottranslate.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- For formatting day of week and date in DateView.  Day of week precedes date by default,
+         but this may be overridden on a per-locale basis if necessary. -->
+    <string name="status_bar_date_formatter">%1$s\n%2$s</string>
+
+</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 03b82fd..7779703 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -41,10 +41,6 @@
     <!-- Title shown in recents popup for inspecting an application's properties -->
     <string name="status_bar_recent_inspect_item_title">Inspect</string>
 
-    <!-- For formatting day of week and date in DateView.  Day of week precedes date by default,
-         but this may be overridden on a per-locale basis if necessary. -->
-    <string name="status_bar_date_formatter">%1$s\n%2$s</string>
-
     <!-- The label in the bar at the top of the status bar when there are no notifications
          showing.  [CHAR LIMIT=40]-->
     <string name="status_bar_no_notifications_title">No notifications</string>
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java b/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
index 6ee5861..f52bb26 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
@@ -18,6 +18,7 @@
 
 import com.android.internal.R;
 
+import android.app.ActivityManager;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
 import android.content.res.Resources;
@@ -107,13 +108,16 @@
             int flags = WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN
                     | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER
                     | WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING
-                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
-                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED_SYSTEM
                     /*| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                     | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR*/ ;
             if (!mNeedsInput) {
                 flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
             }
+            if (ActivityManager.isHighEndGfx(((WindowManager)mContext.getSystemService(
+                    Context.WINDOW_SERVICE)).getDefaultDisplay())) {
+                flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
+                        | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED_SYSTEM;
+            }
             WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                     stretch, stretch, WindowManager.LayoutParams.TYPE_KEYGUARD,
                     flags, PixelFormat.TRANSLUCENT);
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
index 4abb9eb..06b7fb9 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
@@ -1138,12 +1138,13 @@
                 }
             }
 
-            // if the keyguard is shown, allow the status bar to open
-            // only if the keyguard is insecure and is covered by another window
-            boolean enable = !mShowing || (mHidden && !isSecure());
+            // if the keyguard is shown, allow the status bar to open only if the keyguard is
+            // insecure and (is covered by another window OR this feature is enabled in general)
+            boolean enable = !mShowing
+                || ((ENABLE_STATUS_BAR_IN_KEYGUARD || mHidden) && !isSecure());
             mStatusBarManager.disable(enable ?
                          StatusBarManager.DISABLE_NONE :
-                         ( (ENABLE_STATUS_BAR_IN_KEYGUARD ? 0 : StatusBarManager.DISABLE_EXPAND)
+                         ( StatusBarManager.DISABLE_EXPAND
                          | StatusBarManager.DISABLE_NAVIGATION
                          | StatusBarManager.DISABLE_CLOCK));
         }
diff --git a/preloaded-classes b/preloaded-classes
index 1eabe14..8136f8e 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -975,7 +975,7 @@
 com.google.android.gles_jni.EGLImpl
 com.google.android.gles_jni.EGLSurfaceImpl
 com.google.android.gles_jni.GLImpl
-com.google.i18n.phonenumbers.PhoneNumberUtil
+com.android.i18n.phonenumbers.PhoneNumberUtil
 dalvik.system.BlockGuard
 dalvik.system.BlockGuard$1
 dalvik.system.BlockGuard$2
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 95c469d..941c9c8 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -5118,7 +5118,9 @@
         sp<PlaybackThread> t = mPlaybackThreads.valueAt(i);
         for (size_t j = 0; j < t->mEffectChains.size(); j++) {
             sp<EffectChain> ec = t->mEffectChains[j];
-            chains.push(ec);
+            if (ec->sessionId() > AUDIO_SESSION_OUTPUT_MIX) {
+                chains.push(ec);
+            }
         }
     }
     for (size_t i = 0; i < mRecordThreads.size(); i++) {
diff --git a/services/audioflinger/AudioPolicyService.cpp b/services/audioflinger/AudioPolicyService.cpp
index d747b5ad..8da5ca1 100644
--- a/services/audioflinger/AudioPolicyService.cpp
+++ b/services/audioflinger/AudioPolicyService.cpp
@@ -182,9 +182,6 @@
     if (mpAudioPolicy == NULL) {
         return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
     }
-    if (!checkPermission()) {
-        return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
-    }
     return mpAudioPolicy->get_device_connection_state(mpAudioPolicy, device,
                                                       device_address);
 }
@@ -250,9 +247,6 @@
     if (mpAudioPolicy == NULL) {
         return AUDIO_POLICY_FORCE_NONE;
     }
-    if (!checkPermission()) {
-        return AUDIO_POLICY_FORCE_NONE;
-    }
     if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
         return AUDIO_POLICY_FORCE_NONE;
     }
@@ -434,9 +428,6 @@
     if (mpAudioPolicy == NULL) {
         return NO_INIT;
     }
-    if (!checkPermission()) {
-        return PERMISSION_DENIED;
-    }
     if (stream < 0 || stream >= AUDIO_STREAM_CNT) {
         return BAD_VALUE;
     }
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 33b21ab..ee0937d 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -276,10 +276,12 @@
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case SLEEP_TIMEOUT_MSG: {
-                    if (mService.isSleeping()) {
-                        Slog.w(TAG, "Sleep timeout!  Sleeping now.");
-                        mSleepTimeout = true;
-                        checkReadyForSleepLocked();
+                    synchronized (mService) {
+                        if (mService.isSleeping()) {
+                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
+                            mSleepTimeout = true;
+                            checkReadyForSleepLocked();
+                        }
                     }
                 } break;
                 case PAUSE_TIMEOUT_MSG: {
@@ -775,7 +777,6 @@
         if (mService.mShuttingDown) {
             mService.notifyAll();
         }
-
     }
     
     public final Bitmap screenshotActivities(ActivityRecord who) {
diff --git a/services/java/com/android/server/am/AppErrorDialog.java b/services/java/com/android/server/am/AppErrorDialog.java
index 917259a..a769c05 100644
--- a/services/java/com/android/server/am/AppErrorDialog.java
+++ b/services/java/com/android/server/am/AppErrorDialog.java
@@ -60,12 +60,12 @@
 
         setCancelable(false);
 
-        setButton(DialogInterface.BUTTON_NEGATIVE,
+        setButton(DialogInterface.BUTTON_POSITIVE,
                 res.getText(com.android.internal.R.string.force_close),
                 mHandler.obtainMessage(FORCE_QUIT));
 
         if (app.errorReportReceiver != null) {
-            setButton(DialogInterface.BUTTON_POSITIVE,
+            setButton(DialogInterface.BUTTON_NEGATIVE,
                     res.getText(com.android.internal.R.string.report),
                     mHandler.obtainMessage(FORCE_QUIT_AND_REPORT));
         }
diff --git a/services/java/com/android/server/am/AppNotRespondingDialog.java b/services/java/com/android/server/am/AppNotRespondingDialog.java
index b40f87a..b546ae7 100644
--- a/services/java/com/android/server/am/AppNotRespondingDialog.java
+++ b/services/java/com/android/server/am/AppNotRespondingDialog.java
@@ -77,15 +77,15 @@
                 ? res.getString(resid, name1.toString(), name2.toString())
                 : res.getString(resid, name1.toString()));
 
-        setButton(DialogInterface.BUTTON_NEGATIVE,
+        setButton(DialogInterface.BUTTON_POSITIVE,
                 res.getText(com.android.internal.R.string.force_close),
                 mHandler.obtainMessage(FORCE_CLOSE));
-        setButton(DialogInterface.BUTTON_NEUTRAL,
+        setButton(DialogInterface.BUTTON_NEGATIVE,
                 res.getText(com.android.internal.R.string.wait),
                 mHandler.obtainMessage(WAIT));
 
         if (app.errorReportReceiver != null) {
-            setButton(DialogInterface.BUTTON_POSITIVE,
+            setButton(DialogInterface.BUTTON_NEUTRAL,
                     res.getText(com.android.internal.R.string.report),
                     mHandler.obtainMessage(WAIT_AND_REPORT));
         }
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 0a6e89e..5967428 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -2052,7 +2052,7 @@
                 String name = win.makeInputChannelName();
                 InputChannel[] inputChannels = InputChannel.openInputChannelPair(name);
                 win.mInputChannel = inputChannels[0];
-                inputChannels[1].transferToBinderOutParameter(outInputChannel);
+                inputChannels[1].transferTo(outInputChannel);
                 
                 mInputManager.registerInputChannel(win.mInputChannel, win.mInputWindowHandle);
             }
@@ -8736,6 +8736,12 @@
             return;
         }
 
+        if (mDisplay == null || !mPolicy.isScreenOn()) {
+            // No need to freeze the screen before the system is ready or if
+            // the screen is off.
+            return;
+        }
+
         mScreenFrozenLock.acquire();
 
         mDisplayFrozen = true;
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 505c843..0425fc3 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -65,14 +65,9 @@
     glGenTextures(1, &mTextureName);
 }
 
-void Layer::destroy(RefBase const* base) {
-    mFlinger->destroyLayer(static_cast<LayerBase const*>(base));
-}
-
 void Layer::onFirstRef()
 {
     LayerBaseClient::onFirstRef();
-    setDestroyer(this);
 
     struct FrameQueuedListener : public SurfaceTexture::FrameAvailableListener {
         FrameQueuedListener(Layer* layer) : mLayer(layer) { }
@@ -93,7 +88,16 @@
 
 Layer::~Layer()
 {
-    glDeleteTextures(1, &mTextureName);
+    class MessageDestroyGLState : public MessageBase {
+        GLuint texture;
+    public:
+        MessageDestroyGLState(GLuint texture) : texture(texture) { }
+        virtual bool handler() {
+            glDeleteTextures(1, &texture);
+            return true;
+        }
+    };
+    mFlinger->postMessageAsync( new MessageDestroyGLState(mTextureName) );
 }
 
 void Layer::onFrameQueued() {
@@ -187,14 +191,13 @@
      * 1) buffer orientation/flip/mirror
      * 2) state transformation (window manager)
      * 3) layer orientation (screen orientation)
+     * mOrientation is already the composition of (2) and (3)
      * (NOTE: the matrices are multiplied in reverse order)
      */
 
     const Transform bufferOrientation(mCurrentTransform);
-    const Transform& stateTransform(s.transform);
     const Transform layerOrientation(mOrientation);
-
-    const Transform tr(layerOrientation * stateTransform * bufferOrientation);
+    const Transform tr(layerOrientation * bufferOrientation);
 
     // this gives us only the "orientation" component of the transform
     const uint32_t finalTransform = tr.getOrientation();
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index ddfc666..d3ddab4 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -45,7 +45,7 @@
 
 // ---------------------------------------------------------------------------
 
-class Layer : public LayerBaseClient, private RefBase::Destroyer
+class Layer : public LayerBaseClient
 {
 public:
             Layer(SurfaceFlinger* flinger, DisplayID display,
@@ -78,7 +78,6 @@
     inline const sp<FreezeLock>&  getFreezeLock() const { return mFreezeLock; }
 
 protected:
-    virtual void destroy(RefBase const* base);
     virtual void onFirstRef();
     virtual void dump(String8& result, char* scratch, size_t size) const;
 
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 4a27701..082effe 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -402,9 +402,6 @@
 {
     waitForEvent();
 
-    // call Layer's destructor
-    handleDestroyLayers();
-
     // check for transactions
     if (UNLIKELY(mConsoleSignals)) {
         handleConsoleEvents();
@@ -597,31 +594,6 @@
     commitTransaction();
 }
 
-void SurfaceFlinger::destroyLayer(LayerBase const* layer)
-{
-    Mutex::Autolock _l(mDestroyedLayerLock);
-    mDestroyedLayers.add(layer);
-    signalEvent();
-}
-
-void SurfaceFlinger::handleDestroyLayers()
-{
-    Vector<LayerBase const *> destroyedLayers;
-
-    { // scope for the lock
-        Mutex::Autolock _l(mDestroyedLayerLock);
-        destroyedLayers = mDestroyedLayers;
-        mDestroyedLayers.clear();
-    }
-
-    // call destructors without a lock held
-    const size_t count = destroyedLayers.size();
-    for (size_t i=0 ; i<count ; i++) {
-        //LOGD("destroying %s", destroyedLayers[i]->getName().string());
-        delete destroyedLayers[i];
-    }
-}
-
 sp<FreezeLock> SurfaceFlinger::getFreezeLock() const
 {
     return new FreezeLock(const_cast<SurfaceFlinger *>(this));
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 15661f0..6f93f5b 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -189,7 +189,6 @@
     status_t addLayer(const sp<LayerBase>& layer);
     status_t invalidateLayerVisibility(const sp<LayerBase>& layer);
     void invalidateHwcGeometry();
-    void destroyLayer(LayerBase const* layer);
 
     sp<Layer> getLayer(const sp<ISurface>& sur) const;
 
@@ -266,7 +265,6 @@
             void        handleConsoleEvents();
             void        handleTransaction(uint32_t transactionFlags);
             void        handleTransactionLocked(uint32_t transactionFlags);
-            void        handleDestroyLayers();
 
             void        computeVisibleRegions(
                             const LayerVector& currentLayers,
diff --git a/telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java b/telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java
index ffabb7b..6f85c7d 100644
--- a/telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java
+++ b/telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java
@@ -16,8 +16,8 @@
 
 package android.telephony;
 
-import com.google.i18n.phonenumbers.AsYouTypeFormatter;
-import com.google.i18n.phonenumbers.PhoneNumberUtil;
+import com.android.i18n.phonenumbers.AsYouTypeFormatter;
+import com.android.i18n.phonenumbers.PhoneNumberUtil;
 
 import android.telephony.PhoneNumberUtils;
 import android.text.Editable;
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index ad2a887..c1713a5 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -16,10 +16,10 @@
 
 package android.telephony;
 
-import com.google.i18n.phonenumbers.NumberParseException;
-import com.google.i18n.phonenumbers.PhoneNumberUtil;
-import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
-import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
+import com.android.i18n.phonenumbers.NumberParseException;
+import com.android.i18n.phonenumbers.PhoneNumberUtil;
+import com.android.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
+import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber;
 
 import android.content.Context;
 import android.content.Intent;
diff --git a/telephony/java/com/android/internal/telephony/CallerInfo.java b/telephony/java/com/android/internal/telephony/CallerInfo.java
index 68e0045..25f8c8b 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfo.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfo.java
@@ -30,10 +30,10 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder;
-import com.google.i18n.phonenumbers.NumberParseException;
-import com.google.i18n.phonenumbers.PhoneNumberUtil;
-import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
+import com.android.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder;
+import com.android.i18n.phonenumbers.NumberParseException;
+import com.android.i18n.phonenumbers.PhoneNumberUtil;
+import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber;
 
 import java.util.Locale;
 
@@ -502,7 +502,7 @@
 
     /**
      * @return a geographical description string for the specified number.
-     * @see com.google.i18n.phonenumbers.PhoneNumberOfflineGeocoder
+     * @see com.android.i18n.phonenumbers.PhoneNumberOfflineGeocoder
      */
     private static String getGeoDescription(Context context, String number) {
         if (VDBG) Log.v(TAG, "getGeoDescription('" + number + "')...");